figma-to-code-agent 0.3.4 → 0.4.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/CHANGELOG.md +13 -0
- package/dist/FigmaToCodeAgent.d.ts +2 -0
- package/dist/FigmaToCodeAgent.d.ts.map +1 -1
- package/dist/FigmaToCodeAgent.js +17 -0
- package/dist/FigmaToCodeAgent.js.map +1 -1
- package/dist/assets/AssetManager.d.ts +61 -0
- package/dist/assets/AssetManager.d.ts.map +1 -0
- package/dist/assets/AssetManager.js +136 -0
- package/dist/assets/AssetManager.js.map +1 -0
- package/dist/assets/index.d.ts +2 -1
- package/dist/assets/index.d.ts.map +1 -1
- package/dist/assets/index.js +3 -0
- package/dist/assets/index.js.map +1 -1
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/config/ConfigManager.d.ts +41 -0
- package/dist/config/ConfigManager.d.ts.map +1 -0
- package/dist/config/ConfigManager.js +155 -0
- package/dist/config/ConfigManager.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +7 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/types.d.ts +43 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +3 -0
- package/dist/config/types.js.map +1 -0
- package/dist/errors/index.d.ts +88 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +128 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/generation/FileOrganizer.d.ts +35 -0
- package/dist/generation/FileOrganizer.d.ts.map +1 -0
- package/dist/generation/FileOrganizer.js +117 -0
- package/dist/generation/FileOrganizer.js.map +1 -0
- package/dist/tokens/DesignTokenExporter.d.ts +12 -0
- package/dist/tokens/DesignTokenExporter.d.ts.map +1 -0
- package/dist/tokens/DesignTokenExporter.js +61 -0
- package/dist/tokens/DesignTokenExporter.js.map +1 -0
- package/dist/tokens/DesignTokenExtractor.d.ts +14 -0
- package/dist/tokens/DesignTokenExtractor.d.ts.map +1 -0
- package/dist/tokens/DesignTokenExtractor.js +124 -0
- package/dist/tokens/DesignTokenExtractor.js.map +1 -0
- package/dist/tokens/index.d.ts +4 -0
- package/dist/tokens/index.d.ts.map +1 -0
- package/dist/tokens/index.js +8 -0
- package/dist/tokens/index.js.map +1 -0
- package/dist/tokens/types.d.ts +44 -0
- package/dist/tokens/types.d.ts.map +1 -0
- package/dist/tokens/types.js +7 -0
- package/dist/tokens/types.js.map +1 -0
- package/dist/transformation/transformers/ComponentSplitter.d.ts +32 -0
- package/dist/transformation/transformers/ComponentSplitter.d.ts.map +1 -0
- package/dist/transformation/transformers/ComponentSplitter.js +108 -0
- package/dist/transformation/transformers/ComponentSplitter.js.map +1 -0
- package/dist/validation/VisualValidator.d.ts +69 -0
- package/dist/validation/VisualValidator.d.ts.map +1 -0
- package/dist/validation/VisualValidator.js +198 -0
- package/dist/validation/VisualValidator.js.map +1 -0
- package/dist/validation/index.d.ts +2 -1
- package/dist/validation/index.d.ts.map +1 -1
- package/dist/validation/index.js +3 -0
- package/dist/validation/index.js.map +1 -1
- package/package.json +1 -1
- package/test-app/test-react/src/Component.module.css +5 -5
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { TokenExportFormat } from '../tokens/types';
|
|
2
|
+
/**
|
|
3
|
+
* System configuration for the Figma-to-Code agent.
|
|
4
|
+
*/
|
|
5
|
+
export interface SystemConfig {
|
|
6
|
+
figma: {
|
|
7
|
+
accessToken: string;
|
|
8
|
+
fileKey?: string;
|
|
9
|
+
useMCP?: boolean;
|
|
10
|
+
};
|
|
11
|
+
generation: {
|
|
12
|
+
framework: 'react' | 'vue';
|
|
13
|
+
styleMode: 'css-modules' | 'tailwind' | 'css';
|
|
14
|
+
typescript: boolean;
|
|
15
|
+
outputDir: string;
|
|
16
|
+
namingConvention: 'camelCase' | 'PascalCase' | 'kebab-case' | 'snake_case';
|
|
17
|
+
};
|
|
18
|
+
transformation: {
|
|
19
|
+
enabledTransformers: string[];
|
|
20
|
+
componentThreshold: number;
|
|
21
|
+
maxNestingDepth: number;
|
|
22
|
+
};
|
|
23
|
+
designTokens: {
|
|
24
|
+
extract: boolean;
|
|
25
|
+
format: TokenExportFormat;
|
|
26
|
+
outputPath: string;
|
|
27
|
+
};
|
|
28
|
+
validation: {
|
|
29
|
+
enabled: boolean;
|
|
30
|
+
viewports: Array<{
|
|
31
|
+
name: string;
|
|
32
|
+
width: number;
|
|
33
|
+
height: number;
|
|
34
|
+
}>;
|
|
35
|
+
threshold: number;
|
|
36
|
+
};
|
|
37
|
+
assets: {
|
|
38
|
+
outputDir: string;
|
|
39
|
+
imageFormat: 'png' | 'jpg' | 'webp' | 'svg';
|
|
40
|
+
optimize: boolean;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE;QACL,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,CAAC;IACF,UAAU,EAAE;QACV,SAAS,EAAE,OAAO,GAAG,KAAK,CAAC;QAC3B,SAAS,EAAE,aAAa,GAAG,UAAU,GAAG,KAAK,CAAC;QAC9C,UAAU,EAAE,OAAO,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,EAAE,WAAW,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,CAAC;KAC5E,CAAC;IACF,cAAc,EAAE;QACd,mBAAmB,EAAE,MAAM,EAAE,CAAC;QAC9B,kBAAkB,EAAE,MAAM,CAAC;QAC3B,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,YAAY,EAAE;QACZ,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,iBAAiB,CAAC;QAC1B,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,UAAU,EAAE;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAClE,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,MAAM,EAAE;QACN,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;QAC5C,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC;CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error types for the Figma-to-Code system.
|
|
3
|
+
*/
|
|
4
|
+
export declare enum ErrorType {
|
|
5
|
+
FIGMA_API_ERROR = "FIGMA_API_ERROR",
|
|
6
|
+
AUTHENTICATION_ERROR = "AUTHENTICATION_ERROR",
|
|
7
|
+
FILE_NOT_FOUND = "FILE_NOT_FOUND",
|
|
8
|
+
MCP_CONNECTION_ERROR = "MCP_CONNECTION_ERROR",
|
|
9
|
+
PARSE_ERROR = "PARSE_ERROR",
|
|
10
|
+
TRANSFORMATION_ERROR = "TRANSFORMATION_ERROR",
|
|
11
|
+
INVALID_NODE_TYPE = "INVALID_NODE_TYPE",
|
|
12
|
+
CODE_GENERATION_ERROR = "CODE_GENERATION_ERROR",
|
|
13
|
+
FILE_WRITE_ERROR = "FILE_WRITE_ERROR",
|
|
14
|
+
TEMPLATE_ERROR = "TEMPLATE_ERROR",
|
|
15
|
+
VALIDATION_ERROR = "VALIDATION_ERROR",
|
|
16
|
+
RENDER_ERROR = "RENDER_ERROR",
|
|
17
|
+
ASSET_DOWNLOAD_ERROR = "ASSET_DOWNLOAD_ERROR",
|
|
18
|
+
IMAGE_OPTIMIZATION_ERROR = "IMAGE_OPTIMIZATION_ERROR",
|
|
19
|
+
CONFIG_ERROR = "CONFIG_ERROR",
|
|
20
|
+
INVALID_FRAMEWORK = "INVALID_FRAMEWORK"
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Custom error class with type, context, and recoverability info.
|
|
24
|
+
*/
|
|
25
|
+
export declare class SystemError extends Error {
|
|
26
|
+
type: ErrorType;
|
|
27
|
+
context?: any | undefined;
|
|
28
|
+
recoverable: boolean;
|
|
29
|
+
constructor(type: ErrorType, message: string, context?: any | undefined, recoverable?: boolean);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Log levels for the logging system.
|
|
33
|
+
*/
|
|
34
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
35
|
+
/**
|
|
36
|
+
* Log entry structure.
|
|
37
|
+
*/
|
|
38
|
+
export interface LogEntry {
|
|
39
|
+
level: LogLevel;
|
|
40
|
+
message: string;
|
|
41
|
+
timestamp: Date;
|
|
42
|
+
context?: any;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Logger that collects log entries for reporting.
|
|
46
|
+
*/
|
|
47
|
+
export declare class Logger {
|
|
48
|
+
private entries;
|
|
49
|
+
debug(message: string, context?: any): void;
|
|
50
|
+
info(message: string, context?: any): void;
|
|
51
|
+
warn(message: string, context?: any): void;
|
|
52
|
+
error(message: string, context?: any): void;
|
|
53
|
+
getEntries(): LogEntry[];
|
|
54
|
+
getErrors(): LogEntry[];
|
|
55
|
+
getWarnings(): LogEntry[];
|
|
56
|
+
clear(): void;
|
|
57
|
+
private log;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Processing report generated after a complete conversion.
|
|
61
|
+
*/
|
|
62
|
+
export interface ProcessingReport {
|
|
63
|
+
startTime: Date;
|
|
64
|
+
endTime: Date;
|
|
65
|
+
duration: number;
|
|
66
|
+
stats: {
|
|
67
|
+
totalNodes: number;
|
|
68
|
+
processedNodes: number;
|
|
69
|
+
skippedNodes: number;
|
|
70
|
+
generatedComponents: number;
|
|
71
|
+
extractedAssets: number;
|
|
72
|
+
};
|
|
73
|
+
errors: SystemError[];
|
|
74
|
+
warnings: string[];
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Error recovery strategies.
|
|
78
|
+
*/
|
|
79
|
+
export type RecoveryStrategy = 'retry' | 'skip' | 'fallback';
|
|
80
|
+
/**
|
|
81
|
+
* Determines the recovery strategy for a given error type.
|
|
82
|
+
*/
|
|
83
|
+
export declare function getRecoveryStrategy(errorType: ErrorType): RecoveryStrategy;
|
|
84
|
+
/**
|
|
85
|
+
* Generate a processing report from logger entries and stats.
|
|
86
|
+
*/
|
|
87
|
+
export declare function generateReport(logger: Logger, startTime: Date, stats: ProcessingReport['stats']): ProcessingReport;
|
|
88
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,oBAAY,SAAS;IAEnB,eAAe,oBAAoB;IACnC,oBAAoB,yBAAyB;IAC7C,cAAc,mBAAmB;IACjC,oBAAoB,yBAAyB;IAG7C,WAAW,gBAAgB;IAC3B,oBAAoB,yBAAyB;IAC7C,iBAAiB,sBAAsB;IAGvC,qBAAqB,0BAA0B;IAC/C,gBAAgB,qBAAqB;IACrC,cAAc,mBAAmB;IAGjC,gBAAgB,qBAAqB;IACrC,YAAY,iBAAiB;IAG7B,oBAAoB,yBAAyB;IAC7C,wBAAwB,6BAA6B;IAGrD,YAAY,iBAAiB;IAC7B,iBAAiB,sBAAsB;CACxC;AAED;;GAEG;AACH,qBAAa,WAAY,SAAQ,KAAK;IAE3B,IAAI,EAAE,SAAS;IAEf,OAAO,CAAC,EAAE,GAAG;IACb,WAAW,EAAE,OAAO;gBAHpB,IAAI,EAAE,SAAS,EACtB,OAAO,EAAE,MAAM,EACR,OAAO,CAAC,EAAE,GAAG,YAAA,EACb,WAAW,GAAE,OAAe;CAKtC;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,CAAC,EAAE,GAAG,CAAC;CACf;AAED;;GAEG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,OAAO,CAAkB;IAEjC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI;IAI3C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI;IAI1C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI;IAI1C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI;IAI3C,UAAU,IAAI,QAAQ,EAAE;IAIxB,SAAS,IAAI,QAAQ,EAAE;IAIvB,WAAW,IAAI,QAAQ,EAAE;IAIzB,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,GAAG;CAGZ;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;AAE7D;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,SAAS,GAAG,gBAAgB,CA8B1E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,IAAI,EACf,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,GAC/B,gBAAgB,CAYlB"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Logger = exports.SystemError = exports.ErrorType = void 0;
|
|
4
|
+
exports.getRecoveryStrategy = getRecoveryStrategy;
|
|
5
|
+
exports.generateReport = generateReport;
|
|
6
|
+
/**
|
|
7
|
+
* Error types for the Figma-to-Code system.
|
|
8
|
+
*/
|
|
9
|
+
var ErrorType;
|
|
10
|
+
(function (ErrorType) {
|
|
11
|
+
// Extraction layer
|
|
12
|
+
ErrorType["FIGMA_API_ERROR"] = "FIGMA_API_ERROR";
|
|
13
|
+
ErrorType["AUTHENTICATION_ERROR"] = "AUTHENTICATION_ERROR";
|
|
14
|
+
ErrorType["FILE_NOT_FOUND"] = "FILE_NOT_FOUND";
|
|
15
|
+
ErrorType["MCP_CONNECTION_ERROR"] = "MCP_CONNECTION_ERROR";
|
|
16
|
+
// Transformation layer
|
|
17
|
+
ErrorType["PARSE_ERROR"] = "PARSE_ERROR";
|
|
18
|
+
ErrorType["TRANSFORMATION_ERROR"] = "TRANSFORMATION_ERROR";
|
|
19
|
+
ErrorType["INVALID_NODE_TYPE"] = "INVALID_NODE_TYPE";
|
|
20
|
+
// Generation layer
|
|
21
|
+
ErrorType["CODE_GENERATION_ERROR"] = "CODE_GENERATION_ERROR";
|
|
22
|
+
ErrorType["FILE_WRITE_ERROR"] = "FILE_WRITE_ERROR";
|
|
23
|
+
ErrorType["TEMPLATE_ERROR"] = "TEMPLATE_ERROR";
|
|
24
|
+
// Validation layer
|
|
25
|
+
ErrorType["VALIDATION_ERROR"] = "VALIDATION_ERROR";
|
|
26
|
+
ErrorType["RENDER_ERROR"] = "RENDER_ERROR";
|
|
27
|
+
// Asset layer
|
|
28
|
+
ErrorType["ASSET_DOWNLOAD_ERROR"] = "ASSET_DOWNLOAD_ERROR";
|
|
29
|
+
ErrorType["IMAGE_OPTIMIZATION_ERROR"] = "IMAGE_OPTIMIZATION_ERROR";
|
|
30
|
+
// Config
|
|
31
|
+
ErrorType["CONFIG_ERROR"] = "CONFIG_ERROR";
|
|
32
|
+
ErrorType["INVALID_FRAMEWORK"] = "INVALID_FRAMEWORK";
|
|
33
|
+
})(ErrorType || (exports.ErrorType = ErrorType = {}));
|
|
34
|
+
/**
|
|
35
|
+
* Custom error class with type, context, and recoverability info.
|
|
36
|
+
*/
|
|
37
|
+
class SystemError extends Error {
|
|
38
|
+
constructor(type, message, context, recoverable = false) {
|
|
39
|
+
super(message);
|
|
40
|
+
this.type = type;
|
|
41
|
+
this.context = context;
|
|
42
|
+
this.recoverable = recoverable;
|
|
43
|
+
this.name = 'SystemError';
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.SystemError = SystemError;
|
|
47
|
+
/**
|
|
48
|
+
* Logger that collects log entries for reporting.
|
|
49
|
+
*/
|
|
50
|
+
class Logger {
|
|
51
|
+
constructor() {
|
|
52
|
+
this.entries = [];
|
|
53
|
+
}
|
|
54
|
+
debug(message, context) {
|
|
55
|
+
this.log('debug', message, context);
|
|
56
|
+
}
|
|
57
|
+
info(message, context) {
|
|
58
|
+
this.log('info', message, context);
|
|
59
|
+
}
|
|
60
|
+
warn(message, context) {
|
|
61
|
+
this.log('warn', message, context);
|
|
62
|
+
}
|
|
63
|
+
error(message, context) {
|
|
64
|
+
this.log('error', message, context);
|
|
65
|
+
}
|
|
66
|
+
getEntries() {
|
|
67
|
+
return [...this.entries];
|
|
68
|
+
}
|
|
69
|
+
getErrors() {
|
|
70
|
+
return this.entries.filter((e) => e.level === 'error');
|
|
71
|
+
}
|
|
72
|
+
getWarnings() {
|
|
73
|
+
return this.entries.filter((e) => e.level === 'warn');
|
|
74
|
+
}
|
|
75
|
+
clear() {
|
|
76
|
+
this.entries = [];
|
|
77
|
+
}
|
|
78
|
+
log(level, message, context) {
|
|
79
|
+
this.entries.push({ level, message, timestamp: new Date(), context });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
exports.Logger = Logger;
|
|
83
|
+
/**
|
|
84
|
+
* Determines the recovery strategy for a given error type.
|
|
85
|
+
*/
|
|
86
|
+
function getRecoveryStrategy(errorType) {
|
|
87
|
+
switch (errorType) {
|
|
88
|
+
case ErrorType.AUTHENTICATION_ERROR:
|
|
89
|
+
case ErrorType.INVALID_FRAMEWORK:
|
|
90
|
+
case ErrorType.CONFIG_ERROR:
|
|
91
|
+
// Non-recoverable: fail immediately
|
|
92
|
+
return 'fallback';
|
|
93
|
+
case ErrorType.FIGMA_API_ERROR:
|
|
94
|
+
case ErrorType.MCP_CONNECTION_ERROR:
|
|
95
|
+
case ErrorType.ASSET_DOWNLOAD_ERROR:
|
|
96
|
+
// Network errors: retry
|
|
97
|
+
return 'retry';
|
|
98
|
+
case ErrorType.PARSE_ERROR:
|
|
99
|
+
case ErrorType.TRANSFORMATION_ERROR:
|
|
100
|
+
case ErrorType.INVALID_NODE_TYPE:
|
|
101
|
+
case ErrorType.CODE_GENERATION_ERROR:
|
|
102
|
+
case ErrorType.TEMPLATE_ERROR:
|
|
103
|
+
case ErrorType.VALIDATION_ERROR:
|
|
104
|
+
case ErrorType.RENDER_ERROR:
|
|
105
|
+
case ErrorType.IMAGE_OPTIMIZATION_ERROR:
|
|
106
|
+
case ErrorType.FILE_WRITE_ERROR:
|
|
107
|
+
case ErrorType.FILE_NOT_FOUND:
|
|
108
|
+
// Processing errors: skip and continue
|
|
109
|
+
return 'skip';
|
|
110
|
+
default:
|
|
111
|
+
return 'skip';
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Generate a processing report from logger entries and stats.
|
|
116
|
+
*/
|
|
117
|
+
function generateReport(logger, startTime, stats) {
|
|
118
|
+
const endTime = new Date();
|
|
119
|
+
return {
|
|
120
|
+
startTime,
|
|
121
|
+
endTime,
|
|
122
|
+
duration: endTime.getTime() - startTime.getTime(),
|
|
123
|
+
stats,
|
|
124
|
+
errors: logger.getErrors().map((e) => new SystemError(ErrorType.TRANSFORMATION_ERROR, e.message, e.context, true)),
|
|
125
|
+
warnings: logger.getWarnings().map((w) => w.message),
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ASTNode } from '../transformation/types';
|
|
2
|
+
import type { GeneratedFile } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Organizes generated files into a proper directory structure
|
|
5
|
+
* following framework conventions.
|
|
6
|
+
*/
|
|
7
|
+
export declare class FileOrganizer {
|
|
8
|
+
private framework;
|
|
9
|
+
private outputDir;
|
|
10
|
+
constructor(framework: 'react' | 'vue', outputDir: string);
|
|
11
|
+
/**
|
|
12
|
+
* Generate file name following framework conventions.
|
|
13
|
+
* React: PascalCase.jsx / PascalCase.tsx
|
|
14
|
+
* Vue: kebab-case.vue
|
|
15
|
+
*/
|
|
16
|
+
generateFileName(componentName: string, typescript?: boolean): string;
|
|
17
|
+
/**
|
|
18
|
+
* Generate directory structure from AST component tree.
|
|
19
|
+
* Returns a map of component name -> directory path.
|
|
20
|
+
*/
|
|
21
|
+
generateStructure(root: ASTNode): Map<string, string>;
|
|
22
|
+
/**
|
|
23
|
+
* Generate Props interface for a component that receives data from parent.
|
|
24
|
+
*/
|
|
25
|
+
generatePropsInterface(node: ASTNode): string;
|
|
26
|
+
/**
|
|
27
|
+
* Organize a flat list of generated files into proper directory structure.
|
|
28
|
+
*/
|
|
29
|
+
organize(files: GeneratedFile[], root: ASTNode): GeneratedFile[];
|
|
30
|
+
private buildStructure;
|
|
31
|
+
private inferProps;
|
|
32
|
+
private toPascalCase;
|
|
33
|
+
private toKebabCase;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=FileOrganizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileOrganizer.d.ts","sourceRoot":"","sources":["../../src/generation/FileOrganizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,EAAE,OAAO,GAAG,KAAK,EAAE,SAAS,EAAE,MAAM;IAKzD;;;;OAIG;IACH,gBAAgB,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,UAAQ,GAAG,MAAM;IAUnE;;;OAGG;IACH,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAMrD;;OAEG;IACH,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM;IAa7C;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,aAAa,EAAE;IAchE,OAAO,CAAC,cAAc;IAuBtB,OAAO,CAAC,UAAU;IAqBlB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,WAAW;CAOpB"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FileOrganizer = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Organizes generated files into a proper directory structure
|
|
6
|
+
* following framework conventions.
|
|
7
|
+
*/
|
|
8
|
+
class FileOrganizer {
|
|
9
|
+
constructor(framework, outputDir) {
|
|
10
|
+
this.framework = framework;
|
|
11
|
+
this.outputDir = outputDir;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Generate file name following framework conventions.
|
|
15
|
+
* React: PascalCase.jsx / PascalCase.tsx
|
|
16
|
+
* Vue: kebab-case.vue
|
|
17
|
+
*/
|
|
18
|
+
generateFileName(componentName, typescript = false) {
|
|
19
|
+
if (this.framework === 'react') {
|
|
20
|
+
const name = this.toPascalCase(componentName);
|
|
21
|
+
return `${name}.${typescript ? 'tsx' : 'jsx'}`;
|
|
22
|
+
}
|
|
23
|
+
// Vue
|
|
24
|
+
const name = this.toKebabCase(componentName);
|
|
25
|
+
return `${name}.vue`;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Generate directory structure from AST component tree.
|
|
29
|
+
* Returns a map of component name -> directory path.
|
|
30
|
+
*/
|
|
31
|
+
generateStructure(root) {
|
|
32
|
+
const structure = new Map();
|
|
33
|
+
this.buildStructure(root, this.outputDir, structure, 0);
|
|
34
|
+
return structure;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Generate Props interface for a component that receives data from parent.
|
|
38
|
+
*/
|
|
39
|
+
generatePropsInterface(node) {
|
|
40
|
+
const props = this.inferProps(node);
|
|
41
|
+
if (props.length === 0)
|
|
42
|
+
return '';
|
|
43
|
+
const name = this.toPascalCase(node.metadata.componentName || node.name);
|
|
44
|
+
const lines = [`export interface ${name}Props {`];
|
|
45
|
+
for (const prop of props) {
|
|
46
|
+
lines.push(` ${prop.name}${prop.optional ? '?' : ''}: ${prop.type};`);
|
|
47
|
+
}
|
|
48
|
+
lines.push('}');
|
|
49
|
+
return lines.join('\n');
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Organize a flat list of generated files into proper directory structure.
|
|
53
|
+
*/
|
|
54
|
+
organize(files, root) {
|
|
55
|
+
const structure = this.generateStructure(root);
|
|
56
|
+
return files.map((file) => {
|
|
57
|
+
// Try to match file to a component directory
|
|
58
|
+
const baseName = file.path.split('/').pop() || '';
|
|
59
|
+
const componentName = baseName.replace(/\.(jsx|tsx|vue|css|module\.css)$/, '');
|
|
60
|
+
const dir = structure.get(componentName) || structure.get(this.toPascalCase(componentName));
|
|
61
|
+
if (dir) {
|
|
62
|
+
return { ...file, path: `${dir}/${baseName}` };
|
|
63
|
+
}
|
|
64
|
+
return file;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
buildStructure(node, currentDir, structure, depth) {
|
|
68
|
+
if (node.metadata.isComponent || node.type === 'Component') {
|
|
69
|
+
const name = node.metadata.componentName || node.name;
|
|
70
|
+
const dirName = this.framework === 'react' ? this.toPascalCase(name) : this.toKebabCase(name);
|
|
71
|
+
const componentDir = depth > 0 ? `${currentDir}/components/${dirName}` : `${currentDir}/${dirName}`;
|
|
72
|
+
structure.set(name, componentDir);
|
|
73
|
+
structure.set(this.toPascalCase(name), componentDir);
|
|
74
|
+
for (const child of node.children) {
|
|
75
|
+
this.buildStructure(child, componentDir, structure, depth + 1);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
for (const child of node.children) {
|
|
80
|
+
this.buildStructure(child, currentDir, structure, depth);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
inferProps(node) {
|
|
85
|
+
const props = [];
|
|
86
|
+
// If node has text children, it likely needs a text/label prop
|
|
87
|
+
const textChildren = node.children.filter((c) => c.type === 'Text');
|
|
88
|
+
if (textChildren.length > 0) {
|
|
89
|
+
props.push({ name: 'children', type: 'React.ReactNode', optional: true });
|
|
90
|
+
}
|
|
91
|
+
// If node has image children, it likely needs src prop
|
|
92
|
+
const imageChildren = node.children.filter((c) => c.type === 'Image');
|
|
93
|
+
if (imageChildren.length > 0) {
|
|
94
|
+
props.push({ name: 'imageSrc', type: 'string', optional: true });
|
|
95
|
+
}
|
|
96
|
+
// className is always optional
|
|
97
|
+
props.push({ name: 'className', type: 'string', optional: true });
|
|
98
|
+
return props;
|
|
99
|
+
}
|
|
100
|
+
toPascalCase(str) {
|
|
101
|
+
return str
|
|
102
|
+
.replace(/[^\w\s-]/g, '')
|
|
103
|
+
.split(/[-_\s]+/)
|
|
104
|
+
.filter(Boolean)
|
|
105
|
+
.map((s) => s.charAt(0).toUpperCase() + s.slice(1).toLowerCase())
|
|
106
|
+
.join('');
|
|
107
|
+
}
|
|
108
|
+
toKebabCase(str) {
|
|
109
|
+
return str
|
|
110
|
+
.replace(/[^\w\s-]/g, '')
|
|
111
|
+
.replace(/([a-z])([A-Z])/g, '$1-$2')
|
|
112
|
+
.replace(/[\s_]+/g, '-')
|
|
113
|
+
.toLowerCase();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
exports.FileOrganizer = FileOrganizer;
|
|
117
|
+
//# sourceMappingURL=FileOrganizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileOrganizer.js","sourceRoot":"","sources":["../../src/generation/FileOrganizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { DesignTokens, TokenExportFormat } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Exports design tokens to various formats: CSS variables, SCSS, JSON, JS.
|
|
4
|
+
*/
|
|
5
|
+
export declare class DesignTokenExporter {
|
|
6
|
+
export(tokens: DesignTokens, format: TokenExportFormat): string;
|
|
7
|
+
private toCSS;
|
|
8
|
+
private toSCSS;
|
|
9
|
+
private toJSON;
|
|
10
|
+
private toJS;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=DesignTokenExporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DesignTokenExporter.d.ts","sourceRoot":"","sources":["../../src/tokens/DesignTokenExporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAE/D;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,iBAAiB,GAAG,MAAM;IAS/D,OAAO,CAAC,KAAK;IAgBb,OAAO,CAAC,MAAM;IAed,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,IAAI;CAGb"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DesignTokenExporter = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Exports design tokens to various formats: CSS variables, SCSS, JSON, JS.
|
|
6
|
+
*/
|
|
7
|
+
class DesignTokenExporter {
|
|
8
|
+
export(tokens, format) {
|
|
9
|
+
switch (format) {
|
|
10
|
+
case 'css': return this.toCSS(tokens);
|
|
11
|
+
case 'scss': return this.toSCSS(tokens);
|
|
12
|
+
case 'json': return this.toJSON(tokens);
|
|
13
|
+
case 'js': return this.toJS(tokens);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
toCSS(tokens) {
|
|
17
|
+
const lines = [':root {'];
|
|
18
|
+
for (const c of tokens.colors)
|
|
19
|
+
lines.push(` --${c.name}: ${c.css};`);
|
|
20
|
+
for (const t of tokens.typography) {
|
|
21
|
+
lines.push(` --${t.name}-family: ${t.fontFamily};`);
|
|
22
|
+
lines.push(` --${t.name}-size: ${t.fontSize}px;`);
|
|
23
|
+
lines.push(` --${t.name}-weight: ${t.fontWeight};`);
|
|
24
|
+
lines.push(` --${t.name}-line-height: ${t.lineHeight}px;`);
|
|
25
|
+
}
|
|
26
|
+
for (const s of tokens.spacing)
|
|
27
|
+
lines.push(` --${s.name}: ${s.value}px;`);
|
|
28
|
+
for (const e of tokens.effects)
|
|
29
|
+
lines.push(` --${e.name}: ${e.css};`);
|
|
30
|
+
for (const r of tokens.borderRadius)
|
|
31
|
+
lines.push(` --${r.name}: ${r.value}px;`);
|
|
32
|
+
lines.push('}');
|
|
33
|
+
return lines.join('\n') + '\n';
|
|
34
|
+
}
|
|
35
|
+
toSCSS(tokens) {
|
|
36
|
+
const lines = [];
|
|
37
|
+
for (const c of tokens.colors)
|
|
38
|
+
lines.push(`$${c.name}: ${c.css};`);
|
|
39
|
+
for (const t of tokens.typography) {
|
|
40
|
+
lines.push(`$${t.name}-family: ${t.fontFamily};`);
|
|
41
|
+
lines.push(`$${t.name}-size: ${t.fontSize}px;`);
|
|
42
|
+
lines.push(`$${t.name}-weight: ${t.fontWeight};`);
|
|
43
|
+
lines.push(`$${t.name}-line-height: ${t.lineHeight}px;`);
|
|
44
|
+
}
|
|
45
|
+
for (const s of tokens.spacing)
|
|
46
|
+
lines.push(`$${s.name}: ${s.value}px;`);
|
|
47
|
+
for (const e of tokens.effects)
|
|
48
|
+
lines.push(`$${e.name}: ${e.css};`);
|
|
49
|
+
for (const r of tokens.borderRadius)
|
|
50
|
+
lines.push(`$${r.name}: ${r.value}px;`);
|
|
51
|
+
return lines.join('\n') + '\n';
|
|
52
|
+
}
|
|
53
|
+
toJSON(tokens) {
|
|
54
|
+
return JSON.stringify(tokens, null, 2) + '\n';
|
|
55
|
+
}
|
|
56
|
+
toJS(tokens) {
|
|
57
|
+
return `export const designTokens = ${JSON.stringify(tokens, null, 2)};\n`;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
exports.DesignTokenExporter = DesignTokenExporter;
|
|
61
|
+
//# sourceMappingURL=DesignTokenExporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DesignTokenExporter.js","sourceRoot":"","sources":["../../src/tokens/DesignTokenExporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ASTNode } from '../transformation/types';
|
|
2
|
+
import type { DesignTokens } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Extracts design tokens (colors, typography, spacing, effects, border-radius)
|
|
5
|
+
* from an AST tree by traversing all nodes and deduplicating values.
|
|
6
|
+
*/
|
|
7
|
+
export declare class DesignTokenExtractor {
|
|
8
|
+
extract(root: ASTNode): DesignTokens;
|
|
9
|
+
private traverse;
|
|
10
|
+
private generateColorName;
|
|
11
|
+
private generateTypographyName;
|
|
12
|
+
private generateEffectName;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=DesignTokenExtractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DesignTokenExtractor.d.ts","sourceRoot":"","sources":["../../src/tokens/DesignTokenExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EACV,YAAY,EAMb,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY;IAqGpC,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,kBAAkB;CAI3B"}
|