@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 +52 -24
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +4 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +50 -24
- package/dist/index.js.map +1 -0
- package/package.json +7 -5
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
395
|
+
const { url, branch, subdir, protocol, pathname, ignorePackage } = solveValuesFromTemplateOrExtensionUrl(templateOrExtension);
|
|
366
396
|
if (protocol === "file:") {
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
subdir
|
|
370
|
-
};
|
|
397
|
+
const baseDir = pathname;
|
|
398
|
+
return { dir: baseDir, subdir, ignorePackage };
|
|
371
399
|
}
|
|
372
|
-
const gitData = await solveRepositoryPath({
|
|
373
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
362
|
+
const { url, branch, subdir, protocol, pathname, ignorePackage } = solveValuesFromTemplateOrExtensionUrl(templateOrExtension);
|
|
335
363
|
if (protocol === "file:") {
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
subdir
|
|
339
|
-
};
|
|
364
|
+
const baseDir = pathname;
|
|
365
|
+
return { dir: baseDir, subdir, ignorePackage };
|
|
340
366
|
}
|
|
341
|
-
const gitData = await solveRepositoryPath({
|
|
342
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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":";;;;;;;;AAAA,OAAOA,SAAQ;AACf,OAAO,aAAa;AACpB,OAAOC,aAAY;AACnB,SAAS,YAAAC,iBAAgB;;;ACHzB,OAAOC,QAAO;AACd,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AACf,OAAOC,SAAQ;AACf,OAAOC,SAAQ;AACf,OAAOC,aAAY;AACnB,SAAS,YAAAC,iBAAgB;;;ACNzB,SAAS,gBAAgB;AACzB,OAAO,WAAW;AAClB,OAAO,QAAQ;AACf,OAAO,YAAY;AACnB,OAAO,SAAS;AAChB,SAAS,OAAAC,YAAW;AAyBb,IAAM,gBAAgB,MAAM;AACjC,QAAM,EAAE,eAAe,eAAe,YAAY,IAAI,iBAAiB;AAEvE,MAAI,CAAC,eAAe;AAClB,YAAQ;AAAA,MACN,GAAG;AAAA,QACD,8BAA8B,GAAG;AAAA,UAC/B;AAAA,QACF,CAAC;AAAA,MAGH;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,eAAe;AAClB,YAAQ;AAAA,MACN,GAAG;AAAA,QACD;AAAA,MAGF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,IAAM,gBAAgB,MAAM;AACjC,QAAM,EAAE,YAAY,YAAY,IAAI,iBAAiB;AAErD,MAAI,CAAC,YAAY;AACf,YAAQ;AAAA,MACN,GAAG;AAAA,QACD,8BAA8B,GAAG;AAAA,UAC/B;AAAA,QACF,CAAC;AAAA,MAGH;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,IAAM,yBAAyB,MAAM;AAC1C,QAAM,MAAM,QAAQ,IAAI;AACxB,MAAI,cAAc;AAClB,MAAI;AAMF,kBAAc,MAAM,KAAK,OAAO,CAAC,UAAU,MAAM,CAAC,EAAE,OAAO,KAAK,EAAE;AAAA,EACpE,QAAQ;AAIN,WAAO;AAAA,EACT;AACA,MAAI,OAAO,gBAAgB,UAAU;AACnC,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,YAAY,MAAM,IAAI;AAIpC,QAAM,SAAS;AACf,QAAM,OAAO,MAAM,KAAK,CAACC,UAASA,MAAK,WAAW,MAAM,CAAC;AACzD,MAAI,OAAO,SAAS,UAAU;AAE5B,WAAO;AAAA,EACT;AACA,QAAM,SAAS,KAAK,UAAU,OAAO,MAAM;AAC3C,MAAI,WAAW,KAAK;AAClB,WAAO;AAAA,EACT;AACA,UAAQ;AAAA,IACN,GAAG;AAAA,MACD;AAAA;AAAA,4BAC+B,GAAG,KAAK,GAAG,CAAC;AAAA,gDACQ,GAAG,KAAK,MAAM,CAAC;AAAA;AAAA;AAAA,IAEpE;AAAA,EACF;AACA,MAAI,QAAQ,aAAa,SAAS;AAChC,YAAQ;AAAA,MACN,GAAG,IAAI;AAAA;AAAA,CAAuD,IAC5D,KAAK,GAAG;AAAA,QACN;AAAA,MACF,CAAC;AAAA,IACI,GAAG;AAAA,QACN;AAAA,MACF,CAAC;AAAA;AAAA,IACD,GAAG,IAAI;AAAA,CAAmD,IAC1D,GAAG;AAAA,QACD;AAAA,MACF;AAAA,IACJ;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,mBAAmB,MAAM;AACpC,QAAM,UAAU;AAChB,MAAI,aAAa;AACjB,MAAI,cAAc;AAClB,MAAI;AACF,kBAAc,SAAS,gBAAgB,EAAE,SAAS,EAAE,KAAK;AACzD,QAAI,OAAO,MAAM,WAAW,GAAG;AAC7B,mBAAa,OAAO,IAAI,aAAa,OAAO;AAAA,IAC9C,OAAO;AAIL,YAAM,0BAA0B,gBAAgB,KAAK,WAAW;AAChE,UAAI,2BAA2B,wBAAwB,CAAC,GAAG;AACzD,qBAAa,OAAO,IAAI,wBAAwB,CAAC,GAAG,OAAO;AAAA,MAC7D;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO,EAAE,YAAY,YAAY;AACnC;AAEO,IAAM,mBAAmB,MAAM;AACpC,QAAM,aAAa;AACnB,QAAM,aAAa;AACnB,MAAI,gBAAgB;AACpB,MAAI,gBAAgB;AACpB,MAAI,cAAc;AAClB,MAAI;AACF,kBAAc,SAAS,mBAAmB,EAAE,SAAS,EAAE,KAAK;AAC5D,QAAI,OAAO,MAAM,WAAW,GAAG;AAC7B,sBAAgB,OAAO,IAAI,aAAa,UAAU;AAClD,sBAAgB,OAAO,GAAG,aAAa,UAAU;AAAA,IACnD,OAAO;AAIL,YAAM,0BAA0B,gBAAgB,KAAK,WAAW;AAChE,UAAI,yBAAyB;AAC3B,cAAM,qBAAqB,wBAAwB,IAAI;AACvD,YAAI,oBAAoB;AACtB,0BAAgB,OAAO,IAAI,oBAAoB,UAAU;AACzD,0BAAgB,OAAO,GAAG,oBAAoB,UAAU;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,kBAAkB,MAAM;AACnC,MAAI,YAAY;AAChB,MAAI,aAAa;AACjB,MAAI;AACF,iBAAa,SAAS,eAAe,EAAE,SAAS,EAAE,KAAK;AACvD,gBAAY,OAAO,IAAI,YAAY,OAAO;AAAA,EAC5C,QAAQ;AAAA,EAER;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEA,IAAM,WAAW,MAAM;AACrB,MAAI,QAAQ,IAAI,aAAa;AAC3B,WAAO,QAAQ,IAAI;AAAA,EACrB;AACA,MAAI;AAEF,UAAM,aAAa,SAAS,4BAA4B,EAAE,SAAS,EAAE,KAAK;AAC1E,WAAO,eAAe,SAAS,aAAa;AAAA,EAC9C,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEO,IAAM,gBAAgB,CAAC,YAAsB;AAClD,MAAI,CAAC,SAAS;AAGZ,WAAO,QAAQ,QAAQ,IAAI;AAAA,EAC7B;AAEA,SAAO,IAAI,QAAiB,CAAC,YAAY;AACvC,QAAI,OAAO,wBAAwB,CAAC,QAAQ;AAC1C,UAAI;AACJ,UAAI,OAAO,SAAS,QAAQ,SAAS,IAAI;AAGvC,YAAI,OAAO,IAAIC,KAAI,KAAK,EAAE,UAAU,CAAC,aAAa;AAChD,kBAAQ,CAAC,QAAQ;AAAA,QACnB,CAAC;AAAA,MACH,OAAO;AACL,gBAAQ,CAAC,GAAG;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;;;ACpPA,SAAS,kBAAkB;AAC3B,OAAO,WAAW;;;ACFlB,OAAOC,SAAQ;AACf,OAAOC,SAAQ;AACf,OAAOC,WAAU;;;ACFjB,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,OAAO,WAAW;AAClB,SAAS,iBAAoD;AAC7D,YAAY,SAAS;AAErB,IAAM,MAAM,MAAM,SAAS;AAK3B,IAAM,YAAY,CAAC,QAAgB;AACjC,SAAO,CAAC,iBAAiB,KAAK,GAAG;AACnC;AAYA,IAAM,kBAAkB,oBAAI,IAA2B;AAGvD,IAAM,qBAAqB,oBAAI,IAAqB;AAW7C,IAAM,qBAAqB,OAAO;AAAA,EACvC,MAAM;AAAA,EACN,UAAU;AAAA,EACV,SAAS;AAAA,EACT,SAAS;AAAA,EACT;AAAA,EACA,UAAU;AACZ,MAAiC;AAC/B,QAAM,iBAAiB,KAAK,WAAW,MAAM,IACzC,SACA,KAAK,QAAQ,MAAM;AAEvB,QAAM,WAAW,iBAAiB,KAAK,GAAG;AAC1C,QAAM,SAAS,WAAW,sBAAsB,GAAG,KAAK;AACxD,QAAM,KAAK,YAAY,OAAO,KAAK,GAAG,MAAM,IAAI,MAAM,EAAE,EAAE,SAAS,QAAQ;AAC3E,MAAI,WAAW,gBAAgB,KAAK,KAAK,GAAG,QAAQ,GAAG,UAAU,OAAO,EAAE;AAE1E,aAAW,KAAK,WAAW,QAAQ,IAAI,WAAW,KAAK,QAAQ,QAAQ;AAEvE,MAAI,oBAAoB,QAAQ;AAGhC,MAAI,mBAAmB,IAAI,EAAE,GAAG;AAC9B;AAAA,MACE,+BAA+B,EAAE;AAAA,IACnC;AAEA,UAAU,SAAK,UAAU,gBAAgB;AAAA,MACvC,WAAW;AAAA,MACX,QAAQ;AAAA,IACV,CAAC;AACD;AAAA,EACF;AAGA,MAAI,gBAAgB,IAAI,EAAE,GAAG;AAC3B;AAAA,MACE,gCAAgC,EAAE;AAAA,IACpC;AACA,UAAM,gBAAgB,IAAI,EAAE;AAC5B,QAAI,gCAAgC,EAAE,kBAAkB;AACxD;AAAA,EACF;AAGA,QAAM,uBAAuB,YAAY;AACvC,QAAI,MAAiB,UAAU;AAC/B,UAAM,eAA6B;AAAA,MACjC,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,aAAa;AAAA,IACf;AAEA,QAAI;AACF,YAAM,SAAS,GAAG,WAAW,QAAQ;AAErC,UAAI,CAAC,QAAQ;AACX,YAAI,uBAAuB;AAC3B,cAAM,IAAI,MAAM,QAAQ,UAAU,YAAY;AAAA,MAChD;AAEA,YAAM,UAAU,QAAQ;AAExB,UAAI,CAAC,SAAS;AACZ,YAAI,uBAAuB;AAC3B,cAAM,IAAI,SAAS,CAAC,MAAM,MAAM,CAAC;AACjC,cAAM,IAAI,KAAK;AAAA,MACjB;AAGA,YAAU,SAAK,UAAU,gBAAgB;AAAA,QACvC,WAAW;AAAA,QACX,QAAQ;AAAA,MACV,CAAC;AAGD,yBAAmB,IAAI,IAAI,IAAI;AAAA,IACjC,SAAS,OAAO;AACd,cAAQ,MAAM,qCAAqC,KAAK;AAAA,IAC1D,UAAE;AAEA,sBAAgB,OAAO,EAAE;AAAA,IAC3B;AAAA,EACF,GAAG;AAEH,kBAAgB,IAAI,IAAI,mBAAmB;AAG3C,QAAM;AACR;;;ADjHA,IAAM,wCAAwC,CAAC,wBAAgC;AAC7E,QAAM,MAAM,IAAI,IAAI,mBAAmB;AACvC,QAAM,gBAAgB,IAAI,aAAa,IAAI,eAAe,MAAM;AAEhE,MAAI,IAAI,aAAa,SAAS;AAE5B,QAAI,WAAW,mBAAmB,IAAI,QAAQ;AAE9C,QAAI,QAAQ,aAAa,WAAW,iBAAiB,KAAK,QAAQ,GAAG;AACnE,iBAAW,SAAS,MAAM,CAAC;AAAA,IAC7B;AACA,UAAM,cAAc,IAAI,aAAa,IAAI,QAAQ,KAAK;AACtD,WAAO;AAAA,MACL,KAAK;AAAA;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,UAAU,IAAI;AAAA,MACd,MAAM;AAAA;AAAA,MACN;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,GAAG,IAAI,QAAQ,KAAK,IAAI,IAAI;AAE3C,QAAM,QAAQ,IAAI,SAAS,MAAM,CAAC,EAAE,MAAM,GAAG;AAC7C,QAAM,CAAC,KAAK,IAAI,IAAI;AACpB,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,MAAM,CAAC,MAAM,QAAQ;AACvB,aAAS,MAAM,CAAC,KAAK;AACrB,aAAS,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG;AAAA,EAClC;AACA,SAAO;AAAA,IACL,KAAK,GAAG,MAAM,IAAI,GAAG,IAAI,IAAI;AAAA,IAC7B;AAAA,IACA;AAAA,IACA,UAAU,IAAI;AAAA,IACd,MAAM,IAAI;AAAA,IACV,UAAU,IAAI;AAAA,IACd;AAAA,EACF;AACF;AAQA,IAAM,sBAAsB,OAAO;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AACF,MAAkC;AAChC,QAAM,WAAW,OAAO,KAAK,GAAG,GAAG,IAAI,MAAM,EAAE,EAAE,SAAS,QAAQ;AAClE,QAAM,mBAAmB,OAAO,KAAK,GAAG,GAAG,IAAI,MAAM,IAAI,MAAM,EAAE,EAAE;AAAA,IACjE;AAAA,EACF;AACA,QAAM,SAASC,MAAK,KAAKC,IAAG,QAAQ,GAAG,QAAQ,gBAAgB;AAG/D,MAAI,QAAQ,IAAI,iBAAiB,KAAK;AACpC,WAAO,EAAE,KAAK,QAAQ,OAAO;AAAA,EAC/B;AAEA,MAAI;AACF,UAAM,mBAAmB;AAAA,MACvB;AAAA,MACA,QAAQ,UAAU;AAAA,MAClB;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,QAAQ;AAAA,EAER;AAEA,SAAO,EAAE,KAAK,QAAQ,OAAO;AAC/B;AASA,IAAM,+BAA+B,OACnC,wBACgC;AAChC,MAAI;AACF,UAAM,EAAE,KAAK,QAAQ,QAAQ,UAAU,UAAU,cAAc,IAC7D,sCAAsC,mBAAmB;AAE3D,QAAI,aAAa,SAAS;AAExB,YAAM,UAAU;AAChB,aAAO,EAAE,KAAK,SAAS,QAAQ,cAAc;AAAA,IAC/C;AAEA,UAAM,UAAU,MAAM,oBAAoB,EAAE,KAAK,QAAQ,OAAO,CAAC;AACjE,WAAO,EAAE,KAAK,QAAQ,KAAK,QAAQ,QAAQ,QAAQ,cAAc;AAAA,EACnE,QAAQ;AAEN,WAAO;AAAA,MACL,KAAKD,MAAK;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,EACF;AACF;AAEO,IAAM,iBAAiB,OAC5B,qBACA,OAAO,WACP,gBAAgB,UACb;AACH,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,eAAe;AAAA,EACjB,IAAI,MAAM,6BAA6B,mBAAmB;AAE1D,MACE,SAAS,mBACR,iBAAiB,mCAClB;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ;AACV,WAAOA,MAAK,QAAQ,KAAK,QAAQ,IAAI;AAAA,EACvC;AAEA,SAAOA,MAAK,QAAQ,KAAK,IAAI;AAC/B;AAEO,IAAM,qBAAqB,OAAO,2BAAmC;AAC1E,QAAM,EAAE,KAAK,SAAS,GAAG,IAAI,MAAM;AAAA,IACjC;AAAA,EACF;AACA,MAAI,kBAAkBA,MAAK,QAAQ,KAAK,MAAM;AAG9C,QAAM,8BAA8BA,MAAK,QAAQ,iBAAiB,UAAU;AAE5E,SAAO,IAAI,QAAgB,CAAC,YAAY;AACtC,IAAAE,IAAG,KAAK,6BAA6B,CAAC,MAAM,UAAU;AACpD,UAAI,MAAM;AACR,gBAAQ,eAAe;AACvB;AAAA,MACF;AAEA,UAAI,MAAM,YAAY,GAAG;AACvB,0BAAkB;AAAA,MACpB;AAEA,cAAQ,eAAe;AAAA,IACzB,CAAC;AAAA,EACH,CAAC;AACH;;;AD1KA,IAAM,sBAAsB,CAAC;AAAA,EAC3B;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAkC;AAChC,QAAM,qBAAqB,CAAC,OAAO,CAAC,MAClC,OAAO,QAAQ,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,OAAO,MAAM,GAAG,GAAG,IAAI,OAAO,EAAE;AAElE,SAAO;AAAA,IACL;AAAA,IACA,cAAc,mBAAmB,YAAY;AAAA,IAC7C,iBAAiB,mBAAmB,eAAe;AAAA,EACrD;AACF;AAGA,IAAM,kBAAkB,CAACC,UAAiB;AACxC,MAAI,WAAWA,KAAI,GAAG;AACpB,WAAO,UAAQA,KAAI;AAAA,EACrB;AAEA,QAAM,IAAI,MAAM,QAAQA,KAAI,iBAAiB;AAC/C;AAgBO,IAAM,eAAe,OAAO;AAAA,EACjC,wBAAwB,CAAC;AAAA,EACzB,eAAe,sBAAsB;AAAA,EACrC,GAAG;AACL,MAA2B;AAEzB,QAAM,QAAQ,MAAM,QAAQ;AAAA,IAC1B,sBAAsB,IAAI,OAAO,EAAE,KAAK,oBAAoB,MAAM;AAChE,UAAI;AAEF,cAAM,WAAW;AAAA,UACf,MAAM,eAAe,qBAAqB,eAAe;AAAA,QAC3D;AACA,eAAO,SAAS,WAAW,CAAC;AAAA,MAC9B,QAAQ;AACN,eAAO,CAAC;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AAGA,QAAM,cAAc;AAAA,IAClB;AAAA,MACE,MAAM,OAAO;AAAA,MACb,cAAc,CAAC;AAAA,MACf,iBAAiB,CAAC;AAAA,MAClB,SAAS,CAAC;AAAA,IACZ;AAAA,IACA,GAAG;AAAA,EACL;AAGA,QAAM,aAAa,MAAM,QAAQ;AAAA,IAC/B,sBAAsB;AAAA,MACpB,OAAO,EAAE,KAAK,qBAAqB,cAAc,MAAM;AACrD,YAAI;AAEF,gBAAM,iCAAiC;AAAA,YACrC,MAAM;AAAA,cACJ;AAAA,cACA;AAAA,cACA,uBAAuB;AAAA,YACzB;AAAA,UACF;AACA,iBAAO;AAAA,QACT,QAAQ;AACN,iBAAO,CAAC;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,gBAAgB,MAAM,QAAQ;AAAA,IAClC,sBAAsB,IAAI,OAAO,EAAE,KAAK,oBAAoB,MAAM;AAChE,UAAI;AAEF,cAAM,oCAAoC;AAAA,UACxC,MAAM,eAAe,mBAAmB;AAAA,QAC1C;AACA,eAAO,kCAAkC,aAAa,MAAM;AAAA,MAC9D,QAAQ;AACN,eAAO,CAAC;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AAGA,QAAM,cAAc,MAAM,aAAa,GAAG,YAAY,GAAG,aAAa;AAGtE,SAAO,oBAAoB;AAAA,IACzB,GAAG;AAAA,IACH,MAAM,OAAO;AAAA,EACf,CAAC;AACH;;;AG/HA,OAAO,OAAO;AACd,OAAOC,SAAQ;AACf,OAAOC,SAAQ;AACf,SAAS,gBAAgB;AACzB,SAAS,eAAe;AAExB,SAAS,iBAAiB;AAE1B,IAAM,iBAAiB,UAAUC,IAAG,SAAS;AAC7C,IAAM,gBAAgB,UAAUA,IAAG,QAAQ;AAK3C,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;AAEzB,IAAM,mBAAmB,CAAC,WACxB,WAAW,MAAM,KAAK,SAAS;AAEjC,IAAM,gBAAgB,CAAC,YAAoB;AACzC,MAAI,CAACA,IAAG,WAAW,OAAO,GAAG;AAC3B,IAAAA,IAAG,UAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,EAC3C;AACF;AAEA,IAAM,kBAAkB,CAACC,QAAO,OAAO;AACrC,QAAM,YAAY,IAAI,SACpB,KAAK,KAAK,CAAC,QAAQA,MAAK,SAAS,GAAG,CAAC;AAEvC,MAAI,UAAU,SAAS,GAAG;AACxB,WAAO;AAAA,EACT;AACA,MAAI,UAAU,oBAAoB,kBAAkB,GAAG;AACrD,WAAO;AAAA,EACT;AACA,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAuBA,IAAM,mBAAmB,OACvB,eACG;AACH,QAAM,kBAAkB,WAAW,IAAI,OAAO,cAAc;AAC1D,QAAI;AACF,oBAAc,QAAQ,UAAU,IAAI,CAAC;AACrC,YAAM,cAAc,UAAU,KAAK,UAAU,IAAI;AACjD,UAAI,UAAU,SAAS;AACrB,gBAAQ;AAAA,UACNC,IAAG;AAAA,YACD,UAAU,UAAU,IAAI,WAAW,UAAU,GAAG;AAAA,UAClD;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ;AAAA,QACNA,IAAG,IAAI,oBAAoB,UAAU,GAAG,OAAO,UAAU,IAAI,EAAE;AAAA,MACjE;AACA,UAAI,UAAU,SAAS;AACrB,gBAAQ,IAAIA,IAAG,IAAI,OAAO,GAAG,CAAC,CAAC;AAAA,MACjC;AACA,YAAM;AAAA,IACR;AAAA,EACF,CAAC;AAED,QAAM,QAAQ,IAAI,eAAe;AACnC;AAGA,IAAM,oBAAoB,OACxB,eAOG;AACH,QAAM,kBAAkB,WAAW,IAAI,OAAO,cAAc;AAC1D,QAAI;AACF,oBAAc,QAAQ,UAAU,IAAI,CAAC;AACrC,YAAM,eAAe,UAAU,MAAM,UAAU,SAAS;AAAA,QACtD,MAAM,UAAU;AAAA,QAChB,MAAM,UAAU;AAAA,MAClB,CAAC;AACD,UAAI,UAAU,SAAS;AACrB,gBAAQ,IAAIA,IAAG,MAAM,UAAU,UAAU,IAAI,gBAAgB,CAAC;AAAA,MAChE;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,IAAIA,IAAG,IAAI,qBAAqB,UAAU,IAAI,EAAE,CAAC;AACzD,UAAI,UAAU,SAAS;AACrB,gBAAQ,IAAIA,IAAG,IAAI,OAAO,GAAG,CAAC,CAAC;AAAA,MACjC;AACA,YAAM;AAAA,IACR;AAAA,EACF,CAAC;AAED,QAAM,QAAQ,IAAI,eAAe;AACnC;AAGA,IAAM,qBAAqB,OACzB,eACG;AACH,QAAM,kBAAkB,WAAW,IAAI,OAAO,cAAc;AAC1D,QAAI;AACF,YAAM,UAAU,MAAM,UAAUF,IAAG,QAAQ,EAAE,UAAU,KAAK,MAAM;AAClE,YAAM,YAAY,MAAM,UAAUA,IAAG,IAAI,EAAE,UAAU,GAAG,GAAG;AAC3D,YAAM,kBAAkB;AAAA,QACtB;AAAA,UACE,MAAM,UAAU;AAAA,UAChB;AAAA,UACA,MAAM;AAAA,UACN,SAAS,UAAU;AAAA,UACnB,MAAM;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,cAAQ;AAAA,QACNE,IAAG,IAAI,sBAAsB,UAAU,GAAG,OAAO,UAAU,IAAI,EAAE;AAAA,MACnE;AACA,UAAI,UAAU,SAAS;AACrB,gBAAQ,IAAIA,IAAG,IAAI,OAAO,GAAG,CAAC,CAAC;AAAA,MACjC;AACA,YAAM;AAAA,IACR;AAAA,EACF,CAAC;AAED,QAAM,QAAQ,IAAI,eAAe;AACnC;AAEA,IAAM,aACJ,CAAC,EAAE,MAAM,aAAa,SAAS,OAAO,MACtC,OAAO,EAAE,MAAAD,MAAK,MAAM;AAClB,QAAM,aAAa,CAAC;AACpB,MAAI;AACF,UAAM,UAAUA,MACb,QAAQ,wBAAwB,EAAE,EAClC,QAAQ,kBAAkB,iBAAiB,MAAM,CAAC;AAErD,eAAW,KAAK;AAAA,MACd,KAAK,GAAG,WAAW,IAAIA,KAAI;AAAA,MAC3B,MAAM,GAAG,IAAI,IAAI,OAAO;AAAA,MACxB;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,QAAI,SAAS;AACX,cAAQ,IAAI,GAAG;AAAA,IACjB;AACA,UAAM;AAAA,EACR;AAEA,QAAM,iBAAiB,UAAU;AACnC;AAEF,IAAM,eACJ,CAAC,EAAE,MAAM,aAAa,SAAS,OAAO,MACtC,OAAO,EAAE,MAAAA,MAAK,MAAM;AAClB,QAAM,aAAa,CAAC;AACpB,MAAI;AACF,UAAM,UAAUA,MACb,QAAQ,YAAY,EAAE,EACtB,QAAQ,wBAAwB,EAAE,EAClC,QAAQ,kBAAkB,iBAAiB,MAAM,CAAC;AAErD,eAAW,KAAK;AAAA,MACd,KAAK,GAAG,WAAW,IAAIA,KAAI;AAAA,MAC3B,MAAM,GAAG,IAAI,IAAI,OAAO;AAAA,MACxB;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,QAAI,SAAS;AACX,cAAQ,IAAI,GAAG;AAAA,IACjB;AACA,UAAM;AAAA,EACR;AAEA,QAAM,mBAAmB,UAAU;AACrC;AAEF,IAAM,iBACJ,CAAC;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MACA,OAAO,EAAE,MAAAA,MAAK,MAAM;AAClB,QAAM,aAAa,CAAC;AACpB,MAAI;AACF,UAAM,OAAO,KAAK,SAAS,QAAQ,IAAI,OAAO;AAC9C,UAAM,WAAW,GAAG,WAAW,IAAIA,KAAI;AACvC,UAAM,OAAO,MAAM,UAAUD,IAAG,QAAQ,EAAE,UAAU,MAAM;AAC1D,UAAM,YAAY,MAAM,UAAUA,IAAG,IAAI,EAAE,QAAQ,GAAG;AACtD,UAAM,UAAU,EAAE,SAAS,IAAI;AAC/B,UAAM,UAAUC,MACb,QAAQ,cAAc,EAAE,EACxB,QAAQ,YAAY,EAAE,EACtB,QAAQ,wBAAwB,EAAE,EAClC,QAAQ,kBAAkB,iBAAiB,MAAM,CAAC;AAErD,eAAW,KAAK;AAAA,MACd,MAAM,GAAG,IAAI,IAAI,OAAO;AAAA,MACxB,SAAS,QAAQ;AAAA,QACf,aAAa;AAAA,QACb,QAAQ,UAAU;AAAA,QAClB;AAAA,QACA;AAAA,QACA,GAAG;AAAA,MACL,CAAC;AAAA,MACD;AAAA,MACA;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,QAAI,SAAS;AACX,cAAQ,IAAI,GAAG;AAAA,IACjB;AACA,UAAM;AAAA,EACR;AAEA,QAAM,kBAAkB,UAAU;AACpC;AAEF,IAAM,aACJ,CAAC;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA,GAAG;AACL,MACA,OAAO,EAAE,MAAAA,MAAK,MAAM;AAClB,MAAI;AACF,UAAM,OAAO,gBAAgBA,KAAI;AAEjC,UAAM,UAAU;AAAA,MACd,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,cAAc;AAAA;AAAA,MAEd,gBAAgB;AAAA,IAClB;AAEA,UAAM,QAAQ,IAAI,EAAE;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,CAAC,CAAC;AAAA,MACX,SAAS,CAAC,CAAC;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,CAAC,EAAE;AAAA,MACD,MAAAA;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,QAAI,SAAS;AACX,cAAQ,IAAI,GAAG;AAAA,IACjB;AACA,UAAM;AAAA,EACR;AACF;AAmBK,IAAM,YAAY,OAAO;AAAA,EAC9B;AAAA,EACA,wBAAwB,CAAC;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AAAA,EACV,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAwB;AACtB,MAAI;AACF,UAAM,aAAa,CAAC;AACpB,qBAAiB,EAAE,KAAK,uBAAuB,KAAK,uBAAuB;AACzE,YAAM,cAAc,MAAM,mBAAmB,sBAAsB;AACnE,UAAI,SAAS;AACX,YAAI;AACF,gBAAM,OAAOD,IAAG,WAAW,WAAW,IAClCA,IAAG,SAAS,WAAW,IACvB;AACJ,kBAAQ;AAAA,YACNE,IAAG;AAAA,cACD,gCAAgC,WAAW,WAAW,CAAC,CAAC,IAAI,WAAW,MAAM,cAAc,CAAC;AAAA,YAC9F;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAEA,UACEF,IAAG,WAAW,WAAW,KACzBA,IAAG,SAAS,WAAW,EAAE,YAAY,GACrC;AAGA,YAAI,aAAa;AAEjB,cAAM,YAAY;AAAA,UAChB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,cAAM,cAAc,UAChB,CAAC,cAAc,aAAa,IAC5B,UACE,CAAC,cAAc,aAAa,IAC5B,CAAC,eAAe,aAAa;AACnC,cAAM,aAAa,CAAC,MAClB,CAAC,GAAG,WAAW,GAAG,WAAW,EAAE,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,CAAC;AAE1D,yBAAiB,SAAS,SAAS,aAAa;AAAA,UAC9C,MAAM;AAAA,UACN,YAAY;AAAA,QACd,CAAC,GAAG;AACF,cAAI,WAAW,MAAM,IAAI,EAAG;AAC5B,cAAI,MAAM,KAAK,WAAW,UAAU,EAAG;AACvC,cAAI,WAAW,YAAY;AACzB,oBAAQ,IAAIE,IAAG,IAAI,gCAAgC,MAAM,IAAI,EAAE,CAAC;AAChE,yBAAa;AAAA,UACf;AACA,qBAAW,KAAK;AAAA,YACd;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,GAAG;AAAA,UACL,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,QAAI,SAAS;AACX,cAAQ;AAAA,QACNA,IAAG;AAAA,UACD,kBAAkB,WAAW,MAAM,yBAAyB,sBAAsB,MAAM;AAAA,QAC1F;AAAA,MACF;AACA,UAAI,WAAW,WAAW,GAAG;AAC3B,gBAAQ;AAAA,UACNA,IAAG;AAAA,YACD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAQ;AAAA,MACZ,WAAW,IAAI,CAAC,cAAc,WAAW,SAAS,EAAE,UAAU,KAAK,CAAC;AAAA,IACtE;AAAA,EACF,SAAS,KAAK;AACZ,QAAI,SAAS;AACX,cAAQ,IAAI,GAAG;AAAA,IACjB;AACA,UAAM;AAAA,EACR;AACF;;;ALtZA,IAAM,UAAU,OACd,MACA,UAAU,OACV,UAAU,OACV,eAAyB,CAAC,GAC1B,UAAU,OACV,WAAW,MACX,oBAAoB,UACjB;AACH,MAAI;AACJ,MAAI;AAEJ,MAAI,SAAS;AACX,cAAU;AACV,WAAO,CAAC,OAAO,+BAA+B;AAC9C,QAAI,CAAC,UAAU;AACb,WAAK,KAAK,WAAW;AAAA,IACvB;AACA,QAAI,mBAAmB;AACrB,WAAK,KAAK,OAAO;AAAA,IACnB;AACA,SAAK,KAAK,GAAG,YAAY;AACzB,SAAK,KAAK,OAAO;AACjB,SAAK,KAAK,IAAI;AAEd,QAAI,CAAC,UAAU;AACb,cAAQ,IAAIC,IAAG,OAAO,2BAA2B,CAAC;AAClD,cAAQ,IAAIA,IAAG,OAAO,uCAAuC,CAAC;AAC9D,cAAQ,IAAI;AAAA,IACd;AAAA,EACF,WAAW,SAAS;AAClB,cAAU;AACV,WAAO,CAAC,WAAW,sBAAsB,cAAc,OAAO;AAC9D,QAAI,mBAAmB;AACrB,WAAK,KAAK,YAAY;AAAA,IACxB,OAAO;AACL,WAAK,KAAK,QAAQ;AAAA,IACpB;AAEA,SAAK,KAAK,GAAG,YAAY;AAAA,EAC3B,OAAO;AACL,cAAU;AACV,WAAO,CAAC,WAAW,cAAc,OAAO;AACxC,QAAI,mBAAmB;AACrB,WAAK,KAAK,YAAY;AAAA,IACxB,OAAO;AACL,WAAK,KAAK,QAAQ;AAAA,IACpB;AAEA,SAAK,KAAK,GAAG,YAAY;AAAA,EAC3B;AAEA,MAAI,SAAS;AACX,SAAK,KAAK,WAAW;AAAA,EACvB;AAEA,MAAI;AACF,IAAAC,UAAS,GAAG,OAAO,IAAI,KAAK,KAAK,GAAG,CAAC,IAAI;AAAA,MACvC,KAAK;AAAA,MACL,OAAO;AAAA,IACT,CAAC;AAAA,EACH,QAAQ;AACN,UAAM,IAAI,MAAM,GAAG,OAAO,IAAI,KAAK,KAAK,GAAG,CAAC,EAAE;AAAA,EAChD;AACF;AAmBA,IAAM,yBAAyB,OAC7B,MACA,SACA,OAAiB,CAAC,GAClB,iBAAiB,qCACjB,eAAe,wBACZ;AACH,MAAI;AACF,IAAAA,UAAS,GAAG,OAAO,IAAI,KAAK,KAAK,GAAG,CAAC,IAAI;AAAA,MACvC,KAAK;AAAA,MACL,OAAO;AAAA,IACT,CAAC;AACD,YAAQ,IAAID,IAAG,MAAM,cAAc,CAAC;AAAA,EACtC,QAAQ;AACN,YAAQ,IAAI;AACZ,YAAQ,IAAIA,IAAG,IAAI,YAAY,CAAC;AAChC,YAAQ,IAAI;AAAA,EACd;AACF;AAEA,SAAS,sBAAsB,kBAA0B;AAUvD,QAAM,YAAY,iBAAiB,YAAY,GAAG;AAElD,MAAI,cAAc,IAAI;AAEpB,UAAM,OAAO,iBAAiB,UAAU,GAAG,SAAS;AACpD,UAAM,UAAU,iBAAiB,UAAU,YAAY,CAAC;AAExD,WAAO,EAAE,MAAM,QAAQ;AAAA,EACzB,OAAO;AAEL,WAAO,EAAE,MAAM,kBAAkB,SAAS,GAAG;AAAA,EAC/C;AACF;AAEA,IAAM,MAAM,OAAO;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,wBAAwB,CAAC;AAAA,EACzB,eAAe,CAAC;AAAA,EAChB,kBAAkB,CAAC;AAAA,EACnB,sBAAsB;AAAA,EACtB,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,GAAG;AACL,MAAkB;AAChB,QAAM,WAAW,UAAU,MAAM,cAAc,OAAO,IAAI;AAE1D,MAAIE,GAAE,QAAQ,qBAAqB,GAAG;AACpC,YAAQ,IAAI;AACZ,YAAQ;AAAA,MACNF,IAAG;AAAA,QACD;AAAA,MACF;AAAA,IACF;AACA,YAAQ,IAAI;AACZ,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI;AACZ,UAAQ,IAAI,4BAA4B,OAAO,KAAK;AAEpD,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,CAAC;AAED,UAAQ,IAAI;AACZ,UAAQ,IAAIA,IAAG,MAAM,kCAAkC,CAAC;AACxD,UAAQ,IAAI;AAEZ,MAAI,qBAAqB;AACvB,YAAQ;AAAA,MACNA,IAAG,MAAM,2DAA2D;AAAA,IACtE;AACA,YAAQ,IAAIA,IAAG,MAAM,4BAA4B,CAAC;AAClD,YAAQ,IAAI;AAEZ,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,gBAAgB,SAAS,GAAG;AAC9B,cAAQ,IAAI;AACZ,cAAQ,IAAIA,IAAG,MAAM,+BAA+B,CAAC;AACrD,cAAQ,IAAI;AAEZ,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,OAAO;AACL,YAAQ,IAAIA,IAAG,OAAO,4BAA4B,CAAC;AACnD,UAAMG,eAAc,KAAK;AAAA,MACvBC,IAAG,aAAa,GAAG,IAAI,iBAAiB,MAAM;AAAA,IAChD;AAEA,UAAM,qBAAqB,CAAC,SAAmB;AAC7C,aAAO,KAAK;AAAA,QACV,CAAC,KAAK,SAAS;AACb,gBAAM,UAAU;AAChB,cAAI,4BAA4B,KAAK,IAAI,GAAG;AAC1C,kBAAM,EAAE,MAAM,QAAQ,IAAI,sBAAsB,IAAI;AACpD,oBAAQ,IAAI,IAAI;AAAA,UAClB,OAAO;AACL,oBAAQ,IAAI,IAAI;AAAA,UAClB;AACA,iBAAO;AAAA,QACT;AAAA,QACA,CAAC;AAAA,MACH;AAAA,IACF;AAEA,IAAAD,aAAY,eAAe,mBAAmB,YAAY;AAC1D,IAAAA,aAAY,kBAAkB,mBAAmB,eAAe;AAEhE,IAAAC,IAAG;AAAA,MACDC,MAAK,KAAK,MAAM,cAAc;AAAA,MAC9B,KAAK,UAAUF,cAAa,MAAM,CAAC,IAAIG,IAAG;AAAA,IAC5C;AAEA,YAAQ,IAAI;AACZ,YAAQ,IAAIN,IAAG,MAAM,oCAAoC,CAAC;AAC1D,YAAQ,IAAIA,IAAG,OAAO,OAAOA,IAAG,KAAK,cAAc,CAAC,cAAc,CAAC;AAAA,EACrE;AAEA,UAAQ,IAAI;AACZ,UAAQ,IAAI,gCAAgC;AAE5C,MAAI;AACF,UAAM,EAAE,WAAAO,WAAU,IAAK,MAAM,OAAO,YAAY;AAMhD,UAAM,MAAMA,WAAU,IAAI;AAC1B,UAAM,IAAI,KAAK;AACf,YAAQ,IAAIP,IAAG,MAAM,0CAA0C,CAAC;AAAA,EAClE,QAAQ;AACN,YAAQ,IAAI;AACZ,YAAQ;AAAA,MACNA,IAAG;AAAA,QACD;AAAA,MACF;AAAA,IACF;AACA,YAAQ,IAAI;AAAA,EACd;AAEA,MAAI,uBAAuB,UAAU;AACnC,UAAMG,eAAc,KAAK;AAAA,MACvBC,IAAG,aAAa,GAAG,IAAI,iBAAiB,MAAM;AAAA,IAChD;AAEA,UAAM,YAAY,YAAY;AAC5B,UAAI;AACF,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA,CAAC,QAAQ;AAAA,UACT;AAAA,UACA,gCAAgC,UAAU;AAAA,QAC5C;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,UAAM,aAAa,YAAY;AAC7B,UAAI;AACF,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA,CAAC,UAAU;AAAA,UACX;AAAA,UACA,uCAAuC,UAAU;AAAA,QACnD;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,QAAID,aAAY,WAAWA,aAAY,QAAQ,QAAQ,GAAG;AACxD,YAAM,UAAU;AAAA,IAClB;AACA,QAAIA,aAAY,WAAWA,aAAY,QAAQ,UAAU,GAAG;AAC1D,YAAM,WAAW;AAAA,IACnB;AAAA,EACF;AAGA,UAAQ,IAAI;AACZ,UAAQ,IAAIH,IAAG,MAAM,kCAAkC,UAAU,GAAG,CAAC;AACrE,UAAQ,IAAI;AACZ,UAAQ,IAAI,gBAAgB;AAC5B,UAAQ,IAAI;AACZ,UAAQ,IAAIA,IAAG,KAAK,QAAQ,OAAO,EAAE,CAAC;AACtC,UAAQ,IAAIA,IAAG,KAAK,KAAK,cAAc,EAAE,CAAC;AAE1C,QAAM,cAAc,KAAK;AAAA,IACvBI,IAAG,aAAa,GAAG,IAAI,iBAAiB,MAAM;AAAA,EAChD;AAEA,QAAM,iBAAiB,CAAC,cAAc,eAAe,OAAO,OAAO;AAEnE,aAAW,UAAU,gBAAgB;AACnC,QAAI,YAAY,WAAW,YAAY,QAAQ,MAAM,GAAG;AACtD,cAAQ,IAAIJ,IAAG,KAAK,KAAK,UAAU,IAAI,MAAM,EAAE,CAAC;AAChD;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,IAAI;AACZ,UAAQ,IAAIA,IAAG,MAAM,gBAAgB,CAAC;AACxC;AAaO,IAAM,YAAY,OAAO;AAAA,EAC9B;AAAA,EACA,UAAU;AAAA,EACV,wBAAwB,CAAC;AAAA,EACzB,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,GAAG;AACL,MAAwB;AACtB,QAAM,OAAOK,MAAK,QAAQ,IAAI;AAC9B,QAAM,UAAUA,MAAK,SAAS,IAAI;AAElC,EAAAD,IAAG,UAAU,MAAM;AAAA,IACjB,WAAW;AAAA,EACb,CAAC;AAED,UAAQ,IAAI,8BAA8BJ,IAAG,MAAM,IAAI,CAAC,GAAG;AAC3D,UAAQ,IAAI;AAEZ,QAAM,UAAU,cAAc,mBAAmB,UAAU,cAAc;AACzE,QAAM,UAAU,cAAc,mBAAmB,UAAU,cAAc;AACzE,QAAM,aAAa,UAAU,SAAS,UAAU,aAAa;AAC7D,QAAM,iBAAiB,UACnB,SACA,UACE,iBACA;AAEN,QAAM,EAAE,aAAa,cAAc,gBAAgB,IAAI,MAAM,aAAa;AAAA,IACxE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,EAAAI,IAAG;AAAA,IACDC,MAAK,KAAK,MAAM,cAAc;AAAA,IAC9B,KAAK,UAAU,aAAa,MAAM,CAAC,IAAIC,IAAG;AAAA,EAC5C;AAEA,QAAM,oBAAoB,QAAQ,IAAI;AACtC,UAAQ,MAAM,IAAI;AAClB,MAAI,CAAC,WAAW,CAAC,uBAAuB,GAAG;AACzC,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,CAACE,QAAO,UAAU,QAAQ,SAAS,UAAU,GAAG;AAClD,YAAQ;AAAA,MACNR,IAAG;AAAA,QACD,sBAAsB,QAAQ,OAAO;AAAA;AAAA;AAAA;AAAA,MAEvC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,SAAS;AACZ,UAAM,UAAU,gBAAgB;AAChC,QAAI,CAAC,QAAQ,WAAW;AACtB,UAAI,QAAQ,YAAY;AACtB,gBAAQ;AAAA,UACNA,IAAG;AAAA,YACD,qBAAqB,QAAQ,UAAU;AAAA;AAAA;AAAA;AAAA,UAEzC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS;AACX,QAAI,0BAA0B;AAC9B,QAAI;AACF,gCACEC,UAAS,6BAA6B,EAAE,SAAS,EAAE,KAAK,MACxD;AAAA,IACJ,QAAQ;AAAA,IAER;AACA,QAAI,OAAkC;AACpC,MAAAG,IAAG;AAAA,QACD,UAAQ,QAAQ,oBAAoB;AAAA,QACpCC,MAAK,KAAK,MAAM,WAAW;AAAA,QAC3B,EAAE,OAAO,KAAK;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,SAAO,IAAI;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,CAAC;AACH;;;ADzcO,IAAM,mBAAmB,CAC9B,iBACA,gBACG;AACH,MAAI,CAACI,QAAO,UAAU,QAAQ,SAAS,eAAe,GAAG;AACvD,YAAQ;AAAA,MACNC,IAAG;AAAA,QACD,wBAAwB,QAAQ,OAAO;AAAA,EAClC,WAAW,kBAAkB,eAAe;AAAA;AAAA,MAEnD;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEO,IAAM,wBAAwB,OAAO,gBAAwB;AAClE,MAAI;AACF,UAAM,WAAW,MAAM;AAAA,MACrB,wCAAwC,WAAW;AAAA,IACrD;AACA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC3C;AACA,UAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,QAAI,QAAQ,OAAO,SAAS,YAAY,YAAY,MAAM;AACxD,aAAO,OAAQ,KAAiC,QAAQ,CAAC;AAAA,IAC3D;AACA,WAAO;AAAA,EACT,QAAQ;AACN,QAAI;AACF,aAAOC,UAAS,YAAY,WAAW,UAAU,EAAE,SAAS,EAAE,KAAK;AAAA,IACrE,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,eAAe,YAAY;AACtC,UAAQ,IAAID,IAAG,KAAK,qBAAqB,CAAC;AAC1C,QAAM,OAAO,MAAM,QAAQ;AAAA,IACzB;AAAA,MACE,QAAQ,CAAC,MAAM,OAAO,UAAU,OAAO;AAAA,MACvC,UAAU,CAAC,QAAQ,OAAO,QAAQ,QAAQ,UAAU;AAAA,MACpD,UAAU,CAAC,UAAU,QAAQ,qBAAqB,WAAW,QAAQ;AAAA,IACvE;AAAA,IACA;AAAA,MACE,YAAY;AAAA,MACZ,cAAc;AAAA,IAChB;AAAA,EACF;AACA,UAAQ,IAAI,IAAI;AAChB,UAAQ,KAAK,CAAC;AAChB;AAgBO,IAAM,gBAAgB,OAC3B,aACA,SACA,qBACG;AACH,MAAI,QAAQ,MAAM;AAChB,UAAM,aAAa;AAAA,EACrB;AAEA,MAAI,OAAO,QAAQ,gBAAgB,aAAa;AAC9C,YAAQ,MAAM,uCAAuC;AACrD,YAAQ,IAAI,KAAKA,IAAG,KAAK,WAAW,CAAC,IAAIA,IAAG,MAAM,qBAAqB,CAAC,EAAE;AAC1E,YAAQ,IAAI;AACZ,YAAQ,IAAI,cAAc;AAC1B,YAAQ,IAAI,KAAKA,IAAG,KAAK,WAAW,CAAC,IAAIA,IAAG,MAAM,QAAQ,CAAC,EAAE;AAC7D,YAAQ,IAAI;AACZ,YAAQ,IAAI,OAAOA,IAAG,KAAK,GAAG,WAAW,SAAS,CAAC,sBAAsB;AACzE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,aAAa,MAAM,iBAAiB,OAAO;AACjD,QAAM,UAAU;AAAA,IACd,GAAG;AAAA,IACH,MAAM,WAAW;AAAA,IACjB,qBAAqB,QAAQ,WAAW;AAAA,EAC1C,CAAC;AACH;","names":["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.
|
|
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",
|