@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,36 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { resolve, relative } from "node:path";
|
|
3
|
+
import { pathExists } from "./fs.js";
|
|
4
|
+
function patternToRegex(pattern) {
|
|
5
|
+
const trimmed = pattern.trim();
|
|
6
|
+
if (!trimmed || trimmed.startsWith("#"))
|
|
7
|
+
return null;
|
|
8
|
+
// Basic glob-like to regex: * => .* (greedy), leading slash anchors to start.
|
|
9
|
+
const escaped = trimmed
|
|
10
|
+
.replace(/[.+^${}()|[\]\\]/g, "\\$&")
|
|
11
|
+
.replace(/\*\*/g, ".*") // ** for deep
|
|
12
|
+
.replace(/\*/g, "[^/]*");
|
|
13
|
+
const anchored = trimmed.startsWith("/") ? `^${escaped.slice(1)}$` : `^.*${escaped}$`;
|
|
14
|
+
return new RegExp(anchored);
|
|
15
|
+
}
|
|
16
|
+
export async function loadIgnoreRules(rootDir) {
|
|
17
|
+
const file = resolve(rootDir, ".bkitignore");
|
|
18
|
+
if (!(await pathExists(file)))
|
|
19
|
+
return [];
|
|
20
|
+
const raw = await readFile(file, { encoding: "utf8" });
|
|
21
|
+
const lines = raw.split(/\r?\n/);
|
|
22
|
+
const rules = [];
|
|
23
|
+
for (const line of lines) {
|
|
24
|
+
const rx = patternToRegex(line);
|
|
25
|
+
if (rx)
|
|
26
|
+
rules.push(rx);
|
|
27
|
+
}
|
|
28
|
+
return rules;
|
|
29
|
+
}
|
|
30
|
+
export function isIgnored(pathAbs, rootDir, rules) {
|
|
31
|
+
if (!rules.length)
|
|
32
|
+
return false;
|
|
33
|
+
const rel = relative(rootDir, pathAbs).replace(/\\/g, "/");
|
|
34
|
+
return rules.some((rule) => rule.test(rel));
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=ignore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ignore.js","sourceRoot":"","sources":["../../src/utils/ignore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAIrC,SAAS,cAAc,CAAC,OAAe;IACrC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACrD,8EAA8E;IAC9E,MAAM,OAAO,GAAG,OAAO;SACpB,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC;SACpC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,cAAc;SACrC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,OAAO,GAAG,CAAC;IACtF,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAe;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAC7C,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IACzC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,EAAE;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe,EAAE,OAAe,EAAE,KAAmB;IAC7E,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAChC,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC3D,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { readFile, writeFile, rm, readdir } from "node:fs/promises";
|
|
2
|
+
import { dirname, resolve } from "node:path";
|
|
3
|
+
import * as recast from "recast";
|
|
4
|
+
import { parse } from "@babel/parser";
|
|
5
|
+
import { ensureDir } from "./fs.js";
|
|
6
|
+
const parser = {
|
|
7
|
+
parse(source) {
|
|
8
|
+
return parse(source, {
|
|
9
|
+
sourceType: "module",
|
|
10
|
+
plugins: ["jsx", "typescript"],
|
|
11
|
+
allowReturnOutsideFunction: true,
|
|
12
|
+
ranges: false,
|
|
13
|
+
});
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
function shouldRewrite(spec) {
|
|
17
|
+
return spec.endsWith(".js") || spec.endsWith(".cjs") || spec.endsWith(".mjs");
|
|
18
|
+
}
|
|
19
|
+
function rewriteSpec(spec, importerDir) {
|
|
20
|
+
if (spec.endsWith(".js"))
|
|
21
|
+
spec = spec.slice(0, -3) + ".ts";
|
|
22
|
+
else if (spec.endsWith(".cjs"))
|
|
23
|
+
spec = spec.slice(0, -4) + ".ts";
|
|
24
|
+
else if (spec.endsWith(".mjs"))
|
|
25
|
+
spec = spec.slice(0, -4) + ".ts";
|
|
26
|
+
else
|
|
27
|
+
return spec;
|
|
28
|
+
if (!spec.startsWith(".") && !spec.startsWith("/")) {
|
|
29
|
+
spec = "./" + spec;
|
|
30
|
+
}
|
|
31
|
+
return spec.replace(/\\/g, "/");
|
|
32
|
+
}
|
|
33
|
+
async function collectJs(dir, acc = []) {
|
|
34
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
35
|
+
for (const entry of entries) {
|
|
36
|
+
const full = resolve(dir, entry.name);
|
|
37
|
+
if (entry.isDirectory()) {
|
|
38
|
+
await collectJs(full, acc);
|
|
39
|
+
}
|
|
40
|
+
else if (entry.isFile() && entry.name.endsWith(".js")) {
|
|
41
|
+
acc.push(full);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return acc;
|
|
45
|
+
}
|
|
46
|
+
export async function convertJsTreeToTs(root) {
|
|
47
|
+
const files = await collectJs(root);
|
|
48
|
+
if (!files.length)
|
|
49
|
+
return;
|
|
50
|
+
for (const jsPath of files) {
|
|
51
|
+
const src = await readFile(jsPath, "utf8");
|
|
52
|
+
const ast = recast.parse(src, { parser });
|
|
53
|
+
recast.types.visit(ast, {
|
|
54
|
+
visitImportDeclaration(path) {
|
|
55
|
+
const spec = path.value.source.value;
|
|
56
|
+
if (typeof spec === "string" && shouldRewrite(spec)) {
|
|
57
|
+
path.value.source.value = rewriteSpec(spec, dirname(jsPath));
|
|
58
|
+
}
|
|
59
|
+
this.traverse(path);
|
|
60
|
+
},
|
|
61
|
+
visitCallExpression(path) {
|
|
62
|
+
const { node } = path;
|
|
63
|
+
if (node.callee.type === "Identifier" &&
|
|
64
|
+
node.callee.name === "require" &&
|
|
65
|
+
node.arguments.length &&
|
|
66
|
+
node.arguments[0].type === "StringLiteral") {
|
|
67
|
+
const spec = node.arguments[0].value;
|
|
68
|
+
if (shouldRewrite(spec)) {
|
|
69
|
+
node.arguments[0].value = rewriteSpec(spec, dirname(jsPath));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (node.callee.type === "Import" &&
|
|
73
|
+
node.arguments.length &&
|
|
74
|
+
node.arguments[0].type === "StringLiteral") {
|
|
75
|
+
const spec = node.arguments[0].value;
|
|
76
|
+
if (shouldRewrite(spec)) {
|
|
77
|
+
node.arguments[0].value = rewriteSpec(spec, dirname(jsPath));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
this.traverse(path);
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
const output = recast.print(ast).code;
|
|
84
|
+
const tsPath = jsPath.replace(/\.js$/, ".ts");
|
|
85
|
+
await ensureDir(dirname(tsPath));
|
|
86
|
+
await writeFile(tsPath, output, { encoding: "utf8" });
|
|
87
|
+
await rm(jsPath, { force: true });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=js-to-ts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"js-to-ts.js","sourceRoot":"","sources":["../../src/utils/js-to-ts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { exec, spawn } from "node:child_process";
|
|
2
|
+
import { platform } from "node:os";
|
|
3
|
+
import { promisify } from "node:util";
|
|
4
|
+
const execAsync = promisify(exec);
|
|
5
|
+
/**
|
|
6
|
+
* npm install を実行する。
|
|
7
|
+
* Windows 環境では exec を使用してより確実にプロセス終了を検出する。
|
|
8
|
+
*/
|
|
9
|
+
export async function runInstallCommand(cwd, packages = [], opts = {}) {
|
|
10
|
+
const isWin = platform() === "win32";
|
|
11
|
+
const cmd = opts.cmd ?? "npm";
|
|
12
|
+
// --no-progress: 進捗表示を無効化(Windows で stdout がブロックする問題を回避)
|
|
13
|
+
// --loglevel=error: 不要な警告を抑制
|
|
14
|
+
const baseArgs = opts.args ??
|
|
15
|
+
(packages.length
|
|
16
|
+
? ["install", "--no-progress", "--loglevel=error", ...packages]
|
|
17
|
+
: ["ci", "--no-progress", "--loglevel=error"]);
|
|
18
|
+
const timeoutMs = opts.timeoutMs ?? 120_000; // デフォルト2分
|
|
19
|
+
const attempts = [];
|
|
20
|
+
// Windows では exec を優先(プロセス終了検出がより確実)
|
|
21
|
+
if (isWin) {
|
|
22
|
+
attempts.push({
|
|
23
|
+
args: baseArgs,
|
|
24
|
+
useExec: true,
|
|
25
|
+
reason: undefined,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
attempts.push({
|
|
30
|
+
args: baseArgs,
|
|
31
|
+
useExec: false,
|
|
32
|
+
reason: undefined,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
// npm ci が失敗した場合のフォールバックとして npm install を追加(packages が空のときのみ)
|
|
36
|
+
if (!packages.length && baseArgs[0] === "ci") {
|
|
37
|
+
attempts.push({
|
|
38
|
+
args: ["install", "--no-progress", "--loglevel=error"],
|
|
39
|
+
useExec: isWin,
|
|
40
|
+
reason: "npm ci failed, retrying with npm install",
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
let lastErr;
|
|
44
|
+
for (const attempt of attempts) {
|
|
45
|
+
try {
|
|
46
|
+
if (attempt.reason) {
|
|
47
|
+
console.warn(`${attempt.reason}`);
|
|
48
|
+
}
|
|
49
|
+
if (attempt.useExec) {
|
|
50
|
+
// exec を使用(Windows でより確実)
|
|
51
|
+
await runWithExec(cmd, attempt.args, cwd, timeoutMs);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
// spawn を使用(Unix 系)
|
|
55
|
+
await runWithSpawn(cmd, attempt.args, cwd, timeoutMs);
|
|
56
|
+
}
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
lastErr = err;
|
|
61
|
+
// タイムアウトエラーの場合はリトライせず即座にスロー
|
|
62
|
+
if (err instanceof Error && err.message.includes("timed out")) {
|
|
63
|
+
throw err;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
throw lastErr instanceof Error ? lastErr : new Error(String(lastErr));
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* exec を使用してコマンドを実行(Windows 向け)
|
|
71
|
+
* exec は shell を内部で使用し、コマンド完了時に確実に Promise が解決される
|
|
72
|
+
*/
|
|
73
|
+
async function runWithExec(cmd, args, cwd, timeoutMs) {
|
|
74
|
+
const fullCmd = `${cmd} ${args.join(" ")}`;
|
|
75
|
+
try {
|
|
76
|
+
const { stdout, stderr } = await execAsync(fullCmd, {
|
|
77
|
+
cwd,
|
|
78
|
+
timeout: timeoutMs,
|
|
79
|
+
maxBuffer: 10 * 1024 * 1024, // 10MB
|
|
80
|
+
windowsHide: true,
|
|
81
|
+
});
|
|
82
|
+
// 出力を表示
|
|
83
|
+
if (stdout)
|
|
84
|
+
process.stdout.write(stdout);
|
|
85
|
+
if (stderr)
|
|
86
|
+
process.stderr.write(stderr);
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
// exec のエラーオブジェクトには stdout/stderr が含まれる
|
|
90
|
+
const execErr = err;
|
|
91
|
+
if (execErr.stdout)
|
|
92
|
+
process.stdout.write(execErr.stdout);
|
|
93
|
+
if (execErr.stderr)
|
|
94
|
+
process.stderr.write(execErr.stderr);
|
|
95
|
+
if (execErr.killed) {
|
|
96
|
+
throw new Error(`${fullCmd} timed out after ${timeoutMs}ms`);
|
|
97
|
+
}
|
|
98
|
+
if (execErr.code !== undefined && execErr.code !== 0) {
|
|
99
|
+
throw new Error(`${fullCmd} exited with code ${execErr.code}`);
|
|
100
|
+
}
|
|
101
|
+
throw err;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* spawn を使用してコマンドを実行(Unix 系向け)
|
|
106
|
+
*/
|
|
107
|
+
function runWithSpawn(cmd, args, cwd, timeoutMs) {
|
|
108
|
+
return new Promise((resolve, reject) => {
|
|
109
|
+
let settled = false;
|
|
110
|
+
let timeoutId;
|
|
111
|
+
const settle = (fn) => {
|
|
112
|
+
if (!settled) {
|
|
113
|
+
settled = true;
|
|
114
|
+
if (timeoutId)
|
|
115
|
+
clearTimeout(timeoutId);
|
|
116
|
+
fn();
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
const child = spawn(cmd, args, {
|
|
120
|
+
cwd,
|
|
121
|
+
stdio: "inherit",
|
|
122
|
+
shell: true,
|
|
123
|
+
});
|
|
124
|
+
timeoutId = setTimeout(() => {
|
|
125
|
+
settle(() => {
|
|
126
|
+
try {
|
|
127
|
+
child.kill("SIGKILL");
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
// 既に終了している場合は無視
|
|
131
|
+
}
|
|
132
|
+
reject(new Error(`${cmd} ${args.join(" ")} timed out after ${timeoutMs}ms`));
|
|
133
|
+
});
|
|
134
|
+
}, timeoutMs);
|
|
135
|
+
child.on("error", (err) => {
|
|
136
|
+
settle(() => reject(err));
|
|
137
|
+
});
|
|
138
|
+
child.on("exit", (code, signal) => {
|
|
139
|
+
settle(() => {
|
|
140
|
+
if (code === 0) {
|
|
141
|
+
resolve();
|
|
142
|
+
}
|
|
143
|
+
else if (signal) {
|
|
144
|
+
reject(new Error(`${cmd} ${args.join(" ")} was killed by signal ${signal}`));
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
reject(new Error(`${cmd} ${args.join(" ")} exited with code ${code}`));
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=npm-install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm-install.js","sourceRoot":"","sources":["../../src/utils/npm-install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
function compareSemverDesc(a, b) {
|
|
2
|
+
const ap = a.split(".").map(Number);
|
|
3
|
+
const bp = b.split(".").map(Number);
|
|
4
|
+
const hasNaN = ap.some(Number.isNaN) || bp.some(Number.isNaN);
|
|
5
|
+
if (!hasNaN) {
|
|
6
|
+
for (let i = 0; i < 3; i += 1) {
|
|
7
|
+
const av = ap[i] ?? 0;
|
|
8
|
+
const bv = bp[i] ?? 0;
|
|
9
|
+
if (av !== bv)
|
|
10
|
+
return bv - av;
|
|
11
|
+
}
|
|
12
|
+
return 0;
|
|
13
|
+
}
|
|
14
|
+
// Fallback for non-semver-ish tags (e.g., beta-1.25.9-stable): lexical desc
|
|
15
|
+
return b.localeCompare(a);
|
|
16
|
+
}
|
|
17
|
+
function classifyVersion(version) {
|
|
18
|
+
if (version.includes("beta"))
|
|
19
|
+
return "beta";
|
|
20
|
+
if (version.includes("alpha"))
|
|
21
|
+
return "alpha";
|
|
22
|
+
if (version.includes("preview"))
|
|
23
|
+
return "preview";
|
|
24
|
+
if (version.includes("-"))
|
|
25
|
+
return "other";
|
|
26
|
+
return "stable";
|
|
27
|
+
}
|
|
28
|
+
export function formatVersionLabel(version) {
|
|
29
|
+
// Trim trailing numeric build counters that follow a prerelease tag component
|
|
30
|
+
// e.g., 2.1.0-beta.1.26.0-preview.26 -> 2.1.0-beta.1.26.0-preview
|
|
31
|
+
return version.replace(/([A-Za-z][^.]*)(?:\.\d+)$/, "$1");
|
|
32
|
+
}
|
|
33
|
+
export async function fetchNpmVersionChannels(pkg, opts = {}) {
|
|
34
|
+
const limit = opts.limit ?? 15;
|
|
35
|
+
const encoded = encodeURIComponent(pkg);
|
|
36
|
+
const url = `https://registry.npmjs.org/${encoded}`;
|
|
37
|
+
const result = {
|
|
38
|
+
stable: [],
|
|
39
|
+
beta: [],
|
|
40
|
+
alpha: [],
|
|
41
|
+
preview: [],
|
|
42
|
+
other: [],
|
|
43
|
+
};
|
|
44
|
+
try {
|
|
45
|
+
// タイムアウト設定(10秒)でハングを防止
|
|
46
|
+
const controller = new AbortController();
|
|
47
|
+
const timeoutId = setTimeout(() => controller.abort(), 10_000);
|
|
48
|
+
const res = await fetch(url, { signal: controller.signal });
|
|
49
|
+
clearTimeout(timeoutId);
|
|
50
|
+
if (!res.ok)
|
|
51
|
+
return result;
|
|
52
|
+
const data = (await res.json());
|
|
53
|
+
const versions = Object.keys(data.versions ?? {}).sort(compareSemverDesc);
|
|
54
|
+
const seen = new Set();
|
|
55
|
+
for (const v of versions) {
|
|
56
|
+
// Collapse build-suffix variants (e.g., preview.24/25/26) to one entry per base.
|
|
57
|
+
const collapse = v.replace(/((?:preview|beta|alpha|rc)[^.]*)\.\d+$/i, "$1").replace(/(-[^.]+)\.\d+$/, "$1") ||
|
|
58
|
+
v;
|
|
59
|
+
const key = collapse || v;
|
|
60
|
+
if (seen.has(key))
|
|
61
|
+
continue;
|
|
62
|
+
seen.add(key);
|
|
63
|
+
const channel = classifyVersion(v);
|
|
64
|
+
if (result[channel].length < limit) {
|
|
65
|
+
result[channel].push(v);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// ignore network errors, return empty buckets
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=npm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm.js","sourceRoot":"","sources":["../../src/utils/npm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { select, isCancel, intro, outro } from "@clack/prompts";
|
|
4
|
+
import { resolveLang, t } from "./i18n.js";
|
|
5
|
+
const settingsDir = resolve(process.cwd(), ".bkit");
|
|
6
|
+
const settingsPath = resolve(settingsDir, "settings.json");
|
|
7
|
+
export async function loadSettings() {
|
|
8
|
+
try {
|
|
9
|
+
const raw = await readFile(settingsPath, "utf8");
|
|
10
|
+
return JSON.parse(raw);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return {};
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export async function saveSettings(next) {
|
|
17
|
+
await mkdir(settingsDir, { recursive: true });
|
|
18
|
+
await writeFile(settingsPath, JSON.stringify(next, null, 2), "utf8");
|
|
19
|
+
}
|
|
20
|
+
export function getSettingsPath() {
|
|
21
|
+
return settingsPath;
|
|
22
|
+
}
|
|
23
|
+
export async function ensureSettings(langInput) {
|
|
24
|
+
const current = await loadSettings();
|
|
25
|
+
if (current.initialized)
|
|
26
|
+
return current;
|
|
27
|
+
intro("BedrockKit setup");
|
|
28
|
+
const choice = await select({
|
|
29
|
+
message: t("onboarding.langPrompt", resolveLang(langInput)),
|
|
30
|
+
options: [
|
|
31
|
+
{ value: "ja", label: "日本語" },
|
|
32
|
+
{ value: "en", label: "English" },
|
|
33
|
+
],
|
|
34
|
+
initialValue: "ja",
|
|
35
|
+
});
|
|
36
|
+
if (isCancel(choice)) {
|
|
37
|
+
outro(t("onboarding.cancelled", resolveLang(langInput)));
|
|
38
|
+
throw new Error("Setup cancelled");
|
|
39
|
+
}
|
|
40
|
+
const lang = resolveLang(String(choice));
|
|
41
|
+
const next = { ...current, lang, initialized: true };
|
|
42
|
+
await saveSettings(next);
|
|
43
|
+
outro(t("onboarding.saved", lang));
|
|
44
|
+
return next;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/utils/settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEhE,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,WAAW,CAAC;AAO3C,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;AACpD,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAa,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAc;IAC/C,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,SAA4B;IAC/D,MAAM,OAAO,GAAG,MAAM,YAAY,EAAE,CAAC;IACrC,IAAI,OAAO,CAAC,WAAW;QAAE,OAAO,OAAO,CAAC;IAExC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAE1B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;QAC1B,OAAO,EAAE,CAAC,CAAC,uBAAuB,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;QAC3D,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;YAC7B,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;SAClC;QACD,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IACH,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACrB,KAAK,CAAC,CAAC,CAAC,sBAAsB,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;IACD,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACzC,MAAM,IAAI,GAAa,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC/D,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IACzB,KAAK,CAAC,CAAC,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC,CAAC;IACnC,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { writeFile, mkdir } from "node:fs/promises";
|
|
3
|
+
const localBuildScript = `import { rm, cp, stat, access } from "node:fs/promises";
|
|
4
|
+
import { resolve } from "node:path";
|
|
5
|
+
import { build as esbuild } from "esbuild";
|
|
6
|
+
import { readFile } from "node:fs/promises";
|
|
7
|
+
import { spawn } from "node:child_process";
|
|
8
|
+
|
|
9
|
+
async function main() {
|
|
10
|
+
const config = JSON.parse(await readFile("./bkit.config.json", "utf8"));
|
|
11
|
+
const rootDir = config.paths?.root ? resolve(config.paths.root) : process.cwd();
|
|
12
|
+
const outDir = resolve(rootDir, config.build?.outDir ?? "dist");
|
|
13
|
+
const behaviorEnabled = config.packSelection?.behavior !== false;
|
|
14
|
+
const resourceEnabled = config.packSelection?.resource !== false;
|
|
15
|
+
const behaviorSrc = behaviorEnabled ? resolve(rootDir, config.packs.behavior) : null;
|
|
16
|
+
const resourceSrc = resourceEnabled ? resolve(rootDir, config.packs.resource) : null;
|
|
17
|
+
const behaviorDest = behaviorSrc ? resolve(outDir, config.packs.behavior) : null;
|
|
18
|
+
const resourceDest = resourceSrc ? resolve(outDir, config.packs.resource) : null;
|
|
19
|
+
|
|
20
|
+
await rm(outDir, { recursive: true, force: true });
|
|
21
|
+
|
|
22
|
+
// Run ESLint if available
|
|
23
|
+
const eslintBin = process.platform === "win32" ? "eslint.cmd" : "eslint";
|
|
24
|
+
const eslintPath = resolve(rootDir, "node_modules", ".bin", eslintBin);
|
|
25
|
+
try {
|
|
26
|
+
await access(eslintPath);
|
|
27
|
+
await new Promise((resolvePromise, reject) => {
|
|
28
|
+
const child = spawn(eslintPath, ["packs/behavior/scripts/**/*.{ts,js}"], {
|
|
29
|
+
cwd: rootDir,
|
|
30
|
+
stdio: "inherit",
|
|
31
|
+
shell: process.platform === "win32",
|
|
32
|
+
});
|
|
33
|
+
child.on("error", reject);
|
|
34
|
+
child.on("exit", (code) => {
|
|
35
|
+
if (code === 0) resolvePromise();
|
|
36
|
+
else reject(new Error(\`eslint exited with code \${code}\`));
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
} catch {
|
|
40
|
+
console.warn("[local] eslint not found or failed; skipping lint.");
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Bundle TS entry if present
|
|
44
|
+
if (behaviorEnabled && config.script?.entry?.endsWith(".ts")) {
|
|
45
|
+
if (!behaviorSrc || !behaviorDest) throw new Error("Behavior pack path missing");
|
|
46
|
+
const entryAbs = resolve(behaviorSrc, config.script.entry);
|
|
47
|
+
const outfile = resolve(
|
|
48
|
+
behaviorDest,
|
|
49
|
+
config.script.entry.replace(/\\.ts$/, ".js"),
|
|
50
|
+
);
|
|
51
|
+
const externals =
|
|
52
|
+
(config.script.dependencies ?? [])
|
|
53
|
+
.filter(
|
|
54
|
+
(d) => d.module_name !== "@minecraft/math" && d.module_name !== "@minecraft/vanilla-data",
|
|
55
|
+
)
|
|
56
|
+
.map((d) => d.module_name) ?? [];
|
|
57
|
+
await esbuild({
|
|
58
|
+
entryPoints: [entryAbs],
|
|
59
|
+
outfile,
|
|
60
|
+
bundle: true,
|
|
61
|
+
format: "esm",
|
|
62
|
+
platform: "node",
|
|
63
|
+
target: "es2021",
|
|
64
|
+
sourcemap: true,
|
|
65
|
+
external: externals,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (behaviorEnabled && behaviorSrc && behaviorDest) {
|
|
70
|
+
await cp(behaviorSrc, behaviorDest, {
|
|
71
|
+
recursive: true,
|
|
72
|
+
force: true,
|
|
73
|
+
filter: (src) => {
|
|
74
|
+
if (!config.script?.entry?.endsWith(".ts")) return true;
|
|
75
|
+
const entryAbs = resolve(behaviorSrc, config.script.entry);
|
|
76
|
+
return src !== entryAbs; // skip TS entry when bundled
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
if (resourceEnabled && resourceSrc && resourceDest) {
|
|
81
|
+
await cp(resourceSrc, resourceDest, { recursive: true, force: true });
|
|
82
|
+
}
|
|
83
|
+
const outStat = await stat(outDir);
|
|
84
|
+
if (!outStat.isDirectory()) {
|
|
85
|
+
throw new Error(\`Build output missing: \${outDir}\`);
|
|
86
|
+
}
|
|
87
|
+
console.log(\`[local] build completed -> \${outDir}\`);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
main().catch((err) => {
|
|
91
|
+
console.error(err);
|
|
92
|
+
process.exitCode = 1;
|
|
93
|
+
});
|
|
94
|
+
`;
|
|
95
|
+
const localPackageScript = `import { resolve, dirname } from "node:path";
|
|
96
|
+
import { stat } from "node:fs/promises";
|
|
97
|
+
import { readFile } from "node:fs/promises";
|
|
98
|
+
|
|
99
|
+
async function getZipTask() {
|
|
100
|
+
const coreBuild = await import("@minecraft/core-build-tasks");
|
|
101
|
+
const task = coreBuild.zipTask || coreBuild["zipTask"];
|
|
102
|
+
if (!task) throw new Error("zipTask not found in @minecraft/core-build-tasks");
|
|
103
|
+
return task;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
async function main() {
|
|
107
|
+
const config = JSON.parse(await readFile("./bkit.config.json", "utf8"));
|
|
108
|
+
const rootDir = config.paths?.root ? resolve(config.paths.root) : process.cwd();
|
|
109
|
+
const buildDir = resolve(rootDir, config.build?.outDir ?? "dist");
|
|
110
|
+
const behaviorEnabled = config.packSelection?.behavior !== false;
|
|
111
|
+
const resourceEnabled = config.packSelection?.resource !== false;
|
|
112
|
+
const behaviorPath = behaviorEnabled ? resolve(buildDir, config.packs.behavior) : null;
|
|
113
|
+
const resourcePath = resourceEnabled ? resolve(buildDir, config.packs.resource) : null;
|
|
114
|
+
|
|
115
|
+
const st = await stat(buildDir);
|
|
116
|
+
if (!st.isDirectory()) throw new Error(\`Build directory not found: \${buildDir}\`);
|
|
117
|
+
|
|
118
|
+
const baseName = config.project?.name ?? "addon";
|
|
119
|
+
const behaviorOut = resolve(buildDir, \`\${baseName}_behavior.mcpack\`);
|
|
120
|
+
const resourceOut = resolve(buildDir, \`\${baseName}_resource.mcpack\`);
|
|
121
|
+
const zipTask = await getZipTask();
|
|
122
|
+
|
|
123
|
+
if (behaviorEnabled && behaviorPath) {
|
|
124
|
+
await zipTask(behaviorOut, [{ contents: [behaviorPath], targetPath: "" }])((err) => {
|
|
125
|
+
if (err) throw err;
|
|
126
|
+
});
|
|
127
|
+
console.log(\`[local] behavior mcpack -> \${behaviorOut}\`);
|
|
128
|
+
}
|
|
129
|
+
if (resourceEnabled && resourcePath) {
|
|
130
|
+
await zipTask(resourceOut, [{ contents: [resourcePath], targetPath: "" }])((err) => {
|
|
131
|
+
if (err) throw err;
|
|
132
|
+
});
|
|
133
|
+
console.log(\`[local] resource mcpack -> \${resourceOut}\`);
|
|
134
|
+
}
|
|
135
|
+
if (behaviorEnabled && resourceEnabled && behaviorPath && resourcePath) {
|
|
136
|
+
const addonOut = resolve(buildDir, \`\${baseName}.mcaddon\`);
|
|
137
|
+
await zipTask(addonOut, [
|
|
138
|
+
{ contents: [behaviorPath], targetPath: "behavior_pack" },
|
|
139
|
+
{ contents: [resourcePath], targetPath: "resource_pack" },
|
|
140
|
+
])((err) => {
|
|
141
|
+
if (err) throw err;
|
|
142
|
+
});
|
|
143
|
+
console.log(\`[local] mcaddon -> \${addonOut}\`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
main().catch((err) => {
|
|
148
|
+
console.error(err);
|
|
149
|
+
process.exitCode = 1;
|
|
150
|
+
});
|
|
151
|
+
`;
|
|
152
|
+
export async function writeLocalToolScripts(targetDir, config) {
|
|
153
|
+
const toolsDir = resolve(targetDir, "tools");
|
|
154
|
+
await mkdir(toolsDir, { recursive: true });
|
|
155
|
+
await writeFile(resolve(toolsDir, "local-build.mjs"), localBuildScript, "utf8");
|
|
156
|
+
await writeFile(resolve(toolsDir, "local-package.mjs"), localPackageScript, "utf8");
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=tooling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tooling.js","sourceRoot":"","sources":["../../src/utils/tooling.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAGpD,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2FxB,CAAC;AAEF,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwD1B,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,SAAiB,EAAE,MAAkB;IAC/E,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAChF,MAAM,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,MAAM,CAAC,CAAC;AACtF,CAAC"}
|
package/dist/utils/ui.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import gradient from 'gradient-string';
|
|
2
|
+
import boxen from 'boxen';
|
|
3
|
+
import pc from 'picocolors';
|
|
4
|
+
import figlet from 'figlet';
|
|
5
|
+
import { readFileSync } from 'node:fs';
|
|
6
|
+
import { resolve, dirname } from 'node:path';
|
|
7
|
+
import { fileURLToPath } from 'node:url';
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = dirname(__filename);
|
|
10
|
+
const root = resolve(__dirname, "../..");
|
|
11
|
+
const pkg = JSON.parse(readFileSync(resolve(root, "package.json"), { encoding: "utf8" }));
|
|
12
|
+
export function printBanner() {
|
|
13
|
+
console.clear();
|
|
14
|
+
// Huge ASCII Art
|
|
15
|
+
const art = figlet.textSync('BEDROCK KIT', {
|
|
16
|
+
font: 'Slant',
|
|
17
|
+
horizontalLayout: 'default',
|
|
18
|
+
verticalLayout: 'default',
|
|
19
|
+
width: 80,
|
|
20
|
+
whitespaceBreak: true
|
|
21
|
+
});
|
|
22
|
+
// Center the ASCII art using boxen
|
|
23
|
+
console.log(boxen(gradient.pastel.multiline(art), {
|
|
24
|
+
padding: 0,
|
|
25
|
+
margin: 0,
|
|
26
|
+
borderStyle: 'none',
|
|
27
|
+
float: 'center',
|
|
28
|
+
}));
|
|
29
|
+
console.log(boxen(`${pc.cyan('v' + (pkg.version || '0.0.0'))} ${pc.gray('•')} ${pc.white('TypeScript CLI for Minecraft Bedrock')}`, {
|
|
30
|
+
padding: 1,
|
|
31
|
+
margin: { top: 0, bottom: 1, left: 1, right: 1 },
|
|
32
|
+
borderStyle: 'round',
|
|
33
|
+
borderColor: 'cyan',
|
|
34
|
+
float: 'center',
|
|
35
|
+
}));
|
|
36
|
+
console.log('');
|
|
37
|
+
}
|
|
38
|
+
export function printCommandHeader(commandName, description) {
|
|
39
|
+
console.log(boxen(pc.bold(pc.cyan(` ${commandName.toUpperCase()} `)), {
|
|
40
|
+
padding: 0,
|
|
41
|
+
margin: { top: 1, bottom: 0, left: 1, right: 0 },
|
|
42
|
+
borderStyle: 'classic',
|
|
43
|
+
borderColor: 'gray',
|
|
44
|
+
}));
|
|
45
|
+
console.log(gradient.atlas(` ${description}`));
|
|
46
|
+
console.log(pc.dim(' ' + '-'.repeat(50)));
|
|
47
|
+
console.log('');
|
|
48
|
+
}
|
|
49
|
+
export function formatStep(step) {
|
|
50
|
+
return pc.bold(pc.cyan(`>> ${step}`));
|
|
51
|
+
}
|
|
52
|
+
export function formatSuccess(msg) {
|
|
53
|
+
return pc.bold(pc.green(`[ok] ${msg}`));
|
|
54
|
+
}
|
|
55
|
+
export function formatError(msg) {
|
|
56
|
+
return pc.bold(pc.red(`[error] ${msg}`));
|
|
57
|
+
}
|
|
58
|
+
export function formatDim(msg) {
|
|
59
|
+
return pc.dim(msg);
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=ui.js.map
|