@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.
- package/dist/commands/svg-to-vd/handler.d.ts +14 -0
- package/dist/commands/svg-to-vd/handler.d.ts.map +1 -0
- package/dist/commands/svg-to-vd/handler.js +119 -0
- package/dist/commands/svg-to-vd/handler.js.map +1 -0
- package/dist/config/manager.d.ts +18 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +53 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/directus/client.d.ts +14 -0
- package/dist/directus/client.d.ts.map +1 -0
- package/dist/directus/client.js +81 -0
- package/dist/directus/client.js.map +1 -0
- package/dist/download/handler.d.ts +6 -0
- package/dist/download/handler.d.ts.map +1 -0
- package/dist/download/handler.js +100 -0
- package/dist/download/handler.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +209 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/index.d.ts +14 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +69 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/types/index.d.ts +67 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/file-utils.d.ts +28 -0
- package/dist/utils/file-utils.d.ts.map +1 -0
- package/dist/utils/file-utils.js +61 -0
- package/dist/utils/file-utils.js.map +1 -0
- package/dist/utils/svg-converter.d.ts +44 -0
- package/dist/utils/svg-converter.d.ts.map +1 -0
- package/dist/utils/svg-converter.js +149 -0
- package/dist/utils/svg-converter.js.map +1 -0
- package/package.json +7 -1
- package/docs/ARCHITECTURE.md +0 -286
- package/docs/PUBLISH_QUICK_REFERENCE.md +0 -135
- package/docs/SVG_TO_VECTOR_DRAWABLE.md +0 -186
- package/docs/TESTING.md +0 -429
- package/docs/USAGE_EXAMPLES.md +0 -520
- package/docs/WINDOWS_DEVELOPMENT.md +0 -487
- package/docs/WORKFLOW.md +0 -479
- package/scripts/publish.ps1 +0 -193
- package/scripts/publish.sh +0 -170
- package/src/commands/svg-to-vd/handler.ts +0 -131
- package/src/config/manager.ts +0 -58
- package/src/directus/client.ts +0 -101
- package/src/download/handler.ts +0 -116
- package/src/index.ts +0 -231
- package/src/prompts/index.ts +0 -76
- package/src/types/index.ts +0 -72
- package/src/utils/file-utils.ts +0 -69
- package/src/utils/svg-converter.ts +0 -196
- 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 @@
|
|
|
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"}
|