@create-node-app/core 0.6.0 → 0.6.1
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 +148 -0
- package/dist/index.cjs +158 -42
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +160 -45
- package/dist/index.js.map +1 -1
- package/package.json +9 -14
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../index.ts","../installer.ts","../helpers.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 { execSync } from \"child_process\";\nimport type { TemplateOrExtension } from \"./loaders.js\";\nexport type { TemplateOrExtension } from \"./loaders.js\";\nimport { createApp } from \"./installer.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 execSync(`npm view ${packageName} version`).toString().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\", \"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 _ from \"underscore\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport pc from \"picocolors\";\nimport os from \"os\";\nimport semver from \"semver\";\nimport { execSync } 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} from \"./helpers.js\";\nimport { loadPackages } from \"./package.js\";\nimport type { TemplateOrExtension } from \"./loaders.js\";\nimport { loadFiles } from \"./loaders.js\";\n\nconst install = async (\n root: string,\n useYarn = false,\n usePnpm = 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 {\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 execSync(`${command} ${args.join(\" \")}`, {\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 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 try {\n execSync(`${command} ${args.join(\" \")}`, {\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 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 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 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 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 runCommand = useYarn ? \"yarn\" : usePnpm ? \"pnpm run\" : \"npm run\";\n const installCommand = useYarn\n ? \"yarn\"\n : usePnpm\n ? \"pnpm install\"\n : \"npm install\";\n\n const { packageJson, dependencies, devDependencies } = await loadPackages({\n templatesOrExtensions,\n appName,\n usePnpm,\n useYarn,\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 && !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) {\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 execSync(\"yarnpkg config get registry\").toString().trim() ===\n \"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 templatesOrExtensions,\n dependencies,\n devDependencies,\n installDependencies,\n runCommand,\n installCommand,\n ...customOptions,\n });\n};\n","import { execSync } from \"child_process\";\nimport spawn from \"cross-spawn\";\nimport pc from \"picocolors\";\nimport semver from \"semver\";\nimport dns from \"dns\";\nimport { URL } from \"url\";\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 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 = execSync(\"pnpm --version\").toString().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 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 = execSync(\"yarnpkg --version\").toString().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 = execSync(\"npm --version\").toString().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 = execSync(\"npm config get https-proxy\").toString().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","// 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 { downloadRepository } from \"./git.js\";\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 try {\n await downloadRepository({\n url,\n branch: branch || \"\",\n target,\n targetId,\n });\n } catch {\n // Ignore git error\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 try {\n const { url, branch, subdir, protocol, pathname, ignorePackage } =\n solveValuesFromTemplateOrExtensionUrl(templateOrExtension);\n\n if (protocol === \"file:\") {\n // Already parsed absolute path in pathname\n const baseDir = pathname;\n return { dir: baseDir, subdir, ignorePackage };\n }\n\n const gitData = await solveRepositoryPath({ url, branch, subdir });\n return { dir: gitData.dir, subdir: gitData.subdir, ignorePackage };\n } catch {\n // Fallback to an internal templatesOrExtensions directory (legacy behaviour)\n return {\n dir: path.resolve(\n __dirname,\n \"..\",\n \"templatesOrExtensions\",\n templateOrExtension,\n ),\n subdir: undefined,\n ignorePackage: undefined,\n };\n }\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\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\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 console.error(\"Error during repository download:\", error);\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 _ from \"underscore\";\nimport fs from \"fs\";\nimport pc from \"picocolors\";\nimport { readdirp } from \"readdirp\";\nimport { dirname } from \"path\";\nimport { getTemplateDirPath } from \"./paths.js\";\nimport { promisify } from \"util\";\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 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 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)$/, \"\")\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)$/, \"\")\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)$/, \"\")\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 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 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 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 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\\./]\n : useYarn\n ? [/\\.if-npm\\./, /\\.if-pnpm\\./]\n : [/\\.if-yarn\\./, /\\.if-pnpm\\./];\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 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_underscore","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","debug","path","os","fs","path","os","fs","path","merge","import_fs","import_picocolors","import_path","fs","path","pc","_","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 { 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"]}
|