@widgentic/designer 0.1.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/LICENSE +21 -0
- package/README.md +27 -0
- package/dist/action-designer.d.ts +35 -0
- package/dist/action-designer.d.ts.map +1 -0
- package/dist/action-designer.js +294 -0
- package/dist/action-designer.js.map +1 -0
- package/dist/action-editor.d.ts +49 -0
- package/dist/action-editor.d.ts.map +1 -0
- package/dist/action-editor.js +515 -0
- package/dist/action-editor.js.map +1 -0
- package/dist/browser/widgentic-designer.js +433 -0
- package/dist/browser/widgentic-designer.js.map +7 -0
- package/dist/browser.d.ts +2 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +12 -0
- package/dist/browser.js.map +1 -0
- package/dist/dom.d.ts +37 -0
- package/dist/dom.d.ts.map +1 -0
- package/dist/dom.js +387 -0
- package/dist/dom.js.map +1 -0
- package/dist/element.d.ts +12 -0
- package/dist/element.d.ts.map +1 -0
- package/dist/element.js +131 -0
- package/dist/element.js.map +1 -0
- package/dist/highlight.d.ts +30 -0
- package/dist/highlight.d.ts.map +1 -0
- package/dist/highlight.js +123 -0
- package/dist/highlight.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/internal.d.ts +6 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +10 -0
- package/dist/internal.js.map +1 -0
- package/dist/io.d.ts +32 -0
- package/dist/io.d.ts.map +1 -0
- package/dist/io.js +155 -0
- package/dist/io.js.map +1 -0
- package/dist/json-tree-editor.d.ts +8 -0
- package/dist/json-tree-editor.d.ts.map +1 -0
- package/dist/json-tree-editor.js +186 -0
- package/dist/json-tree-editor.js.map +1 -0
- package/dist/panels.d.ts +13 -0
- package/dist/panels.d.ts.map +1 -0
- package/dist/panels.js +414 -0
- package/dist/panels.js.map +1 -0
- package/dist/preview.d.ts +40 -0
- package/dist/preview.d.ts.map +1 -0
- package/dist/preview.js +138 -0
- package/dist/preview.js.map +1 -0
- package/dist/record-editor.d.ts +11 -0
- package/dist/record-editor.d.ts.map +1 -0
- package/dist/record-editor.js +70 -0
- package/dist/record-editor.js.map +1 -0
- package/dist/schema-builder.d.ts +8 -0
- package/dist/schema-builder.d.ts.map +1 -0
- package/dist/schema-builder.js +235 -0
- package/dist/schema-builder.js.map +1 -0
- package/dist/schema-designer.d.ts +33 -0
- package/dist/schema-designer.d.ts.map +1 -0
- package/dist/schema-designer.js +251 -0
- package/dist/schema-designer.js.map +1 -0
- package/dist/schema-form.d.ts +8 -0
- package/dist/schema-form.d.ts.map +1 -0
- package/dist/schema-form.js +181 -0
- package/dist/schema-form.js.map +1 -0
- package/dist/schema-paths.d.ts +18 -0
- package/dist/schema-paths.d.ts.map +1 -0
- package/dist/schema-paths.js +75 -0
- package/dist/schema-paths.js.map +1 -0
- package/dist/seed.d.ts +18 -0
- package/dist/seed.d.ts.map +1 -0
- package/dist/seed.js +299 -0
- package/dist/seed.js.map +1 -0
- package/dist/shell.d.ts +59 -0
- package/dist/shell.d.ts.map +1 -0
- package/dist/shell.js +102 -0
- package/dist/shell.js.map +1 -0
- package/dist/store.d.ts +44 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +71 -0
- package/dist/store.js.map +1 -0
- package/dist/styles-editor.d.ts +8 -0
- package/dist/styles-editor.d.ts.map +1 -0
- package/dist/styles-editor.js +100 -0
- package/dist/styles-editor.js.map +1 -0
- package/dist/template-panel.d.ts +19 -0
- package/dist/template-panel.d.ts.map +1 -0
- package/dist/template-panel.js +585 -0
- package/dist/template-panel.js.map +1 -0
- package/dist/theme-designer.d.ts +35 -0
- package/dist/theme-designer.d.ts.map +1 -0
- package/dist/theme-designer.js +336 -0
- package/dist/theme-designer.js.map +1 -0
- package/dist/theme-panel.d.ts +20 -0
- package/dist/theme-panel.d.ts.map +1 -0
- package/dist/theme-panel.js +96 -0
- package/dist/theme-panel.js.map +1 -0
- package/dist/validate.d.ts +57 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +131 -0
- package/dist/validate.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-designer.d.ts","sourceRoot":"","sources":["../src/schema-designer.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,CAAC,EAAE,WAAW,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IACvC;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,gBAAgB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAE9E,MAAM,WAAW,oBAAoB;IACnC,SAAS,IAAI,WAAW,CAAC;IACzB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAAC;IAC7C,8BAA8B;IAC9B,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACrC,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC9D,OAAO,IAAI,IAAI,CAAC;CACjB;AAUD,+DAA+D;AAC/D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAczD;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,OAAO,EAClB,OAAO,GAAE,qBAA0B,GAClC,oBAAoB,CAgPtB"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standalone schema designer: edits a stored-schema entry
|
|
3
|
+
* (`{ name, label?, description?, schema }` — the widget-store's shape)
|
|
4
|
+
* so one definition (`person`) can serve many widgets. Split out like the
|
|
5
|
+
* theme designer: an app routes to "design a schema" as its own
|
|
6
|
+
* destination, and a host embedding one designer should not ship the
|
|
7
|
+
* others. Shares the chrome, the schema builder, and the parse-gated
|
|
8
|
+
* JSON discipline.
|
|
9
|
+
*/
|
|
10
|
+
import { errorMessage } from "./internal.js";
|
|
11
|
+
import { isPlainObject } from "@widgentic/core";
|
|
12
|
+
import { diagnosticLine, h, injectDesignerStyles, section, textField, requireChild } from "./dom.js";
|
|
13
|
+
import { attachJsonHighlight, repaintHighlight } from "./highlight.js";
|
|
14
|
+
import { createSchemaBuilder } from "./schema-builder.js";
|
|
15
|
+
/** The store's identifier charset — kept local: `widgentic/store` is a
|
|
16
|
+
* Node-only entry and the designer runs in browsers. */
|
|
17
|
+
const SAFE_NAME = /^[a-zA-Z0-9._-]+$/;
|
|
18
|
+
function starterEntry() {
|
|
19
|
+
return {
|
|
20
|
+
name: "my-schema",
|
|
21
|
+
label: "My schema",
|
|
22
|
+
schema: { type: "object", properties: {} }
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/** Validate an untrusted entry; errors instead of throwing. */
|
|
26
|
+
export function checkSchemaEntry(entry) {
|
|
27
|
+
const errors = [];
|
|
28
|
+
if (!isPlainObject(entry))
|
|
29
|
+
return ["Schema entry must be an object."];
|
|
30
|
+
if (typeof entry.name !== "string" || entry.name.trim() === "") {
|
|
31
|
+
errors.push("'name' must be a non-empty string.");
|
|
32
|
+
}
|
|
33
|
+
else if (!SAFE_NAME.test(entry.name)) {
|
|
34
|
+
errors.push(`'${entry.name}' is not a valid schema name — use letters, digits, '.', '_' or '-'.`);
|
|
35
|
+
}
|
|
36
|
+
if (!isPlainObject(entry.schema)) {
|
|
37
|
+
errors.push("'schema' must be a plain object.");
|
|
38
|
+
}
|
|
39
|
+
return errors;
|
|
40
|
+
}
|
|
41
|
+
export function createSchemaDesigner(container, options = {}) {
|
|
42
|
+
injectDesignerStyles(document);
|
|
43
|
+
let entry = options.initialSchema
|
|
44
|
+
? JSON.parse(JSON.stringify(options.initialSchema))
|
|
45
|
+
: starterEntry();
|
|
46
|
+
const listeners = new Set();
|
|
47
|
+
const panels = h("div", { class: "wgd-panels" });
|
|
48
|
+
const root = h("div", { class: "wgd-root wgd-schema-designer" }, [panels]);
|
|
49
|
+
if (options.appearance === "light" || options.appearance === "dark") {
|
|
50
|
+
root.setAttribute("data-wgd-theme", options.appearance);
|
|
51
|
+
}
|
|
52
|
+
container.appendChild(root);
|
|
53
|
+
function getEntry() {
|
|
54
|
+
return JSON.parse(JSON.stringify(entry));
|
|
55
|
+
}
|
|
56
|
+
function notify() {
|
|
57
|
+
for (const listener of [...listeners])
|
|
58
|
+
listener(getEntry());
|
|
59
|
+
}
|
|
60
|
+
// --- Identity panel ----------------------------------------------------
|
|
61
|
+
const identityRefreshers = [];
|
|
62
|
+
const nameDiag = diagnosticLine(undefined);
|
|
63
|
+
function identityField(label, read, write) {
|
|
64
|
+
const field = textField(label, read(), write);
|
|
65
|
+
const input = requireChild(field, "input");
|
|
66
|
+
identityRefreshers.push(() => {
|
|
67
|
+
if (document.activeElement !== input)
|
|
68
|
+
input.value = read();
|
|
69
|
+
});
|
|
70
|
+
return field;
|
|
71
|
+
}
|
|
72
|
+
const identity = section("Schema", [
|
|
73
|
+
identityField("Name (id)", () => entry.name, (value) => {
|
|
74
|
+
entry = { ...entry, name: value };
|
|
75
|
+
const bad = value.trim() === "" || !SAFE_NAME.test(value);
|
|
76
|
+
nameDiag.hidden = !bad;
|
|
77
|
+
nameDiag.textContent = bad
|
|
78
|
+
? "Name must be non-empty using letters, digits, '.', '_' or '-'."
|
|
79
|
+
: "";
|
|
80
|
+
notify();
|
|
81
|
+
}),
|
|
82
|
+
nameDiag,
|
|
83
|
+
identityField("Label", () => entry.label ?? "", (value) => {
|
|
84
|
+
entry = { ...entry, label: value };
|
|
85
|
+
notify();
|
|
86
|
+
}),
|
|
87
|
+
identityField("Description", () => entry.description ?? "", (value) => {
|
|
88
|
+
entry = { ...entry, description: value };
|
|
89
|
+
notify();
|
|
90
|
+
})
|
|
91
|
+
]);
|
|
92
|
+
// --- Definition panel: builder + parse-gated JSON, one view at a time --
|
|
93
|
+
const builder = createSchemaBuilder(entry.schema, (schema) => {
|
|
94
|
+
entry = { ...entry, schema: (schema ?? {}) };
|
|
95
|
+
syncJson();
|
|
96
|
+
notify();
|
|
97
|
+
});
|
|
98
|
+
const jsonError = diagnosticLine(undefined);
|
|
99
|
+
const jsonArea = h("textarea", {
|
|
100
|
+
class: "wgd-textarea",
|
|
101
|
+
rows: "12",
|
|
102
|
+
spellcheck: "false"
|
|
103
|
+
});
|
|
104
|
+
const jsonWrap = h("div", undefined, [jsonArea, jsonError]);
|
|
105
|
+
jsonArea.value = JSON.stringify(entry.schema, null, 2);
|
|
106
|
+
jsonArea.addEventListener("input", () => {
|
|
107
|
+
try {
|
|
108
|
+
const parsed = JSON.parse(jsonArea.value);
|
|
109
|
+
if (!isPlainObject(parsed))
|
|
110
|
+
throw new Error("schema must be an object");
|
|
111
|
+
jsonError.hidden = true;
|
|
112
|
+
jsonError.textContent = "";
|
|
113
|
+
entry = { ...entry, schema: parsed };
|
|
114
|
+
builder.setValue(parsed);
|
|
115
|
+
notify();
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
jsonError.hidden = false;
|
|
119
|
+
jsonError.textContent = `Invalid JSON (schema keeps the last valid value): ${String(errorMessage(error))}`;
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
function syncJson() {
|
|
123
|
+
if (document.activeElement === jsonArea)
|
|
124
|
+
return;
|
|
125
|
+
jsonArea.value = JSON.stringify(entry.schema, null, 2);
|
|
126
|
+
repaintHighlight(jsonArea);
|
|
127
|
+
}
|
|
128
|
+
const builderTab = h("button", { class: "wgd-button wgd-tab wgd-tab-active", type: "button" }, ["Builder"]);
|
|
129
|
+
const jsonTab = h("button", { class: "wgd-button wgd-tab", type: "button" }, [
|
|
130
|
+
"JSON"
|
|
131
|
+
]);
|
|
132
|
+
jsonWrap.hidden = true;
|
|
133
|
+
builderTab.addEventListener("click", () => {
|
|
134
|
+
builder.element.hidden = false;
|
|
135
|
+
jsonWrap.hidden = true;
|
|
136
|
+
builderTab.classList.add("wgd-tab-active");
|
|
137
|
+
jsonTab.classList.remove("wgd-tab-active");
|
|
138
|
+
});
|
|
139
|
+
jsonTab.addEventListener("click", () => {
|
|
140
|
+
builder.element.hidden = true;
|
|
141
|
+
jsonWrap.hidden = false;
|
|
142
|
+
jsonTab.classList.add("wgd-tab-active");
|
|
143
|
+
builderTab.classList.remove("wgd-tab-active");
|
|
144
|
+
syncJson();
|
|
145
|
+
});
|
|
146
|
+
const definition = section("Definition", [
|
|
147
|
+
h("div", { class: "wgd-row" }, [builderTab, jsonTab]),
|
|
148
|
+
builder.element,
|
|
149
|
+
jsonWrap
|
|
150
|
+
]);
|
|
151
|
+
// --- Import / Export: the agent hand-off -------------------------------
|
|
152
|
+
// Live testing surfaced this within a day of list_schemas shipping: an
|
|
153
|
+
// agent drafts the complete entry JSON from the guide, and Import is
|
|
154
|
+
// where the user pastes it. Same two-section shape as the siblings.
|
|
155
|
+
const importError = diagnosticLine(undefined);
|
|
156
|
+
const importArea = h("textarea", {
|
|
157
|
+
class: "wgd-textarea wgd-schema-import",
|
|
158
|
+
rows: "6",
|
|
159
|
+
spellcheck: "false"
|
|
160
|
+
});
|
|
161
|
+
const importButton = h("button", { class: "wgd-button", type: "button" }, [
|
|
162
|
+
"Import"
|
|
163
|
+
]);
|
|
164
|
+
importButton.addEventListener("click", () => {
|
|
165
|
+
let parsed;
|
|
166
|
+
try {
|
|
167
|
+
parsed = JSON.parse(importArea.value);
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
importError.hidden = false;
|
|
171
|
+
importError.textContent = `Invalid JSON: ${errorMessage(error)}`;
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const result = loadSchema(parsed);
|
|
175
|
+
importError.hidden = result.ok;
|
|
176
|
+
importError.textContent = result.ok ? "" : result.errors.join("\n");
|
|
177
|
+
});
|
|
178
|
+
const importSection = section("Import", [
|
|
179
|
+
h("span", { class: "wgd-field-label" }, [
|
|
180
|
+
"Import schema entry JSON ({ name, label?, description?, schema })"
|
|
181
|
+
]),
|
|
182
|
+
importArea,
|
|
183
|
+
importError,
|
|
184
|
+
h("div", { class: "wgd-row" }, [importButton])
|
|
185
|
+
]);
|
|
186
|
+
const output = h("textarea", {
|
|
187
|
+
class: "wgd-textarea",
|
|
188
|
+
rows: "8",
|
|
189
|
+
readonly: "",
|
|
190
|
+
spellcheck: "false"
|
|
191
|
+
});
|
|
192
|
+
const exportButton = h("button", { class: "wgd-button wgd-add", type: "button" }, [
|
|
193
|
+
"Export schema entry"
|
|
194
|
+
]);
|
|
195
|
+
exportButton.addEventListener("click", () => {
|
|
196
|
+
output.value = JSON.stringify(getEntry(), null, 2);
|
|
197
|
+
repaintHighlight(output);
|
|
198
|
+
});
|
|
199
|
+
const exportSection = section("Export", [
|
|
200
|
+
h("div", { class: "wgd-toolbar" }, [exportButton]),
|
|
201
|
+
output
|
|
202
|
+
]);
|
|
203
|
+
// Export copies out what is on screen — read-only leaves it operable.
|
|
204
|
+
exportSection.classList.add("wgd-view-only");
|
|
205
|
+
panels.append(identity, definition, importSection, exportSection);
|
|
206
|
+
// The JSON layer wraps the textareas in place, so attach after assembly.
|
|
207
|
+
attachJsonHighlight(jsonArea);
|
|
208
|
+
attachJsonHighlight(importArea);
|
|
209
|
+
attachJsonHighlight(output);
|
|
210
|
+
function loadSchema(input) {
|
|
211
|
+
const errors = checkSchemaEntry(input);
|
|
212
|
+
if (errors.length > 0)
|
|
213
|
+
return { ok: false, errors };
|
|
214
|
+
entry = JSON.parse(JSON.stringify(input));
|
|
215
|
+
for (const refresh of identityRefreshers)
|
|
216
|
+
refresh();
|
|
217
|
+
nameDiag.hidden = true;
|
|
218
|
+
builder.setValue(entry.schema);
|
|
219
|
+
syncJson();
|
|
220
|
+
notify();
|
|
221
|
+
return { ok: true };
|
|
222
|
+
}
|
|
223
|
+
/** Same mechanism as the other designers: inert the section bodies —
|
|
224
|
+
* except the view-only Export, which restricts nothing. */
|
|
225
|
+
function setReadOnly(readOnly) {
|
|
226
|
+
root.classList.toggle("wgd-readonly", readOnly);
|
|
227
|
+
const bodies = [...panels.querySelectorAll(".wgd-section-body")].filter((body) => !body.parentElement?.classList.contains("wgd-view-only"));
|
|
228
|
+
for (const body of bodies) {
|
|
229
|
+
if (readOnly)
|
|
230
|
+
body.setAttribute("inert", "");
|
|
231
|
+
else
|
|
232
|
+
body.removeAttribute("inert");
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
if (options.readOnly === true)
|
|
236
|
+
setReadOnly(true);
|
|
237
|
+
return {
|
|
238
|
+
getSchema: getEntry,
|
|
239
|
+
loadSchema,
|
|
240
|
+
setReadOnly,
|
|
241
|
+
subscribe(listener) {
|
|
242
|
+
listeners.add(listener);
|
|
243
|
+
return () => listeners.delete(listener);
|
|
244
|
+
},
|
|
245
|
+
dispose() {
|
|
246
|
+
listeners.clear();
|
|
247
|
+
root.remove();
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=schema-designer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-designer.js","sourceRoot":"","sources":["../src/schema-designer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { DataSchema } from "@widgentic/core";
|
|
2
|
+
export interface SchemaForm {
|
|
3
|
+
element: HTMLElement;
|
|
4
|
+
getValue(): unknown;
|
|
5
|
+
setValue(value: unknown): void;
|
|
6
|
+
}
|
|
7
|
+
export declare function createSchemaForm(schema: DataSchema, initial: unknown, onChange: (value: unknown) => void): SchemaForm;
|
|
8
|
+
//# sourceMappingURL=schema-form.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-form.d.ts","sourceRoot":"","sources":["../src/schema-form.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AA2ClD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,IAAI,OAAO,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CAChC;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GACjC,UAAU,CA4IZ"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema-driven data form: generates controls from widgentic's dataSchema
|
|
3
|
+
* subset (type/properties/required/items/enum/pattern). This is the
|
|
4
|
+
* @json-editor/json-editor interaction model, sized to the six keywords
|
|
5
|
+
* the subset actually has — which is what makes an in-house generator a
|
|
6
|
+
* few hundred lines instead of a 150 KB dependency.
|
|
7
|
+
*/
|
|
8
|
+
import { isPlainObject } from "@widgentic/core";
|
|
9
|
+
import { h } from "./dom.js";
|
|
10
|
+
function firstType(schema) {
|
|
11
|
+
const type = schema.type;
|
|
12
|
+
if (typeof type === "string")
|
|
13
|
+
return type;
|
|
14
|
+
if (Array.isArray(type)) {
|
|
15
|
+
// Nullable arrays pick the PRIMARY type regardless of order.
|
|
16
|
+
const primary = type.find((t) => typeof t === "string" && t !== "null");
|
|
17
|
+
if (typeof primary === "string")
|
|
18
|
+
return primary;
|
|
19
|
+
if (type.includes("null"))
|
|
20
|
+
return "null";
|
|
21
|
+
}
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
function seedFor(schema) {
|
|
25
|
+
if (Array.isArray(schema.enum) && schema.enum.length > 0)
|
|
26
|
+
return schema.enum[0];
|
|
27
|
+
switch (firstType(schema)) {
|
|
28
|
+
case "object": {
|
|
29
|
+
const seed = {};
|
|
30
|
+
if (isPlainObject(schema.properties) && Array.isArray(schema.required)) {
|
|
31
|
+
for (const key of schema.required) {
|
|
32
|
+
if (typeof key === "string" && isPlainObject(schema.properties[key])) {
|
|
33
|
+
seed[key] = seedFor(schema.properties[key]);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return seed;
|
|
38
|
+
}
|
|
39
|
+
case "array":
|
|
40
|
+
return [];
|
|
41
|
+
case "number":
|
|
42
|
+
case "integer":
|
|
43
|
+
return 0;
|
|
44
|
+
case "boolean":
|
|
45
|
+
return false;
|
|
46
|
+
case "null":
|
|
47
|
+
return null;
|
|
48
|
+
default:
|
|
49
|
+
return "";
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export function createSchemaForm(schema, initial, onChange) {
|
|
53
|
+
let current = initial ?? seedFor(schema);
|
|
54
|
+
const element = h("div", { class: "wgd-schemaform" });
|
|
55
|
+
function setAt(root, path, value, remove = false) {
|
|
56
|
+
if (path.length === 0)
|
|
57
|
+
return value;
|
|
58
|
+
const [step, ...rest] = path;
|
|
59
|
+
if (Array.isArray(root)) {
|
|
60
|
+
const copy = [...root];
|
|
61
|
+
if (rest.length === 0 && remove)
|
|
62
|
+
copy.splice(step, 1);
|
|
63
|
+
else
|
|
64
|
+
copy[step] = setAt(copy[step], rest, value, remove);
|
|
65
|
+
return copy;
|
|
66
|
+
}
|
|
67
|
+
const holder = isPlainObject(root) ? { ...root } : {};
|
|
68
|
+
if (rest.length === 0 && remove)
|
|
69
|
+
delete holder[step];
|
|
70
|
+
else
|
|
71
|
+
holder[step] = setAt(holder[step], rest, value, remove);
|
|
72
|
+
return holder;
|
|
73
|
+
}
|
|
74
|
+
function commit(path, value, rerender = false) {
|
|
75
|
+
current = setAt(current, path, value);
|
|
76
|
+
onChange(current);
|
|
77
|
+
if (rerender)
|
|
78
|
+
render();
|
|
79
|
+
}
|
|
80
|
+
function control(node, value, path, label) {
|
|
81
|
+
if (Array.isArray(node.enum)) {
|
|
82
|
+
const select = h("select", { class: "wgd-select" });
|
|
83
|
+
for (const option of node.enum) {
|
|
84
|
+
select.append(h("option", { value: JSON.stringify(option) }, [JSON.stringify(option)]));
|
|
85
|
+
}
|
|
86
|
+
select.value = JSON.stringify(value ?? node.enum[0]);
|
|
87
|
+
select.addEventListener("change", () => commit(path, JSON.parse(select.value)));
|
|
88
|
+
return field(label, select);
|
|
89
|
+
}
|
|
90
|
+
switch (firstType(node)) {
|
|
91
|
+
case "boolean": {
|
|
92
|
+
const box = h("input", { type: "checkbox" });
|
|
93
|
+
box.checked = value === true;
|
|
94
|
+
box.addEventListener("change", () => commit(path, box.checked));
|
|
95
|
+
return field(label, box);
|
|
96
|
+
}
|
|
97
|
+
case "number":
|
|
98
|
+
case "integer": {
|
|
99
|
+
const input = h("input", { type: "number", class: "wgd-input" });
|
|
100
|
+
input.value = typeof value === "number" ? String(value) : "0";
|
|
101
|
+
input.addEventListener("change", () => {
|
|
102
|
+
const parsed = Number(input.value);
|
|
103
|
+
commit(path, Number.isFinite(parsed) ? parsed : 0);
|
|
104
|
+
});
|
|
105
|
+
return field(label, input);
|
|
106
|
+
}
|
|
107
|
+
case "object": {
|
|
108
|
+
const body = h("div", { class: "wgd-jt-children" });
|
|
109
|
+
const properties = isPlainObject(node.properties) ? node.properties : {};
|
|
110
|
+
const required = Array.isArray(node.required) ? node.required : [];
|
|
111
|
+
const holder = isPlainObject(value) ? value : {};
|
|
112
|
+
for (const [name, sub] of Object.entries(properties)) {
|
|
113
|
+
if (!isPlainObject(sub))
|
|
114
|
+
continue;
|
|
115
|
+
const isRequired = required.includes(name);
|
|
116
|
+
body.append(control(sub, holder[name] ?? (isRequired ? seedFor(sub) : undefined), [...path, name], isRequired ? `${name} *` : name));
|
|
117
|
+
}
|
|
118
|
+
return h("fieldset", { class: "wgd-sf-object" }, [
|
|
119
|
+
h("legend", { class: "wgd-field-label" }, [label]),
|
|
120
|
+
body
|
|
121
|
+
]);
|
|
122
|
+
}
|
|
123
|
+
case "array": {
|
|
124
|
+
const itemsSchema = isPlainObject(node.items) ? node.items : {};
|
|
125
|
+
const items = Array.isArray(value) ? value : [];
|
|
126
|
+
const body = h("div", { class: "wgd-jt-children" });
|
|
127
|
+
items.forEach((item, index) => {
|
|
128
|
+
const row = h("div", { class: "wgd-jt-entry" }, [
|
|
129
|
+
control(itemsSchema, item, [...path, index], `#${index}`)
|
|
130
|
+
]);
|
|
131
|
+
const remove = h("button", { class: "wgd-icon", type: "button", title: "Remove item" }, ["✕"]);
|
|
132
|
+
remove.addEventListener("click", () => {
|
|
133
|
+
current = setAt(current, [...path, index], undefined, true);
|
|
134
|
+
onChange(current);
|
|
135
|
+
render();
|
|
136
|
+
});
|
|
137
|
+
row.append(remove);
|
|
138
|
+
body.append(row);
|
|
139
|
+
});
|
|
140
|
+
const add = h("button", { class: "wgd-button wgd-add", type: "button" }, ["+ item"]);
|
|
141
|
+
add.addEventListener("click", () => commit([...path, items.length], seedFor(itemsSchema), true));
|
|
142
|
+
body.append(h("div", { class: "wgd-toolbar" }, [add]));
|
|
143
|
+
return h("fieldset", { class: "wgd-sf-object" }, [
|
|
144
|
+
h("legend", { class: "wgd-field-label" }, [label]),
|
|
145
|
+
body
|
|
146
|
+
]);
|
|
147
|
+
}
|
|
148
|
+
default: {
|
|
149
|
+
const input = h("input", { type: "text", class: "wgd-input" });
|
|
150
|
+
if (typeof node.pattern === "string") {
|
|
151
|
+
input.setAttribute("placeholder", `pattern: ${node.pattern}`);
|
|
152
|
+
input.setAttribute("title", `Must match ${node.pattern}`);
|
|
153
|
+
}
|
|
154
|
+
input.value = typeof value === "string" ? value : value === undefined ? "" : String(value);
|
|
155
|
+
input.addEventListener("change", () => commit(path, input.value));
|
|
156
|
+
return field(label, input);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
function field(label, controlEl) {
|
|
161
|
+
return h("label", { class: "wgd-field" }, [
|
|
162
|
+
h("span", { class: "wgd-field-label" }, [label]),
|
|
163
|
+
controlEl
|
|
164
|
+
]);
|
|
165
|
+
}
|
|
166
|
+
function render() {
|
|
167
|
+
element.replaceChildren(control(schema, current, [], "data"));
|
|
168
|
+
}
|
|
169
|
+
render();
|
|
170
|
+
return {
|
|
171
|
+
element,
|
|
172
|
+
getValue: () => current,
|
|
173
|
+
setValue(value) {
|
|
174
|
+
if (element.contains(document.activeElement))
|
|
175
|
+
return;
|
|
176
|
+
current = value ?? seedFor(schema);
|
|
177
|
+
render();
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=schema-form.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-form.js","sourceRoot":"","sources":["../src/schema-form.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** The primary type a schema declares, if any. */
|
|
2
|
+
export declare function schemaType(schema: unknown): string | undefined;
|
|
3
|
+
/**
|
|
4
|
+
* Dotted paths reachable from a schema, with the schema at each path.
|
|
5
|
+
* Arrays are offered as themselves; descending into their items needs an
|
|
6
|
+
* `each` first, so collection stops there.
|
|
7
|
+
*/
|
|
8
|
+
export declare function collectPaths(schema: unknown, prefix: string, out: {
|
|
9
|
+
path: string;
|
|
10
|
+
schema: unknown;
|
|
11
|
+
}[], depth?: number): void;
|
|
12
|
+
/** The sub-schema at a dotted path ("" or "." is the schema itself). */
|
|
13
|
+
export declare function schemaAt(schema: unknown, path: string): unknown;
|
|
14
|
+
/** Numeric types agree with each other; unknown never mismatches. */
|
|
15
|
+
export declare function typesConflict(a: string | undefined, b: string | undefined): boolean;
|
|
16
|
+
/** All dotted paths under a schema (leaves and branches), for completions. */
|
|
17
|
+
export declare function allPaths(schema: unknown): string[];
|
|
18
|
+
//# sourceMappingURL=schema-paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-paths.d.ts","sourceRoot":"","sources":["../src/schema-paths.ts"],"names":[],"mappings":"AAOA,kDAAkD;AAClD,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAS9D;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,EACd,GAAG,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,EAAE,EACxC,KAAK,SAAI,GACR,IAAI,CAQN;AAED,wEAAwE;AACxE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAkB/D;AAED,qEAAqE;AACrE,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAInF;AAED,8EAA8E;AAC9E,wBAAgB,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,CAIlD"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path helpers over widgentic's dataSchema subset, shared by the template
|
|
3
|
+
* panel (bind/each/when completions) and the binding editor (input and
|
|
4
|
+
* output mapping completions, type checks). Nullable type arrays pick the
|
|
5
|
+
* PRIMARY type; `any` (no type) is treated as unknown, never mismatched.
|
|
6
|
+
*/
|
|
7
|
+
import { isPlainObject } from "@widgentic/core";
|
|
8
|
+
/** The primary type a schema declares, if any. */
|
|
9
|
+
export function schemaType(schema) {
|
|
10
|
+
if (!isPlainObject(schema))
|
|
11
|
+
return undefined;
|
|
12
|
+
const type = schema.type;
|
|
13
|
+
if (typeof type === "string")
|
|
14
|
+
return type;
|
|
15
|
+
if (Array.isArray(type)) {
|
|
16
|
+
const primary = type.find((t) => typeof t === "string" && t !== "null");
|
|
17
|
+
if (typeof primary === "string")
|
|
18
|
+
return primary;
|
|
19
|
+
}
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Dotted paths reachable from a schema, with the schema at each path.
|
|
24
|
+
* Arrays are offered as themselves; descending into their items needs an
|
|
25
|
+
* `each` first, so collection stops there.
|
|
26
|
+
*/
|
|
27
|
+
export function collectPaths(schema, prefix, out, depth = 0) {
|
|
28
|
+
if (!isPlainObject(schema) || depth > 3)
|
|
29
|
+
return;
|
|
30
|
+
if (schemaType(schema) !== "object" || !isPlainObject(schema.properties))
|
|
31
|
+
return;
|
|
32
|
+
for (const [name, sub] of Object.entries(schema.properties)) {
|
|
33
|
+
const path = prefix === "" ? name : `${prefix}.${name}`;
|
|
34
|
+
out.push({ path, schema: sub });
|
|
35
|
+
collectPaths(sub, path, out, depth + 1);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** The sub-schema at a dotted path ("" or "." is the schema itself). */
|
|
39
|
+
export function schemaAt(schema, path) {
|
|
40
|
+
if (path === "" || path === ".")
|
|
41
|
+
return schema;
|
|
42
|
+
let current = schema;
|
|
43
|
+
for (const segment of path.split(".")) {
|
|
44
|
+
if (!isPlainObject(current))
|
|
45
|
+
return undefined;
|
|
46
|
+
if (schemaType(current) === "array") {
|
|
47
|
+
current = isPlainObject(current.items) ? current.items : undefined;
|
|
48
|
+
if (!/^\d+$/.test(segment)) {
|
|
49
|
+
// A named segment under an array steps into the item schema.
|
|
50
|
+
if (!isPlainObject(current) || !isPlainObject(current.properties))
|
|
51
|
+
return undefined;
|
|
52
|
+
current = current.properties[segment];
|
|
53
|
+
}
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (!isPlainObject(current.properties))
|
|
57
|
+
return undefined;
|
|
58
|
+
current = current.properties[segment];
|
|
59
|
+
}
|
|
60
|
+
return current;
|
|
61
|
+
}
|
|
62
|
+
/** Numeric types agree with each other; unknown never mismatches. */
|
|
63
|
+
export function typesConflict(a, b) {
|
|
64
|
+
if (a === undefined || b === undefined)
|
|
65
|
+
return false;
|
|
66
|
+
const norm = (t) => (t === "integer" ? "number" : t);
|
|
67
|
+
return norm(a) !== norm(b);
|
|
68
|
+
}
|
|
69
|
+
/** All dotted paths under a schema (leaves and branches), for completions. */
|
|
70
|
+
export function allPaths(schema) {
|
|
71
|
+
const entries = [];
|
|
72
|
+
collectPaths(schema, "", entries);
|
|
73
|
+
return entries.map((entry) => entry.path);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=schema-paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-paths.js","sourceRoot":"","sources":["../src/schema-paths.ts"],"names":[],"mappings":"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"}
|
package/dist/seed.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ThemeEntry } from "@widgentic/core";
|
|
2
|
+
import type { WidgetDraft } from "./store.js";
|
|
3
|
+
/** Built-in kinds that have a starter template (custom/group do not). */
|
|
4
|
+
export declare const SEEDABLE_BUILTINS: readonly ["card", "table", "tree"];
|
|
5
|
+
export type SeedableBuiltin = (typeof SEEDABLE_BUILTINS)[number];
|
|
6
|
+
/**
|
|
7
|
+
* Seed a widget draft from a stored definition or a built-in kind name.
|
|
8
|
+
* The result always carries an identity distinct from the source AND from
|
|
9
|
+
* every entry in `taken`.
|
|
10
|
+
*/
|
|
11
|
+
export declare function seedWidgetDraft(source: WidgetDraft | SeedableBuiltin, taken?: Iterable<string>): WidgetDraft;
|
|
12
|
+
/**
|
|
13
|
+
* Seed a theme entry from a stored entry or a preset name. Preset sources:
|
|
14
|
+
* `light` = the token defaults, `dark` = the dark preset. The result's
|
|
15
|
+
* name is distinct from the source, never reserved, and avoids `taken`.
|
|
16
|
+
*/
|
|
17
|
+
export declare function seedThemeEntry(source: ThemeEntry | "light" | "dark", taken?: Iterable<string>): ThemeEntry;
|
|
18
|
+
//# sourceMappingURL=seed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../src/seed.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,yEAAyE;AACzE,eAAO,MAAM,iBAAiB,YAAI,MAAM,EAAE,OAAO,EAAE,MAAM,CAAU,CAAC;AACpE,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAiQjE;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,WAAW,GAAG,eAAe,EACrC,KAAK,GAAE,QAAQ,CAAC,MAAM,CAAM,GAC3B,WAAW,CASb;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,UAAU,GAAG,OAAO,GAAG,MAAM,EACrC,KAAK,GAAE,QAAQ,CAAC,MAAM,CAAM,GAC3B,UAAU,CAgBZ"}
|