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.
Files changed (113) hide show
  1. package/dist/batch/package.json +16 -0
  2. package/dist/client-router/package.json +16 -0
  3. package/dist/component/package.json +16 -0
  4. package/dist/context/package.json +16 -0
  5. package/dist/event-bus/package.json +16 -0
  6. package/dist/forms/package.json +16 -0
  7. package/dist/hooks/package.json +16 -0
  8. package/dist/jsx-runtime/package.json +16 -0
  9. package/dist/lifecycle-events/package.json +16 -0
  10. package/dist/package.json +71 -0
  11. package/dist/render-component/package.json +16 -0
  12. package/dist/renderer/package.json +16 -0
  13. package/dist/router/package.json +16 -0
  14. package/dist/server/package.json +17 -0
  15. package/dist/server/src/client-router.d.ts +60 -0
  16. package/dist/server/src/client-router.js +210 -0
  17. package/dist/server/src/client-router.js.map +1 -0
  18. package/dist/server/src/component.js +1 -1
  19. package/dist/server/src/event-bus.d.ts +23 -0
  20. package/dist/server/src/event-bus.js +75 -0
  21. package/dist/server/src/event-bus.js.map +1 -0
  22. package/dist/server/src/forms.d.ts +40 -0
  23. package/dist/server/src/forms.js +148 -0
  24. package/dist/server/src/forms.js.map +1 -0
  25. package/dist/server/src/hooks.js +2 -2
  26. package/dist/server/src/index.js +19 -11
  27. package/dist/server/src/lifecycle-events.d.ts +108 -0
  28. package/dist/server/src/lifecycle-events.js +177 -0
  29. package/dist/server/src/lifecycle-events.js.map +1 -0
  30. package/dist/server/src/renderComponent.js +1 -1
  31. package/dist/server/src/renderer.js +3 -3
  32. package/dist/server/src/router.d.ts +55 -0
  33. package/dist/server/src/router.js +166 -0
  34. package/dist/server/src/router.js.map +1 -0
  35. package/dist/server/src/server/index.d.ts +75 -2
  36. package/dist/server/src/server/index.js +224 -8
  37. package/dist/server/src/server/index.js.map +1 -1
  38. package/dist/server/src/server/server.js +1 -1
  39. package/dist/server/src/server/templates.d.ts +28 -0
  40. package/dist/server/src/server/templates.js +204 -0
  41. package/dist/server/src/server/templates.js.map +1 -0
  42. package/dist/server/src/server/utils.d.ts +70 -0
  43. package/dist/server/src/server/utils.js +156 -0
  44. package/dist/server/src/server/utils.js.map +1 -0
  45. package/dist/server/src/server-renderer.js +1 -1
  46. package/dist/server/src/store.d.ts +41 -0
  47. package/dist/server/src/store.js +99 -0
  48. package/dist/server/src/store.js.map +1 -0
  49. package/dist/server/src/utils.d.ts +46 -0
  50. package/dist/server/src/utils.js +144 -0
  51. package/dist/server/src/utils.js.map +1 -0
  52. package/dist/server/tsconfig.server.tsbuildinfo +1 -1
  53. package/dist/server-renderer/package.json +16 -0
  54. package/dist/store/package.json +16 -0
  55. package/dist/types/package.json +16 -0
  56. package/dist/utils/package.json +16 -0
  57. package/dist/vdom/package.json +16 -0
  58. package/dist/wasm/package.json +16 -0
  59. package/package.json +14 -13
  60. package/templates/complete-app/build.js +284 -0
  61. package/templates/complete-app/package.json +40 -0
  62. package/templates/complete-app/public/styles.css +345 -0
  63. package/templates/complete-app/src/api/index.js +31 -0
  64. package/templates/complete-app/src/client.js +93 -0
  65. package/templates/complete-app/src/components/App.js +66 -0
  66. package/templates/complete-app/src/components/Footer.js +19 -0
  67. package/templates/complete-app/src/components/Header.js +38 -0
  68. package/templates/complete-app/src/pages/About.js +59 -0
  69. package/templates/complete-app/src/pages/Home.js +54 -0
  70. package/templates/complete-app/src/pages/WasmDemo.js +136 -0
  71. package/templates/complete-app/src/server.js +186 -0
  72. package/templates/complete-app/src/wasm/build.bat +16 -0
  73. package/templates/complete-app/src/wasm/build.sh +16 -0
  74. package/templates/complete-app/src/wasm/example.go +101 -0
  75. package/templates/fullstack-app/build/main.css +225 -15
  76. package/templates/fullstack-app/build/main.css.map +2 -2
  77. package/templates/fullstack-app/build/main.js +657 -372
  78. package/templates/fullstack-app/build/main.js.map +4 -4
  79. package/templates/fullstack-app/build.ts +3 -4
  80. package/templates/fullstack-app/public/styles.css +222 -15
  81. package/templates/fullstack-app/server.ts +46 -12
  82. package/templates/fullstack-app/src/components/ClientHome.tsx +0 -0
  83. package/templates/fullstack-app/src/components/ErrorBoundary.tsx +36 -0
  84. package/templates/fullstack-app/src/components/Layout.tsx +23 -26
  85. package/templates/fullstack-app/src/components/StateDemo.tsx +207 -0
  86. package/templates/fullstack-app/src/components/UserList.tsx +30 -13
  87. package/templates/fullstack-app/src/data/api.ts +173 -38
  88. package/templates/fullstack-app/src/main.tsx +88 -154
  89. package/templates/fullstack-app/src/middleware.ts +28 -0
  90. package/templates/fullstack-app/src/pages/404.tsx +28 -0
  91. package/templates/fullstack-app/src/pages/[id].tsx +0 -0
  92. package/templates/fullstack-app/src/pages/_app.tsx +11 -0
  93. package/templates/fullstack-app/src/pages/_document.tsx +25 -0
  94. package/templates/fullstack-app/src/pages/_error.tsx +45 -0
  95. package/templates/fullstack-app/src/pages/about.tsx +71 -0
  96. package/templates/fullstack-app/src/pages/api/users/[id].ts +73 -0
  97. package/templates/fullstack-app/src/pages/api/users/index.ts +43 -0
  98. package/templates/fullstack-app/src/pages/index.tsx +97 -20
  99. package/templates/fullstack-app/src/pages/users/[id].tsx +153 -0
  100. package/templates/fullstack-app/src/pages/wasm-demo.tsx +1 -0
  101. package/templates/go/example.go +99 -86
  102. package/templates/go-wasm-app/babel.config.js +8 -2
  103. package/templates/go-wasm-app/build.config.js +62 -0
  104. package/templates/go-wasm-app/build.js +218 -0
  105. package/templates/go-wasm-app/package.json +21 -12
  106. package/templates/go-wasm-app/server.js +59 -510
  107. package/templates/go-wasm-app/src/app.js +173 -0
  108. package/templates/go-wasm-app/vite.config.js +16 -5
  109. package/templates/ssr-template/client.js +54 -26
  110. package/templates/ssr-template/server.js +5 -28
  111. package/templates/ssr-template/vite.config.js +21 -5
  112. package/dist/server/wasm.d.ts +0 -7
  113. 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, '&amp;')
199
+ .replace(/</g, '&lt;')
200
+ .replace(/>/g, '&gt;')
201
+ .replace(/"/g, '&quot;')
202
+ .replace(/'/g, '&#039;');
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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"}
@@ -1,4 +1,4 @@
1
- import { prepareRender, finishRender } from './hooks.js';
1
+ import { prepareRender, finishRender } from './hooks';
2
2
  /**
3
3
  * Renders a virtual DOM tree to an HTML string
4
4
  */
@@ -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":"AAAA;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AA0BvC,MAAM,UAAU,WAAW,CACzB,OAAmB,EACnB,YAAe,EACf,cAA+B,EAAE;IAEjC,IAAI,KAAK,GAAG,YAAY,CAAC;IACzB,IAAI,SAAS,GAAmB,EAAE,CAAC;IAEnC,oBAAoB;IACpB,IAAI,QAAQ,GAAa,CAAC,MAAM,EAAE,EAAE;QAClC,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC/B,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC1C,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,oBAAoB;IACpB,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,aAAa,GAAa;YAC9B,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK;YACrB,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;YACtC,SAAS,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC;SAC7C,CAAC;QAEF,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;QACvE,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACpE,CAAC;IAED,6BAA6B;IAC7B,SAAS,SAAS,CAAC,QAAoB;QACrC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEzB,OAAO,SAAS,WAAW;YACzB,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;QACpD,CAAC,CAAC;IACJ,CAAC;IAED,sCAAsC;IACtC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IAE7B,OAAO;QACL,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK;QACrB,QAAQ;QACR,SAAS;KACV,CAAC;AACJ,CAAC;AAQD,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAmB;IAC1D,KAAK,EAAE;QACL,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;QACpB,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;QAClB,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAE,CAAC;KAC1B;IACD,KAAK,EAAE,EAAE;CACV,CAAC,CAAC;AAEH,MAAM,UAAU,aAAa,CAAI,EAC/B,KAAK,EACL,QAAQ,EAIT;IACC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAExD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;YACvC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,OAAO,WAAW,CAAC;IACrB,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,OAAO,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE;QAChC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;QACvB,QAAQ;KACT,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,WAAW,CAAO,QAAwB;IACxD,MAAM,OAAO,GAAG,UAAU,CAAmB,YAAY,CAAC,CAAC;IAC3D,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,MAAM,OAAO,GAAG,UAAU,CAAmB,YAAY,CAAC,CAAC;IAC3D,OAAO,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,MAAM,OAAO,GAAG,UAAU,CAAmB,YAAY,CAAC,CAAC;IAC3D,OAAO,OAAO,CAAC,KAAiB,CAAC;AACnC,CAAC;AAED,qBAAqB;AACrB,MAAM,CAAC,MAAM,MAAM,GAAoB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;IACrE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,QAAQ,EAAE,CAAC;IACnB,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAoB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;IACpE,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;QACjC,OAAQ,MAAsB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC,CAAC;AAEF,eAAe;IACb,WAAW;IACX,aAAa;IACb,WAAW;IACX,WAAW;IACX,QAAQ;IACR,MAAM;IACN,KAAK;CACN,CAAC"}
@@ -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;