From a69a1dc0a7270e0ce6dd5061531ce0237acac206 Mon Sep 17 00:00:00 2001 From: Kiet Le Date: Thu, 14 Nov 2024 11:57:25 +0700 Subject: [PATCH] =?UTF-8?q?feat:=20=E2=9C=A8implement=20icon=20paths=20sup?= =?UTF-8?q?port=20interactive?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 ++++++++------ package-lock.json | 6 +++--- package.json | 2 +- src/command/command-manager.ts | 3 ++- src/command/optimize-command.ts | 17 +++++++++++++++-- src/constants/index.ts | 1 + src/core/icon-optimize.ts | 10 ++++++++-- src/core/types.ts | 1 + 8 files changed, 39 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 3ec1581..e497a62 100644 --- a/README.md +++ b/README.md @@ -77,16 +77,18 @@ optimize-icons The tool will prompt you for: - Output path (default: dist/browser) +- Icons path (default: dist/browser/icons) - Verbose mode (yes/no) ### Options -| Option | Alias | Description | -| --------------- | ----- | ------------------------------------------------ | -| `--output-path` | `-o` | Specify the output directory for optimized icons | -| `--verbose` | `-v` | Enable verbose output | -| `--version` | - | Show version number | -| `--help` | - | Show help | +| Option | Alias | Description | +| --------------- | ----- | ----------------------------------------------------- | +| `--output-path` | `-o` | Specify the output dist directory for optimized icons | +| `--icons-path` | `-i` | Specify the icons directory for optimized icons | +| `--verbose` | `-v` | Enable verbose output | +| `--version` | - | Show version number | +| `--help` | - | Show help | ## Programmatic Usage diff --git a/package-lock.json b/package-lock.json index 9b94038..fda1442 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "optimize-icons-cli", - "version": "1.0.8", + "version": "1.1.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "optimize-icons-cli", - "version": "1.0.8", + "version": "1.1.2", "license": "MIT", "dependencies": { "colorette": "^2.0.20", @@ -18,7 +18,7 @@ "yargs": "^17.7.2" }, "bin": { - "optimize-icons": "dist/cli.js" + "optimize-icons": "bin/cli.js" }, "devDependencies": { "@commitlint/cli": "^19.5.0", diff --git a/package.json b/package.json index 03093bb..9509c2a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "optimize-icons-cli", - "version": "1.1.2", + "version": "1.1.3", "description": "CLI tool for optimizing icons", "main": "dist/cli.js", "types": "dist/types/index.d.ts", diff --git a/src/command/command-manager.ts b/src/command/command-manager.ts index 123102d..cb817c6 100644 --- a/src/command/command-manager.ts +++ b/src/command/command-manager.ts @@ -10,13 +10,14 @@ export class CommandManager { private setupCommands(): void { this.program .option('-o, --output-path ', 'Output path containing the built files') + .option('-i, --icons-path ', 'Path to icons directory') .option('-v, --verbose', 'Show verbose output') .addHelpText( 'after', ` Examples: $ optimize-icons -o dist/browser - $ optimize-icons -o dist/browser -v` + $ optimize-icons -o dist/browser -i dist/browser/icons -v` ); } diff --git a/src/command/optimize-command.ts b/src/command/optimize-command.ts index c098dc6..aa8f787 100644 --- a/src/command/optimize-command.ts +++ b/src/command/optimize-command.ts @@ -1,5 +1,5 @@ import inquirer from 'inquirer'; -import { OUTPUT_DIR, VERBOSE_DEFAULT } from '../constants'; +import { ICONS_DIR, OUTPUT_DIR, VERBOSE_DEFAULT } from '../constants'; import IconOptimizer from '../core/icon-optimize'; import { OptimizeIconsOptions } from '../core/types'; import { BaseCommand } from './base-command'; @@ -13,7 +13,19 @@ export class OptimizeCommand implements BaseCommand { type: 'input', name: 'outputPath', message: 'Enter output path:', - default: 'dist/browser', + default: OUTPUT_DIR, + validate: (input) => { + if (input.trim().length === 0) { + return 'Output path is required'; + } + return true; + }, + }, + { + type: 'input', + name: 'iconsPath', + message: 'Enter icons directory path:', + default: ICONS_DIR, validate: (input) => { if (input.trim().length === 0) { return 'Output path is required'; @@ -37,6 +49,7 @@ export class OptimizeCommand implements BaseCommand { this.options.outputPath || this.options.verbose ? { outputPath: this.options.outputPath || OUTPUT_DIR, + iconsPath: this.options.iconsPath || ICONS_DIR, verbose: this.options.verbose || VERBOSE_DEFAULT, } : await this.promptUserInput(); diff --git a/src/constants/index.ts b/src/constants/index.ts index 224b394..6223c1f 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -1,2 +1,3 @@ export const OUTPUT_DIR = 'dist/browser'; +export const ICONS_DIR = OUTPUT_DIR + '/icons'; export const VERBOSE_DEFAULT = false; diff --git a/src/core/icon-optimize.ts b/src/core/icon-optimize.ts index ed481ec..a928a5d 100644 --- a/src/core/icon-optimize.ts +++ b/src/core/icon-optimize.ts @@ -61,7 +61,13 @@ export class IconOptimizer { * Process all SVG icon files */ private async processIconFiles(): Promise { - const svgFiles = await glob(`${this.options.outputPath}/icons/*.svg`); + const iconPath = this.options.iconsPath || path.join(this.options.outputPath, 'icons'); + const svgFiles = await glob(`${iconPath}/*.svg`); + + if (svgFiles.length === 0) { + this.logger.warning(`No SVG files found in ${iconPath}`); + return; + } for (const file of svgFiles) { await this.optimizeSvgFile(file); @@ -75,7 +81,7 @@ export class IconOptimizer { const content = await fs.readFile(filePath, 'utf8'); const fileName = path.basename(filePath); - this.logger.log(`Processing ${fileName}...`); + this.logger.log(`\nProcessing ${fileName}...`); const { optimizedContent, removedCount, totalCount } = await this.processSvgContent(content); diff --git a/src/core/types.ts b/src/core/types.ts index 9b3b6c5..3f4836b 100644 --- a/src/core/types.ts +++ b/src/core/types.ts @@ -1,5 +1,6 @@ export interface OptimizeIconsOptions { outputPath: string; + iconsPath?: string; verbose?: boolean; }