Socket
Socket
Sign inDemoInstall

@vocab/core

Package Overview
Dependencies
Maintainers
4
Versions
39
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@vocab/core - npm Package Compare versions

Comparing version 0.0.0-compiled-translation-import-order-20230328231631 to 0.0.0-global-key-support-20231025223328

dist/declarations/src/types.d.ts

2

dist/declarations/src/compile.d.ts

@@ -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",

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc