lingo.dev 0.117.8 → 0.117.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cli.cjs +261 -134
- package/build/cli.cjs.map +1 -1
- package/build/cli.mjs +138 -11
- package/build/cli.mjs.map +1 -1
- package/package.json +4 -4
package/build/cli.mjs
CHANGED
|
@@ -2321,9 +2321,119 @@ function _isMetadataKey(key) {
|
|
|
2321
2321
|
return key.startsWith("@");
|
|
2322
2322
|
}
|
|
2323
2323
|
|
|
2324
|
+
// src/cli/loaders/ail.ts
|
|
2325
|
+
import { parseStringPromise, Builder } from "xml2js";
|
|
2326
|
+
function createAilLoader() {
|
|
2327
|
+
return createLoader({
|
|
2328
|
+
async pull(locale, input2) {
|
|
2329
|
+
const result = {};
|
|
2330
|
+
if (!input2 || !input2.trim()) {
|
|
2331
|
+
return result;
|
|
2332
|
+
}
|
|
2333
|
+
try {
|
|
2334
|
+
const parsed = await parseStringPromise(input2, {
|
|
2335
|
+
explicitArray: true,
|
|
2336
|
+
// Always use arrays for consistency
|
|
2337
|
+
mergeAttrs: false,
|
|
2338
|
+
// Keep attributes separate in $
|
|
2339
|
+
trim: true,
|
|
2340
|
+
explicitRoot: true
|
|
2341
|
+
});
|
|
2342
|
+
const dictionary = parsed.DICTIONARY;
|
|
2343
|
+
if (!dictionary) {
|
|
2344
|
+
return result;
|
|
2345
|
+
}
|
|
2346
|
+
const entries = dictionary.ENTRY || [];
|
|
2347
|
+
for (const entry of entries) {
|
|
2348
|
+
const id = entry.$?.id;
|
|
2349
|
+
if (!id) {
|
|
2350
|
+
continue;
|
|
2351
|
+
}
|
|
2352
|
+
const strings = entry.STRING || [];
|
|
2353
|
+
const sourceString = strings.find(
|
|
2354
|
+
(s) => s.$?.lang === locale
|
|
2355
|
+
);
|
|
2356
|
+
if (sourceString?.$.value) {
|
|
2357
|
+
result[id] = sourceString.$.value;
|
|
2358
|
+
}
|
|
2359
|
+
}
|
|
2360
|
+
return result;
|
|
2361
|
+
} catch (error) {
|
|
2362
|
+
console.error("Failed to parse AIL file:", error);
|
|
2363
|
+
return result;
|
|
2364
|
+
}
|
|
2365
|
+
},
|
|
2366
|
+
async push(locale, data, originalInput) {
|
|
2367
|
+
if (!originalInput || !originalInput.trim()) {
|
|
2368
|
+
const dictionary = {
|
|
2369
|
+
$: { type: "multilanguage" },
|
|
2370
|
+
ENTRY: Object.entries(data).map(([id, value]) => ({
|
|
2371
|
+
$: { id },
|
|
2372
|
+
STRING: [
|
|
2373
|
+
{
|
|
2374
|
+
$: { lang: locale, value }
|
|
2375
|
+
}
|
|
2376
|
+
]
|
|
2377
|
+
}))
|
|
2378
|
+
};
|
|
2379
|
+
const builder = new Builder({
|
|
2380
|
+
xmldec: { version: "1.0", encoding: "UTF-8" },
|
|
2381
|
+
headless: false
|
|
2382
|
+
});
|
|
2383
|
+
return builder.buildObject({ DICTIONARY: dictionary });
|
|
2384
|
+
}
|
|
2385
|
+
try {
|
|
2386
|
+
const parsed = await parseStringPromise(originalInput, {
|
|
2387
|
+
explicitArray: true,
|
|
2388
|
+
mergeAttrs: false,
|
|
2389
|
+
trim: true,
|
|
2390
|
+
explicitRoot: true
|
|
2391
|
+
});
|
|
2392
|
+
const dictionary = parsed.DICTIONARY;
|
|
2393
|
+
if (!dictionary) {
|
|
2394
|
+
throw new Error("No DICTIONARY root element found");
|
|
2395
|
+
}
|
|
2396
|
+
const entries = dictionary.ENTRY || [];
|
|
2397
|
+
for (const [id, value] of Object.entries(data)) {
|
|
2398
|
+
let entry = entries.find((e) => e.$?.id === id);
|
|
2399
|
+
if (!entry) {
|
|
2400
|
+
entry = {
|
|
2401
|
+
$: { id },
|
|
2402
|
+
STRING: []
|
|
2403
|
+
};
|
|
2404
|
+
entries.push(entry);
|
|
2405
|
+
}
|
|
2406
|
+
if (!entry.STRING) {
|
|
2407
|
+
entry.STRING = [];
|
|
2408
|
+
}
|
|
2409
|
+
let targetString = entry.STRING.find(
|
|
2410
|
+
(s) => s.$?.lang === locale
|
|
2411
|
+
);
|
|
2412
|
+
if (targetString) {
|
|
2413
|
+
targetString.$.value = value;
|
|
2414
|
+
} else {
|
|
2415
|
+
entry.STRING.push({
|
|
2416
|
+
$: { lang: locale, value }
|
|
2417
|
+
});
|
|
2418
|
+
}
|
|
2419
|
+
}
|
|
2420
|
+
dictionary.ENTRY = entries;
|
|
2421
|
+
const builder = new Builder({
|
|
2422
|
+
xmldec: { version: "1.0", encoding: "UTF-8" },
|
|
2423
|
+
headless: false
|
|
2424
|
+
});
|
|
2425
|
+
return builder.buildObject({ DICTIONARY: dictionary });
|
|
2426
|
+
} catch (error) {
|
|
2427
|
+
console.error("Failed to build AIL file:", error);
|
|
2428
|
+
throw error;
|
|
2429
|
+
}
|
|
2430
|
+
}
|
|
2431
|
+
});
|
|
2432
|
+
}
|
|
2433
|
+
|
|
2324
2434
|
// src/cli/loaders/android.ts
|
|
2325
2435
|
import { createRequire } from "module";
|
|
2326
|
-
import { parseStringPromise } from "xml2js";
|
|
2436
|
+
import { parseStringPromise as parseStringPromise2 } from "xml2js";
|
|
2327
2437
|
var require2 = createRequire(import.meta.url);
|
|
2328
2438
|
var sax = require2("sax");
|
|
2329
2439
|
var defaultAndroidResourcesXml = `<?xml version="1.0" encoding="utf-8"?>
|
|
@@ -2401,7 +2511,7 @@ function resolveXmlDeclaration(xml) {
|
|
|
2401
2511
|
}
|
|
2402
2512
|
async function parseAndroidDocument(input2) {
|
|
2403
2513
|
const xmlToParse = input2 && input2.trim().length > 0 ? input2 : defaultAndroidResourcesXml;
|
|
2404
|
-
const parsed = await
|
|
2514
|
+
const parsed = await parseStringPromise2(xmlToParse, {
|
|
2405
2515
|
explicitArray: true,
|
|
2406
2516
|
explicitChildren: true,
|
|
2407
2517
|
preserveChildrenOrder: true,
|
|
@@ -4005,7 +4115,7 @@ function applyTranslations(node, path19, data, pathMap) {
|
|
|
4005
4115
|
}
|
|
4006
4116
|
|
|
4007
4117
|
// src/cli/loaders/mjml.ts
|
|
4008
|
-
import { parseStringPromise as
|
|
4118
|
+
import { parseStringPromise as parseStringPromise3 } from "xml2js";
|
|
4009
4119
|
import * as htmlparser22 from "htmlparser2";
|
|
4010
4120
|
import { DomHandler as DomHandler2 } from "domhandler";
|
|
4011
4121
|
var LOCALIZABLE_COMPONENTS = [
|
|
@@ -4036,8 +4146,11 @@ function createMjmlLoader() {
|
|
|
4036
4146
|
return createLoader({
|
|
4037
4147
|
async pull(locale, input2) {
|
|
4038
4148
|
const result = {};
|
|
4149
|
+
if (!input2 || input2.trim() === "") {
|
|
4150
|
+
return result;
|
|
4151
|
+
}
|
|
4039
4152
|
try {
|
|
4040
|
-
const parsed = await
|
|
4153
|
+
const parsed = await parseStringPromise3(input2, {
|
|
4041
4154
|
explicitArray: true,
|
|
4042
4155
|
explicitChildren: true,
|
|
4043
4156
|
preserveChildrenOrder: true,
|
|
@@ -4082,8 +4195,11 @@ function createMjmlLoader() {
|
|
|
4082
4195
|
return result;
|
|
4083
4196
|
},
|
|
4084
4197
|
async push(locale, data, originalInput) {
|
|
4198
|
+
if (!originalInput || originalInput.trim() === "") {
|
|
4199
|
+
return originalInput || "";
|
|
4200
|
+
}
|
|
4085
4201
|
try {
|
|
4086
|
-
const parsed = await
|
|
4202
|
+
const parsed = await parseStringPromise3(originalInput, {
|
|
4087
4203
|
explicitArray: true,
|
|
4088
4204
|
explicitChildren: true,
|
|
4089
4205
|
preserveChildrenOrder: true,
|
|
@@ -4225,11 +4341,10 @@ function convertDomToXmlNode(domNode) {
|
|
|
4225
4341
|
return null;
|
|
4226
4342
|
}
|
|
4227
4343
|
function serializeMjml(parsed) {
|
|
4228
|
-
const xmlDec = '<?xml version="1.0" encoding="UTF-8"?>\n';
|
|
4229
4344
|
const rootKey = Object.keys(parsed).find((key) => !key.startsWith("_") && !key.startsWith("$"));
|
|
4230
4345
|
const rootNode = rootKey ? parsed[rootKey] : parsed;
|
|
4231
4346
|
const body = serializeElement2(rootNode);
|
|
4232
|
-
return
|
|
4347
|
+
return body;
|
|
4233
4348
|
}
|
|
4234
4349
|
function serializeElement2(node, indent2 = "") {
|
|
4235
4350
|
if (!node) {
|
|
@@ -5865,7 +5980,7 @@ function pushNewFile(locale, translations, originalLocale) {
|
|
|
5865
5980
|
}
|
|
5866
5981
|
|
|
5867
5982
|
// src/cli/loaders/xml.ts
|
|
5868
|
-
import { parseStringPromise as
|
|
5983
|
+
import { parseStringPromise as parseStringPromise4, Builder as Builder3 } from "xml2js";
|
|
5869
5984
|
function normalizeXMLString(xmlString) {
|
|
5870
5985
|
return xmlString.replace(/\s+/g, " ").replace(/>\s+</g, "><").replace("\n", "").trim();
|
|
5871
5986
|
}
|
|
@@ -5874,7 +5989,7 @@ function createXmlLoader() {
|
|
|
5874
5989
|
async pull(locale, input2) {
|
|
5875
5990
|
let result = {};
|
|
5876
5991
|
try {
|
|
5877
|
-
const parsed = await
|
|
5992
|
+
const parsed = await parseStringPromise4(input2, {
|
|
5878
5993
|
explicitArray: false,
|
|
5879
5994
|
mergeAttrs: false,
|
|
5880
5995
|
normalize: true,
|
|
@@ -5892,7 +6007,7 @@ function createXmlLoader() {
|
|
|
5892
6007
|
},
|
|
5893
6008
|
async push(locale, data) {
|
|
5894
6009
|
try {
|
|
5895
|
-
const builder = new
|
|
6010
|
+
const builder = new Builder3({ headless: true });
|
|
5896
6011
|
const xmlOutput = builder.buildObject(data);
|
|
5897
6012
|
const expectedOutput = normalizeXMLString(xmlOutput);
|
|
5898
6013
|
return expectedOutput;
|
|
@@ -9746,6 +9861,18 @@ function createBucketLoader(bucketType, bucketPathPattern, options, lockedKeys,
|
|
|
9746
9861
|
switch (bucketType) {
|
|
9747
9862
|
default:
|
|
9748
9863
|
throw new Error(`Unsupported bucket type: ${bucketType}`);
|
|
9864
|
+
case "ail":
|
|
9865
|
+
return composeLoaders(
|
|
9866
|
+
createTextFileLoader(bucketPathPattern),
|
|
9867
|
+
createLockedPatternsLoader(lockedPatterns),
|
|
9868
|
+
createAilLoader(),
|
|
9869
|
+
createEnsureKeyOrderLoader(),
|
|
9870
|
+
createFlatLoader(),
|
|
9871
|
+
createLockedKeysLoader(lockedKeys || []),
|
|
9872
|
+
createIgnoredKeysLoader(ignoredKeys || []),
|
|
9873
|
+
createSyncLoader(),
|
|
9874
|
+
createUnlocalizableLoader(options.returnUnlocalizedKeys)
|
|
9875
|
+
);
|
|
9749
9876
|
case "android":
|
|
9750
9877
|
return composeLoaders(
|
|
9751
9878
|
createTextFileLoader(bucketPathPattern),
|
|
@@ -14473,7 +14600,7 @@ async function renderHero2() {
|
|
|
14473
14600
|
// package.json
|
|
14474
14601
|
var package_default = {
|
|
14475
14602
|
name: "lingo.dev",
|
|
14476
|
-
version: "0.117.
|
|
14603
|
+
version: "0.117.10",
|
|
14477
14604
|
description: "Lingo.dev CLI",
|
|
14478
14605
|
private: false,
|
|
14479
14606
|
publishConfig: {
|