90 lines
4.4 KiB
TypeScript
90 lines
4.4 KiB
TypeScript
/** Qualification artifact emitted after tests, never a production fixture dependency. */
|
|
import { mkdir, writeFile } from "node:fs/promises";
|
|
import { loadReaderWorkspace } from "./reader-fixture.js";
|
|
import { compileKernelProgram } from "../src/execution-world/kernel.js";
|
|
import { compileQueryProgram } from "../src/execution-world/queries.js";
|
|
import { compileExecutionPlan } from "../src/execution-world/plan.js";
|
|
import { generatePortableTypeScriptBindings } from "../src/bindings/portable.js";
|
|
import { generatePortableClientBindings } from "../src/bindings/portable-client.js";
|
|
import { loadCompositeWorkspace } from "./composite-fixture.js";
|
|
const plan = compileExecutionPlan(await loadReaderWorkspace());
|
|
await mkdir("dist/portable-reader", { recursive: true });
|
|
for (const target of ["browser", "server"])
|
|
await writeFile(
|
|
`dist/portable-reader/${target}.ts`,
|
|
generatePortableTypeScriptBindings(plan.definition.bindingSchema, "package:reader-runtime@1", { target }),
|
|
);
|
|
await writeFile("dist/portable-reader/plan.json", JSON.stringify(plan));
|
|
await writeFile("dist/portable-reader/kernel.json", JSON.stringify(compileKernelProgram(plan)));
|
|
await writeFile("dist/portable-reader/queries.json", JSON.stringify(compileQueryProgram(plan)));
|
|
await writeFile("dist/portable-reader/client.ts", generatePortableClientBindings(plan, { target: "browser" }));
|
|
const serviceWorkspace = structuredClone(plan.definition.workspace);
|
|
serviceWorkspace.atoms = [];
|
|
serviceWorkspace.conformances = [];
|
|
serviceWorkspace.constructors = [];
|
|
serviceWorkspace.interfaceImports = [];
|
|
serviceWorkspace.sharedAttachments = [];
|
|
serviceWorkspace.packageImports[0]!.queries = [];
|
|
serviceWorkspace.packageImports[0]!.checkedQueries = [];
|
|
const original = serviceWorkspace.packageImports[0]!.exports.find((e) => e.kind === "function")!;
|
|
serviceWorkspace.packageImports[0]!.exports = [
|
|
{
|
|
...original,
|
|
kind: "function",
|
|
execution: { kind: "remote" },
|
|
inputType: { kind: "scalar", name: "string" },
|
|
outputType: { kind: "scalar", name: "string" },
|
|
dependencyPorts: [],
|
|
},
|
|
];
|
|
await writeFile("dist/portable-reader/service-plan.json", JSON.stringify(compileExecutionPlan(serviceWorkspace)));
|
|
const composite = compileExecutionPlan(await loadCompositeWorkspace());
|
|
await mkdir("dist/portable-reader/composite", { recursive: true });
|
|
await writeFile("dist/portable-reader/composite/plan.json", JSON.stringify(composite));
|
|
await writeFile("dist/portable-reader/composite/kernel.json", JSON.stringify(compileKernelProgram(composite)));
|
|
for (const target of ["browser", "server"])
|
|
for (const [name, revision] of [
|
|
["reader", "package:reader-runtime@1"],
|
|
["comment", "package:comment-runtime@1"],
|
|
] as const)
|
|
await writeFile(
|
|
`dist/portable-reader/composite/${name}-${target}.ts`,
|
|
generatePortableTypeScriptBindings(composite.definition.bindingSchema, revision, { target }),
|
|
);
|
|
|
|
const { portableGenericPlan } = await import("./portable-generic-fixture.js");
|
|
const generic = portableGenericPlan();
|
|
const genericPackage = generic.definition.bindingSchema.packages[0]!;
|
|
await mkdir("dist/portable-reader/generic", { recursive: true });
|
|
for (const target of ["browser", "server"]) {
|
|
await writeFile(
|
|
`dist/portable-reader/generic/${target}.ts`,
|
|
generatePortableTypeScriptBindings(generic.definition.bindingSchema, genericPackage.revisionId, { target }),
|
|
);
|
|
}
|
|
const stringEntry = genericPackage.exports.find((e) => e.inputType.kind === "scalar")!;
|
|
const listEntry = genericPackage.exports.find((e) => e.inputType.kind === "list")!;
|
|
await writeFile(
|
|
"dist/portable-reader/generic/implementation.ts",
|
|
`
|
|
import { createRegistry, type PortableImplementation } from "./gen/qx.js";
|
|
export const registry = createRegistry({
|
|
${JSON.stringify(stringEntry.displayName)}: context => context.input.toUpperCase(),
|
|
${JSON.stringify(listEntry.displayName)}: context => context.input.map(value => value + 1n),
|
|
});
|
|
// The specialization must retain its actual contract, not become unknown or any.
|
|
const negative: PortableImplementation = {
|
|
// @ts-expect-error a string specialization cannot return a number
|
|
${JSON.stringify(stringEntry.displayName)}: context => context.input.length,
|
|
${JSON.stringify(listEntry.displayName)}: context => {
|
|
// @ts-expect-error input collections are read-only
|
|
context.input.push(0n);
|
|
// @ts-expect-error integer values are exact bigint, not number
|
|
const lostPrecision: number = context.input[0]!;
|
|
return context.input;
|
|
},
|
|
};
|
|
void negative;
|
|
`,
|
|
);
|