@seed-design/figma 0.0.22 → 0.0.24
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/lib/codegen/index.cjs +208 -215
- package/lib/codegen/index.d.ts +17 -16
- package/lib/codegen/index.js +209 -215
- package/lib/codegen/targets/react/index.cjs +26 -33
- package/lib/codegen/targets/react/index.d.ts +4 -7
- package/lib/codegen/targets/react/index.js +26 -33
- package/package.json +3 -3
- package/src/codegen/core/codegen.ts +6 -10
- package/src/codegen/core/index.ts +0 -2
- package/src/codegen/core/value-resolver.ts +2 -3
- package/src/codegen/targets/figma/pipeline.ts +26 -3
- package/src/codegen/targets/figma/value-resolver.ts +15 -18
- package/src/codegen/targets/react/pipeline.ts +20 -4
- package/src/codegen/targets/react/value-resolver.ts +26 -29
- package/src/codegen/core/context.ts +0 -20
package/lib/codegen/index.cjs
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
var tsPattern = require('ts-pattern');
|
|
2
2
|
require('change-case');
|
|
3
|
-
var async_hooks = require('async_hooks');
|
|
4
3
|
var index_cjs = require('./targets/react/index.cjs');
|
|
5
4
|
|
|
6
5
|
function _interopNamespace(e) {
|
|
@@ -117,15 +116,6 @@ function stringifyElement(element, options = {}) {
|
|
|
117
116
|
return recursive(element, 0);
|
|
118
117
|
}
|
|
119
118
|
|
|
120
|
-
const codegenOptionsContext = new async_hooks.AsyncLocalStorage();
|
|
121
|
-
function useCodegenOptions() {
|
|
122
|
-
const options = codegenOptionsContext.getStore();
|
|
123
|
-
if (!options) {
|
|
124
|
-
throw new Error("Trying to get codegen options outside of codegen context. Did you forget to call `codegenOptionsContext.run`?");
|
|
125
|
-
}
|
|
126
|
-
return options;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
119
|
// --- Helper Functions ---
|
|
130
120
|
function getCollectiveBoundingBox(nodes) {
|
|
131
121
|
if (nodes.length === 0) {
|
|
@@ -433,12 +423,11 @@ function applyInferredLayout(parentNode, result) {
|
|
|
433
423
|
};
|
|
434
424
|
}
|
|
435
425
|
|
|
436
|
-
function createCodeGenerator({ frameTransformer, textTransformer, rectangleTransformer, instanceTransformer, vectorTransformer, booleanOperationTransformer }) {
|
|
426
|
+
function createCodeGenerator({ frameTransformer, textTransformer, rectangleTransformer, instanceTransformer, vectorTransformer, booleanOperationTransformer, shouldInferAutoLayout }) {
|
|
437
427
|
function traverse(node) {
|
|
438
428
|
if ("visible" in node && !node.visible) {
|
|
439
429
|
return;
|
|
440
430
|
}
|
|
441
|
-
const { shouldInferAutoLayout } = useCodegenOptions();
|
|
442
431
|
const result = tsPattern.match(node).with({
|
|
443
432
|
type: "FRAME"
|
|
444
433
|
}, (node)=>shouldInferAutoLayout ? frameTransformer(applyInferredLayout(node, inferLayout(node)), traverse) : frameTransformer(node, traverse)).with({
|
|
@@ -462,11 +451,11 @@ function createCodeGenerator({ frameTransformer, textTransformer, rectangleTrans
|
|
|
462
451
|
}
|
|
463
452
|
return;
|
|
464
453
|
}
|
|
465
|
-
function generateJsxTree(node
|
|
466
|
-
return
|
|
454
|
+
function generateJsxTree(node) {
|
|
455
|
+
return traverse(node);
|
|
467
456
|
}
|
|
468
457
|
function generateCode(node, options) {
|
|
469
|
-
const jsxTree = generateJsxTree(node
|
|
458
|
+
const jsxTree = generateJsxTree(node);
|
|
470
459
|
return jsxTree ? stringifyElement(jsxTree, {
|
|
471
460
|
printSource: options.shouldPrintSource
|
|
472
461
|
}) : undefined;
|
|
@@ -538,7 +527,7 @@ function getFirstStrokeVariable(node) {
|
|
|
538
527
|
return node.boundVariables?.strokes?.[0];
|
|
539
528
|
}
|
|
540
529
|
|
|
541
|
-
function createValueResolver({ variableService, variableNameFormatter, styleService, styleNameFormatter, rawValueFormatters }) {
|
|
530
|
+
function createValueResolver({ variableService, variableNameFormatter, styleService, styleNameFormatter, rawValueFormatters, shouldInferVariableName }) {
|
|
542
531
|
function getVariableName(key) {
|
|
543
532
|
const slug = variableService.getSlug(key);
|
|
544
533
|
if (!slug) {
|
|
@@ -549,7 +538,6 @@ function createValueResolver({ variableService, variableNameFormatter, styleServ
|
|
|
549
538
|
});
|
|
550
539
|
}
|
|
551
540
|
function inferVariableName(value, scope) {
|
|
552
|
-
const { shouldInferVariableName } = useCodegenOptions();
|
|
553
541
|
if (!shouldInferVariableName) {
|
|
554
542
|
return undefined;
|
|
555
543
|
}
|
|
@@ -651,189 +639,6 @@ function createValueResolver({ variableService, variableNameFormatter, styleServ
|
|
|
651
639
|
};
|
|
652
640
|
}
|
|
653
641
|
|
|
654
|
-
function createFrameTransformer({ propsConverters }) {
|
|
655
|
-
return defineElementTransformer((node, traverse)=>{
|
|
656
|
-
const children = node.children;
|
|
657
|
-
const props = {
|
|
658
|
-
...propsConverters.radius(node),
|
|
659
|
-
...propsConverters.containerLayout(node),
|
|
660
|
-
...propsConverters.selfLayout(node),
|
|
661
|
-
...propsConverters.frameFill(node),
|
|
662
|
-
...propsConverters.stroke(node)
|
|
663
|
-
};
|
|
664
|
-
return createElement("Frame", props, children.map((child)=>traverse(child)));
|
|
665
|
-
});
|
|
666
|
-
}
|
|
667
|
-
|
|
668
|
-
function createInstanceTransformer({ frameTransformer }) {
|
|
669
|
-
const transform = defineElementTransformer((node, traverse)=>{
|
|
670
|
-
return frameTransformer(node, traverse);
|
|
671
|
-
});
|
|
672
|
-
return transform;
|
|
673
|
-
}
|
|
674
|
-
|
|
675
|
-
function createContainerLayoutPropsConverter(valueResolver) {
|
|
676
|
-
return createPropsConverter({
|
|
677
|
-
handlers: {
|
|
678
|
-
layoutMode: ({ layoutMode })=>layoutMode ?? "NONE",
|
|
679
|
-
primaryAxisAlignItems: ({ primaryAxisAlignItems })=>primaryAxisAlignItems,
|
|
680
|
-
counterAxisAlignItems: ({ counterAxisAlignItems })=>counterAxisAlignItems,
|
|
681
|
-
layoutWrap: ({ layoutWrap })=>layoutWrap,
|
|
682
|
-
itemSpacing: (node)=>valueResolver.getFormattedValue.itemSpacing(node),
|
|
683
|
-
paddingTop: (node)=>valueResolver.getFormattedValue.paddingTop(node),
|
|
684
|
-
paddingBottom: (node)=>valueResolver.getFormattedValue.paddingBottom(node),
|
|
685
|
-
paddingLeft: (node)=>valueResolver.getFormattedValue.paddingLeft(node),
|
|
686
|
-
paddingRight: (node)=>valueResolver.getFormattedValue.paddingRight(node)
|
|
687
|
-
},
|
|
688
|
-
shorthands: {
|
|
689
|
-
horizontalPadding: [
|
|
690
|
-
"paddingLeft",
|
|
691
|
-
"paddingRight"
|
|
692
|
-
],
|
|
693
|
-
verticalPadding: [
|
|
694
|
-
"paddingTop",
|
|
695
|
-
"paddingBottom"
|
|
696
|
-
]
|
|
697
|
-
},
|
|
698
|
-
defaults: {}
|
|
699
|
-
});
|
|
700
|
-
}
|
|
701
|
-
function createSelfLayoutPropsConverter(valueResolver) {
|
|
702
|
-
return createPropsConverter({
|
|
703
|
-
handlers: {
|
|
704
|
-
layoutGrow: ({ layoutGrow })=>layoutGrow,
|
|
705
|
-
layoutAlign: ({ layoutAlign })=>layoutAlign,
|
|
706
|
-
layoutSizingVertical: ({ layoutSizingVertical })=>layoutSizingVertical,
|
|
707
|
-
layoutSizingHorizontal: ({ layoutSizingHorizontal })=>layoutSizingHorizontal,
|
|
708
|
-
width: (node)=>valueResolver.getFormattedValue.width(node),
|
|
709
|
-
height: (node)=>valueResolver.getFormattedValue.height(node),
|
|
710
|
-
minWidth: (node)=>valueResolver.getFormattedValue.minWidth(node),
|
|
711
|
-
minHeight: (node)=>valueResolver.getFormattedValue.minHeight(node),
|
|
712
|
-
maxWidth: (node)=>valueResolver.getFormattedValue.maxWidth(node),
|
|
713
|
-
maxHeight: (node)=>valueResolver.getFormattedValue.maxHeight(node)
|
|
714
|
-
},
|
|
715
|
-
defaults: {}
|
|
716
|
-
});
|
|
717
|
-
}
|
|
718
|
-
function createRadiusPropsConverter(valueResolver) {
|
|
719
|
-
return createPropsConverter({
|
|
720
|
-
handlers: {
|
|
721
|
-
topLeftRadius: (node)=>valueResolver.getFormattedValue.topLeftRadius(node),
|
|
722
|
-
topRightRadius: (node)=>valueResolver.getFormattedValue.topRightRadius(node),
|
|
723
|
-
bottomLeftRadius: (node)=>valueResolver.getFormattedValue.bottomLeftRadius(node),
|
|
724
|
-
bottomRightRadius: (node)=>valueResolver.getFormattedValue.bottomRightRadius(node)
|
|
725
|
-
},
|
|
726
|
-
shorthands: {
|
|
727
|
-
cornerRadius: [
|
|
728
|
-
"topLeftRadius",
|
|
729
|
-
"topRightRadius",
|
|
730
|
-
"bottomLeftRadius",
|
|
731
|
-
"bottomRightRadius"
|
|
732
|
-
]
|
|
733
|
-
},
|
|
734
|
-
defaults: {
|
|
735
|
-
cornerRadius: 0,
|
|
736
|
-
topLeftRadius: 0,
|
|
737
|
-
topRightRadius: 0,
|
|
738
|
-
bottomLeftRadius: 0,
|
|
739
|
-
bottomRightRadius: 0
|
|
740
|
-
}
|
|
741
|
-
});
|
|
742
|
-
}
|
|
743
|
-
function createFrameFillPropsConverter(valueResolver) {
|
|
744
|
-
return definePropsConverter((node)=>{
|
|
745
|
-
const fill = valueResolver.getFormattedValue.frameFill(node);
|
|
746
|
-
return {
|
|
747
|
-
fill
|
|
748
|
-
};
|
|
749
|
-
});
|
|
750
|
-
}
|
|
751
|
-
function createShapeFillPropsConverter(valueResolver) {
|
|
752
|
-
return definePropsConverter((node)=>{
|
|
753
|
-
const fill = valueResolver.getFormattedValue.shapeFill(node);
|
|
754
|
-
return {
|
|
755
|
-
fill
|
|
756
|
-
};
|
|
757
|
-
});
|
|
758
|
-
}
|
|
759
|
-
function createTextFillPropsConverter(valueResolver) {
|
|
760
|
-
return definePropsConverter((node)=>{
|
|
761
|
-
const fill = valueResolver.getFormattedValue.textFill(node);
|
|
762
|
-
return {
|
|
763
|
-
fill
|
|
764
|
-
};
|
|
765
|
-
});
|
|
766
|
-
}
|
|
767
|
-
function createStrokePropsConverter(valueResolver) {
|
|
768
|
-
return definePropsConverter((node)=>{
|
|
769
|
-
const stroke = valueResolver.getFormattedValue.stroke(node);
|
|
770
|
-
const strokeWeight = node.strokeWeight;
|
|
771
|
-
return {
|
|
772
|
-
stroke,
|
|
773
|
-
strokeWeight
|
|
774
|
-
};
|
|
775
|
-
});
|
|
776
|
-
}
|
|
777
|
-
function createTypeStylePropsConverter(valueResolver) {
|
|
778
|
-
return definePropsConverter((node)=>{
|
|
779
|
-
const styleName = valueResolver.getTextStyleValue(node);
|
|
780
|
-
const maxLines = node.style.textTruncation === "ENDING" ? node.style.maxLines ?? undefined : undefined;
|
|
781
|
-
if (styleName) {
|
|
782
|
-
return {
|
|
783
|
-
textStyle: styleName,
|
|
784
|
-
maxLines
|
|
785
|
-
};
|
|
786
|
-
}
|
|
787
|
-
return {
|
|
788
|
-
fontSize: valueResolver.getFormattedValue.fontSize(node),
|
|
789
|
-
fontWeight: valueResolver.getFormattedValue.fontWeight(node),
|
|
790
|
-
lineHeight: valueResolver.getFormattedValue.lineHeight(node),
|
|
791
|
-
maxLines
|
|
792
|
-
};
|
|
793
|
-
});
|
|
794
|
-
}
|
|
795
|
-
|
|
796
|
-
function createRectangleTransformer({ propsConverters }) {
|
|
797
|
-
return defineElementTransformer((node)=>{
|
|
798
|
-
return createElement("Rectangle", {
|
|
799
|
-
...propsConverters.selfLayout(node)
|
|
800
|
-
});
|
|
801
|
-
});
|
|
802
|
-
}
|
|
803
|
-
function createVectorTransformer({ propsConverters }) {
|
|
804
|
-
return defineElementTransformer((node)=>{
|
|
805
|
-
return createElement("Vector", {
|
|
806
|
-
...propsConverters.selfLayout(node),
|
|
807
|
-
...propsConverters.radius(node),
|
|
808
|
-
...propsConverters.stroke(node),
|
|
809
|
-
...propsConverters.shapeFill(node)
|
|
810
|
-
}, [], "Vector Node Placeholder");
|
|
811
|
-
});
|
|
812
|
-
}
|
|
813
|
-
function createBooleanOperationTransformer({ propsConverters }) {
|
|
814
|
-
return defineElementTransformer((node, traverse)=>{
|
|
815
|
-
return createElement("BooleanOperation", {
|
|
816
|
-
...propsConverters.selfLayout(node),
|
|
817
|
-
...propsConverters.radius(node),
|
|
818
|
-
...propsConverters.stroke(node),
|
|
819
|
-
...propsConverters.shapeFill(node)
|
|
820
|
-
}, node.children.map(traverse));
|
|
821
|
-
});
|
|
822
|
-
}
|
|
823
|
-
|
|
824
|
-
function createTextTransformer({ propsConverters }) {
|
|
825
|
-
return defineElementTransformer((node)=>{
|
|
826
|
-
const hasMultipleFills = node.fills.length > 1;
|
|
827
|
-
const fillProps = propsConverters.textFill(node);
|
|
828
|
-
const typeStyleProps = propsConverters.typeStyle(node);
|
|
829
|
-
const props = compactObject({
|
|
830
|
-
...typeStyleProps,
|
|
831
|
-
...fillProps
|
|
832
|
-
});
|
|
833
|
-
return createElement("Text", props, node.characters, hasMultipleFills ? "Multiple fills in Text node encountered, only the first fill is used." : "");
|
|
834
|
-
});
|
|
835
|
-
}
|
|
836
|
-
|
|
837
642
|
const FIGMA_TEXT_STYLES = [
|
|
838
643
|
{
|
|
839
644
|
styleType: "TEXT",
|
|
@@ -7918,6 +7723,189 @@ const variableService = createVariableService({
|
|
|
7918
7723
|
}
|
|
7919
7724
|
});
|
|
7920
7725
|
|
|
7726
|
+
function createFrameTransformer({ propsConverters }) {
|
|
7727
|
+
return defineElementTransformer((node, traverse)=>{
|
|
7728
|
+
const children = node.children;
|
|
7729
|
+
const props = {
|
|
7730
|
+
...propsConverters.radius(node),
|
|
7731
|
+
...propsConverters.containerLayout(node),
|
|
7732
|
+
...propsConverters.selfLayout(node),
|
|
7733
|
+
...propsConverters.frameFill(node),
|
|
7734
|
+
...propsConverters.stroke(node)
|
|
7735
|
+
};
|
|
7736
|
+
return createElement("Frame", props, children.map((child)=>traverse(child)));
|
|
7737
|
+
});
|
|
7738
|
+
}
|
|
7739
|
+
|
|
7740
|
+
function createInstanceTransformer({ frameTransformer }) {
|
|
7741
|
+
const transform = defineElementTransformer((node, traverse)=>{
|
|
7742
|
+
return frameTransformer(node, traverse);
|
|
7743
|
+
});
|
|
7744
|
+
return transform;
|
|
7745
|
+
}
|
|
7746
|
+
|
|
7747
|
+
function createContainerLayoutPropsConverter(valueResolver) {
|
|
7748
|
+
return createPropsConverter({
|
|
7749
|
+
handlers: {
|
|
7750
|
+
layoutMode: ({ layoutMode })=>layoutMode ?? "NONE",
|
|
7751
|
+
primaryAxisAlignItems: ({ primaryAxisAlignItems })=>primaryAxisAlignItems,
|
|
7752
|
+
counterAxisAlignItems: ({ counterAxisAlignItems })=>counterAxisAlignItems,
|
|
7753
|
+
layoutWrap: ({ layoutWrap })=>layoutWrap,
|
|
7754
|
+
itemSpacing: (node)=>valueResolver.getFormattedValue.itemSpacing(node),
|
|
7755
|
+
paddingTop: (node)=>valueResolver.getFormattedValue.paddingTop(node),
|
|
7756
|
+
paddingBottom: (node)=>valueResolver.getFormattedValue.paddingBottom(node),
|
|
7757
|
+
paddingLeft: (node)=>valueResolver.getFormattedValue.paddingLeft(node),
|
|
7758
|
+
paddingRight: (node)=>valueResolver.getFormattedValue.paddingRight(node)
|
|
7759
|
+
},
|
|
7760
|
+
shorthands: {
|
|
7761
|
+
horizontalPadding: [
|
|
7762
|
+
"paddingLeft",
|
|
7763
|
+
"paddingRight"
|
|
7764
|
+
],
|
|
7765
|
+
verticalPadding: [
|
|
7766
|
+
"paddingTop",
|
|
7767
|
+
"paddingBottom"
|
|
7768
|
+
]
|
|
7769
|
+
},
|
|
7770
|
+
defaults: {}
|
|
7771
|
+
});
|
|
7772
|
+
}
|
|
7773
|
+
function createSelfLayoutPropsConverter(valueResolver) {
|
|
7774
|
+
return createPropsConverter({
|
|
7775
|
+
handlers: {
|
|
7776
|
+
layoutGrow: ({ layoutGrow })=>layoutGrow,
|
|
7777
|
+
layoutAlign: ({ layoutAlign })=>layoutAlign,
|
|
7778
|
+
layoutSizingVertical: ({ layoutSizingVertical })=>layoutSizingVertical,
|
|
7779
|
+
layoutSizingHorizontal: ({ layoutSizingHorizontal })=>layoutSizingHorizontal,
|
|
7780
|
+
width: (node)=>valueResolver.getFormattedValue.width(node),
|
|
7781
|
+
height: (node)=>valueResolver.getFormattedValue.height(node),
|
|
7782
|
+
minWidth: (node)=>valueResolver.getFormattedValue.minWidth(node),
|
|
7783
|
+
minHeight: (node)=>valueResolver.getFormattedValue.minHeight(node),
|
|
7784
|
+
maxWidth: (node)=>valueResolver.getFormattedValue.maxWidth(node),
|
|
7785
|
+
maxHeight: (node)=>valueResolver.getFormattedValue.maxHeight(node)
|
|
7786
|
+
},
|
|
7787
|
+
defaults: {}
|
|
7788
|
+
});
|
|
7789
|
+
}
|
|
7790
|
+
function createRadiusPropsConverter(valueResolver) {
|
|
7791
|
+
return createPropsConverter({
|
|
7792
|
+
handlers: {
|
|
7793
|
+
topLeftRadius: (node)=>valueResolver.getFormattedValue.topLeftRadius(node),
|
|
7794
|
+
topRightRadius: (node)=>valueResolver.getFormattedValue.topRightRadius(node),
|
|
7795
|
+
bottomLeftRadius: (node)=>valueResolver.getFormattedValue.bottomLeftRadius(node),
|
|
7796
|
+
bottomRightRadius: (node)=>valueResolver.getFormattedValue.bottomRightRadius(node)
|
|
7797
|
+
},
|
|
7798
|
+
shorthands: {
|
|
7799
|
+
cornerRadius: [
|
|
7800
|
+
"topLeftRadius",
|
|
7801
|
+
"topRightRadius",
|
|
7802
|
+
"bottomLeftRadius",
|
|
7803
|
+
"bottomRightRadius"
|
|
7804
|
+
]
|
|
7805
|
+
},
|
|
7806
|
+
defaults: {
|
|
7807
|
+
cornerRadius: 0,
|
|
7808
|
+
topLeftRadius: 0,
|
|
7809
|
+
topRightRadius: 0,
|
|
7810
|
+
bottomLeftRadius: 0,
|
|
7811
|
+
bottomRightRadius: 0
|
|
7812
|
+
}
|
|
7813
|
+
});
|
|
7814
|
+
}
|
|
7815
|
+
function createFrameFillPropsConverter(valueResolver) {
|
|
7816
|
+
return definePropsConverter((node)=>{
|
|
7817
|
+
const fill = valueResolver.getFormattedValue.frameFill(node);
|
|
7818
|
+
return {
|
|
7819
|
+
fill
|
|
7820
|
+
};
|
|
7821
|
+
});
|
|
7822
|
+
}
|
|
7823
|
+
function createShapeFillPropsConverter(valueResolver) {
|
|
7824
|
+
return definePropsConverter((node)=>{
|
|
7825
|
+
const fill = valueResolver.getFormattedValue.shapeFill(node);
|
|
7826
|
+
return {
|
|
7827
|
+
fill
|
|
7828
|
+
};
|
|
7829
|
+
});
|
|
7830
|
+
}
|
|
7831
|
+
function createTextFillPropsConverter(valueResolver) {
|
|
7832
|
+
return definePropsConverter((node)=>{
|
|
7833
|
+
const fill = valueResolver.getFormattedValue.textFill(node);
|
|
7834
|
+
return {
|
|
7835
|
+
fill
|
|
7836
|
+
};
|
|
7837
|
+
});
|
|
7838
|
+
}
|
|
7839
|
+
function createStrokePropsConverter(valueResolver) {
|
|
7840
|
+
return definePropsConverter((node)=>{
|
|
7841
|
+
const stroke = valueResolver.getFormattedValue.stroke(node);
|
|
7842
|
+
const strokeWeight = node.strokeWeight;
|
|
7843
|
+
return {
|
|
7844
|
+
stroke,
|
|
7845
|
+
strokeWeight
|
|
7846
|
+
};
|
|
7847
|
+
});
|
|
7848
|
+
}
|
|
7849
|
+
function createTypeStylePropsConverter(valueResolver) {
|
|
7850
|
+
return definePropsConverter((node)=>{
|
|
7851
|
+
const styleName = valueResolver.getTextStyleValue(node);
|
|
7852
|
+
const maxLines = node.style.textTruncation === "ENDING" ? node.style.maxLines ?? undefined : undefined;
|
|
7853
|
+
if (styleName) {
|
|
7854
|
+
return {
|
|
7855
|
+
textStyle: styleName,
|
|
7856
|
+
maxLines
|
|
7857
|
+
};
|
|
7858
|
+
}
|
|
7859
|
+
return {
|
|
7860
|
+
fontSize: valueResolver.getFormattedValue.fontSize(node),
|
|
7861
|
+
fontWeight: valueResolver.getFormattedValue.fontWeight(node),
|
|
7862
|
+
lineHeight: valueResolver.getFormattedValue.lineHeight(node),
|
|
7863
|
+
maxLines
|
|
7864
|
+
};
|
|
7865
|
+
});
|
|
7866
|
+
}
|
|
7867
|
+
|
|
7868
|
+
function createRectangleTransformer({ propsConverters }) {
|
|
7869
|
+
return defineElementTransformer((node)=>{
|
|
7870
|
+
return createElement("Rectangle", {
|
|
7871
|
+
...propsConverters.selfLayout(node)
|
|
7872
|
+
});
|
|
7873
|
+
});
|
|
7874
|
+
}
|
|
7875
|
+
function createVectorTransformer({ propsConverters }) {
|
|
7876
|
+
return defineElementTransformer((node)=>{
|
|
7877
|
+
return createElement("Vector", {
|
|
7878
|
+
...propsConverters.selfLayout(node),
|
|
7879
|
+
...propsConverters.radius(node),
|
|
7880
|
+
...propsConverters.stroke(node),
|
|
7881
|
+
...propsConverters.shapeFill(node)
|
|
7882
|
+
}, [], "Vector Node Placeholder");
|
|
7883
|
+
});
|
|
7884
|
+
}
|
|
7885
|
+
function createBooleanOperationTransformer({ propsConverters }) {
|
|
7886
|
+
return defineElementTransformer((node, traverse)=>{
|
|
7887
|
+
return createElement("BooleanOperation", {
|
|
7888
|
+
...propsConverters.selfLayout(node),
|
|
7889
|
+
...propsConverters.radius(node),
|
|
7890
|
+
...propsConverters.stroke(node),
|
|
7891
|
+
...propsConverters.shapeFill(node)
|
|
7892
|
+
}, node.children.map(traverse));
|
|
7893
|
+
});
|
|
7894
|
+
}
|
|
7895
|
+
|
|
7896
|
+
function createTextTransformer({ propsConverters }) {
|
|
7897
|
+
return defineElementTransformer((node)=>{
|
|
7898
|
+
const hasMultipleFills = node.fills.length > 1;
|
|
7899
|
+
const fillProps = propsConverters.textFill(node);
|
|
7900
|
+
const typeStyleProps = propsConverters.typeStyle(node);
|
|
7901
|
+
const props = compactObject({
|
|
7902
|
+
...typeStyleProps,
|
|
7903
|
+
...fillProps
|
|
7904
|
+
});
|
|
7905
|
+
return createElement("Text", props, node.characters, hasMultipleFills ? "Multiple fills in Text node encountered, only the first fill is used." : "");
|
|
7906
|
+
});
|
|
7907
|
+
}
|
|
7908
|
+
|
|
7921
7909
|
function toCssRgba(color) {
|
|
7922
7910
|
if (color.a === 1) {
|
|
7923
7911
|
return `rgb(${Math.round(color.r * 255)}, ${Math.round(color.g * 255)}, ${Math.round(color.b * 255)})`;
|
|
@@ -7925,20 +7913,25 @@ function toCssRgba(color) {
|
|
|
7925
7913
|
return `rgba(${Math.round(color.r * 255)}, ${Math.round(color.g * 255)}, ${Math.round(color.b * 255)}, ${color.a})`;
|
|
7926
7914
|
}
|
|
7927
7915
|
|
|
7928
|
-
const
|
|
7929
|
-
|
|
7930
|
-
|
|
7931
|
-
|
|
7932
|
-
|
|
7933
|
-
|
|
7934
|
-
|
|
7935
|
-
|
|
7936
|
-
fontDimension: (value)=>value,
|
|
7937
|
-
fontWeight: (value)=>value
|
|
7938
|
-
}
|
|
7939
|
-
});
|
|
7916
|
+
const defaultVariableNameFormatter = ({ slug })=>slug.filter((s)=>s !== "dimension").map((s)=>s.replaceAll(",", "_")).join("/");
|
|
7917
|
+
const defaultStyleNameFormatter = ({ slug })=>slug[slug.length - 1];
|
|
7918
|
+
const defaultRawValueFormatters = {
|
|
7919
|
+
color: (value)=>toCssRgba(value),
|
|
7920
|
+
dimension: (value)=>value,
|
|
7921
|
+
fontDimension: (value)=>value,
|
|
7922
|
+
fontWeight: (value)=>value
|
|
7923
|
+
};
|
|
7940
7924
|
|
|
7941
|
-
function createPipeline() {
|
|
7925
|
+
function createPipeline(options = {}) {
|
|
7926
|
+
const { shouldInferAutoLayout = true, shouldInferVariableName = true } = options;
|
|
7927
|
+
const valueResolver = createValueResolver({
|
|
7928
|
+
variableService,
|
|
7929
|
+
variableNameFormatter: defaultVariableNameFormatter,
|
|
7930
|
+
styleService,
|
|
7931
|
+
styleNameFormatter: defaultStyleNameFormatter,
|
|
7932
|
+
rawValueFormatters: defaultRawValueFormatters,
|
|
7933
|
+
shouldInferVariableName
|
|
7934
|
+
});
|
|
7942
7935
|
const containerLayoutPropsConverter = createContainerLayoutPropsConverter(valueResolver);
|
|
7943
7936
|
const selfLayoutPropsConverter = createSelfLayoutPropsConverter(valueResolver);
|
|
7944
7937
|
const frameFillPropsConverter = createFrameFillPropsConverter(valueResolver);
|
|
@@ -7981,7 +7974,8 @@ function createPipeline() {
|
|
|
7981
7974
|
rectangleTransformer,
|
|
7982
7975
|
instanceTransformer,
|
|
7983
7976
|
vectorTransformer,
|
|
7984
|
-
booleanOperationTransformer
|
|
7977
|
+
booleanOperationTransformer,
|
|
7978
|
+
shouldInferAutoLayout
|
|
7985
7979
|
});
|
|
7986
7980
|
return codegenTransformer;
|
|
7987
7981
|
}
|
|
@@ -8016,4 +8010,3 @@ exports.defineElementTransformer = defineElementTransformer;
|
|
|
8016
8010
|
exports.definePropsConverter = definePropsConverter;
|
|
8017
8011
|
exports.figma = index;
|
|
8018
8012
|
exports.inferLayout = inferLayout;
|
|
8019
|
-
exports.useCodegenOptions = useCodegenOptions;
|
package/lib/codegen/index.d.ts
CHANGED
|
@@ -72,12 +72,6 @@ interface NormalizedUnhandledNode {
|
|
|
72
72
|
}
|
|
73
73
|
type NormalizedSceneNode = NormalizedFrameNode | NormalizedRectangleNode | NormalizedTextNode | NormalizedComponentNode | NormalizedInstanceNode | NormalizedVectorNode | NormalizedBooleanOperationNode | NormalizedUnhandledNode;
|
|
74
74
|
|
|
75
|
-
interface CodegenOptions {
|
|
76
|
-
shouldInferAutoLayout: boolean;
|
|
77
|
-
shouldInferVariableName: boolean;
|
|
78
|
-
}
|
|
79
|
-
declare function useCodegenOptions(): CodegenOptions;
|
|
80
|
-
|
|
81
75
|
interface ElementNode {
|
|
82
76
|
__IS_JSX_ELEMENT_NODE: true;
|
|
83
77
|
tag: string;
|
|
@@ -108,10 +102,11 @@ interface CodeGeneratorDeps {
|
|
|
108
102
|
instanceTransformer: ElementTransformer<NormalizedInstanceNode>;
|
|
109
103
|
vectorTransformer: ElementTransformer<NormalizedVectorNode>;
|
|
110
104
|
booleanOperationTransformer: ElementTransformer<NormalizedBooleanOperationNode>;
|
|
105
|
+
shouldInferAutoLayout: boolean;
|
|
111
106
|
}
|
|
112
|
-
declare function createCodeGenerator({ frameTransformer, textTransformer, rectangleTransformer, instanceTransformer, vectorTransformer, booleanOperationTransformer, }: CodeGeneratorDeps): {
|
|
113
|
-
generateJsxTree: (node: NormalizedSceneNode
|
|
114
|
-
generateCode: (node: NormalizedSceneNode, options:
|
|
107
|
+
declare function createCodeGenerator({ frameTransformer, textTransformer, rectangleTransformer, instanceTransformer, vectorTransformer, booleanOperationTransformer, shouldInferAutoLayout, }: CodeGeneratorDeps): {
|
|
108
|
+
generateJsxTree: (node: NormalizedSceneNode) => ElementNode | undefined;
|
|
109
|
+
generateCode: (node: NormalizedSceneNode, options: {
|
|
115
110
|
shouldPrintSource: boolean;
|
|
116
111
|
}) => string | undefined;
|
|
117
112
|
};
|
|
@@ -218,8 +213,9 @@ interface ValueResolverDeps<TColor, TDimension, TFontDimension, TFontWeight> {
|
|
|
218
213
|
fontDimension: (value: number) => string | TFontDimension;
|
|
219
214
|
fontWeight: (value: number) => string | TFontWeight;
|
|
220
215
|
};
|
|
216
|
+
shouldInferVariableName: boolean;
|
|
221
217
|
}
|
|
222
|
-
declare function createValueResolver<TColor, TDimension, TFontDimension, TFontWeight>({ variableService, variableNameFormatter, styleService, styleNameFormatter, rawValueFormatters, }: ValueResolverDeps<TColor, TDimension, TFontDimension, TFontWeight>): ValueResolver<TColor, TDimension, TFontDimension, TFontWeight>;
|
|
218
|
+
declare function createValueResolver<TColor, TDimension, TFontDimension, TFontWeight>({ variableService, variableNameFormatter, styleService, styleNameFormatter, rawValueFormatters, shouldInferVariableName, }: ValueResolverDeps<TColor, TDimension, TFontDimension, TFontWeight>): ValueResolver<TColor, TDimension, TFontDimension, TFontWeight>;
|
|
223
219
|
|
|
224
220
|
interface LayoutProperties {
|
|
225
221
|
layoutMode?: "NONE" | "HORIZONTAL" | "VERTICAL";
|
|
@@ -1676,9 +1672,13 @@ type AppBarRightProperties = InferComponentDefinition<{
|
|
|
1676
1672
|
};
|
|
1677
1673
|
}>;
|
|
1678
1674
|
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1675
|
+
interface CreatePipelineConfig {
|
|
1676
|
+
shouldInferAutoLayout?: boolean;
|
|
1677
|
+
shouldInferVariableName?: boolean;
|
|
1678
|
+
}
|
|
1679
|
+
declare function createPipeline(options?: CreatePipelineConfig): {
|
|
1680
|
+
generateJsxTree: (node: ________.NormalizedSceneNode) => ElementNode | undefined;
|
|
1681
|
+
generateCode: (node: ________.NormalizedSceneNode, options: {
|
|
1682
1682
|
shouldPrintSource: boolean;
|
|
1683
1683
|
}) => string | undefined;
|
|
1684
1684
|
};
|
|
@@ -1787,6 +1787,7 @@ declare function createTextTransformer({ propsConverters, }: TextTransformerDeps
|
|
|
1787
1787
|
type index_BooleanOperationTransformerDeps = BooleanOperationTransformerDeps;
|
|
1788
1788
|
type index_ContainerLayoutProps = ContainerLayoutProps;
|
|
1789
1789
|
type index_ContainerLayoutTrait = ContainerLayoutTrait;
|
|
1790
|
+
type index_CreatePipelineConfig = CreatePipelineConfig;
|
|
1790
1791
|
type index_FillProps = FillProps;
|
|
1791
1792
|
type index_FillTrait = FillTrait;
|
|
1792
1793
|
type index_FrameTransformerDeps = FrameTransformerDeps;
|
|
@@ -1820,8 +1821,8 @@ declare const index_createTypeStylePropsConverter: typeof createTypeStylePropsCo
|
|
|
1820
1821
|
declare const index_createVectorTransformer: typeof createVectorTransformer;
|
|
1821
1822
|
declare namespace index {
|
|
1822
1823
|
export { index_createBooleanOperationTransformer as createBooleanOperationTransformer, index_createContainerLayoutPropsConverter as createContainerLayoutPropsConverter, index_createFrameFillPropsConverter as createFrameFillPropsConverter, index_createFrameTransformer as createFrameTransformer, index_createInstanceTransformer as createInstanceTransformer, index_createPipeline as createPipeline, index_createRadiusPropsConverter as createRadiusPropsConverter, index_createRectangleTransformer as createRectangleTransformer, index_createSelfLayoutPropsConverter as createSelfLayoutPropsConverter, index_createShapeFillPropsConverter as createShapeFillPropsConverter, index_createStrokePropsConverter as createStrokePropsConverter, index_createTextFillPropsConverter as createTextFillPropsConverter, index_createTextTransformer as createTextTransformer, index_createTypeStylePropsConverter as createTypeStylePropsConverter, index_createVectorTransformer as createVectorTransformer };
|
|
1823
|
-
export type { index_BooleanOperationTransformerDeps as BooleanOperationTransformerDeps, index_ContainerLayoutProps as ContainerLayoutProps, index_ContainerLayoutTrait as ContainerLayoutTrait, index_FillProps as FillProps, index_FillTrait as FillTrait, index_FrameTransformerDeps as FrameTransformerDeps, index_InstanceTransformerDeps as InstanceTransformerDeps, index_PropsConverters as PropsConverters, index_RadiusProps as RadiusProps, index_RadiusTrait as RadiusTrait, index_RectangleTransformerDeps as RectangleTransformerDeps, index_SelfLayoutProps as SelfLayoutProps, index_SelfLayoutTrait as SelfLayoutTrait, index_StrokeProps as StrokeProps, index_StrokeTrait as StrokeTrait, index_TextTransformerDeps as TextTransformerDeps, index_TypeStyleProps as TypeStyleProps, index_TypeStyleTrait as TypeStyleTrait, index_VectorTransformerDeps as VectorTransformerDeps };
|
|
1824
|
+
export type { index_BooleanOperationTransformerDeps as BooleanOperationTransformerDeps, index_ContainerLayoutProps as ContainerLayoutProps, index_ContainerLayoutTrait as ContainerLayoutTrait, index_CreatePipelineConfig as CreatePipelineConfig, index_FillProps as FillProps, index_FillTrait as FillTrait, index_FrameTransformerDeps as FrameTransformerDeps, index_InstanceTransformerDeps as InstanceTransformerDeps, index_PropsConverters as PropsConverters, index_RadiusProps as RadiusProps, index_RadiusTrait as RadiusTrait, index_RectangleTransformerDeps as RectangleTransformerDeps, index_SelfLayoutProps as SelfLayoutProps, index_SelfLayoutTrait as SelfLayoutTrait, index_StrokeProps as StrokeProps, index_StrokeTrait as StrokeTrait, index_TextTransformerDeps as TextTransformerDeps, index_TypeStyleProps as TypeStyleProps, index_TypeStyleTrait as TypeStyleTrait, index_VectorTransformerDeps as VectorTransformerDeps };
|
|
1824
1825
|
}
|
|
1825
1826
|
|
|
1826
|
-
export { cloneElement, createCodeGenerator, createElement, createPropsConverter, createValueResolver, defineComponentHandler, defineElementTransformer, definePropsConverter, index as figma, inferLayout
|
|
1827
|
-
export type { ActionButtonProperties, ActionChipProperties, ActionSheetItemProperties, ActionSheetProperties, AppBarLeftProperties, AppBarMainProperties, AppBarProperties, AppBarRightProperties, AvatarProperties, AvatarStackProperties, BadgeProperties, CalloutProperties, CheckboxProperties, ChipTabsItemProperties, ChipTabsProperties, CodeGeneratorDeps,
|
|
1827
|
+
export { cloneElement, createCodeGenerator, createElement, createPropsConverter, createValueResolver, defineComponentHandler, defineElementTransformer, definePropsConverter, index as figma, inferLayout };
|
|
1828
|
+
export type { ActionButtonProperties, ActionChipProperties, ActionSheetItemProperties, ActionSheetProperties, AppBarLeftProperties, AppBarMainProperties, AppBarProperties, AppBarRightProperties, AvatarProperties, AvatarStackProperties, BadgeProperties, CalloutProperties, CheckboxProperties, ChipTabsItemProperties, ChipTabsProperties, CodeGeneratorDeps, ComponentHandler, ComponentPropertyDefinition, ControlChipProperties, ElementNode, ElementTransformer, ErrorStateProperties, ExtendedActionSheetGroupProperties, ExtendedActionSheetItemProperties, ExtendedActionSheetProperties, ExtendedFabProperties, FabProperties, HelpBubbleProperties, IdentityPlaceholderProperties, InferComponentDefinition, InferComponentPropertyType, InlineBannerProperties, MannerTempBadgeProperties, MultilineTextFieldProperties, ProgressCircleProperties, PropsConverter, ReactionButtonProperties, SegmentedControlItemProperties, SegmentedControlProperties, SelectBoxGroupProperties, SelectBoxProperties, SkeletonProperties, SnackbarProperties, SwitchProperties, TabsFillItemProperties, TabsHugItemProperties, TabsProperties, TextButtonProperties, TextFieldProperties, ToggleButtonProperties, ValueResolver };
|