@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,6 @@
|
|
|
1
|
+
import type { ComponentDefinition } from "@calibrate-ds/shared-types";
|
|
2
|
+
/**
|
|
3
|
+
* Builds .module.css structure abstracting component `.root` classes natively interpreting style hooks matching variants intuitively inherently.
|
|
4
|
+
*/
|
|
5
|
+
export declare function generateComponentCss(component: ComponentDefinition): string;
|
|
6
|
+
//# sourceMappingURL=generate-component-css.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-component-css.d.ts","sourceRoot":"","sources":["../../src/components/generate-component-css.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AA2BtE;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,mBAAmB,GAAG,MAAM,CA4E3E"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { normalizePropName } from "./helpers.js";
|
|
2
|
+
import { normalizeTokenVariablePart } from "@calibrate-ds/core";
|
|
3
|
+
/**
|
|
4
|
+
* Normalizes CSS custom variables reliably using shared PTB logic.
|
|
5
|
+
*/
|
|
6
|
+
function normalizeCssVarName(name) {
|
|
7
|
+
return normalizeTokenVariablePart(name);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Maps Calibrate internal style slots into valid Web CSS property equivalents natively.
|
|
11
|
+
*/
|
|
12
|
+
const CSS_PROPERTY_MAP = {
|
|
13
|
+
spacingX: "padding-inline",
|
|
14
|
+
spacingY: "padding-block",
|
|
15
|
+
borderRadius: "border-radius",
|
|
16
|
+
radius: "border-radius",
|
|
17
|
+
border: "border",
|
|
18
|
+
color: "color",
|
|
19
|
+
text: "color",
|
|
20
|
+
fill: "color",
|
|
21
|
+
background: "background",
|
|
22
|
+
iconColor: "color"
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Builds .module.css structure abstracting component `.root` classes natively interpreting style hooks matching variants intuitively inherently.
|
|
26
|
+
*/
|
|
27
|
+
export function generateComponentCss(component) {
|
|
28
|
+
let cssContent = `.root {\n`;
|
|
29
|
+
// Extract core generic flex-behaviors organically.
|
|
30
|
+
cssContent += ` display: flex;\n`;
|
|
31
|
+
if (component.layout) {
|
|
32
|
+
if (component.layout.direction === "row") {
|
|
33
|
+
cssContent += ` flex-direction: row;\n`;
|
|
34
|
+
}
|
|
35
|
+
else if (component.layout.direction === "column") {
|
|
36
|
+
cssContent += ` flex-direction: column;\n`;
|
|
37
|
+
}
|
|
38
|
+
if (component.layout.gap) {
|
|
39
|
+
const gapVal = typeof component.layout.gap === "object" ? (component.layout.gap.resolvedToken?.name || component.layout.gap.rawValue) : component.layout.gap;
|
|
40
|
+
cssContent += ` gap: ${typeof gapVal === "number" ? gapVal + "px" : gapVal};\n`;
|
|
41
|
+
}
|
|
42
|
+
if (component.layout.padding) {
|
|
43
|
+
const { top, right, bottom, left } = component.layout.padding;
|
|
44
|
+
const t = (top.resolvedToken?.name || top.rawValue);
|
|
45
|
+
const r = (right.resolvedToken?.name || right.rawValue);
|
|
46
|
+
const b = (bottom.resolvedToken?.name || bottom.rawValue);
|
|
47
|
+
const l = (left.resolvedToken?.name || left.rawValue);
|
|
48
|
+
if (t === b && r === l && t === r) {
|
|
49
|
+
cssContent += ` padding: ${typeof t === "number" ? t + "px" : t};\n`;
|
|
50
|
+
}
|
|
51
|
+
else if (t === b && r === l) {
|
|
52
|
+
cssContent += ` padding: ${typeof t === "number" ? t + "px" : t} ${typeof r === "number" ? r + "px" : r};\n`;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
cssContent += ` 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};\n`;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Typical defaults mapping align Main and Cross generic behaviors
|
|
59
|
+
if (component.layout.mainAlignment) {
|
|
60
|
+
cssContent += ` justify-content: ${component.layout.mainAlignment === "center" ? "center" : component.layout.mainAlignment === "space-between" ? "space-between" : "flex-start"};\n`;
|
|
61
|
+
}
|
|
62
|
+
if (component.layout.crossAlignment) {
|
|
63
|
+
cssContent += ` align-items: ${component.layout.crossAlignment === "center" ? "center" : "flex-start"};\n`;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Connect standard properties gracefully catching styles inherently natively replacing specific values with matching Figma explicit definitions.
|
|
67
|
+
if (component.styleMetadata) {
|
|
68
|
+
for (const [key, val] of Object.entries(component.styleMetadata)) {
|
|
69
|
+
const cssProperty = CSS_PROPERTY_MAP[key] || normalizeCssVarName(key);
|
|
70
|
+
// Extrapolate explicit Custom Token definitions matching `{<tokenId>}`
|
|
71
|
+
if (typeof val === "string" && val.startsWith("{") && val.endsWith("}")) {
|
|
72
|
+
const tokenAlias = val.slice(1, -1);
|
|
73
|
+
cssContent += ` ${cssProperty}: var(--ptb-${normalizeCssVarName(tokenAlias)});\n`;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
const formatValue = typeof val === "number" && cssProperty !== "opacity" ? `${val}px` : val;
|
|
77
|
+
cssContent += ` ${cssProperty}: ${formatValue};\n`;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
cssContent += `}\n`;
|
|
82
|
+
// Extrapolate explicit CSS states structurally generating variants natively safely
|
|
83
|
+
if (component.properties) {
|
|
84
|
+
const enumProps = component.properties.filter(p => p.type === "enum" && p.options);
|
|
85
|
+
for (const p of enumProps) {
|
|
86
|
+
const safeName = normalizePropName(p.name);
|
|
87
|
+
for (const opt of (p.options || [])) {
|
|
88
|
+
// Determine explicit basic specific mappings cleanly inherently
|
|
89
|
+
cssContent += `\n.root[data-${safeName.toLowerCase()}="${opt}"] {\n`;
|
|
90
|
+
cssContent += ` /* Variant overrides for ${safeName}=${opt} */\n`;
|
|
91
|
+
cssContent += `}\n`;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return cssContent;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=generate-component-css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-component-css.js","sourceRoot":"","sources":["../../src/components/generate-component-css.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ComponentDefinition, PTBConfig, DesignSystemModel } from "@calibrate-ds/shared-types";
|
|
2
|
+
/**
|
|
3
|
+
* Writes the structural boilerplate for a strictly validated React Component mapped
|
|
4
|
+
* functionally tracking properties natively against standard `data-` mappings.
|
|
5
|
+
* Automatically injects structural token dependencies based on categorical mappings.
|
|
6
|
+
*/
|
|
7
|
+
export declare function generateComponentFile(component: ComponentDefinition, config: PTBConfig, model: DesignSystemModel): string;
|
|
8
|
+
//# sourceMappingURL=generate-component-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-component-file.d.ts","sourceRoot":"","sources":["../../src/components/generate-component-file.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAMpG;;;;GAIG;AACH,wBAAgB,qBAAqB,CACjC,SAAS,EAAE,mBAAmB,EAC9B,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,iBAAiB,GACzB,MAAM,CAwOR"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { createNamingStrategy, normalizeIconDisplayName, isIconComponent } from "@calibrate-ds/core";
|
|
2
|
+
import { normalizePropName, inferBaseElement, sanitizeOptionName, getCssModuleImportPath } from "./helpers.js";
|
|
3
|
+
import { inferRelevantTokenCollections, resolveRelativeTokenImport, formatCollectionImportName, inferStyleSlots, selectTokensForSlots } from "./token-helpers.js";
|
|
4
|
+
import { generateLayoutJSX } from "./layout-jsx.js";
|
|
5
|
+
/**
|
|
6
|
+
* Writes the structural boilerplate for a strictly validated React Component mapped
|
|
7
|
+
* functionally tracking properties natively against standard `data-` mappings.
|
|
8
|
+
* Automatically injects structural token dependencies based on categorical mappings.
|
|
9
|
+
*/
|
|
10
|
+
export function generateComponentFile(component, config, model) {
|
|
11
|
+
const namingStrategy = createNamingStrategy(config.naming);
|
|
12
|
+
const resolvedName = isIconComponent(component.name) ? normalizeIconDisplayName(component.name) : component.name;
|
|
13
|
+
const componentName = namingStrategy.formatComponentName(resolvedName);
|
|
14
|
+
const usesCssModules = config.generation?.cssFiles !== false;
|
|
15
|
+
const typesImport = config.framework.typescript
|
|
16
|
+
? `import type { ${componentName}Props } from "./${componentName}.types.js";`
|
|
17
|
+
: "";
|
|
18
|
+
const stylesImport = usesCssModules
|
|
19
|
+
? `import styles from "${getCssModuleImportPath(componentName)}";`
|
|
20
|
+
: "";
|
|
21
|
+
// 1. Resolve Tokens Structural Semantics
|
|
22
|
+
const availableTokens = model.tokens || [];
|
|
23
|
+
const relevantTokens = inferRelevantTokenCollections(component.name, component.categoryPath || "", availableTokens);
|
|
24
|
+
let tokenImportsBlock = "";
|
|
25
|
+
let tokenRefsBlock = "";
|
|
26
|
+
let styleIntentsBlock = "";
|
|
27
|
+
if (relevantTokens.length > 0) {
|
|
28
|
+
tokenImportsBlock = relevantTokens.map(collection => {
|
|
29
|
+
const importName = `${formatCollectionImportName(collection.name)}Tokens`;
|
|
30
|
+
const importPath = resolveRelativeTokenImport(collection.name);
|
|
31
|
+
return `import { ${importName} } from "${importPath}";`;
|
|
32
|
+
}).join("\n");
|
|
33
|
+
tokenRefsBlock = `
|
|
34
|
+
/**
|
|
35
|
+
* Structural Token references mapping the component intent natively.
|
|
36
|
+
* Generated statically by Calibrate mimicking Figma styles structurally.
|
|
37
|
+
*/
|
|
38
|
+
export const ${componentName}TokenRefs = {
|
|
39
|
+
${relevantTokens.map(t => ` ${formatCollectionImportName(t.name)}: ${formatCollectionImportName(t.name)}Tokens,`).join("\n")}
|
|
40
|
+
} as const;
|
|
41
|
+
`;
|
|
42
|
+
// Style Intents
|
|
43
|
+
const styleSlots = inferStyleSlots(component.name, component.categoryPath || "");
|
|
44
|
+
const styleTokensMap = selectTokensForSlots(styleSlots, relevantTokens, component.styleMetadata);
|
|
45
|
+
if (Object.keys(styleTokensMap).length > 0) {
|
|
46
|
+
styleIntentsBlock = `
|
|
47
|
+
/**
|
|
48
|
+
* Expressive Style Intent describing the explicit structural mappings to actual UI design tokens.
|
|
49
|
+
* This metadata connects the visual hierarchy to abstract definitions visually.
|
|
50
|
+
*/
|
|
51
|
+
export const ${componentName}StyleTokens = {
|
|
52
|
+
${Object.entries(styleTokensMap).map(([slot, exactRef]) => ` ${slot}: ${exactRef},`).join("\n")}
|
|
53
|
+
} as const;
|
|
54
|
+
`;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const { tag } = inferBaseElement(component.name, component.categoryPath || "");
|
|
58
|
+
const propsDef = config.framework.typescript
|
|
59
|
+
? `{ className, ...props }: ${componentName}Props`
|
|
60
|
+
: `{ className, ...props }`;
|
|
61
|
+
let returnBlock = "";
|
|
62
|
+
// Build base properties to pass towards the root node seamlessly
|
|
63
|
+
let dataAtts = "";
|
|
64
|
+
let destructuredVariants = "";
|
|
65
|
+
if (component.properties && component.properties.length > 0) {
|
|
66
|
+
dataAtts = component.properties
|
|
67
|
+
.filter(p => p.type === "enum" || p.type === "boolean")
|
|
68
|
+
.map(p => {
|
|
69
|
+
const cleanName = normalizePropName(p.name);
|
|
70
|
+
return `data-${cleanName.toLowerCase()}={${cleanName}}`;
|
|
71
|
+
}).join("\n ");
|
|
72
|
+
destructuredVariants = component.properties.map(p => normalizePropName(p.name)).join(", ");
|
|
73
|
+
}
|
|
74
|
+
else if (component.variants && component.variants.length > 0) {
|
|
75
|
+
dataAtts = component.variants.map(v => {
|
|
76
|
+
const cleanName = normalizePropName(v.name);
|
|
77
|
+
return `data-${cleanName.toLowerCase()}={${cleanName}}`;
|
|
78
|
+
}).join("\n ");
|
|
79
|
+
destructuredVariants = component.variants.map(v => normalizePropName(v.name)).join(", ");
|
|
80
|
+
}
|
|
81
|
+
const propsWithVariantsDef = destructuredVariants
|
|
82
|
+
? (config.framework.typescript ? `{ className, ${destructuredVariants}, ...props }: ${componentName}Props` : `{ className, ${destructuredVariants}, ...props }`)
|
|
83
|
+
: propsDef;
|
|
84
|
+
// We build the `{...props}` explicit string matching exactly what the generator requires native to React
|
|
85
|
+
const classNameExpr = usesCssModules
|
|
86
|
+
? `[styles.root, className].filter(Boolean).join(" ")`
|
|
87
|
+
: `className ?? ""`;
|
|
88
|
+
let allPropsStr = dataAtts
|
|
89
|
+
? `className={${classNameExpr}}\n ${dataAtts}\n {...props}`
|
|
90
|
+
: `className={${classNameExpr}} {...props}`;
|
|
91
|
+
// 2. Extrapolate ARIA Attributes organically mapping strict Property States securely!
|
|
92
|
+
let ariaStr = "";
|
|
93
|
+
if (component.properties) {
|
|
94
|
+
let ariaAttrs = [];
|
|
95
|
+
// Find literal Text Fallbacks inherently mapping labels
|
|
96
|
+
const textProp = component.properties.find(p => p.type === "text");
|
|
97
|
+
if (textProp) {
|
|
98
|
+
ariaAttrs.push(`aria-label={${normalizePropName(textProp.name)}}`);
|
|
99
|
+
}
|
|
100
|
+
// Catch Strict Semantic States inherently mapping visual toggles securely
|
|
101
|
+
for (const p of component.properties) {
|
|
102
|
+
const isEnum = p.type === "enum";
|
|
103
|
+
const isBool = p.type === "boolean";
|
|
104
|
+
if (isEnum || isBool) {
|
|
105
|
+
const safeName = normalizePropName(p.name);
|
|
106
|
+
const safeNameLower = safeName.toLowerCase();
|
|
107
|
+
const optionsStr = isEnum ? (p.options || []).map(opt => opt.toLowerCase()) : [];
|
|
108
|
+
if (safeNameLower === "disabled" || optionsStr.includes("disabled")) {
|
|
109
|
+
ariaAttrs.push(`aria-disabled={${isEnum ? `${safeName} === "Disabled"` : safeName}}`);
|
|
110
|
+
}
|
|
111
|
+
if (tag === "button" && (safeNameLower === "pressed" || optionsStr.includes("pressed"))) {
|
|
112
|
+
ariaAttrs.push(`aria-pressed={${isEnum ? `${safeName} === "Pressed"` : safeName}}`);
|
|
113
|
+
}
|
|
114
|
+
if (tag === "input" && (safeNameLower === "error" || safeNameLower === "invalid" || optionsStr.includes("error"))) {
|
|
115
|
+
ariaAttrs.push(`aria-invalid={${isEnum ? `${safeName} === "Error"` : safeName}}`);
|
|
116
|
+
}
|
|
117
|
+
if (tag !== "input" && (safeNameLower === "selected" || optionsStr.includes("selected"))) {
|
|
118
|
+
ariaAttrs.push(`aria-selected={${isEnum ? `${safeName} === "Selected"` : safeName}}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (ariaAttrs.length > 0) {
|
|
123
|
+
ariaStr = ariaAttrs.join("\n ");
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Attach Aria Attributes onto standard property chains effortlessly!
|
|
127
|
+
if (ariaStr) {
|
|
128
|
+
allPropsStr = `${ariaStr}\n ${allPropsStr}`;
|
|
129
|
+
}
|
|
130
|
+
let implementationBody = "";
|
|
131
|
+
// 3. Consume Normalized Layout Tree recursively if available!
|
|
132
|
+
let dependencies = new Map();
|
|
133
|
+
if (component.layoutTree) {
|
|
134
|
+
// We evaluate `{...props}` mapping inside our string builder natively dynamically!
|
|
135
|
+
const result = generateLayoutJSX(component.layoutTree, component, model, namingStrategy, 3);
|
|
136
|
+
const childJSX = result.jsx;
|
|
137
|
+
const { tag } = inferBaseElement(component.name, component.categoryPath || "");
|
|
138
|
+
if (tag === "button") {
|
|
139
|
+
// Safely Wrap Semantic Native Button directly seamlessly!
|
|
140
|
+
implementationBody = ` <button ${allPropsStr}>\n${childJSX}\n </button>`;
|
|
141
|
+
}
|
|
142
|
+
else if (tag === "input") {
|
|
143
|
+
const isCheckbox = component.name.toLowerCase().includes("checkbox");
|
|
144
|
+
const inputType = isCheckbox ? "checkbox" : "text";
|
|
145
|
+
// Safely Wrap Semantic Native Input directly seamlessly!
|
|
146
|
+
implementationBody = ` <label className={className}>\n <input type="${inputType}" ${ariaStr} {...props} />\n${childJSX}\n </label>`;
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
// Standard generic fallback explicitly wrapping layout configurations inside semantic standard wrappers seamlessly
|
|
150
|
+
implementationBody = ` <div ${allPropsStr}>\n${result.jsx}\n </div>`;
|
|
151
|
+
}
|
|
152
|
+
dependencies = result.dependencies;
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
// 4. Fallback Legacy Skeletons (no layout metadata) natively
|
|
156
|
+
const { tag } = inferBaseElement(component.name, component.categoryPath || "");
|
|
157
|
+
const isVoidElement = ["img", "input", "br", "hr"].includes(tag);
|
|
158
|
+
if (isVoidElement) {
|
|
159
|
+
implementationBody = ` <${tag} ${allPropsStr} />`;
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
implementationBody = ` <${tag} ${allPropsStr}>
|
|
163
|
+
{/* Implementation details modeled inside Calibrate generated safely */}
|
|
164
|
+
{props.children}
|
|
165
|
+
</${tag}>`;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// 4. Generate Localized Variant Map configurations safely
|
|
169
|
+
let variantDefinitions = "";
|
|
170
|
+
if (component.properties && component.properties.length > 0) {
|
|
171
|
+
const enumProps = component.properties.filter(p => p.type === "enum" && p.options && p.options.length > 0);
|
|
172
|
+
if (enumProps.length > 0) {
|
|
173
|
+
const variantLines = enumProps.map(p => {
|
|
174
|
+
const safeName = normalizePropName(p.name);
|
|
175
|
+
const safeOptions = p.options.map(opt => `"${sanitizeOptionName(opt)}"`).join(", ");
|
|
176
|
+
return ` ${safeName}: [${safeOptions}],`;
|
|
177
|
+
});
|
|
178
|
+
variantDefinitions = `const ${componentName.charAt(0).toLowerCase() + componentName.slice(1)}Variants = {\n${variantLines.join("\n")}\n} as const;\n\n`;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
else if (component.variants && component.variants.length > 0) {
|
|
182
|
+
// Legacy fallback
|
|
183
|
+
const variantLines = component.variants.map(v => {
|
|
184
|
+
const safeName = normalizePropName(v.name);
|
|
185
|
+
const safeOptions = (v.options || []).map(opt => `"${sanitizeOptionName(opt)}"`).join(", ");
|
|
186
|
+
return ` ${safeName}: [${safeOptions}],`;
|
|
187
|
+
});
|
|
188
|
+
variantDefinitions = `const ${componentName.charAt(0).toLowerCase() + componentName.slice(1)}Variants = {\n${variantLines.join("\n")}\n} as const;\n\n`;
|
|
189
|
+
}
|
|
190
|
+
returnBlock = `${variantDefinitions}export function ${componentName}(${propsWithVariantsDef}) {
|
|
191
|
+
return (
|
|
192
|
+
${implementationBody}
|
|
193
|
+
);
|
|
194
|
+
}`;
|
|
195
|
+
const outputChunks = [
|
|
196
|
+
`import * as React from "react";`,
|
|
197
|
+
];
|
|
198
|
+
const layoutImportsBlock = Array.from(dependencies.entries()).map(([importPath, symbolName]) => {
|
|
199
|
+
return `import { ${symbolName} } from "${importPath}.js";`;
|
|
200
|
+
}).join("\n");
|
|
201
|
+
if (typesImport)
|
|
202
|
+
outputChunks.push(typesImport);
|
|
203
|
+
if (stylesImport)
|
|
204
|
+
outputChunks.push(stylesImport);
|
|
205
|
+
if (tokenImportsBlock)
|
|
206
|
+
outputChunks.push(tokenImportsBlock);
|
|
207
|
+
if (layoutImportsBlock)
|
|
208
|
+
outputChunks.push(layoutImportsBlock);
|
|
209
|
+
if (tokenRefsBlock)
|
|
210
|
+
outputChunks.push(tokenRefsBlock.trim());
|
|
211
|
+
if (styleIntentsBlock)
|
|
212
|
+
outputChunks.push(styleIntentsBlock.trim());
|
|
213
|
+
outputChunks.push(returnBlock);
|
|
214
|
+
return outputChunks.join("\n\n") + "\n";
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=generate-component-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-component-file.js","sourceRoot":"","sources":["../../src/components/generate-component-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { ComponentDefinition, DesignSystemModel, PTBConfig } from "@calibrate-ds/shared-types";
|
|
2
|
+
export declare function generateCompositeFile(component: ComponentDefinition, model: DesignSystemModel, config: PTBConfig): string;
|
|
3
|
+
//# sourceMappingURL=generate-composite-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-composite-file.d.ts","sourceRoot":"","sources":["../../src/components/generate-composite-file.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAQpG,wBAAgB,qBAAqB,CACjC,SAAS,EAAE,mBAAmB,EAC9B,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,SAAS,GAClB,MAAM,CAkFR"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { createNamingStrategy, normalizeIconDisplayName, isIconComponent } from "@calibrate-ds/core";
|
|
2
|
+
import { resolveRelativeImportTarget } from "./helpers.js";
|
|
3
|
+
function sanitizeVariantName(name) {
|
|
4
|
+
return name.replace(/[^a-zA-Z0-9_$]/g, "");
|
|
5
|
+
}
|
|
6
|
+
export function generateCompositeFile(component, model, config) {
|
|
7
|
+
const namingStrategy = createNamingStrategy(config.naming);
|
|
8
|
+
const resolvedName = isIconComponent(component.name) ? normalizeIconDisplayName(component.name) : component.name;
|
|
9
|
+
const componentName = namingStrategy.formatComponentName(resolvedName);
|
|
10
|
+
if (!component.composite) {
|
|
11
|
+
throw new Error(`Component ${componentName} is not a valid composite object natively.`);
|
|
12
|
+
}
|
|
13
|
+
const typesImport = config.framework.typescript
|
|
14
|
+
? `import type { ${componentName}Props } from "./${componentName}.types.js";`
|
|
15
|
+
: "";
|
|
16
|
+
// Safely collect mapped canonical imports based on internal componentId matching model dynamically!
|
|
17
|
+
const dependencies = new Map(); // Path -> ExportName
|
|
18
|
+
const innerJsxNodes = [];
|
|
19
|
+
for (const child of component.composite.children) {
|
|
20
|
+
// Standard structural placeholder mapping
|
|
21
|
+
if ('componentId' in child) {
|
|
22
|
+
const refId = child.componentId;
|
|
23
|
+
const targetComponent = model.components.find(c => c.id === refId);
|
|
24
|
+
if (targetComponent) {
|
|
25
|
+
const targetName = namingStrategy.formatComponentName(targetComponent.name);
|
|
26
|
+
const importPath = resolveRelativeImportTarget(component, targetComponent, namingStrategy);
|
|
27
|
+
dependencies.set(importPath, targetName);
|
|
28
|
+
// Nest into functional layout structurally
|
|
29
|
+
innerJsxNodes.push(` {/* Instance: ${child.name} */}`);
|
|
30
|
+
innerJsxNodes.push(` <${targetName} />`);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
innerJsxNodes.push(` {/* Unresolved Instance: ${child.name} */}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
innerJsxNodes.push(` {/* Local Node: ${child.name} */}`);
|
|
38
|
+
innerJsxNodes.push(` <div>{/* Nested Elements missing structured abstractions */}</div>`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const importsArray = Array.from(dependencies.entries()).map(([importPath, symbolName]) => {
|
|
42
|
+
// Output clean ESM mappings without file extensions matching folder barrel configs safely!
|
|
43
|
+
return `import { ${symbolName} } from "${importPath}.js";`;
|
|
44
|
+
});
|
|
45
|
+
// Extract local properties matching strictly!
|
|
46
|
+
const destructuredVariants = (component.variants || []).map(v => sanitizeVariantName(v.name)).join(", ");
|
|
47
|
+
let dataAttributes = "";
|
|
48
|
+
if (component.variants && component.variants.length > 0) {
|
|
49
|
+
dataAttributes = component.variants.map(v => {
|
|
50
|
+
const cleanName = sanitizeVariantName(v.name);
|
|
51
|
+
return `data-${cleanName.toLowerCase()}={${cleanName}}`;
|
|
52
|
+
}).join("\n ");
|
|
53
|
+
}
|
|
54
|
+
const internalProps = config.framework.typescript
|
|
55
|
+
? `{ className${destructuredVariants.length ? `, ${destructuredVariants}` : ''}, children, ...props }: ${componentName}Props`
|
|
56
|
+
: `{ className${destructuredVariants.length ? `, ${destructuredVariants}` : ''}, children, ...props }`;
|
|
57
|
+
return `import * as React from "react";\n${typesImport}
|
|
58
|
+
${importsArray.join("\n")}
|
|
59
|
+
|
|
60
|
+
export const ${componentName} = React.forwardRef<HTMLDivElement, ${componentName}Props>(
|
|
61
|
+
(${internalProps}, ref) => {
|
|
62
|
+
return (
|
|
63
|
+
<div
|
|
64
|
+
ref={ref}
|
|
65
|
+
className={className}
|
|
66
|
+
${dataAttributes}
|
|
67
|
+
data-composite="${componentName.toLowerCase()}"
|
|
68
|
+
{...props}
|
|
69
|
+
>
|
|
70
|
+
${innerJsxNodes.join("\n")}
|
|
71
|
+
{children}
|
|
72
|
+
</div>
|
|
73
|
+
);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
${componentName}.displayName = "${componentName}";\n`;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=generate-composite-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-composite-file.js","sourceRoot":"","sources":["../../src/components/generate-composite-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ComponentDefinition, PTBConfig } from "@calibrate-ds/shared-types";
|
|
2
|
+
/**
|
|
3
|
+
* Builds composite scaffolding interfaces explicitly allowing children injection
|
|
4
|
+
* mimicking standard UI containers dynamically mapping surface variants if they exist.
|
|
5
|
+
*/
|
|
6
|
+
export declare function generateCompositeTypesFile(component: ComponentDefinition, config: PTBConfig): string;
|
|
7
|
+
//# sourceMappingURL=generate-composite-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-composite-types.d.ts","sourceRoot":"","sources":["../../src/components/generate-composite-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAmB,MAAM,4BAA4B,CAAC;AAWlG;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,mBAAmB,EAAE,MAAM,EAAE,SAAS,GAAG,MAAM,CAqCpG"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { createNamingStrategy, normalizeIconDisplayName, isIconComponent } from "@calibrate-ds/core";
|
|
2
|
+
function sanitizeVariantName(name) {
|
|
3
|
+
return name.replace(/[^a-zA-Z0-9_$]/g, "");
|
|
4
|
+
}
|
|
5
|
+
function sanitizeOptionName(option) {
|
|
6
|
+
return option.replace(/["']/g, "");
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Builds composite scaffolding interfaces explicitly allowing children injection
|
|
10
|
+
* mimicking standard UI containers dynamically mapping surface variants if they exist.
|
|
11
|
+
*/
|
|
12
|
+
export function generateCompositeTypesFile(component, config) {
|
|
13
|
+
const namingStrategy = createNamingStrategy(config.naming);
|
|
14
|
+
const resolvedName = isIconComponent(component.name) ? normalizeIconDisplayName(component.name) : component.name;
|
|
15
|
+
const componentName = namingStrategy.formatComponentName(resolvedName);
|
|
16
|
+
let output = `import type * as React from "react";\n\n`;
|
|
17
|
+
const variantProps = [];
|
|
18
|
+
// Map internal overrides or composite level variants just like canonical nodes
|
|
19
|
+
if (component.variants && component.variants.length > 0) {
|
|
20
|
+
component.variants.forEach((v) => {
|
|
21
|
+
const cleanName = sanitizeVariantName(v.name);
|
|
22
|
+
const typeName = `${componentName}${cleanName.charAt(0).toUpperCase() + cleanName.slice(1)}`;
|
|
23
|
+
if (v.type === "boolean") {
|
|
24
|
+
output += `export type ${typeName} = boolean;\n`;
|
|
25
|
+
variantProps.push(` ${cleanName}?: ${typeName};`);
|
|
26
|
+
}
|
|
27
|
+
else if (v.type === "string" || v.type === "number") {
|
|
28
|
+
const union = v.options.map(opt => `"${sanitizeOptionName(opt)}"`).join(" | ");
|
|
29
|
+
output += `export type ${typeName} = ${union || "string"};\n`;
|
|
30
|
+
variantProps.push(` ${cleanName}?: ${typeName};`);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
output += "\n";
|
|
34
|
+
}
|
|
35
|
+
output += `export interface ${componentName}Props extends React.HTMLAttributes<HTMLDivElement> {\n`;
|
|
36
|
+
output += variantProps.join("\n");
|
|
37
|
+
if (variantProps.length > 0) {
|
|
38
|
+
output += "\n";
|
|
39
|
+
}
|
|
40
|
+
// Composites implicitly expect complex children nesting vs canonical isolation
|
|
41
|
+
output += `}\n`;
|
|
42
|
+
return output;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=generate-composite-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-composite-types.js","sourceRoot":"","sources":["../../src/components/generate-composite-types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErG,SAAS,mBAAmB,CAAC,IAAY;IACrC,OAAO,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAc;IACtC,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CAAC,SAA8B,EAAE,MAAiB;IACxF,MAAM,cAAc,GAAG,oBAAoB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3D,MAAM,YAAY,GAAG,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC;IACjH,MAAM,aAAa,GAAG,cAAc,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;IAEvE,IAAI,MAAM,GAAG,0CAA0C,CAAC;IAExD,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,+EAA+E;IAC/E,IAAI,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtD,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAkB,EAAE,EAAE;YAC9C,MAAM,SAAS,GAAG,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,QAAQ,GAAG,GAAG,aAAa,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAE7F,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,MAAM,IAAI,eAAe,QAAQ,eAAe,CAAC;gBACjD,YAAY,CAAC,IAAI,CAAC,KAAK,SAAS,MAAM,QAAQ,GAAG,CAAC,CAAC;YACvD,CAAC;iBAAM,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACpD,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC/E,MAAM,IAAI,eAAe,QAAQ,MAAM,KAAK,IAAI,QAAQ,KAAK,CAAC;gBAC9D,YAAY,CAAC,IAAI,CAAC,KAAK,SAAS,MAAM,QAAQ,GAAG,CAAC,CAAC;YACvD,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,IAAI,CAAC;IACnB,CAAC;IAED,MAAM,IAAI,oBAAoB,aAAa,wDAAwD,CAAC;IACpG,MAAM,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,IAAI,CAAC;IACnB,CAAC;IACD,+EAA+E;IAC/E,MAAM,IAAI,KAAK,CAAC;IAEhB,OAAO,MAAM,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ComponentDefinition, PTBConfig } from "@calibrate-ds/shared-types";
|
|
2
|
+
/**
|
|
3
|
+
* Derives valid TypeScript union definitions from normalized model variants
|
|
4
|
+
* and safely builds the primary `<ComponentName>Props` interface exposing
|
|
5
|
+
* DOM HTML attributes dynamically based on inferred semantic elements.
|
|
6
|
+
*/
|
|
7
|
+
export declare function generateTypesFile(component: ComponentDefinition, config: PTBConfig): string;
|
|
8
|
+
//# sourceMappingURL=generate-types-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-types-file.d.ts","sourceRoot":"","sources":["../../src/components/generate-types-file.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAsC,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAIrH;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,mBAAmB,EAAE,MAAM,EAAE,SAAS,GAAG,MAAM,CA6D3F"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { createNamingStrategy, normalizeIconDisplayName, isIconComponent } from "@calibrate-ds/core";
|
|
2
|
+
import { normalizePropName, sanitizeOptionName, inferBaseElement } from "./helpers.js";
|
|
3
|
+
/**
|
|
4
|
+
* Derives valid TypeScript union definitions from normalized model variants
|
|
5
|
+
* and safely builds the primary `<ComponentName>Props` interface exposing
|
|
6
|
+
* DOM HTML attributes dynamically based on inferred semantic elements.
|
|
7
|
+
*/
|
|
8
|
+
export function generateTypesFile(component, config) {
|
|
9
|
+
const namingStrategy = createNamingStrategy(config.naming);
|
|
10
|
+
const resolvedName = isIconComponent(component.name) ? normalizeIconDisplayName(component.name) : component.name;
|
|
11
|
+
const componentName = namingStrategy.formatComponentName(resolvedName);
|
|
12
|
+
let output = `import type * as React from "react";\n\n`;
|
|
13
|
+
const variantProps = [];
|
|
14
|
+
if (component.properties && component.properties.length > 0) {
|
|
15
|
+
component.properties.forEach((p) => {
|
|
16
|
+
const cleanName = normalizePropName(p.name);
|
|
17
|
+
const typeName = `${componentName}${cleanName.charAt(0).toUpperCase() + cleanName.slice(1)}`;
|
|
18
|
+
if (p.type === "boolean") {
|
|
19
|
+
output += `export type ${typeName} = boolean;\n`;
|
|
20
|
+
variantProps.push(` ${cleanName}?: ${typeName};`);
|
|
21
|
+
}
|
|
22
|
+
else if (p.type === "text") {
|
|
23
|
+
output += `export type ${typeName} = string;\n`;
|
|
24
|
+
variantProps.push(` ${cleanName}?: ${typeName};`);
|
|
25
|
+
}
|
|
26
|
+
else if (p.type === "instance") {
|
|
27
|
+
output += `export type ${typeName} = React.ReactNode;\n`;
|
|
28
|
+
variantProps.push(` ${cleanName}?: ${typeName};`);
|
|
29
|
+
}
|
|
30
|
+
else if (p.type === "enum") {
|
|
31
|
+
// Convert options to string literal unions safely
|
|
32
|
+
const union = (p.options || []).map((opt) => `"${sanitizeOptionName(opt)}"`).join(" | ");
|
|
33
|
+
output += `export type ${typeName} = ${union || "string"};\n`;
|
|
34
|
+
variantProps.push(` ${cleanName}?: ${typeName};`);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
output += "\n";
|
|
38
|
+
}
|
|
39
|
+
else if (component.variants && component.variants.length > 0) {
|
|
40
|
+
component.variants.forEach((v) => {
|
|
41
|
+
const cleanName = normalizePropName(v.name);
|
|
42
|
+
const typeName = `${componentName}${cleanName.charAt(0).toUpperCase() + cleanName.slice(1)}`;
|
|
43
|
+
if (v.type === "boolean") {
|
|
44
|
+
output += `export type ${typeName} = boolean;\n`;
|
|
45
|
+
variantProps.push(` ${cleanName}?: ${typeName};`);
|
|
46
|
+
}
|
|
47
|
+
else if (v.type === "string" || v.type === "number") {
|
|
48
|
+
// Convert options to string literal unions safely
|
|
49
|
+
const union = (v.options || []).map((opt) => `"${sanitizeOptionName(opt)}"`).join(" | ");
|
|
50
|
+
output += `export type ${typeName} = ${union || "string"};\n`;
|
|
51
|
+
variantProps.push(` ${cleanName}?: ${typeName};`);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
output += "\n";
|
|
55
|
+
}
|
|
56
|
+
const { interfaceName } = inferBaseElement(component.name, component.categoryPath || "");
|
|
57
|
+
output += `export interface ${componentName}Props extends ${interfaceName} {\n`;
|
|
58
|
+
output += variantProps.join("\n");
|
|
59
|
+
if (variantProps.length > 0) {
|
|
60
|
+
output += "\n";
|
|
61
|
+
}
|
|
62
|
+
output += `}\n`;
|
|
63
|
+
return output;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=generate-types-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-types-file.js","sourceRoot":"","sources":["../../src/components/generate-types-file.ts"],"names":[],"mappings":"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"}
|