@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,68 @@
1
+ declare const _default: {
2
+ collaboration({ strapi }: {
3
+ strapi: any;
4
+ }): {
5
+ mintToken(user: {
6
+ readonly id: string | number;
7
+ readonly firstname?: string;
8
+ readonly lastname?: string;
9
+ readonly username?: string;
10
+ readonly roles?: readonly {
11
+ readonly id?: string | number;
12
+ readonly code?: string;
13
+ readonly name?: string;
14
+ }[];
15
+ }): {
16
+ token: string;
17
+ expiresAt: string;
18
+ };
19
+ ensurePage: (canvasPageId: string) => Promise<void>;
20
+ readAudit(canvasPageId: string): Promise<readonly import("@batterai/host").CollaborationAuditEvent<import("@batterai/collab-protocol").PageOp>[]>;
21
+ assertTokenOwner(token: string, userId: string | number): void;
22
+ assertSessionOwner(sessionId: string, userId: string | number): void;
23
+ claimSession(sessionId: string, userId: string | number): void;
24
+ handler: (req: Request, inputUrl?: URL) => Promise<Response | undefined>;
25
+ } | null;
26
+ documentCommand({ strapi }: {
27
+ strapi: any;
28
+ }): {
29
+ saveDocument(request: unknown): Promise<import("@batterai/contract").CanvasHostResult<import("@batterai/contract").HostSaveReceipt>>;
30
+ publishDocument(request: unknown): Promise<import("@batterai/contract").CanvasHostResult<import("@batterai/contract").HostPublishReceipt>>;
31
+ stagePage(request: unknown): Promise<import("@batterai/contract").CanvasHostResult<import("@batterai/contract").HostStageReceipt>>;
32
+ unstagePage(request: unknown): Promise<import("@batterai/contract").CanvasHostResult<import("@batterai/contract").HostStageReceipt>>;
33
+ };
34
+ pageDocStore({ strapi }: {
35
+ strapi: any;
36
+ }): {
37
+ list(): Promise<import("./page-doc-store").CanvasPageRow<unknown>[]>;
38
+ read(pageKey: string): Promise<import("./page-doc-store").CanvasPageRow<unknown> | undefined>;
39
+ save(pageKey: string, page: unknown, expectedDocVersion: number): Promise<import("./page-doc-store").CanvasPageRow<unknown>>;
40
+ remove(pageKey: string, expectedDocVersion: number): Promise<void>;
41
+ publish(pageKey: string, expectedDocVersion: number, publishedAt?: Date): Promise<import("./page-doc-store").CanvasPageRow<unknown>>;
42
+ stage(pageKey: string, expectedDocVersion: number): Promise<import("./page-doc-store").CanvasPageRow<unknown>>;
43
+ unstage(pageKey: string, expectedDocVersion: number): Promise<import("./page-doc-store").CanvasPageRow<unknown>>;
44
+ publishStaged(pageKey: string, expectedDocVersion: number, publishedAt?: Date): Promise<import("./page-doc-store").CanvasPageRow<unknown>>;
45
+ };
46
+ siteStore({ strapi }: {
47
+ strapi: any;
48
+ }): {
49
+ readOrCreate(): Promise<import("./site-store").CanvasSiteDocument>;
50
+ update(mutator: (document: import("./site-store").CanvasSiteDocument) => import("./site-store").CanvasSiteDocument): Promise<import("./site-store").CanvasSiteDocument>;
51
+ updateIfVersion(expectedDocVersion: number, mutator: (document: import("./site-store").CanvasSiteDocument) => import("./site-store").CanvasSiteDocument): Promise<import("./site-store").CanvasSiteDocument>;
52
+ };
53
+ documentService({ strapi }: {
54
+ strapi: any;
55
+ }): {
56
+ collectionNames(): string[];
57
+ listContentTypes(): import("@batterai/bind-core").ContentType[];
58
+ listCollection(collection: string, options?: {
59
+ status?: import("./document-service").CollectionReadMode;
60
+ }): Promise<unknown[]>;
61
+ saveCollection(collection: string, items: unknown[]): Promise<void>;
62
+ };
63
+ };
64
+ export default _default;
65
+ export { CanvasPageConflict, CanvasPageValidationError, createPageDocStore, createStrapiPageDocRepository, documentVersion, makeCanvasPageDocument, } from "./page-doc-store";
66
+ export { createDocumentCommandService, strapiCanvasConcurrency, type CanvasDocumentCommandTransaction, type CanvasDocumentCommandTransactionRunner, } from "./document-command-service";
67
+ export { CanvasSiteConflict, createSiteStore, defaultHomePage, defaultSiteDocument } from "./site-store";
68
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/services/index.ts"],"names":[],"mappings":";8BAO4B;QAAE,MAAM,EAAE,GAAG,CAAA;KAAE;;;8BAkCikJ,CAAC;6BAA2B,CAAC;6BAA2B,CAAC;0BAAwB,CAAC;2BAAwB,CAAC;6BAAgC,CAAC;6BAAuB,CAAC;;;;;;;;;;;;;gCA/BlvJ;QAAE,MAAM,EAAE,GAAG,CAAA;KAAE;;;;;;6BAGlB;QAAE,MAAM,EAAE,GAAG,CAAA;KAAE;;;;;;;;;;0BAGlB;QAAE,MAAM,EAAE,GAAG,CAAA;KAAE;;;;;gCAIT;QAAE,MAAM,EAAE,GAAG,CAAA;KAAE;;;;kBAqB67B,CAAC;;;;;AAnC3+B,wBAkBE;AAEF,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,kBAAkB,EAClB,6BAA6B,EAC7B,eAAe,EACf,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,4BAA4B,EAC5B,uBAAuB,EACvB,KAAK,gCAAgC,EACrC,KAAK,sCAAsC,GAC5C,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { createDocumentService } from "./document-service.js";
2
+ import { createDocumentCommandService } from "./document-command-service.js";
3
+ import { createPageDocStore, createStrapiPageDocRepository } from "./page-doc-store.js";
4
+ import { createSiteStore } from "./site-store.js";
5
+ import { createStrapiCollaborationService } from "./collaboration-service.js";
6
+ export default {
7
+ collaboration({ strapi }) {
8
+ return createStrapiCollaborationService(strapi);
9
+ },
10
+ documentCommand({ strapi }) {
11
+ return createDocumentCommandService(strapi);
12
+ },
13
+ pageDocStore({ strapi }) {
14
+ return createPageDocStore(createStrapiPageDocRepository(strapi));
15
+ },
16
+ siteStore({ strapi }) {
17
+ const config = strapi.config.get("plugin::canvas") ?? {};
18
+ return createSiteStore(strapi, config.seedLibrary);
19
+ },
20
+ documentService({ strapi }) {
21
+ const config = strapi.config.get("plugin::canvas") ?? {};
22
+ return createDocumentService(strapi, config.boundCollections ?? {}, config.discoverCollections ?? true);
23
+ },
24
+ };
25
+ export { CanvasPageConflict, CanvasPageValidationError, createPageDocStore, createStrapiPageDocRepository, documentVersion, makeCanvasPageDocument, } from "./page-doc-store.js";
26
+ export { createDocumentCommandService, strapiCanvasConcurrency, } from "./document-command-service.js";
27
+ export { CanvasSiteConflict, createSiteStore, defaultHomePage, defaultSiteDocument } from "./site-store.js";
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,gCAAgC,EAAE,MAAM,yBAAyB,CAAC;AAE3E,eAAe;IACb,aAAa,CAAC,EAAE,MAAM,EAAmB;QACvC,OAAO,gCAAgC,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IACD,eAAe,CAAC,EAAE,MAAM,EAAmB;QACzC,OAAO,4BAA4B,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IACD,YAAY,CAAC,EAAE,MAAM,EAAmB;QACtC,OAAO,kBAAkB,CAAC,6BAA6B,CAAC,MAAM,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,SAAS,CAAC,EAAE,MAAM,EAAmB;QACnC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;QACzD,OAAO,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IACrD,CAAC;IACD,eAAe,CAAC,EAAE,MAAM,EAAmB;QACzC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;QACzD,OAAO,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,gBAAgB,IAAI,EAAE,EAAE,MAAM,CAAC,mBAAmB,IAAI,IAAI,CAAC,CAAC;IAC1G,CAAC;CACF,CAAC;AAEF,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,kBAAkB,EAClB,6BAA6B,EAC7B,eAAe,EACf,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,4BAA4B,EAC5B,uBAAuB,GAGxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,59 @@
1
+ export type CanvasPageDocument<Page = unknown> = {
2
+ kind: "canvas-editor-page";
3
+ docVersion: number;
4
+ page: Page;
5
+ staged?: {
6
+ page: Page;
7
+ stagedAt: string;
8
+ sourceDocVersion: number;
9
+ };
10
+ published?: {
11
+ page: Page;
12
+ publishedAt: string;
13
+ sourceDocVersion: number;
14
+ };
15
+ updatedAt: string;
16
+ };
17
+ export type CanvasPageRow<Page = unknown> = {
18
+ id?: string | number;
19
+ documentId?: string;
20
+ pageKey: string;
21
+ docVersion: number;
22
+ latestVersion?: string | null;
23
+ document: CanvasPageDocument<Page>;
24
+ };
25
+ export declare class CanvasPageConflict extends Error {
26
+ readonly pageKey: string;
27
+ readonly expectedDocVersion: number;
28
+ readonly actualDocVersion: number | undefined;
29
+ readonly status = 409;
30
+ constructor(pageKey: string, expectedDocVersion: number, actualDocVersion: number | undefined);
31
+ }
32
+ export declare class CanvasPageValidationError extends Error {
33
+ readonly status = 400;
34
+ }
35
+ export type PageDocRepository<Page = unknown> = {
36
+ list: () => Promise<CanvasPageRow<Page>[]>;
37
+ findByPageKey: (pageKey: string) => Promise<CanvasPageRow<Page> | undefined>;
38
+ insert: (row: CanvasPageRow<Page>) => Promise<CanvasPageRow<Page>>;
39
+ updateIfVersion: (pageKey: string, expectedDocVersion: number, patch: Pick<CanvasPageRow<Page>, "docVersion" | "latestVersion" | "document">) => Promise<number>;
40
+ deleteIfVersion: (pageKey: string, expectedDocVersion: number) => Promise<number>;
41
+ };
42
+ export declare function documentVersion(document: unknown): number;
43
+ export declare function latestVersion(document: unknown): string | null;
44
+ export declare function makeCanvasPageDocument<Page>(page: Page, expectedDocVersion: number, now?: Date, published?: CanvasPageDocument<Page>["published"], staged?: CanvasPageDocument<Page>["staged"]): CanvasPageDocument<Page>;
45
+ export declare function createPageDocStore<Page = unknown>(repository: PageDocRepository<Page>, options?: {
46
+ now?: () => Date;
47
+ createDocumentId?: () => string;
48
+ }): {
49
+ list(): Promise<CanvasPageRow<Page>[]>;
50
+ read(pageKey: string): Promise<CanvasPageRow<Page> | undefined>;
51
+ save(pageKey: string, page: Page, expectedDocVersion: number): Promise<CanvasPageRow<Page>>;
52
+ remove(pageKey: string, expectedDocVersion: number): Promise<void>;
53
+ publish(pageKey: string, expectedDocVersion: number, publishedAt?: Date): Promise<CanvasPageRow<Page>>;
54
+ stage(pageKey: string, expectedDocVersion: number): Promise<CanvasPageRow<Page>>;
55
+ unstage(pageKey: string, expectedDocVersion: number): Promise<CanvasPageRow<Page>>;
56
+ publishStaged(pageKey: string, expectedDocVersion: number, publishedAt?: Date): Promise<CanvasPageRow<Page>>;
57
+ };
58
+ export declare function createStrapiPageDocRepository<Page = unknown>(strapi: any, transaction?: ((tableName: string) => any)): PageDocRepository<Page>;
59
+ //# sourceMappingURL=page-doc-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-doc-store.d.ts","sourceRoot":"","sources":["../../../src/server/services/page-doc-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,285 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { CANVAS_PAGE_UID } from "../../constants.js";
3
+ export class CanvasPageConflict extends Error {
4
+ pageKey;
5
+ expectedDocVersion;
6
+ actualDocVersion;
7
+ status = 409;
8
+ constructor(pageKey, expectedDocVersion, actualDocVersion) {
9
+ super(`Canvas page conflict for ${pageKey}: expected ${expectedDocVersion}, got ${actualDocVersion ?? "missing"}`);
10
+ this.pageKey = pageKey;
11
+ this.expectedDocVersion = expectedDocVersion;
12
+ this.actualDocVersion = actualDocVersion;
13
+ this.name = "CanvasPageConflict";
14
+ }
15
+ }
16
+ export class CanvasPageValidationError extends Error {
17
+ status = 400;
18
+ }
19
+ export function documentVersion(document) {
20
+ if (!document || typeof document !== "object" || Array.isArray(document))
21
+ return 0;
22
+ const version = document.docVersion;
23
+ return typeof version === "number" && Number.isInteger(version) && version >= 0 ? version : 0;
24
+ }
25
+ export function latestVersion(document) {
26
+ if (!document || typeof document !== "object" || Array.isArray(document))
27
+ return null;
28
+ const version = document.latestVersion;
29
+ return typeof version === "string" ? version : null;
30
+ }
31
+ export function makeCanvasPageDocument(page, expectedDocVersion, now = new Date(), published, staged) {
32
+ if (!Number.isInteger(expectedDocVersion) || expectedDocVersion < 0) {
33
+ throw new CanvasPageValidationError("expectedDocVersion must be a non-negative integer.");
34
+ }
35
+ return {
36
+ kind: "canvas-editor-page",
37
+ docVersion: expectedDocVersion + 1,
38
+ page,
39
+ ...(staged ? { staged } : {}),
40
+ ...(published ? { published } : {}),
41
+ updatedAt: now.toISOString(),
42
+ };
43
+ }
44
+ export function createPageDocStore(repository, options = {}) {
45
+ const now = options.now ?? (() => new Date());
46
+ const createDocumentId = options.createDocumentId ?? randomUUID;
47
+ return {
48
+ async list() {
49
+ return repository.list();
50
+ },
51
+ async read(pageKey) {
52
+ return repository.findByPageKey(pageKey);
53
+ },
54
+ async save(pageKey, page, expectedDocVersion) {
55
+ const existing = await repository.findByPageKey(pageKey);
56
+ const actualDocVersion = existing?.docVersion ?? documentVersion(existing?.document);
57
+ if (existing && actualDocVersion !== expectedDocVersion) {
58
+ throw new CanvasPageConflict(pageKey, expectedDocVersion, actualDocVersion);
59
+ }
60
+ const document = makeCanvasPageDocument(page, expectedDocVersion, now(), existing?.document.published, existing?.document.staged);
61
+ const patch = {
62
+ docVersion: document.docVersion,
63
+ latestVersion: latestVersion(page) ?? document.updatedAt,
64
+ document,
65
+ };
66
+ if (!existing) {
67
+ if (expectedDocVersion !== 0) {
68
+ throw new CanvasPageConflict(pageKey, expectedDocVersion, undefined);
69
+ }
70
+ try {
71
+ return await repository.insert({
72
+ pageKey,
73
+ documentId: createDocumentId(),
74
+ ...patch,
75
+ });
76
+ }
77
+ catch (error) {
78
+ if (isUniqueError(error))
79
+ throw new CanvasPageConflict(pageKey, expectedDocVersion, undefined);
80
+ throw error;
81
+ }
82
+ }
83
+ const affected = await repository.updateIfVersion(pageKey, expectedDocVersion, patch);
84
+ if (affected !== 1)
85
+ throw new CanvasPageConflict(pageKey, expectedDocVersion, undefined);
86
+ return {
87
+ ...existing,
88
+ ...patch,
89
+ };
90
+ },
91
+ async remove(pageKey, expectedDocVersion) {
92
+ const existing = await repository.findByPageKey(pageKey);
93
+ const actualDocVersion = existing?.docVersion ?? documentVersion(existing?.document);
94
+ if (!existing || actualDocVersion !== expectedDocVersion) {
95
+ throw new CanvasPageConflict(pageKey, expectedDocVersion, existing ? actualDocVersion : undefined);
96
+ }
97
+ const affected = await repository.deleteIfVersion(pageKey, expectedDocVersion);
98
+ if (affected !== 1)
99
+ throw new CanvasPageConflict(pageKey, expectedDocVersion, actualDocVersion);
100
+ },
101
+ async publish(pageKey, expectedDocVersion, publishedAt) {
102
+ const existing = await repository.findByPageKey(pageKey);
103
+ const actualDocVersion = existing?.docVersion ?? documentVersion(existing?.document);
104
+ if (!existing || actualDocVersion !== expectedDocVersion) {
105
+ throw new CanvasPageConflict(pageKey, expectedDocVersion, existing ? actualDocVersion : undefined);
106
+ }
107
+ const timestamp = (publishedAt ?? now()).toISOString();
108
+ const document = {
109
+ ...existing.document,
110
+ docVersion: expectedDocVersion + 1,
111
+ updatedAt: timestamp,
112
+ published: {
113
+ page: existing.document.page,
114
+ publishedAt: timestamp,
115
+ sourceDocVersion: expectedDocVersion,
116
+ },
117
+ };
118
+ const patch = {
119
+ docVersion: document.docVersion,
120
+ latestVersion: timestamp,
121
+ document,
122
+ };
123
+ const affected = await repository.updateIfVersion(pageKey, expectedDocVersion, patch);
124
+ if (affected !== 1)
125
+ throw new CanvasPageConflict(pageKey, expectedDocVersion, actualDocVersion);
126
+ return { ...existing, ...patch };
127
+ },
128
+ async stage(pageKey, expectedDocVersion) {
129
+ const existing = await repository.findByPageKey(pageKey);
130
+ const actualDocVersion = existing?.docVersion ?? documentVersion(existing?.document);
131
+ if (!existing || actualDocVersion !== expectedDocVersion) {
132
+ throw new CanvasPageConflict(pageKey, expectedDocVersion, existing ? actualDocVersion : undefined);
133
+ }
134
+ const timestamp = now().toISOString();
135
+ const document = {
136
+ ...existing.document,
137
+ docVersion: expectedDocVersion + 1,
138
+ updatedAt: timestamp,
139
+ staged: {
140
+ page: structuredClone(existing.document.page),
141
+ stagedAt: timestamp,
142
+ sourceDocVersion: expectedDocVersion,
143
+ },
144
+ };
145
+ const patch = { docVersion: document.docVersion, latestVersion: timestamp, document };
146
+ const affected = await repository.updateIfVersion(pageKey, expectedDocVersion, patch);
147
+ if (affected !== 1)
148
+ throw new CanvasPageConflict(pageKey, expectedDocVersion, actualDocVersion);
149
+ return { ...existing, ...patch };
150
+ },
151
+ async unstage(pageKey, expectedDocVersion) {
152
+ const existing = await repository.findByPageKey(pageKey);
153
+ const actualDocVersion = existing?.docVersion ?? documentVersion(existing?.document);
154
+ if (!existing || actualDocVersion !== expectedDocVersion) {
155
+ throw new CanvasPageConflict(pageKey, expectedDocVersion, existing ? actualDocVersion : undefined);
156
+ }
157
+ const timestamp = now().toISOString();
158
+ const { staged: _staged, ...rest } = existing.document;
159
+ const document = {
160
+ ...rest,
161
+ docVersion: expectedDocVersion + 1,
162
+ updatedAt: timestamp,
163
+ };
164
+ const patch = { docVersion: document.docVersion, latestVersion: timestamp, document };
165
+ const affected = await repository.updateIfVersion(pageKey, expectedDocVersion, patch);
166
+ if (affected !== 1)
167
+ throw new CanvasPageConflict(pageKey, expectedDocVersion, actualDocVersion);
168
+ return { ...existing, ...patch };
169
+ },
170
+ async publishStaged(pageKey, expectedDocVersion, publishedAt) {
171
+ const existing = await repository.findByPageKey(pageKey);
172
+ const actualDocVersion = existing?.docVersion ?? documentVersion(existing?.document);
173
+ if (!existing || actualDocVersion !== expectedDocVersion) {
174
+ throw new CanvasPageConflict(pageKey, expectedDocVersion, existing ? actualDocVersion : undefined);
175
+ }
176
+ if (!existing.document.staged) {
177
+ throw new CanvasPageValidationError(`Canvas page ${pageKey} has no staged revision.`);
178
+ }
179
+ const timestamp = (publishedAt ?? now()).toISOString();
180
+ const { staged, ...rest } = existing.document;
181
+ const document = {
182
+ ...rest,
183
+ docVersion: expectedDocVersion + 1,
184
+ updatedAt: timestamp,
185
+ published: {
186
+ page: structuredClone(staged.page),
187
+ publishedAt: timestamp,
188
+ sourceDocVersion: staged.sourceDocVersion,
189
+ },
190
+ };
191
+ const patch = { docVersion: document.docVersion, latestVersion: timestamp, document };
192
+ const affected = await repository.updateIfVersion(pageKey, expectedDocVersion, patch);
193
+ if (affected !== 1)
194
+ throw new CanvasPageConflict(pageKey, expectedDocVersion, actualDocVersion);
195
+ return { ...existing, ...patch };
196
+ },
197
+ };
198
+ }
199
+ function isUniqueError(error) {
200
+ const text = String(error instanceof Error ? error.message : error);
201
+ return /unique|duplicate|constraint/i.test(text);
202
+ }
203
+ export function createStrapiPageDocRepository(strapi, transaction) {
204
+ const metadata = strapi.db.metadata.get(CANVAS_PAGE_UID);
205
+ const tableName = metadata.tableName;
206
+ const columns = {
207
+ documentId: columnName(metadata, "documentId", "document_id"),
208
+ pageKey: columnName(metadata, "pageKey", "page_key"),
209
+ docVersion: columnName(metadata, "docVersion", "doc_version"),
210
+ latestVersion: columnName(metadata, "latestVersion", "latest_version"),
211
+ document: columnName(metadata, "document", "document"),
212
+ createdAt: columnName(metadata, "createdAt", "created_at"),
213
+ updatedAt: columnName(metadata, "updatedAt", "updated_at"),
214
+ };
215
+ function table() {
216
+ return transaction ? transaction(tableName) : strapi.db.connection(tableName);
217
+ }
218
+ function toRow(row) {
219
+ if (!row)
220
+ return undefined;
221
+ return {
222
+ id: row.id,
223
+ documentId: row[columns.documentId],
224
+ pageKey: String(row[columns.pageKey]),
225
+ docVersion: Number(row[columns.docVersion] ?? 0),
226
+ latestVersion: row[columns.latestVersion],
227
+ document: parseJson(row[columns.document]),
228
+ };
229
+ }
230
+ return {
231
+ async list() {
232
+ const rows = await table().select("*");
233
+ return rows.map((row) => toRow(row));
234
+ },
235
+ async findByPageKey(pageKey) {
236
+ const row = await table().where({ [columns.pageKey]: pageKey }).first();
237
+ return toRow(row);
238
+ },
239
+ async insert(row) {
240
+ const timestamp = new Date().toISOString();
241
+ await table().insert({
242
+ [columns.documentId]: row.documentId ?? randomUUID(),
243
+ [columns.pageKey]: row.pageKey,
244
+ [columns.docVersion]: row.docVersion,
245
+ [columns.latestVersion]: row.latestVersion ?? null,
246
+ [columns.document]: JSON.stringify(row.document),
247
+ [columns.createdAt]: timestamp,
248
+ [columns.updatedAt]: timestamp,
249
+ });
250
+ return (await this.findByPageKey(row.pageKey)) ?? row;
251
+ },
252
+ async updateIfVersion(pageKey, expectedDocVersion, patch) {
253
+ const timestamp = new Date().toISOString();
254
+ const result = await table()
255
+ .where({ [columns.pageKey]: pageKey, [columns.docVersion]: expectedDocVersion })
256
+ .update({
257
+ [columns.docVersion]: patch.docVersion,
258
+ [columns.latestVersion]: patch.latestVersion ?? null,
259
+ [columns.document]: JSON.stringify(patch.document),
260
+ [columns.updatedAt]: timestamp,
261
+ });
262
+ return Number(result);
263
+ },
264
+ async deleteIfVersion(pageKey, expectedDocVersion) {
265
+ const result = await table()
266
+ .where({ [columns.pageKey]: pageKey, [columns.docVersion]: expectedDocVersion })
267
+ .delete();
268
+ return Number(result);
269
+ },
270
+ };
271
+ }
272
+ function columnName(metadata, attribute, fallback) {
273
+ return metadata?.attributes?.[attribute]?.columnName ?? fallback;
274
+ }
275
+ function parseJson(value) {
276
+ if (typeof value !== "string")
277
+ return value;
278
+ try {
279
+ return JSON.parse(value);
280
+ }
281
+ catch {
282
+ return value;
283
+ }
284
+ }
285
+ //# sourceMappingURL=page-doc-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-doc-store.js","sourceRoot":"","sources":["../../../src/server/services/page-doc-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { BlockLibrary, CanvasPage, EditorShellBootstrap, EditorShellContent } from "@batterai/editor-shell";
2
+ import { type CanvasDocument } from "@batterai/contract";
3
+ import type { CanvasPluginConfig } from "../config";
4
+ export type CanvasSiteDocument = {
5
+ kind: "canvas-editor-site";
6
+ docVersion: number;
7
+ content: EditorShellContent;
8
+ contentTypes: EditorShellBootstrap["contentTypes"];
9
+ library: BlockLibrary;
10
+ pageOrder: string[];
11
+ canvas: Pick<CanvasDocument, "theme" | "assets" | "variables" | "layout">;
12
+ published?: {
13
+ document: CanvasDocument;
14
+ content: EditorShellContent;
15
+ library: BlockLibrary;
16
+ publishedAt: string;
17
+ sourceDocVersion: number;
18
+ };
19
+ status: EditorShellBootstrap["status"];
20
+ };
21
+ export declare class CanvasSiteConflict extends Error {
22
+ readonly expectedDocVersion: number;
23
+ readonly actualDocVersion: number;
24
+ readonly status = 409;
25
+ constructor(expectedDocVersion: number, actualDocVersion: number);
26
+ }
27
+ export declare function emptyLibrary(): BlockLibrary;
28
+ /**
29
+ * Normalizes a host-supplied `seedLibrary` plugin config value into a
30
+ * `BlockLibrary`, filling any missing keys with empty arrays. Returns
31
+ * `undefined` when no seed was configured so callers can fall back to
32
+ * `emptyLibrary()`.
33
+ */
34
+ export declare function normalizeLibrary(seed?: CanvasPluginConfig["seedLibrary"]): BlockLibrary | undefined;
35
+ export declare function defaultHomePage(_now?: Date): CanvasPage;
36
+ export declare function defaultSiteDocument(now?: Date): CanvasSiteDocument;
37
+ export declare function createSiteStore(strapi: any, seedLibrary?: CanvasPluginConfig["seedLibrary"], transaction?: ((tableName: string) => any)): {
38
+ readOrCreate(): Promise<CanvasSiteDocument>;
39
+ update(mutator: (document: CanvasSiteDocument) => CanvasSiteDocument): Promise<CanvasSiteDocument>;
40
+ updateIfVersion(expectedDocVersion: number, mutator: (document: CanvasSiteDocument) => CanvasSiteDocument): Promise<CanvasSiteDocument>;
41
+ };
42
+ export declare function normalizeSiteDocument(document: unknown): CanvasSiteDocument;
43
+ //# sourceMappingURL=site-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"site-store.d.ts","sourceRoot":"","sources":["../../../src/server/services/site-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjH,OAAO,EAAgC,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEvF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAEpD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,oBAAoB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,YAAY,EAAE,oBAAoB,CAAC,cAAc,CAAC,CAAC;IACnD,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC,CAAC;IAC1E,SAAS,CAAC,EAAE;QACV,QAAQ,EAAE,cAAc,CAAC;QACzB,OAAO,EAAE,kBAAkB,CAAC;QAC5B,OAAO,EAAE,YAAY,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,MAAM,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAC;CACxC,CAAC;AAEF,qBAAa,kBAAmB,SAAQ,KAAK;IAIzC,QAAQ,CAAC,kBAAkB,EAAE,MAAM;IACnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM;IAJnC,QAAQ,CAAC,MAAM,OAAO;gBAGX,kBAAkB,EAAE,MAAM,EAC1B,gBAAgB,EAAE,MAAM;CAKpC;AAED,wBAAgB,YAAY,IAAI,YAAY,CAE3C;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,kBAAkB,CAAC,aAAa,CAAC,GAAG,YAAY,GAAG,SAAS,CAQnG;AAED,wBAAgB,eAAe,CAAC,IAAI,OAAa,GAAG,UAAU,CAQ7D;AAED,wBAAgB,mBAAmB,CAAC,GAAG,OAAa,GAAG,kBAAkB,CA8BxE;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,GAAG,EACX,WAAW,CAAC,EAAE,kBAAkB,CAAC,aAAa,CAAC,EAC/C,WAAW,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,MAAM,KAAK,GAAG,CAAC;oBAwBlB,OAAO,CAAC,kBAAkB,CAAC;oBAsC3B,CAAC,QAAQ,EAAE,kBAAkB,KAAK,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;wCAgBlF,MAAM,WACjB,CAAC,QAAQ,EAAE,kBAAkB,KAAK,kBAAkB,GAC5D,OAAO,CAAC,kBAAkB,CAAC;EA4BjC;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,OAAO,GAAG,kBAAkB,CAkB3E"}