@calibrate-ds/generator-react 0.1.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/dist/components/generate-component-css.d.ts +6 -0
- package/dist/components/generate-component-css.d.ts.map +1 -0
- package/dist/components/generate-component-css.js +97 -0
- package/dist/components/generate-component-css.js.map +1 -0
- package/dist/components/generate-component-file.d.ts +8 -0
- package/dist/components/generate-component-file.d.ts.map +1 -0
- package/dist/components/generate-component-file.js +216 -0
- package/dist/components/generate-component-file.js.map +1 -0
- package/dist/components/generate-composite-file.d.ts +3 -0
- package/dist/components/generate-composite-file.d.ts.map +1 -0
- package/dist/components/generate-composite-file.js +78 -0
- package/dist/components/generate-composite-file.js.map +1 -0
- package/dist/components/generate-composite-types.d.ts +7 -0
- package/dist/components/generate-composite-types.d.ts.map +1 -0
- package/dist/components/generate-composite-types.js +44 -0
- package/dist/components/generate-composite-types.js.map +1 -0
- package/dist/components/generate-types-file.d.ts +8 -0
- package/dist/components/generate-types-file.d.ts.map +1 -0
- package/dist/components/generate-types-file.js +65 -0
- package/dist/components/generate-types-file.js.map +1 -0
- package/dist/components/helpers.d.ts +33 -0
- package/dist/components/helpers.d.ts.map +1 -0
- package/dist/components/helpers.js +124 -0
- package/dist/components/helpers.js.map +1 -0
- package/dist/components/index.d.ts +9 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +10 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/layout-jsx.d.ts +14 -0
- package/dist/components/layout-jsx.d.ts.map +1 -0
- package/dist/components/layout-jsx.js +265 -0
- package/dist/components/layout-jsx.js.map +1 -0
- package/dist/components/prune-components.d.ts +10 -0
- package/dist/components/prune-components.d.ts.map +1 -0
- package/dist/components/prune-components.js +69 -0
- package/dist/components/prune-components.js.map +1 -0
- package/dist/components/token-helpers.d.ts +32 -0
- package/dist/components/token-helpers.d.ts.map +1 -0
- package/dist/components/token-helpers.js +188 -0
- package/dist/components/token-helpers.js.map +1 -0
- package/dist/components/write-components.d.ts +17 -0
- package/dist/components/write-components.d.ts.map +1 -0
- package/dist/components/write-components.js +218 -0
- package/dist/components/write-components.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/scaffold/generate-placeholder-component-content.d.ts +9 -0
- package/dist/scaffold/generate-placeholder-component-content.d.ts.map +1 -0
- package/dist/scaffold/generate-placeholder-component-content.js +68 -0
- package/dist/scaffold/generate-placeholder-component-content.js.map +1 -0
- package/dist/scaffold/index.d.ts +3 -0
- package/dist/scaffold/index.d.ts.map +1 -0
- package/dist/scaffold/index.js +3 -0
- package/dist/scaffold/index.js.map +1 -0
- package/dist/scaffold/write-scaffold.d.ts +14 -0
- package/dist/scaffold/write-scaffold.d.ts.map +1 -0
- package/dist/scaffold/write-scaffold.js +93 -0
- package/dist/scaffold/write-scaffold.js.map +1 -0
- package/dist/test-css-tokens.d.ts +2 -0
- package/dist/test-css-tokens.d.ts.map +1 -0
- package/dist/test-css-tokens.js +39 -0
- package/dist/test-css-tokens.js.map +1 -0
- package/dist/tokens/generate-token-css.d.ts +30 -0
- package/dist/tokens/generate-token-css.d.ts.map +1 -0
- package/dist/tokens/generate-token-css.js +367 -0
- package/dist/tokens/generate-token-css.js.map +1 -0
- package/dist/tokens/generate-token-file-content.d.ts +6 -0
- package/dist/tokens/generate-token-file-content.d.ts.map +1 -0
- package/dist/tokens/generate-token-file-content.js +27 -0
- package/dist/tokens/generate-token-file-content.js.map +1 -0
- package/dist/tokens/generate-typography-css.d.ts +3 -0
- package/dist/tokens/generate-typography-css.d.ts.map +1 -0
- package/dist/tokens/generate-typography-css.js +106 -0
- package/dist/tokens/generate-typography-css.js.map +1 -0
- package/dist/tokens/index.d.ts +5 -0
- package/dist/tokens/index.d.ts.map +1 -0
- package/dist/tokens/index.js +5 -0
- package/dist/tokens/index.js.map +1 -0
- package/dist/tokens/write-tokens.d.ts +7 -0
- package/dist/tokens/write-tokens.d.ts.map +1 -0
- package/dist/tokens/write-tokens.js +115 -0
- package/dist/tokens/write-tokens.js.map +1 -0
- package/package.json +35 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ComponentDefinition } from "@calibrate-ds/shared-types";
|
|
2
|
+
/**
|
|
3
|
+
* Converts a raw generic Figma property name into a safe camelCase TypeScript prop name.
|
|
4
|
+
* Exampe: "Property 1" -> "property1", "State" -> "state"
|
|
5
|
+
*/
|
|
6
|
+
export declare function normalizePropName(rawName: string): string;
|
|
7
|
+
/**
|
|
8
|
+
* Strips quotes from variant option values to keep types clean.
|
|
9
|
+
*/
|
|
10
|
+
export declare function sanitizeOptionName(option: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Ensures a consistent `./ComponentName.module.css` relative import path.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getCssModuleImportPath(componentName: string): string;
|
|
15
|
+
export type BaseElementInfo = {
|
|
16
|
+
tag: string;
|
|
17
|
+
interfaceName: string;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Infers the most logical HTML base element from the component's name and category.
|
|
21
|
+
* Provides a sensible fallback mapping to React HTMLAttributes.
|
|
22
|
+
*/
|
|
23
|
+
export declare function inferBaseElement(componentName: string, categoryPath: string): BaseElementInfo;
|
|
24
|
+
/**
|
|
25
|
+
* Derives the exact canonical subfolder path to resolve imports predictably securely.
|
|
26
|
+
*/
|
|
27
|
+
export declare function resolveRelativeImportTarget(sourceComponent: ComponentDefinition, targetComponent: ComponentDefinition, namingStrategy: any): string;
|
|
28
|
+
/**
|
|
29
|
+
* Derives the exact canonical path relative to a component backwards dynamically
|
|
30
|
+
* towards `../../layout/<Primitive>` flawlessly structurally!
|
|
31
|
+
*/
|
|
32
|
+
export declare function resolveRelativeLayoutImport(sourceComponent: ComponentDefinition, primitiveName: "Row" | "Stack" | "Grid", namingStrategy: any): string;
|
|
33
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/components/helpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEtE;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAwBzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,MAAM,MAAM,eAAe,GAAG;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,eAAe,CAsC7F;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACvC,eAAe,EAAE,mBAAmB,EACpC,eAAe,EAAE,mBAAmB,EACpC,cAAc,EAAE,GAAG,GACpB,MAAM,CAuBR;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACvC,eAAe,EAAE,mBAAmB,EACpC,aAAa,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,EACvC,cAAc,EAAE,GAAG,GACpB,MAAM,CAmBR"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import * as path from "node:path";
|
|
2
|
+
/**
|
|
3
|
+
* Converts a raw generic Figma property name into a safe camelCase TypeScript prop name.
|
|
4
|
+
* Exampe: "Property 1" -> "property1", "State" -> "state"
|
|
5
|
+
*/
|
|
6
|
+
export function normalizePropName(rawName) {
|
|
7
|
+
if (!rawName)
|
|
8
|
+
return "unknownProp";
|
|
9
|
+
const cleanStr = rawName
|
|
10
|
+
.replace(/([A-Z])/g, " $1") // Insert space before uppercase letters safely
|
|
11
|
+
.replace(/[^a-zA-Z0-9]+/g, " ") // Replace non-alphanumeric with space cleanly
|
|
12
|
+
.trim();
|
|
13
|
+
const camelCase = cleanStr
|
|
14
|
+
.split(/\s+/)
|
|
15
|
+
.map((word, index) => {
|
|
16
|
+
if (index === 0) {
|
|
17
|
+
return word.toLowerCase();
|
|
18
|
+
}
|
|
19
|
+
return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
|
|
20
|
+
})
|
|
21
|
+
.join("");
|
|
22
|
+
// Ensure it doesn't start with a number
|
|
23
|
+
if (/^[0-9]/.test(camelCase)) {
|
|
24
|
+
return `prop${camelCase}`;
|
|
25
|
+
}
|
|
26
|
+
return camelCase || "unknownProp";
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Strips quotes from variant option values to keep types clean.
|
|
30
|
+
*/
|
|
31
|
+
export function sanitizeOptionName(option) {
|
|
32
|
+
return option.replace(/["']/g, "");
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Ensures a consistent `./ComponentName.module.css` relative import path.
|
|
36
|
+
*/
|
|
37
|
+
export function getCssModuleImportPath(componentName) {
|
|
38
|
+
return `./${componentName}.module.css`;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Infers the most logical HTML base element from the component's name and category.
|
|
42
|
+
* Provides a sensible fallback mapping to React HTMLAttributes.
|
|
43
|
+
*/
|
|
44
|
+
export function inferBaseElement(componentName, categoryPath) {
|
|
45
|
+
const searchString = `${componentName.toLowerCase()} ${categoryPath.toLowerCase()}`;
|
|
46
|
+
// Form elements
|
|
47
|
+
if (searchString.includes("button") || searchString.includes("btn")) {
|
|
48
|
+
return { tag: "button", interfaceName: "React.ButtonHTMLAttributes<HTMLButtonElement>" };
|
|
49
|
+
}
|
|
50
|
+
if (searchString.includes("input") || searchString.includes("textfield") || searchString.includes("search")) {
|
|
51
|
+
return { tag: "input", interfaceName: "React.InputHTMLAttributes<HTMLInputElement>" };
|
|
52
|
+
}
|
|
53
|
+
if (searchString.includes("checkbox") || searchString.includes("radio") || searchString.includes("switch") || searchString.includes("toggle")) {
|
|
54
|
+
// Typically a wrapper around an input, but for simple skeleton keeping it generic wrapper or input depending on pattern.
|
|
55
|
+
// Usually, a checkbox is a label + input wrapper. A `div` wrapper is safest for a skeletal React component structure.
|
|
56
|
+
return { tag: "div", interfaceName: "React.HTMLAttributes<HTMLDivElement>" };
|
|
57
|
+
}
|
|
58
|
+
if (searchString.includes("select") || searchString.includes("dropdown")) {
|
|
59
|
+
return { tag: "select", interfaceName: "React.SelectHTMLAttributes<HTMLSelectElement>" };
|
|
60
|
+
}
|
|
61
|
+
if (searchString.includes("form")) {
|
|
62
|
+
return { tag: "form", interfaceName: "React.FormHTMLAttributes<HTMLFormElement>" };
|
|
63
|
+
}
|
|
64
|
+
// Media
|
|
65
|
+
if (searchString.includes("image") || searchString.includes("img") || searchString.includes("avatar")) {
|
|
66
|
+
return { tag: "img", interfaceName: "React.ImgHTMLAttributes<HTMLImageElement>" };
|
|
67
|
+
}
|
|
68
|
+
// Text / Typography
|
|
69
|
+
if (searchString.includes("text") || searchString.includes("typography") || searchString.includes("heading") || searchString.includes("title") || searchString.includes("paragraph")) {
|
|
70
|
+
return { tag: "span", interfaceName: "React.HTMLAttributes<HTMLSpanElement>" };
|
|
71
|
+
}
|
|
72
|
+
if (searchString.includes("icon")) {
|
|
73
|
+
// Icons are often SVG or span wrappers
|
|
74
|
+
return { tag: "span", interfaceName: "React.HTMLAttributes<HTMLSpanElement>" };
|
|
75
|
+
}
|
|
76
|
+
// Default Fallback
|
|
77
|
+
return { tag: "div", interfaceName: "React.HTMLAttributes<HTMLDivElement>" };
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Derives the exact canonical subfolder path to resolve imports predictably securely.
|
|
81
|
+
*/
|
|
82
|
+
export function resolveRelativeImportTarget(sourceComponent, targetComponent, namingStrategy) {
|
|
83
|
+
const sourceFolder = namingStrategy.formatFolderName(sourceComponent.name);
|
|
84
|
+
let sourcePath = sourceFolder;
|
|
85
|
+
if (sourceComponent.categoryPath) {
|
|
86
|
+
const sourceCategory = namingStrategy.formatFolderName(sourceComponent.categoryPath);
|
|
87
|
+
sourcePath = path.posix.join(sourceCategory, sourceFolder);
|
|
88
|
+
}
|
|
89
|
+
const targetFolder = namingStrategy.formatFolderName(targetComponent.name);
|
|
90
|
+
let targetPath = targetFolder;
|
|
91
|
+
if (targetComponent.categoryPath) {
|
|
92
|
+
const targetCategory = namingStrategy.formatFolderName(targetComponent.categoryPath);
|
|
93
|
+
targetPath = path.posix.join(targetCategory, targetFolder);
|
|
94
|
+
}
|
|
95
|
+
// Since both start relative to `packages/ui/src/components/`, find relative distance natively!
|
|
96
|
+
// path.posix to enforce forward slashes in compiled code cleanly
|
|
97
|
+
let relativeStr = path.posix.relative(sourcePath, targetPath);
|
|
98
|
+
if (!relativeStr.startsWith(".")) {
|
|
99
|
+
relativeStr = `./${relativeStr}`;
|
|
100
|
+
}
|
|
101
|
+
return `${relativeStr}/${targetFolder}`;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Derives the exact canonical path relative to a component backwards dynamically
|
|
105
|
+
* towards `../../layout/<Primitive>` flawlessly structurally!
|
|
106
|
+
*/
|
|
107
|
+
export function resolveRelativeLayoutImport(sourceComponent, primitiveName, namingStrategy) {
|
|
108
|
+
const sourceFolder = namingStrategy.formatFolderName(sourceComponent.name);
|
|
109
|
+
let sourcePath = sourceFolder;
|
|
110
|
+
if (sourceComponent.categoryPath) {
|
|
111
|
+
const sourceCategory = namingStrategy.formatFolderName(sourceComponent.categoryPath);
|
|
112
|
+
sourcePath = path.posix.join(sourceCategory, sourceFolder);
|
|
113
|
+
}
|
|
114
|
+
// `packages/ui/src/components` vs `packages/ui/src/layout` -> we go up one level from `components/`
|
|
115
|
+
// SourcePath represents distance *inside* `components/`. We must escape components natively!
|
|
116
|
+
let pathAcc = ".."; // Escaping the 'components' folder boundary logically
|
|
117
|
+
// Each level deep inside components adds another `../`
|
|
118
|
+
const depth = sourcePath.split("/").length;
|
|
119
|
+
for (let i = 0; i < depth; i++) {
|
|
120
|
+
pathAcc = path.posix.join("..", pathAcc);
|
|
121
|
+
}
|
|
122
|
+
return path.posix.join(pathAcc, "layout", primitiveName);
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/components/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from "./generate-types-file.js";
|
|
2
|
+
export * from "./generate-component-file.js";
|
|
3
|
+
export * from "./write-components.js";
|
|
4
|
+
export * from "./prune-components.js";
|
|
5
|
+
export * from "./helpers.js";
|
|
6
|
+
export * from "./token-helpers.js";
|
|
7
|
+
export * from "./generate-composite-types.js";
|
|
8
|
+
export * from "./generate-composite-file.js";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AAGnC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from "./generate-types-file.js";
|
|
2
|
+
export * from "./generate-component-file.js";
|
|
3
|
+
export * from "./write-components.js";
|
|
4
|
+
export * from "./prune-components.js";
|
|
5
|
+
export * from "./helpers.js";
|
|
6
|
+
export * from "./token-helpers.js";
|
|
7
|
+
// Merged Composite Generators
|
|
8
|
+
export * from "./generate-composite-types.js";
|
|
9
|
+
export * from "./generate-composite-file.js";
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AAEnC,8BAA8B;AAC9B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { LayoutTreeNode, ComponentDefinition, DesignSystemModel } from "@calibrate-ds/shared-types";
|
|
2
|
+
export interface LayoutJSXResult {
|
|
3
|
+
jsx: string;
|
|
4
|
+
dependencies: Map<string, string>;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Generates recursive Flexbox JSX structure from a normalized LayoutTreeNode.
|
|
8
|
+
*
|
|
9
|
+
* @param node The layout tree node to process
|
|
10
|
+
* @param indentLevel The current string indentation for pretty printing
|
|
11
|
+
* @returns Formatted JSX string containing structural <div> instances and leaf implementations
|
|
12
|
+
*/
|
|
13
|
+
export declare function generateLayoutJSX(node: LayoutTreeNode, sourceComponent: ComponentDefinition, model: DesignSystemModel, namingStrategy: any, indentLevel?: number): LayoutJSXResult;
|
|
14
|
+
//# sourceMappingURL=layout-jsx.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-jsx.d.ts","sourceRoot":"","sources":["../../src/components/layout-jsx.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAkB,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAIzH,MAAM,WAAW,eAAe;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC7B,IAAI,EAAE,cAAc,EACpB,eAAe,EAAE,mBAAmB,EACpC,KAAK,EAAE,iBAAiB,EACxB,cAAc,EAAE,GAAG,EACnB,WAAW,GAAE,MAAU,GACxB,eAAe,CA2EjB"}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import { normalizeFigmaName } from "@calibrate-ds/core";
|
|
2
|
+
import { resolveRelativeImportTarget, resolveRelativeLayoutImport } from "./helpers.js";
|
|
3
|
+
/**
|
|
4
|
+
* Generates recursive Flexbox JSX structure from a normalized LayoutTreeNode.
|
|
5
|
+
*
|
|
6
|
+
* @param node The layout tree node to process
|
|
7
|
+
* @param indentLevel The current string indentation for pretty printing
|
|
8
|
+
* @returns Formatted JSX string containing structural <div> instances and leaf implementations
|
|
9
|
+
*/
|
|
10
|
+
export function generateLayoutJSX(node, sourceComponent, model, namingStrategy, indentLevel = 2) {
|
|
11
|
+
const dependencies = new Map();
|
|
12
|
+
const indent = " ".repeat(indentLevel);
|
|
13
|
+
const innerIndent = " ".repeat(indentLevel + 1);
|
|
14
|
+
// 1. First try to resolve if it represents an instance (even if it has children in the LayoutTree)
|
|
15
|
+
if (node.role === "instance") {
|
|
16
|
+
const { targetComponent, targetName, importPath } = tryResolveInstance(node, sourceComponent, model, namingStrategy);
|
|
17
|
+
if (targetComponent && targetName && importPath) {
|
|
18
|
+
dependencies.set(importPath, targetName);
|
|
19
|
+
return { jsx: `${indent}<${targetName} />`, dependencies };
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
if (node.type === "leaf") {
|
|
23
|
+
return renderLeafNode(node, sourceComponent, model, namingStrategy, indent);
|
|
24
|
+
}
|
|
25
|
+
// It is a container
|
|
26
|
+
const isRoot = indentLevel === 2; // Typically the outermost wrapper of the component
|
|
27
|
+
let tagName = "div";
|
|
28
|
+
let isPrimitive = false;
|
|
29
|
+
if (node.layout) {
|
|
30
|
+
if (node.layout.direction === "row") {
|
|
31
|
+
tagName = "Row";
|
|
32
|
+
isPrimitive = true;
|
|
33
|
+
}
|
|
34
|
+
else if (node.layout.direction === "column") {
|
|
35
|
+
tagName = "Stack";
|
|
36
|
+
isPrimitive = true;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (isPrimitive) {
|
|
40
|
+
const importPath = resolveRelativeLayoutImport(sourceComponent, tagName, namingStrategy);
|
|
41
|
+
dependencies.set(importPath, tagName);
|
|
42
|
+
}
|
|
43
|
+
// Base attributes string
|
|
44
|
+
let propsStr = "";
|
|
45
|
+
if (isPrimitive) {
|
|
46
|
+
const primitiveProps = generatePrimitivePropsString(node.layout);
|
|
47
|
+
if (primitiveProps) {
|
|
48
|
+
propsStr += primitiveProps;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// Generate inline style mapping Auto Layout Flexbox semantics securely
|
|
53
|
+
const styleObj = generateFlexStyleString(node.layout);
|
|
54
|
+
if (styleObj) {
|
|
55
|
+
propsStr += `style={{ ${styleObj} }}`;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
propsStr = propsStr ? ` ${propsStr}` : ""; // Ensure leading space if properties exist
|
|
59
|
+
// Format recursively printed children seamlessly traversing the DOM map
|
|
60
|
+
let childrenJSX = "";
|
|
61
|
+
if (node.children && node.children.length > 0) {
|
|
62
|
+
const childStrings = node.children.map(child => {
|
|
63
|
+
const childResult = generateLayoutJSX(child, sourceComponent, model, namingStrategy, indentLevel + 1);
|
|
64
|
+
for (const [path, name] of childResult.dependencies.entries()) {
|
|
65
|
+
dependencies.set(path, name);
|
|
66
|
+
}
|
|
67
|
+
return childResult.jsx;
|
|
68
|
+
});
|
|
69
|
+
childrenJSX = `\n${childStrings.join("\n")}\n${indent}`;
|
|
70
|
+
}
|
|
71
|
+
// Return the physically assembled container tag string!
|
|
72
|
+
return {
|
|
73
|
+
jsx: `${indent}<${tagName}${propsStr}>${childrenJSX}</${tagName}>`,
|
|
74
|
+
dependencies
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Formats canonical proprietary layout primitives mapping natively onto React components.
|
|
79
|
+
*/
|
|
80
|
+
function generatePrimitivePropsString(layout) {
|
|
81
|
+
if (!layout)
|
|
82
|
+
return "";
|
|
83
|
+
const props = [];
|
|
84
|
+
if (layout.gap) {
|
|
85
|
+
const gapVal = typeof layout.gap === "object" ? (layout.gap.resolvedToken?.name || layout.gap.rawValue) : layout.gap;
|
|
86
|
+
if (gapVal !== 0 && gapVal !== undefined) {
|
|
87
|
+
props.push(`gap={${typeof gapVal === "number" ? gapVal : `"${gapVal}"`}}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (layout.padding) {
|
|
91
|
+
const { top, right, bottom, left } = layout.padding;
|
|
92
|
+
const t = (top.resolvedToken?.name || top.rawValue);
|
|
93
|
+
const r = (right.resolvedToken?.name || right.rawValue);
|
|
94
|
+
const b = (bottom.resolvedToken?.name || bottom.rawValue);
|
|
95
|
+
const l = (left.resolvedToken?.name || left.rawValue);
|
|
96
|
+
if (t === b && l === r) {
|
|
97
|
+
if (t === l) {
|
|
98
|
+
if (t !== 0)
|
|
99
|
+
props.push(`padding="${typeof t === "number" ? t + "px" : t}"`);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
props.push(`padding="${typeof t === "number" ? t + "px" : t} ${typeof r === "number" ? r + "px" : r}"`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
props.push(`padding="${typeof t === "number" ? t + "px" : t} ${typeof r === "number" ? r + "px" : r} ${typeof b === "number" ? b + "px" : b} ${typeof l === "number" ? l + "px" : l}"`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (layout.mainAlignment) {
|
|
110
|
+
switch (layout.mainAlignment) {
|
|
111
|
+
case "center":
|
|
112
|
+
props.push('justify="center"');
|
|
113
|
+
break;
|
|
114
|
+
case "space-between":
|
|
115
|
+
props.push('justify="space-between"');
|
|
116
|
+
break;
|
|
117
|
+
case "start":
|
|
118
|
+
props.push('justify="flex-start"');
|
|
119
|
+
break;
|
|
120
|
+
case "end":
|
|
121
|
+
props.push('justify="flex-end"');
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (layout.crossAlignment) {
|
|
126
|
+
switch (layout.crossAlignment) {
|
|
127
|
+
case "center":
|
|
128
|
+
props.push('align="center"');
|
|
129
|
+
break;
|
|
130
|
+
case "start":
|
|
131
|
+
props.push('align="flex-start"');
|
|
132
|
+
break;
|
|
133
|
+
case "end":
|
|
134
|
+
props.push('align="flex-end"');
|
|
135
|
+
break;
|
|
136
|
+
case "baseline":
|
|
137
|
+
props.push('align="baseline"');
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return props.join(" ");
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Formats standard inline Flexbox CSS rules mimicking Figma Auto Layout primitives dynamically.
|
|
145
|
+
*/
|
|
146
|
+
function generateFlexStyleString(layout) {
|
|
147
|
+
if (!layout)
|
|
148
|
+
return null;
|
|
149
|
+
const styles = ['display: "flex"'];
|
|
150
|
+
if (layout.direction === "row") {
|
|
151
|
+
styles.push('flexDirection: "row"');
|
|
152
|
+
}
|
|
153
|
+
else if (layout.direction === "column") {
|
|
154
|
+
styles.push('flexDirection: "column"');
|
|
155
|
+
}
|
|
156
|
+
if (layout.gap) {
|
|
157
|
+
const gapVal = typeof layout.gap === "object" ? (layout.gap.resolvedToken?.name || layout.gap.rawValue) : layout.gap;
|
|
158
|
+
styles.push(`gap: ${typeof gapVal === "number" ? gapVal + "px" : gapVal}`);
|
|
159
|
+
}
|
|
160
|
+
if (layout.padding) {
|
|
161
|
+
const { top, right, bottom, left } = layout.padding;
|
|
162
|
+
const t = (top.resolvedToken?.name || top.rawValue);
|
|
163
|
+
const r = (right.resolvedToken?.name || right.rawValue);
|
|
164
|
+
const b = (bottom.resolvedToken?.name || bottom.rawValue);
|
|
165
|
+
const l = (left.resolvedToken?.name || left.rawValue);
|
|
166
|
+
// Optimize formatting shorthand natively if symmetric!
|
|
167
|
+
if (t === b && l === r) {
|
|
168
|
+
if (t === l) {
|
|
169
|
+
styles.push(`padding: ${typeof t === "number" ? t + "px" : t}`);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
styles.push(`padding: "${typeof t === "number" ? t + "px" : t} ${typeof r === "number" ? r + "px" : r}"`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
styles.push(`padding: "${typeof t === "number" ? t + "px" : t} ${typeof r === "number" ? r + "px" : r} ${typeof b === "number" ? b + "px" : b} ${typeof l === "number" ? l + "px" : l}"`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Alignment mappings bridging Axis heuristics to CSS
|
|
180
|
+
if (layout.mainAlignment) {
|
|
181
|
+
switch (layout.mainAlignment) {
|
|
182
|
+
case "center":
|
|
183
|
+
styles.push('justifyContent: "center"');
|
|
184
|
+
break;
|
|
185
|
+
case "space-between":
|
|
186
|
+
styles.push('justifyContent: "space-between"');
|
|
187
|
+
break;
|
|
188
|
+
case "start":
|
|
189
|
+
styles.push('justifyContent: "flex-start"');
|
|
190
|
+
break;
|
|
191
|
+
case "end":
|
|
192
|
+
styles.push('justifyContent: "flex-end"');
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
if (layout.crossAlignment) {
|
|
197
|
+
switch (layout.crossAlignment) {
|
|
198
|
+
case "center":
|
|
199
|
+
styles.push('alignItems: "center"');
|
|
200
|
+
break;
|
|
201
|
+
case "start":
|
|
202
|
+
styles.push('alignItems: "flex-start"');
|
|
203
|
+
break;
|
|
204
|
+
case "end":
|
|
205
|
+
styles.push('alignItems: "flex-end"');
|
|
206
|
+
break;
|
|
207
|
+
case "baseline":
|
|
208
|
+
styles.push('alignItems: "baseline"');
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return styles.join(", ");
|
|
213
|
+
}
|
|
214
|
+
function tryResolveInstance(node, sourceComponent, model, namingStrategy) {
|
|
215
|
+
if (node.role !== "instance")
|
|
216
|
+
return {};
|
|
217
|
+
let targetComponent;
|
|
218
|
+
// 1. Resolve securely by exact ID Mapping (Safest Signal natively)
|
|
219
|
+
if (node.componentId) {
|
|
220
|
+
targetComponent = model.components.find(c => c.id === node.componentId);
|
|
221
|
+
}
|
|
222
|
+
// 2. Fallback matching structural Figma Names heuristics organically
|
|
223
|
+
if (!targetComponent) {
|
|
224
|
+
const { baseName: instanceBaseName } = normalizeFigmaName(node.name || "");
|
|
225
|
+
const cleanInstanceName = instanceBaseName.replace(/[^a-zA-Z0-9]/g, "").toLowerCase();
|
|
226
|
+
if (cleanInstanceName) {
|
|
227
|
+
targetComponent = model.components.find(c => {
|
|
228
|
+
const { baseName: cBaseName } = normalizeFigmaName(c.name);
|
|
229
|
+
const cleanCanonicalName = cBaseName.replace(/[^a-zA-Z0-9]/g, "").toLowerCase();
|
|
230
|
+
return cleanCanonicalName === cleanInstanceName;
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// 3. Bind the deterministic Export Mapping predictably
|
|
235
|
+
if (targetComponent && targetComponent.id !== sourceComponent.id) {
|
|
236
|
+
const targetName = namingStrategy.formatComponentName(targetComponent.name);
|
|
237
|
+
const importPath = resolveRelativeImportTarget(sourceComponent, targetComponent, namingStrategy);
|
|
238
|
+
return { targetComponent, targetName, importPath };
|
|
239
|
+
}
|
|
240
|
+
return {};
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Predicts and maps correct component primitives securely targeting React native elements implicitly.
|
|
244
|
+
*/
|
|
245
|
+
function renderLeafNode(node, sourceComponent, model, namingStrategy, indent) {
|
|
246
|
+
const dependencies = new Map();
|
|
247
|
+
if (node.role === "instance") {
|
|
248
|
+
// Instance couldn't be resolved to a known component — emit a placeholder.
|
|
249
|
+
// Use the naming strategy so the identifier is valid and matches any future resolution.
|
|
250
|
+
const { baseName } = normalizeFigmaName(node.name || "Unknown");
|
|
251
|
+
const instanceName = namingStrategy.formatComponentName(baseName);
|
|
252
|
+
return { jsx: `${indent}{/* ptb: unresolved instance — ${instanceName} */}`, dependencies };
|
|
253
|
+
}
|
|
254
|
+
if (node.role === "text") {
|
|
255
|
+
// Fallback explicit text placeholders organically matching HTML structural primitives
|
|
256
|
+
return { jsx: `${indent}<span>${node.name || "Text"}</span>`, dependencies };
|
|
257
|
+
}
|
|
258
|
+
if (node.role === "icon") {
|
|
259
|
+
// Fallback explicit abstract vector placeholders organically
|
|
260
|
+
return { jsx: `${indent}<svg aria-label="${node.name || "icon"}" />`, dependencies };
|
|
261
|
+
}
|
|
262
|
+
// Generic fallback visually preserving space safely
|
|
263
|
+
return { jsx: `${indent}<div data-role="${node.role || "unknown"}" />`, dependencies };
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=layout-jsx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-jsx.js","sourceRoot":"","sources":["../../src/components/layout-jsx.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { PTBConfig, PruneResult, ComponentArtifacts } from "@calibrate-ds/shared-types";
|
|
2
|
+
/**
|
|
3
|
+
* Safely removes generated artifacts based on tracked paths in the manifest.
|
|
4
|
+
* Only deletes if the folder contains exactly the expected files.
|
|
5
|
+
*/
|
|
6
|
+
export declare function pruneComponents(config: PTBConfig, staleEntries: {
|
|
7
|
+
id: string;
|
|
8
|
+
data: ComponentArtifacts;
|
|
9
|
+
}[]): Promise<PruneResult>;
|
|
10
|
+
//# sourceMappingURL=prune-components.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prune-components.d.ts","sourceRoot":"","sources":["../../src/components/prune-components.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAG7F;;;GAGG;AACH,wBAAsB,eAAe,CACjC,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,kBAAkB,CAAA;CAAE,EAAE,GACzD,OAAO,CAAC,WAAW,CAAC,CAmEtB"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import * as fs from "node:fs/promises";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { resolveDSPaths } from "@calibrate-ds/core";
|
|
4
|
+
/**
|
|
5
|
+
* Safely removes generated artifacts based on tracked paths in the manifest.
|
|
6
|
+
* Only deletes if the folder contains exactly the expected files.
|
|
7
|
+
*/
|
|
8
|
+
export async function pruneComponents(config, staleEntries) {
|
|
9
|
+
const { packageRoot } = resolveDSPaths(config);
|
|
10
|
+
const result = {
|
|
11
|
+
deleted: [],
|
|
12
|
+
skipped: [],
|
|
13
|
+
errors: []
|
|
14
|
+
};
|
|
15
|
+
for (const { id, data } of staleEntries) {
|
|
16
|
+
// Find the folder from the artifacts.
|
|
17
|
+
if (!data.artifacts || data.artifacts.length === 0)
|
|
18
|
+
continue;
|
|
19
|
+
if (!data.folder) {
|
|
20
|
+
result.skipped.push(`${data.name} (missing folder path in manifest)`);
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
const folderPath = path.join(packageRoot, data.folder);
|
|
24
|
+
try {
|
|
25
|
+
const stats = await fs.stat(folderPath);
|
|
26
|
+
if (!stats.isDirectory()) {
|
|
27
|
+
result.errors.push(`Artifact path ${folderPath} is not a directory.`);
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
const filesInDir = await fs.readdir(folderPath);
|
|
31
|
+
const expectedBasenames = new Set(data.artifacts.map((f) => path.basename(f)));
|
|
32
|
+
let hasUnexpectedFiles = false;
|
|
33
|
+
for (const file of filesInDir) {
|
|
34
|
+
if (!expectedBasenames.has(file)) {
|
|
35
|
+
hasUnexpectedFiles = true;
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (hasUnexpectedFiles) {
|
|
40
|
+
result.skipped.push(`${data.name} (unexpected files in ${folderPath})`);
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
// Safe to delete files
|
|
44
|
+
for (const artifact of data.artifacts) {
|
|
45
|
+
const fullPath = path.join(packageRoot, artifact);
|
|
46
|
+
try {
|
|
47
|
+
const artifactStats = await fs.stat(fullPath);
|
|
48
|
+
if (artifactStats.isFile()) {
|
|
49
|
+
await fs.unlink(fullPath);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
await fs.rm(folderPath, { recursive: true, force: true });
|
|
56
|
+
result.deleted.push(data.name);
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
if (err.code === "ENOENT") {
|
|
60
|
+
result.deleted.push(data.name);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
result.errors.push(`Error pruning ${data.name}: ${err.message}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=prune-components.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prune-components.js","sourceRoot":"","sources":["../../src/components/prune-components.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { TokenCollection } from "@calibrate-ds/shared-types";
|
|
2
|
+
/**
|
|
3
|
+
* Heuristically infers which token collections are likely relevant to a component
|
|
4
|
+
* based on its name and category path.
|
|
5
|
+
*/
|
|
6
|
+
export declare function inferRelevantTokenCollections(componentName: string, categoryPath: string, availableCollections: TokenCollection[]): TokenCollection[];
|
|
7
|
+
/**
|
|
8
|
+
* Computes a simple relative path from inside a component directory back to the tokens directory.
|
|
9
|
+
* Assumes component generation is at `src/components/<category>/<name>/`
|
|
10
|
+
* Assumes token generation is at `src/tokens/`
|
|
11
|
+
*/
|
|
12
|
+
export declare function resolveRelativeTokenImport(collectionName: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Formats a clean variable name from a collection name to import.
|
|
15
|
+
* E.g. "Brand Colors" -> "brandColors"
|
|
16
|
+
*/
|
|
17
|
+
export declare function formatCollectionImportName(collectionName: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* Valid Style Intents
|
|
20
|
+
*/
|
|
21
|
+
export type StyleSlot = "background" | "text" | "border" | "radius" | "spacingX" | "spacingY" | "iconColor" | "placeholder" | "focusRing" | "opacity";
|
|
22
|
+
/**
|
|
23
|
+
* Predicts the essential structural intent attributes a given component typically uses.
|
|
24
|
+
*/
|
|
25
|
+
export declare function inferStyleSlots(componentName: string, categoryPath: string): StyleSlot[];
|
|
26
|
+
/**
|
|
27
|
+
* Guesses the most reasonable literal exact Token per requested slot locally spanning the Collections mapped.
|
|
28
|
+
* Returns a Record of strictly typed token literal bindings representing Figma stylistic intent physically mapped!
|
|
29
|
+
* If a token is NOT found, it maps directly against the physical `styleMetadata` literals available avoiding empty refs.
|
|
30
|
+
*/
|
|
31
|
+
export declare function selectTokensForSlots(slots: StyleSlot[], availableCollections: TokenCollection[], styleMetadata?: Record<string, string | number>): Record<string, string>;
|
|
32
|
+
//# sourceMappingURL=token-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-helpers.d.ts","sourceRoot":"","sources":["../../src/components/token-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE;;;GAGG;AACH,wBAAgB,6BAA6B,CACzC,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,oBAAoB,EAAE,eAAe,EAAE,GACxC,eAAe,EAAE,CA4BnB;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAQzE;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAIzE;AAED;;GAEG;AACH,MAAM,MAAM,SAAS,GACf,YAAY,GACZ,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,UAAU,GACV,WAAW,GACX,aAAa,GACb,WAAW,GACX,SAAS,CAAC;AAEhB;;GAEG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,SAAS,EAAE,CAqCxF;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAChC,KAAK,EAAE,SAAS,EAAE,EAClB,oBAAoB,EAAE,eAAe,EAAE,EACvC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAChD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkGxB"}
|