@machineblocks/cli 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/blocks/com/machineblocks/bml/cli/Library.bml +52 -0
- package/blocks/com/machineblocks/bml/cli/README.bml +31 -0
- package/blocks/com/machineblocks/bml/cli/documentation/Commands.bml +106 -0
- package/blocks/com/machineblocks/bml/cli/documentation/Configuration.bml +54 -0
- package/blocks/com/machineblocks/bml/cli/documentation/DualCliModel.bml +51 -0
- package/blocks/com/machineblocks/bml/cli/documentation/Installation.bml +52 -0
- package/blocks/com/machineblocks/bml/cli/documentation/Introduction.bml +39 -0
- package/blocks/com/machineblocks/bml/cli/documentation/Responsibilities.bml +50 -0
- package/blocks/com/machineblocks/bml/cli/documentation/TargetBootstrap.bml +45 -0
- package/dist/args.d.ts +28 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +139 -0
- package/dist/args.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +9 -0
- package/dist/cli.js.map +1 -0
- package/dist/compile-command.d.ts +7 -0
- package/dist/compile-command.d.ts.map +1 -0
- package/dist/compile-command.js +213 -0
- package/dist/compile-command.js.map +1 -0
- package/dist/execute.d.ts +4 -0
- package/dist/execute.d.ts.map +1 -0
- package/dist/execute.js +22 -0
- package/dist/execute.js.map +1 -0
- package/dist/help.d.ts +4 -0
- package/dist/help.d.ts.map +1 -0
- package/dist/help.js +39 -0
- package/dist/help.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/init-command.d.ts +4 -0
- package/dist/init-command.d.ts.map +1 -0
- package/dist/init-command.js +121 -0
- package/dist/init-command.js.map +1 -0
- package/dist/output-gate.d.ts +11 -0
- package/dist/output-gate.d.ts.map +1 -0
- package/dist/output-gate.js +76 -0
- package/dist/output-gate.js.map +1 -0
- package/dist/validate-command.d.ts +4 -0
- package/dist/validate-command.d.ts.map +1 -0
- package/dist/validate-command.js +47 -0
- package/dist/validate-command.js.map +1 -0
- package/package.json +45 -4
- package/README.md +0 -3
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { execute } from "./execute.js";
|
|
3
|
+
const result = execute(process.argv.slice(2), process.cwd());
|
|
4
|
+
const write = result.code === 0 ? console.log : console.error;
|
|
5
|
+
for (const line of result.lines) {
|
|
6
|
+
write(line);
|
|
7
|
+
}
|
|
8
|
+
process.exit(result.code);
|
|
9
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;AAC9D,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile-command.d.ts","sourceRoot":"","sources":["../src/compile-command.ts"],"names":[],"mappings":"AAoBA,OAAO,EAA6B,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAKxE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,CA8HzE"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import { dirname, resolve } from "node:path";
|
|
4
|
+
import { bootstrapProjectTypeRegistry, loadConfig, writeOutputFiles } from "@blockml/cli";
|
|
5
|
+
import { compileToOutput, registerTarget } from "@blockml/compiler";
|
|
6
|
+
import { scanTypes } from "@blockml/framework";
|
|
7
|
+
import { BlockRenderEngine } from "@blockml/block-render-engine";
|
|
8
|
+
import { MachineBlocksRenderTarget, SELECTOR_EMPTY, SOURCE_PACKAGE_ALONE, SOURCE_PACKAGE_REQUIRED, TARGET_COLLISION, artifactExtension, isRenderBlock, mapManifestation, pathForManifestation, } from "@machineblocks/render-target";
|
|
9
|
+
import { sourcePackageFromSelector } from "./args.js";
|
|
10
|
+
import { resolveOutputPath } from "./output-gate.js";
|
|
11
|
+
const TARGET_NAME = "machineblocks-v3-scad";
|
|
12
|
+
export function runCompile(args, rootDir) {
|
|
13
|
+
const mapping = resolveMapping(args);
|
|
14
|
+
if (!mapping.ok) {
|
|
15
|
+
return { code: 2, lines: [`${mapping.code}: ${mapping.message}`] };
|
|
16
|
+
}
|
|
17
|
+
let config;
|
|
18
|
+
try {
|
|
19
|
+
config = loadConfig(rootDir);
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
return { code: 2, lines: [error instanceof Error ? error.message : String(error)] };
|
|
23
|
+
}
|
|
24
|
+
const srcDirName = config.srcDir ?? "blocks";
|
|
25
|
+
const srcDir = resolve(rootDir, srcDirName);
|
|
26
|
+
const libPath = resolveMbLibPath(rootDir, config);
|
|
27
|
+
if (!libPath) {
|
|
28
|
+
return { code: 2, lines: ["mbLibPath is not set and @machineblocks/core is not installed."] };
|
|
29
|
+
}
|
|
30
|
+
const bootstrap = bootstrapProjectTypeRegistry({ config, rootDir });
|
|
31
|
+
const bootstrapErrors = bootstrap.diagnostics.filter((diagnostic) => diagnostic.severity === "error");
|
|
32
|
+
if (bootstrapErrors.length > 0) {
|
|
33
|
+
return { code: 1, lines: bootstrapErrors.map(formatDiagnostic) };
|
|
34
|
+
}
|
|
35
|
+
const scan = scanTypes([args.selector], bootstrap.registry);
|
|
36
|
+
if (!scan.ok) {
|
|
37
|
+
return { code: 2, lines: [scan.message] };
|
|
38
|
+
}
|
|
39
|
+
const selected = scan.hits.flatMap((fqn) => {
|
|
40
|
+
const document = bootstrap.registry.get(fqn);
|
|
41
|
+
if (!document || !isRenderBlock(document.block, bootstrap.registry)) {
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
return [document];
|
|
45
|
+
});
|
|
46
|
+
if (selected.length === 0) {
|
|
47
|
+
return {
|
|
48
|
+
code: 1,
|
|
49
|
+
lines: [`${SELECTOR_EMPTY}: No block matches selector ${args.selector}.`],
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
const planned = [];
|
|
53
|
+
const targetOwners = new Map();
|
|
54
|
+
const pathOwners = new Map();
|
|
55
|
+
for (const document of selected) {
|
|
56
|
+
const manifested = mapManifestation(document.block.type, mapping.mapping, "selected");
|
|
57
|
+
if (!manifested.ok) {
|
|
58
|
+
return { code: 1, lines: [`${manifested.code}: ${manifested.message}`] };
|
|
59
|
+
}
|
|
60
|
+
const outputPath = pathForManifestation(manifested.fqn, artifactExtension(document.block));
|
|
61
|
+
const targetClash = targetOwners.get(manifested.fqn);
|
|
62
|
+
if (targetClash !== undefined) {
|
|
63
|
+
return { code: 1, lines: [collision(TARGET_COLLISION, manifested.fqn, targetClash, document.block.type)] };
|
|
64
|
+
}
|
|
65
|
+
const pathClash = pathOwners.get(outputPath);
|
|
66
|
+
if (pathClash !== undefined) {
|
|
67
|
+
return { code: 1, lines: [collision(TARGET_COLLISION, outputPath, pathClash, document.block.type)] };
|
|
68
|
+
}
|
|
69
|
+
targetOwners.set(manifested.fqn, document.block.type);
|
|
70
|
+
pathOwners.set(outputPath, document.block.type);
|
|
71
|
+
const gated = resolveOutputPath(srcDir, outputPath);
|
|
72
|
+
if (!gated.ok) {
|
|
73
|
+
return { code: 1, lines: [`${gated.code}: ${gated.message}`] };
|
|
74
|
+
}
|
|
75
|
+
const filePath = document.source.filePath;
|
|
76
|
+
if (!filePath) {
|
|
77
|
+
return { code: 1, lines: [`${document.block.type} has no source file.`] };
|
|
78
|
+
}
|
|
79
|
+
planned.push({
|
|
80
|
+
sourceFqn: document.block.type,
|
|
81
|
+
targetFqn: manifested.fqn,
|
|
82
|
+
path: outputPath,
|
|
83
|
+
filePath,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
registerTarget(new MachineBlocksRenderTarget(new BlockRenderEngine()));
|
|
87
|
+
const targetOptions = buildTargetOptions(config, libPath, mapping.mapping);
|
|
88
|
+
const emitted = [];
|
|
89
|
+
for (const item of planned) {
|
|
90
|
+
const source = readFileSync(item.filePath, "utf8");
|
|
91
|
+
const result = compileToOutput({
|
|
92
|
+
scope: { kind: "document", document: { source, filePath: item.filePath } },
|
|
93
|
+
targetOptions,
|
|
94
|
+
}, TARGET_NAME, {
|
|
95
|
+
typeRegistry: bootstrap.registry,
|
|
96
|
+
rootDir,
|
|
97
|
+
outputBasePath: srcDir,
|
|
98
|
+
});
|
|
99
|
+
const errors = result.diagnostics.filter((diagnostic) => diagnostic.severity === "error");
|
|
100
|
+
if (!result.success || errors.length > 0 || !result.output || result.output.files.length === 0) {
|
|
101
|
+
const lines = errors.map(formatDiagnostic);
|
|
102
|
+
if (lines.length === 0) {
|
|
103
|
+
lines.push(`${item.sourceFqn} produced no output.`);
|
|
104
|
+
}
|
|
105
|
+
return { code: 1, lines };
|
|
106
|
+
}
|
|
107
|
+
emitted.push(...result.output.files);
|
|
108
|
+
}
|
|
109
|
+
const files = withSourceMaps(emitted);
|
|
110
|
+
const writtenPaths = new Set();
|
|
111
|
+
for (const file of files) {
|
|
112
|
+
if (writtenPaths.has(file.path)) {
|
|
113
|
+
return {
|
|
114
|
+
code: 1,
|
|
115
|
+
lines: [`${TARGET_COLLISION}: ${file.path} is claimed by more than one artifact.`],
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
writtenPaths.add(file.path);
|
|
119
|
+
const gated = resolveOutputPath(srcDir, file.path);
|
|
120
|
+
if (!gated.ok) {
|
|
121
|
+
return { code: 1, lines: [`${gated.code}: ${gated.message}`] };
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
writeOutputFiles({ files }, srcDir, rootDir, { cleanOutDir: false });
|
|
125
|
+
return { code: 0, lines: [`Wrote ${files.length} file(s) to ${srcDir}`] };
|
|
126
|
+
}
|
|
127
|
+
function resolveMapping(args) {
|
|
128
|
+
if (args.sourcePackage !== undefined && args.targetPackage === undefined) {
|
|
129
|
+
return {
|
|
130
|
+
ok: false,
|
|
131
|
+
code: SOURCE_PACKAGE_ALONE,
|
|
132
|
+
message: "--source-package requires --target-package.",
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
if (args.targetPackage !== undefined) {
|
|
136
|
+
const sourcePackage = args.sourcePackage ?? sourcePackageFromSelector(args.selector);
|
|
137
|
+
if (sourcePackage === undefined) {
|
|
138
|
+
return {
|
|
139
|
+
ok: false,
|
|
140
|
+
code: SOURCE_PACKAGE_REQUIRED,
|
|
141
|
+
message: [
|
|
142
|
+
"--target-package needs a source package.",
|
|
143
|
+
"",
|
|
144
|
+
`The selector ${args.selector} is a single block, so the source root is not determined.`,
|
|
145
|
+
"",
|
|
146
|
+
"Specify --source-package.",
|
|
147
|
+
].join("\n"),
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
ok: true,
|
|
152
|
+
mapping: { kind: "explicit", sourcePackage, targetPackage: args.targetPackage },
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
return { ok: true, mapping: { kind: "automatic" } };
|
|
156
|
+
}
|
|
157
|
+
function buildTargetOptions(config, mbLibPath, mapping) {
|
|
158
|
+
const configured = config.targetOptions?.[TARGET_NAME];
|
|
159
|
+
const nested = {};
|
|
160
|
+
if (configured !== null && typeof configured === "object") {
|
|
161
|
+
for (const [key, value] of Object.entries(configured)) {
|
|
162
|
+
if (key !== "sourcePackage" && key !== "targetPackage" && key !== "mbLibPath") {
|
|
163
|
+
nested[key] = value;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
nested.mbLibPath = mbLibPath;
|
|
168
|
+
if (mapping.kind === "explicit") {
|
|
169
|
+
nested.sourcePackage = mapping.sourcePackage;
|
|
170
|
+
nested.targetPackage = mapping.targetPackage;
|
|
171
|
+
}
|
|
172
|
+
return { [TARGET_NAME]: nested };
|
|
173
|
+
}
|
|
174
|
+
function resolveMbLibPath(rootDir, config) {
|
|
175
|
+
const configured = config.mbLibPath;
|
|
176
|
+
if (typeof configured === "string" && configured.length > 0) {
|
|
177
|
+
return resolve(rootDir, configured);
|
|
178
|
+
}
|
|
179
|
+
const nested = config.targetOptions?.[TARGET_NAME];
|
|
180
|
+
if (nested !== null && typeof nested === "object" && "mbLibPath" in nested) {
|
|
181
|
+
const fromTarget = nested.mbLibPath;
|
|
182
|
+
if (typeof fromTarget === "string" && fromTarget.length > 0) {
|
|
183
|
+
return resolve(rootDir, fromTarget);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
try {
|
|
187
|
+
const require = createRequire(import.meta.url);
|
|
188
|
+
return dirname(require.resolve("@machineblocks/core/package.json"));
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
return undefined;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
function withSourceMaps(files) {
|
|
195
|
+
const out = [];
|
|
196
|
+
for (const file of files) {
|
|
197
|
+
out.push({ path: file.path, content: file.content });
|
|
198
|
+
const sourceMap = file.sourceMap;
|
|
199
|
+
if (typeof sourceMap === "string") {
|
|
200
|
+
out.push({ path: `${file.path}.map`, content: sourceMap });
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return out;
|
|
204
|
+
}
|
|
205
|
+
function collision(code, target, firstSource, secondSource) {
|
|
206
|
+
return `${code}: ${target} is the target of both ${firstSource} and ${secondSource}.`;
|
|
207
|
+
}
|
|
208
|
+
function formatDiagnostic(diagnostic) {
|
|
209
|
+
const source = diagnostic.source;
|
|
210
|
+
const where = source?.file ? `${source.file}:${source.line}:${source.column} ` : "";
|
|
211
|
+
return `${where}${diagnostic.code}: ${diagnostic.message}`;
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=compile-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile-command.js","sourceRoot":"","sources":["../src/compile-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../src/execute.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAKnE,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,wBAAgB,OAAO,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,CAe5E"}
|
package/dist/execute.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { parseArgs } from "./args.js";
|
|
2
|
+
import { runCompile } from "./compile-command.js";
|
|
3
|
+
import { HELP, INIT_HELP } from "./help.js";
|
|
4
|
+
import { runInit } from "./init-command.js";
|
|
5
|
+
import { runValidate } from "./validate-command.js";
|
|
6
|
+
export function execute(argv, rootDir) {
|
|
7
|
+
const parsed = parseArgs(argv);
|
|
8
|
+
if (parsed.command === "help") {
|
|
9
|
+
return { code: 0, lines: [parsed.topic === "init" ? INIT_HELP : HELP] };
|
|
10
|
+
}
|
|
11
|
+
if (parsed.command === "usage") {
|
|
12
|
+
return { code: 2, lines: [parsed.message, "", HELP] };
|
|
13
|
+
}
|
|
14
|
+
if (parsed.command === "validate") {
|
|
15
|
+
return runValidate(parsed, rootDir);
|
|
16
|
+
}
|
|
17
|
+
if (parsed.command === "init") {
|
|
18
|
+
return runInit(parsed, rootDir);
|
|
19
|
+
}
|
|
20
|
+
return runCompile(parsed, rootDir);
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=execute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../src/execute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,UAAU,EAAmB,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAIpD,MAAM,UAAU,OAAO,CAAC,IAAuB,EAAE,OAAe;IAC9D,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1E,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;QAC/B,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;IACxD,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QAClC,OAAO,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;QAC9B,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACrC,CAAC"}
|
package/dist/help.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const HELP = "Usage: machineblocks validate [file] [--all]\n machineblocks compile <source-selector> [--source-package <FQN>] [--target-package <FQN>]\n machineblocks init <package-fqn> [--src dir] [--install]\n machineblocks --help\n\nvalidate\n Same project check as blockml validate. Does not write SCAD.\n\ncompile\n Renders selected Block and Set types to SCAD with machineblocks-v3-scad.\n The selector is a BlockML type selector: an exact FQN, pkg.*, or pkg.**.\n Output is written under the configured srcDir (default blocks).\n --target-package names a package root, not a directory.\n A package selector supplies the source root when --source-package is omitted.\n An exact block FQN does not.\n\ninit\n Scaffolds a BlockML project and records the MachineBlocks profile.\n Adds devDependency @machineblocks/cli and library com.machineblocks.bml.Library.\n Does not run npm install unless --install is passed.\n\nExit 0 success, 1 diagnostics, 2 usage or config.\nSearch, inspect, graph, and new stay on blockml.\n";
|
|
2
|
+
export declare const COMPILE_HELP = "Usage: machineblocks compile <source-selector> [--source-package <FQN>] [--target-package <FQN>]\n machineblocks compile --help\n\n<source-selector> Block FQN, or a package selector ending in .* or .**\n--source-package Source package root for an explicit mapping\n--target-package Target package root. Not a directory and not one output file.\n";
|
|
3
|
+
export declare const INIT_HELP = "Usage: machineblocks init <package-fqn> [--src dir] [--install]\n machineblocks init --help\n\n<package-fqn> Dotted package identifier. A bml segment is recommended.\n--src Source directory. Default blocks.\n--install Run npm install after the MachineBlocks profile is recorded.\n";
|
|
4
|
+
//# sourceMappingURL=help.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,khCAuBhB,CAAC;AAEF,eAAO,MAAM,YAAY,yWAMxB,CAAC;AAEF,eAAO,MAAM,SAAS,kTAMrB,CAAC"}
|
package/dist/help.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export const HELP = `Usage: machineblocks validate [file] [--all]
|
|
2
|
+
machineblocks compile <source-selector> [--source-package <FQN>] [--target-package <FQN>]
|
|
3
|
+
machineblocks init <package-fqn> [--src dir] [--install]
|
|
4
|
+
machineblocks --help
|
|
5
|
+
|
|
6
|
+
validate
|
|
7
|
+
Same project check as blockml validate. Does not write SCAD.
|
|
8
|
+
|
|
9
|
+
compile
|
|
10
|
+
Renders selected Block and Set types to SCAD with machineblocks-v3-scad.
|
|
11
|
+
The selector is a BlockML type selector: an exact FQN, pkg.*, or pkg.**.
|
|
12
|
+
Output is written under the configured srcDir (default blocks).
|
|
13
|
+
--target-package names a package root, not a directory.
|
|
14
|
+
A package selector supplies the source root when --source-package is omitted.
|
|
15
|
+
An exact block FQN does not.
|
|
16
|
+
|
|
17
|
+
init
|
|
18
|
+
Scaffolds a BlockML project and records the MachineBlocks profile.
|
|
19
|
+
Adds devDependency @machineblocks/cli and library com.machineblocks.bml.Library.
|
|
20
|
+
Does not run npm install unless --install is passed.
|
|
21
|
+
|
|
22
|
+
Exit 0 success, 1 diagnostics, 2 usage or config.
|
|
23
|
+
Search, inspect, graph, and new stay on blockml.
|
|
24
|
+
`;
|
|
25
|
+
export const COMPILE_HELP = `Usage: machineblocks compile <source-selector> [--source-package <FQN>] [--target-package <FQN>]
|
|
26
|
+
machineblocks compile --help
|
|
27
|
+
|
|
28
|
+
<source-selector> Block FQN, or a package selector ending in .* or .**
|
|
29
|
+
--source-package Source package root for an explicit mapping
|
|
30
|
+
--target-package Target package root. Not a directory and not one output file.
|
|
31
|
+
`;
|
|
32
|
+
export const INIT_HELP = `Usage: machineblocks init <package-fqn> [--src dir] [--install]
|
|
33
|
+
machineblocks init --help
|
|
34
|
+
|
|
35
|
+
<package-fqn> Dotted package identifier. A bml segment is recommended.
|
|
36
|
+
--src Source directory. Default blocks.
|
|
37
|
+
--install Run npm install after the MachineBlocks profile is recorded.
|
|
38
|
+
`;
|
|
39
|
+
//# sourceMappingURL=help.js.map
|
package/dist/help.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuBnB,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;CAM3B,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;CAMxB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAmB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-command.d.ts","sourceRoot":"","sources":["../src/init-command.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAOvD,wBAAgB,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,CA2CnE"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { dirname, join, relative } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { BomBuilder } from "@blockml/builder";
|
|
6
|
+
import { initProject } from "@blockml/cli";
|
|
7
|
+
import { parse } from "@blockml/parser";
|
|
8
|
+
import { serialize } from "@blockml/serializer";
|
|
9
|
+
const CLI_PACKAGE = "@machineblocks/cli";
|
|
10
|
+
const MACHINEBLOCKS_LIBRARY = "com.machineblocks.bml.Library";
|
|
11
|
+
const MACHINEBLOCKS_NAMESPACE = "com.machineblocks.bml";
|
|
12
|
+
const BLOCK_LIBRARY_BASE = "org.blockml.bml.core.BlockLibrary";
|
|
13
|
+
export function runInit(args, rootDir) {
|
|
14
|
+
const scaffold = initProject({
|
|
15
|
+
packageFqn: args.packageFqn,
|
|
16
|
+
rootDir,
|
|
17
|
+
...(args.srcDir === undefined ? {} : { srcDir: args.srcDir }),
|
|
18
|
+
install: false,
|
|
19
|
+
});
|
|
20
|
+
const lines = scaffold.lines.map((line) => line.text);
|
|
21
|
+
if (scaffold.code !== 0) {
|
|
22
|
+
return { code: scaffold.code, lines };
|
|
23
|
+
}
|
|
24
|
+
const srcDir = args.srcDir?.trim() || "blocks";
|
|
25
|
+
const dependency = ensureCliDevDependency(rootDir);
|
|
26
|
+
lines.push(...dependency.lines);
|
|
27
|
+
if (dependency.code !== 0) {
|
|
28
|
+
return { code: dependency.code, lines };
|
|
29
|
+
}
|
|
30
|
+
const library = ensureLibraryDependency(rootDir, srcDir, args.packageFqn);
|
|
31
|
+
lines.push(...library.lines);
|
|
32
|
+
if (library.code !== 0) {
|
|
33
|
+
return { code: library.code, lines };
|
|
34
|
+
}
|
|
35
|
+
if (!args.packageFqn.split(".").includes("bml")) {
|
|
36
|
+
lines.push("Package FQN has no bml segment. Compile maps a bml segment to scad.");
|
|
37
|
+
}
|
|
38
|
+
if (!args.install) {
|
|
39
|
+
return { code: 0, lines };
|
|
40
|
+
}
|
|
41
|
+
const kept = lines.filter((line) => !line.startsWith("Next:"));
|
|
42
|
+
const needsAgents = lines.some((line) => line.startsWith("Next:") && line.includes("agents-md"));
|
|
43
|
+
const installed = npmInstall(rootDir);
|
|
44
|
+
if (installed.code !== 0) {
|
|
45
|
+
return { code: installed.code, lines: [...kept, ...installed.lines] };
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
code: 0,
|
|
49
|
+
lines: [...kept, ...installed.lines, needsAgents ? "Next: npx blockml agents-md generate" : "Next: npx blockml validate"],
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function ensureCliDevDependency(rootDir) {
|
|
53
|
+
const pkgPath = join(rootDir, "package.json");
|
|
54
|
+
let pkg;
|
|
55
|
+
try {
|
|
56
|
+
pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return { code: 2, lines: ["Could not parse package.json."] };
|
|
60
|
+
}
|
|
61
|
+
if (pkg.dependencies?.[CLI_PACKAGE] !== undefined || pkg.devDependencies?.[CLI_PACKAGE] !== undefined) {
|
|
62
|
+
return { code: 0, lines: [`Skipped existing ${CLI_PACKAGE}`] };
|
|
63
|
+
}
|
|
64
|
+
pkg.devDependencies = { ...pkg.devDependencies, [CLI_PACKAGE]: `^${ownVersion()}` };
|
|
65
|
+
writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`, "utf8");
|
|
66
|
+
return { code: 0, lines: [`Recorded devDependency ${CLI_PACKAGE}`] };
|
|
67
|
+
}
|
|
68
|
+
function ensureLibraryDependency(rootDir, srcDir, packageFqn) {
|
|
69
|
+
const libraryPath = join(rootDir, srcDir, ...packageFqn.split("."), "Library.bml");
|
|
70
|
+
const display = displayPath(libraryPath, rootDir);
|
|
71
|
+
if (!existsSync(libraryPath)) {
|
|
72
|
+
return { code: 1, lines: [`Library not found: ${display}`] };
|
|
73
|
+
}
|
|
74
|
+
const parsed = parse(readFileSync(libraryPath, "utf8"), { filePath: libraryPath });
|
|
75
|
+
if (!parsed.success || parsed.document === null) {
|
|
76
|
+
return { code: 1, lines: [`Failed to parse ${display}`] };
|
|
77
|
+
}
|
|
78
|
+
if (dependsOn(parsed.document.block, MACHINEBLOCKS_LIBRARY)) {
|
|
79
|
+
return { code: 0, lines: [`Skipped existing ${MACHINEBLOCKS_LIBRARY}`] };
|
|
80
|
+
}
|
|
81
|
+
const builder = BomBuilder.edit(parsed.document);
|
|
82
|
+
if (!dependenciesAggregation(parsed.document.block)) {
|
|
83
|
+
builder.addAggregation({ name: "dependencies", typeFqn: BLOCK_LIBRARY_BASE, override: true });
|
|
84
|
+
}
|
|
85
|
+
builder.ensureNamespaceBinding("mb", MACHINEBLOCKS_NAMESPACE);
|
|
86
|
+
builder.addCompositionChild("dependencies", MACHINEBLOCKS_LIBRARY);
|
|
87
|
+
const emitted = serialize(builder.seal());
|
|
88
|
+
if (!emitted.success || emitted.text === null) {
|
|
89
|
+
return { code: 1, lines: [`Failed to serialize ${display}`] };
|
|
90
|
+
}
|
|
91
|
+
writeFileSync(libraryPath, emitted.text, "utf8");
|
|
92
|
+
return { code: 0, lines: [`Updated ${display}`] };
|
|
93
|
+
}
|
|
94
|
+
function dependsOn(block, typeFqn) {
|
|
95
|
+
const aggregation = dependenciesAggregation(block);
|
|
96
|
+
if (!aggregation?.composition) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
return aggregation.composition.children.some((child) => child.kind === "blockInstance" && child.instance.typeFqn === typeFqn);
|
|
100
|
+
}
|
|
101
|
+
function dependenciesAggregation(block) {
|
|
102
|
+
const member = block.members.find((entry) => entry.kind === "aggregation" && entry.name === "dependencies");
|
|
103
|
+
return member?.kind === "aggregation" ? member : undefined;
|
|
104
|
+
}
|
|
105
|
+
function npmInstall(rootDir) {
|
|
106
|
+
const result = spawnSync("npm", ["install"], { cwd: rootDir, stdio: "inherit" });
|
|
107
|
+
if (result.status !== 0) {
|
|
108
|
+
return { code: 1, lines: ["npm install failed."] };
|
|
109
|
+
}
|
|
110
|
+
return { code: 0, lines: [] };
|
|
111
|
+
}
|
|
112
|
+
function ownVersion() {
|
|
113
|
+
const packageRoot = join(dirname(fileURLToPath(import.meta.url)), "..");
|
|
114
|
+
const pkg = JSON.parse(readFileSync(join(packageRoot, "package.json"), "utf8"));
|
|
115
|
+
return pkg.version ?? "0.0.0";
|
|
116
|
+
}
|
|
117
|
+
function displayPath(file, rootDir) {
|
|
118
|
+
const rel = relative(rootDir, file);
|
|
119
|
+
return rel && !rel.startsWith("..") ? rel : file;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=init-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-command.js","sourceRoot":"","sources":["../src/init-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface OutputPath {
|
|
2
|
+
ok: true;
|
|
3
|
+
absolutePath: string;
|
|
4
|
+
}
|
|
5
|
+
export interface OutputPathFailure {
|
|
6
|
+
ok: false;
|
|
7
|
+
code: string;
|
|
8
|
+
message: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function resolveOutputPath(srcDir: string, filePath: string): OutputPath | OutputPathFailure;
|
|
11
|
+
//# sourceMappingURL=output-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-gate.d.ts","sourceRoot":"","sources":["../src/output-gate.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,IAAI,CAAC;IACT,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,KAAK,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,iBAAiB,CAiClG"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { existsSync, lstatSync, realpathSync } from "node:fs";
|
|
2
|
+
import { dirname, isAbsolute, relative, resolve } from "node:path";
|
|
3
|
+
import { OUTPUT_ESCAPES_SRC, OUTPUT_OVERWRITES_BML } from "@machineblocks/render-target";
|
|
4
|
+
export function resolveOutputPath(srcDir, filePath) {
|
|
5
|
+
const srcReal = realpathSync(srcDir);
|
|
6
|
+
const portable = filePath.replaceAll("\\", "/");
|
|
7
|
+
if (portable.length === 0 || isAbsolute(filePath) || portable.split("/").includes("..")) {
|
|
8
|
+
return {
|
|
9
|
+
ok: false,
|
|
10
|
+
code: OUTPUT_ESCAPES_SRC,
|
|
11
|
+
message: `${filePath} is outside ${srcReal}.`,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
const absolute = resolve(srcReal, portable);
|
|
15
|
+
if (!isInside(srcReal, absolute)) {
|
|
16
|
+
return {
|
|
17
|
+
ok: false,
|
|
18
|
+
code: OUTPUT_ESCAPES_SRC,
|
|
19
|
+
message: `${filePath} is outside ${srcReal}.`,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
if (symlinkEscapes(srcReal, absolute)) {
|
|
23
|
+
return {
|
|
24
|
+
ok: false,
|
|
25
|
+
code: OUTPUT_ESCAPES_SRC,
|
|
26
|
+
message: `${filePath} resolves outside ${srcReal}.`,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
if (overwritesBml(absolute)) {
|
|
30
|
+
return {
|
|
31
|
+
ok: false,
|
|
32
|
+
code: OUTPUT_OVERWRITES_BML,
|
|
33
|
+
message: `${filePath} would overwrite a .bml file.`,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return { ok: true, absolutePath: absolute };
|
|
37
|
+
}
|
|
38
|
+
function symlinkEscapes(srcReal, absolute) {
|
|
39
|
+
let existing = absolute;
|
|
40
|
+
while (!existsSync(existing)) {
|
|
41
|
+
const parent = dirname(existing);
|
|
42
|
+
if (parent === existing) {
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
existing = parent;
|
|
46
|
+
}
|
|
47
|
+
const realExisting = realpathSync(existing);
|
|
48
|
+
if (!isInside(srcReal, realExisting)) {
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
if (existsSync(absolute)) {
|
|
52
|
+
const stat = lstatSync(absolute);
|
|
53
|
+
if (stat.isSymbolicLink() && !isInside(srcReal, realpathSync(absolute))) {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
function overwritesBml(absolute) {
|
|
60
|
+
if (!existsSync(absolute)) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
if (absolute.endsWith(".bml")) {
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
const stat = lstatSync(absolute);
|
|
67
|
+
if (!stat.isSymbolicLink()) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
return realpathSync(absolute).endsWith(".bml");
|
|
71
|
+
}
|
|
72
|
+
function isInside(root, candidate) {
|
|
73
|
+
const fromRoot = relative(root, candidate);
|
|
74
|
+
return fromRoot === "" || (!fromRoot.startsWith("..") && !isAbsolute(fromRoot));
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=output-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-gate.js","sourceRoot":"","sources":["../src/output-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-command.d.ts","sourceRoot":"","sources":["../src/validate-command.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,CA8B3E"}
|