adorn-api 1.0.7 → 1.0.9

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../scripts/adorn-example.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * Adorn-API Example Runner\n * \n * Usage:\n * npx adorn-example <example-name>\n * npx adorn-example blog-platform\n * npx adorn-example task-manager\n * \n * Or from the adorn-api project root:\n * npm run example <example-name>\n */\n\nimport { execSync, spawn, ChildProcess } from \"child_process\";\nimport { dirname, join } from \"path\";\nimport { existsSync, readdirSync, statSync } from \"fs\";\nimport process from \"node:process\";\n\nconst __filename = process.cwd() + \"/index.js\";\nconst __dirname = dirname(__filename);\n\nfunction isWindows(): boolean {\n return process.platform === \"win32\";\n}\n\nfunction runCommand(command: string, cwd: string): void {\n const shell = isWindows() ? \"cmd.exe\" : \"/bin/bash\";\n execSync(command, { cwd, stdio: \"inherit\", shell });\n}\n\nfunction spawnCommand(args: string[], cwd: string): Promise<ChildProcess> {\n return new Promise((resolve, reject) => {\n const cmd = isWindows() ? \"npm.cmd\" : \"npm\";\n const child = spawn(cmd, args, {\n cwd,\n stdio: \"inherit\",\n shell: isWindows(),\n });\n\n child.on(\"error\", reject);\n resolve(child);\n });\n}\n\nfunction getExamples(): string[] {\n const examplesDir = join(__dirname, \"..\", \"examples\");\n if (!existsSync(examplesDir)) return [];\n return readdirSync(examplesDir).filter(name => {\n const path = join(examplesDir, name);\n return statSync(path).isDirectory();\n });\n}\n\nfunction printHelp(): void {\n console.log(`\nUsage: npx adorn-example <example-name>\n\nRun an adorn-api example with automatic dependency installation.\n\nExamples:\n npx adorn-example blog-platform\n npx adorn-example task-manager\n npx adorn-example basic\n\nAvailable examples:\n${getExamples().map(e => ` - ${e}`).join(\"\\n\")}\n\nOptions:\n -h, --help Show this help message\n -l, --list List all available examples\n\nFrom the adorn-api project root, you can also use:\n npm run example <example-name>\n`);\n}\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n \n if (args.includes(\"-h\") || args.includes(\"--help\")) {\n printHelp();\n process.exit(0);\n }\n\n if (args.includes(\"-l\") || args.includes(\"--list\")) {\n console.log(\"Available examples:\");\n getExamples().forEach(ex => console.log(` - ${ex}`));\n process.exit(0);\n }\n\n const example = args[0] || \"basic\";\n const examplePath = join(__dirname, \"..\", \"examples\", example);\n\n if (!existsSync(examplePath)) {\n console.error(`\\nāŒ Example \"${example}\" not found.\\n`);\n console.log(\"Available examples:\");\n getExamples().forEach(ex => console.log(` - ${ex}`));\n process.exit(1);\n }\n\n console.log(`\\nšŸš€ Running \"${example}\" example...\\n`);\n\n let child: ChildProcess | null = null;\n\n try {\n const nodeModulesPath = join(examplePath, \"node_modules\");\n const nodeModulesExists = existsSync(nodeModulesPath);\n\n if (!nodeModulesExists) {\n console.log(\"šŸ“¦ Installing dependencies...\");\n runCommand(\"npm install\", examplePath);\n }\n\n console.log(\"šŸ“¦ Building artifacts...\");\n runCommand(\"npm run build\", examplePath);\n\n console.log(\"🌐 Starting server...\\n\");\n console.log(\"Press Ctrl+C to stop\\n\");\n\n child = await spawnCommand([\"run\", \"dev\"], examplePath);\n\n process.on(\"SIGINT\", () => {\n if (child) child.kill(\"SIGINT\");\n });\n\n process.on(\"SIGTERM\", () => {\n if (child) child.kill(\"SIGTERM\");\n });\n\n await new Promise<void>((resolve, reject) => {\n if (!child) {\n reject(new Error(\"Child process not started\"));\n return;\n }\n child.on(\"exit\", (code) => {\n if (code === 0 || code === null) {\n resolve();\n } else {\n reject(new Error(`Process exited with code ${code}`));\n }\n });\n child.on(\"error\", reject);\n });\n } catch (err: any) {\n if (err.code !== \"SIGINT\" && err.code !== \"SIGTERM\") {\n console.error(`\\nāŒ Error: ${err.message}`);\n process.exit(1);\n }\n }\n}\n\nmain();\n"],"mappings":"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","names":["process"]}
1
+ {"version":3,"sources":["../../scripts/adorn-example.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * Adorn-API Example Runner\n * \n * Usage:\n * npx adorn-example <example-name>\n * npx adorn-example blog-platform\n * npx adorn-example task-manager\n * \n * Or from the adorn-api project root:\n * npm run example <example-name>\n */\n\nimport { execSync, spawn, ChildProcess } from \"child_process\";\nimport { dirname, join } from \"path\";\nimport { existsSync, readdirSync, statSync } from \"fs\";\nimport process from \"node:process\";\n\nfunction findRepoRoot(startDir: string): string | null {\n let current = startDir;\n while (true) {\n const examplesDir = join(current, \"examples\");\n const packageJson = join(current, \"package.json\");\n if (existsSync(examplesDir) && existsSync(packageJson)) {\n return current;\n }\n const parent = dirname(current);\n if (parent === current) {\n return null;\n }\n current = parent;\n }\n}\n\nfunction resolveRepoRoot(): string {\n const candidates = [process.env.INIT_CWD, process.cwd()].filter(\n (dir): dir is string => Boolean(dir),\n );\n\n for (const candidate of candidates) {\n const root = findRepoRoot(candidate);\n if (root) return root;\n }\n\n return process.cwd();\n}\n\nconst repoRoot = resolveRepoRoot();\n\nfunction isWindows(): boolean {\n return process.platform === \"win32\";\n}\n\nfunction runCommand(command: string, cwd: string): void {\n const shell = isWindows() ? \"cmd.exe\" : \"/bin/bash\";\n execSync(command, { cwd, stdio: \"inherit\", shell });\n}\n\nfunction spawnCommand(args: string[], cwd: string): Promise<ChildProcess> {\n return new Promise((resolve, reject) => {\n const cmd = isWindows() ? \"npm.cmd\" : \"npm\";\n const child = spawn(cmd, args, {\n cwd,\n stdio: \"inherit\",\n shell: isWindows(),\n });\n\n child.on(\"error\", reject);\n resolve(child);\n });\n}\n\nfunction getExamples(): string[] {\n const examplesDir = join(repoRoot, \"examples\");\n if (!existsSync(examplesDir)) return [];\n return readdirSync(examplesDir).filter(name => {\n const path = join(examplesDir, name);\n return statSync(path).isDirectory();\n });\n}\n\nfunction printHelp(): void {\n console.log(`\nUsage: npx adorn-example <example-name>\n\nRun an adorn-api example with automatic dependency installation.\n\nExamples:\n npx adorn-example blog-platform\n npx adorn-example task-manager\n npx adorn-example basic\n\nAvailable examples:\n${getExamples().map(e => ` - ${e}`).join(\"\\n\")}\n\nOptions:\n -h, --help Show this help message\n -l, --list List all available examples\n\nFrom the adorn-api project root, you can also use:\n npm run example <example-name>\n`);\n}\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n \n if (args.includes(\"-h\") || args.includes(\"--help\")) {\n printHelp();\n process.exit(0);\n }\n\n if (args.includes(\"-l\") || args.includes(\"--list\")) {\n console.log(\"Available examples:\");\n getExamples().forEach(ex => console.log(` - ${ex}`));\n process.exit(0);\n }\n\n const example = args[0] || \"basic\";\n const examplePath = join(repoRoot, \"examples\", example);\n\n if (!existsSync(examplePath)) {\n console.error(`\\nāŒ Example \"${example}\" not found.\\n`);\n console.log(\"Available examples:\");\n getExamples().forEach(ex => console.log(` - ${ex}`));\n process.exit(1);\n }\n\n console.log(`\\nšŸš€ Running \"${example}\" example...\\n`);\n\n let child: ChildProcess | null = null;\n\n try {\n const nodeModulesPath = join(examplePath, \"node_modules\");\n const nodeModulesExists = existsSync(nodeModulesPath);\n\n if (!nodeModulesExists) {\n console.log(\"šŸ“¦ Installing dependencies...\");\n runCommand(\"npm install\", examplePath);\n }\n\n console.log(\"šŸ“¦ Building artifacts...\");\n runCommand(\"npm run build\", examplePath);\n\n console.log(\"🌐 Starting server...\\n\");\n console.log(\"Press Ctrl+C to stop\\n\");\n\n child = await spawnCommand([\"run\", \"dev\"], examplePath);\n\n process.on(\"SIGINT\", () => {\n if (child) child.kill(\"SIGINT\");\n });\n\n process.on(\"SIGTERM\", () => {\n if (child) child.kill(\"SIGTERM\");\n });\n\n await new Promise<void>((resolve, reject) => {\n if (!child) {\n reject(new Error(\"Child process not started\"));\n return;\n }\n child.on(\"exit\", (code) => {\n if (code === 0 || code === null) {\n resolve();\n } else {\n reject(new Error(`Process exited with code ${code}`));\n }\n });\n child.on(\"error\", reject);\n });\n } catch (err: any) {\n if (err.code !== \"SIGINT\" && err.code !== \"SIGTERM\") {\n console.error(`\\nāŒ Error: ${err.message}`);\n process.exit(1);\n }\n }\n}\n\nmain();\n"],"mappings":"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","names":["process"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "adorn-api",
3
- "version": "1.0.7",
3
+ "version": "1.0.9",
4
4
  "description": "Stage-3 decorator-first OpenAPI + routing toolkit",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -51,8 +51,8 @@
51
51
  "build:js": "tsup src/index.ts src/express.ts src/cli.ts src/schema/index.ts src/metal/index.ts --format esm,cjs --out-dir dist --sourcemap --no-splitting && tsup scripts/adorn-example.ts --format cjs --out-dir dist/scripts --sourcemap --no-splitting",
52
52
  "build:types": "tsc -p tsconfig.build.json",
53
53
  "build": "npm run clean && npm run build:js && npm run build:types",
54
- "test": "npm run build && vitest run",
55
- "test:staleness": "npm run build && vitest run test/cache/staleness.test.ts",
54
+ "test": "vitest run",
55
+ "test:staleness": "vitest run test/cache/staleness.test.ts",
56
56
  "dev": "tsx src/cli.ts dev",
57
57
  "example": "tsx scripts/run-example.ts",
58
58
  "example:list": "tsx scripts/adorn-example.ts --list",
@@ -64,7 +64,7 @@
64
64
  "dependencies": {
65
65
  "ajv": "^8.17.1",
66
66
  "ajv-formats": "^3.0.1",
67
- "metal-orm": "^1.0.71",
67
+ "metal-orm": "^1.0.74",
68
68
  "swagger-ui-express": "^5.0.0",
69
69
  "typescript": "^5.9.0"
70
70
  },