@bedrockkit/cli 1.2.0 → 1.3.0

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.
@@ -0,0 +1,301 @@
1
+ import { lstat, rm, symlink } from "node:fs/promises";
2
+ import { dirname, resolve } from "node:path";
3
+ import { confirm, isCancel, multiselect, select } from "@clack/prompts";
4
+ import { createLogger } from "../core/logger.js";
5
+ import { loadConfigContext, resolveOutDir } from "../core/config.js";
6
+ import { promptSelectProject, resolveProjectsByName, } from "../core/projects.js";
7
+ import { ensureDir, pathExists } from "../utils/fs.js";
8
+ import { t } from "../utils/i18n.js";
9
+ import { runBuildWithMode } from "../commands/build.js";
10
+ import { resolveTargetPaths } from "./sync-targets.js";
11
+ async function getExistingType(path) {
12
+ try {
13
+ const stat = await lstat(path);
14
+ if (stat.isSymbolicLink())
15
+ return "link";
16
+ if (stat.isDirectory())
17
+ return "dir";
18
+ return "file";
19
+ }
20
+ catch (err) {
21
+ if (err.code === "ENOENT")
22
+ return "none";
23
+ throw err;
24
+ }
25
+ }
26
+ function looksLikePath(input) {
27
+ return (input.includes("/") ||
28
+ input.includes("\\") ||
29
+ input.includes(":") ||
30
+ input.toLowerCase().endsWith(".json"));
31
+ }
32
+ async function resolveLinkProject(parsed, lang, interactive) {
33
+ const positional = parsed.positional[0] ? String(parsed.positional[0]) : undefined;
34
+ if (positional && !looksLikePath(positional)) {
35
+ const resolved = await resolveProjectsByName([positional], lang);
36
+ return resolved?.[0] ?? null;
37
+ }
38
+ if (!interactive)
39
+ return null;
40
+ return await promptSelectProject(lang);
41
+ }
42
+ async function resolveLinkConfigPath(parsed, lang, interactive) {
43
+ const configFlag = parsed.flags.config;
44
+ if (typeof configFlag === "string" && configFlag)
45
+ return configFlag;
46
+ const positional = parsed.positional[0] ? String(parsed.positional[0]) : undefined;
47
+ if (positional && looksLikePath(positional)) {
48
+ const abs = resolve(process.cwd(), positional);
49
+ if (await pathExists(abs))
50
+ return abs;
51
+ return null;
52
+ }
53
+ const proj = await resolveLinkProject(parsed, lang, interactive);
54
+ return proj?.configPath ?? null;
55
+ }
56
+ export async function runLink(params) {
57
+ const { parsed, action, lang, jsonOut, quiet, dryRun, interactive } = params;
58
+ const { info: log } = createLogger({ json: jsonOut, quiet });
59
+ let configPath;
60
+ try {
61
+ configPath = await resolveLinkConfigPath(parsed, lang, interactive);
62
+ }
63
+ catch (err) {
64
+ console.error(err instanceof Error ? err.message : String(err));
65
+ return false;
66
+ }
67
+ if (!configPath) {
68
+ console.error(interactive ? t("common.cancelled", lang) : t("project.noneFound", lang));
69
+ return false;
70
+ }
71
+ const configCtx = await loadConfigContext(configPath);
72
+ const { config, rootDir } = configCtx;
73
+ const behaviorEnabled = configCtx.behavior.enabled;
74
+ const resourceEnabled = configCtx.resource.enabled;
75
+ const targets = config.sync?.targets ?? {};
76
+ const targetNames = Object.keys(targets);
77
+ if (!targetNames.length) {
78
+ console.error(t("link.noTargets", lang));
79
+ return false;
80
+ }
81
+ let targetName = parsed.flags.target;
82
+ if (!targetName)
83
+ targetName = config.sync.defaultTarget;
84
+ if (!targetName || !(targetName in targets)) {
85
+ const choice = await select({
86
+ message: t("link.selectTarget", lang),
87
+ options: targetNames.map((tName) => ({ value: tName, label: tName })),
88
+ });
89
+ if (isCancel(choice)) {
90
+ console.error(t("link.cancelled", lang));
91
+ return false;
92
+ }
93
+ targetName = String(choice);
94
+ }
95
+ const targetConfig = targets[targetName];
96
+ const projectName = targetConfig.projectName ?? config.project.name;
97
+ const targetPaths = resolveTargetPaths(targetConfig, projectName);
98
+ if (behaviorEnabled && !targetPaths.behavior) {
99
+ console.error(t("link.targetMissingBehavior", lang, { target: targetName }));
100
+ return false;
101
+ }
102
+ if (resourceEnabled && !targetPaths.resource) {
103
+ console.error(t("link.targetMissingResource", lang, { target: targetName }));
104
+ return false;
105
+ }
106
+ let source = parsed.flags.source;
107
+ let mode = parsed.flags.mode;
108
+ if (!source && interactive) {
109
+ const choice = await select({
110
+ message: t("link.selectSource", lang),
111
+ options: [
112
+ { value: "dist", label: t("link.source.dist", lang) },
113
+ { value: "packs", label: t("link.source.packs", lang) },
114
+ ],
115
+ initialValue: "dist",
116
+ });
117
+ if (isCancel(choice)) {
118
+ console.error(t("link.cancelled", lang));
119
+ return false;
120
+ }
121
+ source = String(choice);
122
+ }
123
+ source = source ?? "dist";
124
+ if (!mode && interactive) {
125
+ const choice = await select({
126
+ message: t("link.selectMode", lang),
127
+ options: [
128
+ { value: "junction", label: t("link.mode.junction", lang) },
129
+ { value: "symlink", label: t("link.mode.symlink", lang) },
130
+ ],
131
+ initialValue: process.platform === "win32" ? "junction" : "symlink",
132
+ });
133
+ if (isCancel(choice)) {
134
+ console.error(t("link.cancelled", lang));
135
+ return false;
136
+ }
137
+ mode = String(choice);
138
+ }
139
+ mode = mode ?? (process.platform === "win32" ? "junction" : "symlink");
140
+ let selected = [];
141
+ if (parsed.flags.behavior)
142
+ selected.push("behavior");
143
+ if (parsed.flags.resource)
144
+ selected.push("resource");
145
+ if (!selected.length && interactive) {
146
+ const options = [];
147
+ if (behaviorEnabled)
148
+ options.push({ value: "behavior", label: t("init.pack.behavior", lang) });
149
+ if (resourceEnabled)
150
+ options.push({ value: "resource", label: t("init.pack.resource", lang) });
151
+ const choice = await multiselect({
152
+ message: t("link.selectPacks", lang),
153
+ options,
154
+ initialValues: options.map((o) => o.value),
155
+ });
156
+ if (isCancel(choice)) {
157
+ console.error(t("link.cancelled", lang));
158
+ return false;
159
+ }
160
+ selected = choice;
161
+ }
162
+ if (!selected.length) {
163
+ if (behaviorEnabled)
164
+ selected.push("behavior");
165
+ if (resourceEnabled)
166
+ selected.push("resource");
167
+ }
168
+ if (!selected.length) {
169
+ console.error(t("link.noPacksSelected", lang));
170
+ return false;
171
+ }
172
+ const onExistingFlag = parsed.flags["on-existing"];
173
+ let onExisting = "skip";
174
+ if (parsed.flags.force || onExistingFlag === "replace")
175
+ onExisting = "replace";
176
+ if (onExistingFlag === "skip")
177
+ onExisting = "skip";
178
+ if (!parsed.flags.force && !onExistingFlag && interactive)
179
+ onExisting = "ask";
180
+ if (action === "edit")
181
+ onExisting = "replace";
182
+ const targetsToHandle = [];
183
+ if (selected.includes("behavior") && behaviorEnabled) {
184
+ targetsToHandle.push({ name: "behavior", to: targetPaths.behavior });
185
+ }
186
+ if (selected.includes("resource") && resourceEnabled) {
187
+ targetsToHandle.push({ name: "resource", to: targetPaths.resource });
188
+ }
189
+ if (action === "remove") {
190
+ const removed = [];
191
+ const skipped = [];
192
+ for (const { to } of targetsToHandle) {
193
+ const existingType = await getExistingType(to);
194
+ if (existingType === "none") {
195
+ skipped.push({ to, reason: "not_found" });
196
+ continue;
197
+ }
198
+ if (existingType !== "link") {
199
+ skipped.push({ to, reason: "not_link" });
200
+ continue;
201
+ }
202
+ if (!dryRun) {
203
+ await rm(to, { recursive: true, force: true });
204
+ if (!jsonOut)
205
+ log(t("link.removed", lang, { path: to }));
206
+ }
207
+ else if (!jsonOut) {
208
+ log(t("link.dryRunRemove", lang, { path: to }));
209
+ }
210
+ removed.push({ to });
211
+ }
212
+ if (jsonOut) {
213
+ console.log(JSON.stringify({ ok: true, dryRun, removed, skipped }, null, 2));
214
+ }
215
+ return true;
216
+ }
217
+ const buildDirOverride = (typeof parsed.flags["build-dir"] === "string" && parsed.flags["build-dir"]) ||
218
+ (typeof parsed.flags["out-dir"] === "string" && parsed.flags["out-dir"]) ||
219
+ undefined;
220
+ const buildDir = resolveOutDir(configCtx, buildDirOverride);
221
+ const sources = [];
222
+ if (selected.includes("behavior") && behaviorEnabled) {
223
+ const from = source === "dist"
224
+ ? resolve(buildDir, config.packs.behavior)
225
+ : resolve(rootDir, config.packs.behavior);
226
+ sources.push({ name: "behavior", from, to: targetPaths.behavior });
227
+ }
228
+ if (selected.includes("resource") && resourceEnabled) {
229
+ const from = source === "dist"
230
+ ? resolve(buildDir, config.packs.resource)
231
+ : resolve(rootDir, config.packs.resource);
232
+ sources.push({ name: "resource", from, to: targetPaths.resource });
233
+ }
234
+ if (source === "dist") {
235
+ let missing = false;
236
+ for (const { from } of sources) {
237
+ if (!(await pathExists(from))) {
238
+ missing = true;
239
+ break;
240
+ }
241
+ }
242
+ if (missing) {
243
+ if (!jsonOut && !quiet)
244
+ log(t("link.buildingDist", lang));
245
+ await runBuildWithMode({
246
+ configPath,
247
+ outDirOverride: buildDirOverride,
248
+ mode: "copy",
249
+ quiet,
250
+ jsonOut,
251
+ lang,
252
+ });
253
+ }
254
+ }
255
+ for (const { from } of sources) {
256
+ if (!(await pathExists(from))) {
257
+ console.error(t("link.sourceNotFound", lang, { path: from }));
258
+ return false;
259
+ }
260
+ }
261
+ const linked = [];
262
+ for (const { from, to } of sources) {
263
+ const existingType = await getExistingType(to);
264
+ let actionOnExisting = onExisting;
265
+ if (existingType !== "none" && onExisting === "ask") {
266
+ const replace = await confirm({
267
+ message: t("link.confirmReplace", lang, { path: to }),
268
+ initialValue: false,
269
+ });
270
+ if (isCancel(replace)) {
271
+ console.error(t("link.cancelled", lang));
272
+ return false;
273
+ }
274
+ actionOnExisting = replace ? "replace" : "skip";
275
+ }
276
+ if (existingType !== "none" && actionOnExisting === "skip") {
277
+ if (!jsonOut)
278
+ log(t("link.skippedExists", lang, { path: to }));
279
+ continue;
280
+ }
281
+ if (!dryRun) {
282
+ await ensureDir(dirname(to));
283
+ if (existingType !== "none" && actionOnExisting === "replace") {
284
+ await rm(to, { recursive: true, force: true });
285
+ }
286
+ const linkType = mode === "junction" ? "junction" : "dir";
287
+ await symlink(from, to, linkType);
288
+ if (!jsonOut)
289
+ log(t("link.linked", lang, { from, to }));
290
+ }
291
+ else if (!jsonOut) {
292
+ log(t("link.dryRunLink", lang, { from, to }));
293
+ }
294
+ linked.push({ from, to });
295
+ }
296
+ if (jsonOut) {
297
+ console.log(JSON.stringify({ ok: true, dryRun, linked }, null, 2));
298
+ }
299
+ return true;
300
+ }
301
+ //# sourceMappingURL=link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/services/link.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ import { rm, lstat, readdir } from "node:fs/promises";
2
+ import { resolve } from "node:path";
3
+ import { confirm, isCancel, select } from "@clack/prompts";
4
+ import { loadConfigContext } from "../core/config.js";
5
+ import { discoverProjects, parseProjectNames, promptSelectProjects, } from "../core/projects.js";
6
+ import { pathExists } from "../utils/fs.js";
7
+ import { t } from "../utils/i18n.js";
8
+ import { resolveTargetPaths } from "./sync-targets.js";
9
+ async function removeSymlinkEntries(rootDir) {
10
+ const stack = [rootDir];
11
+ while (stack.length) {
12
+ const current = stack.pop();
13
+ if (!current)
14
+ continue;
15
+ const entries = await readdir(current, { withFileTypes: true });
16
+ for (const entry of entries) {
17
+ const fullPath = resolve(current, entry.name);
18
+ const stat = await lstat(fullPath);
19
+ if (stat.isSymbolicLink()) {
20
+ await rm(fullPath, { recursive: true, force: true });
21
+ continue;
22
+ }
23
+ if (stat.isDirectory()) {
24
+ stack.push(fullPath);
25
+ }
26
+ }
27
+ }
28
+ }
29
+ export async function runRemove(params) {
30
+ const { parsed, lang, quiet, yes, interactive } = params;
31
+ const projects = await discoverProjects();
32
+ if (!projects.length) {
33
+ console.error(t("remove.none", lang));
34
+ return false;
35
+ }
36
+ const names = parseProjectNames(parsed);
37
+ let selectedProjects = null;
38
+ if (names.length > 0) {
39
+ selectedProjects = projects.filter((p) => names.includes(p.name));
40
+ }
41
+ else if (interactive) {
42
+ selectedProjects = await promptSelectProjects(lang, { initialAll: false });
43
+ }
44
+ else {
45
+ selectedProjects = [];
46
+ }
47
+ selectedProjects = selectedProjects ?? [];
48
+ if (!selectedProjects.length) {
49
+ console.error(t("common.cancelled", lang));
50
+ return false;
51
+ }
52
+ for (const name of names) {
53
+ if (!projects.some((p) => p.name === name)) {
54
+ console.error(t("remove.notFound", lang, { name }));
55
+ return false;
56
+ }
57
+ }
58
+ const removeDist = parsed.flags.dist ? true : false;
59
+ const removeWatch = parsed.flags.watch ? true : false;
60
+ if (!quiet && !yes) {
61
+ const ok = await confirm({
62
+ message: selectedProjects.length === 1
63
+ ? t("remove.confirmProject", lang, { name: selectedProjects[0].name })
64
+ : t("remove.confirmProjects", lang, { count: String(selectedProjects.length) }),
65
+ initialValue: false,
66
+ });
67
+ if (isCancel(ok) || !ok) {
68
+ console.error(t("common.cancelled", lang));
69
+ return false;
70
+ }
71
+ }
72
+ for (const project of selectedProjects) {
73
+ const configCtx = await loadConfigContext(project.configPath);
74
+ const distDir = resolve(project.root, configCtx.config.build?.outDir ?? "dist");
75
+ const watchDir = resolve(project.root, ".watch-dist");
76
+ const targetNames = Object.keys(configCtx.config.sync?.targets ?? {});
77
+ let targetName = parsed.flags.target ?? configCtx.config.sync?.defaultTarget;
78
+ if (!targetName || !(targetName in (configCtx.config.sync?.targets ?? {}))) {
79
+ if (targetNames.length === 1) {
80
+ targetName = targetNames[0];
81
+ }
82
+ else if (targetNames.length && !quiet) {
83
+ const choice = await select({
84
+ message: t("sync.selectTarget", lang),
85
+ options: targetNames.map((n) => ({ value: n, label: n })),
86
+ });
87
+ if (!isCancel(choice))
88
+ targetName = String(choice);
89
+ }
90
+ }
91
+ if (targetName) {
92
+ const targetConfig = (configCtx.config.sync?.targets ?? {})[targetName];
93
+ if (targetConfig) {
94
+ const projectName = targetConfig.projectName ?? configCtx.config.project?.name ?? project.name;
95
+ const targetPaths = resolveTargetPaths(targetConfig, projectName);
96
+ const candidates = [targetPaths.behavior, targetPaths.resource].filter((p) => !!p);
97
+ for (const targetPath of candidates) {
98
+ if (!(await pathExists(targetPath)))
99
+ continue;
100
+ const stat = await lstat(targetPath);
101
+ if (stat.isSymbolicLink()) {
102
+ await rm(targetPath, { recursive: true, force: true });
103
+ continue;
104
+ }
105
+ if (!stat.isDirectory())
106
+ continue;
107
+ await removeSymlinkEntries(targetPath);
108
+ }
109
+ }
110
+ }
111
+ await rm(project.root, { recursive: true, force: true });
112
+ if (removeDist) {
113
+ await rm(distDir, { recursive: true, force: true });
114
+ }
115
+ if (removeWatch) {
116
+ await rm(watchDir, { recursive: true, force: true });
117
+ }
118
+ if (!quiet) {
119
+ console.log(t("remove.done", lang, { name: project.name }));
120
+ }
121
+ }
122
+ return true;
123
+ }
124
+ //# sourceMappingURL=remove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.js","sourceRoot":"","sources":["../../src/services/remove.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { join } from "node:path";
2
+ import { createRequire } from "node:module";
3
+ const DEVELOPMENT_BEHAVIOR = "development_behavior_packs";
4
+ const DEVELOPMENT_RESOURCE = "development_resource_packs";
5
+ export function resolveTargetPaths(target, projectName) {
6
+ if (target.behavior || target.resource) {
7
+ return { behavior: target.behavior, resource: target.resource };
8
+ }
9
+ if (!target.product)
10
+ return {};
11
+ const require = createRequire(import.meta.url);
12
+ const coreBuild = require("@minecraft/core-build-tasks");
13
+ const getGameDeploymentRootPaths = coreBuild.getGameDeploymentRootPaths;
14
+ if (!getGameDeploymentRootPaths)
15
+ return {};
16
+ const rootPaths = getGameDeploymentRootPaths();
17
+ const root = rootPaths[target.product];
18
+ if (!root)
19
+ return {};
20
+ return {
21
+ behavior: join(root, DEVELOPMENT_BEHAVIOR, projectName),
22
+ resource: join(root, DEVELOPMENT_RESOURCE, projectName),
23
+ };
24
+ }
25
+ //# sourceMappingURL=sync-targets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-targets.js","sourceRoot":"","sources":["../../src/services/sync-targets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,oBAAoB,GAAG,4BAA4B,CAAC;AAC1D,MAAM,oBAAoB,GAAG,4BAA4B,CAAC;AAS1D,MAAM,UAAU,kBAAkB,CAChC,MAAwB,EACxB,WAAmB;IAEnB,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;IAClE,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAC;IACzD,MAAM,0BAA0B,GAAI,SAAiB,CAAC,0BAEzC,CAAC;IACd,IAAI,CAAC,0BAA0B;QAAE,OAAO,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,0BAA0B,EAAE,CAAC;IAC/C,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,oBAAoB,EAAE,WAAW,CAAC;QACvD,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,oBAAoB,EAAE,WAAW,CAAC;KACxD,CAAC;AACJ,CAAC"}
@@ -96,8 +96,8 @@ const dict = {
96
96
  en: "Initializing workspace",
97
97
  },
98
98
  "init.title": {
99
- ja: "BedrockKit Init",
100
- en: "BedrockKit Init",
99
+ ja: "BedrockKit Create",
100
+ en: "BedrockKit Create",
101
101
  },
102
102
  "init.templateUrlPrompt": {
103
103
  ja: "テンプレートの Git URL を入力",
@@ -683,9 +683,9 @@ const dict = {
683
683
  ja: "リソースマニフェストが見つかりません: {path}",
684
684
  en: "Resource manifest not found: {path}",
685
685
  },
686
- "command.init.desc": {
686
+ "command.create.desc": {
687
687
  ja: "テンプレートから新規ワークスペースを作成",
688
- en: "Initialize a new Bedrock addon/resource pack workspace from a template",
688
+ en: "Create a new Bedrock addon/resource pack workspace from a template",
689
689
  },
690
690
  "command.bump.desc": {
691
691
  ja: "バージョンを更新し、マニフェスト等を再生成",
@@ -875,6 +875,10 @@ const dict = {
875
875
  ja: "プロジェクト '{name}' を削除しますか?",
876
876
  en: "Remove project '{name}'?",
877
877
  },
878
+ "remove.confirmProjects": {
879
+ ja: "{count} 個のプロジェクトを削除しますか?",
880
+ en: "Remove {count} projects?",
881
+ },
878
882
  "remove.notFound": {
879
883
  ja: "指定されたプロジェクトが見つかりません: {name}",
880
884
  en: "Project not found: {name}",
@@ -1096,8 +1100,8 @@ const dict = {
1096
1100
  en: "Suppress non-error logs (build/package/sync/validate)",
1097
1101
  },
1098
1102
  "help.flag.build": {
1099
- ja: "sync/package の事前ビルドを無効化 (default: true)",
1100
- en: "Skip pre-build for sync/package (default: true)",
1103
+ ja: "sync/package の事前ビルドを制御 (sync: --build で有効 / package: --build=false で無効)",
1104
+ en: "Control pre-build (sync: enable with --build / package: disable with --build=false)",
1101
1105
  },
1102
1106
  "help.bkitignore": {
1103
1107
  ja: ".bkitignore:",
@@ -1115,6 +1119,22 @@ const dict = {
1115
1119
  ja: "Minecraft Bedrock 向け TypeScript CLI",
1116
1120
  en: "TypeScript CLI for Minecraft Bedrock",
1117
1121
  },
1122
+ "project.selectOne": {
1123
+ ja: "プロジェクトを選択",
1124
+ en: "Select a project",
1125
+ },
1126
+ "project.selectMany": {
1127
+ ja: "プロジェクトを選択(複数可)",
1128
+ en: "Select projects (multi)",
1129
+ },
1130
+ "project.notFound": {
1131
+ ja: "プロジェクトが見つかりません: {name}",
1132
+ en: "Project not found: {name}",
1133
+ },
1134
+ "project.noneFound": {
1135
+ ja: "プロジェクトが見つかりません。",
1136
+ en: "No projects found.",
1137
+ },
1118
1138
  };
1119
1139
  export function t(key, lang = "ja", params = {}) {
1120
1140
  const entry = dict[key];