@etohq/workflows-input-schema-builder
v0.0.1-next-20260318155517
Published
Builder/editor model for input schema (condition groups, helpers, compilation)
Readme
@etohq/workflows-input-schema-builder
Builder/editor model for authoring @etohq/workflows-input-schema.
This package provides:
- A builder-friendly condition model (
ConditionGroup,SingleCondition) - Guardrails/validation for builder rules
- Compilation into canonical
RuleSpec/PredicateSpec
Key Design Rule
- Canonical runtime scope is node-only (
RuleSpec.scope = { node_id }). - Builder supports a convenience scope:
scope: { type: "field", field_key }and compiles it into{ node_id }using layout ownership (must be unambiguous).
Example: Build Rules And Compile Into Schema
import type { InputSchemaSpec } from "@etohq/workflows-input-schema"
import { validateBuilderRules } from "@etohq/workflows-input-schema-builder"
import { compileBuilderRulesIntoSchema } from "@etohq/workflows-input-schema-builder"
import {
createBuilderRule,
createConditionGroup,
createSingleCondition,
refField,
} from "@etohq/workflows-input-schema-builder"
const schema: InputSchemaSpec = {
id: "schema_1",
version: 1,
name: "Example",
fields: [{ key: "email", value_type: "string", required: false }],
layout: [
{ type: "section", id: "s1", children: [{ type: "field", field_key: "email" }] },
{ type: "ending", id: "done", title: { default: "Done" } },
],
}
const builderRules = [
createBuilderRule({
id: "r1",
scope: { type: "field", field_key: "email" },
conditions: createConditionGroup({
id: "g1",
connector: "and",
conditions: [
createSingleCondition({
id: "c1",
left: { type: "ref", ref: refField("email") },
operator: "is_present",
right: null,
}),
],
}),
actions: [{ type: "end", ending_id: "done" }],
}),
]
const issues = validateBuilderRules(schema, builderRules)
if (issues.length) {
// show issues to the user
}
const compiled = compileBuilderRulesIntoSchema(schema, builderRules)
if (compiled.ok) {
// compiled.value.rules is canonical RuleSpec[] (with scope node_id)
}