vectify 2.0.4 → 2.1.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 (46) hide show
  1. package/dist/{chunk-GY4VNET5.mjs → chunk-5RWOYQAG.mjs} +87 -47
  2. package/dist/cli.js +87 -47
  3. package/dist/cli.mjs +1 -1
  4. package/dist/index.d.mts +1 -1
  5. package/dist/index.d.ts +1 -1
  6. package/dist/index.js +87 -47
  7. package/dist/index.mjs +1 -1
  8. package/dist/templates/angular/component.ts.hbs +11 -2
  9. package/dist/templates/angular/createIcon.ts.hbs +11 -2
  10. package/dist/templates/astro/component.astro.hbs +12 -2
  11. package/dist/templates/astro/createIcon.astro.hbs +12 -2
  12. package/dist/templates/lit/component.js.hbs +1 -0
  13. package/dist/templates/lit/component.ts.hbs +1 -0
  14. package/dist/templates/lit/createIcon.js.hbs +12 -2
  15. package/dist/templates/lit/createIcon.ts.hbs +12 -2
  16. package/dist/templates/preact/component.jsx.hbs +1 -1
  17. package/dist/templates/preact/component.tsx.hbs +1 -1
  18. package/dist/templates/preact/createIcon.jsx.hbs +12 -3
  19. package/dist/templates/preact/createIcon.tsx.hbs +13 -3
  20. package/dist/templates/qwik/component.jsx.hbs +1 -1
  21. package/dist/templates/qwik/component.tsx.hbs +1 -1
  22. package/dist/templates/qwik/createIcon.jsx.hbs +12 -3
  23. package/dist/templates/qwik/createIcon.tsx.hbs +13 -3
  24. package/dist/templates/react/component.jsx.hbs +1 -1
  25. package/dist/templates/react/component.tsx.hbs +1 -1
  26. package/dist/templates/react/createIcon.jsx.hbs +12 -3
  27. package/dist/templates/react/createIcon.tsx.hbs +13 -3
  28. package/dist/templates/solid/component.tsx.hbs +1 -1
  29. package/dist/templates/solid/createIcon.jsx.hbs +13 -3
  30. package/dist/templates/solid/createIcon.tsx.hbs +14 -3
  31. package/dist/templates/svelte/component.js.svelte.hbs +4 -1
  32. package/dist/templates/svelte/component.ts.svelte.hbs +4 -1
  33. package/dist/templates/svelte/icon.js.svelte.hbs +23 -2
  34. package/dist/templates/svelte/icon.ts.svelte.hbs +23 -2
  35. package/dist/templates/vanilla/component.ts.hbs +1 -1
  36. package/dist/templates/vanilla/createIcon.js.hbs +12 -3
  37. package/dist/templates/vanilla/createIcon.ts.hbs +13 -3
  38. package/dist/templates/vue/component.js.vue.hbs +5 -2
  39. package/dist/templates/vue/component.ts.vue.hbs +5 -2
  40. package/dist/templates/vue/icon.js.vue.hbs +26 -2
  41. package/dist/templates/vue/icon.ts.vue.hbs +26 -2
  42. package/dist/templates/vue2/component.js.vue.hbs +4 -2
  43. package/dist/templates/vue2/component.ts.vue.hbs +5 -2
  44. package/dist/templates/vue2/icon.js.vue.hbs +52 -25
  45. package/dist/templates/vue2/icon.ts.vue.hbs +53 -26
  46. package/package.json +1 -1
@@ -28,6 +28,7 @@ function parseSvg(svgContent) {
28
28
  if (svgElement.length === 0) {
29
29
  throw new Error("Invalid SVG: No <svg> tag found");
30
30
  }
31
+ const viewBox = svgElement.attr("viewBox") || "0 0 24 24";
31
32
  const iconNodes = [];
32
33
  svgElement.children().each((_, element) => {
33
34
  const node = parseElement($, element);
@@ -35,7 +36,29 @@ function parseSvg(svgContent) {
35
36
  iconNodes.push(node);
36
37
  }
37
38
  });
38
- return iconNodes;
39
+ const isMultiColor = detectMultiColor(iconNodes);
40
+ return { iconNodes, viewBox, isMultiColor };
41
+ }
42
+ function detectMultiColor(nodes) {
43
+ const colors = /* @__PURE__ */ new Set();
44
+ function collectColors(node) {
45
+ const [, attrs, children] = node;
46
+ if (attrs.fill && attrs.fill !== "none" && attrs.fill !== "transparent") {
47
+ colors.add(String(attrs.fill).toLowerCase());
48
+ }
49
+ if (attrs.stroke && attrs.stroke !== "none" && attrs.stroke !== "transparent") {
50
+ colors.add(String(attrs.stroke).toLowerCase());
51
+ }
52
+ if (children && children.length > 0) {
53
+ children.forEach(collectColors);
54
+ }
55
+ }
56
+ nodes.forEach(collectColors);
57
+ const realColors = Array.from(colors).filter((color) => {
58
+ const c = color.toLowerCase();
59
+ return c !== "currentcolor";
60
+ });
61
+ return realColors.length >= 2;
39
62
  }
40
63
  function parseElement($, element) {
41
64
  if (element.type !== "tag") {
@@ -164,14 +187,15 @@ function getQwikTemplatePath(typescript, type) {
164
187
  function getAngularTemplatePath(type) {
165
188
  return `angular/${type}.ts.hbs`;
166
189
  }
167
- function generateAngularComponent(componentName, iconNode, typescript, keepColors = false) {
190
+ function generateAngularComponent(componentName, iconNode, typescript, keepColors = false, viewBox = "0 0 24 24") {
168
191
  const formattedNodes = iconNode.map((node) => formatIconNode(node, 2)).join(",\n");
169
192
  const templatePath = getAngularTemplatePath("component");
170
193
  return renderTemplate(templatePath, {
171
194
  componentName,
172
195
  formattedNodes,
173
196
  typescript,
174
- keepColors
197
+ keepColors,
198
+ viewBox
175
199
  });
176
200
  }
177
201
  function generateAngularBaseComponent(typescript) {
@@ -186,14 +210,15 @@ function generateAngularBaseComponent(typescript) {
186
210
  function getAstroTemplatePath(type) {
187
211
  return `astro/${type}.astro.hbs`;
188
212
  }
189
- function generateAstroComponent(componentName, iconNode, typescript, keepColors = false) {
213
+ function generateAstroComponent(componentName, iconNode, typescript, keepColors = false, viewBox = "0 0 24 24") {
190
214
  const formattedNodes = iconNode.map((node) => formatIconNode(node, 2)).join(",\n");
191
215
  const templatePath = getAstroTemplatePath("component");
192
216
  return renderTemplate(templatePath, {
193
217
  componentName,
194
218
  formattedNodes,
195
219
  typescript,
196
- keepColors
220
+ keepColors,
221
+ viewBox
197
222
  });
198
223
  }
199
224
  function generateAstroBaseComponent(typescript) {
@@ -209,14 +234,15 @@ function getLitTemplatePath(typescript, type) {
209
234
  const ext = typescript ? "ts" : "js";
210
235
  return `lit/${type}.${ext}.hbs`;
211
236
  }
212
- function generateLitComponent(componentName, iconNode, typescript, keepColors = false) {
237
+ function generateLitComponent(componentName, iconNode, typescript, keepColors = false, viewBox = "0 0 24 24") {
213
238
  const formattedNodes = iconNode.map((node) => formatIconNode(node, 2)).join(",\n");
214
239
  const templatePath = getLitTemplatePath(typescript, "component");
215
240
  return renderTemplate(templatePath, {
216
241
  componentName,
217
242
  formattedNodes,
218
243
  typescript,
219
- keepColors
244
+ keepColors,
245
+ viewBox
220
246
  });
221
247
  }
222
248
  function generateLitBaseComponent(typescript) {
@@ -228,14 +254,15 @@ function generateLitBaseComponent(typescript) {
228
254
  }
229
255
 
230
256
  // src/generators/react.ts
231
- function generateReactComponent(componentName, iconNode, typescript, keepColors = false) {
257
+ function generateReactComponent(componentName, iconNode, typescript, keepColors = false, viewBox = "0 0 24 24") {
232
258
  const formattedNodes = iconNode.map((node) => formatIconNode(node, 2)).join(",\n");
233
259
  const templatePath = getReactTemplatePath(typescript, "component");
234
260
  return renderTemplate(templatePath, {
235
261
  typescript,
236
262
  componentName,
237
263
  formattedNodes,
238
- keepColors
264
+ keepColors,
265
+ viewBox
239
266
  });
240
267
  }
241
268
  function generateCreateIcon(typescript) {
@@ -244,7 +271,7 @@ function generateCreateIcon(typescript) {
244
271
  }
245
272
 
246
273
  // src/generators/react-like.ts
247
- function generateReactLikeComponent(componentName, iconNode, typescript, keepColors, framework) {
274
+ function generateReactLikeComponent(componentName, iconNode, typescript, keepColors, viewBox, framework) {
248
275
  const formattedNodes = iconNode.map((node) => formatIconNode(node, 2)).join(",\n");
249
276
  let templatePath;
250
277
  if (framework === "solid") {
@@ -260,7 +287,8 @@ function generateReactLikeComponent(componentName, iconNode, typescript, keepCol
260
287
  componentName,
261
288
  formattedNodes,
262
289
  typescript,
263
- keepColors
290
+ keepColors,
291
+ viewBox
264
292
  });
265
293
  }
266
294
  function generateReactLikeBaseComponent(typescript, framework) {
@@ -281,12 +309,14 @@ function generateReactLikeBaseComponent(typescript, framework) {
281
309
  }
282
310
 
283
311
  // src/generators/svelte.ts
284
- function generateSvelteComponent(_componentName, iconNode, typescript) {
312
+ function generateSvelteComponent(_componentName, iconNode, typescript, keepColors = false, viewBox = "0 0 24 24") {
285
313
  const formattedNodes = iconNode.map((node) => formatIconNode(node, 4)).join(",\n");
286
314
  const templatePath = getSvelteTemplatePath(typescript, "component");
287
315
  return renderTemplate(templatePath, {
288
316
  typescript,
289
- formattedNodes
317
+ formattedNodes,
318
+ keepColors,
319
+ viewBox
290
320
  });
291
321
  }
292
322
  function generateSvelteIcon(typescript) {
@@ -295,14 +325,15 @@ function generateSvelteIcon(typescript) {
295
325
  }
296
326
 
297
327
  // src/generators/vanilla.ts
298
- function generateVanillaComponent(componentName, iconNode, typescript, keepColors) {
328
+ function generateVanillaComponent(componentName, iconNode, typescript, keepColors, viewBox) {
299
329
  const formattedNodes = iconNode.map((node) => formatIconNode(node, 2)).join(",\n");
300
330
  const templatePath = getVanillaTemplatePath(typescript, "component");
301
331
  return renderTemplate(templatePath, {
302
332
  componentName,
303
333
  formattedNodes,
304
334
  typescript,
305
- keepColors
335
+ keepColors,
336
+ viewBox
306
337
  });
307
338
  }
308
339
  function generateVanillaBaseComponent(typescript) {
@@ -314,13 +345,15 @@ function generateVanillaBaseComponent(typescript) {
314
345
  }
315
346
 
316
347
  // src/generators/vue.ts
317
- function generateVueComponent(componentName, iconNode, typescript) {
348
+ function generateVueComponent(componentName, iconNode, typescript, keepColors = false, viewBox = "0 0 24 24") {
318
349
  const formattedNodes = iconNode.map((node) => formatIconNode(node, 4)).join(",\n");
319
350
  const templatePath = getVueTemplatePath(typescript, "component");
320
351
  return renderTemplate(templatePath, {
321
352
  typescript,
322
353
  componentName,
323
- formattedNodes
354
+ formattedNodes,
355
+ keepColors,
356
+ viewBox
324
357
  });
325
358
  }
326
359
  function generateVueIcon(typescript) {
@@ -329,13 +362,15 @@ function generateVueIcon(typescript) {
329
362
  }
330
363
 
331
364
  // src/generators/vue2.ts
332
- function generateVue2Component(componentName, iconNode, typescript) {
365
+ function generateVue2Component(componentName, iconNode, typescript, keepColors = false, viewBox = "0 0 24 24") {
333
366
  const formattedNodes = iconNode.map((node) => formatIconNode(node, 4)).join(",\n");
334
367
  const templatePath = getVue2TemplatePath(typescript, "component");
335
368
  return renderTemplate(templatePath, {
336
369
  typescript,
337
370
  componentName,
338
- formattedNodes
371
+ formattedNodes,
372
+ keepColors,
373
+ viewBox
339
374
  });
340
375
  }
341
376
  function generateVue2Icon(typescript) {
@@ -353,8 +388,8 @@ var ReactStrategy = class {
353
388
  this.getIndexExtension = (typescript) => {
354
389
  return typescript ? "ts" : "js";
355
390
  };
356
- this.generateComponent = (componentName, iconNode, typescript, keepColors = false) => {
357
- return generateReactComponent(componentName, iconNode, typescript, keepColors);
391
+ this.generateComponent = (componentName, iconNode, typescript, keepColors = false, viewBox = "0 0 24 24") => {
392
+ return generateReactComponent(componentName, iconNode, typescript, keepColors, viewBox);
358
393
  };
359
394
  this.generateBaseComponent = (typescript) => {
360
395
  return {
@@ -373,8 +408,8 @@ var VueStrategy = class {
373
408
  this.getIndexExtension = (typescript) => {
374
409
  return typescript ? "ts" : "js";
375
410
  };
376
- this.generateComponent = (componentName, iconNode, typescript) => {
377
- return generateVueComponent(componentName, iconNode, typescript);
411
+ this.generateComponent = (componentName, iconNode, typescript, keepColors = false, viewBox = "0 0 24 24") => {
412
+ return generateVueComponent(componentName, iconNode, typescript, keepColors, viewBox);
378
413
  };
379
414
  this.generateBaseComponent = (typescript) => {
380
415
  return {
@@ -393,8 +428,8 @@ var Vue2Strategy = class {
393
428
  this.getIndexExtension = (typescript) => {
394
429
  return typescript ? "ts" : "js";
395
430
  };
396
- this.generateComponent = (componentName, iconNode, typescript) => {
397
- return generateVue2Component(componentName, iconNode, typescript);
431
+ this.generateComponent = (componentName, iconNode, typescript, keepColors = false, viewBox = "0 0 24 24") => {
432
+ return generateVue2Component(componentName, iconNode, typescript, keepColors, viewBox);
398
433
  };
399
434
  this.generateBaseComponent = (typescript) => {
400
435
  return {
@@ -413,8 +448,8 @@ var SvelteStrategy = class {
413
448
  this.getIndexExtension = (typescript) => {
414
449
  return typescript ? "ts" : "js";
415
450
  };
416
- this.generateComponent = (componentName, iconNode, typescript) => {
417
- return generateSvelteComponent(componentName, iconNode, typescript);
451
+ this.generateComponent = (componentName, iconNode, typescript, keepColors = false, viewBox = "0 0 24 24") => {
452
+ return generateSvelteComponent(componentName, iconNode, typescript, keepColors, viewBox);
418
453
  };
419
454
  this.generateBaseComponent = (typescript) => {
420
455
  return {
@@ -433,8 +468,8 @@ var SolidStrategy = class {
433
468
  this.getIndexExtension = (typescript) => {
434
469
  return typescript ? "ts" : "js";
435
470
  };
436
- this.generateComponent = (componentName, iconNode, typescript, keepColors) => {
437
- return generateReactLikeComponent(componentName, iconNode, typescript, keepColors ?? false, "solid");
471
+ this.generateComponent = (componentName, iconNode, typescript, keepColors, viewBox) => {
472
+ return generateReactLikeComponent(componentName, iconNode, typescript, keepColors ?? false, viewBox ?? "0 0 24 24", "solid");
438
473
  };
439
474
  this.generateBaseComponent = (typescript) => {
440
475
  return generateReactLikeBaseComponent(typescript, "solid");
@@ -450,8 +485,8 @@ var PreactStrategy = class {
450
485
  this.getIndexExtension = (typescript) => {
451
486
  return typescript ? "ts" : "js";
452
487
  };
453
- this.generateComponent = (componentName, iconNode, typescript, keepColors) => {
454
- return generateReactLikeComponent(componentName, iconNode, typescript, keepColors ?? false, "preact");
488
+ this.generateComponent = (componentName, iconNode, typescript, keepColors, viewBox) => {
489
+ return generateReactLikeComponent(componentName, iconNode, typescript, keepColors ?? false, viewBox ?? "0 0 24 24", "preact");
455
490
  };
456
491
  this.generateBaseComponent = (typescript) => {
457
492
  return generateReactLikeBaseComponent(typescript, "preact");
@@ -467,8 +502,8 @@ var VanillaStrategy = class {
467
502
  this.getIndexExtension = (typescript) => {
468
503
  return typescript ? "ts" : "js";
469
504
  };
470
- this.generateComponent = (componentName, iconNode, typescript, keepColors) => {
471
- return generateVanillaComponent(componentName, iconNode, typescript, keepColors ?? false);
505
+ this.generateComponent = (componentName, iconNode, typescript, keepColors, viewBox) => {
506
+ return generateVanillaComponent(componentName, iconNode, typescript, keepColors ?? false, viewBox ?? "0 0 24 24");
472
507
  };
473
508
  this.generateBaseComponent = (typescript) => {
474
509
  return generateVanillaBaseComponent(typescript);
@@ -484,8 +519,8 @@ var LitStrategy = class {
484
519
  this.getIndexExtension = (typescript) => {
485
520
  return typescript ? "ts" : "js";
486
521
  };
487
- this.generateComponent = (componentName, iconNode, typescript, keepColors) => {
488
- return generateLitComponent(componentName, iconNode, typescript, keepColors ?? false);
522
+ this.generateComponent = (componentName, iconNode, typescript, keepColors, viewBox) => {
523
+ return generateLitComponent(componentName, iconNode, typescript, keepColors ?? false, viewBox ?? "0 0 24 24");
489
524
  };
490
525
  this.generateBaseComponent = (typescript) => {
491
526
  return generateLitBaseComponent(typescript);
@@ -501,8 +536,8 @@ var QwikStrategy = class {
501
536
  this.getIndexExtension = (typescript) => {
502
537
  return typescript ? "ts" : "js";
503
538
  };
504
- this.generateComponent = (componentName, iconNode, typescript, keepColors) => {
505
- return generateReactLikeComponent(componentName, iconNode, typescript, keepColors ?? false, "qwik");
539
+ this.generateComponent = (componentName, iconNode, typescript, keepColors, viewBox) => {
540
+ return generateReactLikeComponent(componentName, iconNode, typescript, keepColors ?? false, viewBox ?? "0 0 24 24", "qwik");
506
541
  };
507
542
  this.generateBaseComponent = (typescript) => {
508
543
  return generateReactLikeBaseComponent(typescript, "qwik");
@@ -518,8 +553,8 @@ var AstroStrategy = class {
518
553
  this.getIndexExtension = (typescript) => {
519
554
  return typescript ? "ts" : "js";
520
555
  };
521
- this.generateComponent = (componentName, iconNode, typescript, keepColors) => {
522
- return generateAstroComponent(componentName, iconNode, typescript, keepColors ?? false);
556
+ this.generateComponent = (componentName, iconNode, typescript, keepColors, viewBox) => {
557
+ return generateAstroComponent(componentName, iconNode, typescript, keepColors ?? false, viewBox ?? "0 0 24 24");
523
558
  };
524
559
  this.generateBaseComponent = (typescript) => {
525
560
  return generateAstroBaseComponent(typescript);
@@ -535,8 +570,8 @@ var AngularStrategy = class {
535
570
  this.getIndexExtension = (_typescript) => {
536
571
  return "ts";
537
572
  };
538
- this.generateComponent = (componentName, iconNode, typescript, keepColors) => {
539
- return generateAngularComponent(componentName, iconNode, typescript, keepColors ?? false);
573
+ this.generateComponent = (componentName, iconNode, typescript, keepColors, viewBox) => {
574
+ return generateAngularComponent(componentName, iconNode, typescript, keepColors ?? false, viewBox ?? "0 0 24 24");
540
575
  };
541
576
  this.generateBaseComponent = (typescript) => {
542
577
  return generateAngularBaseComponent(typescript);
@@ -601,7 +636,6 @@ var DEFAULT_CONFIG = {
601
636
  output: "./src/icons",
602
637
  typescript: true,
603
638
  optimize: true,
604
- keepColors: false,
605
639
  prefix: "",
606
640
  suffix: "",
607
641
  configDir: ".",
@@ -870,8 +904,9 @@ async function generateIconComponent(svgFile, config, dryRun = false) {
870
904
  if (config.hooks?.beforeParse) {
871
905
  svgContent = await config.hooks.beforeParse(svgContent, fileName);
872
906
  }
907
+ const { isMultiColor: isMultiColorBeforeOptimization } = parseSvg(svgContent);
873
908
  svgContent = await optimizeSvg(svgContent, config);
874
- const iconNode = parseSvg(svgContent);
909
+ const { iconNodes, viewBox } = parseSvg(svgContent);
875
910
  const componentName = getComponentName(
876
911
  fileName,
877
912
  config.prefix,
@@ -880,11 +915,13 @@ async function generateIconComponent(svgFile, config, dryRun = false) {
880
915
  );
881
916
  const strategy = getFrameworkStrategy(config.framework);
882
917
  const typescript = config.typescript ?? true;
918
+ const keepColors = config.keepColors !== void 0 ? config.keepColors : isMultiColorBeforeOptimization;
883
919
  let code = strategy.generateComponent(
884
920
  componentName,
885
- iconNode,
921
+ iconNodes,
886
922
  typescript,
887
- config.keepColors ?? false
923
+ keepColors,
924
+ viewBox
888
925
  );
889
926
  if (config.hooks?.afterGenerate) {
890
927
  code = await config.hooks.afterGenerate(code, componentName);
@@ -912,7 +949,9 @@ async function generateIndexFile(svgFiles, config, dryRun = false) {
912
949
  const typescript = config.typescript ?? true;
913
950
  const strategy = getFrameworkStrategy(config.framework);
914
951
  const ext = strategy.getIndexExtension(typescript);
952
+ const componentExt = strategy.getComponentExtension(typescript);
915
953
  const usesDefaultExport = ["vue", "vue2", "svelte", "react", "preact"].includes(config.framework);
954
+ const needsExtension = ["vue", "vue2", "svelte"].includes(config.framework);
916
955
  const exports = svgFiles.map((svgFile) => {
917
956
  const fileName = path4.basename(svgFile);
918
957
  const componentName = getComponentName(
@@ -921,10 +960,11 @@ async function generateIndexFile(svgFiles, config, dryRun = false) {
921
960
  config.suffix,
922
961
  config.transform
923
962
  );
963
+ const importPath = needsExtension ? `./${componentName}.${componentExt}` : `./${componentName}`;
924
964
  if (usesDefaultExport) {
925
- return `export { default as ${componentName} } from './${componentName}'`;
965
+ return `export { default as ${componentName} } from '${importPath}'`;
926
966
  } else {
927
- return `export { ${componentName} } from './${componentName}'`;
967
+ return `export { ${componentName} } from '${importPath}'`;
928
968
  }
929
969
  }).join("\n");
930
970
  const indexPath = path4.join(config.output, `index.${ext}`);