baraqex 1.0.8 → 1.0.10

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 (57) hide show
  1. package/dist/index.d.ts +6 -2
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +11 -5
  4. package/dist/index.js.map +1 -1
  5. package/dist/renderComponent.d.ts +9 -0
  6. package/dist/renderComponent.d.ts.map +1 -0
  7. package/dist/renderComponent.js +39 -0
  8. package/dist/renderComponent.js.map +1 -0
  9. package/dist/server/api-router.d.ts +16 -0
  10. package/dist/server/api-router.d.ts.map +1 -0
  11. package/dist/server/api-router.js +93 -0
  12. package/dist/server/api-router.js.map +1 -0
  13. package/dist/server/auth.d.ts +33 -0
  14. package/dist/server/auth.d.ts.map +1 -0
  15. package/dist/server/auth.js +74 -0
  16. package/dist/server/auth.js.map +1 -0
  17. package/dist/server/database.d.ts +25 -0
  18. package/dist/server/database.d.ts.map +1 -0
  19. package/dist/server/database.js +109 -0
  20. package/dist/server/database.js.map +1 -0
  21. package/dist/server/index.d.ts +117 -0
  22. package/dist/server/index.d.ts.map +1 -0
  23. package/dist/server/index.js +465 -0
  24. package/dist/server/index.js.map +1 -0
  25. package/dist/server/middleware.d.ts +12 -0
  26. package/dist/server/middleware.d.ts.map +1 -0
  27. package/dist/server/middleware.js +46 -0
  28. package/dist/server/middleware.js.map +1 -0
  29. package/dist/server/server.d.ts +10 -0
  30. package/dist/server/server.d.ts.map +1 -0
  31. package/dist/server/server.js +81 -0
  32. package/dist/server/server.js.map +1 -0
  33. package/dist/server/templates.d.ts +31 -0
  34. package/dist/server/templates.d.ts.map +1 -0
  35. package/dist/server/templates.js +208 -0
  36. package/dist/server/templates.js.map +1 -0
  37. package/dist/server/types.d.ts +39 -0
  38. package/dist/server/types.d.ts.map +1 -0
  39. package/dist/server/types.js +4 -0
  40. package/dist/server/types.js.map +1 -0
  41. package/dist/server/utils.d.ts +71 -0
  42. package/dist/server/utils.d.ts.map +1 -0
  43. package/dist/server/utils.js +156 -0
  44. package/dist/server/utils.js.map +1 -0
  45. package/dist/server/wasm.d.ts +10 -0
  46. package/dist/server/wasm.d.ts.map +1 -0
  47. package/dist/server/wasm.js +117 -0
  48. package/dist/server/wasm.js.map +1 -0
  49. package/dist/server-renderer.d.ts +6 -0
  50. package/dist/server-renderer.d.ts.map +1 -0
  51. package/dist/server-renderer.js +39 -0
  52. package/dist/server-renderer.js.map +1 -0
  53. package/dist/wasm.d.ts +17 -0
  54. package/dist/wasm.d.ts.map +1 -0
  55. package/dist/wasm.js +48 -0
  56. package/dist/wasm.js.map +1 -0
  57. package/package.json +15 -3
@@ -0,0 +1,465 @@
1
+ import express from 'express';
2
+ import path from 'path';
3
+ import fs from 'fs';
4
+ import cors from 'cors';
5
+ import { renderToString } from 'frontend-hamroun';
6
+ import { Database } from './database.js';
7
+ import { AuthService } from './auth.js';
8
+ import { ApiRouter } from './api-router.js';
9
+ import { requestLogger, errorHandler, notFoundHandler, rateLimit } from './middleware.js';
10
+ // Import the utility functions
11
+ import * as utils from './utils.js';
12
+ import * as templates from './templates.js';
13
+ import { loadGoWasmFromFile } from './wasm.js';
14
+ // Helper function to get the component name from the file path
15
+ function getComponentName(filePath, pagesDir) {
16
+ try {
17
+ // Get relative path from pages directory
18
+ const relativePath = path.relative(pagesDir, filePath);
19
+ // Remove extension
20
+ const withoutExt = relativePath.replace(/\.[^/.]+$/, '');
21
+ // Replace index with empty for clean paths
22
+ const cleanPath = withoutExt.replace(/\/index$/, '');
23
+ // Convert to module path format
24
+ return `/pages/${cleanPath}`;
25
+ }
26
+ catch (e) {
27
+ return '';
28
+ }
29
+ }
30
+ export class Server {
31
+ constructor(config = {}) {
32
+ this.server = null;
33
+ this.db = null;
34
+ this.auth = null;
35
+ this.config = {
36
+ port: 3000,
37
+ apiDir: './api',
38
+ pagesDir: './pages',
39
+ staticDir: './public',
40
+ enableCors: true,
41
+ ...config
42
+ };
43
+ this.app = express();
44
+ // Basic middleware
45
+ this.app.use(express.json());
46
+ this.app.use(express.urlencoded({ extended: true }));
47
+ // CORS setup
48
+ if (this.config.enableCors) {
49
+ this.app.use(cors(this.config.corsOptions));
50
+ }
51
+ // Setup database if configured
52
+ if (this.config.db) {
53
+ this.db = new Database(this.config.db);
54
+ }
55
+ // Setup auth if configured
56
+ if (this.config.auth) {
57
+ // Fix by explicitly typing the auth configuration
58
+ this.auth = new AuthService({
59
+ secret: this.config.auth.secret,
60
+ expiresIn: this.config.auth.expiresIn
61
+ });
62
+ // Expose auth middleware
63
+ this.app.use(this.auth.initialize());
64
+ }
65
+ // Static files
66
+ if (fs.existsSync(path.resolve(process.cwd(), this.config.staticDir))) {
67
+ this.app.use(express.static(path.resolve(process.cwd(), this.config.staticDir)));
68
+ }
69
+ // Setup API routes
70
+ this.setupApiRoutes();
71
+ // Setup page routes (for SSR)
72
+ this.setupPageRoutes();
73
+ }
74
+ setupApiRoutes() {
75
+ const apiRouter = new ApiRouter(this.config.apiDir, this.auth);
76
+ this.app.use('/api', requestLogger, apiRouter.router);
77
+ // Add API documentation route
78
+ this.app.get('/api-docs', (req, res) => {
79
+ const apiDocs = this.generateApiDocs();
80
+ res.json(apiDocs);
81
+ });
82
+ }
83
+ generateApiDocs() {
84
+ // Generate documentation based on API routes
85
+ const apiDir = path.resolve(process.cwd(), this.config.apiDir);
86
+ const docs = { endpoints: [] };
87
+ if (fs.existsSync(apiDir)) {
88
+ this.scanApiDirectory(apiDir, '', docs.endpoints);
89
+ }
90
+ return docs;
91
+ }
92
+ scanApiDirectory(dirPath, routePrefix, endpoints) {
93
+ const entries = fs.readdirSync(dirPath, { withFileTypes: true });
94
+ for (const entry of entries) {
95
+ const fullPath = path.join(dirPath, entry.name);
96
+ if (entry.isDirectory()) {
97
+ this.scanApiDirectory(fullPath, `${routePrefix}/${entry.name}`, endpoints);
98
+ }
99
+ else if (entry.name.endsWith('.js') || entry.name.endsWith('.ts')) {
100
+ const routePath = this.getRoutePath(entry.name, routePrefix);
101
+ endpoints.push({
102
+ path: routePath,
103
+ file: path.relative(process.cwd(), fullPath),
104
+ methods: this.detectApiMethods(fullPath)
105
+ });
106
+ }
107
+ }
108
+ }
109
+ getRoutePath(filename, routePrefix) {
110
+ const baseName = path.basename(filename, path.extname(filename));
111
+ if (baseName === 'index') {
112
+ return routePrefix || '/';
113
+ }
114
+ const paramMatch = baseName.match(/^\[(.+)\]$/);
115
+ if (paramMatch) {
116
+ return `${routePrefix}/:${paramMatch[1]}`;
117
+ }
118
+ return `${routePrefix}/${baseName}`;
119
+ }
120
+ detectApiMethods(filePath) {
121
+ try {
122
+ const content = fs.readFileSync(filePath, 'utf8');
123
+ const methods = ['get', 'post', 'put', 'delete', 'patch', 'options'];
124
+ return methods.filter(method => new RegExp(`export (async )?function ${method}\\s*\\(`).test(content) ||
125
+ new RegExp(`export const ${method}\\s*=`).test(content));
126
+ }
127
+ catch (error) {
128
+ return [];
129
+ }
130
+ }
131
+ setupPageRoutes() {
132
+ if (!fs.existsSync(path.resolve(process.cwd(), this.config.pagesDir))) {
133
+ return;
134
+ }
135
+ // Setup catch-all route for SSR
136
+ this.app.get('*', async (req, res) => {
137
+ try {
138
+ // Implement page routing logic
139
+ const { html, statusCode } = await this.renderPage(req.path);
140
+ res.status(statusCode || 200).send(html);
141
+ }
142
+ catch (error) {
143
+ console.error('Error rendering page:', error);
144
+ res.status(500).send('Server Error');
145
+ }
146
+ });
147
+ }
148
+ async renderPage(routePath) {
149
+ try {
150
+ // Try to find the page component
151
+ const pagesDir = this.config.pagesDir ? path.resolve(process.cwd(), this.config.pagesDir) : '';
152
+ if (!pagesDir || !fs.existsSync(pagesDir)) {
153
+ return {
154
+ html: templates.generateErrorPage(404, 'Pages directory not found'),
155
+ statusCode: 404
156
+ };
157
+ }
158
+ // Normalize the path
159
+ let normalizedPath = routePath;
160
+ if (!normalizedPath.startsWith('/')) {
161
+ normalizedPath = '/' + normalizedPath;
162
+ }
163
+ // Default to index for the root
164
+ if (normalizedPath === '/') {
165
+ normalizedPath = '/index';
166
+ }
167
+ // Try to find a matching page file
168
+ let pagePath = '';
169
+ const possiblePaths = [
170
+ path.join(pagesDir, `${normalizedPath}.js`),
171
+ path.join(pagesDir, `${normalizedPath}.ts`),
172
+ path.join(pagesDir, `${normalizedPath}.jsx`),
173
+ path.join(pagesDir, `${normalizedPath}.tsx`),
174
+ path.join(pagesDir, `${normalizedPath}/index.js`),
175
+ path.join(pagesDir, `${normalizedPath}/index.ts`),
176
+ path.join(pagesDir, `${normalizedPath}/index.jsx`),
177
+ path.join(pagesDir, `${normalizedPath}/index.tsx`)
178
+ ];
179
+ for (const p of possiblePaths) {
180
+ if (fs.existsSync(p)) {
181
+ pagePath = p;
182
+ break;
183
+ }
184
+ }
185
+ // Handle 404 if page not found
186
+ if (!pagePath) {
187
+ return {
188
+ html: templates.generateErrorPage(404, `Page not found: ${normalizedPath}`),
189
+ statusCode: 404
190
+ };
191
+ }
192
+ // Import and render the page component
193
+ try {
194
+ const pageModule = await import(pagePath);
195
+ if (!pageModule || !pageModule.default) {
196
+ throw new Error(`No default export found in ${pagePath}`);
197
+ }
198
+ const PageComponent = pageModule.default;
199
+ const initialProps = {
200
+ // Provide any initial props here
201
+ path: normalizedPath,
202
+ query: {}, // Could be parsed from URL
203
+ api: { serverTime: new Date().toISOString() }
204
+ };
205
+ // Render the component to HTML
206
+ const { html, success, error } = await renderComponent(PageComponent, initialProps);
207
+ if (!success) {
208
+ return {
209
+ html: templates.generateErrorPage(500, 'Failed to render page', error instanceof Error ? error : new Error('Unknown error')),
210
+ statusCode: 500
211
+ };
212
+ }
213
+ // Generate the full HTML document
214
+ let pageTitle = 'My App';
215
+ try {
216
+ // Try to extract title from component if it has a getTitle method
217
+ if (typeof PageComponent.getTitle === 'function') {
218
+ pageTitle = PageComponent.getTitle(initialProps);
219
+ }
220
+ else if (PageComponent.title) {
221
+ pageTitle = PageComponent.title;
222
+ }
223
+ }
224
+ catch (e) {
225
+ // Ignore title errors
226
+ }
227
+ // Parse the component name for hydration
228
+ const componentName = getComponentName(pagePath, pagesDir);
229
+ // Generate full HTML document with our template
230
+ const fullHtml = templates.generateDocument(html, {
231
+ title: pageTitle,
232
+ // Get description from component if available
233
+ description: typeof PageComponent.getDescription === 'function'
234
+ ? PageComponent.getDescription(initialProps)
235
+ : (PageComponent.description || ''),
236
+ // Add scripts for client-side hydration
237
+ scripts: ['/client.js'],
238
+ // Add any custom meta tags
239
+ meta: typeof PageComponent.getMeta === 'function'
240
+ ? PageComponent.getMeta(initialProps)
241
+ : {},
242
+ // Add custom styles
243
+ styles: ['/styles.css'],
244
+ // Add initial data for client-side hydration
245
+ initialData: initialProps,
246
+ // Add component information for hydration
247
+ componentName: componentName
248
+ });
249
+ return { html: fullHtml, statusCode: 200 };
250
+ }
251
+ catch (error) {
252
+ console.error('Error rendering page:', error);
253
+ return {
254
+ html: templates.generateErrorPage(500, 'Error rendering page', error instanceof Error ? error : new Error('Unknown error')),
255
+ statusCode: 500
256
+ };
257
+ }
258
+ }
259
+ catch (error) {
260
+ console.error('Error finding page:', error);
261
+ return {
262
+ html: templates.generateErrorPage(500, 'Server error', error instanceof Error ? error : new Error('Unknown error')),
263
+ statusCode: 500
264
+ };
265
+ }
266
+ }
267
+ getExpressApp() {
268
+ return this.app;
269
+ }
270
+ getDatabase() {
271
+ return this.db;
272
+ }
273
+ getAuth() {
274
+ return this.auth;
275
+ }
276
+ start() {
277
+ return new Promise((resolve) => {
278
+ this.server = this.app.listen(this.config.port, () => {
279
+ console.log(`Server running at http://localhost:${this.config.port}`);
280
+ resolve();
281
+ });
282
+ });
283
+ }
284
+ stop() {
285
+ return new Promise((resolve, reject) => {
286
+ if (!this.server) {
287
+ return resolve();
288
+ }
289
+ this.server.close((err) => {
290
+ if (err)
291
+ return reject(err);
292
+ this.server = null;
293
+ resolve();
294
+ });
295
+ });
296
+ }
297
+ restart() {
298
+ return this.stop().then(() => this.start());
299
+ }
300
+ enableSSR(options = {}) {
301
+ if (!fs.existsSync(path.resolve(process.cwd(), this.config.pagesDir))) {
302
+ fs.mkdirSync(path.resolve(process.cwd(), this.config.pagesDir), { recursive: true });
303
+ }
304
+ // Set up client-side JS for hydration if needed
305
+ if (options.hydratable) {
306
+ const staticDir = path.resolve(process.cwd(), this.config.staticDir);
307
+ if (!fs.existsSync(staticDir)) {
308
+ fs.mkdirSync(staticDir, { recursive: true });
309
+ }
310
+ // Generate or copy client hydration script
311
+ // This is a simplified example - would need more implementation
312
+ const clientJsPath = path.join(staticDir, 'client.js');
313
+ if (!fs.existsSync(clientJsPath)) {
314
+ const clientJsContent = `
315
+ // Auto-generated hydration script
316
+ import { hydrate } from 'frontend-hamroun';
317
+
318
+ // Find SSR content and hydrate it
319
+ document.addEventListener('DOMContentLoaded', () => {
320
+ const ssrRoots = document.querySelectorAll('[data-ssr-root]');
321
+ ssrRoots.forEach(root => {
322
+ const componentPath = root.getAttribute('data-component');
323
+ if (componentPath) {
324
+ import(componentPath).then(module => {
325
+ hydrate(module.default, root);
326
+ });
327
+ }
328
+ });
329
+ });
330
+ `;
331
+ fs.writeFileSync(clientJsPath, clientJsContent);
332
+ }
333
+ }
334
+ }
335
+ registerPlugin(plugin) {
336
+ plugin(this);
337
+ }
338
+ addShutdownHandler() {
339
+ // Handle graceful shutdown
340
+ const gracefulShutdown = async () => {
341
+ console.log('Received shutdown signal, closing server...');
342
+ try {
343
+ await this.stop();
344
+ if (this.db) {
345
+ await this.db.disconnect();
346
+ }
347
+ console.log('Server shut down gracefully');
348
+ process.exit(0);
349
+ }
350
+ catch (error) {
351
+ console.error('Error during shutdown:', error);
352
+ process.exit(1);
353
+ }
354
+ };
355
+ // Listen for termination signals
356
+ process.on('SIGTERM', gracefulShutdown);
357
+ process.on('SIGINT', gracefulShutdown);
358
+ }
359
+ }
360
+ // Add server utility functions
361
+ /**
362
+ * Creates and configures a new server instance
363
+ */
364
+ export function createServer(config = {}) {
365
+ return new Server(config);
366
+ }
367
+ /**
368
+ * Creates a new server with sensible defaults for development
369
+ */
370
+ export function createDevServer(options = {}) {
371
+ return new Server({
372
+ port: options.port || 3000,
373
+ enableCors: options.enableCors !== false,
374
+ apiDir: './src/api',
375
+ pagesDir: './src/pages',
376
+ staticDir: './public'
377
+ });
378
+ }
379
+ /**
380
+ * Creates a production-ready server with optimized settings
381
+ */
382
+ export function createProductionServer(config) {
383
+ const server = new Server({
384
+ ...config,
385
+ // Fix the PORT parsing
386
+ port: config.port || (process.env.PORT ? parseInt(process.env.PORT) : 8080)
387
+ });
388
+ // Add shutdown handler for production environments
389
+ server.addShutdownHandler();
390
+ return server;
391
+ }
392
+ // Export additional utility functions
393
+ export function getRequestIp(req) {
394
+ return req.ip ||
395
+ req.headers['x-forwarded-for']?.split(',')[0].trim() ||
396
+ req.socket.remoteAddress ||
397
+ '';
398
+ }
399
+ export function parseCookies(req) {
400
+ const cookies = {};
401
+ const cookieHeader = req.headers.cookie;
402
+ if (cookieHeader) {
403
+ cookieHeader.split(';').forEach(cookie => {
404
+ const [name, value] = cookie.split('=').map(c => c.trim());
405
+ cookies[name] = value;
406
+ });
407
+ }
408
+ return cookies;
409
+ }
410
+ // Fix the renderComponent function
411
+ export const renderComponent = async (Component, props = {}) => {
412
+ try {
413
+ // Create HTML string from component
414
+ const html = renderToString(Component(props));
415
+ return {
416
+ html,
417
+ success: true
418
+ };
419
+ }
420
+ catch (error) {
421
+ console.error('Error rendering component:', error);
422
+ return {
423
+ html: `<div class="error">Error rendering component</div>`,
424
+ success: false,
425
+ error
426
+ };
427
+ }
428
+ };
429
+ // Export WASM utilities for server-side usage
430
+ export { initNodeWasm, loadGoWasmFromFile } from './wasm.js';
431
+ // Import and export server utilities
432
+ export * from './utils.js';
433
+ export * from './templates.js';
434
+ // Export the Database and AuthService classes
435
+ export { Database } from './database.js';
436
+ export { AuthService } from './auth.js';
437
+ export { ApiRouter } from './api-router.js';
438
+ export { requestLogger, errorHandler, notFoundHandler, rateLimit } from './middleware.js';
439
+ // Export renderToString for convenient SSR
440
+ export { renderToString };
441
+ // Ensure the default export includes all required functions
442
+ export default {
443
+ Server,
444
+ createServer,
445
+ createDevServer,
446
+ createProductionServer,
447
+ rateLimit,
448
+ requestLogger,
449
+ errorHandler,
450
+ notFoundHandler,
451
+ loadGoWasmFromFile,
452
+ // Template utilities
453
+ templates,
454
+ // Server utilities
455
+ utils,
456
+ // Additional exports
457
+ renderComponent,
458
+ renderToString,
459
+ getRequestIp,
460
+ parseCookies,
461
+ Database,
462
+ AuthService,
463
+ ApiRouter
464
+ };
465
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAqD,MAAM,SAAS,CAAC;AAC5E,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE1F,+BAA+B;AAC/B,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAgB,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAE7D,+DAA+D;AAC/D,SAAS,gBAAgB,CAAC,QAAgB,EAAE,QAAgB;IAC1D,IAAI,CAAC;QACH,yCAAyC;QACzC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACvD,mBAAmB;QACnB,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACzD,2CAA2C;QAC3C,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACrD,gCAAgC;QAChC,OAAO,UAAU,SAAS,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAmBD,MAAM,OAAO,MAAM;IAOjB,YAAY,SAAuB,EAAE;QAL7B,WAAM,GAAuB,IAAI,CAAC;QAElC,OAAE,GAAoB,IAAI,CAAC;QAC3B,SAAI,GAAuB,IAAI,CAAC;QAGtC,IAAI,CAAC,MAAM,GAAG;YACZ,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,OAAO;YACf,QAAQ,EAAE,SAAS;YACnB,SAAS,EAAE,UAAU;YACrB,UAAU,EAAE,IAAI;YAChB,GAAG,MAAM;SACV,CAAC;QAEF,IAAI,CAAC,GAAG,GAAG,OAAO,EAAE,CAAC;QAErB,mBAAmB;QACnB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAErD,aAAa;QACb,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAC3B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;QAC9C,CAAC;QAED,+BAA+B;QAC/B,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACnB,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzC,CAAC;QAED,2BAA2B;QAC3B,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACrB,kDAAkD;YAClD,IAAI,CAAC,IAAI,GAAG,IAAI,WAAW,CAAC;gBAC1B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM;gBAC/B,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS;aACtC,CAAC,CAAC;YACH,yBAAyB;YACzB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QACvC,CAAC;QAED,eAAe;QACf,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,SAAU,CAAC,CAAC,EAAE,CAAC;YACvE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,SAAU,CAAC,CAAC,CAAC,CAAC;QACpF,CAAC;QAED,mBAAmB;QACnB,IAAI,CAAC,cAAc,EAAE,CAAC;QAEtB,8BAA8B;QAC9B,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAEO,cAAc;QACpB,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,MAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAChE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QAEtD,8BAA8B;QAC9B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YACvC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,eAAe;QACrB,6CAA6C;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,MAAO,CAAC,CAAC;QAChE,MAAM,IAAI,GAAG,EAAE,SAAS,EAAE,EAAW,EAAE,CAAC;QAExC,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACpD,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,gBAAgB,CAAC,OAAe,EAAE,WAAmB,EAAE,SAAgB;QAC7E,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAEjE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAEhD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,WAAW,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;YAC7E,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpE,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;gBAC7D,SAAS,CAAC,IAAI,CAAC;oBACb,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC;oBAC5C,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;iBACzC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,QAAgB,EAAE,WAAmB;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEjE,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,OAAO,WAAW,IAAI,GAAG,CAAC;QAC5B,CAAC;QAED,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAChD,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,GAAG,WAAW,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,CAAC;QAED,OAAO,GAAG,WAAW,IAAI,QAAQ,EAAE,CAAC;IACtC,CAAC;IAEO,gBAAgB,CAAC,QAAgB;QACvC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAClD,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;YACrE,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAC7B,IAAI,MAAM,CAAC,4BAA4B,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;gBACrE,IAAI,MAAM,CAAC,gBAAgB,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CACxD,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,QAAS,CAAC,CAAC,EAAE,CAAC;YACvE,OAAO;QACT,CAAC;QAED,gCAAgC;QAChC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YACnC,IAAI,CAAC;gBACH,+BAA+B;gBAC/B,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC7D,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;gBAC9C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACvC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,SAAiB;QACxC,IAAI,CAAC;YACH,iCAAiC;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/F,IAAI,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1C,OAAO;oBACL,IAAI,EAAE,SAAS,CAAC,iBAAiB,CAAC,GAAG,EAAE,2BAA2B,CAAC;oBACnE,UAAU,EAAE,GAAG;iBAChB,CAAC;YACJ,CAAC;YAED,qBAAqB;YACrB,IAAI,cAAc,GAAG,SAAS,CAAC;YAC/B,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpC,cAAc,GAAG,GAAG,GAAG,cAAc,CAAC;YACxC,CAAC;YAED,gCAAgC;YAChC,IAAI,cAAc,KAAK,GAAG,EAAE,CAAC;gBAC3B,cAAc,GAAG,QAAQ,CAAC;YAC5B,CAAC;YAED,mCAAmC;YACnC,IAAI,QAAQ,GAAG,EAAE,CAAC;YAClB,MAAM,aAAa,GAAG;gBACpB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,cAAc,KAAK,CAAC;gBAC3C,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,cAAc,KAAK,CAAC;gBAC3C,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,cAAc,MAAM,CAAC;gBAC5C,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,cAAc,MAAM,CAAC;gBAC5C,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,cAAc,WAAW,CAAC;gBACjD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,cAAc,WAAW,CAAC;gBACjD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,cAAc,YAAY,CAAC;gBAClD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,cAAc,YAAY,CAAC;aACnD,CAAC;YAEF,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;gBAC9B,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrB,QAAQ,GAAG,CAAC,CAAC;oBACb,MAAM;gBACR,CAAC;YACH,CAAC;YAED,+BAA+B;YAC/B,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO;oBACL,IAAI,EAAE,SAAS,CAAC,iBAAiB,CAAC,GAAG,EAAE,mBAAmB,cAAc,EAAE,CAAC;oBAC3E,UAAU,EAAE,GAAG;iBAChB,CAAC;YACJ,CAAC;YAED,uCAAuC;YACvC,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC1C,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;oBACvC,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,EAAE,CAAC,CAAC;gBAC5D,CAAC;gBAED,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,CAAC;gBACzC,MAAM,YAAY,GAAG;oBACnB,iCAAiC;oBACjC,IAAI,EAAE,cAAc;oBACpB,KAAK,EAAE,EAAE,EAAE,2BAA2B;oBACtC,GAAG,EAAE,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;iBAC9C,CAAC;gBAEF,+BAA+B;gBAC/B,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,eAAe,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;gBAEpF,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,OAAO;wBACL,IAAI,EAAE,SAAS,CAAC,iBAAiB,CAAC,GAAG,EAAE,uBAAuB,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;wBAC5H,UAAU,EAAE,GAAG;qBAChB,CAAC;gBACJ,CAAC;gBAED,kCAAkC;gBAClC,IAAI,SAAS,GAAG,QAAQ,CAAC;gBACzB,IAAI,CAAC;oBACH,kEAAkE;oBAClE,IAAI,OAAO,aAAa,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;wBACjD,SAAS,GAAG,aAAa,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;oBACnD,CAAC;yBAAM,IAAI,aAAa,CAAC,KAAK,EAAE,CAAC;wBAC/B,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC;oBAClC,CAAC;gBACH,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,sBAAsB;gBACxB,CAAC;gBAED,yCAAyC;gBACzC,MAAM,aAAa,GAAG,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAE3D,gDAAgD;gBAChD,MAAM,QAAQ,GAAG,SAAS,CAAC,gBAAgB,CAAC,IAAI,EAAE;oBAChD,KAAK,EAAE,SAAS;oBAChB,8CAA8C;oBAC9C,WAAW,EAAE,OAAO,aAAa,CAAC,cAAc,KAAK,UAAU;wBAC7D,CAAC,CAAC,aAAa,CAAC,cAAc,CAAC,YAAY,CAAC;wBAC5C,CAAC,CAAC,CAAC,aAAa,CAAC,WAAW,IAAI,EAAE,CAAC;oBACrC,wCAAwC;oBACxC,OAAO,EAAE,CAAC,YAAY,CAAC;oBACvB,2BAA2B;oBAC3B,IAAI,EAAE,OAAO,aAAa,CAAC,OAAO,KAAK,UAAU;wBAC/C,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC;wBACrC,CAAC,CAAC,EAAE;oBACN,oBAAoB;oBACpB,MAAM,EAAE,CAAC,aAAa,CAAC;oBACvB,6CAA6C;oBAC7C,WAAW,EAAE,YAAY;oBACzB,0CAA0C;oBAC1C,aAAa,EAAE,aAAa;iBAC7B,CAAC,CAAC;gBAEH,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;YAE7C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;gBAC9C,OAAO;oBACL,IAAI,EAAE,SAAS,CAAC,iBAAiB,CAAC,GAAG,EAAE,sBAAsB,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;oBAC3H,UAAU,EAAE,GAAG;iBAChB,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;YAC5C,OAAO;gBACL,IAAI,EAAE,SAAS,CAAC,iBAAiB,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;gBACnH,UAAU,EAAE,GAAG;aAChB,CAAC;QACJ,CAAC;IACH,CAAC;IAEM,aAAa;QAClB,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;IAEM,WAAW;QAChB,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAEM,OAAO;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAEM,KAAK;QACV,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;gBACnD,OAAO,CAAC,GAAG,CAAC,sCAAsC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBACtE,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,IAAI;QACT,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,OAAO,OAAO,EAAE,CAAC;YACnB,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACxB,IAAI,GAAG;oBAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC5B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gBACnB,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,OAAO;QACZ,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC9C,CAAC;IAEM,SAAS,CAAC,UAAoC,EAAE;QACrD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,QAAS,CAAC,CAAC,EAAE,CAAC;YACvE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,QAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxF,CAAC;QAED,gDAAgD;QAChD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,SAAU,CAAC,CAAC;YACtE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,CAAC;YAED,2CAA2C;YAC3C,gEAAgE;YAChE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBACjC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;SAgBvB,CAAC;gBACF,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;IACH,CAAC;IAEM,cAAc,CAAC,MAAgC;QACpD,MAAM,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAEM,kBAAkB;QACvB,2BAA2B;QAC3B,MAAM,gBAAgB,GAAG,KAAK,IAAI,EAAE;YAClC,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;YAC3D,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;gBAClB,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;oBACZ,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;gBAC7B,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;gBAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;gBAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC,CAAC;QAEF,iCAAiC;QACjC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;QACxC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IACzC,CAAC;CACF;AAED,+BAA+B;AAE/B;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,SAAuB,EAAE;IACpD,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,UAG5B,EAAE;IACJ,OAAO,IAAI,MAAM,CAAC;QAChB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI;QAC1B,UAAU,EAAE,OAAO,CAAC,UAAU,KAAK,KAAK;QACxC,MAAM,EAAE,WAAW;QACnB,QAAQ,EAAE,aAAa;QACvB,SAAS,EAAE,UAAU;KACtB,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAoB;IACzD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;QACxB,GAAG,MAAM;QACT,uBAAuB;QACvB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;KAC5E,CAAC,CAAC;IAEH,mDAAmD;IACnD,MAAM,CAAC,kBAAkB,EAAE,CAAC;IAE5B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,OAAO,GAAG,CAAC,EAAE;QACV,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAY,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;QAChE,GAAG,CAAC,MAAM,CAAC,aAAa;QACxB,EAAE,CAAC;AACP,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;IAExC,IAAI,YAAY,EAAE,CAAC;QACjB,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACvC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,mCAAmC;AACnC,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,SAAc,EAAE,QAAa,EAAE,EAAE,EAAE;IACvE,IAAI,CAAC;QACH,oCAAoC;QACpC,MAAM,IAAI,GAAG,cAAc,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9C,OAAO;YACL,IAAI;YACJ,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;QACnD,OAAO;YACL,IAAI,EAAE,oDAAoD;YAC1D,OAAO,EAAE,KAAK;YACd,KAAK;SACN,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAEF,8CAA8C;AAC9C,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAE7D,qCAAqC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAE/B,8CAA8C;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACL,aAAa,EACb,YAAY,EACZ,eAAe,EACf,SAAS,EACV,MAAM,iBAAiB,CAAC;AAEzB,2CAA2C;AAC3C,OAAO,EAAE,cAAc,EAAE,CAAC;AAE1B,4DAA4D;AAC5D,eAAe;IACb,MAAM;IACN,YAAY;IACZ,eAAe;IACf,sBAAsB;IACtB,SAAS;IACT,aAAa;IACb,YAAY;IACZ,eAAe;IACf,kBAAkB;IAClB,qBAAqB;IACrB,SAAS;IACT,mBAAmB;IACnB,KAAK;IACL,qBAAqB;IACrB,eAAe;IACf,cAAc;IACd,YAAY;IACZ,YAAY;IACZ,QAAQ;IACR,WAAW;IACX,SAAS;CACV,CAAC"}
@@ -0,0 +1,12 @@
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>>;
12
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/server/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE1D,MAAM,WAAW,kBAAkB;IACjC,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzE;AAGD,eAAO,MAAM,aAAa,EAAE,kBAG3B,CAAC;AAEF,eAAO,MAAM,YAAY,GACvB,KAAK,KAAK,EACV,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,MAAM,YAAY,SASnB,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,KAAK,OAAO,EAAE,KAAK,QAAQ,SAM1D,CAAC;AAGF,wBAAgB,SAAS,CAAC,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,IAG1D,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,+CAwBxD"}
@@ -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,10 @@
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;
10
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"AAIA,cAAM,MAAM;IACV,OAAO,CAAC,MAAM,CAAwB;gBAE1B,MAAM,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;YAI3B,UAAU;IAyExB,OAAO,CAAC,kBAAkB;CAS3B;AAED,eAAe,MAAM,CAAC"}
@@ -0,0 +1,81 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { renderComponent } from '../renderComponent.js'; // Fixed import path with .js extension
4
+ class Server {
5
+ constructor(config) {
6
+ this.config = config;
7
+ }
8
+ async renderPage(urlPath) {
9
+ try {
10
+ // Try to find the page component
11
+ const pagesDir = path.resolve(process.cwd(), this.config.pagesDir);
12
+ // Check various file patterns
13
+ let pagePath = '';
14
+ const possiblePagePaths = [
15
+ `${pagesDir}${path}.jsx`,
16
+ `${pagesDir}${path}.tsx`,
17
+ `${pagesDir}${path}/index.jsx`,
18
+ `${pagesDir}${path}/index.tsx`,
19
+ // For dynamic routes
20
+ ...fs.readdirSync(pagesDir, { recursive: true })
21
+ .filter((file) => typeof file === 'string')
22
+ .filter((file) => file.endsWith('.jsx') || file.endsWith('.tsx'))
23
+ .map((file) => path.join(pagesDir, file))
24
+ .filter((file) => {
25
+ const routePattern = file
26
+ .replace(pagesDir, '')
27
+ .replace(/\.[jt]sx$/, '')
28
+ .replace(/\/index$/, '/')
29
+ .replace(/\[([^\]]+)\]/g, ':$1');
30
+ // Create Express-like path matcher
31
+ return this.pathMatchesPattern(urlPath, routePattern);
32
+ })
33
+ ];
34
+ for (const possiblePath of possiblePagePaths) {
35
+ if (fs.existsSync(possiblePath)) {
36
+ pagePath = possiblePath;
37
+ break;
38
+ }
39
+ }
40
+ if (!pagePath) {
41
+ return {
42
+ html: `<!DOCTYPE html><html><body><h1>404 - Page Not Found</h1></body></html>`,
43
+ statusCode: 404
44
+ };
45
+ }
46
+ // Import and render the page component
47
+ const { default: PageComponent } = await import(pagePath);
48
+ if (!PageComponent || typeof PageComponent !== 'function') {
49
+ throw new Error(`Invalid page component: ${pagePath}`);
50
+ }
51
+ const { html } = await renderComponent(PageComponent);
52
+ // Add DOCTYPE and wrap in html/body if not present
53
+ let finalHtml = html;
54
+ if (!finalHtml.includes('<!DOCTYPE')) {
55
+ finalHtml = `<!DOCTYPE html><html><head>
56
+ <meta charset="UTF-8">
57
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
58
+ <script type="module" src="/client.js"></script>
59
+ </head><body>${finalHtml}</body></html>`;
60
+ }
61
+ return { html: finalHtml, statusCode: 200 };
62
+ }
63
+ catch (error) {
64
+ console.error('Error rendering page:', error);
65
+ return {
66
+ html: `<!DOCTYPE html><html><body><h1>500 - Server Error</h1><pre>${error}</pre></body></html>`,
67
+ statusCode: 500
68
+ };
69
+ }
70
+ }
71
+ pathMatchesPattern(path, pattern) {
72
+ // Convert Express-like pattern to regex
73
+ const regexPattern = pattern
74
+ .replace(/\//g, '\\/') // Escape slashes
75
+ .replace(/:([^\/]+)/g, '([^\\/]+)'); // Convert :param to regex group
76
+ const regex = new RegExp(`^${regexPattern}$`);
77
+ return regex.test(path);
78
+ }
79
+ }
80
+ export default Server;
81
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"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"}