Skip to content

Commit 22b7f60

Browse files
committed
Make everything async
1 parent 042fdae commit 22b7f60

File tree

13 files changed

+98
-121
lines changed

13 files changed

+98
-121
lines changed

src/flexToSketchJSON.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,15 @@ function missingRendererError(type: string, annotations?: string) {
99
);
1010
}
1111

12-
const flexToSketchJSON = (
12+
const flexToSketchJSON = async (
1313
node: TreeNode | string,
14-
):
14+
): Promise<
1515
| FileFormat.SymbolMaster
1616
| FileFormat.Artboard
1717
| FileFormat.Group
1818
| FileFormat.ShapeGroup
19-
| FileFormat.SymbolInstance => {
19+
| FileFormat.SymbolInstance
20+
> => {
2021
if (typeof node === 'string') {
2122
throw missingRendererError('string');
2223
}
@@ -45,17 +46,19 @@ const flexToSketchJSON = (
4546
}
4647

4748
const renderer = new Renderer();
48-
const groupLayer = renderer.renderGroupLayer(node);
49+
const groupLayer = await renderer.renderGroupLayer(node);
4950

5051
if (groupLayer._class === 'symbolInstance') {
5152
return groupLayer;
5253
}
5354

54-
const backingLayers = renderer.renderBackingLayers(node);
55+
const backingLayers = await renderer.renderBackingLayers(node);
5556

5657
// stopping the walk down the tree if we have an svg
5758
const sublayers =
58-
children && type !== 'sketch_svg' ? children.map(child => flexToSketchJSON(child)) : [];
59+
children && type !== 'sketch_svg'
60+
? await Promise.all(children.map(child => flexToSketchJSON(child)))
61+
: [];
5962

6063
// Filter out anything null, undefined
6164
const layers = [...backingLayers, ...sublayers].filter(l => l);

src/jsonUtils/sketchImpl/makeImageDataFromUrl.ts

Lines changed: 0 additions & 43 deletions
This file was deleted.

src/render.tsx

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as React from 'react';
2-
import { fromSJSON } from './jsonUtils/sketchImpl/json-to-sketch';
32
import { FileFormat1 as FileFormat } from '@sketch-hq/sketch-file-format-ts';
3+
import { fromSJSON } from './jsonUtils/sketchImpl/json-to-sketch';
44
import buildTree from './buildTree';
55
import flexToSketchJSON from './flexToSketchJSON';
66
import { resetLayer, resetDocument } from './resets';
@@ -13,7 +13,7 @@ import isNativePage from './utils/isNativePage';
1313
import isNativeSymbolsPage from './utils/isNativeSymbolsPage';
1414
import { getSketchVersion } from './utils/getSketchVersion';
1515

16-
export const renderToJSON = (element: React.ReactElement): FileFormat.AnyLayer => {
16+
export const renderToJSON = async (element: React.ReactElement): Promise<FileFormat.AnyLayer> => {
1717
const tree = buildTree(element);
1818
return flexToSketchJSON(tree);
1919
};
@@ -36,14 +36,17 @@ const getDefaultPage = (): SketchLayer => {
3636
return isNativeSymbolsPage(currentPage) ? doc.addBlankPage() : currentPage;
3737
};
3838

39-
const renderContents = (tree: TreeNode | string, container: SketchLayer): SketchLayer => {
40-
const json = flexToSketchJSON(tree);
39+
const renderContents = async (
40+
tree: TreeNode | string,
41+
container: SketchLayer,
42+
): Promise<SketchLayer> => {
43+
const json = await flexToSketchJSON(tree);
4144
const layer = fromSJSON(json, '119');
4245

4346
return renderLayers([layer], container);
4447
};
4548

46-
const renderPage = (tree: TreeNode, page: SketchPage): Array<SketchLayer> => {
49+
const renderPage = async (tree: TreeNode, page: SketchPage): Promise<Array<SketchLayer>> => {
4750
const children = tree.children || [];
4851

4952
// assume if name is set on this nested page, the intent is to overwrite
@@ -52,10 +55,13 @@ const renderPage = (tree: TreeNode, page: SketchPage): Array<SketchLayer> => {
5255
page.setName(tree.props.name);
5356
}
5457

55-
return children.map(child => renderContents(child, page));
58+
return Promise.all(children.map(child => renderContents(child, page)));
5659
};
5760

58-
const renderDocument = (tree: TreeNode, documentData: SketchDocumentData): Array<SketchLayer> => {
61+
const renderDocument = async (
62+
tree: TreeNode,
63+
documentData: SketchDocumentData,
64+
): Promise<Array<SketchLayer>> => {
5965
if (!isNativeDocument(documentData)) {
6066
throw new Error('Cannot render a Document into a child of Document');
6167
}
@@ -74,7 +80,10 @@ const renderDocument = (tree: TreeNode, documentData: SketchDocumentData): Array
7480
});
7581
};
7682

77-
const renderTree = (tree: TreeNode, _container?: SketchLayer): SketchLayer | Array<SketchLayer> => {
83+
const renderTree = async (
84+
tree: TreeNode,
85+
_container?: SketchLayer,
86+
): Promise<SketchLayer | Array<SketchLayer>> => {
7887
if (isNativeDocument(_container) && tree.type !== 'sketch_document') {
7988
throw new Error('You need to render a Document into Document');
8089
}
@@ -98,10 +107,10 @@ const renderTree = (tree: TreeNode, _container?: SketchLayer): SketchLayer | Arr
98107
: renderContents(tree, container);
99108
};
100109

101-
export const render = (
110+
export const render = async (
102111
element: React.ReactElement,
103112
container?: SketchLayer | WrappedSketchLayer,
104-
): SketchLayer | Array<SketchLayer> => {
113+
): Promise<SketchLayer | Array<SketchLayer>> => {
105114
if (getSketchVersion() === 'NodeJS') {
106115
return renderToJSON(element);
107116
}
@@ -124,7 +133,8 @@ export const render = (
124133

125134
injectSymbols(getDocumentDataFromContainer(nativeContainer));
126135

127-
return renderTree(tree, nativeContainer);
136+
const layer = await renderTree(tree, nativeContainer);
137+
return layer;
128138
} catch (err) {
129139
// eslint-disable-next-line no-console
130140
console.error(err);

src/renderers/ArtboardRenderer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { TreeNode } from '../types';
66
import { Props } from '../components/Artboard';
77

88
export default class ArtboardRenderer extends SketchRenderer {
9-
renderGroupLayer({ layout, style, props }: TreeNode<Props>): FileFormat.Artboard {
9+
async renderGroupLayer({ layout, style, props }: TreeNode<Props>): Promise<FileFormat.Artboard> {
1010
let color: FileFormat.Color;
1111
if (style.backgroundColor !== undefined) {
1212
color = makeColorFromCSS(style.backgroundColor);

src/renderers/ImageRenderer.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ function extractURLFromSource(source?: string | { uri?: string }): string | unde
1616
}
1717

1818
export default class ImageRenderer extends SketchRenderer {
19-
renderBackingLayers({ layout, style, props }: TreeNode<Props>) {
19+
async renderBackingLayers({ layout, style, props }: TreeNode<Props>) {
2020
let layers: FileFormat.ShapeGroup[] = [];
2121

2222
const {
@@ -28,7 +28,7 @@ export default class ImageRenderer extends SketchRenderer {
2828

2929
const url = extractURLFromSource(props.source);
3030

31-
const image = getImageDataFromURL(url);
31+
const image = await getImageDataFromURL(url);
3232

3333
const fillImage = makeJSONDataReference(image);
3434

src/renderers/SketchRenderer.ts

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,17 @@ export default class SketchRenderer {
1111
return 'Group';
1212
}
1313

14-
renderGroupLayer({
14+
async renderGroupLayer({
1515
layout,
1616
style,
1717
props,
18-
}: TreeNode):
18+
}: TreeNode): Promise<
1919
| FileFormat.SymbolMaster
2020
| FileFormat.Artboard
2121
| FileFormat.Group
2222
| FileFormat.ShapeGroup
23-
| FileFormat.SymbolInstance {
23+
| FileFormat.SymbolInstance
24+
> {
2425
// Default SketchRenderer just renders an empty group
2526

2627
const transform = processTransform(layout, style);
@@ -42,23 +43,25 @@ export default class SketchRenderer {
4243
};
4344
}
4445

45-
renderBackingLayers(
46+
async renderBackingLayers(
4647
_node: TreeNode,
47-
): (
48-
| FileFormat.ShapePath
49-
| FileFormat.Rectangle
50-
| FileFormat.SymbolMaster
51-
| FileFormat.Group
52-
| FileFormat.Polygon
53-
| FileFormat.Star
54-
| FileFormat.Triangle
55-
| FileFormat.ShapeGroup
56-
| FileFormat.Text
57-
| FileFormat.SymbolInstance
58-
| FileFormat.Slice
59-
| FileFormat.Hotspot
60-
| FileFormat.Bitmap
61-
)[] {
48+
): Promise<
49+
(
50+
| FileFormat.ShapePath
51+
| FileFormat.Rectangle
52+
| FileFormat.SymbolMaster
53+
| FileFormat.Group
54+
| FileFormat.Polygon
55+
| FileFormat.Star
56+
| FileFormat.Triangle
57+
| FileFormat.ShapeGroup
58+
| FileFormat.Text
59+
| FileFormat.SymbolInstance
60+
| FileFormat.Slice
61+
| FileFormat.Hotspot
62+
| FileFormat.Bitmap
63+
)[]
64+
> {
6265
return [];
6366
}
6467
}

src/renderers/SvgRenderer.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ export default class SvgRenderer extends ViewRenderer {
6565
return props.name || 'Svg';
6666
}
6767

68-
renderBackingLayers(node: TreeNode<Props>) {
69-
const layers = super.renderBackingLayers(node);
68+
async renderBackingLayers(node: TreeNode<Props>) {
69+
const layers = await super.renderBackingLayers(node);
7070

7171
const { layout, props, children } = node;
7272

src/renderers/SymbolInstanceRenderer.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ const extractOverrides = (layers: FileFormat.AnyLayer[] = [], path?: string): Ov
9898
};
9999

100100
export default class SymbolInstanceRenderer extends SketchRenderer {
101-
renderGroupLayer({ layout, props }: TreeNode<SymbolInstanceProps & { symbolID: string }>) {
101+
async renderGroupLayer({ layout, props }: TreeNode<SymbolInstanceProps & { symbolID: string }>) {
102102
const masterTree = getSymbolMasterById(props.symbolID);
103103

104104
const symbolInstance = makeSymbolInstance(
@@ -114,8 +114,8 @@ export default class SymbolInstanceRenderer extends SketchRenderer {
114114

115115
const overridableLayers = extractOverrides(masterTree.layers);
116116

117-
const overrides = overridableLayers.reduce(function inject(
118-
memo: FileFormat.OverrideValue[],
117+
const overrides = await overridableLayers.reduce(async function inject(
118+
memo: Promise<FileFormat.OverrideValue[]>,
119119
reference: Override,
120120
) {
121121
if (reference.type === 'symbolID') {
@@ -141,7 +141,9 @@ export default class SymbolInstanceRenderer extends SketchRenderer {
141141
);
142142
}
143143

144-
memo.push(makeOverride(reference.path, reference.type, replacementMaster.symbolID));
144+
(await memo).push(
145+
makeOverride(reference.path, reference.type, replacementMaster.symbolID),
146+
);
145147

146148
extractOverrides(replacementMaster.layers, newPath).reduce(inject, memo);
147149

@@ -165,7 +167,7 @@ export default class SymbolInstanceRenderer extends SketchRenderer {
165167
`The override value of a Text must be a string.\n\nIn Symbol Instance: "${props.name}"\nFor Override: "${reference.name}"`,
166168
);
167169
}
168-
memo.push(makeOverride(reference.path, reference.type, overrideValue));
170+
(await memo).push(makeOverride(reference.path, reference.type, overrideValue));
169171
}
170172

171173
if (reference.type === 'image') {
@@ -174,18 +176,18 @@ export default class SymbolInstanceRenderer extends SketchRenderer {
174176
`The override value of an Image must be a url.\n\nIn Symbol Instance: "${props.name}"\nFor Override: "${reference.name}"`,
175177
);
176178
}
177-
memo.push(
179+
(await memo).push(
178180
makeOverride(
179181
reference.path,
180182
reference.type,
181-
makeJSONDataReference(getImageDataFromURL(overrideValue)),
183+
makeJSONDataReference(await getImageDataFromURL(overrideValue)),
182184
),
183185
);
184186
}
185187

186188
return memo;
187189
},
188-
[]);
190+
Promise.resolve([]));
189191

190192
symbolInstance.overrideValues = overrides;
191193

src/renderers/SymbolMasterRenderer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { TreeNode } from '../types';
44
import { SymbolMasterProps } from '../symbol';
55

66
export default class SymbolMasterRenderer extends SketchRenderer {
7-
renderGroupLayer({ layout, props }: TreeNode<SymbolMasterProps & { symbolID: string }>) {
7+
async renderGroupLayer({ layout, props }: TreeNode<SymbolMasterProps & { symbolID: string }>) {
88
return makeSymbolMaster(
99
makeRect(layout.left, layout.top, layout.width, layout.height),
1010
props.symbolID,

src/renderers/TextRenderer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export default class TextRenderer extends SketchRenderer {
1010
return props.name || 'Text';
1111
}
1212

13-
renderBackingLayers({ layout, style, textStyle, props }: TreeNode<Props>) {
13+
async renderBackingLayers({ layout, style, textStyle, props }: TreeNode<Props>) {
1414
let { name } = props;
1515

1616
// Append all text nodes's content into one string

0 commit comments

Comments
 (0)