@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.
Files changed (82) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +122 -0
  3. package/README.md +123 -0
  4. package/dist/cli.js +118 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/build.js +154 -0
  7. package/dist/commands/build.js.map +1 -0
  8. package/dist/commands/bump.js +156 -0
  9. package/dist/commands/bump.js.map +1 -0
  10. package/dist/commands/config.js +29 -0
  11. package/dist/commands/config.js.map +1 -0
  12. package/dist/commands/deps.js +116 -0
  13. package/dist/commands/deps.js.map +1 -0
  14. package/dist/commands/import.js +328 -0
  15. package/dist/commands/import.js.map +1 -0
  16. package/dist/commands/index.js +84 -0
  17. package/dist/commands/index.js.map +1 -0
  18. package/dist/commands/init.js +445 -0
  19. package/dist/commands/init.js.map +1 -0
  20. package/dist/commands/package.js +143 -0
  21. package/dist/commands/package.js.map +1 -0
  22. package/dist/commands/setting.js +48 -0
  23. package/dist/commands/setting.js.map +1 -0
  24. package/dist/commands/sync.js +173 -0
  25. package/dist/commands/sync.js.map +1 -0
  26. package/dist/commands/template.js +144 -0
  27. package/dist/commands/template.js.map +1 -0
  28. package/dist/commands/validate.js +180 -0
  29. package/dist/commands/validate.js.map +1 -0
  30. package/dist/commands/watch.js +117 -0
  31. package/dist/commands/watch.js.map +1 -0
  32. package/dist/config.js +76 -0
  33. package/dist/config.js.map +1 -0
  34. package/dist/core/config.js +137 -0
  35. package/dist/core/config.js.map +1 -0
  36. package/dist/core/constants.js +47 -0
  37. package/dist/core/constants.js.map +1 -0
  38. package/dist/core/logger.js +10 -0
  39. package/dist/core/logger.js.map +1 -0
  40. package/dist/core/manifest.js +147 -0
  41. package/dist/core/manifest.js.map +1 -0
  42. package/dist/core/scaffold.js +14 -0
  43. package/dist/core/scaffold.js.map +1 -0
  44. package/dist/core/script-api.js +111 -0
  45. package/dist/core/script-api.js.map +1 -0
  46. package/dist/core/templates.js +92 -0
  47. package/dist/core/templates.js.map +1 -0
  48. package/dist/help.js +35 -0
  49. package/dist/help.js.map +1 -0
  50. package/dist/manifest.js +155 -0
  51. package/dist/manifest.js.map +1 -0
  52. package/dist/templates.js +92 -0
  53. package/dist/templates.js.map +1 -0
  54. package/dist/types.js +2 -0
  55. package/dist/types.js.map +1 -0
  56. package/dist/utils/archive.js +27 -0
  57. package/dist/utils/archive.js.map +1 -0
  58. package/dist/utils/args.js +39 -0
  59. package/dist/utils/args.js.map +1 -0
  60. package/dist/utils/config-discovery.js +48 -0
  61. package/dist/utils/config-discovery.js.map +1 -0
  62. package/dist/utils/fs.js +29 -0
  63. package/dist/utils/fs.js.map +1 -0
  64. package/dist/utils/i18n.js +356 -0
  65. package/dist/utils/i18n.js.map +1 -0
  66. package/dist/utils/ignore.js +36 -0
  67. package/dist/utils/ignore.js.map +1 -0
  68. package/dist/utils/js-to-ts.js +90 -0
  69. package/dist/utils/js-to-ts.js.map +1 -0
  70. package/dist/utils/npm-install.js +153 -0
  71. package/dist/utils/npm-install.js.map +1 -0
  72. package/dist/utils/npm.js +74 -0
  73. package/dist/utils/npm.js.map +1 -0
  74. package/dist/utils/settings.js +46 -0
  75. package/dist/utils/settings.js.map +1 -0
  76. package/dist/utils/tooling.js +158 -0
  77. package/dist/utils/tooling.js.map +1 -0
  78. package/dist/utils/ui.js +61 -0
  79. package/dist/utils/ui.js.map +1 -0
  80. package/dist/utils/version.js +23 -0
  81. package/dist/utils/version.js.map +1 -0
  82. package/package.json +59 -0
@@ -0,0 +1,180 @@
1
+ import { resolve } from "node:path";
2
+ import { readFile } from "node:fs/promises";
3
+ import { loadConfigContext, resolveConfigPath, validateConfig, } from "../core/config.js";
4
+ import { parseArgs } from "../utils/args.js";
5
+ import { pathExists } from "../utils/fs.js";
6
+ import { resolveLang } from "../utils/i18n.js";
7
+ async function readManifest(path) {
8
+ const raw = await readFile(path, { encoding: "utf8" });
9
+ return JSON.parse(raw);
10
+ }
11
+ export async function handleValidate(ctx) {
12
+ const parsed = parseArgs(ctx.argv);
13
+ const lang = ctx.lang ?? resolveLang(parsed.flags.lang);
14
+ const strict = !!parsed.flags.strict;
15
+ const jsonOut = !!parsed.flags.json;
16
+ const cwd = process.cwd();
17
+ const issues = [];
18
+ const configPath = await resolveConfigPath(parsed.flags.config, lang);
19
+ if (!configPath) {
20
+ issues.push("Config selection cancelled.");
21
+ report(issues, { json: jsonOut, configPath: configPath ?? undefined });
22
+ return;
23
+ }
24
+ let configCtx;
25
+ try {
26
+ configCtx = await loadConfigContext(configPath);
27
+ }
28
+ catch (err) {
29
+ issues.push(err instanceof Error ? err.message : `Failed to load config: ${String(err)}`);
30
+ }
31
+ if (!configCtx) {
32
+ report(issues, { json: jsonOut, configPath });
33
+ return;
34
+ }
35
+ const { config, rootDir } = configCtx;
36
+ issues.push(...validateConfig(config));
37
+ const behaviorManifestPath = configCtx.behavior.path
38
+ ? resolve(configCtx.behavior.path, "manifest.json")
39
+ : null;
40
+ const resourceManifestPath = configCtx.resource.path
41
+ ? resolve(configCtx.resource.path, "manifest.json")
42
+ : null;
43
+ const behaviorExists = behaviorManifestPath ? await pathExists(behaviorManifestPath) : false;
44
+ const resourceExists = resourceManifestPath ? await pathExists(resourceManifestPath) : false;
45
+ if (configCtx.behavior.enabled && !behaviorExists && behaviorManifestPath) {
46
+ issues.push(`Missing behavior manifest at ${behaviorManifestPath}`);
47
+ }
48
+ if (configCtx.resource.enabled && !resourceExists && resourceManifestPath) {
49
+ issues.push(`Missing resource manifest at ${resourceManifestPath}`);
50
+ }
51
+ let behaviorManifest;
52
+ let resourceManifest;
53
+ if (behaviorExists && behaviorManifestPath) {
54
+ try {
55
+ behaviorManifest = await readManifest(behaviorManifestPath);
56
+ }
57
+ catch (err) {
58
+ issues.push(`Failed to parse behavior manifest: ${err instanceof Error ? err.message : String(err)}`);
59
+ }
60
+ }
61
+ if (resourceExists && resourceManifestPath) {
62
+ try {
63
+ resourceManifest = await readManifest(resourceManifestPath);
64
+ }
65
+ catch (err) {
66
+ issues.push(`Failed to parse resource manifest: ${err instanceof Error ? err.message : String(err)}`);
67
+ }
68
+ }
69
+ const uuidSet = new Set();
70
+ if (behaviorManifest && resourceManifest) {
71
+ issues.push(...validateManifestShape(behaviorManifest, "behavior", uuidSet));
72
+ issues.push(...validateManifestShape(resourceManifest, "resource", uuidSet));
73
+ const behaviorDependsOnResource = (behaviorManifest.dependencies ?? []).some((dep) => "uuid" in dep && dep.uuid === resourceManifest.header.uuid);
74
+ const resourceDependsOnBehavior = (resourceManifest.dependencies ?? []).some((dep) => "uuid" in dep && dep.uuid === behaviorManifest.header.uuid);
75
+ if (!behaviorDependsOnResource)
76
+ issues.push("Behavior pack manifest missing dependency on resource pack");
77
+ if (!resourceDependsOnBehavior)
78
+ issues.push("Resource pack manifest missing dependency on behavior pack");
79
+ if (config.script) {
80
+ const hasScriptModule = behaviorManifest.modules.some((m) => m.type === "script");
81
+ if (!hasScriptModule) {
82
+ issues.push("Behavior pack missing script module while config.script is defined");
83
+ }
84
+ const manifestScriptDeps = (behaviorManifest.dependencies ?? []).filter((d) => "module_name" in d && typeof d.module_name === "string");
85
+ const missingDeps = config.script.dependencies.filter((dep) => {
86
+ // math / vanilla-data are bundled/imported, not listed as manifest deps.
87
+ if (dep.module_name === "@minecraft/math" ||
88
+ dep.module_name === "@minecraft/vanilla-data") {
89
+ return false;
90
+ }
91
+ return !manifestScriptDeps.some((m) => m.module_name === dep.module_name);
92
+ });
93
+ if (missingDeps.length) {
94
+ issues.push(`Behavior manifest missing script dependencies: ${missingDeps
95
+ .map((d) => d.module_name)
96
+ .join(", ")}`);
97
+ }
98
+ }
99
+ }
100
+ if (strict && behaviorManifest) {
101
+ if (!behaviorManifest.header.min_engine_version)
102
+ issues.push("Behavior manifest missing min_engine_version");
103
+ if (!behaviorManifest.header.description)
104
+ issues.push("Behavior manifest missing description");
105
+ }
106
+ if (strict && resourceManifest) {
107
+ if (!resourceManifest.header.min_engine_version)
108
+ issues.push("Resource manifest missing min_engine_version");
109
+ if (!resourceManifest.header.description)
110
+ issues.push("Resource manifest missing description");
111
+ }
112
+ report(issues, { json: jsonOut, configPath });
113
+ }
114
+ function validateVersionTuple(tuple, context, issues) {
115
+ if (!Array.isArray(tuple) ||
116
+ tuple.length !== 3 ||
117
+ !tuple.every((n) => Number.isInteger(n) && n >= 0)) {
118
+ issues.push(`${context} version must be a tuple of three non-negative integers`);
119
+ }
120
+ }
121
+ function validateManifestShape(manifest, kind, seenUuids) {
122
+ const issues = [];
123
+ if (manifest.format_version !== 2) {
124
+ issues.push(`${kind} manifest format_version should be 2`);
125
+ }
126
+ if (!manifest.header?.uuid) {
127
+ issues.push(`${kind} manifest header.uuid is missing`);
128
+ }
129
+ else if (seenUuids.has(manifest.header.uuid)) {
130
+ issues.push(`${kind} manifest header.uuid duplicates another UUID`);
131
+ }
132
+ else {
133
+ seenUuids.add(manifest.header.uuid);
134
+ }
135
+ validateVersionTuple(manifest.header?.version, `${kind} manifest header`, issues);
136
+ validateVersionTuple(manifest.header?.min_engine_version, `${kind} manifest header.min_engine_version`, issues);
137
+ if (!manifest.modules || !manifest.modules.length) {
138
+ issues.push(`${kind} manifest modules are missing`);
139
+ }
140
+ else {
141
+ for (const mod of manifest.modules) {
142
+ if (!mod.uuid) {
143
+ issues.push(`${kind} manifest module missing uuid`);
144
+ }
145
+ else if (seenUuids.has(mod.uuid)) {
146
+ issues.push(`${kind} manifest module uuid duplicates another UUID`);
147
+ }
148
+ else {
149
+ seenUuids.add(mod.uuid);
150
+ }
151
+ validateVersionTuple(mod.version, `${kind} manifest module`, issues);
152
+ if (mod.type !== "data" &&
153
+ mod.type !== "resources" &&
154
+ mod.type !== "script") {
155
+ issues.push(`${kind} manifest module type '${mod.type}' is invalid`);
156
+ }
157
+ }
158
+ }
159
+ return issues;
160
+ }
161
+ function report(issues, opts = {}) {
162
+ if (opts.json) {
163
+ console.log(JSON.stringify({
164
+ ok: issues.length === 0,
165
+ issues,
166
+ configPath: opts.configPath,
167
+ }, null, 2));
168
+ if (issues.length)
169
+ process.exitCode = 1;
170
+ return;
171
+ }
172
+ if (!issues.length) {
173
+ console.log("Validation passed.");
174
+ return;
175
+ }
176
+ console.error("Validation issues:");
177
+ issues.forEach((i) => console.error(`- ${i}`));
178
+ process.exitCode = 1;
179
+ }
180
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ import chokidar from "chokidar";
2
+ import { resolve } from "node:path";
3
+ import { intro, outro, multiselect, isCancel } from "@clack/prompts";
4
+ import { createLogger } from "../core/logger.js";
5
+ import { loadConfigContext } from "../core/config.js";
6
+ import { parseArgs } from "../utils/args.js";
7
+ import { pathExists } from "../utils/fs.js";
8
+ import { handleBuild } from "./build.js";
9
+ import { handleSync } from "./sync.js";
10
+ import { readdir } from "node:fs/promises";
11
+ import { resolveLang, t } from "../utils/i18n.js";
12
+ async function discoverProjects(cwd) {
13
+ const base = resolve(cwd, "project");
14
+ if (!(await pathExists(base)))
15
+ return [];
16
+ const entries = await readdir(base, { withFileTypes: true });
17
+ const found = [];
18
+ for (const entry of entries) {
19
+ if (!entry.isDirectory())
20
+ continue;
21
+ const cfg = resolve(base, entry.name, "bkit.config.json");
22
+ if (await pathExists(cfg)) {
23
+ found.push({ name: entry.name, configPath: cfg });
24
+ }
25
+ }
26
+ return found;
27
+ }
28
+ export async function handleWatch(ctx) {
29
+ const parsed = parseArgs(ctx.argv);
30
+ const lang = ctx.lang ?? resolveLang(parsed.flags.lang);
31
+ const outDirOverride = (typeof parsed.flags["out-dir"] === "string" && parsed.flags["out-dir"]) ||
32
+ (typeof parsed.flags.outdir === "string" && parsed.flags.outdir) ||
33
+ ".watch-dist";
34
+ const quiet = !!parsed.flags.quiet || !!parsed.flags.q;
35
+ const { info: log } = createLogger({ quiet });
36
+ const projects = await discoverProjects(process.cwd());
37
+ if (!projects.length) {
38
+ console.error("No projects found under ./project");
39
+ return;
40
+ }
41
+ let selected = parsed.flags.projects
42
+ ? String(parsed.flags.projects)
43
+ .split(",")
44
+ .map((s) => s.trim())
45
+ .filter(Boolean)
46
+ : [];
47
+ if (!selected.length) {
48
+ const choice = await multiselect({
49
+ message: t("watch.selectProjects", lang),
50
+ options: projects.map((p) => ({ value: p.name, label: p.name })),
51
+ initialValues: projects.map((p) => p.name),
52
+ });
53
+ if (isCancel(choice)) {
54
+ outro(t("common.cancelled", lang));
55
+ return;
56
+ }
57
+ selected = choice;
58
+ }
59
+ const selectedProjects = projects.filter((p) => selected.includes(p.name));
60
+ if (!selectedProjects.length) {
61
+ console.error("No projects selected.");
62
+ return;
63
+ }
64
+ intro(t("watch.intro", lang));
65
+ log(`Using watch build outDir: ${outDirOverride}`);
66
+ for (const proj of selectedProjects) {
67
+ const configCtx = await loadConfigContext(proj.configPath);
68
+ const { config, rootDir } = configCtx;
69
+ const watchPaths = [];
70
+ if (config.packSelection?.behavior !== false) {
71
+ watchPaths.push(resolve(rootDir, config.packs.behavior));
72
+ }
73
+ if (config.packSelection?.resource !== false) {
74
+ watchPaths.push(resolve(rootDir, config.packs.resource));
75
+ }
76
+ const watcher = chokidar.watch(watchPaths, {
77
+ ignored: ["**/dist/**", "**/.watch-dist/**", "**/node_modules/**"],
78
+ ignoreInitial: true,
79
+ });
80
+ let pending = false;
81
+ const trigger = async (reason) => {
82
+ if (pending)
83
+ return;
84
+ pending = true;
85
+ log(`[${proj.name}] change detected (${reason}), building...`);
86
+ try {
87
+ await handleBuild({
88
+ ...ctx,
89
+ argv: ["--config", proj.configPath, "--out-dir", outDirOverride, "--quiet"],
90
+ });
91
+ await handleSync({
92
+ ...ctx,
93
+ argv: [
94
+ "--config",
95
+ proj.configPath,
96
+ "--build=false",
97
+ "--build-dir",
98
+ outDirOverride,
99
+ "--quiet",
100
+ ],
101
+ });
102
+ log(`[${proj.name}] build+sync completed.`);
103
+ }
104
+ catch (err) {
105
+ console.error(`[${proj.name}] build+sync failed:`, err instanceof Error ? err.message : err);
106
+ }
107
+ finally {
108
+ pending = false;
109
+ }
110
+ };
111
+ watcher.on("add", (p) => trigger(`add ${p}`));
112
+ watcher.on("change", (p) => trigger(`change ${p}`));
113
+ watcher.on("unlink", (p) => trigger(`unlink ${p}`));
114
+ log(`[${proj.name}] watching ${watchPaths.join(", ")}`);
115
+ }
116
+ }
117
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"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"}
package/dist/config.js ADDED
@@ -0,0 +1,76 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { resolve, extname } from "node:path";
3
+ import { pathToFileURL } from "node:url";
4
+ import { pathExists } from "./utils/fs.js";
5
+ export const defaultConfigPath = resolve(process.cwd(), "bkit.config.json");
6
+ export async function loadConfig(path = defaultConfigPath) {
7
+ if (!(await pathExists(path))) {
8
+ throw new Error(`Config not found at ${path}`);
9
+ }
10
+ const ext = extname(path).toLowerCase();
11
+ if (ext === ".json") {
12
+ const raw = await readFile(path, { encoding: "utf8" });
13
+ return JSON.parse(raw);
14
+ }
15
+ // Allow ESM config (bkit.config.ts/mjs/js)
16
+ const mod = await import(pathToFileURL(path).href);
17
+ const cfg = (mod.default ?? mod.config ?? mod);
18
+ if (!cfg) {
19
+ throw new Error(`Config module did not export a config object: ${path}`);
20
+ }
21
+ return cfg;
22
+ }
23
+ export function validateConfig(config) {
24
+ const issues = [];
25
+ if (!config.project?.name)
26
+ issues.push("config.project.name is missing");
27
+ if (!config.project?.version)
28
+ issues.push("config.project.version is missing");
29
+ if (config.packSelection?.behavior !== false && !config.packs?.behavior)
30
+ issues.push("config.packs.behavior is missing");
31
+ if (config.packSelection?.resource !== false && !config.packs?.resource)
32
+ issues.push("config.packs.resource is missing");
33
+ if (!config.build?.outDir)
34
+ issues.push("config.build.outDir is missing");
35
+ if (!config.sync?.defaultTarget)
36
+ issues.push("config.sync.defaultTarget is missing");
37
+ if (config.sync?.targets && !(config.sync.defaultTarget in config.sync.targets)) {
38
+ issues.push("config.sync.defaultTarget is not defined in sync.targets");
39
+ }
40
+ if (config.sync?.targets) {
41
+ for (const [name, target] of Object.entries(config.sync.targets)) {
42
+ if (target.product) {
43
+ // product-based deploy; no path required
44
+ if (target.product !== "BedrockUWP" &&
45
+ target.product !== "PreviewUWP" &&
46
+ target.product !== "BedrockGDK" &&
47
+ target.product !== "PreviewGDK") {
48
+ issues.push(`sync.targets['${name}'].product is invalid`);
49
+ }
50
+ }
51
+ else {
52
+ // path-based deploy
53
+ if (config.packSelection?.behavior !== false && !target.behavior) {
54
+ issues.push(`sync.targets['${name}'].behavior is missing`);
55
+ }
56
+ if (config.packSelection?.resource !== false && !target.resource) {
57
+ issues.push(`sync.targets['${name}'].resource is missing`);
58
+ }
59
+ }
60
+ }
61
+ }
62
+ if (config.paths && typeof config.paths !== "object")
63
+ issues.push("config.paths must be an object if present");
64
+ if (config.script) {
65
+ if (!config.script.entry)
66
+ issues.push("config.script.entry is missing");
67
+ if (!config.script.language)
68
+ issues.push("config.script.language is missing");
69
+ if (!config.script.dependencies?.length)
70
+ issues.push("config.script.dependencies is empty");
71
+ if (config.script.apiVersion && typeof config.script.apiVersion !== "string")
72
+ issues.push("config.script.apiVersion must be a string if provided");
73
+ }
74
+ return issues;
75
+ }
76
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,137 @@
1
+ import { readFile, readdir } from "node:fs/promises";
2
+ import { resolve, extname, dirname, relative, basename } from "node:path";
3
+ import { pathToFileURL } from "node:url";
4
+ import { isCancel, select } from "@clack/prompts";
5
+ import { resolveLang, t } from "../utils/i18n.js";
6
+ import { pathExists } from "../utils/fs.js";
7
+ export const defaultConfigPath = resolve(process.cwd(), "bkit.config.json");
8
+ export async function loadConfig(path = defaultConfigPath) {
9
+ if (!(await pathExists(path))) {
10
+ throw new Error(`Config not found at ${path}`);
11
+ }
12
+ const ext = extname(path).toLowerCase();
13
+ if (ext === ".json") {
14
+ const raw = await readFile(path, { encoding: "utf8" });
15
+ return JSON.parse(raw);
16
+ }
17
+ const mod = await import(pathToFileURL(path).href);
18
+ const cfg = (mod.default ?? mod.config ?? mod);
19
+ if (!cfg) {
20
+ throw new Error(`Config module did not export a config object: ${path}`);
21
+ }
22
+ return cfg;
23
+ }
24
+ export function validateConfig(config) {
25
+ const issues = [];
26
+ if (!config.project?.name)
27
+ issues.push("config.project.name is missing");
28
+ if (!config.project?.version)
29
+ issues.push("config.project.version is missing");
30
+ if (config.packSelection?.behavior !== false && !config.packs?.behavior)
31
+ issues.push("config.packs.behavior is missing");
32
+ if (config.packSelection?.resource !== false && !config.packs?.resource)
33
+ issues.push("config.packs.resource is missing");
34
+ if (!config.build?.outDir)
35
+ issues.push("config.build.outDir is missing");
36
+ if (!config.sync?.defaultTarget)
37
+ issues.push("config.sync.defaultTarget is missing");
38
+ if (config.sync?.targets && !(config.sync.defaultTarget in config.sync.targets)) {
39
+ issues.push("config.sync.defaultTarget is not defined in sync.targets");
40
+ }
41
+ if (config.sync?.targets) {
42
+ for (const [name, target] of Object.entries(config.sync.targets)) {
43
+ if (target.product) {
44
+ if (target.product !== "BedrockUWP" &&
45
+ target.product !== "PreviewUWP" &&
46
+ target.product !== "BedrockGDK" &&
47
+ target.product !== "PreviewGDK") {
48
+ issues.push(`sync.targets['${name}'].product is invalid`);
49
+ }
50
+ }
51
+ else {
52
+ if (config.packSelection?.behavior !== false && !target.behavior) {
53
+ issues.push(`sync.targets['${name}'].behavior is missing`);
54
+ }
55
+ if (config.packSelection?.resource !== false && !target.resource) {
56
+ issues.push(`sync.targets['${name}'].resource is missing`);
57
+ }
58
+ }
59
+ }
60
+ }
61
+ if (config.paths && typeof config.paths !== "object")
62
+ issues.push("config.paths must be an object if present");
63
+ if (config.script) {
64
+ if (!config.script.entry)
65
+ issues.push("config.script.entry is missing");
66
+ if (!config.script.language)
67
+ issues.push("config.script.language is missing");
68
+ if (!config.script.dependencies?.length)
69
+ issues.push("config.script.dependencies is empty");
70
+ if (config.script.apiVersion && typeof config.script.apiVersion !== "string")
71
+ issues.push("config.script.apiVersion must be a string if provided");
72
+ }
73
+ return issues;
74
+ }
75
+ export async function resolveConfigPath(flagPath, langInput) {
76
+ const cwd = process.cwd();
77
+ const lang = resolveLang(langInput);
78
+ if (flagPath)
79
+ return resolve(cwd, flagPath);
80
+ const discovered = await discoverAddonConfigs(cwd);
81
+ if (discovered.length === 0) {
82
+ return resolve(cwd, "bkit.config.json");
83
+ }
84
+ if (discovered.length === 1)
85
+ return discovered[0];
86
+ const cwdRel = (p) => relative(cwd, p).replace(/\\/g, "/");
87
+ const options = discovered.map((p) => {
88
+ const projectName = basename(dirname(p));
89
+ return {
90
+ value: p,
91
+ label: `${projectName} (${cwdRel(p)})`,
92
+ };
93
+ });
94
+ const choice = await select({
95
+ message: t("config.selectProject", lang),
96
+ options,
97
+ });
98
+ if (isCancel(choice))
99
+ return null;
100
+ return String(choice);
101
+ }
102
+ export async function loadConfigContext(configPath) {
103
+ const config = await loadConfig(configPath);
104
+ const configDir = dirname(configPath);
105
+ const rootDir = config.paths?.root ? resolve(configDir, config.paths.root) : configDir;
106
+ const behaviorEnabled = config.packSelection?.behavior !== false;
107
+ const resourceEnabled = config.packSelection?.resource !== false;
108
+ const behaviorPath = behaviorEnabled ? resolve(rootDir, config.packs.behavior) : null;
109
+ const resourcePath = resourceEnabled ? resolve(rootDir, config.packs.resource) : null;
110
+ return {
111
+ configPath,
112
+ config,
113
+ configDir,
114
+ rootDir,
115
+ behavior: { enabled: behaviorEnabled, path: behaviorPath },
116
+ resource: { enabled: resourceEnabled, path: resourcePath },
117
+ };
118
+ }
119
+ export function resolveOutDir(ctx, override) {
120
+ return resolve(ctx.rootDir, override ?? ctx.config.build?.outDir ?? "dist");
121
+ }
122
+ async function discoverAddonConfigs(cwd) {
123
+ const base = resolve(cwd, "project");
124
+ if (!(await pathExists(base)))
125
+ return [];
126
+ const entries = await readdir(base, { withFileTypes: true });
127
+ const configs = [];
128
+ for (const entry of entries) {
129
+ if (!entry.isDirectory())
130
+ continue;
131
+ const configPath = resolve(base, entry.name, "bkit.config.json");
132
+ if (await pathExists(configPath))
133
+ configs.push(configPath);
134
+ }
135
+ return configs;
136
+ }
137
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ export const DEFAULT_BKIT_IGNORE = [
2
+ "# Build output",
3
+ "dist/",
4
+ "",
5
+ "# Dependencies",
6
+ "node_modules/",
7
+ "",
8
+ "# VCS / editor",
9
+ ".git/",
10
+ ".vscode/",
11
+ ".idea/",
12
+ ".DS_Store",
13
+ "Thumbs.db",
14
+ "",
15
+ "# Logs / temp",
16
+ "*.log",
17
+ "*.tmp",
18
+ ];
19
+ export const DEFAULT_GIT_IGNORE = [
20
+ "# Logs",
21
+ "*.log",
22
+ "npm-debug.log*",
23
+ "yarn-debug.log*",
24
+ "pnpm-debug.log*",
25
+ "",
26
+ "# Dependencies",
27
+ "node_modules/",
28
+ "",
29
+ "# Build outputs",
30
+ "dist/",
31
+ ".watch-dist/",
32
+ "",
33
+ "# Env / cache",
34
+ ".env",
35
+ ".env.local",
36
+ ".bkit/",
37
+ "",
38
+ "# IDE / OS",
39
+ ".vscode/",
40
+ ".idea/",
41
+ ".DS_Store",
42
+ "Thumbs.db",
43
+ ];
44
+ export function buildIgnoreFileContent(lines) {
45
+ return `${lines.filter(Boolean).join("\n")}\n`;
46
+ }
47
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/core/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAa;IAC3C,gBAAgB;IAChB,OAAO;IACP,EAAE;IACF,gBAAgB;IAChB,eAAe;IACf,EAAE;IACF,gBAAgB;IAChB,OAAO;IACP,UAAU;IACV,QAAQ;IACR,WAAW;IACX,WAAW;IACX,EAAE;IACF,eAAe;IACf,OAAO;IACP,OAAO;CACR,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAa;IAC1C,QAAQ;IACR,OAAO;IACP,gBAAgB;IAChB,iBAAiB;IACjB,iBAAiB;IACjB,EAAE;IACF,gBAAgB;IAChB,eAAe;IACf,EAAE;IACF,iBAAiB;IACjB,OAAO;IACP,cAAc;IACd,EAAE;IACF,eAAe;IACf,MAAM;IACN,YAAY;IACZ,QAAQ;IACR,EAAE;IACF,YAAY;IACZ,UAAU;IACV,QAAQ;IACR,WAAW;IACX,WAAW;CACZ,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,KAAe;IACpD,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjD,CAAC"}
@@ -0,0 +1,10 @@
1
+ export function createLogger(opts = {}) {
2
+ const silent = opts.quiet || opts.json;
3
+ const noop = () => { };
4
+ return {
5
+ info: silent ? noop : console.log,
6
+ warn: silent ? noop : console.warn,
7
+ error: console.error,
8
+ };
9
+ }
10
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,YAAY,CAAC,OAA4C,EAAE;IACzE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC;IACvC,MAAM,IAAI,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;IACtB,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG;QACjC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC;AACJ,CAAC"}