frontend-hamroun 1.2.79 → 1.2.82
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/LICENSE +21 -0
- package/README.md +129 -1513
- package/bin/cli.js +506 -145
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.client.cjs +2 -0
- package/dist/index.client.cjs.map +1 -0
- package/dist/index.client.js +26 -0
- package/dist/index.client.js.map +1 -0
- package/dist/index.js +299 -1
- package/dist/index.js.map +1 -0
- package/dist/jsx-runtime.cjs +2 -0
- package/dist/jsx-runtime.cjs.map +1 -0
- package/dist/jsx-runtime.js +93 -1
- package/dist/jsx-runtime.js.map +1 -0
- package/dist/renderer-Bo9zkUZ_.js +52 -0
- package/dist/renderer-Bo9zkUZ_.js.map +1 -0
- package/dist/renderer-Din1y3YM.cjs +2 -0
- package/dist/renderer-Din1y3YM.cjs.map +1 -0
- package/dist/server-renderer-CqIpQ-od.cjs +2 -0
- package/dist/server-renderer-CqIpQ-od.cjs.map +1 -0
- package/dist/server-renderer-QHt45Ip2.js +255 -0
- package/dist/server-renderer-QHt45Ip2.js.map +1 -0
- package/dist/server-renderer.cjs +2 -0
- package/dist/server-renderer.cjs.map +1 -0
- package/dist/server-renderer.js +5 -1
- package/dist/server-renderer.js.map +1 -0
- package/package.json +77 -120
- package/templates/basic-app/build.js +22 -0
- package/templates/basic-app/dev.js +27 -0
- package/templates/basic-app/esbuild.config.js +28 -0
- package/templates/basic-app/index.html +1 -1
- package/templates/basic-app/package.json +29 -28
- package/templates/basic-app/server.js +24 -0
- package/templates/basic-app/src/App.jsx +16 -0
- package/templates/basic-app/src/App.tsx +26 -0
- package/templates/basic-app/src/client.jsx +5 -0
- package/templates/basic-app/src/client.tsx +11 -0
- package/templates/basic-app/src/components/Counter.jsx +13 -0
- package/templates/basic-app/src/components/Counter.tsx +18 -0
- package/templates/basic-app/src/jsx-shim.js +3 -0
- package/templates/basic-app/src/jsx-shim.ts +11 -0
- package/templates/basic-app/src/main.jsx +98 -0
- package/templates/basic-app/src/main.tsx +0 -1
- package/templates/basic-app/src/server.js +47 -0
- package/templates/basic-app/src/server.ts +52 -0
- package/templates/basic-app/tsconfig.server.json +11 -0
- package/templates/complete-app/lib/frontend-hamroun.js +182 -0
- package/templates/complete-app/package.json +2 -1
- package/templates/complete-app/pages/about.jsx +0 -0
- package/templates/complete-app/pages/index.jsx +0 -0
- package/templates/complete-app/pages/wasm-demo.jsx +0 -0
- package/templates/complete-app/public/client.js +58 -49
- package/templates/complete-app/public/index.html +88 -17
- package/templates/complete-app/public/styles.css +30 -533
- package/templates/complete-app/server.js +31 -222
- package/templates/complete-app/wasm/build.bat +0 -0
- package/templates/complete-app/wasm/build.sh +0 -0
- package/templates/complete-app/wasm/example.go +0 -0
- package/templates/fullstack-app/build/main.js +130 -101
- package/templates/fullstack-app/build/main.js.map +4 -4
- package/templates/fullstack-app/package-lock.json +1773 -566
- package/templates/ssr-template/esbuild.config.js +33 -0
- package/templates/ssr-template/jsx-shim.js +1 -0
- package/templates/ssr-template/package.json +22 -16
- package/templates/ssr-template/src/App.tsx +12 -52
- package/templates/ssr-template/src/client.tsx +3 -17
- package/templates/ssr-template/src/server.ts +21 -204
- package/templates/ssr-template/tsconfig.json +10 -13
- package/templates/ssr-template/tsconfig.server.json +6 -14
- package/templates/wasm/build-wasm.js +228 -0
- package/templates/wasm/esbuild.config.js +63 -0
- package/templates/wasm/go/main.go +256 -0
- package/templates/wasm/go/wasm_exec.js +0 -0
- package/templates/wasm/index.html +97 -0
- package/templates/wasm/jsx-shim.js +9 -0
- package/templates/{go-wasm-app → wasm}/package-lock.json +5307 -3732
- package/templates/wasm/package.json +42 -0
- package/templates/wasm/public/example.wasm +0 -0
- package/templates/wasm/src/App.tsx +564 -0
- package/templates/wasm/src/client.tsx +220 -0
- package/templates/wasm/src/index.tsx +21 -0
- package/templates/wasm/src/server.ts +145 -0
- package/templates/wasm/tsconfig.json +21 -0
- package/templates/wasm/tsconfig.node.json +13 -0
- package/templates/wasm/tsconfig.server.json +23 -0
- package/templates/wasm/vite.config.ts +56 -0
- package/templates/wasm/wasm-loader.js +103 -0
- package/dist/batch/package.json +0 -16
- package/dist/client-router/package.json +0 -16
- package/dist/component/package.json +0 -16
- package/dist/context/package.json +0 -16
- package/dist/event-bus/package.json +0 -16
- package/dist/forms/package.json +0 -16
- package/dist/hooks/package.json +0 -16
- package/dist/hooks-0728361a.cjs +0 -1
- package/dist/hooks-b58f947c.js +0 -133
- package/dist/hooks.js +0 -1
- package/dist/hooks.mjs +0 -13
- package/dist/index.mjs +0 -137
- package/dist/jsx-runtime/package.json +0 -16
- package/dist/jsx-runtime.mjs +0 -64
- package/dist/lifecycle-events/package.json +0 -16
- package/dist/package.json +0 -71
- package/dist/render-component/package.json +0 -16
- package/dist/renderer/package.json +0 -16
- package/dist/renderer.js +0 -1
- package/dist/renderer.mjs +0 -27
- package/dist/router/package.json +0 -16
- package/dist/server/package.json +0 -17
- package/dist/server/src/batch.d.ts +0 -3
- package/dist/server/src/batch.js +0 -23
- package/dist/server/src/batch.js.map +0 -1
- package/dist/server/src/client-router.d.ts +0 -60
- package/dist/server/src/client-router.js +0 -210
- package/dist/server/src/client-router.js.map +0 -1
- package/dist/server/src/component.d.ts +0 -14
- package/dist/server/src/component.js +0 -106
- package/dist/server/src/component.js.map +0 -1
- package/dist/server/src/context.d.ts +0 -13
- package/dist/server/src/context.js +0 -21
- package/dist/server/src/context.js.map +0 -1
- package/dist/server/src/event-bus.d.ts +0 -23
- package/dist/server/src/event-bus.js +0 -75
- package/dist/server/src/event-bus.js.map +0 -1
- package/dist/server/src/forms.d.ts +0 -40
- package/dist/server/src/forms.js +0 -148
- package/dist/server/src/forms.js.map +0 -1
- package/dist/server/src/hooks.d.ts +0 -12
- package/dist/server/src/hooks.js +0 -170
- package/dist/server/src/hooks.js.map +0 -1
- package/dist/server/src/index.client.d.ts +0 -12
- package/dist/server/src/index.client.js +0 -14
- package/dist/server/src/index.client.js.map +0 -1
- package/dist/server/src/index.d.ts +0 -88
- package/dist/server/src/index.js +0 -79
- package/dist/server/src/index.js.map +0 -1
- package/dist/server/src/jsx-runtime/jsx-dev-runtime.d.ts +0 -1
- package/dist/server/src/jsx-runtime/jsx-dev-runtime.js +0 -2
- package/dist/server/src/jsx-runtime/jsx-dev-runtime.js.map +0 -1
- package/dist/server/src/jsx-runtime/jsx-runtime.d.ts +0 -4
- package/dist/server/src/jsx-runtime/jsx-runtime.js +0 -41
- package/dist/server/src/jsx-runtime/jsx-runtime.js.map +0 -1
- package/dist/server/src/jsx-runtime.d.ts +0 -20
- package/dist/server/src/jsx-runtime.js +0 -105
- package/dist/server/src/jsx-runtime.js.map +0 -1
- package/dist/server/src/lifecycle-events.d.ts +0 -108
- package/dist/server/src/lifecycle-events.js +0 -177
- package/dist/server/src/lifecycle-events.js.map +0 -1
- package/dist/server/src/renderComponent.d.ts +0 -13
- package/dist/server/src/renderComponent.js +0 -30
- package/dist/server/src/renderComponent.js.map +0 -1
- package/dist/server/src/renderer.d.ts +0 -2
- package/dist/server/src/renderer.js +0 -31
- package/dist/server/src/renderer.js.map +0 -1
- package/dist/server/src/router.d.ts +0 -55
- package/dist/server/src/router.js +0 -166
- package/dist/server/src/router.js.map +0 -1
- package/dist/server/src/server/api-router.d.ts +0 -15
- package/dist/server/src/server/api-router.js +0 -111
- package/dist/server/src/server/api-router.js.map +0 -1
- package/dist/server/src/server/auth.d.ts +0 -32
- package/dist/server/src/server/auth.js +0 -80
- package/dist/server/src/server/auth.js.map +0 -1
- package/dist/server/src/server/database.d.ts +0 -24
- package/dist/server/src/server/database.js +0 -135
- package/dist/server/src/server/database.js.map +0 -1
- package/dist/server/src/server/index.d.ts +0 -116
- package/dist/server/src/server/index.js +0 -508
- package/dist/server/src/server/index.js.map +0 -1
- package/dist/server/src/server/middleware.d.ts +0 -11
- package/dist/server/src/server/middleware.js +0 -46
- package/dist/server/src/server/middleware.js.map +0 -1
- package/dist/server/src/server/server.d.ts +0 -9
- package/dist/server/src/server/server.js +0 -87
- package/dist/server/src/server/server.js.map +0 -1
- package/dist/server/src/server/templates.d.ts +0 -30
- package/dist/server/src/server/templates.js +0 -208
- package/dist/server/src/server/templates.js.map +0 -1
- package/dist/server/src/server/types.d.ts +0 -38
- package/dist/server/src/server/types.js +0 -4
- package/dist/server/src/server/types.js.map +0 -1
- package/dist/server/src/server/utils.d.ts +0 -70
- package/dist/server/src/server/utils.js +0 -156
- package/dist/server/src/server/utils.js.map +0 -1
- package/dist/server/src/server/wasm.d.ts +0 -9
- package/dist/server/src/server/wasm.js +0 -117
- package/dist/server/src/server/wasm.js.map +0 -1
- package/dist/server/src/server-renderer.d.ts +0 -5
- package/dist/server/src/server-renderer.js +0 -106
- package/dist/server/src/server-renderer.js.map +0 -1
- package/dist/server/src/server-types.d.ts +0 -42
- package/dist/server/src/server-types.js +0 -6
- package/dist/server/src/server-types.js.map +0 -1
- package/dist/server/src/store.d.ts +0 -41
- package/dist/server/src/store.js +0 -99
- package/dist/server/src/store.js.map +0 -1
- package/dist/server/src/types.d.ts +0 -19
- package/dist/server/src/types.js +0 -2
- package/dist/server/src/types.js.map +0 -1
- package/dist/server/src/utils.d.ts +0 -46
- package/dist/server/src/utils.js +0 -144
- package/dist/server/src/utils.js.map +0 -1
- package/dist/server/src/vdom.d.ts +0 -8
- package/dist/server/src/vdom.js +0 -22
- package/dist/server/src/vdom.js.map +0 -1
- package/dist/server/src/wasm.d.ts +0 -36
- package/dist/server/src/wasm.js +0 -159
- package/dist/server/src/wasm.js.map +0 -1
- package/dist/server/tsconfig.server.tsbuildinfo +0 -1
- package/dist/server-renderer/package.json +0 -16
- package/dist/server-renderer.mjs +0 -64
- package/dist/store/package.json +0 -16
- package/dist/types/package.json +0 -16
- package/dist/utils/package.json +0 -16
- package/dist/vdom/package.json +0 -16
- package/dist/wasm/package.json +0 -16
- package/dist/wasm.js +0 -1
- package/dist/wasm.mjs +0 -103
- package/templates/basic-app/docs/rapport_pfe.aux +0 -27
- package/templates/basic-app/docs/rapport_pfe.log +0 -399
- package/templates/basic-app/docs/rapport_pfe.out +0 -10
- package/templates/basic-app/docs/rapport_pfe.pdf +0 -0
- package/templates/basic-app/docs/rapport_pfe.tex +0 -68
- package/templates/basic-app/docs/rapport_pfe.toc +0 -14
- package/templates/complete-app/package-lock.json +0 -2536
- package/templates/go-wasm-app/README.md +0 -38
- package/templates/go-wasm-app/babel.config.js +0 -21
- package/templates/go-wasm-app/build-client.js +0 -49
- package/templates/go-wasm-app/build-wasm.js +0 -237
- package/templates/go-wasm-app/build.config.js +0 -62
- package/templates/go-wasm-app/build.js +0 -218
- package/templates/go-wasm-app/package.json +0 -32
- package/templates/go-wasm-app/public/index.html +0 -128
- package/templates/go-wasm-app/public/styles.css +0 -197
- package/templates/go-wasm-app/public/wasm/example.wasm +0 -0
- package/templates/go-wasm-app/public/wasm/wasm_exec_node.js +0 -39
- package/templates/go-wasm-app/server.js +0 -70
- package/templates/go-wasm-app/src/App.jsx +0 -38
- package/templates/go-wasm-app/src/app.js +0 -173
- package/templates/go-wasm-app/src/client.js +0 -57
- package/templates/go-wasm-app/src/components/Footer.jsx +0 -13
- package/templates/go-wasm-app/src/components/Header.jsx +0 -19
- package/templates/go-wasm-app/src/components/WasmDemo.jsx +0 -120
- package/templates/go-wasm-app/src/main.jsx +0 -12
- package/templates/go-wasm-app/src/wasm/example.go +0 -75
- package/templates/go-wasm-app/tsconfig.server.json +0 -18
- package/templates/go-wasm-app/vite.config.js +0 -45
- package/templates/ssr-template/client.js +0 -58
- package/templates/ssr-template/package-lock.json +0 -2478
- package/templates/ssr-template/public/index.html +0 -47
- package/templates/ssr-template/readme.md +0 -188
- package/templates/ssr-template/server.js +0 -369
- package/templates/ssr-template/server.ts +0 -275
- package/templates/ssr-template/src/client.ts +0 -61
- package/templates/ssr-template/src/pages/index.tsx +0 -51
- package/templates/ssr-template/vite.config.js +0 -57
- /package/{dist/Counter.d.ts → templates/complete-app/api/hello.js} +0 -0
- /package/templates/{go-wasm-app/public/wasm → wasm/public}/wasm_exec.js +0 -0
@@ -1,46 +0,0 @@
|
|
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
|
@@ -1 +0,0 @@
|
|
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"}
|
@@ -1,87 +0,0 @@
|
|
1
|
-
import fs from 'fs';
|
2
|
-
import path from 'path';
|
3
|
-
import { renderComponent } from '../renderComponent'; // Fixed import path with .js extension
|
4
|
-
class Server {
|
5
|
-
constructor(config) {
|
6
|
-
Object.defineProperty(this, "config", {
|
7
|
-
enumerable: true,
|
8
|
-
configurable: true,
|
9
|
-
writable: true,
|
10
|
-
value: void 0
|
11
|
-
});
|
12
|
-
this.config = config;
|
13
|
-
}
|
14
|
-
async renderPage(urlPath) {
|
15
|
-
try {
|
16
|
-
// Try to find the page component
|
17
|
-
const pagesDir = path.resolve(process.cwd(), this.config.pagesDir);
|
18
|
-
// Check various file patterns
|
19
|
-
let pagePath = '';
|
20
|
-
const possiblePagePaths = [
|
21
|
-
`${pagesDir}${path}.jsx`,
|
22
|
-
`${pagesDir}${path}.tsx`,
|
23
|
-
`${pagesDir}${path}/index.jsx`,
|
24
|
-
`${pagesDir}${path}/index.tsx`,
|
25
|
-
// For dynamic routes
|
26
|
-
...fs.readdirSync(pagesDir, { recursive: true })
|
27
|
-
.filter((file) => typeof file === 'string')
|
28
|
-
.filter((file) => file.endsWith('.jsx') || file.endsWith('.tsx'))
|
29
|
-
.map((file) => path.join(pagesDir, file))
|
30
|
-
.filter((file) => {
|
31
|
-
const routePattern = file
|
32
|
-
.replace(pagesDir, '')
|
33
|
-
.replace(/\.[jt]sx$/, '')
|
34
|
-
.replace(/\/index$/, '/')
|
35
|
-
.replace(/\[([^\]]+)\]/g, ':$1');
|
36
|
-
// Create Express-like path matcher
|
37
|
-
return this.pathMatchesPattern(urlPath, routePattern);
|
38
|
-
})
|
39
|
-
];
|
40
|
-
for (const possiblePath of possiblePagePaths) {
|
41
|
-
if (fs.existsSync(possiblePath)) {
|
42
|
-
pagePath = possiblePath;
|
43
|
-
break;
|
44
|
-
}
|
45
|
-
}
|
46
|
-
if (!pagePath) {
|
47
|
-
return {
|
48
|
-
html: `<!DOCTYPE html><html><body><h1>404 - Page Not Found</h1></body></html>`,
|
49
|
-
statusCode: 404
|
50
|
-
};
|
51
|
-
}
|
52
|
-
// Import and render the page component
|
53
|
-
const { default: PageComponent } = await import(pagePath);
|
54
|
-
if (!PageComponent || typeof PageComponent !== 'function') {
|
55
|
-
throw new Error(`Invalid page component: ${pagePath}`);
|
56
|
-
}
|
57
|
-
const { html } = await renderComponent(PageComponent);
|
58
|
-
// Add DOCTYPE and wrap in html/body if not present
|
59
|
-
let finalHtml = html;
|
60
|
-
if (!finalHtml.includes('<!DOCTYPE')) {
|
61
|
-
finalHtml = `<!DOCTYPE html><html><head>
|
62
|
-
<meta charset="UTF-8">
|
63
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
64
|
-
<script type="module" src="/client.js"></script>
|
65
|
-
</head><body>${finalHtml}</body></html>`;
|
66
|
-
}
|
67
|
-
return { html: finalHtml, statusCode: 200 };
|
68
|
-
}
|
69
|
-
catch (error) {
|
70
|
-
console.error('Error rendering page:', error);
|
71
|
-
return {
|
72
|
-
html: `<!DOCTYPE html><html><body><h1>500 - Server Error</h1><pre>${error}</pre></body></html>`,
|
73
|
-
statusCode: 500
|
74
|
-
};
|
75
|
-
}
|
76
|
-
}
|
77
|
-
pathMatchesPattern(path, pattern) {
|
78
|
-
// Convert Express-like pattern to regex
|
79
|
-
const regexPattern = pattern
|
80
|
-
.replace(/\//g, '\\/') // Escape slashes
|
81
|
-
.replace(/:([^\/]+)/g, '([^\\/]+)'); // Convert :param to regex group
|
82
|
-
const regex = new RegExp(`^${regexPattern}$`);
|
83
|
-
return regex.test(path);
|
84
|
-
}
|
85
|
-
}
|
86
|
-
export default Server;
|
87
|
-
//# sourceMappingURL=server.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../../src/server/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC,CAAC,uCAAuC;AAEhG,MAAM,MAAM;IAGV,YAAY,MAA6B;QAFjC;;;;;WAA8B;QAGpC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,OAAe;QACtC,IAAI,CAAC;YACH,iCAAiC;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,QAAS,CAAC,CAAC;YAEpE,8BAA8B;YAC9B,IAAI,QAAQ,GAAG,EAAE,CAAC;YAClB,MAAM,iBAAiB,GAAG;gBACxB,GAAG,QAAQ,GAAG,IAAI,MAAM;gBACxB,GAAG,QAAQ,GAAG,IAAI,MAAM;gBACxB,GAAG,QAAQ,GAAG,IAAI,YAAY;gBAC9B,GAAG,QAAQ,GAAG,IAAI,YAAY;gBAC9B,qBAAqB;gBACrB,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;qBAC7C,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC;qBAC1D,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CACf,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;qBAChD,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;qBAChD,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE;oBACvB,MAAM,YAAY,GAAG,IAAI;yBACtB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;yBACrB,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;yBACxB,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;yBACxB,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;oBAEnC,mCAAmC;oBACnC,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;gBACxD,CAAC,CAAC;aACL,CAAC;YAEF,KAAK,MAAM,YAAY,IAAI,iBAAiB,EAAE,CAAC;gBAC7C,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;oBAChC,QAAQ,GAAG,YAAY,CAAC;oBACxB,MAAM;gBACR,CAAC;YACH,CAAC;YAED,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO;oBACL,IAAI,EAAE,wEAAwE;oBAC9E,UAAU,EAAE,GAAG;iBAChB,CAAC;YACJ,CAAC;YAED,uCAAuC;YACvC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;YAE1D,IAAI,CAAC,aAAa,IAAI,OAAO,aAAa,KAAK,UAAU,EAAE,CAAC;gBAC1D,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC;YACzD,CAAC;YAED,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,eAAe,CAAC,aAAa,CAAC,CAAC;YAEtD,mDAAmD;YACnD,IAAI,SAAS,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBACrC,SAAS,GAAG;;;;uBAIG,SAAS,gBAAgB,CAAC;YAC3C,CAAC;YAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;YAC9C,OAAO;gBACL,IAAI,EAAE,8DAA8D,KAAK,sBAAsB;gBAC/F,UAAU,EAAE,GAAG;aAChB,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,kBAAkB,CAAC,IAAY,EAAE,OAAe;QACtD,wCAAwC;QACxC,MAAM,YAAY,GAAG,OAAO;aACzB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,iBAAiB;aACvC,OAAO,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC,gCAAgC;QAEvE,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,YAAY,GAAG,CAAC,CAAC;QAC9C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF;AAED,eAAe,MAAM,CAAC"}
|
@@ -1,30 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* HTML template generators for server-side rendering
|
3
|
-
*/
|
4
|
-
export interface DocumentOptions {
|
5
|
-
title?: string;
|
6
|
-
description?: string;
|
7
|
-
lang?: string;
|
8
|
-
charset?: string;
|
9
|
-
viewport?: string;
|
10
|
-
scripts?: string[];
|
11
|
-
styles?: string[];
|
12
|
-
meta?: Record<string, string>;
|
13
|
-
bodyClasses?: string;
|
14
|
-
htmlAttrs?: Record<string, string>;
|
15
|
-
bodyAttrs?: Record<string, string>;
|
16
|
-
initialData?: any;
|
17
|
-
componentName?: string;
|
18
|
-
}
|
19
|
-
/**
|
20
|
-
* Generate a complete HTML document
|
21
|
-
*/
|
22
|
-
export declare function generateDocument(content: string, options?: DocumentOptions): string;
|
23
|
-
/**
|
24
|
-
* Generate an error page
|
25
|
-
*/
|
26
|
-
export declare function generateErrorPage(statusCode: number, message: string, error?: Error): string;
|
27
|
-
/**
|
28
|
-
* Generate a loading page
|
29
|
-
*/
|
30
|
-
export declare function generateLoadingPage(message?: string): string;
|
@@ -1,208 +0,0 @@
|
|
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 = 'Frontend Hamroun App', description = '', lang = 'en', charset = 'UTF-8', viewport = 'width=device-width, initial-scale=1.0', scripts = [], styles = [], meta = {}, bodyClasses = '', htmlAttrs = {}, bodyAttrs = {}, initialData = {}, componentName = '' } = 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)}" ${src.endsWith('.js') ? 'type="module"' : ''} 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 initial data script
|
42
|
-
const initialDataScript = Object.keys(initialData).length > 0 ?
|
43
|
-
`<script id="__APP_DATA__" type="application/json">${escapeHtml(JSON.stringify(initialData))}</script>` : '';
|
44
|
-
// Create the complete HTML document
|
45
|
-
return `<!DOCTYPE html>
|
46
|
-
<html lang="${lang}" ${htmlAttributes}>
|
47
|
-
<head>
|
48
|
-
${metaTags.filter(Boolean).join('\n ')}
|
49
|
-
<title>${escapeHtml(title)}</title>
|
50
|
-
${styleTags.join('\n ')}
|
51
|
-
</head>
|
52
|
-
<body class="${bodyClasses}" ${bodyAttributes}>
|
53
|
-
<div id="app-root" data-ssr-root${componentName ? ` data-component="${escapeHtml(componentName)}"` : ''}>${content}</div>
|
54
|
-
${initialDataScript}
|
55
|
-
${scriptTags.join('\n ')}
|
56
|
-
</body>
|
57
|
-
</html>`;
|
58
|
-
}
|
59
|
-
/**
|
60
|
-
* Generate an error page
|
61
|
-
*/
|
62
|
-
export function generateErrorPage(statusCode, message, error) {
|
63
|
-
const errorMessages = {
|
64
|
-
400: 'Bad Request',
|
65
|
-
401: 'Unauthorized',
|
66
|
-
403: 'Forbidden',
|
67
|
-
404: 'Not Found',
|
68
|
-
500: 'Internal Server Error'
|
69
|
-
};
|
70
|
-
const title = `${statusCode} - ${errorMessages[statusCode] || 'Error'}`;
|
71
|
-
// Generate error details (only in development)
|
72
|
-
const isDev = process.env.NODE_ENV !== 'production';
|
73
|
-
const errorDetails = isDev && error ? `
|
74
|
-
<div class="error-details">
|
75
|
-
<pre>${escapeHtml(error.stack || error.message)}</pre>
|
76
|
-
</div>
|
77
|
-
` : '';
|
78
|
-
// Create error content
|
79
|
-
const content = `
|
80
|
-
<div class="error-container">
|
81
|
-
<h1>${statusCode}</h1>
|
82
|
-
<h2>${escapeHtml(errorMessages[statusCode] || 'Error')}</h2>
|
83
|
-
<p>${escapeHtml(message)}</p>
|
84
|
-
${errorDetails}
|
85
|
-
<a href="/" class="home-link">Back to Home</a>
|
86
|
-
</div>
|
87
|
-
`;
|
88
|
-
// Add error page styling
|
89
|
-
const styles = [`<style>
|
90
|
-
body {
|
91
|
-
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
|
92
|
-
display: flex;
|
93
|
-
justify-content: center;
|
94
|
-
align-items: center;
|
95
|
-
min-height: 100vh;
|
96
|
-
margin: 0;
|
97
|
-
background-color: #f7f7f7;
|
98
|
-
color: #333;
|
99
|
-
}
|
100
|
-
.error-container {
|
101
|
-
text-align: center;
|
102
|
-
padding: 2rem;
|
103
|
-
border-radius: 8px;
|
104
|
-
background-color: white;
|
105
|
-
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
106
|
-
max-width: 600px;
|
107
|
-
width: 100%;
|
108
|
-
}
|
109
|
-
h1 {
|
110
|
-
font-size: 6rem;
|
111
|
-
margin: 0;
|
112
|
-
color: #e74c3c;
|
113
|
-
}
|
114
|
-
h2 {
|
115
|
-
margin-top: 0;
|
116
|
-
margin-bottom: 1rem;
|
117
|
-
color: #333;
|
118
|
-
}
|
119
|
-
.error-details {
|
120
|
-
text-align: left;
|
121
|
-
margin: 2rem 0;
|
122
|
-
padding: 1rem;
|
123
|
-
background-color: #f8f8f8;
|
124
|
-
border-radius: 4px;
|
125
|
-
overflow: auto;
|
126
|
-
}
|
127
|
-
pre {
|
128
|
-
margin: 0;
|
129
|
-
font-family: monospace;
|
130
|
-
font-size: 0.85rem;
|
131
|
-
white-space: pre-wrap;
|
132
|
-
}
|
133
|
-
.home-link {
|
134
|
-
display: inline-block;
|
135
|
-
margin-top: 1.5rem;
|
136
|
-
padding: 0.75rem 1.5rem;
|
137
|
-
background-color: #3498db;
|
138
|
-
color: white;
|
139
|
-
text-decoration: none;
|
140
|
-
border-radius: 4px;
|
141
|
-
transition: background-color 0.2s;
|
142
|
-
}
|
143
|
-
.home-link:hover {
|
144
|
-
background-color: #2980b9;
|
145
|
-
}
|
146
|
-
</style>`];
|
147
|
-
return generateDocument(content, {
|
148
|
-
title,
|
149
|
-
description: `Error ${statusCode}: ${errorMessages[statusCode] || 'Error'}`,
|
150
|
-
bodyClasses: 'error-page',
|
151
|
-
styles
|
152
|
-
});
|
153
|
-
}
|
154
|
-
/**
|
155
|
-
* Generate a loading page
|
156
|
-
*/
|
157
|
-
export function generateLoadingPage(message = 'Loading...') {
|
158
|
-
const content = `
|
159
|
-
<div class="loading-container">
|
160
|
-
<div class="spinner"></div>
|
161
|
-
<p>${escapeHtml(message)}</p>
|
162
|
-
</div>
|
163
|
-
`;
|
164
|
-
const styles = [`<style>
|
165
|
-
body {
|
166
|
-
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
|
167
|
-
display: flex;
|
168
|
-
justify-content: center;
|
169
|
-
align-items: center;
|
170
|
-
min-height: 100vh;
|
171
|
-
margin: 0;
|
172
|
-
background-color: #f7f7f7;
|
173
|
-
color: #333;
|
174
|
-
}
|
175
|
-
.loading-container {
|
176
|
-
text-align: center;
|
177
|
-
}
|
178
|
-
.spinner {
|
179
|
-
width: 50px;
|
180
|
-
height: 50px;
|
181
|
-
border: 5px solid rgba(0, 0, 0, 0.1);
|
182
|
-
border-radius: 50%;
|
183
|
-
border-top-color: #3498db;
|
184
|
-
animation: spin 1s ease-in-out infinite;
|
185
|
-
margin: 0 auto 20px;
|
186
|
-
}
|
187
|
-
@keyframes spin {
|
188
|
-
to { transform: rotate(360deg); }
|
189
|
-
}
|
190
|
-
</style>`];
|
191
|
-
return generateDocument(content, {
|
192
|
-
title: 'Loading',
|
193
|
-
bodyClasses: 'loading-page',
|
194
|
-
styles
|
195
|
-
});
|
196
|
-
}
|
197
|
-
/**
|
198
|
-
* Escape HTML special characters
|
199
|
-
*/
|
200
|
-
function escapeHtml(text) {
|
201
|
-
return String(text)
|
202
|
-
.replace(/&/g, '&')
|
203
|
-
.replace(/</g, '<')
|
204
|
-
.replace(/>/g, '>')
|
205
|
-
.replace(/"/g, '"')
|
206
|
-
.replace(/'/g, ''');
|
207
|
-
}
|
208
|
-
//# sourceMappingURL=templates.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../../src/server/templates.ts"],"names":[],"mappings":"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"}
|
@@ -1,38 +0,0 @@
|
|
1
|
-
export interface ServerConfig {
|
2
|
-
port?: number;
|
3
|
-
apiDir?: string;
|
4
|
-
pagesDir?: string;
|
5
|
-
staticDir?: string;
|
6
|
-
enableCors?: boolean;
|
7
|
-
corsOptions?: any;
|
8
|
-
db?: {
|
9
|
-
url: string;
|
10
|
-
type: 'mongodb' | 'mysql' | 'postgres';
|
11
|
-
};
|
12
|
-
auth?: {
|
13
|
-
secret: string;
|
14
|
-
expiresIn?: string;
|
15
|
-
};
|
16
|
-
}
|
17
|
-
export interface Server {
|
18
|
-
start(): Promise<void>;
|
19
|
-
stop(): Promise<void>;
|
20
|
-
getExpressApp(): any;
|
21
|
-
getDatabase(): any;
|
22
|
-
getAuth(): any;
|
23
|
-
}
|
24
|
-
export interface User {
|
25
|
-
id: string | number;
|
26
|
-
username: string;
|
27
|
-
password?: string;
|
28
|
-
email?: string;
|
29
|
-
roles?: string[];
|
30
|
-
[key: string]: any;
|
31
|
-
}
|
32
|
-
export interface DbConfig {
|
33
|
-
url: string;
|
34
|
-
type: 'mongodb' | 'mysql' | 'postgres';
|
35
|
-
}
|
36
|
-
export interface MiddlewareFunction {
|
37
|
-
(req: any, res: any, next: any): void | Promise<void>;
|
38
|
-
}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/server/types.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,kDAAkD"}
|
@@ -1,70 +0,0 @@
|
|
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, // Using '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>;
|
@@ -1,156 +0,0 @@
|
|
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, // Using '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
|