@vocab/core
Advanced tools
Comparing version 0.0.0-compiled-translation-import-order-20230328231631 to 0.0.0-global-key-support-20231025223328
@@ -1,2 +0,2 @@ | ||
import { LoadedTranslation, UserConfig } from '@vocab/types'; | ||
import type { LoadedTranslation, UserConfig } from './types'; | ||
export declare function generateRuntime(loadedTranslation: LoadedTranslation): Promise<void>; | ||
@@ -3,0 +3,0 @@ export declare function watch(config: UserConfig): () => Promise<void>; |
@@ -1,4 +0,4 @@ | ||
import { UserConfig } from '@vocab/types'; | ||
import type { UserConfig } from './types'; | ||
export declare function validateConfig(c: UserConfig): boolean; | ||
export declare function resolveConfig(customConfigFilePath?: string): Promise<UserConfig | null>; | ||
export declare function resolveConfigSync(customConfigFilePath?: string): UserConfig | null; |
@@ -1,2 +0,2 @@ | ||
import { MessageGenerator, TranslationsByKey } from '@vocab/types'; | ||
import type { MessageGenerator, TranslationsByKey } from './types'; | ||
export declare function generateLanguageFromTranslations({ baseTranslations, generator, }: { | ||
@@ -3,0 +3,0 @@ baseTranslations: TranslationsByKey<string>; |
@@ -1,2 +0,2 @@ | ||
import { ParsedICUMessages, TranslationMessagesByKey } from '@vocab/types'; | ||
import type { ParsedICUMessages, TranslationMessagesByKey } from './types'; | ||
export declare const getParsedICUMessages: (m: TranslationMessagesByKey, locale: string) => ParsedICUMessages<any>; |
@@ -6,2 +6,2 @@ export { compile, watch } from './compile'; | ||
export { getUniqueKey, loadAllTranslations, loadTranslation, } from './load-translations'; | ||
export type { TranslationFile } from '@vocab/types'; | ||
export * from './types'; |
@@ -1,3 +0,3 @@ | ||
import type { TranslationsByKey, UserConfig, LoadedTranslation, LanguageTarget } from '@vocab/types'; | ||
import { Fallback } from './utils'; | ||
import type { TranslationsByKey, UserConfig, LoadedTranslation, LanguageTarget } from './types'; | ||
import { type Fallback } from './utils'; | ||
export declare function getUniqueKey(key: string, namespace: string): string; | ||
@@ -4,0 +4,0 @@ export declare function mergeWithDevLanguageTranslation({ translation, devTranslation, }: { |
@@ -1,3 +0,3 @@ | ||
import { TranslationModule, TranslationMessagesByKey } from '@vocab/types'; | ||
import type { TranslationModule, TranslationMessagesByKey } from './types'; | ||
export { createTranslationFile } from './translation-file'; | ||
export declare const createLanguage: (module: TranslationMessagesByKey) => TranslationModule<any>; |
@@ -1,2 +0,2 @@ | ||
import { TranslationModuleByLanguage, LanguageName, ParsedFormatFnByKey, TranslationFile } from '@vocab/types'; | ||
import type { TranslationModuleByLanguage, LanguageName, ParsedFormatFnByKey, TranslationFile } from './types'; | ||
export declare function createTranslationFile<Language extends LanguageName, FormatFnByKey extends ParsedFormatFnByKey>(translationsByLanguage: TranslationModuleByLanguage<Language, FormatFnByKey>): TranslationFile<Language, FormatFnByKey>; |
@@ -1,2 +0,2 @@ | ||
import type { LanguageName, LanguageTarget, TranslationsByKey, TranslationMessagesByKey, UserConfig } from '@vocab/types'; | ||
import type { LanguageName, LanguageTarget, TranslationsByKey, TranslationMessagesByKey, UserConfig } from './types'; | ||
export declare const defaultTranslationDirSuffix = ".vocab"; | ||
@@ -3,0 +3,0 @@ export declare const devTranslationFileName = "translations.json"; |
@@ -1,3 +0,3 @@ | ||
import { UserConfig, LoadedTranslation, LanguageName } from '@vocab/types'; | ||
import type { UserConfig, LoadedTranslation, LanguageName } from '../types'; | ||
export declare function findMissingKeys(loadedTranslation: LoadedTranslation, devLanguageName: LanguageName, altLanguages: Array<LanguageName>): readonly [boolean, Record<string, string[]>]; | ||
export declare function validate(config: UserConfig): Promise<boolean>; |
@@ -436,2 +436,9 @@ 'use strict'; | ||
keys.add(uniqueKey); | ||
const globalKey = loadedTranslation.languages[config.devLanguage][key].globalKey; | ||
if (globalKey) { | ||
if (keys.has(globalKey)) { | ||
throw new Error(`Duplicate keys found. Key with global key ${globalKey} and key ${key} was found multiple times`); | ||
} | ||
keys.add(globalKey); | ||
} | ||
} | ||
@@ -442,7 +449,5 @@ } | ||
const encodeWithinSingleQuotes = v => v.replace(/'/g, "\\'"); | ||
const encodeBackslash = v => v.replace(/\\/g, '\\\\'); | ||
function extractHasTags(ast) { | ||
return ast.some(element => { | ||
if (icuMessageformatParser.isSelectElement(element)) { | ||
if (icuMessageformatParser.isSelectElement(element) || icuMessageformatParser.isPluralElement(element)) { | ||
const children = Object.values(element.options).map(o => o.value); | ||
@@ -505,12 +510,7 @@ return children.some(child => extractHasTags(child)); | ||
for (const [key, value] of Object.entries(v)) { | ||
if (value && typeof value === 'object') { | ||
result += `'${encodeWithinSingleQuotes(key)}': ${serialiseObjectToType(value)},`; | ||
} else { | ||
result += `'${encodeWithinSingleQuotes(key)}': ${value},`; | ||
} | ||
result += `${JSON.stringify(key)}: ${value && typeof value === 'object' ? serialiseObjectToType(value) : value},`; | ||
} | ||
return `{ ${result} }`; | ||
} | ||
const banner = `// This file is automatically generated by Vocab.\n// To make changes update translation.json files directly.`; | ||
const serializeModuleImports = (imports, moduleName) => { | ||
const serializeTypeImports = (imports, moduleName) => { | ||
if (imports.size === 0) { | ||
@@ -520,3 +520,3 @@ return ''; | ||
const importNames = Array.from(imports); | ||
return `import { ${Array.from(importNames).join(', ')} } from '${moduleName}'`; | ||
return `import type { ${importNames.join(', ')} } from '${moduleName}';`; | ||
}; | ||
@@ -534,17 +534,26 @@ function serialiseTranslationRuntime(value, imports, loadedTranslation) { | ||
const formatGeneric = hasTags ? '<T = string>' : ''; | ||
const formatReturn = hasTags ? 'string | T | Array<string | T>' : 'string'; | ||
const formatReturn = hasTags && imports.has('FormatXMLElementFn') ? 'ReturnType<FormatXMLElementFn<T>>' : 'string'; | ||
translationFunctionString = `${formatGeneric}(values: ${serialiseObjectToType(params)}) => ${formatReturn}`; | ||
} | ||
translationsType[encodeBackslash(key)] = translationFunctionString; | ||
translationsType[key] = translationFunctionString; | ||
} | ||
const content = Object.entries(loadedTranslation.languages).map(([languageName, translations]) => `'${encodeWithinSingleQuotes(languageName)}': createLanguage(${JSON.stringify(getTranslationMessages(translations))})`).join(','); | ||
const languagesUnionAsString = Object.keys(loadedTranslation.languages).map(l => `'${l}'`).join(' | '); | ||
return `${banner} | ||
const languageEntries = Object.entries(loadedTranslation.languages).map(([languageName, translations]) => `${JSON.stringify(languageName)}: createLanguage(${JSON.stringify(getTranslationMessages(translations))})`).join(','); | ||
return (/* ts */` | ||
// This file is automatically generated by Vocab. | ||
// To make changes update translation.json files directly. | ||
import { createLanguage, createTranslationFile } from '@vocab/core/runtime'; | ||
${serializeModuleImports(imports, '@vocab/types')} | ||
${serializeTypeImports(imports, '@vocab/core')} | ||
import { createLanguage, createTranslationFile } from '@vocab/core/runtime'; | ||
const translations = createTranslationFile<${languagesUnionAsString}, ${serialiseObjectToType(translationsType)}>({${content}}); | ||
const translations = createTranslationFile< | ||
${languagesUnionAsString}, | ||
${serialiseObjectToType(translationsType)} | ||
>({ | ||
${languageEntries} | ||
}); | ||
export default translations;`; | ||
export default translations; | ||
` | ||
); | ||
} | ||
@@ -570,11 +579,9 @@ async function generateRuntime(loadedTranslation) { | ||
params = parsedParams; | ||
messages.add(`'${encodeWithinSingleQuotes(translatedLanguage[key].message)}'`); | ||
messages.add(JSON.stringify(translatedLanguage[key].message)); | ||
} | ||
} | ||
const returnType = hasTags ? 'NonNullable<ReactNode>' : 'string'; | ||
translationTypes.set(key, { | ||
params, | ||
hasTags, | ||
message: Array.from(messages).join(' | '), | ||
returnType | ||
message: Array.from(messages).join(' | ') | ||
}); | ||
@@ -581,0 +588,0 @@ } |
@@ -436,2 +436,9 @@ 'use strict'; | ||
keys.add(uniqueKey); | ||
const globalKey = loadedTranslation.languages[config.devLanguage][key].globalKey; | ||
if (globalKey) { | ||
if (keys.has(globalKey)) { | ||
throw new Error(`Duplicate keys found. Key with global key ${globalKey} and key ${key} was found multiple times`); | ||
} | ||
keys.add(globalKey); | ||
} | ||
} | ||
@@ -442,7 +449,5 @@ } | ||
const encodeWithinSingleQuotes = v => v.replace(/'/g, "\\'"); | ||
const encodeBackslash = v => v.replace(/\\/g, '\\\\'); | ||
function extractHasTags(ast) { | ||
return ast.some(element => { | ||
if (icuMessageformatParser.isSelectElement(element)) { | ||
if (icuMessageformatParser.isSelectElement(element) || icuMessageformatParser.isPluralElement(element)) { | ||
const children = Object.values(element.options).map(o => o.value); | ||
@@ -505,12 +510,7 @@ return children.some(child => extractHasTags(child)); | ||
for (const [key, value] of Object.entries(v)) { | ||
if (value && typeof value === 'object') { | ||
result += `'${encodeWithinSingleQuotes(key)}': ${serialiseObjectToType(value)},`; | ||
} else { | ||
result += `'${encodeWithinSingleQuotes(key)}': ${value},`; | ||
} | ||
result += `${JSON.stringify(key)}: ${value && typeof value === 'object' ? serialiseObjectToType(value) : value},`; | ||
} | ||
return `{ ${result} }`; | ||
} | ||
const banner = `// This file is automatically generated by Vocab.\n// To make changes update translation.json files directly.`; | ||
const serializeModuleImports = (imports, moduleName) => { | ||
const serializeTypeImports = (imports, moduleName) => { | ||
if (imports.size === 0) { | ||
@@ -520,3 +520,3 @@ return ''; | ||
const importNames = Array.from(imports); | ||
return `import { ${Array.from(importNames).join(', ')} } from '${moduleName}'`; | ||
return `import type { ${importNames.join(', ')} } from '${moduleName}';`; | ||
}; | ||
@@ -534,17 +534,26 @@ function serialiseTranslationRuntime(value, imports, loadedTranslation) { | ||
const formatGeneric = hasTags ? '<T = string>' : ''; | ||
const formatReturn = hasTags ? 'string | T | Array<string | T>' : 'string'; | ||
const formatReturn = hasTags && imports.has('FormatXMLElementFn') ? 'ReturnType<FormatXMLElementFn<T>>' : 'string'; | ||
translationFunctionString = `${formatGeneric}(values: ${serialiseObjectToType(params)}) => ${formatReturn}`; | ||
} | ||
translationsType[encodeBackslash(key)] = translationFunctionString; | ||
translationsType[key] = translationFunctionString; | ||
} | ||
const content = Object.entries(loadedTranslation.languages).map(([languageName, translations]) => `'${encodeWithinSingleQuotes(languageName)}': createLanguage(${JSON.stringify(getTranslationMessages(translations))})`).join(','); | ||
const languagesUnionAsString = Object.keys(loadedTranslation.languages).map(l => `'${l}'`).join(' | '); | ||
return `${banner} | ||
const languageEntries = Object.entries(loadedTranslation.languages).map(([languageName, translations]) => `${JSON.stringify(languageName)}: createLanguage(${JSON.stringify(getTranslationMessages(translations))})`).join(','); | ||
return (/* ts */` | ||
// This file is automatically generated by Vocab. | ||
// To make changes update translation.json files directly. | ||
import { createLanguage, createTranslationFile } from '@vocab/core/runtime'; | ||
${serializeModuleImports(imports, '@vocab/types')} | ||
${serializeTypeImports(imports, '@vocab/core')} | ||
import { createLanguage, createTranslationFile } from '@vocab/core/runtime'; | ||
const translations = createTranslationFile<${languagesUnionAsString}, ${serialiseObjectToType(translationsType)}>({${content}}); | ||
const translations = createTranslationFile< | ||
${languagesUnionAsString}, | ||
${serialiseObjectToType(translationsType)} | ||
>({ | ||
${languageEntries} | ||
}); | ||
export default translations;`; | ||
export default translations; | ||
` | ||
); | ||
} | ||
@@ -570,11 +579,9 @@ async function generateRuntime(loadedTranslation) { | ||
params = parsedParams; | ||
messages.add(`'${encodeWithinSingleQuotes(translatedLanguage[key].message)}'`); | ||
messages.add(JSON.stringify(translatedLanguage[key].message)); | ||
} | ||
} | ||
const returnType = hasTags ? 'NonNullable<ReactNode>' : 'string'; | ||
translationTypes.set(key, { | ||
params, | ||
hasTags, | ||
message: Array.from(messages).join(' | '), | ||
returnType | ||
message: Array.from(messages).join(' | ') | ||
}); | ||
@@ -581,0 +588,0 @@ } |
import { existsSync, promises } from 'fs'; | ||
import path from 'path'; | ||
import { TYPE, parse, isSelectElement, isTagElement, isArgumentElement, isNumberElement, isPluralElement, isDateElement, isTimeElement } from '@formatjs/icu-messageformat-parser'; | ||
import { TYPE, parse, isSelectElement, isPluralElement, isTagElement, isArgumentElement, isNumberElement, isDateElement, isTimeElement } from '@formatjs/icu-messageformat-parser'; | ||
import prettier from 'prettier'; | ||
@@ -420,2 +420,9 @@ import chokidar from 'chokidar'; | ||
keys.add(uniqueKey); | ||
const globalKey = loadedTranslation.languages[config.devLanguage][key].globalKey; | ||
if (globalKey) { | ||
if (keys.has(globalKey)) { | ||
throw new Error(`Duplicate keys found. Key with global key ${globalKey} and key ${key} was found multiple times`); | ||
} | ||
keys.add(globalKey); | ||
} | ||
} | ||
@@ -426,7 +433,5 @@ } | ||
const encodeWithinSingleQuotes = v => v.replace(/'/g, "\\'"); | ||
const encodeBackslash = v => v.replace(/\\/g, '\\\\'); | ||
function extractHasTags(ast) { | ||
return ast.some(element => { | ||
if (isSelectElement(element)) { | ||
if (isSelectElement(element) || isPluralElement(element)) { | ||
const children = Object.values(element.options).map(o => o.value); | ||
@@ -489,12 +494,7 @@ return children.some(child => extractHasTags(child)); | ||
for (const [key, value] of Object.entries(v)) { | ||
if (value && typeof value === 'object') { | ||
result += `'${encodeWithinSingleQuotes(key)}': ${serialiseObjectToType(value)},`; | ||
} else { | ||
result += `'${encodeWithinSingleQuotes(key)}': ${value},`; | ||
} | ||
result += `${JSON.stringify(key)}: ${value && typeof value === 'object' ? serialiseObjectToType(value) : value},`; | ||
} | ||
return `{ ${result} }`; | ||
} | ||
const banner = `// This file is automatically generated by Vocab.\n// To make changes update translation.json files directly.`; | ||
const serializeModuleImports = (imports, moduleName) => { | ||
const serializeTypeImports = (imports, moduleName) => { | ||
if (imports.size === 0) { | ||
@@ -504,3 +504,3 @@ return ''; | ||
const importNames = Array.from(imports); | ||
return `import { ${Array.from(importNames).join(', ')} } from '${moduleName}'`; | ||
return `import type { ${importNames.join(', ')} } from '${moduleName}';`; | ||
}; | ||
@@ -518,17 +518,26 @@ function serialiseTranslationRuntime(value, imports, loadedTranslation) { | ||
const formatGeneric = hasTags ? '<T = string>' : ''; | ||
const formatReturn = hasTags ? 'string | T | Array<string | T>' : 'string'; | ||
const formatReturn = hasTags && imports.has('FormatXMLElementFn') ? 'ReturnType<FormatXMLElementFn<T>>' : 'string'; | ||
translationFunctionString = `${formatGeneric}(values: ${serialiseObjectToType(params)}) => ${formatReturn}`; | ||
} | ||
translationsType[encodeBackslash(key)] = translationFunctionString; | ||
translationsType[key] = translationFunctionString; | ||
} | ||
const content = Object.entries(loadedTranslation.languages).map(([languageName, translations]) => `'${encodeWithinSingleQuotes(languageName)}': createLanguage(${JSON.stringify(getTranslationMessages(translations))})`).join(','); | ||
const languagesUnionAsString = Object.keys(loadedTranslation.languages).map(l => `'${l}'`).join(' | '); | ||
return `${banner} | ||
const languageEntries = Object.entries(loadedTranslation.languages).map(([languageName, translations]) => `${JSON.stringify(languageName)}: createLanguage(${JSON.stringify(getTranslationMessages(translations))})`).join(','); | ||
return (/* ts */` | ||
// This file is automatically generated by Vocab. | ||
// To make changes update translation.json files directly. | ||
import { createLanguage, createTranslationFile } from '@vocab/core/runtime'; | ||
${serializeModuleImports(imports, '@vocab/types')} | ||
${serializeTypeImports(imports, '@vocab/core')} | ||
import { createLanguage, createTranslationFile } from '@vocab/core/runtime'; | ||
const translations = createTranslationFile<${languagesUnionAsString}, ${serialiseObjectToType(translationsType)}>({${content}}); | ||
const translations = createTranslationFile< | ||
${languagesUnionAsString}, | ||
${serialiseObjectToType(translationsType)} | ||
>({ | ||
${languageEntries} | ||
}); | ||
export default translations;`; | ||
export default translations; | ||
` | ||
); | ||
} | ||
@@ -554,11 +563,9 @@ async function generateRuntime(loadedTranslation) { | ||
params = parsedParams; | ||
messages.add(`'${encodeWithinSingleQuotes(translatedLanguage[key].message)}'`); | ||
messages.add(JSON.stringify(translatedLanguage[key].message)); | ||
} | ||
} | ||
const returnType = hasTags ? 'NonNullable<ReactNode>' : 'string'; | ||
translationTypes.set(key, { | ||
params, | ||
hasTags, | ||
message: Array.from(messages).join(' | '), | ||
returnType | ||
message: Array.from(messages).join(' | ') | ||
}); | ||
@@ -565,0 +572,0 @@ } |
{ | ||
"name": "@vocab/core", | ||
"version": "0.0.0-compiled-translation-import-order-20230328231631", | ||
"version": "0.0.0-global-key-support-20231025223328", | ||
"main": "dist/vocab-core.cjs.js", | ||
@@ -43,3 +43,2 @@ "module": "dist/vocab-core.esm.js", | ||
"@formatjs/icu-messageformat-parser": "^2.0.10", | ||
"@vocab/types": "^1.2.0", | ||
"chalk": "^4.1.0", | ||
@@ -46,0 +45,0 @@ "chokidar": "^3.4.3", |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
118912
9
38
3009
- Removed@vocab/types@^1.2.0
- Removed@vocab/core@1.6.2(transitive)
- Removed@vocab/types@1.3.6(transitive)
- Removedpicocolors@1.1.0(transitive)