gt 2.14.64 → 2.14.66

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,24 @@
1
1
  # gtx-cli
2
2
 
3
+ ## 2.14.66
4
+
5
+ ### Patch Changes
6
+
7
+ - [#1929](https://github.com/generaltranslation/gt/pull/1929) [`f53bb5e`](https://github.com/generaltranslation/gt/commit/f53bb5ea4b4989a2a4ad3aebf464011f01e029ad) Thanks [@ErnestM1234](https://github.com/ErnestM1234)! - Replace the FormatJS ICU parser and runtime formatter dependencies with the new dependency-free `@generaltranslation/icu` package.
8
+
9
+ - Updated dependencies [[`bbf4eb0`](https://github.com/generaltranslation/gt/commit/bbf4eb0cf77160baa615776619acd7afe35697ba), [`f53bb5e`](https://github.com/generaltranslation/gt/commit/f53bb5ea4b4989a2a4ad3aebf464011f01e029ad)]:
10
+ - generaltranslation@9.0.4
11
+ - @generaltranslation/icu@0.1.0
12
+ - @generaltranslation/format@0.1.3
13
+ - @generaltranslation/python-extractor@0.2.31
14
+ - @generaltranslation/supported-locales@2.1.11
15
+
16
+ ## 2.14.65
17
+
18
+ ### Patch Changes
19
+
20
+ - [#1962](https://github.com/generaltranslation/gt/pull/1962) [`99f63e6`](https://github.com/generaltranslation/gt/commit/99f63e6826244cb07c18382031cce3fd8ca4ffc2) Thanks [@ErnestM1234](https://github.com/ErnestM1234)! - Clear the locale search query after selecting a locale during setup.
21
+
3
22
  ## 2.14.64
4
23
 
5
24
  ### Patch Changes
@@ -196,6 +196,7 @@ function LocaleMultiPrompt({ message, defaultValue = [], required, onComplete })
196
196
  else next.add(selectedLocale);
197
197
  return next;
198
198
  });
199
+ setQuery("");
199
200
  setError(void 0);
200
201
  };
201
202
  useInput((input, key) => {
@@ -1 +1 @@
1
- {"version":3,"file":"inkPrompts.js","names":[],"sources":["../../src/console/inkPrompts.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { getSupportedLocale } from '@generaltranslation/supported-locales';\nimport {\n OptionRow,\n LocaleOptionsList,\n RemainingMatches,\n SelectedTags,\n} from './inkFields.js';\nimport { getFilteredLocaleOptions, getLocaleOptions } from './inkLocaleData.js';\nimport { InputBox, PromptFrame } from './inkLayout.js';\nimport { runPrompt } from './inkSession.js';\nimport { useTerminalSize } from './inkTerminal.js';\nimport { parseTypedLocale } from './promptParsing.js';\nimport type {\n ConfirmPromptProps,\n EditableTextPromptProps,\n GlobPromptProps,\n LocaleMultiPromptProps,\n LocalePromptProps,\n MultiSelectPromptProps,\n SelectPromptProps,\n TextPromptProps,\n} from './inkTypes.js';\nimport {\n CANCELLED,\n SELECTED_TAG_ROW_INDEX,\n complete,\n getInputWidth,\n getOptionWidth,\n getSafeIndex,\n getScrollWindow,\n getVisibleCount,\n nextIndex,\n previousIndex,\n} from './inkUtils.js';\n\nfunction resolveLocaleChoice({\n query,\n highlightedLocale,\n preferHighlightedLocale,\n}: {\n query: string;\n highlightedLocale?: string;\n preferHighlightedLocale: boolean;\n}) {\n if (preferHighlightedLocale) return highlightedLocale;\n return parseTypedLocale(query) ?? highlightedLocale;\n}\n\nfunction TextPrompt({\n message,\n defaultValue,\n validate,\n onComplete,\n footer = 'type to edit enter select esc cancel',\n placeholder,\n}: EditableTextPromptProps) {\n const { columns } = useTerminalSize();\n const [value, setValue] = useState(defaultValue ?? '');\n const [error, setError] = useState<string | undefined>();\n const inputWidth = getInputWidth(columns);\n\n useInput((input, key) => {\n if (key.escape || (key.ctrl && input === 'c')) {\n complete(CANCELLED, onComplete);\n return;\n }\n if (key.return) {\n const validation = validate?.(value);\n if (validation && validation !== true) {\n setError(validation.toString());\n return;\n }\n complete({ value, cancelled: false }, onComplete);\n return;\n }\n if (key.backspace || key.delete) {\n setValue((current) => current.slice(0, -1));\n setError(undefined);\n return;\n }\n if (input && !key.ctrl && !key.meta && !key.return) {\n setValue((current) => current + input);\n setError(undefined);\n }\n });\n\n return (\n <PromptFrame message={message} footer={footer}>\n <InputBox value={value} width={inputWidth} placeholder={placeholder} />\n {error ? <Text color='red'>{error}</Text> : null}\n </PromptFrame>\n );\n}\n\nfunction LocalePrompt({\n message,\n defaultValue,\n onComplete,\n}: LocalePromptProps) {\n const { columns, rows } = useTerminalSize();\n const localeOptions = getLocaleOptions();\n const defaultLocale = defaultValue ? getSupportedLocale(defaultValue) : null;\n const defaultIndex = defaultLocale\n ? Math.max(\n 0,\n localeOptions.findIndex((option) => option.code === defaultLocale)\n )\n : 0;\n const [query, setQuery] = useState('');\n const [index, setIndex] = useState(defaultIndex);\n const [preferHighlightedLocale, setPreferHighlightedLocale] = useState(false);\n const [error, setError] = useState<string | undefined>();\n const filteredOptions = getFilteredLocaleOptions(query);\n const activeIndex = getSafeIndex(index, filteredOptions.length);\n const visibleCount = getVisibleCount(rows, 14);\n const { start, visibleItems: visibleOptions } = getScrollWindow({\n items: filteredOptions,\n index: activeIndex,\n visibleCount,\n });\n const inputWidth = getInputWidth(columns);\n const optionWidth = getOptionWidth(columns);\n\n useInput((input, key) => {\n if (key.escape || (key.ctrl && input === 'c')) {\n complete(CANCELLED, onComplete);\n return;\n }\n if (key.upArrow) {\n setPreferHighlightedLocale(true);\n setIndex((current) => previousIndex(current, filteredOptions.length));\n return;\n }\n if (key.downArrow) {\n setPreferHighlightedLocale(true);\n setIndex((current) => nextIndex(current, filteredOptions.length));\n return;\n }\n if (key.backspace || key.delete) {\n setQuery((current) => current.slice(0, -1));\n setIndex(0);\n setPreferHighlightedLocale(false);\n setError(undefined);\n return;\n }\n if (key.return) {\n const finalLocale = resolveLocaleChoice({\n query,\n highlightedLocale: filteredOptions[activeIndex]?.code,\n preferHighlightedLocale,\n });\n if (!finalLocale) {\n setError('Enter a valid locale (e.g., en)');\n return;\n }\n complete({ value: finalLocale, cancelled: false }, onComplete);\n return;\n }\n if (input && !key.ctrl && !key.meta) {\n setQuery((current) => current + input);\n setIndex(0);\n setPreferHighlightedLocale(false);\n setError(undefined);\n }\n });\n\n return (\n <PromptFrame\n message={message}\n footer='↑↓ navigate enter select esc cancel'\n >\n <InputBox\n value={query}\n width={inputWidth}\n placeholder='Search locales...'\n />\n <LocaleOptionsList\n options={visibleOptions}\n activeIndex={activeIndex - start}\n width={optionWidth}\n />\n <RemainingMatches total={filteredOptions.length} visible={visibleCount} />\n {error ? <Text color='red'>{error}</Text> : null}\n </PromptFrame>\n );\n}\n\nfunction LocaleMultiPrompt({\n message,\n defaultValue = [],\n required,\n onComplete,\n}: LocaleMultiPromptProps) {\n const { columns, rows } = useTerminalSize();\n const [query, setQuery] = useState('');\n const [index, setIndex] = useState(0);\n const [preferHighlightedLocale, setPreferHighlightedLocale] = useState(false);\n const [selected, setSelected] = useState<Set<string>>(new Set(defaultValue));\n const [error, setError] = useState<string | undefined>();\n const selectedLocales = [...selected];\n const filteredOptions = getFilteredLocaleOptions(query).filter(\n (option) => !selected.has(option.code)\n );\n const activeOptionIndex = getSafeIndex(index, filteredOptions.length);\n const visibleCount = getVisibleCount(rows, 16);\n const { start, visibleItems: visibleOptions } = getScrollWindow({\n items: filteredOptions,\n index: activeOptionIndex,\n visibleCount,\n });\n const inputWidth = getInputWidth(columns);\n const optionWidth = getOptionWidth(columns);\n const [selectedTagIndex, setSelectedTagIndex] = useState(0);\n const moveSelectedTag = (direction: -1 | 1) =>\n setSelectedTagIndex((current) =>\n Math.max(0, Math.min(selectedLocales.length - 1, current + direction))\n );\n const removeSelectedTag = () => {\n const localeToRemove = selectedLocales[selectedTagIndex];\n if (!localeToRemove) return;\n setSelected((current) => {\n const next = new Set(current);\n next.delete(localeToRemove);\n return next;\n });\n setSelectedTagIndex((current) =>\n Math.max(0, Math.min(current, selectedLocales.length - 2))\n );\n if (selectedLocales.length === 1) setIndex(0);\n setError(undefined);\n };\n const toggleVisibleLocale = () => {\n const selectedLocale = resolveLocaleChoice({\n query,\n highlightedLocale: filteredOptions[activeOptionIndex]?.code,\n preferHighlightedLocale,\n });\n if (!selectedLocale) {\n setError('Enter a valid locale (e.g., es fr de)');\n return;\n }\n setSelected((current) => {\n const next = new Set(current);\n if (next.has(selectedLocale)) {\n next.delete(selectedLocale);\n } else {\n next.add(selectedLocale);\n }\n return next;\n });\n setError(undefined);\n };\n\n useInput((input, key) => {\n if (key.escape || (key.ctrl && input === 'c')) {\n complete(CANCELLED, onComplete);\n return;\n }\n if (key.upArrow) {\n setPreferHighlightedLocale(true);\n setIndex((current) => {\n if (current === SELECTED_TAG_ROW_INDEX) {\n if (selectedTagIndex > 0) {\n moveSelectedTag(-1);\n return SELECTED_TAG_ROW_INDEX;\n }\n return Math.max(filteredOptions.length - 1, 0);\n }\n if (current === 0 && selectedLocales.length > 0) {\n setSelectedTagIndex(selectedLocales.length - 1);\n return SELECTED_TAG_ROW_INDEX;\n }\n if (current === 0) {\n return Math.max(filteredOptions.length - 1, 0);\n }\n return current - 1;\n });\n return;\n }\n if (key.downArrow) {\n setPreferHighlightedLocale(true);\n setIndex((current) => {\n if (filteredOptions.length === 0) return 0;\n if (current === SELECTED_TAG_ROW_INDEX) {\n if (selectedTagIndex < selectedLocales.length - 1) {\n moveSelectedTag(1);\n return SELECTED_TAG_ROW_INDEX;\n }\n return 0;\n }\n return nextIndex(current, filteredOptions.length);\n });\n return;\n }\n if (index === SELECTED_TAG_ROW_INDEX && key.leftArrow) {\n setSelectedTagIndex((current) => Math.max(0, current - 1));\n return;\n }\n if (index === SELECTED_TAG_ROW_INDEX && key.rightArrow) {\n setSelectedTagIndex((current) =>\n Math.min(selectedLocales.length - 1, current + 1)\n );\n return;\n }\n if (key.backspace || key.delete) {\n setQuery((current) => current.slice(0, -1));\n setIndex(0);\n setPreferHighlightedLocale(false);\n setError(undefined);\n return;\n }\n if (input === ' ' && index === SELECTED_TAG_ROW_INDEX) {\n removeSelectedTag();\n return;\n }\n if (input === ' ') {\n toggleVisibleLocale();\n return;\n }\n if (key.return) {\n if (required && selected.size === 0) {\n setError('Select at least one locale');\n return;\n }\n complete({ value: [...selected], cancelled: false }, onComplete);\n return;\n }\n if (input && !key.ctrl && !key.meta) {\n setQuery((current) => current + input);\n setIndex(0);\n setPreferHighlightedLocale(false);\n setError(undefined);\n }\n });\n\n return (\n <PromptFrame\n message={message}\n footer='↑↓ navigate space toggle enter confirm esc cancel'\n >\n <InputBox\n value={query}\n width={inputWidth}\n placeholder='Search locales...'\n />\n <Box marginTop={1}>\n <SelectedTags\n selectedLocales={selectedLocales}\n active={index === SELECTED_TAG_ROW_INDEX}\n activeIndex={selectedTagIndex}\n width={optionWidth}\n />\n </Box>\n <LocaleOptionsList\n options={visibleOptions}\n activeIndex={\n index === SELECTED_TAG_ROW_INDEX\n ? SELECTED_TAG_ROW_INDEX\n : activeOptionIndex - start\n }\n width={optionWidth}\n />\n <RemainingMatches total={filteredOptions.length} visible={visibleCount} />\n {error ? <Text color='red'>{error}</Text> : null}\n </PromptFrame>\n );\n}\n\nfunction GlobPrompt({\n label,\n message,\n defaultValue,\n onComplete,\n}: GlobPromptProps) {\n return (\n <TextPrompt\n message={\n message ??\n `${label}: Enter space-separated glob patterns for files to translate. Include [locale].`\n }\n defaultValue={defaultValue}\n footer='enter save esc cancel'\n onComplete={onComplete}\n />\n );\n}\n\nfunction SelectPrompt<T>({\n message,\n options,\n defaultValue,\n onComplete,\n}: SelectPromptProps<T>) {\n const defaultIndex = Math.max(\n 0,\n options.findIndex((option) => option.value === defaultValue)\n );\n const [index, setIndex] = useState(defaultIndex);\n\n useInput((input, key) => {\n if (key.escape || (key.ctrl && input === 'c')) {\n complete(CANCELLED, onComplete);\n return;\n }\n if (key.upArrow) {\n setIndex((current) => (current === 0 ? options.length - 1 : current - 1));\n return;\n }\n if (key.downArrow) {\n setIndex((current) => (current + 1) % options.length);\n return;\n }\n if (key.return) {\n complete({ value: options[index]?.value, cancelled: false }, onComplete);\n }\n });\n\n return (\n <PromptFrame\n message={message}\n footer='↑↓ navigate enter select esc cancel'\n >\n {options.map((option, optionIndex) => (\n <OptionRow\n key={optionIndex}\n active={optionIndex === index}\n label={option.label}\n hint={option.hint}\n />\n ))}\n </PromptFrame>\n );\n}\n\nfunction MultiSelectPrompt<T extends string>({\n message,\n options,\n required,\n onComplete,\n}: MultiSelectPromptProps<T>) {\n const [index, setIndex] = useState(0);\n const [selected, setSelected] = useState<Set<number>>(new Set());\n const [error, setError] = useState<string | undefined>();\n\n useInput((input, key) => {\n if (key.escape || (key.ctrl && input === 'c')) {\n complete(CANCELLED, onComplete);\n return;\n }\n if (key.upArrow) {\n setIndex((current) => (current === 0 ? options.length - 1 : current - 1));\n return;\n }\n if (key.downArrow) {\n setIndex((current) => (current + 1) % options.length);\n return;\n }\n if (input === ' ') {\n setSelected((current) => {\n const next = new Set(current);\n if (next.has(index)) {\n next.delete(index);\n } else {\n next.add(index);\n }\n return next;\n });\n setError(undefined);\n return;\n }\n if (key.return) {\n if (required && selected.size === 0) {\n setError('Select at least one option');\n return;\n }\n const values = [...selected]\n .sort((a, b) => a - b)\n .map((selectedIndex) => options[selectedIndex]?.value)\n .filter((value): value is T => value != null);\n complete({ value: values, cancelled: false }, onComplete);\n }\n });\n\n return (\n <PromptFrame\n message={message}\n footer='↑↓ navigate space toggle enter select esc cancel'\n >\n {options.map((option, optionIndex) => (\n <OptionRow\n key={optionIndex}\n active={optionIndex === index}\n selected={selected.has(optionIndex)}\n label={option.label}\n hint={option.hint}\n />\n ))}\n {error ? <Text color='red'>{error}</Text> : null}\n </PromptFrame>\n );\n}\n\nfunction ConfirmPrompt({\n message,\n defaultValue,\n onComplete,\n}: ConfirmPromptProps) {\n const options = [\n { value: true, label: 'Yes' },\n { value: false, label: 'No' },\n ];\n const [index, setIndex] = useState(defaultValue ? 0 : 1);\n\n useInput((input, key) => {\n if (key.escape || (key.ctrl && input === 'c')) {\n complete(CANCELLED, onComplete);\n return;\n }\n if (key.leftArrow || key.upArrow || key.rightArrow || key.downArrow) {\n setIndex((current) => (current === 0 ? 1 : 0));\n return;\n }\n if (input.toLowerCase() === 'y') {\n complete({ value: true, cancelled: false }, onComplete);\n return;\n }\n if (input.toLowerCase() === 'n') {\n complete({ value: false, cancelled: false }, onComplete);\n return;\n }\n if (key.return) {\n complete({ value: options[index]!.value, cancelled: false }, onComplete);\n }\n });\n\n return (\n <PromptFrame\n message={message}\n footer='←→ choose y/n select enter confirm esc cancel'\n >\n {options.map((option, optionIndex) => (\n <OptionRow\n key={option.label}\n active={optionIndex === index}\n label={option.label}\n />\n ))}\n </PromptFrame>\n );\n}\n\nexport async function inkPromptText(\n options: Omit<TextPromptProps, 'onComplete'>\n) {\n return runPrompt<string>((onComplete) => (\n <TextPrompt {...options} onComplete={onComplete} />\n ));\n}\n\nexport async function inkPromptLocale(\n options: Omit<LocalePromptProps, 'onComplete'>\n) {\n return runPrompt<string>((onComplete) => (\n <LocalePrompt {...options} onComplete={onComplete} />\n ));\n}\n\nexport async function inkPromptLocaleMulti(\n options: Omit<LocaleMultiPromptProps, 'onComplete'>\n) {\n return runPrompt<string[]>((onComplete) => (\n <LocaleMultiPrompt {...options} onComplete={onComplete} />\n ));\n}\n\nexport async function inkPromptGlob(\n options: Omit<GlobPromptProps, 'onComplete'>\n) {\n return runPrompt<string>((onComplete) => (\n <GlobPrompt {...options} onComplete={onComplete} />\n ));\n}\n\nexport async function inkPromptSelect<T>(\n options: Omit<SelectPromptProps<T>, 'onComplete'>\n) {\n return runPrompt<T>((onComplete) => (\n <SelectPrompt {...options} onComplete={onComplete} />\n ));\n}\n\nexport async function inkPromptMultiSelect<T extends string>(\n options: Omit<MultiSelectPromptProps<T>, 'onComplete'>\n) {\n return runPrompt<Array<T>>((onComplete) => (\n <MultiSelectPrompt {...options} onComplete={onComplete} />\n ));\n}\n\nexport async function inkPromptConfirm(\n options: Omit<ConfirmPromptProps, 'onComplete'>\n) {\n return runPrompt<boolean>((onComplete) => (\n <ConfirmPrompt {...options} onComplete={onComplete} />\n ));\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"inkPrompts.js","names":[],"sources":["../../src/console/inkPrompts.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { getSupportedLocale } from '@generaltranslation/supported-locales';\nimport {\n OptionRow,\n LocaleOptionsList,\n RemainingMatches,\n SelectedTags,\n} from './inkFields.js';\nimport { getFilteredLocaleOptions, getLocaleOptions } from './inkLocaleData.js';\nimport { InputBox, PromptFrame } from './inkLayout.js';\nimport { runPrompt } from './inkSession.js';\nimport { useTerminalSize } from './inkTerminal.js';\nimport { parseTypedLocale } from './promptParsing.js';\nimport type {\n ConfirmPromptProps,\n EditableTextPromptProps,\n GlobPromptProps,\n LocaleMultiPromptProps,\n LocalePromptProps,\n MultiSelectPromptProps,\n SelectPromptProps,\n TextPromptProps,\n} from './inkTypes.js';\nimport {\n CANCELLED,\n SELECTED_TAG_ROW_INDEX,\n complete,\n getInputWidth,\n getOptionWidth,\n getSafeIndex,\n getScrollWindow,\n getVisibleCount,\n nextIndex,\n previousIndex,\n} from './inkUtils.js';\n\nfunction resolveLocaleChoice({\n query,\n highlightedLocale,\n preferHighlightedLocale,\n}: {\n query: string;\n highlightedLocale?: string;\n preferHighlightedLocale: boolean;\n}) {\n if (preferHighlightedLocale) return highlightedLocale;\n return parseTypedLocale(query) ?? highlightedLocale;\n}\n\nfunction TextPrompt({\n message,\n defaultValue,\n validate,\n onComplete,\n footer = 'type to edit enter select esc cancel',\n placeholder,\n}: EditableTextPromptProps) {\n const { columns } = useTerminalSize();\n const [value, setValue] = useState(defaultValue ?? '');\n const [error, setError] = useState<string | undefined>();\n const inputWidth = getInputWidth(columns);\n\n useInput((input, key) => {\n if (key.escape || (key.ctrl && input === 'c')) {\n complete(CANCELLED, onComplete);\n return;\n }\n if (key.return) {\n const validation = validate?.(value);\n if (validation && validation !== true) {\n setError(validation.toString());\n return;\n }\n complete({ value, cancelled: false }, onComplete);\n return;\n }\n if (key.backspace || key.delete) {\n setValue((current) => current.slice(0, -1));\n setError(undefined);\n return;\n }\n if (input && !key.ctrl && !key.meta && !key.return) {\n setValue((current) => current + input);\n setError(undefined);\n }\n });\n\n return (\n <PromptFrame message={message} footer={footer}>\n <InputBox value={value} width={inputWidth} placeholder={placeholder} />\n {error ? <Text color='red'>{error}</Text> : null}\n </PromptFrame>\n );\n}\n\nfunction LocalePrompt({\n message,\n defaultValue,\n onComplete,\n}: LocalePromptProps) {\n const { columns, rows } = useTerminalSize();\n const localeOptions = getLocaleOptions();\n const defaultLocale = defaultValue ? getSupportedLocale(defaultValue) : null;\n const defaultIndex = defaultLocale\n ? Math.max(\n 0,\n localeOptions.findIndex((option) => option.code === defaultLocale)\n )\n : 0;\n const [query, setQuery] = useState('');\n const [index, setIndex] = useState(defaultIndex);\n const [preferHighlightedLocale, setPreferHighlightedLocale] = useState(false);\n const [error, setError] = useState<string | undefined>();\n const filteredOptions = getFilteredLocaleOptions(query);\n const activeIndex = getSafeIndex(index, filteredOptions.length);\n const visibleCount = getVisibleCount(rows, 14);\n const { start, visibleItems: visibleOptions } = getScrollWindow({\n items: filteredOptions,\n index: activeIndex,\n visibleCount,\n });\n const inputWidth = getInputWidth(columns);\n const optionWidth = getOptionWidth(columns);\n\n useInput((input, key) => {\n if (key.escape || (key.ctrl && input === 'c')) {\n complete(CANCELLED, onComplete);\n return;\n }\n if (key.upArrow) {\n setPreferHighlightedLocale(true);\n setIndex((current) => previousIndex(current, filteredOptions.length));\n return;\n }\n if (key.downArrow) {\n setPreferHighlightedLocale(true);\n setIndex((current) => nextIndex(current, filteredOptions.length));\n return;\n }\n if (key.backspace || key.delete) {\n setQuery((current) => current.slice(0, -1));\n setIndex(0);\n setPreferHighlightedLocale(false);\n setError(undefined);\n return;\n }\n if (key.return) {\n const finalLocale = resolveLocaleChoice({\n query,\n highlightedLocale: filteredOptions[activeIndex]?.code,\n preferHighlightedLocale,\n });\n if (!finalLocale) {\n setError('Enter a valid locale (e.g., en)');\n return;\n }\n complete({ value: finalLocale, cancelled: false }, onComplete);\n return;\n }\n if (input && !key.ctrl && !key.meta) {\n setQuery((current) => current + input);\n setIndex(0);\n setPreferHighlightedLocale(false);\n setError(undefined);\n }\n });\n\n return (\n <PromptFrame\n message={message}\n footer='↑↓ navigate enter select esc cancel'\n >\n <InputBox\n value={query}\n width={inputWidth}\n placeholder='Search locales...'\n />\n <LocaleOptionsList\n options={visibleOptions}\n activeIndex={activeIndex - start}\n width={optionWidth}\n />\n <RemainingMatches total={filteredOptions.length} visible={visibleCount} />\n {error ? <Text color='red'>{error}</Text> : null}\n </PromptFrame>\n );\n}\n\nfunction LocaleMultiPrompt({\n message,\n defaultValue = [],\n required,\n onComplete,\n}: LocaleMultiPromptProps) {\n const { columns, rows } = useTerminalSize();\n const [query, setQuery] = useState('');\n const [index, setIndex] = useState(0);\n const [preferHighlightedLocale, setPreferHighlightedLocale] = useState(false);\n const [selected, setSelected] = useState<Set<string>>(new Set(defaultValue));\n const [error, setError] = useState<string | undefined>();\n const selectedLocales = [...selected];\n const filteredOptions = getFilteredLocaleOptions(query).filter(\n (option) => !selected.has(option.code)\n );\n const activeOptionIndex = getSafeIndex(index, filteredOptions.length);\n const visibleCount = getVisibleCount(rows, 16);\n const { start, visibleItems: visibleOptions } = getScrollWindow({\n items: filteredOptions,\n index: activeOptionIndex,\n visibleCount,\n });\n const inputWidth = getInputWidth(columns);\n const optionWidth = getOptionWidth(columns);\n const [selectedTagIndex, setSelectedTagIndex] = useState(0);\n const moveSelectedTag = (direction: -1 | 1) =>\n setSelectedTagIndex((current) =>\n Math.max(0, Math.min(selectedLocales.length - 1, current + direction))\n );\n const removeSelectedTag = () => {\n const localeToRemove = selectedLocales[selectedTagIndex];\n if (!localeToRemove) return;\n setSelected((current) => {\n const next = new Set(current);\n next.delete(localeToRemove);\n return next;\n });\n setSelectedTagIndex((current) =>\n Math.max(0, Math.min(current, selectedLocales.length - 2))\n );\n if (selectedLocales.length === 1) setIndex(0);\n setError(undefined);\n };\n const toggleVisibleLocale = () => {\n const selectedLocale = resolveLocaleChoice({\n query,\n highlightedLocale: filteredOptions[activeOptionIndex]?.code,\n preferHighlightedLocale,\n });\n if (!selectedLocale) {\n setError('Enter a valid locale (e.g., es fr de)');\n return;\n }\n setSelected((current) => {\n const next = new Set(current);\n if (next.has(selectedLocale)) {\n next.delete(selectedLocale);\n } else {\n next.add(selectedLocale);\n }\n return next;\n });\n setQuery('');\n setError(undefined);\n };\n\n useInput((input, key) => {\n if (key.escape || (key.ctrl && input === 'c')) {\n complete(CANCELLED, onComplete);\n return;\n }\n if (key.upArrow) {\n setPreferHighlightedLocale(true);\n setIndex((current) => {\n if (current === SELECTED_TAG_ROW_INDEX) {\n if (selectedTagIndex > 0) {\n moveSelectedTag(-1);\n return SELECTED_TAG_ROW_INDEX;\n }\n return Math.max(filteredOptions.length - 1, 0);\n }\n if (current === 0 && selectedLocales.length > 0) {\n setSelectedTagIndex(selectedLocales.length - 1);\n return SELECTED_TAG_ROW_INDEX;\n }\n if (current === 0) {\n return Math.max(filteredOptions.length - 1, 0);\n }\n return current - 1;\n });\n return;\n }\n if (key.downArrow) {\n setPreferHighlightedLocale(true);\n setIndex((current) => {\n if (filteredOptions.length === 0) return 0;\n if (current === SELECTED_TAG_ROW_INDEX) {\n if (selectedTagIndex < selectedLocales.length - 1) {\n moveSelectedTag(1);\n return SELECTED_TAG_ROW_INDEX;\n }\n return 0;\n }\n return nextIndex(current, filteredOptions.length);\n });\n return;\n }\n if (index === SELECTED_TAG_ROW_INDEX && key.leftArrow) {\n setSelectedTagIndex((current) => Math.max(0, current - 1));\n return;\n }\n if (index === SELECTED_TAG_ROW_INDEX && key.rightArrow) {\n setSelectedTagIndex((current) =>\n Math.min(selectedLocales.length - 1, current + 1)\n );\n return;\n }\n if (key.backspace || key.delete) {\n setQuery((current) => current.slice(0, -1));\n setIndex(0);\n setPreferHighlightedLocale(false);\n setError(undefined);\n return;\n }\n if (input === ' ' && index === SELECTED_TAG_ROW_INDEX) {\n removeSelectedTag();\n return;\n }\n if (input === ' ') {\n toggleVisibleLocale();\n return;\n }\n if (key.return) {\n if (required && selected.size === 0) {\n setError('Select at least one locale');\n return;\n }\n complete({ value: [...selected], cancelled: false }, onComplete);\n return;\n }\n if (input && !key.ctrl && !key.meta) {\n setQuery((current) => current + input);\n setIndex(0);\n setPreferHighlightedLocale(false);\n setError(undefined);\n }\n });\n\n return (\n <PromptFrame\n message={message}\n footer='↑↓ navigate space toggle enter confirm esc cancel'\n >\n <InputBox\n value={query}\n width={inputWidth}\n placeholder='Search locales...'\n />\n <Box marginTop={1}>\n <SelectedTags\n selectedLocales={selectedLocales}\n active={index === SELECTED_TAG_ROW_INDEX}\n activeIndex={selectedTagIndex}\n width={optionWidth}\n />\n </Box>\n <LocaleOptionsList\n options={visibleOptions}\n activeIndex={\n index === SELECTED_TAG_ROW_INDEX\n ? SELECTED_TAG_ROW_INDEX\n : activeOptionIndex - start\n }\n width={optionWidth}\n />\n <RemainingMatches total={filteredOptions.length} visible={visibleCount} />\n {error ? <Text color='red'>{error}</Text> : null}\n </PromptFrame>\n );\n}\n\nfunction GlobPrompt({\n label,\n message,\n defaultValue,\n onComplete,\n}: GlobPromptProps) {\n return (\n <TextPrompt\n message={\n message ??\n `${label}: Enter space-separated glob patterns for files to translate. Include [locale].`\n }\n defaultValue={defaultValue}\n footer='enter save esc cancel'\n onComplete={onComplete}\n />\n );\n}\n\nfunction SelectPrompt<T>({\n message,\n options,\n defaultValue,\n onComplete,\n}: SelectPromptProps<T>) {\n const defaultIndex = Math.max(\n 0,\n options.findIndex((option) => option.value === defaultValue)\n );\n const [index, setIndex] = useState(defaultIndex);\n\n useInput((input, key) => {\n if (key.escape || (key.ctrl && input === 'c')) {\n complete(CANCELLED, onComplete);\n return;\n }\n if (key.upArrow) {\n setIndex((current) => (current === 0 ? options.length - 1 : current - 1));\n return;\n }\n if (key.downArrow) {\n setIndex((current) => (current + 1) % options.length);\n return;\n }\n if (key.return) {\n complete({ value: options[index]?.value, cancelled: false }, onComplete);\n }\n });\n\n return (\n <PromptFrame\n message={message}\n footer='↑↓ navigate enter select esc cancel'\n >\n {options.map((option, optionIndex) => (\n <OptionRow\n key={optionIndex}\n active={optionIndex === index}\n label={option.label}\n hint={option.hint}\n />\n ))}\n </PromptFrame>\n );\n}\n\nfunction MultiSelectPrompt<T extends string>({\n message,\n options,\n required,\n onComplete,\n}: MultiSelectPromptProps<T>) {\n const [index, setIndex] = useState(0);\n const [selected, setSelected] = useState<Set<number>>(new Set());\n const [error, setError] = useState<string | undefined>();\n\n useInput((input, key) => {\n if (key.escape || (key.ctrl && input === 'c')) {\n complete(CANCELLED, onComplete);\n return;\n }\n if (key.upArrow) {\n setIndex((current) => (current === 0 ? options.length - 1 : current - 1));\n return;\n }\n if (key.downArrow) {\n setIndex((current) => (current + 1) % options.length);\n return;\n }\n if (input === ' ') {\n setSelected((current) => {\n const next = new Set(current);\n if (next.has(index)) {\n next.delete(index);\n } else {\n next.add(index);\n }\n return next;\n });\n setError(undefined);\n return;\n }\n if (key.return) {\n if (required && selected.size === 0) {\n setError('Select at least one option');\n return;\n }\n const values = [...selected]\n .sort((a, b) => a - b)\n .map((selectedIndex) => options[selectedIndex]?.value)\n .filter((value): value is T => value != null);\n complete({ value: values, cancelled: false }, onComplete);\n }\n });\n\n return (\n <PromptFrame\n message={message}\n footer='↑↓ navigate space toggle enter select esc cancel'\n >\n {options.map((option, optionIndex) => (\n <OptionRow\n key={optionIndex}\n active={optionIndex === index}\n selected={selected.has(optionIndex)}\n label={option.label}\n hint={option.hint}\n />\n ))}\n {error ? <Text color='red'>{error}</Text> : null}\n </PromptFrame>\n );\n}\n\nfunction ConfirmPrompt({\n message,\n defaultValue,\n onComplete,\n}: ConfirmPromptProps) {\n const options = [\n { value: true, label: 'Yes' },\n { value: false, label: 'No' },\n ];\n const [index, setIndex] = useState(defaultValue ? 0 : 1);\n\n useInput((input, key) => {\n if (key.escape || (key.ctrl && input === 'c')) {\n complete(CANCELLED, onComplete);\n return;\n }\n if (key.leftArrow || key.upArrow || key.rightArrow || key.downArrow) {\n setIndex((current) => (current === 0 ? 1 : 0));\n return;\n }\n if (input.toLowerCase() === 'y') {\n complete({ value: true, cancelled: false }, onComplete);\n return;\n }\n if (input.toLowerCase() === 'n') {\n complete({ value: false, cancelled: false }, onComplete);\n return;\n }\n if (key.return) {\n complete({ value: options[index]!.value, cancelled: false }, onComplete);\n }\n });\n\n return (\n <PromptFrame\n message={message}\n footer='←→ choose y/n select enter confirm esc cancel'\n >\n {options.map((option, optionIndex) => (\n <OptionRow\n key={option.label}\n active={optionIndex === index}\n label={option.label}\n />\n ))}\n </PromptFrame>\n );\n}\n\nexport async function inkPromptText(\n options: Omit<TextPromptProps, 'onComplete'>\n) {\n return runPrompt<string>((onComplete) => (\n <TextPrompt {...options} onComplete={onComplete} />\n ));\n}\n\nexport async function inkPromptLocale(\n options: Omit<LocalePromptProps, 'onComplete'>\n) {\n return runPrompt<string>((onComplete) => (\n <LocalePrompt {...options} onComplete={onComplete} />\n ));\n}\n\nexport async function inkPromptLocaleMulti(\n options: Omit<LocaleMultiPromptProps, 'onComplete'>\n) {\n return runPrompt<string[]>((onComplete) => (\n <LocaleMultiPrompt {...options} onComplete={onComplete} />\n ));\n}\n\nexport async function inkPromptGlob(\n options: Omit<GlobPromptProps, 'onComplete'>\n) {\n return runPrompt<string>((onComplete) => (\n <GlobPrompt {...options} onComplete={onComplete} />\n ));\n}\n\nexport async function inkPromptSelect<T>(\n options: Omit<SelectPromptProps<T>, 'onComplete'>\n) {\n return runPrompt<T>((onComplete) => (\n <SelectPrompt {...options} onComplete={onComplete} />\n ));\n}\n\nexport async function inkPromptMultiSelect<T extends string>(\n options: Omit<MultiSelectPromptProps<T>, 'onComplete'>\n) {\n return runPrompt<Array<T>>((onComplete) => (\n <MultiSelectPrompt {...options} onComplete={onComplete} />\n ));\n}\n\nexport async function inkPromptConfirm(\n options: Omit<ConfirmPromptProps, 'onComplete'>\n) {\n return runPrompt<boolean>((onComplete) => (\n <ConfirmPrompt {...options} onComplete={onComplete} />\n ));\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- export declare const PACKAGE_VERSION = "2.14.64";
1
+ export declare const PACKAGE_VERSION = "2.14.66";
@@ -1,5 +1,5 @@
1
1
  //#region src/generated/version.ts
2
- const PACKAGE_VERSION = "2.14.64";
2
+ const PACKAGE_VERSION = "2.14.66";
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.64';\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.66';\n"],"mappings":";AACA,MAAa,kBAAkB"}
@@ -1,5 +1,5 @@
1
1
  import * as t from "@babel/types";
2
- import { parse } from "@formatjs/icu-messageformat-parser";
2
+ import { parse } from "@generaltranslation/icu";
3
3
  //#region src/react/jsx/evaluateJsx.ts
4
4
  const MEANINGFUL_REGEX = /[\p{L}\p{N}]/u;
5
5
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"evaluateJsx.js","names":[],"sources":["../../../src/react/jsx/evaluateJsx.ts"],"sourcesContent":["import * as t from '@babel/types';\nimport { parse } from '@formatjs/icu-messageformat-parser';\n\nconst MEANINGFUL_REGEX = /[\\p{L}\\p{N}]/u;\n\n/**\n * Checks if a node is meaningful. Does not recurse into children.\n * @param node - The node to check\n * @returns Whether the node is meaningful\n */\nexport function isMeaningful(node: t.Node): boolean {\n if (t.isStringLiteral(node) || t.isJSXText(node)) {\n return MEANINGFUL_REGEX.test(node.value);\n }\n // Handle template literals without expressions\n if (t.isTemplateLiteral(node) && node.expressions.length === 0) {\n return MEANINGFUL_REGEX.test(node.quasis[0].value.raw);\n }\n if (t.isJSXExpressionContainer(node)) {\n const value = isStaticExpression(node.expression);\n if (value.isStatic && value.value) {\n return MEANINGFUL_REGEX.test(value.value);\n }\n }\n if (t.isBinaryExpression(node)) {\n if (node.operator === '+') {\n return isMeaningful(node.left) || isMeaningful(node.right);\n }\n }\n return false;\n}\n\nexport function isStaticExpression(\n expr: t.Expression | t.JSXEmptyExpression,\n jsxStatic?: false\n): {\n isStatic: boolean;\n value?: string;\n};\nexport function isStaticExpression(\n expr: t.Expression | t.JSXEmptyExpression,\n jsxStatic?: true\n): {\n isStatic: boolean;\n value?: string | boolean | null;\n};\nexport function isStaticExpression(\n expr: t.Expression | t.JSXEmptyExpression,\n jsxStatic?: boolean\n): {\n isStatic: boolean;\n value?: string | boolean | null;\n};\n/**\n * Checks if an expression is a static expression (does not contain any variables which could change at runtime).\n * @param expr - The expression to check\n * @param jsxStatic - Whether to return JSX-compatible values (boolean, null) in addition to strings\n * @returns An object containing the result of the static check\n */\nexport function isStaticExpression(\n expr: t.Expression | t.JSXEmptyExpression,\n jsxStatic = false\n): {\n isStatic: boolean;\n value?: string | boolean | null;\n} {\n // Handle empty expressions\n if (t.isJSXEmptyExpression(expr)) {\n return { isStatic: true, value: '' };\n }\n\n // Handle direct string literals\n if (t.isStringLiteral(expr)) {\n return { isStatic: true, value: expr.value };\n }\n\n // Handle template literals without expressions\n if (t.isTemplateLiteral(expr) && expr.expressions.length === 0) {\n return {\n isStatic: true,\n value: jsxStatic ? expr.quasis[0].value.cooked : expr.quasis[0].value.raw,\n };\n }\n\n // Binary expressions are not derivable\n if (t.isBinaryExpression(expr)) {\n // Not a derivable expression\n return { isStatic: false };\n }\n\n // Handle parenthesized expressions\n if (t.isParenthesizedExpression(expr)) {\n return isStaticExpression(expr.expression, jsxStatic);\n }\n\n // Handle numeric literals by converting them to strings\n if (t.isNumericLiteral(expr)) {\n return { isStatic: true, value: String(expr.value) };\n }\n\n // Handle unary expressions by converting them to strings\n if (t.isUnaryExpression(expr)) {\n let value: string;\n let operator = '';\n if (expr.operator === '-') {\n operator = expr.operator;\n }\n if (t.isNumericLiteral(expr.argument)) {\n if (expr.argument.value === 0) {\n value = '0';\n } else {\n value = operator + expr.argument.value.toString();\n }\n } else {\n // invalid\n return { isStatic: false };\n }\n\n return { isStatic: true, value };\n }\n\n // Handle boolean literals by converting them to strings\n if (t.isBooleanLiteral(expr)) {\n return {\n isStatic: true,\n value: jsxStatic ? expr.value : String(expr.value),\n };\n }\n\n // Handle null literal\n if (t.isNullLiteral(expr)) {\n return { isStatic: true, value: jsxStatic ? null : 'null' };\n }\n\n // Not a derivable expression\n return { isStatic: false };\n}\n\n/**\n * Checks if an expression is a static value (a string, number, or template literal).\n * @param expr - The expression to check\n * @returns Whether the expression is a static value\n */\nexport function isStaticValue(\n expr: t.Expression | t.JSXEmptyExpression\n): boolean {\n if (t.isStringLiteral(expr)) {\n return true;\n }\n if (t.isNumericLiteral(expr)) {\n return true;\n }\n if (t.isTemplateLiteral(expr)) {\n return true;\n }\n return false;\n}\n\n/**\n * Checks if a string is a valid ICU message format.\n * @param string - The string to check\n * @returns Whether the string is a valid ICU message format\n */\nexport function isValidIcu(string: string): {\n isValid: boolean;\n error?: string;\n} {\n try {\n parse(string);\n } catch (error) {\n return {\n isValid: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n return { isValid: true };\n}\n"],"mappings":";;;AAGA,MAAM,mBAAmB;;;;;;AAOzB,SAAgB,aAAa,MAAuB;AAClD,KAAI,EAAE,gBAAgB,KAAK,IAAI,EAAE,UAAU,KAAK,CAC9C,QAAO,iBAAiB,KAAK,KAAK,MAAM;AAG1C,KAAI,EAAE,kBAAkB,KAAK,IAAI,KAAK,YAAY,WAAW,EAC3D,QAAO,iBAAiB,KAAK,KAAK,OAAO,GAAG,MAAM,IAAI;AAExD,KAAI,EAAE,yBAAyB,KAAK,EAAE;EACpC,MAAM,QAAQ,mBAAmB,KAAK,WAAW;AACjD,MAAI,MAAM,YAAY,MAAM,MAC1B,QAAO,iBAAiB,KAAK,MAAM,MAAM;;AAG7C,KAAI,EAAE,mBAAmB,KAAK;MACxB,KAAK,aAAa,IACpB,QAAO,aAAa,KAAK,KAAK,IAAI,aAAa,KAAK,MAAM;;AAG9D,QAAO;;;;;;;;AA8BT,SAAgB,mBACd,MACA,YAAY,OAIZ;AAEA,KAAI,EAAE,qBAAqB,KAAK,CAC9B,QAAO;EAAE,UAAU;EAAM,OAAO;EAAI;AAItC,KAAI,EAAE,gBAAgB,KAAK,CACzB,QAAO;EAAE,UAAU;EAAM,OAAO,KAAK;EAAO;AAI9C,KAAI,EAAE,kBAAkB,KAAK,IAAI,KAAK,YAAY,WAAW,EAC3D,QAAO;EACL,UAAU;EACV,OAAO,YAAY,KAAK,OAAO,GAAG,MAAM,SAAS,KAAK,OAAO,GAAG,MAAM;EACvE;AAIH,KAAI,EAAE,mBAAmB,KAAK,CAE5B,QAAO,EAAE,UAAU,OAAO;AAI5B,KAAI,EAAE,0BAA0B,KAAK,CACnC,QAAO,mBAAmB,KAAK,YAAY,UAAU;AAIvD,KAAI,EAAE,iBAAiB,KAAK,CAC1B,QAAO;EAAE,UAAU;EAAM,OAAO,OAAO,KAAK,MAAM;EAAE;AAItD,KAAI,EAAE,kBAAkB,KAAK,EAAE;EAC7B,IAAI;EACJ,IAAI,WAAW;AACf,MAAI,KAAK,aAAa,IACpB,YAAW,KAAK;AAElB,MAAI,EAAE,iBAAiB,KAAK,SAAS,CACnC,KAAI,KAAK,SAAS,UAAU,EAC1B,SAAQ;MAER,SAAQ,WAAW,KAAK,SAAS,MAAM,UAAU;MAInD,QAAO,EAAE,UAAU,OAAO;AAG5B,SAAO;GAAE,UAAU;GAAM;GAAO;;AAIlC,KAAI,EAAE,iBAAiB,KAAK,CAC1B,QAAO;EACL,UAAU;EACV,OAAO,YAAY,KAAK,QAAQ,OAAO,KAAK,MAAM;EACnD;AAIH,KAAI,EAAE,cAAc,KAAK,CACvB,QAAO;EAAE,UAAU;EAAM,OAAO,YAAY,OAAO;EAAQ;AAI7D,QAAO,EAAE,UAAU,OAAO;;;;;;;AAQ5B,SAAgB,cACd,MACS;AACT,KAAI,EAAE,gBAAgB,KAAK,CACzB,QAAO;AAET,KAAI,EAAE,iBAAiB,KAAK,CAC1B,QAAO;AAET,KAAI,EAAE,kBAAkB,KAAK,CAC3B,QAAO;AAET,QAAO;;;;;;;AAQT,SAAgB,WAAW,QAGzB;AACA,KAAI;AACF,QAAM,OAAO;UACN,OAAO;AACd,SAAO;GACL,SAAS;GACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;GAC9D;;AAEH,QAAO,EAAE,SAAS,MAAM"}
1
+ {"version":3,"file":"evaluateJsx.js","names":[],"sources":["../../../src/react/jsx/evaluateJsx.ts"],"sourcesContent":["import * as t from '@babel/types';\nimport { parse } from '@generaltranslation/icu';\n\nconst MEANINGFUL_REGEX = /[\\p{L}\\p{N}]/u;\n\n/**\n * Checks if a node is meaningful. Does not recurse into children.\n * @param node - The node to check\n * @returns Whether the node is meaningful\n */\nexport function isMeaningful(node: t.Node): boolean {\n if (t.isStringLiteral(node) || t.isJSXText(node)) {\n return MEANINGFUL_REGEX.test(node.value);\n }\n // Handle template literals without expressions\n if (t.isTemplateLiteral(node) && node.expressions.length === 0) {\n return MEANINGFUL_REGEX.test(node.quasis[0].value.raw);\n }\n if (t.isJSXExpressionContainer(node)) {\n const value = isStaticExpression(node.expression);\n if (value.isStatic && value.value) {\n return MEANINGFUL_REGEX.test(value.value);\n }\n }\n if (t.isBinaryExpression(node)) {\n if (node.operator === '+') {\n return isMeaningful(node.left) || isMeaningful(node.right);\n }\n }\n return false;\n}\n\nexport function isStaticExpression(\n expr: t.Expression | t.JSXEmptyExpression,\n jsxStatic?: false\n): {\n isStatic: boolean;\n value?: string;\n};\nexport function isStaticExpression(\n expr: t.Expression | t.JSXEmptyExpression,\n jsxStatic?: true\n): {\n isStatic: boolean;\n value?: string | boolean | null;\n};\nexport function isStaticExpression(\n expr: t.Expression | t.JSXEmptyExpression,\n jsxStatic?: boolean\n): {\n isStatic: boolean;\n value?: string | boolean | null;\n};\n/**\n * Checks if an expression is a static expression (does not contain any variables which could change at runtime).\n * @param expr - The expression to check\n * @param jsxStatic - Whether to return JSX-compatible values (boolean, null) in addition to strings\n * @returns An object containing the result of the static check\n */\nexport function isStaticExpression(\n expr: t.Expression | t.JSXEmptyExpression,\n jsxStatic = false\n): {\n isStatic: boolean;\n value?: string | boolean | null;\n} {\n // Handle empty expressions\n if (t.isJSXEmptyExpression(expr)) {\n return { isStatic: true, value: '' };\n }\n\n // Handle direct string literals\n if (t.isStringLiteral(expr)) {\n return { isStatic: true, value: expr.value };\n }\n\n // Handle template literals without expressions\n if (t.isTemplateLiteral(expr) && expr.expressions.length === 0) {\n return {\n isStatic: true,\n value: jsxStatic ? expr.quasis[0].value.cooked : expr.quasis[0].value.raw,\n };\n }\n\n // Binary expressions are not derivable\n if (t.isBinaryExpression(expr)) {\n // Not a derivable expression\n return { isStatic: false };\n }\n\n // Handle parenthesized expressions\n if (t.isParenthesizedExpression(expr)) {\n return isStaticExpression(expr.expression, jsxStatic);\n }\n\n // Handle numeric literals by converting them to strings\n if (t.isNumericLiteral(expr)) {\n return { isStatic: true, value: String(expr.value) };\n }\n\n // Handle unary expressions by converting them to strings\n if (t.isUnaryExpression(expr)) {\n let value: string;\n let operator = '';\n if (expr.operator === '-') {\n operator = expr.operator;\n }\n if (t.isNumericLiteral(expr.argument)) {\n if (expr.argument.value === 0) {\n value = '0';\n } else {\n value = operator + expr.argument.value.toString();\n }\n } else {\n // invalid\n return { isStatic: false };\n }\n\n return { isStatic: true, value };\n }\n\n // Handle boolean literals by converting them to strings\n if (t.isBooleanLiteral(expr)) {\n return {\n isStatic: true,\n value: jsxStatic ? expr.value : String(expr.value),\n };\n }\n\n // Handle null literal\n if (t.isNullLiteral(expr)) {\n return { isStatic: true, value: jsxStatic ? null : 'null' };\n }\n\n // Not a derivable expression\n return { isStatic: false };\n}\n\n/**\n * Checks if an expression is a static value (a string, number, or template literal).\n * @param expr - The expression to check\n * @returns Whether the expression is a static value\n */\nexport function isStaticValue(\n expr: t.Expression | t.JSXEmptyExpression\n): boolean {\n if (t.isStringLiteral(expr)) {\n return true;\n }\n if (t.isNumericLiteral(expr)) {\n return true;\n }\n if (t.isTemplateLiteral(expr)) {\n return true;\n }\n return false;\n}\n\n/**\n * Checks if a string is a valid ICU message format.\n * @param string - The string to check\n * @returns Whether the string is a valid ICU message format\n */\nexport function isValidIcu(string: string): {\n isValid: boolean;\n error?: string;\n} {\n try {\n parse(string);\n } catch (error) {\n return {\n isValid: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n return { isValid: true };\n}\n"],"mappings":";;;AAGA,MAAM,mBAAmB;;;;;;AAOzB,SAAgB,aAAa,MAAuB;AAClD,KAAI,EAAE,gBAAgB,KAAK,IAAI,EAAE,UAAU,KAAK,CAC9C,QAAO,iBAAiB,KAAK,KAAK,MAAM;AAG1C,KAAI,EAAE,kBAAkB,KAAK,IAAI,KAAK,YAAY,WAAW,EAC3D,QAAO,iBAAiB,KAAK,KAAK,OAAO,GAAG,MAAM,IAAI;AAExD,KAAI,EAAE,yBAAyB,KAAK,EAAE;EACpC,MAAM,QAAQ,mBAAmB,KAAK,WAAW;AACjD,MAAI,MAAM,YAAY,MAAM,MAC1B,QAAO,iBAAiB,KAAK,MAAM,MAAM;;AAG7C,KAAI,EAAE,mBAAmB,KAAK;MACxB,KAAK,aAAa,IACpB,QAAO,aAAa,KAAK,KAAK,IAAI,aAAa,KAAK,MAAM;;AAG9D,QAAO;;;;;;;;AA8BT,SAAgB,mBACd,MACA,YAAY,OAIZ;AAEA,KAAI,EAAE,qBAAqB,KAAK,CAC9B,QAAO;EAAE,UAAU;EAAM,OAAO;EAAI;AAItC,KAAI,EAAE,gBAAgB,KAAK,CACzB,QAAO;EAAE,UAAU;EAAM,OAAO,KAAK;EAAO;AAI9C,KAAI,EAAE,kBAAkB,KAAK,IAAI,KAAK,YAAY,WAAW,EAC3D,QAAO;EACL,UAAU;EACV,OAAO,YAAY,KAAK,OAAO,GAAG,MAAM,SAAS,KAAK,OAAO,GAAG,MAAM;EACvE;AAIH,KAAI,EAAE,mBAAmB,KAAK,CAE5B,QAAO,EAAE,UAAU,OAAO;AAI5B,KAAI,EAAE,0BAA0B,KAAK,CACnC,QAAO,mBAAmB,KAAK,YAAY,UAAU;AAIvD,KAAI,EAAE,iBAAiB,KAAK,CAC1B,QAAO;EAAE,UAAU;EAAM,OAAO,OAAO,KAAK,MAAM;EAAE;AAItD,KAAI,EAAE,kBAAkB,KAAK,EAAE;EAC7B,IAAI;EACJ,IAAI,WAAW;AACf,MAAI,KAAK,aAAa,IACpB,YAAW,KAAK;AAElB,MAAI,EAAE,iBAAiB,KAAK,SAAS,CACnC,KAAI,KAAK,SAAS,UAAU,EAC1B,SAAQ;MAER,SAAQ,WAAW,KAAK,SAAS,MAAM,UAAU;MAInD,QAAO,EAAE,UAAU,OAAO;AAG5B,SAAO;GAAE,UAAU;GAAM;GAAO;;AAIlC,KAAI,EAAE,iBAAiB,KAAK,CAC1B,QAAO;EACL,UAAU;EACV,OAAO,YAAY,KAAK,QAAQ,OAAO,KAAK,MAAM;EACnD;AAIH,KAAI,EAAE,cAAc,KAAK,CACvB,QAAO;EAAE,UAAU;EAAM,OAAO,YAAY,OAAO;EAAQ;AAI7D,QAAO,EAAE,UAAU,OAAO;;;;;;;AAQ5B,SAAgB,cACd,MACS;AACT,KAAI,EAAE,gBAAgB,KAAK,CACzB,QAAO;AAET,KAAI,EAAE,iBAAiB,KAAK,CAC1B,QAAO;AAET,KAAI,EAAE,kBAAkB,KAAK,CAC3B,QAAO;AAET,QAAO;;;;;;;AAQT,SAAgB,WAAW,QAGzB;AACA,KAAI;AACF,QAAM,OAAO;UACN,OAAO;AACd,SAAO;GACL,SAAS;GACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;GAC9D;;AAEH,QAAO,EAAE,SAAS,MAAM"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gt",
3
- "version": "2.14.64",
3
+ "version": "2.14.66",
4
4
  "main": "dist/index.js",
5
5
  "bin": "bin/main.js",
6
6
  "files": [
@@ -86,7 +86,6 @@
86
86
  "@babel/traverse": "^7.25.7",
87
87
  "@babel/types": "^7.25.7",
88
88
  "@clack/prompts": "1.0.0-alpha.6",
89
- "@formatjs/icu-messageformat-parser": "^2.11.4",
90
89
  "chalk": "^5.4.1",
91
90
  "commander": "^12.1.0",
92
91
  "dotenv": "^16.4.5",
@@ -115,10 +114,11 @@
115
114
  "unified": "^11.0.5",
116
115
  "unist-util-visit": "^5.0.0",
117
116
  "yaml": "^2.8.0",
118
- "@generaltranslation/format": "0.1.2",
119
- "@generaltranslation/python-extractor": "0.2.30",
120
- "@generaltranslation/supported-locales": "2.1.10",
121
- "generaltranslation": "9.0.3",
117
+ "@generaltranslation/icu": "0.1.0",
118
+ "@generaltranslation/format": "0.1.3",
119
+ "@generaltranslation/python-extractor": "0.2.31",
120
+ "@generaltranslation/supported-locales": "2.1.11",
121
+ "generaltranslation": "9.0.4",
122
122
  "gt-remark": "1.0.11"
123
123
  },
124
124
  "devDependencies": {