@create-node-app/core 0.5.5 → 0.5.6

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/dist/index.cjs CHANGED
@@ -34,6 +34,8 @@ __export(index_exports, {
34
34
  checkNodeVersion: () => checkNodeVersion,
35
35
  createNodeApp: () => createNodeApp,
36
36
  downloadRepository: () => downloadRepository,
37
+ getPackagePath: () => getPackagePath,
38
+ getTemplateDirPath: () => getTemplateDirPath,
37
39
  printEnvInfo: () => printEnvInfo
38
40
  });
39
41
  module.exports = __toCommonJS(index_exports);
@@ -99,7 +101,7 @@ var checkThatNpmCanReadCwd = () => {
99
101
  let childOutput = null;
100
102
  try {
101
103
  childOutput = import_cross_spawn.default.sync("npm", ["config", "list"]).output.join("");
102
- } catch (err) {
104
+ } catch {
103
105
  return true;
104
106
  }
105
107
  if (typeof childOutput !== "string") {
@@ -158,7 +160,7 @@ var checkPnpmVersion = () => {
158
160
  hasMinPnpm = import_semver.default.gte(trimmedPnpmVersionMatch[1], minPnpm);
159
161
  }
160
162
  }
161
- } catch (e) {
163
+ } catch {
162
164
  }
163
165
  return { hasMinPnpm, pnpmVersion };
164
166
  };
@@ -183,7 +185,7 @@ var checkYarnVersion = () => {
183
185
  }
184
186
  }
185
187
  }
186
- } catch (err) {
188
+ } catch {
187
189
  }
188
190
  return {
189
191
  hasMinYarnPnp,
@@ -197,7 +199,7 @@ var checkNpmVersion = () => {
197
199
  try {
198
200
  npmVersion = (0, import_child_process.execSync)("npm --version").toString().trim();
199
201
  hasMinNpm = import_semver.default.gte(npmVersion, "6.0.0");
200
- } catch (err) {
202
+ } catch {
201
203
  }
202
204
  return {
203
205
  hasMinNpm,
@@ -211,7 +213,7 @@ var getProxy = () => {
211
213
  try {
212
214
  const httpsProxy = (0, import_child_process.execSync)("npm config get https-proxy").toString().trim();
213
215
  return httpsProxy !== "null" ? httpsProxy : void 0;
214
- } catch (e) {
216
+ } catch {
215
217
  }
216
218
  return "";
217
219
  };
@@ -326,13 +328,38 @@ var downloadRepository = async ({
326
328
  // paths.ts
327
329
  var solveValuesFromTemplateOrExtensionUrl = (templateOrExtension) => {
328
330
  const url = new URL(templateOrExtension);
329
- const origin = `${url.protocol}//${url.host}`;
330
- const [org, repo, , branch = "", ...subdir] = url.pathname.slice(1).split("/");
331
331
  const ignorePackage = url.searchParams.get("ignorePackage") === "true";
332
+ if (url.protocol === "file:") {
333
+ let pathname = decodeURIComponent(url.pathname);
334
+ if (process.platform === "win32" && /^\/[A-Za-z]:\//.test(pathname)) {
335
+ pathname = pathname.slice(1);
336
+ }
337
+ const subdirParam = url.searchParams.get("subdir") || "";
338
+ return {
339
+ url: templateOrExtension,
340
+ // not used for git cloning when file://
341
+ branch: "",
342
+ subdir: subdirParam,
343
+ protocol: url.protocol,
344
+ host: "",
345
+ // host is unused for file
346
+ pathname,
347
+ ignorePackage
348
+ };
349
+ }
350
+ const origin = `${url.protocol}//${url.host}`;
351
+ const parts = url.pathname.slice(1).split("/");
352
+ const [org, repo] = parts;
353
+ let branch = "";
354
+ let subdir = "";
355
+ if (parts[2] === "tree") {
356
+ branch = parts[3] || "";
357
+ subdir = parts.slice(4).join("/");
358
+ }
332
359
  return {
333
360
  url: `${origin}/${org}/${repo}`,
334
361
  branch,
335
- subdir: subdir.join("/"),
362
+ subdir,
336
363
  protocol: url.protocol,
337
364
  host: url.host,
338
365
  pathname: url.pathname,
@@ -349,6 +376,9 @@ var solveRepositoryPath = async ({
349
376
  "base64"
350
377
  );
351
378
  const target = import_path2.default.join(import_os2.default.homedir(), ".cna", targetWithSubdir);
379
+ if (process.env.CNA_SKIP_GIT === "1") {
380
+ return { dir: target, subdir };
381
+ }
352
382
  try {
353
383
  await downloadRepository({
354
384
  url,
@@ -362,19 +392,13 @@ var solveRepositoryPath = async ({
362
392
  };
363
393
  var solveTemplateOrExtensionPath = async (templateOrExtension) => {
364
394
  try {
365
- const { url, branch, subdir, protocol, host, pathname, ignorePackage } = solveValuesFromTemplateOrExtensionUrl(templateOrExtension);
395
+ const { url, branch, subdir, protocol, pathname, ignorePackage } = solveValuesFromTemplateOrExtensionUrl(templateOrExtension);
366
396
  if (protocol === "file:") {
367
- return {
368
- dir: import_path2.default.resolve(host, pathname),
369
- subdir
370
- };
397
+ const baseDir = pathname;
398
+ return { dir: baseDir, subdir, ignorePackage };
371
399
  }
372
- const gitData = await solveRepositoryPath({
373
- url,
374
- branch,
375
- subdir
376
- });
377
- return { ...gitData, ignorePackage };
400
+ const gitData = await solveRepositoryPath({ url, branch, subdir });
401
+ return { dir: gitData.dir, subdir: gitData.subdir, ignorePackage };
378
402
  } catch {
379
403
  return {
380
404
  dir: import_path2.default.resolve(
@@ -383,6 +407,7 @@ var solveTemplateOrExtensionPath = async (templateOrExtension) => {
383
407
  "templatesOrExtensions",
384
408
  templateOrExtension
385
409
  ),
410
+ subdir: void 0,
386
411
  ignorePackage: void 0
387
412
  };
388
413
  }
@@ -865,7 +890,7 @@ var install = async (root, useYarn = false, usePnpm = false, dependencies = [],
865
890
  cwd: root,
866
891
  stdio: "inherit"
867
892
  });
868
- } catch (error) {
893
+ } catch {
869
894
  throw new Error(`${command} ${args.join(" ")}`);
870
895
  }
871
896
  };
@@ -876,7 +901,7 @@ var runCommandInProjectDir = async (root, command, args = [], successMessage = "
876
901
  stdio: "ignore"
877
902
  });
878
903
  console.log(import_picocolors3.default.green(successMessage));
879
- } catch (error) {
904
+ } catch {
880
905
  console.log();
881
906
  console.log(import_picocolors3.default.red(errorMessage));
882
907
  console.log();
@@ -1001,7 +1026,7 @@ var run = async ({
1001
1026
  const git = simpleGit2(root);
1002
1027
  await git.init();
1003
1028
  console.log(import_picocolors3.default.green("Successfully initialized git repository."));
1004
- } catch (error) {
1029
+ } catch {
1005
1030
  console.log();
1006
1031
  console.log(
1007
1032
  import_picocolors3.default.red(
@@ -1130,7 +1155,7 @@ Please update to npm 3 or higher for a better, fully supported experience.
1130
1155
  let yarnUsesDefaultRegistry = true;
1131
1156
  try {
1132
1157
  yarnUsesDefaultRegistry = (0, import_child_process2.execSync)("yarnpkg config get registry").toString().trim() === "https://registry.yarnpkg.com";
1133
- } catch (e) {
1158
+ } catch {
1134
1159
  }
1135
1160
  if (false) {
1136
1161
  import_fs5.default.cpSync(
@@ -1183,7 +1208,7 @@ var checkForLatestVersion = async (packageName) => {
1183
1208
  return String(json["latest"]);
1184
1209
  }
1185
1210
  return null;
1186
- } catch (error) {
1211
+ } catch {
1187
1212
  try {
1188
1213
  return (0, import_child_process3.execSync)(`npm view ${packageName} version`).toString().trim();
1189
1214
  } catch {
@@ -1234,5 +1259,8 @@ var createNodeApp = async (programName, options, transformOptions) => {
1234
1259
  checkNodeVersion,
1235
1260
  createNodeApp,
1236
1261
  downloadRepository,
1262
+ getPackagePath,
1263
+ getTemplateDirPath,
1237
1264
  printEnvInfo
1238
1265
  });
1266
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../index.ts","../installer.ts","../helpers.ts","../package.ts","../paths.ts","../git.ts","../loaders.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 { getPackagePath, getTemplateDirPath } from \"./paths.js\";\nexport { downloadRepository } from \"./git.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\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"],"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","semver","pc","envinfo"]}
package/dist/index.d.cts CHANGED
@@ -3,6 +3,9 @@ type TemplateOrExtension = {
3
3
  ignorePackage?: boolean;
4
4
  };
5
5
 
6
+ declare const getPackagePath: (templateOrExtension: string, name?: string, ignorePackage?: boolean) => Promise<string>;
7
+ declare const getTemplateDirPath: (templateOrExtensionUrl: string) => Promise<string>;
8
+
6
9
  type DownloadRepositoryOptions = {
7
10
  url?: string;
8
11
  target: string;
@@ -39,4 +42,4 @@ type CnaOptions = {
39
42
  type CnaOptionsTransform = (options: CnaOptions) => Promise<CnaOptions>;
40
43
  declare const createNodeApp: (programName: string, options: CnaOptions, transformOptions: CnaOptionsTransform) => Promise<void>;
41
44
 
42
- export { type CnaOptions, type CnaOptionsTransform, type TemplateOrExtension, checkForLatestVersion, checkNodeVersion, createNodeApp, downloadRepository, printEnvInfo };
45
+ export { type CnaOptions, type CnaOptionsTransform, type TemplateOrExtension, checkForLatestVersion, checkNodeVersion, createNodeApp, downloadRepository, getPackagePath, getTemplateDirPath, printEnvInfo };
package/dist/index.d.ts CHANGED
@@ -3,6 +3,9 @@ type TemplateOrExtension = {
3
3
  ignorePackage?: boolean;
4
4
  };
5
5
 
6
+ declare const getPackagePath: (templateOrExtension: string, name?: string, ignorePackage?: boolean) => Promise<string>;
7
+ declare const getTemplateDirPath: (templateOrExtensionUrl: string) => Promise<string>;
8
+
6
9
  type DownloadRepositoryOptions = {
7
10
  url?: string;
8
11
  target: string;
@@ -39,4 +42,4 @@ type CnaOptions = {
39
42
  type CnaOptionsTransform = (options: CnaOptions) => Promise<CnaOptions>;
40
43
  declare const createNodeApp: (programName: string, options: CnaOptions, transformOptions: CnaOptionsTransform) => Promise<void>;
41
44
 
42
- export { type CnaOptions, type CnaOptionsTransform, type TemplateOrExtension, checkForLatestVersion, checkNodeVersion, createNodeApp, downloadRepository, printEnvInfo };
45
+ export { type CnaOptions, type CnaOptionsTransform, type TemplateOrExtension, checkForLatestVersion, checkNodeVersion, createNodeApp, downloadRepository, getPackagePath, getTemplateDirPath, printEnvInfo };
package/dist/index.js CHANGED
@@ -68,7 +68,7 @@ var checkThatNpmCanReadCwd = () => {
68
68
  let childOutput = null;
69
69
  try {
70
70
  childOutput = spawn.sync("npm", ["config", "list"]).output.join("");
71
- } catch (err) {
71
+ } catch {
72
72
  return true;
73
73
  }
74
74
  if (typeof childOutput !== "string") {
@@ -127,7 +127,7 @@ var checkPnpmVersion = () => {
127
127
  hasMinPnpm = semver.gte(trimmedPnpmVersionMatch[1], minPnpm);
128
128
  }
129
129
  }
130
- } catch (e) {
130
+ } catch {
131
131
  }
132
132
  return { hasMinPnpm, pnpmVersion };
133
133
  };
@@ -152,7 +152,7 @@ var checkYarnVersion = () => {
152
152
  }
153
153
  }
154
154
  }
155
- } catch (err) {
155
+ } catch {
156
156
  }
157
157
  return {
158
158
  hasMinYarnPnp,
@@ -166,7 +166,7 @@ var checkNpmVersion = () => {
166
166
  try {
167
167
  npmVersion = execSync("npm --version").toString().trim();
168
168
  hasMinNpm = semver.gte(npmVersion, "6.0.0");
169
- } catch (err) {
169
+ } catch {
170
170
  }
171
171
  return {
172
172
  hasMinNpm,
@@ -180,7 +180,7 @@ var getProxy = () => {
180
180
  try {
181
181
  const httpsProxy = execSync("npm config get https-proxy").toString().trim();
182
182
  return httpsProxy !== "null" ? httpsProxy : void 0;
183
- } catch (e) {
183
+ } catch {
184
184
  }
185
185
  return "";
186
186
  };
@@ -295,13 +295,38 @@ var downloadRepository = async ({
295
295
  // paths.ts
296
296
  var solveValuesFromTemplateOrExtensionUrl = (templateOrExtension) => {
297
297
  const url = new URL(templateOrExtension);
298
- const origin = `${url.protocol}//${url.host}`;
299
- const [org, repo, , branch = "", ...subdir] = url.pathname.slice(1).split("/");
300
298
  const ignorePackage = url.searchParams.get("ignorePackage") === "true";
299
+ if (url.protocol === "file:") {
300
+ let pathname = decodeURIComponent(url.pathname);
301
+ if (process.platform === "win32" && /^\/[A-Za-z]:\//.test(pathname)) {
302
+ pathname = pathname.slice(1);
303
+ }
304
+ const subdirParam = url.searchParams.get("subdir") || "";
305
+ return {
306
+ url: templateOrExtension,
307
+ // not used for git cloning when file://
308
+ branch: "",
309
+ subdir: subdirParam,
310
+ protocol: url.protocol,
311
+ host: "",
312
+ // host is unused for file
313
+ pathname,
314
+ ignorePackage
315
+ };
316
+ }
317
+ const origin = `${url.protocol}//${url.host}`;
318
+ const parts = url.pathname.slice(1).split("/");
319
+ const [org, repo] = parts;
320
+ let branch = "";
321
+ let subdir = "";
322
+ if (parts[2] === "tree") {
323
+ branch = parts[3] || "";
324
+ subdir = parts.slice(4).join("/");
325
+ }
301
326
  return {
302
327
  url: `${origin}/${org}/${repo}`,
303
328
  branch,
304
- subdir: subdir.join("/"),
329
+ subdir,
305
330
  protocol: url.protocol,
306
331
  host: url.host,
307
332
  pathname: url.pathname,
@@ -318,6 +343,9 @@ var solveRepositoryPath = async ({
318
343
  "base64"
319
344
  );
320
345
  const target = path2.join(os2.homedir(), ".cna", targetWithSubdir);
346
+ if (process.env.CNA_SKIP_GIT === "1") {
347
+ return { dir: target, subdir };
348
+ }
321
349
  try {
322
350
  await downloadRepository({
323
351
  url,
@@ -331,19 +359,13 @@ var solveRepositoryPath = async ({
331
359
  };
332
360
  var solveTemplateOrExtensionPath = async (templateOrExtension) => {
333
361
  try {
334
- const { url, branch, subdir, protocol, host, pathname, ignorePackage } = solveValuesFromTemplateOrExtensionUrl(templateOrExtension);
362
+ const { url, branch, subdir, protocol, pathname, ignorePackage } = solveValuesFromTemplateOrExtensionUrl(templateOrExtension);
335
363
  if (protocol === "file:") {
336
- return {
337
- dir: path2.resolve(host, pathname),
338
- subdir
339
- };
364
+ const baseDir = pathname;
365
+ return { dir: baseDir, subdir, ignorePackage };
340
366
  }
341
- const gitData = await solveRepositoryPath({
342
- url,
343
- branch,
344
- subdir
345
- });
346
- return { ...gitData, ignorePackage };
367
+ const gitData = await solveRepositoryPath({ url, branch, subdir });
368
+ return { dir: gitData.dir, subdir: gitData.subdir, ignorePackage };
347
369
  } catch {
348
370
  return {
349
371
  dir: path2.resolve(
@@ -352,6 +374,7 @@ var solveTemplateOrExtensionPath = async (templateOrExtension) => {
352
374
  "templatesOrExtensions",
353
375
  templateOrExtension
354
376
  ),
377
+ subdir: void 0,
355
378
  ignorePackage: void 0
356
379
  };
357
380
  }
@@ -834,7 +857,7 @@ var install = async (root, useYarn = false, usePnpm = false, dependencies = [],
834
857
  cwd: root,
835
858
  stdio: "inherit"
836
859
  });
837
- } catch (error) {
860
+ } catch {
838
861
  throw new Error(`${command} ${args.join(" ")}`);
839
862
  }
840
863
  };
@@ -845,7 +868,7 @@ var runCommandInProjectDir = async (root, command, args = [], successMessage = "
845
868
  stdio: "ignore"
846
869
  });
847
870
  console.log(pc3.green(successMessage));
848
- } catch (error) {
871
+ } catch {
849
872
  console.log();
850
873
  console.log(pc3.red(errorMessage));
851
874
  console.log();
@@ -970,7 +993,7 @@ var run = async ({
970
993
  const git = simpleGit2(root);
971
994
  await git.init();
972
995
  console.log(pc3.green("Successfully initialized git repository."));
973
- } catch (error) {
996
+ } catch {
974
997
  console.log();
975
998
  console.log(
976
999
  pc3.red(
@@ -1099,7 +1122,7 @@ Please update to npm 3 or higher for a better, fully supported experience.
1099
1122
  let yarnUsesDefaultRegistry = true;
1100
1123
  try {
1101
1124
  yarnUsesDefaultRegistry = execSync2("yarnpkg config get registry").toString().trim() === "https://registry.yarnpkg.com";
1102
- } catch (e) {
1125
+ } catch {
1103
1126
  }
1104
1127
  if (false) {
1105
1128
  fs4.cpSync(
@@ -1152,7 +1175,7 @@ var checkForLatestVersion = async (packageName) => {
1152
1175
  return String(json["latest"]);
1153
1176
  }
1154
1177
  return null;
1155
- } catch (error) {
1178
+ } catch {
1156
1179
  try {
1157
1180
  return execSync3(`npm view ${packageName} version`).toString().trim();
1158
1181
  } catch {
@@ -1202,5 +1225,8 @@ export {
1202
1225
  checkNodeVersion,
1203
1226
  createNodeApp,
1204
1227
  downloadRepository,
1228
+ getPackagePath,
1229
+ getTemplateDirPath,
1205
1230
  printEnvInfo
1206
1231
  };
1232
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../index.ts","../installer.ts","../helpers.ts","../package.ts","../paths.ts","../git.ts","../loaders.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 { getPackagePath, getTemplateDirPath } from \"./paths.js\";\nexport { downloadRepository } from \"./git.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\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"],"mappings":"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","names":["pc","semver","execSync","_","path","fs","pc","os","semver","execSync","URL","line","URL","fs","os","path","path","os","fs","path","fs","pc","fs","path","pc","pc","execSync","_","packageJson","fs","path","os","simpleGit","semver","semver","pc","execSync"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@create-node-app/core",
3
- "version": "0.5.5",
3
+ "version": "0.5.6",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "types": "./dist/index.d.ts",
@@ -27,14 +27,15 @@
27
27
  "lint": "eslint '**/*.{ts,tsx,js}'",
28
28
  "lint:fix": "eslint '**/*.{ts,tsx,js}' --fix",
29
29
  "type-check": "tsc --noEmit",
30
- "build": "tsup ./index.ts --format esm,cjs --dts --no-splitting",
31
- "dev": "tsup ./index.ts --format esm,cjs --watch --dts --no-splitting"
30
+ "build": "tsup ./index.ts --format esm,cjs --dts --no-splitting --sourcemap",
31
+ "dev": "tsup ./index.ts --format esm,cjs --watch --dts --no-splitting --sourcemap",
32
+ "test": "tsx --test tests/**/*.test.mts"
32
33
  },
33
34
  "devDependencies": {
34
35
  "@create-node-app/eslint-config-ts": "*",
36
+ "ts-node": "^10.9.2",
35
37
  "@types/cross-spawn": "^6.0.6",
36
38
  "@types/debug": "^4.1.12",
37
- "@types/download": "^8.0.5",
38
39
  "@types/envinfo": "^7.8.4",
39
40
  "@types/fs-extra": "^11.0.4",
40
41
  "@types/lodash.merge": "^4.6.9",
@@ -45,7 +46,8 @@
45
46
  "eslint-config-turbo": "^2.5.6",
46
47
  "eslint-plugin-turbo": "^2.5.6",
47
48
  "tsconfig": "*",
48
- "typescript": "^5.9.2"
49
+ "typescript": "^5.9.2",
50
+ "tsx": "^4.19.0"
49
51
  },
50
52
  "dependencies": {
51
53
  "picocolors": "^1.0.0",