@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 CHANGED
@@ -68,27 +68,27 @@ All exports from `@create-node-app/core`:
68
68
 
69
69
  ### Functions
70
70
 
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. |
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)` | 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. |
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 | 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 }` |
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 | 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 |
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 = typeof __dirname !== "undefined" ? __dirname : import_path2.default.dirname((0, import_url2.fileURLToPath)(import_meta.url));
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";
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,qBAAe;AACf,qBAAoB;AACpB,IAAAC,iBAAmB;AACnB,IAAAC,wBAA6B;;;ACH7B,IAAAC,iBAAmB;AAGnB,IAAAC,eAAiB;AACjB,IAAAC,aAAe;AACf,IAAAC,qBAAe;AACf,IAAAC,aAAe;AACf,IAAAC,iBAAmB;AACnB,IAAAC,wBAA6B;;;ACR7B,2BAA6B;AAC7B,yBAAkB;AAClB,wBAAe;AACf,oBAAmB;AACnB,iBAAgB;AAChB,iBAAoB;;;ACLb,IAAM,oBAAoB,CAAC,QAChC,QAAQ,aAAa,UAAU,GAAG,GAAG,SAAS;;;AD8BzC,IAAM,gBAAgB,MAAM;AACjC,QAAM,EAAE,eAAe,eAAe,YAAY,IAAI,iBAAiB;AAEvE,MAAI,CAAC,eAAe;AAClB,YAAQ;AAAA,MACN,kBAAAC,QAAG;AAAA,QACD,8BAA8B,kBAAAA,QAAG;AAAA,UAC/B;AAAA,QACF,CAAC;AAAA,MAGH;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,eAAe;AAClB,YAAQ;AAAA,MACN,kBAAAA,QAAG;AAAA,QACD;AAAA,MAGF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,IAAM,gBAAgB,MAAM;AACjC,QAAM,EAAE,YAAY,YAAY,IAAI,iBAAiB;AAErD,MAAI,CAAC,YAAY;AACf,YAAQ;AAAA,MACN,kBAAAA,QAAG;AAAA,QACD,8BAA8B,kBAAAA,QAAG;AAAA,UAC/B;AAAA,QACF,CAAC;AAAA,MAGH;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,IAAM,eAAe,MAAM;AAChC,QAAM,EAAE,WAAW,WAAW,IAAI,gBAAgB;AAElD,MAAI,CAAC,WAAW;AACd,YAAQ;AAAA,MACN,kBAAAA,QAAG;AAAA,QACD,6BAA6B,kBAAAA,QAAG;AAAA,UAC9B;AAAA,QACF,CAAC;AAAA,MAGH;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,IAAM,yBAAyB,MAAM;AAC1C,QAAM,MAAM,QAAQ,IAAI;AACxB,MAAI,cAAc;AAClB,MAAI;AAMF,kBAAc,mBAAAC,QAAM,KAAK,OAAO,CAAC,UAAU,MAAM,CAAC,EAAE,OAAO,KAAK,EAAE;AAAA,EACpE,QAAQ;AAIN,WAAO;AAAA,EACT;AACA,MAAI,OAAO,gBAAgB,UAAU;AACnC,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,YAAY,MAAM,IAAI;AAIpC,QAAM,SAAS;AACf,QAAM,OAAO,MAAM,KAAK,CAACC,UAASA,MAAK,WAAW,MAAM,CAAC;AACzD,MAAI,OAAO,SAAS,UAAU;AAE5B,WAAO;AAAA,EACT;AACA,QAAM,SAAS,KAAK,UAAU,OAAO,MAAM;AAC3C,MAAI,WAAW,KAAK;AAClB,WAAO;AAAA,EACT;AACA,UAAQ;AAAA,IACN,kBAAAF,QAAG;AAAA,MACD;AAAA;AAAA,4BAC+B,kBAAAA,QAAG,KAAK,GAAG,CAAC;AAAA,gDACQ,kBAAAA,QAAG,KAAK,MAAM,CAAC;AAAA;AAAA;AAAA,IAEpE;AAAA,EACF;AACA,MAAI,QAAQ,aAAa,SAAS;AAChC,YAAQ;AAAA,MACN,kBAAAA,QAAG,IAAI;AAAA;AAAA,CAAuD,IAC5D,KAAK,kBAAAA,QAAG;AAAA,QACN;AAAA,MACF,CAAC;AAAA,IACI,kBAAAA,QAAG;AAAA,QACN;AAAA,MACF,CAAC;AAAA;AAAA,IACD,kBAAAA,QAAG,IAAI;AAAA,CAAmD,IAC1D,kBAAAA,QAAG;AAAA,QACD;AAAA,MACF;AAAA,IACJ;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,mBAAmB,MAAM;AACpC,QAAM,UAAU;AAChB,MAAI,aAAa;AACjB,MAAI,cAAc;AAClB,MAAI;AACF,sBAAc,mCAAa,kBAAkB,MAAM,GAAG,CAAC,WAAW,CAAC,EAChE,SAAS,EACT,KAAK;AACR,QAAI,cAAAG,QAAO,MAAM,WAAW,GAAG;AAC7B,mBAAa,cAAAA,QAAO,IAAI,aAAa,OAAO;AAAA,IAC9C,OAAO;AAIL,YAAM,0BAA0B,gBAAgB,KAAK,WAAW;AAChE,UAAI,2BAA2B,wBAAwB,CAAC,GAAG;AACzD,qBAAa,cAAAA,QAAO,IAAI,wBAAwB,CAAC,GAAG,OAAO;AAAA,MAC7D;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO,EAAE,YAAY,YAAY;AACnC;AAEO,IAAM,kBAAkB,MAAM;AACnC,QAAM,SAAS;AACf,MAAI,YAAY;AAChB,MAAI,aAAa;AACjB,MAAI;AACF,qBAAa,mCAAa,kBAAkB,KAAK,GAAG,CAAC,WAAW,CAAC,EAC9D,SAAS,EACT,KAAK;AACR,QAAI,cAAAA,QAAO,MAAM,UAAU,GAAG;AAC5B,kBAAY,cAAAA,QAAO,IAAI,YAAY,MAAM;AAAA,IAC3C;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO,EAAE,WAAW,WAAW;AACjC;AAEO,IAAM,mBAAmB,MAAM;AACpC,QAAM,aAAa;AACnB,QAAM,aAAa;AACnB,MAAI,gBAAgB;AACpB,MAAI,gBAAgB;AACpB,MAAI,cAAc;AAClB,MAAI;AACF,sBAAc,mCAAa,kBAAkB,SAAS,GAAG,CAAC,WAAW,CAAC,EACnE,SAAS,EACT,KAAK;AACR,QAAI,cAAAA,QAAO,MAAM,WAAW,GAAG;AAC7B,sBAAgB,cAAAA,QAAO,IAAI,aAAa,UAAU;AAClD,sBAAgB,cAAAA,QAAO,GAAG,aAAa,UAAU;AAAA,IACnD,OAAO;AAIL,YAAM,0BAA0B,gBAAgB,KAAK,WAAW;AAChE,UAAI,yBAAyB;AAC3B,cAAM,qBAAqB,wBAAwB,IAAI;AACvD,YAAI,oBAAoB;AACtB,0BAAgB,cAAAA,QAAO,IAAI,oBAAoB,UAAU;AACzD,0BAAgB,cAAAA,QAAO,GAAG,oBAAoB,UAAU;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,kBAAkB,MAAM;AACnC,MAAI,YAAY;AAChB,MAAI,aAAa;AACjB,MAAI;AACF,qBAAa,mCAAa,kBAAkB,KAAK,GAAG,CAAC,WAAW,CAAC,EAC9D,SAAS,EACT,KAAK;AACR,gBAAY,cAAAA,QAAO,IAAI,YAAY,OAAO;AAAA,EAC5C,QAAQ;AAAA,EAER;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEA,IAAM,WAAW,MAAM;AACrB,MAAI,QAAQ,IAAI,aAAa;AAC3B,WAAO,QAAQ,IAAI;AAAA,EACrB;AACA,MAAI;AAEF,UAAM,iBAAa,mCAAa,kBAAkB,KAAK,GAAG;AAAA,MACxD;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC,EACE,SAAS,EACT,KAAK;AACR,WAAO,eAAe,SAAS,aAAa;AAAA,EAC9C,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEO,IAAM,gBAAgB,CAAC,YAAsB;AAClD,MAAI,CAAC,SAAS;AAGZ,WAAO,QAAQ,QAAQ,IAAI;AAAA,EAC7B;AAEA,SAAO,IAAI,QAAiB,CAAC,YAAY;AACvC,eAAAC,QAAI,OAAO,wBAAwB,CAAC,QAAQ;AAC1C,UAAI;AACJ,UAAI,OAAO,SAAS,QAAQ,SAAS,IAAI;AAGvC,mBAAAA,QAAI,OAAO,IAAI,eAAI,KAAK,EAAE,UAAU,CAAC,aAAa;AAChD,kBAAQ,CAAC,QAAQ;AAAA,QACnB,CAAC;AAAA,MACH,OAAO;AACL,gBAAQ,CAAC,GAAG;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;;;AErSA,IAAAC,aAA2B;AAC3B,oBAAkB;;;ACFlB,IAAAC,aAAe;AACf,IAAAC,aAAe;AACf,IAAAC,eAAiB;AACjB,IAAAC,gBAAkB;;;ACHlB,gBAAe;AACf,kBAAiB;AACjB,gBAAe;AACf,mBAAkB;AAClB,wBAA6D;AAC7D,UAAqB;AAErB,IAAM,UAAM,aAAAC,SAAM,SAAS;AAE3B,IAAM,gCAAgC,CAAC,OAAgB,QAAwB;AAC7E,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAErE,MAAI,sCAAsC,KAAK,OAAO,GAAG;AACvD,WAAO;AAAA,MACL,yCAAyC,GAAG;AAAA,MAC5C;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AAEA,MAAI,sDAAsD,KAAK,OAAO,GAAG;AACvE,WAAO;AAAA,MACL,yCAAyC,GAAG;AAAA,MAC5C;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AAEA,MAAI,4CAA4C,KAAK,OAAO,GAAG;AAC7D,WAAO;AAAA,MACL,yCAAyC,GAAG;AAAA,MAC5C;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AAEA,SAAO;AAAA,IACL,yCAAyC,GAAG;AAAA,IAC5C,YAAO,OAAO;AAAA,IACd;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAKA,IAAM,YAAY,CAAC,QAAgB;AACjC,SAAO,CAAC,iBAAiB,KAAK,GAAG;AACnC;AAYA,IAAM,kBAAkB,oBAAI,IAA2B;AAGvD,IAAM,qBAAqB,oBAAI,IAAqB;AAW7C,IAAM,qBAAqB,OAAO;AAAA,EACvC,MAAM;AAAA,EACN,UAAU;AAAA,EACV,SAAS;AAAA,EACT,SAAS;AAAA,EACT;AAAA,EACA,UAAU;AACZ,MAAiC;AAC/B,QAAM,iBAAiB,YAAAC,QAAK,WAAW,MAAM,IACzC,SACA,YAAAA,QAAK,QAAQ,MAAM;AACvB,QAAM,sBAAsB,UAAAC,QAAG,WAAW,cAAc;AAExD,QAAM,WAAW,iBAAiB,KAAK,GAAG;AAC1C,QAAM,SAAS,WAAW,sBAAsB,GAAG,KAAK;AACxD,QAAM,KAAK,YAAY,OAAO,KAAK,GAAG,MAAM,IAAI,MAAM,EAAE,EAAE,SAAS,QAAQ;AAC3E,MAAI,WAAW,gBAAgB,YAAAD,QAAK,KAAK,UAAAE,QAAG,QAAQ,GAAG,UAAU,OAAO,EAAE;AAE1E,aAAW,YAAAF,QAAK,WAAW,QAAQ,IAAI,WAAW,YAAAA,QAAK,QAAQ,QAAQ;AAEvE,MAAI,oBAAoB,QAAQ;AAGhC,MAAI,mBAAmB,IAAI,EAAE,GAAG;AAC9B;AAAA,MACE,+BAA+B,EAAE;AAAA,IACnC;AAEA,UAAU,SAAK,UAAU,gBAAgB;AAAA,MACvC,WAAW;AAAA,MACX,QAAQ;AAAA,IACV,CAAC;AACD;AAAA,EACF;AAGA,MAAI,gBAAgB,IAAI,EAAE,GAAG;AAC3B;AAAA,MACE,gCAAgC,EAAE;AAAA,IACpC;AACA,UAAM,gBAAgB,IAAI,EAAE;AAC5B,QAAI,gCAAgC,EAAE,kBAAkB;AACxD;AAAA,EACF;AAGA,QAAM,uBAAuB,YAAY;AACvC,QAAI,UAAiB,6BAAU;AAC/B,UAAM,eAA6B;AAAA,MACjC,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,aAAa;AAAA,IACf;AAEA,QAAI;AACF,YAAM,SAAS,UAAAC,QAAG,WAAW,QAAQ;AAErC,UAAI,CAAC,QAAQ;AACX,YAAI,uBAAuB;AAC3B,cAAM,IAAI,MAAM,QAAQ,UAAU,YAAY;AAAA,MAChD;AAEA,gBAAM,6BAAU,QAAQ;AAExB,UAAI,CAAC,SAAS;AACZ,YAAI,uBAAuB;AAC3B,cAAM,IAAI,SAAS,CAAC,MAAM,MAAM,CAAC;AACjC,cAAM,IAAI,KAAK;AAAA,MACjB;AAGA,YAAU,SAAK,UAAU,gBAAgB;AAAA,QACvC,WAAW;AAAA,QACX,QAAQ;AAAA,MACV,CAAC;AAGD,yBAAmB,IAAI,IAAI,IAAI;AAAA,IACjC,SAAS,OAAO;AACd,UAAI,CAAC,uBAAuB,UAAAA,QAAG,WAAW,cAAc,GAAG;AACzD,YAAI;AACF,UAAI,eAAW,cAAc;AAC7B,cAAI,8CAA8C,cAAc;AAAA,QAClE,SAAS,YAAY;AACnB,cAAI,oCAAoC,UAAU;AAAA,QACpD;AAAA,MACF;AAEA,YAAM,IAAI,MAAM,8BAA8B,OAAO,MAAM,CAAC;AAAA,IAC9D,UAAE;AAEA,sBAAgB,OAAO,EAAE;AAAA,IAC3B;AAAA,EACF,GAAG;AAEH,kBAAgB,IAAI,IAAI,mBAAmB;AAG3C,QAAM;AACR;;;ADxKA,IAAME,WAAM,cAAAC,SAAM,WAAW;AAE7B,IAAM,YAAY;AAclB,IAAM,wCAAwC,CAAC,wBAAgC;AAC7E,QAAM,MAAM,IAAI,IAAI,mBAAmB;AACvC,QAAM,gBAAgB,IAAI,aAAa,IAAI,eAAe,MAAM;AAEhE,MAAI,IAAI,aAAa,SAAS;AAE5B,QAAI,WAAW,mBAAmB,IAAI,QAAQ;AAE9C,QAAI,QAAQ,aAAa,WAAW,iBAAiB,KAAK,QAAQ,GAAG;AACnE,iBAAW,SAAS,MAAM,CAAC;AAAA,IAC7B;AACA,UAAM,cAAc,IAAI,aAAa,IAAI,QAAQ,KAAK;AACtD,WAAO;AAAA,MACL,KAAK;AAAA;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,UAAU,IAAI;AAAA,MACd,MAAM;AAAA;AAAA,MACN;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,GAAG,IAAI,QAAQ,KAAK,IAAI,IAAI;AAE3C,QAAM,QAAQ,IAAI,SAAS,MAAM,CAAC,EAAE,MAAM,GAAG;AAC7C,QAAM,CAAC,KAAK,IAAI,IAAI;AACpB,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,MAAM,CAAC,MAAM,QAAQ;AACvB,aAAS,MAAM,CAAC,KAAK;AACrB,aAAS,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG;AAAA,EAClC;AACA,SAAO;AAAA,IACL,KAAK,GAAG,MAAM,IAAI,GAAG,IAAI,IAAI;AAAA,IAC7B;AAAA,IACA;AAAA,IACA,UAAU,IAAI;AAAA,IACd,MAAM,IAAI;AAAA,IACV,UAAU,IAAI;AAAA,IACd;AAAA,EACF;AACF;AAQA,IAAM,sBAAsB,OAAO;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AACF,MAAkC;AAChC,QAAM,WAAW,OAAO,KAAK,GAAG,GAAG,IAAI,MAAM,EAAE,EAAE,SAAS,QAAQ;AAClE,QAAM,mBAAmB,OAAO,KAAK,GAAG,GAAG,IAAI,MAAM,IAAI,MAAM,EAAE,EAAE;AAAA,IACjE;AAAA,EACF;AACA,QAAM,SAAS,aAAAC,QAAK,KAAK,WAAAC,QAAG,QAAQ,GAAG,QAAQ,gBAAgB;AAG/D,MAAI,QAAQ,IAAI,iBAAiB,KAAK;AACpC,WAAO,EAAE,KAAK,QAAQ,OAAO;AAAA,EAC/B;AAEA,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA,QAAQ,UAAU;AAAA,IAClB;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO,EAAE,KAAK,QAAQ,OAAO;AAC/B;AASA,IAAM,+BAA+B,OACnC,wBACgC;AAChC,MAAI;AACJ,MAAI;AACF,aAAS,sCAAsC,mBAAmB;AAAA,EACpE,QAAQ;AAEN,IAAAH,KAAI,gDAAgD,mBAAmB;AACvE,WAAO;AAAA,MACL,KAAK,aAAAE,QAAK;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,EAAE,KAAK,QAAQ,QAAQ,UAAU,UAAU,cAAc,IAAI;AAEnE,MAAI,aAAa,SAAS;AACxB,WAAO,EAAE,KAAK,UAAU,QAAQ,cAAc;AAAA,EAChD;AAEA,QAAM,UAAU,MAAM,oBAAoB,EAAE,KAAK,QAAQ,OAAO,CAAC;AACjE,SAAO,EAAE,KAAK,QAAQ,KAAK,QAAQ,QAAQ,QAAQ,cAAc;AACnE;AAEO,IAAM,iBAAiB,OAC5B,qBACA,OAAO,WACP,gBAAgB,UACb;AACH,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,eAAe;AAAA,EACjB,IAAI,MAAM,6BAA6B,mBAAmB;AAE1D,MACE,SAAS,mBACR,iBAAiB,mCAClB;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ;AACV,WAAO,aAAAA,QAAK,QAAQ,KAAK,QAAQ,IAAI;AAAA,EACvC;AAEA,SAAO,aAAAA,QAAK,QAAQ,KAAK,IAAI;AAC/B;AAOO,IAAM,yBAAyB,OACpC,2BACoB;AACpB,MAAI;AACF,UAAM,EAAE,KAAK,SAAS,GAAG,IAAI,MAAM;AAAA,MACjC;AAAA,IACF;AACA,WAAO,aAAAA,QAAK,QAAQ,KAAK,MAAM;AAAA,EACjC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,IAAM,qBAAqB,OAAO,2BAAmC;AAC1E,QAAM,EAAE,KAAK,SAAS,GAAG,IAAI,MAAM;AAAA,IACjC;AAAA,EACF;AACA,MAAI,kBAAkB,aAAAA,QAAK,QAAQ,KAAK,MAAM;AAG9C,QAAM,8BAA8B,aAAAA,QAAK,QAAQ,iBAAiB,UAAU;AAE5E,SAAO,IAAI,QAAgB,CAAC,YAAY;AACtC,eAAAE,QAAG,KAAK,6BAA6B,CAAC,MAAM,UAAU;AACpD,UAAI,MAAM;AACR,gBAAQ,eAAe;AACvB;AAAA,MACF;AAEA,UAAI,MAAM,YAAY,GAAG;AACvB,0BAAkB;AAAA,MACpB;AAEA,cAAQ,eAAe;AAAA,IACzB,CAAC;AAAA,EACH,CAAC;AACH;;;AD9LA,IAAM,sBAAsB,CAAC;AAAA,EAC3B;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAkC;AAChC,QAAM,qBAAqB,CAAC,OAAO,CAAC,MAClC,OAAO,QAAQ,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,OAAO,MAAM,GAAG,GAAG,IAAI,OAAO,EAAE;AAElE,SAAO;AAAA,IACL;AAAA,IACA,cAAc,mBAAmB,YAAY;AAAA,IAC7C,iBAAiB,mBAAmB,eAAe;AAAA,EACrD;AACF;AAGA,IAAM,kBAAkB,CAACC,UAAiB;AACxC,UAAI,uBAAWA,KAAI,GAAG;AACpB,WAAO,QAAQA,KAAI;AAAA,EACrB;AAEA,QAAM,IAAI,MAAM,QAAQA,KAAI,iBAAiB;AAC/C;AAgBO,IAAM,eAAe,OAAO;AAAA,EACjC,wBAAwB,CAAC;AAAA,EACzB,eAAe,sBAAsB;AAAA,EACrC,GAAG;AACL,MAA2B;AAEzB,QAAM,QAAQ,MAAM,QAAQ;AAAA,IAC1B,sBAAsB,IAAI,OAAO,EAAE,KAAK,oBAAoB,MAAM;AAChE,UAAI;AAEF,cAAMC,YAAW;AAAA,UACf,MAAM,eAAe,qBAAqB,eAAe;AAAA,QAC3D;AACA,eAAOA,UAAS,WAAW,CAAC;AAAA,MAC9B,QAAQ;AACN,eAAO,CAAC;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AAGA,QAAM,kBAAc,cAAAC;AAAA,IAClB;AAAA,MACE,MAAM,OAAO;AAAA,MACb,cAAc,CAAC;AAAA,MACf,iBAAiB,CAAC;AAAA,MAClB,SAAS,CAAC;AAAA,IACZ;AAAA,IACA,GAAG;AAAA,EACL;AAGA,QAAM,aAAa,MAAM,QAAQ;AAAA,IAC/B,sBAAsB;AAAA,MACpB,OAAO,EAAE,KAAK,qBAAqB,cAAc,MAAM;AACrD,YAAI;AAEF,gBAAM,iCAAiC;AAAA,YACrC,MAAM;AAAA,cACJ;AAAA,cACA;AAAA,cACA,uBAAuB;AAAA,YACzB;AAAA,UACF;AACA,iBAAO;AAAA,QACT,QAAQ;AACN,iBAAO,CAAC;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,gBAAgB,MAAM,QAAQ;AAAA,IAClC,sBAAsB,IAAI,OAAO,EAAE,KAAK,oBAAoB,MAAM;AAChE,UAAI;AAEF,cAAM,oCAAoC;AAAA,UACxC,MAAM,eAAe,mBAAmB;AAAA,QAC1C;AACA,eAAO,kCAAkC,aAAa,MAAM;AAAA,MAC9D,QAAQ;AACN,eAAO,CAAC;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AAGA,QAAM,kBAAc,cAAAA,SAAM,aAAa,GAAG,YAAY,GAAG,aAAa;AAGtE,SAAO,oBAAoB;AAAA,IACzB,GAAG;AAAA,IACH,MAAM,OAAO;AAAA,EACf,CAAC;AACH;;;AG/HA,IAAAC,aAAe;AACf,IAAAC,qBAAe;AACf,sBAAyB;AACzB,IAAAC,eAAwB;AAExB,kBAA0B;AAC1B,IAAAC,iBAAmB;AAEnB,IAAM,EAAE,SAAS,IAAI,eAAAC;AAErB,IAAM,qBAAiB,uBAAU,WAAAC,QAAG,SAAS;AAC7C,IAAM,oBAAgB,uBAAU,WAAAA,QAAG,QAAQ;AAK3C,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;AAEzB,IAAM,mBAAmB,CAAC,WACxB,WAAW,MAAM,KAAK,SAAS;AAEjC,IAAM,gBAAgB,CAAC,YAAoB;AACzC,MAAI,CAAC,WAAAA,QAAG,WAAW,OAAO,GAAG;AAC3B,eAAAA,QAAG,UAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,EAC3C;AACF;AAEA,IAAM,kBAAkB,CAACC,QAAO,OAAO;AACrC,QAAM,YAAY,IAAI,SACpB,KAAK,KAAK,CAAC,QAAQA,MAAK,SAAS,GAAG,CAAC;AAEvC,MAAI,UAAU,SAAS,GAAG;AACxB,WAAO;AAAA,EACT;AACA,MAAI,UAAU,oBAAoB,kBAAkB,GAAG;AACrD,WAAO;AAAA,EACT;AACA,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAwBA,IAAM,mBAAmB,OACvB,eACG;AACH,QAAM,kBAAkB,WAAW,IAAI,OAAO,cAAc;AAC1D,QAAI;AACF,wBAAc,sBAAQ,UAAU,IAAI,CAAC;AACrC,YAAM,cAAc,UAAU,KAAK,UAAU,IAAI;AAEjD,UAAI;AACF,cAAM,UAAU,UAAM,uBAAU,WAAAD,QAAG,IAAI,EAAE,UAAU,GAAG;AACtD,kBAAM,uBAAU,WAAAA,QAAG,KAAK,EAAE,UAAU,MAAM,QAAQ,IAAI;AAAA,MACxD,QAAQ;AAAA,MAER;AACA,UAAI,UAAU,SAAS;AACrB,gBAAQ;AAAA,UACN,mBAAAE,QAAG;AAAA,YACD,UAAU,UAAU,IAAI,WAAW,UAAU,GAAG;AAAA,UAClD;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ;AAAA,QACN,mBAAAA,QAAG,IAAI,oBAAoB,UAAU,GAAG,OAAO,UAAU,IAAI,EAAE;AAAA,MACjE;AACA,UAAI,UAAU,SAAS;AACrB,gBAAQ,IAAI,mBAAAA,QAAG,IAAI,OAAO,GAAG,CAAC,CAAC;AAAA,MACjC;AACA,YAAM;AAAA,IACR;AAAA,EACF,CAAC;AAED,QAAM,QAAQ,IAAI,eAAe;AACnC;AAGA,IAAM,oBAAoB,OACxB,eAOG;AACH,QAAM,kBAAkB,WAAW,IAAI,OAAO,cAAc;AAC1D,QAAI;AACF,wBAAc,sBAAQ,UAAU,IAAI,CAAC;AACrC,YAAM,eAAe,UAAU,MAAM,UAAU,SAAS;AAAA,QACtD,MAAM,UAAU;AAAA,QAChB,MAAM,UAAU;AAAA,MAClB,CAAC;AACD,UAAI,UAAU,SAAS;AACrB,gBAAQ,IAAI,mBAAAA,QAAG,MAAM,UAAU,UAAU,IAAI,gBAAgB,CAAC;AAAA,MAChE;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,IAAI,mBAAAA,QAAG,IAAI,qBAAqB,UAAU,IAAI,EAAE,CAAC;AACzD,UAAI,UAAU,SAAS;AACrB,gBAAQ,IAAI,mBAAAA,QAAG,IAAI,OAAO,GAAG,CAAC,CAAC;AAAA,MACjC;AACA,YAAM;AAAA,IACR;AAAA,EACF,CAAC;AAED,QAAM,QAAQ,IAAI,eAAe;AACnC;AAGA,IAAM,qBAAqB,OACzB,eACG;AACH,QAAM,kBAAkB,WAAW,IAAI,OAAO,cAAc;AAC1D,QAAI;AACF,YAAM,UAAU,UAAM,uBAAU,WAAAF,QAAG,QAAQ,EAAE,UAAU,KAAK,MAAM;AAClE,YAAM,YAAY,UAAM,uBAAU,WAAAA,QAAG,IAAI,EAAE,UAAU,GAAG,GAAG;AAC3D,YAAM,kBAAkB;AAAA,QACtB;AAAA,UACE,MAAM,UAAU;AAAA,UAChB;AAAA,UACA,MAAM;AAAA,UACN,SAAS,UAAU;AAAA,UACnB,MAAM;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,cAAQ;AAAA,QACN,mBAAAE,QAAG,IAAI,sBAAsB,UAAU,GAAG,OAAO,UAAU,IAAI,EAAE;AAAA,MACnE;AACA,UAAI,UAAU,SAAS;AACrB,gBAAQ,IAAI,mBAAAA,QAAG,IAAI,OAAO,GAAG,CAAC,CAAC;AAAA,MACjC;AACA,YAAM;AAAA,IACR;AAAA,EACF,CAAC;AAED,QAAM,QAAQ,IAAI,eAAe;AACnC;AAEA,IAAM,aACJ,CAAC,EAAE,MAAM,aAAa,SAAS,OAAO,MACtC,OAAO,EAAE,MAAAD,MAAK,MAAM;AAClB,QAAM,aAAa,CAAC;AACpB,MAAI;AACF,UAAM,UAAUA,MACb,QAAQ,4BAA4B,EAAE,EACtC,QAAQ,kBAAkB,iBAAiB,MAAM,CAAC;AAErD,eAAW,KAAK;AAAA,MACd,KAAK,GAAG,WAAW,IAAIA,KAAI;AAAA,MAC3B,MAAM,GAAG,IAAI,IAAI,OAAO;AAAA,MACxB;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,QAAI,SAAS;AACX,cAAQ,IAAI,GAAG;AAAA,IACjB;AACA,UAAM;AAAA,EACR;AAEA,QAAM,iBAAiB,UAAU;AACnC;AAEF,IAAM,eACJ,CAAC,EAAE,MAAM,aAAa,SAAS,OAAO,MACtC,OAAO,EAAE,MAAAA,MAAK,MAAM;AAClB,QAAM,aAAa,CAAC;AACpB,MAAI;AACF,UAAM,UAAUA,MACb,QAAQ,YAAY,EAAE,EACtB,QAAQ,4BAA4B,EAAE,EACtC,QAAQ,kBAAkB,iBAAiB,MAAM,CAAC;AAErD,eAAW,KAAK;AAAA,MACd,KAAK,GAAG,WAAW,IAAIA,KAAI;AAAA,MAC3B,MAAM,GAAG,IAAI,IAAI,OAAO;AAAA,MACxB;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,QAAI,SAAS;AACX,cAAQ,IAAI,GAAG;AAAA,IACjB;AACA,UAAM;AAAA,EACR;AAEA,QAAM,mBAAmB,UAAU;AACrC;AAEF,IAAM,iBACJ,CAAC;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MACA,OAAO,EAAE,MAAAA,MAAK,MAAM;AAClB,QAAM,aAAa,CAAC;AACpB,MAAI;AACF,UAAM,OAAO,KAAK,SAAS,QAAQ,IAAI,OAAO;AAC9C,UAAM,WAAW,GAAG,WAAW,IAAIA,KAAI;AACvC,UAAM,OAAO,UAAM,uBAAU,WAAAD,QAAG,QAAQ,EAAE,UAAU,MAAM;AAC1D,UAAM,YAAY,UAAM,uBAAU,WAAAA,QAAG,IAAI,EAAE,QAAQ,GAAG;AACtD,UAAM,UAAU,SAAS,IAAI;AAC7B,UAAM,UAAUC,MACb,QAAQ,cAAc,EAAE,EACxB,QAAQ,YAAY,EAAE,EACtB,QAAQ,4BAA4B,EAAE,EACtC,QAAQ,kBAAkB,iBAAiB,MAAM,CAAC;AAErD,eAAW,KAAK;AAAA,MACd,MAAM,GAAG,IAAI,IAAI,OAAO;AAAA,MACxB,SAAS,QAAQ;AAAA,QACf,aAAa;AAAA,QACb,QAAQ,UAAU;AAAA,QAClB;AAAA,QACA;AAAA,QACA,GAAG;AAAA,MACL,CAAC;AAAA,MACD;AAAA,MACA;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,QAAI,SAAS;AACX,cAAQ,IAAI,GAAG;AAAA,IACjB;AACA,UAAM;AAAA,EACR;AAEA,QAAM,kBAAkB,UAAU;AACpC;AAEF,IAAM,aACJ,CAAC;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA,GAAG;AACL,MACA,OAAO,EAAE,MAAAA,MAAK,MAAM;AAClB,MAAI;AACF,UAAM,OAAO,gBAAgBA,KAAI;AAEjC,UAAM,UAAU;AAAA,MACd,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,cAAc;AAAA;AAAA,MAEd,gBAAgB;AAAA,IAClB;AAEA,UAAM,QAAQ,IAAI,EAAE;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,CAAC,CAAC;AAAA,MACX,SAAS,CAAC,CAAC;AAAA,MACX,QAAQ,CAAC,CAAC;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,CAAC,EAAE;AAAA,MACD,MAAAA;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,QAAI,SAAS;AACX,cAAQ,IAAI,GAAG;AAAA,IACjB;AACA,UAAM;AAAA,EACR;AACF;AAoBK,IAAM,YAAY,OAAO;AAAA,EAC9B;AAAA,EACA,wBAAwB,CAAC;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AAAA,EACV,SAAS;AAAA,EACT,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAwB;AACtB,MAAI;AACF,UAAM,aAAa,CAAC;AACpB,qBAAiB,EAAE,KAAK,uBAAuB,KAAK,uBAAuB;AACzE,YAAM,cAAc,MAAM,mBAAmB,sBAAsB;AACnE,UAAI,SAAS;AACX,YAAI;AACF,gBAAM,OAAO,WAAAD,QAAG,WAAW,WAAW,IAClC,WAAAA,QAAG,SAAS,WAAW,IACvB;AACJ,kBAAQ;AAAA,YACN,mBAAAE,QAAG;AAAA,cACD,gCAAgC,WAAW,WAAW,CAAC,CAAC,IAAI,WAAW,MAAM,cAAc,CAAC;AAAA,YAC9F;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAEA,UACE,WAAAF,QAAG,WAAW,WAAW,KACzB,WAAAA,QAAG,SAAS,WAAW,EAAE,YAAY,GACrC;AAGA,YAAI,aAAa;AAEjB,cAAM,YAAY;AAAA,UAChB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,cAAM,cAAc,UAChB,CAAC,cAAc,eAAe,YAAY,IAC1C,UACE,CAAC,cAAc,eAAe,YAAY,IAC1C,SACE,CAAC,eAAe,aAAa,IAC7B,CAAC,eAAe,eAAe,YAAY;AACnD,cAAM,aAAa,CAAC,MAClB,CAAC,GAAG,WAAW,GAAG,WAAW,EAAE,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,CAAC;AAE1D,yBAAiB,aAAS,0BAAS,aAAa;AAAA,UAC9C,MAAM;AAAA,UACN,YAAY;AAAA,QACd,CAAC,GAAG;AACF,cAAI,WAAW,MAAM,IAAI,EAAG;AAC5B,cAAI,MAAM,KAAK,WAAW,UAAU,EAAG;AACvC,cAAI,WAAW,YAAY;AACzB,oBAAQ,IAAI,mBAAAE,QAAG,IAAI,gCAAgC,MAAM,IAAI,EAAE,CAAC;AAChE,yBAAa;AAAA,UACf;AACA,qBAAW,KAAK;AAAA,YACd;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,GAAG;AAAA,UACL,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,QAAI,SAAS;AACX,cAAQ;AAAA,QACN,mBAAAA,QAAG;AAAA,UACD,kBAAkB,WAAW,MAAM,yBAAyB,sBAAsB,MAAM;AAAA,QAC1F;AAAA,MACF;AACA,UAAI,WAAW,WAAW,GAAG;AAC3B,gBAAQ;AAAA,UACN,mBAAAA,QAAG;AAAA,YACD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAQ;AAAA,MACZ,WAAW,IAAI,CAAC,cAAc,WAAW,SAAS,EAAE,UAAU,KAAK,CAAC;AAAA,IACtE;AAAA,EACF,SAAS,KAAK;AACZ,QAAI,SAAS;AACX,cAAQ,IAAI,GAAG;AAAA,IACjB;AACA,UAAM;AAAA,EACR;AACF;;;AN1bA,IAAM,EAAE,QAAQ,IAAI,eAAAC;AAuBpB,IAAM,UAAU,OACd,MACA,UAAU,OACV,UAAU,OACV,SAAS,OACT,eAAyB,CAAC,GAC1B,UAAU,OACV,WAAW,MACX,oBAAoB,UACjB;AACH,MAAI;AACJ,MAAI;AAEJ,MAAI,SAAS;AACX,cAAU;AACV,WAAO,CAAC,OAAO,+BAA+B;AAC9C,QAAI,CAAC,UAAU;AACb,WAAK,KAAK,WAAW;AAAA,IACvB;AACA,QAAI,mBAAmB;AACrB,WAAK,KAAK,OAAO;AAAA,IACnB;AACA,SAAK,KAAK,GAAG,YAAY;AACzB,SAAK,KAAK,OAAO;AACjB,SAAK,KAAK,IAAI;AAEd,QAAI,CAAC,UAAU;AACb,cAAQ,IAAI,mBAAAC,QAAG,OAAO,2BAA2B,CAAC;AAClD,cAAQ,IAAI,mBAAAA,QAAG,OAAO,uCAAuC,CAAC;AAC9D,cAAQ,IAAI;AAAA,IACd;AAAA,EACF,WAAW,SAAS;AAClB,cAAU;AACV,WAAO,CAAC,WAAW,sBAAsB,cAAc,OAAO;AAC9D,QAAI,mBAAmB;AACrB,WAAK,KAAK,YAAY;AAAA,IACxB,OAAO;AACL,WAAK,KAAK,QAAQ;AAAA,IACpB;AAEA,SAAK,KAAK,GAAG,YAAY;AAAA,EAC3B,WAAW,QAAQ;AACjB,cAAU;AACV,QAAI,aAAa,SAAS,GAAG;AAC3B,aAAO,CAAC,KAAK;AACb,UAAI,mBAAmB;AACrB,aAAK,KAAK,OAAO;AAAA,MACnB;AACA,WAAK,KAAK,GAAG,YAAY;AAAA,IAC3B,OAAO;AACL,aAAO,CAAC,SAAS;AAAA,IACnB;AAAA,EACF,OAAO;AACL,cAAU;AACV,WAAO,CAAC,WAAW,cAAc,OAAO;AACxC,QAAI,mBAAmB;AACrB,WAAK,KAAK,YAAY;AAAA,IACxB,OAAO;AACL,WAAK,KAAK,QAAQ;AAAA,IACpB;AAEA,SAAK,KAAK,GAAG,YAAY;AAAA,EAC3B;AAEA,MAAI,SAAS;AACX,SAAK,KAAK,WAAW;AAAA,EACvB;AAEA,MAAI;AACF,4CAAa,kBAAkB,OAAO,GAAG,MAAM;AAAA,MAC7C,KAAK;AAAA,MACL,OAAO;AAAA,IACT,CAAC;AAAA,EACH,QAAQ;AACN,UAAM,IAAI,MAAM,GAAG,OAAO,IAAI,KAAK,KAAK,GAAG,CAAC,EAAE;AAAA,EAChD;AACF;AAoBA,IAAM,yBAAyB,OAC7B,MACA,SACA,OAAiB,CAAC,GAClB,iBAAiB,qCACjB,eAAe,wBACZ;AACH,QAAM,CAAC,YAAY,GAAG,QAAQ,IAC5B,YAAY,YACR,CAAC,OAAO,KAAK,IACb,YAAY,aACV,CAAC,QAAQ,KAAK,IACd,YAAY,YACV,CAAC,OAAO,KAAK,IACb,CAAC,OAAO;AAElB,MAAI;AACF,4CAAa,kBAAkB,UAAU,GAAG,CAAC,GAAG,UAAU,GAAG,IAAI,GAAG;AAAA,MAClE,KAAK;AAAA,MACL,OAAO;AAAA,IACT,CAAC;AACD,YAAQ,IAAI,mBAAAA,QAAG,MAAM,cAAc,CAAC;AAAA,EACtC,QAAQ;AACN,YAAQ,IAAI;AACZ,YAAQ,IAAI,mBAAAA,QAAG,IAAI,YAAY,CAAC;AAChC,YAAQ,IAAI;AAAA,EACd;AACF;AAEA,SAAS,sBAAsB,kBAA0B;AAUvD,QAAM,YAAY,iBAAiB,YAAY,GAAG;AAElD,MAAI,cAAc,IAAI;AAEpB,UAAM,OAAO,iBAAiB,UAAU,GAAG,SAAS;AACpD,UAAM,UAAU,iBAAiB,UAAU,YAAY,CAAC;AAExD,WAAO,EAAE,MAAM,QAAQ;AAAA,EACzB,OAAO;AAEL,WAAO,EAAE,MAAM,kBAAkB,SAAS,GAAG;AAAA,EAC/C;AACF;AAEA,IAAM,MAAM,OAAO;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,SAAS;AAAA,EACT,wBAAwB,CAAC;AAAA,EACzB,eAAe,CAAC;AAAA,EAChB,kBAAkB,CAAC;AAAA,EACnB,sBAAsB;AAAA,EACtB,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,GAAG;AACL,MAAkB;AAChB,QAAM,WAAW,UAAU,MAAM,cAAc,OAAO,IAAI;AAE1D,MAAI,QAAQ,qBAAqB,GAAG;AAClC,YAAQ,IAAI;AACZ,YAAQ;AAAA,MACN,mBAAAA,QAAG;AAAA,QACD;AAAA,MACF;AAAA,IACF;AACA,YAAQ,IAAI;AACZ,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI;AACZ,UAAQ,IAAI,4BAA4B,OAAO,KAAK;AAEpD,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,CAAC;AAED,UAAQ,IAAI;AACZ,UAAQ,IAAI,mBAAAA,QAAG,MAAM,kCAAkC,CAAC;AACxD,UAAQ,IAAI;AAEZ,MAAI,qBAAqB;AACvB,YAAQ;AAAA,MACN,mBAAAA,QAAG,MAAM,2DAA2D;AAAA,IACtE;AACA,YAAQ,IAAI,mBAAAA,QAAG,MAAM,4BAA4B,CAAC;AAClD,YAAQ,IAAI;AAEZ,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,gBAAgB,SAAS,GAAG;AAC9B,cAAQ,IAAI;AACZ,cAAQ,IAAI,mBAAAA,QAAG,MAAM,+BAA+B,CAAC;AACrD,cAAQ,IAAI;AAEZ,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,OAAO;AACL,YAAQ,IAAI,mBAAAA,QAAG,OAAO,4BAA4B,CAAC;AACnD,UAAMC,eAAc,KAAK;AAAA,MACvB,WAAAC,QAAG,aAAa,GAAG,IAAI,iBAAiB,MAAM;AAAA,IAChD;AAEA,UAAM,qBAAqB,CAAC,SAAmB;AAC7C,aAAO,KAAK;AAAA,QACV,CAAC,KAAK,SAAS;AACb,gBAAM,UAAU;AAChB,cAAI,4BAA4B,KAAK,IAAI,GAAG;AAC1C,kBAAM,EAAE,MAAM,QAAQ,IAAI,sBAAsB,IAAI;AACpD,oBAAQ,IAAI,IAAI;AAAA,UAClB,OAAO;AACL,oBAAQ,IAAI,IAAI;AAAA,UAClB;AACA,iBAAO;AAAA,QACT;AAAA,QACA,CAAC;AAAA,MACH;AAAA,IACF;AAEA,IAAAD,aAAY,eAAe,mBAAmB,YAAY;AAC1D,IAAAA,aAAY,kBAAkB,mBAAmB,eAAe;AAEhE,eAAAC,QAAG;AAAA,MACD,aAAAC,QAAK,KAAK,MAAM,cAAc;AAAA,MAC9B,KAAK,UAAUF,cAAa,MAAM,CAAC,IAAI,WAAAG,QAAG;AAAA,IAC5C;AAEA,YAAQ,IAAI;AACZ,YAAQ,IAAI,mBAAAJ,QAAG,MAAM,oCAAoC,CAAC;AAC1D,YAAQ,IAAI,mBAAAA,QAAG,OAAO,OAAO,mBAAAA,QAAG,KAAK,cAAc,CAAC,cAAc,CAAC;AAAA,EACrE;AAEA,UAAQ,IAAI;AACZ,UAAQ,IAAI,gCAAgC;AAE5C,MAAI;AACF,UAAM,EAAE,WAAAK,WAAU,IAAK,MAAM,OAAO,YAAY;AAMhD,UAAM,MAAMA,WAAU,IAAI;AAC1B,UAAM,IAAI,KAAK;AACf,YAAQ,IAAI,mBAAAL,QAAG,MAAM,0CAA0C,CAAC;AAAA,EAClE,QAAQ;AACN,YAAQ,IAAI;AACZ,YAAQ;AAAA,MACN,mBAAAA,QAAG;AAAA,QACD;AAAA,MACF;AAAA,IACF;AACA,YAAQ,IAAI;AAAA,EACd;AAEA,MAAI,uBAAuB,UAAU;AACnC,UAAMC,eAAc,KAAK;AAAA,MACvB,WAAAC,QAAG,aAAa,GAAG,IAAI,iBAAiB,MAAM;AAAA,IAChD;AAEA,UAAM,YAAY,YAAY;AAC5B,UAAI;AACF,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA,CAAC,QAAQ;AAAA,UACT;AAAA,UACA,gCAAgC,UAAU;AAAA,QAC5C;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,UAAM,aAAa,YAAY;AAC7B,UAAI;AACF,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA,CAAC,UAAU;AAAA,UACX;AAAA,UACA,uCAAuC,UAAU;AAAA,QACnD;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,QAAID,aAAY,WAAWA,aAAY,QAAQ,QAAQ,GAAG;AACxD,YAAM,UAAU;AAAA,IAClB;AACA,QAAIA,aAAY,WAAWA,aAAY,QAAQ,UAAU,GAAG;AAC1D,YAAM,WAAW;AAAA,IACnB;AAAA,EACF;AAGA,UAAQ,IAAI;AACZ,UAAQ,IAAI,mBAAAD,QAAG,MAAM,kCAAkC,UAAU,GAAG,CAAC;AACrE,UAAQ,IAAI;AACZ,UAAQ,IAAI,gBAAgB;AAC5B,UAAQ,IAAI;AACZ,UAAQ,IAAI,mBAAAA,QAAG,KAAK,QAAQ,OAAO,EAAE,CAAC;AACtC,UAAQ,IAAI,mBAAAA,QAAG,KAAK,KAAK,cAAc,EAAE,CAAC;AAE1C,QAAM,cAAc,KAAK;AAAA,IACvB,WAAAE,QAAG,aAAa,GAAG,IAAI,iBAAiB,MAAM;AAAA,EAChD;AAEA,QAAM,iBAAiB,CAAC,cAAc,eAAe,OAAO,OAAO;AAEnE,aAAW,UAAU,gBAAgB;AACnC,QAAI,YAAY,WAAW,YAAY,QAAQ,MAAM,GAAG;AACtD,cAAQ,IAAI,mBAAAF,QAAG,KAAK,KAAK,UAAU,IAAI,MAAM,EAAE,CAAC;AAChD;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,IAAI;AACZ,UAAQ,IAAI,mBAAAA,QAAG,MAAM,gBAAgB,CAAC;AACxC;AAaO,IAAM,YAAY,OAAO;AAAA,EAC9B;AAAA,EACA,UAAU;AAAA,EACV,wBAAwB,CAAC;AAAA,EACzB,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,GAAG;AACL,MAAwB;AACtB,QAAM,OAAO,aAAAG,QAAK,QAAQ,IAAI;AAC9B,QAAM,UAAU,aAAAA,QAAK,SAAS,IAAI;AAElC,aAAAD,QAAG,UAAU,MAAM;AAAA,IACjB,WAAW;AAAA,EACb,CAAC;AAED,UAAQ,IAAI,8BAA8B,mBAAAF,QAAG,MAAM,IAAI,CAAC,GAAG;AAC3D,UAAQ,IAAI;AAEZ,QAAM,UAAU,cAAc,mBAAmB,UAAU,cAAc;AACzE,QAAM,UAAU,cAAc,mBAAmB,UAAU,cAAc;AACzE,QAAM,SAAS,cAAc,mBAAmB,SAAS,aAAa;AACtE,QAAM,aAAa,UACf,SACA,UACE,aACA,SACE,YACA;AACR,QAAM,iBAAiB,UACnB,SACA,UACE,iBACA,SACE,gBACA;AAER,QAAM,EAAE,aAAa,cAAc,gBAAgB,IAAI,MAAM,aAAa;AAAA,IACxE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,aAAAE,QAAG;AAAA,IACD,aAAAC,QAAK,KAAK,MAAM,cAAc;AAAA,IAC9B,KAAK,UAAU,aAAa,MAAM,CAAC,IAAI,WAAAC,QAAG;AAAA,EAC5C;AAEA,QAAM,oBAAoB,QAAQ,IAAI;AACtC,UAAQ,MAAM,IAAI;AAClB,MAAI,CAAC,WAAW,CAAC,UAAU,CAAC,uBAAuB,GAAG;AACpD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,CAAC,eAAAE,QAAO,UAAU,QAAQ,SAAS,UAAU,GAAG;AAClD,YAAQ;AAAA,MACN,mBAAAN,QAAG;AAAA,QACD,sBAAsB,QAAQ,OAAO;AAAA;AAAA;AAAA;AAAA,MAEvC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,WAAW,CAAC,QAAQ;AACvB,UAAM,UAAU,gBAAgB;AAChC,QAAI,CAAC,QAAQ,WAAW;AACtB,UAAI,QAAQ,YAAY;AACtB,gBAAQ;AAAA,UACN,mBAAAA,QAAG;AAAA,YACD,qBAAqB,QAAQ,UAAU;AAAA;AAAA;AAAA;AAAA,UAEzC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS;AACX,QAAI,0BAA0B;AAC9B,QAAI;AACF,oCACE,oCAAa,kBAAkB,SAAS,GAAG;AAAA,QACzC;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC,EACE,SAAS,EACT,KAAK,MAAM;AAAA,IAClB,QAAQ;AAAA,IAER;AACA,QAAI,OAAkC;AACpC,iBAAAE,QAAG;AAAA,QACD;AAAA,QACA,aAAAC,QAAK,KAAK,MAAM,WAAW;AAAA,QAC3B,EAAE,OAAO,KAAK;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,SAAO,IAAI;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,CAAC;AACH;;;AOjgBA,IAAAI,aAAe;AACf,IAAAC,eAAiB;AA6BV,IAAM,wBAAwB,OACnC,gBAC8B;AAC9B,MAAI;AACF,UAAM,WAAW,MAAM,uBAAuB,WAAW;AACzD,QAAI,CAAC,SAAU,QAAO;AAEtB,UAAM,aAAa,aAAAC,QAAK,KAAK,UAAU,iBAAiB;AACxD,QAAI,CAAC,WAAAC,QAAG,WAAW,UAAU,EAAG,QAAO;AAEvC,UAAM,UAAU,WAAAA,QAAG,aAAa,YAAY,MAAM;AAClD,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AR5BO,IAAM,mBAAmB,CAC9B,iBACA,gBACG;AACH,MAAI,CAAC,eAAAC,QAAO,UAAU,QAAQ,SAAS,eAAe,GAAG;AACvD,YAAQ;AAAA,MACN,mBAAAC,QAAG;AAAA,QACD,wBAAwB,QAAQ,OAAO;AAAA,EAClC,WAAW,kBAAkB,eAAe;AAAA;AAAA,MAEnD;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEO,IAAM,wBAAwB,OAAO,gBAAwB;AAClE,MAAI;AACF,UAAM,WAAW,MAAM;AAAA,MACrB,wCAAwC,WAAW;AAAA,IACrD;AACA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC3C;AACA,UAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,QAAI,QAAQ,OAAO,SAAS,YAAY,YAAY,MAAM;AACxD,aAAO,OAAQ,KAAiC,QAAQ,CAAC;AAAA,IAC3D;AACA,WAAO;AAAA,EACT,QAAQ;AACN,QAAI;AACF,iBAAO,oCAAa,kBAAkB,KAAK,GAAG;AAAA,QAC5C;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC,EACE,SAAS,EACT,KAAK;AAAA,IACV,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,eAAe,YAAY;AACtC,UAAQ,IAAI,mBAAAA,QAAG,KAAK,qBAAqB,CAAC;AAC1C,QAAM,OAAO,MAAM,eAAAC,QAAQ;AAAA,IACzB;AAAA,MACE,QAAQ,CAAC,MAAM,OAAO,UAAU,OAAO;AAAA,MACvC,UAAU,CAAC,QAAQ,OAAO,QAAQ,QAAQ,OAAO,UAAU;AAAA,MAC3D,UAAU,CAAC,UAAU,QAAQ,qBAAqB,WAAW,QAAQ;AAAA,IACvE;AAAA,IACA;AAAA,MACE,YAAY;AAAA,MACZ,cAAc;AAAA,IAChB;AAAA,EACF;AACA,UAAQ,IAAI,IAAI;AAChB,UAAQ,KAAK,CAAC;AAChB;AAgBO,IAAM,gBAAgB,OAC3B,aACA,SACA,qBACG;AACH,MAAI,QAAQ,MAAM;AAChB,UAAM,aAAa;AAAA,EACrB;AAEA,MAAI,OAAO,QAAQ,gBAAgB,aAAa;AAC9C,YAAQ,MAAM,uCAAuC;AACrD,YAAQ,IAAI,KAAK,mBAAAD,QAAG,KAAK,WAAW,CAAC,IAAI,mBAAAA,QAAG,MAAM,qBAAqB,CAAC,EAAE;AAC1E,YAAQ,IAAI;AACZ,YAAQ,IAAI,cAAc;AAC1B,YAAQ,IAAI,KAAK,mBAAAA,QAAG,KAAK,WAAW,CAAC,IAAI,mBAAAA,QAAG,MAAM,QAAQ,CAAC,EAAE;AAC7D,YAAQ,IAAI;AACZ,YAAQ,IAAI,OAAO,mBAAAA,QAAG,KAAK,GAAG,WAAW,SAAS,CAAC,sBAAsB;AACzE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,aAAa,MAAM,iBAAiB,OAAO;AACjD,QAAM,UAAU;AAAA,IACd,GAAG;AAAA,IACH,MAAM,WAAW;AAAA,IACjB,qBAAqB,QAAQ,WAAW;AAAA,EAC1C,CAAC;AACH;","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 path3 from "path";
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 path2 from "path";
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 path from "path";
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 = path.isAbsolute(target) ? target : path.resolve(target);
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 || path.join(os.homedir(), ".cache", "cna", id);
308
- cacheDir = path.isAbsolute(cacheDir) ? cacheDir : path.resolve(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 = typeof __dirname !== "undefined" ? __dirname : path2.dirname(fileURLToPath(import.meta.url));
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 = path2.join(os2.homedir(), ".cna", targetWithSubdir);
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: path2.resolve(
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 path2.resolve(dir, subdir, name);
477
+ return path3.resolve(dir, subdir, name);
472
478
  }
473
- return path2.resolve(dir, name);
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 path2.resolve(dir, subdir);
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 = path2.resolve(dir, subdir);
490
- const templateDirPathWithTemplate = path2.resolve(templateDirPath, "template");
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 = (path5) => {
519
- if (existsSync(path5)) {
520
- return __require(path5);
524
+ var requireIfExists = (path6) => {
525
+ if (existsSync(path6)) {
526
+ return __require(path6);
521
527
  }
522
- throw new Error(`File ${path5} does not exist`);
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 = (path5 = "") => {
606
- const matchExts = (...exts) => exts.find((ext) => path5.endsWith(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: path5 }) => {
700
+ var copyLoader = ({ root, templateDir, verbose, srcDir }) => async ({ path: path6 }) => {
695
701
  const operations = [];
696
702
  try {
697
- const newPath = path5.replace(/.if-(npm|yarn|pnpm|bun)$/, "").replace(SRC_PATH_PATTERN, getSrcDirPattern(srcDir));
703
+ const newPath = path6.replace(/.if-(npm|yarn|pnpm|bun)$/, "").replace(SRC_PATH_PATTERN, getSrcDirPattern(srcDir));
698
704
  operations.push({
699
- src: `${templateDir}/${path5}`,
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: path5 }) => {
717
+ var appendLoader = ({ root, templateDir, verbose, srcDir }) => async ({ path: path6 }) => {
712
718
  const operations = [];
713
719
  try {
714
- const newPath = path5.replace(/.append$/, "").replace(/.if-(npm|yarn|pnpm|bun)$/, "").replace(SRC_PATH_PATTERN, getSrcDirPattern(srcDir));
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}/${path5}`,
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: path5 }) => {
744
+ }) => async ({ path: path6 }) => {
739
745
  const operations = [];
740
746
  try {
741
747
  const flag = mode.includes("append") ? "a+" : "w";
742
- const filePath = `${templateDir}/${path5}`;
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 = path5.replace(/.template$/, "").replace(/.append$/, "").replace(/.if-(npm|yarn|pnpm|bun)$/, "").replace(SRC_PATH_PATTERN, getSrcDirPattern(srcDir));
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: path5 }) => {
787
+ }) => async ({ path: path6 }) => {
782
788
  try {
783
- const mode = getModeFromPath(path5);
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: path5
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
- path3.join(root, "package.json"),
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 = path3.resolve(name);
1183
- const appName = path3.basename(root);
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
- path3.join(root, "package.json"),
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
- path3.join(root, "yarn.lock"),
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 path4 from "path";
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 = path4.join(basePath, "cna.config.json");
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.1",
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
  },