11import * as React from 'react' ;
2- import { fromSJSON } from './jsonUtils/sketchImpl/json-to-sketch' ;
32import { FileFormat1 as FileFormat } from '@sketch-hq/sketch-file-format-ts' ;
3+ import { fromSJSON } from './jsonUtils/sketchImpl/json-to-sketch' ;
44import buildTree from './buildTree' ;
55import flexToSketchJSON from './flexToSketchJSON' ;
66import { resetLayer , resetDocument } from './resets' ;
@@ -13,7 +13,7 @@ import isNativePage from './utils/isNativePage';
1313import isNativeSymbolsPage from './utils/isNativeSymbolsPage' ;
1414import { 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 ) ;
0 commit comments