Move cli code to Typescript

This commit is contained in:
Kim Biesbjerg 2016-12-10 03:29:03 +01:00
parent c35036d4c8
commit 6b2059b23e
6 changed files with 86 additions and 98 deletions

View File

@ -1,80 +1,3 @@
#! /usr/bin/env node
const Extractor = require('../dist/extractor').Extractor;
const PipeParser = require('../dist/parsers/pipe.parser').PipeParser;
const DirectiveParser = require('../dist/parsers/directive.parser').DirectiveParser;
const ServiceParser = require('../dist/parsers/service.parser').ServiceParser;
const JsonCompiler = require('../dist/compilers/json.compiler').JsonCompiler;
const PoCompiler = require('../dist/compilers/po.compiler').PoCompiler
const fs = require('fs');
const path = require('path');
const cli = require('cli');
const options = cli.parse({
dir: ['d', 'Directory path you would like to extract strings from', 'dir', process.env.PWD],
output: ['o', 'Directory path you would like to save extracted strings', 'dir', process.env.PWD],
format: ['f', 'Output format', ['json', 'pot'], 'json'],
replace: ['r', 'Replace the contents of output file if it exists (merging by default)', 'boolean', false],
clean: ['c', 'Remove unused keys when merging', 'boolean', false]
});
[options.dir, options.output].forEach(dir => {
if (!fs.existsSync(dir)) {
cli.fatal('The directory path you supplied was not found: ' + dir);
}
});
const filename = 'template.' + options.format;
const dest = path.join(options.output, filename);
const parsers = [
new PipeParser(),
new DirectiveParser(),
new ServiceParser()
];
const patterns = [
'/**/*.html',
'/**/*.ts',
'/**/*.js'
];
const extractor = new Extractor(parsers, patterns);
try {
cli.info(`Extracting strings from '${options.dir}'`);
const extracted = extractor.process(options.dir);
cli.ok(`* Extracted ${extracted.count()} strings`);
if (extracted.isEmpty()) {
process.exit();
}
let collection = extracted;
let compiler = new JsonCompiler();
if (options.format === 'pot') {
compiler = new PoCompiler();
}
if (!options.replace && fs.existsSync(dest)) {
const existing = compiler.parse(fs.readFileSync(dest, 'utf-8'));
collection = extracted.union(existing);
cli.ok(`* Merged ${existing.count()} existing strings`);
if (options.clean) {
const collectionCount = collection.count();
collection = collection.intersect(extracted);
const removeCount = collectionCount - collection.count();
if (removeCount > 0) {
cli.ok(`* Removed ${removeCount} unused strings`);
}
}
}
fs.writeFileSync(dest, compiler.compile(collection));
cli.ok(`* Saved to '${dest}'`);
} catch (e) {
cli.fatal(e.toString());
}
require('../dist/cli/extract');

80
src/cli/extract.ts Executable file
View File

@ -0,0 +1,80 @@
import { Extractor } from '../extractor';
import { ParserInterface } from '../parsers/parser.interface';
import { PipeParser } from '../parsers/pipe.parser';
import { DirectiveParser } from '../parsers/directive.parser';
import { ServiceParser } from '../parsers/service.parser';
import { JsonCompiler } from '../compilers/json.compiler';
import { PoCompiler } from '../compilers/po.compiler';
import { TranslationCollection } from '../utils/translation.collection';
import * as fs from 'fs';
import * as path from 'path';
import * as cli from 'cli';
const options = cli.parse({
dir: ['d', 'Directory path you would like to extract strings from', 'dir', process.env.PWD],
output: ['o', 'Directory path you would like to save extracted strings', 'dir', process.env.PWD],
format: ['f', 'Output format', ['json', 'pot'], 'json'],
replace: ['r', 'Replace the contents of output file if it exists (merging by default)', 'boolean', false],
clean: ['c', 'Remove unused keys when merging', 'boolean', false]
});
[options.dir, options.output].forEach(dir => {
if (!fs.existsSync(dir)) {
cli.fatal('The directory path you supplied was not found: ' + dir);
}
});
const filename: string = 'template.' + options.format;
const dest: string = path.join(options.output, filename);
const parsers: ParserInterface[] = [
new PipeParser(),
new DirectiveParser(),
new ServiceParser()
];
const patterns: string[] = [
'/**/*.html',
'/**/*.ts',
'/**/*.js'
];
const extractor: Extractor = new Extractor(parsers, patterns);
try {
cli.info(`Extracting strings from '${options.dir}'`);
const extracted: TranslationCollection = extractor.process(options.dir);
cli.ok(`* Extracted ${extracted.count()} strings`);
if (extracted.isEmpty()) {
process.exit();
}
let collection: TranslationCollection = extracted;
let compiler = new JsonCompiler();
if (options.format === 'pot') {
compiler = new PoCompiler();
}
if (!options.replace && fs.existsSync(dest)) {
const existing: TranslationCollection = compiler.parse(fs.readFileSync(dest, 'utf-8'));
collection = extracted.union(existing);
cli.ok(`* Merged ${existing.count()} existing strings`);
if (options.clean) {
const collectionCount = collection.count();
collection = collection.intersect(extracted);
const removeCount = collectionCount - collection.count();
if (removeCount > 0) {
cli.ok(`* Removed ${removeCount} unused strings`);
}
}
}
fs.writeFileSync(dest, compiler.compile(collection));
cli.ok(`* Saved to '${dest}'`);
} catch (e) {
cli.fatal(e.toString());
}

View File

@ -1,5 +1,5 @@
import { CompilerInterface } from './compiler.interface';
import { TranslationCollection } from '../utils/translation.collection';
import { TranslationCollection, TranslationType } from '../utils/translation.collection';
import * as gettext from 'gettext-parser';
@ -25,7 +25,7 @@ export class PoCompiler implements CompilerInterface {
msgstr: collection.get(key)
};
return translations;
}, {})
}, <any>{})
}
};
@ -45,7 +45,7 @@ export class PoCompiler implements CompilerInterface {
.reduce((values, key) => {
values[key] = po.translations[this.domain][key].msgstr.pop();
return values;
}, {});
}, <TranslationType>{});
return new TranslationCollection(values);
}

View File

@ -1,16 +0,0 @@
import { Extractor } from './extractor';
import { JsonCompiler } from './compilers/json.compiler';
import { TranslationCollection } from './utils/translation.collection';
const compiler = new JsonCompiler();
const extractor = new Extractor();
const dirPath = '/your/project';
try {
const collection: TranslationCollection = extractor.process(dirPath);
const result: string = compiler.compile(collection);
console.log(result);
} catch (e) {
console.log(`Something went wrong: ${e.toString()}`);
}

View File

@ -18,7 +18,7 @@ export class TranslationCollection {
const values = keys.reduce((results, key) => {
results[key] = '';
return results;
}, {});
}, <TranslationType>{});
return new TranslationCollection(Object.assign({}, this.values, values));
}

View File

@ -2,6 +2,7 @@
"compilerOptions": {
"allowSyntheticDefaultImports": true,
"noUnusedLocals": true,
"noImplicitAny": true,
"removeComments": true,
"declaration": true,
"target": "ES6",