UNPKG

angular-translation-checker

Version:

A comprehensive tool for analyzing translation keys in Angular projects using ngx-translate

288 lines (275 loc) 12 kB
#!/usr/bin/env node "use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); const index_1 = require("./index"); function parseArgs() { const args = process.argv.slice(2); const options = {}; for (let i = 0; i < args.length; i++) { const arg = args[i]; const nextArg = args[i + 1]; switch (arg) { case '--locales-path': case '-l': options.localesPath = nextArg; i++; break; case '--src-path': case '-s': options.srcPath = nextArg; i++; break; case '--format': case '-f': options.format = nextArg; i++; break; case '--output': case '-o': if (nextArg && !nextArg.startsWith('--')) { options.output = nextArg; i++; } break; case '--config': case '-c': options.config = nextArg; i++; break; case '--ignore-keys': if (nextArg && !nextArg.startsWith('--')) { options.ignoreKeys = nextArg; i++; } break; case '--languages': if (nextArg && !nextArg.startsWith('--')) { options.languages = nextArg; i++; } break; case '--exit-on-issues': options.exitOnIssues = true; break; case '--verbose': case '-v': options.verbose = true; break; case '--generate-config': options.generateConfig = true; break; case '--help': case '-h': options.help = true; break; case '--version': options.version = true; break; } } return options; } function showHelp() { const packageJson = require('../package.json'); console.log(` Angular Translation Checker v${packageJson.version} (TypeScript Edition) USAGE: ng-i18n-check [options] OPTIONS: -l, --locales-path <path> Path to translation files directory (default: ./src/assets/i18n) -s, --src-path <path> Path to source code directory (default: ./src) -f, --format <format> Output format: console, json, csv (default: console) -o, --output <sections> Output sections (comma-separated, see below) -c, --config <path> Configuration file path (default: ./.ng-i18n-check.json) --ignore-keys <patterns> Ignore key patterns (comma-separated regex patterns) --languages <langs> Specific languages to check (comma-separated, e.g., en,es,fr) --exit-on-issues Exit with error code if translation issues are found -v, --verbose Enable verbose logging and detailed output --generate-config Generate a default configuration file --help, -h Show this comprehensive help message --version Show version information and credits OUTPUT SECTIONS: summary Analysis summary with counts and coverage dynamicPatterns Dynamic key patterns detected ignored Keys ignored by configuration unused Translation keys not used in source code missing Keys used in source but missing from translations usedKeys All keys found in source code translationKeys All available translation keys config Current configuration settings EXAMPLES: # Basic analysis with default settings ng-i18n-check # Analyze specific paths with verbose output ng-i18n-check -l ./assets/i18n -s ./src -v # Show only critical information (unused and missing keys) ng-i18n-check --output summary,unused,missing # Generate JSON report and save to file ng-i18n-check --format json --output summary,unused > translation-report.json # Check only specific languages with custom config ng-i18n-check --languages en,es --config ./my-i18n-config.json # CI/CD: Exit with error if issues found ng-i18n-check --exit-on-issues --output summary # Generate configuration file for your project ng-i18n-check --generate-config # Ignore specific key patterns (useful for dynamic keys) ng-i18n-check --ignore-keys "DYNAMIC_.*,TEST_.*" COMMON WORKFLOWS: 1. First time setup: ng-i18n-check --generate-config 2. Regular analysis: ng-i18n-check 3. Detailed inspection: ng-i18n-check -v --output summary,unused,missing 4. CI/CD integration: ng-i18n-check --exit-on-issues --format json For more information and examples, visit: https://ricardoferreirades.github.io/angular-translation-checker/ `); } function showVersion() { const packageJson = require('../package.json'); console.log(` ┌─ Angular Translation Checker ─────────────────────────────────┐ │ Version: ${packageJson.version} (TypeScript Edition) │ │ A modern, plugin-based translation analysis tool │ │ │ │ Features: │ │ • TypeScript-first architecture with full type safety │ │ • Extensible plugin system for custom analysis │ │ • Multiple output formats (Console, JSON, CSV, HTML) │ │ • Advanced pattern matching and dynamic key detection │ │ • CI/CD integration with configurable exit codes │ │ │ │ Repository: https://github.com/ricardoferreirades/angular-translation-checker │ │ Documentation: https://ricardoferreirades.github.io/angular-translation-checker/ │ └───────────────────────────────────────────────────────────────┘ `); } async function main() { const options = parseArgs(); if (options.help) { showHelp(); return; } if (options.version) { showVersion(); return; } if (options.generateConfig) { const { ConfigurationManager } = await Promise.resolve().then(() => __importStar(require('./core/config-manager'))); const { ConsoleLogger } = await Promise.resolve().then(() => __importStar(require('./core/logger'))); const configManager = new ConfigurationManager(new ConsoleLogger(true)); await configManager.generateConfigFile(); console.log('Configuration file generated successfully!'); return; } try { // Merge CLI options with any existing config const configOverrides = {}; if (options.localesPath) configOverrides.localesPath = options.localesPath; if (options.srcPath) configOverrides.srcPath = options.srcPath; if (options.format) configOverrides.outputFormat = options.format; if (options.verbose !== undefined) configOverrides.verbose = options.verbose; if (options.exitOnIssues !== undefined) configOverrides.exitOnIssues = options.exitOnIssues; if (options.output) { configOverrides.outputSections = options.output.split(',') .map(s => s.trim()); } if (options.ignoreKeys) { configOverrides.ignoreKeys = options.ignoreKeys.split(',') .map(k => k.trim()); } if (options.languages) { configOverrides.languages = options.languages.split(',') .map(l => l.trim()); } // Run analysis const result = await (0, index_1.analyzeTranslations)(options.config, configOverrides); // Print output console.log(result.output); // Exit with appropriate code if (options.exitOnIssues && result.hasIssues) { process.exit(1); } } catch (error) { console.error('\n❌ Analysis Error:'); if (error instanceof Error) { console.error(` ${error.message}`); // Provide helpful suggestions based on common error types if (error.message.includes('ENOENT') || error.message.includes('not found')) { console.error('\n💡 Suggestions:'); console.error(' • Check that the specified paths exist'); console.error(' • Use --locales-path and --src-path to specify correct directories'); console.error(' • Run --generate-config to create a default configuration'); } else if (error.message.includes('permission')) { console.error('\n💡 Suggestions:'); console.error(' • Check file permissions for the specified directories'); console.error(' • Ensure you have read access to translation files'); } else if (error.message.includes('JSON') || error.message.includes('parse')) { console.error('\n💡 Suggestions:'); console.error(' • Check that translation files contain valid JSON'); console.error(' • Use --verbose for detailed parsing information'); } if (options.verbose && error.stack) { console.error('\n🔍 Stack trace (verbose mode):'); console.error(error.stack); } } else { console.error(` ${String(error)}`); } console.error('\n📖 For help and examples, run: ng-i18n-check --help'); process.exit(1); } } // Run the CLI if (require.main === module) { main().catch(error => { console.error('\n💥 Unexpected Error:'); console.error(` ${error.message || String(error)}`); console.error('\n📝 This appears to be an unexpected error. Please consider:'); console.error(' • Reporting this issue at: https://github.com/ricardoferreirades/angular-translation-checker/issues'); console.error(' • Including your configuration and command used'); console.error(' • Running with --verbose for more details'); process.exit(1); }); } //# sourceMappingURL=cli.js.map