frontend-hamroun 1.2.74 → 1.2.77

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. package/dist/Counter.d.ts +0 -0
  2. package/dist/batch/package.json +16 -0
  3. package/dist/client-router/package.json +16 -0
  4. package/dist/component/package.json +16 -0
  5. package/dist/context/package.json +16 -0
  6. package/dist/event-bus/package.json +16 -0
  7. package/dist/forms/package.json +16 -0
  8. package/dist/hooks/package.json +16 -0
  9. package/dist/hooks-0728361a.cjs +1 -0
  10. package/dist/hooks-b58f947c.js +133 -0
  11. package/dist/hooks.js +1 -0
  12. package/dist/hooks.mjs +13 -0
  13. package/dist/index.js +1 -384
  14. package/dist/index.mjs +130 -374
  15. package/dist/jsx-runtime/package.json +16 -0
  16. package/dist/jsx-runtime.js +1 -0
  17. package/dist/jsx-runtime.mjs +64 -0
  18. package/dist/lifecycle-events/package.json +16 -0
  19. package/dist/package.json +71 -0
  20. package/dist/render-component/package.json +16 -0
  21. package/dist/renderer/package.json +16 -0
  22. package/dist/renderer.js +1 -0
  23. package/dist/renderer.mjs +27 -0
  24. package/dist/router/package.json +16 -0
  25. package/dist/server/package.json +17 -0
  26. package/dist/server/src/batch.d.ts +3 -0
  27. package/dist/server/src/batch.js +23 -0
  28. package/dist/server/src/batch.js.map +1 -0
  29. package/dist/server/src/client-router.d.ts +60 -0
  30. package/dist/server/src/client-router.js +210 -0
  31. package/dist/server/src/client-router.js.map +1 -0
  32. package/dist/server/src/component.d.ts +14 -0
  33. package/dist/server/src/component.js +106 -0
  34. package/dist/server/src/component.js.map +1 -0
  35. package/dist/server/src/context.d.ts +13 -0
  36. package/dist/server/src/context.js +21 -0
  37. package/dist/server/src/context.js.map +1 -0
  38. package/dist/server/src/event-bus.d.ts +23 -0
  39. package/dist/server/src/event-bus.js +75 -0
  40. package/dist/server/src/event-bus.js.map +1 -0
  41. package/dist/server/src/forms.d.ts +40 -0
  42. package/dist/server/src/forms.js +148 -0
  43. package/dist/server/src/forms.js.map +1 -0
  44. package/dist/server/src/hooks.d.ts +12 -0
  45. package/dist/server/src/hooks.js +170 -0
  46. package/dist/server/src/hooks.js.map +1 -0
  47. package/dist/server/src/index.client.d.ts +12 -0
  48. package/dist/server/src/index.client.js +14 -0
  49. package/dist/server/src/index.client.js.map +1 -0
  50. package/dist/server/src/index.d.ts +88 -0
  51. package/dist/server/src/index.js +78 -0
  52. package/dist/server/src/index.js.map +1 -0
  53. package/dist/server/src/jsx-runtime/jsx-dev-runtime.d.ts +1 -0
  54. package/dist/server/src/jsx-runtime/jsx-dev-runtime.js +2 -0
  55. package/dist/server/src/jsx-runtime/jsx-dev-runtime.js.map +1 -0
  56. package/dist/server/src/jsx-runtime/jsx-runtime.d.ts +4 -0
  57. package/dist/server/src/jsx-runtime/jsx-runtime.js +41 -0
  58. package/dist/server/src/jsx-runtime/jsx-runtime.js.map +1 -0
  59. package/dist/server/src/jsx-runtime.d.ts +20 -0
  60. package/dist/server/src/jsx-runtime.js +105 -0
  61. package/dist/server/src/jsx-runtime.js.map +1 -0
  62. package/dist/server/src/lifecycle-events.d.ts +108 -0
  63. package/dist/server/src/lifecycle-events.js +177 -0
  64. package/dist/server/src/lifecycle-events.js.map +1 -0
  65. package/dist/server/src/renderComponent.d.ts +14 -0
  66. package/dist/server/src/renderComponent.js +25 -0
  67. package/dist/server/src/renderComponent.js.map +1 -0
  68. package/dist/server/src/renderer.d.ts +2 -0
  69. package/dist/server/src/renderer.js +31 -0
  70. package/dist/server/src/renderer.js.map +1 -0
  71. package/dist/server/src/router.d.ts +55 -0
  72. package/dist/server/src/router.js +166 -0
  73. package/dist/server/src/router.js.map +1 -0
  74. package/dist/server/src/server/api-router.d.ts +15 -0
  75. package/dist/server/src/server/api-router.js +111 -0
  76. package/dist/server/src/server/api-router.js.map +1 -0
  77. package/dist/server/src/server/auth.d.ts +32 -0
  78. package/dist/server/src/server/auth.js +80 -0
  79. package/dist/server/src/server/auth.js.map +1 -0
  80. package/dist/server/src/server/database.d.ts +24 -0
  81. package/dist/server/src/server/database.js +135 -0
  82. package/dist/server/src/server/database.js.map +1 -0
  83. package/dist/server/src/server/index.d.ts +127 -0
  84. package/dist/server/src/server/index.js +388 -0
  85. package/dist/server/src/server/index.js.map +1 -0
  86. package/dist/server/src/server/middleware.d.ts +11 -0
  87. package/dist/server/src/server/middleware.js +46 -0
  88. package/dist/server/src/server/middleware.js.map +1 -0
  89. package/dist/server/src/server/server.d.ts +9 -0
  90. package/dist/server/src/server/server.js +87 -0
  91. package/dist/server/src/server/server.js.map +1 -0
  92. package/dist/server/src/server/templates.d.ts +28 -0
  93. package/dist/server/src/server/templates.js +204 -0
  94. package/dist/server/src/server/templates.js.map +1 -0
  95. package/dist/server/src/server/types.d.ts +38 -0
  96. package/dist/server/src/server/types.js +4 -0
  97. package/dist/server/src/server/types.js.map +1 -0
  98. package/dist/server/src/server/utils.d.ts +70 -0
  99. package/dist/server/src/server/utils.js +156 -0
  100. package/dist/server/src/server/utils.js.map +1 -0
  101. package/dist/server/src/server/wasm.d.ts +9 -0
  102. package/dist/server/src/server/wasm.js +117 -0
  103. package/dist/server/src/server/wasm.js.map +1 -0
  104. package/dist/server/src/server-renderer.d.ts +5 -0
  105. package/dist/server/src/server-renderer.js +106 -0
  106. package/dist/server/src/server-renderer.js.map +1 -0
  107. package/dist/server/src/server-types.d.ts +42 -0
  108. package/dist/server/src/server-types.js +6 -0
  109. package/dist/server/src/server-types.js.map +1 -0
  110. package/dist/server/src/store.d.ts +41 -0
  111. package/dist/server/src/store.js +99 -0
  112. package/dist/server/src/store.js.map +1 -0
  113. package/dist/server/src/types.d.ts +19 -0
  114. package/dist/server/src/types.js +2 -0
  115. package/dist/server/src/types.js.map +1 -0
  116. package/dist/server/src/utils.d.ts +46 -0
  117. package/dist/server/src/utils.js +144 -0
  118. package/dist/server/src/utils.js.map +1 -0
  119. package/dist/server/src/vdom.d.ts +8 -0
  120. package/dist/server/src/vdom.js +22 -0
  121. package/dist/server/src/vdom.js.map +1 -0
  122. package/dist/server/src/wasm.d.ts +36 -0
  123. package/dist/server/src/wasm.js +159 -0
  124. package/dist/server/src/wasm.js.map +1 -0
  125. package/dist/server/tsconfig.server.tsbuildinfo +1 -0
  126. package/dist/server-renderer/package.json +16 -0
  127. package/dist/server-renderer.js +1 -0
  128. package/dist/server-renderer.mjs +64 -0
  129. package/dist/store/package.json +16 -0
  130. package/dist/types/package.json +16 -0
  131. package/dist/utils/package.json +16 -0
  132. package/dist/vdom/package.json +16 -0
  133. package/dist/wasm/package.json +16 -0
  134. package/dist/wasm.js +1 -0
  135. package/dist/wasm.mjs +103 -0
  136. package/package.json +14 -13
  137. package/templates/complete-app/build.js +284 -0
  138. package/templates/complete-app/package.json +40 -0
  139. package/templates/complete-app/public/styles.css +345 -0
  140. package/templates/complete-app/src/api/index.js +31 -0
  141. package/templates/complete-app/src/client.js +93 -0
  142. package/templates/complete-app/src/components/App.js +66 -0
  143. package/templates/complete-app/src/components/Footer.js +19 -0
  144. package/templates/complete-app/src/components/Header.js +38 -0
  145. package/templates/complete-app/src/pages/About.js +59 -0
  146. package/templates/complete-app/src/pages/Home.js +54 -0
  147. package/templates/complete-app/src/pages/WasmDemo.js +136 -0
  148. package/templates/complete-app/src/server.js +186 -0
  149. package/templates/complete-app/src/wasm/build.bat +16 -0
  150. package/templates/complete-app/src/wasm/build.sh +16 -0
  151. package/templates/complete-app/src/wasm/example.go +101 -0
  152. package/templates/fullstack-app/build/main.css +225 -15
  153. package/templates/fullstack-app/build/main.css.map +2 -2
  154. package/templates/fullstack-app/build/main.js +657 -372
  155. package/templates/fullstack-app/build/main.js.map +4 -4
  156. package/templates/fullstack-app/build.ts +3 -4
  157. package/templates/fullstack-app/public/styles.css +222 -15
  158. package/templates/fullstack-app/server.ts +46 -12
  159. package/templates/fullstack-app/src/components/ClientHome.tsx +0 -0
  160. package/templates/fullstack-app/src/components/ErrorBoundary.tsx +36 -0
  161. package/templates/fullstack-app/src/components/Layout.tsx +23 -26
  162. package/templates/fullstack-app/src/components/StateDemo.tsx +207 -0
  163. package/templates/fullstack-app/src/components/UserList.tsx +30 -13
  164. package/templates/fullstack-app/src/data/api.ts +173 -38
  165. package/templates/fullstack-app/src/main.tsx +88 -154
  166. package/templates/fullstack-app/src/middleware.ts +28 -0
  167. package/templates/fullstack-app/src/pages/404.tsx +28 -0
  168. package/templates/fullstack-app/src/pages/[id].tsx +0 -0
  169. package/templates/fullstack-app/src/pages/_app.tsx +11 -0
  170. package/templates/fullstack-app/src/pages/_document.tsx +25 -0
  171. package/templates/fullstack-app/src/pages/_error.tsx +45 -0
  172. package/templates/fullstack-app/src/pages/about.tsx +71 -0
  173. package/templates/fullstack-app/src/pages/api/users/[id].ts +73 -0
  174. package/templates/fullstack-app/src/pages/api/users/index.ts +43 -0
  175. package/templates/fullstack-app/src/pages/index.tsx +97 -20
  176. package/templates/fullstack-app/src/pages/users/[id].tsx +153 -0
  177. package/templates/fullstack-app/src/pages/wasm-demo.tsx +1 -0
  178. package/templates/go/build.sh +43 -43
  179. package/templates/go/example.go +99 -86
  180. package/templates/go-wasm-app/babel.config.js +8 -2
  181. package/templates/go-wasm-app/build-wasm.js +84 -84
  182. package/templates/go-wasm-app/build.config.js +62 -0
  183. package/templates/go-wasm-app/build.js +218 -0
  184. package/templates/go-wasm-app/package.json +21 -11
  185. package/templates/go-wasm-app/public/index.html +49 -53
  186. package/templates/go-wasm-app/server.js +56 -695
  187. package/templates/go-wasm-app/src/app.js +173 -0
  188. package/templates/go-wasm-app/vite.config.js +16 -5
  189. package/templates/ssr-template/client.js +54 -26
  190. package/templates/ssr-template/server.js +5 -28
  191. package/templates/ssr-template/vite.config.js +21 -5
  192. package/dist/index.d.ts +0 -1
  193. package/dist/index.js.map +0 -1
  194. package/dist/index.mjs.map +0 -1
@@ -0,0 +1,127 @@
1
+ import { Express, Request } from 'express';
2
+ import cors from 'cors';
3
+ import { SignOptions } from 'jsonwebtoken';
4
+ import { renderToString } from '../server-renderer.js';
5
+ import { Database } from './database.js';
6
+ import { AuthService } from './auth.js';
7
+ import { ApiRouter } from './api-router.js';
8
+ import { safeJsonParse, generateToken, hashString, getPagination, sendSuccess, sendError, validateFields, validateFileUpload, getEnvironmentInfo, isDirectoryEmpty, ensureDirectory, writeJsonFile, readJsonFile } from './utils.js';
9
+ import { generateDocument, generateErrorPage, generateLoadingPage } from './templates.js';
10
+ export interface ServerConfig {
11
+ port?: number;
12
+ apiDir?: string;
13
+ pagesDir?: string;
14
+ staticDir?: string;
15
+ enableCors?: boolean;
16
+ corsOptions?: cors.CorsOptions;
17
+ db?: {
18
+ url: string;
19
+ type: 'mongodb' | 'mysql' | 'postgres';
20
+ };
21
+ auth?: {
22
+ secret: string;
23
+ expiresIn?: SignOptions['expiresIn'];
24
+ };
25
+ }
26
+ export declare class Server {
27
+ private app;
28
+ private server;
29
+ private config;
30
+ private db;
31
+ private auth;
32
+ constructor(config?: ServerConfig);
33
+ private setupApiRoutes;
34
+ private generateApiDocs;
35
+ private scanApiDirectory;
36
+ private getRoutePath;
37
+ private detectApiMethods;
38
+ private setupPageRoutes;
39
+ private renderPage;
40
+ getExpressApp(): Express;
41
+ getDatabase(): Database | null;
42
+ getAuth(): AuthService | null;
43
+ start(): Promise<void>;
44
+ stop(): Promise<void>;
45
+ restart(): Promise<void>;
46
+ enableSSR(options?: {
47
+ hydratable?: boolean;
48
+ }): void;
49
+ registerPlugin(plugin: (server: Server) => void): void;
50
+ addShutdownHandler(): void;
51
+ }
52
+ /**
53
+ * Creates and configures a new server instance
54
+ */
55
+ export declare function createServer(config?: ServerConfig): Server;
56
+ /**
57
+ * Creates a new server with sensible defaults for development
58
+ */
59
+ export declare function createDevServer(options?: {
60
+ port?: number;
61
+ enableCors?: boolean;
62
+ }): Server;
63
+ /**
64
+ * Creates a production-ready server with optimized settings
65
+ */
66
+ export declare function createProductionServer(config: ServerConfig): Server;
67
+ export declare function getRequestIp(req: Request): string;
68
+ export declare function parseCookies(req: Request): Record<string, string>;
69
+ export { Database } from './database.js';
70
+ export { AuthService } from './auth.js';
71
+ export { ApiRouter } from './api-router.js';
72
+ export { requestLogger, errorHandler, notFoundHandler, rateLimit } from './middleware.js';
73
+ export { renderToString };
74
+ export declare const renderComponent: (Component: any, props?: any) => Promise<{
75
+ html: string;
76
+ success: boolean;
77
+ error?: undefined;
78
+ } | {
79
+ html: string;
80
+ success: boolean;
81
+ error: unknown;
82
+ }>;
83
+ export { initNodeWasm, loadGoWasmFromFile } from './wasm.js';
84
+ export * from './utils.js';
85
+ export * from './templates.js';
86
+ declare const _default: {
87
+ Server: typeof Server;
88
+ createServer: typeof createServer;
89
+ createDevServer: typeof createDevServer;
90
+ createProductionServer: typeof createProductionServer;
91
+ Database: typeof Database;
92
+ AuthService: typeof AuthService;
93
+ ApiRouter: typeof ApiRouter;
94
+ renderToString: typeof renderToString;
95
+ renderComponent: (Component: any, props?: any) => Promise<{
96
+ html: string;
97
+ success: boolean;
98
+ error?: undefined;
99
+ } | {
100
+ html: string;
101
+ success: boolean;
102
+ error: unknown;
103
+ }>;
104
+ templates: {
105
+ generateDocument: typeof generateDocument;
106
+ generateErrorPage: typeof generateErrorPage;
107
+ generateLoadingPage: typeof generateLoadingPage;
108
+ };
109
+ utils: {
110
+ getRequestIp: typeof getRequestIp;
111
+ parseCookies: typeof parseCookies;
112
+ safeJsonParse: typeof safeJsonParse;
113
+ generateToken: typeof generateToken;
114
+ hashString: typeof hashString;
115
+ getPagination: typeof getPagination;
116
+ sendSuccess: typeof sendSuccess;
117
+ sendError: typeof sendError;
118
+ validateFields: typeof validateFields;
119
+ validateFileUpload: typeof validateFileUpload;
120
+ getEnvironmentInfo: typeof getEnvironmentInfo;
121
+ isDirectoryEmpty: typeof isDirectoryEmpty;
122
+ ensureDirectory: typeof ensureDirectory;
123
+ writeJsonFile: typeof writeJsonFile;
124
+ readJsonFile: typeof readJsonFile;
125
+ };
126
+ };
127
+ export default _default;
@@ -0,0 +1,388 @@
1
+ import express from 'express';
2
+ import path from 'path';
3
+ import fs from 'fs';
4
+ import cors from 'cors';
5
+ import { renderToString } from '../server-renderer';
6
+ import { Database } from './database';
7
+ import { AuthService } from './auth';
8
+ import { ApiRouter } from './api-router';
9
+ import { requestLogger } from './middleware';
10
+ // Import the utility functions that were missing
11
+ import { safeJsonParse, generateToken, hashString, getPagination, sendSuccess, sendError, validateFields, validateFileUpload, getEnvironmentInfo, isDirectoryEmpty, ensureDirectory, writeJsonFile, readJsonFile } from './utils';
12
+ // Import the HTML template generators
13
+ import { generateDocument, generateErrorPage, generateLoadingPage } from './templates';
14
+ export class Server {
15
+ constructor(config = {}) {
16
+ Object.defineProperty(this, "app", {
17
+ enumerable: true,
18
+ configurable: true,
19
+ writable: true,
20
+ value: void 0
21
+ });
22
+ Object.defineProperty(this, "server", {
23
+ enumerable: true,
24
+ configurable: true,
25
+ writable: true,
26
+ value: null
27
+ });
28
+ Object.defineProperty(this, "config", {
29
+ enumerable: true,
30
+ configurable: true,
31
+ writable: true,
32
+ value: void 0
33
+ });
34
+ Object.defineProperty(this, "db", {
35
+ enumerable: true,
36
+ configurable: true,
37
+ writable: true,
38
+ value: null
39
+ });
40
+ Object.defineProperty(this, "auth", {
41
+ enumerable: true,
42
+ configurable: true,
43
+ writable: true,
44
+ value: null
45
+ });
46
+ this.config = {
47
+ port: 3000,
48
+ apiDir: './api',
49
+ pagesDir: './pages',
50
+ staticDir: './public',
51
+ enableCors: true,
52
+ ...config
53
+ };
54
+ this.app = express();
55
+ // Basic middleware
56
+ this.app.use(express.json());
57
+ this.app.use(express.urlencoded({ extended: true }));
58
+ // CORS setup
59
+ if (this.config.enableCors) {
60
+ this.app.use(cors(this.config.corsOptions));
61
+ }
62
+ // Setup database if configured
63
+ if (this.config.db) {
64
+ this.db = new Database(this.config.db);
65
+ }
66
+ // Setup auth if configured
67
+ if (this.config.auth) {
68
+ // Fix by explicitly typing the auth configuration
69
+ this.auth = new AuthService({
70
+ secret: this.config.auth.secret,
71
+ expiresIn: this.config.auth.expiresIn
72
+ });
73
+ // Expose auth middleware
74
+ this.app.use(this.auth.initialize());
75
+ }
76
+ // Static files
77
+ if (fs.existsSync(path.resolve(process.cwd(), this.config.staticDir))) {
78
+ this.app.use(express.static(path.resolve(process.cwd(), this.config.staticDir)));
79
+ }
80
+ // Setup API routes
81
+ this.setupApiRoutes();
82
+ // Setup page routes (for SSR)
83
+ this.setupPageRoutes();
84
+ }
85
+ setupApiRoutes() {
86
+ const apiRouter = new ApiRouter(this.config.apiDir, this.auth);
87
+ this.app.use('/api', requestLogger, apiRouter.router);
88
+ // Add API documentation route
89
+ this.app.get('/api-docs', (req, res) => {
90
+ const apiDocs = this.generateApiDocs();
91
+ res.json(apiDocs);
92
+ });
93
+ }
94
+ generateApiDocs() {
95
+ // Generate documentation based on API routes
96
+ const apiDir = path.resolve(process.cwd(), this.config.apiDir);
97
+ const docs = { endpoints: [] };
98
+ if (fs.existsSync(apiDir)) {
99
+ this.scanApiDirectory(apiDir, '', docs.endpoints);
100
+ }
101
+ return docs;
102
+ }
103
+ scanApiDirectory(dirPath, routePrefix, endpoints) {
104
+ const entries = fs.readdirSync(dirPath, { withFileTypes: true });
105
+ for (const entry of entries) {
106
+ const fullPath = path.join(dirPath, entry.name);
107
+ if (entry.isDirectory()) {
108
+ this.scanApiDirectory(fullPath, `${routePrefix}/${entry.name}`, endpoints);
109
+ }
110
+ else if (entry.name.endsWith('.js') || entry.name.endsWith('.ts')) {
111
+ const routePath = this.getRoutePath(entry.name, routePrefix);
112
+ endpoints.push({
113
+ path: routePath,
114
+ file: path.relative(process.cwd(), fullPath),
115
+ methods: this.detectApiMethods(fullPath)
116
+ });
117
+ }
118
+ }
119
+ }
120
+ getRoutePath(filename, routePrefix) {
121
+ const baseName = path.basename(filename, path.extname(filename));
122
+ if (baseName === 'index') {
123
+ return routePrefix || '/';
124
+ }
125
+ const paramMatch = baseName.match(/^\[(.+)\]$/);
126
+ if (paramMatch) {
127
+ return `${routePrefix}/:${paramMatch[1]}`;
128
+ }
129
+ return `${routePrefix}/${baseName}`;
130
+ }
131
+ detectApiMethods(filePath) {
132
+ try {
133
+ const content = fs.readFileSync(filePath, 'utf8');
134
+ const methods = ['get', 'post', 'put', 'delete', 'patch', 'options'];
135
+ return methods.filter(method => new RegExp(`export (async )?function ${method}\\s*\\(`).test(content) ||
136
+ new RegExp(`export const ${method}\\s*=`).test(content));
137
+ }
138
+ catch (error) {
139
+ return [];
140
+ }
141
+ }
142
+ setupPageRoutes() {
143
+ if (!fs.existsSync(path.resolve(process.cwd(), this.config.pagesDir))) {
144
+ return;
145
+ }
146
+ // Setup catch-all route for SSR
147
+ this.app.get('*', async (req, res) => {
148
+ try {
149
+ // Implement page routing logic
150
+ const { html, statusCode } = await this.renderPage(req.path);
151
+ res.status(statusCode || 200).send(html);
152
+ }
153
+ catch (error) {
154
+ console.error('Error rendering page:', error);
155
+ res.status(500).send('Server Error');
156
+ }
157
+ });
158
+ }
159
+ async renderPage(path) {
160
+ // Implementation would find the correct page component and render it
161
+ // This is a simplified version
162
+ return {
163
+ html: `<!DOCTYPE html><html><body><h1>Page: ${path}</h1></body></html>`,
164
+ statusCode: 200
165
+ };
166
+ }
167
+ getExpressApp() {
168
+ return this.app;
169
+ }
170
+ getDatabase() {
171
+ return this.db;
172
+ }
173
+ getAuth() {
174
+ return this.auth;
175
+ }
176
+ start() {
177
+ return new Promise((resolve) => {
178
+ this.server = this.app.listen(this.config.port, () => {
179
+ console.log(`Server running at http://localhost:${this.config.port}`);
180
+ resolve();
181
+ });
182
+ });
183
+ }
184
+ stop() {
185
+ return new Promise((resolve, reject) => {
186
+ if (!this.server) {
187
+ return resolve();
188
+ }
189
+ this.server.close((err) => {
190
+ if (err)
191
+ return reject(err);
192
+ this.server = null;
193
+ resolve();
194
+ });
195
+ });
196
+ }
197
+ // Add new utility methods for server management
198
+ restart() {
199
+ return this.stop().then(() => this.start());
200
+ }
201
+ enableSSR(options = {}) {
202
+ if (!fs.existsSync(path.resolve(process.cwd(), this.config.pagesDir))) {
203
+ fs.mkdirSync(path.resolve(process.cwd(), this.config.pagesDir), { recursive: true });
204
+ }
205
+ // Set up client-side JS for hydration if needed
206
+ if (options.hydratable) {
207
+ const staticDir = path.resolve(process.cwd(), this.config.staticDir);
208
+ if (!fs.existsSync(staticDir)) {
209
+ fs.mkdirSync(staticDir, { recursive: true });
210
+ }
211
+ // Generate or copy client hydration script
212
+ // This is a simplified example - would need more implementation
213
+ const clientJsPath = path.join(staticDir, 'client.js');
214
+ if (!fs.existsSync(clientJsPath)) {
215
+ const clientJsContent = `
216
+ // Auto-generated hydration script
217
+ import { hydrate } from 'frontend-hamroun';
218
+
219
+ // Find SSR content and hydrate it
220
+ document.addEventListener('DOMContentLoaded', () => {
221
+ const ssrRoots = document.querySelectorAll('[data-ssr-root]');
222
+ ssrRoots.forEach(root => {
223
+ const componentPath = root.getAttribute('data-component');
224
+ if (componentPath) {
225
+ import(componentPath).then(module => {
226
+ hydrate(module.default, root);
227
+ });
228
+ }
229
+ });
230
+ });
231
+ `;
232
+ fs.writeFileSync(clientJsPath, clientJsContent);
233
+ }
234
+ }
235
+ }
236
+ registerPlugin(plugin) {
237
+ plugin(this);
238
+ }
239
+ addShutdownHandler() {
240
+ // Handle graceful shutdown
241
+ const gracefulShutdown = async () => {
242
+ console.log('Received shutdown signal, closing server...');
243
+ try {
244
+ await this.stop();
245
+ if (this.db) {
246
+ await this.db.disconnect();
247
+ }
248
+ console.log('Server shut down gracefully');
249
+ process.exit(0);
250
+ }
251
+ catch (error) {
252
+ console.error('Error during shutdown:', error);
253
+ process.exit(1);
254
+ }
255
+ };
256
+ // Listen for termination signals
257
+ process.on('SIGTERM', gracefulShutdown);
258
+ process.on('SIGINT', gracefulShutdown);
259
+ }
260
+ }
261
+ // Add server utility functions
262
+ /**
263
+ * Creates and configures a new server instance
264
+ */
265
+ export function createServer(config = {}) {
266
+ return new Server(config);
267
+ }
268
+ /**
269
+ * Creates a new server with sensible defaults for development
270
+ */
271
+ export function createDevServer(options = {}) {
272
+ return new Server({
273
+ port: options.port || 3000,
274
+ enableCors: options.enableCors !== false,
275
+ apiDir: './src/api',
276
+ pagesDir: './src/pages',
277
+ staticDir: './public'
278
+ });
279
+ }
280
+ /**
281
+ * Creates a production-ready server with optimized settings
282
+ */
283
+ export function createProductionServer(config) {
284
+ const server = new Server({
285
+ ...config,
286
+ // Fix the PORT parsing
287
+ port: config.port || (process.env.PORT ? parseInt(process.env.PORT) : 8080)
288
+ });
289
+ // Add shutdown handler for production environments
290
+ server.addShutdownHandler();
291
+ return server;
292
+ }
293
+ // Export additional utility functions
294
+ export function getRequestIp(req) {
295
+ return req.ip ||
296
+ req.headers['x-forwarded-for']?.split(',')[0].trim() ||
297
+ req.socket.remoteAddress ||
298
+ '';
299
+ }
300
+ export function parseCookies(req) {
301
+ const cookies = {};
302
+ const cookieHeader = req.headers.cookie;
303
+ if (cookieHeader) {
304
+ cookieHeader.split(';').forEach(cookie => {
305
+ const [name, value] = cookie.split('=').map(c => c.trim());
306
+ cookies[name] = value;
307
+ });
308
+ }
309
+ return cookies;
310
+ }
311
+ // Server module main export file
312
+ // Export all server components
313
+ // Server is already exported above, no need to re-export
314
+ export { Database } from './database.js';
315
+ export { AuthService } from './auth.js';
316
+ export { ApiRouter } from './api-router.js';
317
+ export { requestLogger, errorHandler, notFoundHandler, rateLimit } from './middleware.js';
318
+ // Export renderToString for convenient SSR
319
+ export { renderToString };
320
+ // Fix the renderComponent function
321
+ export const renderComponent = async (Component, props = {}) => {
322
+ try {
323
+ // Create HTML string from component
324
+ const html = renderToString(Component(props));
325
+ return {
326
+ html,
327
+ success: true
328
+ };
329
+ }
330
+ catch (error) {
331
+ console.error('Error rendering component:', error);
332
+ return {
333
+ html: `<div class="error">Error rendering component</div>`,
334
+ success: false,
335
+ error
336
+ };
337
+ }
338
+ };
339
+ // Export WASM utilities for server-side usage
340
+ export { initNodeWasm, loadGoWasmFromFile } from './wasm.js';
341
+ // Import and export server utilities
342
+ export * from './utils.js';
343
+ export * from './templates.js';
344
+ // Update the default export
345
+ export default {
346
+ Server,
347
+ createServer,
348
+ createDevServer,
349
+ createProductionServer,
350
+ Database,
351
+ AuthService,
352
+ ApiRouter,
353
+ renderToString,
354
+ renderComponent,
355
+ // Template utilities
356
+ templates: {
357
+ generateDocument,
358
+ generateErrorPage,
359
+ generateLoadingPage
360
+ },
361
+ // Server utilities
362
+ utils: {
363
+ getRequestIp,
364
+ parseCookies,
365
+ safeJsonParse,
366
+ generateToken,
367
+ hashString,
368
+ getPagination,
369
+ sendSuccess,
370
+ sendError,
371
+ validateFields,
372
+ validateFileUpload,
373
+ getEnvironmentInfo,
374
+ isDirectoryEmpty,
375
+ ensureDirectory,
376
+ writeJsonFile,
377
+ readJsonFile
378
+ }
379
+ };
380
+ //# sourceMappingURL=index.js.map
381
+ // This module is compatible with both ESM and CommonJS
382
+ if (typeof exports === 'object' && typeof module !== 'undefined') {
383
+ // CommonJS environment
384
+ module.exports = exports;
385
+ } else if (typeof define === 'function' && define.amd) {
386
+ // AMD environment
387
+ define(['exports'], factory);
388
+ } // ESM environment is handled by default exports
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/server/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ export interface MiddlewareFunction {
3
+ (req: Request, res: Response, next: NextFunction): void | Promise<void>;
4
+ }
5
+ export declare const requestLogger: MiddlewareFunction;
6
+ export declare const errorHandler: (err: Error, req: Request, res: Response, next: NextFunction) => void;
7
+ export declare const notFoundHandler: (req: Request, res: Response) => void;
8
+ export declare function rateLimit(options: {
9
+ windowMs: number;
10
+ max: number;
11
+ }): (req: Request, res: Response, next: NextFunction) => void | Response<any, Record<string, any>>;
@@ -0,0 +1,46 @@
1
+ // Common middleware functions
2
+ export const requestLogger = (req, res, next) => {
3
+ console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`);
4
+ next();
5
+ };
6
+ export const errorHandler = (err, req, res, next) => {
7
+ console.error(err.stack);
8
+ res.status(500).json({
9
+ error: {
10
+ message: 'Internal Server Error',
11
+ ...(process.env.NODE_ENV !== 'production' ? { details: err.message, stack: err.stack } : {})
12
+ }
13
+ });
14
+ };
15
+ export const notFoundHandler = (req, res) => {
16
+ res.status(404).json({
17
+ error: {
18
+ message: `Not Found - ${req.method} ${req.url}`
19
+ }
20
+ });
21
+ };
22
+ // Middleware for rate limiting
23
+ export function rateLimit(options) {
24
+ const requests = new Map();
25
+ return (req, res, next) => {
26
+ const ip = req.ip || 'unknown';
27
+ const now = Date.now();
28
+ // Get existing requests and filter out old ones
29
+ const reqTimes = (requests.get(ip) || [])
30
+ .filter(time => now - time < options.windowMs);
31
+ // Add current request
32
+ reqTimes.push(now);
33
+ requests.set(ip, reqTimes);
34
+ // Check if too many requests
35
+ if (reqTimes.length > options.max) {
36
+ return res.status(429).json({
37
+ error: {
38
+ message: 'Too Many Requests',
39
+ retryAfter: Math.ceil(options.windowMs / 1000)
40
+ }
41
+ });
42
+ }
43
+ return next();
44
+ };
45
+ }
46
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../../src/server/middleware.ts"],"names":[],"mappings":"AAMA,8BAA8B;AAC9B,MAAM,CAAC,MAAM,aAAa,GAAuB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;IAClE,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;IACtE,IAAI,EAAE,CAAC;AACT,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,GAAU,EACV,GAAY,EACZ,GAAa,EACb,IAAkB,EAClB,EAAE;IACF,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACnB,KAAK,EAAE;YACL,OAAO,EAAE,uBAAuB;YAChC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7F;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;IAC7D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACnB,KAAK,EAAE;YACL,OAAO,EAAE,eAAe,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE;SAChD;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,+BAA+B;AAC/B,MAAM,UAAU,SAAS,CAAC,OAA0C;IAClE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE7C,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QACzD,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,SAAS,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,gDAAgD;QAChD,MAAM,QAAQ,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;aACtC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QAEjD,sBAAsB;QACtB,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAE3B,6BAA6B;QAC7B,IAAI,QAAQ,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YAClC,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE;oBACL,OAAO,EAAE,mBAAmB;oBAC5B,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;iBAC/C;aACF,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ declare class Server {
2
+ private config;
3
+ constructor(config: {
4
+ pagesDir?: string;
5
+ });
6
+ private renderPage;
7
+ private pathMatchesPattern;
8
+ }
9
+ export default Server;