api_binding_ui 2.0.2 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +56 -50
- package/SKILL.md +29 -34
- package/dist/app/index-0n23yy5r.js +367 -0
- package/dist/app/index-aaxy714b.css +1 -0
- package/dist/app/index.html +7 -0
- package/dist/cli.js +969 -0
- package/dist/codegen/generate.d.ts +22 -0
- package/dist/codegen/helpers.d.ts +2 -0
- package/dist/framework/contract.d.ts +38 -23
- package/dist/framework/expr.d.ts +26 -27
- package/dist/framework/file.d.ts +28 -0
- package/dist/framework/store.d.ts +3 -15
- package/dist/{index-3q1vx729.js → index-jj8twdw9.js} +158 -173
- package/dist/index-jj8twdw9.js.map +16 -0
- package/dist/index.d.ts +6 -8
- package/dist/index.js +461 -298
- package/dist/index.js.map +6 -8
- package/dist/studio/BindingStudio.d.ts +6 -11
- package/dist/studio/SettingsPanel.d.ts +3 -7
- package/dist/studio/index.css +0 -149
- package/dist/studio/index.d.ts +1 -2
- package/dist/studio/index.js +228 -437
- package/dist/studio/index.js.map +8 -10
- package/dist/studio/useBindings.d.ts +7 -5
- package/dist/studio/useCatalog.d.ts +2 -0
- package/package.json +65 -53
- package/spec/FRAMEWORK.md +106 -201
- package/dist/framework/runner.d.ts +0 -36
- package/dist/index-3q1vx729.js.map +0 -16
- package/dist/runtime/BindingProvider.d.ts +0 -42
- package/dist/runtime/BindingScreen.d.ts +0 -23
- package/dist/runtime/hooks.d.ts +0 -22
- package/dist/runtime/screenStore.d.ts +0 -7
- package/dist/studio/BindingWidget.d.ts +0 -9
- package/dist/studio/useSettings.d.ts +0 -8
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/framework/openapi.ts", "../src/framework/store.ts", "../src/framework/names.ts", "../src/framework/schema.ts", "../src/framework/engine.ts", "../src/framework/validate.ts", "../src/runtime/BindingProvider.tsx"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"/** OpenAPI 3.0–3.2 → Catalog. */\nimport type { Catalog, CatalogOperation, CatalogParameter, JsonSchema } from \"./contract\";\n\ntype Obj = Record<string, any>;\nconst METHODS = [\"get\", \"put\", \"post\", \"delete\", \"patch\", \"head\", \"options\", \"trace\", \"query\"];\n\n/** FNV-1a, enough to detect catalog drift. */\nexport function hashString(s: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < s.length; i++) { h ^= s.charCodeAt(i); h = Math.imul(h, 0x01000193); }\n return (h >>> 0).toString(16).padStart(8, \"0\");\n}\n\nfunction pointerGet(doc: Obj, ref: string): unknown {\n if (!ref.startsWith(\"#/\")) return undefined;\n return ref.slice(2).split(\"/\").map(k => k.replace(/~1/g, \"/\").replace(/~0/g, \"~\"))\n .reduce<any>((o, k) => (o == null ? undefined : o[k]), doc);\n}\n\n/** Inline every local $ref. Cycles stop at the first repeat and keep the $ref. */\nfunction deref(doc: Obj, node: unknown, seen: string[] = []): any {\n if (Array.isArray(node)) return node.map(n => deref(doc, n, seen));\n if (!node || typeof node !== \"object\") return node;\n const n = node as Obj;\n if (typeof n.$ref === \"string\") {\n if (seen.includes(n.$ref) || seen.length > 24) return { $ref: n.$ref };\n const { $ref, ...rest } = n;\n const target = deref(doc, pointerGet(doc, $ref), [...seen, $ref]);\n return Object.keys(rest).length ? { ...target, ...deref(doc, rest, seen) } : target;\n }\n const out: Obj = {};\n for (const [k, v] of Object.entries(n)) out[k] = deref(doc, v, seen);\n return out;\n}\n\nfunction jsonContent(content: Obj | undefined): JsonSchema | undefined {\n if (!content) return undefined;\n const key = Object.keys(content).find(k => /json/i.test(k)) ?? Object.keys(content)[0];\n return key ? content[key]?.schema : undefined;\n}\n\nfunction intentOf(method: string, op: Obj): string | undefined {\n if (typeof op[\"x-binding-intent\"] === \"string\") return op[\"x-binding-intent\"];\n if (method === \"get\" || method === \"head\" || method === \"query\") return \"read\";\n if ([\"put\", \"patch\", \"delete\"].includes(method)) return \"write\";\n return undefined; // unknown unless declared\n}\n\nexport function catalogFromOpenApi(input: unknown, source: { url?: string } = {}): Catalog {\n const doc = input as Obj;\n if (!doc || typeof doc !== \"object\" || !doc.paths) throw new Error(\"This file is not an OpenAPI document: it has no paths.\");\n const operations: CatalogOperation[] = [];\n // x-tagGroups: tag → product\n const productOf = new Map<string, string>();\n for (const g of (doc[\"x-tagGroups\"] as Array<{ name?: string; tags?: string[] }> | undefined) ?? []) g.tags?.forEach(t => { if (g.name) productOf.set(t, g.name); });\n for (const [path, rawItem] of Object.entries<Obj>(doc.paths)) {\n const item = deref(doc, rawItem) as Obj;\n for (const method of METHODS) {\n const op = item?.[method] as Obj | undefined;\n if (!op || !op.operationId) continue;\n const params: CatalogParameter[] = [];\n for (const p of [...(item.parameters ?? []), ...(op.parameters ?? [])]) {\n if (!p?.name || !p?.in) continue;\n const pointer = `/${p.in}/${p.name}`;\n const at = params.findIndex(x => x.pointer === pointer);\n const entry = { pointer, name: p.name, required: !!p.required || p.in === \"path\", schema: p.schema ?? {}, description: p.description };\n if (at >= 0) params[at] = entry; else params.push(entry);\n }\n for (const m of path.matchAll(/\\{([^}]+)\\}/g)) {\n if (!params.some(x => x.pointer === `/path/${m[1]}`)) params.unshift({ pointer: `/path/${m[1]}`, name: m[1], required: true, schema: { type: \"string\" } });\n }\n const bodySchema = jsonContent(op.requestBody?.content);\n const responses = Object.entries<Obj>(op.responses ?? {}).map(([status, r]) => ({ status, schema: jsonContent(r?.content) }));\n const extensions: Obj = {};\n for (const [k, v] of Object.entries(op)) if (k.startsWith(\"x-\")) extensions[k] = v;\n operations.push({\n id: op.operationId, method: method.toUpperCase(), path,\n summary: op.summary, description: op.description, tags: op.tags ?? [],\n product: (op.tags as string[] | undefined)?.map(t => productOf.get(t)).find(Boolean),\n intent: intentOf(method, op), parameters: params,\n body: bodySchema ? { required: !!op.requestBody?.required, schema: bodySchema } : undefined,\n responses, extensions,\n });\n }\n }\n const body = JSON.stringify(operations);\n return {\n catalogVersion: 1,\n source: { title: doc.info?.title ?? \"API\", version: doc.info?.version ?? \"\", url: source.url },\n hash: hashString(body),\n operations,\n schemas: {},\n };\n}\n\n",
|
|
6
|
-
"/** Manifest persistence and edit helpers. */\nimport type { BindingManifest, PersistenceAdapter, ScreenId, SlotBinding } from \"./contract\";\nimport type { BindingIndex, FrameworkData } from \"./engine\";\n\nexport function localStorageAdapter(prefix = \"abs.manifest.\"): PersistenceAdapter {\n return {\n async load(screen) {\n try { const raw = globalThis.localStorage?.getItem(prefix + screen); return raw ? (JSON.parse(raw) as BindingManifest) : null; } catch { return null; }\n },\n async save(m) {\n // Throw so the caller reports the failed save.\n if (!globalThis.localStorage) throw new Error(\"Browser storage is not available.\");\n globalThis.localStorage.setItem(prefix + m.screen, JSON.stringify(m));\n },\n };\n}\n\nexport function memoryAdapter(seed: BindingManifest[] = []): PersistenceAdapter {\n const m = new Map(seed.map(x => [x.screen, x]));\n return { async load(s) { return m.get(s) ?? null; }, async save(x) { m.set(x.screen, x); } };\n}\n\nexport function toManifest(fw: FrameworkData, screen: ScreenId, bindings: SlotBinding[]): BindingManifest {\n const S = fw.registry.screens.find(s => s.id === screen);\n const kinds: Record<string, number> = {};\n S?.components.forEach(c => { const d = fw.descriptors.find(x => x.kind === c.kind); if (d) kinds[c.kind] = d.version; });\n return { manifestVersion: 1, screen, catalog: { hash: fw.catalog.hash }, kinds, bindings };\n}\n\n/** Unsaved screens with an edit counter; a screen is cleared only by a save that covers its latest edit. */\nexport type Pending = Map<ScreenId, number>;\n\nexport function markDirty(pending: Pending, screen: ScreenId) {\n pending.set(screen, (pending.get(screen) ?? 0) + 1);\n}\n\n/** Saves every pending screen from `idx`. Returns the screens whose save failed (they stay pending). */\nexport async function savePending(adapter: PersistenceAdapter, fw: FrameworkData, idx: BindingIndex, pending: Pending): Promise<ScreenId[]> {\n const batch = [...pending];\n const results = await Promise.allSettled(batch.map(([s]) => adapter.save(toManifest(fw, s, idx[s] ?? []))));\n const failed: ScreenId[] = [];\n batch.forEach(([s, version], i) => {\n if (results[i].status === \"rejected\") failed.push(s);\n else if (pending.get(s) === version) pending.delete(s);\n });\n return failed;\n}\n\nexport async function loadAll(adapter: PersistenceAdapter, screens: ScreenId[]): Promise<BindingIndex> {\n const out: BindingIndex = {};\n await Promise.all(screens.map(async s => { const m = await adapter.load(s); if (m) out[s] = m.bindings; }));\n return out;\n}\n\n/** Pure edit helpers: return a new index. */\nexport function putBinding(idx: BindingIndex, screen: ScreenId, b: SlotBinding): BindingIndex {\n const list = (idx[screen] ?? []).filter(x => !(x.component === b.component && x.slot === b.slot));\n return { ...idx, [screen]: [...list, b] };\n}\nexport function dropBinding(idx: BindingIndex, screen: ScreenId, component: string, slot: string): BindingIndex {\n return { ...idx, [screen]: (idx[screen] ?? []).filter(x => !(x.component === component && x.slot === slot)) };\n}\n\nconst BINDING_TYPES = new Set([\"operation\", \"expression\", \"steps\", \"none\"]);\n\n/** Parses imported manifests (one or a list). Throws on the first invalid entry. */\nexport function parseManifests(text: string): BindingManifest[] {\n let data: unknown;\n try { data = JSON.parse(text); } catch { throw new Error(\"The file is not valid JSON.\"); }\n const list = Array.isArray(data) ? data : [data];\n list.forEach((m, i) => {\n const at = `Manifest ${i + 1}`;\n if (!m || typeof m !== \"object\") throw new Error(`${at} is not an object.`);\n const r = m as Record<string, unknown>;\n if (r.manifestVersion !== 1) throw new Error(`${at}: manifestVersion must be 1.`);\n if (typeof r.screen !== \"string\" || !r.screen) throw new Error(`${at}: \"screen\" is missing.`);\n if (!Array.isArray(r.bindings)) throw new Error(`${at} (${r.screen}): \"bindings\" must be a list.`);\n r.bindings.forEach((b, j) => {\n const x = b as Record<string, unknown> | null;\n if (!x || typeof x.component !== \"string\" || typeof x.slot !== \"string\" || !BINDING_TYPES.has(x.type as string))\n throw new Error(`${at} (${r.screen}), binding ${j + 1}: needs \"component\", \"slot\" and a known \"type\".`);\n });\n });\n return list as BindingManifest[];\n}\n",
|
|
7
|
-
"/** Identifiers to words, for matching and labels. */\nimport type { Glossary } from \"./contract\";\n\n/* ------------------------------------------------------------------ */\n/* Names */\n/* ------------------------------------------------------------------ */\n\nexport const sing = (w: string) => (w.length > 3 && w.endsWith(\"s\") ? w.slice(0, -1) : w);\nexport function synonymIndex(glossaries: Glossary[]) {\n const m: Record<string, string[]> = {};\n glossaries.forEach(g => g.synonyms.forEach(grp => { const g2 = grp.map(x => sing(x.toLowerCase())); g2.forEach(w => { m[w] = g2; }); }));\n return m;\n}\nexport function words(text: string): string[] {\n return text.replace(/([a-z0-9])([A-Z])/g, \"$1 $2\").toLowerCase().split(/[^a-z0-9]+/).filter(w => w.length > 1).map(sing);\n}\n/** Turns an identifier into words people read: \"noteTypeId\" → \"Note type id\". */\nexport function humanize(id: string): string {\n const s = id.replace(/^\\$\\.?/, \"\").replace(/\\[\\*\\]/g, \"\").split(/[./]/).filter(Boolean).pop() ?? id;\n const w = s.replace(/([a-z0-9])([A-Z])/g, \"$1 $2\").replace(/[_-]+/g, \" \").toLowerCase().trim();\n return w ? w[0].toUpperCase() + w.slice(1) : id;\n}\n",
|
|
8
|
-
"/** JSON Schema helpers and per-operation views. */\nimport type { Catalog, CatalogOperation, JsonSchema } from \"./contract\";\n\nexport type Field = [name: string, type: string];\nexport type ReqField = [pointer: string, type: string, required: boolean];\n\nexport interface OpView {\n op: CatalogOperation;\n req: ReqField[];\n lists: Array<{ select: string; fields: Field[] }>;\n one: Field[] | null;\n scalars: Field[];\n}\n\n/* ------------------------------------------------------------------ */\n/* JSON Schema reading */\n/* ------------------------------------------------------------------ */\n\ntype S = Record<string, any>;\nexport const obj = (s: JsonSchema | undefined): S => (s && typeof s === \"object\" ? (s as S) : {});\nexport function flat(s: JsonSchema | undefined): S {\n const o = obj(s);\n const parts = [o, ...((o.allOf as JsonSchema[]) ?? []).map(flat)];\n if (parts.length === 1 && !o.oneOf && !o.anyOf) return o;\n const props: S = {};\n const required: string[] = [];\n parts.forEach(p => { Object.assign(props, p.properties ?? {}); required.push(...(p.required ?? [])); });\n const alt = ((o.oneOf ?? o.anyOf) as JsonSchema[] | undefined)?.map(flat).find(x => x.type !== \"null\");\n return { ...(alt ?? {}), ...o, properties: Object.keys(props).length ? props : alt?.properties, required };\n}\nexport function typeName(s: JsonSchema | undefined): string {\n const o = flat(s);\n const t = Array.isArray(o.type) ? o.type.find((x: string) => x !== \"null\") : o.type;\n if (t === \"array\") return typeName(o.items) + \"[]\";\n if (o.format === \"date-time\" || o.format === \"date\") return \"date-time\";\n if (t === \"integer\" || t === \"number\") return \"number\";\n return t ?? (o.properties ? \"object\" : \"any\");\n}\nexport const isObject = (s: JsonSchema | undefined) => { const o = flat(s); return o.type === \"object\" || !!o.properties; };\nexport const propsOf = (s: JsonSchema | undefined): Field[] => Object.entries<JsonSchema>(flat(s).properties ?? {}).map(([k, v]) => [k, typeName(v)]);\n\nfunction leaves(schema: JsonSchema, prefix: string, required: boolean, out: ReqField[], depth = 0) {\n const s = flat(schema);\n if (isObject(s)) {\n const props = Object.entries<JsonSchema>(s.properties ?? {});\n if (!props.length || depth > 3) { out.push([prefix, \"object\", required]); return; }\n const req = new Set<string>(s.required ?? []);\n props.forEach(([k, v]) => { if (!flat(v).readOnly) leaves(v, `${prefix}/${k}`, required && req.has(k), out, depth + 1); });\n } else out.push([prefix, typeName(s), required]);\n}\nfunction listsIn(schema: JsonSchema | undefined, path: string, out: OpView[\"lists\"], depth = 0) {\n const s = flat(schema);\n if (s.type === \"array\") { if (isObject(s.items)) out.push({ select: `${path}[*]`, fields: propsOf(s.items) }); return; }\n if (isObject(s) && depth < 4) Object.entries<JsonSchema>(s.properties ?? {}).forEach(([k, v]) => listsIn(v, `${path}.${k}`, out, depth + 1));\n}\n\nconst views = new WeakMap<Catalog, Map<string, OpView>>();\nexport function opViews(catalog: Catalog): Map<string, OpView> {\n let m = views.get(catalog);\n if (m) return m;\n m = new Map();\n for (const op of catalog.operations) {\n const req: ReqField[] = op.parameters.map(p => [p.pointer, typeName(p.schema), p.required]);\n if (op.body) leaves(op.body.schema, \"/body\", op.body.required, req);\n const ok = op.responses.find(r => /^2/.test(r.status) && r.schema);\n const lists: OpView[\"lists\"] = [];\n if (ok) listsIn(ok.schema, \"$\", lists);\n const one = ok && !lists.length && isObject(ok.schema) ? propsOf(ok.schema) : null;\n const scalars = ok ? propsOf(ok.schema).filter(([, t]) => t !== \"object\" && !t.endsWith(\"[]\")).map(([k, t]) => [`$.${k}`, t] as Field) : [];\n m.set(op.id, { op, req, lists, one, scalars });\n }\n views.set(catalog, m);\n return m;\n}\n",
|
|
9
|
-
"/** Matching, proposals and status for bindings. Generic: no kinds, products or field names. */\nimport type {\n OperationConsumeBinding,\n BindId, Catalog, CatalogOperation, ComponentDescriptor, ComponentInstance, ContextDeclaration,\n ContextProvider, Glossary, ScreenEntry, ScreenId, ScreenRegistry, SlotBinding,\n SlotDescriptor, TransformDefinition,\n} from \"./contract\";\nimport { synonymIndex, words, humanize } from \"./names\";\nimport { flat, obj, opViews, propsOf, typeName, type Field, type OpView } from \"./schema\";\n\nexport type { Field, OpView, ReqField } from \"./schema\";\nexport { opViews } from \"./schema\";\nexport { humanize, words } from \"./names\";\n\n\nexport interface FrameworkData {\n descriptors: ComponentDescriptor[];\n registry: ScreenRegistry;\n catalog: Catalog;\n transforms?: TransformDefinition[];\n providers?: ContextProvider[];\n glossaries?: Glossary[];\n}\n\n\nexport interface Source {\n expr: string; label: string; name?: string; type: string; group: \"item\" | \"screen\" | \"context\" | \"provider\"; fields?: Field[];\n /** Set when the value's shape is not known yet: names the slot that must be connected first. */\n waitsFor?: string;\n}\nexport interface Ranked { view: OpView; score: number; reasons: string[] }\nexport type SlotState = \"bound\" | \"suggested\" | \"unbound\";\n\n/* ------------------------------------------------------------------ */\n/* Engine */\n/* ------------------------------------------------------------------ */\n\nexport type BindingIndex = Record<ScreenId, SlotBinding[]>;\n\nexport function createEngine(fw: FrameworkData, manifests: BindingIndex) {\n const OPV = opViews(fw.catalog);\n const OPS = [...OPV.values()];\n const DESC = new Map(fw.descriptors.map(d => [d.kind, d]));\n const SCR = new Map(fw.registry.screens.map(s => [s.id, s]));\n const transforms = fw.transforms ?? [];\n const providers = fw.providers ?? [];\n const syn = synonymIndex(fw.glossaries ?? []);\n\n const key = (s: string, c: string, sl: string) => `${s}|${c}|${sl}`;\n const BIND = new Map<string, SlotBinding>();\n for (const [s, list] of Object.entries(manifests)) for (const b of list) {\n if (b.type === \"operation\" && !OPV.has(b.operation)) continue; // operation no longer in the catalog\n if (b.type === \"steps\" && b.steps.some(st => !OPV.has(st.operation))) continue;\n BIND.set(key(s, b.component, b.slot), b);\n }\n const getB = (s: ScreenId, c: BindId, sl: string) => BIND.get(key(s, c, sl));\n const screen = (id: ScreenId) => SCR.get(id)!;\n const compOf = (s: ScreenId, id: BindId) => SCR.get(s)?.components.find(c => c.bindId === id);\n const descOf = (c: ComponentInstance) => DESC.get(c.kind);\n const bindable = (d: ComponentDescriptor | undefined) => (d ? d.slots.filter(x => x.role !== \"produce\") : []);\n\n /* names */\n const tokCache = new Map<string, Set<string>>();\n const tok = (text: string, expand: boolean) => {\n const k = (expand ? \"+\" : \"-\") + text;\n let out = tokCache.get(k);\n if (out) return out;\n out = new Set<string>();\n for (const w of words(text)) { out.add(w); if (expand) (syn[w] ?? []).forEach(x => out!.add(x)); }\n tokCache.set(k, out);\n return out;\n };\n /** Synonyms expand the source side only, so a glossary widens matches without raising scores. */\n function nameScore(target: string, source: string) {\n const a = tok(target, false), b = tok(source, true);\n if (!a.size || !b.size) return 0;\n let n = 0; a.forEach(x => { if (b.has(x)) n++; });\n return n && n / a.size >= 0.5 ? (0.6 * n) / a.size + (0.4 * n) / b.size : 0;\n }\n const base = (t: string) => t.replace(\"[]\", \"\");\n function typeFit(target: string, source: string): { ok: boolean; transform?: string } {\n if (target !== \"any\" && source !== \"any\" && target.endsWith(\"[]\") !== source.endsWith(\"[]\")) return { ok: false };\n const t = base(target), s = base(source);\n if (t === \"any\" || s === \"any\" || t === s) return { ok: true };\n const tr = transforms.find(x => typeName(x.input) === s && typeName(x.output) === t);\n return tr ? { ok: true, transform: tr.name } : { ok: false };\n }\n\n /* shapes: types flow through bindings */\n function bindingFields(s: ScreenId, c: BindId, slotId: string): Field[] | null {\n const b = getB(s, c, slotId);\n if (!b || b.type !== \"operation\") return null;\n const v = OPV.get(b.operation);\n if (!v) return null;\n if (b.select === \"$\" && v.one) return v.one;\n return v.lists.find(x => x.select === b.select)?.fields ?? null;\n }\n function shapeOf(s: ScreenId, comp: ComponentInstance, slot: SlotDescriptor): { many: boolean; fields?: Field[]; type?: string; via?: string } {\n const sc = obj(slot.schema);\n if (typeof sc.$ref === \"string\" && sc.$ref.startsWith(\"#slot/\")) {\n const via = sc.$ref.slice(6);\n return { many: !!slot.many, fields: bindingFields(s, comp.bindId, via) ?? [], via };\n }\n if (flat(sc).properties) return { many: !!slot.many, fields: propsOf(sc) };\n return { many: !!slot.many, type: typeName(sc) };\n }\n function contextShape(ctx: ContextDeclaration): { many: boolean; fields: Field[] } {\n if (\"schema\" in ctx.shape) return { many: !!ctx.many, fields: propsOf(ctx.shape.schema) };\n const f = ctx.shape.from, comp = compOf(f.screen, f.component), d = comp && descOf(comp), slot = d?.slots.find(x => x.id === f.slot);\n return { many: !!ctx.many, fields: (slot && comp ? shapeOf(f.screen, comp, slot).fields : null) ?? [] };\n }\n /** Fields of `$item` for a scoped slot: the parent's bound data. */\n function scopeFields(s: ScreenId, comp: ComponentInstance, slot: SlotDescriptor): Field[] | null {\n if (!slot.scope || !comp.parent) return null;\n return bindingFields(s, comp.parent, slot.scope.parentSlot);\n }\n function manyContext(s: ScreenId) { return screen(s).context.find(x => x.many); }\n\n /* values available on a screen */\n function sources(s: ScreenId, opts: { item?: Field[] } = {}): Source[] {\n const out: Source[] = [], S = screen(s);\n opts.item?.forEach(([f, t]) => out.push({ expr: `$item.${f}`, label: humanize(f), name: f, type: t, group: \"item\" }));\n S.components.forEach(c => {\n const d = descOf(c);\n d?.slots.filter(x => x.role === \"produce\").forEach(sl => {\n const sh = shapeOf(s, c, sl);\n if (sh.fields?.length) {\n if (sh.many) out.push({ expr: `${c.bindId}.${sl.id}`, label: `${c.label} · ${sl.label}`, type: \"list\", group: \"screen\", fields: sh.fields });\n sh.fields.forEach(([f, t]) => out.push({ expr: `${c.bindId}.${sl.id}${sh.many ? \"[*]\" : \"\"}.${f}`, label: `${c.label} · ${humanize(f)}`, name: f, type: sh.many ? t + \"[]\" : t, group: \"screen\" }));\n } else if (sh.via) {\n const via = d.slots.find(x => x.id === sh.via);\n out.push({ expr: `${c.bindId}.${sl.id}`, label: `${c.label} · ${sl.label}`, type: \"pending\", group: \"screen\", waitsFor: `${c.label} · ${via?.label ?? sh.via}` });\n } else out.push({ expr: `${c.bindId}.${sl.id}`, label: c.label + (sl.label && bindable(d).length + 1 < d.slots.length ? ` · ${sl.label}` : \"\"), name: c.label, type: sh.many ? \"list\" : sh.type ?? \"any\", group: \"screen\" });\n });\n });\n S.context.forEach(ctx => {\n const sh = contextShape(ctx);\n if (ctx.many) out.push({ expr: `$context.${ctx.id}`, label: ctx.label, type: \"list\", group: \"context\", fields: sh.fields });\n sh.fields.forEach(([f, t]) => out.push({ expr: `$context.${ctx.id}${ctx.many ? \"[*]\" : \"\"}.${f}`, label: `${ctx.label} · ${humanize(f)}`, name: f, type: ctx.many ? t + \"[]\" : t, group: \"context\" }));\n });\n providers.forEach(p => propsOf(p.schema).forEach(([f, t]) => out.push({ expr: `$${p.id}.${f}`, label: `${p.label} · ${humanize(f)}`, name: `${p.label} ${f}`, type: t, group: \"provider\" })));\n return out;\n }\n /** Sources that fit the target type, best name match first. */\n function rankSources(targetName: string, targetType: string, srcs: Source[], min = 0.65) {\n const out: Array<{ expr: string; score: number; source: Source }> = [];\n for (const x of srcs) {\n if (x.type === \"list\" || x.waitsFor) continue;\n const fit = typeFit(targetType, x.type);\n if (!fit.ok) continue;\n let sc = Math.max(nameScore(targetName, x.name ?? x.label), nameScore(targetName, x.label) * 0.9);\n if (x.group === \"screen\") sc += 0.12; else if (x.group === \"item\") sc += 0.05;\n if (fit.transform) sc -= 0.05;\n if (sc >= min) out.push({ expr: x.expr + (fit.transform ? ` | ${fit.transform}()` : \"\"), score: sc, source: x });\n }\n return out.sort((a, b) => b.score - a.score);\n }\n function bestSource(targetName: string, targetType: string, srcs: Source[]) {\n return rankSources(targetName, targetType, srcs)[0] ?? null;\n }\n /** A one-word field is qualified by its parent: the path resource for parameters, the parent object for body fields. */\n function qualified(ptr: string, op: CatalogOperation) {\n const parts = ptr.split(\"/\").filter(Boolean), name = parts[parts.length - 1];\n if (words(name).length > 1) return name;\n if (parts[0] === \"body\") return parts.length > 2 ? `${parts[parts.length - 2]} ${name}` : name;\n const segs = op.path.split(\"/\").filter(x => x && !x.startsWith(\"{\"));\n return `${segs[segs.length - 1] ?? \"\"} ${name}`;\n }\n function proposeRequest(v: OpView, srcs: Source[]) {\n const req: Record<string, string> = {};\n v.req.forEach(([ptr, t]) => { const m = bestSource(qualified(ptr, v.op), t, srcs); if (m) req[ptr] = m.expr; });\n return req;\n }\n function proposeMap(slotFields: Field[], itemFields: Field[]) {\n const map: Record<string, string> = {};\n const srcs: Source[] = itemFields.map(([f, t]) => ({ expr: `$item.${f}`, name: f, label: f, type: t, group: \"item\" }));\n slotFields.forEach(([p, t]) => { const m = bestSource(p, t, srcs); if (m) map[p] = m.expr; });\n return map;\n }\n function triggerSources(s: ScreenId, item?: Field[]) {\n const mc = manyContext(s);\n return sources(s, { item: item ?? (mc ? contextShape(mc).fields : undefined) });\n }\n\n /* matchers: generic, metadata only */\n function rank(s: ScreenId, comp: ComponentInstance, slot: SlotDescriptor): Ranked[] {\n const S = screen(s);\n const near = tok([comp.label, ...(slot.hints?.keywords ?? [])].join(\" \"), true);\n const far = tok([S.label, ...S.path].join(\" \"), true);\n /** Share of the operation's name covered by the component (full weight) or the screen (half). */\n const cover = (o: CatalogOperation) => {\n const own = tok([o.id, ...o.tags].join(\" \"), false);\n if (!own.size) return { score: 0, near: false };\n let a = 0, b = 0; own.forEach(w => { if (near.has(w)) a++; else if (far.has(w)) b++; });\n return { score: Math.min(1, (a + 0.5 * b) / own.size), near: a > 0 };\n };\n const srcs = slot.role === \"trigger\" ? triggerSources(s) : sources(s);\n const own = srcs.filter(x => x.group === \"screen\" && x.type !== \"list\").length || 1;\n return OPS.map(v => {\n const reasons: string[] = []; let tot = 0, w = 0;\n const add = (weight: number, score: number, why: string | null) => { tot += weight * score; w += weight; if (score >= 0.5 && why) reasons.push(why); };\n const o = v.op;\n const prop = proposeRequest(v, srcs);\n if (slot.role === \"consume\") {\n const sh = shapeOf(s, comp, slot);\n const shape = sh.many ? (v.lists.length ? 1 : 0) : sh.fields?.length ? (v.one || v.lists.length ? 0.7 : 0) : (v.scalars.some(([, t]) => typeFit(sh.type ?? \"any\", t).ok) || v.one ? 0.7 : 0);\n add(0.3, shape, sh.many ? \"Returns a list\" : \"Returns a matching value\");\n add(0.15, o.intent === \"read\" ? 1 : o.intent ? 0 : 0.5, o.intent === \"read\" ? \"Reads data\" : null);\n } else {\n add(0.2, v.req.length ? 0.8 : 0.2, null);\n add(0.15, o.intent === \"write\" ? 1 : o.intent === \"read\" ? 0.1 : 0.5, o.intent === \"write\" ? \"Saves data\" : null);\n const body = v.req.filter(([p]) => p.startsWith(\"/body/\"));\n const filled = Object.entries(prop).filter(([p, e]) => p.startsWith(\"/body/\") && !e.startsWith(\"$\")).length;\n add(0.3, body.length ? Math.min(1, filled / Math.min(own, body.length)) : 0, filled ? `Uses ${filled} values from this screen` : null);\n }\n const required = v.req.filter(r => r[2]);\n if (required.length) {\n const ok = required.filter(([p]) => prop[p]).length;\n add(0.25, ok / required.length, ok === required.length ? \"All required inputs available\" : null);\n } else add(0.25, 1, null);\n if (o.product) add(0.1, o.product === S.path[0] ? 1 : 0, o.product === S.path[0] ? `From ${o.product}` : null);\n const nm = cover(o);\n add(0.35, nm.score, nm.score >= 0.5 ? (nm.near ? `Name fits “${comp.label}”` : \"Name fits this screen\") : null);\n return { view: v, score: w ? tot / w : 0, reasons };\n }).sort((a, b) => b.score - a.score);\n }\n\n /* status */\n function slotState(s: ScreenId, c: BindId, sl: string): SlotState {\n const b = getB(s, c, sl);\n return !b ? \"unbound\" : b.state === \"confirmed\" ? \"bound\" : \"suggested\";\n }\n function compState(s: ScreenId, comp: ComponentInstance): SlotState | \"partial\" {\n const sl = bindable(descOf(comp));\n if (!sl.length) return \"bound\";\n const st = sl.map(x => slotState(s, comp.bindId, x.id));\n if (st.includes(\"suggested\")) return \"suggested\";\n if (st.every(x => x === \"bound\")) return \"bound\";\n const must = sl.filter(x => x.required);\n if (must.length && must.every(x => slotState(s, comp.bindId, x.id) === \"bound\") && st.includes(\"bound\")) return \"bound\";\n return st.includes(\"bound\") ? \"partial\" : \"unbound\";\n }\n /** Counts components, not slots. */\n function tally(screens: ScreenEntry[]) {\n const t = { bound: 0, suggested: 0, unbound: 0, total: 0 };\n screens.forEach(S => S.components.forEach(c => {\n if (!bindable(descOf(c)).length) return;\n const st = compState(S.id, c);\n t[st === \"partial\" ? \"unbound\" : st]++; t.total++;\n }));\n return t;\n }\n\n const fieldsAt = (v: OpView, select: string): Field[] => (select === \"$\" ? v.one ?? [] : v.lists.find(l => l.select === select)?.fields ?? []);\n\n /** Consume binding for `opId`. With `strict`, null when nothing in the response fits the slot. */\n function proposeConsume(s: ScreenId, comp: ComponentInstance, slot: SlotDescriptor, opId: string, strict = false): OperationConsumeBinding | null {\n const v = OPV.get(opId);\n if (!v) return null;\n const shape = shapeOf(s, comp, slot);\n const props = shape.fields && !shape.via ? shape.fields : null;\n let select: string | undefined;\n if (shape.many) select = v.lists[0]?.select;\n else if (props) select = v.one ? \"$\" : v.lists[0]?.select;\n else {\n const scal: Source[] = v.scalars.map(([path, t]) => ({ expr: path, label: humanize(path), name: path.slice(2), type: t, group: \"item\" }));\n select = (rankSources(slot.label, shape.type ?? \"any\", scal)[0] ?? rankSources(`${comp.label} ${slot.label}`, shape.type ?? \"any\", scal)[0])?.expr.split(\" | \")[0];\n if (!select && !strict) select = v.scalars.find(([, t]) => typeFit(shape.type ?? \"any\", t).ok)?.[0];\n }\n if (!select) { if (strict) return null; select = \"$\"; }\n return {\n component: comp.bindId, slot: slot.id, type: \"operation\", operation: opId, select,\n request: proposeRequest(v, sources(s)),\n map: props ? proposeMap(props, fieldsAt(v, select)) : undefined,\n load: \"open\", origin: \"suggested\", state: \"draft\",\n };\n }\n /** Unbound consume slots of the same component that the same response can fill. */\n function siblingFills(s: ScreenId, comp: ComponentInstance, slot: SlotDescriptor, opId: string): OperationConsumeBinding[] {\n return bindable(descOf(comp)).filter(x => x.role === \"consume\" && !x.scope && x.id !== slot.id && !getB(s, comp.bindId, x.id))\n .map(x => proposeConsume(s, comp, x, opId, true)).filter((b): b is OperationConsumeBinding => !!b);\n }\n\n return {\n fw, OPV, OPS, DESC, SCR, getB, screen, compOf, descOf, bindable, typeFit, shapeOf, contextShape, scopeFields,\n sources, triggerSources, bestSource, rankSources, proposeRequest, proposeMap, rank, slotState, compState, tally, manyContext,\n fieldsAt, proposeConsume, siblingFills,\n };\n}\nexport type Engine = ReturnType<typeof createEngine>;\n\n",
|
|
10
|
-
"import type { ScreenRegistry, ValidationIssue } from \"./contract\";\nimport type { Engine, FrameworkData } from \"./engine\";\n\nconst BIND_ID = /^[A-Za-z_][\\w-]*$/;\n\n/* ------------------------------------------------------------------ */\n/* Validation: what does not validate is not shown */\n/* ------------------------------------------------------------------ */\n\nexport function validateRegistry(fw: FrameworkData): { registry: ScreenRegistry; issues: ValidationIssue[] } {\n const kinds = new Set(fw.descriptors.map(d => d.kind));\n const issues: ValidationIssue[] = [];\n const ids = new Set(fw.registry.screens.map(s => s.id));\n const screens = fw.registry.screens.map(S => {\n const seen = new Set<string>();\n const components = S.components.filter(c => {\n // Expressions read \"<bindId>.<slot>\", so a bindId is one segment.\n if (!BIND_ID.test(c.bindId)) { issues.push({ severity: \"error\", screen: S.id, component: c.bindId, code: \"registry.invalid-bind-id\", message: `bindId \"${c.bindId}\" must use letters, digits, - or _ only (no dots).` }); return false; }\n if (!kinds.has(c.kind)) { issues.push({ severity: \"error\", screen: S.id, component: c.bindId, code: \"registry.unknown-kind\", message: `\"${c.label}\" uses ${c.kind}, which has no descriptor.` }); return false; }\n if (seen.has(c.bindId)) { issues.push({ severity: \"error\", screen: S.id, component: c.bindId, code: \"registry.duplicate-bind-id\", message: `bindId \"${c.bindId}\" is used twice.` }); return false; }\n seen.add(c.bindId); return true;\n }).filter(c => !c.parent || seen.has(c.parent) || (issues.push({ severity: \"error\", screen: S.id, component: c.bindId, code: \"registry.missing-parent\", message: `\"${c.label}\" names a parent that is not on the screen.` }), false));\n const parent = S.parent && ids.has(S.parent) ? S.parent : undefined;\n return { ...S, components, parent };\n });\n return { registry: { ...fw.registry, screens }, issues };\n}\n\nexport function validateBindings(engine: Engine): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n for (const S of engine.fw.registry.screens) for (const c of S.components) {\n const d = engine.descOf(c);\n d?.slots.filter(sl => sl.required && sl.role !== \"produce\").forEach(sl => {\n if (engine.slotState(S.id, c.bindId, sl.id) !== \"bound\") issues.push({ severity: \"warning\", screen: S.id, component: c.bindId, slot: sl.id, code: \"slot.required-unbound\", message: `${c.label}: ${sl.label} is not connected.` });\n });\n }\n return issues;\n}\n",
|
|
11
|
-
"import * as React from \"react\";\nimport type { BindingManifest, Catalog, CatalogOperation, ContextProvider, PersistenceAdapter, ScreenId, SlotBinding, TransformDefinition } from \"../framework/contract\";\nimport type { Transforms } from \"../framework/expr\";\nimport type { Fetcher } from \"../framework/runner\";\n\nexport interface BindingRuntime {\n operations: Map<string, CatalogOperation>;\n /** Confirmed bindings only, indexed \"screen|component|slot\". Drafts never run. */\n binding: (screen: ScreenId, component: string, slot: string) => SlotBinding | undefined;\n fetcher: Fetcher;\n transforms: Transforms;\n providers: () => Record<string, unknown>;\n /** In-flight requests by key, shared across slots. */\n inflight: Map<string, Promise<unknown>>;\n persistence?: PersistenceAdapter;\n /** Loads the studio-saved manifest for a screen; no-op without persistence. */\n loadSaved: (screen: ScreenId) => void;\n /** Reloads saved manifests for mounted screens (after the studio closes). */\n reloadSaved: () => void;\n /** Registers a mounted screen and whether it is shown; returns the unregister function. */\n mountScreen: (screen: ScreenId, shown: boolean) => () => void;\n /** The shown screen that was shown most recently (an open dialog wins over its page). */\n activeScreen: () => ScreenId | undefined;\n}\n\nexport interface BindingProviderProps {\n catalog: Catalog;\n /** Manifests committed with the app. */\n manifests: BindingManifest[];\n /** Sends requests (base URL, auth, errors). */\n fetcher: Fetcher;\n transforms?: TransformDefinition[];\n providers?: ContextProvider[];\n /** Design time only: studio-saved manifests override committed ones. */\n persistence?: PersistenceAdapter;\n children: React.ReactNode;\n}\n\nconst RuntimeContext = React.createContext<BindingRuntime | null>(null);\n\nexport function latestShown(screens: Iterable<{ screen: ScreenId; shown: boolean; at: number }>): ScreenId | undefined {\n let best: { screen: ScreenId; at: number } | undefined;\n for (const m of screens) if (m.shown && (!best || m.at > best.at)) best = m;\n return best?.screen;\n}\n\nexport function useBindingRuntime(): BindingRuntime {\n const r = React.useContext(RuntimeContext);\n if (!r) throw new Error(\"Wrap the app in <BindingProvider> before using binding hooks.\");\n return r;\n}\n\nexport function BindingProvider({ catalog, manifests, fetcher, transforms, providers, persistence, children }: BindingProviderProps) {\n const [overrides, setOverrides] = React.useState<Record<ScreenId, BindingManifest>>({});\n // shortcut: changing `persistence` at runtime is not supported.\n const requested = React.useRef(new Set<ScreenId>());\n const mounted = React.useRef(new Map<symbol, { screen: ScreenId; shown: boolean; at: number }>());\n const clock = React.useRef(0);\n\n const loadSaved = React.useCallback((screen: ScreenId) => {\n if (!persistence || requested.current.has(screen)) return;\n requested.current.add(screen);\n persistence.load(screen).then(m => { if (m) setOverrides(o => ({ ...o, [screen]: m })); }, () => requested.current.delete(screen));\n }, [persistence]);\n\n const reloadSaved = React.useCallback(() => {\n requested.current.clear();\n new Set([...mounted.current.values()].map(m => m.screen)).forEach(loadSaved);\n }, [loadSaved]);\n\n const mountScreen = React.useCallback((screen: ScreenId, shown: boolean) => {\n const key = Symbol(screen);\n mounted.current.set(key, { screen, shown, at: ++clock.current });\n return () => { mounted.current.delete(key); };\n }, []);\n const activeScreen = React.useCallback(() => latestShown(mounted.current.values()), []);\n\n const runtime = React.useMemo<BindingRuntime>(() => {\n const index = new Map<string, SlotBinding>();\n const byScreen = new Map(manifests.map(m => [m.screen, m]));\n Object.values(overrides).forEach(m => byScreen.set(m.screen, m));\n byScreen.forEach(m => m.bindings.forEach(b => { if (b.state === \"confirmed\") index.set(`${m.screen}|${b.component}|${b.slot}`, b); }));\n return {\n operations: new Map(catalog.operations.map(o => [o.id, o])),\n binding: (s, c, sl) => index.get(`${s}|${c}|${sl}`),\n fetcher,\n transforms: Object.fromEntries((transforms ?? []).map(t => [t.name, t.apply])),\n providers: () => Object.fromEntries((providers ?? []).map(p => [p.id, p.read()])),\n inflight: new Map(),\n persistence,\n loadSaved,\n reloadSaved,\n mountScreen,\n activeScreen,\n };\n }, [catalog, manifests, overrides, fetcher, transforms, providers, persistence, loadSaved, reloadSaved, mountScreen, activeScreen]);\n\n return <RuntimeContext.Provider value={runtime}>{children}</RuntimeContext.Provider>;\n}\n"
|
|
12
|
-
],
|
|
13
|
-
"mappings": "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",
|
|
14
|
-
"debugId": "4412F540958D6E7164756E2164756E21",
|
|
15
|
-
"names": []
|
|
16
|
-
}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
import type { BindingManifest, Catalog, CatalogOperation, ContextProvider, PersistenceAdapter, ScreenId, SlotBinding, TransformDefinition } from "../framework/contract";
|
|
3
|
-
import type { Transforms } from "../framework/expr";
|
|
4
|
-
import type { Fetcher } from "../framework/runner";
|
|
5
|
-
export interface BindingRuntime {
|
|
6
|
-
operations: Map<string, CatalogOperation>;
|
|
7
|
-
/** Confirmed bindings only, indexed "screen|component|slot". Drafts never run. */
|
|
8
|
-
binding: (screen: ScreenId, component: string, slot: string) => SlotBinding | undefined;
|
|
9
|
-
fetcher: Fetcher;
|
|
10
|
-
transforms: Transforms;
|
|
11
|
-
providers: () => Record<string, unknown>;
|
|
12
|
-
/** In-flight requests by key, shared across slots. */
|
|
13
|
-
inflight: Map<string, Promise<unknown>>;
|
|
14
|
-
persistence?: PersistenceAdapter;
|
|
15
|
-
/** Loads the studio-saved manifest for a screen; no-op without persistence. */
|
|
16
|
-
loadSaved: (screen: ScreenId) => void;
|
|
17
|
-
/** Reloads saved manifests for mounted screens (after the studio closes). */
|
|
18
|
-
reloadSaved: () => void;
|
|
19
|
-
/** Registers a mounted screen and whether it is shown; returns the unregister function. */
|
|
20
|
-
mountScreen: (screen: ScreenId, shown: boolean) => () => void;
|
|
21
|
-
/** The shown screen that was shown most recently (an open dialog wins over its page). */
|
|
22
|
-
activeScreen: () => ScreenId | undefined;
|
|
23
|
-
}
|
|
24
|
-
export interface BindingProviderProps {
|
|
25
|
-
catalog: Catalog;
|
|
26
|
-
/** Manifests committed with the app. */
|
|
27
|
-
manifests: BindingManifest[];
|
|
28
|
-
/** Sends requests (base URL, auth, errors). */
|
|
29
|
-
fetcher: Fetcher;
|
|
30
|
-
transforms?: TransformDefinition[];
|
|
31
|
-
providers?: ContextProvider[];
|
|
32
|
-
/** Design time only: studio-saved manifests override committed ones. */
|
|
33
|
-
persistence?: PersistenceAdapter;
|
|
34
|
-
children: React.ReactNode;
|
|
35
|
-
}
|
|
36
|
-
export declare function latestShown(screens: Iterable<{
|
|
37
|
-
screen: ScreenId;
|
|
38
|
-
shown: boolean;
|
|
39
|
-
at: number;
|
|
40
|
-
}>): ScreenId | undefined;
|
|
41
|
-
export declare function useBindingRuntime(): BindingRuntime;
|
|
42
|
-
export declare function BindingProvider({ catalog, manifests, fetcher, transforms, providers, persistence, children }: BindingProviderProps): React.JSX.Element;
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
import type { ScreenId } from "../framework/contract";
|
|
3
|
-
import { type ScreenStore } from "./screenStore";
|
|
4
|
-
export interface ScreenScope {
|
|
5
|
-
id: ScreenId;
|
|
6
|
-
store: ScreenStore;
|
|
7
|
-
/** Values passed in, keyed by the registry entry's `context` ids. */
|
|
8
|
-
context: Record<string, unknown>;
|
|
9
|
-
}
|
|
10
|
-
export declare function useScreen(): ScreenScope;
|
|
11
|
-
/** Marks a subtree that stays mounted while hidden (inactive tabs, cached views). */
|
|
12
|
-
export declare function BindingActive({ value, children }: {
|
|
13
|
-
value: boolean;
|
|
14
|
-
children: React.ReactNode;
|
|
15
|
-
}): React.JSX.Element;
|
|
16
|
-
export interface BindingScreenProps {
|
|
17
|
-
/** The screen's id in the registry. */
|
|
18
|
-
id: ScreenId;
|
|
19
|
-
context?: Record<string, unknown>;
|
|
20
|
-
children: React.ReactNode;
|
|
21
|
-
}
|
|
22
|
-
/** Binding scope for one screen: its produce values and context. */
|
|
23
|
-
export declare function BindingScreen({ id, context, children }: BindingScreenProps): React.JSX.Element;
|
package/dist/runtime/hooks.d.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { type StepOutcome } from "../framework/runner";
|
|
2
|
-
/** Publishes a produce slot's value. */
|
|
3
|
-
export declare function useProduce(bindId: string, slot: string, value: unknown): void;
|
|
4
|
-
export type SlotStatus = "unbound" | "waiting" | "loading" | "ready" | "error";
|
|
5
|
-
export interface SlotResult<T> {
|
|
6
|
-
status: SlotStatus;
|
|
7
|
-
data: T | undefined;
|
|
8
|
-
error: unknown;
|
|
9
|
-
reload: () => void;
|
|
10
|
-
}
|
|
11
|
-
/** Data for a consume slot. Subscribes to a request key, so it re-renders only when its own inputs change. */
|
|
12
|
-
export declare function useSlot<T = unknown>(bindId: string, slot: string): SlotResult<T>;
|
|
13
|
-
/** Resolver for a scoped slot (a cell) given its item. */
|
|
14
|
-
export declare function useCell<T = unknown>(bindId: string, slot: string): (item: unknown) => T | undefined;
|
|
15
|
-
export interface TriggerHandle {
|
|
16
|
-
/** False without a confirmed binding. */
|
|
17
|
-
bound: boolean;
|
|
18
|
-
running: boolean;
|
|
19
|
-
/** Runs the slot's API calls; `item` is the row for row actions. */
|
|
20
|
-
run: (item?: unknown) => Promise<StepOutcome[]>;
|
|
21
|
-
}
|
|
22
|
-
export declare function useTrigger(bindId: string, slot: string): TriggerHandle;
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
/** A screen's produce values, outside React state; read through useSyncExternalStore. */
|
|
2
|
-
export interface ScreenStore {
|
|
3
|
-
get: (bindId: string, slot: string) => unknown;
|
|
4
|
-
set: (bindId: string, slot: string, value: unknown) => void;
|
|
5
|
-
subscribe: (listener: () => void) => () => void;
|
|
6
|
-
}
|
|
7
|
-
export declare function createScreenStore(): ScreenStore;
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
import { type BindingStudioProps } from "./BindingStudio";
|
|
3
|
-
import "./studio.css";
|
|
4
|
-
export type BindingWidgetProps = Pick<BindingStudioProps, "framework" | "docsUrl" | "title">;
|
|
5
|
-
/**
|
|
6
|
-
* Floating button that opens the studio over the app, on the screen currently shown.
|
|
7
|
-
* Render it inside <BindingProvider>, in design mode only. Edits apply to the app when it closes.
|
|
8
|
-
*/
|
|
9
|
-
export declare function BindingWidget({ framework, docsUrl, title }: BindingWidgetProps): React.JSX.Element;
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/** Default OpenAPI document for the catalog. */
|
|
2
|
-
export declare const DEFAULT_DOCS_URL = "https://apidocs.highradius.com/documentation-ui/index.yaml";
|
|
3
|
-
export interface StudioSettings {
|
|
4
|
-
/** OpenAPI document URL (JSON or YAML). */
|
|
5
|
-
docsUrl: string;
|
|
6
|
-
}
|
|
7
|
-
/** Per-browser settings in local storage. */
|
|
8
|
-
export declare function useSettings(defaults: StudioSettings): readonly [StudioSettings, (patch: Partial<StudioSettings>) => void];
|