Make local graph execution optional across composed packages
This commit is contained in:
@@ -22,7 +22,9 @@ test("service bindings depend on their consumed contract, not workspace or sourc
|
||||
|
||||
test("reader portable bindings have selected facets, creation inputs and stable keyed calls", async () => {
|
||||
const schema = compileExecutionPlan(await loadReaderWorkspace()).definition.bindingSchema;
|
||||
const source = generatePortableTypeScriptBindings(schema, "package:reader-runtime@1", { target: "browser" });
|
||||
const source = generatePortableTypeScriptBindings(schema, "package:reader-runtime@1", {
|
||||
target: "target:org.quixos.execution.javascript@1",
|
||||
});
|
||||
assert.match(source, /readonly "sourceRevision.get": \(\) => Promise<string>/);
|
||||
assert.match(
|
||||
source,
|
||||
@@ -32,22 +34,30 @@ test("reader portable bindings have selected facets, creation inputs and stable
|
||||
assert.match(source, /readonly "create":/);
|
||||
assert.match(source, /readonly "comments": ReadonlyArray/);
|
||||
assert.doesNotMatch(source, /"highlights.resolve"|context\.conform|objectId|"live"/);
|
||||
assert.equal(source, generatePortableTypeScriptBindings(schema, "package:reader-runtime@1", { target: "browser" }));
|
||||
assert.equal(
|
||||
source,
|
||||
generatePortableTypeScriptBindings(schema, "package:reader-runtime@1", {
|
||||
target: "target:org.quixos.execution.javascript@1",
|
||||
}),
|
||||
);
|
||||
const server = generatePortableTypeScriptBindings(schema, "package:reader-runtime@1", { target: "server" });
|
||||
assert.equal(source.replace('target = "browser"', 'target = "server"'), server);
|
||||
assert.equal(source.replace('target = "target:org.quixos.execution.javascript@1"', 'target = "server"'), server);
|
||||
});
|
||||
|
||||
test("generation rejects remote dependencies, wrong effects and unsupported shapes explicitly", async () => {
|
||||
const schema = compileExecutionPlan(await loadReaderWorkspace()).definition.bindingSchema;
|
||||
const generate = () => generatePortableTypeScriptBindings(schema, "package:reader-runtime@1", { target: "browser" });
|
||||
const generate = () =>
|
||||
generatePortableTypeScriptBindings(schema, "package:reader-runtime@1", {
|
||||
target: "target:org.quixos.execution.javascript@1",
|
||||
});
|
||||
const entry = schema.packages[0]!.exports.find((e) => e.displayName === "addHighlight")!;
|
||||
entry.execution = { kind: "snapshot", targets: ["browser"] };
|
||||
entry.execution = { kind: "snapshot", targets: ["target:org.quixos.execution.javascript@1"] };
|
||||
assert.throws(generate, /Snapshot context cannot expose mutation ports/);
|
||||
entry.execution = { kind: "transaction", targets: ["browser"] };
|
||||
entry.execution = { kind: "transaction", targets: ["target:org.quixos.execution.javascript@1"] };
|
||||
const iface = schema.interfaces.find((i) => i.revisionId === "interface:reader:document-data@1")!;
|
||||
const getter = iface.members[0]!.operations[0]!;
|
||||
getter.execution = { kind: "remote" };
|
||||
assert.throws(generate, /not an object call available in portable target browser/);
|
||||
assert.throws(generate, /not an object call available in portable target target:org.quixos.execution.javascript@1/);
|
||||
getter.execution = { kind: "snapshot", targets: ["browser", "server"] };
|
||||
entry.dependencyPorts[0]!.requirement = { kind: "reflection", selectors: ["active"] };
|
||||
assert.throws(generate, /Only checked presentation metadata is portable/);
|
||||
@@ -59,7 +69,9 @@ test("closed generic portable handlers have distinct concrete codecs and no univ
|
||||
const schema = plan.definition.bindingSchema;
|
||||
const pkg = schema.packages[0]!;
|
||||
assert.equal(pkg.exports.length, 2);
|
||||
const generated = generatePortableTypeScriptBindings(schema, pkg.revisionId, { target: "browser" });
|
||||
const generated = generatePortableTypeScriptBindings(schema, pkg.revisionId, {
|
||||
target: "target:org.quixos.execution.javascript@1",
|
||||
});
|
||||
assert.match(generated, /readonly input: string/);
|
||||
assert.match(generated, /readonly input: ReadonlyArray<bigint>/);
|
||||
for (const entry of pkg.exports) {
|
||||
@@ -69,7 +81,7 @@ test("closed generic portable handlers have distinct concrete codecs and no univ
|
||||
}
|
||||
assert.notEqual(pkg.exports[0]!.displayName, pkg.exports[1]!.displayName);
|
||||
assert.equal(
|
||||
generated.replace('target = "browser"', 'target = "server"'),
|
||||
generated.replace('target = "target:org.quixos.execution.javascript@1"', 'target = "server"'),
|
||||
generatePortableTypeScriptBindings(schema, pkg.revisionId, { target: "server" }),
|
||||
);
|
||||
});
|
||||
@@ -90,7 +102,10 @@ test("a portable subset of a mixed interface excludes remote dependencies", asyn
|
||||
displayName: "remote",
|
||||
operations: [operation],
|
||||
});
|
||||
const generate = () => generatePortableTypeScriptBindings(schema, "package:reader-runtime@1", { target: "browser" });
|
||||
const generate = () =>
|
||||
generatePortableTypeScriptBindings(schema, "package:reader-runtime@1", {
|
||||
target: "target:org.quixos.execution.javascript@1",
|
||||
});
|
||||
assert.doesNotMatch(generate(), /readonly "remote.get"/);
|
||||
selected.operations!.push(operation.id);
|
||||
assert.throws(generate, /select a portable subset/);
|
||||
@@ -99,7 +114,7 @@ test("a portable subset of a mixed interface excludes remote dependencies", asyn
|
||||
test("server projection descriptors are distinct from canonical inputs and have result decoders", async () => {
|
||||
const { generatePortableClientBindings } = await import("../src/bindings/portable-client.js");
|
||||
const plan = compileExecutionPlan(await loadReaderWorkspace());
|
||||
const source = generatePortableClientBindings(plan, { target: "browser" });
|
||||
const source = generatePortableClientBindings(plan, { target: "target:org.quixos.execution.javascript@1" });
|
||||
const projections = source.slice(
|
||||
source.indexOf("export const serverProjections"),
|
||||
source.indexOf("export const results"),
|
||||
@@ -127,7 +142,9 @@ test("static interface ports keep unit arguments explicit for generic factory co
|
||||
op.inputType = { kind: "builtin", name: "unit" };
|
||||
port.requirement.operations = [op.id];
|
||||
delete port.requirement.receiver;
|
||||
const generated = generatePortableTypeScriptBindings(schema, "package:reader-runtime@1", { target: "browser" });
|
||||
const generated = generatePortableTypeScriptBindings(schema, "package:reader-runtime@1", {
|
||||
target: "target:org.quixos.execution.javascript@1",
|
||||
});
|
||||
assert.match(generated, /"explicitInput": true/);
|
||||
assert.match(generated, /input: null/);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user