gt 2.14.41 → 2.14.42

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # gtx-cli
2
2
 
3
+ ## 2.14.42
4
+
5
+ ### Patch Changes
6
+
7
+ - [#1491](https://github.com/generaltranslation/gt/pull/1491) [`205c246`](https://github.com/generaltranslation/gt/commit/205c24647b9f50a68358ee6c3332d110a77ce1b3) Thanks [@fernando-aviles](https://github.com/fernando-aviles)! - Handle derived children with whitespace
8
+
3
9
  ## 2.14.41
4
10
 
5
11
  ### Patch Changes
@@ -24,7 +24,17 @@ function getFilteredLocaleOptions(query) {
24
24
  const normalizedQuery = query.trim().toLowerCase();
25
25
  const options = getLocaleOptions();
26
26
  if (!normalizedQuery) return options;
27
- return options.filter((option) => option.searchable.includes(normalizedQuery));
27
+ return options.filter((option) => option.searchable.includes(normalizedQuery)).sort((left, right) => getLocaleSearchRank(left, normalizedQuery) - getLocaleSearchRank(right, normalizedQuery));
28
+ }
29
+ function getLocaleSearchRank(option, query) {
30
+ const code = option.code.toLowerCase();
31
+ const name = option.name.toLowerCase();
32
+ const nativeName = option.nativeName.toLowerCase();
33
+ if (code === query) return 0;
34
+ if (code.startsWith(query)) return 1;
35
+ if (name.startsWith(query)) return 2;
36
+ if (nativeName.startsWith(query)) return 3;
37
+ return 4;
28
38
  }
29
39
  //#endregion
30
40
  export { getFilteredLocaleOptions, getLocaleCodeWidth, getLocaleOptions };
@@ -1 +1 @@
1
- {"version":3,"file":"inkLocaleData.js","names":[],"sources":["../../src/console/inkLocaleData.ts"],"sourcesContent":["import { listSupportedLocales } from '@generaltranslation/supported-locales';\nimport { getLocaleProperties } from 'generaltranslation';\nimport type { LocaleOption } from './inkTypes.js';\n\nlet localeOptionsCache: LocaleOption[] | undefined;\nlet localeCodeWidthCache: number | undefined;\n\nexport function getLocaleOptions(): LocaleOption[] {\n localeOptionsCache ??= listSupportedLocales().map((code) => {\n const properties = getLocaleProperties(code);\n const label =\n properties.name === properties.nativeName\n ? `${code} ${properties.name}`\n : `${code} ${properties.name} / ${properties.nativeName}`;\n\n return {\n code,\n label,\n name: properties.name,\n nativeName: properties.nativeName,\n searchable:\n `${code} ${properties.name} ${properties.nativeName}`.toLowerCase(),\n };\n });\n return localeOptionsCache;\n}\n\nexport function getLocaleCodeWidth(): number {\n localeCodeWidthCache ??= getLocaleOptions().reduce(\n (max, option) => Math.max(max, option.code.length),\n 0\n );\n return localeCodeWidthCache;\n}\n\nexport function getFilteredLocaleOptions(query: string) {\n const normalizedQuery = query.trim().toLowerCase();\n const options = getLocaleOptions();\n if (!normalizedQuery) return options;\n\n return options.filter((option) =>\n option.searchable.includes(normalizedQuery)\n );\n}\n"],"mappings":";;;AAIA,IAAI;AACJ,IAAI;AAEJ,SAAgB,mBAAmC;AACjD,wBAAuB,sBAAsB,CAAC,KAAK,SAAS;EAC1D,MAAM,aAAa,oBAAoB,KAAK;AAM5C,SAAO;GACL;GACA,OANA,WAAW,SAAS,WAAW,aAC3B,GAAG,KAAK,IAAI,WAAW,SACvB,GAAG,KAAK,IAAI,WAAW,KAAK,KAAK,WAAW;GAKhD,MAAM,WAAW;GACjB,YAAY,WAAW;GACvB,YACE,GAAG,KAAK,GAAG,WAAW,KAAK,GAAG,WAAW,aAAa,aAAa;GACtE;GACD;AACF,QAAO;;AAGT,SAAgB,qBAA6B;AAC3C,0BAAyB,kBAAkB,CAAC,QACzC,KAAK,WAAW,KAAK,IAAI,KAAK,OAAO,KAAK,OAAO,EAClD,EACD;AACD,QAAO;;AAGT,SAAgB,yBAAyB,OAAe;CACtD,MAAM,kBAAkB,MAAM,MAAM,CAAC,aAAa;CAClD,MAAM,UAAU,kBAAkB;AAClC,KAAI,CAAC,gBAAiB,QAAO;AAE7B,QAAO,QAAQ,QAAQ,WACrB,OAAO,WAAW,SAAS,gBAAgB,CAC5C"}
1
+ {"version":3,"file":"inkLocaleData.js","names":[],"sources":["../../src/console/inkLocaleData.ts"],"sourcesContent":["import { listSupportedLocales } from '@generaltranslation/supported-locales';\nimport { getLocaleProperties } from 'generaltranslation';\nimport type { LocaleOption } from './inkTypes.js';\n\nlet localeOptionsCache: LocaleOption[] | undefined;\nlet localeCodeWidthCache: number | undefined;\n\nexport function getLocaleOptions(): LocaleOption[] {\n localeOptionsCache ??= listSupportedLocales().map((code) => {\n const properties = getLocaleProperties(code);\n const label =\n properties.name === properties.nativeName\n ? `${code} ${properties.name}`\n : `${code} ${properties.name} / ${properties.nativeName}`;\n\n return {\n code,\n label,\n name: properties.name,\n nativeName: properties.nativeName,\n searchable:\n `${code} ${properties.name} ${properties.nativeName}`.toLowerCase(),\n };\n });\n return localeOptionsCache;\n}\n\nexport function getLocaleCodeWidth(): number {\n localeCodeWidthCache ??= getLocaleOptions().reduce(\n (max, option) => Math.max(max, option.code.length),\n 0\n );\n return localeCodeWidthCache;\n}\n\nexport function getFilteredLocaleOptions(query: string) {\n const normalizedQuery = query.trim().toLowerCase();\n const options = getLocaleOptions();\n if (!normalizedQuery) return options;\n\n return options\n .filter((option) => option.searchable.includes(normalizedQuery))\n .sort(\n (left, right) =>\n getLocaleSearchRank(left, normalizedQuery) -\n getLocaleSearchRank(right, normalizedQuery)\n );\n}\n\nfunction getLocaleSearchRank(option: LocaleOption, query: string) {\n const code = option.code.toLowerCase();\n const name = option.name.toLowerCase();\n const nativeName = option.nativeName.toLowerCase();\n\n if (code === query) return 0;\n if (code.startsWith(query)) return 1;\n if (name.startsWith(query)) return 2;\n if (nativeName.startsWith(query)) return 3;\n return 4;\n}\n"],"mappings":";;;AAIA,IAAI;AACJ,IAAI;AAEJ,SAAgB,mBAAmC;AACjD,wBAAuB,sBAAsB,CAAC,KAAK,SAAS;EAC1D,MAAM,aAAa,oBAAoB,KAAK;AAM5C,SAAO;GACL;GACA,OANA,WAAW,SAAS,WAAW,aAC3B,GAAG,KAAK,IAAI,WAAW,SACvB,GAAG,KAAK,IAAI,WAAW,KAAK,KAAK,WAAW;GAKhD,MAAM,WAAW;GACjB,YAAY,WAAW;GACvB,YACE,GAAG,KAAK,GAAG,WAAW,KAAK,GAAG,WAAW,aAAa,aAAa;GACtE;GACD;AACF,QAAO;;AAGT,SAAgB,qBAA6B;AAC3C,0BAAyB,kBAAkB,CAAC,QACzC,KAAK,WAAW,KAAK,IAAI,KAAK,OAAO,KAAK,OAAO,EAClD,EACD;AACD,QAAO;;AAGT,SAAgB,yBAAyB,OAAe;CACtD,MAAM,kBAAkB,MAAM,MAAM,CAAC,aAAa;CAClD,MAAM,UAAU,kBAAkB;AAClC,KAAI,CAAC,gBAAiB,QAAO;AAE7B,QAAO,QACJ,QAAQ,WAAW,OAAO,WAAW,SAAS,gBAAgB,CAAC,CAC/D,MACE,MAAM,UACL,oBAAoB,MAAM,gBAAgB,GAC1C,oBAAoB,OAAO,gBAAgB,CAC9C;;AAGL,SAAS,oBAAoB,QAAsB,OAAe;CAChE,MAAM,OAAO,OAAO,KAAK,aAAa;CACtC,MAAM,OAAO,OAAO,KAAK,aAAa;CACtC,MAAM,aAAa,OAAO,WAAW,aAAa;AAElD,KAAI,SAAS,MAAO,QAAO;AAC3B,KAAI,KAAK,WAAW,MAAM,CAAE,QAAO;AACnC,KAAI,KAAK,WAAW,MAAM,CAAE,QAAO;AACnC,KAAI,WAAW,WAAW,MAAM,CAAE,QAAO;AACzC,QAAO"}
@@ -1 +1 @@
1
- export declare const PACKAGE_VERSION = "2.14.41";
1
+ export declare const PACKAGE_VERSION = "2.14.42";
@@ -1,5 +1,5 @@
1
1
  //#region src/generated/version.ts
2
- const PACKAGE_VERSION = "2.14.41";
2
+ const PACKAGE_VERSION = "2.14.42";
3
3
  //#endregion
4
4
  export { PACKAGE_VERSION };
5
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","names":[],"sources":["../../src/generated/version.ts"],"sourcesContent":["// This file is auto-generated. Do not edit manually.\nexport const PACKAGE_VERSION = '2.14.41';\n"],"mappings":";AACA,MAAa,kBAAkB"}
1
+ {"version":3,"file":"version.js","names":[],"sources":["../../src/generated/version.ts"],"sourcesContent":["// This file is auto-generated. Do not edit manually.\nexport const PACKAGE_VERSION = '2.14.42';\n"],"mappings":";AACA,MAAa,kBAAkB"}
@@ -66,7 +66,7 @@ function handleChildrenWhitespace(currentTree, parentNodeType = void 0) {
66
66
  const textNode = child;
67
67
  if (parentNodeType === "multiplication") {
68
68
  const result = handleChildrenWhitespace(textNode);
69
- if (result) newChildren.push(result);
69
+ if (result !== null) newChildren.push(result);
70
70
  } else {
71
71
  const string = trimJsxStringChild(textNode);
72
72
  if (string) newChildren.push(string);
@@ -1 +1 @@
1
- {"version":3,"file":"handleChildrenWhitespace.js","names":["processChild"],"sources":["../../../../../src/react/jsx/utils/jsxParsing/handleChildrenWhitespace.ts"],"sourcesContent":["import { isAcceptedPluralForm } from 'generaltranslation/internal';\nimport {\n ElementNode,\n ExpressionNode,\n isElementNode,\n isExpressionNode,\n isMultiplicationNode,\n JsxTree,\n MultiplicationNode,\n WhitespaceJsxTreeResult,\n WhitespaceMultiplicationNode,\n} from './types.js';\n\n// JSX whitespace characters (space, tab, newline, carriage return)\n// Does NOT include non-breaking space (U+00A0) which should be preserved\nconst isJsxWhitespace = (char: string) => {\n return char === ' ' || char === '\\t' || char === '\\n' || char === '\\r';\n};\n\nconst trimJsxWhitespace = (\n str: string,\n side: 'start' | 'end' | 'both' = 'both'\n) => {\n let start = 0;\n let end = str.length;\n\n if (side === 'start' || side === 'both') {\n while (start < end && isJsxWhitespace(str[start])) {\n start++;\n }\n }\n\n if (side === 'end' || side === 'both') {\n while (end > start && isJsxWhitespace(str[end - 1])) {\n end--;\n }\n }\n\n return str.slice(start, end);\n};\n\nconst hasNonJsxWhitespace = (str: string) => {\n for (const char of str) {\n if (!isJsxWhitespace(char)) return true;\n }\n return false;\n};\n\nexport function trimJsxStringChild(child: string) {\n if (!child.includes('\\n') && !child.includes('\\r')) {\n return child;\n }\n\n // Normalize line endings to \\n for consistency across platforms\n let result = child.replace(/\\r\\n|\\r/g, '\\n');\n\n // Collapse multiple spaces/tabs into a single space (but not nbsp)\n result = result.replace(/[\\t ]+/g, ' ');\n\n let newResult = '';\n let newline = false;\n for (const char of result) {\n if (char === '\\n') {\n if (hasNonJsxWhitespace(newResult)) newResult += ' ';\n else newResult = '';\n newline = true;\n continue;\n }\n if (!newline) {\n newResult += char;\n continue;\n }\n if (isJsxWhitespace(char)) continue;\n newResult += char;\n newline = false;\n }\n if (newline) newResult = trimJsxWhitespace(newResult, 'end');\n result = newResult;\n // Collapse multiple spaces/tabs into a single space (but not nbsp)\n result = result.replace(/[\\t ]+/g, ' ');\n return result;\n}\n\n// Overload for when currentTree is an array\nexport function handleChildrenWhitespace(\n currentTree: MultiplicationNode['branches'],\n parentNodeType: 'multiplication'\n): (WhitespaceJsxTreeResult | WhitespaceMultiplicationNode)[];\n\n// Overload for when currentTree is an array\nexport function handleChildrenWhitespace(\n currentTree: MultiplicationNode['branches'],\n parentNodeType?: 'element' | 'expression' | undefined\n):\n | WhitespaceJsxTreeResult\n | WhitespaceMultiplicationNode\n | (WhitespaceJsxTreeResult | WhitespaceMultiplicationNode)[];\n\n// Overload for when currentTree is not an array\nexport function handleChildrenWhitespace(\n currentTree: MultiplicationNode | JsxTree,\n parentNodeType?: 'multiplication' | 'element' | 'expression' | undefined\n): null | WhitespaceJsxTreeResult | WhitespaceMultiplicationNode;\n\n// Overload for entry point\nexport function handleChildrenWhitespace(\n currentTree: JsxTree | JsxTree[]\n): null | WhitespaceJsxTreeResult | WhitespaceJsxTreeResult[];\n/**\n * Handles whitespace in children of a JSX element, and strips elements\n * @param currentTree - The current tree to handle\n * @returns The processed tree with whitespace handled\n *\n * For unresolved functions, we just make it so that Derive has no children\n *\n * The typing was so much worse before this. Don't come for me. All I did was enforce the typing.\n */\nexport function handleChildrenWhitespace(\n currentTree: MultiplicationNode | JsxTree | MultiplicationNode['branches'],\n parentNodeType:\n | 'multiplication'\n | 'element'\n | 'expression'\n | undefined = undefined\n):\n | null\n | WhitespaceJsxTreeResult\n | WhitespaceMultiplicationNode\n | (WhitespaceJsxTreeResult | WhitespaceMultiplicationNode)[] {\n if (Array.isArray(currentTree)) {\n const childrenTypes: (\n | 'text'\n | 'element'\n | 'expression'\n | 'multiplication'\n | 'other'\n )[] = currentTree.map((child) => {\n if (typeof child === 'string') return 'text';\n if (isExpressionNode(child)) return 'expression';\n if (isElementNode(child)) return 'element';\n if (isMultiplicationNode(child)) return 'multiplication';\n return 'other';\n });\n const newChildren: (\n | WhitespaceJsxTreeResult\n | WhitespaceMultiplicationNode\n )[] = [];\n currentTree.forEach((child, index) => {\n switch (childrenTypes[index]) {\n case 'text':\n const textNode = child as string;\n if (parentNodeType === 'multiplication') {\n // This should be treated like a new tree (no parent here b/c its a new tree)\n const result = handleChildrenWhitespace(textNode);\n if (result) newChildren.push(result);\n } else {\n const string = trimJsxStringChild(textNode);\n if (string) newChildren.push(string);\n }\n break;\n case 'expression':\n // Strip expressions\n const result = (child as ExpressionNode).result;\n if (isMultiplicationNode(result)) {\n newChildren.push(handleChildrenWhitespace(result));\n } else if (typeof result === 'string') {\n newChildren.push(result);\n } else {\n // other case\n newChildren.push(result);\n }\n break;\n case 'element':\n const newElement = handleChildrenWhitespace(\n child as ElementNode | null\n );\n newChildren.push(newElement);\n break;\n case 'multiplication':\n newChildren.push({\n nodeType: 'multiplication',\n branches: handleChildrenWhitespace(\n (child as MultiplicationNode).branches,\n 'multiplication'\n ),\n });\n break;\n case 'other':\n // Return number or boolean or null\n newChildren.push(child as number | boolean | null);\n break;\n }\n });\n if (parentNodeType === 'multiplication') {\n // Return the branches as an array\n return newChildren;\n }\n return newChildren.length === 1 ? newChildren[0] : newChildren;\n } else if (isElementNode(currentTree)) {\n // Process all props recursively\n // What if there is a different component sharing the same name?\n const elementIsPlural = currentTree.type === 'Plural';\n const elementIsBranch = currentTree.type === 'Branch';\n const processedProps = !currentTree.props\n ? undefined\n : Object.fromEntries(\n Object.entries(currentTree.props).map(\n ([key, value]:\n | [string, unknown]\n | [\n 'children',\n (\n | JsxTree\n | MultiplicationNode\n | (JsxTree | MultiplicationNode)[]\n ),\n ]): [string, unknown] => {\n let shouldProcess = false;\n // Process children\n if (key === 'children') shouldProcess = true;\n // Process plural children\n if (elementIsPlural && isAcceptedPluralForm(key as string))\n shouldProcess = true;\n // Process branch children\n if (elementIsBranch && key !== 'branch') shouldProcess = true;\n // Do not process raw strings\n if (typeof value === 'string' && key !== 'children')\n shouldProcess = false;\n // Process props\n if (!shouldProcess) {\n return [key, value];\n }\n const processChild = handleChildrenWhitespace as (\n currentTree:\n | JsxTree\n | MultiplicationNode\n | (JsxTree | MultiplicationNode)[]\n ) => unknown;\n return [\n key,\n processChild(\n value as\n | JsxTree\n | MultiplicationNode\n | (JsxTree | MultiplicationNode)[]\n ),\n ];\n }\n )\n );\n return {\n nodeType: 'element',\n type: currentTree.type,\n ...(processedProps ? { props: processedProps } : {}),\n };\n } else if (isExpressionNode(currentTree)) {\n // Strip expression\n const result = (currentTree as ExpressionNode).result;\n if (isMultiplicationNode(result)) {\n return handleChildrenWhitespace(result);\n } else if (typeof result === 'string') {\n return result;\n } else {\n return result;\n }\n } else if (isMultiplicationNode(currentTree)) {\n return {\n nodeType: 'multiplication',\n branches: handleChildrenWhitespace(\n currentTree.branches,\n 'multiplication'\n ),\n };\n } else if (typeof currentTree === 'string') {\n return trimJsxStringChild(currentTree);\n }\n // null or number or boolean\n return currentTree;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"handleChildrenWhitespace.js","names":["processChild"],"sources":["../../../../../src/react/jsx/utils/jsxParsing/handleChildrenWhitespace.ts"],"sourcesContent":["import { isAcceptedPluralForm } from 'generaltranslation/internal';\nimport {\n ElementNode,\n ExpressionNode,\n isElementNode,\n isExpressionNode,\n isMultiplicationNode,\n JsxTree,\n MultiplicationNode,\n WhitespaceJsxTreeResult,\n WhitespaceMultiplicationNode,\n} from './types.js';\n\n// JSX whitespace characters (space, tab, newline, carriage return)\n// Does NOT include non-breaking space (U+00A0) which should be preserved\nconst isJsxWhitespace = (char: string) => {\n return char === ' ' || char === '\\t' || char === '\\n' || char === '\\r';\n};\n\nconst trimJsxWhitespace = (\n str: string,\n side: 'start' | 'end' | 'both' = 'both'\n) => {\n let start = 0;\n let end = str.length;\n\n if (side === 'start' || side === 'both') {\n while (start < end && isJsxWhitespace(str[start])) {\n start++;\n }\n }\n\n if (side === 'end' || side === 'both') {\n while (end > start && isJsxWhitespace(str[end - 1])) {\n end--;\n }\n }\n\n return str.slice(start, end);\n};\n\nconst hasNonJsxWhitespace = (str: string) => {\n for (const char of str) {\n if (!isJsxWhitespace(char)) return true;\n }\n return false;\n};\n\nexport function trimJsxStringChild(child: string) {\n if (!child.includes('\\n') && !child.includes('\\r')) {\n return child;\n }\n\n // Normalize line endings to \\n for consistency across platforms\n let result = child.replace(/\\r\\n|\\r/g, '\\n');\n\n // Collapse multiple spaces/tabs into a single space (but not nbsp)\n result = result.replace(/[\\t ]+/g, ' ');\n\n let newResult = '';\n let newline = false;\n for (const char of result) {\n if (char === '\\n') {\n if (hasNonJsxWhitespace(newResult)) newResult += ' ';\n else newResult = '';\n newline = true;\n continue;\n }\n if (!newline) {\n newResult += char;\n continue;\n }\n if (isJsxWhitespace(char)) continue;\n newResult += char;\n newline = false;\n }\n if (newline) newResult = trimJsxWhitespace(newResult, 'end');\n result = newResult;\n // Collapse multiple spaces/tabs into a single space (but not nbsp)\n result = result.replace(/[\\t ]+/g, ' ');\n return result;\n}\n\n// Overload for when currentTree is an array\nexport function handleChildrenWhitespace(\n currentTree: MultiplicationNode['branches'],\n parentNodeType: 'multiplication'\n): (WhitespaceJsxTreeResult | WhitespaceMultiplicationNode)[];\n\n// Overload for when currentTree is an array\nexport function handleChildrenWhitespace(\n currentTree: MultiplicationNode['branches'],\n parentNodeType?: 'element' | 'expression' | undefined\n):\n | WhitespaceJsxTreeResult\n | WhitespaceMultiplicationNode\n | (WhitespaceJsxTreeResult | WhitespaceMultiplicationNode)[];\n\n// Overload for when currentTree is not an array\nexport function handleChildrenWhitespace(\n currentTree: MultiplicationNode | JsxTree,\n parentNodeType?: 'multiplication' | 'element' | 'expression' | undefined\n): null | WhitespaceJsxTreeResult | WhitespaceMultiplicationNode;\n\n// Overload for entry point\nexport function handleChildrenWhitespace(\n currentTree: JsxTree | JsxTree[]\n): null | WhitespaceJsxTreeResult | WhitespaceJsxTreeResult[];\n/**\n * Handles whitespace in children of a JSX element, and strips elements\n * @param currentTree - The current tree to handle\n * @returns The processed tree with whitespace handled\n *\n * For unresolved functions, we just make it so that Derive has no children\n *\n * The typing was so much worse before this. Don't come for me. All I did was enforce the typing.\n */\nexport function handleChildrenWhitespace(\n currentTree: MultiplicationNode | JsxTree | MultiplicationNode['branches'],\n parentNodeType:\n | 'multiplication'\n | 'element'\n | 'expression'\n | undefined = undefined\n):\n | null\n | WhitespaceJsxTreeResult\n | WhitespaceMultiplicationNode\n | (WhitespaceJsxTreeResult | WhitespaceMultiplicationNode)[] {\n if (Array.isArray(currentTree)) {\n const childrenTypes: (\n | 'text'\n | 'element'\n | 'expression'\n | 'multiplication'\n | 'other'\n )[] = currentTree.map((child) => {\n if (typeof child === 'string') return 'text';\n if (isExpressionNode(child)) return 'expression';\n if (isElementNode(child)) return 'element';\n if (isMultiplicationNode(child)) return 'multiplication';\n return 'other';\n });\n const newChildren: (\n | WhitespaceJsxTreeResult\n | WhitespaceMultiplicationNode\n )[] = [];\n currentTree.forEach((child, index) => {\n switch (childrenTypes[index]) {\n case 'text':\n const textNode = child as string;\n if (parentNodeType === 'multiplication') {\n // This should be treated like a new tree (no parent here b/c its a new tree)\n const result = handleChildrenWhitespace(textNode);\n if (result !== null) newChildren.push(result);\n } else {\n const string = trimJsxStringChild(textNode);\n if (string) newChildren.push(string);\n }\n break;\n case 'expression':\n // Strip expressions\n const result = (child as ExpressionNode).result;\n if (isMultiplicationNode(result)) {\n newChildren.push(handleChildrenWhitespace(result));\n } else if (typeof result === 'string') {\n newChildren.push(result);\n } else {\n // other case\n newChildren.push(result);\n }\n break;\n case 'element':\n const newElement = handleChildrenWhitespace(\n child as ElementNode | null\n );\n newChildren.push(newElement);\n break;\n case 'multiplication':\n newChildren.push({\n nodeType: 'multiplication',\n branches: handleChildrenWhitespace(\n (child as MultiplicationNode).branches,\n 'multiplication'\n ),\n });\n break;\n case 'other':\n // Return number or boolean or null\n newChildren.push(child as number | boolean | null);\n break;\n }\n });\n if (parentNodeType === 'multiplication') {\n // Return the branches as an array\n return newChildren;\n }\n return newChildren.length === 1 ? newChildren[0] : newChildren;\n } else if (isElementNode(currentTree)) {\n // Process all props recursively\n // What if there is a different component sharing the same name?\n const elementIsPlural = currentTree.type === 'Plural';\n const elementIsBranch = currentTree.type === 'Branch';\n const processedProps = !currentTree.props\n ? undefined\n : Object.fromEntries(\n Object.entries(currentTree.props).map(\n ([key, value]:\n | [string, unknown]\n | [\n 'children',\n (\n | JsxTree\n | MultiplicationNode\n | (JsxTree | MultiplicationNode)[]\n ),\n ]): [string, unknown] => {\n let shouldProcess = false;\n // Process children\n if (key === 'children') shouldProcess = true;\n // Process plural children\n if (elementIsPlural && isAcceptedPluralForm(key as string))\n shouldProcess = true;\n // Process branch children\n if (elementIsBranch && key !== 'branch') shouldProcess = true;\n // Do not process raw strings\n if (typeof value === 'string' && key !== 'children')\n shouldProcess = false;\n // Process props\n if (!shouldProcess) {\n return [key, value];\n }\n const processChild = handleChildrenWhitespace as (\n currentTree:\n | JsxTree\n | MultiplicationNode\n | (JsxTree | MultiplicationNode)[]\n ) => unknown;\n return [\n key,\n processChild(\n value as\n | JsxTree\n | MultiplicationNode\n | (JsxTree | MultiplicationNode)[]\n ),\n ];\n }\n )\n );\n return {\n nodeType: 'element',\n type: currentTree.type,\n ...(processedProps ? { props: processedProps } : {}),\n };\n } else if (isExpressionNode(currentTree)) {\n // Strip expression\n const result = (currentTree as ExpressionNode).result;\n if (isMultiplicationNode(result)) {\n return handleChildrenWhitespace(result);\n } else if (typeof result === 'string') {\n return result;\n } else {\n return result;\n }\n } else if (isMultiplicationNode(currentTree)) {\n return {\n nodeType: 'multiplication',\n branches: handleChildrenWhitespace(\n currentTree.branches,\n 'multiplication'\n ),\n };\n } else if (typeof currentTree === 'string') {\n return trimJsxStringChild(currentTree);\n }\n // null or number or boolean\n return currentTree;\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gt",
3
- "version": "2.14.41",
3
+ "version": "2.14.42",
4
4
  "main": "dist/index.js",
5
5
  "bin": "bin/main.js",
6
6
  "files": [
@@ -114,8 +114,8 @@
114
114
  "unist-util-visit": "^5.0.0",
115
115
  "yaml": "^2.8.0",
116
116
  "@generaltranslation/format": "0.1.1",
117
- "@generaltranslation/python-extractor": "0.2.22",
118
117
  "@generaltranslation/supported-locales": "2.1.1",
118
+ "@generaltranslation/python-extractor": "0.2.22",
119
119
  "generaltranslation": "8.2.16",
120
120
  "gt-remark": "1.0.7"
121
121
  },