assets-toolkit 1.0.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.
Files changed (163) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +354 -0
  3. package/dist/cacheHelper.d.ts +2 -0
  4. package/dist/cacheHelper.d.ts.map +1 -0
  5. package/dist/cacheHelper.js +2 -0
  6. package/dist/cacheHelper.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +91 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/colorConsole.d.ts +3 -0
  12. package/dist/colorConsole.d.ts.map +1 -0
  13. package/dist/colorConsole.js +22 -0
  14. package/dist/colorConsole.js.map +1 -0
  15. package/dist/config-types.d.ts +2 -0
  16. package/dist/config-types.d.ts.map +1 -0
  17. package/dist/config-types.js +2 -0
  18. package/dist/config-types.js.map +1 -0
  19. package/dist/config.d.ts +5 -0
  20. package/dist/config.d.ts.map +1 -0
  21. package/dist/config.js +82 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/constants.d.ts +12 -0
  24. package/dist/constants.d.ts.map +1 -0
  25. package/dist/constants.js +52 -0
  26. package/dist/constants.js.map +1 -0
  27. package/dist/detect-target.d.ts +3 -0
  28. package/dist/detect-target.d.ts.map +1 -0
  29. package/dist/detect-target.js +21 -0
  30. package/dist/detect-target.js.map +1 -0
  31. package/dist/generator.d.ts +6 -0
  32. package/dist/generator.d.ts.map +1 -0
  33. package/dist/generator.js +170 -0
  34. package/dist/generator.js.map +1 -0
  35. package/dist/helps/cacheHelper.d.ts +4 -0
  36. package/dist/helps/cacheHelper.d.ts.map +1 -0
  37. package/dist/helps/cacheHelper.js +19 -0
  38. package/dist/helps/cacheHelper.js.map +1 -0
  39. package/dist/helps/checkAssetsDir.d.ts +2 -0
  40. package/dist/helps/checkAssetsDir.d.ts.map +1 -0
  41. package/dist/helps/checkAssetsDir.js +21 -0
  42. package/dist/helps/checkAssetsDir.js.map +1 -0
  43. package/dist/helps/checkFileValidations.d.ts +31 -0
  44. package/dist/helps/checkFileValidations.d.ts.map +1 -0
  45. package/dist/helps/checkFileValidations.js +134 -0
  46. package/dist/helps/checkFileValidations.js.map +1 -0
  47. package/dist/helps/checkInvalidFileNames.d.ts +2 -0
  48. package/dist/helps/checkInvalidFileNames.d.ts.map +1 -0
  49. package/dist/helps/checkInvalidFileNames.js +23 -0
  50. package/dist/helps/checkInvalidFileNames.js.map +1 -0
  51. package/dist/helps/checkLargeFiles.d.ts +5 -0
  52. package/dist/helps/checkLargeFiles.d.ts.map +1 -0
  53. package/dist/helps/checkLargeFiles.js +36 -0
  54. package/dist/helps/checkLargeFiles.js.map +1 -0
  55. package/dist/helps/doctorConfirmation.d.ts +2 -0
  56. package/dist/helps/doctorConfirmation.d.ts.map +1 -0
  57. package/dist/helps/doctorConfirmation.js +14 -0
  58. package/dist/helps/doctorConfirmation.js.map +1 -0
  59. package/dist/helps/duplicateFiles.d.ts +2 -0
  60. package/dist/helps/duplicateFiles.d.ts.map +1 -0
  61. package/dist/helps/duplicateFiles.js +2 -0
  62. package/dist/helps/duplicateFiles.js.map +1 -0
  63. package/dist/helps/getProjectAssetFiles.d.ts +2 -0
  64. package/dist/helps/getProjectAssetFiles.d.ts.map +1 -0
  65. package/dist/helps/getProjectAssetFiles.js +11 -0
  66. package/dist/helps/getProjectAssetFiles.js.map +1 -0
  67. package/dist/helps/getUniqueFileName.d.ts +2 -0
  68. package/dist/helps/getUniqueFileName.d.ts.map +1 -0
  69. package/dist/helps/getUniqueFileName.js +13 -0
  70. package/dist/helps/getUniqueFileName.js.map +1 -0
  71. package/dist/helps/gitignore.d.ts +2 -0
  72. package/dist/helps/gitignore.d.ts.map +1 -0
  73. package/dist/helps/gitignore.js +24 -0
  74. package/dist/helps/gitignore.js.map +1 -0
  75. package/dist/helps/incrementalHash.d.ts +3 -0
  76. package/dist/helps/incrementalHash.d.ts.map +1 -0
  77. package/dist/helps/incrementalHash.js +8 -0
  78. package/dist/helps/incrementalHash.js.map +1 -0
  79. package/dist/helps/logger.d.ts +9 -0
  80. package/dist/helps/logger.d.ts.map +1 -0
  81. package/dist/helps/logger.js +30 -0
  82. package/dist/helps/logger.js.map +1 -0
  83. package/dist/helps/normalizeFileName.d.ts +2 -0
  84. package/dist/helps/normalizeFileName.d.ts.map +1 -0
  85. package/dist/helps/normalizeFileName.js +14 -0
  86. package/dist/helps/normalizeFileName.js.map +1 -0
  87. package/dist/helps/normalizeFiles.d.ts +2 -0
  88. package/dist/helps/normalizeFiles.d.ts.map +1 -0
  89. package/dist/helps/normalizeFiles.js +2 -0
  90. package/dist/helps/normalizeFiles.js.map +1 -0
  91. package/dist/helps/platform-support.d.ts +3 -0
  92. package/dist/helps/platform-support.d.ts.map +1 -0
  93. package/dist/helps/platform-support.js +69 -0
  94. package/dist/helps/platform-support.js.map +1 -0
  95. package/dist/helps/printHelp.d.ts +2 -0
  96. package/dist/helps/printHelp.d.ts.map +1 -0
  97. package/dist/helps/printHelp.js +72 -0
  98. package/dist/helps/printHelp.js.map +1 -0
  99. package/dist/index.d.ts +2 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +2 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/runtime.d.ts +8 -0
  104. package/dist/runtime.d.ts.map +1 -0
  105. package/dist/runtime.js +23 -0
  106. package/dist/runtime.js.map +1 -0
  107. package/dist/toolkits/clean.d.ts +2 -0
  108. package/dist/toolkits/clean.d.ts.map +1 -0
  109. package/dist/toolkits/clean.js +40 -0
  110. package/dist/toolkits/clean.js.map +1 -0
  111. package/dist/toolkits/doctor.d.ts +2 -0
  112. package/dist/toolkits/doctor.d.ts.map +1 -0
  113. package/dist/toolkits/doctor.js +110 -0
  114. package/dist/toolkits/doctor.js.map +1 -0
  115. package/dist/toolkits/doctorFix.d.ts +3 -0
  116. package/dist/toolkits/doctorFix.d.ts.map +1 -0
  117. package/dist/toolkits/doctorFix.js +105 -0
  118. package/dist/toolkits/doctorFix.js.map +1 -0
  119. package/dist/toolkits/generator.d.ts +8 -0
  120. package/dist/toolkits/generator.d.ts.map +1 -0
  121. package/dist/toolkits/generator.js +212 -0
  122. package/dist/toolkits/generator.js.map +1 -0
  123. package/dist/toolkits/reports.d.ts +2 -0
  124. package/dist/toolkits/reports.d.ts.map +1 -0
  125. package/dist/toolkits/reports.js +145 -0
  126. package/dist/toolkits/reports.js.map +1 -0
  127. package/dist/types.d.ts +41 -0
  128. package/dist/types.d.ts.map +1 -0
  129. package/dist/types.js +2 -0
  130. package/dist/types.js.map +1 -0
  131. package/dist/util.d.ts +16 -0
  132. package/dist/util.d.ts.map +1 -0
  133. package/dist/util.js +177 -0
  134. package/dist/util.js.map +1 -0
  135. package/dist/writer.d.ts +6 -0
  136. package/dist/writer.d.ts.map +1 -0
  137. package/dist/writer.js +3 -0
  138. package/dist/writer.js.map +1 -0
  139. package/dist/writers/assetWriter.d.ts +3 -0
  140. package/dist/writers/assetWriter.d.ts.map +1 -0
  141. package/dist/writers/assetWriter.js +19 -0
  142. package/dist/writers/assetWriter.js.map +1 -0
  143. package/dist/writers/index.d.ts +4 -0
  144. package/dist/writers/index.d.ts.map +1 -0
  145. package/dist/writers/index.js +18 -0
  146. package/dist/writers/index.js.map +1 -0
  147. package/dist/writers/react-native.d.ts +3 -0
  148. package/dist/writers/react-native.d.ts.map +1 -0
  149. package/dist/writers/react-native.js +19 -0
  150. package/dist/writers/react-native.js.map +1 -0
  151. package/dist/writers/types.d.ts +10 -0
  152. package/dist/writers/types.d.ts.map +1 -0
  153. package/dist/writers/types.js +2 -0
  154. package/dist/writers/types.js.map +1 -0
  155. package/dist/writers/unknown.d.ts +3 -0
  156. package/dist/writers/unknown.d.ts.map +1 -0
  157. package/dist/writers/unknown.js +9 -0
  158. package/dist/writers/unknown.js.map +1 -0
  159. package/dist/writers/web.d.ts +3 -0
  160. package/dist/writers/web.d.ts.map +1 -0
  161. package/dist/writers/web.js +23 -0
  162. package/dist/writers/web.js.map +1 -0
  163. package/package.json +41 -0
package/LICENSE ADDED
@@ -0,0 +1,7 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Mukthahar Shaik
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction...
package/README.md ADDED
@@ -0,0 +1,354 @@
1
+ # Assets Toolkit
2
+
3
+ > Generate clean, typed, production-ready asset maps for React Native, Expo, React, Next.js, and Vite projects.
4
+
5
+ ![npm](https://img.shields.io/npm/v/assets-toolkit?color=0f766e)
6
+ ![license](https://img.shields.io/npm/l/assets-toolkit?color=2563eb)
7
+ ![typescript](https://img.shields.io/badge/TypeScript-ready-3178c6)
8
+ ![platforms](https://img.shields.io/badge/platforms-RN%20%7C%20Expo%20%7C%20React%20%7C%20Next%20%7C%20Vite-7c3aed)
9
+
10
+ Assets Toolkit scans your project assets, validates them, detects duplicates and risky files, then generates a typed asset map you can import from your app code. It is built for teams that want asset access to feel boring in the best way: consistent names, stable imports, and fewer surprises during release.
11
+
12
+ ```txt
13
+ assets/ generated-assets/
14
+ logo.png ─────▶ index.ts
15
+ icons/search.svg images-generate.ts
16
+ fonts/Inter.ttf svg-generate.ts
17
+ fonts-generate.ts
18
+ ```
19
+
20
+ ## ✨ Why Use It?
21
+
22
+ - 🚀 Generate one tidy `Assets` object from images, SVGs, fonts, audio, video, and Lottie files.
23
+ - 🗂️ Keep nested folder structure in the generated output.
24
+ - 🧹 Detect duplicate files before they bloat your app.
25
+ - 🛡️ Catch invalid filenames before Metro, Vite, Next.js, or CI complains.
26
+ - 📊 Check large assets and platform support from one simple command.
27
+ - ♻️ Clean generated files and cache whenever you want a fresh build.
28
+
29
+ ## 📦 Installation
30
+
31
+ Install it as a development dependency:
32
+
33
+ ```sh
34
+ npm install --save-dev assets-toolkit
35
+ ```
36
+
37
+ Or run it directly with `npx`:
38
+
39
+ ```sh
40
+ npx assets-toolkit help
41
+ ```
42
+
43
+ ## ⚡ Quick Start
44
+
45
+ Put assets in one of the default folders:
46
+
47
+ ```txt
48
+ assets/
49
+ logo.png
50
+ home@2x.png
51
+ icons/
52
+ search.svg
53
+ fonts/
54
+ Inter.ttf
55
+ ```
56
+
57
+ Generate the asset files:
58
+
59
+ ```sh
60
+ npx assets-toolkit generate
61
+ ```
62
+
63
+ Import the generated output in your app:
64
+
65
+ ```ts
66
+ import { Assets, images, svg, fonts } from "./generated-assets";
67
+
68
+ const logo = Assets.images.logo;
69
+ const searchIcon = svg.icons.search;
70
+ const interFont = fonts.fonts.Inter;
71
+ ```
72
+
73
+ By default, Assets Toolkit looks in:
74
+
75
+ ```txt
76
+ ./src/assets
77
+ ./assets
78
+ ```
79
+
80
+ And writes generated files to:
81
+
82
+ ```txt
83
+ ./generated-assets
84
+ ```
85
+
86
+ ## 🧭 CLI Commands
87
+
88
+ | Command | Purpose |
89
+ | ----------------- | -------------------------------------------------------------- |
90
+ | `generate`, `-g` | Generate typed asset files. |
91
+ | `doctor` | Validate assets and detect common problems. |
92
+ | `doctor --fix` | Rename invalid files and remove duplicates after confirmation. |
93
+ | `reports` | Print asset statistics and project insights. |
94
+ | `clean`, `-c` | Remove generated files and cache. |
95
+ | `--version`, `-v` | Show installed package version. |
96
+ | `help`, `-h` | Show CLI help. |
97
+
98
+ ### `generate`
99
+
100
+ 🚀 Generate asset maps from your project assets.
101
+
102
+ ```sh
103
+ npx assets-toolkit generate
104
+ ```
105
+
106
+ Alias:
107
+
108
+ ```sh
109
+ npx assets-toolkit -g
110
+ ```
111
+
112
+ Useful options:
113
+
114
+ ```sh
115
+ npx assets-toolkit generate --outDir src/generated-assets
116
+ npx assets-toolkit generate -o src/generated-assets
117
+ npx assets-toolkit generate --assetsDir assets
118
+ npx assets-toolkit generate --assetsDirs assets,src/shared/assets
119
+ ```
120
+
121
+ What it does:
122
+
123
+ - Creates generated category files like `images-generate.ts`, `svg-generate.ts`, and `fonts-generate.ts`.
124
+ - Creates a generated `index.ts` that exports `Assets` plus each category.
125
+ - Preserves nested folders as nested object keys.
126
+ - Skips invalid asset filenames.
127
+ - Reports duplicate files and validation warnings.
128
+
129
+ ### `doctor`
130
+
131
+ 🩺 Inspect your asset setup and find issues before they become runtime problems.
132
+
133
+ ```sh
134
+ npx assets-toolkit doctor
135
+ ```
136
+
137
+ Checks include:
138
+
139
+ - Missing asset directories
140
+ - Invalid filenames
141
+ - Duplicate assets
142
+ - Unsupported platform assets
143
+ - Large files over the recommended threshold
144
+
145
+ ### `doctor --fix`
146
+
147
+ 🛠️ Preview and fix invalid asset filenames.
148
+
149
+ ```sh
150
+ npx assets-toolkit doctor --fix
151
+ ```
152
+
153
+ Skip the confirmation prompt when you want an automated cleanup:
154
+
155
+ ```sh
156
+ npx assets-toolkit doctor --fix --yes
157
+ ```
158
+
159
+ This command can:
160
+
161
+ - Rename invalid filenames into safe asset names.
162
+ - Avoid collisions with files that already exist.
163
+ - Remove duplicate asset files after confirmation.
164
+
165
+ ### `reports`
166
+
167
+ 📊 Show a project asset report.
168
+
169
+ ```sh
170
+ npx assets-toolkit reports
171
+ ```
172
+
173
+ The report includes:
174
+
175
+ - Current configuration
176
+ - Asset counts by category
177
+ - Storage usage
178
+ - Largest assets
179
+ - Extension breakdown
180
+ - Generated output status
181
+
182
+ ### `clean`
183
+
184
+ ♻️ Remove generated files and the Assets Toolkit cache.
185
+
186
+ ```sh
187
+ npx assets-toolkit clean
188
+ ```
189
+
190
+ Alias:
191
+
192
+ ```sh
193
+ npx assets-toolkit -c
194
+ ```
195
+
196
+ Use this when you want to regenerate from a clean state.
197
+
198
+ ### `--version`
199
+
200
+ 🏷️ Print the installed package version.
201
+
202
+ ```sh
203
+ npx assets-toolkit --version
204
+ npx assets-toolkit -v
205
+ ```
206
+
207
+ ### `help`
208
+
209
+ 💡 Show CLI help.
210
+
211
+ ```sh
212
+ npx assets-toolkit help
213
+ npx assets-toolkit -h
214
+ ```
215
+
216
+ ## ⚙️ Configuration
217
+
218
+ On first use, Assets Toolkit creates `assets-toolkit.config.json` if it does not already exist.
219
+
220
+ Default config:
221
+
222
+ ```json
223
+ {
224
+ "assets": ["./src/assets", "./assets"],
225
+ "output": "generated-assets",
226
+ "target": "auto",
227
+ "duplicates": "ignore"
228
+ }
229
+ ```
230
+
231
+ ### Config Options
232
+
233
+ | Option | Type | Description |
234
+ | ------------ | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
235
+ | `assets` | `string[]` | Asset directories to scan. |
236
+ | `output` | `string` | Directory where generated files are written. Must stay inside the project root. |
237
+ | `target` | `string` | Valid target value: `auto`, `react-native`, `expo`, `react`, `next`, `vite`, or `unknown`. The CLI auto-detects the active platform from package dependencies. |
238
+ | `duplicates` | `string` | Duplicate preference value: `ignore`, `warn`, or `error`. Duplicate files are surfaced by `generate`, `doctor`, and `doctor --fix`. |
239
+
240
+ Example:
241
+
242
+ ```json
243
+ {
244
+ "assets": ["./assets", "./src/shared/assets"],
245
+ "output": "src/generated-assets",
246
+ "target": "react-native",
247
+ "duplicates": "warn"
248
+ }
249
+ ```
250
+
251
+ ## 🧩 Supported Assets
252
+
253
+ | Category | Extensions |
254
+ | -------- | ---------------------------------------------------------------------------------------------------- |
255
+ | Images | `.png`, `.jpg`, `.jpeg`, `.gif`, `.webp`, `.bmp`, `.heic`, `.heif`, `.avif`, `.tiff`, `.tif`, `.ico` |
256
+ | SVG | `.svg` |
257
+ | Fonts | `.ttf`, `.otf`, `.woff`, `.woff2` |
258
+ | Audio | `.mp3`, `.wav`, `.aac`, `.m4a`, `.ogg`, `.flac`, `.amr`, `.opus`, `.caf`, `.aiff` |
259
+ | Video | `.mp4`, `.mov`, `.m4v`, `.avi`, `.mkv`, `.webm`, `.3gp`, `.mpeg`, `.mpg` |
260
+ | Lottie | `.lottie`, plus valid Lottie `.json` files |
261
+
262
+ ## ✅ Filename Rules
263
+
264
+ Use simple, portable filenames:
265
+
266
+ ```txt
267
+ logo.png
268
+ logo-dark.svg
269
+ home@2x.png
270
+ home@3x.png
271
+ Inter.ttf
272
+ ```
273
+
274
+ Avoid:
275
+
276
+ ```txt
277
+ bad name.png
278
+ bad!name.svg
279
+ logo.PNG
280
+ ___.png
281
+ ```
282
+
283
+ Safe filenames make generated keys cleaner and reduce cross-platform build issues.
284
+
285
+ ## 🏗️ Generated Output
286
+
287
+ After running `generate`, you will get output similar to:
288
+
289
+ ```txt
290
+ generated-assets/
291
+ index.ts
292
+ images-generate.ts
293
+ svg-generate.ts
294
+ fonts-generate.ts
295
+ audio-generate.ts
296
+ video-generate.ts
297
+ lottie-generate.ts
298
+ ```
299
+
300
+ Example generated shape:
301
+
302
+ ```ts
303
+ export const Assets = {
304
+ images,
305
+ svg,
306
+ fonts,
307
+ audio,
308
+ video,
309
+ lottie,
310
+ } as const;
311
+ ```
312
+
313
+ Nested folders become nested object keys, so your file layout stays readable in code.
314
+
315
+ ## 🧪 Recommended Workflow
316
+
317
+ Add these scripts to your project:
318
+
319
+ ```json
320
+ {
321
+ "scripts": {
322
+ "assets": "assets-toolkit generate",
323
+ "assets:check": "assets-toolkit doctor",
324
+ "assets:fix": "assets-toolkit doctor --fix",
325
+ "assets:report": "assets-toolkit reports",
326
+ "assets:clean": "assets-toolkit clean"
327
+ }
328
+ }
329
+ ```
330
+
331
+ Then run:
332
+
333
+ ```sh
334
+ npm run assets:check
335
+ npm run assets
336
+ ```
337
+
338
+ For CI, a simple check is often enough:
339
+
340
+ ```sh
341
+ npx assets-toolkit doctor
342
+ ```
343
+
344
+ ## 💎 Practical Tips
345
+
346
+ - 📁 Keep app assets in `assets` or `src/assets` for zero-config usage.
347
+ - 🧪 Run `doctor` before release builds to catch large, duplicate, or unsupported files.
348
+ - 🛠️ Use `doctor --fix` when designers or teammates add files with spaces or special characters.
349
+ - 📌 Commit generated assets only if your team wants stable generated files in source control.
350
+ - ♻️ Run `clean` when switching branches if generated output looks stale.
351
+
352
+ ## 📄 License
353
+
354
+ This project is licensed under the [MIT License](LICENSE).
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cacheHelper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cacheHelper.d.ts","sourceRoot":"","sources":["../src/cacheHelper.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cacheHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cacheHelper.js","sourceRoot":"","sources":["../src/cacheHelper.ts"],"names":[],"mappings":""}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,91 @@
1
+ #!/usr/bin/env node
2
+ import { runClean } from "./toolkits/clean.js";
3
+ import { runDoctor } from "./toolkits/doctor.js";
4
+ import { generateAssets } from "./toolkits/generator.js";
5
+ import { runReport } from "./toolkits/reports.js";
6
+ import packageJson from "../package.json" with { type: "json" };
7
+ import { runDoctorFix } from "./toolkits/doctorFix.js";
8
+ import { colorText } from "./colorConsole.js";
9
+ import { printHelp } from "./helps/printHelp.js";
10
+ function parseArguments() {
11
+ const argv = process.argv.slice(2);
12
+ const result = {
13
+ command: "",
14
+ options: {},
15
+ };
16
+ if (argv.length === 0) {
17
+ return result;
18
+ }
19
+ result.command = argv[0] ?? "";
20
+ for (let index = 1; index < argv.length; index += 1) {
21
+ const arg = argv[index];
22
+ const nextArg = argv[index + 1];
23
+ if (arg === "--outDir" || arg === "-o") {
24
+ if (typeof nextArg === "string") {
25
+ result.options.outputDir = nextArg;
26
+ }
27
+ index += 1;
28
+ }
29
+ else if (arg === "--assetsDir") {
30
+ if (typeof nextArg === "string") {
31
+ result.options.assetDirectories = [nextArg];
32
+ }
33
+ index += 1;
34
+ }
35
+ else if (arg === "--assetsDirs") {
36
+ if (typeof nextArg === "string") {
37
+ result.options.assetDirectories = nextArg
38
+ .split(",")
39
+ .map((dir) => dir.trim());
40
+ }
41
+ index += 1;
42
+ }
43
+ else if (arg === "--fix") {
44
+ result.options.fix = true;
45
+ }
46
+ else if (arg === "--yes") {
47
+ result.options.yes = true;
48
+ }
49
+ }
50
+ return result;
51
+ }
52
+ const { command, options } = parseArguments();
53
+ if (command === "generate" || command === "-g") {
54
+ try {
55
+ generateAssets({
56
+ outputDir: options.outputDir,
57
+ assetDirectories: options.assetDirectories,
58
+ });
59
+ }
60
+ catch (error) {
61
+ console.error(error instanceof Error ? error.message : String(error));
62
+ process.exit(1);
63
+ }
64
+ }
65
+ else if (command === "reports") {
66
+ runReport();
67
+ }
68
+ else if (command === "doctor") {
69
+ if (options.fix) {
70
+ await runDoctorFix(process.cwd(), {
71
+ yes: options.yes,
72
+ });
73
+ }
74
+ else {
75
+ await runDoctor(process.cwd());
76
+ }
77
+ }
78
+ else if (command === "clean" || command === "-c") {
79
+ runClean();
80
+ }
81
+ else if (command === "help" || command === "-h") {
82
+ printHelp();
83
+ }
84
+ else if (command === "--version" || command === "-v") {
85
+ console.log(packageJson.version);
86
+ }
87
+ else {
88
+ console.log(colorText("info", 'Unknown command. Run "assets-toolkit --help" to see available commands.'));
89
+ process.exit(1);
90
+ }
91
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export type ColorType = "success" | "warning" | "error" | "info" | "title" | "muted" | "command";
2
+ export declare function colorText(type: ColorType, message: string): string;
3
+ //# sourceMappingURL=colorConsole.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colorConsole.d.ts","sourceRoot":"","sources":["../src/colorConsole.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GACjB,SAAS,GACT,SAAS,GACT,OAAO,GACP,MAAM,GACN,OAAO,GACP,OAAO,GACP,SAAS,CAAC;AAEd,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CA0BlE"}
@@ -0,0 +1,22 @@
1
+ import pc from "picocolors";
2
+ export function colorText(type, message) {
3
+ switch (type) {
4
+ case "success":
5
+ return pc.green(message);
6
+ case "warning":
7
+ return pc.yellow(message);
8
+ case "error":
9
+ return pc.red(message);
10
+ case "info":
11
+ return pc.cyan(message);
12
+ case "title":
13
+ return pc.bold(pc.cyan(message));
14
+ case "muted":
15
+ return pc.gray(message);
16
+ case "command":
17
+ return pc.blue(message);
18
+ default:
19
+ return message;
20
+ }
21
+ }
22
+ //# sourceMappingURL=colorConsole.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colorConsole.js","sourceRoot":"","sources":["../src/colorConsole.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAW5B,MAAM,UAAU,SAAS,CAAC,IAAe,EAAE,OAAe;IACxD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAE3B,KAAK,SAAS;YACZ,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAE5B,KAAK,OAAO;YACV,OAAO,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAEzB,KAAK,MAAM;YACT,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE1B,KAAK,OAAO;YACV,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAEnC,KAAK,OAAO;YACV,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE1B,KAAK,SAAS;YACZ,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE1B;YACE,OAAO,OAAO,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-types.d.ts","sourceRoot":"","sources":["../src/config-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-types.js","sourceRoot":"","sources":["../src/config-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import type { AssetsToolkitConfig } from "./types.js";
2
+ export declare const defaultConfig: Required<AssetsToolkitConfig>;
3
+ export declare function createDefaultConfig(root: string): void;
4
+ export declare function loadConfig(root: string): AssetsToolkitConfig;
5
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAMtD,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,mBAAmB,CAKvD,CAAC;AAMF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAStD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAgC5D"}
package/dist/config.js ADDED
@@ -0,0 +1,82 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { ensureGitIgnore } from "./helps/gitignore.js";
4
+ import { colorText } from "./colorConsole.js";
5
+ const CONFIG_FILE = "assets-toolkit.config.json";
6
+ export const defaultConfig = {
7
+ assets: ["./src/assets", "./assets"],
8
+ output: "generated-assets",
9
+ target: "auto",
10
+ duplicates: "ignore",
11
+ };
12
+ function getConfigPath(root) {
13
+ return path.join(root, CONFIG_FILE);
14
+ }
15
+ export function createDefaultConfig(root) {
16
+ const configPath = getConfigPath(root);
17
+ if (fs.existsSync(configPath)) {
18
+ return;
19
+ }
20
+ fs.writeFileSync(configPath, JSON.stringify(defaultConfig, null, 2), "utf8");
21
+ ensureGitIgnore(root);
22
+ console.log(colorText("success", "✓ Created assets-toolkit.config.json"));
23
+ }
24
+ export function loadConfig(root) {
25
+ const configPath = getConfigPath(root);
26
+ // First run
27
+ if (!fs.existsSync(configPath)) {
28
+ createDefaultConfig(root);
29
+ return defaultConfig;
30
+ }
31
+ try {
32
+ const content = fs.readFileSync(configPath, "utf8");
33
+ const userConfig = JSON.parse(content);
34
+ updateConfigWithDefaults(configPath, userConfig);
35
+ const config = {
36
+ ...defaultConfig,
37
+ ...userConfig,
38
+ };
39
+ validateConfig(config);
40
+ return config;
41
+ }
42
+ catch (error) {
43
+ throw new Error(`Invalid assets-toolkit.config.json: ${error instanceof Error ? error.message : String(error)}`);
44
+ }
45
+ }
46
+ function validateConfig(config) {
47
+ if (!Array.isArray(config.assets)) {
48
+ throw new Error(`"assets" must be an array`);
49
+ }
50
+ if (typeof config.output !== "string") {
51
+ throw new Error(`"output" must be a string`);
52
+ }
53
+ const validTargets = [
54
+ "auto",
55
+ "react-native",
56
+ "expo",
57
+ "react",
58
+ "next",
59
+ "vite",
60
+ "unknown",
61
+ ];
62
+ if (!validTargets.includes(config.target)) {
63
+ throw new Error(`Invalid target "${config.target}"`);
64
+ }
65
+ const validDuplicates = ["ignore", "warn", "error"];
66
+ if (!validDuplicates.includes(config.duplicates)) {
67
+ throw new Error(`Invalid duplicates option "${config.duplicates}"`);
68
+ }
69
+ }
70
+ function updateConfigWithDefaults(configPath, userConfig) {
71
+ const mergedConfig = {
72
+ ...defaultConfig,
73
+ ...userConfig,
74
+ };
75
+ const missingKeys = Object.keys(defaultConfig).filter((key) => !(key in userConfig));
76
+ if (missingKeys.length === 0) {
77
+ return;
78
+ }
79
+ fs.writeFileSync(configPath, JSON.stringify(mergedConfig, null, 2), "utf8");
80
+ console.log(colorText("success", `✓ Updated assets-toolkit.config.json (${missingKeys.join(", ")})`));
81
+ }
82
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { AssetCategory } from "./types.js";
2
+ export declare const categoryExtensions: Record<AssetCategory, string[]>;
3
+ export declare const SUPPORTED_EXTENSIONS: Set<string>;
4
+ export declare const VALID_FILE_NAME: RegExp;
5
+ export declare const INVALID_FILE_NAME_REASONS: {
6
+ readonly EMPTY: "Empty filename";
7
+ readonly ONLY_UNDERSCORES: "Filename contains only underscores";
8
+ readonly STARTS_WITH_NUMBER: "Filename starts with a number";
9
+ readonly INVALID_CHARACTERS: "Filename contains invalid characters";
10
+ readonly UPPERCASE_EXTENSION: "Uppercase extension";
11
+ };
12
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,EAAE,CAyC9D,CAAC;AAEF,eAAO,MAAM,oBAAoB,aAEhC,CAAC;AAEF,eAAO,MAAM,eAAe,QAC0B,CAAC;AAEvD,eAAO,MAAM,yBAAyB;aACpC,KAAK,EAAE,gBAAgB;aACvB,gBAAgB,EAAE,oCAAoC;aACtD,kBAAkB,EAAE,+BAA+B;aACnD,kBAAkB,EAAE,sCAAsC;aAC1D,mBAAmB,EAAE,qBAAqB;CAClC,CAAC"}