svgfusion 1.2.1 → 1.4.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.
- package/README.md +34 -0
- package/dist/cli.js +78 -57
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -41,6 +41,9 @@ npm install -g svgfusion
|
|
|
41
41
|
npx svgfusion convert ./icons --output ./components
|
|
42
42
|
|
|
43
43
|
# Or install locally for programmatic usage
|
|
44
|
+
|
|
45
|
+
# Add prefix and suffix to component names
|
|
46
|
+
svgfusion convert ./icons --output ./components --prefix Icon --suffix Svg
|
|
44
47
|
npm install svgfusion
|
|
45
48
|
# or
|
|
46
49
|
yarn add svgfusion
|
|
@@ -48,6 +51,35 @@ yarn add svgfusion
|
|
|
48
51
|
pnpm add svgfusion
|
|
49
52
|
```
|
|
50
53
|
|
|
54
|
+
## CLI Options
|
|
55
|
+
|
|
56
|
+
<img src="https://i.ibb.co/8n2b5mtp/cli.png" alt="SVGFusion CLI" width="512" >
|
|
57
|
+
|
|
58
|
+
svgfusion convert ./icons --output ./components --prefix Icon --suffix Svg
|
|
59
|
+
|
|
60
|
+
You can add a prefix and/or suffix to the generated component names using the `--prefix` and `--suffix` options:
|
|
61
|
+
|
|
62
|
+
```sh
|
|
63
|
+
npx svgfusion convert ./svgs --prefix Icon --suffix Svg
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
This will generate components like `IconStarSvg`, `IconUserSvg`, etc.
|
|
67
|
+
|
|
68
|
+
Both options sanitize input to remove symbols and spaces. If omitted, no prefix/suffix is added.
|
|
69
|
+
|
|
70
|
+
#### Example
|
|
71
|
+
|
|
72
|
+
```sh
|
|
73
|
+
npx svgfusion convert ./svgs --prefix App --suffix Widget
|
|
74
|
+
# Output: AppStarWidget, AppUserWidget, ...
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
For more details, run:
|
|
78
|
+
|
|
79
|
+
```sh
|
|
80
|
+
npx svgfusion --help
|
|
81
|
+
```
|
|
82
|
+
|
|
51
83
|
### CLI Usage
|
|
52
84
|
|
|
53
85
|
```bash
|
|
@@ -77,6 +109,8 @@ Options:
|
|
|
77
109
|
-f, --framework <framework> Target framework (react|vue) (default: "react")
|
|
78
110
|
-t, --typescript Generate TypeScript files
|
|
79
111
|
--no-optimize Skip SVG optimization
|
|
112
|
+
--prefix <prefix> Add prefix to component name (sanitized)
|
|
113
|
+
--suffix <suffix> Add suffix to component name (sanitized)
|
|
80
114
|
-h, --help Show help
|
|
81
115
|
```
|
|
82
116
|
|
package/dist/cli.js
CHANGED
|
@@ -520,43 +520,11 @@ async function convertToVue(svgContent, options = {}) {
|
|
|
520
520
|
var import_url = require("url");
|
|
521
521
|
var import_path3 = require("path");
|
|
522
522
|
var import_fs2 = require("fs");
|
|
523
|
+
|
|
524
|
+
// src/utils/banner.ts
|
|
525
|
+
init_cjs_shims();
|
|
523
526
|
var import_figlet = __toESM(require("figlet"));
|
|
524
|
-
|
|
525
|
-
cyan: "\x1B[36m",
|
|
526
|
-
blue: "\x1B[34m",
|
|
527
|
-
green: "\x1B[32m",
|
|
528
|
-
red: "\x1B[31m",
|
|
529
|
-
gray: "\x1B[90m",
|
|
530
|
-
dim: "\x1B[2m",
|
|
531
|
-
// Bold gradient colors with dramatic artistic accents
|
|
532
|
-
darkBlue: "\x1B[38;2;0;100;255m",
|
|
533
|
-
// Electric blue (bold)
|
|
534
|
-
mediumBlue: "\x1B[38;2;50;150;255m",
|
|
535
|
-
// Bright blue
|
|
536
|
-
lightBlue: "\x1B[38;2;100;200;255m",
|
|
537
|
-
// Vivid sky blue
|
|
538
|
-
blueCyan: "\x1B[38;2;0;150;255m",
|
|
539
|
-
// Electric blue-cyan
|
|
540
|
-
mediumCyan: "\x1B[38;2;0;255;255m",
|
|
541
|
-
// Pure cyan (bold)
|
|
542
|
-
darkCyan: "\x1B[38;2;0;200;200m",
|
|
543
|
-
// Electric turquoise
|
|
544
|
-
softTeal: "\x1B[38;2;0;255;150m",
|
|
545
|
-
// Electric teal
|
|
546
|
-
tealGreen: "\x1B[38;2;0;200;100m",
|
|
547
|
-
// Vivid teal green
|
|
548
|
-
softGreen: "\x1B[38;2;50;255;100m",
|
|
549
|
-
// Electric green
|
|
550
|
-
mediumGreen: "\x1B[38;2;0;255;50m",
|
|
551
|
-
// Pure green (bold)
|
|
552
|
-
reset: "\x1B[0m"
|
|
553
|
-
};
|
|
554
|
-
var __filename2 = (0, import_url.fileURLToPath)(importMetaUrl);
|
|
555
|
-
var __dirname = (0, import_path3.dirname)(__filename2);
|
|
556
|
-
var packageJson = JSON.parse(
|
|
557
|
-
(0, import_fs2.readFileSync)((0, import_path3.join)(__dirname, "..", "package.json"), "utf-8")
|
|
558
|
-
);
|
|
559
|
-
function createBanner() {
|
|
527
|
+
function createBanner(colors2) {
|
|
560
528
|
const title = import_figlet.default.textSync("SVGfusion", {
|
|
561
529
|
font: "ANSI Shadow",
|
|
562
530
|
horizontalLayout: "default",
|
|
@@ -576,25 +544,25 @@ function createBanner() {
|
|
|
576
544
|
return char;
|
|
577
545
|
}
|
|
578
546
|
if (diagonalProgress <= 0.1) {
|
|
579
|
-
return `${
|
|
547
|
+
return `${colors2.darkBlue}${char}${colors2.reset}`;
|
|
580
548
|
} else if (diagonalProgress <= 0.2) {
|
|
581
|
-
return `${
|
|
549
|
+
return `${colors2.lightBlue}${char}${colors2.reset}`;
|
|
582
550
|
} else if (diagonalProgress <= 0.32) {
|
|
583
|
-
return `${
|
|
551
|
+
return `${colors2.mediumBlue}${char}${colors2.reset}`;
|
|
584
552
|
} else if (diagonalProgress <= 0.42) {
|
|
585
|
-
return `${
|
|
553
|
+
return `${colors2.blueCyan}${char}${colors2.reset}`;
|
|
586
554
|
} else if (diagonalProgress <= 0.52) {
|
|
587
|
-
return `${
|
|
555
|
+
return `${colors2.mediumCyan}${char}${colors2.reset}`;
|
|
588
556
|
} else if (diagonalProgress <= 0.62) {
|
|
589
|
-
return `${
|
|
557
|
+
return `${colors2.darkCyan}${char}${colors2.reset}`;
|
|
590
558
|
} else if (diagonalProgress <= 0.72) {
|
|
591
|
-
return `${
|
|
559
|
+
return `${colors2.softTeal}${char}${colors2.reset}`;
|
|
592
560
|
} else if (diagonalProgress <= 0.82) {
|
|
593
|
-
return `${
|
|
561
|
+
return `${colors2.tealGreen}${char}${colors2.reset}`;
|
|
594
562
|
} else if (diagonalProgress <= 0.92) {
|
|
595
|
-
return `${
|
|
563
|
+
return `${colors2.softGreen}${char}${colors2.reset}`;
|
|
596
564
|
} else {
|
|
597
|
-
return `${
|
|
565
|
+
return `${colors2.mediumGreen}${char}${colors2.reset}`;
|
|
598
566
|
}
|
|
599
567
|
}).join("");
|
|
600
568
|
return processedLine;
|
|
@@ -602,30 +570,70 @@ function createBanner() {
|
|
|
602
570
|
return `
|
|
603
571
|
${gradientTitle}
|
|
604
572
|
|
|
605
|
-
${
|
|
606
|
-
${
|
|
573
|
+
${colors2.gray}Transform SVG files into production-ready components${colors2.reset}
|
|
574
|
+
${colors2.blue}React${colors2.reset} ${colors2.gray}\u2022${colors2.reset} ${colors2.green}Vue 3${colors2.reset} ${colors2.gray}\u2022${colors2.reset} ${colors2.blue}TypeScript${colors2.reset}
|
|
607
575
|
|
|
608
|
-
${
|
|
576
|
+
${colors2.gray}\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500${colors2.reset}
|
|
609
577
|
`;
|
|
610
578
|
}
|
|
579
|
+
|
|
580
|
+
// src/utils/colors.ts
|
|
581
|
+
init_cjs_shims();
|
|
582
|
+
var colors = {
|
|
583
|
+
cyan: "\x1B[36m",
|
|
584
|
+
blue: "\x1B[34m",
|
|
585
|
+
green: "\x1B[32m",
|
|
586
|
+
red: "\x1B[31m",
|
|
587
|
+
gray: "\x1B[90m",
|
|
588
|
+
dim: "\x1B[2m",
|
|
589
|
+
// Bold gradient colors with dramatic artistic accents
|
|
590
|
+
darkBlue: "\x1B[38;2;0;100;255m",
|
|
591
|
+
// Electric blue (bold)
|
|
592
|
+
mediumBlue: "\x1B[38;2;50;150;255m",
|
|
593
|
+
// Bright blue
|
|
594
|
+
lightBlue: "\x1B[38;2;100;200;255m",
|
|
595
|
+
// Vivid sky blue
|
|
596
|
+
blueCyan: "\x1B[38;2;0;150;255m",
|
|
597
|
+
// Electric blue-cyan
|
|
598
|
+
mediumCyan: "\x1B[38;2;0;255;255m",
|
|
599
|
+
// Pure cyan (bold)
|
|
600
|
+
darkCyan: "\x1B[38;2;0;200;200m",
|
|
601
|
+
// Electric turquoise
|
|
602
|
+
softTeal: "\x1B[38;2;0;255;150m",
|
|
603
|
+
// Electric teal
|
|
604
|
+
tealGreen: "\x1B[38;2;0;200;100m",
|
|
605
|
+
// Vivid teal green
|
|
606
|
+
softGreen: "\x1B[38;2;50;255;100m",
|
|
607
|
+
// Electric green
|
|
608
|
+
mediumGreen: "\x1B[38;2;0;255;50m",
|
|
609
|
+
// Pure green (bold)
|
|
610
|
+
reset: "\x1B[0m"
|
|
611
|
+
};
|
|
612
|
+
|
|
613
|
+
// src/cli.ts
|
|
614
|
+
var __filename2 = (0, import_url.fileURLToPath)(importMetaUrl);
|
|
615
|
+
var __dirname = (0, import_path3.dirname)(__filename2);
|
|
616
|
+
var packageJson = JSON.parse(
|
|
617
|
+
(0, import_fs2.readFileSync)((0, import_path3.join)(__dirname, "..", "package.json"), "utf-8")
|
|
618
|
+
);
|
|
611
619
|
var program = new import_commander.Command();
|
|
612
620
|
var isNpxCall = process.argv[1]?.includes("npx") || process.argv[1]?.includes("_npx");
|
|
613
|
-
if (process.argv.length ===
|
|
614
|
-
console.log(createBanner());
|
|
621
|
+
if (process.argv.length === 1 || isNpxCall && process.argv.length === 2) {
|
|
622
|
+
console.log(createBanner(colors));
|
|
615
623
|
}
|
|
616
624
|
program.name("svgfusion").description(
|
|
617
625
|
"Transform SVG files into production-ready React and Vue 3 components"
|
|
618
626
|
).version(packageJson.version);
|
|
619
|
-
program.
|
|
627
|
+
program.description("Convert SVG files to React or Vue components").argument("<input>", "Input SVG file or directory").option("-o, --output <output>", "Output directory", "./components").option(
|
|
620
628
|
"-f, --framework <framework>",
|
|
621
629
|
"Target framework (react|vue)",
|
|
622
630
|
"react"
|
|
623
|
-
).option("-t, --typescript", "Generate TypeScript files", false).option("--no-optimize", "Skip SVG optimization").action(
|
|
631
|
+
).option("-t, --typescript", "Generate TypeScript files", false).option("--no-optimize", "Skip SVG optimization").option("--prefix <prefix>", "Add prefix to component name").option("--suffix <suffix>", "Add suffix to component name").action(
|
|
624
632
|
async (input, options) => {
|
|
625
|
-
console.log(createBanner());
|
|
633
|
+
console.log(createBanner(colors));
|
|
626
634
|
console.log(`${colors.blue}\u{1F504} Processing SVG files...${colors.reset}`);
|
|
627
635
|
try {
|
|
628
|
-
const { framework, output, typescript, optimize: optimize2 } = options;
|
|
636
|
+
const { framework, output, typescript, optimize: optimize2, prefix, suffix } = options;
|
|
629
637
|
if (framework !== "react" && framework !== "vue") {
|
|
630
638
|
throw new Error('Framework must be either "react" or "vue"');
|
|
631
639
|
}
|
|
@@ -652,7 +660,11 @@ program.command("convert").description("Convert SVG files to React or Vue compon
|
|
|
652
660
|
const svgContent = await readSvgFile(filePath);
|
|
653
661
|
const optimizedSvg = optimize2 ? optimizeSvg(svgContent) : svgContent;
|
|
654
662
|
const filename = (0, import_path2.basename)(filePath);
|
|
655
|
-
const componentName =
|
|
663
|
+
const componentName = formatComponentName(
|
|
664
|
+
svgToComponentName(filename),
|
|
665
|
+
prefix,
|
|
666
|
+
suffix
|
|
667
|
+
);
|
|
656
668
|
const result = framework === "react" ? await convertToReact(optimizedSvg, {
|
|
657
669
|
typescript,
|
|
658
670
|
name: componentName
|
|
@@ -676,5 +688,14 @@ program.command("convert").description("Convert SVG files to React or Vue compon
|
|
|
676
688
|
process.exit(1);
|
|
677
689
|
}
|
|
678
690
|
}
|
|
679
|
-
)
|
|
691
|
+
).addHelpText("before", createBanner(colors)).addHelpText(
|
|
692
|
+
"after",
|
|
693
|
+
`
|
|
694
|
+
${colors.gray}Examples:${colors.reset}
|
|
695
|
+
${colors.blue}svgfusion convert src/icons -o src/components${colors.reset}
|
|
696
|
+
${colors.blue}svgfusion convert src/icons --framework vue --typescript${colors.reset}
|
|
697
|
+
${colors.blue}svgfusion convert src/icons --optimize --prefix My --suffix Widget${colors.reset}
|
|
698
|
+
${colors.blue}svgfusion convert src/icons --framework react --typescript --optimize${colors.reset}
|
|
699
|
+
`
|
|
700
|
+
).outputHelp();
|
|
680
701
|
program.parse();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "svgfusion",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "A powerful CLI tool and library that converts SVG files into production-ready React and Vue 3 components with TypeScript support and automatic optimization.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|