@sanity/document-internationalization 1.0.2 → 1.0.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/constants/SupportedEmojiFlagCodes.ts","../src/constants/LanguageCultures.ts","../src/constants/I18nPrefix.ts","../src/constants/I18nDelimiter.ts","../src/constants/ReferenceBehavior.ts","../src/constants/IdStructure.ts","../src/constants/UiMessages.ts","../src/utils/buildDocId.ts","../src/utils/getBaseLanguage.ts","../src/utils/useSanityClient.ts","../src/utils/getLanguagesFromOption.ts","../src/utils/normalizeLanguageList.ts","../src/utils/getBaseIdFromId.ts","../src/utils/getTranslationsForId.ts","../src/utils/createSanityReference.ts","../src/utils/getLanguageFromDocument.ts","../src/utils/serializePath.ts","../src/utils/applyConfig.ts","../src/hooks/useConfig.ts","../src/actions/PublishWithi18nAction.ts","../src/hooks/useDelayedFlag.ts","../src/utils/updateIntlFieldsForDocument.ts","../src/actions/DeleteWithi18nAction.tsx","../src/actions/DuplicateWithi18nAction.tsx","../src/actions/index.ts","../src/structure/components/MaintenanceTabTypeSelector/MaintenanceTabTypeSelector.tsx","../src/structure/components/MaintenanceTabResult/MaintenanceTabResult.tsx","../src/structure/utils/fixLanguageFields.ts","../src/utils/getLanguageFromId.ts","../src/structure/utils/fixTranslationRefs.ts","../src/structure/utils/fixOrphanedDocuments.ts","../src/structure/utils/fixBaseLanguageMismatch.ts","../src/structure/utils/fixBaseDocumentRefs.ts","../src/structure/components/MaintenanceTab/MaintenanceTabContent.tsx","../src/structure/hooks/useDocumentsInformation.ts","../src/structure/utils/fixIdStructureMismatchDocuments.ts","../src/structure/index.tsx","../src/structure/components/MaintenanceTab/MaintenanceTab.tsx","../src/validators/isSlugUnique.ts","../src/utils/getFlag.ts","../src/language-select/components/LanguageSelect/LanguageConfigContext.tsx","../src/language-select/components/SingleFlag/SingleFlag.tsx","../src/language-select/hooks/useListeningQuery.ts","../src/utils/baseToTop.ts","../src/language-select/components/LanguageSelect/LanguageSelectLabel.tsx","../src/language-select/components/SplitPaneIcon/SplitPaneIcon.tsx","../src/language-select/components/LanguageSelect/LanguageSelectContext.ts","../src/language-select/components/LanguageSelect/LanguageSelectListItem.tsx","../src/language-select/components/LanguageSelect/LanguageSelectList.tsx","../src/language-select/components/LanguageSelect/LanguageSelect.tsx","../src/language-select/hooks/useLanguages.ts","../src/language-select/components/LanguageSelect/index.tsx","../src/documentI18n.tsx","../src/badges/LanguageBadge.tsx","../src/withDocumentI18nPlugin.ts"],"sourcesContent":["export const SupportedEmojiFlagCodes = [\n 'AD',\n 'AE',\n 'AF',\n 'AG',\n 'AI',\n 'AL',\n 'AM',\n 'AO',\n 'AQ',\n 'AR',\n 'AS',\n 'AT',\n 'AU',\n 'AW',\n 'AX',\n 'AZ',\n 'BA',\n 'BB',\n 'BD',\n 'BE',\n 'BF',\n 'BG',\n 'BH',\n 'BI',\n 'BJ',\n 'BL',\n 'BM',\n 'BN',\n 'BO',\n 'BQ',\n 'BR',\n 'BS',\n 'BT',\n 'BV',\n 'BW',\n 'BY',\n 'BZ',\n 'CA',\n 'CC',\n 'CD',\n 'CF',\n 'CG',\n 'CH',\n 'CI',\n 'CK',\n 'CL',\n 'CM',\n 'CN',\n 'CO',\n 'CR',\n 'CU',\n 'CV',\n 'CW',\n 'CX',\n 'CY',\n 'CZ',\n 'DE',\n 'DJ',\n 'DK',\n 'DM',\n 'DO',\n 'DZ',\n 'EC',\n 'EE',\n 'EG',\n 'EH',\n 'ER',\n 'ES',\n 'ET',\n 'FI',\n 'FJ',\n 'FK',\n 'FM',\n 'FO',\n 'FR',\n 'GA',\n 'GB',\n 'GD',\n 'GE',\n 'GF',\n 'GG',\n 'GH',\n 'GI',\n 'GL',\n 'GM',\n 'GN',\n 'GP',\n 'GQ',\n 'GR',\n 'GS',\n 'GT',\n 'GU',\n 'GW',\n 'GY',\n 'HK',\n 'HM',\n 'HN',\n 'HR',\n 'HT',\n 'HU',\n 'ID',\n 'IE',\n 'IL',\n 'IM',\n 'IN',\n 'IO',\n 'IQ',\n 'IR',\n 'IS',\n 'IT',\n 'JE',\n 'JM',\n 'JO',\n 'JP',\n 'KE',\n 'KG',\n 'KH',\n 'KI',\n 'KM',\n 'KN',\n 'KP',\n 'KR',\n 'KW',\n 'KY',\n 'KZ',\n 'LA',\n 'LB',\n 'LC',\n 'LI',\n 'LK',\n 'LR',\n 'LS',\n 'LT',\n 'LU',\n 'LV',\n 'LY',\n 'MA',\n 'MC',\n 'MD',\n 'ME',\n 'MF',\n 'MG',\n 'MH',\n 'MK',\n 'ML',\n 'MM',\n 'MN',\n 'MO',\n 'MP',\n 'MQ',\n 'MR',\n 'MS',\n 'MT',\n 'MU',\n 'MV',\n 'MW',\n 'MX',\n 'MY',\n 'MZ',\n 'NA',\n 'NC',\n 'NE',\n 'NF',\n 'NG',\n 'NI',\n 'NL',\n 'NO',\n 'NP',\n 'NR',\n 'NU',\n 'NZ',\n 'OM',\n 'PA',\n 'PE',\n 'PF',\n 'PG',\n 'PH',\n 'PK',\n 'PL',\n 'PM',\n 'PN',\n 'PR',\n 'PS',\n 'PT',\n 'PW',\n 'PY',\n 'QA',\n 'RE',\n 'RO',\n 'RS',\n 'RU',\n 'RW',\n 'SA',\n 'SB',\n 'SC',\n 'SD',\n 'SE',\n 'SG',\n 'SH',\n 'SI',\n 'SJ',\n 'SK',\n 'SL',\n 'SM',\n 'SN',\n 'SO',\n 'SR',\n 'SS',\n 'ST',\n 'SV',\n 'SX',\n 'SY',\n 'SZ',\n 'TC',\n 'TD',\n 'TF',\n 'TG',\n 'TH',\n 'TJ',\n 'TK',\n 'TL',\n 'TM',\n 'TN',\n 'TO',\n 'TR',\n 'TT',\n 'TV',\n 'TW',\n 'TZ',\n 'UA',\n 'UG',\n 'UM',\n 'US',\n 'UY',\n 'UZ',\n 'VA',\n 'VC',\n 'VE',\n 'VG',\n 'VI',\n 'VN',\n 'VU',\n 'WF',\n 'WS',\n 'YE',\n 'YT',\n 'ZA',\n 'ZM',\n 'ZW',\n]\n","export const LanguageCultures = [\n {\n value: 'af',\n title: 'Afrikaans',\n },\n {\n value: 'af-ZA',\n title: 'Afrikaans (South Africa)',\n },\n {\n value: 'ar',\n title: 'Arabic',\n },\n {\n value: 'ar-AE',\n title: 'Arabic (U.A.E.)',\n },\n {\n value: 'ar-BH',\n title: 'Arabic (Bahrain)',\n },\n {\n value: 'ar-DZ',\n title: 'Arabic (Algeria)',\n },\n {\n value: 'ar-EG',\n title: 'Arabic (Egypt)',\n },\n {\n value: 'ar-IQ',\n title: 'Arabic (Iraq)',\n },\n {\n value: 'ar-JO',\n title: 'Arabic (Jordan)',\n },\n {\n value: 'ar-KW',\n title: 'Arabic (Kuwait)',\n },\n {\n value: 'ar-LB',\n title: 'Arabic (Lebanon)',\n },\n {\n value: 'ar-LY',\n title: 'Arabic (Libya)',\n },\n {\n value: 'ar-MA',\n title: 'Arabic (Morocco)',\n },\n {\n value: 'ar-OM',\n title: 'Arabic (Oman)',\n },\n {\n value: 'ar-QA',\n title: 'Arabic (Qatar)',\n },\n {\n value: 'ar-SA',\n title: 'Arabic (Saudi Arabia)',\n },\n {\n value: 'ar-SY',\n title: 'Arabic (Syria)',\n },\n {\n value: 'ar-TN',\n title: 'Arabic (Tunisia)',\n },\n {\n value: 'ar-YE',\n title: 'Arabic (Yemen)',\n },\n {\n value: 'az',\n title: 'Azeri',\n },\n {\n value: 'az-Cyrl-AZ',\n title: 'Azeri (Cyrillic, Azerbaijan)',\n },\n {\n value: 'az-Latn-AZ',\n title: 'Azeri (Latin, Azerbaijan)',\n },\n {\n value: 'be',\n title: 'Belarusian',\n },\n {\n value: 'be-BY',\n title: 'Belarusian (Belarus)',\n },\n {\n value: 'bg',\n title: 'Bulgarian',\n },\n {\n value: 'bg-BG',\n title: 'Bulgarian (Bulgaria)',\n },\n {\n value: 'bs-Latn-BA',\n title: 'Bosnian (Bosnia and Herzegovina)',\n },\n {\n value: 'ca',\n title: 'Catalan',\n },\n {\n value: 'ca-ES',\n title: 'Catalan (Catalan)',\n },\n {\n value: 'cs',\n title: 'Czech',\n },\n {\n value: 'cs-CZ',\n title: 'Czech (Czech Republic)',\n },\n {\n value: 'cy-GB',\n title: 'Welsh (United Kingdom)',\n },\n {\n value: 'da',\n title: 'Danish',\n },\n {\n value: 'da-DK',\n title: 'Danish (Denmark)',\n },\n {\n value: 'de',\n title: 'German',\n },\n {\n value: 'de-AT',\n title: 'German (Austria)',\n },\n {\n value: 'de-DE',\n title: 'German (Germany)',\n },\n {\n value: 'de-CH',\n title: 'German (Switzerland)',\n },\n {\n value: 'de-LI',\n title: 'German (Liechtenstein)',\n },\n {\n value: 'de-LU',\n title: 'German (Luxembourg)',\n },\n {\n value: 'dv',\n title: 'Divehi',\n },\n {\n value: 'dv-MV',\n title: 'Divehi (Maldives)',\n },\n {\n value: 'el',\n title: 'Greek',\n },\n {\n value: 'el-GR',\n title: 'Greek (Greece)',\n },\n {\n value: 'en',\n title: 'English',\n },\n {\n value: 'en-029',\n title: 'English (Caribbean)',\n },\n {\n value: 'en-AU',\n title: 'English (Australia)',\n },\n {\n value: 'en-BZ',\n title: 'English (Belize)',\n },\n {\n value: 'en-CA',\n title: 'English (Canada)',\n },\n {\n value: 'en-GB',\n title: 'English (United Kingdom)',\n },\n {\n value: 'en-IE',\n title: 'English (Ireland)',\n },\n {\n value: 'en-JM',\n title: 'English (Jamaica)',\n },\n {\n value: 'en-NZ',\n title: 'English (New Zealand)',\n },\n {\n value: 'en-PH',\n title: 'English (Republic of the Philippines)',\n },\n {\n value: 'en-TT',\n title: 'English (Trinidad and Tobago)',\n },\n {\n value: 'en-US',\n title: 'English (United States)',\n },\n {\n value: 'en-ZA',\n title: 'English (South Africa)',\n },\n {\n value: 'en-ZW',\n title: 'English (Zimbabwe)',\n },\n {\n value: 'es',\n title: 'Spanish',\n },\n {\n value: 'es-AR',\n title: 'Spanish (Argentina)',\n },\n {\n value: 'es-BO',\n title: 'Spanish (Bolivia)',\n },\n {\n value: 'es-CL',\n title: 'Spanish (Chile)',\n },\n {\n value: 'es-CO',\n title: 'Spanish (Colombia)',\n },\n {\n value: 'es-CR',\n title: 'Spanish (Costa Rica)',\n },\n {\n value: 'es-DO',\n title: 'Spanish (Dominican Republic)',\n },\n {\n value: 'es-EC',\n title: 'Spanish (Ecuador)',\n },\n {\n value: 'es-ES',\n title: 'Spanish (Spain)',\n },\n {\n value: 'es-GT',\n title: 'Spanish (Guatemala)',\n },\n {\n value: 'es-HN',\n title: 'Spanish (Honduras)',\n },\n {\n value: 'es-MX',\n title: 'Spanish (Mexico)',\n },\n {\n value: 'es-NI',\n title: 'Spanish (Nicaragua)',\n },\n {\n value: 'es-PA',\n title: 'Spanish (Panama)',\n },\n {\n value: 'es-PE',\n title: 'Spanish (Peru)',\n },\n {\n value: 'es-PR',\n title: 'Spanish (Puerto Rico)',\n },\n {\n value: 'es-PY',\n title: 'Spanish (Paraguay)',\n },\n {\n value: 'es-SV',\n title: 'Spanish (El Salvador)',\n },\n {\n value: 'es-UY',\n title: 'Spanish (Uruguay)',\n },\n {\n value: 'es-VE',\n title: 'Spanish (Venezuela)',\n },\n {\n value: 'et',\n title: 'Estonian',\n },\n {\n value: 'et-EE',\n title: 'Estonian (Estonia)',\n },\n {\n value: 'eu',\n title: 'Basque',\n },\n {\n value: 'eu-ES',\n title: 'Basque (Basque)',\n },\n {\n value: 'fa',\n title: 'Persian',\n },\n {\n value: 'fa-IR',\n title: 'Persian (Iran)',\n },\n {\n value: 'fi',\n title: 'Finnish',\n },\n {\n value: 'fi-FI',\n title: 'Finnish (Finland)',\n },\n {\n value: 'fo',\n title: 'Faroese',\n },\n {\n value: 'fo-FO',\n title: 'Faroese (Faroe Islands)',\n },\n {\n value: 'fr',\n title: 'French',\n },\n {\n value: 'fr-BE',\n title: 'French (Belgium)',\n },\n {\n value: 'fr-CA',\n title: 'French (Canada)',\n },\n {\n value: 'fr-FR',\n title: 'French (France)',\n },\n {\n value: 'fr-CH',\n title: 'French (Switzerland)',\n },\n {\n value: 'fr-LU',\n title: 'French (Luxembourg)',\n },\n {\n value: 'fr-MC',\n title: 'French (Principality of Monaco)',\n },\n {\n value: 'gl',\n title: 'Galician',\n },\n {\n value: 'gl-ES',\n title: 'Galician (Galician)',\n },\n {\n value: 'gu',\n title: 'Gujarati',\n },\n {\n value: 'gu-IN',\n title: 'Gujarati (India)',\n },\n {\n value: 'he',\n title: 'Hebrew',\n },\n {\n value: 'he-IL',\n title: 'Hebrew (Israel)',\n },\n {\n value: 'hi',\n title: 'Hindi',\n },\n {\n value: 'hi-IN',\n title: 'Hindi (India)',\n },\n {\n value: 'hr',\n title: 'Croatian',\n },\n {\n value: 'hr-BA',\n title: 'Croatian (Bosnia and Herzegovina)',\n },\n {\n value: 'hr-HR',\n title: 'Croatian (Croatia)',\n },\n {\n value: 'hu',\n title: 'Hungarian',\n },\n {\n value: 'hu-HU',\n title: 'Hungarian (Hungary)',\n },\n {\n value: 'hy',\n title: 'Armenian',\n },\n {\n value: 'hy-AM',\n title: 'Armenian (Armenia)',\n },\n {\n value: 'id',\n title: 'Indonesian',\n },\n {\n value: 'id-ID',\n title: 'Indonesian (Indonesia)',\n },\n {\n value: 'is',\n title: 'Icelandic',\n },\n {\n value: 'is-IS',\n title: 'Icelandic (Iceland)',\n },\n {\n value: 'it',\n title: 'Italian',\n },\n {\n value: 'it-CH',\n title: 'Italian (Switzerland)',\n },\n {\n value: 'it-IT',\n title: 'Italian (Italy)',\n },\n {\n value: 'ja',\n title: 'Japanese',\n },\n {\n value: 'ja-JP',\n title: 'Japanese (Japan)',\n },\n {\n value: 'ka',\n title: 'Georgian',\n },\n {\n value: 'ka-GE',\n title: 'Georgian (Georgia)',\n },\n {\n value: 'kk',\n title: 'Kazakh',\n },\n {\n value: 'kk-KZ',\n title: 'Kazakh (Kazakhstan)',\n },\n {\n value: 'kn',\n title: 'Kannada',\n },\n {\n value: 'kn-IN',\n title: 'Kannada (India)',\n },\n {\n value: 'ko',\n title: 'Korean',\n },\n {\n value: 'kok',\n title: 'Konkani',\n },\n {\n value: 'kok-IN',\n title: 'Konkani (India)',\n },\n {\n value: 'ko-KR',\n title: 'Korean (Korea)',\n },\n {\n value: 'ky',\n title: 'Kyrgyz',\n },\n {\n value: 'ky-KG',\n title: 'Kyrgyz (Kyrgyzstan)',\n },\n {\n value: 'lt',\n title: 'Lithuanian',\n },\n {\n value: 'lt-LT',\n title: 'Lithuanian (Lithuania)',\n },\n {\n value: 'lv',\n title: 'Latvian',\n },\n {\n value: 'lv-LV',\n title: 'Latvian (Latvia)',\n },\n {\n value: 'mi-NZ',\n title: 'Maori (New Zealand)',\n },\n {\n value: 'mk',\n title: 'Macedonian',\n },\n {\n value: 'mk-MK',\n title: 'Macedonian (Former Yugoslav Republic of Macedonia)',\n },\n {\n value: 'mn',\n title: 'Mongolian',\n },\n {\n value: 'mn-MN',\n title: 'Mongolian (Cyrillic, Mongolia)',\n },\n {\n value: 'mr',\n title: 'Marathi',\n },\n {\n value: 'mr-IN',\n title: 'Marathi (India)',\n },\n {\n value: 'ms',\n title: 'Malay',\n },\n {\n value: 'ms-BN',\n title: 'Malay (Brunei Darussalam)',\n },\n {\n value: 'ms-MY',\n title: 'Malay (Malaysia)',\n },\n {\n value: 'mt-MT',\n title: 'Maltese (Malta)',\n },\n {\n value: 'nb-NO',\n title: 'Norwegian, Bokmal (Norway)',\n },\n {\n value: 'nl',\n title: 'Dutch',\n },\n {\n value: 'nl-BE',\n title: 'Dutch (Belgium)',\n },\n {\n value: 'nl-NL',\n title: 'Dutch (Netherlands)',\n },\n {\n value: 'nn-NO',\n title: 'Norwegian, Nynorsk (Norway)',\n },\n {\n value: 'no',\n title: 'Norwegian',\n },\n {\n value: 'ns-ZA',\n title: 'Northern Sotho (South Africa)',\n },\n {\n value: 'pa',\n title: 'Punjabi',\n },\n {\n value: 'pa-IN',\n title: 'Punjabi (India)',\n },\n {\n value: 'pl',\n title: 'Polish',\n },\n {\n value: 'pl-PL',\n title: 'Polish (Poland)',\n },\n {\n value: 'pt',\n title: 'Portuguese',\n },\n {\n value: 'pt-BR',\n title: 'Portuguese (Brazil)',\n },\n {\n value: 'pt-PT',\n title: 'Portuguese (Portugal)',\n },\n {\n value: 'quz-BO',\n title: 'Quechua (Bolivia)',\n },\n {\n value: 'quz-EC',\n title: 'Quechua (Ecuador)',\n },\n {\n value: 'quz-PE',\n title: 'Quechua (Peru)',\n },\n {\n value: 'ro',\n title: 'Romanian',\n },\n {\n value: 'ro-RO',\n title: 'Romanian (Romania)',\n },\n {\n value: 'ru',\n title: 'Russian',\n },\n {\n value: 'ru-RU',\n title: 'Russian (Russia)',\n },\n {\n value: 'sa',\n title: 'Sanskrit',\n },\n {\n value: 'sa-IN',\n title: 'Sanskrit (India)',\n },\n {\n value: 'se-FI',\n title: 'Sami (Northern) (Finland)',\n },\n {\n value: 'se-NO',\n title: 'Sami (Northern) (Norway)',\n },\n {\n value: 'se-SE',\n title: 'Sami (Northern) (Sweden)',\n },\n {\n value: 'sk',\n title: 'Slovak',\n },\n {\n value: 'sk-SK',\n title: 'Slovak (Slovakia)',\n },\n {\n value: 'sl',\n title: 'Slovenian',\n },\n {\n value: 'sl-SI',\n title: 'Slovenian (Slovenia)',\n },\n {\n value: 'sma-NO',\n title: 'Sami (Southern) (Norway)',\n },\n {\n value: 'sma-SE',\n title: 'Sami (Southern) (Sweden)',\n },\n {\n value: 'smj-NO',\n title: 'Sami (Lule) (Norway)',\n },\n {\n value: 'smj-SE',\n title: 'Sami (Lule) (Sweden)',\n },\n {\n value: 'smn-FI',\n title: 'Sami (Inari) (Finland)',\n },\n {\n value: 'sms-FI',\n title: 'Sami (Skolt) (Finland)',\n },\n {\n value: 'sq',\n title: 'Albanian',\n },\n {\n value: 'sq-AL',\n title: 'Albanian (Albania)',\n },\n {\n value: 'sr',\n title: 'Serbian',\n },\n {\n value: 'sr-Cyrl-BA',\n title: 'Serbian (Cyrillic) (Bosnia and Herzegovina)',\n },\n {\n value: 'sr-Cyrl-CS',\n title: 'Serbian (Cyrillic, Serbia)',\n },\n {\n value: 'sr-Latn-BA',\n title: 'Serbian (Latin) (Bosnia and Herzegovina)',\n },\n {\n value: 'sr-Latn-CS',\n title: 'Serbian (Latin, Serbia)',\n },\n {\n value: 'sv',\n title: 'Swedish',\n },\n {\n value: 'sv-FI',\n title: 'Swedish (Finland)',\n },\n {\n value: 'sv-SE',\n title: 'Swedish (Sweden)',\n },\n {\n value: 'sw',\n title: 'Kiswahili',\n },\n {\n value: 'sw-KE',\n title: 'Kiswahili (Kenya)',\n },\n {\n value: 'syr',\n title: 'Syriac',\n },\n {\n value: 'syr-SY',\n title: 'Syriac (Syria)',\n },\n {\n value: 'ta',\n title: 'Tamil',\n },\n {\n value: 'ta-IN',\n title: 'Tamil (India)',\n },\n {\n value: 'te',\n title: 'Telugu',\n },\n {\n value: 'te-IN',\n title: 'Telugu (India)',\n },\n {\n value: 'th',\n title: 'Thai',\n },\n {\n value: 'th-TH',\n title: 'Thai (Thailand)',\n },\n {\n value: 'tn-ZA',\n title: 'Tswana (South Africa)',\n },\n {\n value: 'tr',\n title: 'Turkish',\n },\n {\n value: 'tr-TR',\n title: 'Turkish (Turkey)',\n },\n {\n value: 'tt',\n title: 'Tatar',\n },\n {\n value: 'tt-RU',\n title: 'Tatar (Russia)',\n },\n {\n value: 'uk',\n title: 'Ukrainian',\n },\n {\n value: 'uk-UA',\n title: 'Ukrainian (Ukraine)',\n },\n {\n value: 'ur',\n title: 'Urdu',\n },\n {\n value: 'ur-PK',\n title: 'Urdu (Islamic Republic of Pakistan)',\n },\n {\n value: 'uz',\n title: 'Uzbek',\n },\n {\n value: 'uz-Cyrl-UZ',\n title: 'Uzbek (Cyrillic, Uzbekistan)',\n },\n {\n value: 'uz-Latn-UZ',\n title: 'Uzbek (Latin, Uzbekistan)',\n },\n {\n value: 'vi',\n title: 'Vietnamese',\n },\n {\n value: 'vi-VN',\n title: 'Vietnamese (Vietnam)',\n },\n {\n value: 'xh-ZA',\n title: 'Xhosa (South Africa)',\n },\n {\n value: 'zh-CN',\n title: \"Chinese (People's Republic of China)\",\n },\n {\n value: 'zh-HK',\n title: 'Chinese (Hong Kong S.A.R.)',\n },\n {\n value: 'zh-CHS',\n title: 'Chinese (Simplified)',\n },\n {\n value: 'zh-CHT',\n title: 'Chinese (Traditional)',\n },\n {\n value: 'zh-MO',\n title: 'Chinese (Macao S.A.R.)',\n },\n {\n value: 'zh-SG',\n title: 'Chinese (Singapore)',\n },\n {\n value: 'zh-TW',\n title: 'Chinese (Taiwan)',\n },\n {\n value: 'zu-ZA',\n title: 'Zulu (South Africa)',\n },\n]\n","export const I18nPrefix = 'i18n'\n","export const I18nDelimiter = '__i18n_'\n","export enum ReferenceBehavior {\n STRONG = 'strong',\n WEAK = 'weak',\n DISABLED = 'disabled',\n}\n","export enum IdStructure {\n SUBPATH = 'subpath',\n DELIMITER = 'delimiter',\n}\n","export const UiMessages = {\n publishing: 'Publishing...',\n publish: 'Publish',\n updatingIntlFields: 'Updating i18n fields',\n intlFieldsUpdated: 'i18n fields updated',\n baseDocumentCopied: 'Base document copied',\n translationCreatedToast: {\n title: (name: string): string => `Translation created: ${name}`,\n description: (name: string): string =>\n `The content from ‘${name}’ is copied into the new document translation.`,\n },\n loading: 'Loading languages...',\n draft: 'Draft',\n missingTranslations:\n 'Following languages are missing some translations compared to the base language',\n base: 'Base',\n missing: 'Missing',\n deleteAll: {\n buttonTitle: 'Delete (incl. translations)',\n deleting: 'Deleting...',\n },\n duplicateAll: {\n buttonTitle: 'Duplicate (incl. translations)',\n duplicating: 'Duplicating...',\n },\n translationsMaintenance: {\n title: 'Translation Maintenance',\n selectSchemaPlaceholder: 'Select schema type',\n idStructureMismatch: 'document(s) with mismatched ID structures',\n missingLanguageField: 'document(s) are missing the language field',\n missingDocumentRefs: 'document(s) have missing translation references',\n missingBaseDocumentRefs: 'document(s) have missing base document references',\n orphanDocuments: 'orphaned translation document(s)',\n referenceBehaviorMismatch: 'document(s) with mismatched reference behaviors',\n baseLanguageMismatch: 'base document(s) with mismatched language field',\n fix: 'Fix',\n pendingTransactionDialog: {\n header: 'Confirm pending transaction',\n caution:\n 'Before continuing please review the transactions. Keep in mind, the translation maintenance functionality may remove or update many documents at once. It is recommended to back-up your dataset before performing data maintenance',\n cancel: 'Cancel',\n confirm: 'Confirm operation',\n },\n },\n errors: {\n baseDocumentNotPublished:\n 'It looks like you have not published your base translation yet. When using strong references it is required to publish the base document before publishing any translated entries',\n },\n languageSelect: {\n placeholder: 'Switch language',\n listLabels: {\n existing: 'Select document translations',\n missing: 'Create new document translations',\n },\n },\n}\n","import {Ti18nConfig} from '../types'\nimport {I18nDelimiter, I18nPrefix, IdStructure} from '../constants'\n\nexport const buildDocId = (pluginConfig: Ti18nConfig, id: string, lang?: string | null): string => {\n if (pluginConfig.idStructure === IdStructure.DELIMITER)\n return `${id}${I18nDelimiter}${lang || '*'}`\n return `${I18nPrefix}.${id}.${lang || '*'}`\n}\n","import {ILanguageObject} from '../types'\n\nexport const getBaseLanguage = (langs: ILanguageObject[], base?: string) => {\n if (base) return langs.find((l) => l.id === base) || null\n return langs.length > 0 ? langs[0] : null\n}\n","import {SanityClient} from '@sanity/client'\nimport {useClient} from 'sanity'\n\nexport function useSanityClient(): SanityClient {\n return useClient({apiVersion: '2021-10-01'})\n}\n","import get from 'just-safe-get'\nimport type {SanityClient, SanityDocument} from '@sanity/client'\nimport {ILanguageObject, ILanguageQuery, TLanguagesOption} from '../types'\nimport type {ApplyConfigResult} from '../utils'\nimport {normalizeLanguageList} from './normalizeLanguageList'\n\nexport const getLanguagesFromOption = async <D extends SanityDocument>(\n client: SanityClient,\n config: ApplyConfigResult,\n langs: TLanguagesOption,\n document?: D | null\n): Promise<ILanguageObject[]> => {\n const languages = normalizeLanguageList(\n await (async () => {\n if (Array.isArray(langs)) return langs\n const r = await client.fetch<ILanguageQuery['value'][]>(langs.query)\n const value = langs.value\n\n if (typeof value === 'string') return r.map((l) => get(l, value))\n return r.map((l) => {\n // @deprecated\n if ('name' in value) {\n return {\n name: get(l, value.name),\n title: get(l, value.title),\n }\n }\n\n return {\n id: get(l, value.id),\n title: get(l, value.title),\n }\n })\n })()\n )\n if (config.languagesLoader) {\n return config.languagesLoader(languages, document ?? undefined)\n }\n return languages\n}\n","import {ILanguageObject} from '../types'\nimport {LanguageCultures} from '../constants'\n\ntype LanguageConfigObject =\n | ILanguageObject\n | (Omit<ILanguageObject, 'id'> & {\n name: string\n })\n\nexport const normalizeLanguageList = (languages: (string | LanguageConfigObject)[]) =>\n languages.map<ILanguageObject>((l) => {\n if (typeof l === 'string') {\n const langCult = LanguageCultures.find((x) => x.value === l)\n if (langCult) return {title: langCult.title, id: l}\n return {title: l, id: l}\n }\n\n if ('name' in l) {\n console.warn(\n `The \"name\" field in your language configuration is deprecated, please replace it with \"id\".`\n )\n return {title: l.title, id: l.name}\n }\n\n return {title: l.title, id: l.id}\n })\n","import {I18nPrefix, I18nDelimiter} from '../constants'\n\n/* Generic to support both string -> string & string? -> string? */\nexport const getBaseIdFromId = <T extends string | undefined>(id?: T): T => {\n if (!id) {\n return undefined as T\n }\n const nonDraftId = id.replace(/^drafts\\./, '')\n\n // subpath\n const rx = new RegExp(`${I18nPrefix}\\\\.([^.]+)\\\\.[^.]+`)\n const match = nonDraftId.match(rx)\n if (match && match.length === 2) return match[1] as T\n\n // delimiter\n const split = nonDraftId.split(I18nDelimiter)\n if (split.length > 0) return split[0] as T\n\n return nonDraftId as T\n}\n","import {SanityClient} from '@sanity/client'\nimport type {ApplyConfigResult} from '../utils'\nimport {I18nDelimiter, IdStructure} from '../constants'\nimport {Ti18nDocument} from '../types'\nimport {buildDocId} from './buildDocId'\n\nexport const getTranslationsFor = async (\n client: SanityClient,\n config: ApplyConfigResult,\n baseDocumentId: string,\n includeDrafts = false\n): Promise<Ti18nDocument[]> => {\n if (config.idStructure === IdStructure.DELIMITER) {\n const segments = baseDocumentId.split('-')\n segments[segments.length - 1] = `${segments[segments.length - 1]}${I18nDelimiter}*`\n const documents = await client.fetch<Ti18nDocument[]>(\n includeDrafts\n ? '*[_id match $segments]'\n : `*[_id match $segments && !(_id in path('drafts.**'))]`,\n {segments}\n )\n\n return documents\n ? documents.filter(\n (d) =>\n d._id.startsWith(baseDocumentId) ||\n (includeDrafts && d._id.startsWith(`drafts.${baseDocumentId}`))\n )\n : []\n }\n const documents = await client.fetch<Ti18nDocument[]>(\n includeDrafts ? '*[_id in path($path) || _id in path($draftPath)]' : '*[_id in path($path)]',\n {\n path: buildDocId(config, baseDocumentId, '*'),\n draftPath: `drafts.${buildDocId(config, baseDocumentId, '*')}`,\n }\n )\n return documents ?? []\n}\n","import type {Reference} from 'sanity'\n\ntype Ref = Omit<Reference, '_type'> & {_type: 'reference'}\n\nexport function createSanityReference(id: string, weak = false): Ref {\n return {\n _type: 'reference' as const,\n _ref: id.replace(`drafts.`, ``),\n ...(weak === true ? {_weak: true} : {}),\n }\n}\n","import type {SanityDocument} from '@sanity/client'\nimport type {ApplyConfigResult} from './applyConfig'\n\nexport function getLanguageFromDocument(\n doc: SanityDocument,\n config: ApplyConfigResult\n): string | null {\n return doc?.[config.fieldNames.lang] || config.base || null\n}\n","import {Path, isKeyedObject} from 'sanity'\n\nexport function serializePath(path: Path): string {\n return path.reduce<string>((target, part, i) => {\n const isIndex = typeof part === 'number'\n const isKey = isKeyedObject(part)\n const separator = i === 0 ? '' : '.'\n const add = isIndex || isKey ? '[]' : `${separator}${part}`\n return `${target}${add}`\n }, '')\n}\n","import {IdStructure, ReferenceBehavior} from '../constants'\nimport type {Ti18nConfig} from '../types'\n\ntype ApplyConfigOptionalKeys =\n | 'shouldReload'\n | 'languagesLoader'\n | 'fallbackLanguageSelect'\n | 'customFlagComponents'\nexport type ApplyConfigResult = Omit<\n Required<{\n [K in keyof Ti18nConfig]: Required<Ti18nConfig[K]>\n }>,\n ApplyConfigOptionalKeys\n> &\n Pick<Ti18nConfig, ApplyConfigOptionalKeys>\n\nexport function applyConfig(\n baseConfig?: Ti18nConfig,\n incomingConfig?: Ti18nConfig | null\n): ApplyConfigResult {\n return {\n base: incomingConfig?.base || baseConfig?.base || '',\n languages: incomingConfig?.languages || baseConfig?.languages || [],\n idStructure: baseConfig?.idStructure || IdStructure.DELIMITER,\n referenceBehavior: baseConfig?.referenceBehavior || ReferenceBehavior.STRONG,\n withTranslationsMaintenance: baseConfig?.withTranslationsMaintenance === true,\n shouldReload: baseConfig?.shouldReload,\n languagesLoader: baseConfig?.languagesLoader,\n fallbackLanguageSelect: baseConfig?.fallbackLanguageSelect,\n customFlagComponents: baseConfig?.customFlagComponents,\n fieldNames: {\n lang: incomingConfig?.fieldNames?.lang || baseConfig?.fieldNames?.lang || '__i18n_lang',\n references:\n incomingConfig?.fieldNames?.references ||\n baseConfig?.fieldNames?.references ||\n '__i18n_refs',\n baseReference:\n incomingConfig?.fieldNames?.baseReference ||\n baseConfig?.fieldNames?.baseReference ||\n '__i18n_base',\n },\n }\n}\n","import {useMemo} from 'react'\nimport {useSchema} from 'sanity'\nimport type {Ti18nConfig, Ti18nSchema} from '../types'\nimport {applyConfig, ApplyConfigResult} from '../utils'\n\nexport function useConfig(pluginConfig: Ti18nConfig, type?: string): ApplyConfigResult {\n const schemaRegistry = useSchema()\n const schemaI18nConfig = useMemo(() => {\n if (type) {\n const schemaType = schemaRegistry.get(type) as Ti18nSchema | undefined\n if (schemaType && typeof schemaType.i18n !== 'boolean') {\n return schemaType?.i18n\n }\n }\n return null\n }, [type, schemaRegistry])\n\n return useMemo(\n () => applyConfig(pluginConfig, schemaI18nConfig),\n [schemaI18nConfig, pluginConfig]\n )\n}\n","import * as React from 'react'\n\nimport {useToast} from '@sanity/ui'\nimport {CheckmarkIcon, PublishIcon} from '@sanity/icons'\nimport {useDocumentOperation, useEditState, useSyncState, useValidationStatus} from 'sanity'\nimport type {DocumentActionComponent, DocumentActionDescription} from 'sanity'\nimport {getBaseIdFromId, updateIntlFieldsForDocument, useSanityClient} from '../utils'\nimport {ReferenceBehavior, UiMessages} from '../constants'\nimport {IEditState, IUseDocumentOperationResult, Ti18nConfig} from '../types'\nimport {useConfig, useDelayedFlag} from '../hooks'\n\nexport function createPublishAction(pluginConfig: Ti18nConfig): DocumentActionComponent {\n return ({type, id, onComplete}): DocumentActionDescription => {\n const toast = useToast()\n const client = useSanityClient()\n const config = useConfig(pluginConfig, type)\n const baseDocumentId = getBaseIdFromId(id)\n const updatingIntlFieldsPromiseRef = React.useRef<Promise<void> | null>(null)\n const [publishState, setPublishState] = React.useState<'publishing' | 'published' | null>(null)\n const [updatingIntlFields, setUpdatingIntlFields] = React.useState(false)\n const {draft, published} = useEditState(id, type) as IEditState\n const baseDocumentEditState = useEditState(baseDocumentId, type) as IEditState\n const {publish} = useDocumentOperation(id, type) as IUseDocumentOperationResult\n const {isValidating, validation} = useValidationStatus(id, type)\n const syncState = useSyncState(id, type)\n const baseDocumentSyncState = useSyncState(baseDocumentId, type)\n const disabled = useDelayedFlag(\n !!(\n publishState === 'published' ||\n publishState === 'publishing' ||\n updatingIntlFields ||\n publish.disabled ||\n syncState.isSyncing ||\n baseDocumentSyncState.isSyncing ||\n isValidating ||\n validation.some((marker) => marker.level === 'error')\n )\n )\n\n const label = React.useMemo(() => {\n if (publishState === 'publishing') return UiMessages.publishing\n if (updatingIntlFields) return UiMessages.updatingIntlFields\n return UiMessages.publish\n }, [publishState, updatingIntlFields])\n\n const doUpdateIntlFields = React.useCallback(async () => {\n setUpdatingIntlFields(true)\n try {\n const document = draft || published\n if (document) {\n await updateIntlFieldsForDocument(\n client,\n config,\n document,\n baseDocumentEditState.published\n )\n }\n\n toast.push({\n closable: true,\n status: 'success',\n title: UiMessages.intlFieldsUpdated,\n })\n } catch (err) {\n console.error(err)\n toast.push({\n closable: true,\n status: 'error',\n title: (err as Error).toString(),\n })\n }\n setUpdatingIntlFields(false)\n }, [toast, draft, published, client, baseDocumentEditState.published, config])\n\n const onHandle = React.useCallback(() => {\n setPublishState('publishing')\n const isTranslation = id !== baseDocumentId\n if (\n isTranslation &&\n !baseDocumentEditState.published &&\n config.referenceBehavior === ReferenceBehavior.STRONG\n ) {\n throw new Error(UiMessages.errors.baseDocumentNotPublished)\n } else {\n publish.execute()\n }\n }, [id, baseDocumentId, publish, config, baseDocumentEditState.published])\n\n React.useEffect(() => {\n const didPublish = publishState === 'publishing' && !draft\n\n const nextState = didPublish ? 'published' : null\n const delay = didPublish ? 200 : 4000\n const timer = setTimeout(() => {\n setPublishState(nextState)\n }, delay)\n return () => clearTimeout(timer)\n }, [publishState, draft])\n\n React.useEffect(() => {\n if (publishState === 'published') {\n if (!updatingIntlFieldsPromiseRef.current) {\n updatingIntlFieldsPromiseRef.current = doUpdateIntlFields()\n .then(() => onComplete && onComplete())\n .finally(() => (updatingIntlFieldsPromiseRef.current = null))\n }\n }\n }, [publishState, onComplete, doUpdateIntlFields])\n\n return {\n disabled,\n label,\n icon: publishState === 'published' ? CheckmarkIcon : PublishIcon,\n shortcut: disabled ? null : 'Ctrl+Alt+P',\n onHandle,\n }\n }\n}\n","import {useEffect, useState} from 'react'\n\nexport function useDelayedFlag(\n value = false,\n timeout = 500,\n delayedOn = false,\n delayedOff = true\n): boolean {\n const [flag, setFlag] = useState(value)\n\n useEffect(() => {\n if (flag !== value) {\n if (value) {\n if (delayedOn) {\n const timeoutId = setTimeout(() => setFlag(true), timeout)\n return () => clearTimeout(timeoutId)\n }\n setFlag(true)\n } else if (!value) {\n if (delayedOff) {\n const timeoutId = setTimeout(() => setFlag(false), timeout)\n return () => clearTimeout(timeoutId)\n }\n setFlag(false)\n }\n }\n return undefined\n }, [flag, value, timeout, delayedOn, delayedOff])\n\n return flag\n}\n","import compact from 'lodash/compact'\nimport {SanityClient, SanityDocument} from '@sanity/client'\nimport {ITranslationRef} from '../types'\nimport {ReferenceBehavior} from '../constants'\nimport {ApplyConfigResult} from '../utils'\nimport {getLanguagesFromOption} from './getLanguagesFromOption'\nimport {getBaseLanguage} from './getBaseLanguage'\nimport {getTranslationsFor} from './getTranslationsForId'\nimport {getBaseIdFromId} from './getBaseIdFromId'\nimport {createSanityReference} from './createSanityReference'\nimport {getLanguageFromDocument} from './getLanguageFromDocument'\n\n// @TODO make this into a hook so the hook\n// can look up the existance of a base document on its own\nexport async function updateIntlFieldsForDocument(\n client: SanityClient,\n config: ApplyConfigResult,\n document: SanityDocument,\n baseDocument?: SanityDocument\n): Promise<void> {\n const {_type: type, _id: id} = document\n const baseDocumentId = getBaseIdFromId(id)\n const isTranslation = id !== baseDocumentId\n const fieldName = config.fieldNames.lang\n const refsFieldName = config.fieldNames.references\n const baseRefFieldName = config.fieldNames.baseReference\n const langs = await getLanguagesFromOption(client, config, config.languages, document)\n const languageId =\n getLanguageFromDocument(document, config) || getBaseLanguage(langs, config.base)?.id\n\n // Update I18n field for current document\n const currentDocumentTransaction = client.transaction()\n currentDocumentTransaction.createIfNotExists({_id: id, _type: type})\n currentDocumentTransaction.patch(id, {\n set: {\n [fieldName]: languageId,\n ...(isTranslation && config.referenceBehavior !== ReferenceBehavior.DISABLED\n ? {\n [baseRefFieldName]: createSanityReference(\n baseDocumentId,\n config.referenceBehavior === ReferenceBehavior.WEAK\n ),\n }\n : {}),\n },\n })\n await currentDocumentTransaction.commit()\n\n // update base document reference if required\n if (baseDocument) {\n const translatedDocuments = await getTranslationsFor(client, config, baseDocumentId)\n if (translatedDocuments.length > 0) {\n const baseDocumentTransaction = client.transaction()\n let translatedRefs: ITranslationRef[] = []\n if (config.referenceBehavior !== ReferenceBehavior.DISABLED) {\n translatedRefs = compact(\n translatedDocuments.map((doc) => {\n const lang = getLanguageFromDocument(doc, config)\n if (!lang) return null\n return {\n _key: lang,\n ...createSanityReference(\n doc._id,\n config.referenceBehavior === ReferenceBehavior.WEAK\n ),\n }\n }, {})\n )\n }\n // baseDocumentTransaction.createIfNotExists({_id: baseDocumentId, _type: type})\n baseDocumentTransaction.patch(baseDocumentId, {\n set: {\n [refsFieldName]: translatedRefs,\n },\n })\n await baseDocumentTransaction.commit()\n }\n }\n}\n","import React from 'react'\nimport {TrashIcon} from '@sanity/icons'\nimport {useDocumentOperation, useEditState, useSyncState} from 'sanity'\nimport {ConfirmDeleteDialog} from 'sanity/desk'\nimport {useToast} from '@sanity/ui'\nimport type {DocumentActionComponent, DocumentActionDescription} from 'sanity'\nimport {IEditState, IUseDocumentOperationResult, Ti18nConfig} from '../types'\nimport {getBaseIdFromId, getTranslationsFor, useSanityClient} from '../utils'\nimport {UiMessages} from '../constants'\nimport {useConfig} from '../hooks'\n\n/**\n * This code is mostly taken from the defualt DeleteAction provided by Sanity\n */\nconst DISABLED_REASON_TITLE = {\n NOTHING_TO_DELETE: \"This document doesn't yet exist or is already deleted\",\n}\n\nexport function createDeleteAction(pluginConfig: Ti18nConfig): DocumentActionComponent {\n return function DeleteWith18nAction({id, type, onComplete}): DocumentActionDescription {\n const toast = useToast()\n const client = useSanityClient()\n const config = useConfig(pluginConfig, type)\n const baseDocumentId = React.useMemo(() => getBaseIdFromId(id), [id])\n const baseDocumentEditState = useEditState(baseDocumentId, type) as IEditState\n const syncState = useSyncState(id, type)\n const baseDocumentSyncState = useSyncState(baseDocumentId, type)\n const {delete: deleteOp} = useDocumentOperation(id, type) as IUseDocumentOperationResult\n const [isDeleting, setIsDeleting] = React.useState(false)\n const [isConfirmDialogOpen, setConfirmDialogOpen] = React.useState(false)\n\n const onHandle = React.useCallback(() => {\n setConfirmDialogOpen(true)\n }, [])\n\n const onDialogCancel = React.useCallback(() => {\n setConfirmDialogOpen(false)\n if (onComplete) onComplete()\n }, [onComplete])\n\n const onDialogConfirm = React.useCallback(async () => {\n try {\n setIsDeleting(true)\n setConfirmDialogOpen(false)\n\n if (baseDocumentEditState.draft || baseDocumentEditState.published) {\n const baseTransaction = client.transaction()\n if (baseDocumentEditState.draft) {\n baseTransaction.delete(`drafts.${baseDocumentId}`)\n }\n if (baseDocumentEditState.published) {\n baseTransaction.patch(baseDocumentId, {\n unset: [config.fieldNames.references],\n })\n }\n await baseTransaction.commit()\n }\n\n const translatedDocuments = await getTranslationsFor(client, config, baseDocumentId, true)\n const translationsTransaction = client.transaction()\n translatedDocuments.forEach((doc) => {\n translationsTransaction.delete(doc._id)\n })\n await translationsTransaction.commit()\n\n deleteOp.execute()\n if (onComplete) onComplete()\n } catch (err) {\n toast.push({\n closable: true,\n status: 'error',\n title: (err as Error).toString(),\n })\n } finally {\n setIsDeleting(true)\n }\n }, [\n toast,\n config,\n client,\n baseDocumentId,\n baseDocumentEditState.draft,\n baseDocumentEditState.published,\n deleteOp,\n onComplete,\n ])\n\n return {\n onHandle,\n tone: 'critical',\n icon: TrashIcon,\n disabled:\n isDeleting ||\n Boolean(deleteOp.disabled) ||\n syncState.isSyncing ||\n baseDocumentSyncState.isSyncing,\n shortcut: 'CTRL+ALT+D',\n title:\n (deleteOp.disabled &&\n DISABLED_REASON_TITLE[deleteOp.disabled as keyof typeof DISABLED_REASON_TITLE]) ||\n '',\n label: isDeleting ? UiMessages.deleteAll.deleting : UiMessages.deleteAll.buttonTitle,\n dialog: isConfirmDialogOpen && {\n type: 'dialog',\n onClose: onComplete,\n content: (\n <ConfirmDeleteDialog\n action=\"delete\"\n id={id}\n type={type}\n onCancel={onDialogCancel}\n onConfirm={onDialogConfirm}\n />\n ),\n },\n }\n }\n}\n","import React from 'react'\nimport {CopyIcon} from '@sanity/icons'\nimport {useDocumentOperation} from 'sanity'\nimport {useToast} from '@sanity/ui'\nimport {uuid} from '@sanity/uuid'\nimport type {DocumentActionComponent, DocumentActionDescription} from 'sanity'\nimport {\n buildDocId,\n getBaseIdFromId,\n getLanguageFromDocument,\n getTranslationsFor,\n useSanityClient,\n} from '../utils'\nimport {IUseDocumentOperationResult, Ti18nConfig} from '../types'\nimport {UiMessages} from '../constants'\nimport {useConfig} from '../hooks'\n\n/**\n * This code is mostly taken from the default DuplicateAction provided by Sanity\n */\n\nconst DISABLED_REASON_TITLE = {\n NOTHING_TO_DUPLICATE: \"This document doesn't yet exist so there's nothing to duplicate\",\n}\n\nexport function createDuplicateAction(pluginConfig: Ti18nConfig): DocumentActionComponent {\n return ({id, type, draft, published}): DocumentActionDescription => {\n const toast = useToast()\n const client = useSanityClient()\n const config = useConfig(pluginConfig, type)\n const baseDocumentId = getBaseIdFromId(id)\n const {duplicate: duplicateOp} = useDocumentOperation(id, type) as IUseDocumentOperationResult\n const [isDuplicating, setDuplicating] = React.useState(false)\n\n const onDuplicate = React.useCallback(async () => {\n setDuplicating(true)\n try {\n const dupeId = uuid()\n const translations = await getTranslationsFor(client, config, baseDocumentId)\n const transaction = client.transaction()\n transaction.create({\n ...(draft ?? published),\n _id: dupeId,\n _type: type,\n })\n translations.forEach((t) => {\n const isDraft = t._id.startsWith('drafts.')\n const newId = buildDocId(config, dupeId, getLanguageFromDocument(t, config))\n transaction.create({\n ...t,\n _id: isDraft ? `drafts.${newId}` : newId,\n })\n })\n await transaction.commit()\n } catch (err) {\n console.error(err)\n toast.push({\n description: (err as Error).message,\n })\n }\n setDuplicating(false)\n }, [client, config, toast, baseDocumentId, type, draft, published])\n\n return {\n icon: CopyIcon,\n disabled: Boolean(duplicateOp.disabled) || isDuplicating,\n title:\n (duplicateOp.disabled &&\n DISABLED_REASON_TITLE[duplicateOp.disabled as keyof typeof DISABLED_REASON_TITLE]) ||\n '',\n label: isDuplicating\n ? UiMessages.duplicateAll.duplicating\n : UiMessages.duplicateAll.buttonTitle,\n onHandle: onDuplicate,\n }\n }\n}\n","import {type DocumentActionsContext, type DocumentActionComponent} from 'sanity'\nimport {Ti18nConfig, Ti18nSchema} from '../types'\nimport {getBaseIdFromId} from '../utils'\nimport {createPublishAction} from './PublishWithi18nAction'\nimport {createDeleteAction} from './DeleteWithi18nAction'\nimport {createDuplicateAction} from './DuplicateWithi18nAction'\n\nexport {createPublishAction, createDeleteAction, createDuplicateAction}\n\nexport const resolveActions = (\n prev: DocumentActionComponent[],\n {schema, schemaType, documentId}: DocumentActionsContext,\n pluginConfig: Ti18nConfig\n): DocumentActionComponent[] => {\n const type: Ti18nSchema = schema.get(schemaType) as Ti18nSchema\n const isI18n = type && type.i18n\n const isBase = documentId === getBaseIdFromId(documentId)\n let actions = prev\n\n if (isI18n) {\n actions = actions.map((Action) => {\n const isPublishAction = Action.action === 'publish'\n const isDeleteAction = Action.action === 'delete'\n\n if (isPublishAction) {\n return createPublishAction(pluginConfig)\n }\n\n if (isDeleteAction && isBase) {\n return createDeleteAction(pluginConfig)\n }\n\n return Action\n })\n\n if (isBase) {\n actions.push(createDuplicateAction(pluginConfig))\n }\n }\n\n return actions\n}\n","import React, {forwardRef, Ref, useMemo} from 'react'\nimport {Autocomplete, Card, Stack, Text} from '@sanity/ui'\nimport {EarthGlobeIcon} from '@sanity/icons'\nimport {useSchema, DefaultPreview as Preview} from 'sanity'\nimport {Ti18nSchema} from '../../../types'\nimport {UiMessages} from '../../../constants'\n\ntype PreviewMedia = React.ComponentProps<typeof Preview>['media']\ntype Props = {\n value: string\n onChange: (value: string) => void\n onOpen: () => void\n}\n\nexport const MaintenanceTabTypeSelector = forwardRef(function MaintenanceTabTypeSelector(\n {value, onChange, onOpen}: Props,\n ref: Ref<HTMLInputElement>\n) {\n const schema = useSchema()\n const i18nSchemas = useMemo(\n () => schema._original?.types.filter((s: unknown) => !!(s as Ti18nSchema).i18n),\n [schema]\n )\n\n return (\n <Stack space={4}>\n <Text>{UiMessages.translationsMaintenance.selectSchemaPlaceholder}</Text>\n <Card>\n <Autocomplete\n ref={ref}\n fontSize={[2, 2, 3]}\n icon={EarthGlobeIcon}\n id=\"i18n-schema-selector\"\n options={i18nSchemas?.map((option) => ({\n value: option.name,\n payload: option,\n }))}\n value={value}\n placeholder=\"Search\"\n openButton={{onClick: () => onOpen}}\n onChange={onChange}\n renderValue={(v, option) => option?.payload.title || v}\n renderOption={({payload}) => (\n <Card padding={2} radius={2} as=\"button\">\n <Preview\n layout=\"default\"\n title={payload.title}\n media={payload.icon as PreviewMedia}\n />\n </Card>\n )}\n />\n </Card>\n </Stack>\n )\n})\n","import React from 'react'\nimport {Box, Button, Card, Flex, Text} from '@sanity/ui'\nimport {UiMessages} from '../../../constants/UiMessages'\n\ntype Props = React.PropsWithChildren<{\n pending?: boolean\n count: number\n labelName?: keyof typeof UiMessages['translationsMaintenance']\n onClick?: (event: React.SyntheticEvent<HTMLButtonElement, Event>) => void\n}>\n\nexport const MaintenanceTabResult: React.FC<Props> = ({\n pending,\n count,\n labelName,\n children,\n onClick,\n}) => {\n return (\n <Card padding={3} radius={2} shadow={1} tone={count > 0 ? `caution` : `default`}>\n <Flex align=\"center\">\n <Box flex={1}>\n <Text muted={count <= 0}>\n <span>{count}</span>\n <span>&nbsp;</span>\n <span>\n {labelName ? String(UiMessages.translationsMaintenance[labelName]) : children}\n </span>\n </Text>\n </Box>\n\n {count > 0 && (\n <Button\n padding={2}\n fontSize={2}\n disabled={pending}\n onClick={onClick}\n text={UiMessages.translationsMaintenance.fix}\n />\n )}\n </Flex>\n </Card>\n )\n}\n","import type {SanityClient, SanityDocument, Transaction} from '@sanity/client'\nimport type {Schema} from 'sanity'\nimport {Ti18nSchema} from '../../types'\nimport {ApplyConfigResult, getLanguageFromId} from '../../utils'\n\nexport const fixLanguageFields = (\n sanityClient: SanityClient,\n config: ApplyConfigResult,\n schemaRegistry: Schema,\n documents: SanityDocument[]\n): Transaction => {\n const langFieldName = config.fieldNames?.lang\n const transaction = sanityClient.transaction()\n\n documents.forEach((d) => {\n const schemaObject = schemaRegistry.get(d._type) as Ti18nSchema\n const base =\n (typeof schemaObject.i18n === 'object' ? schemaObject.i18n.base : undefined) || config.base\n if (!d[langFieldName]) {\n // @README keep the language from ID behavior\n // because in this case we expect the language field not to be available\n const language = getLanguageFromId(d._id) || base\n transaction.patch(d._id, {\n set: {\n [langFieldName]: language,\n },\n })\n }\n })\n\n return transaction\n}\n","import {I18nPrefix, I18nDelimiter} from '../constants'\n\nexport const getLanguageFromId = (id: string): string | undefined => {\n // subpath\n const rx = new RegExp(`${I18nPrefix}\\\\.[^.]+\\\\.([^.]+)`)\n const match = id.match(rx)\n if (match && match.length === 2) return match[1]\n\n // delimiter\n const split = id.split(I18nDelimiter)\n if (split.length > 1) return split[1]\n return undefined\n}\n","import chunk from 'lodash/chunk'\nimport compact from 'lodash/compact'\nimport {SanityClient, Transaction, SanityDocument} from '@sanity/client'\nimport type {Reference} from 'sanity'\nimport {ReferenceBehavior} from '../../constants'\nimport {\n ApplyConfigResult,\n createSanityReference,\n getBaseIdFromId,\n getLanguageFromDocument,\n} from '../../utils'\n\nexport const fixTranslationRefs = (\n sanityClient: SanityClient,\n config: ApplyConfigResult,\n baseDocuments: SanityDocument[],\n translatedDocuments: SanityDocument[]\n // eslint-disable-next-line max-params\n): Transaction[] => {\n const refsFieldName = config.fieldNames.references\n const transactions = chunk(baseDocuments, 50).map((documentsChunk) => {\n const transaction = sanityClient.transaction()\n documentsChunk.forEach((d) => {\n let translatedRefs: Reference[] = []\n const relevantTranslations = translatedDocuments.filter(\n (dx) => getBaseIdFromId(dx._id) === d._id\n )\n if (config.referenceBehavior !== ReferenceBehavior.DISABLED) {\n translatedRefs = compact(\n relevantTranslations.map((doc) => {\n const lang = getLanguageFromDocument(doc, config)\n if (!lang) return null\n return {\n _key: lang,\n ...createSanityReference(\n doc._id,\n config.referenceBehavior === ReferenceBehavior.WEAK\n ),\n }\n }, {})\n )\n }\n transaction.patch(d._id, {\n set: {[refsFieldName]: translatedRefs},\n })\n })\n return transaction\n })\n return transactions\n}\n","import type {SanityClient, SanityDocument, Transaction} from '@sanity/client'\nimport type {Reference} from 'sanity'\nimport {ApplyConfigResult} from '../../utils'\n\nexport const fixOrphanedDocuments = (\n sanityClient: SanityClient,\n config: ApplyConfigResult,\n basedocuments: SanityDocument[],\n translatedDocuments: SanityDocument[]\n): Transaction => {\n const transaction = sanityClient.transaction()\n translatedDocuments.forEach((d) => {\n const base = basedocuments.find(\n (doc) =>\n (Array.isArray(d?.[config.fieldNames.references]) &&\n d?.[config.fieldNames.references]?.some((ref: Reference) => ref._ref === d._id)) ||\n doc._id === d?.[config.fieldNames.baseReference]?._ref\n )\n if (!base) transaction.delete(d._id)\n })\n return transaction\n}\n","import type {SanityDocument, SanityClient, Transaction} from '@sanity/client'\nimport {ApplyConfigResult, getBaseLanguage, getLanguagesFromOption} from '../../utils'\n\nexport const fixBaseLanguageMismatch = async (\n sanityClient: SanityClient,\n config: ApplyConfigResult,\n basedocuments: SanityDocument[]\n): Promise<Transaction> => {\n const languages = await getLanguagesFromOption(sanityClient, config, config.languages)\n const baseLanguage = getBaseLanguage(languages, config.base)\n const langFieldName = config.fieldNames.lang\n const transaction = sanityClient.transaction()\n basedocuments.forEach((doc) => {\n if (doc[langFieldName] !== baseLanguage?.id) {\n transaction.patch(doc._id, {\n set: {[langFieldName]: baseLanguage?.id}, // eslint-disable-line\n })\n }\n })\n return transaction\n}\n","import type {SanityDocument, SanityClient, Transaction} from '@sanity/client'\nimport {ReferenceBehavior} from '../../constants'\nimport {ApplyConfigResult, createSanityReference, getBaseIdFromId} from '../../utils'\n\nexport const fixBaseDocumentRefs = (\n sanityClient: SanityClient,\n config: ApplyConfigResult,\n translatedDocuments: SanityDocument[]\n): Transaction => {\n const transaction = sanityClient.transaction()\n\n if (config.referenceBehavior !== ReferenceBehavior.DISABLED) {\n const baseRefFieldName = config.fieldNames.baseReference\n translatedDocuments.forEach((d) => {\n if (!d[baseRefFieldName]) {\n const baseId = getBaseIdFromId(d._id)\n transaction.patch(d._id, {\n set: {\n [baseRefFieldName]: createSanityReference(\n baseId,\n config.referenceBehavior === ReferenceBehavior.WEAK\n ),\n },\n })\n }\n })\n }\n\n return transaction\n}\n","import React, {forwardRef, Ref, useCallback, useState} from 'react'\nimport {useSchema} from 'sanity'\nimport {Box, Button, Card, Code, Container, Dialog, Flex, Grid, Stack, Text} from '@sanity/ui'\nimport {Transaction} from '@sanity/client'\nimport styled from 'styled-components'\nimport {UiMessages} from '../../../constants'\nimport {MaintenanceTabTypeSelector} from '../MaintenanceTabTypeSelector'\nimport {useDocumentsInformation} from '../../hooks'\nimport {MaintenanceTabResult} from '../MaintenanceTabResult'\nimport {\n fixBaseDocumentRefs,\n fixBaseLanguageMismatch,\n fixIdStructureMismatchDocuments,\n fixLanguageFields,\n fixOrphanedDocuments,\n fixTranslationRefs,\n} from '../../utils'\nimport {Ti18nConfig} from '../../../types'\nimport {useSanityClient} from '../../../utils'\nimport {useConfig} from '../../../hooks'\n\nconst StyledCodeCard = styled(Card)`\n grid-column-start: 1;\n grid-row-start: 1;\n`\n\nconst StyledCode = styled(Code)`\n word-break: break-word;\n white-space: break-spaces;\n`\n\nconst StyledDownloadCodeFlex = styled(Flex)`\n grid-column-start: 1;\n grid-row-start: 1;\n`\n\nexport interface MaintenanceTabContentProps {\n config: Ti18nConfig\n}\n\nexport const MaintenanceTabContent = forwardRef(function MaintenanceTabContent(\n {config: pluginConfig}: MaintenanceTabContentProps,\n ref: Ref<HTMLInputElement>\n) {\n const [selectedSchema, setSelectedSchema] = useState('')\n const client = useSanityClient()\n const {\n pending,\n setPending,\n documents,\n baseDocuments,\n translatedDocuments,\n documentsSummaryInformation,\n fetchInformation,\n } = useDocumentsInformation(pluginConfig, selectedSchema)\n const [pendingTransactions, setPendingTransactions] = useState<Transaction[] | null>(null)\n const schemaRegistry = useSchema()\n const config = useConfig(pluginConfig, selectedSchema)\n\n const onSchemaTypeChange = useCallback((schemaName: string) => setSelectedSchema(schemaName), [])\n\n const handleOpen = useCallback(() => setSelectedSchema(''), [])\n\n const handleFixIdStructureMismatchDocuments = useCallback(() => {\n setPendingTransactions(\n fixIdStructureMismatchDocuments(client, config, selectedSchema, documents)\n )\n }, [client, config, selectedSchema, documents])\n\n const handleFixMissingLanguageFields = useCallback(() => {\n setPendingTransactions([fixLanguageFields(client, config, schemaRegistry, documents)])\n }, [client, schemaRegistry, config, documents])\n\n const handleFixTranslationRefs = useCallback(() => {\n setPendingTransactions(fixTranslationRefs(client, config, baseDocuments, translatedDocuments))\n }, [client, config, baseDocuments, translatedDocuments])\n\n const handleFixBaseDocumntRefs = useCallback(() => {\n setPendingTransactions([fixBaseDocumentRefs(client, config, translatedDocuments)])\n }, [client, config, translatedDocuments])\n\n const handleFixOrphanDocuments = useCallback(() => {\n setPendingTransactions([\n fixOrphanedDocuments(client, config, baseDocuments, translatedDocuments),\n ])\n }, [client, config, baseDocuments, translatedDocuments])\n\n const handleFixReferenceBehaviorMismatch = useCallback(() => {\n setPendingTransactions(fixTranslationRefs(client, config, baseDocuments, translatedDocuments))\n }, [client, config, baseDocuments, translatedDocuments])\n\n const handleFixBaseLanguageMismatch = useCallback(async () => {\n setPendingTransactions([await fixBaseLanguageMismatch(client, config, baseDocuments)])\n }, [client, config, baseDocuments])\n\n const handleDownloadCode = useCallback(() => {\n if (pendingTransactions) {\n const json = JSON.stringify(\n pendingTransactions.map((transaction) => transaction.toJSON()),\n null,\n 2\n )\n const blob = new Blob([json], {\n type: 'application/json',\n })\n\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = 'transactions.json'\n a.style.display = 'none'\n document.body.appendChild(a)\n a.click()\n URL.revokeObjectURL(url)\n }\n }, [pendingTransactions])\n\n const handleCancelPendingTransaction = useCallback(() => {\n setPendingTransactions(null)\n }, [setPendingTransactions])\n\n const handleConfirmPendingTransaction = useCallback(async () => {\n setPending(true)\n try {\n // run all transactions\n if (pendingTransactions) {\n await pendingTransactions.reduce<Promise<void>>(async (prev, transaction) => {\n await prev\n await transaction.commit()\n }, Promise.resolve())\n await fetchInformation(selectedSchema)\n setPendingTransactions(null)\n }\n } catch (err) {\n console.error(err)\n // @TODO show error\n } finally {\n setPending(false)\n }\n }, [setPending, fetchInformation, selectedSchema, pendingTransactions])\n\n return (\n <Container width={1}>\n <Stack space={2}>\n <Box padding={4}>\n <MaintenanceTabTypeSelector\n value={selectedSchema}\n onChange={onSchemaTypeChange}\n onOpen={handleOpen}\n ref={ref}\n />\n </Box>\n {!!selectedSchema && (\n <Box paddingX={4}>\n <Stack space={2}>\n <MaintenanceTabResult\n pending={pending}\n count={documentsSummaryInformation.idStructureMismatch.length}\n labelName=\"idStructureMismatch\"\n onClick={handleFixIdStructureMismatchDocuments}\n />\n <MaintenanceTabResult\n pending={pending}\n count={documentsSummaryInformation.missingLanguageField.length}\n labelName=\"missingLanguageField\"\n onClick={handleFixMissingLanguageFields}\n />\n <MaintenanceTabResult\n pending={pending}\n count={documentsSummaryInformation.missingDocumentRefs.length}\n labelName=\"missingDocumentRefs\"\n onClick={handleFixTranslationRefs}\n />\n <MaintenanceTabResult\n pending={pending}\n count={documentsSummaryInformation.missingBaseDocumentRefs.length}\n labelName=\"missingBaseDocumentRefs\"\n onClick={handleFixBaseDocumntRefs}\n />\n <MaintenanceTabResult\n pending={pending}\n count={documentsSummaryInformation.orphanDocuments.length}\n labelName=\"orphanDocuments\"\n onClick={handleFixOrphanDocuments}\n />\n <MaintenanceTabResult\n pending={pending}\n count={documentsSummaryInformation.referenceBehaviorMismatch.length}\n labelName=\"referenceBehaviorMismatch\"\n onClick={handleFixReferenceBehaviorMismatch}\n />\n <MaintenanceTabResult\n pending={pending}\n count={documentsSummaryInformation.baseLanguageMismatch.length}\n labelName=\"baseLanguageMismatch\"\n onClick={handleFixBaseLanguageMismatch}\n />\n </Stack>\n </Box>\n )}\n </Stack>\n {!!pendingTransactions?.length && (\n <Dialog\n id=\"confirm-pending-transactions\"\n width={2}\n header={UiMessages.translationsMaintenance.pendingTransactionDialog.header}\n onClose={handleCancelPendingTransaction}\n footer={\n <Flex padding={3} justify=\"flex-end\">\n <Grid autoFlow=\"column\" autoCols=\"auto\" gap={2}>\n <Button\n tone=\"default\"\n loading={pending}\n disabled={pending}\n text={UiMessages.translationsMaintenance.pendingTransactionDialog.cancel}\n onClick={handleCancelPendingTransaction}\n />\n <Button\n tone=\"critical\"\n loading={pending}\n disabled={pending}\n text={UiMessages.translationsMaintenance.pendingTransactionDialog.confirm}\n onClick={handleConfirmPendingTransaction}\n />\n </Grid>\n </Flex>\n }\n >\n <Stack padding={3} space={3}>\n <Card padding={3} radius={2} shadow={1} tone=\"caution\">\n <Text size={2}>\n {UiMessages.translationsMaintenance.pendingTransactionDialog.caution}\n </Text>\n </Card>\n <Grid cols={1}>\n <StyledCodeCard padding={3} radius={2} shadow={1} tone=\"default\">\n <StyledCode language=\"json\">\n {JSON.stringify(\n pendingTransactions.map((transaction) => transaction.toJSON()),\n null,\n 2\n )}\n </StyledCode>\n </StyledCodeCard>\n <StyledDownloadCodeFlex\n padding={2}\n justify=\"flex-end\"\n align=\"flex-start\"\n onClick={handleDownloadCode}\n >\n <Button text=\"Download\" />\n </StyledDownloadCodeFlex>\n </Grid>\n </Stack>\n </Dialog>\n )}\n </Container>\n )\n})\n","import React from 'react'\nimport {useConfig} from '../../hooks'\nimport {I18nDelimiter, I18nPrefix, IdStructure, ReferenceBehavior} from '../../constants'\nimport {ILanguageObject, ITranslationRef, Ti18nConfig, Ti18nDocument} from '../../types'\nimport {\n getBaseIdFromId,\n getBaseLanguage,\n getLanguagesFromOption,\n useSanityClient,\n} from '../../utils'\n\nexport const useDocumentsInformation = (pluginConfig: Ti18nConfig, schema: string) => {\n const client = useSanityClient()\n const config = useConfig(pluginConfig, schema)\n const [pending, setPending] = React.useState(false)\n const [documents, setDocuments] = React.useState<Ti18nDocument[]>([])\n const [languages, setLanguages] = React.useState<ILanguageObject[]>([])\n const baseDocuments = React.useMemo(() => {\n if (config.idStructure === IdStructure.DELIMITER)\n return documents.filter((d) => !d._id.includes(I18nDelimiter))\n return documents.filter((d) => !d._id.startsWith(I18nPrefix))\n }, [config, documents])\n const translatedDocuments = React.useMemo(() => {\n if (config.idStructure === IdStructure.DELIMITER)\n return documents.filter((d) => d._id.includes(I18nDelimiter))\n return documents.filter((d) => d._id.startsWith(I18nPrefix))\n }, [config, documents])\n const idStructureMismatchDocuments = React.useMemo(() => {\n if (config.idStructure === IdStructure.DELIMITER)\n return documents.filter((d) => d._id.startsWith(I18nPrefix))\n return documents.filter((d) => d._id.includes(I18nDelimiter))\n }, [config, documents])\n\n const fetchInformation = React.useCallback(\n async (selectedSchema: string) => {\n setPending(true)\n const [langs, result] = await Promise.all([\n getLanguagesFromOption(client, config, config.languages),\n client.fetch<Ti18nDocument[]>(`*[_type == $type && !(_id in path('drafts.**'))]`, {\n type: selectedSchema,\n }),\n ])\n setLanguages(langs)\n setDocuments(result)\n setPending(false)\n },\n [config, client]\n )\n\n const documentsSummaryInformation = React.useMemo(() => {\n const base = getBaseLanguage(languages, config.base)\n const basedocuments = baseDocuments\n const translateddocuments = translatedDocuments\n const langFieldName = config.fieldNames?.lang\n const refsFieldName = config.fieldNames?.references\n const baseRefFieldName = config.fieldNames?.baseReference\n return {\n idStructureMismatch: idStructureMismatchDocuments,\n missingLanguageField: documents.filter((d) => !d[langFieldName]),\n missingDocumentRefs: basedocuments.filter((d) => {\n const docs = translateddocuments.filter((dx) => getBaseIdFromId(dx._id) === d._id)\n const refsCount = (Object.values(d[refsFieldName] || []) as any[]).filter(\n (ref) => ref._type === 'reference' && !!ref._ref\n ).length\n return refsCount != docs.length\n }),\n missingBaseDocumentRefs: translateddocuments.filter((d) => !d[baseRefFieldName]),\n orphanDocuments: translateddocuments.filter((d) => {\n const baseDoc = basedocuments.find((doc) => getBaseIdFromId(d._id) === doc._id)\n if (baseDoc) return false\n return true\n }),\n referenceBehaviorMismatch: basedocuments.filter((doc) => {\n const refs: ITranslationRef[] = doc[refsFieldName] || []\n if (config.referenceBehavior === ReferenceBehavior.DISABLED)\n return Object.keys(refs).length > 0\n if (config.referenceBehavior === ReferenceBehavior.WEAK)\n return Object.values(refs).some((r) => !r._weak)\n return Object.values(refs).some((r) => !!r._weak)\n }),\n baseLanguageMismatch: basedocuments.filter((doc) => {\n return base?.id && doc[langFieldName] !== base.id\n }),\n }\n }, [\n config,\n documents,\n languages,\n baseDocuments,\n translatedDocuments,\n idStructureMismatchDocuments,\n ])\n\n React.useEffect(() => {\n if (schema) {\n fetchInformation(schema)\n }\n }, [schema])\n\n return {\n pending,\n setPending,\n documents,\n baseDocuments,\n translatedDocuments,\n idStructureMismatchDocuments,\n documentsSummaryInformation,\n fetchInformation,\n }\n}\n","import type {SanityDocument, Transaction} from '@sanity/client'\nimport chunk from 'just-split'\nimport {SanityClient} from '@sanity/client'\nimport {ReferenceBehavior} from '../../constants'\nimport {\n ApplyConfigResult,\n buildDocId,\n createSanityReference,\n getBaseIdFromId,\n getLanguageFromDocument,\n} from '../../utils'\n\nexport const fixIdStructureMismatchDocuments = (\n sanityClient: SanityClient,\n config: ApplyConfigResult,\n schema: string,\n documents: SanityDocument[]\n): Transaction[] => {\n const refsFieldName = config.fieldNames.references\n\n // remove old refs\n const existingBaseDocumentIds = new Set(documents.map((d) => getBaseIdFromId(d._id)))\n const removeOldRefsTransaction = sanityClient.transaction()\n existingBaseDocumentIds.forEach((id) => {\n removeOldRefsTransaction.patch(id, {\n set: {[refsFieldName]: []},\n })\n })\n\n // create new document ids\n const newDocumentTransactions = chunk(\n documents.filter((d) => d._id !== getBaseIdFromId(d._id)),\n 100\n ).map((documentsChunk) => {\n const transaction = sanityClient.transaction()\n documentsChunk.forEach((d) => {\n const baseId = getBaseIdFromId(d._id)\n const lang = getLanguageFromDocument(d, config)\n if (lang) {\n const newId = buildDocId(config, baseId, lang)\n transaction.createIfNotExists({\n ...d,\n _id: newId,\n _type: schema,\n })\n transaction.delete(d._id)\n\n // patch base document with updated refs\n if (config.referenceBehavior !== ReferenceBehavior.DISABLED) {\n transaction.patch(baseId, {setIfMissing: {[refsFieldName]: []}})\n transaction.patch(baseId, {\n insert: {\n after: `${refsFieldName}[-1]`,\n items: [\n {\n _key: lang,\n ...createSanityReference(\n newId,\n config.referenceBehavior === ReferenceBehavior.WEAK\n ),\n },\n ],\n },\n })\n }\n }\n })\n return transaction\n })\n\n return [removeOldRefsTransaction, ...newDocumentTransactions]\n}\n","import {EarthGlobeIcon} from '@sanity/icons'\nimport {Schema, SchemaType} from 'sanity'\nimport {DocumentListBuilder, ListItemBuilder, StructureBuilder} from 'sanity/desk'\nimport {applyConfig} from '../utils'\nimport {I18nDelimiter, I18nPrefix, IdStructure, UiMessages} from '../constants'\nimport {Ti18nConfig} from '../types'\nimport {createMaintenanceTabComponent} from './components/MaintenanceTab'\n\nexport interface StructureConfig {\n S: StructureBuilder\n config: Ti18nConfig\n schema: Schema & {\n i18n?: Ti18nConfig\n }\n}\n\nconst hasIcon = (schemaType?: SchemaType | string): boolean => {\n if (!schemaType || typeof schemaType === 'string') {\n return false\n }\n return Boolean(schemaType.icon)\n}\n\nexport const getDefaultDocumentNode = (S: StructureBuilder) => {\n return S.document()\n}\n\nexport const getDocumentTypes = (props: StructureConfig) => {\n const {S, schema} = props\n const listItemsWithouti18n: ListItemBuilder[] = []\n const listItemsWithi18n = S.documentTypeListItems().filter((l) => {\n let schemaType = l.getSchemaType()\n schemaType = typeof schemaType === 'string' ? schema.get(schemaType) : schemaType\n\n const hasi18n = schemaType && (schemaType as unknown as {i18n: boolean}).i18n\n if (!hasi18n) listItemsWithouti18n.push(l)\n return hasi18n\n })\n return {\n withoutI18n: listItemsWithouti18n,\n withI18n: listItemsWithi18n,\n }\n}\n\nexport const getMaintenanceTabComponent = (props: StructureConfig) => {\n const {S} = props\n const MaintenanceTab = createMaintenanceTabComponent(props)\n return S.component(MaintenanceTab)\n .title(UiMessages.translationsMaintenance.title)\n .id(`__i18n_translations_maintenance_tab`)\n}\n\nexport const getMaintenanceListItem = (props: StructureConfig) => {\n const {S} = props\n return S.listItem()\n .id(`__i18n_translations_maintenance_tab`)\n .title(UiMessages.translationsMaintenance.title)\n .icon(EarthGlobeIcon)\n .child(getMaintenanceTabComponent(props))\n}\n\nexport const getFilteredDocumentTypeListItems = (props: StructureConfig) => {\n const {S, config: pluginConfig, schema} = props\n const config = applyConfig(\n pluginConfig,\n typeof schema.i18n === 'object' ? schema.i18n : undefined\n )\n const types = getDocumentTypes(props)\n const filterFns = {\n [IdStructure.SUBPATH]: (list: ListItemBuilder, doc: DocumentListBuilder) =>\n doc.filter('!(_id in path($path)) && !(_id in path($drafts)) && _type == $type').params({\n path: `${I18nPrefix}.**`,\n drafts: `drafts.${I18nPrefix}.**`,\n type: list.getId(),\n }),\n [IdStructure.DELIMITER]: (list: ListItemBuilder, doc: DocumentListBuilder) =>\n doc.filter('!(_id match $id) && _type == $type').params({\n id: `*${I18nDelimiter}*`,\n type: list.getId(),\n }),\n }\n\n const items = [\n ...types.withoutI18n,\n ...types.withI18n.map((l) => {\n const schemaType = l.getSchemaType()\n const schemaTypeName = typeof schemaType === 'string' ? schemaType : schemaType?.name\n\n return l.child(\n filterFns[config.idStructure](\n l,\n S.documentList()\n .id(l.getId() || '')\n .title(l.getTitle() || '')\n .schemaType(schemaTypeName ?? '')\n .menuItems([...(schemaTypeName ? S.orderingMenuItemsForType(schemaTypeName) : [])])\n )\n )\n }),\n ]\n\n if (config.withTranslationsMaintenance) {\n items.splice(0, 0, getMaintenanceListItem(props))\n }\n\n return items.map((item) => item.serialize())\n}\n\nexport function getDocumentList(props: StructureConfig) {\n const {S} = props\n const types = getDocumentTypes(props)\n if (types.withI18n.length === 0) return S.defaults()\n\n const items = getFilteredDocumentTypeListItems(props)\n return S.list()\n .id('__root__')\n .title('Content')\n .items(items)\n .showIcons(items.some((item) => hasIcon(item.schemaType)))\n}\n","import React, {forwardRef, Ref, VoidFunctionComponent} from 'react'\nimport {Ti18nConfig} from '../../../types'\nimport {MaintenanceTabContent} from './MaintenanceTabContent'\n\nexport interface MaintenanceTabProps {\n config: Ti18nConfig\n}\n\nexport function createMaintenanceTabComponent(props: MaintenanceTabProps): VoidFunctionComponent {\n return forwardRef(function MaintenanceTab(p: any, ref: Ref<HTMLInputElement>) {\n return <MaintenanceTabContent {...props} ref={ref} />\n })\n}\n","import type {SlugIsUniqueValidator} from 'sanity'\nimport type {SanityClient} from '@sanity/client'\nimport {I18nDelimiter} from '../constants'\nimport {getBaseIdFromId, serializePath} from '../utils'\n\n/*\n * most of this is taken from the deafultUnique function in @sanity/validation\n */\nexport function createIsSlugUnique(client: SanityClient): SlugIsUniqueValidator {\n return (slug, context) => {\n const {document, path, type} = context\n const schemaOptions = type?.options as {disableArrayWarning?: boolean} | undefined\n\n if (!document) {\n throw new Error(`\\`document\\` was not provided in validation context.`)\n }\n if (!path) {\n throw new Error(`\\`path\\` was not provided in validation context.`)\n }\n\n const disableArrayWarning = schemaOptions?.disableArrayWarning || false\n const baseId = getBaseIdFromId(document._id)\n const docType = document._type\n const atPath = serializePath(path.concat('current'))\n\n if (!disableArrayWarning && atPath.includes('[]')) {\n const serializedPath = serializePath(path)\n console.warn(\n [\n `Slug field at path ${serializedPath} is within an array and cannot be automatically checked for uniqueness`,\n `If you need to check for uniqueness, provide your own \"isUnique\" method`,\n `To disable this message, set \\`disableArrayWarning: true\\` on the slug \\`options\\` field`,\n ].join('\\n')\n )\n }\n\n const constraints = [\n '_type == $docType',\n '!(_id in path(\"drafts.**\"))', // exclude drafts\n '_id != $baseId', // exclude own base document\n '!(_id in path(\"i18n.\" + $baseId + \".*\"))', // exclude any subpath translations\n `!(_id match $baseId + \"${I18nDelimiter}*\")`, // exclude any delimiter based translations\n `${atPath} == $slug`,\n ].join(' && ')\n\n return client.fetch<boolean>(\n `!defined(*[${constraints}][0]._id)`,\n {\n docType,\n baseId,\n slug,\n },\n {tag: 'validation.slug-is-unique'}\n )\n }\n}\n","import {getEmojiFlag} from '@cprecioso/country-flag-emoji'\nimport {SupportedEmojiFlagCodes} from '../constants'\n\n// Get flag from a valid country code\nexport const getFlag = (code = ``): string => {\n if (!code) {\n return ``\n }\n\n const flagCode = getFlagCode(code)\n\n if (!SupportedEmojiFlagCodes.includes(flagCode.toUpperCase())) {\n return ``\n }\n\n const emoji = getEmojiFlag(flagCode)\n\n return emoji\n}\n\n// Convert some language codes to country codes\nexport const getFlagCode = (code = ``): string => {\n if (!code) {\n return ``\n }\n\n switch (code.toLocaleLowerCase()) {\n // Return :flag-gb: for English\n case `en`:\n return `gb`\n // Return :flag-al: (Albania) for `sq` language code\n case `sq`:\n return `al`\n\n default:\n return code\n }\n}\n","import {createContext} from 'react'\nimport {Ti18nConfig} from '../../../types'\n\nexport const LanguageConfigContext = createContext<Ti18nConfig>({})\n","import React, {useContext, useMemo} from 'react'\nimport twemoji from 'twemoji'\nimport parse from 'html-react-parser'\nimport {Box} from '@sanity/ui'\nimport styled from 'styled-components'\nimport {getFlag} from '../../../utils/getFlag'\nimport {LanguageConfigContext} from '../LanguageSelect/LanguageConfigContext'\n\ntype Props = {\n code?: string\n langCulture?: string\n}\n\nconst EmojiBox = styled(Box)`\n min-width: 24px;\n transform: translateY(1px);\n`\n\nexport const SingleFlag: React.FunctionComponent<Props> = ({code, langCulture}) => {\n const flagEmoji = useMemo(() => code && getFlag(code), [code])\n const flagHtml = twemoji.parse(flagEmoji ?? `🇺🇳`, {folder: 'svg', ext: '.svg'})\n const flagReact = parse(flagHtml)\n\n const {customFlagComponents} = useContext(LanguageConfigContext)\n const CustomFlagComponent = useMemo(() => {\n if (langCulture && customFlagComponents) {\n const exportedName = langCulture.replace(/[^a-zA-Z0-9_]/g, '_')\n if (exportedName in customFlagComponents) {\n return customFlagComponents[exportedName]\n }\n }\n return null\n }, [langCulture, customFlagComponents])\n\n return (\n <Box aria-label={code}>\n {CustomFlagComponent && code ? (\n <CustomFlagComponent code={code} />\n ) : (\n <EmojiBox>{flagReact}</EmojiBox>\n )}\n </Box>\n )\n}\n","import {useEffect, useState, useRef} from 'react'\nimport {catchError, distinctUntilChanged} from 'rxjs/operators'\nimport isEqual from 'react-fast-compare'\nimport {useDocumentStore} from 'sanity'\n\ntype Params = Record<string, string | number | boolean | string[]>\n\ninterface ListenQueryOptions {\n tag?: string\n apiVersion?: string\n}\n\ntype ReturnShape = {\n loading: boolean\n error: boolean\n data: any\n}\n\ntype Observable = {\n unsubscribe: () => void\n}\n\nconst DEFAULT_PARAMS = {}\nconst DEFAULT_OPTIONS = {apiVersion: `v2022-05-09`}\n\nexport function useListeningQuery(\n query: string,\n params: Params = DEFAULT_PARAMS,\n options: ListenQueryOptions = DEFAULT_OPTIONS\n): ReturnShape {\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState(false)\n const [data, setData] = useState(null)\n const subscription = useRef<null | Observable>(null)\n\n const documentStore = useDocumentStore()\n\n useEffect(() => {\n if (query) {\n subscription.current = documentStore\n .listenQuery(query, params, options)\n .pipe(\n distinctUntilChanged(isEqual),\n catchError((err) => {\n console.error(err)\n setError(err)\n setLoading(false)\n setData(null)\n\n return err\n })\n )\n .subscribe((documents) => {\n setData((current) => (isEqual(current, documents) ? current : documents))\n setLoading(false)\n setError(false)\n })\n }\n\n return () => {\n return subscription.current ? subscription.current.unsubscribe() : undefined\n }\n }, [query, params, options])\n\n return {loading, error, data}\n}\n","import type {IExtendedLanguageObject} from '../types'\n\nexport const baseToTop = (a: IExtendedLanguageObject, b: IExtendedLanguageObject): number => {\n return Number(a.isBase ?? 0) - Number(b.isBase ?? 0)\n}\n","import React, {PropsWithChildren} from 'react'\nimport {Box, Text} from '@sanity/ui'\n\nexport function LanguageSelectLabel({children}: PropsWithChildren<Record<never, never>>) {\n return (\n <Box padding={2}>\n <Text muted size={1}>\n {children}\n </Text>\n </Box>\n )\n}\n","import React, {forwardRef} from 'react'\n\nexport const SplitPaneIcon = forwardRef(function UndoIcon(\n props: React.SVGProps<SVGSVGElement>,\n ref: React.Ref<SVGSVGElement>\n) {\n return (\n <svg\n data-sanity-icon=\"splitPane\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 25 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n ref={ref}\n {...props}\n >\n <path\n d=\"M10.5 5.5V19.5M13 12.5H15.5M18 12.5H15.5M15.5 12.5V15M15.5 12.5V10M4.5 5.5H20.5V19.5H4.5V5.5Z\"\n stroke=\"currentColor\"\n strokeWidth={1.2}\n />\n </svg>\n )\n})\n","import {createContext} from 'react'\nimport {ILanguageObject} from '../../../types'\n\ntype ContextValue = {\n currentDocumentId: string | null\n currentDocumentType: string | null\n baseLanguage: ILanguageObject | null\n currentLanguage: ILanguageObject | null\n}\n\nexport const LanguageSelectContext = createContext<ContextValue>({\n currentDocumentId: null,\n currentDocumentType: null,\n baseLanguage: null,\n currentLanguage: null,\n})\n","import React, {useContext} from 'react'\nimport omit from 'just-omit'\nimport {hues} from '@sanity/color'\nimport {Text, Button, Badge, Flex, useToast, MenuItem, Box} from '@sanity/ui'\nimport {AddIcon, SpinnerIcon} from '@sanity/icons'\nimport styled, {css, keyframes} from 'styled-components'\nimport {usePaneRouter} from 'sanity/desk'\nimport {useEditState} from 'sanity'\nimport {RouterContext} from 'sanity/router'\nimport {useConfig} from '../../../hooks'\nimport {SingleFlag} from '../SingleFlag'\nimport type {IExtendedLanguageObject} from '../../../types'\nimport {ReferenceBehavior, UiMessages} from '../../../constants'\nimport {buildDocId, getBaseIdFromId, useSanityClient} from '../../../utils'\nimport {SplitPaneIcon} from '../SplitPaneIcon'\nimport {LanguageSelectContext} from './LanguageSelectContext'\nimport {LanguageConfigContext} from './LanguageConfigContext'\n\ntype Props = {\n status: 'draft' | 'published' | 'missing'\n language: IExtendedLanguageObject\n}\n\nconst rotate = keyframes`\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n`\n\nconst ListItemSpinner = styled(SpinnerIcon)`\n animation: ${rotate} 500ms linear infinite;\n`\n\nconst ListItemSplitButton = styled(Button)`\n display: none;\n flex-shrink: 0;\n margin-left: 4px;\n\n & svg {\n display: block;\n color: ${hues.gray[700].hex};\n }\n\n ${({theme}) => css`\n @media (min-width: ${theme.sanity.media[1] / 16}em) {\n display: block;\n }\n `}\n`\n\nconst MenuItemButtonComponent: React.ForwardRefRenderFunction<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement>\n> = (props, ref) => <button type=\"button\" ref={ref} {...props} />\nconst MenuItemButton = React.forwardRef(MenuItemButtonComponent)\n\nconst MenuItemSelectedButton = styled.button`\n color: ${({theme}) => theme.sanity.color.button.default.primary.enabled.fg};\n background-color: ${({theme}) => theme.sanity.color.button.default.primary.enabled.bg};\n\n span {\n color: ${({theme}) => theme.sanity.color.button.default.primary.enabled.fg};\n }\n`\n\nexport const LanguageSelectListItem: React.FC<Props> = ({status, language}) => {\n const toast = useToast()\n const pluginConfig = useContext(LanguageConfigContext)\n const client = useSanityClient()\n const {currentDocumentId, currentDocumentType, baseLanguage} =\n React.useContext(LanguageSelectContext)\n\n if (!currentDocumentId || !currentDocumentType) {\n throw new Error('No document in view')\n }\n\n const config = useConfig(pluginConfig, currentDocumentType)\n const routerContext = React.useContext(RouterContext)\n const {routerPanesState, groupIndex, replaceCurrent} = usePaneRouter()\n const [pending, setPending] = React.useState(false)\n\n const baseId = React.useMemo(() => getBaseIdFromId(currentDocumentId), [currentDocumentId])\n const flagCode = React.useMemo(() => language.id.split(/[_-]/).pop(), [language.id])\n\n const translatedId = React.useMemo(\n () => (language.id === baseLanguage?.id ? baseId : buildDocId(config, baseId, language.id)),\n [config, baseId, language.id, baseLanguage]\n )\n const baseDocumentEditState = useEditState(baseId, currentDocumentType)\n const baseTranslationBadgeLabel = React.useMemo(() => {\n if (language.isBase) {\n if (language.title.length >= 20) {\n return UiMessages.base.split(' ')[0]\n }\n return UiMessages.base\n }\n return null\n }, [language])\n\n const openDocumentInCurrentPane = React.useCallback(\n (id: string, type: string) => {\n replaceCurrent({\n id,\n params: {type},\n })\n },\n [replaceCurrent]\n )\n\n const openDocumentInSidePane = React.useCallback(\n (id: string, type: string) => {\n if (!routerContext) {\n return\n }\n const panes = [...routerPanesState]\n panes.splice(groupIndex + 1, 0, [\n {\n id: id,\n params: {type},\n },\n ])\n\n const href = routerContext.resolvePathFromState({panes})\n routerContext.navigateUrl({path: href})\n },\n [routerContext, routerPanesState, groupIndex]\n )\n\n const handleCreateClick = React.useCallback(async () => {\n try {\n setPending(true)\n const baseDocument = baseDocumentEditState.draft || baseDocumentEditState.published\n const langFieldName = config.fieldNames.lang\n const referencesFieldName = config.fieldNames.references\n const baseFieldName = config.fieldNames.baseReference\n const referenceBehavior = config.referenceBehavior\n await client.createIfNotExists({\n _id: `drafts.${translatedId}`,\n _type: currentDocumentType,\n\n // Remove other language references from new draft\n ...(baseDocument ? omit(baseDocument, [`_id`, `_type`, referencesFieldName]) : {}),\n\n // Set new language\n [langFieldName]: language.id,\n\n // Set base language reference\n ...(baseDocument?._id && referenceBehavior !== ReferenceBehavior.DISABLED\n ? {\n [baseFieldName]: {\n _type: 'reference',\n _ref: baseDocument._id.replace(`drafts.`, ``),\n _weak: true,\n _strengthenOnPublish: {\n type: currentDocumentType,\n weak: referenceBehavior === 'weak',\n template: {\n id: currentDocumentType,\n params: undefined,\n },\n },\n },\n }\n : {}),\n })\n toast.push({\n closable: true,\n status: 'success',\n title: UiMessages.translationCreatedToast.title(language.title),\n description: baseLanguage\n ? UiMessages.translationCreatedToast.description(baseLanguage.title)\n : undefined,\n })\n openDocumentInCurrentPane(translatedId, currentDocumentType)\n } catch (err) {\n toast.push({\n closable: true,\n status: 'error',\n title: (err as Error).toString(),\n })\n } finally {\n setPending(false)\n }\n }, [\n config,\n baseDocumentEditState,\n translatedId,\n currentDocumentType,\n language.id,\n language.title,\n toast,\n baseLanguage,\n openDocumentInCurrentPane,\n client,\n ])\n\n const handleOpenClick = React.useCallback(() => {\n openDocumentInCurrentPane(translatedId, currentDocumentType)\n }, [openDocumentInCurrentPane, translatedId, currentDocumentType])\n\n const handleOpenInSidePaneClick = React.useCallback(() => {\n openDocumentInSidePane(translatedId, currentDocumentType)\n }, [openDocumentInSidePane, translatedId, currentDocumentType])\n\n if (status === 'missing') {\n return (\n <MenuItem\n as={MenuItemButton}\n data-as=\"button\"\n disabled={pending}\n icon={pending ? ListItemSpinner : AddIcon}\n text={language.title}\n onClick={handleCreateClick}\n />\n )\n }\n\n return (\n <Flex>\n <MenuItem\n as={language.isCurrentLanguage ? MenuItemSelectedButton : MenuItemButton}\n data-as=\"button\"\n data-selected={language.isCurrentLanguage}\n selected={language.isCurrentLanguage}\n onClick={handleOpenClick}\n paddingY={1}\n paddingX={2}\n >\n <Flex align=\"center\" gap={2}>\n <SingleFlag code={flagCode} langCulture={language.id} />\n <Box flex={1}>\n <Text>{language.title}</Text>\n </Box>\n {baseTranslationBadgeLabel ? (\n <Badge fontSize={0}>{baseTranslationBadgeLabel}</Badge>\n ) : null}\n </Flex>\n </MenuItem>\n {!language.isCurrentLanguage && (\n <ListItemSplitButton\n type=\"button\"\n tone=\"default\"\n mode=\"bleed\"\n padding={2}\n onClick={handleOpenInSidePaneClick}\n >\n <SplitPaneIcon width={19} height={19} />\n </ListItemSplitButton>\n )}\n </Flex>\n )\n}\n","import React from 'react'\nimport styled from 'styled-components'\nimport {Box, Grid} from '@sanity/ui'\nimport {IExtendedLanguageObject} from '../../../types'\nimport {UiMessages} from '../../../constants'\nimport {baseToTop} from '../../../utils/baseToTop'\nimport {LanguageSelectLabel} from './LanguageSelectLabel'\nimport {LanguageSelectListItem} from './LanguageSelectListItem'\n\ntype Props = {\n draftLanguageObjects: IExtendedLanguageObject[]\n publishedLanguageObjects: IExtendedLanguageObject[]\n missingLanguageObjects: IExtendedLanguageObject[]\n}\n\nconst Divider = styled(Box)`\n border-bottom: 1px solid var(--card-shadow-outline-color);\n`\n\nconst SelectorBox = styled(Box)`\n minwidth: 250;\n`\n\nexport const LanguageSelectList: React.FC<Props> = ({\n draftLanguageObjects,\n publishedLanguageObjects,\n missingLanguageObjects,\n}) => {\n const showDivider = React.useMemo(\n () =>\n Boolean(\n !!(draftLanguageObjects.length || publishedLanguageObjects.length) &&\n missingLanguageObjects.length\n ),\n [draftLanguageObjects, publishedLanguageObjects, missingLanguageObjects]\n )\n\n const existingLanguageObjects = React.useMemo(() => {\n return [\n ...draftLanguageObjects.map((lang) => ({\n ...lang,\n status: 'draft' as const,\n })),\n ...publishedLanguageObjects.map((lang) => ({\n ...lang,\n status: 'published' as const,\n })),\n ]\n .sort(baseToTop)\n .reverse()\n }, [draftLanguageObjects, publishedLanguageObjects])\n\n return (\n <SelectorBox>\n {!!existingLanguageObjects.length && (\n <Box>\n <LanguageSelectLabel>{UiMessages.languageSelect.listLabels.existing}</LanguageSelectLabel>\n <Grid columns={1} gap={1}>\n {existingLanguageObjects.map((language) => (\n <LanguageSelectListItem\n key={language.id}\n status={language.status}\n language={language}\n />\n ))}\n </Grid>\n </Box>\n )}\n\n {showDivider && <Divider marginY={1} />}\n\n {!!missingLanguageObjects.length && (\n <Box>\n <LanguageSelectLabel>{UiMessages.languageSelect.listLabels.missing}</LanguageSelectLabel>\n <Grid columns={1} gap={1}>\n {missingLanguageObjects.map((language) => (\n <LanguageSelectListItem key={language.id} status=\"missing\" language={language} />\n ))}\n </Grid>\n </Box>\n )}\n </SelectorBox>\n )\n}\n","import React, {useContext} from 'react'\nimport get from 'just-safe-get'\nimport {Box, Button, Flex, Menu, MenuButton, PopoverProps, Text} from '@sanity/ui'\nimport type {SchemaType, SanityDocument} from 'sanity'\nimport {ChevronDownIcon} from '@sanity/icons'\nimport {useConfig} from '../../../hooks'\nimport {SingleFlag} from '../SingleFlag'\nimport {buildDocId, getBaseIdFromId, getBaseLanguage, getLanguageFromDocument} from '../../../utils'\nimport {useLanguages} from '../../hooks'\nimport {UiMessages} from '../../../constants'\nimport {IExtendedLanguageObject} from '../../../types'\nimport {useListeningQuery} from '../../hooks/useListeningQuery'\nimport {LanguageSelectList} from './LanguageSelectList'\nimport {LanguageSelectContext} from './LanguageSelectContext'\nimport {LanguageConfigContext} from './LanguageConfigContext'\n\ntype Props = {\n schemaType: SchemaType\n document: SanityDocument\n}\n\nconst POPOVER_PROPS: PopoverProps = {\n constrainSize: true,\n placement: 'bottom',\n portal: true,\n}\n\nexport const LanguageSelect: React.FC<Props> = ({schemaType, document}) => {\n const pluginConfig = useContext(LanguageConfigContext)\n const config = useConfig(pluginConfig, schemaType.name)\n const [pending, languages] = useLanguages(config, document)\n\n const baseLanguage = React.useMemo(\n () => getBaseLanguage(languages, config.base),\n [languages, config.base]\n )\n\n const currentLanguageCode = React.useMemo(\n () => getLanguageFromDocument(document, config) || (baseLanguage ? baseLanguage.id : null),\n [document, baseLanguage, config]\n )\n const currentLanguageObject = React.useMemo(\n () => languages.find((lang) => lang.id === currentLanguageCode),\n [languages, currentLanguageCode]\n )\n const currentLanguageFlagCode = React.useMemo(\n () => currentLanguageCode?.split(/[-_]/).pop(),\n [currentLanguageCode]\n )\n\n // Find and listen to changes on all potential language versions of documents\n const query = `*[_type == $type && _id in $ids]{\n _id,\n \"${config.fieldNames.lang}\": ${config.fieldNames.lang}\n }`\n const queryParams = React.useMemo(() => {\n const baseId = getBaseIdFromId(document._id)\n const publishedIds = languages.map((lang) =>\n lang === baseLanguage ? baseId : buildDocId(config, baseId, lang.id)\n )\n const draftIds = publishedIds.map((id) => `drafts.${id}`)\n\n return {\n ids: [...publishedIds, ...draftIds],\n type: document._type,\n }\n }, [config, baseLanguage, languages, document._id, document._type])\n\n const {loading, data} = useListeningQuery(query, queryParams)\n\n // Create a list of objects with current status\n const languagesObjects = React.useMemo(() => {\n const draftLanguageObjects: IExtendedLanguageObject[] = []\n const publishedLanguageObjects: IExtendedLanguageObject[] = []\n const missingLanguageObjects: IExtendedLanguageObject[] = []\n\n if (!data?.length) {\n return {\n draftLanguageObjects,\n publishedLanguageObjects,\n missingLanguageObjects,\n }\n }\n\n // Prefer drafts if they exist\n const filteredDocuments: SanityDocument[] = data.reduce(\n (acc: SanityDocument[], cur: SanityDocument) => {\n if (!cur._id.startsWith(`drafts.`)) {\n const alsoHasDraft = data.some((doc: SanityDocument) => doc._id === `drafts.${cur._id}`)\n\n return alsoHasDraft ? acc : [...acc, cur]\n }\n\n return [...acc, cur]\n },\n []\n )\n\n const editStatePerLanguage = new Map()\n filteredDocuments.forEach((doc) => {\n const lang = get(doc ?? {}, config.fieldNames.lang) as string | undefined\n const isBase = doc && doc._id.replace(/^drafts\\./, '') === getBaseIdFromId(doc._id)\n if (lang) {\n editStatePerLanguage.set(lang, doc)\n } else if (isBase && baseLanguage?.id) {\n editStatePerLanguage.set(baseLanguage.id, doc)\n }\n })\n\n languages.forEach((lang, index) => {\n const extendedObject = {\n ...lang,\n isBase: baseLanguage ? lang.id === baseLanguage.id : index === 0,\n isCurrentLanguage: lang.id === currentLanguageCode,\n }\n const doc = editStatePerLanguage.get(lang.id)\n if (doc?._id && !doc._id.startsWith(`drafts.`)) {\n publishedLanguageObjects.push(extendedObject)\n } else if (doc?._id && doc._id.startsWith(`drafts.`)) {\n draftLanguageObjects.push(extendedObject)\n } else {\n missingLanguageObjects.push(extendedObject)\n }\n })\n\n return {\n draftLanguageObjects,\n publishedLanguageObjects,\n missingLanguageObjects,\n }\n }, [config, languages, baseLanguage, data, currentLanguageCode])\n\n if (\n !currentLanguageObject ||\n !currentLanguageCode ||\n pending ||\n loading ||\n languages.length === 0\n ) {\n return (\n <Button\n disabled\n mode=\"bleed\"\n padding={3}\n loading={pending || loading}\n iconRight={ChevronDownIcon}\n text={UiMessages.languageSelect.placeholder}\n />\n )\n }\n\n return (\n <LanguageSelectContext.Provider\n value={{\n baseLanguage,\n currentLanguage: currentLanguageObject,\n currentDocumentType: document._type,\n currentDocumentId: document._id,\n }}\n >\n <MenuButton\n id=\"document-internationalization/language-select\"\n popover={POPOVER_PROPS}\n button={\n <Button\n paddingY={1}\n paddingX={2}\n mode=\"bleed\"\n title={currentLanguageObject.title ?? currentLanguageObject.id}\n >\n <Flex align=\"center\" gap={2}>\n <SingleFlag code={currentLanguageFlagCode} langCulture={currentLanguageCode} />\n <Box flex={1}>\n <Text>{currentLanguageObject.title ?? currentLanguageObject.id}</Text>\n </Box>\n <ChevronDownIcon width={19} height={19} />\n </Flex>\n </Button>\n }\n menu={\n <Menu>\n <LanguageSelectList {...languagesObjects} />\n </Menu>\n }\n />\n </LanguageSelectContext.Provider>\n )\n}\n","import {SanityDocument} from '@sanity/client'\nimport {useCallback, useEffect, useState} from 'react'\nimport {useEditState} from 'sanity'\nimport {ILanguageObject} from '../../types'\nimport {getLanguagesFromOption, useSanityClient, ApplyConfigResult} from '../../utils'\n\nexport function useLanguages(\n config: ApplyConfigResult,\n document: SanityDocument\n): [boolean, ILanguageObject[]] {\n const client = useSanityClient()\n const {draft, published} = useEditState(document._id.replace(/^drafts\\./, ''), document._type)\n const [pending, setPending] = useState(false)\n const [languages, setLanguages] = useState<ILanguageObject[]>([])\n\n const loadOrReloadLanguages = useCallback(async () => {\n const shouldReload =\n languages.length === 0 || (config.shouldReload && config.shouldReload(draft ?? published))\n if (shouldReload) {\n setPending(true)\n const languageObjects = await getLanguagesFromOption(\n client,\n config,\n config.languages,\n draft ?? published\n )\n setLanguages(languageObjects)\n setPending(false)\n }\n }, [client, config, draft, published, languages])\n\n useEffect(() => {\n loadOrReloadLanguages()\n }, [draft, published, languages, config, loadOrReloadLanguages])\n\n return [pending, languages]\n}\n","import React from 'react'\nimport {InputProps, SanityDocument} from 'sanity'\nimport {Flex} from '@sanity/ui'\nimport {Ti18nConfig} from '../../../types'\nimport {LanguageSelect} from './LanguageSelect'\nimport {LanguageConfigContext} from './LanguageConfigContext'\n\nexport type LanguageSelectProps = InputProps & {\n config: Ti18nConfig\n}\n\nexport function LanguageSelectWrapped(props: LanguageSelectProps) {\n const {config, ...inputProps} = props\n const doc = props.value as SanityDocument\n return (\n <LanguageConfigContext.Provider value={config}>\n {doc._id && (\n <Flex flex={1} justify=\"flex-end\">\n <LanguageSelect schemaType={props.schemaType} document={doc} />\n </Flex>\n )}\n {props.renderDefault(inputProps)}\n </LanguageConfigContext.Provider>\n )\n}\n","import React from 'react'\nimport {definePlugin} from 'sanity'\nimport {resolveActions} from './actions'\nimport {createLanguageBadge} from './badges/LanguageBadge'\nimport {LanguageSelectWrapped} from './language-select/components'\nimport {Ti18nConfig, Ti18nSchema} from './types'\n\nexport const documentI18n = definePlugin<Ti18nConfig>((config) => {\n return {\n name: 'document-i18n',\n\n document: {\n actions: (prev, context) => resolveActions(prev, context, config),\n badges: (prev) => [...prev, createLanguageBadge(config)],\n },\n\n form: {\n components: {\n input(props) {\n const {value} = props\n if (\n (props.schemaType as Ti18nSchema).i18n &&\n typeof value === 'object' &&\n (value as Record<string, unknown>)?._id\n ) {\n return <LanguageSelectWrapped config={config} {...props} />\n }\n return props.renderDefault(props)\n },\n },\n },\n }\n})\n","import {DocumentBadgeComponent} from 'sanity'\nimport {useConfig} from '../hooks'\nimport {getLanguageFromDocument} from '../utils'\nimport {Ti18nConfig} from '../types'\n\nexport function createLanguageBadge(pluginConfig: Ti18nConfig): DocumentBadgeComponent {\n const LanguageBadge: DocumentBadgeComponent = (props) => {\n const config = useConfig(pluginConfig, props.type)\n const doc = props.draft || props.published\n const lang = doc ? getLanguageFromDocument(doc, config) : null\n if (lang) {\n return {\n label: lang,\n color: 'success',\n }\n }\n\n return null\n }\n\n return LanguageBadge\n}\n","import compact from 'lodash/compact'\nimport type {PluginOptions} from 'sanity'\nimport {deskTool} from 'sanity/desk'\nimport type {Ti18nConfig} from './types'\nimport {documentI18n} from './documentI18n'\nimport {getDocumentList} from './structure'\n\nexport function withDocumentI18nPlugin(\n plugins: PluginOptions[] | ((config: Ti18nConfig) => PluginOptions[]),\n config: Ti18nConfig & {\n includeDeskTool?: boolean\n }\n): PluginOptions[] {\n const i18nplugin = documentI18n(config)\n return compact([\n ...(Array.isArray(plugins) ? plugins : plugins(config)),\n config.includeDeskTool ?? true\n ? deskTool({\n structure: (S, {schema}) => getDocumentList({S, schema, config}),\n })\n : null,\n i18nplugin,\n ])\n}\n"],"names":["SupportedEmojiFlagCodes","LanguageCultures","value","title","I18nPrefix","I18nDelimiter","ReferenceBehavior","IdStructure","UiMessages","publishing","publish","updatingIntlFields","intlFieldsUpdated","baseDocumentCopied","translationCreatedToast","name","description","concat","loading","draft","missingTranslations","base","missing","deleteAll","buttonTitle","deleting","duplicateAll","duplicating","translationsMaintenance","selectSchemaPlaceholder","idStructureMismatch","missingLanguageField","missingDocumentRefs","missingBaseDocumentRefs","orphanDocuments","referenceBehaviorMismatch","baseLanguageMismatch","fix","pendingTransactionDialog","header","caution","cancel","confirm","errors","baseDocumentNotPublished","languageSelect","placeholder","listLabels","existing","buildDocId","pluginConfig","id","lang","idStructure","DELIMITER","getBaseLanguage","langs","find","l","length","useSanityClient","useClient","apiVersion","getLanguagesFromOption","async","client","config","document","languages","map","langCult","x","console","warn","normalizeLanguageList","Array","isArray","r","fetch","query","get","languagesLoader","getBaseIdFromId","nonDraftId","replace","rx","RegExp","match","split","getTranslationsFor","baseDocumentId","includeDrafts","segments","documents","filter","d","_id","startsWith","path","draftPath","createSanityReference","weak","_objectSpread","_type","_ref","_weak","getLanguageFromDocument","doc","fieldNames","serializePath","reduce","target","part","i","isIndex","isKey","isKeyedObject","add","separator","applyConfig","baseConfig","incomingConfig","_a","_b","_c","_d","_e","_f","referenceBehavior","STRONG","withTranslationsMaintenance","shouldReload","fallbackLanguageSelect","customFlagComponents","references","baseReference","useConfig","type","schemaRegistry","useSchema","schemaI18nConfig","useMemo","schemaType","i18n","createPublishAction","onComplete","toast","useToast","updatingIntlFieldsPromiseRef","React","useRef","publishState","setPublishState","useState","setUpdatingIntlFields","published","useEditState","baseDocumentEditState","useDocumentOperation","isValidating","validation","useValidationStatus","syncState","useSyncState","baseDocumentSyncState","disabled","timeout","delayedOn","delayedOff","flag","setFlag","useEffect","timeoutId","setTimeout","clearTimeout","useDelayedFlag","isSyncing","some","marker","level","label","doUpdateIntlFields","useCallback","baseDocument","isTranslation","fieldName","refsFieldName","baseRefFieldName","languageId","currentDocumentTransaction","transaction","createIfNotExists","patch","set","DISABLED","WEAK","commit","translatedDocuments","baseDocumentTransaction","translatedRefs","compact","_key","updateIntlFieldsForDocument","push","closable","status","err","error","toString","onHandle","Error","execute","didPublish","nextState","timer","current","then","finally","icon","CheckmarkIcon","PublishIcon","shortcut","DISABLED_REASON_TITLE","NOTHING_TO_DELETE","createDeleteAction","_ref2","delete","deleteOp","isDeleting","setIsDeleting","isConfirmDialogOpen","setConfirmDialogOpen","onDialogCancel","onDialogConfirm","baseTransaction","unset","translationsTransaction","forEach","tone","TrashIcon","Boolean","dialog","onClose","content","jsx","ConfirmDeleteDialog","action","onCancel","onConfirm","NOTHING_TO_DUPLICATE","createDuplicateAction","_ref3","duplicate","duplicateOp","isDuplicating","setDuplicating","onDuplicate","dupeId","uuid","translations","create","t","isDraft","newId","message","CopyIcon","resolveActions","prev","_ref4","schema","documentId","isI18n","isBase","actions","Action","isPublishAction","isDeleteAction","MaintenanceTabTypeSelector","forwardRef","ref","onChange","onOpen","_ref5","i18nSchemas","_original","types","s","jsxs","Stack","space","children","Text","Card","Autocomplete","fontSize","EarthGlobeIcon","options","option","payload","openButton","onClick","renderValue","v","renderOption","_ref6","padding","radius","as","Preview","layout","media","MaintenanceTabResult","_ref7","pending","count","labelName","shadow","Flex","align","Box","flex","muted","String","Button","text","fixLanguageFields","sanityClient","langFieldName","schemaObject","language","getLanguageFromId","fixTranslationRefs","baseDocuments","chunk","documentsChunk","relevantTranslations","dx","fixOrphanedDocuments","basedocuments","fixBaseLanguageMismatch","baseLanguage","fixBaseDocumentRefs","baseId","StyledCodeCard","styled","_templateObject","_taggedTemplateLiteral","StyledCode","Code","_templateObject2","StyledDownloadCodeFlex","_templateObject3","MaintenanceTabContent","selectedSchema","setSelectedSchema","setPending","documentsSummaryInformation","fetchInformation","setDocuments","setLanguages","includes","idStructureMismatchDocuments","result","Promise","all","translateddocuments","docs","Object","values","refs","keys","useDocumentsInformation","pendingTransactions","setPendingTransactions","onSchemaTypeChange","schemaName","handleOpen","handleFixIdStructureMismatchDocuments","existingBaseDocumentIds","Set","removeOldRefsTransaction","newDocumentTransactions","setIfMissing","insert","after","items","fixIdStructureMismatchDocuments","handleFixMissingLanguageFields","handleFixTranslationRefs","handleFixBaseDocumntRefs","handleFixOrphanDocuments","handleFixReferenceBehaviorMismatch","handleFixBaseLanguageMismatch","handleDownloadCode","json","JSON","stringify","toJSON","blob","Blob","url","URL","createObjectURL","a","createElement","href","download","style","display","body","appendChild","click","revokeObjectURL","handleCancelPendingTransaction","handleConfirmPendingTransaction","resolve","Container","width","paddingX","Dialog","footer","justify","Grid","autoFlow","autoCols","gap","size","cols","getDefaultDocumentNode","S","getDocumentTypes","props","listItemsWithouti18n","listItemsWithi18n","documentTypeListItems","getSchemaType","hasi18n","withoutI18n","withI18n","getMaintenanceTabComponent","MaintenanceTab","p","createMaintenanceTabComponent","component","getMaintenanceListItem","listItem","child","getFilteredDocumentTypeListItems","filterFns","SUBPATH","list","params","drafts","getId","schemaTypeName","documentList","getTitle","menuItems","orderingMenuItemsForType","splice","item","serialize","getDocumentList","defaults","showIcons","hasIcon","createIsSlugUnique","slug","context","schemaOptions","disableArrayWarning","docType","atPath","serializedPath","join","constraints","tag","getFlagCode","code","arguments","undefined","toLocaleLowerCase","LanguageConfigContext","createContext","EmojiBox","_templateObject4","SingleFlag","_ref9","langCulture","flagEmoji","flagCode","toUpperCase","getEmojiFlag","getFlag","flagHtml","twemoji","parse","folder","ext","flagReact","useContext","CustomFlagComponent","exportedName","DEFAULT_PARAMS","DEFAULT_OPTIONS","baseToTop","b","Number","LanguageSelectLabel","_ref10","SplitPaneIcon","height","viewBox","fill","xmlns","stroke","strokeWidth","LanguageSelectContext","currentDocumentId","currentDocumentType","currentLanguage","rotate","keyframes","_templateObject5","ListItemSpinner","SpinnerIcon","_templateObject6","ListItemSplitButton","_templateObject7","hues","gray","hex","_ref11","theme","css","sanity","MenuItemButton","MenuItemSelectedButton","button","_templateObject9","_ref12","color","default","primary","enabled","fg","_ref13","bg","_ref14","LanguageSelectListItem","_ref15","routerContext","RouterContext","routerPanesState","groupIndex","replaceCurrent","usePaneRouter","pop","translatedId","baseTranslationBadgeLabel","openDocumentInCurrentPane","openDocumentInSidePane","panes","resolvePathFromState","navigateUrl","handleCreateClick","referencesFieldName","baseFieldName","omit","_strengthenOnPublish","template","handleOpenClick","handleOpenInSidePaneClick","MenuItem","AddIcon","isCurrentLanguage","selected","paddingY","Badge","mode","Divider","_templateObject10","SelectorBox","_templateObject11","LanguageSelectList","_ref16","draftLanguageObjects","publishedLanguageObjects","missingLanguageObjects","showDivider","existingLanguageObjects","sort","reverse","columns","marginY","POPOVER_PROPS","constrainSize","placement","portal","LanguageSelect","_ref17","loadOrReloadLanguages","languageObjects","useLanguages","currentLanguageCode","currentLanguageObject","currentLanguageFlagCode","queryParams","publishedIds","draftIds","ids","data","setLoading","setError","setData","subscription","documentStore","useDocumentStore","listenQuery","pipe","distinctUntilChanged","isEqual","catchError","subscribe","unsubscribe","useListeningQuery","languagesObjects","filteredDocuments","acc","cur","editStatePerLanguage","Map","index","extendedObject","iconRight","ChevronDownIcon","Provider","MenuButton","popover","menu","Menu","LanguageSelectWrapped","inputProps","_excluded","renderDefault","documentI18n","definePlugin","badges","form","components","input","withDocumentI18nPlugin","plugins","i18nplugin","includeDeskTool","deskTool","structure","_ref18"],"mappings":"+nFAAO,MAAMA,GAA0B,CACrC,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MCzPWC,GAAmB,CAC9B,CACEC,MAAO,KACPC,MAAO,aAET,CACED,MAAO,QACPC,MAAO,4BAET,CACED,MAAO,KACPC,MAAO,UAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,kBAET,CACED,MAAO,QACPC,MAAO,iBAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,kBAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,iBAET,CACED,MAAO,QACPC,MAAO,kBAET,CACED,MAAO,QACPC,MAAO,yBAET,CACED,MAAO,QACPC,MAAO,kBAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,kBAET,CACED,MAAO,KACPC,MAAO,SAET,CACED,MAAO,aACPC,MAAO,gCAET,CACED,MAAO,aACPC,MAAO,6BAET,CACED,MAAO,KACPC,MAAO,cAET,CACED,MAAO,QACPC,MAAO,wBAET,CACED,MAAO,KACPC,MAAO,aAET,CACED,MAAO,QACPC,MAAO,wBAET,CACED,MAAO,aACPC,MAAO,oCAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,QACPC,MAAO,qBAET,CACED,MAAO,KACPC,MAAO,SAET,CACED,MAAO,QACPC,MAAO,0BAET,CACED,MAAO,QACPC,MAAO,0BAET,CACED,MAAO,KACPC,MAAO,UAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,KACPC,MAAO,UAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,wBAET,CACED,MAAO,QACPC,MAAO,0BAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,KACPC,MAAO,UAET,CACED,MAAO,QACPC,MAAO,qBAET,CACED,MAAO,KACPC,MAAO,SAET,CACED,MAAO,QACPC,MAAO,kBAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,SACPC,MAAO,uBAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,4BAET,CACED,MAAO,QACPC,MAAO,qBAET,CACED,MAAO,QACPC,MAAO,qBAET,CACED,MAAO,QACPC,MAAO,yBAET,CACED,MAAO,QACPC,MAAO,yCAET,CACED,MAAO,QACPC,MAAO,iCAET,CACED,MAAO,QACPC,MAAO,2BAET,CACED,MAAO,QACPC,MAAO,0BAET,CACED,MAAO,QACPC,MAAO,sBAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,QACPC,MAAO,qBAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,QACPC,MAAO,sBAET,CACED,MAAO,QACPC,MAAO,wBAET,CACED,MAAO,QACPC,MAAO,gCAET,CACED,MAAO,QACPC,MAAO,qBAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,QACPC,MAAO,sBAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,kBAET,CACED,MAAO,QACPC,MAAO,yBAET,CACED,MAAO,QACPC,MAAO,sBAET,CACED,MAAO,QACPC,MAAO,yBAET,CACED,MAAO,QACPC,MAAO,qBAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,KACPC,MAAO,YAET,CACED,MAAO,QACPC,MAAO,sBAET,CACED,MAAO,KACPC,MAAO,UAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,QACPC,MAAO,kBAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,QACPC,MAAO,qBAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,QACPC,MAAO,2BAET,CACED,MAAO,KACPC,MAAO,UAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,QACPC,MAAO,wBAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,QACPC,MAAO,mCAET,CACED,MAAO,KACPC,MAAO,YAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,KACPC,MAAO,YAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,KACPC,MAAO,UAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,KACPC,MAAO,SAET,CACED,MAAO,QACPC,MAAO,iBAET,CACED,MAAO,KACPC,MAAO,YAET,CACED,MAAO,QACPC,MAAO,qCAET,CACED,MAAO,QACPC,MAAO,sBAET,CACED,MAAO,KACPC,MAAO,aAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,KACPC,MAAO,YAET,CACED,MAAO,QACPC,MAAO,sBAET,CACED,MAAO,KACPC,MAAO,cAET,CACED,MAAO,QACPC,MAAO,0BAET,CACED,MAAO,KACPC,MAAO,aAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,QACPC,MAAO,yBAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,KACPC,MAAO,YAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,KACPC,MAAO,YAET,CACED,MAAO,QACPC,MAAO,sBAET,CACED,MAAO,KACPC,MAAO,UAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,KACPC,MAAO,UAET,CACED,MAAO,MACPC,MAAO,WAET,CACED,MAAO,SACPC,MAAO,mBAET,CACED,MAAO,QACPC,MAAO,kBAET,CACED,MAAO,KACPC,MAAO,UAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,KACPC,MAAO,cAET,CACED,MAAO,QACPC,MAAO,0BAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,KACPC,MAAO,cAET,CACED,MAAO,QACPC,MAAO,sDAET,CACED,MAAO,KACPC,MAAO,aAET,CACED,MAAO,QACPC,MAAO,kCAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,KACPC,MAAO,SAET,CACED,MAAO,QACPC,MAAO,6BAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,QACPC,MAAO,8BAET,CACED,MAAO,KACPC,MAAO,SAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,QACPC,MAAO,+BAET,CACED,MAAO,KACPC,MAAO,aAET,CACED,MAAO,QACPC,MAAO,iCAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,KACPC,MAAO,UAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,KACPC,MAAO,cAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,QACPC,MAAO,yBAET,CACED,MAAO,SACPC,MAAO,qBAET,CACED,MAAO,SACPC,MAAO,qBAET,CACED,MAAO,SACPC,MAAO,kBAET,CACED,MAAO,KACPC,MAAO,YAET,CACED,MAAO,QACPC,MAAO,sBAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,KACPC,MAAO,YAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,6BAET,CACED,MAAO,QACPC,MAAO,4BAET,CACED,MAAO,QACPC,MAAO,4BAET,CACED,MAAO,KACPC,MAAO,UAET,CACED,MAAO,QACPC,MAAO,qBAET,CACED,MAAO,KACPC,MAAO,aAET,CACED,MAAO,QACPC,MAAO,wBAET,CACED,MAAO,SACPC,MAAO,4BAET,CACED,MAAO,SACPC,MAAO,4BAET,CACED,MAAO,SACPC,MAAO,wBAET,CACED,MAAO,SACPC,MAAO,wBAET,CACED,MAAO,SACPC,MAAO,0BAET,CACED,MAAO,SACPC,MAAO,0BAET,CACED,MAAO,KACPC,MAAO,YAET,CACED,MAAO,QACPC,MAAO,sBAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,aACPC,MAAO,+CAET,CACED,MAAO,aACPC,MAAO,8BAET,CACED,MAAO,aACPC,MAAO,4CAET,CACED,MAAO,aACPC,MAAO,2BAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,QACPC,MAAO,qBAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,KACPC,MAAO,aAET,CACED,MAAO,QACPC,MAAO,qBAET,CACED,MAAO,MACPC,MAAO,UAET,CACED,MAAO,SACPC,MAAO,kBAET,CACED,MAAO,KACPC,MAAO,SAET,CACED,MAAO,QACPC,MAAO,iBAET,CACED,MAAO,KACPC,MAAO,UAET,CACED,MAAO,QACPC,MAAO,kBAET,CACED,MAAO,KACPC,MAAO,QAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,QACPC,MAAO,yBAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,KACPC,MAAO,SAET,CACED,MAAO,QACPC,MAAO,kBAET,CACED,MAAO,KACPC,MAAO,aAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,KACPC,MAAO,QAET,CACED,MAAO,QACPC,MAAO,uCAET,CACED,MAAO,KACPC,MAAO,SAET,CACED,MAAO,aACPC,MAAO,gCAET,CACED,MAAO,aACPC,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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/constants/SupportedEmojiFlagCodes.ts","../src/constants/LanguageCultures.ts","../src/constants/I18nPrefix.ts","../src/constants/I18nDelimiter.ts","../src/constants/ReferenceBehavior.ts","../src/constants/IdStructure.ts","../src/constants/UiMessages.ts","../src/utils/buildDocId.ts","../src/utils/getBaseLanguage.ts","../src/utils/useSanityClient.ts","../src/utils/getLanguagesFromOption.ts","../src/utils/normalizeLanguageList.ts","../src/utils/getBaseIdFromId.ts","../src/utils/getTranslationsForId.ts","../src/utils/createSanityReference.ts","../src/utils/getLanguageFromDocument.ts","../src/utils/updateIntlFieldsForDocument.ts","../src/utils/serializePath.ts","../src/utils/applyConfig.ts","../src/hooks/useDelayedFlag.ts","../src/hooks/useConfig.ts","../src/actions/PublishWithi18nAction.ts","../src/actions/DeleteWithi18nAction.tsx","../src/actions/DuplicateWithi18nAction.tsx","../src/actions/index.ts","../src/structure/components/MaintenanceTabTypeSelector/MaintenanceTabTypeSelector.tsx","../src/structure/components/MaintenanceTabResult/MaintenanceTabResult.tsx","../src/structure/utils/fixLanguageFields.ts","../src/utils/getLanguageFromId.ts","../src/structure/utils/fixTranslationRefs.ts","../src/structure/utils/fixOrphanedDocuments.ts","../src/structure/utils/fixBaseLanguageMismatch.ts","../src/structure/utils/fixBaseDocumentRefs.ts","../src/structure/components/MaintenanceTab/MaintenanceTabContent.tsx","../src/structure/hooks/useDocumentsInformation.ts","../src/structure/utils/fixIdStructureMismatchDocuments.ts","../src/structure/index.tsx","../src/structure/components/MaintenanceTab/MaintenanceTab.tsx","../src/validators/isSlugUnique.ts","../src/utils/getFlag.ts","../src/language-select/components/LanguageSelect/LanguageConfigContext.tsx","../src/language-select/components/SingleFlag/SingleFlag.tsx","../src/language-select/hooks/useListeningQuery.ts","../src/utils/baseToTop.ts","../src/language-select/components/LanguageSelect/LanguageSelectLabel.tsx","../src/language-select/components/SplitPaneIcon/SplitPaneIcon.tsx","../src/language-select/components/LanguageSelect/LanguageSelectContext.ts","../src/language-select/components/LanguageSelect/LanguageSelectListItem.tsx","../src/language-select/components/LanguageSelect/LanguageSelectList.tsx","../src/language-select/components/LanguageSelect/LanguageSelect.tsx","../src/language-select/hooks/useLanguages.ts","../src/language-select/components/LanguageSelect/index.tsx","../src/documentI18n.tsx","../src/badges/LanguageBadge.tsx","../src/withDocumentI18nPlugin.ts"],"sourcesContent":["export const SupportedEmojiFlagCodes = [\n 'AD',\n 'AE',\n 'AF',\n 'AG',\n 'AI',\n 'AL',\n 'AM',\n 'AO',\n 'AQ',\n 'AR',\n 'AS',\n 'AT',\n 'AU',\n 'AW',\n 'AX',\n 'AZ',\n 'BA',\n 'BB',\n 'BD',\n 'BE',\n 'BF',\n 'BG',\n 'BH',\n 'BI',\n 'BJ',\n 'BL',\n 'BM',\n 'BN',\n 'BO',\n 'BQ',\n 'BR',\n 'BS',\n 'BT',\n 'BV',\n 'BW',\n 'BY',\n 'BZ',\n 'CA',\n 'CC',\n 'CD',\n 'CF',\n 'CG',\n 'CH',\n 'CI',\n 'CK',\n 'CL',\n 'CM',\n 'CN',\n 'CO',\n 'CR',\n 'CU',\n 'CV',\n 'CW',\n 'CX',\n 'CY',\n 'CZ',\n 'DE',\n 'DJ',\n 'DK',\n 'DM',\n 'DO',\n 'DZ',\n 'EC',\n 'EE',\n 'EG',\n 'EH',\n 'ER',\n 'ES',\n 'ET',\n 'FI',\n 'FJ',\n 'FK',\n 'FM',\n 'FO',\n 'FR',\n 'GA',\n 'GB',\n 'GD',\n 'GE',\n 'GF',\n 'GG',\n 'GH',\n 'GI',\n 'GL',\n 'GM',\n 'GN',\n 'GP',\n 'GQ',\n 'GR',\n 'GS',\n 'GT',\n 'GU',\n 'GW',\n 'GY',\n 'HK',\n 'HM',\n 'HN',\n 'HR',\n 'HT',\n 'HU',\n 'ID',\n 'IE',\n 'IL',\n 'IM',\n 'IN',\n 'IO',\n 'IQ',\n 'IR',\n 'IS',\n 'IT',\n 'JE',\n 'JM',\n 'JO',\n 'JP',\n 'KE',\n 'KG',\n 'KH',\n 'KI',\n 'KM',\n 'KN',\n 'KP',\n 'KR',\n 'KW',\n 'KY',\n 'KZ',\n 'LA',\n 'LB',\n 'LC',\n 'LI',\n 'LK',\n 'LR',\n 'LS',\n 'LT',\n 'LU',\n 'LV',\n 'LY',\n 'MA',\n 'MC',\n 'MD',\n 'ME',\n 'MF',\n 'MG',\n 'MH',\n 'MK',\n 'ML',\n 'MM',\n 'MN',\n 'MO',\n 'MP',\n 'MQ',\n 'MR',\n 'MS',\n 'MT',\n 'MU',\n 'MV',\n 'MW',\n 'MX',\n 'MY',\n 'MZ',\n 'NA',\n 'NC',\n 'NE',\n 'NF',\n 'NG',\n 'NI',\n 'NL',\n 'NO',\n 'NP',\n 'NR',\n 'NU',\n 'NZ',\n 'OM',\n 'PA',\n 'PE',\n 'PF',\n 'PG',\n 'PH',\n 'PK',\n 'PL',\n 'PM',\n 'PN',\n 'PR',\n 'PS',\n 'PT',\n 'PW',\n 'PY',\n 'QA',\n 'RE',\n 'RO',\n 'RS',\n 'RU',\n 'RW',\n 'SA',\n 'SB',\n 'SC',\n 'SD',\n 'SE',\n 'SG',\n 'SH',\n 'SI',\n 'SJ',\n 'SK',\n 'SL',\n 'SM',\n 'SN',\n 'SO',\n 'SR',\n 'SS',\n 'ST',\n 'SV',\n 'SX',\n 'SY',\n 'SZ',\n 'TC',\n 'TD',\n 'TF',\n 'TG',\n 'TH',\n 'TJ',\n 'TK',\n 'TL',\n 'TM',\n 'TN',\n 'TO',\n 'TR',\n 'TT',\n 'TV',\n 'TW',\n 'TZ',\n 'UA',\n 'UG',\n 'UM',\n 'US',\n 'UY',\n 'UZ',\n 'VA',\n 'VC',\n 'VE',\n 'VG',\n 'VI',\n 'VN',\n 'VU',\n 'WF',\n 'WS',\n 'YE',\n 'YT',\n 'ZA',\n 'ZM',\n 'ZW',\n]\n","export const LanguageCultures = [\n {\n value: 'af',\n title: 'Afrikaans',\n },\n {\n value: 'af-ZA',\n title: 'Afrikaans (South Africa)',\n },\n {\n value: 'ar',\n title: 'Arabic',\n },\n {\n value: 'ar-AE',\n title: 'Arabic (U.A.E.)',\n },\n {\n value: 'ar-BH',\n title: 'Arabic (Bahrain)',\n },\n {\n value: 'ar-DZ',\n title: 'Arabic (Algeria)',\n },\n {\n value: 'ar-EG',\n title: 'Arabic (Egypt)',\n },\n {\n value: 'ar-IQ',\n title: 'Arabic (Iraq)',\n },\n {\n value: 'ar-JO',\n title: 'Arabic (Jordan)',\n },\n {\n value: 'ar-KW',\n title: 'Arabic (Kuwait)',\n },\n {\n value: 'ar-LB',\n title: 'Arabic (Lebanon)',\n },\n {\n value: 'ar-LY',\n title: 'Arabic (Libya)',\n },\n {\n value: 'ar-MA',\n title: 'Arabic (Morocco)',\n },\n {\n value: 'ar-OM',\n title: 'Arabic (Oman)',\n },\n {\n value: 'ar-QA',\n title: 'Arabic (Qatar)',\n },\n {\n value: 'ar-SA',\n title: 'Arabic (Saudi Arabia)',\n },\n {\n value: 'ar-SY',\n title: 'Arabic (Syria)',\n },\n {\n value: 'ar-TN',\n title: 'Arabic (Tunisia)',\n },\n {\n value: 'ar-YE',\n title: 'Arabic (Yemen)',\n },\n {\n value: 'az',\n title: 'Azeri',\n },\n {\n value: 'az-Cyrl-AZ',\n title: 'Azeri (Cyrillic, Azerbaijan)',\n },\n {\n value: 'az-Latn-AZ',\n title: 'Azeri (Latin, Azerbaijan)',\n },\n {\n value: 'be',\n title: 'Belarusian',\n },\n {\n value: 'be-BY',\n title: 'Belarusian (Belarus)',\n },\n {\n value: 'bg',\n title: 'Bulgarian',\n },\n {\n value: 'bg-BG',\n title: 'Bulgarian (Bulgaria)',\n },\n {\n value: 'bs-Latn-BA',\n title: 'Bosnian (Bosnia and Herzegovina)',\n },\n {\n value: 'ca',\n title: 'Catalan',\n },\n {\n value: 'ca-ES',\n title: 'Catalan (Catalan)',\n },\n {\n value: 'cs',\n title: 'Czech',\n },\n {\n value: 'cs-CZ',\n title: 'Czech (Czech Republic)',\n },\n {\n value: 'cy-GB',\n title: 'Welsh (United Kingdom)',\n },\n {\n value: 'da',\n title: 'Danish',\n },\n {\n value: 'da-DK',\n title: 'Danish (Denmark)',\n },\n {\n value: 'de',\n title: 'German',\n },\n {\n value: 'de-AT',\n title: 'German (Austria)',\n },\n {\n value: 'de-DE',\n title: 'German (Germany)',\n },\n {\n value: 'de-CH',\n title: 'German (Switzerland)',\n },\n {\n value: 'de-LI',\n title: 'German (Liechtenstein)',\n },\n {\n value: 'de-LU',\n title: 'German (Luxembourg)',\n },\n {\n value: 'dv',\n title: 'Divehi',\n },\n {\n value: 'dv-MV',\n title: 'Divehi (Maldives)',\n },\n {\n value: 'el',\n title: 'Greek',\n },\n {\n value: 'el-GR',\n title: 'Greek (Greece)',\n },\n {\n value: 'en',\n title: 'English',\n },\n {\n value: 'en-029',\n title: 'English (Caribbean)',\n },\n {\n value: 'en-AU',\n title: 'English (Australia)',\n },\n {\n value: 'en-BZ',\n title: 'English (Belize)',\n },\n {\n value: 'en-CA',\n title: 'English (Canada)',\n },\n {\n value: 'en-GB',\n title: 'English (United Kingdom)',\n },\n {\n value: 'en-IE',\n title: 'English (Ireland)',\n },\n {\n value: 'en-JM',\n title: 'English (Jamaica)',\n },\n {\n value: 'en-NZ',\n title: 'English (New Zealand)',\n },\n {\n value: 'en-PH',\n title: 'English (Republic of the Philippines)',\n },\n {\n value: 'en-TT',\n title: 'English (Trinidad and Tobago)',\n },\n {\n value: 'en-US',\n title: 'English (United States)',\n },\n {\n value: 'en-ZA',\n title: 'English (South Africa)',\n },\n {\n value: 'en-ZW',\n title: 'English (Zimbabwe)',\n },\n {\n value: 'es',\n title: 'Spanish',\n },\n {\n value: 'es-AR',\n title: 'Spanish (Argentina)',\n },\n {\n value: 'es-BO',\n title: 'Spanish (Bolivia)',\n },\n {\n value: 'es-CL',\n title: 'Spanish (Chile)',\n },\n {\n value: 'es-CO',\n title: 'Spanish (Colombia)',\n },\n {\n value: 'es-CR',\n title: 'Spanish (Costa Rica)',\n },\n {\n value: 'es-DO',\n title: 'Spanish (Dominican Republic)',\n },\n {\n value: 'es-EC',\n title: 'Spanish (Ecuador)',\n },\n {\n value: 'es-ES',\n title: 'Spanish (Spain)',\n },\n {\n value: 'es-GT',\n title: 'Spanish (Guatemala)',\n },\n {\n value: 'es-HN',\n title: 'Spanish (Honduras)',\n },\n {\n value: 'es-MX',\n title: 'Spanish (Mexico)',\n },\n {\n value: 'es-NI',\n title: 'Spanish (Nicaragua)',\n },\n {\n value: 'es-PA',\n title: 'Spanish (Panama)',\n },\n {\n value: 'es-PE',\n title: 'Spanish (Peru)',\n },\n {\n value: 'es-PR',\n title: 'Spanish (Puerto Rico)',\n },\n {\n value: 'es-PY',\n title: 'Spanish (Paraguay)',\n },\n {\n value: 'es-SV',\n title: 'Spanish (El Salvador)',\n },\n {\n value: 'es-UY',\n title: 'Spanish (Uruguay)',\n },\n {\n value: 'es-VE',\n title: 'Spanish (Venezuela)',\n },\n {\n value: 'et',\n title: 'Estonian',\n },\n {\n value: 'et-EE',\n title: 'Estonian (Estonia)',\n },\n {\n value: 'eu',\n title: 'Basque',\n },\n {\n value: 'eu-ES',\n title: 'Basque (Basque)',\n },\n {\n value: 'fa',\n title: 'Persian',\n },\n {\n value: 'fa-IR',\n title: 'Persian (Iran)',\n },\n {\n value: 'fi',\n title: 'Finnish',\n },\n {\n value: 'fi-FI',\n title: 'Finnish (Finland)',\n },\n {\n value: 'fo',\n title: 'Faroese',\n },\n {\n value: 'fo-FO',\n title: 'Faroese (Faroe Islands)',\n },\n {\n value: 'fr',\n title: 'French',\n },\n {\n value: 'fr-BE',\n title: 'French (Belgium)',\n },\n {\n value: 'fr-CA',\n title: 'French (Canada)',\n },\n {\n value: 'fr-FR',\n title: 'French (France)',\n },\n {\n value: 'fr-CH',\n title: 'French (Switzerland)',\n },\n {\n value: 'fr-LU',\n title: 'French (Luxembourg)',\n },\n {\n value: 'fr-MC',\n title: 'French (Principality of Monaco)',\n },\n {\n value: 'gl',\n title: 'Galician',\n },\n {\n value: 'gl-ES',\n title: 'Galician (Galician)',\n },\n {\n value: 'gu',\n title: 'Gujarati',\n },\n {\n value: 'gu-IN',\n title: 'Gujarati (India)',\n },\n {\n value: 'he',\n title: 'Hebrew',\n },\n {\n value: 'he-IL',\n title: 'Hebrew (Israel)',\n },\n {\n value: 'hi',\n title: 'Hindi',\n },\n {\n value: 'hi-IN',\n title: 'Hindi (India)',\n },\n {\n value: 'hr',\n title: 'Croatian',\n },\n {\n value: 'hr-BA',\n title: 'Croatian (Bosnia and Herzegovina)',\n },\n {\n value: 'hr-HR',\n title: 'Croatian (Croatia)',\n },\n {\n value: 'hu',\n title: 'Hungarian',\n },\n {\n value: 'hu-HU',\n title: 'Hungarian (Hungary)',\n },\n {\n value: 'hy',\n title: 'Armenian',\n },\n {\n value: 'hy-AM',\n title: 'Armenian (Armenia)',\n },\n {\n value: 'id',\n title: 'Indonesian',\n },\n {\n value: 'id-ID',\n title: 'Indonesian (Indonesia)',\n },\n {\n value: 'is',\n title: 'Icelandic',\n },\n {\n value: 'is-IS',\n title: 'Icelandic (Iceland)',\n },\n {\n value: 'it',\n title: 'Italian',\n },\n {\n value: 'it-CH',\n title: 'Italian (Switzerland)',\n },\n {\n value: 'it-IT',\n title: 'Italian (Italy)',\n },\n {\n value: 'ja',\n title: 'Japanese',\n },\n {\n value: 'ja-JP',\n title: 'Japanese (Japan)',\n },\n {\n value: 'ka',\n title: 'Georgian',\n },\n {\n value: 'ka-GE',\n title: 'Georgian (Georgia)',\n },\n {\n value: 'kk',\n title: 'Kazakh',\n },\n {\n value: 'kk-KZ',\n title: 'Kazakh (Kazakhstan)',\n },\n {\n value: 'kn',\n title: 'Kannada',\n },\n {\n value: 'kn-IN',\n title: 'Kannada (India)',\n },\n {\n value: 'ko',\n title: 'Korean',\n },\n {\n value: 'kok',\n title: 'Konkani',\n },\n {\n value: 'kok-IN',\n title: 'Konkani (India)',\n },\n {\n value: 'ko-KR',\n title: 'Korean (Korea)',\n },\n {\n value: 'ky',\n title: 'Kyrgyz',\n },\n {\n value: 'ky-KG',\n title: 'Kyrgyz (Kyrgyzstan)',\n },\n {\n value: 'lt',\n title: 'Lithuanian',\n },\n {\n value: 'lt-LT',\n title: 'Lithuanian (Lithuania)',\n },\n {\n value: 'lv',\n title: 'Latvian',\n },\n {\n value: 'lv-LV',\n title: 'Latvian (Latvia)',\n },\n {\n value: 'mi-NZ',\n title: 'Maori (New Zealand)',\n },\n {\n value: 'mk',\n title: 'Macedonian',\n },\n {\n value: 'mk-MK',\n title: 'Macedonian (Former Yugoslav Republic of Macedonia)',\n },\n {\n value: 'mn',\n title: 'Mongolian',\n },\n {\n value: 'mn-MN',\n title: 'Mongolian (Cyrillic, Mongolia)',\n },\n {\n value: 'mr',\n title: 'Marathi',\n },\n {\n value: 'mr-IN',\n title: 'Marathi (India)',\n },\n {\n value: 'ms',\n title: 'Malay',\n },\n {\n value: 'ms-BN',\n title: 'Malay (Brunei Darussalam)',\n },\n {\n value: 'ms-MY',\n title: 'Malay (Malaysia)',\n },\n {\n value: 'mt-MT',\n title: 'Maltese (Malta)',\n },\n {\n value: 'nb-NO',\n title: 'Norwegian, Bokmal (Norway)',\n },\n {\n value: 'nl',\n title: 'Dutch',\n },\n {\n value: 'nl-BE',\n title: 'Dutch (Belgium)',\n },\n {\n value: 'nl-NL',\n title: 'Dutch (Netherlands)',\n },\n {\n value: 'nn-NO',\n title: 'Norwegian, Nynorsk (Norway)',\n },\n {\n value: 'no',\n title: 'Norwegian',\n },\n {\n value: 'ns-ZA',\n title: 'Northern Sotho (South Africa)',\n },\n {\n value: 'pa',\n title: 'Punjabi',\n },\n {\n value: 'pa-IN',\n title: 'Punjabi (India)',\n },\n {\n value: 'pl',\n title: 'Polish',\n },\n {\n value: 'pl-PL',\n title: 'Polish (Poland)',\n },\n {\n value: 'pt',\n title: 'Portuguese',\n },\n {\n value: 'pt-BR',\n title: 'Portuguese (Brazil)',\n },\n {\n value: 'pt-PT',\n title: 'Portuguese (Portugal)',\n },\n {\n value: 'quz-BO',\n title: 'Quechua (Bolivia)',\n },\n {\n value: 'quz-EC',\n title: 'Quechua (Ecuador)',\n },\n {\n value: 'quz-PE',\n title: 'Quechua (Peru)',\n },\n {\n value: 'ro',\n title: 'Romanian',\n },\n {\n value: 'ro-RO',\n title: 'Romanian (Romania)',\n },\n {\n value: 'ru',\n title: 'Russian',\n },\n {\n value: 'ru-RU',\n title: 'Russian (Russia)',\n },\n {\n value: 'sa',\n title: 'Sanskrit',\n },\n {\n value: 'sa-IN',\n title: 'Sanskrit (India)',\n },\n {\n value: 'se-FI',\n title: 'Sami (Northern) (Finland)',\n },\n {\n value: 'se-NO',\n title: 'Sami (Northern) (Norway)',\n },\n {\n value: 'se-SE',\n title: 'Sami (Northern) (Sweden)',\n },\n {\n value: 'sk',\n title: 'Slovak',\n },\n {\n value: 'sk-SK',\n title: 'Slovak (Slovakia)',\n },\n {\n value: 'sl',\n title: 'Slovenian',\n },\n {\n value: 'sl-SI',\n title: 'Slovenian (Slovenia)',\n },\n {\n value: 'sma-NO',\n title: 'Sami (Southern) (Norway)',\n },\n {\n value: 'sma-SE',\n title: 'Sami (Southern) (Sweden)',\n },\n {\n value: 'smj-NO',\n title: 'Sami (Lule) (Norway)',\n },\n {\n value: 'smj-SE',\n title: 'Sami (Lule) (Sweden)',\n },\n {\n value: 'smn-FI',\n title: 'Sami (Inari) (Finland)',\n },\n {\n value: 'sms-FI',\n title: 'Sami (Skolt) (Finland)',\n },\n {\n value: 'sq',\n title: 'Albanian',\n },\n {\n value: 'sq-AL',\n title: 'Albanian (Albania)',\n },\n {\n value: 'sr',\n title: 'Serbian',\n },\n {\n value: 'sr-Cyrl-BA',\n title: 'Serbian (Cyrillic) (Bosnia and Herzegovina)',\n },\n {\n value: 'sr-Cyrl-CS',\n title: 'Serbian (Cyrillic, Serbia)',\n },\n {\n value: 'sr-Latn-BA',\n title: 'Serbian (Latin) (Bosnia and Herzegovina)',\n },\n {\n value: 'sr-Latn-CS',\n title: 'Serbian (Latin, Serbia)',\n },\n {\n value: 'sv',\n title: 'Swedish',\n },\n {\n value: 'sv-FI',\n title: 'Swedish (Finland)',\n },\n {\n value: 'sv-SE',\n title: 'Swedish (Sweden)',\n },\n {\n value: 'sw',\n title: 'Kiswahili',\n },\n {\n value: 'sw-KE',\n title: 'Kiswahili (Kenya)',\n },\n {\n value: 'syr',\n title: 'Syriac',\n },\n {\n value: 'syr-SY',\n title: 'Syriac (Syria)',\n },\n {\n value: 'ta',\n title: 'Tamil',\n },\n {\n value: 'ta-IN',\n title: 'Tamil (India)',\n },\n {\n value: 'te',\n title: 'Telugu',\n },\n {\n value: 'te-IN',\n title: 'Telugu (India)',\n },\n {\n value: 'th',\n title: 'Thai',\n },\n {\n value: 'th-TH',\n title: 'Thai (Thailand)',\n },\n {\n value: 'tn-ZA',\n title: 'Tswana (South Africa)',\n },\n {\n value: 'tr',\n title: 'Turkish',\n },\n {\n value: 'tr-TR',\n title: 'Turkish (Turkey)',\n },\n {\n value: 'tt',\n title: 'Tatar',\n },\n {\n value: 'tt-RU',\n title: 'Tatar (Russia)',\n },\n {\n value: 'uk',\n title: 'Ukrainian',\n },\n {\n value: 'uk-UA',\n title: 'Ukrainian (Ukraine)',\n },\n {\n value: 'ur',\n title: 'Urdu',\n },\n {\n value: 'ur-PK',\n title: 'Urdu (Islamic Republic of Pakistan)',\n },\n {\n value: 'uz',\n title: 'Uzbek',\n },\n {\n value: 'uz-Cyrl-UZ',\n title: 'Uzbek (Cyrillic, Uzbekistan)',\n },\n {\n value: 'uz-Latn-UZ',\n title: 'Uzbek (Latin, Uzbekistan)',\n },\n {\n value: 'vi',\n title: 'Vietnamese',\n },\n {\n value: 'vi-VN',\n title: 'Vietnamese (Vietnam)',\n },\n {\n value: 'xh-ZA',\n title: 'Xhosa (South Africa)',\n },\n {\n value: 'zh-CN',\n title: \"Chinese (People's Republic of China)\",\n },\n {\n value: 'zh-HK',\n title: 'Chinese (Hong Kong S.A.R.)',\n },\n {\n value: 'zh-CHS',\n title: 'Chinese (Simplified)',\n },\n {\n value: 'zh-CHT',\n title: 'Chinese (Traditional)',\n },\n {\n value: 'zh-MO',\n title: 'Chinese (Macao S.A.R.)',\n },\n {\n value: 'zh-SG',\n title: 'Chinese (Singapore)',\n },\n {\n value: 'zh-TW',\n title: 'Chinese (Taiwan)',\n },\n {\n value: 'zu-ZA',\n title: 'Zulu (South Africa)',\n },\n]\n","export const I18nPrefix = 'i18n'\n","export const I18nDelimiter = '__i18n_'\n","export enum ReferenceBehavior {\n STRONG = 'strong',\n WEAK = 'weak',\n DISABLED = 'disabled',\n}\n","export enum IdStructure {\n SUBPATH = 'subpath',\n DELIMITER = 'delimiter',\n}\n","export const UiMessages = {\n publishing: 'Publishing...',\n publish: 'Publish',\n updatingIntlFields: 'Updating i18n fields',\n intlFieldsUpdated: 'i18n fields updated',\n baseDocumentCopied: 'Base document copied',\n translationCreatedToast: {\n title: (name: string): string => `Translation created: ${name}`,\n description: (name: string): string =>\n `The content from ‘${name}’ is copied into the new document translation.`,\n },\n loading: 'Loading languages...',\n draft: 'Draft',\n missingTranslations:\n 'Following languages are missing some translations compared to the base language',\n base: 'Base',\n missing: 'Missing',\n deleteAll: {\n buttonTitle: 'Delete (incl. translations)',\n deleting: 'Deleting...',\n },\n duplicateAll: {\n buttonTitle: 'Duplicate (incl. translations)',\n duplicating: 'Duplicating...',\n },\n translationsMaintenance: {\n title: 'Translation Maintenance',\n selectSchemaPlaceholder: 'Select schema type',\n idStructureMismatch: 'document(s) with mismatched ID structures',\n missingLanguageField: 'document(s) are missing the language field',\n missingDocumentRefs: 'document(s) have missing translation references',\n missingBaseDocumentRefs: 'document(s) have missing base document references',\n orphanDocuments: 'orphaned translation document(s)',\n referenceBehaviorMismatch: 'document(s) with mismatched reference behaviors',\n baseLanguageMismatch: 'base document(s) with mismatched language field',\n fix: 'Fix',\n pendingTransactionDialog: {\n header: 'Confirm pending transaction',\n caution:\n 'Before continuing please review the transactions. Keep in mind, the translation maintenance functionality may remove or update many documents at once. It is recommended to back-up your dataset before performing data maintenance',\n cancel: 'Cancel',\n confirm: 'Confirm operation',\n },\n },\n errors: {\n baseDocumentNotPublished:\n 'It looks like you have not published your base translation yet. When using strong references it is required to publish the base document before publishing any translated entries',\n },\n languageSelect: {\n placeholder: 'Switch language',\n listLabels: {\n existing: 'Select document translations',\n missing: 'Create new document translations',\n },\n },\n}\n","import {Ti18nConfig} from '../types'\nimport {I18nDelimiter, I18nPrefix, IdStructure} from '../constants'\n\nexport const buildDocId = (pluginConfig: Ti18nConfig, id: string, lang?: string | null): string => {\n if (pluginConfig.idStructure === IdStructure.DELIMITER)\n return `${id}${I18nDelimiter}${lang || '*'}`\n return `${I18nPrefix}.${id}.${lang || '*'}`\n}\n","import {ILanguageObject} from '../types'\n\nexport const getBaseLanguage = (langs: ILanguageObject[], base?: string) => {\n if (base) return langs.find((l) => l.id === base) || null\n return langs.length > 0 ? langs[0] : null\n}\n","import {SanityClient} from '@sanity/client'\nimport {useClient} from 'sanity'\n\nexport function useSanityClient(): SanityClient {\n return useClient({apiVersion: '2021-10-01'})\n}\n","import get from 'just-safe-get'\nimport type {SanityClient, SanityDocument} from '@sanity/client'\nimport {ILanguageObject, ILanguageQuery, TLanguagesOption} from '../types'\nimport type {ApplyConfigResult} from '../utils'\nimport {normalizeLanguageList} from './normalizeLanguageList'\n\nexport const getLanguagesFromOption = async <D extends SanityDocument>(\n client: SanityClient,\n config: ApplyConfigResult,\n langs: TLanguagesOption,\n document?: D | null\n): Promise<ILanguageObject[]> => {\n const languages = normalizeLanguageList(\n await (async () => {\n if (Array.isArray(langs)) return langs\n const r = await client.fetch<ILanguageQuery['value'][]>(langs.query)\n const value = langs.value\n\n if (typeof value === 'string') return r.map((l) => get(l, value))\n return r.map((l) => {\n // @deprecated\n if ('name' in value) {\n return {\n name: get(l, value.name),\n title: get(l, value.title),\n }\n }\n\n return {\n id: get(l, value.id),\n title: get(l, value.title),\n }\n })\n })()\n )\n if (config.languagesLoader) {\n return config.languagesLoader(languages, document ?? undefined)\n }\n return languages\n}\n","import {ILanguageObject} from '../types'\nimport {LanguageCultures} from '../constants'\n\ntype LanguageConfigObject =\n | ILanguageObject\n | (Omit<ILanguageObject, 'id'> & {\n name: string\n })\n\nexport const normalizeLanguageList = (languages: (string | LanguageConfigObject)[]) =>\n languages.map<ILanguageObject>((l) => {\n if (typeof l === 'string') {\n const langCult = LanguageCultures.find((x) => x.value === l)\n if (langCult) return {title: langCult.title, id: l}\n return {title: l, id: l}\n }\n\n if ('name' in l) {\n console.warn(\n `The \"name\" field in your language configuration is deprecated, please replace it with \"id\".`\n )\n return {title: l.title, id: l.name}\n }\n\n return {title: l.title, id: l.id}\n })\n","import {I18nPrefix, I18nDelimiter} from '../constants'\n\n/* Generic to support both string -> string & string? -> string? */\nexport const getBaseIdFromId = <T extends string | undefined>(id?: T): T => {\n if (!id) {\n return undefined as T\n }\n const nonDraftId = id.replace(/^drafts\\./, '')\n\n // subpath\n const rx = new RegExp(`${I18nPrefix}\\\\.([^.]+)\\\\.[^.]+`)\n const match = nonDraftId.match(rx)\n if (match && match.length === 2) return match[1] as T\n\n // delimiter\n const split = nonDraftId.split(I18nDelimiter)\n if (split.length > 0) return split[0] as T\n\n return nonDraftId as T\n}\n","import {SanityClient} from '@sanity/client'\nimport type {ApplyConfigResult} from '../utils'\nimport {I18nDelimiter, IdStructure} from '../constants'\nimport {Ti18nDocument} from '../types'\nimport {buildDocId} from './buildDocId'\n\nexport const getTranslationsFor = async (\n client: SanityClient,\n config: ApplyConfigResult,\n baseDocumentId: string,\n includeDrafts = false\n): Promise<Ti18nDocument[]> => {\n if (config.idStructure === IdStructure.DELIMITER) {\n const segments = baseDocumentId.split('-')\n segments[segments.length - 1] = `${segments[segments.length - 1]}${I18nDelimiter}*`\n const documents = await client.fetch<Ti18nDocument[]>(\n includeDrafts\n ? '*[_id match $segments]'\n : `*[_id match $segments && !(_id in path('drafts.**'))]`,\n {segments}\n )\n\n return documents\n ? documents.filter(\n (d) =>\n d._id.startsWith(baseDocumentId) ||\n (includeDrafts && d._id.startsWith(`drafts.${baseDocumentId}`))\n )\n : []\n }\n const documents = await client.fetch<Ti18nDocument[]>(\n includeDrafts ? '*[_id in path($path) || _id in path($draftPath)]' : '*[_id in path($path)]',\n {\n path: buildDocId(config, baseDocumentId, '*'),\n draftPath: `drafts.${buildDocId(config, baseDocumentId, '*')}`,\n }\n )\n return documents ?? []\n}\n","import type {Reference} from 'sanity'\n\ntype Ref = Omit<Reference, '_type'> & {_type: 'reference'}\n\nexport function createSanityReference(id: string, weak = false): Ref {\n return {\n _type: 'reference' as const,\n _ref: id.replace(`drafts.`, ``),\n ...(weak === true ? {_weak: true} : {}),\n }\n}\n","import type {SanityDocument} from '@sanity/client'\nimport type {ApplyConfigResult} from './applyConfig'\n\nexport function getLanguageFromDocument(\n doc: SanityDocument,\n config: ApplyConfigResult\n): string | null {\n return doc?.[config.fieldNames.lang] || config.base || null\n}\n","import compact from 'lodash/compact'\nimport {SanityClient, SanityDocument} from '@sanity/client'\nimport {ITranslationRef} from '../types'\nimport {ReferenceBehavior} from '../constants'\nimport {ApplyConfigResult} from '../utils'\nimport {getLanguagesFromOption} from './getLanguagesFromOption'\nimport {getBaseLanguage} from './getBaseLanguage'\nimport {getTranslationsFor} from './getTranslationsForId'\nimport {getBaseIdFromId} from './getBaseIdFromId'\nimport {createSanityReference} from './createSanityReference'\nimport {getLanguageFromDocument} from './getLanguageFromDocument'\n\n// @TODO make this into a hook so the hook\n// can look up the existance of a base document on its own\nexport async function updateIntlFieldsForDocument(\n client: SanityClient,\n config: ApplyConfigResult,\n document: SanityDocument,\n baseDocument?: SanityDocument\n): Promise<void> {\n const {_type: type, _id: id} = document\n const baseDocumentId = getBaseIdFromId(id)\n const isTranslation = id !== baseDocumentId\n const fieldName = config.fieldNames.lang\n const refsFieldName = config.fieldNames.references\n const baseRefFieldName = config.fieldNames.baseReference\n const langs = await getLanguagesFromOption(client, config, config.languages, document)\n const languageId =\n getLanguageFromDocument(document, config) || getBaseLanguage(langs, config.base)?.id\n\n // Update I18n field for current document\n const currentDocumentTransaction = client.transaction()\n currentDocumentTransaction.createIfNotExists({_id: id, _type: type})\n currentDocumentTransaction.patch(id, {\n set: {\n [fieldName]: languageId,\n ...(isTranslation && config.referenceBehavior !== ReferenceBehavior.DISABLED\n ? {\n [baseRefFieldName]: createSanityReference(\n baseDocumentId,\n config.referenceBehavior === ReferenceBehavior.WEAK\n ),\n }\n : {}),\n },\n })\n await currentDocumentTransaction.commit()\n\n // update base document reference if required\n if (baseDocument) {\n const translatedDocuments = await getTranslationsFor(client, config, baseDocumentId)\n if (translatedDocuments.length > 0) {\n const baseDocumentTransaction = client.transaction()\n let translatedRefs: ITranslationRef[] = []\n if (config.referenceBehavior !== ReferenceBehavior.DISABLED) {\n translatedRefs = compact(\n translatedDocuments.map((doc) => {\n const lang = getLanguageFromDocument(doc, config)\n if (!lang) return null\n return {\n _key: lang,\n ...createSanityReference(\n doc._id,\n config.referenceBehavior === ReferenceBehavior.WEAK\n ),\n }\n }, {})\n )\n }\n // baseDocumentTransaction.createIfNotExists({_id: baseDocumentId, _type: type})\n baseDocumentTransaction.patch(baseDocumentId, {\n set: {\n [refsFieldName]: translatedRefs,\n },\n })\n await baseDocumentTransaction.commit()\n }\n }\n}\n","import {Path, isKeyedObject} from 'sanity'\n\nexport function serializePath(path: Path): string {\n return path.reduce<string>((target, part, i) => {\n const isIndex = typeof part === 'number'\n const isKey = isKeyedObject(part)\n const separator = i === 0 ? '' : '.'\n const add = isIndex || isKey ? '[]' : `${separator}${part}`\n return `${target}${add}`\n }, '')\n}\n","import {IdStructure, ReferenceBehavior} from '../constants'\nimport type {Ti18nConfig} from '../types'\n\ntype ApplyConfigOptionalKeys =\n | 'shouldReload'\n | 'languagesLoader'\n | 'fallbackLanguageSelect'\n | 'customFlagComponents'\nexport type ApplyConfigResult = Omit<\n Required<{\n [K in keyof Ti18nConfig]: Required<Ti18nConfig[K]>\n }>,\n ApplyConfigOptionalKeys\n> &\n Pick<Ti18nConfig, ApplyConfigOptionalKeys>\n\nexport function applyConfig(\n baseConfig?: Ti18nConfig,\n incomingConfig?: Ti18nConfig | null\n): ApplyConfigResult {\n return {\n base: incomingConfig?.base || baseConfig?.base || '',\n languages: incomingConfig?.languages || baseConfig?.languages || [],\n idStructure: baseConfig?.idStructure || IdStructure.DELIMITER,\n referenceBehavior: baseConfig?.referenceBehavior || ReferenceBehavior.STRONG,\n withTranslationsMaintenance: baseConfig?.withTranslationsMaintenance === true,\n shouldReload: baseConfig?.shouldReload,\n languagesLoader: baseConfig?.languagesLoader,\n fallbackLanguageSelect: baseConfig?.fallbackLanguageSelect,\n customFlagComponents: baseConfig?.customFlagComponents,\n fieldNames: {\n lang: incomingConfig?.fieldNames?.lang || baseConfig?.fieldNames?.lang || '__i18n_lang',\n references:\n incomingConfig?.fieldNames?.references ||\n baseConfig?.fieldNames?.references ||\n '__i18n_refs',\n baseReference:\n incomingConfig?.fieldNames?.baseReference ||\n baseConfig?.fieldNames?.baseReference ||\n '__i18n_base',\n },\n }\n}\n","import {useEffect, useState} from 'react'\n\nexport function useDelayedFlag(\n value = false,\n timeout = 500,\n delayedOn = false,\n delayedOff = true\n): boolean {\n const [flag, setFlag] = useState(value)\n\n useEffect(() => {\n if (flag !== value) {\n if (value) {\n if (delayedOn) {\n const timeoutId = setTimeout(() => setFlag(true), timeout)\n return () => clearTimeout(timeoutId)\n }\n setFlag(true)\n } else if (!value) {\n if (delayedOff) {\n const timeoutId = setTimeout(() => setFlag(false), timeout)\n return () => clearTimeout(timeoutId)\n }\n setFlag(false)\n }\n }\n return undefined\n }, [flag, value, timeout, delayedOn, delayedOff])\n\n return flag\n}\n","import {useMemo} from 'react'\nimport {useSchema} from 'sanity'\nimport type {Ti18nConfig, Ti18nSchema} from '../types'\nimport {applyConfig, ApplyConfigResult} from '../utils'\n\nexport function useConfig(pluginConfig: Ti18nConfig, type?: string): ApplyConfigResult {\n const schemaRegistry = useSchema()\n const schemaI18nConfig = useMemo(() => {\n if (type) {\n const schemaType = schemaRegistry.get(type) as Ti18nSchema | undefined\n if (schemaType && typeof schemaType.i18n !== 'boolean') {\n return schemaType?.i18n\n }\n }\n return null\n }, [type, schemaRegistry])\n\n return useMemo(\n () => applyConfig(pluginConfig, schemaI18nConfig),\n [schemaI18nConfig, pluginConfig]\n )\n}\n","import * as React from 'react'\n\nimport {useToast} from '@sanity/ui'\nimport {CheckmarkIcon, PublishIcon} from '@sanity/icons'\nimport {useDocumentOperation, useEditState, useSyncState, useValidationStatus} from 'sanity'\nimport type {DocumentActionComponent, DocumentActionDescription} from 'sanity'\nimport {getBaseIdFromId, updateIntlFieldsForDocument, useSanityClient} from '../utils'\nimport {ReferenceBehavior, UiMessages} from '../constants'\nimport {IEditState, IUseDocumentOperationResult, Ti18nConfig} from '../types'\nimport {useConfig, useDelayedFlag} from '../hooks'\n\nexport function createPublishAction(pluginConfig: Ti18nConfig): DocumentActionComponent {\n return ({type, id, onComplete}): DocumentActionDescription => {\n const toast = useToast()\n const client = useSanityClient()\n const config = useConfig(pluginConfig, type)\n const baseDocumentId = getBaseIdFromId(id)\n const updatingIntlFieldsPromiseRef = React.useRef<Promise<void> | null>(null)\n const [publishState, setPublishState] = React.useState<'publishing' | 'published' | null>(null)\n const [updatingIntlFields, setUpdatingIntlFields] = React.useState(false)\n const {draft, published} = useEditState(id, type) as IEditState\n const baseDocumentEditState = useEditState(baseDocumentId, type) as IEditState\n const {publish} = useDocumentOperation(id, type) as IUseDocumentOperationResult\n const {isValidating, validation} = useValidationStatus(id, type)\n const syncState = useSyncState(id, type)\n const baseDocumentSyncState = useSyncState(baseDocumentId, type)\n const disabled = useDelayedFlag(\n !!(\n publishState === 'published' ||\n publishState === 'publishing' ||\n updatingIntlFields ||\n publish.disabled ||\n syncState.isSyncing ||\n baseDocumentSyncState.isSyncing ||\n isValidating ||\n validation.some((marker) => marker.level === 'error')\n )\n )\n\n const label = React.useMemo(() => {\n if (publishState === 'publishing') return UiMessages.publishing\n if (updatingIntlFields) return UiMessages.updatingIntlFields\n return UiMessages.publish\n }, [publishState, updatingIntlFields])\n\n const doUpdateIntlFields = React.useCallback(async () => {\n setUpdatingIntlFields(true)\n try {\n const document = draft || published\n if (document) {\n await updateIntlFieldsForDocument(\n client,\n config,\n document,\n baseDocumentEditState.published\n )\n }\n\n toast.push({\n closable: true,\n status: 'success',\n title: UiMessages.intlFieldsUpdated,\n })\n } catch (err) {\n console.error(err)\n toast.push({\n closable: true,\n status: 'error',\n title: (err as Error).toString(),\n })\n }\n setUpdatingIntlFields(false)\n }, [toast, draft, published, client, baseDocumentEditState.published, config])\n\n const onHandle = React.useCallback(() => {\n setPublishState('publishing')\n const isTranslation = id !== baseDocumentId\n if (\n isTranslation &&\n !baseDocumentEditState.published &&\n config.referenceBehavior === ReferenceBehavior.STRONG\n ) {\n throw new Error(UiMessages.errors.baseDocumentNotPublished)\n } else {\n publish.execute()\n }\n }, [id, baseDocumentId, publish, config, baseDocumentEditState.published])\n\n React.useEffect(() => {\n const didPublish = publishState === 'publishing' && !draft\n\n const nextState = didPublish ? 'published' : null\n const delay = didPublish ? 200 : 4000\n const timer = setTimeout(() => {\n setPublishState(nextState)\n }, delay)\n return () => clearTimeout(timer)\n }, [publishState, draft])\n\n React.useEffect(() => {\n if (publishState === 'published') {\n if (!updatingIntlFieldsPromiseRef.current) {\n updatingIntlFieldsPromiseRef.current = doUpdateIntlFields()\n .then(() => onComplete && onComplete())\n .finally(() => (updatingIntlFieldsPromiseRef.current = null))\n }\n }\n }, [publishState, onComplete, doUpdateIntlFields])\n\n return {\n disabled,\n label,\n icon: publishState === 'published' ? CheckmarkIcon : PublishIcon,\n shortcut: disabled ? null : 'Ctrl+Alt+P',\n onHandle,\n }\n }\n}\n","import React from 'react'\nimport {TrashIcon} from '@sanity/icons'\nimport {useDocumentOperation, useEditState, useSyncState} from 'sanity'\nimport {ConfirmDeleteDialog} from 'sanity/desk'\nimport {useToast} from '@sanity/ui'\nimport type {DocumentActionComponent, DocumentActionDescription} from 'sanity'\nimport {IEditState, IUseDocumentOperationResult, Ti18nConfig} from '../types'\nimport {getBaseIdFromId, getTranslationsFor, useSanityClient} from '../utils'\nimport {UiMessages} from '../constants'\nimport {useConfig} from '../hooks'\n\n/**\n * This code is mostly taken from the defualt DeleteAction provided by Sanity\n */\nconst DISABLED_REASON_TITLE = {\n NOTHING_TO_DELETE: \"This document doesn't yet exist or is already deleted\",\n}\n\nexport function createDeleteAction(pluginConfig: Ti18nConfig): DocumentActionComponent {\n return function DeleteWith18nAction({id, type, onComplete}): DocumentActionDescription {\n const toast = useToast()\n const client = useSanityClient()\n const config = useConfig(pluginConfig, type)\n const baseDocumentId = React.useMemo(() => getBaseIdFromId(id), [id])\n const baseDocumentEditState = useEditState(baseDocumentId, type) as IEditState\n const syncState = useSyncState(id, type)\n const baseDocumentSyncState = useSyncState(baseDocumentId, type)\n const {delete: deleteOp} = useDocumentOperation(id, type) as IUseDocumentOperationResult\n const [isDeleting, setIsDeleting] = React.useState(false)\n const [isConfirmDialogOpen, setConfirmDialogOpen] = React.useState(false)\n\n const onHandle = React.useCallback(() => {\n setConfirmDialogOpen(true)\n }, [])\n\n const onDialogCancel = React.useCallback(() => {\n setConfirmDialogOpen(false)\n if (onComplete) onComplete()\n }, [onComplete])\n\n const onDialogConfirm = React.useCallback(async () => {\n try {\n setIsDeleting(true)\n setConfirmDialogOpen(false)\n\n if (baseDocumentEditState.draft || baseDocumentEditState.published) {\n const baseTransaction = client.transaction()\n if (baseDocumentEditState.draft) {\n baseTransaction.delete(`drafts.${baseDocumentId}`)\n }\n if (baseDocumentEditState.published) {\n baseTransaction.patch(baseDocumentId, {\n unset: [config.fieldNames.references],\n })\n }\n await baseTransaction.commit()\n }\n\n const translatedDocuments = await getTranslationsFor(client, config, baseDocumentId, true)\n const translationsTransaction = client.transaction()\n translatedDocuments.forEach((doc) => {\n translationsTransaction.delete(doc._id)\n })\n await translationsTransaction.commit()\n\n deleteOp.execute()\n if (onComplete) onComplete()\n } catch (err) {\n toast.push({\n closable: true,\n status: 'error',\n title: (err as Error).toString(),\n })\n } finally {\n setIsDeleting(true)\n }\n }, [\n toast,\n config,\n client,\n baseDocumentId,\n baseDocumentEditState.draft,\n baseDocumentEditState.published,\n deleteOp,\n onComplete,\n ])\n\n return {\n onHandle,\n tone: 'critical',\n icon: TrashIcon,\n disabled:\n isDeleting ||\n Boolean(deleteOp.disabled) ||\n syncState.isSyncing ||\n baseDocumentSyncState.isSyncing,\n shortcut: 'CTRL+ALT+D',\n title:\n (deleteOp.disabled &&\n DISABLED_REASON_TITLE[deleteOp.disabled as keyof typeof DISABLED_REASON_TITLE]) ||\n '',\n label: isDeleting ? UiMessages.deleteAll.deleting : UiMessages.deleteAll.buttonTitle,\n dialog: isConfirmDialogOpen && {\n type: 'dialog',\n onClose: onComplete,\n content: (\n <ConfirmDeleteDialog\n action=\"delete\"\n id={id}\n type={type}\n onCancel={onDialogCancel}\n onConfirm={onDialogConfirm}\n />\n ),\n },\n }\n }\n}\n","import React from 'react'\nimport {CopyIcon} from '@sanity/icons'\nimport {useDocumentOperation} from 'sanity'\nimport {useToast} from '@sanity/ui'\nimport {uuid} from '@sanity/uuid'\nimport type {DocumentActionComponent, DocumentActionDescription} from 'sanity'\nimport {\n buildDocId,\n getBaseIdFromId,\n getLanguageFromDocument,\n getTranslationsFor,\n useSanityClient,\n} from '../utils'\nimport {IUseDocumentOperationResult, Ti18nConfig} from '../types'\nimport {UiMessages} from '../constants'\nimport {useConfig} from '../hooks'\n\n/**\n * This code is mostly taken from the default DuplicateAction provided by Sanity\n */\n\nconst DISABLED_REASON_TITLE = {\n NOTHING_TO_DUPLICATE: \"This document doesn't yet exist so there's nothing to duplicate\",\n}\n\nexport function createDuplicateAction(pluginConfig: Ti18nConfig): DocumentActionComponent {\n return ({id, type, draft, published}): DocumentActionDescription => {\n const toast = useToast()\n const client = useSanityClient()\n const config = useConfig(pluginConfig, type)\n const baseDocumentId = getBaseIdFromId(id)\n const {duplicate: duplicateOp} = useDocumentOperation(id, type) as IUseDocumentOperationResult\n const [isDuplicating, setDuplicating] = React.useState(false)\n\n const onDuplicate = React.useCallback(async () => {\n setDuplicating(true)\n try {\n const dupeId = uuid()\n const translations = await getTranslationsFor(client, config, baseDocumentId)\n const transaction = client.transaction()\n transaction.create({\n ...(draft ?? published),\n _id: dupeId,\n _type: type,\n })\n translations.forEach((t) => {\n const isDraft = t._id.startsWith('drafts.')\n const newId = buildDocId(config, dupeId, getLanguageFromDocument(t, config))\n transaction.create({\n ...t,\n _id: isDraft ? `drafts.${newId}` : newId,\n })\n })\n await transaction.commit()\n } catch (err) {\n console.error(err)\n toast.push({\n description: (err as Error).message,\n })\n }\n setDuplicating(false)\n }, [client, config, toast, baseDocumentId, type, draft, published])\n\n return {\n icon: CopyIcon,\n disabled: Boolean(duplicateOp.disabled) || isDuplicating,\n title:\n (duplicateOp.disabled &&\n DISABLED_REASON_TITLE[duplicateOp.disabled as keyof typeof DISABLED_REASON_TITLE]) ||\n '',\n label: isDuplicating\n ? UiMessages.duplicateAll.duplicating\n : UiMessages.duplicateAll.buttonTitle,\n onHandle: onDuplicate,\n }\n }\n}\n","import {type DocumentActionsContext, type DocumentActionComponent} from 'sanity'\nimport {Ti18nConfig, Ti18nSchema} from '../types'\nimport {getBaseIdFromId} from '../utils'\nimport {createPublishAction} from './PublishWithi18nAction'\nimport {createDeleteAction} from './DeleteWithi18nAction'\nimport {createDuplicateAction} from './DuplicateWithi18nAction'\n\nexport {createPublishAction, createDeleteAction, createDuplicateAction}\n\nexport const resolveActions = (\n prev: DocumentActionComponent[],\n {schema, schemaType, documentId}: DocumentActionsContext,\n pluginConfig: Ti18nConfig\n): DocumentActionComponent[] => {\n const type: Ti18nSchema = schema.get(schemaType) as Ti18nSchema\n const isI18n = type && type.i18n\n const isBase = documentId === getBaseIdFromId(documentId)\n let actions = prev\n\n if (isI18n) {\n actions = actions.map((Action) => {\n const isPublishAction = Action.action === 'publish'\n const isDeleteAction = Action.action === 'delete'\n\n if (isPublishAction) {\n return createPublishAction(pluginConfig)\n }\n\n if (isDeleteAction && isBase) {\n return createDeleteAction(pluginConfig)\n }\n\n return Action\n })\n\n if (isBase) {\n actions.push(createDuplicateAction(pluginConfig))\n }\n }\n\n return actions\n}\n","import React, {forwardRef, Ref, useMemo} from 'react'\nimport {Autocomplete, Card, Stack, Text} from '@sanity/ui'\nimport {EarthGlobeIcon} from '@sanity/icons'\nimport {useSchema, DefaultPreview as Preview} from 'sanity'\nimport {Ti18nSchema} from '../../../types'\nimport {UiMessages} from '../../../constants'\n\ntype PreviewMedia = React.ComponentProps<typeof Preview>['media']\ntype Props = {\n value: string\n onChange: (value: string) => void\n onOpen: () => void\n}\n\nexport const MaintenanceTabTypeSelector = forwardRef(function MaintenanceTabTypeSelector(\n {value, onChange, onOpen}: Props,\n ref: Ref<HTMLInputElement>\n) {\n const schema = useSchema()\n const i18nSchemas = useMemo(\n () => schema._original?.types.filter((s: unknown) => !!(s as Ti18nSchema).i18n),\n [schema]\n )\n\n return (\n <Stack space={4}>\n <Text>{UiMessages.translationsMaintenance.selectSchemaPlaceholder}</Text>\n <Card>\n <Autocomplete\n ref={ref}\n fontSize={[2, 2, 3]}\n icon={EarthGlobeIcon}\n id=\"i18n-schema-selector\"\n options={i18nSchemas?.map((option) => ({\n value: option.name,\n payload: option,\n }))}\n value={value}\n placeholder=\"Search\"\n openButton={{onClick: () => onOpen}}\n onChange={onChange}\n renderValue={(v, option) => option?.payload.title || v}\n renderOption={({payload}) => (\n <Card padding={2} radius={2} as=\"button\">\n <Preview\n layout=\"default\"\n title={payload.title}\n media={payload.icon as PreviewMedia}\n />\n </Card>\n )}\n />\n </Card>\n </Stack>\n )\n})\n","import React from 'react'\nimport {Box, Button, Card, Flex, Text} from '@sanity/ui'\nimport {UiMessages} from '../../../constants/UiMessages'\n\ntype Props = React.PropsWithChildren<{\n pending?: boolean\n count: number\n labelName?: keyof typeof UiMessages['translationsMaintenance']\n onClick?: (event: React.SyntheticEvent<HTMLButtonElement, Event>) => void\n}>\n\nexport const MaintenanceTabResult: React.FC<Props> = ({\n pending,\n count,\n labelName,\n children,\n onClick,\n}) => {\n return (\n <Card padding={3} radius={2} shadow={1} tone={count > 0 ? `caution` : `default`}>\n <Flex align=\"center\">\n <Box flex={1}>\n <Text muted={count <= 0}>\n <span>{count}</span>\n <span>&nbsp;</span>\n <span>\n {labelName ? String(UiMessages.translationsMaintenance[labelName]) : children}\n </span>\n </Text>\n </Box>\n\n {count > 0 && (\n <Button\n padding={2}\n fontSize={2}\n disabled={pending}\n onClick={onClick}\n text={UiMessages.translationsMaintenance.fix}\n />\n )}\n </Flex>\n </Card>\n )\n}\n","import type {SanityClient, SanityDocument, Transaction} from '@sanity/client'\nimport type {Schema} from 'sanity'\nimport {Ti18nSchema} from '../../types'\nimport {ApplyConfigResult, getLanguageFromId} from '../../utils'\n\nexport const fixLanguageFields = (\n sanityClient: SanityClient,\n config: ApplyConfigResult,\n schemaRegistry: Schema,\n documents: SanityDocument[]\n): Transaction => {\n const langFieldName = config.fieldNames?.lang\n const transaction = sanityClient.transaction()\n\n documents.forEach((d) => {\n const schemaObject = schemaRegistry.get(d._type) as Ti18nSchema\n const base =\n (typeof schemaObject.i18n === 'object' ? schemaObject.i18n.base : undefined) || config.base\n if (!d[langFieldName]) {\n // @README keep the language from ID behavior\n // because in this case we expect the language field not to be available\n const language = getLanguageFromId(d._id) || base\n transaction.patch(d._id, {\n set: {\n [langFieldName]: language,\n },\n })\n }\n })\n\n return transaction\n}\n","import {I18nPrefix, I18nDelimiter} from '../constants'\n\nexport const getLanguageFromId = (id: string): string | undefined => {\n // subpath\n const rx = new RegExp(`${I18nPrefix}\\\\.[^.]+\\\\.([^.]+)`)\n const match = id.match(rx)\n if (match && match.length === 2) return match[1]\n\n // delimiter\n const split = id.split(I18nDelimiter)\n if (split.length > 1) return split[1]\n return undefined\n}\n","import chunk from 'lodash/chunk'\nimport compact from 'lodash/compact'\nimport {SanityClient, Transaction, SanityDocument} from '@sanity/client'\nimport type {Reference} from 'sanity'\nimport {ReferenceBehavior} from '../../constants'\nimport {\n ApplyConfigResult,\n createSanityReference,\n getBaseIdFromId,\n getLanguageFromDocument,\n} from '../../utils'\n\nexport const fixTranslationRefs = (\n sanityClient: SanityClient,\n config: ApplyConfigResult,\n baseDocuments: SanityDocument[],\n translatedDocuments: SanityDocument[]\n // eslint-disable-next-line max-params\n): Transaction[] => {\n const refsFieldName = config.fieldNames.references\n const transactions = chunk(baseDocuments, 50).map((documentsChunk) => {\n const transaction = sanityClient.transaction()\n documentsChunk.forEach((d) => {\n let translatedRefs: Reference[] = []\n const relevantTranslations = translatedDocuments.filter(\n (dx) => getBaseIdFromId(dx._id) === d._id\n )\n if (config.referenceBehavior !== ReferenceBehavior.DISABLED) {\n translatedRefs = compact(\n relevantTranslations.map((doc) => {\n const lang = getLanguageFromDocument(doc, config)\n if (!lang) return null\n return {\n _key: lang,\n ...createSanityReference(\n doc._id,\n config.referenceBehavior === ReferenceBehavior.WEAK\n ),\n }\n }, {})\n )\n }\n transaction.patch(d._id, {\n set: {[refsFieldName]: translatedRefs},\n })\n })\n return transaction\n })\n return transactions\n}\n","import type {SanityClient, SanityDocument, Transaction} from '@sanity/client'\nimport type {Reference} from 'sanity'\nimport {ApplyConfigResult} from '../../utils'\n\nexport const fixOrphanedDocuments = (\n sanityClient: SanityClient,\n config: ApplyConfigResult,\n basedocuments: SanityDocument[],\n translatedDocuments: SanityDocument[]\n): Transaction => {\n const transaction = sanityClient.transaction()\n translatedDocuments.forEach((d) => {\n const base = basedocuments.find(\n (doc) =>\n (Array.isArray(d?.[config.fieldNames.references]) &&\n d?.[config.fieldNames.references]?.some((ref: Reference) => ref._ref === d._id)) ||\n doc._id === d?.[config.fieldNames.baseReference]?._ref\n )\n if (!base) transaction.delete(d._id)\n })\n return transaction\n}\n","import type {SanityDocument, SanityClient, Transaction} from '@sanity/client'\nimport {ApplyConfigResult, getBaseLanguage, getLanguagesFromOption} from '../../utils'\n\nexport const fixBaseLanguageMismatch = async (\n sanityClient: SanityClient,\n config: ApplyConfigResult,\n basedocuments: SanityDocument[]\n): Promise<Transaction> => {\n const languages = await getLanguagesFromOption(sanityClient, config, config.languages)\n const baseLanguage = getBaseLanguage(languages, config.base)\n const langFieldName = config.fieldNames.lang\n const transaction = sanityClient.transaction()\n basedocuments.forEach((doc) => {\n if (doc[langFieldName] !== baseLanguage?.id) {\n transaction.patch(doc._id, {\n set: {[langFieldName]: baseLanguage?.id}, // eslint-disable-line\n })\n }\n })\n return transaction\n}\n","import type {SanityDocument, SanityClient, Transaction} from '@sanity/client'\nimport {ReferenceBehavior} from '../../constants'\nimport {ApplyConfigResult, createSanityReference, getBaseIdFromId} from '../../utils'\n\nexport const fixBaseDocumentRefs = (\n sanityClient: SanityClient,\n config: ApplyConfigResult,\n translatedDocuments: SanityDocument[]\n): Transaction => {\n const transaction = sanityClient.transaction()\n\n if (config.referenceBehavior !== ReferenceBehavior.DISABLED) {\n const baseRefFieldName = config.fieldNames.baseReference\n translatedDocuments.forEach((d) => {\n if (!d[baseRefFieldName]) {\n const baseId = getBaseIdFromId(d._id)\n transaction.patch(d._id, {\n set: {\n [baseRefFieldName]: createSanityReference(\n baseId,\n config.referenceBehavior === ReferenceBehavior.WEAK\n ),\n },\n })\n }\n })\n }\n\n return transaction\n}\n","import React, {forwardRef, Ref, useCallback, useState} from 'react'\nimport {useSchema} from 'sanity'\nimport {Box, Button, Card, Code, Container, Dialog, Flex, Grid, Stack, Text} from '@sanity/ui'\nimport {Transaction} from '@sanity/client'\nimport styled from 'styled-components'\nimport {UiMessages} from '../../../constants'\nimport {MaintenanceTabTypeSelector} from '../MaintenanceTabTypeSelector'\nimport {useDocumentsInformation} from '../../hooks'\nimport {MaintenanceTabResult} from '../MaintenanceTabResult'\nimport {\n fixBaseDocumentRefs,\n fixBaseLanguageMismatch,\n fixIdStructureMismatchDocuments,\n fixLanguageFields,\n fixOrphanedDocuments,\n fixTranslationRefs,\n} from '../../utils'\nimport {Ti18nConfig} from '../../../types'\nimport {useSanityClient} from '../../../utils'\nimport {useConfig} from '../../../hooks'\n\nconst StyledCodeCard = styled(Card)`\n grid-column-start: 1;\n grid-row-start: 1;\n`\n\nconst StyledCode = styled(Code)`\n word-break: break-word;\n white-space: break-spaces;\n`\n\nconst StyledDownloadCodeFlex = styled(Flex)`\n grid-column-start: 1;\n grid-row-start: 1;\n`\n\nexport interface MaintenanceTabContentProps {\n config: Ti18nConfig\n}\n\nexport const MaintenanceTabContent = forwardRef(function MaintenanceTabContent(\n {config: pluginConfig}: MaintenanceTabContentProps,\n ref: Ref<HTMLInputElement>\n) {\n const [selectedSchema, setSelectedSchema] = useState('')\n const client = useSanityClient()\n const {\n pending,\n setPending,\n documents,\n baseDocuments,\n translatedDocuments,\n documentsSummaryInformation,\n fetchInformation,\n } = useDocumentsInformation(pluginConfig, selectedSchema)\n const [pendingTransactions, setPendingTransactions] = useState<Transaction[] | null>(null)\n const schemaRegistry = useSchema()\n const config = useConfig(pluginConfig, selectedSchema)\n\n const onSchemaTypeChange = useCallback((schemaName: string) => setSelectedSchema(schemaName), [])\n\n const handleOpen = useCallback(() => setSelectedSchema(''), [])\n\n const handleFixIdStructureMismatchDocuments = useCallback(() => {\n setPendingTransactions(\n fixIdStructureMismatchDocuments(client, config, selectedSchema, documents)\n )\n }, [client, config, selectedSchema, documents])\n\n const handleFixMissingLanguageFields = useCallback(() => {\n setPendingTransactions([fixLanguageFields(client, config, schemaRegistry, documents)])\n }, [client, schemaRegistry, config, documents])\n\n const handleFixTranslationRefs = useCallback(() => {\n setPendingTransactions(fixTranslationRefs(client, config, baseDocuments, translatedDocuments))\n }, [client, config, baseDocuments, translatedDocuments])\n\n const handleFixBaseDocumntRefs = useCallback(() => {\n setPendingTransactions([fixBaseDocumentRefs(client, config, translatedDocuments)])\n }, [client, config, translatedDocuments])\n\n const handleFixOrphanDocuments = useCallback(() => {\n setPendingTransactions([\n fixOrphanedDocuments(client, config, baseDocuments, translatedDocuments),\n ])\n }, [client, config, baseDocuments, translatedDocuments])\n\n const handleFixReferenceBehaviorMismatch = useCallback(() => {\n setPendingTransactions(fixTranslationRefs(client, config, baseDocuments, translatedDocuments))\n }, [client, config, baseDocuments, translatedDocuments])\n\n const handleFixBaseLanguageMismatch = useCallback(async () => {\n setPendingTransactions([await fixBaseLanguageMismatch(client, config, baseDocuments)])\n }, [client, config, baseDocuments])\n\n const handleDownloadCode = useCallback(() => {\n if (pendingTransactions) {\n const json = JSON.stringify(\n pendingTransactions.map((transaction) => transaction.toJSON()),\n null,\n 2\n )\n const blob = new Blob([json], {\n type: 'application/json',\n })\n\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = 'transactions.json'\n a.style.display = 'none'\n document.body.appendChild(a)\n a.click()\n URL.revokeObjectURL(url)\n }\n }, [pendingTransactions])\n\n const handleCancelPendingTransaction = useCallback(() => {\n setPendingTransactions(null)\n }, [setPendingTransactions])\n\n const handleConfirmPendingTransaction = useCallback(async () => {\n setPending(true)\n try {\n // run all transactions\n if (pendingTransactions) {\n await pendingTransactions.reduce<Promise<void>>(async (prev, transaction) => {\n await prev\n await transaction.commit()\n }, Promise.resolve())\n await fetchInformation(selectedSchema)\n setPendingTransactions(null)\n }\n } catch (err) {\n console.error(err)\n // @TODO show error\n } finally {\n setPending(false)\n }\n }, [setPending, fetchInformation, selectedSchema, pendingTransactions])\n\n return (\n <Container width={1}>\n <Stack space={2}>\n <Box padding={4}>\n <MaintenanceTabTypeSelector\n value={selectedSchema}\n onChange={onSchemaTypeChange}\n onOpen={handleOpen}\n ref={ref}\n />\n </Box>\n {!!selectedSchema && (\n <Box paddingX={4}>\n <Stack space={2}>\n <MaintenanceTabResult\n pending={pending}\n count={documentsSummaryInformation.idStructureMismatch.length}\n labelName=\"idStructureMismatch\"\n onClick={handleFixIdStructureMismatchDocuments}\n />\n <MaintenanceTabResult\n pending={pending}\n count={documentsSummaryInformation.missingLanguageField.length}\n labelName=\"missingLanguageField\"\n onClick={handleFixMissingLanguageFields}\n />\n <MaintenanceTabResult\n pending={pending}\n count={documentsSummaryInformation.missingDocumentRefs.length}\n labelName=\"missingDocumentRefs\"\n onClick={handleFixTranslationRefs}\n />\n <MaintenanceTabResult\n pending={pending}\n count={documentsSummaryInformation.missingBaseDocumentRefs.length}\n labelName=\"missingBaseDocumentRefs\"\n onClick={handleFixBaseDocumntRefs}\n />\n <MaintenanceTabResult\n pending={pending}\n count={documentsSummaryInformation.orphanDocuments.length}\n labelName=\"orphanDocuments\"\n onClick={handleFixOrphanDocuments}\n />\n <MaintenanceTabResult\n pending={pending}\n count={documentsSummaryInformation.referenceBehaviorMismatch.length}\n labelName=\"referenceBehaviorMismatch\"\n onClick={handleFixReferenceBehaviorMismatch}\n />\n <MaintenanceTabResult\n pending={pending}\n count={documentsSummaryInformation.baseLanguageMismatch.length}\n labelName=\"baseLanguageMismatch\"\n onClick={handleFixBaseLanguageMismatch}\n />\n </Stack>\n </Box>\n )}\n </Stack>\n {!!pendingTransactions?.length && (\n <Dialog\n id=\"confirm-pending-transactions\"\n width={2}\n header={UiMessages.translationsMaintenance.pendingTransactionDialog.header}\n onClose={handleCancelPendingTransaction}\n footer={\n <Flex padding={3} justify=\"flex-end\">\n <Grid autoFlow=\"column\" autoCols=\"auto\" gap={2}>\n <Button\n tone=\"default\"\n loading={pending}\n disabled={pending}\n text={UiMessages.translationsMaintenance.pendingTransactionDialog.cancel}\n onClick={handleCancelPendingTransaction}\n />\n <Button\n tone=\"critical\"\n loading={pending}\n disabled={pending}\n text={UiMessages.translationsMaintenance.pendingTransactionDialog.confirm}\n onClick={handleConfirmPendingTransaction}\n />\n </Grid>\n </Flex>\n }\n >\n <Stack padding={3} space={3}>\n <Card padding={3} radius={2} shadow={1} tone=\"caution\">\n <Text size={2}>\n {UiMessages.translationsMaintenance.pendingTransactionDialog.caution}\n </Text>\n </Card>\n <Grid cols={1}>\n <StyledCodeCard padding={3} radius={2} shadow={1} tone=\"default\">\n <StyledCode language=\"json\">\n {JSON.stringify(\n pendingTransactions.map((transaction) => transaction.toJSON()),\n null,\n 2\n )}\n </StyledCode>\n </StyledCodeCard>\n <StyledDownloadCodeFlex\n padding={2}\n justify=\"flex-end\"\n align=\"flex-start\"\n onClick={handleDownloadCode}\n >\n <Button text=\"Download\" />\n </StyledDownloadCodeFlex>\n </Grid>\n </Stack>\n </Dialog>\n )}\n </Container>\n )\n})\n","import React from 'react'\nimport {useConfig} from '../../hooks'\nimport {I18nDelimiter, I18nPrefix, IdStructure, ReferenceBehavior} from '../../constants'\nimport {ILanguageObject, ITranslationRef, Ti18nConfig, Ti18nDocument} from '../../types'\nimport {\n getBaseIdFromId,\n getBaseLanguage,\n getLanguagesFromOption,\n useSanityClient,\n} from '../../utils'\n\nexport const useDocumentsInformation = (pluginConfig: Ti18nConfig, schema: string) => {\n const client = useSanityClient()\n const config = useConfig(pluginConfig, schema)\n const [pending, setPending] = React.useState(false)\n const [documents, setDocuments] = React.useState<Ti18nDocument[]>([])\n const [languages, setLanguages] = React.useState<ILanguageObject[]>([])\n const baseDocuments = React.useMemo(() => {\n if (config.idStructure === IdStructure.DELIMITER)\n return documents.filter((d) => !d._id.includes(I18nDelimiter))\n return documents.filter((d) => !d._id.startsWith(I18nPrefix))\n }, [config, documents])\n const translatedDocuments = React.useMemo(() => {\n if (config.idStructure === IdStructure.DELIMITER)\n return documents.filter((d) => d._id.includes(I18nDelimiter))\n return documents.filter((d) => d._id.startsWith(I18nPrefix))\n }, [config, documents])\n const idStructureMismatchDocuments = React.useMemo(() => {\n if (config.idStructure === IdStructure.DELIMITER)\n return documents.filter((d) => d._id.startsWith(I18nPrefix))\n return documents.filter((d) => d._id.includes(I18nDelimiter))\n }, [config, documents])\n\n const fetchInformation = React.useCallback(\n async (selectedSchema: string) => {\n setPending(true)\n const [langs, result] = await Promise.all([\n getLanguagesFromOption(client, config, config.languages),\n client.fetch<Ti18nDocument[]>(`*[_type == $type && !(_id in path('drafts.**'))]`, {\n type: selectedSchema,\n }),\n ])\n setLanguages(langs)\n setDocuments(result)\n setPending(false)\n },\n [config, client]\n )\n\n const documentsSummaryInformation = React.useMemo(() => {\n const base = getBaseLanguage(languages, config.base)\n const basedocuments = baseDocuments\n const translateddocuments = translatedDocuments\n const langFieldName = config.fieldNames?.lang\n const refsFieldName = config.fieldNames?.references\n const baseRefFieldName = config.fieldNames?.baseReference\n return {\n idStructureMismatch: idStructureMismatchDocuments,\n missingLanguageField: documents.filter((d) => !d[langFieldName]),\n missingDocumentRefs: basedocuments.filter((d) => {\n const docs = translateddocuments.filter((dx) => getBaseIdFromId(dx._id) === d._id)\n const refsCount = (Object.values(d[refsFieldName] || []) as any[]).filter(\n (ref) => ref._type === 'reference' && !!ref._ref\n ).length\n return refsCount != docs.length\n }),\n missingBaseDocumentRefs: translateddocuments.filter((d) => !d[baseRefFieldName]),\n orphanDocuments: translateddocuments.filter((d) => {\n const baseDoc = basedocuments.find((doc) => getBaseIdFromId(d._id) === doc._id)\n if (baseDoc) return false\n return true\n }),\n referenceBehaviorMismatch: basedocuments.filter((doc) => {\n const refs: ITranslationRef[] = doc[refsFieldName] || []\n if (config.referenceBehavior === ReferenceBehavior.DISABLED)\n return Object.keys(refs).length > 0\n if (config.referenceBehavior === ReferenceBehavior.WEAK)\n return Object.values(refs).some((r) => !r._weak)\n return Object.values(refs).some((r) => !!r._weak)\n }),\n baseLanguageMismatch: basedocuments.filter((doc) => {\n return base?.id && doc[langFieldName] !== base.id\n }),\n }\n }, [\n config,\n documents,\n languages,\n baseDocuments,\n translatedDocuments,\n idStructureMismatchDocuments,\n ])\n\n React.useEffect(() => {\n if (schema) {\n fetchInformation(schema)\n }\n }, [schema])\n\n return {\n pending,\n setPending,\n documents,\n baseDocuments,\n translatedDocuments,\n idStructureMismatchDocuments,\n documentsSummaryInformation,\n fetchInformation,\n }\n}\n","import type {SanityDocument, Transaction} from '@sanity/client'\nimport chunk from 'just-split'\nimport {SanityClient} from '@sanity/client'\nimport {ReferenceBehavior} from '../../constants'\nimport {\n ApplyConfigResult,\n buildDocId,\n createSanityReference,\n getBaseIdFromId,\n getLanguageFromDocument,\n} from '../../utils'\n\nexport const fixIdStructureMismatchDocuments = (\n sanityClient: SanityClient,\n config: ApplyConfigResult,\n schema: string,\n documents: SanityDocument[]\n): Transaction[] => {\n const refsFieldName = config.fieldNames.references\n\n // remove old refs\n const existingBaseDocumentIds = new Set(documents.map((d) => getBaseIdFromId(d._id)))\n const removeOldRefsTransaction = sanityClient.transaction()\n existingBaseDocumentIds.forEach((id) => {\n removeOldRefsTransaction.patch(id, {\n set: {[refsFieldName]: []},\n })\n })\n\n // create new document ids\n const newDocumentTransactions = chunk(\n documents.filter((d) => d._id !== getBaseIdFromId(d._id)),\n 100\n ).map((documentsChunk) => {\n const transaction = sanityClient.transaction()\n documentsChunk.forEach((d) => {\n const baseId = getBaseIdFromId(d._id)\n const lang = getLanguageFromDocument(d, config)\n if (lang) {\n const newId = buildDocId(config, baseId, lang)\n transaction.createIfNotExists({\n ...d,\n _id: newId,\n _type: schema,\n })\n transaction.delete(d._id)\n\n // patch base document with updated refs\n if (config.referenceBehavior !== ReferenceBehavior.DISABLED) {\n transaction.patch(baseId, {setIfMissing: {[refsFieldName]: []}})\n transaction.patch(baseId, {\n insert: {\n after: `${refsFieldName}[-1]`,\n items: [\n {\n _key: lang,\n ...createSanityReference(\n newId,\n config.referenceBehavior === ReferenceBehavior.WEAK\n ),\n },\n ],\n },\n })\n }\n }\n })\n return transaction\n })\n\n return [removeOldRefsTransaction, ...newDocumentTransactions]\n}\n","import {EarthGlobeIcon} from '@sanity/icons'\nimport {Schema, SchemaType} from 'sanity'\nimport {DocumentListBuilder, ListItemBuilder, StructureBuilder} from 'sanity/desk'\nimport {applyConfig} from '../utils'\nimport {I18nDelimiter, I18nPrefix, IdStructure, UiMessages} from '../constants'\nimport {Ti18nConfig} from '../types'\nimport {createMaintenanceTabComponent} from './components/MaintenanceTab'\n\nexport interface StructureConfig {\n S: StructureBuilder\n config: Ti18nConfig\n schema: Schema & {\n i18n?: Ti18nConfig\n }\n}\n\nconst hasIcon = (schemaType?: SchemaType | string): boolean => {\n if (!schemaType || typeof schemaType === 'string') {\n return false\n }\n return Boolean(schemaType.icon)\n}\n\nexport const getDefaultDocumentNode = (S: StructureBuilder) => {\n return S.document()\n}\n\nexport const getDocumentTypes = (props: StructureConfig) => {\n const {S, schema} = props\n const listItemsWithouti18n: ListItemBuilder[] = []\n const listItemsWithi18n = S.documentTypeListItems().filter((l) => {\n let schemaType = l.getSchemaType()\n schemaType = typeof schemaType === 'string' ? schema.get(schemaType) : schemaType\n\n const hasi18n = schemaType && (schemaType as unknown as {i18n: boolean}).i18n\n if (!hasi18n) listItemsWithouti18n.push(l)\n return hasi18n\n })\n return {\n withoutI18n: listItemsWithouti18n,\n withI18n: listItemsWithi18n,\n }\n}\n\nexport const getMaintenanceTabComponent = (props: StructureConfig) => {\n const {S} = props\n const MaintenanceTab = createMaintenanceTabComponent(props)\n return S.component(MaintenanceTab)\n .title(UiMessages.translationsMaintenance.title)\n .id(`__i18n_translations_maintenance_tab`)\n}\n\nexport const getMaintenanceListItem = (props: StructureConfig) => {\n const {S} = props\n return S.listItem()\n .id(`__i18n_translations_maintenance_tab`)\n .title(UiMessages.translationsMaintenance.title)\n .icon(EarthGlobeIcon)\n .child(getMaintenanceTabComponent(props))\n}\n\nexport const getFilteredDocumentTypeListItems = (props: StructureConfig) => {\n const {S, config: pluginConfig, schema} = props\n const config = applyConfig(\n pluginConfig,\n typeof schema.i18n === 'object' ? schema.i18n : undefined\n )\n const types = getDocumentTypes(props)\n const filterFns = {\n [IdStructure.SUBPATH]: (list: ListItemBuilder, doc: DocumentListBuilder) =>\n doc.filter('!(_id in path($path)) && !(_id in path($drafts)) && _type == $type').params({\n path: `${I18nPrefix}.**`,\n drafts: `drafts.${I18nPrefix}.**`,\n type: list.getId(),\n }),\n [IdStructure.DELIMITER]: (list: ListItemBuilder, doc: DocumentListBuilder) =>\n doc.filter('!(_id match $id) && _type == $type').params({\n id: `*${I18nDelimiter}*`,\n type: list.getId(),\n }),\n }\n\n const items = [\n ...types.withoutI18n,\n ...types.withI18n.map((l) => {\n const schemaType = l.getSchemaType()\n const schemaTypeName = typeof schemaType === 'string' ? schemaType : schemaType?.name\n\n return l.child(\n filterFns[config.idStructure](\n l,\n S.documentList()\n .id(l.getId() || '')\n .title(l.getTitle() || '')\n .schemaType(schemaTypeName ?? '')\n .menuItems([...(schemaTypeName ? S.orderingMenuItemsForType(schemaTypeName) : [])])\n )\n )\n }),\n ]\n\n if (config.withTranslationsMaintenance) {\n items.splice(0, 0, getMaintenanceListItem(props))\n }\n\n return items.map((item) => item.serialize())\n}\n\nexport function getDocumentList(props: StructureConfig) {\n const {S} = props\n const types = getDocumentTypes(props)\n if (types.withI18n.length === 0) return S.defaults()\n\n const items = getFilteredDocumentTypeListItems(props)\n return S.list()\n .id('__root__')\n .title('Content')\n .items(items)\n .showIcons(items.some((item) => hasIcon(item.schemaType)))\n}\n","import React, {forwardRef, Ref, VoidFunctionComponent} from 'react'\nimport {Ti18nConfig} from '../../../types'\nimport {MaintenanceTabContent} from './MaintenanceTabContent'\n\nexport interface MaintenanceTabProps {\n config: Ti18nConfig\n}\n\nexport function createMaintenanceTabComponent(props: MaintenanceTabProps): VoidFunctionComponent {\n return forwardRef(function MaintenanceTab(p: any, ref: Ref<HTMLInputElement>) {\n return <MaintenanceTabContent {...props} ref={ref} />\n })\n}\n","import type {SlugIsUniqueValidator} from 'sanity'\nimport type {SanityClient} from '@sanity/client'\nimport {I18nDelimiter} from '../constants'\nimport {getBaseIdFromId, serializePath} from '../utils'\n\n/*\n * most of this is taken from the deafultUnique function in @sanity/validation\n */\nexport function createIsSlugUnique(client: SanityClient): SlugIsUniqueValidator {\n return (slug, context) => {\n const {document, path, type} = context\n const schemaOptions = type?.options as {disableArrayWarning?: boolean} | undefined\n\n if (!document) {\n throw new Error(`\\`document\\` was not provided in validation context.`)\n }\n if (!path) {\n throw new Error(`\\`path\\` was not provided in validation context.`)\n }\n\n const disableArrayWarning = schemaOptions?.disableArrayWarning || false\n const baseId = getBaseIdFromId(document._id)\n const docType = document._type\n const atPath = serializePath(path.concat('current'))\n\n if (!disableArrayWarning && atPath.includes('[]')) {\n const serializedPath = serializePath(path)\n console.warn(\n [\n `Slug field at path ${serializedPath} is within an array and cannot be automatically checked for uniqueness`,\n `If you need to check for uniqueness, provide your own \"isUnique\" method`,\n `To disable this message, set \\`disableArrayWarning: true\\` on the slug \\`options\\` field`,\n ].join('\\n')\n )\n }\n\n const constraints = [\n '_type == $docType',\n '!(_id in path(\"drafts.**\"))', // exclude drafts\n '_id != $baseId', // exclude own base document\n '!(_id in path(\"i18n.\" + $baseId + \".*\"))', // exclude any subpath translations\n `!(_id match $baseId + \"${I18nDelimiter}*\")`, // exclude any delimiter based translations\n `${atPath} == $slug`,\n ].join(' && ')\n\n return client.fetch<boolean>(\n `!defined(*[${constraints}][0]._id)`,\n {\n docType,\n baseId,\n slug,\n },\n {tag: 'validation.slug-is-unique'}\n )\n }\n}\n","import {getEmojiFlag} from '@cprecioso/country-flag-emoji'\nimport {SupportedEmojiFlagCodes} from '../constants'\n\n// Get flag from a valid country code\nexport const getFlag = (code = ``): string => {\n if (!code) {\n return ``\n }\n\n const flagCode = getFlagCode(code)\n\n if (!SupportedEmojiFlagCodes.includes(flagCode.toUpperCase())) {\n return ``\n }\n\n const emoji = getEmojiFlag(flagCode)\n\n return emoji\n}\n\n// Convert some language codes to country codes\nexport const getFlagCode = (code = ``): string => {\n if (!code) {\n return ``\n }\n\n switch (code.toLocaleLowerCase()) {\n // Return :flag-gb: for English\n case `en`:\n return `gb`\n // Return :flag-al: (Albania) for `sq` language code\n case `sq`:\n return `al`\n\n default:\n return code\n }\n}\n","import {createContext} from 'react'\nimport {Ti18nConfig} from '../../../types'\n\nexport const LanguageConfigContext = createContext<Ti18nConfig>({})\n","import React, {useContext, useMemo} from 'react'\nimport twemoji from 'twemoji'\nimport parse from 'html-react-parser'\nimport {Box} from '@sanity/ui'\nimport styled from 'styled-components'\nimport {getFlag} from '../../../utils/getFlag'\nimport {LanguageConfigContext} from '../LanguageSelect/LanguageConfigContext'\n\ntype Props = {\n code?: string\n langCulture?: string\n}\n\nconst EmojiBox = styled(Box)`\n min-width: 24px;\n transform: translateY(1px);\n`\n\nfunction flagIcon(flagEmoji: string | undefined) {\n const flagHtml = twemoji.parse(flagEmoji ?? `🇺🇳`, {folder: 'svg', ext: '.svg'})\n // temporary fix because maxcdn has stopped supporting twemoji\n // https://github.com/twitter/twemoji/issues/580#issuecomment-1377111079\n return parse(flagHtml.replace('twemoji.maxcdn.com/v', 'cdnjs.cloudflare.com/ajax/libs/twemoji'))\n}\n\nexport const SingleFlag: React.FunctionComponent<Props> = ({code, langCulture}) => {\n const flagEmoji = useMemo(() => code && getFlag(code), [code])\n const flagReact = flagIcon(flagEmoji)\n\n const {customFlagComponents} = useContext(LanguageConfigContext)\n const CustomFlagComponent = useMemo(() => {\n if (langCulture && customFlagComponents) {\n const exportedName = langCulture.replace(/[^a-zA-Z0-9_]/g, '_')\n if (exportedName in customFlagComponents) {\n return customFlagComponents[exportedName]\n }\n }\n return null\n }, [langCulture, customFlagComponents])\n\n return (\n <Box aria-label={code}>\n {CustomFlagComponent && code ? (\n <CustomFlagComponent code={code} />\n ) : (\n <EmojiBox>{flagReact}</EmojiBox>\n )}\n </Box>\n )\n}\n","import {useEffect, useState, useRef} from 'react'\nimport {catchError, distinctUntilChanged} from 'rxjs/operators'\nimport isEqual from 'react-fast-compare'\nimport {useDocumentStore} from 'sanity'\n\ntype Params = Record<string, string | number | boolean | string[]>\n\ninterface ListenQueryOptions {\n tag?: string\n apiVersion?: string\n}\n\ntype ReturnShape = {\n loading: boolean\n error: boolean\n data: any\n}\n\ntype Observable = {\n unsubscribe: () => void\n}\n\nconst DEFAULT_PARAMS = {}\nconst DEFAULT_OPTIONS = {apiVersion: `v2022-05-09`}\n\nexport function useListeningQuery(\n query: string,\n params: Params = DEFAULT_PARAMS,\n options: ListenQueryOptions = DEFAULT_OPTIONS\n): ReturnShape {\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState(false)\n const [data, setData] = useState(null)\n const subscription = useRef<null | Observable>(null)\n\n const documentStore = useDocumentStore()\n\n useEffect(() => {\n if (query) {\n subscription.current = documentStore\n .listenQuery(query, params, options)\n .pipe(\n distinctUntilChanged(isEqual),\n catchError((err) => {\n console.error(err)\n setError(err)\n setLoading(false)\n setData(null)\n\n return err\n })\n )\n .subscribe((documents) => {\n setData((current) => (isEqual(current, documents) ? current : documents))\n setLoading(false)\n setError(false)\n })\n }\n\n return () => {\n return subscription.current ? subscription.current.unsubscribe() : undefined\n }\n }, [query, params, options])\n\n return {loading, error, data}\n}\n","import type {IExtendedLanguageObject} from '../types'\n\nexport const baseToTop = (a: IExtendedLanguageObject, b: IExtendedLanguageObject): number => {\n return Number(a.isBase ?? 0) - Number(b.isBase ?? 0)\n}\n","import React, {PropsWithChildren} from 'react'\nimport {Box, Text} from '@sanity/ui'\n\nexport function LanguageSelectLabel({children}: PropsWithChildren<Record<never, never>>) {\n return (\n <Box padding={2}>\n <Text muted size={1}>\n {children}\n </Text>\n </Box>\n )\n}\n","import React, {forwardRef} from 'react'\n\nexport const SplitPaneIcon = forwardRef(function UndoIcon(\n props: React.SVGProps<SVGSVGElement>,\n ref: React.Ref<SVGSVGElement>\n) {\n return (\n <svg\n data-sanity-icon=\"splitPane\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 25 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n ref={ref}\n {...props}\n >\n <path\n d=\"M10.5 5.5V19.5M13 12.5H15.5M18 12.5H15.5M15.5 12.5V15M15.5 12.5V10M4.5 5.5H20.5V19.5H4.5V5.5Z\"\n stroke=\"currentColor\"\n strokeWidth={1.2}\n />\n </svg>\n )\n})\n","import {createContext} from 'react'\nimport {ILanguageObject} from '../../../types'\n\ntype ContextValue = {\n currentDocumentId: string | null\n currentDocumentType: string | null\n baseLanguage: ILanguageObject | null\n currentLanguage: ILanguageObject | null\n}\n\nexport const LanguageSelectContext = createContext<ContextValue>({\n currentDocumentId: null,\n currentDocumentType: null,\n baseLanguage: null,\n currentLanguage: null,\n})\n","import React, {useContext} from 'react'\nimport omit from 'just-omit'\nimport {hues} from '@sanity/color'\nimport {Text, Button, Badge, Flex, useToast, MenuItem, Box} from '@sanity/ui'\nimport {AddIcon, SpinnerIcon} from '@sanity/icons'\nimport styled, {css, keyframes} from 'styled-components'\nimport {usePaneRouter} from 'sanity/desk'\nimport {useEditState} from 'sanity'\nimport {RouterContext} from 'sanity/router'\nimport {useConfig} from '../../../hooks'\nimport {SingleFlag} from '../SingleFlag'\nimport type {IExtendedLanguageObject} from '../../../types'\nimport {ReferenceBehavior, UiMessages} from '../../../constants'\nimport {buildDocId, getBaseIdFromId, useSanityClient} from '../../../utils'\nimport {SplitPaneIcon} from '../SplitPaneIcon'\nimport {LanguageSelectContext} from './LanguageSelectContext'\nimport {LanguageConfigContext} from './LanguageConfigContext'\n\ntype Props = {\n status: 'draft' | 'published' | 'missing'\n language: IExtendedLanguageObject\n}\n\nconst rotate = keyframes`\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n`\n\nconst ListItemSpinner = styled(SpinnerIcon)`\n animation: ${rotate} 500ms linear infinite;\n`\n\nconst ListItemSplitButton = styled(Button)`\n display: none;\n flex-shrink: 0;\n margin-left: 4px;\n\n & svg {\n display: block;\n color: ${hues.gray[700].hex};\n }\n\n ${({theme}) => css`\n @media (min-width: ${theme.sanity.media[1] / 16}em) {\n display: block;\n }\n `}\n`\n\nconst MenuItemButtonComponent: React.ForwardRefRenderFunction<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement>\n> = (props, ref) => <button type=\"button\" ref={ref} {...props} />\nconst MenuItemButton = React.forwardRef(MenuItemButtonComponent)\n\nconst MenuItemSelectedButton = styled.button`\n color: ${({theme}) => theme.sanity.color.button.default.primary.enabled.fg};\n background-color: ${({theme}) => theme.sanity.color.button.default.primary.enabled.bg};\n\n span {\n color: ${({theme}) => theme.sanity.color.button.default.primary.enabled.fg};\n }\n`\n\nexport const LanguageSelectListItem: React.FC<Props> = ({status, language}) => {\n const toast = useToast()\n const pluginConfig = useContext(LanguageConfigContext)\n const client = useSanityClient()\n const {currentDocumentId, currentDocumentType, baseLanguage} =\n React.useContext(LanguageSelectContext)\n\n if (!currentDocumentId || !currentDocumentType) {\n throw new Error('No document in view')\n }\n\n const config = useConfig(pluginConfig, currentDocumentType)\n const routerContext = React.useContext(RouterContext)\n const {routerPanesState, groupIndex, replaceCurrent} = usePaneRouter()\n const [pending, setPending] = React.useState(false)\n\n const baseId = React.useMemo(() => getBaseIdFromId(currentDocumentId), [currentDocumentId])\n const flagCode = React.useMemo(() => language.id.split(/[_-]/).pop(), [language.id])\n\n const translatedId = React.useMemo(\n () => (language.id === baseLanguage?.id ? baseId : buildDocId(config, baseId, language.id)),\n [config, baseId, language.id, baseLanguage]\n )\n const baseDocumentEditState = useEditState(baseId, currentDocumentType)\n const baseTranslationBadgeLabel = React.useMemo(() => {\n if (language.isBase) {\n if (language.title.length >= 20) {\n return UiMessages.base.split(' ')[0]\n }\n return UiMessages.base\n }\n return null\n }, [language])\n\n const openDocumentInCurrentPane = React.useCallback(\n (id: string, type: string) => {\n replaceCurrent({\n id,\n params: {type},\n })\n },\n [replaceCurrent]\n )\n\n const openDocumentInSidePane = React.useCallback(\n (id: string, type: string) => {\n if (!routerContext) {\n return\n }\n const panes = [...routerPanesState]\n panes.splice(groupIndex + 1, 0, [\n {\n id: id,\n params: {type},\n },\n ])\n\n const href = routerContext.resolvePathFromState({panes})\n routerContext.navigateUrl({path: href})\n },\n [routerContext, routerPanesState, groupIndex]\n )\n\n const handleCreateClick = React.useCallback(async () => {\n try {\n setPending(true)\n const baseDocument = baseDocumentEditState.draft || baseDocumentEditState.published\n const langFieldName = config.fieldNames.lang\n const referencesFieldName = config.fieldNames.references\n const baseFieldName = config.fieldNames.baseReference\n const referenceBehavior = config.referenceBehavior\n await client.createIfNotExists({\n _id: `drafts.${translatedId}`,\n _type: currentDocumentType,\n\n // Remove other language references from new draft\n ...(baseDocument ? omit(baseDocument, [`_id`, `_type`, referencesFieldName]) : {}),\n\n // Set new language\n [langFieldName]: language.id,\n\n // Set base language reference\n ...(baseDocument?._id && referenceBehavior !== ReferenceBehavior.DISABLED\n ? {\n [baseFieldName]: {\n _type: 'reference',\n _ref: baseDocument._id.replace(`drafts.`, ``),\n _weak: true,\n _strengthenOnPublish: {\n type: currentDocumentType,\n weak: referenceBehavior === 'weak',\n template: {\n id: currentDocumentType,\n params: undefined,\n },\n },\n },\n }\n : {}),\n })\n toast.push({\n closable: true,\n status: 'success',\n title: UiMessages.translationCreatedToast.title(language.title),\n description: baseLanguage\n ? UiMessages.translationCreatedToast.description(baseLanguage.title)\n : undefined,\n })\n openDocumentInCurrentPane(translatedId, currentDocumentType)\n } catch (err) {\n toast.push({\n closable: true,\n status: 'error',\n title: (err as Error).toString(),\n })\n } finally {\n setPending(false)\n }\n }, [\n config,\n baseDocumentEditState,\n translatedId,\n currentDocumentType,\n language.id,\n language.title,\n toast,\n baseLanguage,\n openDocumentInCurrentPane,\n client,\n ])\n\n const handleOpenClick = React.useCallback(() => {\n openDocumentInCurrentPane(translatedId, currentDocumentType)\n }, [openDocumentInCurrentPane, translatedId, currentDocumentType])\n\n const handleOpenInSidePaneClick = React.useCallback(() => {\n openDocumentInSidePane(translatedId, currentDocumentType)\n }, [openDocumentInSidePane, translatedId, currentDocumentType])\n\n if (status === 'missing') {\n return (\n <MenuItem\n as={MenuItemButton}\n data-as=\"button\"\n disabled={pending}\n icon={pending ? ListItemSpinner : AddIcon}\n text={language.title}\n onClick={handleCreateClick}\n />\n )\n }\n\n return (\n <Flex>\n <MenuItem\n as={language.isCurrentLanguage ? MenuItemSelectedButton : MenuItemButton}\n data-as=\"button\"\n data-selected={language.isCurrentLanguage}\n selected={language.isCurrentLanguage}\n onClick={handleOpenClick}\n paddingY={1}\n paddingX={2}\n >\n <Flex align=\"center\" gap={2}>\n <SingleFlag code={flagCode} langCulture={language.id} />\n <Box flex={1}>\n <Text>{language.title}</Text>\n </Box>\n {baseTranslationBadgeLabel ? (\n <Badge fontSize={0}>{baseTranslationBadgeLabel}</Badge>\n ) : null}\n </Flex>\n </MenuItem>\n {!language.isCurrentLanguage && (\n <ListItemSplitButton\n type=\"button\"\n tone=\"default\"\n mode=\"bleed\"\n padding={2}\n onClick={handleOpenInSidePaneClick}\n >\n <SplitPaneIcon width={19} height={19} />\n </ListItemSplitButton>\n )}\n </Flex>\n )\n}\n","import React from 'react'\nimport styled from 'styled-components'\nimport {Box, Grid} from '@sanity/ui'\nimport {IExtendedLanguageObject} from '../../../types'\nimport {UiMessages} from '../../../constants'\nimport {baseToTop} from '../../../utils/baseToTop'\nimport {LanguageSelectLabel} from './LanguageSelectLabel'\nimport {LanguageSelectListItem} from './LanguageSelectListItem'\n\ntype Props = {\n draftLanguageObjects: IExtendedLanguageObject[]\n publishedLanguageObjects: IExtendedLanguageObject[]\n missingLanguageObjects: IExtendedLanguageObject[]\n}\n\nconst Divider = styled(Box)`\n border-bottom: 1px solid var(--card-shadow-outline-color);\n`\n\nconst SelectorBox = styled(Box)`\n minwidth: 250;\n`\n\nexport const LanguageSelectList: React.FC<Props> = ({\n draftLanguageObjects,\n publishedLanguageObjects,\n missingLanguageObjects,\n}) => {\n const showDivider = React.useMemo(\n () =>\n Boolean(\n !!(draftLanguageObjects.length || publishedLanguageObjects.length) &&\n missingLanguageObjects.length\n ),\n [draftLanguageObjects, publishedLanguageObjects, missingLanguageObjects]\n )\n\n const existingLanguageObjects = React.useMemo(() => {\n return [\n ...draftLanguageObjects.map((lang) => ({\n ...lang,\n status: 'draft' as const,\n })),\n ...publishedLanguageObjects.map((lang) => ({\n ...lang,\n status: 'published' as const,\n })),\n ]\n .sort(baseToTop)\n .reverse()\n }, [draftLanguageObjects, publishedLanguageObjects])\n\n return (\n <SelectorBox>\n {!!existingLanguageObjects.length && (\n <Box>\n <LanguageSelectLabel>{UiMessages.languageSelect.listLabels.existing}</LanguageSelectLabel>\n <Grid columns={1} gap={1}>\n {existingLanguageObjects.map((language) => (\n <LanguageSelectListItem\n key={language.id}\n status={language.status}\n language={language}\n />\n ))}\n </Grid>\n </Box>\n )}\n\n {showDivider && <Divider marginY={1} />}\n\n {!!missingLanguageObjects.length && (\n <Box>\n <LanguageSelectLabel>{UiMessages.languageSelect.listLabels.missing}</LanguageSelectLabel>\n <Grid columns={1} gap={1}>\n {missingLanguageObjects.map((language) => (\n <LanguageSelectListItem key={language.id} status=\"missing\" language={language} />\n ))}\n </Grid>\n </Box>\n )}\n </SelectorBox>\n )\n}\n","import React, {useContext} from 'react'\nimport get from 'just-safe-get'\nimport {Box, Button, Flex, Menu, MenuButton, PopoverProps, Text} from '@sanity/ui'\nimport type {SchemaType, SanityDocument} from 'sanity'\nimport {ChevronDownIcon} from '@sanity/icons'\nimport {useConfig} from '../../../hooks'\nimport {SingleFlag} from '../SingleFlag'\nimport {buildDocId, getBaseIdFromId, getBaseLanguage, getLanguageFromDocument} from '../../../utils'\nimport {useLanguages} from '../../hooks'\nimport {UiMessages} from '../../../constants'\nimport {IExtendedLanguageObject} from '../../../types'\nimport {useListeningQuery} from '../../hooks/useListeningQuery'\nimport {LanguageSelectList} from './LanguageSelectList'\nimport {LanguageSelectContext} from './LanguageSelectContext'\nimport {LanguageConfigContext} from './LanguageConfigContext'\n\ntype Props = {\n schemaType: SchemaType\n document: SanityDocument\n}\n\nconst POPOVER_PROPS: PopoverProps = {\n constrainSize: true,\n placement: 'bottom',\n portal: true,\n}\n\nexport const LanguageSelect: React.FC<Props> = ({schemaType, document}) => {\n const pluginConfig = useContext(LanguageConfigContext)\n const config = useConfig(pluginConfig, schemaType.name)\n const [pending, languages] = useLanguages(config, document)\n\n const baseLanguage = React.useMemo(\n () => getBaseLanguage(languages, config.base),\n [languages, config.base]\n )\n\n const currentLanguageCode = React.useMemo(\n () => getLanguageFromDocument(document, config) || (baseLanguage ? baseLanguage.id : null),\n [document, baseLanguage, config]\n )\n const currentLanguageObject = React.useMemo(\n () => languages.find((lang) => lang.id === currentLanguageCode),\n [languages, currentLanguageCode]\n )\n const currentLanguageFlagCode = React.useMemo(\n () => currentLanguageCode?.split(/[-_]/).pop(),\n [currentLanguageCode]\n )\n\n // Find and listen to changes on all potential language versions of documents\n const query = `*[_type == $type && _id in $ids]{\n _id,\n \"${config.fieldNames.lang}\": ${config.fieldNames.lang}\n }`\n const queryParams = React.useMemo(() => {\n const baseId = getBaseIdFromId(document._id)\n const publishedIds = languages.map((lang) =>\n lang === baseLanguage ? baseId : buildDocId(config, baseId, lang.id)\n )\n const draftIds = publishedIds.map((id) => `drafts.${id}`)\n\n return {\n ids: [...publishedIds, ...draftIds],\n type: document._type,\n }\n }, [config, baseLanguage, languages, document._id, document._type])\n\n const {loading, data} = useListeningQuery(query, queryParams)\n\n // Create a list of objects with current status\n const languagesObjects = React.useMemo(() => {\n const draftLanguageObjects: IExtendedLanguageObject[] = []\n const publishedLanguageObjects: IExtendedLanguageObject[] = []\n const missingLanguageObjects: IExtendedLanguageObject[] = []\n\n if (!data?.length) {\n return {\n draftLanguageObjects,\n publishedLanguageObjects,\n missingLanguageObjects,\n }\n }\n\n // Prefer drafts if they exist\n const filteredDocuments: SanityDocument[] = data.reduce(\n (acc: SanityDocument[], cur: SanityDocument) => {\n if (!cur._id.startsWith(`drafts.`)) {\n const alsoHasDraft = data.some((doc: SanityDocument) => doc._id === `drafts.${cur._id}`)\n\n return alsoHasDraft ? acc : [...acc, cur]\n }\n\n return [...acc, cur]\n },\n []\n )\n\n const editStatePerLanguage = new Map()\n filteredDocuments.forEach((doc) => {\n const lang = get(doc ?? {}, config.fieldNames.lang) as string | undefined\n const isBase = doc && doc._id.replace(/^drafts\\./, '') === getBaseIdFromId(doc._id)\n if (lang) {\n editStatePerLanguage.set(lang, doc)\n } else if (isBase && baseLanguage?.id) {\n editStatePerLanguage.set(baseLanguage.id, doc)\n }\n })\n\n languages.forEach((lang, index) => {\n const extendedObject = {\n ...lang,\n isBase: baseLanguage ? lang.id === baseLanguage.id : index === 0,\n isCurrentLanguage: lang.id === currentLanguageCode,\n }\n const doc = editStatePerLanguage.get(lang.id)\n if (doc?._id && !doc._id.startsWith(`drafts.`)) {\n publishedLanguageObjects.push(extendedObject)\n } else if (doc?._id && doc._id.startsWith(`drafts.`)) {\n draftLanguageObjects.push(extendedObject)\n } else {\n missingLanguageObjects.push(extendedObject)\n }\n })\n\n return {\n draftLanguageObjects,\n publishedLanguageObjects,\n missingLanguageObjects,\n }\n }, [config, languages, baseLanguage, data, currentLanguageCode])\n\n if (\n !currentLanguageObject ||\n !currentLanguageCode ||\n pending ||\n loading ||\n languages.length === 0\n ) {\n return (\n <Button\n disabled\n mode=\"bleed\"\n padding={3}\n loading={pending || loading}\n iconRight={ChevronDownIcon}\n text={UiMessages.languageSelect.placeholder}\n />\n )\n }\n\n return (\n <LanguageSelectContext.Provider\n value={{\n baseLanguage,\n currentLanguage: currentLanguageObject,\n currentDocumentType: document._type,\n currentDocumentId: document._id,\n }}\n >\n <MenuButton\n id=\"document-internationalization/language-select\"\n popover={POPOVER_PROPS}\n button={\n <Button\n paddingY={1}\n paddingX={2}\n mode=\"bleed\"\n title={currentLanguageObject.title ?? currentLanguageObject.id}\n >\n <Flex align=\"center\" gap={2}>\n <SingleFlag code={currentLanguageFlagCode} langCulture={currentLanguageCode} />\n <Box flex={1}>\n <Text>{currentLanguageObject.title ?? currentLanguageObject.id}</Text>\n </Box>\n <ChevronDownIcon width={19} height={19} />\n </Flex>\n </Button>\n }\n menu={\n <Menu>\n <LanguageSelectList {...languagesObjects} />\n </Menu>\n }\n />\n </LanguageSelectContext.Provider>\n )\n}\n","import {SanityDocument} from '@sanity/client'\nimport {useCallback, useEffect, useState} from 'react'\nimport {useEditState} from 'sanity'\nimport {ILanguageObject} from '../../types'\nimport {getLanguagesFromOption, useSanityClient, ApplyConfigResult} from '../../utils'\n\nexport function useLanguages(\n config: ApplyConfigResult,\n document: SanityDocument\n): [boolean, ILanguageObject[]] {\n const client = useSanityClient()\n const {draft, published} = useEditState(document._id.replace(/^drafts\\./, ''), document._type)\n const [pending, setPending] = useState(false)\n const [languages, setLanguages] = useState<ILanguageObject[]>([])\n\n const loadOrReloadLanguages = useCallback(async () => {\n const shouldReload =\n languages.length === 0 || (config.shouldReload && config.shouldReload(draft ?? published))\n if (shouldReload) {\n setPending(true)\n const languageObjects = await getLanguagesFromOption(\n client,\n config,\n config.languages,\n draft ?? published\n )\n setLanguages(languageObjects)\n setPending(false)\n }\n }, [client, config, draft, published, languages])\n\n useEffect(() => {\n loadOrReloadLanguages()\n }, [draft, published, languages, config, loadOrReloadLanguages])\n\n return [pending, languages]\n}\n","import React from 'react'\nimport {InputProps, SanityDocument} from 'sanity'\nimport {Flex} from '@sanity/ui'\nimport {Ti18nConfig} from '../../../types'\nimport {LanguageSelect} from './LanguageSelect'\nimport {LanguageConfigContext} from './LanguageConfigContext'\n\nexport type LanguageSelectProps = InputProps & {\n config: Ti18nConfig\n}\n\nexport function LanguageSelectWrapped(props: LanguageSelectProps) {\n const {config, ...inputProps} = props\n const doc = props.value as SanityDocument\n return (\n <LanguageConfigContext.Provider value={config}>\n {doc._id && (\n <Flex flex={1} justify=\"flex-end\">\n <LanguageSelect schemaType={props.schemaType} document={doc} />\n </Flex>\n )}\n {props.renderDefault(inputProps)}\n </LanguageConfigContext.Provider>\n )\n}\n","import React from 'react'\nimport {definePlugin} from 'sanity'\nimport {resolveActions} from './actions'\nimport {createLanguageBadge} from './badges/LanguageBadge'\nimport {LanguageSelectWrapped} from './language-select/components'\nimport {Ti18nConfig, Ti18nSchema} from './types'\n\nexport const documentI18n = definePlugin<Ti18nConfig>((config) => {\n return {\n name: 'document-i18n',\n\n document: {\n actions: (prev, context) => resolveActions(prev, context, config),\n badges: (prev) => [...prev, createLanguageBadge(config)],\n },\n\n form: {\n components: {\n input(props) {\n const {value} = props\n if (\n (props.schemaType as Ti18nSchema).i18n &&\n typeof value === 'object' &&\n (value as Record<string, unknown>)?._id\n ) {\n return <LanguageSelectWrapped config={config} {...props} />\n }\n return props.renderDefault(props)\n },\n },\n },\n }\n})\n","import {DocumentBadgeComponent} from 'sanity'\nimport {useConfig} from '../hooks'\nimport {getLanguageFromDocument} from '../utils'\nimport {Ti18nConfig} from '../types'\n\nexport function createLanguageBadge(pluginConfig: Ti18nConfig): DocumentBadgeComponent {\n const LanguageBadge: DocumentBadgeComponent = (props) => {\n const config = useConfig(pluginConfig, props.type)\n const doc = props.draft || props.published\n const lang = doc ? getLanguageFromDocument(doc, config) : null\n if (lang) {\n return {\n label: lang,\n color: 'success',\n }\n }\n\n return null\n }\n\n return LanguageBadge\n}\n","import compact from 'lodash/compact'\nimport type {PluginOptions} from 'sanity'\nimport {deskTool} from 'sanity/desk'\nimport type {Ti18nConfig} from './types'\nimport {documentI18n} from './documentI18n'\nimport {getDocumentList} from './structure'\n\nexport function withDocumentI18nPlugin(\n plugins: PluginOptions[] | ((config: Ti18nConfig) => PluginOptions[]),\n config: Ti18nConfig & {\n includeDeskTool?: boolean\n }\n): PluginOptions[] {\n const i18nplugin = documentI18n(config)\n return compact([\n ...(Array.isArray(plugins) ? plugins : plugins(config)),\n config.includeDeskTool ?? true\n ? deskTool({\n structure: (S, {schema}) => getDocumentList({S, schema, config}),\n })\n : null,\n i18nplugin,\n ])\n}\n"],"names":["SupportedEmojiFlagCodes","LanguageCultures","value","title","I18nPrefix","I18nDelimiter","ReferenceBehavior","IdStructure","UiMessages","publishing","publish","updatingIntlFields","intlFieldsUpdated","baseDocumentCopied","translationCreatedToast","name","description","concat","loading","draft","missingTranslations","base","missing","deleteAll","buttonTitle","deleting","duplicateAll","duplicating","translationsMaintenance","selectSchemaPlaceholder","idStructureMismatch","missingLanguageField","missingDocumentRefs","missingBaseDocumentRefs","orphanDocuments","referenceBehaviorMismatch","baseLanguageMismatch","fix","pendingTransactionDialog","header","caution","cancel","confirm","errors","baseDocumentNotPublished","languageSelect","placeholder","listLabels","existing","buildDocId","pluginConfig","id","lang","idStructure","DELIMITER","getBaseLanguage","langs","find","l","length","useSanityClient","useClient","apiVersion","getLanguagesFromOption","async","client","config","document","languages","map","langCult","x","console","warn","normalizeLanguageList","Array","isArray","r","fetch","query","get","languagesLoader","getBaseIdFromId","nonDraftId","replace","rx","RegExp","match","split","getTranslationsFor","baseDocumentId","includeDrafts","segments","documents","filter","d","_id","startsWith","path","draftPath","createSanityReference","weak","_objectSpread","_type","_ref","_weak","getLanguageFromDocument","doc","fieldNames","updateIntlFieldsForDocument","baseDocument","_a","type","isTranslation","fieldName","refsFieldName","references","baseRefFieldName","baseReference","languageId","currentDocumentTransaction","transaction","createIfNotExists","patch","set","referenceBehavior","DISABLED","WEAK","commit","translatedDocuments","baseDocumentTransaction","translatedRefs","compact","_key","serializePath","reduce","target","part","i","isIndex","isKey","isKeyedObject","add","separator","applyConfig","baseConfig","incomingConfig","_b","_c","_d","_e","_f","STRONG","withTranslationsMaintenance","shouldReload","fallbackLanguageSelect","customFlagComponents","useDelayedFlag","timeout","delayedOn","delayedOff","flag","setFlag","useState","useEffect","timeoutId","setTimeout","clearTimeout","useConfig","schemaRegistry","useSchema","schemaI18nConfig","useMemo","schemaType","i18n","createPublishAction","onComplete","toast","useToast","updatingIntlFieldsPromiseRef","React","useRef","publishState","setPublishState","setUpdatingIntlFields","published","useEditState","baseDocumentEditState","useDocumentOperation","isValidating","validation","useValidationStatus","syncState","useSyncState","baseDocumentSyncState","disabled","isSyncing","some","marker","level","label","doUpdateIntlFields","useCallback","push","closable","status","err","error","toString","onHandle","Error","execute","didPublish","nextState","timer","current","then","finally","icon","CheckmarkIcon","PublishIcon","shortcut","DISABLED_REASON_TITLE","NOTHING_TO_DELETE","createDeleteAction","_ref2","delete","deleteOp","isDeleting","setIsDeleting","isConfirmDialogOpen","setConfirmDialogOpen","onDialogCancel","onDialogConfirm","baseTransaction","unset","translationsTransaction","forEach","tone","TrashIcon","Boolean","dialog","onClose","content","jsx","ConfirmDeleteDialog","action","onCancel","onConfirm","NOTHING_TO_DUPLICATE","createDuplicateAction","_ref3","duplicate","duplicateOp","isDuplicating","setDuplicating","onDuplicate","dupeId","uuid","translations","create","t","isDraft","newId","message","CopyIcon","resolveActions","prev","_ref4","schema","documentId","isI18n","isBase","actions","Action","isPublishAction","isDeleteAction","MaintenanceTabTypeSelector","forwardRef","ref","onChange","onOpen","_ref5","i18nSchemas","_original","types","s","jsxs","Stack","space","children","Text","Card","Autocomplete","fontSize","EarthGlobeIcon","options","option","payload","openButton","onClick","renderValue","v","renderOption","_ref6","padding","radius","as","Preview","layout","media","MaintenanceTabResult","_ref7","pending","count","labelName","shadow","Flex","align","Box","flex","muted","String","Button","text","fixLanguageFields","sanityClient","langFieldName","schemaObject","language","getLanguageFromId","fixTranslationRefs","baseDocuments","chunk","documentsChunk","relevantTranslations","dx","fixOrphanedDocuments","basedocuments","fixBaseLanguageMismatch","baseLanguage","fixBaseDocumentRefs","baseId","StyledCodeCard","styled","_templateObject","_taggedTemplateLiteral","StyledCode","Code","_templateObject2","StyledDownloadCodeFlex","_templateObject3","MaintenanceTabContent","selectedSchema","setSelectedSchema","setPending","documentsSummaryInformation","fetchInformation","setDocuments","setLanguages","includes","idStructureMismatchDocuments","result","Promise","all","translateddocuments","docs","Object","values","refs","keys","useDocumentsInformation","pendingTransactions","setPendingTransactions","onSchemaTypeChange","schemaName","handleOpen","handleFixIdStructureMismatchDocuments","existingBaseDocumentIds","Set","removeOldRefsTransaction","newDocumentTransactions","setIfMissing","insert","after","items","fixIdStructureMismatchDocuments","handleFixMissingLanguageFields","handleFixTranslationRefs","handleFixBaseDocumntRefs","handleFixOrphanDocuments","handleFixReferenceBehaviorMismatch","handleFixBaseLanguageMismatch","handleDownloadCode","json","JSON","stringify","toJSON","blob","Blob","url","URL","createObjectURL","a","createElement","href","download","style","display","body","appendChild","click","revokeObjectURL","handleCancelPendingTransaction","handleConfirmPendingTransaction","resolve","Container","width","paddingX","Dialog","footer","justify","Grid","autoFlow","autoCols","gap","size","cols","getDefaultDocumentNode","S","getDocumentTypes","props","listItemsWithouti18n","listItemsWithi18n","documentTypeListItems","getSchemaType","hasi18n","withoutI18n","withI18n","getMaintenanceTabComponent","MaintenanceTab","p","createMaintenanceTabComponent","component","getMaintenanceListItem","listItem","child","getFilteredDocumentTypeListItems","filterFns","SUBPATH","list","params","drafts","getId","schemaTypeName","documentList","getTitle","menuItems","orderingMenuItemsForType","splice","item","serialize","getDocumentList","defaults","showIcons","hasIcon","createIsSlugUnique","slug","context","schemaOptions","disableArrayWarning","docType","atPath","serializedPath","join","constraints","tag","getFlagCode","code","arguments","undefined","toLocaleLowerCase","LanguageConfigContext","createContext","EmojiBox","_templateObject4","SingleFlag","_ref9","langCulture","flagReact","flagEmoji","flagHtml","twemoji","parse","folder","ext","flagIcon","flagCode","toUpperCase","getEmojiFlag","getFlag","useContext","CustomFlagComponent","exportedName","DEFAULT_PARAMS","DEFAULT_OPTIONS","baseToTop","b","Number","LanguageSelectLabel","_ref10","SplitPaneIcon","height","viewBox","fill","xmlns","stroke","strokeWidth","LanguageSelectContext","currentDocumentId","currentDocumentType","currentLanguage","rotate","keyframes","_templateObject5","ListItemSpinner","SpinnerIcon","_templateObject6","ListItemSplitButton","_templateObject7","hues","gray","hex","_ref11","theme","css","sanity","MenuItemButton","MenuItemSelectedButton","button","_templateObject9","_ref12","color","default","primary","enabled","fg","_ref13","bg","_ref14","LanguageSelectListItem","_ref15","routerContext","RouterContext","routerPanesState","groupIndex","replaceCurrent","usePaneRouter","pop","translatedId","baseTranslationBadgeLabel","openDocumentInCurrentPane","openDocumentInSidePane","panes","resolvePathFromState","navigateUrl","handleCreateClick","referencesFieldName","baseFieldName","omit","_strengthenOnPublish","template","handleOpenClick","handleOpenInSidePaneClick","MenuItem","AddIcon","isCurrentLanguage","selected","paddingY","Badge","mode","Divider","_templateObject10","SelectorBox","_templateObject11","LanguageSelectList","_ref16","draftLanguageObjects","publishedLanguageObjects","missingLanguageObjects","showDivider","existingLanguageObjects","sort","reverse","columns","marginY","POPOVER_PROPS","constrainSize","placement","portal","LanguageSelect","_ref17","loadOrReloadLanguages","languageObjects","useLanguages","currentLanguageCode","currentLanguageObject","currentLanguageFlagCode","queryParams","publishedIds","draftIds","ids","data","setLoading","setError","setData","subscription","documentStore","useDocumentStore","listenQuery","pipe","distinctUntilChanged","isEqual","catchError","subscribe","unsubscribe","useListeningQuery","languagesObjects","filteredDocuments","acc","cur","editStatePerLanguage","Map","index","extendedObject","iconRight","ChevronDownIcon","Provider","MenuButton","popover","menu","Menu","LanguageSelectWrapped","inputProps","_excluded","renderDefault","documentI18n","definePlugin","badges","form","components","input","withDocumentI18nPlugin","plugins","i18nplugin","includeDeskTool","deskTool","structure","_ref18"],"mappings":"+nFAAO,MAAMA,GAA0B,CACrC,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MCzPWC,GAAmB,CAC9B,CACEC,MAAO,KACPC,MAAO,aAET,CACED,MAAO,QACPC,MAAO,4BAET,CACED,MAAO,KACPC,MAAO,UAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,kBAET,CACED,MAAO,QACPC,MAAO,iBAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,kBAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,iBAET,CACED,MAAO,QACPC,MAAO,kBAET,CACED,MAAO,QACPC,MAAO,yBAET,CACED,MAAO,QACPC,MAAO,kBAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,kBAET,CACED,MAAO,KACPC,MAAO,SAET,CACED,MAAO,aACPC,MAAO,gCAET,CACED,MAAO,aACPC,MAAO,6BAET,CACED,MAAO,KACPC,MAAO,cAET,CACED,MAAO,QACPC,MAAO,wBAET,CACED,MAAO,KACPC,MAAO,aAET,CACED,MAAO,QACPC,MAAO,wBAET,CACED,MAAO,aACPC,MAAO,oCAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,QACPC,MAAO,qBAET,CACED,MAAO,KACPC,MAAO,SAET,CACED,MAAO,QACPC,MAAO,0BAET,CACED,MAAO,QACPC,MAAO,0BAET,CACED,MAAO,KACPC,MAAO,UAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,KACPC,MAAO,UAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,wBAET,CACED,MAAO,QACPC,MAAO,0BAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,KACPC,MAAO,UAET,CACED,MAAO,QACPC,MAAO,qBAET,CACED,MAAO,KACPC,MAAO,SAET,CACED,MAAO,QACPC,MAAO,kBAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,SACPC,MAAO,uBAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,4BAET,CACED,MAAO,QACPC,MAAO,qBAET,CACED,MAAO,QACPC,MAAO,qBAET,CACED,MAAO,QACPC,MAAO,yBAET,CACED,MAAO,QACPC,MAAO,yCAET,CACED,MAAO,QACPC,MAAO,iCAET,CACED,MAAO,QACPC,MAAO,2BAET,CACED,MAAO,QACPC,MAAO,0BAET,CACED,MAAO,QACPC,MAAO,sBAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,QACPC,MAAO,qBAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,QACPC,MAAO,sBAET,CACED,MAAO,QACPC,MAAO,wBAET,CACED,MAAO,QACPC,MAAO,gCAET,CACED,MAAO,QACPC,MAAO,qBAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,QACPC,MAAO,sBAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,kBAET,CACED,MAAO,QACPC,MAAO,yBAET,CACED,MAAO,QACPC,MAAO,sBAET,CACED,MAAO,QACPC,MAAO,yBAET,CACED,MAAO,QACPC,MAAO,qBAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,KACPC,MAAO,YAET,CACED,MAAO,QACPC,MAAO,sBAET,CACED,MAAO,KACPC,MAAO,UAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,QACPC,MAAO,kBAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,QACPC,MAAO,qBAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,QACPC,MAAO,2BAET,CACED,MAAO,KACPC,MAAO,UAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,QACPC,MAAO,wBAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,QACPC,MAAO,mCAET,CACED,MAAO,KACPC,MAAO,YAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,KACPC,MAAO,YAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,KACPC,MAAO,UAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,KACPC,MAAO,SAET,CACED,MAAO,QACPC,MAAO,iBAET,CACED,MAAO,KACPC,MAAO,YAET,CACED,MAAO,QACPC,MAAO,qCAET,CACED,MAAO,QACPC,MAAO,sBAET,CACED,MAAO,KACPC,MAAO,aAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,KACPC,MAAO,YAET,CACED,MAAO,QACPC,MAAO,sBAET,CACED,MAAO,KACPC,MAAO,cAET,CACED,MAAO,QACPC,MAAO,0BAET,CACED,MAAO,KACPC,MAAO,aAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,QACPC,MAAO,yBAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,KACPC,MAAO,YAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,KACPC,MAAO,YAET,CACED,MAAO,QACPC,MAAO,sBAET,CACED,MAAO,KACPC,MAAO,UAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,KACPC,MAAO,UAET,CACED,MAAO,MACPC,MAAO,WAET,CACED,MAAO,SACPC,MAAO,mBAET,CACED,MAAO,QACPC,MAAO,kBAET,CACED,MAAO,KACPC,MAAO,UAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,KACPC,MAAO,cAET,CACED,MAAO,QACPC,MAAO,0BAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,KACPC,MAAO,cAET,CACED,MAAO,QACPC,MAAO,sDAET,CACED,MAAO,KACPC,MAAO,aAET,CACED,MAAO,QACPC,MAAO,kCAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,KACPC,MAAO,SAET,CACED,MAAO,QACPC,MAAO,6BAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,QACPC,MAAO,8BAET,CACED,MAAO,KACPC,MAAO,SAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,QACPC,MAAO,+BAET,CACED,MAAO,KACPC,MAAO,aAET,CACED,MAAO,QACPC,MAAO,iCAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,KACPC,MAAO,UAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,KACPC,MAAO,cAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,QACPC,MAAO,yBAET,CACED,MAAO,SACPC,MAAO,qBAET,CACED,MAAO,SACPC,MAAO,qBAET,CACED,MAAO,SACPC,MAAO,kBAET,CACED,MAAO,KACPC,MAAO,YAET,CACED,MAAO,QACPC,MAAO,sBAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,KACPC,MAAO,YAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,QACPC,MAAO,6BAET,CACED,MAAO,QACPC,MAAO,4BAET,CACED,MAAO,QACPC,MAAO,4BAET,CACED,MAAO,KACPC,MAAO,UAET,CACED,MAAO,QACPC,MAAO,qBAET,CACED,MAAO,KACPC,MAAO,aAET,CACED,MAAO,QACPC,MAAO,wBAET,CACED,MAAO,SACPC,MAAO,4BAET,CACED,MAAO,SACPC,MAAO,4BAET,CACED,MAAO,SACPC,MAAO,wBAET,CACED,MAAO,SACPC,MAAO,wBAET,CACED,MAAO,SACPC,MAAO,0BAET,CACED,MAAO,SACPC,MAAO,0BAET,CACED,MAAO,KACPC,MAAO,YAET,CACED,MAAO,QACPC,MAAO,sBAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,aACPC,MAAO,+CAET,CACED,MAAO,aACPC,MAAO,8BAET,CACED,MAAO,aACPC,MAAO,4CAET,CACED,MAAO,aACPC,MAAO,2BAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,QACPC,MAAO,qBAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,KACPC,MAAO,aAET,CACED,MAAO,QACPC,MAAO,qBAET,CACED,MAAO,MACPC,MAAO,UAET,CACED,MAAO,SACPC,MAAO,kBAET,CACED,MAAO,KACPC,MAAO,SAET,CACED,MAAO,QACPC,MAAO,iBAET,CACED,MAAO,KACPC,MAAO,UAET,CACED,MAAO,QACPC,MAAO,kBAET,CACED,MAAO,KACPC,MAAO,QAET,CACED,MAAO,QACPC,MAAO,mBAET,CACED,MAAO,QACPC,MAAO,yBAET,CACED,MAAO,KACPC,MAAO,WAET,CACED,MAAO,QACPC,MAAO,oBAET,CACED,MAAO,KACPC,MAAO,SAET,CACED,MAAO,QACPC,MAAO,kBAET,CACED,MAAO,KACPC,MAAO,aAET,CACED,MAAO,QACPC,MAAO,uBAET,CACED,MAAO,KACPC,MAAO,QAET,CACED,MAAO,QACPC,MAAO,uCAET,CACED,MAAO,KACPC,MAAO,SAET,CACED,MAAO,aACPC,MAAO,gCAET,CACED,MAAO,aACPC,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"}