Skip to content

Commit ba24d13

Browse files
authored
Merge pull request #2 from simplelocalize/dev
Polishing
2 parents 4f50f8c + 1486bdd commit ba24d13

File tree

10 files changed

+43
-76
lines changed

10 files changed

+43
-76
lines changed

.github/workflows-2/ci-publish.yml

Lines changed: 0 additions & 36 deletions
This file was deleted.

cli.ts

Lines changed: 16 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -8,30 +8,12 @@ import { dataI18nKeyStrategy } from './strategies/data-i18n-key';
88
import { ejsStrategy } from './strategies/ejs';
99
import { appleStrategy } from './strategies/apple';
1010
import { androidStrategy } from './strategies/android';
11-
import { StrategyConfig } from './strategies/strategy-config';
12-
13-
function findFiles(dir: string, exts: string[], excludeDirs: string[]): string[] {
14-
let results: string[] = [];
15-
const list = fs.readdirSync(dir);
16-
for (const file of list) {
17-
const filePath = path.join(dir, file);
18-
const stat = fs.statSync(filePath);
19-
if (stat && stat.isDirectory()) {
20-
if (excludeDirs.includes(file)) continue;
21-
results = results.concat(findFiles(filePath, exts, excludeDirs));
22-
} else {
23-
if (exts.some(ext => filePath.endsWith(ext))) {
24-
results.push(filePath);
25-
}
26-
}
27-
}
28-
return results;
29-
}
11+
import glob from 'glob';
3012

3113
const STRATEGY_MAP: Record<string, any> = {
3214
'i18next': i18nextStrategy,
3315
'react-intl': reactIntlStrategy,
34-
'html-data-attributes': dataI18nKeyStrategy,
16+
'data-i18n-key': dataI18nKeyStrategy,
3517
'ejs': ejsStrategy,
3618
'apple': appleStrategy,
3719
'android': androidStrategy
@@ -41,22 +23,24 @@ const program = new Command();
4123

4224
program
4325
.option('--config <file>', 'Path to strategy config JSON file')
44-
.option('--searchDir <dir>', '(Optional) Choose where to search. Default: ./', './')
45-
.option('--output <file>', '(Optional) Choose where to save results. Default: ./extraction.json', './extraction.json')
26+
.option('--strategy <name>', '(Optional) Extraction strategy to use (overrides config file)')
27+
.option('--src <pattern>', '(Optional) Glob pattern for files to search. Default: ./', './')
28+
.option('--out <file>', '(Optional) Choose where to save results. Default: ./extraction.json', './extraction.json')
4629
.action((options) => {
47-
const { config, searchDir, output } = options;
30+
const { config, strategy: cliStrategy, src, out } = options;
4831
if (!config) {
4932
console.error('Config file is required.');
5033
process.exit(1);
5134
}
5235

53-
let userConfig: StrategyConfig = {};
36+
let userConfig: CliConfig = {};
5437
if (config && require('fs').existsSync(config)) {
55-
userConfig = JSON.parse(require('fs').readFileSync(config, 'utf-8')) as StrategyConfig;
38+
userConfig = JSON.parse(require('fs').readFileSync(config, 'utf-8')) as CliConfig;
5639
}
57-
const strategyName = userConfig?.strategy || "";
40+
// Prefer CLI --strategy over config file
41+
const strategyName = cliStrategy || userConfig?.strategy || "";
5842
if (!strategyName || !STRATEGY_MAP[strategyName]) {
59-
console.error('Unknown or missing strategy in config file. Given strategy:', strategyName);
43+
console.error('Unknown or missing strategy. Given strategy:', strategyName);
6044
console.error('Available strategies:', Object.keys(STRATEGY_MAP).join(', '));
6145
process.exit(1);
6246
}
@@ -66,14 +50,13 @@ program
6650
process.exit(1);
6751
}
6852
const defaultConfig = strategy.getDefaultConfig();
69-
const effectiveConfig = { ...defaultConfig, ...userConfig };
53+
const effectiveConfig = { ...defaultConfig, ...userConfig, strategy: strategyName };
7054

71-
const includeExtensions = effectiveConfig.includeExtensions || [];
72-
const excludeDirs = effectiveConfig.excludeDirs || [];
73-
const files = findFiles(searchDir, includeExtensions, excludeDirs);
55+
// Use glob to find files
56+
const files = glob.sync(src, { ignore: effectiveConfig.excludeDirs || [] });
7457
const results = strategy(files, effectiveConfig);
75-
fs.writeFileSync(path.resolve(output), JSON.stringify(results, null, 2));
76-
console.log('Extraction complete. Output saved to', output);
58+
fs.writeFileSync(path.resolve(out), JSON.stringify(results, null, 2));
59+
console.log('Extraction complete. Output saved to', out);
7760
});
7861

7962
program.parse(process.argv);

package-lock.json

Lines changed: 19 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,12 @@
2424
},
2525
"devDependencies": {
2626
"@types/commander": "^2.12.0",
27+
"@types/glob": "^8.1.0",
2728
"@types/jest": "^30.0.0",
2829
"@types/node": "^24.0.13",
2930
"jest": "^29.7.0",
3031
"ts-jest": "^29.4.0",
3132
"ts-node": "^10.9.2",
3233
"typescript": "^5.8.3"
3334
}
34-
}
35+
}

strategies/android.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export function getDefaultConfig() {
77
};
88
}
99

10-
export function androidStrategy(files: string[], config?: Config): ExtractionResult[] {
10+
export function androidStrategy(files: string[], config?: CliConfig): ExtractionResult[] {
1111
const rStringRegex = /R\.string\.(\w+)/g;
1212
const xmlStringRegex = /android:text="@string\/(.*?)"/g;
1313
const results: ExtractionResult[] = [];

strategies/apple.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export function getDefaultConfig() {
77
};
88
}
99

10-
export function appleStrategy(files: string[], config?: Config): ExtractionResult[] {
10+
export function appleStrategy(files: string[], config?: CliConfig): ExtractionResult[] {
1111
const nsRegex = /NSLocalizedString\(["'](.*?)["']/g;
1212
const results: ExtractionResult[] = [];
1313
for (const file of files) {

strategies/data-i18n-key.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export function getDefaultConfig() {
1111
};
1212
}
1313

14-
export function dataI18nKeyStrategy(files: string[], config?: Config): ExtractionResult[] {
14+
export function dataI18nKeyStrategy(files: string[], config?: CliConfig): ExtractionResult[] {
1515
const selector = config?.selector || '[data-i18n-key]';
1616
const keyAttr = config?.keyAttr || 'data-i18n-key';
1717
const textAttr = config?.textAttr || null;

strategies/ejs.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export function getDefaultConfig() {
77
};
88
}
99

10-
export function ejsStrategy(files: string[], config?: Config): ExtractionResult[] {
10+
export function ejsStrategy(files: string[], config?: CliConfig): ExtractionResult[] {
1111
const tRegex = /t\(["'](.*?)["']\)/g;
1212
const results: ExtractionResult[] = [];
1313
for (const file of files) {

strategies/react-intl.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export function getDefaultConfig() {
77
};
88
}
99

10-
export function reactIntlStrategy(files: string[], config?: Config): ExtractionResult[] {
10+
export function reactIntlStrategy(files: string[], config?: CliConfig): ExtractionResult[] {
1111
const results: ExtractionResult[] = [];
1212
const formattedMessageRegex = /<FormattedMessage[^>]*id=["'](.*?)["'][^>]*defaultMessage=["'](.*?)["']/g;
1313
const formattedHTMLMessageRegex = /<FormattedHTMLMessage[^>]*id=["'](.*?)["'][^>]*defaultMessage=["'](.*?)["']/g;

strategies/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
interface Config {
1+
interface CliConfig {
22
keyAttr?: string;
33
textAttr?: string;
44
selector?: string;

0 commit comments

Comments
 (0)