create-next-pro-cli 0.1.25 → 0.1.27

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.
Files changed (107) hide show
  1. package/README.md +205 -292
  2. package/create-next-pro-completion.sh +8 -38
  3. package/create-next-pro-completion.zsh +13 -0
  4. package/dist/bin.bun.js +1127 -628
  5. package/dist/bin.node.js +1170 -617
  6. package/dist/bin.node.js.map +1 -1
  7. package/dist/create-next-pro +35 -6
  8. package/package.json +49 -27
  9. package/templates/Projects/default/.env.example +17 -0
  10. package/templates/Projects/default/.github/workflows/quality.yml +24 -0
  11. package/templates/Projects/default/.gitignore.template +47 -0
  12. package/templates/Projects/default/.prettierignore +3 -0
  13. package/templates/Projects/default/README.md +66 -21
  14. package/templates/Projects/default/bun.lock +1152 -0
  15. package/templates/Projects/default/eslint.config.mjs +27 -11
  16. package/templates/Projects/default/messages/en/_global_ui.json +23 -10
  17. package/templates/Projects/default/messages/en.ts +17 -2
  18. package/templates/Projects/default/messages/fr/_global_ui.json +23 -10
  19. package/templates/Projects/default/messages/fr.ts +17 -2
  20. package/templates/Projects/default/next.config.ts +43 -3
  21. package/templates/Projects/default/package.json +42 -24
  22. package/templates/Projects/default/playwright.config.ts +26 -0
  23. package/templates/Projects/default/pnpm-workspace.yaml +5 -0
  24. package/templates/Projects/default/public/{cnp-logo.svg → logo.svg} +1 -1
  25. package/templates/Projects/default/src/app/[locale]/(public)/layout.tsx +8 -1
  26. package/templates/Projects/default/src/app/[locale]/(public)/login/page.tsx +8 -0
  27. package/templates/Projects/default/src/app/[locale]/(public)/register/page.tsx +8 -0
  28. package/templates/Projects/default/src/app/[locale]/(user)/dashboard/error.tsx +25 -0
  29. package/templates/Projects/default/src/app/[locale]/(user)/dashboard/loading.tsx +5 -0
  30. package/templates/Projects/default/src/app/[locale]/(user)/{Dashboard → dashboard}/page.tsx +1 -1
  31. package/templates/Projects/default/src/app/[locale]/(user)/layout.tsx +24 -2
  32. package/templates/Projects/default/src/app/[locale]/(user)/settings/loading.tsx +5 -0
  33. package/templates/Projects/default/src/app/[locale]/(user)/{Settings → settings}/page.tsx +1 -2
  34. package/templates/Projects/default/src/app/[locale]/(user)/userInfo/loading.tsx +5 -0
  35. package/templates/Projects/default/src/app/[locale]/(user)/{UserInfo → userInfo}/page.tsx +1 -2
  36. package/templates/Projects/default/src/app/[locale]/layout.tsx +34 -10
  37. package/templates/Projects/default/src/app/[locale]/loading.tsx +0 -9
  38. package/templates/Projects/default/src/app/[locale]/not-found.tsx +6 -15
  39. package/templates/Projects/default/src/app/[locale]/page.tsx +10 -1
  40. package/templates/Projects/default/src/app/api/auth/[...nextauth]/route.ts +8 -60
  41. package/templates/Projects/default/src/app/not-found.tsx +1 -1
  42. package/templates/Projects/default/src/app/sitemap.ts +2 -2
  43. package/templates/Projects/default/src/app/styles/globals.css +166 -113
  44. package/templates/Projects/default/src/auth.ts +20 -0
  45. package/templates/Projects/default/src/config.ts +3 -3
  46. package/templates/Projects/default/src/env.ts +65 -0
  47. package/templates/Projects/default/src/lib/i18n/messages.ts +8 -0
  48. package/templates/Projects/default/src/lib/i18n/request.ts +2 -16
  49. package/templates/Projects/default/src/lib/security/csp.ts +16 -0
  50. package/templates/Projects/default/src/lib/utils.ts +2 -1
  51. package/templates/Projects/default/src/proxy.ts +13 -0
  52. package/templates/Projects/default/src/ui/_global/BackButton.tsx +4 -2
  53. package/templates/Projects/default/src/ui/_global/Button.tsx +3 -8
  54. package/templates/Projects/default/src/ui/_global/GlobalHeader.tsx +10 -28
  55. package/templates/Projects/default/src/ui/_global/GlobalMain.tsx +1 -1
  56. package/templates/Projects/default/src/ui/_global/LocaleSwitcher.tsx +9 -10
  57. package/templates/Projects/default/src/ui/_global/PublicNav.tsx +51 -17
  58. package/templates/Projects/default/src/ui/_global/ThemeToggle.tsx +45 -39
  59. package/templates/Projects/default/src/ui/_global/UserNav.tsx +6 -6
  60. package/templates/Projects/default/src/ui/_home/page-ui.tsx +5 -7
  61. package/templates/Projects/default/src/ui/{Dashboard → dashboard}/LogoutButton.tsx +9 -7
  62. package/templates/Projects/default/src/ui/{Dashboard → dashboard}/StatsCard.tsx +4 -4
  63. package/templates/Projects/default/src/ui/{Dashboard → dashboard}/page-ui.tsx +7 -8
  64. package/templates/Projects/default/src/ui/login/page-ui.tsx +36 -0
  65. package/templates/Projects/default/src/ui/register/page-ui.tsx +38 -0
  66. package/templates/Projects/default/src/ui/settings/page-ui.tsx +15 -0
  67. package/templates/Projects/default/src/ui/userInfo/page-ui.tsx +15 -0
  68. package/templates/Projects/default/tailwind.config.ts +81 -1
  69. package/templates/Projects/default/tests/consumer/validate-template.ts +66 -0
  70. package/templates/Projects/default/tests/e2e/template-remediation.playwright.ts +106 -0
  71. package/templates/Projects/default/tests/rendering/verify-rendering.ts +56 -0
  72. package/templates/Projects/default/tests/unit/csp.test.ts +19 -0
  73. package/templates/Projects/default/tests/unit/env.test.ts +76 -0
  74. package/templates/Projects/default/tsconfig.json +6 -6
  75. package/templates/Projects/default/messages/getMergedMessages.ts +0 -31
  76. package/templates/Projects/default/middleware.ts +0 -11
  77. package/templates/Projects/default/src/app/[locale]/(public)/Login/page.tsx +0 -6
  78. package/templates/Projects/default/src/app/[locale]/(public)/Register/page.tsx +0 -6
  79. package/templates/Projects/default/src/app/[locale]/(user)/Dashboard/error.tsx +0 -38
  80. package/templates/Projects/default/src/app/[locale]/(user)/Dashboard/loading.tsx +0 -10
  81. package/templates/Projects/default/src/app/[locale]/(user)/Settings/loading.tsx +0 -17
  82. package/templates/Projects/default/src/app/[locale]/(user)/UserInfo/loading.tsx +0 -17
  83. package/templates/Projects/default/src/app/api/auth/post-login/route.ts +0 -26
  84. package/templates/Projects/default/src/app/api/hello/route.ts +0 -5
  85. package/templates/Projects/default/src/app/layout.tsx +0 -11
  86. package/templates/Projects/default/src/app/page.tsx +0 -6
  87. package/templates/Projects/default/src/auth.config.ts +0 -0
  88. package/templates/Projects/default/src/lib/auth/disconnect.ts +0 -11
  89. package/templates/Projects/default/src/lib/auth/isConnected.ts +0 -18
  90. package/templates/Projects/default/src/lib/sample/example.ts +0 -3
  91. package/templates/Projects/default/src/lib/sample/index.ts +0 -3
  92. package/templates/Projects/default/src/ui/Login/page-ui.tsx +0 -22
  93. package/templates/Projects/default/src/ui/Register/page-ui.tsx +0 -26
  94. package/templates/Projects/default/src/ui/Settings/page-ui.tsx +0 -17
  95. package/templates/Projects/default/src/ui/UserInfo/page-ui.tsx +0 -17
  96. /package/templates/Projects/default/messages/en/{Dashboard.json → dashboard.json} +0 -0
  97. /package/templates/Projects/default/messages/en/{Login.json → login.json} +0 -0
  98. /package/templates/Projects/default/messages/en/{Register.json → register.json} +0 -0
  99. /package/templates/Projects/default/messages/en/{Settings.json → settings.json} +0 -0
  100. /package/templates/Projects/default/messages/en/{UserInfo.json → userInfo.json} +0 -0
  101. /package/templates/Projects/default/messages/fr/{Dashboard.json → dashboard.json} +0 -0
  102. /package/templates/Projects/default/messages/fr/{Login.json → login.json} +0 -0
  103. /package/templates/Projects/default/messages/fr/{Register.json → register.json} +0 -0
  104. /package/templates/Projects/default/messages/fr/{Settings.json → settings.json} +0 -0
  105. /package/templates/Projects/default/messages/fr/{UserInfo.json → userInfo.json} +0 -0
  106. /package/templates/Projects/default/public/{cnp-logo.png → logo.png} +0 -0
  107. /package/templates/Projects/default/src/ui/{Dashboard → dashboard}/WelcomeCard.tsx +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/addComponent.ts","../src/lib/utils.ts","../src/lib/addPage.ts","../src/lib/rmPage.ts","../src/lib/addLib.ts","../src/lib/addApi.ts","../src/scaffold.ts","../src/lib/helper/consoleColor.ts","../src/lib/createProject.ts","../src/lib/createProjectWithPrompt.ts","../src/lib/addLanguage.ts","../src/lib/addText.ts","../bin.node.ts"],"sourcesContent":["// src/index.ts\n\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport prompts from \"prompts\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, resolve } from \"node:path\";\n\nimport { addComponent } from \"./lib/addComponent\";\nimport { addPage } from \"./lib/addPage\";\nimport { rmPage } from \"./lib/rmPage\";\nimport { addLib } from \"./lib/addLib\";\nimport { addApi } from \"./lib/addApi\";\nimport { createProject } from \"./lib/createProject\";\nimport { createProjectWithPrompt } from \"./lib/createProjectWithPrompt\";\nimport { addLanguage } from \"./lib/addLanguage\";\nimport { addText } from \"./lib/addText\";\n\ntype Cfg = {\n version: 1;\n shell: \"bash\" | \"zsh\";\n completionInstalled: boolean;\n createdAt: string;\n updatedAt: string;\n};\n\nconst CONFIG_DIR = process.env.XDG_CONFIG_HOME\n ? path.join(process.env.XDG_CONFIG_HOME, \"create-next-pro\")\n : path.join(os.homedir(), \".config\", \"create-next-pro\");\nconst CONFIG_FILE = path.join(CONFIG_DIR, \"config.json\");\n\nfunction readCfg(): Cfg | null {\n try {\n return JSON.parse(fs.readFileSync(CONFIG_FILE, \"utf8\")) as Cfg;\n } catch {\n return null;\n }\n}\nfunction writeCfg(cfg: Cfg) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true });\n fs.writeFileSync(CONFIG_FILE, JSON.stringify(cfg, null, 2));\n}\nfunction rcFile(shell: \"bash\" | \"zsh\") {\n return path.join(os.homedir(), shell === \"zsh\" ? \".zshrc\" : \".bashrc\");\n}\nfunction ensureLineInRc(file: string, line: string) {\n try {\n const cur = fs.existsSync(file) ? fs.readFileSync(file, \"utf8\") : \"\";\n if (!cur.includes(line)) fs.appendFileSync(file, `\\n${line}\\n`);\n } catch {\n /* ignore */\n }\n}\nasync function installCompletion(shell: \"bash\" | \"zsh\") {\n // read script from package\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const completionSrc = path.resolve(\n __dirname,\n \"../create-next-pro-completion.sh\",\n );\n const completionDst = path.join(CONFIG_DIR, \"completion.sh\");\n fs.mkdirSync(CONFIG_DIR, { recursive: true });\n fs.copyFileSync(completionSrc, completionDst);\n ensureLineInRc(rcFile(shell), `source \"${completionDst}\"`);\n}\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst packageJsonPath = resolve(__dirname, \"../package.json\");\nconst packageJson = fs.readFileSync(packageJsonPath, \"utf8\");\n\nasync function onboarding(): Promise<Cfg> {\n const pkg = JSON.parse(packageJson);\n console.log(`🚀 Welcome to create-next-pro v${pkg.version}\\n`);\n const res = await prompts(\n [\n {\n type: \"select\",\n name: \"shell\",\n message: \"Which shell do you use?\",\n choices: [\n { title: \"zsh\", value: \"zsh\" },\n { title: \"bash\", value: \"bash\" },\n ],\n initial: (os.userInfo().shell || \"\").includes(\"zsh\") ? 0 : 1,\n },\n {\n type: \"toggle\",\n name: \"completion\",\n message: \"Install autocompletion?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n ],\n { onCancel: () => process.exit(1) },\n );\n\n const cfg: Cfg = {\n version: 1,\n shell: res.shell,\n completionInstalled: !!res.completion,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n if (cfg.completionInstalled) await installCompletion(cfg.shell);\n writeCfg(cfg);\n console.log(\"\\n✅ Configuration saved.\");\n console.log(\"you can now use the CLI ! ex : \");\n console.log(\" Without prompt (will change in future) :\");\n console.log(\" create-next-pro my-next-project\");\n console.log(\" With prompt :\");\n console.log(\" create-next-pro\");\n console.log(\n \"For more information, visit: https://github.com/Rising-Corporation/create-next-pro-cli\",\n );\n console.log(\"Happy coding! 🎉\");\n return cfg;\n}\nfunction showHelp() {\n console.log(`create-next-pro\n\nUsage:\n create-next-pro <project-name> [--force]\n create-next-pro addpage [options]\n create-next-pro addcomponent [options]\n create-next-pro addlib [name]\n create-next-pro addapi [name]\n create-next-pro addlanguage [locale]\n create-next-pro addtext <path> [text]\n create-next-pro rmpage [options]\n\nOptions:\n --help Show this help message\n --reconfigure Run the configuration assistant again\n`);\n}\n\nfunction showVersion() {\n const pkg = JSON.parse(packageJson);\n console.log(`v${pkg.version}`);\n}\n\n/**\n * Main CLI entry point for create-next-pro.\n *\n * Note: For now, the project behaves as if --force is always enabled and no creation prompt is taken into account.\n * All actions are performed directly without confirmation.\n */\nexport async function main() {\n let args: string[];\n if (typeof Bun !== \"undefined\") {\n args = Bun.argv.slice(2);\n } else if (typeof process !== \"undefined\" && process.argv) {\n args = process.argv.slice(2);\n } else {\n args = [];\n }\n\n if (args.includes(\"--help\")) return showHelp();\n if (args.includes(\"--version\") || args.includes(\"-v\")) return showVersion();\n if (args.includes(\"--reconfigure\") || !readCfg()) {\n await onboarding();\n return;\n }\n\n const force = args.includes(\"--force\");\n // For now, --force is always considered enabled but do not overwrite existing projects\n // WARNING: if you enable --force it will overwrite existing projects. This is a temporary setting for development purposes.\n // const force = true;\n\n // If addpage is called without options, add default flags -LPl\n if (args[0] === \"addpage\" && args.length === 1) {\n args.push(\"-LPl\");\n }\n\n /**\n * Handle addcomponent command: create a component in the correct location and update translation JSON.\n */\n if (args[0] === \"addcomponent\") {\n addComponent(args);\n return;\n }\n\n /**\n * Handle addpage command: create a page (nested or not) and update translation JSON.\n */\n if (args[0] === \"addpage\") {\n addPage(args);\n return;\n }\n\n /**\n * Handle addlib command: scaffold a library folder and files.\n */\n if (args[0] === \"addlib\") {\n addLib(args);\n return;\n }\n\n /**\n * Handle addapi command: scaffold an API route.\n */\n if (args[0] === \"addapi\") {\n addApi(args);\n return;\n }\n\n if (args[0] === \"addlanguage\") {\n await addLanguage(args);\n return;\n }\n\n if (args[0] === \"addtext\") {\n await addText(args);\n return;\n }\n\n /**\n * Handle rmpage command: remove a page and all related files/folders.\n */\n if (args[0] === \"rmpage\") {\n rmPage(args);\n return;\n }\n\n /**\n * Handle direct project creation if a name argument is provided.\n */\n const nameArg = args.find((arg) => !arg.startsWith(\"--\"));\n\n if (nameArg) {\n createProject(nameArg, force);\n return;\n }\n\n /**\n * Interactive prompt for project creation (not currently used, see note above).\n */\n await createProjectWithPrompt();\n}\n","import { join } from \"node:path\";\nimport { mkdir, readFile, writeFile, readdir } from \"node:fs/promises\";\nimport prompts from \"prompts\";\n\nimport { capitalize, loadConfig } from \"./utils\";\n\nimport { existsSync, statSync } from \"node:fs\";\n\nexport async function addComponent(args: string[]) {\n let componentName = args[1];\n let pageScope = null;\n let pageIndex = args.findIndex((arg) => arg === \"-P\" || arg === \"--page\");\n if (pageIndex !== -1 && args[pageIndex + 1]) {\n pageScope = args[pageIndex + 1];\n }\n\n // Handle nested pageScope (e.g. ParentPage.ChildPage)\n let nestedPath = null;\n if (pageScope && pageScope.includes(\".\")) {\n nestedPath = join(...pageScope.split(\".\"));\n }\n\n if (!componentName || componentName.startsWith(\"-\")) {\n // Si le nom n'est pas fourni ou est une option, demander via prompt\n const response = await prompts.prompt({\n type: \"text\",\n name: \"componentName\",\n message: \"🧩 Component name to add:\",\n validate: (name: string) => (name ? true : \"Component name is required\"),\n });\n componentName = response.componentName;\n }\n\n const config = await loadConfig();\n if (!config) {\n console.error(\n \"❌ Configuration file cnp.config.json not found. Run this command from the project root.\",\n );\n return;\n }\n const useI18n = !!config.useI18n;\n\n const componentNameUpper = capitalize(componentName);\n const templatePath = join(\n new URL(\"..\", import.meta.url).pathname,\n \"templates\",\n \"Component\",\n );\n let messagesPath: string | null = null;\n if (useI18n) {\n messagesPath = join(process.cwd(), \"messages\");\n if (!existsSync(messagesPath)) {\n console.error(\n \"❌ Messages directory missing. Ensure i18n was configured.\",\n );\n return;\n }\n }\n\n // Determine target path for the component\n let componentTargetPath;\n let translationKey;\n if (pageScope) {\n if (nestedPath) {\n componentTargetPath = join(process.cwd(), \"src\", \"ui\", nestedPath);\n translationKey = pageScope;\n } else {\n componentTargetPath = join(process.cwd(), \"src\", \"ui\", pageScope);\n translationKey = pageScope;\n }\n } else {\n componentTargetPath = join(process.cwd(), \"src\", \"ui\", \"_global\");\n translationKey = \"_global_ui\";\n }\n if (!existsSync(componentTargetPath)) {\n await mkdir(componentTargetPath, { recursive: true });\n }\n const componentFile = join(componentTargetPath, `${componentNameUpper}.tsx`);\n\n // Read and adapt the TSX template\n const templateComponentPath = join(templatePath, \"Component.tsx\");\n if (existsSync(templateComponentPath)) {\n let content = await readFile(templateComponentPath, \"utf-8\");\n // Remplacement du nom du component et de la clé de traduction\n content = content\n .replace(/Component/g, componentNameUpper)\n .replace(/componentPage/g, translationKey);\n await writeFile(componentFile, content);\n console.log(`📄 File created: ${componentFile}`);\n } else {\n console.error(\n \"❌ Template Component.tsx introuvable :\",\n templateComponentPath,\n );\n }\n\n if (useI18n && messagesPath) {\n const entries = await readdir(messagesPath, { withFileTypes: true });\n const langDirs = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n const jsonTemplate = join(templatePath, \"component.json\");\n if (!existsSync(jsonTemplate)) {\n console.error(\"❌ Template component.json not found:\", jsonTemplate);\n return;\n }\n const jsonContent = await readFile(jsonTemplate, \"utf-8\");\n const parsed = JSON.parse(jsonContent);\n\n for (const locale of langDirs) {\n // Only process if messages/<locale> is a directory\n const localeDir = join(messagesPath, locale);\n if (!existsSync(localeDir) || !statSync(localeDir).isDirectory())\n continue;\n let jsonTarget;\n if (pageScope) {\n jsonTarget = join(messagesPath, locale, `${pageScope}.json`);\n } else {\n jsonTarget = join(messagesPath, locale, `_global_ui.json`);\n }\n\n let current: Record<string, any> = {};\n if (existsSync(jsonTarget)) {\n const jsonFile = await readFile(jsonTarget, \"utf-8\");\n current = JSON.parse(jsonFile) as Record<string, any>;\n }\n current[componentNameUpper] = parsed;\n await writeFile(jsonTarget, JSON.stringify(current, null, 2));\n console.log(`📄 File updated: ${jsonTarget}`);\n }\n } else {\n console.log(\"ℹ️ Skipping translation entries; next-intl not enabled.\");\n }\n\n console.log(\n `✅ Component \"${componentNameUpper}\" added ${\n pageScope ? `to page ${pageScope}` : \"globally\"\n }${useI18n ? \" with localized messages\" : \"\"}.`,\n );\n}\n","import { readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\n/**\n * Capitalize the first letter of a string.\n */\nexport function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport interface CNPConfig {\n useI18n?: boolean;\n [key: string]: any;\n}\n\n/**\n * Load CLI configuration from the project root.\n * Returns null if the configuration file is missing or invalid.\n */\nexport async function loadConfig(): Promise<CNPConfig | null> {\n const configPath = join(process.cwd(), \"cnp.config.json\");\n if (!existsSync(configPath)) return null;\n try {\n const raw = await readFile(configPath, \"utf-8\");\n return JSON.parse(raw) as CNPConfig;\n } catch {\n return null;\n }\n}\n\n/**\n * Map a key to its corresponding file name for page/component templates.\n * @param key string\n * @returns file name string\n */\nexport function toFileName(key: string): string {\n switch (key) {\n case \"layout\":\n return \"layout.tsx\";\n case \"page\":\n return \"page.tsx\";\n case \"loading\":\n return \"loading.tsx\";\n case \"not-found\":\n return \"not-found.tsx\";\n case \"error\":\n return \"error.tsx\";\n case \"global-error\":\n return \"global-error.tsx\";\n case \"route\":\n return \"route.ts\";\n case \"template\":\n return \"template.tsx\";\n case \"default\":\n return \"default.tsx\";\n default:\n return `${key}.tsx`;\n }\n}\n","import { join } from \"node:path\";\nimport { mkdir, readFile, writeFile, readdir } from \"node:fs/promises\";\nimport prompts from \"prompts\";\n\nimport { capitalize, toFileName, loadConfig } from \"./utils\";\n\nimport { existsSync, statSync } from \"node:fs\";\n\nexport async function addPage(args: string[]) {\n let pageName = args[1];\n if (!pageName || pageName.startsWith(\"-\")) {\n const response = await prompts.prompt({\n type: \"text\",\n name: \"pageName\",\n message: \"📝 Page name to add:\",\n validate: (name: string) => (name ? true : \"Page name is required\"),\n });\n pageName = response.pageName;\n }\n\n // Handle nested pages\n let parentName = null;\n let childName = null;\n if (pageName.includes(\".\")) {\n [parentName, childName] = pageName.split(\".\");\n }\n\n let shortFlags = args.find((arg) => /^-[A-Za-z]+$/.test(arg));\n let longFlags = new Set(args.filter((a) => a.startsWith(\"--\")));\n const flags = new Set<string>();\n\n if (!shortFlags && Array.from(longFlags).length === 0) {\n shortFlags = \"-LPl\";\n }\n\n if (shortFlags) {\n for (const char of shortFlags.slice(1)) {\n switch (char) {\n case \"L\":\n flags.add(\"layout\");\n break;\n case \"P\":\n flags.add(\"page\");\n break;\n case \"l\":\n flags.add(\"loading\");\n break;\n case \"n\":\n flags.add(\"not-found\");\n break;\n case \"e\":\n flags.add(\"error\");\n break;\n case \"g\":\n flags.add(\"global-error\");\n break;\n case \"r\":\n flags.add(\"route\");\n break;\n case \"t\":\n flags.add(\"template\");\n break;\n case \"d\":\n flags.add(\"default\");\n break;\n }\n }\n }\n\n for (const flag of [\n \"layout\",\n \"page\",\n \"loading\",\n \"not-found\",\n \"error\",\n \"global-error\",\n \"route\",\n \"template\",\n \"default\",\n ]) {\n if (longFlags.has(\"--\" + flag)) flags.add(flag);\n }\n\n const config = await loadConfig();\n if (!config) {\n console.error(\n \"❌ Configuration file cnp.config.json not found. Run this command from the project root.\",\n );\n return;\n }\n const useI18n = !!config.useI18n;\n\n const srcSegments = [\"src\", \"app\"];\n if (useI18n) srcSegments.push(\"[locale]\");\n const srcPath = join(process.cwd(), ...srcSegments);\n if (!existsSync(srcPath)) {\n console.error(`❌ Expected directory not found: ${srcPath}`);\n return;\n }\n\n let messagesPath: string | null = null;\n let locales: string[] = [];\n if (useI18n) {\n messagesPath = join(process.cwd(), \"messages\");\n if (!existsSync(messagesPath)) {\n console.error(\n \"❌ Messages directory missing. Ensure i18n was configured.\",\n );\n return;\n }\n const entries = await readdir(messagesPath, { withFileTypes: true });\n locales = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n }\n\n const templatePath = join(\n new URL(\"..\", import.meta.url).pathname,\n \"templates\",\n \"Page\",\n );\n\n // Create folders/files for nested or simple page\n let uiPageDir, localePagePath, jsonFileName;\n if (parentName && childName) {\n uiPageDir = join(process.cwd(), \"src\", \"ui\", parentName, childName);\n localePagePath = join(srcPath, parentName, childName);\n jsonFileName = parentName;\n } else {\n uiPageDir = join(process.cwd(), \"src\", \"ui\", pageName);\n localePagePath = join(srcPath, pageName);\n jsonFileName = pageName;\n }\n if (!existsSync(uiPageDir)) {\n await mkdir(uiPageDir, { recursive: true });\n }\n const uiPageFile = join(uiPageDir, \"page-ui.tsx\");\n const uiPageTemplate = join(templatePath, \"page-ui.tsx\");\n if (existsSync(uiPageTemplate)) {\n let uiContent = await readFile(uiPageTemplate, \"utf-8\");\n uiContent = uiContent\n .replace(/template/g, childName || pageName)\n .replace(/Template/g, capitalize(childName || pageName));\n await writeFile(uiPageFile, uiContent);\n console.log(`📄 File created: ${uiPageFile}`);\n } else {\n console.warn(\n \"⚠️ Missing template file: page-ui.tsx at path:\",\n uiPageTemplate,\n );\n }\n if (!existsSync(localePagePath)) {\n await mkdir(localePagePath, { recursive: true });\n }\n for (const flag of flags) {\n const filename = toFileName(flag);\n const src = join(templatePath, filename);\n const dst = join(localePagePath, filename);\n if (!existsSync(src)) {\n console.warn(`⚠️ Missing template file: ${filename} at path: ${src}`);\n continue;\n }\n const content = await readFile(src, \"utf-8\");\n const replaced = content\n .replace(/template/g, childName || pageName)\n .replace(/Template/g, capitalize(childName || pageName));\n await writeFile(dst, replaced);\n console.log(`📄 File created: ${dst}`);\n }\n\n if (useI18n && messagesPath) {\n const jsonTemplate = join(templatePath, \"page.json\");\n if (!existsSync(jsonTemplate)) {\n console.warn(\"⚠️ Missing template: page.json at path:\", jsonTemplate);\n } else {\n const content = await readFile(jsonTemplate, \"utf-8\");\n const replaced = content\n .replace(/template/g, childName || pageName)\n .replace(/Template/g, capitalize(childName || pageName));\n for (const locale of locales) {\n // Only process if messages/<locale> is a directory\n const localeDir = join(messagesPath, locale);\n if (!existsSync(localeDir) || !statSync(localeDir).isDirectory())\n continue;\n const jsonTarget = join(messagesPath, locale, `${jsonFileName}.json`);\n let current: Record<string, any> = {};\n if (existsSync(jsonTarget)) {\n const jsonFile = await readFile(jsonTarget, \"utf-8\");\n try {\n current = JSON.parse(jsonFile) as Record<string, any>;\n } catch {\n current = {};\n }\n }\n if (parentName && childName) {\n current[childName] = JSON.parse(replaced);\n } else {\n // fichier simple\n current = JSON.parse(replaced);\n }\n await writeFile(jsonTarget, JSON.stringify(current, null, 2));\n console.log(`📄 File created: ${jsonTarget}`);\n }\n }\n } else {\n console.log(\"ℹ️ Skipping translation templates; next-intl not enabled.\");\n }\n\n console.log(\n `✅ Page \"${pageName}\" with templates added${\n useI18n ? \" for each locale\" : \"\"\n }.`,\n );\n}\n","import { join } from \"node:path\";\nimport { writeFile, readdir } from \"node:fs/promises\";\nimport prompts from \"prompts\";\nimport { existsSync } from \"node:fs\";\n\nexport async function rmPage(args: string[]) {\n let pageName = args[1];\n if (!pageName || pageName.startsWith(\"-\")) {\n const response = await prompts.prompt({\n type: \"text\",\n name: \"pageName\",\n message: \"🗑️ Page name to remove:\",\n validate: (name: string) => (name ? true : \"Page name is required\"),\n });\n pageName = response.pageName;\n }\n\n // Remove translation files messages/<lang>/<PageName>.json\n const messagesPath = join(process.cwd(), \"messages\"); // No template path used here, so no change needed\n const entries = await readdir(messagesPath, { withFileTypes: true });\n const langDirs = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n for (const locale of langDirs) {\n const jsonTarget = join(messagesPath, locale, `${pageName}.json`);\n if (existsSync(jsonTarget)) {\n await writeFile(jsonTarget, \"\");\n await import(\"node:child_process\").then((cp) =>\n cp.execSync(`rm -f '${jsonTarget}'`),\n );\n console.log(`🗑️ Deleted: ${jsonTarget}`);\n }\n }\n\n // Remove folder src/ui/<PageName>\n const uiPageDir = join(process.cwd(), \"src\", \"ui\", pageName);\n if (existsSync(uiPageDir)) {\n await import(\"node:child_process\").then((cp) =>\n cp.execSync(`rm -rf '${uiPageDir}'`),\n );\n console.log(`🗑️ Deleted: ${uiPageDir}`);\n }\n\n // Remove folder src/app/[locale]/<PageName>\n const appLocaleDir = join(process.cwd(), \"src\", \"app\", \"[locale]\", pageName);\n if (existsSync(appLocaleDir)) {\n await import(\"node:child_process\").then((cp) =>\n cp.execSync(`rm -rf '${appLocaleDir}'`),\n );\n console.log(`🗑️ Deleted: ${appLocaleDir}`);\n }\n\n console.log(`✅ Page \"${pageName}\" deleted.`);\n}\n","import { join } from \"node:path\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport prompts from \"prompts\";\nimport { existsSync } from \"node:fs\";\n\nimport { loadConfig, capitalize } from \"./utils\";\n\nexport async function addLib(args: string[]) {\n let libArg = args[1];\n if (!libArg || libArg.startsWith(\"-\")) {\n const response = await prompts.prompt({\n type: \"text\",\n name: \"libArg\",\n message: \"📦 Lib name to add:\",\n validate: (name: string) => (name ? true : \"Lib name is required\"),\n });\n libArg = response.libArg;\n }\n\n let libName = libArg;\n let fileName: string | null = null;\n if (libArg.includes(\".\")) {\n [libName, fileName] = libArg.split(\".\");\n }\n\n const config = await loadConfig();\n if (!config) {\n console.error(\n \"❌ Configuration file cnp.config.json not found. Run this command from the project root.\",\n );\n return;\n }\n\n const libDir = join(process.cwd(), \"src\", \"lib\", libName);\n if (!existsSync(libDir)) {\n await mkdir(libDir, { recursive: true });\n }\n\n const templateDir = join(\n new URL(\"..\", import.meta.url).pathname,\n \"templates\",\n \"Lib\",\n );\n const indexTemplate = join(templateDir, \"index.ts\");\n const fileTemplate = join(templateDir, \"item.ts\");\n\n const indexPath = join(libDir, \"index.ts\");\n if (!existsSync(indexPath)) {\n if (existsSync(indexTemplate)) {\n const content = await readFile(indexTemplate, \"utf-8\");\n await writeFile(indexPath, content);\n } else {\n await writeFile(indexPath, \"export {}\\n\");\n }\n console.log(`📄 File created: ${indexPath}`);\n }\n\n if (fileName) {\n const filePath = join(libDir, `${fileName}.ts`);\n if (!existsSync(filePath)) {\n if (existsSync(fileTemplate)) {\n let content = await readFile(fileTemplate, \"utf-8\");\n content = content\n .replace(/template/g, fileName)\n .replace(/Template/g, capitalize(fileName));\n await writeFile(filePath, content);\n } else {\n await writeFile(\n filePath,\n `export function ${fileName}() {\\n // TODO: implement\\n}\\n`,\n );\n }\n console.log(`📄 File created: ${filePath}`);\n }\n\n let indexContent = await readFile(indexPath, \"utf-8\");\n const importLine = `import { ${fileName} } from \"./${fileName}\";`;\n const importRegex = new RegExp(\n `import\\\\s*{\\\\s*${fileName}\\\\s*}\\\\s*from\\\\s*\"\\\\./${fileName}\";`,\n );\n const exportRegex = /export\\s*{([^}]*)}/m;\n\n const imports: string[] = [];\n const exportsSet: string[] = [];\n for (const line of indexContent.split(\"\\n\")) {\n if (line.startsWith(\"import\")) {\n imports.push(line);\n } else if (line.startsWith(\"export\")) {\n const match = line.match(exportRegex);\n if (match && match[1]) {\n exportsSet.push(\n ...match[1]\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean),\n );\n }\n }\n }\n\n if (!imports.some((l) => importRegex.test(l))) {\n imports.push(importLine);\n }\n if (!exportsSet.includes(fileName)) {\n exportsSet.push(fileName);\n }\n\n indexContent =\n imports.join(\"\\n\") + \"\\n\\nexport { \" + exportsSet.join(\", \") + \" };\\n\";\n await writeFile(indexPath, indexContent);\n console.log(`✏️ Updated index: ${indexPath}`);\n }\n\n console.log(\n `✅ Lib \"${libName}\"${fileName ? ` with module ${fileName}` : \"\"} added.`,\n );\n}\n","import { join } from \"node:path\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport prompts from \"prompts\";\nimport { existsSync } from \"node:fs\";\n\nimport { loadConfig } from \"./utils\";\n\nexport async function addApi(args: string[]) {\n let apiName = args[1];\n if (!apiName || apiName.startsWith(\"-\")) {\n const response = await prompts.prompt({\n type: \"text\",\n name: \"apiName\",\n message: \"🔌 API route name to add:\",\n validate: (name: string) => (name ? true : \"API route name is required\"),\n });\n apiName = response.apiName;\n }\n\n const config = await loadConfig();\n if (!config) {\n console.error(\n \"❌ Configuration file cnp.config.json not found. Run this command from the project root.\",\n );\n return;\n }\n\n const apiDir = join(process.cwd(), \"src\", \"app\", \"api\", apiName);\n if (!existsSync(apiDir)) {\n await mkdir(apiDir, { recursive: true });\n }\n\n const templateDir = join(\n new URL(\"..\", import.meta.url).pathname,\n \"templates\",\n \"Api\",\n );\n const routeTemplate = join(templateDir, \"route.ts\");\n const routePath = join(apiDir, \"route.ts\");\n\n if (!existsSync(routePath)) {\n if (existsSync(routeTemplate)) {\n let content = await readFile(routeTemplate, \"utf-8\");\n content = content.replace(/template/g, apiName);\n await writeFile(routePath, content);\n } else {\n await writeFile(\n routePath,\n `import { NextResponse } from \\\"next/server\\\";\\n\\nexport async function GET() {\\n return NextResponse.json({ message: \\\"Hello from ${apiName}\\\" });\\n}\\n`,\n );\n }\n console.log(`📄 File created: ${routePath}`);\n } else {\n console.log(`ℹ️ File already exists: ${routePath}`);\n }\n\n console.log(`✅ API route \"${apiName}\" added.`);\n}\n","// src/scaffold.ts\n\nimport { cp, mkdir, rm, writeFile, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { red, green, yellow, blue, cyan } from \"./lib/helper/consoleColor\";\n\n/**\n * Options for scaffolding a Next.js project.\n */\ninterface ScaffoldOptions {\n projectName: string;\n useTypescript: boolean;\n useEslint: boolean;\n useTailwind: boolean;\n useSrcDir: boolean;\n useTurbopack: boolean;\n useI18n: boolean;\n customAlias: boolean;\n importAlias: string;\n force?: boolean;\n}\n\n/**\n * Scaffold a new Next.js project based on provided options.\n *\n * - Copies the default template to the target directory\n * - Removes the target directory if it exists and --force is set\n * - Optionally customizes the structure in future (e.g. remove unused files)\n *\n * @param options ScaffoldOptions for the project\n */\nexport async function scaffoldProject(options: ScaffoldOptions) {\n const targetPath = join(process.cwd(), options.projectName);\n\n const __dirname = new URL(\".\", import.meta.url); // or :\n // const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const templatePath = join(\n fileURLToPath(__dirname),\n \"..\",\n \"templates\",\n \"Projects\",\n \"default\",\n );\n\n // Check if target directory exists\n if (existsSync(targetPath)) {\n if (options.force) {\n console.warn(\"⚠️ Target directory already exists, removing...\");\n await rm(targetPath, { recursive: true, force: true });\n } else {\n console.error(\n red(\"[X] Target directory already exists. Use --force to overwrite.\"),\n );\n process.exit(1);\n }\n }\n\n try {\n console.log(\"Creating project directory...\");\n await mkdir(targetPath, { recursive: true });\n\n console.log(\"Copying files from template...\");\n await cp(templatePath, targetPath, { recursive: true });\n\n // Apply configuration: add dependencies or files based on prompt choices\n const pkgPath = join(targetPath, \"package.json\");\n if (existsSync(pkgPath)) {\n const pkg = JSON.parse(await readFile(pkgPath, \"utf-8\"));\n pkg.dependencies = pkg.dependencies || {};\n if (options.useI18n) {\n pkg.dependencies[\"next-intl\"] =\n pkg.dependencies[\"next-intl\"] || \"^4.3.5\";\n }\n await writeFile(pkgPath, JSON.stringify(pkg, null, 2));\n }\n\n // Write CLI configuration to project root\n await writeFile(\n join(targetPath, \"cnp.config.json\"),\n JSON.stringify(options, null, 2),\n );\n\n console.log(\"Project setup complete!\");\n console.log(\"\");\n console.log(\"To get started:\");\n console.log(\" \" + green(`cd ${options.projectName}`));\n console.log(\"\");\n console.log(\n \"Then install dependencies and launch the dev server with your preferred tool:\",\n );\n\n console.log(\" \" + green(`bun install && bun dev`));\n console.log(\" \" + green(`npm install && npm run dev`));\n console.log(\" \" + green(`pnpm install && pnpm run dev`));\n console.log(\"\");\n console.log(\"Documentation and examples can be found at:\");\n console.log(\n \" \" +\n cyan(\"https://github.com/Rising-Corporation/create-next-pro-cli\"),\n );\n console.log(\n \"_-`'-_-'`_`'-_-'`_`'-_-'`_`'-_-'`_`'-_-'`_`'-_-'`_`'-_-'`_`'-_-'`-_\",\n );\n } catch (err) {\n // Affiche une croix ASCII et le texte en rouge si le terminal le supporte\n\n console.error(red(\"[X] Error during project creation:\"), err);\n process.exit(1);\n }\n}\n","const RED = \"\\x1b[31m\";\nconst GREEN = \"\\x1b[32m\";\nconst YELLOW = \"\\x1b[33m\";\nconst BLUE = \"\\x1b[34m\";\nconst CYAN = \"\\x1b[36m\";\nconst RESET = \"\\x1b[0m\";\n\nexport function red(text: string) {\n return RED + text + RESET;\n}\nexport function green(text: string) {\n return GREEN + text + RESET;\n}\nexport function yellow(text: string) {\n return YELLOW + text + RESET;\n}\nexport function blue(text: string) {\n return BLUE + text + RESET;\n}\nexport function cyan(text: string) {\n return CYAN + text + RESET;\n}\n","import { scaffoldProject } from \"../scaffold\";\nexport async function createProject(nameArg: string, force: boolean) {\n const response = {\n projectName: nameArg,\n useTypescript: true,\n useEslint: true,\n useTailwind: true,\n useSrcDir: true,\n useTurbopack: true,\n useI18n: true,\n customAlias: true,\n importAlias: \"@/*\",\n force,\n };\n\n console.log(`Creating project \"${response.projectName}\"...`);\n await scaffoldProject(response);\n}\n","import { scaffoldProject } from \"../scaffold\";\nimport prompts from \"prompts\";\nexport async function createProjectWithPrompt() {\n const response = await prompts.prompt([\n {\n type: \"text\",\n name: \"projectName\",\n message: \"Project name:\",\n initial: \"my-next-app\",\n },\n {\n type: \"toggle\",\n name: \"useTypescript\",\n message: \"✔ Use TypeScript?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useEslint\",\n message: \"✔ Use ESLint?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useTailwind\",\n message: \"✔ Use Tailwind CSS?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useSrcDir\",\n message: \"✔ Use `src/` directory?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useTurbopack\",\n message: \"✔ Use Turbopack for `next dev`?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useI18n\",\n message: \"✔ Use i18n with next-intl for translations?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"customAlias\",\n message: \"✔ Customize import alias (`@/*` by default)?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: (prev: boolean) => (prev ? \"text\" : null),\n name: \"importAlias\",\n message: \"✔ What import alias would you like?\",\n initial: \"@core/*\",\n },\n ]);\n\n console.log(\"\\nYour choices:\");\n console.log(response);\n\n await scaffoldProject(response);\n}\n","import { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport { cp, readFile, writeFile } from \"node:fs/promises\";\nimport prompts from \"prompts\";\n\nimport { loadConfig } from \"./utils\";\n\nfunction generateLocales(): string[] {\n const dn = new Intl.DisplayNames([\"en\"], { type: \"language\" });\n const locales: string[] = [];\n for (let i = 0; i < 26; i++) {\n for (let j = 0; j < 26; j++) {\n const code = String.fromCharCode(97 + i) + String.fromCharCode(97 + j);\n try {\n const name = dn.of(code);\n if (name && name.toLowerCase() !== code) {\n locales.push(code);\n }\n } catch {}\n }\n }\n return locales.sort();\n}\n\nexport async function addLanguage(args: string[]) {\n const config = await loadConfig();\n if (!config?.useI18n) {\n console.error(\"❌ i18n is not enabled in this project.\");\n return;\n }\n const messagesPath = join(process.cwd(), \"messages\");\n if (!existsSync(messagesPath)) {\n console.error(\"❌ Messages directory missing. Ensure i18n was configured.\");\n return;\n }\n\n const available = generateLocales();\n let locale = args[1];\n if (!locale || !available.includes(locale)) {\n const response = await prompts({\n type: \"autocomplete\",\n name: \"locale\",\n message: \"🌐 Locale to add:\",\n choices: available.map((l) => ({ title: l, value: l })),\n });\n locale = response.locale;\n }\n if (!locale) return;\n if (existsSync(join(messagesPath, locale))) {\n console.error(`❌ Locale ${locale} already exists.`);\n return;\n }\n\n const routingFile = join(process.cwd(), \"src\", \"lib\", \"i18n\", \"routing.ts\");\n if (!existsSync(routingFile)) {\n console.error(\"❌ routing.ts not found. Are you in project root?\");\n return;\n }\n const routingContent = await readFile(routingFile, \"utf-8\");\n const defaultMatch = routingContent.match(/defaultLocale:\\s*\"([^\"]+)\"/);\n const defaultLocale = defaultMatch ? defaultMatch[1] : null;\n if (!defaultLocale || !existsSync(join(messagesPath, defaultLocale))) {\n console.error(\"❌ Default locale not found.\");\n return;\n }\n\n await cp(join(messagesPath, defaultLocale), join(messagesPath, locale), {\n recursive: true,\n });\n console.log(`📄 Directory created: ${join(messagesPath, locale)}`);\n\n const localesMatch = routingContent.match(/locales:\\s*\\[([^\\]]*)\\]/);\n if (localesMatch) {\n const localesArr = localesMatch[1]\n .split(\",\")\n .map((s) => s.trim().replace(/[\"']/g, \"\"))\n .filter(Boolean);\n if (!localesArr.includes(locale)) {\n localesArr.push(locale);\n const newLocales = `locales: [${localesArr.map((l) => `\"${l}\"`).join(\", \" )}]`;\n const newContent = routingContent.replace(/locales:\\s*\\[[^\\]]*\\]/, newLocales);\n await writeFile(routingFile, newContent);\n console.log(`📄 File updated: ${routingFile}`);\n }\n }\n\n console.log(\n `✅ Locale \"${locale}\" added and copied from default locale \"${defaultLocale}\".`,\n );\n}\n","import { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport { readFile, writeFile, readdir } from \"node:fs/promises\";\n\nimport { loadConfig } from \"./utils\";\n\nfunction defaultText(key: string) {\n return key\n .replace(/_/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nexport async function addText(args: string[]) {\n const pathArg = args[1];\n if (!pathArg) {\n console.error(\"❌ Dot path parameter is required.\");\n return;\n }\n const providedText = args.slice(2).join(\" \");\n\n const config = await loadConfig();\n if (!config?.useI18n) {\n console.error(\"❌ i18n is not enabled in this project.\");\n return;\n }\n const messagesPath = join(process.cwd(), \"messages\");\n if (!existsSync(messagesPath)) {\n console.error(\"❌ Messages directory missing. Ensure i18n was configured.\");\n return;\n }\n\n const entries = await readdir(messagesPath, { withFileTypes: true });\n const locales = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n\n const [fileName, ...segments] = pathArg.split(\".\");\n if (!fileName || segments.length === 0) {\n console.error(\"❌ Invalid dot path provided.\");\n return;\n }\n const finalKey = segments[segments.length - 1];\n const text = providedText || defaultText(finalKey);\n\n for (const locale of locales) {\n const filePath = join(messagesPath, locale, `${fileName}.json`);\n let data: Record<string, any> = {};\n if (existsSync(filePath)) {\n const raw = await readFile(filePath, \"utf-8\");\n try {\n data = JSON.parse(raw) as Record<string, any>;\n } catch {}\n }\n let cursor = data;\n for (let i = 0; i < segments.length - 1; i++) {\n const seg = segments[i];\n if (!cursor[seg]) cursor[seg] = {};\n cursor = cursor[seg];\n }\n cursor[finalKey] = text;\n await writeFile(filePath, JSON.stringify(data, null, 2));\n console.log(`📄 File updated: ${filePath}`);\n }\n\n console.log(`✅ Text added at path \"${pathArg}\" with value \"${text}\".`);\n}\n","#!/usr/bin/env node\nimport { main } from \"./src/index\";\nmain();\n"],"mappings":"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","names":["prompts","fileURLToPath","join","readFile","existsSync","join","readFile","join","mkdir","readFile","writeFile","readdir","prompts","existsSync","statSync","prompts","join","readdir","mkdir","readFile","writeFile","join","writeFile","readdir","prompts","existsSync","cp","join","mkdir","readFile","writeFile","prompts","existsSync","prompts","join","existsSync","mkdir","readFile","writeFile","join","mkdir","readFile","writeFile","prompts","existsSync","prompts","join","existsSync","mkdir","readFile","writeFile","mkdir","writeFile","readFile","join","existsSync","join","__dirname","existsSync","mkdir","readFile","writeFile","prompts","join","existsSync","cp","readFile","writeFile","prompts","join","existsSync","prompts","readFile","cp","writeFile","join","existsSync","readFile","writeFile","readdir","join","existsSync","readdir","readFile","writeFile","__dirname","fileURLToPath","prompts"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/cli/onboarding.ts","../src/cli/completion.ts","../src/core/page-catalog.ts","../src/core/contracts.ts","../src/lib/addApi.ts","../src/lib/utils.ts","../src/runtime/node-context.ts","../src/core/project-paths.ts","../src/lib/addComponent.ts","../src/lib/addLanguage.ts","../src/lib/addLib.ts","../src/lib/addPage.ts","../src/lib/addText.ts","../src/lib/rmPage.ts","../src/cli/registry.ts","../src/scaffold.ts","../src/lib/helper/consoleColor.ts","../src/core/template-manifest.ts","../src/lib/createProject.ts","../src/lib/createProjectWithPrompt.ts","../bin.node.ts"],"sourcesContent":["import path from \"node:path\";\n\nimport { onboarding, readConfig } from \"./cli/onboarding\";\nimport { printCompletions } from \"./cli/completion\";\nimport { createCommandRegistry } from \"./cli/registry\";\nimport { CliError, type CliContext, type ExitCode } from \"./core/contracts\";\nimport { createProject } from \"./lib/createProject\";\nimport { createProjectWithPrompt } from \"./lib/createProjectWithPrompt\";\nimport { createNodeContext } from \"./runtime/node-context\";\n\nexport const HELP_TEXT = `create-next-pro\n\nUsage:\n create-next-pro <project-name> [--force]\n create-next-pro addpage [options]\n create-next-pro addcomponent [options]\n create-next-pro addlib [name]\n create-next-pro addapi [name]\n create-next-pro addlanguage [locale]\n create-next-pro addtext <path> [text]\n create-next-pro rmpage [options]\n\nOptions:\n --help Show this help message\n --version Show the CLI version\n --reconfigure Run the configuration assistant again\n`;\n\nexport function parseOptions(args: string[]) {\n return {\n force: args.includes(\"--force\"),\n help: args.includes(\"--help\"),\n version: args.includes(\"--version\") || args.includes(\"-v\"),\n reconfigure: args.includes(\"--reconfigure\"),\n };\n}\n\nasync function packageVersion(context: CliContext): Promise<string> {\n const packageJson = JSON.parse(\n await context.fs.readText(path.join(context.packageRoot, \"package.json\")),\n ) as { version: string };\n return packageJson.version;\n}\n\nexport async function main(\n context: CliContext = createNodeContext(),\n): Promise<ExitCode> {\n try {\n const args = [...context.argv];\n const options = parseOptions(args);\n const version = await packageVersion(context);\n\n if (args[0] === \"__complete\") {\n await printCompletions(args, context);\n return 0;\n }\n\n if (options.help) {\n context.terminal.log(HELP_TEXT);\n return 0;\n }\n if (options.version) {\n context.terminal.log(`v${version}`);\n return 0;\n }\n if (options.reconfigure || !(await readConfig(context))) {\n await onboarding(context, version);\n return 0;\n }\n\n if (args[0] === \"addpage\" && args.length === 1) args.push(\"-LPl\");\n const handler = args[0] ? createCommandRegistry().get(args[0]) : undefined;\n if (handler) return (await handler(args, context)).exitCode;\n\n const nameArg = args.find((arg) => !arg.startsWith(\"--\"));\n if (nameArg) {\n await createProject(nameArg, options.force, context);\n return 0;\n }\n\n await createProjectWithPrompt(context);\n return 0;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n context.terminal.error(message);\n return error instanceof CliError ? error.exitCode : 1;\n }\n}\n","import path from \"node:path\";\n\nimport type { CliContext } from \"../core/contracts\";\n\nexport type UserConfig = {\n version: 1;\n shell: \"bash\" | \"zsh\";\n completionInstalled: boolean;\n createdAt: string;\n updatedAt: string;\n};\n\nexport function configDirectory(context: CliContext): string {\n return context.env.XDG_CONFIG_HOME\n ? path.join(context.env.XDG_CONFIG_HOME, \"create-next-pro\")\n : path.join(context.homeDir, \".config\", \"create-next-pro\");\n}\n\nexport function configFile(context: CliContext): string {\n return path.join(configDirectory(context), \"config.json\");\n}\n\nexport async function readConfig(\n context: CliContext,\n): Promise<UserConfig | null> {\n try {\n return JSON.parse(\n await context.fs.readText(configFile(context)),\n ) as UserConfig;\n } catch {\n return null;\n }\n}\n\nasync function ensureLineInRc(\n context: CliContext,\n target: string,\n line: string,\n): Promise<void> {\n try {\n const current = context.fs.exists(target)\n ? await context.fs.readText(target)\n : \"\";\n if (!current.includes(line))\n await context.fs.appendText(target, `\\n${line}\\n`);\n } catch {\n // Autocompletion is optional and must not make onboarding fail.\n }\n}\n\nasync function installCompletion(\n context: CliContext,\n shell: UserConfig[\"shell\"],\n): Promise<void> {\n const directory = configDirectory(context);\n const source = path.join(\n context.packageRoot,\n shell === \"zsh\"\n ? \"create-next-pro-completion.zsh\"\n : \"create-next-pro-completion.sh\",\n );\n const target = path.join(\n directory,\n `completion.${shell === \"zsh\" ? \"zsh\" : \"sh\"}`,\n );\n await context.fs.mkdir(directory);\n await context.fs.copyFile(source, target);\n const rcFile = path.join(\n context.homeDir,\n shell === \"zsh\" ? \".zshrc\" : \".bashrc\",\n );\n await ensureLineInRc(context, rcFile, `source \"${target}\"`);\n}\n\nexport async function onboarding(\n context: CliContext,\n version: string,\n): Promise<UserConfig> {\n context.terminal.log(`🚀 Welcome to create-next-pro v${version}\\n`);\n const response = await context.prompt<\"shell\" | \"completion\">(\n [\n {\n type: \"select\",\n name: \"shell\",\n message: \"Which shell do you use?\",\n choices: [\n { title: \"zsh\", value: \"zsh\" },\n { title: \"bash\", value: \"bash\" },\n ],\n initial: context.env.SHELL?.includes(\"zsh\") ? 0 : 1,\n },\n {\n type: \"toggle\",\n name: \"completion\",\n message: \"Install autocompletion?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n ],\n { onCancel: () => false },\n );\n\n if (response.shell !== \"bash\" && response.shell !== \"zsh\") {\n throw new Error(\"Configuration cancelled.\");\n }\n\n const now = new Date().toISOString();\n const config: UserConfig = {\n version: 1,\n shell: response.shell,\n completionInstalled: Boolean(response.completion),\n createdAt: now,\n updatedAt: now,\n };\n if (config.completionInstalled)\n await installCompletion(context, config.shell);\n await context.fs.mkdir(configDirectory(context));\n await context.fs.writeText(\n configFile(context),\n JSON.stringify(config, null, 2),\n );\n\n context.terminal.log(\"\\n✅ Configuration saved.\");\n context.terminal.log(\"you can now use the CLI ! ex : \");\n context.terminal.log(\" Without prompt (will change in future) :\");\n context.terminal.log(\" create-next-pro my-next-project\");\n context.terminal.log(\" With prompt :\");\n context.terminal.log(\" create-next-pro\");\n context.terminal.log(\n \"For more information, visit: https://github.com/Rising-Corporation/create-next-pro-cli\",\n );\n context.terminal.log(\"Happy coding! 🎉\");\n return config;\n}\n","import { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { CliContext } from \"../core/contracts\";\nimport { discoverPages } from \"../core/page-catalog\";\n\nexport const PUBLIC_COMMANDS = [\n \"addpage\",\n \"addcomponent\",\n \"addlib\",\n \"addapi\",\n \"addlanguage\",\n \"addtext\",\n \"rmpage\",\n \"--help\",\n \"--version\",\n \"--reconfigure\",\n] as const;\n\nconst OPTIONS: Record<string, string[]> = {\n addpage: [\n \"--layout\",\n \"--page\",\n \"--loading\",\n \"--not-found\",\n \"--error\",\n \"--global-error\",\n \"--route\",\n \"--template\",\n \"--default\",\n ],\n addcomponent: [\"--page\", \"-P\"],\n};\n\nasync function directories(root: string): Promise<string[]> {\n try {\n return (await readdir(root, { withFileTypes: true }))\n .filter((entry) => entry.isDirectory() && !entry.name.startsWith(\"_\"))\n .map((entry) => entry.name)\n .sort();\n } catch {\n return [];\n }\n}\n\nexport async function completionCandidates(\n command: string | undefined,\n context: CliContext,\n): Promise<string[]> {\n if (!command) return [...PUBLIC_COMMANDS];\n if (command === \"rmpage\") {\n return (await discoverPages(context.cwd)).map(\n (candidate) => candidate.logicalName,\n );\n }\n if (command === \"addcomponent\" || command === \"addpage\") {\n return [\n ...(OPTIONS[command] ?? []),\n ...(await directories(path.join(context.cwd, \"src\", \"ui\"))),\n ];\n }\n if (command === \"addlanguage\")\n return [\"de\", \"en\", \"es\", \"fr\", \"it\", \"ja\", \"pt\"];\n return OPTIONS[command] ?? [];\n}\n\nexport async function printCompletions(\n args: string[],\n context: CliContext,\n): Promise<void> {\n for (const candidate of await completionCandidates(args[1], context)) {\n context.terminal.log(candidate);\n }\n}\n","import { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport type PageCandidate = {\n logicalName: string;\n routeSegments: string[];\n routeDirectory: string;\n uiDirectory: string;\n messageFile: string;\n messageKey?: string;\n};\n\nfunction isRouteGroup(segment: string): boolean {\n return segment.startsWith(\"(\") && segment.endsWith(\")\");\n}\n\nexport async function discoverPages(\n projectRoot: string,\n): Promise<PageCandidate[]> {\n const appRoot = path.join(projectRoot, \"src\", \"app\", \"[locale]\");\n const candidates: PageCandidate[] = [];\n\n async function visit(directory: string, relative: string[] = []) {\n let entries;\n try {\n entries = await readdir(directory, { withFileTypes: true });\n } catch {\n return;\n }\n if (entries.some((entry) => entry.isFile() && entry.name === \"page.tsx\")) {\n const routeSegments = relative.filter(\n (segment) => !isRouteGroup(segment),\n );\n if (\n routeSegments.length > 0 &&\n !routeSegments.some(\n (segment) => segment.startsWith(\"_\") || segment.startsWith(\"[\"),\n )\n ) {\n const logicalName = routeSegments.join(\".\");\n candidates.push({\n logicalName,\n routeSegments,\n routeDirectory: directory,\n uiDirectory: path.join(projectRoot, \"src\", \"ui\", ...routeSegments),\n messageFile: path.join(\n projectRoot,\n \"messages\",\n \"{locale}\",\n `${routeSegments[0]}.json`,\n ),\n messageKey:\n routeSegments.length > 1 ? routeSegments.at(-1) : undefined,\n });\n }\n }\n for (const entry of entries) {\n if (entry.isDirectory() && !entry.name.startsWith(\".\")) {\n await visit(path.join(directory, entry.name), [\n ...relative,\n entry.name,\n ]);\n }\n }\n }\n\n await visit(appRoot);\n return candidates.sort((left, right) =>\n left.logicalName.localeCompare(right.logicalName),\n );\n}\n","import type { PromptObject } from \"prompts\";\n\nexport type ExitCode = 0 | 1;\n\nexport type CommandResult = {\n exitCode: ExitCode;\n};\n\nexport type Terminal = {\n log: (...values: unknown[]) => void;\n warn: (...values: unknown[]) => void;\n error: (...values: unknown[]) => void;\n};\n\nexport type PromptRunner = <T extends string = string>(\n questions: PromptObject<T> | PromptObject<T>[],\n options?: { onCancel?: () => boolean | void },\n) => Promise<Record<T, unknown>>;\n\nexport type CliFileSystem = {\n exists: (path: string) => boolean;\n readText: (path: string) => Promise<string>;\n writeText: (path: string, content: string) => Promise<void>;\n mkdir: (path: string) => Promise<void>;\n copyFile: (source: string, target: string) => Promise<void>;\n appendText: (path: string, content: string) => Promise<void>;\n};\n\nexport type CliContext = {\n argv: string[];\n cwd: string;\n env: NodeJS.ProcessEnv;\n homeDir: string;\n packageRoot: string;\n terminal: Terminal;\n prompt: PromptRunner;\n fs: CliFileSystem;\n};\n\nexport type CommandHandler = (\n args: string[],\n context: CliContext,\n) => Promise<CommandResult>;\n\nexport const success = (): CommandResult => ({ exitCode: 0 });\n\nexport class CliError extends Error {\n constructor(\n message: string,\n readonly exitCode: ExitCode = 1,\n ) {\n super(message);\n this.name = \"CliError\";\n }\n}\n","import { join } from \"node:path\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport prompts from \"prompts\";\nimport { existsSync } from \"node:fs\";\n\nimport { loadConfig } from \"./utils\";\nimport { resolvePackageRoot } from \"../runtime/node-context\";\nimport { assertSafeTarget, parseLogicalName } from \"../core/project-paths\";\n\nexport async function addApi(args: string[], cwd = process.cwd()) {\n let apiName = args[1];\n if (!apiName || apiName.startsWith(\"-\")) {\n const response = await prompts.prompt({\n type: \"text\",\n name: \"apiName\",\n message: \"🔌 API route name to add:\",\n validate: (name: string) => (name ? true : \"API route name is required\"),\n });\n apiName = response.apiName;\n }\n const apiSegments = parseLogicalName(apiName, \"API route name\");\n\n const config = await loadConfig(cwd);\n if (!config) {\n console.error(\n \"❌ Configuration file cnp.config.json not found. Run this command from the project root.\",\n );\n return;\n }\n\n const apiDir = join(cwd, \"src\", \"app\", \"api\", ...apiSegments);\n await assertSafeTarget(cwd, apiDir);\n if (!existsSync(apiDir)) {\n await mkdir(apiDir, { recursive: true });\n }\n\n const templateDir = join(\n resolvePackageRoot(import.meta.url),\n \"templates\",\n \"Api\",\n );\n const routeTemplate = join(templateDir, \"route.ts\");\n const routePath = join(apiDir, \"route.ts\");\n\n if (!existsSync(routePath)) {\n if (existsSync(routeTemplate)) {\n let content = await readFile(routeTemplate, \"utf-8\");\n content = content.replace(/template/g, apiName);\n await writeFile(routePath, content);\n } else {\n await writeFile(\n routePath,\n `import { NextResponse } from \"next/server\";\\n\\nexport async function GET() {\\n return NextResponse.json({ message: \"Hello from ${apiName}\" });\\n}\\n`,\n );\n }\n console.log(`📄 File created: ${routePath}`);\n } else {\n console.log(`ℹ️ File already exists: ${routePath}`);\n }\n\n console.log(`✅ API route \"${apiName}\" added.`);\n}\n","import { readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\n/**\n * Capitalize the first letter of a string.\n */\nexport function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport interface CNPConfig {\n useI18n?: boolean;\n importAlias?: string;\n [key: string]: any;\n}\n\nexport function configuredAliasPrefix(config: CNPConfig): string {\n const alias = config.importAlias ?? \"@/*\";\n return alias.endsWith(\"/*\") ? alias.slice(0, -2) : \"@\";\n}\n\n/**\n * Load CLI configuration from the project root.\n * Returns null if the configuration file is missing or invalid.\n */\nexport async function loadConfig(\n cwd = process.cwd(),\n): Promise<CNPConfig | null> {\n const configPath = join(cwd, \"cnp.config.json\");\n if (!existsSync(configPath)) return null;\n try {\n const raw = await readFile(configPath, \"utf-8\");\n return JSON.parse(raw) as CNPConfig;\n } catch {\n return null;\n }\n}\n\n/**\n * Map a key to its corresponding file name for page/component templates.\n * @param key string\n * @returns file name string\n */\nexport function toFileName(key: string): string {\n switch (key) {\n case \"layout\":\n return \"layout.tsx\";\n case \"page\":\n return \"page.tsx\";\n case \"loading\":\n return \"loading.tsx\";\n case \"not-found\":\n return \"not-found.tsx\";\n case \"error\":\n return \"error.tsx\";\n case \"global-error\":\n return \"global-error.tsx\";\n case \"route\":\n return \"route.ts\";\n case \"template\":\n return \"template.tsx\";\n case \"default\":\n return \"default.tsx\";\n default:\n return `${key}.tsx`;\n }\n}\n","import { existsSync } from \"node:fs\";\nimport {\n appendFile,\n copyFile,\n mkdir,\n readFile,\n writeFile,\n} from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport prompts from \"prompts\";\n\nimport type { CliContext, PromptRunner } from \"../core/contracts\";\n\nfunction findPackageRoot(start: string): string {\n let current = start;\n while (true) {\n const packagePath = path.join(current, \"package.json\");\n if (existsSync(packagePath)) return current;\n const parent = path.dirname(current);\n if (parent === current) {\n throw new Error(`Unable to locate package.json from ${start}`);\n }\n current = parent;\n }\n}\n\nexport function resolvePackageRoot(metaUrl = import.meta.url): string {\n return findPackageRoot(path.dirname(fileURLToPath(metaUrl)));\n}\n\ntype ContextOverrides = Partial<\n Pick<\n CliContext,\n | \"argv\"\n | \"cwd\"\n | \"env\"\n | \"homeDir\"\n | \"packageRoot\"\n | \"terminal\"\n | \"prompt\"\n | \"fs\"\n >\n>;\n\nexport function createNodeContext(\n overrides: ContextOverrides = {},\n): CliContext {\n return {\n argv: process.argv.slice(2),\n cwd: process.cwd(),\n env: process.env,\n homeDir: os.homedir(),\n packageRoot: resolvePackageRoot(),\n terminal: console,\n prompt: prompts as PromptRunner,\n fs: {\n exists: existsSync,\n readText: (target) => readFile(target, \"utf8\"),\n writeText: async (target, content) => {\n await writeFile(target, content);\n },\n mkdir: async (target) => {\n await mkdir(target, { recursive: true });\n },\n copyFile: async (source, target) => {\n await copyFile(source, target);\n },\n appendText: async (target, content) => {\n await appendFile(target, content);\n },\n },\n ...overrides,\n };\n}\n","import path from \"node:path\";\nimport { lstat } from \"node:fs/promises\";\n\nimport { CliError } from \"./contracts\";\n\nconst SAFE_SEGMENT = /^[A-Za-z][A-Za-z0-9_-]*$/;\n\nfunction hasControlCharacters(value: string): boolean {\n return [...value].some((character) => {\n const code = character.charCodeAt(0);\n return code <= 31 || code === 127;\n });\n}\n\nexport function parseLogicalName(value: string, label = \"name\"): string[] {\n if (!value || hasControlCharacters(value)) {\n throw new CliError(\n `Invalid ${label}: a non-empty printable value is required.`,\n );\n }\n if (path.isAbsolute(value) || value.includes(\"/\") || value.includes(\"\\\\\")) {\n throw new CliError(\n `Invalid ${label}: paths and separators are not allowed.`,\n );\n }\n const segments = value.split(\".\");\n if (segments.some((segment) => !SAFE_SEGMENT.test(segment))) {\n throw new CliError(\n `Invalid ${label}: use dot-separated alphanumeric segments beginning with a letter.`,\n );\n }\n return segments;\n}\n\nexport function validateProjectName(value: string): string {\n if (\n !value ||\n hasControlCharacters(value) ||\n path.isAbsolute(value) ||\n value === \".\" ||\n value === \"..\" ||\n value.includes(\"/\") ||\n value.includes(\"\\\\\") ||\n !/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(value)\n ) {\n throw new CliError(\n \"Invalid project name: use letters, numbers, dots, dashes or underscores without path separators.\",\n );\n }\n return value;\n}\n\nexport function resolveInside(root: string, ...segments: string[]): string {\n const absoluteRoot = path.resolve(root);\n const target = path.resolve(absoluteRoot, ...segments);\n if (\n target !== absoluteRoot &&\n !target.startsWith(`${absoluteRoot}${path.sep}`)\n ) {\n throw new CliError(\n `Refusing to access a path outside the project: ${target}`,\n );\n }\n return target;\n}\n\nexport async function assertSafeTarget(\n root: string,\n target: string,\n): Promise<string> {\n const safeTarget = resolveInside(root, path.relative(root, target));\n const relativeSegments = path\n .relative(path.resolve(root), safeTarget)\n .split(path.sep);\n let current = path.resolve(root);\n for (const segment of relativeSegments) {\n if (!segment) continue;\n current = path.join(current, segment);\n try {\n if ((await lstat(current)).isSymbolicLink()) {\n throw new CliError(\n `Symbolic links are forbidden in project paths: ${current}`,\n );\n }\n } catch (error) {\n if (error instanceof CliError) throw error;\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n }\n return safeTarget;\n}\n\nexport function normalizeImportAlias(value: string): string {\n if (!/^[A-Za-z@~][A-Za-z0-9@~_-]*\\/\\*$/.test(value)) {\n throw new CliError(\n 'Invalid import alias: expected a prefix followed by \"/*\" (for example \"@/*\" or \"@core/*\").',\n );\n }\n return value;\n}\n\nexport function importAliasPrefix(value = \"@/*\"): string {\n return normalizeImportAlias(value).slice(0, -2);\n}\n","import { join } from \"node:path\";\nimport { mkdir, readFile, writeFile, readdir } from \"node:fs/promises\";\nimport prompts from \"prompts\";\n\nimport { capitalize, loadConfig } from \"./utils\";\nimport { resolvePackageRoot } from \"../runtime/node-context\";\nimport { assertSafeTarget, parseLogicalName } from \"../core/project-paths\";\n\nimport { existsSync, statSync } from \"node:fs\";\n\nexport async function addComponent(args: string[], cwd = process.cwd()) {\n let componentName = args[1];\n let pageScope = null;\n const pageIndex = args.findIndex((arg) => arg === \"-P\" || arg === \"--page\");\n if (pageIndex !== -1 && args[pageIndex + 1]) {\n pageScope = args[pageIndex + 1];\n }\n // Handle nested pageScope (e.g. ParentPage.ChildPage)\n let nestedPath = null;\n if (pageScope && pageScope.includes(\".\")) {\n nestedPath = join(...pageScope.split(\".\"));\n }\n\n if (!componentName || componentName.startsWith(\"-\")) {\n // Si le nom n'est pas fourni ou est une option, demander via prompt\n const response = await prompts.prompt({\n type: \"text\",\n name: \"componentName\",\n message: \"🧩 Component name to add:\",\n validate: (name: string) => (name ? true : \"Component name is required\"),\n });\n componentName = response.componentName;\n }\n parseLogicalName(componentName, \"component name\");\n if (pageScope) parseLogicalName(pageScope, \"page name\");\n\n const config = await loadConfig(cwd);\n if (!config) {\n console.error(\n \"❌ Configuration file cnp.config.json not found. Run this command from the project root.\",\n );\n return;\n }\n const useI18n = !!config.useI18n;\n\n const componentNameUpper = capitalize(componentName);\n const templatePath = join(\n resolvePackageRoot(import.meta.url),\n \"templates\",\n \"Component\",\n );\n let messagesPath: string | null = null;\n if (useI18n) {\n messagesPath = join(cwd, \"messages\");\n if (!existsSync(messagesPath)) {\n console.error(\n \"❌ Messages directory missing. Ensure i18n was configured.\",\n );\n return;\n }\n }\n\n // Determine target path for the component\n let componentTargetPath;\n let translationKey;\n if (pageScope) {\n if (nestedPath) {\n componentTargetPath = join(cwd, \"src\", \"ui\", nestedPath);\n translationKey = pageScope;\n } else {\n componentTargetPath = join(cwd, \"src\", \"ui\", pageScope);\n translationKey = pageScope;\n }\n } else {\n componentTargetPath = join(cwd, \"src\", \"ui\", \"_global\");\n translationKey = \"_global_ui\";\n }\n await assertSafeTarget(cwd, componentTargetPath);\n if (!existsSync(componentTargetPath)) {\n await mkdir(componentTargetPath, { recursive: true });\n }\n const componentFile = join(componentTargetPath, `${componentNameUpper}.tsx`);\n\n // Read and adapt the TSX template\n const templateComponentPath = join(templatePath, \"Component.tsx\");\n if (existsSync(templateComponentPath)) {\n let content = await readFile(templateComponentPath, \"utf-8\");\n // Remplacement du nom du component et de la clé de traduction\n content = content\n .replace(/Component/g, componentNameUpper)\n .replace(/componentPage/g, translationKey);\n await writeFile(componentFile, content);\n console.log(`📄 File created: ${componentFile}`);\n } else {\n console.error(\n \"❌ Template Component.tsx introuvable :\",\n templateComponentPath,\n );\n }\n\n if (useI18n && messagesPath) {\n const entries = await readdir(messagesPath, { withFileTypes: true });\n const langDirs = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n const jsonTemplate = join(templatePath, \"component.json\");\n if (!existsSync(jsonTemplate)) {\n console.error(\"❌ Template component.json not found:\", jsonTemplate);\n return;\n }\n const jsonContent = await readFile(jsonTemplate, \"utf-8\");\n const parsed = JSON.parse(jsonContent);\n\n for (const locale of langDirs) {\n // Only process if messages/<locale> is a directory\n const localeDir = join(messagesPath, locale);\n if (!existsSync(localeDir) || !statSync(localeDir).isDirectory())\n continue;\n let jsonTarget;\n if (pageScope) {\n const [messageFile] = pageScope.split(\".\");\n jsonTarget = join(messagesPath, locale, `${messageFile}.json`);\n } else {\n jsonTarget = join(messagesPath, locale, `_global_ui.json`);\n }\n\n let current: Record<string, any> = {};\n if (existsSync(jsonTarget)) {\n const jsonFile = await readFile(jsonTarget, \"utf-8\");\n current = JSON.parse(jsonFile) as Record<string, any>;\n }\n if (pageScope?.includes(\".\")) {\n const child = pageScope.split(\".\")[1];\n const childMessages =\n current[child] && typeof current[child] === \"object\"\n ? (current[child] as Record<string, unknown>)\n : {};\n childMessages[componentNameUpper] = parsed;\n current[child] = childMessages;\n } else {\n current[componentNameUpper] = parsed;\n }\n await writeFile(jsonTarget, JSON.stringify(current, null, 2));\n console.log(`📄 File updated: ${jsonTarget}`);\n }\n } else {\n console.log(\"ℹ️ Skipping translation entries; next-intl not enabled.\");\n }\n\n console.log(\n `✅ Component \"${componentNameUpper}\" added ${\n pageScope ? `to page ${pageScope}` : \"globally\"\n }${useI18n ? \" with localized messages\" : \"\"}.`,\n );\n}\n","import { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport { cp, readFile, writeFile } from \"node:fs/promises\";\nimport prompts from \"prompts\";\n\nimport { loadConfig } from \"./utils\";\nimport { assertSafeTarget, parseLogicalName } from \"../core/project-paths\";\n\nfunction generateLocales(): string[] {\n const dn = new Intl.DisplayNames([\"en\"], { type: \"language\" });\n const locales: string[] = [];\n for (let i = 0; i < 26; i++) {\n for (let j = 0; j < 26; j++) {\n const code = String.fromCharCode(97 + i) + String.fromCharCode(97 + j);\n try {\n const name = dn.of(code);\n if (name && name.toLowerCase() !== code) {\n locales.push(code);\n }\n } catch {\n // Ignore values that are not recognized as language codes.\n }\n }\n }\n return locales.sort();\n}\n\nexport async function addLanguage(args: string[], cwd = process.cwd()) {\n const config = await loadConfig(cwd);\n if (!config?.useI18n) {\n console.error(\"❌ i18n is not enabled in this project.\");\n return;\n }\n const messagesPath = join(cwd, \"messages\");\n if (!existsSync(messagesPath)) {\n console.error(\"❌ Messages directory missing. Ensure i18n was configured.\");\n return;\n }\n\n const available = generateLocales();\n let locale = args[1];\n if (!locale || !available.includes(locale)) {\n const response = await prompts({\n type: \"autocomplete\",\n name: \"locale\",\n message: \"🌐 Locale to add:\",\n choices: available.map((l) => ({ title: l, value: l })),\n });\n locale = response.locale;\n }\n if (!locale) return;\n parseLogicalName(locale, \"locale\");\n await assertSafeTarget(cwd, messagesPath);\n if (existsSync(join(messagesPath, locale))) {\n throw new Error(`Locale ${locale} already exists.`);\n }\n\n const routingFile = join(cwd, \"src\", \"lib\", \"i18n\", \"routing.ts\");\n const messagesRegistryFile = join(cwd, \"src\", \"lib\", \"i18n\", \"messages.ts\");\n if (!existsSync(routingFile)) {\n throw new Error(\"routing.ts not found. Are you in project root?\");\n }\n if (!existsSync(messagesRegistryFile)) {\n throw new Error(\"messages.ts not found. Are you in project root?\");\n }\n const routingContent = await readFile(routingFile, \"utf-8\");\n const defaultMatch = routingContent.match(/defaultLocale:\\s*\"([^\"]+)\"/);\n const defaultLocale = defaultMatch ? defaultMatch[1] : null;\n if (!defaultLocale || !existsSync(join(messagesPath, defaultLocale))) {\n throw new Error(\"Default locale not found.\");\n }\n\n const defaultAggregatorFile = join(messagesPath, `${defaultLocale}.ts`);\n if (!existsSync(defaultAggregatorFile)) {\n throw new Error(`Default locale aggregator not found: ${defaultLocale}.ts`);\n }\n\n const localesMatch = routingContent.match(/locales:\\s*\\[([^\\]]*)\\]/);\n if (!localesMatch) {\n throw new Error(\"Unable to locate routing locales.\");\n }\n const localesArr = localesMatch[1]\n .split(\",\")\n .map((s) => s.trim().replace(/[\"']/g, \"\"))\n .filter(Boolean);\n if (localesArr.includes(locale)) {\n throw new Error(`Locale ${locale} already exists in routing.`);\n }\n const newLocales = `locales: [${[...localesArr, locale]\n .map((item) => `\"${item}\"`)\n .join(\", \")}]`;\n const nextRoutingContent = routingContent.replace(\n /locales:\\s*\\[[^\\]]*\\]/,\n newLocales,\n );\n\n const defaultAggregatorContent = await readFile(\n defaultAggregatorFile,\n \"utf-8\",\n );\n const defaultImportPrefix = `./${defaultLocale}/`;\n if (!defaultAggregatorContent.includes(defaultImportPrefix)) {\n throw new Error(\n `Default locale aggregator does not import from ${defaultImportPrefix}`,\n );\n }\n const nextAggregatorContent = defaultAggregatorContent.replaceAll(\n defaultImportPrefix,\n `./${locale}/`,\n );\n\n const messagesRegistryContent = await readFile(messagesRegistryFile, \"utf-8\");\n const registryMatch = messagesRegistryContent.match(\n /const messages = \\{([^}]*)\\} as const;/,\n );\n if (!registryMatch) {\n throw new Error(\"Unable to locate the typed messages registry.\");\n }\n const registeredLocales = registryMatch[1]\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n if (registeredLocales.includes(locale)) {\n throw new Error(`Locale ${locale} already exists in messages registry.`);\n }\n const registryDeclaration = `const messages = { ${[\n ...registeredLocales,\n locale,\n ].join(\", \")} } as const;`;\n const declarationIndex = messagesRegistryContent.indexOf(\"const messages =\");\n const nextMessagesRegistryContent =\n messagesRegistryContent.slice(0, declarationIndex) +\n `import ${locale} from \"../../../messages/${locale}\";\\n\\n` +\n messagesRegistryContent\n .slice(declarationIndex)\n .replace(/const messages = \\{[^}]*\\} as const;/, registryDeclaration);\n\n await cp(join(messagesPath, defaultLocale), join(messagesPath, locale), {\n recursive: true,\n });\n console.log(`📄 Directory created: ${join(messagesPath, locale)}`);\n await writeFile(join(messagesPath, `${locale}.ts`), nextAggregatorContent);\n console.log(`📄 File created: ${join(messagesPath, `${locale}.ts`)}`);\n await writeFile(messagesRegistryFile, nextMessagesRegistryContent);\n console.log(`📄 File updated: ${messagesRegistryFile}`);\n await writeFile(routingFile, nextRoutingContent);\n console.log(`📄 File updated: ${routingFile}`);\n\n console.log(\n `✅ Locale \"${locale}\" added and copied from default locale \"${defaultLocale}\".`,\n );\n}\n","import { join } from \"node:path\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport prompts from \"prompts\";\nimport { existsSync } from \"node:fs\";\n\nimport { loadConfig, capitalize } from \"./utils\";\nimport { resolvePackageRoot } from \"../runtime/node-context\";\nimport { assertSafeTarget, parseLogicalName } from \"../core/project-paths\";\n\nexport async function addLib(args: string[], cwd = process.cwd()) {\n let libArg = args[1];\n if (!libArg || libArg.startsWith(\"-\")) {\n const response = await prompts.prompt({\n type: \"text\",\n name: \"libArg\",\n message: \"📦 Lib name to add:\",\n validate: (name: string) => (name ? true : \"Lib name is required\"),\n });\n libArg = response.libArg;\n }\n const libSegments = parseLogicalName(libArg, \"library name\");\n\n let libName = libArg;\n let fileName: string | null = null;\n if (libSegments.length === 2) {\n [libName, fileName] = libSegments;\n } else if (libSegments.length > 2) {\n throw new Error(\"Libraries currently support exactly library.module.\");\n }\n\n const config = await loadConfig(cwd);\n if (!config) {\n console.error(\n \"❌ Configuration file cnp.config.json not found. Run this command from the project root.\",\n );\n return;\n }\n\n const libDir = join(cwd, \"src\", \"lib\", libName);\n await assertSafeTarget(cwd, libDir);\n if (!existsSync(libDir)) {\n await mkdir(libDir, { recursive: true });\n }\n\n const templateDir = join(\n resolvePackageRoot(import.meta.url),\n \"templates\",\n \"Lib\",\n );\n const indexTemplate = join(templateDir, \"index.ts\");\n const fileTemplate = join(templateDir, \"item.ts\");\n\n const indexPath = join(libDir, \"index.ts\");\n if (!existsSync(indexPath)) {\n if (existsSync(indexTemplate)) {\n const content = await readFile(indexTemplate, \"utf-8\");\n await writeFile(indexPath, content);\n } else {\n await writeFile(indexPath, \"export {}\\n\");\n }\n console.log(`📄 File created: ${indexPath}`);\n }\n\n if (fileName) {\n const filePath = join(libDir, `${fileName}.ts`);\n if (!existsSync(filePath)) {\n if (existsSync(fileTemplate)) {\n let content = await readFile(fileTemplate, \"utf-8\");\n content = content\n .replace(/template/g, fileName)\n .replace(/Template/g, capitalize(fileName));\n await writeFile(filePath, content);\n } else {\n await writeFile(\n filePath,\n `export function ${fileName}() {\\n // TODO: implement\\n}\\n`,\n );\n }\n console.log(`📄 File created: ${filePath}`);\n }\n\n let indexContent = await readFile(indexPath, \"utf-8\");\n const importLine = `import { ${fileName} } from \"./${fileName}\";`;\n const importRegex = new RegExp(\n `import\\\\s*{\\\\s*${fileName}\\\\s*}\\\\s*from\\\\s*\"\\\\./${fileName}\";`,\n );\n const exportRegex = /export\\s*{([^}]*)}/m;\n\n const imports: string[] = [];\n const exportsSet: string[] = [];\n for (const line of indexContent.split(\"\\n\")) {\n if (line.startsWith(\"import\")) {\n imports.push(line);\n } else if (line.startsWith(\"export\")) {\n const match = line.match(exportRegex);\n if (match && match[1]) {\n exportsSet.push(\n ...match[1]\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean),\n );\n }\n }\n }\n\n if (!imports.some((l) => importRegex.test(l))) {\n imports.push(importLine);\n }\n if (!exportsSet.includes(fileName)) {\n exportsSet.push(fileName);\n }\n\n indexContent =\n imports.join(\"\\n\") + \"\\n\\nexport { \" + exportsSet.join(\", \") + \" };\\n\";\n await writeFile(indexPath, indexContent);\n console.log(`✏️ Updated index: ${indexPath}`);\n }\n\n console.log(\n `✅ Lib \"${libName}\"${fileName ? ` with module ${fileName}` : \"\"} added.`,\n );\n}\n","import { join } from \"node:path\";\nimport { mkdir, readFile, writeFile, readdir } from \"node:fs/promises\";\nimport prompts from \"prompts\";\n\nimport {\n capitalize,\n configuredAliasPrefix,\n toFileName,\n loadConfig,\n} from \"./utils\";\nimport { resolvePackageRoot } from \"../runtime/node-context\";\nimport { assertSafeTarget, parseLogicalName } from \"../core/project-paths\";\n\nimport { existsSync, statSync } from \"node:fs\";\n\nfunction registerMessagesFile(\n content: string,\n locale: string,\n fileName: string,\n): string {\n const importPath = `./${locale}/${fileName}.json`;\n if (content.includes(importPath)) return content;\n\n const declarationIndex = content.indexOf(\"const messages =\");\n const registryMatch = content.match(/const messages = \\{([\\s\\S]*?)\\n\\};/);\n if (declarationIndex === -1 || !registryMatch) {\n throw new Error(\n `Unable to register ${fileName}.json in messages/${locale}.ts`,\n );\n }\n const importStatement = `import ${fileName} from \"${importPath}\";\\n`;\n const nextRegistry = registryMatch[0].replace(\n /\\n\\};$/,\n `\\n ${fileName},\\n};`,\n );\n return (\n content.slice(0, declarationIndex) +\n importStatement +\n content.slice(declarationIndex).replace(registryMatch[0], nextRegistry)\n );\n}\n\nexport async function addPage(args: string[], cwd = process.cwd()) {\n let pageName = args[1];\n if (!pageName || pageName.startsWith(\"-\")) {\n const response = await prompts.prompt({\n type: \"text\",\n name: \"pageName\",\n message: \"📝 Page name to add:\",\n validate: (name: string) => (name ? true : \"Page name is required\"),\n });\n pageName = response.pageName;\n }\n const pageSegments = parseLogicalName(pageName, \"page name\");\n\n // Handle nested pages\n let parentName = null;\n let childName = null;\n if (pageSegments.length === 2) {\n [parentName, childName] = pageSegments;\n } else if (pageSegments.length > 2) {\n throw new Error(\"Nested pages currently support exactly Parent.Child.\");\n }\n\n let shortFlags = args.find((arg) => /^-[A-Za-z]+$/.test(arg));\n const longFlags = new Set(args.filter((a) => a.startsWith(\"--\")));\n const flags = new Set<string>();\n\n if (!shortFlags && Array.from(longFlags).length === 0) {\n shortFlags = \"-LPl\";\n }\n\n if (shortFlags) {\n for (const char of shortFlags.slice(1)) {\n switch (char) {\n case \"L\":\n flags.add(\"layout\");\n break;\n case \"P\":\n flags.add(\"page\");\n break;\n case \"l\":\n flags.add(\"loading\");\n break;\n case \"n\":\n flags.add(\"not-found\");\n break;\n case \"e\":\n flags.add(\"error\");\n break;\n case \"g\":\n flags.add(\"global-error\");\n break;\n case \"r\":\n flags.add(\"route\");\n break;\n case \"t\":\n flags.add(\"template\");\n break;\n case \"d\":\n flags.add(\"default\");\n break;\n }\n }\n }\n\n for (const flag of [\n \"layout\",\n \"page\",\n \"loading\",\n \"not-found\",\n \"error\",\n \"global-error\",\n \"route\",\n \"template\",\n \"default\",\n ]) {\n if (longFlags.has(\"--\" + flag)) flags.add(flag);\n }\n\n const config = await loadConfig(cwd);\n if (!config) {\n console.error(\n \"❌ Configuration file cnp.config.json not found. Run this command from the project root.\",\n );\n return;\n }\n const useI18n = !!config.useI18n;\n const aliasPrefix = configuredAliasPrefix(config);\n\n const srcSegments = [\"src\", \"app\"];\n if (useI18n) srcSegments.push(\"[locale]\");\n const srcPath = join(cwd, ...srcSegments);\n if (!existsSync(srcPath)) {\n console.error(`❌ Expected directory not found: ${srcPath}`);\n return;\n }\n\n let messagesPath: string | null = null;\n let locales: string[] = [];\n if (useI18n) {\n messagesPath = join(cwd, \"messages\");\n if (!existsSync(messagesPath)) {\n console.error(\n \"❌ Messages directory missing. Ensure i18n was configured.\",\n );\n return;\n }\n const entries = await readdir(messagesPath, { withFileTypes: true });\n locales = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n }\n\n const templatePath = join(\n resolvePackageRoot(import.meta.url),\n \"templates\",\n \"Page\",\n );\n\n // Create folders/files for nested or simple page\n let uiPageDir, localePagePath, jsonFileName;\n if (parentName && childName) {\n uiPageDir = join(cwd, \"src\", \"ui\", parentName, childName);\n localePagePath = join(srcPath, parentName, childName);\n jsonFileName = parentName;\n } else {\n uiPageDir = join(cwd, \"src\", \"ui\", pageName);\n localePagePath = join(srcPath, pageName);\n jsonFileName = pageName;\n }\n await assertSafeTarget(cwd, uiPageDir);\n await assertSafeTarget(cwd, localePagePath);\n if (!existsSync(uiPageDir)) {\n await mkdir(uiPageDir, { recursive: true });\n }\n const uiPageFile = join(uiPageDir, \"page-ui.tsx\");\n const uiPageTemplate = join(templatePath, \"page-ui.tsx\");\n if (existsSync(uiPageTemplate)) {\n let uiContent = await readFile(uiPageTemplate, \"utf-8\");\n const translationNamespace =\n parentName && childName ? `${parentName}.${childName}` : pageName;\n uiContent = uiContent.replace(\n 'useTranslations(\"template\")',\n `useTranslations(\"${translationNamespace}\")`,\n );\n uiContent = uiContent\n .replaceAll('from \"@/', `from \"${aliasPrefix}/`)\n .replace(/template/g, childName || pageName)\n .replace(/Template/g, capitalize(childName || pageName));\n await writeFile(uiPageFile, uiContent);\n console.log(`📄 File created: ${uiPageFile}`);\n } else {\n console.warn(\n \"⚠️ Missing template file: page-ui.tsx at path:\",\n uiPageTemplate,\n );\n }\n if (!existsSync(localePagePath)) {\n await mkdir(localePagePath, { recursive: true });\n }\n for (const flag of flags) {\n const filename = toFileName(flag);\n const src = join(templatePath, filename);\n const dst = join(localePagePath, filename);\n if (!existsSync(src)) {\n console.warn(`⚠️ Missing template file: ${filename} at path: ${src}`);\n continue;\n }\n const content = await readFile(src, \"utf-8\");\n const uiImportPath =\n parentName && childName ? `${parentName}/${childName}` : pageName;\n const replaced = content\n .replace(\"@/ui/template/\", `@/ui/${uiImportPath}/`)\n .replaceAll('from \"@/', `from \"${aliasPrefix}/`)\n .replace(/template/g, childName || pageName)\n .replace(/Template/g, capitalize(childName || pageName));\n await writeFile(dst, replaced);\n console.log(`📄 File created: ${dst}`);\n }\n\n if (useI18n && messagesPath) {\n const jsonTemplate = join(templatePath, \"page.json\");\n if (!existsSync(jsonTemplate)) {\n console.warn(\"⚠️ Missing template: page.json at path:\", jsonTemplate);\n } else {\n const content = await readFile(jsonTemplate, \"utf-8\");\n const replaced = content\n .replace(/template/g, childName || pageName)\n .replace(/Template/g, capitalize(childName || pageName));\n for (const locale of locales) {\n // Only process if messages/<locale> is a directory\n const localeDir = join(messagesPath, locale);\n if (!existsSync(localeDir) || !statSync(localeDir).isDirectory())\n continue;\n const jsonTarget = join(messagesPath, locale, `${jsonFileName}.json`);\n let current: Record<string, any> = {};\n if (existsSync(jsonTarget)) {\n const jsonFile = await readFile(jsonTarget, \"utf-8\");\n try {\n current = JSON.parse(jsonFile) as Record<string, any>;\n } catch {\n current = {};\n }\n }\n if (parentName && childName) {\n current[childName] = JSON.parse(replaced);\n } else {\n // fichier simple\n current = JSON.parse(replaced);\n }\n await writeFile(jsonTarget, `${JSON.stringify(current, null, 2)}\\n`);\n console.log(`📄 File created: ${jsonTarget}`);\n\n const localeAggregator = join(messagesPath, `${locale}.ts`);\n if (!existsSync(localeAggregator)) {\n throw new Error(`Locale aggregator not found: messages/${locale}.ts`);\n }\n const aggregatorContent = await readFile(localeAggregator, \"utf-8\");\n const nextAggregatorContent = registerMessagesFile(\n aggregatorContent,\n locale,\n jsonFileName,\n );\n if (nextAggregatorContent !== aggregatorContent) {\n await writeFile(localeAggregator, nextAggregatorContent);\n console.log(`📄 File updated: ${localeAggregator}`);\n }\n }\n }\n } else {\n console.log(\"ℹ️ Skipping translation templates; next-intl not enabled.\");\n }\n\n console.log(\n `✅ Page \"${pageName}\" with templates added${\n useI18n ? \" for each locale\" : \"\"\n }.`,\n );\n}\n","import { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport { readFile, writeFile, readdir } from \"node:fs/promises\";\n\nimport { loadConfig } from \"./utils\";\nimport { assertSafeTarget, parseLogicalName } from \"../core/project-paths\";\n\nfunction defaultText(key: string) {\n return key.replace(/_/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nexport async function addText(args: string[], cwd = process.cwd()) {\n const pathArg = args[1];\n if (!pathArg) {\n console.error(\"❌ Dot path parameter is required.\");\n return;\n }\n const providedText = args.slice(2).join(\" \");\n parseLogicalName(pathArg, \"translation path\");\n\n const config = await loadConfig(cwd);\n if (!config?.useI18n) {\n console.error(\"❌ i18n is not enabled in this project.\");\n return;\n }\n const messagesPath = join(cwd, \"messages\");\n if (!existsSync(messagesPath)) {\n console.error(\"❌ Messages directory missing. Ensure i18n was configured.\");\n return;\n }\n\n const entries = await readdir(messagesPath, { withFileTypes: true });\n const locales = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n\n const [fileName, ...segments] = pathArg.split(\".\");\n if (!fileName || segments.length === 0) {\n console.error(\"❌ Invalid dot path provided.\");\n return;\n }\n const finalKey = segments[segments.length - 1];\n const text = providedText || defaultText(finalKey);\n\n for (const locale of locales) {\n const filePath = join(messagesPath, locale, `${fileName}.json`);\n await assertSafeTarget(cwd, filePath);\n let data: Record<string, any> = {};\n if (existsSync(filePath)) {\n const raw = await readFile(filePath, \"utf-8\");\n try {\n data = JSON.parse(raw) as Record<string, any>;\n } catch {\n // Preserve the current behavior by replacing invalid JSON with an object.\n }\n }\n let cursor = data;\n for (let i = 0; i < segments.length - 1; i++) {\n const seg = segments[i];\n if (!cursor[seg]) cursor[seg] = {};\n cursor = cursor[seg];\n }\n cursor[finalKey] = text;\n await writeFile(filePath, JSON.stringify(data, null, 2));\n console.log(`📄 File updated: ${filePath}`);\n }\n\n console.log(`✅ Text added at path \"${pathArg}\" with value \"${text}\".`);\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile, readdir, rm, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { PromptRunner, Terminal } from \"../core/contracts\";\nimport { CliError } from \"../core/contracts\";\nimport { discoverPages, type PageCandidate } from \"../core/page-catalog\";\nimport { parseLogicalName, resolveInside } from \"../core/project-paths\";\n\nasync function removeMessages(\n projectRoot: string,\n candidate: PageCandidate,\n terminal: Terminal,\n) {\n const messagesRoot = resolveInside(projectRoot, \"messages\");\n let locales;\n try {\n locales = (await readdir(messagesRoot, { withFileTypes: true }))\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name);\n } catch {\n return;\n }\n for (const locale of locales) {\n const target = resolveInside(\n projectRoot,\n \"messages\",\n locale,\n `${candidate.routeSegments[0]}.json`,\n );\n if (!existsSync(target)) continue;\n if (candidate.messageKey) {\n const data = JSON.parse(await readFile(target, \"utf8\")) as Record<\n string,\n unknown\n >;\n delete data[candidate.messageKey];\n await writeFile(target, `${JSON.stringify(data, null, 2)}\\n`);\n } else {\n await rm(target);\n }\n terminal.log(`🗑️ Deleted messages for ${candidate.logicalName}: ${target}`);\n }\n}\n\nexport async function rmPage(\n args: string[],\n cwd = process.cwd(),\n prompt?: PromptRunner,\n terminal: Terminal = console,\n): Promise<void> {\n const candidates = await discoverPages(cwd);\n let logicalName = args[1];\n if (!logicalName || logicalName.startsWith(\"-\")) {\n if (!prompt)\n throw new CliError(\"A page name is required in non-interactive mode.\");\n const selected = await prompt<\"page\" | \"confirm\">([\n {\n type: \"autocomplete\",\n name: \"page\",\n message: \"🗑️ Page to remove:\",\n choices: candidates.map((candidate) => ({\n title: candidate.logicalName.replaceAll(\".\", \" › \"),\n value: candidate.logicalName,\n })),\n },\n {\n type: (value: string) => (value ? \"confirm\" : null),\n name: \"confirm\",\n message: \"Confirm page deletion?\",\n initial: false,\n },\n ]);\n if (!selected.confirm) {\n terminal.log(\"Page deletion cancelled.\");\n return;\n }\n logicalName = String(selected.page ?? \"\");\n }\n\n parseLogicalName(logicalName, \"page name\");\n const candidate = candidates.find(\n (entry) => entry.logicalName === logicalName,\n );\n if (!candidate) throw new CliError(`Page not found: ${logicalName}`);\n\n await removeMessages(cwd, candidate, terminal);\n for (const target of [candidate.uiDirectory, candidate.routeDirectory]) {\n const safeTarget = resolveInside(cwd, path.relative(cwd, target));\n if (existsSync(safeTarget)) {\n await rm(safeTarget, { recursive: true, force: false });\n terminal.log(`🗑️ Deleted: ${safeTarget}`);\n }\n }\n terminal.log(`✅ Page \"${logicalName}\" deleted.`);\n}\n","import type { CommandHandler } from \"../core/contracts\";\nimport { success } from \"../core/contracts\";\nimport { addApi } from \"../lib/addApi\";\nimport { addComponent } from \"../lib/addComponent\";\nimport { addLanguage } from \"../lib/addLanguage\";\nimport { addLib } from \"../lib/addLib\";\nimport { addPage } from \"../lib/addPage\";\nimport { addText } from \"../lib/addText\";\nimport { rmPage } from \"../lib/rmPage\";\n\nfunction legacyHandler(\n command: (args: string[], cwd?: string) => Promise<void>,\n): CommandHandler {\n return async (args, context) => {\n await command(args, context.cwd);\n return success();\n };\n}\n\nexport function createCommandRegistry(): ReadonlyMap<string, CommandHandler> {\n return new Map<string, CommandHandler>([\n [\"addcomponent\", legacyHandler(addComponent)],\n [\"addpage\", legacyHandler(addPage)],\n [\"addlib\", legacyHandler(addLib)],\n [\"addapi\", legacyHandler(addApi)],\n [\"addlanguage\", legacyHandler(addLanguage)],\n [\"addtext\", legacyHandler(addText)],\n [\n \"rmpage\",\n async (args, context) => {\n await rmPage(args, context.cwd, context.prompt, context.terminal);\n return success();\n },\n ],\n ]);\n}\n","// src/scaffold.ts\n\nimport { mkdir, rm, writeFile } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { red, green, cyan } from \"./lib/helper/consoleColor\";\nimport { CliError } from \"./core/contracts\";\nimport type { Terminal } from \"./core/contracts\";\nimport {\n normalizeImportAlias,\n validateProjectName,\n} from \"./core/project-paths\";\nimport {\n copyTemplate,\n customizeGeneratedProject,\n} from \"./core/template-manifest\";\n\n/**\n * Options for scaffolding a Next.js project.\n */\nexport interface ScaffoldOptions {\n projectName: string;\n useTypescript: boolean;\n useEslint: boolean;\n useTailwind: boolean;\n useSrcDir: boolean;\n useTurbopack: boolean;\n useI18n: boolean;\n customAlias: boolean;\n importAlias: string;\n force?: boolean;\n}\n\ninterface ScaffoldRuntimeOptions {\n cwd?: string;\n templatePath?: string;\n terminal?: Terminal;\n}\n\n/**\n * Scaffold a new Next.js project based on provided options.\n *\n * - Copies the default template to the target directory\n * - Removes the target directory if it exists and --force is set\n * - Optionally customizes the structure in future (e.g. remove unused files)\n *\n * @param options ScaffoldOptions for the project\n */\nexport async function scaffoldProject(\n options: ScaffoldOptions,\n runtime: ScaffoldRuntimeOptions = {},\n) {\n const requiredFeatures: Array<keyof ScaffoldOptions> = [\n \"useTypescript\",\n \"useEslint\",\n \"useTailwind\",\n \"useSrcDir\",\n \"useTurbopack\",\n \"useI18n\",\n ];\n const unsupported = requiredFeatures.filter(\n (feature) => options[feature] !== true,\n );\n if (unsupported.length > 0) {\n throw new CliError(\n `The default Next.js 16 template requires: ${unsupported.join(\", \")}.`,\n );\n }\n const cwd = runtime.cwd ?? process.cwd();\n const terminal = runtime.terminal ?? console;\n const projectName = validateProjectName(options.projectName);\n const importAlias = normalizeImportAlias(\n options.customAlias === false ? \"@/*\" : options.importAlias || \"@/*\",\n );\n const targetPath = join(cwd, projectName);\n\n const __dirname = new URL(\".\", import.meta.url); // or :\n // const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const templatePath =\n runtime.templatePath ??\n join(fileURLToPath(__dirname), \"..\", \"templates\", \"Projects\", \"default\");\n const resolvedCwd = resolve(cwd);\n const resolvedTarget = resolve(targetPath);\n if (!resolvedTarget.startsWith(`${resolvedCwd}/`)) {\n throw new CliError(\n \"The project destination must be a child of the current directory.\",\n );\n }\n\n // Check if target directory exists\n if (existsSync(targetPath)) {\n if (options.force) {\n terminal.warn(\"⚠️ Target directory already exists, removing...\");\n await rm(targetPath, { recursive: true, force: true });\n } else {\n terminal.error(\n red(\"[X] Target directory already exists. Use --force to overwrite.\"),\n );\n throw new CliError(\n \"[X] Target directory already exists. Use --force to overwrite.\",\n );\n }\n }\n\n try {\n terminal.log(\"Creating project directory...\");\n await mkdir(targetPath, { recursive: true });\n\n terminal.log(\"Copying files from template...\");\n await copyTemplate(templatePath, targetPath);\n await customizeGeneratedProject(targetPath, projectName, importAlias);\n\n // Write CLI configuration to project root\n await writeFile(\n join(targetPath, \"cnp.config.json\"),\n `${JSON.stringify({ ...options, projectName, importAlias }, null, 2)}\\n`,\n );\n\n terminal.log(\"Project setup complete!\");\n terminal.log(\"\");\n terminal.log(\"To get started:\");\n terminal.log(\" \" + green(`cd ${options.projectName}`));\n terminal.log(\"\");\n terminal.log(\n \"Then install dependencies and launch the dev server with your preferred tool:\",\n );\n\n terminal.log(\" \" + green(`bun install && bun dev`));\n terminal.log(\" \" + green(`npm install && npm run dev`));\n terminal.log(\" \" + green(`pnpm install && pnpm run dev`));\n terminal.log(\"\");\n terminal.log(\"Documentation and examples can be found at:\");\n terminal.log(\n \" \" +\n cyan(\"https://github.com/Rising-Corporation/create-next-pro-cli\"),\n );\n terminal.log(\n \"_-`'-_-'`_`'-_-'`_`'-_-'`_`'-_-'`_`'-_-'`_`'-_-'`_`'-_-'`_`'-_-'`-_\",\n );\n } catch (err) {\n // Affiche une croix ASCII et le texte en rouge si le terminal le supporte\n\n terminal.error(red(\"[X] Error during project creation:\"), err);\n throw new CliError(\"[X] Error during project creation:\");\n }\n}\n","const RED = \"\\x1b[31m\";\nconst GREEN = \"\\x1b[32m\";\nconst YELLOW = \"\\x1b[33m\";\nconst BLUE = \"\\x1b[34m\";\nconst CYAN = \"\\x1b[36m\";\nconst RESET = \"\\x1b[0m\";\n\nexport function red(text: string) {\n return RED + text + RESET;\n}\nexport function green(text: string) {\n return GREEN + text + RESET;\n}\nexport function yellow(text: string) {\n return YELLOW + text + RESET;\n}\nexport function blue(text: string) {\n return BLUE + text + RESET;\n}\nexport function cyan(text: string) {\n return CYAN + text + RESET;\n}\n","import {\n lstat,\n mkdir,\n readdir,\n readFile,\n writeFile,\n copyFile,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { CliError } from \"./contracts\";\n\nexport const TEMPLATE_DENY_NAMES = new Set([\n \".env\",\n \".git\",\n \".agent\",\n \".cursor\",\n \".next\",\n \"node_modules\",\n \"artifacts\",\n \"coverage\",\n \"playwright-report\",\n \"test-results\",\n]);\n\nexport function isDistributableTemplatePath(relativePath: string): boolean {\n const segments = relativePath.split(path.sep);\n return !segments.some(\n (segment) =>\n TEMPLATE_DENY_NAMES.has(segment) ||\n segment.endsWith(\".tsbuildinfo\") ||\n segment === \".DS_Store\",\n );\n}\n\nexport async function templateManifest(root: string): Promise<string[]> {\n const files: string[] = [];\n async function visit(directory: string, relativeDirectory = \"\") {\n const entries = await readdir(directory, { withFileTypes: true });\n entries.sort((left, right) => left.name.localeCompare(right.name));\n for (const entry of entries) {\n const relative = path.join(relativeDirectory, entry.name);\n if (!isDistributableTemplatePath(relative)) continue;\n const source = path.join(directory, entry.name);\n const stats = await lstat(source);\n if (stats.isSymbolicLink()) {\n throw new CliError(\n `Symbolic links are forbidden in templates: ${relative}`,\n );\n }\n if (stats.isDirectory()) await visit(source, relative);\n else if (stats.isFile()) files.push(relative);\n else throw new CliError(`Unsupported template entry: ${relative}`);\n }\n }\n await visit(root);\n return files;\n}\n\nexport async function copyTemplate(\n root: string,\n target: string,\n): Promise<string[]> {\n const manifest = await templateManifest(root);\n await mkdir(target, { recursive: true });\n for (const relative of manifest) {\n const destination = path.join(\n target,\n relative === \".gitignore.template\" ? \".gitignore\" : relative,\n );\n await mkdir(path.dirname(destination), { recursive: true });\n await copyFile(path.join(root, relative), destination);\n }\n return manifest;\n}\n\nexport async function customizeGeneratedProject(\n target: string,\n projectName: string,\n importAlias: string,\n): Promise<void> {\n const packagePath = path.join(target, \"package.json\");\n const packageJson = JSON.parse(await readFile(packagePath, \"utf8\")) as Record<\n string,\n unknown\n >;\n packageJson.name = projectName.toLowerCase();\n delete packageJson.packageManager;\n await writeFile(packagePath, `${JSON.stringify(packageJson, null, 2)}\\n`);\n\n const tsconfigPath = path.join(target, \"tsconfig.json\");\n const tsconfigContent = await readFile(tsconfigPath, \"utf8\");\n const tsconfig = JSON.parse(tsconfigContent) as {\n compilerOptions?: { paths?: Record<string, string[]> };\n };\n if (!tsconfig.compilerOptions?.paths?.[\"@/*\"]) {\n throw new CliError(\n 'The template tsconfig must define the default \"@/*\" alias.',\n );\n }\n await writeFile(\n tsconfigPath,\n tsconfigContent.replace('\"@/*\"', `\"${importAlias}\"`),\n );\n\n if (importAlias !== \"@/*\") {\n const prefix = importAlias.slice(0, -2);\n for (const relative of await templateManifest(target)) {\n if (!/\\.[cm]?[jt]sx?$/.test(relative)) continue;\n const file = path.join(target, relative);\n const content = await readFile(file, \"utf8\");\n const next = content\n .replaceAll('from \"@/', `from \"${prefix}/`)\n .replaceAll(\"from '@/\", `from '${prefix}/`);\n if (next !== content) await writeFile(file, next);\n }\n }\n}\n","import { scaffoldProject } from \"../scaffold\";\nimport type { CliContext } from \"../core/contracts\";\n\nexport async function createProject(\n nameArg: string,\n force: boolean,\n context?: Pick<CliContext, \"cwd\" | \"terminal\">,\n) {\n const response = {\n projectName: nameArg,\n useTypescript: true,\n useEslint: true,\n useTailwind: true,\n useSrcDir: true,\n useTurbopack: true,\n useI18n: true,\n customAlias: true,\n importAlias: \"@/*\",\n force,\n };\n\n const terminal = context?.terminal ?? console;\n terminal.log(`Creating project \"${response.projectName}\"...`);\n await scaffoldProject(response, {\n cwd: context?.cwd ?? process.cwd(),\n terminal,\n });\n}\n","import { scaffoldProject } from \"../scaffold\";\nimport type { ScaffoldOptions } from \"../scaffold\";\nimport type { CliContext } from \"../core/contracts\";\n\nexport async function createProjectWithPrompt(context: CliContext) {\n const response = await context.prompt<keyof ScaffoldOptions>([\n {\n type: \"text\",\n name: \"projectName\",\n message: \"Project name:\",\n initial: \"my-next-app\",\n },\n {\n type: \"toggle\",\n name: \"useTypescript\",\n message: \"✔ Use TypeScript?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useEslint\",\n message: \"✔ Use ESLint?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useTailwind\",\n message: \"✔ Use Tailwind CSS?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useSrcDir\",\n message: \"✔ Use `src/` directory?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useTurbopack\",\n message: \"✔ Use Turbopack for `next dev`?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useI18n\",\n message: \"✔ Use i18n with next-intl for translations?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"customAlias\",\n message: \"✔ Customize import alias (`@/*` by default)?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: (prev: boolean) => (prev ? \"text\" : null),\n name: \"importAlias\",\n message: \"✔ What import alias would you like?\",\n initial: \"@core/*\",\n },\n ]);\n\n const options = response as unknown as ScaffoldOptions;\n context.terminal.log(\"\\nYour choices:\");\n context.terminal.log(options);\n\n await scaffoldProject(options, {\n cwd: context.cwd,\n terminal: context.terminal,\n });\n}\n","#!/usr/bin/env node\nimport { main } from \"./src/index\";\nprocess.exitCode = await main();\n"],"mappings":"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","names":["path","readdir","path","path","readdir","path","join","mkdir","readFile","writeFile","prompts","existsSync","existsSync","readFile","path","path","path","prompts","join","existsSync","mkdir","readFile","writeFile","join","mkdir","readFile","writeFile","readdir","prompts","existsSync","join","prompts","mkdir","readFile","writeFile","readdir","join","existsSync","readFile","writeFile","prompts","join","existsSync","prompts","readFile","writeFile","join","mkdir","readFile","writeFile","prompts","existsSync","prompts","join","existsSync","mkdir","readFile","writeFile","join","mkdir","readFile","writeFile","readdir","prompts","existsSync","statSync","prompts","join","readdir","mkdir","readFile","writeFile","join","existsSync","readFile","writeFile","readdir","join","existsSync","readdir","readFile","writeFile","existsSync","readFile","readdir","writeFile","path","readdir","existsSync","readFile","writeFile","candidate","path","mkdir","rm","writeFile","join","existsSync","fileURLToPath","lstat","mkdir","readdir","readFile","writeFile","copyFile","path","path","readdir","lstat","mkdir","copyFile","readFile","writeFile","join","fileURLToPath","existsSync","rm","mkdir","writeFile","path"]}
@@ -1,10 +1,39 @@
1
1
  #!/usr/bin/env sh
2
- PKG_ROOT="$(dirname "$(dirname "$0")")/lib/node_modules/create-next-pro-cli/dist"
3
- if command -v bun >/dev/null 2>&1 && [ -f "$PKG_ROOT/bin.bun.js" ]; then
4
- exec bun "$PKG_ROOT/bin.bun.js" "$@"
5
- elif command -v node >/dev/null 2>&1 && [ -f "$PKG_ROOT/bin.node.js" ]; then
6
- exec node "$PKG_ROOT/bin.node.js" "$@"
2
+ set -eu
3
+
4
+ # Resolve $0 in absolute real path (handle PATH + symlinks)
5
+ resolve_self() {
6
+ _self="$1"
7
+ case "$_self" in
8
+ /*) : ;; # already absolute
9
+ *) _self="$(command -v -- "$_self" || printf '%s' "$_self")" ;;
10
+ esac
11
+ # follow symlinks
12
+ while [ -L "$_self" ]; do
13
+ _dir="$(cd -- "$(dirname -- "$_self")" && pwd -P)"
14
+ _link="$(readlink -- "$_self")"
15
+ case "$_link" in
16
+ /*) _self="$_link" ;;
17
+ *) _self="$_dir/$_link" ;;
18
+ esac
19
+ done
20
+ _dir="$(cd -- "$(dirname -- "$_self")" && pwd -P)"
21
+ printf '%s/%s\n' "$_dir" "$(basename -- "$_self")"
22
+ }
23
+
24
+ SELF_PATH="$(resolve_self "$0")" # …/create-next-pro
25
+ DIST_DIR="$(cd -- "$(dirname -- "$SELF_PATH")" && pwd -P)" # …/dist
26
+ PKG_DIR="$(cd -- "$DIST_DIR/.." && pwd -P)" # …/create-next-pro-cli
27
+
28
+ # (optional) debug
29
+ # echo "SELF_PATH=$SELF_PATH"; echo "DIST_DIR=$DIST_DIR"; echo "PKG_DIR=$PKG_DIR" >&2
30
+
31
+ # Launch your real entrypoint from the right folder
32
+ if command -v bun >/dev/null 2>&1 && [ -f "$DIST_DIR/bin.bun.js" ]; then
33
+ exec bun "$DIST_DIR/bin.bun.js" "$@"
34
+ elif command -v node >/dev/null 2>&1 && [ -f "$DIST_DIR/bin.node.js" ]; then
35
+ exec node "$DIST_DIR/bin.node.js" "$@"
7
36
  else
8
- echo "Error: need bun or node in PATH, or package not found" >&2
37
+ echo "Error: need bun or node in PATH, or entry file not found" >&2
9
38
  exit 1
10
39
  fi
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-next-pro-cli",
3
- "version": "0.1.25",
3
+ "version": "0.1.27",
4
4
  "description": "Advanced Next.js project scaffolder with i18n, Tailwind, App Router and more.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -11,8 +11,13 @@
11
11
  },
12
12
  "files": [
13
13
  "dist",
14
- "templates",
14
+ "templates/Api",
15
+ "templates/Component",
16
+ "templates/Lib",
17
+ "templates/Page",
18
+ "templates/Projects/default",
15
19
  "create-next-pro-completion.sh",
20
+ "create-next-pro-completion.zsh",
16
21
  "public/cnp-banner.svg",
17
22
  "public/logo.svg",
18
23
  "LICENSE",
@@ -21,31 +26,49 @@
21
26
  "author": "MrRise",
22
27
  "license": "MIT",
23
28
  "type": "module",
29
+ "packageManager": "bun@1.3.14",
30
+ "engines": {
31
+ "node": ">=24",
32
+ "bun": ">=1.3"
33
+ },
24
34
  "scripts": {
25
35
  "dev": "bun run bin.bun.ts",
26
36
  "scaffold-dev": "bun run src/scaffold-dev.ts",
27
- "test": "vitest run",
37
+ "format": "prettier --write --ignore-unknown .github/workflows/ci.yml .husky scripts bunfig.toml bin.bun.ts bin.node.ts src tsup.config.ts eslint.config.mjs package.json tsconfig.base.json tsconfig.json tsconfig.node.json",
38
+ "format:check": "prettier --check --ignore-unknown .github/workflows/ci.yml .husky scripts bunfig.toml bin.bun.ts bin.node.ts src tsup.config.ts eslint.config.mjs package.json tsconfig.base.json tsconfig.json tsconfig.node.json",
39
+ "lint": "eslint bin.bun.ts bin.node.ts scripts src tsup.config.ts",
40
+ "typecheck": "tsc --project tsconfig.json --noEmit",
41
+ "test": "bun test",
28
42
  "clean": "rm -rf dist",
29
43
  "build": "bun run clean && bun run build:node && bun run build:bun && cp scripts/create-next-pro dist/create-next-pro && chmod +x dist/create-next-pro",
30
44
  "build:node": "tsup",
31
45
  "build:bun": "bun build bin.bun.ts --outdir dist --target=bun",
32
- "prepublishOnly": "bun run clean && bun run build",
33
- "commit": "cz",
34
- "release": "bunx --bun standard-version",
35
- "prepare-husky": "husky",
36
- "version-patch": "npm version patch",
37
- "git-fullpush": "bun run build && git add -A && bun commit && git push origin master && bun version-patch"
38
- },
39
- "config": {
40
- "commitizen": {
41
- "path": "./node_modules/cz-conventional-changelog"
42
- }
46
+ "check": "bun run format:check && bun run lint && bun run typecheck && bun test && bun run build",
47
+ "prepublishOnly": "bun run check",
48
+ "commitlint:range": "commitlint",
49
+ "release:check": "bun scripts/release.ts check",
50
+ "release:prepare": "bun scripts/release.ts prepare",
51
+ "release:resume": "bun scripts/release.ts resume",
52
+ "release:commit": "bun scripts/release.ts commit",
53
+ "package:pack": "bun scripts/pack.ts",
54
+ "package:inspect": "bun scripts/inspect-package.ts"
43
55
  },
44
56
  "lint-staged": {
45
57
  "*.{js,ts,tsx,md,css,json}": [
46
58
  "prettier --write"
47
59
  ]
48
60
  },
61
+ "overrides": {
62
+ "brace-expansion": "2.0.3",
63
+ "esbuild": "0.28.1",
64
+ "fast-uri": "3.1.2",
65
+ "glob": "10.5.0",
66
+ "js-yaml": "5.2.1",
67
+ "picomatch": "4.0.5",
68
+ "postcss": "8.5.17",
69
+ "rollup": "4.62.2",
70
+ "vite": "8.1.5"
71
+ },
49
72
  "keywords": [
50
73
  "nextjs",
51
74
  "bun",
@@ -59,20 +82,19 @@
59
82
  "prompts": "^2.4.2"
60
83
  },
61
84
  "devDependencies": {
62
- "@commitlint/cli": "^19.8.1",
63
- "@commitlint/config-conventional": "^19.8.1",
64
- "@types/node": "^22",
85
+ "@commitlint/cli": "^21.2.1",
86
+ "@commitlint/config-conventional": "^21.2.0",
87
+ "@eslint/js": "^10.0.1",
88
+ "@types/bun": "^1.3.14",
89
+ "@types/node": "^24.13.3",
65
90
  "@types/prompts": "^2.4.9",
66
- "commitizen": "^4.3.1",
67
- "csstype": "^3.1.3",
68
- "cz-conventional-changelog": "^3.3.0",
91
+ "eslint": "^10.7.0",
69
92
  "husky": "^9.1.7",
70
- "kleur": "^4.1.5",
71
- "lint-staged": "^16.1.5",
72
- "prettier": "^3.6.2",
73
- "standard-version": "^9.5.0",
74
- "tsup": "^8.5.0",
75
- "undici-types": "^6",
76
- "vitest": "^3.2.4"
93
+ "lint-staged": "^17.0.8",
94
+ "prettier": "^3.9.5",
95
+ "tsup": "^8.5.1",
96
+ "typescript": "^6.0.3",
97
+ "typescript-eslint": "^8.64.0",
98
+ "vitest": "^4.1.10"
77
99
  }
78
100
  }
@@ -0,0 +1,17 @@
1
+ PORT=3000
2
+ NEXT_PUBLIC_APP_URL=http://localhost:3000
3
+
4
+ # Auth.js v5
5
+ AUTH_URL=http://localhost:3000
6
+ AUTH_SECRET=
7
+ AUTH_GOOGLE_ID=
8
+ AUTH_GOOGLE_SECRET=
9
+ AUTH_TRUST_HOST=false
10
+ AUTH_DISABLED=false
11
+
12
+ # Legacy aliases are still accepted by the template code:
13
+ # PROJECT_PRODUCTION_URL=
14
+ # NEXTAUTH_URL=
15
+ # NEXTAUTH_SECRET=
16
+ # GOOGLE_CLIENT_ID=
17
+ # GOOGLE_CLIENT_SECRET=