baraqex 1.0.64 → 1.0.65
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/bin/baraqex.js +1013 -1126
- package/dist/api/hello.d.ts +3 -0
- package/dist/api/hello.d.ts.map +1 -0
- package/dist/api/users/[id].d.ts +5 -0
- package/dist/api/users/[id].d.ts.map +1 -0
- package/dist/browser.d.ts +40 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +407 -1
- package/dist/browser.js.map +4 -4
- package/dist/browser.package.json +4 -0
- package/dist/forms/index.d.ts +2 -0
- package/dist/forms/index.d.ts.map +1 -0
- package/dist/forms/types.d.ts +2 -0
- package/dist/forms/types.d.ts.map +1 -0
- package/dist/frontend/components/WasmLoader.d.ts +2 -0
- package/dist/frontend/components/WasmLoader.d.ts.map +1 -0
- package/dist/frontend/hooks/useWasm.d.ts +2 -0
- package/dist/frontend/hooks/useWasm.d.ts.map +1 -0
- package/dist/frontend/index.d.ts +2 -0
- package/dist/frontend/index.d.ts.map +1 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +678 -317
- package/dist/index.js.map +4 -4
- package/dist/renderComponent.d.ts +9 -0
- package/dist/renderComponent.d.ts.map +1 -0
- package/dist/router/index.d.ts +2 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/types.d.ts +2 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/server/api-router.d.ts +16 -0
- package/dist/server/api-router.d.ts.map +1 -0
- package/dist/server/auth.d.ts +25 -0
- package/dist/server/auth.d.ts.map +1 -0
- package/dist/server/database.d.ts +22 -0
- package/dist/server/database.d.ts.map +1 -0
- package/dist/server/index.d.ts +116 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/{server.js → server/index.js} +120 -23
- package/dist/server/index.js.map +7 -0
- package/dist/server/middleware.d.ts +11 -0
- package/dist/server/middleware.d.ts.map +1 -0
- package/dist/server/package.json +4 -0
- package/dist/server/templates.d.ts +31 -0
- package/dist/server/templates.d.ts.map +1 -0
- package/dist/server/types.d.ts +69 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/utils.d.ts +70 -0
- package/dist/server/utils.d.ts.map +1 -0
- package/dist/server/wasm.d.ts +29 -0
- package/dist/server/wasm.d.ts.map +1 -0
- package/dist/server-renderer.d.ts +5 -0
- package/dist/server-renderer.d.ts.map +1 -0
- package/dist/store/index.d.ts +2 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/types.d.ts +2 -0
- package/dist/store/types.d.ts.map +1 -0
- package/dist/wasm.d.ts +51 -0
- package/dist/wasm.d.ts.map +1 -0
- package/package.json +65 -56
- package/templates/basic-app/src/main.tsx +1 -0
- package/templates/fullstack-template/.env.example +42 -0
- package/templates/fullstack-template/README.md +38 -42
- package/templates/fullstack-template/package-lock.json +7932 -0
- package/templates/fullstack-template/package.json +58 -6
- package/templates/fullstack-template/server.js +28 -9
- package/templates/fullstack-template/src/App.tsx +94 -0
- package/templates/fullstack-template/src/api/auth/login.ts +75 -0
- package/templates/fullstack-template/src/api/auth/me.ts +66 -0
- package/templates/fullstack-template/src/api/auth/register.ts +59 -0
- package/templates/fullstack-template/src/api/todos/[id].ts +108 -0
- package/templates/fullstack-template/src/api/todos/index.ts +79 -0
- package/templates/fullstack-template/src/components/Dashboard.tsx +129 -0
- package/templates/fullstack-template/src/components/Header.tsx +76 -0
- package/templates/fullstack-template/src/contexts/ApiContext.tsx +69 -0
- package/templates/fullstack-template/src/contexts/AuthContext.tsx +155 -0
- package/templates/fullstack-template/src/server.ts +167 -0
- package/templates/fullstack-template/src/styles/App.css +446 -0
- package/templates/ssr-template/package-lock.json +38 -60
- package/templates/ssr-template/package.json +1 -1
- package/templates/ssr-template/src/App.tsx +4 -3
- package/templates/ssr-template/src/client.tsx +2 -1
- package/templates/wasm/App.tsx +564 -0
- package/templates/wasm/client.tsx +220 -0
- package/templates/wasm/index.tsx +21 -0
- package/templates/wasm/package-lock.json +5347 -5307
- package/templates/wasm/package.json +43 -25
- package/templates/wasm/public/example.wasm +0 -0
- package/templates/wasm/public/wasm_exec.js +1 -12
- package/templates/wasm/server.ts +145 -0
- package/templates/wasm/vite.config.ts +42 -24
- package/README_WASM.md +0 -472
- package/dist/server.js.map +0 -7
- package/templates/basic-app/src/App.jsx +0 -0
- package/templates/basic-app/src/App.tsx +0 -0
- package/templates/fullstack-template/src/api/hello.js +0 -17
- package/templates/fullstack-template/src/pages/index.js +0 -206
- /package/templates/{basic-app/server.js → wasm/go/wasm_exec.js} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderComponent.d.ts","sourceRoot":"","sources":["../src/renderComponent.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAsB,eAAe,CACnC,SAAS,EAAE,GAAG,EACd,KAAK,GAAE,GAAQ,GACd,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,CAiC5D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/router/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { AuthService } from './auth.js';
|
|
2
|
+
export declare class ApiRouter {
|
|
3
|
+
router: any;
|
|
4
|
+
private apiDir;
|
|
5
|
+
private auth;
|
|
6
|
+
constructor(apiDir: string, auth?: AuthService | null);
|
|
7
|
+
private initializeRouter;
|
|
8
|
+
private setupRoutes;
|
|
9
|
+
private scanDirectory;
|
|
10
|
+
private isRouteFile;
|
|
11
|
+
private getRoutePath;
|
|
12
|
+
private registerRoute;
|
|
13
|
+
private isValidRouteModule;
|
|
14
|
+
private wrapHandler;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=api-router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-router.d.ts","sourceRoot":"","sources":["../../src/server/api-router.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAmBxC,qBAAa,SAAS;IACb,MAAM,EAAE,GAAG,CAAC;IACnB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAqB;gBAErB,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,WAAW,GAAG,IAAW;YAQ7C,gBAAgB;IAa9B,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,YAAY;YAiBN,aAAa;IAuE3B,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,WAAW;CASpB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface AuthConfig {
|
|
2
|
+
secret: string;
|
|
3
|
+
expiresIn?: string | number;
|
|
4
|
+
}
|
|
5
|
+
export interface User {
|
|
6
|
+
id: string | number;
|
|
7
|
+
username: string;
|
|
8
|
+
password?: string;
|
|
9
|
+
email?: string;
|
|
10
|
+
roles?: string[];
|
|
11
|
+
[key: string]: any;
|
|
12
|
+
}
|
|
13
|
+
export declare class AuthService {
|
|
14
|
+
private config;
|
|
15
|
+
constructor(config: AuthConfig);
|
|
16
|
+
hashPassword(password: string): Promise<string>;
|
|
17
|
+
comparePasswords(password: string, hashedPassword: string): Promise<boolean>;
|
|
18
|
+
generateToken(user: Omit<User, 'password'>): string;
|
|
19
|
+
verifyToken(token: string): any;
|
|
20
|
+
initialize(): (req: any, res: any, next: any) => void;
|
|
21
|
+
requireAuth(): (req: any, res: any, next: any) => any;
|
|
22
|
+
requireRoles(roles: string[]): (req: any, res: any, next: any) => any;
|
|
23
|
+
private extractToken;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/server/auth.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAa;gBAEf,MAAM,EAAE,UAAU;IAOxB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAY/C,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYlF,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,MAAM;IAsBnD,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG;IAa/B,UAAU,KACA,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,GAAG;IAavC,WAAW,KACD,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,GAAG;IASvC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAClB,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,GAAG;IAgBvC,OAAO,CAAC,YAAY;CAMrB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface DbConfig {
|
|
2
|
+
url: string;
|
|
3
|
+
type: 'mongodb' | 'mysql' | 'postgres';
|
|
4
|
+
}
|
|
5
|
+
export declare class Database {
|
|
6
|
+
private config;
|
|
7
|
+
private mongoClient;
|
|
8
|
+
private mongoDb;
|
|
9
|
+
private mysqlPool;
|
|
10
|
+
private pgPool;
|
|
11
|
+
constructor(config: DbConfig);
|
|
12
|
+
connect(): Promise<void>;
|
|
13
|
+
private connectMongo;
|
|
14
|
+
private connectMysql;
|
|
15
|
+
private connectPostgres;
|
|
16
|
+
disconnect(): Promise<void>;
|
|
17
|
+
getMongoDb(): any;
|
|
18
|
+
getMysqlPool(): any;
|
|
19
|
+
getPgPool(): any;
|
|
20
|
+
query(sql: string, values?: any[]): Promise<any>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=database.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/server/database.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;CACxC;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,MAAM,CAAa;gBAEf,MAAM,EAAE,QAAQ;IAItB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAgBhB,YAAY;YAgBZ,YAAY;YAgBZ,eAAe;IAiBvB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBjC,UAAU,IAAI,GAAG;IAIjB,YAAY,IAAI,GAAG;IAInB,SAAS,IAAI,GAAG;IAKV,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;CAgBvD"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { renderToString } from 'frontend-hamroun';
|
|
2
|
+
import { Database } from './database.js';
|
|
3
|
+
import { AuthService } from './auth.js';
|
|
4
|
+
import { ApiRouter } from './api-router.js';
|
|
5
|
+
import { rateLimit } from './middleware.js';
|
|
6
|
+
import * as utils from './utils.js';
|
|
7
|
+
import * as templates from './templates.js';
|
|
8
|
+
import { loadGoWasmFromFile } from './wasm.js';
|
|
9
|
+
export interface ServerConfig {
|
|
10
|
+
port?: number;
|
|
11
|
+
apiDir?: string;
|
|
12
|
+
pagesDir?: string;
|
|
13
|
+
staticDir?: string;
|
|
14
|
+
enableCors?: boolean;
|
|
15
|
+
corsOptions?: any;
|
|
16
|
+
db?: {
|
|
17
|
+
url: string;
|
|
18
|
+
type: 'mongodb' | 'mysql' | 'postgres';
|
|
19
|
+
};
|
|
20
|
+
auth?: {
|
|
21
|
+
secret: string;
|
|
22
|
+
expiresIn?: string | number;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export declare class Server {
|
|
26
|
+
private app;
|
|
27
|
+
private server;
|
|
28
|
+
private config;
|
|
29
|
+
private db;
|
|
30
|
+
private auth;
|
|
31
|
+
private initialized;
|
|
32
|
+
constructor(config?: ServerConfig);
|
|
33
|
+
private initializeApp;
|
|
34
|
+
private setupApiRoutes;
|
|
35
|
+
private generateApiDocs;
|
|
36
|
+
private scanApiDirectory;
|
|
37
|
+
private getRoutePath;
|
|
38
|
+
private detectApiMethods;
|
|
39
|
+
private setupPageRoutes;
|
|
40
|
+
private renderPage;
|
|
41
|
+
getExpressApp(): any;
|
|
42
|
+
getDatabase(): Database | null;
|
|
43
|
+
getAuth(): AuthService | null;
|
|
44
|
+
start(): Promise<void>;
|
|
45
|
+
stop(): Promise<void>;
|
|
46
|
+
restart(): Promise<void>;
|
|
47
|
+
enableSSR(options?: {
|
|
48
|
+
hydratable?: boolean;
|
|
49
|
+
}): void;
|
|
50
|
+
registerPlugin(plugin: (server: Server) => void): void;
|
|
51
|
+
addShutdownHandler(): void;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Creates and configures a new server instance
|
|
55
|
+
*/
|
|
56
|
+
export declare function createServer(config?: ServerConfig): Server;
|
|
57
|
+
/**
|
|
58
|
+
* Creates a new server with sensible defaults for development
|
|
59
|
+
*/
|
|
60
|
+
export declare function createDevServer(options?: {
|
|
61
|
+
port?: number;
|
|
62
|
+
enableCors?: boolean;
|
|
63
|
+
}): Server;
|
|
64
|
+
/**
|
|
65
|
+
* Creates a production-ready server with optimized settings
|
|
66
|
+
*/
|
|
67
|
+
export declare function createProductionServer(config: ServerConfig): Server;
|
|
68
|
+
export declare function getRequestIp(req: any): string;
|
|
69
|
+
export declare function parseCookies(req: any): Record<string, string>;
|
|
70
|
+
export declare const renderComponent: (Component: any, props?: any) => {
|
|
71
|
+
html: string;
|
|
72
|
+
success: boolean;
|
|
73
|
+
error?: undefined;
|
|
74
|
+
} | {
|
|
75
|
+
html: string;
|
|
76
|
+
success: boolean;
|
|
77
|
+
error: unknown;
|
|
78
|
+
};
|
|
79
|
+
export { initNodeWasm, loadGoWasmFromFile } from './wasm.js';
|
|
80
|
+
export * from './utils.js';
|
|
81
|
+
export * from './templates.js';
|
|
82
|
+
export { Database } from './database.js';
|
|
83
|
+
export { AuthService } from './auth.js';
|
|
84
|
+
export { ApiRouter } from './api-router.js';
|
|
85
|
+
export { requestLogger, errorHandler, notFoundHandler, rateLimit } from './middleware.js';
|
|
86
|
+
export { renderToString };
|
|
87
|
+
declare const _default: {
|
|
88
|
+
Server: typeof Server;
|
|
89
|
+
createServer: typeof createServer;
|
|
90
|
+
createDevServer: typeof createDevServer;
|
|
91
|
+
createProductionServer: typeof createProductionServer;
|
|
92
|
+
rateLimit: typeof rateLimit;
|
|
93
|
+
requestLogger: import("./middleware.js").MiddlewareFunction;
|
|
94
|
+
errorHandler: (err: Error, req: any, res: any, next: any) => void;
|
|
95
|
+
notFoundHandler: (req: any, res: any) => void;
|
|
96
|
+
loadGoWasmFromFile: typeof loadGoWasmFromFile;
|
|
97
|
+
templates: typeof templates;
|
|
98
|
+
utils: typeof utils;
|
|
99
|
+
renderComponent: (Component: any, props?: any) => {
|
|
100
|
+
html: string;
|
|
101
|
+
success: boolean;
|
|
102
|
+
error?: undefined;
|
|
103
|
+
} | {
|
|
104
|
+
html: string;
|
|
105
|
+
success: boolean;
|
|
106
|
+
error: unknown;
|
|
107
|
+
};
|
|
108
|
+
renderToString: typeof renderToString;
|
|
109
|
+
getRequestIp: typeof getRequestIp;
|
|
110
|
+
parseCookies: typeof parseCookies;
|
|
111
|
+
Database: typeof Database;
|
|
112
|
+
AuthService: typeof AuthService;
|
|
113
|
+
ApiRouter: typeof ApiRouter;
|
|
114
|
+
};
|
|
115
|
+
export default _default;
|
|
116
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,7 +14,102 @@ var __export = (target, all) => {
|
|
|
14
14
|
// src/server/index.ts
|
|
15
15
|
import path4 from "path";
|
|
16
16
|
import fs4 from "fs";
|
|
17
|
-
|
|
17
|
+
|
|
18
|
+
// node_modules/frontend-hamroun/dist/index.mjs
|
|
19
|
+
var currentRender = 0;
|
|
20
|
+
var stateIndices = /* @__PURE__ */ new Map();
|
|
21
|
+
var isServer = typeof window === "undefined";
|
|
22
|
+
var serverStates = /* @__PURE__ */ new Map();
|
|
23
|
+
function prepareRender() {
|
|
24
|
+
currentRender++;
|
|
25
|
+
stateIndices.set(currentRender, 0);
|
|
26
|
+
return currentRender;
|
|
27
|
+
}
|
|
28
|
+
function finishRender() {
|
|
29
|
+
if (isServer) {
|
|
30
|
+
serverStates.delete(currentRender);
|
|
31
|
+
}
|
|
32
|
+
currentRender = 0;
|
|
33
|
+
}
|
|
34
|
+
function renderToString(vnode) {
|
|
35
|
+
prepareRender();
|
|
36
|
+
const html = renderNodeToString(vnode);
|
|
37
|
+
finishRender();
|
|
38
|
+
return html;
|
|
39
|
+
}
|
|
40
|
+
function renderNodeToString(vnode) {
|
|
41
|
+
var _a, _b, _c;
|
|
42
|
+
if (vnode === null || vnode === void 0)
|
|
43
|
+
return "";
|
|
44
|
+
if (typeof vnode === "boolean")
|
|
45
|
+
return "";
|
|
46
|
+
if (typeof vnode === "number" || typeof vnode === "string")
|
|
47
|
+
return escapeHtml(String(vnode));
|
|
48
|
+
if (typeof vnode.type === "function") {
|
|
49
|
+
const Component2 = vnode.type;
|
|
50
|
+
const renderedNode = Component2(vnode.props || {});
|
|
51
|
+
return renderNodeToString(renderedNode);
|
|
52
|
+
}
|
|
53
|
+
if (typeof vnode.type === "string") {
|
|
54
|
+
const tag = vnode.type;
|
|
55
|
+
let attrs = "";
|
|
56
|
+
let children = "";
|
|
57
|
+
if (vnode.props) {
|
|
58
|
+
for (const [key, value] of Object.entries(vnode.props)) {
|
|
59
|
+
if (key === "children")
|
|
60
|
+
continue;
|
|
61
|
+
if (key.startsWith("on"))
|
|
62
|
+
continue;
|
|
63
|
+
if (key === "className") {
|
|
64
|
+
attrs += ` class="${escapeHtml(value)}"`;
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (typeof value === "string" || typeof value === "number") {
|
|
68
|
+
attrs += ` ${key}="${escapeHtml(String(value))}"`;
|
|
69
|
+
} else if (value === true) {
|
|
70
|
+
attrs += ` ${key}`;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const childrenArray = ((_a = vnode.props) == null ? void 0 : _a.children) ? Array.isArray(vnode.props.children) ? vnode.props.children : [vnode.props.children] : [];
|
|
75
|
+
for (const child of childrenArray) {
|
|
76
|
+
children += renderNodeToString(child);
|
|
77
|
+
}
|
|
78
|
+
const selfClosing = [
|
|
79
|
+
"area",
|
|
80
|
+
"base",
|
|
81
|
+
"br",
|
|
82
|
+
"col",
|
|
83
|
+
"embed",
|
|
84
|
+
"hr",
|
|
85
|
+
"img",
|
|
86
|
+
"input",
|
|
87
|
+
"link",
|
|
88
|
+
"meta",
|
|
89
|
+
"param",
|
|
90
|
+
"source",
|
|
91
|
+
"track",
|
|
92
|
+
"wbr"
|
|
93
|
+
];
|
|
94
|
+
if (selfClosing.includes(tag)) {
|
|
95
|
+
return `<${tag}${attrs}/>`;
|
|
96
|
+
}
|
|
97
|
+
return `<${tag}${attrs}>${children}</${tag}>`;
|
|
98
|
+
}
|
|
99
|
+
if (vnode.type === Symbol.for("react.fragment")) {
|
|
100
|
+
let fragmentOutput = "";
|
|
101
|
+
const children = Array.isArray((_b = vnode.props) == null ? void 0 : _b.children) ? vnode.props.children : ((_c = vnode.props) == null ? void 0 : _c.children) ? [vnode.props.children] : [];
|
|
102
|
+
for (const child of children) {
|
|
103
|
+
fragmentOutput += renderNodeToString(child);
|
|
104
|
+
}
|
|
105
|
+
return fragmentOutput;
|
|
106
|
+
}
|
|
107
|
+
console.warn("Unknown vnode type:", vnode.type);
|
|
108
|
+
return "";
|
|
109
|
+
}
|
|
110
|
+
function escapeHtml(text) {
|
|
111
|
+
return text.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
112
|
+
}
|
|
18
113
|
|
|
19
114
|
// src/server/database.ts
|
|
20
115
|
var Database = class {
|
|
@@ -548,38 +643,38 @@ function generateDocument(content, options = {}) {
|
|
|
548
643
|
initialData = {},
|
|
549
644
|
componentName = ""
|
|
550
645
|
} = options;
|
|
551
|
-
const htmlAttributes = Object.entries(htmlAttrs).map(([key, value]) => `${key}="${
|
|
552
|
-
const bodyAttributes = Object.entries(bodyAttrs).map(([key, value]) => `${key}="${
|
|
646
|
+
const htmlAttributes = Object.entries(htmlAttrs).map(([key, value]) => `${key}="${escapeHtml2(value)}"`).join(" ");
|
|
647
|
+
const bodyAttributes = Object.entries(bodyAttrs).map(([key, value]) => `${key}="${escapeHtml2(value)}"`).join(" ");
|
|
553
648
|
const metaTags = [
|
|
554
649
|
`<meta charset="${charset}">`,
|
|
555
650
|
`<meta name="viewport" content="${viewport}">`,
|
|
556
|
-
description ? `<meta name="description" content="${
|
|
651
|
+
description ? `<meta name="description" content="${escapeHtml2(description)}">` : ""
|
|
557
652
|
];
|
|
558
653
|
Object.entries(meta).forEach(([name, content2]) => {
|
|
559
|
-
metaTags.push(`<meta name="${
|
|
654
|
+
metaTags.push(`<meta name="${escapeHtml2(name)}" content="${escapeHtml2(content2)}">`);
|
|
560
655
|
});
|
|
561
656
|
const scriptTags = scripts.map((src) => {
|
|
562
657
|
if (src.startsWith("<script")) {
|
|
563
658
|
return src;
|
|
564
659
|
}
|
|
565
|
-
return `<script src="${
|
|
660
|
+
return `<script src="${escapeHtml2(src)}" ${src.endsWith(".js") ? 'type="module"' : ""} defer></script>`;
|
|
566
661
|
});
|
|
567
662
|
const styleTags = styles.map((href) => {
|
|
568
663
|
if (href.startsWith("<style")) {
|
|
569
664
|
return href;
|
|
570
665
|
}
|
|
571
|
-
return `<link rel="stylesheet" href="${
|
|
666
|
+
return `<link rel="stylesheet" href="${escapeHtml2(href)}">`;
|
|
572
667
|
});
|
|
573
|
-
const initialDataScript = Object.keys(initialData).length > 0 ? `<script id="__APP_DATA__" type="application/json">${
|
|
668
|
+
const initialDataScript = Object.keys(initialData).length > 0 ? `<script id="__APP_DATA__" type="application/json">${escapeHtml2(JSON.stringify(initialData))}</script>` : "";
|
|
574
669
|
return `<!DOCTYPE html>
|
|
575
670
|
<html lang="${lang}" ${htmlAttributes}>
|
|
576
671
|
<head>
|
|
577
672
|
${metaTags.filter(Boolean).join("\n ")}
|
|
578
|
-
<title>${
|
|
673
|
+
<title>${escapeHtml2(title)}</title>
|
|
579
674
|
${styleTags.join("\n ")}
|
|
580
675
|
</head>
|
|
581
676
|
<body class="${bodyClasses}" ${bodyAttributes}>
|
|
582
|
-
<div id="app-root" data-ssr-root${componentName ? ` data-component="${
|
|
677
|
+
<div id="app-root" data-ssr-root${componentName ? ` data-component="${escapeHtml2(componentName)}"` : ""}>${content}</div>
|
|
583
678
|
${initialDataScript}
|
|
584
679
|
${scriptTags.join("\n ")}
|
|
585
680
|
</body>
|
|
@@ -597,14 +692,14 @@ function generateErrorPage(statusCode, message, error) {
|
|
|
597
692
|
const isDev = process.env.NODE_ENV !== "production";
|
|
598
693
|
const errorDetails = isDev && error ? `
|
|
599
694
|
<div class="error-details">
|
|
600
|
-
<pre>${
|
|
695
|
+
<pre>${escapeHtml2(error.stack || error.message)}</pre>
|
|
601
696
|
</div>
|
|
602
697
|
` : "";
|
|
603
698
|
const content = `
|
|
604
699
|
<div class="error-container">
|
|
605
700
|
<h1>${statusCode}</h1>
|
|
606
|
-
<h2>${
|
|
607
|
-
<p>${
|
|
701
|
+
<h2>${escapeHtml2(errorMessages[statusCode] || "Error")}</h2>
|
|
702
|
+
<p>${escapeHtml2(message)}</p>
|
|
608
703
|
${errorDetails}
|
|
609
704
|
<a href="/" class="home-link">Back to Home</a>
|
|
610
705
|
</div>
|
|
@@ -678,7 +773,7 @@ function generateLoadingPage(message = "Loading...") {
|
|
|
678
773
|
const content = `
|
|
679
774
|
<div class="loading-container">
|
|
680
775
|
<div class="spinner"></div>
|
|
681
|
-
<p>${
|
|
776
|
+
<p>${escapeHtml2(message)}</p>
|
|
682
777
|
</div>
|
|
683
778
|
`;
|
|
684
779
|
const styles = [`<style>
|
|
@@ -714,7 +809,7 @@ function generateLoadingPage(message = "Loading...") {
|
|
|
714
809
|
styles
|
|
715
810
|
});
|
|
716
811
|
}
|
|
717
|
-
function
|
|
812
|
+
function escapeHtml2(text) {
|
|
718
813
|
return String(text).replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
719
814
|
}
|
|
720
815
|
|
|
@@ -879,6 +974,7 @@ var Server = class {
|
|
|
879
974
|
this.server = null;
|
|
880
975
|
this.db = null;
|
|
881
976
|
this.auth = null;
|
|
977
|
+
this.initialized = false;
|
|
882
978
|
this.config = {
|
|
883
979
|
port: 3e3,
|
|
884
980
|
apiDir: "./api",
|
|
@@ -887,9 +983,10 @@ var Server = class {
|
|
|
887
983
|
enableCors: true,
|
|
888
984
|
...config
|
|
889
985
|
};
|
|
890
|
-
this.initializeApp();
|
|
891
986
|
}
|
|
892
987
|
async initializeApp() {
|
|
988
|
+
if (this.initialized)
|
|
989
|
+
return;
|
|
893
990
|
try {
|
|
894
991
|
const express = await import("express");
|
|
895
992
|
this.app = express.default();
|
|
@@ -921,6 +1018,7 @@ var Server = class {
|
|
|
921
1018
|
this.setupPageRoutes();
|
|
922
1019
|
this.app.use(notFoundHandler);
|
|
923
1020
|
this.app.use(errorHandler);
|
|
1021
|
+
this.initialized = true;
|
|
924
1022
|
} catch (error) {
|
|
925
1023
|
if (error.code === "MODULE_NOT_FOUND" && error.message.includes("express")) {
|
|
926
1024
|
throw new Error("Express not installed. Run: npm install express @types/express");
|
|
@@ -1108,7 +1206,8 @@ var Server = class {
|
|
|
1108
1206
|
getAuth() {
|
|
1109
1207
|
return this.auth;
|
|
1110
1208
|
}
|
|
1111
|
-
start() {
|
|
1209
|
+
async start() {
|
|
1210
|
+
await this.initializeApp();
|
|
1112
1211
|
return new Promise((resolve) => {
|
|
1113
1212
|
this.server = this.app.listen(this.config.port, () => {
|
|
1114
1213
|
console.log(`Server running at http://localhost:${this.config.port}`);
|
|
@@ -1221,11 +1320,9 @@ function parseCookies(req) {
|
|
|
1221
1320
|
}
|
|
1222
1321
|
return cookies;
|
|
1223
1322
|
}
|
|
1224
|
-
var renderComponent =
|
|
1323
|
+
var renderComponent = (Component, props = {}) => {
|
|
1225
1324
|
try {
|
|
1226
|
-
const
|
|
1227
|
-
const element = jsx(Component, props);
|
|
1228
|
-
const html = renderToString2(element);
|
|
1325
|
+
const html = renderToString(Component(props));
|
|
1229
1326
|
return {
|
|
1230
1327
|
html: typeof html === "string" ? html : String(html),
|
|
1231
1328
|
success: true
|
|
@@ -1233,7 +1330,7 @@ var renderComponent = async (Component, props = {}) => {
|
|
|
1233
1330
|
} catch (error) {
|
|
1234
1331
|
console.error("Error rendering component:", error);
|
|
1235
1332
|
return {
|
|
1236
|
-
html: `<div class="error">Error rendering component
|
|
1333
|
+
html: `<div class="error">Error rendering component</div>`,
|
|
1237
1334
|
success: false,
|
|
1238
1335
|
error
|
|
1239
1336
|
};
|
|
@@ -1298,4 +1395,4 @@ export {
|
|
|
1298
1395
|
validateFileUpload,
|
|
1299
1396
|
writeJsonFile
|
|
1300
1397
|
};
|
|
1301
|
-
//# sourceMappingURL=
|
|
1398
|
+
//# sourceMappingURL=index.js.map
|