frontend-hamroun 1.2.75 → 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/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/jsx-runtime/package.json +16 -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/router/package.json +16 -0
- package/dist/server/package.json +17 -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.js +1 -1
- 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.js +2 -2
- package/dist/server/src/index.js +19 -11
- 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.js +1 -1
- package/dist/server/src/renderer.js +3 -3
- 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/index.d.ts +75 -2
- package/dist/server/src/server/index.js +224 -8
- package/dist/server/src/server/index.js.map +1 -1
- package/dist/server/src/server/server.js +1 -1
- 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/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-renderer.js +1 -1
- 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/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/tsconfig.server.tsbuildinfo +1 -1
- package/dist/server-renderer/package.json +16 -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/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/example.go +99 -86
- package/templates/go-wasm-app/babel.config.js +8 -2
- 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 -12
- package/templates/go-wasm-app/server.js +59 -510
- 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/server/wasm.d.ts +0 -7
- package/dist/wasm.d.ts +0 -37
@@ -0,0 +1,204 @@
|
|
1
|
+
/**
|
2
|
+
* HTML template generators for server-side rendering
|
3
|
+
*/
|
4
|
+
/**
|
5
|
+
* Generate a complete HTML document
|
6
|
+
*/
|
7
|
+
export function generateDocument(content, options = {}) {
|
8
|
+
const { title = 'Baraqex App', description = '', lang = 'en', charset = 'UTF-8', viewport = 'width=device-width, initial-scale=1.0', scripts = [], styles = [], meta = {}, bodyClasses = '', htmlAttrs = {}, bodyAttrs = {} } = options;
|
9
|
+
// Generate HTML attributes
|
10
|
+
const htmlAttributes = Object.entries(htmlAttrs)
|
11
|
+
.map(([key, value]) => `${key}="${escapeHtml(value)}"`)
|
12
|
+
.join(' ');
|
13
|
+
// Generate body attributes
|
14
|
+
const bodyAttributes = Object.entries(bodyAttrs)
|
15
|
+
.map(([key, value]) => `${key}="${escapeHtml(value)}"`)
|
16
|
+
.join(' ');
|
17
|
+
// Generate meta tags
|
18
|
+
const metaTags = [
|
19
|
+
`<meta charset="${charset}">`,
|
20
|
+
`<meta name="viewport" content="${viewport}">`,
|
21
|
+
description ? `<meta name="description" content="${escapeHtml(description)}">` : ''
|
22
|
+
];
|
23
|
+
// Add custom meta tags
|
24
|
+
Object.entries(meta).forEach(([name, content]) => {
|
25
|
+
metaTags.push(`<meta name="${escapeHtml(name)}" content="${escapeHtml(content)}">`);
|
26
|
+
});
|
27
|
+
// Generate script tags
|
28
|
+
const scriptTags = scripts.map(src => {
|
29
|
+
if (src.startsWith('<script')) {
|
30
|
+
return src; // Allow inline scripts
|
31
|
+
}
|
32
|
+
return `<script src="${escapeHtml(src)}" defer></script>`;
|
33
|
+
});
|
34
|
+
// Generate style tags
|
35
|
+
const styleTags = styles.map(href => {
|
36
|
+
if (href.startsWith('<style')) {
|
37
|
+
return href; // Allow inline styles
|
38
|
+
}
|
39
|
+
return `<link rel="stylesheet" href="${escapeHtml(href)}">`;
|
40
|
+
});
|
41
|
+
// Create the complete HTML document
|
42
|
+
return `<!DOCTYPE html>
|
43
|
+
<html lang="${lang}" ${htmlAttributes}>
|
44
|
+
<head>
|
45
|
+
${metaTags.filter(Boolean).join('\n ')}
|
46
|
+
<title>${escapeHtml(title)}</title>
|
47
|
+
${styleTags.join('\n ')}
|
48
|
+
${scriptTags.join('\n ')}
|
49
|
+
</head>
|
50
|
+
<body class="${bodyClasses}" ${bodyAttributes}>
|
51
|
+
<div id="app" data-ssr-root>${content}</div>
|
52
|
+
</body>
|
53
|
+
</html>`;
|
54
|
+
}
|
55
|
+
/**
|
56
|
+
* Generate an error page
|
57
|
+
*/
|
58
|
+
export function generateErrorPage(statusCode, message, error) {
|
59
|
+
const errorMessages = {
|
60
|
+
400: 'Bad Request',
|
61
|
+
401: 'Unauthorized',
|
62
|
+
403: 'Forbidden',
|
63
|
+
404: 'Not Found',
|
64
|
+
500: 'Internal Server Error'
|
65
|
+
};
|
66
|
+
const title = `${statusCode} - ${errorMessages[statusCode] || 'Error'}`;
|
67
|
+
// Generate error details (only in development)
|
68
|
+
const isDev = process.env.NODE_ENV !== 'production';
|
69
|
+
const errorDetails = isDev && error ? `
|
70
|
+
<div class="error-details">
|
71
|
+
<pre>${escapeHtml(error.stack || error.message)}</pre>
|
72
|
+
</div>
|
73
|
+
` : '';
|
74
|
+
// Create error content
|
75
|
+
const content = `
|
76
|
+
<div class="error-container">
|
77
|
+
<h1>${statusCode}</h1>
|
78
|
+
<h2>${escapeHtml(errorMessages[statusCode] || 'Error')}</h2>
|
79
|
+
<p>${escapeHtml(message)}</p>
|
80
|
+
${errorDetails}
|
81
|
+
<a href="/" class="home-link">Back to Home</a>
|
82
|
+
</div>
|
83
|
+
`;
|
84
|
+
// Add error page styling
|
85
|
+
const styles = [`<style>
|
86
|
+
body {
|
87
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
|
88
|
+
display: flex;
|
89
|
+
justify-content: center;
|
90
|
+
align-items: center;
|
91
|
+
min-height: 100vh;
|
92
|
+
margin: 0;
|
93
|
+
background-color: #f7f7f7;
|
94
|
+
color: #333;
|
95
|
+
}
|
96
|
+
.error-container {
|
97
|
+
text-align: center;
|
98
|
+
padding: 2rem;
|
99
|
+
border-radius: 8px;
|
100
|
+
background-color: white;
|
101
|
+
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
102
|
+
max-width: 600px;
|
103
|
+
width: 100%;
|
104
|
+
}
|
105
|
+
h1 {
|
106
|
+
font-size: 6rem;
|
107
|
+
margin: 0;
|
108
|
+
color: #e74c3c;
|
109
|
+
}
|
110
|
+
h2 {
|
111
|
+
margin-top: 0;
|
112
|
+
margin-bottom: 1rem;
|
113
|
+
color: #333;
|
114
|
+
}
|
115
|
+
.error-details {
|
116
|
+
text-align: left;
|
117
|
+
margin: 2rem 0;
|
118
|
+
padding: 1rem;
|
119
|
+
background-color: #f8f8f8;
|
120
|
+
border-radius: 4px;
|
121
|
+
overflow: auto;
|
122
|
+
}
|
123
|
+
pre {
|
124
|
+
margin: 0;
|
125
|
+
font-family: monospace;
|
126
|
+
font-size: 0.85rem;
|
127
|
+
white-space: pre-wrap;
|
128
|
+
}
|
129
|
+
.home-link {
|
130
|
+
display: inline-block;
|
131
|
+
margin-top: 1.5rem;
|
132
|
+
padding: 0.75rem 1.5rem;
|
133
|
+
background-color: #3498db;
|
134
|
+
color: white;
|
135
|
+
text-decoration: none;
|
136
|
+
border-radius: 4px;
|
137
|
+
transition: background-color 0.2s;
|
138
|
+
}
|
139
|
+
.home-link:hover {
|
140
|
+
background-color: #2980b9;
|
141
|
+
}
|
142
|
+
</style>`];
|
143
|
+
return generateDocument(content, {
|
144
|
+
title,
|
145
|
+
description: `Error ${statusCode}: ${errorMessages[statusCode] || 'Error'}`,
|
146
|
+
bodyClasses: 'error-page',
|
147
|
+
styles
|
148
|
+
});
|
149
|
+
}
|
150
|
+
/**
|
151
|
+
* Generate a loading page
|
152
|
+
*/
|
153
|
+
export function generateLoadingPage(message = 'Loading...') {
|
154
|
+
const content = `
|
155
|
+
<div class="loading-container">
|
156
|
+
<div class="spinner"></div>
|
157
|
+
<p>${escapeHtml(message)}</p>
|
158
|
+
</div>
|
159
|
+
`;
|
160
|
+
const styles = [`<style>
|
161
|
+
body {
|
162
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
|
163
|
+
display: flex;
|
164
|
+
justify-content: center;
|
165
|
+
align-items: center;
|
166
|
+
min-height: 100vh;
|
167
|
+
margin: 0;
|
168
|
+
background-color: #f7f7f7;
|
169
|
+
color: #333;
|
170
|
+
}
|
171
|
+
.loading-container {
|
172
|
+
text-align: center;
|
173
|
+
}
|
174
|
+
.spinner {
|
175
|
+
width: 50px;
|
176
|
+
height: 50px;
|
177
|
+
border: 5px solid rgba(0, 0, 0, 0.1);
|
178
|
+
border-radius: 50%;
|
179
|
+
border-top-color: #3498db;
|
180
|
+
animation: spin 1s ease-in-out infinite;
|
181
|
+
margin: 0 auto 20px;
|
182
|
+
}
|
183
|
+
@keyframes spin {
|
184
|
+
to { transform: rotate(360deg); }
|
185
|
+
}
|
186
|
+
</style>`];
|
187
|
+
return generateDocument(content, {
|
188
|
+
title: 'Loading',
|
189
|
+
bodyClasses: 'loading-page',
|
190
|
+
styles
|
191
|
+
});
|
192
|
+
}
|
193
|
+
/**
|
194
|
+
* Escape HTML special characters
|
195
|
+
*/
|
196
|
+
function escapeHtml(text) {
|
197
|
+
return text
|
198
|
+
.replace(/&/g, '&')
|
199
|
+
.replace(/</g, '<')
|
200
|
+
.replace(/>/g, '>')
|
201
|
+
.replace(/"/g, '"')
|
202
|
+
.replace(/'/g, ''');
|
203
|
+
}
|
204
|
+
//# sourceMappingURL=templates.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../../src/server/templates.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,70 @@
|
|
1
|
+
import { Request, Response } from 'express';
|
2
|
+
/**
|
3
|
+
* Utility functions for server-side operations
|
4
|
+
*/
|
5
|
+
/**
|
6
|
+
* Safely parse JSON with error handling
|
7
|
+
*/
|
8
|
+
export declare function safeJsonParse<T>(json: string, fallback: T): T;
|
9
|
+
/**
|
10
|
+
* Generate a secure random token
|
11
|
+
*/
|
12
|
+
export declare function generateToken(length?: number): string;
|
13
|
+
/**
|
14
|
+
* Hash a string using SHA-256
|
15
|
+
*/
|
16
|
+
export declare function hashString(input: string, salt?: string): string;
|
17
|
+
/**
|
18
|
+
* Get pagination parameters from request
|
19
|
+
*/
|
20
|
+
export declare function getPagination(req: Request): {
|
21
|
+
page: number;
|
22
|
+
limit: number;
|
23
|
+
skip: number;
|
24
|
+
};
|
25
|
+
/**
|
26
|
+
* Standard success response format
|
27
|
+
*/
|
28
|
+
export declare function sendSuccess<T>(res: Response, data: T, message?: string): Response;
|
29
|
+
/**
|
30
|
+
* Standard error response format
|
31
|
+
*/
|
32
|
+
export declare function sendError(res: Response, message?: string, statusCode?: number, errors?: any): Response;
|
33
|
+
/**
|
34
|
+
* Validate required fields in request body
|
35
|
+
*/
|
36
|
+
export declare function validateFields(req: Request, requiredFields: string[]): {
|
37
|
+
valid: boolean;
|
38
|
+
missing: string[];
|
39
|
+
};
|
40
|
+
/**
|
41
|
+
* Handle file upload validation
|
42
|
+
*/
|
43
|
+
export declare function validateFileUpload(file: any, // Use any to avoid the Express.Multer dependency
|
44
|
+
options?: {
|
45
|
+
maxSize?: number;
|
46
|
+
allowedTypes?: string[];
|
47
|
+
}): {
|
48
|
+
valid: boolean;
|
49
|
+
error?: string;
|
50
|
+
};
|
51
|
+
/**
|
52
|
+
* Get server environment information
|
53
|
+
*/
|
54
|
+
export declare function getEnvironmentInfo(): Record<string, any>;
|
55
|
+
/**
|
56
|
+
* Check if a directory is empty
|
57
|
+
*/
|
58
|
+
export declare function isDirectoryEmpty(dirPath: string): Promise<boolean>;
|
59
|
+
/**
|
60
|
+
* Create directory if it doesn't exist
|
61
|
+
*/
|
62
|
+
export declare function ensureDirectory(dirPath: string): Promise<void>;
|
63
|
+
/**
|
64
|
+
* Write JSON to file
|
65
|
+
*/
|
66
|
+
export declare function writeJsonFile(filePath: string, data: any): Promise<void>;
|
67
|
+
/**
|
68
|
+
* Read JSON from file
|
69
|
+
*/
|
70
|
+
export declare function readJsonFile<T>(filePath: string, defaultValue: T): Promise<T>;
|
@@ -0,0 +1,156 @@
|
|
1
|
+
import crypto from 'crypto';
|
2
|
+
import fs from 'fs/promises';
|
3
|
+
import path from 'path';
|
4
|
+
/**
|
5
|
+
* Utility functions for server-side operations
|
6
|
+
*/
|
7
|
+
/**
|
8
|
+
* Safely parse JSON with error handling
|
9
|
+
*/
|
10
|
+
export function safeJsonParse(json, fallback) {
|
11
|
+
try {
|
12
|
+
return JSON.parse(json);
|
13
|
+
}
|
14
|
+
catch (error) {
|
15
|
+
return fallback;
|
16
|
+
}
|
17
|
+
}
|
18
|
+
/**
|
19
|
+
* Generate a secure random token
|
20
|
+
*/
|
21
|
+
export function generateToken(length = 32) {
|
22
|
+
return crypto.randomBytes(length).toString('hex');
|
23
|
+
}
|
24
|
+
/**
|
25
|
+
* Hash a string using SHA-256
|
26
|
+
*/
|
27
|
+
export function hashString(input, salt = '') {
|
28
|
+
return crypto.createHash('sha256').update(input + salt).digest('hex');
|
29
|
+
}
|
30
|
+
/**
|
31
|
+
* Get pagination parameters from request
|
32
|
+
*/
|
33
|
+
export function getPagination(req) {
|
34
|
+
const page = Math.max(1, parseInt(req.query.page) || 1);
|
35
|
+
const limit = Math.max(1, Math.min(100, parseInt(req.query.limit) || 20));
|
36
|
+
const skip = (page - 1) * limit;
|
37
|
+
return { page, limit, skip };
|
38
|
+
}
|
39
|
+
/**
|
40
|
+
* Standard success response format
|
41
|
+
*/
|
42
|
+
export function sendSuccess(res, data, message = 'Success') {
|
43
|
+
return res.json({
|
44
|
+
success: true,
|
45
|
+
message,
|
46
|
+
data
|
47
|
+
});
|
48
|
+
}
|
49
|
+
/**
|
50
|
+
* Standard error response format
|
51
|
+
*/
|
52
|
+
export function sendError(res, message = 'An error occurred', statusCode = 400, errors) {
|
53
|
+
return res.status(statusCode).json({
|
54
|
+
success: false,
|
55
|
+
message,
|
56
|
+
errors: errors || undefined
|
57
|
+
});
|
58
|
+
}
|
59
|
+
/**
|
60
|
+
* Validate required fields in request body
|
61
|
+
*/
|
62
|
+
export function validateFields(req, requiredFields) {
|
63
|
+
const missing = requiredFields.filter(field => {
|
64
|
+
const value = req.body[field];
|
65
|
+
return value === undefined || value === null || value === '';
|
66
|
+
});
|
67
|
+
return {
|
68
|
+
valid: missing.length === 0,
|
69
|
+
missing
|
70
|
+
};
|
71
|
+
}
|
72
|
+
/**
|
73
|
+
* Handle file upload validation
|
74
|
+
*/
|
75
|
+
export function validateFileUpload(file, // Use any to avoid the Express.Multer dependency
|
76
|
+
options = {}) {
|
77
|
+
if (!file) {
|
78
|
+
return { valid: false, error: 'No file provided' };
|
79
|
+
}
|
80
|
+
// Check file size
|
81
|
+
if (options.maxSize && file.size > options.maxSize) {
|
82
|
+
return {
|
83
|
+
valid: false,
|
84
|
+
error: `File too large. Maximum size allowed is ${options.maxSize / 1024 / 1024}MB`
|
85
|
+
};
|
86
|
+
}
|
87
|
+
// Check file type
|
88
|
+
if (options.allowedTypes && options.allowedTypes.length > 0) {
|
89
|
+
const fileType = file.mimetype;
|
90
|
+
if (!options.allowedTypes.includes(fileType)) {
|
91
|
+
return {
|
92
|
+
valid: false,
|
93
|
+
error: `Invalid file type. Allowed types: ${options.allowedTypes.join(', ')}`
|
94
|
+
};
|
95
|
+
}
|
96
|
+
}
|
97
|
+
return { valid: true };
|
98
|
+
}
|
99
|
+
/**
|
100
|
+
* Get server environment information
|
101
|
+
*/
|
102
|
+
export function getEnvironmentInfo() {
|
103
|
+
return {
|
104
|
+
nodeVersion: process.version,
|
105
|
+
platform: process.platform,
|
106
|
+
arch: process.arch,
|
107
|
+
memory: process.memoryUsage(),
|
108
|
+
uptime: process.uptime(),
|
109
|
+
env: process.env.NODE_ENV || 'development'
|
110
|
+
};
|
111
|
+
}
|
112
|
+
/**
|
113
|
+
* Check if a directory is empty
|
114
|
+
*/
|
115
|
+
export async function isDirectoryEmpty(dirPath) {
|
116
|
+
try {
|
117
|
+
const files = await fs.readdir(dirPath);
|
118
|
+
return files.length === 0;
|
119
|
+
}
|
120
|
+
catch (error) {
|
121
|
+
// Directory doesn't exist or can't be read
|
122
|
+
return true;
|
123
|
+
}
|
124
|
+
}
|
125
|
+
/**
|
126
|
+
* Create directory if it doesn't exist
|
127
|
+
*/
|
128
|
+
export async function ensureDirectory(dirPath) {
|
129
|
+
try {
|
130
|
+
await fs.access(dirPath);
|
131
|
+
}
|
132
|
+
catch (error) {
|
133
|
+
// Directory doesn't exist, create it
|
134
|
+
await fs.mkdir(dirPath, { recursive: true });
|
135
|
+
}
|
136
|
+
}
|
137
|
+
/**
|
138
|
+
* Write JSON to file
|
139
|
+
*/
|
140
|
+
export async function writeJsonFile(filePath, data) {
|
141
|
+
await ensureDirectory(path.dirname(filePath));
|
142
|
+
await fs.writeFile(filePath, JSON.stringify(data, null, 2), 'utf8');
|
143
|
+
}
|
144
|
+
/**
|
145
|
+
* Read JSON from file
|
146
|
+
*/
|
147
|
+
export async function readJsonFile(filePath, defaultValue) {
|
148
|
+
try {
|
149
|
+
const data = await fs.readFile(filePath, 'utf8');
|
150
|
+
return safeJsonParse(data, defaultValue);
|
151
|
+
}
|
152
|
+
catch (error) {
|
153
|
+
return defaultValue;
|
154
|
+
}
|
155
|
+
}
|
156
|
+
//# sourceMappingURL=utils.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/server/utils.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,41 @@
|
|
1
|
+
export interface Action {
|
2
|
+
type: string;
|
3
|
+
payload?: any;
|
4
|
+
}
|
5
|
+
export type Reducer<S> = (state: S, action: Action) => S;
|
6
|
+
export type Selector<S, R> = (state: S) => R;
|
7
|
+
export type Dispatch = (action: Action) => void;
|
8
|
+
export type Middleware<S> = (store: Store<S>) => (next: Dispatch) => (action: Action) => void;
|
9
|
+
export interface Store<S> {
|
10
|
+
getState: () => S;
|
11
|
+
dispatch: Dispatch;
|
12
|
+
subscribe: (listener: () => void) => () => void;
|
13
|
+
}
|
14
|
+
export interface AsyncAction {
|
15
|
+
(dispatch: Dispatch, getState: () => any): Promise<void> | void;
|
16
|
+
}
|
17
|
+
export declare function createStore<S>(reducer: Reducer<S>, initialState: S, middlewares?: Middleware<S>[]): Store<S>;
|
18
|
+
export interface StoreContextType {
|
19
|
+
store: Store<any>;
|
20
|
+
state: any;
|
21
|
+
}
|
22
|
+
export declare const StoreContext: import("./context.js").Context<StoreContextType>;
|
23
|
+
export declare function StoreProvider<S>({ store, children }: {
|
24
|
+
store: Store<S>;
|
25
|
+
children: any;
|
26
|
+
}): any;
|
27
|
+
export declare function useSelector<S, R>(selector: Selector<S, R>): R;
|
28
|
+
export declare function useDispatch<S>(): Dispatch;
|
29
|
+
export declare function useStore<S>(): Store<S>;
|
30
|
+
export declare const logger: Middleware<any>;
|
31
|
+
export declare const thunk: Middleware<any>;
|
32
|
+
declare const _default: {
|
33
|
+
createStore: typeof createStore;
|
34
|
+
StoreProvider: typeof StoreProvider;
|
35
|
+
useSelector: typeof useSelector;
|
36
|
+
useDispatch: typeof useDispatch;
|
37
|
+
useStore: typeof useStore;
|
38
|
+
logger: Middleware<any>;
|
39
|
+
thunk: Middleware<any>;
|
40
|
+
};
|
41
|
+
export default _default;
|
@@ -0,0 +1,99 @@
|
|
1
|
+
/**
|
2
|
+
* Global state management solution similar to Redux
|
3
|
+
*/
|
4
|
+
import { useState, useEffect } from './hooks';
|
5
|
+
import { createContext, useContext } from './context';
|
6
|
+
import { jsx } from './jsx-runtime';
|
7
|
+
export function createStore(reducer, initialState, middlewares = []) {
|
8
|
+
let state = initialState;
|
9
|
+
let listeners = [];
|
10
|
+
// Apply middlewares
|
11
|
+
let dispatch = (action) => {
|
12
|
+
state = reducer(state, action);
|
13
|
+
listeners.forEach(listener => listener());
|
14
|
+
return action;
|
15
|
+
};
|
16
|
+
// Chain middlewares
|
17
|
+
if (middlewares.length > 0) {
|
18
|
+
const middlewareAPI = {
|
19
|
+
getState: () => state,
|
20
|
+
dispatch: (action) => dispatch(action),
|
21
|
+
subscribe: (listener) => subscribe(listener)
|
22
|
+
};
|
23
|
+
const chain = middlewares.map(middleware => middleware(middlewareAPI));
|
24
|
+
dispatch = chain.reduce((a, b) => (next) => a(b(next)))(dispatch);
|
25
|
+
}
|
26
|
+
// Subscribe to store changes
|
27
|
+
function subscribe(listener) {
|
28
|
+
listeners.push(listener);
|
29
|
+
return function unsubscribe() {
|
30
|
+
listeners = listeners.filter(l => l !== listener);
|
31
|
+
};
|
32
|
+
}
|
33
|
+
// Initialize store with default state
|
34
|
+
dispatch({ type: '@@INIT' });
|
35
|
+
return {
|
36
|
+
getState: () => state,
|
37
|
+
dispatch,
|
38
|
+
subscribe
|
39
|
+
};
|
40
|
+
}
|
41
|
+
export const StoreContext = createContext({
|
42
|
+
store: {
|
43
|
+
getState: () => ({}),
|
44
|
+
dispatch: () => { },
|
45
|
+
subscribe: () => () => { }
|
46
|
+
},
|
47
|
+
state: {}
|
48
|
+
});
|
49
|
+
export function StoreProvider({ store, children }) {
|
50
|
+
const [state, setState] = useState(store.getState());
|
51
|
+
useEffect(() => {
|
52
|
+
const unsubscribe = store.subscribe(() => {
|
53
|
+
setState(store.getState());
|
54
|
+
});
|
55
|
+
return unsubscribe;
|
56
|
+
}, [store]);
|
57
|
+
return jsx(StoreContext.Provider, {
|
58
|
+
value: { store, state },
|
59
|
+
children
|
60
|
+
});
|
61
|
+
}
|
62
|
+
export function useSelector(selector) {
|
63
|
+
const context = useContext(StoreContext);
|
64
|
+
return selector(context.state);
|
65
|
+
}
|
66
|
+
export function useDispatch() {
|
67
|
+
const context = useContext(StoreContext);
|
68
|
+
return context.store.dispatch;
|
69
|
+
}
|
70
|
+
export function useStore() {
|
71
|
+
const context = useContext(StoreContext);
|
72
|
+
return context.store;
|
73
|
+
}
|
74
|
+
// Common middlewares
|
75
|
+
export const logger = (store) => (next) => (action) => {
|
76
|
+
console.group(action.type);
|
77
|
+
console.log('Previous state:', store.getState());
|
78
|
+
console.log('Action:', action);
|
79
|
+
const result = next(action);
|
80
|
+
console.log('Next state:', store.getState());
|
81
|
+
console.groupEnd();
|
82
|
+
return result;
|
83
|
+
};
|
84
|
+
export const thunk = (store) => (next) => (action) => {
|
85
|
+
if (typeof action === 'function') {
|
86
|
+
return action(store.dispatch, store.getState);
|
87
|
+
}
|
88
|
+
return next(action);
|
89
|
+
};
|
90
|
+
export default {
|
91
|
+
createStore,
|
92
|
+
StoreProvider,
|
93
|
+
useSelector,
|
94
|
+
useDispatch,
|
95
|
+
useStore,
|
96
|
+
logger,
|
97
|
+
thunk
|
98
|
+
};
|
99
|
+
//# sourceMappingURL=store.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/store.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,46 @@
|
|
1
|
+
/**
|
2
|
+
* Common utility functions for the framework
|
3
|
+
*/
|
4
|
+
export interface DebouncedFunction<T extends (...args: any[]) => any> {
|
5
|
+
(...args: Parameters<T>): void;
|
6
|
+
cancel: () => void;
|
7
|
+
}
|
8
|
+
/**
|
9
|
+
* Creates a debounced function that delays invoking the provided function
|
10
|
+
* until after the specified wait time has elapsed since the last time it was invoked.
|
11
|
+
*/
|
12
|
+
export declare function debounce<T extends (...args: any[]) => any>(func: T, wait: number): DebouncedFunction<T>;
|
13
|
+
export interface ThrottledFunction<T extends (...args: any[]) => any> {
|
14
|
+
(...args: Parameters<T>): void;
|
15
|
+
cancel: () => void;
|
16
|
+
}
|
17
|
+
/**
|
18
|
+
* Creates a throttled function that only invokes the provided function
|
19
|
+
* at most once per every wait milliseconds.
|
20
|
+
*/
|
21
|
+
export declare function throttle<T extends (...args: any[]) => any>(func: T, wait: number): ThrottledFunction<T>;
|
22
|
+
/**
|
23
|
+
* Deep clones an object by using JSON serialization
|
24
|
+
*/
|
25
|
+
export declare function deepClone<T>(obj: T): T;
|
26
|
+
/**
|
27
|
+
* Creates a memoized version of a function that caches results based on arguments
|
28
|
+
*/
|
29
|
+
export declare function memoize<T extends (...args: any[]) => any>(func: T): T;
|
30
|
+
/**
|
31
|
+
* Creates a UUID v4 string
|
32
|
+
*/
|
33
|
+
export declare function uuid(): string;
|
34
|
+
/**
|
35
|
+
* Formats a date according to the specified format
|
36
|
+
*/
|
37
|
+
export declare function formatDate(date: Date, format: string): string;
|
38
|
+
declare const _default: {
|
39
|
+
debounce: typeof debounce;
|
40
|
+
throttle: typeof throttle;
|
41
|
+
deepClone: typeof deepClone;
|
42
|
+
memoize: typeof memoize;
|
43
|
+
uuid: typeof uuid;
|
44
|
+
formatDate: typeof formatDate;
|
45
|
+
};
|
46
|
+
export default _default;
|