Make local graph execution optional across composed packages
This commit is contained in:
@@ -5,6 +5,7 @@ import type { StructuralRequest } from "./structural-plan.js";
|
||||
import { parseQx, walkSyntax } from "./source.js";
|
||||
import { addImplementation } from "./implementation-edit.js";
|
||||
import { formatQuixosLock } from "../resource-lock/index.js";
|
||||
import { javascriptTarget } from "../execution-world/native-backends.js";
|
||||
const json = (value: unknown) => JSON.stringify(value, null, 2) + "\n";
|
||||
const q = (value: string) => JSON.stringify(value);
|
||||
const nixString = (value: string) => q(value).replaceAll("${", "\\${");
|
||||
@@ -31,7 +32,10 @@ export async function executionScaffold(
|
||||
const create = (file: string, content: string) => files.push({ file: prefix + file, create: content });
|
||||
if (command === "package") {
|
||||
if (!spec.tools || !spec.revision) throw new Error("Execution package requires exact tool sources and a revision");
|
||||
create("package.qx", `package ${spec.name} id ${q(spec.id)} revision ${q(spec.revision)} {\n}\n`);
|
||||
create(
|
||||
"package.qx",
|
||||
`symbol JavaScript id ${q(javascriptTarget)};\npackage ${spec.name} id ${q(spec.id)} revision ${q(spec.revision)} {\n}\n`,
|
||||
);
|
||||
create(
|
||||
"quixos.lock",
|
||||
formatQuixosLock({ formatVersion: 1, quixos: { resolver: "git", ...spec.tools.quixos }, resources: [] }),
|
||||
@@ -90,7 +94,7 @@ in camino.assembleCaminoPackage {
|
||||
pkgs.lib.optional (portable != []) (camino.mkCaminoTypeScriptPackage {
|
||||
inherit pkgs context dependencies; src = ./.;
|
||||
entry = "src/server.ts"; entries.browser = "src/browser.ts";
|
||||
targets = pkgs.lib.unique (pkgs.lib.concatMap (entry: entry.execution.targets) portable);
|
||||
targets = pkgs.lib.unique (map (target: if target == "target:org.quixos.execution.javascript@1" then "browser" else if target == "server" then "server" else throw "Unsupported TypeScript backend target") (pkgs.lib.concatMap (entry: entry.execution.targets) portable));
|
||||
}) ++ pkgs.lib.optional (remote != []) (camino.mkCaminoTypeScriptService {
|
||||
inherit pkgs context dependencies; src = ./.; entry = "src/remote.ts";
|
||||
}) ++ pkgs.lib.optional (modules != {}) (camino.mkCaminoReactPackage {
|
||||
@@ -134,15 +138,16 @@ in camino.assembleCaminoPackage {
|
||||
.filter((token) => !token.trivia && token.start >= execution.start && token.end <= execution.end)
|
||||
.map((token) => token.text);
|
||||
const remote = tokens[1] === "remote";
|
||||
const targets = remote
|
||||
const declaredTargets = remote
|
||||
? ["remote"]
|
||||
: [...walkSyntax(execution)].filter((node) => node.kind === "identifier").map(text);
|
||||
const targets = declaredTargets.length ? declaredTargets : ["server"];
|
||||
if (
|
||||
!targets.length ||
|
||||
new Set(targets).size !== targets.length ||
|
||||
targets.some((target) => !(remote ? ["remote"] : ["browser", "server"]).includes(target))
|
||||
targets.some((target) => !(remote ? ["remote"] : ["JavaScript", "server"]).includes(target))
|
||||
)
|
||||
throw new Error("Execution scaffold supports browser/server portable targets and remote service handlers");
|
||||
throw new Error("This TypeScript scaffold supports the JavaScript target, server, and remote service handlers");
|
||||
const authored = await fs.readFile(path.join(root, prefix, "package.qx"), "utf8");
|
||||
const syntax = parseQx(authored);
|
||||
const packageNode = syntax.root.children.find((node) => node.kind === "packageResourceDecl");
|
||||
@@ -174,7 +179,7 @@ in camino.assembleCaminoPackage {
|
||||
`import type { ${remote ? "Remote" : "Portable"}Implementation } from "../gen/${remote ? "remote" : "qx"}.js";\nexport const handler: ${remote ? "Remote" : "Portable"}Implementation[${q(spec.name)}] = async (_context) => { throw new Error(${q("Implement " + spec.name)}); };\n`,
|
||||
);
|
||||
for (const target of targets) {
|
||||
const file = prefix + `src/${target}.ts`;
|
||||
const file = prefix + `src/${target === "JavaScript" ? "browser" : target}.ts`;
|
||||
const before = await fs.readFile(path.join(root, file), "utf8");
|
||||
files.push({
|
||||
file,
|
||||
|
||||
Reference in New Issue
Block a user