Add queryable capability contracts and checked GraphQL artifacts
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
import { create, toJson } from "@bufbuild/protobuf";
|
||||
import {
|
||||
InstalledQuerySchema,
|
||||
QueryArgumentSchema,
|
||||
QuerySelectionSchema,
|
||||
QueryReadBindingSchema,
|
||||
Cardinality,
|
||||
type QueryArgument as WireArgument,
|
||||
} from "../gen/camino/schema_pb.js";
|
||||
import type { LinkedQuery } from "./link.js";
|
||||
import type { QueryArgument, QuerySelection } from "./types.js";
|
||||
import type { WorkspaceRevision } from "../capability-model/types.js";
|
||||
|
||||
const argument = (entry: QueryArgument): WireArgument => {
|
||||
switch (entry.kind) {
|
||||
case "variable":
|
||||
return create(QueryArgumentSchema, { value: { case: "variable", value: entry.name } });
|
||||
case "literal":
|
||||
return create(QueryArgumentSchema, { value: { case: "literalJson", value: JSON.stringify(entry.value) } });
|
||||
case "list":
|
||||
return create(QueryArgumentSchema, { value: { case: "list", value: { values: entry.values.map(argument) } } });
|
||||
case "object":
|
||||
return create(QueryArgumentSchema, {
|
||||
value: {
|
||||
case: "object",
|
||||
value: { fields: Object.fromEntries(Object.entries(entry.fields).map(([k, v]) => [k, argument(v)])) },
|
||||
},
|
||||
});
|
||||
}
|
||||
};
|
||||
const selection = (entry: QuerySelection): import("../gen/camino/schema_pb.js").QuerySelection =>
|
||||
create(QuerySelectionSchema, {
|
||||
...entry,
|
||||
conditions: entry.conditions.map((condition) => ({ include: condition.include, value: argument(condition.value) })),
|
||||
arguments: Object.fromEntries(Object.entries(entry.arguments).map(([k, v]) => [k, argument(v)])),
|
||||
selection: entry.selection.map(selection),
|
||||
});
|
||||
|
||||
export const queryRuntimePlan = (linked: LinkedQuery, workspace: WorkspaceRevision) =>
|
||||
toJson(
|
||||
InstalledQuerySchema,
|
||||
create(InstalledQuerySchema, {
|
||||
id: linked.id,
|
||||
definitionDigest: linked.checked.definitionDigest,
|
||||
bindingDigest: linked.bindingDigest,
|
||||
rootInterfaceRevisionId: linked.checked.declaration.root,
|
||||
selection: linked.checked.selection.map(selection),
|
||||
budgets: linked.checked.declaration.budgets,
|
||||
variablesTypeJson: JSON.stringify(linked.checked.variables),
|
||||
outputTypeJson: JSON.stringify(linked.checked.output),
|
||||
variableDefaults: Object.fromEntries(
|
||||
Object.entries(linked.checked.variableDefaults).map(([k, v]) => [k, argument(v)]),
|
||||
),
|
||||
watch: linked.checked.declaration.watch,
|
||||
pollingIntervalMs: linked.checked.declaration.polling?.intervalMs,
|
||||
rpcPredicateOrOrder: linked.checked.effects.some(
|
||||
(effect) => effect.execution === "rpc-permitted" && effect.uses.some((use) => use !== "select"),
|
||||
),
|
||||
bindings: linked.fields.map((field) => {
|
||||
const member = workspace.interfaceImports
|
||||
.find((entry) => entry.revisionId === field.interfaceRevisionId)!
|
||||
.members.find((entry) => entry.id === field.memberId)!;
|
||||
return create(QueryReadBindingSchema, {
|
||||
atomId: field.atomId,
|
||||
interfaceRevisionId: field.interfaceRevisionId,
|
||||
memberId: field.memberId,
|
||||
getterOperationId: field.getter,
|
||||
fieldName: member.displayName,
|
||||
valueTypeJson: member.kind === "value" ? JSON.stringify(member.valueType) : "",
|
||||
cardinality:
|
||||
member.kind === "relationship"
|
||||
? {
|
||||
"optional-one": Cardinality.OPTIONAL_ONE,
|
||||
"exactly-one": Cardinality.EXACTLY_ONE,
|
||||
many: Cardinality.MANY,
|
||||
"many-unique": Cardinality.MANY_UNIQUE,
|
||||
}[member.cardinality]
|
||||
: undefined,
|
||||
slotId: field.binding.kind === "state" ? field.binding.slotId : "",
|
||||
edgeTypeId: field.binding.kind === "edge" ? field.binding.edgeTypeId : "",
|
||||
projectionId: field.binding.kind === "edge" ? field.binding.projectionId : "",
|
||||
rpc: field.binding.kind === "package",
|
||||
watchStartOperationId: field.watch?.start,
|
||||
watchStopOperationId: field.watch?.stop,
|
||||
});
|
||||
}),
|
||||
}),
|
||||
);
|
||||
Reference in New Issue
Block a user