@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,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heuristically infers which token collections are likely relevant to a component
|
|
3
|
+
* based on its name and category path.
|
|
4
|
+
*/
|
|
5
|
+
export function inferRelevantTokenCollections(componentName, categoryPath, availableCollections) {
|
|
6
|
+
const searchString = `${componentName.toLowerCase()} ${categoryPath.toLowerCase()}`;
|
|
7
|
+
const relevantIds = new Set();
|
|
8
|
+
// Define simple heuristic rules mapping keywords to potential token collection topics
|
|
9
|
+
const wantsColors = searchString.includes("button") || searchString.includes("input") || searchString.includes("icon") || searchString.includes("card") || searchString.includes("badge");
|
|
10
|
+
const wantsSpacing = searchString.includes("button") || searchString.includes("input") || searchString.includes("list") || searchString.includes("card") || searchString.includes("layout");
|
|
11
|
+
const wantsTypography = searchString.includes("text") || searchString.includes("input") || searchString.includes("paragraph") || searchString.includes("heading");
|
|
12
|
+
const wantsRadius = searchString.includes("button") || searchString.includes("input") || searchString.includes("card") || searchString.includes("badge");
|
|
13
|
+
for (const collection of availableCollections) {
|
|
14
|
+
const name = collection.name.toLowerCase();
|
|
15
|
+
if (wantsColors && (name.includes("color") || name.includes("brand") || name.includes("theme"))) {
|
|
16
|
+
relevantIds.add(collection.id);
|
|
17
|
+
}
|
|
18
|
+
if (wantsSpacing && (name.includes("space") || name.includes("spacing") || name.includes("layout"))) {
|
|
19
|
+
relevantIds.add(collection.id);
|
|
20
|
+
}
|
|
21
|
+
if (wantsTypography && (name.includes("type") || name.includes("typography") || name.includes("font") || name.includes("text"))) {
|
|
22
|
+
relevantIds.add(collection.id);
|
|
23
|
+
}
|
|
24
|
+
if (wantsRadius && (name.includes("radius") || name.includes("rounded") || name.includes("corner"))) {
|
|
25
|
+
relevantIds.add(collection.id);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return availableCollections.filter(c => relevantIds.has(c.id));
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Computes a simple relative path from inside a component directory back to the tokens directory.
|
|
32
|
+
* Assumes component generation is at `src/components/<category>/<name>/`
|
|
33
|
+
* Assumes token generation is at `src/tokens/`
|
|
34
|
+
*/
|
|
35
|
+
export function resolveRelativeTokenImport(collectionName) {
|
|
36
|
+
// A clean normalization formatting typical collection names into valid file imports.
|
|
37
|
+
// E.g. "Brand Colors" -> "brand-colors.js"
|
|
38
|
+
const safeName = collectionName.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/(^-|-$)/g, "");
|
|
39
|
+
// Components are nested 3 levels deep from `src` root: `components/category/name/`
|
|
40
|
+
// Therefore, climbing back to `src/tokens/` requires `../../../tokens/`
|
|
41
|
+
return `../../../tokens/${safeName}.js`;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Formats a clean variable name from a collection name to import.
|
|
45
|
+
* E.g. "Brand Colors" -> "brandColors"
|
|
46
|
+
*/
|
|
47
|
+
export function formatCollectionImportName(collectionName) {
|
|
48
|
+
const words = collectionName.split(/[^a-zA-Z0-9]+/);
|
|
49
|
+
const camel = words.map((w, i) => i === 0 ? w.toLowerCase() : w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join("");
|
|
50
|
+
return camel || "tokens";
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Predicts the essential structural intent attributes a given component typically uses.
|
|
54
|
+
*/
|
|
55
|
+
export function inferStyleSlots(componentName, categoryPath) {
|
|
56
|
+
const searchString = `${componentName.toLowerCase()} ${categoryPath.toLowerCase()}`;
|
|
57
|
+
const slots = new Set();
|
|
58
|
+
if (searchString.includes("button")) {
|
|
59
|
+
slots.add("background");
|
|
60
|
+
slots.add("text");
|
|
61
|
+
slots.add("border");
|
|
62
|
+
slots.add("radius");
|
|
63
|
+
slots.add("spacingX");
|
|
64
|
+
slots.add("spacingY");
|
|
65
|
+
}
|
|
66
|
+
else if (searchString.includes("input") || searchString.includes("textfield")) {
|
|
67
|
+
slots.add("border");
|
|
68
|
+
slots.add("text");
|
|
69
|
+
slots.add("placeholder");
|
|
70
|
+
slots.add("radius");
|
|
71
|
+
slots.add("spacingX");
|
|
72
|
+
slots.add("spacingY");
|
|
73
|
+
}
|
|
74
|
+
else if (searchString.includes("check") || searchString.includes("radio") || searchString.includes("switch")) {
|
|
75
|
+
slots.add("border");
|
|
76
|
+
slots.add("background");
|
|
77
|
+
}
|
|
78
|
+
else if (searchString.includes("icon")) {
|
|
79
|
+
slots.add("iconColor");
|
|
80
|
+
}
|
|
81
|
+
else if (searchString.includes("chip") || searchString.includes("tag") || searchString.includes("badge")) {
|
|
82
|
+
slots.add("background");
|
|
83
|
+
slots.add("text");
|
|
84
|
+
slots.add("radius");
|
|
85
|
+
slots.add("spacingX");
|
|
86
|
+
}
|
|
87
|
+
// Default fallback structural slots
|
|
88
|
+
if (slots.size === 0) {
|
|
89
|
+
slots.add("background");
|
|
90
|
+
slots.add("text");
|
|
91
|
+
}
|
|
92
|
+
return Array.from(slots);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Guesses the most reasonable literal exact Token per requested slot locally spanning the Collections mapped.
|
|
96
|
+
* Returns a Record of strictly typed token literal bindings representing Figma stylistic intent physically mapped!
|
|
97
|
+
* If a token is NOT found, it maps directly against the physical `styleMetadata` literals available avoiding empty refs.
|
|
98
|
+
*/
|
|
99
|
+
export function selectTokensForSlots(slots, availableCollections, styleMetadata) {
|
|
100
|
+
const mappings = {};
|
|
101
|
+
for (const slot of slots) {
|
|
102
|
+
let bestMatch = null;
|
|
103
|
+
for (const collection of availableCollections) {
|
|
104
|
+
const prefix = formatCollectionImportName(collection.name);
|
|
105
|
+
for (const token of collection.tokens) {
|
|
106
|
+
const tokenSearch = `${token.name.toLowerCase()} ${token.type.toLowerCase()}`;
|
|
107
|
+
// Color Slots
|
|
108
|
+
if (slot === "background" || slot === "text" || slot === "border" || slot === "iconColor" || slot === "placeholder" || slot === "focusRing") {
|
|
109
|
+
if (token.type !== "color")
|
|
110
|
+
continue;
|
|
111
|
+
if (slot === "background" && (tokenSearch.includes("bg") || tokenSearch.includes("background") || tokenSearch.includes("surface"))) {
|
|
112
|
+
bestMatch = { collectionPrefix: prefix, tokenName: token.name };
|
|
113
|
+
}
|
|
114
|
+
if (slot === "text" && (tokenSearch.includes("text") || tokenSearch.includes("foreground") || tokenSearch.includes("content"))) {
|
|
115
|
+
bestMatch = { collectionPrefix: prefix, tokenName: token.name };
|
|
116
|
+
}
|
|
117
|
+
if (slot === "border" && (tokenSearch.includes("border") || tokenSearch.includes("stroke") || tokenSearch.includes("outline"))) {
|
|
118
|
+
bestMatch = { collectionPrefix: prefix, tokenName: token.name };
|
|
119
|
+
}
|
|
120
|
+
if (slot === "iconColor" && (tokenSearch.includes("icon") || tokenSearch.includes("text") || tokenSearch.includes("primary"))) {
|
|
121
|
+
bestMatch = { collectionPrefix: prefix, tokenName: token.name };
|
|
122
|
+
}
|
|
123
|
+
if (slot === "placeholder" && (tokenSearch.includes("placeholder") || tokenSearch.includes("muted") || tokenSearch.includes("secondary"))) {
|
|
124
|
+
bestMatch = { collectionPrefix: prefix, tokenName: token.name };
|
|
125
|
+
}
|
|
126
|
+
if (slot === "focusRing" && (tokenSearch.includes("focus") || tokenSearch.includes("ring"))) {
|
|
127
|
+
bestMatch = { collectionPrefix: prefix, tokenName: token.name };
|
|
128
|
+
}
|
|
129
|
+
// Strict literal check takes precedence over generic fuzzy fallbacks
|
|
130
|
+
if (!bestMatch && (!styleMetadata || styleMetadata[slot] === undefined)) {
|
|
131
|
+
if (tokenSearch.includes("primary") || tokenSearch.includes("brand")) {
|
|
132
|
+
bestMatch = { collectionPrefix: prefix, tokenName: token.name };
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Radius Slots
|
|
137
|
+
if (slot === "radius") {
|
|
138
|
+
if (token.type !== "radius")
|
|
139
|
+
continue;
|
|
140
|
+
if (tokenSearch.includes("base") || tokenSearch.includes("md") || tokenSearch.includes("medium") || tokenSearch.includes("sm") || tokenSearch.includes("small") || tokenSearch.includes("default")) {
|
|
141
|
+
bestMatch = { collectionPrefix: prefix, tokenName: token.name };
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
if (!bestMatch && (!styleMetadata || styleMetadata[slot] === undefined)) {
|
|
145
|
+
bestMatch = { collectionPrefix: prefix, tokenName: token.name };
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Spacing Slots
|
|
149
|
+
if (slot === "spacingX" || slot === "spacingY") {
|
|
150
|
+
if (token.type !== "spacing")
|
|
151
|
+
continue;
|
|
152
|
+
if (slot === "spacingX" && (tokenSearch.includes("md") || tokenSearch.includes("medium") || tokenSearch.includes("padding"))) {
|
|
153
|
+
bestMatch = { collectionPrefix: prefix, tokenName: token.name };
|
|
154
|
+
}
|
|
155
|
+
if (slot === "spacingY" && (tokenSearch.includes("sm") || tokenSearch.includes("small") || tokenSearch.includes("padding"))) {
|
|
156
|
+
bestMatch = { collectionPrefix: prefix, tokenName: token.name };
|
|
157
|
+
}
|
|
158
|
+
if (!bestMatch && (!styleMetadata || styleMetadata[slot] === undefined)) {
|
|
159
|
+
bestMatch = { collectionPrefix: prefix, tokenName: token.name };
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// Opacity Slots
|
|
163
|
+
if (slot === "opacity") {
|
|
164
|
+
if (tokenSearch.includes("opacity") || tokenSearch.includes("alpha") || tokenSearch.includes("transparent")) {
|
|
165
|
+
bestMatch = { collectionPrefix: prefix, tokenName: token.name };
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
if (!bestMatch && (!styleMetadata || styleMetadata[slot] === undefined)) {
|
|
169
|
+
bestMatch = { collectionPrefix: prefix, tokenName: token.name };
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
if (bestMatch) {
|
|
175
|
+
// Formatting the exact deterministic variable dot accession, ex: "brandColors.primary"
|
|
176
|
+
const safeTokenName = bestMatch.tokenName.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/(^-|-$)/g, "");
|
|
177
|
+
const camelTokenName = safeTokenName.split("-").map((w, i) => i === 0 ? w : w.charAt(0).toUpperCase() + w.slice(1)).join("");
|
|
178
|
+
mappings[slot] = `${bestMatch.collectionPrefix}Tokens.${camelTokenName || "default"}`;
|
|
179
|
+
}
|
|
180
|
+
else if (styleMetadata && styleMetadata[slot] !== undefined) {
|
|
181
|
+
// Fallback structurally directly to raw primitive natively tracking design attributes purely!
|
|
182
|
+
const literalValue = styleMetadata[slot];
|
|
183
|
+
mappings[slot] = typeof literalValue === "number" ? String(literalValue) : `"${literalValue}"`;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return mappings;
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=token-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-helpers.js","sourceRoot":"","sources":["../../src/components/token-helpers.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,6BAA6B,CACzC,aAAqB,EACrB,YAAoB,EACpB,oBAAuC;IAEvC,MAAM,YAAY,GAAG,GAAG,aAAa,CAAC,WAAW,EAAE,IAAI,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC;IACpF,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IAEtC,sFAAsF;IACtF,MAAM,WAAW,GAAG,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC1L,MAAM,YAAY,GAAG,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5L,MAAM,eAAe,GAAG,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAClK,MAAM,WAAW,GAAG,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAEzJ,KAAK,MAAM,UAAU,IAAI,oBAAoB,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAE3C,IAAI,WAAW,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAC9F,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YAClG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,eAAe,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YAC9H,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,WAAW,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YAClG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC;IACL,CAAC;IAED,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACnE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,cAAsB;IAC7D,qFAAqF;IACrF,2CAA2C;IAC3C,MAAM,QAAQ,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAElG,mFAAmF;IACnF,wEAAwE;IACxE,OAAO,mBAAmB,QAAQ,KAAK,CAAC;AAC5C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CAAC,cAAsB;IAC7D,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7H,OAAO,KAAK,IAAI,QAAQ,CAAC;AAC7B,CAAC;AAiBD;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,aAAqB,EAAE,YAAoB;IACvE,MAAM,YAAY,GAAG,GAAG,aAAa,CAAC,WAAW,EAAE,IAAI,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC;IACpF,MAAM,KAAK,GAAG,IAAI,GAAG,EAAa,CAAC;IAEnC,IAAI,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACxB,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClB,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpB,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpB,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACtB,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC1B,CAAC;SAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9E,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpB,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClB,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACzB,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpB,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACtB,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC1B,CAAC;SAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7G,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpB,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC5B,CAAC;SAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACvC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC3B,CAAC;SAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACzG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACxB,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClB,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpB,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC1B,CAAC;IAED,oCAAoC;IACpC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACnB,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACxB,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAChC,KAAkB,EAClB,oBAAuC,EACvC,aAA+C;IAE/C,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAE5C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,SAAS,GAA2D,IAAI,CAAC;QAE7E,KAAK,MAAM,UAAU,IAAI,oBAAoB,EAAE,CAAC;YAC5C,MAAM,MAAM,GAAG,0BAA0B,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAE3D,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;gBACpC,MAAM,WAAW,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBAE9E,cAAc;gBACd,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,aAAa,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;oBAC1I,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;wBAAE,SAAS;oBAErC,IAAI,IAAI,KAAK,YAAY,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;wBACjI,SAAS,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;oBACpE,CAAC;oBACD,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;wBAC7H,SAAS,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;oBACpE,CAAC;oBACD,IAAI,IAAI,KAAK,QAAQ,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;wBAC7H,SAAS,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;oBACpE,CAAC;oBACD,IAAI,IAAI,KAAK,WAAW,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;wBAC5H,SAAS,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;oBACpE,CAAC;oBACD,IAAI,IAAI,KAAK,aAAa,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;wBACxI,SAAS,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;oBACpE,CAAC;oBACD,IAAI,IAAI,KAAK,WAAW,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;wBAC1F,SAAS,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;oBACpE,CAAC;oBAED,qEAAqE;oBACrE,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,aAAa,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,EAAE,CAAC;wBACtE,IAAI,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;4BACnE,SAAS,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;wBACpE,CAAC;oBACL,CAAC;gBACL,CAAC;gBAED,eAAe;gBACf,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACpB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;wBAAE,SAAS;oBACtC,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;wBACjM,SAAS,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;wBAChE,MAAM;oBACV,CAAC;oBACD,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,aAAa,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,EAAE,CAAC;wBACtE,SAAS,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;oBACpE,CAAC;gBACL,CAAC;gBAED,gBAAgB;gBAChB,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;oBAC7C,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;wBAAE,SAAS;oBAEvC,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;wBAC3H,SAAS,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;oBACpE,CAAC;oBACD,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;wBAC1H,SAAS,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;oBACpE,CAAC;oBAED,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,aAAa,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,EAAE,CAAC;wBACtE,SAAS,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;oBACpE,CAAC;gBACL,CAAC;gBAED,gBAAgB;gBAChB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBACrB,IAAI,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;wBAC1G,SAAS,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;wBAChE,MAAM;oBACV,CAAC;oBACD,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,aAAa,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,EAAE,CAAC;wBACtE,SAAS,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;oBACpE,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACZ,uFAAuF;YACvF,MAAM,aAAa,GAAG,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAC5G,MAAM,cAAc,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAE7H,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC,gBAAgB,UAAU,cAAc,IAAI,SAAS,EAAE,CAAC;QAC1F,CAAC;aAAM,IAAI,aAAa,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YAC5D,8FAA8F;YAC9F,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;YACzC,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,YAAY,GAAG,CAAC;QACnG,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { DesignSystemModel, PTBConfig } from "@calibrate-ds/shared-types";
|
|
2
|
+
export type ComponentArtifactsReport = {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
folder: string;
|
|
6
|
+
files: string[];
|
|
7
|
+
};
|
|
8
|
+
export type WriteComponentsReport = {
|
|
9
|
+
createdFiles: string[];
|
|
10
|
+
skippedFiles: string[];
|
|
11
|
+
components: ComponentArtifactsReport[];
|
|
12
|
+
};
|
|
13
|
+
export type WriteComponentsOptions = {
|
|
14
|
+
forceOverwriteComponents?: string[];
|
|
15
|
+
};
|
|
16
|
+
export declare function writeComponents(model: DesignSystemModel, config: PTBConfig, options?: WriteComponentsOptions): Promise<WriteComponentsReport>;
|
|
17
|
+
//# sourceMappingURL=write-components.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-components.d.ts","sourceRoot":"","sources":["../../src/components/write-components.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAQ/E,MAAM,MAAM,wBAAwB,GAAG;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAChC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,wBAAwB,EAAE,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACjC,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAC;CACvC,CAAC;AAEF,wBAAsB,eAAe,CACjC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,SAAS,EACjB,OAAO,CAAC,EAAE,sBAAsB,GACjC,OAAO,CAAC,qBAAqB,CAAC,CA4LhC"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import * as fs from "node:fs/promises";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { generateTypesFile } from "./generate-types-file.js";
|
|
4
|
+
import { generateComponentFile } from "./generate-component-file.js";
|
|
5
|
+
import { generateCompositeTypesFile } from "./generate-composite-types.js";
|
|
6
|
+
import { generateCompositeFile } from "./generate-composite-file.js";
|
|
7
|
+
import { generateComponentCss } from "./generate-component-css.js";
|
|
8
|
+
import { resolveDSPaths, createNamingStrategy, normalizeIconDisplayName, isIconComponent } from "@calibrate-ds/core";
|
|
9
|
+
export async function writeComponents(model, config, options) {
|
|
10
|
+
const report = {
|
|
11
|
+
createdFiles: [],
|
|
12
|
+
skippedFiles: [],
|
|
13
|
+
components: []
|
|
14
|
+
};
|
|
15
|
+
const namingStrategy = createNamingStrategy(config.naming);
|
|
16
|
+
const { componentsDir } = resolveDSPaths(config);
|
|
17
|
+
const useTypescript = config.framework.typescript;
|
|
18
|
+
// Ensure output directories exist universally
|
|
19
|
+
await fs.mkdir(componentsDir, { recursive: true });
|
|
20
|
+
const components = model.components || [];
|
|
21
|
+
// Track for index Generation natively safely
|
|
22
|
+
const indexExports = [];
|
|
23
|
+
const categoryIndexMap = new Map(); // categoryFolder -> indexExports
|
|
24
|
+
for (const component of components) {
|
|
25
|
+
const normalizedName = isIconComponent(component.name)
|
|
26
|
+
? normalizeIconDisplayName(component.name)
|
|
27
|
+
: component.name;
|
|
28
|
+
const folderName = namingStrategy.formatFolderName(normalizedName);
|
|
29
|
+
const componentName = namingStrategy.formatComponentName(normalizedName);
|
|
30
|
+
// Categorize structure directly mirroring Figma!
|
|
31
|
+
let folderPath = path.join(componentsDir, folderName);
|
|
32
|
+
let exportPath = `./${folderName}/index.js`;
|
|
33
|
+
let categoryFolder = "";
|
|
34
|
+
if (component.categoryPath) {
|
|
35
|
+
categoryFolder = namingStrategy.formatFolderName(component.categoryPath);
|
|
36
|
+
folderPath = path.join(componentsDir, categoryFolder, folderName);
|
|
37
|
+
exportPath = `./${categoryFolder}/${folderName}/index.js`;
|
|
38
|
+
if (!categoryIndexMap.has(categoryFolder)) {
|
|
39
|
+
categoryIndexMap.set(categoryFolder, []);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
if (!categoryIndexMap.has("__root_category_unassigned")) {
|
|
44
|
+
categoryIndexMap.set("__root_category_unassigned", []);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
await fs.mkdir(folderPath, { recursive: true });
|
|
48
|
+
// Setup Structural Names
|
|
49
|
+
const componentExt = useTypescript ? "tsx" : "jsx";
|
|
50
|
+
const componentFileName = `${componentName}.${componentExt}`;
|
|
51
|
+
const typesFileName = `${componentName}.types.ts`;
|
|
52
|
+
const indexFileName = `index.${useTypescript ? "ts" : "js"}`;
|
|
53
|
+
const cssFileName = `${componentName}.module.css`;
|
|
54
|
+
const componentFilePath = path.join(folderPath, componentFileName);
|
|
55
|
+
const typesFilePath = path.join(folderPath, typesFileName);
|
|
56
|
+
const indexFilePath = path.join(folderPath, indexFileName);
|
|
57
|
+
const cssFilePath = path.join(folderPath, cssFileName);
|
|
58
|
+
// Brownfield Native checks per component structural bound !
|
|
59
|
+
// 1. Types File
|
|
60
|
+
const forceRewrite = options?.forceOverwriteComponents?.includes(component.name);
|
|
61
|
+
if (useTypescript) {
|
|
62
|
+
try {
|
|
63
|
+
if (forceRewrite)
|
|
64
|
+
throw new Error("overwrite_trigger");
|
|
65
|
+
await fs.stat(typesFilePath);
|
|
66
|
+
report.skippedFiles.push(`${folderName}/${typesFileName}`);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
const typesContent = component.kind.value === "composite"
|
|
70
|
+
? generateCompositeTypesFile(component, config)
|
|
71
|
+
: generateTypesFile(component, config);
|
|
72
|
+
await fs.writeFile(typesFilePath, typesContent, "utf-8");
|
|
73
|
+
report.createdFiles.push(`${folderName}/${typesFileName}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// 2. React UI Component
|
|
77
|
+
try {
|
|
78
|
+
if (forceRewrite)
|
|
79
|
+
throw new Error("overwrite_trigger");
|
|
80
|
+
await fs.stat(componentFilePath);
|
|
81
|
+
report.skippedFiles.push(`${folderName}/${componentFileName}`);
|
|
82
|
+
}
|
|
83
|
+
catch (statErr) {
|
|
84
|
+
if (statErr?.message !== "overwrite_trigger" && statErr?.code !== "ENOENT") {
|
|
85
|
+
console.warn(`[PTB] Skipping ${componentName}: ${statErr?.message}`);
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
const componentContent = component.kind.value === "composite"
|
|
90
|
+
? generateCompositeFile(component, model, config)
|
|
91
|
+
: generateComponentFile(component, config, model);
|
|
92
|
+
await fs.writeFile(componentFilePath, componentContent, "utf-8");
|
|
93
|
+
report.createdFiles.push(`${folderName}/${componentFileName}`);
|
|
94
|
+
}
|
|
95
|
+
catch (genErr) {
|
|
96
|
+
console.warn(`[PTB] Skipping ${componentName}: ${genErr?.message}`);
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// 3. CSS Module — written when generation.cssFiles is true (user-controlled, independent of styling approach)
|
|
101
|
+
const useCssModules = config.generation?.cssFiles !== false;
|
|
102
|
+
if (useCssModules) {
|
|
103
|
+
try {
|
|
104
|
+
if (forceRewrite)
|
|
105
|
+
throw new Error("overwrite_trigger");
|
|
106
|
+
await fs.stat(cssFilePath);
|
|
107
|
+
report.skippedFiles.push(`${folderName}/${cssFileName}`);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
const cssContent = generateComponentCss(component);
|
|
111
|
+
await fs.writeFile(cssFilePath, cssContent, "utf-8");
|
|
112
|
+
report.createdFiles.push(`${folderName}/${cssFileName}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// 4. Folder Barrel
|
|
116
|
+
try {
|
|
117
|
+
if (forceRewrite)
|
|
118
|
+
throw new Error("overwrite_trigger");
|
|
119
|
+
await fs.stat(indexFilePath);
|
|
120
|
+
report.skippedFiles.push(`${folderName}/${indexFileName}`);
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
const indexContent = `export * from "./${componentName}.js";\n`;
|
|
124
|
+
await fs.writeFile(indexFilePath, indexContent, "utf-8");
|
|
125
|
+
report.createdFiles.push(`${folderName}/${indexFileName}`);
|
|
126
|
+
}
|
|
127
|
+
// Register natively mapped outputs for root component index injection!
|
|
128
|
+
indexExports.push(`export * from "${exportPath}";`);
|
|
129
|
+
const mapKey = categoryFolder || "__root_category_unassigned";
|
|
130
|
+
categoryIndexMap.get(mapKey)?.push(`export * from "./${folderName}/index.js";`);
|
|
131
|
+
// Record artifacts for manifest tracking
|
|
132
|
+
report.components.push({
|
|
133
|
+
id: component.id,
|
|
134
|
+
name: component.name,
|
|
135
|
+
folder: categoryFolder ? `${categoryFolder}/${folderName}` : folderName,
|
|
136
|
+
files: [
|
|
137
|
+
componentFileName,
|
|
138
|
+
typesFileName,
|
|
139
|
+
indexFileName,
|
|
140
|
+
...(useCssModules ? [cssFileName] : [])
|
|
141
|
+
]
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
// Pushing root components index.ts abstractly matching token pipeline cleanly
|
|
145
|
+
// Since this acts as the dynamic CLI barrel, overwrite it safely on generate
|
|
146
|
+
const rootIndexPath = path.join(componentsDir, `index.${useTypescript ? "ts" : "js"}`);
|
|
147
|
+
const indexContent = `/**
|
|
148
|
+
* Generated Design System Components Root Index
|
|
149
|
+
* Calibrate native safe mappings.
|
|
150
|
+
*/\n\n${indexExports.join("\n")}\n`;
|
|
151
|
+
await fs.writeFile(rootIndexPath, indexContent, "utf-8");
|
|
152
|
+
report.createdFiles.push("index.ts (root components barrel)");
|
|
153
|
+
// Write internal category barrels natively to guarantee clean structures
|
|
154
|
+
for (const [category, exports] of categoryIndexMap.entries()) {
|
|
155
|
+
if (category === "__root_category_unassigned")
|
|
156
|
+
continue;
|
|
157
|
+
const categoryIndexPath = path.join(componentsDir, category, `index.${useTypescript ? "ts" : "js"}`);
|
|
158
|
+
try {
|
|
159
|
+
const existingStat = await fs.stat(categoryIndexPath);
|
|
160
|
+
if (existingStat.isFile()) {
|
|
161
|
+
const existingContent = await fs.readFile(categoryIndexPath, "utf-8");
|
|
162
|
+
const newExports = exports.filter(exp => !existingContent.includes(exp));
|
|
163
|
+
if (newExports.length > 0) {
|
|
164
|
+
await fs.appendFile(categoryIndexPath, `\n// Generated Category Exports\n${newExports.join("\n")}\n`);
|
|
165
|
+
report.createdFiles.push(`${category}/index.ts (appended)`);
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
report.skippedFiles.push(`${category}/index.ts (barrel tracked)`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
const indexContent = `/**
|
|
174
|
+
* Generated Design System Category Barrel
|
|
175
|
+
* Calibrate native safe mappings.
|
|
176
|
+
*/\n\n${exports.join("\n")}\n`;
|
|
177
|
+
await fs.writeFile(categoryIndexPath, indexContent, "utf-8");
|
|
178
|
+
report.createdFiles.push(`${category}/index.ts (category barrel)`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// 4. Finally generate our foundational generics
|
|
182
|
+
await writeLayoutPrimitives(componentsDir, useTypescript, report);
|
|
183
|
+
return report;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Ensures structural placeholder primitives `<Row>`, `<Stack>`, and `<Grid>` natively exist inside projects dynamically modifying structural generic flexbox mappings.
|
|
187
|
+
*/
|
|
188
|
+
async function writeLayoutPrimitives(componentsDir, useTypescript, report) {
|
|
189
|
+
const layoutDir = path.join(path.dirname(componentsDir), "layout");
|
|
190
|
+
await fs.mkdir(layoutDir, { recursive: true });
|
|
191
|
+
const ext = useTypescript ? "tsx" : "jsx";
|
|
192
|
+
const primitives = [
|
|
193
|
+
{
|
|
194
|
+
name: "Row",
|
|
195
|
+
content: `import * as React from "react";\n\nexport function Row({ gap, align, justify, padding, children, className, style, ...props }${useTypescript ? ": any" : ""}) {\n const internalStyle = {\n display: "flex",\n flexDirection: "row" as const,\n ...(gap !== undefined && { gap }),\n ...(align && { alignItems: align }),\n ...(justify && { justifyContent: justify }),\n ...(padding && { padding }),\n ...style\n };\n return (\n <div className={className} style={internalStyle} {...props}>\n {children}\n </div>\n );\n}\n`
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
name: "Stack",
|
|
199
|
+
content: `import * as React from "react";\n\nexport function Stack({ gap, align, justify, padding, children, className, style, ...props }${useTypescript ? ": any" : ""}) {\n const internalStyle = {\n display: "flex",\n flexDirection: "column" as const,\n ...(gap !== undefined && { gap }),\n ...(align && { alignItems: align }),\n ...(justify && { justifyContent: justify }),\n ...(padding && { padding }),\n ...style\n };\n return (\n <div className={className} style={internalStyle} {...props}>\n {children}\n </div>\n );\n}\n`
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
name: "Grid",
|
|
203
|
+
content: `import * as React from "react";\n\nexport function Grid({ gap, children, className, style, ...props }${useTypescript ? ": any" : ""}) {\n const internalStyle = {\n display: "grid",\n ...(gap !== undefined && { gap }),\n ...style\n };\n return (\n <div className={className} style={internalStyle} {...props}>\n {children}\n </div>\n );\n}\n`
|
|
204
|
+
}
|
|
205
|
+
];
|
|
206
|
+
for (const prim of primitives) {
|
|
207
|
+
const filePath = path.join(layoutDir, `${prim.name}.${ext}`);
|
|
208
|
+
try {
|
|
209
|
+
await fs.stat(filePath);
|
|
210
|
+
report.skippedFiles.push(`../layout/${prim.name}.${ext}`);
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
await fs.writeFile(filePath, prim.content, "utf-8");
|
|
214
|
+
report.createdFiles.push(`../layout/${prim.name}.${ext}`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=write-components.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-components.js","sourceRoot":"","sources":["../../src/components/write-components.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAMhD,eAAO,MAAM,iBAAiB,EAAE,UAK/B,CAAC;AAEF,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { writeComponents } from "./components/write-components.js";
|
|
2
|
+
import { writeTokens } from "./tokens/write-tokens.js";
|
|
3
|
+
import { writeScaffold } from "./scaffold/write-scaffold.js";
|
|
4
|
+
import { pruneComponents } from "./components/prune-components.js";
|
|
5
|
+
export const ptbReactGenerator = {
|
|
6
|
+
writeComponents,
|
|
7
|
+
writeTokens,
|
|
8
|
+
writeScaffold,
|
|
9
|
+
pruneComponents
|
|
10
|
+
};
|
|
11
|
+
export * from "./components/index.js";
|
|
12
|
+
export * from "./tokens/index.js";
|
|
13
|
+
export * from "./scaffold/index.js";
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAEnE,MAAM,CAAC,MAAM,iBAAiB,GAAe;IACzC,eAAe;IACf,WAAW;IACX,aAAa;IACb,eAAe;CAClB,CAAC;AAEF,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Functions to generate valid placeholder strings for scaffolding.
|
|
3
|
+
*/
|
|
4
|
+
export declare function generateMainComponentContent(componentName: string, typescript: boolean): string;
|
|
5
|
+
export declare function generateTypesContent(componentName: string): string;
|
|
6
|
+
export declare function generateStoriesContent(componentName: string, typescript: boolean): string;
|
|
7
|
+
export declare function generateTestsContent(componentName: string): string;
|
|
8
|
+
export declare function generateIndexContent(componentName: string): string;
|
|
9
|
+
//# sourceMappingURL=generate-placeholder-component-content.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-placeholder-component-content.d.ts","sourceRoot":"","sources":["../../src/scaffold/generate-placeholder-component-content.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,4BAA4B,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,MAAM,CAkB/F;AAED,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAUlE;AAED,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,MAAM,CAoBzF;AAED,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAWlE;AAED,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAElE"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Functions to generate valid placeholder strings for scaffolding.
|
|
3
|
+
*/
|
|
4
|
+
export function generateMainComponentContent(componentName, typescript) {
|
|
5
|
+
const ext = typescript ? "ts" : "js";
|
|
6
|
+
const typesImport = typescript ? `\nimport type { ${componentName}Props } from "./${componentName}.types";\n` : "";
|
|
7
|
+
const propsType = typescript ? `: ${componentName}Props` : "";
|
|
8
|
+
return `import * as React from "react";${typesImport}
|
|
9
|
+
/**
|
|
10
|
+
* TODO: Implement ${componentName} structure.
|
|
11
|
+
* This is an auto-generated scaffold from Calibrate.
|
|
12
|
+
*/
|
|
13
|
+
export function ${componentName}(props${propsType}) {
|
|
14
|
+
return (
|
|
15
|
+
<div>
|
|
16
|
+
{/* ${componentName} Body */}
|
|
17
|
+
</div>
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
`;
|
|
21
|
+
}
|
|
22
|
+
export function generateTypesContent(componentName) {
|
|
23
|
+
return `/**
|
|
24
|
+
* Shared types for ${componentName}
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
export interface ${componentName}Props {
|
|
28
|
+
className?: string;
|
|
29
|
+
children?: React.ReactNode;
|
|
30
|
+
}
|
|
31
|
+
`;
|
|
32
|
+
}
|
|
33
|
+
export function generateStoriesContent(componentName, typescript) {
|
|
34
|
+
const ext = typescript ? "ts" : "js";
|
|
35
|
+
const typesImport = typescript ? `import type { Meta, StoryObj } from "@storybook/react";\n` : "";
|
|
36
|
+
return `import * as React from "react";
|
|
37
|
+
${typesImport}import { ${componentName} } from "./${componentName}";
|
|
38
|
+
|
|
39
|
+
const meta = {
|
|
40
|
+
title: "Components/${componentName}",
|
|
41
|
+
component: ${componentName},
|
|
42
|
+
tags: ["autodocs"],
|
|
43
|
+
}${typescript ? " satisfies Meta<typeof " + componentName + ">" : ""};
|
|
44
|
+
|
|
45
|
+
export default meta;
|
|
46
|
+
${typescript ? "type Story = StoryObj<typeof meta>;" : ""}
|
|
47
|
+
|
|
48
|
+
export const Default${typescript ? ": Story" : ""} = {
|
|
49
|
+
args: {},
|
|
50
|
+
};
|
|
51
|
+
`;
|
|
52
|
+
}
|
|
53
|
+
export function generateTestsContent(componentName) {
|
|
54
|
+
return `import * as React from "react";
|
|
55
|
+
import { render } from "@testing-library/react";
|
|
56
|
+
import { ${componentName} } from "./${componentName}";
|
|
57
|
+
|
|
58
|
+
describe("${componentName}", () => {
|
|
59
|
+
it("renders without crashing", () => {
|
|
60
|
+
render(<${componentName} />);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
`;
|
|
64
|
+
}
|
|
65
|
+
export function generateIndexContent(componentName) {
|
|
66
|
+
return `export * from "./${componentName}";\n`;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=generate-placeholder-component-content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-placeholder-component-content.js","sourceRoot":"","sources":["../../src/scaffold/generate-placeholder-component-content.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,4BAA4B,CAAC,aAAqB,EAAE,UAAmB;IACnF,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACrC,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,mBAAmB,aAAa,mBAAmB,aAAa,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IACnH,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,aAAa,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAE9D,OAAO,kCAAkC,WAAW;;qBAEnC,aAAa;;;kBAGhB,aAAa,SAAS,SAAS;;;YAGrC,aAAa;;;;CAIxB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,aAAqB;IACtD,OAAO;sBACW,aAAa;;;mBAGhB,aAAa;;;;CAI/B,CAAC;AACF,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,aAAqB,EAAE,UAAmB;IAC7E,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACrC,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,2DAA2D,CAAC,CAAC,CAAC,EAAE,CAAC;IAElG,OAAO;EACT,WAAW,YAAY,aAAa,cAAc,aAAa;;;uBAG1C,aAAa;eACrB,aAAa;;GAEzB,UAAU,CAAC,CAAC,CAAC,yBAAyB,GAAG,aAAa,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE;;;EAGlE,UAAU,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,EAAE;;sBAEnC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;;;CAGhD,CAAC;AACF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,aAAqB;IACtD,OAAO;;WAEA,aAAa,cAAc,aAAa;;YAEvC,aAAa;;cAEX,aAAa;;;CAG1B,CAAC;AACF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,aAAqB;IACtD,OAAO,oBAAoB,aAAa,MAAM,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scaffold/index.ts"],"names":[],"mappings":"AAAA,cAAc,6CAA6C,CAAC;AAC5D,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scaffold/index.ts"],"names":[],"mappings":"AAAA,cAAc,6CAA6C,CAAC;AAC5D,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { PTBConfig, DesignSystemModel, RegistrySnapshot, DependencyGraph, FileMapping } from "@calibrate-ds/shared-types";
|
|
2
|
+
import type { ScaffoldPlan, ScaffoldWriteReport } from "@calibrate-ds/shared-types";
|
|
3
|
+
/**
|
|
4
|
+
* Orchestrates writing the complete design system codebase to the filesystem.
|
|
5
|
+
*/
|
|
6
|
+
export declare function writeScaffold(args: {
|
|
7
|
+
config: PTBConfig;
|
|
8
|
+
model: DesignSystemModel;
|
|
9
|
+
registry: RegistrySnapshot;
|
|
10
|
+
graph: DependencyGraph;
|
|
11
|
+
mappings: FileMapping[];
|
|
12
|
+
plan: ScaffoldPlan;
|
|
13
|
+
}): Promise<ScaffoldWriteReport>;
|
|
14
|
+
//# sourceMappingURL=write-scaffold.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-scaffold.d.ts","sourceRoot":"","sources":["../../src/scaffold/write-scaffold.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC/H,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAWpF;;GAEG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACtC,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,iBAAiB,CAAC;IACzB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,IAAI,EAAE,YAAY,CAAC;CACtB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA+F/B"}
|