@book.dev/sdk 3.15.2 → 3.17.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/dist/ai.d.ts +1 -1
- package/dist/assetUpload.d.ts +28 -0
- package/dist/assetUpload.js +54 -0
- package/dist/assetUpload.js.map +1 -0
- package/dist/blockCatalogue.d.ts +15 -39
- package/dist/blockCatalogue.js +30 -52
- package/dist/blockCatalogue.js.map +1 -1
- package/dist/blockPropSchemas.d.ts +293 -0
- package/dist/blockPropSchemas.js +77 -0
- package/dist/blockPropSchemas.js.map +1 -0
- package/dist/blockSnapshot.d.ts +48 -0
- package/dist/blockSnapshot.js +211 -0
- package/dist/blockSnapshot.js.map +1 -0
- package/dist/client.js +29 -0
- package/dist/client.js.map +1 -1
- package/dist/content.d.ts +5 -4
- package/dist/content.js +2 -1
- package/dist/content.js.map +1 -1
- package/dist/databaseTools.d.ts +86 -0
- package/dist/databaseTools.js +174 -0
- package/dist/databaseTools.js.map +1 -0
- package/dist/index.d.ts +8 -2
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/pageTools.d.ts +61 -0
- package/dist/pageTools.js +175 -0
- package/dist/pageTools.js.map +1 -0
- package/dist/richTextInput.d.ts +29 -0
- package/dist/richTextInput.js +142 -0
- package/dist/richTextInput.js.map +1 -0
- package/dist/suggestions.d.ts +1 -1
- package/dist/tableSnapshot.d.ts +12 -4
- package/dist/tableSnapshot.js +34 -4
- package/dist/tableSnapshot.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export type BlockPropsJsonSchema = {
|
|
3
|
+
type: 'object';
|
|
4
|
+
properties: Record<string, unknown>;
|
|
5
|
+
additionalProperties: boolean;
|
|
6
|
+
};
|
|
7
|
+
type Field = {
|
|
8
|
+
schema: z.ZodTypeAny;
|
|
9
|
+
json: Record<string, unknown>;
|
|
10
|
+
};
|
|
11
|
+
declare const fields: {
|
|
12
|
+
paragraph: {};
|
|
13
|
+
heading: {
|
|
14
|
+
level: Field;
|
|
15
|
+
};
|
|
16
|
+
list: {
|
|
17
|
+
kind: Field;
|
|
18
|
+
};
|
|
19
|
+
todo: {
|
|
20
|
+
checked: Field;
|
|
21
|
+
};
|
|
22
|
+
quote: {};
|
|
23
|
+
callout: {
|
|
24
|
+
variant: Field;
|
|
25
|
+
};
|
|
26
|
+
code: {
|
|
27
|
+
language: Field;
|
|
28
|
+
live: Field;
|
|
29
|
+
name: Field;
|
|
30
|
+
collapsed: Field;
|
|
31
|
+
};
|
|
32
|
+
notes: {};
|
|
33
|
+
divider: {};
|
|
34
|
+
image: {
|
|
35
|
+
assetId: Field;
|
|
36
|
+
src: Field;
|
|
37
|
+
alt: Field;
|
|
38
|
+
caption: Field;
|
|
39
|
+
width: Field;
|
|
40
|
+
};
|
|
41
|
+
htmlArtifact: {
|
|
42
|
+
assetId: Field;
|
|
43
|
+
title: Field;
|
|
44
|
+
height: Field;
|
|
45
|
+
};
|
|
46
|
+
columns: {};
|
|
47
|
+
column: {
|
|
48
|
+
span: Field;
|
|
49
|
+
};
|
|
50
|
+
table: {};
|
|
51
|
+
row: {
|
|
52
|
+
header: Field;
|
|
53
|
+
};
|
|
54
|
+
cell: {};
|
|
55
|
+
group: {
|
|
56
|
+
name: Field;
|
|
57
|
+
locked: Field;
|
|
58
|
+
};
|
|
59
|
+
tabs: {};
|
|
60
|
+
tab: {
|
|
61
|
+
label: Field;
|
|
62
|
+
};
|
|
63
|
+
accordion: {
|
|
64
|
+
name: Field;
|
|
65
|
+
gated: Field;
|
|
66
|
+
};
|
|
67
|
+
accordionsection: {
|
|
68
|
+
label: Field;
|
|
69
|
+
collapsed: Field;
|
|
70
|
+
};
|
|
71
|
+
slider: {
|
|
72
|
+
value: Field;
|
|
73
|
+
min: Field;
|
|
74
|
+
max: Field;
|
|
75
|
+
step: Field;
|
|
76
|
+
name: Field;
|
|
77
|
+
label: Field;
|
|
78
|
+
description: Field;
|
|
79
|
+
compact: Field;
|
|
80
|
+
interactive: Field;
|
|
81
|
+
};
|
|
82
|
+
number: {
|
|
83
|
+
value: Field;
|
|
84
|
+
min: Field;
|
|
85
|
+
max: Field;
|
|
86
|
+
step: Field;
|
|
87
|
+
name: Field;
|
|
88
|
+
label: Field;
|
|
89
|
+
description: Field;
|
|
90
|
+
compact: Field;
|
|
91
|
+
interactive: Field;
|
|
92
|
+
};
|
|
93
|
+
textfield: {
|
|
94
|
+
value: Field;
|
|
95
|
+
placeholder: Field;
|
|
96
|
+
name: Field;
|
|
97
|
+
label: Field;
|
|
98
|
+
description: Field;
|
|
99
|
+
compact: Field;
|
|
100
|
+
interactive: Field;
|
|
101
|
+
};
|
|
102
|
+
longtext: {
|
|
103
|
+
value: Field;
|
|
104
|
+
placeholder: Field;
|
|
105
|
+
name: Field;
|
|
106
|
+
label: Field;
|
|
107
|
+
description: Field;
|
|
108
|
+
compact: Field;
|
|
109
|
+
interactive: Field;
|
|
110
|
+
};
|
|
111
|
+
richtext: {
|
|
112
|
+
placeholder: Field;
|
|
113
|
+
runs: Field;
|
|
114
|
+
name: Field;
|
|
115
|
+
label: Field;
|
|
116
|
+
description: Field;
|
|
117
|
+
compact: Field;
|
|
118
|
+
interactive: Field;
|
|
119
|
+
};
|
|
120
|
+
toggle: {
|
|
121
|
+
value: Field;
|
|
122
|
+
name: Field;
|
|
123
|
+
label: Field;
|
|
124
|
+
description: Field;
|
|
125
|
+
compact: Field;
|
|
126
|
+
interactive: Field;
|
|
127
|
+
};
|
|
128
|
+
radio: {
|
|
129
|
+
value: Field;
|
|
130
|
+
opts: Field;
|
|
131
|
+
options: Field;
|
|
132
|
+
name: Field;
|
|
133
|
+
label: Field;
|
|
134
|
+
description: Field;
|
|
135
|
+
compact: Field;
|
|
136
|
+
interactive: Field;
|
|
137
|
+
};
|
|
138
|
+
dropdown: {
|
|
139
|
+
value: Field;
|
|
140
|
+
opts: Field;
|
|
141
|
+
options: Field;
|
|
142
|
+
name: Field;
|
|
143
|
+
label: Field;
|
|
144
|
+
description: Field;
|
|
145
|
+
compact: Field;
|
|
146
|
+
interactive: Field;
|
|
147
|
+
};
|
|
148
|
+
checklist: {
|
|
149
|
+
selected: Field;
|
|
150
|
+
value: Field;
|
|
151
|
+
opts: Field;
|
|
152
|
+
options: Field;
|
|
153
|
+
name: Field;
|
|
154
|
+
label: Field;
|
|
155
|
+
description: Field;
|
|
156
|
+
compact: Field;
|
|
157
|
+
interactive: Field;
|
|
158
|
+
};
|
|
159
|
+
choicecards: {
|
|
160
|
+
selected: Field;
|
|
161
|
+
multi: Field;
|
|
162
|
+
value: Field;
|
|
163
|
+
opts: Field;
|
|
164
|
+
options: Field;
|
|
165
|
+
name: Field;
|
|
166
|
+
label: Field;
|
|
167
|
+
description: Field;
|
|
168
|
+
compact: Field;
|
|
169
|
+
interactive: Field;
|
|
170
|
+
};
|
|
171
|
+
searchselect: {
|
|
172
|
+
selected: Field;
|
|
173
|
+
multi: Field;
|
|
174
|
+
dynamic: Field;
|
|
175
|
+
value: Field;
|
|
176
|
+
opts: Field;
|
|
177
|
+
options: Field;
|
|
178
|
+
name: Field;
|
|
179
|
+
label: Field;
|
|
180
|
+
description: Field;
|
|
181
|
+
compact: Field;
|
|
182
|
+
interactive: Field;
|
|
183
|
+
};
|
|
184
|
+
tagfield: {
|
|
185
|
+
selected: Field;
|
|
186
|
+
opts: Field;
|
|
187
|
+
options: Field;
|
|
188
|
+
dynamic: Field;
|
|
189
|
+
freeEntry: Field;
|
|
190
|
+
name: Field;
|
|
191
|
+
label: Field;
|
|
192
|
+
description: Field;
|
|
193
|
+
compact: Field;
|
|
194
|
+
interactive: Field;
|
|
195
|
+
};
|
|
196
|
+
location: {
|
|
197
|
+
labeltext: Field;
|
|
198
|
+
lat: Field;
|
|
199
|
+
lng: Field;
|
|
200
|
+
name: Field;
|
|
201
|
+
label: Field;
|
|
202
|
+
description: Field;
|
|
203
|
+
compact: Field;
|
|
204
|
+
interactive: Field;
|
|
205
|
+
};
|
|
206
|
+
actionbutton: {
|
|
207
|
+
btnlabel: Field;
|
|
208
|
+
action: Field;
|
|
209
|
+
target: Field;
|
|
210
|
+
amount: Field;
|
|
211
|
+
url: Field;
|
|
212
|
+
name: Field;
|
|
213
|
+
label: Field;
|
|
214
|
+
description: Field;
|
|
215
|
+
compact: Field;
|
|
216
|
+
interactive: Field;
|
|
217
|
+
};
|
|
218
|
+
kitchart: {
|
|
219
|
+
kind: Field;
|
|
220
|
+
title: Field;
|
|
221
|
+
labels: Field;
|
|
222
|
+
source: Field;
|
|
223
|
+
sourceMode: Field;
|
|
224
|
+
dbId: Field;
|
|
225
|
+
dbGroupBy: Field;
|
|
226
|
+
dbAggProp: Field;
|
|
227
|
+
dbAggType: Field;
|
|
228
|
+
dbFilterProp: Field;
|
|
229
|
+
dbFilterInput: Field;
|
|
230
|
+
name: Field;
|
|
231
|
+
label: Field;
|
|
232
|
+
description: Field;
|
|
233
|
+
compact: Field;
|
|
234
|
+
interactive: Field;
|
|
235
|
+
};
|
|
236
|
+
statuslight: {
|
|
237
|
+
source: Field;
|
|
238
|
+
okAt: Field;
|
|
239
|
+
warnAt: Field;
|
|
240
|
+
name: Field;
|
|
241
|
+
label: Field;
|
|
242
|
+
description: Field;
|
|
243
|
+
compact: Field;
|
|
244
|
+
interactive: Field;
|
|
245
|
+
};
|
|
246
|
+
progressbar: {
|
|
247
|
+
source: Field;
|
|
248
|
+
max: Field;
|
|
249
|
+
format: Field;
|
|
250
|
+
name: Field;
|
|
251
|
+
label: Field;
|
|
252
|
+
description: Field;
|
|
253
|
+
compact: Field;
|
|
254
|
+
interactive: Field;
|
|
255
|
+
};
|
|
256
|
+
formula: {
|
|
257
|
+
source: Field;
|
|
258
|
+
name: Field;
|
|
259
|
+
label: Field;
|
|
260
|
+
description: Field;
|
|
261
|
+
compact: Field;
|
|
262
|
+
interactive: Field;
|
|
263
|
+
};
|
|
264
|
+
linkcard: {
|
|
265
|
+
title: Field;
|
|
266
|
+
url: Field;
|
|
267
|
+
description: Field;
|
|
268
|
+
};
|
|
269
|
+
tooltipcard: {
|
|
270
|
+
term: Field;
|
|
271
|
+
tip: Field;
|
|
272
|
+
};
|
|
273
|
+
dbview: {
|
|
274
|
+
pageId: Field;
|
|
275
|
+
};
|
|
276
|
+
dbform: {
|
|
277
|
+
databaseId: Field;
|
|
278
|
+
viewId: Field;
|
|
279
|
+
};
|
|
280
|
+
form: {
|
|
281
|
+
formId: Field;
|
|
282
|
+
submissionKey: Field;
|
|
283
|
+
enabled: Field;
|
|
284
|
+
databaseId: Field;
|
|
285
|
+
schema: Field;
|
|
286
|
+
label: Field;
|
|
287
|
+
description: Field;
|
|
288
|
+
};
|
|
289
|
+
};
|
|
290
|
+
export type CataloguedSchemaType = keyof typeof fields;
|
|
291
|
+
export declare const BLOCK_PROP_SCHEMAS: Readonly<Record<CataloguedSchemaType, z.ZodObject<z.ZodRawShape>>>;
|
|
292
|
+
export declare const BLOCK_PROP_JSON_SCHEMAS: Readonly<Record<CataloguedSchemaType, BlockPropsJsonSchema>>;
|
|
293
|
+
export {};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
const string = (description, constraints = {}) => ({
|
|
3
|
+
schema: z.string(), json: { type: 'string', ...constraints, ...(description ? { description } : {}) },
|
|
4
|
+
});
|
|
5
|
+
const number = (description, minimum = Number.NEGATIVE_INFINITY, maximum = Number.POSITIVE_INFINITY) => ({
|
|
6
|
+
schema: z.number().finite().min(minimum).max(maximum),
|
|
7
|
+
json: { type: 'number', ...(Number.isFinite(minimum) ? { minimum } : {}), ...(Number.isFinite(maximum) ? { maximum } : {}), ...(description ? { description } : {}) },
|
|
8
|
+
});
|
|
9
|
+
const cssLength = (description) => ({
|
|
10
|
+
schema: z.string().regex(/^\d+(\.\d+)?(%|px)$/, 'must be a CSS length like "60%" or "320px"'),
|
|
11
|
+
json: { type: 'string', pattern: '^\\d+(\\.\\d+)?(%|px)$', ...(description ? { description } : {}) },
|
|
12
|
+
});
|
|
13
|
+
const boolean = (description) => ({ schema: z.boolean(), json: { type: 'boolean', ...(description ? { description } : {}) } });
|
|
14
|
+
const enumeration = (values, description) => ({
|
|
15
|
+
schema: z.enum(values), json: { type: 'string', enum: [...values], ...(description ? { description } : {}) },
|
|
16
|
+
});
|
|
17
|
+
const array = (item, description) => ({
|
|
18
|
+
schema: z.array(item.schema), json: { type: 'array', items: item.json, ...(description ? { description } : {}) },
|
|
19
|
+
});
|
|
20
|
+
const object = (fields, description, required = []) => ({
|
|
21
|
+
schema: z.object(Object.fromEntries(Object.entries(fields).map(([k, v]) => [k, required.includes(k) ? v.schema : v.schema.optional()]))).strict(),
|
|
22
|
+
json: { type: 'object', properties: Object.fromEntries(Object.entries(fields).map(([k, v]) => [k, v.json])), ...(required.length ? { required: [...required] } : {}), additionalProperties: false, ...(description ? { description } : {}) },
|
|
23
|
+
});
|
|
24
|
+
const freeObject = { schema: z.record(z.unknown()), json: { type: 'object', additionalProperties: true } };
|
|
25
|
+
const expression = (description) => ({
|
|
26
|
+
schema: z.string().trim().min(1).max(4096),
|
|
27
|
+
json: { type: 'string', minLength: 1, maxLength: 4096, format: 'openbook-expression', description },
|
|
28
|
+
});
|
|
29
|
+
const id = string('Stable identifier.', { minLength: 1, maxLength: 512 });
|
|
30
|
+
const text = string(undefined, { maxLength: 16384 });
|
|
31
|
+
const selected = array(string('Option value/id.', { minLength: 1, maxLength: 512 }), 'Selected option value IDs.');
|
|
32
|
+
const option = object({ label: string('Reader-facing label.', { minLength: 1, maxLength: 512 }), value: string('Published value; defaults to a slug of label.', { maxLength: 512 }), image: text, icon: text, color: text }, 'A selectable option.', ['label']);
|
|
33
|
+
const opts = array(option, 'Structured selectable options.');
|
|
34
|
+
const attrs = object({ b: boolean(), i: boolean(), u: boolean(), s: boolean(), c: boolean(), a: string('Safe http, https, or mailto link.') });
|
|
35
|
+
const run = object({ t: string('Run text.'), a: attrs }, 'One rich-text run.', ['t']);
|
|
36
|
+
const runs = array(run, 'Rich-text runs.');
|
|
37
|
+
const common = { bg: text };
|
|
38
|
+
const frame = { name: text, label: text, description: text, compact: boolean(), interactive: boolean() };
|
|
39
|
+
const inputText = { ...frame, value: text, placeholder: text };
|
|
40
|
+
const optionsBase = { ...frame, value: text, opts, options: text };
|
|
41
|
+
const fields = {
|
|
42
|
+
paragraph: {}, heading: { level: number('Heading level.', 1, 3) }, list: { kind: enumeration(['bullet', 'number']) },
|
|
43
|
+
todo: { checked: boolean() }, quote: {}, callout: { variant: enumeration(['info', 'warn', 'success']) },
|
|
44
|
+
code: { language: text, live: boolean(), name: text, collapsed: boolean() }, notes: {}, divider: {},
|
|
45
|
+
image: { assetId: id, src: text, alt: text, caption: text, width: cssLength('Rendered width as a CSS length such as "60%" or "320px".') },
|
|
46
|
+
htmlArtifact: { assetId: id, title: text, height: number('Sandbox height in CSS pixels.', 120, 1200) },
|
|
47
|
+
columns: {}, column: { span: number('Grid columns.', 1, 12) }, table: {}, row: { header: boolean() }, cell: {},
|
|
48
|
+
group: { name: text, locked: boolean() }, tabs: {}, tab: { label: text }, accordion: { name: text, gated: boolean() }, accordionsection: { label: text, collapsed: boolean() },
|
|
49
|
+
slider: { ...frame, value: number(), min: number(), max: number(), step: number(undefined, 0) },
|
|
50
|
+
number: { ...frame, value: number(), min: number(), max: number(), step: number(undefined, 0) },
|
|
51
|
+
textfield: inputText, longtext: inputText, richtext: { ...frame, placeholder: text, runs }, toggle: { ...frame, value: boolean() },
|
|
52
|
+
radio: optionsBase, dropdown: optionsBase, checklist: { ...optionsBase, selected },
|
|
53
|
+
choicecards: { ...optionsBase, selected, multi: boolean() },
|
|
54
|
+
searchselect: { ...optionsBase, selected, multi: boolean(), dynamic: expression('Expression returning an array or comma-separated string.') },
|
|
55
|
+
tagfield: { ...frame, selected, opts, options: text, dynamic: expression('Expression returning tag suggestions.'), freeEntry: boolean() },
|
|
56
|
+
location: { ...frame, labeltext: text, lat: number('Latitude.', -90, 90), lng: number('Longitude.', -180, 180) },
|
|
57
|
+
actionbutton: { ...frame, btnlabel: text, action: enumeration(['increment', 'set', 'toggle', 'link']), target: text, amount: number(), url: text },
|
|
58
|
+
kitchart: { ...frame, kind: enumeration(['line', 'area', 'bar', 'pie', 'donut', 'scatter', 'funnel']), title: text, labels: expression('Expression or comma-separated labels.'), source: expression('Expression producing chart data.'), sourceMode: enumeration(['expression', 'database']), dbId: text, dbGroupBy: text, dbAggProp: text, dbAggType: text, dbFilterProp: text, dbFilterInput: text },
|
|
59
|
+
statuslight: { ...frame, source: expression('Condition/value expression.'), okAt: number(), warnAt: number() },
|
|
60
|
+
progressbar: { ...frame, source: expression('Numeric expression.'), max: number(undefined, 0), format: text },
|
|
61
|
+
formula: { ...frame, source: expression('Expression evaluated over the reactive scope.') },
|
|
62
|
+
linkcard: { title: text, url: text, description: text }, tooltipcard: { term: text, tip: text },
|
|
63
|
+
dbview: { pageId: id }, dbform: { databaseId: id, viewId: id },
|
|
64
|
+
form: { formId: id, submissionKey: text, enabled: boolean(), databaseId: id, schema: freeObject, label: text, description: text },
|
|
65
|
+
};
|
|
66
|
+
const makeEntry = (own) => {
|
|
67
|
+
const all = { ...common, ...own };
|
|
68
|
+
return {
|
|
69
|
+
// Patches are optional and nullable: null removes the prop. Declared props
|
|
70
|
+
// are typed; undeclared props pass through for editor/forward compatibility.
|
|
71
|
+
schema: z.object(Object.fromEntries(Object.entries(all).map(([k, v]) => [k, v.schema.nullish()]))).passthrough(),
|
|
72
|
+
jsonSchema: { type: 'object', properties: Object.fromEntries(Object.entries(all).map(([k, v]) => [k, { ...v.json, nullable: true }])), additionalProperties: true },
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
export const BLOCK_PROP_SCHEMAS = Object.fromEntries(Object.entries(fields).map(([type, shape]) => [type, makeEntry(shape).schema]));
|
|
76
|
+
export const BLOCK_PROP_JSON_SCHEMAS = Object.fromEntries(Object.entries(fields).map(([type, shape]) => [type, makeEntry(shape).jsonSchema]));
|
|
77
|
+
//# sourceMappingURL=blockPropSchemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blockPropSchemas.js","sourceRoot":"","sources":["../src/blockPropSchemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { type AppendBlock, type ProjectedBlock } from './content';
|
|
2
|
+
import type { PageSnapshot } from './types';
|
|
3
|
+
import { type RichTextInput } from './richTextInput';
|
|
4
|
+
export type SnapshotBlock = ProjectedBlock & {
|
|
5
|
+
children?: SnapshotBlock[];
|
|
6
|
+
};
|
|
7
|
+
export type BlockSnapshotErrorCode = 'invalid-position' | 'unknown-block' | 'unknown-parent' | 'unknown-after' | 'cycle' | 'table-owned' | 'invalid-parent';
|
|
8
|
+
/** An actionable, machine-readable refusal from a generic block-tree operation. */
|
|
9
|
+
export declare class BlockSnapshotError extends Error {
|
|
10
|
+
readonly code: BlockSnapshotErrorCode;
|
|
11
|
+
constructor(code: BlockSnapshotErrorCode, message: string);
|
|
12
|
+
}
|
|
13
|
+
export interface FoundSnapshotBlock {
|
|
14
|
+
block: SnapshotBlock;
|
|
15
|
+
siblings: SnapshotBlock[];
|
|
16
|
+
parent: SnapshotBlock | null;
|
|
17
|
+
ancestors: SnapshotBlock[];
|
|
18
|
+
index: number;
|
|
19
|
+
}
|
|
20
|
+
/** Find a block at any depth, including its parent/list coordinates. */
|
|
21
|
+
export declare function findBlock(data: PageSnapshot | null | undefined, blockId: string): FoundSnapshotBlock | null;
|
|
22
|
+
/** Replace one block's rich text from mini-markdown or explicit runs. */
|
|
23
|
+
export declare function setBlockText(data: PageSnapshot, blockId: string, text: RichTextInput, plain?: boolean): PageSnapshot | null;
|
|
24
|
+
/** Delete one block while preserving the editor's non-empty/container rules. */
|
|
25
|
+
export declare function deleteBlock(data: PageSnapshot, blockId: string, idPrefix: string): PageSnapshot | null;
|
|
26
|
+
/** Shallow-merge props; an explicit null removes a key. */
|
|
27
|
+
export declare function setBlockProps(data: PageSnapshot, blockId: string, props: Record<string, unknown>): {
|
|
28
|
+
data: PageSnapshot;
|
|
29
|
+
props: Record<string, unknown>;
|
|
30
|
+
} | null;
|
|
31
|
+
type Position = {
|
|
32
|
+
index?: number;
|
|
33
|
+
afterId?: string;
|
|
34
|
+
};
|
|
35
|
+
export interface MoveBlockInput extends Position {
|
|
36
|
+
blockId: string;
|
|
37
|
+
parentId?: string;
|
|
38
|
+
}
|
|
39
|
+
/** Move a block; index is measured against the destination after removing it. */
|
|
40
|
+
export declare function moveBlock(data: PageSnapshot, input: MoveBlockInput): PageSnapshot;
|
|
41
|
+
export interface InsertBlocksInput extends Position {
|
|
42
|
+
parentId?: string;
|
|
43
|
+
blocks: AppendBlock[];
|
|
44
|
+
idPrefix?: string;
|
|
45
|
+
}
|
|
46
|
+
/** Insert recursively projected blocks at a root or container position. */
|
|
47
|
+
export declare function insertBlocks(data: PageSnapshot, input: InsertBlocksInput): PageSnapshot;
|
|
48
|
+
export {};
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { blockTypeInfo, CHILD_ONLY_PARENT } from './blockCatalogue';
|
|
2
|
+
import { projectAppendBlocks } from './content';
|
|
3
|
+
import { richTextRuns } from './richTextInput';
|
|
4
|
+
/** An actionable, machine-readable refusal from a generic block-tree operation. */
|
|
5
|
+
export class BlockSnapshotError extends Error {
|
|
6
|
+
constructor(code, message) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.name = 'BlockSnapshotError';
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
const blocksOf = (data) => {
|
|
13
|
+
if (!data || data.editor !== 'blocks')
|
|
14
|
+
return null;
|
|
15
|
+
return (data.blockdoc?.blocks ?? []);
|
|
16
|
+
};
|
|
17
|
+
const copiedBlocks = (data) => {
|
|
18
|
+
const blocks = blocksOf(data);
|
|
19
|
+
return blocks ? structuredClone(blocks) : null;
|
|
20
|
+
};
|
|
21
|
+
const withBlocks = (data, blocks) => {
|
|
22
|
+
const blockdoc = data.blockdoc ?? {};
|
|
23
|
+
return { ...data, blockdoc: { ...blockdoc, update: undefined, blocks } };
|
|
24
|
+
};
|
|
25
|
+
/** Find a block at any depth, including its parent/list coordinates. */
|
|
26
|
+
export function findBlock(data, blockId) {
|
|
27
|
+
const roots = blocksOf(data);
|
|
28
|
+
if (!roots)
|
|
29
|
+
return null;
|
|
30
|
+
let found = null;
|
|
31
|
+
const walk = (siblings, parent, ancestors) => {
|
|
32
|
+
for (let index = 0; index < siblings.length && !found; index += 1) {
|
|
33
|
+
const block = siblings[index];
|
|
34
|
+
if (block.id === blockId)
|
|
35
|
+
found = { block, siblings, parent, ancestors, index };
|
|
36
|
+
else if (block.children)
|
|
37
|
+
walk(block.children, block, [...ancestors, block]);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
walk(roots, null, []);
|
|
41
|
+
return found;
|
|
42
|
+
}
|
|
43
|
+
/** Replace one block's rich text from mini-markdown or explicit runs. */
|
|
44
|
+
export function setBlockText(data, blockId, text, plain = false) {
|
|
45
|
+
const blocks = copiedBlocks(data);
|
|
46
|
+
if (!blocks)
|
|
47
|
+
return null;
|
|
48
|
+
const draft = withBlocks(data, blocks);
|
|
49
|
+
const found = findBlock(draft, blockId);
|
|
50
|
+
if (!found)
|
|
51
|
+
return null;
|
|
52
|
+
found.block.text = richTextRuns(text, plain);
|
|
53
|
+
return draft;
|
|
54
|
+
}
|
|
55
|
+
const pruneEmptyContainers = (blocks) => {
|
|
56
|
+
let changed = true;
|
|
57
|
+
while (changed) {
|
|
58
|
+
changed = false;
|
|
59
|
+
const walk = (list) => {
|
|
60
|
+
for (let i = 0; i < list.length; i += 1) {
|
|
61
|
+
const block = list[i];
|
|
62
|
+
if (block.type === 'column' && (block.children?.length ?? 0) === 0) {
|
|
63
|
+
list.splice(i, 1);
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
if (block.type === 'columns') {
|
|
67
|
+
const columns = block.children ?? [];
|
|
68
|
+
if (columns.length === 0) {
|
|
69
|
+
list.splice(i, 1);
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
if (columns.length === 1) {
|
|
73
|
+
list.splice(i, 1, ...(columns[0].children ?? []));
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (block.children && walk(block.children))
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
return false;
|
|
81
|
+
};
|
|
82
|
+
changed = walk(blocks);
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
/** Delete one block while preserving the editor's non-empty/container rules. */
|
|
86
|
+
export function deleteBlock(data, blockId, idPrefix) {
|
|
87
|
+
const blocks = copiedBlocks(data);
|
|
88
|
+
if (!blocks)
|
|
89
|
+
return null;
|
|
90
|
+
const draft = withBlocks(data, blocks);
|
|
91
|
+
const located = findBlock(draft, blockId);
|
|
92
|
+
if (!located)
|
|
93
|
+
return null;
|
|
94
|
+
let removeId = blockId;
|
|
95
|
+
if (located.block.type === 'row' && located.parent?.type === 'table' && located.siblings.length === 1) {
|
|
96
|
+
removeId = located.parent.id;
|
|
97
|
+
}
|
|
98
|
+
else if (located.block.type === 'cell' && located.parent?.type === 'row' && located.siblings.length === 1) {
|
|
99
|
+
const row = findBlock(draft, located.parent.id);
|
|
100
|
+
if (row?.parent?.type === 'table' && row.siblings.length === 1)
|
|
101
|
+
removeId = row.parent.id;
|
|
102
|
+
}
|
|
103
|
+
const target = removeId === blockId ? located : findBlock(draft, removeId);
|
|
104
|
+
if (!target)
|
|
105
|
+
return null;
|
|
106
|
+
target.siblings.splice(target.index, 1);
|
|
107
|
+
pruneEmptyContainers(blocks);
|
|
108
|
+
if (blocks.length === 0)
|
|
109
|
+
blocks.push({ id: `${idPrefix}-p`, type: 'paragraph', text: [{ t: '' }] });
|
|
110
|
+
return draft;
|
|
111
|
+
}
|
|
112
|
+
/** Shallow-merge props; an explicit null removes a key. */
|
|
113
|
+
export function setBlockProps(data, blockId, props) {
|
|
114
|
+
const blocks = copiedBlocks(data);
|
|
115
|
+
if (!blocks)
|
|
116
|
+
return null;
|
|
117
|
+
const draft = withBlocks(data, blocks);
|
|
118
|
+
const found = findBlock(draft, blockId);
|
|
119
|
+
if (!found)
|
|
120
|
+
return null;
|
|
121
|
+
const merged = { ...(found.block.props ?? {}) };
|
|
122
|
+
for (const [key, value] of Object.entries(props)) {
|
|
123
|
+
if (value === null)
|
|
124
|
+
delete merged[key];
|
|
125
|
+
else
|
|
126
|
+
merged[key] = value;
|
|
127
|
+
}
|
|
128
|
+
found.block.props = merged;
|
|
129
|
+
return { data: draft, props: merged };
|
|
130
|
+
}
|
|
131
|
+
const tableRefusal = () => {
|
|
132
|
+
throw new BlockSnapshotError('table-owned', 'Generic block operations cannot move into, out of, or within table/row/cell — use the table_* tools.');
|
|
133
|
+
};
|
|
134
|
+
const touchesTable = (found) => found.ancestors.some((block) => block.type === 'table');
|
|
135
|
+
const assertParentAccepts = (parent, childTypes) => {
|
|
136
|
+
if (!parent) {
|
|
137
|
+
const child = childTypes.find((type) => CHILD_ONLY_PARENT[type]);
|
|
138
|
+
if (child)
|
|
139
|
+
throw new BlockSnapshotError('invalid-parent', `${child} blocks must be children of ${CHILD_ONLY_PARENT[child]}.`);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
if (parent.type === 'table' || parent.type === 'row' || parent.type === 'cell')
|
|
143
|
+
tableRefusal();
|
|
144
|
+
if (blockTypeInfo(parent.type)?.nature !== 'container') {
|
|
145
|
+
throw new BlockSnapshotError('invalid-parent', `Block "${parent.id}" (${parent.type}) does not accept children.`);
|
|
146
|
+
}
|
|
147
|
+
for (const childType of childTypes) {
|
|
148
|
+
const required = CHILD_ONLY_PARENT[childType];
|
|
149
|
+
if ((required && required !== parent.type) || (!required && Object.values(CHILD_ONLY_PARENT).includes(parent.type))) {
|
|
150
|
+
throw new BlockSnapshotError('invalid-parent', `${parent.type} cannot contain ${childType} blocks.`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
const insertionIndex = (siblings, position) => {
|
|
155
|
+
if ((position.index === undefined) === (position.afterId === undefined)) {
|
|
156
|
+
throw new BlockSnapshotError('invalid-position', 'Provide exactly one of index or afterId.');
|
|
157
|
+
}
|
|
158
|
+
if (position.afterId !== undefined) {
|
|
159
|
+
const index = siblings.findIndex((block) => block.id === position.afterId);
|
|
160
|
+
if (index < 0)
|
|
161
|
+
throw new BlockSnapshotError('unknown-after', `No sibling block "${position.afterId}" at the destination.`);
|
|
162
|
+
return index + 1;
|
|
163
|
+
}
|
|
164
|
+
if (!Number.isInteger(position.index) || position.index < 0 || position.index > siblings.length) {
|
|
165
|
+
throw new BlockSnapshotError('invalid-position', `index must be an integer from 0 to ${siblings.length}.`);
|
|
166
|
+
}
|
|
167
|
+
return position.index;
|
|
168
|
+
};
|
|
169
|
+
/** Move a block; index is measured against the destination after removing it. */
|
|
170
|
+
export function moveBlock(data, input) {
|
|
171
|
+
var _a;
|
|
172
|
+
const blocks = copiedBlocks(data);
|
|
173
|
+
if (!blocks)
|
|
174
|
+
throw new BlockSnapshotError('unknown-block', 'That page is not a block-editor page.');
|
|
175
|
+
const draft = withBlocks(data, blocks);
|
|
176
|
+
const source = findBlock(draft, input.blockId);
|
|
177
|
+
if (!source)
|
|
178
|
+
throw new BlockSnapshotError('unknown-block', `No block "${input.blockId}" on that page.`);
|
|
179
|
+
if (touchesTable(source))
|
|
180
|
+
tableRefusal();
|
|
181
|
+
const parent = input.parentId === undefined ? null : findBlock(draft, input.parentId);
|
|
182
|
+
if (input.parentId !== undefined && !parent)
|
|
183
|
+
throw new BlockSnapshotError('unknown-parent', `No parent block "${input.parentId}" on that page.`);
|
|
184
|
+
if (parent && (parent.block.id === source.block.id || parent.ancestors.some((block) => block.id === source.block.id))) {
|
|
185
|
+
throw new BlockSnapshotError('cycle', 'Cannot move a block into its own subtree.');
|
|
186
|
+
}
|
|
187
|
+
assertParentAccepts(parent?.block ?? null, [source.block.type]);
|
|
188
|
+
const target = parent ? ((_a = parent.block).children ?? (_a.children = [])) : blocks;
|
|
189
|
+
source.siblings.splice(source.index, 1);
|
|
190
|
+
const at = insertionIndex(target, input);
|
|
191
|
+
target.splice(at, 0, source.block);
|
|
192
|
+
pruneEmptyContainers(blocks);
|
|
193
|
+
return draft;
|
|
194
|
+
}
|
|
195
|
+
/** Insert recursively projected blocks at a root or container position. */
|
|
196
|
+
export function insertBlocks(data, input) {
|
|
197
|
+
var _a;
|
|
198
|
+
const blocks = copiedBlocks(data);
|
|
199
|
+
if (!blocks)
|
|
200
|
+
throw new BlockSnapshotError('unknown-parent', 'That page is not a block-editor page.');
|
|
201
|
+
const draft = withBlocks(data, blocks);
|
|
202
|
+
const parent = input.parentId === undefined ? null : findBlock(draft, input.parentId);
|
|
203
|
+
if (input.parentId !== undefined && !parent)
|
|
204
|
+
throw new BlockSnapshotError('unknown-parent', `No parent block "${input.parentId}" on that page.`);
|
|
205
|
+
assertParentAccepts(parent?.block ?? null, input.blocks.map((block) => block.type));
|
|
206
|
+
const target = parent ? ((_a = parent.block).children ?? (_a.children = [])) : blocks;
|
|
207
|
+
const at = insertionIndex(target, input);
|
|
208
|
+
target.splice(at, 0, ...projectAppendBlocks(input.blocks, input.idPrefix ?? 'gen'));
|
|
209
|
+
return draft;
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=blockSnapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blockSnapshot.js","sourceRoot":"","sources":["../src/blockSnapshot.ts"],"names":[],"mappings":"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"}
|