@bedrockkit/cli 1.0.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.
- package/LICENSE +21 -0
- package/README.en.md +122 -0
- package/README.md +123 -0
- package/dist/cli.js +118 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/build.js +154 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/bump.js +156 -0
- package/dist/commands/bump.js.map +1 -0
- package/dist/commands/config.js +29 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/deps.js +116 -0
- package/dist/commands/deps.js.map +1 -0
- package/dist/commands/import.js +328 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/index.js +84 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.js +445 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/package.js +143 -0
- package/dist/commands/package.js.map +1 -0
- package/dist/commands/setting.js +48 -0
- package/dist/commands/setting.js.map +1 -0
- package/dist/commands/sync.js +173 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/template.js +144 -0
- package/dist/commands/template.js.map +1 -0
- package/dist/commands/validate.js +180 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/commands/watch.js +117 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/config.js +76 -0
- package/dist/config.js.map +1 -0
- package/dist/core/config.js +137 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/constants.js +47 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/logger.js +10 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/manifest.js +147 -0
- package/dist/core/manifest.js.map +1 -0
- package/dist/core/scaffold.js +14 -0
- package/dist/core/scaffold.js.map +1 -0
- package/dist/core/script-api.js +111 -0
- package/dist/core/script-api.js.map +1 -0
- package/dist/core/templates.js +92 -0
- package/dist/core/templates.js.map +1 -0
- package/dist/help.js +35 -0
- package/dist/help.js.map +1 -0
- package/dist/manifest.js +155 -0
- package/dist/manifest.js.map +1 -0
- package/dist/templates.js +92 -0
- package/dist/templates.js.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/archive.js +27 -0
- package/dist/utils/archive.js.map +1 -0
- package/dist/utils/args.js +39 -0
- package/dist/utils/args.js.map +1 -0
- package/dist/utils/config-discovery.js +48 -0
- package/dist/utils/config-discovery.js.map +1 -0
- package/dist/utils/fs.js +29 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/i18n.js +356 -0
- package/dist/utils/i18n.js.map +1 -0
- package/dist/utils/ignore.js +36 -0
- package/dist/utils/ignore.js.map +1 -0
- package/dist/utils/js-to-ts.js +90 -0
- package/dist/utils/js-to-ts.js.map +1 -0
- package/dist/utils/npm-install.js +153 -0
- package/dist/utils/npm-install.js.map +1 -0
- package/dist/utils/npm.js +74 -0
- package/dist/utils/npm.js.map +1 -0
- package/dist/utils/settings.js +46 -0
- package/dist/utils/settings.js.map +1 -0
- package/dist/utils/tooling.js +158 -0
- package/dist/utils/tooling.js.map +1 -0
- package/dist/utils/ui.js +61 -0
- package/dist/utils/ui.js.map +1 -0
- package/dist/utils/version.js +23 -0
- package/dist/utils/version.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { select, text, isCancel, outro } from "@clack/prompts";
|
|
4
|
+
import { loadConfigContext, resolveConfigPath } from "../core/config.js";
|
|
5
|
+
import { parseArgs } from "../utils/args.js";
|
|
6
|
+
import { pathExists, writeJson } from "../utils/fs.js";
|
|
7
|
+
import { bumpVersionString, stringToVersionTuple, } from "../utils/version.js";
|
|
8
|
+
import { resolveLang, t } from "../utils/i18n.js";
|
|
9
|
+
async function readManifest(path) {
|
|
10
|
+
const raw = await readFile(path, { encoding: "utf8" });
|
|
11
|
+
return JSON.parse(raw);
|
|
12
|
+
}
|
|
13
|
+
function updateManifestVersion(manifest, nextVersionTuple) {
|
|
14
|
+
manifest.header.version = nextVersionTuple;
|
|
15
|
+
manifest.modules = manifest.modules.map((m) => m.type === "script" ? m : { ...m, version: nextVersionTuple });
|
|
16
|
+
if (manifest.dependencies) {
|
|
17
|
+
manifest.dependencies = manifest.dependencies.map((dep) => {
|
|
18
|
+
if ("uuid" in dep) {
|
|
19
|
+
return { ...dep, version: nextVersionTuple };
|
|
20
|
+
}
|
|
21
|
+
return dep;
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export async function handleBump(ctx) {
|
|
26
|
+
const parsed = parseArgs(ctx.argv);
|
|
27
|
+
const lang = ctx.lang ?? resolveLang(parsed.flags.lang);
|
|
28
|
+
const level = parsed.positional[0] ?? "patch";
|
|
29
|
+
const toVersion = parsed.flags.to ?? parsed.flags.set;
|
|
30
|
+
const minEngine = parsed.flags["min-engine"];
|
|
31
|
+
const nonInteractive = !!parsed.flags.yes;
|
|
32
|
+
const configPath = await resolveConfigPath(parsed.flags.config, lang);
|
|
33
|
+
if (!configPath) {
|
|
34
|
+
console.error("Config selection cancelled.");
|
|
35
|
+
process.exitCode = 1;
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (!(await pathExists(configPath))) {
|
|
39
|
+
console.error(`Config not found: ${configPath}`);
|
|
40
|
+
process.exitCode = 1;
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const configCtx = await loadConfigContext(configPath);
|
|
44
|
+
const { config, rootDir } = configCtx;
|
|
45
|
+
let nextVersionString = toVersion ? String(toVersion) : undefined;
|
|
46
|
+
let nextLevel = level;
|
|
47
|
+
let nextMinEngineInput = minEngine;
|
|
48
|
+
if (!nonInteractive && !nextVersionString && !parsed.positional.length) {
|
|
49
|
+
const choice = await select({
|
|
50
|
+
message: t("bump.selectType", lang),
|
|
51
|
+
options: [
|
|
52
|
+
{ value: "patch", label: t("bump.option.patch", lang) },
|
|
53
|
+
{ value: "minor", label: t("bump.option.minor", lang) },
|
|
54
|
+
{ value: "major", label: t("bump.option.major", lang) },
|
|
55
|
+
{ value: "custom", label: t("bump.option.custom", lang) },
|
|
56
|
+
],
|
|
57
|
+
initialValue: "patch",
|
|
58
|
+
});
|
|
59
|
+
if (isCancel(choice)) {
|
|
60
|
+
outro(t("common.cancelled", lang));
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (choice === "custom") {
|
|
64
|
+
const input = await text({
|
|
65
|
+
message: t("bump.enterVersion", lang),
|
|
66
|
+
initialValue: config.project.version,
|
|
67
|
+
validate: (v) => (!v.trim() ? t("bump.versionRequired", lang) : undefined),
|
|
68
|
+
});
|
|
69
|
+
if (isCancel(input)) {
|
|
70
|
+
outro(t("common.cancelled", lang));
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
nextVersionString = String(input).trim();
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
nextLevel = choice;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (!nonInteractive && !nextMinEngineInput) {
|
|
80
|
+
const choice = await select({
|
|
81
|
+
message: t("bump.updateMinEngine", lang),
|
|
82
|
+
options: [
|
|
83
|
+
{ value: "keep", label: t("bump.keepCurrent", lang) },
|
|
84
|
+
{ value: "set", label: t("bump.setMinEngine", lang) },
|
|
85
|
+
],
|
|
86
|
+
initialValue: "keep",
|
|
87
|
+
});
|
|
88
|
+
if (isCancel(choice)) {
|
|
89
|
+
outro(t("common.cancelled", lang));
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (choice === "set") {
|
|
93
|
+
const input = await text({
|
|
94
|
+
message: t("bump.enterMinEngine", lang),
|
|
95
|
+
initialValue: "1.21.0",
|
|
96
|
+
validate: (v) => !/^\d+\.\d+\.\d+$/.test(v.trim())
|
|
97
|
+
? t("bump.minEngineFormat", lang)
|
|
98
|
+
: undefined,
|
|
99
|
+
});
|
|
100
|
+
if (isCancel(input)) {
|
|
101
|
+
outro(t("common.cancelled", lang));
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
nextMinEngineInput = String(input).trim();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const nextVersion = nextVersionString ??
|
|
108
|
+
bumpVersionString(config.project.version, nextLevel);
|
|
109
|
+
const nextVersionTuple = stringToVersionTuple(nextVersion);
|
|
110
|
+
let nextMinEngineTuple;
|
|
111
|
+
if (nextMinEngineInput) {
|
|
112
|
+
nextMinEngineTuple = stringToVersionTuple(nextMinEngineInput);
|
|
113
|
+
}
|
|
114
|
+
config.project.version = nextVersion;
|
|
115
|
+
const behaviorManifestPath = configCtx.behavior.path
|
|
116
|
+
? resolve(configCtx.behavior.path, "manifest.json")
|
|
117
|
+
: resolve(rootDir, config.packs.behavior, "manifest.json");
|
|
118
|
+
const resourceManifestPath = configCtx.resource.path
|
|
119
|
+
? resolve(configCtx.resource.path, "manifest.json")
|
|
120
|
+
: resolve(rootDir, config.packs.resource, "manifest.json");
|
|
121
|
+
if (!(await pathExists(behaviorManifestPath))) {
|
|
122
|
+
console.error(`Behavior manifest not found: ${behaviorManifestPath}`);
|
|
123
|
+
process.exitCode = 1;
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
if (!(await pathExists(resourceManifestPath))) {
|
|
127
|
+
console.error(`Resource manifest not found: ${resourceManifestPath}`);
|
|
128
|
+
process.exitCode = 1;
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const behaviorManifest = await readManifest(behaviorManifestPath);
|
|
132
|
+
const resourceManifest = await readManifest(resourceManifestPath);
|
|
133
|
+
updateManifestVersion(behaviorManifest, nextVersionTuple);
|
|
134
|
+
updateManifestVersion(resourceManifest, nextVersionTuple);
|
|
135
|
+
if (nextMinEngineTuple) {
|
|
136
|
+
behaviorManifest.header.min_engine_version = nextMinEngineTuple;
|
|
137
|
+
resourceManifest.header.min_engine_version = nextMinEngineTuple;
|
|
138
|
+
}
|
|
139
|
+
await writeJson(configPath, config);
|
|
140
|
+
await writeJson(behaviorManifestPath, behaviorManifest);
|
|
141
|
+
await writeJson(resourceManifestPath, resourceManifest);
|
|
142
|
+
const minSuffix = nextMinEngineTuple
|
|
143
|
+
? t("bump.minEngineSuffix", lang, { value: nextMinEngineTuple.join(".") })
|
|
144
|
+
: "";
|
|
145
|
+
console.log(nextVersionString
|
|
146
|
+
? t("bump.doneSet", lang, {
|
|
147
|
+
version: nextVersion,
|
|
148
|
+
minEngine: minSuffix,
|
|
149
|
+
})
|
|
150
|
+
: t("bump.doneBumped", lang, {
|
|
151
|
+
level: nextLevel,
|
|
152
|
+
version: nextVersion,
|
|
153
|
+
minEngine: minSuffix,
|
|
154
|
+
}));
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=bump.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bump.js","sourceRoot":"","sources":["../../src/commands/bump.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { parseArgs } from "../utils/args.js";
|
|
2
|
+
import { loadConfig, defaultConfigPath } from "../core/config.js";
|
|
3
|
+
export async function handleConfig(ctx) {
|
|
4
|
+
const parsed = parseArgs(ctx.argv);
|
|
5
|
+
const path = parsed.flags.path
|
|
6
|
+
? String(parsed.flags.path)
|
|
7
|
+
: defaultConfigPath;
|
|
8
|
+
const config = await loadConfig(path);
|
|
9
|
+
if (parsed.flags.json) {
|
|
10
|
+
console.log(JSON.stringify(config, null, 2));
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
console.log(`Config (${path}):`);
|
|
14
|
+
console.log(`- project: ${config.project.name} @ ${config.project.version}`);
|
|
15
|
+
console.log(`- template: ${config.template}`);
|
|
16
|
+
console.log(`- packs.behavior: ${config.packs.behavior}`);
|
|
17
|
+
console.log(`- packs.resource: ${config.packs.resource}`);
|
|
18
|
+
console.log(`- build.outDir: ${config.build.outDir} (target: ${config.build.target})`);
|
|
19
|
+
console.log(`- sync.defaultTarget: ${config.sync.defaultTarget}`);
|
|
20
|
+
if (config.sync.targets) {
|
|
21
|
+
console.log(`- sync.targets: ${Object.keys(config.sync.targets).join(", ") || "(none)"}`);
|
|
22
|
+
}
|
|
23
|
+
if (config.script) {
|
|
24
|
+
console.log(`- script: entry=${config.script.entry}, language=${config.script.language}, deps=${config.script.dependencies
|
|
25
|
+
.map((d) => d.module_name)
|
|
26
|
+
.join(", ")}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAElE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAmB;IACpD,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI;QAC5B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;QAC3B,CAAC,CAAC,iBAAiB,CAAC;IAEtB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,KAAK,CAAC,MAAM,aAAa,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACvF,OAAO,CAAC,GAAG,CAAC,yBAAyB,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IAClE,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;IAC5F,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CACT,mBAAmB,MAAM,CAAC,MAAM,CAAC,KAAK,cAAc,MAAM,CAAC,MAAM,CAAC,QAAQ,UAAU,MAAM,CAAC,MAAM,CAAC,YAAY;aAC3G,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;aACzB,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { multiselect, isCancel, outro } from "@clack/prompts";
|
|
4
|
+
import { loadConfigContext, resolveConfigPath } from "../core/config.js";
|
|
5
|
+
import { MANIFEST_SCRIPT_PACKAGES, SCRIPT_API_OPTIONS, SCRIPT_API_PACKAGES, createScriptApiVersionPicker, } from "../core/script-api.js";
|
|
6
|
+
import { parseArgs } from "../utils/args.js";
|
|
7
|
+
import { pathExists, writeJson } from "../utils/fs.js";
|
|
8
|
+
import { runInstallCommand } from "../utils/npm-install.js";
|
|
9
|
+
import { resolveLang, t } from "../utils/i18n.js";
|
|
10
|
+
async function readManifest(path) {
|
|
11
|
+
const raw = await readFile(path, { encoding: "utf8" });
|
|
12
|
+
return JSON.parse(raw);
|
|
13
|
+
}
|
|
14
|
+
export async function handleDeps(ctx) {
|
|
15
|
+
const parsed = parseArgs(ctx.argv);
|
|
16
|
+
const lang = ctx.lang ?? resolveLang(parsed.flags.lang);
|
|
17
|
+
const configPath = await resolveConfigPath(parsed.flags.config, lang);
|
|
18
|
+
if (!configPath) {
|
|
19
|
+
console.error(t("common.cancelled", lang));
|
|
20
|
+
process.exitCode = 1;
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (!(await pathExists(configPath))) {
|
|
24
|
+
console.error(`Config not found: ${configPath}`);
|
|
25
|
+
process.exitCode = 1;
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const configCtx = await loadConfigContext(configPath);
|
|
29
|
+
const { config, rootDir } = configCtx;
|
|
30
|
+
if (!config.script) {
|
|
31
|
+
console.error("No script configuration found in bkit.config.json.");
|
|
32
|
+
process.exitCode = 1;
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const packageJsonPath = resolve(rootDir, "package.json");
|
|
36
|
+
if (!(await pathExists(packageJsonPath))) {
|
|
37
|
+
console.error(`package.json not found: ${packageJsonPath}`);
|
|
38
|
+
process.exitCode = 1;
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const pkgRaw = JSON.parse(await readFile(packageJsonPath, "utf8"));
|
|
42
|
+
const deps = pkgRaw.dependencies ?? {};
|
|
43
|
+
// Interactive selection (similar to init)
|
|
44
|
+
const existing = new Map();
|
|
45
|
+
for (const [name, version] of Object.entries(deps)) {
|
|
46
|
+
if (SCRIPT_API_PACKAGES.has(name)) {
|
|
47
|
+
existing.set(name, version);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const selectPackages = await multiselect({
|
|
51
|
+
message: t("deps.selectPackages", lang),
|
|
52
|
+
options: SCRIPT_API_OPTIONS.map((opt) => ({
|
|
53
|
+
value: opt.pkg,
|
|
54
|
+
label: opt.label,
|
|
55
|
+
hint: opt.hint,
|
|
56
|
+
})),
|
|
57
|
+
initialValues: Array.from(existing.keys()).length
|
|
58
|
+
? Array.from(existing.keys())
|
|
59
|
+
: ["@minecraft/server", "@minecraft/server-ui"],
|
|
60
|
+
});
|
|
61
|
+
if (isCancel(selectPackages)) {
|
|
62
|
+
outro(t("common.cancelled", lang));
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const selectedSet = new Set(selectPackages);
|
|
66
|
+
const pickVersion = createScriptApiVersionPicker(lang);
|
|
67
|
+
const scriptDeps = [];
|
|
68
|
+
for (const pkg of selectedSet) {
|
|
69
|
+
const picked = await pickVersion(pkg, existing.get(pkg) ?? "");
|
|
70
|
+
if (picked === null) {
|
|
71
|
+
outro(t("common.cancelled", lang));
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
scriptDeps.push({ module_name: pkg, version: picked });
|
|
75
|
+
}
|
|
76
|
+
const toRemove = Array.from(existing.keys()).filter((name) => !selectedSet.has(name));
|
|
77
|
+
const toAdd = scriptDeps.map((d) => `${d.module_name}@${d.version}`);
|
|
78
|
+
// Apply changes via npm uninstall/install so package.json と node_modules を揃える
|
|
79
|
+
if (toRemove.length) {
|
|
80
|
+
console.log(`npm uninstall ${toRemove.join(" ")}`);
|
|
81
|
+
await runInstallCommand(rootDir, [], { cmd: "npm", args: ["uninstall", ...toRemove] });
|
|
82
|
+
}
|
|
83
|
+
if (toAdd.length) {
|
|
84
|
+
console.log(`npm install ${toAdd.join(" ")}`);
|
|
85
|
+
await runInstallCommand(rootDir, toAdd);
|
|
86
|
+
}
|
|
87
|
+
if (!toRemove.length && !toAdd.length) {
|
|
88
|
+
console.log("No changes to npm dependencies.");
|
|
89
|
+
}
|
|
90
|
+
// Update config script deps and apiVersion (use @minecraft/server if present).
|
|
91
|
+
config.script.dependencies = scriptDeps;
|
|
92
|
+
const serverDep = scriptDeps.find((d) => d.module_name === "@minecraft/server");
|
|
93
|
+
if (serverDep) {
|
|
94
|
+
config.script.apiVersion = serverDep.version;
|
|
95
|
+
}
|
|
96
|
+
// Update behavior manifest dependencies to match (excluding math/vanilla-data).
|
|
97
|
+
const behaviorManifestPath = configCtx.behavior.path
|
|
98
|
+
? resolve(configCtx.behavior.path, "manifest.json")
|
|
99
|
+
: resolve(rootDir, config.packs.behavior, "manifest.json");
|
|
100
|
+
if (!(await pathExists(behaviorManifestPath))) {
|
|
101
|
+
console.error(`Behavior manifest not found: ${behaviorManifestPath}`);
|
|
102
|
+
process.exitCode = 1;
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const behaviorManifest = await readManifest(behaviorManifestPath);
|
|
106
|
+
const filteredDeps = scriptDeps.filter((d) => MANIFEST_SCRIPT_PACKAGES.has(d.module_name));
|
|
107
|
+
behaviorManifest.dependencies = [
|
|
108
|
+
...(behaviorManifest.dependencies ?? []).filter((d) => !("module_name" in d && MANIFEST_SCRIPT_PACKAGES.has(d.module_name))),
|
|
109
|
+
...filteredDeps,
|
|
110
|
+
];
|
|
111
|
+
await writeJson(packageJsonPath, pkgRaw);
|
|
112
|
+
await writeJson(configPath, config);
|
|
113
|
+
await writeJson(behaviorManifestPath, behaviorManifest);
|
|
114
|
+
console.log(t("deps.updated", lang));
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=deps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deps.js","sourceRoot":"","sources":["../../src/commands/deps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
import { cp, mkdtemp, readFile, readdir } from "node:fs/promises";
|
|
2
|
+
import { dirname, extname, join, resolve, basename } from "node:path";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { spawn } from "node:child_process";
|
|
5
|
+
import { confirm, intro, isCancel, outro, text } from "@clack/prompts";
|
|
6
|
+
import { parseArgs } from "../utils/args.js";
|
|
7
|
+
import { ensureDir, pathExists, writeJson } from "../utils/fs.js";
|
|
8
|
+
import { runInstallCommand } from "../utils/npm-install.js";
|
|
9
|
+
import { fetchNpmVersionChannels } from "../utils/npm.js";
|
|
10
|
+
import { convertJsTreeToTs } from "../utils/js-to-ts.js";
|
|
11
|
+
import { resolveLang, t } from "../utils/i18n.js";
|
|
12
|
+
import { writeLocalToolScripts } from "../utils/tooling.js";
|
|
13
|
+
import { writeIgnoreFiles } from "../core/scaffold.js";
|
|
14
|
+
async function unzip(archive, dest) {
|
|
15
|
+
const isWin = process.platform === "win32";
|
|
16
|
+
await ensureDir(dest);
|
|
17
|
+
if (isWin) {
|
|
18
|
+
await new Promise((resolve, reject) => {
|
|
19
|
+
const child = spawn("powershell", [
|
|
20
|
+
"-NoProfile",
|
|
21
|
+
"-Command",
|
|
22
|
+
`Expand-Archive -Path "${archive}" -DestinationPath "${dest}" -Force`,
|
|
23
|
+
], { stdio: "inherit" });
|
|
24
|
+
child.on("error", reject);
|
|
25
|
+
child.on("exit", (code) => code === 0 ? resolve() : reject(new Error(`Expand-Archive exited with ${code}`)));
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
await new Promise((resolve, reject) => {
|
|
30
|
+
const child = spawn("unzip", ["-o", archive, "-d", dest], { stdio: "inherit" });
|
|
31
|
+
child.on("error", reject);
|
|
32
|
+
child.on("exit", (code) => (code === 0 ? resolve() : reject(new Error(`unzip exited ${code}`))));
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async function walkForManifests(dir, results = []) {
|
|
37
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
38
|
+
for (const entry of entries) {
|
|
39
|
+
const full = join(dir, entry.name);
|
|
40
|
+
if (entry.isDirectory()) {
|
|
41
|
+
await walkForManifests(full, results);
|
|
42
|
+
}
|
|
43
|
+
else if (entry.isFile() && entry.name.toLowerCase() === "manifest.json") {
|
|
44
|
+
results.push(full);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return results;
|
|
48
|
+
}
|
|
49
|
+
function classifyManifest(manifest) {
|
|
50
|
+
const modules = manifest.modules ?? [];
|
|
51
|
+
if (modules.some((m) => m.type === "resources"))
|
|
52
|
+
return "resource";
|
|
53
|
+
if (modules.some((m) => m.type === "data" || m.type === "script"))
|
|
54
|
+
return "behavior";
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
function extractScriptInfo(manifest) {
|
|
58
|
+
const scriptModule = (manifest.modules ?? []).find((m) => m.type === "script");
|
|
59
|
+
const entry = scriptModule?.entry;
|
|
60
|
+
const language = scriptModule?.language === "typescript" ? "typescript" : "javascript";
|
|
61
|
+
const deps = (manifest.dependencies ?? []).filter((d) => typeof d === "object" &&
|
|
62
|
+
d !== null &&
|
|
63
|
+
"module_name" in d &&
|
|
64
|
+
typeof d.module_name === "string" &&
|
|
65
|
+
typeof d.version === "string");
|
|
66
|
+
return { entry, language, deps };
|
|
67
|
+
}
|
|
68
|
+
export async function handleImport(ctx) {
|
|
69
|
+
const parsed = parseArgs(ctx.argv);
|
|
70
|
+
const lang = ctx.lang ?? resolveLang(parsed.flags.lang);
|
|
71
|
+
let archivePath = parsed.positional[0];
|
|
72
|
+
let projectName = parsed.flags.name;
|
|
73
|
+
const unquote = (v) => v.replace(/^['"](.+)['"]$/, "$1").trim();
|
|
74
|
+
const skipInstall = !!parsed.flags["skip-install"];
|
|
75
|
+
const force = !!parsed.flags.force;
|
|
76
|
+
const convertFlag = parsed.flags["convert-ts"];
|
|
77
|
+
const noConvertFlag = parsed.flags["no-convert-ts"];
|
|
78
|
+
let convertTs = convertFlag !== undefined ? true : noConvertFlag !== undefined ? false : undefined;
|
|
79
|
+
let resolvedDeps = [];
|
|
80
|
+
if (!archivePath) {
|
|
81
|
+
const input = await text({
|
|
82
|
+
message: t("import.pathPrompt", lang),
|
|
83
|
+
validate: (v) => (!v.trim() ? t("import.pathRequired", lang) : undefined),
|
|
84
|
+
});
|
|
85
|
+
if (isCancel(input)) {
|
|
86
|
+
outro(t("common.cancelled", lang));
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
archivePath = unquote(String(input));
|
|
90
|
+
}
|
|
91
|
+
archivePath = resolve(process.cwd(), unquote(archivePath));
|
|
92
|
+
if (!(await pathExists(archivePath))) {
|
|
93
|
+
console.error(`Archive not found: ${archivePath}`);
|
|
94
|
+
process.exitCode = 1;
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (!projectName) {
|
|
98
|
+
const base = basename(archivePath, extname(archivePath));
|
|
99
|
+
const input = await text({
|
|
100
|
+
message: t("import.projectName", lang),
|
|
101
|
+
initialValue: base,
|
|
102
|
+
validate: (v) => (!v.trim() ? t("import.projectNameRequired", lang) : undefined),
|
|
103
|
+
});
|
|
104
|
+
if (isCancel(input)) {
|
|
105
|
+
outro(t("common.cancelled", lang));
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
projectName = unquote(String(input));
|
|
109
|
+
}
|
|
110
|
+
const targetDir = resolve(process.cwd(), "project", projectName);
|
|
111
|
+
if (await pathExists(targetDir)) {
|
|
112
|
+
if (!force) {
|
|
113
|
+
const overwrite = await confirm({
|
|
114
|
+
message: t("import.overwrite", lang),
|
|
115
|
+
initialValue: false,
|
|
116
|
+
});
|
|
117
|
+
if (isCancel(overwrite) || !overwrite) {
|
|
118
|
+
outro(t("common.cancelled", lang));
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
intro(t("import.intro", lang));
|
|
124
|
+
// 代替ログ関数
|
|
125
|
+
const logStep = (msg) => console.log(`◇ ${msg}`);
|
|
126
|
+
const logInfo = (msg) => console.log(` ${msg}`);
|
|
127
|
+
const tmp = await mkdtemp(join(tmpdir(), "bkit-import-"));
|
|
128
|
+
try {
|
|
129
|
+
logStep("Extracting archive...");
|
|
130
|
+
await unzip(archivePath, tmp);
|
|
131
|
+
logInfo("Archive extracted");
|
|
132
|
+
logStep("Scanning manifests...");
|
|
133
|
+
const manifests = await walkForManifests(tmp);
|
|
134
|
+
if (!manifests.length) {
|
|
135
|
+
throw new Error("No manifest.json found in archive");
|
|
136
|
+
}
|
|
137
|
+
let behaviorPath = null;
|
|
138
|
+
let resourcePath = null;
|
|
139
|
+
let scriptInfo = null;
|
|
140
|
+
for (const manifestFile of manifests) {
|
|
141
|
+
try {
|
|
142
|
+
const raw = await readFile(manifestFile, "utf8");
|
|
143
|
+
const manifest = JSON.parse(raw);
|
|
144
|
+
const kind = classifyManifest(manifest);
|
|
145
|
+
if (!kind)
|
|
146
|
+
continue;
|
|
147
|
+
const manifestDir = dirname(manifestFile);
|
|
148
|
+
if (kind === "behavior") {
|
|
149
|
+
behaviorPath = manifestDir;
|
|
150
|
+
scriptInfo = extractScriptInfo(manifest);
|
|
151
|
+
}
|
|
152
|
+
else if (kind === "resource") {
|
|
153
|
+
resourcePath = manifestDir;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
// ignore parse errors for malformed manifests
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
logInfo("Manifests scanned");
|
|
161
|
+
logStep("Copying files...");
|
|
162
|
+
await ensureDir(targetDir);
|
|
163
|
+
if (behaviorPath) {
|
|
164
|
+
await cp(behaviorPath, resolve(targetDir, "packs/behavior"), {
|
|
165
|
+
recursive: true,
|
|
166
|
+
force: true,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
if (resourcePath) {
|
|
170
|
+
await cp(resourcePath, resolve(targetDir, "packs/resource"), {
|
|
171
|
+
recursive: true,
|
|
172
|
+
force: true,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
// fallback: if only one pack and it was at root, still ensure dirs exist
|
|
176
|
+
await ensureDir(resolve(targetDir, "packs/behavior"));
|
|
177
|
+
await ensureDir(resolve(targetDir, "packs/resource"));
|
|
178
|
+
// Optional: convert scripts to TS (all .js under scripts)
|
|
179
|
+
if (behaviorPath && scriptInfo?.entry?.endsWith(".js")) {
|
|
180
|
+
if (convertTs === undefined) {
|
|
181
|
+
const choice = await confirm({
|
|
182
|
+
message: t("import.convertQuestion", lang),
|
|
183
|
+
initialValue: false,
|
|
184
|
+
});
|
|
185
|
+
if (isCancel(choice)) {
|
|
186
|
+
outro(t("common.cancelled", lang));
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
convertTs = !!choice;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (behaviorPath && convertTs) {
|
|
193
|
+
const scriptsDir = resolve(targetDir, "packs/behavior", "scripts");
|
|
194
|
+
await convertJsTreeToTs(scriptsDir);
|
|
195
|
+
// Adjust entry to .ts if originally .js
|
|
196
|
+
if (scriptInfo?.entry?.endsWith(".js")) {
|
|
197
|
+
const tsEntry = scriptInfo.entry.replace(/\.js$/, ".ts");
|
|
198
|
+
scriptInfo = { ...scriptInfo, entry: tsEntry, language: "typescript" };
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// build config
|
|
202
|
+
const config = {
|
|
203
|
+
project: { name: projectName, version: "1.0.0" },
|
|
204
|
+
template: "imported",
|
|
205
|
+
packSelection: {
|
|
206
|
+
behavior: !!behaviorPath,
|
|
207
|
+
resource: !!resourcePath,
|
|
208
|
+
},
|
|
209
|
+
packs: {
|
|
210
|
+
behavior: "packs/behavior",
|
|
211
|
+
resource: "packs/resource",
|
|
212
|
+
},
|
|
213
|
+
build: {
|
|
214
|
+
outDir: "dist",
|
|
215
|
+
target: "dev",
|
|
216
|
+
},
|
|
217
|
+
sync: {
|
|
218
|
+
defaultTarget: "gdk",
|
|
219
|
+
targets: {
|
|
220
|
+
gdk: {
|
|
221
|
+
product: "BedrockGDK",
|
|
222
|
+
projectName,
|
|
223
|
+
},
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
paths: {
|
|
227
|
+
root: targetDir,
|
|
228
|
+
},
|
|
229
|
+
script: scriptInfo?.entry && behaviorPath
|
|
230
|
+
? {
|
|
231
|
+
entry: scriptInfo.entry,
|
|
232
|
+
language: scriptInfo.language === "typescript" ? "typescript" : "javascript",
|
|
233
|
+
dependencies: scriptInfo.deps ?? [],
|
|
234
|
+
}
|
|
235
|
+
: undefined,
|
|
236
|
+
};
|
|
237
|
+
await writeJson(resolve(targetDir, "bkit.config.json"), config);
|
|
238
|
+
// default ignore files
|
|
239
|
+
await writeIgnoreFiles(targetDir);
|
|
240
|
+
// Install dependencies if present and not skipped
|
|
241
|
+
const deps = scriptInfo?.deps ?? [];
|
|
242
|
+
if (deps.length && !skipInstall) {
|
|
243
|
+
logStep("Resolving dependency versions...");
|
|
244
|
+
for (let i = 0; i < deps.length; i++) {
|
|
245
|
+
const dep = deps[i];
|
|
246
|
+
if (!dep.module_name || !dep.version)
|
|
247
|
+
continue;
|
|
248
|
+
logInfo(`Resolving ${dep.module_name} (${i + 1}/${deps.length})...`);
|
|
249
|
+
const resolvedVersion = await resolveVersion(dep.module_name, dep.version);
|
|
250
|
+
logInfo(` -> Resolved to ${resolvedVersion}`);
|
|
251
|
+
resolvedDeps.push({ module_name: dep.module_name, version: resolvedVersion });
|
|
252
|
+
}
|
|
253
|
+
const pkgs = resolvedDeps.map((d) => `${d.module_name}@${d.version}`);
|
|
254
|
+
// Ensure package.json exists with dependencies
|
|
255
|
+
logStep("Writing package.json...");
|
|
256
|
+
const pkgPath = resolve(targetDir, "package.json");
|
|
257
|
+
const pkgJson = (await pathExists(pkgPath))
|
|
258
|
+
? JSON.parse(await readFile(pkgPath, "utf8"))
|
|
259
|
+
: {
|
|
260
|
+
name: projectName,
|
|
261
|
+
version: "1.0.0",
|
|
262
|
+
private: true,
|
|
263
|
+
type: "module",
|
|
264
|
+
description: "Imported Bedrock addon project",
|
|
265
|
+
dependencies: {},
|
|
266
|
+
devDependencies: {},
|
|
267
|
+
scripts: {},
|
|
268
|
+
};
|
|
269
|
+
pkgJson.dependencies = pkgJson.dependencies ?? {};
|
|
270
|
+
pkgJson.devDependencies = pkgJson.devDependencies ?? {};
|
|
271
|
+
pkgJson.scripts = pkgJson.scripts ?? {};
|
|
272
|
+
for (const dep of resolvedDeps) {
|
|
273
|
+
pkgJson.dependencies[dep.module_name] = dep.version;
|
|
274
|
+
}
|
|
275
|
+
pkgJson.devDependencies["esbuild"] ??= "^0.24.0";
|
|
276
|
+
pkgJson.devDependencies["@minecraft/core-build-tasks"] ??= "^1.1.6";
|
|
277
|
+
pkgJson.scripts["build:local"] ??= "node ./tools/local-build.mjs";
|
|
278
|
+
pkgJson.scripts["package:local"] ??= "node ./tools/local-package.mjs";
|
|
279
|
+
await writeJson(pkgPath, pkgJson);
|
|
280
|
+
// スピナーを停止してから npm install を実行(出力が正しく表示されるように)
|
|
281
|
+
logStep("Installing dependencies...");
|
|
282
|
+
console.log("Running: npm install " + pkgs.join(" "));
|
|
283
|
+
try {
|
|
284
|
+
await runInstallCommand(targetDir, pkgs);
|
|
285
|
+
logInfo("Dependencies installed successfully.");
|
|
286
|
+
}
|
|
287
|
+
catch (err) {
|
|
288
|
+
console.error("Dependency installation failed:");
|
|
289
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
logInfo("Skipping dependency install.");
|
|
294
|
+
}
|
|
295
|
+
// Local build/package helpers
|
|
296
|
+
await writeLocalToolScripts(targetDir, config);
|
|
297
|
+
outro(`Imported project to ${targetDir}`);
|
|
298
|
+
}
|
|
299
|
+
catch (err) {
|
|
300
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
301
|
+
process.exitCode = 1;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
async function resolveVersion(pkg, requested) {
|
|
305
|
+
try {
|
|
306
|
+
const channels = await fetchNpmVersionChannels(pkg, { limit: 100 });
|
|
307
|
+
const all = [
|
|
308
|
+
...channels.stable,
|
|
309
|
+
...channels.beta,
|
|
310
|
+
...channels.alpha,
|
|
311
|
+
...channels.preview,
|
|
312
|
+
...channels.other,
|
|
313
|
+
];
|
|
314
|
+
if (all.includes(requested))
|
|
315
|
+
return requested;
|
|
316
|
+
const prefixMatch = all.find((v) => v.startsWith(requested));
|
|
317
|
+
if (prefixMatch)
|
|
318
|
+
return prefixMatch;
|
|
319
|
+
// fallback to latest available
|
|
320
|
+
if (all.length)
|
|
321
|
+
return all[0];
|
|
322
|
+
}
|
|
323
|
+
catch {
|
|
324
|
+
// ignore and fall through
|
|
325
|
+
}
|
|
326
|
+
return requested;
|
|
327
|
+
}
|
|
328
|
+
//# sourceMappingURL=import.js.map
|