nural 0.3.0 → 0.3.2

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.
@@ -15,7 +15,7 @@ var fs__default = /*#__PURE__*/_interopDefault(fs);
15
15
  var path__default = /*#__PURE__*/_interopDefault(path);
16
16
 
17
17
  var program = new commander.Command();
18
- program.name("nural").description("Nural Framework CLI").version("0.3.0");
18
+ program.name("nural").description("Nural Framework CLI").version("0.3.2");
19
19
  program.command("new <project-name>").description("Create a new Nural project").action(async (projectName) => {
20
20
  const projectPath = path__default.default.join(process.cwd(), projectName);
21
21
  if (fs__default.default.existsSync(projectPath)) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts"],"names":["Command","path","fs","chalk","inquirer"],"mappings":"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","file":"index.cjs","sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport inquirer from \"inquirer\";\nimport chalk from \"chalk\";\nimport fs from \"fs-extra\";\nimport path from \"path\";\n\nconst program = new Command();\n\nprogram.name(\"nural\").description(\"Nural Framework CLI\").version(\"0.3.0\");\n\nprogram\n .command(\"new <project-name>\")\n .description(\"Create a new Nural project\")\n .action(async (projectName) => {\n const projectPath = path.join(process.cwd(), projectName);\n\n if (fs.existsSync(projectPath)) {\n console.error(\n chalk.red(`Error: Directory ${projectName} already exists.`),\n );\n process.exit(1);\n }\n\n const { framework } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"framework\",\n message: \"Select a framework:\",\n choices: [\"express\", \"fastify\"],\n default: \"express\",\n },\n ]);\n\n console.log(\n chalk.blue(`\\nInitializing new Nural project in ${projectName}...`),\n );\n\n // Create directories\n fs.ensureDirSync(path.join(projectPath, \"src/config\"));\n fs.ensureDirSync(path.join(projectPath, \"src/routes\"));\n fs.ensureDirSync(path.join(projectPath, \"src/middleware\"));\n fs.ensureDirSync(path.join(projectPath, \"src/services\"));\n\n // Create package.json\n const packageJson = {\n name: projectName,\n version: \"1.0.0\",\n main: \"dist/index.js\",\n scripts: {\n dev: \"tsx watch src/index.ts\",\n build: \"tsup src/index.ts --format cjs,esm --dts\",\n start: \"node dist/index.js\",\n },\n dependencies: {\n nural: \"^0.2.0\",\n [framework]: framework === \"express\" ? \"^5.0.0\" : \"^5.0.0\", // Using explicit versions for peer deps\n zod: \"^3.22.4\",\n },\n devDependencies: {\n tsx: \"^4.7.1\",\n tsup: \"^8.0.2\",\n typescript: \"^5.3.3\",\n \"@types/node\": \"^20.11.24\",\n ...(framework === \"express\" ? { \"@types/express\": \"^5.0.0\" } : {}),\n },\n };\n\n fs.writeJsonSync(path.join(projectPath, \"package.json\"), packageJson, {\n spaces: 2,\n });\n\n // Create tsconfig.json\n const tsconfig = {\n compilerOptions: {\n target: \"ES2020\",\n module: \"CommonJS\",\n moduleResolution: \"node\",\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n forceConsistentCasingInFileNames: true,\n outDir: \"./dist\",\n },\n include: [\"src/**/*\"],\n exclude: [\"node_modules\"],\n };\n\n fs.writeJsonSync(path.join(projectPath, \"tsconfig.json\"), tsconfig, {\n spaces: 2,\n });\n\n // Create src/index.ts\n const indexContent = `import { Nural } from \"nural\";\nimport { appConfig } from \"./config/app.config\";\n\nconst app = new Nural(appConfig);\n\napp.start(3000).then(() => {\n console.log(\"Server is running on http://localhost:3000\");\n});\n`;\n fs.writeFileSync(path.join(projectPath, \"src/index.ts\"), indexContent);\n\n // Create src/config/app.config.ts\n const configContent = `import { NuralConfig } from \"nural\";\n\nexport const appConfig: NuralConfig = {\n framework: \"${framework}\",\n docs: true,\n logger: {\n enabled: true,\n },\n};\n`;\n fs.writeFileSync(\n path.join(projectPath, \"src/config/app.config.ts\"),\n configContent,\n );\n\n console.log(\n chalk.green(`\\n✔ Project ${projectName} created successfully!`),\n );\n console.log(chalk.white(`\\nNext steps:`));\n console.log(chalk.cyan(` cd ${projectName}`));\n console.log(chalk.cyan(` npm install`));\n console.log(chalk.cyan(` npm run dev`));\n });\n\nprogram\n .command(\"generate <type> <name>\")\n .alias(\"g\")\n .description(\"Generate a resource (route, middleware, service)\")\n .action((typeArg, nameArg) => {\n const type = typeArg.toLowerCase();\n const name = nameArg.toLowerCase();\n const srcDir = path.join(process.cwd(), \"src\");\n\n if (!fs.existsSync(srcDir)) {\n console.error(\n chalk.red(\n \"Error: src directory not found. Are you in a Nural project root?\",\n ),\n );\n process.exit(1);\n }\n\n const capitalize = (s: string) => s.charAt(0).toUpperCase() + s.slice(1);\n\n switch (type) {\n case \"route\": {\n const routeContent = `import { createRoute, z } from \"nural\";\n\nexport const ${name}Route = createRoute({\n method: \"GET\",\n path: \"/${name}\",\n summary: \"${capitalize(name)} route\",\n responses: {\n 200: z.object({ message: z.string() }),\n },\n handler: async () => {\n return { message: \"Hello from ${name}\" };\n },\n});\n`;\n const routesDir = path.join(srcDir, \"routes\");\n fs.ensureDirSync(routesDir);\n fs.writeFileSync(\n path.join(routesDir, `${name}.routes.ts`),\n routeContent,\n );\n console.log(chalk.green(`Created src/routes/${name}.routes.ts`));\n break;\n }\n case \"middleware\": {\n const middlewareContent = `import { defineMiddleware } from \"nural\";\n\nexport const ${name}Middleware = defineMiddleware(async (req, res) => {\n // TODO: Implement middleware logic\n return { ${name}: true };\n});\n`;\n const middlewareDir = path.join(srcDir, \"middleware\");\n fs.ensureDirSync(middlewareDir);\n fs.writeFileSync(\n path.join(middlewareDir, `${name}.middleware.ts`),\n middlewareContent,\n );\n console.log(\n chalk.green(`Created src/middleware/${name}.middleware.ts`),\n );\n break;\n }\n case \"service\": {\n const serviceContent = `export class ${capitalize(name)}Service {\n constructor() {}\n\n async findAll() {\n return [];\n }\n}\n\nexport const ${name}Service = new ${capitalize(name)}Service();\n`;\n const servicesDir = path.join(srcDir, \"services\");\n fs.ensureDirSync(servicesDir);\n fs.writeFileSync(\n path.join(servicesDir, `${name}.service.ts`),\n serviceContent,\n );\n console.log(chalk.green(`Created src/services/${name}.service.ts`));\n break;\n }\n default:\n console.error(\n chalk.red(\n `Unknown type: ${type}. Supported: route, middleware, service`,\n ),\n );\n process.exit(1);\n }\n });\n\nprogram.parse(process.argv);\n"]}
1
+ {"version":3,"sources":["../../src/cli/index.ts"],"names":["Command","path","fs","chalk","inquirer"],"mappings":"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","file":"index.cjs","sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport inquirer from \"inquirer\";\nimport chalk from \"chalk\";\nimport fs from \"fs-extra\";\nimport path from \"path\";\n\nconst program = new Command();\n\nprogram.name(\"nural\").description(\"Nural Framework CLI\").version(\"0.3.2\");\n\nprogram\n .command(\"new <project-name>\")\n .description(\"Create a new Nural project\")\n .action(async (projectName) => {\n const projectPath = path.join(process.cwd(), projectName);\n\n if (fs.existsSync(projectPath)) {\n console.error(\n chalk.red(`Error: Directory ${projectName} already exists.`),\n );\n process.exit(1);\n }\n\n const { framework } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"framework\",\n message: \"Select a framework:\",\n choices: [\"express\", \"fastify\"],\n default: \"express\",\n },\n ]);\n\n console.log(\n chalk.blue(`\\nInitializing new Nural project in ${projectName}...`),\n );\n\n // Create directories\n fs.ensureDirSync(path.join(projectPath, \"src/config\"));\n fs.ensureDirSync(path.join(projectPath, \"src/routes\"));\n fs.ensureDirSync(path.join(projectPath, \"src/middleware\"));\n fs.ensureDirSync(path.join(projectPath, \"src/services\"));\n\n // Create package.json\n const packageJson = {\n name: projectName,\n version: \"1.0.0\",\n main: \"dist/index.js\",\n scripts: {\n dev: \"tsx watch src/index.ts\",\n build: \"tsup src/index.ts --format cjs,esm --dts\",\n start: \"node dist/index.js\",\n },\n dependencies: {\n nural: \"^0.2.0\",\n [framework]: framework === \"express\" ? \"^5.0.0\" : \"^5.0.0\", // Using explicit versions for peer deps\n zod: \"^3.22.4\",\n },\n devDependencies: {\n tsx: \"^4.7.1\",\n tsup: \"^8.0.2\",\n typescript: \"^5.3.3\",\n \"@types/node\": \"^20.11.24\",\n ...(framework === \"express\" ? { \"@types/express\": \"^5.0.0\" } : {}),\n },\n };\n\n fs.writeJsonSync(path.join(projectPath, \"package.json\"), packageJson, {\n spaces: 2,\n });\n\n // Create tsconfig.json\n const tsconfig = {\n compilerOptions: {\n target: \"ES2020\",\n module: \"CommonJS\",\n moduleResolution: \"node\",\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n forceConsistentCasingInFileNames: true,\n outDir: \"./dist\",\n },\n include: [\"src/**/*\"],\n exclude: [\"node_modules\"],\n };\n\n fs.writeJsonSync(path.join(projectPath, \"tsconfig.json\"), tsconfig, {\n spaces: 2,\n });\n\n // Create src/index.ts\n const indexContent = `import { Nural } from \"nural\";\nimport { appConfig } from \"./config/app.config\";\n\nconst app = new Nural(appConfig);\n\napp.start(3000).then(() => {\n console.log(\"Server is running on http://localhost:3000\");\n});\n`;\n fs.writeFileSync(path.join(projectPath, \"src/index.ts\"), indexContent);\n\n // Create src/config/app.config.ts\n const configContent = `import { NuralConfig } from \"nural\";\n\nexport const appConfig: NuralConfig = {\n framework: \"${framework}\",\n docs: true,\n logger: {\n enabled: true,\n },\n};\n`;\n fs.writeFileSync(\n path.join(projectPath, \"src/config/app.config.ts\"),\n configContent,\n );\n\n console.log(\n chalk.green(`\\n✔ Project ${projectName} created successfully!`),\n );\n console.log(chalk.white(`\\nNext steps:`));\n console.log(chalk.cyan(` cd ${projectName}`));\n console.log(chalk.cyan(` npm install`));\n console.log(chalk.cyan(` npm run dev`));\n });\n\nprogram\n .command(\"generate <type> <name>\")\n .alias(\"g\")\n .description(\"Generate a resource (route, middleware, service)\")\n .action((typeArg, nameArg) => {\n const type = typeArg.toLowerCase();\n const name = nameArg.toLowerCase();\n const srcDir = path.join(process.cwd(), \"src\");\n\n if (!fs.existsSync(srcDir)) {\n console.error(\n chalk.red(\n \"Error: src directory not found. Are you in a Nural project root?\",\n ),\n );\n process.exit(1);\n }\n\n const capitalize = (s: string) => s.charAt(0).toUpperCase() + s.slice(1);\n\n switch (type) {\n case \"route\": {\n const routeContent = `import { createRoute, z } from \"nural\";\n\nexport const ${name}Route = createRoute({\n method: \"GET\",\n path: \"/${name}\",\n summary: \"${capitalize(name)} route\",\n responses: {\n 200: z.object({ message: z.string() }),\n },\n handler: async () => {\n return { message: \"Hello from ${name}\" };\n },\n});\n`;\n const routesDir = path.join(srcDir, \"routes\");\n fs.ensureDirSync(routesDir);\n fs.writeFileSync(\n path.join(routesDir, `${name}.routes.ts`),\n routeContent,\n );\n console.log(chalk.green(`Created src/routes/${name}.routes.ts`));\n break;\n }\n case \"middleware\": {\n const middlewareContent = `import { defineMiddleware } from \"nural\";\n\nexport const ${name}Middleware = defineMiddleware(async (req, res) => {\n // TODO: Implement middleware logic\n return { ${name}: true };\n});\n`;\n const middlewareDir = path.join(srcDir, \"middleware\");\n fs.ensureDirSync(middlewareDir);\n fs.writeFileSync(\n path.join(middlewareDir, `${name}.middleware.ts`),\n middlewareContent,\n );\n console.log(\n chalk.green(`Created src/middleware/${name}.middleware.ts`),\n );\n break;\n }\n case \"service\": {\n const serviceContent = `export class ${capitalize(name)}Service {\n constructor() {}\n\n async findAll() {\n return [];\n }\n}\n\nexport const ${name}Service = new ${capitalize(name)}Service();\n`;\n const servicesDir = path.join(srcDir, \"services\");\n fs.ensureDirSync(servicesDir);\n fs.writeFileSync(\n path.join(servicesDir, `${name}.service.ts`),\n serviceContent,\n );\n console.log(chalk.green(`Created src/services/${name}.service.ts`));\n break;\n }\n default:\n console.error(\n chalk.red(\n `Unknown type: ${type}. Supported: route, middleware, service`,\n ),\n );\n process.exit(1);\n }\n });\n\nprogram.parse(process.argv);\n"]}
package/dist/cli/index.js CHANGED
@@ -6,7 +6,7 @@ import fs from 'fs-extra';
6
6
  import path from 'path';
7
7
 
8
8
  var program = new Command();
9
- program.name("nural").description("Nural Framework CLI").version("0.3.0");
9
+ program.name("nural").description("Nural Framework CLI").version("0.3.2");
10
10
  program.command("new <project-name>").description("Create a new Nural project").action(async (projectName) => {
11
11
  const projectPath = path.join(process.cwd(), projectName);
12
12
  if (fs.existsSync(projectPath)) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport inquirer from \"inquirer\";\nimport chalk from \"chalk\";\nimport fs from \"fs-extra\";\nimport path from \"path\";\n\nconst program = new Command();\n\nprogram.name(\"nural\").description(\"Nural Framework CLI\").version(\"0.3.0\");\n\nprogram\n .command(\"new <project-name>\")\n .description(\"Create a new Nural project\")\n .action(async (projectName) => {\n const projectPath = path.join(process.cwd(), projectName);\n\n if (fs.existsSync(projectPath)) {\n console.error(\n chalk.red(`Error: Directory ${projectName} already exists.`),\n );\n process.exit(1);\n }\n\n const { framework } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"framework\",\n message: \"Select a framework:\",\n choices: [\"express\", \"fastify\"],\n default: \"express\",\n },\n ]);\n\n console.log(\n chalk.blue(`\\nInitializing new Nural project in ${projectName}...`),\n );\n\n // Create directories\n fs.ensureDirSync(path.join(projectPath, \"src/config\"));\n fs.ensureDirSync(path.join(projectPath, \"src/routes\"));\n fs.ensureDirSync(path.join(projectPath, \"src/middleware\"));\n fs.ensureDirSync(path.join(projectPath, \"src/services\"));\n\n // Create package.json\n const packageJson = {\n name: projectName,\n version: \"1.0.0\",\n main: \"dist/index.js\",\n scripts: {\n dev: \"tsx watch src/index.ts\",\n build: \"tsup src/index.ts --format cjs,esm --dts\",\n start: \"node dist/index.js\",\n },\n dependencies: {\n nural: \"^0.2.0\",\n [framework]: framework === \"express\" ? \"^5.0.0\" : \"^5.0.0\", // Using explicit versions for peer deps\n zod: \"^3.22.4\",\n },\n devDependencies: {\n tsx: \"^4.7.1\",\n tsup: \"^8.0.2\",\n typescript: \"^5.3.3\",\n \"@types/node\": \"^20.11.24\",\n ...(framework === \"express\" ? { \"@types/express\": \"^5.0.0\" } : {}),\n },\n };\n\n fs.writeJsonSync(path.join(projectPath, \"package.json\"), packageJson, {\n spaces: 2,\n });\n\n // Create tsconfig.json\n const tsconfig = {\n compilerOptions: {\n target: \"ES2020\",\n module: \"CommonJS\",\n moduleResolution: \"node\",\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n forceConsistentCasingInFileNames: true,\n outDir: \"./dist\",\n },\n include: [\"src/**/*\"],\n exclude: [\"node_modules\"],\n };\n\n fs.writeJsonSync(path.join(projectPath, \"tsconfig.json\"), tsconfig, {\n spaces: 2,\n });\n\n // Create src/index.ts\n const indexContent = `import { Nural } from \"nural\";\nimport { appConfig } from \"./config/app.config\";\n\nconst app = new Nural(appConfig);\n\napp.start(3000).then(() => {\n console.log(\"Server is running on http://localhost:3000\");\n});\n`;\n fs.writeFileSync(path.join(projectPath, \"src/index.ts\"), indexContent);\n\n // Create src/config/app.config.ts\n const configContent = `import { NuralConfig } from \"nural\";\n\nexport const appConfig: NuralConfig = {\n framework: \"${framework}\",\n docs: true,\n logger: {\n enabled: true,\n },\n};\n`;\n fs.writeFileSync(\n path.join(projectPath, \"src/config/app.config.ts\"),\n configContent,\n );\n\n console.log(\n chalk.green(`\\n✔ Project ${projectName} created successfully!`),\n );\n console.log(chalk.white(`\\nNext steps:`));\n console.log(chalk.cyan(` cd ${projectName}`));\n console.log(chalk.cyan(` npm install`));\n console.log(chalk.cyan(` npm run dev`));\n });\n\nprogram\n .command(\"generate <type> <name>\")\n .alias(\"g\")\n .description(\"Generate a resource (route, middleware, service)\")\n .action((typeArg, nameArg) => {\n const type = typeArg.toLowerCase();\n const name = nameArg.toLowerCase();\n const srcDir = path.join(process.cwd(), \"src\");\n\n if (!fs.existsSync(srcDir)) {\n console.error(\n chalk.red(\n \"Error: src directory not found. Are you in a Nural project root?\",\n ),\n );\n process.exit(1);\n }\n\n const capitalize = (s: string) => s.charAt(0).toUpperCase() + s.slice(1);\n\n switch (type) {\n case \"route\": {\n const routeContent = `import { createRoute, z } from \"nural\";\n\nexport const ${name}Route = createRoute({\n method: \"GET\",\n path: \"/${name}\",\n summary: \"${capitalize(name)} route\",\n responses: {\n 200: z.object({ message: z.string() }),\n },\n handler: async () => {\n return { message: \"Hello from ${name}\" };\n },\n});\n`;\n const routesDir = path.join(srcDir, \"routes\");\n fs.ensureDirSync(routesDir);\n fs.writeFileSync(\n path.join(routesDir, `${name}.routes.ts`),\n routeContent,\n );\n console.log(chalk.green(`Created src/routes/${name}.routes.ts`));\n break;\n }\n case \"middleware\": {\n const middlewareContent = `import { defineMiddleware } from \"nural\";\n\nexport const ${name}Middleware = defineMiddleware(async (req, res) => {\n // TODO: Implement middleware logic\n return { ${name}: true };\n});\n`;\n const middlewareDir = path.join(srcDir, \"middleware\");\n fs.ensureDirSync(middlewareDir);\n fs.writeFileSync(\n path.join(middlewareDir, `${name}.middleware.ts`),\n middlewareContent,\n );\n console.log(\n chalk.green(`Created src/middleware/${name}.middleware.ts`),\n );\n break;\n }\n case \"service\": {\n const serviceContent = `export class ${capitalize(name)}Service {\n constructor() {}\n\n async findAll() {\n return [];\n }\n}\n\nexport const ${name}Service = new ${capitalize(name)}Service();\n`;\n const servicesDir = path.join(srcDir, \"services\");\n fs.ensureDirSync(servicesDir);\n fs.writeFileSync(\n path.join(servicesDir, `${name}.service.ts`),\n serviceContent,\n );\n console.log(chalk.green(`Created src/services/${name}.service.ts`));\n break;\n }\n default:\n console.error(\n chalk.red(\n `Unknown type: ${type}. Supported: route, middleware, service`,\n ),\n );\n process.exit(1);\n }\n });\n\nprogram.parse(process.argv);\n"]}
1
+ {"version":3,"sources":["../../src/cli/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport inquirer from \"inquirer\";\nimport chalk from \"chalk\";\nimport fs from \"fs-extra\";\nimport path from \"path\";\n\nconst program = new Command();\n\nprogram.name(\"nural\").description(\"Nural Framework CLI\").version(\"0.3.2\");\n\nprogram\n .command(\"new <project-name>\")\n .description(\"Create a new Nural project\")\n .action(async (projectName) => {\n const projectPath = path.join(process.cwd(), projectName);\n\n if (fs.existsSync(projectPath)) {\n console.error(\n chalk.red(`Error: Directory ${projectName} already exists.`),\n );\n process.exit(1);\n }\n\n const { framework } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"framework\",\n message: \"Select a framework:\",\n choices: [\"express\", \"fastify\"],\n default: \"express\",\n },\n ]);\n\n console.log(\n chalk.blue(`\\nInitializing new Nural project in ${projectName}...`),\n );\n\n // Create directories\n fs.ensureDirSync(path.join(projectPath, \"src/config\"));\n fs.ensureDirSync(path.join(projectPath, \"src/routes\"));\n fs.ensureDirSync(path.join(projectPath, \"src/middleware\"));\n fs.ensureDirSync(path.join(projectPath, \"src/services\"));\n\n // Create package.json\n const packageJson = {\n name: projectName,\n version: \"1.0.0\",\n main: \"dist/index.js\",\n scripts: {\n dev: \"tsx watch src/index.ts\",\n build: \"tsup src/index.ts --format cjs,esm --dts\",\n start: \"node dist/index.js\",\n },\n dependencies: {\n nural: \"^0.2.0\",\n [framework]: framework === \"express\" ? \"^5.0.0\" : \"^5.0.0\", // Using explicit versions for peer deps\n zod: \"^3.22.4\",\n },\n devDependencies: {\n tsx: \"^4.7.1\",\n tsup: \"^8.0.2\",\n typescript: \"^5.3.3\",\n \"@types/node\": \"^20.11.24\",\n ...(framework === \"express\" ? { \"@types/express\": \"^5.0.0\" } : {}),\n },\n };\n\n fs.writeJsonSync(path.join(projectPath, \"package.json\"), packageJson, {\n spaces: 2,\n });\n\n // Create tsconfig.json\n const tsconfig = {\n compilerOptions: {\n target: \"ES2020\",\n module: \"CommonJS\",\n moduleResolution: \"node\",\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n forceConsistentCasingInFileNames: true,\n outDir: \"./dist\",\n },\n include: [\"src/**/*\"],\n exclude: [\"node_modules\"],\n };\n\n fs.writeJsonSync(path.join(projectPath, \"tsconfig.json\"), tsconfig, {\n spaces: 2,\n });\n\n // Create src/index.ts\n const indexContent = `import { Nural } from \"nural\";\nimport { appConfig } from \"./config/app.config\";\n\nconst app = new Nural(appConfig);\n\napp.start(3000).then(() => {\n console.log(\"Server is running on http://localhost:3000\");\n});\n`;\n fs.writeFileSync(path.join(projectPath, \"src/index.ts\"), indexContent);\n\n // Create src/config/app.config.ts\n const configContent = `import { NuralConfig } from \"nural\";\n\nexport const appConfig: NuralConfig = {\n framework: \"${framework}\",\n docs: true,\n logger: {\n enabled: true,\n },\n};\n`;\n fs.writeFileSync(\n path.join(projectPath, \"src/config/app.config.ts\"),\n configContent,\n );\n\n console.log(\n chalk.green(`\\n✔ Project ${projectName} created successfully!`),\n );\n console.log(chalk.white(`\\nNext steps:`));\n console.log(chalk.cyan(` cd ${projectName}`));\n console.log(chalk.cyan(` npm install`));\n console.log(chalk.cyan(` npm run dev`));\n });\n\nprogram\n .command(\"generate <type> <name>\")\n .alias(\"g\")\n .description(\"Generate a resource (route, middleware, service)\")\n .action((typeArg, nameArg) => {\n const type = typeArg.toLowerCase();\n const name = nameArg.toLowerCase();\n const srcDir = path.join(process.cwd(), \"src\");\n\n if (!fs.existsSync(srcDir)) {\n console.error(\n chalk.red(\n \"Error: src directory not found. Are you in a Nural project root?\",\n ),\n );\n process.exit(1);\n }\n\n const capitalize = (s: string) => s.charAt(0).toUpperCase() + s.slice(1);\n\n switch (type) {\n case \"route\": {\n const routeContent = `import { createRoute, z } from \"nural\";\n\nexport const ${name}Route = createRoute({\n method: \"GET\",\n path: \"/${name}\",\n summary: \"${capitalize(name)} route\",\n responses: {\n 200: z.object({ message: z.string() }),\n },\n handler: async () => {\n return { message: \"Hello from ${name}\" };\n },\n});\n`;\n const routesDir = path.join(srcDir, \"routes\");\n fs.ensureDirSync(routesDir);\n fs.writeFileSync(\n path.join(routesDir, `${name}.routes.ts`),\n routeContent,\n );\n console.log(chalk.green(`Created src/routes/${name}.routes.ts`));\n break;\n }\n case \"middleware\": {\n const middlewareContent = `import { defineMiddleware } from \"nural\";\n\nexport const ${name}Middleware = defineMiddleware(async (req, res) => {\n // TODO: Implement middleware logic\n return { ${name}: true };\n});\n`;\n const middlewareDir = path.join(srcDir, \"middleware\");\n fs.ensureDirSync(middlewareDir);\n fs.writeFileSync(\n path.join(middlewareDir, `${name}.middleware.ts`),\n middlewareContent,\n );\n console.log(\n chalk.green(`Created src/middleware/${name}.middleware.ts`),\n );\n break;\n }\n case \"service\": {\n const serviceContent = `export class ${capitalize(name)}Service {\n constructor() {}\n\n async findAll() {\n return [];\n }\n}\n\nexport const ${name}Service = new ${capitalize(name)}Service();\n`;\n const servicesDir = path.join(srcDir, \"services\");\n fs.ensureDirSync(servicesDir);\n fs.writeFileSync(\n path.join(servicesDir, `${name}.service.ts`),\n serviceContent,\n );\n console.log(chalk.green(`Created src/services/${name}.service.ts`));\n break;\n }\n default:\n console.error(\n chalk.red(\n `Unknown type: ${type}. Supported: route, middleware, service`,\n ),\n );\n process.exit(1);\n }\n });\n\nprogram.parse(process.argv);\n"]}
package/dist/index.cjs CHANGED
@@ -944,10 +944,11 @@ var httpLogger = (options = {}) => {
944
944
  const logger = new Logger(options.context || "Router");
945
945
  return (req, res, next) => {
946
946
  const start = Date.now();
947
- res.on("finish", () => {
947
+ const rawRes = res.raw || res;
948
+ rawRes.on("finish", () => {
948
949
  const { method, url, headers } = req;
949
950
  const duration = Date.now() - start;
950
- const status = res.statusCode;
951
+ const status = rawRes.statusCode;
951
952
  const userAgent = headers ? headers["user-agent"] || "-" : "-";
952
953
  const methodColor = methodColors[method] || resetColor;
953
954
  const coloredMethod = `${methodColor}${method}${resetColor}`;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/exceptions.ts","../src/types/error.ts","../src/adapters/express.ts","../src/adapters/fastify.ts","../src/types/config.ts","../src/types/middleware.ts","../src/docs/generator.ts","../src/middleware/cors.ts","../src/middleware/helmet.ts","../src/core/logger.ts","../src/middleware/http-logger.ts","../src/core/nural.ts","../src/core/route.ts","../src/core/middleware.ts","../src/index.ts"],"names":["express","result","Fastify","OpenAPIRegistry","OpenApiGeneratorV3","extendZodWithOpenApi","z"],"mappings":";;;;;;;;;;;;;;;AAiBO,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EAKvC,WAAA,CACE,QAAA,EACA,UAAA,EACA,OAAA,EACA;AACA,IAAA,MAAM,UACJ,OAAO,QAAA,KAAa,WAAW,QAAA,GAAW,IAAA,CAAK,UAAU,QAAQ,CAAA;AACnE,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,UAAU,CAAA;AAC1C,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAGf,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EAClD;AAAA,EAEO,WAAA,GAAiC;AACtC,IAAA,OAAO;AAAA,MACL,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,SAAS,IAAA,CAAK;AAAA,KAChB;AAAA,EACF;AAAA,EAEQ,cAAc,IAAA,EAAsB;AAC1C,IAAA,MAAM,KAAA,GAAgC;AAAA,MACpC,GAAA,EAAK,aAAA;AAAA,MACL,GAAA,EAAK,cAAA;AAAA,MACL,GAAA,EAAK,kBAAA;AAAA,MACL,GAAA,EAAK,WAAA;AAAA,MACL,GAAA,EAAK,WAAA;AAAA,MACL,GAAA,EAAK,oBAAA;AAAA,MACL,GAAA,EAAK,gBAAA;AAAA,MACL,GAAA,EAAK,iBAAA;AAAA,MACL,GAAA,EAAK,UAAA;AAAA,MACL,GAAA,EAAK,MAAA;AAAA,MACL,GAAA,EAAK,qBAAA;AAAA,MACL,GAAA,EAAK,mBAAA;AAAA,MACL,GAAA,EAAK,wBAAA;AAAA,MACL,GAAA,EAAK,cAAA;AAAA,MACL,GAAA,EAAK,sBAAA;AAAA,MACL,GAAA,EAAK,mBAAA;AAAA,MACL,GAAA,EAAK,uBAAA;AAAA,MACL,GAAA,EAAK,iBAAA;AAAA,MACL,GAAA,EAAK,aAAA;AAAA,MACL,GAAA,EAAK,qBAAA;AAAA,MACL,GAAA,EAAK;AAAA,KACP;AACA,IAAA,OAAO,KAAA,CAAM,IAAI,CAAA,IAAK,OAAA;AAAA,EACxB;AACF;AAIO,IAAM,mBAAA,GAAN,cAAkC,aAAA,CAAc;AAAA,EACrD,WAAA,CAAY,OAAA,GAAU,aAAA,EAAe,OAAA,EAAmB;AACtD,IAAA,KAAA,CAAM,OAAA,EAAS,KAAK,OAAO,CAAA;AAAA,EAC7B;AACF;AAEO,IAAM,qBAAA,GAAN,cAAoC,aAAA,CAAc;AAAA,EACvD,WAAA,CAAY,OAAA,GAAU,cAAA,EAAgB,OAAA,EAAmB;AACvD,IAAA,KAAA,CAAM,OAAA,EAAS,KAAK,OAAO,CAAA;AAAA,EAC7B;AACF;AAEO,IAAM,kBAAA,GAAN,cAAiC,aAAA,CAAc;AAAA,EACpD,WAAA,CAAY,OAAA,GAAU,WAAA,EAAa,OAAA,EAAmB;AACpD,IAAA,KAAA,CAAM,OAAA,EAAS,KAAK,OAAO,CAAA;AAAA,EAC7B;AACF;AAEO,IAAM,iBAAA,GAAN,cAAgC,aAAA,CAAc;AAAA,EACnD,WAAA,CAAY,OAAA,GAAU,WAAA,EAAa,OAAA,EAAmB;AACpD,IAAA,KAAA,CAAM,OAAA,EAAS,KAAK,OAAO,CAAA;AAAA,EAC7B;AACF;AAEO,IAAM,iBAAA,GAAN,cAAgC,aAAA,CAAc;AAAA,EACnD,WAAA,CAAY,OAAA,GAAU,UAAA,EAAY,OAAA,EAAmB;AACnD,IAAA,KAAA,CAAM,OAAA,EAAS,KAAK,OAAO,CAAA;AAAA,EAC7B;AACF;AAEO,IAAM,aAAA,GAAN,cAA4B,aAAA,CAAc;AAAA,EAC/C,WAAA,CAAY,OAAA,GAAU,MAAA,EAAQ,OAAA,EAAmB;AAC/C,IAAA,KAAA,CAAM,OAAA,EAAS,KAAK,OAAO,CAAA;AAAA,EAC7B;AACF;AAEO,IAAM,wBAAA,GAAN,cAAuC,aAAA,CAAc;AAAA,EAC1D,WAAA,CAAY,OAAA,GAAU,mBAAA,EAAqB,OAAA,EAAmB;AAC5D,IAAA,KAAA,CAAM,OAAA,EAAS,KAAK,OAAO,CAAA;AAAA,EAC7B;AACF;AAEO,IAAM,6BAAA,GAAN,cAA4C,aAAA,CAAc;AAAA,EAC/D,WAAA,CAAY,OAAA,GAAU,wBAAA,EAA0B,OAAA,EAAmB;AACjE,IAAA,KAAA,CAAM,OAAA,EAAS,KAAK,OAAO,CAAA;AAAA,EAC7B;AACF;AAEO,IAAM,4BAAA,GAAN,cAA2C,aAAA,CAAc;AAAA,EAC9D,WAAA,CAAY,OAAA,GAAU,sBAAA,EAAwB,OAAA,EAAmB;AAC/D,IAAA,KAAA,CAAM,OAAA,EAAS,KAAK,OAAO,CAAA;AAAA,EAC7B;AACF;AAEO,IAAM,4BAAA,GAAN,cAA2C,aAAA,CAAc;AAAA,EAC9D,WAAA,CAAY,OAAA,GAAU,uBAAA,EAAyB,OAAA,EAAmB;AAChE,IAAA,KAAA,CAAM,OAAA,EAAS,KAAK,OAAO,CAAA;AAAA,EAC7B;AACF;AAEO,IAAM,uBAAA,GAAN,cAAsC,aAAA,CAAc;AAAA,EACzD,WAAA,CAAY,OAAA,GAAU,iBAAA,EAAmB,OAAA,EAAmB;AAC1D,IAAA,KAAA,CAAM,OAAA,EAAS,KAAK,OAAO,CAAA;AAAA,EAC7B;AACF;AAEO,IAAM,mBAAA,GAAN,cAAkC,aAAA,CAAc;AAAA,EACrD,WAAA,CAAY,OAAA,GAAU,aAAA,EAAe,OAAA,EAAmB;AACtD,IAAA,KAAA,CAAM,OAAA,EAAS,KAAK,OAAO,CAAA;AAAA,EAC7B;AACF;AAEO,IAAM,2BAAA,GAAN,cAA0C,aAAA,CAAc;AAAA,EAC7D,WAAA,CAAY,OAAA,GAAU,qBAAA,EAAuB,OAAA,EAAmB;AAC9D,IAAA,KAAA,CAAM,OAAA,EAAS,KAAK,OAAO,CAAA;AAAA,EAC7B;AACF;AAEO,IAAM,uBAAA,GAAN,cAAsC,aAAA,CAAc;AAAA,EACzD,WAAA,CAAY,OAAA,GAAU,iBAAA,EAAmB,OAAA,EAAmB;AAC1D,IAAA,KAAA,CAAM,OAAA,EAAS,KAAK,OAAO,CAAA;AAAA,EAC7B;AACF;AAKO,IAAM,eAAA,GAAN,cAA8B,aAAA,CAAc;AAAA,EACjD,WAAA,CAAY,OAAA,EAAiB,UAAA,EAAoB,OAAA,EAAmB;AAClE,IAAA,KAAA,CAAM,OAAA,EAAS,YAAY,OAAO,CAAA;AAAA,EACpC;AACF;;;AClGA,IAAM,aAAA,GAAgB,CAAC,KAAA,EAAc,GAAA,KAAsB;AACzD,EAAA,OAAA,CAAQ,KAAA,CAAM,iBAAiB,GAAA,CAAI,MAAM,IAAI,GAAA,CAAI,IAAI,CAAA,CAAA,CAAA,EAAK,KAAA,CAAM,OAAO,CAAA;AACvE,EAAA,IAAI,MAAM,KAAA,EAAO;AACf,IAAA,OAAA,CAAQ,KAAA,CAAM,MAAM,KAAK,CAAA;AAAA,EAC3B;AACF,CAAA;AAKO,IAAM,mBAAA,GAAoC,CAAC,GAAA,KAAQ;AACxD,EAAA,MAAM,EAAE,OAAM,GAAI,GAAA;AAGlB,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,UAAA,IAAc,QAAA,IAAY,KAAA,EAAO;AAClD,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,GAAA;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO,kBAAA;AAAA,QACP,OAAA,EAAS,2BAAA;AAAA,QACT,SAAU,KAAA,CAAc;AAAA;AAC1B,KACF;AAAA,EACF;AAGA,EAAA,IAAI,iBAAiB,aAAA,EAAe;AAClC,IAAA,MAAM,QAAA,GAAW,MAAM,WAAA,EAAY;AACnC,IAAA,OAAO;AAAA,MACL,QAAQ,QAAA,CAAS,UAAA;AAAA,MACjB,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AAGA,EAAA,IAAI,QAAA,IAAY,KAAA,IAAS,OAAQ,KAAA,CAAc,WAAW,QAAA,EAAU;AAClE,IAAA,OAAO;AAAA,MACL,QAAS,KAAA,CAAc,MAAA;AAAA,MACvB,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO,MAAM,IAAA,IAAQ,OAAA;AAAA,QACrB,SAAS,KAAA,CAAM;AAAA;AACjB,KACF;AAAA,EACF;AAGA,EAAA,IACE,KAAA,CAAM,OAAA,CAAQ,WAAA,EAAY,CAAE,QAAA,CAAS,cAAc,CAAA,IACnD,KAAA,CAAM,OAAA,CAAQ,WAAA,EAAY,CAAE,QAAA,CAAS,gBAAgB,CAAA,EACrD;AACA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,GAAA;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO,cAAA;AAAA,QACP,SAAS,KAAA,CAAM;AAAA;AACjB,KACF;AAAA,EACF;AAEA,EAAA,IACE,KAAA,CAAM,OAAA,CAAQ,WAAA,EAAY,CAAE,QAAA,CAAS,WAAW,CAAA,IAChD,KAAA,CAAM,OAAA,CAAQ,WAAA,EAAY,CAAE,QAAA,CAAS,YAAY,CAAA,EACjD;AACA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,GAAA;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO,WAAA;AAAA,QACP,SAAS,KAAA,CAAM;AAAA;AACjB,KACF;AAAA,EACF;AAEA,EAAA,IAAI,MAAM,OAAA,CAAQ,WAAA,EAAY,CAAE,QAAA,CAAS,WAAW,CAAA,EAAG;AACrD,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,GAAA;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO,WAAA;AAAA,QACP,SAAS,KAAA,CAAM;AAAA;AACjB,KACF;AAAA,EACF;AAGA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,GAAA;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,KAAA,EAAO,uBAAA;AAAA,MACP,SACE,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA,GACrB,iCACA,KAAA,CAAM;AAAA;AACd,GACF;AACF,CAAA;AAKO,IAAM,4BAAA,GAA2D;AAAA,EACtE,OAAA,EAAS,mBAAA;AAAA,EACT,YAAA,EAAc,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA;AAAA,EACvC,SAAA,EAAW,IAAA;AAAA,EACX,MAAA,EAAQ;AACV,CAAA;AAKO,SAAS,0BACd,MAAA,EAC4B;AAE5B,EAAA,IAAI,WAAW,KAAA,EAAO;AACpB,IAAA,OAAO;AAAA,MACL,GAAG,4BAAA;AAAA,MACH,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,MAAA,KAAW,MAAA,EAAW;AAC3C,IAAA,OAAO,4BAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAO,WAAW,UAAA,EAAY;AAChC,IAAA,OAAO;AAAA,MACL,GAAG,4BAAA;AAAA,MACH,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAGA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,MAAA,CAAO,OAAA,IAAW,4BAAA,CAA6B,OAAA;AAAA,IACxD,YAAA,EACE,MAAA,CAAO,YAAA,IAAgB,4BAAA,CAA6B,YAAA;AAAA,IACtD,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,4BAAA,CAA6B,SAAA;AAAA,IAC5D,MAAA,EAAQ,MAAA,CAAO,MAAA,IAAU,4BAAA,CAA6B;AAAA,GACxD;AACF;;;ACpMO,IAAM,iBAAN,MAA8C;AAAA,EAInD,YAAY,WAAA,EAA0C;AACpD,IAAA,IAAA,CAAK,MAAMA,wBAAA,EAAQ;AACnB,IAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAIA,wBAAA,CAAQ,IAAA,EAAM,CAAA;AAC3B,IAAA,IAAA,CAAK,cAAc,WAAA,IAAe,4BAAA;AAAA,EACpC;AAAA,EAEA,MAAA,CAAO,MAAc,EAAA,EAAuB;AAC1C,IAAA,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,EAAE,CAAA;AAAA,EAC1B;AAAA,EAEA,IAAI,UAAA,EAAkC;AACpC,IAAA,IAAA,CAAK,GAAA,CAAI,IAAI,UAAU,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAA,CACZ,KAAA,EACA,GAAA,EACA,KACA,IAAA,EACe;AACf,IAAA,MAAM,GAAA,GAAoB;AAAA,MACxB,KAAA;AAAA,MACA,OAAA,EAAS,GAAA;AAAA,MACT,QAAA,EAAU,GAAA;AAAA,MACV,IAAA,EAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,MAClB,QAAQ,GAAA,CAAI;AAAA,KACd;AAGA,IAAA,IAAI,IAAA,CAAK,YAAY,SAAA,EAAW;AAC9B,MAAA,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,KAAA,EAAO,GAAG,CAAA;AAAA,IACpC;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,WAAA,CAAY,QAAQ,GAAG,CAAA;AAGxD,MAAA,IAAI,cAAc,OAAA,EAAS;AACzB,QAAA,MAAA,CAAO,OAAA,CAAQ,cAAc,OAAO,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC9D,UAAA,GAAA,CAAI,SAAA,CAAU,KAAK,KAAK,CAAA;AAAA,QAC1B,CAAC,CAAA;AAAA,MACH;AAGA,MAAA,MAAM,IAAA,GAAO,EAAE,GAAG,aAAA,CAAc,IAAA,EAAK;AACrC,MAAA,IAAI,IAAA,CAAK,WAAA,CAAY,YAAA,IAAgB,KAAA,CAAM,KAAA,EAAO;AAChD,QAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,KAAA;AAAA,MACrB;AAEA,MAAA,GAAA,CAAI,MAAA,CAAO,aAAA,CAAc,MAAM,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,IAC5C,SAAS,YAAA,EAAc;AAErB,MAAA,OAAA,CAAQ,KAAA,CAAM,iCAAiC,YAAY,CAAA;AAC3D,MAAA,GAAA,CAAI,OAAO,GAAG,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,yBAAyB,CAAA;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,mBAAA,CACE,MAAA,EACA,IAAA,EACA,OAAA,EACM;AACN,IAAA,IAAA,CAAK,IAAI,MAAM,CAAA,CAAE,IAAA,EAAM,OAAO,KAAK,GAAA,KAAQ;AACzC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAG,CAAA;AAChC,QAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EAAQ;AAC1B,UAAA,GAAA,CAAI,GAAA,CAAI,gBAAgB,WAAW,CAAA;AACnC,UAAA,GAAA,CAAI,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,QACtB,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,QACtB;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,IAAA,CAAK,WAAA,CAAY,GAAA,EAAc,GAAA,EAAK,KAAK,IAAI,CAAA;AAAA,MACrD;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,cAAc,KAAA,EAA6B;AACzC,IAAA,MAAM,OAAA,GAA0B,OAAO,GAAA,EAAK,GAAA,EAAK,IAAA,KAAS;AACxD,MAAA,IAAI;AAEF,QAAA,IAAI,OAAA,GAAmC,EAAE,GAAA,EAAK,GAAA,EAAI;AAGlD,QAAA,IAAI,KAAA,CAAM,UAAA,IAAc,KAAA,CAAM,UAAA,CAAW,SAAS,CAAA,EAAG;AACnD,UAAA,KAAA,MAAW,EAAA,IAAM,MAAM,UAAA,EAAY;AACjC,YAAA,MAAMC,OAAAA,GAAS,MAAM,EAAA,CAAG,GAAA,EAAK,GAAG,CAAA;AAChC,YAAA,IAAIA,OAAAA,IAAU,OAAOA,OAAAA,KAAW,QAAA,EAAU;AACxC,cAAA,OAAA,GAAU,EAAE,GAAG,OAAA,EAAS,GAAGA,OAAAA,EAAO;AAAA,YACpC;AAAA,UACF;AAAA,QACF;AAGA,QAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,EAAS,MAAA,GAC1B,MAAM,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,MAAM,CAAA,GAChD,GAAA,CAAI,MAAA;AAER,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,EAAS,KAAA,GACzB,MAAM,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA,GAC9C,GAAA,CAAI,KAAA;AAER,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,EAAS,IAAA,GACxB,MAAM,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,GAC5C,GAAA,CAAI,IAAA;AAGR,QAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,OAAA,CAAQ;AAAA,UACjC,GAAG,OAAA;AAAA,UACH,MAAA;AAAA,UACA,KAAA;AAAA,UACA,IAAA;AAAA,UACA,GAAA;AAAA,UACA;AAAA,SACD,CAAA;AAGD,QAAA,MAAM,SAAA,GAAY,KAAA,CAAM,SAAA,IAAa,EAAC;AACtC,QAAA,MAAM,cAAA,GACJ,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,CAAW,GAAG,CAAC,CAAA,IAAK,KAAA;AAC3D,QAAA,MAAM,cAAA,GAAiB,SAAA,CAAU,MAAA,CAAO,cAAc,CAAC,CAAA;AAEvD,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,MAAM,WAAA,GAAc,MAAM,cAAA,CAAe,UAAA,CAAW,MAAM,CAAA;AAC1D,UAAA,GAAA,CAAI,OAAO,MAAA,CAAO,cAAc,CAAC,CAAA,CAAE,KAAK,WAAW,CAAA;AAAA,QACrD,CAAA,MAAA,IAAW,WAAW,KAAA,CAAA,EAAW;AAC/B,UAAA,GAAA,CAAI,OAAO,MAAA,CAAO,cAAc,CAAC,CAAA,CAAE,KAAK,MAAM,CAAA;AAAA,QAChD,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,cAAc,CAAC,EAAE,IAAA,EAAK;AAAA,QAC1C;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,KAAK,WAAA,CAAY,GAAA,EAAc,GAAA,EAAK,GAAA,EAAK,MAAM,IAAI,CAAA;AAAA,MAC3D;AAAA,IACF,CAAA;AAGA,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,IAAA,QAAQ,MAAM,MAAA;AAAQ,MACpB,KAAK,KAAA;AACH,QAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA;AAC1B,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,OAAO,CAAA;AAC3B,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA;AAC1B,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,OAAO,CAAA;AAC5B,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,OAAO,CAAA;AAC7B,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA;AAC9B,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,OAAO,CAAA;AAC3B,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA;AAC1B,QAAA;AAAA;AACJ,EACF;AACF,CAAA;ACtKO,IAAM,iBAAN,MAA8C;AAAA,EAInD,YAAY,WAAA,EAA0C;AACpD,IAAA,IAAA,CAAK,MAAMC,wBAAA,EAAQ;AACnB,IAAA,IAAA,CAAK,cAAc,WAAA,IAAe,4BAAA;AAAA,EACpC;AAAA,EAEA,MAAA,CAAO,MAAc,EAAA,EAAuB;AAC1C,IAAA,IAAA,CAAK,IAAI,MAAA,CAAO,EAAE,IAAA,EAAK,EAAG,CAAC,GAAA,KAAQ;AACjC,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,OAAA,CAAQ,MAAM,GAAG,CAAA;AACjB,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AACA,MAAA,IAAI,IAAI,EAAA,EAAG;AAAA,IACb,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,IAAI,UAAA,EAAyC;AAC3C,IAAA,IAAA,CAAK,GAAA,CAAI,SAAS,UAAU,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAA,CACZ,KAAA,EACA,GAAA,EACA,OACA,IAAA,EACe;AACf,IAAA,MAAM,GAAA,GAAoB;AAAA,MACxB,KAAA;AAAA,MACA,OAAA,EAAS,GAAA;AAAA,MACT,QAAA,EAAU,KAAA;AAAA,MACV,IAAA,EAAM,QAAQ,GAAA,CAAI,GAAA;AAAA,MAClB,QAAQ,GAAA,CAAI;AAAA,KACd;AAGA,IAAA,IAAI,IAAA,CAAK,YAAY,SAAA,EAAW;AAC9B,MAAA,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,KAAA,EAAO,GAAG,CAAA;AAAA,IACpC;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,WAAA,CAAY,QAAQ,GAAG,CAAA;AAGxD,MAAA,IAAI,cAAc,OAAA,EAAS;AACzB,QAAA,MAAA,CAAO,OAAA,CAAQ,cAAc,OAAO,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC9D,UAAA,KAAA,CAAM,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,QACzB,CAAC,CAAA;AAAA,MACH;AAGA,MAAA,MAAM,IAAA,GAAO,EAAE,GAAG,aAAA,CAAc,IAAA,EAAK;AACrC,MAAA,IAAI,IAAA,CAAK,WAAA,CAAY,YAAA,IAAgB,KAAA,CAAM,KAAA,EAAO;AAChD,QAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,KAAA;AAAA,MACrB;AAEA,MAAA,KAAA,CAAM,MAAA,CAAO,aAAA,CAAc,MAAM,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,IAC9C,SAAS,YAAA,EAAc;AAErB,MAAA,OAAA,CAAQ,KAAA,CAAM,iCAAiC,YAAY,CAAA;AAC3D,MAAA,KAAA,CAAM,OAAO,GAAG,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,yBAAyB,CAAA;AAAA,IAC3D;AAAA,EACF;AAAA,EAEA,mBAAA,CACE,MAAA,EACA,IAAA,EACA,OAAA,EACM;AACN,IAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,OAAO,KAAK,KAAA,KAAU;AACvC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAG,CAAA;AAChC,QAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EAAQ;AAC1B,UAAA,KAAA,CAAM,IAAA,CAAK,WAAW,CAAA,CAAE,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,QAC1C,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,QACxB;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,IAAA,CAAK,WAAA,CAAY,GAAA,EAAc,GAAA,EAAK,OAAO,IAAI,CAAA;AAAA,MACvD;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,cAAc,KAAA,EAA6B;AACzC,IAAA,MAAM,MAAM,KAAA,CAAM,IAAA;AAElB,IAAA,IAAA,CAAK,IAAI,KAAA,CAAM;AAAA,MACb,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,GAAA;AAAA,MACA,OAAA,EAAS,OAAO,GAAA,EAAqB,KAAA,KAAwB;AAC3D,QAAA,IAAI;AAEF,UAAA,IAAI,OAAA,GAAmC,EAAE,GAAA,EAAK,GAAA,EAAK,KAAA,EAAM;AAGzD,UAAA,IAAI,KAAA,CAAM,UAAA,IAAc,KAAA,CAAM,UAAA,CAAW,SAAS,CAAA,EAAG;AACnD,YAAA,KAAA,MAAW,EAAA,IAAM,MAAM,UAAA,EAAY;AACjC,cAAA,MAAMD,OAAAA,GAAS,MAAM,EAAA,CAAG,GAAA,EAAK,KAAK,CAAA;AAClC,cAAA,IAAIA,OAAAA,IAAU,OAAOA,OAAAA,KAAW,QAAA,EAAU;AACxC,gBAAA,OAAA,GAAU,EAAE,GAAG,OAAA,EAAS,GAAGA,OAAAA,EAAO;AAAA,cACpC;AAAA,YACF;AAAA,UACF;AAGA,UAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,EAAS,MAAA,GAC1B,MAAM,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,MAAM,CAAA,GAChD,GAAA,CAAI,MAAA;AAER,UAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,EAAS,KAAA,GACzB,MAAM,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA,GAC9C,GAAA,CAAI,KAAA;AAER,UAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,EAAS,IAAA,GACxB,MAAM,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,GAC5C,GAAA,CAAI,IAAA;AAGR,UAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,OAAA,CAAQ;AAAA,YACjC,GAAG,OAAA;AAAA,YACH,MAAA;AAAA,YACA,KAAA;AAAA,YACA,IAAA;AAAA,YACA,GAAA;AAAA,YACA,GAAA,EAAK;AAAA,WACN,CAAA;AAGD,UAAA,MAAM,SAAA,GAAY,KAAA,CAAM,SAAA,IAAa,EAAC;AACtC,UAAA,MAAM,cAAA,GACJ,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,CAAW,GAAG,CAAC,CAAA,IAAK,KAAA;AAC3D,UAAA,MAAM,cAAA,GAAiB,SAAA,CAAU,MAAA,CAAO,cAAc,CAAC,CAAA;AAEvD,UAAA,IAAI,cAAA,EAAgB;AAClB,YAAA,MAAM,WAAA,GAAc,MAAM,cAAA,CAAe,UAAA,CAAW,MAAM,CAAA;AAC1D,YAAA,KAAA,CAAM,OAAO,MAAA,CAAO,cAAc,CAAC,CAAA,CAAE,KAAK,WAAW,CAAA;AAAA,UACvD,CAAA,MAAA,IAAW,WAAW,KAAA,CAAA,EAAW;AAC/B,YAAA,KAAA,CAAM,OAAO,MAAA,CAAO,cAAc,CAAC,CAAA,CAAE,KAAK,MAAM,CAAA;AAAA,UAClD,CAAA,MAAO;AACL,YAAA,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,cAAc,CAAC,EAAE,IAAA,EAAK;AAAA,UAC5C;AAAA,QACF,SAAS,GAAA,EAAK;AACZ,UAAA,MAAM,KAAK,WAAA,CAAY,GAAA,EAAc,GAAA,EAAK,KAAA,EAAO,MAAM,IAAI,CAAA;AAAA,QAC7D;AAAA,MACF;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAA;;;ACeO,IAAM,mBAAA,GAA0C;AAAA,EACrD,OAAA,EAAS,IAAA;AAAA,EACT,IAAA,EAAM,OAAA;AAAA,EACN,EAAA,EAAI,QAAA;AAAA,EACJ,OAAA,EAAS;AAAA,IACP,IAAA,EAAM;AAAA,MACJ,KAAA,EAAO,WAAA;AAAA,MACP,OAAA,EAAS,OAAA;AAAA,MACT,WAAA,EAAa;AAAA,KACf;AAAA,IACA,OAAA,EAAS,CAAC,EAAE,GAAA,EAAK,KAAK;AAAA,GACxB;AAAA,EACA,QAAQ,EAAC;AAAA,EACT,SAAS;AACX,CAAA;AAKO,SAAS,kBACd,IAAA,EACoB;AACpB,EAAA,IAAI,SAAS,KAAA,EAAO;AAClB,IAAA,OAAO,EAAE,GAAG,mBAAA,EAAqB,OAAA,EAAS,KAAA,EAAM;AAAA,EAClD;AAEA,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,MAAA,EAAW;AACvC,IAAA,OAAO,mBAAA;AAAA,EACT;AAGA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,KAAK,OAAA,IAAW,IAAA;AAAA,IACzB,IAAA,EAAM,IAAA,CAAK,IAAA,IAAQ,mBAAA,CAAoB,IAAA;AAAA,IACvC,EAAA,EAAI,IAAA,CAAK,EAAA,IAAM,mBAAA,CAAoB,EAAA;AAAA,IACnC,OAAA,EAAS;AAAA,MACP,GAAG,mBAAA,CAAoB,OAAA;AAAA,MACvB,GAAG,IAAA,CAAK,OAAA;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,GAAG,oBAAoB,OAAA,CAAQ,IAAA;AAAA,QAC/B,GAAG,KAAK,OAAA,EAAS,IAAA;AAAA;AAAA,QAEjB,KAAA,EACE,KAAK,KAAA,IACL,IAAA,CAAK,SAAS,IAAA,EAAM,KAAA,IACpB,mBAAA,CAAoB,OAAA,CAAQ,IAAA,EAAM,KAAA;AAAA,QACpC,OAAA,EACE,KAAK,OAAA,IACL,IAAA,CAAK,SAAS,IAAA,EAAM,OAAA,IACpB,mBAAA,CAAoB,OAAA,CAAQ,IAAA,EAAM,OAAA;AAAA,QACpC,WAAA,EACE,KAAK,WAAA,IACL,IAAA,CAAK,SAAS,IAAA,EAAM,WAAA,IACpB,mBAAA,CAAoB,OAAA,CAAQ,IAAA,EAAM;AAAA;AACtC,KACF;AAAA,IACA,MAAA,EAAQ,IAAA,CAAK,MAAA,IAAU,EAAC;AAAA,IACxB,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW;AAAC,GAC5B;AACF;;;AC/LO,IAAM,mBAAA,GAA0C;AAAA,EACrD,MAAA,EAAQ,GAAA;AAAA,EACR,SAAS,CAAC,KAAA,EAAO,QAAQ,KAAA,EAAO,OAAA,EAAS,QAAQ,QAAQ,CAAA;AAAA,EACzD,cAAA,EAAgB,CAAC,cAAA,EAAgB,eAAA,EAAiB,kBAAkB,CAAA;AAAA,EACpE,gBAAgB,EAAC;AAAA,EACjB,WAAA,EAAa,KAAA;AAAA,EACb,MAAA,EAAQ,KAAA;AAAA;AAAA,EACR,iBAAA,EAAmB,KAAA;AAAA,EACnB,oBAAA,EAAsB;AACxB,CAAA;AA8DO,IAAM,qBAAA,GAA8C;AAAA,EACzD,qBAAA,EAAuB,KAAA;AAAA;AAAA,EACvB,yBAAA,EAA2B,KAAA;AAAA,EAC3B,uBAAA,EAAyB,EAAE,MAAA,EAAQ,aAAA,EAAc;AAAA,EACjD,yBAAA,EAA2B,EAAE,MAAA,EAAQ,aAAA,EAAc;AAAA,EACnD,kBAAA,EAAoB,EAAE,KAAA,EAAO,KAAA,EAAM;AAAA,EACnC,UAAA,EAAY,EAAE,MAAA,EAAQ,YAAA,EAAa;AAAA,EACnC,MAAM,EAAE,MAAA,EAAQ,SAAU,iBAAA,EAAmB,IAAA,EAAM,SAAS,KAAA,EAAM;AAAA;AAAA,EAClE,OAAA,EAAS,IAAA;AAAA,EACT,4BAAA,EAA8B,EAAE,MAAA,EAAQ,MAAA,EAAO;AAAA,EAC/C,cAAA,EAAgB,EAAE,MAAA,EAAQ,aAAA,EAAc;AAAA,EACxC,SAAA,EAAW;AAAA;AACb,CAAA;AAKO,SAAS,kBACd,IAAA,EAC2B;AAC3B,EAAA,IAAI,IAAA,KAAS,KAAA,IAAS,IAAA,KAAS,MAAA,EAAW;AACxC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,OAAO,mBAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,IAAA,CAAK,MAAA,IAAU,mBAAA,CAAoB,MAAA;AAAA,IAC3C,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,mBAAA,CAAoB,OAAA;AAAA,IAC7C,cAAA,EAAgB,IAAA,CAAK,cAAA,IAAkB,mBAAA,CAAoB,cAAA;AAAA,IAC3D,cAAA,EAAgB,IAAA,CAAK,cAAA,IAAkB,mBAAA,CAAoB,cAAA;AAAA,IAC3D,WAAA,EAAa,IAAA,CAAK,WAAA,IAAe,mBAAA,CAAoB,WAAA;AAAA,IACrD,MAAA,EAAQ,IAAA,CAAK,MAAA,IAAU,mBAAA,CAAoB,MAAA;AAAA,IAC3C,iBAAA,EACE,IAAA,CAAK,iBAAA,IAAqB,mBAAA,CAAoB,iBAAA;AAAA,IAChD,oBAAA,EACE,IAAA,CAAK,oBAAA,IAAwB,mBAAA,CAAoB;AAAA,GACrD;AACF;AAKO,SAAS,oBACd,MAAA,EAC6B;AAC7B,EAAA,IAAI,MAAA,KAAW,KAAA,IAAS,MAAA,KAAW,MAAA,EAAW;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,OAAO,qBAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,qBAAA,EACE,OAAO,MAAA,CAAO,qBAAA,KAA0B,WACpC,EAAE,UAAA,EAAY,MAAA,CAAO,qBAAA,CAAsB,cAAc,EAAC,EAAE,GAC3D,MAAA,CAAO,yBACR,qBAAA,CAAsB,qBAAA;AAAA,IAC5B,yBAAA,EACE,MAAA,CAAO,yBAAA,IACP,qBAAA,CAAsB,yBAAA;AAAA,IACxB,yBACE,OAAO,MAAA,CAAO,4BAA4B,QAAA,GACrC,MAAA,CAAO,0BACR,qBAAA,CAAsB,uBAAA;AAAA,IAC5B,2BACE,OAAO,MAAA,CAAO,8BAA8B,QAAA,GACvC,MAAA,CAAO,4BACR,qBAAA,CAAsB,yBAAA;AAAA,IAC5B,oBACE,OAAO,MAAA,CAAO,uBAAuB,QAAA,GAChC,MAAA,CAAO,qBACR,qBAAA,CAAsB,kBAAA;AAAA,IAC5B,YACE,OAAO,MAAA,CAAO,eAAe,QAAA,GACxB,MAAA,CAAO,aACR,qBAAA,CAAsB,UAAA;AAAA,IAC5B,IAAA,EACE,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,GACnB,EAAE,GAAG,qBAAA,CAAsB,IAAA,EAAM,GAAG,MAAA,CAAO,IAAA,KAC3C,qBAAA,CAAsB,IAAA;AAAA,IAC5B,OAAA,EAAS,MAAA,CAAO,OAAA,IAAW,qBAAA,CAAsB,OAAA;AAAA,IACjD,8BACE,OAAO,MAAA,CAAO,iCAAiC,QAAA,GAC1C,MAAA,CAAO,+BACR,qBAAA,CAAsB,4BAAA;AAAA,IAC5B,gBACE,OAAO,MAAA,CAAO,mBAAmB,QAAA,GAC5B,MAAA,CAAO,iBACR,qBAAA,CAAsB,cAAA;AAAA,IAC5B,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,qBAAA,CAAsB;AAAA,GACvD;AACF;AChNO,IAAM,yBAAN,MAA6B;AAAA,EAIlC,YAAY,MAAA,EAA4B;AACtC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAIE,4BAAA,EAAgB;AACpC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,KAAA,EAA6B;AAEpC,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,iBAAiB,MAAM,CAAA;AAE9D,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,CAAO,WAAA,EAAY;AAOxC,IAAA,IAAA,CAAK,SAAS,YAAA,CAAa;AAAA,MACzB,MAAA;AAAA,MACA,IAAA,EAAM,WAAA;AAAA,MACN,OAAA,EAAS,MAAM,OAAA,IAAW,YAAA;AAAA,MAC1B,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,OAAA,EAAS;AAAA,QACP,MAAA,EAAQ,MAAM,OAAA,EAAS,MAAA;AAAA,QACvB,KAAA,EAAO,MAAM,OAAA,EAAS,KAAA;AAAA,QACtB,IAAA,EAAM,KAAA,CAAM,OAAA,EAAS,IAAA,GACjB,EAAE,OAAA,EAAS,EAAE,kBAAA,EAAoB,EAAE,QAAQ,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAK,IAAI,GAClE;AAAA,OACN;AAAA,MACA,WAAW,MAAA,CAAO,WAAA;AAAA,QAChB,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,SAAA,IAAa,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,MAAA,EAAQ,MAAM,CAAA,KAAM;AAAA,UAC9D,MAAA;AAAA,UACA;AAAA,YACE,WAAA,EAAa,UAAA;AAAA,YACb,OAAA,EAAS,EAAE,kBAAA,EAAoB,EAAE,QAAO;AAAE;AAC5C,SACD;AAAA,OACH;AAAA,MACA,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,GAAG,KAAA,CAAM;AAAA,KACV,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAuB;AACrB,IAAA,MAAM,SAAA,GAAY,IAAIC,+BAAA,CAAmB,IAAA,CAAK,SAAS,WAAW,CAAA;AAClE,IAAA,MAAM,GAAA,GAAM,UAAU,gBAAA,CAAiB;AAAA,MACrC,OAAA,EAAS,OAAA;AAAA,MACT,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,KAAA,IAAS,WAAA;AAAA,QAC1C,OAAA,EAAS,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,OAAA,IAAW,OAAA;AAAA,QAC9C,WAAA,EAAa,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAM,WAAA;AAAA,QACvC,cAAA,EAAgB,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAM,cAAA;AAAA,QAC1C,SAAS,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAM,SAAS,IAAA,GACxC;AAAA,UACE,IAAA,EAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,OAAA,CAAQ,IAAA;AAAA,UACvC,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,OAAA,CAAQ,KAAA;AAAA,UACxC,GAAA,EAAK,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,OAAA,CAAQ;AAAA,SACxC,GACA,MAAA;AAAA,QACJ,SAAS,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAM,SAAS,IAAA,GACxC;AAAA,UACE,IAAA,EAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,OAAA,CAAQ,IAAA;AAAA,UACvC,GAAA,EAAK,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,OAAA,CAAQ;AAAA,SACxC,GACA;AAAA,OACN;AAAA,MACA,OAAA,EAAS,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ;AAAA,KAC9B,CAAA;AAGD,IAAA,OAAO;AAAA,MACL,GAAG,GAAA;AAAA,MACH,UAAA,EAAY;AAAA,QACV,GAAG,GAAA,CAAI,UAAA;AAAA,QACP,GAAG,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,UAAA;AAAA,QACvB,eAAA,EAAiB;AAAA,UACf,GAAG,IAAI,UAAA,EAAY,eAAA;AAAA,UACnB,GAAG,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,UAAA,EAAY;AAAA;AACrC,OACF;AAAA,MACA,QAAA,EAAU;AAAA,QACR,GAAI,GAAA,CAAI,QAAA,IAAY,EAAC;AAAA,QACrB,GAAI,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,YAAY;AAAC,OACvC;AAAA,MACA,IAAA,EAAM,CAAC,GAAI,GAAA,CAAI,IAAA,IAAQ,EAAC,EAAI,GAAI,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,IAAA,IAAQ,EAAG,CAAA;AAAA,MAC/D,YAAA,EAAc,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,gBAAgB,GAAA,CAAI;AAAA,KACxD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,OAAA,EAAyB;AACrC,IAAA,MAAM,eAAe,IAAA,CAAK,SAAA,CAAU,KAAK,MAAA,CAAO,MAAA,IAAU,EAAE,CAAA;AAC5D,IAAA,OAAO;AAAA;AAAA;AAAA;AAAA,iBAAA,EAIQ,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAM,SAAS,WAAW,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAA,EAQzC,OAAO,CAAA;AAAA,gCAAA,EACG,YAAY,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAM5C;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,OAAA,EAAyB;AACtC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,KAAA,IAAS,WAAA;AACjD,IAAA,MAAM,cAAA,GAAiB,KAAK,SAAA,CAAU,IAAA,CAAK,OAAO,OAAA,CAAQ,OAAA,IAAW,EAAE,CAAA;AACvE,IAAA,IAAI,QAAA,GACF,6EAAA;AAEF,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,KAAA,KAAU,SAAA,EAAW;AAC3C,MAAA,QAAA,GACE,+DAAA;AAAA,IACJ,CAAA,MAAA,IAAW,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,UAAA,EAAY;AACnD,MAAA,QAAA,GAAW,EAAA;AAAA,IACb;AAEA,IAAA,MAAM,KAAA,GAAQ,QAAA,GACV,CAAA,6BAAA,EAAgC,QAAQ,CAAA,IAAA,CAAA,GACxC,EAAA;AAEJ,IAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,eAAA,EAKM,KAAK,CAAA;AAAA,QAAA,EACZ,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAA,EAcK,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAAA,EAWV,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAQ7B;AACF,CAAA;;;AClLA,SAAS,eAAA,CACP,QACA,MAAA,EACgB;AAChB,EAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AAEpB,EAAA,MAAM,EAAE,MAAA,EAAQ,aAAA,EAAc,GAAI,MAAA;AAGlC,EAAA,IAAI,aAAA,KAAkB,IAAA,IAAQ,aAAA,KAAkB,GAAA,EAAK;AACnD,IAAA,OAAO,MAAA,CAAO,cAAc,MAAA,GAAS,GAAA;AAAA,EACvC;AAGA,EAAA,IAAI,OAAO,kBAAkB,QAAA,EAAU;AACrC,IAAA,OAAO,MAAA,KAAW,gBAAgB,MAAA,GAAS,KAAA;AAAA,EAC7C;AAGA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,aAAa,CAAA,EAAG;AAChC,IAAA,OAAO,aAAA,CAAc,QAAA,CAAS,MAAM,CAAA,GAAI,MAAA,GAAS,KAAA;AAAA,EACnD;AAGA,EAAA,IAAI,OAAO,kBAAkB,UAAA,EAAY;AACvC,IAAA,OAAO,aAAA,CAAc,MAAM,CAAA,GAAI,MAAA,GAAS,KAAA;AAAA,EAC1C;AAEA,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,cAAA,CACd,aAAA,EACA,MAAA,EACA,WAAA,GAAuB,KAAA,EACH;AACpB,EAAA,MAAM,aAAA,GAAgB,eAAA,CAAgB,aAAA,EAAe,MAAM,CAAA;AAE3D,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAuB;AAAA,IAC3B,6BAAA,EAA+B;AAAA,GACjC;AAGA,EAAA,IAAI,kBAAkB,GAAA,EAAK;AACzB,IAAA,OAAA,CAAQ,MAAM,CAAA,GAAI,QAAA;AAAA,EACpB;AAGA,EAAA,IAAI,OAAO,WAAA,EAAa;AACtB,IAAA,OAAA,CAAQ,kCAAkC,CAAA,GAAI,MAAA;AAAA,EAChD;AAGA,EAAA,IAAI,MAAA,CAAO,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG;AACpC,IAAA,OAAA,CAAQ,+BAA+B,CAAA,GAAI,MAAA,CAAO,cAAA,CAAe,KAAK,IAAI,CAAA;AAAA,EAC5E;AAGA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAA,CAAQ,8BAA8B,CAAA,GAAI,MAAA,CAAO,OAAA,CAAQ,KAAK,IAAI,CAAA;AAClE,IAAA,OAAA,CAAQ,8BAA8B,CAAA,GAAI,MAAA,CAAO,cAAA,CAAe,KAAK,IAAI,CAAA;AACzE,IAAA,OAAA,CAAQ,wBAAwB,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAAA,EAC1D;AAEA,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,gBAAA,CAAiB,KAAU,MAAA,EAAkC;AAE3E,EAAA,GAAA,CAAI,GAAA,CAAI,CAAC,GAAA,EAAU,GAAA,EAAU,IAAA,KAAc;AACzC,IAAA,MAAM,MAAA,GAAS,IAAI,OAAA,CAAQ,MAAA;AAC3B,IAAA,MAAM,WAAA,GAAc,IAAI,MAAA,KAAW,SAAA;AACnC,IAAA,MAAM,OAAA,GAAU,cAAA,CAAe,MAAA,EAAQ,MAAA,EAAQ,WAAW,CAAA;AAE1D,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAChD,QAAA,IAAI,KAAA,EAAO,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,KAAK,CAAA;AAAA,MACrC,CAAC,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,IAAI,OAAO,iBAAA,EAAmB;AAC5B,QAAA,IAAA,EAAK;AAAA,MACP,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,oBAAoB,CAAA,CAAE,GAAA,EAAI;AAAA,MAC9C;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,EAAK;AAAA,EACP,CAAC,CAAA;AACH;AAKO,SAAS,gBAAA,CAAiB,KAAU,MAAA,EAAkC;AAE3E,EAAA,GAAA,CAAI,OAAA,CAAQ,WAAA,EAAa,OAAO,OAAA,EAAc,KAAA,KAAe;AAC3D,IAAA,MAAM,MAAA,GAAS,QAAQ,OAAA,CAAQ,MAAA;AAC/B,IAAA,MAAM,WAAA,GAAc,QAAQ,MAAA,KAAW,SAAA;AACvC,IAAA,MAAM,OAAA,GAAU,cAAA,CAAe,MAAA,EAAQ,MAAA,EAAQ,WAAW,CAAA;AAE1D,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAChD,QAAA,IAAI,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,GAAA,EAAK,KAAK,CAAA;AAAA,MACpC,CAAC,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,WAAA,IAAe,CAAC,MAAA,CAAO,iBAAA,EAAmB;AAC5C,MAAA,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,oBAAoB,CAAA,CAAE,IAAA,EAAK;AAC/C,MAAA;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AACH;;;ACtIA,SAAS,eAAe,UAAA,EAA8C;AACpE,EAAA,OAAO,MAAA,CAAO,QAAQ,UAAU,CAAA,CAC7B,IAAI,CAAC,CAAC,KAAK,MAAM,CAAA,KAAM,GAAG,GAAG,CAAA,CAAA,EAAI,OAAO,IAAA,CAAK,GAAG,CAAC,CAAA,CAAE,CAAA,CACnD,KAAK,IAAI,CAAA;AACd;AAKO,SAAS,mBACd,MAAA,EACiB;AACjB,EAAA,MAAM,UAA2B,EAAC;AAGlC,EAAA,IACE,OAAO,MAAA,CAAO,qBAAA,KAA0B,QAAA,IACxC,MAAA,CAAO,sBAAsB,UAAA,EAC7B;AACA,IAAA,OAAA,CAAQ,yBAAyB,CAAA,GAAI,cAAA;AAAA,MACnC,OAAO,qBAAA,CAAsB;AAAA,KAC/B;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,yBAAA,EAA2B;AACpC,IAAA,OAAA,CAAQ,8BAA8B,CAAA,GAAI,cAAA;AAAA,EAC5C;AAGA,EAAA,IAAI,OAAO,uBAAA,EAAyB;AAClC,IAAA,OAAA,CAAQ,4BAA4B,CAAA,GAClC,MAAA,CAAO,uBAAA,CAAwB,MAAA;AAAA,EACnC;AAGA,EAAA,IAAI,OAAO,yBAAA,EAA2B;AACpC,IAAA,OAAA,CAAQ,8BAA8B,CAAA,GACpC,MAAA,CAAO,yBAAA,CAA0B,MAAA;AAAA,EACrC;AAGA,EAAA,OAAA,CAAQ,wBAAwB,CAAA,GAAI,MAAA,CAAO,kBAAA,CAAmB,QAC1D,IAAA,GACA,KAAA;AAGJ,EAAA,OAAA,CAAQ,iBAAiB,CAAA,GAAI,MAAA,CAAO,UAAA,CAAW,OAAO,WAAA,EAAY;AAGlE,EAAA,IAAI,OAAO,IAAA,EAAM;AACf,IAAA,IAAI,SAAA,GAAY,CAAA,QAAA,EAAW,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAA;AAC7C,IAAA,IAAI,MAAA,CAAO,KAAK,iBAAA,EAAmB;AACjC,MAAA,SAAA,IAAa,qBAAA;AAAA,IACf;AACA,IAAA,IAAI,MAAA,CAAO,KAAK,OAAA,EAAS;AACvB,MAAA,SAAA,IAAa,WAAA;AAAA,IACf;AACA,IAAA,OAAA,CAAQ,2BAA2B,CAAA,GAAI,SAAA;AAAA,EACzC;AAGA,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,OAAA,CAAQ,wBAAwB,CAAA,GAAI,SAAA;AAAA,EACtC;AAGA,EAAA,OAAA,CAAQ,mCAAmC,CAAA,GACzC,MAAA,CAAO,4BAAA,CAA6B,MAAA;AAGtC,EAAA,OAAA,CAAQ,iBAAiB,CAAA,GAAI,MAAA,CAAO,cAAA,CAAe,MAAA;AAGnD,EAAA,IAAI,OAAO,SAAA,EAAW;AACpB,IAAA,OAAA,CAAQ,kBAAkB,CAAA,GAAI,eAAA;AAAA,EAChC,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,kBAAkB,CAAA,GAAI,GAAA;AAAA,EAChC;AAEA,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,kBAAA,CACd,KACA,MAAA,EACM;AACN,EAAA,MAAM,OAAA,GAAU,mBAAmB,MAAM,CAAA;AAEzC,EAAA,GAAA,CAAI,GAAA,CAAI,CAAC,IAAA,EAAW,GAAA,EAAU,IAAA,KAAc;AAC1C,IAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAChD,MAAA,GAAA,CAAI,SAAA,CAAU,KAAK,KAAK,CAAA;AAAA,IAC1B,CAAC,CAAA;AACD,IAAA,IAAA,EAAK;AAAA,EACP,CAAC,CAAA;AACH;AAKO,SAAS,kBAAA,CACd,KACA,MAAA,EACM;AACN,EAAA,MAAM,OAAA,GAAU,mBAAmB,MAAM,CAAA;AAEzC,EAAA,GAAA,CAAI,OAAA,CAAQ,WAAA,EAAa,OAAO,QAAA,EAAe,KAAA,KAAe;AAC5D,IAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAChD,MAAA,KAAA,CAAM,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACzB,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;;;AC3HA,IAAM,MAAA,GAAS;AAAA,EACb,KAAA,EAAO,SAAA;AAAA,EACP,GAAA,EAAK,UAAA;AAAA,EACL,KAAA,EAAO,UAAA;AAAA,EACP,MAAA,EAAQ,UAAA;AAAA,EAER,OAAA,EAAS,UAAA;AAAA,EAET,IAAA,EAAM;AACR,CAAA;AAcO,IAAM,SAAN,MAAa;AAAA,EAIlB,WAAA,CAAY,OAAA,GAAkB,QAAA,EAAU,MAAA,GAAuB,EAAC,EAAG;AACjE,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,SAAS,EAAE,OAAA,EAAS,MAAM,SAAA,EAAW,IAAA,EAAM,GAAG,MAAA,EAAO;AAAA,EAC5D;AAAA,EAEQ,YAAA,GAAe;AACrB,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW,OAAO,EAAA;AACnC,IAAA,OAAA,iBAAO,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,EAChC;AAAA,EAEQ,KAAA,CAAM,KAAA,EAAe,OAAA,EAAiB,KAAA,EAAe;AAC3D,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,OAAA,KAAY,KAAA,EAAO;AAEnC,IAAA,MAAM,MAAM,OAAA,CAAQ,GAAA;AACpB,IAAA,MAAM,SAAA,GAAY,KAAK,YAAA,EAAa;AACpC,IAAA,MAAM,GAAA,GAAM,IAAI,MAAA,CAAO,MAAM,GAAG,IAAA,CAAK,OAAO,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,CAAA,CAAA;AAG3D,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,OAAA,EAAU,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,MAAA,CAAO,IAAI,CAAA,EAAG,GAAG,CAAA,EAAG,OAAO,KAAK,CAAA,IAAA,EACpE,SAAS,CAAA,GAAA,EAAM,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,EAAG,OAAO,CAAA,EAAG,MAAA,CAAO,KAAK;AAAA;AAAA,KAC3D;AAAA,EACF;AAAA,EAEA,IAAI,OAAA,EAAiB;AACnB,IAAA,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA;AAAA,EACzC;AAAA,EAEA,KAAA,CAAM,SAAiB,KAAA,EAAgB;AACrC,IAAA,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,OAAA,EAAS,MAAA,CAAO,GAAG,CAAA;AACvC,IAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,MAAA,CAAO,GAAG,CAAA,EAAG,KAAK,CAAA,EAAG,MAAA,CAAO,KAAK;AAAA,CAAI,CAAA;AAAA,EAC1E;AAAA,EAEA,KAAK,OAAA,EAAiB;AACpB,IAAA,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,OAAA,EAAS,MAAA,CAAO,MAAM,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,OAAA,EAAiB;AACrB,IAAA,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,OAAA,EAAS,MAAA,CAAO,OAAO,CAAA;AAAA,EAC7C;AACF;;;AChEA,IAAM,YAAA,GAAuC;AAAA,EAC3C,GAAA,EAAK,UAAA;AAAA;AAAA,EACL,IAAA,EAAM,UAAA;AAAA;AAAA,EACN,GAAA,EAAK,UAAA;AAAA;AAAA,EACL,MAAA,EAAQ,UAAA;AAAA;AAAA,EACR,KAAA,EAAO,UAAA;AAAA;AAAA,EACP,OAAA,EAAS,UAAA;AAAA;AAAA,EACT,IAAA,EAAM;AAAA;AACR,CAAA;AAEA,IAAM,UAAA,GAAa,SAAA;AAcZ,IAAM,UAAA,GAAa,CAAC,OAAA,GAA6B,EAAC,KAAM;AAC7D,EAAA,MAAM,MAAA,GAAS,IAAI,MAAA,CAAO,OAAA,CAAQ,WAAW,QAAQ,CAAA;AAErD,EAAA,OAAO,CAAC,GAAA,EAAU,GAAA,EAAU,IAAA,KAAsB;AAChD,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AAIvB,IAAA,GAAA,CAAI,EAAA,CAAG,UAAU,MAAM;AACrB,MAAA,MAAM,EAAE,MAAA,EAAQ,GAAA,EAAK,OAAA,EAAQ,GAAI,GAAA;AACjC,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAC9B,MAAA,MAAM,SAAS,GAAA,CAAI,UAAA;AACnB,MAAA,MAAM,SAAA,GAAY,OAAA,GAAU,OAAA,CAAQ,YAAY,KAAK,GAAA,GAAM,GAAA;AAE3D,MAAA,MAAM,WAAA,GAAc,YAAA,CAAa,MAAM,CAAA,IAAK,UAAA;AAC5C,MAAA,MAAM,gBAAgB,CAAA,EAAG,WAAW,CAAA,EAAG,MAAM,GAAG,UAAU,CAAA,CAAA;AAE1D,MAAA,IAAI,aAAa,CAAA,EAAG,aAAa,CAAA,CAAA,EAAI,GAAG,IAAI,MAAM,CAAA,CAAA;AAElD,MAAA,IAAI,OAAA,CAAQ,aAAa,KAAA,EAAO;AAC9B,QAAA,UAAA,IAAc,KAAK,QAAQ,CAAA,EAAA,CAAA;AAAA,MAC7B;AAEA,MAAA,IAAI,QAAQ,aAAA,EAAe;AACzB,QAAA,UAAA,IAAc,MAAM,SAAS,CAAA,CAAA;AAAA,MAC/B;AAGA,MAAA,IAAI,MAAA,IAAU,GAAA,EAAK,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAAA,WAAA,IACjC,MAAA,IAAU,GAAA,EAAK,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAAA,WACzC,MAAA,CAAO,IAAI,UAAU,CAAA;AAAA,IAC5B,CAAC,CAAA;AAED,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAA,EAAK;AAAA,IACP;AAAA,EACF,CAAA;AACF,CAAA;;;AC9BO,IAAM,QAAN,MAAY;AAAA,EAUjB,WAAA,CAAY,MAAA,GAAsB,EAAC,EAAG;AACpC,IAAA,IAAA,CAAK,UAAA,GAAa,iBAAA,CAAkB,MAAA,CAAO,IAAI,CAAA;AAC/C,IAAA,IAAA,CAAK,UAAA,GAAa,iBAAA,CAAkB,MAAA,CAAO,IAAI,CAAA;AAC/C,IAAA,IAAA,CAAK,YAAA,GAAe,mBAAA,CAAoB,MAAA,CAAO,MAAM,CAAA;AACrD,IAAA,IAAA,CAAK,kBAAA,GAAqB,yBAAA,CAA0B,MAAA,CAAO,YAAY,CAAA;AACvE,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,sBAAA,CAAuB,IAAA,CAAK,UAAU,CAAA;AAG/D,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,MAAA,CAAO,OAAO,CAAA;AAGhC,IAAA,IAAA,CAAK,SAAA,GAAY,OAAO,SAAA,KAAc,SAAA;AACtC,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,IAAA,CAAK,OAAA,GAAU,IAAI,cAAA,CAAe,IAAA,CAAK,kBAAkB,CAAA;AAAA,IAC3D,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,OAAA,GAAU,IAAI,cAAA,CAAe,IAAA,CAAK,kBAAkB,CAAA;AAAA,IAC3D;AAGA,IAAA,IAAI,MAAA,CAAO,MAAA,EAAQ,OAAA,KAAY,KAAA,EAAO;AACpC,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA;AAAA,QACX,UAAA,CAAW;AAAA,UACT,aAAA,EAAe,OAAO,MAAA,EAAQ,aAAA;AAAA,UAC9B,QAAA,EAAU,MAAA,CAAO,MAAA,EAAQ,QAAA,IAAY;AAAA,SACtC;AAAA,OACH;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,sBAAA,EAAuB;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAA,GAA+B;AACrC,IAAA,MAAM,GAAA,GAAM,KAAK,OAAA,CAAQ,GAAA;AAEzB,IAAA,IAAI,KAAK,SAAA,EAAW;AAElB,MAAA,IAAI,KAAK,YAAA,EAAc;AACrB,QAAA,kBAAA,CAAmB,GAAA,EAAK,KAAK,YAAY,CAAA;AAAA,MAC3C;AAEA,MAAA,IAAI,KAAK,UAAA,EAAY;AACnB,QAAA,gBAAA,CAAiB,GAAA,EAAK,KAAK,UAAU,CAAA;AAAA,MACvC;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,IAAI,KAAK,YAAA,EAAc;AACrB,QAAA,kBAAA,CAAmB,GAAA,EAAK,KAAK,YAAY,CAAA;AAAA,MAC3C;AACA,MAAA,IAAI,KAAK,UAAA,EAAY;AACnB,QAAA,gBAAA,CAAiB,GAAA,EAAK,KAAK,UAAU,CAAA;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,MAAA,EAAgC;AACvC,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AACxB,MAAA,IAAA,CAAK,OAAA,CAAQ,cAAc,KAAK,CAAA;AAChC,MAAA,IAAI,IAAA,CAAK,WAAW,OAAA,EAAS;AAC3B,QAAA,IAAA,CAAK,aAAA,CAAc,SAAS,KAAK,CAAA;AAAA,MACnC;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,EAAoB;AACxB,IAAA,IAAI,IAAA,CAAK,WAAW,OAAA,EAAS;AAC3B,MAAA,IAAA,CAAK,SAAA,EAAU;AAAA,IACjB;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAM,MAAM;AAC9B,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,uCAAA,EAAmC,IAAI,CAAA,CAAE,CAAA;AACrD,MAAA,IAAI,IAAA,CAAK,WAAW,OAAA,EAAS;AAC3B,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,CAAA,6CAAA,EAAyC,IAAI,CAAA,EAAG,IAAA,CAAK,WAAW,IAAI,CAAA;AAAA,SACtE;AAAA,MACF;AACA,MAAA,IAAI,KAAK,UAAA,EAAY;AACnB,QAAA,OAAA,CAAQ,IAAI,CAAA,sBAAA,CAAiB,CAAA;AAAA,MAC/B;AACA,MAAA,IAAI,KAAK,YAAA,EAAc;AACrB,QAAA,OAAA,CAAQ,IAAI,CAAA,gDAAA,CAAsC,CAAA;AAAA,MACpD;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAA,GAAkB;AACxB,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,aAAA,CAAA;AAExC,IAAA,IAAA,CAAK,OAAA,CAAQ,mBAAA,CAAoB,KAAA,EAAO,QAAA,EAAU,YAAY;AAC5D,MAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,IAAA,CAAK,aAAA,CAAc,cAAa,EAAE;AAAA,IACjE,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,QAAQ,mBAAA,CAAoB,KAAA,EAAO,IAAA,CAAK,UAAA,CAAW,MAAM,YAAY;AACxE,MAAA,MAAM,IAAA,GACJ,IAAA,CAAK,UAAA,CAAW,EAAA,KAAO,SAAA,GACnB,IAAA,CAAK,aAAA,CAAc,cAAA,CAAe,QAAQ,CAAA,GAC1C,IAAA,CAAK,aAAA,CAAc,cAAc,QAAQ,CAAA;AAE/C,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AACF;;;AC9IO,SAAS,YAMd,MAAA,EAAgE;AAChE,EAAA,OAAO,MAAA;AACT;;;ACPO,SAAS,iBAId,EAAA,EAA4C;AAC5C,EAAA,OAAO,EAAA;AACT;ACpBAC,iCAAA,CAAqBC,KAAC,CAAA","file":"index.cjs","sourcesContent":["/**\n * Unified Exception System\n * NestJS-style HTTP exceptions for standardized error handling\n */\n\nexport interface HttpErrorResponse {\n statusCode: number;\n message: string;\n error?: string;\n timestamp?: string;\n path?: string;\n details?: unknown;\n}\n\n/**\n * Base HTTP Exception Class\n */\nexport class HttpException extends Error {\n public readonly statusCode: number;\n public readonly error: string;\n public readonly details?: unknown;\n\n constructor(\n response: string | Record<string, any>,\n statusCode: number,\n details?: unknown,\n ) {\n const message =\n typeof response === \"string\" ? response : JSON.stringify(response);\n super(message);\n this.statusCode = statusCode;\n this.error = this.getStatusName(statusCode);\n this.details = details;\n\n // Maintain prototype chain for instanceof checks\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n public getResponse(): HttpErrorResponse {\n return {\n statusCode: this.statusCode,\n message: this.message,\n error: this.error,\n timestamp: new Date().toISOString(),\n details: this.details,\n };\n }\n\n private getStatusName(code: number): string {\n const names: Record<number, string> = {\n 400: \"Bad Request\",\n 401: \"Unauthorized\",\n 402: \"Payment Required\",\n 403: \"Forbidden\",\n 404: \"Not Found\",\n 405: \"Method Not Allowed\",\n 406: \"Not Acceptable\",\n 408: \"Request Timeout\",\n 409: \"Conflict\",\n 410: \"Gone\",\n 412: \"Precondition Failed\",\n 413: \"Payload Too Large\",\n 415: \"Unsupported Media Type\",\n 418: \"I'm a teapot\",\n 422: \"Unprocessable Entity\",\n 429: \"Too Many Requests\",\n 500: \"Internal Server Error\",\n 501: \"Not Implemented\",\n 502: \"Bad Gateway\",\n 503: \"Service Unavailable\",\n 504: \"Gateway Timeout\",\n };\n return names[code] || \"Error\";\n }\n}\n\n// --- Factory Classes for Common Exceptions ---\n\nexport class BadRequestException extends HttpException {\n constructor(message = \"Bad Request\", details?: unknown) {\n super(message, 400, details);\n }\n}\n\nexport class UnauthorizedException extends HttpException {\n constructor(message = \"Unauthorized\", details?: unknown) {\n super(message, 401, details);\n }\n}\n\nexport class ForbiddenException extends HttpException {\n constructor(message = \"Forbidden\", details?: unknown) {\n super(message, 403, details);\n }\n}\n\nexport class NotFoundException extends HttpException {\n constructor(message = \"Not Found\", details?: unknown) {\n super(message, 404, details);\n }\n}\n\nexport class ConflictException extends HttpException {\n constructor(message = \"Conflict\", details?: unknown) {\n super(message, 409, details);\n }\n}\n\nexport class GoneException extends HttpException {\n constructor(message = \"Gone\", details?: unknown) {\n super(message, 410, details);\n }\n}\n\nexport class PayloadTooLargeException extends HttpException {\n constructor(message = \"Payload Too Large\", details?: unknown) {\n super(message, 413, details);\n }\n}\n\nexport class UnsupportedMediaTypeException extends HttpException {\n constructor(message = \"Unsupported Media Type\", details?: unknown) {\n super(message, 415, details);\n }\n}\n\nexport class UnprocessableEntityException extends HttpException {\n constructor(message = \"Unprocessable Entity\", details?: unknown) {\n super(message, 422, details);\n }\n}\n\nexport class InternalServerErrorException extends HttpException {\n constructor(message = \"Internal Server Error\", details?: unknown) {\n super(message, 500, details);\n }\n}\n\nexport class NotImplementedException extends HttpException {\n constructor(message = \"Not Implemented\", details?: unknown) {\n super(message, 501, details);\n }\n}\n\nexport class BadGatewayException extends HttpException {\n constructor(message = \"Bad Gateway\", details?: unknown) {\n super(message, 502, details);\n }\n}\n\nexport class ServiceUnavailableException extends HttpException {\n constructor(message = \"Service Unavailable\", details?: unknown) {\n super(message, 503, details);\n }\n}\n\nexport class GatewayTimeoutException extends HttpException {\n constructor(message = \"Gateway Timeout\", details?: unknown) {\n super(message, 504, details);\n }\n}\n\n/**\n * Custom Exception for specific use cases\n */\nexport class CustomException extends HttpException {\n constructor(message: string, statusCode: number, details?: unknown) {\n super(message, statusCode, details);\n }\n}\n","/**\n * Error Types and Handler\n * Types for global error handling\n */\n\nimport type { Request, Response } from \"express\";\nimport type { FastifyRequest, FastifyReply } from \"fastify\";\nimport { HttpException } from \"../core/exceptions\";\n\n/**\n * Error context passed to error handlers\n */\nexport interface ErrorContext {\n /** The error that occurred */\n error: Error;\n /** HTTP request (Express or Fastify) */\n request: Request | FastifyRequest;\n /** HTTP response (Express or Fastify) */\n response: Response | FastifyReply;\n /** Route path that errored */\n path?: string;\n /** HTTP method */\n method?: string;\n}\n\n/**\n * Error response returned by error handlers\n */\nexport interface ErrorResponse {\n /** HTTP status code */\n status: number;\n /** Response body */\n body: Record<string, unknown>;\n /** Optional headers to set */\n headers?: Record<string, string>;\n}\n\n/**\n * Global error handler function type\n */\nexport type ErrorHandler = (\n ctx: ErrorContext,\n) => ErrorResponse | Promise<ErrorResponse>;\n\n/**\n * Error handler configuration\n */\nexport interface ErrorHandlerConfig {\n /** Custom error handler function */\n handler?: ErrorHandler;\n /** Include stack trace in development */\n includeStack?: boolean;\n /** Log errors to console */\n logErrors?: boolean;\n /** Custom error logger */\n logger?: (error: Error, ctx: ErrorContext) => void;\n}\n\n/**\n * Resolved error handler config with defaults\n */\nexport interface ResolvedErrorHandlerConfig {\n handler: ErrorHandler;\n includeStack: boolean;\n logErrors: boolean;\n logger: (error: Error, ctx: ErrorContext) => void;\n}\n\n/**\n * Default error logger\n */\nconst defaultLogger = (error: Error, ctx: ErrorContext) => {\n console.error(`[Nural Error] ${ctx.method} ${ctx.path}:`, error.message);\n if (error.stack) {\n console.error(error.stack);\n }\n};\n\n/**\n * Default error handler - converts errors to HTTP responses\n */\nexport const defaultErrorHandler: ErrorHandler = (ctx) => {\n const { error } = ctx;\n\n // Zod validation error\n if (error.name === \"ZodError\" && \"issues\" in error) {\n return {\n status: 400,\n body: {\n error: \"Validation Error\",\n message: \"Request validation failed\",\n details: (error as any).issues,\n },\n };\n }\n\n // Unified Exception Handling\n if (error instanceof HttpException) {\n const response = error.getResponse();\n return {\n status: response.statusCode,\n body: response as unknown as Record<string, unknown>,\n };\n }\n\n // Custom HTTP error (has status property) - Legacy support\n if (\"status\" in error && typeof (error as any).status === \"number\") {\n return {\n status: (error as any).status,\n body: {\n error: error.name || \"Error\",\n message: error.message,\n },\n };\n }\n\n // Auth errors\n if (\n error.message.toLowerCase().includes(\"unauthorized\") ||\n error.message.toLowerCase().includes(\"authentication\")\n ) {\n return {\n status: 401,\n body: {\n error: \"Unauthorized\",\n message: error.message,\n },\n };\n }\n\n if (\n error.message.toLowerCase().includes(\"forbidden\") ||\n error.message.toLowerCase().includes(\"permission\")\n ) {\n return {\n status: 403,\n body: {\n error: \"Forbidden\",\n message: error.message,\n },\n };\n }\n\n if (error.message.toLowerCase().includes(\"not found\")) {\n return {\n status: 404,\n body: {\n error: \"Not Found\",\n message: error.message,\n },\n };\n }\n\n // Default: Internal Server Error\n return {\n status: 500,\n body: {\n error: \"Internal Server Error\",\n message:\n process.env.NODE_ENV === \"production\"\n ? \"An unexpected error occurred\"\n : error.message,\n },\n };\n};\n\n/**\n * Default error handler config\n */\nexport const DEFAULT_ERROR_HANDLER_CONFIG: ResolvedErrorHandlerConfig = {\n handler: defaultErrorHandler,\n includeStack: process.env.NODE_ENV !== \"production\",\n logErrors: true,\n logger: defaultLogger,\n};\n\n/**\n * Resolve error handler config from user input\n */\nexport function resolveErrorHandlerConfig(\n config?: boolean | ErrorHandler | ErrorHandlerConfig,\n): ResolvedErrorHandlerConfig {\n // Disabled\n if (config === false) {\n return {\n ...DEFAULT_ERROR_HANDLER_CONFIG,\n logErrors: false,\n };\n }\n\n // Default config\n if (config === true || config === undefined) {\n return DEFAULT_ERROR_HANDLER_CONFIG;\n }\n\n // Function only\n if (typeof config === \"function\") {\n return {\n ...DEFAULT_ERROR_HANDLER_CONFIG,\n handler: config,\n };\n }\n\n // Full config object\n return {\n handler: config.handler ?? DEFAULT_ERROR_HANDLER_CONFIG.handler,\n includeStack:\n config.includeStack ?? DEFAULT_ERROR_HANDLER_CONFIG.includeStack,\n logErrors: config.logErrors ?? DEFAULT_ERROR_HANDLER_CONFIG.logErrors,\n logger: config.logger ?? DEFAULT_ERROR_HANDLER_CONFIG.logger,\n };\n}\n","/**\n * Express Adapter\n * Implements ServerAdapter for Express framework\n */\n\nimport express, { Express, Request, Response, RequestHandler } from \"express\";\nimport { z } from \"zod\";\nimport type { AnyRouteConfig } from \"../types/route\";\nimport type { ServerAdapter, StaticRouteResponse } from \"./base\";\nimport type { ResolvedErrorHandlerConfig, ErrorContext } from \"../types/error\";\nimport { DEFAULT_ERROR_HANDLER_CONFIG } from \"../types/error\";\n\n/**\n * Express adapter implementation\n */\nexport class ExpressAdapter implements ServerAdapter {\n public app: Express;\n private errorConfig: ResolvedErrorHandlerConfig;\n\n constructor(errorConfig?: ResolvedErrorHandlerConfig) {\n this.app = express();\n this.app.use(express.json());\n this.errorConfig = errorConfig ?? DEFAULT_ERROR_HANDLER_CONFIG;\n }\n\n listen(port: number, cb?: () => void): void {\n this.app.listen(port, cb);\n }\n\n use(middleware: RequestHandler): void {\n this.app.use(middleware);\n }\n\n /**\n * Handle errors using the configured error handler\n */\n private async handleError(\n error: Error,\n req: Request,\n res: Response,\n path?: string,\n ): Promise<void> {\n const ctx: ErrorContext = {\n error,\n request: req,\n response: res,\n path: path ?? req.path,\n method: req.method,\n };\n\n // Log error if enabled\n if (this.errorConfig.logErrors) {\n this.errorConfig.logger(error, ctx);\n }\n\n try {\n // Get error response from handler\n const errorResponse = await this.errorConfig.handler(ctx);\n\n // Set headers if provided\n if (errorResponse.headers) {\n Object.entries(errorResponse.headers).forEach(([key, value]) => {\n res.setHeader(key, value);\n });\n }\n\n // Include stack in development mode\n const body = { ...errorResponse.body };\n if (this.errorConfig.includeStack && error.stack) {\n body.stack = error.stack;\n }\n\n res.status(errorResponse.status).json(body);\n } catch (handlerError) {\n // Fallback if error handler itself fails\n console.error(\"[Nural] Error handler failed:\", handlerError);\n res.status(500).json({ error: \"Internal Server Error\" });\n }\n }\n\n registerStaticRoute(\n method: \"get\",\n path: string,\n handler: (req: Request) => Promise<StaticRouteResponse>,\n ): void {\n this.app[method](path, async (req, res) => {\n try {\n const result = await handler(req);\n if (result.type === \"html\") {\n res.set(\"Content-Type\", \"text/html\");\n res.send(result.data);\n } else {\n res.json(result.data);\n }\n } catch (err) {\n await this.handleError(err as Error, req, res, path);\n }\n });\n }\n\n registerRoute(route: AnyRouteConfig): void {\n const handler: RequestHandler = async (req, res, next) => {\n try {\n // 1. Prepare Base Context\n let context: Record<string, unknown> = { req, res };\n\n // 2. Run Middleware Pipeline\n if (route.middleware && route.middleware.length > 0) {\n for (const mw of route.middleware) {\n const result = await mw(req, res);\n if (result && typeof result === \"object\") {\n context = { ...context, ...result };\n }\n }\n }\n\n // 3. Input Validation\n const params = route.request?.params\n ? await route.request.params.parseAsync(req.params)\n : req.params;\n\n const query = route.request?.query\n ? await route.request.query.parseAsync(req.query)\n : req.query;\n\n const body = route.request?.body\n ? await route.request.body.parseAsync(req.body)\n : req.body;\n\n // 4. Execute Handler\n const result = await route.handler({\n ...context,\n params,\n query,\n body,\n req,\n res,\n });\n\n // 5. Response Mapping (strips unlisted fields)\n const responses = route.responses ?? {};\n const successCodeKey =\n Object.keys(responses).find((c) => c.startsWith(\"2\")) ?? \"200\";\n const responseSchema = responses[Number(successCodeKey)];\n\n if (responseSchema) {\n const cleanResult = await responseSchema.parseAsync(result);\n res.status(Number(successCodeKey)).json(cleanResult);\n } else if (result !== undefined) {\n res.status(Number(successCodeKey)).json(result);\n } else {\n res.status(Number(successCodeKey)).send();\n }\n } catch (err) {\n await this.handleError(err as Error, req, res, route.path);\n }\n };\n\n // Register route based on HTTP method\n const path = route.path;\n switch (route.method) {\n case \"GET\":\n this.app.get(path, handler);\n break;\n case \"POST\":\n this.app.post(path, handler);\n break;\n case \"PUT\":\n this.app.put(path, handler);\n break;\n case \"PATCH\":\n this.app.patch(path, handler);\n break;\n case \"DELETE\":\n this.app.delete(path, handler);\n break;\n case \"OPTIONS\":\n this.app.options(path, handler);\n break;\n case \"HEAD\":\n this.app.head(path, handler);\n break;\n case \"ALL\":\n this.app.all(path, handler);\n break;\n }\n }\n}\n","/**\n * Fastify Adapter\n * Implements ServerAdapter for Fastify framework\n */\n\nimport Fastify, {\n FastifyInstance,\n FastifyRequest,\n FastifyReply,\n HTTPMethods,\n FastifyPluginCallback,\n} from \"fastify\";\nimport { z } from \"zod\";\nimport type { AnyRouteConfig } from \"../types/route\";\nimport type { ServerAdapter, StaticRouteResponse } from \"./base\";\nimport type { ResolvedErrorHandlerConfig, ErrorContext } from \"../types/error\";\nimport { DEFAULT_ERROR_HANDLER_CONFIG } from \"../types/error\";\n\n/**\n * Fastify adapter implementation\n */\nexport class FastifyAdapter implements ServerAdapter {\n public app: FastifyInstance;\n private errorConfig: ResolvedErrorHandlerConfig;\n\n constructor(errorConfig?: ResolvedErrorHandlerConfig) {\n this.app = Fastify();\n this.errorConfig = errorConfig ?? DEFAULT_ERROR_HANDLER_CONFIG;\n }\n\n listen(port: number, cb?: () => void): void {\n this.app.listen({ port }, (err) => {\n if (err) {\n console.error(err);\n process.exit(1);\n }\n if (cb) cb();\n });\n }\n\n use(middleware: FastifyPluginCallback): void {\n this.app.register(middleware);\n }\n\n /**\n * Handle errors using the configured error handler\n */\n private async handleError(\n error: Error,\n req: FastifyRequest,\n reply: FastifyReply,\n path?: string,\n ): Promise<void> {\n const ctx: ErrorContext = {\n error,\n request: req,\n response: reply,\n path: path ?? req.url,\n method: req.method,\n };\n\n // Log error if enabled\n if (this.errorConfig.logErrors) {\n this.errorConfig.logger(error, ctx);\n }\n\n try {\n // Get error response from handler\n const errorResponse = await this.errorConfig.handler(ctx);\n\n // Set headers if provided\n if (errorResponse.headers) {\n Object.entries(errorResponse.headers).forEach(([key, value]) => {\n reply.header(key, value);\n });\n }\n\n // Include stack in development mode\n const body = { ...errorResponse.body };\n if (this.errorConfig.includeStack && error.stack) {\n body.stack = error.stack;\n }\n\n reply.status(errorResponse.status).send(body);\n } catch (handlerError) {\n // Fallback if error handler itself fails\n console.error(\"[Nural] Error handler failed:\", handlerError);\n reply.status(500).send({ error: \"Internal Server Error\" });\n }\n }\n\n registerStaticRoute(\n method: \"get\",\n path: string,\n handler: (req: unknown) => Promise<StaticRouteResponse>,\n ): void {\n this.app.get(path, async (req, reply) => {\n try {\n const result = await handler(req);\n if (result.type === \"html\") {\n reply.type(\"text/html\").send(result.data);\n } else {\n reply.send(result.data);\n }\n } catch (err) {\n await this.handleError(err as Error, req, reply, path);\n }\n });\n }\n\n registerRoute(route: AnyRouteConfig): void {\n const url = route.path;\n\n this.app.route({\n method: route.method as HTTPMethods,\n url,\n handler: async (req: FastifyRequest, reply: FastifyReply) => {\n try {\n // 1. Prepare Context\n let context: Record<string, unknown> = { req, res: reply };\n\n // 2. Run Middleware Pipeline\n if (route.middleware && route.middleware.length > 0) {\n for (const mw of route.middleware) {\n const result = await mw(req, reply);\n if (result && typeof result === \"object\") {\n context = { ...context, ...result };\n }\n }\n }\n\n // 3. Input Validation\n const params = route.request?.params\n ? await route.request.params.parseAsync(req.params)\n : req.params;\n\n const query = route.request?.query\n ? await route.request.query.parseAsync(req.query)\n : req.query;\n\n const body = route.request?.body\n ? await route.request.body.parseAsync(req.body)\n : req.body;\n\n // 4. Execute Handler\n const result = await route.handler({\n ...context,\n params,\n query,\n body,\n req,\n res: reply,\n });\n\n // 5. Response Mapping\n const responses = route.responses ?? {};\n const successCodeKey =\n Object.keys(responses).find((c) => c.startsWith(\"2\")) ?? \"200\";\n const responseSchema = responses[Number(successCodeKey)];\n\n if (responseSchema) {\n const cleanResult = await responseSchema.parseAsync(result);\n reply.status(Number(successCodeKey)).send(cleanResult);\n } else if (result !== undefined) {\n reply.status(Number(successCodeKey)).send(result);\n } else {\n reply.status(Number(successCodeKey)).send();\n }\n } catch (err) {\n await this.handleError(err as Error, req, reply, route.path);\n }\n },\n });\n }\n}\n","/**\n * Configuration Types\n * Types for Nural framework configuration\n */\n\n/**\n * Documentation configuration options\n */\n\n/**\n * Scalar UI Configuration\n * @see https://github.com/scalar/scalar\n */\nexport interface ScalarConfig {\n theme?:\n | \"alternate\"\n | \"default\"\n | \"moon\"\n | \"purple\"\n | \"solarized\"\n | \"bluePlanet\"\n | \"saturn\"\n | \"kepler\"\n | \"mars\"\n | \"deepSpace\"\n | \"laserwave\"\n | \"none\";\n layout?: \"modern\" | \"classic\";\n scale?: number;\n content?: string | Record<string, any>;\n spec?: { url?: string; content?: string | Record<string, any> };\n proxyUrl?: string;\n isEditable?: boolean;\n showSidebar?: boolean;\n hideModels?: boolean;\n hideDownloadButton?: boolean;\n hideTestRequestButton?: boolean;\n hideSearch?: boolean;\n darkMode?: boolean;\n forceDarkModeState?: \"dark\" | \"light\";\n hideDarkModeToggle?: boolean;\n customCss?: string;\n searchHotKey?: string;\n metaData?: Record<string, any>;\n hiddenClients?: string[] | boolean | Record<string, any>;\n // Auth\n authentication?: {\n preferredSecurityScheme?: string | string[];\n securitySchemes?: Record<string, any>;\n };\n // Advanced\n defaultHttpClient?: { targetKey: string; clientKey: string };\n withDefaultFonts?: boolean;\n defaultOpenAllTags?: boolean;\n tagsSorter?: \"alpha\" | Function;\n operationsSorter?: \"alpha\" | \"method\" | Function;\n [key: string]: any;\n}\n\n/**\n * Swagger UI Configuration\n * @see https://github.com/swagger-api/swagger-ui/blob/master/docs/usage/configuration.md\n */\nexport interface SwaggerConfig {\n /**\n * Swagger UI Theme\n * - outline: A modern, clean theme (default)\n * - classic: The standard Swagger UI look\n * - no-theme: No extra styling included (use your own)\n */\n theme?: \"outline\" | \"classic\" | \"no-theme\";\n options?: {\n dom_id?: string;\n domNode?: any;\n spec?: any;\n url?: string;\n urls?: { url: string; name: string }[];\n layout?: string;\n docExpansion?: \"list\" | \"full\" | \"none\";\n maxDisplayedTags?: number;\n depth?: number;\n filter?: boolean | string;\n deepLinking?: boolean;\n displayOperationId?: boolean;\n defaultModelsExpandDepth?: number;\n defaultModelExpandDepth?: number;\n defaultModelRendering?: \"example\" | \"model\";\n displayRequestDuration?: boolean;\n showExtensions?: boolean;\n showCommonExtensions?: boolean;\n showMutatedRequest?: boolean;\n supportedSubmitMethods?: string[];\n validatorUrl?: string | null;\n withCredentials?: boolean;\n persistAuthorization?: boolean;\n oauth2RedirectUrl?: string;\n plugins?: any[];\n presets?: any[];\n [key: string]: any;\n };\n}\n\n/**\n * Documentation configuration options\n */\nexport interface DocsConfig {\n /** Enable documentation endpoint */\n enabled?: boolean;\n /**\n * Documentation UI path (default: /docs)\n */\n path?: string;\n /**\n * Documentation UI type\n * @default \"scalar\"\n */\n ui?: \"scalar\" | \"swagger\";\n /**\n * OpenAPI Specification overrides\n * Allows full customization of the OpenAPI document\n */\n openApi?: {\n info?: {\n title?: string;\n version?: string;\n description?: string;\n termsOfService?: string;\n contact?: { name?: string; url?: string; email?: string };\n license?: { name?: string; url?: string };\n };\n servers?: Array<{ url: string; description?: string }>;\n components?: {\n securitySchemes?: Record<string, any>;\n [key: string]: any;\n };\n security?: Array<Record<string, string[]>>;\n tags?: Array<{ name: string; description?: string }>;\n externalDocs?: { description?: string; url: string };\n };\n /** Configuration specific to Scalar UI */\n scalar?: ScalarConfig;\n /** Configuration specific to Swagger UI */\n swagger?: SwaggerConfig;\n // Backward compatibility\n title?: string;\n version?: string;\n description?: string;\n}\n\n/**\n * Main Nural framework configuration\n */\nexport interface NuralConfig {\n /** Server framework to use */\n framework?: \"express\" | \"fastify\";\n /** Documentation settings (true for defaults, false to disable, or DocsConfig) */\n docs?: boolean | DocsConfig;\n /** CORS settings (true for defaults, false to disable, or CorsConfig) */\n cors?: boolean | import(\"./middleware\").CorsConfig;\n /** Helmet security headers (true for defaults, false to disable, or HelmetConfig) */\n helmet?: boolean | import(\"./middleware\").HelmetConfig;\n /** Logger configuration */\n logger?: {\n enabled?: boolean;\n showUserAgent?: boolean;\n showTime?: boolean;\n };\n /** Global error handler (true for defaults, function, or config) */\n errorHandler?:\n | boolean\n | import(\"./error\").ErrorHandler\n | import(\"./error\").ErrorHandlerConfig;\n}\n\n/**\n * Resolved documentation configuration (with defaults applied)\n */\nexport interface ResolvedDocsConfig {\n enabled: boolean;\n path: string;\n ui: \"scalar\" | \"swagger\";\n openApi: NonNullable<DocsConfig[\"openApi\"]>;\n scalar: ScalarConfig;\n swagger: SwaggerConfig;\n}\n\n/**\n * Default documentation configuration\n */\nexport const DEFAULT_DOCS_CONFIG: ResolvedDocsConfig = {\n enabled: true,\n path: \"/docs\",\n ui: \"scalar\",\n openApi: {\n info: {\n title: \"Nural API\",\n version: \"1.0.0\",\n description: \"Powered by Nural Framework\",\n },\n servers: [{ url: \"/\" }],\n },\n scalar: {},\n swagger: {},\n};\n\n/**\n * Resolve docs config from user input\n */\nexport function resolveDocsConfig(\n docs?: boolean | DocsConfig,\n): ResolvedDocsConfig {\n if (docs === false) {\n return { ...DEFAULT_DOCS_CONFIG, enabled: false };\n }\n\n if (docs === true || docs === undefined) {\n return DEFAULT_DOCS_CONFIG;\n }\n\n // Merge with defaults\n return {\n enabled: docs.enabled ?? true,\n path: docs.path ?? DEFAULT_DOCS_CONFIG.path,\n ui: docs.ui ?? DEFAULT_DOCS_CONFIG.ui,\n openApi: {\n ...DEFAULT_DOCS_CONFIG.openApi,\n ...docs.openApi,\n info: {\n ...DEFAULT_DOCS_CONFIG.openApi.info,\n ...docs.openApi?.info,\n // Backward compatibility: use top-level fields if provided\n title:\n docs.title ??\n docs.openApi?.info?.title ??\n DEFAULT_DOCS_CONFIG.openApi.info?.title,\n version:\n docs.version ??\n docs.openApi?.info?.version ??\n DEFAULT_DOCS_CONFIG.openApi.info?.version,\n description:\n docs.description ??\n docs.openApi?.info?.description ??\n DEFAULT_DOCS_CONFIG.openApi.info?.description,\n },\n },\n scalar: docs.scalar ?? {},\n swagger: docs.swagger ?? {},\n };\n}\n","/**\n * Middleware Configuration Types\n * Types for CORS and Helmet middleware configuration\n */\n\n/**\n * CORS configuration options\n */\nexport interface CorsConfig {\n /**\n * Allowed origins\n * - `true` or `'*'` allows all origins\n * - String for single origin\n * - Array for multiple origins\n * - Function for dynamic origin check\n */\n origin?: boolean | string | string[] | ((origin: string) => boolean);\n\n /** Allowed HTTP methods */\n methods?: string[];\n\n /** Allowed headers */\n allowedHeaders?: string[];\n\n /** Headers exposed to client */\n exposedHeaders?: string[];\n\n /** Allow credentials (cookies, authorization headers) */\n credentials?: boolean;\n\n /** Preflight cache max age in seconds */\n maxAge?: number;\n\n /** Pass preflight response to next handler */\n preflightContinue?: boolean;\n\n /** Success status code for OPTIONS requests */\n optionsSuccessStatus?: number;\n}\n\n/**\n * Resolved CORS configuration with defaults applied\n */\nexport interface ResolvedCorsConfig {\n origin: boolean | string | string[] | ((origin: string) => boolean);\n methods: string[];\n allowedHeaders: string[];\n exposedHeaders: string[];\n credentials: boolean;\n maxAge: number;\n preflightContinue: boolean;\n optionsSuccessStatus: number;\n}\n\n/**\n * Default CORS configuration\n */\nexport const DEFAULT_CORS_CONFIG: ResolvedCorsConfig = {\n origin: \"*\",\n methods: [\"GET\", \"HEAD\", \"PUT\", \"PATCH\", \"POST\", \"DELETE\"],\n allowedHeaders: [\"Content-Type\", \"Authorization\", \"X-Requested-With\"],\n exposedHeaders: [],\n credentials: false,\n maxAge: 86400, // 24 hours\n preflightContinue: false,\n optionsSuccessStatus: 204,\n};\n\n/**\n * Helmet configuration options\n */\nexport interface HelmetConfig {\n /** Content-Security-Policy header */\n contentSecurityPolicy?: boolean | { directives?: Record<string, string[]> };\n\n /** Cross-Origin-Embedder-Policy header */\n crossOriginEmbedderPolicy?: boolean;\n\n /** Cross-Origin-Opener-Policy header */\n crossOriginOpenerPolicy?: boolean | { policy?: string };\n\n /** Cross-Origin-Resource-Policy header */\n crossOriginResourcePolicy?: boolean | { policy?: string };\n\n /** X-DNS-Prefetch-Control header */\n dnsPrefetchControl?: boolean | { allow?: boolean };\n\n /** X-Frame-Options header */\n frameguard?: boolean | { action?: \"deny\" | \"sameorigin\" };\n\n /** Strict-Transport-Security header */\n hsts?:\n | boolean\n | { maxAge?: number; includeSubDomains?: boolean; preload?: boolean };\n\n /** X-Content-Type-Options header */\n noSniff?: boolean;\n\n /** X-Permitted-Cross-Domain-Policies header */\n permittedCrossDomainPolicies?: boolean | { policy?: string };\n\n /** Referrer-Policy header */\n referrerPolicy?: boolean | { policy?: string | string[] };\n\n /** X-XSS-Protection header (legacy) */\n xssFilter?: boolean;\n}\n\n/**\n * Resolved Helmet configuration\n */\nexport interface ResolvedHelmetConfig {\n contentSecurityPolicy: boolean | { directives: Record<string, string[]> };\n crossOriginEmbedderPolicy: boolean;\n crossOriginOpenerPolicy: { policy: string };\n crossOriginResourcePolicy: { policy: string };\n dnsPrefetchControl: { allow: boolean };\n frameguard: { action: \"deny\" | \"sameorigin\" };\n hsts: { maxAge: number; includeSubDomains: boolean; preload: boolean };\n noSniff: boolean;\n permittedCrossDomainPolicies: { policy: string };\n referrerPolicy: { policy: string };\n xssFilter: boolean;\n}\n\n/**\n * Default Helmet configuration\n */\nexport const DEFAULT_HELMET_CONFIG: ResolvedHelmetConfig = {\n contentSecurityPolicy: false, // Disabled by default (can break apps)\n crossOriginEmbedderPolicy: false,\n crossOriginOpenerPolicy: { policy: \"same-origin\" },\n crossOriginResourcePolicy: { policy: \"same-origin\" },\n dnsPrefetchControl: { allow: false },\n frameguard: { action: \"sameorigin\" },\n hsts: { maxAge: 15552000, includeSubDomains: true, preload: false }, // 180 days\n noSniff: true,\n permittedCrossDomainPolicies: { policy: \"none\" },\n referrerPolicy: { policy: \"no-referrer\" },\n xssFilter: false, // Deprecated, browsers ignore it\n};\n\n/**\n * Resolve CORS config from user input\n */\nexport function resolveCorsConfig(\n cors?: boolean | CorsConfig,\n): ResolvedCorsConfig | null {\n if (cors === false || cors === undefined) {\n return null;\n }\n\n if (cors === true) {\n return DEFAULT_CORS_CONFIG;\n }\n\n return {\n origin: cors.origin ?? DEFAULT_CORS_CONFIG.origin,\n methods: cors.methods ?? DEFAULT_CORS_CONFIG.methods,\n allowedHeaders: cors.allowedHeaders ?? DEFAULT_CORS_CONFIG.allowedHeaders,\n exposedHeaders: cors.exposedHeaders ?? DEFAULT_CORS_CONFIG.exposedHeaders,\n credentials: cors.credentials ?? DEFAULT_CORS_CONFIG.credentials,\n maxAge: cors.maxAge ?? DEFAULT_CORS_CONFIG.maxAge,\n preflightContinue:\n cors.preflightContinue ?? DEFAULT_CORS_CONFIG.preflightContinue,\n optionsSuccessStatus:\n cors.optionsSuccessStatus ?? DEFAULT_CORS_CONFIG.optionsSuccessStatus,\n };\n}\n\n/**\n * Resolve Helmet config from user input\n */\nexport function resolveHelmetConfig(\n helmet?: boolean | HelmetConfig,\n): ResolvedHelmetConfig | null {\n if (helmet === false || helmet === undefined) {\n return null;\n }\n\n if (helmet === true) {\n return DEFAULT_HELMET_CONFIG;\n }\n\n return {\n contentSecurityPolicy:\n typeof helmet.contentSecurityPolicy === \"object\"\n ? { directives: helmet.contentSecurityPolicy.directives ?? {} }\n : (helmet.contentSecurityPolicy ??\n DEFAULT_HELMET_CONFIG.contentSecurityPolicy),\n crossOriginEmbedderPolicy:\n helmet.crossOriginEmbedderPolicy ??\n DEFAULT_HELMET_CONFIG.crossOriginEmbedderPolicy,\n crossOriginOpenerPolicy:\n typeof helmet.crossOriginOpenerPolicy === \"object\"\n ? (helmet.crossOriginOpenerPolicy as { policy: string })\n : DEFAULT_HELMET_CONFIG.crossOriginOpenerPolicy,\n crossOriginResourcePolicy:\n typeof helmet.crossOriginResourcePolicy === \"object\"\n ? (helmet.crossOriginResourcePolicy as { policy: string })\n : DEFAULT_HELMET_CONFIG.crossOriginResourcePolicy,\n dnsPrefetchControl:\n typeof helmet.dnsPrefetchControl === \"object\"\n ? (helmet.dnsPrefetchControl as { allow: boolean })\n : DEFAULT_HELMET_CONFIG.dnsPrefetchControl,\n frameguard:\n typeof helmet.frameguard === \"object\"\n ? (helmet.frameguard as { action: \"deny\" | \"sameorigin\" })\n : DEFAULT_HELMET_CONFIG.frameguard,\n hsts:\n typeof helmet.hsts === \"object\"\n ? { ...DEFAULT_HELMET_CONFIG.hsts, ...helmet.hsts }\n : DEFAULT_HELMET_CONFIG.hsts,\n noSniff: helmet.noSniff ?? DEFAULT_HELMET_CONFIG.noSniff,\n permittedCrossDomainPolicies:\n typeof helmet.permittedCrossDomainPolicies === \"object\"\n ? (helmet.permittedCrossDomainPolicies as { policy: string })\n : DEFAULT_HELMET_CONFIG.permittedCrossDomainPolicies,\n referrerPolicy:\n typeof helmet.referrerPolicy === \"object\"\n ? (helmet.referrerPolicy as { policy: string })\n : DEFAULT_HELMET_CONFIG.referrerPolicy,\n xssFilter: helmet.xssFilter ?? DEFAULT_HELMET_CONFIG.xssFilter,\n };\n}\n","/**\n * Documentation Generator\n * Generates OpenAPI spec and serves documentation UI\n */\n\nimport {\n OpenApiGeneratorV3,\n OpenAPIRegistry,\n} from \"@asteasolutions/zod-to-openapi\";\nimport type { z } from \"zod\";\nimport type { AnyRouteConfig } from \"../types/route\";\nimport type { ResolvedDocsConfig } from \"../types/config\";\n\n/**\n * Generates OpenAPI documentation from registered routes\n */\nexport class DocumentationGenerator {\n private registry: OpenAPIRegistry;\n private config: ResolvedDocsConfig;\n\n constructor(config: ResolvedDocsConfig) {\n this.registry = new OpenAPIRegistry();\n this.config = config;\n }\n\n /**\n * Register a route for documentation\n */\n addRoute(route: AnyRouteConfig): void {\n // Convert Express path \"/users/:id\" to OpenAPI path \"/users/{id}\"\n const openApiPath = route.path.replace(/:([a-zA-Z]+)/g, \"{$1}\");\n\n const method = route.method.toLowerCase() as\n | \"get\"\n | \"post\"\n | \"put\"\n | \"delete\"\n | \"patch\";\n\n this.registry.registerPath({\n method,\n path: openApiPath,\n summary: route.summary || \"No summary\",\n description: route.description,\n tags: route.tags,\n request: {\n params: route.request?.params as z.ZodObject<any, any>,\n query: route.request?.query as z.ZodObject<any, any>,\n body: route.request?.body\n ? { content: { \"application/json\": { schema: route.request.body } } }\n : undefined,\n },\n responses: Object.fromEntries(\n Object.entries(route.responses || {}).map(([status, schema]) => [\n status,\n {\n description: \"Response\",\n content: { \"application/json\": { schema } },\n },\n ]),\n ),\n security: route.security,\n ...route.openapi,\n });\n }\n\n /**\n * Generate the OpenAPI specification document\n */\n generateSpec(): object {\n const generator = new OpenApiGeneratorV3(this.registry.definitions);\n const doc = generator.generateDocument({\n openapi: \"3.0.0\",\n info: {\n title: this.config.openApi.info?.title ?? \"Nural API\",\n version: this.config.openApi.info?.version ?? \"1.0.0\",\n description: this.config.openApi.info?.description,\n termsOfService: this.config.openApi.info?.termsOfService,\n contact: this.config.openApi.info?.contact?.name\n ? {\n name: this.config.openApi.info.contact.name,\n email: this.config.openApi.info.contact.email,\n url: this.config.openApi.info.contact.url,\n }\n : undefined,\n license: this.config.openApi.info?.license?.name\n ? {\n name: this.config.openApi.info.license.name,\n url: this.config.openApi.info.license.url,\n }\n : undefined,\n },\n servers: this.config.openApi.servers,\n });\n\n // Deep merge user-defined OpenAPI overrides\n return {\n ...doc,\n components: {\n ...doc.components,\n ...this.config.openApi.components,\n securitySchemes: {\n ...doc.components?.securitySchemes,\n ...this.config.openApi.components?.securitySchemes,\n },\n },\n security: [\n ...(doc.security || []),\n ...(this.config.openApi.security || []),\n ],\n tags: [...(doc.tags || []), ...(this.config.openApi.tags || [])],\n externalDocs: this.config.openApi.externalDocs || doc.externalDocs,\n };\n }\n\n /**\n * Get Scalar API documentation HTML\n */\n getScalarHtml(specUrl: string): string {\n const scalarConfig = JSON.stringify(this.config.scalar || {});\n return `\n <!doctype html>\n <html>\n <head>\n <title>${this.config.openApi.info?.title ?? \"Nural API\"} - API Reference</title>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <style>body { margin: 0; }</style>\n </head>\n <body>\n <script\n id=\"api-reference\"\n data-url=\"${specUrl}\"\n data-configuration='${scalarConfig}'\n src=\"https://cdn.jsdelivr.net/npm/@scalar/api-reference\"\n ></script>\n </body>\n </html>\n `;\n }\n\n /**\n * Get Swagger UI HTML\n */\n getSwaggerHtml(specUrl: string): string {\n const title = this.config.openApi.info?.title ?? \"Nural API\";\n const swaggerOptions = JSON.stringify(this.config.swagger.options || {});\n let themeUrl =\n \"https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/4.15.5/swagger-ui.min.css\";\n\n if (this.config.swagger.theme === \"outline\") {\n themeUrl =\n \"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\";\n } else if (this.config.swagger.theme === \"no-theme\") {\n themeUrl = \"\";\n }\n\n const theme = themeUrl\n ? `<link rel=\"stylesheet\" href=\"${themeUrl}\" />`\n : \"\";\n\n return `\n <!DOCTYPE html>\n <html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\">\n <title>${title} - Swagger UI</title>\n ${theme}\n <style>\n html { box-sizing: border-box; overflow: -moz-scrollbars-vertical; overflow-y: scroll; }\n *, *:before, *:after { box-sizing: inherit; }\n body { margin: 0; background: #fafafa; }\n </style>\n </head>\n <body>\n <div id=\"swagger-ui\"></div>\n <script src=\"https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/4.15.5/swagger-ui-bundle.js\"></script>\n <script src=\"https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/4.15.5/swagger-ui-standalone-preset.js\"></script>\n <script>\n window.onload = function() {\n const ui = SwaggerUIBundle({\n url: \"${specUrl}\",\n dom_id: '#swagger-ui',\n deepLinking: true,\n presets: [\n SwaggerUIBundle.presets.apis,\n SwaggerUIStandalonePreset\n ],\n plugins: [\n SwaggerUIBundle.plugins.DownloadUrl\n ],\n layout: \"StandaloneLayout\",\n ...${swaggerOptions}\n })\n window.ui = ui\n }\n </script>\n </body>\n </html>\n `;\n }\n}\n","/**\n * CORS Middleware\n * Zero-dependency CORS implementation for Nural\n */\n\nimport type { ResolvedCorsConfig } from \"../types/middleware\";\n\n/**\n * CORS headers to apply to responses\n */\nexport interface CorsHeaders {\n \"Access-Control-Allow-Origin\": string;\n \"Access-Control-Allow-Methods\"?: string;\n \"Access-Control-Allow-Headers\"?: string;\n \"Access-Control-Allow-Credentials\"?: string;\n \"Access-Control-Expose-Headers\"?: string;\n \"Access-Control-Max-Age\"?: string;\n Vary?: string;\n}\n\n/**\n * Check if origin is allowed based on config\n */\nfunction isOriginAllowed(\n origin: string | undefined,\n config: ResolvedCorsConfig,\n): string | false {\n if (!origin) return false;\n\n const { origin: allowedOrigin } = config;\n\n // Allow all origins\n if (allowedOrigin === true || allowedOrigin === \"*\") {\n return config.credentials ? origin : \"*\";\n }\n\n // Single origin string\n if (typeof allowedOrigin === \"string\") {\n return origin === allowedOrigin ? origin : false;\n }\n\n // Array of origins\n if (Array.isArray(allowedOrigin)) {\n return allowedOrigin.includes(origin) ? origin : false;\n }\n\n // Function check\n if (typeof allowedOrigin === \"function\") {\n return allowedOrigin(origin) ? origin : false;\n }\n\n return false;\n}\n\n/**\n * Generate CORS headers for a request\n */\nexport function getCorsHeaders(\n requestOrigin: string | undefined,\n config: ResolvedCorsConfig,\n isPreflight: boolean = false,\n): CorsHeaders | null {\n const allowedOrigin = isOriginAllowed(requestOrigin, config);\n\n if (!allowedOrigin) {\n return null;\n }\n\n const headers: CorsHeaders = {\n \"Access-Control-Allow-Origin\": allowedOrigin,\n };\n\n // Add Vary header when origin is dynamic\n if (allowedOrigin !== \"*\") {\n headers[\"Vary\"] = \"Origin\";\n }\n\n // Credentials\n if (config.credentials) {\n headers[\"Access-Control-Allow-Credentials\"] = \"true\";\n }\n\n // Exposed headers\n if (config.exposedHeaders.length > 0) {\n headers[\"Access-Control-Expose-Headers\"] = config.exposedHeaders.join(\", \");\n }\n\n // Preflight-specific headers\n if (isPreflight) {\n headers[\"Access-Control-Allow-Methods\"] = config.methods.join(\", \");\n headers[\"Access-Control-Allow-Headers\"] = config.allowedHeaders.join(\", \");\n headers[\"Access-Control-Max-Age\"] = String(config.maxAge);\n }\n\n return headers;\n}\n\n/**\n * Handle CORS for Express\n */\nexport function applyCorsExpress(app: any, config: ResolvedCorsConfig): void {\n // Add CORS headers to all responses (including preflight)\n app.use((req: any, res: any, next: any) => {\n const origin = req.headers.origin;\n const isPreflight = req.method === \"OPTIONS\";\n const headers = getCorsHeaders(origin, config, isPreflight);\n\n if (headers) {\n Object.entries(headers).forEach(([key, value]) => {\n if (value) res.setHeader(key, value);\n });\n }\n\n // Handle preflight response\n if (isPreflight) {\n if (config.preflightContinue) {\n next();\n } else {\n res.status(config.optionsSuccessStatus).end();\n }\n return;\n }\n\n next();\n });\n}\n\n/**\n * Handle CORS for Fastify\n */\nexport function applyCorsFastify(app: any, config: ResolvedCorsConfig): void {\n // Add hook for all requests\n app.addHook(\"onRequest\", async (request: any, reply: any) => {\n const origin = request.headers.origin;\n const isPreflight = request.method === \"OPTIONS\";\n const headers = getCorsHeaders(origin, config, isPreflight);\n\n if (headers) {\n Object.entries(headers).forEach(([key, value]) => {\n if (value) reply.header(key, value);\n });\n }\n\n // Handle preflight\n if (isPreflight && !config.preflightContinue) {\n reply.status(config.optionsSuccessStatus).send();\n return;\n }\n });\n}\n","/**\n * Helmet Middleware\n * Zero-dependency security headers implementation for Nural\n */\n\nimport type { ResolvedHelmetConfig } from \"../types/middleware\";\n\n/**\n * Security headers to apply to responses\n */\nexport type SecurityHeaders = Record<string, string>;\n\n/**\n * Generate Content-Security-Policy header value\n */\nfunction buildCspHeader(directives: Record<string, string[]>): string {\n return Object.entries(directives)\n .map(([key, values]) => `${key} ${values.join(\" \")}`)\n .join(\"; \");\n}\n\n/**\n * Generate all security headers based on config\n */\nexport function getSecurityHeaders(\n config: ResolvedHelmetConfig,\n): SecurityHeaders {\n const headers: SecurityHeaders = {};\n\n // Content-Security-Policy\n if (\n typeof config.contentSecurityPolicy === \"object\" &&\n config.contentSecurityPolicy.directives\n ) {\n headers[\"Content-Security-Policy\"] = buildCspHeader(\n config.contentSecurityPolicy.directives,\n );\n }\n\n // Cross-Origin-Embedder-Policy\n if (config.crossOriginEmbedderPolicy) {\n headers[\"Cross-Origin-Embedder-Policy\"] = \"require-corp\";\n }\n\n // Cross-Origin-Opener-Policy\n if (config.crossOriginOpenerPolicy) {\n headers[\"Cross-Origin-Opener-Policy\"] =\n config.crossOriginOpenerPolicy.policy;\n }\n\n // Cross-Origin-Resource-Policy\n if (config.crossOriginResourcePolicy) {\n headers[\"Cross-Origin-Resource-Policy\"] =\n config.crossOriginResourcePolicy.policy;\n }\n\n // X-DNS-Prefetch-Control\n headers[\"X-DNS-Prefetch-Control\"] = config.dnsPrefetchControl.allow\n ? \"on\"\n : \"off\";\n\n // X-Frame-Options\n headers[\"X-Frame-Options\"] = config.frameguard.action.toUpperCase();\n\n // Strict-Transport-Security (HSTS)\n if (config.hsts) {\n let hstsValue = `max-age=${config.hsts.maxAge}`;\n if (config.hsts.includeSubDomains) {\n hstsValue += \"; includeSubDomains\";\n }\n if (config.hsts.preload) {\n hstsValue += \"; preload\";\n }\n headers[\"Strict-Transport-Security\"] = hstsValue;\n }\n\n // X-Content-Type-Options\n if (config.noSniff) {\n headers[\"X-Content-Type-Options\"] = \"nosniff\";\n }\n\n // X-Permitted-Cross-Domain-Policies\n headers[\"X-Permitted-Cross-Domain-Policies\"] =\n config.permittedCrossDomainPolicies.policy;\n\n // Referrer-Policy\n headers[\"Referrer-Policy\"] = config.referrerPolicy.policy;\n\n // X-XSS-Protection (legacy, but some still use it)\n if (config.xssFilter) {\n headers[\"X-XSS-Protection\"] = \"1; mode=block\";\n } else {\n headers[\"X-XSS-Protection\"] = \"0\";\n }\n\n return headers;\n}\n\n/**\n * Apply security headers for Express\n */\nexport function applyHelmetExpress(\n app: any,\n config: ResolvedHelmetConfig,\n): void {\n const headers = getSecurityHeaders(config);\n\n app.use((_req: any, res: any, next: any) => {\n Object.entries(headers).forEach(([key, value]) => {\n res.setHeader(key, value);\n });\n next();\n });\n}\n\n/**\n * Apply security headers for Fastify\n */\nexport function applyHelmetFastify(\n app: any,\n config: ResolvedHelmetConfig,\n): void {\n const headers = getSecurityHeaders(config);\n\n app.addHook(\"onRequest\", async (_request: any, reply: any) => {\n Object.entries(headers).forEach(([key, value]) => {\n reply.header(key, value);\n });\n });\n}\n","/**\n * Zero-Dependency Logger\n * Lightweight, colorful, and powerful logging system\n */\n\n// ANSI Color Codes\nconst colors = {\n reset: \"\\x1b[0m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n gray: \"\\x1b[90m\",\n};\n\nexport interface LoggerConfig {\n /** Enable/disable logging */\n enabled?: boolean;\n /** Minimum log level */\n minLevel?: \"log\" | \"error\" | \"warn\" | \"debug\";\n /** Show timestamp */\n timestamp?: boolean;\n}\n\n/**\n * Logger class for specialized context logging\n */\nexport class Logger {\n private context: string;\n private config: LoggerConfig;\n\n constructor(context: string = \"System\", config: LoggerConfig = {}) {\n this.context = context;\n this.config = { enabled: true, timestamp: true, ...config };\n }\n\n private getTimestamp() {\n if (!this.config.timestamp) return \"\";\n return new Date().toISOString();\n }\n\n private print(level: string, message: string, color: string) {\n if (this.config.enabled === false) return;\n\n const pid = process.pid;\n const timestamp = this.getTimestamp();\n const ctx = `[${colors.yellow}${this.context}${colors.reset}]`;\n\n // Format: [Nural] 1234 - 10/20/2025... [Context] Message\n process.stdout.write(\n `${colors.green}[Nural]${colors.reset} ${colors.gray}${pid}${colors.reset} - ` +\n `${timestamp} ${ctx} ${color}${message}${colors.reset}\\n`,\n );\n }\n\n log(message: string) {\n this.print(\"LOG\", message, colors.green);\n }\n\n error(message: string, trace?: string) {\n this.print(\"ERROR\", message, colors.red);\n if (trace) process.stderr.write(`${colors.red}${trace}${colors.reset}\\n`);\n }\n\n warn(message: string) {\n this.print(\"WARN\", message, colors.yellow);\n }\n\n debug(message: string) {\n this.print(\"DEBUG\", message, colors.magenta);\n }\n}\n","/**\n * HTTP Logger Middleware\n * Logs incoming requests with duration and status\n */\n\nimport { defineMiddleware } from \"../core/middleware\";\nimport { Logger } from \"../core/logger\";\n\n// Method Colors\nconst methodColors: Record<string, string> = {\n GET: \"\\x1b[32m\", // Green\n POST: \"\\x1b[33m\", // Yellow\n PUT: \"\\x1b[34m\", // Blue\n DELETE: \"\\x1b[31m\", // Red\n PATCH: \"\\x1b[35m\", // Magenta\n OPTIONS: \"\\x1b[90m\", // Gray\n HEAD: \"\\x1b[90m\", // Gray\n};\n\nconst resetColor = \"\\x1b[0m\";\n\nexport interface HttpLoggerOptions {\n /** Show user agent in logs */\n showUserAgent?: boolean;\n /** Show request duration in logs */\n showTime?: boolean;\n /** Custom logger context name */\n context?: string;\n}\n\n/**\n * Creates an HTTP logger middleware\n */\nexport const httpLogger = (options: HttpLoggerOptions = {}) => {\n const logger = new Logger(options.context || \"Router\");\n\n return (req: any, res: any, next?: () => void) => {\n const start = Date.now();\n\n // Hook into the 'finish' event (Standard Node.js Stream Event)\n // This works on both Express (res) and Fastify (reply.raw)\n res.on(\"finish\", () => {\n const { method, url, headers } = req;\n const duration = Date.now() - start;\n const status = res.statusCode; // Express\n const userAgent = headers ? headers[\"user-agent\"] || \"-\" : \"-\";\n\n const methodColor = methodColors[method] || resetColor;\n const coloredMethod = `${methodColor}${method}${resetColor}`;\n\n let logMessage = `${coloredMethod} ${url} ${status}`;\n\n if (options.showTime !== false) {\n logMessage += ` +${duration}ms`;\n }\n\n if (options.showUserAgent) {\n logMessage += ` - ${userAgent}`;\n }\n\n // Color code based on status\n if (status >= 500) logger.error(logMessage);\n else if (status >= 400) logger.warn(logMessage);\n else logger.log(logMessage);\n });\n\n if (next) {\n next();\n }\n };\n};\n","/**\n * Nural Framework\n * Main application class that orchestrates adapters and documentation\n */\n\nimport type { ServerAdapter } from \"../adapters/base\";\nimport { ExpressAdapter } from \"../adapters/express\";\nimport { FastifyAdapter } from \"../adapters/fastify\";\nimport type { AnyRouteConfig } from \"../types/route\";\nimport type { NuralConfig, ResolvedDocsConfig } from \"../types/config\";\nimport { resolveDocsConfig } from \"../types/config\";\nimport type {\n ResolvedCorsConfig,\n ResolvedHelmetConfig,\n} from \"../types/middleware\";\nimport { resolveCorsConfig, resolveHelmetConfig } from \"../types/middleware\";\nimport type { ResolvedErrorHandlerConfig } from \"../types/error\";\nimport { resolveErrorHandlerConfig } from \"../types/error\";\nimport { DocumentationGenerator } from \"../docs/generator\";\nimport { applyCorsExpress, applyCorsFastify } from \"../middleware/cors\";\nimport { applyHelmetExpress, applyHelmetFastify } from \"../middleware/helmet\";\nimport { Logger } from \"./logger\";\nimport { httpLogger } from \"../middleware/http-logger\";\n\n/**\n * Nural - The intelligent, schema-first REST framework\n *\n * @example\n * ```typescript\n * const app = new Nural({\n * framework: 'express',\n * docs: true,\n * cors: true,\n * helmet: true,\n * errorHandler: true,\n * });\n * app.register([userRoute, healthRoute]);\n * app.start(3000);\n * ```\n */\nexport class Nural {\n private adapter: ServerAdapter;\n private docsGenerator: DocumentationGenerator;\n private docsConfig: ResolvedDocsConfig;\n private corsConfig: ResolvedCorsConfig | null;\n private helmetConfig: ResolvedHelmetConfig | null;\n private errorHandlerConfig: ResolvedErrorHandlerConfig;\n private isExpress: boolean;\n public logger: Logger;\n\n constructor(config: NuralConfig = {}) {\n this.docsConfig = resolveDocsConfig(config.docs);\n this.corsConfig = resolveCorsConfig(config.cors);\n this.helmetConfig = resolveHelmetConfig(config.helmet);\n this.errorHandlerConfig = resolveErrorHandlerConfig(config.errorHandler);\n this.docsGenerator = new DocumentationGenerator(this.docsConfig);\n\n // Initialize System Logger\n this.logger = new Logger(\"Nural\");\n\n // Select adapter based on framework config\n this.isExpress = config.framework !== \"fastify\";\n if (this.isExpress) {\n this.adapter = new ExpressAdapter(this.errorHandlerConfig);\n } else {\n this.adapter = new FastifyAdapter(this.errorHandlerConfig);\n }\n\n // Register HTTP Logger Middleware\n if (config.logger?.enabled !== false) {\n this.adapter.use(\n httpLogger({\n showUserAgent: config.logger?.showUserAgent,\n showTime: config.logger?.showTime ?? true,\n }),\n );\n }\n\n // Apply built-in middleware\n this.applyBuiltInMiddleware();\n }\n\n /**\n * Apply CORS and Helmet middleware based on config\n */\n private applyBuiltInMiddleware(): void {\n const app = this.adapter.app;\n\n if (this.isExpress) {\n // Apply Helmet first (security headers)\n if (this.helmetConfig) {\n applyHelmetExpress(app, this.helmetConfig);\n }\n // Apply CORS\n if (this.corsConfig) {\n applyCorsExpress(app, this.corsConfig);\n }\n } else {\n // Fastify\n if (this.helmetConfig) {\n applyHelmetFastify(app, this.helmetConfig);\n }\n if (this.corsConfig) {\n applyCorsFastify(app, this.corsConfig);\n }\n }\n }\n\n /**\n * Register routes with the application\n */\n register(routes: AnyRouteConfig[]): void {\n routes.forEach((route) => {\n this.adapter.registerRoute(route);\n if (this.docsConfig.enabled) {\n this.docsGenerator.addRoute(route);\n }\n });\n }\n\n /**\n * Start the server\n */\n start(port: number): void {\n if (this.docsConfig.enabled) {\n this.setupDocs();\n }\n\n this.adapter.listen(port, () => {\n console.log(`🚀 Nural Server running on port ${port}`);\n if (this.docsConfig.enabled) {\n console.log(\n `📚 Docs available at http://localhost:${port}${this.docsConfig.path}`,\n );\n }\n if (this.corsConfig) {\n console.log(`🔓 CORS enabled`);\n }\n if (this.helmetConfig) {\n console.log(`🛡️ Helmet security headers enabled`);\n }\n });\n }\n\n /**\n * Setup documentation routes\n */\n private setupDocs(): void {\n const specPath = `${this.docsConfig.path}/openapi.json`;\n\n this.adapter.registerStaticRoute(\"get\", specPath, async () => {\n return { type: \"json\", data: this.docsGenerator.generateSpec() };\n });\n\n this.adapter.registerStaticRoute(\"get\", this.docsConfig.path, async () => {\n const html =\n this.docsConfig.ui === \"swagger\"\n ? this.docsGenerator.getSwaggerHtml(specPath)\n : this.docsGenerator.getScalarHtml(specPath);\n\n return {\n type: \"html\",\n data: html,\n };\n });\n }\n}\n","/**\n * Route Helper\n */\n\nimport type { MiddlewareHandler } from \"./middleware\";\nimport type { ZodAny, RouteConfig } from \"../types/route\";\n\n/**\n * Create a type-safe route configuration\n *\n * @example\n * ```typescript\n * const userRoute = createRoute({\n * method: 'GET',\n * path: '/users/:id',\n * summary: 'Get User by ID',\n * request: { params: z.object({ id: z.string() }) },\n * responses: { 200: z.object({ id: z.string(), name: z.string() }) },\n * handler: async ({ params }) => {\n * return { id: params.id, name: 'Chetan' };\n * }\n * });\n * ```\n */\nexport function createRoute<\n P extends ZodAny = undefined,\n Q extends ZodAny = undefined,\n B extends ZodAny = undefined,\n R extends ZodAny = undefined,\n M extends MiddlewareHandler<any, any>[] | undefined = undefined,\n>(config: RouteConfig<P, Q, B, R, M>): RouteConfig<P, Q, B, R, M> {\n return config;\n}\n","/**\n * Middleware Types and Helpers\n */\n\n/**\n * Middleware handler function type\n * Returns data to be merged into route context\n */\nexport type MiddlewareHandler<Req = unknown, Res = unknown> = (\n req: Req,\n res: Res,\n) => Promise<Record<string, unknown> | void> | Record<string, unknown> | void;\n\n/**\n * Define a type-safe middleware\n *\n * @example\n * ```typescript\n * const authMiddleware = defineMiddleware(async (req: Request) => {\n * const token = req.headers.authorization;\n * if (!token) throw new Error('Unauthorized');\n * return { user: { id: '123', role: 'admin' } };\n * });\n * ```\n */\nexport function defineMiddleware<\n T extends Record<string, unknown> | void,\n Req = unknown,\n Res = unknown,\n>(fn: (req: Req, res: Res) => Promise<T> | T) {\n return fn;\n}\n","/**\n * Nural\n * The intelligent, schema-first REST framework for Node.js\n *\n * @packageDocumentation\n */\n\nimport { extendZodWithOpenApi } from \"@asteasolutions/zod-to-openapi\";\nimport { z } from \"zod\";\n\n// Initialize Zod OpenAPI extension (side effect)\nextendZodWithOpenApi(z);\n\n// Core exports\nexport { Nural } from \"./core\";\nexport { createRoute, defineMiddleware } from \"./core\";\nexport { Logger } from \"./core/logger\";\nexport type { LoggerConfig } from \"./core/logger\";\nexport * from \"./core/exceptions\";\n\n// Type exports\nexport type {\n HttpMethod,\n HttpStatusCode,\n NuralConfig,\n DocsConfig,\n CorsConfig,\n HelmetConfig,\n ErrorHandler,\n ErrorHandlerConfig,\n ErrorContext,\n RouteConfig,\n RouteContext,\n RouteHandler,\n AnyRouteConfig,\n} from \"./types\";\n\n// Re-export Zod for convenience\nexport { z } from \"zod\";\nexport { extendZodWithOpenApi } from \"@asteasolutions/zod-to-openapi\";\n"]}
1
+ {"version":3,"sources":["../src/core/exceptions.ts","../src/types/error.ts","../src/adapters/express.ts","../src/adapters/fastify.ts","../src/types/config.ts","../src/types/middleware.ts","../src/docs/generator.ts","../src/middleware/cors.ts","../src/middleware/helmet.ts","../src/core/logger.ts","../src/middleware/http-logger.ts","../src/core/nural.ts","../src/core/route.ts","../src/core/middleware.ts","../src/index.ts"],"names":["express","result","Fastify","OpenAPIRegistry","OpenApiGeneratorV3","extendZodWithOpenApi","z"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Unified Exception System\n * NestJS-style HTTP exceptions for standardized error handling\n */\n\nexport interface HttpErrorResponse {\n statusCode: number;\n message: string;\n error?: string;\n timestamp?: string;\n path?: string;\n details?: unknown;\n}\n\n/**\n * Base HTTP Exception Class\n */\nexport class HttpException extends Error {\n public readonly statusCode: number;\n public readonly error: string;\n public readonly details?: unknown;\n\n constructor(\n response: string | Record<string, any>,\n statusCode: number,\n details?: unknown,\n ) {\n const message =\n typeof response === \"string\" ? response : JSON.stringify(response);\n super(message);\n this.statusCode = statusCode;\n this.error = this.getStatusName(statusCode);\n this.details = details;\n\n // Maintain prototype chain for instanceof checks\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n public getResponse(): HttpErrorResponse {\n return {\n statusCode: this.statusCode,\n message: this.message,\n error: this.error,\n timestamp: new Date().toISOString(),\n details: this.details,\n };\n }\n\n private getStatusName(code: number): string {\n const names: Record<number, string> = {\n 400: \"Bad Request\",\n 401: \"Unauthorized\",\n 402: \"Payment Required\",\n 403: \"Forbidden\",\n 404: \"Not Found\",\n 405: \"Method Not Allowed\",\n 406: \"Not Acceptable\",\n 408: \"Request Timeout\",\n 409: \"Conflict\",\n 410: \"Gone\",\n 412: \"Precondition Failed\",\n 413: \"Payload Too Large\",\n 415: \"Unsupported Media Type\",\n 418: \"I'm a teapot\",\n 422: \"Unprocessable Entity\",\n 429: \"Too Many Requests\",\n 500: \"Internal Server Error\",\n 501: \"Not Implemented\",\n 502: \"Bad Gateway\",\n 503: \"Service Unavailable\",\n 504: \"Gateway Timeout\",\n };\n return names[code] || \"Error\";\n }\n}\n\n// --- Factory Classes for Common Exceptions ---\n\nexport class BadRequestException extends HttpException {\n constructor(message = \"Bad Request\", details?: unknown) {\n super(message, 400, details);\n }\n}\n\nexport class UnauthorizedException extends HttpException {\n constructor(message = \"Unauthorized\", details?: unknown) {\n super(message, 401, details);\n }\n}\n\nexport class ForbiddenException extends HttpException {\n constructor(message = \"Forbidden\", details?: unknown) {\n super(message, 403, details);\n }\n}\n\nexport class NotFoundException extends HttpException {\n constructor(message = \"Not Found\", details?: unknown) {\n super(message, 404, details);\n }\n}\n\nexport class ConflictException extends HttpException {\n constructor(message = \"Conflict\", details?: unknown) {\n super(message, 409, details);\n }\n}\n\nexport class GoneException extends HttpException {\n constructor(message = \"Gone\", details?: unknown) {\n super(message, 410, details);\n }\n}\n\nexport class PayloadTooLargeException extends HttpException {\n constructor(message = \"Payload Too Large\", details?: unknown) {\n super(message, 413, details);\n }\n}\n\nexport class UnsupportedMediaTypeException extends HttpException {\n constructor(message = \"Unsupported Media Type\", details?: unknown) {\n super(message, 415, details);\n }\n}\n\nexport class UnprocessableEntityException extends HttpException {\n constructor(message = \"Unprocessable Entity\", details?: unknown) {\n super(message, 422, details);\n }\n}\n\nexport class InternalServerErrorException extends HttpException {\n constructor(message = \"Internal Server Error\", details?: unknown) {\n super(message, 500, details);\n }\n}\n\nexport class NotImplementedException extends HttpException {\n constructor(message = \"Not Implemented\", details?: unknown) {\n super(message, 501, details);\n }\n}\n\nexport class BadGatewayException extends HttpException {\n constructor(message = \"Bad Gateway\", details?: unknown) {\n super(message, 502, details);\n }\n}\n\nexport class ServiceUnavailableException extends HttpException {\n constructor(message = \"Service Unavailable\", details?: unknown) {\n super(message, 503, details);\n }\n}\n\nexport class GatewayTimeoutException extends HttpException {\n constructor(message = \"Gateway Timeout\", details?: unknown) {\n super(message, 504, details);\n }\n}\n\n/**\n * Custom Exception for specific use cases\n */\nexport class CustomException extends HttpException {\n constructor(message: string, statusCode: number, details?: unknown) {\n super(message, statusCode, details);\n }\n}\n","/**\n * Error Types and Handler\n * Types for global error handling\n */\n\nimport type { Request, Response } from \"express\";\nimport type { FastifyRequest, FastifyReply } from \"fastify\";\nimport { HttpException } from \"../core/exceptions\";\n\n/**\n * Error context passed to error handlers\n */\nexport interface ErrorContext {\n /** The error that occurred */\n error: Error;\n /** HTTP request (Express or Fastify) */\n request: Request | FastifyRequest;\n /** HTTP response (Express or Fastify) */\n response: Response | FastifyReply;\n /** Route path that errored */\n path?: string;\n /** HTTP method */\n method?: string;\n}\n\n/**\n * Error response returned by error handlers\n */\nexport interface ErrorResponse {\n /** HTTP status code */\n status: number;\n /** Response body */\n body: Record<string, unknown>;\n /** Optional headers to set */\n headers?: Record<string, string>;\n}\n\n/**\n * Global error handler function type\n */\nexport type ErrorHandler = (\n ctx: ErrorContext,\n) => ErrorResponse | Promise<ErrorResponse>;\n\n/**\n * Error handler configuration\n */\nexport interface ErrorHandlerConfig {\n /** Custom error handler function */\n handler?: ErrorHandler;\n /** Include stack trace in development */\n includeStack?: boolean;\n /** Log errors to console */\n logErrors?: boolean;\n /** Custom error logger */\n logger?: (error: Error, ctx: ErrorContext) => void;\n}\n\n/**\n * Resolved error handler config with defaults\n */\nexport interface ResolvedErrorHandlerConfig {\n handler: ErrorHandler;\n includeStack: boolean;\n logErrors: boolean;\n logger: (error: Error, ctx: ErrorContext) => void;\n}\n\n/**\n * Default error logger\n */\nconst defaultLogger = (error: Error, ctx: ErrorContext) => {\n console.error(`[Nural Error] ${ctx.method} ${ctx.path}:`, error.message);\n if (error.stack) {\n console.error(error.stack);\n }\n};\n\n/**\n * Default error handler - converts errors to HTTP responses\n */\nexport const defaultErrorHandler: ErrorHandler = (ctx) => {\n const { error } = ctx;\n\n // Zod validation error\n if (error.name === \"ZodError\" && \"issues\" in error) {\n return {\n status: 400,\n body: {\n error: \"Validation Error\",\n message: \"Request validation failed\",\n details: (error as any).issues,\n },\n };\n }\n\n // Unified Exception Handling\n if (error instanceof HttpException) {\n const response = error.getResponse();\n return {\n status: response.statusCode,\n body: response as unknown as Record<string, unknown>,\n };\n }\n\n // Custom HTTP error (has status property) - Legacy support\n if (\"status\" in error && typeof (error as any).status === \"number\") {\n return {\n status: (error as any).status,\n body: {\n error: error.name || \"Error\",\n message: error.message,\n },\n };\n }\n\n // Auth errors\n if (\n error.message.toLowerCase().includes(\"unauthorized\") ||\n error.message.toLowerCase().includes(\"authentication\")\n ) {\n return {\n status: 401,\n body: {\n error: \"Unauthorized\",\n message: error.message,\n },\n };\n }\n\n if (\n error.message.toLowerCase().includes(\"forbidden\") ||\n error.message.toLowerCase().includes(\"permission\")\n ) {\n return {\n status: 403,\n body: {\n error: \"Forbidden\",\n message: error.message,\n },\n };\n }\n\n if (error.message.toLowerCase().includes(\"not found\")) {\n return {\n status: 404,\n body: {\n error: \"Not Found\",\n message: error.message,\n },\n };\n }\n\n // Default: Internal Server Error\n return {\n status: 500,\n body: {\n error: \"Internal Server Error\",\n message:\n process.env.NODE_ENV === \"production\"\n ? \"An unexpected error occurred\"\n : error.message,\n },\n };\n};\n\n/**\n * Default error handler config\n */\nexport const DEFAULT_ERROR_HANDLER_CONFIG: ResolvedErrorHandlerConfig = {\n handler: defaultErrorHandler,\n includeStack: process.env.NODE_ENV !== \"production\",\n logErrors: true,\n logger: defaultLogger,\n};\n\n/**\n * Resolve error handler config from user input\n */\nexport function resolveErrorHandlerConfig(\n config?: boolean | ErrorHandler | ErrorHandlerConfig,\n): ResolvedErrorHandlerConfig {\n // Disabled\n if (config === false) {\n return {\n ...DEFAULT_ERROR_HANDLER_CONFIG,\n logErrors: false,\n };\n }\n\n // Default config\n if (config === true || config === undefined) {\n return DEFAULT_ERROR_HANDLER_CONFIG;\n }\n\n // Function only\n if (typeof config === \"function\") {\n return {\n ...DEFAULT_ERROR_HANDLER_CONFIG,\n handler: config,\n };\n }\n\n // Full config object\n return {\n handler: config.handler ?? DEFAULT_ERROR_HANDLER_CONFIG.handler,\n includeStack:\n config.includeStack ?? DEFAULT_ERROR_HANDLER_CONFIG.includeStack,\n logErrors: config.logErrors ?? DEFAULT_ERROR_HANDLER_CONFIG.logErrors,\n logger: config.logger ?? DEFAULT_ERROR_HANDLER_CONFIG.logger,\n };\n}\n","/**\n * Express Adapter\n * Implements ServerAdapter for Express framework\n */\n\nimport express, { Express, Request, Response, RequestHandler } from \"express\";\nimport { z } from \"zod\";\nimport type { AnyRouteConfig } from \"../types/route\";\nimport type { ServerAdapter, StaticRouteResponse } from \"./base\";\nimport type { ResolvedErrorHandlerConfig, ErrorContext } from \"../types/error\";\nimport { DEFAULT_ERROR_HANDLER_CONFIG } from \"../types/error\";\n\n/**\n * Express adapter implementation\n */\nexport class ExpressAdapter implements ServerAdapter {\n public app: Express;\n private errorConfig: ResolvedErrorHandlerConfig;\n\n constructor(errorConfig?: ResolvedErrorHandlerConfig) {\n this.app = express();\n this.app.use(express.json());\n this.errorConfig = errorConfig ?? DEFAULT_ERROR_HANDLER_CONFIG;\n }\n\n listen(port: number, cb?: () => void): void {\n this.app.listen(port, cb);\n }\n\n use(middleware: RequestHandler): void {\n this.app.use(middleware);\n }\n\n /**\n * Handle errors using the configured error handler\n */\n private async handleError(\n error: Error,\n req: Request,\n res: Response,\n path?: string,\n ): Promise<void> {\n const ctx: ErrorContext = {\n error,\n request: req,\n response: res,\n path: path ?? req.path,\n method: req.method,\n };\n\n // Log error if enabled\n if (this.errorConfig.logErrors) {\n this.errorConfig.logger(error, ctx);\n }\n\n try {\n // Get error response from handler\n const errorResponse = await this.errorConfig.handler(ctx);\n\n // Set headers if provided\n if (errorResponse.headers) {\n Object.entries(errorResponse.headers).forEach(([key, value]) => {\n res.setHeader(key, value);\n });\n }\n\n // Include stack in development mode\n const body = { ...errorResponse.body };\n if (this.errorConfig.includeStack && error.stack) {\n body.stack = error.stack;\n }\n\n res.status(errorResponse.status).json(body);\n } catch (handlerError) {\n // Fallback if error handler itself fails\n console.error(\"[Nural] Error handler failed:\", handlerError);\n res.status(500).json({ error: \"Internal Server Error\" });\n }\n }\n\n registerStaticRoute(\n method: \"get\",\n path: string,\n handler: (req: Request) => Promise<StaticRouteResponse>,\n ): void {\n this.app[method](path, async (req, res) => {\n try {\n const result = await handler(req);\n if (result.type === \"html\") {\n res.set(\"Content-Type\", \"text/html\");\n res.send(result.data);\n } else {\n res.json(result.data);\n }\n } catch (err) {\n await this.handleError(err as Error, req, res, path);\n }\n });\n }\n\n registerRoute(route: AnyRouteConfig): void {\n const handler: RequestHandler = async (req, res, next) => {\n try {\n // 1. Prepare Base Context\n let context: Record<string, unknown> = { req, res };\n\n // 2. Run Middleware Pipeline\n if (route.middleware && route.middleware.length > 0) {\n for (const mw of route.middleware) {\n const result = await mw(req, res);\n if (result && typeof result === \"object\") {\n context = { ...context, ...result };\n }\n }\n }\n\n // 3. Input Validation\n const params = route.request?.params\n ? await route.request.params.parseAsync(req.params)\n : req.params;\n\n const query = route.request?.query\n ? await route.request.query.parseAsync(req.query)\n : req.query;\n\n const body = route.request?.body\n ? await route.request.body.parseAsync(req.body)\n : req.body;\n\n // 4. Execute Handler\n const result = await route.handler({\n ...context,\n params,\n query,\n body,\n req,\n res,\n });\n\n // 5. Response Mapping (strips unlisted fields)\n const responses = route.responses ?? {};\n const successCodeKey =\n Object.keys(responses).find((c) => c.startsWith(\"2\")) ?? \"200\";\n const responseSchema = responses[Number(successCodeKey)];\n\n if (responseSchema) {\n const cleanResult = await responseSchema.parseAsync(result);\n res.status(Number(successCodeKey)).json(cleanResult);\n } else if (result !== undefined) {\n res.status(Number(successCodeKey)).json(result);\n } else {\n res.status(Number(successCodeKey)).send();\n }\n } catch (err) {\n await this.handleError(err as Error, req, res, route.path);\n }\n };\n\n // Register route based on HTTP method\n const path = route.path;\n switch (route.method) {\n case \"GET\":\n this.app.get(path, handler);\n break;\n case \"POST\":\n this.app.post(path, handler);\n break;\n case \"PUT\":\n this.app.put(path, handler);\n break;\n case \"PATCH\":\n this.app.patch(path, handler);\n break;\n case \"DELETE\":\n this.app.delete(path, handler);\n break;\n case \"OPTIONS\":\n this.app.options(path, handler);\n break;\n case \"HEAD\":\n this.app.head(path, handler);\n break;\n case \"ALL\":\n this.app.all(path, handler);\n break;\n }\n }\n}\n","/**\n * Fastify Adapter\n * Implements ServerAdapter for Fastify framework\n */\n\nimport Fastify, {\n FastifyInstance,\n FastifyRequest,\n FastifyReply,\n HTTPMethods,\n FastifyPluginCallback,\n} from \"fastify\";\nimport { z } from \"zod\";\nimport type { AnyRouteConfig } from \"../types/route\";\nimport type { ServerAdapter, StaticRouteResponse } from \"./base\";\nimport type { ResolvedErrorHandlerConfig, ErrorContext } from \"../types/error\";\nimport { DEFAULT_ERROR_HANDLER_CONFIG } from \"../types/error\";\n\n/**\n * Fastify adapter implementation\n */\nexport class FastifyAdapter implements ServerAdapter {\n public app: FastifyInstance;\n private errorConfig: ResolvedErrorHandlerConfig;\n\n constructor(errorConfig?: ResolvedErrorHandlerConfig) {\n this.app = Fastify();\n this.errorConfig = errorConfig ?? DEFAULT_ERROR_HANDLER_CONFIG;\n }\n\n listen(port: number, cb?: () => void): void {\n this.app.listen({ port }, (err) => {\n if (err) {\n console.error(err);\n process.exit(1);\n }\n if (cb) cb();\n });\n }\n\n use(middleware: FastifyPluginCallback): void {\n this.app.register(middleware);\n }\n\n /**\n * Handle errors using the configured error handler\n */\n private async handleError(\n error: Error,\n req: FastifyRequest,\n reply: FastifyReply,\n path?: string,\n ): Promise<void> {\n const ctx: ErrorContext = {\n error,\n request: req,\n response: reply,\n path: path ?? req.url,\n method: req.method,\n };\n\n // Log error if enabled\n if (this.errorConfig.logErrors) {\n this.errorConfig.logger(error, ctx);\n }\n\n try {\n // Get error response from handler\n const errorResponse = await this.errorConfig.handler(ctx);\n\n // Set headers if provided\n if (errorResponse.headers) {\n Object.entries(errorResponse.headers).forEach(([key, value]) => {\n reply.header(key, value);\n });\n }\n\n // Include stack in development mode\n const body = { ...errorResponse.body };\n if (this.errorConfig.includeStack && error.stack) {\n body.stack = error.stack;\n }\n\n reply.status(errorResponse.status).send(body);\n } catch (handlerError) {\n // Fallback if error handler itself fails\n console.error(\"[Nural] Error handler failed:\", handlerError);\n reply.status(500).send({ error: \"Internal Server Error\" });\n }\n }\n\n registerStaticRoute(\n method: \"get\",\n path: string,\n handler: (req: unknown) => Promise<StaticRouteResponse>,\n ): void {\n this.app.get(path, async (req, reply) => {\n try {\n const result = await handler(req);\n if (result.type === \"html\") {\n reply.type(\"text/html\").send(result.data);\n } else {\n reply.send(result.data);\n }\n } catch (err) {\n await this.handleError(err as Error, req, reply, path);\n }\n });\n }\n\n registerRoute(route: AnyRouteConfig): void {\n const url = route.path;\n\n this.app.route({\n method: route.method as HTTPMethods,\n url,\n handler: async (req: FastifyRequest, reply: FastifyReply) => {\n try {\n // 1. Prepare Context\n let context: Record<string, unknown> = { req, res: reply };\n\n // 2. Run Middleware Pipeline\n if (route.middleware && route.middleware.length > 0) {\n for (const mw of route.middleware) {\n const result = await mw(req, reply);\n if (result && typeof result === \"object\") {\n context = { ...context, ...result };\n }\n }\n }\n\n // 3. Input Validation\n const params = route.request?.params\n ? await route.request.params.parseAsync(req.params)\n : req.params;\n\n const query = route.request?.query\n ? await route.request.query.parseAsync(req.query)\n : req.query;\n\n const body = route.request?.body\n ? await route.request.body.parseAsync(req.body)\n : req.body;\n\n // 4. Execute Handler\n const result = await route.handler({\n ...context,\n params,\n query,\n body,\n req,\n res: reply,\n });\n\n // 5. Response Mapping\n const responses = route.responses ?? {};\n const successCodeKey =\n Object.keys(responses).find((c) => c.startsWith(\"2\")) ?? \"200\";\n const responseSchema = responses[Number(successCodeKey)];\n\n if (responseSchema) {\n const cleanResult = await responseSchema.parseAsync(result);\n reply.status(Number(successCodeKey)).send(cleanResult);\n } else if (result !== undefined) {\n reply.status(Number(successCodeKey)).send(result);\n } else {\n reply.status(Number(successCodeKey)).send();\n }\n } catch (err) {\n await this.handleError(err as Error, req, reply, route.path);\n }\n },\n });\n }\n}\n","/**\n * Configuration Types\n * Types for Nural framework configuration\n */\n\n/**\n * Documentation configuration options\n */\n\n/**\n * Scalar UI Configuration\n * @see https://github.com/scalar/scalar\n */\nexport interface ScalarConfig {\n theme?:\n | \"alternate\"\n | \"default\"\n | \"moon\"\n | \"purple\"\n | \"solarized\"\n | \"bluePlanet\"\n | \"saturn\"\n | \"kepler\"\n | \"mars\"\n | \"deepSpace\"\n | \"laserwave\"\n | \"none\";\n layout?: \"modern\" | \"classic\";\n scale?: number;\n content?: string | Record<string, any>;\n spec?: { url?: string; content?: string | Record<string, any> };\n proxyUrl?: string;\n isEditable?: boolean;\n showSidebar?: boolean;\n hideModels?: boolean;\n hideDownloadButton?: boolean;\n hideTestRequestButton?: boolean;\n hideSearch?: boolean;\n darkMode?: boolean;\n forceDarkModeState?: \"dark\" | \"light\";\n hideDarkModeToggle?: boolean;\n customCss?: string;\n searchHotKey?: string;\n metaData?: Record<string, any>;\n hiddenClients?: string[] | boolean | Record<string, any>;\n // Auth\n authentication?: {\n preferredSecurityScheme?: string | string[];\n securitySchemes?: Record<string, any>;\n };\n // Advanced\n defaultHttpClient?: { targetKey: string; clientKey: string };\n withDefaultFonts?: boolean;\n defaultOpenAllTags?: boolean;\n tagsSorter?: \"alpha\" | Function;\n operationsSorter?: \"alpha\" | \"method\" | Function;\n [key: string]: any;\n}\n\n/**\n * Swagger UI Configuration\n * @see https://github.com/swagger-api/swagger-ui/blob/master/docs/usage/configuration.md\n */\nexport interface SwaggerConfig {\n /**\n * Swagger UI Theme\n * - outline: A modern, clean theme (default)\n * - classic: The standard Swagger UI look\n * - no-theme: No extra styling included (use your own)\n */\n theme?: \"outline\" | \"classic\" | \"no-theme\";\n options?: {\n dom_id?: string;\n domNode?: any;\n spec?: any;\n url?: string;\n urls?: { url: string; name: string }[];\n layout?: string;\n docExpansion?: \"list\" | \"full\" | \"none\";\n maxDisplayedTags?: number;\n depth?: number;\n filter?: boolean | string;\n deepLinking?: boolean;\n displayOperationId?: boolean;\n defaultModelsExpandDepth?: number;\n defaultModelExpandDepth?: number;\n defaultModelRendering?: \"example\" | \"model\";\n displayRequestDuration?: boolean;\n showExtensions?: boolean;\n showCommonExtensions?: boolean;\n showMutatedRequest?: boolean;\n supportedSubmitMethods?: string[];\n validatorUrl?: string | null;\n withCredentials?: boolean;\n persistAuthorization?: boolean;\n oauth2RedirectUrl?: string;\n plugins?: any[];\n presets?: any[];\n [key: string]: any;\n };\n}\n\n/**\n * Documentation configuration options\n */\nexport interface DocsConfig {\n /** Enable documentation endpoint */\n enabled?: boolean;\n /**\n * Documentation UI path (default: /docs)\n */\n path?: string;\n /**\n * Documentation UI type\n * @default \"scalar\"\n */\n ui?: \"scalar\" | \"swagger\";\n /**\n * OpenAPI Specification overrides\n * Allows full customization of the OpenAPI document\n */\n openApi?: {\n info?: {\n title?: string;\n version?: string;\n description?: string;\n termsOfService?: string;\n contact?: { name?: string; url?: string; email?: string };\n license?: { name?: string; url?: string };\n };\n servers?: Array<{ url: string; description?: string }>;\n components?: {\n securitySchemes?: Record<string, any>;\n [key: string]: any;\n };\n security?: Array<Record<string, string[]>>;\n tags?: Array<{ name: string; description?: string }>;\n externalDocs?: { description?: string; url: string };\n };\n /** Configuration specific to Scalar UI */\n scalar?: ScalarConfig;\n /** Configuration specific to Swagger UI */\n swagger?: SwaggerConfig;\n // Backward compatibility\n title?: string;\n version?: string;\n description?: string;\n}\n\n/**\n * Main Nural framework configuration\n */\nexport interface NuralConfig {\n /** Server framework to use */\n framework?: \"express\" | \"fastify\";\n /** Documentation settings (true for defaults, false to disable, or DocsConfig) */\n docs?: boolean | DocsConfig;\n /** CORS settings (true for defaults, false to disable, or CorsConfig) */\n cors?: boolean | import(\"./middleware\").CorsConfig;\n /** Helmet security headers (true for defaults, false to disable, or HelmetConfig) */\n helmet?: boolean | import(\"./middleware\").HelmetConfig;\n /** Logger configuration */\n logger?: {\n enabled?: boolean;\n showUserAgent?: boolean;\n showTime?: boolean;\n };\n /** Global error handler (true for defaults, function, or config) */\n errorHandler?:\n | boolean\n | import(\"./error\").ErrorHandler\n | import(\"./error\").ErrorHandlerConfig;\n}\n\n/**\n * Resolved documentation configuration (with defaults applied)\n */\nexport interface ResolvedDocsConfig {\n enabled: boolean;\n path: string;\n ui: \"scalar\" | \"swagger\";\n openApi: NonNullable<DocsConfig[\"openApi\"]>;\n scalar: ScalarConfig;\n swagger: SwaggerConfig;\n}\n\n/**\n * Default documentation configuration\n */\nexport const DEFAULT_DOCS_CONFIG: ResolvedDocsConfig = {\n enabled: true,\n path: \"/docs\",\n ui: \"scalar\",\n openApi: {\n info: {\n title: \"Nural API\",\n version: \"1.0.0\",\n description: \"Powered by Nural Framework\",\n },\n servers: [{ url: \"/\" }],\n },\n scalar: {},\n swagger: {},\n};\n\n/**\n * Resolve docs config from user input\n */\nexport function resolveDocsConfig(\n docs?: boolean | DocsConfig,\n): ResolvedDocsConfig {\n if (docs === false) {\n return { ...DEFAULT_DOCS_CONFIG, enabled: false };\n }\n\n if (docs === true || docs === undefined) {\n return DEFAULT_DOCS_CONFIG;\n }\n\n // Merge with defaults\n return {\n enabled: docs.enabled ?? true,\n path: docs.path ?? DEFAULT_DOCS_CONFIG.path,\n ui: docs.ui ?? DEFAULT_DOCS_CONFIG.ui,\n openApi: {\n ...DEFAULT_DOCS_CONFIG.openApi,\n ...docs.openApi,\n info: {\n ...DEFAULT_DOCS_CONFIG.openApi.info,\n ...docs.openApi?.info,\n // Backward compatibility: use top-level fields if provided\n title:\n docs.title ??\n docs.openApi?.info?.title ??\n DEFAULT_DOCS_CONFIG.openApi.info?.title,\n version:\n docs.version ??\n docs.openApi?.info?.version ??\n DEFAULT_DOCS_CONFIG.openApi.info?.version,\n description:\n docs.description ??\n docs.openApi?.info?.description ??\n DEFAULT_DOCS_CONFIG.openApi.info?.description,\n },\n },\n scalar: docs.scalar ?? {},\n swagger: docs.swagger ?? {},\n };\n}\n","/**\n * Middleware Configuration Types\n * Types for CORS and Helmet middleware configuration\n */\n\n/**\n * CORS configuration options\n */\nexport interface CorsConfig {\n /**\n * Allowed origins\n * - `true` or `'*'` allows all origins\n * - String for single origin\n * - Array for multiple origins\n * - Function for dynamic origin check\n */\n origin?: boolean | string | string[] | ((origin: string) => boolean);\n\n /** Allowed HTTP methods */\n methods?: string[];\n\n /** Allowed headers */\n allowedHeaders?: string[];\n\n /** Headers exposed to client */\n exposedHeaders?: string[];\n\n /** Allow credentials (cookies, authorization headers) */\n credentials?: boolean;\n\n /** Preflight cache max age in seconds */\n maxAge?: number;\n\n /** Pass preflight response to next handler */\n preflightContinue?: boolean;\n\n /** Success status code for OPTIONS requests */\n optionsSuccessStatus?: number;\n}\n\n/**\n * Resolved CORS configuration with defaults applied\n */\nexport interface ResolvedCorsConfig {\n origin: boolean | string | string[] | ((origin: string) => boolean);\n methods: string[];\n allowedHeaders: string[];\n exposedHeaders: string[];\n credentials: boolean;\n maxAge: number;\n preflightContinue: boolean;\n optionsSuccessStatus: number;\n}\n\n/**\n * Default CORS configuration\n */\nexport const DEFAULT_CORS_CONFIG: ResolvedCorsConfig = {\n origin: \"*\",\n methods: [\"GET\", \"HEAD\", \"PUT\", \"PATCH\", \"POST\", \"DELETE\"],\n allowedHeaders: [\"Content-Type\", \"Authorization\", \"X-Requested-With\"],\n exposedHeaders: [],\n credentials: false,\n maxAge: 86400, // 24 hours\n preflightContinue: false,\n optionsSuccessStatus: 204,\n};\n\n/**\n * Helmet configuration options\n */\nexport interface HelmetConfig {\n /** Content-Security-Policy header */\n contentSecurityPolicy?: boolean | { directives?: Record<string, string[]> };\n\n /** Cross-Origin-Embedder-Policy header */\n crossOriginEmbedderPolicy?: boolean;\n\n /** Cross-Origin-Opener-Policy header */\n crossOriginOpenerPolicy?: boolean | { policy?: string };\n\n /** Cross-Origin-Resource-Policy header */\n crossOriginResourcePolicy?: boolean | { policy?: string };\n\n /** X-DNS-Prefetch-Control header */\n dnsPrefetchControl?: boolean | { allow?: boolean };\n\n /** X-Frame-Options header */\n frameguard?: boolean | { action?: \"deny\" | \"sameorigin\" };\n\n /** Strict-Transport-Security header */\n hsts?:\n | boolean\n | { maxAge?: number; includeSubDomains?: boolean; preload?: boolean };\n\n /** X-Content-Type-Options header */\n noSniff?: boolean;\n\n /** X-Permitted-Cross-Domain-Policies header */\n permittedCrossDomainPolicies?: boolean | { policy?: string };\n\n /** Referrer-Policy header */\n referrerPolicy?: boolean | { policy?: string | string[] };\n\n /** X-XSS-Protection header (legacy) */\n xssFilter?: boolean;\n}\n\n/**\n * Resolved Helmet configuration\n */\nexport interface ResolvedHelmetConfig {\n contentSecurityPolicy: boolean | { directives: Record<string, string[]> };\n crossOriginEmbedderPolicy: boolean;\n crossOriginOpenerPolicy: { policy: string };\n crossOriginResourcePolicy: { policy: string };\n dnsPrefetchControl: { allow: boolean };\n frameguard: { action: \"deny\" | \"sameorigin\" };\n hsts: { maxAge: number; includeSubDomains: boolean; preload: boolean };\n noSniff: boolean;\n permittedCrossDomainPolicies: { policy: string };\n referrerPolicy: { policy: string };\n xssFilter: boolean;\n}\n\n/**\n * Default Helmet configuration\n */\nexport const DEFAULT_HELMET_CONFIG: ResolvedHelmetConfig = {\n contentSecurityPolicy: false, // Disabled by default (can break apps)\n crossOriginEmbedderPolicy: false,\n crossOriginOpenerPolicy: { policy: \"same-origin\" },\n crossOriginResourcePolicy: { policy: \"same-origin\" },\n dnsPrefetchControl: { allow: false },\n frameguard: { action: \"sameorigin\" },\n hsts: { maxAge: 15552000, includeSubDomains: true, preload: false }, // 180 days\n noSniff: true,\n permittedCrossDomainPolicies: { policy: \"none\" },\n referrerPolicy: { policy: \"no-referrer\" },\n xssFilter: false, // Deprecated, browsers ignore it\n};\n\n/**\n * Resolve CORS config from user input\n */\nexport function resolveCorsConfig(\n cors?: boolean | CorsConfig,\n): ResolvedCorsConfig | null {\n if (cors === false || cors === undefined) {\n return null;\n }\n\n if (cors === true) {\n return DEFAULT_CORS_CONFIG;\n }\n\n return {\n origin: cors.origin ?? DEFAULT_CORS_CONFIG.origin,\n methods: cors.methods ?? DEFAULT_CORS_CONFIG.methods,\n allowedHeaders: cors.allowedHeaders ?? DEFAULT_CORS_CONFIG.allowedHeaders,\n exposedHeaders: cors.exposedHeaders ?? DEFAULT_CORS_CONFIG.exposedHeaders,\n credentials: cors.credentials ?? DEFAULT_CORS_CONFIG.credentials,\n maxAge: cors.maxAge ?? DEFAULT_CORS_CONFIG.maxAge,\n preflightContinue:\n cors.preflightContinue ?? DEFAULT_CORS_CONFIG.preflightContinue,\n optionsSuccessStatus:\n cors.optionsSuccessStatus ?? DEFAULT_CORS_CONFIG.optionsSuccessStatus,\n };\n}\n\n/**\n * Resolve Helmet config from user input\n */\nexport function resolveHelmetConfig(\n helmet?: boolean | HelmetConfig,\n): ResolvedHelmetConfig | null {\n if (helmet === false || helmet === undefined) {\n return null;\n }\n\n if (helmet === true) {\n return DEFAULT_HELMET_CONFIG;\n }\n\n return {\n contentSecurityPolicy:\n typeof helmet.contentSecurityPolicy === \"object\"\n ? { directives: helmet.contentSecurityPolicy.directives ?? {} }\n : (helmet.contentSecurityPolicy ??\n DEFAULT_HELMET_CONFIG.contentSecurityPolicy),\n crossOriginEmbedderPolicy:\n helmet.crossOriginEmbedderPolicy ??\n DEFAULT_HELMET_CONFIG.crossOriginEmbedderPolicy,\n crossOriginOpenerPolicy:\n typeof helmet.crossOriginOpenerPolicy === \"object\"\n ? (helmet.crossOriginOpenerPolicy as { policy: string })\n : DEFAULT_HELMET_CONFIG.crossOriginOpenerPolicy,\n crossOriginResourcePolicy:\n typeof helmet.crossOriginResourcePolicy === \"object\"\n ? (helmet.crossOriginResourcePolicy as { policy: string })\n : DEFAULT_HELMET_CONFIG.crossOriginResourcePolicy,\n dnsPrefetchControl:\n typeof helmet.dnsPrefetchControl === \"object\"\n ? (helmet.dnsPrefetchControl as { allow: boolean })\n : DEFAULT_HELMET_CONFIG.dnsPrefetchControl,\n frameguard:\n typeof helmet.frameguard === \"object\"\n ? (helmet.frameguard as { action: \"deny\" | \"sameorigin\" })\n : DEFAULT_HELMET_CONFIG.frameguard,\n hsts:\n typeof helmet.hsts === \"object\"\n ? { ...DEFAULT_HELMET_CONFIG.hsts, ...helmet.hsts }\n : DEFAULT_HELMET_CONFIG.hsts,\n noSniff: helmet.noSniff ?? DEFAULT_HELMET_CONFIG.noSniff,\n permittedCrossDomainPolicies:\n typeof helmet.permittedCrossDomainPolicies === \"object\"\n ? (helmet.permittedCrossDomainPolicies as { policy: string })\n : DEFAULT_HELMET_CONFIG.permittedCrossDomainPolicies,\n referrerPolicy:\n typeof helmet.referrerPolicy === \"object\"\n ? (helmet.referrerPolicy as { policy: string })\n : DEFAULT_HELMET_CONFIG.referrerPolicy,\n xssFilter: helmet.xssFilter ?? DEFAULT_HELMET_CONFIG.xssFilter,\n };\n}\n","/**\n * Documentation Generator\n * Generates OpenAPI spec and serves documentation UI\n */\n\nimport {\n OpenApiGeneratorV3,\n OpenAPIRegistry,\n} from \"@asteasolutions/zod-to-openapi\";\nimport type { z } from \"zod\";\nimport type { AnyRouteConfig } from \"../types/route\";\nimport type { ResolvedDocsConfig } from \"../types/config\";\n\n/**\n * Generates OpenAPI documentation from registered routes\n */\nexport class DocumentationGenerator {\n private registry: OpenAPIRegistry;\n private config: ResolvedDocsConfig;\n\n constructor(config: ResolvedDocsConfig) {\n this.registry = new OpenAPIRegistry();\n this.config = config;\n }\n\n /**\n * Register a route for documentation\n */\n addRoute(route: AnyRouteConfig): void {\n // Convert Express path \"/users/:id\" to OpenAPI path \"/users/{id}\"\n const openApiPath = route.path.replace(/:([a-zA-Z]+)/g, \"{$1}\");\n\n const method = route.method.toLowerCase() as\n | \"get\"\n | \"post\"\n | \"put\"\n | \"delete\"\n | \"patch\";\n\n this.registry.registerPath({\n method,\n path: openApiPath,\n summary: route.summary || \"No summary\",\n description: route.description,\n tags: route.tags,\n request: {\n params: route.request?.params as z.ZodObject<any, any>,\n query: route.request?.query as z.ZodObject<any, any>,\n body: route.request?.body\n ? { content: { \"application/json\": { schema: route.request.body } } }\n : undefined,\n },\n responses: Object.fromEntries(\n Object.entries(route.responses || {}).map(([status, schema]) => [\n status,\n {\n description: \"Response\",\n content: { \"application/json\": { schema } },\n },\n ]),\n ),\n security: route.security,\n ...route.openapi,\n });\n }\n\n /**\n * Generate the OpenAPI specification document\n */\n generateSpec(): object {\n const generator = new OpenApiGeneratorV3(this.registry.definitions);\n const doc = generator.generateDocument({\n openapi: \"3.0.0\",\n info: {\n title: this.config.openApi.info?.title ?? \"Nural API\",\n version: this.config.openApi.info?.version ?? \"1.0.0\",\n description: this.config.openApi.info?.description,\n termsOfService: this.config.openApi.info?.termsOfService,\n contact: this.config.openApi.info?.contact?.name\n ? {\n name: this.config.openApi.info.contact.name,\n email: this.config.openApi.info.contact.email,\n url: this.config.openApi.info.contact.url,\n }\n : undefined,\n license: this.config.openApi.info?.license?.name\n ? {\n name: this.config.openApi.info.license.name,\n url: this.config.openApi.info.license.url,\n }\n : undefined,\n },\n servers: this.config.openApi.servers,\n });\n\n // Deep merge user-defined OpenAPI overrides\n return {\n ...doc,\n components: {\n ...doc.components,\n ...this.config.openApi.components,\n securitySchemes: {\n ...doc.components?.securitySchemes,\n ...this.config.openApi.components?.securitySchemes,\n },\n },\n security: [\n ...(doc.security || []),\n ...(this.config.openApi.security || []),\n ],\n tags: [...(doc.tags || []), ...(this.config.openApi.tags || [])],\n externalDocs: this.config.openApi.externalDocs || doc.externalDocs,\n };\n }\n\n /**\n * Get Scalar API documentation HTML\n */\n getScalarHtml(specUrl: string): string {\n const scalarConfig = JSON.stringify(this.config.scalar || {});\n return `\n <!doctype html>\n <html>\n <head>\n <title>${this.config.openApi.info?.title ?? \"Nural API\"} - API Reference</title>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <style>body { margin: 0; }</style>\n </head>\n <body>\n <script\n id=\"api-reference\"\n data-url=\"${specUrl}\"\n data-configuration='${scalarConfig}'\n src=\"https://cdn.jsdelivr.net/npm/@scalar/api-reference\"\n ></script>\n </body>\n </html>\n `;\n }\n\n /**\n * Get Swagger UI HTML\n */\n getSwaggerHtml(specUrl: string): string {\n const title = this.config.openApi.info?.title ?? \"Nural API\";\n const swaggerOptions = JSON.stringify(this.config.swagger.options || {});\n let themeUrl =\n \"https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/4.15.5/swagger-ui.min.css\";\n\n if (this.config.swagger.theme === \"outline\") {\n themeUrl =\n \"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\";\n } else if (this.config.swagger.theme === \"no-theme\") {\n themeUrl = \"\";\n }\n\n const theme = themeUrl\n ? `<link rel=\"stylesheet\" href=\"${themeUrl}\" />`\n : \"\";\n\n return `\n <!DOCTYPE html>\n <html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\">\n <title>${title} - Swagger UI</title>\n ${theme}\n <style>\n html { box-sizing: border-box; overflow: -moz-scrollbars-vertical; overflow-y: scroll; }\n *, *:before, *:after { box-sizing: inherit; }\n body { margin: 0; background: #fafafa; }\n </style>\n </head>\n <body>\n <div id=\"swagger-ui\"></div>\n <script src=\"https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/4.15.5/swagger-ui-bundle.js\"></script>\n <script src=\"https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/4.15.5/swagger-ui-standalone-preset.js\"></script>\n <script>\n window.onload = function() {\n const ui = SwaggerUIBundle({\n url: \"${specUrl}\",\n dom_id: '#swagger-ui',\n deepLinking: true,\n presets: [\n SwaggerUIBundle.presets.apis,\n SwaggerUIStandalonePreset\n ],\n plugins: [\n SwaggerUIBundle.plugins.DownloadUrl\n ],\n layout: \"StandaloneLayout\",\n ...${swaggerOptions}\n })\n window.ui = ui\n }\n </script>\n </body>\n </html>\n `;\n }\n}\n","/**\n * CORS Middleware\n * Zero-dependency CORS implementation for Nural\n */\n\nimport type { ResolvedCorsConfig } from \"../types/middleware\";\n\n/**\n * CORS headers to apply to responses\n */\nexport interface CorsHeaders {\n \"Access-Control-Allow-Origin\": string;\n \"Access-Control-Allow-Methods\"?: string;\n \"Access-Control-Allow-Headers\"?: string;\n \"Access-Control-Allow-Credentials\"?: string;\n \"Access-Control-Expose-Headers\"?: string;\n \"Access-Control-Max-Age\"?: string;\n Vary?: string;\n}\n\n/**\n * Check if origin is allowed based on config\n */\nfunction isOriginAllowed(\n origin: string | undefined,\n config: ResolvedCorsConfig,\n): string | false {\n if (!origin) return false;\n\n const { origin: allowedOrigin } = config;\n\n // Allow all origins\n if (allowedOrigin === true || allowedOrigin === \"*\") {\n return config.credentials ? origin : \"*\";\n }\n\n // Single origin string\n if (typeof allowedOrigin === \"string\") {\n return origin === allowedOrigin ? origin : false;\n }\n\n // Array of origins\n if (Array.isArray(allowedOrigin)) {\n return allowedOrigin.includes(origin) ? origin : false;\n }\n\n // Function check\n if (typeof allowedOrigin === \"function\") {\n return allowedOrigin(origin) ? origin : false;\n }\n\n return false;\n}\n\n/**\n * Generate CORS headers for a request\n */\nexport function getCorsHeaders(\n requestOrigin: string | undefined,\n config: ResolvedCorsConfig,\n isPreflight: boolean = false,\n): CorsHeaders | null {\n const allowedOrigin = isOriginAllowed(requestOrigin, config);\n\n if (!allowedOrigin) {\n return null;\n }\n\n const headers: CorsHeaders = {\n \"Access-Control-Allow-Origin\": allowedOrigin,\n };\n\n // Add Vary header when origin is dynamic\n if (allowedOrigin !== \"*\") {\n headers[\"Vary\"] = \"Origin\";\n }\n\n // Credentials\n if (config.credentials) {\n headers[\"Access-Control-Allow-Credentials\"] = \"true\";\n }\n\n // Exposed headers\n if (config.exposedHeaders.length > 0) {\n headers[\"Access-Control-Expose-Headers\"] = config.exposedHeaders.join(\", \");\n }\n\n // Preflight-specific headers\n if (isPreflight) {\n headers[\"Access-Control-Allow-Methods\"] = config.methods.join(\", \");\n headers[\"Access-Control-Allow-Headers\"] = config.allowedHeaders.join(\", \");\n headers[\"Access-Control-Max-Age\"] = String(config.maxAge);\n }\n\n return headers;\n}\n\n/**\n * Handle CORS for Express\n */\nexport function applyCorsExpress(app: any, config: ResolvedCorsConfig): void {\n // Add CORS headers to all responses (including preflight)\n app.use((req: any, res: any, next: any) => {\n const origin = req.headers.origin;\n const isPreflight = req.method === \"OPTIONS\";\n const headers = getCorsHeaders(origin, config, isPreflight);\n\n if (headers) {\n Object.entries(headers).forEach(([key, value]) => {\n if (value) res.setHeader(key, value);\n });\n }\n\n // Handle preflight response\n if (isPreflight) {\n if (config.preflightContinue) {\n next();\n } else {\n res.status(config.optionsSuccessStatus).end();\n }\n return;\n }\n\n next();\n });\n}\n\n/**\n * Handle CORS for Fastify\n */\nexport function applyCorsFastify(app: any, config: ResolvedCorsConfig): void {\n // Add hook for all requests\n app.addHook(\"onRequest\", async (request: any, reply: any) => {\n const origin = request.headers.origin;\n const isPreflight = request.method === \"OPTIONS\";\n const headers = getCorsHeaders(origin, config, isPreflight);\n\n if (headers) {\n Object.entries(headers).forEach(([key, value]) => {\n if (value) reply.header(key, value);\n });\n }\n\n // Handle preflight\n if (isPreflight && !config.preflightContinue) {\n reply.status(config.optionsSuccessStatus).send();\n return;\n }\n });\n}\n","/**\n * Helmet Middleware\n * Zero-dependency security headers implementation for Nural\n */\n\nimport type { ResolvedHelmetConfig } from \"../types/middleware\";\n\n/**\n * Security headers to apply to responses\n */\nexport type SecurityHeaders = Record<string, string>;\n\n/**\n * Generate Content-Security-Policy header value\n */\nfunction buildCspHeader(directives: Record<string, string[]>): string {\n return Object.entries(directives)\n .map(([key, values]) => `${key} ${values.join(\" \")}`)\n .join(\"; \");\n}\n\n/**\n * Generate all security headers based on config\n */\nexport function getSecurityHeaders(\n config: ResolvedHelmetConfig,\n): SecurityHeaders {\n const headers: SecurityHeaders = {};\n\n // Content-Security-Policy\n if (\n typeof config.contentSecurityPolicy === \"object\" &&\n config.contentSecurityPolicy.directives\n ) {\n headers[\"Content-Security-Policy\"] = buildCspHeader(\n config.contentSecurityPolicy.directives,\n );\n }\n\n // Cross-Origin-Embedder-Policy\n if (config.crossOriginEmbedderPolicy) {\n headers[\"Cross-Origin-Embedder-Policy\"] = \"require-corp\";\n }\n\n // Cross-Origin-Opener-Policy\n if (config.crossOriginOpenerPolicy) {\n headers[\"Cross-Origin-Opener-Policy\"] =\n config.crossOriginOpenerPolicy.policy;\n }\n\n // Cross-Origin-Resource-Policy\n if (config.crossOriginResourcePolicy) {\n headers[\"Cross-Origin-Resource-Policy\"] =\n config.crossOriginResourcePolicy.policy;\n }\n\n // X-DNS-Prefetch-Control\n headers[\"X-DNS-Prefetch-Control\"] = config.dnsPrefetchControl.allow\n ? \"on\"\n : \"off\";\n\n // X-Frame-Options\n headers[\"X-Frame-Options\"] = config.frameguard.action.toUpperCase();\n\n // Strict-Transport-Security (HSTS)\n if (config.hsts) {\n let hstsValue = `max-age=${config.hsts.maxAge}`;\n if (config.hsts.includeSubDomains) {\n hstsValue += \"; includeSubDomains\";\n }\n if (config.hsts.preload) {\n hstsValue += \"; preload\";\n }\n headers[\"Strict-Transport-Security\"] = hstsValue;\n }\n\n // X-Content-Type-Options\n if (config.noSniff) {\n headers[\"X-Content-Type-Options\"] = \"nosniff\";\n }\n\n // X-Permitted-Cross-Domain-Policies\n headers[\"X-Permitted-Cross-Domain-Policies\"] =\n config.permittedCrossDomainPolicies.policy;\n\n // Referrer-Policy\n headers[\"Referrer-Policy\"] = config.referrerPolicy.policy;\n\n // X-XSS-Protection (legacy, but some still use it)\n if (config.xssFilter) {\n headers[\"X-XSS-Protection\"] = \"1; mode=block\";\n } else {\n headers[\"X-XSS-Protection\"] = \"0\";\n }\n\n return headers;\n}\n\n/**\n * Apply security headers for Express\n */\nexport function applyHelmetExpress(\n app: any,\n config: ResolvedHelmetConfig,\n): void {\n const headers = getSecurityHeaders(config);\n\n app.use((_req: any, res: any, next: any) => {\n Object.entries(headers).forEach(([key, value]) => {\n res.setHeader(key, value);\n });\n next();\n });\n}\n\n/**\n * Apply security headers for Fastify\n */\nexport function applyHelmetFastify(\n app: any,\n config: ResolvedHelmetConfig,\n): void {\n const headers = getSecurityHeaders(config);\n\n app.addHook(\"onRequest\", async (_request: any, reply: any) => {\n Object.entries(headers).forEach(([key, value]) => {\n reply.header(key, value);\n });\n });\n}\n","/**\n * Zero-Dependency Logger\n * Lightweight, colorful, and powerful logging system\n */\n\n// ANSI Color Codes\nconst colors = {\n reset: \"\\x1b[0m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n gray: \"\\x1b[90m\",\n};\n\nexport interface LoggerConfig {\n /** Enable/disable logging */\n enabled?: boolean;\n /** Minimum log level */\n minLevel?: \"log\" | \"error\" | \"warn\" | \"debug\";\n /** Show timestamp */\n timestamp?: boolean;\n}\n\n/**\n * Logger class for specialized context logging\n */\nexport class Logger {\n private context: string;\n private config: LoggerConfig;\n\n constructor(context: string = \"System\", config: LoggerConfig = {}) {\n this.context = context;\n this.config = { enabled: true, timestamp: true, ...config };\n }\n\n private getTimestamp() {\n if (!this.config.timestamp) return \"\";\n return new Date().toISOString();\n }\n\n private print(level: string, message: string, color: string) {\n if (this.config.enabled === false) return;\n\n const pid = process.pid;\n const timestamp = this.getTimestamp();\n const ctx = `[${colors.yellow}${this.context}${colors.reset}]`;\n\n // Format: [Nural] 1234 - 10/20/2025... [Context] Message\n process.stdout.write(\n `${colors.green}[Nural]${colors.reset} ${colors.gray}${pid}${colors.reset} - ` +\n `${timestamp} ${ctx} ${color}${message}${colors.reset}\\n`,\n );\n }\n\n log(message: string) {\n this.print(\"LOG\", message, colors.green);\n }\n\n error(message: string, trace?: string) {\n this.print(\"ERROR\", message, colors.red);\n if (trace) process.stderr.write(`${colors.red}${trace}${colors.reset}\\n`);\n }\n\n warn(message: string) {\n this.print(\"WARN\", message, colors.yellow);\n }\n\n debug(message: string) {\n this.print(\"DEBUG\", message, colors.magenta);\n }\n}\n","/**\n * HTTP Logger Middleware\n * Logs incoming requests with duration and status\n */\n\nimport { defineMiddleware } from \"../core/middleware\";\nimport { Logger } from \"../core/logger\";\n\n// Method Colors\nconst methodColors: Record<string, string> = {\n GET: \"\\x1b[32m\", // Green\n POST: \"\\x1b[33m\", // Yellow\n PUT: \"\\x1b[34m\", // Blue\n DELETE: \"\\x1b[31m\", // Red\n PATCH: \"\\x1b[35m\", // Magenta\n OPTIONS: \"\\x1b[90m\", // Gray\n HEAD: \"\\x1b[90m\", // Gray\n};\n\nconst resetColor = \"\\x1b[0m\";\n\nexport interface HttpLoggerOptions {\n /** Show user agent in logs */\n showUserAgent?: boolean;\n /** Show request duration in logs */\n showTime?: boolean;\n /** Custom logger context name */\n context?: string;\n}\n\n/**\n * Creates an HTTP logger middleware\n */\nexport const httpLogger = (options: HttpLoggerOptions = {}) => {\n const logger = new Logger(options.context || \"Router\");\n\n return (req: any, res: any, next?: () => void) => {\n const start = Date.now();\n\n // Handle both Express (res) and Fastify (res.raw)\n const rawRes = res.raw || res;\n\n // Hook into the 'finish' event (Standard Node.js Stream Event)\n rawRes.on(\"finish\", () => {\n const { method, url, headers } = req;\n const duration = Date.now() - start;\n const status = rawRes.statusCode;\n const userAgent = headers ? headers[\"user-agent\"] || \"-\" : \"-\";\n\n const methodColor = methodColors[method] || resetColor;\n const coloredMethod = `${methodColor}${method}${resetColor}`;\n\n let logMessage = `${coloredMethod} ${url} ${status}`;\n\n if (options.showTime !== false) {\n logMessage += ` +${duration}ms`;\n }\n\n if (options.showUserAgent) {\n logMessage += ` - ${userAgent}`;\n }\n\n // Color code based on status\n if (status >= 500) logger.error(logMessage);\n else if (status >= 400) logger.warn(logMessage);\n else logger.log(logMessage);\n });\n\n if (next) {\n next();\n }\n };\n};\n","/**\n * Nural Framework\n * Main application class that orchestrates adapters and documentation\n */\n\nimport type { ServerAdapter } from \"../adapters/base\";\nimport { ExpressAdapter } from \"../adapters/express\";\nimport { FastifyAdapter } from \"../adapters/fastify\";\nimport type { AnyRouteConfig } from \"../types/route\";\nimport type { NuralConfig, ResolvedDocsConfig } from \"../types/config\";\nimport { resolveDocsConfig } from \"../types/config\";\nimport type {\n ResolvedCorsConfig,\n ResolvedHelmetConfig,\n} from \"../types/middleware\";\nimport { resolveCorsConfig, resolveHelmetConfig } from \"../types/middleware\";\nimport type { ResolvedErrorHandlerConfig } from \"../types/error\";\nimport { resolveErrorHandlerConfig } from \"../types/error\";\nimport { DocumentationGenerator } from \"../docs/generator\";\nimport { applyCorsExpress, applyCorsFastify } from \"../middleware/cors\";\nimport { applyHelmetExpress, applyHelmetFastify } from \"../middleware/helmet\";\nimport { Logger } from \"./logger\";\nimport { httpLogger } from \"../middleware/http-logger\";\n\n/**\n * Nural - The intelligent, schema-first REST framework\n *\n * @example\n * ```typescript\n * const app = new Nural({\n * framework: 'express',\n * docs: true,\n * cors: true,\n * helmet: true,\n * errorHandler: true,\n * });\n * app.register([userRoute, healthRoute]);\n * app.start(3000);\n * ```\n */\nexport class Nural {\n private adapter: ServerAdapter;\n private docsGenerator: DocumentationGenerator;\n private docsConfig: ResolvedDocsConfig;\n private corsConfig: ResolvedCorsConfig | null;\n private helmetConfig: ResolvedHelmetConfig | null;\n private errorHandlerConfig: ResolvedErrorHandlerConfig;\n private isExpress: boolean;\n public logger: Logger;\n\n constructor(config: NuralConfig = {}) {\n this.docsConfig = resolveDocsConfig(config.docs);\n this.corsConfig = resolveCorsConfig(config.cors);\n this.helmetConfig = resolveHelmetConfig(config.helmet);\n this.errorHandlerConfig = resolveErrorHandlerConfig(config.errorHandler);\n this.docsGenerator = new DocumentationGenerator(this.docsConfig);\n\n // Initialize System Logger\n this.logger = new Logger(\"Nural\");\n\n // Select adapter based on framework config\n this.isExpress = config.framework !== \"fastify\";\n if (this.isExpress) {\n this.adapter = new ExpressAdapter(this.errorHandlerConfig);\n } else {\n this.adapter = new FastifyAdapter(this.errorHandlerConfig);\n }\n\n // Register HTTP Logger Middleware\n if (config.logger?.enabled !== false) {\n this.adapter.use(\n httpLogger({\n showUserAgent: config.logger?.showUserAgent,\n showTime: config.logger?.showTime ?? true,\n }),\n );\n }\n\n // Apply built-in middleware\n this.applyBuiltInMiddleware();\n }\n\n /**\n * Apply CORS and Helmet middleware based on config\n */\n private applyBuiltInMiddleware(): void {\n const app = this.adapter.app;\n\n if (this.isExpress) {\n // Apply Helmet first (security headers)\n if (this.helmetConfig) {\n applyHelmetExpress(app, this.helmetConfig);\n }\n // Apply CORS\n if (this.corsConfig) {\n applyCorsExpress(app, this.corsConfig);\n }\n } else {\n // Fastify\n if (this.helmetConfig) {\n applyHelmetFastify(app, this.helmetConfig);\n }\n if (this.corsConfig) {\n applyCorsFastify(app, this.corsConfig);\n }\n }\n }\n\n /**\n * Register routes with the application\n */\n register(routes: AnyRouteConfig[]): void {\n routes.forEach((route) => {\n this.adapter.registerRoute(route);\n if (this.docsConfig.enabled) {\n this.docsGenerator.addRoute(route);\n }\n });\n }\n\n /**\n * Start the server\n */\n start(port: number): void {\n if (this.docsConfig.enabled) {\n this.setupDocs();\n }\n\n this.adapter.listen(port, () => {\n console.log(`🚀 Nural Server running on port ${port}`);\n if (this.docsConfig.enabled) {\n console.log(\n `📚 Docs available at http://localhost:${port}${this.docsConfig.path}`,\n );\n }\n if (this.corsConfig) {\n console.log(`🔓 CORS enabled`);\n }\n if (this.helmetConfig) {\n console.log(`🛡️ Helmet security headers enabled`);\n }\n });\n }\n\n /**\n * Setup documentation routes\n */\n private setupDocs(): void {\n const specPath = `${this.docsConfig.path}/openapi.json`;\n\n this.adapter.registerStaticRoute(\"get\", specPath, async () => {\n return { type: \"json\", data: this.docsGenerator.generateSpec() };\n });\n\n this.adapter.registerStaticRoute(\"get\", this.docsConfig.path, async () => {\n const html =\n this.docsConfig.ui === \"swagger\"\n ? this.docsGenerator.getSwaggerHtml(specPath)\n : this.docsGenerator.getScalarHtml(specPath);\n\n return {\n type: \"html\",\n data: html,\n };\n });\n }\n}\n","/**\n * Route Helper\n */\n\nimport type { MiddlewareHandler } from \"./middleware\";\nimport type { ZodAny, RouteConfig } from \"../types/route\";\n\n/**\n * Create a type-safe route configuration\n *\n * @example\n * ```typescript\n * const userRoute = createRoute({\n * method: 'GET',\n * path: '/users/:id',\n * summary: 'Get User by ID',\n * request: { params: z.object({ id: z.string() }) },\n * responses: { 200: z.object({ id: z.string(), name: z.string() }) },\n * handler: async ({ params }) => {\n * return { id: params.id, name: 'Chetan' };\n * }\n * });\n * ```\n */\nexport function createRoute<\n P extends ZodAny = undefined,\n Q extends ZodAny = undefined,\n B extends ZodAny = undefined,\n R extends ZodAny = undefined,\n M extends MiddlewareHandler<any, any>[] | undefined = undefined,\n>(config: RouteConfig<P, Q, B, R, M>): RouteConfig<P, Q, B, R, M> {\n return config;\n}\n","/**\n * Middleware Types and Helpers\n */\n\n/**\n * Middleware handler function type\n * Returns data to be merged into route context\n */\nexport type MiddlewareHandler<Req = unknown, Res = unknown> = (\n req: Req,\n res: Res,\n) => Promise<Record<string, unknown> | void> | Record<string, unknown> | void;\n\n/**\n * Define a type-safe middleware\n *\n * @example\n * ```typescript\n * const authMiddleware = defineMiddleware(async (req: Request) => {\n * const token = req.headers.authorization;\n * if (!token) throw new Error('Unauthorized');\n * return { user: { id: '123', role: 'admin' } };\n * });\n * ```\n */\nexport function defineMiddleware<\n T extends Record<string, unknown> | void,\n Req = unknown,\n Res = unknown,\n>(fn: (req: Req, res: Res) => Promise<T> | T) {\n return fn;\n}\n","/**\n * Nural\n * The intelligent, schema-first REST framework for Node.js\n *\n * @packageDocumentation\n */\n\nimport { extendZodWithOpenApi } from \"@asteasolutions/zod-to-openapi\";\nimport { z } from \"zod\";\n\n// Initialize Zod OpenAPI extension (side effect)\nextendZodWithOpenApi(z);\n\n// Core exports\nexport { Nural } from \"./core\";\nexport { createRoute, defineMiddleware } from \"./core\";\nexport { Logger } from \"./core/logger\";\nexport type { LoggerConfig } from \"./core/logger\";\nexport * from \"./core/exceptions\";\n\n// Type exports\nexport type {\n HttpMethod,\n HttpStatusCode,\n NuralConfig,\n DocsConfig,\n CorsConfig,\n HelmetConfig,\n ErrorHandler,\n ErrorHandlerConfig,\n ErrorContext,\n RouteConfig,\n RouteContext,\n RouteHandler,\n AnyRouteConfig,\n} from \"./types\";\n\n// Re-export Zod for convenience\nexport { z } from \"zod\";\nexport { extendZodWithOpenApi } from \"@asteasolutions/zod-to-openapi\";\n"]}
package/dist/index.js CHANGED
@@ -939,10 +939,11 @@ var httpLogger = (options = {}) => {
939
939
  const logger = new Logger(options.context || "Router");
940
940
  return (req, res, next) => {
941
941
  const start = Date.now();
942
- res.on("finish", () => {
942
+ const rawRes = res.raw || res;
943
+ rawRes.on("finish", () => {
943
944
  const { method, url, headers } = req;
944
945
  const duration = Date.now() - start;
945
- const status = res.statusCode;
946
+ const status = rawRes.statusCode;
946
947
  const userAgent = headers ? headers["user-agent"] || "-" : "-";
947
948
  const methodColor = methodColors[method] || resetColor;
948
949
  const coloredMethod = `${methodColor}${method}${resetColor}`;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/exceptions.ts","../src/types/error.ts","../src/adapters/express.ts","../src/adapters/fastify.ts","../src/types/config.ts","../src/types/middleware.ts","../src/docs/generator.ts","../src/middleware/cors.ts","../src/middleware/helmet.ts","../src/core/logger.ts","../src/middleware/http-logger.ts","../src/core/nural.ts","../src/core/route.ts","../src/core/middleware.ts","../src/index.ts"],"names":["result"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Unified Exception System\n * NestJS-style HTTP exceptions for standardized error handling\n */\n\nexport interface HttpErrorResponse {\n statusCode: number;\n message: string;\n error?: string;\n timestamp?: string;\n path?: string;\n details?: unknown;\n}\n\n/**\n * Base HTTP Exception Class\n */\nexport class HttpException extends Error {\n public readonly statusCode: number;\n public readonly error: string;\n public readonly details?: unknown;\n\n constructor(\n response: string | Record<string, any>,\n statusCode: number,\n details?: unknown,\n ) {\n const message =\n typeof response === \"string\" ? response : JSON.stringify(response);\n super(message);\n this.statusCode = statusCode;\n this.error = this.getStatusName(statusCode);\n this.details = details;\n\n // Maintain prototype chain for instanceof checks\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n public getResponse(): HttpErrorResponse {\n return {\n statusCode: this.statusCode,\n message: this.message,\n error: this.error,\n timestamp: new Date().toISOString(),\n details: this.details,\n };\n }\n\n private getStatusName(code: number): string {\n const names: Record<number, string> = {\n 400: \"Bad Request\",\n 401: \"Unauthorized\",\n 402: \"Payment Required\",\n 403: \"Forbidden\",\n 404: \"Not Found\",\n 405: \"Method Not Allowed\",\n 406: \"Not Acceptable\",\n 408: \"Request Timeout\",\n 409: \"Conflict\",\n 410: \"Gone\",\n 412: \"Precondition Failed\",\n 413: \"Payload Too Large\",\n 415: \"Unsupported Media Type\",\n 418: \"I'm a teapot\",\n 422: \"Unprocessable Entity\",\n 429: \"Too Many Requests\",\n 500: \"Internal Server Error\",\n 501: \"Not Implemented\",\n 502: \"Bad Gateway\",\n 503: \"Service Unavailable\",\n 504: \"Gateway Timeout\",\n };\n return names[code] || \"Error\";\n }\n}\n\n// --- Factory Classes for Common Exceptions ---\n\nexport class BadRequestException extends HttpException {\n constructor(message = \"Bad Request\", details?: unknown) {\n super(message, 400, details);\n }\n}\n\nexport class UnauthorizedException extends HttpException {\n constructor(message = \"Unauthorized\", details?: unknown) {\n super(message, 401, details);\n }\n}\n\nexport class ForbiddenException extends HttpException {\n constructor(message = \"Forbidden\", details?: unknown) {\n super(message, 403, details);\n }\n}\n\nexport class NotFoundException extends HttpException {\n constructor(message = \"Not Found\", details?: unknown) {\n super(message, 404, details);\n }\n}\n\nexport class ConflictException extends HttpException {\n constructor(message = \"Conflict\", details?: unknown) {\n super(message, 409, details);\n }\n}\n\nexport class GoneException extends HttpException {\n constructor(message = \"Gone\", details?: unknown) {\n super(message, 410, details);\n }\n}\n\nexport class PayloadTooLargeException extends HttpException {\n constructor(message = \"Payload Too Large\", details?: unknown) {\n super(message, 413, details);\n }\n}\n\nexport class UnsupportedMediaTypeException extends HttpException {\n constructor(message = \"Unsupported Media Type\", details?: unknown) {\n super(message, 415, details);\n }\n}\n\nexport class UnprocessableEntityException extends HttpException {\n constructor(message = \"Unprocessable Entity\", details?: unknown) {\n super(message, 422, details);\n }\n}\n\nexport class InternalServerErrorException extends HttpException {\n constructor(message = \"Internal Server Error\", details?: unknown) {\n super(message, 500, details);\n }\n}\n\nexport class NotImplementedException extends HttpException {\n constructor(message = \"Not Implemented\", details?: unknown) {\n super(message, 501, details);\n }\n}\n\nexport class BadGatewayException extends HttpException {\n constructor(message = \"Bad Gateway\", details?: unknown) {\n super(message, 502, details);\n }\n}\n\nexport class ServiceUnavailableException extends HttpException {\n constructor(message = \"Service Unavailable\", details?: unknown) {\n super(message, 503, details);\n }\n}\n\nexport class GatewayTimeoutException extends HttpException {\n constructor(message = \"Gateway Timeout\", details?: unknown) {\n super(message, 504, details);\n }\n}\n\n/**\n * Custom Exception for specific use cases\n */\nexport class CustomException extends HttpException {\n constructor(message: string, statusCode: number, details?: unknown) {\n super(message, statusCode, details);\n }\n}\n","/**\n * Error Types and Handler\n * Types for global error handling\n */\n\nimport type { Request, Response } from \"express\";\nimport type { FastifyRequest, FastifyReply } from \"fastify\";\nimport { HttpException } from \"../core/exceptions\";\n\n/**\n * Error context passed to error handlers\n */\nexport interface ErrorContext {\n /** The error that occurred */\n error: Error;\n /** HTTP request (Express or Fastify) */\n request: Request | FastifyRequest;\n /** HTTP response (Express or Fastify) */\n response: Response | FastifyReply;\n /** Route path that errored */\n path?: string;\n /** HTTP method */\n method?: string;\n}\n\n/**\n * Error response returned by error handlers\n */\nexport interface ErrorResponse {\n /** HTTP status code */\n status: number;\n /** Response body */\n body: Record<string, unknown>;\n /** Optional headers to set */\n headers?: Record<string, string>;\n}\n\n/**\n * Global error handler function type\n */\nexport type ErrorHandler = (\n ctx: ErrorContext,\n) => ErrorResponse | Promise<ErrorResponse>;\n\n/**\n * Error handler configuration\n */\nexport interface ErrorHandlerConfig {\n /** Custom error handler function */\n handler?: ErrorHandler;\n /** Include stack trace in development */\n includeStack?: boolean;\n /** Log errors to console */\n logErrors?: boolean;\n /** Custom error logger */\n logger?: (error: Error, ctx: ErrorContext) => void;\n}\n\n/**\n * Resolved error handler config with defaults\n */\nexport interface ResolvedErrorHandlerConfig {\n handler: ErrorHandler;\n includeStack: boolean;\n logErrors: boolean;\n logger: (error: Error, ctx: ErrorContext) => void;\n}\n\n/**\n * Default error logger\n */\nconst defaultLogger = (error: Error, ctx: ErrorContext) => {\n console.error(`[Nural Error] ${ctx.method} ${ctx.path}:`, error.message);\n if (error.stack) {\n console.error(error.stack);\n }\n};\n\n/**\n * Default error handler - converts errors to HTTP responses\n */\nexport const defaultErrorHandler: ErrorHandler = (ctx) => {\n const { error } = ctx;\n\n // Zod validation error\n if (error.name === \"ZodError\" && \"issues\" in error) {\n return {\n status: 400,\n body: {\n error: \"Validation Error\",\n message: \"Request validation failed\",\n details: (error as any).issues,\n },\n };\n }\n\n // Unified Exception Handling\n if (error instanceof HttpException) {\n const response = error.getResponse();\n return {\n status: response.statusCode,\n body: response as unknown as Record<string, unknown>,\n };\n }\n\n // Custom HTTP error (has status property) - Legacy support\n if (\"status\" in error && typeof (error as any).status === \"number\") {\n return {\n status: (error as any).status,\n body: {\n error: error.name || \"Error\",\n message: error.message,\n },\n };\n }\n\n // Auth errors\n if (\n error.message.toLowerCase().includes(\"unauthorized\") ||\n error.message.toLowerCase().includes(\"authentication\")\n ) {\n return {\n status: 401,\n body: {\n error: \"Unauthorized\",\n message: error.message,\n },\n };\n }\n\n if (\n error.message.toLowerCase().includes(\"forbidden\") ||\n error.message.toLowerCase().includes(\"permission\")\n ) {\n return {\n status: 403,\n body: {\n error: \"Forbidden\",\n message: error.message,\n },\n };\n }\n\n if (error.message.toLowerCase().includes(\"not found\")) {\n return {\n status: 404,\n body: {\n error: \"Not Found\",\n message: error.message,\n },\n };\n }\n\n // Default: Internal Server Error\n return {\n status: 500,\n body: {\n error: \"Internal Server Error\",\n message:\n process.env.NODE_ENV === \"production\"\n ? \"An unexpected error occurred\"\n : error.message,\n },\n };\n};\n\n/**\n * Default error handler config\n */\nexport const DEFAULT_ERROR_HANDLER_CONFIG: ResolvedErrorHandlerConfig = {\n handler: defaultErrorHandler,\n includeStack: process.env.NODE_ENV !== \"production\",\n logErrors: true,\n logger: defaultLogger,\n};\n\n/**\n * Resolve error handler config from user input\n */\nexport function resolveErrorHandlerConfig(\n config?: boolean | ErrorHandler | ErrorHandlerConfig,\n): ResolvedErrorHandlerConfig {\n // Disabled\n if (config === false) {\n return {\n ...DEFAULT_ERROR_HANDLER_CONFIG,\n logErrors: false,\n };\n }\n\n // Default config\n if (config === true || config === undefined) {\n return DEFAULT_ERROR_HANDLER_CONFIG;\n }\n\n // Function only\n if (typeof config === \"function\") {\n return {\n ...DEFAULT_ERROR_HANDLER_CONFIG,\n handler: config,\n };\n }\n\n // Full config object\n return {\n handler: config.handler ?? DEFAULT_ERROR_HANDLER_CONFIG.handler,\n includeStack:\n config.includeStack ?? DEFAULT_ERROR_HANDLER_CONFIG.includeStack,\n logErrors: config.logErrors ?? DEFAULT_ERROR_HANDLER_CONFIG.logErrors,\n logger: config.logger ?? DEFAULT_ERROR_HANDLER_CONFIG.logger,\n };\n}\n","/**\n * Express Adapter\n * Implements ServerAdapter for Express framework\n */\n\nimport express, { Express, Request, Response, RequestHandler } from \"express\";\nimport { z } from \"zod\";\nimport type { AnyRouteConfig } from \"../types/route\";\nimport type { ServerAdapter, StaticRouteResponse } from \"./base\";\nimport type { ResolvedErrorHandlerConfig, ErrorContext } from \"../types/error\";\nimport { DEFAULT_ERROR_HANDLER_CONFIG } from \"../types/error\";\n\n/**\n * Express adapter implementation\n */\nexport class ExpressAdapter implements ServerAdapter {\n public app: Express;\n private errorConfig: ResolvedErrorHandlerConfig;\n\n constructor(errorConfig?: ResolvedErrorHandlerConfig) {\n this.app = express();\n this.app.use(express.json());\n this.errorConfig = errorConfig ?? DEFAULT_ERROR_HANDLER_CONFIG;\n }\n\n listen(port: number, cb?: () => void): void {\n this.app.listen(port, cb);\n }\n\n use(middleware: RequestHandler): void {\n this.app.use(middleware);\n }\n\n /**\n * Handle errors using the configured error handler\n */\n private async handleError(\n error: Error,\n req: Request,\n res: Response,\n path?: string,\n ): Promise<void> {\n const ctx: ErrorContext = {\n error,\n request: req,\n response: res,\n path: path ?? req.path,\n method: req.method,\n };\n\n // Log error if enabled\n if (this.errorConfig.logErrors) {\n this.errorConfig.logger(error, ctx);\n }\n\n try {\n // Get error response from handler\n const errorResponse = await this.errorConfig.handler(ctx);\n\n // Set headers if provided\n if (errorResponse.headers) {\n Object.entries(errorResponse.headers).forEach(([key, value]) => {\n res.setHeader(key, value);\n });\n }\n\n // Include stack in development mode\n const body = { ...errorResponse.body };\n if (this.errorConfig.includeStack && error.stack) {\n body.stack = error.stack;\n }\n\n res.status(errorResponse.status).json(body);\n } catch (handlerError) {\n // Fallback if error handler itself fails\n console.error(\"[Nural] Error handler failed:\", handlerError);\n res.status(500).json({ error: \"Internal Server Error\" });\n }\n }\n\n registerStaticRoute(\n method: \"get\",\n path: string,\n handler: (req: Request) => Promise<StaticRouteResponse>,\n ): void {\n this.app[method](path, async (req, res) => {\n try {\n const result = await handler(req);\n if (result.type === \"html\") {\n res.set(\"Content-Type\", \"text/html\");\n res.send(result.data);\n } else {\n res.json(result.data);\n }\n } catch (err) {\n await this.handleError(err as Error, req, res, path);\n }\n });\n }\n\n registerRoute(route: AnyRouteConfig): void {\n const handler: RequestHandler = async (req, res, next) => {\n try {\n // 1. Prepare Base Context\n let context: Record<string, unknown> = { req, res };\n\n // 2. Run Middleware Pipeline\n if (route.middleware && route.middleware.length > 0) {\n for (const mw of route.middleware) {\n const result = await mw(req, res);\n if (result && typeof result === \"object\") {\n context = { ...context, ...result };\n }\n }\n }\n\n // 3. Input Validation\n const params = route.request?.params\n ? await route.request.params.parseAsync(req.params)\n : req.params;\n\n const query = route.request?.query\n ? await route.request.query.parseAsync(req.query)\n : req.query;\n\n const body = route.request?.body\n ? await route.request.body.parseAsync(req.body)\n : req.body;\n\n // 4. Execute Handler\n const result = await route.handler({\n ...context,\n params,\n query,\n body,\n req,\n res,\n });\n\n // 5. Response Mapping (strips unlisted fields)\n const responses = route.responses ?? {};\n const successCodeKey =\n Object.keys(responses).find((c) => c.startsWith(\"2\")) ?? \"200\";\n const responseSchema = responses[Number(successCodeKey)];\n\n if (responseSchema) {\n const cleanResult = await responseSchema.parseAsync(result);\n res.status(Number(successCodeKey)).json(cleanResult);\n } else if (result !== undefined) {\n res.status(Number(successCodeKey)).json(result);\n } else {\n res.status(Number(successCodeKey)).send();\n }\n } catch (err) {\n await this.handleError(err as Error, req, res, route.path);\n }\n };\n\n // Register route based on HTTP method\n const path = route.path;\n switch (route.method) {\n case \"GET\":\n this.app.get(path, handler);\n break;\n case \"POST\":\n this.app.post(path, handler);\n break;\n case \"PUT\":\n this.app.put(path, handler);\n break;\n case \"PATCH\":\n this.app.patch(path, handler);\n break;\n case \"DELETE\":\n this.app.delete(path, handler);\n break;\n case \"OPTIONS\":\n this.app.options(path, handler);\n break;\n case \"HEAD\":\n this.app.head(path, handler);\n break;\n case \"ALL\":\n this.app.all(path, handler);\n break;\n }\n }\n}\n","/**\n * Fastify Adapter\n * Implements ServerAdapter for Fastify framework\n */\n\nimport Fastify, {\n FastifyInstance,\n FastifyRequest,\n FastifyReply,\n HTTPMethods,\n FastifyPluginCallback,\n} from \"fastify\";\nimport { z } from \"zod\";\nimport type { AnyRouteConfig } from \"../types/route\";\nimport type { ServerAdapter, StaticRouteResponse } from \"./base\";\nimport type { ResolvedErrorHandlerConfig, ErrorContext } from \"../types/error\";\nimport { DEFAULT_ERROR_HANDLER_CONFIG } from \"../types/error\";\n\n/**\n * Fastify adapter implementation\n */\nexport class FastifyAdapter implements ServerAdapter {\n public app: FastifyInstance;\n private errorConfig: ResolvedErrorHandlerConfig;\n\n constructor(errorConfig?: ResolvedErrorHandlerConfig) {\n this.app = Fastify();\n this.errorConfig = errorConfig ?? DEFAULT_ERROR_HANDLER_CONFIG;\n }\n\n listen(port: number, cb?: () => void): void {\n this.app.listen({ port }, (err) => {\n if (err) {\n console.error(err);\n process.exit(1);\n }\n if (cb) cb();\n });\n }\n\n use(middleware: FastifyPluginCallback): void {\n this.app.register(middleware);\n }\n\n /**\n * Handle errors using the configured error handler\n */\n private async handleError(\n error: Error,\n req: FastifyRequest,\n reply: FastifyReply,\n path?: string,\n ): Promise<void> {\n const ctx: ErrorContext = {\n error,\n request: req,\n response: reply,\n path: path ?? req.url,\n method: req.method,\n };\n\n // Log error if enabled\n if (this.errorConfig.logErrors) {\n this.errorConfig.logger(error, ctx);\n }\n\n try {\n // Get error response from handler\n const errorResponse = await this.errorConfig.handler(ctx);\n\n // Set headers if provided\n if (errorResponse.headers) {\n Object.entries(errorResponse.headers).forEach(([key, value]) => {\n reply.header(key, value);\n });\n }\n\n // Include stack in development mode\n const body = { ...errorResponse.body };\n if (this.errorConfig.includeStack && error.stack) {\n body.stack = error.stack;\n }\n\n reply.status(errorResponse.status).send(body);\n } catch (handlerError) {\n // Fallback if error handler itself fails\n console.error(\"[Nural] Error handler failed:\", handlerError);\n reply.status(500).send({ error: \"Internal Server Error\" });\n }\n }\n\n registerStaticRoute(\n method: \"get\",\n path: string,\n handler: (req: unknown) => Promise<StaticRouteResponse>,\n ): void {\n this.app.get(path, async (req, reply) => {\n try {\n const result = await handler(req);\n if (result.type === \"html\") {\n reply.type(\"text/html\").send(result.data);\n } else {\n reply.send(result.data);\n }\n } catch (err) {\n await this.handleError(err as Error, req, reply, path);\n }\n });\n }\n\n registerRoute(route: AnyRouteConfig): void {\n const url = route.path;\n\n this.app.route({\n method: route.method as HTTPMethods,\n url,\n handler: async (req: FastifyRequest, reply: FastifyReply) => {\n try {\n // 1. Prepare Context\n let context: Record<string, unknown> = { req, res: reply };\n\n // 2. Run Middleware Pipeline\n if (route.middleware && route.middleware.length > 0) {\n for (const mw of route.middleware) {\n const result = await mw(req, reply);\n if (result && typeof result === \"object\") {\n context = { ...context, ...result };\n }\n }\n }\n\n // 3. Input Validation\n const params = route.request?.params\n ? await route.request.params.parseAsync(req.params)\n : req.params;\n\n const query = route.request?.query\n ? await route.request.query.parseAsync(req.query)\n : req.query;\n\n const body = route.request?.body\n ? await route.request.body.parseAsync(req.body)\n : req.body;\n\n // 4. Execute Handler\n const result = await route.handler({\n ...context,\n params,\n query,\n body,\n req,\n res: reply,\n });\n\n // 5. Response Mapping\n const responses = route.responses ?? {};\n const successCodeKey =\n Object.keys(responses).find((c) => c.startsWith(\"2\")) ?? \"200\";\n const responseSchema = responses[Number(successCodeKey)];\n\n if (responseSchema) {\n const cleanResult = await responseSchema.parseAsync(result);\n reply.status(Number(successCodeKey)).send(cleanResult);\n } else if (result !== undefined) {\n reply.status(Number(successCodeKey)).send(result);\n } else {\n reply.status(Number(successCodeKey)).send();\n }\n } catch (err) {\n await this.handleError(err as Error, req, reply, route.path);\n }\n },\n });\n }\n}\n","/**\n * Configuration Types\n * Types for Nural framework configuration\n */\n\n/**\n * Documentation configuration options\n */\n\n/**\n * Scalar UI Configuration\n * @see https://github.com/scalar/scalar\n */\nexport interface ScalarConfig {\n theme?:\n | \"alternate\"\n | \"default\"\n | \"moon\"\n | \"purple\"\n | \"solarized\"\n | \"bluePlanet\"\n | \"saturn\"\n | \"kepler\"\n | \"mars\"\n | \"deepSpace\"\n | \"laserwave\"\n | \"none\";\n layout?: \"modern\" | \"classic\";\n scale?: number;\n content?: string | Record<string, any>;\n spec?: { url?: string; content?: string | Record<string, any> };\n proxyUrl?: string;\n isEditable?: boolean;\n showSidebar?: boolean;\n hideModels?: boolean;\n hideDownloadButton?: boolean;\n hideTestRequestButton?: boolean;\n hideSearch?: boolean;\n darkMode?: boolean;\n forceDarkModeState?: \"dark\" | \"light\";\n hideDarkModeToggle?: boolean;\n customCss?: string;\n searchHotKey?: string;\n metaData?: Record<string, any>;\n hiddenClients?: string[] | boolean | Record<string, any>;\n // Auth\n authentication?: {\n preferredSecurityScheme?: string | string[];\n securitySchemes?: Record<string, any>;\n };\n // Advanced\n defaultHttpClient?: { targetKey: string; clientKey: string };\n withDefaultFonts?: boolean;\n defaultOpenAllTags?: boolean;\n tagsSorter?: \"alpha\" | Function;\n operationsSorter?: \"alpha\" | \"method\" | Function;\n [key: string]: any;\n}\n\n/**\n * Swagger UI Configuration\n * @see https://github.com/swagger-api/swagger-ui/blob/master/docs/usage/configuration.md\n */\nexport interface SwaggerConfig {\n /**\n * Swagger UI Theme\n * - outline: A modern, clean theme (default)\n * - classic: The standard Swagger UI look\n * - no-theme: No extra styling included (use your own)\n */\n theme?: \"outline\" | \"classic\" | \"no-theme\";\n options?: {\n dom_id?: string;\n domNode?: any;\n spec?: any;\n url?: string;\n urls?: { url: string; name: string }[];\n layout?: string;\n docExpansion?: \"list\" | \"full\" | \"none\";\n maxDisplayedTags?: number;\n depth?: number;\n filter?: boolean | string;\n deepLinking?: boolean;\n displayOperationId?: boolean;\n defaultModelsExpandDepth?: number;\n defaultModelExpandDepth?: number;\n defaultModelRendering?: \"example\" | \"model\";\n displayRequestDuration?: boolean;\n showExtensions?: boolean;\n showCommonExtensions?: boolean;\n showMutatedRequest?: boolean;\n supportedSubmitMethods?: string[];\n validatorUrl?: string | null;\n withCredentials?: boolean;\n persistAuthorization?: boolean;\n oauth2RedirectUrl?: string;\n plugins?: any[];\n presets?: any[];\n [key: string]: any;\n };\n}\n\n/**\n * Documentation configuration options\n */\nexport interface DocsConfig {\n /** Enable documentation endpoint */\n enabled?: boolean;\n /**\n * Documentation UI path (default: /docs)\n */\n path?: string;\n /**\n * Documentation UI type\n * @default \"scalar\"\n */\n ui?: \"scalar\" | \"swagger\";\n /**\n * OpenAPI Specification overrides\n * Allows full customization of the OpenAPI document\n */\n openApi?: {\n info?: {\n title?: string;\n version?: string;\n description?: string;\n termsOfService?: string;\n contact?: { name?: string; url?: string; email?: string };\n license?: { name?: string; url?: string };\n };\n servers?: Array<{ url: string; description?: string }>;\n components?: {\n securitySchemes?: Record<string, any>;\n [key: string]: any;\n };\n security?: Array<Record<string, string[]>>;\n tags?: Array<{ name: string; description?: string }>;\n externalDocs?: { description?: string; url: string };\n };\n /** Configuration specific to Scalar UI */\n scalar?: ScalarConfig;\n /** Configuration specific to Swagger UI */\n swagger?: SwaggerConfig;\n // Backward compatibility\n title?: string;\n version?: string;\n description?: string;\n}\n\n/**\n * Main Nural framework configuration\n */\nexport interface NuralConfig {\n /** Server framework to use */\n framework?: \"express\" | \"fastify\";\n /** Documentation settings (true for defaults, false to disable, or DocsConfig) */\n docs?: boolean | DocsConfig;\n /** CORS settings (true for defaults, false to disable, or CorsConfig) */\n cors?: boolean | import(\"./middleware\").CorsConfig;\n /** Helmet security headers (true for defaults, false to disable, or HelmetConfig) */\n helmet?: boolean | import(\"./middleware\").HelmetConfig;\n /** Logger configuration */\n logger?: {\n enabled?: boolean;\n showUserAgent?: boolean;\n showTime?: boolean;\n };\n /** Global error handler (true for defaults, function, or config) */\n errorHandler?:\n | boolean\n | import(\"./error\").ErrorHandler\n | import(\"./error\").ErrorHandlerConfig;\n}\n\n/**\n * Resolved documentation configuration (with defaults applied)\n */\nexport interface ResolvedDocsConfig {\n enabled: boolean;\n path: string;\n ui: \"scalar\" | \"swagger\";\n openApi: NonNullable<DocsConfig[\"openApi\"]>;\n scalar: ScalarConfig;\n swagger: SwaggerConfig;\n}\n\n/**\n * Default documentation configuration\n */\nexport const DEFAULT_DOCS_CONFIG: ResolvedDocsConfig = {\n enabled: true,\n path: \"/docs\",\n ui: \"scalar\",\n openApi: {\n info: {\n title: \"Nural API\",\n version: \"1.0.0\",\n description: \"Powered by Nural Framework\",\n },\n servers: [{ url: \"/\" }],\n },\n scalar: {},\n swagger: {},\n};\n\n/**\n * Resolve docs config from user input\n */\nexport function resolveDocsConfig(\n docs?: boolean | DocsConfig,\n): ResolvedDocsConfig {\n if (docs === false) {\n return { ...DEFAULT_DOCS_CONFIG, enabled: false };\n }\n\n if (docs === true || docs === undefined) {\n return DEFAULT_DOCS_CONFIG;\n }\n\n // Merge with defaults\n return {\n enabled: docs.enabled ?? true,\n path: docs.path ?? DEFAULT_DOCS_CONFIG.path,\n ui: docs.ui ?? DEFAULT_DOCS_CONFIG.ui,\n openApi: {\n ...DEFAULT_DOCS_CONFIG.openApi,\n ...docs.openApi,\n info: {\n ...DEFAULT_DOCS_CONFIG.openApi.info,\n ...docs.openApi?.info,\n // Backward compatibility: use top-level fields if provided\n title:\n docs.title ??\n docs.openApi?.info?.title ??\n DEFAULT_DOCS_CONFIG.openApi.info?.title,\n version:\n docs.version ??\n docs.openApi?.info?.version ??\n DEFAULT_DOCS_CONFIG.openApi.info?.version,\n description:\n docs.description ??\n docs.openApi?.info?.description ??\n DEFAULT_DOCS_CONFIG.openApi.info?.description,\n },\n },\n scalar: docs.scalar ?? {},\n swagger: docs.swagger ?? {},\n };\n}\n","/**\n * Middleware Configuration Types\n * Types for CORS and Helmet middleware configuration\n */\n\n/**\n * CORS configuration options\n */\nexport interface CorsConfig {\n /**\n * Allowed origins\n * - `true` or `'*'` allows all origins\n * - String for single origin\n * - Array for multiple origins\n * - Function for dynamic origin check\n */\n origin?: boolean | string | string[] | ((origin: string) => boolean);\n\n /** Allowed HTTP methods */\n methods?: string[];\n\n /** Allowed headers */\n allowedHeaders?: string[];\n\n /** Headers exposed to client */\n exposedHeaders?: string[];\n\n /** Allow credentials (cookies, authorization headers) */\n credentials?: boolean;\n\n /** Preflight cache max age in seconds */\n maxAge?: number;\n\n /** Pass preflight response to next handler */\n preflightContinue?: boolean;\n\n /** Success status code for OPTIONS requests */\n optionsSuccessStatus?: number;\n}\n\n/**\n * Resolved CORS configuration with defaults applied\n */\nexport interface ResolvedCorsConfig {\n origin: boolean | string | string[] | ((origin: string) => boolean);\n methods: string[];\n allowedHeaders: string[];\n exposedHeaders: string[];\n credentials: boolean;\n maxAge: number;\n preflightContinue: boolean;\n optionsSuccessStatus: number;\n}\n\n/**\n * Default CORS configuration\n */\nexport const DEFAULT_CORS_CONFIG: ResolvedCorsConfig = {\n origin: \"*\",\n methods: [\"GET\", \"HEAD\", \"PUT\", \"PATCH\", \"POST\", \"DELETE\"],\n allowedHeaders: [\"Content-Type\", \"Authorization\", \"X-Requested-With\"],\n exposedHeaders: [],\n credentials: false,\n maxAge: 86400, // 24 hours\n preflightContinue: false,\n optionsSuccessStatus: 204,\n};\n\n/**\n * Helmet configuration options\n */\nexport interface HelmetConfig {\n /** Content-Security-Policy header */\n contentSecurityPolicy?: boolean | { directives?: Record<string, string[]> };\n\n /** Cross-Origin-Embedder-Policy header */\n crossOriginEmbedderPolicy?: boolean;\n\n /** Cross-Origin-Opener-Policy header */\n crossOriginOpenerPolicy?: boolean | { policy?: string };\n\n /** Cross-Origin-Resource-Policy header */\n crossOriginResourcePolicy?: boolean | { policy?: string };\n\n /** X-DNS-Prefetch-Control header */\n dnsPrefetchControl?: boolean | { allow?: boolean };\n\n /** X-Frame-Options header */\n frameguard?: boolean | { action?: \"deny\" | \"sameorigin\" };\n\n /** Strict-Transport-Security header */\n hsts?:\n | boolean\n | { maxAge?: number; includeSubDomains?: boolean; preload?: boolean };\n\n /** X-Content-Type-Options header */\n noSniff?: boolean;\n\n /** X-Permitted-Cross-Domain-Policies header */\n permittedCrossDomainPolicies?: boolean | { policy?: string };\n\n /** Referrer-Policy header */\n referrerPolicy?: boolean | { policy?: string | string[] };\n\n /** X-XSS-Protection header (legacy) */\n xssFilter?: boolean;\n}\n\n/**\n * Resolved Helmet configuration\n */\nexport interface ResolvedHelmetConfig {\n contentSecurityPolicy: boolean | { directives: Record<string, string[]> };\n crossOriginEmbedderPolicy: boolean;\n crossOriginOpenerPolicy: { policy: string };\n crossOriginResourcePolicy: { policy: string };\n dnsPrefetchControl: { allow: boolean };\n frameguard: { action: \"deny\" | \"sameorigin\" };\n hsts: { maxAge: number; includeSubDomains: boolean; preload: boolean };\n noSniff: boolean;\n permittedCrossDomainPolicies: { policy: string };\n referrerPolicy: { policy: string };\n xssFilter: boolean;\n}\n\n/**\n * Default Helmet configuration\n */\nexport const DEFAULT_HELMET_CONFIG: ResolvedHelmetConfig = {\n contentSecurityPolicy: false, // Disabled by default (can break apps)\n crossOriginEmbedderPolicy: false,\n crossOriginOpenerPolicy: { policy: \"same-origin\" },\n crossOriginResourcePolicy: { policy: \"same-origin\" },\n dnsPrefetchControl: { allow: false },\n frameguard: { action: \"sameorigin\" },\n hsts: { maxAge: 15552000, includeSubDomains: true, preload: false }, // 180 days\n noSniff: true,\n permittedCrossDomainPolicies: { policy: \"none\" },\n referrerPolicy: { policy: \"no-referrer\" },\n xssFilter: false, // Deprecated, browsers ignore it\n};\n\n/**\n * Resolve CORS config from user input\n */\nexport function resolveCorsConfig(\n cors?: boolean | CorsConfig,\n): ResolvedCorsConfig | null {\n if (cors === false || cors === undefined) {\n return null;\n }\n\n if (cors === true) {\n return DEFAULT_CORS_CONFIG;\n }\n\n return {\n origin: cors.origin ?? DEFAULT_CORS_CONFIG.origin,\n methods: cors.methods ?? DEFAULT_CORS_CONFIG.methods,\n allowedHeaders: cors.allowedHeaders ?? DEFAULT_CORS_CONFIG.allowedHeaders,\n exposedHeaders: cors.exposedHeaders ?? DEFAULT_CORS_CONFIG.exposedHeaders,\n credentials: cors.credentials ?? DEFAULT_CORS_CONFIG.credentials,\n maxAge: cors.maxAge ?? DEFAULT_CORS_CONFIG.maxAge,\n preflightContinue:\n cors.preflightContinue ?? DEFAULT_CORS_CONFIG.preflightContinue,\n optionsSuccessStatus:\n cors.optionsSuccessStatus ?? DEFAULT_CORS_CONFIG.optionsSuccessStatus,\n };\n}\n\n/**\n * Resolve Helmet config from user input\n */\nexport function resolveHelmetConfig(\n helmet?: boolean | HelmetConfig,\n): ResolvedHelmetConfig | null {\n if (helmet === false || helmet === undefined) {\n return null;\n }\n\n if (helmet === true) {\n return DEFAULT_HELMET_CONFIG;\n }\n\n return {\n contentSecurityPolicy:\n typeof helmet.contentSecurityPolicy === \"object\"\n ? { directives: helmet.contentSecurityPolicy.directives ?? {} }\n : (helmet.contentSecurityPolicy ??\n DEFAULT_HELMET_CONFIG.contentSecurityPolicy),\n crossOriginEmbedderPolicy:\n helmet.crossOriginEmbedderPolicy ??\n DEFAULT_HELMET_CONFIG.crossOriginEmbedderPolicy,\n crossOriginOpenerPolicy:\n typeof helmet.crossOriginOpenerPolicy === \"object\"\n ? (helmet.crossOriginOpenerPolicy as { policy: string })\n : DEFAULT_HELMET_CONFIG.crossOriginOpenerPolicy,\n crossOriginResourcePolicy:\n typeof helmet.crossOriginResourcePolicy === \"object\"\n ? (helmet.crossOriginResourcePolicy as { policy: string })\n : DEFAULT_HELMET_CONFIG.crossOriginResourcePolicy,\n dnsPrefetchControl:\n typeof helmet.dnsPrefetchControl === \"object\"\n ? (helmet.dnsPrefetchControl as { allow: boolean })\n : DEFAULT_HELMET_CONFIG.dnsPrefetchControl,\n frameguard:\n typeof helmet.frameguard === \"object\"\n ? (helmet.frameguard as { action: \"deny\" | \"sameorigin\" })\n : DEFAULT_HELMET_CONFIG.frameguard,\n hsts:\n typeof helmet.hsts === \"object\"\n ? { ...DEFAULT_HELMET_CONFIG.hsts, ...helmet.hsts }\n : DEFAULT_HELMET_CONFIG.hsts,\n noSniff: helmet.noSniff ?? DEFAULT_HELMET_CONFIG.noSniff,\n permittedCrossDomainPolicies:\n typeof helmet.permittedCrossDomainPolicies === \"object\"\n ? (helmet.permittedCrossDomainPolicies as { policy: string })\n : DEFAULT_HELMET_CONFIG.permittedCrossDomainPolicies,\n referrerPolicy:\n typeof helmet.referrerPolicy === \"object\"\n ? (helmet.referrerPolicy as { policy: string })\n : DEFAULT_HELMET_CONFIG.referrerPolicy,\n xssFilter: helmet.xssFilter ?? DEFAULT_HELMET_CONFIG.xssFilter,\n };\n}\n","/**\n * Documentation Generator\n * Generates OpenAPI spec and serves documentation UI\n */\n\nimport {\n OpenApiGeneratorV3,\n OpenAPIRegistry,\n} from \"@asteasolutions/zod-to-openapi\";\nimport type { z } from \"zod\";\nimport type { AnyRouteConfig } from \"../types/route\";\nimport type { ResolvedDocsConfig } from \"../types/config\";\n\n/**\n * Generates OpenAPI documentation from registered routes\n */\nexport class DocumentationGenerator {\n private registry: OpenAPIRegistry;\n private config: ResolvedDocsConfig;\n\n constructor(config: ResolvedDocsConfig) {\n this.registry = new OpenAPIRegistry();\n this.config = config;\n }\n\n /**\n * Register a route for documentation\n */\n addRoute(route: AnyRouteConfig): void {\n // Convert Express path \"/users/:id\" to OpenAPI path \"/users/{id}\"\n const openApiPath = route.path.replace(/:([a-zA-Z]+)/g, \"{$1}\");\n\n const method = route.method.toLowerCase() as\n | \"get\"\n | \"post\"\n | \"put\"\n | \"delete\"\n | \"patch\";\n\n this.registry.registerPath({\n method,\n path: openApiPath,\n summary: route.summary || \"No summary\",\n description: route.description,\n tags: route.tags,\n request: {\n params: route.request?.params as z.ZodObject<any, any>,\n query: route.request?.query as z.ZodObject<any, any>,\n body: route.request?.body\n ? { content: { \"application/json\": { schema: route.request.body } } }\n : undefined,\n },\n responses: Object.fromEntries(\n Object.entries(route.responses || {}).map(([status, schema]) => [\n status,\n {\n description: \"Response\",\n content: { \"application/json\": { schema } },\n },\n ]),\n ),\n security: route.security,\n ...route.openapi,\n });\n }\n\n /**\n * Generate the OpenAPI specification document\n */\n generateSpec(): object {\n const generator = new OpenApiGeneratorV3(this.registry.definitions);\n const doc = generator.generateDocument({\n openapi: \"3.0.0\",\n info: {\n title: this.config.openApi.info?.title ?? \"Nural API\",\n version: this.config.openApi.info?.version ?? \"1.0.0\",\n description: this.config.openApi.info?.description,\n termsOfService: this.config.openApi.info?.termsOfService,\n contact: this.config.openApi.info?.contact?.name\n ? {\n name: this.config.openApi.info.contact.name,\n email: this.config.openApi.info.contact.email,\n url: this.config.openApi.info.contact.url,\n }\n : undefined,\n license: this.config.openApi.info?.license?.name\n ? {\n name: this.config.openApi.info.license.name,\n url: this.config.openApi.info.license.url,\n }\n : undefined,\n },\n servers: this.config.openApi.servers,\n });\n\n // Deep merge user-defined OpenAPI overrides\n return {\n ...doc,\n components: {\n ...doc.components,\n ...this.config.openApi.components,\n securitySchemes: {\n ...doc.components?.securitySchemes,\n ...this.config.openApi.components?.securitySchemes,\n },\n },\n security: [\n ...(doc.security || []),\n ...(this.config.openApi.security || []),\n ],\n tags: [...(doc.tags || []), ...(this.config.openApi.tags || [])],\n externalDocs: this.config.openApi.externalDocs || doc.externalDocs,\n };\n }\n\n /**\n * Get Scalar API documentation HTML\n */\n getScalarHtml(specUrl: string): string {\n const scalarConfig = JSON.stringify(this.config.scalar || {});\n return `\n <!doctype html>\n <html>\n <head>\n <title>${this.config.openApi.info?.title ?? \"Nural API\"} - API Reference</title>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <style>body { margin: 0; }</style>\n </head>\n <body>\n <script\n id=\"api-reference\"\n data-url=\"${specUrl}\"\n data-configuration='${scalarConfig}'\n src=\"https://cdn.jsdelivr.net/npm/@scalar/api-reference\"\n ></script>\n </body>\n </html>\n `;\n }\n\n /**\n * Get Swagger UI HTML\n */\n getSwaggerHtml(specUrl: string): string {\n const title = this.config.openApi.info?.title ?? \"Nural API\";\n const swaggerOptions = JSON.stringify(this.config.swagger.options || {});\n let themeUrl =\n \"https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/4.15.5/swagger-ui.min.css\";\n\n if (this.config.swagger.theme === \"outline\") {\n themeUrl =\n \"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\";\n } else if (this.config.swagger.theme === \"no-theme\") {\n themeUrl = \"\";\n }\n\n const theme = themeUrl\n ? `<link rel=\"stylesheet\" href=\"${themeUrl}\" />`\n : \"\";\n\n return `\n <!DOCTYPE html>\n <html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\">\n <title>${title} - Swagger UI</title>\n ${theme}\n <style>\n html { box-sizing: border-box; overflow: -moz-scrollbars-vertical; overflow-y: scroll; }\n *, *:before, *:after { box-sizing: inherit; }\n body { margin: 0; background: #fafafa; }\n </style>\n </head>\n <body>\n <div id=\"swagger-ui\"></div>\n <script src=\"https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/4.15.5/swagger-ui-bundle.js\"></script>\n <script src=\"https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/4.15.5/swagger-ui-standalone-preset.js\"></script>\n <script>\n window.onload = function() {\n const ui = SwaggerUIBundle({\n url: \"${specUrl}\",\n dom_id: '#swagger-ui',\n deepLinking: true,\n presets: [\n SwaggerUIBundle.presets.apis,\n SwaggerUIStandalonePreset\n ],\n plugins: [\n SwaggerUIBundle.plugins.DownloadUrl\n ],\n layout: \"StandaloneLayout\",\n ...${swaggerOptions}\n })\n window.ui = ui\n }\n </script>\n </body>\n </html>\n `;\n }\n}\n","/**\n * CORS Middleware\n * Zero-dependency CORS implementation for Nural\n */\n\nimport type { ResolvedCorsConfig } from \"../types/middleware\";\n\n/**\n * CORS headers to apply to responses\n */\nexport interface CorsHeaders {\n \"Access-Control-Allow-Origin\": string;\n \"Access-Control-Allow-Methods\"?: string;\n \"Access-Control-Allow-Headers\"?: string;\n \"Access-Control-Allow-Credentials\"?: string;\n \"Access-Control-Expose-Headers\"?: string;\n \"Access-Control-Max-Age\"?: string;\n Vary?: string;\n}\n\n/**\n * Check if origin is allowed based on config\n */\nfunction isOriginAllowed(\n origin: string | undefined,\n config: ResolvedCorsConfig,\n): string | false {\n if (!origin) return false;\n\n const { origin: allowedOrigin } = config;\n\n // Allow all origins\n if (allowedOrigin === true || allowedOrigin === \"*\") {\n return config.credentials ? origin : \"*\";\n }\n\n // Single origin string\n if (typeof allowedOrigin === \"string\") {\n return origin === allowedOrigin ? origin : false;\n }\n\n // Array of origins\n if (Array.isArray(allowedOrigin)) {\n return allowedOrigin.includes(origin) ? origin : false;\n }\n\n // Function check\n if (typeof allowedOrigin === \"function\") {\n return allowedOrigin(origin) ? origin : false;\n }\n\n return false;\n}\n\n/**\n * Generate CORS headers for a request\n */\nexport function getCorsHeaders(\n requestOrigin: string | undefined,\n config: ResolvedCorsConfig,\n isPreflight: boolean = false,\n): CorsHeaders | null {\n const allowedOrigin = isOriginAllowed(requestOrigin, config);\n\n if (!allowedOrigin) {\n return null;\n }\n\n const headers: CorsHeaders = {\n \"Access-Control-Allow-Origin\": allowedOrigin,\n };\n\n // Add Vary header when origin is dynamic\n if (allowedOrigin !== \"*\") {\n headers[\"Vary\"] = \"Origin\";\n }\n\n // Credentials\n if (config.credentials) {\n headers[\"Access-Control-Allow-Credentials\"] = \"true\";\n }\n\n // Exposed headers\n if (config.exposedHeaders.length > 0) {\n headers[\"Access-Control-Expose-Headers\"] = config.exposedHeaders.join(\", \");\n }\n\n // Preflight-specific headers\n if (isPreflight) {\n headers[\"Access-Control-Allow-Methods\"] = config.methods.join(\", \");\n headers[\"Access-Control-Allow-Headers\"] = config.allowedHeaders.join(\", \");\n headers[\"Access-Control-Max-Age\"] = String(config.maxAge);\n }\n\n return headers;\n}\n\n/**\n * Handle CORS for Express\n */\nexport function applyCorsExpress(app: any, config: ResolvedCorsConfig): void {\n // Add CORS headers to all responses (including preflight)\n app.use((req: any, res: any, next: any) => {\n const origin = req.headers.origin;\n const isPreflight = req.method === \"OPTIONS\";\n const headers = getCorsHeaders(origin, config, isPreflight);\n\n if (headers) {\n Object.entries(headers).forEach(([key, value]) => {\n if (value) res.setHeader(key, value);\n });\n }\n\n // Handle preflight response\n if (isPreflight) {\n if (config.preflightContinue) {\n next();\n } else {\n res.status(config.optionsSuccessStatus).end();\n }\n return;\n }\n\n next();\n });\n}\n\n/**\n * Handle CORS for Fastify\n */\nexport function applyCorsFastify(app: any, config: ResolvedCorsConfig): void {\n // Add hook for all requests\n app.addHook(\"onRequest\", async (request: any, reply: any) => {\n const origin = request.headers.origin;\n const isPreflight = request.method === \"OPTIONS\";\n const headers = getCorsHeaders(origin, config, isPreflight);\n\n if (headers) {\n Object.entries(headers).forEach(([key, value]) => {\n if (value) reply.header(key, value);\n });\n }\n\n // Handle preflight\n if (isPreflight && !config.preflightContinue) {\n reply.status(config.optionsSuccessStatus).send();\n return;\n }\n });\n}\n","/**\n * Helmet Middleware\n * Zero-dependency security headers implementation for Nural\n */\n\nimport type { ResolvedHelmetConfig } from \"../types/middleware\";\n\n/**\n * Security headers to apply to responses\n */\nexport type SecurityHeaders = Record<string, string>;\n\n/**\n * Generate Content-Security-Policy header value\n */\nfunction buildCspHeader(directives: Record<string, string[]>): string {\n return Object.entries(directives)\n .map(([key, values]) => `${key} ${values.join(\" \")}`)\n .join(\"; \");\n}\n\n/**\n * Generate all security headers based on config\n */\nexport function getSecurityHeaders(\n config: ResolvedHelmetConfig,\n): SecurityHeaders {\n const headers: SecurityHeaders = {};\n\n // Content-Security-Policy\n if (\n typeof config.contentSecurityPolicy === \"object\" &&\n config.contentSecurityPolicy.directives\n ) {\n headers[\"Content-Security-Policy\"] = buildCspHeader(\n config.contentSecurityPolicy.directives,\n );\n }\n\n // Cross-Origin-Embedder-Policy\n if (config.crossOriginEmbedderPolicy) {\n headers[\"Cross-Origin-Embedder-Policy\"] = \"require-corp\";\n }\n\n // Cross-Origin-Opener-Policy\n if (config.crossOriginOpenerPolicy) {\n headers[\"Cross-Origin-Opener-Policy\"] =\n config.crossOriginOpenerPolicy.policy;\n }\n\n // Cross-Origin-Resource-Policy\n if (config.crossOriginResourcePolicy) {\n headers[\"Cross-Origin-Resource-Policy\"] =\n config.crossOriginResourcePolicy.policy;\n }\n\n // X-DNS-Prefetch-Control\n headers[\"X-DNS-Prefetch-Control\"] = config.dnsPrefetchControl.allow\n ? \"on\"\n : \"off\";\n\n // X-Frame-Options\n headers[\"X-Frame-Options\"] = config.frameguard.action.toUpperCase();\n\n // Strict-Transport-Security (HSTS)\n if (config.hsts) {\n let hstsValue = `max-age=${config.hsts.maxAge}`;\n if (config.hsts.includeSubDomains) {\n hstsValue += \"; includeSubDomains\";\n }\n if (config.hsts.preload) {\n hstsValue += \"; preload\";\n }\n headers[\"Strict-Transport-Security\"] = hstsValue;\n }\n\n // X-Content-Type-Options\n if (config.noSniff) {\n headers[\"X-Content-Type-Options\"] = \"nosniff\";\n }\n\n // X-Permitted-Cross-Domain-Policies\n headers[\"X-Permitted-Cross-Domain-Policies\"] =\n config.permittedCrossDomainPolicies.policy;\n\n // Referrer-Policy\n headers[\"Referrer-Policy\"] = config.referrerPolicy.policy;\n\n // X-XSS-Protection (legacy, but some still use it)\n if (config.xssFilter) {\n headers[\"X-XSS-Protection\"] = \"1; mode=block\";\n } else {\n headers[\"X-XSS-Protection\"] = \"0\";\n }\n\n return headers;\n}\n\n/**\n * Apply security headers for Express\n */\nexport function applyHelmetExpress(\n app: any,\n config: ResolvedHelmetConfig,\n): void {\n const headers = getSecurityHeaders(config);\n\n app.use((_req: any, res: any, next: any) => {\n Object.entries(headers).forEach(([key, value]) => {\n res.setHeader(key, value);\n });\n next();\n });\n}\n\n/**\n * Apply security headers for Fastify\n */\nexport function applyHelmetFastify(\n app: any,\n config: ResolvedHelmetConfig,\n): void {\n const headers = getSecurityHeaders(config);\n\n app.addHook(\"onRequest\", async (_request: any, reply: any) => {\n Object.entries(headers).forEach(([key, value]) => {\n reply.header(key, value);\n });\n });\n}\n","/**\n * Zero-Dependency Logger\n * Lightweight, colorful, and powerful logging system\n */\n\n// ANSI Color Codes\nconst colors = {\n reset: \"\\x1b[0m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n gray: \"\\x1b[90m\",\n};\n\nexport interface LoggerConfig {\n /** Enable/disable logging */\n enabled?: boolean;\n /** Minimum log level */\n minLevel?: \"log\" | \"error\" | \"warn\" | \"debug\";\n /** Show timestamp */\n timestamp?: boolean;\n}\n\n/**\n * Logger class for specialized context logging\n */\nexport class Logger {\n private context: string;\n private config: LoggerConfig;\n\n constructor(context: string = \"System\", config: LoggerConfig = {}) {\n this.context = context;\n this.config = { enabled: true, timestamp: true, ...config };\n }\n\n private getTimestamp() {\n if (!this.config.timestamp) return \"\";\n return new Date().toISOString();\n }\n\n private print(level: string, message: string, color: string) {\n if (this.config.enabled === false) return;\n\n const pid = process.pid;\n const timestamp = this.getTimestamp();\n const ctx = `[${colors.yellow}${this.context}${colors.reset}]`;\n\n // Format: [Nural] 1234 - 10/20/2025... [Context] Message\n process.stdout.write(\n `${colors.green}[Nural]${colors.reset} ${colors.gray}${pid}${colors.reset} - ` +\n `${timestamp} ${ctx} ${color}${message}${colors.reset}\\n`,\n );\n }\n\n log(message: string) {\n this.print(\"LOG\", message, colors.green);\n }\n\n error(message: string, trace?: string) {\n this.print(\"ERROR\", message, colors.red);\n if (trace) process.stderr.write(`${colors.red}${trace}${colors.reset}\\n`);\n }\n\n warn(message: string) {\n this.print(\"WARN\", message, colors.yellow);\n }\n\n debug(message: string) {\n this.print(\"DEBUG\", message, colors.magenta);\n }\n}\n","/**\n * HTTP Logger Middleware\n * Logs incoming requests with duration and status\n */\n\nimport { defineMiddleware } from \"../core/middleware\";\nimport { Logger } from \"../core/logger\";\n\n// Method Colors\nconst methodColors: Record<string, string> = {\n GET: \"\\x1b[32m\", // Green\n POST: \"\\x1b[33m\", // Yellow\n PUT: \"\\x1b[34m\", // Blue\n DELETE: \"\\x1b[31m\", // Red\n PATCH: \"\\x1b[35m\", // Magenta\n OPTIONS: \"\\x1b[90m\", // Gray\n HEAD: \"\\x1b[90m\", // Gray\n};\n\nconst resetColor = \"\\x1b[0m\";\n\nexport interface HttpLoggerOptions {\n /** Show user agent in logs */\n showUserAgent?: boolean;\n /** Show request duration in logs */\n showTime?: boolean;\n /** Custom logger context name */\n context?: string;\n}\n\n/**\n * Creates an HTTP logger middleware\n */\nexport const httpLogger = (options: HttpLoggerOptions = {}) => {\n const logger = new Logger(options.context || \"Router\");\n\n return (req: any, res: any, next?: () => void) => {\n const start = Date.now();\n\n // Hook into the 'finish' event (Standard Node.js Stream Event)\n // This works on both Express (res) and Fastify (reply.raw)\n res.on(\"finish\", () => {\n const { method, url, headers } = req;\n const duration = Date.now() - start;\n const status = res.statusCode; // Express\n const userAgent = headers ? headers[\"user-agent\"] || \"-\" : \"-\";\n\n const methodColor = methodColors[method] || resetColor;\n const coloredMethod = `${methodColor}${method}${resetColor}`;\n\n let logMessage = `${coloredMethod} ${url} ${status}`;\n\n if (options.showTime !== false) {\n logMessage += ` +${duration}ms`;\n }\n\n if (options.showUserAgent) {\n logMessage += ` - ${userAgent}`;\n }\n\n // Color code based on status\n if (status >= 500) logger.error(logMessage);\n else if (status >= 400) logger.warn(logMessage);\n else logger.log(logMessage);\n });\n\n if (next) {\n next();\n }\n };\n};\n","/**\n * Nural Framework\n * Main application class that orchestrates adapters and documentation\n */\n\nimport type { ServerAdapter } from \"../adapters/base\";\nimport { ExpressAdapter } from \"../adapters/express\";\nimport { FastifyAdapter } from \"../adapters/fastify\";\nimport type { AnyRouteConfig } from \"../types/route\";\nimport type { NuralConfig, ResolvedDocsConfig } from \"../types/config\";\nimport { resolveDocsConfig } from \"../types/config\";\nimport type {\n ResolvedCorsConfig,\n ResolvedHelmetConfig,\n} from \"../types/middleware\";\nimport { resolveCorsConfig, resolveHelmetConfig } from \"../types/middleware\";\nimport type { ResolvedErrorHandlerConfig } from \"../types/error\";\nimport { resolveErrorHandlerConfig } from \"../types/error\";\nimport { DocumentationGenerator } from \"../docs/generator\";\nimport { applyCorsExpress, applyCorsFastify } from \"../middleware/cors\";\nimport { applyHelmetExpress, applyHelmetFastify } from \"../middleware/helmet\";\nimport { Logger } from \"./logger\";\nimport { httpLogger } from \"../middleware/http-logger\";\n\n/**\n * Nural - The intelligent, schema-first REST framework\n *\n * @example\n * ```typescript\n * const app = new Nural({\n * framework: 'express',\n * docs: true,\n * cors: true,\n * helmet: true,\n * errorHandler: true,\n * });\n * app.register([userRoute, healthRoute]);\n * app.start(3000);\n * ```\n */\nexport class Nural {\n private adapter: ServerAdapter;\n private docsGenerator: DocumentationGenerator;\n private docsConfig: ResolvedDocsConfig;\n private corsConfig: ResolvedCorsConfig | null;\n private helmetConfig: ResolvedHelmetConfig | null;\n private errorHandlerConfig: ResolvedErrorHandlerConfig;\n private isExpress: boolean;\n public logger: Logger;\n\n constructor(config: NuralConfig = {}) {\n this.docsConfig = resolveDocsConfig(config.docs);\n this.corsConfig = resolveCorsConfig(config.cors);\n this.helmetConfig = resolveHelmetConfig(config.helmet);\n this.errorHandlerConfig = resolveErrorHandlerConfig(config.errorHandler);\n this.docsGenerator = new DocumentationGenerator(this.docsConfig);\n\n // Initialize System Logger\n this.logger = new Logger(\"Nural\");\n\n // Select adapter based on framework config\n this.isExpress = config.framework !== \"fastify\";\n if (this.isExpress) {\n this.adapter = new ExpressAdapter(this.errorHandlerConfig);\n } else {\n this.adapter = new FastifyAdapter(this.errorHandlerConfig);\n }\n\n // Register HTTP Logger Middleware\n if (config.logger?.enabled !== false) {\n this.adapter.use(\n httpLogger({\n showUserAgent: config.logger?.showUserAgent,\n showTime: config.logger?.showTime ?? true,\n }),\n );\n }\n\n // Apply built-in middleware\n this.applyBuiltInMiddleware();\n }\n\n /**\n * Apply CORS and Helmet middleware based on config\n */\n private applyBuiltInMiddleware(): void {\n const app = this.adapter.app;\n\n if (this.isExpress) {\n // Apply Helmet first (security headers)\n if (this.helmetConfig) {\n applyHelmetExpress(app, this.helmetConfig);\n }\n // Apply CORS\n if (this.corsConfig) {\n applyCorsExpress(app, this.corsConfig);\n }\n } else {\n // Fastify\n if (this.helmetConfig) {\n applyHelmetFastify(app, this.helmetConfig);\n }\n if (this.corsConfig) {\n applyCorsFastify(app, this.corsConfig);\n }\n }\n }\n\n /**\n * Register routes with the application\n */\n register(routes: AnyRouteConfig[]): void {\n routes.forEach((route) => {\n this.adapter.registerRoute(route);\n if (this.docsConfig.enabled) {\n this.docsGenerator.addRoute(route);\n }\n });\n }\n\n /**\n * Start the server\n */\n start(port: number): void {\n if (this.docsConfig.enabled) {\n this.setupDocs();\n }\n\n this.adapter.listen(port, () => {\n console.log(`🚀 Nural Server running on port ${port}`);\n if (this.docsConfig.enabled) {\n console.log(\n `📚 Docs available at http://localhost:${port}${this.docsConfig.path}`,\n );\n }\n if (this.corsConfig) {\n console.log(`🔓 CORS enabled`);\n }\n if (this.helmetConfig) {\n console.log(`🛡️ Helmet security headers enabled`);\n }\n });\n }\n\n /**\n * Setup documentation routes\n */\n private setupDocs(): void {\n const specPath = `${this.docsConfig.path}/openapi.json`;\n\n this.adapter.registerStaticRoute(\"get\", specPath, async () => {\n return { type: \"json\", data: this.docsGenerator.generateSpec() };\n });\n\n this.adapter.registerStaticRoute(\"get\", this.docsConfig.path, async () => {\n const html =\n this.docsConfig.ui === \"swagger\"\n ? this.docsGenerator.getSwaggerHtml(specPath)\n : this.docsGenerator.getScalarHtml(specPath);\n\n return {\n type: \"html\",\n data: html,\n };\n });\n }\n}\n","/**\n * Route Helper\n */\n\nimport type { MiddlewareHandler } from \"./middleware\";\nimport type { ZodAny, RouteConfig } from \"../types/route\";\n\n/**\n * Create a type-safe route configuration\n *\n * @example\n * ```typescript\n * const userRoute = createRoute({\n * method: 'GET',\n * path: '/users/:id',\n * summary: 'Get User by ID',\n * request: { params: z.object({ id: z.string() }) },\n * responses: { 200: z.object({ id: z.string(), name: z.string() }) },\n * handler: async ({ params }) => {\n * return { id: params.id, name: 'Chetan' };\n * }\n * });\n * ```\n */\nexport function createRoute<\n P extends ZodAny = undefined,\n Q extends ZodAny = undefined,\n B extends ZodAny = undefined,\n R extends ZodAny = undefined,\n M extends MiddlewareHandler<any, any>[] | undefined = undefined,\n>(config: RouteConfig<P, Q, B, R, M>): RouteConfig<P, Q, B, R, M> {\n return config;\n}\n","/**\n * Middleware Types and Helpers\n */\n\n/**\n * Middleware handler function type\n * Returns data to be merged into route context\n */\nexport type MiddlewareHandler<Req = unknown, Res = unknown> = (\n req: Req,\n res: Res,\n) => Promise<Record<string, unknown> | void> | Record<string, unknown> | void;\n\n/**\n * Define a type-safe middleware\n *\n * @example\n * ```typescript\n * const authMiddleware = defineMiddleware(async (req: Request) => {\n * const token = req.headers.authorization;\n * if (!token) throw new Error('Unauthorized');\n * return { user: { id: '123', role: 'admin' } };\n * });\n * ```\n */\nexport function defineMiddleware<\n T extends Record<string, unknown> | void,\n Req = unknown,\n Res = unknown,\n>(fn: (req: Req, res: Res) => Promise<T> | T) {\n return fn;\n}\n","/**\n * Nural\n * The intelligent, schema-first REST framework for Node.js\n *\n * @packageDocumentation\n */\n\nimport { extendZodWithOpenApi } from \"@asteasolutions/zod-to-openapi\";\nimport { z } from \"zod\";\n\n// Initialize Zod OpenAPI extension (side effect)\nextendZodWithOpenApi(z);\n\n// Core exports\nexport { Nural } from \"./core\";\nexport { createRoute, defineMiddleware } from \"./core\";\nexport { Logger } from \"./core/logger\";\nexport type { LoggerConfig } from \"./core/logger\";\nexport * from \"./core/exceptions\";\n\n// Type exports\nexport type {\n HttpMethod,\n HttpStatusCode,\n NuralConfig,\n DocsConfig,\n CorsConfig,\n HelmetConfig,\n ErrorHandler,\n ErrorHandlerConfig,\n ErrorContext,\n RouteConfig,\n RouteContext,\n RouteHandler,\n AnyRouteConfig,\n} from \"./types\";\n\n// Re-export Zod for convenience\nexport { z } from \"zod\";\nexport { extendZodWithOpenApi } from \"@asteasolutions/zod-to-openapi\";\n"]}
1
+ {"version":3,"sources":["../src/core/exceptions.ts","../src/types/error.ts","../src/adapters/express.ts","../src/adapters/fastify.ts","../src/types/config.ts","../src/types/middleware.ts","../src/docs/generator.ts","../src/middleware/cors.ts","../src/middleware/helmet.ts","../src/core/logger.ts","../src/middleware/http-logger.ts","../src/core/nural.ts","../src/core/route.ts","../src/core/middleware.ts","../src/index.ts"],"names":["result"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Unified Exception System\n * NestJS-style HTTP exceptions for standardized error handling\n */\n\nexport interface HttpErrorResponse {\n statusCode: number;\n message: string;\n error?: string;\n timestamp?: string;\n path?: string;\n details?: unknown;\n}\n\n/**\n * Base HTTP Exception Class\n */\nexport class HttpException extends Error {\n public readonly statusCode: number;\n public readonly error: string;\n public readonly details?: unknown;\n\n constructor(\n response: string | Record<string, any>,\n statusCode: number,\n details?: unknown,\n ) {\n const message =\n typeof response === \"string\" ? response : JSON.stringify(response);\n super(message);\n this.statusCode = statusCode;\n this.error = this.getStatusName(statusCode);\n this.details = details;\n\n // Maintain prototype chain for instanceof checks\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n public getResponse(): HttpErrorResponse {\n return {\n statusCode: this.statusCode,\n message: this.message,\n error: this.error,\n timestamp: new Date().toISOString(),\n details: this.details,\n };\n }\n\n private getStatusName(code: number): string {\n const names: Record<number, string> = {\n 400: \"Bad Request\",\n 401: \"Unauthorized\",\n 402: \"Payment Required\",\n 403: \"Forbidden\",\n 404: \"Not Found\",\n 405: \"Method Not Allowed\",\n 406: \"Not Acceptable\",\n 408: \"Request Timeout\",\n 409: \"Conflict\",\n 410: \"Gone\",\n 412: \"Precondition Failed\",\n 413: \"Payload Too Large\",\n 415: \"Unsupported Media Type\",\n 418: \"I'm a teapot\",\n 422: \"Unprocessable Entity\",\n 429: \"Too Many Requests\",\n 500: \"Internal Server Error\",\n 501: \"Not Implemented\",\n 502: \"Bad Gateway\",\n 503: \"Service Unavailable\",\n 504: \"Gateway Timeout\",\n };\n return names[code] || \"Error\";\n }\n}\n\n// --- Factory Classes for Common Exceptions ---\n\nexport class BadRequestException extends HttpException {\n constructor(message = \"Bad Request\", details?: unknown) {\n super(message, 400, details);\n }\n}\n\nexport class UnauthorizedException extends HttpException {\n constructor(message = \"Unauthorized\", details?: unknown) {\n super(message, 401, details);\n }\n}\n\nexport class ForbiddenException extends HttpException {\n constructor(message = \"Forbidden\", details?: unknown) {\n super(message, 403, details);\n }\n}\n\nexport class NotFoundException extends HttpException {\n constructor(message = \"Not Found\", details?: unknown) {\n super(message, 404, details);\n }\n}\n\nexport class ConflictException extends HttpException {\n constructor(message = \"Conflict\", details?: unknown) {\n super(message, 409, details);\n }\n}\n\nexport class GoneException extends HttpException {\n constructor(message = \"Gone\", details?: unknown) {\n super(message, 410, details);\n }\n}\n\nexport class PayloadTooLargeException extends HttpException {\n constructor(message = \"Payload Too Large\", details?: unknown) {\n super(message, 413, details);\n }\n}\n\nexport class UnsupportedMediaTypeException extends HttpException {\n constructor(message = \"Unsupported Media Type\", details?: unknown) {\n super(message, 415, details);\n }\n}\n\nexport class UnprocessableEntityException extends HttpException {\n constructor(message = \"Unprocessable Entity\", details?: unknown) {\n super(message, 422, details);\n }\n}\n\nexport class InternalServerErrorException extends HttpException {\n constructor(message = \"Internal Server Error\", details?: unknown) {\n super(message, 500, details);\n }\n}\n\nexport class NotImplementedException extends HttpException {\n constructor(message = \"Not Implemented\", details?: unknown) {\n super(message, 501, details);\n }\n}\n\nexport class BadGatewayException extends HttpException {\n constructor(message = \"Bad Gateway\", details?: unknown) {\n super(message, 502, details);\n }\n}\n\nexport class ServiceUnavailableException extends HttpException {\n constructor(message = \"Service Unavailable\", details?: unknown) {\n super(message, 503, details);\n }\n}\n\nexport class GatewayTimeoutException extends HttpException {\n constructor(message = \"Gateway Timeout\", details?: unknown) {\n super(message, 504, details);\n }\n}\n\n/**\n * Custom Exception for specific use cases\n */\nexport class CustomException extends HttpException {\n constructor(message: string, statusCode: number, details?: unknown) {\n super(message, statusCode, details);\n }\n}\n","/**\n * Error Types and Handler\n * Types for global error handling\n */\n\nimport type { Request, Response } from \"express\";\nimport type { FastifyRequest, FastifyReply } from \"fastify\";\nimport { HttpException } from \"../core/exceptions\";\n\n/**\n * Error context passed to error handlers\n */\nexport interface ErrorContext {\n /** The error that occurred */\n error: Error;\n /** HTTP request (Express or Fastify) */\n request: Request | FastifyRequest;\n /** HTTP response (Express or Fastify) */\n response: Response | FastifyReply;\n /** Route path that errored */\n path?: string;\n /** HTTP method */\n method?: string;\n}\n\n/**\n * Error response returned by error handlers\n */\nexport interface ErrorResponse {\n /** HTTP status code */\n status: number;\n /** Response body */\n body: Record<string, unknown>;\n /** Optional headers to set */\n headers?: Record<string, string>;\n}\n\n/**\n * Global error handler function type\n */\nexport type ErrorHandler = (\n ctx: ErrorContext,\n) => ErrorResponse | Promise<ErrorResponse>;\n\n/**\n * Error handler configuration\n */\nexport interface ErrorHandlerConfig {\n /** Custom error handler function */\n handler?: ErrorHandler;\n /** Include stack trace in development */\n includeStack?: boolean;\n /** Log errors to console */\n logErrors?: boolean;\n /** Custom error logger */\n logger?: (error: Error, ctx: ErrorContext) => void;\n}\n\n/**\n * Resolved error handler config with defaults\n */\nexport interface ResolvedErrorHandlerConfig {\n handler: ErrorHandler;\n includeStack: boolean;\n logErrors: boolean;\n logger: (error: Error, ctx: ErrorContext) => void;\n}\n\n/**\n * Default error logger\n */\nconst defaultLogger = (error: Error, ctx: ErrorContext) => {\n console.error(`[Nural Error] ${ctx.method} ${ctx.path}:`, error.message);\n if (error.stack) {\n console.error(error.stack);\n }\n};\n\n/**\n * Default error handler - converts errors to HTTP responses\n */\nexport const defaultErrorHandler: ErrorHandler = (ctx) => {\n const { error } = ctx;\n\n // Zod validation error\n if (error.name === \"ZodError\" && \"issues\" in error) {\n return {\n status: 400,\n body: {\n error: \"Validation Error\",\n message: \"Request validation failed\",\n details: (error as any).issues,\n },\n };\n }\n\n // Unified Exception Handling\n if (error instanceof HttpException) {\n const response = error.getResponse();\n return {\n status: response.statusCode,\n body: response as unknown as Record<string, unknown>,\n };\n }\n\n // Custom HTTP error (has status property) - Legacy support\n if (\"status\" in error && typeof (error as any).status === \"number\") {\n return {\n status: (error as any).status,\n body: {\n error: error.name || \"Error\",\n message: error.message,\n },\n };\n }\n\n // Auth errors\n if (\n error.message.toLowerCase().includes(\"unauthorized\") ||\n error.message.toLowerCase().includes(\"authentication\")\n ) {\n return {\n status: 401,\n body: {\n error: \"Unauthorized\",\n message: error.message,\n },\n };\n }\n\n if (\n error.message.toLowerCase().includes(\"forbidden\") ||\n error.message.toLowerCase().includes(\"permission\")\n ) {\n return {\n status: 403,\n body: {\n error: \"Forbidden\",\n message: error.message,\n },\n };\n }\n\n if (error.message.toLowerCase().includes(\"not found\")) {\n return {\n status: 404,\n body: {\n error: \"Not Found\",\n message: error.message,\n },\n };\n }\n\n // Default: Internal Server Error\n return {\n status: 500,\n body: {\n error: \"Internal Server Error\",\n message:\n process.env.NODE_ENV === \"production\"\n ? \"An unexpected error occurred\"\n : error.message,\n },\n };\n};\n\n/**\n * Default error handler config\n */\nexport const DEFAULT_ERROR_HANDLER_CONFIG: ResolvedErrorHandlerConfig = {\n handler: defaultErrorHandler,\n includeStack: process.env.NODE_ENV !== \"production\",\n logErrors: true,\n logger: defaultLogger,\n};\n\n/**\n * Resolve error handler config from user input\n */\nexport function resolveErrorHandlerConfig(\n config?: boolean | ErrorHandler | ErrorHandlerConfig,\n): ResolvedErrorHandlerConfig {\n // Disabled\n if (config === false) {\n return {\n ...DEFAULT_ERROR_HANDLER_CONFIG,\n logErrors: false,\n };\n }\n\n // Default config\n if (config === true || config === undefined) {\n return DEFAULT_ERROR_HANDLER_CONFIG;\n }\n\n // Function only\n if (typeof config === \"function\") {\n return {\n ...DEFAULT_ERROR_HANDLER_CONFIG,\n handler: config,\n };\n }\n\n // Full config object\n return {\n handler: config.handler ?? DEFAULT_ERROR_HANDLER_CONFIG.handler,\n includeStack:\n config.includeStack ?? DEFAULT_ERROR_HANDLER_CONFIG.includeStack,\n logErrors: config.logErrors ?? DEFAULT_ERROR_HANDLER_CONFIG.logErrors,\n logger: config.logger ?? DEFAULT_ERROR_HANDLER_CONFIG.logger,\n };\n}\n","/**\n * Express Adapter\n * Implements ServerAdapter for Express framework\n */\n\nimport express, { Express, Request, Response, RequestHandler } from \"express\";\nimport { z } from \"zod\";\nimport type { AnyRouteConfig } from \"../types/route\";\nimport type { ServerAdapter, StaticRouteResponse } from \"./base\";\nimport type { ResolvedErrorHandlerConfig, ErrorContext } from \"../types/error\";\nimport { DEFAULT_ERROR_HANDLER_CONFIG } from \"../types/error\";\n\n/**\n * Express adapter implementation\n */\nexport class ExpressAdapter implements ServerAdapter {\n public app: Express;\n private errorConfig: ResolvedErrorHandlerConfig;\n\n constructor(errorConfig?: ResolvedErrorHandlerConfig) {\n this.app = express();\n this.app.use(express.json());\n this.errorConfig = errorConfig ?? DEFAULT_ERROR_HANDLER_CONFIG;\n }\n\n listen(port: number, cb?: () => void): void {\n this.app.listen(port, cb);\n }\n\n use(middleware: RequestHandler): void {\n this.app.use(middleware);\n }\n\n /**\n * Handle errors using the configured error handler\n */\n private async handleError(\n error: Error,\n req: Request,\n res: Response,\n path?: string,\n ): Promise<void> {\n const ctx: ErrorContext = {\n error,\n request: req,\n response: res,\n path: path ?? req.path,\n method: req.method,\n };\n\n // Log error if enabled\n if (this.errorConfig.logErrors) {\n this.errorConfig.logger(error, ctx);\n }\n\n try {\n // Get error response from handler\n const errorResponse = await this.errorConfig.handler(ctx);\n\n // Set headers if provided\n if (errorResponse.headers) {\n Object.entries(errorResponse.headers).forEach(([key, value]) => {\n res.setHeader(key, value);\n });\n }\n\n // Include stack in development mode\n const body = { ...errorResponse.body };\n if (this.errorConfig.includeStack && error.stack) {\n body.stack = error.stack;\n }\n\n res.status(errorResponse.status).json(body);\n } catch (handlerError) {\n // Fallback if error handler itself fails\n console.error(\"[Nural] Error handler failed:\", handlerError);\n res.status(500).json({ error: \"Internal Server Error\" });\n }\n }\n\n registerStaticRoute(\n method: \"get\",\n path: string,\n handler: (req: Request) => Promise<StaticRouteResponse>,\n ): void {\n this.app[method](path, async (req, res) => {\n try {\n const result = await handler(req);\n if (result.type === \"html\") {\n res.set(\"Content-Type\", \"text/html\");\n res.send(result.data);\n } else {\n res.json(result.data);\n }\n } catch (err) {\n await this.handleError(err as Error, req, res, path);\n }\n });\n }\n\n registerRoute(route: AnyRouteConfig): void {\n const handler: RequestHandler = async (req, res, next) => {\n try {\n // 1. Prepare Base Context\n let context: Record<string, unknown> = { req, res };\n\n // 2. Run Middleware Pipeline\n if (route.middleware && route.middleware.length > 0) {\n for (const mw of route.middleware) {\n const result = await mw(req, res);\n if (result && typeof result === \"object\") {\n context = { ...context, ...result };\n }\n }\n }\n\n // 3. Input Validation\n const params = route.request?.params\n ? await route.request.params.parseAsync(req.params)\n : req.params;\n\n const query = route.request?.query\n ? await route.request.query.parseAsync(req.query)\n : req.query;\n\n const body = route.request?.body\n ? await route.request.body.parseAsync(req.body)\n : req.body;\n\n // 4. Execute Handler\n const result = await route.handler({\n ...context,\n params,\n query,\n body,\n req,\n res,\n });\n\n // 5. Response Mapping (strips unlisted fields)\n const responses = route.responses ?? {};\n const successCodeKey =\n Object.keys(responses).find((c) => c.startsWith(\"2\")) ?? \"200\";\n const responseSchema = responses[Number(successCodeKey)];\n\n if (responseSchema) {\n const cleanResult = await responseSchema.parseAsync(result);\n res.status(Number(successCodeKey)).json(cleanResult);\n } else if (result !== undefined) {\n res.status(Number(successCodeKey)).json(result);\n } else {\n res.status(Number(successCodeKey)).send();\n }\n } catch (err) {\n await this.handleError(err as Error, req, res, route.path);\n }\n };\n\n // Register route based on HTTP method\n const path = route.path;\n switch (route.method) {\n case \"GET\":\n this.app.get(path, handler);\n break;\n case \"POST\":\n this.app.post(path, handler);\n break;\n case \"PUT\":\n this.app.put(path, handler);\n break;\n case \"PATCH\":\n this.app.patch(path, handler);\n break;\n case \"DELETE\":\n this.app.delete(path, handler);\n break;\n case \"OPTIONS\":\n this.app.options(path, handler);\n break;\n case \"HEAD\":\n this.app.head(path, handler);\n break;\n case \"ALL\":\n this.app.all(path, handler);\n break;\n }\n }\n}\n","/**\n * Fastify Adapter\n * Implements ServerAdapter for Fastify framework\n */\n\nimport Fastify, {\n FastifyInstance,\n FastifyRequest,\n FastifyReply,\n HTTPMethods,\n FastifyPluginCallback,\n} from \"fastify\";\nimport { z } from \"zod\";\nimport type { AnyRouteConfig } from \"../types/route\";\nimport type { ServerAdapter, StaticRouteResponse } from \"./base\";\nimport type { ResolvedErrorHandlerConfig, ErrorContext } from \"../types/error\";\nimport { DEFAULT_ERROR_HANDLER_CONFIG } from \"../types/error\";\n\n/**\n * Fastify adapter implementation\n */\nexport class FastifyAdapter implements ServerAdapter {\n public app: FastifyInstance;\n private errorConfig: ResolvedErrorHandlerConfig;\n\n constructor(errorConfig?: ResolvedErrorHandlerConfig) {\n this.app = Fastify();\n this.errorConfig = errorConfig ?? DEFAULT_ERROR_HANDLER_CONFIG;\n }\n\n listen(port: number, cb?: () => void): void {\n this.app.listen({ port }, (err) => {\n if (err) {\n console.error(err);\n process.exit(1);\n }\n if (cb) cb();\n });\n }\n\n use(middleware: FastifyPluginCallback): void {\n this.app.register(middleware);\n }\n\n /**\n * Handle errors using the configured error handler\n */\n private async handleError(\n error: Error,\n req: FastifyRequest,\n reply: FastifyReply,\n path?: string,\n ): Promise<void> {\n const ctx: ErrorContext = {\n error,\n request: req,\n response: reply,\n path: path ?? req.url,\n method: req.method,\n };\n\n // Log error if enabled\n if (this.errorConfig.logErrors) {\n this.errorConfig.logger(error, ctx);\n }\n\n try {\n // Get error response from handler\n const errorResponse = await this.errorConfig.handler(ctx);\n\n // Set headers if provided\n if (errorResponse.headers) {\n Object.entries(errorResponse.headers).forEach(([key, value]) => {\n reply.header(key, value);\n });\n }\n\n // Include stack in development mode\n const body = { ...errorResponse.body };\n if (this.errorConfig.includeStack && error.stack) {\n body.stack = error.stack;\n }\n\n reply.status(errorResponse.status).send(body);\n } catch (handlerError) {\n // Fallback if error handler itself fails\n console.error(\"[Nural] Error handler failed:\", handlerError);\n reply.status(500).send({ error: \"Internal Server Error\" });\n }\n }\n\n registerStaticRoute(\n method: \"get\",\n path: string,\n handler: (req: unknown) => Promise<StaticRouteResponse>,\n ): void {\n this.app.get(path, async (req, reply) => {\n try {\n const result = await handler(req);\n if (result.type === \"html\") {\n reply.type(\"text/html\").send(result.data);\n } else {\n reply.send(result.data);\n }\n } catch (err) {\n await this.handleError(err as Error, req, reply, path);\n }\n });\n }\n\n registerRoute(route: AnyRouteConfig): void {\n const url = route.path;\n\n this.app.route({\n method: route.method as HTTPMethods,\n url,\n handler: async (req: FastifyRequest, reply: FastifyReply) => {\n try {\n // 1. Prepare Context\n let context: Record<string, unknown> = { req, res: reply };\n\n // 2. Run Middleware Pipeline\n if (route.middleware && route.middleware.length > 0) {\n for (const mw of route.middleware) {\n const result = await mw(req, reply);\n if (result && typeof result === \"object\") {\n context = { ...context, ...result };\n }\n }\n }\n\n // 3. Input Validation\n const params = route.request?.params\n ? await route.request.params.parseAsync(req.params)\n : req.params;\n\n const query = route.request?.query\n ? await route.request.query.parseAsync(req.query)\n : req.query;\n\n const body = route.request?.body\n ? await route.request.body.parseAsync(req.body)\n : req.body;\n\n // 4. Execute Handler\n const result = await route.handler({\n ...context,\n params,\n query,\n body,\n req,\n res: reply,\n });\n\n // 5. Response Mapping\n const responses = route.responses ?? {};\n const successCodeKey =\n Object.keys(responses).find((c) => c.startsWith(\"2\")) ?? \"200\";\n const responseSchema = responses[Number(successCodeKey)];\n\n if (responseSchema) {\n const cleanResult = await responseSchema.parseAsync(result);\n reply.status(Number(successCodeKey)).send(cleanResult);\n } else if (result !== undefined) {\n reply.status(Number(successCodeKey)).send(result);\n } else {\n reply.status(Number(successCodeKey)).send();\n }\n } catch (err) {\n await this.handleError(err as Error, req, reply, route.path);\n }\n },\n });\n }\n}\n","/**\n * Configuration Types\n * Types for Nural framework configuration\n */\n\n/**\n * Documentation configuration options\n */\n\n/**\n * Scalar UI Configuration\n * @see https://github.com/scalar/scalar\n */\nexport interface ScalarConfig {\n theme?:\n | \"alternate\"\n | \"default\"\n | \"moon\"\n | \"purple\"\n | \"solarized\"\n | \"bluePlanet\"\n | \"saturn\"\n | \"kepler\"\n | \"mars\"\n | \"deepSpace\"\n | \"laserwave\"\n | \"none\";\n layout?: \"modern\" | \"classic\";\n scale?: number;\n content?: string | Record<string, any>;\n spec?: { url?: string; content?: string | Record<string, any> };\n proxyUrl?: string;\n isEditable?: boolean;\n showSidebar?: boolean;\n hideModels?: boolean;\n hideDownloadButton?: boolean;\n hideTestRequestButton?: boolean;\n hideSearch?: boolean;\n darkMode?: boolean;\n forceDarkModeState?: \"dark\" | \"light\";\n hideDarkModeToggle?: boolean;\n customCss?: string;\n searchHotKey?: string;\n metaData?: Record<string, any>;\n hiddenClients?: string[] | boolean | Record<string, any>;\n // Auth\n authentication?: {\n preferredSecurityScheme?: string | string[];\n securitySchemes?: Record<string, any>;\n };\n // Advanced\n defaultHttpClient?: { targetKey: string; clientKey: string };\n withDefaultFonts?: boolean;\n defaultOpenAllTags?: boolean;\n tagsSorter?: \"alpha\" | Function;\n operationsSorter?: \"alpha\" | \"method\" | Function;\n [key: string]: any;\n}\n\n/**\n * Swagger UI Configuration\n * @see https://github.com/swagger-api/swagger-ui/blob/master/docs/usage/configuration.md\n */\nexport interface SwaggerConfig {\n /**\n * Swagger UI Theme\n * - outline: A modern, clean theme (default)\n * - classic: The standard Swagger UI look\n * - no-theme: No extra styling included (use your own)\n */\n theme?: \"outline\" | \"classic\" | \"no-theme\";\n options?: {\n dom_id?: string;\n domNode?: any;\n spec?: any;\n url?: string;\n urls?: { url: string; name: string }[];\n layout?: string;\n docExpansion?: \"list\" | \"full\" | \"none\";\n maxDisplayedTags?: number;\n depth?: number;\n filter?: boolean | string;\n deepLinking?: boolean;\n displayOperationId?: boolean;\n defaultModelsExpandDepth?: number;\n defaultModelExpandDepth?: number;\n defaultModelRendering?: \"example\" | \"model\";\n displayRequestDuration?: boolean;\n showExtensions?: boolean;\n showCommonExtensions?: boolean;\n showMutatedRequest?: boolean;\n supportedSubmitMethods?: string[];\n validatorUrl?: string | null;\n withCredentials?: boolean;\n persistAuthorization?: boolean;\n oauth2RedirectUrl?: string;\n plugins?: any[];\n presets?: any[];\n [key: string]: any;\n };\n}\n\n/**\n * Documentation configuration options\n */\nexport interface DocsConfig {\n /** Enable documentation endpoint */\n enabled?: boolean;\n /**\n * Documentation UI path (default: /docs)\n */\n path?: string;\n /**\n * Documentation UI type\n * @default \"scalar\"\n */\n ui?: \"scalar\" | \"swagger\";\n /**\n * OpenAPI Specification overrides\n * Allows full customization of the OpenAPI document\n */\n openApi?: {\n info?: {\n title?: string;\n version?: string;\n description?: string;\n termsOfService?: string;\n contact?: { name?: string; url?: string; email?: string };\n license?: { name?: string; url?: string };\n };\n servers?: Array<{ url: string; description?: string }>;\n components?: {\n securitySchemes?: Record<string, any>;\n [key: string]: any;\n };\n security?: Array<Record<string, string[]>>;\n tags?: Array<{ name: string; description?: string }>;\n externalDocs?: { description?: string; url: string };\n };\n /** Configuration specific to Scalar UI */\n scalar?: ScalarConfig;\n /** Configuration specific to Swagger UI */\n swagger?: SwaggerConfig;\n // Backward compatibility\n title?: string;\n version?: string;\n description?: string;\n}\n\n/**\n * Main Nural framework configuration\n */\nexport interface NuralConfig {\n /** Server framework to use */\n framework?: \"express\" | \"fastify\";\n /** Documentation settings (true for defaults, false to disable, or DocsConfig) */\n docs?: boolean | DocsConfig;\n /** CORS settings (true for defaults, false to disable, or CorsConfig) */\n cors?: boolean | import(\"./middleware\").CorsConfig;\n /** Helmet security headers (true for defaults, false to disable, or HelmetConfig) */\n helmet?: boolean | import(\"./middleware\").HelmetConfig;\n /** Logger configuration */\n logger?: {\n enabled?: boolean;\n showUserAgent?: boolean;\n showTime?: boolean;\n };\n /** Global error handler (true for defaults, function, or config) */\n errorHandler?:\n | boolean\n | import(\"./error\").ErrorHandler\n | import(\"./error\").ErrorHandlerConfig;\n}\n\n/**\n * Resolved documentation configuration (with defaults applied)\n */\nexport interface ResolvedDocsConfig {\n enabled: boolean;\n path: string;\n ui: \"scalar\" | \"swagger\";\n openApi: NonNullable<DocsConfig[\"openApi\"]>;\n scalar: ScalarConfig;\n swagger: SwaggerConfig;\n}\n\n/**\n * Default documentation configuration\n */\nexport const DEFAULT_DOCS_CONFIG: ResolvedDocsConfig = {\n enabled: true,\n path: \"/docs\",\n ui: \"scalar\",\n openApi: {\n info: {\n title: \"Nural API\",\n version: \"1.0.0\",\n description: \"Powered by Nural Framework\",\n },\n servers: [{ url: \"/\" }],\n },\n scalar: {},\n swagger: {},\n};\n\n/**\n * Resolve docs config from user input\n */\nexport function resolveDocsConfig(\n docs?: boolean | DocsConfig,\n): ResolvedDocsConfig {\n if (docs === false) {\n return { ...DEFAULT_DOCS_CONFIG, enabled: false };\n }\n\n if (docs === true || docs === undefined) {\n return DEFAULT_DOCS_CONFIG;\n }\n\n // Merge with defaults\n return {\n enabled: docs.enabled ?? true,\n path: docs.path ?? DEFAULT_DOCS_CONFIG.path,\n ui: docs.ui ?? DEFAULT_DOCS_CONFIG.ui,\n openApi: {\n ...DEFAULT_DOCS_CONFIG.openApi,\n ...docs.openApi,\n info: {\n ...DEFAULT_DOCS_CONFIG.openApi.info,\n ...docs.openApi?.info,\n // Backward compatibility: use top-level fields if provided\n title:\n docs.title ??\n docs.openApi?.info?.title ??\n DEFAULT_DOCS_CONFIG.openApi.info?.title,\n version:\n docs.version ??\n docs.openApi?.info?.version ??\n DEFAULT_DOCS_CONFIG.openApi.info?.version,\n description:\n docs.description ??\n docs.openApi?.info?.description ??\n DEFAULT_DOCS_CONFIG.openApi.info?.description,\n },\n },\n scalar: docs.scalar ?? {},\n swagger: docs.swagger ?? {},\n };\n}\n","/**\n * Middleware Configuration Types\n * Types for CORS and Helmet middleware configuration\n */\n\n/**\n * CORS configuration options\n */\nexport interface CorsConfig {\n /**\n * Allowed origins\n * - `true` or `'*'` allows all origins\n * - String for single origin\n * - Array for multiple origins\n * - Function for dynamic origin check\n */\n origin?: boolean | string | string[] | ((origin: string) => boolean);\n\n /** Allowed HTTP methods */\n methods?: string[];\n\n /** Allowed headers */\n allowedHeaders?: string[];\n\n /** Headers exposed to client */\n exposedHeaders?: string[];\n\n /** Allow credentials (cookies, authorization headers) */\n credentials?: boolean;\n\n /** Preflight cache max age in seconds */\n maxAge?: number;\n\n /** Pass preflight response to next handler */\n preflightContinue?: boolean;\n\n /** Success status code for OPTIONS requests */\n optionsSuccessStatus?: number;\n}\n\n/**\n * Resolved CORS configuration with defaults applied\n */\nexport interface ResolvedCorsConfig {\n origin: boolean | string | string[] | ((origin: string) => boolean);\n methods: string[];\n allowedHeaders: string[];\n exposedHeaders: string[];\n credentials: boolean;\n maxAge: number;\n preflightContinue: boolean;\n optionsSuccessStatus: number;\n}\n\n/**\n * Default CORS configuration\n */\nexport const DEFAULT_CORS_CONFIG: ResolvedCorsConfig = {\n origin: \"*\",\n methods: [\"GET\", \"HEAD\", \"PUT\", \"PATCH\", \"POST\", \"DELETE\"],\n allowedHeaders: [\"Content-Type\", \"Authorization\", \"X-Requested-With\"],\n exposedHeaders: [],\n credentials: false,\n maxAge: 86400, // 24 hours\n preflightContinue: false,\n optionsSuccessStatus: 204,\n};\n\n/**\n * Helmet configuration options\n */\nexport interface HelmetConfig {\n /** Content-Security-Policy header */\n contentSecurityPolicy?: boolean | { directives?: Record<string, string[]> };\n\n /** Cross-Origin-Embedder-Policy header */\n crossOriginEmbedderPolicy?: boolean;\n\n /** Cross-Origin-Opener-Policy header */\n crossOriginOpenerPolicy?: boolean | { policy?: string };\n\n /** Cross-Origin-Resource-Policy header */\n crossOriginResourcePolicy?: boolean | { policy?: string };\n\n /** X-DNS-Prefetch-Control header */\n dnsPrefetchControl?: boolean | { allow?: boolean };\n\n /** X-Frame-Options header */\n frameguard?: boolean | { action?: \"deny\" | \"sameorigin\" };\n\n /** Strict-Transport-Security header */\n hsts?:\n | boolean\n | { maxAge?: number; includeSubDomains?: boolean; preload?: boolean };\n\n /** X-Content-Type-Options header */\n noSniff?: boolean;\n\n /** X-Permitted-Cross-Domain-Policies header */\n permittedCrossDomainPolicies?: boolean | { policy?: string };\n\n /** Referrer-Policy header */\n referrerPolicy?: boolean | { policy?: string | string[] };\n\n /** X-XSS-Protection header (legacy) */\n xssFilter?: boolean;\n}\n\n/**\n * Resolved Helmet configuration\n */\nexport interface ResolvedHelmetConfig {\n contentSecurityPolicy: boolean | { directives: Record<string, string[]> };\n crossOriginEmbedderPolicy: boolean;\n crossOriginOpenerPolicy: { policy: string };\n crossOriginResourcePolicy: { policy: string };\n dnsPrefetchControl: { allow: boolean };\n frameguard: { action: \"deny\" | \"sameorigin\" };\n hsts: { maxAge: number; includeSubDomains: boolean; preload: boolean };\n noSniff: boolean;\n permittedCrossDomainPolicies: { policy: string };\n referrerPolicy: { policy: string };\n xssFilter: boolean;\n}\n\n/**\n * Default Helmet configuration\n */\nexport const DEFAULT_HELMET_CONFIG: ResolvedHelmetConfig = {\n contentSecurityPolicy: false, // Disabled by default (can break apps)\n crossOriginEmbedderPolicy: false,\n crossOriginOpenerPolicy: { policy: \"same-origin\" },\n crossOriginResourcePolicy: { policy: \"same-origin\" },\n dnsPrefetchControl: { allow: false },\n frameguard: { action: \"sameorigin\" },\n hsts: { maxAge: 15552000, includeSubDomains: true, preload: false }, // 180 days\n noSniff: true,\n permittedCrossDomainPolicies: { policy: \"none\" },\n referrerPolicy: { policy: \"no-referrer\" },\n xssFilter: false, // Deprecated, browsers ignore it\n};\n\n/**\n * Resolve CORS config from user input\n */\nexport function resolveCorsConfig(\n cors?: boolean | CorsConfig,\n): ResolvedCorsConfig | null {\n if (cors === false || cors === undefined) {\n return null;\n }\n\n if (cors === true) {\n return DEFAULT_CORS_CONFIG;\n }\n\n return {\n origin: cors.origin ?? DEFAULT_CORS_CONFIG.origin,\n methods: cors.methods ?? DEFAULT_CORS_CONFIG.methods,\n allowedHeaders: cors.allowedHeaders ?? DEFAULT_CORS_CONFIG.allowedHeaders,\n exposedHeaders: cors.exposedHeaders ?? DEFAULT_CORS_CONFIG.exposedHeaders,\n credentials: cors.credentials ?? DEFAULT_CORS_CONFIG.credentials,\n maxAge: cors.maxAge ?? DEFAULT_CORS_CONFIG.maxAge,\n preflightContinue:\n cors.preflightContinue ?? DEFAULT_CORS_CONFIG.preflightContinue,\n optionsSuccessStatus:\n cors.optionsSuccessStatus ?? DEFAULT_CORS_CONFIG.optionsSuccessStatus,\n };\n}\n\n/**\n * Resolve Helmet config from user input\n */\nexport function resolveHelmetConfig(\n helmet?: boolean | HelmetConfig,\n): ResolvedHelmetConfig | null {\n if (helmet === false || helmet === undefined) {\n return null;\n }\n\n if (helmet === true) {\n return DEFAULT_HELMET_CONFIG;\n }\n\n return {\n contentSecurityPolicy:\n typeof helmet.contentSecurityPolicy === \"object\"\n ? { directives: helmet.contentSecurityPolicy.directives ?? {} }\n : (helmet.contentSecurityPolicy ??\n DEFAULT_HELMET_CONFIG.contentSecurityPolicy),\n crossOriginEmbedderPolicy:\n helmet.crossOriginEmbedderPolicy ??\n DEFAULT_HELMET_CONFIG.crossOriginEmbedderPolicy,\n crossOriginOpenerPolicy:\n typeof helmet.crossOriginOpenerPolicy === \"object\"\n ? (helmet.crossOriginOpenerPolicy as { policy: string })\n : DEFAULT_HELMET_CONFIG.crossOriginOpenerPolicy,\n crossOriginResourcePolicy:\n typeof helmet.crossOriginResourcePolicy === \"object\"\n ? (helmet.crossOriginResourcePolicy as { policy: string })\n : DEFAULT_HELMET_CONFIG.crossOriginResourcePolicy,\n dnsPrefetchControl:\n typeof helmet.dnsPrefetchControl === \"object\"\n ? (helmet.dnsPrefetchControl as { allow: boolean })\n : DEFAULT_HELMET_CONFIG.dnsPrefetchControl,\n frameguard:\n typeof helmet.frameguard === \"object\"\n ? (helmet.frameguard as { action: \"deny\" | \"sameorigin\" })\n : DEFAULT_HELMET_CONFIG.frameguard,\n hsts:\n typeof helmet.hsts === \"object\"\n ? { ...DEFAULT_HELMET_CONFIG.hsts, ...helmet.hsts }\n : DEFAULT_HELMET_CONFIG.hsts,\n noSniff: helmet.noSniff ?? DEFAULT_HELMET_CONFIG.noSniff,\n permittedCrossDomainPolicies:\n typeof helmet.permittedCrossDomainPolicies === \"object\"\n ? (helmet.permittedCrossDomainPolicies as { policy: string })\n : DEFAULT_HELMET_CONFIG.permittedCrossDomainPolicies,\n referrerPolicy:\n typeof helmet.referrerPolicy === \"object\"\n ? (helmet.referrerPolicy as { policy: string })\n : DEFAULT_HELMET_CONFIG.referrerPolicy,\n xssFilter: helmet.xssFilter ?? DEFAULT_HELMET_CONFIG.xssFilter,\n };\n}\n","/**\n * Documentation Generator\n * Generates OpenAPI spec and serves documentation UI\n */\n\nimport {\n OpenApiGeneratorV3,\n OpenAPIRegistry,\n} from \"@asteasolutions/zod-to-openapi\";\nimport type { z } from \"zod\";\nimport type { AnyRouteConfig } from \"../types/route\";\nimport type { ResolvedDocsConfig } from \"../types/config\";\n\n/**\n * Generates OpenAPI documentation from registered routes\n */\nexport class DocumentationGenerator {\n private registry: OpenAPIRegistry;\n private config: ResolvedDocsConfig;\n\n constructor(config: ResolvedDocsConfig) {\n this.registry = new OpenAPIRegistry();\n this.config = config;\n }\n\n /**\n * Register a route for documentation\n */\n addRoute(route: AnyRouteConfig): void {\n // Convert Express path \"/users/:id\" to OpenAPI path \"/users/{id}\"\n const openApiPath = route.path.replace(/:([a-zA-Z]+)/g, \"{$1}\");\n\n const method = route.method.toLowerCase() as\n | \"get\"\n | \"post\"\n | \"put\"\n | \"delete\"\n | \"patch\";\n\n this.registry.registerPath({\n method,\n path: openApiPath,\n summary: route.summary || \"No summary\",\n description: route.description,\n tags: route.tags,\n request: {\n params: route.request?.params as z.ZodObject<any, any>,\n query: route.request?.query as z.ZodObject<any, any>,\n body: route.request?.body\n ? { content: { \"application/json\": { schema: route.request.body } } }\n : undefined,\n },\n responses: Object.fromEntries(\n Object.entries(route.responses || {}).map(([status, schema]) => [\n status,\n {\n description: \"Response\",\n content: { \"application/json\": { schema } },\n },\n ]),\n ),\n security: route.security,\n ...route.openapi,\n });\n }\n\n /**\n * Generate the OpenAPI specification document\n */\n generateSpec(): object {\n const generator = new OpenApiGeneratorV3(this.registry.definitions);\n const doc = generator.generateDocument({\n openapi: \"3.0.0\",\n info: {\n title: this.config.openApi.info?.title ?? \"Nural API\",\n version: this.config.openApi.info?.version ?? \"1.0.0\",\n description: this.config.openApi.info?.description,\n termsOfService: this.config.openApi.info?.termsOfService,\n contact: this.config.openApi.info?.contact?.name\n ? {\n name: this.config.openApi.info.contact.name,\n email: this.config.openApi.info.contact.email,\n url: this.config.openApi.info.contact.url,\n }\n : undefined,\n license: this.config.openApi.info?.license?.name\n ? {\n name: this.config.openApi.info.license.name,\n url: this.config.openApi.info.license.url,\n }\n : undefined,\n },\n servers: this.config.openApi.servers,\n });\n\n // Deep merge user-defined OpenAPI overrides\n return {\n ...doc,\n components: {\n ...doc.components,\n ...this.config.openApi.components,\n securitySchemes: {\n ...doc.components?.securitySchemes,\n ...this.config.openApi.components?.securitySchemes,\n },\n },\n security: [\n ...(doc.security || []),\n ...(this.config.openApi.security || []),\n ],\n tags: [...(doc.tags || []), ...(this.config.openApi.tags || [])],\n externalDocs: this.config.openApi.externalDocs || doc.externalDocs,\n };\n }\n\n /**\n * Get Scalar API documentation HTML\n */\n getScalarHtml(specUrl: string): string {\n const scalarConfig = JSON.stringify(this.config.scalar || {});\n return `\n <!doctype html>\n <html>\n <head>\n <title>${this.config.openApi.info?.title ?? \"Nural API\"} - API Reference</title>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <style>body { margin: 0; }</style>\n </head>\n <body>\n <script\n id=\"api-reference\"\n data-url=\"${specUrl}\"\n data-configuration='${scalarConfig}'\n src=\"https://cdn.jsdelivr.net/npm/@scalar/api-reference\"\n ></script>\n </body>\n </html>\n `;\n }\n\n /**\n * Get Swagger UI HTML\n */\n getSwaggerHtml(specUrl: string): string {\n const title = this.config.openApi.info?.title ?? \"Nural API\";\n const swaggerOptions = JSON.stringify(this.config.swagger.options || {});\n let themeUrl =\n \"https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/4.15.5/swagger-ui.min.css\";\n\n if (this.config.swagger.theme === \"outline\") {\n themeUrl =\n \"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\";\n } else if (this.config.swagger.theme === \"no-theme\") {\n themeUrl = \"\";\n }\n\n const theme = themeUrl\n ? `<link rel=\"stylesheet\" href=\"${themeUrl}\" />`\n : \"\";\n\n return `\n <!DOCTYPE html>\n <html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\">\n <title>${title} - Swagger UI</title>\n ${theme}\n <style>\n html { box-sizing: border-box; overflow: -moz-scrollbars-vertical; overflow-y: scroll; }\n *, *:before, *:after { box-sizing: inherit; }\n body { margin: 0; background: #fafafa; }\n </style>\n </head>\n <body>\n <div id=\"swagger-ui\"></div>\n <script src=\"https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/4.15.5/swagger-ui-bundle.js\"></script>\n <script src=\"https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/4.15.5/swagger-ui-standalone-preset.js\"></script>\n <script>\n window.onload = function() {\n const ui = SwaggerUIBundle({\n url: \"${specUrl}\",\n dom_id: '#swagger-ui',\n deepLinking: true,\n presets: [\n SwaggerUIBundle.presets.apis,\n SwaggerUIStandalonePreset\n ],\n plugins: [\n SwaggerUIBundle.plugins.DownloadUrl\n ],\n layout: \"StandaloneLayout\",\n ...${swaggerOptions}\n })\n window.ui = ui\n }\n </script>\n </body>\n </html>\n `;\n }\n}\n","/**\n * CORS Middleware\n * Zero-dependency CORS implementation for Nural\n */\n\nimport type { ResolvedCorsConfig } from \"../types/middleware\";\n\n/**\n * CORS headers to apply to responses\n */\nexport interface CorsHeaders {\n \"Access-Control-Allow-Origin\": string;\n \"Access-Control-Allow-Methods\"?: string;\n \"Access-Control-Allow-Headers\"?: string;\n \"Access-Control-Allow-Credentials\"?: string;\n \"Access-Control-Expose-Headers\"?: string;\n \"Access-Control-Max-Age\"?: string;\n Vary?: string;\n}\n\n/**\n * Check if origin is allowed based on config\n */\nfunction isOriginAllowed(\n origin: string | undefined,\n config: ResolvedCorsConfig,\n): string | false {\n if (!origin) return false;\n\n const { origin: allowedOrigin } = config;\n\n // Allow all origins\n if (allowedOrigin === true || allowedOrigin === \"*\") {\n return config.credentials ? origin : \"*\";\n }\n\n // Single origin string\n if (typeof allowedOrigin === \"string\") {\n return origin === allowedOrigin ? origin : false;\n }\n\n // Array of origins\n if (Array.isArray(allowedOrigin)) {\n return allowedOrigin.includes(origin) ? origin : false;\n }\n\n // Function check\n if (typeof allowedOrigin === \"function\") {\n return allowedOrigin(origin) ? origin : false;\n }\n\n return false;\n}\n\n/**\n * Generate CORS headers for a request\n */\nexport function getCorsHeaders(\n requestOrigin: string | undefined,\n config: ResolvedCorsConfig,\n isPreflight: boolean = false,\n): CorsHeaders | null {\n const allowedOrigin = isOriginAllowed(requestOrigin, config);\n\n if (!allowedOrigin) {\n return null;\n }\n\n const headers: CorsHeaders = {\n \"Access-Control-Allow-Origin\": allowedOrigin,\n };\n\n // Add Vary header when origin is dynamic\n if (allowedOrigin !== \"*\") {\n headers[\"Vary\"] = \"Origin\";\n }\n\n // Credentials\n if (config.credentials) {\n headers[\"Access-Control-Allow-Credentials\"] = \"true\";\n }\n\n // Exposed headers\n if (config.exposedHeaders.length > 0) {\n headers[\"Access-Control-Expose-Headers\"] = config.exposedHeaders.join(\", \");\n }\n\n // Preflight-specific headers\n if (isPreflight) {\n headers[\"Access-Control-Allow-Methods\"] = config.methods.join(\", \");\n headers[\"Access-Control-Allow-Headers\"] = config.allowedHeaders.join(\", \");\n headers[\"Access-Control-Max-Age\"] = String(config.maxAge);\n }\n\n return headers;\n}\n\n/**\n * Handle CORS for Express\n */\nexport function applyCorsExpress(app: any, config: ResolvedCorsConfig): void {\n // Add CORS headers to all responses (including preflight)\n app.use((req: any, res: any, next: any) => {\n const origin = req.headers.origin;\n const isPreflight = req.method === \"OPTIONS\";\n const headers = getCorsHeaders(origin, config, isPreflight);\n\n if (headers) {\n Object.entries(headers).forEach(([key, value]) => {\n if (value) res.setHeader(key, value);\n });\n }\n\n // Handle preflight response\n if (isPreflight) {\n if (config.preflightContinue) {\n next();\n } else {\n res.status(config.optionsSuccessStatus).end();\n }\n return;\n }\n\n next();\n });\n}\n\n/**\n * Handle CORS for Fastify\n */\nexport function applyCorsFastify(app: any, config: ResolvedCorsConfig): void {\n // Add hook for all requests\n app.addHook(\"onRequest\", async (request: any, reply: any) => {\n const origin = request.headers.origin;\n const isPreflight = request.method === \"OPTIONS\";\n const headers = getCorsHeaders(origin, config, isPreflight);\n\n if (headers) {\n Object.entries(headers).forEach(([key, value]) => {\n if (value) reply.header(key, value);\n });\n }\n\n // Handle preflight\n if (isPreflight && !config.preflightContinue) {\n reply.status(config.optionsSuccessStatus).send();\n return;\n }\n });\n}\n","/**\n * Helmet Middleware\n * Zero-dependency security headers implementation for Nural\n */\n\nimport type { ResolvedHelmetConfig } from \"../types/middleware\";\n\n/**\n * Security headers to apply to responses\n */\nexport type SecurityHeaders = Record<string, string>;\n\n/**\n * Generate Content-Security-Policy header value\n */\nfunction buildCspHeader(directives: Record<string, string[]>): string {\n return Object.entries(directives)\n .map(([key, values]) => `${key} ${values.join(\" \")}`)\n .join(\"; \");\n}\n\n/**\n * Generate all security headers based on config\n */\nexport function getSecurityHeaders(\n config: ResolvedHelmetConfig,\n): SecurityHeaders {\n const headers: SecurityHeaders = {};\n\n // Content-Security-Policy\n if (\n typeof config.contentSecurityPolicy === \"object\" &&\n config.contentSecurityPolicy.directives\n ) {\n headers[\"Content-Security-Policy\"] = buildCspHeader(\n config.contentSecurityPolicy.directives,\n );\n }\n\n // Cross-Origin-Embedder-Policy\n if (config.crossOriginEmbedderPolicy) {\n headers[\"Cross-Origin-Embedder-Policy\"] = \"require-corp\";\n }\n\n // Cross-Origin-Opener-Policy\n if (config.crossOriginOpenerPolicy) {\n headers[\"Cross-Origin-Opener-Policy\"] =\n config.crossOriginOpenerPolicy.policy;\n }\n\n // Cross-Origin-Resource-Policy\n if (config.crossOriginResourcePolicy) {\n headers[\"Cross-Origin-Resource-Policy\"] =\n config.crossOriginResourcePolicy.policy;\n }\n\n // X-DNS-Prefetch-Control\n headers[\"X-DNS-Prefetch-Control\"] = config.dnsPrefetchControl.allow\n ? \"on\"\n : \"off\";\n\n // X-Frame-Options\n headers[\"X-Frame-Options\"] = config.frameguard.action.toUpperCase();\n\n // Strict-Transport-Security (HSTS)\n if (config.hsts) {\n let hstsValue = `max-age=${config.hsts.maxAge}`;\n if (config.hsts.includeSubDomains) {\n hstsValue += \"; includeSubDomains\";\n }\n if (config.hsts.preload) {\n hstsValue += \"; preload\";\n }\n headers[\"Strict-Transport-Security\"] = hstsValue;\n }\n\n // X-Content-Type-Options\n if (config.noSniff) {\n headers[\"X-Content-Type-Options\"] = \"nosniff\";\n }\n\n // X-Permitted-Cross-Domain-Policies\n headers[\"X-Permitted-Cross-Domain-Policies\"] =\n config.permittedCrossDomainPolicies.policy;\n\n // Referrer-Policy\n headers[\"Referrer-Policy\"] = config.referrerPolicy.policy;\n\n // X-XSS-Protection (legacy, but some still use it)\n if (config.xssFilter) {\n headers[\"X-XSS-Protection\"] = \"1; mode=block\";\n } else {\n headers[\"X-XSS-Protection\"] = \"0\";\n }\n\n return headers;\n}\n\n/**\n * Apply security headers for Express\n */\nexport function applyHelmetExpress(\n app: any,\n config: ResolvedHelmetConfig,\n): void {\n const headers = getSecurityHeaders(config);\n\n app.use((_req: any, res: any, next: any) => {\n Object.entries(headers).forEach(([key, value]) => {\n res.setHeader(key, value);\n });\n next();\n });\n}\n\n/**\n * Apply security headers for Fastify\n */\nexport function applyHelmetFastify(\n app: any,\n config: ResolvedHelmetConfig,\n): void {\n const headers = getSecurityHeaders(config);\n\n app.addHook(\"onRequest\", async (_request: any, reply: any) => {\n Object.entries(headers).forEach(([key, value]) => {\n reply.header(key, value);\n });\n });\n}\n","/**\n * Zero-Dependency Logger\n * Lightweight, colorful, and powerful logging system\n */\n\n// ANSI Color Codes\nconst colors = {\n reset: \"\\x1b[0m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n gray: \"\\x1b[90m\",\n};\n\nexport interface LoggerConfig {\n /** Enable/disable logging */\n enabled?: boolean;\n /** Minimum log level */\n minLevel?: \"log\" | \"error\" | \"warn\" | \"debug\";\n /** Show timestamp */\n timestamp?: boolean;\n}\n\n/**\n * Logger class for specialized context logging\n */\nexport class Logger {\n private context: string;\n private config: LoggerConfig;\n\n constructor(context: string = \"System\", config: LoggerConfig = {}) {\n this.context = context;\n this.config = { enabled: true, timestamp: true, ...config };\n }\n\n private getTimestamp() {\n if (!this.config.timestamp) return \"\";\n return new Date().toISOString();\n }\n\n private print(level: string, message: string, color: string) {\n if (this.config.enabled === false) return;\n\n const pid = process.pid;\n const timestamp = this.getTimestamp();\n const ctx = `[${colors.yellow}${this.context}${colors.reset}]`;\n\n // Format: [Nural] 1234 - 10/20/2025... [Context] Message\n process.stdout.write(\n `${colors.green}[Nural]${colors.reset} ${colors.gray}${pid}${colors.reset} - ` +\n `${timestamp} ${ctx} ${color}${message}${colors.reset}\\n`,\n );\n }\n\n log(message: string) {\n this.print(\"LOG\", message, colors.green);\n }\n\n error(message: string, trace?: string) {\n this.print(\"ERROR\", message, colors.red);\n if (trace) process.stderr.write(`${colors.red}${trace}${colors.reset}\\n`);\n }\n\n warn(message: string) {\n this.print(\"WARN\", message, colors.yellow);\n }\n\n debug(message: string) {\n this.print(\"DEBUG\", message, colors.magenta);\n }\n}\n","/**\n * HTTP Logger Middleware\n * Logs incoming requests with duration and status\n */\n\nimport { defineMiddleware } from \"../core/middleware\";\nimport { Logger } from \"../core/logger\";\n\n// Method Colors\nconst methodColors: Record<string, string> = {\n GET: \"\\x1b[32m\", // Green\n POST: \"\\x1b[33m\", // Yellow\n PUT: \"\\x1b[34m\", // Blue\n DELETE: \"\\x1b[31m\", // Red\n PATCH: \"\\x1b[35m\", // Magenta\n OPTIONS: \"\\x1b[90m\", // Gray\n HEAD: \"\\x1b[90m\", // Gray\n};\n\nconst resetColor = \"\\x1b[0m\";\n\nexport interface HttpLoggerOptions {\n /** Show user agent in logs */\n showUserAgent?: boolean;\n /** Show request duration in logs */\n showTime?: boolean;\n /** Custom logger context name */\n context?: string;\n}\n\n/**\n * Creates an HTTP logger middleware\n */\nexport const httpLogger = (options: HttpLoggerOptions = {}) => {\n const logger = new Logger(options.context || \"Router\");\n\n return (req: any, res: any, next?: () => void) => {\n const start = Date.now();\n\n // Handle both Express (res) and Fastify (res.raw)\n const rawRes = res.raw || res;\n\n // Hook into the 'finish' event (Standard Node.js Stream Event)\n rawRes.on(\"finish\", () => {\n const { method, url, headers } = req;\n const duration = Date.now() - start;\n const status = rawRes.statusCode;\n const userAgent = headers ? headers[\"user-agent\"] || \"-\" : \"-\";\n\n const methodColor = methodColors[method] || resetColor;\n const coloredMethod = `${methodColor}${method}${resetColor}`;\n\n let logMessage = `${coloredMethod} ${url} ${status}`;\n\n if (options.showTime !== false) {\n logMessage += ` +${duration}ms`;\n }\n\n if (options.showUserAgent) {\n logMessage += ` - ${userAgent}`;\n }\n\n // Color code based on status\n if (status >= 500) logger.error(logMessage);\n else if (status >= 400) logger.warn(logMessage);\n else logger.log(logMessage);\n });\n\n if (next) {\n next();\n }\n };\n};\n","/**\n * Nural Framework\n * Main application class that orchestrates adapters and documentation\n */\n\nimport type { ServerAdapter } from \"../adapters/base\";\nimport { ExpressAdapter } from \"../adapters/express\";\nimport { FastifyAdapter } from \"../adapters/fastify\";\nimport type { AnyRouteConfig } from \"../types/route\";\nimport type { NuralConfig, ResolvedDocsConfig } from \"../types/config\";\nimport { resolveDocsConfig } from \"../types/config\";\nimport type {\n ResolvedCorsConfig,\n ResolvedHelmetConfig,\n} from \"../types/middleware\";\nimport { resolveCorsConfig, resolveHelmetConfig } from \"../types/middleware\";\nimport type { ResolvedErrorHandlerConfig } from \"../types/error\";\nimport { resolveErrorHandlerConfig } from \"../types/error\";\nimport { DocumentationGenerator } from \"../docs/generator\";\nimport { applyCorsExpress, applyCorsFastify } from \"../middleware/cors\";\nimport { applyHelmetExpress, applyHelmetFastify } from \"../middleware/helmet\";\nimport { Logger } from \"./logger\";\nimport { httpLogger } from \"../middleware/http-logger\";\n\n/**\n * Nural - The intelligent, schema-first REST framework\n *\n * @example\n * ```typescript\n * const app = new Nural({\n * framework: 'express',\n * docs: true,\n * cors: true,\n * helmet: true,\n * errorHandler: true,\n * });\n * app.register([userRoute, healthRoute]);\n * app.start(3000);\n * ```\n */\nexport class Nural {\n private adapter: ServerAdapter;\n private docsGenerator: DocumentationGenerator;\n private docsConfig: ResolvedDocsConfig;\n private corsConfig: ResolvedCorsConfig | null;\n private helmetConfig: ResolvedHelmetConfig | null;\n private errorHandlerConfig: ResolvedErrorHandlerConfig;\n private isExpress: boolean;\n public logger: Logger;\n\n constructor(config: NuralConfig = {}) {\n this.docsConfig = resolveDocsConfig(config.docs);\n this.corsConfig = resolveCorsConfig(config.cors);\n this.helmetConfig = resolveHelmetConfig(config.helmet);\n this.errorHandlerConfig = resolveErrorHandlerConfig(config.errorHandler);\n this.docsGenerator = new DocumentationGenerator(this.docsConfig);\n\n // Initialize System Logger\n this.logger = new Logger(\"Nural\");\n\n // Select adapter based on framework config\n this.isExpress = config.framework !== \"fastify\";\n if (this.isExpress) {\n this.adapter = new ExpressAdapter(this.errorHandlerConfig);\n } else {\n this.adapter = new FastifyAdapter(this.errorHandlerConfig);\n }\n\n // Register HTTP Logger Middleware\n if (config.logger?.enabled !== false) {\n this.adapter.use(\n httpLogger({\n showUserAgent: config.logger?.showUserAgent,\n showTime: config.logger?.showTime ?? true,\n }),\n );\n }\n\n // Apply built-in middleware\n this.applyBuiltInMiddleware();\n }\n\n /**\n * Apply CORS and Helmet middleware based on config\n */\n private applyBuiltInMiddleware(): void {\n const app = this.adapter.app;\n\n if (this.isExpress) {\n // Apply Helmet first (security headers)\n if (this.helmetConfig) {\n applyHelmetExpress(app, this.helmetConfig);\n }\n // Apply CORS\n if (this.corsConfig) {\n applyCorsExpress(app, this.corsConfig);\n }\n } else {\n // Fastify\n if (this.helmetConfig) {\n applyHelmetFastify(app, this.helmetConfig);\n }\n if (this.corsConfig) {\n applyCorsFastify(app, this.corsConfig);\n }\n }\n }\n\n /**\n * Register routes with the application\n */\n register(routes: AnyRouteConfig[]): void {\n routes.forEach((route) => {\n this.adapter.registerRoute(route);\n if (this.docsConfig.enabled) {\n this.docsGenerator.addRoute(route);\n }\n });\n }\n\n /**\n * Start the server\n */\n start(port: number): void {\n if (this.docsConfig.enabled) {\n this.setupDocs();\n }\n\n this.adapter.listen(port, () => {\n console.log(`🚀 Nural Server running on port ${port}`);\n if (this.docsConfig.enabled) {\n console.log(\n `📚 Docs available at http://localhost:${port}${this.docsConfig.path}`,\n );\n }\n if (this.corsConfig) {\n console.log(`🔓 CORS enabled`);\n }\n if (this.helmetConfig) {\n console.log(`🛡️ Helmet security headers enabled`);\n }\n });\n }\n\n /**\n * Setup documentation routes\n */\n private setupDocs(): void {\n const specPath = `${this.docsConfig.path}/openapi.json`;\n\n this.adapter.registerStaticRoute(\"get\", specPath, async () => {\n return { type: \"json\", data: this.docsGenerator.generateSpec() };\n });\n\n this.adapter.registerStaticRoute(\"get\", this.docsConfig.path, async () => {\n const html =\n this.docsConfig.ui === \"swagger\"\n ? this.docsGenerator.getSwaggerHtml(specPath)\n : this.docsGenerator.getScalarHtml(specPath);\n\n return {\n type: \"html\",\n data: html,\n };\n });\n }\n}\n","/**\n * Route Helper\n */\n\nimport type { MiddlewareHandler } from \"./middleware\";\nimport type { ZodAny, RouteConfig } from \"../types/route\";\n\n/**\n * Create a type-safe route configuration\n *\n * @example\n * ```typescript\n * const userRoute = createRoute({\n * method: 'GET',\n * path: '/users/:id',\n * summary: 'Get User by ID',\n * request: { params: z.object({ id: z.string() }) },\n * responses: { 200: z.object({ id: z.string(), name: z.string() }) },\n * handler: async ({ params }) => {\n * return { id: params.id, name: 'Chetan' };\n * }\n * });\n * ```\n */\nexport function createRoute<\n P extends ZodAny = undefined,\n Q extends ZodAny = undefined,\n B extends ZodAny = undefined,\n R extends ZodAny = undefined,\n M extends MiddlewareHandler<any, any>[] | undefined = undefined,\n>(config: RouteConfig<P, Q, B, R, M>): RouteConfig<P, Q, B, R, M> {\n return config;\n}\n","/**\n * Middleware Types and Helpers\n */\n\n/**\n * Middleware handler function type\n * Returns data to be merged into route context\n */\nexport type MiddlewareHandler<Req = unknown, Res = unknown> = (\n req: Req,\n res: Res,\n) => Promise<Record<string, unknown> | void> | Record<string, unknown> | void;\n\n/**\n * Define a type-safe middleware\n *\n * @example\n * ```typescript\n * const authMiddleware = defineMiddleware(async (req: Request) => {\n * const token = req.headers.authorization;\n * if (!token) throw new Error('Unauthorized');\n * return { user: { id: '123', role: 'admin' } };\n * });\n * ```\n */\nexport function defineMiddleware<\n T extends Record<string, unknown> | void,\n Req = unknown,\n Res = unknown,\n>(fn: (req: Req, res: Res) => Promise<T> | T) {\n return fn;\n}\n","/**\n * Nural\n * The intelligent, schema-first REST framework for Node.js\n *\n * @packageDocumentation\n */\n\nimport { extendZodWithOpenApi } from \"@asteasolutions/zod-to-openapi\";\nimport { z } from \"zod\";\n\n// Initialize Zod OpenAPI extension (side effect)\nextendZodWithOpenApi(z);\n\n// Core exports\nexport { Nural } from \"./core\";\nexport { createRoute, defineMiddleware } from \"./core\";\nexport { Logger } from \"./core/logger\";\nexport type { LoggerConfig } from \"./core/logger\";\nexport * from \"./core/exceptions\";\n\n// Type exports\nexport type {\n HttpMethod,\n HttpStatusCode,\n NuralConfig,\n DocsConfig,\n CorsConfig,\n HelmetConfig,\n ErrorHandler,\n ErrorHandlerConfig,\n ErrorContext,\n RouteConfig,\n RouteContext,\n RouteHandler,\n AnyRouteConfig,\n} from \"./types\";\n\n// Re-export Zod for convenience\nexport { z } from \"zod\";\nexport { extendZodWithOpenApi } from \"@asteasolutions/zod-to-openapi\";\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nural",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "description": "The intelligent, schema-first REST framework for Node.js",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",