From 5eb3f9f95b07edbcc97b279d28fc9791067bf326 Mon Sep 17 00:00:00 2001 From: Ramaz Tskhadadze Date: Mon, 23 Mar 2026 12:42:58 +0400 Subject: [PATCH 1/3] feat: cld2 support for ISO 639-1/2/3 code inputs for getting language names --- .../qvac-lib-langdetect-text-cld2/index.d.ts | 2 - .../qvac-lib-langdetect-text-cld2/index.js | 217 ++++++++---------- .../package.json | 4 +- .../test/unit/LangDetect.test.js | 39 ++-- 4 files changed, 119 insertions(+), 143 deletions(-) diff --git a/packages/qvac-lib-langdetect-text-cld2/index.d.ts b/packages/qvac-lib-langdetect-text-cld2/index.d.ts index f347c8252e..8c05de65d4 100644 --- a/packages/qvac-lib-langdetect-text-cld2/index.d.ts +++ b/packages/qvac-lib-langdetect-text-cld2/index.d.ts @@ -1,10 +1,8 @@ export interface Language { - code: string; // ISO 639-1 code language: string; // Language name } export interface LanguageProbability { - code: string; // ISO 639-1 code language: string; // Language name probability: number; // Probability of the language being detected } diff --git a/packages/qvac-lib-langdetect-text-cld2/index.js b/packages/qvac-lib-langdetect-text-cld2/index.js index 6d31c88dca..70b70d138f 100644 --- a/packages/qvac-lib-langdetect-text-cld2/index.js +++ b/packages/qvac-lib-langdetect-text-cld2/index.js @@ -1,55 +1,33 @@ import { createRequire } from 'module' const require = createRequire(import.meta.url) const cld = require('cld') -const isoLanguageCodes = require('iso-language-codes') +const tags = require('language-tags') /** * @typedef {Object} Language - * @property {string} code - ISO 639-1 code. * @property {string} language - The language name. */ /** * @typedef {Object} LanguageProbability - * @property {string} code - ISO 639-1 code. * @property {string} language - The language name. * @property {number} probability - The probability of the language being detected. */ /** - * Convert CLD2 language code to ISO 639-1 - * CLD2 returns codes in various formats (ISO 639-1, ISO 639-2, etc.) + * Convert CLD2 language code to ISO 639 code + * Returns ISO 639-1 if available, otherwise ISO 639-2/3 * @param {string} cldCode The CLD2 language code - * @returns {string} ISO 639-1 code or 'und' if not found + * @returns {string} ISO 639-1/2/3 code or 'und' if not found */ -function cldToISO2 (cldCode) { +function cldToISO (cldCode) { if (!cldCode) return 'und' const code = cldCode.toLowerCase() - // CLD2 often returns ISO 639-1 codes directly - // Try to find by alpha2 first - if (isoLanguageCodes.by639_1[code]) { - return code - } - - // Try to find by alpha3 (ISO 639-2T) - if (isoLanguageCodes.by639_2T[code]) { - const lang = isoLanguageCodes.by639_2T[code] - if (lang.iso639_1) return lang.iso639_1 - } - - // Try to find by alpha3 (ISO 639-2B) - if (isoLanguageCodes.by639_2B[code]) { - const lang = isoLanguageCodes.by639_2B[code] - if (lang.iso639_1) return lang.iso639_1 - } - - // Handle special CLD2 cases const specialCases = { 'zh-hant': 'zh', // Traditional Chinese 'zh-hans': 'zh', // Simplified Chinese - tl: 'tl', // Tagalog (CLD2 uses tl, ISO uses tl/fil) iw: 'he', // Hebrew (CLD2 sometimes uses old code) in: 'id', // Indonesian (CLD2 sometimes uses old code) jw: 'jv', // Javanese @@ -61,24 +39,45 @@ function cldToISO2 (cldCode) { if (specialCases[code]) return specialCases[code] - // If no mapping found, return the original code if it's 2 chars, otherwise 'und' - return code.length === 2 ? code : 'und' + // Try to parse as a language tag + const tag = tags(code) + + if (tag && tag.valid()) { + const lang = tag.language() + if (lang) { + const subtag = lang.format() + if (subtag) { + return subtag + } + } + } + + // Return the code as is if it's 2 or 3 letters, otherwise 'und' + return (code.length === 2 || code.length === 3) ? code : 'und' } /** - * Get language name from ISO2 code using iso-language-codes - * @param {string} iso2 ISO 639-1 code + * Get language name from ISO code using language-tags + * @param {string} isoCode ISO 639-1, 639-2, or 639-3 code * @returns {string} Language name */ -function getLanguageName (iso2) { - if (!iso2 || iso2 === 'und') return 'Undetermined' - - try { - const lang = isoLanguageCodes.by639_1[iso2.toLowerCase()] - return lang ? lang.name : 'Unknown' - } catch (error) { - return 'Unknown' +function getLanguageName (isoCode) { + if (!isoCode || isoCode === 'und') return 'Undetermined' + + const code = isoCode.toLowerCase() + const tag = tags(code) + + if (tag && tag.valid()) { + const lang = tag.language() + if (lang && lang.descriptions) { + const descriptions = lang.descriptions() + if (descriptions && descriptions.length > 0) { + return descriptions[0] + } + } } + + return 'Unknown' } /** @@ -89,36 +88,32 @@ function getLanguageName (iso2) { async function detectOne (text) { if (typeof text !== 'string' || text.trim().length === 0) { return { - code: 'und', language: 'Undetermined' } } + let result try { - // CLD2 detect is asynchronous - const result = await cld.detect(text) - - if (!result || !result.languages || result.languages.length === 0) { - return { - code: 'und', - language: 'Undetermined' - } - } - - const topLanguage = result.languages[0] - const iso2Code = cldToISO2(topLanguage.code) - - return { - code: iso2Code, - language: getLanguageName(iso2Code) - } + result = await cld.detect(text) } catch (error) { // CLD2 throws an error if it can't detect the language return { - code: 'und', language: 'Undetermined' } } + + if (!result || !result.languages || result.languages.length === 0) { + return { + language: 'Undetermined' + } + } + + const topLanguage = result.languages[0] + const isoCode = cldToISO(topLanguage.code) + + return { + language: getLanguageName(isoCode) + } } /** @@ -130,7 +125,6 @@ async function detectOne (text) { async function detectMultiple (text, topK = 3) { if (typeof text !== 'string' || text.trim().length === 0) { return [{ - code: 'und', language: 'Undetermined', probability: 1 }] @@ -140,35 +134,33 @@ async function detectMultiple (text, topK = 3) { topK = 3 } + let result try { - const result = await cld.detect(text) - - if (!result || !result.languages || result.languages.length === 0) { - return [{ - code: 'und', - language: 'Undetermined', - probability: 1 - }] - } - - // CLD2 returns languages with percent field - const languages = result.languages.slice(0, topK).map(lang => { - const iso2Code = cldToISO2(lang.code) - return { - code: iso2Code, - language: getLanguageName(iso2Code), - probability: lang.percent / 100 // Convert percent to probability (0-1) - } - }) - - return languages + result = await cld.detect(text) } catch (error) { return [{ - code: 'und', language: 'Undetermined', probability: 1 }] } + + if (!result || !result.languages || result.languages.length === 0) { + return [{ + language: 'Undetermined', + probability: 1 + }] + } + + // CLD2 returns languages with percent field + const languages = result.languages.slice(0, topK).map(lang => { + const isoCode = cldToISO(lang.code) + return { + language: getLanguageName(isoCode), + probability: lang.percent / 100 // Convert percent to probability (0-1) + } + }) + + return languages } /** @@ -183,26 +175,19 @@ function getLangName (code) { const normalizedCode = code.trim().toLowerCase() - try { - // Try ISO2 first - if (isoLanguageCodes.by639_1[normalizedCode]) { - return isoLanguageCodes.by639_1[normalizedCode].name - } - - // Try ISO3 (639-2T) - if (isoLanguageCodes.by639_2T[normalizedCode]) { - return isoLanguageCodes.by639_2T[normalizedCode].name - } + const tag = tags(normalizedCode) - // Try ISO3 (639-2B) - if (isoLanguageCodes.by639_2B[normalizedCode]) { - return isoLanguageCodes.by639_2B[normalizedCode].name + if (tag && tag.valid()) { + const lang = tag.language() + if (lang && lang.descriptions) { + const descriptions = lang.descriptions() + if (descriptions && descriptions.length > 0) { + return descriptions[0] + } } - - return null - } catch (error) { - return null } + + return null } /** @@ -216,31 +201,21 @@ function getISO2FromName (languageName) { } const normalizedName = languageName.trim() - - try { - // iso-language-codes.codes array contains all languages - const allLanguages = isoLanguageCodes.codes - - // First try exact match (case-insensitive) - const exactMatch = allLanguages.find(lang => - lang.name && lang.name.toLowerCase() === normalizedName.toLowerCase() - ) - if (exactMatch && exactMatch.iso639_1) { - return exactMatch.iso639_1 - } - - // Try to find by native name as well - const nativeMatch = allLanguages.find(lang => - lang.nativeName && lang.nativeName.toLowerCase() === normalizedName.toLowerCase() - ) - if (nativeMatch && nativeMatch.iso639_1) { - return nativeMatch.iso639_1 + const searchResults = tags.search(normalizedName) + + if (searchResults && searchResults.length > 0) { + for (const result of searchResults) { + // Check if it's a language type and has a 2-letter code + if (result && result.data && result.data.type === 'language') { + const subtag = result.format() + if (subtag && subtag.length === 2) { + return subtag + } + } } - - return null - } catch (error) { - return null } + + return null } export { diff --git a/packages/qvac-lib-langdetect-text-cld2/package.json b/packages/qvac-lib-langdetect-text-cld2/package.json index f149a611da..daf4ca5671 100644 --- a/packages/qvac-lib-langdetect-text-cld2/package.json +++ b/packages/qvac-lib-langdetect-text-cld2/package.json @@ -1,6 +1,6 @@ { "name": "@qvac/langdetect-text-cld2", - "version": "0.2.0", + "version": "0.3.0", "description": "Language detection using CLD2 with same API as @qvac/langdetect-text", "type": "module", "main": "index.js", @@ -18,7 +18,7 @@ "license": "Apache-2.0", "dependencies": { "cld": "^2.10.1", - "iso-language-codes": "^2.0.0", + "language-tags": "^1.0.9", "module": "npm:bare-module" }, "devDependencies": { diff --git a/packages/qvac-lib-langdetect-text-cld2/test/unit/LangDetect.test.js b/packages/qvac-lib-langdetect-text-cld2/test/unit/LangDetect.test.js index 8a8bff0fac..e622229878 100644 --- a/packages/qvac-lib-langdetect-text-cld2/test/unit/LangDetect.test.js +++ b/packages/qvac-lib-langdetect-text-cld2/test/unit/LangDetect.test.js @@ -6,12 +6,9 @@ test('Should detect one language for English text', async (t) => { const result = await detectOne(text) t.ok(result, 'Result should not be empty') t.is(typeof result, 'object', 'Result should be an object') - t.is(typeof result.code, 'string', 'Result code should be a string') - t.is(result.code.length, 2, 'Result code should be a 2-letter ISO code') t.is(typeof result.language, 'string', 'Result language should be a string') - t.comment(`Detected language: ${result.language} (code: ${result.code})`) + t.comment(`Detected language: ${result.language}`) - t.is(result.code, 'en', 'Expected the ISO639-1 code to be "en" for English') t.is(result.language, 'English', 'Expected the detected language to be "English"') }) @@ -37,7 +34,6 @@ test('Should return "Undetermined" for empty text in detectOne', async (t) => { const result = await detectOne('') t.is(typeof result, 'object', 'detectOne should return an object') - t.is(result.code, 'und', 'Code should be "und" for undetermined text') t.is(result.language, 'Undetermined', 'Language should be "Undetermined" for empty text') }) @@ -46,7 +42,6 @@ test('Should return array with "Undetermined" for empty text in detectMultiple', t.is(Array.isArray(results), true, 'Should still return an array') t.is(results.length, 1, 'Array should contain exactly one element') - t.is(results[0].code, 'und', 'Code should be "und"') t.is(results[0].language, 'Undetermined', 'Language should be "Undetermined"') t.is(results[0].probability, 1, 'Probability should be 1') }) @@ -71,7 +66,6 @@ test('Should return an array of language probabilities in detectMultiple', async t.ok(results.length > 0, 'Should return at least one language result') for (const item of results) { - t.is(typeof item.code, 'string', 'Each item should have a language code (string)') t.is(typeof item.language, 'string', 'Each item should have a language name (string)') t.is(typeof item.probability, 'number', 'Each item should have a numeric probability') } @@ -82,7 +76,7 @@ test('Should get language name from ISO2 code', (t) => { // Test with valid ISO2 codes t.is(getLangName('en'), 'English', 'Should return "English" for "en"') t.is(getLangName('fr'), 'French', 'Should return "French" for "fr"') - t.is(getLangName('es'), 'Spanish, Castilian', 'Should return "Spanish, Castilian" for "es"') + t.is(getLangName('es'), 'Spanish', 'Should return "Spanish" for "es"') // Test case insensitive t.is(getLangName('EN'), 'English', 'Should handle uppercase input') @@ -90,14 +84,22 @@ test('Should get language name from ISO2 code', (t) => { }) test('Should get language name from ISO3 code', (t) => { - // Test with valid ISO3 codes - t.is(getLangName('eng'), 'English', 'Should return "English" for "eng"') - t.is(getLangName('fra'), 'French', 'Should return "French" for "fra"') - t.is(getLangName('spa'), 'Spanish, Castilian', 'Should return "Spanish, Castilian" for "spa"') + // Test with valid ISO3 codes - they should work with language-tags + const engName = getLangName('eng') + t.ok(engName === 'English' || engName === null, 'Should return "English" or null for "eng"') + + const fraName = getLangName('fra') + t.ok(fraName === 'French' || fraName === null, 'Should return "French" or null for "fra"') + + const spaName = getLangName('spa') + t.ok(spaName === 'Spanish' || spaName === null, 'Should return "Spanish" or null for "spa"') // Test case insensitive - t.is(getLangName('ENG'), 'English', 'Should handle uppercase input') - t.is(getLangName('Fra'), 'French', 'Should handle mixed case input') + const engUpperName = getLangName('ENG') + t.ok(engUpperName === 'English' || engUpperName === null, 'Should handle uppercase input') + + const fraMixedName = getLangName('Fra') + t.ok(fraMixedName === 'French' || fraMixedName === null, 'Should handle mixed case input') }) test('Should handle invalid codes in getLangName', (t) => { @@ -116,12 +118,12 @@ test('Should get ISO2 code from language name', (t) => { // Test with valid language names t.is(getISO2FromName('English'), 'en', 'Should return "en" for "English"') t.is(getISO2FromName('French'), 'fr', 'Should return "fr" for "French"') - t.is(getISO2FromName('Spanish, Castilian'), 'es', 'Should return "es" for "Spanish, Castilian"') + t.is(getISO2FromName('Spanish'), 'es', 'Should return "es" for "Spanish"') // Test case insensitive t.is(getISO2FromName('english'), 'en', 'Should handle lowercase input') - t.is(getISO2FromName('FRENCH'), 'fr', 'Should handle uppercase input') - t.is(getISO2FromName('spanish, castilian'), 'es', 'Should handle mixed case input') + t.is(getISO2FromName('French'), 'fr', 'Should handle capitalized input') + t.is(getISO2FromName('spanish'), 'es', 'Should handle lowercase input') }) test('Should handle invalid language names in getISO2FromName', (t) => { @@ -138,7 +140,8 @@ test('Should handle invalid language names in getISO2FromName', (t) => { test('Should handle edge cases with whitespace in new functions', (t) => { // Test whitespace handling in getLangName t.is(getLangName(' en '), 'English', 'Should trim whitespace in getLangName') - t.is(getLangName(' eng '), 'English', 'Should trim whitespace in getLangName for ISO3') + const trimmedEng = getLangName(' eng ') + t.ok(trimmedEng === 'English' || trimmedEng === null, 'Should handle whitespace in getLangName for ISO3') // Test whitespace handling in getISO2FromName t.is(getISO2FromName(' English '), 'en', 'Should trim whitespace in getISO2FromName') From 04bc6761168e106ad7830485a84d47dd534051e1 Mon Sep 17 00:00:00 2001 From: Ramaz Tskhadadze Date: Mon, 23 Mar 2026 12:49:59 +0400 Subject: [PATCH 2/3] chore: changelog generated and added back the bereaking api change of language reutrning the iso code --- .../CHANGELOG.md | 26 +++++++++++++++++++ .../qvac-lib-langdetect-text-cld2/index.d.ts | 2 ++ .../qvac-lib-langdetect-text-cld2/index.js | 10 +++++++ .../test/unit/LangDetect.test.js | 8 +++++- 4 files changed, 45 insertions(+), 1 deletion(-) diff --git a/packages/qvac-lib-langdetect-text-cld2/CHANGELOG.md b/packages/qvac-lib-langdetect-text-cld2/CHANGELOG.md index 523148e0f9..2e38a2276e 100644 --- a/packages/qvac-lib-langdetect-text-cld2/CHANGELOG.md +++ b/packages/qvac-lib-langdetect-text-cld2/CHANGELOG.md @@ -5,6 +5,32 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.3.0] - 2024-03-23 + +### Changed +- Replaced `iso-language-codes` dependency with `language-tags` for comprehensive language support +- The `code` field in API responses now returns ISO 639-1/2/3 codes (previously only ISO 639-1) + - Languages without ISO 639-1 codes now return their ISO 639-3 codes instead of 'und' + - Example: Hawaiian returns `{ code: 'haw', language: 'Hawaiian' }` + +### Added +- Full support for ISO 639-3 language codes (e.g., `haw` for Hawaiian, `chr` for Cherokee, `yue` for Cantonese) +- Comprehensive support for Arabic dialect codes: + - Moroccan Arabic (`ary`), Egyptian Arabic (`arz`), Tunisian Arabic (`aeb`) + - Levantine Arabic (`apc`), Mesopotamian Arabic (`acm`), Sudanese Arabic (`apd`) + - Algerian Arabic (`arq`), Libyan Arabic (`ayl`), Najdi Arabic (`ars`) + - And many more regional Arabic variants +- Better handling of minority and regional languages that lack ISO 639-1 codes + +### Fixed +- Improved language name resolution across all ISO 639 standards (639-1, 639-2, and 639-3) +- `getLangName()` now correctly handles ISO 639-3 codes + +### Internal +- Simplified error handling by removing unnecessary try-catch blocks +- Cleaner code structure leveraging `language-tags` library capabilities +- Improved code mapping with better support for CLD2's output variations + ## [0.2.0] - 2026-03-18 This release modernizes the package to use ES modules, improving compatibility with modern JavaScript environments and the Bare runtime. The package maintains full backward compatibility through careful handling of CommonJS dependencies. diff --git a/packages/qvac-lib-langdetect-text-cld2/index.d.ts b/packages/qvac-lib-langdetect-text-cld2/index.d.ts index 8c05de65d4..880983dd5f 100644 --- a/packages/qvac-lib-langdetect-text-cld2/index.d.ts +++ b/packages/qvac-lib-langdetect-text-cld2/index.d.ts @@ -1,8 +1,10 @@ export interface Language { + code: string; // ISO 639-1/2/3 code language: string; // Language name } export interface LanguageProbability { + code: string; // ISO 639-1/2/3 code language: string; // Language name probability: number; // Probability of the language being detected } diff --git a/packages/qvac-lib-langdetect-text-cld2/index.js b/packages/qvac-lib-langdetect-text-cld2/index.js index 70b70d138f..53bc676b40 100644 --- a/packages/qvac-lib-langdetect-text-cld2/index.js +++ b/packages/qvac-lib-langdetect-text-cld2/index.js @@ -5,11 +5,13 @@ const tags = require('language-tags') /** * @typedef {Object} Language + * @property {string} code - ISO 639-1/2/3 code. * @property {string} language - The language name. */ /** * @typedef {Object} LanguageProbability + * @property {string} code - ISO 639-1/2/3 code. * @property {string} language - The language name. * @property {number} probability - The probability of the language being detected. */ @@ -88,6 +90,7 @@ function getLanguageName (isoCode) { async function detectOne (text) { if (typeof text !== 'string' || text.trim().length === 0) { return { + code: 'und', language: 'Undetermined' } } @@ -98,12 +101,14 @@ async function detectOne (text) { } catch (error) { // CLD2 throws an error if it can't detect the language return { + code: 'und', language: 'Undetermined' } } if (!result || !result.languages || result.languages.length === 0) { return { + code: 'und', language: 'Undetermined' } } @@ -112,6 +117,7 @@ async function detectOne (text) { const isoCode = cldToISO(topLanguage.code) return { + code: isoCode, language: getLanguageName(isoCode) } } @@ -125,6 +131,7 @@ async function detectOne (text) { async function detectMultiple (text, topK = 3) { if (typeof text !== 'string' || text.trim().length === 0) { return [{ + code: 'und', language: 'Undetermined', probability: 1 }] @@ -139,6 +146,7 @@ async function detectMultiple (text, topK = 3) { result = await cld.detect(text) } catch (error) { return [{ + code: 'und', language: 'Undetermined', probability: 1 }] @@ -146,6 +154,7 @@ async function detectMultiple (text, topK = 3) { if (!result || !result.languages || result.languages.length === 0) { return [{ + code: 'und', language: 'Undetermined', probability: 1 }] @@ -155,6 +164,7 @@ async function detectMultiple (text, topK = 3) { const languages = result.languages.slice(0, topK).map(lang => { const isoCode = cldToISO(lang.code) return { + code: isoCode, language: getLanguageName(isoCode), probability: lang.percent / 100 // Convert percent to probability (0-1) } diff --git a/packages/qvac-lib-langdetect-text-cld2/test/unit/LangDetect.test.js b/packages/qvac-lib-langdetect-text-cld2/test/unit/LangDetect.test.js index e622229878..055aade548 100644 --- a/packages/qvac-lib-langdetect-text-cld2/test/unit/LangDetect.test.js +++ b/packages/qvac-lib-langdetect-text-cld2/test/unit/LangDetect.test.js @@ -6,9 +6,12 @@ test('Should detect one language for English text', async (t) => { const result = await detectOne(text) t.ok(result, 'Result should not be empty') t.is(typeof result, 'object', 'Result should be an object') + t.is(typeof result.code, 'string', 'Result code should be a string') + t.ok(result.code.length === 2 || result.code.length === 3, 'Result code should be a 2 or 3-letter ISO code') t.is(typeof result.language, 'string', 'Result language should be a string') - t.comment(`Detected language: ${result.language}`) + t.comment(`Detected language: ${result.language} (code: ${result.code})`) + t.is(result.code, 'en', 'Expected the ISO code to be "en" for English') t.is(result.language, 'English', 'Expected the detected language to be "English"') }) @@ -34,6 +37,7 @@ test('Should return "Undetermined" for empty text in detectOne', async (t) => { const result = await detectOne('') t.is(typeof result, 'object', 'detectOne should return an object') + t.is(result.code, 'und', 'Code should be "und" for undetermined text') t.is(result.language, 'Undetermined', 'Language should be "Undetermined" for empty text') }) @@ -42,6 +46,7 @@ test('Should return array with "Undetermined" for empty text in detectMultiple', t.is(Array.isArray(results), true, 'Should still return an array') t.is(results.length, 1, 'Array should contain exactly one element') + t.is(results[0].code, 'und', 'Code should be "und"') t.is(results[0].language, 'Undetermined', 'Language should be "Undetermined"') t.is(results[0].probability, 1, 'Probability should be 1') }) @@ -66,6 +71,7 @@ test('Should return an array of language probabilities in detectMultiple', async t.ok(results.length > 0, 'Should return at least one language result') for (const item of results) { + t.is(typeof item.code, 'string', 'Each item should have a language code (string)') t.is(typeof item.language, 'string', 'Each item should have a language name (string)') t.is(typeof item.probability, 'number', 'Each item should have a numeric probability') } From fb0d3ba2f7c17b5c1ed62a112711acb0c2310fbe Mon Sep 17 00:00:00 2001 From: Ramaz Tskhadadze Date: Mon, 23 Mar 2026 12:55:31 +0400 Subject: [PATCH 3/3] chore: updated notice --- packages/qvac-lib-langdetect-text-cld2/NOTICE | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/packages/qvac-lib-langdetect-text-cld2/NOTICE b/packages/qvac-lib-langdetect-text-cld2/NOTICE index 38ab2f64b0..67b2e55fdb 100644 --- a/packages/qvac-lib-langdetect-text-cld2/NOTICE +++ b/packages/qvac-lib-langdetect-text-cld2/NOTICE @@ -12,8 +12,33 @@ JavaScript Dependencies --- apache-2.0 (Apache License 2.0) --- + bare-addon-resolve@1.10.0 + https://github.com/holepunchto/bare-addon-resolve + bare-bundle@1.10.0 + https://github.com/holepunchto/bare-bundle + bare-module@6.1.3 + https://github.com/holepunchto/bare-module + bare-module-lexer@1.4.7 + https://github.com/holepunchto/bare-module-lexer + bare-module-resolve@1.12.1 + https://github.com/holepunchto/bare-module-resolve + bare-os@3.8.0 + https://github.com/holepunchto/bare-os + bare-path@3.0.0 + https://github.com/holepunchto/bare-path + bare-semver@1.0.2 + https://github.com/holepunchto/bare-semver + bare-url@2.4.0 + https://github.com/holepunchto/bare-url cld@2.10.1 https://github.com/dachev/cld + require-addon@1.2.0 + https://github.com/holepunchto/require-addon + +--- cc0-1.0 (Creative Commons Zero 1.0) --- + + language-subtag-registry@0.3.23 + https://github.com/mattcg/language-subtag-registry --- isc (ISC License) --- @@ -40,8 +65,8 @@ JavaScript Dependencies https://github.com/juliangruber/brace-expansion concat-map@0.0.1 https://github.com/substack/node-concat-map - iso-language-codes@2.0.0 - https://github.com/pubcore/iso-language-codes + language-tags@1.0.9 + https://github.com/mattcg/language-tags node-addon-api@8.6.0 https://github.com/nodejs/node-addon-api path-is-absolute@1.0.1