@mahameru/diatrema 0.0.0 → 0.0.1
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/container.cjs +19 -23
- package/container.cjs.map +1 -1
- package/container.d.cts +3 -5
- package/container.d.ts +3 -5
- package/container.js +19 -23
- package/container.js.map +1 -1
- package/diatrema.d.cts +1 -1
- package/diatrema.d.ts +1 -1
- package/helpers.d.cts +1 -1
- package/helpers.d.ts +1 -1
- package/http-server.d.cts +1 -1
- package/http-server.d.ts +1 -1
- package/index.d.cts +1 -1
- package/index.d.ts +1 -1
- package/mahameru-request.d.cts +1 -1
- package/mahameru-request.d.ts +1 -1
- package/package.json +1 -1
- package/route.d.cts +1 -1
- package/route.d.ts +1 -1
- package/{types-BRwWYiUN.d.ts → types-BmFqDpSs.d.ts} +5 -0
- package/{types-CipcRmc9.d.cts → types-Cd6Gkoxx.d.cts} +5 -0
- package/types.cjs.map +1 -1
- package/types.d.cts +1 -1
- package/types.d.ts +1 -1
- package/types.js.map +1 -1
package/container.cjs
CHANGED
|
@@ -44,7 +44,6 @@ class Container {
|
|
|
44
44
|
_modules = /* @__PURE__ */ new Map();
|
|
45
45
|
_errorHandler;
|
|
46
46
|
_notFoundHandler;
|
|
47
|
-
_protectedRoutes = [];
|
|
48
47
|
dependencies;
|
|
49
48
|
_initiatorHandler;
|
|
50
49
|
options;
|
|
@@ -71,7 +70,7 @@ class Container {
|
|
|
71
70
|
return this._errorHandler;
|
|
72
71
|
}
|
|
73
72
|
get protectedRoutes() {
|
|
74
|
-
return this.
|
|
73
|
+
return this.containerRegistry.values().find((item) => item.type === "protected-route")?.item || [];
|
|
75
74
|
}
|
|
76
75
|
get initialized() {
|
|
77
76
|
return this.#initialized;
|
|
@@ -101,7 +100,6 @@ class Container {
|
|
|
101
100
|
await this.loadMiddlewareHandler();
|
|
102
101
|
await this.loadNotFoundHandlers();
|
|
103
102
|
await this.loadErrorHandler();
|
|
104
|
-
await this.loadProtectedRoutes();
|
|
105
103
|
this.#initialized = true;
|
|
106
104
|
}
|
|
107
105
|
async loadRoutes(currentDir) {
|
|
@@ -225,14 +223,26 @@ class Container {
|
|
|
225
223
|
async loadMiddlewareHandler() {
|
|
226
224
|
const middlawareHandlerPath = (0, import_node_path.join)(this.options.appPath, "middleware.js");
|
|
227
225
|
const result = await (0, import_helpers.dynamicRequire)(this.options.moduleType, middlawareHandlerPath, this.options.dev);
|
|
228
|
-
|
|
229
|
-
if (!
|
|
230
|
-
this.containerRegistry.set(
|
|
226
|
+
let success = false;
|
|
227
|
+
if (result?.default && !Array.isArray(result.default)) {
|
|
228
|
+
this.containerRegistry.set(`${middlawareHandlerPath}:default`, {
|
|
231
229
|
name: "default",
|
|
232
230
|
path: middlawareHandlerPath,
|
|
233
231
|
type: "middleware",
|
|
234
|
-
item: result
|
|
232
|
+
item: result.default
|
|
235
233
|
});
|
|
234
|
+
success = true;
|
|
235
|
+
}
|
|
236
|
+
if (result?.protectedRoutes && Array.isArray(result.protectedRoutes)) {
|
|
237
|
+
this.containerRegistry.set(`${middlawareHandlerPath}:protectedRoutes`, {
|
|
238
|
+
name: "protectedRoutes",
|
|
239
|
+
path: middlawareHandlerPath,
|
|
240
|
+
type: "protected-route",
|
|
241
|
+
item: result.protectedRoutes
|
|
242
|
+
});
|
|
243
|
+
success = true;
|
|
244
|
+
}
|
|
245
|
+
return success;
|
|
236
246
|
}
|
|
237
247
|
async loadNotFoundHandlers() {
|
|
238
248
|
const notFoundHandlerPath = (0, import_node_path.join)(this.options.appPath, "routes", "not-found.js");
|
|
@@ -243,12 +253,6 @@ class Container {
|
|
|
243
253
|
const result = await (0, import_helpers.dynamicRequire)(this.options.moduleType, errorHandlerPath, this.options.dev);
|
|
244
254
|
this._errorHandler = result?.default;
|
|
245
255
|
}
|
|
246
|
-
async loadProtectedRoutes() {
|
|
247
|
-
const middlewarePath = (0, import_node_path.join)(this.options.appPath, "middleware.js");
|
|
248
|
-
const result = await (0, import_helpers.dynamicRequire)(this.options.moduleType, middlewarePath, this.options.dev);
|
|
249
|
-
if (result && result.protectedRoutes)
|
|
250
|
-
this._protectedRoutes = result.protectedRoutes;
|
|
251
|
-
}
|
|
252
256
|
async loadInitiator() {
|
|
253
257
|
const initiatorPath = (0, import_node_path.join)(this.options.appPath, "initiator.js");
|
|
254
258
|
const result = await (0, import_helpers.dynamicRequire)(this.options.moduleType, initiatorPath, this.options.dev);
|
|
@@ -272,18 +276,10 @@ class Container {
|
|
|
272
276
|
filePath = filePath.replace("\\src\\", `\\.mahameru\\`);
|
|
273
277
|
const found = this.containerRegistry.values().find((containerItem) => containerItem.path === filePath);
|
|
274
278
|
if (found) {
|
|
275
|
-
let module2;
|
|
276
279
|
if (found.type === "route") {
|
|
277
280
|
return await this.loadSingleRoute(filePath, (0, import_node_path.dirname)(filePath), this.options.routesPath, { parentPath: (0, import_node_path.dirname)(filePath), name: (0, import_node_path.basename)(filePath) });
|
|
278
|
-
} else if (found.type === "middleware") {
|
|
279
|
-
|
|
280
|
-
if (module2) {
|
|
281
|
-
this.containerRegistry.set(`${filePath}:default`, {
|
|
282
|
-
...found,
|
|
283
|
-
item: module2.default
|
|
284
|
-
});
|
|
285
|
-
return true;
|
|
286
|
-
}
|
|
281
|
+
} else if (found.type === "middleware" || found.type === "protected-route") {
|
|
282
|
+
return await this.loadMiddlewareHandler();
|
|
287
283
|
}
|
|
288
284
|
}
|
|
289
285
|
return false;
|
package/container.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/container.ts"],"sourcesContent":["import path, { basename, dirname, join, relative, resolve } from 'node:path';\nimport { readdir } from 'node:fs/promises';\n\nimport { dynamicRequire, exists } from './helpers';\nimport type { ContainerError } from './container-error';\nimport type { ClassConstructor, ContainerItemID, ContainerRegistry, ErrorHandler, HTTPMethod, InitiatorHandler, MahameruContainer, MahameruMiddleware, ProtectedRoute, RouteHandler, RouteItem } from './types';\nimport type { ModuleError } from './module-error';\n\n/**\n * Container options\n */\nexport type ContainerOptions = {\n modulesPath: string;\n routesPath: string;\n appPath: string;\n dev: boolean;\n moduleType: \"commonjs\" | \"esm\";\n}\n\nexport type ContainerDependencies = {\n dataSources?: Record<string, any>;\n ContainerError: typeof ContainerError;\n ModuleError: typeof ModuleError;\n}\n\nexport class Container {\n #initialized = false;\n protected classes = new Map<string, ClassConstructor>();\n protected _modules = new Map<ClassConstructor, any>();\n protected _errorHandler?: ErrorHandler;\n protected _notFoundHandler?: Record<HTTPMethod, RouteHandler>;\n protected _protectedRoutes: ProtectedRoute = [];\n protected dependencies: ContainerDependencies;\n protected _initiatorHandler?: InitiatorHandler;\n public readonly options: ContainerOptions;\n public containerRegistry: ContainerRegistry = new Map();\n\n constructor(dependencies: ContainerDependencies);\n constructor(initialOptions: Partial<ContainerOptions>, dependencies: ContainerDependencies);\n constructor(arg1: Partial<ContainerOptions> | ContainerDependencies, arg2?: ContainerDependencies) {\n if (typeof arg2 !== 'undefined') {\n this.options = this.buildOptions(arg1 as Partial<ContainerOptions>);\n this.dependencies = arg2;\n } else {\n this.dependencies = arg1 as ContainerDependencies;\n this.options = this.buildOptions();\n }\n }\n\n get notFoundHandler() {\n return this._notFoundHandler;\n }\n\n getRouteItems(): RouteItem[] {\n return Array.from(this.containerRegistry.values()).filter((item) => item.type === 'route').map((item) => item.item);\n }\n\n get middlewareHandler(): MahameruMiddleware | undefined {\n return this.containerRegistry.values().find((item) => item.type === 'middleware')?.item;\n }\n\n get errorHandler() {\n return this._errorHandler;\n }\n\n get protectedRoutes() {\n return this._protectedRoutes;\n }\n\n get initialized() {\n return this.#initialized;\n }\n\n get mahameruContainer(): MahameruContainer {\n const camelCaseName = (name: string) => name.charAt(0).toLowerCase() + name.slice(1);\n\n return new Proxy({} as Record<string, unknown>, {\n get: (_target, prop) => {\n if (typeof prop !== 'string')\n return undefined;\n\n for (const registry of this.containerRegistry.values()) {\n if (registry.type === 'module-service' || registry.type === 'module-controller' || registry.type === 'instance') {\n const key = camelCaseName(registry.name);\n\n if (key === prop) {\n return registry.item;\n }\n }\n }\n\n return undefined;\n }\n }) as MahameruContainer;\n\n\n // const instances = this.containerRegistry.values().find((item) => item.type === 'instance');\n\n // if (instances) {\n // (result as any) = {\n // ...result,\n // ...instances.item\n // };\n // }\n\n // return result;\n }\n\n async discover() {\n await this.loadRoutes();\n await this.loadInitiator();\n await this.loadModules();\n await this.loadMiddlewareHandler();\n await this.loadNotFoundHandlers();\n await this.loadErrorHandler();\n await this.loadProtectedRoutes();\n\n this.#initialized = true;\n }\n\n protected async loadRoutes(currentDir?: string) {\n const baseDir = this.options.routesPath;\n\n if (!currentDir)\n currentDir = baseDir;\n\n const items = await readdir(currentDir, { withFileTypes: true }).catch(error => {\n if (error.code === 'ENOENT')\n return [];\n\n throw error;\n });\n\n for (const item of items) {\n\n const fullPath = join(currentDir, item.name);\n\n if (item.isDirectory()) {\n await this.loadRoutes(fullPath);\n\n continue;\n }\n\n if (!item.isFile() || (!['route.js', 'route.ts'].includes(item.name)))\n continue;\n\n await this.loadSingleRoute(fullPath, currentDir, baseDir, { parentPath: item.parentPath, name: item.name })\n }\n }\n\n protected async loadSingleRoute(fullPath: string, currentDir: string, baseDir: string, item: { parentPath: string, name: string }): Promise<boolean> {\n const relativePath = relative(baseDir, currentDir);\n\n let path = '/' + relativePath.replace(/\\\\/g, '/');\n path = path.replace(/\\/+/g, '/');\n\n if (path.length > 1 && path.endsWith('/'))\n path = path.slice(0, -1);\n\n const paramNames: RouteItem['paramNames'] = [];\n const paramMatches = path.match(/\\[([^\\]]+)\\]/g);\n\n if (paramMatches)\n paramMatches.forEach((match) => {\n paramNames.push(match.slice(1, -1));\n });\n\n const escaped = path.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const regexPattern = escaped.replace(/\\\\\\[([^\\\\\\]]+)\\\\\\]/g, '([^/]+)');\n const regex = new RegExp(`^${regexPattern}$`);\n const pathFS = resolve(fullPath);\n const routeHandlers = await dynamicRequire<Record<HTTPMethod, RouteHandler>>(this.options.moduleType, fullPath, this.options.dev);\n\n if (routeHandlers) {\n this.containerRegistry.set(fullPath, {\n name: dirname(item.parentPath),\n path: fullPath,\n type: 'route',\n item: {\n paramNames: [...paramNames],\n path,\n pathFS,\n regex,\n routeHandlers\n }\n });\n\n return true;\n }\n\n return false;\n }\n\n protected async loadModules() {\n const items = await readdir(this.options.modulesPath, { withFileTypes: true }).catch(error => {\n if (error.code === 'ENOENT')\n return [];\n\n throw error;\n });\n\n for (const item of items) {\n if (!item.isDirectory())\n continue;\n\n const directory = item;\n\n let controllerPath;\n const controllerPathCandidate = [\n path.join(this.options.modulesPath, directory.name, `controller.js`),\n path.join(this.options.modulesPath, directory.name, `controller.ts`)\n ];\n\n for (const candidate of controllerPathCandidate) {\n if (await exists(candidate)) {\n controllerPath = candidate;\n break;\n }\n }\n\n if (controllerPath && await exists(controllerPath)) {\n const controllerModule = await dynamicRequire<Record<string, ClassConstructor>>(this.options.moduleType, controllerPath, this.options.dev);\n\n if (controllerModule) {\n const { name, clazz } = this.getDefaultExportClass(controllerModule, controllerPath);\n const item = new clazz(this.mahameruContainer);\n const containerRegistryID = `${controllerPath}:${name}`;\n\n if (!this.containerRegistry.has(containerRegistryID))\n this.containerRegistry.set(containerRegistryID, {\n name,\n path: controllerPath,\n type: 'module-controller',\n item\n })\n }\n }\n\n let servicePath;\n const servicePathCandidate = [\n path.join(this.options.modulesPath, directory.name, `service.js`),\n path.join(this.options.modulesPath, directory.name, `service.ts`)\n ];\n\n for (const candidate of servicePathCandidate) {\n if (await exists(candidate)) {\n servicePath = candidate;\n break;\n }\n }\n\n if (servicePath && await exists(servicePath)) {\n const serviceModule = await dynamicRequire<Record<string, ClassConstructor>>(this.options.moduleType, servicePath, this.options.dev);\n\n if (serviceModule) {\n const { name, clazz } = this.getDefaultExportClass(serviceModule, servicePath);\n const item = new clazz(this.mahameruContainer);\n const containerRegistryID = `${controllerPath}:${name}`;\n\n if (!this.containerRegistry.has(containerRegistryID))\n this.containerRegistry.set(containerRegistryID, {\n name,\n path: servicePath,\n type: 'module-service',\n item\n })\n }\n }\n }\n }\n\n protected async loadMiddlewareHandler() {\n const middlawareHandlerPath = join(this.options.appPath, 'middleware.js');\n const result = await dynamicRequire<Record<'default', MahameruMiddleware>>(this.options.moduleType, middlawareHandlerPath, this.options.dev);\n const containerID: ContainerItemID = `${middlawareHandlerPath}:default`;\n\n if (!this.containerRegistry.has(containerID) && result?.default)\n this.containerRegistry.set(containerID, {\n name: 'default',\n path: middlawareHandlerPath,\n type: 'middleware',\n item: result?.default\n });\n }\n\n protected async loadNotFoundHandlers() {\n const notFoundHandlerPath = join(this.options.appPath, 'routes', 'not-found.js');\n\n this._notFoundHandler = await dynamicRequire<Record<HTTPMethod, RouteHandler>>(this.options.moduleType, notFoundHandlerPath, this.options.dev);\n }\n\n protected async loadErrorHandler() {\n const errorHandlerPath = join(this.options.appPath, 'error.js');\n const result = await dynamicRequire<Record<'default', ErrorHandler>>(this.options.moduleType, errorHandlerPath, this.options.dev);\n\n this._errorHandler = result?.default;\n }\n\n protected async loadProtectedRoutes() {\n const middlewarePath = join(this.options.appPath, 'middleware.js');\n const result = await dynamicRequire<Record<'protectedRoutes' | 'default', ProtectedRoute>>(this.options.moduleType, middlewarePath, this.options.dev);\n\n if (result && result.protectedRoutes)\n this._protectedRoutes = result.protectedRoutes;\n }\n\n protected async loadInitiator() {\n const initiatorPath = join(this.options.appPath, 'initiator.js');\n const result = await dynamicRequire<Record<'default', InitiatorHandler>>(this.options.moduleType, initiatorPath, this.options.dev);\n const handler = result?.default;\n\n if (handler) {\n this._initiatorHandler = handler;\n const instances = await this._initiatorHandler();\n\n Object.keys(instances).forEach((key) => {\n this.containerRegistry.set(`${initiatorPath}:${key}`, {\n name: key,\n path: initiatorPath,\n type: 'instance',\n item: (instances as any)[key]\n })\n })\n }\n }\n\n public async onFileChanged(filePath: string): Promise<boolean> {\n filePath = filePath.endsWith('.ts') ? filePath.replace('.ts', '.js') : filePath;\n\n if (filePath.includes('\\\\src\\\\'))\n filePath = filePath.replace('\\\\src\\\\', `\\\\.mahameru\\\\`);\n\n const found = this.containerRegistry.values().find((containerItem) => containerItem.path === filePath);\n\n if (found) {\n let module;\n\n if (found.type === 'route') {\n return await this.loadSingleRoute(filePath, dirname(filePath), this.options.routesPath, { parentPath: dirname(filePath), name: basename(filePath) });\n } else if (found.type === 'middleware') {\n module = await dynamicRequire<Record<'default', MahameruMiddleware>>(this.options.moduleType, filePath, this.options.dev);\n\n if (module) {\n this.containerRegistry.set(`${filePath}:default`, {\n ...found,\n item: module.default\n });\n\n return true\n }\n }\n }\n\n return false;\n }\n\n protected getDefaultExportClass(module: Record<string, ClassConstructor<unknown>>, filePath: string) {\n const defaultExportName = Object.keys(module).find((key) => key === 'default');\n\n if (!defaultExportName)\n throw new this.dependencies.ModuleError(`Module in file '${filePath}' does not have a default export.`, { path: filePath, moduleName: Object.keys(module)[0] });\n\n return {\n name: module[defaultExportName].name,\n clazz: module[defaultExportName]\n };\n }\n\n protected buildOptions(initialOptions?: Partial<ContainerOptions>): ContainerOptions {\n const appPath = join(process.cwd(), '.mahameru');\n const defaultOptions: ContainerOptions = {\n appPath,\n modulesPath: join(appPath, 'modules'),\n moduleType: 'esm',\n dev: initialOptions?.dev ? true : false,\n routesPath: join(appPath, 'routes')\n };\n\n if (!initialOptions)\n return defaultOptions;\n\n return {\n ...defaultOptions,\n appPath,\n ...initialOptions\n };\n }\n}\n"],"mappings":"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","names":["path","item","module"]}
|
|
1
|
+
{"version":3,"sources":["../src/container.ts"],"sourcesContent":["import path, { basename, dirname, join, relative, resolve } from 'node:path';\nimport { readdir } from 'node:fs/promises';\n\nimport { dynamicRequire, exists } from './helpers';\nimport type { ContainerError } from './container-error';\nimport type { ClassConstructor, ContainerRegistry, ErrorHandler, HTTPMethod, InitiatorHandler, MahameruContainer, MahameruMiddleware, ProtectedRoute, RouteHandler, RouteItem } from './types';\nimport type { ModuleError } from './module-error';\n\n/**\n * Container options\n */\nexport type ContainerOptions = {\n modulesPath: string;\n routesPath: string;\n appPath: string;\n dev: boolean;\n moduleType: \"commonjs\" | \"esm\";\n}\n\nexport type ContainerDependencies = {\n dataSources?: Record<string, any>;\n ContainerError: typeof ContainerError;\n ModuleError: typeof ModuleError;\n}\n\nexport class Container {\n #initialized = false;\n protected classes = new Map<string, ClassConstructor>();\n protected _modules = new Map<ClassConstructor, any>();\n protected _errorHandler?: ErrorHandler;\n protected _notFoundHandler?: Record<HTTPMethod, RouteHandler>;\n protected dependencies: ContainerDependencies;\n protected _initiatorHandler?: InitiatorHandler;\n public readonly options: ContainerOptions;\n public containerRegistry: ContainerRegistry = new Map();\n\n constructor(dependencies: ContainerDependencies);\n constructor(initialOptions: Partial<ContainerOptions>, dependencies: ContainerDependencies);\n constructor(arg1: Partial<ContainerOptions> | ContainerDependencies, arg2?: ContainerDependencies) {\n if (typeof arg2 !== 'undefined') {\n this.options = this.buildOptions(arg1 as Partial<ContainerOptions>);\n this.dependencies = arg2;\n } else {\n this.dependencies = arg1 as ContainerDependencies;\n this.options = this.buildOptions();\n }\n }\n\n get notFoundHandler() {\n return this._notFoundHandler;\n }\n\n getRouteItems(): RouteItem[] {\n return Array.from(this.containerRegistry.values()).filter((item) => item.type === 'route').map((item) => item.item);\n }\n\n get middlewareHandler(): MahameruMiddleware | undefined {\n return this.containerRegistry.values().find((item) => item.type === 'middleware')?.item;\n }\n\n get errorHandler() {\n return this._errorHandler;\n }\n\n get protectedRoutes(): ProtectedRoute {\n return this.containerRegistry.values().find((item) => item.type === 'protected-route')?.item || [];\n }\n\n get initialized() {\n return this.#initialized;\n }\n\n get mahameruContainer(): MahameruContainer {\n const camelCaseName = (name: string) => name.charAt(0).toLowerCase() + name.slice(1);\n\n return new Proxy({} as Record<string, unknown>, {\n get: (_target, prop) => {\n if (typeof prop !== 'string')\n return undefined;\n\n for (const registry of this.containerRegistry.values()) {\n if (registry.type === 'module-service' || registry.type === 'module-controller' || registry.type === 'instance') {\n const key = camelCaseName(registry.name);\n\n if (key === prop) {\n return registry.item;\n }\n }\n }\n\n return undefined;\n }\n }) as MahameruContainer;\n\n\n // const instances = this.containerRegistry.values().find((item) => item.type === 'instance');\n\n // if (instances) {\n // (result as any) = {\n // ...result,\n // ...instances.item\n // };\n // }\n\n // return result;\n }\n\n async discover() {\n await this.loadRoutes();\n await this.loadInitiator();\n await this.loadModules();\n await this.loadMiddlewareHandler();\n await this.loadNotFoundHandlers();\n await this.loadErrorHandler();\n\n this.#initialized = true;\n }\n\n protected async loadRoutes(currentDir?: string) {\n const baseDir = this.options.routesPath;\n\n if (!currentDir)\n currentDir = baseDir;\n\n const items = await readdir(currentDir, { withFileTypes: true }).catch(error => {\n if (error.code === 'ENOENT')\n return [];\n\n throw error;\n });\n\n for (const item of items) {\n const fullPath = join(currentDir, item.name);\n\n if (item.isDirectory()) {\n await this.loadRoutes(fullPath);\n\n continue;\n }\n\n if (!item.isFile() || (!['route.js', 'route.ts'].includes(item.name)))\n continue;\n\n await this.loadSingleRoute(fullPath, currentDir, baseDir, { parentPath: item.parentPath, name: item.name })\n }\n }\n\n protected async loadSingleRoute(fullPath: string, currentDir: string, baseDir: string, item: { parentPath: string, name: string }): Promise<boolean> {\n const relativePath = relative(baseDir, currentDir);\n\n let path = '/' + relativePath.replace(/\\\\/g, '/');\n path = path.replace(/\\/+/g, '/');\n\n if (path.length > 1 && path.endsWith('/'))\n path = path.slice(0, -1);\n\n const paramNames: RouteItem['paramNames'] = [];\n const paramMatches = path.match(/\\[([^\\]]+)\\]/g);\n\n if (paramMatches)\n paramMatches.forEach((match) => {\n paramNames.push(match.slice(1, -1));\n });\n\n const escaped = path.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const regexPattern = escaped.replace(/\\\\\\[([^\\\\\\]]+)\\\\\\]/g, '([^/]+)');\n const regex = new RegExp(`^${regexPattern}$`);\n const pathFS = resolve(fullPath);\n const routeHandlers = await dynamicRequire<Record<HTTPMethod, RouteHandler>>(this.options.moduleType, fullPath, this.options.dev);\n\n if (routeHandlers) {\n this.containerRegistry.set(fullPath, {\n name: dirname(item.parentPath),\n path: fullPath,\n type: 'route',\n item: {\n paramNames: [...paramNames],\n path,\n pathFS,\n regex,\n routeHandlers\n }\n });\n\n return true;\n }\n\n return false;\n }\n\n protected async loadModules() {\n const items = await readdir(this.options.modulesPath, { withFileTypes: true }).catch(error => {\n if (error.code === 'ENOENT')\n return [];\n\n throw error;\n });\n\n for (const item of items) {\n if (!item.isDirectory())\n continue;\n\n const directory = item;\n\n let controllerPath;\n const controllerPathCandidate = [\n path.join(this.options.modulesPath, directory.name, `controller.js`),\n path.join(this.options.modulesPath, directory.name, `controller.ts`)\n ];\n\n for (const candidate of controllerPathCandidate) {\n if (await exists(candidate)) {\n controllerPath = candidate;\n break;\n }\n }\n\n if (controllerPath && await exists(controllerPath)) {\n const controllerModule = await dynamicRequire<Record<string, ClassConstructor>>(this.options.moduleType, controllerPath, this.options.dev);\n\n if (controllerModule) {\n const { name, clazz } = this.getDefaultExportClass(controllerModule, controllerPath);\n const item = new clazz(this.mahameruContainer);\n const containerRegistryID = `${controllerPath}:${name}`;\n\n if (!this.containerRegistry.has(containerRegistryID))\n this.containerRegistry.set(containerRegistryID, {\n name,\n path: controllerPath,\n type: 'module-controller',\n item\n })\n }\n }\n\n let servicePath;\n const servicePathCandidate = [\n path.join(this.options.modulesPath, directory.name, `service.js`),\n path.join(this.options.modulesPath, directory.name, `service.ts`)\n ];\n\n for (const candidate of servicePathCandidate) {\n if (await exists(candidate)) {\n servicePath = candidate;\n break;\n }\n }\n\n if (servicePath && await exists(servicePath)) {\n const serviceModule = await dynamicRequire<Record<string, ClassConstructor>>(this.options.moduleType, servicePath, this.options.dev);\n\n if (serviceModule) {\n const { name, clazz } = this.getDefaultExportClass(serviceModule, servicePath);\n const item = new clazz(this.mahameruContainer);\n const containerRegistryID = `${controllerPath}:${name}`;\n\n if (!this.containerRegistry.has(containerRegistryID))\n this.containerRegistry.set(containerRegistryID, {\n name,\n path: servicePath,\n type: 'module-service',\n item\n })\n }\n }\n }\n }\n\n protected async loadMiddlewareHandler(): Promise<boolean> {\n const middlawareHandlerPath = join(this.options.appPath, 'middleware.js');\n const result = await dynamicRequire<Record<'default' | 'protectedRoutes', MahameruMiddleware | ProtectedRoute>>(this.options.moduleType, middlawareHandlerPath, this.options.dev);\n let success = false;\n\n if (result?.default && !Array.isArray(result.default)) {\n this.containerRegistry.set(`${middlawareHandlerPath}:default`, {\n name: 'default',\n path: middlawareHandlerPath,\n type: 'middleware',\n item: result.default\n });\n\n success = true\n }\n\n if (result?.protectedRoutes && Array.isArray(result.protectedRoutes)) {\n this.containerRegistry.set(`${middlawareHandlerPath}:protectedRoutes`, {\n name: 'protectedRoutes',\n path: middlawareHandlerPath,\n type: 'protected-route',\n item: result.protectedRoutes\n });\n\n success = true\n }\n\n return success;\n }\n\n protected async loadNotFoundHandlers() {\n const notFoundHandlerPath = join(this.options.appPath, 'routes', 'not-found.js');\n\n this._notFoundHandler = await dynamicRequire<Record<HTTPMethod, RouteHandler>>(this.options.moduleType, notFoundHandlerPath, this.options.dev);\n }\n\n protected async loadErrorHandler() {\n const errorHandlerPath = join(this.options.appPath, 'error.js');\n const result = await dynamicRequire<Record<'default', ErrorHandler>>(this.options.moduleType, errorHandlerPath, this.options.dev);\n\n this._errorHandler = result?.default;\n }\n\n protected async loadInitiator() {\n const initiatorPath = join(this.options.appPath, 'initiator.js');\n const result = await dynamicRequire<Record<'default', InitiatorHandler>>(this.options.moduleType, initiatorPath, this.options.dev);\n const handler = result?.default;\n\n if (handler) {\n this._initiatorHandler = handler;\n const instances = await this._initiatorHandler();\n\n Object.keys(instances).forEach((key) => {\n this.containerRegistry.set(`${initiatorPath}:${key}`, {\n name: key,\n path: initiatorPath,\n type: 'instance',\n item: (instances as any)[key]\n })\n })\n }\n }\n\n public async onFileChanged(filePath: string): Promise<boolean> {\n filePath = filePath.endsWith('.ts') ? filePath.replace('.ts', '.js') : filePath;\n\n if (filePath.includes('\\\\src\\\\'))\n filePath = filePath.replace('\\\\src\\\\', `\\\\.mahameru\\\\`);\n\n const found = this.containerRegistry.values().find((containerItem) => containerItem.path === filePath);\n\n if (found) {\n if (found.type === 'route') {\n return await this.loadSingleRoute(filePath, dirname(filePath), this.options.routesPath, { parentPath: dirname(filePath), name: basename(filePath) });\n } else if (found.type === 'middleware' || found.type === 'protected-route') {\n return await this.loadMiddlewareHandler();\n }\n }\n\n return false;\n }\n\n protected getDefaultExportClass(module: Record<string, ClassConstructor<unknown>>, filePath: string) {\n const defaultExportName = Object.keys(module).find((key) => key === 'default');\n\n if (!defaultExportName)\n throw new this.dependencies.ModuleError(`Module in file '${filePath}' does not have a default export.`, { path: filePath, moduleName: Object.keys(module)[0] });\n\n return {\n name: module[defaultExportName].name,\n clazz: module[defaultExportName]\n };\n }\n\n protected buildOptions(initialOptions?: Partial<ContainerOptions>): ContainerOptions {\n const appPath = join(process.cwd(), '.mahameru');\n const defaultOptions: ContainerOptions = {\n appPath,\n modulesPath: join(appPath, 'modules'),\n moduleType: 'esm',\n dev: initialOptions?.dev ? true : false,\n routesPath: join(appPath, 'routes')\n };\n\n if (!initialOptions)\n return defaultOptions;\n\n return {\n ...defaultOptions,\n appPath,\n ...initialOptions\n };\n }\n}\n"],"mappings":"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","names":["path","item","module"]}
|
package/container.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { C as ClassConstructor, E as ErrorHandler, H as HTTPMethod, m as RouteHandler, P as ProtectedRoute, I as InitiatorHandler, c as ContainerRegistry, p as RouteItem, g as MahameruMiddleware, q as RouteObject, M as MahameruContainer } from './types-CipcRmc9.cjs';
|
|
2
1
|
import { ContainerError } from './container-error.cjs';
|
|
2
|
+
import { C as ClassConstructor, E as ErrorHandler, H as HTTPMethod, m as RouteHandler, I as InitiatorHandler, c as ContainerRegistry, p as RouteItem, g as MahameruMiddleware, P as ProtectedRoute, M as MahameruContainer } from './types-Cd6Gkoxx.cjs';
|
|
3
3
|
import { ModuleError } from './module-error.cjs';
|
|
4
4
|
import 'node:http';
|
|
5
5
|
import './mahameru-response.cjs';
|
|
@@ -25,7 +25,6 @@ declare class Container {
|
|
|
25
25
|
protected _modules: Map<ClassConstructor, any>;
|
|
26
26
|
protected _errorHandler?: ErrorHandler;
|
|
27
27
|
protected _notFoundHandler?: Record<HTTPMethod, RouteHandler>;
|
|
28
|
-
protected _protectedRoutes: ProtectedRoute;
|
|
29
28
|
protected dependencies: ContainerDependencies;
|
|
30
29
|
protected _initiatorHandler?: InitiatorHandler;
|
|
31
30
|
readonly options: ContainerOptions;
|
|
@@ -36,7 +35,7 @@ declare class Container {
|
|
|
36
35
|
getRouteItems(): RouteItem[];
|
|
37
36
|
get middlewareHandler(): MahameruMiddleware | undefined;
|
|
38
37
|
get errorHandler(): ErrorHandler | undefined;
|
|
39
|
-
get protectedRoutes():
|
|
38
|
+
get protectedRoutes(): ProtectedRoute;
|
|
40
39
|
get initialized(): boolean;
|
|
41
40
|
get mahameruContainer(): MahameruContainer;
|
|
42
41
|
discover(): Promise<void>;
|
|
@@ -46,10 +45,9 @@ declare class Container {
|
|
|
46
45
|
name: string;
|
|
47
46
|
}): Promise<boolean>;
|
|
48
47
|
protected loadModules(): Promise<void>;
|
|
49
|
-
protected loadMiddlewareHandler(): Promise<
|
|
48
|
+
protected loadMiddlewareHandler(): Promise<boolean>;
|
|
50
49
|
protected loadNotFoundHandlers(): Promise<void>;
|
|
51
50
|
protected loadErrorHandler(): Promise<void>;
|
|
52
|
-
protected loadProtectedRoutes(): Promise<void>;
|
|
53
51
|
protected loadInitiator(): Promise<void>;
|
|
54
52
|
onFileChanged(filePath: string): Promise<boolean>;
|
|
55
53
|
protected getDefaultExportClass(module: Record<string, ClassConstructor<unknown>>, filePath: string): {
|
package/container.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { C as ClassConstructor, E as ErrorHandler, H as HTTPMethod, m as RouteHandler, P as ProtectedRoute, I as InitiatorHandler, c as ContainerRegistry, p as RouteItem, g as MahameruMiddleware, q as RouteObject, M as MahameruContainer } from './types-BRwWYiUN.js';
|
|
2
1
|
import { ContainerError } from './container-error.js';
|
|
2
|
+
import { C as ClassConstructor, E as ErrorHandler, H as HTTPMethod, m as RouteHandler, I as InitiatorHandler, c as ContainerRegistry, p as RouteItem, g as MahameruMiddleware, P as ProtectedRoute, M as MahameruContainer } from './types-BmFqDpSs.js';
|
|
3
3
|
import { ModuleError } from './module-error.js';
|
|
4
4
|
import 'node:http';
|
|
5
5
|
import './mahameru-response.js';
|
|
@@ -25,7 +25,6 @@ declare class Container {
|
|
|
25
25
|
protected _modules: Map<ClassConstructor, any>;
|
|
26
26
|
protected _errorHandler?: ErrorHandler;
|
|
27
27
|
protected _notFoundHandler?: Record<HTTPMethod, RouteHandler>;
|
|
28
|
-
protected _protectedRoutes: ProtectedRoute;
|
|
29
28
|
protected dependencies: ContainerDependencies;
|
|
30
29
|
protected _initiatorHandler?: InitiatorHandler;
|
|
31
30
|
readonly options: ContainerOptions;
|
|
@@ -36,7 +35,7 @@ declare class Container {
|
|
|
36
35
|
getRouteItems(): RouteItem[];
|
|
37
36
|
get middlewareHandler(): MahameruMiddleware | undefined;
|
|
38
37
|
get errorHandler(): ErrorHandler | undefined;
|
|
39
|
-
get protectedRoutes():
|
|
38
|
+
get protectedRoutes(): ProtectedRoute;
|
|
40
39
|
get initialized(): boolean;
|
|
41
40
|
get mahameruContainer(): MahameruContainer;
|
|
42
41
|
discover(): Promise<void>;
|
|
@@ -46,10 +45,9 @@ declare class Container {
|
|
|
46
45
|
name: string;
|
|
47
46
|
}): Promise<boolean>;
|
|
48
47
|
protected loadModules(): Promise<void>;
|
|
49
|
-
protected loadMiddlewareHandler(): Promise<
|
|
48
|
+
protected loadMiddlewareHandler(): Promise<boolean>;
|
|
50
49
|
protected loadNotFoundHandlers(): Promise<void>;
|
|
51
50
|
protected loadErrorHandler(): Promise<void>;
|
|
52
|
-
protected loadProtectedRoutes(): Promise<void>;
|
|
53
51
|
protected loadInitiator(): Promise<void>;
|
|
54
52
|
onFileChanged(filePath: string): Promise<boolean>;
|
|
55
53
|
protected getDefaultExportClass(module: Record<string, ClassConstructor<unknown>>, filePath: string): {
|
package/container.js
CHANGED
|
@@ -12,7 +12,6 @@ class Container {
|
|
|
12
12
|
_modules = /* @__PURE__ */ new Map();
|
|
13
13
|
_errorHandler;
|
|
14
14
|
_notFoundHandler;
|
|
15
|
-
_protectedRoutes = [];
|
|
16
15
|
dependencies;
|
|
17
16
|
_initiatorHandler;
|
|
18
17
|
options;
|
|
@@ -39,7 +38,7 @@ class Container {
|
|
|
39
38
|
return this._errorHandler;
|
|
40
39
|
}
|
|
41
40
|
get protectedRoutes() {
|
|
42
|
-
return this.
|
|
41
|
+
return this.containerRegistry.values().find((item) => item.type === "protected-route")?.item || [];
|
|
43
42
|
}
|
|
44
43
|
get initialized() {
|
|
45
44
|
return this.#initialized;
|
|
@@ -69,7 +68,6 @@ class Container {
|
|
|
69
68
|
await this.loadMiddlewareHandler();
|
|
70
69
|
await this.loadNotFoundHandlers();
|
|
71
70
|
await this.loadErrorHandler();
|
|
72
|
-
await this.loadProtectedRoutes();
|
|
73
71
|
this.#initialized = true;
|
|
74
72
|
}
|
|
75
73
|
async loadRoutes(currentDir) {
|
|
@@ -193,14 +191,26 @@ class Container {
|
|
|
193
191
|
async loadMiddlewareHandler() {
|
|
194
192
|
const middlawareHandlerPath = join(this.options.appPath, "middleware.js");
|
|
195
193
|
const result = await dynamicRequire(this.options.moduleType, middlawareHandlerPath, this.options.dev);
|
|
196
|
-
|
|
197
|
-
if (!
|
|
198
|
-
this.containerRegistry.set(
|
|
194
|
+
let success = false;
|
|
195
|
+
if (result?.default && !Array.isArray(result.default)) {
|
|
196
|
+
this.containerRegistry.set(`${middlawareHandlerPath}:default`, {
|
|
199
197
|
name: "default",
|
|
200
198
|
path: middlawareHandlerPath,
|
|
201
199
|
type: "middleware",
|
|
202
|
-
item: result
|
|
200
|
+
item: result.default
|
|
203
201
|
});
|
|
202
|
+
success = true;
|
|
203
|
+
}
|
|
204
|
+
if (result?.protectedRoutes && Array.isArray(result.protectedRoutes)) {
|
|
205
|
+
this.containerRegistry.set(`${middlawareHandlerPath}:protectedRoutes`, {
|
|
206
|
+
name: "protectedRoutes",
|
|
207
|
+
path: middlawareHandlerPath,
|
|
208
|
+
type: "protected-route",
|
|
209
|
+
item: result.protectedRoutes
|
|
210
|
+
});
|
|
211
|
+
success = true;
|
|
212
|
+
}
|
|
213
|
+
return success;
|
|
204
214
|
}
|
|
205
215
|
async loadNotFoundHandlers() {
|
|
206
216
|
const notFoundHandlerPath = join(this.options.appPath, "routes", "not-found.js");
|
|
@@ -211,12 +221,6 @@ class Container {
|
|
|
211
221
|
const result = await dynamicRequire(this.options.moduleType, errorHandlerPath, this.options.dev);
|
|
212
222
|
this._errorHandler = result?.default;
|
|
213
223
|
}
|
|
214
|
-
async loadProtectedRoutes() {
|
|
215
|
-
const middlewarePath = join(this.options.appPath, "middleware.js");
|
|
216
|
-
const result = await dynamicRequire(this.options.moduleType, middlewarePath, this.options.dev);
|
|
217
|
-
if (result && result.protectedRoutes)
|
|
218
|
-
this._protectedRoutes = result.protectedRoutes;
|
|
219
|
-
}
|
|
220
224
|
async loadInitiator() {
|
|
221
225
|
const initiatorPath = join(this.options.appPath, "initiator.js");
|
|
222
226
|
const result = await dynamicRequire(this.options.moduleType, initiatorPath, this.options.dev);
|
|
@@ -240,18 +244,10 @@ class Container {
|
|
|
240
244
|
filePath = filePath.replace("\\src\\", `\\.mahameru\\`);
|
|
241
245
|
const found = this.containerRegistry.values().find((containerItem) => containerItem.path === filePath);
|
|
242
246
|
if (found) {
|
|
243
|
-
let module;
|
|
244
247
|
if (found.type === "route") {
|
|
245
248
|
return await this.loadSingleRoute(filePath, dirname(filePath), this.options.routesPath, { parentPath: dirname(filePath), name: basename(filePath) });
|
|
246
|
-
} else if (found.type === "middleware") {
|
|
247
|
-
|
|
248
|
-
if (module) {
|
|
249
|
-
this.containerRegistry.set(`${filePath}:default`, {
|
|
250
|
-
...found,
|
|
251
|
-
item: module.default
|
|
252
|
-
});
|
|
253
|
-
return true;
|
|
254
|
-
}
|
|
249
|
+
} else if (found.type === "middleware" || found.type === "protected-route") {
|
|
250
|
+
return await this.loadMiddlewareHandler();
|
|
255
251
|
}
|
|
256
252
|
}
|
|
257
253
|
return false;
|
package/container.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/container.ts"],"sourcesContent":["import path, { basename, dirname, join, relative, resolve } from 'node:path';\nimport { readdir } from 'node:fs/promises';\n\nimport { dynamicRequire, exists } from './helpers';\nimport type { ContainerError } from './container-error';\nimport type { ClassConstructor, ContainerItemID, ContainerRegistry, ErrorHandler, HTTPMethod, InitiatorHandler, MahameruContainer, MahameruMiddleware, ProtectedRoute, RouteHandler, RouteItem } from './types';\nimport type { ModuleError } from './module-error';\n\n/**\n * Container options\n */\nexport type ContainerOptions = {\n modulesPath: string;\n routesPath: string;\n appPath: string;\n dev: boolean;\n moduleType: \"commonjs\" | \"esm\";\n}\n\nexport type ContainerDependencies = {\n dataSources?: Record<string, any>;\n ContainerError: typeof ContainerError;\n ModuleError: typeof ModuleError;\n}\n\nexport class Container {\n #initialized = false;\n protected classes = new Map<string, ClassConstructor>();\n protected _modules = new Map<ClassConstructor, any>();\n protected _errorHandler?: ErrorHandler;\n protected _notFoundHandler?: Record<HTTPMethod, RouteHandler>;\n protected _protectedRoutes: ProtectedRoute = [];\n protected dependencies: ContainerDependencies;\n protected _initiatorHandler?: InitiatorHandler;\n public readonly options: ContainerOptions;\n public containerRegistry: ContainerRegistry = new Map();\n\n constructor(dependencies: ContainerDependencies);\n constructor(initialOptions: Partial<ContainerOptions>, dependencies: ContainerDependencies);\n constructor(arg1: Partial<ContainerOptions> | ContainerDependencies, arg2?: ContainerDependencies) {\n if (typeof arg2 !== 'undefined') {\n this.options = this.buildOptions(arg1 as Partial<ContainerOptions>);\n this.dependencies = arg2;\n } else {\n this.dependencies = arg1 as ContainerDependencies;\n this.options = this.buildOptions();\n }\n }\n\n get notFoundHandler() {\n return this._notFoundHandler;\n }\n\n getRouteItems(): RouteItem[] {\n return Array.from(this.containerRegistry.values()).filter((item) => item.type === 'route').map((item) => item.item);\n }\n\n get middlewareHandler(): MahameruMiddleware | undefined {\n return this.containerRegistry.values().find((item) => item.type === 'middleware')?.item;\n }\n\n get errorHandler() {\n return this._errorHandler;\n }\n\n get protectedRoutes() {\n return this._protectedRoutes;\n }\n\n get initialized() {\n return this.#initialized;\n }\n\n get mahameruContainer(): MahameruContainer {\n const camelCaseName = (name: string) => name.charAt(0).toLowerCase() + name.slice(1);\n\n return new Proxy({} as Record<string, unknown>, {\n get: (_target, prop) => {\n if (typeof prop !== 'string')\n return undefined;\n\n for (const registry of this.containerRegistry.values()) {\n if (registry.type === 'module-service' || registry.type === 'module-controller' || registry.type === 'instance') {\n const key = camelCaseName(registry.name);\n\n if (key === prop) {\n return registry.item;\n }\n }\n }\n\n return undefined;\n }\n }) as MahameruContainer;\n\n\n // const instances = this.containerRegistry.values().find((item) => item.type === 'instance');\n\n // if (instances) {\n // (result as any) = {\n // ...result,\n // ...instances.item\n // };\n // }\n\n // return result;\n }\n\n async discover() {\n await this.loadRoutes();\n await this.loadInitiator();\n await this.loadModules();\n await this.loadMiddlewareHandler();\n await this.loadNotFoundHandlers();\n await this.loadErrorHandler();\n await this.loadProtectedRoutes();\n\n this.#initialized = true;\n }\n\n protected async loadRoutes(currentDir?: string) {\n const baseDir = this.options.routesPath;\n\n if (!currentDir)\n currentDir = baseDir;\n\n const items = await readdir(currentDir, { withFileTypes: true }).catch(error => {\n if (error.code === 'ENOENT')\n return [];\n\n throw error;\n });\n\n for (const item of items) {\n\n const fullPath = join(currentDir, item.name);\n\n if (item.isDirectory()) {\n await this.loadRoutes(fullPath);\n\n continue;\n }\n\n if (!item.isFile() || (!['route.js', 'route.ts'].includes(item.name)))\n continue;\n\n await this.loadSingleRoute(fullPath, currentDir, baseDir, { parentPath: item.parentPath, name: item.name })\n }\n }\n\n protected async loadSingleRoute(fullPath: string, currentDir: string, baseDir: string, item: { parentPath: string, name: string }): Promise<boolean> {\n const relativePath = relative(baseDir, currentDir);\n\n let path = '/' + relativePath.replace(/\\\\/g, '/');\n path = path.replace(/\\/+/g, '/');\n\n if (path.length > 1 && path.endsWith('/'))\n path = path.slice(0, -1);\n\n const paramNames: RouteItem['paramNames'] = [];\n const paramMatches = path.match(/\\[([^\\]]+)\\]/g);\n\n if (paramMatches)\n paramMatches.forEach((match) => {\n paramNames.push(match.slice(1, -1));\n });\n\n const escaped = path.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const regexPattern = escaped.replace(/\\\\\\[([^\\\\\\]]+)\\\\\\]/g, '([^/]+)');\n const regex = new RegExp(`^${regexPattern}$`);\n const pathFS = resolve(fullPath);\n const routeHandlers = await dynamicRequire<Record<HTTPMethod, RouteHandler>>(this.options.moduleType, fullPath, this.options.dev);\n\n if (routeHandlers) {\n this.containerRegistry.set(fullPath, {\n name: dirname(item.parentPath),\n path: fullPath,\n type: 'route',\n item: {\n paramNames: [...paramNames],\n path,\n pathFS,\n regex,\n routeHandlers\n }\n });\n\n return true;\n }\n\n return false;\n }\n\n protected async loadModules() {\n const items = await readdir(this.options.modulesPath, { withFileTypes: true }).catch(error => {\n if (error.code === 'ENOENT')\n return [];\n\n throw error;\n });\n\n for (const item of items) {\n if (!item.isDirectory())\n continue;\n\n const directory = item;\n\n let controllerPath;\n const controllerPathCandidate = [\n path.join(this.options.modulesPath, directory.name, `controller.js`),\n path.join(this.options.modulesPath, directory.name, `controller.ts`)\n ];\n\n for (const candidate of controllerPathCandidate) {\n if (await exists(candidate)) {\n controllerPath = candidate;\n break;\n }\n }\n\n if (controllerPath && await exists(controllerPath)) {\n const controllerModule = await dynamicRequire<Record<string, ClassConstructor>>(this.options.moduleType, controllerPath, this.options.dev);\n\n if (controllerModule) {\n const { name, clazz } = this.getDefaultExportClass(controllerModule, controllerPath);\n const item = new clazz(this.mahameruContainer);\n const containerRegistryID = `${controllerPath}:${name}`;\n\n if (!this.containerRegistry.has(containerRegistryID))\n this.containerRegistry.set(containerRegistryID, {\n name,\n path: controllerPath,\n type: 'module-controller',\n item\n })\n }\n }\n\n let servicePath;\n const servicePathCandidate = [\n path.join(this.options.modulesPath, directory.name, `service.js`),\n path.join(this.options.modulesPath, directory.name, `service.ts`)\n ];\n\n for (const candidate of servicePathCandidate) {\n if (await exists(candidate)) {\n servicePath = candidate;\n break;\n }\n }\n\n if (servicePath && await exists(servicePath)) {\n const serviceModule = await dynamicRequire<Record<string, ClassConstructor>>(this.options.moduleType, servicePath, this.options.dev);\n\n if (serviceModule) {\n const { name, clazz } = this.getDefaultExportClass(serviceModule, servicePath);\n const item = new clazz(this.mahameruContainer);\n const containerRegistryID = `${controllerPath}:${name}`;\n\n if (!this.containerRegistry.has(containerRegistryID))\n this.containerRegistry.set(containerRegistryID, {\n name,\n path: servicePath,\n type: 'module-service',\n item\n })\n }\n }\n }\n }\n\n protected async loadMiddlewareHandler() {\n const middlawareHandlerPath = join(this.options.appPath, 'middleware.js');\n const result = await dynamicRequire<Record<'default', MahameruMiddleware>>(this.options.moduleType, middlawareHandlerPath, this.options.dev);\n const containerID: ContainerItemID = `${middlawareHandlerPath}:default`;\n\n if (!this.containerRegistry.has(containerID) && result?.default)\n this.containerRegistry.set(containerID, {\n name: 'default',\n path: middlawareHandlerPath,\n type: 'middleware',\n item: result?.default\n });\n }\n\n protected async loadNotFoundHandlers() {\n const notFoundHandlerPath = join(this.options.appPath, 'routes', 'not-found.js');\n\n this._notFoundHandler = await dynamicRequire<Record<HTTPMethod, RouteHandler>>(this.options.moduleType, notFoundHandlerPath, this.options.dev);\n }\n\n protected async loadErrorHandler() {\n const errorHandlerPath = join(this.options.appPath, 'error.js');\n const result = await dynamicRequire<Record<'default', ErrorHandler>>(this.options.moduleType, errorHandlerPath, this.options.dev);\n\n this._errorHandler = result?.default;\n }\n\n protected async loadProtectedRoutes() {\n const middlewarePath = join(this.options.appPath, 'middleware.js');\n const result = await dynamicRequire<Record<'protectedRoutes' | 'default', ProtectedRoute>>(this.options.moduleType, middlewarePath, this.options.dev);\n\n if (result && result.protectedRoutes)\n this._protectedRoutes = result.protectedRoutes;\n }\n\n protected async loadInitiator() {\n const initiatorPath = join(this.options.appPath, 'initiator.js');\n const result = await dynamicRequire<Record<'default', InitiatorHandler>>(this.options.moduleType, initiatorPath, this.options.dev);\n const handler = result?.default;\n\n if (handler) {\n this._initiatorHandler = handler;\n const instances = await this._initiatorHandler();\n\n Object.keys(instances).forEach((key) => {\n this.containerRegistry.set(`${initiatorPath}:${key}`, {\n name: key,\n path: initiatorPath,\n type: 'instance',\n item: (instances as any)[key]\n })\n })\n }\n }\n\n public async onFileChanged(filePath: string): Promise<boolean> {\n filePath = filePath.endsWith('.ts') ? filePath.replace('.ts', '.js') : filePath;\n\n if (filePath.includes('\\\\src\\\\'))\n filePath = filePath.replace('\\\\src\\\\', `\\\\.mahameru\\\\`);\n\n const found = this.containerRegistry.values().find((containerItem) => containerItem.path === filePath);\n\n if (found) {\n let module;\n\n if (found.type === 'route') {\n return await this.loadSingleRoute(filePath, dirname(filePath), this.options.routesPath, { parentPath: dirname(filePath), name: basename(filePath) });\n } else if (found.type === 'middleware') {\n module = await dynamicRequire<Record<'default', MahameruMiddleware>>(this.options.moduleType, filePath, this.options.dev);\n\n if (module) {\n this.containerRegistry.set(`${filePath}:default`, {\n ...found,\n item: module.default\n });\n\n return true\n }\n }\n }\n\n return false;\n }\n\n protected getDefaultExportClass(module: Record<string, ClassConstructor<unknown>>, filePath: string) {\n const defaultExportName = Object.keys(module).find((key) => key === 'default');\n\n if (!defaultExportName)\n throw new this.dependencies.ModuleError(`Module in file '${filePath}' does not have a default export.`, { path: filePath, moduleName: Object.keys(module)[0] });\n\n return {\n name: module[defaultExportName].name,\n clazz: module[defaultExportName]\n };\n }\n\n protected buildOptions(initialOptions?: Partial<ContainerOptions>): ContainerOptions {\n const appPath = join(process.cwd(), '.mahameru');\n const defaultOptions: ContainerOptions = {\n appPath,\n modulesPath: join(appPath, 'modules'),\n moduleType: 'esm',\n dev: initialOptions?.dev ? true : false,\n routesPath: join(appPath, 'routes')\n };\n\n if (!initialOptions)\n return defaultOptions;\n\n return {\n ...defaultOptions,\n appPath,\n ...initialOptions\n };\n }\n}\n"],"mappings":"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","names":["path","item"]}
|
|
1
|
+
{"version":3,"sources":["../src/container.ts"],"sourcesContent":["import path, { basename, dirname, join, relative, resolve } from 'node:path';\nimport { readdir } from 'node:fs/promises';\n\nimport { dynamicRequire, exists } from './helpers';\nimport type { ContainerError } from './container-error';\nimport type { ClassConstructor, ContainerRegistry, ErrorHandler, HTTPMethod, InitiatorHandler, MahameruContainer, MahameruMiddleware, ProtectedRoute, RouteHandler, RouteItem } from './types';\nimport type { ModuleError } from './module-error';\n\n/**\n * Container options\n */\nexport type ContainerOptions = {\n modulesPath: string;\n routesPath: string;\n appPath: string;\n dev: boolean;\n moduleType: \"commonjs\" | \"esm\";\n}\n\nexport type ContainerDependencies = {\n dataSources?: Record<string, any>;\n ContainerError: typeof ContainerError;\n ModuleError: typeof ModuleError;\n}\n\nexport class Container {\n #initialized = false;\n protected classes = new Map<string, ClassConstructor>();\n protected _modules = new Map<ClassConstructor, any>();\n protected _errorHandler?: ErrorHandler;\n protected _notFoundHandler?: Record<HTTPMethod, RouteHandler>;\n protected dependencies: ContainerDependencies;\n protected _initiatorHandler?: InitiatorHandler;\n public readonly options: ContainerOptions;\n public containerRegistry: ContainerRegistry = new Map();\n\n constructor(dependencies: ContainerDependencies);\n constructor(initialOptions: Partial<ContainerOptions>, dependencies: ContainerDependencies);\n constructor(arg1: Partial<ContainerOptions> | ContainerDependencies, arg2?: ContainerDependencies) {\n if (typeof arg2 !== 'undefined') {\n this.options = this.buildOptions(arg1 as Partial<ContainerOptions>);\n this.dependencies = arg2;\n } else {\n this.dependencies = arg1 as ContainerDependencies;\n this.options = this.buildOptions();\n }\n }\n\n get notFoundHandler() {\n return this._notFoundHandler;\n }\n\n getRouteItems(): RouteItem[] {\n return Array.from(this.containerRegistry.values()).filter((item) => item.type === 'route').map((item) => item.item);\n }\n\n get middlewareHandler(): MahameruMiddleware | undefined {\n return this.containerRegistry.values().find((item) => item.type === 'middleware')?.item;\n }\n\n get errorHandler() {\n return this._errorHandler;\n }\n\n get protectedRoutes(): ProtectedRoute {\n return this.containerRegistry.values().find((item) => item.type === 'protected-route')?.item || [];\n }\n\n get initialized() {\n return this.#initialized;\n }\n\n get mahameruContainer(): MahameruContainer {\n const camelCaseName = (name: string) => name.charAt(0).toLowerCase() + name.slice(1);\n\n return new Proxy({} as Record<string, unknown>, {\n get: (_target, prop) => {\n if (typeof prop !== 'string')\n return undefined;\n\n for (const registry of this.containerRegistry.values()) {\n if (registry.type === 'module-service' || registry.type === 'module-controller' || registry.type === 'instance') {\n const key = camelCaseName(registry.name);\n\n if (key === prop) {\n return registry.item;\n }\n }\n }\n\n return undefined;\n }\n }) as MahameruContainer;\n\n\n // const instances = this.containerRegistry.values().find((item) => item.type === 'instance');\n\n // if (instances) {\n // (result as any) = {\n // ...result,\n // ...instances.item\n // };\n // }\n\n // return result;\n }\n\n async discover() {\n await this.loadRoutes();\n await this.loadInitiator();\n await this.loadModules();\n await this.loadMiddlewareHandler();\n await this.loadNotFoundHandlers();\n await this.loadErrorHandler();\n\n this.#initialized = true;\n }\n\n protected async loadRoutes(currentDir?: string) {\n const baseDir = this.options.routesPath;\n\n if (!currentDir)\n currentDir = baseDir;\n\n const items = await readdir(currentDir, { withFileTypes: true }).catch(error => {\n if (error.code === 'ENOENT')\n return [];\n\n throw error;\n });\n\n for (const item of items) {\n const fullPath = join(currentDir, item.name);\n\n if (item.isDirectory()) {\n await this.loadRoutes(fullPath);\n\n continue;\n }\n\n if (!item.isFile() || (!['route.js', 'route.ts'].includes(item.name)))\n continue;\n\n await this.loadSingleRoute(fullPath, currentDir, baseDir, { parentPath: item.parentPath, name: item.name })\n }\n }\n\n protected async loadSingleRoute(fullPath: string, currentDir: string, baseDir: string, item: { parentPath: string, name: string }): Promise<boolean> {\n const relativePath = relative(baseDir, currentDir);\n\n let path = '/' + relativePath.replace(/\\\\/g, '/');\n path = path.replace(/\\/+/g, '/');\n\n if (path.length > 1 && path.endsWith('/'))\n path = path.slice(0, -1);\n\n const paramNames: RouteItem['paramNames'] = [];\n const paramMatches = path.match(/\\[([^\\]]+)\\]/g);\n\n if (paramMatches)\n paramMatches.forEach((match) => {\n paramNames.push(match.slice(1, -1));\n });\n\n const escaped = path.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const regexPattern = escaped.replace(/\\\\\\[([^\\\\\\]]+)\\\\\\]/g, '([^/]+)');\n const regex = new RegExp(`^${regexPattern}$`);\n const pathFS = resolve(fullPath);\n const routeHandlers = await dynamicRequire<Record<HTTPMethod, RouteHandler>>(this.options.moduleType, fullPath, this.options.dev);\n\n if (routeHandlers) {\n this.containerRegistry.set(fullPath, {\n name: dirname(item.parentPath),\n path: fullPath,\n type: 'route',\n item: {\n paramNames: [...paramNames],\n path,\n pathFS,\n regex,\n routeHandlers\n }\n });\n\n return true;\n }\n\n return false;\n }\n\n protected async loadModules() {\n const items = await readdir(this.options.modulesPath, { withFileTypes: true }).catch(error => {\n if (error.code === 'ENOENT')\n return [];\n\n throw error;\n });\n\n for (const item of items) {\n if (!item.isDirectory())\n continue;\n\n const directory = item;\n\n let controllerPath;\n const controllerPathCandidate = [\n path.join(this.options.modulesPath, directory.name, `controller.js`),\n path.join(this.options.modulesPath, directory.name, `controller.ts`)\n ];\n\n for (const candidate of controllerPathCandidate) {\n if (await exists(candidate)) {\n controllerPath = candidate;\n break;\n }\n }\n\n if (controllerPath && await exists(controllerPath)) {\n const controllerModule = await dynamicRequire<Record<string, ClassConstructor>>(this.options.moduleType, controllerPath, this.options.dev);\n\n if (controllerModule) {\n const { name, clazz } = this.getDefaultExportClass(controllerModule, controllerPath);\n const item = new clazz(this.mahameruContainer);\n const containerRegistryID = `${controllerPath}:${name}`;\n\n if (!this.containerRegistry.has(containerRegistryID))\n this.containerRegistry.set(containerRegistryID, {\n name,\n path: controllerPath,\n type: 'module-controller',\n item\n })\n }\n }\n\n let servicePath;\n const servicePathCandidate = [\n path.join(this.options.modulesPath, directory.name, `service.js`),\n path.join(this.options.modulesPath, directory.name, `service.ts`)\n ];\n\n for (const candidate of servicePathCandidate) {\n if (await exists(candidate)) {\n servicePath = candidate;\n break;\n }\n }\n\n if (servicePath && await exists(servicePath)) {\n const serviceModule = await dynamicRequire<Record<string, ClassConstructor>>(this.options.moduleType, servicePath, this.options.dev);\n\n if (serviceModule) {\n const { name, clazz } = this.getDefaultExportClass(serviceModule, servicePath);\n const item = new clazz(this.mahameruContainer);\n const containerRegistryID = `${controllerPath}:${name}`;\n\n if (!this.containerRegistry.has(containerRegistryID))\n this.containerRegistry.set(containerRegistryID, {\n name,\n path: servicePath,\n type: 'module-service',\n item\n })\n }\n }\n }\n }\n\n protected async loadMiddlewareHandler(): Promise<boolean> {\n const middlawareHandlerPath = join(this.options.appPath, 'middleware.js');\n const result = await dynamicRequire<Record<'default' | 'protectedRoutes', MahameruMiddleware | ProtectedRoute>>(this.options.moduleType, middlawareHandlerPath, this.options.dev);\n let success = false;\n\n if (result?.default && !Array.isArray(result.default)) {\n this.containerRegistry.set(`${middlawareHandlerPath}:default`, {\n name: 'default',\n path: middlawareHandlerPath,\n type: 'middleware',\n item: result.default\n });\n\n success = true\n }\n\n if (result?.protectedRoutes && Array.isArray(result.protectedRoutes)) {\n this.containerRegistry.set(`${middlawareHandlerPath}:protectedRoutes`, {\n name: 'protectedRoutes',\n path: middlawareHandlerPath,\n type: 'protected-route',\n item: result.protectedRoutes\n });\n\n success = true\n }\n\n return success;\n }\n\n protected async loadNotFoundHandlers() {\n const notFoundHandlerPath = join(this.options.appPath, 'routes', 'not-found.js');\n\n this._notFoundHandler = await dynamicRequire<Record<HTTPMethod, RouteHandler>>(this.options.moduleType, notFoundHandlerPath, this.options.dev);\n }\n\n protected async loadErrorHandler() {\n const errorHandlerPath = join(this.options.appPath, 'error.js');\n const result = await dynamicRequire<Record<'default', ErrorHandler>>(this.options.moduleType, errorHandlerPath, this.options.dev);\n\n this._errorHandler = result?.default;\n }\n\n protected async loadInitiator() {\n const initiatorPath = join(this.options.appPath, 'initiator.js');\n const result = await dynamicRequire<Record<'default', InitiatorHandler>>(this.options.moduleType, initiatorPath, this.options.dev);\n const handler = result?.default;\n\n if (handler) {\n this._initiatorHandler = handler;\n const instances = await this._initiatorHandler();\n\n Object.keys(instances).forEach((key) => {\n this.containerRegistry.set(`${initiatorPath}:${key}`, {\n name: key,\n path: initiatorPath,\n type: 'instance',\n item: (instances as any)[key]\n })\n })\n }\n }\n\n public async onFileChanged(filePath: string): Promise<boolean> {\n filePath = filePath.endsWith('.ts') ? filePath.replace('.ts', '.js') : filePath;\n\n if (filePath.includes('\\\\src\\\\'))\n filePath = filePath.replace('\\\\src\\\\', `\\\\.mahameru\\\\`);\n\n const found = this.containerRegistry.values().find((containerItem) => containerItem.path === filePath);\n\n if (found) {\n if (found.type === 'route') {\n return await this.loadSingleRoute(filePath, dirname(filePath), this.options.routesPath, { parentPath: dirname(filePath), name: basename(filePath) });\n } else if (found.type === 'middleware' || found.type === 'protected-route') {\n return await this.loadMiddlewareHandler();\n }\n }\n\n return false;\n }\n\n protected getDefaultExportClass(module: Record<string, ClassConstructor<unknown>>, filePath: string) {\n const defaultExportName = Object.keys(module).find((key) => key === 'default');\n\n if (!defaultExportName)\n throw new this.dependencies.ModuleError(`Module in file '${filePath}' does not have a default export.`, { path: filePath, moduleName: Object.keys(module)[0] });\n\n return {\n name: module[defaultExportName].name,\n clazz: module[defaultExportName]\n };\n }\n\n protected buildOptions(initialOptions?: Partial<ContainerOptions>): ContainerOptions {\n const appPath = join(process.cwd(), '.mahameru');\n const defaultOptions: ContainerOptions = {\n appPath,\n modulesPath: join(appPath, 'modules'),\n moduleType: 'esm',\n dev: initialOptions?.dev ? true : false,\n routesPath: join(appPath, 'routes')\n };\n\n if (!initialOptions)\n return defaultOptions;\n\n return {\n ...defaultOptions,\n appPath,\n ...initialOptions\n };\n }\n}\n"],"mappings":"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","names":["path","item"]}
|
package/diatrema.d.cts
CHANGED
|
@@ -5,7 +5,7 @@ import { Route } from './route.cjs';
|
|
|
5
5
|
import { Logger } from './logger.cjs';
|
|
6
6
|
import 'node:http';
|
|
7
7
|
import './mahameru-response.cjs';
|
|
8
|
-
import './types-
|
|
8
|
+
import './types-Cd6Gkoxx.cjs';
|
|
9
9
|
import './http-server-error.cjs';
|
|
10
10
|
import './mahameru-server-error.cjs';
|
|
11
11
|
import './container-error.cjs';
|
package/diatrema.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { Route } from './route.js';
|
|
|
5
5
|
import { Logger } from './logger.js';
|
|
6
6
|
import 'node:http';
|
|
7
7
|
import './mahameru-response.js';
|
|
8
|
-
import './types-
|
|
8
|
+
import './types-BmFqDpSs.js';
|
|
9
9
|
import './http-server-error.js';
|
|
10
10
|
import './mahameru-server-error.js';
|
|
11
11
|
import './container-error.js';
|
package/helpers.d.cts
CHANGED
package/helpers.d.ts
CHANGED
package/http-server.d.cts
CHANGED
|
@@ -2,7 +2,7 @@ import { Server, IncomingMessage, ServerResponse } from 'node:http';
|
|
|
2
2
|
import { Route } from './route.cjs';
|
|
3
3
|
import { Container } from './container.cjs';
|
|
4
4
|
import { MahameruResponse } from './mahameru-response.cjs';
|
|
5
|
-
import { H as HTTPMethod, j as MahameruRequest, g as MahameruMiddleware, h as MahameruMiddlewareContext } from './types-
|
|
5
|
+
import { H as HTTPMethod, j as MahameruRequest, g as MahameruMiddleware, h as MahameruMiddlewareContext } from './types-Cd6Gkoxx.cjs';
|
|
6
6
|
import { HttpServerError } from './http-server-error.cjs';
|
|
7
7
|
import { Logger } from './logger.cjs';
|
|
8
8
|
import { MahameruServerError } from './mahameru-server-error.cjs';
|
package/http-server.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { Server, IncomingMessage, ServerResponse } from 'node:http';
|
|
|
2
2
|
import { Route } from './route.js';
|
|
3
3
|
import { Container } from './container.js';
|
|
4
4
|
import { MahameruResponse } from './mahameru-response.js';
|
|
5
|
-
import { H as HTTPMethod, j as MahameruRequest, g as MahameruMiddleware, h as MahameruMiddlewareContext } from './types-
|
|
5
|
+
import { H as HTTPMethod, j as MahameruRequest, g as MahameruMiddleware, h as MahameruMiddlewareContext } from './types-BmFqDpSs.js';
|
|
6
6
|
import { HttpServerError } from './http-server-error.js';
|
|
7
7
|
import { Logger } from './logger.js';
|
|
8
8
|
import { MahameruServerError } from './mahameru-server-error.js';
|
package/index.d.cts
CHANGED
|
@@ -6,7 +6,7 @@ export { HttpServerError } from './http-server-error.cjs';
|
|
|
6
6
|
export { HttpServer, HttpServerDependencies, HttpServerOptions } from './http-server.cjs';
|
|
7
7
|
export { Logger, createLogger } from './logger.cjs';
|
|
8
8
|
export { MahameruError } from './mahameru-error.cjs';
|
|
9
|
-
export { C as ClassConstructor, a as ContainerItem, b as ContainerItemID, c as ContainerRegistry, E as ErrorHandler, d as ErrorHandlerContext, H as HTTPMethod, e as HTTPMethodEnum, I as InitiatorHandler, f as Instances, M as MahameruContainer, g as MahameruMiddleware, h as MahameruMiddlewareContext, i as MahameruNext, j as MahameruRequest, k as Modules, P as ProtectedRoute, R as RegisterRoutes, l as RequestParams, m as RouteHandler, n as RouteHandlerContext, o as RouteHandlers, p as RouteItem, q as RouteObject } from './types-
|
|
9
|
+
export { C as ClassConstructor, a as ContainerItem, b as ContainerItemID, c as ContainerRegistry, E as ErrorHandler, d as ErrorHandlerContext, H as HTTPMethod, e as HTTPMethodEnum, I as InitiatorHandler, f as Instances, M as MahameruContainer, g as MahameruMiddleware, h as MahameruMiddlewareContext, i as MahameruNext, j as MahameruRequest, k as Modules, P as ProtectedRoute, R as RegisterRoutes, l as RequestParams, m as RouteHandler, n as RouteHandlerContext, o as RouteHandlers, p as RouteItem, q as RouteObject } from './types-Cd6Gkoxx.cjs';
|
|
10
10
|
export { MahameruResponse } from './mahameru-response.cjs';
|
|
11
11
|
export { MahameruServerError } from './mahameru-server-error.cjs';
|
|
12
12
|
export { ModuleError } from './module-error.cjs';
|
package/index.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export { HttpServerError } from './http-server-error.js';
|
|
|
6
6
|
export { HttpServer, HttpServerDependencies, HttpServerOptions } from './http-server.js';
|
|
7
7
|
export { Logger, createLogger } from './logger.js';
|
|
8
8
|
export { MahameruError } from './mahameru-error.js';
|
|
9
|
-
export { C as ClassConstructor, a as ContainerItem, b as ContainerItemID, c as ContainerRegistry, E as ErrorHandler, d as ErrorHandlerContext, H as HTTPMethod, e as HTTPMethodEnum, I as InitiatorHandler, f as Instances, M as MahameruContainer, g as MahameruMiddleware, h as MahameruMiddlewareContext, i as MahameruNext, j as MahameruRequest, k as Modules, P as ProtectedRoute, R as RegisterRoutes, l as RequestParams, m as RouteHandler, n as RouteHandlerContext, o as RouteHandlers, p as RouteItem, q as RouteObject } from './types-
|
|
9
|
+
export { C as ClassConstructor, a as ContainerItem, b as ContainerItemID, c as ContainerRegistry, E as ErrorHandler, d as ErrorHandlerContext, H as HTTPMethod, e as HTTPMethodEnum, I as InitiatorHandler, f as Instances, M as MahameruContainer, g as MahameruMiddleware, h as MahameruMiddlewareContext, i as MahameruNext, j as MahameruRequest, k as Modules, P as ProtectedRoute, R as RegisterRoutes, l as RequestParams, m as RouteHandler, n as RouteHandlerContext, o as RouteHandlers, p as RouteItem, q as RouteObject } from './types-BmFqDpSs.js';
|
|
10
10
|
export { MahameruResponse } from './mahameru-response.js';
|
|
11
11
|
export { MahameruServerError } from './mahameru-server-error.js';
|
|
12
12
|
export { ModuleError } from './module-error.js';
|
package/mahameru-request.d.cts
CHANGED
package/mahameru-request.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mahameru/diatrema",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.1",
|
|
4
4
|
"description": "The core engine of MahameruJS. Just like a volcanic diatreme, it serves as the essential conduit that powers and drives the entire framework ecosystem.",
|
|
5
5
|
"main": "./index.cjs",
|
|
6
6
|
"module": "./index.js",
|
package/route.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { p as RouteItem, j as MahameruRequest, H as HTTPMethod } from './types-
|
|
1
|
+
import { p as RouteItem, j as MahameruRequest, H as HTTPMethod } from './types-Cd6Gkoxx.cjs';
|
|
2
2
|
import { MahameruResponse } from './mahameru-response.cjs';
|
|
3
3
|
import { Container } from './container.cjs';
|
|
4
4
|
import { HttpServerError } from './http-server-error.cjs';
|
package/route.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { p as RouteItem, j as MahameruRequest, H as HTTPMethod } from './types-
|
|
1
|
+
import { p as RouteItem, j as MahameruRequest, H as HTTPMethod } from './types-BmFqDpSs.js';
|
|
2
2
|
import { MahameruResponse } from './mahameru-response.js';
|
|
3
3
|
import { Container } from './container.js';
|
|
4
4
|
import { HttpServerError } from './http-server-error.js';
|
|
@@ -101,6 +101,11 @@ type ContainerItem = {
|
|
|
101
101
|
path: string;
|
|
102
102
|
type: 'middleware';
|
|
103
103
|
item: MahameruMiddleware;
|
|
104
|
+
} | {
|
|
105
|
+
name: string;
|
|
106
|
+
path: string;
|
|
107
|
+
type: 'protected-route';
|
|
108
|
+
item: ProtectedRoute;
|
|
104
109
|
};
|
|
105
110
|
type ContainerRegistry = Map<ContainerItemID, ContainerItem>;
|
|
106
111
|
type InitiatorHandler = () => Promise<Instances>;
|
|
@@ -101,6 +101,11 @@ type ContainerItem = {
|
|
|
101
101
|
path: string;
|
|
102
102
|
type: 'middleware';
|
|
103
103
|
item: MahameruMiddleware;
|
|
104
|
+
} | {
|
|
105
|
+
name: string;
|
|
106
|
+
path: string;
|
|
107
|
+
type: 'protected-route';
|
|
108
|
+
item: ProtectedRoute;
|
|
104
109
|
};
|
|
105
110
|
type ContainerRegistry = Map<ContainerItemID, ContainerItem>;
|
|
106
111
|
type InitiatorHandler = () => Promise<Instances>;
|
package/types.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { MahameruRequest } from \"./mahameru-request\";\r\nimport type { MahameruResponse } from \"./mahameru-response\";\r\n\r\nexport enum HTTPMethodEnum {\r\n GET = 'GET',\r\n HEAD = 'HEAD',\r\n POST = 'POST',\r\n PUT = 'PUT',\r\n DELETE = 'DELETE',\r\n CONNECT = 'CONNECT',\r\n OPTIONS = 'OPTIONS',\r\n TRACE = 'TRACE',\r\n PATCH = 'PATCH'\r\n}\r\n\r\nexport type HTTPMethod = `${HTTPMethodEnum}`\r\n\r\nexport type RouteObject<T extends string = string> = {\r\n path: T;\r\n methods: HTTPMethod[];\r\n};\r\n\r\nexport interface RegisterRoutes { }\r\n\r\nexport type ProtectedRoute = RegisterRoutes extends { routes: infer R }\r\n ? R[]\r\n : (string | RouteObject<string>)[];\r\n\r\nexport type RequestParams = {\r\n [key: string]: string;\r\n};\r\nexport type RouteHandlerContext = { params: RequestParams };\r\n\r\nexport type RouteHandler = (\r\n request: MahameruRequest,\r\n container: MahameruContainer,\r\n context: RouteHandlerContext\r\n) => Promise<MahameruResponse> | MahameruResponse;\r\n\r\nexport interface RouteItem {\r\n path: string;\r\n regex: RegExp;\r\n paramNames: (keyof RequestParams)[];\r\n routeHandlers: RouteHandlers;\r\n pathFS: string;\r\n}\r\n\r\nexport type RouteHandlers = Record<HTTPMethod, RouteHandler>;\r\n\r\nexport type MahameruNext = () => Promise<MahameruResponse>;\r\n\r\nexport interface MahameruMiddlewareContext {\r\n request: MahameruRequest;\r\n container: MahameruContainer;\r\n params: Record<string, string>;\r\n path: string;\r\n method: HTTPMethod;\r\n status: number;\r\n}\r\n\r\nexport type MahameruMiddleware = (context: MahameruMiddlewareContext, isProtectedRoute: boolean, next: MahameruNext) =>\r\n Promise<MahameruResponse> | MahameruResponse;\r\n\r\nexport type ErrorHandlerContext = MahameruMiddlewareContext & { error: unknown };\r\n\r\nexport type ErrorHandler = (context: ErrorHandlerContext, next: MahameruNext) =>\r\n Promise<MahameruResponse> | MahameruResponse;\r\n\r\nexport interface Modules { }\r\nexport interface Instances { }\r\nexport interface MahameruContainer extends Modules, Instances { }\r\n\r\nexport type ClassConstructor<T = unknown> = new (mahameruContainer: MahameruContainer) => T;\r\n\r\nexport type ContainerItemID = string\r\nexport type ContainerItem =\r\n | { name: string; path: string; type: 'module-service'; item: unknown }\r\n | { name: string; path: string; type: 'module-controller'; item: unknown }\r\n | { name: string; path: string; type: 'route'; item: RouteItem }\r\n | { name: string; path: string; type: 'instance'; item: Instances }\r\n | { name: string; path: string; type: 'middleware'; item: MahameruMiddleware };\r\n\r\nexport type ContainerRegistry = Map<ContainerItemID, ContainerItem>;\r\nexport type InitiatorHandler = () => Promise<Instances>;\r\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGO,IAAK,iBAAL,kBAAKA,oBAAL;AACH,EAAAA,gBAAA,SAAM;AACN,EAAAA,gBAAA,UAAO;AACP,EAAAA,gBAAA,UAAO;AACP,EAAAA,gBAAA,SAAM;AACN,EAAAA,gBAAA,YAAS;AACT,EAAAA,gBAAA,aAAU;AACV,EAAAA,gBAAA,aAAU;AACV,EAAAA,gBAAA,WAAQ;AACR,EAAAA,gBAAA,WAAQ;AATA,SAAAA;AAAA,GAAA;","names":["HTTPMethodEnum"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { MahameruRequest } from \"./mahameru-request\";\r\nimport type { MahameruResponse } from \"./mahameru-response\";\r\n\r\nexport enum HTTPMethodEnum {\r\n GET = 'GET',\r\n HEAD = 'HEAD',\r\n POST = 'POST',\r\n PUT = 'PUT',\r\n DELETE = 'DELETE',\r\n CONNECT = 'CONNECT',\r\n OPTIONS = 'OPTIONS',\r\n TRACE = 'TRACE',\r\n PATCH = 'PATCH'\r\n}\r\n\r\nexport type HTTPMethod = `${HTTPMethodEnum}`\r\n\r\nexport type RouteObject<T extends string = string> = {\r\n path: T;\r\n methods: HTTPMethod[];\r\n};\r\n\r\nexport interface RegisterRoutes { }\r\n\r\nexport type ProtectedRoute = RegisterRoutes extends { routes: infer R }\r\n ? R[]\r\n : (string | RouteObject<string>)[];\r\n\r\nexport type RequestParams = {\r\n [key: string]: string;\r\n};\r\nexport type RouteHandlerContext = { params: RequestParams };\r\n\r\nexport type RouteHandler = (\r\n request: MahameruRequest,\r\n container: MahameruContainer,\r\n context: RouteHandlerContext\r\n) => Promise<MahameruResponse> | MahameruResponse;\r\n\r\nexport interface RouteItem {\r\n path: string;\r\n regex: RegExp;\r\n paramNames: (keyof RequestParams)[];\r\n routeHandlers: RouteHandlers;\r\n pathFS: string;\r\n}\r\n\r\nexport type RouteHandlers = Record<HTTPMethod, RouteHandler>;\r\n\r\nexport type MahameruNext = () => Promise<MahameruResponse>;\r\n\r\nexport interface MahameruMiddlewareContext {\r\n request: MahameruRequest;\r\n container: MahameruContainer;\r\n params: Record<string, string>;\r\n path: string;\r\n method: HTTPMethod;\r\n status: number;\r\n}\r\n\r\nexport type MahameruMiddleware = (context: MahameruMiddlewareContext, isProtectedRoute: boolean, next: MahameruNext) =>\r\n Promise<MahameruResponse> | MahameruResponse;\r\n\r\nexport type ErrorHandlerContext = MahameruMiddlewareContext & { error: unknown };\r\n\r\nexport type ErrorHandler = (context: ErrorHandlerContext, next: MahameruNext) =>\r\n Promise<MahameruResponse> | MahameruResponse;\r\n\r\nexport interface Modules { }\r\nexport interface Instances { }\r\nexport interface MahameruContainer extends Modules, Instances { }\r\n\r\nexport type ClassConstructor<T = unknown> = new (mahameruContainer: MahameruContainer) => T;\r\n\r\nexport type ContainerItemID = string\r\nexport type ContainerItem =\r\n | { name: string; path: string; type: 'module-service'; item: unknown }\r\n | { name: string; path: string; type: 'module-controller'; item: unknown }\r\n | { name: string; path: string; type: 'route'; item: RouteItem }\r\n | { name: string; path: string; type: 'instance'; item: Instances }\r\n | { name: string; path: string; type: 'middleware'; item: MahameruMiddleware }\r\n | { name: string; path: string; type: 'protected-route'; item: ProtectedRoute };\r\n\r\nexport type ContainerRegistry = Map<ContainerItemID, ContainerItem>;\r\nexport type InitiatorHandler = () => Promise<Instances>;\r\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGO,IAAK,iBAAL,kBAAKA,oBAAL;AACH,EAAAA,gBAAA,SAAM;AACN,EAAAA,gBAAA,UAAO;AACP,EAAAA,gBAAA,UAAO;AACP,EAAAA,gBAAA,SAAM;AACN,EAAAA,gBAAA,YAAS;AACT,EAAAA,gBAAA,aAAU;AACV,EAAAA,gBAAA,aAAU;AACV,EAAAA,gBAAA,WAAQ;AACR,EAAAA,gBAAA,WAAQ;AATA,SAAAA;AAAA,GAAA;","names":["HTTPMethodEnum"]}
|
package/types.d.cts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { C as ClassConstructor, a as ContainerItem, b as ContainerItemID, c as ContainerRegistry, E as ErrorHandler, d as ErrorHandlerContext, H as HTTPMethod, e as HTTPMethodEnum, I as InitiatorHandler, f as Instances, M as MahameruContainer, g as MahameruMiddleware, h as MahameruMiddlewareContext, i as MahameruNext, k as Modules, P as ProtectedRoute, R as RegisterRoutes, l as RequestParams, m as RouteHandler, n as RouteHandlerContext, o as RouteHandlers, p as RouteItem, q as RouteObject } from './types-
|
|
1
|
+
export { C as ClassConstructor, a as ContainerItem, b as ContainerItemID, c as ContainerRegistry, E as ErrorHandler, d as ErrorHandlerContext, H as HTTPMethod, e as HTTPMethodEnum, I as InitiatorHandler, f as Instances, M as MahameruContainer, g as MahameruMiddleware, h as MahameruMiddlewareContext, i as MahameruNext, k as Modules, P as ProtectedRoute, R as RegisterRoutes, l as RequestParams, m as RouteHandler, n as RouteHandlerContext, o as RouteHandlers, p as RouteItem, q as RouteObject } from './types-Cd6Gkoxx.cjs';
|
|
2
2
|
import './mahameru-response.cjs';
|
|
3
3
|
import 'node:http';
|
package/types.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { C as ClassConstructor, a as ContainerItem, b as ContainerItemID, c as ContainerRegistry, E as ErrorHandler, d as ErrorHandlerContext, H as HTTPMethod, e as HTTPMethodEnum, I as InitiatorHandler, f as Instances, M as MahameruContainer, g as MahameruMiddleware, h as MahameruMiddlewareContext, i as MahameruNext, k as Modules, P as ProtectedRoute, R as RegisterRoutes, l as RequestParams, m as RouteHandler, n as RouteHandlerContext, o as RouteHandlers, p as RouteItem, q as RouteObject } from './types-
|
|
1
|
+
export { C as ClassConstructor, a as ContainerItem, b as ContainerItemID, c as ContainerRegistry, E as ErrorHandler, d as ErrorHandlerContext, H as HTTPMethod, e as HTTPMethodEnum, I as InitiatorHandler, f as Instances, M as MahameruContainer, g as MahameruMiddleware, h as MahameruMiddlewareContext, i as MahameruNext, k as Modules, P as ProtectedRoute, R as RegisterRoutes, l as RequestParams, m as RouteHandler, n as RouteHandlerContext, o as RouteHandlers, p as RouteItem, q as RouteObject } from './types-BmFqDpSs.js';
|
|
2
2
|
import './mahameru-response.js';
|
|
3
3
|
import 'node:http';
|
package/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { MahameruRequest } from \"./mahameru-request\";\r\nimport type { MahameruResponse } from \"./mahameru-response\";\r\n\r\nexport enum HTTPMethodEnum {\r\n GET = 'GET',\r\n HEAD = 'HEAD',\r\n POST = 'POST',\r\n PUT = 'PUT',\r\n DELETE = 'DELETE',\r\n CONNECT = 'CONNECT',\r\n OPTIONS = 'OPTIONS',\r\n TRACE = 'TRACE',\r\n PATCH = 'PATCH'\r\n}\r\n\r\nexport type HTTPMethod = `${HTTPMethodEnum}`\r\n\r\nexport type RouteObject<T extends string = string> = {\r\n path: T;\r\n methods: HTTPMethod[];\r\n};\r\n\r\nexport interface RegisterRoutes { }\r\n\r\nexport type ProtectedRoute = RegisterRoutes extends { routes: infer R }\r\n ? R[]\r\n : (string | RouteObject<string>)[];\r\n\r\nexport type RequestParams = {\r\n [key: string]: string;\r\n};\r\nexport type RouteHandlerContext = { params: RequestParams };\r\n\r\nexport type RouteHandler = (\r\n request: MahameruRequest,\r\n container: MahameruContainer,\r\n context: RouteHandlerContext\r\n) => Promise<MahameruResponse> | MahameruResponse;\r\n\r\nexport interface RouteItem {\r\n path: string;\r\n regex: RegExp;\r\n paramNames: (keyof RequestParams)[];\r\n routeHandlers: RouteHandlers;\r\n pathFS: string;\r\n}\r\n\r\nexport type RouteHandlers = Record<HTTPMethod, RouteHandler>;\r\n\r\nexport type MahameruNext = () => Promise<MahameruResponse>;\r\n\r\nexport interface MahameruMiddlewareContext {\r\n request: MahameruRequest;\r\n container: MahameruContainer;\r\n params: Record<string, string>;\r\n path: string;\r\n method: HTTPMethod;\r\n status: number;\r\n}\r\n\r\nexport type MahameruMiddleware = (context: MahameruMiddlewareContext, isProtectedRoute: boolean, next: MahameruNext) =>\r\n Promise<MahameruResponse> | MahameruResponse;\r\n\r\nexport type ErrorHandlerContext = MahameruMiddlewareContext & { error: unknown };\r\n\r\nexport type ErrorHandler = (context: ErrorHandlerContext, next: MahameruNext) =>\r\n Promise<MahameruResponse> | MahameruResponse;\r\n\r\nexport interface Modules { }\r\nexport interface Instances { }\r\nexport interface MahameruContainer extends Modules, Instances { }\r\n\r\nexport type ClassConstructor<T = unknown> = new (mahameruContainer: MahameruContainer) => T;\r\n\r\nexport type ContainerItemID = string\r\nexport type ContainerItem =\r\n | { name: string; path: string; type: 'module-service'; item: unknown }\r\n | { name: string; path: string; type: 'module-controller'; item: unknown }\r\n | { name: string; path: string; type: 'route'; item: RouteItem }\r\n | { name: string; path: string; type: 'instance'; item: Instances }\r\n | { name: string; path: string; type: 'middleware'; item: MahameruMiddleware };\r\n\r\nexport type ContainerRegistry = Map<ContainerItemID, ContainerItem>;\r\nexport type InitiatorHandler = () => Promise<Instances>;\r\n"],"mappings":"AAGO,IAAK,iBAAL,kBAAKA,oBAAL;AACH,EAAAA,gBAAA,SAAM;AACN,EAAAA,gBAAA,UAAO;AACP,EAAAA,gBAAA,UAAO;AACP,EAAAA,gBAAA,SAAM;AACN,EAAAA,gBAAA,YAAS;AACT,EAAAA,gBAAA,aAAU;AACV,EAAAA,gBAAA,aAAU;AACV,EAAAA,gBAAA,WAAQ;AACR,EAAAA,gBAAA,WAAQ;AATA,SAAAA;AAAA,GAAA;","names":["HTTPMethodEnum"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { MahameruRequest } from \"./mahameru-request\";\r\nimport type { MahameruResponse } from \"./mahameru-response\";\r\n\r\nexport enum HTTPMethodEnum {\r\n GET = 'GET',\r\n HEAD = 'HEAD',\r\n POST = 'POST',\r\n PUT = 'PUT',\r\n DELETE = 'DELETE',\r\n CONNECT = 'CONNECT',\r\n OPTIONS = 'OPTIONS',\r\n TRACE = 'TRACE',\r\n PATCH = 'PATCH'\r\n}\r\n\r\nexport type HTTPMethod = `${HTTPMethodEnum}`\r\n\r\nexport type RouteObject<T extends string = string> = {\r\n path: T;\r\n methods: HTTPMethod[];\r\n};\r\n\r\nexport interface RegisterRoutes { }\r\n\r\nexport type ProtectedRoute = RegisterRoutes extends { routes: infer R }\r\n ? R[]\r\n : (string | RouteObject<string>)[];\r\n\r\nexport type RequestParams = {\r\n [key: string]: string;\r\n};\r\nexport type RouteHandlerContext = { params: RequestParams };\r\n\r\nexport type RouteHandler = (\r\n request: MahameruRequest,\r\n container: MahameruContainer,\r\n context: RouteHandlerContext\r\n) => Promise<MahameruResponse> | MahameruResponse;\r\n\r\nexport interface RouteItem {\r\n path: string;\r\n regex: RegExp;\r\n paramNames: (keyof RequestParams)[];\r\n routeHandlers: RouteHandlers;\r\n pathFS: string;\r\n}\r\n\r\nexport type RouteHandlers = Record<HTTPMethod, RouteHandler>;\r\n\r\nexport type MahameruNext = () => Promise<MahameruResponse>;\r\n\r\nexport interface MahameruMiddlewareContext {\r\n request: MahameruRequest;\r\n container: MahameruContainer;\r\n params: Record<string, string>;\r\n path: string;\r\n method: HTTPMethod;\r\n status: number;\r\n}\r\n\r\nexport type MahameruMiddleware = (context: MahameruMiddlewareContext, isProtectedRoute: boolean, next: MahameruNext) =>\r\n Promise<MahameruResponse> | MahameruResponse;\r\n\r\nexport type ErrorHandlerContext = MahameruMiddlewareContext & { error: unknown };\r\n\r\nexport type ErrorHandler = (context: ErrorHandlerContext, next: MahameruNext) =>\r\n Promise<MahameruResponse> | MahameruResponse;\r\n\r\nexport interface Modules { }\r\nexport interface Instances { }\r\nexport interface MahameruContainer extends Modules, Instances { }\r\n\r\nexport type ClassConstructor<T = unknown> = new (mahameruContainer: MahameruContainer) => T;\r\n\r\nexport type ContainerItemID = string\r\nexport type ContainerItem =\r\n | { name: string; path: string; type: 'module-service'; item: unknown }\r\n | { name: string; path: string; type: 'module-controller'; item: unknown }\r\n | { name: string; path: string; type: 'route'; item: RouteItem }\r\n | { name: string; path: string; type: 'instance'; item: Instances }\r\n | { name: string; path: string; type: 'middleware'; item: MahameruMiddleware }\r\n | { name: string; path: string; type: 'protected-route'; item: ProtectedRoute };\r\n\r\nexport type ContainerRegistry = Map<ContainerItemID, ContainerItem>;\r\nexport type InitiatorHandler = () => Promise<Instances>;\r\n"],"mappings":"AAGO,IAAK,iBAAL,kBAAKA,oBAAL;AACH,EAAAA,gBAAA,SAAM;AACN,EAAAA,gBAAA,UAAO;AACP,EAAAA,gBAAA,UAAO;AACP,EAAAA,gBAAA,SAAM;AACN,EAAAA,gBAAA,YAAS;AACT,EAAAA,gBAAA,aAAU;AACV,EAAAA,gBAAA,aAAU;AACV,EAAAA,gBAAA,WAAQ;AACR,EAAAA,gBAAA,WAAQ;AATA,SAAAA;AAAA,GAAA;","names":["HTTPMethodEnum"]}
|