@batterai/strapi-plugin-canvas 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.
Files changed (152) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/LICENSE +16 -0
  3. package/README.md +131 -0
  4. package/dist/admin/appearance.d.ts +12 -0
  5. package/dist/admin/appearance.d.ts.map +1 -0
  6. package/dist/admin/appearance.js +44 -0
  7. package/dist/admin/appearance.js.map +1 -0
  8. package/dist/admin/block-packages.d.ts +4 -0
  9. package/dist/admin/block-packages.d.ts.map +1 -0
  10. package/dist/admin/block-packages.js +14 -0
  11. package/dist/admin/block-packages.js.map +1 -0
  12. package/dist/admin/client/content-model.d.ts +3 -0
  13. package/dist/admin/client/content-model.d.ts.map +1 -0
  14. package/dist/admin/client/content-model.js +76 -0
  15. package/dist/admin/client/content-model.js.map +1 -0
  16. package/dist/admin/client/host-services.d.ts +4 -0
  17. package/dist/admin/client/host-services.d.ts.map +1 -0
  18. package/dist/admin/client/host-services.js +141 -0
  19. package/dist/admin/client/host-services.js.map +1 -0
  20. package/dist/admin/index.d.ts +37 -0
  21. package/dist/admin/index.d.ts.map +1 -0
  22. package/dist/admin/index.js +34 -0
  23. package/dist/admin/index.js.map +1 -0
  24. package/dist/admin/pages/App.d.ts +4 -0
  25. package/dist/admin/pages/App.d.ts.map +1 -0
  26. package/dist/admin/pages/App.js +50 -0
  27. package/dist/admin/pages/App.js.map +1 -0
  28. package/dist/admin/translations.d.ts +4 -0
  29. package/dist/admin/translations.d.ts.map +1 -0
  30. package/dist/admin/translations.js +16 -0
  31. package/dist/admin/translations.js.map +1 -0
  32. package/dist/constants.d.ts +14 -0
  33. package/dist/constants.d.ts.map +1 -0
  34. package/dist/constants.js +18 -0
  35. package/dist/constants.js.map +1 -0
  36. package/dist/index.d.ts +2 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +2 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/server/bootstrap.d.ts +4 -0
  41. package/dist/server/bootstrap.d.ts.map +1 -0
  42. package/dist/server/bootstrap.js +37 -0
  43. package/dist/server/bootstrap.js.map +1 -0
  44. package/dist/server/config/index.d.ts +24 -0
  45. package/dist/server/config/index.d.ts.map +1 -0
  46. package/dist/server/config/index.js +33 -0
  47. package/dist/server/config/index.js.map +1 -0
  48. package/dist/server/content-types/canvas-page/schema.d.ts +45 -0
  49. package/dist/server/content-types/canvas-page/schema.d.ts.map +1 -0
  50. package/dist/server/content-types/canvas-page/schema.js +21 -0
  51. package/dist/server/content-types/canvas-page/schema.js.map +1 -0
  52. package/dist/server/content-types/canvas-site/schema.d.ts +41 -0
  53. package/dist/server/content-types/canvas-site/schema.d.ts.map +1 -0
  54. package/dist/server/content-types/canvas-site/schema.js +20 -0
  55. package/dist/server/content-types/canvas-site/schema.js.map +1 -0
  56. package/dist/server/content-types/index.d.ts +90 -0
  57. package/dist/server/content-types/index.d.ts.map +1 -0
  58. package/dist/server/content-types/index.js +7 -0
  59. package/dist/server/content-types/index.js.map +1 -0
  60. package/dist/server/controllers/canvas.d.ts +48 -0
  61. package/dist/server/controllers/canvas.d.ts.map +1 -0
  62. package/dist/server/controllers/canvas.js +409 -0
  63. package/dist/server/controllers/canvas.js.map +1 -0
  64. package/dist/server/controllers/index.d.ts +448 -0
  65. package/dist/server/controllers/index.d.ts.map +1 -0
  66. package/dist/server/controllers/index.js +5 -0
  67. package/dist/server/controllers/index.js.map +1 -0
  68. package/dist/server/index.d.ts +645 -0
  69. package/dist/server/index.d.ts.map +1 -0
  70. package/dist/server/index.js +21 -0
  71. package/dist/server/index.js.map +1 -0
  72. package/dist/server/license.d.ts +13 -0
  73. package/dist/server/license.d.ts.map +1 -0
  74. package/dist/server/license.js +24 -0
  75. package/dist/server/license.js.map +1 -0
  76. package/dist/server/policies/is-admin-authenticated.d.ts +2 -0
  77. package/dist/server/policies/is-admin-authenticated.d.ts.map +1 -0
  78. package/dist/server/policies/is-admin-authenticated.js +4 -0
  79. package/dist/server/policies/is-admin-authenticated.js.map +1 -0
  80. package/dist/server/register.d.ts +2 -0
  81. package/dist/server/register.d.ts.map +1 -0
  82. package/dist/server/register.js +4 -0
  83. package/dist/server/register.js.map +1 -0
  84. package/dist/server/routes/admin.d.ts +18 -0
  85. package/dist/server/routes/admin.d.ts.map +1 -0
  86. package/dist/server/routes/admin.js +38 -0
  87. package/dist/server/routes/admin.js.map +1 -0
  88. package/dist/server/routes/index.d.ts +31 -0
  89. package/dist/server/routes/index.d.ts.map +1 -0
  90. package/dist/server/routes/index.js +7 -0
  91. package/dist/server/routes/index.js.map +1 -0
  92. package/dist/server/routes/public.d.ts +13 -0
  93. package/dist/server/routes/public.d.ts.map +1 -0
  94. package/dist/server/routes/public.js +7 -0
  95. package/dist/server/routes/public.js.map +1 -0
  96. package/dist/server/services/collaboration-service.d.ts +24 -0
  97. package/dist/server/services/collaboration-service.d.ts.map +1 -0
  98. package/dist/server/services/collaboration-service.js +164 -0
  99. package/dist/server/services/collaboration-service.js.map +1 -0
  100. package/dist/server/services/document-command-service.d.ts +34 -0
  101. package/dist/server/services/document-command-service.d.ts.map +1 -0
  102. package/dist/server/services/document-command-service.js +418 -0
  103. package/dist/server/services/document-command-service.js.map +1 -0
  104. package/dist/server/services/document-service.d.ts +14 -0
  105. package/dist/server/services/document-service.d.ts.map +1 -0
  106. package/dist/server/services/document-service.js +144 -0
  107. package/dist/server/services/document-service.js.map +1 -0
  108. package/dist/server/services/index.d.ts +68 -0
  109. package/dist/server/services/index.d.ts.map +1 -0
  110. package/dist/server/services/index.js +28 -0
  111. package/dist/server/services/index.js.map +1 -0
  112. package/dist/server/services/page-doc-store.d.ts +59 -0
  113. package/dist/server/services/page-doc-store.d.ts.map +1 -0
  114. package/dist/server/services/page-doc-store.js +285 -0
  115. package/dist/server/services/page-doc-store.js.map +1 -0
  116. package/dist/server/services/site-store.d.ts +43 -0
  117. package/dist/server/services/site-store.d.ts.map +1 -0
  118. package/dist/server/services/site-store.js +212 -0
  119. package/dist/server/services/site-store.js.map +1 -0
  120. package/dist/server-cjs/index.js +17381 -0
  121. package/dist/server-cjs/package.json +3 -0
  122. package/package.json +77 -0
  123. package/src/admin/appearance.ts +56 -0
  124. package/src/admin/block-packages.ts +16 -0
  125. package/src/admin/client/content-model.ts +88 -0
  126. package/src/admin/client/host-services.ts +172 -0
  127. package/src/admin/index.tsx +56 -0
  128. package/src/admin/pages/App.tsx +56 -0
  129. package/src/admin/strapi-admin.d.ts +1 -0
  130. package/src/admin/translations.ts +23 -0
  131. package/src/constants.ts +21 -0
  132. package/src/index.ts +11 -0
  133. package/src/server/bootstrap.ts +45 -0
  134. package/src/server/config/index.ts +46 -0
  135. package/src/server/content-types/canvas-page/schema.ts +20 -0
  136. package/src/server/content-types/canvas-site/schema.ts +19 -0
  137. package/src/server/content-types/index.ts +7 -0
  138. package/src/server/controllers/canvas.ts +468 -0
  139. package/src/server/controllers/index.ts +5 -0
  140. package/src/server/index.ts +21 -0
  141. package/src/server/license.ts +42 -0
  142. package/src/server/policies/is-admin-authenticated.ts +3 -0
  143. package/src/server/register.ts +3 -0
  144. package/src/server/routes/admin.ts +40 -0
  145. package/src/server/routes/index.ts +7 -0
  146. package/src/server/routes/public.ts +6 -0
  147. package/src/server/services/collaboration-service.ts +180 -0
  148. package/src/server/services/document-command-service.ts +495 -0
  149. package/src/server/services/document-service.ts +162 -0
  150. package/src/server/services/index.ts +41 -0
  151. package/src/server/services/page-doc-store.ts +348 -0
  152. package/src/server/services/site-store.ts +243 -0
@@ -0,0 +1,418 @@
1
+ import { applyCanvasChangeSet, hostConcurrencyToken, parseCanvasDocument, parseCanvasPage, } from "@batterai/contract";
2
+ import { CANVAS_PAGE_PREFIX, canvasPageKey } from "../../constants.js";
3
+ import { CanvasPageConflict, createPageDocStore, createStrapiPageDocRepository, } from "./page-doc-store.js";
4
+ import { CanvasSiteConflict, createSiteStore, defaultHomePage, } from "./site-store.js";
5
+ const CONCURRENCY_PREFIX = "strapi:canvas:v1:";
6
+ class CanvasDocumentCommandValidationError extends Error {
7
+ issues;
8
+ constructor(issues) {
9
+ super(issues.map((issue) => issue.message).join(" "));
10
+ this.issues = issues;
11
+ this.name = "CanvasDocumentCommandValidationError";
12
+ }
13
+ }
14
+ export function strapiCanvasConcurrency(revision) {
15
+ return hostConcurrencyToken(`${CONCURRENCY_PREFIX}${revision}`);
16
+ }
17
+ export function createDocumentCommandService(strapi, options = {}) {
18
+ const now = options.now ?? (() => new Date());
19
+ const config = strapi.config.get("plugin::canvas") ?? {};
20
+ async function productionTransaction(work) {
21
+ return strapi.db.transaction(async ({ trx }) => work({
22
+ pageStore: createPageDocStore(createStrapiPageDocRepository(strapi, trx)),
23
+ siteStore: createSiteStore(strapi, config.seedLibrary, trx),
24
+ }));
25
+ }
26
+ const runTransaction = options.runTransaction ?? productionTransaction;
27
+ return {
28
+ async saveDocument(request) {
29
+ let expectedRevision;
30
+ try {
31
+ const body = record(request, "$", "Document command request must be an object.");
32
+ expectedRevision = parseExpectedRevision(body.expected);
33
+ const changes = parseChangeSet(body.changes);
34
+ const receipt = await runTransaction(async ({ pageStore, siteStore }) => {
35
+ const site = await siteStore.readOrCreate();
36
+ assertAggregateRevision(site, expectedRevision);
37
+ const rows = canvasPageRows(await pageStore.list());
38
+ const current = validateDocument(draftDocument(site, rows));
39
+ const next = validateDocument(normalizeDocumentOrder(applyCanvasChangeSet(current, changes)));
40
+ const operations = pageOperations(rows, current, next);
41
+ const nextSite = await siteStore.updateIfVersion(expectedRevision, (stored) => ({
42
+ ...stored,
43
+ docVersion: expectedRevision + 1,
44
+ pageOrder: next.pages.map((page) => page.id),
45
+ canvas: {
46
+ theme: next.theme,
47
+ assets: next.assets,
48
+ variables: next.variables,
49
+ layout: next.layout,
50
+ },
51
+ }));
52
+ for (const operation of operations) {
53
+ if (operation.kind === "remove") {
54
+ await pageStore.remove(operation.pageKey, operation.expectedDocVersion);
55
+ }
56
+ else {
57
+ await pageStore.save(operation.pageKey, operation.page, operation.expectedDocVersion);
58
+ }
59
+ }
60
+ const nextRows = canvasPageRows(await pageStore.list());
61
+ return {
62
+ concurrency: strapiCanvasConcurrency(nextSite.docVersion),
63
+ state: { pages: hostPageStates(nextRows, next.pages) },
64
+ };
65
+ });
66
+ return { ok: true, value: receipt };
67
+ }
68
+ catch (error) {
69
+ return commandError(error, expectedRevision);
70
+ }
71
+ },
72
+ async publishDocument(request) {
73
+ let expectedRevision;
74
+ try {
75
+ const body = record(request, "$", "Publish command request must be an object.");
76
+ expectedRevision = parseExpectedRevision(body.expected);
77
+ const receipt = await runTransaction(async ({ pageStore, siteStore }) => {
78
+ const site = await siteStore.readOrCreate();
79
+ assertAggregateRevision(site, expectedRevision);
80
+ const initialRows = canvasPageRows(await pageStore.list());
81
+ const stagedRows = initialRows.filter((row) => Boolean(row.document.staged));
82
+ if (stagedRows.length === 0) {
83
+ throw new CanvasDocumentCommandValidationError([
84
+ { path: "$.pages", message: "Stage at least one page before publishing a release." },
85
+ ]);
86
+ }
87
+ const publishedAt = now();
88
+ for (const row of [...stagedRows].sort((left, right) => left.pageKey.localeCompare(right.pageKey))) {
89
+ await pageStore.publishStaged(row.pageKey, row.docVersion, publishedAt);
90
+ }
91
+ const nextRows = canvasPageRows(await pageStore.list());
92
+ const document = validateDocument(publishedDocument(site, nextRows));
93
+ const nextSite = await siteStore.updateIfVersion(expectedRevision, (stored) => ({
94
+ ...stored,
95
+ docVersion: expectedRevision + 1,
96
+ published: {
97
+ document,
98
+ content: structuredClone(stored.content),
99
+ library: structuredClone(stored.library),
100
+ publishedAt: publishedAt.toISOString(),
101
+ sourceDocVersion: expectedRevision,
102
+ },
103
+ }));
104
+ return {
105
+ concurrency: strapiCanvasConcurrency(nextSite.docVersion),
106
+ state: {
107
+ publicationLabel: "Published",
108
+ pages: hostPageStates(nextRows, draftDocument(nextSite, nextRows).pages),
109
+ },
110
+ };
111
+ });
112
+ return { ok: true, value: receipt };
113
+ }
114
+ catch (error) {
115
+ return commandError(error, expectedRevision);
116
+ }
117
+ },
118
+ async stagePage(request) {
119
+ return changePageStage(request, true);
120
+ },
121
+ async unstagePage(request) {
122
+ return changePageStage(request, false);
123
+ },
124
+ };
125
+ async function changePageStage(request, staged) {
126
+ let expectedRevision;
127
+ try {
128
+ const body = record(request, "$", "Page stage command request must be an object.");
129
+ assertKeys(body, new Set(["expected", "pageId"]), "$");
130
+ expectedRevision = parseExpectedRevision(body.expected);
131
+ if (typeof body.pageId !== "string" || !body.pageId)
132
+ validation("$.pageId", "pageId must be a non-empty string.");
133
+ const pageId = body.pageId;
134
+ const receipt = await runTransaction(async ({ pageStore, siteStore }) => {
135
+ const site = await siteStore.readOrCreate();
136
+ assertAggregateRevision(site, expectedRevision);
137
+ const rows = canvasPageRows(await pageStore.list());
138
+ let row = pageRowsById(rows).get(pageId);
139
+ if (!row) {
140
+ const virtualDraft = draftDocument(site, rows).pages.find((page) => page.id === pageId);
141
+ if (!virtualDraft) {
142
+ throw new CanvasDocumentCommandValidationError([{ path: "$.pageId", message: `Page ${pageId} does not exist.` }]);
143
+ }
144
+ row = await pageStore.save(canvasPageKey(pageId), virtualDraft, 0);
145
+ }
146
+ if (staged && !row.document.page) {
147
+ throw new CanvasDocumentCommandValidationError([{ path: "$.pageId", message: `Page ${pageId} has no draft revision.` }]);
148
+ }
149
+ const nextSite = await siteStore.updateIfVersion(expectedRevision, (stored) => ({
150
+ ...stored,
151
+ docVersion: expectedRevision + 1,
152
+ }));
153
+ if (staged)
154
+ await pageStore.stage(row.pageKey, row.docVersion);
155
+ else if (row.document.staged)
156
+ await pageStore.unstage(row.pageKey, row.docVersion);
157
+ const nextRows = canvasPageRows(await pageStore.list());
158
+ const pages = draftDocument(nextSite, nextRows).pages;
159
+ return {
160
+ concurrency: strapiCanvasConcurrency(nextSite.docVersion),
161
+ state: { pages: hostPageStates(nextRows, pages) },
162
+ };
163
+ });
164
+ return { ok: true, value: receipt };
165
+ }
166
+ catch (error) {
167
+ return commandError(error, expectedRevision);
168
+ }
169
+ }
170
+ }
171
+ function parseExpectedRevision(value) {
172
+ if (typeof value !== "string" || !value.startsWith(CONCURRENCY_PREFIX)) {
173
+ throw new CanvasDocumentCommandValidationError([
174
+ { path: "$.expected", message: "A Strapi Canvas aggregate concurrency token is required." },
175
+ ]);
176
+ }
177
+ const revision = Number(value.slice(CONCURRENCY_PREFIX.length));
178
+ if (!Number.isInteger(revision) || revision < 0 || value !== `${CONCURRENCY_PREFIX}${revision}`) {
179
+ throw new CanvasDocumentCommandValidationError([
180
+ { path: "$.expected", message: "The Strapi Canvas aggregate concurrency token is invalid." },
181
+ ]);
182
+ }
183
+ return revision;
184
+ }
185
+ function assertAggregateRevision(site, expectedRevision) {
186
+ if (site.docVersion !== expectedRevision) {
187
+ throw new CanvasSiteConflict(expectedRevision, site.docVersion);
188
+ }
189
+ }
190
+ function parseChangeSet(value) {
191
+ const candidate = record(value, "$.changes", "Canvas changes must be an object.");
192
+ if (!Array.isArray(candidate.changes) || candidate.changes.length === 0) {
193
+ throw new CanvasDocumentCommandValidationError([
194
+ { path: "$.changes.changes", message: "Canvas changes must contain at least one change." },
195
+ ]);
196
+ }
197
+ const changes = candidate.changes.map((change, index) => parseChange(change, `$.changes.changes[${index}]`));
198
+ return { changes };
199
+ }
200
+ function parseChange(value, path) {
201
+ const change = record(value, path, "Canvas change must be an object.");
202
+ const kind = change.kind;
203
+ if (kind === "upsert-page") {
204
+ assertKeys(change, new Set(["kind", "page"]), path);
205
+ return { kind, page: change.page };
206
+ }
207
+ if (kind === "remove-page") {
208
+ assertKeys(change, new Set(["kind", "pageId"]), path);
209
+ if (typeof change.pageId !== "string" || !change.pageId)
210
+ validation(path, "pageId must be a non-empty string.");
211
+ return { kind, pageId: change.pageId };
212
+ }
213
+ if (kind === "set-theme") {
214
+ assertKeys(change, new Set(["kind", "theme"]), path);
215
+ return { kind, theme: change.theme };
216
+ }
217
+ if (kind === "set-assets") {
218
+ assertKeys(change, new Set(["kind", "assets"]), path);
219
+ return { kind, assets: change.assets };
220
+ }
221
+ if (kind === "set-variable") {
222
+ assertKeys(change, new Set(["kind", "name", "value"]), path);
223
+ if (typeof change.name !== "string" || !change.name || !("value" in change)) {
224
+ validation(path, "set-variable requires a non-empty name and value.");
225
+ }
226
+ return { kind, name: change.name, value: change.value };
227
+ }
228
+ if (kind === "remove-variable") {
229
+ assertKeys(change, new Set(["kind", "name"]), path);
230
+ if (typeof change.name !== "string" || !change.name)
231
+ validation(path, "remove-variable requires a name.");
232
+ return { kind, name: change.name };
233
+ }
234
+ if (kind === "set-layout") {
235
+ assertKeys(change, new Set(["kind", "layout"]), path);
236
+ return { kind, layout: change.layout };
237
+ }
238
+ validation(`${path}.kind`, "Unsupported Canvas change kind.");
239
+ }
240
+ function draftDocument(site, rows) {
241
+ const byId = pageRowsById(rows);
242
+ if (byId.size === 0) {
243
+ const home = defaultHomePage();
244
+ byId.set(home.id, { pageKey: canvasPageKey(home.id), docVersion: 0, document: { kind: "canvas-editor-page", docVersion: 0, page: home, updatedAt: "" } });
245
+ }
246
+ const ordered = site.pageOrder.flatMap((id) => byId.get(id)?.document.page ?? []);
247
+ const orderedIds = new Set(ordered.map((page) => page.id));
248
+ const pages = [...ordered, ...[...byId.values()].map((row) => row.document.page).filter((page) => !orderedIds.has(page.id))];
249
+ return {
250
+ schemaVersion: 1,
251
+ pages,
252
+ ...site.canvas,
253
+ };
254
+ }
255
+ function publishedDocument(site, rows) {
256
+ // Start from the last public release so an unrelated release cannot
257
+ // accidentally unpublish a page whose draft was deleted. Explicit staged
258
+ // unpublish commands can remove that baseline in a future workflow slice.
259
+ const previouslyPublished = site.published?.document.pages ?? [];
260
+ const rowPublications = rows.flatMap((row) => row.document.published?.page ?? []);
261
+ const byId = new Map(previouslyPublished.map((page) => [page.id, page]));
262
+ for (const page of rowPublications)
263
+ byId.set(page.id, page);
264
+ const requestedOrder = site.pageOrder.filter((id) => byId.has(id));
265
+ const extras = [...byId.values()].filter((page) => !requestedOrder.includes(page.id));
266
+ const pages = [...requestedOrder.map((id) => byId.get(id)), ...extras];
267
+ return normalizeDocumentOrder({
268
+ schemaVersion: 1,
269
+ pages,
270
+ ...site.canvas,
271
+ layout: { ...site.canvas.layout, pageOrder: pages.map((page) => page.id) },
272
+ });
273
+ }
274
+ function normalizeDocumentOrder(document) {
275
+ const pagesById = new Map(document.pages.map((page) => [page.id, page]));
276
+ const requested = document.layout?.pageOrder ?? [];
277
+ const pageOrder = [];
278
+ for (const id of requested) {
279
+ if (pagesById.has(id) && !pageOrder.includes(id))
280
+ pageOrder.push(id);
281
+ }
282
+ for (const page of document.pages) {
283
+ if (!pageOrder.includes(page.id))
284
+ pageOrder.push(page.id);
285
+ }
286
+ return {
287
+ ...document,
288
+ pages: pageOrder.map((id) => pagesById.get(id)),
289
+ layout: { ...document.layout, pageOrder: pageOrder },
290
+ };
291
+ }
292
+ function validateDocument(document) {
293
+ const parsed = parseCanvasDocument(document);
294
+ const issues = parsed.ok ? [] : [...parsed.issues];
295
+ const paths = new Map();
296
+ for (const page of document.pages) {
297
+ if (!page.path)
298
+ continue;
299
+ const path = normalizePath(page.path);
300
+ const existing = paths.get(path);
301
+ if (existing) {
302
+ issues.push({ path: `$.pages.${page.id}.path`, message: `Route ${path} is already used by page ${existing}.` });
303
+ }
304
+ else {
305
+ paths.set(path, page.id);
306
+ }
307
+ }
308
+ if (issues.length)
309
+ throw new CanvasDocumentCommandValidationError(issues);
310
+ return parsed.ok ? parsed.document : document;
311
+ }
312
+ function pageOperations(rows, current, next) {
313
+ const rowsById = pageRowsById(rows);
314
+ const currentById = new Map(current.pages.map((page) => [page.id, page]));
315
+ const nextById = new Map(next.pages.map((page) => [page.id, page]));
316
+ const operations = [];
317
+ for (const [pageId] of currentById) {
318
+ if (nextById.has(pageId))
319
+ continue;
320
+ const row = rowsById.get(pageId);
321
+ if (row)
322
+ operations.push({ kind: "remove", pageKey: row.pageKey, expectedDocVersion: row.docVersion });
323
+ }
324
+ for (const [pageId, page] of nextById) {
325
+ const existing = currentById.get(pageId);
326
+ if (existing && JSON.stringify(existing) === JSON.stringify(page))
327
+ continue;
328
+ const row = rowsById.get(pageId);
329
+ operations.push({
330
+ kind: "upsert",
331
+ pageKey: row?.pageKey ?? canvasPageKey(pageId),
332
+ expectedDocVersion: row?.docVersion ?? 0,
333
+ page,
334
+ });
335
+ }
336
+ return operations.sort((left, right) => left.pageKey.localeCompare(right.pageKey));
337
+ }
338
+ function pageRowsById(rows) {
339
+ return new Map(rows.map((row) => [row.document.page.id, row]));
340
+ }
341
+ function canvasPageRows(rows) {
342
+ return rows
343
+ .filter((row) => row.pageKey.startsWith(CANVAS_PAGE_PREFIX))
344
+ .map((row) => {
345
+ const parsed = parseCanvasPage(row.document?.page);
346
+ if (!parsed.ok) {
347
+ throw new CanvasDocumentCommandValidationError(parsed.issues.map((issue) => ({
348
+ path: `$.storedPages[${JSON.stringify(row.pageKey)}]${issue.path.slice(1)}`,
349
+ message: `Stored Canvas page ${row.pageKey} is invalid: ${issue.message}`,
350
+ })));
351
+ }
352
+ return {
353
+ ...row,
354
+ document: { ...row.document, page: parsed.page },
355
+ };
356
+ });
357
+ }
358
+ function hostPageStates(rows, pages) {
359
+ const rowsById = pageRowsById(rows);
360
+ return Object.fromEntries(pages.map((page) => {
361
+ const row = rowsById.get(page.id);
362
+ const published = row?.document.published;
363
+ const staged = row?.document.staged;
364
+ const draftDiffersFromPublished = Boolean(published && JSON.stringify(page) !== JSON.stringify(published.page));
365
+ const draftDiffersFromStaged = Boolean(staged && JSON.stringify(page) !== JSON.stringify(staged.page));
366
+ const workflowLabel = staged
367
+ ? (draftDiffersFromStaged ? "Staged · newer draft changes" : "Staged")
368
+ : published
369
+ ? (draftDiffersFromPublished ? "Draft changes" : undefined)
370
+ : "Not published";
371
+ return [page.id, {
372
+ publication: published ? "published" : "draft",
373
+ hasPublishedVersion: Boolean(published),
374
+ hasStagedVersion: Boolean(staged),
375
+ draftDiffersFromPublished,
376
+ draftDiffersFromStaged,
377
+ ...(workflowLabel ? { workflowLabel } : {}),
378
+ ...(published?.publishedAt ? { lastSavedLabel: published.publishedAt } : {}),
379
+ }];
380
+ }));
381
+ }
382
+ function commandError(error, expectedRevision) {
383
+ if (error instanceof CanvasDocumentCommandValidationError) {
384
+ return { ok: false, error: { kind: "validation", issues: error.issues } };
385
+ }
386
+ if (error instanceof CanvasSiteConflict) {
387
+ return { ok: false, error: { kind: "conflict", latest: strapiCanvasConcurrency(error.actualDocVersion) } };
388
+ }
389
+ if (error instanceof CanvasPageConflict) {
390
+ return {
391
+ ok: false,
392
+ error: {
393
+ kind: "conflict",
394
+ ...(expectedRevision === undefined ? {} : { latest: strapiCanvasConcurrency(expectedRevision) }),
395
+ },
396
+ };
397
+ }
398
+ return { ok: false, error: { kind: "unavailable", retryable: true } };
399
+ }
400
+ function record(value, path, message) {
401
+ if (!value || typeof value !== "object" || Array.isArray(value))
402
+ validation(path, message);
403
+ return value;
404
+ }
405
+ function assertKeys(value, allowed, path) {
406
+ const unexpected = Object.keys(value).find((key) => !allowed.has(key));
407
+ if (unexpected)
408
+ validation(`${path}.${unexpected}`, `Unexpected Canvas change field ${unexpected}.`);
409
+ }
410
+ function validation(path, message) {
411
+ throw new CanvasDocumentCommandValidationError([{ path, message }]);
412
+ }
413
+ function normalizePath(path) {
414
+ if (path === "/")
415
+ return path;
416
+ return `/${path.replace(/^\/+|\/+$/g, "")}`;
417
+ }
418
+ //# sourceMappingURL=document-command-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-command-service.js","sourceRoot":"","sources":["../../../src/server/services/document-command-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { EditorShellBootstrap } from "@batterai/editor-shell";
2
+ type ContentType = EditorShellBootstrap["contentTypes"][number];
3
+ export type BoundCollectionConfig = Record<string, string>;
4
+ export type CollectionReadMode = "draft" | "published";
5
+ export declare function createDocumentService(strapi: any, boundCollections?: BoundCollectionConfig, discoverCollections?: boolean): {
6
+ collectionNames(): string[];
7
+ listContentTypes(): ContentType[];
8
+ listCollection(collection: string, options?: {
9
+ status?: CollectionReadMode;
10
+ }): Promise<unknown[]>;
11
+ saveCollection(collection: string, items: unknown[]): Promise<void>;
12
+ };
13
+ export {};
14
+ //# sourceMappingURL=document-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-service.d.ts","sourceRoot":"","sources":["../../../src/server/services/document-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,KAAK,WAAW,GAAG,oBAAoB,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAIhE,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC3D,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,WAAW,CAAC;AAcvD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,GAAG,EACX,gBAAgB,GAAE,qBAA0B,EAC5C,mBAAmB,UAAO;uBAwBL,MAAM,EAAE;wBAGP,WAAW,EAAE;+BAcA,MAAM,YAAW;QAAE,MAAM,CAAC,EAAE,kBAAkB,CAAA;KAAE,GAAQ,OAAO,CAAC,OAAO,EAAE,CAAC;+BAS1E,MAAM,SAAS,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;EAkB5E"}
@@ -0,0 +1,144 @@
1
+ const INTERNAL_API_UIDS = new Set([
2
+ "api::canvas-page.canvas-page",
3
+ "api::canvas-site.canvas-site",
4
+ "api::battery-media-asset.battery-media-asset",
5
+ ]);
6
+ export function createDocumentService(strapi, boundCollections = {}, discoverCollections = true) {
7
+ function collectionBindings() {
8
+ if (!discoverCollections)
9
+ return { ...boundCollections };
10
+ const bindings = {};
11
+ const explicitlyBoundUids = new Set(Object.values(boundCollections));
12
+ for (const [uid, schema] of Object.entries((strapi.contentTypes ?? {}))) {
13
+ if (!uid.startsWith("api::") || INTERNAL_API_UIDS.has(uid) || explicitlyBoundUids.has(uid))
14
+ continue;
15
+ if (schema.kind !== "collectionType")
16
+ continue;
17
+ const key = schema.info?.pluralName ?? schema.info?.singularName ?? uid.slice("api::".length).split(".")[0];
18
+ bindings[key] = uid;
19
+ }
20
+ return { ...bindings, ...boundCollections };
21
+ }
22
+ function schemaFor(uid) {
23
+ return (strapi.contentTypes ?? {})[uid];
24
+ }
25
+ function collectionKeyForUid(uid, bindings) {
26
+ return Object.entries(bindings).find(([, candidate]) => candidate === uid)?.[0];
27
+ }
28
+ return {
29
+ collectionNames() {
30
+ return Object.keys(collectionBindings());
31
+ },
32
+ listContentTypes() {
33
+ const bindings = collectionBindings();
34
+ return Object.entries(bindings).map(([key, uid]) => {
35
+ const schema = schemaFor(uid);
36
+ const fields = Object.entries(schema?.attributes ?? {}).map(([name, attribute]) => fieldSchema(name, attribute, bindings, collectionKeyForUid));
37
+ return {
38
+ id: key,
39
+ name: schema?.info?.displayName ?? schema?.info?.pluralName ?? key,
40
+ fields,
41
+ };
42
+ });
43
+ },
44
+ async listCollection(collection, options = {}) {
45
+ const uid = collectionBindings()[collection];
46
+ if (!uid)
47
+ return [];
48
+ const documents = strapi.documents?.(uid);
49
+ if (documents?.findMany) {
50
+ return normalizeItems(await documents.findMany({ status: options.status ?? "draft", limit: 100, populate: "*" }));
51
+ }
52
+ return normalizeItems(await strapi.entityService.findMany(uid, { limit: 100, populate: "*" }));
53
+ },
54
+ async saveCollection(collection, items) {
55
+ const uid = collectionBindings()[collection];
56
+ if (!uid)
57
+ return;
58
+ const documents = strapi.documents?.(uid);
59
+ if (!documents?.update)
60
+ return;
61
+ const schema = schemaFor(uid);
62
+ for (const item of items) {
63
+ if (!item || typeof item !== "object")
64
+ continue;
65
+ const documentId = item.documentId;
66
+ if (typeof documentId !== "string")
67
+ continue;
68
+ await documents.update({
69
+ documentId,
70
+ status: "draft",
71
+ data: strapiDataForItem(item, schema),
72
+ });
73
+ }
74
+ },
75
+ };
76
+ }
77
+ function normalizeItems(items) {
78
+ if (!Array.isArray(items))
79
+ return [];
80
+ return items.map((item) => {
81
+ if (!item || typeof item !== "object" || Array.isArray(item))
82
+ return item;
83
+ const record = item;
84
+ const identity = record.documentId ?? record.id;
85
+ return identity === undefined ? record : { ...record, id: String(identity) };
86
+ });
87
+ }
88
+ function strapiDataForItem(item, schema) {
89
+ const data = {};
90
+ const attributes = schema?.attributes ?? {};
91
+ for (const [name, attribute] of Object.entries(attributes)) {
92
+ if (!isWritableAttribute(name, attribute) || !(name in item))
93
+ continue;
94
+ data[name] = strapiValueForAttribute(item[name], attribute);
95
+ }
96
+ return data;
97
+ }
98
+ function isWritableAttribute(name, attribute) {
99
+ if (attribute.private === true || attribute.writable === false)
100
+ return false;
101
+ if (attribute.unstable_virtual === true)
102
+ return false;
103
+ if (["id", "documentId", "createdAt", "updatedAt", "publishedAt", "createdBy", "updatedBy", "localizations"].includes(name)) {
104
+ return false;
105
+ }
106
+ return true;
107
+ }
108
+ function strapiValueForAttribute(value, attribute) {
109
+ if (!Array.isArray(value))
110
+ return value;
111
+ const type = typeof attribute.type === "string" ? attribute.type : "json";
112
+ if (["text", "richtext", "blocks"].includes(type))
113
+ return value.filter((entry) => typeof entry === "string").join("\n\n");
114
+ if (["string", "email", "uid", "enumeration", "password"].includes(type))
115
+ return value.filter((entry) => typeof entry === "string").join("\n");
116
+ return value;
117
+ }
118
+ function fieldSchema(name, attribute, bindings, collectionKeyForUid) {
119
+ const type = typeof attribute.type === "string" ? attribute.type : "json";
120
+ const relation = typeof attribute.relation === "string" ? attribute.relation : "";
121
+ const target = typeof attribute.target === "string" ? attribute.target : undefined;
122
+ const isMany = relation.toLowerCase().includes("many") && !relation.toLowerCase().startsWith("manytoone");
123
+ const valueType = type === "relation" ? "reference"
124
+ : type === "media" ? "media"
125
+ : ["integer", "biginteger", "float", "decimal"].includes(type) ? "number"
126
+ : type === "boolean" ? "boolean"
127
+ : ["date", "datetime", "time", "timestamp"].includes(type) ? "date"
128
+ : ["richtext", "blocks"].includes(type) ? "richtext"
129
+ : ["string", "text", "email", "uid", "enumeration", "password"].includes(type) ? "string"
130
+ : "json";
131
+ return {
132
+ name: name,
133
+ label: name,
134
+ valueType,
135
+ cardinality: (isMany || attribute.multiple === true || attribute.repeatable === true) ? "many" : "one",
136
+ ...(type === "relation" ? { isReference: true } : {}),
137
+ ...(target && collectionKeyForUid(target, bindings)
138
+ ? { refType: collectionKeyForUid(target, bindings) }
139
+ : {}),
140
+ ...(attribute.localized === true ? { localized: true } : {}),
141
+ ...(attribute.default !== undefined ? { defaultValue: attribute.default } : {}),
142
+ };
143
+ }
144
+ //# sourceMappingURL=document-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-service.js","sourceRoot":"","sources":["../../../src/server/services/document-service.ts"],"names":[],"mappings":"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"}