@metamesh/generator-sdk 0.5.2 → 0.7.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/CHANGELOG.md +14 -0
- package/README.md +156 -152
- package/dist/authoring.d.ts +57 -0
- package/dist/authoring.d.ts.map +1 -0
- package/dist/authoring.js +33 -0
- package/dist/authoring.js.map +1 -0
- package/dist/contracts.d.ts +34 -99
- package/dist/contracts.d.ts.map +1 -1
- package/dist/execute-generator.d.ts +22 -28
- package/dist/execute-generator.d.ts.map +1 -1
- package/dist/execute-generator.js +27 -32
- package/dist/execute-generator.js.map +1 -1
- package/dist/generated-parts.d.ts +1 -2
- package/dist/generated-parts.d.ts.map +1 -1
- package/dist/generated-parts.js +7 -31
- package/dist/generated-parts.js.map +1 -1
- package/dist/generator-module.d.ts +18 -40
- package/dist/generator-module.d.ts.map +1 -1
- package/dist/generator-module.js +4 -111
- package/dist/generator-module.js.map +1 -1
- package/dist/generator-package/constants.d.ts +2 -2
- package/dist/generator-package/constants.js +2 -2
- package/dist/generator-package/schemas/definition.schema.d.ts +3 -0
- package/dist/generator-package/schemas/definition.schema.d.ts.map +1 -1
- package/dist/generator-package/schemas/manifest.schema.d.ts +5 -8422
- package/dist/generator-package/schemas/manifest.schema.d.ts.map +1 -1
- package/dist/generator-package/schemas/parameter.schema.d.ts +7 -0
- package/dist/generator-package/schemas/parameter.schema.d.ts.map +1 -1
- package/dist/generator-package/schemas/parameter.schema.js +2 -0
- package/dist/generator-package/schemas/parameter.schema.js.map +1 -1
- package/dist/generator-package/schemas/preset.schema.d.ts +2 -13
- package/dist/generator-package/schemas/preset.schema.d.ts.map +1 -1
- package/dist/generator-package/schemas/preset.schema.js.map +1 -1
- package/dist/generator-package/validate-definition.d.ts.map +1 -1
- package/dist/generator-package/validate-definition.js +18 -0
- package/dist/generator-package/validate-definition.js.map +1 -1
- package/dist/generator-package/validate-manifest.d.ts.map +1 -1
- package/dist/generator-package/validate-manifest.js +2 -13
- package/dist/generator-package/validate-manifest.js.map +1 -1
- package/dist/generator-services.d.ts +1 -1
- package/dist/generator-services.d.ts.map +1 -1
- package/dist/index.d.ts +8 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -6
- package/dist/index.js.map +1 -1
- package/dist/parameter-contracts.d.ts +121 -0
- package/dist/parameter-contracts.d.ts.map +1 -0
- package/dist/parameter-contracts.js +2 -0
- package/dist/parameter-contracts.js.map +1 -0
- package/dist/parameters/issues.d.ts +14 -0
- package/dist/parameters/issues.d.ts.map +1 -0
- package/dist/parameters/issues.js +262 -0
- package/dist/parameters/issues.js.map +1 -0
- package/dist/parameters/preparation.d.ts +13 -0
- package/dist/parameters/preparation.d.ts.map +1 -0
- package/dist/parameters/preparation.js +35 -0
- package/dist/parameters/preparation.js.map +1 -0
- package/dist/parameters/recovery.d.ts +10 -0
- package/dist/parameters/recovery.d.ts.map +1 -0
- package/dist/parameters/recovery.js +124 -0
- package/dist/parameters/recovery.js.map +1 -0
- package/dist/parameters/strict.d.ts +30 -0
- package/dist/parameters/strict.d.ts.map +1 -0
- package/dist/parameters/strict.js +116 -0
- package/dist/parameters/strict.js.map +1 -0
- package/dist/parameters/values.d.ts +13 -0
- package/dist/parameters/values.d.ts.map +1 -0
- package/dist/parameters/values.js +73 -0
- package/dist/parameters/values.js.map +1 -0
- package/dist/parameters.d.ts +7 -69
- package/dist/parameters.d.ts.map +1 -1
- package/dist/parameters.js +5 -592
- package/dist/parameters.js.map +1 -1
- package/dist/parse-generator-module.d.ts +29 -0
- package/dist/parse-generator-module.d.ts.map +1 -0
- package/dist/parse-generator-module.js +137 -0
- package/dist/parse-generator-module.js.map +1 -0
- package/dist/runtime.d.ts +10 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +5 -0
- package/dist/runtime.js.map +1 -0
- package/dist/worker-contracts.d.ts +80 -0
- package/dist/worker-contracts.d.ts.map +1 -0
- package/dist/worker-contracts.js +12 -0
- package/dist/worker-contracts.js.map +1 -0
- package/package.json +14 -1
- package/dist/prepared-generator-module.d.ts +0 -24
- package/dist/prepared-generator-module.d.ts.map +0 -1
- package/dist/prepared-generator-module.js +0 -124
- package/dist/prepared-generator-module.js.map +0 -1
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { GeneratorDefinition, GeneratorIssue, GeneratorParams } from "./contracts.js";
|
|
2
|
+
import type { Preparation } from "./generator-module.js";
|
|
3
|
+
import { GENERATOR_PACKAGE_FORMAT_VERSION } from "./generator-package/constants.js";
|
|
4
|
+
import type { GeneratorServices } from "./generator-services.js";
|
|
5
|
+
/** A one-use closure captures preparation without exposing arbitrary prepared-value invocation. */
|
|
6
|
+
export interface PreparedBuild<Context, Output> {
|
|
7
|
+
readonly ok: true;
|
|
8
|
+
readonly issues: readonly GeneratorIssue[];
|
|
9
|
+
readonly build: (context: Context) => Output;
|
|
10
|
+
}
|
|
11
|
+
export interface ParsedGeneratorModule<D extends GeneratorDefinition = GeneratorDefinition, Context = unknown, Output = unknown> {
|
|
12
|
+
readonly formatVersion: typeof GENERATOR_PACKAGE_FORMAT_VERSION;
|
|
13
|
+
readonly generatorId: D["id"];
|
|
14
|
+
readonly version: D["version"];
|
|
15
|
+
readonly prepare: (parameters: GeneratorParams<D>, services: GeneratorServices) => PreparedBuild<Context, Output> | {
|
|
16
|
+
readonly ok: false;
|
|
17
|
+
readonly issues: readonly GeneratorIssue<D>[];
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/** Inspects only the result envelope and issues. The prepared value remains opaque. */
|
|
21
|
+
export declare function parsePreparation<D extends GeneratorDefinition, P>(definition: D, result: unknown): Preparation<D, P>;
|
|
22
|
+
export declare function capturePreparation<D extends GeneratorDefinition, P, Context, Output>(definition: D, result: unknown, build: (prepared: P, context: Context) => Output): PreparedBuild<Context, Output> | {
|
|
23
|
+
readonly ok: false;
|
|
24
|
+
readonly issues: readonly GeneratorIssue<D>[];
|
|
25
|
+
};
|
|
26
|
+
/** Captures the exact format-2 surface; unsupported formats fail before callback invocation. */
|
|
27
|
+
export declare function parseGeneratorModule<D extends GeneratorDefinition, Context = unknown, Output = unknown>(value: unknown, definition: D): ParsedGeneratorModule<D, Context, Output>;
|
|
28
|
+
export declare function isGeneratorModule<D extends GeneratorDefinition>(value: unknown, definition: D): boolean;
|
|
29
|
+
//# sourceMappingURL=parse-generator-module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-generator-module.d.ts","sourceRoot":"","sources":["../src/parse-generator-module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC3F,OAAO,KAAK,EAAmB,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,gCAAgC,EAAE,MAAM,kCAAkC,CAAC;AACpF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAajE,mGAAmG;AACnG,MAAM,WAAW,aAAa,CAAC,OAAO,EAAE,MAAM;IAC5C,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC;CAC9C;AAED,MAAM,WAAW,qBAAqB,CACpC,CAAC,SAAS,mBAAmB,GAAG,mBAAmB,EACnD,OAAO,GAAG,OAAO,EACjB,MAAM,GAAG,OAAO;IAEhB,QAAQ,CAAC,aAAa,EAAE,OAAO,gCAAgC,CAAC;IAChE,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,CAChB,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,EAC9B,QAAQ,EAAE,iBAAiB,KAEzB,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,GAC9B;QAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,cAAc,CAAC,CAAC,CAAC,EAAE,CAAA;KAAE,CAAC;CAC3E;AAiCD,uFAAuF;AACvF,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,mBAAmB,EAAE,CAAC,EAC/D,UAAU,EAAE,CAAC,EACb,MAAM,EAAE,OAAO,GACd,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAyBnB;AAED,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,mBAAmB,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAClF,UAAU,EAAE,CAAC,EACb,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,GAE9C,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,GAC9B;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,cAAc,CAAC,CAAC,CAAC,EAAE,CAAA;CAAE,CAkBxE;AAED,gGAAgG;AAChG,wBAAgB,oBAAoB,CAClC,CAAC,SAAS,mBAAmB,EAC7B,OAAO,GAAG,OAAO,EACjB,MAAM,GAAG,OAAO,EAChB,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,GAAG,qBAAqB,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CA2C1E;AAED,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,mBAAmB,EAC7D,KAAK,EAAE,OAAO,EACd,UAAU,EAAE,CAAC,GACZ,OAAO,CAOT"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { GENERATOR_PACKAGE_FORMAT_VERSION } from "./generator-package/constants.js";
|
|
2
|
+
import { parseParameterIssues } from "./parameters.js";
|
|
3
|
+
const EXPORT_NAMES = ["build", "formatVersion", "generatorId", "prepare", "version"];
|
|
4
|
+
function ownData(value, key) {
|
|
5
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
6
|
+
if (descriptor === undefined || !("value" in descriptor)) {
|
|
7
|
+
throw new TypeError(`Generator ${key} must be an own data field.`);
|
|
8
|
+
}
|
|
9
|
+
return descriptor.value;
|
|
10
|
+
}
|
|
11
|
+
function assertSynchronousResult(value, method) {
|
|
12
|
+
if ((typeof value === "object" && value !== null) || typeof value === "function") {
|
|
13
|
+
// Inspect descriptors rather than calling a then getter on executable output.
|
|
14
|
+
let prototype = value;
|
|
15
|
+
let depth = 0;
|
|
16
|
+
let inspectThen = true;
|
|
17
|
+
while (prototype !== null) {
|
|
18
|
+
if (++depth > 64)
|
|
19
|
+
throw new TypeError(`Generator ${method} output prototype depth exceeds limits.`);
|
|
20
|
+
const descriptor = inspectThen
|
|
21
|
+
? Object.getOwnPropertyDescriptor(prototype, "then")
|
|
22
|
+
: undefined;
|
|
23
|
+
if (prototype === Promise.prototype ||
|
|
24
|
+
(descriptor !== undefined &&
|
|
25
|
+
(!("value" in descriptor) || typeof descriptor.value === "function"))) {
|
|
26
|
+
try {
|
|
27
|
+
// Observe intrinsic Promise rejections without calling executable then methods.
|
|
28
|
+
void Promise.prototype.then.call(value, undefined, () => undefined);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// Arbitrary thenables and Promise species failures retain the synchronous misuse error.
|
|
32
|
+
}
|
|
33
|
+
throw new TypeError(`Generator ${method}() must return synchronously.`);
|
|
34
|
+
}
|
|
35
|
+
if (descriptor !== undefined)
|
|
36
|
+
inspectThen = false;
|
|
37
|
+
prototype = Object.getPrototypeOf(prototype);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/** Inspects only the result envelope and issues. The prepared value remains opaque. */
|
|
42
|
+
export function parsePreparation(definition, result) {
|
|
43
|
+
assertSynchronousResult(result, "prepare");
|
|
44
|
+
if (typeof result !== "object" || result === null || Array.isArray(result)) {
|
|
45
|
+
throw new TypeError("Generator prepare() must return a result object synchronously.");
|
|
46
|
+
}
|
|
47
|
+
const ok = ownData(result, "ok");
|
|
48
|
+
if (typeof ok !== "boolean")
|
|
49
|
+
throw new TypeError("Generator preparation ok must be boolean.");
|
|
50
|
+
const expected = ok ? ["ok", "value", "issues"] : ["ok", "issues"];
|
|
51
|
+
const keys = Reflect.ownKeys(result);
|
|
52
|
+
if (keys.length !== expected.length ||
|
|
53
|
+
keys.some((key) => typeof key !== "string" || !expected.includes(key))) {
|
|
54
|
+
throw new TypeError("Generator preparation must contain exactly its result fields.");
|
|
55
|
+
}
|
|
56
|
+
const issues = parseParameterIssues(definition, ownData(result, "issues"));
|
|
57
|
+
const hasError = issues.some(({ severity }) => severity === "error");
|
|
58
|
+
if (ok === hasError) {
|
|
59
|
+
throw new TypeError("Generator preparation success must agree with its validation errors.");
|
|
60
|
+
}
|
|
61
|
+
if (!ok)
|
|
62
|
+
return Object.freeze({ ok: false, issues });
|
|
63
|
+
return Object.freeze({ ok: true, value: ownData(result, "value"), issues });
|
|
64
|
+
}
|
|
65
|
+
export function capturePreparation(definition, result, build) {
|
|
66
|
+
const parsed = parsePreparation(definition, result);
|
|
67
|
+
if (!parsed.ok)
|
|
68
|
+
return parsed;
|
|
69
|
+
let value = parsed.value;
|
|
70
|
+
let available = true;
|
|
71
|
+
return Object.freeze({
|
|
72
|
+
ok: true,
|
|
73
|
+
issues: parsed.issues,
|
|
74
|
+
build(context) {
|
|
75
|
+
if (!available)
|
|
76
|
+
throw new TypeError("Prepared Generator build has already been consumed.");
|
|
77
|
+
available = false;
|
|
78
|
+
const preparedValue = value;
|
|
79
|
+
value = undefined;
|
|
80
|
+
const output = build(preparedValue, context);
|
|
81
|
+
assertSynchronousResult(output, "build");
|
|
82
|
+
return output;
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/** Captures the exact format-2 surface; unsupported formats fail before callback invocation. */
|
|
87
|
+
export function parseGeneratorModule(value, definition) {
|
|
88
|
+
try {
|
|
89
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
90
|
+
throw new TypeError("must be an object");
|
|
91
|
+
}
|
|
92
|
+
if (ownData(value, "formatVersion") !== GENERATOR_PACKAGE_FORMAT_VERSION) {
|
|
93
|
+
throw new TypeError(`unsupported formatVersion; expected ${GENERATOR_PACKAGE_FORMAT_VERSION}`);
|
|
94
|
+
}
|
|
95
|
+
const names = Reflect.ownKeys(value)
|
|
96
|
+
.filter((key) => key !== Symbol.toStringTag)
|
|
97
|
+
.sort((left, right) => String(left).localeCompare(String(right)));
|
|
98
|
+
if (names.length !== EXPORT_NAMES.length ||
|
|
99
|
+
names.some((name, index) => name !== EXPORT_NAMES[index])) {
|
|
100
|
+
throw new TypeError(`must export exactly ${EXPORT_NAMES.join(", ")}`);
|
|
101
|
+
}
|
|
102
|
+
const generatorId = ownData(value, "generatorId");
|
|
103
|
+
const version = ownData(value, "version");
|
|
104
|
+
const prepare = ownData(value, "prepare");
|
|
105
|
+
const build = ownData(value, "build");
|
|
106
|
+
if (generatorId !== definition.id || version !== definition.version) {
|
|
107
|
+
throw new TypeError("identity must match the manifest definition");
|
|
108
|
+
}
|
|
109
|
+
if (typeof prepare !== "function" || typeof build !== "function") {
|
|
110
|
+
throw new TypeError("prepare and build must be functions");
|
|
111
|
+
}
|
|
112
|
+
const typedPrepare = prepare;
|
|
113
|
+
const typedBuild = build;
|
|
114
|
+
return Object.freeze({
|
|
115
|
+
formatVersion: GENERATOR_PACKAGE_FORMAT_VERSION,
|
|
116
|
+
generatorId: definition.id,
|
|
117
|
+
version: definition.version,
|
|
118
|
+
prepare(parameters, services) {
|
|
119
|
+
return capturePreparation(definition, typedPrepare(parameters, services), typedBuild);
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
catch (cause) {
|
|
124
|
+
const detail = cause instanceof Error ? cause.message : "exports could not be inspected";
|
|
125
|
+
throw new TypeError(`Invalid Generator module: ${detail}.`, { cause });
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
export function isGeneratorModule(value, definition) {
|
|
129
|
+
try {
|
|
130
|
+
parseGeneratorModule(value, definition);
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=parse-generator-module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-generator-module.js","sourceRoot":"","sources":["../src/parse-generator-module.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { parseGeneratorModule, isGeneratorModule, parsePreparation, } from "./parse-generator-module.js";
|
|
2
|
+
export type { ParsedGeneratorModule, PreparedBuild } from "./parse-generator-module.js";
|
|
3
|
+
export { prepareGenerator, executeGenerator } from "./execute-generator.js";
|
|
4
|
+
export type { PrepareGeneratorOptions, ExecuteGeneratorOptions, GeneratorExecutionResult, GeneratorExecutionInvalid, GeneratorExecutionBuilt, GeneratorExecutionPrepared, GeneratorPreparationResult, } from "./execute-generator.js";
|
|
5
|
+
export { parseGeneratedParts } from "./generated-parts.js";
|
|
6
|
+
export type { GeneratedPartsLimits } from "./generated-parts.js";
|
|
7
|
+
export type { GeneratedPart, GeneratedModel, ModelBounds, ModelStats, ModelTimings, MeshTopologyMode, } from "./contracts.js";
|
|
8
|
+
export type * from "./worker-contracts.js";
|
|
9
|
+
export { parseGenerationSentAt } from "./worker-contracts.js";
|
|
10
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AACrC,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC5E,YAAY,EACV,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,EACvB,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,YAAY,EACV,aAAa,EACb,cAAc,EACd,WAAW,EACX,UAAU,EACV,YAAY,EACZ,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,mBAAmB,uBAAuB,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/runtime.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { parseGeneratorModule, isGeneratorModule, parsePreparation, } from "./parse-generator-module.js";
|
|
2
|
+
export { prepareGenerator, executeGenerator } from "./execute-generator.js";
|
|
3
|
+
export { parseGeneratedParts } from "./generated-parts.js";
|
|
4
|
+
export { parseGenerationSentAt } from "./worker-contracts.js";
|
|
5
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAU5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAW3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { GeneratedModel, MeshTopologyMode, ParameterValidationResult, ParameterValues } from "./contracts.js";
|
|
2
|
+
import type { GeneratorRuntimeReference } from "./generator-packages.js";
|
|
3
|
+
export interface GenerateRequest {
|
|
4
|
+
readonly type: "generate";
|
|
5
|
+
readonly requestId: number;
|
|
6
|
+
readonly generatorId: string;
|
|
7
|
+
readonly meshTopologyMode: MeshTopologyMode;
|
|
8
|
+
readonly runtime: GeneratorRuntimeReference;
|
|
9
|
+
readonly parameters: ParameterValues;
|
|
10
|
+
}
|
|
11
|
+
export interface ValidateRequest {
|
|
12
|
+
readonly type: "validate";
|
|
13
|
+
readonly requestId: number;
|
|
14
|
+
readonly generatorId: string;
|
|
15
|
+
readonly runtime: GeneratorRuntimeReference;
|
|
16
|
+
readonly parameters: ParameterValues;
|
|
17
|
+
}
|
|
18
|
+
export interface Export3mfRequest {
|
|
19
|
+
/** Project appearance overrides keyed by semantic part ID; does not affect generation. */
|
|
20
|
+
readonly partColors?: Readonly<Record<string, string>>;
|
|
21
|
+
readonly type: "export-3mf";
|
|
22
|
+
readonly requestId: number;
|
|
23
|
+
readonly filename: string;
|
|
24
|
+
/** Captured finalized geometry. Export never evaluates generator code. */
|
|
25
|
+
readonly model: GeneratedModel;
|
|
26
|
+
readonly name: string;
|
|
27
|
+
}
|
|
28
|
+
export interface ValidationSuccess {
|
|
29
|
+
readonly type: "validation-success";
|
|
30
|
+
readonly requestId: number;
|
|
31
|
+
readonly validation: ParameterValidationResult;
|
|
32
|
+
}
|
|
33
|
+
export interface GenerationSuccess {
|
|
34
|
+
readonly type: "generation-success";
|
|
35
|
+
readonly requestId: number;
|
|
36
|
+
readonly model: GeneratedModel;
|
|
37
|
+
/** High-resolution epoch milliseconds captured immediately before posting the completed model. */
|
|
38
|
+
readonly sentAt: number;
|
|
39
|
+
}
|
|
40
|
+
/** Reads an own data timestamp without invoking accessors or accepting malformed transport data. */
|
|
41
|
+
export declare function parseGenerationSentAt(response: unknown): number;
|
|
42
|
+
export interface GenerationInvalid {
|
|
43
|
+
readonly type: "generation-invalid";
|
|
44
|
+
readonly requestId: number;
|
|
45
|
+
readonly validation: ParameterValidationResult;
|
|
46
|
+
}
|
|
47
|
+
export interface ExportedFile {
|
|
48
|
+
readonly bytes: ArrayBuffer;
|
|
49
|
+
readonly filename: string;
|
|
50
|
+
readonly mimeType: "model/3mf";
|
|
51
|
+
}
|
|
52
|
+
export interface ExportSuccess {
|
|
53
|
+
readonly type: "export-success";
|
|
54
|
+
readonly requestId: number;
|
|
55
|
+
readonly file: ExportedFile;
|
|
56
|
+
}
|
|
57
|
+
export interface RuntimeError {
|
|
58
|
+
readonly code: string;
|
|
59
|
+
readonly message: string;
|
|
60
|
+
readonly stack?: string;
|
|
61
|
+
readonly recoverable?: boolean;
|
|
62
|
+
}
|
|
63
|
+
export interface GenerationError {
|
|
64
|
+
readonly type: "generation-error";
|
|
65
|
+
readonly requestId: number;
|
|
66
|
+
readonly error: RuntimeError;
|
|
67
|
+
}
|
|
68
|
+
export interface ExportError {
|
|
69
|
+
readonly type: "export-error";
|
|
70
|
+
readonly requestId: number;
|
|
71
|
+
readonly error: RuntimeError;
|
|
72
|
+
}
|
|
73
|
+
export interface ValidationError {
|
|
74
|
+
readonly type: "validation-error";
|
|
75
|
+
readonly requestId: number;
|
|
76
|
+
readonly error: RuntimeError;
|
|
77
|
+
}
|
|
78
|
+
export type WorkerRequest = ValidateRequest | GenerateRequest | Export3mfRequest;
|
|
79
|
+
export type WorkerResponse = ValidationSuccess | GenerationSuccess | GenerationInvalid | ExportSuccess | ValidationError | GenerationError | ExportError;
|
|
80
|
+
//# sourceMappingURL=worker-contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-contracts.d.ts","sourceRoot":"","sources":["../src/worker-contracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Reads an own data timestamp without invoking accessors or accepting malformed transport data. */
|
|
2
|
+
export function parseGenerationSentAt(response) {
|
|
3
|
+
const descriptor = typeof response === "object" && response !== null && !Array.isArray(response)
|
|
4
|
+
? Object.getOwnPropertyDescriptor(response, "sentAt")
|
|
5
|
+
: undefined;
|
|
6
|
+
const value = descriptor !== undefined && "value" in descriptor ? descriptor.value : undefined;
|
|
7
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
|
|
8
|
+
throw new Error("Generation success requires a finite positive sentAt timestamp.");
|
|
9
|
+
}
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=worker-contracts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-contracts.js","sourceRoot":"","sources":["../src/worker-contracts.ts"],"names":[],"mappings":"AAkDA,oGAAoG;AACpG,MAAM,UAAU,qBAAqB,CAAC,QAAiB;IACrD,MAAM,UAAU,GACd,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAC3E,CAAC,CAAC,MAAM,CAAC,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,CAAC;QACrD,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,KAAK,GACT,UAAU,KAAK,SAAS,IAAI,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACnF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamesh/generator-sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "Portable contracts and helpers for MetaMesh Generators.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -23,6 +23,18 @@
|
|
|
23
23
|
"types": "./dist/index.d.ts",
|
|
24
24
|
"import": "./dist/index.js"
|
|
25
25
|
},
|
|
26
|
+
"./parameters": {
|
|
27
|
+
"types": "./dist/parameters.d.ts",
|
|
28
|
+
"import": "./dist/parameters.js"
|
|
29
|
+
},
|
|
30
|
+
"./runtime": {
|
|
31
|
+
"types": "./dist/runtime.d.ts",
|
|
32
|
+
"import": "./dist/runtime.js"
|
|
33
|
+
},
|
|
34
|
+
"./packages": {
|
|
35
|
+
"types": "./dist/generator-packages.d.ts",
|
|
36
|
+
"import": "./dist/generator-packages.js"
|
|
37
|
+
},
|
|
26
38
|
"./fonts": {
|
|
27
39
|
"types": "./dist/fonts.d.ts",
|
|
28
40
|
"import": "./dist/fonts.js"
|
|
@@ -38,6 +50,7 @@
|
|
|
38
50
|
"devDependencies": {
|
|
39
51
|
"@metamesh/config": "0.0.0",
|
|
40
52
|
"@vitest/coverage-v8": "^5.0.3",
|
|
53
|
+
"esbuild": "^0.28.2",
|
|
41
54
|
"fast-check": "4.10.2",
|
|
42
55
|
"vitest": "^5.0.3"
|
|
43
56
|
},
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { GeneratedPart, GeneratorDefinition, GeneratorIssue, GeneratorParams } from "./contracts.js";
|
|
2
|
-
import { type GeneratorModule } from "./generator-module.js";
|
|
3
|
-
import type { GeneratorServices } from "./generator-services.js";
|
|
4
|
-
/** Successful preparation contains plain, immutable measurements and geometry data. */
|
|
5
|
-
export type GeneratorPreparation<D extends GeneratorDefinition, Prepared> = {
|
|
6
|
-
readonly ok: true;
|
|
7
|
-
readonly value: Readonly<Prepared>;
|
|
8
|
-
readonly issues: readonly GeneratorIssue<D>[];
|
|
9
|
-
} | {
|
|
10
|
-
readonly ok: false;
|
|
11
|
-
readonly issues: readonly GeneratorIssue<D>[];
|
|
12
|
-
};
|
|
13
|
-
export interface PreparedGeneratorModuleOptions<D extends GeneratorDefinition, Context, Prepared> {
|
|
14
|
-
readonly definition: D;
|
|
15
|
-
readonly prepare: (parameters: GeneratorParams<D>, services: GeneratorServices) => GeneratorPreparation<D, Prepared>;
|
|
16
|
-
readonly generate: (parameters: GeneratorParams<D>, context: Context, services: GeneratorServices, prepared: Readonly<Prepared>) => readonly GeneratedPart[];
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Shares successful preparation between validation and the next generation of the exact frozen
|
|
20
|
-
* parameters and services. The single pending result is consumed before generation, including
|
|
21
|
-
* failed generation; direct calls prepare afresh. Returned modules retain the five format-1 exports.
|
|
22
|
-
*/
|
|
23
|
-
export declare function definePreparedGeneratorModule<const D extends GeneratorDefinition, Context, Prepared>({ definition, prepare, generate, }: PreparedGeneratorModuleOptions<D, Context, Prepared>): GeneratorModule<D, Context>;
|
|
24
|
-
//# sourceMappingURL=prepared-generator-module.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prepared-generator-module.d.ts","sourceRoot":"","sources":["../src/prepared-generator-module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,mBAAmB,EACnB,cAAc,EACd,eAAe,EAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACpF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAGjE,uFAAuF;AACvF,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,mBAAmB,EAAE,QAAQ,IACpE;IACE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,SAAS,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;CAC/C,GACD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,cAAc,CAAC,CAAC,CAAC,EAAE,CAAA;CAAE,CAAC;AAE1E,MAAM,WAAW,8BAA8B,CAAC,CAAC,SAAS,mBAAmB,EAAE,OAAO,EAAE,QAAQ;IAC9F,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,CAChB,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,EAC9B,QAAQ,EAAE,iBAAiB,KACxB,oBAAoB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,CACjB,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,EAC9B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,KACzB,SAAS,aAAa,EAAE,CAAC;CAC/B;AAiGD;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,CAAC,CAAC,SAAS,mBAAmB,EACnC,OAAO,EACP,QAAQ,EACR,EACA,UAAU,EACV,OAAO,EACP,QAAQ,GACT,EAAE,8BAA8B,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,OAAO,CAAC,CAsCpF"}
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import { defineGeneratorModule } from "./generator-module.js";
|
|
2
|
-
import { parseParameterIssues } from "./parameters.js";
|
|
3
|
-
// Bound traversal of author data before retaining it between callbacks. This is not a geometry
|
|
4
|
-
// complexity policy; each generator remains responsible for its own physical sampling limits.
|
|
5
|
-
const MAX_PREPARATION_VALUES = 1_000_000;
|
|
6
|
-
const MAX_PREPARATION_DEPTH = 64;
|
|
7
|
-
function inspectPlainData(value, requireFrozen) {
|
|
8
|
-
const objects = [];
|
|
9
|
-
const visited = new Set();
|
|
10
|
-
const ancestors = new Set();
|
|
11
|
-
let count = 0;
|
|
12
|
-
const visit = (entry, depth) => {
|
|
13
|
-
if (++count > MAX_PREPARATION_VALUES || depth > MAX_PREPARATION_DEPTH) {
|
|
14
|
-
throw new TypeError("Generator preparation data exceeds the traversal limits.");
|
|
15
|
-
}
|
|
16
|
-
if (entry === null ||
|
|
17
|
-
entry === undefined ||
|
|
18
|
-
typeof entry === "boolean" ||
|
|
19
|
-
typeof entry === "string") {
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
if (typeof entry === "number" && Number.isFinite(entry))
|
|
23
|
-
return;
|
|
24
|
-
if (typeof entry !== "object") {
|
|
25
|
-
throw new TypeError("Generator preparation must contain only finite, plain data values.");
|
|
26
|
-
}
|
|
27
|
-
if (ancestors.has(entry))
|
|
28
|
-
throw new TypeError("Generator preparation data must not contain cycles.");
|
|
29
|
-
if (visited.has(entry))
|
|
30
|
-
return;
|
|
31
|
-
const prototype = Object.getPrototypeOf(entry);
|
|
32
|
-
if ((Array.isArray(entry) && prototype !== Array.prototype) ||
|
|
33
|
-
(!Array.isArray(entry) && prototype !== Object.prototype && prototype !== null)) {
|
|
34
|
-
throw new TypeError("Generator preparation must contain only plain objects and arrays.");
|
|
35
|
-
}
|
|
36
|
-
if (requireFrozen && !Object.isFrozen(entry)) {
|
|
37
|
-
throw new TypeError("Generator preparation reuse requires deeply frozen parameters.");
|
|
38
|
-
}
|
|
39
|
-
visited.add(entry);
|
|
40
|
-
ancestors.add(entry);
|
|
41
|
-
objects.push(entry);
|
|
42
|
-
for (const key of Reflect.ownKeys(entry)) {
|
|
43
|
-
const descriptor = Object.getOwnPropertyDescriptor(entry, key);
|
|
44
|
-
if (typeof key !== "string" || descriptor === undefined || !("value" in descriptor)) {
|
|
45
|
-
throw new TypeError("Generator preparation data must not contain symbols or accessors.");
|
|
46
|
-
}
|
|
47
|
-
visit(descriptor.value, depth + 1);
|
|
48
|
-
}
|
|
49
|
-
ancestors.delete(entry);
|
|
50
|
-
};
|
|
51
|
-
visit(value, 0);
|
|
52
|
-
return objects;
|
|
53
|
-
}
|
|
54
|
-
function canReuse(parameters, services) {
|
|
55
|
-
try {
|
|
56
|
-
inspectPlainData(parameters, true);
|
|
57
|
-
const text = Object.getOwnPropertyDescriptor(services, "text");
|
|
58
|
-
const provider = text?.value;
|
|
59
|
-
return (Object.isFrozen(services) &&
|
|
60
|
-
typeof provider === "object" &&
|
|
61
|
-
provider !== null &&
|
|
62
|
-
Object.isFrozen(provider) &&
|
|
63
|
-
typeof Object.getOwnPropertyDescriptor(provider, "layout")?.value === "function");
|
|
64
|
-
}
|
|
65
|
-
catch {
|
|
66
|
-
return false;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
function checkedPreparation(definition, result) {
|
|
70
|
-
// Inspect descriptors before reading so accidental getters, promises, and WASM handles never
|
|
71
|
-
// become retained preparation. Functions live in the callbacks, not in their result data.
|
|
72
|
-
const objects = inspectPlainData(result, false);
|
|
73
|
-
const issues = parseParameterIssues(definition, result.issues);
|
|
74
|
-
const hasErrors = issues.some((issue) => issue.severity === "error");
|
|
75
|
-
if (typeof result.ok !== "boolean" || result.ok === hasErrors) {
|
|
76
|
-
throw new TypeError("Generator preparation success must agree with its validation errors.");
|
|
77
|
-
}
|
|
78
|
-
const expected = result.ok ? ["ok", "value", "issues"] : ["ok", "issues"];
|
|
79
|
-
const keys = Object.keys(result);
|
|
80
|
-
if (keys.length !== expected.length || expected.some((key) => !keys.includes(key))) {
|
|
81
|
-
throw new TypeError("Generator preparation must return an explicit success or invalid result.");
|
|
82
|
-
}
|
|
83
|
-
for (const object of objects)
|
|
84
|
-
Object.freeze(object);
|
|
85
|
-
return result.ok
|
|
86
|
-
? Object.freeze({ ok: true, value: result.value, issues })
|
|
87
|
-
: Object.freeze({ ok: false, issues });
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Shares successful preparation between validation and the next generation of the exact frozen
|
|
91
|
-
* parameters and services. The single pending result is consumed before generation, including
|
|
92
|
-
* failed generation; direct calls prepare afresh. Returned modules retain the five format-1 exports.
|
|
93
|
-
*/
|
|
94
|
-
export function definePreparedGeneratorModule({ definition, prepare, generate, }) {
|
|
95
|
-
let pending;
|
|
96
|
-
const runPreparation = (parameters, services) => checkedPreparation(definition, prepare(parameters, services));
|
|
97
|
-
return defineGeneratorModule({
|
|
98
|
-
definition,
|
|
99
|
-
validate(parameters, services) {
|
|
100
|
-
pending = undefined;
|
|
101
|
-
const result = runPreparation(parameters, services);
|
|
102
|
-
if (result.ok && canReuse(parameters, services)) {
|
|
103
|
-
pending = { parameters, services, value: result.value };
|
|
104
|
-
}
|
|
105
|
-
return result.issues;
|
|
106
|
-
},
|
|
107
|
-
generate(parameters, context, services) {
|
|
108
|
-
const previous = pending;
|
|
109
|
-
pending = undefined;
|
|
110
|
-
if (previous?.parameters === parameters && previous.services === services) {
|
|
111
|
-
return generate(parameters, context, services, previous.value);
|
|
112
|
-
}
|
|
113
|
-
const result = runPreparation(parameters, services);
|
|
114
|
-
if (!result.ok) {
|
|
115
|
-
throw new Error(result.issues
|
|
116
|
-
.filter((issue) => issue.severity === "error")
|
|
117
|
-
.map((issue) => issue.message)
|
|
118
|
-
.join(" "));
|
|
119
|
-
}
|
|
120
|
-
return generate(parameters, context, services, result.value);
|
|
121
|
-
},
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
//# sourceMappingURL=prepared-generator-module.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prepared-generator-module.js","sourceRoot":"","sources":["../src/prepared-generator-module.ts"],"names":[],"mappings":"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"}
|