@create-node-app/core 0.6.1 → 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -27
- package/dist/index.cjs +1 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +46 -40
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -68,27 +68,27 @@ All exports from `@create-node-app/core`:
|
|
|
68
68
|
|
|
69
69
|
### Functions
|
|
70
70
|
|
|
71
|
-
| Signature
|
|
72
|
-
|
|
73
|
-
| `createNodeApp(programName, options, transformOptions)`
|
|
74
|
-
| `checkNodeVersion(requiredVersion, packageName)`
|
|
75
|
-
| `checkForLatestVersion(packageName)`
|
|
76
|
-
| `printEnvInfo()`
|
|
71
|
+
| Signature | Description |
|
|
72
|
+
| ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
73
|
+
| `createNodeApp(programName, options, transformOptions)` | Main scaffolding orchestrator. Resolves the template, copies files, merges configs, installs deps, and initializes git. |
|
|
74
|
+
| `checkNodeVersion(requiredVersion, packageName)` | Compares `process.version` against a semver range. Exits with code 1 if too old. |
|
|
75
|
+
| `checkForLatestVersion(packageName)` | Fetches the latest version from the npm registry. Falls back to `npm view`. Returns `null` if both fail. |
|
|
76
|
+
| `printEnvInfo()` | Prints OS, CPU, binaries, and browser info to stdout, then exits. |
|
|
77
77
|
| `getPackagePath(templateOrExtension, name?, ignorePackage?)` | Resolves a file path inside a template/extension directory (usually `package.json`). Handles GitHub URLs, `file://` URLs, and legacy slugs. |
|
|
78
|
-
| `getTemplateDirPath(templateOrExtensionUrl)`
|
|
79
|
-
| `getTemplateBaseDirPath(templateOrExtensionUrl)`
|
|
80
|
-
| `downloadRepository(options)`
|
|
81
|
-
| `loadTemplateCnaConfig(templateUrl)`
|
|
78
|
+
| `getTemplateDirPath(templateOrExtensionUrl)` | Resolves the template directory. Looks for a `template/` subdirectory first, falls back to the resolved root. |
|
|
79
|
+
| `getTemplateBaseDirPath(templateOrExtensionUrl)` | Returns the parent of the `template/` directory (where `cna.config.json` lives). |
|
|
80
|
+
| `downloadRepository(options)` | Clones or pulls a Git repo into a cache dir, then copies files to the target. Supports offline mode, deduplication, and error formatting. |
|
|
81
|
+
| `loadTemplateCnaConfig(templateUrl)` | Loads the optional `cna.config.json` from a template's base directory. |
|
|
82
82
|
|
|
83
83
|
### Types
|
|
84
84
|
|
|
85
|
-
| Type
|
|
86
|
-
|
|
87
|
-
| `CnaOptions`
|
|
88
|
-
| `CnaOptionsTransform` | `(options: CnaOptions) => Promise<CnaOptions>`
|
|
89
|
-
| `CnaConfig`
|
|
90
|
-
| `CnaCustomOption`
|
|
91
|
-
| `TemplateOrExtension` | `{ url: string; ignorePackage?: boolean }`
|
|
85
|
+
| Type | Shape |
|
|
86
|
+
| --------------------- | ----------------------------------------------------------------------------------------------------- |
|
|
87
|
+
| `CnaOptions` | `{ projectName, info?, verbose?, packageManager?, install?, template?, templatesOrExtensions?, ... }` |
|
|
88
|
+
| `CnaOptionsTransform` | `(options: CnaOptions) => Promise<CnaOptions>` |
|
|
89
|
+
| `CnaConfig` | `{ customOptions?: CnaCustomOption[] }` |
|
|
90
|
+
| `CnaCustomOption` | `{ name, type, message?, initial?, ... }` |
|
|
91
|
+
| `TemplateOrExtension` | `{ url: string; ignorePackage?: boolean }` |
|
|
92
92
|
|
|
93
93
|
---
|
|
94
94
|
|
|
@@ -114,16 +114,16 @@ createNodeApp()
|
|
|
114
114
|
|
|
115
115
|
The package is organized into these modules:
|
|
116
116
|
|
|
117
|
-
| Module
|
|
118
|
-
|
|
119
|
-
| `index.ts`
|
|
120
|
-
| `installer.ts` | Project directory creation, dep installation, git init, post-install scripts
|
|
121
|
-
| `loaders.ts`
|
|
122
|
-
| `package.ts`
|
|
123
|
-
| `paths.ts`
|
|
124
|
-
| `git.ts`
|
|
125
|
-
| `config.ts`
|
|
126
|
-
| `helpers.ts`
|
|
117
|
+
| Module | Responsibility |
|
|
118
|
+
| -------------- | --------------------------------------------------------------------------------------------- |
|
|
119
|
+
| `index.ts` | Barrel export and main `createNodeApp` orchestration |
|
|
120
|
+
| `installer.ts` | Project directory creation, dep installation, git init, post-install scripts |
|
|
121
|
+
| `loaders.ts` | File discovery, classification (`.template`, `.append`, conditional prefixes), and processing |
|
|
122
|
+
| `package.ts` | Deep-merges `package.json` from multiple templates/extensions |
|
|
123
|
+
| `paths.ts` | URL resolution — GitHub branches, `file://`, legacy slugs, cache at `~/.cna/` |
|
|
124
|
+
| `git.ts` | Clone/pull with deduplication, offline support, error formatting |
|
|
125
|
+
| `config.ts` | Reads optional `cna.config.json` for custom CLI prompts |
|
|
126
|
+
| `helpers.ts` | Package manager detection, online check, path/naming utilities |
|
|
127
127
|
|
|
128
128
|
---
|
|
129
129
|
|
package/dist/index.cjs
CHANGED
|
@@ -281,7 +281,6 @@ var import_lodash = __toESM(require("lodash.merge"), 1);
|
|
|
281
281
|
var import_fs2 = __toESM(require("fs"), 1);
|
|
282
282
|
var import_os2 = __toESM(require("os"), 1);
|
|
283
283
|
var import_path2 = __toESM(require("path"), 1);
|
|
284
|
-
var import_url2 = require("url");
|
|
285
284
|
var import_debug2 = __toESM(require("debug"), 1);
|
|
286
285
|
|
|
287
286
|
// git.ts
|
|
@@ -404,9 +403,8 @@ var downloadRepository = async ({
|
|
|
404
403
|
};
|
|
405
404
|
|
|
406
405
|
// paths.ts
|
|
407
|
-
var import_meta = {};
|
|
408
406
|
var log2 = (0, import_debug2.default)("cna:paths");
|
|
409
|
-
var moduleDir =
|
|
407
|
+
var moduleDir = __dirname;
|
|
410
408
|
var solveValuesFromTemplateOrExtensionUrl = (templateOrExtension) => {
|
|
411
409
|
const url = new URL(templateOrExtension);
|
|
412
410
|
const ignorePackage = url.searchParams.get("ignorePackage") === "true";
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../index.ts","../installer.ts","../helpers.ts","../executable.ts","../package.ts","../paths.ts","../git.ts","../loaders.ts","../config.ts"],"sourcesContent":["import pc from \"picocolors\";\nimport envinfo from \"envinfo\";\nimport semver from \"semver\";\nimport { execFileSync } from \"child_process\";\nimport type { TemplateOrExtension } from \"./loaders.js\";\nexport type { TemplateOrExtension } from \"./loaders.js\";\nimport { createApp } from \"./installer.js\";\nimport { resolveExecutable } from \"./executable.js\";\nexport {\n getPackagePath,\n getTemplateDirPath,\n getTemplateBaseDirPath,\n} from \"./paths.js\";\nexport { downloadRepository } from \"./git.js\";\nexport { loadTemplateCnaConfig } from \"./config.js\";\nexport type { CnaConfig, CnaCustomOption } from \"./config.js\";\n\nexport const checkNodeVersion = (\n requiredVersion: string,\n packageName: string,\n) => {\n if (!semver.satisfies(process.version, requiredVersion)) {\n console.error(\n pc.red(\n `You are running Node ${process.version}.\\n` +\n `${packageName} requires Node ${requiredVersion}.\\n` +\n \"Please update your version of Node.\",\n ),\n );\n process.exit(1);\n }\n};\n\nexport const checkForLatestVersion = async (packageName: string) => {\n try {\n const response = await fetch(\n `https://registry.npmjs.org/-/package/${packageName}/dist-tags`,\n );\n if (!response.ok) {\n throw new Error(\"Registry request failed\");\n }\n const json = (await response.json()) as unknown;\n if (json && typeof json === \"object\" && \"latest\" in json) {\n return String((json as Record<string, unknown>)[\"latest\"]);\n }\n return null;\n } catch {\n try {\n return execFileSync(resolveExecutable(\"npm\"), [\n \"view\",\n packageName,\n \"version\",\n ])\n .toString()\n .trim();\n } catch {\n // ignore\n }\n }\n return null;\n};\n\nexport const printEnvInfo = async () => {\n console.log(pc.bold(\"\\nEnvironment Info:\"));\n const info = await envinfo.run(\n {\n System: [\"OS\", \"CPU\", \"Memory\", \"Shell\"],\n Binaries: [\"Node\", \"npm\", \"pnpm\", \"Yarn\", \"Bun\", \"Watchman\"],\n Browsers: [\"Chrome\", \"Edge\", \"Internet Explorer\", \"Firefox\", \"Safari\"],\n },\n {\n duplicates: true,\n showNotFound: true,\n },\n );\n console.log(info);\n process.exit(0);\n};\n\nexport type CnaOptions = {\n projectName: string;\n info?: boolean;\n verbose?: boolean;\n packageManager?: string;\n install?: boolean;\n template?: string;\n templatesOrExtensions?: TemplateOrExtension[];\n} & {\n [key: string]: unknown;\n};\n\nexport type CnaOptionsTransform = (options: CnaOptions) => Promise<CnaOptions>;\n\nexport const createNodeApp = async (\n programName: string,\n options: CnaOptions,\n transformOptions: CnaOptionsTransform,\n) => {\n if (options.info) {\n await printEnvInfo();\n }\n\n if (typeof options.projectName === \"undefined\") {\n console.error(\"Please specify the project directory:\");\n console.log(` ${pc.cyan(programName)} ${pc.green(\"[project-directory]\")}`);\n console.log();\n console.log(\"For example:\");\n console.log(` ${pc.cyan(programName)} ${pc.green(\"my-app\")}`);\n console.log();\n console.log(`Run ${pc.cyan(`${programName} --help`)} to see all options.`);\n process.exit(1);\n }\n\n const appOptions = await transformOptions(options);\n await createApp({\n ...appOptions,\n name: appOptions.projectName,\n installDependencies: options.install ?? true,\n });\n};\n","import lodash from \"lodash\";\n\nconst { isEmpty } = lodash;\nimport path from \"path\";\nimport fs from \"fs\";\nimport pc from \"picocolors\";\nimport os from \"os\";\nimport semver from \"semver\";\nimport { execFileSync } from \"child_process\";\n// Use dynamic import for simple-git to avoid bundlers injecting unsupported dynamic requires in ESM\nimport type { SimpleGit, SimpleGitOptions } from \"simple-git\";\n\nimport {\n shouldUseYarn,\n checkThatNpmCanReadCwd,\n checkNpmVersion,\n checkIfOnline,\n shouldUsePnpm,\n shouldUseBun,\n} from \"./helpers.js\";\nimport { loadPackages } from \"./package.js\";\nimport type { TemplateOrExtension } from \"./loaders.js\";\nimport { loadFiles } from \"./loaders.js\";\nimport { resolveExecutable } from \"./executable.js\";\n\nconst install = async (\n root: string,\n useYarn = false,\n usePnpm = false,\n useBun = false,\n dependencies: string[] = [],\n verbose = false,\n isOnline = true,\n isDevDependencies = false,\n) => {\n let command: string;\n let args: string[];\n\n if (useYarn) {\n command = \"yarnpkg\";\n args = [\"add\", \"--ignore-workspace-root-check\"];\n if (!isOnline) {\n args.push(\"--offline\");\n }\n if (isDevDependencies) {\n args.push(\"--dev\");\n }\n args.push(...dependencies);\n args.push(\"--cwd\");\n args.push(root);\n\n if (!isOnline) {\n console.log(pc.yellow(\"You appear to be offline.\"));\n console.log(pc.yellow(\"Falling back to the local Yarn cache.\"));\n console.log();\n }\n } else if (usePnpm) {\n command = \"pnpm\";\n args = [\"install\", \"--ignore-workspace\", \"--loglevel\", \"error\"];\n if (isDevDependencies) {\n args.push(\"--save-dev\");\n } else {\n args.push(\"--save\");\n }\n\n args.push(...dependencies);\n } else if (useBun) {\n command = \"bun\";\n if (dependencies.length > 0) {\n args = [\"add\"];\n if (isDevDependencies) {\n args.push(\"--dev\");\n }\n args.push(...dependencies);\n } else {\n args = [\"install\"];\n }\n } else {\n command = \"npm\";\n args = [\"install\", \"--loglevel\", \"error\"];\n if (isDevDependencies) {\n args.push(\"--save-dev\");\n } else {\n args.push(\"--save\");\n }\n\n args.push(...dependencies);\n }\n\n if (verbose) {\n args.push(\"--verbose\");\n }\n\n try {\n execFileSync(resolveExecutable(command), args, {\n cwd: root,\n stdio: \"inherit\",\n });\n } catch {\n throw new Error(`${command} ${args.join(\" \")}`);\n }\n};\n\nexport type RunOptions = {\n root: string;\n appName: string;\n originalDirectory: string;\n verbose?: boolean;\n useYarn?: boolean;\n usePnpm?: boolean;\n useBun?: boolean;\n templatesOrExtensions?: TemplateOrExtension[];\n dependencies?: string[];\n devDependencies?: string[];\n installDependencies?: boolean;\n runCommand: string;\n installCommand: string;\n} & {\n [key: string]: unknown;\n};\n\nconst runCommandInProjectDir = async (\n root: string,\n command: string,\n args: string[] = [],\n successMessage = \"Operation completed successfully.\",\n errorMessage = \"Operation failed.\",\n) => {\n const [executable, ...baseArgs] =\n command === \"npm run\"\n ? [\"npm\", \"run\"]\n : command === \"pnpm run\"\n ? [\"pnpm\", \"run\"]\n : command === \"bun run\"\n ? [\"bun\", \"run\"]\n : [command];\n\n try {\n execFileSync(resolveExecutable(executable), [...baseArgs, ...args], {\n cwd: root,\n stdio: \"ignore\",\n });\n console.log(pc.green(successMessage));\n } catch {\n console.log();\n console.log(pc.red(errorMessage));\n console.log();\n }\n};\n\nfunction extractNameAndVersion(dependencyString: string) {\n // extract the name and version from the dependency string separated by @\n // e.g. @types/react@^16\n // => name: @types/react\n // => version: ^16\n // e.g. react@^16\n // => name: react\n // => version: ^16\n\n // Find the last \"@\" symbol to split the string\n const lastIndex = dependencyString.lastIndexOf(\"@\");\n\n if (lastIndex !== -1) {\n // Split the string into name and version parts\n const name = dependencyString.substring(0, lastIndex); // Name\n const version = dependencyString.substring(lastIndex + 1); // Version\n\n return { name, version };\n } else {\n // If \"@\" is not present, treat the whole string as the name\n return { name: dependencyString, version: \"\" };\n }\n}\n\nconst run = async ({\n root,\n appName,\n originalDirectory,\n verbose = false,\n useYarn = false,\n usePnpm = false,\n useBun = false,\n templatesOrExtensions = [],\n dependencies = [],\n devDependencies = [],\n installDependencies = true,\n runCommand = \"\",\n installCommand = \"\",\n ...customOptions\n}: RunOptions) => {\n const isOnline = useYarn ? await checkIfOnline(useYarn) : true;\n\n if (isEmpty(templatesOrExtensions)) {\n console.log();\n console.log(\n pc.yellow(\n \"No templates or extensions specified to bootstrap application.\",\n ),\n );\n console.log();\n process.exit(0);\n }\n\n console.log();\n console.log(\"Scaffolding project in \" + root + \"...\");\n\n await loadFiles({\n root,\n templatesOrExtensions,\n appName,\n originalDirectory,\n verbose,\n useYarn,\n usePnpm,\n useBun,\n runCommand,\n installCommand,\n ...customOptions,\n });\n\n console.log();\n console.log(pc.green(\"Successfully scaffolded project.\"));\n console.log();\n\n if (installDependencies) {\n console.log(\n pc.green(\"Installing packages. This might take a couple of minutes.\"),\n );\n console.log(pc.green(\"Installing dependencies...\"));\n console.log();\n // Install dependencies\n await install(\n root,\n useYarn,\n usePnpm,\n useBun,\n dependencies,\n verbose,\n isOnline,\n false,\n );\n\n if (devDependencies.length > 0) {\n console.log();\n console.log(pc.green(\"Installing devDependencies...\"));\n console.log();\n // Install devDependencies\n await install(\n root,\n useYarn,\n usePnpm,\n useBun,\n devDependencies,\n verbose,\n isOnline,\n true,\n );\n }\n } else {\n console.log(pc.yellow(\"Skip package installation.\"));\n const packageJson = JSON.parse(\n fs.readFileSync(`${root}/package.json`, \"utf8\"),\n );\n\n const updateDependencies = (deps: string[]) => {\n return deps.reduce(\n (dep, elem) => {\n const nextDep = dep;\n if (/.+@(\\^|~)?[0-9a-zA-Z-.]+$/.test(elem)) {\n const { name, version } = extractNameAndVersion(elem);\n nextDep[name] = version;\n } else {\n nextDep[elem] = \"*\";\n }\n return nextDep;\n },\n {} as { [key: string]: string },\n );\n };\n\n packageJson.dependencies = updateDependencies(dependencies);\n packageJson.devDependencies = updateDependencies(devDependencies);\n\n fs.writeFileSync(\n path.join(root, \"package.json\"),\n JSON.stringify(packageJson, null, 2) + os.EOL,\n );\n\n console.log();\n console.log(pc.green(\"Successfully updated package.json.\"));\n console.log(pc.yellow(`Run ${pc.cyan(installCommand)} to install.`));\n }\n\n console.log();\n console.log(\"Initializing git repository...\");\n\n try {\n const { simpleGit } = (await import(\"simple-git\")) as unknown as {\n simpleGit: (\n baseDir?: string,\n options?: Partial<SimpleGitOptions>,\n ) => SimpleGit;\n };\n const git = simpleGit(root);\n await git.init();\n console.log(pc.green(\"Successfully initialized git repository.\"));\n } catch {\n console.log();\n console.log(\n pc.red(\n \"Failed to initialize git repository. Run `git init` to initialize git repository after the process is completed.\",\n ),\n );\n console.log();\n }\n\n if (installDependencies && isOnline) {\n const packageJson = JSON.parse(\n fs.readFileSync(`${root}/package.json`, \"utf8\"),\n );\n\n const runFormat = async () => {\n try {\n await runCommandInProjectDir(\n root,\n runCommand,\n [\"format\"],\n \"Successfully formatted code.\",\n `Failed to format code. Run \\`${runCommand} format\\` to format code after the process is completed.`,\n );\n } catch {\n // ignore\n }\n };\n\n const runLintFix = async () => {\n try {\n await runCommandInProjectDir(\n root,\n runCommand,\n [\"lint:fix\"],\n \"Successfully fixed linting errors.\",\n `Failed to fix linting errors. Run \\`${runCommand} lint:fix\\` to fix linting errors after the process is completed.`,\n );\n } catch {\n // ignore\n }\n };\n\n if (packageJson.scripts && packageJson.scripts[\"format\"]) {\n await runFormat();\n }\n if (packageJson.scripts && packageJson.scripts[\"lint:fix\"]) {\n await runLintFix();\n }\n }\n\n // Print out instructions\n console.log();\n console.log(pc.green(\"Successfully created project \" + appName + \".\"));\n console.log();\n console.log(\"Done! Now run:\");\n console.log();\n console.log(pc.cyan(` cd ${appName}`));\n console.log(pc.cyan(` ${installCommand}`));\n\n const packageJson = JSON.parse(\n fs.readFileSync(`${root}/package.json`, \"utf8\"),\n );\n\n const lookForScripts = [\"compose:up\", \"sls:offline\", \"dev\", \"start\"];\n\n for (const script of lookForScripts) {\n if (packageJson.scripts && packageJson.scripts[script]) {\n console.log(pc.cyan(` ${runCommand} ${script}`));\n break;\n }\n }\n\n console.log();\n console.log(pc.green(\"Happy hacking!\"));\n};\n\nexport type CreateAppOptions = {\n name: string;\n verbose?: boolean;\n packageManager?: string;\n templatesOrExtensions?: TemplateOrExtension[];\n installDependencies?: boolean;\n ignorePackage?: boolean;\n} & {\n [key: string]: unknown;\n};\n\nexport const createApp = async ({\n name,\n verbose = false,\n templatesOrExtensions = [],\n installDependencies = true,\n ignorePackage = false,\n ...customOptions\n}: CreateAppOptions) => {\n const root = path.resolve(name);\n const appName = path.basename(root);\n\n fs.mkdirSync(name, {\n recursive: true,\n });\n\n console.log(`Creating a new Node app in ${pc.green(root)}.`);\n console.log();\n\n const useYarn = customOptions.packageManager === \"yarn\" && shouldUseYarn();\n const usePnpm = customOptions.packageManager === \"pnpm\" && shouldUsePnpm();\n const useBun = customOptions.packageManager === \"bun\" && shouldUseBun();\n const runCommand = useYarn\n ? \"yarn\"\n : usePnpm\n ? \"pnpm run\"\n : useBun\n ? \"bun run\"\n : \"npm run\";\n const installCommand = useYarn\n ? \"yarn\"\n : usePnpm\n ? \"pnpm install\"\n : useBun\n ? \"bun install\"\n : \"npm install\";\n\n const { packageJson, dependencies, devDependencies } = await loadPackages({\n templatesOrExtensions,\n appName,\n usePnpm,\n useYarn,\n useBun,\n runCommand,\n ignorePackage,\n });\n\n fs.writeFileSync(\n path.join(root, \"package.json\"),\n JSON.stringify(packageJson, null, 2) + os.EOL,\n );\n\n const originalDirectory = process.cwd();\n process.chdir(root);\n if (!useYarn && !useBun && !checkThatNpmCanReadCwd()) {\n process.exit(1);\n }\n\n if (!semver.satisfies(process.version, \">=18.0.0\")) {\n console.log(\n pc.yellow(\n `You are using Node ${process.version} so the project will be bootstrapped with an old unsupported version of tools.\\n\\n` +\n `Please update to Node 18 or higher for a better, fully supported experience.\\n`,\n ),\n );\n }\n\n if (!useYarn && !useBun) {\n const npmInfo = checkNpmVersion();\n if (!npmInfo.hasMinNpm) {\n if (npmInfo.npmVersion) {\n console.log(\n pc.yellow(\n `You are using npm ${npmInfo.npmVersion} so the project will be bootstrapped with an old unsupported version of tools.\\n\\n` +\n `Please update to npm 3 or higher for a better, fully supported experience.\\n`,\n ),\n );\n }\n }\n }\n\n if (useYarn) {\n let yarnUsesDefaultRegistry = true;\n try {\n yarnUsesDefaultRegistry =\n execFileSync(resolveExecutable(\"yarnpkg\"), [\n \"config\",\n \"get\",\n \"registry\",\n ])\n .toString()\n .trim() === \"https://registry.yarnpkg.com\";\n } catch {\n // ignore\n }\n if (false && yarnUsesDefaultRegistry) {\n fs.cpSync(\n require.resolve(\"./yarn.lock.cached\"),\n path.join(root, \"yarn.lock\"),\n { force: true },\n );\n }\n }\n\n return run({\n root,\n appName,\n originalDirectory,\n verbose,\n useYarn,\n usePnpm,\n useBun,\n templatesOrExtensions,\n dependencies,\n devDependencies,\n installDependencies,\n runCommand,\n installCommand,\n ...customOptions,\n });\n};\n","import { execFileSync } from \"child_process\";\nimport spawn from \"cross-spawn\";\nimport pc from \"picocolors\";\nimport semver from \"semver\";\nimport dns from \"dns\";\nimport { URL } from \"url\";\nimport { resolveExecutable } from \"./executable.js\";\n\nexport const toCamelCase = (str: string) => {\n // Lower cases the string\n return (\n str\n .toLowerCase()\n // Replaces any - or _ characters with a space\n .replace(/[-_]+/g, \" \")\n // Removes any non alphanumeric characters\n .replace(/[^\\w\\s]/g, \"\")\n // Uppercases the first character in each group immediately following a space\n // (delimited by spaces)\n .replace(/ (.)/g, ($1) => {\n return $1.toUpperCase();\n })\n // Removes spaces\n .replace(/ /g, \"\")\n );\n};\n\nexport const isUsingYarn = () => {\n return (process.env.npm_config_user_agent || \"\").indexOf(\"yarn\") === 0;\n};\n\nexport const shouldUseYarn = () => {\n const { hasMinYarnPnp, hasMaxYarnPnp, yarnVersion } = checkYarnVersion();\n\n if (!hasMinYarnPnp) {\n console.log(\n pc.yellow(\n `You are using yarn version ${pc.bold(\n yarnVersion,\n )} which is not supported yet. ` +\n `To use Yarn, install v1.12.0 or higher and lower than v2.0.0. ` +\n `See https://yarnpkg.com for instructions on how to update.`,\n ),\n );\n return false;\n }\n\n if (!hasMaxYarnPnp) {\n console.log(\n pc.yellow(\n `You are using a pre-release version of Yarn which is not supported yet. ` +\n `To use Yarn, install v1.12.0 or higher and lower than v2.0.0. ` +\n `See https://yarnpkg.com for instructions on how to update.`,\n ),\n );\n return false;\n }\n\n return true;\n};\n\nexport const shouldUsePnpm = () => {\n const { hasMinPnpm, pnpmVersion } = checkPnpmVersion();\n\n if (!hasMinPnpm) {\n console.log(\n pc.yellow(\n `You are using pnpm version ${pc.bold(\n pnpmVersion,\n )} which is not supported yet. ` +\n `To use pnpm, install v5.0.0 or higher. ` +\n `See https://pnpm.js.org for instructions on how to update.`,\n ),\n );\n return false;\n }\n\n return true;\n};\n\nexport const shouldUseBun = () => {\n const { hasMinBun, bunVersion } = checkBunVersion();\n\n if (!hasMinBun) {\n console.log(\n pc.yellow(\n `You are using bun version ${pc.bold(\n bunVersion,\n )} which is not supported yet. ` +\n `To use bun, install v1.0.0 or higher. ` +\n `See https://bun.sh for instructions on how to install.`,\n ),\n );\n return false;\n }\n\n return true;\n};\n\nexport const checkThatNpmCanReadCwd = () => {\n const cwd = process.cwd();\n let childOutput = null;\n try {\n // Note: intentionally using spawn over exec since\n // the problem doesn't reproduce otherwise.\n // `npm config list` is the only reliable way I could find\n // to reproduce the wrong path. Just printing process.cwd()\n // in a Node process was not enough.\n childOutput = spawn.sync(\"npm\", [\"config\", \"list\"]).output.join(\"\");\n } catch {\n // Something went wrong spawning node.\n // Not great, but it means we can't do this check.\n // We might fail later on, but let's continue.\n return true;\n }\n if (typeof childOutput !== \"string\") {\n return true;\n }\n const lines = childOutput.split(\"\\n\");\n // `npm config list` output includes the following line:\n // \"; cwd = C:\\path\\to\\current\\dir\" (unquoted)\n // I couldn't find an easier way to get it.\n const prefix = \"; cwd = \";\n const line = lines.find((line) => line.startsWith(prefix));\n if (typeof line !== \"string\") {\n // Fail gracefully. They could remove it.\n return true;\n }\n const npmCWD = line.substring(prefix.length);\n if (npmCWD === cwd) {\n return true;\n }\n console.error(\n pc.red(\n `Could not start an npm process in the right directory.\\n\\n` +\n `The current directory is: ${pc.bold(cwd)}\\n` +\n `However, a newly started npm process runs in: ${pc.bold(npmCWD)}\\n\\n` +\n `This is probably caused by a misconfigured system terminal shell.`,\n ),\n );\n if (process.platform === \"win32\") {\n console.error(\n pc.red(`On Windows, this can usually be fixed by running:\\n\\n`) +\n ` ${pc.cyan(\n \"reg\",\n )} delete \"HKCU\\\\Software\\\\Microsoft\\\\Command Processor\" /v AutoRun /f\\n` +\n ` ${pc.cyan(\n \"reg\",\n )} delete \"HKLM\\\\Software\\\\Microsoft\\\\Command Processor\" /v AutoRun /f\\n\\n` +\n pc.red(`Try to run the above two lines in the terminal.\\n`) +\n pc.red(\n `To learn more about this problem, read: https://blogs.msdn.microsoft.com/oldnewthing/20071121-00/?p=24433/`,\n ),\n );\n }\n return false;\n};\n\nexport const checkPnpmVersion = () => {\n const minPnpm = \"5.0.0\";\n let hasMinPnpm = false;\n let pnpmVersion = null;\n try {\n pnpmVersion = execFileSync(resolveExecutable(\"pnpm\"), [\"--version\"])\n .toString()\n .trim();\n if (semver.valid(pnpmVersion)) {\n hasMinPnpm = semver.gte(pnpmVersion, minPnpm);\n } else {\n // Handle non-semver compliant pnpm version strings, which pnpm currently\n // uses for nightly builds. The regex truncates anything after the first\n // dash. See #5362.\n const trimmedPnpmVersionMatch = /^(.*?)[-+].+$/.exec(pnpmVersion);\n if (trimmedPnpmVersionMatch && trimmedPnpmVersionMatch[1]) {\n hasMinPnpm = semver.gte(trimmedPnpmVersionMatch[1], minPnpm);\n }\n }\n } catch {\n // Ignore errors.\n }\n return { hasMinPnpm, pnpmVersion };\n};\n\nexport const checkBunVersion = () => {\n const minBun = \"1.0.0\";\n let hasMinBun = false;\n let bunVersion = null;\n try {\n bunVersion = execFileSync(resolveExecutable(\"bun\"), [\"--version\"])\n .toString()\n .trim();\n if (semver.valid(bunVersion)) {\n hasMinBun = semver.gte(bunVersion, minBun);\n }\n } catch {\n // ignore\n }\n return { hasMinBun, bunVersion };\n};\n\nexport const checkYarnVersion = () => {\n const minYarnPnp = \"1.12.0\";\n const maxYarnPnp = \"2.0.0\";\n let hasMinYarnPnp = false;\n let hasMaxYarnPnp = false;\n let yarnVersion = null;\n try {\n yarnVersion = execFileSync(resolveExecutable(\"yarnpkg\"), [\"--version\"])\n .toString()\n .trim();\n if (semver.valid(yarnVersion)) {\n hasMinYarnPnp = semver.gte(yarnVersion, minYarnPnp);\n hasMaxYarnPnp = semver.lt(yarnVersion, maxYarnPnp);\n } else {\n // Handle non-semver compliant yarn version strings, which yarn currently\n // uses for nightly builds. The regex truncates anything after the first\n // dash. See #5362.\n const trimmedYarnVersionMatch = /^(.+?)[-+].+$/.exec(yarnVersion);\n if (trimmedYarnVersionMatch) {\n const trimmedYarnVersion = trimmedYarnVersionMatch.pop();\n if (trimmedYarnVersion) {\n hasMinYarnPnp = semver.gte(trimmedYarnVersion, minYarnPnp);\n hasMaxYarnPnp = semver.lt(trimmedYarnVersion, maxYarnPnp);\n }\n }\n }\n } catch {\n // ignore\n }\n return {\n hasMinYarnPnp: hasMinYarnPnp,\n hasMaxYarnPnp: hasMaxYarnPnp,\n yarnVersion: yarnVersion,\n };\n};\n\nexport const checkNpmVersion = () => {\n let hasMinNpm = false;\n let npmVersion = null;\n try {\n npmVersion = execFileSync(resolveExecutable(\"npm\"), [\"--version\"])\n .toString()\n .trim();\n hasMinNpm = semver.gte(npmVersion, \"6.0.0\");\n } catch {\n // ignore\n }\n return {\n hasMinNpm: hasMinNpm,\n npmVersion: npmVersion,\n };\n};\n\nconst getProxy = () => {\n if (process.env.HTTPS_PROXY) {\n return process.env.HTTPS_PROXY;\n }\n try {\n // Trying to read https-proxy from .npmrc\n const httpsProxy = execFileSync(resolveExecutable(\"npm\"), [\n \"config\",\n \"get\",\n \"https-proxy\",\n ])\n .toString()\n .trim();\n return httpsProxy !== \"null\" ? httpsProxy : undefined;\n } catch {\n // ignore\n }\n return \"\";\n};\n\nexport const checkIfOnline = (useYarn?: boolean) => {\n if (!useYarn) {\n // Don't ping the Yarn registry.\n // We'll just assume the best case.\n return Promise.resolve(true);\n }\n\n return new Promise<boolean>((resolve) => {\n dns.lookup(\"registry.yarnpkg.com\", (err) => {\n let proxy;\n if (err != null && (proxy = getProxy())) {\n // If a proxy is defined, we likely can't resolve external hostnames.\n // Try to resolve the proxy name as an indication of a connection.\n dns.lookup(new URL(proxy).hostname, (proxyErr) => {\n resolve(!proxyErr);\n });\n } else {\n resolve(!err);\n }\n });\n });\n};\n","export const resolveExecutable = (bin: string) =>\n process.platform === \"win32\" ? `${bin}.cmd` : bin;\n","// Removed unused eslint-disable (global-require) after migration to flat config\nimport { existsSync } from \"fs\";\nimport merge from \"lodash.merge\";\nimport type { TemplateOrExtension } from \"./loaders.js\";\nimport { getPackagePath } from \"./paths.js\";\n\n// Type for setup options\ntype GetInstallableSetupOptions = {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n [key: string]: unknown;\n};\n\n// Helper function to prepare installable setup\nconst getInstallableSetup = ({\n dependencies,\n devDependencies,\n ...packageJson\n}: GetInstallableSetupOptions) => {\n const getInstallableDeps = (deps = {}) =>\n Object.entries(deps).map(([dep, version]) => `${dep}@${version}`);\n\n return {\n packageJson,\n dependencies: getInstallableDeps(dependencies),\n devDependencies: getInstallableDeps(devDependencies),\n };\n};\n\n// Helper function to require a module if it exists, or throw an error\nconst requireIfExists = (path: string) => {\n if (existsSync(path)) {\n return require(path);\n }\n\n throw new Error(`File ${path} does not exist`);\n};\n\n// Options for loading packages\nexport type LoadPackagesOptions = {\n templatesOrExtensions?: TemplateOrExtension[];\n ignorePackage?: boolean;\n [key: string]: unknown;\n};\n\n/**\n * loadPackages loads the templatesOrExtensions packages and merge them into a single package.json\n * @param opts.templatesOrExtensions - templatesOrExtensions to load\n * @param opts.ignorePackage - ignore package.json file\n * @param opts.config - config to pass to the templatesOrExtensions package module\n * @returns\n */\nexport const loadPackages = async ({\n templatesOrExtensions = [],\n ignorePackage: globalIgnorePackage = false,\n ...config\n}: LoadPackagesOptions) => {\n // Load and merge template packages concurrently\n const setup = await Promise.all(\n templatesOrExtensions.map(async ({ url: templateOrExtension }) => {\n try {\n // Try to load and merge template package\n const template = requireIfExists(\n await getPackagePath(templateOrExtension, \"template.json\"),\n );\n return template.package || {}; // Use an empty object if template.json is not found\n } catch {\n return {}; // Ignore if template.json is not found\n }\n }),\n );\n\n // Merge all the setup results from templates\n const mergedSetup = merge(\n {\n name: config.appName,\n dependencies: {},\n devDependencies: {},\n scripts: {},\n },\n ...setup,\n );\n\n // Load and merge package.json files concurrently\n const finalSetup = await Promise.all(\n templatesOrExtensions.map(\n async ({ url: templateOrExtension, ignorePackage }) => {\n try {\n // Try to load and merge package.json\n const templateOrExtensionPackageJson = requireIfExists(\n await getPackagePath(\n templateOrExtension,\n \"package.json\",\n globalIgnorePackage || ignorePackage,\n ),\n );\n return templateOrExtensionPackageJson; // Use an empty object if package.json is not found\n } catch {\n return {}; // Ignore if package.json is not found\n }\n },\n ),\n );\n\n // Resolve package updates using package module concurrently\n const resolvedSetup = await Promise.all(\n templatesOrExtensions.map(async ({ url: templateOrExtension }) => {\n try {\n // Try to resolve package updates using package module\n const resolveTemplateOrExtensionPackage = requireIfExists(\n await getPackagePath(templateOrExtension),\n );\n return resolveTemplateOrExtensionPackage(mergedSetup, config); // Use an empty object if resolution fails\n } catch {\n return {}; // Ignore if the resolution function fails\n }\n }),\n );\n\n // Merge all setup results\n const packageJson = merge(mergedSetup, ...finalSetup, ...resolvedSetup);\n\n // Prepare the final installable setup\n return getInstallableSetup({\n ...packageJson,\n name: config.appName,\n });\n};\n","import fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport debug from \"debug\";\nimport { downloadRepository } from \"./git.js\";\n\nconst log = debug(\"cna:paths\");\n\nconst moduleDir =\n typeof __dirname !== \"undefined\"\n ? __dirname\n : path.dirname(fileURLToPath(import.meta.url));\n\n/**\n * Parse a template / extension URL (supports GitHub style and file:// URLs).\n * For GitHub style URLs we accept:\n * https://github.com/<org>/<repo>\n * https://github.com/<org>/<repo>/tree/<branch>/<subdir?>?ignorePackage=true\n * For local file templates:\n * file:///absolute/path/to/template\n * file:///absolute/path/to/repo?subdir=templates/react-vite-starter\n * Query params:\n * - ignorePackage=true -> ignore package.json from template\n * - subdir=<relativePath> (only for file://) -> pick subdirectory\n */\nconst solveValuesFromTemplateOrExtensionUrl = (templateOrExtension: string) => {\n const url = new URL(templateOrExtension);\n const ignorePackage = url.searchParams.get(\"ignorePackage\") === \"true\";\n\n if (url.protocol === \"file:\") {\n // Handle platform specific absolute paths\n let pathname = decodeURIComponent(url.pathname);\n // On Windows a file URL looks like file:///C:/path -> pathname /C:/path\n if (process.platform === \"win32\" && /^\\/[A-Za-z]:\\//.test(pathname)) {\n pathname = pathname.slice(1); // drop leading slash\n }\n const subdirParam = url.searchParams.get(\"subdir\") || \"\";\n return {\n url: templateOrExtension, // not used for git cloning when file://\n branch: \"\",\n subdir: subdirParam,\n protocol: url.protocol,\n host: \"\", // host is unused for file\n pathname,\n ignorePackage,\n };\n }\n\n const origin = `${url.protocol}//${url.host}`;\n // GitHub style path splitting: /org/repo[/tree/<branch>/<subdir...>]\n const parts = url.pathname.slice(1).split(\"/\");\n const [org, repo] = parts;\n let branch = \"\";\n let subdir = \"\";\n if (parts[2] === \"tree\") {\n branch = parts[3] || \"\";\n subdir = parts.slice(4).join(\"/\");\n }\n return {\n url: `${origin}/${org}/${repo}`,\n branch,\n subdir,\n protocol: url.protocol,\n host: url.host,\n pathname: url.pathname,\n ignorePackage,\n };\n};\n\ntype SolveRepositoryPathOptions = {\n url: string;\n branch?: string;\n subdir?: string;\n};\n\nconst solveRepositoryPath = async ({\n url,\n branch,\n subdir,\n}: SolveRepositoryPathOptions) => {\n const targetId = Buffer.from(`${url}#${branch}`).toString(\"base64\");\n const targetWithSubdir = Buffer.from(`${url}#${branch}#${subdir}`).toString(\n \"base64\",\n );\n const target = path.join(os.homedir(), \".cna\", targetWithSubdir);\n\n // Test helper: allow skipping actual git clone to prevent network / credential prompts\n if (process.env.CNA_SKIP_GIT === \"1\") {\n return { dir: target, subdir };\n }\n\n await downloadRepository({\n url,\n branch: branch || \"\",\n target,\n targetId,\n });\n\n return { dir: target, subdir };\n};\n\ntype SolvedTemplatePath = {\n dir: string;\n // subdir can be empty string or undefined\n subdir: string | undefined;\n ignorePackage: boolean | undefined;\n};\n\nconst solveTemplateOrExtensionPath = async (\n templateOrExtension: string,\n): Promise<SolvedTemplatePath> => {\n let parsed: ReturnType<typeof solveValuesFromTemplateOrExtensionUrl>;\n try {\n parsed = solveValuesFromTemplateOrExtensionUrl(templateOrExtension);\n } catch {\n // Fallback to an internal templatesOrExtensions directory (legacy behavior)\n log(\"Falling back to legacy template path for: %s\", templateOrExtension);\n return {\n dir: path.resolve(\n moduleDir,\n \"..\",\n \"templatesOrExtensions\",\n templateOrExtension,\n ),\n subdir: undefined,\n ignorePackage: undefined,\n };\n }\n\n const { url, branch, subdir, protocol, pathname, ignorePackage } = parsed;\n\n if (protocol === \"file:\") {\n return { dir: pathname, subdir, ignorePackage };\n }\n\n const gitData = await solveRepositoryPath({ url, branch, subdir });\n return { dir: gitData.dir, subdir: gitData.subdir, ignorePackage };\n};\n\nexport const getPackagePath = async (\n templateOrExtension: string,\n name = \"package\",\n ignorePackage = false,\n) => {\n const {\n dir,\n subdir,\n ignorePackage: templateOrExtensionIgnorePackage,\n } = await solveTemplateOrExtensionPath(templateOrExtension);\n\n if (\n name === \"package.json\" &&\n (ignorePackage || templateOrExtensionIgnorePackage)\n ) {\n throw new Error(\n \"package.json should be ignored for file templateOrExtension\",\n );\n }\n\n if (subdir) {\n return path.resolve(dir, subdir, name);\n }\n\n return path.resolve(dir, name);\n};\n\n/**\n * Returns the base directory for a template URL — i.e. the directory that\n * CONTAINS the optional `template/` subdirectory. This is where cna.config.json\n * should be placed by template authors.\n */\nexport const getTemplateBaseDirPath = async (\n templateOrExtensionUrl: string,\n): Promise<string> => {\n try {\n const { dir, subdir = \"\" } = await solveTemplateOrExtensionPath(\n templateOrExtensionUrl,\n );\n return path.resolve(dir, subdir);\n } catch {\n return \"\";\n }\n};\n\nexport const getTemplateDirPath = async (templateOrExtensionUrl: string) => {\n const { dir, subdir = \"\" } = await solveTemplateOrExtensionPath(\n templateOrExtensionUrl,\n );\n let templateDirPath = path.resolve(dir, subdir);\n\n // If `${templateDirPath}/template` is a directory, return it. Otherwise, return `${templateDirPath}`\n const templateDirPathWithTemplate = path.resolve(templateDirPath, \"template\");\n\n return new Promise<string>((resolve) => {\n fs.stat(templateDirPathWithTemplate, (_err, stats) => {\n if (_err) {\n resolve(templateDirPath);\n return;\n }\n\n if (stats.isDirectory()) {\n templateDirPath = templateDirPathWithTemplate;\n }\n\n resolve(templateDirPath);\n });\n });\n};\n","import os from \"os\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport debug from \"debug\";\nimport { simpleGit, type SimpleGit, type CloneOptions } from \"simple-git\";\nimport * as fse from \"fs-extra\"; // Import fs-extra for advanced file operations\n\nconst log = debug(\"cna:git\");\n\nconst formatRepositoryDownloadError = (error: unknown, url: string): string => {\n const message = error instanceof Error ? error.message : String(error);\n\n if (/not found|404|repository not found/i.test(message)) {\n return [\n `Error: Could not fetch template from '${url}'.`,\n \" → The URL returned HTTP 404 or the repository was not found. Please verify the URL is correct.\",\n \" → Run 'npx create-awesome-node-app --list-templates' to see available templates.\",\n ].join(\"\\n\");\n }\n\n if (/403|authentication|permission denied|access denied/i.test(message)) {\n return [\n `Error: Could not fetch template from '${url}'.`,\n \" → Access denied (HTTP 403). Check that the repository is public or you have access.\",\n \" → Run 'npx create-awesome-node-app --list-templates' to see available templates.\",\n ].join(\"\\n\");\n }\n\n if (/ECONNREFUSED|ENOTFOUND|ETIMEDOUT|network/i.test(message)) {\n return [\n `Error: Could not fetch template from '${url}'.`,\n \" → Could not reach the repository. Please check your internet connection.\",\n \" → Run 'npx create-awesome-node-app --list-templates' to see available templates.\",\n ].join(\"\\n\");\n }\n\n return [\n `Error: Could not fetch template from '${url}'.`,\n ` → ${message}`,\n \" → Run 'npx create-awesome-node-app --list-templates' to see available templates.\",\n ].join(\"\\n\");\n};\n\n/**\n * filter .git folder\n */\nconst filterGit = (src: string) => {\n return !/(\\\\|\\/)\\.git\\b/.test(src);\n};\n\nexport type DownloadRepositoryOptions = {\n url?: string;\n target: string;\n cacheDir?: string;\n branch?: string | undefined;\n offline?: boolean;\n targetId?: string;\n};\n\n// Create a Map to store ongoing Git operations\nconst gitOperationMap = new Map<string, Promise<void>>();\n\n// Create a Map to store completed targetIds\nconst completedTargetIds = new Map<string, boolean>();\n\n/**\n * @param opts options\n * @param opts.url The git repository url.\n * @param opts.targetId The target id. Default is `Buffer.from(`${gitUrl}@${branch}`).toString(\"base64\")`\n * @param opts.target The target folder.\n * @param opts.cacheDir? Default `~/.cache/cna/${name}`, the folder\n * @param opts.branch? Default 'main'. Git branch.\n * @param opts.offline? use cached files, and don't update.\n */\nexport const downloadRepository = async ({\n url = \"\",\n offline = false,\n target = \"./\",\n branch = \"main\",\n targetId,\n cacheDir: optsCacheDir,\n}: DownloadRepositoryOptions) => {\n const absoluteTarget = path.isAbsolute(target)\n ? target\n : path.resolve(target);\n const targetExistedBefore = fs.existsSync(absoluteTarget);\n\n const isGithub = /^[^/]+\\/[^/]+$/.test(url);\n const gitUrl = isGithub ? `https://github.com/${url}` : url;\n const id = targetId || Buffer.from(`${gitUrl}@${branch}`).toString(\"base64\");\n let cacheDir = optsCacheDir || path.join(os.homedir(), \".cache\", \"cna\", id);\n\n cacheDir = path.isAbsolute(cacheDir) ? cacheDir : path.resolve(cacheDir);\n\n log(\"cache folder: %s\", cacheDir);\n\n // Check if the targetId has already been completed (checkout done)\n if (completedTargetIds.has(id)) {\n log(\n `Git checkout for target ID '${id}' has already been completed. Skipping.`,\n );\n // Use fs-extra's copy method with filter\n await fse.copy(cacheDir, absoluteTarget, {\n overwrite: true,\n filter: filterGit,\n });\n return;\n }\n\n // Check if there is an ongoing Git operation with the same target ID\n if (gitOperationMap.has(id)) {\n log(\n `Git operation for target ID '${id}' is already in progress. Waiting...`,\n );\n await gitOperationMap.get(id);\n log(`Git operation for target ID '${id}' has completed.`);\n return;\n }\n\n // Create a new promise for the Git operation and store it in the map\n const gitOperationPromise = (async () => {\n let git: SimpleGit = simpleGit();\n const cloneOptions: CloneOptions = {\n \"--depth\": 1,\n \"--branch\": branch,\n \"--single-branch\": null,\n \"--no-tags\": null,\n };\n\n try {\n const cached = fs.existsSync(cacheDir);\n\n if (!cached) {\n log(\"Cloning repository...\");\n await git.clone(gitUrl, cacheDir, cloneOptions);\n }\n\n git = simpleGit(cacheDir);\n\n if (!offline) {\n log(\"Pulling repository...\");\n await git.checkout([\"-f\", branch]);\n await git.pull();\n }\n\n // Use fs-extra's copy method with filter\n await fse.copy(cacheDir, absoluteTarget, {\n overwrite: true,\n filter: filterGit,\n });\n\n // Mark the targetId as completed\n completedTargetIds.set(id, true);\n } catch (error) {\n if (!targetExistedBefore && fs.existsSync(absoluteTarget)) {\n try {\n fse.removeSync(absoluteTarget);\n log(\"Cleaned up partially created directory: %s\", absoluteTarget);\n } catch (cleanupErr) {\n log(\"Failed to clean up directory: %s\", cleanupErr);\n }\n }\n\n throw new Error(formatRepositoryDownloadError(error, gitUrl));\n } finally {\n // Remove the promise from the map when the operation is complete\n gitOperationMap.delete(id);\n }\n })();\n\n gitOperationMap.set(id, gitOperationPromise);\n\n // Wait for the Git operation to complete\n await gitOperationPromise;\n};\n","import fs from \"fs\";\nimport pc from \"picocolors\";\nimport { readdirp } from \"readdirp\";\nimport { dirname } from \"path\";\nimport { getTemplateDirPath } from \"./paths.js\";\nimport { promisify } from \"util\";\nimport lodash from \"lodash\";\n\nconst { template } = lodash;\n\nconst writeFileAsync = promisify(fs.writeFile);\nconst copyFileAsync = promisify(fs.copyFile);\n\n// Token used inside templates to denote the source directory.\n// Templates name a directory literally `[src]` and files inside like `[src]/App.tsx.template`.\n// We map the prefix `[src]/` to the selected srcDir (e.g. `src/`).\nconst SRC_PATH_PATTERN = \"[src]/\";\nconst DEFAULT_SRC_PATH = \"src/\";\n\nconst getSrcDirPattern = (srcDir: string) =>\n srcDir === \".\" ? \"\" : srcDir + \"/\";\n\nconst makeDirectory = (dirPath: string) => {\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n }\n};\n\nconst getModeFromPath = (path = \"\") => {\n const matchExts = (...exts: string[]) =>\n exts.find((ext) => path.endsWith(ext));\n\n if (matchExts(\".append\")) {\n return \"append\";\n }\n if (matchExts(\".append.template\", \".template.append\")) {\n return \"appendTemplate\";\n }\n if (matchExts(\".template\")) {\n return \"copyTemplate\";\n }\n return \"copy\";\n};\n\ntype FileLoaderOptions = {\n root: string;\n templateDir: string;\n appName: string;\n originalDirectory: string;\n verbose: boolean;\n useYarn?: boolean;\n usePnpm?: boolean;\n useBun?: boolean;\n srcDir: string;\n mode?: string;\n runCommand: string;\n installCommand: string;\n} & {\n [key: string]: unknown;\n};\n\nexport type FileLoader = (\n options: FileLoaderOptions,\n) => (entry: { path: string }) => Promise<void>;\n\n// Batched file copy operation\nconst batchedCopyFiles = async (\n operations: { src: string; dest: string; verbose: boolean }[],\n) => {\n const batchedPromises = operations.map(async (operation) => {\n try {\n makeDirectory(dirname(operation.dest));\n await copyFileAsync(operation.src, operation.dest);\n // Preserve original file permissions (e.g. executable bit on husky hooks)\n try {\n const srcStat = await promisify(fs.stat)(operation.src);\n await promisify(fs.chmod)(operation.dest, srcStat.mode);\n } catch {\n // Non-critical: file was already copied\n }\n if (operation.verbose) {\n console.log(\n pc.green(\n `Added \"${operation.dest}\" from \"${operation.src}\" successfully`,\n ),\n );\n }\n } catch (err) {\n console.log(\n pc.red(`Cannot copy file ${operation.src} to ${operation.dest}`),\n );\n if (operation.verbose) {\n console.log(pc.red(String(err)));\n }\n throw err;\n }\n });\n\n await Promise.all(batchedPromises);\n};\n\n// Batched file write operation\nconst batchedWriteFiles = async (\n operations: {\n path: string;\n content: string;\n flag: string;\n verbose: boolean;\n mode?: number;\n }[],\n) => {\n const batchedPromises = operations.map(async (operation) => {\n try {\n makeDirectory(dirname(operation.path));\n await writeFileAsync(operation.path, operation.content, {\n flag: operation.flag,\n mode: operation.mode,\n });\n if (operation.verbose) {\n console.log(pc.green(`Added \"${operation.path}\" successfully`));\n }\n } catch (err) {\n console.log(pc.red(`Cannot write file ${operation.path}`));\n if (operation.verbose) {\n console.log(pc.red(String(err)));\n }\n throw err;\n }\n });\n\n await Promise.all(batchedPromises);\n};\n\n// Batched file append operation\nconst batchedAppendFiles = async (\n operations: { src: string; dest: string; verbose: boolean }[],\n) => {\n const batchedPromises = operations.map(async (operation) => {\n try {\n const content = await promisify(fs.readFile)(operation.src, \"utf8\");\n const fileMode = (await promisify(fs.stat)(operation.src)).mode;\n await batchedWriteFiles([\n {\n path: operation.dest,\n content,\n flag: \"a+\",\n verbose: operation.verbose,\n mode: fileMode,\n },\n ]);\n } catch (err) {\n console.log(\n pc.red(`Cannot append file ${operation.src} to ${operation.dest}`),\n );\n if (operation.verbose) {\n console.log(pc.red(String(err)));\n }\n throw err;\n }\n });\n\n await Promise.all(batchedPromises);\n};\n\nconst copyLoader: FileLoader =\n ({ root, templateDir, verbose, srcDir }) =>\n async ({ path }) => {\n const operations = [];\n try {\n const newPath = path\n .replace(/.if-(npm|yarn|pnpm|bun)$/, \"\")\n .replace(SRC_PATH_PATTERN, getSrcDirPattern(srcDir));\n\n operations.push({\n src: `${templateDir}/${path}`,\n dest: `${root}/${newPath}`,\n verbose,\n });\n } catch (err) {\n if (verbose) {\n console.log(err);\n }\n throw err;\n }\n\n await batchedCopyFiles(operations);\n };\n\nconst appendLoader: FileLoader =\n ({ root, templateDir, verbose, srcDir }) =>\n async ({ path }) => {\n const operations = [];\n try {\n const newPath = path\n .replace(/.append$/, \"\")\n .replace(/.if-(npm|yarn|pnpm|bun)$/, \"\")\n .replace(SRC_PATH_PATTERN, getSrcDirPattern(srcDir));\n\n operations.push({\n src: `${templateDir}/${path}`,\n dest: `${root}/${newPath}`,\n verbose,\n });\n } catch (err) {\n if (verbose) {\n console.log(err);\n }\n throw err;\n }\n\n await batchedAppendFiles(operations);\n };\n\nconst templateLoader: FileLoader =\n ({\n root,\n templateDir,\n appName,\n verbose,\n mode = \"\",\n srcDir,\n runCommand,\n installCommand,\n ...customOptions\n }) =>\n async ({ path }) => {\n const operations = [];\n try {\n const flag = mode.includes(\"append\") ? \"a+\" : \"w\";\n const filePath = `${templateDir}/${path}`;\n const file = await promisify(fs.readFile)(filePath, \"utf8\");\n const fileMode = (await promisify(fs.stat)(filePath)).mode;\n const newFile = template(file);\n const newPath = path\n .replace(/.template$/, \"\")\n .replace(/.append$/, \"\")\n .replace(/.if-(npm|yarn|pnpm|bun)$/, \"\")\n .replace(SRC_PATH_PATTERN, getSrcDirPattern(srcDir));\n\n operations.push({\n path: `${root}/${newPath}`,\n content: newFile({\n projectName: appName,\n srcDir: srcDir || \".\",\n runCommand,\n installCommand,\n ...customOptions,\n }),\n flag,\n verbose,\n mode: fileMode,\n });\n } catch (err) {\n if (verbose) {\n console.log(err);\n }\n throw err;\n }\n\n await batchedWriteFiles(operations);\n };\n\nconst fileLoader: FileLoader =\n ({\n root,\n templateDir,\n appName,\n originalDirectory,\n verbose,\n useYarn,\n usePnpm,\n useBun,\n srcDir = DEFAULT_SRC_PATH,\n runCommand,\n installCommand,\n ...customOptions\n }) =>\n async ({ path }) => {\n try {\n const mode = getModeFromPath(path);\n\n const loaders = {\n copy: copyLoader,\n append: appendLoader,\n copyTemplate: templateLoader,\n // appendTemplate means treat as a template (interpolate) but append instead of overwrite\n appendTemplate: templateLoader,\n } as const;\n\n await loaders[mode]({\n root,\n templateDir,\n appName,\n originalDirectory,\n verbose,\n useYarn: !!useYarn,\n usePnpm: !!usePnpm,\n useBun: !!useBun,\n mode,\n srcDir,\n runCommand,\n installCommand,\n ...customOptions,\n })({\n path,\n });\n } catch (err) {\n if (verbose) {\n console.log(err);\n }\n throw err;\n }\n };\n\nexport type TemplateOrExtension = { url: string; ignorePackage?: boolean };\n\nexport type LoadFilesOptions = {\n root: string;\n templatesOrExtensions?: TemplateOrExtension[];\n appName: string;\n originalDirectory: string;\n verbose: boolean;\n useYarn?: boolean;\n usePnpm?: boolean;\n useBun?: boolean;\n srcDir?: string;\n runCommand: string;\n installCommand: string;\n} & {\n [key: string]: unknown;\n};\n\nexport const loadFiles = async ({\n root,\n templatesOrExtensions = [],\n appName,\n originalDirectory,\n verbose,\n useYarn = false,\n usePnpm = false,\n useBun = false,\n srcDir = DEFAULT_SRC_PATH,\n runCommand,\n installCommand,\n ...customOptions\n}: LoadFilesOptions) => {\n try {\n const operations = [];\n for await (const { url: templateOrExtensionUrl } of templatesOrExtensions) {\n const templateDir = await getTemplateDirPath(templateOrExtensionUrl);\n if (verbose) {\n try {\n const stat = fs.existsSync(templateDir)\n ? fs.statSync(templateDir)\n : undefined;\n console.log(\n pc.dim(\n `[cna] Template dir resolved: ${templateDir} exists=${!!stat} isDir=$${stat?.isDirectory?.()}`,\n ),\n );\n } catch {\n // ignore\n }\n }\n\n if (\n fs.existsSync(templateDir) &&\n fs.statSync(templateDir).isDirectory()\n ) {\n // readdirp requires at least one positive pattern when using negations; we'll include '**/*'\n // and then filter out undesired files. This ensures templates are actually discovered.\n let debugFirst = true;\n // Collect all file entries without filters then skip undesired patterns manually\n const skipGlobs = [\n /\\bpackage\\.js$/,\n /\\bpackage\\.json$/,\n /\\bpackage-lock\\.json$/,\n /\\btemplate\\.json$/,\n /\\byarn\\.lock$/,\n /\\bpnpm-lock\\.yaml$/,\n ];\n const skipManager = usePnpm\n ? [/\\.if-npm\\./, /\\.if-yarn\\./, /\\.if-bun\\./]\n : useYarn\n ? [/\\.if-npm\\./, /\\.if-pnpm\\./, /\\.if-bun\\./]\n : useBun\n ? [/\\.if-yarn\\./, /\\.if-pnpm\\./]\n : [/\\.if-yarn\\./, /\\.if-pnpm\\./, /\\.if-bun\\./];\n const shouldSkip = (p: string) =>\n [...skipGlobs, ...skipManager].some((rgx) => rgx.test(p));\n\n for await (const entry of readdirp(templateDir, {\n type: \"files\",\n alwaysStat: false,\n })) {\n if (shouldSkip(entry.path)) continue;\n if (entry.path.startsWith(\"package/\")) continue; // skip helper package dir\n if (verbose && debugFirst) {\n console.log(pc.dim(`[cna] First discovered file: ${entry.path}`));\n debugFirst = false;\n }\n operations.push({\n root,\n templateDir,\n appName,\n originalDirectory,\n verbose,\n useYarn,\n usePnpm,\n useBun,\n srcDir,\n runCommand,\n installCommand,\n entry,\n ...customOptions,\n });\n }\n }\n }\n\n if (verbose) {\n console.log(\n pc.dim(\n `[cna] Prepared ${operations.length} file operations from ${templatesOrExtensions.length} template(s)`,\n ),\n );\n if (operations.length === 0) {\n console.log(\n pc.yellow(\n \"[cna] No files discovered. Check that the template repository was cloned and fileFilter patterns are correct.\",\n ),\n );\n }\n }\n\n await Promise.all(\n operations.map((operation) => fileLoader(operation)(operation.entry)),\n );\n } catch (err) {\n if (verbose) {\n console.log(err);\n }\n throw err;\n }\n};\n","import fs from \"fs\";\nimport path from \"path\";\nimport { getTemplateBaseDirPath } from \"./paths.js\";\n\nexport type CnaCustomOption = {\n name: string;\n type: string;\n message?: string;\n initial?: unknown;\n [key: string]: unknown;\n};\n\nexport type CnaConfig = {\n customOptions?: CnaCustomOption[];\n};\n\n/**\n * Load cna.config.json from the base directory of a template.\n *\n * The config file lives alongside (not inside) the `template/` subdirectory:\n *\n * my-template/\n * cna.config.json ← here\n * template/\n * src/\n * package.json\n *\n * Works for both remote GitHub URLs (uses cached clone) and local file:// URLs.\n * Returns null if the file doesn't exist or cannot be parsed.\n */\nexport const loadTemplateCnaConfig = async (\n templateUrl: string,\n): Promise<CnaConfig | null> => {\n try {\n const basePath = await getTemplateBaseDirPath(templateUrl);\n if (!basePath) return null;\n\n const configPath = path.join(basePath, \"cna.config.json\");\n if (!fs.existsSync(configPath)) return null;\n\n const content = fs.readFileSync(configPath, \"utf8\");\n return JSON.parse(content) as CnaConfig;\n } catch {\n return null;\n }\n};\n"],"mappings":"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","names":["import_picocolors","import_semver","import_child_process","import_lodash","import_path","import_fs","import_picocolors","import_os","import_semver","import_child_process","pc","spawn","line","semver","dns","import_fs","import_fs","import_os","import_path","import_url","import_debug","debug","path","fs","os","log","debug","path","os","fs","path","template","merge","import_fs","import_picocolors","import_path","import_lodash","lodash","fs","path","pc","lodash","pc","packageJson","fs","path","os","simpleGit","semver","import_fs","import_path","path","fs","semver","pc","envinfo"]}
|
|
1
|
+
{"version":3,"sources":["../index.ts","../installer.ts","../helpers.ts","../executable.ts","../package.ts","../paths.ts","../git.ts","../loaders.ts","../config.ts"],"sourcesContent":["import pc from \"picocolors\";\nimport envinfo from \"envinfo\";\nimport semver from \"semver\";\nimport { execFileSync } from \"child_process\";\nimport type { TemplateOrExtension } from \"./loaders.js\";\nexport type { TemplateOrExtension } from \"./loaders.js\";\nimport { createApp } from \"./installer.js\";\nimport { resolveExecutable } from \"./executable.js\";\nexport {\n getPackagePath,\n getTemplateDirPath,\n getTemplateBaseDirPath,\n} from \"./paths.js\";\nexport { downloadRepository } from \"./git.js\";\nexport { loadTemplateCnaConfig } from \"./config.js\";\nexport type { CnaConfig, CnaCustomOption } from \"./config.js\";\n\nexport const checkNodeVersion = (\n requiredVersion: string,\n packageName: string,\n) => {\n if (!semver.satisfies(process.version, requiredVersion)) {\n console.error(\n pc.red(\n `You are running Node ${process.version}.\\n` +\n `${packageName} requires Node ${requiredVersion}.\\n` +\n \"Please update your version of Node.\",\n ),\n );\n process.exit(1);\n }\n};\n\nexport const checkForLatestVersion = async (packageName: string) => {\n try {\n const response = await fetch(\n `https://registry.npmjs.org/-/package/${packageName}/dist-tags`,\n );\n if (!response.ok) {\n throw new Error(\"Registry request failed\");\n }\n const json = (await response.json()) as unknown;\n if (json && typeof json === \"object\" && \"latest\" in json) {\n return String((json as Record<string, unknown>)[\"latest\"]);\n }\n return null;\n } catch {\n try {\n return execFileSync(resolveExecutable(\"npm\"), [\n \"view\",\n packageName,\n \"version\",\n ])\n .toString()\n .trim();\n } catch {\n // ignore\n }\n }\n return null;\n};\n\nexport const printEnvInfo = async () => {\n console.log(pc.bold(\"\\nEnvironment Info:\"));\n const info = await envinfo.run(\n {\n System: [\"OS\", \"CPU\", \"Memory\", \"Shell\"],\n Binaries: [\"Node\", \"npm\", \"pnpm\", \"Yarn\", \"Bun\", \"Watchman\"],\n Browsers: [\"Chrome\", \"Edge\", \"Internet Explorer\", \"Firefox\", \"Safari\"],\n },\n {\n duplicates: true,\n showNotFound: true,\n },\n );\n console.log(info);\n process.exit(0);\n};\n\nexport type CnaOptions = {\n projectName: string;\n info?: boolean;\n verbose?: boolean;\n packageManager?: string;\n install?: boolean;\n template?: string;\n templatesOrExtensions?: TemplateOrExtension[];\n} & {\n [key: string]: unknown;\n};\n\nexport type CnaOptionsTransform = (options: CnaOptions) => Promise<CnaOptions>;\n\nexport const createNodeApp = async (\n programName: string,\n options: CnaOptions,\n transformOptions: CnaOptionsTransform,\n) => {\n if (options.info) {\n await printEnvInfo();\n }\n\n if (typeof options.projectName === \"undefined\") {\n console.error(\"Please specify the project directory:\");\n console.log(` ${pc.cyan(programName)} ${pc.green(\"[project-directory]\")}`);\n console.log();\n console.log(\"For example:\");\n console.log(` ${pc.cyan(programName)} ${pc.green(\"my-app\")}`);\n console.log();\n console.log(`Run ${pc.cyan(`${programName} --help`)} to see all options.`);\n process.exit(1);\n }\n\n const appOptions = await transformOptions(options);\n await createApp({\n ...appOptions,\n name: appOptions.projectName,\n installDependencies: options.install ?? true,\n });\n};\n","import lodash from \"lodash\";\n\nconst { isEmpty } = lodash;\nimport path from \"path\";\nimport fs from \"fs\";\nimport pc from \"picocolors\";\nimport os from \"os\";\nimport semver from \"semver\";\nimport { execFileSync } from \"child_process\";\n// Use dynamic import for simple-git to avoid bundlers injecting unsupported dynamic requires in ESM\nimport type { SimpleGit, SimpleGitOptions } from \"simple-git\";\n\nimport {\n shouldUseYarn,\n checkThatNpmCanReadCwd,\n checkNpmVersion,\n checkIfOnline,\n shouldUsePnpm,\n shouldUseBun,\n} from \"./helpers.js\";\nimport { loadPackages } from \"./package.js\";\nimport type { TemplateOrExtension } from \"./loaders.js\";\nimport { loadFiles } from \"./loaders.js\";\nimport { resolveExecutable } from \"./executable.js\";\n\nconst install = async (\n root: string,\n useYarn = false,\n usePnpm = false,\n useBun = false,\n dependencies: string[] = [],\n verbose = false,\n isOnline = true,\n isDevDependencies = false,\n) => {\n let command: string;\n let args: string[];\n\n if (useYarn) {\n command = \"yarnpkg\";\n args = [\"add\", \"--ignore-workspace-root-check\"];\n if (!isOnline) {\n args.push(\"--offline\");\n }\n if (isDevDependencies) {\n args.push(\"--dev\");\n }\n args.push(...dependencies);\n args.push(\"--cwd\");\n args.push(root);\n\n if (!isOnline) {\n console.log(pc.yellow(\"You appear to be offline.\"));\n console.log(pc.yellow(\"Falling back to the local Yarn cache.\"));\n console.log();\n }\n } else if (usePnpm) {\n command = \"pnpm\";\n args = [\"install\", \"--ignore-workspace\", \"--loglevel\", \"error\"];\n if (isDevDependencies) {\n args.push(\"--save-dev\");\n } else {\n args.push(\"--save\");\n }\n\n args.push(...dependencies);\n } else if (useBun) {\n command = \"bun\";\n if (dependencies.length > 0) {\n args = [\"add\"];\n if (isDevDependencies) {\n args.push(\"--dev\");\n }\n args.push(...dependencies);\n } else {\n args = [\"install\"];\n }\n } else {\n command = \"npm\";\n args = [\"install\", \"--loglevel\", \"error\"];\n if (isDevDependencies) {\n args.push(\"--save-dev\");\n } else {\n args.push(\"--save\");\n }\n\n args.push(...dependencies);\n }\n\n if (verbose) {\n args.push(\"--verbose\");\n }\n\n try {\n execFileSync(resolveExecutable(command), args, {\n cwd: root,\n stdio: \"inherit\",\n });\n } catch {\n throw new Error(`${command} ${args.join(\" \")}`);\n }\n};\n\nexport type RunOptions = {\n root: string;\n appName: string;\n originalDirectory: string;\n verbose?: boolean;\n useYarn?: boolean;\n usePnpm?: boolean;\n useBun?: boolean;\n templatesOrExtensions?: TemplateOrExtension[];\n dependencies?: string[];\n devDependencies?: string[];\n installDependencies?: boolean;\n runCommand: string;\n installCommand: string;\n} & {\n [key: string]: unknown;\n};\n\nconst runCommandInProjectDir = async (\n root: string,\n command: string,\n args: string[] = [],\n successMessage = \"Operation completed successfully.\",\n errorMessage = \"Operation failed.\",\n) => {\n const [executable, ...baseArgs] =\n command === \"npm run\"\n ? [\"npm\", \"run\"]\n : command === \"pnpm run\"\n ? [\"pnpm\", \"run\"]\n : command === \"bun run\"\n ? [\"bun\", \"run\"]\n : [command];\n\n try {\n execFileSync(resolveExecutable(executable), [...baseArgs, ...args], {\n cwd: root,\n stdio: \"ignore\",\n });\n console.log(pc.green(successMessage));\n } catch {\n console.log();\n console.log(pc.red(errorMessage));\n console.log();\n }\n};\n\nfunction extractNameAndVersion(dependencyString: string) {\n // extract the name and version from the dependency string separated by @\n // e.g. @types/react@^16\n // => name: @types/react\n // => version: ^16\n // e.g. react@^16\n // => name: react\n // => version: ^16\n\n // Find the last \"@\" symbol to split the string\n const lastIndex = dependencyString.lastIndexOf(\"@\");\n\n if (lastIndex !== -1) {\n // Split the string into name and version parts\n const name = dependencyString.substring(0, lastIndex); // Name\n const version = dependencyString.substring(lastIndex + 1); // Version\n\n return { name, version };\n } else {\n // If \"@\" is not present, treat the whole string as the name\n return { name: dependencyString, version: \"\" };\n }\n}\n\nconst run = async ({\n root,\n appName,\n originalDirectory,\n verbose = false,\n useYarn = false,\n usePnpm = false,\n useBun = false,\n templatesOrExtensions = [],\n dependencies = [],\n devDependencies = [],\n installDependencies = true,\n runCommand = \"\",\n installCommand = \"\",\n ...customOptions\n}: RunOptions) => {\n const isOnline = useYarn ? await checkIfOnline(useYarn) : true;\n\n if (isEmpty(templatesOrExtensions)) {\n console.log();\n console.log(\n pc.yellow(\n \"No templates or extensions specified to bootstrap application.\",\n ),\n );\n console.log();\n process.exit(0);\n }\n\n console.log();\n console.log(\"Scaffolding project in \" + root + \"...\");\n\n await loadFiles({\n root,\n templatesOrExtensions,\n appName,\n originalDirectory,\n verbose,\n useYarn,\n usePnpm,\n useBun,\n runCommand,\n installCommand,\n ...customOptions,\n });\n\n console.log();\n console.log(pc.green(\"Successfully scaffolded project.\"));\n console.log();\n\n if (installDependencies) {\n console.log(\n pc.green(\"Installing packages. This might take a couple of minutes.\"),\n );\n console.log(pc.green(\"Installing dependencies...\"));\n console.log();\n // Install dependencies\n await install(\n root,\n useYarn,\n usePnpm,\n useBun,\n dependencies,\n verbose,\n isOnline,\n false,\n );\n\n if (devDependencies.length > 0) {\n console.log();\n console.log(pc.green(\"Installing devDependencies...\"));\n console.log();\n // Install devDependencies\n await install(\n root,\n useYarn,\n usePnpm,\n useBun,\n devDependencies,\n verbose,\n isOnline,\n true,\n );\n }\n } else {\n console.log(pc.yellow(\"Skip package installation.\"));\n const packageJson = JSON.parse(\n fs.readFileSync(`${root}/package.json`, \"utf8\"),\n );\n\n const updateDependencies = (deps: string[]) => {\n return deps.reduce(\n (dep, elem) => {\n const nextDep = dep;\n if (/.+@(\\^|~)?[0-9a-zA-Z-.]+$/.test(elem)) {\n const { name, version } = extractNameAndVersion(elem);\n nextDep[name] = version;\n } else {\n nextDep[elem] = \"*\";\n }\n return nextDep;\n },\n {} as { [key: string]: string },\n );\n };\n\n packageJson.dependencies = updateDependencies(dependencies);\n packageJson.devDependencies = updateDependencies(devDependencies);\n\n fs.writeFileSync(\n path.join(root, \"package.json\"),\n JSON.stringify(packageJson, null, 2) + os.EOL,\n );\n\n console.log();\n console.log(pc.green(\"Successfully updated package.json.\"));\n console.log(pc.yellow(`Run ${pc.cyan(installCommand)} to install.`));\n }\n\n console.log();\n console.log(\"Initializing git repository...\");\n\n try {\n const { simpleGit } = (await import(\"simple-git\")) as unknown as {\n simpleGit: (\n baseDir?: string,\n options?: Partial<SimpleGitOptions>,\n ) => SimpleGit;\n };\n const git = simpleGit(root);\n await git.init();\n console.log(pc.green(\"Successfully initialized git repository.\"));\n } catch {\n console.log();\n console.log(\n pc.red(\n \"Failed to initialize git repository. Run `git init` to initialize git repository after the process is completed.\",\n ),\n );\n console.log();\n }\n\n if (installDependencies && isOnline) {\n const packageJson = JSON.parse(\n fs.readFileSync(`${root}/package.json`, \"utf8\"),\n );\n\n const runFormat = async () => {\n try {\n await runCommandInProjectDir(\n root,\n runCommand,\n [\"format\"],\n \"Successfully formatted code.\",\n `Failed to format code. Run \\`${runCommand} format\\` to format code after the process is completed.`,\n );\n } catch {\n // ignore\n }\n };\n\n const runLintFix = async () => {\n try {\n await runCommandInProjectDir(\n root,\n runCommand,\n [\"lint:fix\"],\n \"Successfully fixed linting errors.\",\n `Failed to fix linting errors. Run \\`${runCommand} lint:fix\\` to fix linting errors after the process is completed.`,\n );\n } catch {\n // ignore\n }\n };\n\n if (packageJson.scripts && packageJson.scripts[\"format\"]) {\n await runFormat();\n }\n if (packageJson.scripts && packageJson.scripts[\"lint:fix\"]) {\n await runLintFix();\n }\n }\n\n // Print out instructions\n console.log();\n console.log(pc.green(\"Successfully created project \" + appName + \".\"));\n console.log();\n console.log(\"Done! Now run:\");\n console.log();\n console.log(pc.cyan(` cd ${appName}`));\n console.log(pc.cyan(` ${installCommand}`));\n\n const packageJson = JSON.parse(\n fs.readFileSync(`${root}/package.json`, \"utf8\"),\n );\n\n const lookForScripts = [\"compose:up\", \"sls:offline\", \"dev\", \"start\"];\n\n for (const script of lookForScripts) {\n if (packageJson.scripts && packageJson.scripts[script]) {\n console.log(pc.cyan(` ${runCommand} ${script}`));\n break;\n }\n }\n\n console.log();\n console.log(pc.green(\"Happy hacking!\"));\n};\n\nexport type CreateAppOptions = {\n name: string;\n verbose?: boolean;\n packageManager?: string;\n templatesOrExtensions?: TemplateOrExtension[];\n installDependencies?: boolean;\n ignorePackage?: boolean;\n} & {\n [key: string]: unknown;\n};\n\nexport const createApp = async ({\n name,\n verbose = false,\n templatesOrExtensions = [],\n installDependencies = true,\n ignorePackage = false,\n ...customOptions\n}: CreateAppOptions) => {\n const root = path.resolve(name);\n const appName = path.basename(root);\n\n fs.mkdirSync(name, {\n recursive: true,\n });\n\n console.log(`Creating a new Node app in ${pc.green(root)}.`);\n console.log();\n\n const useYarn = customOptions.packageManager === \"yarn\" && shouldUseYarn();\n const usePnpm = customOptions.packageManager === \"pnpm\" && shouldUsePnpm();\n const useBun = customOptions.packageManager === \"bun\" && shouldUseBun();\n const runCommand = useYarn\n ? \"yarn\"\n : usePnpm\n ? \"pnpm run\"\n : useBun\n ? \"bun run\"\n : \"npm run\";\n const installCommand = useYarn\n ? \"yarn\"\n : usePnpm\n ? \"pnpm install\"\n : useBun\n ? \"bun install\"\n : \"npm install\";\n\n const { packageJson, dependencies, devDependencies } = await loadPackages({\n templatesOrExtensions,\n appName,\n usePnpm,\n useYarn,\n useBun,\n runCommand,\n ignorePackage,\n });\n\n fs.writeFileSync(\n path.join(root, \"package.json\"),\n JSON.stringify(packageJson, null, 2) + os.EOL,\n );\n\n const originalDirectory = process.cwd();\n process.chdir(root);\n if (!useYarn && !useBun && !checkThatNpmCanReadCwd()) {\n process.exit(1);\n }\n\n if (!semver.satisfies(process.version, \">=18.0.0\")) {\n console.log(\n pc.yellow(\n `You are using Node ${process.version} so the project will be bootstrapped with an old unsupported version of tools.\\n\\n` +\n `Please update to Node 18 or higher for a better, fully supported experience.\\n`,\n ),\n );\n }\n\n if (!useYarn && !useBun) {\n const npmInfo = checkNpmVersion();\n if (!npmInfo.hasMinNpm) {\n if (npmInfo.npmVersion) {\n console.log(\n pc.yellow(\n `You are using npm ${npmInfo.npmVersion} so the project will be bootstrapped with an old unsupported version of tools.\\n\\n` +\n `Please update to npm 3 or higher for a better, fully supported experience.\\n`,\n ),\n );\n }\n }\n }\n\n if (useYarn) {\n let yarnUsesDefaultRegistry = true;\n try {\n yarnUsesDefaultRegistry =\n execFileSync(resolveExecutable(\"yarnpkg\"), [\n \"config\",\n \"get\",\n \"registry\",\n ])\n .toString()\n .trim() === \"https://registry.yarnpkg.com\";\n } catch {\n // ignore\n }\n if (false && yarnUsesDefaultRegistry) {\n fs.cpSync(\n require.resolve(\"./yarn.lock.cached\"),\n path.join(root, \"yarn.lock\"),\n { force: true },\n );\n }\n }\n\n return run({\n root,\n appName,\n originalDirectory,\n verbose,\n useYarn,\n usePnpm,\n useBun,\n templatesOrExtensions,\n dependencies,\n devDependencies,\n installDependencies,\n runCommand,\n installCommand,\n ...customOptions,\n });\n};\n","import { execFileSync } from \"child_process\";\nimport spawn from \"cross-spawn\";\nimport pc from \"picocolors\";\nimport semver from \"semver\";\nimport dns from \"dns\";\nimport { URL } from \"url\";\nimport { resolveExecutable } from \"./executable.js\";\n\nexport const toCamelCase = (str: string) => {\n // Lower cases the string\n return (\n str\n .toLowerCase()\n // Replaces any - or _ characters with a space\n .replace(/[-_]+/g, \" \")\n // Removes any non alphanumeric characters\n .replace(/[^\\w\\s]/g, \"\")\n // Uppercases the first character in each group immediately following a space\n // (delimited by spaces)\n .replace(/ (.)/g, ($1) => {\n return $1.toUpperCase();\n })\n // Removes spaces\n .replace(/ /g, \"\")\n );\n};\n\nexport const isUsingYarn = () => {\n return (process.env.npm_config_user_agent || \"\").indexOf(\"yarn\") === 0;\n};\n\nexport const shouldUseYarn = () => {\n const { hasMinYarnPnp, hasMaxYarnPnp, yarnVersion } = checkYarnVersion();\n\n if (!hasMinYarnPnp) {\n console.log(\n pc.yellow(\n `You are using yarn version ${pc.bold(\n yarnVersion,\n )} which is not supported yet. ` +\n `To use Yarn, install v1.12.0 or higher and lower than v2.0.0. ` +\n `See https://yarnpkg.com for instructions on how to update.`,\n ),\n );\n return false;\n }\n\n if (!hasMaxYarnPnp) {\n console.log(\n pc.yellow(\n `You are using a pre-release version of Yarn which is not supported yet. ` +\n `To use Yarn, install v1.12.0 or higher and lower than v2.0.0. ` +\n `See https://yarnpkg.com for instructions on how to update.`,\n ),\n );\n return false;\n }\n\n return true;\n};\n\nexport const shouldUsePnpm = () => {\n const { hasMinPnpm, pnpmVersion } = checkPnpmVersion();\n\n if (!hasMinPnpm) {\n console.log(\n pc.yellow(\n `You are using pnpm version ${pc.bold(\n pnpmVersion,\n )} which is not supported yet. ` +\n `To use pnpm, install v5.0.0 or higher. ` +\n `See https://pnpm.js.org for instructions on how to update.`,\n ),\n );\n return false;\n }\n\n return true;\n};\n\nexport const shouldUseBun = () => {\n const { hasMinBun, bunVersion } = checkBunVersion();\n\n if (!hasMinBun) {\n console.log(\n pc.yellow(\n `You are using bun version ${pc.bold(\n bunVersion,\n )} which is not supported yet. ` +\n `To use bun, install v1.0.0 or higher. ` +\n `See https://bun.sh for instructions on how to install.`,\n ),\n );\n return false;\n }\n\n return true;\n};\n\nexport const checkThatNpmCanReadCwd = () => {\n const cwd = process.cwd();\n let childOutput = null;\n try {\n // Note: intentionally using spawn over exec since\n // the problem doesn't reproduce otherwise.\n // `npm config list` is the only reliable way I could find\n // to reproduce the wrong path. Just printing process.cwd()\n // in a Node process was not enough.\n childOutput = spawn.sync(\"npm\", [\"config\", \"list\"]).output.join(\"\");\n } catch {\n // Something went wrong spawning node.\n // Not great, but it means we can't do this check.\n // We might fail later on, but let's continue.\n return true;\n }\n if (typeof childOutput !== \"string\") {\n return true;\n }\n const lines = childOutput.split(\"\\n\");\n // `npm config list` output includes the following line:\n // \"; cwd = C:\\path\\to\\current\\dir\" (unquoted)\n // I couldn't find an easier way to get it.\n const prefix = \"; cwd = \";\n const line = lines.find((line) => line.startsWith(prefix));\n if (typeof line !== \"string\") {\n // Fail gracefully. They could remove it.\n return true;\n }\n const npmCWD = line.substring(prefix.length);\n if (npmCWD === cwd) {\n return true;\n }\n console.error(\n pc.red(\n `Could not start an npm process in the right directory.\\n\\n` +\n `The current directory is: ${pc.bold(cwd)}\\n` +\n `However, a newly started npm process runs in: ${pc.bold(npmCWD)}\\n\\n` +\n `This is probably caused by a misconfigured system terminal shell.`,\n ),\n );\n if (process.platform === \"win32\") {\n console.error(\n pc.red(`On Windows, this can usually be fixed by running:\\n\\n`) +\n ` ${pc.cyan(\n \"reg\",\n )} delete \"HKCU\\\\Software\\\\Microsoft\\\\Command Processor\" /v AutoRun /f\\n` +\n ` ${pc.cyan(\n \"reg\",\n )} delete \"HKLM\\\\Software\\\\Microsoft\\\\Command Processor\" /v AutoRun /f\\n\\n` +\n pc.red(`Try to run the above two lines in the terminal.\\n`) +\n pc.red(\n `To learn more about this problem, read: https://blogs.msdn.microsoft.com/oldnewthing/20071121-00/?p=24433/`,\n ),\n );\n }\n return false;\n};\n\nexport const checkPnpmVersion = () => {\n const minPnpm = \"5.0.0\";\n let hasMinPnpm = false;\n let pnpmVersion = null;\n try {\n pnpmVersion = execFileSync(resolveExecutable(\"pnpm\"), [\"--version\"])\n .toString()\n .trim();\n if (semver.valid(pnpmVersion)) {\n hasMinPnpm = semver.gte(pnpmVersion, minPnpm);\n } else {\n // Handle non-semver compliant pnpm version strings, which pnpm currently\n // uses for nightly builds. The regex truncates anything after the first\n // dash. See #5362.\n const trimmedPnpmVersionMatch = /^(.*?)[-+].+$/.exec(pnpmVersion);\n if (trimmedPnpmVersionMatch && trimmedPnpmVersionMatch[1]) {\n hasMinPnpm = semver.gte(trimmedPnpmVersionMatch[1], minPnpm);\n }\n }\n } catch {\n // Ignore errors.\n }\n return { hasMinPnpm, pnpmVersion };\n};\n\nexport const checkBunVersion = () => {\n const minBun = \"1.0.0\";\n let hasMinBun = false;\n let bunVersion = null;\n try {\n bunVersion = execFileSync(resolveExecutable(\"bun\"), [\"--version\"])\n .toString()\n .trim();\n if (semver.valid(bunVersion)) {\n hasMinBun = semver.gte(bunVersion, minBun);\n }\n } catch {\n // ignore\n }\n return { hasMinBun, bunVersion };\n};\n\nexport const checkYarnVersion = () => {\n const minYarnPnp = \"1.12.0\";\n const maxYarnPnp = \"2.0.0\";\n let hasMinYarnPnp = false;\n let hasMaxYarnPnp = false;\n let yarnVersion = null;\n try {\n yarnVersion = execFileSync(resolveExecutable(\"yarnpkg\"), [\"--version\"])\n .toString()\n .trim();\n if (semver.valid(yarnVersion)) {\n hasMinYarnPnp = semver.gte(yarnVersion, minYarnPnp);\n hasMaxYarnPnp = semver.lt(yarnVersion, maxYarnPnp);\n } else {\n // Handle non-semver compliant yarn version strings, which yarn currently\n // uses for nightly builds. The regex truncates anything after the first\n // dash. See #5362.\n const trimmedYarnVersionMatch = /^(.+?)[-+].+$/.exec(yarnVersion);\n if (trimmedYarnVersionMatch) {\n const trimmedYarnVersion = trimmedYarnVersionMatch.pop();\n if (trimmedYarnVersion) {\n hasMinYarnPnp = semver.gte(trimmedYarnVersion, minYarnPnp);\n hasMaxYarnPnp = semver.lt(trimmedYarnVersion, maxYarnPnp);\n }\n }\n }\n } catch {\n // ignore\n }\n return {\n hasMinYarnPnp: hasMinYarnPnp,\n hasMaxYarnPnp: hasMaxYarnPnp,\n yarnVersion: yarnVersion,\n };\n};\n\nexport const checkNpmVersion = () => {\n let hasMinNpm = false;\n let npmVersion = null;\n try {\n npmVersion = execFileSync(resolveExecutable(\"npm\"), [\"--version\"])\n .toString()\n .trim();\n hasMinNpm = semver.gte(npmVersion, \"6.0.0\");\n } catch {\n // ignore\n }\n return {\n hasMinNpm: hasMinNpm,\n npmVersion: npmVersion,\n };\n};\n\nconst getProxy = () => {\n if (process.env.HTTPS_PROXY) {\n return process.env.HTTPS_PROXY;\n }\n try {\n // Trying to read https-proxy from .npmrc\n const httpsProxy = execFileSync(resolveExecutable(\"npm\"), [\n \"config\",\n \"get\",\n \"https-proxy\",\n ])\n .toString()\n .trim();\n return httpsProxy !== \"null\" ? httpsProxy : undefined;\n } catch {\n // ignore\n }\n return \"\";\n};\n\nexport const checkIfOnline = (useYarn?: boolean) => {\n if (!useYarn) {\n // Don't ping the Yarn registry.\n // We'll just assume the best case.\n return Promise.resolve(true);\n }\n\n return new Promise<boolean>((resolve) => {\n dns.lookup(\"registry.yarnpkg.com\", (err) => {\n let proxy;\n if (err != null && (proxy = getProxy())) {\n // If a proxy is defined, we likely can't resolve external hostnames.\n // Try to resolve the proxy name as an indication of a connection.\n dns.lookup(new URL(proxy).hostname, (proxyErr) => {\n resolve(!proxyErr);\n });\n } else {\n resolve(!err);\n }\n });\n });\n};\n","export const resolveExecutable = (bin: string) =>\n process.platform === \"win32\" ? `${bin}.cmd` : bin;\n","// Removed unused eslint-disable (global-require) after migration to flat config\nimport { existsSync } from \"fs\";\nimport merge from \"lodash.merge\";\nimport type { TemplateOrExtension } from \"./loaders.js\";\nimport { getPackagePath } from \"./paths.js\";\n\n// Type for setup options\ntype GetInstallableSetupOptions = {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n [key: string]: unknown;\n};\n\n// Helper function to prepare installable setup\nconst getInstallableSetup = ({\n dependencies,\n devDependencies,\n ...packageJson\n}: GetInstallableSetupOptions) => {\n const getInstallableDeps = (deps = {}) =>\n Object.entries(deps).map(([dep, version]) => `${dep}@${version}`);\n\n return {\n packageJson,\n dependencies: getInstallableDeps(dependencies),\n devDependencies: getInstallableDeps(devDependencies),\n };\n};\n\n// Helper function to require a module if it exists, or throw an error\nconst requireIfExists = (path: string) => {\n if (existsSync(path)) {\n return require(path);\n }\n\n throw new Error(`File ${path} does not exist`);\n};\n\n// Options for loading packages\nexport type LoadPackagesOptions = {\n templatesOrExtensions?: TemplateOrExtension[];\n ignorePackage?: boolean;\n [key: string]: unknown;\n};\n\n/**\n * loadPackages loads the templatesOrExtensions packages and merge them into a single package.json\n * @param opts.templatesOrExtensions - templatesOrExtensions to load\n * @param opts.ignorePackage - ignore package.json file\n * @param opts.config - config to pass to the templatesOrExtensions package module\n * @returns\n */\nexport const loadPackages = async ({\n templatesOrExtensions = [],\n ignorePackage: globalIgnorePackage = false,\n ...config\n}: LoadPackagesOptions) => {\n // Load and merge template packages concurrently\n const setup = await Promise.all(\n templatesOrExtensions.map(async ({ url: templateOrExtension }) => {\n try {\n // Try to load and merge template package\n const template = requireIfExists(\n await getPackagePath(templateOrExtension, \"template.json\"),\n );\n return template.package || {}; // Use an empty object if template.json is not found\n } catch {\n return {}; // Ignore if template.json is not found\n }\n }),\n );\n\n // Merge all the setup results from templates\n const mergedSetup = merge(\n {\n name: config.appName,\n dependencies: {},\n devDependencies: {},\n scripts: {},\n },\n ...setup,\n );\n\n // Load and merge package.json files concurrently\n const finalSetup = await Promise.all(\n templatesOrExtensions.map(\n async ({ url: templateOrExtension, ignorePackage }) => {\n try {\n // Try to load and merge package.json\n const templateOrExtensionPackageJson = requireIfExists(\n await getPackagePath(\n templateOrExtension,\n \"package.json\",\n globalIgnorePackage || ignorePackage,\n ),\n );\n return templateOrExtensionPackageJson; // Use an empty object if package.json is not found\n } catch {\n return {}; // Ignore if package.json is not found\n }\n },\n ),\n );\n\n // Resolve package updates using package module concurrently\n const resolvedSetup = await Promise.all(\n templatesOrExtensions.map(async ({ url: templateOrExtension }) => {\n try {\n // Try to resolve package updates using package module\n const resolveTemplateOrExtensionPackage = requireIfExists(\n await getPackagePath(templateOrExtension),\n );\n return resolveTemplateOrExtensionPackage(mergedSetup, config); // Use an empty object if resolution fails\n } catch {\n return {}; // Ignore if the resolution function fails\n }\n }),\n );\n\n // Merge all setup results\n const packageJson = merge(mergedSetup, ...finalSetup, ...resolvedSetup);\n\n // Prepare the final installable setup\n return getInstallableSetup({\n ...packageJson,\n name: config.appName,\n });\n};\n","import fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\nimport debug from \"debug\";\nimport { downloadRepository } from \"./git.js\";\n\nconst log = debug(\"cna:paths\");\n\nconst moduleDir = __dirname;\n\n/**\n * Parse a template / extension URL (supports GitHub style and file:// URLs).\n * For GitHub style URLs we accept:\n * https://github.com/<org>/<repo>\n * https://github.com/<org>/<repo>/tree/<branch>/<subdir?>?ignorePackage=true\n * For local file templates:\n * file:///absolute/path/to/template\n * file:///absolute/path/to/repo?subdir=templates/react-vite-starter\n * Query params:\n * - ignorePackage=true -> ignore package.json from template\n * - subdir=<relativePath> (only for file://) -> pick subdirectory\n */\nconst solveValuesFromTemplateOrExtensionUrl = (templateOrExtension: string) => {\n const url = new URL(templateOrExtension);\n const ignorePackage = url.searchParams.get(\"ignorePackage\") === \"true\";\n\n if (url.protocol === \"file:\") {\n // Handle platform specific absolute paths\n let pathname = decodeURIComponent(url.pathname);\n // On Windows a file URL looks like file:///C:/path -> pathname /C:/path\n if (process.platform === \"win32\" && /^\\/[A-Za-z]:\\//.test(pathname)) {\n pathname = pathname.slice(1); // drop leading slash\n }\n const subdirParam = url.searchParams.get(\"subdir\") || \"\";\n return {\n url: templateOrExtension, // not used for git cloning when file://\n branch: \"\",\n subdir: subdirParam,\n protocol: url.protocol,\n host: \"\", // host is unused for file\n pathname,\n ignorePackage,\n };\n }\n\n const origin = `${url.protocol}//${url.host}`;\n // GitHub style path splitting: /org/repo[/tree/<branch>/<subdir...>]\n const parts = url.pathname.slice(1).split(\"/\");\n const [org, repo] = parts;\n let branch = \"\";\n let subdir = \"\";\n if (parts[2] === \"tree\") {\n branch = parts[3] || \"\";\n subdir = parts.slice(4).join(\"/\");\n }\n return {\n url: `${origin}/${org}/${repo}`,\n branch,\n subdir,\n protocol: url.protocol,\n host: url.host,\n pathname: url.pathname,\n ignorePackage,\n };\n};\n\ntype SolveRepositoryPathOptions = {\n url: string;\n branch?: string;\n subdir?: string;\n};\n\nconst solveRepositoryPath = async ({\n url,\n branch,\n subdir,\n}: SolveRepositoryPathOptions) => {\n const targetId = Buffer.from(`${url}#${branch}`).toString(\"base64\");\n const targetWithSubdir = Buffer.from(`${url}#${branch}#${subdir}`).toString(\n \"base64\",\n );\n const target = path.join(os.homedir(), \".cna\", targetWithSubdir);\n\n // Test helper: allow skipping actual git clone to prevent network / credential prompts\n if (process.env.CNA_SKIP_GIT === \"1\") {\n return { dir: target, subdir };\n }\n\n await downloadRepository({\n url,\n branch: branch || \"\",\n target,\n targetId,\n });\n\n return { dir: target, subdir };\n};\n\ntype SolvedTemplatePath = {\n dir: string;\n // subdir can be empty string or undefined\n subdir: string | undefined;\n ignorePackage: boolean | undefined;\n};\n\nconst solveTemplateOrExtensionPath = async (\n templateOrExtension: string,\n): Promise<SolvedTemplatePath> => {\n let parsed: ReturnType<typeof solveValuesFromTemplateOrExtensionUrl>;\n try {\n parsed = solveValuesFromTemplateOrExtensionUrl(templateOrExtension);\n } catch {\n // Fallback to an internal templatesOrExtensions directory (legacy behavior)\n log(\"Falling back to legacy template path for: %s\", templateOrExtension);\n return {\n dir: path.resolve(\n moduleDir,\n \"..\",\n \"templatesOrExtensions\",\n templateOrExtension,\n ),\n subdir: undefined,\n ignorePackage: undefined,\n };\n }\n\n const { url, branch, subdir, protocol, pathname, ignorePackage } = parsed;\n\n if (protocol === \"file:\") {\n return { dir: pathname, subdir, ignorePackage };\n }\n\n const gitData = await solveRepositoryPath({ url, branch, subdir });\n return { dir: gitData.dir, subdir: gitData.subdir, ignorePackage };\n};\n\nexport const getPackagePath = async (\n templateOrExtension: string,\n name = \"package\",\n ignorePackage = false,\n) => {\n const {\n dir,\n subdir,\n ignorePackage: templateOrExtensionIgnorePackage,\n } = await solveTemplateOrExtensionPath(templateOrExtension);\n\n if (\n name === \"package.json\" &&\n (ignorePackage || templateOrExtensionIgnorePackage)\n ) {\n throw new Error(\n \"package.json should be ignored for file templateOrExtension\",\n );\n }\n\n if (subdir) {\n return path.resolve(dir, subdir, name);\n }\n\n return path.resolve(dir, name);\n};\n\n/**\n * Returns the base directory for a template URL — i.e. the directory that\n * CONTAINS the optional `template/` subdirectory. This is where cna.config.json\n * should be placed by template authors.\n */\nexport const getTemplateBaseDirPath = async (\n templateOrExtensionUrl: string,\n): Promise<string> => {\n try {\n const { dir, subdir = \"\" } = await solveTemplateOrExtensionPath(\n templateOrExtensionUrl,\n );\n return path.resolve(dir, subdir);\n } catch {\n return \"\";\n }\n};\n\nexport const getTemplateDirPath = async (templateOrExtensionUrl: string) => {\n const { dir, subdir = \"\" } = await solveTemplateOrExtensionPath(\n templateOrExtensionUrl,\n );\n let templateDirPath = path.resolve(dir, subdir);\n\n // If `${templateDirPath}/template` is a directory, return it. Otherwise, return `${templateDirPath}`\n const templateDirPathWithTemplate = path.resolve(templateDirPath, \"template\");\n\n return new Promise<string>((resolve) => {\n fs.stat(templateDirPathWithTemplate, (_err, stats) => {\n if (_err) {\n resolve(templateDirPath);\n return;\n }\n\n if (stats.isDirectory()) {\n templateDirPath = templateDirPathWithTemplate;\n }\n\n resolve(templateDirPath);\n });\n });\n};\n","import os from \"os\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport debug from \"debug\";\nimport { simpleGit, type SimpleGit, type CloneOptions } from \"simple-git\";\nimport * as fse from \"fs-extra\"; // Import fs-extra for advanced file operations\n\nconst log = debug(\"cna:git\");\n\nconst formatRepositoryDownloadError = (error: unknown, url: string): string => {\n const message = error instanceof Error ? error.message : String(error);\n\n if (/not found|404|repository not found/i.test(message)) {\n return [\n `Error: Could not fetch template from '${url}'.`,\n \" → The URL returned HTTP 404 or the repository was not found. Please verify the URL is correct.\",\n \" → Run 'npx create-awesome-node-app --list-templates' to see available templates.\",\n ].join(\"\\n\");\n }\n\n if (/403|authentication|permission denied|access denied/i.test(message)) {\n return [\n `Error: Could not fetch template from '${url}'.`,\n \" → Access denied (HTTP 403). Check that the repository is public or you have access.\",\n \" → Run 'npx create-awesome-node-app --list-templates' to see available templates.\",\n ].join(\"\\n\");\n }\n\n if (/ECONNREFUSED|ENOTFOUND|ETIMEDOUT|network/i.test(message)) {\n return [\n `Error: Could not fetch template from '${url}'.`,\n \" → Could not reach the repository. Please check your internet connection.\",\n \" → Run 'npx create-awesome-node-app --list-templates' to see available templates.\",\n ].join(\"\\n\");\n }\n\n return [\n `Error: Could not fetch template from '${url}'.`,\n ` → ${message}`,\n \" → Run 'npx create-awesome-node-app --list-templates' to see available templates.\",\n ].join(\"\\n\");\n};\n\n/**\n * filter .git folder\n */\nconst filterGit = (src: string) => {\n return !/(\\\\|\\/)\\.git\\b/.test(src);\n};\n\nexport type DownloadRepositoryOptions = {\n url?: string;\n target: string;\n cacheDir?: string;\n branch?: string | undefined;\n offline?: boolean;\n targetId?: string;\n};\n\n// Create a Map to store ongoing Git operations\nconst gitOperationMap = new Map<string, Promise<void>>();\n\n// Create a Map to store completed targetIds\nconst completedTargetIds = new Map<string, boolean>();\n\n/**\n * @param opts options\n * @param opts.url The git repository url.\n * @param opts.targetId The target id. Default is `Buffer.from(`${gitUrl}@${branch}`).toString(\"base64\")`\n * @param opts.target The target folder.\n * @param opts.cacheDir? Default `~/.cache/cna/${name}`, the folder\n * @param opts.branch? Default 'main'. Git branch.\n * @param opts.offline? use cached files, and don't update.\n */\nexport const downloadRepository = async ({\n url = \"\",\n offline = false,\n target = \"./\",\n branch = \"main\",\n targetId,\n cacheDir: optsCacheDir,\n}: DownloadRepositoryOptions) => {\n const absoluteTarget = path.isAbsolute(target)\n ? target\n : path.resolve(target);\n const targetExistedBefore = fs.existsSync(absoluteTarget);\n\n const isGithub = /^[^/]+\\/[^/]+$/.test(url);\n const gitUrl = isGithub ? `https://github.com/${url}` : url;\n const id = targetId || Buffer.from(`${gitUrl}@${branch}`).toString(\"base64\");\n let cacheDir = optsCacheDir || path.join(os.homedir(), \".cache\", \"cna\", id);\n\n cacheDir = path.isAbsolute(cacheDir) ? cacheDir : path.resolve(cacheDir);\n\n log(\"cache folder: %s\", cacheDir);\n\n // Check if the targetId has already been completed (checkout done)\n if (completedTargetIds.has(id)) {\n log(\n `Git checkout for target ID '${id}' has already been completed. Skipping.`,\n );\n // Use fs-extra's copy method with filter\n await fse.copy(cacheDir, absoluteTarget, {\n overwrite: true,\n filter: filterGit,\n });\n return;\n }\n\n // Check if there is an ongoing Git operation with the same target ID\n if (gitOperationMap.has(id)) {\n log(\n `Git operation for target ID '${id}' is already in progress. Waiting...`,\n );\n await gitOperationMap.get(id);\n log(`Git operation for target ID '${id}' has completed.`);\n return;\n }\n\n // Create a new promise for the Git operation and store it in the map\n const gitOperationPromise = (async () => {\n let git: SimpleGit = simpleGit();\n const cloneOptions: CloneOptions = {\n \"--depth\": 1,\n \"--branch\": branch,\n \"--single-branch\": null,\n \"--no-tags\": null,\n };\n\n try {\n const cached = fs.existsSync(cacheDir);\n\n if (!cached) {\n log(\"Cloning repository...\");\n await git.clone(gitUrl, cacheDir, cloneOptions);\n }\n\n git = simpleGit(cacheDir);\n\n if (!offline) {\n log(\"Pulling repository...\");\n await git.checkout([\"-f\", branch]);\n await git.pull();\n }\n\n // Use fs-extra's copy method with filter\n await fse.copy(cacheDir, absoluteTarget, {\n overwrite: true,\n filter: filterGit,\n });\n\n // Mark the targetId as completed\n completedTargetIds.set(id, true);\n } catch (error) {\n if (!targetExistedBefore && fs.existsSync(absoluteTarget)) {\n try {\n fse.removeSync(absoluteTarget);\n log(\"Cleaned up partially created directory: %s\", absoluteTarget);\n } catch (cleanupErr) {\n log(\"Failed to clean up directory: %s\", cleanupErr);\n }\n }\n\n throw new Error(formatRepositoryDownloadError(error, gitUrl));\n } finally {\n // Remove the promise from the map when the operation is complete\n gitOperationMap.delete(id);\n }\n })();\n\n gitOperationMap.set(id, gitOperationPromise);\n\n // Wait for the Git operation to complete\n await gitOperationPromise;\n};\n","import fs from \"fs\";\nimport pc from \"picocolors\";\nimport { readdirp } from \"readdirp\";\nimport { dirname } from \"path\";\nimport { getTemplateDirPath } from \"./paths.js\";\nimport { promisify } from \"util\";\nimport lodash from \"lodash\";\n\nconst { template } = lodash;\n\nconst writeFileAsync = promisify(fs.writeFile);\nconst copyFileAsync = promisify(fs.copyFile);\n\n// Token used inside templates to denote the source directory.\n// Templates name a directory literally `[src]` and files inside like `[src]/App.tsx.template`.\n// We map the prefix `[src]/` to the selected srcDir (e.g. `src/`).\nconst SRC_PATH_PATTERN = \"[src]/\";\nconst DEFAULT_SRC_PATH = \"src/\";\n\nconst getSrcDirPattern = (srcDir: string) =>\n srcDir === \".\" ? \"\" : srcDir + \"/\";\n\nconst makeDirectory = (dirPath: string) => {\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n }\n};\n\nconst getModeFromPath = (path = \"\") => {\n const matchExts = (...exts: string[]) =>\n exts.find((ext) => path.endsWith(ext));\n\n if (matchExts(\".append\")) {\n return \"append\";\n }\n if (matchExts(\".append.template\", \".template.append\")) {\n return \"appendTemplate\";\n }\n if (matchExts(\".template\")) {\n return \"copyTemplate\";\n }\n return \"copy\";\n};\n\ntype FileLoaderOptions = {\n root: string;\n templateDir: string;\n appName: string;\n originalDirectory: string;\n verbose: boolean;\n useYarn?: boolean;\n usePnpm?: boolean;\n useBun?: boolean;\n srcDir: string;\n mode?: string;\n runCommand: string;\n installCommand: string;\n} & {\n [key: string]: unknown;\n};\n\nexport type FileLoader = (\n options: FileLoaderOptions,\n) => (entry: { path: string }) => Promise<void>;\n\n// Batched file copy operation\nconst batchedCopyFiles = async (\n operations: { src: string; dest: string; verbose: boolean }[],\n) => {\n const batchedPromises = operations.map(async (operation) => {\n try {\n makeDirectory(dirname(operation.dest));\n await copyFileAsync(operation.src, operation.dest);\n // Preserve original file permissions (e.g. executable bit on husky hooks)\n try {\n const srcStat = await promisify(fs.stat)(operation.src);\n await promisify(fs.chmod)(operation.dest, srcStat.mode);\n } catch {\n // Non-critical: file was already copied\n }\n if (operation.verbose) {\n console.log(\n pc.green(\n `Added \"${operation.dest}\" from \"${operation.src}\" successfully`,\n ),\n );\n }\n } catch (err) {\n console.log(\n pc.red(`Cannot copy file ${operation.src} to ${operation.dest}`),\n );\n if (operation.verbose) {\n console.log(pc.red(String(err)));\n }\n throw err;\n }\n });\n\n await Promise.all(batchedPromises);\n};\n\n// Batched file write operation\nconst batchedWriteFiles = async (\n operations: {\n path: string;\n content: string;\n flag: string;\n verbose: boolean;\n mode?: number;\n }[],\n) => {\n const batchedPromises = operations.map(async (operation) => {\n try {\n makeDirectory(dirname(operation.path));\n await writeFileAsync(operation.path, operation.content, {\n flag: operation.flag,\n mode: operation.mode,\n });\n if (operation.verbose) {\n console.log(pc.green(`Added \"${operation.path}\" successfully`));\n }\n } catch (err) {\n console.log(pc.red(`Cannot write file ${operation.path}`));\n if (operation.verbose) {\n console.log(pc.red(String(err)));\n }\n throw err;\n }\n });\n\n await Promise.all(batchedPromises);\n};\n\n// Batched file append operation\nconst batchedAppendFiles = async (\n operations: { src: string; dest: string; verbose: boolean }[],\n) => {\n const batchedPromises = operations.map(async (operation) => {\n try {\n const content = await promisify(fs.readFile)(operation.src, \"utf8\");\n const fileMode = (await promisify(fs.stat)(operation.src)).mode;\n await batchedWriteFiles([\n {\n path: operation.dest,\n content,\n flag: \"a+\",\n verbose: operation.verbose,\n mode: fileMode,\n },\n ]);\n } catch (err) {\n console.log(\n pc.red(`Cannot append file ${operation.src} to ${operation.dest}`),\n );\n if (operation.verbose) {\n console.log(pc.red(String(err)));\n }\n throw err;\n }\n });\n\n await Promise.all(batchedPromises);\n};\n\nconst copyLoader: FileLoader =\n ({ root, templateDir, verbose, srcDir }) =>\n async ({ path }) => {\n const operations = [];\n try {\n const newPath = path\n .replace(/.if-(npm|yarn|pnpm|bun)$/, \"\")\n .replace(SRC_PATH_PATTERN, getSrcDirPattern(srcDir));\n\n operations.push({\n src: `${templateDir}/${path}`,\n dest: `${root}/${newPath}`,\n verbose,\n });\n } catch (err) {\n if (verbose) {\n console.log(err);\n }\n throw err;\n }\n\n await batchedCopyFiles(operations);\n };\n\nconst appendLoader: FileLoader =\n ({ root, templateDir, verbose, srcDir }) =>\n async ({ path }) => {\n const operations = [];\n try {\n const newPath = path\n .replace(/.append$/, \"\")\n .replace(/.if-(npm|yarn|pnpm|bun)$/, \"\")\n .replace(SRC_PATH_PATTERN, getSrcDirPattern(srcDir));\n\n operations.push({\n src: `${templateDir}/${path}`,\n dest: `${root}/${newPath}`,\n verbose,\n });\n } catch (err) {\n if (verbose) {\n console.log(err);\n }\n throw err;\n }\n\n await batchedAppendFiles(operations);\n };\n\nconst templateLoader: FileLoader =\n ({\n root,\n templateDir,\n appName,\n verbose,\n mode = \"\",\n srcDir,\n runCommand,\n installCommand,\n ...customOptions\n }) =>\n async ({ path }) => {\n const operations = [];\n try {\n const flag = mode.includes(\"append\") ? \"a+\" : \"w\";\n const filePath = `${templateDir}/${path}`;\n const file = await promisify(fs.readFile)(filePath, \"utf8\");\n const fileMode = (await promisify(fs.stat)(filePath)).mode;\n const newFile = template(file);\n const newPath = path\n .replace(/.template$/, \"\")\n .replace(/.append$/, \"\")\n .replace(/.if-(npm|yarn|pnpm|bun)$/, \"\")\n .replace(SRC_PATH_PATTERN, getSrcDirPattern(srcDir));\n\n operations.push({\n path: `${root}/${newPath}`,\n content: newFile({\n projectName: appName,\n srcDir: srcDir || \".\",\n runCommand,\n installCommand,\n ...customOptions,\n }),\n flag,\n verbose,\n mode: fileMode,\n });\n } catch (err) {\n if (verbose) {\n console.log(err);\n }\n throw err;\n }\n\n await batchedWriteFiles(operations);\n };\n\nconst fileLoader: FileLoader =\n ({\n root,\n templateDir,\n appName,\n originalDirectory,\n verbose,\n useYarn,\n usePnpm,\n useBun,\n srcDir = DEFAULT_SRC_PATH,\n runCommand,\n installCommand,\n ...customOptions\n }) =>\n async ({ path }) => {\n try {\n const mode = getModeFromPath(path);\n\n const loaders = {\n copy: copyLoader,\n append: appendLoader,\n copyTemplate: templateLoader,\n // appendTemplate means treat as a template (interpolate) but append instead of overwrite\n appendTemplate: templateLoader,\n } as const;\n\n await loaders[mode]({\n root,\n templateDir,\n appName,\n originalDirectory,\n verbose,\n useYarn: !!useYarn,\n usePnpm: !!usePnpm,\n useBun: !!useBun,\n mode,\n srcDir,\n runCommand,\n installCommand,\n ...customOptions,\n })({\n path,\n });\n } catch (err) {\n if (verbose) {\n console.log(err);\n }\n throw err;\n }\n };\n\nexport type TemplateOrExtension = { url: string; ignorePackage?: boolean };\n\nexport type LoadFilesOptions = {\n root: string;\n templatesOrExtensions?: TemplateOrExtension[];\n appName: string;\n originalDirectory: string;\n verbose: boolean;\n useYarn?: boolean;\n usePnpm?: boolean;\n useBun?: boolean;\n srcDir?: string;\n runCommand: string;\n installCommand: string;\n} & {\n [key: string]: unknown;\n};\n\nexport const loadFiles = async ({\n root,\n templatesOrExtensions = [],\n appName,\n originalDirectory,\n verbose,\n useYarn = false,\n usePnpm = false,\n useBun = false,\n srcDir = DEFAULT_SRC_PATH,\n runCommand,\n installCommand,\n ...customOptions\n}: LoadFilesOptions) => {\n try {\n const operations = [];\n for await (const { url: templateOrExtensionUrl } of templatesOrExtensions) {\n const templateDir = await getTemplateDirPath(templateOrExtensionUrl);\n if (verbose) {\n try {\n const stat = fs.existsSync(templateDir)\n ? fs.statSync(templateDir)\n : undefined;\n console.log(\n pc.dim(\n `[cna] Template dir resolved: ${templateDir} exists=${!!stat} isDir=$${stat?.isDirectory?.()}`,\n ),\n );\n } catch {\n // ignore\n }\n }\n\n if (\n fs.existsSync(templateDir) &&\n fs.statSync(templateDir).isDirectory()\n ) {\n // readdirp requires at least one positive pattern when using negations; we'll include '**/*'\n // and then filter out undesired files. This ensures templates are actually discovered.\n let debugFirst = true;\n // Collect all file entries without filters then skip undesired patterns manually\n const skipGlobs = [\n /\\bpackage\\.js$/,\n /\\bpackage\\.json$/,\n /\\bpackage-lock\\.json$/,\n /\\btemplate\\.json$/,\n /\\byarn\\.lock$/,\n /\\bpnpm-lock\\.yaml$/,\n ];\n const skipManager = usePnpm\n ? [/\\.if-npm\\./, /\\.if-yarn\\./, /\\.if-bun\\./]\n : useYarn\n ? [/\\.if-npm\\./, /\\.if-pnpm\\./, /\\.if-bun\\./]\n : useBun\n ? [/\\.if-yarn\\./, /\\.if-pnpm\\./]\n : [/\\.if-yarn\\./, /\\.if-pnpm\\./, /\\.if-bun\\./];\n const shouldSkip = (p: string) =>\n [...skipGlobs, ...skipManager].some((rgx) => rgx.test(p));\n\n for await (const entry of readdirp(templateDir, {\n type: \"files\",\n alwaysStat: false,\n })) {\n if (shouldSkip(entry.path)) continue;\n if (entry.path.startsWith(\"package/\")) continue; // skip helper package dir\n if (verbose && debugFirst) {\n console.log(pc.dim(`[cna] First discovered file: ${entry.path}`));\n debugFirst = false;\n }\n operations.push({\n root,\n templateDir,\n appName,\n originalDirectory,\n verbose,\n useYarn,\n usePnpm,\n useBun,\n srcDir,\n runCommand,\n installCommand,\n entry,\n ...customOptions,\n });\n }\n }\n }\n\n if (verbose) {\n console.log(\n pc.dim(\n `[cna] Prepared ${operations.length} file operations from ${templatesOrExtensions.length} template(s)`,\n ),\n );\n if (operations.length === 0) {\n console.log(\n pc.yellow(\n \"[cna] No files discovered. Check that the template repository was cloned and fileFilter patterns are correct.\",\n ),\n );\n }\n }\n\n await Promise.all(\n operations.map((operation) => fileLoader(operation)(operation.entry)),\n );\n } catch (err) {\n if (verbose) {\n console.log(err);\n }\n throw err;\n }\n};\n","import fs from \"fs\";\nimport path from \"path\";\nimport { getTemplateBaseDirPath } from \"./paths.js\";\n\nexport type CnaCustomOption = {\n name: string;\n type: string;\n message?: string;\n initial?: unknown;\n [key: string]: unknown;\n};\n\nexport type CnaConfig = {\n customOptions?: CnaCustomOption[];\n};\n\n/**\n * Load cna.config.json from the base directory of a template.\n *\n * The config file lives alongside (not inside) the `template/` subdirectory:\n *\n * my-template/\n * cna.config.json ← here\n * template/\n * src/\n * package.json\n *\n * Works for both remote GitHub URLs (uses cached clone) and local file:// URLs.\n * Returns null if the file doesn't exist or cannot be parsed.\n */\nexport const loadTemplateCnaConfig = async (\n templateUrl: string,\n): Promise<CnaConfig | null> => {\n try {\n const basePath = await getTemplateBaseDirPath(templateUrl);\n if (!basePath) return null;\n\n const configPath = path.join(basePath, \"cna.config.json\");\n if (!fs.existsSync(configPath)) return null;\n\n const content = fs.readFileSync(configPath, \"utf8\");\n return JSON.parse(content) as CnaConfig;\n } catch {\n return null;\n }\n};\n"],"mappings":"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","names":["import_picocolors","import_semver","import_child_process","import_lodash","import_path","import_fs","import_picocolors","import_os","import_semver","import_child_process","pc","spawn","line","semver","dns","import_fs","import_fs","import_os","import_path","import_debug","debug","path","fs","os","log","debug","path","os","fs","path","template","merge","import_fs","import_picocolors","import_path","import_lodash","lodash","fs","path","pc","lodash","pc","packageJson","fs","path","os","simpleGit","semver","import_fs","import_path","path","fs","semver","pc","envinfo"]}
|
package/dist/index.js
CHANGED
|
@@ -5,6 +5,13 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
|
|
|
5
5
|
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
6
6
|
});
|
|
7
7
|
|
|
8
|
+
// ../../node_modules/tsup/assets/esm_shims.js
|
|
9
|
+
import path from "path";
|
|
10
|
+
import { fileURLToPath } from "url";
|
|
11
|
+
var getFilename = () => fileURLToPath(import.meta.url);
|
|
12
|
+
var getDirname = () => path.dirname(getFilename());
|
|
13
|
+
var __dirname = /* @__PURE__ */ getDirname();
|
|
14
|
+
|
|
8
15
|
// index.ts
|
|
9
16
|
import pc4 from "picocolors";
|
|
10
17
|
import envinfo from "envinfo";
|
|
@@ -13,7 +20,7 @@ import { execFileSync as execFileSync3 } from "child_process";
|
|
|
13
20
|
|
|
14
21
|
// installer.ts
|
|
15
22
|
import lodash2 from "lodash";
|
|
16
|
-
import
|
|
23
|
+
import path4 from "path";
|
|
17
24
|
import fs4 from "fs";
|
|
18
25
|
import pc3 from "picocolors";
|
|
19
26
|
import os3 from "os";
|
|
@@ -245,13 +252,12 @@ import merge from "lodash.merge";
|
|
|
245
252
|
// paths.ts
|
|
246
253
|
import fs2 from "fs";
|
|
247
254
|
import os2 from "os";
|
|
248
|
-
import
|
|
249
|
-
import { fileURLToPath } from "url";
|
|
255
|
+
import path3 from "path";
|
|
250
256
|
import debug2 from "debug";
|
|
251
257
|
|
|
252
258
|
// git.ts
|
|
253
259
|
import os from "os";
|
|
254
|
-
import
|
|
260
|
+
import path2 from "path";
|
|
255
261
|
import fs from "fs";
|
|
256
262
|
import debug from "debug";
|
|
257
263
|
import { simpleGit } from "simple-git";
|
|
@@ -299,13 +305,13 @@ var downloadRepository = async ({
|
|
|
299
305
|
targetId,
|
|
300
306
|
cacheDir: optsCacheDir
|
|
301
307
|
}) => {
|
|
302
|
-
const absoluteTarget =
|
|
308
|
+
const absoluteTarget = path2.isAbsolute(target) ? target : path2.resolve(target);
|
|
303
309
|
const targetExistedBefore = fs.existsSync(absoluteTarget);
|
|
304
310
|
const isGithub = /^[^/]+\/[^/]+$/.test(url);
|
|
305
311
|
const gitUrl = isGithub ? `https://github.com/${url}` : url;
|
|
306
312
|
const id = targetId || Buffer.from(`${gitUrl}@${branch}`).toString("base64");
|
|
307
|
-
let cacheDir = optsCacheDir ||
|
|
308
|
-
cacheDir =
|
|
313
|
+
let cacheDir = optsCacheDir || path2.join(os.homedir(), ".cache", "cna", id);
|
|
314
|
+
cacheDir = path2.isAbsolute(cacheDir) ? cacheDir : path2.resolve(cacheDir);
|
|
309
315
|
log("cache folder: %s", cacheDir);
|
|
310
316
|
if (completedTargetIds.has(id)) {
|
|
311
317
|
log(
|
|
@@ -370,7 +376,7 @@ var downloadRepository = async ({
|
|
|
370
376
|
|
|
371
377
|
// paths.ts
|
|
372
378
|
var log2 = debug2("cna:paths");
|
|
373
|
-
var moduleDir =
|
|
379
|
+
var moduleDir = __dirname;
|
|
374
380
|
var solveValuesFromTemplateOrExtensionUrl = (templateOrExtension) => {
|
|
375
381
|
const url = new URL(templateOrExtension);
|
|
376
382
|
const ignorePackage = url.searchParams.get("ignorePackage") === "true";
|
|
@@ -420,7 +426,7 @@ var solveRepositoryPath = async ({
|
|
|
420
426
|
const targetWithSubdir = Buffer.from(`${url}#${branch}#${subdir}`).toString(
|
|
421
427
|
"base64"
|
|
422
428
|
);
|
|
423
|
-
const target =
|
|
429
|
+
const target = path3.join(os2.homedir(), ".cna", targetWithSubdir);
|
|
424
430
|
if (process.env.CNA_SKIP_GIT === "1") {
|
|
425
431
|
return { dir: target, subdir };
|
|
426
432
|
}
|
|
@@ -439,7 +445,7 @@ var solveTemplateOrExtensionPath = async (templateOrExtension) => {
|
|
|
439
445
|
} catch {
|
|
440
446
|
log2("Falling back to legacy template path for: %s", templateOrExtension);
|
|
441
447
|
return {
|
|
442
|
-
dir:
|
|
448
|
+
dir: path3.resolve(
|
|
443
449
|
moduleDir,
|
|
444
450
|
"..",
|
|
445
451
|
"templatesOrExtensions",
|
|
@@ -468,16 +474,16 @@ var getPackagePath = async (templateOrExtension, name = "package", ignorePackage
|
|
|
468
474
|
);
|
|
469
475
|
}
|
|
470
476
|
if (subdir) {
|
|
471
|
-
return
|
|
477
|
+
return path3.resolve(dir, subdir, name);
|
|
472
478
|
}
|
|
473
|
-
return
|
|
479
|
+
return path3.resolve(dir, name);
|
|
474
480
|
};
|
|
475
481
|
var getTemplateBaseDirPath = async (templateOrExtensionUrl) => {
|
|
476
482
|
try {
|
|
477
483
|
const { dir, subdir = "" } = await solveTemplateOrExtensionPath(
|
|
478
484
|
templateOrExtensionUrl
|
|
479
485
|
);
|
|
480
|
-
return
|
|
486
|
+
return path3.resolve(dir, subdir);
|
|
481
487
|
} catch {
|
|
482
488
|
return "";
|
|
483
489
|
}
|
|
@@ -486,8 +492,8 @@ var getTemplateDirPath = async (templateOrExtensionUrl) => {
|
|
|
486
492
|
const { dir, subdir = "" } = await solveTemplateOrExtensionPath(
|
|
487
493
|
templateOrExtensionUrl
|
|
488
494
|
);
|
|
489
|
-
let templateDirPath =
|
|
490
|
-
const templateDirPathWithTemplate =
|
|
495
|
+
let templateDirPath = path3.resolve(dir, subdir);
|
|
496
|
+
const templateDirPathWithTemplate = path3.resolve(templateDirPath, "template");
|
|
491
497
|
return new Promise((resolve) => {
|
|
492
498
|
fs2.stat(templateDirPathWithTemplate, (_err, stats) => {
|
|
493
499
|
if (_err) {
|
|
@@ -515,11 +521,11 @@ var getInstallableSetup = ({
|
|
|
515
521
|
devDependencies: getInstallableDeps(devDependencies)
|
|
516
522
|
};
|
|
517
523
|
};
|
|
518
|
-
var requireIfExists = (
|
|
519
|
-
if (existsSync(
|
|
520
|
-
return __require(
|
|
524
|
+
var requireIfExists = (path6) => {
|
|
525
|
+
if (existsSync(path6)) {
|
|
526
|
+
return __require(path6);
|
|
521
527
|
}
|
|
522
|
-
throw new Error(`File ${
|
|
528
|
+
throw new Error(`File ${path6} does not exist`);
|
|
523
529
|
};
|
|
524
530
|
var loadPackages = async ({
|
|
525
531
|
templatesOrExtensions = [],
|
|
@@ -602,8 +608,8 @@ var makeDirectory = (dirPath) => {
|
|
|
602
608
|
fs3.mkdirSync(dirPath, { recursive: true });
|
|
603
609
|
}
|
|
604
610
|
};
|
|
605
|
-
var getModeFromPath = (
|
|
606
|
-
const matchExts = (...exts) => exts.find((ext) =>
|
|
611
|
+
var getModeFromPath = (path6 = "") => {
|
|
612
|
+
const matchExts = (...exts) => exts.find((ext) => path6.endsWith(ext));
|
|
607
613
|
if (matchExts(".append")) {
|
|
608
614
|
return "append";
|
|
609
615
|
}
|
|
@@ -691,12 +697,12 @@ var batchedAppendFiles = async (operations) => {
|
|
|
691
697
|
});
|
|
692
698
|
await Promise.all(batchedPromises);
|
|
693
699
|
};
|
|
694
|
-
var copyLoader = ({ root, templateDir, verbose, srcDir }) => async ({ path:
|
|
700
|
+
var copyLoader = ({ root, templateDir, verbose, srcDir }) => async ({ path: path6 }) => {
|
|
695
701
|
const operations = [];
|
|
696
702
|
try {
|
|
697
|
-
const newPath =
|
|
703
|
+
const newPath = path6.replace(/.if-(npm|yarn|pnpm|bun)$/, "").replace(SRC_PATH_PATTERN, getSrcDirPattern(srcDir));
|
|
698
704
|
operations.push({
|
|
699
|
-
src: `${templateDir}/${
|
|
705
|
+
src: `${templateDir}/${path6}`,
|
|
700
706
|
dest: `${root}/${newPath}`,
|
|
701
707
|
verbose
|
|
702
708
|
});
|
|
@@ -708,12 +714,12 @@ var copyLoader = ({ root, templateDir, verbose, srcDir }) => async ({ path: path
|
|
|
708
714
|
}
|
|
709
715
|
await batchedCopyFiles(operations);
|
|
710
716
|
};
|
|
711
|
-
var appendLoader = ({ root, templateDir, verbose, srcDir }) => async ({ path:
|
|
717
|
+
var appendLoader = ({ root, templateDir, verbose, srcDir }) => async ({ path: path6 }) => {
|
|
712
718
|
const operations = [];
|
|
713
719
|
try {
|
|
714
|
-
const newPath =
|
|
720
|
+
const newPath = path6.replace(/.append$/, "").replace(/.if-(npm|yarn|pnpm|bun)$/, "").replace(SRC_PATH_PATTERN, getSrcDirPattern(srcDir));
|
|
715
721
|
operations.push({
|
|
716
|
-
src: `${templateDir}/${
|
|
722
|
+
src: `${templateDir}/${path6}`,
|
|
717
723
|
dest: `${root}/${newPath}`,
|
|
718
724
|
verbose
|
|
719
725
|
});
|
|
@@ -735,15 +741,15 @@ var templateLoader = ({
|
|
|
735
741
|
runCommand,
|
|
736
742
|
installCommand,
|
|
737
743
|
...customOptions
|
|
738
|
-
}) => async ({ path:
|
|
744
|
+
}) => async ({ path: path6 }) => {
|
|
739
745
|
const operations = [];
|
|
740
746
|
try {
|
|
741
747
|
const flag = mode.includes("append") ? "a+" : "w";
|
|
742
|
-
const filePath = `${templateDir}/${
|
|
748
|
+
const filePath = `${templateDir}/${path6}`;
|
|
743
749
|
const file = await promisify(fs3.readFile)(filePath, "utf8");
|
|
744
750
|
const fileMode = (await promisify(fs3.stat)(filePath)).mode;
|
|
745
751
|
const newFile = template(file);
|
|
746
|
-
const newPath =
|
|
752
|
+
const newPath = path6.replace(/.template$/, "").replace(/.append$/, "").replace(/.if-(npm|yarn|pnpm|bun)$/, "").replace(SRC_PATH_PATTERN, getSrcDirPattern(srcDir));
|
|
747
753
|
operations.push({
|
|
748
754
|
path: `${root}/${newPath}`,
|
|
749
755
|
content: newFile({
|
|
@@ -778,9 +784,9 @@ var fileLoader = ({
|
|
|
778
784
|
runCommand,
|
|
779
785
|
installCommand,
|
|
780
786
|
...customOptions
|
|
781
|
-
}) => async ({ path:
|
|
787
|
+
}) => async ({ path: path6 }) => {
|
|
782
788
|
try {
|
|
783
|
-
const mode = getModeFromPath(
|
|
789
|
+
const mode = getModeFromPath(path6);
|
|
784
790
|
const loaders = {
|
|
785
791
|
copy: copyLoader,
|
|
786
792
|
append: appendLoader,
|
|
@@ -803,7 +809,7 @@ var fileLoader = ({
|
|
|
803
809
|
installCommand,
|
|
804
810
|
...customOptions
|
|
805
811
|
})({
|
|
806
|
-
path:
|
|
812
|
+
path: path6
|
|
807
813
|
});
|
|
808
814
|
} catch (err) {
|
|
809
815
|
if (verbose) {
|
|
@@ -1093,7 +1099,7 @@ var run = async ({
|
|
|
1093
1099
|
packageJson2.dependencies = updateDependencies(dependencies);
|
|
1094
1100
|
packageJson2.devDependencies = updateDependencies(devDependencies);
|
|
1095
1101
|
fs4.writeFileSync(
|
|
1096
|
-
|
|
1102
|
+
path4.join(root, "package.json"),
|
|
1097
1103
|
JSON.stringify(packageJson2, null, 2) + os3.EOL
|
|
1098
1104
|
);
|
|
1099
1105
|
console.log();
|
|
@@ -1179,8 +1185,8 @@ var createApp = async ({
|
|
|
1179
1185
|
ignorePackage = false,
|
|
1180
1186
|
...customOptions
|
|
1181
1187
|
}) => {
|
|
1182
|
-
const root =
|
|
1183
|
-
const appName =
|
|
1188
|
+
const root = path4.resolve(name);
|
|
1189
|
+
const appName = path4.basename(root);
|
|
1184
1190
|
fs4.mkdirSync(name, {
|
|
1185
1191
|
recursive: true
|
|
1186
1192
|
});
|
|
@@ -1201,7 +1207,7 @@ var createApp = async ({
|
|
|
1201
1207
|
ignorePackage
|
|
1202
1208
|
});
|
|
1203
1209
|
fs4.writeFileSync(
|
|
1204
|
-
|
|
1210
|
+
path4.join(root, "package.json"),
|
|
1205
1211
|
JSON.stringify(packageJson, null, 2) + os3.EOL
|
|
1206
1212
|
);
|
|
1207
1213
|
const originalDirectory = process.cwd();
|
|
@@ -1247,7 +1253,7 @@ Please update to npm 3 or higher for a better, fully supported experience.
|
|
|
1247
1253
|
if (false) {
|
|
1248
1254
|
fs4.cpSync(
|
|
1249
1255
|
__require.resolve("./yarn.lock.cached"),
|
|
1250
|
-
|
|
1256
|
+
path4.join(root, "yarn.lock"),
|
|
1251
1257
|
{ force: true }
|
|
1252
1258
|
);
|
|
1253
1259
|
}
|
|
@@ -1272,12 +1278,12 @@ Please update to npm 3 or higher for a better, fully supported experience.
|
|
|
1272
1278
|
|
|
1273
1279
|
// config.ts
|
|
1274
1280
|
import fs5 from "fs";
|
|
1275
|
-
import
|
|
1281
|
+
import path5 from "path";
|
|
1276
1282
|
var loadTemplateCnaConfig = async (templateUrl) => {
|
|
1277
1283
|
try {
|
|
1278
1284
|
const basePath = await getTemplateBaseDirPath(templateUrl);
|
|
1279
1285
|
if (!basePath) return null;
|
|
1280
|
-
const configPath =
|
|
1286
|
+
const configPath = path5.join(basePath, "cna.config.json");
|
|
1281
1287
|
if (!fs5.existsSync(configPath)) return null;
|
|
1282
1288
|
const content = fs5.readFileSync(configPath, "utf8");
|
|
1283
1289
|
return JSON.parse(content);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../index.ts","../installer.ts","../helpers.ts","../executable.ts","../package.ts","../paths.ts","../git.ts","../loaders.ts","../config.ts"],"sourcesContent":["import pc from \"picocolors\";\nimport envinfo from \"envinfo\";\nimport semver from \"semver\";\nimport { execFileSync } from \"child_process\";\nimport type { TemplateOrExtension } from \"./loaders.js\";\nexport type { TemplateOrExtension } from \"./loaders.js\";\nimport { createApp } from \"./installer.js\";\nimport { resolveExecutable } from \"./executable.js\";\nexport {\n getPackagePath,\n getTemplateDirPath,\n getTemplateBaseDirPath,\n} from \"./paths.js\";\nexport { downloadRepository } from \"./git.js\";\nexport { loadTemplateCnaConfig } from \"./config.js\";\nexport type { CnaConfig, CnaCustomOption } from \"./config.js\";\n\nexport const checkNodeVersion = (\n requiredVersion: string,\n packageName: string,\n) => {\n if (!semver.satisfies(process.version, requiredVersion)) {\n console.error(\n pc.red(\n `You are running Node ${process.version}.\\n` +\n `${packageName} requires Node ${requiredVersion}.\\n` +\n \"Please update your version of Node.\",\n ),\n );\n process.exit(1);\n }\n};\n\nexport const checkForLatestVersion = async (packageName: string) => {\n try {\n const response = await fetch(\n `https://registry.npmjs.org/-/package/${packageName}/dist-tags`,\n );\n if (!response.ok) {\n throw new Error(\"Registry request failed\");\n }\n const json = (await response.json()) as unknown;\n if (json && typeof json === \"object\" && \"latest\" in json) {\n return String((json as Record<string, unknown>)[\"latest\"]);\n }\n return null;\n } catch {\n try {\n return execFileSync(resolveExecutable(\"npm\"), [\n \"view\",\n packageName,\n \"version\",\n ])\n .toString()\n .trim();\n } catch {\n // ignore\n }\n }\n return null;\n};\n\nexport const printEnvInfo = async () => {\n console.log(pc.bold(\"\\nEnvironment Info:\"));\n const info = await envinfo.run(\n {\n System: [\"OS\", \"CPU\", \"Memory\", \"Shell\"],\n Binaries: [\"Node\", \"npm\", \"pnpm\", \"Yarn\", \"Bun\", \"Watchman\"],\n Browsers: [\"Chrome\", \"Edge\", \"Internet Explorer\", \"Firefox\", \"Safari\"],\n },\n {\n duplicates: true,\n showNotFound: true,\n },\n );\n console.log(info);\n process.exit(0);\n};\n\nexport type CnaOptions = {\n projectName: string;\n info?: boolean;\n verbose?: boolean;\n packageManager?: string;\n install?: boolean;\n template?: string;\n templatesOrExtensions?: TemplateOrExtension[];\n} & {\n [key: string]: unknown;\n};\n\nexport type CnaOptionsTransform = (options: CnaOptions) => Promise<CnaOptions>;\n\nexport const createNodeApp = async (\n programName: string,\n options: CnaOptions,\n transformOptions: CnaOptionsTransform,\n) => {\n if (options.info) {\n await printEnvInfo();\n }\n\n if (typeof options.projectName === \"undefined\") {\n console.error(\"Please specify the project directory:\");\n console.log(` ${pc.cyan(programName)} ${pc.green(\"[project-directory]\")}`);\n console.log();\n console.log(\"For example:\");\n console.log(` ${pc.cyan(programName)} ${pc.green(\"my-app\")}`);\n console.log();\n console.log(`Run ${pc.cyan(`${programName} --help`)} to see all options.`);\n process.exit(1);\n }\n\n const appOptions = await transformOptions(options);\n await createApp({\n ...appOptions,\n name: appOptions.projectName,\n installDependencies: options.install ?? true,\n });\n};\n","import lodash from \"lodash\";\n\nconst { isEmpty } = lodash;\nimport path from \"path\";\nimport fs from \"fs\";\nimport pc from \"picocolors\";\nimport os from \"os\";\nimport semver from \"semver\";\nimport { execFileSync } from \"child_process\";\n// Use dynamic import for simple-git to avoid bundlers injecting unsupported dynamic requires in ESM\nimport type { SimpleGit, SimpleGitOptions } from \"simple-git\";\n\nimport {\n shouldUseYarn,\n checkThatNpmCanReadCwd,\n checkNpmVersion,\n checkIfOnline,\n shouldUsePnpm,\n shouldUseBun,\n} from \"./helpers.js\";\nimport { loadPackages } from \"./package.js\";\nimport type { TemplateOrExtension } from \"./loaders.js\";\nimport { loadFiles } from \"./loaders.js\";\nimport { resolveExecutable } from \"./executable.js\";\n\nconst install = async (\n root: string,\n useYarn = false,\n usePnpm = false,\n useBun = false,\n dependencies: string[] = [],\n verbose = false,\n isOnline = true,\n isDevDependencies = false,\n) => {\n let command: string;\n let args: string[];\n\n if (useYarn) {\n command = \"yarnpkg\";\n args = [\"add\", \"--ignore-workspace-root-check\"];\n if (!isOnline) {\n args.push(\"--offline\");\n }\n if (isDevDependencies) {\n args.push(\"--dev\");\n }\n args.push(...dependencies);\n args.push(\"--cwd\");\n args.push(root);\n\n if (!isOnline) {\n console.log(pc.yellow(\"You appear to be offline.\"));\n console.log(pc.yellow(\"Falling back to the local Yarn cache.\"));\n console.log();\n }\n } else if (usePnpm) {\n command = \"pnpm\";\n args = [\"install\", \"--ignore-workspace\", \"--loglevel\", \"error\"];\n if (isDevDependencies) {\n args.push(\"--save-dev\");\n } else {\n args.push(\"--save\");\n }\n\n args.push(...dependencies);\n } else if (useBun) {\n command = \"bun\";\n if (dependencies.length > 0) {\n args = [\"add\"];\n if (isDevDependencies) {\n args.push(\"--dev\");\n }\n args.push(...dependencies);\n } else {\n args = [\"install\"];\n }\n } else {\n command = \"npm\";\n args = [\"install\", \"--loglevel\", \"error\"];\n if (isDevDependencies) {\n args.push(\"--save-dev\");\n } else {\n args.push(\"--save\");\n }\n\n args.push(...dependencies);\n }\n\n if (verbose) {\n args.push(\"--verbose\");\n }\n\n try {\n execFileSync(resolveExecutable(command), args, {\n cwd: root,\n stdio: \"inherit\",\n });\n } catch {\n throw new Error(`${command} ${args.join(\" \")}`);\n }\n};\n\nexport type RunOptions = {\n root: string;\n appName: string;\n originalDirectory: string;\n verbose?: boolean;\n useYarn?: boolean;\n usePnpm?: boolean;\n useBun?: boolean;\n templatesOrExtensions?: TemplateOrExtension[];\n dependencies?: string[];\n devDependencies?: string[];\n installDependencies?: boolean;\n runCommand: string;\n installCommand: string;\n} & {\n [key: string]: unknown;\n};\n\nconst runCommandInProjectDir = async (\n root: string,\n command: string,\n args: string[] = [],\n successMessage = \"Operation completed successfully.\",\n errorMessage = \"Operation failed.\",\n) => {\n const [executable, ...baseArgs] =\n command === \"npm run\"\n ? [\"npm\", \"run\"]\n : command === \"pnpm run\"\n ? [\"pnpm\", \"run\"]\n : command === \"bun run\"\n ? [\"bun\", \"run\"]\n : [command];\n\n try {\n execFileSync(resolveExecutable(executable), [...baseArgs, ...args], {\n cwd: root,\n stdio: \"ignore\",\n });\n console.log(pc.green(successMessage));\n } catch {\n console.log();\n console.log(pc.red(errorMessage));\n console.log();\n }\n};\n\nfunction extractNameAndVersion(dependencyString: string) {\n // extract the name and version from the dependency string separated by @\n // e.g. @types/react@^16\n // => name: @types/react\n // => version: ^16\n // e.g. react@^16\n // => name: react\n // => version: ^16\n\n // Find the last \"@\" symbol to split the string\n const lastIndex = dependencyString.lastIndexOf(\"@\");\n\n if (lastIndex !== -1) {\n // Split the string into name and version parts\n const name = dependencyString.substring(0, lastIndex); // Name\n const version = dependencyString.substring(lastIndex + 1); // Version\n\n return { name, version };\n } else {\n // If \"@\" is not present, treat the whole string as the name\n return { name: dependencyString, version: \"\" };\n }\n}\n\nconst run = async ({\n root,\n appName,\n originalDirectory,\n verbose = false,\n useYarn = false,\n usePnpm = false,\n useBun = false,\n templatesOrExtensions = [],\n dependencies = [],\n devDependencies = [],\n installDependencies = true,\n runCommand = \"\",\n installCommand = \"\",\n ...customOptions\n}: RunOptions) => {\n const isOnline = useYarn ? await checkIfOnline(useYarn) : true;\n\n if (isEmpty(templatesOrExtensions)) {\n console.log();\n console.log(\n pc.yellow(\n \"No templates or extensions specified to bootstrap application.\",\n ),\n );\n console.log();\n process.exit(0);\n }\n\n console.log();\n console.log(\"Scaffolding project in \" + root + \"...\");\n\n await loadFiles({\n root,\n templatesOrExtensions,\n appName,\n originalDirectory,\n verbose,\n useYarn,\n usePnpm,\n useBun,\n runCommand,\n installCommand,\n ...customOptions,\n });\n\n console.log();\n console.log(pc.green(\"Successfully scaffolded project.\"));\n console.log();\n\n if (installDependencies) {\n console.log(\n pc.green(\"Installing packages. This might take a couple of minutes.\"),\n );\n console.log(pc.green(\"Installing dependencies...\"));\n console.log();\n // Install dependencies\n await install(\n root,\n useYarn,\n usePnpm,\n useBun,\n dependencies,\n verbose,\n isOnline,\n false,\n );\n\n if (devDependencies.length > 0) {\n console.log();\n console.log(pc.green(\"Installing devDependencies...\"));\n console.log();\n // Install devDependencies\n await install(\n root,\n useYarn,\n usePnpm,\n useBun,\n devDependencies,\n verbose,\n isOnline,\n true,\n );\n }\n } else {\n console.log(pc.yellow(\"Skip package installation.\"));\n const packageJson = JSON.parse(\n fs.readFileSync(`${root}/package.json`, \"utf8\"),\n );\n\n const updateDependencies = (deps: string[]) => {\n return deps.reduce(\n (dep, elem) => {\n const nextDep = dep;\n if (/.+@(\\^|~)?[0-9a-zA-Z-.]+$/.test(elem)) {\n const { name, version } = extractNameAndVersion(elem);\n nextDep[name] = version;\n } else {\n nextDep[elem] = \"*\";\n }\n return nextDep;\n },\n {} as { [key: string]: string },\n );\n };\n\n packageJson.dependencies = updateDependencies(dependencies);\n packageJson.devDependencies = updateDependencies(devDependencies);\n\n fs.writeFileSync(\n path.join(root, \"package.json\"),\n JSON.stringify(packageJson, null, 2) + os.EOL,\n );\n\n console.log();\n console.log(pc.green(\"Successfully updated package.json.\"));\n console.log(pc.yellow(`Run ${pc.cyan(installCommand)} to install.`));\n }\n\n console.log();\n console.log(\"Initializing git repository...\");\n\n try {\n const { simpleGit } = (await import(\"simple-git\")) as unknown as {\n simpleGit: (\n baseDir?: string,\n options?: Partial<SimpleGitOptions>,\n ) => SimpleGit;\n };\n const git = simpleGit(root);\n await git.init();\n console.log(pc.green(\"Successfully initialized git repository.\"));\n } catch {\n console.log();\n console.log(\n pc.red(\n \"Failed to initialize git repository. Run `git init` to initialize git repository after the process is completed.\",\n ),\n );\n console.log();\n }\n\n if (installDependencies && isOnline) {\n const packageJson = JSON.parse(\n fs.readFileSync(`${root}/package.json`, \"utf8\"),\n );\n\n const runFormat = async () => {\n try {\n await runCommandInProjectDir(\n root,\n runCommand,\n [\"format\"],\n \"Successfully formatted code.\",\n `Failed to format code. Run \\`${runCommand} format\\` to format code after the process is completed.`,\n );\n } catch {\n // ignore\n }\n };\n\n const runLintFix = async () => {\n try {\n await runCommandInProjectDir(\n root,\n runCommand,\n [\"lint:fix\"],\n \"Successfully fixed linting errors.\",\n `Failed to fix linting errors. Run \\`${runCommand} lint:fix\\` to fix linting errors after the process is completed.`,\n );\n } catch {\n // ignore\n }\n };\n\n if (packageJson.scripts && packageJson.scripts[\"format\"]) {\n await runFormat();\n }\n if (packageJson.scripts && packageJson.scripts[\"lint:fix\"]) {\n await runLintFix();\n }\n }\n\n // Print out instructions\n console.log();\n console.log(pc.green(\"Successfully created project \" + appName + \".\"));\n console.log();\n console.log(\"Done! Now run:\");\n console.log();\n console.log(pc.cyan(` cd ${appName}`));\n console.log(pc.cyan(` ${installCommand}`));\n\n const packageJson = JSON.parse(\n fs.readFileSync(`${root}/package.json`, \"utf8\"),\n );\n\n const lookForScripts = [\"compose:up\", \"sls:offline\", \"dev\", \"start\"];\n\n for (const script of lookForScripts) {\n if (packageJson.scripts && packageJson.scripts[script]) {\n console.log(pc.cyan(` ${runCommand} ${script}`));\n break;\n }\n }\n\n console.log();\n console.log(pc.green(\"Happy hacking!\"));\n};\n\nexport type CreateAppOptions = {\n name: string;\n verbose?: boolean;\n packageManager?: string;\n templatesOrExtensions?: TemplateOrExtension[];\n installDependencies?: boolean;\n ignorePackage?: boolean;\n} & {\n [key: string]: unknown;\n};\n\nexport const createApp = async ({\n name,\n verbose = false,\n templatesOrExtensions = [],\n installDependencies = true,\n ignorePackage = false,\n ...customOptions\n}: CreateAppOptions) => {\n const root = path.resolve(name);\n const appName = path.basename(root);\n\n fs.mkdirSync(name, {\n recursive: true,\n });\n\n console.log(`Creating a new Node app in ${pc.green(root)}.`);\n console.log();\n\n const useYarn = customOptions.packageManager === \"yarn\" && shouldUseYarn();\n const usePnpm = customOptions.packageManager === \"pnpm\" && shouldUsePnpm();\n const useBun = customOptions.packageManager === \"bun\" && shouldUseBun();\n const runCommand = useYarn\n ? \"yarn\"\n : usePnpm\n ? \"pnpm run\"\n : useBun\n ? \"bun run\"\n : \"npm run\";\n const installCommand = useYarn\n ? \"yarn\"\n : usePnpm\n ? \"pnpm install\"\n : useBun\n ? \"bun install\"\n : \"npm install\";\n\n const { packageJson, dependencies, devDependencies } = await loadPackages({\n templatesOrExtensions,\n appName,\n usePnpm,\n useYarn,\n useBun,\n runCommand,\n ignorePackage,\n });\n\n fs.writeFileSync(\n path.join(root, \"package.json\"),\n JSON.stringify(packageJson, null, 2) + os.EOL,\n );\n\n const originalDirectory = process.cwd();\n process.chdir(root);\n if (!useYarn && !useBun && !checkThatNpmCanReadCwd()) {\n process.exit(1);\n }\n\n if (!semver.satisfies(process.version, \">=18.0.0\")) {\n console.log(\n pc.yellow(\n `You are using Node ${process.version} so the project will be bootstrapped with an old unsupported version of tools.\\n\\n` +\n `Please update to Node 18 or higher for a better, fully supported experience.\\n`,\n ),\n );\n }\n\n if (!useYarn && !useBun) {\n const npmInfo = checkNpmVersion();\n if (!npmInfo.hasMinNpm) {\n if (npmInfo.npmVersion) {\n console.log(\n pc.yellow(\n `You are using npm ${npmInfo.npmVersion} so the project will be bootstrapped with an old unsupported version of tools.\\n\\n` +\n `Please update to npm 3 or higher for a better, fully supported experience.\\n`,\n ),\n );\n }\n }\n }\n\n if (useYarn) {\n let yarnUsesDefaultRegistry = true;\n try {\n yarnUsesDefaultRegistry =\n execFileSync(resolveExecutable(\"yarnpkg\"), [\n \"config\",\n \"get\",\n \"registry\",\n ])\n .toString()\n .trim() === \"https://registry.yarnpkg.com\";\n } catch {\n // ignore\n }\n if (false && yarnUsesDefaultRegistry) {\n fs.cpSync(\n require.resolve(\"./yarn.lock.cached\"),\n path.join(root, \"yarn.lock\"),\n { force: true },\n );\n }\n }\n\n return run({\n root,\n appName,\n originalDirectory,\n verbose,\n useYarn,\n usePnpm,\n useBun,\n templatesOrExtensions,\n dependencies,\n devDependencies,\n installDependencies,\n runCommand,\n installCommand,\n ...customOptions,\n });\n};\n","import { execFileSync } from \"child_process\";\nimport spawn from \"cross-spawn\";\nimport pc from \"picocolors\";\nimport semver from \"semver\";\nimport dns from \"dns\";\nimport { URL } from \"url\";\nimport { resolveExecutable } from \"./executable.js\";\n\nexport const toCamelCase = (str: string) => {\n // Lower cases the string\n return (\n str\n .toLowerCase()\n // Replaces any - or _ characters with a space\n .replace(/[-_]+/g, \" \")\n // Removes any non alphanumeric characters\n .replace(/[^\\w\\s]/g, \"\")\n // Uppercases the first character in each group immediately following a space\n // (delimited by spaces)\n .replace(/ (.)/g, ($1) => {\n return $1.toUpperCase();\n })\n // Removes spaces\n .replace(/ /g, \"\")\n );\n};\n\nexport const isUsingYarn = () => {\n return (process.env.npm_config_user_agent || \"\").indexOf(\"yarn\") === 0;\n};\n\nexport const shouldUseYarn = () => {\n const { hasMinYarnPnp, hasMaxYarnPnp, yarnVersion } = checkYarnVersion();\n\n if (!hasMinYarnPnp) {\n console.log(\n pc.yellow(\n `You are using yarn version ${pc.bold(\n yarnVersion,\n )} which is not supported yet. ` +\n `To use Yarn, install v1.12.0 or higher and lower than v2.0.0. ` +\n `See https://yarnpkg.com for instructions on how to update.`,\n ),\n );\n return false;\n }\n\n if (!hasMaxYarnPnp) {\n console.log(\n pc.yellow(\n `You are using a pre-release version of Yarn which is not supported yet. ` +\n `To use Yarn, install v1.12.0 or higher and lower than v2.0.0. ` +\n `See https://yarnpkg.com for instructions on how to update.`,\n ),\n );\n return false;\n }\n\n return true;\n};\n\nexport const shouldUsePnpm = () => {\n const { hasMinPnpm, pnpmVersion } = checkPnpmVersion();\n\n if (!hasMinPnpm) {\n console.log(\n pc.yellow(\n `You are using pnpm version ${pc.bold(\n pnpmVersion,\n )} which is not supported yet. ` +\n `To use pnpm, install v5.0.0 or higher. ` +\n `See https://pnpm.js.org for instructions on how to update.`,\n ),\n );\n return false;\n }\n\n return true;\n};\n\nexport const shouldUseBun = () => {\n const { hasMinBun, bunVersion } = checkBunVersion();\n\n if (!hasMinBun) {\n console.log(\n pc.yellow(\n `You are using bun version ${pc.bold(\n bunVersion,\n )} which is not supported yet. ` +\n `To use bun, install v1.0.0 or higher. ` +\n `See https://bun.sh for instructions on how to install.`,\n ),\n );\n return false;\n }\n\n return true;\n};\n\nexport const checkThatNpmCanReadCwd = () => {\n const cwd = process.cwd();\n let childOutput = null;\n try {\n // Note: intentionally using spawn over exec since\n // the problem doesn't reproduce otherwise.\n // `npm config list` is the only reliable way I could find\n // to reproduce the wrong path. Just printing process.cwd()\n // in a Node process was not enough.\n childOutput = spawn.sync(\"npm\", [\"config\", \"list\"]).output.join(\"\");\n } catch {\n // Something went wrong spawning node.\n // Not great, but it means we can't do this check.\n // We might fail later on, but let's continue.\n return true;\n }\n if (typeof childOutput !== \"string\") {\n return true;\n }\n const lines = childOutput.split(\"\\n\");\n // `npm config list` output includes the following line:\n // \"; cwd = C:\\path\\to\\current\\dir\" (unquoted)\n // I couldn't find an easier way to get it.\n const prefix = \"; cwd = \";\n const line = lines.find((line) => line.startsWith(prefix));\n if (typeof line !== \"string\") {\n // Fail gracefully. They could remove it.\n return true;\n }\n const npmCWD = line.substring(prefix.length);\n if (npmCWD === cwd) {\n return true;\n }\n console.error(\n pc.red(\n `Could not start an npm process in the right directory.\\n\\n` +\n `The current directory is: ${pc.bold(cwd)}\\n` +\n `However, a newly started npm process runs in: ${pc.bold(npmCWD)}\\n\\n` +\n `This is probably caused by a misconfigured system terminal shell.`,\n ),\n );\n if (process.platform === \"win32\") {\n console.error(\n pc.red(`On Windows, this can usually be fixed by running:\\n\\n`) +\n ` ${pc.cyan(\n \"reg\",\n )} delete \"HKCU\\\\Software\\\\Microsoft\\\\Command Processor\" /v AutoRun /f\\n` +\n ` ${pc.cyan(\n \"reg\",\n )} delete \"HKLM\\\\Software\\\\Microsoft\\\\Command Processor\" /v AutoRun /f\\n\\n` +\n pc.red(`Try to run the above two lines in the terminal.\\n`) +\n pc.red(\n `To learn more about this problem, read: https://blogs.msdn.microsoft.com/oldnewthing/20071121-00/?p=24433/`,\n ),\n );\n }\n return false;\n};\n\nexport const checkPnpmVersion = () => {\n const minPnpm = \"5.0.0\";\n let hasMinPnpm = false;\n let pnpmVersion = null;\n try {\n pnpmVersion = execFileSync(resolveExecutable(\"pnpm\"), [\"--version\"])\n .toString()\n .trim();\n if (semver.valid(pnpmVersion)) {\n hasMinPnpm = semver.gte(pnpmVersion, minPnpm);\n } else {\n // Handle non-semver compliant pnpm version strings, which pnpm currently\n // uses for nightly builds. The regex truncates anything after the first\n // dash. See #5362.\n const trimmedPnpmVersionMatch = /^(.*?)[-+].+$/.exec(pnpmVersion);\n if (trimmedPnpmVersionMatch && trimmedPnpmVersionMatch[1]) {\n hasMinPnpm = semver.gte(trimmedPnpmVersionMatch[1], minPnpm);\n }\n }\n } catch {\n // Ignore errors.\n }\n return { hasMinPnpm, pnpmVersion };\n};\n\nexport const checkBunVersion = () => {\n const minBun = \"1.0.0\";\n let hasMinBun = false;\n let bunVersion = null;\n try {\n bunVersion = execFileSync(resolveExecutable(\"bun\"), [\"--version\"])\n .toString()\n .trim();\n if (semver.valid(bunVersion)) {\n hasMinBun = semver.gte(bunVersion, minBun);\n }\n } catch {\n // ignore\n }\n return { hasMinBun, bunVersion };\n};\n\nexport const checkYarnVersion = () => {\n const minYarnPnp = \"1.12.0\";\n const maxYarnPnp = \"2.0.0\";\n let hasMinYarnPnp = false;\n let hasMaxYarnPnp = false;\n let yarnVersion = null;\n try {\n yarnVersion = execFileSync(resolveExecutable(\"yarnpkg\"), [\"--version\"])\n .toString()\n .trim();\n if (semver.valid(yarnVersion)) {\n hasMinYarnPnp = semver.gte(yarnVersion, minYarnPnp);\n hasMaxYarnPnp = semver.lt(yarnVersion, maxYarnPnp);\n } else {\n // Handle non-semver compliant yarn version strings, which yarn currently\n // uses for nightly builds. The regex truncates anything after the first\n // dash. See #5362.\n const trimmedYarnVersionMatch = /^(.+?)[-+].+$/.exec(yarnVersion);\n if (trimmedYarnVersionMatch) {\n const trimmedYarnVersion = trimmedYarnVersionMatch.pop();\n if (trimmedYarnVersion) {\n hasMinYarnPnp = semver.gte(trimmedYarnVersion, minYarnPnp);\n hasMaxYarnPnp = semver.lt(trimmedYarnVersion, maxYarnPnp);\n }\n }\n }\n } catch {\n // ignore\n }\n return {\n hasMinYarnPnp: hasMinYarnPnp,\n hasMaxYarnPnp: hasMaxYarnPnp,\n yarnVersion: yarnVersion,\n };\n};\n\nexport const checkNpmVersion = () => {\n let hasMinNpm = false;\n let npmVersion = null;\n try {\n npmVersion = execFileSync(resolveExecutable(\"npm\"), [\"--version\"])\n .toString()\n .trim();\n hasMinNpm = semver.gte(npmVersion, \"6.0.0\");\n } catch {\n // ignore\n }\n return {\n hasMinNpm: hasMinNpm,\n npmVersion: npmVersion,\n };\n};\n\nconst getProxy = () => {\n if (process.env.HTTPS_PROXY) {\n return process.env.HTTPS_PROXY;\n }\n try {\n // Trying to read https-proxy from .npmrc\n const httpsProxy = execFileSync(resolveExecutable(\"npm\"), [\n \"config\",\n \"get\",\n \"https-proxy\",\n ])\n .toString()\n .trim();\n return httpsProxy !== \"null\" ? httpsProxy : undefined;\n } catch {\n // ignore\n }\n return \"\";\n};\n\nexport const checkIfOnline = (useYarn?: boolean) => {\n if (!useYarn) {\n // Don't ping the Yarn registry.\n // We'll just assume the best case.\n return Promise.resolve(true);\n }\n\n return new Promise<boolean>((resolve) => {\n dns.lookup(\"registry.yarnpkg.com\", (err) => {\n let proxy;\n if (err != null && (proxy = getProxy())) {\n // If a proxy is defined, we likely can't resolve external hostnames.\n // Try to resolve the proxy name as an indication of a connection.\n dns.lookup(new URL(proxy).hostname, (proxyErr) => {\n resolve(!proxyErr);\n });\n } else {\n resolve(!err);\n }\n });\n });\n};\n","export const resolveExecutable = (bin: string) =>\n process.platform === \"win32\" ? `${bin}.cmd` : bin;\n","// Removed unused eslint-disable (global-require) after migration to flat config\nimport { existsSync } from \"fs\";\nimport merge from \"lodash.merge\";\nimport type { TemplateOrExtension } from \"./loaders.js\";\nimport { getPackagePath } from \"./paths.js\";\n\n// Type for setup options\ntype GetInstallableSetupOptions = {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n [key: string]: unknown;\n};\n\n// Helper function to prepare installable setup\nconst getInstallableSetup = ({\n dependencies,\n devDependencies,\n ...packageJson\n}: GetInstallableSetupOptions) => {\n const getInstallableDeps = (deps = {}) =>\n Object.entries(deps).map(([dep, version]) => `${dep}@${version}`);\n\n return {\n packageJson,\n dependencies: getInstallableDeps(dependencies),\n devDependencies: getInstallableDeps(devDependencies),\n };\n};\n\n// Helper function to require a module if it exists, or throw an error\nconst requireIfExists = (path: string) => {\n if (existsSync(path)) {\n return require(path);\n }\n\n throw new Error(`File ${path} does not exist`);\n};\n\n// Options for loading packages\nexport type LoadPackagesOptions = {\n templatesOrExtensions?: TemplateOrExtension[];\n ignorePackage?: boolean;\n [key: string]: unknown;\n};\n\n/**\n * loadPackages loads the templatesOrExtensions packages and merge them into a single package.json\n * @param opts.templatesOrExtensions - templatesOrExtensions to load\n * @param opts.ignorePackage - ignore package.json file\n * @param opts.config - config to pass to the templatesOrExtensions package module\n * @returns\n */\nexport const loadPackages = async ({\n templatesOrExtensions = [],\n ignorePackage: globalIgnorePackage = false,\n ...config\n}: LoadPackagesOptions) => {\n // Load and merge template packages concurrently\n const setup = await Promise.all(\n templatesOrExtensions.map(async ({ url: templateOrExtension }) => {\n try {\n // Try to load and merge template package\n const template = requireIfExists(\n await getPackagePath(templateOrExtension, \"template.json\"),\n );\n return template.package || {}; // Use an empty object if template.json is not found\n } catch {\n return {}; // Ignore if template.json is not found\n }\n }),\n );\n\n // Merge all the setup results from templates\n const mergedSetup = merge(\n {\n name: config.appName,\n dependencies: {},\n devDependencies: {},\n scripts: {},\n },\n ...setup,\n );\n\n // Load and merge package.json files concurrently\n const finalSetup = await Promise.all(\n templatesOrExtensions.map(\n async ({ url: templateOrExtension, ignorePackage }) => {\n try {\n // Try to load and merge package.json\n const templateOrExtensionPackageJson = requireIfExists(\n await getPackagePath(\n templateOrExtension,\n \"package.json\",\n globalIgnorePackage || ignorePackage,\n ),\n );\n return templateOrExtensionPackageJson; // Use an empty object if package.json is not found\n } catch {\n return {}; // Ignore if package.json is not found\n }\n },\n ),\n );\n\n // Resolve package updates using package module concurrently\n const resolvedSetup = await Promise.all(\n templatesOrExtensions.map(async ({ url: templateOrExtension }) => {\n try {\n // Try to resolve package updates using package module\n const resolveTemplateOrExtensionPackage = requireIfExists(\n await getPackagePath(templateOrExtension),\n );\n return resolveTemplateOrExtensionPackage(mergedSetup, config); // Use an empty object if resolution fails\n } catch {\n return {}; // Ignore if the resolution function fails\n }\n }),\n );\n\n // Merge all setup results\n const packageJson = merge(mergedSetup, ...finalSetup, ...resolvedSetup);\n\n // Prepare the final installable setup\n return getInstallableSetup({\n ...packageJson,\n name: config.appName,\n });\n};\n","import fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport debug from \"debug\";\nimport { downloadRepository } from \"./git.js\";\n\nconst log = debug(\"cna:paths\");\n\nconst moduleDir =\n typeof __dirname !== \"undefined\"\n ? __dirname\n : path.dirname(fileURLToPath(import.meta.url));\n\n/**\n * Parse a template / extension URL (supports GitHub style and file:// URLs).\n * For GitHub style URLs we accept:\n * https://github.com/<org>/<repo>\n * https://github.com/<org>/<repo>/tree/<branch>/<subdir?>?ignorePackage=true\n * For local file templates:\n * file:///absolute/path/to/template\n * file:///absolute/path/to/repo?subdir=templates/react-vite-starter\n * Query params:\n * - ignorePackage=true -> ignore package.json from template\n * - subdir=<relativePath> (only for file://) -> pick subdirectory\n */\nconst solveValuesFromTemplateOrExtensionUrl = (templateOrExtension: string) => {\n const url = new URL(templateOrExtension);\n const ignorePackage = url.searchParams.get(\"ignorePackage\") === \"true\";\n\n if (url.protocol === \"file:\") {\n // Handle platform specific absolute paths\n let pathname = decodeURIComponent(url.pathname);\n // On Windows a file URL looks like file:///C:/path -> pathname /C:/path\n if (process.platform === \"win32\" && /^\\/[A-Za-z]:\\//.test(pathname)) {\n pathname = pathname.slice(1); // drop leading slash\n }\n const subdirParam = url.searchParams.get(\"subdir\") || \"\";\n return {\n url: templateOrExtension, // not used for git cloning when file://\n branch: \"\",\n subdir: subdirParam,\n protocol: url.protocol,\n host: \"\", // host is unused for file\n pathname,\n ignorePackage,\n };\n }\n\n const origin = `${url.protocol}//${url.host}`;\n // GitHub style path splitting: /org/repo[/tree/<branch>/<subdir...>]\n const parts = url.pathname.slice(1).split(\"/\");\n const [org, repo] = parts;\n let branch = \"\";\n let subdir = \"\";\n if (parts[2] === \"tree\") {\n branch = parts[3] || \"\";\n subdir = parts.slice(4).join(\"/\");\n }\n return {\n url: `${origin}/${org}/${repo}`,\n branch,\n subdir,\n protocol: url.protocol,\n host: url.host,\n pathname: url.pathname,\n ignorePackage,\n };\n};\n\ntype SolveRepositoryPathOptions = {\n url: string;\n branch?: string;\n subdir?: string;\n};\n\nconst solveRepositoryPath = async ({\n url,\n branch,\n subdir,\n}: SolveRepositoryPathOptions) => {\n const targetId = Buffer.from(`${url}#${branch}`).toString(\"base64\");\n const targetWithSubdir = Buffer.from(`${url}#${branch}#${subdir}`).toString(\n \"base64\",\n );\n const target = path.join(os.homedir(), \".cna\", targetWithSubdir);\n\n // Test helper: allow skipping actual git clone to prevent network / credential prompts\n if (process.env.CNA_SKIP_GIT === \"1\") {\n return { dir: target, subdir };\n }\n\n await downloadRepository({\n url,\n branch: branch || \"\",\n target,\n targetId,\n });\n\n return { dir: target, subdir };\n};\n\ntype SolvedTemplatePath = {\n dir: string;\n // subdir can be empty string or undefined\n subdir: string | undefined;\n ignorePackage: boolean | undefined;\n};\n\nconst solveTemplateOrExtensionPath = async (\n templateOrExtension: string,\n): Promise<SolvedTemplatePath> => {\n let parsed: ReturnType<typeof solveValuesFromTemplateOrExtensionUrl>;\n try {\n parsed = solveValuesFromTemplateOrExtensionUrl(templateOrExtension);\n } catch {\n // Fallback to an internal templatesOrExtensions directory (legacy behavior)\n log(\"Falling back to legacy template path for: %s\", templateOrExtension);\n return {\n dir: path.resolve(\n moduleDir,\n \"..\",\n \"templatesOrExtensions\",\n templateOrExtension,\n ),\n subdir: undefined,\n ignorePackage: undefined,\n };\n }\n\n const { url, branch, subdir, protocol, pathname, ignorePackage } = parsed;\n\n if (protocol === \"file:\") {\n return { dir: pathname, subdir, ignorePackage };\n }\n\n const gitData = await solveRepositoryPath({ url, branch, subdir });\n return { dir: gitData.dir, subdir: gitData.subdir, ignorePackage };\n};\n\nexport const getPackagePath = async (\n templateOrExtension: string,\n name = \"package\",\n ignorePackage = false,\n) => {\n const {\n dir,\n subdir,\n ignorePackage: templateOrExtensionIgnorePackage,\n } = await solveTemplateOrExtensionPath(templateOrExtension);\n\n if (\n name === \"package.json\" &&\n (ignorePackage || templateOrExtensionIgnorePackage)\n ) {\n throw new Error(\n \"package.json should be ignored for file templateOrExtension\",\n );\n }\n\n if (subdir) {\n return path.resolve(dir, subdir, name);\n }\n\n return path.resolve(dir, name);\n};\n\n/**\n * Returns the base directory for a template URL — i.e. the directory that\n * CONTAINS the optional `template/` subdirectory. This is where cna.config.json\n * should be placed by template authors.\n */\nexport const getTemplateBaseDirPath = async (\n templateOrExtensionUrl: string,\n): Promise<string> => {\n try {\n const { dir, subdir = \"\" } = await solveTemplateOrExtensionPath(\n templateOrExtensionUrl,\n );\n return path.resolve(dir, subdir);\n } catch {\n return \"\";\n }\n};\n\nexport const getTemplateDirPath = async (templateOrExtensionUrl: string) => {\n const { dir, subdir = \"\" } = await solveTemplateOrExtensionPath(\n templateOrExtensionUrl,\n );\n let templateDirPath = path.resolve(dir, subdir);\n\n // If `${templateDirPath}/template` is a directory, return it. Otherwise, return `${templateDirPath}`\n const templateDirPathWithTemplate = path.resolve(templateDirPath, \"template\");\n\n return new Promise<string>((resolve) => {\n fs.stat(templateDirPathWithTemplate, (_err, stats) => {\n if (_err) {\n resolve(templateDirPath);\n return;\n }\n\n if (stats.isDirectory()) {\n templateDirPath = templateDirPathWithTemplate;\n }\n\n resolve(templateDirPath);\n });\n });\n};\n","import os from \"os\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport debug from \"debug\";\nimport { simpleGit, type SimpleGit, type CloneOptions } from \"simple-git\";\nimport * as fse from \"fs-extra\"; // Import fs-extra for advanced file operations\n\nconst log = debug(\"cna:git\");\n\nconst formatRepositoryDownloadError = (error: unknown, url: string): string => {\n const message = error instanceof Error ? error.message : String(error);\n\n if (/not found|404|repository not found/i.test(message)) {\n return [\n `Error: Could not fetch template from '${url}'.`,\n \" → The URL returned HTTP 404 or the repository was not found. Please verify the URL is correct.\",\n \" → Run 'npx create-awesome-node-app --list-templates' to see available templates.\",\n ].join(\"\\n\");\n }\n\n if (/403|authentication|permission denied|access denied/i.test(message)) {\n return [\n `Error: Could not fetch template from '${url}'.`,\n \" → Access denied (HTTP 403). Check that the repository is public or you have access.\",\n \" → Run 'npx create-awesome-node-app --list-templates' to see available templates.\",\n ].join(\"\\n\");\n }\n\n if (/ECONNREFUSED|ENOTFOUND|ETIMEDOUT|network/i.test(message)) {\n return [\n `Error: Could not fetch template from '${url}'.`,\n \" → Could not reach the repository. Please check your internet connection.\",\n \" → Run 'npx create-awesome-node-app --list-templates' to see available templates.\",\n ].join(\"\\n\");\n }\n\n return [\n `Error: Could not fetch template from '${url}'.`,\n ` → ${message}`,\n \" → Run 'npx create-awesome-node-app --list-templates' to see available templates.\",\n ].join(\"\\n\");\n};\n\n/**\n * filter .git folder\n */\nconst filterGit = (src: string) => {\n return !/(\\\\|\\/)\\.git\\b/.test(src);\n};\n\nexport type DownloadRepositoryOptions = {\n url?: string;\n target: string;\n cacheDir?: string;\n branch?: string | undefined;\n offline?: boolean;\n targetId?: string;\n};\n\n// Create a Map to store ongoing Git operations\nconst gitOperationMap = new Map<string, Promise<void>>();\n\n// Create a Map to store completed targetIds\nconst completedTargetIds = new Map<string, boolean>();\n\n/**\n * @param opts options\n * @param opts.url The git repository url.\n * @param opts.targetId The target id. Default is `Buffer.from(`${gitUrl}@${branch}`).toString(\"base64\")`\n * @param opts.target The target folder.\n * @param opts.cacheDir? Default `~/.cache/cna/${name}`, the folder\n * @param opts.branch? Default 'main'. Git branch.\n * @param opts.offline? use cached files, and don't update.\n */\nexport const downloadRepository = async ({\n url = \"\",\n offline = false,\n target = \"./\",\n branch = \"main\",\n targetId,\n cacheDir: optsCacheDir,\n}: DownloadRepositoryOptions) => {\n const absoluteTarget = path.isAbsolute(target)\n ? target\n : path.resolve(target);\n const targetExistedBefore = fs.existsSync(absoluteTarget);\n\n const isGithub = /^[^/]+\\/[^/]+$/.test(url);\n const gitUrl = isGithub ? `https://github.com/${url}` : url;\n const id = targetId || Buffer.from(`${gitUrl}@${branch}`).toString(\"base64\");\n let cacheDir = optsCacheDir || path.join(os.homedir(), \".cache\", \"cna\", id);\n\n cacheDir = path.isAbsolute(cacheDir) ? cacheDir : path.resolve(cacheDir);\n\n log(\"cache folder: %s\", cacheDir);\n\n // Check if the targetId has already been completed (checkout done)\n if (completedTargetIds.has(id)) {\n log(\n `Git checkout for target ID '${id}' has already been completed. Skipping.`,\n );\n // Use fs-extra's copy method with filter\n await fse.copy(cacheDir, absoluteTarget, {\n overwrite: true,\n filter: filterGit,\n });\n return;\n }\n\n // Check if there is an ongoing Git operation with the same target ID\n if (gitOperationMap.has(id)) {\n log(\n `Git operation for target ID '${id}' is already in progress. Waiting...`,\n );\n await gitOperationMap.get(id);\n log(`Git operation for target ID '${id}' has completed.`);\n return;\n }\n\n // Create a new promise for the Git operation and store it in the map\n const gitOperationPromise = (async () => {\n let git: SimpleGit = simpleGit();\n const cloneOptions: CloneOptions = {\n \"--depth\": 1,\n \"--branch\": branch,\n \"--single-branch\": null,\n \"--no-tags\": null,\n };\n\n try {\n const cached = fs.existsSync(cacheDir);\n\n if (!cached) {\n log(\"Cloning repository...\");\n await git.clone(gitUrl, cacheDir, cloneOptions);\n }\n\n git = simpleGit(cacheDir);\n\n if (!offline) {\n log(\"Pulling repository...\");\n await git.checkout([\"-f\", branch]);\n await git.pull();\n }\n\n // Use fs-extra's copy method with filter\n await fse.copy(cacheDir, absoluteTarget, {\n overwrite: true,\n filter: filterGit,\n });\n\n // Mark the targetId as completed\n completedTargetIds.set(id, true);\n } catch (error) {\n if (!targetExistedBefore && fs.existsSync(absoluteTarget)) {\n try {\n fse.removeSync(absoluteTarget);\n log(\"Cleaned up partially created directory: %s\", absoluteTarget);\n } catch (cleanupErr) {\n log(\"Failed to clean up directory: %s\", cleanupErr);\n }\n }\n\n throw new Error(formatRepositoryDownloadError(error, gitUrl));\n } finally {\n // Remove the promise from the map when the operation is complete\n gitOperationMap.delete(id);\n }\n })();\n\n gitOperationMap.set(id, gitOperationPromise);\n\n // Wait for the Git operation to complete\n await gitOperationPromise;\n};\n","import fs from \"fs\";\nimport pc from \"picocolors\";\nimport { readdirp } from \"readdirp\";\nimport { dirname } from \"path\";\nimport { getTemplateDirPath } from \"./paths.js\";\nimport { promisify } from \"util\";\nimport lodash from \"lodash\";\n\nconst { template } = lodash;\n\nconst writeFileAsync = promisify(fs.writeFile);\nconst copyFileAsync = promisify(fs.copyFile);\n\n// Token used inside templates to denote the source directory.\n// Templates name a directory literally `[src]` and files inside like `[src]/App.tsx.template`.\n// We map the prefix `[src]/` to the selected srcDir (e.g. `src/`).\nconst SRC_PATH_PATTERN = \"[src]/\";\nconst DEFAULT_SRC_PATH = \"src/\";\n\nconst getSrcDirPattern = (srcDir: string) =>\n srcDir === \".\" ? \"\" : srcDir + \"/\";\n\nconst makeDirectory = (dirPath: string) => {\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n }\n};\n\nconst getModeFromPath = (path = \"\") => {\n const matchExts = (...exts: string[]) =>\n exts.find((ext) => path.endsWith(ext));\n\n if (matchExts(\".append\")) {\n return \"append\";\n }\n if (matchExts(\".append.template\", \".template.append\")) {\n return \"appendTemplate\";\n }\n if (matchExts(\".template\")) {\n return \"copyTemplate\";\n }\n return \"copy\";\n};\n\ntype FileLoaderOptions = {\n root: string;\n templateDir: string;\n appName: string;\n originalDirectory: string;\n verbose: boolean;\n useYarn?: boolean;\n usePnpm?: boolean;\n useBun?: boolean;\n srcDir: string;\n mode?: string;\n runCommand: string;\n installCommand: string;\n} & {\n [key: string]: unknown;\n};\n\nexport type FileLoader = (\n options: FileLoaderOptions,\n) => (entry: { path: string }) => Promise<void>;\n\n// Batched file copy operation\nconst batchedCopyFiles = async (\n operations: { src: string; dest: string; verbose: boolean }[],\n) => {\n const batchedPromises = operations.map(async (operation) => {\n try {\n makeDirectory(dirname(operation.dest));\n await copyFileAsync(operation.src, operation.dest);\n // Preserve original file permissions (e.g. executable bit on husky hooks)\n try {\n const srcStat = await promisify(fs.stat)(operation.src);\n await promisify(fs.chmod)(operation.dest, srcStat.mode);\n } catch {\n // Non-critical: file was already copied\n }\n if (operation.verbose) {\n console.log(\n pc.green(\n `Added \"${operation.dest}\" from \"${operation.src}\" successfully`,\n ),\n );\n }\n } catch (err) {\n console.log(\n pc.red(`Cannot copy file ${operation.src} to ${operation.dest}`),\n );\n if (operation.verbose) {\n console.log(pc.red(String(err)));\n }\n throw err;\n }\n });\n\n await Promise.all(batchedPromises);\n};\n\n// Batched file write operation\nconst batchedWriteFiles = async (\n operations: {\n path: string;\n content: string;\n flag: string;\n verbose: boolean;\n mode?: number;\n }[],\n) => {\n const batchedPromises = operations.map(async (operation) => {\n try {\n makeDirectory(dirname(operation.path));\n await writeFileAsync(operation.path, operation.content, {\n flag: operation.flag,\n mode: operation.mode,\n });\n if (operation.verbose) {\n console.log(pc.green(`Added \"${operation.path}\" successfully`));\n }\n } catch (err) {\n console.log(pc.red(`Cannot write file ${operation.path}`));\n if (operation.verbose) {\n console.log(pc.red(String(err)));\n }\n throw err;\n }\n });\n\n await Promise.all(batchedPromises);\n};\n\n// Batched file append operation\nconst batchedAppendFiles = async (\n operations: { src: string; dest: string; verbose: boolean }[],\n) => {\n const batchedPromises = operations.map(async (operation) => {\n try {\n const content = await promisify(fs.readFile)(operation.src, \"utf8\");\n const fileMode = (await promisify(fs.stat)(operation.src)).mode;\n await batchedWriteFiles([\n {\n path: operation.dest,\n content,\n flag: \"a+\",\n verbose: operation.verbose,\n mode: fileMode,\n },\n ]);\n } catch (err) {\n console.log(\n pc.red(`Cannot append file ${operation.src} to ${operation.dest}`),\n );\n if (operation.verbose) {\n console.log(pc.red(String(err)));\n }\n throw err;\n }\n });\n\n await Promise.all(batchedPromises);\n};\n\nconst copyLoader: FileLoader =\n ({ root, templateDir, verbose, srcDir }) =>\n async ({ path }) => {\n const operations = [];\n try {\n const newPath = path\n .replace(/.if-(npm|yarn|pnpm|bun)$/, \"\")\n .replace(SRC_PATH_PATTERN, getSrcDirPattern(srcDir));\n\n operations.push({\n src: `${templateDir}/${path}`,\n dest: `${root}/${newPath}`,\n verbose,\n });\n } catch (err) {\n if (verbose) {\n console.log(err);\n }\n throw err;\n }\n\n await batchedCopyFiles(operations);\n };\n\nconst appendLoader: FileLoader =\n ({ root, templateDir, verbose, srcDir }) =>\n async ({ path }) => {\n const operations = [];\n try {\n const newPath = path\n .replace(/.append$/, \"\")\n .replace(/.if-(npm|yarn|pnpm|bun)$/, \"\")\n .replace(SRC_PATH_PATTERN, getSrcDirPattern(srcDir));\n\n operations.push({\n src: `${templateDir}/${path}`,\n dest: `${root}/${newPath}`,\n verbose,\n });\n } catch (err) {\n if (verbose) {\n console.log(err);\n }\n throw err;\n }\n\n await batchedAppendFiles(operations);\n };\n\nconst templateLoader: FileLoader =\n ({\n root,\n templateDir,\n appName,\n verbose,\n mode = \"\",\n srcDir,\n runCommand,\n installCommand,\n ...customOptions\n }) =>\n async ({ path }) => {\n const operations = [];\n try {\n const flag = mode.includes(\"append\") ? \"a+\" : \"w\";\n const filePath = `${templateDir}/${path}`;\n const file = await promisify(fs.readFile)(filePath, \"utf8\");\n const fileMode = (await promisify(fs.stat)(filePath)).mode;\n const newFile = template(file);\n const newPath = path\n .replace(/.template$/, \"\")\n .replace(/.append$/, \"\")\n .replace(/.if-(npm|yarn|pnpm|bun)$/, \"\")\n .replace(SRC_PATH_PATTERN, getSrcDirPattern(srcDir));\n\n operations.push({\n path: `${root}/${newPath}`,\n content: newFile({\n projectName: appName,\n srcDir: srcDir || \".\",\n runCommand,\n installCommand,\n ...customOptions,\n }),\n flag,\n verbose,\n mode: fileMode,\n });\n } catch (err) {\n if (verbose) {\n console.log(err);\n }\n throw err;\n }\n\n await batchedWriteFiles(operations);\n };\n\nconst fileLoader: FileLoader =\n ({\n root,\n templateDir,\n appName,\n originalDirectory,\n verbose,\n useYarn,\n usePnpm,\n useBun,\n srcDir = DEFAULT_SRC_PATH,\n runCommand,\n installCommand,\n ...customOptions\n }) =>\n async ({ path }) => {\n try {\n const mode = getModeFromPath(path);\n\n const loaders = {\n copy: copyLoader,\n append: appendLoader,\n copyTemplate: templateLoader,\n // appendTemplate means treat as a template (interpolate) but append instead of overwrite\n appendTemplate: templateLoader,\n } as const;\n\n await loaders[mode]({\n root,\n templateDir,\n appName,\n originalDirectory,\n verbose,\n useYarn: !!useYarn,\n usePnpm: !!usePnpm,\n useBun: !!useBun,\n mode,\n srcDir,\n runCommand,\n installCommand,\n ...customOptions,\n })({\n path,\n });\n } catch (err) {\n if (verbose) {\n console.log(err);\n }\n throw err;\n }\n };\n\nexport type TemplateOrExtension = { url: string; ignorePackage?: boolean };\n\nexport type LoadFilesOptions = {\n root: string;\n templatesOrExtensions?: TemplateOrExtension[];\n appName: string;\n originalDirectory: string;\n verbose: boolean;\n useYarn?: boolean;\n usePnpm?: boolean;\n useBun?: boolean;\n srcDir?: string;\n runCommand: string;\n installCommand: string;\n} & {\n [key: string]: unknown;\n};\n\nexport const loadFiles = async ({\n root,\n templatesOrExtensions = [],\n appName,\n originalDirectory,\n verbose,\n useYarn = false,\n usePnpm = false,\n useBun = false,\n srcDir = DEFAULT_SRC_PATH,\n runCommand,\n installCommand,\n ...customOptions\n}: LoadFilesOptions) => {\n try {\n const operations = [];\n for await (const { url: templateOrExtensionUrl } of templatesOrExtensions) {\n const templateDir = await getTemplateDirPath(templateOrExtensionUrl);\n if (verbose) {\n try {\n const stat = fs.existsSync(templateDir)\n ? fs.statSync(templateDir)\n : undefined;\n console.log(\n pc.dim(\n `[cna] Template dir resolved: ${templateDir} exists=${!!stat} isDir=$${stat?.isDirectory?.()}`,\n ),\n );\n } catch {\n // ignore\n }\n }\n\n if (\n fs.existsSync(templateDir) &&\n fs.statSync(templateDir).isDirectory()\n ) {\n // readdirp requires at least one positive pattern when using negations; we'll include '**/*'\n // and then filter out undesired files. This ensures templates are actually discovered.\n let debugFirst = true;\n // Collect all file entries without filters then skip undesired patterns manually\n const skipGlobs = [\n /\\bpackage\\.js$/,\n /\\bpackage\\.json$/,\n /\\bpackage-lock\\.json$/,\n /\\btemplate\\.json$/,\n /\\byarn\\.lock$/,\n /\\bpnpm-lock\\.yaml$/,\n ];\n const skipManager = usePnpm\n ? [/\\.if-npm\\./, /\\.if-yarn\\./, /\\.if-bun\\./]\n : useYarn\n ? [/\\.if-npm\\./, /\\.if-pnpm\\./, /\\.if-bun\\./]\n : useBun\n ? [/\\.if-yarn\\./, /\\.if-pnpm\\./]\n : [/\\.if-yarn\\./, /\\.if-pnpm\\./, /\\.if-bun\\./];\n const shouldSkip = (p: string) =>\n [...skipGlobs, ...skipManager].some((rgx) => rgx.test(p));\n\n for await (const entry of readdirp(templateDir, {\n type: \"files\",\n alwaysStat: false,\n })) {\n if (shouldSkip(entry.path)) continue;\n if (entry.path.startsWith(\"package/\")) continue; // skip helper package dir\n if (verbose && debugFirst) {\n console.log(pc.dim(`[cna] First discovered file: ${entry.path}`));\n debugFirst = false;\n }\n operations.push({\n root,\n templateDir,\n appName,\n originalDirectory,\n verbose,\n useYarn,\n usePnpm,\n useBun,\n srcDir,\n runCommand,\n installCommand,\n entry,\n ...customOptions,\n });\n }\n }\n }\n\n if (verbose) {\n console.log(\n pc.dim(\n `[cna] Prepared ${operations.length} file operations from ${templatesOrExtensions.length} template(s)`,\n ),\n );\n if (operations.length === 0) {\n console.log(\n pc.yellow(\n \"[cna] No files discovered. Check that the template repository was cloned and fileFilter patterns are correct.\",\n ),\n );\n }\n }\n\n await Promise.all(\n operations.map((operation) => fileLoader(operation)(operation.entry)),\n );\n } catch (err) {\n if (verbose) {\n console.log(err);\n }\n throw err;\n }\n};\n","import fs from \"fs\";\nimport path from \"path\";\nimport { getTemplateBaseDirPath } from \"./paths.js\";\n\nexport type CnaCustomOption = {\n name: string;\n type: string;\n message?: string;\n initial?: unknown;\n [key: string]: unknown;\n};\n\nexport type CnaConfig = {\n customOptions?: CnaCustomOption[];\n};\n\n/**\n * Load cna.config.json from the base directory of a template.\n *\n * The config file lives alongside (not inside) the `template/` subdirectory:\n *\n * my-template/\n * cna.config.json ← here\n * template/\n * src/\n * package.json\n *\n * Works for both remote GitHub URLs (uses cached clone) and local file:// URLs.\n * Returns null if the file doesn't exist or cannot be parsed.\n */\nexport const loadTemplateCnaConfig = async (\n templateUrl: string,\n): Promise<CnaConfig | null> => {\n try {\n const basePath = await getTemplateBaseDirPath(templateUrl);\n if (!basePath) return null;\n\n const configPath = path.join(basePath, \"cna.config.json\");\n if (!fs.existsSync(configPath)) return null;\n\n const content = fs.readFileSync(configPath, \"utf8\");\n return JSON.parse(content) as CnaConfig;\n } catch {\n return null;\n }\n};\n"],"mappings":"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","names":["pc","semver","execFileSync","lodash","path","fs","pc","os","semver","execFileSync","URL","line","URL","fs","os","path","debug","log","debug","path","os","fs","path","template","fs","pc","fs","path","pc","lodash","pc","execFileSync","packageJson","fs","path","os","simpleGit","semver","fs","path","path","fs","semver","pc","execFileSync"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/tsup/assets/esm_shims.js","../index.ts","../installer.ts","../helpers.ts","../executable.ts","../package.ts","../paths.ts","../git.ts","../loaders.ts","../config.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import pc from \"picocolors\";\nimport envinfo from \"envinfo\";\nimport semver from \"semver\";\nimport { execFileSync } from \"child_process\";\nimport type { TemplateOrExtension } from \"./loaders.js\";\nexport type { TemplateOrExtension } from \"./loaders.js\";\nimport { createApp } from \"./installer.js\";\nimport { resolveExecutable } from \"./executable.js\";\nexport {\n getPackagePath,\n getTemplateDirPath,\n getTemplateBaseDirPath,\n} from \"./paths.js\";\nexport { downloadRepository } from \"./git.js\";\nexport { loadTemplateCnaConfig } from \"./config.js\";\nexport type { CnaConfig, CnaCustomOption } from \"./config.js\";\n\nexport const checkNodeVersion = (\n requiredVersion: string,\n packageName: string,\n) => {\n if (!semver.satisfies(process.version, requiredVersion)) {\n console.error(\n pc.red(\n `You are running Node ${process.version}.\\n` +\n `${packageName} requires Node ${requiredVersion}.\\n` +\n \"Please update your version of Node.\",\n ),\n );\n process.exit(1);\n }\n};\n\nexport const checkForLatestVersion = async (packageName: string) => {\n try {\n const response = await fetch(\n `https://registry.npmjs.org/-/package/${packageName}/dist-tags`,\n );\n if (!response.ok) {\n throw new Error(\"Registry request failed\");\n }\n const json = (await response.json()) as unknown;\n if (json && typeof json === \"object\" && \"latest\" in json) {\n return String((json as Record<string, unknown>)[\"latest\"]);\n }\n return null;\n } catch {\n try {\n return execFileSync(resolveExecutable(\"npm\"), [\n \"view\",\n packageName,\n \"version\",\n ])\n .toString()\n .trim();\n } catch {\n // ignore\n }\n }\n return null;\n};\n\nexport const printEnvInfo = async () => {\n console.log(pc.bold(\"\\nEnvironment Info:\"));\n const info = await envinfo.run(\n {\n System: [\"OS\", \"CPU\", \"Memory\", \"Shell\"],\n Binaries: [\"Node\", \"npm\", \"pnpm\", \"Yarn\", \"Bun\", \"Watchman\"],\n Browsers: [\"Chrome\", \"Edge\", \"Internet Explorer\", \"Firefox\", \"Safari\"],\n },\n {\n duplicates: true,\n showNotFound: true,\n },\n );\n console.log(info);\n process.exit(0);\n};\n\nexport type CnaOptions = {\n projectName: string;\n info?: boolean;\n verbose?: boolean;\n packageManager?: string;\n install?: boolean;\n template?: string;\n templatesOrExtensions?: TemplateOrExtension[];\n} & {\n [key: string]: unknown;\n};\n\nexport type CnaOptionsTransform = (options: CnaOptions) => Promise<CnaOptions>;\n\nexport const createNodeApp = async (\n programName: string,\n options: CnaOptions,\n transformOptions: CnaOptionsTransform,\n) => {\n if (options.info) {\n await printEnvInfo();\n }\n\n if (typeof options.projectName === \"undefined\") {\n console.error(\"Please specify the project directory:\");\n console.log(` ${pc.cyan(programName)} ${pc.green(\"[project-directory]\")}`);\n console.log();\n console.log(\"For example:\");\n console.log(` ${pc.cyan(programName)} ${pc.green(\"my-app\")}`);\n console.log();\n console.log(`Run ${pc.cyan(`${programName} --help`)} to see all options.`);\n process.exit(1);\n }\n\n const appOptions = await transformOptions(options);\n await createApp({\n ...appOptions,\n name: appOptions.projectName,\n installDependencies: options.install ?? true,\n });\n};\n","import lodash from \"lodash\";\n\nconst { isEmpty } = lodash;\nimport path from \"path\";\nimport fs from \"fs\";\nimport pc from \"picocolors\";\nimport os from \"os\";\nimport semver from \"semver\";\nimport { execFileSync } from \"child_process\";\n// Use dynamic import for simple-git to avoid bundlers injecting unsupported dynamic requires in ESM\nimport type { SimpleGit, SimpleGitOptions } from \"simple-git\";\n\nimport {\n shouldUseYarn,\n checkThatNpmCanReadCwd,\n checkNpmVersion,\n checkIfOnline,\n shouldUsePnpm,\n shouldUseBun,\n} from \"./helpers.js\";\nimport { loadPackages } from \"./package.js\";\nimport type { TemplateOrExtension } from \"./loaders.js\";\nimport { loadFiles } from \"./loaders.js\";\nimport { resolveExecutable } from \"./executable.js\";\n\nconst install = async (\n root: string,\n useYarn = false,\n usePnpm = false,\n useBun = false,\n dependencies: string[] = [],\n verbose = false,\n isOnline = true,\n isDevDependencies = false,\n) => {\n let command: string;\n let args: string[];\n\n if (useYarn) {\n command = \"yarnpkg\";\n args = [\"add\", \"--ignore-workspace-root-check\"];\n if (!isOnline) {\n args.push(\"--offline\");\n }\n if (isDevDependencies) {\n args.push(\"--dev\");\n }\n args.push(...dependencies);\n args.push(\"--cwd\");\n args.push(root);\n\n if (!isOnline) {\n console.log(pc.yellow(\"You appear to be offline.\"));\n console.log(pc.yellow(\"Falling back to the local Yarn cache.\"));\n console.log();\n }\n } else if (usePnpm) {\n command = \"pnpm\";\n args = [\"install\", \"--ignore-workspace\", \"--loglevel\", \"error\"];\n if (isDevDependencies) {\n args.push(\"--save-dev\");\n } else {\n args.push(\"--save\");\n }\n\n args.push(...dependencies);\n } else if (useBun) {\n command = \"bun\";\n if (dependencies.length > 0) {\n args = [\"add\"];\n if (isDevDependencies) {\n args.push(\"--dev\");\n }\n args.push(...dependencies);\n } else {\n args = [\"install\"];\n }\n } else {\n command = \"npm\";\n args = [\"install\", \"--loglevel\", \"error\"];\n if (isDevDependencies) {\n args.push(\"--save-dev\");\n } else {\n args.push(\"--save\");\n }\n\n args.push(...dependencies);\n }\n\n if (verbose) {\n args.push(\"--verbose\");\n }\n\n try {\n execFileSync(resolveExecutable(command), args, {\n cwd: root,\n stdio: \"inherit\",\n });\n } catch {\n throw new Error(`${command} ${args.join(\" \")}`);\n }\n};\n\nexport type RunOptions = {\n root: string;\n appName: string;\n originalDirectory: string;\n verbose?: boolean;\n useYarn?: boolean;\n usePnpm?: boolean;\n useBun?: boolean;\n templatesOrExtensions?: TemplateOrExtension[];\n dependencies?: string[];\n devDependencies?: string[];\n installDependencies?: boolean;\n runCommand: string;\n installCommand: string;\n} & {\n [key: string]: unknown;\n};\n\nconst runCommandInProjectDir = async (\n root: string,\n command: string,\n args: string[] = [],\n successMessage = \"Operation completed successfully.\",\n errorMessage = \"Operation failed.\",\n) => {\n const [executable, ...baseArgs] =\n command === \"npm run\"\n ? [\"npm\", \"run\"]\n : command === \"pnpm run\"\n ? [\"pnpm\", \"run\"]\n : command === \"bun run\"\n ? [\"bun\", \"run\"]\n : [command];\n\n try {\n execFileSync(resolveExecutable(executable), [...baseArgs, ...args], {\n cwd: root,\n stdio: \"ignore\",\n });\n console.log(pc.green(successMessage));\n } catch {\n console.log();\n console.log(pc.red(errorMessage));\n console.log();\n }\n};\n\nfunction extractNameAndVersion(dependencyString: string) {\n // extract the name and version from the dependency string separated by @\n // e.g. @types/react@^16\n // => name: @types/react\n // => version: ^16\n // e.g. react@^16\n // => name: react\n // => version: ^16\n\n // Find the last \"@\" symbol to split the string\n const lastIndex = dependencyString.lastIndexOf(\"@\");\n\n if (lastIndex !== -1) {\n // Split the string into name and version parts\n const name = dependencyString.substring(0, lastIndex); // Name\n const version = dependencyString.substring(lastIndex + 1); // Version\n\n return { name, version };\n } else {\n // If \"@\" is not present, treat the whole string as the name\n return { name: dependencyString, version: \"\" };\n }\n}\n\nconst run = async ({\n root,\n appName,\n originalDirectory,\n verbose = false,\n useYarn = false,\n usePnpm = false,\n useBun = false,\n templatesOrExtensions = [],\n dependencies = [],\n devDependencies = [],\n installDependencies = true,\n runCommand = \"\",\n installCommand = \"\",\n ...customOptions\n}: RunOptions) => {\n const isOnline = useYarn ? await checkIfOnline(useYarn) : true;\n\n if (isEmpty(templatesOrExtensions)) {\n console.log();\n console.log(\n pc.yellow(\n \"No templates or extensions specified to bootstrap application.\",\n ),\n );\n console.log();\n process.exit(0);\n }\n\n console.log();\n console.log(\"Scaffolding project in \" + root + \"...\");\n\n await loadFiles({\n root,\n templatesOrExtensions,\n appName,\n originalDirectory,\n verbose,\n useYarn,\n usePnpm,\n useBun,\n runCommand,\n installCommand,\n ...customOptions,\n });\n\n console.log();\n console.log(pc.green(\"Successfully scaffolded project.\"));\n console.log();\n\n if (installDependencies) {\n console.log(\n pc.green(\"Installing packages. This might take a couple of minutes.\"),\n );\n console.log(pc.green(\"Installing dependencies...\"));\n console.log();\n // Install dependencies\n await install(\n root,\n useYarn,\n usePnpm,\n useBun,\n dependencies,\n verbose,\n isOnline,\n false,\n );\n\n if (devDependencies.length > 0) {\n console.log();\n console.log(pc.green(\"Installing devDependencies...\"));\n console.log();\n // Install devDependencies\n await install(\n root,\n useYarn,\n usePnpm,\n useBun,\n devDependencies,\n verbose,\n isOnline,\n true,\n );\n }\n } else {\n console.log(pc.yellow(\"Skip package installation.\"));\n const packageJson = JSON.parse(\n fs.readFileSync(`${root}/package.json`, \"utf8\"),\n );\n\n const updateDependencies = (deps: string[]) => {\n return deps.reduce(\n (dep, elem) => {\n const nextDep = dep;\n if (/.+@(\\^|~)?[0-9a-zA-Z-.]+$/.test(elem)) {\n const { name, version } = extractNameAndVersion(elem);\n nextDep[name] = version;\n } else {\n nextDep[elem] = \"*\";\n }\n return nextDep;\n },\n {} as { [key: string]: string },\n );\n };\n\n packageJson.dependencies = updateDependencies(dependencies);\n packageJson.devDependencies = updateDependencies(devDependencies);\n\n fs.writeFileSync(\n path.join(root, \"package.json\"),\n JSON.stringify(packageJson, null, 2) + os.EOL,\n );\n\n console.log();\n console.log(pc.green(\"Successfully updated package.json.\"));\n console.log(pc.yellow(`Run ${pc.cyan(installCommand)} to install.`));\n }\n\n console.log();\n console.log(\"Initializing git repository...\");\n\n try {\n const { simpleGit } = (await import(\"simple-git\")) as unknown as {\n simpleGit: (\n baseDir?: string,\n options?: Partial<SimpleGitOptions>,\n ) => SimpleGit;\n };\n const git = simpleGit(root);\n await git.init();\n console.log(pc.green(\"Successfully initialized git repository.\"));\n } catch {\n console.log();\n console.log(\n pc.red(\n \"Failed to initialize git repository. Run `git init` to initialize git repository after the process is completed.\",\n ),\n );\n console.log();\n }\n\n if (installDependencies && isOnline) {\n const packageJson = JSON.parse(\n fs.readFileSync(`${root}/package.json`, \"utf8\"),\n );\n\n const runFormat = async () => {\n try {\n await runCommandInProjectDir(\n root,\n runCommand,\n [\"format\"],\n \"Successfully formatted code.\",\n `Failed to format code. Run \\`${runCommand} format\\` to format code after the process is completed.`,\n );\n } catch {\n // ignore\n }\n };\n\n const runLintFix = async () => {\n try {\n await runCommandInProjectDir(\n root,\n runCommand,\n [\"lint:fix\"],\n \"Successfully fixed linting errors.\",\n `Failed to fix linting errors. Run \\`${runCommand} lint:fix\\` to fix linting errors after the process is completed.`,\n );\n } catch {\n // ignore\n }\n };\n\n if (packageJson.scripts && packageJson.scripts[\"format\"]) {\n await runFormat();\n }\n if (packageJson.scripts && packageJson.scripts[\"lint:fix\"]) {\n await runLintFix();\n }\n }\n\n // Print out instructions\n console.log();\n console.log(pc.green(\"Successfully created project \" + appName + \".\"));\n console.log();\n console.log(\"Done! Now run:\");\n console.log();\n console.log(pc.cyan(` cd ${appName}`));\n console.log(pc.cyan(` ${installCommand}`));\n\n const packageJson = JSON.parse(\n fs.readFileSync(`${root}/package.json`, \"utf8\"),\n );\n\n const lookForScripts = [\"compose:up\", \"sls:offline\", \"dev\", \"start\"];\n\n for (const script of lookForScripts) {\n if (packageJson.scripts && packageJson.scripts[script]) {\n console.log(pc.cyan(` ${runCommand} ${script}`));\n break;\n }\n }\n\n console.log();\n console.log(pc.green(\"Happy hacking!\"));\n};\n\nexport type CreateAppOptions = {\n name: string;\n verbose?: boolean;\n packageManager?: string;\n templatesOrExtensions?: TemplateOrExtension[];\n installDependencies?: boolean;\n ignorePackage?: boolean;\n} & {\n [key: string]: unknown;\n};\n\nexport const createApp = async ({\n name,\n verbose = false,\n templatesOrExtensions = [],\n installDependencies = true,\n ignorePackage = false,\n ...customOptions\n}: CreateAppOptions) => {\n const root = path.resolve(name);\n const appName = path.basename(root);\n\n fs.mkdirSync(name, {\n recursive: true,\n });\n\n console.log(`Creating a new Node app in ${pc.green(root)}.`);\n console.log();\n\n const useYarn = customOptions.packageManager === \"yarn\" && shouldUseYarn();\n const usePnpm = customOptions.packageManager === \"pnpm\" && shouldUsePnpm();\n const useBun = customOptions.packageManager === \"bun\" && shouldUseBun();\n const runCommand = useYarn\n ? \"yarn\"\n : usePnpm\n ? \"pnpm run\"\n : useBun\n ? \"bun run\"\n : \"npm run\";\n const installCommand = useYarn\n ? \"yarn\"\n : usePnpm\n ? \"pnpm install\"\n : useBun\n ? \"bun install\"\n : \"npm install\";\n\n const { packageJson, dependencies, devDependencies } = await loadPackages({\n templatesOrExtensions,\n appName,\n usePnpm,\n useYarn,\n useBun,\n runCommand,\n ignorePackage,\n });\n\n fs.writeFileSync(\n path.join(root, \"package.json\"),\n JSON.stringify(packageJson, null, 2) + os.EOL,\n );\n\n const originalDirectory = process.cwd();\n process.chdir(root);\n if (!useYarn && !useBun && !checkThatNpmCanReadCwd()) {\n process.exit(1);\n }\n\n if (!semver.satisfies(process.version, \">=18.0.0\")) {\n console.log(\n pc.yellow(\n `You are using Node ${process.version} so the project will be bootstrapped with an old unsupported version of tools.\\n\\n` +\n `Please update to Node 18 or higher for a better, fully supported experience.\\n`,\n ),\n );\n }\n\n if (!useYarn && !useBun) {\n const npmInfo = checkNpmVersion();\n if (!npmInfo.hasMinNpm) {\n if (npmInfo.npmVersion) {\n console.log(\n pc.yellow(\n `You are using npm ${npmInfo.npmVersion} so the project will be bootstrapped with an old unsupported version of tools.\\n\\n` +\n `Please update to npm 3 or higher for a better, fully supported experience.\\n`,\n ),\n );\n }\n }\n }\n\n if (useYarn) {\n let yarnUsesDefaultRegistry = true;\n try {\n yarnUsesDefaultRegistry =\n execFileSync(resolveExecutable(\"yarnpkg\"), [\n \"config\",\n \"get\",\n \"registry\",\n ])\n .toString()\n .trim() === \"https://registry.yarnpkg.com\";\n } catch {\n // ignore\n }\n if (false && yarnUsesDefaultRegistry) {\n fs.cpSync(\n require.resolve(\"./yarn.lock.cached\"),\n path.join(root, \"yarn.lock\"),\n { force: true },\n );\n }\n }\n\n return run({\n root,\n appName,\n originalDirectory,\n verbose,\n useYarn,\n usePnpm,\n useBun,\n templatesOrExtensions,\n dependencies,\n devDependencies,\n installDependencies,\n runCommand,\n installCommand,\n ...customOptions,\n });\n};\n","import { execFileSync } from \"child_process\";\nimport spawn from \"cross-spawn\";\nimport pc from \"picocolors\";\nimport semver from \"semver\";\nimport dns from \"dns\";\nimport { URL } from \"url\";\nimport { resolveExecutable } from \"./executable.js\";\n\nexport const toCamelCase = (str: string) => {\n // Lower cases the string\n return (\n str\n .toLowerCase()\n // Replaces any - or _ characters with a space\n .replace(/[-_]+/g, \" \")\n // Removes any non alphanumeric characters\n .replace(/[^\\w\\s]/g, \"\")\n // Uppercases the first character in each group immediately following a space\n // (delimited by spaces)\n .replace(/ (.)/g, ($1) => {\n return $1.toUpperCase();\n })\n // Removes spaces\n .replace(/ /g, \"\")\n );\n};\n\nexport const isUsingYarn = () => {\n return (process.env.npm_config_user_agent || \"\").indexOf(\"yarn\") === 0;\n};\n\nexport const shouldUseYarn = () => {\n const { hasMinYarnPnp, hasMaxYarnPnp, yarnVersion } = checkYarnVersion();\n\n if (!hasMinYarnPnp) {\n console.log(\n pc.yellow(\n `You are using yarn version ${pc.bold(\n yarnVersion,\n )} which is not supported yet. ` +\n `To use Yarn, install v1.12.0 or higher and lower than v2.0.0. ` +\n `See https://yarnpkg.com for instructions on how to update.`,\n ),\n );\n return false;\n }\n\n if (!hasMaxYarnPnp) {\n console.log(\n pc.yellow(\n `You are using a pre-release version of Yarn which is not supported yet. ` +\n `To use Yarn, install v1.12.0 or higher and lower than v2.0.0. ` +\n `See https://yarnpkg.com for instructions on how to update.`,\n ),\n );\n return false;\n }\n\n return true;\n};\n\nexport const shouldUsePnpm = () => {\n const { hasMinPnpm, pnpmVersion } = checkPnpmVersion();\n\n if (!hasMinPnpm) {\n console.log(\n pc.yellow(\n `You are using pnpm version ${pc.bold(\n pnpmVersion,\n )} which is not supported yet. ` +\n `To use pnpm, install v5.0.0 or higher. ` +\n `See https://pnpm.js.org for instructions on how to update.`,\n ),\n );\n return false;\n }\n\n return true;\n};\n\nexport const shouldUseBun = () => {\n const { hasMinBun, bunVersion } = checkBunVersion();\n\n if (!hasMinBun) {\n console.log(\n pc.yellow(\n `You are using bun version ${pc.bold(\n bunVersion,\n )} which is not supported yet. ` +\n `To use bun, install v1.0.0 or higher. ` +\n `See https://bun.sh for instructions on how to install.`,\n ),\n );\n return false;\n }\n\n return true;\n};\n\nexport const checkThatNpmCanReadCwd = () => {\n const cwd = process.cwd();\n let childOutput = null;\n try {\n // Note: intentionally using spawn over exec since\n // the problem doesn't reproduce otherwise.\n // `npm config list` is the only reliable way I could find\n // to reproduce the wrong path. Just printing process.cwd()\n // in a Node process was not enough.\n childOutput = spawn.sync(\"npm\", [\"config\", \"list\"]).output.join(\"\");\n } catch {\n // Something went wrong spawning node.\n // Not great, but it means we can't do this check.\n // We might fail later on, but let's continue.\n return true;\n }\n if (typeof childOutput !== \"string\") {\n return true;\n }\n const lines = childOutput.split(\"\\n\");\n // `npm config list` output includes the following line:\n // \"; cwd = C:\\path\\to\\current\\dir\" (unquoted)\n // I couldn't find an easier way to get it.\n const prefix = \"; cwd = \";\n const line = lines.find((line) => line.startsWith(prefix));\n if (typeof line !== \"string\") {\n // Fail gracefully. They could remove it.\n return true;\n }\n const npmCWD = line.substring(prefix.length);\n if (npmCWD === cwd) {\n return true;\n }\n console.error(\n pc.red(\n `Could not start an npm process in the right directory.\\n\\n` +\n `The current directory is: ${pc.bold(cwd)}\\n` +\n `However, a newly started npm process runs in: ${pc.bold(npmCWD)}\\n\\n` +\n `This is probably caused by a misconfigured system terminal shell.`,\n ),\n );\n if (process.platform === \"win32\") {\n console.error(\n pc.red(`On Windows, this can usually be fixed by running:\\n\\n`) +\n ` ${pc.cyan(\n \"reg\",\n )} delete \"HKCU\\\\Software\\\\Microsoft\\\\Command Processor\" /v AutoRun /f\\n` +\n ` ${pc.cyan(\n \"reg\",\n )} delete \"HKLM\\\\Software\\\\Microsoft\\\\Command Processor\" /v AutoRun /f\\n\\n` +\n pc.red(`Try to run the above two lines in the terminal.\\n`) +\n pc.red(\n `To learn more about this problem, read: https://blogs.msdn.microsoft.com/oldnewthing/20071121-00/?p=24433/`,\n ),\n );\n }\n return false;\n};\n\nexport const checkPnpmVersion = () => {\n const minPnpm = \"5.0.0\";\n let hasMinPnpm = false;\n let pnpmVersion = null;\n try {\n pnpmVersion = execFileSync(resolveExecutable(\"pnpm\"), [\"--version\"])\n .toString()\n .trim();\n if (semver.valid(pnpmVersion)) {\n hasMinPnpm = semver.gte(pnpmVersion, minPnpm);\n } else {\n // Handle non-semver compliant pnpm version strings, which pnpm currently\n // uses for nightly builds. The regex truncates anything after the first\n // dash. See #5362.\n const trimmedPnpmVersionMatch = /^(.*?)[-+].+$/.exec(pnpmVersion);\n if (trimmedPnpmVersionMatch && trimmedPnpmVersionMatch[1]) {\n hasMinPnpm = semver.gte(trimmedPnpmVersionMatch[1], minPnpm);\n }\n }\n } catch {\n // Ignore errors.\n }\n return { hasMinPnpm, pnpmVersion };\n};\n\nexport const checkBunVersion = () => {\n const minBun = \"1.0.0\";\n let hasMinBun = false;\n let bunVersion = null;\n try {\n bunVersion = execFileSync(resolveExecutable(\"bun\"), [\"--version\"])\n .toString()\n .trim();\n if (semver.valid(bunVersion)) {\n hasMinBun = semver.gte(bunVersion, minBun);\n }\n } catch {\n // ignore\n }\n return { hasMinBun, bunVersion };\n};\n\nexport const checkYarnVersion = () => {\n const minYarnPnp = \"1.12.0\";\n const maxYarnPnp = \"2.0.0\";\n let hasMinYarnPnp = false;\n let hasMaxYarnPnp = false;\n let yarnVersion = null;\n try {\n yarnVersion = execFileSync(resolveExecutable(\"yarnpkg\"), [\"--version\"])\n .toString()\n .trim();\n if (semver.valid(yarnVersion)) {\n hasMinYarnPnp = semver.gte(yarnVersion, minYarnPnp);\n hasMaxYarnPnp = semver.lt(yarnVersion, maxYarnPnp);\n } else {\n // Handle non-semver compliant yarn version strings, which yarn currently\n // uses for nightly builds. The regex truncates anything after the first\n // dash. See #5362.\n const trimmedYarnVersionMatch = /^(.+?)[-+].+$/.exec(yarnVersion);\n if (trimmedYarnVersionMatch) {\n const trimmedYarnVersion = trimmedYarnVersionMatch.pop();\n if (trimmedYarnVersion) {\n hasMinYarnPnp = semver.gte(trimmedYarnVersion, minYarnPnp);\n hasMaxYarnPnp = semver.lt(trimmedYarnVersion, maxYarnPnp);\n }\n }\n }\n } catch {\n // ignore\n }\n return {\n hasMinYarnPnp: hasMinYarnPnp,\n hasMaxYarnPnp: hasMaxYarnPnp,\n yarnVersion: yarnVersion,\n };\n};\n\nexport const checkNpmVersion = () => {\n let hasMinNpm = false;\n let npmVersion = null;\n try {\n npmVersion = execFileSync(resolveExecutable(\"npm\"), [\"--version\"])\n .toString()\n .trim();\n hasMinNpm = semver.gte(npmVersion, \"6.0.0\");\n } catch {\n // ignore\n }\n return {\n hasMinNpm: hasMinNpm,\n npmVersion: npmVersion,\n };\n};\n\nconst getProxy = () => {\n if (process.env.HTTPS_PROXY) {\n return process.env.HTTPS_PROXY;\n }\n try {\n // Trying to read https-proxy from .npmrc\n const httpsProxy = execFileSync(resolveExecutable(\"npm\"), [\n \"config\",\n \"get\",\n \"https-proxy\",\n ])\n .toString()\n .trim();\n return httpsProxy !== \"null\" ? httpsProxy : undefined;\n } catch {\n // ignore\n }\n return \"\";\n};\n\nexport const checkIfOnline = (useYarn?: boolean) => {\n if (!useYarn) {\n // Don't ping the Yarn registry.\n // We'll just assume the best case.\n return Promise.resolve(true);\n }\n\n return new Promise<boolean>((resolve) => {\n dns.lookup(\"registry.yarnpkg.com\", (err) => {\n let proxy;\n if (err != null && (proxy = getProxy())) {\n // If a proxy is defined, we likely can't resolve external hostnames.\n // Try to resolve the proxy name as an indication of a connection.\n dns.lookup(new URL(proxy).hostname, (proxyErr) => {\n resolve(!proxyErr);\n });\n } else {\n resolve(!err);\n }\n });\n });\n};\n","export const resolveExecutable = (bin: string) =>\n process.platform === \"win32\" ? `${bin}.cmd` : bin;\n","// Removed unused eslint-disable (global-require) after migration to flat config\nimport { existsSync } from \"fs\";\nimport merge from \"lodash.merge\";\nimport type { TemplateOrExtension } from \"./loaders.js\";\nimport { getPackagePath } from \"./paths.js\";\n\n// Type for setup options\ntype GetInstallableSetupOptions = {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n [key: string]: unknown;\n};\n\n// Helper function to prepare installable setup\nconst getInstallableSetup = ({\n dependencies,\n devDependencies,\n ...packageJson\n}: GetInstallableSetupOptions) => {\n const getInstallableDeps = (deps = {}) =>\n Object.entries(deps).map(([dep, version]) => `${dep}@${version}`);\n\n return {\n packageJson,\n dependencies: getInstallableDeps(dependencies),\n devDependencies: getInstallableDeps(devDependencies),\n };\n};\n\n// Helper function to require a module if it exists, or throw an error\nconst requireIfExists = (path: string) => {\n if (existsSync(path)) {\n return require(path);\n }\n\n throw new Error(`File ${path} does not exist`);\n};\n\n// Options for loading packages\nexport type LoadPackagesOptions = {\n templatesOrExtensions?: TemplateOrExtension[];\n ignorePackage?: boolean;\n [key: string]: unknown;\n};\n\n/**\n * loadPackages loads the templatesOrExtensions packages and merge them into a single package.json\n * @param opts.templatesOrExtensions - templatesOrExtensions to load\n * @param opts.ignorePackage - ignore package.json file\n * @param opts.config - config to pass to the templatesOrExtensions package module\n * @returns\n */\nexport const loadPackages = async ({\n templatesOrExtensions = [],\n ignorePackage: globalIgnorePackage = false,\n ...config\n}: LoadPackagesOptions) => {\n // Load and merge template packages concurrently\n const setup = await Promise.all(\n templatesOrExtensions.map(async ({ url: templateOrExtension }) => {\n try {\n // Try to load and merge template package\n const template = requireIfExists(\n await getPackagePath(templateOrExtension, \"template.json\"),\n );\n return template.package || {}; // Use an empty object if template.json is not found\n } catch {\n return {}; // Ignore if template.json is not found\n }\n }),\n );\n\n // Merge all the setup results from templates\n const mergedSetup = merge(\n {\n name: config.appName,\n dependencies: {},\n devDependencies: {},\n scripts: {},\n },\n ...setup,\n );\n\n // Load and merge package.json files concurrently\n const finalSetup = await Promise.all(\n templatesOrExtensions.map(\n async ({ url: templateOrExtension, ignorePackage }) => {\n try {\n // Try to load and merge package.json\n const templateOrExtensionPackageJson = requireIfExists(\n await getPackagePath(\n templateOrExtension,\n \"package.json\",\n globalIgnorePackage || ignorePackage,\n ),\n );\n return templateOrExtensionPackageJson; // Use an empty object if package.json is not found\n } catch {\n return {}; // Ignore if package.json is not found\n }\n },\n ),\n );\n\n // Resolve package updates using package module concurrently\n const resolvedSetup = await Promise.all(\n templatesOrExtensions.map(async ({ url: templateOrExtension }) => {\n try {\n // Try to resolve package updates using package module\n const resolveTemplateOrExtensionPackage = requireIfExists(\n await getPackagePath(templateOrExtension),\n );\n return resolveTemplateOrExtensionPackage(mergedSetup, config); // Use an empty object if resolution fails\n } catch {\n return {}; // Ignore if the resolution function fails\n }\n }),\n );\n\n // Merge all setup results\n const packageJson = merge(mergedSetup, ...finalSetup, ...resolvedSetup);\n\n // Prepare the final installable setup\n return getInstallableSetup({\n ...packageJson,\n name: config.appName,\n });\n};\n","import fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\nimport debug from \"debug\";\nimport { downloadRepository } from \"./git.js\";\n\nconst log = debug(\"cna:paths\");\n\nconst moduleDir = __dirname;\n\n/**\n * Parse a template / extension URL (supports GitHub style and file:// URLs).\n * For GitHub style URLs we accept:\n * https://github.com/<org>/<repo>\n * https://github.com/<org>/<repo>/tree/<branch>/<subdir?>?ignorePackage=true\n * For local file templates:\n * file:///absolute/path/to/template\n * file:///absolute/path/to/repo?subdir=templates/react-vite-starter\n * Query params:\n * - ignorePackage=true -> ignore package.json from template\n * - subdir=<relativePath> (only for file://) -> pick subdirectory\n */\nconst solveValuesFromTemplateOrExtensionUrl = (templateOrExtension: string) => {\n const url = new URL(templateOrExtension);\n const ignorePackage = url.searchParams.get(\"ignorePackage\") === \"true\";\n\n if (url.protocol === \"file:\") {\n // Handle platform specific absolute paths\n let pathname = decodeURIComponent(url.pathname);\n // On Windows a file URL looks like file:///C:/path -> pathname /C:/path\n if (process.platform === \"win32\" && /^\\/[A-Za-z]:\\//.test(pathname)) {\n pathname = pathname.slice(1); // drop leading slash\n }\n const subdirParam = url.searchParams.get(\"subdir\") || \"\";\n return {\n url: templateOrExtension, // not used for git cloning when file://\n branch: \"\",\n subdir: subdirParam,\n protocol: url.protocol,\n host: \"\", // host is unused for file\n pathname,\n ignorePackage,\n };\n }\n\n const origin = `${url.protocol}//${url.host}`;\n // GitHub style path splitting: /org/repo[/tree/<branch>/<subdir...>]\n const parts = url.pathname.slice(1).split(\"/\");\n const [org, repo] = parts;\n let branch = \"\";\n let subdir = \"\";\n if (parts[2] === \"tree\") {\n branch = parts[3] || \"\";\n subdir = parts.slice(4).join(\"/\");\n }\n return {\n url: `${origin}/${org}/${repo}`,\n branch,\n subdir,\n protocol: url.protocol,\n host: url.host,\n pathname: url.pathname,\n ignorePackage,\n };\n};\n\ntype SolveRepositoryPathOptions = {\n url: string;\n branch?: string;\n subdir?: string;\n};\n\nconst solveRepositoryPath = async ({\n url,\n branch,\n subdir,\n}: SolveRepositoryPathOptions) => {\n const targetId = Buffer.from(`${url}#${branch}`).toString(\"base64\");\n const targetWithSubdir = Buffer.from(`${url}#${branch}#${subdir}`).toString(\n \"base64\",\n );\n const target = path.join(os.homedir(), \".cna\", targetWithSubdir);\n\n // Test helper: allow skipping actual git clone to prevent network / credential prompts\n if (process.env.CNA_SKIP_GIT === \"1\") {\n return { dir: target, subdir };\n }\n\n await downloadRepository({\n url,\n branch: branch || \"\",\n target,\n targetId,\n });\n\n return { dir: target, subdir };\n};\n\ntype SolvedTemplatePath = {\n dir: string;\n // subdir can be empty string or undefined\n subdir: string | undefined;\n ignorePackage: boolean | undefined;\n};\n\nconst solveTemplateOrExtensionPath = async (\n templateOrExtension: string,\n): Promise<SolvedTemplatePath> => {\n let parsed: ReturnType<typeof solveValuesFromTemplateOrExtensionUrl>;\n try {\n parsed = solveValuesFromTemplateOrExtensionUrl(templateOrExtension);\n } catch {\n // Fallback to an internal templatesOrExtensions directory (legacy behavior)\n log(\"Falling back to legacy template path for: %s\", templateOrExtension);\n return {\n dir: path.resolve(\n moduleDir,\n \"..\",\n \"templatesOrExtensions\",\n templateOrExtension,\n ),\n subdir: undefined,\n ignorePackage: undefined,\n };\n }\n\n const { url, branch, subdir, protocol, pathname, ignorePackage } = parsed;\n\n if (protocol === \"file:\") {\n return { dir: pathname, subdir, ignorePackage };\n }\n\n const gitData = await solveRepositoryPath({ url, branch, subdir });\n return { dir: gitData.dir, subdir: gitData.subdir, ignorePackage };\n};\n\nexport const getPackagePath = async (\n templateOrExtension: string,\n name = \"package\",\n ignorePackage = false,\n) => {\n const {\n dir,\n subdir,\n ignorePackage: templateOrExtensionIgnorePackage,\n } = await solveTemplateOrExtensionPath(templateOrExtension);\n\n if (\n name === \"package.json\" &&\n (ignorePackage || templateOrExtensionIgnorePackage)\n ) {\n throw new Error(\n \"package.json should be ignored for file templateOrExtension\",\n );\n }\n\n if (subdir) {\n return path.resolve(dir, subdir, name);\n }\n\n return path.resolve(dir, name);\n};\n\n/**\n * Returns the base directory for a template URL — i.e. the directory that\n * CONTAINS the optional `template/` subdirectory. This is where cna.config.json\n * should be placed by template authors.\n */\nexport const getTemplateBaseDirPath = async (\n templateOrExtensionUrl: string,\n): Promise<string> => {\n try {\n const { dir, subdir = \"\" } = await solveTemplateOrExtensionPath(\n templateOrExtensionUrl,\n );\n return path.resolve(dir, subdir);\n } catch {\n return \"\";\n }\n};\n\nexport const getTemplateDirPath = async (templateOrExtensionUrl: string) => {\n const { dir, subdir = \"\" } = await solveTemplateOrExtensionPath(\n templateOrExtensionUrl,\n );\n let templateDirPath = path.resolve(dir, subdir);\n\n // If `${templateDirPath}/template` is a directory, return it. Otherwise, return `${templateDirPath}`\n const templateDirPathWithTemplate = path.resolve(templateDirPath, \"template\");\n\n return new Promise<string>((resolve) => {\n fs.stat(templateDirPathWithTemplate, (_err, stats) => {\n if (_err) {\n resolve(templateDirPath);\n return;\n }\n\n if (stats.isDirectory()) {\n templateDirPath = templateDirPathWithTemplate;\n }\n\n resolve(templateDirPath);\n });\n });\n};\n","import os from \"os\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport debug from \"debug\";\nimport { simpleGit, type SimpleGit, type CloneOptions } from \"simple-git\";\nimport * as fse from \"fs-extra\"; // Import fs-extra for advanced file operations\n\nconst log = debug(\"cna:git\");\n\nconst formatRepositoryDownloadError = (error: unknown, url: string): string => {\n const message = error instanceof Error ? error.message : String(error);\n\n if (/not found|404|repository not found/i.test(message)) {\n return [\n `Error: Could not fetch template from '${url}'.`,\n \" → The URL returned HTTP 404 or the repository was not found. Please verify the URL is correct.\",\n \" → Run 'npx create-awesome-node-app --list-templates' to see available templates.\",\n ].join(\"\\n\");\n }\n\n if (/403|authentication|permission denied|access denied/i.test(message)) {\n return [\n `Error: Could not fetch template from '${url}'.`,\n \" → Access denied (HTTP 403). Check that the repository is public or you have access.\",\n \" → Run 'npx create-awesome-node-app --list-templates' to see available templates.\",\n ].join(\"\\n\");\n }\n\n if (/ECONNREFUSED|ENOTFOUND|ETIMEDOUT|network/i.test(message)) {\n return [\n `Error: Could not fetch template from '${url}'.`,\n \" → Could not reach the repository. Please check your internet connection.\",\n \" → Run 'npx create-awesome-node-app --list-templates' to see available templates.\",\n ].join(\"\\n\");\n }\n\n return [\n `Error: Could not fetch template from '${url}'.`,\n ` → ${message}`,\n \" → Run 'npx create-awesome-node-app --list-templates' to see available templates.\",\n ].join(\"\\n\");\n};\n\n/**\n * filter .git folder\n */\nconst filterGit = (src: string) => {\n return !/(\\\\|\\/)\\.git\\b/.test(src);\n};\n\nexport type DownloadRepositoryOptions = {\n url?: string;\n target: string;\n cacheDir?: string;\n branch?: string | undefined;\n offline?: boolean;\n targetId?: string;\n};\n\n// Create a Map to store ongoing Git operations\nconst gitOperationMap = new Map<string, Promise<void>>();\n\n// Create a Map to store completed targetIds\nconst completedTargetIds = new Map<string, boolean>();\n\n/**\n * @param opts options\n * @param opts.url The git repository url.\n * @param opts.targetId The target id. Default is `Buffer.from(`${gitUrl}@${branch}`).toString(\"base64\")`\n * @param opts.target The target folder.\n * @param opts.cacheDir? Default `~/.cache/cna/${name}`, the folder\n * @param opts.branch? Default 'main'. Git branch.\n * @param opts.offline? use cached files, and don't update.\n */\nexport const downloadRepository = async ({\n url = \"\",\n offline = false,\n target = \"./\",\n branch = \"main\",\n targetId,\n cacheDir: optsCacheDir,\n}: DownloadRepositoryOptions) => {\n const absoluteTarget = path.isAbsolute(target)\n ? target\n : path.resolve(target);\n const targetExistedBefore = fs.existsSync(absoluteTarget);\n\n const isGithub = /^[^/]+\\/[^/]+$/.test(url);\n const gitUrl = isGithub ? `https://github.com/${url}` : url;\n const id = targetId || Buffer.from(`${gitUrl}@${branch}`).toString(\"base64\");\n let cacheDir = optsCacheDir || path.join(os.homedir(), \".cache\", \"cna\", id);\n\n cacheDir = path.isAbsolute(cacheDir) ? cacheDir : path.resolve(cacheDir);\n\n log(\"cache folder: %s\", cacheDir);\n\n // Check if the targetId has already been completed (checkout done)\n if (completedTargetIds.has(id)) {\n log(\n `Git checkout for target ID '${id}' has already been completed. Skipping.`,\n );\n // Use fs-extra's copy method with filter\n await fse.copy(cacheDir, absoluteTarget, {\n overwrite: true,\n filter: filterGit,\n });\n return;\n }\n\n // Check if there is an ongoing Git operation with the same target ID\n if (gitOperationMap.has(id)) {\n log(\n `Git operation for target ID '${id}' is already in progress. Waiting...`,\n );\n await gitOperationMap.get(id);\n log(`Git operation for target ID '${id}' has completed.`);\n return;\n }\n\n // Create a new promise for the Git operation and store it in the map\n const gitOperationPromise = (async () => {\n let git: SimpleGit = simpleGit();\n const cloneOptions: CloneOptions = {\n \"--depth\": 1,\n \"--branch\": branch,\n \"--single-branch\": null,\n \"--no-tags\": null,\n };\n\n try {\n const cached = fs.existsSync(cacheDir);\n\n if (!cached) {\n log(\"Cloning repository...\");\n await git.clone(gitUrl, cacheDir, cloneOptions);\n }\n\n git = simpleGit(cacheDir);\n\n if (!offline) {\n log(\"Pulling repository...\");\n await git.checkout([\"-f\", branch]);\n await git.pull();\n }\n\n // Use fs-extra's copy method with filter\n await fse.copy(cacheDir, absoluteTarget, {\n overwrite: true,\n filter: filterGit,\n });\n\n // Mark the targetId as completed\n completedTargetIds.set(id, true);\n } catch (error) {\n if (!targetExistedBefore && fs.existsSync(absoluteTarget)) {\n try {\n fse.removeSync(absoluteTarget);\n log(\"Cleaned up partially created directory: %s\", absoluteTarget);\n } catch (cleanupErr) {\n log(\"Failed to clean up directory: %s\", cleanupErr);\n }\n }\n\n throw new Error(formatRepositoryDownloadError(error, gitUrl));\n } finally {\n // Remove the promise from the map when the operation is complete\n gitOperationMap.delete(id);\n }\n })();\n\n gitOperationMap.set(id, gitOperationPromise);\n\n // Wait for the Git operation to complete\n await gitOperationPromise;\n};\n","import fs from \"fs\";\nimport pc from \"picocolors\";\nimport { readdirp } from \"readdirp\";\nimport { dirname } from \"path\";\nimport { getTemplateDirPath } from \"./paths.js\";\nimport { promisify } from \"util\";\nimport lodash from \"lodash\";\n\nconst { template } = lodash;\n\nconst writeFileAsync = promisify(fs.writeFile);\nconst copyFileAsync = promisify(fs.copyFile);\n\n// Token used inside templates to denote the source directory.\n// Templates name a directory literally `[src]` and files inside like `[src]/App.tsx.template`.\n// We map the prefix `[src]/` to the selected srcDir (e.g. `src/`).\nconst SRC_PATH_PATTERN = \"[src]/\";\nconst DEFAULT_SRC_PATH = \"src/\";\n\nconst getSrcDirPattern = (srcDir: string) =>\n srcDir === \".\" ? \"\" : srcDir + \"/\";\n\nconst makeDirectory = (dirPath: string) => {\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n }\n};\n\nconst getModeFromPath = (path = \"\") => {\n const matchExts = (...exts: string[]) =>\n exts.find((ext) => path.endsWith(ext));\n\n if (matchExts(\".append\")) {\n return \"append\";\n }\n if (matchExts(\".append.template\", \".template.append\")) {\n return \"appendTemplate\";\n }\n if (matchExts(\".template\")) {\n return \"copyTemplate\";\n }\n return \"copy\";\n};\n\ntype FileLoaderOptions = {\n root: string;\n templateDir: string;\n appName: string;\n originalDirectory: string;\n verbose: boolean;\n useYarn?: boolean;\n usePnpm?: boolean;\n useBun?: boolean;\n srcDir: string;\n mode?: string;\n runCommand: string;\n installCommand: string;\n} & {\n [key: string]: unknown;\n};\n\nexport type FileLoader = (\n options: FileLoaderOptions,\n) => (entry: { path: string }) => Promise<void>;\n\n// Batched file copy operation\nconst batchedCopyFiles = async (\n operations: { src: string; dest: string; verbose: boolean }[],\n) => {\n const batchedPromises = operations.map(async (operation) => {\n try {\n makeDirectory(dirname(operation.dest));\n await copyFileAsync(operation.src, operation.dest);\n // Preserve original file permissions (e.g. executable bit on husky hooks)\n try {\n const srcStat = await promisify(fs.stat)(operation.src);\n await promisify(fs.chmod)(operation.dest, srcStat.mode);\n } catch {\n // Non-critical: file was already copied\n }\n if (operation.verbose) {\n console.log(\n pc.green(\n `Added \"${operation.dest}\" from \"${operation.src}\" successfully`,\n ),\n );\n }\n } catch (err) {\n console.log(\n pc.red(`Cannot copy file ${operation.src} to ${operation.dest}`),\n );\n if (operation.verbose) {\n console.log(pc.red(String(err)));\n }\n throw err;\n }\n });\n\n await Promise.all(batchedPromises);\n};\n\n// Batched file write operation\nconst batchedWriteFiles = async (\n operations: {\n path: string;\n content: string;\n flag: string;\n verbose: boolean;\n mode?: number;\n }[],\n) => {\n const batchedPromises = operations.map(async (operation) => {\n try {\n makeDirectory(dirname(operation.path));\n await writeFileAsync(operation.path, operation.content, {\n flag: operation.flag,\n mode: operation.mode,\n });\n if (operation.verbose) {\n console.log(pc.green(`Added \"${operation.path}\" successfully`));\n }\n } catch (err) {\n console.log(pc.red(`Cannot write file ${operation.path}`));\n if (operation.verbose) {\n console.log(pc.red(String(err)));\n }\n throw err;\n }\n });\n\n await Promise.all(batchedPromises);\n};\n\n// Batched file append operation\nconst batchedAppendFiles = async (\n operations: { src: string; dest: string; verbose: boolean }[],\n) => {\n const batchedPromises = operations.map(async (operation) => {\n try {\n const content = await promisify(fs.readFile)(operation.src, \"utf8\");\n const fileMode = (await promisify(fs.stat)(operation.src)).mode;\n await batchedWriteFiles([\n {\n path: operation.dest,\n content,\n flag: \"a+\",\n verbose: operation.verbose,\n mode: fileMode,\n },\n ]);\n } catch (err) {\n console.log(\n pc.red(`Cannot append file ${operation.src} to ${operation.dest}`),\n );\n if (operation.verbose) {\n console.log(pc.red(String(err)));\n }\n throw err;\n }\n });\n\n await Promise.all(batchedPromises);\n};\n\nconst copyLoader: FileLoader =\n ({ root, templateDir, verbose, srcDir }) =>\n async ({ path }) => {\n const operations = [];\n try {\n const newPath = path\n .replace(/.if-(npm|yarn|pnpm|bun)$/, \"\")\n .replace(SRC_PATH_PATTERN, getSrcDirPattern(srcDir));\n\n operations.push({\n src: `${templateDir}/${path}`,\n dest: `${root}/${newPath}`,\n verbose,\n });\n } catch (err) {\n if (verbose) {\n console.log(err);\n }\n throw err;\n }\n\n await batchedCopyFiles(operations);\n };\n\nconst appendLoader: FileLoader =\n ({ root, templateDir, verbose, srcDir }) =>\n async ({ path }) => {\n const operations = [];\n try {\n const newPath = path\n .replace(/.append$/, \"\")\n .replace(/.if-(npm|yarn|pnpm|bun)$/, \"\")\n .replace(SRC_PATH_PATTERN, getSrcDirPattern(srcDir));\n\n operations.push({\n src: `${templateDir}/${path}`,\n dest: `${root}/${newPath}`,\n verbose,\n });\n } catch (err) {\n if (verbose) {\n console.log(err);\n }\n throw err;\n }\n\n await batchedAppendFiles(operations);\n };\n\nconst templateLoader: FileLoader =\n ({\n root,\n templateDir,\n appName,\n verbose,\n mode = \"\",\n srcDir,\n runCommand,\n installCommand,\n ...customOptions\n }) =>\n async ({ path }) => {\n const operations = [];\n try {\n const flag = mode.includes(\"append\") ? \"a+\" : \"w\";\n const filePath = `${templateDir}/${path}`;\n const file = await promisify(fs.readFile)(filePath, \"utf8\");\n const fileMode = (await promisify(fs.stat)(filePath)).mode;\n const newFile = template(file);\n const newPath = path\n .replace(/.template$/, \"\")\n .replace(/.append$/, \"\")\n .replace(/.if-(npm|yarn|pnpm|bun)$/, \"\")\n .replace(SRC_PATH_PATTERN, getSrcDirPattern(srcDir));\n\n operations.push({\n path: `${root}/${newPath}`,\n content: newFile({\n projectName: appName,\n srcDir: srcDir || \".\",\n runCommand,\n installCommand,\n ...customOptions,\n }),\n flag,\n verbose,\n mode: fileMode,\n });\n } catch (err) {\n if (verbose) {\n console.log(err);\n }\n throw err;\n }\n\n await batchedWriteFiles(operations);\n };\n\nconst fileLoader: FileLoader =\n ({\n root,\n templateDir,\n appName,\n originalDirectory,\n verbose,\n useYarn,\n usePnpm,\n useBun,\n srcDir = DEFAULT_SRC_PATH,\n runCommand,\n installCommand,\n ...customOptions\n }) =>\n async ({ path }) => {\n try {\n const mode = getModeFromPath(path);\n\n const loaders = {\n copy: copyLoader,\n append: appendLoader,\n copyTemplate: templateLoader,\n // appendTemplate means treat as a template (interpolate) but append instead of overwrite\n appendTemplate: templateLoader,\n } as const;\n\n await loaders[mode]({\n root,\n templateDir,\n appName,\n originalDirectory,\n verbose,\n useYarn: !!useYarn,\n usePnpm: !!usePnpm,\n useBun: !!useBun,\n mode,\n srcDir,\n runCommand,\n installCommand,\n ...customOptions,\n })({\n path,\n });\n } catch (err) {\n if (verbose) {\n console.log(err);\n }\n throw err;\n }\n };\n\nexport type TemplateOrExtension = { url: string; ignorePackage?: boolean };\n\nexport type LoadFilesOptions = {\n root: string;\n templatesOrExtensions?: TemplateOrExtension[];\n appName: string;\n originalDirectory: string;\n verbose: boolean;\n useYarn?: boolean;\n usePnpm?: boolean;\n useBun?: boolean;\n srcDir?: string;\n runCommand: string;\n installCommand: string;\n} & {\n [key: string]: unknown;\n};\n\nexport const loadFiles = async ({\n root,\n templatesOrExtensions = [],\n appName,\n originalDirectory,\n verbose,\n useYarn = false,\n usePnpm = false,\n useBun = false,\n srcDir = DEFAULT_SRC_PATH,\n runCommand,\n installCommand,\n ...customOptions\n}: LoadFilesOptions) => {\n try {\n const operations = [];\n for await (const { url: templateOrExtensionUrl } of templatesOrExtensions) {\n const templateDir = await getTemplateDirPath(templateOrExtensionUrl);\n if (verbose) {\n try {\n const stat = fs.existsSync(templateDir)\n ? fs.statSync(templateDir)\n : undefined;\n console.log(\n pc.dim(\n `[cna] Template dir resolved: ${templateDir} exists=${!!stat} isDir=$${stat?.isDirectory?.()}`,\n ),\n );\n } catch {\n // ignore\n }\n }\n\n if (\n fs.existsSync(templateDir) &&\n fs.statSync(templateDir).isDirectory()\n ) {\n // readdirp requires at least one positive pattern when using negations; we'll include '**/*'\n // and then filter out undesired files. This ensures templates are actually discovered.\n let debugFirst = true;\n // Collect all file entries without filters then skip undesired patterns manually\n const skipGlobs = [\n /\\bpackage\\.js$/,\n /\\bpackage\\.json$/,\n /\\bpackage-lock\\.json$/,\n /\\btemplate\\.json$/,\n /\\byarn\\.lock$/,\n /\\bpnpm-lock\\.yaml$/,\n ];\n const skipManager = usePnpm\n ? [/\\.if-npm\\./, /\\.if-yarn\\./, /\\.if-bun\\./]\n : useYarn\n ? [/\\.if-npm\\./, /\\.if-pnpm\\./, /\\.if-bun\\./]\n : useBun\n ? [/\\.if-yarn\\./, /\\.if-pnpm\\./]\n : [/\\.if-yarn\\./, /\\.if-pnpm\\./, /\\.if-bun\\./];\n const shouldSkip = (p: string) =>\n [...skipGlobs, ...skipManager].some((rgx) => rgx.test(p));\n\n for await (const entry of readdirp(templateDir, {\n type: \"files\",\n alwaysStat: false,\n })) {\n if (shouldSkip(entry.path)) continue;\n if (entry.path.startsWith(\"package/\")) continue; // skip helper package dir\n if (verbose && debugFirst) {\n console.log(pc.dim(`[cna] First discovered file: ${entry.path}`));\n debugFirst = false;\n }\n operations.push({\n root,\n templateDir,\n appName,\n originalDirectory,\n verbose,\n useYarn,\n usePnpm,\n useBun,\n srcDir,\n runCommand,\n installCommand,\n entry,\n ...customOptions,\n });\n }\n }\n }\n\n if (verbose) {\n console.log(\n pc.dim(\n `[cna] Prepared ${operations.length} file operations from ${templatesOrExtensions.length} template(s)`,\n ),\n );\n if (operations.length === 0) {\n console.log(\n pc.yellow(\n \"[cna] No files discovered. Check that the template repository was cloned and fileFilter patterns are correct.\",\n ),\n );\n }\n }\n\n await Promise.all(\n operations.map((operation) => fileLoader(operation)(operation.entry)),\n );\n } catch (err) {\n if (verbose) {\n console.log(err);\n }\n throw err;\n }\n};\n","import fs from \"fs\";\nimport path from \"path\";\nimport { getTemplateBaseDirPath } from \"./paths.js\";\n\nexport type CnaCustomOption = {\n name: string;\n type: string;\n message?: string;\n initial?: unknown;\n [key: string]: unknown;\n};\n\nexport type CnaConfig = {\n customOptions?: CnaCustomOption[];\n};\n\n/**\n * Load cna.config.json from the base directory of a template.\n *\n * The config file lives alongside (not inside) the `template/` subdirectory:\n *\n * my-template/\n * cna.config.json ← here\n * template/\n * src/\n * package.json\n *\n * Works for both remote GitHub URLs (uses cached clone) and local file:// URLs.\n * Returns null if the file doesn't exist or cannot be parsed.\n */\nexport const loadTemplateCnaConfig = async (\n templateUrl: string,\n): Promise<CnaConfig | null> => {\n try {\n const basePath = await getTemplateBaseDirPath(templateUrl);\n if (!basePath) return null;\n\n const configPath = path.join(basePath, \"cna.config.json\");\n if (!fs.existsSync(configPath)) return null;\n\n const content = fs.readFileSync(configPath, \"utf8\");\n return JSON.parse(content) as CnaConfig;\n } catch {\n return null;\n }\n};\n"],"mappings":"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","names":["pc","semver","execFileSync","lodash","path","fs","pc","os","semver","execFileSync","URL","line","URL","fs","os","path","debug","path","log","debug","path","os","fs","path","template","fs","pc","fs","path","pc","lodash","pc","execFileSync","packageJson","fs","path","os","simpleGit","semver","fs","path","path","fs","semver","pc","execFileSync"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@create-node-app/core",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"lint": "eslint '**/*.{ts,tsx,js}'",
|
|
28
28
|
"lint:fix": "eslint '**/*.{ts,tsx,js}' --fix",
|
|
29
29
|
"type-check": "tsc --noEmit",
|
|
30
|
-
"build": "tsup ./index.ts --format esm,cjs --dts --no-splitting --sourcemap",
|
|
30
|
+
"build": "tsup ./index.ts --format esm,cjs --dts --no-splitting --sourcemap --platform node --shims",
|
|
31
31
|
"dev": "tsup ./index.ts --format esm,cjs --watch --dts --no-splitting --sourcemap",
|
|
32
32
|
"test": "tsx --test tests/**/*.test.mts"
|
|
33
33
|
},
|