@quyentran93/servercn-cli 1.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +74 -0
- package/dist/cli.js +2778 -0
- package/dist/cli.js.map +1 -0
- package/package.json +64 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/commands/add/index.ts","../src/lib/copy.ts","../src/utils/highlighter.ts","../src/utils/logger.ts","../src/utils/file.ts","../src/utils/normalize-eol.ts","../src/lib/merge-marker.ts","../src/lib/registry.ts","../src/lib/paths.ts","../src/utils/capitalize.ts","../package.json","../src/constants/app.constants.ts","../src/lib/registry-list.ts","../src/commands/list/list.handlers.ts","../src/lib/install-deps.ts","../src/lib/detect.ts","../src/utils/spinner.ts","../src/lib/package.ts","../src/lib/assert-initialized.ts","../src/lib/config.ts","../src/commands/add/add.handlers.ts","../src/utils/update-env.ts","../src/utils/tooling.ts","../src/commands/init.ts","../src/configs/ts.config.ts","../src/configs/commitlint.config.ts","../src/configs/prettier.config.ts","../src/configs/servercn.config.ts","../src/configs/gitignore.config.ts","../src/configs/eslint.config.ts","../src/commands/list/index.ts","../src/commands/_build/index.ts","../src/commands/_build/build.handlers.ts","../src/commands/doctor.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport { add } from \"@/commands/add\";\nimport { init } from \"@/commands/init\";\nimport type { Architecture, RegistryType } from \"@/types\";\nimport { LATEST_VERSION } from \"@/constants/app.constants\";\nimport { registryListCommands } from \"./commands/list\";\nimport { build, type buildTypeProps } from \"./commands/_build\";\nimport { doctor } from \"./commands/doctor\";\n\nconst program = new Command();\n\nprocess.on(\"SIGINT\", () => process.exit(0));\nprocess.on(\"SIGTERM\", () => process.exit(0));\n\nasync function main() {\n program\n .name(\"servercn-cli\")\n .description(\"Scaffold and manage backend components for Node.js projects\")\n .version(LATEST_VERSION, \"-v, --version\", \"output the current version\");\n\n program\n .command(\"init [foundation]\")\n .description(\"Initialize ServerCN in the current project\")\n .option(\"-f, --force\", \"Overwrite existing files if they exist\")\n .option(\"--fw <framework>\", \"Framework type: express or nestjs\", \"express\")\n .option(\n \"--local\",\n \"Add registry items from local environment(development runtime)\"\n )\n .action(init);\n\n registryListCommands(program);\n\n program\n .command(\"doctor\")\n .description(\n \"Print upgrade guidance and optional merge-marker checks for this project\"\n )\n .action(doctor);\n\n program\n .command(\"build\")\n .description(\"Build the project\")\n .option(\"--name <name>\", \"App name, website name\")\n .option(\"--url <url>\", \"App URL, website URL\")\n .action(async (options: buildTypeProps) => await build(options));\n\n program\n .command(\"add <components...>\")\n .description(\"Add one or more backend components to your project\")\n .option(\"--arch <arch>\", \"Project architecture: mvc or feature\", \"mvc\")\n .option(\"-f, --force\", \"Force overwrite existing files\")\n .option(\n \"--merge\",\n \"Merge merge-only fragments (// @servercn:begin/end <slug>) into existing files\"\n )\n .option(\n \"--local\",\n \"Add registry items from local environment(development runtime)\"\n )\n .action(\n async (\n components: string[],\n options: {\n arch: Architecture;\n force: boolean;\n merge: boolean;\n local: boolean;\n }\n ) => {\n let type: RegistryType = \"component\";\n let items = components;\n\n if ([\"schema\", \"sc\"].includes(components[0])) {\n type = \"schema\";\n items = components.slice(1).map(item => {\n return item;\n });\n } else if ([\"blueprint\", \"bp\"].includes(components[0])) {\n type = \"blueprint\";\n items = components.slice(1);\n } else if ([\"tooling\", \"tl\"].includes(components[0])) {\n type = \"tooling\";\n items = components.slice(1);\n }\n\n for (const item of items) {\n await add(item, {\n arch: options.arch,\n type: type,\n force: options.force,\n merge: options.merge,\n local: options.local\n });\n }\n }\n );\n\n program.parse(process.argv);\n}\n\nmain().catch(err => {\n console.error(err);\n process.exit(1);\n});\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport { cloneServercnRegistry, copyTemplate } from \"@/lib/copy\";\nimport { getRegistry } from \"@/lib/registry\";\nimport { installDependencies } from \"@/lib/install-deps\";\nimport { ensurePackageJson, ensureTsConfig } from \"@/lib/package\";\nimport { logger } from \"@/utils/logger\";\nimport { assertInitialized } from \"@/lib/assert-initialized\";\nimport { getServerCNConfig } from \"@/lib/config\";\nimport { paths } from \"@/lib/paths\";\nimport type {\n AddOptions,\n DatabaseType,\n FrameworkType,\n IServerCNConfig,\n OrmType,\n RegistryItem,\n RegistryMap,\n RegistryType,\n RuntimeType\n} from \"@/types\";\nimport { capitalize } from \"@/utils/capitalize\";\nimport { resolveTemplateResolution } from \"./add.handlers\";\nimport { spinner } from \"@/utils/spinner\";\nimport { execa } from \"execa\";\nimport { updateEnvKeys } from \"@/utils/update-env\";\nimport { getToolingChoices, getToolingDepsFromChoices } from \"@/utils/tooling\";\n\nexport async function add(registryItemName: string, options: AddOptions = {}) {\n await assertInitialized();\n validateInput(registryItemName);\n\n if (options.merge && options.force) {\n logger.warn(\"--merge is ignored when --force is set.\");\n }\n const effectiveMerge = Boolean(options.merge && !options.force);\n\n const config = await getServerCNConfig();\n validateStack(config);\n\n let toolingDeps;\n if ([\"blueprint\"].includes(options?.type || \"\")) {\n const toolingChoices = await getToolingChoices();\n toolingDeps = getToolingDepsFromChoices(toolingChoices);\n }\n\n const type: RegistryType = options.type ?? \"component\";\n const component = await getRegistry(registryItemName, type, options.local);\n\n validateCompatibility(component, config);\n\n const resolution = await resolveTemplateResolution({\n component,\n config,\n options,\n registryItemName\n });\n\n await scaffoldFiles({\n registryItemName,\n templatePath: resolution.templatePath,\n options: { ...options, merge: effectiveMerge },\n component,\n selectedProvider: resolution.selectedProvider\n });\n\n ensureProjectFiles();\n\n const { runtimeDeps, devDeps } = resolveDependencies({\n component,\n config,\n additionalRuntimeDeps: resolution.additionalRuntimeDeps,\n additionalDevDeps: resolution.additionalDevDeps\n });\n\n if (runtimeDeps.length > 0 || devDeps.length > 0) {\n await installDependencies({\n runtime: runtimeDeps,\n dev: [...toolingDeps || [], ...devDeps],\n cwd: process.cwd(),\n packageManager: config.project.packageManager\n });\n }\n\n await runPostInstallHooks({\n registryItemName,\n type,\n component,\n framework: config.stack.framework,\n runtime: config.stack.runtime,\n selectedProvider: resolution.selectedProvider ?? \"\",\n dbEngine: config.database?.engine as DatabaseType,\n dbAdapter: config.database?.adapter as OrmType\n });\n\n logger.break();\n logger.success(`${capitalize(type)}: ${component.slug} added successfully`);\n logger.break();\n}\n\n//? Input Validation\nfunction validateInput(name: string) {\n if (!name) {\n logger.error(\"Component name is required.\");\n process.exit(1);\n }\n}\n\n//? Stack Validation\nfunction validateStack(config: IServerCNConfig) {\n if (!config.stack.runtime || !config.stack.framework) {\n logger.error(\n \"Stack configuration is missing. Run `npx servercn-cli init` first.\"\n );\n process.exit(1);\n }\n}\n\n//? Compatibility Validation (Runtime-aware)\nfunction validateCompatibility(\n component: RegistryMap[RegistryType],\n config: IServerCNConfig\n) {\n if (\"runtimes\" in component) {\n const runtime = component.runtimes[config.stack.runtime];\n\n if (!runtime) {\n logger.error(\n `Runtime ${config.stack.runtime} is not supported by ${component.slug}`\n );\n process.exit(1);\n }\n\n const framework = runtime.frameworks[config.stack.framework];\n\n if (!framework) {\n logger.break();\n logger.error(\n `Unsupported framework '${config.stack.framework}' for component '${component.slug}'.`\n );\n logger.error(\n `This '${component.slug}' does not provide templates for the selected framework.`\n );\n logger.error(\n `Please choose one of the supported frameworks and try again.`\n );\n logger.break();\n process.exit(1);\n }\n }\n}\n\n//? Scaffolding Layer\nexport async function scaffoldFiles({\n registryItemName,\n templatePath,\n options,\n component,\n selectedProvider\n}: {\n registryItemName: string;\n templatePath: string;\n options: AddOptions;\n component: RegistryItem;\n selectedProvider?: string;\n}) {\n const IS_LOCAL = options.local ?? false;\n const targetDir = paths.targets(\".\");\n\n const spin = spinner(\"Scaffolding files...\")?.start();\n\n if (IS_LOCAL) {\n const templateDir = path.resolve(paths.templates(), templatePath);\n if (!(await fs.pathExists(templateDir))) {\n logger.error(\n `\\nTemplate not found: ${templateDir}\\nCheck your servercn configuration.\\n`\n );\n process.exit(1);\n }\n logger.break();\n\n await copyTemplate({\n templateDir,\n targetDir,\n registryItemName,\n conflict: options.force ? \"overwrite\" : \"skip\",\n merge: options.merge\n });\n } else {\n const ok = await cloneServercnRegistry({\n component,\n templatePath,\n targetDir,\n options,\n selectedProvider\n });\n if (!ok) {\n logger.error(\"\\nSomething went wrong. Failed to scaffold template\\n\");\n process.exit(1);\n }\n }\n\n logger.break();\n spin?.succeed(\"Scaffolding files successfully!\");\n}\n\n//? Project File Guards\nfunction ensureProjectFiles() {\n ensurePackageJson(process.cwd());\n ensureTsConfig(process.cwd());\n}\n\n//? Dependency Resolution\nfunction resolveDependencies({\n component,\n config,\n additionalDevDeps,\n additionalRuntimeDeps\n}: {\n component: RegistryItem;\n config: IServerCNConfig;\n additionalRuntimeDeps: string[];\n additionalDevDeps: string[];\n}) {\n // TOOLING (no runtimes)\n if (!(\"runtimes\" in component)) {\n return {\n runtimeDeps: [\n ...(component.dependencies?.runtime ?? []),\n ...additionalRuntimeDeps\n ],\n devDeps: [...(component.dependencies?.dev ?? []), ...additionalDevDeps]\n };\n }\n\n // RUNTIME-BASED ITEMS\n const framework =\n component.runtimes[config.stack.runtime].frameworks[config.stack.framework];\n\n return {\n runtimeDeps: [\n ...(framework && \"dependencies\" in framework\n ? (framework.dependencies?.runtime ?? [])\n : []),\n ...additionalRuntimeDeps\n ],\n devDeps: [\n ...(framework && \"dependencies\" in framework\n ? (framework?.dependencies?.dev ?? [])\n : []),\n ...additionalDevDeps\n ]\n };\n}\n\n//? Post Install Hooks\nasync function runPostInstallHooks({\n component,\n registryItemName,\n type,\n runtime,\n framework,\n selectedProvider,\n dbEngine,\n dbAdapter\n}: {\n registryItemName: string;\n selectedProvider: string;\n type: RegistryType;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any;\n runtime: RuntimeType;\n framework: FrameworkType;\n dbEngine: DatabaseType;\n dbAdapter: OrmType;\n}) {\n if (type === \"tooling\" && registryItemName === \"husky\") {\n try {\n await execa(\"npx\", [\"husky\", \"init\"], { stdio: \"inherit\" });\n } catch {\n logger.warn(\n \"Could not initialize husky automatically. Please run 'npx husky init' manually.\"\n );\n }\n } else {\n let filterEnvs: Array<string> = [];\n switch (type) {\n case \"component\":\n const registry = component?.runtimes[runtime]?.frameworks[framework];\n\n if (registry?.prompt) {\n filterEnvs = registry?.variants[selectedProvider]?.env?.filter(\n (env: string) => env !== \"\"\n );\n } else {\n filterEnvs = registry?.env?.filter((env: string) => env !== \"\");\n }\n\n break;\n\n case \"blueprint\":\n const registryBlueprint =\n component?.runtimes[runtime]?.frameworks[framework]?.databases[\n dbEngine\n ].orms[dbAdapter]?.env ?? [];\n filterEnvs = registryBlueprint?.filter((env: string) => env !== \"\");\n break;\n\n default:\n break;\n }\n\n if (filterEnvs?.length > 0) {\n updateEnvKeys({\n envFile: \".env.example\",\n envKeys: filterEnvs,\n label: registryItemName\n });\n updateEnvKeys({\n envFile: \".env\",\n envKeys: filterEnvs,\n label: registryItemName\n });\n }\n }\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport { logger } from \"@/utils/logger\";\nimport type { AddOptions, CopyOptions, RegistryItem } from \"@/types\";\nimport { findFilesByPath } from \"@/utils/file\";\nimport { normalizeEol } from \"@/utils/normalize-eol\";\nimport {\n applyMarkerMerge,\n isMergeOnlyFragment\n} from \"@/lib/merge-marker\";\n\n//? development mode\nexport async function copyTemplate({\n templateDir,\n targetDir,\n registryItemName,\n conflict = \"skip\",\n dryRun = false,\n merge = false\n}: CopyOptions) {\n await fs.ensureDir(targetDir);\n\n const entries = await fs.readdir(templateDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(templateDir, entry.name);\n\n const rawName = entry.name === \"_gitignore\" ? \".gitignore\" : entry.name;\n\n const finalName = rawName;\n const destPath = path.join(targetDir, finalName);\n const relativeDestPath = path.relative(process.cwd(), destPath);\n if (entry.isDirectory()) {\n await copyTemplate({\n templateDir: srcPath,\n targetDir: destPath,\n registryItemName,\n conflict,\n dryRun,\n merge\n });\n continue;\n }\n\n const exists = await fs.pathExists(destPath);\n\n if (exists) {\n if (conflict === \"skip\") {\n if (merge && registryItemName) {\n const peek = await fs.readFile(srcPath);\n if (!peek.includes(0)) {\n const srcText = normalizeEol(peek.toString(\"utf8\"));\n if (isMergeOnlyFragment(srcText, registryItemName)) {\n const destText = normalizeEol(\n await fs.readFile(destPath, \"utf8\")\n );\n const merged = applyMarkerMerge(\n destText,\n srcText,\n registryItemName\n );\n if (!merged.ok) {\n logger.error(\n `Merge failed for ${relativeDestPath}: destination is missing // @servercn:begin/end ${registryItemName} markers. Add them or use --force.`\n );\n process.exit(1);\n }\n if (!dryRun) {\n await fs.writeFile(destPath, merged.content, \"utf8\");\n logger.info(`MERGE: ${relativeDestPath}`);\n } else {\n logger.info(`[dry-run] merge: ${relativeDestPath}`);\n }\n continue;\n }\n }\n }\n logger.skip(relativeDestPath);\n continue;\n }\n if (conflict === \"error\") {\n throw new Error(`File already exists: ${relativeDestPath}`);\n }\n }\n\n if (dryRun) {\n logger.info(\n `[dry-run] ${exists ? \"overwrite\" : \"create\"}: ${relativeDestPath}`\n );\n continue;\n }\n\n const buffer = await fs.readFile(srcPath);\n const isBinary = buffer.includes(0);\n\n if (\n !exists &&\n !isBinary &&\n merge &&\n registryItemName &&\n isMergeOnlyFragment(normalizeEol(buffer.toString(\"utf8\")), registryItemName)\n ) {\n logger.muted(\n `SKIP (merge-only fragment, target missing): ${relativeDestPath}`\n );\n continue;\n }\n\n await fs.ensureDir(path.dirname(destPath));\n\n if (isBinary) {\n await fs.copyFile(srcPath, destPath);\n } else {\n const content = normalizeEol(buffer.toString(\"utf8\"));\n\n await fs.writeFile(destPath, content, \"utf8\");\n }\n\n if (exists) {\n logger.overwrite(relativeDestPath);\n } else {\n logger.create(relativeDestPath);\n }\n }\n}\n\n//? production mode\nexport async function cloneServercnRegistry({\n component,\n templatePath,\n targetDir,\n selectedProvider,\n options\n}: {\n component: RegistryItem;\n templatePath: string;\n targetDir: string;\n selectedProvider?: string;\n options: AddOptions;\n}): Promise<boolean> {\n logger.break();\n try {\n const files = findFilesByPath(component, templatePath, selectedProvider);\n if (!files || files.length === 0) {\n return false;\n }\n\n const slug =\n \"slug\" in component && typeof component.slug === \"string\"\n ? component.slug\n : \"\";\n\n const useMerge = Boolean(options.merge && !options.force && slug);\n\n for (const file of files) {\n const destPath = path.join(targetDir, file.path);\n const exists = await fs.pathExists(destPath);\n const templateContent = normalizeEol(file.content);\n\n if (options.force) {\n await fs.ensureDir(path.dirname(destPath));\n await fs.writeFile(destPath, templateContent, \"utf8\");\n if (exists) {\n logger.overwrite(file.path);\n } else {\n logger.create(file.path);\n }\n continue;\n }\n\n if (useMerge && isMergeOnlyFragment(templateContent, slug)) {\n if (!exists) {\n logger.muted(\n `SKIP (merge-only fragment, target missing): ${file.path}`\n );\n continue;\n }\n const destText = normalizeEol(await fs.readFile(destPath, \"utf8\"));\n const merged = applyMarkerMerge(destText, templateContent, slug);\n if (!merged.ok) {\n logger.error(\n `Merge failed for ${file.path}: destination is missing // @servercn:begin/end ${slug} markers. Add them or use --force.`\n );\n process.exit(1);\n }\n await fs.ensureDir(path.dirname(destPath));\n await fs.writeFile(destPath, merged.content, \"utf8\");\n logger.info(`MERGE: ${file.path}`);\n continue;\n }\n\n if (exists) {\n logger.skip(file.path);\n continue;\n }\n\n await fs.ensureDir(path.dirname(destPath));\n await fs.writeFile(destPath, templateContent, \"utf8\");\n logger.create(file.path);\n }\n return true;\n } catch {\n return false;\n }\n}\n","import kleur from \"kleur\";\n\nexport const highlighter = {\n error: kleur.red,\n warn: kleur.yellow,\n info: kleur.cyan,\n success: kleur.green,\n create: kleur.blue,\n mute: kleur.dim,\n magenta: kleur.magenta\n};\n","import { highlighter } from \"./highlighter\";\n\nexport const logger = {\n error(...args: unknown[]) {\n console.log(highlighter.error(args.join(\" \")));\n },\n warn(...args: unknown[]) {\n console.log(highlighter.warn(args.join(\" \")));\n },\n info(...args: unknown[]) {\n console.log(highlighter.info(args.join(\" \")));\n },\n success(...args: unknown[]) {\n console.log(highlighter.success(args.join(\" \")));\n },\n log(...args: unknown[]) {\n console.log(args.join(\" \"));\n },\n break() {\n console.log(\"\");\n },\n section: (title: string) => {\n console.log(\"\\n\" + title);\n },\n muted: (msg: string) => console.log(highlighter.mute(msg)),\n create: (msg: string) =>\n console.log(`${highlighter.create(\"CREATE:\")} ${msg}`),\n skip: (msg: string) =>\n console.log(`${highlighter.warn(\"SKIP:\")} ${msg} (exists)`),\n overwrite: (msg: string) =>\n console.log(`${highlighter.info(\"OVERWRITE:\")} ${msg}`)\n};\n","import type {\n Architecture,\n DatabaseType,\n FrameworkType,\n OrmType,\n RegistryItem\n} from \"@/types\";\n\n/**\n * Extracts files from a built registry item based on the template path.\n * The templatePath used in the handlers is runtime/framework/type/subpath.\n */\nexport function findFilesByPath(\n component: RegistryItem,\n templatePath: string,\n selectedProvider?: string\n):\n | {\n type: string;\n path: string;\n content: string;\n }[]\n | null {\n const parts = templatePath.split(\"/\");\n const [type] = parts;\n if (type === \"tooling\" && \"templates\" in component) {\n // For tooling, built JSON has templates[key].files\n const templates = component.templates as unknown as Record<\n string,\n { files: { type: string; path: string; content: string }[] }\n >;\n for (const tmpl of Object.values(templates || {})) {\n if (tmpl.files) return tmpl.files;\n }\n return null;\n } else {\n const [runtime, framework, type] = parts;\n const archKey = parts[parts.length - 1];\n if (!(\"runtimes\" in component)) return null;\n\n const runtimes = component.runtimes as unknown as Record<\n string,\n {\n frameworks: Record<\n FrameworkType,\n {\n architectures?: Record<\n Architecture,\n { files: { type: string; path: string; content: string }[] }\n >;\n variants?: Record<\n string,\n {\n architectures: Record<\n Architecture,\n { files: { type: string; path: string; content: string }[] }\n >;\n }\n >;\n databases?: Record<\n DatabaseType,\n {\n orms: Record<\n OrmType,\n {\n templates?: Record<\n string,\n {\n architectures: Record<\n Architecture,\n {\n files: {\n type: string;\n path: string;\n content: string;\n }[];\n }\n >;\n }\n >;\n architectures?: Record<\n Architecture,\n {\n files: {\n type: string;\n path: string;\n content: string;\n }[];\n }\n >;\n }\n >;\n }\n >;\n }\n >;\n }\n >;\n const fw = runtimes[runtime]?.frameworks?.[framework as FrameworkType];\n if (!fw) return null;\n\n // 1. Check direct architectures (Foundation/Simple component)\n if (fw.architectures && fw.architectures[archKey as Architecture]) {\n return fw.architectures[archKey as Architecture].files;\n }\n\n // 2. Check variants (Variant component)\n if (fw.variants && selectedProvider !== undefined) {\n return fw?.variants[selectedProvider as string]?.architectures[\n archKey as Architecture\n ].files;\n }\n\n // 3. Check databases/ORMs (Blueprint/Schema)\n if (fw.databases) {\n if (type === \"blueprint\") {\n const [, , , db, orm, arch] = parts;\n const database = fw.databases?.[db as DatabaseType];\n if (!database) return null;\n const ormConfig = database.orms?.[orm as OrmType];\n if (!ormConfig || !ormConfig.architectures) return null;\n\n const architecture = ormConfig.architectures?.[arch as Architecture];\n if (!architecture) return null;\n return architecture.files ?? null;\n } else if (type === \"schema\") {\n const [, , , db, orm, variant, arch] = parts;\n const database = fw.databases?.[db as DatabaseType];\n if (!database) return null;\n\n const ormConfig = database.orms?.[orm as OrmType];\n if (!ormConfig || !ormConfig.templates) return null;\n\n const template = ormConfig.templates?.[variant];\n if (!template) return null;\n\n const architecture = template.architectures?.[arch as Architecture];\n if (!architecture) return null;\n\n return architecture.files ?? null;\n }\n // }\n }\n\n return null;\n }\n}\n","/** Normalize text to LF for scaffolded files and embedded registry content. */\nexport function normalizeEol(content: string): string {\n return content.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n}\n","import { normalizeEol } from \"@/utils/normalize-eol\";\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nexport function markerBeginLine(slug: string): string {\n return `// @servercn:begin ${slug}`;\n}\n\nexport function markerEndLine(slug: string): string {\n return `// @servercn:end ${slug}`;\n}\n\n/**\n * True when the template file is only a begin/end pair for this slug (merge fragment).\n */\nexport function isMergeOnlyFragment(content: string, slug: string): boolean {\n const n = normalizeEol(content).trim();\n const begin = markerBeginLine(slug);\n const end = markerEndLine(slug);\n if (!n.startsWith(`${begin}\\n`) || !n.endsWith(end)) {\n return false;\n }\n const inner = n.slice(begin.length + 1, n.length - end.length).trimEnd();\n return !inner.includes(\"\\n// @servercn:begin \");\n}\n\n/**\n * Extract inner lines between servercn markers in template (trimmed body, no boundary lines).\n */\nexport function extractMarkerInner(\n content: string,\n slug: string\n): string | null {\n const n = normalizeEol(content).trim();\n const begin = markerBeginLine(slug);\n const end = markerEndLine(slug);\n const re = new RegExp(\n `^${escapeRegExp(begin)}\\\\s*\\\\n([\\\\s\\\\S]*?)\\\\n${escapeRegExp(end)}\\\\s*$`\n );\n const m = n.match(re);\n return m ? m[1] : null;\n}\n\nexport type MarkerMergeResult =\n | { ok: true; content: string }\n | { ok: false; reason: \"missing_marker_in_dest\" | \"missing_marker_in_template\" };\n\n/**\n * Replace the region between markers in `dest` with the inner region from `template`.\n * Both files must use the same slug in marker lines.\n */\nexport function applyMarkerMerge(\n dest: string,\n template: string,\n slug: string\n): MarkerMergeResult {\n const inner = extractMarkerInner(template, slug);\n if (inner === null) {\n return { ok: false, reason: \"missing_marker_in_template\" };\n }\n const normalizedDest = normalizeEol(dest);\n const begin = markerBeginLine(slug);\n const end = markerEndLine(slug);\n const blockRe = new RegExp(\n `${escapeRegExp(begin)}\\\\s*\\\\n([\\\\s\\\\S]*?)\\\\n${escapeRegExp(end)}`,\n \"m\"\n );\n if (!blockRe.test(normalizedDest)) {\n return { ok: false, reason: \"missing_marker_in_dest\" };\n }\n const next = normalizedDest.replace(\n blockRe,\n `${begin}\\n${inner}\\n${end}`\n );\n return { ok: true, content: next };\n}\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport { logger } from \"@/utils/logger\";\nimport { paths } from \"./paths\";\nimport type { RegistryMap } from \"@/types\";\nimport { capitalize } from \"@/utils/capitalize\";\nimport { getRegistryLists } from \"@/commands/list/list.handlers\";\n\nimport { SERVERCN_URL } from \"@/constants/app.constants\";\n\nexport async function getRegistry<T extends keyof RegistryMap>(\n name: string,\n type: T,\n local?: boolean\n): Promise<RegistryMap[T]> {\n const registryItemName = name.includes(\"/\")\n ? name.split(\"/\").shift() || name\n : name;\n\n if (local) {\n const registryPath = paths.localRegistry(type);\n\n if (!(await fs.pathExists(registryPath))) {\n logger.break();\n logger.error(\n \"Something went wrong. Please check the error below for more details.\"\n );\n logger.error(`\\nRegistry path not found`);\n logger.error(\"\\nCheck if the item name is correct.\");\n logger.break();\n process.exit(1);\n }\n\n const filePath = path.join(registryPath, `${registryItemName}.json`);\n\n if (!(await fs.pathExists(filePath))) {\n logger.break();\n logger.error(\n \"Something went wrong. Please check the error below for more details.\"\n );\n logger.error(`\\n${capitalize(type)} '${name}' not found!`);\n logger.break();\n\n await getRegistryLists(type);\n\n process.exit(1);\n }\n\n return fs.readJSON(filePath);\n } else {\n // Fetch from SERVERCN_URL\n const url = `${SERVERCN_URL}/sr/${type}/${registryItemName}.json`;\n try {\n const response = await fetch(url);\n if (!response.ok) {\n if (response.status === 404) {\n logger.error(\n `\\n${capitalize(type)} '${name}' not found in registry.\\n`\n );\n } else {\n logger.error(\n `\\nFailed to fetch registry item: ${response.statusText}`\n );\n }\n process.exit(1);\n }\n return (await response.json()) as RegistryMap[T];\n } catch {\n logger.error(`\\nFailed to fetch registry item\\n`);\n process.exit(1);\n }\n }\n}\n","import path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { RegistryType } from \"@/types\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nimport fs from \"node:fs\";\n\n/**\n * Resolves the monorepo root directory.\n * It searches upwards for a directory containing 'packages' and 'apps'.\n */\nexport function getMonorepoRoot() {\n let current = __dirname;\n while (current !== path.parse(current).root) {\n if (\n fs.existsSync(path.join(current, \"packages\")) &&\n fs.existsSync(path.join(current, \"apps\"))\n ) {\n return current;\n }\n current = path.join(current, \"..\");\n }\n // Fallback to current behavior if not found, but scaled correctly for bundled vs src\n return path.resolve(\n __dirname,\n __dirname.includes(\"dist\") ? \"../../\" : \"../../../../\"\n );\n}\n\nexport function resolveTargetDir(folderName: string) {\n const cwd = process.cwd();\n return path.join(cwd, folderName);\n}\n\nexport const paths = {\n root: getMonorepoRoot(),\n\n // Registry-build related paths\n registryBase: path.join(getMonorepoRoot(), \"packages/registry\"),\n templateBase: path.join(getMonorepoRoot(), \"packages/templates\"),\n outputBase: path.join(getMonorepoRoot(), \"apps/web/public/sr\"),\n\n localRegistry: (f?: RegistryType) =>\n path.join(getMonorepoRoot(), \"packages/registry\", f ? `${f}` : \"\"),\n remoteRegistry: path.join(\n getMonorepoRoot(),\n \"apps/web/public/sr\",\n \"index.json\"\n ),\n templates: () => path.join(getMonorepoRoot(), \"packages/templates\"),\n targets: (folderName: string) => resolveTargetDir(folderName)\n};\n","export function capitalize(name: string = \"\") {\n return (\n name?.split(\"\")[0]?.toUpperCase() +\n name.split(\"\")?.slice(1)?.join(\"\")?.toLowerCase()\n );\n}\n","{\n \"name\": \"@quyentran93/servercn-cli\",\n \"version\": \"1.1.10\",\n \"description\": \"Backend components CLI for Node.js & Typescript\",\n \"main\": \"dist/cli.js\",\n \"readme\": \"README.md\",\n \"bin\": {\n \"servercn\": \"dist/cli.js\"\n },\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"build\": \"tsup\",\n \"typecheck\": \"tsc --noEmit\",\n \"test:merge-marker\": \"tsx src/lib/merge-marker.selftest.ts\",\n \"prepublishOnly\": \"npm run build\",\n \"pub\": \"npm publish\"\n },\n \"keywords\": [\n \"servercn\",\n \"cli\",\n \"backend\",\n \"typescript\",\n \"node.js\",\n \"express\",\n \"nodejs\",\n \"scaffold\",\n \"boilerplate\",\n \"component\"\n ],\n \"author\": {\n \"name\": \"Akkal Dhami\",\n \"github\": \"https://github.com/QuyenTran93\",\n \"url\": \"https://x.com/AavashDhami2127\"\n },\n \"license\": \"MIT\",\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/QuyenTran93/servercn.git\",\n \"directory\": \"packages/cli\"\n },\n \"type\": \"module\",\n \"dependencies\": {\n \"cli-table3\": \"^0.6.5\",\n \"commander\": \"^14.0.2\",\n \"execa\": \"^9.6.1\",\n \"fs-extra\": \"^11.3.3\",\n \"glob\": \"^10.5.0\",\n \"kleur\": \"^3.0.3\",\n \"ora\": \"^9.3.0\",\n \"prompts\": \"^2.4.2\"\n },\n \"devDependencies\": {\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/node\": \"^25.0.3\",\n \"@types/prompts\": \"^2.4.9\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.21.0\",\n \"typescript\": \"^5.9.3\"\n }\n}\n","import packageJson from \"../../package.json\";\n\n//? For local development\n// export const SERVERCN_URL = \"http://localhost:3000\";\n\nexport const SERVERCN_URL = \"https://servercn.vercel.app\";\n\nexport const SERVERCN_CONFIG_FILE = \"servercn.config.json\" as const;\n\nexport const APP_NAME = \"servercn\";\n\nexport const LATEST_VERSION = packageJson.version || \"1.0.0\";\n\nexport const RuntimeList = [\"node\"] as const;\n\nexport const FrameworkList = [\"express\", \"nestjs\"] as const;\n\nexport const LanguageList = [\"typescript\"] as const;\n\nexport const ArchitectureList = [\"mvc\", \"feature\", \"modular\"] as const;\n\nexport const DatabaseList = [\"mongodb\", \"postgresql\", \"mysql\"] as const;\n\nexport const OrmList = [\"mongoose\", \"drizzle\", \"prisma\"] as const;\n\nexport const RegistryTypeList = [\n \"component\",\n \"blueprint\",\n \"schema\",\n \"foundation\",\n \"tooling\"\n] as const;\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport { paths } from \"./paths\";\nimport type { RegistryData, RegistryType } from \"@/types\";\nimport { SERVERCN_URL } from \"@/constants/app.constants\";\nimport { logger } from \"@/utils/logger\";\nimport { capitalize } from \"@/utils/capitalize\";\n\nexport async function loadRegistryItems(\n type: RegistryType,\n local: boolean = false\n) {\n if (local) {\n const registryDir = paths.localRegistry(type);\n const files = await fs.readdir(registryDir);\n\n const items: { slug: string }[] = [];\n\n for (const file of files) {\n let nestedFiles: string[] = [];\n if (!file.endsWith(\".json\")) {\n nestedFiles = await fs.readdir(path.join(registryDir, file));\n for (const nestedFile of nestedFiles) {\n if (!nestedFile.endsWith(\".json\")) continue;\n const fullPath = path.join(registryDir, file, nestedFile);\n const data = await fs.readJSON(fullPath);\n items.push(data);\n }\n } else {\n const fullPath = path.join(registryDir, file);\n const data = await fs.readJSON(fullPath);\n items.push(data);\n }\n }\n\n const mappedItems: RegistryData[] = items.map((item: { slug: string }) => {\n return {\n slug: item.slug,\n type\n };\n });\n\n return mappedItems;\n } else {\n const url = `${SERVERCN_URL}/sr/index.json`;\n\n try {\n const response = await fetch(url);\n if (!response.ok) {\n if (response.status === 404) {\n logger.error(`\\n${capitalize(type)} not found in registry.\\n`);\n } else {\n logger.error(\n `\\nFailed to fetch registry item: ${response.statusText}`\n );\n }\n process.exit(1);\n }\n const data: { items: RegistryData[] } = await response.json();\n const mappedItems = data.items.filter(item => item.type === type);\n return mappedItems;\n } catch {\n logger.error(`\\nFailed to fetch registry item\\n`);\n process.exit(1);\n }\n }\n}\n","import { SERVERCN_URL } from \"@/constants/app.constants\";\nimport { loadRegistryItems } from \"@/lib/registry-list\";\n\nimport type { RegistryData, RegistryType } from \"@/types\";\nimport { highlighter } from \"@/utils/highlighter\";\nimport { logger } from \"@/utils/logger\";\n\nimport Table from \"cli-table3\";\n\nexport type listOptionType = {\n json?: boolean;\n all?: boolean;\n local?: boolean;\n};\n\ntype listOverviewType = {\n command: string;\n types: {\n type: RegistryType;\n alias: \"cp\" | \"bp\" | \"tl\" | \"sc\" | \"fd\";\n total: number;\n command: string;\n }[];\n};\n\nexport async function listOverview(options: listOptionType) {\n const components = await loadRegistryItems(\"component\", options.local);\n const blueprints = await loadRegistryItems(\"blueprint\", options.local);\n const foundations = await loadRegistryItems(\"foundation\", options.local);\n const toolings = await loadRegistryItems(\"tooling\", options.local);\n const schemas = await loadRegistryItems(\"schema\", options.local);\n\n if (options.all) {\n return await getRegistryLists(\"blueprint\", options);\n }\n\n const data: listOverviewType = {\n command: \"npx servercn-cli list <type>\",\n types: [\n {\n type: \"component\",\n alias: \"cp\",\n total: components.length,\n command: \"npx servercn-cli list cp\"\n },\n {\n type: \"blueprint\",\n alias: \"bp\",\n total: blueprints.length,\n command: \"npx servercn-cli list bp\"\n },\n {\n type: \"foundation\",\n alias: \"fd\",\n total: foundations.length,\n command: \"npx servercn-cli list fd\"\n },\n {\n type: \"tooling\",\n alias: \"tl\",\n total: toolings.length,\n command: \"npx servercn-cli list tl\"\n },\n {\n type: \"schema\",\n alias: \"sc\",\n total: schemas.length,\n command: \"npx servercn-cli list sc\"\n }\n ]\n };\n\n const table = new Table({\n head: [\n highlighter.error(\"type\"),\n highlighter.error(\"total\"),\n highlighter.error(\"alias\"),\n highlighter.error(\"command\")\n ],\n colWidths: [12, 8, 8, 28]\n });\n data.types.forEach(type => {\n table.push([\n highlighter.create(type.type),\n type.total,\n highlighter.warn(type.alias),\n highlighter.info(type.command)\n ]);\n });\n\n if (options?.json) {\n logger.break();\n process.stdout.write(JSON.stringify(data, null, 2));\n logger.break();\n return;\n }\n logger.break();\n logger.log(table.toString());\n logger.log(`\n ${highlighter.create(\"Explore:\")}\n npx servercn-cli ls <type | alias>\n npx servercn-cli ls <type | alias> --json\n\n ${highlighter.create(\"Examples:\")}\n npx servercn-cli ls component\n npx servercn-cli ls cp\n npx servercn-cli ls foundation\n npx servercn-cli ls fd --json\n npx servercn-cli ls schema\n npx servercn-cli ls sc --json\n`);\n logger.break();\n}\n\ntype listRegistryDataType = {\n type: RegistryType;\n command: string;\n total: number;\n alias?: \"cp\" | \"bp\" | \"fd\" | \"tl\" | \"sc\";\n items: {\n name: string;\n command: string;\n frameworks?: string[];\n }[];\n};\n\nexport async function listComponents(options: listOptionType) {\n const components: RegistryData[] = await loadRegistryItems(\n \"component\",\n options.local\n );\n const data = {\n type: \"component\",\n command: `npx servercn-cli add <component-name>`,\n total: components.length,\n items: components.map(c => ({\n name: c.slug,\n command: `npx servercn-cli add ${c.slug}`,\n ...(c?.frameworks &&\n c.frameworks.length > 0 && { framework: c.frameworks })\n }))\n } satisfies listRegistryDataType;\n\n if (options?.json) {\n process.stdout.write(JSON.stringify(data, null, 2));\n logger.break();\n return;\n }\n\n const table = new Table({\n head: [\n highlighter.create(\"s.no\"),\n highlighter.create(\"name\"),\n highlighter.create(\"command\"),\n highlighter.create(\"frameworks\")\n ],\n colWidths: [6, 26, 46, 26]\n });\n logger.break();\n logger.log(highlighter.create(\"Available Component\"));\n components.map((c, i) => {\n table.push([\n i + 1,\n c.slug,\n `npx servercn-cli add ${c.slug}`,\n (c?.frameworks && c.frameworks.join(\", \")) || \"\"\n ]);\n });\n logger.log(table.toString());\n logger.info(` Learn more: ${SERVERCN_URL}/components`);\n logger.break();\n}\n\nexport async function listFoundations(options: listOptionType) {\n const foundations = await loadRegistryItems(\"foundation\", options.local);\n\n const data = {\n type: \"foundation\",\n command: `npx servercn-cli init <foundation-name>`,\n total: foundations.length,\n items: foundations\n .sort((a, b) => a.slug.localeCompare(b.slug))\n .map(c => ({\n name: c.slug,\n command: `npx servercn-cli init ${c.slug}`,\n ...(c?.frameworks &&\n c.frameworks.length > 0 && { frameworks: c.frameworks })\n }))\n } satisfies listRegistryDataType;\n\n if (options?.json) {\n process.stdout.write(JSON.stringify(data, null, 2));\n logger.break();\n return;\n }\n\n const table = new Table({\n head: [\n highlighter.create(\"s.no\"),\n highlighter.create(\"name\"),\n highlighter.create(\"command\"),\n highlighter.create(\"frameworks\")\n ],\n colWidths: [6, 26, 46, 26]\n });\n\n logger.break();\n logger.log(highlighter.create(\"Available Foundation\"));\n foundations.map((c, i) => {\n table.push([\n i + 1,\n c.slug,\n `npx servercn-cli init ${c.slug}`,\n (c?.frameworks && c.frameworks.join(\", \")) || \"\"\n ]);\n });\n logger.log(table.toString());\n logger.info(`Learn more: ${SERVERCN_URL}/foundations`);\n logger.break();\n}\n\nexport async function listTooling(options: listOptionType) {\n const toolings = await loadRegistryItems(\"tooling\", options.local);\n\n const data = {\n type: \"tooling\",\n alias: \"tl\",\n command: `npx servercn-cli add tooling <tooling-name>`,\n total: toolings.length,\n items: toolings.map(c => ({\n name: c.slug,\n command: `npx servercn-cli add tl ${c.slug}`\n }))\n } satisfies listRegistryDataType;\n\n if (options?.json) {\n process.stdout.write(JSON.stringify(data, null, 2));\n logger.break();\n return;\n }\n\n const table = new Table({\n head: [\n highlighter.create(\"s.no\"),\n highlighter.create(\"name\"),\n highlighter.create(\"command\")\n ],\n colWidths: [6, 26, 46]\n });\n\n logger.break();\n logger.log(highlighter.create(\"Available Tooling\"));\n toolings.map((c, i) => {\n table.push([i + 1, c.slug, `npx servercn-cli add tl ${c.slug}`]);\n });\n logger.log(table.toString());\n logger.info(`Learn more: ${SERVERCN_URL}/docs`);\n logger.break();\n}\n\nexport async function listSchemas(options: listOptionType) {\n const schemas = await loadRegistryItems(\"schema\", options.local);\n\n const data = {\n type: \"schema\",\n alias: \"sc\",\n command: `npx servercn-cli add schema <schema-name>`,\n total: schemas.length,\n items: schemas\n .sort((a, b) => a.slug.localeCompare(b.slug))\n .map(c => ({\n name: c.slug,\n command: `npx servercn-cli add sc ${c.slug}`,\n ...(c?.frameworks &&\n c.frameworks.length > 0 && { frameworks: c.frameworks })\n }))\n } satisfies listRegistryDataType;\n\n if (options?.json) {\n process.stdout.write(JSON.stringify(data, null, 2));\n logger.break();\n return;\n }\n\n const table = new Table({\n head: [\n highlighter.create(\"s.no\"),\n highlighter.create(\"name\"),\n highlighter.create(\"command\"),\n highlighter.create(\"frameworks\")\n ],\n colWidths: [6, 26, 46, 26]\n });\n\n logger.break();\n logger.log(highlighter.create(\"Available Schemas\"));\n schemas.map((c, i) => {\n table.push([\n i + 1,\n c.slug,\n `npx servercn-cli add sc ${c.slug}`,\n (c?.frameworks && c.frameworks.join(\", \")) || \"\"\n ]);\n });\n logger.log(table.toString());\n\n logger.info(`Learn more: ${SERVERCN_URL}/schemas`);\n logger.break();\n}\n\nexport async function listBlueprints(options: listOptionType) {\n const blueprints = await loadRegistryItems(\"blueprint\", options.local);\n const data = {\n type: \"blueprint\",\n alias: \"bp\",\n command: `npx servercn-cli add blueprint <blueprint-name>`,\n total: blueprints.length,\n items: blueprints.map(c => ({\n name: c.slug,\n command: `npx servercn-cli add bp ${c.slug}`,\n ...(c?.frameworks &&\n c.frameworks.length > 0 && { frameworks: c.frameworks })\n }))\n } satisfies listRegistryDataType;\n\n if (options?.json) {\n process.stdout.write(JSON.stringify(data, null, 2));\n logger.break();\n return;\n }\n\n const table = new Table({\n head: [\n highlighter.create(\"s.no\"),\n highlighter.create(\"name\"),\n highlighter.create(\"command\"),\n highlighter.create(\"frameworks\")\n ],\n colWidths: [6, 26, 46, 26]\n });\n\n logger.break();\n logger.log(highlighter.create(\"Available Blueprints\"));\n blueprints.map((c, i) => {\n table.push([\n i + 1,\n c.slug,\n `npx servercn-cli add bp ${c.slug}`,\n (c?.frameworks && c.frameworks.join(\", \")) || \"\"\n ]);\n });\n logger.log(table.toString());\n logger.info(`Learn more: ${SERVERCN_URL}/blueprints`);\n logger.break();\n}\n\nexport async function getRegistryLists(\n type: RegistryType,\n options?: listOptionType\n) {\n if (options?.all && options.json) {\n await listComponents({ json: true, local: options.local });\n await listSchemas({ json: true, local: options.local });\n await listBlueprints({ json: true, local: options.local });\n await listTooling({ json: true, local: options.local });\n await listFoundations({ json: true, local: options.local });\n } else if (options?.all) {\n await listComponents({ json: false, local: options.local });\n await listSchemas({ json: false, local: options.local });\n await listBlueprints({ json: false, local: options.local });\n await listTooling({ json: false, local: options.local });\n await listFoundations({ json: false, local: options.local });\n } else {\n switch (type) {\n case \"component\":\n return await listComponents(options ?? { json: false });\n case \"blueprint\":\n return await listBlueprints(options ?? { json: false });\n case \"schema\":\n return await listSchemas(options ?? { json: false });\n case \"tooling\":\n return listTooling(options ?? { json: false });\n case \"foundation\":\n return await listFoundations(options ?? { json: false });\n\n default:\n return await listComponents(options ?? { json: false });\n }\n }\n}\n","import { execa } from \"execa\";\nimport { detectPackageManager } from \"./detect\";\nimport { logger } from \"@/utils/logger\";\nimport type { InstallOptions } from \"@/types\";\nimport { spinner } from \"@/utils/spinner\";\n\nconst clean = (arr: string[]) =>\n arr.filter(dep => typeof dep === \"string\" && dep.trim().length > 0);\n\nexport async function installDependencies({\n runtime = [],\n dev = [],\n cwd,\n packageManager\n}: InstallOptions) {\n const runtimeDeps = clean(runtime);\n const devDeps = clean(dev);\n\n if (runtimeDeps.length === 0 && devDeps.length === 0) return;\n\n if (runtimeDeps.length > 0) {\n logger.log(\"\\nInstalling dependencies:\");\n runtimeDeps.forEach(dep => logger.info(`- ${dep}`));\n }\n\n if (devDeps.length > 0) {\n logger.log(\"\\nInstalling devDependencies:\");\n devDeps.forEach(dep => logger.info(`- ${dep}`));\n }\n\n if (runtimeDeps.length > 0 || devDeps.length > 0) {\n logger.break();\n }\n const pm = packageManager ?? detectPackageManager();\n\n const run = async (packages: string[], isDev: boolean) => {\n const label = isDev ? \"devDependencies\" : \"dependencies\";\n\n if (packages.length === 0) return;\n\n const spin = spinner(`Installing ${label} with ${pm}`)?.start();\n\n try {\n await execa(pm, getInstallArgs(pm, packages, isDev), {\n cwd,\n stdio: \"pipe\"\n });\n\n spin?.succeed(`Successfully installed ${packages.length} ${label}`);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n spin?.fail(`Failed to install ${label}`);\n logger.error(error.stderr || error.message);\n throw error;\n }\n };\n\n await run(runtimeDeps, false);\n logger.break();\n await run(devDeps, true);\n}\n\nfunction getInstallArgs(\n pm: string,\n packages: string[],\n isDev: boolean\n): string[] {\n switch (pm) {\n case \"pnpm\":\n return [\"add\", ...(isDev ? [\"-D\"] : []), ...packages];\n\n case \"yarn\":\n return [\"add\", ...(isDev ? [\"-D\"] : []), ...packages];\n\n case \"bun\":\n return [\"add\", ...(isDev ? [\"-d\"] : []), ...packages];\n\n case \"npm\":\n default:\n return [\"install\", ...(isDev ? [\"--save-dev\"] : []), ...packages];\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { PackageManager } from \"@/types\";\n\nexport function detectPackageManager(cwd = process.cwd()): PackageManager {\n if (fs.existsSync(path.join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (fs.existsSync(path.join(cwd, \"yarn.lock\"))) return \"yarn\";\n if (fs.existsSync(path.join(cwd, \"bun.lock\"))) return \"bun\";\n return \"npm\";\n}\n","import ora, { type Options } from \"ora\";\n\nexport function spinner(\n text: Options[\"text\"],\n options?: {\n silent?: boolean;\n }\n) {\n return ora({\n text,\n isSilent: options?.silent\n });\n}\n","import fs from \"node:fs\";\nimport path from \"path\";\nimport { execSync } from \"child_process\";\nimport { logger } from \"@/utils/logger\";\n\nexport function ensurePackageJson(dir: string) {\n const pkgPath = path.join(dir, \"package.json\");\n\n if (fs.existsSync(pkgPath)) return;\n\n logger.info(\"Initializing package.json\");\n\n execSync(\"npm init -y\", {\n cwd: dir,\n stdio: \"ignore\"\n });\n}\n\nexport function ensureTsConfig(dir: string) {\n const tsconfigPath = path.join(dir, \"tsconfig.json\");\n\n if (fs.existsSync(tsconfigPath)) return;\n\n const tsConfig = {\n compilerOptions: {\n target: \"ES2021\",\n module: \"es2022\",\n moduleResolution: \"bundler\",\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n outDir: \"dist\",\n rootDir: \"src\",\n sourceMap: true,\n alwaysStrict: true,\n useUnknownInCatchVariables: true,\n forceConsistentCasingInFileNames: true,\n paths: {\n \"@/*\": [\"./src/*\"]\n }\n },\n include: [\"src/**/*\"],\n exclude: [\"node_modules\"]\n };\n fs.writeFileSync(tsconfigPath, JSON.stringify(tsConfig, null, 2));\n}\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport { logger } from \"@/utils/logger\";\nimport {\n APP_NAME,\n SERVERCN_CONFIG_FILE,\n SERVERCN_URL\n} from \"@/constants/app.constants\";\nimport { highlighter } from \"@/utils/highlighter\";\n\nexport async function assertInitialized() {\n const configPath = path.resolve(process.cwd(), SERVERCN_CONFIG_FILE);\n\n if (!(await fs.pathExists(configPath))) {\n logger.break();\n logger.error(`${APP_NAME} is not initialized in this project.`);\n logger.break();\n logger.log(\"Run the following command first:\");\n logger.log(`> ${highlighter.create(\"npx servercn-cli init\")}`);\n logger.break();\n logger.log(\n `For express starter:\\n> ${highlighter.create(\"npx servercn-cli init express-server\")}`\n );\n logger.break();\n logger.log(\n `For (express + mongoose) starter:\\n> ${highlighter.create(\"npx servercn-cli init mongoose-starter\")}`\n );\n logger.break();\n logger.log(\n `For (drizzle + mysql) starter:\\n> ${highlighter.create(\"npx servercn-cli init drizzle-mysql-starter\")}`\n );\n logger.break();\n logger.log(\n `For (drizzle + postgresql) starter:\\n> ${highlighter.create(\"npx servercn-cli init drizzle-pg-starter\")}`\n );\n logger.break();\n\n logger.info(`Visit ${SERVERCN_URL}/docs/installation for more information`);\n logger.break();\n process.exit(1);\n }\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport { logger } from \"@/utils/logger\";\nimport type { DatabaseConfig, IServerCNConfig } from \"@/types\";\nimport { SERVERCN_CONFIG_FILE } from \"@/constants/app.constants\";\n\nexport async function getServerCNConfig(): Promise<IServerCNConfig> {\n const cwd = process.cwd();\n const configPath = path.resolve(cwd, SERVERCN_CONFIG_FILE);\n\n if (!(await fs.pathExists(configPath))) {\n logger.warn(\n \"\\nServerCN is not initialized. Run `npx servercn-cli init` first.\\n\"\n );\n process.exit(1);\n }\n\n return fs.readJSON(configPath);\n}\n\nexport function getDatabaseConfig(foundation: string): DatabaseConfig | null {\n switch (foundation) {\n case \"mongoose-starter\":\n return {\n engine: \"mongodb\",\n adapter: \"mongoose\"\n };\n case \"drizzle-mysql-starter\":\n return {\n engine: \"mysql\",\n adapter: \"drizzle\"\n };\n case \"drizzle-pg-starter\":\n return {\n engine: \"postgresql\",\n adapter: \"drizzle\"\n };\n case \"prisma-mongodb-starter\":\n return {\n engine: \"mongodb\",\n adapter: \"prisma\"\n };\n default:\n return null;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport prompts from \"prompts\";\nimport { logger } from \"@/utils/logger\";\nimport type {\n AddOptions,\n Architecture,\n DatabaseType,\n DependencySet,\n FrameworkType,\n IServerCNConfig,\n OrmType,\n RegistryComponent,\n RegistrySchema,\n RegistryType,\n RuntimeType,\n SchemaFramework\n} from \"@/types\";\n\nexport async function resolveTemplateResolution({\n registryItemName,\n component,\n config,\n options\n}: {\n registryItemName: string;\n component: any;\n config: IServerCNConfig;\n options: AddOptions;\n}): Promise<{\n templatePath: string;\n additionalRuntimeDeps: string[];\n additionalDevDeps: string[];\n selectedProvider?: string;\n}> {\n const type: RegistryType = options.type || \"component\";\n const framework = config.stack.framework;\n const architecture = config.stack.architecture;\n const runtime = config.stack.runtime;\n\n const isBuilt = !options.local;\n\n if (type === \"tooling\") {\n const selectedPath = registryItemName;\n return {\n templatePath: `tooling/${selectedPath}/base`,\n additionalRuntimeDeps: [],\n additionalDevDeps: []\n };\n }\n\n const templateConfig = component.runtimes?.[runtime]?.frameworks?.[framework];\n\n if (!templateConfig) {\n logger.break();\n logger.error(\n `Unsupported framework '${framework}' for ${type}: '${component.slug}'.`\n );\n logger.error(\n `This ${type} does not provide templates for the selected framework.`\n );\n logger.break();\n process.exit(1);\n }\n\n // Handle variants\n if (templateConfig.variants) {\n return resolvePromptVariants({\n component,\n runtime,\n architecture,\n framework,\n type,\n isBuilt\n });\n }\n\n let selectedSubPath: string | undefined;\n\n switch (type) {\n case \"component\":\n case \"foundation\":\n if (isBuilt) {\n if (templateConfig.architectures?.[architecture]) {\n selectedSubPath = architecture;\n }\n } else {\n const haveTemplates = templateConfig.templates;\n selectedSubPath =\n typeof templateConfig === \"string\"\n ? templateConfig\n : haveTemplates?.[architecture];\n }\n break;\n\n case \"schema\":\n case \"blueprint\":\n selectedSubPath = resolveDatabaseTemplate({\n templateConfig,\n config,\n architecture,\n options,\n registryItemName:\n type === \"blueprint\" ? component.slug : registryItemName\n });\n break;\n\n default:\n if (!isBuilt) {\n const haveTemplates = templateConfig.templates;\n selectedSubPath =\n typeof templateConfig === \"string\"\n ? templateConfig\n : haveTemplates && templateConfig.templates[architecture];\n }\n break;\n }\n\n if (!selectedSubPath) {\n logger.break();\n logger.error(\n `Architecture '${architecture}' is not supported for '${type}:${component.slug}'.`\n );\n logger.break();\n process.exit(1);\n }\n\n let runtimeDeps: string[] = [];\n let devDeps: string[] = [];\n\n if (type === \"schema\" || type === \"blueprint\") {\n const db = config.database?.engine as DatabaseType;\n const orm = config.database?.adapter as OrmType;\n const deps = resolveDependencies({\n component,\n framework,\n db,\n orm,\n runtime\n });\n runtimeDeps = deps.runtime || [];\n devDeps = deps.dev || [];\n }\n\n return {\n templatePath: `${runtime}/${framework}/${type}/${selectedSubPath}`,\n additionalRuntimeDeps: runtimeDeps,\n additionalDevDeps: devDeps\n };\n}\n\nfunction resolveDatabaseTemplate({\n templateConfig,\n config,\n architecture,\n options,\n registryItemName\n}: {\n templateConfig: SchemaFramework;\n config: IServerCNConfig;\n architecture: Architecture;\n options: AddOptions;\n registryItemName: string;\n}): string | undefined {\n const formattedRegistryItemName = registryItemName.includes(\"/\")\n ? registryItemName.split(\"/\").pop() || \"index\"\n : options.type == \"schema\"\n ? \"index\"\n : registryItemName;\n\n const dbType = config?.database?.engine;\n const orm = config?.database?.adapter;\n\n if (!dbType || !orm) {\n logger.break();\n logger.error(\n \"Database or ORM not configured.\\nPlease add database:type or database:orm in `servercn.config.json` file\"\n );\n logger.break();\n process.exit(1);\n }\n\n const dbConfig = templateConfig?.databases[dbType];\n const dbOrm = dbConfig?.orms[orm];\n\n if (!dbConfig || !dbOrm) {\n logger.break();\n logger.error(\n `Database stack '${dbType}:${orm}' is not supported by ${options.type}:'${formattedRegistryItemName}'.`\n );\n logger.break();\n process.exit(1);\n }\n\n const archOptions = dbOrm?.templates;\n if (options.type === \"blueprint\") {\n const path = options?.local\n ? (archOptions[architecture] as string)\n : `${config.database?.engine}/${config.database?.adapter}/${config.stack.architecture}`;\n return path;\n }\n\n if (options.type == \"schema\") {\n const path = options?.local\n ? archOptions[formattedRegistryItemName][architecture]\n : `${config.database?.engine}/${config.database?.adapter}/${formattedRegistryItemName}/${config.stack.architecture}`;\n return path;\n }\n}\n\nasync function resolvePromptVariants({\n component,\n runtime,\n architecture,\n framework,\n type,\n isBuilt\n}: {\n component: RegistryComponent;\n runtime: RuntimeType;\n architecture: Architecture;\n framework: FrameworkType;\n type: RegistryType;\n isBuilt: boolean;\n}): Promise<{\n templatePath: string;\n additionalRuntimeDeps: string[];\n additionalDevDeps: string[];\n selectedProvider: string;\n}> {\n const variantConfig = component.runtimes[runtime].frameworks[framework];\n const choices = Object.entries(variantConfig?.variants || {}).map(\n ([key, value]: [string, { label: string }]) => {\n return {\n title: value.label,\n value: key\n };\n }\n );\n\n const { variant } = await prompts({\n type: \"select\",\n name: \"variant\",\n message: variantConfig?.prompt || \"Select\",\n choices\n });\n\n if (!variant) {\n logger.break();\n logger.warn(\"Operation cancelled.\");\n logger.break();\n process.exit(0);\n }\n\n const selectedTemplate = isBuilt\n ? (variantConfig?.variants?.[variant] as any)?.architectures?.[architecture]\n ? architecture\n : \"\"\n : variantConfig?.variants?.[variant]?.templates[architecture] || \"\";\n\n if (!selectedTemplate) {\n logger.break();\n logger.error(\n `Architecture '${architecture}' is not supported for variant \"${variant}\".`\n );\n logger.break();\n process.exit(1);\n }\n\n const subPath = isBuilt ? `${variant}/${selectedTemplate}` : selectedTemplate;\n\n return {\n templatePath: `${runtime}/${framework}/${type}/${subPath}`,\n additionalRuntimeDeps:\n variantConfig?.variants?.[variant]?.dependencies?.runtime ?? [],\n additionalDevDeps:\n variantConfig?.variants?.[variant]?.dependencies?.dev ?? [],\n selectedProvider: variant\n };\n}\n\nfunction resolveDependencies({\n component,\n framework,\n db,\n orm,\n runtime\n}: {\n component: RegistrySchema;\n framework: FrameworkType;\n db: DatabaseType;\n orm: OrmType;\n runtime: RuntimeType;\n}): DependencySet {\n const sets =\n component.runtimes[runtime].frameworks[framework].databases[db].orms[orm]\n .dependencies;\n return sets;\n}\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\nimport { highlighter } from \"@/utils/highlighter\";\nimport { logger } from \"@/utils/logger\";\nimport { normalizeEol } from \"@/utils/normalize-eol\";\nimport { spinner } from \"@/utils/spinner\";\n\ntype EnvFileType =\n | \".env\"\n | \".env.local\"\n | \".env.example\"\n | \".env.development.local\"\n | \".env.development\";\n\ntype UpdateEnvProps = {\n envFile: EnvFileType;\n envKeys: string[];\n cwd?: string;\n label: string;\n};\n\nexport function updateEnvKeys({\n envFile,\n envKeys,\n cwd = process.cwd(),\n label\n}: UpdateEnvProps) {\n if (envKeys.length < 1) return;\n const envFilePath = path.join(cwd, envFile);\n\n const existing = normalizeEol(\n existsSync(envFilePath) ? readFileSync(envFilePath, \"utf8\") : \"\"\n );\n\n const existingKeys = new Set(\n existing\n .split(/\\r?\\n/)\n .map(line =>\n line\n .replace(/^export\\s+/, \"\")\n .split(\"=\")[0]\n ?.trim()\n )\n .filter(key => key && !key.startsWith(\"#\"))\n );\n\n const newEnvVars = envKeys\n .filter(key => !existingKeys.has(key))\n .map(key => `\\n${key}='${key.split(\"_\").join(\"_\").toLowerCase()}'`);\n\n logger.break();\n\n if (!newEnvVars.length) {\n logger.log(\n `All env keys already exist in ${highlighter.info(envFile)} — nothing to add`\n );\n return;\n }\n\n const envSpinner = spinner(\n `Adding ${newEnvVars.length} environment key(s) to ${highlighter.info(envFile)}`\n );\n envSpinner?.start();\n\n const header = `# ${label} environment variables`;\n\n const block = `${header}\\n` + newEnvVars.join(\"\\n\") + \"\\n\";\n\n const content = normalizeEol(\n existing.trim().length > 0 ? `${existing.trim()}\\n\\n${block}` : block\n );\n\n writeFileSync(envFilePath, content, \"utf8\");\n\n envSpinner?.succeed(`Env keys added to ${highlighter.info(envFile)}`);\n}\n","import prompts from \"prompts\";\r\n\r\nconst TOOLING_MAP = {\r\n prettier: [\"prettier\"],\r\n\r\n eslint: [\r\n \"eslint\",\r\n \"@typescript-eslint/parser\",\r\n \"@typescript-eslint/eslint-plugin\",\r\n \"eslint-plugin-prettier\"\r\n ],\r\n\r\n typescript: [\"typescript\", \"tsx\", \"tsc-alias\", \"@types/node\"],\r\n\r\n husky: [\"husky\"],\r\n\r\n \"lint-staged\": [\"lint-staged\"],\r\n\r\n commitlint: [\"@commitlint/cli\", \"@commitlint/config-conventional\"]\r\n} as const;\r\n\r\nexport type ToolingKey = keyof typeof TOOLING_MAP;\r\n\r\nconst TOOLING_CHOICES = [\r\n { title: \"Prettier\", value: \"prettier\" },\r\n { title: \"ESLint\", value: \"eslint\" },\r\n { title: \"TypeScript\", value: \"typescript\" },\r\n { title: \"Husky\", value: \"husky\" },\r\n { title: \"Lint Staged\", value: \"lint-staged\" },\r\n { title: \"Commitlint\", value: \"commitlint\" }\r\n];\r\n\r\nconst RECOMMENDED_TOOLING: ToolingKey[] = [\"prettier\", \"eslint\", \"typescript\"];\r\n\r\nexport async function getToolingChoices(): Promise<ToolingKey[]> {\r\n const { enable } = await prompts({\r\n type: \"toggle\",\r\n name: \"enable\",\r\n message: \"Would you like to set up development tooling?\",\r\n initial: true,\r\n active: \"yes\",\r\n inactive: \"no\"\r\n });\r\n\r\n if (!enable) return [];\r\n\r\n const { mode } = await prompts({\r\n type: \"select\",\r\n name: \"mode\",\r\n message: \"Choose tooling setup:\",\r\n choices: [\r\n {\r\n title: \"Prettier + ESLint + TypeScript\",\r\n value: \"recommended\"\r\n },\r\n {\r\n title: \"All (Prettier + ESLint + TypeScript + Husky + Lint Staged + Commitlint)\",\r\n value: \"all\"\r\n },\r\n { title: \"Custom\", value: \"custom\" }\r\n ]\r\n });\r\n\r\n if (mode === \"recommended\") {\r\n return RECOMMENDED_TOOLING;\r\n }\r\n\r\n if (mode === \"all\") {\r\n return Object.keys(TOOLING_MAP) as ToolingKey[];\r\n }\r\n\r\n const { tooling } = await prompts({\r\n type: \"multiselect\",\r\n name: \"tooling\",\r\n message: \"Select the tooling you want to use:\",\r\n choices: TOOLING_CHOICES,\r\n hint: \"- Space to select. Return to submit\"\r\n });\r\n\r\n return tooling ?? [];\r\n}\r\n\r\nexport function getToolingDepsFromChoices(\r\n choices: ToolingKey[] = []\r\n): string[] {\r\n const deps = new Set<string>();\r\n\r\n choices.forEach(tool => {\r\n TOOLING_MAP[tool]?.forEach(dep => deps.add(dep));\r\n });\r\n\r\n return Array.from(deps);\r\n}\r\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport prompts from \"prompts\";\nimport { execa } from \"execa\";\nimport { logger } from \"@/utils/logger\";\nimport { APP_NAME, SERVERCN_CONFIG_FILE } from \"@/constants/app.constants\";\nimport { getRegistry } from \"@/lib/registry\";\nimport { cloneServercnRegistry, copyTemplate } from \"@/lib/copy\";\nimport { installDependencies } from \"@/lib/install-deps\";\nimport type {\n AddOptions,\n Architecture,\n FrameworkType,\n RegistryFoundation\n} from \"@/types\";\nimport { tsConfig } from \"@/configs/ts.config\";\nimport { commitlintConfig } from \"@/configs/commitlint.config\";\nimport { prettierConfig, prettierIgnore } from \"@/configs/prettier.config\";\nimport { servercnConfig } from \"@/configs/servercn.config\";\nimport { gitignore } from \"@/configs/gitignore.config\";\nimport { getDatabaseConfig } from \"@/lib/config\";\nimport { updateEnvKeys } from \"@/utils/update-env\";\nimport { detectPackageManager } from \"@/lib/detect\";\nimport { paths } from \"@/lib/paths\";\nimport { eslintConfig } from \"@/configs/eslint.config\";\nimport { getToolingChoices, getToolingDepsFromChoices } from \"@/utils/tooling\";\n\nexport async function init(foundation?: string, options: AddOptions = {}) {\n const cwd = process.cwd();\n const configPath = path.join(cwd, SERVERCN_CONFIG_FILE);\n\n if (!foundation) {\n const fd = await prompts({\n type: \"select\",\n name: \"foundation\",\n message: \"Select a project foundation: \",\n choices: [\n {\n title: \"Express Starter\",\n description: \"Minimal Express server setup\",\n value: \"express-starter\"\n },\n {\n title: \"Express + Mongoose\",\n description: \"MongoDB with Mongoose ODM\",\n value: \"mongoose-starter\"\n },\n {\n title: \"Express + MongoDB (Prisma)\",\n description: \"MongoDB database with Prisma ORM\",\n value: \"prisma-mongodb-starter\"\n },\n {\n title: \"Express + MySQL (Drizzle)\",\n description: \"MySQL database with Drizzle ORM\",\n value: \"drizzle-mysql-starter\"\n },\n {\n title: \"Express + PostgreSQL (Drizzle)\",\n description: \"PostgreSQL database with Drizzle ORM\",\n value: \"drizzle-pg-starter\"\n },\n {\n title: \"Existing Project\",\n description: `Generate ${SERVERCN_CONFIG_FILE} for an existing project`,\n value: null\n }\n ]\n });\n foundation = fd.foundation;\n }\n\n if ((await fs.pathExists(configPath)) && !foundation) {\n logger.break();\n logger.break();\n logger.warn(`${APP_NAME} is already initialized in this project.`);\n logger.info(\n \"You can now add components: npx servercn-cli add <component-name>\"\n );\n logger.break();\n process.exit(1);\n }\n\n if (foundation) {\n try {\n logger.break();\n const response = await prompts([\n {\n type: \"text\",\n name: \"root\",\n message: \"Project root directory\",\n initial: \".\",\n format: val => val.trim() || \".\"\n },\n {\n type: \"select\",\n name: \"architecture\",\n message: \"Select architecture\",\n choices: [\n { title: \"MVC (controllers, services, models)\", value: \"mvc\" },\n { title: \"Feature (modules, shared)\", value: \"feature\" },\n { title: \"Modular Architecture (NestJS)\", value: \"modular\" }\n ]\n },\n {\n type: \"select\",\n name: \"packageManager\",\n message: \"Select package manager\",\n choices: [\n { title: \"npm\", value: \"npm\" },\n { title: \"pnpm\", value: \"pnpm\" },\n { title: \"yarn\", value: \"yarn\" },\n { title: \"bun\", value: \"bun\" }\n ],\n initial: Math.max(\n 0,\n [\"npm\", \"pnpm\", \"yarn\", \"bun\"].indexOf(detectPackageManager())\n )\n },\n {\n type: \"confirm\",\n name: \"initGit\",\n message: \"Initialize git repository?\",\n initial: false\n }\n ]);\n\n logger.break();\n\n const toolingChoices = await getToolingChoices();\n\n const devDeps = getToolingDepsFromChoices(toolingChoices);\n\n const rootPath = path.resolve(cwd, response.root);\n\n if (response.root !== \".\" && fs.pathExistsSync(rootPath)) {\n logger.break();\n logger.error(`Cannot create '${response.root}' — file already exists!`);\n logger.break();\n process.exit(1);\n }\n await fs.ensureDir(rootPath);\n\n if (!fs.pathExistsSync(rootPath)) {\n logger.error(`Failed to create project directory: ${rootPath}`);\n process.exit(1);\n }\n\n if (response.initGit) {\n try {\n await execa(\"git\", [\"init\"], { cwd: rootPath });\n logger.info(\"Initialized git repository.\");\n } catch {\n logger.warn(\"Failed to initialize git repository. is git installed?\");\n }\n }\n\n try {\n const component: RegistryFoundation = await getRegistry(\n foundation,\n \"foundation\",\n options.local\n );\n\n const baseConfig =\n component.runtimes[\"node\"].frameworks[\n getFramework(options.fw ?? \"express\")\n ];\n\n if (options.local) {\n const targetDir = paths.targets(response.root ?? \".\");\n const localTemplatePath =\n `node/${getFramework(options.fw ?? \"express\")}/foundation/${baseConfig?.templates[response.architecture as Architecture]}` ||\n \"\";\n const templateDir = path.resolve(\n paths.templates(),\n localTemplatePath\n );\n\n if (!(await fs.pathExists(templateDir))) {\n logger.error(\n `\\nTemplate not found: ${templateDir}\\nCheck your servercn configuration.\\n`\n );\n process.exit(1);\n }\n logger.break();\n\n await copyTemplate({\n templateDir,\n targetDir,\n registryItemName: foundation,\n conflict: options.force ? \"overwrite\" : \"skip\"\n });\n } else {\n const templatePath = `node/${getFramework(options.fw ?? \"express\")}/${response.architecture}`;\n if (!templatePath) {\n logger.error(\n `Template not found for ${foundation?.toLowerCase()} (${response.architecture})`\n );\n fs.removeSync(rootPath);\n return;\n }\n\n const ok = await cloneServercnRegistry({\n templatePath,\n targetDir: response.root,\n component,\n options\n });\n\n if (!ok) {\n logger.error(`Failed to initialize foundation:${foundation}.\\n`);\n fs.removeSync(rootPath);\n return;\n }\n }\n\n await fs.writeJson(\n path.join(rootPath, SERVERCN_CONFIG_FILE),\n servercnConfig({\n project: {\n rootDir: response.root,\n type: \"backend\",\n packageManager: response.packageManager\n },\n stack: {\n runtime: \"node\",\n language: \"typescript\",\n framework: getFramework(options.fw ?? \"express\"),\n architecture: response.architecture\n },\n database: getDatabaseConfig(foundation)\n }),\n {\n spaces: 2\n }\n );\n\n await fs.writeJson(path.join(rootPath, \".prettierrc\"), prettierConfig, {\n spaces: 2\n });\n\n await fs.writeFile(\n path.join(rootPath, \".prettierignore\"),\n prettierIgnore\n );\n\n await fs.writeFile(path.join(rootPath, \".gitignore\"), gitignore);\n\n await fs.writeJson(path.join(rootPath, \"tsconfig.json\"), tsConfig, {\n spaces: 2\n });\n\n await fs.writeFile(\n path.join(rootPath, \"commitlint.config.ts\"),\n `export default ${JSON.stringify(commitlintConfig, null, 2)}`\n );\n\n await fs.writeFile(\n path.join(rootPath, \"eslint.config.mjs\"),\n eslintConfig\n );\n\n const filterEnvs =\n baseConfig?.env?.filter((env: string) => env !== \"\") || [];\n\n if (filterEnvs?.length > 0) {\n updateEnvKeys({\n envFile: \".env.example\",\n envKeys: filterEnvs,\n label: foundation,\n cwd: rootPath\n });\n updateEnvKeys({\n envFile: \".env\",\n envKeys: filterEnvs,\n label: foundation,\n cwd: rootPath\n });\n }\n\n await installDependencies({\n runtime: baseConfig?.dependencies?.runtime || [],\n dev: [...devDeps, baseConfig?.dependencies?.dev || []].flat(),\n cwd: rootPath,\n packageManager: response.packageManager\n });\n logger.break();\n logger.success(\n `${APP_NAME} initialized with 'foundation:${foundation}'.`\n );\n logger.break();\n logger.info(\"Configure environment variables in .env file.\");\n logger.break();\n logger.log(\"Run the following commands:\");\n\n if (response.root === \".\") {\n logger.muted(`1. ${response.packageManager || \"npm\"} run dev\\n`);\n } else {\n logger.muted(`1. cd ${response.root}`);\n logger.muted(`2. ${response.packageManager || \"npm\"} run dev\\n`);\n }\n process.exit(1);\n } catch (e) {\n fs.removeSync(rootPath);\n logger.error(`Failed to initialize foundation: ${e}`);\n process.exit(1);\n }\n } catch {\n logger.error(`\\nFailed to initialize foundation\\n`);\n process.exit(1);\n }\n }\n\n logger.break();\n\n const response = await prompts([\n {\n type: \"text\",\n name: \"root\",\n message: \"Project root directory\",\n initial: \".\",\n format: val => val.trim() || \".\"\n },\n {\n type: \"select\",\n name: \"language\",\n message: \"Programming language\",\n choices: [\n {\n title: \"Typescript (recommended)\",\n value: \"typescript\"\n }\n ]\n },\n {\n type: \"select\",\n name: \"framework\",\n message: \"Backend framework\",\n choices: [\n {\n title: \"Express.js\",\n value: \"express\"\n },\n {\n title: \"NestJS\",\n value: \"nestjs\"\n }\n ],\n initial: 0\n },\n {\n type: \"select\",\n name: \"architecture\",\n message: \"Select architecture\",\n choices: [\n { title: \"MVC (controllers, services, models)\", value: \"mvc\" },\n { title: \"Feature-based (modules, shared)\", value: \"feature\" },\n { title: \"Modular Architecture (NestJS)\", value: \"modular\" }\n ]\n },\n\n {\n type: \"select\",\n name: \"databaseType\",\n message: \"Select database\",\n choices: [\n {\n title: \"Mongodb\",\n value: \"mongodb\"\n },\n {\n title: \"PostgreSQL\",\n value: \"postgresql\"\n },\n {\n title: \"MySQL\",\n value: \"mysql\"\n }\n ]\n },\n {\n type: prev => (prev === \"mongodb\" ? \"select\" : null),\n name: \"orm\",\n message: \"Mongodb library\",\n choices: [\n { title: \"Mongoose\", value: \"mongoose\" },\n { title: \"Prisma\", value: \"prisma\" }\n ]\n },\n {\n type: (_prev, values) =>\n [\"postgresql\", \"mysql\"].includes(values.databaseType) ? \"select\" : null,\n name: \"orm\",\n message: \"Orm / query builder\",\n choices: [\n { title: \"Drizzle\", value: \"drizzle\" },\n { title: \"Prisma\", value: \"prisma\" }\n ]\n },\n {\n type: \"select\",\n name: \"packageManager\",\n message: \"Select package manager\",\n choices: [\n { title: \"npm\", value: \"npm\" },\n { title: \"pnpm\", value: \"pnpm\" },\n { title: \"yarn\", value: \"yarn\" },\n { title: \"bun\", value: \"bun\" }\n ],\n initial: Math.max(\n 0,\n [\"npm\", \"pnpm\", \"yarn\", \"bun\"].indexOf(detectPackageManager())\n )\n }\n ]);\n\n if (\n !response.architecture ||\n !response.databaseType ||\n !response.framework ||\n !response.language ||\n !response.orm ||\n !response.root ||\n !response.packageManager\n ) {\n logger.break();\n logger.warn(\"Initialization cancelled.\");\n logger.break();\n return;\n }\n\n const rootPath = path.resolve(cwd, response.root);\n\n if (response.root !== \".\" && fs.pathExistsSync(rootPath)) {\n logger.break();\n logger.error(`Cannot create '${response.root}' — file already exists!`);\n logger.break();\n process.exit(1);\n }\n\n await fs.ensureDir(rootPath);\n\n await fs.writeJson(\n path.join(rootPath, SERVERCN_CONFIG_FILE),\n servercnConfig({\n project: {\n rootDir: response.root,\n type: \"backend\",\n packageManager: response.packageManager\n },\n stack: {\n runtime: \"node\",\n language: response.language,\n framework: response.framework,\n architecture: response.architecture\n },\n database: {\n engine: response.databaseType,\n adapter: response.orm\n }\n }),\n {\n spaces: 2\n }\n );\n\n logger.success(`\\n${APP_NAME} initialized successfully.`);\n logger.break();\n\n logger.log(\"You may now add components by running:\");\n if (response.root === \".\") {\n logger.muted(\"1. npx servercn-cli add <component>\");\n } else {\n logger.muted(`1. cd ${response.root}`);\n logger.muted(\"2. npx servercn-cli add <component>\");\n }\n logger.muted(\n \"ex: npx servercn-cli add jwt-utils error-handler http-status-codes\"\n );\n logger.break();\n}\n\nfunction getFramework(fw: string): FrameworkType {\n switch (fw) {\n case \"express\":\n case \"expressjs\":\n return \"express\";\n case \"nestjs\":\n case \"nest\":\n return \"nestjs\";\n default:\n return \"express\";\n }\n}\n","export const tsConfig = {\n compilerOptions: {\n target: \"ES2021\",\n module: \"es2022\",\n moduleResolution: \"bundler\",\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n outDir: \"dist\",\n rootDir: \"src\",\n sourceMap: true,\n alwaysStrict: true,\n useUnknownInCatchVariables: true,\n forceConsistentCasingInFileNames: true,\n paths: {\n \"@/*\": [\"./src/*\"],\n \"@/shared/*\": [\"../../shared/*\"],\n },\n },\n \"tsc-alias\": {\n resolveFullPaths: true,\n verbose: false,\n },\n include: [\"src/**/*\"],\n exclude: [\"node_modules\"],\n};\n","export const commitlintConfig = {\n extends: [\"@commitlint/config-conventional\"],\n rules: {\n \"type-enum\": [\n 2,\n \"always\",\n [\n \"feat\",\n \"fix\",\n \"docs\",\n \"style\",\n \"refactor\",\n \"test\",\n \"chore\",\n \"ci\",\n \"perf\",\n \"build\",\n \"release\",\n \"workflow\",\n \"security\",\n ],\n ],\n\n \"subject-case\": [2, \"always\", [\"lower-case\"]],\n },\n};\n","export const prettierConfig = {\n singleQuote: false,\n semi: true,\n tabWidth: 2,\n trailingComma: \"none\",\n bracketSameLine: false,\n arrowParens: \"avoid\",\n endOfLine: \"lf\",\n};\n\nexport const prettierIgnore = `# dependencies\nnode_modules\n\n# build outputs\ndist\nbuild\ncoverage\n\n# lock files\npackage-lock.json\npnpm-lock.yaml\nyarn.lock\n\n# environment\n.env\n\n# generated files\n*.min.js\n*.bundle.js\n\n# logs\n*.log\n\n# git\n.git\n.gitignore\n`;\n","import { LATEST_VERSION, SERVERCN_URL } from \"@/constants/app.constants\";\nimport type { IServerCNConfig } from \"@/types\";\n\nexport const servercnConfig = (\n config: Omit<IServerCNConfig, \"$schema\" | \"version\" | \"meta\">,\n): IServerCNConfig => {\n return {\n $schema: `${SERVERCN_URL}/schema/servercn.config.json`,\n version: LATEST_VERSION,\n\n project: {\n rootDir: config.project.rootDir,\n type: config.project.type,\n packageManager: config.project.packageManager,\n },\n\n stack: config.stack,\n\n database: config.database,\n\n meta: {\n createdAt: new Date().toISOString(),\n createdBy: `servercn@${LATEST_VERSION}`,\n },\n };\n};\n","export const gitignore = `# dependencies\nnode_modules\n.pnpm-store\n\n# build output\ndist\nbuild\ncoverage\n\n# environment variables\n.env\n.env.local\n.env.*.local\n\n# logs\nlogs\n*.log\nnpm-debug.log*\npnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# OS files\n.DS_Store\nThumbs.db\n\n# IDE\n.vscode\n.idea\n\n# temp\ntmp\ntemp\n.cache\n\n# misc\n*.tsbuildinfo\n`;\n","export const eslintConfig = `\nimport tseslint from \"@typescript-eslint/eslint-plugin\";\nimport tsparser from \"@typescript-eslint/parser\";\nimport prettierPlugin from \"eslint-plugin-prettier\";\n\nexport default [\n {\n files: [\"**/*.ts\"],\n\n languageOptions: {\n parser: tsparser,\n sourceType: \"module\"\n },\n\n plugins: {\n \"@typescript-eslint\": tseslint,\n prettier: prettierPlugin\n },\n\n rules: {\n ...tseslint.configs.recommended.rules,\n \"@typescript-eslint/no-unused-vars\": \"off\",\n \"@typescript-eslint/no-unused-expressions\": \"off\",\n \"no-console\": \"warn\",\n semi: [\"error\", \"always\"],\n quotes: [\"error\", \"double\"],\n \"prettier/prettier\": \"error\"\n }\n },\n];\n`;\n","import type { Command } from \"commander\";\nimport {\n listOverview,\n listComponents,\n listFoundations,\n listTooling,\n listSchemas,\n listBlueprints,\n type listOptionType\n} from \"./list.handlers\";\n\nexport function registryListCommands(program: Command) {\n const list = program\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List available ServerCN resources\")\n .option(\"--json\", \"Output resources as JSON\")\n .option(\"--all\", \"Display all available registries\")\n .option(\"--local\", \"Display only local registries\")\n .enablePositionalOptions()\n .action((options: listOptionType) => {\n listOverview(options);\n });\n\n function resolveOptions(cmd: Command): listOptionType {\n return cmd.parent?.opts() as listOptionType;\n }\n\n list\n .command(\"component\")\n .alias(\"cp\")\n .description(\"List available components\")\n .action((_, cmd) => {\n listComponents(resolveOptions(cmd));\n });\n\n list\n .command(\"foundation\")\n .alias(\"fd\")\n .description(\"List available foundations\")\n .action((_, cmd) => {\n listFoundations(resolveOptions(cmd));\n });\n\n list\n .command(\"tooling\")\n .alias(\"tl\")\n .description(\"List available tooling\")\n .action((_, cmd) => {\n listTooling(resolveOptions(cmd));\n });\n\n list\n .command(\"schema\")\n .alias(\"sc\")\n .description(\"List available schemas\")\n .action((_, cmd) => {\n listSchemas(resolveOptions(cmd));\n });\n\n list\n .command(\"blueprint\")\n .alias(\"bp\")\n .description(\"List available blueprints\")\n .action((_, cmd) => {\n listBlueprints(resolveOptions(cmd));\n });\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport path from \"node:path\";\nimport fs from \"fs-extra\";\nimport { glob } from \"glob\";\nimport { processRegistryItem } from \"./build.handlers\";\nimport {\n APP_NAME,\n RegistryTypeList,\n SERVERCN_URL\n} from \"@/constants/app.constants\";\nimport type { RegistryType, RegistryItem, FrameworkType } from \"@/types\";\nimport { paths } from \"@/lib/paths\";\nimport { logger } from \"@/utils/logger\";\nimport { spinner } from \"@/utils/spinner\";\nimport { highlighter } from \"@/utils/highlighter\";\n\nexport type buildTypeProps = {\n url?: string;\n name?: string;\n};\n\nexport async function build(options: buildTypeProps) {\n const buildSpin = spinner(\"Building ServerCN registry...\").start();\n\n const index: {\n name: string;\n homepage: string;\n items: {\n type: string;\n slug: string;\n frameworks?: Array<FrameworkType>;\n }[];\n } = {\n name: options.name ?? APP_NAME.toLowerCase(),\n homepage: options.url ?? SERVERCN_URL,\n items: []\n };\n\n let totalItems = 0;\n let builtItems = 0;\n let updatedItems = 0;\n let skippedItems = 0;\n\n for (const type of RegistryTypeList) {\n // buildSpin.text = `Processing type: ${type}`;\n const sourceDir = path.join(paths.registryBase, type as string);\n const targetDir = path.join(paths.outputBase, type as string);\n\n if (!(await fs.pathExists(sourceDir))) {\n continue;\n }\n\n await fs.ensureDir(targetDir);\n\n const files = await glob(\"*.json\", { cwd: sourceDir });\n for (const file of files) {\n totalItems++;\n const sourcePath = path.join(sourceDir, file);\n const item = (await fs.readJson(sourcePath)) as any;\n const outputPath = path.join(targetDir, `${item.slug}.json`);\n const buildStatus = await getBuildStatus(\n sourcePath,\n outputPath,\n item,\n type as RegistryType\n );\n\n if (buildStatus === \"skip\") {\n skippedItems++;\n\n if (type === \"tooling\" || !item.runtimes?.[\"node\"]?.frameworks) {\n index.items.push({\n type: type,\n slug: item.slug\n });\n } else {\n index.items.push({\n type: type,\n slug: item.slug,\n frameworks: Object.keys(\n item.runtimes[\"node\"].frameworks\n ) as Array<FrameworkType>\n });\n }\n continue;\n }\n\n buildSpin.text = `${buildStatus === \"rebuild\" ? \"Building\" : \"Updating\"} ${type}: ${item.slug}`;\n try {\n const builtItem = await processRegistryItem(item, type as RegistryType);\n await fs.writeJson(outputPath, builtItem, { spaces: 2 });\n\n if (type === \"tooling\" || !builtItem.runtimes?.[\"node\"]?.frameworks) {\n index.items.push({\n type: type,\n slug: item.slug\n });\n } else {\n index.items.push({\n type: type,\n slug: item.slug,\n frameworks: Object.keys(\n builtItem.runtimes[\"node\"].frameworks\n ) as Array<FrameworkType>\n });\n }\n\n if (buildStatus === \"rebuild\") {\n builtItems++;\n } else {\n updatedItems++;\n }\n } catch (error) {\n console.error(error);\n buildSpin.fail(`Failed to build ${item.slug}`);\n logger.error(error);\n buildSpin.start(\"Resuming build...\");\n }\n }\n }\n\n await fs.writeJson(path.join(paths.outputBase, \"index.json\"), index, {\n spaces: 2\n });\n\n buildSpin.succeed(\n `${highlighter.success(\"Registry build completed\")}\\nTotal: ${totalItems}, Built: ${builtItems}, Updated: ${updatedItems}, Skipped: ${skippedItems}`\n );\n}\n\nasync function getBuildStatus(\n sourcePath: string,\n outputPath: string,\n item: RegistryItem,\n type: RegistryType\n): Promise<\"rebuild\" | \"update\" | \"skip\"> {\n if (!(await fs.pathExists(outputPath))) return \"rebuild\";\n\n const sourceStat = await fs.stat(sourcePath);\n const targetStat = await fs.stat(outputPath);\n\n // Check templates first - if any template is newer than the output, we MUST rebuild\n const templatePaths = getTemplatePathsForItem(item, type);\n for (const tp of templatePaths) {\n const absoluteTp = path.join(paths.templateBase, tp);\n if (!(await fs.pathExists(absoluteTp))) continue;\n\n const tpStat = await fs.stat(absoluteTp);\n if (tpStat.isDirectory()) {\n const files = await glob(\"**/*\", {\n cwd: absoluteTp,\n nodir: true,\n absolute: true\n });\n for (const f of files) {\n const fStat = await fs.stat(f);\n if (fStat.mtime > targetStat.mtime) return \"rebuild\";\n }\n } else {\n if (tpStat.mtime > targetStat.mtime) return \"rebuild\";\n }\n }\n\n // If templates are up to date, check if the registry JSON itself changed\n if (sourceStat.mtime > targetStat.mtime) return \"update\";\n\n return \"skip\";\n}\n\nfunction getTemplatePathsForItem(\n item: RegistryItem,\n type: RegistryType\n): string[] {\n const templatePaths: string[] = [];\n const itemAny = item as any;\n\n if (type === \"tooling\") {\n if (itemAny.templates) {\n for (const tPath of Object.values(itemAny.templates)) {\n templatePaths.push(path.join(\"tooling\", tPath as string));\n }\n }\n return templatePaths;\n }\n\n if (!itemAny.runtimes) return templatePaths;\n\n for (const [runtimeKey, runtime] of Object.entries<any>(itemAny.runtimes)) {\n for (const [frameworkKey, framework] of Object.entries<any>(\n runtime.frameworks\n )) {\n const baseRelPath = path.join(runtimeKey, frameworkKey, type);\n\n if (framework.variants) {\n for (const variant of Object.values<any>(framework.variants)) {\n if (variant.templates) {\n for (const tPath of Object.values(variant.templates)) {\n templatePaths.push(path.join(baseRelPath, tPath as string));\n }\n }\n }\n } else if (framework.templates) {\n for (const tPath of Object.values<any>(framework.templates)) {\n if (typeof tPath === \"string\") {\n templatePaths.push(path.join(baseRelPath, tPath));\n } else if (typeof tPath === \"object\" && tPath !== null) {\n // For blueprints/schemas where templates might be Record<string, ArchitectureSet>\n for (const archSet of Object.values<any>(tPath)) {\n if (typeof archSet === \"string\") {\n templatePaths.push(path.join(baseRelPath, archSet));\n } else if (typeof archSet === \"object\" && archSet !== null) {\n for (const p of Object.values(archSet)) {\n templatePaths.push(path.join(baseRelPath, p as string));\n }\n }\n }\n }\n }\n } else if (framework.databases) {\n // Blueprint/Schema\n for (const db of Object.values<any>(framework.databases)) {\n for (const orm of Object.values<any>(db.orms)) {\n if (orm.templates) {\n for (const val of Object.values<any>(orm.templates)) {\n if (typeof val === \"string\") {\n templatePaths.push(path.join(baseRelPath, val));\n } else if (typeof val === \"object\" && val !== null) {\n // Schema multi-templates\n for (const p of Object.values(val)) {\n templatePaths.push(path.join(baseRelPath, p as string));\n }\n }\n }\n }\n }\n }\n }\n }\n }\n\n return templatePaths;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport path from \"node:path\";\nimport fs from \"fs-extra\";\nimport { glob } from \"glob\";\nimport { paths } from \"@/lib/paths\";\nimport type {\n RegistryType,\n RegistryComponent,\n RegistryBlueprint,\n RegistryFoundation,\n RegistrySchema,\n RegistryTooling,\n ArchitectureSet,\n NodeRuntime,\n FrameworkConfig\n} from \"@/types\";\nimport { logger } from \"@/utils/logger\";\nimport { normalizeEol } from \"@/utils/normalize-eol\";\n\nexport async function processRegistryItem(item: any, type: RegistryType) {\n switch (type) {\n case \"component\":\n return await buildComponent(item as RegistryComponent);\n case \"blueprint\":\n return await buildBlueprint(item as RegistryBlueprint);\n case \"foundation\":\n return await buildFoundation(item as RegistryFoundation);\n case \"schema\":\n return await buildSchema(item as RegistrySchema);\n case \"tooling\":\n return await buildTooling(item as RegistryTooling);\n default:\n throw new Error(`Unsupported registry type: ${type}`);\n }\n}\n\nasync function buildComponent(component: RegistryComponent) {\n const built: any = { ...component, runtimes: {} };\n delete built[\"$schema\"];\n for (const [runtimeKey, runtime] of Object.entries(component.runtimes)) {\n const rt = runtime as NodeRuntime;\n built.runtimes[runtimeKey] = { frameworks: {} };\n for (const [frameworkKey, framework] of Object.entries(rt.frameworks)) {\n const fw = framework as FrameworkConfig;\n if (\"variants\" in fw && fw.variants) {\n // Variant-based framework\n const builtVariants: any = {};\n for (const [variantKey, variant] of Object.entries(fw.variants)) {\n const v = variant;\n builtVariants[variantKey] = {\n ...v,\n architectures: await processArchitectureSet(\n v.templates,\n path.join(runtimeKey, frameworkKey, \"component\")\n )\n };\n delete builtVariants[variantKey].templates;\n }\n built.runtimes[runtimeKey].frameworks[frameworkKey] = {\n prompt: fw.prompt,\n variants: builtVariants\n };\n } else if (\"templates\" in fw && fw.templates) {\n // Simple framework\n built.runtimes[runtimeKey].frameworks[frameworkKey] = {\n ...fw,\n architectures: await processArchitectureSet(\n fw.templates,\n path.join(runtimeKey, frameworkKey, \"component\")\n )\n };\n delete (built.runtimes[runtimeKey].frameworks[frameworkKey] as any)\n .templates;\n }\n }\n }\n return built;\n}\n\nasync function buildFoundation(foundation: RegistryFoundation) {\n const built: any = { ...foundation, runtimes: {} };\n delete built[\"$schema\"];\n for (const [runtimeKey, runtime] of Object.entries(foundation.runtimes)) {\n built.runtimes[runtimeKey] = { frameworks: {} };\n for (const [frameworkKey, framework] of Object.entries(\n runtime.frameworks\n )) {\n if (framework) {\n built.runtimes[runtimeKey].frameworks[frameworkKey] = {\n ...framework,\n architectures: await processArchitectureSet(\n framework?.templates,\n path.join(runtimeKey, frameworkKey, \"foundation\")\n )\n };\n delete (built.runtimes[runtimeKey].frameworks[frameworkKey] as any)\n .templates;\n }\n }\n }\n return built;\n}\n\nasync function buildBlueprint(blueprint: RegistryBlueprint) {\n const built: any = { ...blueprint, runtimes: {} };\n delete built[\"$schema\"];\n for (const [runtimeKey, runtime] of Object.entries(blueprint.runtimes)) {\n built.runtimes[runtimeKey] = { frameworks: {} };\n for (const [frameworkKey, framework] of Object.entries(\n runtime.frameworks\n )) {\n const builtDatabases: any = {};\n for (const [dbKey, db] of Object.entries(framework.databases)) {\n const builtOrms: any = {};\n for (const [ormKey, orm] of Object.entries(db.orms)) {\n builtOrms[ormKey] = {\n ...orm,\n architectures: await processArchitectureSet(\n orm.templates,\n path.join(runtimeKey, frameworkKey, \"blueprint\")\n )\n };\n delete (builtOrms[ormKey] as any).templates;\n }\n builtDatabases[dbKey] = { orms: builtOrms };\n }\n built.runtimes[runtimeKey].frameworks[frameworkKey] = {\n databases: builtDatabases\n };\n }\n }\n return built;\n}\n\nasync function buildSchema(schema: RegistrySchema) {\n const built: any = { ...schema, runtimes: {} };\n delete built[\"$schema\"];\n for (const [runtimeKey, runtime] of Object.entries(schema.runtimes)) {\n built.runtimes[runtimeKey] = { frameworks: {} };\n for (const [frameworkKey, framework] of Object.entries(\n runtime.frameworks\n )) {\n const builtDatabases: any = {};\n for (const [dbKey, db] of Object.entries(framework.databases)) {\n const builtOrms: any = {};\n for (const [ormKey, orm] of Object.entries(db.orms)) {\n const builtMultiTemplates: any = {};\n for (const [tmplKey, archSet] of Object.entries(orm.templates)) {\n builtMultiTemplates[tmplKey] = {\n architectures: await processArchitectureSet(\n archSet,\n path.join(runtimeKey, frameworkKey, \"schema\")\n )\n };\n }\n builtOrms[ormKey] = {\n ...orm,\n templates: builtMultiTemplates\n };\n }\n builtDatabases[dbKey] = { orms: builtOrms };\n }\n built.runtimes[runtimeKey].frameworks[frameworkKey] = {\n databases: builtDatabases\n };\n }\n }\n return built;\n}\n\nasync function buildTooling(tooling: RegistryTooling) {\n const built: any = { ...tooling };\n delete built[\"$schema\"];\n const builtTemplates: any = {};\n for (const [tmplKey, tmplPath] of Object.entries(tooling.templates)) {\n const absolutePath = path.join(paths.templateBase, \"tooling\", tmplPath);\n builtTemplates[tmplKey] = {\n files: await extractFiles(absolutePath, \"tooling\")\n };\n }\n built.templates = builtTemplates;\n return built;\n}\n\nasync function processArchitectureSet(\n archSet: ArchitectureSet,\n baseRelPath: string\n) {\n const architectures: any = {};\n for (const [archKey, relTemplatePath] of Object.entries(archSet)) {\n if (!relTemplatePath) continue;\n const absoluteTemplatePath = path.join(\n paths.templateBase,\n baseRelPath,\n relTemplatePath\n );\n architectures[archKey] = {\n files: await extractFiles(absoluteTemplatePath, \"file\")\n };\n }\n return architectures;\n}\n\nexport async function extractFiles(templateDir: string, type: string) {\n if (!(await fs.pathExists(templateDir))) {\n const msg = `Template directory not found: ${templateDir}`;\n logger.error(msg);\n throw new Error(msg);\n }\n\n const pattern = \"**/*\";\n const filePaths = await glob(pattern, {\n cwd: templateDir,\n nodir: true,\n dot: true\n });\n\n const files = [];\n\n for (const relativePath of filePaths) {\n const absolutePath = path.join(templateDir, relativePath);\n const content = normalizeEol(await fs.readFile(absolutePath, \"utf8\"));\n\n files.push({\n type,\n path: normalizePath(relativePath),\n content\n });\n }\n\n return files;\n}\n\nfunction normalizePath(p: string) {\n return p.split(path.sep).join(\"/\");\n}\n","import fs from \"fs-extra\";\nimport path from \"node:path\";\nimport { logger } from \"@/utils/logger\";\nimport {\n SERVERCN_CONFIG_FILE,\n SERVERCN_URL\n} from \"@/constants/app.constants\";\nimport { markerBeginLine } from \"@/lib/merge-marker\";\nimport type { Architecture, IServerCNConfig } from \"@/types\";\n\nconst README_UPGRADE_ANCHOR =\n \"https://github.com/AkkalDhami/servercn/blob/main/packages/cli/README.md#existing-projects-upgrades--template-drift\";\n\nfunction printStaticGuide() {\n logger.section(\"Post-init projects & upstream changes\");\n logger.log(\n \"Your scaffold is a snapshot from when you ran `init`. The CLI and registry evolve separately.\"\n );\n logger.break();\n logger.log(\"Typical situations:\");\n logger.log(\n \" • CLI-only bump (bugfixes): usually no repo changes unless you hit a specific fix.\"\n );\n logger.log(\n \" • Registry/template updates (new markers, `--merge`, paths): read release notes; then copy markers from docs, use `add --merge`, or `--force` / new project.\"\n );\n logger.log(\n \" • Foundation changes: no automatic sync — diff manually or start a fresh project.\"\n );\n logger.break();\n logger.info(`Full matrix: ${README_UPGRADE_ANCHOR}`);\n logger.info(`Installation / upgrades: ${SERVERCN_URL}/docs/installation`);\n logger.break();\n}\n\nasync function checkMergeMarkers(config: IServerCNConfig, projectRoot: string) {\n const arch = (config.stack?.architecture ?? \"mvc\") as Architecture;\n const appPath = path.join(projectRoot, \"src\", \"app.ts\");\n const appSlugs: string[] =\n arch === \"feature\"\n ? [\"rate-limiter\", \"security-header\"]\n : [\"rate-limiter\", \"security-header\", \"async-handler\"];\n\n if (await fs.pathExists(appPath)) {\n const text = await fs.readFile(appPath, \"utf8\");\n for (const slug of appSlugs) {\n const line = markerBeginLine(slug);\n if (!text.includes(line)) {\n logger.warn(\n `Missing ${line} in src/app.ts — add it (see README) before using add ${slug} --merge.`\n );\n }\n }\n } else {\n logger.muted(\"No src/app.ts found; skipping app marker checks.\");\n }\n\n if (arch === \"feature\") {\n const routesPath = path.join(projectRoot, \"src\", \"routes\", \"index.ts\");\n if (await fs.pathExists(routesPath)) {\n const text = await fs.readFile(routesPath, \"utf8\");\n const line = markerBeginLine(\"async-handler\");\n if (!text.includes(line)) {\n logger.warn(\n `Missing ${line} in src/routes/index.ts — required for async-handler --merge (feature architecture).`\n );\n }\n }\n }\n}\n\nexport async function doctor() {\n printStaticGuide();\n\n const configPath = path.resolve(process.cwd(), SERVERCN_CONFIG_FILE);\n if (!(await fs.pathExists(configPath))) {\n logger.muted(\"No servercn.config.json in this directory — marker checks skipped.\");\n logger.break();\n return;\n }\n\n const config = (await fs.readJSON(configPath)) as IServerCNConfig;\n const rootDir = config.project?.rootDir ?? \".\";\n const projectRoot = path.resolve(process.cwd(), rootDir);\n\n logger.section(\"Merge marker sanity (optional)\");\n await checkMergeMarkers(config, projectRoot);\n logger.break();\n}\n"],"mappings":"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","names":["fs","path","type","fs","path","path","fs","fs","path","fs","path","fs","path","fs","path","fs","path","path","fs","tsConfig","fs","path","path","fs","fs","path","path","fs","path","execa","path","path","prompts","resolveDependencies","path","fs","execa","fs","path","prompts","execa","path","prompts","fs","response","rootPath","execa","program","path","fs","glob","path","fs","path","fs","path","fs","glob","fs","path","path","fs"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@quyentran93/servercn-cli",
|
|
3
|
+
"version": "1.1.10",
|
|
4
|
+
"description": "Backend components CLI for Node.js & Typescript",
|
|
5
|
+
"main": "dist/cli.js",
|
|
6
|
+
"readme": "README.md",
|
|
7
|
+
"bin": {
|
|
8
|
+
"servercn": "dist/cli.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"dev": "tsup --watch",
|
|
12
|
+
"build": "tsup",
|
|
13
|
+
"typecheck": "tsc --noEmit",
|
|
14
|
+
"test:merge-marker": "tsx src/lib/merge-marker.selftest.ts",
|
|
15
|
+
"prepublishOnly": "npm run build",
|
|
16
|
+
"pub": "npm publish"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"servercn",
|
|
20
|
+
"cli",
|
|
21
|
+
"backend",
|
|
22
|
+
"typescript",
|
|
23
|
+
"node.js",
|
|
24
|
+
"express",
|
|
25
|
+
"nodejs",
|
|
26
|
+
"scaffold",
|
|
27
|
+
"boilerplate",
|
|
28
|
+
"component"
|
|
29
|
+
],
|
|
30
|
+
"author": {
|
|
31
|
+
"name": "Akkal Dhami",
|
|
32
|
+
"github": "https://github.com/QuyenTran93",
|
|
33
|
+
"url": "https://x.com/AavashDhami2127"
|
|
34
|
+
},
|
|
35
|
+
"license": "MIT",
|
|
36
|
+
"files": [
|
|
37
|
+
"dist",
|
|
38
|
+
"README.md"
|
|
39
|
+
],
|
|
40
|
+
"repository": {
|
|
41
|
+
"type": "git",
|
|
42
|
+
"url": "git+https://github.com/QuyenTran93/servercn.git",
|
|
43
|
+
"directory": "packages/cli"
|
|
44
|
+
},
|
|
45
|
+
"type": "module",
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"cli-table3": "^0.6.5",
|
|
48
|
+
"commander": "^14.0.2",
|
|
49
|
+
"execa": "^9.6.1",
|
|
50
|
+
"fs-extra": "^11.3.3",
|
|
51
|
+
"glob": "^10.5.0",
|
|
52
|
+
"kleur": "^3.0.3",
|
|
53
|
+
"ora": "^9.3.0",
|
|
54
|
+
"prompts": "^2.4.2"
|
|
55
|
+
},
|
|
56
|
+
"devDependencies": {
|
|
57
|
+
"@types/fs-extra": "^11.0.4",
|
|
58
|
+
"@types/node": "^25.0.3",
|
|
59
|
+
"@types/prompts": "^2.4.9",
|
|
60
|
+
"tsup": "^8.5.1",
|
|
61
|
+
"tsx": "^4.21.0",
|
|
62
|
+
"typescript": "^5.9.3"
|
|
63
|
+
}
|
|
64
|
+
}
|