@supernova-studio/client 0.26.0 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@supernova-studio/client",
3
- "version": "0.26.0",
3
+ "version": "0.28.0",
4
4
  "description": "Supernova Data Models",
5
5
  "source": "src/index.ts",
6
6
  "main": "dist/index.js",
@@ -624,6 +624,7 @@ export function serializeAsCustomBlock(block: PageBlockEditorModel, definition:
624
624
  ...(block.data.variantId && { variantId: block.data.variantId }),
625
625
  items: JSON.stringify(items),
626
626
 
627
+ ...(block.data.appearance && { appearance: JSON.stringify(block.data.appearance) }),
627
628
  ...(columns && { columns: columns }),
628
629
  },
629
630
  };
@@ -38,11 +38,9 @@ import {
38
38
  PageBlockItemTableCell,
39
39
  PageBlockTableCellAlignment,
40
40
  PageBlockAppearanceV2,
41
- ColorValue,
42
41
  nullishToOptional,
43
42
  PageBlockItemFigmaNodeValue,
44
43
  PageBlockColorV2,
45
- SupernovaException,
46
44
  PageSectionItemV2,
47
45
  PageSectionColumnV2,
48
46
  } from "@supernova-studio/model";
@@ -50,8 +48,7 @@ import { PageBlockEditorModel, PageSectionEditorModel } from "./model/block";
50
48
  import { DocumentationPageEditorModel } from "./model/page";
51
49
  import { BlockDefinitionUtils } from "./utils";
52
50
  import { yXmlFragmentToProsemirrorJSON } from "y-prosemirror";
53
- import { ZodAnyDef, ZodSchema, ZodTypeDef, z } from "zod";
54
- import { o } from "vitest/dist/types-198fd1d9";
51
+ import { ZodSchema, ZodTypeDef, z } from "zod";
55
52
 
56
53
  export function yDocToPage(yDoc: Y.Doc, definitions: PageBlockDefinition[]): DocumentationPageEditorModel {
57
54
  return yXmlFragmentToPage(yDoc.getXmlFragment("default"), definitions);
@@ -72,7 +69,7 @@ export function prosemirrorDocToPage(
72
69
  const definitionsById = mapByUnique(definitions, d => d.id);
73
70
 
74
71
  return {
75
- blocks: internalProsemirrorNodesToBlocks(prosemirrorDoc.content ?? [], definitionsById),
72
+ blocks: internalProsemirrorNodesToPageItems(prosemirrorDoc.content ?? [], definitionsById),
76
73
  };
77
74
  }
78
75
 
@@ -150,31 +147,53 @@ export function prosemirrorNodesToBlocks(prosemirrorNodes: ProsemirrorNode[], de
150
147
  return internalProsemirrorNodesToBlocks(prosemirrorNodes, definitionsById);
151
148
  }
152
149
 
150
+ function internalProsemirrorNodesToPageItems(
151
+ prosemirrorNodes: ProsemirrorNode[],
152
+ definitionsMap: Map<string, PageBlockDefinition>
153
+ ): (PageBlockEditorModel | PageSectionEditorModel)[] {
154
+ return prosemirrorNodes
155
+ .map(prosemirrorNode => {
156
+ if (prosemirrorNode.type === "tabsSection") {
157
+ return prosemirrorNodeToSection(prosemirrorNode, Array.from(definitionsMap.values()));
158
+ } else {
159
+ return internalProsemirrorNodeToBlock(prosemirrorNode, definitionsMap);
160
+ }
161
+ })
162
+ .filter(nonNullFilter);
163
+ }
164
+
153
165
  function internalProsemirrorNodesToBlocks(
154
166
  prosemirrorNodes: ProsemirrorNode[],
155
167
  definitionsMap: Map<string, PageBlockDefinition>
156
168
  ): PageBlockEditorModel[] {
157
169
  return prosemirrorNodes
158
170
  .map(prosemirrorNode => {
159
- const definitionId = getProsemirrorAttribute(prosemirrorNode, "definitionId", z.string());
160
- if (!definitionId) {
161
- console.warn(`definitionId on ${prosemirrorNode.type} is required to be interpreted as a block, skipping node`);
171
+ return internalProsemirrorNodeToBlock(prosemirrorNode, definitionsMap);
172
+ })
173
+ .filter(nonNullFilter);
174
+ }
162
175
 
163
- return null;
164
- }
176
+ function internalProsemirrorNodeToBlock(
177
+ prosemirrorNode: ProsemirrorNode,
178
+ definitionsMap: Map<string, PageBlockDefinition>
179
+ ) {
180
+ const definitionId = getProsemirrorAttribute(prosemirrorNode, "definitionId", z.string());
181
+ if (!definitionId) {
182
+ console.warn(`definitionId on ${prosemirrorNode.type} is required to be interpreted as a block, skipping node`);
165
183
 
166
- const definition = definitionsMap.get(definitionId);
167
- if (!definition) {
168
- console.warn(
169
- `Block definitionId "${definitionId}" (prosemirror node ${prosemirrorNode.type}) is not among available definitions`
170
- );
171
- console.warn(prosemirrorNode);
172
- return null;
173
- }
184
+ return null;
185
+ }
174
186
 
175
- return prosemirrorNodeToBlock(prosemirrorNode, definition);
176
- })
177
- .filter(nonNullFilter);
187
+ const definition = definitionsMap.get(definitionId);
188
+ if (!definition) {
189
+ console.warn(
190
+ `Block definitionId "${definitionId}" (prosemirror node ${prosemirrorNode.type}) is not among available definitions`
191
+ );
192
+ console.warn(prosemirrorNode);
193
+ return null;
194
+ }
195
+
196
+ return prosemirrorNodeToBlock(prosemirrorNode, definition);
178
197
  }
179
198
 
180
199
  export function prosemirrorNodeToBlock(
@@ -623,7 +642,15 @@ function parseBlockItems(prosemirrorNode: ProsemirrorNode, definition: PageBlock
623
642
  }
624
643
 
625
644
  function parseAppearance(prosemirrorNode: ProsemirrorNode): PageBlockAppearanceV2 | undefined {
626
- const appearance: PageBlockAppearanceV2 = {};
645
+ let appearance: PageBlockAppearanceV2 = {};
646
+
647
+ const rawAppearanceString = getProsemirrorAttribute(prosemirrorNode, "appearance", z.string().optional());
648
+ if (rawAppearanceString) {
649
+ const parsedAppearance = PageBlockAppearanceV2.safeParse(JSON.parse(rawAppearanceString));
650
+ if (parsedAppearance.success) {
651
+ appearance = parsedAppearance.data;
652
+ }
653
+ }
627
654
 
628
655
  const columns = getProsemirrorAttribute(prosemirrorNode, "columns", z.number().optional());
629
656
  if (columns) {