@khoaha/spek-cli 1.0.4 → 1.0.6

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 (57) 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 +3 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +210 -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 -2
  38. package/bin/cli.js +0 -7
  39. package/docs/ARCHITECTURE.md +0 -286
  40. package/docs/PUBLISH_QUICK_REFERENCE.md +0 -135
  41. package/docs/SVG_TO_VECTOR_DRAWABLE.md +0 -186
  42. package/docs/TESTING.md +0 -429
  43. package/docs/USAGE_EXAMPLES.md +0 -520
  44. package/docs/WINDOWS_DEVELOPMENT.md +0 -487
  45. package/docs/WORKFLOW.md +0 -479
  46. package/scripts/publish.ps1 +0 -193
  47. package/scripts/publish.sh +0 -170
  48. package/src/commands/svg-to-vd/handler.ts +0 -131
  49. package/src/config/manager.ts +0 -58
  50. package/src/directus/client.ts +0 -101
  51. package/src/download/handler.ts +0 -116
  52. package/src/index.ts +0 -231
  53. package/src/prompts/index.ts +0 -76
  54. package/src/types/index.ts +0 -72
  55. package/src/utils/file-utils.ts +0 -69
  56. package/src/utils/svg-converter.ts +0 -196
  57. package/tsconfig.json +0 -20
package/dist/index.js ADDED
@@ -0,0 +1,210 @@
1
+ #!/usr/bin/env node
2
+ import chalk from 'chalk';
3
+ import { loadConfig, saveConfig, getConfigPath } from './config/manager.js';
4
+ import { promptForConfig, promptForFileId } from './prompts/index.js';
5
+ import { handleDownload } from './download/handler.js';
6
+ import { handleSvgToVd } from './commands/svg-to-vd/handler.js';
7
+ /**
8
+ * Parse command line arguments
9
+ */
10
+ function parseArgs() {
11
+ const args = process.argv.slice(2);
12
+ const options = {};
13
+ // Check for command
14
+ if (args.length > 0 && !args[0].startsWith('-')) {
15
+ if (args[0] === 'svg-to-vd') {
16
+ options.command = 'svg-to-vd';
17
+ options.svgToVd = parseSvgToVdArgs(args.slice(1));
18
+ return options;
19
+ }
20
+ }
21
+ // Parse download options
22
+ for (let i = 0; i < args.length; i++) {
23
+ const arg = args[i];
24
+ if (arg === '-d' || arg === '--download') {
25
+ options.command = 'download';
26
+ options.fileId = args[i + 1];
27
+ i++; // Skip next arg
28
+ }
29
+ else if (arg === '-h' || arg === '--help') {
30
+ showHelp();
31
+ process.exit(0);
32
+ }
33
+ else if (arg === '-v' || arg === '--version') {
34
+ showVersion();
35
+ process.exit(0);
36
+ }
37
+ }
38
+ return options;
39
+ }
40
+ /**
41
+ * Parse svg-to-vd command arguments
42
+ */
43
+ function parseSvgToVdArgs(args) {
44
+ const options = {};
45
+ for (let i = 0; i < args.length; i++) {
46
+ const arg = args[i];
47
+ if (arg === '-i' || arg === '--input') {
48
+ options.input = args[i + 1];
49
+ i++;
50
+ }
51
+ else if (arg === '-o' || arg === '--output') {
52
+ options.output = args[i + 1];
53
+ i++;
54
+ }
55
+ else if (arg === '--tint') {
56
+ options.tint = args[i + 1];
57
+ i++;
58
+ }
59
+ else if (arg === '-h' || arg === '--help') {
60
+ showSvgToVdHelp();
61
+ process.exit(0);
62
+ }
63
+ }
64
+ return options;
65
+ }
66
+ /**
67
+ * Show help message
68
+ */
69
+ function showHelp() {
70
+ console.log(`
71
+ ${chalk.bold('spek-cli')} - Download and extract Figma design specs from Directus
72
+
73
+ ${chalk.bold('USAGE')}
74
+ npx spek-cli [command] [options]
75
+
76
+ ${chalk.bold('COMMANDS')}
77
+ svg-to-vd Convert SVG to Android Vector Drawable
78
+ (no command) Interactive download mode
79
+
80
+ ${chalk.bold('OPTIONS')}
81
+ -d, --download <file-id> Download and extract file by ID
82
+ -h, --help Show this help message
83
+ -v, --version Show version
84
+
85
+ ${chalk.bold('EXAMPLES')}
86
+ ${chalk.dim('# Interactive mode (prompts for file ID)')}
87
+ npx spek-cli
88
+
89
+ ${chalk.dim('# Direct download')}
90
+ npx spek-cli -d abc123-def456-ghi789
91
+
92
+ ${chalk.dim('# Convert SVG to Vector Drawable')}
93
+ npx spek-cli svg-to-vd -i icon.svg -o icon.xml
94
+ npx spek-cli svg-to-vd --help
95
+
96
+ ${chalk.bold('CONFIGURATION')}
97
+ Config is stored at: ${chalk.cyan(getConfigPath())}
98
+ On first run, you'll be prompted to enter:
99
+ - Directus instance URL
100
+ - Access token
101
+ `);
102
+ }
103
+ /**
104
+ * Show SVG to Vector Drawable help
105
+ */
106
+ function showSvgToVdHelp() {
107
+ console.log(`
108
+ ${chalk.bold('spek-cli svg-to-vd')} - Convert SVG to Android Vector Drawable
109
+
110
+ ${chalk.bold('USAGE')}
111
+ npx spek-cli svg-to-vd -i <input> -o <output> [options]
112
+
113
+ ${chalk.bold('REQUIRED')}
114
+ -i, --input <input> SVG file path or raw SVG content
115
+ -o, --output <output> Output Vector Drawable XML file path
116
+
117
+ ${chalk.bold('OPTIONS')}
118
+ --tint <color> Tint color (e.g., "#FF5722")
119
+ -h, --help Show this help message
120
+
121
+ ${chalk.bold('EXAMPLES')}
122
+ ${chalk.dim('# Convert SVG file')}
123
+ npx spek-cli svg-to-vd -i ./icons/heart.svg -o ./drawables/heart.xml
124
+
125
+ ${chalk.dim('# With tint color')}
126
+ npx spek-cli svg-to-vd -i icon.svg -o icon.xml --tint "#FF5722"
127
+
128
+ ${chalk.dim('# Using raw SVG content')}
129
+ npx spek-cli svg-to-vd -i "<svg>...</svg>" -o output.xml
130
+
131
+ ${chalk.bold('NOTES')}
132
+ • Input is auto-detected as file path or raw SVG content
133
+ • Output file will be overwritten if it already exists
134
+ • Output directory is created automatically if needed
135
+ • Complex SVG features may not be fully supported
136
+ `);
137
+ }
138
+ /**
139
+ * Show version
140
+ */
141
+ function showVersion() {
142
+ // Read version from package.json
143
+ console.log('1.0.0');
144
+ }
145
+ /**
146
+ * Main CLI entry point
147
+ */
148
+ async function main() {
149
+ console.log(chalk.bold.blue('\n📦 spek-cli\n'));
150
+ // Parse arguments
151
+ const options = parseArgs();
152
+ // Handle svg-to-vd command
153
+ if (options.command === 'svg-to-vd') {
154
+ if (!options.svgToVd) {
155
+ console.log(chalk.red('\n❌ Invalid svg-to-vd command'));
156
+ showSvgToVdHelp();
157
+ process.exit(1);
158
+ }
159
+ const result = await handleSvgToVd(options.svgToVd);
160
+ if (result.success) {
161
+ console.log(chalk.green.bold('\n✓ Conversion complete!\n'));
162
+ process.exit(0);
163
+ }
164
+ else {
165
+ console.log(chalk.red(`\n❌ Error: ${result.error}\n`));
166
+ process.exit(1);
167
+ }
168
+ }
169
+ // Check if config exists, if not prompt for setup
170
+ let config = loadConfig();
171
+ if (!config) {
172
+ const newConfig = await promptForConfig();
173
+ if (!newConfig) {
174
+ console.log(chalk.yellow('\n⚠️ Setup cancelled'));
175
+ process.exit(1);
176
+ }
177
+ saveConfig(newConfig);
178
+ config = loadConfig();
179
+ if (!config) {
180
+ console.log(chalk.red('\n❌ Failed to save configuration'));
181
+ process.exit(1);
182
+ }
183
+ console.log(chalk.green(`\n✓ Configuration saved to ${getConfigPath()}`));
184
+ }
185
+ // Get file ID (from args or prompt)
186
+ let fileId = options.fileId;
187
+ if (!fileId) {
188
+ fileId = await promptForFileId();
189
+ if (!fileId) {
190
+ console.log(chalk.yellow('\n⚠️ No file ID provided'));
191
+ process.exit(1);
192
+ }
193
+ }
194
+ // Download and extract
195
+ const result = await handleDownload(config, fileId);
196
+ if (result.success) {
197
+ console.log(chalk.green.bold('\n✓ Success!\n'));
198
+ process.exit(0);
199
+ }
200
+ else {
201
+ console.log(chalk.red(`\n❌ Error: ${result.error}\n`));
202
+ process.exit(1);
203
+ }
204
+ }
205
+ // Run CLI
206
+ main().catch((error) => {
207
+ console.error(chalk.red(`\n❌ Unexpected error: ${error.message}\n`));
208
+ process.exit(1);
209
+ });
210
+ //# 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"}