@supernova-studio/client 0.59.12 → 1.0.0-alpha.11

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 (204) hide show
  1. package/dist/index.d.mts +1592 -1952
  2. package/dist/index.d.ts +1592 -1952
  3. package/dist/index.js +865 -392
  4. package/dist/index.js.map +1 -1
  5. package/dist/index.mjs +2569 -2096
  6. package/dist/index.mjs.map +1 -1
  7. package/package.json +4 -3
  8. package/src/api/client.ts +0 -31
  9. package/src/api/conversion/documentation/documentation-group-v1-to-dto.ts +0 -114
  10. package/src/api/conversion/documentation/documentation-group-v2-to-dto.ts +0 -92
  11. package/src/api/conversion/documentation/documentation-item-configuration-v1-to-dto.ts +0 -52
  12. package/src/api/conversion/documentation/documentation-item-configuration-v2-to-dto.ts +0 -34
  13. package/src/api/conversion/documentation/documentation-page-to-dto-utils.ts +0 -131
  14. package/src/api/conversion/documentation/documentation-page-v1-to-dto.ts +0 -69
  15. package/src/api/conversion/documentation/documentation-page-v2-to-dto.ts +0 -78
  16. package/src/api/conversion/documentation/index.ts +0 -7
  17. package/src/api/conversion/export/index.ts +0 -1
  18. package/src/api/conversion/export/pipeline.ts +0 -26
  19. package/src/api/conversion/index.ts +0 -3
  20. package/src/api/conversion/integrations/git.ts +0 -37
  21. package/src/api/conversion/integrations/index.ts +0 -2
  22. package/src/api/conversion/integrations/integration.ts +0 -37
  23. package/src/api/dto/aux/color.ts +0 -7
  24. package/src/api/dto/aux/index.ts +0 -3
  25. package/src/api/dto/aux/meta.ts +0 -8
  26. package/src/api/dto/aux/pagination.ts +0 -8
  27. package/src/api/dto/bff/app-bootstrap-data.ts +0 -20
  28. package/src/api/dto/bff/index.ts +0 -1
  29. package/src/api/dto/collections/index.ts +0 -1
  30. package/src/api/dto/collections/token-collection.ts +0 -24
  31. package/src/api/dto/design-systems/brand.ts +0 -44
  32. package/src/api/dto/design-systems/component.ts +0 -40
  33. package/src/api/dto/design-systems/contact.ts +0 -11
  34. package/src/api/dto/design-systems/data-source.ts +0 -141
  35. package/src/api/dto/design-systems/design-system.ts +0 -68
  36. package/src/api/dto/design-systems/elements-diff.ts +0 -14
  37. package/src/api/dto/design-systems/figma-variables.ts +0 -108
  38. package/src/api/dto/design-systems/import-job.ts +0 -61
  39. package/src/api/dto/design-systems/index.ts +0 -15
  40. package/src/api/dto/design-systems/members.ts +0 -50
  41. package/src/api/dto/design-systems/redirects.ts +0 -33
  42. package/src/api/dto/design-systems/role.ts +0 -11
  43. package/src/api/dto/design-systems/stats.ts +0 -19
  44. package/src/api/dto/design-systems/version-room.ts +0 -12
  45. package/src/api/dto/design-systems/version.ts +0 -56
  46. package/src/api/dto/design-systems/view.ts +0 -45
  47. package/src/api/dto/design-tokens/design-token.ts +0 -78
  48. package/src/api/dto/design-tokens/index.ts +0 -1
  49. package/src/api/dto/documentation/anchor.ts +0 -15
  50. package/src/api/dto/documentation/approvals.ts +0 -15
  51. package/src/api/dto/documentation/block-definition.ts +0 -28
  52. package/src/api/dto/documentation/block.ts +0 -6
  53. package/src/api/dto/documentation/documentation-page-snapshot.ts +0 -18
  54. package/src/api/dto/documentation/index.ts +0 -8
  55. package/src/api/dto/documentation/link-preview.ts +0 -23
  56. package/src/api/dto/documentation/publish.ts +0 -23
  57. package/src/api/dto/documentation/room.ts +0 -12
  58. package/src/api/dto/elements/components/figma-component-group.ts +0 -19
  59. package/src/api/dto/elements/components/figma-component.ts +0 -56
  60. package/src/api/dto/elements/components/index.ts +0 -2
  61. package/src/api/dto/elements/documentation/draft-state.ts +0 -37
  62. package/src/api/dto/elements/documentation/group-action.ts +0 -108
  63. package/src/api/dto/elements/documentation/group-v1.ts +0 -35
  64. package/src/api/dto/elements/documentation/group-v2.ts +0 -117
  65. package/src/api/dto/elements/documentation/hierarchy.ts +0 -22
  66. package/src/api/dto/elements/documentation/index.ts +0 -13
  67. package/src/api/dto/elements/documentation/item-configuration-v1.ts +0 -24
  68. package/src/api/dto/elements/documentation/item-configuration-v2.ts +0 -14
  69. package/src/api/dto/elements/documentation/metadata.ts +0 -8
  70. package/src/api/dto/elements/documentation/page-actions-v2.ts +0 -121
  71. package/src/api/dto/elements/documentation/page-content.ts +0 -15
  72. package/src/api/dto/elements/documentation/page-v1.ts +0 -21
  73. package/src/api/dto/elements/documentation/page-v2.ts +0 -123
  74. package/src/api/dto/elements/documentation/structure.ts +0 -37
  75. package/src/api/dto/elements/elements-action-v2.ts +0 -117
  76. package/src/api/dto/elements/figma-nodes/figma-node-v1.ts +0 -32
  77. package/src/api/dto/elements/figma-nodes/figma-node-v2.ts +0 -32
  78. package/src/api/dto/elements/figma-nodes/figma-node.ts +0 -103
  79. package/src/api/dto/elements/figma-nodes/index.ts +0 -4
  80. package/src/api/dto/elements/figma-nodes/node-actions-v2.ts +0 -44
  81. package/src/api/dto/elements/frame-node-structures/frame-node-structure.ts +0 -17
  82. package/src/api/dto/elements/frame-node-structures/index.ts +0 -1
  83. package/src/api/dto/elements/get-elements-v2.ts +0 -27
  84. package/src/api/dto/elements/index.ts +0 -7
  85. package/src/api/dto/elements/properties/index.ts +0 -2
  86. package/src/api/dto/elements/properties/property-definitions.ts +0 -75
  87. package/src/api/dto/elements/properties/property-values.ts +0 -38
  88. package/src/api/dto/export/exporter-property.ts +0 -105
  89. package/src/api/dto/export/exporter.ts +0 -87
  90. package/src/api/dto/export/filter.ts +0 -6
  91. package/src/api/dto/export/index.ts +0 -5
  92. package/src/api/dto/export/job.ts +0 -96
  93. package/src/api/dto/export/pipeline.ts +0 -43
  94. package/src/api/dto/figma-components/assets/download.ts +0 -30
  95. package/src/api/dto/figma-components/assets/index.ts +0 -1
  96. package/src/api/dto/figma-components/index.ts +0 -1
  97. package/src/api/dto/index.ts +0 -13
  98. package/src/api/dto/liveblocks/auth-response.ts +0 -7
  99. package/src/api/dto/liveblocks/index.ts +0 -1
  100. package/src/api/dto/themes/index.ts +0 -2
  101. package/src/api/dto/themes/override.ts +0 -27
  102. package/src/api/dto/themes/theme.ts +0 -45
  103. package/src/api/dto/users/authenticated-user.ts +0 -46
  104. package/src/api/dto/users/index.ts +0 -3
  105. package/src/api/dto/users/update.ts +0 -8
  106. package/src/api/dto/users/user.ts +0 -31
  107. package/src/api/dto/workspaces/git.ts +0 -32
  108. package/src/api/dto/workspaces/index.ts +0 -6
  109. package/src/api/dto/workspaces/integrations.ts +0 -34
  110. package/src/api/dto/workspaces/invitations.ts +0 -30
  111. package/src/api/dto/workspaces/membership.ts +0 -41
  112. package/src/api/dto/workspaces/npm-registry.ts +0 -35
  113. package/src/api/dto/workspaces/workspace.ts +0 -34
  114. package/src/api/endpoints/codegen/codegen.ts +0 -16
  115. package/src/api/endpoints/codegen/exporters.ts +0 -25
  116. package/src/api/endpoints/codegen/index.ts +0 -4
  117. package/src/api/endpoints/codegen/jobs.ts +0 -15
  118. package/src/api/endpoints/codegen/pipelines.ts +0 -44
  119. package/src/api/endpoints/design-system/bff.ts +0 -13
  120. package/src/api/endpoints/design-system/contact.ts +0 -12
  121. package/src/api/endpoints/design-system/design-systems.ts +0 -55
  122. package/src/api/endpoints/design-system/index.ts +0 -6
  123. package/src/api/endpoints/design-system/members.ts +0 -24
  124. package/src/api/endpoints/design-system/sources.ts +0 -35
  125. package/src/api/endpoints/design-system/versions/brands.ts +0 -45
  126. package/src/api/endpoints/design-system/versions/documentation.ts +0 -27
  127. package/src/api/endpoints/design-system/versions/ds-components.ts +0 -28
  128. package/src/api/endpoints/design-system/versions/elements-action.ts +0 -63
  129. package/src/api/endpoints/design-system/versions/elements.ts +0 -27
  130. package/src/api/endpoints/design-system/versions/figma-component-groups.ts +0 -13
  131. package/src/api/endpoints/design-system/versions/figma-components.ts +0 -13
  132. package/src/api/endpoints/design-system/versions/figma-frame-structures.ts +0 -13
  133. package/src/api/endpoints/design-system/versions/import-jobs.ts +0 -13
  134. package/src/api/endpoints/design-system/versions/index.ts +0 -18
  135. package/src/api/endpoints/design-system/versions/overrides.ts +0 -17
  136. package/src/api/endpoints/design-system/versions/property-definitions.ts +0 -43
  137. package/src/api/endpoints/design-system/versions/property-values.ts +0 -25
  138. package/src/api/endpoints/design-system/versions/stats.ts +0 -12
  139. package/src/api/endpoints/design-system/versions/themes.ts +0 -35
  140. package/src/api/endpoints/design-system/versions/token-collections.ts +0 -13
  141. package/src/api/endpoints/design-system/versions/token-groups.ts +0 -28
  142. package/src/api/endpoints/design-system/versions/tokens.ts +0 -27
  143. package/src/api/endpoints/design-system/versions/versions.ts +0 -87
  144. package/src/api/endpoints/index.ts +0 -5
  145. package/src/api/endpoints/liveblocks.ts +0 -14
  146. package/src/api/endpoints/users.ts +0 -26
  147. package/src/api/endpoints/workspaces/index.ts +0 -3
  148. package/src/api/endpoints/workspaces/workspace-invites.ts +0 -34
  149. package/src/api/endpoints/workspaces/workspace-members.ts +0 -31
  150. package/src/api/endpoints/workspaces/workspaces.ts +0 -47
  151. package/src/api/index.ts +0 -6
  152. package/src/api/payloads/design-systems/index.ts +0 -2
  153. package/src/api/payloads/design-systems/update-design-system.ts +0 -29
  154. package/src/api/payloads/design-systems/version.ts +0 -29
  155. package/src/api/payloads/documentation/block-definitions.ts +0 -12
  156. package/src/api/payloads/documentation/design-data-doc-diff.ts +0 -7
  157. package/src/api/payloads/documentation/index.ts +0 -2
  158. package/src/api/payloads/export/index.ts +0 -1
  159. package/src/api/payloads/export/pipeline.ts +0 -74
  160. package/src/api/payloads/index.ts +0 -6
  161. package/src/api/payloads/liveblocks/auth.ts +0 -7
  162. package/src/api/payloads/liveblocks/index.ts +0 -1
  163. package/src/api/payloads/users/index.ts +0 -2
  164. package/src/api/payloads/users/notifications/index.ts +0 -1
  165. package/src/api/payloads/users/notifications/notification-settings.ts +0 -17
  166. package/src/api/payloads/users/profile/index.ts +0 -1
  167. package/src/api/payloads/users/profile/update.ts +0 -4
  168. package/src/api/payloads/workspaces/index.ts +0 -3
  169. package/src/api/payloads/workspaces/transfer-ownership.ts +0 -7
  170. package/src/api/payloads/workspaces/workspace-configuration.ts +0 -50
  171. package/src/api/payloads/workspaces/workspace-integrations.ts +0 -26
  172. package/src/api/transport/index.ts +0 -2
  173. package/src/api/transport/request-executor-error.ts +0 -66
  174. package/src/api/transport/request-executor.ts +0 -87
  175. package/src/events/design-system.ts +0 -21
  176. package/src/events/event.ts +0 -6
  177. package/src/events/index.ts +0 -2
  178. package/src/index.ts +0 -4
  179. package/src/utils/figma.ts +0 -72
  180. package/src/utils/hash.ts +0 -62
  181. package/src/utils/index.ts +0 -3
  182. package/src/utils/query.ts +0 -18
  183. package/src/yjs/design-system-content/documentation-hierarchy.ts +0 -35
  184. package/src/yjs/design-system-content/index.ts +0 -2
  185. package/src/yjs/design-system-content/item-configuration.ts +0 -93
  186. package/src/yjs/docs-editor/blocks-to-prosemirror.ts +0 -764
  187. package/src/yjs/docs-editor/index.ts +0 -7
  188. package/src/yjs/docs-editor/list-tree-builder.ts +0 -127
  189. package/src/yjs/docs-editor/mock.ts +0 -2142
  190. package/src/yjs/docs-editor/model/block.ts +0 -8
  191. package/src/yjs/docs-editor/model/index.ts +0 -2
  192. package/src/yjs/docs-editor/model/page.ts +0 -8
  193. package/src/yjs/docs-editor/prosemirror/index.ts +0 -3
  194. package/src/yjs/docs-editor/prosemirror/inner-editor-schema.ts +0 -145
  195. package/src/yjs/docs-editor/prosemirror/main-editor-schema.ts +0 -577
  196. package/src/yjs/docs-editor/prosemirror/types.ts +0 -19
  197. package/src/yjs/docs-editor/prosemirror-to-blocks.ts +0 -975
  198. package/src/yjs/docs-editor/utils.ts +0 -115
  199. package/src/yjs/index.ts +0 -3
  200. package/src/yjs/version-room/backend.ts +0 -83
  201. package/src/yjs/version-room/base.ts +0 -252
  202. package/src/yjs/version-room/frontend.ts +0 -463
  203. package/src/yjs/version-room/index.ts +0 -4
  204. package/src/yjs/version-room/utils.ts +0 -109
@@ -1,463 +0,0 @@
1
- import {
2
- DocumentationItemConfigurationV2,
3
- DocumentationPageSnapshot,
4
- DocumentationPageV2,
5
- ElementGroup,
6
- ElementGroupSnapshot,
7
- PageBlockDefinition,
8
- defaultDocumentationItemConfigurationV2,
9
- mapByUnique,
10
- pickLatestGroupSnapshots,
11
- pickLatestPageSnapshots,
12
- recordToMap,
13
- } from "@supernova-studio/model";
14
- import * as Y from "yjs";
15
- import {
16
- DTODocumentationDraftState,
17
- DTODocumentationDraftStateUpdated,
18
- DTODocumentationGroupApprovalState,
19
- DTODocumentationHierarchyV2,
20
- DTODocumentationPageApprovalState,
21
- documentationItemConfigurationToDTOV2,
22
- documentationPagesToDTOV2,
23
- elementGroupsToDocumentationGroupDTOV2,
24
- } from "../../api";
25
- import { DTODocumentationPublishMetadata } from "../../api/dto/elements/documentation/metadata";
26
- import { generateHash } from "../../utils";
27
- import { DocumentationPageEditorModel } from "../docs-editor";
28
- import { VersionRoomBaseYDoc } from "./base";
29
- import { generatePageContentHash } from "./utils";
30
-
31
- type ItemState = {
32
- title: string;
33
- configuration: DocumentationItemConfigurationV2;
34
- contentHash: string;
35
- };
36
-
37
- export class FrontendVersionRoomYDoc {
38
- private readonly yDoc: Y.Doc;
39
-
40
- constructor(yDoc: Y.Doc, private readonly debug = false) {
41
- this.yDoc = yDoc;
42
- }
43
-
44
- //
45
- // Hierarchy
46
- //
47
-
48
- getDocumentationHierarchy(options: { includeDeletedContent?: boolean } = {}): DTODocumentationHierarchyV2 {
49
- const includeDeletedContent = options.includeDeletedContent ?? false;
50
-
51
- const doc = new VersionRoomBaseYDoc(this.yDoc);
52
-
53
- // Read current room data
54
- const pages = doc.getPages();
55
- const groups = doc.getGroups();
56
- const pageSnapshots = doc.getPageSnapshots();
57
- const groupSnapshots = doc.getGroupSnapshots();
58
- const liveblocksRoomIds = recordToMap(doc.getDocumentationPageLiveblocksRoomIds());
59
-
60
- if (includeDeletedContent) {
61
- pages.push(...this.getDeletedPages(pages, pageSnapshots));
62
- groups.push(...this.getDeletedGroups(groups, groupSnapshots));
63
- }
64
-
65
- const settings = doc.getDocumentationInternalSettings();
66
-
67
- // Convert pages to DTOs
68
- const pageDTOs = documentationPagesToDTOV2(pages, groups, settings.routingVersion, liveblocksRoomIds);
69
- const groupDTOs = elementGroupsToDocumentationGroupDTOV2(groups, pages);
70
-
71
- // If draft feature is not yet adopted, no snapshot-based features should not be provided
72
- if (!settings.isDraftFeatureAdopted) {
73
- return {
74
- pages: pageDTOs,
75
- groups: groupDTOs,
76
- };
77
- }
78
-
79
- const pageDraftStates = this.buildPageDraftCreatedAndUpdatedStates(pages, pageSnapshots);
80
- const pageDraftDeletedStates = this.buildPageDraftDeletedStates(pages, pageSnapshots);
81
- const pagePublishedMetadata = this.buildPagePublishedMetadata(pages, pageSnapshots);
82
- const pageApprovalStates = this.buildPageApprovalStates(pages);
83
-
84
- pageDTOs.forEach(p => {
85
- // Assign draft state
86
- const draftState = pageDraftDeletedStates.get(p.id) ?? pageDraftStates.get(p.id);
87
- draftState && (p.draftState = draftState);
88
-
89
- // Assign publish metadata
90
- const publishMetadata = pagePublishedMetadata.get(p.id);
91
- publishMetadata && (p.publishMetadata = publishMetadata);
92
-
93
- // Assign approval state
94
- const approvalState = pageApprovalStates.get(p.id);
95
- approvalState && (p.approvalState = approvalState);
96
- });
97
-
98
- const groupDraftStates = this.buildGroupDraftCreatedAndUpdatedStates(groups, groupSnapshots);
99
- const groupDraftDeletedStates = this.buildGroupDraftDeletedStates(groups, groupSnapshots);
100
- const groupPublishedMetadata = this.buildGroupPublishedMetadata(groups, groupSnapshots);
101
- const groupApprovalStates = this.buildGroupApprovalStates(groups, groupSnapshots);
102
- groupDTOs.forEach(g => {
103
- // Assign draft state
104
- const draftState = groupDraftDeletedStates.get(g.id) ?? groupDraftStates.get(g.id);
105
- draftState && (g.draftState = draftState);
106
-
107
- // Assign publish metadata
108
- const publishMetadata = groupPublishedMetadata.get(g.id);
109
- publishMetadata && (g.publishMetadata = publishMetadata);
110
-
111
- const approvalState = groupApprovalStates.get(g.id);
112
- approvalState && (g.approvalState = approvalState);
113
- });
114
-
115
- return {
116
- pages: pageDTOs,
117
- groups: groupDTOs,
118
- };
119
- }
120
-
121
- //
122
- // Drafts - Pages
123
- //
124
-
125
- private buildPageDraftDeletedStates(
126
- pages: DocumentationPageV2[],
127
- pageSnapshots: DocumentationPageSnapshot[]
128
- ): Map<string, DTODocumentationDraftState> {
129
- const deletedSnapshotsByPageId = mapByUnique(
130
- pickLatestPageSnapshots(pageSnapshots.filter(s => s.reason === "Deletion")),
131
- s => s.page.id
132
- );
133
-
134
- const result = new Map<string, DTODocumentationDraftState>();
135
-
136
- pages.forEach(page => {
137
- const deletedSnapshot = deletedSnapshotsByPageId.get(page.id);
138
- if (!deletedSnapshot) return;
139
-
140
- result.set(page.id, {
141
- changeType: "Deleted",
142
- deletedAt: deletedSnapshot.createdAt,
143
- deletedByUserId: deletedSnapshot.createdByUserId,
144
- });
145
- });
146
-
147
- return result;
148
- }
149
-
150
- private buildPageDraftCreatedAndUpdatedStates(
151
- pages: DocumentationPageV2[],
152
- pageSnapshots: DocumentationPageSnapshot[]
153
- ): Map<string, DTODocumentationDraftState> {
154
- const doc = new VersionRoomBaseYDoc(this.yDoc);
155
-
156
- // Read room data
157
- const pageHashes = doc.getDocumentationPageContentHashes();
158
- const publishedSnapshots = pickLatestPageSnapshots(pageSnapshots.filter(s => s.reason === "Publish"));
159
-
160
- const publishedSnapshotsByPageId = mapByUnique(publishedSnapshots, s => s.page.id);
161
-
162
- const result = new Map<string, DTODocumentationDraftState>();
163
-
164
- pages.forEach(page => {
165
- // Published state
166
- const snapshot = publishedSnapshotsByPageId.get(page.id);
167
- let publishedState: ItemState | undefined;
168
- if (snapshot) {
169
- publishedState = this.itemStateFromPage(snapshot.page, snapshot.pageContentHash);
170
- }
171
-
172
- // Current state - if content hash is undefined, it means that the page hasn't changed
173
- const currentPageContentHash = pageHashes[page.persistentId] ?? snapshot?.pageContentHash ?? "";
174
- const currentState: ItemState = this.itemStateFromPage(page, currentPageContentHash);
175
-
176
- // Calculate draft
177
- const draftState = this.createDraftState(page.persistentId, currentState, publishedState);
178
- if (draftState) result.set(page.id, draftState);
179
- });
180
-
181
- return result;
182
- }
183
-
184
- private itemStateFromPage(page: DocumentationPageV2, pageContentHash: string): ItemState {
185
- return {
186
- title: page.meta.name,
187
- configuration: page.data.configuration ?? defaultDocumentationItemConfigurationV2,
188
- contentHash: pageContentHash,
189
- };
190
- }
191
-
192
- private getDeletedPages(
193
- pages: DocumentationPageV2[],
194
- pageSnapshots: DocumentationPageSnapshot[]
195
- ): DocumentationPageV2[] {
196
- const existingPageIds = new Set(pages.map(p => p.id));
197
- const latestSnapshots = pickLatestPageSnapshots(pageSnapshots);
198
- return latestSnapshots.filter(s => !existingPageIds.has(s.page.id)).map(s => s.page);
199
- }
200
-
201
- private buildPagePublishedMetadata(
202
- pages: DocumentationPageV2[],
203
- pageSnapshots: DocumentationPageSnapshot[]
204
- ): Map<string, DTODocumentationPublishMetadata> {
205
- const publishedPageSnapshotsById = mapByUnique(
206
- pickLatestPageSnapshots(pageSnapshots.filter(s => s.reason === "Publish")),
207
- s => s.page.id
208
- );
209
-
210
- const result = new Map<string, DTODocumentationPublishMetadata>();
211
-
212
- pages.forEach(p => {
213
- const publishedSnapshot = publishedPageSnapshotsById.get(p.id);
214
- if (!publishedSnapshot) return;
215
-
216
- result.set(p.id, {
217
- lastPublishedAt: publishedSnapshot.createdAt,
218
- lastPublishedByUserId: publishedSnapshot.createdByUserId,
219
- });
220
- });
221
-
222
- return result;
223
- }
224
-
225
- //
226
- // Drafts - Groups
227
- //
228
-
229
- private buildGroupDraftDeletedStates(
230
- groups: ElementGroup[],
231
- groupSnapshots: ElementGroupSnapshot[]
232
- ): Map<string, DTODocumentationDraftState> {
233
- const deletedSnapshotsByGroupId = mapByUnique(
234
- pickLatestGroupSnapshots(groupSnapshots.filter(s => s.reason === "Deletion")),
235
- s => s.group.id
236
- );
237
-
238
- const result = new Map<string, DTODocumentationDraftState>();
239
-
240
- groups.forEach(group => {
241
- if (!group.parentPersistentId) return;
242
-
243
- const deletedSnapshot = deletedSnapshotsByGroupId.get(group.id);
244
- if (!deletedSnapshot) return;
245
-
246
- result.set(group.id, {
247
- changeType: "Deleted",
248
- deletedAt: deletedSnapshot.createdAt,
249
- deletedByUserId: deletedSnapshot.createdByUserId,
250
- });
251
- });
252
-
253
- return result;
254
- }
255
-
256
- private buildGroupDraftCreatedAndUpdatedStates(
257
- groups: ElementGroup[],
258
- groupSnapshots: ElementGroupSnapshot[]
259
- ): Map<string, DTODocumentationDraftState> {
260
- // Read room data
261
- const publishedSnapshots = pickLatestGroupSnapshots(groupSnapshots.filter(s => s.reason === "Publish"));
262
-
263
- const publishedSnapshotsByGroupId = mapByUnique(publishedSnapshots, s => s.group.id);
264
-
265
- const result = new Map<string, DTODocumentationDraftState>();
266
-
267
- groups.forEach(group => {
268
- if (!group.parentPersistentId) return;
269
-
270
- // Current state
271
- const currentState: ItemState = this.itemStateFromGroup(group);
272
-
273
- // Published state
274
- const snapshot = publishedSnapshotsByGroupId.get(group.id);
275
- let publishedState: ItemState | undefined;
276
- if (snapshot) {
277
- publishedState = this.itemStateFromGroup(snapshot.group);
278
- }
279
-
280
- // Calculate draft
281
- const draftState = this.createDraftState(group.persistentId, currentState, publishedState);
282
- if (draftState) result.set(group.id, draftState);
283
- });
284
-
285
- return result;
286
- }
287
-
288
- private itemStateFromGroup(group: ElementGroup): ItemState {
289
- return {
290
- title: group.meta.name,
291
- configuration: group.data?.configuration ?? defaultDocumentationItemConfigurationV2,
292
- contentHash: "-",
293
- };
294
- }
295
-
296
- private getDeletedGroups(groups: ElementGroup[], groupSnapshots: ElementGroupSnapshot[]): ElementGroup[] {
297
- const existingGroupIds = new Set(groups.map(p => p.id));
298
- const latestSnapshots = pickLatestGroupSnapshots(groupSnapshots);
299
- return latestSnapshots.filter(s => !existingGroupIds.has(s.group.id)).map(s => s.group);
300
- }
301
-
302
- private buildGroupPublishedMetadata(
303
- groups: ElementGroup[],
304
- groupSnapshots: ElementGroupSnapshot[]
305
- ): Map<string, DTODocumentationPublishMetadata> {
306
- const publishedGroupSnapshotsById = mapByUnique(
307
- pickLatestGroupSnapshots(groupSnapshots.filter(s => s.reason === "Publish")),
308
- s => s.group.id
309
- );
310
-
311
- const result = new Map<string, DTODocumentationPublishMetadata>();
312
-
313
- groups.forEach(g => {
314
- if (!g.parentPersistentId) return;
315
-
316
- const publishedSnapshot = publishedGroupSnapshotsById.get(g.id);
317
- if (!publishedSnapshot) return;
318
-
319
- result.set(g.id, {
320
- lastPublishedAt: publishedSnapshot.createdAt,
321
- lastPublishedByUserId: publishedSnapshot.createdByUserId,
322
- });
323
- });
324
-
325
- return result;
326
- }
327
-
328
- //
329
- // Drafts - Shared
330
- //
331
-
332
- private createDraftState(
333
- itemPersistentId: string,
334
- currentState: ItemState,
335
- publishedState: ItemState | undefined
336
- ): DTODocumentationDraftState | undefined {
337
- if (!publishedState) {
338
- // New item (hasn't been published yet)
339
- return { changeType: "Created" };
340
- }
341
-
342
- // Compare current item state to the published state
343
- const updatedDraftState: DTODocumentationDraftStateUpdated = {
344
- changeType: "Updated",
345
- changes: {},
346
- };
347
-
348
- if (currentState.title !== publishedState.title) {
349
- if (this.debug) {
350
- console.log(`Item ${itemPersistentId} (${currentState.title}): updated title`);
351
- }
352
-
353
- updatedDraftState.changes.previousTitle = publishedState.title;
354
- }
355
-
356
- const currentConfigHash = generateHash(currentState.configuration, this.debug);
357
- const publishedConfigHash = generateHash(publishedState.configuration, this.debug);
358
-
359
- if (currentConfigHash !== publishedConfigHash) {
360
- if (this.debug) {
361
- console.log(`Item ${itemPersistentId} (${currentState.title}): updated configuration`);
362
- }
363
-
364
- const configurationDto = documentationItemConfigurationToDTOV2(publishedState.configuration);
365
- updatedDraftState.changes.previousConfiguration = configurationDto;
366
- }
367
-
368
- if (currentState.contentHash !== publishedState.contentHash) {
369
- if (this.debug) {
370
- console.log(`Item ${itemPersistentId} (${currentState.title}): updated content hash`);
371
- }
372
-
373
- updatedDraftState.changes.previousContentHash = publishedState.contentHash;
374
- }
375
-
376
- if (Object.keys(updatedDraftState.changes).length) {
377
- // Item has at least one of the draft changes
378
- return updatedDraftState;
379
- }
380
-
381
- // Item has no draft changes compared to the published item
382
- return undefined;
383
- }
384
-
385
- private buildGroupApprovalStates(groups: ElementGroup[], groupSnapshots: ElementGroupSnapshot[]) {
386
- const result = new Map<string, DTODocumentationGroupApprovalState>();
387
- const allGroups = [...groups, ...groupSnapshots];
388
- for (const g of allGroups) {
389
- const approvalState: DTODocumentationGroupApprovalState = {
390
- approvalState: "Approved",
391
- designSystemVersionId: g.designSystemVersionId,
392
- persistentId: g.persistentId,
393
- groupId: g.id,
394
- };
395
- result.set(g.id, approvalState);
396
- }
397
- return result;
398
- }
399
-
400
- //
401
- // Update page content hash
402
- //
403
-
404
- notifyDocumentationPageContentUpdated(
405
- pageId: string,
406
- content: DocumentationPageEditorModel,
407
- definitions: PageBlockDefinition[]
408
- ) {
409
- const pageContentHash = generatePageContentHash(content, definitions, this.debug);
410
- if (this.debug) {
411
- console.log(`Will set page content hash: '${pageId}' : '${pageContentHash}'`);
412
- }
413
-
414
- new VersionRoomBaseYDoc(this.yDoc).updateDocumentationPageContentHashes({
415
- [pageId]: pageContentHash,
416
- });
417
- }
418
-
419
- //
420
- // Misc
421
- //
422
-
423
- isDraftFeatureAdopted() {
424
- const doc = new VersionRoomBaseYDoc(this.yDoc);
425
- const settings = doc.getDocumentationInternalSettings();
426
- return settings.isDraftFeatureAdopted;
427
- }
428
-
429
- hasPublishedDocumentationContent() {
430
- const doc = new VersionRoomBaseYDoc(this.yDoc);
431
-
432
- return (
433
- doc.getPageSnapshots().filter(s => s.reason === "Publish").length > 0 ||
434
- doc.getGroupSnapshots().filter(s => s.reason === "Publish").length > 0
435
- );
436
- }
437
-
438
- isApprovalsFeatureEnabled() {
439
- const doc = new VersionRoomBaseYDoc(this.yDoc);
440
- const settings = doc.getDocumentationInternalSettings();
441
- return settings.isApprovalFeatureEnabled;
442
- }
443
-
444
- isApprovalRequiredForPublishing() {
445
- const doc = new VersionRoomBaseYDoc(this.yDoc);
446
- const settings = doc.getDocumentationInternalSettings();
447
- return settings.approvalRequiredForPublishing;
448
- }
449
-
450
- private buildPageApprovalStates(pages: DocumentationPageV2[]) {
451
- const doc = new VersionRoomBaseYDoc(this.yDoc);
452
- const pageIds = pages.map(p => p.id);
453
- const result = new Map<string, DTODocumentationPageApprovalState>();
454
- const approvals = doc.getApprovals();
455
- for (const pId of pageIds) {
456
- const approval = approvals.find(approval => approval.pageId === pId);
457
- if (approval) {
458
- result.set(pId, approval);
459
- }
460
- }
461
- return result;
462
- }
463
- }
@@ -1,4 +0,0 @@
1
- export * from "./backend";
2
- export * from "./base";
3
- export * from "./frontend";
4
- export * from "./utils";
@@ -1,109 +0,0 @@
1
- import {
2
- PageBlockDefinition,
3
- PageBlockDefinitionsMap,
4
- PageBlockItemMultiRichTextValue,
5
- PageBlockItemRichTextValue,
6
- PageBlockItemTableValue,
7
- PageBlockText,
8
- mapPageBlockItemValuesV2,
9
- removeCommentSpans,
10
- } from "@supernova-studio/model";
11
- import { generateHash } from "../../utils";
12
- import { DocumentationPageEditorModel } from "../docs-editor";
13
-
14
- export function generatePageContentHash(
15
- content: DocumentationPageEditorModel,
16
- definitions: PageBlockDefinition[],
17
- debug = false
18
- ) {
19
- let sanitizedContent = structuredClone(content);
20
-
21
- // Remove comment spans
22
- sanitizedContent = sanitizePageContents(sanitizedContent, definitions);
23
-
24
- // Make sure hashes of empty pages always match
25
- if (isPageContentEmpty(sanitizedContent)) {
26
- sanitizedContent = { blocks: [] };
27
- }
28
-
29
- return generateHash(sanitizedContent, debug);
30
- }
31
-
32
- /**
33
- * Empty page content can be one of the following:
34
- * - page without any blocks
35
- * - page with a single block, the block is a paragraph whithout any text
36
- */
37
- function isPageContentEmpty(content: DocumentationPageEditorModel): boolean {
38
- if (content.blocks.length > 1) return false;
39
- if (content.blocks.length < 1) return true;
40
-
41
- const singleBlock = content.blocks[0];
42
- if (singleBlock.type !== "Block" || singleBlock.data.packageId !== "io.supernova.block.rich-text") {
43
- return false;
44
- }
45
-
46
- const singleItem = singleBlock.data.items[0];
47
-
48
- // Block has no value, effectively the same as empty value
49
- if (!singleItem || !singleItem.props["text"]) return true;
50
-
51
- const textValue = singleItem.props["text"] as PageBlockItemRichTextValue;
52
- return !textValue.value.spans.length;
53
- }
54
-
55
- function sanitizePageContents(
56
- content: DocumentationPageEditorModel,
57
- definitions: PageBlockDefinition[]
58
- ): DocumentationPageEditorModel {
59
- const defMap = new PageBlockDefinitionsMap(definitions);
60
-
61
- mapPageBlockItemValuesV2(content.blocks, defMap, (block, item, prop, value) => {
62
- if (prop.type === "RichText") {
63
- const richTextValue = value as PageBlockItemRichTextValue;
64
- return {
65
- ...richTextValue,
66
- value: sanitizeRichText(richTextValue.value),
67
- };
68
- }
69
-
70
- if (prop.type === "MultiRichText") {
71
- const multiRichTextValue = value as PageBlockItemMultiRichTextValue;
72
- return {
73
- ...multiRichTextValue,
74
- value: multiRichTextValue.value.map(sanitizeRichText),
75
- };
76
- }
77
-
78
- if (prop.type === "Table") {
79
- const tableValue = value as PageBlockItemTableValue;
80
- tableValue.value.forEach(r => {
81
- r.cells.forEach(c => {
82
- c.nodes.forEach(n => {
83
- if (n.type === "RichText") {
84
- n.value = sanitizeRichText(n.value);
85
- }
86
- });
87
- });
88
- });
89
-
90
- return tableValue;
91
- }
92
-
93
- return value;
94
- });
95
-
96
- return content;
97
- }
98
-
99
- function sanitizeRichText(richText: PageBlockText): PageBlockText {
100
- return sortSpanAttributes(removeCommentSpans(richText));
101
- }
102
-
103
- function sortSpanAttributes(richText: PageBlockText) {
104
- richText.spans.forEach(s => {
105
- s.attributes.sort((lhs, rhs) => lhs.type.localeCompare(rhs.type));
106
- });
107
-
108
- return richText;
109
- }