From 59fd6fb5221aad9b60eeceb01d22eb8bc3bc1e8c Mon Sep 17 00:00:00 2001 From: Boris Polak <18208654+BorisTB@users.noreply.github.com> Date: Mon, 18 Dec 2023 14:08:18 +0100 Subject: [PATCH] review fixes - move keyPrefix to parsedOptions - don't let user know he's about to break translations --- src/extractors/getFixedTFunction.ts | 2 +- src/extractors/tFunction.ts | 7 ++++++ src/extractors/useTranslationHook.ts | 4 ++-- src/keys.ts | 22 ++++++++----------- .../testUseTranslationHook/keyPrefix.js | 5 +++++ .../testUseTranslationHook/keyPrefix.json | 3 ++- 6 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/extractors/getFixedTFunction.ts b/src/extractors/getFixedTFunction.ts index d0cdb4a..a97e677 100644 --- a/src/extractors/getFixedTFunction.ts +++ b/src/extractors/getFixedTFunction.ts @@ -90,6 +90,7 @@ export default function extractGetFixedTFunction( ...k, parsedOptions: { ...k.parsedOptions, + keyPrefix: k.parsedOptions.keyPrefix || keyPrefix, ns: k.parsedOptions.ns || ns, }, })), @@ -99,7 +100,6 @@ export default function extractGetFixedTFunction( return keys.map((k) => ({ ...k, - keyPrefix: keyPrefix || undefined, sourceNodes: [path.node, ...k.sourceNodes], extractorName: extractGetFixedTFunction.name, })); diff --git a/src/extractors/tFunction.ts b/src/extractors/tFunction.ts index 19004be..18a4770 100644 --- a/src/extractors/tFunction.ts +++ b/src/extractors/tFunction.ts @@ -50,6 +50,7 @@ function parseTCallOptions( contexts: false, hasCount: false, ns: null, + keyPrefix: null, defaultValue: null, }; @@ -76,6 +77,12 @@ function parseTCallOptions( const defaultValueNodeValue = defaultValueNode.get('value'); res.defaultValue = evaluateIfConfident(defaultValueNodeValue); } + + const keyPrefixNode = findKeyInObjectExpression(path, 'keyPrefix'); + if (keyPrefixNode !== null && keyPrefixNode.isObjectProperty()) { + const keyPrefixNodeValue = keyPrefixNode.get('value'); + res.keyPrefix = evaluateIfConfident(keyPrefixNodeValue); + } } return res; diff --git a/src/extractors/useTranslationHook.ts b/src/extractors/useTranslationHook.ts index b44d744..8f4ac91 100644 --- a/src/extractors/useTranslationHook.ts +++ b/src/extractors/useTranslationHook.ts @@ -59,7 +59,7 @@ export default function extractUseTranslationHook( const tBinding = id.scope.bindings['t']; if (!tBinding) return []; - let keyPrefix: string | undefined; + let keyPrefix: string | null = null; const optionsArgument = path.get('arguments')[1]; const options = getFirstOrNull(evaluateIfConfident(optionsArgument)) @@ -86,6 +86,7 @@ export default function extractUseTranslationHook( ...k, parsedOptions: { ...k.parsedOptions, + keyPrefix: k.parsedOptions.keyPrefix || keyPrefix, ns: k.parsedOptions.ns || ns, }, })), @@ -95,7 +96,6 @@ export default function extractUseTranslationHook( return keys.map((k) => ({ ...k, - keyPrefix: keyPrefix, sourceNodes: [path.node, ...k.sourceNodes], extractorName: extractUseTranslationHook.name, })); diff --git a/src/keys.ts b/src/keys.ts index f3781a9..ee06bf1 100644 --- a/src/keys.ts +++ b/src/keys.ts @@ -10,6 +10,7 @@ interface I18NextParsedOptions { contexts: string[] | boolean; hasCount: boolean; ns: string | null; + keyPrefix: string | null; defaultValue: string | null; } @@ -18,7 +19,6 @@ interface I18NextParsedOptions { */ export interface ExtractedKey { key: string; - keyPrefix?: string; parsedOptions: I18NextParsedOptions; // Nodes (not node paths) from which the key was extracted. @@ -50,30 +50,26 @@ export interface TranslationKey extends ExtractedKey { function parseExtractedKey(key: ExtractedKey, config: Config): TranslationKey { let cleanKey = key.key; + const keyPrefix = key.parsedOptions.keyPrefix; + if (keyPrefix) { + // Imitate behavior of i18next and just connect prefix with key before any other action + const keySeparator = config.keySeparator || '.'; + cleanKey = `${keyPrefix}${keySeparator}${cleanKey}`; + } + let ns: string = key.parsedOptions.ns || config.defaultNS; if (config.nsSeparator) { const nsSeparatorPos = cleanKey.indexOf(config.nsSeparator); if (nsSeparatorPos !== -1) { - if (key.keyPrefix) { - throw new Error( - `Do not use the keyPrefix option if you want to use keys with prefixed namespace notation. - key: ${cleanKey} - keyPrefix: ${key.keyPrefix}`, - ) - } - ns = cleanKey.slice(0, nsSeparatorPos); cleanKey = cleanKey.slice(nsSeparatorPos + 1); } } let keyPath = Array(); - if (config.keySeparator) { - if (key.keyPrefix) { - keyPath = key.keyPrefix.split(config.keySeparator); - } + if (config.keySeparator) { const fullPath = cleanKey.split(config.keySeparator); keyPath = [...keyPath, ...fullPath.slice(0, fullPath.length - 1)]; cleanKey = fullPath[fullPath.length - 1]; diff --git a/tests/__fixtures__/testUseTranslationHook/keyPrefix.js b/tests/__fixtures__/testUseTranslationHook/keyPrefix.js index 9c90bae..c6704ed 100644 --- a/tests/__fixtures__/testUseTranslationHook/keyPrefix.js +++ b/tests/__fixtures__/testUseTranslationHook/keyPrefix.js @@ -19,3 +19,8 @@ export function MyComponent4() { const [t] = useTranslation('ns3', { keyPrefix: 'deep5.deep6' }); return

{t('key7.key8')}{t('key9.key10')}

} + +export function MyComponent5() { + const [t] = useTranslation('ns4', { keyPrefix: 'deep7.deep8' }); + return

{t('ns5:key11')}

+} diff --git a/tests/__fixtures__/testUseTranslationHook/keyPrefix.json b/tests/__fixtures__/testUseTranslationHook/keyPrefix.json index 9f029cb..e30ef4f 100644 --- a/tests/__fixtures__/testUseTranslationHook/keyPrefix.json +++ b/tests/__fixtures__/testUseTranslationHook/keyPrefix.json @@ -5,6 +5,7 @@ [{ "deep0": {"key0": "", "key1": ""}}, {"ns": "ns0"}], [{ "deep1": {"deep2": {"key2": "", "key3": ""}}}, {"ns": "ns1"}], [{ "deep3": {"deep4": {"key4": { "key5": "", "key6": "" }}}}, {"ns": "ns2"}], - [{ "deep5": {"deep6": {"key7": { "key8": "" }, "key9": {"key10": ""}}}}, {"ns": "ns3"}] + [{ "deep5": {"deep6": {"key7": { "key8": "" }, "key9": {"key10": ""}}}}, {"ns": "ns3"}], + [{ "key11": ""}, {"ns": "deep7.deep8.ns5"}] ] }