@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 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._protectedRoutes;
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
- const containerID = `${middlawareHandlerPath}:default`;
229
- if (!this.containerRegistry.has(containerID) && result?.default)
230
- this.containerRegistry.set(containerID, {
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?.default
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
- module2 = await (0, import_helpers.dynamicRequire)(this.options.moduleType, filePath, this.options.dev);
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(): (string | RouteObject<string>)[];
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<void>;
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(): (string | RouteObject<string>)[];
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<void>;
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._protectedRoutes;
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
- const containerID = `${middlawareHandlerPath}:default`;
197
- if (!this.containerRegistry.has(containerID) && result?.default)
198
- this.containerRegistry.set(containerID, {
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?.default
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
- module = await dynamicRequire(this.options.moduleType, filePath, this.options.dev);
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-CipcRmc9.cjs';
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-BRwWYiUN.js';
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
@@ -1,4 +1,4 @@
1
- import { P as ProtectedRoute } from './types-CipcRmc9.cjs';
1
+ import { P as ProtectedRoute } from './types-Cd6Gkoxx.cjs';
2
2
  import 'node:http';
3
3
  import './mahameru-response.cjs';
4
4
 
package/helpers.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { P as ProtectedRoute } from './types-BRwWYiUN.js';
1
+ import { P as ProtectedRoute } from './types-BmFqDpSs.js';
2
2
  import 'node:http';
3
3
  import './mahameru-response.js';
4
4
 
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-CipcRmc9.cjs';
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-BRwWYiUN.js';
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-CipcRmc9.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-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-BRwWYiUN.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-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';
@@ -1,3 +1,3 @@
1
1
  import 'node:http';
2
- export { j as MahameruRequest } from './types-CipcRmc9.cjs';
2
+ export { j as MahameruRequest } from './types-Cd6Gkoxx.cjs';
3
3
  import './mahameru-response.cjs';
@@ -1,3 +1,3 @@
1
1
  import 'node:http';
2
- export { j as MahameruRequest } from './types-BRwWYiUN.js';
2
+ export { j as MahameruRequest } from './types-BmFqDpSs.js';
3
3
  import './mahameru-response.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mahameru/diatrema",
3
- "version": "0.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-CipcRmc9.cjs';
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-BRwWYiUN.js';
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-CipcRmc9.cjs';
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-BRwWYiUN.js';
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"]}