@seed-design/figma 0.0.27 → 0.0.28
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 +1694 -3
- package/lib/codegen/index.d.ts +16 -13
- package/lib/codegen/index.js +1694 -3
- package/lib/codegen/targets/react/index.cjs +1641 -57
- package/lib/codegen/targets/react/index.d.ts +11 -9
- package/lib/codegen/targets/react/index.js +1641 -57
- package/lib/index.cjs +1682 -0
- package/lib/index.d.ts +19 -2
- package/lib/index.js +1681 -1
- package/package.json +2 -2
- package/src/codegen/core/codegen.ts +9 -1
- package/src/codegen/targets/figma/instance.ts +21 -1
- package/src/codegen/targets/figma/pipeline.ts +4 -1
- package/src/entities/component.interface.ts +7 -0
- package/src/entities/component.repository.ts +16 -0
- package/src/entities/index.ts +5 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seed-design/figma",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.28",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "git+https://github.com/daangn/seed-design.git",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"lint:publish": "bun publint"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@seed-design/css": "0.0.
|
|
41
|
+
"@seed-design/css": "0.0.28",
|
|
42
42
|
"change-case": "^5.4.4",
|
|
43
43
|
"ts-pattern": "^5.7.0"
|
|
44
44
|
},
|
|
@@ -25,6 +25,14 @@ export interface CodeGeneratorDeps {
|
|
|
25
25
|
shouldInferAutoLayout: boolean;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
+
export interface CodeGenerator {
|
|
29
|
+
generateJsxTree: (node: NormalizedSceneNode) => ElementNode | undefined;
|
|
30
|
+
generateCode: (
|
|
31
|
+
node: NormalizedSceneNode,
|
|
32
|
+
options: { shouldPrintSource: boolean },
|
|
33
|
+
) => { imports: string; jsx: string } | undefined;
|
|
34
|
+
}
|
|
35
|
+
|
|
28
36
|
export function createCodeGenerator({
|
|
29
37
|
frameTransformer,
|
|
30
38
|
textTransformer,
|
|
@@ -33,7 +41,7 @@ export function createCodeGenerator({
|
|
|
33
41
|
vectorTransformer,
|
|
34
42
|
booleanOperationTransformer,
|
|
35
43
|
shouldInferAutoLayout,
|
|
36
|
-
}: CodeGeneratorDeps) {
|
|
44
|
+
}: CodeGeneratorDeps): CodeGenerator {
|
|
37
45
|
function traverse(node: NormalizedSceneNode): ElementNode | undefined {
|
|
38
46
|
if ("visible" in node && !node.visible) {
|
|
39
47
|
return;
|
|
@@ -1,14 +1,34 @@
|
|
|
1
|
+
import type { ComponentRepository } from "@/entities";
|
|
1
2
|
import type { NormalizedInstanceNode } from "@/normalizer";
|
|
2
|
-
import {
|
|
3
|
+
import { camelCase } from "change-case";
|
|
4
|
+
import { createElement, defineElementTransformer, type ElementTransformer } from "../../core";
|
|
3
5
|
|
|
4
6
|
export interface InstanceTransformerDeps {
|
|
5
7
|
frameTransformer: ElementTransformer<NormalizedInstanceNode>;
|
|
8
|
+
componentRepository?: ComponentRepository;
|
|
6
9
|
}
|
|
7
10
|
|
|
8
11
|
export function createInstanceTransformer({
|
|
9
12
|
frameTransformer,
|
|
13
|
+
componentRepository,
|
|
10
14
|
}: InstanceTransformerDeps): ElementTransformer<NormalizedInstanceNode> {
|
|
11
15
|
const transform = defineElementTransformer((node: NormalizedInstanceNode, traverse) => {
|
|
16
|
+
const component = componentRepository?.getOne(node.componentSetKey ?? node.componentKey);
|
|
17
|
+
|
|
18
|
+
if (component) {
|
|
19
|
+
return createElement("Instance", {
|
|
20
|
+
componentName: component.name,
|
|
21
|
+
...Object.fromEntries(
|
|
22
|
+
Object.entries(node.componentProperties)
|
|
23
|
+
.filter(([_, props]) => props.type === "VARIANT" || props.type === "TEXT")
|
|
24
|
+
.map(([key, props]) => [
|
|
25
|
+
camelCase(key.split("#")[0]),
|
|
26
|
+
camelCase(props.value as string),
|
|
27
|
+
]),
|
|
28
|
+
),
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
|
|
12
32
|
return frameTransformer(node, traverse);
|
|
13
33
|
});
|
|
14
34
|
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { createCodeGenerator, createValueResolver } from "@/codegen/core";
|
|
2
|
+
import type { CodeGenerator } from "@/codegen/core/codegen";
|
|
2
3
|
import { styleService, variableService } from "@/codegen/default-services";
|
|
4
|
+
import { componentRepository } from "@/entities";
|
|
3
5
|
import { createFrameTransformer } from "./frame";
|
|
4
6
|
import { createInstanceTransformer } from "./instance";
|
|
5
7
|
import {
|
|
@@ -29,7 +31,7 @@ export interface CreatePipelineConfig {
|
|
|
29
31
|
shouldInferVariableName?: boolean;
|
|
30
32
|
}
|
|
31
33
|
|
|
32
|
-
export function createPipeline(options: CreatePipelineConfig = {}) {
|
|
34
|
+
export function createPipeline(options: CreatePipelineConfig = {}): CodeGenerator {
|
|
33
35
|
const { shouldInferAutoLayout = true, shouldInferVariableName = true } = options;
|
|
34
36
|
|
|
35
37
|
const valueResolver = createValueResolver({
|
|
@@ -66,6 +68,7 @@ export function createPipeline(options: CreatePipelineConfig = {}) {
|
|
|
66
68
|
});
|
|
67
69
|
const instanceTransformer = createInstanceTransformer({
|
|
68
70
|
frameTransformer,
|
|
71
|
+
componentRepository,
|
|
69
72
|
});
|
|
70
73
|
const textTransformer = createTextTransformer({
|
|
71
74
|
propsConverters,
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ComponentMetadata } from "./component.interface";
|
|
2
|
+
|
|
3
|
+
export interface ComponentRepository {
|
|
4
|
+
getOne(key: string): ComponentMetadata | undefined;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function createStaticComponentRepository(data: Record<string, ComponentMetadata>) {
|
|
8
|
+
const componentRecord: Record<string, ComponentMetadata> = {};
|
|
9
|
+
Object.values(data).forEach((component) => {
|
|
10
|
+
componentRecord[component.key] = component;
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
return {
|
|
14
|
+
getOne: (key: string) => componentRecord[key],
|
|
15
|
+
};
|
|
16
|
+
}
|
package/src/entities/index.ts
CHANGED
|
@@ -3,8 +3,10 @@ import { FIGMA_ICONS } from "./data/icons";
|
|
|
3
3
|
import { FIGMA_TEXT_STYLES } from "./data/styles";
|
|
4
4
|
import { FIGMA_VARIABLE_COLLECTIONS } from "./data/variable-collections";
|
|
5
5
|
import { FIGMA_VARIABLES } from "./data/variables";
|
|
6
|
+
import * as FIGMA_COMPONENTS from "./data/__generated__/component-sets";
|
|
6
7
|
import { createStaticStyleRepository } from "./style.repository";
|
|
7
8
|
import { createStaticVariableRepository } from "./variable.repository";
|
|
9
|
+
import { createStaticComponentRepository } from "./component.repository";
|
|
8
10
|
|
|
9
11
|
export * from "./icon.interface";
|
|
10
12
|
export * from "./icon.repository";
|
|
@@ -15,6 +17,8 @@ export * from "./style.service";
|
|
|
15
17
|
export * from "./variable.interface";
|
|
16
18
|
export * from "./variable.repository";
|
|
17
19
|
export * from "./variable.service";
|
|
20
|
+
export * from "./component.interface";
|
|
21
|
+
export * from "./component.repository";
|
|
18
22
|
|
|
19
23
|
export const styleRepository = createStaticStyleRepository(FIGMA_TEXT_STYLES);
|
|
20
24
|
export const variableRepository = createStaticVariableRepository({
|
|
@@ -22,6 +26,7 @@ export const variableRepository = createStaticVariableRepository({
|
|
|
22
26
|
variableCollections: FIGMA_VARIABLE_COLLECTIONS,
|
|
23
27
|
});
|
|
24
28
|
export const iconRepository = createStaticIconRepository(FIGMA_ICONS);
|
|
29
|
+
export const componentRepository = createStaticComponentRepository(FIGMA_COMPONENTS);
|
|
25
30
|
|
|
26
31
|
export function getFigmaVariableKey(name: string) {
|
|
27
32
|
return variableRepository.findVariableByName(name)?.key;
|