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.
- package/dist/Counter.d.ts +0 -0
- package/dist/batch/package.json +16 -0
- package/dist/client-router/package.json +16 -0
- package/dist/component/package.json +16 -0
- package/dist/context/package.json +16 -0
- package/dist/event-bus/package.json +16 -0
- package/dist/forms/package.json +16 -0
- package/dist/hooks/package.json +16 -0
- package/dist/hooks-0728361a.cjs +1 -0
- package/dist/hooks-b58f947c.js +133 -0
- package/dist/hooks.js +1 -0
- package/dist/hooks.mjs +13 -0
- package/dist/index.js +1 -384
- package/dist/index.mjs +130 -374
- package/dist/jsx-runtime/package.json +16 -0
- package/dist/jsx-runtime.js +1 -0
- package/dist/jsx-runtime.mjs +64 -0
- package/dist/lifecycle-events/package.json +16 -0
- package/dist/package.json +71 -0
- package/dist/render-component/package.json +16 -0
- package/dist/renderer/package.json +16 -0
- package/dist/renderer.js +1 -0
- package/dist/renderer.mjs +27 -0
- package/dist/router/package.json +16 -0
- package/dist/server/package.json +17 -0
- package/dist/server/src/batch.d.ts +3 -0
- package/dist/server/src/batch.js +23 -0
- package/dist/server/src/batch.js.map +1 -0
- package/dist/server/src/client-router.d.ts +60 -0
- package/dist/server/src/client-router.js +210 -0
- package/dist/server/src/client-router.js.map +1 -0
- package/dist/server/src/component.d.ts +14 -0
- package/dist/server/src/component.js +106 -0
- package/dist/server/src/component.js.map +1 -0
- package/dist/server/src/context.d.ts +13 -0
- package/dist/server/src/context.js +21 -0
- package/dist/server/src/context.js.map +1 -0
- package/dist/server/src/event-bus.d.ts +23 -0
- package/dist/server/src/event-bus.js +75 -0
- package/dist/server/src/event-bus.js.map +1 -0
- package/dist/server/src/forms.d.ts +40 -0
- package/dist/server/src/forms.js +148 -0
- package/dist/server/src/forms.js.map +1 -0
- package/dist/server/src/hooks.d.ts +12 -0
- package/dist/server/src/hooks.js +170 -0
- package/dist/server/src/hooks.js.map +1 -0
- package/dist/server/src/index.client.d.ts +12 -0
- package/dist/server/src/index.client.js +14 -0
- package/dist/server/src/index.client.js.map +1 -0
- package/dist/server/src/index.d.ts +88 -0
- package/dist/server/src/index.js +78 -0
- package/dist/server/src/index.js.map +1 -0
- package/dist/server/src/jsx-runtime/jsx-dev-runtime.d.ts +1 -0
- package/dist/server/src/jsx-runtime/jsx-dev-runtime.js +2 -0
- package/dist/server/src/jsx-runtime/jsx-dev-runtime.js.map +1 -0
- package/dist/server/src/jsx-runtime/jsx-runtime.d.ts +4 -0
- package/dist/server/src/jsx-runtime/jsx-runtime.js +41 -0
- package/dist/server/src/jsx-runtime/jsx-runtime.js.map +1 -0
- package/dist/server/src/jsx-runtime.d.ts +20 -0
- package/dist/server/src/jsx-runtime.js +105 -0
- package/dist/server/src/jsx-runtime.js.map +1 -0
- package/dist/server/src/lifecycle-events.d.ts +108 -0
- package/dist/server/src/lifecycle-events.js +177 -0
- package/dist/server/src/lifecycle-events.js.map +1 -0
- package/dist/server/src/renderComponent.d.ts +14 -0
- package/dist/server/src/renderComponent.js +25 -0
- package/dist/server/src/renderComponent.js.map +1 -0
- package/dist/server/src/renderer.d.ts +2 -0
- package/dist/server/src/renderer.js +31 -0
- package/dist/server/src/renderer.js.map +1 -0
- package/dist/server/src/router.d.ts +55 -0
- package/dist/server/src/router.js +166 -0
- package/dist/server/src/router.js.map +1 -0
- package/dist/server/src/server/api-router.d.ts +15 -0
- package/dist/server/src/server/api-router.js +111 -0
- package/dist/server/src/server/api-router.js.map +1 -0
- package/dist/server/src/server/auth.d.ts +32 -0
- package/dist/server/src/server/auth.js +80 -0
- package/dist/server/src/server/auth.js.map +1 -0
- package/dist/server/src/server/database.d.ts +24 -0
- package/dist/server/src/server/database.js +135 -0
- package/dist/server/src/server/database.js.map +1 -0
- package/dist/server/src/server/index.d.ts +127 -0
- package/dist/server/src/server/index.js +388 -0
- package/dist/server/src/server/index.js.map +1 -0
- package/dist/server/src/server/middleware.d.ts +11 -0
- package/dist/server/src/server/middleware.js +46 -0
- package/dist/server/src/server/middleware.js.map +1 -0
- package/dist/server/src/server/server.d.ts +9 -0
- package/dist/server/src/server/server.js +87 -0
- package/dist/server/src/server/server.js.map +1 -0
- package/dist/server/src/server/templates.d.ts +28 -0
- package/dist/server/src/server/templates.js +204 -0
- package/dist/server/src/server/templates.js.map +1 -0
- package/dist/server/src/server/types.d.ts +38 -0
- package/dist/server/src/server/types.js +4 -0
- package/dist/server/src/server/types.js.map +1 -0
- package/dist/server/src/server/utils.d.ts +70 -0
- package/dist/server/src/server/utils.js +156 -0
- package/dist/server/src/server/utils.js.map +1 -0
- package/dist/server/src/server/wasm.d.ts +9 -0
- package/dist/server/src/server/wasm.js +117 -0
- package/dist/server/src/server/wasm.js.map +1 -0
- package/dist/server/src/server-renderer.d.ts +5 -0
- package/dist/server/src/server-renderer.js +106 -0
- package/dist/server/src/server-renderer.js.map +1 -0
- package/dist/server/src/server-types.d.ts +42 -0
- package/dist/server/src/server-types.js +6 -0
- package/dist/server/src/server-types.js.map +1 -0
- package/dist/server/src/store.d.ts +41 -0
- package/dist/server/src/store.js +99 -0
- package/dist/server/src/store.js.map +1 -0
- package/dist/server/src/types.d.ts +19 -0
- package/dist/server/src/types.js +2 -0
- package/dist/server/src/types.js.map +1 -0
- package/dist/server/src/utils.d.ts +46 -0
- package/dist/server/src/utils.js +144 -0
- package/dist/server/src/utils.js.map +1 -0
- package/dist/server/src/vdom.d.ts +8 -0
- package/dist/server/src/vdom.js +22 -0
- package/dist/server/src/vdom.js.map +1 -0
- package/dist/server/src/wasm.d.ts +36 -0
- package/dist/server/src/wasm.js +159 -0
- package/dist/server/src/wasm.js.map +1 -0
- package/dist/server/tsconfig.server.tsbuildinfo +1 -0
- package/dist/server-renderer/package.json +16 -0
- package/dist/server-renderer.js +1 -0
- package/dist/server-renderer.mjs +64 -0
- package/dist/store/package.json +16 -0
- package/dist/types/package.json +16 -0
- package/dist/utils/package.json +16 -0
- package/dist/vdom/package.json +16 -0
- package/dist/wasm/package.json +16 -0
- package/dist/wasm.js +1 -0
- package/dist/wasm.mjs +103 -0
- package/package.json +14 -13
- package/templates/complete-app/build.js +284 -0
- package/templates/complete-app/package.json +40 -0
- package/templates/complete-app/public/styles.css +345 -0
- package/templates/complete-app/src/api/index.js +31 -0
- package/templates/complete-app/src/client.js +93 -0
- package/templates/complete-app/src/components/App.js +66 -0
- package/templates/complete-app/src/components/Footer.js +19 -0
- package/templates/complete-app/src/components/Header.js +38 -0
- package/templates/complete-app/src/pages/About.js +59 -0
- package/templates/complete-app/src/pages/Home.js +54 -0
- package/templates/complete-app/src/pages/WasmDemo.js +136 -0
- package/templates/complete-app/src/server.js +186 -0
- package/templates/complete-app/src/wasm/build.bat +16 -0
- package/templates/complete-app/src/wasm/build.sh +16 -0
- package/templates/complete-app/src/wasm/example.go +101 -0
- package/templates/fullstack-app/build/main.css +225 -15
- package/templates/fullstack-app/build/main.css.map +2 -2
- package/templates/fullstack-app/build/main.js +657 -372
- package/templates/fullstack-app/build/main.js.map +4 -4
- package/templates/fullstack-app/build.ts +3 -4
- package/templates/fullstack-app/public/styles.css +222 -15
- package/templates/fullstack-app/server.ts +46 -12
- package/templates/fullstack-app/src/components/ClientHome.tsx +0 -0
- package/templates/fullstack-app/src/components/ErrorBoundary.tsx +36 -0
- package/templates/fullstack-app/src/components/Layout.tsx +23 -26
- package/templates/fullstack-app/src/components/StateDemo.tsx +207 -0
- package/templates/fullstack-app/src/components/UserList.tsx +30 -13
- package/templates/fullstack-app/src/data/api.ts +173 -38
- package/templates/fullstack-app/src/main.tsx +88 -154
- package/templates/fullstack-app/src/middleware.ts +28 -0
- package/templates/fullstack-app/src/pages/404.tsx +28 -0
- package/templates/fullstack-app/src/pages/[id].tsx +0 -0
- package/templates/fullstack-app/src/pages/_app.tsx +11 -0
- package/templates/fullstack-app/src/pages/_document.tsx +25 -0
- package/templates/fullstack-app/src/pages/_error.tsx +45 -0
- package/templates/fullstack-app/src/pages/about.tsx +71 -0
- package/templates/fullstack-app/src/pages/api/users/[id].ts +73 -0
- package/templates/fullstack-app/src/pages/api/users/index.ts +43 -0
- package/templates/fullstack-app/src/pages/index.tsx +97 -20
- package/templates/fullstack-app/src/pages/users/[id].tsx +153 -0
- package/templates/fullstack-app/src/pages/wasm-demo.tsx +1 -0
- package/templates/go/build.sh +43 -43
- package/templates/go/example.go +99 -86
- package/templates/go-wasm-app/babel.config.js +8 -2
- package/templates/go-wasm-app/build-wasm.js +84 -84
- package/templates/go-wasm-app/build.config.js +62 -0
- package/templates/go-wasm-app/build.js +218 -0
- package/templates/go-wasm-app/package.json +21 -11
- package/templates/go-wasm-app/public/index.html +49 -53
- package/templates/go-wasm-app/server.js +56 -695
- package/templates/go-wasm-app/src/app.js +173 -0
- package/templates/go-wasm-app/vite.config.js +16 -5
- package/templates/ssr-template/client.js +54 -26
- package/templates/ssr-template/server.js +5 -28
- package/templates/ssr-template/vite.config.js +21 -5
- package/dist/index.d.ts +0 -1
- package/dist/index.js.map +0 -1
- 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"}
|