frontend-hamroun 1.2.74 → 1.2.75
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/Counter.d.ts +0 -0
- package/dist/hooks-0728361a.cjs +1 -0
- package/dist/hooks-b58f947c.js +133 -0
- package/dist/hooks.js +1 -0
- package/dist/hooks.mjs +13 -0
- package/dist/index.js +1 -384
- package/dist/index.mjs +130 -374
- package/dist/jsx-runtime.js +1 -0
- package/dist/jsx-runtime.mjs +64 -0
- package/dist/renderer.js +1 -0
- package/dist/renderer.mjs +27 -0
- package/dist/server/src/batch.d.ts +3 -0
- package/dist/server/src/batch.js +23 -0
- package/dist/server/src/batch.js.map +1 -0
- package/dist/server/src/component.d.ts +14 -0
- package/dist/server/src/component.js +106 -0
- package/dist/server/src/component.js.map +1 -0
- package/dist/server/src/context.d.ts +13 -0
- package/dist/server/src/context.js +21 -0
- package/dist/server/src/context.js.map +1 -0
- package/dist/server/src/hooks.d.ts +12 -0
- package/dist/server/src/hooks.js +170 -0
- package/dist/server/src/hooks.js.map +1 -0
- package/dist/server/src/index.client.d.ts +12 -0
- package/dist/server/src/index.client.js +14 -0
- package/dist/server/src/index.client.js.map +1 -0
- package/dist/server/src/index.d.ts +88 -0
- package/dist/server/src/index.js +70 -0
- package/dist/server/src/index.js.map +1 -0
- package/dist/server/src/jsx-runtime/jsx-dev-runtime.d.ts +1 -0
- package/dist/server/src/jsx-runtime/jsx-dev-runtime.js +2 -0
- package/dist/server/src/jsx-runtime/jsx-dev-runtime.js.map +1 -0
- package/dist/server/src/jsx-runtime/jsx-runtime.d.ts +4 -0
- package/dist/server/src/jsx-runtime/jsx-runtime.js +41 -0
- package/dist/server/src/jsx-runtime/jsx-runtime.js.map +1 -0
- package/dist/server/src/jsx-runtime.d.ts +20 -0
- package/dist/server/src/jsx-runtime.js +105 -0
- package/dist/server/src/jsx-runtime.js.map +1 -0
- package/dist/server/src/renderComponent.d.ts +14 -0
- package/dist/server/src/renderComponent.js +25 -0
- package/dist/server/src/renderComponent.js.map +1 -0
- package/dist/server/src/renderer.d.ts +2 -0
- package/dist/server/src/renderer.js +31 -0
- package/dist/server/src/renderer.js.map +1 -0
- package/dist/server/src/server/api-router.d.ts +15 -0
- package/dist/server/src/server/api-router.js +111 -0
- package/dist/server/src/server/api-router.js.map +1 -0
- package/dist/server/src/server/auth.d.ts +32 -0
- package/dist/server/src/server/auth.js +80 -0
- package/dist/server/src/server/auth.js.map +1 -0
- package/dist/server/src/server/database.d.ts +24 -0
- package/dist/server/src/server/database.js +135 -0
- package/dist/server/src/server/database.js.map +1 -0
- package/dist/server/src/server/index.d.ts +54 -0
- package/dist/server/src/server/index.js +172 -0
- package/dist/server/src/server/index.js.map +1 -0
- package/dist/server/src/server/middleware.d.ts +11 -0
- package/dist/server/src/server/middleware.js +46 -0
- package/dist/server/src/server/middleware.js.map +1 -0
- package/dist/server/src/server/server.d.ts +9 -0
- package/dist/server/src/server/server.js +87 -0
- package/dist/server/src/server/server.js.map +1 -0
- package/dist/server/src/server/types.d.ts +38 -0
- package/dist/server/src/server/types.js +4 -0
- package/dist/server/src/server/types.js.map +1 -0
- package/dist/server/src/server/wasm.d.ts +9 -0
- package/dist/server/src/server/wasm.js +117 -0
- package/dist/server/src/server/wasm.js.map +1 -0
- package/dist/server/src/server-renderer.d.ts +5 -0
- package/dist/server/src/server-renderer.js +106 -0
- package/dist/server/src/server-renderer.js.map +1 -0
- package/dist/server/src/server-types.d.ts +42 -0
- package/dist/server/src/server-types.js +6 -0
- package/dist/server/src/server-types.js.map +1 -0
- package/dist/server/src/types.d.ts +19 -0
- package/dist/server/src/types.js +2 -0
- package/dist/server/src/types.js.map +1 -0
- package/dist/server/src/vdom.d.ts +8 -0
- package/dist/server/src/vdom.js +22 -0
- package/dist/server/src/vdom.js.map +1 -0
- package/dist/server/src/wasm.d.ts +36 -0
- package/dist/server/src/wasm.js +159 -0
- package/dist/server/src/wasm.js.map +1 -0
- package/dist/server/tsconfig.server.tsbuildinfo +1 -0
- package/dist/server/wasm.d.ts +7 -0
- package/dist/server-renderer.js +1 -0
- package/dist/server-renderer.mjs +64 -0
- package/dist/wasm.d.ts +37 -0
- package/dist/wasm.js +1 -0
- package/dist/wasm.mjs +103 -0
- package/package.json +1 -1
- package/templates/go/build.sh +43 -43
- package/templates/go-wasm-app/build-wasm.js +84 -84
- package/templates/go-wasm-app/package.json +6 -5
- package/templates/go-wasm-app/public/index.html +49 -53
- package/templates/go-wasm-app/server.js +0 -188
- package/dist/index.d.ts +0 -1
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
@@ -0,0 +1,105 @@
|
|
1
|
+
function jsx(type, props) {
|
2
|
+
console.log('JSX Transform:', { type, props });
|
3
|
+
const processedProps = { ...props };
|
4
|
+
// Handle children properly
|
5
|
+
if (arguments.length > 2) {
|
6
|
+
processedProps.children = Array.prototype.slice.call(arguments, 2);
|
7
|
+
}
|
8
|
+
return { type, props: processedProps };
|
9
|
+
}
|
10
|
+
const Fragment = ({ children }) => children;
|
11
|
+
async function createElement(vnode) {
|
12
|
+
console.log('Creating element from:', vnode);
|
13
|
+
// Handle primitives and null
|
14
|
+
if (vnode == null) {
|
15
|
+
return document.createTextNode('');
|
16
|
+
}
|
17
|
+
if (typeof vnode === 'boolean') {
|
18
|
+
return document.createTextNode('');
|
19
|
+
}
|
20
|
+
if (typeof vnode === 'number' || typeof vnode === 'string') {
|
21
|
+
return document.createTextNode(String(vnode));
|
22
|
+
}
|
23
|
+
// Handle arrays
|
24
|
+
if (Array.isArray(vnode)) {
|
25
|
+
const fragment = document.createDocumentFragment();
|
26
|
+
for (const child of vnode) {
|
27
|
+
const node = await createElement(child);
|
28
|
+
fragment.appendChild(node);
|
29
|
+
}
|
30
|
+
return fragment;
|
31
|
+
}
|
32
|
+
// Handle VNode
|
33
|
+
if ('type' in vnode && vnode.props !== undefined) {
|
34
|
+
const { type, props } = vnode;
|
35
|
+
// Handle function components
|
36
|
+
if (typeof type === 'function') {
|
37
|
+
try {
|
38
|
+
const result = await type(props || {});
|
39
|
+
const node = await createElement(result);
|
40
|
+
if (node instanceof Element) {
|
41
|
+
node.setAttribute('data-component-id', type.name || type.toString());
|
42
|
+
}
|
43
|
+
return node;
|
44
|
+
}
|
45
|
+
catch (error) {
|
46
|
+
console.error('Error rendering component:', error);
|
47
|
+
return document.createTextNode('');
|
48
|
+
}
|
49
|
+
}
|
50
|
+
// Create DOM element
|
51
|
+
const element = document.createElement(type);
|
52
|
+
// Handle props
|
53
|
+
for (const [key, value] of Object.entries(props || {})) {
|
54
|
+
if (key === 'children')
|
55
|
+
continue;
|
56
|
+
if (key.startsWith('on') && typeof value === 'function') {
|
57
|
+
const eventName = key.toLowerCase().slice(2);
|
58
|
+
// Remove existing event listener if any
|
59
|
+
const existingHandler = element.__events?.[eventName];
|
60
|
+
if (existingHandler) {
|
61
|
+
element.removeEventListener(eventName, existingHandler);
|
62
|
+
}
|
63
|
+
// Add new event listener
|
64
|
+
element.addEventListener(eventName, value);
|
65
|
+
if (!element.__events) {
|
66
|
+
element.__events = {};
|
67
|
+
}
|
68
|
+
element.__events[eventName] = value;
|
69
|
+
}
|
70
|
+
else if (key === 'style' && typeof value === 'object') {
|
71
|
+
Object.assign(element.style, value);
|
72
|
+
}
|
73
|
+
else if (key === 'className') {
|
74
|
+
element.setAttribute('class', String(value));
|
75
|
+
}
|
76
|
+
else if (key !== 'key' && key !== 'ref') {
|
77
|
+
element.setAttribute(key, String(value));
|
78
|
+
}
|
79
|
+
}
|
80
|
+
// Handle children
|
81
|
+
const children = props?.children;
|
82
|
+
if (children != null) {
|
83
|
+
const childArray = Array.isArray(children) ? children.flat() : [children];
|
84
|
+
for (const child of childArray) {
|
85
|
+
const childNode = await createElement(child);
|
86
|
+
element.appendChild(childNode);
|
87
|
+
}
|
88
|
+
}
|
89
|
+
return element;
|
90
|
+
}
|
91
|
+
// Handle other objects by converting to string
|
92
|
+
return document.createTextNode(String(vnode));
|
93
|
+
}
|
94
|
+
// Export named functions and aliases without duplicates
|
95
|
+
export { jsx, jsx as jsxs, jsx as jsxDEV, Fragment, createElement };
|
96
|
+
// Named exports object
|
97
|
+
const jsxRuntime = {
|
98
|
+
jsx,
|
99
|
+
jsxs: jsx,
|
100
|
+
jsxDEV: jsx,
|
101
|
+
Fragment,
|
102
|
+
createElement
|
103
|
+
};
|
104
|
+
export default jsxRuntime;
|
105
|
+
//# sourceMappingURL=jsx-runtime.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"jsx-runtime.js","sourceRoot":"","sources":["../../../src/jsx-runtime.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
/**
|
2
|
+
* Helper function to render a component to a string
|
3
|
+
* Used by the server for SSR
|
4
|
+
*/
|
5
|
+
export declare function renderComponent(Component: any, props?: any): Promise<{
|
6
|
+
html: string;
|
7
|
+
success: boolean;
|
8
|
+
error?: undefined;
|
9
|
+
} | {
|
10
|
+
html: string;
|
11
|
+
success: boolean;
|
12
|
+
error: unknown;
|
13
|
+
}>;
|
14
|
+
export default renderComponent;
|
@@ -0,0 +1,25 @@
|
|
1
|
+
import { renderToString } from './server-renderer.js';
|
2
|
+
/**
|
3
|
+
* Helper function to render a component to a string
|
4
|
+
* Used by the server for SSR
|
5
|
+
*/
|
6
|
+
export async function renderComponent(Component, props = {}) {
|
7
|
+
try {
|
8
|
+
// Create HTML string from component
|
9
|
+
const html = renderToString(Component(props));
|
10
|
+
return {
|
11
|
+
html,
|
12
|
+
success: true
|
13
|
+
};
|
14
|
+
}
|
15
|
+
catch (error) {
|
16
|
+
console.error('Error rendering component:', error);
|
17
|
+
return {
|
18
|
+
html: `<div class="error">Error rendering component</div>`,
|
19
|
+
success: false,
|
20
|
+
error
|
21
|
+
};
|
22
|
+
}
|
23
|
+
}
|
24
|
+
export default renderComponent;
|
25
|
+
//# sourceMappingURL=renderComponent.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"renderComponent.js","sourceRoot":"","sources":["../../../src/renderComponent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,SAAc,EAAE,QAAa,EAAE;IACnE,IAAI,CAAC;QACH,oCAAoC;QACpC,MAAM,IAAI,GAAG,cAAc,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9C,OAAO;YACL,IAAI;YACJ,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;QACnD,OAAO;YACL,IAAI,EAAE,oDAAoD;YAC1D,OAAO,EAAE,KAAK;YACd,KAAK;SACN,CAAC;IACJ,CAAC;AACH,CAAC;AAED,eAAe,eAAe,CAAC"}
|
@@ -0,0 +1,31 @@
|
|
1
|
+
import { createElement } from './jsx-runtime.js';
|
2
|
+
import { prepareRender, finishRender, setRenderCallback } from './hooks.js';
|
3
|
+
import { batchUpdates } from './batch.js';
|
4
|
+
let isHydrating = false;
|
5
|
+
export async function hydrate(element, container) {
|
6
|
+
isHydrating = true;
|
7
|
+
try {
|
8
|
+
await render(element, container);
|
9
|
+
}
|
10
|
+
finally {
|
11
|
+
isHydrating = false;
|
12
|
+
}
|
13
|
+
}
|
14
|
+
export async function render(element, container) {
|
15
|
+
console.log('Rendering to:', container.id);
|
16
|
+
batchUpdates(async () => {
|
17
|
+
const rendererId = prepareRender();
|
18
|
+
try {
|
19
|
+
setRenderCallback(render, element, container);
|
20
|
+
const domNode = await createElement(element);
|
21
|
+
if (!isHydrating) {
|
22
|
+
container.innerHTML = '';
|
23
|
+
}
|
24
|
+
container.appendChild(domNode);
|
25
|
+
}
|
26
|
+
finally {
|
27
|
+
finishRender();
|
28
|
+
}
|
29
|
+
});
|
30
|
+
}
|
31
|
+
//# sourceMappingURL=renderer.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../../src/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAY,EAAE,SAAsB;IAChE,WAAW,GAAG,IAAI,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACnC,CAAC;YAAS,CAAC;QACT,WAAW,GAAG,KAAK,CAAC;IACtB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAY,EAAE,SAAsB;IAC/D,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;IAE3C,YAAY,CAAC,KAAK,IAAI,EAAE;QACtB,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;YAE7C,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,SAAS,CAAC,SAAS,GAAG,EAAE,CAAC;YAC3B,CAAC;YACD,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAEjC,CAAC;gBAAS,CAAC;YACT,YAAY,EAAE,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
import { Router } from 'express';
|
2
|
+
import { AuthService } from './auth.js';
|
3
|
+
export declare class ApiRouter {
|
4
|
+
router: Router;
|
5
|
+
private apiDir;
|
6
|
+
private auth;
|
7
|
+
constructor(apiDir: string, auth?: AuthService | null);
|
8
|
+
private setupRoutes;
|
9
|
+
private scanDirectory;
|
10
|
+
private isRouteFile;
|
11
|
+
private getRoutePath;
|
12
|
+
private registerRoute;
|
13
|
+
private isValidRouteModule;
|
14
|
+
private wrapHandler;
|
15
|
+
}
|
@@ -0,0 +1,111 @@
|
|
1
|
+
import express from 'express';
|
2
|
+
import path from 'path';
|
3
|
+
import fs from 'fs';
|
4
|
+
export class ApiRouter {
|
5
|
+
constructor(apiDir, auth = null) {
|
6
|
+
Object.defineProperty(this, "router", {
|
7
|
+
enumerable: true,
|
8
|
+
configurable: true,
|
9
|
+
writable: true,
|
10
|
+
value: void 0
|
11
|
+
});
|
12
|
+
Object.defineProperty(this, "apiDir", {
|
13
|
+
enumerable: true,
|
14
|
+
configurable: true,
|
15
|
+
writable: true,
|
16
|
+
value: void 0
|
17
|
+
});
|
18
|
+
Object.defineProperty(this, "auth", {
|
19
|
+
enumerable: true,
|
20
|
+
configurable: true,
|
21
|
+
writable: true,
|
22
|
+
value: void 0
|
23
|
+
});
|
24
|
+
this.router = express.Router();
|
25
|
+
this.apiDir = path.resolve(process.cwd(), apiDir);
|
26
|
+
this.auth = auth;
|
27
|
+
this.setupRoutes();
|
28
|
+
}
|
29
|
+
setupRoutes() {
|
30
|
+
if (!fs.existsSync(this.apiDir)) {
|
31
|
+
console.log(`API directory not found: ${this.apiDir}`);
|
32
|
+
return;
|
33
|
+
}
|
34
|
+
this.scanDirectory(this.apiDir, '');
|
35
|
+
}
|
36
|
+
scanDirectory(dirPath, routePrefix) {
|
37
|
+
const entries = fs.readdirSync(dirPath, { withFileTypes: true });
|
38
|
+
for (const entry of entries) {
|
39
|
+
const fullPath = path.join(dirPath, entry.name);
|
40
|
+
if (entry.isDirectory()) {
|
41
|
+
// Recursively scan subdirectories
|
42
|
+
this.scanDirectory(fullPath, `${routePrefix}/${entry.name}`);
|
43
|
+
}
|
44
|
+
else if (this.isRouteFile(entry.name)) {
|
45
|
+
// Process route file
|
46
|
+
const routePath = this.getRoutePath(entry.name, routePrefix);
|
47
|
+
this.registerRoute(fullPath, routePath);
|
48
|
+
}
|
49
|
+
}
|
50
|
+
}
|
51
|
+
isRouteFile(filename) {
|
52
|
+
return filename.endsWith('.js') ||
|
53
|
+
filename.endsWith('.ts') ||
|
54
|
+
filename.endsWith('.mjs');
|
55
|
+
}
|
56
|
+
getRoutePath(filename, routePrefix) {
|
57
|
+
// Remove extension and handle special names
|
58
|
+
const baseName = path.basename(filename, path.extname(filename));
|
59
|
+
if (baseName === 'index') {
|
60
|
+
return routePrefix || '/';
|
61
|
+
}
|
62
|
+
// Handle dynamic routes [param]
|
63
|
+
const paramMatch = baseName.match(/^\[(.+)\]$/);
|
64
|
+
if (paramMatch) {
|
65
|
+
return `${routePrefix}/:${paramMatch[1]}`;
|
66
|
+
}
|
67
|
+
return `${routePrefix}/${baseName}`;
|
68
|
+
}
|
69
|
+
async registerRoute(filePath, routePath) {
|
70
|
+
try {
|
71
|
+
// Dynamic import the route file
|
72
|
+
const routeModule = await import(filePath);
|
73
|
+
if (!this.isValidRouteModule(routeModule)) {
|
74
|
+
console.warn(`Invalid route module: ${filePath}`);
|
75
|
+
return;
|
76
|
+
}
|
77
|
+
console.log(`Registering API route: ${routePath}`);
|
78
|
+
// Register middleware if any
|
79
|
+
const middleware = routeModule.middleware || [];
|
80
|
+
// Register HTTP methods
|
81
|
+
for (const method of ['get', 'post', 'put', 'delete', 'patch', 'options']) {
|
82
|
+
const handler = routeModule[method];
|
83
|
+
if (typeof handler === 'function') {
|
84
|
+
const routerMethod = this.router[method];
|
85
|
+
routerMethod(routePath, ...middleware, this.wrapHandler(handler));
|
86
|
+
}
|
87
|
+
}
|
88
|
+
}
|
89
|
+
catch (error) {
|
90
|
+
console.error(`Error registering route (${filePath}):`, error);
|
91
|
+
}
|
92
|
+
}
|
93
|
+
isValidRouteModule(module) {
|
94
|
+
if (!module)
|
95
|
+
return false;
|
96
|
+
// Check if at least one HTTP method handler is defined
|
97
|
+
return ['get', 'post', 'put', 'delete', 'patch', 'options']
|
98
|
+
.some(method => typeof module[method] === 'function');
|
99
|
+
}
|
100
|
+
wrapHandler(handler) {
|
101
|
+
return async (req, res, next) => {
|
102
|
+
try {
|
103
|
+
await handler(req, res, next);
|
104
|
+
}
|
105
|
+
catch (error) {
|
106
|
+
next(error);
|
107
|
+
}
|
108
|
+
};
|
109
|
+
}
|
110
|
+
}
|
111
|
+
//# sourceMappingURL=api-router.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"api-router.js","sourceRoot":"","sources":["../../../../src/server/api-router.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,32 @@
|
|
1
|
+
import { SignOptions } from 'jsonwebtoken';
|
2
|
+
import { Request, Response, NextFunction } from 'express';
|
3
|
+
export interface AuthConfig {
|
4
|
+
secret: string;
|
5
|
+
expiresIn?: SignOptions['expiresIn'];
|
6
|
+
}
|
7
|
+
export interface User {
|
8
|
+
id: string | number;
|
9
|
+
username: string;
|
10
|
+
password?: string;
|
11
|
+
email?: string;
|
12
|
+
roles?: string[];
|
13
|
+
[key: string]: any;
|
14
|
+
}
|
15
|
+
export declare class AuthService {
|
16
|
+
private config;
|
17
|
+
constructor(config: AuthConfig);
|
18
|
+
hashPassword(password: string): Promise<string>;
|
19
|
+
comparePasswords(password: string, hashedPassword: string): Promise<boolean>;
|
20
|
+
generateToken(user: Omit<User, 'password'>): string;
|
21
|
+
verifyToken(token: string): any;
|
22
|
+
initialize(): (req: Request & {
|
23
|
+
user?: any;
|
24
|
+
}, res: Response, next: NextFunction) => void;
|
25
|
+
requireAuth(): (req: Request & {
|
26
|
+
user?: any;
|
27
|
+
}, res: Response, next: NextFunction) => void | Response<any, Record<string, any>>;
|
28
|
+
requireRoles(roles: string[]): (req: Request & {
|
29
|
+
user?: any;
|
30
|
+
}, res: Response, next: NextFunction) => void | Response<any, Record<string, any>>;
|
31
|
+
private extractToken;
|
32
|
+
}
|
@@ -0,0 +1,80 @@
|
|
1
|
+
import jwt from 'jsonwebtoken';
|
2
|
+
import bcrypt from 'bcryptjs';
|
3
|
+
export class AuthService {
|
4
|
+
constructor(config) {
|
5
|
+
Object.defineProperty(this, "config", {
|
6
|
+
enumerable: true,
|
7
|
+
configurable: true,
|
8
|
+
writable: true,
|
9
|
+
value: void 0
|
10
|
+
});
|
11
|
+
this.config = {
|
12
|
+
expiresIn: '24h',
|
13
|
+
...config
|
14
|
+
};
|
15
|
+
}
|
16
|
+
async hashPassword(password) {
|
17
|
+
return bcrypt.hash(password, 10);
|
18
|
+
}
|
19
|
+
async comparePasswords(password, hashedPassword) {
|
20
|
+
return bcrypt.compare(password, hashedPassword);
|
21
|
+
}
|
22
|
+
generateToken(user) {
|
23
|
+
const options = {};
|
24
|
+
if (this.config.expiresIn) {
|
25
|
+
options.expiresIn = this.config.expiresIn;
|
26
|
+
}
|
27
|
+
return jwt.sign({ id: user.id, username: user.username, roles: user.roles || [] }, this.config.secret, options);
|
28
|
+
}
|
29
|
+
verifyToken(token) {
|
30
|
+
try {
|
31
|
+
return jwt.verify(token, this.config.secret);
|
32
|
+
}
|
33
|
+
catch (error) {
|
34
|
+
return null;
|
35
|
+
}
|
36
|
+
}
|
37
|
+
// Express middleware for authentication
|
38
|
+
initialize() {
|
39
|
+
return (req, res, next) => {
|
40
|
+
const token = this.extractToken(req);
|
41
|
+
if (token) {
|
42
|
+
const decoded = this.verifyToken(token);
|
43
|
+
if (decoded) {
|
44
|
+
req.user = decoded;
|
45
|
+
}
|
46
|
+
}
|
47
|
+
next();
|
48
|
+
};
|
49
|
+
}
|
50
|
+
// Express middleware for requiring authentication
|
51
|
+
requireAuth() {
|
52
|
+
return (req, res, next) => {
|
53
|
+
if (!req.user) {
|
54
|
+
return res.status(401).json({ message: 'Unauthorized' });
|
55
|
+
}
|
56
|
+
return next();
|
57
|
+
};
|
58
|
+
}
|
59
|
+
// Express middleware for requiring specific roles
|
60
|
+
requireRoles(roles) {
|
61
|
+
return (req, res, next) => {
|
62
|
+
if (!req.user) {
|
63
|
+
return res.status(401).json({ message: 'Unauthorized' });
|
64
|
+
}
|
65
|
+
const userRoles = req.user.roles || [];
|
66
|
+
const hasRequiredRole = roles.some(role => userRoles.includes(role));
|
67
|
+
if (!hasRequiredRole) {
|
68
|
+
return res.status(403).json({ message: 'Forbidden' });
|
69
|
+
}
|
70
|
+
return next();
|
71
|
+
};
|
72
|
+
}
|
73
|
+
extractToken(req) {
|
74
|
+
if (req.headers.authorization && req.headers.authorization.startsWith('Bearer ')) {
|
75
|
+
return req.headers.authorization.substring(7);
|
76
|
+
}
|
77
|
+
return null;
|
78
|
+
}
|
79
|
+
}
|
80
|
+
//# sourceMappingURL=auth.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../../src/server/auth.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
import { Db } from 'mongodb';
|
2
|
+
import mysql from 'mysql2/promise';
|
3
|
+
import pg from 'pg';
|
4
|
+
export interface DbConfig {
|
5
|
+
url: string;
|
6
|
+
type: 'mongodb' | 'mysql' | 'postgres';
|
7
|
+
}
|
8
|
+
export declare class Database {
|
9
|
+
private config;
|
10
|
+
private mongoClient;
|
11
|
+
private mongoDb;
|
12
|
+
private mysqlPool;
|
13
|
+
private pgPool;
|
14
|
+
constructor(config: DbConfig);
|
15
|
+
connect(): Promise<void>;
|
16
|
+
private connectMongo;
|
17
|
+
private connectMysql;
|
18
|
+
private connectPostgres;
|
19
|
+
disconnect(): Promise<void>;
|
20
|
+
getMongoDb(): Db | null;
|
21
|
+
getMysqlPool(): mysql.Pool | null;
|
22
|
+
getPgPool(): pg.Pool | null;
|
23
|
+
query(sql: string, values?: any[]): Promise<any>;
|
24
|
+
}
|
@@ -0,0 +1,135 @@
|
|
1
|
+
import { MongoClient } from 'mongodb';
|
2
|
+
import mysql from 'mysql2/promise';
|
3
|
+
import pg from 'pg';
|
4
|
+
export class Database {
|
5
|
+
constructor(config) {
|
6
|
+
Object.defineProperty(this, "config", {
|
7
|
+
enumerable: true,
|
8
|
+
configurable: true,
|
9
|
+
writable: true,
|
10
|
+
value: void 0
|
11
|
+
});
|
12
|
+
Object.defineProperty(this, "mongoClient", {
|
13
|
+
enumerable: true,
|
14
|
+
configurable: true,
|
15
|
+
writable: true,
|
16
|
+
value: null
|
17
|
+
});
|
18
|
+
Object.defineProperty(this, "mongoDb", {
|
19
|
+
enumerable: true,
|
20
|
+
configurable: true,
|
21
|
+
writable: true,
|
22
|
+
value: null
|
23
|
+
});
|
24
|
+
Object.defineProperty(this, "mysqlPool", {
|
25
|
+
enumerable: true,
|
26
|
+
configurable: true,
|
27
|
+
writable: true,
|
28
|
+
value: null
|
29
|
+
});
|
30
|
+
Object.defineProperty(this, "pgPool", {
|
31
|
+
enumerable: true,
|
32
|
+
configurable: true,
|
33
|
+
writable: true,
|
34
|
+
value: null
|
35
|
+
});
|
36
|
+
this.config = config;
|
37
|
+
}
|
38
|
+
async connect() {
|
39
|
+
switch (this.config.type) {
|
40
|
+
case 'mongodb':
|
41
|
+
await this.connectMongo();
|
42
|
+
break;
|
43
|
+
case 'mysql':
|
44
|
+
await this.connectMysql();
|
45
|
+
break;
|
46
|
+
case 'postgres':
|
47
|
+
await this.connectPostgres();
|
48
|
+
break;
|
49
|
+
default:
|
50
|
+
throw new Error(`Unsupported database type: ${this.config.type}`);
|
51
|
+
}
|
52
|
+
}
|
53
|
+
async connectMongo() {
|
54
|
+
try {
|
55
|
+
this.mongoClient = new MongoClient(this.config.url);
|
56
|
+
await this.mongoClient.connect();
|
57
|
+
this.mongoDb = this.mongoClient.db();
|
58
|
+
console.log('Connected to MongoDB');
|
59
|
+
}
|
60
|
+
catch (error) {
|
61
|
+
console.error('MongoDB connection error:', error);
|
62
|
+
throw error;
|
63
|
+
}
|
64
|
+
}
|
65
|
+
async connectMysql() {
|
66
|
+
try {
|
67
|
+
this.mysqlPool = mysql.createPool(this.config.url);
|
68
|
+
// Test connection
|
69
|
+
await this.mysqlPool.getConnection();
|
70
|
+
console.log('Connected to MySQL');
|
71
|
+
}
|
72
|
+
catch (error) {
|
73
|
+
console.error('MySQL connection error:', error);
|
74
|
+
throw error;
|
75
|
+
}
|
76
|
+
}
|
77
|
+
async connectPostgres() {
|
78
|
+
try {
|
79
|
+
this.pgPool = new pg.Pool({ connectionString: this.config.url });
|
80
|
+
// Test connection
|
81
|
+
const client = await this.pgPool.connect();
|
82
|
+
client.release();
|
83
|
+
console.log('Connected to PostgreSQL');
|
84
|
+
}
|
85
|
+
catch (error) {
|
86
|
+
console.error('PostgreSQL connection error:', error);
|
87
|
+
throw error;
|
88
|
+
}
|
89
|
+
}
|
90
|
+
async disconnect() {
|
91
|
+
if (this.mongoClient) {
|
92
|
+
await this.mongoClient.close();
|
93
|
+
this.mongoClient = null;
|
94
|
+
this.mongoDb = null;
|
95
|
+
}
|
96
|
+
if (this.mysqlPool) {
|
97
|
+
await this.mysqlPool.end();
|
98
|
+
this.mysqlPool = null;
|
99
|
+
}
|
100
|
+
if (this.pgPool) {
|
101
|
+
await this.pgPool.end();
|
102
|
+
this.pgPool = null;
|
103
|
+
}
|
104
|
+
}
|
105
|
+
// Database-specific methods
|
106
|
+
getMongoDb() {
|
107
|
+
return this.mongoDb;
|
108
|
+
}
|
109
|
+
getMysqlPool() {
|
110
|
+
return this.mysqlPool;
|
111
|
+
}
|
112
|
+
getPgPool() {
|
113
|
+
return this.pgPool;
|
114
|
+
}
|
115
|
+
// Generic query method
|
116
|
+
async query(sql, values) {
|
117
|
+
switch (this.config.type) {
|
118
|
+
case 'mongodb':
|
119
|
+
throw new Error('For MongoDB, use getMongoDb() instead of query()');
|
120
|
+
case 'mysql':
|
121
|
+
if (!this.mysqlPool)
|
122
|
+
throw new Error('MySQL not connected');
|
123
|
+
const [rows] = await this.mysqlPool.execute(sql, values || []);
|
124
|
+
return rows;
|
125
|
+
case 'postgres':
|
126
|
+
if (!this.pgPool)
|
127
|
+
throw new Error('PostgreSQL not connected');
|
128
|
+
const result = await this.pgPool.query(sql, values || []);
|
129
|
+
return result.rows;
|
130
|
+
default:
|
131
|
+
throw new Error(`Unsupported database type: ${this.config.type}`);
|
132
|
+
}
|
133
|
+
}
|
134
|
+
}
|
135
|
+
//# sourceMappingURL=database.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../../../src/server/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAM,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,MAAM,gBAAgB,CAAC;AACnC,OAAO,EAAE,MAAM,IAAI,CAAC;AAOpB,MAAM,OAAO,QAAQ;IAOnB,YAAY,MAAgB;QANpB;;;;;WAAiB;QACjB;;;;mBAAkC,IAAI;WAAC;QACvC;;;;mBAAqB,IAAI;WAAC;QAC1B;;;;mBAA+B,IAAI;WAAC;QACpC;;;;mBAAyB,IAAI;WAAC;QAGpC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACzB,KAAK,SAAS;gBACZ,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC1B,MAAM;YACR,KAAK,OAAO;gBACV,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC1B,MAAM;YACR,KAAK,UAAU;gBACb,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC7B,MAAM;YACR;gBACE,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,IAAI,CAAC;YACH,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACpD,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;YAClD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,IAAI,CAAC;YACH,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACnD,kBAAkB;YAClB,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;YAChD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;YACjE,kBAAkB;YAClB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC3C,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;YACrD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YAC/B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;YAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,uBAAuB;IACvB,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,MAAc;QACrC,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACzB,KAAK,SAAS;gBACZ,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;YACtE,KAAK,OAAO;gBACV,IAAI,CAAC,IAAI,CAAC,SAAS;oBAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;gBAC5D,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;gBAC/D,OAAO,IAAI,CAAC;YACd,KAAK,UAAU;gBACb,IAAI,CAAC,IAAI,CAAC,MAAM;oBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;gBAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;gBAC1D,OAAO,MAAM,CAAC,IAAI,CAAC;YACrB;gBACE,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;CACF"}
|