@khoaha/spek-cli 1.0.3 → 1.0.5

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.
Files changed (56) hide show
  1. package/dist/commands/svg-to-vd/handler.d.ts +14 -0
  2. package/dist/commands/svg-to-vd/handler.d.ts.map +1 -0
  3. package/dist/commands/svg-to-vd/handler.js +119 -0
  4. package/dist/commands/svg-to-vd/handler.js.map +1 -0
  5. package/dist/config/manager.d.ts +18 -0
  6. package/dist/config/manager.d.ts.map +1 -0
  7. package/dist/config/manager.js +53 -0
  8. package/dist/config/manager.js.map +1 -0
  9. package/dist/directus/client.d.ts +14 -0
  10. package/dist/directus/client.d.ts.map +1 -0
  11. package/dist/directus/client.js +81 -0
  12. package/dist/directus/client.js.map +1 -0
  13. package/dist/download/handler.d.ts +6 -0
  14. package/dist/download/handler.d.ts.map +1 -0
  15. package/dist/download/handler.js +100 -0
  16. package/dist/download/handler.js.map +1 -0
  17. package/dist/index.d.ts +2 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +209 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/prompts/index.d.ts +14 -0
  22. package/dist/prompts/index.d.ts.map +1 -0
  23. package/dist/prompts/index.js +69 -0
  24. package/dist/prompts/index.js.map +1 -0
  25. package/dist/types/index.d.ts +67 -0
  26. package/dist/types/index.d.ts.map +1 -0
  27. package/dist/types/index.js +2 -0
  28. package/dist/types/index.js.map +1 -0
  29. package/dist/utils/file-utils.d.ts +28 -0
  30. package/dist/utils/file-utils.d.ts.map +1 -0
  31. package/dist/utils/file-utils.js +61 -0
  32. package/dist/utils/file-utils.js.map +1 -0
  33. package/dist/utils/svg-converter.d.ts +44 -0
  34. package/dist/utils/svg-converter.d.ts.map +1 -0
  35. package/dist/utils/svg-converter.js +149 -0
  36. package/dist/utils/svg-converter.js.map +1 -0
  37. package/package.json +7 -1
  38. package/docs/ARCHITECTURE.md +0 -286
  39. package/docs/PUBLISH_QUICK_REFERENCE.md +0 -135
  40. package/docs/SVG_TO_VECTOR_DRAWABLE.md +0 -186
  41. package/docs/TESTING.md +0 -429
  42. package/docs/USAGE_EXAMPLES.md +0 -520
  43. package/docs/WINDOWS_DEVELOPMENT.md +0 -487
  44. package/docs/WORKFLOW.md +0 -479
  45. package/scripts/publish.ps1 +0 -193
  46. package/scripts/publish.sh +0 -170
  47. package/src/commands/svg-to-vd/handler.ts +0 -131
  48. package/src/config/manager.ts +0 -58
  49. package/src/directus/client.ts +0 -101
  50. package/src/download/handler.ts +0 -116
  51. package/src/index.ts +0 -231
  52. package/src/prompts/index.ts +0 -76
  53. package/src/types/index.ts +0 -72
  54. package/src/utils/file-utils.ts +0 -69
  55. package/src/utils/svg-converter.ts +0 -196
  56. package/tsconfig.json +0 -20
package/dist/index.js ADDED
@@ -0,0 +1,209 @@
1
+ import chalk from 'chalk';
2
+ import { loadConfig, saveConfig, getConfigPath } from './config/manager.js';
3
+ import { promptForConfig, promptForFileId } from './prompts/index.js';
4
+ import { handleDownload } from './download/handler.js';
5
+ import { handleSvgToVd } from './commands/svg-to-vd/handler.js';
6
+ /**
7
+ * Parse command line arguments
8
+ */
9
+ function parseArgs() {
10
+ const args = process.argv.slice(2);
11
+ const options = {};
12
+ // Check for command
13
+ if (args.length > 0 && !args[0].startsWith('-')) {
14
+ if (args[0] === 'svg-to-vd') {
15
+ options.command = 'svg-to-vd';
16
+ options.svgToVd = parseSvgToVdArgs(args.slice(1));
17
+ return options;
18
+ }
19
+ }
20
+ // Parse download options
21
+ for (let i = 0; i < args.length; i++) {
22
+ const arg = args[i];
23
+ if (arg === '-d' || arg === '--download') {
24
+ options.command = 'download';
25
+ options.fileId = args[i + 1];
26
+ i++; // Skip next arg
27
+ }
28
+ else if (arg === '-h' || arg === '--help') {
29
+ showHelp();
30
+ process.exit(0);
31
+ }
32
+ else if (arg === '-v' || arg === '--version') {
33
+ showVersion();
34
+ process.exit(0);
35
+ }
36
+ }
37
+ return options;
38
+ }
39
+ /**
40
+ * Parse svg-to-vd command arguments
41
+ */
42
+ function parseSvgToVdArgs(args) {
43
+ const options = {};
44
+ for (let i = 0; i < args.length; i++) {
45
+ const arg = args[i];
46
+ if (arg === '-i' || arg === '--input') {
47
+ options.input = args[i + 1];
48
+ i++;
49
+ }
50
+ else if (arg === '-o' || arg === '--output') {
51
+ options.output = args[i + 1];
52
+ i++;
53
+ }
54
+ else if (arg === '--tint') {
55
+ options.tint = args[i + 1];
56
+ i++;
57
+ }
58
+ else if (arg === '-h' || arg === '--help') {
59
+ showSvgToVdHelp();
60
+ process.exit(0);
61
+ }
62
+ }
63
+ return options;
64
+ }
65
+ /**
66
+ * Show help message
67
+ */
68
+ function showHelp() {
69
+ console.log(`
70
+ ${chalk.bold('spek-cli')} - Download and extract Figma design specs from Directus
71
+
72
+ ${chalk.bold('USAGE')}
73
+ npx spek-cli [command] [options]
74
+
75
+ ${chalk.bold('COMMANDS')}
76
+ svg-to-vd Convert SVG to Android Vector Drawable
77
+ (no command) Interactive download mode
78
+
79
+ ${chalk.bold('OPTIONS')}
80
+ -d, --download <file-id> Download and extract file by ID
81
+ -h, --help Show this help message
82
+ -v, --version Show version
83
+
84
+ ${chalk.bold('EXAMPLES')}
85
+ ${chalk.dim('# Interactive mode (prompts for file ID)')}
86
+ npx spek-cli
87
+
88
+ ${chalk.dim('# Direct download')}
89
+ npx spek-cli -d abc123-def456-ghi789
90
+
91
+ ${chalk.dim('# Convert SVG to Vector Drawable')}
92
+ npx spek-cli svg-to-vd -i icon.svg -o icon.xml
93
+ npx spek-cli svg-to-vd --help
94
+
95
+ ${chalk.bold('CONFIGURATION')}
96
+ Config is stored at: ${chalk.cyan(getConfigPath())}
97
+ On first run, you'll be prompted to enter:
98
+ - Directus instance URL
99
+ - Access token
100
+ `);
101
+ }
102
+ /**
103
+ * Show SVG to Vector Drawable help
104
+ */
105
+ function showSvgToVdHelp() {
106
+ console.log(`
107
+ ${chalk.bold('spek-cli svg-to-vd')} - Convert SVG to Android Vector Drawable
108
+
109
+ ${chalk.bold('USAGE')}
110
+ npx spek-cli svg-to-vd -i <input> -o <output> [options]
111
+
112
+ ${chalk.bold('REQUIRED')}
113
+ -i, --input <input> SVG file path or raw SVG content
114
+ -o, --output <output> Output Vector Drawable XML file path
115
+
116
+ ${chalk.bold('OPTIONS')}
117
+ --tint <color> Tint color (e.g., "#FF5722")
118
+ -h, --help Show this help message
119
+
120
+ ${chalk.bold('EXAMPLES')}
121
+ ${chalk.dim('# Convert SVG file')}
122
+ npx spek-cli svg-to-vd -i ./icons/heart.svg -o ./drawables/heart.xml
123
+
124
+ ${chalk.dim('# With tint color')}
125
+ npx spek-cli svg-to-vd -i icon.svg -o icon.xml --tint "#FF5722"
126
+
127
+ ${chalk.dim('# Using raw SVG content')}
128
+ npx spek-cli svg-to-vd -i "<svg>...</svg>" -o output.xml
129
+
130
+ ${chalk.bold('NOTES')}
131
+ • Input is auto-detected as file path or raw SVG content
132
+ • Output file will be overwritten if it already exists
133
+ • Output directory is created automatically if needed
134
+ • Complex SVG features may not be fully supported
135
+ `);
136
+ }
137
+ /**
138
+ * Show version
139
+ */
140
+ function showVersion() {
141
+ // Read version from package.json
142
+ console.log('1.0.0');
143
+ }
144
+ /**
145
+ * Main CLI entry point
146
+ */
147
+ async function main() {
148
+ console.log(chalk.bold.blue('\n📦 spek-cli\n'));
149
+ // Parse arguments
150
+ const options = parseArgs();
151
+ // Handle svg-to-vd command
152
+ if (options.command === 'svg-to-vd') {
153
+ if (!options.svgToVd) {
154
+ console.log(chalk.red('\n❌ Invalid svg-to-vd command'));
155
+ showSvgToVdHelp();
156
+ process.exit(1);
157
+ }
158
+ const result = await handleSvgToVd(options.svgToVd);
159
+ if (result.success) {
160
+ console.log(chalk.green.bold('\n✓ Conversion complete!\n'));
161
+ process.exit(0);
162
+ }
163
+ else {
164
+ console.log(chalk.red(`\n❌ Error: ${result.error}\n`));
165
+ process.exit(1);
166
+ }
167
+ }
168
+ // Check if config exists, if not prompt for setup
169
+ let config = loadConfig();
170
+ if (!config) {
171
+ const newConfig = await promptForConfig();
172
+ if (!newConfig) {
173
+ console.log(chalk.yellow('\n⚠️ Setup cancelled'));
174
+ process.exit(1);
175
+ }
176
+ saveConfig(newConfig);
177
+ config = loadConfig();
178
+ if (!config) {
179
+ console.log(chalk.red('\n❌ Failed to save configuration'));
180
+ process.exit(1);
181
+ }
182
+ console.log(chalk.green(`\n✓ Configuration saved to ${getConfigPath()}`));
183
+ }
184
+ // Get file ID (from args or prompt)
185
+ let fileId = options.fileId;
186
+ if (!fileId) {
187
+ fileId = await promptForFileId();
188
+ if (!fileId) {
189
+ console.log(chalk.yellow('\n⚠️ No file ID provided'));
190
+ process.exit(1);
191
+ }
192
+ }
193
+ // Download and extract
194
+ const result = await handleDownload(config, fileId);
195
+ if (result.success) {
196
+ console.log(chalk.green.bold('\n✓ Success!\n'));
197
+ process.exit(0);
198
+ }
199
+ else {
200
+ console.log(chalk.red(`\n❌ Error: ${result.error}\n`));
201
+ process.exit(1);
202
+ }
203
+ }
204
+ // Run CLI
205
+ main().catch((error) => {
206
+ console.error(chalk.red(`\n❌ Unexpected error: ${error.message}\n`));
207
+ process.exit(1);
208
+ });
209
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { VaultConfig } from '../types/index.js';
2
+ /**
3
+ * Prompt user for Directus configuration
4
+ */
5
+ export declare function promptForConfig(): Promise<Omit<VaultConfig, 'createdAt'> | null>;
6
+ /**
7
+ * Prompt user for file ID (interactive mode)
8
+ */
9
+ export declare function promptForFileId(): Promise<string | null>;
10
+ /**
11
+ * Prompt user whether to overwrite existing files
12
+ */
13
+ export declare function promptOverwrite(): Promise<boolean>;
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG,IAAI,CAAC,CAmCtF;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAc9D;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAUxD"}
@@ -0,0 +1,69 @@
1
+ import prompts from 'prompts';
2
+ /**
3
+ * Prompt user for Directus configuration
4
+ */
5
+ export async function promptForConfig() {
6
+ console.log('\n🔧 Configuration not found. Let\'s set it up!\n');
7
+ const response = await prompts([
8
+ {
9
+ type: 'text',
10
+ name: 'directusUrl',
11
+ message: 'Enter your Directus instance URL:',
12
+ validate: (value) => {
13
+ if (!value)
14
+ return 'URL is required';
15
+ try {
16
+ new URL(value);
17
+ return true;
18
+ }
19
+ catch {
20
+ return 'Please enter a valid URL (e.g., https://my-instance.directus.app)';
21
+ }
22
+ },
23
+ },
24
+ {
25
+ type: 'password',
26
+ name: 'accessToken',
27
+ message: 'Enter your Directus access token:',
28
+ validate: (value) => (value ? true : 'Access token is required'),
29
+ },
30
+ ]);
31
+ // User cancelled (Ctrl+C)
32
+ if (!response.directusUrl || !response.accessToken) {
33
+ return null;
34
+ }
35
+ return {
36
+ directusUrl: response.directusUrl.trim(),
37
+ accessToken: response.accessToken.trim(),
38
+ };
39
+ }
40
+ /**
41
+ * Prompt user for file ID (interactive mode)
42
+ */
43
+ export async function promptForFileId() {
44
+ const response = await prompts({
45
+ type: 'text',
46
+ name: 'fileId',
47
+ message: 'Enter the file ID to download:',
48
+ validate: (value) => (value ? true : 'File ID is required'),
49
+ });
50
+ // User cancelled
51
+ if (!response.fileId) {
52
+ return null;
53
+ }
54
+ return response.fileId.trim();
55
+ }
56
+ /**
57
+ * Prompt user whether to overwrite existing files
58
+ */
59
+ export async function promptOverwrite() {
60
+ const response = await prompts({
61
+ type: 'confirm',
62
+ name: 'overwrite',
63
+ message: 'Files already exist in current directory. Overwrite?',
64
+ initial: false,
65
+ });
66
+ // User cancelled or said no
67
+ return response.overwrite === true;
68
+ }
69
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAG9B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IAEjE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;QAC7B;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,mCAAmC;YAC5C,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC1B,IAAI,CAAC,KAAK;oBAAE,OAAO,iBAAiB,CAAC;gBACrC,IAAI,CAAC;oBACH,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;oBACf,OAAO,IAAI,CAAC;gBACd,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,mEAAmE,CAAC;gBAC7E,CAAC;YACH,CAAC;SACF;QACD;YACE,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,mCAAmC;YAC5C,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,0BAA0B,CAAC;SACzE;KACF,CAAC,CAAC;IAEH,0BAA0B;IAC1B,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE;QACxC,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE;KACzC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;QAC7B,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,gCAAgC;QACzC,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAAC;KACpE,CAAC,CAAC;IAEH,iBAAiB;IACjB,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;QAC7B,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,sDAAsD;QAC/D,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;IAEH,4BAA4B;IAC5B,OAAO,QAAQ,CAAC,SAAS,KAAK,IAAI,CAAC;AACrC,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Configuration stored in ~/.spek-cli/config.json
3
+ */
4
+ export interface VaultConfig {
5
+ /** Directus instance URL (e.g., https://my-instance.directus.app) */
6
+ directusUrl: string;
7
+ /** Directus access token for authentication */
8
+ accessToken: string;
9
+ /** Timestamp when config was created */
10
+ createdAt: string;
11
+ }
12
+ /**
13
+ * CLI command options
14
+ */
15
+ export interface CliOptions {
16
+ /** File ID to download (from -d or --download flag) */
17
+ fileId?: string;
18
+ /** Command to execute */
19
+ command?: 'download' | 'svg-to-vd';
20
+ /** SVG to Vector Drawable conversion options */
21
+ svgToVd?: SvgToVdOptions;
22
+ }
23
+ /**
24
+ * SVG to Vector Drawable conversion options
25
+ */
26
+ export interface SvgToVdOptions {
27
+ /** Input: SVG file path or raw SVG content */
28
+ input: string;
29
+ /** Output: Destination file path for Vector Drawable XML */
30
+ output: string;
31
+ /** Optional tint color (e.g., "#FF5722") */
32
+ tint?: string;
33
+ }
34
+ /**
35
+ * SVG conversion result
36
+ */
37
+ export interface SvgConversionResult {
38
+ /** Whether conversion was successful */
39
+ success: boolean;
40
+ /** Path where file was written */
41
+ outputPath?: string;
42
+ /** Error message if failed */
43
+ error?: string;
44
+ }
45
+ /**
46
+ * Download result
47
+ */
48
+ export interface DownloadResult {
49
+ /** Whether download was successful */
50
+ success: boolean;
51
+ /** Path where files were extracted */
52
+ extractPath?: string;
53
+ /** Error message if failed */
54
+ error?: string;
55
+ }
56
+ /**
57
+ * File metadata from Directus
58
+ */
59
+ export interface FileMetadata {
60
+ /** File ID */
61
+ id: string;
62
+ /** Original filename */
63
+ filename_download: string;
64
+ /** File title */
65
+ title?: string;
66
+ }
67
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,qEAAqE;IACrE,WAAW,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,OAAO,CAAC,EAAE,UAAU,GAAG,WAAW,CAAC;IACnC,gDAAgD;IAChD,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,MAAM,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,wCAAwC;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAGD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,cAAc;IACd,EAAE,EAAE,MAAM,CAAC;IACX,wBAAwB;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Check if a file exists
3
+ */
4
+ export declare function fileExists(filePath: string): Promise<boolean>;
5
+ /**
6
+ * Read file content as string
7
+ */
8
+ export declare function readFileContent(filePath: string): Promise<string>;
9
+ /**
10
+ * Write content to file (creates directory if needed)
11
+ */
12
+ export declare function writeFileContent(filePath: string, content: string): Promise<void>;
13
+ /**
14
+ * Auto-detect if input is a file path or SVG content
15
+ * Detection logic:
16
+ * 1. If starts with '<svg' -> treat as content
17
+ * 2. If file exists -> read file
18
+ * 3. Fallback -> treat as content
19
+ */
20
+ export declare function detectInputType(input: string): Promise<{
21
+ isFile: boolean;
22
+ content: string;
23
+ }>;
24
+ /**
25
+ * Generate output file path by replacing extension
26
+ */
27
+ export declare function generateOutputPath(inputPath: string): string;
28
+ //# sourceMappingURL=file-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-utils.d.ts","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEvE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQvF;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBlG;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAG5D"}
@@ -0,0 +1,61 @@
1
+ import { readFile, writeFile, access } from 'fs/promises';
2
+ import { constants } from 'fs';
3
+ import { dirname } from 'path';
4
+ import { mkdir } from 'fs/promises';
5
+ /**
6
+ * Check if a file exists
7
+ */
8
+ export async function fileExists(filePath) {
9
+ try {
10
+ await access(filePath, constants.F_OK);
11
+ return true;
12
+ }
13
+ catch {
14
+ return false;
15
+ }
16
+ }
17
+ /**
18
+ * Read file content as string
19
+ */
20
+ export async function readFileContent(filePath) {
21
+ return await readFile(filePath, 'utf8');
22
+ }
23
+ /**
24
+ * Write content to file (creates directory if needed)
25
+ */
26
+ export async function writeFileContent(filePath, content) {
27
+ const dir = dirname(filePath);
28
+ // Ensure directory exists
29
+ await mkdir(dir, { recursive: true });
30
+ // Write file
31
+ await writeFile(filePath, content, 'utf8');
32
+ }
33
+ /**
34
+ * Auto-detect if input is a file path or SVG content
35
+ * Detection logic:
36
+ * 1. If starts with '<svg' -> treat as content
37
+ * 2. If file exists -> read file
38
+ * 3. Fallback -> treat as content
39
+ */
40
+ export async function detectInputType(input) {
41
+ const trimmedInput = input.trim();
42
+ // Check if it looks like SVG content
43
+ if (trimmedInput.startsWith('<svg')) {
44
+ return { isFile: false, content: trimmedInput };
45
+ }
46
+ // Check if it's a file path that exists
47
+ if (await fileExists(input)) {
48
+ const content = await readFileContent(input);
49
+ return { isFile: true, content };
50
+ }
51
+ // Fallback: treat as content
52
+ return { isFile: false, content: trimmedInput };
53
+ }
54
+ /**
55
+ * Generate output file path by replacing extension
56
+ */
57
+ export function generateOutputPath(inputPath) {
58
+ // Replace extension with .xml
59
+ return inputPath.replace(/\.[^.]+$/, '.xml');
60
+ }
61
+ //# sourceMappingURL=file-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB;IACpD,OAAO,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAgB,EAAE,OAAe;IACtE,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE9B,0BAA0B;IAC1B,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtC,aAAa;IACb,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAa;IACjD,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAElC,qCAAqC;IACrC,IAAI,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;IAClD,CAAC;IAED,wCAAwC;IACxC,IAAI,MAAM,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,KAAK,CAAC,CAAC;QAC7C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACnC,CAAC;IAED,6BAA6B;IAC7B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,8BAA8B;IAC9B,OAAO,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * SVG to Vector Drawable Conversion Utility
3
+ *
4
+ * Converts SVG content to Android Vector Drawable XML format using vd-tool
5
+ */
6
+ /**
7
+ * Validation result for SVG content
8
+ */
9
+ interface SvgValidationResult {
10
+ isValid: boolean;
11
+ errors: string[];
12
+ }
13
+ /**
14
+ * Conversion result
15
+ */
16
+ interface ConversionResult {
17
+ vectorDrawable: string;
18
+ warnings: string[];
19
+ }
20
+ /**
21
+ * Conversion options
22
+ */
23
+ interface ConversionOptions {
24
+ /** Optional tint color to apply (e.g., "#FF5722") */
25
+ tint?: string;
26
+ }
27
+ /**
28
+ * Validates SVG content format
29
+ *
30
+ * @param svgContent - The SVG content to validate
31
+ * @returns Validation result with isValid boolean and errors array
32
+ */
33
+ export declare function validateSvgContent(svgContent: string): SvgValidationResult;
34
+ /**
35
+ * Converts SVG content to Android Vector Drawable XML format
36
+ *
37
+ * @param svgContent - The SVG content to convert
38
+ * @param options - Conversion options
39
+ * @returns Conversion result with vectorDrawable XML and optional warnings
40
+ * @throws Error if conversion fails
41
+ */
42
+ export declare function convertSvgToVectorDrawable(svgContent: string, options?: ConversionOptions): Promise<ConversionResult>;
43
+ export {};
44
+ //# sourceMappingURL=svg-converter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg-converter.d.ts","sourceRoot":"","sources":["../../src/utils/svg-converter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH;;GAEG;AACH,UAAU,mBAAmB;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,UAAU,gBAAgB;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,UAAU,iBAAiB;IACzB,qDAAqD;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,mBAAmB,CA+B1E;AA2CD;;;;;;;GAOG;AACH,wBAAsB,0BAA0B,CAC9C,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAqE3B"}