Lower checked shared edges into the portable graph model

This commit is contained in:
Timothy J. Aveni
2026-09-25 12:34:13 -07:00
parent c482a99aca
commit 58a75da83f
6 changed files with 105 additions and 42 deletions
+22 -11
View File
@@ -213,17 +213,28 @@ export function generateComponentClientBindings(plan: ExecutionPlan, packageRevi
`ExtraModuleProps<${JSON.stringify(JSON.stringify([iface, member]))}>`;
// Preserve closed type arguments for the artifact consumer. Interpretation of
// a particular module contract belongs to that consumer, not this compiler.
const moduleArguments = (iface: InterfaceRevision) => `[${(iface.application?.arguments ?? []).map(argument => {
if (argument.kind === "value") return tsType(argument.type);
const target = argument.target;
const reference = target.kind === "atom" ? `ManagedReference<"atom", ${JSON.stringify(target.atomId)}>` : `ManagedReference<"interface", ${JSON.stringify(target.interfaceRevisionId)}>`;
const fields = target.kind === "interface" ? find(target.interfaceRevisionId).members.flatMap(member => {
if ((member.kind !== "value" && member.kind !== "relationship") || !member.queryRead) return [];
const getter = member.operations.find(operation => operation.displayName === (member.kind === "value" ? "get" : "resolve"));
return getter ? [`readonly ${JSON.stringify(member.displayName)}: ${tsType(getter.outputType)}`] : [];
}) : [];
return `{readonly reference: ${reference}; readonly values: {${fields.join(";")}}}`;
}).join(",")}]`;
const moduleArguments = (iface: InterfaceRevision) =>
`[${(iface.application?.arguments ?? [])
.map((argument) => {
if (argument.kind === "value") return tsType(argument.type);
const target = argument.target;
const reference =
target.kind === "atom"
? `ManagedReference<"atom", ${JSON.stringify(target.atomId)}>`
: `ManagedReference<"interface", ${JSON.stringify(target.interfaceRevisionId)}>`;
const fields =
target.kind === "interface"
? find(target.interfaceRevisionId).members.flatMap((member) => {
if ((member.kind !== "value" && member.kind !== "relationship") || !member.queryRead) return [];
const getter = member.operations.find(
(operation) => operation.displayName === (member.kind === "value" ? "get" : "resolve"),
);
return getter ? [`readonly ${JSON.stringify(member.displayName)}: ${tsType(getter.outputType)}`] : [];
})
: [];
return `{readonly reference: ${reference}; readonly values: {${fields.join(";")}}}`;
})
.join(",")}]`;
const interfaces = generateInterfaceClientBindings(imports, "@quixos/camino-react", props);
const subjectBindings = generateInterfaceClientBindings(subjects, "@quixos/camino-react", props)
.split("\n")