Skip to content

Commit

Permalink
Merge pull request #700 from pcorpet/feature/keep-removed-patterns
Browse files Browse the repository at this point in the history
Add support for keepRemovedPatterns option - closes #693
  • Loading branch information
karellm committed Jul 12, 2023
2 parents 2b9a3a8 + 217635a commit c579e5f
Show file tree
Hide file tree
Showing 7 changed files with 91 additions and 4 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Changelog

# Unreleased

- Add support for patterns in the `keepRemoved` option

# 8.1.0

- Allow to disable plural handling #825 #463
Expand Down
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,9 @@ export default {

keepRemoved: false,
// Keep keys from the catalog that are no longer in code
// You may either specify a boolean to keep or discard all removed keys.
// You may also specify an array of patterns: the keys from the catalog that are no long in the code but match one of the patterns will be kept.
// The patterns are applied to the full key including the namespace, the parent keys and the separators.

keySeparator: '.',
// Key separator used in your translation keys
Expand Down
2 changes: 1 addition & 1 deletion index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ export interface UserConfig {
defaultNamespace?: string;
defaultValue?: string | ((locale?: string, namespace?: string, key?: string) => string);
indentation?: number;
keepRemoved?: boolean;
keepRemoved?: boolean | readonly RegEx[];
keySeparator?: string | false;
lexers?: {
hbs?: (SupportedLexer | CustomLexer | LexerConfig)[];
Expand Down
14 changes: 11 additions & 3 deletions src/helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,10 @@ function mergeHashes(source, target, options = {}, resetValues = {}) {
let oldCount = 0
let resetCount = 0

const keepRemoved = options.keepRemoved || false
const keepRemoved = typeof options.keepRemoved === "boolean" && options.keepRemoved || false
const keepRemovedPatterns = typeof options.keepRemoved !== "boolean" && options.keepRemoved || []
const fullKeyPrefix = options.fullKeyPrefix || ''
const keySeparator = options.keySeparator || '.'
const pluralSeparator = options.pluralSeparator || '_'

for (const key in source) {
Expand All @@ -133,7 +136,7 @@ function mergeHashes(source, target, options = {}, resetValues = {}) {
const nested = mergeHashes(
source[key],
target[key],
options,
{ ...options, fullKeyPrefix: fullKeyPrefix + key + keySeparator },
resetValues[key]
)
mergeCount += nested.mergeCount
Expand Down Expand Up @@ -185,7 +188,12 @@ function mergeHashes(source, target, options = {}, resetValues = {}) {
target[key] = source[key]
pullCount += 1
} else {
if (keepRemoved) {
const keepKey =
keepRemoved ||
keepRemovedPatterns.some((pattern) =>
pattern.test(fullKeyPrefix + key)
)
if (keepKey) {
target[key] = source[key]
} else {
old[key] = source[key]
Expand Down
1 change: 1 addition & 0 deletions src/transform.js
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,7 @@ export default class i18nTransform extends Transform {
{
...this.options,
resetAndFlag,
fullKeyPrefix: namespace + this.options.namespaceSeparator,
},
resetValues[namespace]
)
Expand Down
42 changes: 42 additions & 0 deletions test/helpers/mergeHashes.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -343,4 +343,46 @@ describe('mergeHashes helper function', () => {
assert.strictEqual(res.resetCount, 1)
done()
})

it('keeps the unused keys if they match patterns in keepRemoved', (done) => {
const source = { key1: 'key1', key2: 'key2', dummy: 'unusedValue' }
const target = { key1: 'code1' }
const res = mergeHashes(source, target, {
keepRemoved: [/key.*/],
keySeparator: '.',
})
assert.deepEqual(res.new, {
key1: 'key1',
key2: 'key2',
})
assert.deepEqual(res.old, {
dummy: 'unusedValue',
})
done()
})

it('keeps unused nested keys if they match the patterns in keepRemoved', (done) => {
const source = {
nesting: { key1: 'key1', key2: 'key2', dummy: 'unusedValue' },
key2: 'rootKey2',
}
const target = { nesting: { key1: 'code1' } }
const res = mergeHashes(source, target, {
keepRemoved: [/nesting\.key.*/],
keySeparator: '.',
})
assert.deepEqual(res.new, {
nesting: {
key1: 'key1',
key2: 'key2',
},
})
assert.deepEqual(res.old, {
nesting: {
dummy: 'unusedValue',
},
key2: 'rootKey2',
})
done()
})
})
29 changes: 29 additions & 0 deletions test/parser.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -1960,6 +1960,35 @@ describe('parser', () => {
i18nextParser.end(fakeFile)
})

it('supports keepRemoved option with patterns', (done) => {
let result, resultOld
const i18nextParser = new i18nTransform({
keepRemoved: [/test_merge:s.*/],
output: 'test/locales/$LOCALE/$NAMESPACE.json',
})
const fakeFile = new Vinyl({
contents: Buffer.from("t('test_merge:first')"),
path: 'file.js',
})

i18nextParser.on('data', (file) => {
if (file.relative.endsWith(path.normalize('en/test_merge.json'))) {
result = JSON.parse(file.contents)
} else if (
file.relative.endsWith(path.normalize('en/test_merge_old.json'))
) {
resultOld = JSON.parse(file.contents)
}
})
i18nextParser.once('end', () => {
assert.deepEqual(result, { first: 'first', second: '' })
assert.deepEqual(resultOld, { third: 'third' })
done()
})

i18nextParser.end(fakeFile)
})

describe('lexers', () => {
it('supports custom lexers options', (done) => {
let result
Expand Down

0 comments on commit c579e5f

Please sign in to comment.