@assemora/pages 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 +202 -0
- package/README.md +40 -0
- package/dist/block.d.ts +99 -0
- package/dist/block.d.ts.map +1 -0
- package/dist/block.js +115 -0
- package/dist/block.js.map +1 -0
- package/dist/commands.d.ts +586 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +377 -0
- package/dist/commands.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/models.d.ts +46 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +31 -0
- package/dist/models.js.map +1 -0
- package/dist/module.d.ts +18 -0
- package/dist/module.d.ts.map +1 -0
- package/dist/module.js +80 -0
- package/dist/module.js.map +1 -0
- package/dist/queries.d.ts +162 -0
- package/dist/queries.d.ts.map +1 -0
- package/dist/queries.js +195 -0
- package/dist/queries.js.map +1 -0
- package/dist/tree.d.ts +52 -0
- package/dist/tree.d.ts.map +1 -0
- package/dist/tree.js +207 -0
- package/dist/tree.js.map +1 -0
- package/package.json +42 -0
package/dist/commands.js
ADDED
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Page and block commands (SPEC.md §60, §66, §70).
|
|
3
|
+
*
|
|
4
|
+
* Every builder operation Studio offers is one of these, which is the whole point:
|
|
5
|
+
* if a person can do it with a mouse, an agent can do it through the same command,
|
|
6
|
+
* with the same validation, the same policies and the same revision (SPEC.md §2).
|
|
7
|
+
*/
|
|
8
|
+
import { AssemoraError, ConflictError, command, currentContext, isLocale, NotFoundError, ValidationError, } from '@assemora/core';
|
|
9
|
+
import { UNSPECIFIED_LOCALE } from '@assemora/data';
|
|
10
|
+
import { blockDesignPatch, blockTree, boolean, emptyTree, json, number, string, timestamp, uuid, } from '@assemora/schema';
|
|
11
|
+
import { Page } from './models.js';
|
|
12
|
+
import { addBlock, duplicateBlock, moveBlock, removeBlock, setBlockDesign, setBlockHidden, unfinishedBlocks, updateBlockProps, } from './tree.js';
|
|
13
|
+
/**
|
|
14
|
+
* Reads a page and refuses to go on if someone else has written since.
|
|
15
|
+
*
|
|
16
|
+
* SPEC.md §66: a mutation may carry the version it believes is current, and a
|
|
17
|
+
* mismatch is a 409 rather than a silent overwrite of somebody's newer work.
|
|
18
|
+
*/
|
|
19
|
+
const loadPage = async (id, expectedVersion) => {
|
|
20
|
+
const page = await Page.find(id);
|
|
21
|
+
if (page === null)
|
|
22
|
+
throw new NotFoundError('page', id);
|
|
23
|
+
if (expectedVersion !== undefined && page.version !== expectedVersion) {
|
|
24
|
+
throw new ConflictError('This page has changed since it was read', {
|
|
25
|
+
expectedVersion,
|
|
26
|
+
currentVersion: page.version,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
return page;
|
|
30
|
+
};
|
|
31
|
+
const snapshotOf = (page) => page.toJSON();
|
|
32
|
+
const VERSIONED = { id: uuid(), expectedVersion: number().integer().optional() };
|
|
33
|
+
export const CreatePage = command('pages.create', {
|
|
34
|
+
description: 'Creates an empty page',
|
|
35
|
+
input: { slug: string().min(1), title: string().min(1), meta: json().optional() },
|
|
36
|
+
output: { id: uuid(), slug: string(), version: number() },
|
|
37
|
+
handle: async ({ slug, title, meta }, context) => {
|
|
38
|
+
const page = await Page.create({
|
|
39
|
+
slug,
|
|
40
|
+
title,
|
|
41
|
+
status: 'draft',
|
|
42
|
+
// The language this is being written in, and nothing it translates. `slug` is
|
|
43
|
+
// unique within a language, so the same address in another one is another page.
|
|
44
|
+
locale: currentContext()?.locale ?? UNSPECIFIED_LOCALE,
|
|
45
|
+
translationOf: null,
|
|
46
|
+
draftTree: emptyTree(),
|
|
47
|
+
publishedTree: null,
|
|
48
|
+
meta: meta ?? {},
|
|
49
|
+
version: 1,
|
|
50
|
+
createdBy: context.actor?.id ?? null,
|
|
51
|
+
updatedBy: context.actor?.id ?? null,
|
|
52
|
+
publishedAt: null,
|
|
53
|
+
});
|
|
54
|
+
context.revise({
|
|
55
|
+
entityType: 'pages',
|
|
56
|
+
entityId: page.id,
|
|
57
|
+
before: null,
|
|
58
|
+
after: snapshotOf(page),
|
|
59
|
+
});
|
|
60
|
+
context.emit('page.created', { pageId: page.id });
|
|
61
|
+
return { id: page.id, slug: page.slug, version: page.version };
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
export const UpdatePage = command('pages.update', {
|
|
65
|
+
description: 'Renames a page or changes its metadata',
|
|
66
|
+
input: {
|
|
67
|
+
...VERSIONED,
|
|
68
|
+
title: string().min(1).optional(),
|
|
69
|
+
slug: string().min(1).optional(),
|
|
70
|
+
meta: json().optional(),
|
|
71
|
+
},
|
|
72
|
+
output: { id: uuid(), version: number() },
|
|
73
|
+
handle: async ({ id, expectedVersion, title, slug, meta }, context) => {
|
|
74
|
+
const page = await loadPage(id, expectedVersion);
|
|
75
|
+
const before = snapshotOf(page);
|
|
76
|
+
await context.authorize('pages', 'update', before);
|
|
77
|
+
await page.update({
|
|
78
|
+
...(title === undefined ? {} : { title }),
|
|
79
|
+
...(slug === undefined ? {} : { slug }),
|
|
80
|
+
...(meta === undefined ? {} : { meta }),
|
|
81
|
+
version: page.version + 1,
|
|
82
|
+
updatedBy: context.actor?.id ?? null,
|
|
83
|
+
});
|
|
84
|
+
context.revise({ entityType: 'pages', entityId: id, before, after: snapshotOf(page) });
|
|
85
|
+
context.emit('page.updated', { pageId: id });
|
|
86
|
+
return { id, version: page.version };
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
export const PublishPage = command('pages.publish', {
|
|
90
|
+
description: 'Makes the draft tree the one visitors see',
|
|
91
|
+
input: VERSIONED,
|
|
92
|
+
output: { id: uuid(), version: number(), publishedAt: timestamp().nullable() },
|
|
93
|
+
handle: async ({ id, expectedVersion }, context) => {
|
|
94
|
+
const page = await loadPage(id, expectedVersion);
|
|
95
|
+
const before = snapshotOf(page);
|
|
96
|
+
await context.authorize('pages', 'publish', before);
|
|
97
|
+
// A draft may hold a block nobody has filled in. What visitors see may not.
|
|
98
|
+
const unfinished = unfinishedBlocks(page.draftTree);
|
|
99
|
+
if (unfinished.length > 0)
|
|
100
|
+
throw new ValidationError(unfinished);
|
|
101
|
+
await page.update({
|
|
102
|
+
status: 'published',
|
|
103
|
+
publishedTree: page.draftTree,
|
|
104
|
+
publishedAt: new Date(),
|
|
105
|
+
version: page.version + 1,
|
|
106
|
+
updatedBy: context.actor?.id ?? null,
|
|
107
|
+
});
|
|
108
|
+
context.revise({ entityType: 'pages', entityId: id, before, after: snapshotOf(page) });
|
|
109
|
+
context.emit('page.published', { pageId: id, slug: page.slug });
|
|
110
|
+
return { id, version: page.version, publishedAt: page.publishedAt };
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
/** Everything a tree edit owes the pipeline once it has produced a new tree. */
|
|
114
|
+
const commitTree = async (page, before, tree, context, blockId) => {
|
|
115
|
+
await page.update({
|
|
116
|
+
draftTree: tree,
|
|
117
|
+
version: page.version + 1,
|
|
118
|
+
updatedBy: context.actor?.id ?? null,
|
|
119
|
+
});
|
|
120
|
+
context.revise({ entityType: 'pages', entityId: page.id, before, after: snapshotOf(page) });
|
|
121
|
+
context.emit('page.updated', { pageId: page.id });
|
|
122
|
+
// The new tree comes back with the new version.
|
|
123
|
+
//
|
|
124
|
+
// An editor has to draw the result of what it just did, and a client that had to
|
|
125
|
+
// re-read the page to learn it would spend a round trip per keystroke — and would
|
|
126
|
+
// be tempted to keep its own copy of these operations instead, which is exactly the
|
|
127
|
+
// duplicated business logic Studio must not have (SPEC.md §58).
|
|
128
|
+
return {
|
|
129
|
+
id: page.id,
|
|
130
|
+
version: page.version,
|
|
131
|
+
tree: page.draftTree,
|
|
132
|
+
...(blockId === undefined ? {} : { blockId }),
|
|
133
|
+
};
|
|
134
|
+
};
|
|
135
|
+
/** Reads the page, checks the version and asks the policy — the three every edit owes. */
|
|
136
|
+
const openForEdit = async (id, expectedVersion, context) => {
|
|
137
|
+
const page = await loadPage(id, expectedVersion);
|
|
138
|
+
const before = snapshotOf(page);
|
|
139
|
+
await context.authorize('pages', 'update', before);
|
|
140
|
+
return { page, before };
|
|
141
|
+
};
|
|
142
|
+
export const AddBlock = command('blocks.add', {
|
|
143
|
+
description: 'Adds a block to a page',
|
|
144
|
+
subject: 'pages',
|
|
145
|
+
input: {
|
|
146
|
+
...VERSIONED,
|
|
147
|
+
type: string().min(1),
|
|
148
|
+
props: json().optional(),
|
|
149
|
+
parentId: uuid().optional(),
|
|
150
|
+
index: number().integer().optional(),
|
|
151
|
+
},
|
|
152
|
+
output: { id: uuid(), version: number(), tree: blockTree(), blockId: uuid().optional() },
|
|
153
|
+
handle: async (values, context) => {
|
|
154
|
+
const { page, before } = await openForEdit(values.id, values.expectedVersion, context);
|
|
155
|
+
const added = addBlock(page.draftTree, {
|
|
156
|
+
type: values.type,
|
|
157
|
+
...(values.props === undefined ? {} : { props: values.props }),
|
|
158
|
+
...(values.parentId === undefined ? {} : { parentId: values.parentId }),
|
|
159
|
+
...(values.index === undefined ? {} : { index: values.index }),
|
|
160
|
+
});
|
|
161
|
+
return commitTree(page, before, added.tree, context, added.id);
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
export const UpdateBlock = command('blocks.update', {
|
|
165
|
+
description: 'Changes the props of a block',
|
|
166
|
+
subject: 'pages',
|
|
167
|
+
input: { ...VERSIONED, blockId: uuid(), props: json() },
|
|
168
|
+
output: { id: uuid(), version: number(), tree: blockTree() },
|
|
169
|
+
handle: async (values, context) => {
|
|
170
|
+
const { page, before } = await openForEdit(values.id, values.expectedVersion, context);
|
|
171
|
+
return commitTree(page, before, updateBlockProps(page.draftTree, values.blockId, values.props), context);
|
|
172
|
+
},
|
|
173
|
+
});
|
|
174
|
+
export const DesignBlock = command('blocks.design', {
|
|
175
|
+
description: 'Sets the universal design controls of a block (SPEC.md §61)',
|
|
176
|
+
subject: 'pages',
|
|
177
|
+
input: {
|
|
178
|
+
...VERSIONED,
|
|
179
|
+
blockId: uuid(),
|
|
180
|
+
/** Merged into what is there. A control set to `null` goes back to the theme. */
|
|
181
|
+
design: blockDesignPatch(),
|
|
182
|
+
},
|
|
183
|
+
output: { id: uuid(), version: number(), tree: blockTree() },
|
|
184
|
+
handle: async (values, context) => {
|
|
185
|
+
const { page, before } = await openForEdit(values.id, values.expectedVersion, context);
|
|
186
|
+
return commitTree(page, before, setBlockDesign(page.draftTree, values.blockId, values.design), context);
|
|
187
|
+
},
|
|
188
|
+
});
|
|
189
|
+
export const MoveBlock = command('blocks.move', {
|
|
190
|
+
description: 'Moves a block, possibly into another one',
|
|
191
|
+
subject: 'pages',
|
|
192
|
+
input: {
|
|
193
|
+
...VERSIONED,
|
|
194
|
+
blockId: uuid(),
|
|
195
|
+
parentId: uuid().optional(),
|
|
196
|
+
index: number().integer().optional(),
|
|
197
|
+
},
|
|
198
|
+
output: { id: uuid(), version: number(), tree: blockTree() },
|
|
199
|
+
handle: async (values, context) => {
|
|
200
|
+
const { page, before } = await openForEdit(values.id, values.expectedVersion, context);
|
|
201
|
+
const moved = moveBlock(page.draftTree, values.blockId, {
|
|
202
|
+
...(values.parentId === undefined ? {} : { parentId: values.parentId }),
|
|
203
|
+
...(values.index === undefined ? {} : { index: values.index }),
|
|
204
|
+
});
|
|
205
|
+
return commitTree(page, before, moved, context);
|
|
206
|
+
},
|
|
207
|
+
});
|
|
208
|
+
export const RemoveBlock = command('blocks.remove', {
|
|
209
|
+
description: 'Removes a block and everything inside it',
|
|
210
|
+
subject: 'pages',
|
|
211
|
+
input: { ...VERSIONED, blockId: uuid() },
|
|
212
|
+
output: { id: uuid(), version: number(), tree: blockTree() },
|
|
213
|
+
handle: async (values, context) => {
|
|
214
|
+
const { page, before } = await openForEdit(values.id, values.expectedVersion, context);
|
|
215
|
+
return commitTree(page, before, removeBlock(page.draftTree, values.blockId), context);
|
|
216
|
+
},
|
|
217
|
+
});
|
|
218
|
+
export const DuplicateBlock = command('blocks.duplicate', {
|
|
219
|
+
description: 'Copies a block beside itself, with new ids throughout',
|
|
220
|
+
subject: 'pages',
|
|
221
|
+
input: { ...VERSIONED, blockId: uuid() },
|
|
222
|
+
output: { id: uuid(), version: number(), tree: blockTree(), blockId: uuid().optional() },
|
|
223
|
+
handle: async (values, context) => {
|
|
224
|
+
const { page, before } = await openForEdit(values.id, values.expectedVersion, context);
|
|
225
|
+
const copied = duplicateBlock(page.draftTree, values.blockId);
|
|
226
|
+
return commitTree(page, before, copied.tree, context, copied.id);
|
|
227
|
+
},
|
|
228
|
+
});
|
|
229
|
+
export const HideBlock = command('blocks.hide', {
|
|
230
|
+
description: 'Keeps a block in the tree and out of the rendered page',
|
|
231
|
+
subject: 'pages',
|
|
232
|
+
input: { ...VERSIONED, blockId: uuid(), hidden: boolean() },
|
|
233
|
+
output: { id: uuid(), version: number(), tree: blockTree() },
|
|
234
|
+
handle: async (values, context) => {
|
|
235
|
+
const { page, before } = await openForEdit(values.id, values.expectedVersion, context);
|
|
236
|
+
return commitTree(page, before, setBlockHidden(page.draftTree, values.blockId, values.hidden), context);
|
|
237
|
+
},
|
|
238
|
+
});
|
|
239
|
+
export const UnpublishPage = command('pages.unpublish', {
|
|
240
|
+
description: 'Takes a page off the site without touching its draft',
|
|
241
|
+
input: VERSIONED,
|
|
242
|
+
output: { id: uuid(), version: number() },
|
|
243
|
+
handle: async ({ id, expectedVersion }, context) => {
|
|
244
|
+
const page = await loadPage(id, expectedVersion);
|
|
245
|
+
const before = snapshotOf(page);
|
|
246
|
+
await context.authorize('pages', 'unpublish', before);
|
|
247
|
+
await page.update({
|
|
248
|
+
status: 'draft',
|
|
249
|
+
publishedTree: null,
|
|
250
|
+
publishedAt: null,
|
|
251
|
+
version: page.version + 1,
|
|
252
|
+
updatedBy: context.actor?.id ?? null,
|
|
253
|
+
});
|
|
254
|
+
context.revise({ entityType: 'pages', entityId: id, before, after: snapshotOf(page) });
|
|
255
|
+
context.emit('page.updated', { pageId: id });
|
|
256
|
+
return { id, version: page.version };
|
|
257
|
+
},
|
|
258
|
+
});
|
|
259
|
+
export const ArchivePage = command('pages.archive', {
|
|
260
|
+
description: 'Files a page away: off the site, out of the list, still restorable',
|
|
261
|
+
input: VERSIONED,
|
|
262
|
+
output: { id: uuid(), version: number() },
|
|
263
|
+
handle: async ({ id, expectedVersion }, context) => {
|
|
264
|
+
const page = await loadPage(id, expectedVersion);
|
|
265
|
+
const before = snapshotOf(page);
|
|
266
|
+
await context.authorize('pages', 'archive', before);
|
|
267
|
+
await page.update({
|
|
268
|
+
status: 'archived',
|
|
269
|
+
publishedTree: null,
|
|
270
|
+
publishedAt: null,
|
|
271
|
+
version: page.version + 1,
|
|
272
|
+
updatedBy: context.actor?.id ?? null,
|
|
273
|
+
});
|
|
274
|
+
context.revise({ entityType: 'pages', entityId: id, before, after: snapshotOf(page) });
|
|
275
|
+
context.emit('page.updated', { pageId: id });
|
|
276
|
+
return { id, version: page.version };
|
|
277
|
+
},
|
|
278
|
+
});
|
|
279
|
+
export const DeletePage = command('pages.delete', {
|
|
280
|
+
description: 'Deletes a page. Its revisions outlive it',
|
|
281
|
+
input: VERSIONED,
|
|
282
|
+
output: { id: uuid() },
|
|
283
|
+
handle: async ({ id, expectedVersion }, context) => {
|
|
284
|
+
const page = await loadPage(id, expectedVersion);
|
|
285
|
+
const before = snapshotOf(page);
|
|
286
|
+
await context.authorize('pages', 'delete', before);
|
|
287
|
+
await page.delete();
|
|
288
|
+
context.revise({ entityType: 'pages', entityId: id, before, after: null });
|
|
289
|
+
context.emit('page.updated', { pageId: id });
|
|
290
|
+
return { id };
|
|
291
|
+
},
|
|
292
|
+
});
|
|
293
|
+
export const TranslatePage = command('pages.translate', {
|
|
294
|
+
description: 'Writes a page in another language, starting from a copy of this one',
|
|
295
|
+
input: {
|
|
296
|
+
id: uuid(),
|
|
297
|
+
locale: string().min(1),
|
|
298
|
+
/** Its own address, where the translation wants one. Defaults to the original's. */
|
|
299
|
+
slug: string().min(1).optional(),
|
|
300
|
+
title: string().min(1).optional(),
|
|
301
|
+
},
|
|
302
|
+
output: { id: uuid(), slug: string(), locale: string(), version: number() },
|
|
303
|
+
handle: async ({ id, locale, slug, title }, context) => {
|
|
304
|
+
const served = currentContext()?.locales;
|
|
305
|
+
if (!isLocale(served, locale)) {
|
|
306
|
+
throw new AssemoraError('UNKNOWN_LOCALE', `"${locale}" is not a language this deployment serves${served === undefined ? '' : ` (${served.locales.join(', ')})`}.`, { status: 400 });
|
|
307
|
+
}
|
|
308
|
+
const source = await loadPage(id);
|
|
309
|
+
await context.authorize('pages', 'update', snapshotOf(source));
|
|
310
|
+
if (source.locale === locale) {
|
|
311
|
+
throw new AssemoraError('ALREADY_IN_LOCALE', `This page is already written in "${locale}".`, {
|
|
312
|
+
status: 409,
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* A translation of a translation belongs to the original, or the fallback — which
|
|
317
|
+
* groups by `translationOf` — would see two pages where the site has one.
|
|
318
|
+
*/
|
|
319
|
+
const original = source.translationOf ?? id;
|
|
320
|
+
const already = await Page.allLocales()
|
|
321
|
+
.where('translationOf', original)
|
|
322
|
+
.where('locale', locale)
|
|
323
|
+
.first();
|
|
324
|
+
if (already !== null) {
|
|
325
|
+
throw new AssemoraError('TRANSLATION_EXISTS', `This page is already translated into "${locale}". Edit that translation instead: ${already.id}.`, { status: 409 });
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* The draft tree, copied — and no published one.
|
|
329
|
+
*
|
|
330
|
+
* A translator edits the original's blocks in place, which is the only way a page of
|
|
331
|
+
* text gets translated at all. It starts unpublished on purpose: a translation that
|
|
332
|
+
* went live the moment it was made would put the *original's* words under the new
|
|
333
|
+
* language's address, and say they were a translation. Until it is published,
|
|
334
|
+
* `pages.get` answers a visitor with the original, which is the truth.
|
|
335
|
+
*/
|
|
336
|
+
const made = await Page.create({
|
|
337
|
+
slug: slug ?? source.slug,
|
|
338
|
+
title: title ?? source.title,
|
|
339
|
+
status: 'draft',
|
|
340
|
+
draftTree: source.draftTree,
|
|
341
|
+
publishedTree: null,
|
|
342
|
+
meta: source.meta,
|
|
343
|
+
version: 1,
|
|
344
|
+
locale,
|
|
345
|
+
translationOf: original,
|
|
346
|
+
createdBy: context.actor?.id ?? null,
|
|
347
|
+
updatedBy: context.actor?.id ?? null,
|
|
348
|
+
publishedAt: null,
|
|
349
|
+
});
|
|
350
|
+
// Its own history, because a translation is a row (SPEC.md §64, §131).
|
|
351
|
+
context.revise({
|
|
352
|
+
entityType: 'pages',
|
|
353
|
+
entityId: made.id,
|
|
354
|
+
before: null,
|
|
355
|
+
after: snapshotOf(made),
|
|
356
|
+
});
|
|
357
|
+
context.emit('page.translated', { pageId: made.id, translationOf: original, locale });
|
|
358
|
+
return { id: made.id, slug: made.slug, locale, version: made.version };
|
|
359
|
+
},
|
|
360
|
+
});
|
|
361
|
+
export const pageCommands = [
|
|
362
|
+
CreatePage,
|
|
363
|
+
UpdatePage,
|
|
364
|
+
PublishPage,
|
|
365
|
+
UnpublishPage,
|
|
366
|
+
ArchivePage,
|
|
367
|
+
DeletePage,
|
|
368
|
+
AddBlock,
|
|
369
|
+
UpdateBlock,
|
|
370
|
+
MoveBlock,
|
|
371
|
+
RemoveBlock,
|
|
372
|
+
DuplicateBlock,
|
|
373
|
+
HideBlock,
|
|
374
|
+
DesignBlock,
|
|
375
|
+
TranslatePage,
|
|
376
|
+
];
|
|
377
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@assemora/pages` — pages as trees of blocks.
|
|
3
|
+
*
|
|
4
|
+
* A page is never stored as HTML (SPEC.md §125.14). It is a tree with stable block
|
|
5
|
+
* ids, edited only through commands, so every builder operation Studio offers is one
|
|
6
|
+
* an agent can perform identically (SPEC.md §60).
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* export const Hero = block('hero', {
|
|
10
|
+
* title: text().required(),
|
|
11
|
+
* subtitle: text(),
|
|
12
|
+
* variant: select('centered', 'split'),
|
|
13
|
+
* })
|
|
14
|
+
*
|
|
15
|
+
* export default pages({ blocks: [Hero] })
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* The block tree types themselves live in `@assemora/schema`, so a renderer can draw
|
|
19
|
+
* a page without the server layer coming with it.
|
|
20
|
+
*/
|
|
21
|
+
export { type Block, type BlockDescriptor, type BlockOptions, block, blockFor, clearBlockRegistry, describeBlock, hasBlock, type PropsMode, registerBlock, registeredBlocks, validateProps, } from './block.js';
|
|
22
|
+
export { AddBlock, ArchivePage, CreatePage, DeletePage, DesignBlock, DuplicateBlock, HideBlock, MoveBlock, PublishPage, pageCommands, RemoveBlock, UnpublishPage, UpdateBlock, UpdatePage, } from './commands.js';
|
|
23
|
+
export { Page, type PageMeta, pageModels } from './models.js';
|
|
24
|
+
export { defineBlockFacet, type PagesModuleOptions, pages } from './module.js';
|
|
25
|
+
export { GetPage, ListPages, type PageMode, pageQueries } from './queries.js';
|
|
26
|
+
export { type AddBlock as AddBlockRequest, addBlock, duplicateBlock, moveBlock, type Placement, parentOf, removeBlock, setBlockDesign, setBlockHidden, unfinishedBlocks, updateBlockProps, } from './tree.js';
|
|
27
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EACL,KAAK,KAAK,EACV,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,EACL,QAAQ,EACR,kBAAkB,EAClB,aAAa,EACb,QAAQ,EACR,KAAK,SAAS,EACd,aAAa,EACb,gBAAgB,EAChB,aAAa,GACd,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,QAAQ,EACR,WAAW,EACX,UAAU,EACV,UAAU,EACV,WAAW,EACX,cAAc,EACd,SAAS,EACT,SAAS,EACT,WAAW,EACX,YAAY,EACZ,WAAW,EACX,aAAa,EACb,WAAW,EACX,UAAU,GACX,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,IAAI,EAAE,KAAK,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7D,OAAO,EAAE,gBAAgB,EAAE,KAAK,kBAAkB,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAC9E,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC7E,OAAO,EACL,KAAK,QAAQ,IAAI,eAAe,EAChC,QAAQ,EACR,cAAc,EACd,SAAS,EACT,KAAK,SAAS,EACd,QAAQ,EACR,WAAW,EACX,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,WAAW,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@assemora/pages` — pages as trees of blocks.
|
|
3
|
+
*
|
|
4
|
+
* A page is never stored as HTML (SPEC.md §125.14). It is a tree with stable block
|
|
5
|
+
* ids, edited only through commands, so every builder operation Studio offers is one
|
|
6
|
+
* an agent can perform identically (SPEC.md §60).
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* export const Hero = block('hero', {
|
|
10
|
+
* title: text().required(),
|
|
11
|
+
* subtitle: text(),
|
|
12
|
+
* variant: select('centered', 'split'),
|
|
13
|
+
* })
|
|
14
|
+
*
|
|
15
|
+
* export default pages({ blocks: [Hero] })
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* The block tree types themselves live in `@assemora/schema`, so a renderer can draw
|
|
19
|
+
* a page without the server layer coming with it.
|
|
20
|
+
*/
|
|
21
|
+
export { block, blockFor, clearBlockRegistry, describeBlock, hasBlock, registerBlock, registeredBlocks, validateProps, } from './block.js';
|
|
22
|
+
export { AddBlock, ArchivePage, CreatePage, DeletePage, DesignBlock, DuplicateBlock, HideBlock, MoveBlock, PublishPage, pageCommands, RemoveBlock, UnpublishPage, UpdateBlock, UpdatePage, } from './commands.js';
|
|
23
|
+
export { Page, pageModels } from './models.js';
|
|
24
|
+
export { defineBlockFacet, pages } from './module.js';
|
|
25
|
+
export { GetPage, ListPages, pageQueries } from './queries.js';
|
|
26
|
+
export { addBlock, duplicateBlock, moveBlock, parentOf, removeBlock, setBlockDesign, setBlockHidden, unfinishedBlocks, updateBlockProps, } from './tree.js';
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAIL,KAAK,EACL,QAAQ,EACR,kBAAkB,EAClB,aAAa,EACb,QAAQ,EAER,aAAa,EACb,gBAAgB,EAChB,aAAa,GACd,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,QAAQ,EACR,WAAW,EACX,UAAU,EACV,UAAU,EACV,WAAW,EACX,cAAc,EACd,SAAS,EACT,SAAS,EACT,WAAW,EACX,YAAY,EACZ,WAAW,EACX,aAAa,EACb,WAAW,EACX,UAAU,GACX,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,IAAI,EAAiB,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7D,OAAO,EAAE,gBAAgB,EAA2B,KAAK,EAAE,MAAM,aAAa,CAAA;AAC9E,OAAO,EAAE,OAAO,EAAE,SAAS,EAAiB,WAAW,EAAE,MAAM,cAAc,CAAA;AAC7E,OAAO,EAEL,QAAQ,EACR,cAAc,EACd,SAAS,EAET,QAAQ,EACR,WAAW,EACX,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,WAAW,CAAA"}
|
package/dist/models.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { BlockTree } from '@assemora/schema';
|
|
2
|
+
export type PageMeta = {
|
|
3
|
+
readonly title?: string;
|
|
4
|
+
readonly description?: string;
|
|
5
|
+
readonly image?: string;
|
|
6
|
+
readonly noIndex?: boolean;
|
|
7
|
+
};
|
|
8
|
+
export declare const Page: import("@assemora/data").Model<{
|
|
9
|
+
id: import("@assemora/data").UuidColumnBuilder;
|
|
10
|
+
slug: import("@assemora/data").ColumnBuilder<string>;
|
|
11
|
+
title: import("@assemora/data").ColumnBuilder<string>;
|
|
12
|
+
status: import("@assemora/data").ColumnBuilder<"archived" | "draft" | "published">;
|
|
13
|
+
draftTree: import("@assemora/data").JsonColumnBuilder<BlockTree>;
|
|
14
|
+
publishedTree: import("@assemora/data").JsonColumnBuilder<BlockTree | null>;
|
|
15
|
+
meta: import("@assemora/data").JsonColumnBuilder<PageMeta>;
|
|
16
|
+
/** Bumped on every write; a mutation may state which one it expected (SPEC.md §66). */
|
|
17
|
+
version: import("@assemora/data").ColumnBuilder<number>;
|
|
18
|
+
createdBy: import("@assemora/data").ColumnBuilder<string | null>;
|
|
19
|
+
updatedBy: import("@assemora/data").ColumnBuilder<string | null>;
|
|
20
|
+
publishedAt: import("@assemora/data").ColumnBuilder<Date | null>;
|
|
21
|
+
createdAt: import("@assemora/data").TimestampColumnBuilder;
|
|
22
|
+
updatedAt: import("@assemora/data").TimestampColumnBuilder;
|
|
23
|
+
} & {
|
|
24
|
+
readonly locale: import("@assemora/data").ColumnBuilder<string>;
|
|
25
|
+
readonly translationOf: import("@assemora/data").ColumnBuilder<string | null>;
|
|
26
|
+
}, never, Readonly<Record<never, never>>>;
|
|
27
|
+
export declare const pageModels: readonly [import("@assemora/data").Model<{
|
|
28
|
+
id: import("@assemora/data").UuidColumnBuilder;
|
|
29
|
+
slug: import("@assemora/data").ColumnBuilder<string>;
|
|
30
|
+
title: import("@assemora/data").ColumnBuilder<string>;
|
|
31
|
+
status: import("@assemora/data").ColumnBuilder<"archived" | "draft" | "published">;
|
|
32
|
+
draftTree: import("@assemora/data").JsonColumnBuilder<BlockTree>;
|
|
33
|
+
publishedTree: import("@assemora/data").JsonColumnBuilder<BlockTree | null>;
|
|
34
|
+
meta: import("@assemora/data").JsonColumnBuilder<PageMeta>;
|
|
35
|
+
/** Bumped on every write; a mutation may state which one it expected (SPEC.md §66). */
|
|
36
|
+
version: import("@assemora/data").ColumnBuilder<number>;
|
|
37
|
+
createdBy: import("@assemora/data").ColumnBuilder<string | null>;
|
|
38
|
+
updatedBy: import("@assemora/data").ColumnBuilder<string | null>;
|
|
39
|
+
publishedAt: import("@assemora/data").ColumnBuilder<Date | null>;
|
|
40
|
+
createdAt: import("@assemora/data").TimestampColumnBuilder;
|
|
41
|
+
updatedAt: import("@assemora/data").TimestampColumnBuilder;
|
|
42
|
+
} & {
|
|
43
|
+
readonly locale: import("@assemora/data").ColumnBuilder<string>;
|
|
44
|
+
readonly translationOf: import("@assemora/data").ColumnBuilder<string | null>;
|
|
45
|
+
}, never, Readonly<Record<never, never>>>];
|
|
46
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEjD,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAC3B,CAAA;AAED,eAAO,MAAM,IAAI;;;;;;;;IAQf,uFAAuF;;;;;;;;;;yCAOxE,CAAA;AAEjB,eAAO,MAAM,UAAU;;;;;;;;IATrB,uFAAuF;;;;;;;;;;0CAShD,CAAA"}
|
package/dist/models.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a page lives (SPEC.md §53).
|
|
3
|
+
*
|
|
4
|
+
* Draft and published trees are stored side by side, so what a visitor sees does not
|
|
5
|
+
* change while an editor is still working. Neither is ever HTML: both are block trees
|
|
6
|
+
* (SPEC.md §54, §125.14).
|
|
7
|
+
*
|
|
8
|
+
* Translatable, which is §131's own words for a page: *"a slug and a block tree per
|
|
9
|
+
* locale"*. Both fall out of one row per language — `slug` becomes unique within a
|
|
10
|
+
* language rather than globally, so `/uk/about` and `/ru/about` are two pages, and each
|
|
11
|
+
* carries its own trees, its own status, its own version and its own history.
|
|
12
|
+
*/
|
|
13
|
+
import { enumOf, integer, json, model, string, timestamp, uuid } from '@assemora/data';
|
|
14
|
+
export const Page = model('assemora_pages', {
|
|
15
|
+
id: uuid().primary().defaultRandom(),
|
|
16
|
+
slug: string().unique(),
|
|
17
|
+
title: string(),
|
|
18
|
+
status: enumOf('draft', 'published', 'archived').default('draft'),
|
|
19
|
+
draftTree: json(),
|
|
20
|
+
publishedTree: json().nullable(),
|
|
21
|
+
meta: json(),
|
|
22
|
+
/** Bumped on every write; a mutation may state which one it expected (SPEC.md §66). */
|
|
23
|
+
version: integer().default(1),
|
|
24
|
+
createdBy: uuid().nullable(),
|
|
25
|
+
updatedBy: uuid().nullable(),
|
|
26
|
+
publishedAt: timestamp().nullable(),
|
|
27
|
+
createdAt: timestamp().created(),
|
|
28
|
+
updatedAt: timestamp().updated(),
|
|
29
|
+
}).translatable();
|
|
30
|
+
export const pageModels = [Page];
|
|
31
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAA;AAUtF,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,CAAC,gBAAgB,EAAE;IAC1C,EAAE,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,aAAa,EAAE;IACpC,IAAI,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE;IACvB,KAAK,EAAE,MAAM,EAAE;IACf,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACjE,SAAS,EAAE,IAAI,EAAa;IAC5B,aAAa,EAAE,IAAI,EAAa,CAAC,QAAQ,EAAE;IAC3C,IAAI,EAAE,IAAI,EAAY;IACtB,uFAAuF;IACvF,OAAO,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7B,SAAS,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE;IAC5B,SAAS,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE;IAC5B,WAAW,EAAE,SAAS,EAAE,CAAC,QAAQ,EAAE;IACnC,SAAS,EAAE,SAAS,EAAE,CAAC,OAAO,EAAE;IAChC,SAAS,EAAE,SAAS,EAAE,CAAC,OAAO,EAAE;CACjC,CAAC,CAAC,YAAY,EAAE,CAAA;AAEjB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAI,CAAU,CAAA"}
|
package/dist/module.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `.blocks()` facet and the `pages()` module (SPEC.md §13, §114).
|
|
3
|
+
*/
|
|
4
|
+
import { type ModuleBuilder } from '@assemora/core';
|
|
5
|
+
import { type Block } from './block.js';
|
|
6
|
+
declare module '@assemora/core' {
|
|
7
|
+
interface ModuleBuilder {
|
|
8
|
+
/** Registers block types, which is what makes them usable in a page (SPEC.md §55). */
|
|
9
|
+
blocks(...blocks: Block[]): ModuleBuilder;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export declare const defineBlockFacet: () => void;
|
|
13
|
+
export type PagesModuleOptions = {
|
|
14
|
+
/** The block types this application offers (SPEC.md §55). */
|
|
15
|
+
readonly blocks?: readonly Block[];
|
|
16
|
+
};
|
|
17
|
+
export declare const pages: (options?: PagesModuleOptions) => ModuleBuilder;
|
|
18
|
+
//# sourceMappingURL=module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAqB,KAAK,aAAa,EAA4B,MAAM,gBAAgB,CAAA;AAMhG,OAAO,EAAE,KAAK,KAAK,EAAgC,MAAM,YAAY,CAAA;AAKrE,OAAO,QAAQ,gBAAgB,CAAC;IAC9B,UAAU,aAAa;QACrB,sFAAsF;QACtF,MAAM,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,GAAG,aAAa,CAAA;KAC1C;CACF;AAID,eAAO,MAAM,gBAAgB,QAAO,IAiBnC,CAAA;AAID,MAAM,MAAM,kBAAkB,GAAG;IAC/B,6DAA6D;IAC7D,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,KAAK,EAAE,CAAA;CACnC,CAAA;AAED,eAAO,MAAM,KAAK,aAAa,kBAAkB,KAAQ,aAyDnD,CAAA"}
|