diff --git a/.eslintignore b/.eslintignore index dbdaf0fe..0a579f73 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,4 @@ /dist /out -/ts-dist \ No newline at end of file +/main-ts-dist +/common-ts-dist diff --git a/.gitignore b/.gitignore index 264961cf..986f8277 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ node_modules /doc /ffmpeg /app*.log -/ts-dist +/main-ts-dist +/common-ts-dist tsconfig.*.tsbuildinfo \ No newline at end of file diff --git a/i18next-parser.config.mjs b/i18next-parser.config.mjs deleted file mode 100644 index 766d1b1a..00000000 --- a/i18next-parser.config.mjs +++ /dev/null @@ -1,22 +0,0 @@ -// eslint-disable-line unicorn/filename-case -export default { - input: ['src/renderer/**/*.{js,jsx,ts,tsx}', 'src/main/*.{js,ts}'], - - output: 'locales/$LOCALE/$NAMESPACE.json', - indentation: 4, - - sort: true, - - locales: ['en'], - - lexers: { - js: ['JavascriptLexer'], - jsx: ['JsxLexer'], - }, - - defaultValue: (lng, ns, key) => key, - - // Keep in sync between i18next-parser.config.js and i18nCommon.js: - keySeparator: false, - namespaceSeparator: false, -}; diff --git a/i18next.config.ts b/i18next.config.ts new file mode 100644 index 00000000..14cda44e --- /dev/null +++ b/i18next.config.ts @@ -0,0 +1,37 @@ +// eslint-disable-next-line import/no-extraneous-dependencies +import { defineConfig } from 'i18next-cli'; + +import { langNames, mapLang, SupportedLanguage } from './src/common/i18n.js'; + + +export default defineConfig({ + locales: Object.keys(langNames).map((lng) => mapLang(lng as SupportedLanguage)), + extract: { + input: [ + 'src/renderer/**/*.{ts,tsx}', + 'src/main/**/*.ts', + 'src/common/**/*.ts', + 'src/preload/**/*.ts', + ], + output: 'locales/{{language}}/{{namespace}}.json', + defaultNS: 'translation', + functions: [ + 't', + '*.t', + ], + transComponents: [ + 'Trans', + ], + ignoredAttributes: ['data-testid', 'aria-label', 'role'], + + // Keep in sync between i18next-parser.config.js and i18nCommon.js: + keySeparator: false, + nsSeparator: false, + }, + types: { + input: [ + 'locales/{{language}}/{{namespace}}.json', + ], + output: 'src/types/i18next.d.ts', + }, +}); diff --git a/package.json b/package.json index 63ab6a01..6dcafb90 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "main": "./out/main/index.js", "homepage": "./", "scripts": { - "clean": "rimraf dist out ts-dist build-resources icon-build", + "clean": "rimraf dist out common-ts-dist main-ts-dist build-resources icon-build", "start": "electron-vite preview", "dev": "electron-vite dev -w", "icon-gen": "mkdirp icon-build build-resources/appx && tsx script/icon-gen.mts", @@ -25,7 +25,7 @@ "postinstall": "electron-builder install-app-deps", "version": "tsx script/postversion.mts && git add no.mifi.losslesscut.appdata.xml", "pack-linux": "yarn build && electron-builder --linux", - "scan-i18n": "i18next --config i18next-parser.config.mjs", + "scan-i18n": "i18next-cli extract", "generate-licenses": "yarn licenses generate-disclaimer > licenses.txt && echo '\n\nffmpeg is licensed under GPL v2+:\n\nhttp://www.gnu.org/licenses/old-licenses/gpl-2.0.html' >> licenses.txt" }, "author": { @@ -96,6 +96,7 @@ "eslint-plugin-unicorn": "^51.0.1", "fast-xml-parser": "^4.4.1", "framer-motion": "^9.0.3", + "i18next-cli": "^1.22.2", "i18next-parser": "^9.0.1", "icon-gen": "^4.0.0", "immer": "^10.0.2", @@ -111,7 +112,7 @@ "pretty-bytes": "^6.0.0", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-i18next": "^15.0.0", + "react-i18next": "^16.2.4", "react-icons": "^4.1.0", "react-leaflet": "^4.2.1", "react-lottie-player": "^1.5.0", @@ -147,7 +148,7 @@ "express-async-handler": "^1.2.0", "file-type": "patch:file-type@npm%3A19.4.1#~/.yarn/patches/file-type-npm-19.4.1-d18086444c.patch", "fs-extra": "^8.1.0", - "i18next": "^23.12.2", + "i18next": "^25.6.1", "i18next-fs-backend": "^2.3.2", "json5": "^2.2.2", "lodash.debounce": "^4.0.8", diff --git a/ffprobe.ts b/src/common/ffprobe.ts similarity index 100% rename from ffprobe.ts rename to src/common/ffprobe.ts diff --git a/src/common/i18n.ts b/src/common/i18n.ts new file mode 100644 index 00000000..eabcda9c --- /dev/null +++ b/src/common/i18n.ts @@ -0,0 +1,268 @@ +// returned from app.getLocale() +// https://www.electronjs.org/docs/api/app#appgetlocale +// https://source.chromium.org/chromium/chromium/src/+/master:ui/base/l10n/l10n_util.cc +export type ElectronLanguageKey = +'af' // Afrikaans +| 'ak' // Twi +| 'am' // Amharic +| 'an' // Aragonese +| 'ar' // Arabic +| 'as' // Assamese +| 'ast' // Asturian +| 'ay' // Aymara +| 'az' // Azerbaijani +| 'be' // Belarusian +| 'bg' // Bulgarian +| 'bho' // Bhojpuri +| 'bm' // Bambara +| 'bn' // Bengali +| 'br' // Breton +| 'bs' // Bosnian +| 'ca' // Catalan +| 'ceb' // Cebuano +| 'chr' // Cherokee +| 'ckb' // Kurdish (Arabic), Sorani +| 'co' // Corsican +| 'cs' // Czech +| 'cy' // Welsh +| 'da' // Danish +| 'de' // German +| 'de-AT' // German (Austria) +| 'de-CH' // German (Switzerland) +| 'de-DE' // German (Germany) +| 'de-LI' // German (Liechtenstein) +| 'doi' // Dogri +| 'dv' // Dhivehi +| 'ee' // Ewe +| 'el' // Greek +| 'en' // English +| 'en-AU' // English (Australia) +| 'en-CA' // English (Canada) +| 'en-GB' // English (UK) +| 'en-GB-oxendict' // English (UK, OED spelling) +| 'en-IE' // English (Ireland) +| 'en-IN' // English (India) +| 'en-NZ' // English (New Zealand) +| 'en-US' // English (US) +| 'en-ZA' // English (South Africa) +| 'eo' // Esperanto +| 'es' // Spanish +| 'es-419' // Spanish (Latin America) +| 'es-AR' // Spanish (Argentina) +| 'es-CL' // Spanish (Chile) +| 'es-CO' // Spanish (Colombia) +| 'es-CR' // Spanish (Costa Rica) +| 'es-ES' // Spanish (Spain) +| 'es-HN' // Spanish (Honduras) +| 'es-MX' // Spanish (Mexico) +| 'es-PE' // Spanish (Peru) +| 'es-US' // Spanish (US) +| 'es-UY' // Spanish (Uruguay) +| 'es-VE' // Spanish (Venezuela) +| 'et' // Estonian +| 'eu' // Basque +| 'fa' // Persian +| 'fi' // Finnish +| 'fil' // Filipino +| 'fo' // Faroese +| 'fr' // French +| 'fr-CA' // French (Canada) +| 'fr-CH' // French (Switzerland) +| 'fr-FR' // French (France) +| 'fy' // Frisian +| 'ga' // Irish +| 'gd' // Scots Gaelic +| 'gl' // Galician +| 'gn' // Guarani +| 'gu' // Gujarati +| 'ha' // Hausa +| 'haw' // Hawaiian +| 'he' // Hebrew +| 'hi' // Hindi +| 'hmn' // Hmong +| 'hr' // Croatian +| 'ht' // Haitian Creole +| 'hu' // Hungarian +| 'hy' // Armenian +| 'ia' // Interlingua +| 'id' // Indonesian +| 'ig' // Igbo +| 'ilo' // Ilocano +| 'is' // Icelandic +| 'it' // Italian +| 'it-CH' // Italian (Switzerland) +| 'it-IT' // Italian (Italy) +| 'ja' // Japanese +| 'jv' // Javanese +| 'ka' // Georgian +| 'kk' // Kazakh +| 'km' // Cambodian +| 'kn' // Kannada +| 'ko' // Korean +| 'kok' // Konkani +| 'kri' // Krio +| 'ku' // Kurdish +| 'ky' // Kyrgyz +| 'la' // Latin +| 'lb' // Luxembourgish +| 'lg' // Luganda +| 'ln' // Lingala +| 'lo' // Laothian +| 'lt' // Lithuanian +| 'lus' // Mizo +| 'lv' // Latvian +| 'mai' // Maithili +| 'mg' // Malagasy +| 'mi' // Maori +| 'mk' // Macedonian +| 'ml' // Malayalam +| 'mn' // Mongolian +| 'mni-Mtei' // Manipuri (Meitei Mayek) +| 'mo' // Moldavian +| 'mr' // Marathi +| 'ms' // Malay +| 'mt' // Maltese +| 'my' // Burmese +| 'nb' // Norwegian (Bokmal) +| 'ne' // Nepali +| 'nl' // Dutch +| 'nn' // Norwegian (Nynorsk) +| 'no' // Norwegian +| 'nso' // Sepedi +| 'ny' // Nyanja +| 'oc' // Occitan +| 'om' // Oromo +| 'or' // Odia (Oriya) +| 'pa' // Punjabi +| 'pl' // Polish +| 'ps' // Pashto +| 'pt' // Portuguese +| 'pt-BR' // Portuguese (Brazil) +| 'pt-PT' // Portuguese (Portugal) +| 'qu' // Quechua +| 'rm' // Romansh +| 'ro' // Romanian +| 'ru' // Russian +| 'rw' // Kinyarwanda +| 'sa' // Sanskrit +| 'sd' // Sindhi +| 'sh' // Serbo-Croatian +| 'si' // Sinhalese +| 'sk' // Slovak +| 'sl' // Slovenian +| 'sm' // Samoan +| 'sn' // Shona +| 'so' // Somali +| 'sq' // Albanian +| 'sr' // Serbian +| 'st' // Sesotho +| 'su' // Sundanese +| 'sv' // Swedish +| 'sw' // Swahili +| 'ta' // Tamil +| 'te' // Telugu +| 'tg' // Tajik +| 'th' // Thai +| 'ti' // Tigrinya +| 'tk' // Turkmen +| 'tn' // Tswana +| 'to' // Tonga +| 'tr' // Turkish +| 'ts' // Tsonga +| 'tt' // Tatar +| 'tw' // Twi +| 'ug' // Uyghur +| 'uk' // Ukrainian +| 'ur' // Urdu +| 'uz' // Uzbek +| 'vi' // Vietnamese +| 'wa' // Walloon +| 'wo' // Wolof +| 'xh' // Xhosa +| 'yi' // Yiddish +| 'yo' // Yoruba +| 'zh' // Chinese +| 'zh-CN' // Chinese (China) +| 'zh-HK' // Chinese (Hong Kong) +| 'zh-TW' // Chinese (Taiwan) +| 'zu' // Zulu + +// https://www.electronjs.org/docs/api/app#appgetlocale +// https://source.chromium.org/chromium/chromium/src/+/master:ui/base/l10n/l10n_util.cc +// See i18n.js +export const langNames = { + en: 'English', + cs: 'Čeština', + de: 'Deutsch', + es: 'Español', + fr: 'Français', + it: 'Italiano', + nl: 'Nederlands', + // nb: 'Norsk (bokmål)', + nn: 'Norsk (nynorsk)', + // sv: 'Svenska', + pl: 'Polski', + pt: 'Português', + 'pt-BR': 'Português do Brasil', + sl: 'Slovenščina', + sk: 'Slovenčina', + fi: 'Suomi', + ru: 'Русский', + uk: 'Українська', + tr: 'Türkçe', + vi: 'Tiếng Việt', + ja: '日本語', + 'zh-TW': '繁體中文', + 'zh-CN': '简体中文', + ko: '한국어', + ta: 'தமிழ்', + lt: 'Lietuvių', + hu: 'Magyar', +} satisfies Partial>; + +export type SupportedLanguage = (keyof typeof langNames); + +// Weblate hardcodes different lang codes than electron +// https://www.electronjs.org/docs/api/app#appgetlocale +// https://source.chromium.org/chromium/chromium/src/+/master:ui/base/l10n/l10n_util.cc +export function mapLang(lng: ElectronLanguageKey) { + const map: Partial> = { + 'de-AT': 'de', + 'de-CH': 'de', + 'de-DE': 'de', + 'de-LI': 'de', + + 'es-419': 'es', + 'es-AR': 'es', + 'es-CL': 'es', + 'es-CO': 'es', + 'es-CR': 'es', + 'es-ES': 'es', + 'es-HN': 'es', + 'es-MX': 'es', + 'es-PE': 'es', + 'es-US': 'es', + 'es-UY': 'es', + 'es-VE': 'es', + + 'fr-CA': 'fr', + 'fr-CH': 'fr', + 'fr-FR': 'fr', + + nb: 'nb_NO', + no: 'nb_NO', + + zh: 'zh_Hans', + 'zh-CN': 'zh_Hans', + 'zh-TW': 'zh_Hant', + 'zh-HK': 'zh_Hant', + + 'pt-BR': 'pt_BR', + 'pt-PT': 'pt', + + 'it-CH': 'it', + 'it-IT': 'it', + }; + + return map[lng] ?? lng; +} diff --git a/types.ts b/src/common/types.ts similarity index 58% rename from types.ts rename to src/common/types.ts index 355ad4bb..4fa684d6 100644 --- a/types.ts +++ b/src/common/types.ts @@ -1,3 +1,5 @@ +import { SupportedLanguage } from './i18n'; + export type KeyboardAction = 'addSegment' | 'togglePlayResetSpeed' | 'togglePlayNoResetSpeed' | 'reducePlaybackRate' | 'reducePlaybackRateMore' | 'increasePlaybackRate' | 'increasePlaybackRateMore' | 'timelineToggleComfortZoom' | 'seekPreviousFrame' | 'seekNextFrame' | 'captureSnapshot' | 'setCutStart' | 'setCutEnd' | 'removeCurrentSegment' | 'removeCurrentCutpoint' | 'cleanupFilesDialog' | 'splitCurrentSegment' | 'focusSegmentAtCursor' | 'selectSegmentsAtCursor' | 'increaseRotation' | 'goToTimecode' | 'seekBackwards' | 'seekBackwards2' | 'seekBackwards3' | 'seekBackwardsPercent' | 'seekBackwardsPercent' | 'seekBackwardsKeyframe' | 'jumpCutStart' | 'seekForwards' | 'seekForwards2' | 'seekForwards3' | 'seekForwardsPercent' | 'seekForwardsPercent' | 'seekForwardsKeyframe' | 'jumpCutEnd' | 'jumpTimelineStart' | 'jumpTimelineEnd' | 'jumpFirstSegment' | 'jumpPrevSegment' | 'jumpSeekFirstSegment' | 'jumpSeekPrevSegment' | 'timelineZoomIn' | 'timelineZoomIn' | 'batchPreviousFile' | 'jumpLastSegment' | 'jumpNextSegment' | 'jumpSeekLastSegment' | 'jumpSeekNextSegment' | 'timelineZoomOut' | 'timelineZoomOut' | 'batchNextFile' | 'batchOpenSelectedFile' | 'batchOpenPreviousFile' | 'batchOpenNextFile' | 'undo' | 'undo' | 'redo' | 'redo' | 'copySegmentsToClipboard' | 'copySegmentsToClipboard' | 'toggleFullscreenVideo' | 'labelCurrentSegment' | 'export' | 'toggleKeyboardShortcuts' | 'increaseVolume' | 'decreaseVolume' | 'toggleMuted' | 'detectBlackScenes' | 'detectSilentScenes' | 'detectSceneChanges' | 'toggleLastCommands' | 'play' | 'pause' | 'reloadFile' | 'html5ify' | 'makeCursorTimeZero' | 'togglePlayOnlyCurrentSegment' | 'toggleLoopOnlyCurrentSegment' | 'toggleLoopStartEndOnlyCurrentSegment' | 'togglePlaySelectedSegments' | 'toggleLoopSelectedSegments' | 'editCurrentSegmentTags' | 'duplicateCurrentSegment' | 'reorderSegsByStartTime' | 'invertAllSegments' | 'fillSegmentsGaps' | 'shiftAllSegmentTimes' | 'alignSegmentTimesToKeyframes' | 'readAllKeyframes' | 'createSegmentsFromKeyframes' | 'createFixedDurationSegments' | 'createNumSegments' | 'createFixedByteSizedSegments' | 'createRandomSegments' | 'shuffleSegments' | 'combineOverlappingSegments' | 'combineSelectedSegments' | 'clearSegments' | 'toggleSegmentsList' | 'selectOnlyCurrentSegment' | 'deselectAllSegments' | 'selectAllSegments' | 'toggleCurrentSegmentSelected' | 'invertSelectedSegments' | 'removeSelectedSegments' | 'toggleStreamsSelector' | 'extractAllStreams' | 'showStreamsSelector' | 'showIncludeExternalStreamsDialog' | 'captureSnapshotAsCoverArt' | 'extractCurrentSegmentFramesAsImages' | 'extractSelectedSegmentsFramesAsImages' | 'convertFormatBatch' | 'convertFormatCurrentFile' | 'fixInvalidDuration' | 'closeBatch' | 'concatBatch' | 'toggleKeyframeCutMode' | 'toggleCaptureFormat' | 'toggleStripAudio' | 'toggleStripVideo' | 'toggleStripSubtitle' | 'toggleStripThumbnail' | 'toggleStripCurrentFilter' | 'toggleStripAll' | 'toggleDarkMode' | 'setStartTimeOffset' | 'toggleWaveformMode' | 'toggleShowThumbnails' | 'toggleShowKeyframes' | 'toggleSettings' | 'openSendReportDialog' | 'openFilesDialog' | 'openDirDialog' | 'exportYouTube' | 'closeCurrentFile' | 'quit' | 'selectAllMarkers'; export interface KeyBinding { @@ -7,230 +9,6 @@ export interface KeyBinding { export type CaptureFormat = 'jpeg' | 'png' | 'webp'; -// returned from app.getLocale() -// https://www.electronjs.org/docs/api/app#appgetlocale -// https://source.chromium.org/chromium/chromium/src/+/master:ui/base/l10n/l10n_util.cc -export type ElectronLanguageKey = -'af' // Afrikaans -| 'ak' // Twi -| 'am' // Amharic -| 'an' // Aragonese -| 'ar' // Arabic -| 'as' // Assamese -| 'ast' // Asturian -| 'ay' // Aymara -| 'az' // Azerbaijani -| 'be' // Belarusian -| 'bg' // Bulgarian -| 'bho' // Bhojpuri -| 'bm' // Bambara -| 'bn' // Bengali -| 'br' // Breton -| 'bs' // Bosnian -| 'ca' // Catalan -| 'ceb' // Cebuano -| 'chr' // Cherokee -| 'ckb' // Kurdish (Arabic), Sorani -| 'co' // Corsican -| 'cs' // Czech -| 'cy' // Welsh -| 'da' // Danish -| 'de' // German -| 'de-AT' // German (Austria) -| 'de-CH' // German (Switzerland) -| 'de-DE' // German (Germany) -| 'de-LI' // German (Liechtenstein) -| 'doi' // Dogri -| 'dv' // Dhivehi -| 'ee' // Ewe -| 'el' // Greek -| 'en' // English -| 'en-AU' // English (Australia) -| 'en-CA' // English (Canada) -| 'en-GB' // English (UK) -| 'en-GB-oxendict' // English (UK, OED spelling) -| 'en-IE' // English (Ireland) -| 'en-IN' // English (India) -| 'en-NZ' // English (New Zealand) -| 'en-US' // English (US) -| 'en-ZA' // English (South Africa) -| 'eo' // Esperanto -| 'es' // Spanish -| 'es-419' // Spanish (Latin America) -| 'es-AR' // Spanish (Argentina) -| 'es-CL' // Spanish (Chile) -| 'es-CO' // Spanish (Colombia) -| 'es-CR' // Spanish (Costa Rica) -| 'es-ES' // Spanish (Spain) -| 'es-HN' // Spanish (Honduras) -| 'es-MX' // Spanish (Mexico) -| 'es-PE' // Spanish (Peru) -| 'es-US' // Spanish (US) -| 'es-UY' // Spanish (Uruguay) -| 'es-VE' // Spanish (Venezuela) -| 'et' // Estonian -| 'eu' // Basque -| 'fa' // Persian -| 'fi' // Finnish -| 'fil' // Filipino -| 'fo' // Faroese -| 'fr' // French -| 'fr-CA' // French (Canada) -| 'fr-CH' // French (Switzerland) -| 'fr-FR' // French (France) -| 'fy' // Frisian -| 'ga' // Irish -| 'gd' // Scots Gaelic -| 'gl' // Galician -| 'gn' // Guarani -| 'gu' // Gujarati -| 'ha' // Hausa -| 'haw' // Hawaiian -| 'he' // Hebrew -| 'hi' // Hindi -| 'hmn' // Hmong -| 'hr' // Croatian -| 'ht' // Haitian Creole -| 'hu' // Hungarian -| 'hy' // Armenian -| 'ia' // Interlingua -| 'id' // Indonesian -| 'ig' // Igbo -| 'ilo' // Ilocano -| 'is' // Icelandic -| 'it' // Italian -| 'it-CH' // Italian (Switzerland) -| 'it-IT' // Italian (Italy) -| 'ja' // Japanese -| 'jv' // Javanese -| 'ka' // Georgian -| 'kk' // Kazakh -| 'km' // Cambodian -| 'kn' // Kannada -| 'ko' // Korean -| 'kok' // Konkani -| 'kri' // Krio -| 'ku' // Kurdish -| 'ky' // Kyrgyz -| 'la' // Latin -| 'lb' // Luxembourgish -| 'lg' // Luganda -| 'ln' // Lingala -| 'lo' // Laothian -| 'lt' // Lithuanian -| 'lus' // Mizo -| 'lv' // Latvian -| 'mai' // Maithili -| 'mg' // Malagasy -| 'mi' // Maori -| 'mk' // Macedonian -| 'ml' // Malayalam -| 'mn' // Mongolian -| 'mni-Mtei' // Manipuri (Meitei Mayek) -| 'mo' // Moldavian -| 'mr' // Marathi -| 'ms' // Malay -| 'mt' // Maltese -| 'my' // Burmese -| 'nb' // Norwegian (Bokmal) -| 'ne' // Nepali -| 'nl' // Dutch -| 'nn' // Norwegian (Nynorsk) -| 'no' // Norwegian -| 'nso' // Sepedi -| 'ny' // Nyanja -| 'oc' // Occitan -| 'om' // Oromo -| 'or' // Odia (Oriya) -| 'pa' // Punjabi -| 'pl' // Polish -| 'ps' // Pashto -| 'pt' // Portuguese -| 'pt-BR' // Portuguese (Brazil) -| 'pt-PT' // Portuguese (Portugal) -| 'qu' // Quechua -| 'rm' // Romansh -| 'ro' // Romanian -| 'ru' // Russian -| 'rw' // Kinyarwanda -| 'sa' // Sanskrit -| 'sd' // Sindhi -| 'sh' // Serbo-Croatian -| 'si' // Sinhalese -| 'sk' // Slovak -| 'sl' // Slovenian -| 'sm' // Samoan -| 'sn' // Shona -| 'so' // Somali -| 'sq' // Albanian -| 'sr' // Serbian -| 'st' // Sesotho -| 'su' // Sundanese -| 'sv' // Swedish -| 'sw' // Swahili -| 'ta' // Tamil -| 'te' // Telugu -| 'tg' // Tajik -| 'th' // Thai -| 'ti' // Tigrinya -| 'tk' // Turkmen -| 'tn' // Tswana -| 'to' // Tonga -| 'tr' // Turkish -| 'ts' // Tsonga -| 'tt' // Tatar -| 'tw' // Twi -| 'ug' // Uyghur -| 'uk' // Ukrainian -| 'ur' // Urdu -| 'uz' // Uzbek -| 'vi' // Vietnamese -| 'wa' // Walloon -| 'wo' // Wolof -| 'xh' // Xhosa -| 'yi' // Yiddish -| 'yo' // Yoruba -| 'zh' // Chinese -| 'zh-CN' // Chinese (China) -| 'zh-HK' // Chinese (Hong Kong) -| 'zh-TW' // Chinese (Taiwan) -| 'zu' // Zulu - -// https://www.electronjs.org/docs/api/app#appgetlocale -// https://source.chromium.org/chromium/chromium/src/+/master:ui/base/l10n/l10n_util.cc -// See i18n.js -export const langNames = { - en: 'English', - cs: 'Čeština', - de: 'Deutsch', - es: 'Español', - fr: 'Français', - it: 'Italiano', - nl: 'Nederlands', - nb: 'Norsk (bokmål)', - nn: 'Norsk (nynorsk)', - pl: 'Polski', - pt: 'Português', - 'pt-BR': 'Português do Brasil', - sl: 'Slovenščina', - sk: 'Slovenčina', - fi: 'Suomi', - ru: 'Русский', - uk: 'Українська', - // sr: 'Cрпски', - tr: 'Türkçe', - vi: 'Tiếng Việt', - ja: '日本語', - zh: '中文', - 'zh-TW': '繁體中文', - 'zh-CN': '简体中文', - ko: '한국어', -} satisfies Partial>; - -type ExtraLanguages = 'no'; - -export type SupportedLanguage = (keyof typeof langNames) | ExtraLanguages; - export type TimecodeFormat = 'timecodeWithDecimalFraction' | 'frameCount' | 'seconds' | 'timecodeWithFramesFraction'; export type AvoidNegativeTs = 'make_zero' | 'auto' | 'make_non_negative' | 'disabled'; @@ -243,7 +21,6 @@ export type WaveformMode = 'big-waveform' | 'waveform'; export type FixCodecTagOption = 'always' | 'never' | 'auto'; - export interface Config { version: number, lastAppVersion: string, diff --git a/src/main/configStore.ts b/src/main/configStore.ts index a1833ccc..f3d118b4 100644 --- a/src/main/configStore.ts +++ b/src/main/configStore.ts @@ -6,7 +6,7 @@ import { pathExists } from 'fs-extra'; import assert from 'node:assert'; import { copyFile } from 'node:fs/promises'; -import { KeyBinding, Config } from '../../types.js'; +import { KeyBinding, Config } from '../common/types.js'; import logger from './logger.js'; import { isWindows } from './util.js'; import { fallbackLng } from './i18nCommon.js'; diff --git a/src/main/ffmpeg.ts b/src/main/ffmpeg.ts index 658f50ca..39d0f287 100644 --- a/src/main/ffmpeg.ts +++ b/src/main/ffmpeg.ts @@ -8,7 +8,7 @@ import { Readable } from 'node:stream'; import { app } from 'electron'; import { platform, arch, isWindows, isLinux } from './util.js'; -import { CaptureFormat, Waveform } from '../../types.js'; +import { CaptureFormat, Waveform } from '../common/types.js'; import isDev from './isDev.js'; import logger from './logger.js'; import { parseFfmpegProgressLine } from './progress.js'; diff --git a/src/main/i18nCommon.ts b/src/main/i18nCommon.ts index dbb866e8..ac907426 100644 --- a/src/main/i18nCommon.ts +++ b/src/main/i18nCommon.ts @@ -4,7 +4,8 @@ import { app } from 'electron'; import { join } from 'node:path'; import { InitOptions } from 'i18next'; -import { ElectronLanguageKey, SupportedLanguage } from '../../types'; + +import { mapLang, SupportedLanguage } from '../common/i18n'; let customLocalesPath: string | undefined; @@ -18,51 +19,6 @@ function getLangPath(subPath: string) { return join('locales', subPath); } -// Weblate hardcodes different lang codes than electron -// https://www.electronjs.org/docs/api/app#appgetlocale -// https://source.chromium.org/chromium/chromium/src/+/master:ui/base/l10n/l10n_util.cc -function mapLang(lng: ElectronLanguageKey) { - const map: Partial> = { - 'de-AT': 'de', - 'de-CH': 'de', - 'de-DE': 'de', - 'de-LI': 'de', - - 'es-419': 'es', - 'es-AR': 'es', - 'es-CL': 'es', - 'es-CO': 'es', - 'es-CR': 'es', - 'es-ES': 'es', - 'es-HN': 'es', - 'es-MX': 'es', - 'es-PE': 'es', - 'es-US': 'es', - 'es-UY': 'es', - 'es-VE': 'es', - - 'fr-CA': 'fr', - 'fr-CH': 'fr', - 'fr-FR': 'fr', - - nb: 'nb_NO', - no: 'nb_NO', - - zh: 'zh_Hans', - 'zh-CN': 'zh_Hans', - 'zh-TW': 'zh_Hant', - 'zh-HK': 'zh_Hant', - - 'pt-BR': 'pt_BR', - 'pt-PT': 'pt', - - 'it-CH': 'it', - 'it-IT': 'it', - }; - - return map[lng] ?? lng; -} - export const fallbackLng = 'en'; export const commonI18nOptions: InitOptions = { diff --git a/src/main/index.ts b/src/main/index.ts index e1903f62..06a62b4d 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -30,7 +30,7 @@ import { checkNewVersion } from './updateChecker.js'; import * as i18nCommon from './i18nCommon.js'; import './i18n.js'; -import { ApiActionRequest } from '../../types.js'; +import { ApiActionRequest } from '../common/types.js'; export * as ffmpeg from './ffmpeg.js'; diff --git a/src/renderer/src/App.tsx b/src/renderer/src/App.tsx index 3ed0882a..2da6abb4 100644 --- a/src/renderer/src/App.tsx +++ b/src/renderer/src/App.tsx @@ -86,8 +86,8 @@ import { rightBarWidth, leftBarWidth, ffmpegExtractWindow, zoomMax } from './uti import BigWaveform from './components/BigWaveform'; import { BatchFile, Chapter, CustomTagsByFile, EdlExportType, EdlFileType, EdlImportType, FfmpegCommandLog, FilesMeta, goToTimecodeDirectArgsSchema, openFilesActionArgsSchema, ParamsByStreamId, PlaybackMode, SegmentBase, SegmentColorIndex, SegmentTags, StateSegment, TunerType } from './types'; -import { CaptureFormat, KeyboardAction, ApiActionRequest } from '../../../types'; -import { FFprobeChapter, FFprobeFormat, FFprobeStream } from '../../../ffprobe'; +import { CaptureFormat, KeyboardAction, ApiActionRequest } from '../../common/types.js'; +import { FFprobeChapter, FFprobeFormat, FFprobeStream } from '../../common/ffprobe.js'; import useLoading from './hooks/useLoading'; import useVideo from './hooks/useVideo'; import useTimecode from './hooks/useTimecode'; diff --git a/src/renderer/src/BottomBar.tsx b/src/renderer/src/BottomBar.tsx index da33c4fa..6fca1fcb 100644 --- a/src/renderer/src/BottomBar.tsx +++ b/src/renderer/src/BottomBar.tsx @@ -25,7 +25,7 @@ import { isExactDurationMatch } from './util/duration'; import useUserSettings from './hooks/useUserSettings'; import { askForPlaybackRate, checkAppPath } from './dialogs'; import { FormatTimecode, ParseTimecode, PlaybackMode, SegmentColorIndex, SegmentToExport, StateSegment } from './types'; -import { WaveformMode } from '../../../types'; +import { WaveformMode } from '../../common/types'; import { Frame } from './ffmpeg'; const { clipboard } = window.require('electron'); diff --git a/src/renderer/src/MediaSourcePlayer.tsx b/src/renderer/src/MediaSourcePlayer.tsx index 332d32e6..05c32ea3 100644 --- a/src/renderer/src/MediaSourcePlayer.tsx +++ b/src/renderer/src/MediaSourcePlayer.tsx @@ -5,7 +5,7 @@ import { FaVideo } from 'react-icons/fa'; import isDev from './isDev'; import { ChromiumHTMLVideoElement } from './types'; -import { FFprobeStream } from '../../../ffprobe'; +import { FFprobeStream } from '../../common/ffprobe'; import { getFrameDuration } from './util'; const { compatPlayer: { createMediaSourceStream } } = window.require('@electron/remote').require('./index.js'); diff --git a/src/renderer/src/NoFileLoaded.tsx b/src/renderer/src/NoFileLoaded.tsx index d988c80d..a6e4493f 100644 --- a/src/renderer/src/NoFileLoaded.tsx +++ b/src/renderer/src/NoFileLoaded.tsx @@ -7,7 +7,7 @@ import SetCutpointButton from './components/SetCutpointButton'; import SimpleModeButton from './components/SimpleModeButton'; import useUserSettings from './hooks/useUserSettings'; import { StateSegment } from './types'; -import { KeyBinding } from '../../../types'; +import { KeyBinding } from '../../common/types'; import { splitKeyboardKeys } from './util'; import { getModifier } from './hooks/useTimelineScroll'; import Kbd from './components/Kbd'; diff --git a/src/renderer/src/StreamsSelector.tsx b/src/renderer/src/StreamsSelector.tsx index 7e0799da..fd018764 100644 --- a/src/renderer/src/StreamsSelector.tsx +++ b/src/renderer/src/StreamsSelector.tsx @@ -14,7 +14,7 @@ import { FileStream, getStreamFps } from './ffmpeg'; import { deleteDispositionValue } from './util'; import { getActiveDisposition, attachedPicDisposition, isGpsStream } from './util/streams'; import TagEditor from './components/TagEditor'; -import { FFprobeChapter, FFprobeFormat, FFprobeStream } from '../../../ffprobe'; +import { FFprobeChapter, FFprobeFormat, FFprobeStream } from '../../common/ffprobe'; import { CustomTagsByFile, FilesMeta, FormatTimecode, ParamsByStreamId, StreamParams } from './types'; import Button, { DialogButton } from './components/Button'; import Checkbox from './components/Checkbox'; @@ -149,7 +149,7 @@ const EditStreamDialog = memo(({ editingStream: { streamId: editingStreamId, pat {t('Edit track {{trackNum}} metadata', { trackNum: editingStream && (editingStream.index + 1) })} -

Parameters

+

{t('Parameters')}

{editingStream != null && updateStreamParams(editingFile, editingStreamId, setter)} />}

Tags

diff --git a/src/renderer/src/components/Action.tsx b/src/renderer/src/components/Action.tsx index 77f38c9a..e9dd6e6f 100644 --- a/src/renderer/src/components/Action.tsx +++ b/src/renderer/src/components/Action.tsx @@ -1,5 +1,5 @@ import { FaBolt } from 'react-icons/fa'; -import { KeyboardAction } from '../../../../types'; +import { KeyboardAction } from '../../../common/types'; export default function Action({ name }: { name: KeyboardAction }) { diff --git a/src/renderer/src/components/ConcatSheet.tsx b/src/renderer/src/components/ConcatSheet.tsx index ab738e47..04c85e49 100644 --- a/src/renderer/src/components/ConcatSheet.tsx +++ b/src/renderer/src/components/ConcatSheet.tsx @@ -11,7 +11,7 @@ import OutputFormatSelect from './OutputFormatSelect'; import useUserSettings from '../hooks/useUserSettings'; import { isMov } from '../util/streams'; import { getOutDir } from '../util'; -import { FFprobeChapter, FFprobeFormat, FFprobeStream } from '../../../../ffprobe'; +import { FFprobeChapter, FFprobeFormat, FFprobeStream } from '../../../common/ffprobe'; import Button, { DialogButton } from './Button'; import { defaultMergedFileTemplate, GeneratedOutFileNames, GenerateMergedOutFileNames } from '../util/outputNameTemplate'; import { primaryColor, saveColor, warningColor } from '../colors'; diff --git a/src/renderer/src/components/ExportConfirm.tsx b/src/renderer/src/components/ExportConfirm.tsx index d8f59a4a..beb99cff 100644 --- a/src/renderer/src/components/ExportConfirm.tsx +++ b/src/renderer/src/components/ExportConfirm.tsx @@ -20,8 +20,8 @@ import useUserSettings from '../hooks/useUserSettings'; import styles from './ExportConfirm.module.css'; import { SegmentToExport } from '../types'; import { defaultCutFileTemplate, defaultCutMergedFileTemplate, GenerateOutFileNames } from '../util/outputNameTemplate'; -import { FFprobeStream } from '../../../../ffprobe'; -import { AvoidNegativeTs, FixCodecTagOption, PreserveMetadata } from '../../../../types'; +import { FFprobeStream } from '../../../common/ffprobe'; +import { AvoidNegativeTs, FixCodecTagOption, PreserveMetadata } from '../../../common/types'; import TextInput from './TextInput'; import { UseSegments } from '../hooks/useSegments'; import ExportSheet from './ExportSheet'; @@ -619,7 +619,7 @@ function ExportConfirm({ {lossyMode != null && ( - Lossy mode + {t('Lossy mode')} diff --git a/src/renderer/src/components/KeyboardShortcuts.tsx b/src/renderer/src/components/KeyboardShortcuts.tsx index 27624456..29d76af1 100644 --- a/src/renderer/src/components/KeyboardShortcuts.tsx +++ b/src/renderer/src/components/KeyboardShortcuts.tsx @@ -10,7 +10,7 @@ import useUserSettings from '../hooks/useUserSettings'; import SetCutpointButton from './SetCutpointButton'; import SegmentCutpointButton from './SegmentCutpointButton'; import { getModifier } from '../hooks/useTimelineScroll'; -import { KeyBinding, KeyboardAction, ModifierKey } from '../../../../types'; +import { KeyBinding, KeyboardAction, ModifierKey } from '../../../common/types'; import { StateSegment } from '../types'; import { allModifiers, altModifiers, controlModifiers, metaModifiers, shiftModifiers, splitKeyboardKeys } from '../util'; import * as Dialog from './Dialog'; diff --git a/src/renderer/src/components/PlaybackStreamSelector.tsx b/src/renderer/src/components/PlaybackStreamSelector.tsx index 8dcd0c14..4111c8fe 100644 --- a/src/renderer/src/components/PlaybackStreamSelector.tsx +++ b/src/renderer/src/components/PlaybackStreamSelector.tsx @@ -6,7 +6,7 @@ import { motion } from 'framer-motion'; import Select from './Select'; import Switch from './Switch'; import styles from './PlaybackStreamSelector.module.css'; -import { FFprobeStream } from '../../../../ffprobe'; +import { FFprobeStream } from '../../../common/ffprobe'; function PlaybackStreamSelector({ diff --git a/src/renderer/src/components/Settings.tsx b/src/renderer/src/components/Settings.tsx index 857c4d7e..ca5ce187 100644 --- a/src/renderer/src/components/Settings.tsx +++ b/src/renderer/src/components/Settings.tsx @@ -10,7 +10,8 @@ import Switch from './Switch'; import useUserSettings from '../hooks/useUserSettings'; import { askForFfPath } from '../dialogs'; import { isMasBuild, isStoreBuild } from '../util'; -import { Config, SupportedLanguage, ModifierKey, TimecodeFormat, langNames } from '../../../../types'; +import { SupportedLanguage, langNames } from '../../../common/i18n'; +import { Config, ModifierKey, TimecodeFormat } from '../../../common/types.js'; import styles from './Settings.module.css'; import SelectRaw, { SelectProps } from './Select'; import ButtonRaw, { ButtonProps } from './Button'; diff --git a/src/renderer/src/ffmpeg.ts b/src/renderer/src/ffmpeg.ts index 2bcd906c..23f639b9 100644 --- a/src/renderer/src/ffmpeg.ts +++ b/src/renderer/src/ffmpeg.ts @@ -8,7 +8,7 @@ import invariant from 'tiny-invariant'; import { pcmAudioCodecs, isMov } from './util/streams'; import { isExecaError } from './util'; import { isDurationValid } from './segments'; -import { FFprobeChapter, FFprobeFormat, FFprobeProbeResult, FFprobeStream } from '../../../ffprobe'; +import { FFprobeChapter, FFprobeFormat, FFprobeProbeResult, FFprobeStream } from '../../common/ffprobe'; import { parseSrt, parseSrtToSegments } from './edlFormats'; import { UnsupportedFileError, UserFacingError } from '../errors'; diff --git a/src/renderer/src/ffprobe.ts b/src/renderer/src/ffprobe.ts index 4a16f6d1..76ee3711 100644 --- a/src/renderer/src/ffprobe.ts +++ b/src/renderer/src/ffprobe.ts @@ -1,6 +1,6 @@ // This code is for future use (e.g. creating black video to fill in using same codec parameters) -import { FFprobeStream } from '../../../ffprobe'; +import { FFprobeStream } from '../../common/ffprobe'; export function parseLevel(videoStream: FFprobeStream) { const { level: levelNumeric, codec_name: videoCodec } = videoStream; diff --git a/src/renderer/src/hooks/useFfmpegOperations.ts b/src/renderer/src/hooks/useFfmpegOperations.ts index 0379067a..331f2eb8 100644 --- a/src/renderer/src/hooks/useFfmpegOperations.ts +++ b/src/renderer/src/hooks/useFfmpegOperations.ts @@ -10,8 +10,8 @@ import { isCuttingStart, isCuttingEnd, runFfmpegWithProgress, getFfCommandLine, import { getMapStreamsArgs, getStreamIdsToCopy } from '../util/streams'; import { needsSmartCut, getCodecParams } from '../smartcut'; import { getGuaranteedSegments, isDurationValid } from '../segments'; -import { FFprobeStream } from '../../../../ffprobe'; -import { AvoidNegativeTs, FixCodecTagOption, Html5ifyMode, PreserveMetadata } from '../../../../types'; +import { FFprobeStream } from '../../../common/ffprobe'; +import { AvoidNegativeTs, FixCodecTagOption, Html5ifyMode, PreserveMetadata } from '../../../common/types'; import { AllFilesMeta, Chapter, CopyfileStreams, CustomTagsByFile, LiteFFprobeStream, ParamsByStreamId, SegmentToExport } from '../types'; import { LossyMode } from '../../../main'; import { UserFacingError } from '../../errors'; diff --git a/src/renderer/src/hooks/useFrameCapture.ts b/src/renderer/src/hooks/useFrameCapture.ts index 9329d7d2..af22a643 100644 --- a/src/renderer/src/hooks/useFrameCapture.ts +++ b/src/renderer/src/hooks/useFrameCapture.ts @@ -7,7 +7,7 @@ import { getNumDigits } from '../segments'; import * as ffmpeg from '../ffmpeg'; import { FormatTimecode } from '../types'; -import { CaptureFormat } from '../../../../types'; +import { CaptureFormat } from '../../../common/types'; const mime = window.require('mime-types'); const { rename, readdir, writeFile } = window.require('fs/promises'); diff --git a/src/renderer/src/hooks/useHtml5ify.tsx b/src/renderer/src/hooks/useHtml5ify.tsx index b077d925..85684793 100644 --- a/src/renderer/src/hooks/useHtml5ify.tsx +++ b/src/renderer/src/hooks/useHtml5ify.tsx @@ -2,7 +2,7 @@ import { useState, useCallback, ChangeEventHandler } from 'react'; import i18n from 'i18next'; import { useTranslation } from 'react-i18next'; -import { Html5ifyMode } from '../../../../types'; +import { Html5ifyMode } from '../../../common/types'; import { DirectoryAccessDeclinedError } from '../../errors'; import getSwal from '../swal'; import Checkbox from '../components/Checkbox'; diff --git a/src/renderer/src/hooks/useKeyboard.ts b/src/renderer/src/hooks/useKeyboard.ts index b2309551..03aab750 100644 --- a/src/renderer/src/hooks/useKeyboard.ts +++ b/src/renderer/src/hooks/useKeyboard.ts @@ -1,6 +1,6 @@ import { useCallback, useEffect, useRef, useState } from 'react'; -import { KeyBinding, KeyboardAction } from '../../../../types'; +import { KeyBinding, KeyboardAction } from '../../../common/types'; import { allModifiers, altModifiers, controlModifiers, metaModifiers, shiftModifiers } from '../util'; import { KeyboardLayoutMap } from '../types'; import isDev from '../isDev'; diff --git a/src/renderer/src/hooks/useKeyframes.ts b/src/renderer/src/hooks/useKeyframes.ts index b0196535..f4a96956 100644 --- a/src/renderer/src/hooks/useKeyframes.ts +++ b/src/renderer/src/hooks/useKeyframes.ts @@ -4,7 +4,7 @@ import useDebounceOld from 'react-use/lib/useDebounce'; // Want to phase out thi import { useTranslation } from 'react-i18next'; import { readFramesAroundTime, findNearestKeyFrameTime as ffmpegFindNearestKeyFrameTime, Frame, readFrames } from '../ffmpeg'; -import { FFprobeStream } from '../../../../ffprobe'; +import { FFprobeStream } from '../../../common/ffprobe'; import { getFrameCountRaw } from '../edlFormats'; import { HandleError } from '../contexts'; diff --git a/src/renderer/src/hooks/useSegments.tsx b/src/renderer/src/hooks/useSegments.tsx index c871c569..593db5ad 100644 --- a/src/renderer/src/hooks/useSegments.tsx +++ b/src/renderer/src/hooks/useSegments.tsx @@ -17,8 +17,8 @@ import { parameters as allFfmpegParameters, FfmpegDialog, getHint, getLabel } fr import { maxSegmentsAllowed } from '../util/constants'; import { DefiniteSegmentBase, ParseTimecode, SegmentBase, segmentTagsSchema, SegmentToExport, StateSegment, UpdateSegAtIndex } from '../types'; import safeishEval from '../worker/eval'; -import { ScopeSegment } from '../../../../types'; -import { FFprobeFormat, FFprobeStream } from '../../../../ffprobe'; +import { ScopeSegment } from '../../../common/types'; +import { FFprobeFormat, FFprobeStream } from '../../../common/ffprobe'; import { HandleError } from '../contexts'; import { ShowGenericDialog, useGenericDialogContext } from '../components/GenericDialog'; import ExpressionDialog from '../components/ExpressionDialog'; @@ -257,7 +257,7 @@ function useSegments({ filePath, workingRef, setWorking, setProgress, videoStrea {description} - {docUrl &&

} + {docUrl &&

}
{Object.entries(parametersIn).map(([key, parameter], i) => { diff --git a/src/renderer/src/hooks/useStreamsMeta.tsx b/src/renderer/src/hooks/useStreamsMeta.tsx index ed9d8b61..0ceb2e76 100644 --- a/src/renderer/src/hooks/useStreamsMeta.tsx +++ b/src/renderer/src/hooks/useStreamsMeta.tsx @@ -5,7 +5,7 @@ import { Trans, useTranslation } from 'react-i18next'; import { isStreamThumbnail, shouldCopyStreamByDefault } from '../util/streams'; import StreamsSelector from '../StreamsSelector'; -import { FFprobeStream } from '../../../../ffprobe'; +import { FFprobeStream } from '../../../common/ffprobe'; import { FilesMeta } from '../types'; import safeishEval from '../worker/eval'; import i18n from '../i18n'; diff --git a/src/renderer/src/hooks/useSubtitles.ts b/src/renderer/src/hooks/useSubtitles.ts index 14096b53..602e388c 100644 --- a/src/renderer/src/hooks/useSubtitles.ts +++ b/src/renderer/src/hooks/useSubtitles.ts @@ -1,6 +1,6 @@ import { useCallback, useEffect, useRef, useState } from 'react'; import { extractSubtitleTrackVtt } from '../ffmpeg'; -import { FFprobeStream } from '../../../../ffprobe'; +import { FFprobeStream } from '../../../common/ffprobe'; export default () => { diff --git a/src/renderer/src/hooks/useTimecode.tsx b/src/renderer/src/hooks/useTimecode.tsx index 473a0993..ce9e7a0f 100644 --- a/src/renderer/src/hooks/useTimecode.tsx +++ b/src/renderer/src/hooks/useTimecode.tsx @@ -4,7 +4,7 @@ import { useTranslation } from 'react-i18next'; import { FormatTimecode, ParseTimecode } from '../types'; import { getFrameCountRaw } from '../edlFormats'; import { getFrameDuration } from '../util'; -import { TimecodeFormat } from '../../../../types'; +import { TimecodeFormat } from '../../../common/types'; import { formatDuration, parseDuration } from '../util/duration'; import { ShowGenericDialog, useGenericDialogContext } from '../components/GenericDialog'; import * as AlertDialog from '../components/AlertDialog'; diff --git a/src/renderer/src/hooks/useTimelineScroll.ts b/src/renderer/src/hooks/useTimelineScroll.ts index e978c8be..398acf69 100644 --- a/src/renderer/src/hooks/useTimelineScroll.ts +++ b/src/renderer/src/hooks/useTimelineScroll.ts @@ -2,7 +2,7 @@ import { WheelEventHandler, useCallback } from 'react'; import { t } from 'i18next'; import normalizeWheel from './normalizeWheel'; -import { ModifierKey } from '../../../../types'; +import { ModifierKey } from '../../../common/types'; import { getMetaKeyName } from '../util'; export const keyMap = { diff --git a/src/renderer/src/hooks/useUserSettingsRoot.ts b/src/renderer/src/hooks/useUserSettingsRoot.ts index 7a3ba949..84dbf223 100644 --- a/src/renderer/src/hooks/useUserSettingsRoot.ts +++ b/src/renderer/src/hooks/useUserSettingsRoot.ts @@ -2,7 +2,7 @@ import { useEffect, useState, useRef, useCallback, useMemo } from 'react'; import i18n from 'i18next'; import { Transition } from 'framer-motion'; -import { Config } from '../../../../types'; +import { Config } from '../../../common/types.js'; import { errorToast } from '../swal'; import isDev from '../isDev'; diff --git a/src/renderer/src/hooks/useWaveform.ts b/src/renderer/src/hooks/useWaveform.ts index 26bce0e1..9dc49cdf 100644 --- a/src/renderer/src/hooks/useWaveform.ts +++ b/src/renderer/src/hooks/useWaveform.ts @@ -4,7 +4,7 @@ import invariant from 'tiny-invariant'; import { renderWaveformPng, safeCreateBlob } from '../ffmpeg'; import { OverviewWaveform, WaveformSlice } from '../types'; -import { FFprobeStream } from '../../../../ffprobe'; +import { FFprobeStream } from '../../../common/ffprobe'; const maxWaveforms = 100; diff --git a/src/renderer/src/smartcut.ts b/src/renderer/src/smartcut.ts index 63e78f38..52a5b45e 100644 --- a/src/renderer/src/smartcut.ts +++ b/src/renderer/src/smartcut.ts @@ -3,7 +3,7 @@ import i18n from 'i18next'; import { getRealVideoStreams, getVideoTimebase } from './util/streams'; import { readKeyframesAroundTime, findNextKeyframe, findKeyframeAtExactTime } from './ffmpeg'; -import { FFprobeStream } from '../../../ffprobe'; +import { FFprobeStream } from '../../common/ffprobe'; import { UserFacingError } from '../errors'; const { stat } = window.require('fs-extra'); diff --git a/src/renderer/src/types.ts b/src/renderer/src/types.ts index 628798da..56581ec0 100644 --- a/src/renderer/src/types.ts +++ b/src/renderer/src/types.ts @@ -1,6 +1,6 @@ import type { MenuItem, MenuItemConstructorOptions } from 'electron'; import { z } from 'zod'; -import { FFprobeChapter, FFprobeFormat, FFprobeStream } from '../../../ffprobe'; +import { FFprobeChapter, FFprobeFormat, FFprobeStream } from '../../common/ffprobe'; import type { FileStream } from './ffmpeg'; diff --git a/src/renderer/src/util.ts b/src/renderer/src/util.ts index e060a1fb..1b86a30a 100644 --- a/src/renderer/src/util.ts +++ b/src/renderer/src/util.ts @@ -9,7 +9,7 @@ import invariant from 'tiny-invariant'; import { ffmpegExtractWindow } from './util/constants'; import { appName } from '../../main/common'; -import { Html5ifyMode } from '../../../types'; +import { Html5ifyMode } from '../../common/types'; import { UserFacingError } from '../errors'; const { dirname, parse: parsePath, join, extname, isAbsolute, resolve, basename } = window.require('path'); diff --git a/src/renderer/src/util/streams.test.ts b/src/renderer/src/util/streams.test.ts index 6cccdf3c..f909426a 100644 --- a/src/renderer/src/util/streams.test.ts +++ b/src/renderer/src/util/streams.test.ts @@ -1,7 +1,7 @@ import { test, expect } from 'vitest'; import { getMapStreamsArgs, getStreamIdsToCopy } from './streams'; -import { FFprobeStreamDisposition } from '../../../../ffprobe'; +import { FFprobeStreamDisposition } from '../../../common/ffprobe'; import { LiteFFprobeStream } from '../types'; diff --git a/src/renderer/src/util/streams.ts b/src/renderer/src/util/streams.ts index 541da63b..241a962b 100644 --- a/src/renderer/src/util/streams.ts +++ b/src/renderer/src/util/streams.ts @@ -1,8 +1,8 @@ import invariant from 'tiny-invariant'; -import { FFprobeStream, FFprobeStreamDisposition } from '../../../../ffprobe'; +import { FFprobeStream, FFprobeStreamDisposition } from '../../../common/ffprobe'; import { AllFilesMeta, ChromiumHTMLAudioElement, ChromiumHTMLVideoElement, CopyfileStreams, LiteFFprobeStream } from '../types'; import type { FileStream } from '../ffmpeg'; -import { FixCodecTagOption } from '../../../../types'; +import { FixCodecTagOption } from '../../../common/types'; // taken from `ffmpeg -codecs` diff --git a/tsconfig.common.json b/tsconfig.common.json new file mode 100644 index 00000000..a5f84c35 --- /dev/null +++ b/tsconfig.common.json @@ -0,0 +1,13 @@ +{ + "extends": ["@tsconfig/strictest", "@tsconfig/node22/tsconfig.json"], + "compilerOptions": { + "composite": true, + "noEmit": false, + + "outDir": "common-ts-dist", + "tsBuildInfoFile": "common-ts-dist/tsconfig.tsbuildinfo", + }, + "include": [ + "src/common/**/*", + ], +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 0cdc39fc..d45c9519 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,6 +3,7 @@ { "path": "./tsconfig.web.json" }, { "path": "./tsconfig.main.json" }, { "path": "./tsconfig.node.json" }, + { "path": "./tsconfig.common.json" }, ], "files": [], } \ No newline at end of file diff --git a/tsconfig.main.json b/tsconfig.main.json index ec1e7651..9a68b2a7 100644 --- a/tsconfig.main.json +++ b/tsconfig.main.json @@ -4,16 +4,18 @@ "composite": true, "emitDeclarationOnly": true, - "outDir": "ts-dist", - "tsBuildInfoFile": "ts-dist/tsconfig.tsbuildinfo", + "outDir": "main-ts-dist", + "tsBuildInfoFile": "main-ts-dist/tsconfig.tsbuildinfo", "lib": ["ES2024"], "target": "ESNext", "module": "ESNext", "moduleResolution": "Bundler", "types": ["vite/client"], }, + "references": [ + { "path": "./tsconfig.common.json" }, + ], "include": [ "src/main/**/*", - "types.ts", ], } \ No newline at end of file diff --git a/tsconfig.node.json b/tsconfig.node.json index 79dc68a4..1113d8b4 100644 --- a/tsconfig.node.json +++ b/tsconfig.node.json @@ -4,6 +4,8 @@ "noEmit": true, }, "include": [ + "electron.vite.config.ts", + "i18next.config.ts", "script/**/*", ], } \ No newline at end of file diff --git a/tsconfig.web.json b/tsconfig.web.json index 29cc3cdd..e9186d76 100644 --- a/tsconfig.web.json +++ b/tsconfig.web.json @@ -9,6 +9,7 @@ }, "references": [ { "path": "./tsconfig.main.json" }, + { "path": "./tsconfig.common.json" }, ], "include": [ "src/renderer/**/*", diff --git a/yarn.lock b/yarn.lock index f086d83a..4cde24db 100644 --- a/yarn.lock +++ b/yarn.lock @@ -217,7 +217,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.24.8, @babel/runtime@npm:^7.3.1": +"@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.3.1": version: 7.26.10 resolution: "@babel/runtime@npm:7.26.10" dependencies: @@ -226,6 +226,13 @@ __metadata: languageName: node linkType: hard +"@babel/runtime@npm:^7.27.0, @babel/runtime@npm:^7.27.6": + version: 7.28.4 + resolution: "@babel/runtime@npm:7.28.4" + checksum: 10/6c9a70452322ea80b3c9b2a412bcf60771819213a67576c8cec41e88a95bb7bf01fc983754cda35dc19603eef52df22203ccbf7777b9d6316932f9fb77c25163 + languageName: node + linkType: hard + "@babel/template@npm:^7.26.9": version: 7.26.9 resolution: "@babel/template@npm:7.26.9" @@ -1309,6 +1316,253 @@ __metadata: languageName: node linkType: hard +"@inquirer/ansi@npm:^1.0.1": + version: 1.0.1 + resolution: "@inquirer/ansi@npm:1.0.1" + checksum: 10/0dda65720736f3e730715f3778e0e90f039ebd1382c277495a4d1cdbd2b2863095aa7291cd8ea7d3c0618bdee04a375db6e10a7bae5fb904df0b632a1c7774f9 + languageName: node + linkType: hard + +"@inquirer/checkbox@npm:^4.3.0": + version: 4.3.0 + resolution: "@inquirer/checkbox@npm:4.3.0" + dependencies: + "@inquirer/ansi": "npm:^1.0.1" + "@inquirer/core": "npm:^10.3.0" + "@inquirer/figures": "npm:^1.0.14" + "@inquirer/type": "npm:^3.0.9" + yoctocolors-cjs: "npm:^2.1.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10/aa7ddf0816bc1718afdc38d7ed1e16207bbf944164a5a3ac0d87072a5a1b51cf3417617c72128a78d66b2e40a45f4a5658bdfc4bb546e92a208e30c8006674e6 + languageName: node + linkType: hard + +"@inquirer/confirm@npm:^5.1.19": + version: 5.1.19 + resolution: "@inquirer/confirm@npm:5.1.19" + dependencies: + "@inquirer/core": "npm:^10.3.0" + "@inquirer/type": "npm:^3.0.9" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10/d65e0addf80c146d71a74057d77048bd78a4a80d74a9e0d774b759ff1adf38a33cde6c06a6d6ef802bb61ef9158770315dec3931f89b3624c0e63c595c0473c1 + languageName: node + linkType: hard + +"@inquirer/core@npm:^10.3.0": + version: 10.3.0 + resolution: "@inquirer/core@npm:10.3.0" + dependencies: + "@inquirer/ansi": "npm:^1.0.1" + "@inquirer/figures": "npm:^1.0.14" + "@inquirer/type": "npm:^3.0.9" + cli-width: "npm:^4.1.0" + mute-stream: "npm:^2.0.0" + signal-exit: "npm:^4.1.0" + wrap-ansi: "npm:^6.2.0" + yoctocolors-cjs: "npm:^2.1.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10/41392e38dc3253b3dbebda9cca344ca5cfd72c05e1c5b8460cb00e0ce7fa665a1970a2c4af89dcb951d75fedfdf775cdd7ac3be0748dbe3dec47db5d899d6963 + languageName: node + linkType: hard + +"@inquirer/editor@npm:^4.2.21": + version: 4.2.21 + resolution: "@inquirer/editor@npm:4.2.21" + dependencies: + "@inquirer/core": "npm:^10.3.0" + "@inquirer/external-editor": "npm:^1.0.2" + "@inquirer/type": "npm:^3.0.9" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10/cf2d4237dc86abb2143ba6e99a4a60368ee992ba56b0072457e4dd472e7ac99ebffcbd0895bf36d5f694f3e327ff0dbb70265952b03ec8a0dbf4abd1db306991 + languageName: node + linkType: hard + +"@inquirer/expand@npm:^4.0.21": + version: 4.0.21 + resolution: "@inquirer/expand@npm:4.0.21" + dependencies: + "@inquirer/core": "npm:^10.3.0" + "@inquirer/type": "npm:^3.0.9" + yoctocolors-cjs: "npm:^2.1.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10/eb1900c443895377c03652c3e2b6ca29c572fe6ee2682e264572957b9b4a596d3d55c9ea271934846fb05d5cc5195cca0dffde1386e41358ac5c308698320e93 + languageName: node + linkType: hard + +"@inquirer/external-editor@npm:^1.0.2": + version: 1.0.2 + resolution: "@inquirer/external-editor@npm:1.0.2" + dependencies: + chardet: "npm:^2.1.0" + iconv-lite: "npm:^0.7.0" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10/d0c5c73249b8153f4cf872c4fba01c57a7653142a4cad496f17ed03ef3769330a4b3c519b68d70af69d4bb33003d2599b66b2242be85411c0b027ff383619666 + languageName: node + linkType: hard + +"@inquirer/figures@npm:^1.0.14": + version: 1.0.14 + resolution: "@inquirer/figures@npm:1.0.14" + checksum: 10/39df361eb607cea5a020d457e25f9c6aee3a1de8975c6295a4b3bfe86ba7e7f7bfbefa6a52b145b1790f2690e5c8f10eb822e5bc764aff7ba00a6cd24eec5a25 + languageName: node + linkType: hard + +"@inquirer/input@npm:^4.2.5": + version: 4.2.5 + resolution: "@inquirer/input@npm:4.2.5" + dependencies: + "@inquirer/core": "npm:^10.3.0" + "@inquirer/type": "npm:^3.0.9" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10/150dee6d6094663439a9941e5df5f1dadb819cd5ac68a7b5be0e0aceb4b74db0c8fa9a5fa0d21879928df6a53c84c9214b699f3fddbb6c617dd9c253a9d95155 + languageName: node + linkType: hard + +"@inquirer/number@npm:^3.0.21": + version: 3.0.21 + resolution: "@inquirer/number@npm:3.0.21" + dependencies: + "@inquirer/core": "npm:^10.3.0" + "@inquirer/type": "npm:^3.0.9" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10/7b254cb3947c78a83593d82347bf93929b0af714cffa20f9f4503ec338004b3c0d6813945e3e3d7062b5d50006412b181ed833ac88c7da4df538df8bb15775d0 + languageName: node + linkType: hard + +"@inquirer/password@npm:^4.0.21": + version: 4.0.21 + resolution: "@inquirer/password@npm:4.0.21" + dependencies: + "@inquirer/ansi": "npm:^1.0.1" + "@inquirer/core": "npm:^10.3.0" + "@inquirer/type": "npm:^3.0.9" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10/07fb1527ea2d44a81b79d9263f59713e66977e21fbf44efedb6bf08d27d617900ef481c49c91b0a749caf1d282f2b5e19fe6b7474acc98db3edd174eb5d45416 + languageName: node + linkType: hard + +"@inquirer/prompts@npm:^7.9.0": + version: 7.9.0 + resolution: "@inquirer/prompts@npm:7.9.0" + dependencies: + "@inquirer/checkbox": "npm:^4.3.0" + "@inquirer/confirm": "npm:^5.1.19" + "@inquirer/editor": "npm:^4.2.21" + "@inquirer/expand": "npm:^4.0.21" + "@inquirer/input": "npm:^4.2.5" + "@inquirer/number": "npm:^3.0.21" + "@inquirer/password": "npm:^4.0.21" + "@inquirer/rawlist": "npm:^4.1.9" + "@inquirer/search": "npm:^3.2.0" + "@inquirer/select": "npm:^4.4.0" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10/ca58889261018be39a58e93c03c542d47d25dd7f5bb93e98bde7e3bf63eb70f8d5243d32a3fd53797bb474471682490513d99ec5179323862e5a15cdeb35f4b5 + languageName: node + linkType: hard + +"@inquirer/rawlist@npm:^4.1.9": + version: 4.1.9 + resolution: "@inquirer/rawlist@npm:4.1.9" + dependencies: + "@inquirer/core": "npm:^10.3.0" + "@inquirer/type": "npm:^3.0.9" + yoctocolors-cjs: "npm:^2.1.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10/ec23e087bfa9497b36d51b53e8da18c837e4a0c5c091bce7d1a6b52d9664035d7e22c3753993dd3c7c9ebfd5e9b71f1738873f2c25422668733ddb28d74bf26b + languageName: node + linkType: hard + +"@inquirer/search@npm:^3.2.0": + version: 3.2.0 + resolution: "@inquirer/search@npm:3.2.0" + dependencies: + "@inquirer/core": "npm:^10.3.0" + "@inquirer/figures": "npm:^1.0.14" + "@inquirer/type": "npm:^3.0.9" + yoctocolors-cjs: "npm:^2.1.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10/b01a53d6f72090f45cda39b75dd2e613e2d7fa0f454c0781f846e543b833eed4da831fec8d9e5325ebd4383684a69a74c5a38520b7ee0734b1090f71cf5dd372 + languageName: node + linkType: hard + +"@inquirer/select@npm:^4.4.0": + version: 4.4.0 + resolution: "@inquirer/select@npm:4.4.0" + dependencies: + "@inquirer/ansi": "npm:^1.0.1" + "@inquirer/core": "npm:^10.3.0" + "@inquirer/figures": "npm:^1.0.14" + "@inquirer/type": "npm:^3.0.9" + yoctocolors-cjs: "npm:^2.1.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10/97f1f167d640c668ea5f137fca76fd9096215546f0890732ab8ed0c58ac3d9f01db5d1877e877e74ef6877a139ab8970ee683c6c3f2c08f2e11522f5e0bfd61e + languageName: node + linkType: hard + +"@inquirer/type@npm:^3.0.9": + version: 3.0.9 + resolution: "@inquirer/type@npm:3.0.9" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10/960ba4737405f70bac17e7cdc4696c60064b06c8dd13a4b3d0783763ba1714bdadbd598b88d537ab9415b7d5d61e011ac042cfbd1438b2a35298e2868724b853 + languageName: node + linkType: hard + "@isaacs/balanced-match@npm:^4.0.1": version: 4.0.1 resolution: "@isaacs/balanced-match@npm:4.0.1" @@ -2437,6 +2691,138 @@ __metadata: languageName: node linkType: hard +"@swc/core-darwin-arm64@npm:1.13.19": + version: 1.13.19 + resolution: "@swc/core-darwin-arm64@npm:1.13.19" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@swc/core-darwin-x64@npm:1.13.19": + version: 1.13.19 + resolution: "@swc/core-darwin-x64@npm:1.13.19" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@swc/core-linux-arm-gnueabihf@npm:1.13.19": + version: 1.13.19 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.13.19" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@swc/core-linux-arm64-gnu@npm:1.13.19": + version: 1.13.19 + resolution: "@swc/core-linux-arm64-gnu@npm:1.13.19" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@swc/core-linux-arm64-musl@npm:1.13.19": + version: 1.13.19 + resolution: "@swc/core-linux-arm64-musl@npm:1.13.19" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@swc/core-linux-x64-gnu@npm:1.13.19": + version: 1.13.19 + resolution: "@swc/core-linux-x64-gnu@npm:1.13.19" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@swc/core-linux-x64-musl@npm:1.13.19": + version: 1.13.19 + resolution: "@swc/core-linux-x64-musl@npm:1.13.19" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@swc/core-win32-arm64-msvc@npm:1.13.19": + version: 1.13.19 + resolution: "@swc/core-win32-arm64-msvc@npm:1.13.19" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@swc/core-win32-ia32-msvc@npm:1.13.19": + version: 1.13.19 + resolution: "@swc/core-win32-ia32-msvc@npm:1.13.19" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@swc/core-win32-x64-msvc@npm:1.13.19": + version: 1.13.19 + resolution: "@swc/core-win32-x64-msvc@npm:1.13.19" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@swc/core@npm:1.13.19": + version: 1.13.19 + resolution: "@swc/core@npm:1.13.19" + dependencies: + "@swc/core-darwin-arm64": "npm:1.13.19" + "@swc/core-darwin-x64": "npm:1.13.19" + "@swc/core-linux-arm-gnueabihf": "npm:1.13.19" + "@swc/core-linux-arm64-gnu": "npm:1.13.19" + "@swc/core-linux-arm64-musl": "npm:1.13.19" + "@swc/core-linux-x64-gnu": "npm:1.13.19" + "@swc/core-linux-x64-musl": "npm:1.13.19" + "@swc/core-win32-arm64-msvc": "npm:1.13.19" + "@swc/core-win32-ia32-msvc": "npm:1.13.19" + "@swc/core-win32-x64-msvc": "npm:1.13.19" + "@swc/counter": "npm:^0.1.3" + "@swc/types": "npm:^0.1.25" + peerDependencies: + "@swc/helpers": ">=0.5.17" + dependenciesMeta: + "@swc/core-darwin-arm64": + optional: true + "@swc/core-darwin-x64": + optional: true + "@swc/core-linux-arm-gnueabihf": + optional: true + "@swc/core-linux-arm64-gnu": + optional: true + "@swc/core-linux-arm64-musl": + optional: true + "@swc/core-linux-x64-gnu": + optional: true + "@swc/core-linux-x64-musl": + optional: true + "@swc/core-win32-arm64-msvc": + optional: true + "@swc/core-win32-ia32-msvc": + optional: true + "@swc/core-win32-x64-msvc": + optional: true + peerDependenciesMeta: + "@swc/helpers": + optional: true + checksum: 10/07d0f72d8c82070a1ec2b439964780f0ba7aec61b17fa6518b1c372373bbe208ea9ce68f70f606d42df71a33149e4f704eabe07c6197e15d133e375546915f57 + languageName: node + linkType: hard + +"@swc/counter@npm:^0.1.3": + version: 0.1.3 + resolution: "@swc/counter@npm:0.1.3" + checksum: 10/df8f9cfba9904d3d60f511664c70d23bb323b3a0803ec9890f60133954173047ba9bdeabce28cd70ba89ccd3fd6c71c7b0bd58be85f611e1ffbe5d5c18616598 + languageName: node + linkType: hard + +"@swc/types@npm:^0.1.25": + version: 0.1.25 + resolution: "@swc/types@npm:0.1.25" + dependencies: + "@swc/counter": "npm:^0.1.3" + checksum: 10/f6741450224892d12df43e5ca7f3cc0287df644dcd672626eb0cc2a3a8e3e875f4b29eb11336f37c7240cf6e010ba59eb3a79f4fb8bee5cbd168dfc1326ff369 + languageName: node + linkType: hard + "@szmarczak/http-timer@npm:^4.0.5": version: 4.0.6 resolution: "@szmarczak/http-timer@npm:4.0.6" @@ -3368,6 +3754,24 @@ __metadata: languageName: node linkType: hard +"acorn-walk@npm:^8.3.4": + version: 8.3.4 + resolution: "acorn-walk@npm:8.3.4" + dependencies: + acorn: "npm:^8.11.0" + checksum: 10/871386764e1451c637bb8ab9f76f4995d408057e9909be6fb5ad68537ae3375d85e6a6f170b98989f44ab3ff6c74ad120bc2779a3d577606e7a0cd2b4efcaf77 + languageName: node + linkType: hard + +"acorn@npm:^8.11.0": + version: 8.15.0 + resolution: "acorn@npm:8.15.0" + bin: + acorn: bin/acorn + checksum: 10/77f2de5051a631cf1729c090e5759148459cdb76b5f5c70f890503d629cf5052357b0ce783c0f976dd8a93c5150f59f6d18df1def3f502396a20f81282482fa4 + languageName: node + linkType: hard + "acorn@npm:^8.9.0": version: 8.11.3 resolution: "acorn@npm:8.11.3" @@ -4182,6 +4586,13 @@ __metadata: languageName: node linkType: hard +"chalk@npm:5.6.2, chalk@npm:^5.6.2": + version: 5.6.2 + resolution: "chalk@npm:5.6.2" + checksum: 10/1b2f48f6fba1370670d5610f9cd54c391d6ede28f4b7062dd38244ea5768777af72e5be6b74fb6c6d54cb84c4a2dff3f3afa9b7cb5948f7f022cfd3d087989e0 + languageName: node + linkType: hard + "chalk@npm:^4.0.0, chalk@npm:^4.0.2, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" @@ -4248,6 +4659,13 @@ __metadata: languageName: node linkType: hard +"chardet@npm:^2.1.0": + version: 2.1.1 + resolution: "chardet@npm:2.1.1" + checksum: 10/d56913b65e45c5c86f331988e2ef6264c131bfeadaae098ee719bf6610546c77740e37221ffec802dde56b5e4466613a4c754786f4da6b5f6c5477243454d324 + languageName: node + linkType: hard + "check-error@npm:^2.1.1": version: 2.1.1 resolution: "check-error@npm:2.1.1" @@ -4284,6 +4702,15 @@ __metadata: languageName: node linkType: hard +"chokidar@npm:4.0.3": + version: 4.0.3 + resolution: "chokidar@npm:4.0.3" + dependencies: + readdirp: "npm:^4.0.1" + checksum: 10/bf2a575ea5596000e88f5db95461a9d59ad2047e939d5a4aac59dd472d126be8f1c1ff3c7654b477cf532d18f42a97279ef80ee847972fd2a25410bf00b80b59 + languageName: node + linkType: hard + "chokidar@npm:>=3.0.0 <4.0.0": version: 3.6.0 resolution: "chokidar@npm:3.6.0" @@ -4381,6 +4808,15 @@ __metadata: languageName: node linkType: hard +"cli-cursor@npm:^5.0.0": + version: 5.0.0 + resolution: "cli-cursor@npm:5.0.0" + dependencies: + restore-cursor: "npm:^5.0.0" + checksum: 10/1eb9a3f878b31addfe8d82c6d915ec2330cec8447ab1f117f4aa34f0137fbb3137ec3466e1c9a65bcb7557f6e486d343f2da57f253a2f668d691372dfa15c090 + languageName: node + linkType: hard + "cli-spinners@npm:^2.5.0": version: 2.9.2 resolution: "cli-spinners@npm:2.9.2" @@ -4388,6 +4824,13 @@ __metadata: languageName: node linkType: hard +"cli-spinners@npm:^3.2.0": + version: 3.3.0 + resolution: "cli-spinners@npm:3.3.0" + checksum: 10/d95f69f4a6a4efab2104ca5d4723c9f6fae9a4006df7fdcc1f79ea6539324e274b85bf6f5931146d84296b0f71814f4c1ff1acc158f2e1107c0c9797c1291bcc + languageName: node + linkType: hard + "cli-truncate@npm:^2.1.0": version: 2.1.0 resolution: "cli-truncate@npm:2.1.0" @@ -4398,6 +4841,13 @@ __metadata: languageName: node linkType: hard +"cli-width@npm:^4.1.0": + version: 4.1.0 + resolution: "cli-width@npm:4.1.0" + checksum: 10/b58876fbf0310a8a35c79b72ecfcf579b354e18ad04e6b20588724ea2b522799a758507a37dfe132fafaf93a9922cafd9514d9e1598e6b2cd46694853aed099f + languageName: node + linkType: hard + "cliui@npm:^7.0.2": version: 7.0.4 resolution: "cliui@npm:7.0.4" @@ -4561,6 +5011,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:14.0.2": + version: 14.0.2 + resolution: "commander@npm:14.0.2" + checksum: 10/2d202db5e5f9bb770112a3c1579b893d17ac6f6d932183077308bdd96d0f87f0bbe6a68b5b9ed2cf3b2514be6bb7de637480703c0e2db9741ee1b383237deb26 + languageName: node + linkType: hard + "commander@npm:^5.0.0": version: 5.1.0 resolution: "commander@npm:5.1.0" @@ -6276,6 +6733,26 @@ __metadata: languageName: node linkType: hard +"execa@npm:9.6.0": + version: 9.6.0 + resolution: "execa@npm:9.6.0" + dependencies: + "@sindresorhus/merge-streams": "npm:^4.0.0" + cross-spawn: "npm:^7.0.6" + figures: "npm:^6.1.0" + get-stream: "npm:^9.0.0" + human-signals: "npm:^8.0.1" + is-plain-obj: "npm:^4.1.0" + is-stream: "npm:^4.0.1" + npm-run-path: "npm:^6.0.0" + pretty-ms: "npm:^9.2.0" + signal-exit: "npm:^4.1.0" + strip-final-newline: "npm:^4.0.0" + yoctocolors: "npm:^2.1.1" + checksum: 10/53443be93d847ff5b52d31ed3714f77aab764fb6c1d72dc7019214ab1cb1a69888e2158ba846426a8ea51443c110fe7a86de61ffb9ee5687b00120fbd739b8a4 + languageName: node + linkType: hard + "execa@npm:^9.5.1": version: 9.5.1 resolution: "execa@npm:9.5.1" @@ -6654,6 +7131,16 @@ __metadata: languageName: node linkType: hard +"foreground-child@npm:^3.3.1": + version: 3.3.1 + resolution: "foreground-child@npm:3.3.1" + dependencies: + cross-spawn: "npm:^7.0.6" + signal-exit: "npm:^4.0.1" + checksum: 10/427b33f997a98073c0424e5c07169264a62cda806d8d2ded159b5b903fdfc8f0a1457e06b5fc35506497acb3f1e353f025edee796300209ac6231e80edece835 + languageName: node + linkType: hard + "form-data@npm:^4.0.0": version: 4.0.4 resolution: "form-data@npm:4.0.4" @@ -6885,6 +7372,13 @@ __metadata: languageName: node linkType: hard +"get-east-asian-width@npm:^1.3.0": + version: 1.4.0 + resolution: "get-east-asian-width@npm:1.4.0" + checksum: 10/c9ae85bfc2feaf4cc71cdb236e60f1757ae82281964c206c6aa89a25f1987d326ddd8b0de9f9ccd56e37711b9fcd988f7f5137118b49b0b45e19df93c3be8f45 + languageName: node + linkType: hard + "get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.6": version: 1.3.0 resolution: "get-intrinsic@npm:1.3.0" @@ -7000,6 +7494,22 @@ __metadata: languageName: node linkType: hard +"glob@npm:11.0.3": + version: 11.0.3 + resolution: "glob@npm:11.0.3" + dependencies: + foreground-child: "npm:^3.3.1" + jackspeak: "npm:^4.1.1" + minimatch: "npm:^10.0.3" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^2.0.0" + bin: + glob: dist/esm/bin.mjs + checksum: 10/2ae536c1360c0266b523b2bfa6aadc10144a8b7e08869b088e37ac3c27cd30774f82e4bfb291cde796776e878f9e13200c7ff44010eb7054e00f46f649397893 + languageName: node + linkType: hard + "glob@npm:^10.3.12, glob@npm:^10.3.7": version: 10.4.5 resolution: "glob@npm:10.4.5" @@ -7414,6 +7924,13 @@ __metadata: languageName: node linkType: hard +"human-signals@npm:^8.0.1": + version: 8.0.1 + resolution: "human-signals@npm:8.0.1" + checksum: 10/903389a018b16f330c5e0f6e8b76d592c79552152ea892f249e5290e71c790f5722dc9b740fedd4bdef30566754a69012aaed97a6a528da0d417fad990a6f515 + languageName: node + linkType: hard + "humanize-ms@npm:^1.2.1": version: 1.2.1 resolution: "humanize-ms@npm:1.2.1" @@ -7430,6 +7947,29 @@ __metadata: languageName: node linkType: hard +"i18next-cli@npm:^1.22.2": + version: 1.22.2 + resolution: "i18next-cli@npm:1.22.2" + dependencies: + "@swc/core": "npm:1.13.19" + chalk: "npm:5.6.2" + chokidar: "npm:4.0.3" + commander: "npm:14.0.2" + execa: "npm:9.6.0" + glob: "npm:11.0.3" + i18next-resources-for-ts: "npm:1.7.4" + inquirer: "npm:12.10.0" + jiti: "npm:2.6.1" + jsonc-parser: "npm:3.3.1" + minimatch: "npm:10.1.1" + ora: "npm:9.0.0" + swc-walk: "npm:1.0.0" + bin: + i18next-cli: dist/esm/cli.js + checksum: 10/4b8738b1b04f49a3686df5a89fc9f870bdc408c7b1069ea211685a4425dfa48ea5b73d2250795ae29889a982f0d472489d6c0e321ad3bcff39db9e236991fa77 + languageName: node + linkType: hard + "i18next-fs-backend@npm:^2.3.2": version: 2.3.2 resolution: "i18next-fs-backend@npm:2.3.2" @@ -7464,7 +8004,19 @@ __metadata: languageName: node linkType: hard -"i18next@npm:^23.12.2, i18next@npm:^23.5.1": +"i18next-resources-for-ts@npm:1.7.4": + version: 1.7.4 + resolution: "i18next-resources-for-ts@npm:1.7.4" + dependencies: + "@babel/runtime": "npm:^7.27.0" + yaml: "npm:^2.7.1" + bin: + i18next-resources-for-ts: bin/i18next-resources-for-ts.js + checksum: 10/02ce71939dc6f38672d3b33281367ad7f2c52623371fd88fc1d0033eac5a6385ef45fed49c7a49e5bac0f9a8a97cdc95ec3ee1c68f26cc75dcbdcb5b525ca6cc + languageName: node + linkType: hard + +"i18next@npm:^23.5.1": version: 23.12.2 resolution: "i18next@npm:23.12.2" dependencies: @@ -7473,6 +8025,20 @@ __metadata: languageName: node linkType: hard +"i18next@npm:^25.6.1": + version: 25.6.1 + resolution: "i18next@npm:25.6.1" + dependencies: + "@babel/runtime": "npm:^7.27.6" + peerDependencies: + typescript: ^5 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/a4622a0dc37eed0ae79f8814cae8dcf8206b011e618f109a1497815364d293b5c80e177722cfbcd2577aca8a163af861ff142012bc2957240cd2efc65e57805c + languageName: node + linkType: hard + "icon-gen@npm:^4.0.0": version: 4.0.0 resolution: "icon-gen@npm:4.0.0" @@ -7514,6 +8080,15 @@ __metadata: languageName: node linkType: hard +"iconv-lite@npm:^0.7.0": + version: 0.7.0 + resolution: "iconv-lite@npm:0.7.0" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 10/5bfc897fedfb7e29991ae5ef1c061ed4f864005f8c6d61ef34aba6a3885c04bd207b278c0642b041383aeac2d11645b4319d0ca7b863b0be4be0cde1c9238ca7 + languageName: node + linkType: hard + "ieee754@npm:^1.1.13, ieee754@npm:^1.2.1": version: 1.2.1 resolution: "ieee754@npm:1.2.1" @@ -7627,6 +8202,26 @@ __metadata: languageName: node linkType: hard +"inquirer@npm:12.10.0": + version: 12.10.0 + resolution: "inquirer@npm:12.10.0" + dependencies: + "@inquirer/ansi": "npm:^1.0.1" + "@inquirer/core": "npm:^10.3.0" + "@inquirer/prompts": "npm:^7.9.0" + "@inquirer/type": "npm:^3.0.9" + mute-stream: "npm:^2.0.0" + run-async: "npm:^4.0.5" + rxjs: "npm:^7.8.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10/ed24f3fa202cd8b8fa05c56c8f42c202be7c24d621d968937ea2e298e1d06192979568706587fd243144e1ed55d248ba5c6a27b2c7ee6926864faad532d8572f + languageName: node + linkType: hard + "internal-slot@npm:^1.0.5, internal-slot@npm:^1.0.7": version: 1.0.7 resolution: "internal-slot@npm:1.0.7" @@ -7868,6 +8463,13 @@ __metadata: languageName: node linkType: hard +"is-interactive@npm:^2.0.0": + version: 2.0.0 + resolution: "is-interactive@npm:2.0.0" + checksum: 10/e8d52ad490bed7ae665032c7675ec07732bbfe25808b0efbc4d5a76b1a1f01c165f332775c63e25e9a03d319ebb6b24f571a9e902669fc1e40b0a60b5be6e26c + languageName: node + linkType: hard + "is-lambda@npm:^1.0.1": version: 1.0.1 resolution: "is-lambda@npm:1.0.1" @@ -8021,7 +8623,7 @@ __metadata: languageName: node linkType: hard -"is-unicode-supported@npm:^2.0.0": +"is-unicode-supported@npm:^2.0.0, is-unicode-supported@npm:^2.1.0": version: 2.1.0 resolution: "is-unicode-supported@npm:2.1.0" checksum: 10/f254e3da6b0ab1a57a94f7273a7798dd35d1d45b227759f600d0fa9d5649f9c07fa8d3c8a6360b0e376adf916d151ec24fc9a50c5295c58bae7ca54a76a063f9 @@ -8129,6 +8731,15 @@ __metadata: languageName: node linkType: hard +"jackspeak@npm:^4.1.1": + version: 4.1.1 + resolution: "jackspeak@npm:4.1.1" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + checksum: 10/ffceb270ec286841f48413bfb4a50b188662dfd599378ce142b6540f3f0a66821dc9dcb1e9ebc55c6c3b24dc2226c96e5819ba9bd7a241bd29031b61911718c7 + languageName: node + linkType: hard + "jake@npm:^10.8.5": version: 10.8.5 resolution: "jake@npm:10.8.5" @@ -8143,6 +8754,15 @@ __metadata: languageName: node linkType: hard +"jiti@npm:2.6.1": + version: 2.6.1 + resolution: "jiti@npm:2.6.1" + bin: + jiti: lib/jiti-cli.mjs + checksum: 10/8cd72c5fd03a0502564c3f46c49761090f6dadead21fa191b73535724f095ad86c2fa89ee6fe4bc3515337e8d406cc8fb2d37b73fa0c99a34584bac35cd4a4de + languageName: node + linkType: hard + "js-cookie@npm:^2.2.1": version: 2.2.1 resolution: "js-cookie@npm:2.2.1" @@ -8248,6 +8868,13 @@ __metadata: languageName: node linkType: hard +"jsonc-parser@npm:3.3.1": + version: 3.3.1 + resolution: "jsonc-parser@npm:3.3.1" + checksum: 10/9b0dc391f20b47378f843ef1e877e73ec652a5bdc3c5fa1f36af0f119a55091d147a86c1ee86a232296f55c929bba174538c2bf0312610e0817a22de131cc3f4 + languageName: node + linkType: hard + "jsonfile@npm:^4.0.0": version: 4.0.0 resolution: "jsonfile@npm:4.0.0" @@ -8449,6 +9076,16 @@ __metadata: languageName: node linkType: hard +"log-symbols@npm:^7.0.1": + version: 7.0.1 + resolution: "log-symbols@npm:7.0.1" + dependencies: + is-unicode-supported: "npm:^2.0.0" + yoctocolors: "npm:^2.1.1" + checksum: 10/0862313d84826b551582e39659b8586c56b65130c5f4f976420e2c23985228334f2a26fc4251ac22bf0a5b415d9430e86bf332557d934c10b036f9a549d63a09 + languageName: node + linkType: hard + "logform@npm:^2.3.2, logform@npm:^2.4.0": version: 2.4.2 resolution: "logform@npm:2.4.2" @@ -8551,7 +9188,8 @@ __metadata: file-type: "patch:file-type@npm%3A19.4.1#~/.yarn/patches/file-type-npm-19.4.1-d18086444c.patch" framer-motion: "npm:^9.0.3" fs-extra: "npm:^8.1.0" - i18next: "npm:^23.12.2" + i18next: "npm:^25.6.1" + i18next-cli: "npm:^1.22.2" i18next-fs-backend: "npm:^2.3.2" i18next-parser: "npm:^9.0.1" icon-gen: "npm:^4.0.0" @@ -8572,7 +9210,7 @@ __metadata: pretty-bytes: "npm:^6.0.0" react: "npm:^18.2.0" react-dom: "npm:^18.2.0" - react-i18next: "npm:^15.0.0" + react-i18next: "npm:^16.2.4" react-icons: "npm:^4.1.0" react-leaflet: "npm:^4.2.1" react-lottie-player: "npm:^1.5.0" @@ -8642,6 +9280,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^11.0.0": + version: 11.2.2 + resolution: "lru-cache@npm:11.2.2" + checksum: 10/fa7919fbf068a739f79a1ad461eb273514da7246cebb9dca68e3cd7ba19e3839e7e2aaecd9b72867e08038561eeb96941189e89b3d4091c75ced4f56c71c80db + languageName: node + linkType: hard + "lru-cache@npm:^5.1.1": version: 5.1.1 resolution: "lru-cache@npm:5.1.1" @@ -9185,6 +9830,13 @@ __metadata: languageName: node linkType: hard +"mimic-function@npm:^5.0.0": + version: 5.0.1 + resolution: "mimic-function@npm:5.0.1" + checksum: 10/eb5893c99e902ccebbc267c6c6b83092966af84682957f79313311edb95e8bb5f39fb048d77132b700474d1c86d90ccc211e99bae0935447a4834eb4c882982c + languageName: node + linkType: hard + "mimic-response@npm:^1.0.0": version: 1.0.1 resolution: "mimic-response@npm:1.0.1" @@ -9206,6 +9858,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:10.1.1, minimatch@npm:^10.0.3": + version: 10.1.1 + resolution: "minimatch@npm:10.1.1" + dependencies: + "@isaacs/brace-expansion": "npm:^5.0.0" + checksum: 10/110f38921ea527022e90f7a5f43721838ac740d0a0c26881c03b57c261354fb9a0430e40b2c56dfcea2ef3c773768f27210d1106f1f2be19cde3eea93f26f45e + languageName: node + linkType: hard + "minimatch@npm:9.0.3": version: 9.0.3 resolution: "minimatch@npm:9.0.3" @@ -9410,6 +10071,13 @@ __metadata: languageName: node linkType: hard +"mute-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "mute-stream@npm:2.0.0" + checksum: 10/d2e4fd2f5aa342b89b98134a8d899d8ef9b0a6d69274c4af9df46faa2d97aeb1f2ce83d867880d6de63643c52386579b99139801e24e7526c3b9b0a6d1e18d6c + languageName: node + linkType: hard + "nano-css@npm:^5.3.1": version: 5.3.4 resolution: "nano-css@npm:5.3.4" @@ -9749,6 +10417,15 @@ __metadata: languageName: node linkType: hard +"onetime@npm:^7.0.0": + version: 7.0.0 + resolution: "onetime@npm:7.0.0" + dependencies: + mimic-function: "npm:^5.0.0" + checksum: 10/eb08d2da9339819e2f9d52cab9caf2557d80e9af8c7d1ae86e1a0fef027d00a88e9f5bd67494d350df360f7c559fbb44e800b32f310fb989c860214eacbb561c + languageName: node + linkType: hard + "optionator@npm:^0.9.3": version: 0.9.3 resolution: "optionator@npm:0.9.3" @@ -9763,6 +10440,23 @@ __metadata: languageName: node linkType: hard +"ora@npm:9.0.0": + version: 9.0.0 + resolution: "ora@npm:9.0.0" + dependencies: + chalk: "npm:^5.6.2" + cli-cursor: "npm:^5.0.0" + cli-spinners: "npm:^3.2.0" + is-interactive: "npm:^2.0.0" + is-unicode-supported: "npm:^2.1.0" + log-symbols: "npm:^7.0.1" + stdin-discarder: "npm:^0.2.2" + string-width: "npm:^8.1.0" + strip-ansi: "npm:^7.1.2" + checksum: 10/b6074c9cec4a39c1b4f41c2ce2741982a99c53c86bd6f07a28fb6274857263af7fe1a340136629939934b553af35b03fc62ca2a88baa6803b2f9bfdf269fb850 + languageName: node + linkType: hard + "ora@npm:^5.1.0": version: 5.4.1 resolution: "ora@npm:5.4.1" @@ -10024,6 +10718,16 @@ __metadata: languageName: node linkType: hard +"path-scurry@npm:^2.0.0": + version: 2.0.1 + resolution: "path-scurry@npm:2.0.1" + dependencies: + lru-cache: "npm:^11.0.0" + minipass: "npm:^7.1.2" + checksum: 10/1e9c74e9ccf94d7c16056a5cb2dba9fa23eec1bc221ab15c44765486b9b9975b4cd9a4d55da15b96eadf67d5202e9a2f1cec9023fbb35fe7d9ccd0ff1891f88b + languageName: node + linkType: hard + "path-to-regexp@npm:0.1.10": version: 0.1.10 resolution: "path-to-regexp@npm:0.1.10" @@ -10191,6 +10895,15 @@ __metadata: languageName: node linkType: hard +"pretty-ms@npm:^9.2.0": + version: 9.3.0 + resolution: "pretty-ms@npm:9.3.0" + dependencies: + parse-ms: "npm:^4.0.0" + checksum: 10/beb4e04dc17071885b827e3f33d36be279791f2f36a8c29a45c77e59979dad79a5d7e5211922c72a3f6f109bb64a707d70fcdba6746e077122afcd88ce202e98 + languageName: node + linkType: hard + "prismjs@npm:^1.25.0": version: 1.26.0 resolution: "prismjs@npm:1.26.0" @@ -10390,21 +11103,25 @@ __metadata: languageName: node linkType: hard -"react-i18next@npm:^15.0.0": - version: 15.0.0 - resolution: "react-i18next@npm:15.0.0" +"react-i18next@npm:^16.2.4": + version: 16.2.4 + resolution: "react-i18next@npm:16.2.4" dependencies: - "@babel/runtime": "npm:^7.24.8" + "@babel/runtime": "npm:^7.27.6" html-parse-stringify: "npm:^3.0.1" + use-sync-external-store: "npm:^1.6.0" peerDependencies: - i18next: ">= 23.2.3" + i18next: ">= 25.5.2" react: ">= 16.8.0" + typescript: ^5 peerDependenciesMeta: react-dom: optional: true react-native: optional: true - checksum: 10/5f3e60250179a6e28c61396099b4a9b66f65a484415b1f1c86e538a9242a84a0bf706e5218b9909351c95c28dda423dd741c014a0b503641e1ce03994b81df19 + typescript: + optional: true + checksum: 10/804f460f78be11522363f19d8944e12e4a6ad676b85480708f43cd20a62771ab97947d05635109de486569b8391e44c521975834bc0a69e4578d3bd00968606f languageName: node linkType: hard @@ -10666,6 +11383,13 @@ __metadata: languageName: node linkType: hard +"readdirp@npm:^4.0.1": + version: 4.1.2 + resolution: "readdirp@npm:4.1.2" + checksum: 10/7b817c265940dba90bb9c94d82920d76c3a35ea2d67f9f9d8bd936adcfe02d50c802b14be3dd2e725e002dddbe2cc1c7a0edfb1bc3a365c9dfd5a61e612eea1e + languageName: node + linkType: hard + "readdirp@npm:~3.6.0": version: 3.6.0 resolution: "readdirp@npm:3.6.0" @@ -10903,6 +11627,16 @@ __metadata: languageName: node linkType: hard +"restore-cursor@npm:^5.0.0": + version: 5.1.0 + resolution: "restore-cursor@npm:5.1.0" + dependencies: + onetime: "npm:^7.0.0" + signal-exit: "npm:^4.1.0" + checksum: 10/838dd54e458d89cfbc1a923b343c1b0f170a04100b4ce1733e97531842d7b440463967e521216e8ab6c6f8e89df877acc7b7f4c18ec76e99fb9bf5a60d358d2c + languageName: node + linkType: hard + "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" @@ -11076,6 +11810,13 @@ __metadata: languageName: node linkType: hard +"run-async@npm:^4.0.5": + version: 4.0.6 + resolution: "run-async@npm:4.0.6" + checksum: 10/d23929e36d0422b871a8964d5cfcb1b88295950ea5f72e1dfed458d4c3f3a33a7395e08167d8a4446f2110cfaac7d7653d9c804d2becab8afa8a63e16b97da81 + languageName: node + linkType: hard + "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -11094,6 +11835,15 @@ __metadata: languageName: node linkType: hard +"rxjs@npm:^7.8.2": + version: 7.8.2 + resolution: "rxjs@npm:7.8.2" + dependencies: + tslib: "npm:^2.1.0" + checksum: 10/03dff09191356b2b87d94fbc1e97c4e9eb3c09d4452399dddd451b09c2f1ba8d56925a40af114282d7bc0c6fe7514a2236ca09f903cf70e4bbf156650dddb49d + languageName: node + linkType: hard + "safe-array-concat@npm:^1.1.0": version: 1.1.0 resolution: "safe-array-concat@npm:1.1.0" @@ -11699,6 +12449,13 @@ __metadata: languageName: node linkType: hard +"stdin-discarder@npm:^0.2.2": + version: 0.2.2 + resolution: "stdin-discarder@npm:0.2.2" + checksum: 10/642ffd05bd5b100819d6b24a613d83c6e3857c6de74eb02fc51506fa61dc1b0034665163831873868157c4538d71e31762bcf319be86cea04c3aba5336470478 + languageName: node + linkType: hard + "stream-composer@npm:^1.0.2": version: 1.0.2 resolution: "stream-composer@npm:1.0.2" @@ -11754,6 +12511,16 @@ __metadata: languageName: node linkType: hard +"string-width@npm:^8.1.0": + version: 8.1.0 + resolution: "string-width@npm:8.1.0" + dependencies: + get-east-asian-width: "npm:^1.3.0" + strip-ansi: "npm:^7.1.0" + checksum: 10/51ee97c4ffee7b94f8a2ee785fac14f81ec9809b9fcec9a4db44e25c717c263af0cc4387c111aef76195c0718dc43766f3678c07fb542294fb0244f7bfbde883 + languageName: node + linkType: hard + "string.prototype.matchall@npm:^4.0.8": version: 4.0.10 resolution: "string.prototype.matchall@npm:4.0.10" @@ -11850,6 +12617,15 @@ __metadata: languageName: node linkType: hard +"strip-ansi@npm:^7.1.0, strip-ansi@npm:^7.1.2": + version: 7.1.2 + resolution: "strip-ansi@npm:7.1.2" + dependencies: + ansi-regex: "npm:^6.0.1" + checksum: 10/db0e3f9654e519c8a33c50fc9304d07df5649388e7da06d3aabf66d29e5ad65d5e6315d8519d409c15b32fa82c1df7e11ed6f8cd50b0e4404463f0c9d77c8d0b + languageName: node + linkType: hard + "strip-bom@npm:^3.0.0": version: 3.0.0 resolution: "strip-bom@npm:3.0.0" @@ -11963,6 +12739,15 @@ __metadata: languageName: node linkType: hard +"swc-walk@npm:1.0.0": + version: 1.0.0 + resolution: "swc-walk@npm:1.0.0" + dependencies: + acorn-walk: "npm:^8.3.4" + checksum: 10/f6dc27eef421033956acbe12061e5f43a18b28747fd914734589f25d4144b0ef7de53bb1bf24fcf3a2355f305a3eb0593d0eaa006a43316113c79672b0c070bd + languageName: node + linkType: hard + "sweetalert2-react-content@npm:^5.0.7": version: 5.0.7 resolution: "sweetalert2-react-content@npm:5.0.7" @@ -12713,6 +13498,15 @@ __metadata: languageName: node linkType: hard +"use-sync-external-store@npm:^1.6.0": + version: 1.6.0 + resolution: "use-sync-external-store@npm:1.6.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10/b40ad2847ba220695bff2d4ba4f4d60391c0fb4fb012faa7a4c18eb38b69181936f5edc55a522c4d20a788d1a879b73c3810952c9d0fd128d01cb3f22042c09e + languageName: node + linkType: hard + "use-trace-update@npm:^1.3.0": version: 1.3.2 resolution: "use-trace-update@npm:1.3.2" @@ -13136,6 +13930,17 @@ __metadata: languageName: node linkType: hard +"wrap-ansi@npm:^6.2.0": + version: 6.2.0 + resolution: "wrap-ansi@npm:6.2.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10/0d64f2d438e0b555e693b95aee7b2689a12c3be5ac458192a1ce28f542a6e9e59ddfecc37520910c2c88eb1f82a5411260566dba5064e8f9895e76e169e76187 + languageName: node + linkType: hard + "wrap-ansi@npm:^8.1.0": version: 8.1.0 resolution: "wrap-ansi@npm:8.1.0" @@ -13208,6 +14013,15 @@ __metadata: languageName: node linkType: hard +"yaml@npm:^2.7.1": + version: 2.8.1 + resolution: "yaml@npm:2.8.1" + bin: + yaml: bin.mjs + checksum: 10/eae07b3947d405012672ec17ce27348aea7d1fa0534143355d24a43a58f5e05652157ea2182c4fe0604f0540be71f99f1173f9d61018379404507790dff17665 + languageName: node + linkType: hard + "yargs-parser@npm:^20.2.2": version: 20.2.9 resolution: "yargs-parser@npm:20.2.9" @@ -13269,6 +14083,13 @@ __metadata: languageName: node linkType: hard +"yoctocolors-cjs@npm:^2.1.2": + version: 2.1.3 + resolution: "yoctocolors-cjs@npm:2.1.3" + checksum: 10/b2144b38807673a4254dae06fe1a212729550609e606289c305e45c585b36fab1dbba44fe6cde90db9b28be465ec63f4c2a50867aeec6672f6bc36b6c9a361a0 + languageName: node + linkType: hard + "yoctocolors@npm:^2.0.0": version: 2.1.1 resolution: "yoctocolors@npm:2.1.1" @@ -13276,6 +14097,13 @@ __metadata: languageName: node linkType: hard +"yoctocolors@npm:^2.1.1": + version: 2.1.2 + resolution: "yoctocolors@npm:2.1.2" + checksum: 10/6ee42d665a4cc161c7de3f015b2a65d6c65d2808bfe3b99e228bd2b1b784ef1e54d1907415c025fc12b400f26f372bfc1b71966c6c738d998325ca422eb39363 + languageName: node + linkType: hard + "zod@npm:^3.22.5": version: 3.22.5 resolution: "zod@npm:3.22.5"