@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,409 @@
1
+ import { parseCanvasDocument } from "@batterai/contract";
2
+ import { CANVAS_PAGE_PREFIX, canvasPageKey } from "../../constants.js";
3
+ import { evaluateStrapiCanvasLicense } from "../license.js";
4
+ import { strapiCanvasConcurrency } from "../services/document-command-service.js";
5
+ import { CanvasPageValidationError } from "../services/page-doc-store.js";
6
+ import { defaultHomePage, defaultSiteDocument, normalizeLibrary, } from "../services/site-store.js";
7
+ function pluginService(strapi, serviceName) {
8
+ return strapi.plugin("canvas").service(serviceName);
9
+ }
10
+ function bodyRecord(ctx) {
11
+ const body = ctx.request.body;
12
+ return body && typeof body === "object" && !Array.isArray(body) ? body : {};
13
+ }
14
+ function sitePages(site, rows) {
15
+ const byId = new Map();
16
+ const pageVersions = {};
17
+ for (const row of rows) {
18
+ const page = row.document?.page;
19
+ if (!page?.id)
20
+ continue;
21
+ byId.set(page.id, page);
22
+ pageVersions[page.id] = row.docVersion ?? 0;
23
+ }
24
+ if (!byId.size) {
25
+ const home = defaultHomePage();
26
+ byId.set(home.id, home);
27
+ pageVersions[home.id] = 0;
28
+ }
29
+ const ordered = site.pageOrder.map((id) => byId.get(id)).filter(Boolean);
30
+ const orderedIds = new Set(ordered.map((page) => page.id));
31
+ const extras = [...byId.values()].filter((page) => !orderedIds.has(page.id));
32
+ return { pages: [...ordered, ...extras], pageVersions };
33
+ }
34
+ function canvasDocument(pages, site) {
35
+ const canvas = site.canvas ?? defaultSiteDocument().canvas;
36
+ return {
37
+ schemaVersion: 1,
38
+ pages,
39
+ ...canvas,
40
+ layout: canvas.layout ?? { pageOrder: pages.map((page) => page.id) },
41
+ };
42
+ }
43
+ function hostPageStates(rows, pages) {
44
+ const rowsById = new Map(rows.flatMap((row) => row.document?.page?.id ? [[row.document.page.id, row]] : []));
45
+ return Object.fromEntries(pages.map((page) => {
46
+ const row = rowsById.get(page.id);
47
+ const published = row?.document?.published;
48
+ const staged = row?.document?.staged;
49
+ const draftDiffersFromPublished = Boolean(published?.page && JSON.stringify(page) !== JSON.stringify(published.page));
50
+ const draftDiffersFromStaged = Boolean(staged?.page && JSON.stringify(page) !== JSON.stringify(staged.page));
51
+ const workflowLabel = staged
52
+ ? (draftDiffersFromStaged ? "Staged · newer draft changes" : "Staged")
53
+ : published
54
+ ? (draftDiffersFromPublished ? "Draft changes" : undefined)
55
+ : "Not published";
56
+ return [page.id, {
57
+ publication: published ? "published" : "draft",
58
+ hasPublishedVersion: Boolean(published),
59
+ hasStagedVersion: Boolean(staged),
60
+ draftDiffersFromPublished,
61
+ draftDiffersFromStaged,
62
+ ...(workflowLabel ? { workflowLabel } : {}),
63
+ ...(published?.publishedAt ? { lastSavedLabel: published.publishedAt } : {}),
64
+ }];
65
+ }));
66
+ }
67
+ async function pageRows(strapi) {
68
+ const rows = await strapi.entityService.findMany("plugin::canvas.canvas-page", { limit: 1000 });
69
+ return rows.filter((row) => typeof row.pageKey === "string" && row.pageKey.startsWith(CANVAS_PAGE_PREFIX));
70
+ }
71
+ function applyContentPatch(content, patch) {
72
+ return {
73
+ ...content,
74
+ ...patch,
75
+ media: patch.media ?? content.media ?? [],
76
+ routes: patch.routes ?? content.routes ?? [],
77
+ sharedBlocks: patch.sharedBlocks ?? content.sharedBlocks ?? [],
78
+ siteMetadata: patch.siteMetadata ?? content.siteMetadata ?? {},
79
+ translations: patch.translations ?? content.translations ?? {},
80
+ };
81
+ }
82
+ function isRecord(value) {
83
+ return Boolean(value && typeof value === "object" && !Array.isArray(value));
84
+ }
85
+ function publishedSiteSnapshot(site) {
86
+ const snapshot = site.published;
87
+ if (!snapshot || !isRecord(snapshot.content) || !isRecord(snapshot.library))
88
+ return undefined;
89
+ if (typeof snapshot.publishedAt !== "string" || !Number.isInteger(snapshot.sourceDocVersion))
90
+ return undefined;
91
+ const parsed = parseCanvasDocument(snapshot.document);
92
+ if (!parsed.ok)
93
+ return undefined;
94
+ return { ...snapshot, document: parsed.document };
95
+ }
96
+ function emptyPublicDelivery(site) {
97
+ const defaults = defaultSiteDocument();
98
+ return {
99
+ content: { ...defaults.content, routes: [] },
100
+ library: defaults.library,
101
+ document: {
102
+ ...canvasDocument([], defaults),
103
+ layout: { pageOrder: [] },
104
+ },
105
+ status: {
106
+ ...site.status,
107
+ connected: true,
108
+ lastSyncedAt: new Date().toISOString(),
109
+ runtimeModel: "strapi-public-delivery",
110
+ source: "plugin::canvas.delivery",
111
+ },
112
+ };
113
+ }
114
+ function commandResponse(ctx, result) {
115
+ if (!result.ok) {
116
+ ctx.status = result.error.kind === "conflict" ? 409
117
+ : result.error.kind === "validation" ? 400
118
+ : result.error.kind === "forbidden" ? 403
119
+ : result.error.kind === "not-found" ? 404
120
+ : result.error.kind === "unsupported" ? 501
121
+ : 503;
122
+ }
123
+ ctx.body = result;
124
+ }
125
+ export default ({ strapi }) => ({
126
+ async collabToken(ctx) {
127
+ const service = pluginService(strapi, "collaboration");
128
+ if (!service) {
129
+ ctx.status = 404;
130
+ ctx.body = { error: "Collaboration is not enabled." };
131
+ return;
132
+ }
133
+ const user = ctx.state?.user;
134
+ if (!user) {
135
+ ctx.status = 401;
136
+ ctx.body = { error: "Authenticated Strapi admin required." };
137
+ return;
138
+ }
139
+ ctx.body = service.mintToken(user);
140
+ },
141
+ async collab(ctx) {
142
+ const service = pluginService(strapi, "collaboration");
143
+ if (!service) {
144
+ ctx.status = 404;
145
+ ctx.body = { error: "Collaboration is not enabled." };
146
+ return;
147
+ }
148
+ const action = ctx.params.action;
149
+ if (!action)
150
+ throw new CanvasPageValidationError("Collaboration action is required.");
151
+ const body = bodyRecord(ctx);
152
+ const user = ctx.state?.user;
153
+ if (!user) {
154
+ ctx.status = 401;
155
+ ctx.body = { error: "Authenticated Strapi admin required." };
156
+ return;
157
+ }
158
+ try {
159
+ if (action === "hello") {
160
+ if (typeof body.token !== "string" || typeof body.pageId !== "string")
161
+ throw new CanvasPageValidationError("Collaboration hello is malformed.");
162
+ service.assertTokenOwner(body.token, user.id);
163
+ await service.ensurePage(body.pageId);
164
+ }
165
+ else if (typeof body.sessionId === "string") {
166
+ service.assertSessionOwner(body.sessionId, user.id);
167
+ }
168
+ }
169
+ catch (error) {
170
+ if (error instanceof CanvasPageValidationError)
171
+ throw error;
172
+ ctx.status = 403;
173
+ ctx.body = { error: error instanceof Error ? error.message : "Collaboration access denied." };
174
+ return;
175
+ }
176
+ const originHeader = ctx.request.headers?.origin ?? ctx.request.header?.origin;
177
+ const origin = Array.isArray(originHeader)
178
+ ? originHeader[0]
179
+ : originHeader ?? (typeof body.__canvasOrigin === "string" ? body.__canvasOrigin : undefined);
180
+ const response = await service.handler(new Request(`http://canvas.local/collab/${encodeURIComponent(action)}`, {
181
+ method: "POST",
182
+ headers: {
183
+ "content-type": "application/json",
184
+ ...(origin ? { origin } : {}),
185
+ },
186
+ body: JSON.stringify(body),
187
+ }));
188
+ if (!response) {
189
+ ctx.status = 404;
190
+ ctx.body = { error: "Unknown collaboration action." };
191
+ return;
192
+ }
193
+ ctx.status = response.status;
194
+ ctx.body = await response.json();
195
+ if (action === "hello" && ctx.body?.ok && ctx.body?.welcome?.sessionId) {
196
+ service.claimSession(ctx.body.welcome.sessionId, user.id);
197
+ }
198
+ },
199
+ async collabAudit(ctx) {
200
+ const service = pluginService(strapi, "collaboration");
201
+ if (!service) {
202
+ ctx.status = 404;
203
+ ctx.body = { error: "Collaboration is not enabled." };
204
+ return;
205
+ }
206
+ const canvasPageId = ctx.params.pageId;
207
+ if (!canvasPageId)
208
+ throw new CanvasPageValidationError("Audit page id is required.");
209
+ ctx.body = { events: await service.readAudit(canvasPageId) };
210
+ },
211
+ async delivery(ctx) {
212
+ const site = await pluginService(strapi, "siteStore").readOrCreate();
213
+ const published = publishedSiteSnapshot(site);
214
+ if (!published) {
215
+ ctx.body = emptyPublicDelivery(site);
216
+ return;
217
+ }
218
+ const documentService = pluginService(strapi, "documentService");
219
+ const config = strapi.config.get("plugin::canvas") ?? {};
220
+ const boundContent = {};
221
+ for (const collection of documentService.collectionNames?.() ?? Object.keys(config.boundCollections ?? {})) {
222
+ boundContent[collection] = await documentService.listCollection(collection, { status: "published" });
223
+ }
224
+ ctx.body = {
225
+ content: applyContentPatch(published.content, boundContent),
226
+ library: published.library,
227
+ document: published.document,
228
+ status: {
229
+ ...site.status,
230
+ connected: true,
231
+ lastSyncedAt: new Date().toISOString(),
232
+ runtimeModel: "strapi-public-delivery",
233
+ source: "plugin::canvas.delivery",
234
+ },
235
+ };
236
+ },
237
+ async bootstrap(ctx) {
238
+ const site = await pluginService(strapi, "siteStore").readOrCreate();
239
+ const rows = await pageRows(strapi);
240
+ const { pages, pageVersions } = sitePages(site, rows);
241
+ const collaboration = pluginService(strapi, "collaboration");
242
+ if (collaboration) {
243
+ await Promise.all(pages.map((page) => collaboration.ensurePage(page.id)));
244
+ }
245
+ const documentService = pluginService(strapi, "documentService");
246
+ const config = strapi.config.get("plugin::canvas") ?? {};
247
+ const configuredLibrary = normalizeLibrary(config.seedLibrary);
248
+ const license = await evaluateStrapiCanvasLicense(config, ctx);
249
+ const boundContent = {};
250
+ for (const collection of documentService.collectionNames?.() ?? Object.keys(config.boundCollections ?? {})) {
251
+ boundContent[collection] = await documentService.listCollection(collection);
252
+ }
253
+ ctx.body = {
254
+ content: applyContentPatch(site.content, boundContent),
255
+ contentTypes: documentService.listContentTypes?.() ?? site.contentTypes,
256
+ library: configuredLibrary ?? site.library,
257
+ document: canvasDocument(pages, site),
258
+ pageStates: hostPageStates(rows, pages),
259
+ capabilities: {
260
+ canSave: true,
261
+ canPublish: true,
262
+ supportsPageStaging: true,
263
+ canUploadAssets: false,
264
+ canEditRoutes: true,
265
+ supportsPreview: true,
266
+ supportsAtomicMultiPageSave: true,
267
+ },
268
+ documentConcurrency: strapiCanvasConcurrency(site.docVersion),
269
+ pageVersions,
270
+ status: {
271
+ ...site.status,
272
+ connected: true,
273
+ license,
274
+ lastSyncedAt: new Date().toISOString(),
275
+ },
276
+ };
277
+ },
278
+ async findPage(ctx) {
279
+ const pageId = ctx.params.pageId;
280
+ if (!pageId)
281
+ throw new CanvasPageValidationError("pageId is required.");
282
+ const row = await pluginService(strapi, "pageDocStore").read(canvasPageKey(pageId));
283
+ ctx.body = row?.document ?? null;
284
+ },
285
+ async findPageRevision(ctx) {
286
+ const pageId = ctx.params.pageId;
287
+ const revision = ctx.params.revision;
288
+ if (!pageId)
289
+ throw new CanvasPageValidationError("pageId is required.");
290
+ if (revision !== "draft" && revision !== "staged" && revision !== "published") {
291
+ throw new CanvasPageValidationError("revision must be draft, staged, or published.");
292
+ }
293
+ const row = await pluginService(strapi, "pageDocStore").read(canvasPageKey(pageId));
294
+ const page = revision === "draft" ? row?.document?.page
295
+ : revision === "staged" ? row?.document?.staged?.page
296
+ : row?.document?.published?.page;
297
+ if (!page) {
298
+ ctx.status = 404;
299
+ ctx.body = { ok: false, error: { kind: "not-found" } };
300
+ return;
301
+ }
302
+ const createdAt = revision === "draft" ? row?.document?.updatedAt
303
+ : revision === "staged" ? row?.document?.staged?.stagedAt
304
+ : row?.document?.published?.publishedAt;
305
+ ctx.body = { ok: true, value: { kind: revision, page, ...(createdAt ? { createdAt } : {}) } };
306
+ },
307
+ async saveDocument(ctx) {
308
+ const result = await pluginService(strapi, "documentCommand").saveDocument(bodyRecord(ctx));
309
+ commandResponse(ctx, result);
310
+ },
311
+ async publishDocument(ctx) {
312
+ const result = await pluginService(strapi, "documentCommand").publishDocument(bodyRecord(ctx));
313
+ commandResponse(ctx, result);
314
+ },
315
+ async stagePage(ctx) {
316
+ const result = await pluginService(strapi, "documentCommand").stagePage({
317
+ ...bodyRecord(ctx),
318
+ pageId: ctx.params.pageId,
319
+ });
320
+ commandResponse(ctx, result);
321
+ },
322
+ async unstagePage(ctx) {
323
+ const result = await pluginService(strapi, "documentCommand").unstagePage({
324
+ ...bodyRecord(ctx),
325
+ pageId: ctx.params.pageId,
326
+ });
327
+ commandResponse(ctx, result);
328
+ },
329
+ async saveContent(ctx) {
330
+ const collection = ctx.params.collection;
331
+ if (!collection)
332
+ throw new CanvasPageValidationError("collection is required.");
333
+ const items = bodyRecord(ctx).items;
334
+ if (!Array.isArray(items))
335
+ throw new CanvasPageValidationError("items must be an array.");
336
+ await pluginService(strapi, "documentService").saveCollection(collection, items);
337
+ ctx.body = { saved: true };
338
+ },
339
+ async listMedia(ctx) {
340
+ ctx.body = { items: [], nextCursor: undefined };
341
+ },
342
+ async uploadMedia(ctx) {
343
+ throw new CanvasPageValidationError("Canvas media upload is not configured for this Strapi plugin instance.");
344
+ },
345
+ async saveMedia(ctx) {
346
+ const media = bodyRecord(ctx).media;
347
+ await updateSite(strapi, (site) => ({
348
+ ...site,
349
+ docVersion: site.docVersion + 1,
350
+ content: applyContentPatch(site.content, { media: Array.isArray(media) ? media : [] }),
351
+ }));
352
+ ctx.body = { saved: true };
353
+ },
354
+ async saveRoutes(ctx) {
355
+ const routes = bodyRecord(ctx).routes;
356
+ await updateSite(strapi, (site) => ({
357
+ ...site,
358
+ docVersion: site.docVersion + 1,
359
+ content: applyContentPatch(site.content, { routes: Array.isArray(routes) ? routes : [] }),
360
+ }));
361
+ ctx.body = { saved: true };
362
+ },
363
+ async saveSharedBlocks(ctx) {
364
+ const sharedBlocks = bodyRecord(ctx).sharedBlocks;
365
+ await updateSite(strapi, (site) => ({
366
+ ...site,
367
+ docVersion: site.docVersion + 1,
368
+ content: applyContentPatch(site.content, {
369
+ sharedBlocks: Array.isArray(sharedBlocks) ? sharedBlocks : [],
370
+ }),
371
+ }));
372
+ ctx.body = { saved: true };
373
+ },
374
+ async saveTranslations(ctx) {
375
+ const translations = bodyRecord(ctx).translations;
376
+ await updateSite(strapi, (site) => ({
377
+ ...site,
378
+ docVersion: site.docVersion + 1,
379
+ content: applyContentPatch(site.content, {
380
+ translations: translations && typeof translations === "object"
381
+ ? translations
382
+ : {},
383
+ }),
384
+ }));
385
+ ctx.body = { saved: true };
386
+ },
387
+ async saveSiteMetadata(ctx) {
388
+ const siteMetadata = bodyRecord(ctx).siteMetadata;
389
+ await updateSite(strapi, (site) => ({
390
+ ...site,
391
+ docVersion: site.docVersion + 1,
392
+ content: applyContentPatch(site.content, {
393
+ siteMetadata: siteMetadata && typeof siteMetadata === "object"
394
+ ? siteMetadata
395
+ : {},
396
+ }),
397
+ }));
398
+ ctx.body = { saved: true };
399
+ },
400
+ async savePreset(ctx) {
401
+ const preset = bodyRecord(ctx).preset;
402
+ const site = await pluginService(strapi, "siteStore").readOrCreate();
403
+ ctx.body = { library: site.library, preset };
404
+ },
405
+ });
406
+ async function updateSite(strapi, mutator) {
407
+ await pluginService(strapi, "siteStore").update(mutator);
408
+ }
409
+ //# sourceMappingURL=canvas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas.js","sourceRoot":"","sources":["../../../src/server/controllers/canvas.ts"],"names":[],"mappings":"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"}