@icebreakers/monorepo 3.1.18 → 3.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/dist/cli.cjs +43 -27
- package/dist/cli.mjs +33 -15
- package/dist/index.cjs +25 -6
- package/dist/index.d.cts +56 -37
- package/dist/index.d.mts +56 -37
- package/dist/index.mjs +2 -2
- package/dist/{upgrade-DAoYVyhV.cjs → upgrade-CEd5cMQ-.cjs} +160 -192
- package/dist/{upgrade-BlCigUlp.mjs → upgrade-Zbej0CnL.mjs} +156 -175
- package/package.json +6 -11
- package/resources/skills/icebreakers-monorepo-cli/SKILL.md +43 -0
- package/resources/skills/icebreakers-monorepo-cli/references/commands.md +75 -0
- package/resources/skills/icebreakers-monorepo-cli/references/config.md +63 -0
- package/resources/skills/icebreakers-monorepo-cli/references/templates.md +21 -0
- package/assets/.changeset/config.json +0 -16
- package/assets/.dockerignore +0 -44
- package/assets/.editorconfig +0 -12
- package/assets/.gitattributes +0 -218
- package/assets/.github/FUNDING.yml +0 -4
- package/assets/.github/ISSUE_TEMPLATE/bug_report.yml +0 -71
- package/assets/.github/ISSUE_TEMPLATE/config.yml +0 -17
- package/assets/.github/workflows/ci.yml +0 -62
- package/assets/.github/workflows/release.yml +0 -57
- package/assets/.husky/commit-msg +0 -4
- package/assets/.husky/pre-commit +0 -4
- package/assets/.vscode/extensions.json +0 -6
- package/assets/.vscode/settings.json +0 -172
- package/assets/CODE_OF_CONDUCT.md +0 -128
- package/assets/CONTRIBUTING.md +0 -3
- package/assets/Dockerfile +0 -27
- package/assets/SECURITY.md +0 -21
- package/assets/commitlint.config.ts +0 -3
- package/assets/eslint.config.js +0 -7
- package/assets/gitignore +0 -38
- package/assets/lint-staged.config.js +0 -11
- package/assets/monorepo.config.ts +0 -22
- package/assets/netlify.toml +0 -14
- package/assets/package.json +0 -88
- package/assets/pnpm-workspace.yaml +0 -10
- package/assets/renovate.json +0 -28
- package/assets/stylelint.config.js +0 -3
- package/assets/tsconfig.json +0 -51
- package/assets/turbo.json +0 -74
- package/assets/vitest.config.ts +0 -123
- package/templates/apps/cli/bin/index.js +0 -2
- package/templates/apps/cli/dev/index.ts +0 -2
- package/templates/apps/cli/gitignore +0 -2
- package/templates/apps/cli/package.json +0 -35
- package/templates/apps/cli/src/cli.ts +0 -4
- package/templates/apps/cli/src/index.ts +0 -15
- package/templates/apps/cli/tsconfig.json +0 -7
- package/templates/apps/cli/tsup.config.ts +0 -13
- package/templates/apps/client/eslint.config.js +0 -12
- package/templates/apps/client/gitignore +0 -28
- package/templates/apps/client/index.html +0 -13
- package/templates/apps/client/package.json +0 -52
- package/templates/apps/client/public/vite.svg +0 -1
- package/templates/apps/client/src/App.vue +0 -11
- package/templates/apps/client/src/main.ts +0 -16
- package/templates/apps/client/src/pages/index.vue +0 -357
- package/templates/apps/client/src/query-keys.ts +0 -4
- package/templates/apps/client/src/router/index.ts +0 -13
- package/templates/apps/client/src/stores/i18n.ts +0 -24
- package/templates/apps/client/src/stores/index.ts +0 -15
- package/templates/apps/client/src/style.css +0 -1
- package/templates/apps/client/src/trpc/index.ts +0 -10
- package/templates/apps/client/src/vite-env.d.ts +0 -2
- package/templates/apps/client/tsconfig.app.json +0 -28
- package/templates/apps/client/tsconfig.json +0 -8
- package/templates/apps/client/tsconfig.node.json +0 -25
- package/templates/apps/client/tsconfig.worker.json +0 -11
- package/templates/apps/client/vite.config.ts +0 -57
- package/templates/apps/client/worker/app.ts +0 -24
- package/templates/apps/client/worker/config.ts +0 -1
- package/templates/apps/client/worker/fetch-entry.ts +0 -5
- package/templates/apps/client/worker/node-entry.ts +0 -13
- package/templates/apps/client/worker/trpc-router.ts +0 -24
- package/templates/apps/client/wrangler.jsonc +0 -24
- package/templates/apps/server/gitignore +0 -2
- package/templates/apps/server/package.json +0 -60
- package/templates/apps/server/src/app.ts +0 -191
- package/templates/apps/server/src/config.ts +0 -1
- package/templates/apps/server/src/fetch-entry.ts +0 -5
- package/templates/apps/server/src/node-entry.ts +0 -13
- package/templates/apps/server/test/index.test.ts +0 -14
- package/templates/apps/server/tsconfig.json +0 -24
- package/templates/apps/server/tsup.config.ts +0 -13
- package/templates/apps/server/vitest.config.ts +0 -15
- package/templates/apps/server/wrangler.jsonc +0 -18
- package/templates/apps/website/.vitepress/config.ts +0 -93
- package/templates/apps/website/.vitepress/theme/index.ts +0 -4
- package/templates/apps/website/.vitepress/theme/tailwind.css +0 -1
- package/templates/apps/website/gitignore +0 -1
- package/templates/apps/website/index.md +0 -127
- package/templates/apps/website/monorepo/index.md +0 -46
- package/templates/apps/website/monorepo/manage.md +0 -126
- package/templates/apps/website/monorepo/publish.md +0 -142
- package/templates/apps/website/package.json +0 -39
- package/templates/apps/website/public/logo.jpg +0 -0
- package/templates/apps/website/thinking.md +0 -88
- package/templates/apps/website/tools/changeset.md +0 -87
- package/templates/apps/website/tools/husky.md +0 -108
- package/templates/apps/website/tools/lint-staged.md +0 -79
- package/templates/apps/website/tools/pnpm.md +0 -100
- package/templates/apps/website/tools/renovate.md +0 -91
- package/templates/apps/website/tools/turborepo.md +0 -149
- package/templates/apps/website/why/assets/npm-dt.svg +0 -15
- package/templates/apps/website/why/assets/npm-ts.svg +0 -19
- package/templates/apps/website/why/examples/0.npm-basic-package/index.js +0 -10
- package/templates/apps/website/why/examples/0.npm-basic-package/package.json +0 -11
- package/templates/apps/website/why/examples/1.npm-basic-package/index.cjs +0 -12
- package/templates/apps/website/why/examples/1.npm-basic-package/index.d.ts +0 -1
- package/templates/apps/website/why/examples/1.npm-basic-package/index.js +0 -8
- package/templates/apps/website/why/examples/1.npm-basic-package/package.json +0 -19
- package/templates/apps/website/why/examples/2.npm-basic-package/README.md +0 -1
- package/templates/apps/website/why/examples/2.npm-basic-package/package-lock.json +0 -30
- package/templates/apps/website/why/examples/2.npm-basic-package/package.json +0 -35
- package/templates/apps/website/why/examples/2.npm-basic-package/rename-ext.js +0 -24
- package/templates/apps/website/why/examples/2.npm-basic-package/src/index.ts +0 -8
- package/templates/apps/website/why/examples/2.npm-basic-package/tsconfig.cjs.json +0 -8
- package/templates/apps/website/why/examples/2.npm-basic-package/tsconfig.esm.json +0 -7
- package/templates/apps/website/why/examples/2.npm-basic-package/tsconfig.json +0 -18
- package/templates/apps/website/why/examples/3.npm-basic-package/README.md +0 -1
- package/templates/apps/website/why/examples/3.npm-basic-package/build.config.ts +0 -24
- package/templates/apps/website/why/examples/3.npm-basic-package/package-lock.json +0 -3661
- package/templates/apps/website/why/examples/3.npm-basic-package/package.json +0 -32
- package/templates/apps/website/why/examples/3.npm-basic-package/src/index.ts +0 -8
- package/templates/apps/website/why/examples/3.npm-basic-package/tsconfig.json +0 -16
- package/templates/apps/website/why/examples/3.npm-basic-package/tsup.config.ts +0 -16
- package/templates/apps/website/why/examples/usage-cjs/cjs.cjs +0 -4
- package/templates/apps/website/why/examples/usage-cjs/esm.mjs +0 -4
- package/templates/apps/website/why/examples/usage-cjs/index.js +0 -12
- package/templates/apps/website/why/examples/usage-cjs/package-lock.json +0 -42
- package/templates/apps/website/why/examples/usage-cjs/package.json +0 -20
- package/templates/apps/website/why/examples/usage-esm/cjs.cjs +0 -4
- package/templates/apps/website/why/examples/usage-esm/createRequire.js +0 -7
- package/templates/apps/website/why/examples/usage-esm/esm.mjs +0 -4
- package/templates/apps/website/why/examples/usage-esm/index.js +0 -8
- package/templates/apps/website/why/examples/usage-esm/package-lock.json +0 -42
- package/templates/apps/website/why/examples/usage-esm/package.json +0 -21
- package/templates/apps/website/why/how-to-reuse-js-code.md +0 -250
- package/templates/apps/website/why/index.md +0 -1
- package/templates/apps/website/why/js-cjs-mjs.md +0 -99
- package/templates/apps/website/why/js-keywords.md +0 -132
- package/templates/apps/website/why/modern/bundlers.md +0 -79
- package/templates/apps/website/why/modern/dts.md +0 -93
- package/templates/apps/website/why/modern/esm-vs-cjs.md +0 -84
- package/templates/apps/website/why/modern/index.md +0 -55
- package/templates/apps/website/why/modern/package-entry-points.md +0 -128
- package/templates/apps/website/why/modern/typescript.md +0 -155
- package/templates/apps/website/why/publish-basic-npm-package.md +0 -146
- package/templates/apps/website/why/what-is-npm-package.md +0 -162
- package/templates/packages/tsdown-template/package.json +0 -47
- package/templates/packages/tsdown-template/src/index.ts +0 -5
- package/templates/packages/tsdown-template/test/index.test.ts +0 -11
- package/templates/packages/tsdown-template/tsconfig.json +0 -15
- package/templates/packages/tsdown-template/tsdown.config.ts +0 -9
- package/templates/packages/tsdown-template/vitest.config.ts +0 -15
- package/templates/packages/tsup-template/build.config.ts +0 -24
- package/templates/packages/tsup-template/package.json +0 -48
- package/templates/packages/tsup-template/src/index.ts +0 -12
- package/templates/packages/tsup-template/test/index.test.ts +0 -18
- package/templates/packages/tsup-template/tsconfig.json +0 -15
- package/templates/packages/tsup-template/tsup.config.ts +0 -18
- package/templates/packages/tsup-template/vitest.config.ts +0 -15
- package/templates/packages/unbuild-template/build.config.ts +0 -24
- package/templates/packages/unbuild-template/package.json +0 -48
- package/templates/packages/unbuild-template/src/index.ts +0 -9
- package/templates/packages/unbuild-template/src/utils.ts +0 -3
- package/templates/packages/unbuild-template/test/index.test.ts +0 -18
- package/templates/packages/unbuild-template/tsconfig.json +0 -15
- package/templates/packages/unbuild-template/vitest.config.ts +0 -15
- package/templates/packages/vue-lib-template/eslint.config.js +0 -12
- package/templates/packages/vue-lib-template/gitignore +0 -1
- package/templates/packages/vue-lib-template/index.html +0 -13
- package/templates/packages/vue-lib-template/lib/HelloWorld.vue +0 -21
- package/templates/packages/vue-lib-template/lib/index.ts +0 -3
- package/templates/packages/vue-lib-template/package.json +0 -61
- package/templates/packages/vue-lib-template/src/App.vue +0 -9
- package/templates/packages/vue-lib-template/src/main.ts +0 -8
- package/templates/packages/vue-lib-template/src/pages/index.vue +0 -7
- package/templates/packages/vue-lib-template/src/router/index.ts +0 -11
- package/templates/packages/vue-lib-template/src/style.css +0 -1
- package/templates/packages/vue-lib-template/src/vite-env.d.ts +0 -2
- package/templates/packages/vue-lib-template/test/index.test.ts +0 -13
- package/templates/packages/vue-lib-template/tsconfig.app.json +0 -30
- package/templates/packages/vue-lib-template/tsconfig.json +0 -14
- package/templates/packages/vue-lib-template/tsconfig.node.json +0 -25
- package/templates/packages/vue-lib-template/tsconfig.test.json +0 -40
- package/templates/packages/vue-lib-template/vite.config.ts +0 -54
- package/templates/packages/vue-lib-template/vite.shared.config.ts +0 -13
- package/templates/packages/vue-lib-template/vitest.config.ts +0 -13
- /package/{assets/LICENSE → LICENSE} +0 -0
|
@@ -39,23 +39,21 @@ node_process = __toESM(node_process);
|
|
|
39
39
|
let fs_extra = require("fs-extra");
|
|
40
40
|
fs_extra = __toESM(fs_extra);
|
|
41
41
|
let consola = require("consola");
|
|
42
|
-
let
|
|
43
|
-
_inquirer_checkbox = __toESM(_inquirer_checkbox);
|
|
42
|
+
let _icebreakers_monorepo_templates = require("@icebreakers/monorepo-templates");
|
|
44
43
|
let c12 = require("c12");
|
|
45
|
-
let
|
|
46
|
-
|
|
44
|
+
let node_os = require("node:os");
|
|
45
|
+
node_os = __toESM(node_os);
|
|
47
46
|
let node_path = require("node:path");
|
|
48
47
|
node_path = __toESM(node_path);
|
|
49
48
|
let node_url = require("node:url");
|
|
49
|
+
let picocolors = require("picocolors");
|
|
50
|
+
picocolors = __toESM(picocolors);
|
|
50
51
|
let yaml = require("yaml");
|
|
51
52
|
yaml = __toESM(yaml);
|
|
52
53
|
let node_crypto = require("node:crypto");
|
|
53
54
|
node_crypto = __toESM(node_crypto);
|
|
54
55
|
require("@pnpm/types");
|
|
55
56
|
let comment_json = require("comment-json");
|
|
56
|
-
let node_os = require("node:os");
|
|
57
|
-
node_os = __toESM(node_os);
|
|
58
|
-
let execa = require("execa");
|
|
59
57
|
let p_queue = require("p-queue");
|
|
60
58
|
p_queue = __toESM(p_queue);
|
|
61
59
|
let klaw = require("klaw");
|
|
@@ -250,7 +248,8 @@ async function getWorkspacePackages(workspaceDir, options) {
|
|
|
250
248
|
ignorePrivatePackage: true
|
|
251
249
|
});
|
|
252
250
|
const manifest = await (0, _pnpm_workspace_read_manifest.readWorkspaceManifest)(workspaceDir);
|
|
253
|
-
|
|
251
|
+
const workspacePatterns = patterns ?? manifest?.packages;
|
|
252
|
+
let pkgs = (await (0, _pnpm_workspace_find_packages.findWorkspacePackages)(workspaceDir, workspacePatterns ? { patterns: workspacePatterns } : {})).filter((x) => {
|
|
254
253
|
if (ignorePrivatePackage && x.manifest.private) return false;
|
|
255
254
|
return true;
|
|
256
255
|
}).map((project) => {
|
|
@@ -568,6 +567,72 @@ async function resolveCommandConfig(name$1, cwd) {
|
|
|
568
567
|
return ((await loadMonorepoConfig(cwd)).commands ?? {})[name$1] ?? {};
|
|
569
568
|
}
|
|
570
569
|
|
|
570
|
+
//#endregion
|
|
571
|
+
//#region package.json
|
|
572
|
+
var name = "@icebreakers/monorepo";
|
|
573
|
+
var version = "3.2.1";
|
|
574
|
+
|
|
575
|
+
//#endregion
|
|
576
|
+
//#region src/constants.ts
|
|
577
|
+
/**
|
|
578
|
+
* 还原出 package.json 所在的绝对路径,方便后续按目录组织资源文件。
|
|
579
|
+
*/
|
|
580
|
+
const packageJsonPath = (0, node_url.fileURLToPath)(new URL("../package.json", require("url").pathToFileURL(__filename).href));
|
|
581
|
+
/**
|
|
582
|
+
* @icebreakers/monorepo 包的根目录。
|
|
583
|
+
*/
|
|
584
|
+
const packageDir = node_path.dirname(packageJsonPath);
|
|
585
|
+
/**
|
|
586
|
+
* monorepo 根目录,方便需要跳出当前包的逻辑(例如定位工作区文件)。
|
|
587
|
+
*/
|
|
588
|
+
const rootDir = node_path.resolve(packageDir, "..", "..");
|
|
589
|
+
|
|
590
|
+
//#endregion
|
|
591
|
+
//#region src/commands/skills.ts
|
|
592
|
+
const skillName = "icebreakers-monorepo-cli";
|
|
593
|
+
const skillTargets = ["codex", "claude"];
|
|
594
|
+
const skillSourceDir = pathe.default.join(packageDir, "resources", "skills", skillName);
|
|
595
|
+
function getSkillTargetPaths(homeDir = node_os.default.homedir()) {
|
|
596
|
+
return {
|
|
597
|
+
codex: pathe.default.join(homeDir, ".codex", "skills", skillName),
|
|
598
|
+
claude: pathe.default.join(homeDir, ".claude", "skills", skillName)
|
|
599
|
+
};
|
|
600
|
+
}
|
|
601
|
+
function normalizeTargets(values) {
|
|
602
|
+
if (!values?.length) return;
|
|
603
|
+
return Array.from(new Set(values));
|
|
604
|
+
}
|
|
605
|
+
async function syncSkills(options = {}) {
|
|
606
|
+
const cwd = options.cwd ?? node_process.default.cwd();
|
|
607
|
+
if (!await fs_extra.default.pathExists(skillSourceDir)) {
|
|
608
|
+
const relative = pathe.default.relative(cwd, skillSourceDir);
|
|
609
|
+
throw new Error(`未找到技能目录:${relative || skillSourceDir}`);
|
|
610
|
+
}
|
|
611
|
+
let targets = normalizeTargets(options.targets);
|
|
612
|
+
if (!targets?.length) targets = normalizeTargets(await (0, _icebreakers_monorepo_templates.checkbox)({
|
|
613
|
+
message: "请选择需要同步的技能目标",
|
|
614
|
+
choices: skillTargets.map((target) => ({
|
|
615
|
+
name: target,
|
|
616
|
+
value: target,
|
|
617
|
+
checked: true
|
|
618
|
+
}))
|
|
619
|
+
}));
|
|
620
|
+
if (!targets?.length) return [];
|
|
621
|
+
const targetPaths = getSkillTargetPaths();
|
|
622
|
+
const results = [];
|
|
623
|
+
for (const target of targets) {
|
|
624
|
+
const dest = targetPaths[target];
|
|
625
|
+
await fs_extra.default.remove(dest);
|
|
626
|
+
await fs_extra.default.ensureDir(pathe.default.dirname(dest));
|
|
627
|
+
await fs_extra.default.copy(skillSourceDir, dest);
|
|
628
|
+
results.push({
|
|
629
|
+
target,
|
|
630
|
+
dest
|
|
631
|
+
});
|
|
632
|
+
}
|
|
633
|
+
return results;
|
|
634
|
+
}
|
|
635
|
+
|
|
571
636
|
//#endregion
|
|
572
637
|
//#region src/commands/clean.ts
|
|
573
638
|
var import_set_value = /* @__PURE__ */ __toESM(require_set_value(), 1);
|
|
@@ -594,7 +659,7 @@ async function cleanProjects(cwd, overrides) {
|
|
|
594
659
|
});
|
|
595
660
|
let cleanDirs = [];
|
|
596
661
|
if (cleanConfig?.autoConfirm) cleanDirs = filteredPackages.map((pkg) => pkg.rootDir);
|
|
597
|
-
else cleanDirs = await (0,
|
|
662
|
+
else cleanDirs = await (0, _icebreakers_monorepo_templates.checkbox)({
|
|
598
663
|
message: "请选择需要清理的目录",
|
|
599
664
|
choices: filteredPackages.map((x) => {
|
|
600
665
|
const baseChoice = {
|
|
@@ -610,10 +675,12 @@ async function cleanProjects(cwd, overrides) {
|
|
|
610
675
|
});
|
|
611
676
|
const readmeZh = pathe.default.resolve(workspaceDir, "README.zh-CN.md");
|
|
612
677
|
const qoderDir = pathe.default.resolve(workspaceDir, ".qoder");
|
|
678
|
+
const skillTargets$1 = Object.values(getSkillTargetPaths());
|
|
613
679
|
const candidates = Array.from(new Set([
|
|
614
680
|
...cleanDirs.filter(Boolean),
|
|
615
681
|
readmeZh,
|
|
616
|
-
qoderDir
|
|
682
|
+
qoderDir,
|
|
683
|
+
...skillTargets$1
|
|
617
684
|
]));
|
|
618
685
|
await Promise.all(candidates.map(async (dir) => {
|
|
619
686
|
if (await fs_extra.default.pathExists(dir)) await fs_extra.default.remove(dir);
|
|
@@ -624,34 +691,6 @@ async function cleanProjects(cwd, overrides) {
|
|
|
624
691
|
await fs_extra.default.outputJson(name$1, pkgJson, { spaces: 2 });
|
|
625
692
|
}
|
|
626
693
|
|
|
627
|
-
//#endregion
|
|
628
|
-
//#region package.json
|
|
629
|
-
var name = "@icebreakers/monorepo";
|
|
630
|
-
var version = "3.1.18";
|
|
631
|
-
|
|
632
|
-
//#endregion
|
|
633
|
-
//#region src/constants.ts
|
|
634
|
-
/**
|
|
635
|
-
* 还原出 package.json 所在的绝对路径,方便后续按目录组织资源文件。
|
|
636
|
-
*/
|
|
637
|
-
const packageJsonPath = (0, node_url.fileURLToPath)(new URL("../package.json", require("url").pathToFileURL(__filename).href));
|
|
638
|
-
/**
|
|
639
|
-
* @icebreakers/monorepo 包的根目录,所有模板与资产目录都以此为基准。
|
|
640
|
-
*/
|
|
641
|
-
const packageDir = node_path.default.dirname(packageJsonPath);
|
|
642
|
-
/**
|
|
643
|
-
* CLI 提供的模板目录,`monorepo new` 会从这里复制目标工程骨架。
|
|
644
|
-
*/
|
|
645
|
-
const templatesDir = node_path.default.join(packageDir, "templates");
|
|
646
|
-
/**
|
|
647
|
-
* 升级命令需要写入的静态文件集合,位于 assets 目录中。
|
|
648
|
-
*/
|
|
649
|
-
const assetsDir = node_path.default.join(packageDir, "assets");
|
|
650
|
-
/**
|
|
651
|
-
* monorepo 根目录,方便需要跳出当前包的逻辑(例如定位工作区文件)。
|
|
652
|
-
*/
|
|
653
|
-
const rootDir = node_path.default.resolve(packageDir, "..", "..");
|
|
654
|
-
|
|
655
694
|
//#endregion
|
|
656
695
|
//#region src/utils/fs.ts
|
|
657
696
|
/**
|
|
@@ -702,54 +741,6 @@ function updateIssueTemplateConfig(source, repoName) {
|
|
|
702
741
|
return doc.toString();
|
|
703
742
|
}
|
|
704
743
|
|
|
705
|
-
//#endregion
|
|
706
|
-
//#region src/utils/gitignore.ts
|
|
707
|
-
/**
|
|
708
|
-
* Utilities to handle renaming `.gitignore` files when packaging templates.
|
|
709
|
-
* pnpm publish strips `.gitignore`, so we temporarily rename them to `gitignore`
|
|
710
|
-
* and convert them back when writing into workspaces.
|
|
711
|
-
*/
|
|
712
|
-
const publishBasename = "gitignore";
|
|
713
|
-
const workspaceBasename = ".gitignore";
|
|
714
|
-
function detectSeparator(input) {
|
|
715
|
-
if (input.includes("\\") && !input.includes("/")) return "\\";
|
|
716
|
-
return "/";
|
|
717
|
-
}
|
|
718
|
-
function replaceBasename(input, from, to) {
|
|
719
|
-
if (!input) return input;
|
|
720
|
-
const separator = detectSeparator(input);
|
|
721
|
-
const normalized = input.replace(/[\\/]/g, separator);
|
|
722
|
-
const hasTrailingSeparator = normalized.endsWith(separator);
|
|
723
|
-
const segments = normalized.split(separator);
|
|
724
|
-
if (hasTrailingSeparator && segments[segments.length - 1] === "") segments.pop();
|
|
725
|
-
const lastIndex = segments.length - 1;
|
|
726
|
-
if (lastIndex >= 0 && segments[lastIndex] === from) {
|
|
727
|
-
segments[lastIndex] = to;
|
|
728
|
-
const rebuilt = segments.join(separator);
|
|
729
|
-
return hasTrailingSeparator ? `${rebuilt}${separator}` : rebuilt;
|
|
730
|
-
}
|
|
731
|
-
return input;
|
|
732
|
-
}
|
|
733
|
-
/**
|
|
734
|
-
* Map a workspace path (containing `.gitignore`) to its packaged variant.
|
|
735
|
-
*/
|
|
736
|
-
function toPublishGitignorePath(input) {
|
|
737
|
-
return replaceBasename(input, workspaceBasename, publishBasename);
|
|
738
|
-
}
|
|
739
|
-
/**
|
|
740
|
-
* Map a packaged path (containing `gitignore`) back to the workspace form.
|
|
741
|
-
*/
|
|
742
|
-
function toWorkspaceGitignorePath(input) {
|
|
743
|
-
return replaceBasename(input, publishBasename, workspaceBasename);
|
|
744
|
-
}
|
|
745
|
-
/**
|
|
746
|
-
* Convenient helper to check whether a filename (with or without dot prefix)
|
|
747
|
-
* should be treated as a gitignore file.
|
|
748
|
-
*/
|
|
749
|
-
function isGitignoreFile(name$1) {
|
|
750
|
-
return toPublishGitignorePath(name$1) !== name$1 || toWorkspaceGitignorePath(name$1) !== name$1;
|
|
751
|
-
}
|
|
752
|
-
|
|
753
744
|
//#endregion
|
|
754
745
|
//#region src/utils/hash.ts
|
|
755
746
|
/**
|
|
@@ -791,18 +782,49 @@ function isMatch(str, arr) {
|
|
|
791
782
|
//#endregion
|
|
792
783
|
//#region src/commands/create.ts
|
|
793
784
|
/**
|
|
794
|
-
* 内置模板映射表,
|
|
785
|
+
* 内置模板映射表,source 指向 templates 根目录下的来源目录,target 为生成路径。
|
|
795
786
|
*/
|
|
796
787
|
const templateMap = {
|
|
797
|
-
"tsup":
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
"
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
788
|
+
"tsup": {
|
|
789
|
+
source: "tsup",
|
|
790
|
+
target: "packages/tsup"
|
|
791
|
+
},
|
|
792
|
+
"tsdown": {
|
|
793
|
+
source: "tsdown",
|
|
794
|
+
target: "packages/tsdown"
|
|
795
|
+
},
|
|
796
|
+
"unbuild": {
|
|
797
|
+
source: "unbuild",
|
|
798
|
+
target: "packages/unbuild"
|
|
799
|
+
},
|
|
800
|
+
"vue-lib": {
|
|
801
|
+
source: "vue-lib",
|
|
802
|
+
target: "packages/vue-lib"
|
|
803
|
+
},
|
|
804
|
+
"hono-server": {
|
|
805
|
+
source: "server",
|
|
806
|
+
target: "apps/server"
|
|
807
|
+
},
|
|
808
|
+
"vue-hono": {
|
|
809
|
+
source: "client",
|
|
810
|
+
target: "apps/client"
|
|
811
|
+
},
|
|
812
|
+
"vitepress": {
|
|
813
|
+
source: "vitepress",
|
|
814
|
+
target: "apps/website"
|
|
815
|
+
},
|
|
816
|
+
"cli": {
|
|
817
|
+
source: "cli",
|
|
818
|
+
target: "apps/cli"
|
|
819
|
+
}
|
|
805
820
|
};
|
|
821
|
+
function normalizeTemplateDefinition(value) {
|
|
822
|
+
if (typeof value === "string") return {
|
|
823
|
+
source: value,
|
|
824
|
+
target: value
|
|
825
|
+
};
|
|
826
|
+
return value;
|
|
827
|
+
}
|
|
806
828
|
const defaultTemplate = "unbuild";
|
|
807
829
|
/**
|
|
808
830
|
* 交互式选择模板时的默认选项列表。
|
|
@@ -852,8 +874,8 @@ function getCreateChoices(choices) {
|
|
|
852
874
|
* 合并内置与自定义模板映射,允许扩展新的模板类型。
|
|
853
875
|
*/
|
|
854
876
|
function getTemplateMap(extra) {
|
|
855
|
-
const base =
|
|
856
|
-
if (extra && Object.keys(extra).length) Object.
|
|
877
|
+
const base = Object.fromEntries(Object.entries(templateMap).map(([key, value]) => [key, normalizeTemplateDefinition(value)]));
|
|
878
|
+
if (extra && Object.keys(extra).length) for (const [key, value] of Object.entries(extra)) base[key] = normalizeTemplateDefinition(value);
|
|
857
879
|
return base;
|
|
858
880
|
}
|
|
859
881
|
async function applyGitMetadata(pkgJson, repoDir, targetDir) {
|
|
@@ -885,24 +907,23 @@ async function createNewProject(options) {
|
|
|
885
907
|
const name$1 = typeof rawName === "string" ? rawName.trim() : void 0;
|
|
886
908
|
const requestedTemplate = options?.type ?? createConfig?.type ?? createConfig?.defaultTemplate ?? defaultTemplate;
|
|
887
909
|
const templateDefinitions = getTemplateMap(createConfig?.templateMap);
|
|
888
|
-
const templatesRoot = createConfig?.templatesDir ? pathe.default.resolve(cwd, createConfig.templatesDir) : templatesDir;
|
|
910
|
+
const templatesRoot = createConfig?.templatesDir ? pathe.default.resolve(cwd, createConfig.templatesDir) : _icebreakers_monorepo_templates.templatesDir;
|
|
889
911
|
const fallbackTemplate = createConfig?.defaultTemplate ?? defaultTemplate;
|
|
890
912
|
const bundlerName = typeof requestedTemplate === "string" && templateDefinitions[requestedTemplate] ? requestedTemplate : fallbackTemplate;
|
|
891
|
-
const
|
|
892
|
-
if (!
|
|
893
|
-
const from = pathe.default.join(templatesRoot,
|
|
894
|
-
const targetName = name$1 && name$1.length > 0 ? name$1 :
|
|
913
|
+
const templateDefinition = templateDefinitions[bundlerName];
|
|
914
|
+
if (!templateDefinition) throw new Error(`未找到名为 ${bundlerName} 的模板,请检查 monorepo.config.ts`);
|
|
915
|
+
const from = pathe.default.join(templatesRoot, templateDefinition.source);
|
|
916
|
+
const targetName = name$1 && name$1.length > 0 ? name$1 : templateDefinition.target;
|
|
895
917
|
const to = pathe.default.join(cwd, targetName);
|
|
896
918
|
if (await fs_extra.default.pathExists(to)) throw new Error(`${picocolors.default.red("目标目录已存在")}: ${pathe.default.relative(cwd, to)}`);
|
|
897
919
|
await fs_extra.default.ensureDir(to);
|
|
898
920
|
const filelist = await fs_extra.default.readdir(from);
|
|
899
|
-
const shouldSkip = (src) =>
|
|
921
|
+
const shouldSkip = (src) => (0, _icebreakers_monorepo_templates.shouldSkipTemplatePath)(from, src);
|
|
900
922
|
const copyTasks = filelist.filter((filename) => filename !== "package.json").map(async (filename) => {
|
|
901
923
|
const sourcePath = pathe.default.resolve(from, filename);
|
|
902
|
-
const targetPath = pathe.default.resolve(to, toWorkspaceGitignorePath(filename));
|
|
924
|
+
const targetPath = pathe.default.resolve(to, (0, _icebreakers_monorepo_templates.toWorkspaceGitignorePath)(filename));
|
|
903
925
|
await fs_extra.default.copy(sourcePath, targetPath, { filter(src) {
|
|
904
|
-
|
|
905
|
-
return true;
|
|
926
|
+
return !shouldSkip(src);
|
|
906
927
|
} });
|
|
907
928
|
});
|
|
908
929
|
await Promise.all(copyTasks);
|
|
@@ -1148,7 +1169,7 @@ async function syncNpmMirror(cwd, options) {
|
|
|
1148
1169
|
for (const pkgName of set$6) {
|
|
1149
1170
|
if (!pkgName) continue;
|
|
1150
1171
|
tasks.push(queue.add(async () => {
|
|
1151
|
-
return (0,
|
|
1172
|
+
return (0, _icebreakers_monorepo_templates.execaCommand)(renderCommand(template, pkgName), { stdio: "inherit" });
|
|
1152
1173
|
}));
|
|
1153
1174
|
}
|
|
1154
1175
|
await Promise.all(tasks);
|
|
@@ -1206,7 +1227,7 @@ async function scheduleOverwrite(intent, options) {
|
|
|
1206
1227
|
}
|
|
1207
1228
|
async function flushPendingOverwrites(pending) {
|
|
1208
1229
|
if (!pending.length) return;
|
|
1209
|
-
const selected = await (0,
|
|
1230
|
+
const selected = await (0, _icebreakers_monorepo_templates.checkbox)({
|
|
1210
1231
|
message: "检测到以下文件内容与当前仓库不同,选择需要覆盖的文件",
|
|
1211
1232
|
choices: pending.map((item) => ({
|
|
1212
1233
|
name: picocolors.default.greenBright(item.relPath),
|
|
@@ -1297,38 +1318,6 @@ function setPkgJson(sourcePkgJson, targetPkgJson, options) {
|
|
|
1297
1318
|
}
|
|
1298
1319
|
}
|
|
1299
1320
|
|
|
1300
|
-
//#endregion
|
|
1301
|
-
//#region src/commands/upgrade/targets.ts
|
|
1302
|
-
/**
|
|
1303
|
-
* 根据 core 模式返回需要同步的资产目录。
|
|
1304
|
-
* core=true 时仅包含最小集,便于内联到其他项目。
|
|
1305
|
-
*/
|
|
1306
|
-
function getAssetTargets(core) {
|
|
1307
|
-
const list = [
|
|
1308
|
-
".changeset",
|
|
1309
|
-
".husky",
|
|
1310
|
-
".vscode",
|
|
1311
|
-
".editorconfig",
|
|
1312
|
-
".gitattributes",
|
|
1313
|
-
".gitignore",
|
|
1314
|
-
".npmrc",
|
|
1315
|
-
"commitlint.config.ts",
|
|
1316
|
-
"eslint.config.js",
|
|
1317
|
-
"lint-staged.config.js",
|
|
1318
|
-
"stylelint.config.js",
|
|
1319
|
-
"monorepo.config.ts",
|
|
1320
|
-
"package.json",
|
|
1321
|
-
"pnpm-workspace.yaml",
|
|
1322
|
-
"tsconfig.json",
|
|
1323
|
-
"turbo.json",
|
|
1324
|
-
"vitest.config.ts",
|
|
1325
|
-
"Dockerfile",
|
|
1326
|
-
".dockerignore"
|
|
1327
|
-
];
|
|
1328
|
-
if (!core) list.push(".github", "LICENSE", "renovate.json", "SECURITY.md", "CODE_OF_CONDUCT.md", "CONTRIBUTING.md", "netlify.toml");
|
|
1329
|
-
return list;
|
|
1330
|
-
}
|
|
1331
|
-
|
|
1332
1321
|
//#endregion
|
|
1333
1322
|
//#region src/commands/upgrade/workspace.ts
|
|
1334
1323
|
function isPlainObject(value) {
|
|
@@ -1404,11 +1393,11 @@ async function upgradeMonorepo(opts) {
|
|
|
1404
1393
|
const repoName = await new GitClient({ baseDir: cwd }).getRepoName();
|
|
1405
1394
|
const useCoreAssets = merged.core ?? false;
|
|
1406
1395
|
merged.core = useCoreAssets;
|
|
1407
|
-
const baseTargets = getAssetTargets(useCoreAssets);
|
|
1396
|
+
const baseTargets = (0, _icebreakers_monorepo_templates.getAssetTargets)(useCoreAssets);
|
|
1408
1397
|
const configTargets = upgradeConfig?.targets ?? [];
|
|
1409
1398
|
const mergeTargets = upgradeConfig?.mergeTargets;
|
|
1410
1399
|
let targets = configTargets.length ? mergeTargets === false ? [...configTargets] : Array.from(new Set([...baseTargets, ...configTargets])) : baseTargets;
|
|
1411
|
-
if (merged.interactive) targets = await (0,
|
|
1400
|
+
if (merged.interactive) targets = await (0, _icebreakers_monorepo_templates.checkbox)({
|
|
1412
1401
|
message: "选择你需要的文件",
|
|
1413
1402
|
choices: targets.map((x) => {
|
|
1414
1403
|
return {
|
|
@@ -1423,12 +1412,18 @@ async function upgradeMonorepo(opts) {
|
|
|
1423
1412
|
const skipChangesetMarkdown = upgradeConfig?.skipChangesetMarkdown ?? true;
|
|
1424
1413
|
const scriptOverrides = upgradeConfig?.scripts;
|
|
1425
1414
|
const skipOverwrite = merged.skipOverwrite;
|
|
1415
|
+
const buildWriteIntentOptions = (source) => {
|
|
1416
|
+
return skipOverwrite === void 0 ? { source } : {
|
|
1417
|
+
skipOverwrite,
|
|
1418
|
+
source
|
|
1419
|
+
};
|
|
1420
|
+
};
|
|
1426
1421
|
const pendingOverwrites = [];
|
|
1427
|
-
for await (const file of (0, klaw.default)(assetsDir, { filter(p) {
|
|
1428
|
-
return isMatch(toWorkspaceGitignorePath(pathe.default.relative(assetsDir, p)), regexpArr);
|
|
1422
|
+
for await (const file of (0, klaw.default)(_icebreakers_monorepo_templates.assetsDir, { filter(p) {
|
|
1423
|
+
return isMatch((0, _icebreakers_monorepo_templates.toWorkspaceGitignorePath)(pathe.default.relative(_icebreakers_monorepo_templates.assetsDir, p)), regexpArr);
|
|
1429
1424
|
} })) {
|
|
1430
1425
|
if (!file.stats.isFile()) continue;
|
|
1431
|
-
const relPath = toWorkspaceGitignorePath(pathe.default.relative(assetsDir, file.path));
|
|
1426
|
+
const relPath = (0, _icebreakers_monorepo_templates.toWorkspaceGitignorePath)(pathe.default.relative(_icebreakers_monorepo_templates.assetsDir, file.path));
|
|
1432
1427
|
if (skipChangesetMarkdown && relPath.startsWith(".changeset/") && relPath.endsWith(".md")) continue;
|
|
1433
1428
|
const targetPath = pathe.default.resolve(absOutDir, relPath);
|
|
1434
1429
|
try {
|
|
@@ -1436,12 +1431,9 @@ async function upgradeMonorepo(opts) {
|
|
|
1436
1431
|
if (!await fs_extra.default.pathExists(targetPath)) continue;
|
|
1437
1432
|
const sourcePkgJson = await fs_extra.default.readJson(file.path);
|
|
1438
1433
|
const targetPkgJson = await fs_extra.default.readJson(targetPath);
|
|
1439
|
-
setPkgJson(sourcePkgJson, targetPkgJson, { scripts: scriptOverrides });
|
|
1434
|
+
setPkgJson(sourcePkgJson, targetPkgJson, scriptOverrides ? { scripts: scriptOverrides } : void 0);
|
|
1440
1435
|
const data = `${JSON.stringify(targetPkgJson, void 0, 2)}\n`;
|
|
1441
|
-
const intent$1 = await evaluateWriteIntent(targetPath,
|
|
1442
|
-
skipOverwrite,
|
|
1443
|
-
source: data
|
|
1444
|
-
});
|
|
1436
|
+
const intent$1 = await evaluateWriteIntent(targetPath, buildWriteIntentOptions(data));
|
|
1445
1437
|
const action$1 = async () => {
|
|
1446
1438
|
await fs_extra.default.outputFile(targetPath, data, "utf8");
|
|
1447
1439
|
logger.success(targetPath);
|
|
@@ -1460,10 +1452,7 @@ async function upgradeMonorepo(opts) {
|
|
|
1460
1452
|
const targetManifest = exists ? normalizeWorkspaceManifest(yaml.default.parse(await fs_extra.default.readFile(targetPath, "utf8"))) : normalizeWorkspaceManifest({});
|
|
1461
1453
|
const mergedManifest = exists ? mergeWorkspaceManifest(sourceManifest, targetManifest) : sourceManifest;
|
|
1462
1454
|
const data = yaml.default.stringify(mergedManifest, { singleQuote: true });
|
|
1463
|
-
const intent$1 = await evaluateWriteIntent(targetPath,
|
|
1464
|
-
skipOverwrite,
|
|
1465
|
-
source: data
|
|
1466
|
-
});
|
|
1455
|
+
const intent$1 = await evaluateWriteIntent(targetPath, buildWriteIntentOptions(data));
|
|
1467
1456
|
const action$1 = async () => {
|
|
1468
1457
|
await fs_extra.default.outputFile(targetPath, data, "utf8");
|
|
1469
1458
|
logger.success(targetPath);
|
|
@@ -1480,10 +1469,7 @@ async function upgradeMonorepo(opts) {
|
|
|
1480
1469
|
const changesetJson = await fs_extra.default.readJson(file.path);
|
|
1481
1470
|
(0, import_set_value.default)(changesetJson, "changelog.1.repo", repoName);
|
|
1482
1471
|
const data = `${JSON.stringify(changesetJson, void 0, 2)}\n`;
|
|
1483
|
-
const intent$1 = await evaluateWriteIntent(targetPath,
|
|
1484
|
-
skipOverwrite,
|
|
1485
|
-
source: data
|
|
1486
|
-
});
|
|
1472
|
+
const intent$1 = await evaluateWriteIntent(targetPath, buildWriteIntentOptions(data));
|
|
1487
1473
|
const action$1 = async () => {
|
|
1488
1474
|
await fs_extra.default.outputFile(targetPath, data, "utf8");
|
|
1489
1475
|
logger.success(targetPath);
|
|
@@ -1516,10 +1502,7 @@ async function upgradeMonorepo(opts) {
|
|
|
1516
1502
|
}
|
|
1517
1503
|
if (relPath === ".github/ISSUE_TEMPLATE/config.yml") {
|
|
1518
1504
|
const data = updateIssueTemplateConfig(await fs_extra.default.readFile(file.path, "utf8"), repoName);
|
|
1519
|
-
const intent$1 = await evaluateWriteIntent(targetPath,
|
|
1520
|
-
skipOverwrite,
|
|
1521
|
-
source: data
|
|
1522
|
-
});
|
|
1505
|
+
const intent$1 = await evaluateWriteIntent(targetPath, buildWriteIntentOptions(data));
|
|
1523
1506
|
const action$1 = async () => {
|
|
1524
1507
|
await fs_extra.default.outputFile(targetPath, data);
|
|
1525
1508
|
logger.success(targetPath);
|
|
@@ -1533,10 +1516,7 @@ async function upgradeMonorepo(opts) {
|
|
|
1533
1516
|
continue;
|
|
1534
1517
|
}
|
|
1535
1518
|
const source = await fs_extra.default.readFile(file.path);
|
|
1536
|
-
const intent = await evaluateWriteIntent(targetPath,
|
|
1537
|
-
skipOverwrite,
|
|
1538
|
-
source
|
|
1539
|
-
});
|
|
1519
|
+
const intent = await evaluateWriteIntent(targetPath, buildWriteIntentOptions(source));
|
|
1540
1520
|
const action = async () => {
|
|
1541
1521
|
await fs_extra.default.outputFile(targetPath, source);
|
|
1542
1522
|
logger.success(targetPath);
|
|
@@ -1568,12 +1548,6 @@ Object.defineProperty(exports, '__toESM', {
|
|
|
1568
1548
|
return __toESM;
|
|
1569
1549
|
}
|
|
1570
1550
|
});
|
|
1571
|
-
Object.defineProperty(exports, 'assetsDir', {
|
|
1572
|
-
enumerable: true,
|
|
1573
|
-
get: function () {
|
|
1574
|
-
return assetsDir;
|
|
1575
|
-
}
|
|
1576
|
-
});
|
|
1577
1551
|
Object.defineProperty(exports, 'cleanProjects', {
|
|
1578
1552
|
enumerable: true,
|
|
1579
1553
|
get: function () {
|
|
@@ -1646,6 +1620,12 @@ Object.defineProperty(exports, 'getFileHash', {
|
|
|
1646
1620
|
return getFileHash;
|
|
1647
1621
|
}
|
|
1648
1622
|
});
|
|
1623
|
+
Object.defineProperty(exports, 'getSkillTargetPaths', {
|
|
1624
|
+
enumerable: true,
|
|
1625
|
+
get: function () {
|
|
1626
|
+
return getSkillTargetPaths;
|
|
1627
|
+
}
|
|
1628
|
+
});
|
|
1649
1629
|
Object.defineProperty(exports, 'getTemplateMap', {
|
|
1650
1630
|
enumerable: true,
|
|
1651
1631
|
get: function () {
|
|
@@ -1676,12 +1656,6 @@ Object.defineProperty(exports, 'isFileChanged', {
|
|
|
1676
1656
|
return isFileChanged;
|
|
1677
1657
|
}
|
|
1678
1658
|
});
|
|
1679
|
-
Object.defineProperty(exports, 'isGitignoreFile', {
|
|
1680
|
-
enumerable: true,
|
|
1681
|
-
get: function () {
|
|
1682
|
-
return isGitignoreFile;
|
|
1683
|
-
}
|
|
1684
|
-
});
|
|
1685
1659
|
Object.defineProperty(exports, 'isIgnorableFsError', {
|
|
1686
1660
|
enumerable: true,
|
|
1687
1661
|
get: function () {
|
|
@@ -1742,34 +1716,28 @@ Object.defineProperty(exports, 'setVscodeBinaryMirror', {
|
|
|
1742
1716
|
return setVscodeBinaryMirror;
|
|
1743
1717
|
}
|
|
1744
1718
|
});
|
|
1745
|
-
Object.defineProperty(exports, '
|
|
1719
|
+
Object.defineProperty(exports, 'skillTargets', {
|
|
1746
1720
|
enumerable: true,
|
|
1747
1721
|
get: function () {
|
|
1748
|
-
return
|
|
1722
|
+
return skillTargets;
|
|
1749
1723
|
}
|
|
1750
1724
|
});
|
|
1751
|
-
Object.defineProperty(exports, '
|
|
1752
|
-
enumerable: true,
|
|
1753
|
-
get: function () {
|
|
1754
|
-
return templateMap;
|
|
1755
|
-
}
|
|
1756
|
-
});
|
|
1757
|
-
Object.defineProperty(exports, 'templatesDir', {
|
|
1725
|
+
Object.defineProperty(exports, 'syncNpmMirror', {
|
|
1758
1726
|
enumerable: true,
|
|
1759
1727
|
get: function () {
|
|
1760
|
-
return
|
|
1728
|
+
return syncNpmMirror;
|
|
1761
1729
|
}
|
|
1762
1730
|
});
|
|
1763
|
-
Object.defineProperty(exports, '
|
|
1731
|
+
Object.defineProperty(exports, 'syncSkills', {
|
|
1764
1732
|
enumerable: true,
|
|
1765
1733
|
get: function () {
|
|
1766
|
-
return
|
|
1734
|
+
return syncSkills;
|
|
1767
1735
|
}
|
|
1768
1736
|
});
|
|
1769
|
-
Object.defineProperty(exports, '
|
|
1737
|
+
Object.defineProperty(exports, 'templateMap', {
|
|
1770
1738
|
enumerable: true,
|
|
1771
1739
|
get: function () {
|
|
1772
|
-
return
|
|
1740
|
+
return templateMap;
|
|
1773
1741
|
}
|
|
1774
1742
|
});
|
|
1775
1743
|
Object.defineProperty(exports, 'updateIssueTemplateConfig', {
|