lingo.dev 0.114.0 → 0.114.1

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.mjs CHANGED
@@ -2363,7 +2363,7 @@ async function parseAndroidDocument(input2) {
2363
2363
  function buildPullResult(document) {
2364
2364
  const result = {};
2365
2365
  for (const resource of document.resourceNodes) {
2366
- if (!resource.translatable) {
2366
+ if (!isTranslatable(resource)) {
2367
2367
  continue;
2368
2368
  }
2369
2369
  switch (resource.type) {
@@ -2406,6 +2406,9 @@ function buildPullResult(document) {
2406
2406
  }
2407
2407
  return result;
2408
2408
  }
2409
+ function isTranslatable(resource) {
2410
+ return resource.translatable;
2411
+ }
2409
2412
  function buildTranslatedDocument(payload, existingDocument, sourceDocument) {
2410
2413
  const templateDocument = sourceDocument;
2411
2414
  const finalDocument = cloneDocumentStructure(templateDocument);
@@ -2434,6 +2437,9 @@ function buildTranslatedDocument(payload, existingDocument, sourceDocument) {
2434
2437
  if (finalMap.has(resource.name)) {
2435
2438
  continue;
2436
2439
  }
2440
+ if (!isTranslatable(resource)) {
2441
+ continue;
2442
+ }
2437
2443
  const cloned = cloneResourceNode(resource);
2438
2444
  appendResourceNode(finalDocument, cloned);
2439
2445
  finalMap.set(cloned.name, cloned);
@@ -2550,7 +2556,7 @@ function appendResourceNode(document, resourceNode) {
2550
2556
  document.resourceNodes.push(resourceNode);
2551
2557
  }
2552
2558
  function setTextualNodeContent(node, value, useCdata) {
2553
- const escapedValue = useCdata ? value : escapeAndroidString(value);
2559
+ const escapedValue = useCdata ? escapeApostrophesOnly(value) : escapeAndroidString(value);
2554
2560
  node._ = escapedValue;
2555
2561
  node.$$ = node.$$ ?? [];
2556
2562
  let textNode = node.$$.find(
@@ -2561,7 +2567,7 @@ function setTextualNodeContent(node, value, useCdata) {
2561
2567
  node.$$.push(textNode);
2562
2568
  }
2563
2569
  textNode["#name"] = useCdata ? "__cdata" : "__text__";
2564
- textNode._ = useCdata ? value : escapedValue;
2570
+ textNode._ = escapedValue;
2565
2571
  }
2566
2572
  function buildResourceNameMap(document) {
2567
2573
  const map = /* @__PURE__ */ new Map();
@@ -2721,6 +2727,9 @@ function asInteger(value, name) {
2721
2727
  function escapeAndroidString(value) {
2722
2728
  return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/(?<!\\)'/g, "\\'");
2723
2729
  }
2730
+ function escapeApostrophesOnly(value) {
2731
+ return value.replace(/(?<!\\)'/g, "\\'");
2732
+ }
2724
2733
  function segmentsToString(segments) {
2725
2734
  return segments.map((segment) => segment.value).join("");
2726
2735
  }
@@ -2851,13 +2860,42 @@ function createResourceNodeFromValue(name, value) {
2851
2860
  }
2852
2861
  }
2853
2862
  function cloneDocumentStructure(document) {
2863
+ const translatableResources = document.resourceNodes.filter(isTranslatable);
2854
2864
  const resourcesClone = deepClone(document.resources);
2855
2865
  const lookup = buildResourceLookup(resourcesClone);
2856
2866
  const resourceNodes = [];
2857
- for (const resource of document.resourceNodes) {
2867
+ for (const resource of translatableResources) {
2858
2868
  const cloned = cloneResourceNodeFromLookup(resource, lookup);
2859
2869
  resourceNodes.push(cloned);
2860
2870
  }
2871
+ if (resourcesClone.$$ && Array.isArray(resourcesClone.$$)) {
2872
+ const includedKeys = new Set(
2873
+ resourceNodes.map((r) => resourceLookupKey(r.type, r.name))
2874
+ );
2875
+ let filtered = resourcesClone.$$.filter((child) => {
2876
+ const elementName = child?.["#name"];
2877
+ const name = child?.$?.name;
2878
+ if (!isResourceElementName(elementName) || !name) {
2879
+ return true;
2880
+ }
2881
+ return includedKeys.has(resourceLookupKey(elementName, name));
2882
+ });
2883
+ const cleaned = [];
2884
+ let lastWasWhitespace = false;
2885
+ for (const child of filtered) {
2886
+ const isWhitespace = child?.["#name"] === "__text__" && (!child._ || child._.trim() === "");
2887
+ if (isWhitespace) {
2888
+ if (!lastWasWhitespace) {
2889
+ cleaned.push(child);
2890
+ lastWasWhitespace = true;
2891
+ }
2892
+ } else {
2893
+ cleaned.push(child);
2894
+ lastWasWhitespace = false;
2895
+ }
2896
+ }
2897
+ resourcesClone.$$ = cleaned;
2898
+ }
2861
2899
  return {
2862
2900
  resources: resourcesClone,
2863
2901
  resourceNodes
@@ -13458,7 +13496,7 @@ async function renderHero2() {
13458
13496
  // package.json
13459
13497
  var package_default = {
13460
13498
  name: "lingo.dev",
13461
- version: "0.114.0",
13499
+ version: "0.114.1",
13462
13500
  description: "Lingo.dev CLI",
13463
13501
  private: false,
13464
13502
  publishConfig: {