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.
Files changed (98) hide show
  1. package/bin/baraqex.js +1013 -1126
  2. package/dist/api/hello.d.ts +3 -0
  3. package/dist/api/hello.d.ts.map +1 -0
  4. package/dist/api/users/[id].d.ts +5 -0
  5. package/dist/api/users/[id].d.ts.map +1 -0
  6. package/dist/browser.d.ts +40 -0
  7. package/dist/browser.d.ts.map +1 -0
  8. package/dist/browser.js +407 -1
  9. package/dist/browser.js.map +4 -4
  10. package/dist/browser.package.json +4 -0
  11. package/dist/forms/index.d.ts +2 -0
  12. package/dist/forms/index.d.ts.map +1 -0
  13. package/dist/forms/types.d.ts +2 -0
  14. package/dist/forms/types.d.ts.map +1 -0
  15. package/dist/frontend/components/WasmLoader.d.ts +2 -0
  16. package/dist/frontend/components/WasmLoader.d.ts.map +1 -0
  17. package/dist/frontend/hooks/useWasm.d.ts +2 -0
  18. package/dist/frontend/hooks/useWasm.d.ts.map +1 -0
  19. package/dist/frontend/index.d.ts +2 -0
  20. package/dist/frontend/index.d.ts.map +1 -0
  21. package/dist/index.d.ts +38 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +678 -317
  24. package/dist/index.js.map +4 -4
  25. package/dist/renderComponent.d.ts +9 -0
  26. package/dist/renderComponent.d.ts.map +1 -0
  27. package/dist/router/index.d.ts +2 -0
  28. package/dist/router/index.d.ts.map +1 -0
  29. package/dist/router/types.d.ts +2 -0
  30. package/dist/router/types.d.ts.map +1 -0
  31. package/dist/server/api-router.d.ts +16 -0
  32. package/dist/server/api-router.d.ts.map +1 -0
  33. package/dist/server/auth.d.ts +25 -0
  34. package/dist/server/auth.d.ts.map +1 -0
  35. package/dist/server/database.d.ts +22 -0
  36. package/dist/server/database.d.ts.map +1 -0
  37. package/dist/server/index.d.ts +116 -0
  38. package/dist/server/index.d.ts.map +1 -0
  39. package/dist/{server.js → server/index.js} +120 -23
  40. package/dist/server/index.js.map +7 -0
  41. package/dist/server/middleware.d.ts +11 -0
  42. package/dist/server/middleware.d.ts.map +1 -0
  43. package/dist/server/package.json +4 -0
  44. package/dist/server/templates.d.ts +31 -0
  45. package/dist/server/templates.d.ts.map +1 -0
  46. package/dist/server/types.d.ts +69 -0
  47. package/dist/server/types.d.ts.map +1 -0
  48. package/dist/server/utils.d.ts +70 -0
  49. package/dist/server/utils.d.ts.map +1 -0
  50. package/dist/server/wasm.d.ts +29 -0
  51. package/dist/server/wasm.d.ts.map +1 -0
  52. package/dist/server-renderer.d.ts +5 -0
  53. package/dist/server-renderer.d.ts.map +1 -0
  54. package/dist/store/index.d.ts +2 -0
  55. package/dist/store/index.d.ts.map +1 -0
  56. package/dist/store/types.d.ts +2 -0
  57. package/dist/store/types.d.ts.map +1 -0
  58. package/dist/wasm.d.ts +51 -0
  59. package/dist/wasm.d.ts.map +1 -0
  60. package/package.json +65 -56
  61. package/templates/basic-app/src/main.tsx +1 -0
  62. package/templates/fullstack-template/.env.example +42 -0
  63. package/templates/fullstack-template/README.md +38 -42
  64. package/templates/fullstack-template/package-lock.json +7932 -0
  65. package/templates/fullstack-template/package.json +58 -6
  66. package/templates/fullstack-template/server.js +28 -9
  67. package/templates/fullstack-template/src/App.tsx +94 -0
  68. package/templates/fullstack-template/src/api/auth/login.ts +75 -0
  69. package/templates/fullstack-template/src/api/auth/me.ts +66 -0
  70. package/templates/fullstack-template/src/api/auth/register.ts +59 -0
  71. package/templates/fullstack-template/src/api/todos/[id].ts +108 -0
  72. package/templates/fullstack-template/src/api/todos/index.ts +79 -0
  73. package/templates/fullstack-template/src/components/Dashboard.tsx +129 -0
  74. package/templates/fullstack-template/src/components/Header.tsx +76 -0
  75. package/templates/fullstack-template/src/contexts/ApiContext.tsx +69 -0
  76. package/templates/fullstack-template/src/contexts/AuthContext.tsx +155 -0
  77. package/templates/fullstack-template/src/server.ts +167 -0
  78. package/templates/fullstack-template/src/styles/App.css +446 -0
  79. package/templates/ssr-template/package-lock.json +38 -60
  80. package/templates/ssr-template/package.json +1 -1
  81. package/templates/ssr-template/src/App.tsx +4 -3
  82. package/templates/ssr-template/src/client.tsx +2 -1
  83. package/templates/wasm/App.tsx +564 -0
  84. package/templates/wasm/client.tsx +220 -0
  85. package/templates/wasm/index.tsx +21 -0
  86. package/templates/wasm/package-lock.json +5347 -5307
  87. package/templates/wasm/package.json +43 -25
  88. package/templates/wasm/public/example.wasm +0 -0
  89. package/templates/wasm/public/wasm_exec.js +1 -12
  90. package/templates/wasm/server.ts +145 -0
  91. package/templates/wasm/vite.config.ts +42 -24
  92. package/README_WASM.md +0 -472
  93. package/dist/server.js.map +0 -7
  94. package/templates/basic-app/src/App.jsx +0 -0
  95. package/templates/basic-app/src/App.tsx +0 -0
  96. package/templates/fullstack-template/src/api/hello.js +0 -17
  97. package/templates/fullstack-template/src/pages/index.js +0 -206
  98. /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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.d.ts.map
@@ -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
- import { renderToString } from "frontend-hamroun";
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, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;");
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}="${escapeHtml(value)}"`).join(" ");
552
- const bodyAttributes = Object.entries(bodyAttrs).map(([key, value]) => `${key}="${escapeHtml(value)}"`).join(" ");
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="${escapeHtml(description)}">` : ""
651
+ description ? `<meta name="description" content="${escapeHtml2(description)}">` : ""
557
652
  ];
558
653
  Object.entries(meta).forEach(([name, content2]) => {
559
- metaTags.push(`<meta name="${escapeHtml(name)}" content="${escapeHtml(content2)}">`);
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="${escapeHtml(src)}" ${src.endsWith(".js") ? 'type="module"' : ""} defer></script>`;
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="${escapeHtml(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">${escapeHtml(JSON.stringify(initialData))}</script>` : "";
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>${escapeHtml(title)}</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="${escapeHtml(componentName)}"` : ""}>${content}</div>
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>${escapeHtml(error.stack || error.message)}</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>${escapeHtml(errorMessages[statusCode] || "Error")}</h2>
607
- <p>${escapeHtml(message)}</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>${escapeHtml(message)}</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 escapeHtml(text) {
812
+ function escapeHtml2(text) {
718
813
  return String(text).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;");
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 = async (Component, props = {}) => {
1323
+ var renderComponent = (Component, props = {}) => {
1225
1324
  try {
1226
- const { jsx, renderToString: renderToString2 } = await import("frontend-hamroun");
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: ${error instanceof Error ? error.message : "Unknown error"}</div>`,
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=server.js.map
1398
+ //# sourceMappingURL=index.js.map