@sanity/document-internationalization
6.2.386.2.39
dist/index.js.map~
dist/index.js.mapModified+1−1
Index: package/dist/index.js.map
===================================================================
--- package/dist/index.js.map
+++ package/dist/index.js.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.js","names":["schema.get(props.type)","type","<Feedback tone=\"critical\" title=\"Schema type not found\" />","<Preview value={props.value} schemaType={schemaType} />","value","{id: documentId}","[]","{\n params: {id: documentId},\n initialValue: [],\n }","separateReferences(data)","useMemo(() => separateReferences(data), [data])","() => {\n // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion\n setTranslations(translations as MetadataDocument[])\n }","[setTranslations, translations]","<Flex padding={4} align=\"center\" justify=\"center\">\n <Spinner />\n </Flex>","translations && translations.length > 0 ? (\n <Text>\n This document is a language-specific version which other translations depend on.\n </Text>\n ) : (\n <Text>This document does not have connected translations.</Text>\n )","<Text size={1} weight=\"semibold\">\n {translations && translations.length > 0 ? (\n <>Before this document can be deleted</>\n ) : (\n <>This document can now be deleted</>\n )}\n </Text>","<DocumentPreview value={doc} type={doc._type} />","translations && translations.length > 0 ? (\n <>\n <Card borderTop />\n <Text size={1} weight=\"semibold\">\n The reference in{' '}\n {translations.length === 1\n ? `this translations document`\n : `these translations documents`}{' '}\n must be removed\n </Text>\n {translations.map((translation) => (\n <DocumentPreview\n key={translation._id}\n value={translation}\n type={translation._type}\n />\n ))}\n </>\n ) : null","(translation) => (\n <DocumentPreview\n key={translation._id}\n value={translation}\n type={translation._type}\n />\n )","otherReferences && otherReferences.length > 0 ? (\n <>\n <Card borderTop />\n <Text size={1} weight=\"semibold\">\n {otherReferences.length === 1\n ? `There is an additional reference`\n : `There are additional references`}{' '}\n to this document\n </Text>\n {otherReferences.map((reference) => (\n <DocumentPreview key={reference._id} value={reference} type={reference._type} />\n ))}\n </>\n ) : null","(reference) => (\n <DocumentPreview key={reference._id} value={reference} type={reference._type} />\n )","<Card border padding={3}>\n <Stack gap={4}>\n <Text size={1} weight=\"semibold\">\n {translations && translations.length > 0 ? (\n <>Before this document can be deleted</>\n ) : (\n <>This document can now be deleted</>\n )}\n </Text>\n <DocumentPreview value={doc} type={doc._type} />\n {translations && translations.length > 0 ? (\n <>\n <Card borderTop />\n <Text size={1} weight=\"semibold\">\n The reference in{' '}\n {translations.length === 1\n ? `this translations document`\n : `these translations documents`}{' '}\n must be removed\n </Text>\n {translations.map((translation) => (\n <DocumentPreview\n key={translation._id}\n value={translation}\n type={translation._type}\n />\n ))}\n </>\n ) : null}\n {otherReferences && otherReferences.length > 0 ? (\n <>\n <Card borderTop />\n <Text size={1} weight=\"semibold\">\n {otherReferences.length === 1\n ? `There is an additional reference`\n : `There are additional references`}{' '}\n to this document\n </Text>\n {otherReferences.map((reference) => (\n <DocumentPreview key={reference._id} value={reference} type={reference._type} />\n ))}\n </>\n ) : null}\n </Stack>\n </Card>","otherReferences.length === 0 ? (\n <Text>This document has no other references.</Text>\n ) : (\n <Text>\n You may not be able to delete this document because other documents refer to it.\n </Text>\n )","length","<Stack gap={4}>\n {translations && translations.length > 0 ? (\n <Text>\n This document is a language-specific version which other translations depend on.\n </Text>\n ) : (\n <Text>This document does not have connected translations.</Text>\n )}\n <Card border padding={3}>\n <Stack gap={4}>\n <Text size={1} weight=\"semibold\">\n {translations && translations.length > 0 ? (\n <>Before this document can be deleted</>\n ) : (\n <>This document can now be deleted</>\n )}\n </Text>\n <DocumentPreview value={doc} type={doc._type} />\n {translations && translations.length > 0 ? (\n <>\n <Card borderTop />\n <Text size={1} weight=\"semibold\">\n The reference in{' '}\n {translations.length === 1\n ? `this translations document`\n : `these translations documents`}{' '}\n must be removed\n </Text>\n {translations.map((translation) => (\n <DocumentPreview\n key={translation._id}\n value={translation}\n type={translation._type}\n />\n ))}\n </>\n ) : null}\n {otherReferences && otherReferences.length > 0 ? (\n <>\n <Card borderTop />\n <Text size={1} weight=\"semibold\">\n {otherReferences.length === 1\n ? `There is an additional reference`\n : `There are additional references`}{' '}\n to this document\n </Text>\n {otherReferences.map((reference) => (\n <DocumentPreview key={reference._id} value={reference} type={reference._type} />\n ))}\n </>\n ) : null}\n </Stack>\n </Card>\n {otherReferences.length === 0 ? (\n <Text>This document has no other references.</Text>\n ) : (\n <Text>\n You may not be able to delete this document because other documents refer to it.\n </Text>\n )}\n </Stack>","<Button text=\"Cancel\" onClick={onClose} mode=\"ghost\" />","<Button\n text={\n translations && translations.length > 0\n ? `Unset translation reference`\n : `Delete document`\n }\n onClick={onProceed}\n tone=\"critical\"\n />","translations && translations.length > 0\n ? `Unset translation reference`\n : `Delete document`","<Grid gridTemplateColumns={2} gap={2}>\n <Button text=\"Cancel\" onClick={onClose} mode=\"ghost\" />\n <Button\n text={\n translations && translations.length > 0\n ? `Unset translation reference`\n : `Delete document`\n }\n onClick={onProceed}\n tone=\"critical\"\n />\n </Grid>","{apiVersion: pluginConfig.apiVersion}","apiVersion","createCacheKey(workspaceId)","useMemo(() => createCacheKey(workspaceId), [workspaceId])","useMemo(() => {\n if (Array.isArray(pluginConfig.supportedLanguages)) {\n return null // Return null for synchronous arrays\n }\n\n // Create or get cached promise for React.use\n return createOrGetPromise(async () => {\n if (typeof pluginConfig.supportedLanguages === 'function') {\n return pluginConfig.supportedLanguages(client)\n }\n return pluginConfig.supportedLanguages\n }, cacheKey)\n }, [pluginConfig, client, cacheKey])","async () => {\n if (typeof pluginConfig.supportedLanguages === 'function') {\n return pluginConfig.supportedLanguages(client)\n }\n return pluginConfig.supportedLanguages\n }","pluginConfig.supportedLanguages","createOrGetPromise(async () => {\n if (typeof pluginConfig.supportedLanguages === 'function') {\n return pluginConfig.supportedLanguages(client)\n }\n return pluginConfig.supportedLanguages\n }, cacheKey)","{...pluginConfig, supportedLanguages}","useMemo(\n () => ({...pluginConfig, supportedLanguages}),\n [pluginConfig, supportedLanguages],\n )","props.renderDefault(props)","props.renderDefault","<DocumentInternationalizationContext.Provider value={contextValue}>\n {props.renderDefault(props)}\n </DocumentInternationalizationContext.Provider>","DocumentInternationalizationContext.Provider","[]","() => setDialogOpen(false)","useCallback(() => setDialogOpen(false), [])","{apiVersion: API_VERSION}","() => {\n const tx = client.transaction()\n let operation: DeleteOperation = 'DELETE'\n\n if (documentLanguage && translations.length > 0) {\n operation = 'UNSET'\n translations.forEach((translation) => {\n tx.patch(translation._id, (patch) =>\n patch.unset([\n `${TRANSLATIONS_ARRAY_NAME}[${LANGUAGE_FIELD_NAME} == \"${documentLanguage}\"]`,\n ]),\n )\n })\n } else {\n tx.delete(documentId)\n tx.delete(`drafts.${documentId}`)\n }\n\n tx.commit()\n .then(() => {\n if (operation === 'DELETE') {\n onClose()\n }\n toast.push({\n status: 'success',\n title: operation === 'UNSET' ? 'Translation reference unset' : 'Document deleted',\n description: operation === 'UNSET' ? 'The document can now be deleted' : null,\n })\n return undefined\n })\n .catch((err: Error) => {\n toast.push({\n status: 'error',\n title:\n operation === 'UNSET'\n ? 'Failed to unset translation reference'\n : 'Failed to delete document',\n description: err.message,\n })\n })\n }","translations.length","useCallback(() => {\n const tx = client.transaction()\n let operation: DeleteOperation = 'DELETE'\n\n if (documentLanguage && translations.length > 0) {\n operation = 'UNSET'\n translations.forEach((translation) => {\n tx.patch(translation._id, (patch) =>\n patch.unset([\n `${TRANSLATIONS_ARRAY_NAME}[${LANGUAGE_FIELD_NAME} == \"${documentLanguage}\"]`,\n ]),\n )\n })\n } else {\n tx.delete(documentId)\n tx.delete(`drafts.${documentId}`)\n }\n\n tx.commit()\n .then(() => {\n if (operation === 'DELETE') {\n onClose()\n }\n toast.push({\n status: 'success',\n title: operation === 'UNSET' ? 'Translation reference unset' : 'Document deleted',\n description: operation === 'UNSET' ? 'The document can now be deleted' : null,\n })\n return undefined\n })\n .catch((err: Error) => {\n toast.push({\n status: 'error',\n title:\n operation === 'UNSET'\n ? 'Failed to unset translation reference'\n : 'Failed to delete document',\n description: err.message,\n })\n })\n }, [client, documentLanguage, translations, documentId, onClose, toast])","() => {\n setDialogOpen(true)\n }","isDialogOpen && {\n type: 'dialog',\n onClose,\n header: 'Delete translation',\n content: doc ? (\n <DeleteTranslationDialog\n doc={doc}\n documentId={documentId}\n setTranslations={setTranslations}\n />\n ) : null,\n footer: (\n <DeleteTranslationFooter\n onClose={onClose}\n onProceed={onProceed}\n translations={translations}\n />\n ),\n }","{\n label: `Delete translation...`,\n disabled: !doc || !documentLanguage,\n icon: TrashIcon,\n tone: 'critical',\n onHandle: () => {\n setDialogOpen(true)\n },\n dialog: isDialogOpen && {\n type: 'dialog',\n onClose,\n header: 'Delete translation',\n content: doc ? (\n <DeleteTranslationDialog\n doc={doc}\n documentId={documentId}\n setTranslations={setTranslations}\n />\n ) : null,\n footer: (\n <DeleteTranslationFooter\n onClose={onClose}\n onProceed={onProceed}\n translations={translations}\n />\n ),\n },\n }","!doc || !documentLanguage","{\n params: {id, translationSchema: METADATA_SCHEMA_NAME},\n }","{data, loading, error}","{\n id,\n type,\n /* oxlint-disable-next-line typescript-eslint/no-deprecated -- kept for backwards compatibility */\n onComplete,\n}: DocumentActionProps","{\n id,\n type,\n permission: 'duplicate',\n }","() => {\n setDuplicating(true)\n\n // Async function that does the actual work\n async function performDuplication(): Promise<void> {\n if (!metadataDocument) {\n return Promise.reject(new Error('Metadata document not found'))\n }\n\n const translationsArray = metadataDocument[TRANSLATIONS_ARRAY_NAME]\n if (!translationsArray || translationsArray.length === 0) {\n return Promise.reject(new Error('No translations found in metadata document'))\n }\n\n // 1. Duplicate the document and its localized versions\n const translations = new Map<string, Id>()\n await Promise.all(\n // oxlint-disable-next-line consistent-return\n translationsArray.map(async (translation) => {\n const dupeId = uuid()\n const locale = translation[LANGUAGE_FIELD_NAME]\n const docId = translation.value?._ref\n\n if (typeof locale !== 'string' || locale.trim().length === 0) {\n return Promise.reject(new Error('Invalid locale for translation'))\n }\n if (!docId) {\n return Promise.reject(new Error('Translation document not found'))\n }\n\n const {duplicate: duplicateTranslation} = await firstValueFrom(\n documentStore.pair\n .editOperations(docId, type)\n .pipe(filter((op: EditOperations) => op.duplicate.disabled !== 'NOT_READY')),\n )\n\n if (duplicateTranslation.disabled) {\n return Promise.reject(new Error('Cannot duplicate document'))\n }\n\n const duplicateTranslationSuccess = firstValueFrom(\n documentStore.pair\n .operationEvents(docId, type)\n .pipe(\n filter((e: OperationSuccessEvent) => e.op === 'duplicate' && e.type === 'success'),\n ),\n )\n duplicateTranslation.execute(dupeId)\n await duplicateTranslationSuccess\n\n translations.set(locale, dupeId)\n }),\n )\n\n // 2. Duplicate the metadata document\n const {duplicate: duplicateMetadata} = await firstValueFrom(\n documentStore.pair\n .editOperations(metadataDocument._id, METADATA_SCHEMA_NAME)\n .pipe(filter((op: EditOperations) => op.duplicate.disabled !== 'NOT_READY')),\n )\n\n if (duplicateMetadata.disabled) {\n return Promise.reject(new Error('Cannot duplicate document'))\n }\n\n const duplicateMetadataSuccess = firstValueFrom(\n documentStore.pair\n .operationEvents(metadataDocument._id, METADATA_SCHEMA_NAME)\n .pipe(filter((e: OperationSuccessEvent) => e.op === 'duplicate' && e.type === 'success')),\n )\n const dupeId = uuid()\n duplicateMetadata.execute(dupeId)\n await duplicateMetadataSuccess\n\n // 3. Patch the duplicated metadata document to update the references\n const patch: PatchOperations = {\n set: Object.fromEntries(\n Array.from(translations.entries()).map(([locale, documentId]) => {\n return [\n `${TRANSLATIONS_ARRAY_NAME}[${LANGUAGE_FIELD_NAME} == \"${locale}\"].value._ref`,\n documentId,\n ]\n }),\n ),\n }\n\n await client.transaction().patch(dupeId, patch).commit()\n\n // 4. Navigate to the duplicated document\n navigateIntent('edit', {\n id: Array.from(translations.values()).at(0),\n type,\n })\n\n onComplete()\n }\n\n // Execute and handle success/error\n performDuplication()\n .catch((error: unknown) => {\n console.error(error)\n toast.push({\n status: 'error',\n title: 'Error duplicating document',\n description: error instanceof Error ? error.message : 'Failed to duplicate document',\n })\n })\n .finally(() => {\n setDuplicating(false)\n })\n }","pair","(op: EditOperations) => op.duplicate.disabled !== 'NOT_READY'","(e: OperationSuccessEvent) => e.op === 'duplicate' && e.type === 'success'","dupeId","([locale, documentId]) => {\n return [\n `${TRANSLATIONS_ARRAY_NAME}[${LANGUAGE_FIELD_NAME} == \"${locale}\"].value._ref`,\n documentId,\n ]\n }","useCallback(() => {\n setDuplicating(true)\n\n // Async function that does the actual work\n async function performDuplication(): Promise<void> {\n if (!metadataDocument) {\n return Promise.reject(new Error('Metadata document not found'))\n }\n\n const translationsArray = metadataDocument[TRANSLATIONS_ARRAY_NAME]\n if (!translationsArray || translationsArray.length === 0) {\n return Promise.reject(new Error('No translations found in metadata document'))\n }\n\n // 1. Duplicate the document and its localized versions\n const translations = new Map<string, Id>()\n await Promise.all(\n // oxlint-disable-next-line consistent-return\n translationsArray.map(async (translation) => {\n const dupeId = uuid()\n const locale = translation[LANGUAGE_FIELD_NAME]\n const docId = translation.value?._ref\n\n if (typeof locale !== 'string' || locale.trim().length === 0) {\n return Promise.reject(new Error('Invalid locale for translation'))\n }\n if (!docId) {\n return Promise.reject(new Error('Translation document not found'))\n }\n\n const {duplicate: duplicateTranslation} = await firstValueFrom(\n documentStore.pair\n .editOperations(docId, type)\n .pipe(filter((op: EditOperations) => op.duplicate.disabled !== 'NOT_READY')),\n )\n\n if (duplicateTranslation.disabled) {\n return Promise.reject(new Error('Cannot duplicate document'))\n }\n\n const duplicateTranslationSuccess = firstValueFrom(\n documentStore.pair\n .operationEvents(docId, type)\n .pipe(\n filter((e: OperationSuccessEvent) => e.op === 'duplicate' && e.type === 'success'),\n ),\n )\n duplicateTranslation.execute(dupeId)\n await duplicateTranslationSuccess\n\n translations.set(locale, dupeId)\n }),\n )\n\n // 2. Duplicate the metadata document\n const {duplicate: duplicateMetadata} = await firstValueFrom(\n documentStore.pair\n .editOperations(metadataDocument._id, METADATA_SCHEMA_NAME)\n .pipe(filter((op: EditOperations) => op.duplicate.disabled !== 'NOT_READY')),\n )\n\n if (duplicateMetadata.disabled) {\n return Promise.reject(new Error('Cannot duplicate document'))\n }\n\n const duplicateMetadataSuccess = firstValueFrom(\n documentStore.pair\n .operationEvents(metadataDocument._id, METADATA_SCHEMA_NAME)\n .pipe(filter((e: OperationSuccessEvent) => e.op === 'duplicate' && e.type === 'success')),\n )\n const dupeId = uuid()\n duplicateMetadata.execute(dupeId)\n await duplicateMetadataSuccess\n\n // 3. Patch the duplicated metadata document to update the references\n const patch: PatchOperations = {\n set: Object.fromEntries(\n Array.from(translations.entries()).map(([locale, documentId]) => {\n return [\n `${TRANSLATIONS_ARRAY_NAME}[${LANGUAGE_FIELD_NAME} == \"${locale}\"].value._ref`,\n documentId,\n ]\n }),\n ),\n }\n\n await client.transaction().patch(dupeId, patch).commit()\n\n // 4. Navigate to the duplicated document\n navigateIntent('edit', {\n id: Array.from(translations.values()).at(0),\n type,\n })\n\n onComplete()\n }\n\n // Execute and handle success/error\n performDuplication()\n .catch((error: unknown) => {\n console.error(error)\n toast.push({\n status: 'error',\n title: 'Error duplicating document',\n description: error instanceof Error ? error.message : 'Failed to duplicate document',\n })\n })\n .finally(() => {\n setDuplicating(false)\n })\n }, [client, documentStore.pair, metadataDocument, navigateIntent, onComplete, toast, type])","useMemo(() => {\n if (!isPermissionsLoading && !permissions?.granted) {\n return {\n icon: CopyIcon,\n disabled: true,\n label: d('action.duplicate.label'),\n title: (\n <InsufficientPermissionsMessage context=\"duplicate-document\" currentUser={currentUser} />\n ),\n }\n }\n\n if (!isMetadataDocumentLoading && !metadataDocument) {\n return {\n icon: CopyIcon,\n disabled: true,\n label: d('action.duplicate.label'),\n title: d(DISABLED_REASON_KEY.METADATA_NOT_FOUND),\n }\n }\n\n if (!hasOneMetadataDocument) {\n return {\n icon: CopyIcon,\n disabled: true,\n label: d('action.duplicate.label'),\n title: d(DISABLED_REASON_KEY.MULTIPLE_METADATA),\n }\n }\n\n return {\n icon: CopyIcon,\n disabled:\n isDuplicating ||\n Boolean(duplicate.disabled) ||\n isPermissionsLoading ||\n isMetadataDocumentLoading,\n label: isDuplicating ? s('action.duplicate.running.label') : d('action.duplicate.label'),\n title: duplicate.disabled ? s(DISABLED_REASON_KEY[duplicate.disabled]) : '',\n onHandle: handle,\n }\n }, [\n currentUser,\n duplicate.disabled,\n handle,\n hasOneMetadataDocument,\n isDuplicating,\n isMetadataDocumentLoading,\n isPermissionsLoading,\n metadataDocument,\n permissions?.granted,\n s,\n d,\n ])","d('action.duplicate.label')","<InsufficientPermissionsMessage context=\"duplicate-document\" currentUser={currentUser} />","{\n icon: CopyIcon,\n disabled: true,\n label: d('action.duplicate.label'),\n title: (\n <InsufficientPermissionsMessage context=\"duplicate-document\" currentUser={currentUser} />\n ),\n }","d(DISABLED_REASON_KEY.METADATA_NOT_FOUND)","{\n icon: CopyIcon,\n disabled: true,\n label: d('action.duplicate.label'),\n title: d(DISABLED_REASON_KEY.METADATA_NOT_FOUND),\n }","d(DISABLED_REASON_KEY.MULTIPLE_METADATA)","{\n icon: CopyIcon,\n disabled: true,\n label: d('action.duplicate.label'),\n title: d(DISABLED_REASON_KEY.MULTIPLE_METADATA),\n }","isDuplicating ? s('action.duplicate.running.label') : d('action.duplicate.label')","duplicate.disabled ? s(DISABLED_REASON_KEY[duplicate.disabled]) : ''","disabled","{\n icon: CopyIcon,\n disabled:\n isDuplicating ||\n Boolean(duplicate.disabled) ||\n isPermissionsLoading ||\n isMetadataDocumentLoading,\n label: isDuplicating ? s('action.duplicate.running.label') : d('action.duplicate.label'),\n title: duplicate.disabled ? s(DISABLED_REASON_KEY[duplicate.disabled]) : '',\n onHandle: handle,\n }","isDuplicating ||\n Boolean(duplicate.disabled) ||\n isPermissionsLoading ||\n isMetadataDocumentLoading","op","e","locale","[locale, documentId]","() => {\n if (!id || !type) {\n return\n }\n\n // No panes open, function might be called outside Structure\n if (!routerPanesState.length) {\n router.navigateIntent('edit', {id, type})\n return\n }\n\n const panes = [...routerPanesState]\n panes.splice(groupIndex + 1, 0, [\n {\n id: id,\n params: {type},\n },\n ])\n\n const href = router.resolvePathFromState({panes})\n router.navigateUrl({path: href})\n }","routerPanesState.length","useCallback(() => {\n if (!id || !type) {\n return\n }\n\n // No panes open, function might be called outside Structure\n if (!routerPanesState.length) {\n router.navigateIntent('edit', {id, type})\n return\n }\n\n const panes = [...routerPanesState]\n panes.splice(groupIndex + 1, 0, [\n {\n id: id,\n params: {type},\n },\n ])\n\n const href = router.resolvePathFromState({panes})\n router.navigateUrl({path: href})\n }, [id, type, router, routerPanesState, groupIndex])","{apiVersion}","() => {\n if (!id && metadataId && sourceLanguageId) {\n /* Disable button while this request is pending */\n setUserHasClicked(true)\n\n // handle creation of meta document\n const transaction = client.transaction()\n\n const sourceReference = createReference(\n sourceLanguageId,\n documentId,\n schemaType.name,\n !weakReferences,\n )\n const newMetadataDocument = {\n _id: metadataId,\n _type: METADATA_SCHEMA_NAME,\n schemaTypes: [schemaType.name],\n translations: [sourceReference],\n }\n\n transaction.createIfNotExists(newMetadataDocument)\n\n transaction\n .commit()\n .then(() => {\n setUserHasClicked(false)\n openCreated()\n return undefined\n })\n .catch((err: unknown) => {\n console.error(err)\n setUserHasClicked(false)\n })\n } else {\n open()\n }\n }","name","useCallback(() => {\n if (!id && metadataId && sourceLanguageId) {\n /* Disable button while this request is pending */\n setUserHasClicked(true)\n\n // handle creation of meta document\n const transaction = client.transaction()\n\n const sourceReference = createReference(\n sourceLanguageId,\n documentId,\n schemaType.name,\n !weakReferences,\n )\n const newMetadataDocument = {\n _id: metadataId,\n _type: METADATA_SCHEMA_NAME,\n schemaTypes: [schemaType.name],\n translations: [sourceReference],\n }\n\n transaction.createIfNotExists(newMetadataDocument)\n\n transaction\n .commit()\n .then(() => {\n setUserHasClicked(false)\n openCreated()\n return undefined\n })\n .catch((err: unknown) => {\n console.error(err)\n setUserHasClicked(false)\n })\n } else {\n open()\n }\n }, [\n id,\n metadataId,\n sourceLanguageId,\n client,\n documentId,\n schemaType.name,\n weakReferences,\n openCreated,\n open,\n ])","<Box padding={2}>\n <Text muted size={1}>\n Document has no other translations\n </Text>\n </Box>","['right', 'left']","<Stack>\n <Button\n disabled={disabled}\n mode=\"ghost\"\n text=\"Manage Translations\"\n icon={CogIcon}\n loading={userHasClicked}\n onClick={handleClick}\n />\n </Stack>","<Tooltip\n animate\n content={\n <Box padding={2}>\n <Text muted size={1}>\n Document has no other translations\n </Text>\n </Box>\n }\n fallbackPlacements={['right', 'left']}\n placement=\"top\"\n portal\n disabled={Boolean(id) || canCreate}\n >\n <Stack>\n <Button\n disabled={disabled}\n mode=\"ghost\"\n text=\"Manage Translations\"\n icon={CogIcon}\n loading={userHasClicked}\n onClick={handleClick}\n />\n </Stack>\n </Tooltip>","Boolean(id) || canCreate","metadata?.translations.length\n ? metadata.translations.find((t) => t[LANGUAGE_FIELD_NAME] === language.id)\n : undefined","id","metadata?.translations.length","{apiVersion}","() => open()","useCallback(() => open(), [open])","async () => {\n if (!source) {\n throw new Error(`Cannot create translation without source document`)\n }\n\n if (!sourceLanguageId) {\n throw new Error(`Cannot create translation without source language ID`)\n }\n\n if (!metadataId) {\n throw new Error(`Cannot create translation without a metadata ID`)\n }\n /* Disable the create button while this request is pending */\n setUserHasClicked(true)\n\n const transaction = client.transaction()\n\n // 1. Duplicate source document\n // If the source belongs to a release, create the translation\n // as a version in that same release, otherwise as a draft\n const newTranslationDocumentId = uuid()\n const sourceReleaseId = isVersionId(source._id) ? getVersionFromId(source._id) : undefined\n let newTranslationDocument = {\n ...source,\n _id: sourceReleaseId\n ? getVersionId(newTranslationDocumentId, sourceReleaseId)\n : getDraftId(newTranslationDocumentId),\n // 2. Update language of the translation\n [languageField]: language.id,\n }\n\n // Remove fields / paths we don't want to duplicate\n // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion\n newTranslationDocument = removeExcludedPaths(\n newTranslationDocument,\n schemaType,\n ) as SanityDocument\n\n transaction.create(newTranslationDocument)\n\n // 3. Maybe create the metadata document\n const sourceReference = createReference(\n sourceLanguageId,\n documentId,\n schemaType.name,\n !weakReferences,\n )\n const newTranslationReference = createReference(\n language.id,\n newTranslationDocumentId,\n schemaType.name,\n !weakReferences,\n )\n const newMetadataDocument: MetadataDocument = {\n _id: metadataId,\n _type: METADATA_SCHEMA_NAME,\n schemaTypes: [schemaType.name],\n translations: [sourceReference],\n }\n\n transaction.createIfNotExists(newMetadataDocument)\n\n // 4. Patch translation to metadata document\n // Note: If the document was only just created in the operation above\n // This patch operation will have no effect\n const metadataPatch = client\n .patch(metadataId)\n .setIfMissing({translations: [sourceReference]})\n .insert(`after`, `translations[-1]`, [newTranslationReference])\n\n transaction.patch(metadataPatch)\n\n // 5. Commit!\n transaction\n .commit()\n .then(() => {\n const metadataExisted = Boolean(metadata?._createdAt)\n\n toast.push({\n status: 'success',\n title: `Created \"${language.title}\" translation`,\n description: metadataExisted\n ? `Updated Translations Metadata`\n : `Created Translations Metadata`,\n })\n\n /* Once a translation has been created, reset the userHasClicked state to false\n * so they can click on it to navigate to the translation */\n setUserHasClicked(false)\n\n // Execute callback if provided\n if (callback) {\n // oxlint-disable-next-line eslint-plugin-promise/no-callback-in-promise -- This is an async callback, not a Node.js callback\n return callback({\n client,\n sourceLanguageId,\n sourceDocument: source,\n newDocument: newTranslationDocument,\n destinationLanguageId: language.id,\n metaDocumentId: metadataId,\n })\n }\n\n return undefined\n })\n .catch((err: Error) => {\n console.error(err)\n\n /* Re-enable the create button if there was an error */\n setUserHasClicked(false)\n\n return toast.push({\n status: 'error',\n title: `Error creating translation`,\n description: err.message,\n })\n })\n }","title","_createdAt","useCallback(async () => {\n if (!source) {\n throw new Error(`Cannot create translation without source document`)\n }\n\n if (!sourceLanguageId) {\n throw new Error(`Cannot create translation without source language ID`)\n }\n\n if (!metadataId) {\n throw new Error(`Cannot create translation without a metadata ID`)\n }\n /* Disable the create button while this request is pending */\n setUserHasClicked(true)\n\n const transaction = client.transaction()\n\n // 1. Duplicate source document\n // If the source belongs to a release, create the translation\n // as a version in that same release, otherwise as a draft\n const newTranslationDocumentId = uuid()\n const sourceReleaseId = isVersionId(source._id) ? getVersionFromId(source._id) : undefined\n let newTranslationDocument = {\n ...source,\n _id: sourceReleaseId\n ? getVersionId(newTranslationDocumentId, sourceReleaseId)\n : getDraftId(newTranslationDocumentId),\n // 2. Update language of the translation\n [languageField]: language.id,\n }\n\n // Remove fields / paths we don't want to duplicate\n // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion\n newTranslationDocument = removeExcludedPaths(\n newTranslationDocument,\n schemaType,\n ) as SanityDocument\n\n transaction.create(newTranslationDocument)\n\n // 3. Maybe create the metadata document\n const sourceReference = createReference(\n sourceLanguageId,\n documentId,\n schemaType.name,\n !weakReferences,\n )\n const newTranslationReference = createReference(\n language.id,\n newTranslationDocumentId,\n schemaType.name,\n !weakReferences,\n )\n const newMetadataDocument: MetadataDocument = {\n _id: metadataId,\n _type: METADATA_SCHEMA_NAME,\n schemaTypes: [schemaType.name],\n translations: [sourceReference],\n }\n\n transaction.createIfNotExists(newMetadataDocument)\n\n // 4. Patch translation to metadata document\n // Note: If the document was only just created in the operation above\n // This patch operation will have no effect\n const metadataPatch = client\n .patch(metadataId)\n .setIfMissing({translations: [sourceReference]})\n .insert(`after`, `translations[-1]`, [newTranslationReference])\n\n transaction.patch(metadataPatch)\n\n // 5. Commit!\n transaction\n .commit()\n .then(() => {\n const metadataExisted = Boolean(metadata?._createdAt)\n\n toast.push({\n status: 'success',\n title: `Created \"${language.title}\" translation`,\n description: metadataExisted\n ? `Updated Translations Metadata`\n : `Created Translations Metadata`,\n })\n\n /* Once a translation has been created, reset the userHasClicked state to false\n * so they can click on it to navigate to the translation */\n setUserHasClicked(false)\n\n // Execute callback if provided\n if (callback) {\n // oxlint-disable-next-line eslint-plugin-promise/no-callback-in-promise -- This is an async callback, not a Node.js callback\n return callback({\n client,\n sourceLanguageId,\n sourceDocument: source,\n newDocument: newTranslationDocument,\n destinationLanguageId: language.id,\n metaDocumentId: metadataId,\n })\n }\n\n return undefined\n })\n .catch((err: Error) => {\n console.error(err)\n\n /* Re-enable the create button if there was an error */\n setUserHasClicked(false)\n\n return toast.push({\n status: 'error',\n title: `Error creating translation`,\n description: err.message,\n })\n })\n }, [\n client,\n documentId,\n language.id,\n language.title,\n languageField,\n metadata?._createdAt,\n metadataId,\n schemaType,\n source,\n sourceLanguageId,\n toast,\n weakReferences,\n callback,\n ])","<Box padding={2}>\n <Text muted size={1}>\n {message}\n </Text>\n </Box>","['right', 'left']","disabled && !current ? (\n <Spinner />\n ) : (\n <Text size={2}>\n {translation ? <SplitVerticalIcon /> : current ? <CheckmarkIcon /> : <AddIcon />}\n </Text>\n )","<Box flex={1}>\n <Text>{language.title}</Text>\n </Box>","<Badge tone={disabled || current ? `default` : `primary`}>{language.id}</Badge>","disabled || current ? `default` : `primary`","<Flex gap={3} align=\"center\">\n {disabled && !current ? (\n <Spinner />\n ) : (\n <Text size={2}>\n {translation ? <SplitVerticalIcon /> : current ? <CheckmarkIcon /> : <AddIcon />}\n </Text>\n )}\n <Box flex={1}>\n <Text>{language.title}</Text>\n </Box>\n <Badge tone={disabled || current ? `default` : `primary`}>{language.id}</Badge>\n </Flex>","<Button\n onClick={translation ? handleOpen : handleCreate}\n mode={current && disabled ? `default` : `bleed`}\n disabled={disabled}\n >\n <Flex gap={3} align=\"center\">\n {disabled && !current ? (\n <Spinner />\n ) : (\n <Text size={2}>\n {translation ? <SplitVerticalIcon /> : current ? <CheckmarkIcon /> : <AddIcon />}\n </Text>\n )}\n <Box flex={1}>\n <Text>{language.title}</Text>\n </Box>\n <Badge tone={disabled || current ? `default` : `primary`}>{language.id}</Badge>\n </Flex>\n </Button>","translation ? handleOpen : handleCreate","current && disabled ? `default` : `bleed`","<Tooltip\n animate\n content={\n <Box padding={2}>\n <Text muted size={1}>\n {message}\n </Text>\n </Box>\n }\n fallbackPlacements={['right', 'left']}\n placement=\"top\"\n portal\n >\n <Button\n onClick={translation ? handleOpen : handleCreate}\n mode={current && disabled ? `default` : `bleed`}\n disabled={disabled}\n >\n <Flex gap={3} align=\"center\">\n {disabled && !current ? (\n <Spinner />\n ) : (\n <Text size={2}>\n {translation ? <SplitVerticalIcon /> : current ? <CheckmarkIcon /> : <AddIcon />}\n </Text>\n )}\n <Box flex={1}>\n <Text>{language.title}</Text>\n </Box>\n <Badge tone={disabled || current ? `default` : `primary`}>{language.id}</Badge>\n </Flex>\n </Button>\n </Tooltip>","{apiVersion}","() => {\n if (!source) {\n throw new Error(`Cannot patch missing document`)\n }\n\n const currentId = source._id\n\n client\n .patch(currentId)\n .set({[languageField]: language.id})\n .commit()\n .then(() => {\n toast.push({\n title: `Set document language to ${language.title}`,\n status: `success`,\n })\n return undefined\n })\n .catch((err: unknown) => {\n console.error(err)\n\n return toast.push({\n title: `Failed to set document language to ${language.title}`,\n status: `error`,\n })\n })\n }","id","title","useCallback(() => {\n if (!source) {\n throw new Error(`Cannot patch missing document`)\n }\n\n const currentId = source._id\n\n client\n .patch(currentId)\n .set({[languageField]: language.id})\n .commit()\n .then(() => {\n toast.push({\n title: `Set document language to ${language.title}`,\n status: `success`,\n })\n return undefined\n })\n .catch((err: unknown) => {\n console.error(err)\n\n return toast.push({\n title: `Failed to set document language to ${language.title}`,\n status: `error`,\n })\n })\n }, [source, client, languageField, language, toast])","<Text size={2}>\n <EditIcon />\n </Text>","<Box flex={1}>\n <Text>{language.title}</Text>\n </Box>","<Badge>{language.id}</Badge>","<Flex gap={3} align=\"center\">\n <Text size={2}>\n <EditIcon />\n </Text>\n <Box flex={1}>\n <Text>{language.title}</Text>\n </Box>\n <Badge>{language.id}</Badge>\n </Flex>","<Button mode=\"bleed\" onClick={handleClick} disabled={disabled} justify=\"flex-start\">\n <Flex gap={3} align=\"center\">\n <Text size={2}>\n <EditIcon />\n </Text>\n <Box flex={1}>\n <Text>{language.title}</Text>\n </Box>\n <Badge>{language.id}</Badge>\n </Flex>\n </Button>","{children}: {children: React.ReactNode}","{maxWidth: 280}","<Box style={{maxWidth: 280}}>{children}</Box>","{children}: PropsWithChildren","<Card tone=\"caution\" padding={3}>\n <Flex justify=\"center\">\n <ConstrainedBox>\n <Text size={1} align=\"center\">\n {children}\n </Text>\n </ConstrainedBox>\n </Flex>\n </Card>","(event: ChangeEvent<HTMLInputElement>) => {\n if (event.currentTarget.value) {\n setQuery(event.currentTarget.value)\n } else {\n setQuery(``)\n }\n }","useCallback((event: ChangeEvent<HTMLInputElement>) => {\n if (event.currentTarget.value) {\n setQuery(event.currentTarget.value)\n } else {\n setQuery(``)\n }\n }, [])","() => setOpen((o) => !o)","(o) => !o","useCallback(() => setOpen((o) => !o), [])","() => setOpen(false)","useCallback(() => setOpen(false), [])","() => [buttonRef.current, popoverRef.current]","useMemo(() => {\n if (loading) {\n return null\n }\n\n // Once created, these two values should be the same anyway\n return metadata?._id ?? uuid()\n }, [loading, metadata?._id])","metadata?._id ?? uuid()","_id","supportedLanguages.some((l) => l.id === sourceLanguageId)","(l) => l.id === sourceLanguageId","supportedLanguages.every((l) => l.id && l.title)","(l) => l.id && l.title","useMemo(() => {\n const valid = supportedLanguages.every((l) => l.id && l.title)\n if (!valid) {\n console.warn(\n `Not all languages are valid. It should be an array of objects with an \"id\" and \"title\" property. Or a function that returns an array of objects with an \"id\" and \"title\" property.`,\n supportedLanguages,\n )\n }\n\n return valid\n }, [supportedLanguages])","<Box padding={1}>\n {error ? (\n <Card tone=\"critical\" padding={1}>\n <Text>There was an error returning translations metadata</Text>\n </Card>\n ) : (\n <Stack gap={1}>\n <LanguageManage\n id={metadata?._id}\n documentId={documentId}\n metadataId={metadataId}\n schemaType={schemaType}\n sourceLanguageId={sourceLanguageId}\n />\n {supportedLanguages.length > 4 ? (\n <TextInput onChange={handleQuery} value={query} placeholder=\"Filter languages\" />\n ) : null}\n {supportedLanguages.length > 0 ? (\n <>\n {/* Once metadata is loaded, there may be issues */}\n {loading ? null : (\n <>\n {/* Not all languages are valid */}\n {data && documentIsInOneMetadataDocument ? null : (\n <Warning>\n {/* TODO: Surface these documents to the user */}\n This document has been found in more than one Translations Metadata document\n </Warning>\n )}\n {/* Not all languages are valid */}\n {allLanguagesAreValid ? null : (\n <Warning>Not all language objects are valid. See the console.</Warning>\n )}\n {/* Current document has no language field */}\n {sourceLanguageId ? null : (\n <Warning>\n Choose a language to apply to <strong>this Document</strong>\n </Warning>\n )}\n {/* Current document has an invalid language field */}\n {sourceLanguageId && !sourceLanguageIsValid ? (\n <Warning>\n Select a supported language. Current language value:{' '}\n <code>{sourceLanguageId}</code>\n </Warning>\n ) : null}\n </>\n )}\n {supportedLanguages\n .filter((language) => {\n if (query) {\n return language.title.toLowerCase().includes(query.toLowerCase())\n }\n return true\n })\n .map((language) =>\n !loading && sourceLanguageId && sourceLanguageIsValid ? (\n // Button to duplicate this document to a new translation\n // And either create or update the metadata document\n <LanguageOption\n key={language.id}\n language={language}\n schemaType={schemaType}\n documentId={documentId}\n disabled={!allLanguagesAreValid}\n current={language.id === sourceLanguageId}\n metadata={metadata}\n metadataId={metadataId}\n source={source}\n sourceLanguageId={sourceLanguageId}\n />\n ) : (\n // Button to set a language field on *this* document\n <LanguagePatch\n key={language.id}\n source={source}\n language={language}\n // Only allow language patch change to:\n // - Keys not in metadata\n // - The key of this document in the metadata\n disabled={\n (loading ||\n !allLanguagesAreValid ||\n metadata?.translations\n .filter((t) => t?.value?._ref !== documentId)\n .some((t) => t[LANGUAGE_FIELD_NAME] === language.id)) ??\n false\n }\n />\n ),\n )}\n </>\n ) : null}\n </Stack>\n )}\n </Box>","metadata?._id","supportedLanguages.length","language","t","<Button\n text=\"Translations\"\n mode=\"bleed\"\n disabled={!source}\n tone={!source || loading || !issueWithTranslations ? undefined : `caution`}\n icon={TranslateIcon}\n onClick={handleClick}\n ref={buttonRef}\n selected={open}\n data-testid=\"document-internationalization-menu\"\n />","!source","!source || loading || !issueWithTranslations ? undefined : `caution`","<Popover\n animate\n constrainSize\n content={content}\n open={open}\n portal\n ref={popoverRef}\n overflow=\"auto\"\n tone=\"default\"\n >\n <Button\n text=\"Translations\"\n mode=\"bleed\"\n disabled={!source}\n tone={!source || loading || !issueWithTranslations ? undefined : `caution`}\n icon={TranslateIcon}\n onClick={handleClick}\n ref={buttonRef}\n selected={open}\n data-testid=\"document-internationalization-menu\"\n />\n </Popover>","l","() => setDialogOpen(false)","useCallback(() => setDialogOpen(false), [])","doc && Array.isArray(doc[TRANSLATIONS_ARRAY_NAME])\n ? // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion\n (doc[TRANSLATIONS_ARRAY_NAME] as TranslationReference[])\n : []","useMemo(\n () =>\n doc && Array.isArray(doc[TRANSLATIONS_ARRAY_NAME])\n ? // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion\n (doc[TRANSLATIONS_ARRAY_NAME] as TranslationReference[])\n : [],\n [doc],\n )","{apiVersion: API_VERSION}","() => {\n const tx = client.transaction()\n\n tx.patch(documentId, (patch) => patch.unset([TRANSLATIONS_ARRAY_NAME]))\n\n if (translations.length > 0) {\n translations.forEach((translation) => {\n tx.delete(translation.value._ref)\n tx.delete(`drafts.${translation.value._ref}`)\n })\n }\n\n tx.delete(documentId)\n // Shouldn't exist as this document type is in liveEdit\n tx.delete(`drafts.${documentId}`)\n\n tx.commit()\n .then(() => {\n onClose()\n\n toast.push({\n status: 'success',\n title: 'Deleted document and translations',\n })\n return undefined\n })\n .catch((err: Error) => {\n toast.push({\n status: 'error',\n title: 'Failed to delete document and translations',\n description: err.message,\n })\n })\n }","translations.length","(patch) => patch.unset([TRANSLATIONS_ARRAY_NAME])","useCallback(() => {\n const tx = client.transaction()\n\n tx.patch(documentId, (patch) => patch.unset([TRANSLATIONS_ARRAY_NAME]))\n\n if (translations.length > 0) {\n translations.forEach((translation) => {\n tx.delete(translation.value._ref)\n tx.delete(`drafts.${translation.value._ref}`)\n })\n }\n\n tx.delete(documentId)\n // Shouldn't exist as this document type is in liveEdit\n tx.delete(`drafts.${documentId}`)\n\n tx.commit()\n .then(() => {\n onClose()\n\n toast.push({\n status: 'success',\n title: 'Deleted document and translations',\n })\n return undefined\n })\n .catch((err: Error) => {\n toast.push({\n status: 'error',\n title: 'Failed to delete document and translations',\n description: err.message,\n })\n })\n }, [client, translations, documentId, onClose, toast])","() => {\n setDialogOpen(true)\n }","isDialogOpen && {\n type: 'confirm',\n onCancel: onClose,\n onConfirm: () => {\n onProceed()\n onClose()\n },\n tone: 'critical',\n message:\n translations.length === 1\n ? `Delete 1 translation and this document`\n : `Delete all ${translations.length} translations and this document`,\n }","{\n label: `Delete all translations`,\n disabled: !doc || !translations.length,\n icon: TrashIcon,\n tone: 'critical',\n onHandle: () => {\n setDialogOpen(true)\n },\n dialog: isDialogOpen && {\n type: 'confirm',\n onCancel: onClose,\n onConfirm: () => {\n onProceed()\n onClose()\n },\n tone: 'critical',\n message:\n translations.length === 1\n ? `Delete 1 translation and this document`\n : `Delete all ${translations.length} translations and this document`,\n },\n }","!doc || !translations.length","validation = []","!isValidating && validation.some((item) => item.level === 'error')","(item) => item.level === 'error'","useMemo(() => {\n return !isValidating && validation.some((item) => item.level === 'error')\n }, [isValidating, validation])","() => {\n if (validationHasErrors) {\n addInvalidId(id)\n } else {\n removeInvalidId(id)\n }\n\n if (editState.draft) {\n addDraftId(id)\n } else {\n removeDraftId(id)\n }\n\n if (!isValidating) {\n onCheckComplete(id)\n }\n }","[\n addDraftId,\n addInvalidId,\n editState.draft,\n id,\n isValidating,\n onCheckComplete,\n removeDraftId,\n removeInvalidId,\n validationHasErrors,\n ]","draft","schema.get(editState.draft._type)","_type","editState.draft && schemaType ? (\n <Preview layout=\"default\" value={editState.draft} schemaType={schemaType} />\n ) : (\n <Spinner />\n )","<Card border padding={2} tone={validationHasErrors ? `critical` : `positive`}>\n {editState.draft && schemaType ? (\n <Preview layout=\"default\" value={editState.draft} schemaType={schemaType} />\n ) : (\n <Spinner />\n )}\n </Card>","validationHasErrors ? `critical` : `positive`","children ? (\n <>{children}</>\n ) : (\n <Box padding={2}>\n <Text size={1}>{text}</Text>\n </Box>\n )","<Icon />","<TextWithTone tone={tone} size={1}>\n <Icon />\n </TextWithTone>","<Tooltip\n animate\n portal\n content={\n children ? (\n <>{children}</>\n ) : (\n <Box padding={2}>\n <Text size={1}>{text}</Text>\n </Box>\n )\n }\n >\n <TextWithTone tone={tone} size={1}>\n <Icon />\n </TextWithTone>\n </Tooltip>","{maxWidth: 250}","<Box>\n <Text size={1}>Bulk publishing uses the Scheduling API.</Text>\n </Box>","<Box>\n <Text size={1}>\n Customized Document Actions in the Studio will not execute. Webhooks will execute.\n </Text>\n </Box>","<InfoIcon icon={InfoOutlineIcon} tone=\"primary\">\n <Stack padding={3} gap={4} style={{maxWidth: 250}}>\n <Box>\n <Text size={1}>Bulk publishing uses the Scheduling API.</Text>\n </Box>\n <Box>\n <Text size={1}>\n Customized Document Actions in the Studio will not execute. Webhooks will execute.\n </Text>\n </Box>\n <Box>\n <Text size={1}>\n Validation is checked before rendering the button below, but the Scheduling API will not\n check for – or enforce – validation.\n </Text>\n </Box>\n </Stack>\n </InfoIcon>","{apiVersion: API_VERSION}","[]","(id: string) => {\n setCheckedIds((ids) => Array.from(new Set([...ids, id])))\n }","useCallback((id: string) => {\n setCheckedIds((ids) => Array.from(new Set([...ids, id])))\n }, [])","() => setOpen(true)","useCallback(() => setOpen(true), [])","() => setOpen(false)","useCallback(() => setOpen(false), [])","(id: string) => {\n setInvalidIds((ids) => (ids ? Array.from(new Set([...ids, id])) : [id]))\n }","ids","id","useCallback((id: string) => {\n setInvalidIds((ids) => (ids ? Array.from(new Set([...ids, id])) : [id]))\n }, [])","(id: string) => {\n setInvalidIds((ids) => (ids ? ids.filter((i) => i !== id) : []))\n }","useCallback((id: string) => {\n setInvalidIds((ids) => (ids ? ids.filter((i) => i !== id) : []))\n }, [])","(id: string) => {\n setDraftIds((ids) => Array.from(new Set([...ids, id])))\n }","useCallback((id: string) => {\n setDraftIds((ids) => Array.from(new Set([...ids, id])))\n }, [])","(id: string) => {\n setDraftIds((ids) => ids.filter((i) => i !== id))\n }","i","useCallback((id: string) => {\n setDraftIds((ids) => ids.filter((i) => i !== id))\n }, [])","() => {\n const body = translations.map((translation) => ({\n documentId: translation.value._ref,\n }))\n client\n .request({\n url: `/publish/${projectId}/${dataset}`,\n method: 'POST',\n body,\n })\n .then(() => {\n toast.push({\n status: 'success',\n title: 'Success',\n description: 'Bulk publish complete',\n })\n return undefined\n })\n .catch((err: Error) => {\n console.error(err)\n toast.push({\n status: 'error',\n title: 'Error',\n description: 'Bulk publish failed',\n })\n })\n }","(translation) => ({\n documentId: translation.value._ref,\n })","useCallback(() => {\n const body = translations.map((translation) => ({\n documentId: translation.value._ref,\n }))\n client\n .request({\n url: `/publish/${projectId}/${dataset}`,\n method: 'POST',\n body,\n })\n .then(() => {\n toast.push({\n status: 'success',\n title: 'Success',\n description: 'Bulk publish complete',\n })\n return undefined\n })\n .catch((err: Error) => {\n console.error(err)\n toast.push({\n status: 'error',\n title: 'Error',\n description: 'Bulk publish failed',\n })\n })\n }, [translations, client, projectId, dataset, toast])","translations?.length > 0 ? (\n <Card padding={4} border radius={2}>\n <Stack gap={3}>\n <Inline gap={3}>\n <Text weight=\"bold\" size={1}>\n Bulk publishing\n </Text>\n <Info />\n </Inline>\n\n <Stack>\n <Button onClick={onOpen} text=\"Prepare bulk publishing\" mode=\"ghost\" />\n </Stack>\n\n {open && (\n <Dialog\n animate\n header=\"Bulk publishing\"\n id=\"bulk-publish-dialog\"\n onClose={onClose}\n zOffset={1000}\n width={3}\n >\n <Stack gap={4} padding={4}>\n {draftIds.length > 0 ? (\n <Stack gap={2}>\n <Text size={1}>\n There{' '}\n {draftIds.length === 1\n ? `is 1 draft document`\n : `are ${draftIds.length} draft documents`}\n .\n </Text>\n {invalidIds && invalidIds.length > 0 ? (\n <TextWithTone tone=\"critical\" size={1}>\n {invalidIds.length === 1\n ? `1 draft document has`\n : `${invalidIds.length} draft documents have`}{' '}\n validation issues that must be addressed first\n </TextWithTone>\n ) : (\n <TextWithTone tone=\"positive\" size={1}>\n All drafts are valid and can be bulk published\n </TextWithTone>\n )}\n </Stack>\n ) : null}\n\n <Stack gap={1}>\n {translations\n .filter((translation) => translation?.value?._ref)\n .map((translation) => (\n <DocumentCheck\n key={translation._key}\n id={translation.value._ref}\n onCheckComplete={onCheckComplete}\n addInvalidId={addInvalidId}\n removeInvalidId={removeInvalidId}\n addDraftId={addDraftId}\n removeDraftId={removeDraftId}\n />\n ))}\n </Stack>\n {draftIds.length > 0 ? (\n <Button\n mode=\"ghost\"\n tone={invalidIds && invalidIds?.length > 0 ? 'caution' : 'positive'}\n text={\n draftIds.length === 1\n ? `Publish draft document`\n : `Bulk publish ${draftIds.length} draft documents`\n }\n onClick={handleBulkPublish}\n disabled={disabled}\n />\n ) : (\n <Text muted size={1}>\n No draft documents to publish\n </Text>\n )}\n </Stack>\n </Dialog>\n )}\n </Stack>\n </Card>\n ) : null","draftIds.length","translations?.length","(translation) => translation?.value?._ref","translation","() => {\n if (\n // We have a reference\n translation.value._ref &&\n // It's still weak and not-yet-strengthened\n translation.value._weak &&\n // We also want to keep this check because maybe the user *configured* weak refs\n translation.value._strengthenOnPublish &&\n !loading &&\n publishedDocument &&\n // The metadata pane is ready to accept patches\n ready &&\n !formState?.readOnly\n ) {\n const referencePathBase = ['translations', {_key: translation._key}, 'value']\n\n onChange(\n new PatchEvent([\n unset([...referencePathBase, '_weak']),\n unset([...referencePathBase, '_strengthenOnPublish']),\n ]),\n )\n }\n }","readOnly","_key","_ref","_strengthenOnPublish","_weak","[\n formState?.readOnly,\n loading,\n onChange,\n publishedDocument,\n ready,\n translation._key,\n translation.value._ref,\n translation.value._strengthenOnPublish,\n translation.value._weak,\n ]","formState?.readOnly","translations = []","translations.map((translation) =>\n translation.value._strengthenOnPublish?.type ? (\n <ReferencePatcher key={translation._key} translation={translation} />\n ) : null,\n )","(translation) =>\n translation.value._strengthenOnPublish?.type ? (\n <ReferencePatcher key={translation._key} translation={translation} />\n ) : null","<>\n {translations.map((translation) =>\n translation.value._strengthenOnPublish?.type ? (\n <ReferencePatcher key={translation._key} translation={translation} />\n ) : null,\n )}\n </>"],"sources":["../src/components/DeleteTranslationDialog/DocumentPreview.tsx","../src/constants.ts","../src/components/DeleteTranslationDialog/separateReferences.ts","../src/components/DeleteTranslationDialog/index.tsx","../src/components/DeleteTranslationFooter.tsx","../src/components/DocumentInternationalizationContext.tsx","../src/actions/DeleteTranslationAction.tsx","../src/hooks/useLanguageMetadata.tsx","../src/i18n/index.ts","../src/actions/DuplicateWithTranslationsAction.tsx","../src/hooks/useOpenInNewPane.tsx","../src/utils/createReference.ts","../src/components/LanguageManage.tsx","../src/utils/excludePaths.ts","../src/components/LanguageOption.tsx","../src/components/LanguagePatch.tsx","../src/components/ConstrainedBox.tsx","../src/components/Warning.tsx","../src/components/DocumentInternationalizationMenu.tsx","../src/actions/DeleteMetadataAction.tsx","../src/badges/index.tsx","../src/components/BulkPublish/DocumentCheck.tsx","../src/components/BulkPublish/InfoIcon.tsx","../src/components/BulkPublish/Info.tsx","../src/components/BulkPublish/index.tsx","../src/components/OptimisticallyStrengthen/ReferencePatcher.tsx","../src/components/OptimisticallyStrengthen/index.tsx","../src/schema/translation/metadata.ts","../src/plugin.tsx"],"sourcesContent":["import {Preview, useSchema} from 'sanity'\nimport {Feedback} from 'sanity-plugin-utils'\n\ntype DocumentPreviewProps = {\n value: unknown\n type: string\n}\n\n// Wrapper of Preview just so that the schema type is satisfied by schema.get()\nexport default function DocumentPreview(props: DocumentPreviewProps) {\n const schema = useSchema()\n\n const schemaType = schema.get(props.type)\n if (!schemaType) {\n return <Feedback tone=\"critical\" title=\"Schema type not found\" />\n }\n\n return <Preview value={props.value} schemaType={schemaType} />\n}\n","import type {PluginConfigContext} from './types'\n\nexport const METADATA_SCHEMA_NAME = `translation.metadata`\nexport const TRANSLATIONS_ARRAY_NAME = `translations`\nexport const API_VERSION = `2025-02-19`\nexport const DEFAULT_CONFIG: PluginConfigContext = {\n supportedLanguages: [],\n schemaTypes: [],\n languageField: `language`,\n weakReferences: false,\n bulkPublish: false,\n metadataFields: [],\n apiVersion: API_VERSION,\n allowCreateMetaDoc: false,\n callback: null,\n hideLanguageFilter: false,\n metadataOmnisearchVisibility: true,\n addTemplates: true,\n}\n","import type {SanityDocument} from 'sanity'\n\nimport {METADATA_SCHEMA_NAME} from '../../constants'\n\n/**\n * Splits an array of referring documents into two groups: translation metadata\n * documents (whose `_type` matches the metadata schema name) and all other\n * references. Used by the delete-translation dialog to show which metadata\n * entries will be patched versus which external references may block deletion.\n */\nexport function separateReferences(data: SanityDocument[] | null = []): {\n translations: SanityDocument[]\n otherReferences: SanityDocument[]\n} {\n const translations: SanityDocument[] = []\n const otherReferences: SanityDocument[] = []\n\n if (data && data.length > 0) {\n data.forEach((doc) => {\n if (doc._type === METADATA_SCHEMA_NAME) {\n translations.push(doc)\n } else {\n otherReferences.push(doc)\n }\n })\n }\n\n return {translations, otherReferences}\n}\n","import {Card, Flex, Spinner, Stack, Text} from '@sanity/ui'\nimport {useEffect, useMemo} from 'react'\nimport type {SanityDocument} from 'sanity'\nimport {useListeningQuery} from 'sanity-plugin-utils'\n\nimport type {MetadataDocument} from '../../types'\nimport DocumentPreview from './DocumentPreview'\nimport {separateReferences} from './separateReferences'\n\ntype DeleteTranslationDialogProps = {\n doc: SanityDocument\n documentId: string\n setTranslations: (translations: MetadataDocument[]) => void\n}\n\nexport default function DeleteTranslationDialog(props: DeleteTranslationDialogProps) {\n const {doc, documentId, setTranslations} = props\n\n // Get all references and check if any of them are translations metadata\n const {data, loading} = useListeningQuery<SanityDocument[]>(\n `*[references($id)]{_id, _type, translations}`,\n {\n params: {id: documentId},\n initialValue: [],\n },\n )\n const {translations, otherReferences} = useMemo(() => separateReferences(data), [data])\n\n useEffect(() => {\n // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion\n setTranslations(translations as MetadataDocument[])\n }, [setTranslations, translations])\n\n if (loading) {\n return (\n <Flex padding={4} align=\"center\" justify=\"center\">\n <Spinner />\n </Flex>\n )\n }\n\n return (\n <Stack gap={4}>\n {translations && translations.length > 0 ? (\n <Text>\n This document is a language-specific version which other translations depend on.\n </Text>\n ) : (\n <Text>This document does not have connected translations.</Text>\n )}\n <Card border padding={3}>\n <Stack gap={4}>\n <Text size={1} weight=\"semibold\">\n {translations && translations.length > 0 ? (\n <>Before this document can be deleted</>\n ) : (\n <>This document can now be deleted</>\n )}\n </Text>\n <DocumentPreview value={doc} type={doc._type} />\n {translations && translations.length > 0 ? (\n <>\n <Card borderTop />\n <Text size={1} weight=\"semibold\">\n The reference in{' '}\n {translations.length === 1\n ? `this translations document`\n : `these translations documents`}{' '}\n must be removed\n </Text>\n {translations.map((translation) => (\n <DocumentPreview\n key={translation._id}\n value={translation}\n type={translation._type}\n />\n ))}\n </>\n ) : null}\n {otherReferences && otherReferences.length > 0 ? (\n <>\n <Card borderTop />\n <Text size={1} weight=\"semibold\">\n {otherReferences.length === 1\n ? `There is an additional reference`\n : `There are additional references`}{' '}\n to this document\n </Text>\n {otherReferences.map((reference) => (\n <DocumentPreview key={reference._id} value={reference} type={reference._type} />\n ))}\n </>\n ) : null}\n </Stack>\n </Card>\n {otherReferences.length === 0 ? (\n <Text>This document has no other references.</Text>\n ) : (\n <Text>\n You may not be able to delete this document because other documents refer to it.\n </Text>\n )}\n </Stack>\n )\n}\n","import {Button, Grid} from '@sanity/ui'\n\ntype DeleteTranslationFooterProps = {\n translations: unknown[]\n onClose: () => void\n onProceed: () => void\n}\n\nexport default function DeleteTranslationFooter(props: DeleteTranslationFooterProps) {\n const {translations, onClose, onProceed} = props\n\n return (\n <Grid gridTemplateColumns={2} gap={2}>\n <Button text=\"Cancel\" onClick={onClose} mode=\"ghost\" />\n <Button\n text={\n translations && translations.length > 0\n ? `Unset translation reference`\n : `Delete document`\n }\n onClick={onProceed}\n tone=\"critical\"\n />\n </Grid>\n )\n}\n","import {createContext, use, useContext, useMemo} from 'react'\nimport type {LayoutProps} from 'sanity'\nimport {useClient, useWorkspace} from 'sanity'\n\nimport {DEFAULT_CONFIG} from '../constants'\nimport type {PluginConfig, PluginConfigContext} from '../types'\n\nconst DocumentInternationalizationContext = createContext<PluginConfigContext>(DEFAULT_CONFIG)\n\nexport function useDocumentInternationalizationContext(): PluginConfigContext {\n return useContext(DocumentInternationalizationContext)\n}\n\ntype DocumentInternationalizationProviderProps = LayoutProps & {\n pluginConfig: Required<Omit<PluginConfig, 'metadataInternationalization'>> &\n Pick<PluginConfig, 'metadataInternationalization'>\n}\n\n// Simple promise cache for React.use\nconst promiseCache = new Map<string, Promise<PluginConfigContext['supportedLanguages']>>()\n\nfunction createCacheKey(workspaceId: string): string {\n return `languages-${workspaceId}`\n}\n\nfunction createOrGetPromise(\n fn: () => Promise<PluginConfigContext['supportedLanguages']>,\n cacheKey: string,\n): Promise<PluginConfigContext['supportedLanguages']> {\n const cached = promiseCache.get(cacheKey)\n if (cached) {\n return cached\n }\n const promise = fn()\n promiseCache.set(cacheKey, promise)\n return promise\n}\n\n/**\n * This Provider wraps the Studio and provides the DocumentInternationalization context to document actions and components.\n */\nexport function DocumentInternationalizationProvider(\n props: DocumentInternationalizationProviderProps,\n): React.JSX.Element {\n const {pluginConfig} = props\n\n const client = useClient({apiVersion: pluginConfig.apiVersion})\n const workspace = useWorkspace()\n\n // Use a stable workspace identifier\n const workspaceId = useMemo(() => workspace.name ?? '', [workspace])\n\n // Create cache key for promise caching\n const cacheKey = useMemo(() => createCacheKey(workspaceId), [workspaceId])\n\n // Fetch or return languages\n const languagesPromise = useMemo(() => {\n if (Array.isArray(pluginConfig.supportedLanguages)) {\n return null // Return null for synchronous arrays\n }\n\n // Create or get cached promise for React.use\n return createOrGetPromise(async () => {\n if (typeof pluginConfig.supportedLanguages === 'function') {\n return pluginConfig.supportedLanguages(client)\n }\n return pluginConfig.supportedLanguages\n }, cacheKey)\n }, [pluginConfig, client, cacheKey])\n\n // Use React.use to handle the promise with Suspense, or return array directly\n const supportedLanguages = languagesPromise\n ? use(languagesPromise)\n : // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion\n (pluginConfig.supportedLanguages as PluginConfigContext['supportedLanguages'])\n\n const contextValue = useMemo(\n () => ({...pluginConfig, supportedLanguages}),\n [pluginConfig, supportedLanguages],\n )\n\n return (\n <DocumentInternationalizationContext.Provider value={contextValue}>\n {props.renderDefault(props)}\n </DocumentInternationalizationContext.Provider>\n )\n}\n","import {TrashIcon} from '@sanity/icons/Trash'\nimport {useToast} from '@sanity/ui/toast'\nimport {useCallback, useState} from 'react'\nimport {useClient, type DocumentActionDescription, type DocumentActionProps} from 'sanity'\nimport {LANGUAGE_FIELD_NAME} from 'sanity-plugin-internationalized-array'\n\nimport DeleteTranslationDialog from '../components/DeleteTranslationDialog'\nimport DeleteTranslationFooter from '../components/DeleteTranslationFooter'\nimport {useDocumentInternationalizationContext} from '../components/DocumentInternationalizationContext'\nimport {API_VERSION, TRANSLATIONS_ARRAY_NAME} from '../constants'\nimport {type MetadataDocument} from '../types'\n\ntype DeleteOperation = 'DELETE' | 'UNSET'\n\n/**\n * Optional Document action that removes a single translation from the metadata document\n * and optionally deletes the translation document. Opens a confirmation dialog\n * showing which metadata entries reference the document and any other references\n * that may exist. When the document has translation references, those references\n * are unset; otherwise the document is deleted directly.\n *\n * To use it, you need to add it to the document actions config\n * ```\n * const translatedSchemaTypes = ['lesson', 'article'];\n * document: {\n * actions: (prev, {schemaType}) => {\n * if (translatedSchemaTypes.includes(schemaType)) {\n * return [...prev, useDeleteTranslationAction]\n * }\n * return prev\n * },\n * },\n * ```\n */\nexport const useDeleteTranslationAction = (\n props: DocumentActionProps,\n): DocumentActionDescription => {\n const {id: documentId, published, draft} = props\n const doc = draft || published\n const {languageField} = useDocumentInternationalizationContext()\n\n const [isDialogOpen, setDialogOpen] = useState(false)\n const [translations, setTranslations] = useState<MetadataDocument[]>([])\n const onClose = useCallback(() => setDialogOpen(false), [])\n const rawDocumentLanguage = doc ? doc[languageField] : null\n const documentLanguage = typeof rawDocumentLanguage === 'string' ? rawDocumentLanguage : null\n\n const toast = useToast()\n const client = useClient({apiVersion: API_VERSION})\n // Remove translation reference and delete document in one transaction\n const onProceed = useCallback(() => {\n const tx = client.transaction()\n let operation: DeleteOperation = 'DELETE'\n\n if (documentLanguage && translations.length > 0) {\n operation = 'UNSET'\n translations.forEach((translation) => {\n tx.patch(translation._id, (patch) =>\n patch.unset([\n `${TRANSLATIONS_ARRAY_NAME}[${LANGUAGE_FIELD_NAME} == \"${documentLanguage}\"]`,\n ]),\n )\n })\n } else {\n tx.delete(documentId)\n tx.delete(`drafts.${documentId}`)\n }\n\n tx.commit()\n .then(() => {\n if (operation === 'DELETE') {\n onClose()\n }\n toast.push({\n status: 'success',\n title: operation === 'UNSET' ? 'Translation reference unset' : 'Document deleted',\n description: operation === 'UNSET' ? 'The document can now be deleted' : null,\n })\n return undefined\n })\n .catch((err: Error) => {\n toast.push({\n status: 'error',\n title:\n operation === 'UNSET'\n ? 'Failed to unset translation reference'\n : 'Failed to delete document',\n description: err.message,\n })\n })\n }, [client, documentLanguage, translations, documentId, onClose, toast])\n\n return {\n label: `Delete translation...`,\n disabled: !doc || !documentLanguage,\n icon: TrashIcon,\n tone: 'critical',\n onHandle: () => {\n setDialogOpen(true)\n },\n dialog: isDialogOpen && {\n type: 'dialog',\n onClose,\n header: 'Delete translation',\n content: doc ? (\n <DeleteTranslationDialog\n doc={doc}\n documentId={documentId}\n setTranslations={setTranslations}\n />\n ) : null,\n footer: (\n <DeleteTranslationFooter\n onClose={onClose}\n onProceed={onProceed}\n translations={translations}\n />\n ),\n },\n }\n}\n\nuseDeleteTranslationAction.action = 'deleteTranslation'\nuseDeleteTranslationAction.displayName = 'DeleteTranslationAction'\n\n/**\n * @deprecated use useDeleteTranslationAction instead\n * Will be removed in the next major version\n */\nexport const DeleteTranslationAction = (props: DocumentActionProps): DocumentActionDescription => {\n return useDeleteTranslationAction(props)\n}\n","import {useListeningQuery} from 'sanity-plugin-utils'\n\nimport {METADATA_SCHEMA_NAME} from '../constants'\nimport type {Metadata} from '../types'\n\n// Using references() seemed less reliable for updating the listener\n// results than querying raw values in the array\n// AFAIK: references is _faster_ when querying with GROQ\n// const query = `*[_type == $translationSchema && references($id)]`\nconst query = `*[_type == $translationSchema && $id in translations[].value._ref]{\n _id,\n _createdAt,\n translations\n}`\n\nexport function useTranslationMetadata(id: string): {\n data: Metadata[] | null\n loading: boolean\n error: unknown\n} {\n const {data, loading, error} = useListeningQuery<Metadata[]>(query, {\n params: {id, translationSchema: METADATA_SCHEMA_NAME},\n })\n\n return {data, loading, error}\n}\n","import {defineLocaleResourceBundle} from 'sanity'\n\n/**\n * The locale namespace for the document internationalization plugin.\n *\n * @public\n */\nexport const documenti18nLocaleNamespace = 'document-internationalization' as const\n\n/**\n * The default locale bundle for the document internationalization plugin, which is US English.\n *\n * @internal\n */\nexport const documentInternationalizationUsEnglishLocaleBundle = defineLocaleResourceBundle({\n locale: 'en-US',\n namespace: documenti18nLocaleNamespace,\n resources: () => import('./resources'),\n})\n","import {CopyIcon} from '@sanity/icons/Copy'\nimport {useToast} from '@sanity/ui/toast'\nimport {uuid} from '@sanity/uuid'\nimport {useCallback, useMemo, useState} from 'react'\nimport {filter, firstValueFrom} from 'rxjs'\nimport {\n DEFAULT_STUDIO_CLIENT_OPTIONS,\n type Id,\n InsufficientPermissionsMessage,\n type PatchOperations,\n useClient,\n useCurrentUser,\n useDocumentOperation,\n useDocumentPairPermissions,\n useDocumentStore,\n useTranslation,\n type DocumentActionProps,\n type DocumentActionDescription,\n} from 'sanity'\nimport {LANGUAGE_FIELD_NAME} from 'sanity-plugin-internationalized-array'\nimport {useRouter} from 'sanity/router'\nimport {structureLocaleNamespace} from 'sanity/structure'\n\nimport {METADATA_SCHEMA_NAME, TRANSLATIONS_ARRAY_NAME} from '../constants'\nimport {useTranslationMetadata} from '../hooks/useLanguageMetadata'\nimport {documenti18nLocaleNamespace} from '../i18n'\n\n// Types for document store operations\ninterface EditOperations {\n duplicate: {disabled: string | false; execute: (id: string) => void}\n}\n\ninterface OperationSuccessEvent {\n op: string\n type: 'success' | 'error'\n}\n\nconst DISABLED_REASON_KEY = {\n METADATA_NOT_FOUND: 'action.duplicate.disabled.missing-metadata',\n MULTIPLE_METADATA: 'action.duplicate.disabled.multiple-metadata',\n NOTHING_TO_DUPLICATE: 'action.duplicate.disabled.nothing-to-duplicate',\n NOT_READY: 'action.duplicate.disabled.not-ready',\n TARGET_NOT_FOUND: 'action.duplicate.disabled.target-not-found',\n}\n\n/**\n * Optional Document action that duplicates a document along with all its translations\n * and the associated metadata document. The workflow duplicates each translated\n * document, duplicates the metadata document, patches the new metadata to\n * reference the new translation copies, and navigates to the duplicated document.\n * Disabled when the user lacks permissions, metadata is missing or ambiguous,\n * or the underlying duplicate operation is unavailable.\n */\nexport const useDuplicateWithTranslationsAction = ({\n id,\n type,\n /* oxlint-disable-next-line typescript-eslint/no-deprecated -- kept for backwards compatibility */\n onComplete,\n}: DocumentActionProps): DocumentActionDescription => {\n const documentStore = useDocumentStore()\n const {duplicate} = useDocumentOperation(id, type)\n const {navigateIntent} = useRouter()\n const [isDuplicating, setDuplicating] = useState(false)\n const [permissions, isPermissionsLoading] = useDocumentPairPermissions({\n id,\n type,\n permission: 'duplicate',\n })\n const {data, loading: isMetadataDocumentLoading} = useTranslationMetadata(id)\n const hasOneMetadataDocument = useMemo(() => {\n return Array.isArray(data) && data.length <= 1\n }, [data])\n const metadataDocument = Array.isArray(data) && data.length ? data[0] : null\n const client = useClient(DEFAULT_STUDIO_CLIENT_OPTIONS)\n const toast = useToast()\n const {t: s} = useTranslation(structureLocaleNamespace)\n const {t: d} = useTranslation(documenti18nLocaleNamespace)\n const currentUser = useCurrentUser()\n\n const handle = useCallback(() => {\n setDuplicating(true)\n\n // Async function that does the actual work\n async function performDuplication(): Promise<void> {\n if (!metadataDocument) {\n return Promise.reject(new Error('Metadata document not found'))\n }\n\n const translationsArray = metadataDocument[TRANSLATIONS_ARRAY_NAME]\n if (!translationsArray || translationsArray.length === 0) {\n return Promise.reject(new Error('No translations found in metadata document'))\n }\n\n // 1. Duplicate the document and its localized versions\n const translations = new Map<string, Id>()\n await Promise.all(\n // oxlint-disable-next-line consistent-return\n translationsArray.map(async (translation) => {\n const dupeId = uuid()\n const locale = translation[LANGUAGE_FIELD_NAME]\n const docId = translation.value?._ref\n\n if (typeof locale !== 'string' || locale.trim().length === 0) {\n return Promise.reject(new Error('Invalid locale for translation'))\n }\n if (!docId) {\n return Promise.reject(new Error('Translation document not found'))\n }\n\n const {duplicate: duplicateTranslation} = await firstValueFrom(\n documentStore.pair\n .editOperations(docId, type)\n .pipe(filter((op: EditOperations) => op.duplicate.disabled !== 'NOT_READY')),\n )\n\n if (duplicateTranslation.disabled) {\n return Promise.reject(new Error('Cannot duplicate document'))\n }\n\n const duplicateTranslationSuccess = firstValueFrom(\n documentStore.pair\n .operationEvents(docId, type)\n .pipe(\n filter((e: OperationSuccessEvent) => e.op === 'duplicate' && e.type === 'success'),\n ),\n )\n duplicateTranslation.execute(dupeId)\n await duplicateTranslationSuccess\n\n translations.set(locale, dupeId)\n }),\n )\n\n // 2. Duplicate the metadata document\n const {duplicate: duplicateMetadata} = await firstValueFrom(\n documentStore.pair\n .editOperations(metadataDocument._id, METADATA_SCHEMA_NAME)\n .pipe(filter((op: EditOperations) => op.duplicate.disabled !== 'NOT_READY')),\n )\n\n if (duplicateMetadata.disabled) {\n return Promise.reject(new Error('Cannot duplicate document'))\n }\n\n const duplicateMetadataSuccess = firstValueFrom(\n documentStore.pair\n .operationEvents(metadataDocument._id, METADATA_SCHEMA_NAME)\n .pipe(filter((e: OperationSuccessEvent) => e.op === 'duplicate' && e.type === 'success')),\n )\n const dupeId = uuid()\n duplicateMetadata.execute(dupeId)\n await duplicateMetadataSuccess\n\n // 3. Patch the duplicated metadata document to update the references\n const patch: PatchOperations = {\n set: Object.fromEntries(\n Array.from(translations.entries()).map(([locale, documentId]) => {\n return [\n `${TRANSLATIONS_ARRAY_NAME}[${LANGUAGE_FIELD_NAME} == \"${locale}\"].value._ref`,\n documentId,\n ]\n }),\n ),\n }\n\n await client.transaction().patch(dupeId, patch).commit()\n\n // 4. Navigate to the duplicated document\n navigateIntent('edit', {\n id: Array.from(translations.values()).at(0),\n type,\n })\n\n onComplete()\n }\n\n // Execute and handle success/error\n performDuplication()\n .catch((error: unknown) => {\n console.error(error)\n toast.push({\n status: 'error',\n title: 'Error duplicating document',\n description: error instanceof Error ? error.message : 'Failed to duplicate document',\n })\n })\n .finally(() => {\n setDuplicating(false)\n })\n }, [client, documentStore.pair, metadataDocument, navigateIntent, onComplete, toast, type])\n\n return useMemo(() => {\n if (!isPermissionsLoading && !permissions?.granted) {\n return {\n icon: CopyIcon,\n disabled: true,\n label: d('action.duplicate.label'),\n title: (\n <InsufficientPermissionsMessage context=\"duplicate-document\" currentUser={currentUser} />\n ),\n }\n }\n\n if (!isMetadataDocumentLoading && !metadataDocument) {\n return {\n icon: CopyIcon,\n disabled: true,\n label: d('action.duplicate.label'),\n title: d(DISABLED_REASON_KEY.METADATA_NOT_FOUND),\n }\n }\n\n if (!hasOneMetadataDocument) {\n return {\n icon: CopyIcon,\n disabled: true,\n label: d('action.duplicate.label'),\n title: d(DISABLED_REASON_KEY.MULTIPLE_METADATA),\n }\n }\n\n return {\n icon: CopyIcon,\n disabled:\n isDuplicating ||\n Boolean(duplicate.disabled) ||\n isPermissionsLoading ||\n isMetadataDocumentLoading,\n label: isDuplicating ? s('action.duplicate.running.label') : d('action.duplicate.label'),\n title: duplicate.disabled ? s(DISABLED_REASON_KEY[duplicate.disabled]) : '',\n onHandle: handle,\n }\n }, [\n currentUser,\n duplicate.disabled,\n handle,\n hasOneMetadataDocument,\n isDuplicating,\n isMetadataDocumentLoading,\n isPermissionsLoading,\n metadataDocument,\n permissions?.granted,\n s,\n d,\n ])\n}\n\nuseDuplicateWithTranslationsAction.action = 'duplicate'\nuseDuplicateWithTranslationsAction.displayName = 'DuplicateWithTranslationsAction'\n\n/**\n * @deprecated use useDuplicateWithTranslationsAction instead\n * Will be removed in the next major version\n */\nexport const DuplicateWithTranslationsAction = (\n props: DocumentActionProps,\n): DocumentActionDescription => {\n return useDuplicateWithTranslationsAction(props)\n}\n\n/* oxlint-disable-next-line typescript-eslint/no-deprecated -- re-exported for backwards compatibility */\nDuplicateWithTranslationsAction.action = 'duplicate'\n/* oxlint-disable-next-line typescript-eslint/no-deprecated -- re-exported for backwards compatibility */\nDuplicateWithTranslationsAction.displayName = 'DuplicateWithTranslationsAction'\n","import {useCallback} from 'react'\nimport {useRouter} from 'sanity/router'\nimport {usePaneRouter} from 'sanity/structure'\n\nexport function useOpenInNewPane(id?: string | null, type?: string): () => void {\n const router = useRouter()\n const {routerPanesState, groupIndex} = usePaneRouter()\n\n const openInNewPane = useCallback(() => {\n if (!id || !type) {\n return\n }\n\n // No panes open, function might be called outside Structure\n if (!routerPanesState.length) {\n router.navigateIntent('edit', {id, type})\n return\n }\n\n const panes = [...routerPanesState]\n panes.splice(groupIndex + 1, 0, [\n {\n id: id,\n params: {type},\n },\n ])\n\n const href = router.resolvePathFromState({panes})\n router.navigateUrl({path: href})\n }, [id, type, router, routerPanesState, groupIndex])\n\n return openInNewPane\n}\n","import {randomKey} from '@sanity/util/content'\nimport {LANGUAGE_FIELD_NAME} from 'sanity-plugin-internationalized-array'\n\nimport type {TranslationReference} from '../types'\n\n/**\n * Creates a translation reference object used in metadata documents to link\n * a language key to a document. References are created as weak by default,\n * with optional strengthen-on-publish metadata so the reference becomes\n * strong once the referenced document is published.\n */\nexport function createReference(\n language: string,\n ref: string,\n type: string,\n strengthenOnPublish: boolean = true,\n): TranslationReference {\n return {\n [LANGUAGE_FIELD_NAME]: language,\n _key: randomKey(),\n _type: 'internationalizedArrayReferenceValue',\n value: {\n _type: 'reference',\n _ref: ref,\n _weak: true,\n // If the user has configured weakReferences, we won't want to strengthen them\n ...(strengthenOnPublish ? {_strengthenOnPublish: {type}} : {}),\n },\n }\n}\n","import {CogIcon} from '@sanity/icons/Cog'\nimport {Box, Button, Stack, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {useCallback, useState} from 'react'\nimport {type ObjectSchemaType, useClient} from 'sanity'\n\nimport {METADATA_SCHEMA_NAME} from '../constants'\nimport {useOpenInNewPane} from '../hooks/useOpenInNewPane'\nimport {createReference} from '../utils/createReference'\nimport {useDocumentInternationalizationContext} from './DocumentInternationalizationContext'\n\ntype LanguageManageProps = {\n id?: string\n metadataId?: string | null\n schemaType: ObjectSchemaType\n documentId: string\n sourceLanguageId?: string\n}\n\n/**\n * Button component for opening or creating the translation metadata document.\n * When metadata already exists, clicking opens it in a new pane. When no\n * metadata exists and creation is allowed, clicking creates a new metadata\n * document with the source language reference and then opens it.\n */\nexport default function LanguageManage(props: LanguageManageProps) {\n const {id, metadataId, schemaType, documentId, sourceLanguageId} = props\n const open = useOpenInNewPane(id, METADATA_SCHEMA_NAME)\n const openCreated = useOpenInNewPane(metadataId, METADATA_SCHEMA_NAME)\n const {allowCreateMetaDoc, apiVersion, weakReferences} = useDocumentInternationalizationContext()\n const client = useClient({apiVersion})\n const [userHasClicked, setUserHasClicked] = useState(false)\n\n const canCreate = !id && Boolean(metadataId) && allowCreateMetaDoc\n\n const handleClick = useCallback(() => {\n if (!id && metadataId && sourceLanguageId) {\n /* Disable button while this request is pending */\n setUserHasClicked(true)\n\n // handle creation of meta document\n const transaction = client.transaction()\n\n const sourceReference = createReference(\n sourceLanguageId,\n documentId,\n schemaType.name,\n !weakReferences,\n )\n const newMetadataDocument = {\n _id: metadataId,\n _type: METADATA_SCHEMA_NAME,\n schemaTypes: [schemaType.name],\n translations: [sourceReference],\n }\n\n transaction.createIfNotExists(newMetadataDocument)\n\n transaction\n .commit()\n .then(() => {\n setUserHasClicked(false)\n openCreated()\n return undefined\n })\n .catch((err: unknown) => {\n console.error(err)\n setUserHasClicked(false)\n })\n } else {\n open()\n }\n }, [\n id,\n metadataId,\n sourceLanguageId,\n client,\n documentId,\n schemaType.name,\n weakReferences,\n openCreated,\n open,\n ])\n\n const disabled = (!id && !canCreate) || (canCreate && !sourceLanguageId) || userHasClicked\n\n return (\n <Tooltip\n animate\n content={\n <Box padding={2}>\n <Text muted size={1}>\n Document has no other translations\n </Text>\n </Box>\n }\n fallbackPlacements={['right', 'left']}\n placement=\"top\"\n portal\n disabled={Boolean(id) || canCreate}\n >\n <Stack>\n <Button\n disabled={disabled}\n mode=\"ghost\"\n text=\"Manage Translations\"\n icon={CogIcon}\n loading={userHasClicked}\n onClick={handleClick}\n />\n </Stack>\n </Tooltip>\n )\n}\n","import {extractWithPath, Mutation} from '@sanity/mutator'\nimport {\n isDocumentSchemaType,\n type ObjectSchemaType,\n type Path,\n pathToString,\n type SanityDocument,\n type SchemaType,\n} from 'sanity'\n\nexport interface DocumentMember {\n schemaType: SchemaType\n path: Path\n name: string\n value: unknown\n}\n\n/**\n * Removes fields from a document that are marked with the\n * `documentInternationalization.exclude` schema option. This is used when\n * duplicating a source document to create a translation, so that\n * language-specific or non-translatable fields are stripped from the copy.\n * Returns the document with excluded paths unset, or `null` if the input is null.\n */\nexport function removeExcludedPaths(\n doc: SanityDocument | null,\n schemaType: ObjectSchemaType,\n): SanityDocument | null {\n // If the supplied doc is null or the schemaType\n // isn't a document, return as is.\n if (!isDocumentSchemaType(schemaType) || !doc) {\n return doc\n }\n\n // The extractPaths function gets all the fields in the doc with\n // a value, along with their schemaTypes and paths. We'll end up\n // with an array of paths in string form which we want to exclude\n const pathsToExclude: string[] = extractPaths(doc, schemaType, [])\n // We filter for any fields which should be excluded from the document\n // duplicate action, based on the schemaType option being set.\n .filter((field) => field.schemaType?.options?.documentInternationalization?.exclude === true)\n // then we return the stringified version of the path\n .map((field) => {\n return pathToString(field.path)\n })\n\n // Now we can use the Mutation class from @sanity/mutator to patch the document\n // to remove all the paths that are for one of the excluded fields. This is just\n // done locally, and the documents themselves are not patched in the Content Lake.\n const mut = new Mutation({\n mutations: [\n {\n patch: {\n id: doc._id,\n unset: pathsToExclude,\n },\n },\n ],\n })\n\n // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion\n return mut.apply(doc) as SanityDocument\n}\n\nfunction extractPaths(\n doc: SanityDocument,\n schemaType: ObjectSchemaType,\n path: Path,\n): DocumentMember[] {\n const result: DocumentMember[] = []\n\n for (const field of schemaType.fields) {\n const fieldPath = [...path, field.name]\n const fieldSchema = field.type\n const {value} = extractWithPath(pathToString(fieldPath), doc)[0] ?? {}\n if (value === undefined || value === null) {\n continue\n }\n\n const thisFieldWithPath: DocumentMember = {\n path: fieldPath,\n name: field.name,\n schemaType: fieldSchema,\n value,\n }\n\n if (fieldSchema.jsonType === 'object') {\n const innerFields = extractPaths(doc, fieldSchema, fieldPath)\n result.push(thisFieldWithPath, ...innerFields)\n } else if (\n fieldSchema.jsonType === 'array' &&\n fieldSchema.of.length &&\n fieldSchema.of.some((item) => 'fields' in item)\n ) {\n const {value: arrayValue} = extractWithPath(pathToString(fieldPath), doc)[0] ?? {}\n\n result.push(thisFieldWithPath)\n // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion\n if ((arrayValue as unknown[])?.length) {\n // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion\n for (const item of arrayValue as Array<{\n _key?: string\n language?: string\n _type?: string\n }>) {\n if (!item._key) continue\n const itemPath = [...fieldPath, {_key: item._key}] as Path\n let itemSchema = fieldSchema.of.find((t) => t.name === item._type)\n if (!item._type) {\n itemSchema = fieldSchema.of[0]\n }\n if (itemSchema) {\n // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion\n const innerFields = extractPaths(doc, itemSchema as ObjectSchemaType, itemPath)\n const arrayMember: DocumentMember = {\n path: itemPath,\n name: item._key,\n schemaType: itemSchema,\n value: item,\n }\n result.push(arrayMember, ...innerFields)\n }\n }\n }\n } else {\n result.push(thisFieldWithPath)\n }\n }\n\n return result\n}\n","import {AddIcon} from '@sanity/icons/Add'\nimport {CheckmarkIcon} from '@sanity/icons/Checkmark'\nimport {SplitVerticalIcon} from '@sanity/icons/SplitVertical'\nimport {Badge, Box, Button, Flex, Spinner, Text} from '@sanity/ui'\nimport {useToast} from '@sanity/ui/toast'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {uuid} from '@sanity/uuid'\nimport {useCallback, useState} from 'react'\nimport {\n getDraftId,\n getVersionFromId,\n getVersionId,\n isVersionId,\n type ObjectSchemaType,\n type SanityDocument,\n useClient,\n} from 'sanity'\nimport {LANGUAGE_FIELD_NAME} from 'sanity-plugin-internationalized-array'\n\nimport {METADATA_SCHEMA_NAME} from '../constants'\nimport {useOpenInNewPane} from '../hooks/useOpenInNewPane'\nimport type {Language, Metadata, MetadataDocument, TranslationReference} from '../types'\nimport {createReference} from '../utils/createReference'\nimport {removeExcludedPaths} from '../utils/excludePaths'\nimport {useDocumentInternationalizationContext} from './DocumentInternationalizationContext'\n\ntype LanguageOptionProps = {\n language: Language\n schemaType: ObjectSchemaType\n documentId: string\n disabled: boolean\n current: boolean\n source: SanityDocument | null\n metadataId: string | null\n metadata?: Metadata | null\n sourceLanguageId?: string\n}\n\n/**\n * Button component representing a single language in the translations menu.\n * Displays the language name, an ID badge, and a contextual icon: checkmark\n * for the current language, split-vertical for existing translations, or add\n * for new translations. Clicking opens an existing translation in a new pane,\n * or creates a new translation document via a Sanity transaction.\n */\nexport default function LanguageOption(props: LanguageOptionProps) {\n const {\n language,\n schemaType,\n documentId,\n current,\n source,\n sourceLanguageId,\n metadata,\n metadataId,\n } = props\n /* When the user has clicked the Create button, the button should be disabled\n * to prevent double-clicks from firing onCreate twice. This creates duplicate\n * translation metadata entries, which editors will not be able to delete */\n const [userHasClicked, setUserHasClicked] = useState(false)\n const disabled =\n props.disabled || userHasClicked || current || !source || !sourceLanguageId || !metadataId\n const translation: TranslationReference | undefined = metadata?.translations.length\n ? metadata.translations.find((t) => t[LANGUAGE_FIELD_NAME] === language.id)\n : undefined\n const {apiVersion, languageField, weakReferences, callback} =\n useDocumentInternationalizationContext()\n const client = useClient({apiVersion})\n const toast = useToast()\n\n const open = useOpenInNewPane(translation?.value?._ref, schemaType.name)\n const handleOpen = useCallback(() => open(), [open])\n\n const handleCreate = useCallback(async () => {\n if (!source) {\n throw new Error(`Cannot create translation without source document`)\n }\n\n if (!sourceLanguageId) {\n throw new Error(`Cannot create translation without source language ID`)\n }\n\n if (!metadataId) {\n throw new Error(`Cannot create translation without a metadata ID`)\n }\n /* Disable the create button while this request is pending */\n setUserHasClicked(true)\n\n const transaction = client.transaction()\n\n // 1. Duplicate source document\n // If the source belongs to a release, create the translation\n // as a version in that same release, otherwise as a draft\n const newTranslationDocumentId = uuid()\n const sourceReleaseId = isVersionId(source._id) ? getVersionFromId(source._id) : undefined\n let newTranslationDocument = {\n ...source,\n _id: sourceReleaseId\n ? getVersionId(newTranslationDocumentId, sourceReleaseId)\n : getDraftId(newTranslationDocumentId),\n // 2. Update language of the translation\n [languageField]: language.id,\n }\n\n // Remove fields / paths we don't want to duplicate\n // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion\n newTranslationDocument = removeExcludedPaths(\n newTranslationDocument,\n schemaType,\n ) as SanityDocument\n\n transaction.create(newTranslationDocument)\n\n // 3. Maybe create the metadata document\n const sourceReference = createReference(\n sourceLanguageId,\n documentId,\n schemaType.name,\n !weakReferences,\n )\n const newTranslationReference = createReference(\n language.id,\n newTranslationDocumentId,\n schemaType.name,\n !weakReferences,\n )\n const newMetadataDocument: MetadataDocument = {\n _id: metadataId,\n _type: METADATA_SCHEMA_NAME,\n schemaTypes: [schemaType.name],\n translations: [sourceReference],\n }\n\n transaction.createIfNotExists(newMetadataDocument)\n\n // 4. Patch translation to metadata document\n // Note: If the document was only just created in the operation above\n // This patch operation will have no effect\n const metadataPatch = client\n .patch(metadataId)\n .setIfMissing({translations: [sourceReference]})\n .insert(`after`, `translations[-1]`, [newTranslationReference])\n\n transaction.patch(metadataPatch)\n\n // 5. Commit!\n transaction\n .commit()\n .then(() => {\n const metadataExisted = Boolean(metadata?._createdAt)\n\n toast.push({\n status: 'success',\n title: `Created \"${language.title}\" translation`,\n description: metadataExisted\n ? `Updated Translations Metadata`\n : `Created Translations Metadata`,\n })\n\n /* Once a translation has been created, reset the userHasClicked state to false\n * so they can click on it to navigate to the translation */\n setUserHasClicked(false)\n\n // Execute callback if provided\n if (callback) {\n // oxlint-disable-next-line eslint-plugin-promise/no-callback-in-promise -- This is an async callback, not a Node.js callback\n return callback({\n client,\n sourceLanguageId,\n sourceDocument: source,\n newDocument: newTranslationDocument,\n destinationLanguageId: language.id,\n metaDocumentId: metadataId,\n })\n }\n\n return undefined\n })\n .catch((err: Error) => {\n console.error(err)\n\n /* Re-enable the create button if there was an error */\n setUserHasClicked(false)\n\n return toast.push({\n status: 'error',\n title: `Error creating translation`,\n description: err.message,\n })\n })\n }, [\n client,\n documentId,\n language.id,\n language.title,\n languageField,\n metadata?._createdAt,\n metadataId,\n schemaType,\n source,\n sourceLanguageId,\n toast,\n weakReferences,\n callback,\n ])\n\n let message\n\n if (current) {\n message = `Current document`\n } else if (translation) {\n message = `Open ${language.title} translation`\n } else if (!translation) {\n message = `Create new ${language.title} translation`\n }\n\n return (\n <Tooltip\n animate\n content={\n <Box padding={2}>\n <Text muted size={1}>\n {message}\n </Text>\n </Box>\n }\n fallbackPlacements={['right', 'left']}\n placement=\"top\"\n portal\n >\n <Button\n onClick={translation ? handleOpen : handleCreate}\n mode={current && disabled ? `default` : `bleed`}\n disabled={disabled}\n >\n <Flex gap={3} align=\"center\">\n {disabled && !current ? (\n <Spinner />\n ) : (\n <Text size={2}>\n {translation ? <SplitVerticalIcon /> : current ? <CheckmarkIcon /> : <AddIcon />}\n </Text>\n )}\n <Box flex={1}>\n <Text>{language.title}</Text>\n </Box>\n <Badge tone={disabled || current ? `default` : `primary`}>{language.id}</Badge>\n </Flex>\n </Button>\n </Tooltip>\n )\n}\n","import {EditIcon} from '@sanity/icons/Edit'\nimport {Badge, Box, Button, Flex, Text} from '@sanity/ui'\nimport {useToast} from '@sanity/ui/toast'\nimport {useCallback} from 'react'\nimport {type SanityDocument, useClient} from 'sanity'\n\nimport type {Language} from '../types'\nimport {useDocumentInternationalizationContext} from './DocumentInternationalizationContext'\n\ntype LanguagePatchProps = {\n language: Language\n source: SanityDocument | null\n disabled: boolean\n}\n\n/**\n * Button component that patches the current document's language field to\n * the selected language. Displays the language name and ID badge, and shows\n * a success or error toast after the patch operation completes.\n */\nexport default function LanguagePatch(props: LanguagePatchProps) {\n const {language, source} = props\n const {apiVersion, languageField} = useDocumentInternationalizationContext()\n const disabled = props.disabled || !source\n const client = useClient({apiVersion})\n const toast = useToast()\n\n const handleClick = useCallback(() => {\n if (!source) {\n throw new Error(`Cannot patch missing document`)\n }\n\n const currentId = source._id\n\n client\n .patch(currentId)\n .set({[languageField]: language.id})\n .commit()\n .then(() => {\n toast.push({\n title: `Set document language to ${language.title}`,\n status: `success`,\n })\n return undefined\n })\n .catch((err: unknown) => {\n console.error(err)\n\n return toast.push({\n title: `Failed to set document language to ${language.title}`,\n status: `error`,\n })\n })\n }, [source, client, languageField, language, toast])\n\n return (\n <Button mode=\"bleed\" onClick={handleClick} disabled={disabled} justify=\"flex-start\">\n <Flex gap={3} align=\"center\">\n <Text size={2}>\n <EditIcon />\n </Text>\n <Box flex={1}>\n <Text>{language.title}</Text>\n </Box>\n <Badge>{language.id}</Badge>\n </Flex>\n </Button>\n )\n}\n","import {Box} from '@sanity/ui'\n\nexport default function ConstrainedBox({children}: {children: React.ReactNode}): React.JSX.Element {\n return <Box style={{maxWidth: 280}}>{children}</Box>\n}\n","import {Card, Flex, Text} from '@sanity/ui'\nimport type {PropsWithChildren} from 'react'\n\nimport ConstrainedBox from './ConstrainedBox'\n\n/**\n * Presentational component that renders a caution-toned card with centered\n * text inside a constrained-width box. Used to display warning messages\n * in the internationalization UI.\n */\nexport default function Warning({children}: PropsWithChildren) {\n return (\n <Card tone=\"caution\" padding={3}>\n <Flex justify=\"center\">\n <ConstrainedBox>\n <Text size={1} align=\"center\">\n {children}\n </Text>\n </ConstrainedBox>\n </Flex>\n </Card>\n )\n}\n","import {TranslateIcon} from '@sanity/icons/Translate'\nimport {Box, Button, Card, Stack, Text, TextInput, useClickOutsideEvent} from '@sanity/ui'\nimport {Popover} from '@sanity/ui/popover'\nimport {uuid} from '@sanity/uuid'\nimport type {ChangeEvent} from 'react'\nimport {useCallback, useMemo, useRef, useState} from 'react'\nimport {useEditState, usePerspective} from 'sanity'\nimport {LANGUAGE_FIELD_NAME} from 'sanity-plugin-internationalized-array'\n\nimport {useTranslationMetadata} from '../hooks/useLanguageMetadata'\nimport type {DocumentInternationalizationMenuProps} from '../types'\nimport {useDocumentInternationalizationContext} from './DocumentInternationalizationContext'\nimport LanguageManage from './LanguageManage'\nimport LanguageOption from './LanguageOption'\nimport LanguagePatch from './LanguagePatch'\nimport Warning from './Warning'\n\nexport function DocumentInternationalizationMenu(\n props: DocumentInternationalizationMenuProps,\n): React.JSX.Element | null {\n const {documentId} = props\n const schemaType = props.schemaType\n const {languageField, supportedLanguages} = useDocumentInternationalizationContext()\n\n // Search filter query\n const [query, setQuery] = useState(``)\n const handleQuery = useCallback((event: ChangeEvent<HTMLInputElement>) => {\n if (event.currentTarget.value) {\n setQuery(event.currentTarget.value)\n } else {\n setQuery(``)\n }\n }, [])\n\n // UI Handlers\n const [open, setOpen] = useState(false)\n const handleClick = useCallback(() => setOpen((o) => !o), [])\n const buttonRef = useRef<HTMLButtonElement>(null)\n const popoverRef = useRef<HTMLDivElement>(null)\n const handleClickOutside = useCallback(() => setOpen(false), [])\n useClickOutsideEvent(handleClickOutside, () => [buttonRef.current, popoverRef.current])\n\n // Get metadata from content lake\n const {data, loading, error} = useTranslationMetadata(documentId)\n const metadata = Array.isArray(data) && data.length ? data[0] : null\n\n // Optimistically set a metadata ID for a newly created metadata document\n // Cannot rely on generated metadata._id from useTranslationMetadata\n // As the document store might not have returned it before creating another translation\n const metadataId = useMemo(() => {\n if (loading) {\n return null\n }\n\n // Once created, these two values should be the same anyway\n return metadata?._id ?? uuid()\n }, [loading, metadata?._id])\n\n // Duplicate a new language version from the most recent version of this document\n // When a release is selected, the version document is the source, so documents\n // that only exist in that release can still be translated\n const {selectedReleaseId} = usePerspective()\n const {draft, published, version} = useEditState(\n documentId,\n schemaType.name,\n 'default',\n selectedReleaseId,\n )\n const source = version || draft || published\n\n // Check for data issues\n const documentIsInOneMetadataDocument = useMemo(() => {\n return Array.isArray(data) && data.length <= 1\n }, [data])\n const rawLanguageValue = source?.[languageField]\n const sourceLanguageId = typeof rawLanguageValue === 'string' ? rawLanguageValue : undefined\n const sourceLanguageIsValid = supportedLanguages.some((l) => l.id === sourceLanguageId)\n const allLanguagesAreValid = useMemo(() => {\n const valid = supportedLanguages.every((l) => l.id && l.title)\n if (!valid) {\n console.warn(\n `Not all languages are valid. It should be an array of objects with an \"id\" and \"title\" property. Or a function that returns an array of objects with an \"id\" and \"title\" property.`,\n supportedLanguages,\n )\n }\n\n return valid\n }, [supportedLanguages])\n\n const content = (\n <Box padding={1}>\n {error ? (\n <Card tone=\"critical\" padding={1}>\n <Text>There was an error returning translations metadata</Text>\n </Card>\n ) : (\n <Stack gap={1}>\n <LanguageManage\n id={metadata?._id}\n documentId={documentId}\n metadataId={metadataId}\n schemaType={schemaType}\n sourceLanguageId={sourceLanguageId}\n />\n {supportedLanguages.length > 4 ? (\n <TextInput onChange={handleQuery} value={query} placeholder=\"Filter languages\" />\n ) : null}\n {supportedLanguages.length > 0 ? (\n <>\n {/* Once metadata is loaded, there may be issues */}\n {loading ? null : (\n <>\n {/* Not all languages are valid */}\n {data && documentIsInOneMetadataDocument ? null : (\n <Warning>\n {/* TODO: Surface these documents to the user */}\n This document has been found in more than one Translations Metadata document\n </Warning>\n )}\n {/* Not all languages are valid */}\n {allLanguagesAreValid ? null : (\n <Warning>Not all language objects are valid. See the console.</Warning>\n )}\n {/* Current document has no language field */}\n {sourceLanguageId ? null : (\n <Warning>\n Choose a language to apply to <strong>this Document</strong>\n </Warning>\n )}\n {/* Current document has an invalid language field */}\n {sourceLanguageId && !sourceLanguageIsValid ? (\n <Warning>\n Select a supported language. Current language value:{' '}\n <code>{sourceLanguageId}</code>\n </Warning>\n ) : null}\n </>\n )}\n {supportedLanguages\n .filter((language) => {\n if (query) {\n return language.title.toLowerCase().includes(query.toLowerCase())\n }\n return true\n })\n .map((language) =>\n !loading && sourceLanguageId && sourceLanguageIsValid ? (\n // Button to duplicate this document to a new translation\n // And either create or update the metadata document\n <LanguageOption\n key={language.id}\n language={language}\n schemaType={schemaType}\n documentId={documentId}\n disabled={!allLanguagesAreValid}\n current={language.id === sourceLanguageId}\n metadata={metadata}\n metadataId={metadataId}\n source={source}\n sourceLanguageId={sourceLanguageId}\n />\n ) : (\n // Button to set a language field on *this* document\n <LanguagePatch\n key={language.id}\n source={source}\n language={language}\n // Only allow language patch change to:\n // - Keys not in metadata\n // - The key of this document in the metadata\n disabled={\n (loading ||\n !allLanguagesAreValid ||\n metadata?.translations\n .filter((t) => t?.value?._ref !== documentId)\n .some((t) => t[LANGUAGE_FIELD_NAME] === language.id)) ??\n false\n }\n />\n ),\n )}\n </>\n ) : null}\n </Stack>\n )}\n </Box>\n )\n\n const issueWithTranslations = !loading && sourceLanguageId && !sourceLanguageIsValid\n\n if (!documentId) {\n return null\n }\n\n if (!schemaType || !schemaType.name) {\n return null\n }\n\n return (\n <Popover\n animate\n constrainSize\n content={content}\n open={open}\n portal\n ref={popoverRef}\n overflow=\"auto\"\n tone=\"default\"\n >\n <Button\n text=\"Translations\"\n mode=\"bleed\"\n disabled={!source}\n tone={!source || loading || !issueWithTranslations ? undefined : `caution`}\n icon={TranslateIcon}\n onClick={handleClick}\n ref={buttonRef}\n selected={open}\n data-testid=\"document-internationalization-menu\"\n />\n </Popover>\n )\n}\n","import {TrashIcon} from '@sanity/icons/Trash'\nimport {useToast} from '@sanity/ui/toast'\nimport {useCallback, useMemo, useState} from 'react'\nimport {\n type DocumentActionDescription,\n type DocumentActionProps,\n type KeyedObject,\n type Reference,\n type TypedObject,\n useClient,\n} from 'sanity'\n\nimport {API_VERSION, TRANSLATIONS_ARRAY_NAME} from '../constants'\n\ntype TranslationReference = TypedObject &\n KeyedObject & {\n value: Reference\n }\n\n/**\n * Document action that deletes a translation metadata document along with all\n * its referenced translation documents. Opens a confirmation dialog showing\n * how many translations will be deleted. Executes a single transaction that\n * unsets the translations array, deletes each referenced document (both\n * published and draft), and finally deletes the metadata document itself.\n */\nexport const useDeleteMetadataAction = (props: DocumentActionProps): DocumentActionDescription => {\n const {id: documentId, published, draft} = props\n const doc = draft || published\n\n const [isDialogOpen, setDialogOpen] = useState(false)\n const onClose = useCallback(() => setDialogOpen(false), [])\n const translations: TranslationReference[] = useMemo(\n () =>\n doc && Array.isArray(doc[TRANSLATIONS_ARRAY_NAME])\n ? // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion\n (doc[TRANSLATIONS_ARRAY_NAME] as TranslationReference[])\n : [],\n [doc],\n )\n\n const toast = useToast()\n const client = useClient({apiVersion: API_VERSION})\n\n // Remove translation reference and delete document in one transaction\n const onProceed = useCallback(() => {\n const tx = client.transaction()\n\n tx.patch(documentId, (patch) => patch.unset([TRANSLATIONS_ARRAY_NAME]))\n\n if (translations.length > 0) {\n translations.forEach((translation) => {\n tx.delete(translation.value._ref)\n tx.delete(`drafts.${translation.value._ref}`)\n })\n }\n\n tx.delete(documentId)\n // Shouldn't exist as this document type is in liveEdit\n tx.delete(`drafts.${documentId}`)\n\n tx.commit()\n .then(() => {\n onClose()\n\n toast.push({\n status: 'success',\n title: 'Deleted document and translations',\n })\n return undefined\n })\n .catch((err: Error) => {\n toast.push({\n status: 'error',\n title: 'Failed to delete document and translations',\n description: err.message,\n })\n })\n }, [client, translations, documentId, onClose, toast])\n\n return {\n label: `Delete all translations`,\n disabled: !doc || !translations.length,\n icon: TrashIcon,\n tone: 'critical',\n onHandle: () => {\n setDialogOpen(true)\n },\n dialog: isDialogOpen && {\n type: 'confirm',\n onCancel: onClose,\n onConfirm: () => {\n onProceed()\n onClose()\n },\n tone: 'critical',\n message:\n translations.length === 1\n ? `Delete 1 translation and this document`\n : `Delete all ${translations.length} translations and this document`,\n },\n }\n}\n","import type {DocumentBadgeDescription, DocumentBadgeProps} from 'sanity'\n\nimport {useDocumentInternationalizationContext} from '../components/DocumentInternationalizationContext'\n\n/**\n * Document badge that displays the language identifier of a document.\n * Reads the configured `languageField` from the version, draft or published\n * document, looks up the matching language in `supportedLanguages` to resolve\n * the title, and returns a badge descriptor with `primary` color. Returns\n * `null` when no document exists or the language field is empty/non-string.\n */\nexport function LanguageBadge(props: DocumentBadgeProps): DocumentBadgeDescription | null {\n const source = props?.version || props?.draft || props?.published\n const {languageField, supportedLanguages} = useDocumentInternationalizationContext()\n const languageId = source?.[languageField]\n\n if (!languageId || typeof languageId !== 'string') {\n return null\n }\n\n const language = Array.isArray(supportedLanguages)\n ? supportedLanguages.find((l) => l.id === languageId)\n : null\n\n // Currently we only show the language id if the supportedLanguages are async\n return {\n label: language?.id ?? languageId,\n title: language?.title ?? undefined,\n color: `primary`,\n }\n}\n","import {Card, Spinner} from '@sanity/ui'\nimport {useEffect, useMemo} from 'react'\nimport {Preview, useEditState, useSchema, useValidationStatus} from 'sanity'\n\ntype DocumentCheckProps = {\n id: string\n onCheckComplete: (id: string) => void\n addInvalidId: (id: string) => void\n removeInvalidId: (id: string) => void\n addDraftId: (id: string) => void\n removeDraftId: (id: string) => void\n}\n\n// Check if the document has a draft\n// Check if that draft is valid\n// Report back to parent that it can be added to bulk publish\nexport default function DocumentCheck(props: DocumentCheckProps) {\n const {id, onCheckComplete, addInvalidId, removeInvalidId, addDraftId, removeDraftId} = props\n // Use empty string for type initially - we get the actual type from the loaded document\n const editState = useEditState(id, '')\n const documentType = editState.draft?._type ?? editState.published?._type ?? ''\n // oxlint-disable-next-line no-useless-default-assignment\n const {isValidating, validation = []} = useValidationStatus(id, documentType, false)\n const schema = useSchema()\n\n const validationHasErrors = useMemo(() => {\n return !isValidating && validation.some((item) => item.level === 'error')\n }, [isValidating, validation])\n\n useEffect(() => {\n if (validationHasErrors) {\n addInvalidId(id)\n } else {\n removeInvalidId(id)\n }\n\n if (editState.draft) {\n addDraftId(id)\n } else {\n removeDraftId(id)\n }\n\n if (!isValidating) {\n onCheckComplete(id)\n }\n }, [\n addDraftId,\n addInvalidId,\n editState.draft,\n id,\n isValidating,\n onCheckComplete,\n removeDraftId,\n removeInvalidId,\n validationHasErrors,\n ])\n\n // We only care about drafts\n if (!editState.draft) {\n return null\n }\n\n const schemaType = schema.get(editState.draft._type)\n\n return (\n <Card border padding={2} tone={validationHasErrors ? `critical` : `positive`}>\n {editState.draft && schemaType ? (\n <Preview layout=\"default\" value={editState.draft} schemaType={schemaType} />\n ) : (\n <Spinner />\n )}\n </Card>\n )\n}\n","import {Box, type ButtonTone, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport type {ComponentType, PropsWithChildren} from 'react'\nimport {TextWithTone} from 'sanity'\n\ntype InfoIconProps = PropsWithChildren & {\n icon: ComponentType\n tone: ButtonTone\n text?: string\n}\n\nexport default function InfoIcon(props: InfoIconProps) {\n const {text, icon, tone, children} = props\n const Icon = icon\n\n return (\n <Tooltip\n animate\n portal\n content={\n children ? (\n <>{children}</>\n ) : (\n <Box padding={2}>\n <Text size={1}>{text}</Text>\n </Box>\n )\n }\n >\n <TextWithTone tone={tone} size={1}>\n <Icon />\n </TextWithTone>\n </Tooltip>\n )\n}\n","import {InfoOutlineIcon} from '@sanity/icons/InfoOutline'\nimport {Box, Stack, Text} from '@sanity/ui'\n\nimport InfoIcon from './InfoIcon'\n\nexport default function Info() {\n return (\n <InfoIcon icon={InfoOutlineIcon} tone=\"primary\">\n <Stack padding={3} gap={4} style={{maxWidth: 250}}>\n <Box>\n <Text size={1}>Bulk publishing uses the Scheduling API.</Text>\n </Box>\n <Box>\n <Text size={1}>\n Customized Document Actions in the Studio will not execute. Webhooks will execute.\n </Text>\n </Box>\n <Box>\n <Text size={1}>\n Validation is checked before rendering the button below, but the Scheduling API will not\n check for – or enforce – validation.\n </Text>\n </Box>\n </Stack>\n </InfoIcon>\n )\n}\n","import {Button, Card, Dialog, Inline, Stack, Text} from '@sanity/ui'\nimport {useToast} from '@sanity/ui/toast'\nimport {useCallback, useState} from 'react'\nimport {TextWithTone, useClient, useWorkspace} from 'sanity'\n\nimport {API_VERSION} from '../../constants'\nimport type {TranslationReference} from '../../types'\nimport DocumentCheck from './DocumentCheck'\nimport Info from './Info'\n\nexport type BulkPublishProps = {\n translations: TranslationReference[]\n}\n\n// A root-level component with UI for hitting the Publishing API\nexport default function BulkPublish(props: BulkPublishProps) {\n const {translations} = props\n const client = useClient({apiVersion: API_VERSION})\n const {projectId, dataset} = useWorkspace()\n const toast = useToast()\n const [invalidIds, setInvalidIds] = useState<string[] | null>(null)\n const [checkedIds, setCheckedIds] = useState<string[]>([])\n\n const onCheckComplete = useCallback((id: string) => {\n setCheckedIds((ids) => Array.from(new Set([...ids, id])))\n }, [])\n\n // Handle dialog\n const [open, setOpen] = useState(false)\n const onOpen = useCallback(() => setOpen(true), [])\n const onClose = useCallback(() => setOpen(false), [])\n\n const addInvalidId = useCallback((id: string) => {\n setInvalidIds((ids) => (ids ? Array.from(new Set([...ids, id])) : [id]))\n }, [])\n\n const removeInvalidId = useCallback((id: string) => {\n setInvalidIds((ids) => (ids ? ids.filter((i) => i !== id) : []))\n }, [])\n\n const [draftIds, setDraftIds] = useState<string[]>([])\n\n const addDraftId = useCallback((id: string) => {\n setDraftIds((ids) => Array.from(new Set([...ids, id])))\n }, [])\n\n const removeDraftId = useCallback((id: string) => {\n setDraftIds((ids) => ids.filter((i) => i !== id))\n }, [])\n\n const handleBulkPublish = useCallback(() => {\n const body = translations.map((translation) => ({\n documentId: translation.value._ref,\n }))\n client\n .request({\n url: `/publish/${projectId}/${dataset}`,\n method: 'POST',\n body,\n })\n .then(() => {\n toast.push({\n status: 'success',\n title: 'Success',\n description: 'Bulk publish complete',\n })\n return undefined\n })\n .catch((err: Error) => {\n console.error(err)\n toast.push({\n status: 'error',\n title: 'Error',\n description: 'Bulk publish failed',\n })\n })\n }, [translations, client, projectId, dataset, toast])\n\n const disabled =\n // Not all documents have been checked\n checkedIds.length !== translations.length ||\n // Some document(s) are invalid\n Boolean(invalidIds && invalidIds?.length > 0) ||\n // No documents are drafts\n !draftIds.length\n\n return translations?.length > 0 ? (\n <Card padding={4} border radius={2}>\n <Stack gap={3}>\n <Inline gap={3}>\n <Text weight=\"bold\" size={1}>\n Bulk publishing\n </Text>\n <Info />\n </Inline>\n\n <Stack>\n <Button onClick={onOpen} text=\"Prepare bulk publishing\" mode=\"ghost\" />\n </Stack>\n\n {open && (\n <Dialog\n animate\n header=\"Bulk publishing\"\n id=\"bulk-publish-dialog\"\n onClose={onClose}\n zOffset={1000}\n width={3}\n >\n <Stack gap={4} padding={4}>\n {draftIds.length > 0 ? (\n <Stack gap={2}>\n <Text size={1}>\n There{' '}\n {draftIds.length === 1\n ? `is 1 draft document`\n : `are ${draftIds.length} draft documents`}\n .\n </Text>\n {invalidIds && invalidIds.length > 0 ? (\n <TextWithTone tone=\"critical\" size={1}>\n {invalidIds.length === 1\n ? `1 draft document has`\n : `${invalidIds.length} draft documents have`}{' '}\n validation issues that must be addressed first\n </TextWithTone>\n ) : (\n <TextWithTone tone=\"positive\" size={1}>\n All drafts are valid and can be bulk published\n </TextWithTone>\n )}\n </Stack>\n ) : null}\n\n <Stack gap={1}>\n {translations\n .filter((translation) => translation?.value?._ref)\n .map((translation) => (\n <DocumentCheck\n key={translation._key}\n id={translation.value._ref}\n onCheckComplete={onCheckComplete}\n addInvalidId={addInvalidId}\n removeInvalidId={removeInvalidId}\n addDraftId={addDraftId}\n removeDraftId={removeDraftId}\n />\n ))}\n </Stack>\n {draftIds.length > 0 ? (\n <Button\n mode=\"ghost\"\n tone={invalidIds && invalidIds?.length > 0 ? 'caution' : 'positive'}\n text={\n draftIds.length === 1\n ? `Publish draft document`\n : `Bulk publish ${draftIds.length} draft documents`\n }\n onClick={handleBulkPublish}\n disabled={disabled}\n />\n ) : (\n <Text muted size={1}>\n No draft documents to publish\n </Text>\n )}\n </Stack>\n </Dialog>\n )}\n </Stack>\n </Card>\n ) : null\n}\n","import {useEffect} from 'react'\nimport {PatchEvent, unset, useUnstableObserveDocument} from 'sanity'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport type {TranslationReference} from '../../types'\n\ntype ReferencePatcherProps = {\n translation: TranslationReference\n}\n\n// For every reference, check if it is published, and if so, strengthen the reference\nexport default function ReferencePatcher(props: ReferencePatcherProps) {\n const {translation} = props\n const {document: publishedDocument, loading} = useUnstableObserveDocument(translation.value._ref)\n const {onChange, ready, formState} = useDocumentPane()\n\n useEffect(() => {\n if (\n // We have a reference\n translation.value._ref &&\n // It's still weak and not-yet-strengthened\n translation.value._weak &&\n // We also want to keep this check because maybe the user *configured* weak refs\n translation.value._strengthenOnPublish &&\n !loading &&\n publishedDocument &&\n // The metadata pane is ready to accept patches\n ready &&\n !formState?.readOnly\n ) {\n const referencePathBase = ['translations', {_key: translation._key}, 'value']\n\n onChange(\n new PatchEvent([\n unset([...referencePathBase, '_weak']),\n unset([...referencePathBase, '_strengthenOnPublish']),\n ]),\n )\n }\n }, [\n formState?.readOnly,\n loading,\n onChange,\n publishedDocument,\n ready,\n translation._key,\n translation.value._ref,\n translation.value._strengthenOnPublish,\n translation.value._weak,\n ])\n\n return null\n}\n","import type {TranslationReference} from '../../types'\nimport ReferencePatcher from './ReferencePatcher'\n\ntype OptimisticallyStrengthenProps = {\n translations: TranslationReference[]\n}\n\n// There's no good reason to leave published references as weak\n// So this component will run on every render and strengthen them\nexport default function OptimisticallyStrengthen(props: OptimisticallyStrengthenProps) {\n // oxlint-disable-next-line no-useless-default-assignment\n const {translations = []} = props\n\n if (!translations.length) {\n return null\n }\n\n return (\n <>\n {translations.map((translation) =>\n translation.value._strengthenOnPublish?.type ? (\n <ReferencePatcher key={translation._key} translation={translation} />\n ) : null,\n )}\n </>\n )\n}\n","import {TranslateIcon} from '@sanity/icons/Translate'\nimport {defineField, defineType, type DocumentDefinition, type FieldDefinition} from 'sanity'\nimport {LANGUAGE_FIELD_NAME} from 'sanity-plugin-internationalized-array'\n\nimport {METADATA_SCHEMA_NAME, TRANSLATIONS_ARRAY_NAME} from '../../constants'\nimport type {TranslationReference} from '../../types'\n\n/**\n * Creates the `translation.metadata` document schema definition. This schema\n * type stores the array of translation references linking all language versions\n * of a document together, along with the allowed schema types and any custom\n * metadata fields provided by the plugin consumer. The document uses `liveEdit`\n * so changes are published immediately without drafts.\n */\nexport default (\n schemaTypes: string[],\n metadataFields: FieldDefinition[],\n omnisearchVisibility = true,\n): DocumentDefinition =>\n defineType({\n type: 'document',\n name: METADATA_SCHEMA_NAME,\n title: 'Translation metadata',\n icon: TranslateIcon,\n liveEdit: true,\n __experimental_omnisearch_visibility: omnisearchVisibility,\n fields: [\n defineField({\n name: TRANSLATIONS_ARRAY_NAME,\n type: 'internationalizedArrayReference',\n }),\n defineField({\n name: 'schemaTypes',\n description:\n 'Optional: Used to filter the reference fields above so all translations share the same types.',\n type: 'array',\n of: [{type: 'string'}],\n options: {list: schemaTypes},\n readOnly: ({value}) => Boolean(value),\n }),\n ...metadataFields,\n ],\n preview: {\n select: {\n translations: TRANSLATIONS_ARRAY_NAME,\n documentSchemaTypes: 'schemaTypes',\n },\n prepare(selection) {\n const {translations = [], documentSchemaTypes = []} = selection\n const title =\n translations.length === 1 ? `1 Translation` : `${translations.length} Translations`\n const languageKeys = translations.length\n ? translations\n .map((t: TranslationReference) => t[LANGUAGE_FIELD_NAME].toUpperCase())\n .join(', ')\n : ``\n const subtitle = [\n languageKeys ? `(${languageKeys})` : null,\n documentSchemaTypes?.length ? documentSchemaTypes.map((s: string) => s).join(`, `) : ``,\n ]\n .filter(Boolean)\n .join(` `)\n\n return {\n title,\n subtitle,\n }\n },\n },\n })\n","import {Stack} from '@sanity/ui'\nimport {defineField, definePlugin, isSanityDocument} from 'sanity'\nimport {internationalizedArray, LANGUAGE_FIELD_NAME} from 'sanity-plugin-internationalized-array'\n\nimport {useDeleteMetadataAction} from './actions/DeleteMetadataAction'\nimport {LanguageBadge} from './badges'\nimport BulkPublish from './components/BulkPublish'\nimport {DocumentInternationalizationProvider} from './components/DocumentInternationalizationContext'\nimport {DocumentInternationalizationMenu} from './components/DocumentInternationalizationMenu'\nimport OptimisticallyStrengthen from './components/OptimisticallyStrengthen'\nimport {API_VERSION, DEFAULT_CONFIG, METADATA_SCHEMA_NAME} from './constants'\nimport {documentInternationalizationUsEnglishLocaleBundle} from './i18n'\nimport metadata from './schema/translation/metadata'\nimport type {PluginConfig, TranslationReference} from './types'\n\nexport const documentInternationalization = definePlugin<PluginConfig>((config) => {\n const pluginConfig = {...DEFAULT_CONFIG, ...config}\n const {\n supportedLanguages,\n schemaTypes,\n languageField,\n bulkPublish,\n metadataFields,\n hideLanguageFilter,\n metadataOmnisearchVisibility,\n metadataInternationalization,\n addTemplates,\n } = pluginConfig\n\n if (schemaTypes.length === 0) {\n throw new Error(\n 'You must specify at least one schema type on which to enable document internationalization. Update the `schemaTypes` option in the documentInternationalization() configuration.',\n )\n }\n\n return {\n name: '@sanity/document-internationalization',\n\n studio: {\n components: {\n layout: (props) => (\n <DocumentInternationalizationProvider {...props} pluginConfig={pluginConfig} />\n ),\n },\n },\n\n i18n: {\n bundles: [documentInternationalizationUsEnglishLocaleBundle],\n },\n\n // Adds:\n // - A bulk-publishing UI component to the form\n // - Will only work for projects on a compatible plan\n form: {\n components: {\n input: (props) => {\n if (\n props.id === 'root' &&\n props.schemaType.name === METADATA_SCHEMA_NAME &&\n isSanityDocument(props?.value)\n ) {\n const translations =\n // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion\n (props?.value?.['translations'] as TranslationReference[]) ?? []\n const weakAndTypedTranslations = translations.filter(\n ({value}) => value?._weak && value._strengthenOnPublish,\n )\n\n return (\n <Stack gap={5}>\n {bulkPublish ? <BulkPublish translations={translations} /> : null}\n {weakAndTypedTranslations.length > 0 ? (\n <OptimisticallyStrengthen translations={weakAndTypedTranslations} />\n ) : null}\n {props.renderDefault(props)}\n </Stack>\n )\n }\n\n return props.renderDefault(props)\n },\n },\n },\n\n // Adds:\n // - The `Translations` dropdown to the editing form\n // - `Badges` to documents with a language value\n // - The `DeleteMetadataAction` action to the metadata document type\n document: {\n unstable_languageFilter: (prev, ctx) => {\n const {schemaType, documentId} = ctx\n\n if (typeof hideLanguageFilter === 'function') {\n if (hideLanguageFilter(ctx)) return prev\n } else if (Array.isArray(hideLanguageFilter)) {\n if (hideLanguageFilter.includes(schemaType)) return prev\n } else if (hideLanguageFilter) {\n return prev\n }\n\n return schemaTypes.includes(schemaType) && documentId\n ? [...prev, (props) => DocumentInternationalizationMenu({...props, documentId})]\n : prev\n },\n badges: (prev, {schemaType}) => {\n if (!schemaTypes.includes(schemaType)) {\n return prev\n }\n\n return [(props) => LanguageBadge(props), ...prev]\n },\n actions: (prev, {schemaType}) => {\n if (schemaType === METADATA_SCHEMA_NAME) {\n return [...prev, useDeleteMetadataAction]\n }\n\n return prev\n },\n },\n\n // Adds:\n // - The `Translations metadata` document type to the schema\n schema: {\n // Create the metadata document type\n types: [metadata(schemaTypes, metadataFields, metadataOmnisearchVisibility)],\n\n // For every schema type this plugin is enabled on\n // Create an initial value template to set the language\n templates: (prev, {schema}) => {\n if (!addTemplates) {\n return prev\n }\n\n // Templates are not setup for async languages\n if (!Array.isArray(supportedLanguages)) {\n return prev\n }\n\n const parameterizedTemplates = schemaTypes.map((schemaType) => ({\n id: `${schemaType}-parameterized`,\n title: `${schema?.get(schemaType)?.title ?? schemaType}: with Language`,\n schemaType,\n parameters: [{name: `languageId`, title: `Language ID`, type: `string`}],\n value: ({languageId}: {languageId: string}) => ({\n [languageField]: languageId,\n }),\n }))\n\n const staticTemplates = schemaTypes.flatMap((schemaType) => {\n return supportedLanguages.map((language) => ({\n id: `${schemaType}-${language.id}`,\n title: `${language.title} ${schema?.get(schemaType)?.title ?? schemaType}`,\n schemaType,\n value: {\n [languageField]: language.id,\n },\n }))\n })\n\n return [...prev, ...parameterizedTemplates, ...staticTemplates]\n },\n },\n\n // Uses:\n // - `sanity-plugin-internationalized-array` to maintain the translations array\n plugins: [\n // Translation metadata stores its references using this plugin\n // It cuts down on attribute usage and gives UI conveniences to add new translations\n internationalizedArray({\n ...metadataInternationalization,\n apiVersion: pluginConfig.apiVersion,\n languages: supportedLanguages,\n includeForDocumentType: (documentType) => documentType === METADATA_SCHEMA_NAME,\n fieldTypes: [\n defineField(\n {\n name: 'reference',\n type: 'reference',\n to: schemaTypes.map((type) => ({type})),\n weak: pluginConfig.weakReferences,\n // Reference filters don't actually enforce validation!\n validation: (Rule) =>\n // @ts-expect-error - fix typings\n Rule.custom(async (item: TranslationReference, context) => {\n if (!item?.value?._ref || !item?.[LANGUAGE_FIELD_NAME]) {\n return true\n }\n\n const client = context.getClient({apiVersion: API_VERSION})\n const valueLanguage = await client.fetch(\n `*[_id in [$ref, $draftRef]][0].${languageField}`,\n {\n ref: item.value._ref,\n draftRef: `drafts.${item.value._ref}`,\n },\n )\n\n if (valueLanguage && valueLanguage === item[LANGUAGE_FIELD_NAME]) {\n return true\n }\n\n return `Referenced document does not have the correct language value`\n }),\n options: {\n // @ts-expect-error - Update type once it knows the values of this filter\n filter: ({parent, document}) => {\n if (!parent) return null\n\n // I'm not sure in what instance there's an array of parents\n // But the Type suggests it's possible\n const parentArray = Array.isArray(parent) ? parent : [parent]\n const language = parentArray.find((p) => p[LANGUAGE_FIELD_NAME])\n\n if (!language?.[LANGUAGE_FIELD_NAME]) return null\n\n if (document['schemaTypes']) {\n return {\n filter: `_type in $schemaTypes && ${languageField} == $language`,\n params: {\n schemaTypes: document['schemaTypes'],\n language: language[LANGUAGE_FIELD_NAME],\n },\n }\n }\n\n return {\n filter: `${languageField} == $language`,\n params: {language: language[LANGUAGE_FIELD_NAME]},\n }\n },\n },\n },\n {strict: false},\n ),\n ],\n }),\n ],\n }\n})\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AASA,SAAwB,gBAAgB,OAA6B;eAC7D,SAAS,UAAU,GAENA;CAAiBC,AAAAA,EAAAA,OAAAA,MAAAA,QAAAA,EAAAA,OAAjB,UAAO,KAAA,OAAA,IAAI,MAAM,IAAI,GAAJA,EAAAA,KAAAA,MAAAA,MAAjB,EAAA,KAAA;CAAnB,IAAM,aAAaD;CACnB,IAAI,CAAC,YAAY;EACRE,IAAAA;EAAP,2DAAQ,KAAA,oBAAA,UAAD;GAAU,MAAK;GAAW,OAAM;EAAyB,CAAA,2BAAzDA;CACT;CAEOC,IAAAA;CAAP,OAA6BC,EAAAA,OAAAA,MAAAA,SAAAA,EAAAA,OAAmB,cAAzC,KAAA,oBAAC,SAAD;EAAS,OAAO,MAAM;EAAmB;CAAa,CAAA,GAAhCA,EAAAA,KAAAA,MAAAA,OAAmB,EAAA,KAAA,oCAAzCD;AACT;AChBA,MAAa,uBAAuB,wBACvB,0BAA0B,gBAC1B,cAAc,cACd,iBAAsC;CACjD,oBAAoB,CAAC;CACrB,aAAa,CAAC;CACd,eAAe;CACf,gBAAgB;CAChB,aAAa;CACb,gBAAgB,CAAC;CACjB,YAAY;CACZ,oBAAoB;CACpB,UAAU;CACV,oBAAoB;CACpB,8BAA8B;CAC9B,cAAc;AAChB;;;;;;;ACRA,SAAgB,mBAAmB,OAAgC,CAAC,GAGlE;CACA,IAAM,eAAiC,CAAC,GAClC,kBAAoC,CAAC;CAY3C,OAVI,QAAQ,KAAK,SAAS,KACxB,KAAK,SAAS,QAAQ;EACpB,AAAI,IAAI,UAAU,uBAChB,aAAa,KAAK,GAAG,IAErB,gBAAgB,KAAK,GAAG;CAE5B,CAAC,GAGI;EAAC;EAAc;CAAe;AACvC;ACbA,SAAwB,wBAAwB,OAAqC;gBAC7E,EAAC,KAAK,YAAY,oBAAmB,OAM/BE;CAAK,AAAA,EAAA,OAAA,0BAAL,KAAA,EAAC,IAAI,WAAU,GAAV,EAAA,KAAA;CACCC,IAAAA;qDAAC,KAAA,CAAA;CAFjBC,IAAAA;CACUF,AAAAA,EAAAA,OAAAA,kBADV,KAAA;EACE,QAAQA;EACR,cAAcC;CAChB,GAFUD,EAAAA,KAAAA;CAHZ,IAAM,EAAC,MAAM,YAAW,kBACtB,gDACAE,EAIF,GACsDC;CAAmB,AAAA,EAAA,OAAA,oBAAnB,KAAA,mBAAmB,IAAI,GAAJ,EAAA,KAAA;CAAzE,IAAM,EAAC,cAAc,oBAAmBC,IAE9BC,IAGPC;CAEH,IAHE,EAAA,OAAA,mBAAA,EAAA,OAAgB,gBAFR,WAAM;EAEd,gBAAgB,YAAkC;CACpD,GAAG,KAAA,CAAC,iBAAiB,YAAY,GAD/B,EAAA,KAAA,iBAAgB,EAAA,KAAA,gEAFlB,UAAUD,IAGPC,EAA+B,GAE9B,SAAS;EAETC,IAAAA;EADF,4DACG,KAAA,oBAAA,MAAD;GAAM,SAAS;GAAG,OAAM;GAAS,SAAQ;GACvC,UAAA,oBAAC,SAAD,CAAU,CAAA;EACN,CAAA,6BAFNA;CAIJ;CAIKC,IAAAA;wCAAgB,KAAA,gBAAA,aAAa,SAAS,IACrC,oBAAC,MAAD,EAAA,UACE,mFACI,CAAA,IAEN,oBAAC,MAAD,EAAA,UAAM,sDAAyD,CAAA,GALhE,EAAA,MAAA;CASGC,IAAAA;CACG,AAAA,EAAA,QAAA,6BADH,KAAA,oBAAC,MAAD;EAAM,MAAM;EAAG,QAAO;EACnB,UAAA,gBAAgB,aAAa,SAAS,IACrC,oBAAA,UAAA,EAAA,UAAE,sCAAqC,CAAA,IAEvC,oBAAA,UAAA,EAAA,UAAE,mCAAkC,CAAA;CAElC,CAAA,GALH,EAAA,MAAA;CAMHC,IAAAA;CAAwB,AAAA,EAAA,QAAA,oBAAxB,KAAA,oBAAC,iBAAD;EAAiB,OAAO;EAAK,MAAM,IAAI;CAAQ,CAAA,GAAvB,EAAA,MAAA;CACvBC,IAAAA;wCAAgB,KAAA,gBAAA,aAAa,SAAS,IACrC,qBAAA,UAAA,EAAA,UAAA;EACE,oBAAC,MAAD,EAAM,WAAA,GAAW,CAAA;EACjB,qBAAC,MAAD;GAAM,MAAM;GAAG,QAAO;GAAtB,UAAA;IACE;IAAiB;IAChB,aAAa,WAAW,IACrB,+BACA;IAAgC;IACpC;GACI;;EACL,aAAa,IAAIC,OAMjB;CACD,EAAA,CAAA,IACA,MAlBH,EAAA,MAAA;CAmBAC,IAAAA;4CAAmB,MAAA,mBAAA,gBAAgB,SAAS,IAC3C,qBAAA,UAAA,EAAA,UAAA;EACE,oBAAC,MAAD,EAAM,WAAA,GAAW,CAAA;EACjB,qBAAC,MAAD;GAAM,MAAM;GAAG,QAAO;GAAtB,UAAA;IACG,gBAAgB,WAAW,IACxB,qCACA;IAAmC;IACvC;GACI;;EACL,gBAAgB,IAAIC,QAEpB;CACD,EAAA,CAAA,IACA,MAbH,EAAA,MAAA;CA7BLC,IAAAA;CA6BKF,AAAAA,EAAAA,QAAAA,OAAAA,EAAAA,QA3BDJ,MAAAA,EAAAA,QAOAC,MAAAA,EAAAA,QACCC,MAVL,MAAA,oBAAC,MAAD;EAAM,QAAA;EAAO,SAAS;EACpB,UAAA,qBAAC,OAAD;GAAO,KAAK;GAAZ,UAAA;IACEF;IAOAC;IACCC;IAmBAE;GAcI;;CACH,CAAA,GAfDA,EAAAA,MAAAA,KA3BDJ,EAAAA,MAAAA,IAOAC,EAAAA,MAAAA,IACCC,EAAAA,MAAAA;CAmCJK,IAAAA;CAAgBC,AAAAA,EAAAA,QAAAA,gBAAAA,wBAAhB,MAAA,gBAAgB,WAAW,IAC1B,oBAAC,MAAD,EAAA,UAAM,yCAA4C,CAAA,IAElD,oBAAC,MAAD,EAAA,UACE,mFACI,CAAA,GALSA,EAAAA,MAAAA,gBAAAA;CArDnBC,IAAAA;CADF,OASIH,EAAAA,QAAAA,OAAAA,EAAAA,QA6CCC,OAAAA,EAAAA,QApDAR,MADH,MAAA,qBAAC,OAAD;EAAO,KAAK;EAAZ,UAAA;GACGA;GAODO;GA6CCC;EAOI;KApDLD,EAAAA,MAAAA,KA6CCC,EAAAA,MAAAA,KApDAR,EAAAA,MAAAA,gCADHU;AA8DJ;AAhBmC,SAAA,SAAC,WAAA;CACpB,OAAA,oBAAC,iBAAD;EAAqC,OAAO;EAAW,MAAM,UAAU;CAAQ,GAAzD,UAAU,GAA+C;;AAnB/D,SAAA,QAAC,aAAA;CACjB,OAAA,oBAAC,iBAAD;EAEE,OAAO;EACP,MAAM,YAAY;CACnB,GAHM,YAAY,GAGlB;;ACnEjB,SAAwB,wBAAwB,OAAqC;eAC7E,EAAC,cAAc,SAAS,cAAa,OAIvCC;CAA+B,AAAA,EAAA,OAAA,uBAA/B,KAAA,oBAAC,QAAD;EAAQ,MAAK;EAAS,SAAS;EAAS,MAAK;CAAS,CAAA,GAAvB,EAAA,KAAA;CAG3B,IAAA,KAAA,gBAAgB,aAAa,SAAS,IAClC,gCACA,mBAJRC;CAMW,AAAA,EAAA,OAAA,aAAA,EAAA,OAJPC,MAFJ,KAAA,oBAAC,QAAD;EACE,MACEA;EAIF,SAAS;EACT,MAAK;CACN,CAAA,GAFU,EAAA,KAAA,WAJPA,EAAAA,KAAAA;CAJNC,IAAAA;CADF,OAEIH,EAAAA,OAAAA,MAAAA,EAAAA,OACAC,MAFF,KAAA,qBAAC,MAAD;EAAM,qBAAqB;EAAG,KAAK;EAAnC,UAAA,CACED,IACAC,EASI;KAVJD,EAAAA,KAAAA,IACAC,EAAAA,KAAAA,4BAFFE;AAaJ;AClBA,MAAM,sCAAsC,cAAmC,cAAc;AAE7F,SAAgB,yCAA8D;CAC5E,OAAO,WAAW,mCAAmC;AACvD;AAQA,MAAM,+BAAe,IAAI,IAAgE;AAEzF,SAAS,eAAe,aAA6B;CACnD,OAAO,aAAa;AACtB;AAEA,SAAS,mBACP,IACA,UACoD;CACpD,IAAM,SAAS,aAAa,IAAI,QAAQ;CACxC,IAAI,QACF,OAAO;CAET,IAAM,UAAU,GAAG;CAEnB,OADA,aAAa,IAAI,UAAU,OAAO,GAC3B;AACT;;;;AAKA,SAAgB,qCACd,OACmB;gBACb,EAAC,iBAAgB,OAEEC;CAA0BC,AAAAA,EAAAA,OAAAA,aAAAA,0BAA1B,KAAA,EAAC,YAAY,aAAa,WAAU,GAAVA,EAAAA,KAAAA,aAAAA;CAAnD,IAAM,SAAS,UAAUD,EAAqC,GAIxD,cAHY,aAGgB,CAAA,CAAU,QAAQ,IAGrBE;CAAe,AAAA,EAAA,OAAA,2BAAf,KAAA,eAAe,WAAW,GAAX,EAAA,KAAA;CAA9C,IAAM,WAAWC,IAGQC;;EACvB,IAAI,MAAM,QAAQ,aAAa,kBAAkB,GAAG;GAClD,KAAO;GAAP,MAAA;EACF;EAG0BC,IAAAA;EAEiB,AAAA,EAAA,OAAA,UAAA,EAAA,OAD9BC,gBADa,KAAA,YACpB,OAAO,aAAa,sBAAuB,aACtC,aAAa,mBAAmB,MAAM,IAExC,aAAa,oBAFqB,EAAA,KAAA,QAD9BA,EAAAA,KAAAA;EADNC,IAAAA;EAAP,AAKG,EAAA,OAAA,YAAA,EAAA,OALuBF,MAAnB,KAAA,mBAAmBA,IAKvB,QAAQ,GAAR,EAAA,KAAA,UALuBA,EAAAA,KAAAA,4BAA1B,KAAOE;;CANT,IAAM,mBAAmBH,IAenB,qBAAqB,mBACvB,IAAI,gBAAgB,IAEnB,aAAa,oBAGTI;CAAI,AAAA,EAAA,QAAA,gBAAA,EAAA,QAAc,sBAAlB,KAAA;EAAC,GAAG;EAAc;CAAkB,GAAhC,EAAA,MAAA,cAAc,EAAA,MAAA;CAD3B,IAAM,eAAeC,IAOhBC;iCAAM,KAAA,MAAA,cAAc,KAAK,GAAzBC,EAAAA,MAAAA;CADHC,IAAAA;CADF,OACuD,EAAA,QAAA,gBAAA,EAAA,QAClDF,MADH,KAAA,oBAACG,oCAAAA,UAAD;EAA8C,OAAO;EAClDH,UAAAA;CAC2C,CAAA,GAFO,EAAA,MAAA,cAClDA,EAAAA,MAAAA,8BADHE;AAIJ;;;;;;;;;;;;;;;;;;;;;ACpDA,MAAa,8BACX,UAC8B;gBACxB,EAAC,IAAI,YAAY,WAAW,UAAS,OACrC,MAAM,SAAS,WACf,EAAC,kBAAiB,uCAAuC,GAEzD,CAAC,cAAc,iBAAiB,SAAS,EAAK,GACiBE;qDAAC,KAAA,CAAA;CAAtE,IAAM,CAAC,cAAc,mBAAmB,SAA6BA,EAAE,GAC3CC;qDAAM,WAAA,cAAc,EAAK;CAArD,IAAM,UAAUC,IACV,sBAAsB,MAAM,IAAI,iBAAiB,MACjD,mBAAmB,OAAO,uBAAwB,WAAW,sBAAsB,MAEnF,QAAQ,SAAS,GACEC;qDAAC,KAAA,EAAA,YAAY,YAAW;CAAjD,IAAM,SAAS,UAAUA,EAAyB,GAEpBC;CACjB,AAAA,EAAA,OAAA,UAAA,EAAA,OAaC,cAAA,EAAA,OAVR,oBAAA,EAAA,OAmBA,SAAA,EAAA,OAnBoBC,gBAJI,WAAM;EAClC,IAAM,KAAK,OAAO,YAAY,GAC1B,YAA6B;EAgBjC,AAdI,oBAAoB,aAAa,SAAS,KAC5C,YAAY,SACZ,aAAa,SAAS,gBAAgB;GACpC,GAAG,MAAM,YAAY,MAAM,UACzB,MAAM,MAAM,CACV,GAAG,wBAAwB,GAAG,oBAAoB,OAAO,iBAAiB,GAC5E,CAAC,CACH;EACF,CAAC,MAED,GAAG,OAAO,UAAU,GACpB,GAAG,OAAO,UAAU,YAAY,IAGlC,GAAG,OAAO,CAAC,CACR,WAAW;GAIV,AAHI,cAAc,YAChB,QAAQ,GAEV,MAAM,KAAK;IACT,QAAQ;IACR,OAAO,cAAc,UAAU,gCAAgC;IAC/D,aAAa,cAAc,UAAU,oCAAoC;GAC3E,CAAC;EAEH,CAAC,CAAC,CACD,OAAO,QAAe;GACrB,MAAM,KAAK;IACT,QAAQ;IACR,OACE,cAAc,UACV,0CACA;IACN,aAAa,IAAI;GACnB,CAAC;EACH,CAAC;CACL,GAvCa,EAAA,KAAA,QAaC,EAAA,KAAA,YAVR,EAAA,KAAA,kBAmBA,EAAA,KAAA,OAnBoBA,EAAAA,KAAAA;CAJ1B,IAAM,YAAYC,IA4CN,KAAA,CAAC,OAAO,CAAC,kBAGTC;qDAAM,WAAA;EACd,cAAc,EAAI;CACpB;CACQC,IAAAA;CAIG,AAAA,EAAA,QAAA,OAAA,EAAA,QAGO,cAAA,EAAA,QAPV,gBAAA,EAAA,QAcS,aAAA,EAAA,QACG,gBAfZ,KAAA,gBAAgB;EACtB,MAAM;EACN;EACA,QAAQ;EACR,SAAS,MACP,oBAAC,yBAAD;GACO;GACO;GACK;EAClB,CAAA,IACC;EACJ,QACE,oBAAC,yBAAD;GACW;GACE;GACG;EACf,CAAA;CAEL,GAdW,EAAA,MAAA,KAGO,EAAA,MAAA,YAPV,EAAA,MAAA,cAcS,EAAA,MAAA,WACG,EAAA,MAAA;CAvBfC,IAAAA;CAAP,OAEYC,EAAAA,QAAAA,MAAAA,EAAAA,QAMFF,MARH,KAAA;EACL,OAAO;EACP,UAAUE;EACV,MAAM;EACN,MAAM;EACN,UAAUH;EAGV,QAAQC;CAmBV,GAzBYE,EAAAA,MAAAA,IAMFF,EAAAA,MAAAA,8BARHC;AA4BT;AAEA,2BAA2B,SAAS,qBACpC,2BAA2B,cAAc;;;;;AAMzC,MAAa,2BAA2B,UAC/B,2BAA2B,KAAK;ACnHzC,SAAgB,uBAAuB,IAIrC;eACoEE;CACzD,AAAA,EAAA,OAAA,kBADyD,KAAA,EAClE,QAAQ;EAAC;EAAI,mBAAmB;CAAoB,EACtD,GADW,EAAA,KAAA;CADX,IAAM,EAAC,MAAM,SAAS,UAAS,kBAA8B,iHAAOA,EAEnE,GAEMC;CAAP,OAAQ,EAAA,OAAA,QAAA,EAAA,OAAe,SAAA,EAAA,OAAT,WAAP,KAAA;EAAC;EAAM;EAAS;CAAK,GAApB,EAAA,KAAA,MAAe,EAAA,KAAA,OAAT,EAAA,KAAA,iCAAPA;AACT;;;;;;AClBA,MAAa,8BAA8B,iCAO9B,oDAAoD,2BAA2B;CAC1F,QAAQ;CACR,WAAW;CACX,iBAAiB,OAAO;AAC1B,CAAC,GCmBK,sBAAsB;CAC1B,oBAAoB;CACpB,mBAAmB;CACnB,sBAAsB;CACtB,WAAW;CACX,kBAAkB;AACpB,GAUa,sCAAA,OAKyC;gBALH,EACjD,IACA,MAEA,eAJiDC,IAM3C,gBAAgB,iBAAiB,GACjC,EAAC,cAAa,qBAAqB,IAAI,IAAI,GAC3C,EAAC,mBAAkB,UAAU,GAC7B,CAAC,eAAe,kBAAkB,SAAS,EAAK,GACiBC;CACrE,AAAA,EAAA,OAAA,MAAA,EAAA,OACA,QAFqE,KAAA;EACrE;EACA;EACA,YAAY;CACd,GAHE,EAAA,KAAA,IACA,EAAA,KAAA;CAFF,IAAM,CAAC,aAAa,wBAAwB,2BAA2BA,EAItE,GACK,EAAC,MAAM,SAAS,8BAA6B,uBAAuB,EAAE,GACtE,yBACG,MAAM,QAAQ,IAAI,KAAK,KAAK,UAAU,GAEzC,mBAAmB,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,KAAK,KAAK,MAClE,SAAS,UAAU,6BAA6B,GAChD,QAAQ,SAAS,GACjB,EAAC,GAAG,MAAK,eAAe,wBAAwB,GAChD,EAAC,GAAG,MAAK,eAAe,2BAA2B,GACnD,cAAc,eAAe,GAERC;CAsFjB,AAAA,EAAA,OAAA,UAAA,EAAA,OAvDcC,cAAAA,QAAAA,EAAAA,OA1Bf,oBAAA,EAAA,OAoFL,kBAAA,EAAA,OAKA,cAAA,EAAA,OAOE,SAAA,EAAA,OArE6B,QAhCR,WAAM;EAkG/B,AAjGA,eAAe,EAAI,IAiGnB,eA9Fe,qBAAoC;GACjD,IAAI,CAAC,kBACH,OAAO,QAAQ,OAAO,gBAAI,MAAM,6BAA6B,CAAC;GAGhE,IAAM,oBAAoB,iBAAiB;GAC3C,IAAI,CAAC,qBAAqB,kBAAkB,WAAW,GACrD,OAAO,QAAQ,OAAO,gBAAI,MAAM,4CAA4C,CAAC;GAI/E,IAAM,+BAAe,IAAI,IAAgB;GACzC,MAAM,QAAQ,IAEZ,kBAAkB,IAAI,OAAO,gBAAgB;IAC3C,IAAM,SAAS,KAAK,GACd,SAAS,YAAY,sBACrB,QAAQ,YAAY,OAAO;IAEjC,IAAI,OAAO,UAAW,YAAY,OAAO,KAAK,CAAC,CAAC,WAAW,GACzD,OAAO,QAAQ,OAAO,gBAAI,MAAM,gCAAgC,CAAC;IAEnE,IAAI,CAAC,OACH,OAAO,QAAQ,OAAO,gBAAI,MAAM,gCAAgC,CAAC;IAGnE,IAAM,EAAC,WAAW,yBAAwB,MAAM,eAC9C,cAAc,KACX,eAAe,OAAO,IAAI,CAAC,CAC3B,KAAK,OAAOC,OAA6D,CAAC,CAC/E;IAEA,IAAI,qBAAqB,UACvB,OAAO,QAAQ,OAAO,gBAAI,MAAM,2BAA2B,CAAC;IAG9D,IAAM,8BAA8B,eAClC,cAAc,KACX,gBAAgB,OAAO,IAAI,CAAC,CAC5B,KACC,OAAOC,QAA0E,CACnF,CACJ;IAIA,AAHA,qBAAqB,QAAQ,MAAM,GACnC,MAAM,6BAEN,aAAa,IAAI,QAAQ,MAAM;GACjC,CAAC,CACH;GAGA,IAAM,EAAC,WAAW,sBAAqB,MAAM,eAC3C,cAAc,KACX,eAAe,iBAAiB,KAAK,oBAAoB,CAAC,CAC1D,KAAK,OAAOD,MAA6D,CAAC,CAC/E;GAEA,IAAI,kBAAkB,UACpB,OAAO,QAAQ,OAAO,gBAAI,MAAM,2BAA2B,CAAC;GAG9D,IAAM,2BAA2B,eAC/B,cAAc,KACX,gBAAgB,iBAAiB,KAAK,oBAAoB,CAAC,CAC3D,KAAK,OAAOC,MAA0E,CAAC,CAC5F,GACMC,WAAS,KAAK;GAEpB,AADA,kBAAkB,QAAQA,QAAM,GAChC,MAAM;GAGN,IAAM,QAAyB,EAC7B,KAAK,OAAO,YACV,MAAM,KAAK,aAAa,QAAQ,CAAC,CAAC,CAAC,IAAIC,MAKtC,CACH,EACF;GAUA,AARA,MAAM,OAAO,YAAY,CAAC,CAAC,MAAMD,UAAQ,KAAK,CAAC,CAAC,OAAO,GAGvD,eAAe,QAAQ;IACrB,IAAI,MAAM,KAAK,aAAa,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1C;GACF,CAAC,GAED,WAAW;EACb,EAAA,CAGmB,CAAC,CACjB,OAAO,UAAmB;GAEzB,AADA,QAAQ,MAAM,KAAK,GACnB,MAAM,KAAK;IACT,QAAQ;IACR,OAAO;IACP,aAAa,iBAAiB,QAAQ,MAAM,UAAU;GACxD,CAAC;EACH,CAAC,CAAC,CACD,cAAc;GACb,eAAe,EAAK;EACtB,CAAC;CACL,GAxBU,EAAA,KAAA,QAvDcH,EAAAA,KAAAA,cAAAA,MA1Bf,EAAA,KAAA,kBAoFL,EAAA,KAAA,gBAKA,EAAA,KAAA,YAOE,EAAA,KAAA,OArE6B,EAAA,KAAA;CAhCnC,IAAM,SAASK;CAkKb,aAAa;CAlDRC,IAAAA;;EACL,IAAI,CAAC,wBAAwB,CAAC,aAAa,SAAS;GAIzCC,IAAAA;+BAAE,KAAA,EAAA,wBAAwB,GAA1B,EAAA,MAAA;GAELC,IAAAA;GAA0E,AAAA,EAAA,QAAA,4BAA1E,KAAA,oBAAC,gCAAD;IAAgC,SAAQ;IAAkC;GAAc,CAAA,GAAd,EAAA,MAAA;GALvEC,IAAAA;GAAP,AAGSF,EAAAA,QAAAA,MAAAA,EAAAA,QAELC,MALG,KAAA;IACL,MAAM;IACN,UAAU;IACV,OAAOD;IACP,OACEC;GAEJ,GAJSD,EAAAA,MAAAA,IAELC,EAAAA,MAAAA,8BALJ,KAAOC;GAAP,MAAA;EAQF;EAEA,IAAI,CAAC,6BAA6B,CAAC,kBAAkB;GAI1CF,IAAAA;+BAAE,KAAA,EAAA,wBAAwB,GAA1B,EAAA,MAAA;GACAG,IAAAA;+BAAE,KAAA,EAAA,oBAAoB,kBAAkB,GAAxC,EAAA,MAAA;GAJFC,IAAAA;GAAP,AAGSJ,EAAAA,QAAAA,MAAAA,EAAAA,QACAG,MAJF,KAAA;IACL,MAAM;IACN,UAAU;IACV,OAAOH;IACP,OAAOG;GACT,GAFSH,EAAAA,MAAAA,IACAG,EAAAA,MAAAA,8BAJT,KAAOC;GAAP,MAAA;EAMF;EAEA,IAAI,CAAC,wBAAwB;GAIlBJ,IAAAA;+BAAE,KAAA,EAAA,wBAAwB,GAA1B,EAAA,MAAA;GACAK,IAAAA;+BAAE,KAAA,EAAA,oBAAoB,iBAAiB,GAAvC,EAAA,MAAA;GAJFC,IAAAA;GAAP,AAGSN,EAAAA,QAAAA,MAAAA,EAAAA,QACAK,MAJF,KAAA;IACL,MAAM;IACN,UAAU;IACV,OAAOL;IACP,OAAOK;GACT,GAFSL,EAAAA,MAAAA,IACAK,EAAAA,MAAAA,8BAJT,KAAOC;GAAP,MAAA;EAMF;EAKI,IAAA,KAAA,iBACA,EAAQ,UAAU,YAClB,wBACA,2BACKC;EAAsD,AAAA,EAAA,QAAA,KAAA,EAAA,QAAtD,iBAAA,EAAA,QAAgB,KAAhB,KAAA,gBAAgB,EAAE,gCAAgC,IAAI,EAAE,wBAAwB,GAA1B,EAAA,MAAA,GAAtD,EAAA,MAAA,eAAgB,EAAA,MAAA;EAChBC,IAAAA;EAAUC,AAAAA,EAAAA,QAAAA,UAAAA,YAAAA,EAAAA,QAAW,KAArB,KAAA,UAAU,WAAW,EAAE,oBAAoB,UAAU,SAAS,IAAI,IAAxDA,EAAAA,MAAAA,UAAAA,UAAW,EAAA,MAAA;EARvBC,IAAAA;EAAP,AASY,EAAA,QAAA,UAAA,EAAA,QANRC,MAAAA,EAAAA,QAIKJ,MAAAA,EAAAA,QACAC,MARF,KAAA;GACL,MAAM;GACN,UACEG;GAIF,OAAOJ;GACP,OAAOC;GACP,UAAU;EACZ,GADY,EAAA,MAAA,QANRG,EAAAA,MAAAA,IAIKJ,EAAAA,MAAAA,IACAC,EAAAA,MAAAA,8BART,KAAOE;;CA9BT,OAAOX;AAsDT;AAEA,mCAAmC,SAAS,aAC5C,mCAAmC,cAAc;;;;;AAMjD,MAAa,mCACX,UAEO,mCAAmC,KAAK;AAIjD,gCAAgC,SAAS,aAEzC,gCAAgC,cAAc;AAvJnB,SAAA,QAAC,IAAA;CAAuB,OAAA,GAAG,UAAU,aAAa;;AAWtD,SAAA,SAAC,GAAA;CAA6B,OAAA,EAAE,OAAO,eAAe,EAAE,SAAS;;AAcjE,SAAA,OAAC,MAAA;CAAuBa,OAAAA,KAAG,UAAU,aAAa;;AAUlD,SAAA,OAAC,KAAA;CAA6BC,OAAAA,IAAE,OAAO,eAAeA,IAAE,SAAS;;AASvC,SAAA,OAAA,IAA0B;CAAzB,IAAA,CAACC,UAAQ,cAATC;CACtC,OAAO,CACL,GAAG,wBAAwB,GAAG,oBAAoB,OAAOD,SAAO,gBAChE,UACF;AACF;AC7JV,SAAgB,iBAAiB,IAAoB,MAA2B;eACxE,SAAS,UAAU,GACnB,EAAC,kBAAkB,eAAc,cAAc,GAEnBE;CAuBlC,OAXe,EAAA,OAAA,cAAA,EAAA,OAXR,MAAA,EAAA,OAMH,UAAA,EAAA,OADGC,oBAAAA,EAAAA,OALO,QADoB,WAAM;EACtC,IAAI,CAAC,MAAM,CAAC,MACV;EAIF,IAAI,CAAC,iBAAiB,QAAQ;GAC5B,OAAO,eAAe,QAAQ;IAAC;IAAI;GAAI,CAAC;GACxC;EACF;EAEA,IAAM,QAAQ,CAAC,GAAG,gBAAgB;EAClC,MAAM,OAAO,aAAa,GAAG,GAAG,CAC9B;GACM;GACJ,QAAQ,EAAC,KAAI;EACf,CACF,CAAC;EAED,IAAM,OAAO,OAAO,qBAAqB,EAAC,MAAK,CAAC;EAChD,OAAO,YAAY,EAAC,MAAM,KAAI,CAAC;CACjC,GATe,EAAA,KAAA,YAXR,EAAA,KAAA,IAMH,EAAA,KAAA,QADGA,EAAAA,KAAAA,kBALO,EAAA,KAAA,8BAsBP;AACT;;;;;;;ACrBA,SAAgB,gBACd,UACA,KACA,MACA,sBAA+B,IACT;CACtB,OAAO;GACJ,sBAAsB;EACvB,MAAM,UAAU;EAChB,OAAO;EACP,OAAO;GACL,OAAO;GACP,MAAM;GACN,OAAO;GAEP,GAAI,sBAAsB,EAAC,sBAAsB,EAAC,KAAI,EAAC,IAAI,CAAC;EAC9D;CACF;AACF;;;;;;;ACJA,SAAwB,eAAe,OAA4B;gBAC3D,EAAC,IAAI,YAAY,YAAY,YAAY,qBAAoB,OAC7D,OAAO,iBAAiB,IAAI,oBAAoB,GAChD,cAAc,iBAAiB,YAAY,oBAAoB,GAC/D,EAAC,oBAAoB,YAAY,mBAAkB,uCAAuC,GACvEE;CAAC,AAAA,EAAA,OAAA,0BAAD,KAAA,EAAC,WAAU,GAAV,EAAA,KAAA;CAA1B,IAAM,SAAS,UAAUA,EAAY,GAC/B,CAAC,gBAAgB,qBAAqB,SAAS,EAAK,GAEpD,YAAY,CAAC,MAAM,EAAQ,cAAe,oBAEhBC;CAMR,AAAA,EAAA,OAAA,UAAA,EAAA,OAIlB,cAAA,EAAA,OATC,MAAA,EAAA,OAAM,cAAA,EAAA,OAkCT,QAAA,EAAA,OARI,eAAA,EAAA,OAhBSC,WAAAA,QAAAA,EAAAA,OAVU,oBAAA,EAAA,QAWpB,kBAZyB,WAAM;EACpC,IAAI,CAAC,MAAM,cAAc,kBAAkB;GAEzC,kBAAkB,EAAI;GAGtB,IAAM,cAAc,OAAO,YAAY,GAEjC,kBAAkB,gBACtB,kBACA,YACA,WAAW,MACX,CAAC,cACH,GACM,sBAAsB;IAC1B,KAAK;IACL,OAAO;IACP,aAAa,CAAC,WAAW,IAAI;IAC7B,cAAc,CAAC,eAAe;GAChC;GAIA,AAFA,YAAY,kBAAkB,mBAAmB,GAEjD,YACG,OAAO,CAAC,CACR,WAAW;IAEV,AADA,kBAAkB,EAAK,GACvB,YAAY;GAEd,CAAC,CAAC,CACD,OAAO,QAAiB;IAEvB,AADA,QAAQ,MAAM,GAAG,GACjB,kBAAkB,EAAK;GACzB,CAAC;EACL,OACE,KAAK;CAET,GA/BwB,EAAA,KAAA,QAIlB,EAAA,KAAA,YATC,EAAA,KAAA,IAAM,EAAA,KAAA,YAkCT,EAAA,KAAA,MARI,EAAA,KAAA,aAhBSA,EAAAA,KAAAA,WAAAA,MAVU,EAAA,KAAA,kBAWpB,EAAA,MAAA;CAZP,IAAM,cAAcC,IAiDd,WAAY,CAAC,MAAM,CAAC,aAAe,aAAa,CAAC,oBAAqB,gBAMtEC,IAMkBC;sDANlB,KAAA,oBAAC,KAAD;EAAK,SAAS;EACZ,UAAA,oBAAC,MAAD;GAAM,OAAA;GAAM,MAAM;GAChB,UAAA;EACI,CAAA;CACH,CAAA,GAEa,KAAA,CAAC,SAAS,MAAM;CAG1B,IAAA,KAAA,EAAQ,MAAO,WAEzBC;CAEc,AAAA,EAAA,QAAA,YAAA,EAAA,QAKD,eAAA,EAAA,QADA,kBANb,KAAA,oBAAC,OAAD,EAAA,UACE,oBAAC,QAAD;EACY;EACV,MAAK;EACL,MAAK;EACL,MAAM;EACN,SAAS;EACT,SAAS;CACV,CAAA,EACI,CAAA,GAPO,EAAA,MAAA,UAKD,EAAA,MAAA,aADA,EAAA,MAAA;CApBfC,IAAAA;CADF,OAacC,EAAAA,QAAAA,MAAAA,EAAAA,QAEVF,MAdF,KAAA,oBAAC,SAAD;EACE,SAAA;EACA,SACEF;EAMF,oBAAoBC;EACpB,WAAU;EACV,QAAA;EACA,UAAUG;EAEVF,UAAAA;CAUO,CAAA,GAZGE,EAAAA,MAAAA,IAEVF,EAAAA,MAAAA,8BAdFC;AA0BJ;;;;;;;;ACzFA,SAAgB,oBACd,KACA,YACuB;CAGvB,IAAI,CAAC,qBAAqB,UAAU,KAAK,CAAC,KACxC,OAAO;CAMT,IAAM,iBAA2B,aAAa,KAAK,YAAY,CAAC,CAAC,CAAC,CAG/D,QAAQ,UAAU,MAAM,YAAY,SAAS,8BAA8B,YAAY,EAAI,CAAC,CAE5F,KAAK,UACG,aAAa,MAAM,IAAI,CAC/B;CAiBH,OAAO,IAZS,SAAS,EACvB,WAAW,CACT,EACE,OAAO;EACL,IAAI,IAAI;EACR,OAAO;CACT,EACF,CACF,EACF,CAGO,CAAA,CAAI,MAAM,GAAG;AACtB;AAEA,SAAS,aACP,KACA,YACA,MACkB;CAClB,IAAM,SAA2B,CAAC;CAElC,KAAK,IAAM,SAAS,WAAW,QAAQ;EACrC,IAAM,YAAY,CAAC,GAAG,MAAM,MAAM,IAAI,GAChC,cAAc,MAAM,MACpB,EAAC,UAAS,gBAAgB,aAAa,SAAS,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC;EACrE,IAAI,SAAiC,MACnC;EAGF,IAAM,oBAAoC;GACxC,MAAM;GACN,MAAM,MAAM;GACZ,YAAY;GACZ;EACF;EAEA,IAAI,YAAY,aAAa,UAAU;GACrC,IAAM,cAAc,aAAa,KAAK,aAAa,SAAS;GAC5D,OAAO,KAAK,mBAAmB,GAAG,WAAW;EAC/C,OAAO,IACL,YAAY,aAAa,WACzB,YAAY,GAAG,UACf,YAAY,GAAG,MAAM,SAAS,YAAY,IAAI,GAC9C;GACA,IAAM,EAAC,OAAO,eAAc,gBAAgB,aAAa,SAAS,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC;GAIjF,IAFA,OAAO,KAAK,iBAAiB,GAExB,YAA0B,QAE7B,KAAK,IAAM,QAAQ,YAIf;IACF,IAAI,CAAC,KAAK,MAAM;IAChB,IAAM,WAAW,CAAC,GAAG,WAAW,EAAC,MAAM,KAAK,KAAI,CAAC,GAC7C,aAAa,YAAY,GAAG,MAAM,MAAM,EAAE,SAAS,KAAK,KAAK;IAIjE,IAHK,KAAK,UACR,aAAa,YAAY,GAAG,KAE1B,YAAY;KAEd,IAAM,cAAc,aAAa,KAAK,YAAgC,QAAQ,GACxE,cAA8B;MAClC,MAAM;MACN,MAAM,KAAK;MACX,YAAY;MACZ,OAAO;KACT;KACA,OAAO,KAAK,aAAa,GAAG,WAAW;IACzC;GACF;EAEJ,OACE,OAAO,KAAK,iBAAiB;CAEjC;CAEA,OAAO;AACT;;;;;;;;ACrFA,SAAwB,eAAe,OAA4B;gBAC3D,EACJ,UACA,YACA,YACA,SACA,QACA,kBACA,UACA,eACE,OAIE,CAAC,gBAAgB,qBAAqB,SAAS,EAAK,GACpD,WACJ,MAAM,YAAY,kBAAkB,WAAW,CAAC,UAAU,CAAC,oBAAoB,CAAC,YAC5BE;CACoBC,AAAAA,EAAAA,OAAAA,SAAAA,MAAAA,EAAAA,OADpBC,YAAU,KAAA,UAAA,aAAa,SACzE,SAAS,aAAa,MAAM,MAAM,EAAE,yBAAyB,SAAS,EAAE,IACxE,KAAA,GADsED,EAAAA,KAAAA,SAAAA,IADpBC,EAAAA,KAAAA;CAAtD,IAAM,cAAgDF,IAGhD,EAAC,YAAY,eAAe,gBAAgB,aAChD,uCAAuC,GAChBG;CAAC,AAAA,EAAA,OAAA,0BAAD,KAAA,EAAC,WAAU,GAAV,EAAA,KAAA;CAA1B,IAAM,SAAS,UAAUA,EAAY,GAC/B,QAAQ,SAAS,GAEjB,OAAO,iBAAiB,aAAa,OAAO,MAAM,WAAW,IAAI,GACxCC;CAAM,AAAA,EAAA,OAAA,oBAAN,WAAM,KAAK,GAAL,EAAA,KAAA;CAArC,IAAM,aAAaC,IAEcC;CA2H/B,AAhCQ,EAAA,OAAA,YAAA,EAAA,OA5EY,UAAA,EAAA,OA4BlB,cAAA,EAAA,QAf0BL,SAAAA,MAAAA,EAAAA,QAoDMM,SAAAA,SAAAA,EAAAA,QApD/B,iBAAA,EAAA,QAgD2CC,UAAAA,cAAAA,EAAAA,QAnEzC,cAAA,EAAA,QA0BH,cAAA,EAAA,QAlCG,UAAA,EAAA,QAIA,oBAAA,EAAA,QAyED,SAAA,EAAA,QAjCD,kBA7C4B,KAAA,YAAY;EAC3C,IAAI,CAAC,QACH,MAAU,MAAM,mDAAmD;EAGrE,IAAI,CAAC,kBACH,MAAU,MAAM,sDAAsD;EAGxE,IAAI,CAAC,YACH,MAAU,MAAM,iDAAiD;EAGnE,kBAAkB,EAAI;EAEtB,IAAM,cAAc,OAAO,YAAY,GAKjC,2BAA2B,KAAK,GAChC,kBAAkB,YAAY,OAAO,GAAG,IAAI,iBAAiB,OAAO,GAAG,IAAI,KAAA,GAC7E,yBAAyB;GAC3B,GAAG;GACH,KAAK,kBACD,aAAa,0BAA0B,eAAe,IACtD,WAAW,wBAAwB;IAEtC,gBAAgB,SAAS;EAC5B;EASA,AALA,yBAAyB,oBACvB,wBACA,UACF,GAEA,YAAY,OAAO,sBAAsB;EAGzC,IAAM,kBAAkB,gBACtB,kBACA,YACA,WAAW,MACX,CAAC,cACH,GACM,0BAA0B,gBAC9B,SAAS,IACT,0BACA,WAAW,MACX,CAAC,cACH,GACM,sBAAwC;GAC5C,KAAK;GACL,OAAO;GACP,aAAa,CAAC,WAAW,IAAI;GAC7B,cAAc,CAAC,eAAe;EAChC;EAEA,YAAY,kBAAkB,mBAAmB;EAKjD,IAAM,gBAAgB,OACnB,MAAM,UAAU,CAAC,CACjB,aAAa,EAAC,cAAc,CAAC,eAAe,EAAC,CAAC,CAAC,CAC/C,OAAO,SAAS,oBAAoB,CAAC,uBAAuB,CAAC;EAKhE,AAHA,YAAY,MAAM,aAAa,GAG/B,YACG,OAAO,CAAC,CACR,WAAW;GACV,IAAM,kBAAkB,EAAQ,UAAU;GAe1C,IAbA,MAAM,KAAK;IACT,QAAQ;IACR,OAAO,YAAY,SAAS,MAAM;IAClC,aAAa,kBACT,kCACA;GACN,CAAC,GAID,kBAAkB,EAAK,GAGnB,UAEF,OAAO,SAAS;IACd;IACA;IACA,gBAAgB;IAChB,aAAa;IACb,uBAAuB,SAAS;IAChC,gBAAgB;GAClB,CAAC;EAIL,CAAC,CAAC,CACD,OAAO,SACN,QAAQ,MAAM,GAAG,GAGjB,kBAAkB,EAAK,GAEhB,MAAM,KAAK;GAChB,QAAQ;GACR,OAAO;GACP,aAAa,IAAI;EACnB,CAAC,EACF;CACL,GA1BU,EAAA,KAAA,UA5EY,EAAA,KAAA,QA4BlB,EAAA,KAAA,YAf0BP,EAAAA,MAAAA,SAAAA,IAoDMM,EAAAA,MAAAA,SAAAA,OApD/B,EAAA,MAAA,eAgD2CC,EAAAA,MAAAA,UAAAA,YAnEzC,EAAA,MAAA,YA0BH,EAAA,MAAA,YAlCG,EAAA,MAAA,QAIA,EAAA,MAAA,kBAyED,EAAA,MAAA,OAjCD,EAAA,MAAA,0CA8EH,UAAU;CA3HZ,IAAM,eAAeC,IAqIjB;CAEJ,AAAI,UACF,UAAU,qBACD,cACT,UAAU,QAAQ,SAAS,MAAM,gBACvB,gBACV,UAAU,cAAc,SAAS,MAAM;CAOnCC,IAAAA;CAEK,AAAA,EAAA,QAAA,wBAFL,KAAA,oBAAC,KAAD;EAAK,SAAS;EACZ,UAAA,oBAAC,MAAD;GAAM,OAAA;GAAM,MAAM;GACf,UAAA;EACG,CAAA;CACH,CAAA,GAFA,EAAA,MAAA;CAIaC,IAAAA;sDAAC,KAAA,CAAA,SAAS,MAAM;CAKzB,IAAA,KAAA,cAAc,aAAa,cAC9B,KAAA,WAAW,WAAW,YAAY,SAIrCC;CAAa,AAAA,EAAA,QAAA,WAAA,EAAA,QAAb,YAAA,EAAA,QAII,eAJJ,KAAA,YAAY,CAAC,UACZ,oBAAC,SAAD,CAAU,CAAA,IAEV,oBAAC,MAAD;EAAM,MAAM;EACT,UAAc,IAAd,cAAe,oBAAuB,UAAW,gBAAoB,SAAvD,CAAoB,CAA4C;CAC3E,CAAA,GALM,EAAA,MAAA,SAAb,EAAA,MAAA,UAII,EAAA,MAAA;CAGLC,IAAAA;CACkBN,AAAAA,EAAAA,QAAAA,SAAAA,sBADlB,KAAA,oBAAC,KAAD;EAAK,MAAM;EACT,UAAA,oBAAC,MAAD,EAAA,UAAO,SAAS,MAAY,CAAA;CACzB,CAAA,GADaA,EAAAA,MAAAA,SAAAA;CAEL,IAAA,MAAA,YAAY,UAAU,YAAY,WAA/CO;CAAoEb,AAAAA,EAAAA,QAAAA,SAAAA,MAAAA,EAAAA,QAAvDc,OAAb,MAAA,oBAAC,OAAD;EAAO,MAAMA;EAA8C,UAAA,SAAS;CAAU,CAAA,GAAVd,EAAAA,MAAAA,SAAAA,IAAvDc,EAAAA,MAAAA;CAXfC,IAAAA;CAWEF,AAAAA,EAAAA,QAAAA,OAAAA,EAAAA,QAVCF,MAAAA,EAAAA,QAODC,MARF,MAAA,qBAAC,MAAD;EAAM,KAAK;EAAG,OAAM;EAApB,UAAA;GACGD;GAODC;GAGAC;EACI;KADJA,EAAAA,MAAAA,KAVCF,EAAAA,MAAAA,IAODC,EAAAA,MAAAA;CAbJI,IAAAA;CAGY,AAAA,EAAA,QAAA,YAAA,EAAA,QAEVD,OAAAA,EAAAA,QAJSE,MAAAA,EAAAA,QACHC,MAFR,MAAA,oBAAC,QAAD;EACE,SAASD;EACT,MAAMC;EACI;EAEVH,UAAAA;CAaM,CAAA,GAfI,EAAA,MAAA,UAEVA,EAAAA,MAAAA,KAJSE,EAAAA,MAAAA,IACHC,EAAAA,MAAAA;CAfVC,IAAAA;CADF,OAcIH,EAAAA,QAAAA,OAAAA,EAAAA,QAVEP,MAHJ,MAAA,oBAAC,SAAD;EACE,SAAA;EACA,SACEA;EAMF,oBAAoBC;EACpB,WAAU;EACV,QAAA;EAEAM,UAAAA;CAmBO,CAAA,GAnBPA,EAAAA,MAAAA,KAVEP,EAAAA,MAAAA,gCAHJU;AAkCJ;;;;;;ACvOA,SAAwB,cAAc,OAA2B;gBACzD,EAAC,UAAU,WAAU,OACrB,EAAC,YAAY,kBAAiB,uCAAuC,GACrE,WAAW,MAAM,YAAY,CAAC,QACXC;CAAC,AAAA,EAAA,OAAA,0BAAD,KAAA,EAAC,WAAU,GAAV,EAAA,KAAA;CAA1B,IAAM,SAAS,UAAUA,EAAY,GAC/B,QAAQ,SAAS,GAESC;CAO9B,AAAA,EAAA,OAAA,UAAA,EAAA,OAEkCC,SAAAA,MAAAA,EAAAA,OAIgBC,SAAAA,SAAAA,EAAAA,OAJzC,iBAAA,EAAA,OARJ,UAAA,EAAA,OAWD,SAZ0B,WAAM;EACpC,IAAI,CAAC,QACH,MAAU,MAAM,+BAA+B;EAGjD,IAAM,YAAY,OAAO;EAEzB,OACG,MAAM,SAAS,CAAC,CAChB,IAAI,GAAE,gBAAgB,SAAS,GAAE,CAAC,CAAC,CACnC,OAAO,CAAC,CACR,WAAW;GACV,MAAM,KAAK;IACT,OAAO,4BAA4B,SAAS;IAC5C,QAAQ;GACV,CAAC;EAEH,CAAC,CAAC,CACD,OAAO,SACN,QAAQ,MAAM,GAAG,GAEV,MAAM,KAAK;GAChB,OAAO,sCAAsC,SAAS;GACtD,QAAQ;EACV,CAAC,EACF;CACL,GAnBE,EAAA,KAAA,QAEkCD,EAAAA,KAAAA,SAAAA,IAIgBC,EAAAA,KAAAA,SAAAA,OAJzC,EAAA,KAAA,eARJ,EAAA,KAAA,QAWD,EAAA,KAAA;CAZN,IAAM,cAAcC,IA+BdC;qDAAC,KAAA,oBAAA,MAAD;EAAM,MAAM;EACV,UAAA,oBAAC,UAAD,CAAW,CAAA;CACP,CAAA;CACNC,IAAAA;CACkBH,AAAAA,EAAAA,QAAAA,SAAAA,sBADlB,KAAA,oBAAC,KAAD;EAAK,MAAM;EACT,UAAA,oBAAC,MAAD,EAAA,UAAO,SAAS,MAAY,CAAA;CACzB,CAAA,GADaA,EAAAA,MAAAA,SAAAA;CAElBI,IAAAA;CAAiBL,AAAAA,EAAAA,QAAAA,SAAAA,mBAAjB,KAAA,oBAAC,OAAD,EAAA,UAAQ,SAAS,GAAU,CAAA,GAAVA,EAAAA,MAAAA,SAAAA;CAPnBM,IAAAA;CAIEF,AAAAA,EAAAA,QAAAA,MAAAA,EAAAA,QAGAC,MAPF,KAAA,qBAAC,MAAD;EAAM,KAAK;EAAG,OAAM;EAApB,UAAA;GACEF;GAGAC;GAGAC;EACI;KAJJD,EAAAA,MAAAA,IAGAC,EAAAA,MAAAA;CARJE,IAAAA;CADF,OACuD,EAAA,QAAA,YAAA,EAAA,QAAvB,eAAA,EAAA,QAC5BD,MADF,KAAA,oBAAC,QAAD;EAAQ,MAAK;EAAQ,SAAS;EAAuB;EAAU,SAAQ;EACrEA,UAAAA;CASM,CAAA,GAV6C,EAAA,MAAA,UAAvB,EAAA,MAAA,aAC5BA,EAAAA,MAAAA,8BADFC;AAYJ;AClEA,SAAwB,eAAA,IAA2E;eAA5D,EAAC,aAADC,IAClBC;qDAAC,KAAA,EAAA,UAAU,IAAG;CAA1BC,IAAAA;CAAP,OAAqC,EAAA,OAAA,wBAA9B,KAAA,oBAAC,KAAD;EAAK,OAAOD;EAAkB;CAAc,CAAA,GAAd,EAAA,KAAA,sBAA9BC;AACT;;;;;;ACMA,SAAwB,QAAA,IAAuC;eAA/B,EAAC,aAADC,IAE5BC;CADF,OAKW,EAAA,OAAA,wBAJT,KAAA,oBAAC,MAAD;EAAM,MAAK;EAAU,SAAS;EAC5B,UAAA,oBAAC,MAAD;GAAM,SAAQ;GACZ,UAAA,oBAAC,gBAAD,EAAA,UACE,oBAAC,MAAD;IAAM,MAAM;IAAG,OAAM;IAClB;GACG,CAAA,EACQ,CAAA;EACZ,CAAA;CACF,CAAA,GAJG,EAAA,KAAA,sBAJTA;AAUJ;ACLA,SAAgB,iCACd,OAC0B;gBACpB,EAAC,eAAc,OACf,aAAa,MAAM,YACnB,EAAC,eAAe,uBAAsB,uCAAuC,GAG7E,CAAC,OAAO,YAAY,SAAS,EAAE,GACLC;qDAAC,MAAA,UAAyC;EACxE,AAAI,MAAM,cAAc,QACtB,SAAS,MAAM,cAAc,KAAK,IAElC,SAAS,EAAE;CAEf;CANA,IAAM,cAAcC,IASd,CAAC,MAAM,WAAW,SAAS,EAAK,GACNC;qDAAM,WAAA,QAAQC,OAAS;CAAvD,IAAM,cAAcC,IACd,YAAY,OAA0B,IAAI,GAC1C,aAAa,OAAuB,IAAI,GACPC;qDAAM,WAAA,QAAQ,EAAK;CAA1D,IAAM,qBAAqBC,IACcC;CAAzC,oDAA+C,WAAA,CAAC,UAAU,SAAS,WAAW,OAAO,2BAArF,qBAAqB,oBAAoBA,EAA6C;CAGtF,IAAM,EAAC,MAAM,SAAS,UAAS,uBAAuB,UAAU,GAC1D,WAAW,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,KAAK,KAAK;CAYnD,UAAU;CAPJC,IAAAA;;EACjB,IAAI,SAAS;GACX,KAAO;GAAP,MAAA;EACF;EAGOC,IAAAA;EAAP,AAAiBC,EAAAA,OAAAA,UAAAA,mBAAV,KAAA,UAAU,OAAO,KAAK,GAAZA,EAAAA,KAAAA,UAAAA,iBAAjB,KAAOD;;CANT,IAAM,aAAaD,IAYb,EAAC,sBAAqB,eAAe,GACrC,EAAC,OAAO,WAAW,YAAW,aAClC,YACA,WAAW,MACX,WACA,iBACF,GACM,SAAS,WAAW,SAAS,WAG7B,kCACG,MAAM,QAAQ,IAAI,KAAK,KAAK,UAAU,GAEzC,mBAAmB,SAAS,gBAC5B,mBAAmB,OAAO,oBAAqB,WAAW,mBAAmB,KAAA,GACrDG;CAAwC,IAAA,EAAA,OAAA,oBAAA,EAAA,OAAxC,oBAAA;EAAwBC,IAAAA;EAAgB,EAAA,OAAA,iCAAhB,MAAC,MAAM,EAAE,OAAO,wDAAxC,KAAA,mBAAmB,KAAKA,EAAgC,GAAhB,EAAA,KAAA,kBAAxC,EAAA,KAAA;;CAA9B,IAAM,wBAAwBD,IAEdE;8CAAmB,KAAA,mBAAA,MAAMC,QAAsB,GAA/C,EAAA,MAAA;CAAd,IAAM,QAAQD;CACd,AAAK,SACH,QAAQ,KACN,8LACA,kBACF;CANJ,IAAM,uBAAuBE,OAa3BC;CA8Be,AAAA,EAAA,QAAA,wBAAA,EAAA,QAPA,QAAA,EAAA,QAdK,cAAA,EAAA,QAcG,mCAAA,EAAA,QAtBpB,SAAA,EAAA,QAmBQ,WAAA,EAAA,QAZCC,YAAAA,EAAAA,QAEQ,cAAA,EAAA,QAK6B,SAAA,EAAA,QAJ7B,cAAA,EAAA,QAyDM,UAAA,EAAA,QAxDA,oBAAA,EAAA,QA4BU,yBAAA,EAAA,QA1B7BC,sBAdP,KAAA,oBAAC,KAAD;EAAK,SAAS;EACX,UAAA,QACC,oBAAC,MAAD;GAAM,MAAK;GAAW,SAAS;GAC7B,UAAA,oBAAC,MAAD,EAAA,UAAM,qDAAwD,CAAA;EAC1D,CAAA,IAEN,qBAAC,OAAD;GAAO,KAAK;GAAZ,UAAA;IACE,oBAAC,gBAAD;KACE,IAAI,UAAU;KACF;KACA;KACA;KACM;IACnB,CAAA;IACA,mBAAmB,SAAS,IAC3B,oBAAC,WAAD;KAAW,UAAU;KAAa,OAAO;KAAO,aAAY;IAAoB,CAAA,IAC9E;IACH,mBAAmB,SAAS,IAC3B,qBAAA,UAAA,EAAA,UAAA,CAEG,UAAU,OACT,qBAAA,UAAA,EAAA,UAAA;KAEG,QAAQ,kCAAkC,OACzC,oBAAC,SAAD,EAAA,UAEE,+EACO,CAAA;KAGV,uBAAuB,OACtB,oBAAC,SAAD,EAAA,UAAS,uDAA6D,CAAA;KAGvE,mBAAmB,OAClB,qBAAC,SAAD,EAAA,UAAA,CACE,kCAA8B,oBAAC,UAAD,EAAA,UAAQ,gBAAqB,CAAA,CACpD,EAAA,CAAA;KAGV,oBAAoB,CAAC,wBACpB,qBAAC,SAAD,EAAA,UAAA;MACE;MAAqD;MACrD,oBAAC,QAAD,EAAA,UAAO,iBAAuB,CAAA;KACvB,EAAA,CAAA,IACP;IACJ,EAAA,CAAA,GAEH,mBACE,QAAQ,aACP,CAAI,SACK,SAAS,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,YAAY,CAAC,CAGnE,CAAC,CACD,KAAK,eACJ,CAAC,WAAW,oBAAoB,wBAG9B,oBAAC,gBAAD;KAEE,UAAUC;KACE;KACA;KACZ,UAAU,CAAC;KACX,SAASA,WAAS,OAAO;KACf;KACE;KACJ;KACU;IACnB,GAVMA,WAAS,EAUf,IAGD,oBAAC,eAAD;KAEU;KACR,UAAUA;KAIV,WACG,WACC,CAAC,wBACD,UAAU,aACP,QAAQ,MAAM,GAAG,OAAO,SAAS,UAAU,CAAC,CAC5C,MAAM,QAAMC,IAAE,yBAAyBD,WAAS,EAAE,MACvD;IAEH,GAdMA,WAAS,EAcf,CAEL,CACF,EAAA,CAAA,IACA;GACC;;CAEN,CAAA,GAjEU,EAAA,MAAA,sBAPA,EAAA,MAAA,MAdK,EAAA,MAAA,YAcG,EAAA,MAAA,iCAtBpB,EAAA,MAAA,OAmBQ,EAAA,MAAA,SAZCF,EAAAA,MAAAA,UAEQ,EAAA,MAAA,YAK6B,EAAA,MAAA,OAJ7B,EAAA,MAAA,YAyDM,EAAA,MAAA,QAxDA,EAAA,MAAA,kBA4BU,EAAA,MAAA,uBA1B7BC,EAAAA,MAAAA;CAfT,IAAM,UACJF,IAkGI,wBAAwB,CAAC,WAAW,oBAAoB,CAAC;CAM/D,IAJI,CAAC,cAID,CAAC,cAAc,CAAC,WAAW,MAC7B,OAAO;CAiBO,IAAA,KAAA,CAAC,QACL,KAAA,CAAC,UAAU,WAAW,CAAC,wBAAwB,KAAA,IAAY,WAJnEK;CAQY,AAAA,EAAA,QAAA,QAAA,EAAA,QALAC,MAAAA,EAAAA,QACJC,MAJR,MAAA,oBAAC,QAAD;EACE,MAAK;EACL,MAAK;EACL,UAAUD;EACV,MAAMC;EACN,MAAM;EACN,SAAS;EACT,KAAK;EACL,UAAU;EACV,eAAY;CACb,CAAA,GAFW,EAAA,MAAA,MALAD,EAAAA,MAAAA,IACJC,EAAAA,MAAAA;CAdVC,IAAAA;CADF,OAIa,EAAA,QAAA,WAAA,EAAA,QACH,QAAA,EAAA,QAMNH,OAVF,MAAA,oBAAC,SAAD;EACE,SAAA;EACA,eAAA;EACS;EACH;EACN,QAAA;EACA,KAAK;EACL,UAAS;EACT,MAAK;EAELA,UAAAA;CAWO,CAAA,GAlBE,EAAA,MAAA,SACH,EAAA,MAAA,MAMNA,EAAAA,MAAAA,iCAVFG;AAuBJ;AAhJ2C,SAAA,SAAC,KAAA;CAAMC,OAAAA,IAAE,MAAMA,IAAE;;AA1CZ,SAAA,QAAC,GAAA;CAAM,OAAA,CAAC;;;;;;;;;ACVxD,MAAa,2BAA2B,UAA0D;gBAC1F,EAAC,IAAI,YAAY,WAAW,UAAS,OACrC,MAAM,SAAS,WAEf,CAAC,cAAc,iBAAiB,SAAS,EAAK,GACxBC;qDAAM,WAAA,cAAc,EAAK;CAArD,IAAM,UAAUC,IAGZC;6BAAO,KAAA,OAAA,MAAM,QAAQ,IAAI,wBAAwB,IAE5C,IAAI,2BACL,CAAC,GAHL,EAAA,KAAA;CAFJ,IAAM,eAAuCC,IASvC,QAAQ,SAAS,GACEC;qDAAC,KAAA,EAAA,YAAY,YAAW;CAAjD,IAAM,SAAS,UAAUA,EAAyB,GAGpBC;CACjB,AAAA,EAAA,OAAA,UAAA,EAAA,OAEF,cAAA,EAAA,OAiBL,SAAA,EAAA,OAfAC,gBALwB,WAAM;EAClC,IAAM,KAAK,OAAO,YAAY;EAe9B,AAbA,GAAG,MAAM,YAAYC,OAAiD,GAElE,aAAa,SAAS,KACxB,aAAa,SAAS,gBAAgB;GAEpC,AADA,GAAG,OAAO,YAAY,MAAM,IAAI,GAChC,GAAG,OAAO,UAAU,YAAY,MAAM,MAAM;EAC9C,CAAC,GAGH,GAAG,OAAO,UAAU,GAEpB,GAAG,OAAO,UAAU,YAAY,GAEhC,GAAG,OAAO,CAAC,CACR,WAAW;GAGV,AAFA,QAAQ,GAER,MAAM,KAAK;IACT,QAAQ;IACR,OAAO;GACT,CAAC;EAEH,CAAC,CAAC,CACD,OAAO,QAAe;GACrB,MAAM,KAAK;IACT,QAAQ;IACR,OAAO;IACP,aAAa,IAAI;GACnB,CAAC;EACH,CAAC;CACL,GAhCa,EAAA,KAAA,QAEF,EAAA,KAAA,YAiBL,EAAA,KAAA,OAfAD,EAAAA,KAAAA;CALN,IAAM,YAAYE,IAqCN,KAAA,CAAC,OAAO,CAAC,aAAa,QAGtBC;qDAAM,WAAA;EACd,cAAc,EAAI;CACpB;CACQC,IAAAA;CAIJ,AAAA,EAAA,QAAA,gBAAA,EAAA,QAAA,aAAA,EAAA,QAKAJ,gBATI,KAAA,gBAAgB;EACtB,MAAM;EACN,UAAU;EACV,iBAAiB;GAEf,AADA,UAAU,GACV,QAAQ;EACV;EACA,MAAM;EACN,SACE,aAAa,WAAW,IACpB,2CACA,cAAc,aAAa,OAAO;CAC1C,GAZQ,EAAA,MAAA,cAIJ,EAAA,MAAA,WAKAA,EAAAA,MAAAA;CAjBCK,IAAAA;CAAP,OAEYC,EAAAA,QAAAA,MAAAA,EAAAA,QAMFF,MARH,KAAA;EACL,OAAO;EACP,UAAUE;EACV,MAAM;EACN,MAAM;EACN,UAAUH;EAGV,QAAQC;CAaV,GAnBYE,EAAAA,MAAAA,IAMFF,EAAAA,MAAAA,8BARHC;AAsBT;AAtDyB,SAAA,QAAC,OAAA;CAAU,OAAA,MAAM,MAAM,CAAC,uBAAuB,CAAC;;;;;;;;;ACrCzE,SAAgB,cAAc,OAA4D;CACxF,IAAM,SAAS,OAAO,WAAW,OAAO,SAAS,OAAO,WAClD,EAAC,eAAe,uBAAsB,uCAAuC,GAC7E,aAAa,SAAS;CAE5B,IAAI,CAAC,cAAc,OAAO,cAAe,UACvC,OAAO;CAGT,IAAM,WAAW,MAAM,QAAQ,kBAAkB,IAC7C,mBAAmB,MAAM,MAAM,EAAE,OAAO,UAAU,IAClD;CAGJ,OAAO;EACL,OAAO,UAAU,MAAM;EACvB,OAAO,UAAU,SAAS,KAAA;EAC1B,OAAO;CACT;AACF;ACdA,SAAwB,cAAc,OAA2B;gBACzD,EAAC,IAAI,iBAAiB,cAAc,iBAAiB,YAAY,kBAAiB,OAElF,YAAY,aAAa,IAAI,EAAE,GAC/B,eAAe,UAAU,OAAO,SAAS,UAAU,WAAW,SAAS,IAEvE,EAAC,cAAc,YAAA,OAAmB,oBAAoB,IAAI,cAAc,EAAK,GAA9DE;4BAAa,KAAA,OAAA,KAAA,IAAA,CAAC,IAAdA;sBACf,SAAS,UAAU,GAGhBC;CAAC,AAAA,EAAA,OAAA,gBAAA,EAAA,OAAgB,cAAjB,KAAA,CAAC,gBAAgB,WAAW,KAAKC,OAAgC,GAAhE,EAAA,KAAA,cAAgB,EAAA,KAAA;CAD1B,IAAM,sBAAsBC,IAIlBC,IAgBPC;CAaH,IArBI,EAAA,OAAA,cAAA,EAAA,OANA,gBAAA,EAAA,OAKYC,UAAAA,SAAAA,EAAAA,OALC,MAAA,EAAA,OAWV,gBAAA,EAAA,QACH,mBAAA,EAAA,QAJA,iBAAA,EAAA,QANA,mBAAA,EAAA,QAHE,uBADI,WAAM;EAad,AAZI,sBACF,aAAa,EAAE,IAEf,gBAAgB,EAAE,GAGhB,UAAU,QACZ,WAAW,EAAE,IAEb,cAAc,EAAE,GAGb,gBACH,gBAAgB,EAAE;CAEtB,GAAG,KAAA;EACD;EACA;EACA,UAAU;EACV;EACA;EACA;EACA;EACA;EACA;CACF,GAlBI,EAAA,KAAA,YANA,EAAA,KAAA,cAKYA,EAAAA,KAAAA,UAAAA,OALC,EAAA,KAAA,IAWV,EAAA,KAAA,cACH,EAAA,MAAA,iBAJA,EAAA,MAAA,eANA,EAAA,MAAA,iBAHE,EAAA,MAAA,yEADN,UAAUF,IAgBPC,EAUF,GAGG,CAAC,UAAU,OACb,OAAO;CAGUE,IAAAA;CAA2BC,AAAAA,EAAAA,QAAAA,UAAN,MAAM,SAAA,EAAA,QAA3B,UAAO,KAAA,OAAA,IAAI,UAAU,MAAM,KAAK,GAALA,EAAAA,MAAAA,UAAN,MAAM,OAA3B,EAAA,MAAA;CAAnB,IAAM,aAAaD,IAGc,KAAA,sBAAsB,aAAa,YAC/DE;CAAUH,AAAAA,EAAAA,QAAAA,UAAAA,SAAAA,EAAAA,QAAS,cAAnB,KAAA,UAAU,SAAS,aAClB,oBAAC,SAAD;EAAS,QAAO;EAAU,OAAO,UAAU;EAAmB;CAAa,CAAA,IAE3E,oBAAC,SAAD,CAAU,CAAA,GAHDA,EAAAA,MAAAA,UAAAA,OAAS,EAAA,MAAA;CADtBI,IAAAA;CADF,OACiCC,EAAAA,QAAAA,MAAAA,EAAAA,QAC5BF,MADH,KAAA,oBAAC,MAAD;EAAM,QAAA;EAAO,SAAS;EAAG,MAAME;EAC5BF,UAAAA;CAKG,CAAA,GANyBE,EAAAA,MAAAA,IAC5BF,EAAAA,MAAAA,8BADHC;AAQJ;AA/C4C,SAAA,QAAC,MAAA;CAAS,OAAA,KAAK,UAAU;;ACfrE,SAAwB,SAAS,OAAsB;gBAC/C,EAAC,MAAM,MAAM,MAAM,aAAY,OAC/B,OAAO,MAOPE;CAIoB,AAAA,EAAA,OAAA,YAAA,EAAA,OAAA,QAJpB,KAAA,WACE,oBAAA,UAAA,EAAG,SAAW,CAAA,IAEd,oBAAC,KAAD;EAAK,SAAS;EACZ,UAAA,oBAAC,MAAD;GAAM,MAAM;GAAI,UAAA;EAAW,CAAA;CACxB,CAAA,GALP,EAAA,KAAA,UAIoB,EAAA,KAAA;CAMpBC,IAAAA;CAAC,AAAA,EAAA,OAAA,oBAAD,KAAA,oBAAC,MAAD,CAAO,CAAA,GAAN,EAAA,KAAA;CADHC,IAAAA;CACED,AAAAA,EAAAA,OAAAA,MAAAA,EAAAA,OADkB,QAApB,KAAA,oBAAC,cAAD;EAAoB;EAAM,MAAM;EAC9BA,UAAAA;CACY,CAAA,GADZA,EAAAA,KAAAA,IADkB,EAAA,KAAA;CAbtBE,IAAAA;CADF,OAKMH,EAAAA,OAAAA,MAAAA,EAAAA,OASFE,MAbF,KAAA,oBAAC,SAAD;EACE,SAAA;EACA,QAAA;EACA,SACEF;EASFE,UAAAA;CAGO,CAAA,GAZLF,EAAAA,KAAAA,IASFE,EAAAA,KAAAA,8BAbFC;AAkBJ;AC7BA,SAAwB,OAAO;eAGSC;qDAAC,KAAA,EAAA,UAAU,IAAG;CAC9CC,IAAAA;qDAAC,KAAA,oBAAA,KAAD,EAAA,UACE,oBAAC,MAAD;EAAM,MAAM;EAAG,UAAA;CAA8C,CAAA,EAC1D,CAAA;CACLC,IAAAA;qDAAC,KAAA,oBAAA,KAAD,EAAA,UACE,oBAAC,MAAD;EAAM,MAAM;EACV,UAAA;CACI,CAAA,EACH,CAAA;CATTC,IAAAA;CADF,2DACG,KAAA,oBAAA,UAAD;EAAU,MAAM;EAAiB,MAAK;EACpC,UAAA,qBAAC,OAAD;GAAO,SAAS;GAAG,KAAK;GAAG,OAAOH;GAAlC,UAAA;IACEC;IAGAC;IAKA,oBAAC,KAAD,EAAA,UACE,oBAAC,MAAD;KAAM,MAAM;KACV,UAAA;IAEI,CAAA,EACH,CAAA;GACA;;CACC,CAAA,2BAjBVC;AAmBJ;ACXA,SAAwB,YAAY,OAAyB;gBACrD,EAAC,iBAAgB,OACEC;qDAAC,KAAA,EAAA,YAAY,YAAW;CAAjD,IAAM,SAAS,UAAUA,EAAyB,GAC5C,EAAC,WAAW,YAAW,aAAa,GACpC,QAAQ,SAAS,GACjB,CAAC,YAAY,iBAAiB,SAA0B,IAAI,GACXC;qDAAC,KAAA,CAAA;CAAxD,IAAM,CAAC,YAAY,iBAAiB,SAAmBA,EAAE,GAErBC;qDAAC,MAAA,OAAe;EAClD,eAAe,QAAQ,MAAM,qBAAK,IAAI,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;CAC1D;CAFA,IAAM,kBAAkBC,IAKlB,CAAC,MAAM,WAAW,SAAS,EAAK,GACXC;qDAAM,WAAA,QAAQ,EAAI;CAA7C,IAAM,SAASC,IACaC;qDAAM,WAAA,QAAQ,EAAK;CAA/C,IAAM,UAAUC,IAEiBC;qDAAC,MAAA,SAAe;EAC/C,eAAe,UAASC,QAAM,MAAM,qBAAK,IAAI,IAAI,CAAC,GAAGA,OAAKC,IAAE,CAAC,CAAC,IAAI,CAACA,IAAE,CAAE;CACzE;CAFA,IAAM,eAAeC,IAIeC;qDAAC,MAAA,SAAe;EAClD,eAAe,UAASH,QAAMA,MAAI,QAAQ,MAAM,MAAMC,IAAE,IAAI,CAAC,CAAE;CACjE;CAFA,IAAM,kBAAkBG,IAI2BZ;qDAAC,KAAA,CAAA;CAApD,IAAM,CAAC,UAAU,eAAe,SAAmBA,EAAE,GAEtBa;qDAAC,MAAA,SAAe;EAC7C,aAAa,UAAQ,MAAM,qBAAK,IAAI,IAAI,CAAC,GAAGL,OAAKC,IAAE,CAAC,CAAC,CAAC;CACxD;CAFA,IAAM,aAAaK,IAIeC;qDAAC,MAAA,SAAe;EAChD,aAAa,UAAQP,MAAI,QAAQ,QAAMQ,QAAMP,IAAE,CAAC;CAClD;CAFA,IAAM,gBAAgBQ,IAIgBC;CAIpC,AAAA,EAAA,QAAA,UAAA,EAAA,QAEkC,WAAA,EAAA,QAAb,aAAA,EAAA,QAKjB,SAAA,EAAA,QAVS,gBADuB,YAAM;EAC1C,IAAM,OAAO,aAAa,IAAIC,OAE5B;EACF,OACG,QAAQ;GACP,KAAK,YAAY,UAAU,GAAG;GAC9B,QAAQ;GACR;EACF,CAAC,CAAC,CACD,WAAW;GACV,MAAM,KAAK;IACT,QAAQ;IACR,OAAO;IACP,aAAa;GACf,CAAC;EAEH,CAAC,CAAC,CACD,OAAO,QAAe;GAErB,AADA,QAAQ,MAAM,GAAG,GACjB,MAAM,KAAK;IACT,QAAQ;IACR,OAAO;IACP,aAAa;GACf,CAAC;EACH,CAAC;CACL,GAtBE,EAAA,MAAA,QAEkC,EAAA,MAAA,SAAb,EAAA,MAAA,WAKjB,EAAA,MAAA,OAVS,EAAA,MAAA;CADf,IAAM,oBAAoBC,KA4BpB,WAEJ,WAAW,WAAW,aAAa,UAEnC,GAAQ,cAAc,YAAY,SAAS,MAE3C,CAAC,SAAS,QAELC;CAAP,OAyE0B,EAAA,QAAA,YAAA,EAAA,QAjDbC,YAAAA,EAAAA,QAgDY,qBAAA,EAAA,QAvCR,cAAA,EAAA,QAnBV,QAAA,EAAA,QAdAC,gBAAc,MAAA,cAAA,SAAS,IAC5B,oBAAC,MAAD;EAAM,SAAS;EAAG,QAAA;EAAO,QAAQ;EAC/B,UAAA,qBAAC,OAAD;GAAO,KAAK;GAAZ,UAAA;IACE,qBAAC,QAAD;KAAQ,KAAK;KAAb,UAAA,CACE,oBAAC,MAAD;MAAM,QAAO;MAAO,MAAM;MACxB,UAAA;KACI,CAAA,GACN,oBAAC,MAAD,CAAO,CAAA,CACD;;IAER,oBAAC,OAAD,EAAA,UACE,oBAAC,QAAD;KAAQ,SAAS;KAAQ,MAAK;KAA0B,MAAK;IAAS,CAAA,EACjE,CAAA;IAEN,QACC,oBAAC,QAAD;KACE,SAAA;KACA,QAAO;KACP,IAAG;KACM;KACT,SAAS;KACT,OAAO;KAEP,UAAA,qBAAC,OAAD;MAAO,KAAK;MAAG,SAAS;MAAxB,UAAA;OACG,SAAS,SAAS,IACjB,qBAAC,OAAD;QAAO,KAAK;QAAZ,UAAA,CACE,qBAAC,MAAD;SAAM,MAAM;SAAZ,UAAA;UACE;UAAM;UACL,SAAS,WAAW,IACjB,wBACA,OAAO,SAAS,OAAO;UAC3B;SACI;QACL,CAAA,GAAA,cAAc,WAAW,SAAS,IACjC,qBAAC,cAAD;SAAc,MAAK;SAAW,MAAM;SAApC,UAAA;UACG,WAAW,WAAW,IACnB,yBACA,GAAG,WAAW,OAAO;UAAwB;UACjD;SACY;QAEd,CAAA,IAAA,oBAAC,cAAD;SAAc,MAAK;SAAW,MAAM;SAClC,UAAA;QACY,CAAA,CAEX;OACL,CAAA,IAAA;OAEJ,oBAAC,OAAD;QAAO,KAAK;QACT,UAAA,aACE,OAAOC,MAAyC,CAAC,CACjD,KAAK,kBACJ,oBAAC,eAAD;SAEE,IAAIC,cAAY,MAAM;SACL;SACH;SACG;SACL;SACG;QAChB,GAPMA,cAAY,IAOlB,CACF;OACE,CAAA;OACN,SAAS,SAAS,IACjB,oBAAC,QAAD;QACE,MAAK;QACL,MAAM,cAAc,YAAY,SAAS,IAAI,YAAY;QACzD,MACE,SAAS,WAAW,IAChB,2BACA,gBAAgB,SAAS,OAAO;QAEtC,SAAS;QACC;OACX,CAAA,IAED,oBAAC,MAAD;QAAM,OAAA;QAAM,MAAM;QAChB,UAAA;OACI,CAAA;MAEH;;IACD,CAAA;GAEL;;CACH,CAAA,IACJ,MAZsB,EAAA,MAAA,UAjDbH,EAAAA,MAAAA,UAgDY,EAAA,MAAA,mBAvCR,EAAA,MAAA,YAnBV,EAAA,MAAA,MAdAC,EAAAA,MAAAA,0CAAAF;AAsFT;AApC0B,SAAA,OAAC,eAAA;CAAgBI,OAAAA,eAAa,OAAO;;AArF7B,SAAA,QAAC,aAAA;CAAiB,OAAA,EAC9C,YAAY,YAAY,MAAM,KAChC;;AC1CJ,SAAwB,iBAAiB,OAA8B;gBAC/D,EAAC,gBAAe,OAChB,EAAC,UAAU,mBAAmB,YAAW,2BAA2B,YAAY,MAAM,IAAI,GAC1F,EAAC,UAAU,OAAO,cAAa,gBAAgB,GAE3CC;CAYMC,AAAAA,EAAAA,OAAAA,WAAAA,YAAAA,EAAAA,OAJX,WAAA,EAAA,OAQD,YAAA,EAAA,OAPA,qBAAA,EAAA,OAEA,SAAA,EAAA,OAG8DC,YAAAA,QAAAA,EAAAA,OAX5CC,YAAN,MAAM,QAAA,EAAA,OAIAC,YAJN,MAIM,wBAAA,EAAA,OAFAC,YAFN,MAEM,SALZ,WAAM;EACd,IAEE,YAAY,MAAM,QAElB,YAAY,MAAM,SAElB,YAAY,MAAM,wBAClB,CAAC,WACD,qBAEA,SACA,CAAC,WAAW,UACZ;GACA,IAAM,oBAAoB;IAAC;IAAgB,EAAC,MAAM,YAAY,KAAI;IAAG;GAAO;GAE5E,SACE,IAAI,WAAW,CACb,MAAM,CAAC,GAAG,mBAAmB,OAAO,CAAC,GACrC,MAAM,CAAC,GAAG,mBAAmB,sBAAsB,CAAC,CACtD,CAAC,CACH;EACF;CACF,GAXgBJ,EAAAA,KAAAA,WAAAA,UAJX,EAAA,KAAA,SAQD,EAAA,KAAA,UAPA,EAAA,KAAA,mBAEA,EAAA,KAAA,OAG8DC,EAAAA,KAAAA,YAAAA,MAX5CC,EAAAA,KAAAA,YAAN,MAAM,MAIAC,EAAAA,KAAAA,YAJN,MAIM,sBAFAC,EAAAA,KAAAA,YAFN,MAEM;CAmBpB,IAAA,KAAA,WAAW,UADVC;CAYH,OAVE,EAAA,QAAA,WAAA,EAAA,QACA,YAAA,EAAA,QACA,qBAAA,EAAA,QACA,SAAA,EAAA,QAJAC,MAAAA,EAAAA,QAKYL,YAAAA,QAAAA,EAAAA,QACMC,YAAN,MAAM,QAAA,EAAA,QACAC,YADN,MACM,wBAAA,EAAA,QACAC,YAFN,MAEM,SATjB,KAAA;EACDE;EACA;EACA;EACA;EACA;EACA,YAAY;EACZ,YAAY,MAAM;EAClB,YAAY,MAAM;EAClB,YAAY,MAAM;CACpB,GARE,EAAA,MAAA,SACA,EAAA,MAAA,UACA,EAAA,MAAA,mBACA,EAAA,MAAA,OAJAA,EAAAA,MAAAA,IAKYL,EAAAA,MAAAA,YAAAA,MACMC,EAAAA,MAAAA,YAAN,MAAM,MACAC,EAAAA,MAAAA,YADN,MACM,sBACAC,EAAAA,MAAAA,YAFN,MAEM,iCAhCpB,UAAUL,IAuBPM,EAUF,GAEM;AACT;AC3CA,SAAwB,yBAAyB,OAAsC;eAE/E,EAAC,cAAA,OAAqB,OAArBE;4BAAe,KAAA,OAAA,KAAA,IAAA,CAAC,IAAhBA;;CAEP,IAAI,CAAC,aAAa,QAChB,OAAO;CAKJC,IAAAA;sCAAa,KAAA,aAAA,IAAIC,KAIlB,GAJC,EAAA,KAAA;CADHC,IAAAA;CADF,OAEKF,EAAAA,OAAAA,kBADH,KAAA,oBAAA,UAAA,EAAA,UACGA,GAKD,CAAA,GALCA,EAAAA,KAAAA,gBADHE;AAQJ;AAPwB,SAAA,MAAC,aAAA;CACjB,OAAA,YAAY,MAAM,sBAAsB,OACtC,oBAAC,kBAAD,EAAsD,YAAc,GAA7C,YAAY,IAAiC,IAClE;;;;;;;;;ACRZ,IAAA,oBACE,aACA,gBACA,uBAAuB,OAEvB,WAAW;CACT,MAAM;CACN,MAAM;CACN,OAAO;CACP,MAAM;CACN,UAAU;CACV,sCAAsC;CACtC,QAAQ;EACN,YAAY;GACV,MAAM;GACN,MAAM;EACR,CAAC;EACD,YAAY;GACV,MAAM;GACN,aACE;GACF,MAAM;GACN,IAAI,CAAC,EAAC,MAAM,SAAQ,CAAC;GACrB,SAAS,EAAC,MAAM,YAAW;GAC3B,WAAW,EAAC,YAAW,EAAQ;EACjC,CAAC;EACD,GAAG;CACL;CACA,SAAS;EACP,QAAQ;GACN,cAAc;GACd,qBAAqB;EACvB;EACA,QAAQ,WAAW;GACjB,IAAM,EAAC,eAAe,CAAC,GAAG,sBAAsB,CAAC,MAAK,WAChD,QACJ,aAAa,WAAW,IAAI,kBAAkB,GAAG,aAAa,OAAO,gBACjE,eAAe,aAAa,SAC9B,aACG,KAAK,MAA4B,EAAE,oBAAoB,CAAC,YAAY,CAAC,CAAC,CACtE,KAAK,IAAI,IACZ;GAQJ,OAAO;IACL;IACA,UATe,CACf,eAAe,IAAI,aAAa,KAAK,MACrC,qBAAqB,SAAS,oBAAoB,KAAK,MAAc,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,EACvF,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAIN;GACF;EACF;CACF;AACF,CAAC;ACtDH,MAAa,+BAA+B,cAA4B,WAAW;CACjF,IAAM,eAAe;EAAC,GAAG;EAAgB,GAAG;CAAM,GAC5C,EACJ,oBACA,aACA,eACA,aACA,gBACA,oBACA,8BACA,8BACA,iBACE;CAEJ,IAAI,YAAY,WAAW,GACzB,MAAU,MACR,kLACF;CAGF,OAAO;EACL,MAAM;EAEN,QAAQ,EACN,YAAY,EACV,SAAS,UACP,oBAAC,sCAAD;GAAsC,GAAI;GAAqB;EAAe,CAAA,EAElF,EACF;EAEA,MAAM,EACJ,SAAS,CAAC,iDAAiD,EAC7D;EAKA,MAAM,EACJ,YAAY,EACV,QAAQ,UAAU;GAChB,IACE,MAAM,OAAO,UACb,MAAM,WAAW,SAAS,wBAC1B,iBAAiB,OAAO,KAAK,GAC7B;IACA,IAAM,eAEH,OAAO,OAAQ,gBAA8C,CAAC,GAC3D,2BAA2B,aAAa,QAC3C,EAAC,YAAW,OAAO,SAAS,MAAM,oBACrC;IAEA,OACE,qBAAC,OAAD;KAAO,KAAK;KAAZ,UAAA;MACG,cAAc,oBAAC,aAAD,EAA2B,aAAe,CAAA,IAAI;MAC5D,yBAAyB,SAAS,IACjC,oBAAC,0BAAD,EAA0B,cAAc,yBAA2B,CAAA,IACjE;MACH,MAAM,cAAc,KAAK;KACrB;;GAEX;GAEA,OAAO,MAAM,cAAc,KAAK;EAClC,EACF,EACF;EAMA,UAAU;GACR,0BAA0B,MAAM,QAAQ;IACtC,IAAM,EAAC,YAAY,eAAc;IAEjC,IAAI,OAAO,sBAAuB,YAC5B;SAAA,mBAAmB,GAAG,GAAG,OAAO;IAAA,OAC/B,IAAI,MAAM,QAAQ,kBAAkB,GACrC;SAAA,mBAAmB,SAAS,UAAU,GAAG,OAAO;IAAA,OAC/C,IAAI,oBACT,OAAO;IAGT,OAAO,YAAY,SAAS,UAAU,KAAK,aACvC,CAAC,GAAG,OAAO,UAAU,iCAAiC;KAAC,GAAG;KAAO;IAAU,CAAC,CAAC,IAC7E;GACN;GACA,SAAS,MAAM,EAAC,iBACT,YAAY,SAAS,UAAU,IAI7B,EAAE,UAAU,cAAc,KAAK,GAAG,GAAG,IAAI,IAHvC;GAKX,UAAU,MAAM,EAAC,iBACX,eAAe,uBACV,CAAC,GAAG,MAAM,uBAAuB,IAGnC;EAEX;EAIA,QAAQ;GAEN,OAAO,CAAC,iBAAS,aAAa,gBAAgB,4BAA4B,CAAC;GAI3E,YAAY,MAAM,EAAC,aAAY;IAM7B,IALI,CAAC,gBAKD,CAAC,MAAM,QAAQ,kBAAkB,GACnC,OAAO;IAGT,IAAM,yBAAyB,YAAY,KAAK,gBAAgB;KAC9D,IAAI,GAAG,WAAW;KAClB,OAAO,GAAG,QAAQ,IAAI,UAAU,CAAC,EAAE,SAAS,WAAW;KACvD;KACA,YAAY,CAAC;MAAC,MAAM;MAAc,OAAO;MAAe,MAAM;KAAQ,CAAC;KACvE,QAAQ,EAAC,kBAAuC,GAC7C,gBAAgB,WACnB;IACF,EAAE,GAEI,kBAAkB,YAAY,SAAS,eACpC,mBAAmB,KAAK,cAAc;KAC3C,IAAI,GAAG,WAAW,GAAG,SAAS;KAC9B,OAAO,GAAG,SAAS,MAAM,GAAG,QAAQ,IAAI,UAAU,CAAC,EAAE,SAAS;KAC9D;KACA,OAAO,GACJ,gBAAgB,SAAS,GAC5B;IACF,EAAE,CACH;IAED,OAAO;KAAC,GAAG;KAAM,GAAG;KAAwB,GAAG;IAAe;GAChE;EACF;EAIA,SAAS,CAGP,uBAAuB;GACrB,GAAG;GACH,YAAY,aAAa;GACzB,WAAW;GACX,yBAAyB,iBAAiB,iBAAiB;GAC3D,YAAY,CACV,YACE;IACE,MAAM;IACN,MAAM;IACN,IAAI,YAAY,KAAK,UAAU,EAAC,KAAI,EAAE;IACtC,MAAM,aAAa;IAEnB,aAAa,SAEX,KAAK,OAAO,OAAO,MAA4B,YAAY;KACzD,IAAI,CAAC,MAAM,OAAO,QAAQ,CAAC,OAAO,sBAChC,OAAO;KAIT,IAAM,gBAAgB,MADP,QAAQ,UAAU,EAAC,YAAY,YAAW,CAC7B,CAAA,CAAO,MACjC,kCAAkC,iBAClC;MACE,KAAK,KAAK,MAAM;MAChB,UAAU,UAAU,KAAK,MAAM;KACjC,CACF;KAMA,OAJI,iBAAiB,kBAAkB,KAAK,uBACnC,KAGF;IACT,CAAC;IACH,SAAS,EAEP,SAAS,EAAC,QAAQ,eAAc;KAC9B,IAAI,CAAC,QAAQ,OAAO;KAKpB,IAAM,YADc,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,MAAM,EAAA,CAC/B,MAAM,MAAM,EAAE,oBAAoB;KAc/D,OAZK,WAAW,uBAEZ,SAAS,cACJ;MACL,QAAQ,4BAA4B,cAAc;MAClD,QAAQ;OACN,aAAa,SAAS;OACtB,UAAU,SAAS;MACrB;KACF,IAGK;MACL,QAAQ,GAAG,cAAc;MACzB,QAAQ,EAAC,UAAU,SAAS,qBAAoB;KAClD,IAf6C;IAgB/C,EACF;GACF,GACA,EAAC,QAAQ,GAAK,CAChB,CACF;EACF,CAAC,CACH;CACF;AACF,CAAC"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["schema.get(props.type)","type","<Feedback tone=\"critical\" title=\"Schema type not found\" />","<Preview value={props.value} schemaType={schemaType} />","value","_c","{id: documentId}","[]","{\n params: {id: documentId},\n initialValue: [],\n }","separateReferences(data)","useMemo(() => separateReferences(data), [data])","() => {\n // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion\n setTranslations(translations as MetadataDocument[])\n }","[setTranslations, translations]","<Flex padding={4} align=\"center\" justify=\"center\">\n <Spinner />\n </Flex>","translations && translations.length > 0 ? (\n <Text>\n This document is a language-specific version which other translations depend on.\n </Text>\n ) : (\n <Text>This document does not have connected translations.</Text>\n )","<Text size={1} weight=\"semibold\">\n {translations && translations.length > 0 ? (\n <>Before this document can be deleted</>\n ) : (\n <>This document can now be deleted</>\n )}\n </Text>","<DocumentPreview value={doc} type={doc._type} />","translations && translations.length > 0 ? (\n <>\n <Card borderTop />\n <Text size={1} weight=\"semibold\">\n The reference in{' '}\n {translations.length === 1\n ? `this translations document`\n : `these translations documents`}{' '}\n must be removed\n </Text>\n {translations.map((translation) => (\n <DocumentPreview\n key={translation._id}\n value={translation}\n type={translation._type}\n />\n ))}\n </>\n ) : null","(translation) => (\n <DocumentPreview\n key={translation._id}\n value={translation}\n type={translation._type}\n />\n )","otherReferences && otherReferences.length > 0 ? (\n <>\n <Card borderTop />\n <Text size={1} weight=\"semibold\">\n {otherReferences.length === 1\n ? `There is an additional reference`\n : `There are additional references`}{' '}\n to this document\n </Text>\n {otherReferences.map((reference) => (\n <DocumentPreview key={reference._id} value={reference} type={reference._type} />\n ))}\n </>\n ) : null","(reference) => (\n <DocumentPreview key={reference._id} value={reference} type={reference._type} />\n )","<Card border padding={3}>\n <Stack gap={4}>\n <Text size={1} weight=\"semibold\">\n {translations && translations.length > 0 ? (\n <>Before this document can be deleted</>\n ) : (\n <>This document can now be deleted</>\n )}\n </Text>\n <DocumentPreview value={doc} type={doc._type} />\n {translations && translations.length > 0 ? (\n <>\n <Card borderTop />\n <Text size={1} weight=\"semibold\">\n The reference in{' '}\n {translations.length === 1\n ? `this translations document`\n : `these translations documents`}{' '}\n must be removed\n </Text>\n {translations.map((translation) => (\n <DocumentPreview\n key={translation._id}\n value={translation}\n type={translation._type}\n />\n ))}\n </>\n ) : null}\n {otherReferences && otherReferences.length > 0 ? (\n <>\n <Card borderTop />\n <Text size={1} weight=\"semibold\">\n {otherReferences.length === 1\n ? `There is an additional reference`\n : `There are additional references`}{' '}\n to this document\n </Text>\n {otherReferences.map((reference) => (\n <DocumentPreview key={reference._id} value={reference} type={reference._type} />\n ))}\n </>\n ) : null}\n </Stack>\n </Card>","otherReferences.length === 0 ? (\n <Text>This document has no other references.</Text>\n ) : (\n <Text>\n You may not be able to delete this document because other documents refer to it.\n </Text>\n )","length","<Stack gap={4}>\n {translations && translations.length > 0 ? (\n <Text>\n This document is a language-specific version which other translations depend on.\n </Text>\n ) : (\n <Text>This document does not have connected translations.</Text>\n )}\n <Card border padding={3}>\n <Stack gap={4}>\n <Text size={1} weight=\"semibold\">\n {translations && translations.length > 0 ? (\n <>Before this document can be deleted</>\n ) : (\n <>This document can now be deleted</>\n )}\n </Text>\n <DocumentPreview value={doc} type={doc._type} />\n {translations && translations.length > 0 ? (\n <>\n <Card borderTop />\n <Text size={1} weight=\"semibold\">\n The reference in{' '}\n {translations.length === 1\n ? `this translations document`\n : `these translations documents`}{' '}\n must be removed\n </Text>\n {translations.map((translation) => (\n <DocumentPreview\n key={translation._id}\n value={translation}\n type={translation._type}\n />\n ))}\n </>\n ) : null}\n {otherReferences && otherReferences.length > 0 ? (\n <>\n <Card borderTop />\n <Text size={1} weight=\"semibold\">\n {otherReferences.length === 1\n ? `There is an additional reference`\n : `There are additional references`}{' '}\n to this document\n </Text>\n {otherReferences.map((reference) => (\n <DocumentPreview key={reference._id} value={reference} type={reference._type} />\n ))}\n </>\n ) : null}\n </Stack>\n </Card>\n {otherReferences.length === 0 ? (\n <Text>This document has no other references.</Text>\n ) : (\n <Text>\n You may not be able to delete this document because other documents refer to it.\n </Text>\n )}\n </Stack>","_c","_Fragment","_temp","_temp2","<Button text=\"Cancel\" onClick={onClose} mode=\"ghost\" />","<Button\n text={\n translations && translations.length > 0\n ? `Unset translation reference`\n : `Delete document`\n }\n onClick={onProceed}\n tone=\"critical\"\n />","translations && translations.length > 0\n ? `Unset translation reference`\n : `Delete document`","<Grid gridTemplateColumns={2} gap={2}>\n <Button text=\"Cancel\" onClick={onClose} mode=\"ghost\" />\n <Button\n text={\n translations && translations.length > 0\n ? `Unset translation reference`\n : `Delete document`\n }\n onClick={onProceed}\n tone=\"critical\"\n />\n </Grid>","_c","{apiVersion: pluginConfig.apiVersion}","apiVersion","createCacheKey(workspaceId)","useMemo(() => createCacheKey(workspaceId), [workspaceId])","useMemo(() => {\n if (Array.isArray(pluginConfig.supportedLanguages)) {\n return null // Return null for synchronous arrays\n }\n\n // Create or get cached promise for React.use\n return createOrGetPromise(async () => {\n if (typeof pluginConfig.supportedLanguages === 'function') {\n return pluginConfig.supportedLanguages(client)\n }\n return pluginConfig.supportedLanguages\n }, cacheKey)\n }, [pluginConfig, client, cacheKey])","async () => {\n if (typeof pluginConfig.supportedLanguages === 'function') {\n return pluginConfig.supportedLanguages(client)\n }\n return pluginConfig.supportedLanguages\n }","pluginConfig.supportedLanguages","createOrGetPromise(async () => {\n if (typeof pluginConfig.supportedLanguages === 'function') {\n return pluginConfig.supportedLanguages(client)\n }\n return pluginConfig.supportedLanguages\n }, cacheKey)","{...pluginConfig, supportedLanguages}","useMemo(\n () => ({...pluginConfig, supportedLanguages}),\n [pluginConfig, supportedLanguages],\n )","props.renderDefault(props)","props.renderDefault","<DocumentInternationalizationContext.Provider value={contextValue}>\n {props.renderDefault(props)}\n </DocumentInternationalizationContext.Provider>","DocumentInternationalizationContext.Provider","_c","[]","() => setDialogOpen(false)","useCallback(() => setDialogOpen(false), [])","{apiVersion: API_VERSION}","() => {\n const tx = client.transaction()\n let operation: DeleteOperation = 'DELETE'\n\n if (documentLanguage && translations.length > 0) {\n operation = 'UNSET'\n translations.forEach((translation) => {\n tx.patch(translation._id, (patch) =>\n patch.unset([\n `${TRANSLATIONS_ARRAY_NAME}[${LANGUAGE_FIELD_NAME} == \"${documentLanguage}\"]`,\n ]),\n )\n })\n } else {\n tx.delete(documentId)\n tx.delete(`drafts.${documentId}`)\n }\n\n tx.commit()\n .then(() => {\n if (operation === 'DELETE') {\n onClose()\n }\n toast.push({\n status: 'success',\n title: operation === 'UNSET' ? 'Translation reference unset' : 'Document deleted',\n description: operation === 'UNSET' ? 'The document can now be deleted' : null,\n })\n return undefined\n })\n .catch((err: Error) => {\n toast.push({\n status: 'error',\n title:\n operation === 'UNSET'\n ? 'Failed to unset translation reference'\n : 'Failed to delete document',\n description: err.message,\n })\n })\n }","translations.length","useCallback(() => {\n const tx = client.transaction()\n let operation: DeleteOperation = 'DELETE'\n\n if (documentLanguage && translations.length > 0) {\n operation = 'UNSET'\n translations.forEach((translation) => {\n tx.patch(translation._id, (patch) =>\n patch.unset([\n `${TRANSLATIONS_ARRAY_NAME}[${LANGUAGE_FIELD_NAME} == \"${documentLanguage}\"]`,\n ]),\n )\n })\n } else {\n tx.delete(documentId)\n tx.delete(`drafts.${documentId}`)\n }\n\n tx.commit()\n .then(() => {\n if (operation === 'DELETE') {\n onClose()\n }\n toast.push({\n status: 'success',\n title: operation === 'UNSET' ? 'Translation reference unset' : 'Document deleted',\n description: operation === 'UNSET' ? 'The document can now be deleted' : null,\n })\n return undefined\n })\n .catch((err: Error) => {\n toast.push({\n status: 'error',\n title:\n operation === 'UNSET'\n ? 'Failed to unset translation reference'\n : 'Failed to delete document',\n description: err.message,\n })\n })\n }, [client, documentLanguage, translations, documentId, onClose, toast])","() => {\n setDialogOpen(true)\n }","isDialogOpen && {\n type: 'dialog',\n onClose,\n header: 'Delete translation',\n content: doc ? (\n <DeleteTranslationDialog\n doc={doc}\n documentId={documentId}\n setTranslations={setTranslations}\n />\n ) : null,\n footer: (\n <DeleteTranslationFooter\n onClose={onClose}\n onProceed={onProceed}\n translations={translations}\n />\n ),\n }","{\n label: `Delete translation...`,\n disabled: !doc || !documentLanguage,\n icon: TrashIcon,\n tone: 'critical',\n onHandle: () => {\n setDialogOpen(true)\n },\n dialog: isDialogOpen && {\n type: 'dialog',\n onClose,\n header: 'Delete translation',\n content: doc ? (\n <DeleteTranslationDialog\n doc={doc}\n documentId={documentId}\n setTranslations={setTranslations}\n />\n ) : null,\n footer: (\n <DeleteTranslationFooter\n onClose={onClose}\n onProceed={onProceed}\n translations={translations}\n />\n ),\n },\n }","!doc || !documentLanguage","_c","{\n params: {id, translationSchema: METADATA_SCHEMA_NAME},\n }","{data, loading, error}","_c","{\n id,\n type,\n /* oxlint-disable-next-line typescript-eslint/no-deprecated -- kept for backwards compatibility */\n onComplete,\n}: DocumentActionProps","{\n id,\n type,\n permission: 'duplicate',\n }","() => {\n setDuplicating(true)\n\n // Async function that does the actual work\n async function performDuplication(): Promise<void> {\n if (!metadataDocument) {\n return Promise.reject(new Error('Metadata document not found'))\n }\n\n const translationsArray = metadataDocument[TRANSLATIONS_ARRAY_NAME]\n if (!translationsArray || translationsArray.length === 0) {\n return Promise.reject(new Error('No translations found in metadata document'))\n }\n\n // 1. Duplicate the document and its localized versions\n const translations = new Map<string, Id>()\n await Promise.all(\n // oxlint-disable-next-line consistent-return\n translationsArray.map(async (translation) => {\n const dupeId = uuid()\n const locale = translation[LANGUAGE_FIELD_NAME]\n const docId = translation.value?._ref\n\n if (typeof locale !== 'string' || locale.trim().length === 0) {\n return Promise.reject(new Error('Invalid locale for translation'))\n }\n if (!docId) {\n return Promise.reject(new Error('Translation document not found'))\n }\n\n const {duplicate: duplicateTranslation} = await firstValueFrom(\n documentStore.pair\n .editOperations(docId, type)\n .pipe(filter((op: EditOperations) => op.duplicate.disabled !== 'NOT_READY')),\n )\n\n if (duplicateTranslation.disabled) {\n return Promise.reject(new Error('Cannot duplicate document'))\n }\n\n const duplicateTranslationSuccess = firstValueFrom(\n documentStore.pair\n .operationEvents(docId, type)\n .pipe(\n filter((e: OperationSuccessEvent) => e.op === 'duplicate' && e.type === 'success'),\n ),\n )\n duplicateTranslation.execute(dupeId)\n await duplicateTranslationSuccess\n\n translations.set(locale, dupeId)\n }),\n )\n\n // 2. Duplicate the metadata document\n const {duplicate: duplicateMetadata} = await firstValueFrom(\n documentStore.pair\n .editOperations(metadataDocument._id, METADATA_SCHEMA_NAME)\n .pipe(filter((op: EditOperations) => op.duplicate.disabled !== 'NOT_READY')),\n )\n\n if (duplicateMetadata.disabled) {\n return Promise.reject(new Error('Cannot duplicate document'))\n }\n\n const duplicateMetadataSuccess = firstValueFrom(\n documentStore.pair\n .operationEvents(metadataDocument._id, METADATA_SCHEMA_NAME)\n .pipe(filter((e: OperationSuccessEvent) => e.op === 'duplicate' && e.type === 'success')),\n )\n const dupeId = uuid()\n duplicateMetadata.execute(dupeId)\n await duplicateMetadataSuccess\n\n // 3. Patch the duplicated metadata document to update the references\n const patch: PatchOperations = {\n set: Object.fromEntries(\n Array.from(translations.entries()).map(([locale, documentId]) => {\n return [\n `${TRANSLATIONS_ARRAY_NAME}[${LANGUAGE_FIELD_NAME} == \"${locale}\"].value._ref`,\n documentId,\n ]\n }),\n ),\n }\n\n await client.transaction().patch(dupeId, patch).commit()\n\n // 4. Navigate to the duplicated document\n navigateIntent('edit', {\n id: Array.from(translations.values()).at(0),\n type,\n })\n\n onComplete()\n }\n\n // Execute and handle success/error\n performDuplication()\n .catch((error: unknown) => {\n console.error(error)\n toast.push({\n status: 'error',\n title: 'Error duplicating document',\n description: error instanceof Error ? error.message : 'Failed to duplicate document',\n })\n })\n .finally(() => {\n setDuplicating(false)\n })\n }","pair","(op: EditOperations) => op.duplicate.disabled !== 'NOT_READY'","(e: OperationSuccessEvent) => e.op === 'duplicate' && e.type === 'success'","dupeId","([locale, documentId]) => {\n return [\n `${TRANSLATIONS_ARRAY_NAME}[${LANGUAGE_FIELD_NAME} == \"${locale}\"].value._ref`,\n documentId,\n ]\n }","useCallback(() => {\n setDuplicating(true)\n\n // Async function that does the actual work\n async function performDuplication(): Promise<void> {\n if (!metadataDocument) {\n return Promise.reject(new Error('Metadata document not found'))\n }\n\n const translationsArray = metadataDocument[TRANSLATIONS_ARRAY_NAME]\n if (!translationsArray || translationsArray.length === 0) {\n return Promise.reject(new Error('No translations found in metadata document'))\n }\n\n // 1. Duplicate the document and its localized versions\n const translations = new Map<string, Id>()\n await Promise.all(\n // oxlint-disable-next-line consistent-return\n translationsArray.map(async (translation) => {\n const dupeId = uuid()\n const locale = translation[LANGUAGE_FIELD_NAME]\n const docId = translation.value?._ref\n\n if (typeof locale !== 'string' || locale.trim().length === 0) {\n return Promise.reject(new Error('Invalid locale for translation'))\n }\n if (!docId) {\n return Promise.reject(new Error('Translation document not found'))\n }\n\n const {duplicate: duplicateTranslation} = await firstValueFrom(\n documentStore.pair\n .editOperations(docId, type)\n .pipe(filter((op: EditOperations) => op.duplicate.disabled !== 'NOT_READY')),\n )\n\n if (duplicateTranslation.disabled) {\n return Promise.reject(new Error('Cannot duplicate document'))\n }\n\n const duplicateTranslationSuccess = firstValueFrom(\n documentStore.pair\n .operationEvents(docId, type)\n .pipe(\n filter((e: OperationSuccessEvent) => e.op === 'duplicate' && e.type === 'success'),\n ),\n )\n duplicateTranslation.execute(dupeId)\n await duplicateTranslationSuccess\n\n translations.set(locale, dupeId)\n }),\n )\n\n // 2. Duplicate the metadata document\n const {duplicate: duplicateMetadata} = await firstValueFrom(\n documentStore.pair\n .editOperations(metadataDocument._id, METADATA_SCHEMA_NAME)\n .pipe(filter((op: EditOperations) => op.duplicate.disabled !== 'NOT_READY')),\n )\n\n if (duplicateMetadata.disabled) {\n return Promise.reject(new Error('Cannot duplicate document'))\n }\n\n const duplicateMetadataSuccess = firstValueFrom(\n documentStore.pair\n .operationEvents(metadataDocument._id, METADATA_SCHEMA_NAME)\n .pipe(filter((e: OperationSuccessEvent) => e.op === 'duplicate' && e.type === 'success')),\n )\n const dupeId = uuid()\n duplicateMetadata.execute(dupeId)\n await duplicateMetadataSuccess\n\n // 3. Patch the duplicated metadata document to update the references\n const patch: PatchOperations = {\n set: Object.fromEntries(\n Array.from(translations.entries()).map(([locale, documentId]) => {\n return [\n `${TRANSLATIONS_ARRAY_NAME}[${LANGUAGE_FIELD_NAME} == \"${locale}\"].value._ref`,\n documentId,\n ]\n }),\n ),\n }\n\n await client.transaction().patch(dupeId, patch).commit()\n\n // 4. Navigate to the duplicated document\n navigateIntent('edit', {\n id: Array.from(translations.values()).at(0),\n type,\n })\n\n onComplete()\n }\n\n // Execute and handle success/error\n performDuplication()\n .catch((error: unknown) => {\n console.error(error)\n toast.push({\n status: 'error',\n title: 'Error duplicating document',\n description: error instanceof Error ? error.message : 'Failed to duplicate document',\n })\n })\n .finally(() => {\n setDuplicating(false)\n })\n }, [client, documentStore.pair, metadataDocument, navigateIntent, onComplete, toast, type])","useMemo(() => {\n if (!isPermissionsLoading && !permissions?.granted) {\n return {\n icon: CopyIcon,\n disabled: true,\n label: d('action.duplicate.label'),\n title: (\n <InsufficientPermissionsMessage context=\"duplicate-document\" currentUser={currentUser} />\n ),\n }\n }\n\n if (!isMetadataDocumentLoading && !metadataDocument) {\n return {\n icon: CopyIcon,\n disabled: true,\n label: d('action.duplicate.label'),\n title: d(DISABLED_REASON_KEY.METADATA_NOT_FOUND),\n }\n }\n\n if (!hasOneMetadataDocument) {\n return {\n icon: CopyIcon,\n disabled: true,\n label: d('action.duplicate.label'),\n title: d(DISABLED_REASON_KEY.MULTIPLE_METADATA),\n }\n }\n\n return {\n icon: CopyIcon,\n disabled:\n isDuplicating ||\n Boolean(duplicate.disabled) ||\n isPermissionsLoading ||\n isMetadataDocumentLoading,\n label: isDuplicating ? s('action.duplicate.running.label') : d('action.duplicate.label'),\n title: duplicate.disabled ? s(DISABLED_REASON_KEY[duplicate.disabled]) : '',\n onHandle: handle,\n }\n }, [\n currentUser,\n duplicate.disabled,\n handle,\n hasOneMetadataDocument,\n isDuplicating,\n isMetadataDocumentLoading,\n isPermissionsLoading,\n metadataDocument,\n permissions?.granted,\n s,\n d,\n ])","d('action.duplicate.label')","<InsufficientPermissionsMessage context=\"duplicate-document\" currentUser={currentUser} />","{\n icon: CopyIcon,\n disabled: true,\n label: d('action.duplicate.label'),\n title: (\n <InsufficientPermissionsMessage context=\"duplicate-document\" currentUser={currentUser} />\n ),\n }","d(DISABLED_REASON_KEY.METADATA_NOT_FOUND)","{\n icon: CopyIcon,\n disabled: true,\n label: d('action.duplicate.label'),\n title: d(DISABLED_REASON_KEY.METADATA_NOT_FOUND),\n }","d(DISABLED_REASON_KEY.MULTIPLE_METADATA)","{\n icon: CopyIcon,\n disabled: true,\n label: d('action.duplicate.label'),\n title: d(DISABLED_REASON_KEY.MULTIPLE_METADATA),\n }","isDuplicating ? s('action.duplicate.running.label') : d('action.duplicate.label')","duplicate.disabled ? s(DISABLED_REASON_KEY[duplicate.disabled]) : ''","disabled","{\n icon: CopyIcon,\n disabled:\n isDuplicating ||\n Boolean(duplicate.disabled) ||\n isPermissionsLoading ||\n isMetadataDocumentLoading,\n label: isDuplicating ? s('action.duplicate.running.label') : d('action.duplicate.label'),\n title: duplicate.disabled ? s(DISABLED_REASON_KEY[duplicate.disabled]) : '',\n onHandle: handle,\n }","isDuplicating ||\n Boolean(duplicate.disabled) ||\n isPermissionsLoading ||\n isMetadataDocumentLoading","op","e","locale","[locale, documentId]","_c","_temp","_temp2","() => {\n if (!id || !type) {\n return\n }\n\n // No panes open, function might be called outside Structure\n if (!routerPanesState.length) {\n router.navigateIntent('edit', {id, type})\n return\n }\n\n const panes = [...routerPanesState]\n panes.splice(groupIndex + 1, 0, [\n {\n id: id,\n params: {type},\n },\n ])\n\n const href = router.resolvePathFromState({panes})\n router.navigateUrl({path: href})\n }","routerPanesState.length","useCallback(() => {\n if (!id || !type) {\n return\n }\n\n // No panes open, function might be called outside Structure\n if (!routerPanesState.length) {\n router.navigateIntent('edit', {id, type})\n return\n }\n\n const panes = [...routerPanesState]\n panes.splice(groupIndex + 1, 0, [\n {\n id: id,\n params: {type},\n },\n ])\n\n const href = router.resolvePathFromState({panes})\n router.navigateUrl({path: href})\n }, [id, type, router, routerPanesState, groupIndex])","_c","openInNewPane","{apiVersion}","() => {\n if (!id && metadataId && sourceLanguageId) {\n /* Disable button while this request is pending */\n setUserHasClicked(true)\n\n // handle creation of meta document\n const transaction = client.transaction()\n\n const sourceReference = createReference(\n sourceLanguageId,\n documentId,\n schemaType.name,\n !weakReferences,\n )\n const newMetadataDocument = {\n _id: metadataId,\n _type: METADATA_SCHEMA_NAME,\n schemaTypes: [schemaType.name],\n translations: [sourceReference],\n }\n\n transaction.createIfNotExists(newMetadataDocument)\n\n transaction\n .commit()\n .then(() => {\n setUserHasClicked(false)\n openCreated()\n return undefined\n })\n .catch((err: unknown) => {\n console.error(err)\n setUserHasClicked(false)\n })\n } else {\n open()\n }\n }","name","useCallback(() => {\n if (!id && metadataId && sourceLanguageId) {\n /* Disable button while this request is pending */\n setUserHasClicked(true)\n\n // handle creation of meta document\n const transaction = client.transaction()\n\n const sourceReference = createReference(\n sourceLanguageId,\n documentId,\n schemaType.name,\n !weakReferences,\n )\n const newMetadataDocument = {\n _id: metadataId,\n _type: METADATA_SCHEMA_NAME,\n schemaTypes: [schemaType.name],\n translations: [sourceReference],\n }\n\n transaction.createIfNotExists(newMetadataDocument)\n\n transaction\n .commit()\n .then(() => {\n setUserHasClicked(false)\n openCreated()\n return undefined\n })\n .catch((err: unknown) => {\n console.error(err)\n setUserHasClicked(false)\n })\n } else {\n open()\n }\n }, [\n id,\n metadataId,\n sourceLanguageId,\n client,\n documentId,\n schemaType.name,\n weakReferences,\n openCreated,\n open,\n ])","<Box padding={2}>\n <Text muted size={1}>\n Document has no other translations\n </Text>\n </Box>","['right', 'left']","<Stack>\n <Button\n disabled={disabled}\n mode=\"ghost\"\n text=\"Manage Translations\"\n icon={CogIcon}\n loading={userHasClicked}\n onClick={handleClick}\n />\n </Stack>","<Tooltip\n animate\n content={\n <Box padding={2}>\n <Text muted size={1}>\n Document has no other translations\n </Text>\n </Box>\n }\n fallbackPlacements={['right', 'left']}\n placement=\"top\"\n portal\n disabled={Boolean(id) || canCreate}\n >\n <Stack>\n <Button\n disabled={disabled}\n mode=\"ghost\"\n text=\"Manage Translations\"\n icon={CogIcon}\n loading={userHasClicked}\n onClick={handleClick}\n />\n </Stack>\n </Tooltip>","Boolean(id) || canCreate","_c","metadata?.translations.length\n ? metadata.translations.find((t) => t[LANGUAGE_FIELD_NAME] === language.id)\n : undefined","id","metadata?.translations.length","{apiVersion}","() => open()","useCallback(() => open(), [open])","async () => {\n if (!source) {\n throw new Error(`Cannot create translation without source document`)\n }\n\n if (!sourceLanguageId) {\n throw new Error(`Cannot create translation without source language ID`)\n }\n\n if (!metadataId) {\n throw new Error(`Cannot create translation without a metadata ID`)\n }\n /* Disable the create button while this request is pending */\n setUserHasClicked(true)\n\n const transaction = client.transaction()\n\n // 1. Duplicate source document\n // If the source belongs to a release, create the translation\n // as a version in that same release, otherwise as a draft\n const newTranslationDocumentId = uuid()\n const sourceReleaseId = isVersionId(source._id) ? getVersionFromId(source._id) : undefined\n let newTranslationDocument = {\n ...source,\n _id: sourceReleaseId\n ? getVersionId(newTranslationDocumentId, sourceReleaseId)\n : getDraftId(newTranslationDocumentId),\n // 2. Update language of the translation\n [languageField]: language.id,\n }\n\n // Remove fields / paths we don't want to duplicate\n newTranslationDocument = removeExcludedPaths(\n newTranslationDocument,\n schemaType,\n // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion\n ) as SanityDocument\n\n transaction.create(newTranslationDocument)\n\n // 3. Maybe create the metadata document\n const sourceReference = createReference(\n sourceLanguageId,\n documentId,\n schemaType.name,\n !weakReferences,\n )\n const newTranslationReference = createReference(\n language.id,\n newTranslationDocumentId,\n schemaType.name,\n !weakReferences,\n )\n const newMetadataDocument: MetadataDocument = {\n _id: metadataId,\n _type: METADATA_SCHEMA_NAME,\n schemaTypes: [schemaType.name],\n translations: [sourceReference],\n }\n\n transaction.createIfNotExists(newMetadataDocument)\n\n // 4. Patch translation to metadata document\n // Note: If the document was only just created in the operation above\n // This patch operation will have no effect\n const metadataPatch = client\n .patch(metadataId)\n .setIfMissing({translations: [sourceReference]})\n .insert(`after`, `translations[-1]`, [newTranslationReference])\n\n transaction.patch(metadataPatch)\n\n // 5. Commit!\n transaction\n .commit()\n .then(() => {\n const metadataExisted = Boolean(metadata?._createdAt)\n\n toast.push({\n status: 'success',\n title: `Created \"${language.title}\" translation`,\n description: metadataExisted\n ? `Updated Translations Metadata`\n : `Created Translations Metadata`,\n })\n\n /* Once a translation has been created, reset the userHasClicked state to false\n * so they can click on it to navigate to the translation */\n setUserHasClicked(false)\n\n // Execute callback if provided\n if (callback) {\n // oxlint-disable-next-line eslint-plugin-promise/no-callback-in-promise -- This is an async callback, not a Node.js callback\n return callback({\n client,\n sourceLanguageId,\n sourceDocument: source,\n newDocument: newTranslationDocument,\n destinationLanguageId: language.id,\n metaDocumentId: metadataId,\n })\n }\n\n return undefined\n })\n .catch((err: Error) => {\n console.error(err)\n\n /* Re-enable the create button if there was an error */\n setUserHasClicked(false)\n\n return toast.push({\n status: 'error',\n title: `Error creating translation`,\n description: err.message,\n })\n })\n }","title","_createdAt","useCallback(async () => {\n if (!source) {\n throw new Error(`Cannot create translation without source document`)\n }\n\n if (!sourceLanguageId) {\n throw new Error(`Cannot create translation without source language ID`)\n }\n\n if (!metadataId) {\n throw new Error(`Cannot create translation without a metadata ID`)\n }\n /* Disable the create button while this request is pending */\n setUserHasClicked(true)\n\n const transaction = client.transaction()\n\n // 1. Duplicate source document\n // If the source belongs to a release, create the translation\n // as a version in that same release, otherwise as a draft\n const newTranslationDocumentId = uuid()\n const sourceReleaseId = isVersionId(source._id) ? getVersionFromId(source._id) : undefined\n let newTranslationDocument = {\n ...source,\n _id: sourceReleaseId\n ? getVersionId(newTranslationDocumentId, sourceReleaseId)\n : getDraftId(newTranslationDocumentId),\n // 2. Update language of the translation\n [languageField]: language.id,\n }\n\n // Remove fields / paths we don't want to duplicate\n newTranslationDocument = removeExcludedPaths(\n newTranslationDocument,\n schemaType,\n // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion\n ) as SanityDocument\n\n transaction.create(newTranslationDocument)\n\n // 3. Maybe create the metadata document\n const sourceReference = createReference(\n sourceLanguageId,\n documentId,\n schemaType.name,\n !weakReferences,\n )\n const newTranslationReference = createReference(\n language.id,\n newTranslationDocumentId,\n schemaType.name,\n !weakReferences,\n )\n const newMetadataDocument: MetadataDocument = {\n _id: metadataId,\n _type: METADATA_SCHEMA_NAME,\n schemaTypes: [schemaType.name],\n translations: [sourceReference],\n }\n\n transaction.createIfNotExists(newMetadataDocument)\n\n // 4. Patch translation to metadata document\n // Note: If the document was only just created in the operation above\n // This patch operation will have no effect\n const metadataPatch = client\n .patch(metadataId)\n .setIfMissing({translations: [sourceReference]})\n .insert(`after`, `translations[-1]`, [newTranslationReference])\n\n transaction.patch(metadataPatch)\n\n // 5. Commit!\n transaction\n .commit()\n .then(() => {\n const metadataExisted = Boolean(metadata?._createdAt)\n\n toast.push({\n status: 'success',\n title: `Created \"${language.title}\" translation`,\n description: metadataExisted\n ? `Updated Translations Metadata`\n : `Created Translations Metadata`,\n })\n\n /* Once a translation has been created, reset the userHasClicked state to false\n * so they can click on it to navigate to the translation */\n setUserHasClicked(false)\n\n // Execute callback if provided\n if (callback) {\n // oxlint-disable-next-line eslint-plugin-promise/no-callback-in-promise -- This is an async callback, not a Node.js callback\n return callback({\n client,\n sourceLanguageId,\n sourceDocument: source,\n newDocument: newTranslationDocument,\n destinationLanguageId: language.id,\n metaDocumentId: metadataId,\n })\n }\n\n return undefined\n })\n .catch((err: Error) => {\n console.error(err)\n\n /* Re-enable the create button if there was an error */\n setUserHasClicked(false)\n\n return toast.push({\n status: 'error',\n title: `Error creating translation`,\n description: err.message,\n })\n })\n }, [\n client,\n documentId,\n language.id,\n language.title,\n languageField,\n metadata?._createdAt,\n metadataId,\n schemaType,\n source,\n sourceLanguageId,\n toast,\n weakReferences,\n callback,\n ])","<Box padding={2}>\n <Text muted size={1}>\n {message}\n </Text>\n </Box>","['right', 'left']","disabled && !current ? (\n <Spinner />\n ) : (\n <Text size={2}>\n {translation ? <SplitVerticalIcon /> : current ? <CheckmarkIcon /> : <AddIcon />}\n </Text>\n )","<Box flex={1}>\n <Text>{language.title}</Text>\n </Box>","<Badge tone={disabled || current ? `default` : `primary`}>{language.id}</Badge>","disabled || current ? `default` : `primary`","<Flex gap={3} align=\"center\">\n {disabled && !current ? (\n <Spinner />\n ) : (\n <Text size={2}>\n {translation ? <SplitVerticalIcon /> : current ? <CheckmarkIcon /> : <AddIcon />}\n </Text>\n )}\n <Box flex={1}>\n <Text>{language.title}</Text>\n </Box>\n <Badge tone={disabled || current ? `default` : `primary`}>{language.id}</Badge>\n </Flex>","<Button\n onClick={translation ? handleOpen : handleCreate}\n mode={current && disabled ? `default` : `bleed`}\n disabled={disabled}\n >\n <Flex gap={3} align=\"center\">\n {disabled && !current ? (\n <Spinner />\n ) : (\n <Text size={2}>\n {translation ? <SplitVerticalIcon /> : current ? <CheckmarkIcon /> : <AddIcon />}\n </Text>\n )}\n <Box flex={1}>\n <Text>{language.title}</Text>\n </Box>\n <Badge tone={disabled || current ? `default` : `primary`}>{language.id}</Badge>\n </Flex>\n </Button>","translation ? handleOpen : handleCreate","current && disabled ? `default` : `bleed`","<Tooltip\n animate\n content={\n <Box padding={2}>\n <Text muted size={1}>\n {message}\n </Text>\n </Box>\n }\n fallbackPlacements={['right', 'left']}\n placement=\"top\"\n portal\n >\n <Button\n onClick={translation ? handleOpen : handleCreate}\n mode={current && disabled ? `default` : `bleed`}\n disabled={disabled}\n >\n <Flex gap={3} align=\"center\">\n {disabled && !current ? (\n <Spinner />\n ) : (\n <Text size={2}>\n {translation ? <SplitVerticalIcon /> : current ? <CheckmarkIcon /> : <AddIcon />}\n </Text>\n )}\n <Box flex={1}>\n <Text>{language.title}</Text>\n </Box>\n <Badge tone={disabled || current ? `default` : `primary`}>{language.id}</Badge>\n </Flex>\n </Button>\n </Tooltip>","_c","{apiVersion}","() => {\n if (!source) {\n throw new Error(`Cannot patch missing document`)\n }\n\n const currentId = source._id\n\n client\n .patch(currentId)\n .set({[languageField]: language.id})\n .commit()\n .then(() => {\n toast.push({\n title: `Set document language to ${language.title}`,\n status: `success`,\n })\n return undefined\n })\n .catch((err: unknown) => {\n console.error(err)\n\n return toast.push({\n title: `Failed to set document language to ${language.title}`,\n status: `error`,\n })\n })\n }","id","title","useCallback(() => {\n if (!source) {\n throw new Error(`Cannot patch missing document`)\n }\n\n const currentId = source._id\n\n client\n .patch(currentId)\n .set({[languageField]: language.id})\n .commit()\n .then(() => {\n toast.push({\n title: `Set document language to ${language.title}`,\n status: `success`,\n })\n return undefined\n })\n .catch((err: unknown) => {\n console.error(err)\n\n return toast.push({\n title: `Failed to set document language to ${language.title}`,\n status: `error`,\n })\n })\n }, [source, client, languageField, language, toast])","<Text size={2}>\n <EditIcon />\n </Text>","<Box flex={1}>\n <Text>{language.title}</Text>\n </Box>","<Badge>{language.id}</Badge>","<Flex gap={3} align=\"center\">\n <Text size={2}>\n <EditIcon />\n </Text>\n <Box flex={1}>\n <Text>{language.title}</Text>\n </Box>\n <Badge>{language.id}</Badge>\n </Flex>","<Button mode=\"bleed\" onClick={handleClick} disabled={disabled} justify=\"flex-start\">\n <Flex gap={3} align=\"center\">\n <Text size={2}>\n <EditIcon />\n </Text>\n <Box flex={1}>\n <Text>{language.title}</Text>\n </Box>\n <Badge>{language.id}</Badge>\n </Flex>\n </Button>","_c","{children}: {children: React.ReactNode}","{maxWidth: 280}","<Box style={{maxWidth: 280}}>{children}</Box>","_c","{children}: PropsWithChildren","<Card tone=\"caution\" padding={3}>\n <Flex justify=\"center\">\n <ConstrainedBox>\n <Text size={1} align=\"center\">\n {children}\n </Text>\n </ConstrainedBox>\n </Flex>\n </Card>","_c","(event: ChangeEvent<HTMLInputElement>) => {\n if (event.currentTarget.value) {\n setQuery(event.currentTarget.value)\n } else {\n setQuery(``)\n }\n }","useCallback((event: ChangeEvent<HTMLInputElement>) => {\n if (event.currentTarget.value) {\n setQuery(event.currentTarget.value)\n } else {\n setQuery(``)\n }\n }, [])","() => setOpen((o) => !o)","(o) => !o","useCallback(() => setOpen((o) => !o), [])","() => setOpen(false)","useCallback(() => setOpen(false), [])","() => [buttonRef.current, popoverRef.current]","useMemo(() => {\n if (loading) {\n return null\n }\n\n // Once created, these two values should be the same anyway\n return metadata?._id ?? uuid()\n }, [loading, metadata?._id])","metadata?._id ?? uuid()","_id","supportedLanguages.some((l) => l.id === sourceLanguageId)","(l) => l.id === sourceLanguageId","supportedLanguages.every((l) => l.id && l.title)","(l) => l.id && l.title","useMemo(() => {\n const valid = supportedLanguages.every((l) => l.id && l.title)\n if (!valid) {\n console.warn(\n `Not all languages are valid. It should be an array of objects with an \"id\" and \"title\" property. Or a function that returns an array of objects with an \"id\" and \"title\" property.`,\n supportedLanguages,\n )\n }\n\n return valid\n }, [supportedLanguages])","<Box padding={1}>\n {error ? (\n <Card tone=\"critical\" padding={1}>\n <Text>There was an error returning translations metadata</Text>\n </Card>\n ) : (\n <Stack gap={1}>\n <LanguageManage\n id={metadata?._id}\n documentId={documentId}\n metadataId={metadataId}\n schemaType={schemaType}\n sourceLanguageId={sourceLanguageId}\n />\n {supportedLanguages.length > 4 ? (\n <TextInput onChange={handleQuery} value={query} placeholder=\"Filter languages\" />\n ) : null}\n {supportedLanguages.length > 0 ? (\n <>\n {/* Once metadata is loaded, there may be issues */}\n {loading ? null : (\n <>\n {/* Not all languages are valid */}\n {data && documentIsInOneMetadataDocument ? null : (\n <Warning>\n {/* TODO: Surface these documents to the user */}\n This document has been found in more than one Translations Metadata document\n </Warning>\n )}\n {/* Not all languages are valid */}\n {allLanguagesAreValid ? null : (\n <Warning>Not all language objects are valid. See the console.</Warning>\n )}\n {/* Current document has no language field */}\n {sourceLanguageId ? null : (\n <Warning>\n Choose a language to apply to <strong>this Document</strong>\n </Warning>\n )}\n {/* Current document has an invalid language field */}\n {sourceLanguageId && !sourceLanguageIsValid ? (\n <Warning>\n Select a supported language. Current language value:{' '}\n <code>{sourceLanguageId}</code>\n </Warning>\n ) : null}\n </>\n )}\n {supportedLanguages\n .filter((language) => {\n if (query) {\n return language.title.toLowerCase().includes(query.toLowerCase())\n }\n return true\n })\n .map((language) =>\n !loading && sourceLanguageId && sourceLanguageIsValid ? (\n // Button to duplicate this document to a new translation\n // And either create or update the metadata document\n <LanguageOption\n key={language.id}\n language={language}\n schemaType={schemaType}\n documentId={documentId}\n disabled={!allLanguagesAreValid}\n current={language.id === sourceLanguageId}\n metadata={metadata}\n metadataId={metadataId}\n source={source}\n sourceLanguageId={sourceLanguageId}\n />\n ) : (\n // Button to set a language field on *this* document\n <LanguagePatch\n key={language.id}\n source={source}\n language={language}\n // Only allow language patch change to:\n // - Keys not in metadata\n // - The key of this document in the metadata\n disabled={\n (loading ||\n !allLanguagesAreValid ||\n metadata?.translations\n .filter((t) => t?.value?._ref !== documentId)\n .some((t) => t[LANGUAGE_FIELD_NAME] === language.id)) ??\n false\n }\n />\n ),\n )}\n </>\n ) : null}\n </Stack>\n )}\n </Box>","metadata?._id","supportedLanguages.length","language","t","<Button\n text=\"Translations\"\n mode=\"bleed\"\n disabled={!source}\n tone={!source || loading || !issueWithTranslations ? undefined : `caution`}\n icon={TranslateIcon}\n onClick={handleClick}\n ref={buttonRef}\n selected={open}\n data-testid=\"document-internationalization-menu\"\n />","!source","!source || loading || !issueWithTranslations ? undefined : `caution`","<Popover\n animate\n constrainSize\n content={content}\n open={open}\n portal\n ref={popoverRef}\n overflow=\"auto\"\n tone=\"default\"\n >\n <Button\n text=\"Translations\"\n mode=\"bleed\"\n disabled={!source}\n tone={!source || loading || !issueWithTranslations ? undefined : `caution`}\n icon={TranslateIcon}\n onClick={handleClick}\n ref={buttonRef}\n selected={open}\n data-testid=\"document-internationalization-menu\"\n />\n </Popover>","l","_c","_temp","_temp2","_Fragment","() => setDialogOpen(false)","useCallback(() => setDialogOpen(false), [])","doc && Array.isArray(doc[TRANSLATIONS_ARRAY_NAME])\n ? // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion\n (doc[TRANSLATIONS_ARRAY_NAME] as TranslationReference[])\n : []","useMemo(\n () =>\n doc && Array.isArray(doc[TRANSLATIONS_ARRAY_NAME])\n ? // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion\n (doc[TRANSLATIONS_ARRAY_NAME] as TranslationReference[])\n : [],\n [doc],\n )","{apiVersion: API_VERSION}","() => {\n const tx = client.transaction()\n\n tx.patch(documentId, (patch) => patch.unset([TRANSLATIONS_ARRAY_NAME]))\n\n if (translations.length > 0) {\n translations.forEach((translation) => {\n tx.delete(translation.value._ref)\n tx.delete(`drafts.${translation.value._ref}`)\n })\n }\n\n tx.delete(documentId)\n // Shouldn't exist as this document type is in liveEdit\n tx.delete(`drafts.${documentId}`)\n\n tx.commit()\n .then(() => {\n onClose()\n\n toast.push({\n status: 'success',\n title: 'Deleted document and translations',\n })\n return undefined\n })\n .catch((err: Error) => {\n toast.push({\n status: 'error',\n title: 'Failed to delete document and translations',\n description: err.message,\n })\n })\n }","translations.length","(patch) => patch.unset([TRANSLATIONS_ARRAY_NAME])","useCallback(() => {\n const tx = client.transaction()\n\n tx.patch(documentId, (patch) => patch.unset([TRANSLATIONS_ARRAY_NAME]))\n\n if (translations.length > 0) {\n translations.forEach((translation) => {\n tx.delete(translation.value._ref)\n tx.delete(`drafts.${translation.value._ref}`)\n })\n }\n\n tx.delete(documentId)\n // Shouldn't exist as this document type is in liveEdit\n tx.delete(`drafts.${documentId}`)\n\n tx.commit()\n .then(() => {\n onClose()\n\n toast.push({\n status: 'success',\n title: 'Deleted document and translations',\n })\n return undefined\n })\n .catch((err: Error) => {\n toast.push({\n status: 'error',\n title: 'Failed to delete document and translations',\n description: err.message,\n })\n })\n }, [client, translations, documentId, onClose, toast])","() => {\n setDialogOpen(true)\n }","isDialogOpen && {\n type: 'confirm',\n onCancel: onClose,\n onConfirm: () => {\n onProceed()\n onClose()\n },\n tone: 'critical',\n message:\n translations.length === 1\n ? `Delete 1 translation and this document`\n : `Delete all ${translations.length} translations and this document`,\n }","{\n label: `Delete all translations`,\n disabled: !doc || !translations.length,\n icon: TrashIcon,\n tone: 'critical',\n onHandle: () => {\n setDialogOpen(true)\n },\n dialog: isDialogOpen && {\n type: 'confirm',\n onCancel: onClose,\n onConfirm: () => {\n onProceed()\n onClose()\n },\n tone: 'critical',\n message:\n translations.length === 1\n ? `Delete 1 translation and this document`\n : `Delete all ${translations.length} translations and this document`,\n },\n }","!doc || !translations.length","_c","_temp","validation = []","!isValidating && validation.some((item) => item.level === 'error')","(item) => item.level === 'error'","useMemo(() => {\n return !isValidating && validation.some((item) => item.level === 'error')\n }, [isValidating, validation])","() => {\n if (validationHasErrors) {\n addInvalidId(id)\n } else {\n removeInvalidId(id)\n }\n\n if (editState.draft) {\n addDraftId(id)\n } else {\n removeDraftId(id)\n }\n\n if (!isValidating) {\n onCheckComplete(id)\n }\n }","[\n addDraftId,\n addInvalidId,\n editState.draft,\n id,\n isValidating,\n onCheckComplete,\n removeDraftId,\n removeInvalidId,\n validationHasErrors,\n ]","draft","schema.get(editState.draft._type)","_type","editState.draft && schemaType ? (\n <Preview layout=\"default\" value={editState.draft} schemaType={schemaType} />\n ) : (\n <Spinner />\n )","<Card border padding={2} tone={validationHasErrors ? `critical` : `positive`}>\n {editState.draft && schemaType ? (\n <Preview layout=\"default\" value={editState.draft} schemaType={schemaType} />\n ) : (\n <Spinner />\n )}\n </Card>","validationHasErrors ? `critical` : `positive`","_c","_temp","children ? (\n <>{children}</>\n ) : (\n <Box padding={2}>\n <Text size={1}>{text}</Text>\n </Box>\n )","<Icon />","<TextWithTone tone={tone} size={1}>\n <Icon />\n </TextWithTone>","<Tooltip\n animate\n portal\n content={\n children ? (\n <>{children}</>\n ) : (\n <Box padding={2}>\n <Text size={1}>{text}</Text>\n </Box>\n )\n }\n >\n <TextWithTone tone={tone} size={1}>\n <Icon />\n </TextWithTone>\n </Tooltip>","_c","_Fragment","{maxWidth: 250}","<Box>\n <Text size={1}>Bulk publishing uses the Scheduling API.</Text>\n </Box>","<Box>\n <Text size={1}>\n Customized Document Actions in the Studio will not execute. Webhooks will execute.\n </Text>\n </Box>","<InfoIcon icon={InfoOutlineIcon} tone=\"primary\">\n <Stack padding={3} gap={4} style={{maxWidth: 250}}>\n <Box>\n <Text size={1}>Bulk publishing uses the Scheduling API.</Text>\n </Box>\n <Box>\n <Text size={1}>\n Customized Document Actions in the Studio will not execute. Webhooks will execute.\n </Text>\n </Box>\n <Box>\n <Text size={1}>\n Validation is checked before rendering the button below, but the Scheduling API will not\n check for – or enforce – validation.\n </Text>\n </Box>\n </Stack>\n </InfoIcon>","_c","{apiVersion: API_VERSION}","[]","(id: string) => {\n setCheckedIds((ids) => Array.from(new Set([...ids, id])))\n }","useCallback((id: string) => {\n setCheckedIds((ids) => Array.from(new Set([...ids, id])))\n }, [])","() => setOpen(true)","useCallback(() => setOpen(true), [])","() => setOpen(false)","useCallback(() => setOpen(false), [])","(id: string) => {\n setInvalidIds((ids) => (ids ? Array.from(new Set([...ids, id])) : [id]))\n }","ids","id","useCallback((id: string) => {\n setInvalidIds((ids) => (ids ? Array.from(new Set([...ids, id])) : [id]))\n }, [])","(id: string) => {\n setInvalidIds((ids) => (ids ? ids.filter((i) => i !== id) : []))\n }","useCallback((id: string) => {\n setInvalidIds((ids) => (ids ? ids.filter((i) => i !== id) : []))\n }, [])","(id: string) => {\n setDraftIds((ids) => Array.from(new Set([...ids, id])))\n }","useCallback((id: string) => {\n setDraftIds((ids) => Array.from(new Set([...ids, id])))\n }, [])","(id: string) => {\n setDraftIds((ids) => ids.filter((i) => i !== id))\n }","i","useCallback((id: string) => {\n setDraftIds((ids) => ids.filter((i) => i !== id))\n }, [])","() => {\n const body = translations.map((translation) => ({\n documentId: translation.value._ref,\n }))\n client\n .request({\n url: `/publish/${projectId}/${dataset}`,\n method: 'POST',\n body,\n })\n .then(() => {\n toast.push({\n status: 'success',\n title: 'Success',\n description: 'Bulk publish complete',\n })\n return undefined\n })\n .catch((err: Error) => {\n console.error(err)\n toast.push({\n status: 'error',\n title: 'Error',\n description: 'Bulk publish failed',\n })\n })\n }","(translation) => ({\n documentId: translation.value._ref,\n })","useCallback(() => {\n const body = translations.map((translation) => ({\n documentId: translation.value._ref,\n }))\n client\n .request({\n url: `/publish/${projectId}/${dataset}`,\n method: 'POST',\n body,\n })\n .then(() => {\n toast.push({\n status: 'success',\n title: 'Success',\n description: 'Bulk publish complete',\n })\n return undefined\n })\n .catch((err: Error) => {\n console.error(err)\n toast.push({\n status: 'error',\n title: 'Error',\n description: 'Bulk publish failed',\n })\n })\n }, [translations, client, projectId, dataset, toast])","translations?.length > 0 ? (\n <Card padding={4} border radius={2}>\n <Stack gap={3}>\n <Inline gap={3}>\n <Text weight=\"bold\" size={1}>\n Bulk publishing\n </Text>\n <Info />\n </Inline>\n\n <Stack>\n <Button onClick={onOpen} text=\"Prepare bulk publishing\" mode=\"ghost\" />\n </Stack>\n\n {open && (\n <Dialog\n animate\n header=\"Bulk publishing\"\n id=\"bulk-publish-dialog\"\n onClose={onClose}\n zOffset={1000}\n width={3}\n >\n <Stack gap={4} padding={4}>\n {draftIds.length > 0 ? (\n <Stack gap={2}>\n <Text size={1}>\n There{' '}\n {draftIds.length === 1\n ? `is 1 draft document`\n : `are ${draftIds.length} draft documents`}\n .\n </Text>\n {invalidIds && invalidIds.length > 0 ? (\n <TextWithTone tone=\"critical\" size={1}>\n {invalidIds.length === 1\n ? `1 draft document has`\n : `${invalidIds.length} draft documents have`}{' '}\n validation issues that must be addressed first\n </TextWithTone>\n ) : (\n <TextWithTone tone=\"positive\" size={1}>\n All drafts are valid and can be bulk published\n </TextWithTone>\n )}\n </Stack>\n ) : null}\n\n <Stack gap={1}>\n {translations\n .filter((translation) => translation?.value?._ref)\n .map((translation) => (\n <DocumentCheck\n key={translation._key}\n id={translation.value._ref}\n onCheckComplete={onCheckComplete}\n addInvalidId={addInvalidId}\n removeInvalidId={removeInvalidId}\n addDraftId={addDraftId}\n removeDraftId={removeDraftId}\n />\n ))}\n </Stack>\n {draftIds.length > 0 ? (\n <Button\n mode=\"ghost\"\n tone={invalidIds && invalidIds?.length > 0 ? 'caution' : 'positive'}\n text={\n draftIds.length === 1\n ? `Publish draft document`\n : `Bulk publish ${draftIds.length} draft documents`\n }\n onClick={handleBulkPublish}\n disabled={disabled}\n />\n ) : (\n <Text muted size={1}>\n No draft documents to publish\n </Text>\n )}\n </Stack>\n </Dialog>\n )}\n </Stack>\n </Card>\n ) : null","draftIds.length","translations?.length","(translation) => translation?.value?._ref","translation","_c","_temp","() => {\n if (\n // We have a reference\n translation.value._ref &&\n // It's still weak and not-yet-strengthened\n translation.value._weak &&\n // We also want to keep this check because maybe the user *configured* weak refs\n translation.value._strengthenOnPublish &&\n !loading &&\n publishedDocument &&\n // The metadata pane is ready to accept patches\n ready &&\n !formState?.readOnly\n ) {\n const referencePathBase = ['translations', {_key: translation._key}, 'value']\n\n onChange(\n new PatchEvent([\n unset([...referencePathBase, '_weak']),\n unset([...referencePathBase, '_strengthenOnPublish']),\n ]),\n )\n }\n }","readOnly","_key","_ref","_strengthenOnPublish","_weak","[\n formState?.readOnly,\n loading,\n onChange,\n publishedDocument,\n ready,\n translation._key,\n translation.value._ref,\n translation.value._strengthenOnPublish,\n translation.value._weak,\n ]","formState?.readOnly","_c","translations = []","translations.map((translation) =>\n translation.value._strengthenOnPublish?.type ? (\n <ReferencePatcher key={translation._key} translation={translation} />\n ) : null,\n )","(translation) =>\n translation.value._strengthenOnPublish?.type ? (\n <ReferencePatcher key={translation._key} translation={translation} />\n ) : null","<>\n {translations.map((translation) =>\n translation.value._strengthenOnPublish?.type ? (\n <ReferencePatcher key={translation._key} translation={translation} />\n ) : null,\n )}\n </>","_c","_Fragment","metadata","\"translations\"","\"schemaTypes\""],"sources":["../src/components/DeleteTranslationDialog/DocumentPreview.tsx","../src/constants.ts","../src/components/DeleteTranslationDialog/separateReferences.ts","../src/components/DeleteTranslationDialog/index.tsx","../src/components/DeleteTranslationFooter.tsx","../src/components/DocumentInternationalizationContext.tsx","../src/actions/DeleteTranslationAction.tsx","../src/hooks/useLanguageMetadata.tsx","../src/i18n/index.ts","../src/actions/DuplicateWithTranslationsAction.tsx","../src/hooks/useOpenInNewPane.tsx","../src/utils/createReference.ts","../src/components/LanguageManage.tsx","../src/utils/excludePaths.ts","../src/components/LanguageOption.tsx","../src/components/LanguagePatch.tsx","../src/components/ConstrainedBox.tsx","../src/components/Warning.tsx","../src/components/DocumentInternationalizationMenu.tsx","../src/actions/DeleteMetadataAction.tsx","../src/badges/index.tsx","../src/components/BulkPublish/DocumentCheck.tsx","../src/components/BulkPublish/InfoIcon.tsx","../src/components/BulkPublish/Info.tsx","../src/components/BulkPublish/index.tsx","../src/components/OptimisticallyStrengthen/ReferencePatcher.tsx","../src/components/OptimisticallyStrengthen/index.tsx","../src/schema/translation/metadata.ts","../src/plugin.tsx"],"sourcesContent":["import {Preview, useSchema} from 'sanity'\nimport {Feedback} from 'sanity-plugin-utils'\n\ntype DocumentPreviewProps = {\n value: unknown\n type: string\n}\n\n// Wrapper of Preview just so that the schema type is satisfied by schema.get()\nexport default function DocumentPreview(props: DocumentPreviewProps) {\n const schema = useSchema()\n\n const schemaType = schema.get(props.type)\n if (!schemaType) {\n return <Feedback tone=\"critical\" title=\"Schema type not found\" />\n }\n\n return <Preview value={props.value} schemaType={schemaType} />\n}\n","import type {PluginConfigContext} from './types'\n\nexport const METADATA_SCHEMA_NAME = `translation.metadata`\nexport const TRANSLATIONS_ARRAY_NAME = `translations`\nexport const API_VERSION = `2025-02-19`\nexport const DEFAULT_CONFIG: PluginConfigContext = {\n supportedLanguages: [],\n schemaTypes: [],\n languageField: `language`,\n weakReferences: false,\n bulkPublish: false,\n metadataFields: [],\n apiVersion: API_VERSION,\n allowCreateMetaDoc: false,\n callback: null,\n hideLanguageFilter: false,\n metadataOmnisearchVisibility: true,\n addTemplates: true,\n}\n","import type {SanityDocument} from 'sanity'\n\nimport {METADATA_SCHEMA_NAME} from '../../constants'\n\n/**\n * Splits an array of referring documents into two groups: translation metadata\n * documents (whose `_type` matches the metadata schema name) and all other\n * references. Used by the delete-translation dialog to show which metadata\n * entries will be patched versus which external references may block deletion.\n */\nexport function separateReferences(data: SanityDocument[] | null = []): {\n translations: SanityDocument[]\n otherReferences: SanityDocument[]\n} {\n const translations: SanityDocument[] = []\n const otherReferences: SanityDocument[] = []\n\n if (data && data.length > 0) {\n data.forEach((doc) => {\n if (doc._type === METADATA_SCHEMA_NAME) {\n translations.push(doc)\n } else {\n otherReferences.push(doc)\n }\n })\n }\n\n return {translations, otherReferences}\n}\n","import {Card, Flex, Spinner, Stack, Text} from '@sanity/ui'\nimport {useEffect, useMemo} from 'react'\nimport type {SanityDocument} from 'sanity'\nimport {useListeningQuery} from 'sanity-plugin-utils'\n\nimport type {MetadataDocument} from '../../types'\nimport DocumentPreview from './DocumentPreview'\nimport {separateReferences} from './separateReferences'\n\ntype DeleteTranslationDialogProps = {\n doc: SanityDocument\n documentId: string\n setTranslations: (translations: MetadataDocument[]) => void\n}\n\nexport default function DeleteTranslationDialog(props: DeleteTranslationDialogProps) {\n const {doc, documentId, setTranslations} = props\n\n // Get all references and check if any of them are translations metadata\n const {data, loading} = useListeningQuery<SanityDocument[]>(\n `*[references($id)]{_id, _type, translations}`,\n {\n params: {id: documentId},\n initialValue: [],\n },\n )\n const {translations, otherReferences} = useMemo(() => separateReferences(data), [data])\n\n useEffect(() => {\n // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion\n setTranslations(translations as MetadataDocument[])\n }, [setTranslations, translations])\n\n if (loading) {\n return (\n <Flex padding={4} align=\"center\" justify=\"center\">\n <Spinner />\n </Flex>\n )\n }\n\n return (\n <Stack gap={4}>\n {translations && translations.length > 0 ? (\n <Text>\n This document is a language-specific version which other translations depend on.\n </Text>\n ) : (\n <Text>This document does not have connected translations.</Text>\n )}\n <Card border padding={3}>\n <Stack gap={4}>\n <Text size={1} weight=\"semibold\">\n {translations && translations.length > 0 ? (\n <>Before this document can be deleted</>\n ) : (\n <>This document can now be deleted</>\n )}\n </Text>\n <DocumentPreview value={doc} type={doc._type} />\n {translations && translations.length > 0 ? (\n <>\n <Card borderTop />\n <Text size={1} weight=\"semibold\">\n The reference in{' '}\n {translations.length === 1\n ? `this translations document`\n : `these translations documents`}{' '}\n must be removed\n </Text>\n {translations.map((translation) => (\n <DocumentPreview\n key={translation._id}\n value={translation}\n type={translation._type}\n />\n ))}\n </>\n ) : null}\n {otherReferences && otherReferences.length > 0 ? (\n <>\n <Card borderTop />\n <Text size={1} weight=\"semibold\">\n {otherReferences.length === 1\n ? `There is an additional reference`\n : `There are additional references`}{' '}\n to this document\n </Text>\n {otherReferences.map((reference) => (\n <DocumentPreview key={reference._id} value={reference} type={reference._type} />\n ))}\n </>\n ) : null}\n </Stack>\n </Card>\n {otherReferences.length === 0 ? (\n <Text>This document has no other references.</Text>\n ) : (\n <Text>\n You may not be able to delete this document because other documents refer to it.\n </Text>\n )}\n </Stack>\n )\n}\n","import {Button, Grid} from '@sanity/ui'\n\ntype DeleteTranslationFooterProps = {\n translations: unknown[]\n onClose: () => void\n onProceed: () => void\n}\n\nexport default function DeleteTranslationFooter(props: DeleteTranslationFooterProps) {\n const {translations, onClose, onProceed} = props\n\n return (\n <Grid gridTemplateColumns={2} gap={2}>\n <Button text=\"Cancel\" onClick={onClose} mode=\"ghost\" />\n <Button\n text={\n translations && translations.length > 0\n ? `Unset translation reference`\n : `Delete document`\n }\n onClick={onProceed}\n tone=\"critical\"\n />\n </Grid>\n )\n}\n","import {createContext, use, useContext, useMemo} from 'react'\nimport type {LayoutProps} from 'sanity'\nimport {useClient, useWorkspace} from 'sanity'\n\nimport {DEFAULT_CONFIG} from '../constants'\nimport type {PluginConfig, PluginConfigContext} from '../types'\n\nconst DocumentInternationalizationContext = createContext<PluginConfigContext>(DEFAULT_CONFIG)\n\nexport function useDocumentInternationalizationContext(): PluginConfigContext {\n return useContext(DocumentInternationalizationContext)\n}\n\ntype DocumentInternationalizationProviderProps = LayoutProps & {\n pluginConfig: Required<Omit<PluginConfig, 'metadataInternationalization'>> &\n Pick<PluginConfig, 'metadataInternationalization'>\n}\n\n// Simple promise cache for React.use\nconst promiseCache = new Map<string, Promise<PluginConfigContext['supportedLanguages']>>()\n\nfunction createCacheKey(workspaceId: string): string {\n return `languages-${workspaceId}`\n}\n\nfunction createOrGetPromise(\n fn: () => Promise<PluginConfigContext['supportedLanguages']>,\n cacheKey: string,\n): Promise<PluginConfigContext['supportedLanguages']> {\n const cached = promiseCache.get(cacheKey)\n if (cached) {\n return cached\n }\n const promise = fn()\n promiseCache.set(cacheKey, promise)\n return promise\n}\n\n/**\n * This Provider wraps the Studio and provides the DocumentInternationalization context to document actions and components.\n */\nexport function DocumentInternationalizationProvider(\n props: DocumentInternationalizationProviderProps,\n): React.JSX.Element {\n const {pluginConfig} = props\n\n const client = useClient({apiVersion: pluginConfig.apiVersion})\n const workspace = useWorkspace()\n\n // Use a stable workspace identifier\n const workspaceId = useMemo(() => workspace.name ?? '', [workspace])\n\n // Create cache key for promise caching\n const cacheKey = useMemo(() => createCacheKey(workspaceId), [workspaceId])\n\n // Fetch or return languages\n const languagesPromise = useMemo(() => {\n if (Array.isArray(pluginConfig.supportedLanguages)) {\n return null // Return null for synchronous arrays\n }\n\n // Create or get cached promise for React.use\n return createOrGetPromise(async () => {\n if (typeof pluginConfig.supportedLanguages === 'function') {\n return pluginConfig.supportedLanguages(client)\n }\n return pluginConfig.supportedLanguages\n }, cacheKey)\n }, [pluginConfig, client, cacheKey])\n\n // Use React.use to handle the promise with Suspense, or return array directly\n const supportedLanguages = languagesPromise\n ? use(languagesPromise)\n : // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion\n (pluginConfig.supportedLanguages as PluginConfigContext['supportedLanguages'])\n\n const contextValue = useMemo(\n () => ({...pluginConfig, supportedLanguages}),\n [pluginConfig, supportedLanguages],\n )\n\n return (\n <DocumentInternationalizationContext.Provider value={contextValue}>\n {props.renderDefault(props)}\n </DocumentInternationalizationContext.Provider>\n )\n}\n","import {TrashIcon} from '@sanity/icons/Trash'\nimport {useToast} from '@sanity/ui/toast'\nimport {useCallback, useState} from 'react'\nimport {useClient, type DocumentActionDescription, type DocumentActionProps} from 'sanity'\nimport {LANGUAGE_FIELD_NAME} from 'sanity-plugin-internationalized-array'\n\nimport DeleteTranslationDialog from '../components/DeleteTranslationDialog'\nimport DeleteTranslationFooter from '../components/DeleteTranslationFooter'\nimport {useDocumentInternationalizationContext} from '../components/DocumentInternationalizationContext'\nimport {API_VERSION, TRANSLATIONS_ARRAY_NAME} from '../constants'\nimport {type MetadataDocument} from '../types'\n\ntype DeleteOperation = 'DELETE' | 'UNSET'\n\n/**\n * Optional Document action that removes a single translation from the metadata document\n * and optionally deletes the translation document. Opens a confirmation dialog\n * showing which metadata entries reference the document and any other references\n * that may exist. When the document has translation references, those references\n * are unset; otherwise the document is deleted directly.\n *\n * To use it, you need to add it to the document actions config\n * ```\n * const translatedSchemaTypes = ['lesson', 'article'];\n * document: {\n * actions: (prev, {schemaType}) => {\n * if (translatedSchemaTypes.includes(schemaType)) {\n * return [...prev, useDeleteTranslationAction]\n * }\n * return prev\n * },\n * },\n * ```\n */\nexport const useDeleteTranslationAction = (\n props: DocumentActionProps,\n): DocumentActionDescription => {\n const {id: documentId, published, draft} = props\n const doc = draft || published\n const {languageField} = useDocumentInternationalizationContext()\n\n const [isDialogOpen, setDialogOpen] = useState(false)\n const [translations, setTranslations] = useState<MetadataDocument[]>([])\n const onClose = useCallback(() => setDialogOpen(false), [])\n const rawDocumentLanguage = doc ? doc[languageField] : null\n const documentLanguage = typeof rawDocumentLanguage === 'string' ? rawDocumentLanguage : null\n\n const toast = useToast()\n const client = useClient({apiVersion: API_VERSION})\n // Remove translation reference and delete document in one transaction\n const onProceed = useCallback(() => {\n const tx = client.transaction()\n let operation: DeleteOperation = 'DELETE'\n\n if (documentLanguage && translations.length > 0) {\n operation = 'UNSET'\n translations.forEach((translation) => {\n tx.patch(translation._id, (patch) =>\n patch.unset([\n `${TRANSLATIONS_ARRAY_NAME}[${LANGUAGE_FIELD_NAME} == \"${documentLanguage}\"]`,\n ]),\n )\n })\n } else {\n tx.delete(documentId)\n tx.delete(`drafts.${documentId}`)\n }\n\n tx.commit()\n .then(() => {\n if (operation === 'DELETE') {\n onClose()\n }\n toast.push({\n status: 'success',\n title: operation === 'UNSET' ? 'Translation reference unset' : 'Document deleted',\n description: operation === 'UNSET' ? 'The document can now be deleted' : null,\n })\n return undefined\n })\n .catch((err: Error) => {\n toast.push({\n status: 'error',\n title:\n operation === 'UNSET'\n ? 'Failed to unset translation reference'\n : 'Failed to delete document',\n description: err.message,\n })\n })\n }, [client, documentLanguage, translations, documentId, onClose, toast])\n\n return {\n label: `Delete translation...`,\n disabled: !doc || !documentLanguage,\n icon: TrashIcon,\n tone: 'critical',\n onHandle: () => {\n setDialogOpen(true)\n },\n dialog: isDialogOpen && {\n type: 'dialog',\n onClose,\n header: 'Delete translation',\n content: doc ? (\n <DeleteTranslationDialog\n doc={doc}\n documentId={documentId}\n setTranslations={setTranslations}\n />\n ) : null,\n footer: (\n <DeleteTranslationFooter\n onClose={onClose}\n onProceed={onProceed}\n translations={translations}\n />\n ),\n },\n }\n}\n\nuseDeleteTranslationAction.action = 'deleteTranslation'\nuseDeleteTranslationAction.displayName = 'DeleteTranslationAction'\n\n/**\n * @deprecated use useDeleteTranslationAction instead\n * Will be removed in the next major version\n */\nexport const DeleteTranslationAction = (props: DocumentActionProps): DocumentActionDescription => {\n return useDeleteTranslationAction(props)\n}\n","import {useListeningQuery} from 'sanity-plugin-utils'\n\nimport {METADATA_SCHEMA_NAME} from '../constants'\nimport type {Metadata} from '../types'\n\n// Using references() seemed less reliable for updating the listener\n// results than querying raw values in the array\n// AFAIK: references is _faster_ when querying with GROQ\n// const query = `*[_type == $translationSchema && references($id)]`\nconst query = `*[_type == $translationSchema && $id in translations[].value._ref]{\n _id,\n _createdAt,\n translations\n}`\n\nexport function useTranslationMetadata(id: string): {\n data: Metadata[] | null\n loading: boolean\n error: unknown\n} {\n const {data, loading, error} = useListeningQuery<Metadata[]>(query, {\n params: {id, translationSchema: METADATA_SCHEMA_NAME},\n })\n\n return {data, loading, error}\n}\n","import {defineLocaleResourceBundle} from 'sanity'\n\n/**\n * The locale namespace for the document internationalization plugin.\n *\n * @public\n */\nexport const documenti18nLocaleNamespace = 'document-internationalization' as const\n\n/**\n * The default locale bundle for the document internationalization plugin, which is US English.\n *\n * @internal\n */\nexport const documentInternationalizationUsEnglishLocaleBundle = defineLocaleResourceBundle({\n locale: 'en-US',\n namespace: documenti18nLocaleNamespace,\n resources: () => import('./resources'),\n})\n","import {CopyIcon} from '@sanity/icons/Copy'\nimport {useToast} from '@sanity/ui/toast'\nimport {uuid} from '@sanity/uuid'\nimport {useCallback, useMemo, useState} from 'react'\nimport {filter, firstValueFrom} from 'rxjs'\nimport {\n DEFAULT_STUDIO_CLIENT_OPTIONS,\n type Id,\n InsufficientPermissionsMessage,\n type PatchOperations,\n useClient,\n useCurrentUser,\n useDocumentOperation,\n useDocumentPairPermissions,\n useDocumentStore,\n useTranslation,\n type DocumentActionProps,\n type DocumentActionDescription,\n} from 'sanity'\nimport {LANGUAGE_FIELD_NAME} from 'sanity-plugin-internationalized-array'\nimport {useRouter} from 'sanity/router'\nimport {structureLocaleNamespace} from 'sanity/structure'\n\nimport {METADATA_SCHEMA_NAME, TRANSLATIONS_ARRAY_NAME} from '../constants'\nimport {useTranslationMetadata} from '../hooks/useLanguageMetadata'\nimport {documenti18nLocaleNamespace} from '../i18n'\n\n// Types for document store operations\ninterface EditOperations {\n duplicate: {disabled: string | false; execute: (id: string) => void}\n}\n\ninterface OperationSuccessEvent {\n op: string\n type: 'success' | 'error'\n}\n\nconst DISABLED_REASON_KEY = {\n METADATA_NOT_FOUND: 'action.duplicate.disabled.missing-metadata',\n MULTIPLE_METADATA: 'action.duplicate.disabled.multiple-metadata',\n NOTHING_TO_DUPLICATE: 'action.duplicate.disabled.nothing-to-duplicate',\n NOT_READY: 'action.duplicate.disabled.not-ready',\n TARGET_NOT_FOUND: 'action.duplicate.disabled.target-not-found',\n}\n\n/**\n * Optional Document action that duplicates a document along with all its translations\n * and the associated metadata document. The workflow duplicates each translated\n * document, duplicates the metadata document, patches the new metadata to\n * reference the new translation copies, and navigates to the duplicated document.\n * Disabled when the user lacks permissions, metadata is missing or ambiguous,\n * or the underlying duplicate operation is unavailable.\n */\nexport const useDuplicateWithTranslationsAction = ({\n id,\n type,\n /* oxlint-disable-next-line typescript-eslint/no-deprecated -- kept for backwards compatibility */\n onComplete,\n}: DocumentActionProps): DocumentActionDescription => {\n const documentStore = useDocumentStore()\n const {duplicate} = useDocumentOperation(id, type)\n const {navigateIntent} = useRouter()\n const [isDuplicating, setDuplicating] = useState(false)\n const [permissions, isPermissionsLoading] = useDocumentPairPermissions({\n id,\n type,\n permission: 'duplicate',\n })\n const {data, loading: isMetadataDocumentLoading} = useTranslationMetadata(id)\n const hasOneMetadataDocument = useMemo(() => {\n return Array.isArray(data) && data.length <= 1\n }, [data])\n const metadataDocument = Array.isArray(data) && data.length ? data[0] : null\n const client = useClient(DEFAULT_STUDIO_CLIENT_OPTIONS)\n const toast = useToast()\n const {t: s} = useTranslation(structureLocaleNamespace)\n const {t: d} = useTranslation(documenti18nLocaleNamespace)\n const currentUser = useCurrentUser()\n\n const handle = useCallback(() => {\n setDuplicating(true)\n\n // Async function that does the actual work\n async function performDuplication(): Promise<void> {\n if (!metadataDocument) {\n return Promise.reject(new Error('Metadata document not found'))\n }\n\n const translationsArray = metadataDocument[TRANSLATIONS_ARRAY_NAME]\n if (!translationsArray || translationsArray.length === 0) {\n return Promise.reject(new Error('No translations found in metadata document'))\n }\n\n // 1. Duplicate the document and its localized versions\n const translations = new Map<string, Id>()\n await Promise.all(\n // oxlint-disable-next-line consistent-return\n translationsArray.map(async (translation) => {\n const dupeId = uuid()\n const locale = translation[LANGUAGE_FIELD_NAME]\n const docId = translation.value?._ref\n\n if (typeof locale !== 'string' || locale.trim().length === 0) {\n return Promise.reject(new Error('Invalid locale for translation'))\n }\n if (!docId) {\n return Promise.reject(new Error('Translation document not found'))\n }\n\n const {duplicate: duplicateTranslation} = await firstValueFrom(\n documentStore.pair\n .editOperations(docId, type)\n .pipe(filter((op: EditOperations) => op.duplicate.disabled !== 'NOT_READY')),\n )\n\n if (duplicateTranslation.disabled) {\n return Promise.reject(new Error('Cannot duplicate document'))\n }\n\n const duplicateTranslationSuccess = firstValueFrom(\n documentStore.pair\n .operationEvents(docId, type)\n .pipe(\n filter((e: OperationSuccessEvent) => e.op === 'duplicate' && e.type === 'success'),\n ),\n )\n duplicateTranslation.execute(dupeId)\n await duplicateTranslationSuccess\n\n translations.set(locale, dupeId)\n }),\n )\n\n // 2. Duplicate the metadata document\n const {duplicate: duplicateMetadata} = await firstValueFrom(\n documentStore.pair\n .editOperations(metadataDocument._id, METADATA_SCHEMA_NAME)\n .pipe(filter((op: EditOperations) => op.duplicate.disabled !== 'NOT_READY')),\n )\n\n if (duplicateMetadata.disabled) {\n return Promise.reject(new Error('Cannot duplicate document'))\n }\n\n const duplicateMetadataSuccess = firstValueFrom(\n documentStore.pair\n .operationEvents(metadataDocument._id, METADATA_SCHEMA_NAME)\n .pipe(filter((e: OperationSuccessEvent) => e.op === 'duplicate' && e.type === 'success')),\n )\n const dupeId = uuid()\n duplicateMetadata.execute(dupeId)\n await duplicateMetadataSuccess\n\n // 3. Patch the duplicated metadata document to update the references\n const patch: PatchOperations = {\n set: Object.fromEntries(\n Array.from(translations.entries()).map(([locale, documentId]) => {\n return [\n `${TRANSLATIONS_ARRAY_NAME}[${LANGUAGE_FIELD_NAME} == \"${locale}\"].value._ref`,\n documentId,\n ]\n }),\n ),\n }\n\n await client.transaction().patch(dupeId, patch).commit()\n\n // 4. Navigate to the duplicated document\n navigateIntent('edit', {\n id: Array.from(translations.values()).at(0),\n type,\n })\n\n onComplete()\n }\n\n // Execute and handle success/error\n performDuplication()\n .catch((error: unknown) => {\n console.error(error)\n toast.push({\n status: 'error',\n title: 'Error duplicating document',\n description: error instanceof Error ? error.message : 'Failed to duplicate document',\n })\n })\n .finally(() => {\n setDuplicating(false)\n })\n }, [client, documentStore.pair, metadataDocument, navigateIntent, onComplete, toast, type])\n\n return useMemo(() => {\n if (!isPermissionsLoading && !permissions?.granted) {\n return {\n icon: CopyIcon,\n disabled: true,\n label: d('action.duplicate.label'),\n title: (\n <InsufficientPermissionsMessage context=\"duplicate-document\" currentUser={currentUser} />\n ),\n }\n }\n\n if (!isMetadataDocumentLoading && !metadataDocument) {\n return {\n icon: CopyIcon,\n disabled: true,\n label: d('action.duplicate.label'),\n title: d(DISABLED_REASON_KEY.METADATA_NOT_FOUND),\n }\n }\n\n if (!hasOneMetadataDocument) {\n return {\n icon: CopyIcon,\n disabled: true,\n label: d('action.duplicate.label'),\n title: d(DISABLED_REASON_KEY.MULTIPLE_METADATA),\n }\n }\n\n return {\n icon: CopyIcon,\n disabled:\n isDuplicating ||\n Boolean(duplicate.disabled) ||\n isPermissionsLoading ||\n isMetadataDocumentLoading,\n label: isDuplicating ? s('action.duplicate.running.label') : d('action.duplicate.label'),\n title: duplicate.disabled ? s(DISABLED_REASON_KEY[duplicate.disabled]) : '',\n onHandle: handle,\n }\n }, [\n currentUser,\n duplicate.disabled,\n handle,\n hasOneMetadataDocument,\n isDuplicating,\n isMetadataDocumentLoading,\n isPermissionsLoading,\n metadataDocument,\n permissions?.granted,\n s,\n d,\n ])\n}\n\nuseDuplicateWithTranslationsAction.action = 'duplicate'\nuseDuplicateWithTranslationsAction.displayName = 'DuplicateWithTranslationsAction'\n\n/**\n * @deprecated use useDuplicateWithTranslationsAction instead\n * Will be removed in the next major version\n */\nexport const DuplicateWithTranslationsAction = (\n props: DocumentActionProps,\n): DocumentActionDescription => {\n return useDuplicateWithTranslationsAction(props)\n}\n\n/* oxlint-disable-next-line typescript-eslint/no-deprecated -- re-exported for backwards compatibility */\nDuplicateWithTranslationsAction.action = 'duplicate'\n/* oxlint-disable-next-line typescript-eslint/no-deprecated -- re-exported for backwards compatibility */\nDuplicateWithTranslationsAction.displayName = 'DuplicateWithTranslationsAction'\n","import {useCallback} from 'react'\nimport {useRouter} from 'sanity/router'\nimport {usePaneRouter} from 'sanity/structure'\n\nexport function useOpenInNewPane(id?: string | null, type?: string): () => void {\n const router = useRouter()\n const {routerPanesState, groupIndex} = usePaneRouter()\n\n const openInNewPane = useCallback(() => {\n if (!id || !type) {\n return\n }\n\n // No panes open, function might be called outside Structure\n if (!routerPanesState.length) {\n router.navigateIntent('edit', {id, type})\n return\n }\n\n const panes = [...routerPanesState]\n panes.splice(groupIndex + 1, 0, [\n {\n id: id,\n params: {type},\n },\n ])\n\n const href = router.resolvePathFromState({panes})\n router.navigateUrl({path: href})\n }, [id, type, router, routerPanesState, groupIndex])\n\n return openInNewPane\n}\n","import {randomKey} from '@sanity/util/content'\nimport {LANGUAGE_FIELD_NAME} from 'sanity-plugin-internationalized-array'\n\nimport type {TranslationReference} from '../types'\n\n/**\n * Creates a translation reference object used in metadata documents to link\n * a language key to a document. References are created as weak by default,\n * with optional strengthen-on-publish metadata so the reference becomes\n * strong once the referenced document is published.\n */\nexport function createReference(\n language: string,\n ref: string,\n type: string,\n strengthenOnPublish: boolean = true,\n): TranslationReference {\n return {\n [LANGUAGE_FIELD_NAME]: language,\n _key: randomKey(),\n _type: 'internationalizedArrayReferenceValue',\n value: {\n _type: 'reference',\n _ref: ref,\n _weak: true,\n // If the user has configured weakReferences, we won't want to strengthen them\n ...(strengthenOnPublish ? {_strengthenOnPublish: {type}} : {}),\n },\n }\n}\n","import {CogIcon} from '@sanity/icons/Cog'\nimport {Box, Button, Stack, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {useCallback, useState} from 'react'\nimport {type ObjectSchemaType, useClient} from 'sanity'\n\nimport {METADATA_SCHEMA_NAME} from '../constants'\nimport {useOpenInNewPane} from '../hooks/useOpenInNewPane'\nimport {createReference} from '../utils/createReference'\nimport {useDocumentInternationalizationContext} from './DocumentInternationalizationContext'\n\ntype LanguageManageProps = {\n id?: string\n metadataId?: string | null\n schemaType: ObjectSchemaType\n documentId: string\n sourceLanguageId?: string\n}\n\n/**\n * Button component for opening or creating the translation metadata document.\n * When metadata already exists, clicking opens it in a new pane. When no\n * metadata exists and creation is allowed, clicking creates a new metadata\n * document with the source language reference and then opens it.\n */\nexport default function LanguageManage(props: LanguageManageProps) {\n const {id, metadataId, schemaType, documentId, sourceLanguageId} = props\n const open = useOpenInNewPane(id, METADATA_SCHEMA_NAME)\n const openCreated = useOpenInNewPane(metadataId, METADATA_SCHEMA_NAME)\n const {allowCreateMetaDoc, apiVersion, weakReferences} = useDocumentInternationalizationContext()\n const client = useClient({apiVersion})\n const [userHasClicked, setUserHasClicked] = useState(false)\n\n const canCreate = !id && Boolean(metadataId) && allowCreateMetaDoc\n\n const handleClick = useCallback(() => {\n if (!id && metadataId && sourceLanguageId) {\n /* Disable button while this request is pending */\n setUserHasClicked(true)\n\n // handle creation of meta document\n const transaction = client.transaction()\n\n const sourceReference = createReference(\n sourceLanguageId,\n documentId,\n schemaType.name,\n !weakReferences,\n )\n const newMetadataDocument = {\n _id: metadataId,\n _type: METADATA_SCHEMA_NAME,\n schemaTypes: [schemaType.name],\n translations: [sourceReference],\n }\n\n transaction.createIfNotExists(newMetadataDocument)\n\n transaction\n .commit()\n .then(() => {\n setUserHasClicked(false)\n openCreated()\n return undefined\n })\n .catch((err: unknown) => {\n console.error(err)\n setUserHasClicked(false)\n })\n } else {\n open()\n }\n }, [\n id,\n metadataId,\n sourceLanguageId,\n client,\n documentId,\n schemaType.name,\n weakReferences,\n openCreated,\n open,\n ])\n\n const disabled = (!id && !canCreate) || (canCreate && !sourceLanguageId) || userHasClicked\n\n return (\n <Tooltip\n animate\n content={\n <Box padding={2}>\n <Text muted size={1}>\n Document has no other translations\n </Text>\n </Box>\n }\n fallbackPlacements={['right', 'left']}\n placement=\"top\"\n portal\n disabled={Boolean(id) || canCreate}\n >\n <Stack>\n <Button\n disabled={disabled}\n mode=\"ghost\"\n text=\"Manage Translations\"\n icon={CogIcon}\n loading={userHasClicked}\n onClick={handleClick}\n />\n </Stack>\n </Tooltip>\n )\n}\n","import {extractWithPath, Mutation} from '@sanity/mutator'\nimport {\n isDocumentSchemaType,\n type ObjectSchemaType,\n type Path,\n pathToString,\n type SanityDocument,\n type SchemaType,\n} from 'sanity'\n\nexport interface DocumentMember {\n schemaType: SchemaType\n path: Path\n name: string\n value: unknown\n}\n\n/**\n * Removes fields from a document that are marked with the\n * `documentInternationalization.exclude` schema option. This is used when\n * duplicating a source document to create a translation, so that\n * language-specific or non-translatable fields are stripped from the copy.\n * Returns the document with excluded paths unset, or `null` if the input is null.\n */\nexport function removeExcludedPaths(\n doc: SanityDocument | null,\n schemaType: ObjectSchemaType,\n): SanityDocument | null {\n // If the supplied doc is null or the schemaType\n // isn't a document, return as is.\n if (!isDocumentSchemaType(schemaType) || !doc) {\n return doc\n }\n\n // The extractPaths function gets all the fields in the doc with\n // a value, along with their schemaTypes and paths. We'll end up\n // with an array of paths in string form which we want to exclude\n const pathsToExclude: string[] = extractPaths(doc, schemaType, [])\n // We filter for any fields which should be excluded from the document\n // duplicate action, based on the schemaType option being set.\n .filter((field) => field.schemaType?.options?.documentInternationalization?.exclude === true)\n // then we return the stringified version of the path\n .map((field) => {\n return pathToString(field.path)\n })\n\n // Now we can use the Mutation class from @sanity/mutator to patch the document\n // to remove all the paths that are for one of the excluded fields. This is just\n // done locally, and the documents themselves are not patched in the Content Lake.\n const mut = new Mutation({\n mutations: [\n {\n patch: {\n id: doc._id,\n unset: pathsToExclude,\n },\n },\n ],\n })\n\n // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion\n return mut.apply(doc) as SanityDocument\n}\n\nfunction extractPaths(\n doc: SanityDocument,\n schemaType: ObjectSchemaType,\n path: Path,\n): DocumentMember[] {\n const result: DocumentMember[] = []\n\n for (const field of schemaType.fields) {\n const fieldPath = [...path, field.name]\n const fieldSchema = field.type\n const {value} = extractWithPath(pathToString(fieldPath), doc)[0] ?? {}\n if (value === undefined || value === null) {\n continue\n }\n\n const thisFieldWithPath: DocumentMember = {\n path: fieldPath,\n name: field.name,\n schemaType: fieldSchema,\n value,\n }\n\n if (fieldSchema.jsonType === 'object') {\n const innerFields = extractPaths(doc, fieldSchema, fieldPath)\n result.push(thisFieldWithPath, ...innerFields)\n } else if (\n fieldSchema.jsonType === 'array' &&\n fieldSchema.of.length &&\n fieldSchema.of.some((item) => 'fields' in item)\n ) {\n const {value: arrayValue} = extractWithPath(pathToString(fieldPath), doc)[0] ?? {}\n\n result.push(thisFieldWithPath)\n // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion\n if ((arrayValue as unknown[])?.length) {\n // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion\n for (const item of arrayValue as Array<{\n _key?: string\n language?: string\n _type?: string\n }>) {\n if (!item._key) continue\n const itemPath = [...fieldPath, {_key: item._key}] as Path\n let itemSchema = fieldSchema.of.find((t) => t.name === item._type)\n if (!item._type) {\n itemSchema = fieldSchema.of[0]\n }\n if (itemSchema) {\n // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion\n const innerFields = extractPaths(doc, itemSchema as ObjectSchemaType, itemPath)\n const arrayMember: DocumentMember = {\n path: itemPath,\n name: item._key,\n schemaType: itemSchema,\n value: item,\n }\n result.push(arrayMember, ...innerFields)\n }\n }\n }\n } else {\n result.push(thisFieldWithPath)\n }\n }\n\n return result\n}\n","import {AddIcon} from '@sanity/icons/Add'\nimport {CheckmarkIcon} from '@sanity/icons/Checkmark'\nimport {SplitVerticalIcon} from '@sanity/icons/SplitVertical'\nimport {Badge, Box, Button, Flex, Spinner, Text} from '@sanity/ui'\nimport {useToast} from '@sanity/ui/toast'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {uuid} from '@sanity/uuid'\nimport {useCallback, useState} from 'react'\nimport {\n getDraftId,\n getVersionFromId,\n getVersionId,\n isVersionId,\n type ObjectSchemaType,\n type SanityDocument,\n useClient,\n} from 'sanity'\nimport {LANGUAGE_FIELD_NAME} from 'sanity-plugin-internationalized-array'\n\nimport {METADATA_SCHEMA_NAME} from '../constants'\nimport {useOpenInNewPane} from '../hooks/useOpenInNewPane'\nimport type {Language, Metadata, MetadataDocument, TranslationReference} from '../types'\nimport {createReference} from '../utils/createReference'\nimport {removeExcludedPaths} from '../utils/excludePaths'\nimport {useDocumentInternationalizationContext} from './DocumentInternationalizationContext'\n\ntype LanguageOptionProps = {\n language: Language\n schemaType: ObjectSchemaType\n documentId: string\n disabled: boolean\n current: boolean\n source: SanityDocument | null\n metadataId: string | null\n metadata?: Metadata | null\n sourceLanguageId?: string\n}\n\n/**\n * Button component representing a single language in the translations menu.\n * Displays the language name, an ID badge, and a contextual icon: checkmark\n * for the current language, split-vertical for existing translations, or add\n * for new translations. Clicking opens an existing translation in a new pane,\n * or creates a new translation document via a Sanity transaction.\n */\nexport default function LanguageOption(props: LanguageOptionProps) {\n const {\n language,\n schemaType,\n documentId,\n current,\n source,\n sourceLanguageId,\n metadata,\n metadataId,\n } = props\n /* When the user has clicked the Create button, the button should be disabled\n * to prevent double-clicks from firing onCreate twice. This creates duplicate\n * translation metadata entries, which editors will not be able to delete */\n const [userHasClicked, setUserHasClicked] = useState(false)\n const disabled =\n props.disabled || userHasClicked || current || !source || !sourceLanguageId || !metadataId\n const translation: TranslationReference | undefined = metadata?.translations.length\n ? metadata.translations.find((t) => t[LANGUAGE_FIELD_NAME] === language.id)\n : undefined\n const {apiVersion, languageField, weakReferences, callback} =\n useDocumentInternationalizationContext()\n const client = useClient({apiVersion})\n const toast = useToast()\n\n const open = useOpenInNewPane(translation?.value?._ref, schemaType.name)\n const handleOpen = useCallback(() => open(), [open])\n\n const handleCreate = useCallback(async () => {\n if (!source) {\n throw new Error(`Cannot create translation without source document`)\n }\n\n if (!sourceLanguageId) {\n throw new Error(`Cannot create translation without source language ID`)\n }\n\n if (!metadataId) {\n throw new Error(`Cannot create translation without a metadata ID`)\n }\n /* Disable the create button while this request is pending */\n setUserHasClicked(true)\n\n const transaction = client.transaction()\n\n // 1. Duplicate source document\n // If the source belongs to a release, create the translation\n // as a version in that same release, otherwise as a draft\n const newTranslationDocumentId = uuid()\n const sourceReleaseId = isVersionId(source._id) ? getVersionFromId(source._id) : undefined\n let newTranslationDocument = {\n ...source,\n _id: sourceReleaseId\n ? getVersionId(newTranslationDocumentId, sourceReleaseId)\n : getDraftId(newTranslationDocumentId),\n // 2. Update language of the translation\n [languageField]: language.id,\n }\n\n // Remove fields / paths we don't want to duplicate\n newTranslationDocument = removeExcludedPaths(\n newTranslationDocument,\n schemaType,\n // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion\n ) as SanityDocument\n\n transaction.create(newTranslationDocument)\n\n // 3. Maybe create the metadata document\n const sourceReference = createReference(\n sourceLanguageId,\n documentId,\n schemaType.name,\n !weakReferences,\n )\n const newTranslationReference = createReference(\n language.id,\n newTranslationDocumentId,\n schemaType.name,\n !weakReferences,\n )\n const newMetadataDocument: MetadataDocument = {\n _id: metadataId,\n _type: METADATA_SCHEMA_NAME,\n schemaTypes: [schemaType.name],\n translations: [sourceReference],\n }\n\n transaction.createIfNotExists(newMetadataDocument)\n\n // 4. Patch translation to metadata document\n // Note: If the document was only just created in the operation above\n // This patch operation will have no effect\n const metadataPatch = client\n .patch(metadataId)\n .setIfMissing({translations: [sourceReference]})\n .insert(`after`, `translations[-1]`, [newTranslationReference])\n\n transaction.patch(metadataPatch)\n\n // 5. Commit!\n transaction\n .commit()\n .then(() => {\n const metadataExisted = Boolean(metadata?._createdAt)\n\n toast.push({\n status: 'success',\n title: `Created \"${language.title}\" translation`,\n description: metadataExisted\n ? `Updated Translations Metadata`\n : `Created Translations Metadata`,\n })\n\n /* Once a translation has been created, reset the userHasClicked state to false\n * so they can click on it to navigate to the translation */\n setUserHasClicked(false)\n\n // Execute callback if provided\n if (callback) {\n // oxlint-disable-next-line eslint-plugin-promise/no-callback-in-promise -- This is an async callback, not a Node.js callback\n return callback({\n client,\n sourceLanguageId,\n sourceDocument: source,\n newDocument: newTranslationDocument,\n destinationLanguageId: language.id,\n metaDocumentId: metadataId,\n })\n }\n\n return undefined\n })\n .catch((err: Error) => {\n console.error(err)\n\n /* Re-enable the create button if there was an error */\n setUserHasClicked(false)\n\n return toast.push({\n status: 'error',\n title: `Error creating translation`,\n description: err.message,\n })\n })\n }, [\n client,\n documentId,\n language.id,\n language.title,\n languageField,\n metadata?._createdAt,\n metadataId,\n schemaType,\n source,\n sourceLanguageId,\n toast,\n weakReferences,\n callback,\n ])\n\n let message\n\n if (current) {\n message = `Current document`\n } else if (translation) {\n message = `Open ${language.title} translation`\n } else if (!translation) {\n message = `Create new ${language.title} translation`\n }\n\n return (\n <Tooltip\n animate\n content={\n <Box padding={2}>\n <Text muted size={1}>\n {message}\n </Text>\n </Box>\n }\n fallbackPlacements={['right', 'left']}\n placement=\"top\"\n portal\n >\n <Button\n onClick={translation ? handleOpen : handleCreate}\n mode={current && disabled ? `default` : `bleed`}\n disabled={disabled}\n >\n <Flex gap={3} align=\"center\">\n {disabled && !current ? (\n <Spinner />\n ) : (\n <Text size={2}>\n {translation ? <SplitVerticalIcon /> : current ? <CheckmarkIcon /> : <AddIcon />}\n </Text>\n )}\n <Box flex={1}>\n <Text>{language.title}</Text>\n </Box>\n <Badge tone={disabled || current ? `default` : `primary`}>{language.id}</Badge>\n </Flex>\n </Button>\n </Tooltip>\n )\n}\n","import {EditIcon} from '@sanity/icons/Edit'\nimport {Badge, Box, Button, Flex, Text} from '@sanity/ui'\nimport {useToast} from '@sanity/ui/toast'\nimport {useCallback} from 'react'\nimport {type SanityDocument, useClient} from 'sanity'\n\nimport type {Language} from '../types'\nimport {useDocumentInternationalizationContext} from './DocumentInternationalizationContext'\n\ntype LanguagePatchProps = {\n language: Language\n source: SanityDocument | null\n disabled: boolean\n}\n\n/**\n * Button component that patches the current document's language field to\n * the selected language. Displays the language name and ID badge, and shows\n * a success or error toast after the patch operation completes.\n */\nexport default function LanguagePatch(props: LanguagePatchProps) {\n const {language, source} = props\n const {apiVersion, languageField} = useDocumentInternationalizationContext()\n const disabled = props.disabled || !source\n const client = useClient({apiVersion})\n const toast = useToast()\n\n const handleClick = useCallback(() => {\n if (!source) {\n throw new Error(`Cannot patch missing document`)\n }\n\n const currentId = source._id\n\n client\n .patch(currentId)\n .set({[languageField]: language.id})\n .commit()\n .then(() => {\n toast.push({\n title: `Set document language to ${language.title}`,\n status: `success`,\n })\n return undefined\n })\n .catch((err: unknown) => {\n console.error(err)\n\n return toast.push({\n title: `Failed to set document language to ${language.title}`,\n status: `error`,\n })\n })\n }, [source, client, languageField, language, toast])\n\n return (\n <Button mode=\"bleed\" onClick={handleClick} disabled={disabled} justify=\"flex-start\">\n <Flex gap={3} align=\"center\">\n <Text size={2}>\n <EditIcon />\n </Text>\n <Box flex={1}>\n <Text>{language.title}</Text>\n </Box>\n <Badge>{language.id}</Badge>\n </Flex>\n </Button>\n )\n}\n","import {Box} from '@sanity/ui'\n\nexport default function ConstrainedBox({children}: {children: React.ReactNode}): React.JSX.Element {\n return <Box style={{maxWidth: 280}}>{children}</Box>\n}\n","import {Card, Flex, Text} from '@sanity/ui'\nimport type {PropsWithChildren} from 'react'\n\nimport ConstrainedBox from './ConstrainedBox'\n\n/**\n * Presentational component that renders a caution-toned card with centered\n * text inside a constrained-width box. Used to display warning messages\n * in the internationalization UI.\n */\nexport default function Warning({children}: PropsWithChildren) {\n return (\n <Card tone=\"caution\" padding={3}>\n <Flex justify=\"center\">\n <ConstrainedBox>\n <Text size={1} align=\"center\">\n {children}\n </Text>\n </ConstrainedBox>\n </Flex>\n </Card>\n )\n}\n","import {TranslateIcon} from '@sanity/icons/Translate'\nimport {Box, Button, Card, Stack, Text, TextInput, useClickOutsideEvent} from '@sanity/ui'\nimport {Popover} from '@sanity/ui/popover'\nimport {uuid} from '@sanity/uuid'\nimport type {ChangeEvent} from 'react'\nimport {useCallback, useMemo, useRef, useState} from 'react'\nimport {useEditState, usePerspective} from 'sanity'\nimport {LANGUAGE_FIELD_NAME} from 'sanity-plugin-internationalized-array'\n\nimport {useTranslationMetadata} from '../hooks/useLanguageMetadata'\nimport type {DocumentInternationalizationMenuProps} from '../types'\nimport {useDocumentInternationalizationContext} from './DocumentInternationalizationContext'\nimport LanguageManage from './LanguageManage'\nimport LanguageOption from './LanguageOption'\nimport LanguagePatch from './LanguagePatch'\nimport Warning from './Warning'\n\nexport function DocumentInternationalizationMenu(\n props: DocumentInternationalizationMenuProps,\n): React.JSX.Element | null {\n const {documentId} = props\n const schemaType = props.schemaType\n const {languageField, supportedLanguages} = useDocumentInternationalizationContext()\n\n // Search filter query\n const [query, setQuery] = useState(``)\n const handleQuery = useCallback((event: ChangeEvent<HTMLInputElement>) => {\n if (event.currentTarget.value) {\n setQuery(event.currentTarget.value)\n } else {\n setQuery(``)\n }\n }, [])\n\n // UI Handlers\n const [open, setOpen] = useState(false)\n const handleClick = useCallback(() => setOpen((o) => !o), [])\n const buttonRef = useRef<HTMLButtonElement>(null)\n const popoverRef = useRef<HTMLDivElement>(null)\n const handleClickOutside = useCallback(() => setOpen(false), [])\n useClickOutsideEvent(handleClickOutside, () => [buttonRef.current, popoverRef.current])\n\n // Get metadata from content lake\n const {data, loading, error} = useTranslationMetadata(documentId)\n const metadata = Array.isArray(data) && data.length ? data[0] : null\n\n // Optimistically set a metadata ID for a newly created metadata document\n // Cannot rely on generated metadata._id from useTranslationMetadata\n // As the document store might not have returned it before creating another translation\n const metadataId = useMemo(() => {\n if (loading) {\n return null\n }\n\n // Once created, these two values should be the same anyway\n return metadata?._id ?? uuid()\n }, [loading, metadata?._id])\n\n // Duplicate a new language version from the most recent version of this document\n // When a release is selected, the version document is the source, so documents\n // that only exist in that release can still be translated\n const {selectedReleaseId} = usePerspective()\n const {draft, published, version} = useEditState(\n documentId,\n schemaType.name,\n 'default',\n selectedReleaseId,\n )\n const source = version || draft || published\n\n // Check for data issues\n const documentIsInOneMetadataDocument = useMemo(() => {\n return Array.isArray(data) && data.length <= 1\n }, [data])\n const rawLanguageValue = source?.[languageField]\n const sourceLanguageId = typeof rawLanguageValue === 'string' ? rawLanguageValue : undefined\n const sourceLanguageIsValid = supportedLanguages.some((l) => l.id === sourceLanguageId)\n const allLanguagesAreValid = useMemo(() => {\n const valid = supportedLanguages.every((l) => l.id && l.title)\n if (!valid) {\n console.warn(\n `Not all languages are valid. It should be an array of objects with an \"id\" and \"title\" property. Or a function that returns an array of objects with an \"id\" and \"title\" property.`,\n supportedLanguages,\n )\n }\n\n return valid\n }, [supportedLanguages])\n\n const content = (\n <Box padding={1}>\n {error ? (\n <Card tone=\"critical\" padding={1}>\n <Text>There was an error returning translations metadata</Text>\n </Card>\n ) : (\n <Stack gap={1}>\n <LanguageManage\n id={metadata?._id}\n documentId={documentId}\n metadataId={metadataId}\n schemaType={schemaType}\n sourceLanguageId={sourceLanguageId}\n />\n {supportedLanguages.length > 4 ? (\n <TextInput onChange={handleQuery} value={query} placeholder=\"Filter languages\" />\n ) : null}\n {supportedLanguages.length > 0 ? (\n <>\n {/* Once metadata is loaded, there may be issues */}\n {loading ? null : (\n <>\n {/* Not all languages are valid */}\n {data && documentIsInOneMetadataDocument ? null : (\n <Warning>\n {/* TODO: Surface these documents to the user */}\n This document has been found in more than one Translations Metadata document\n </Warning>\n )}\n {/* Not all languages are valid */}\n {allLanguagesAreValid ? null : (\n <Warning>Not all language objects are valid. See the console.</Warning>\n )}\n {/* Current document has no language field */}\n {sourceLanguageId ? null : (\n <Warning>\n Choose a language to apply to <strong>this Document</strong>\n </Warning>\n )}\n {/* Current document has an invalid language field */}\n {sourceLanguageId && !sourceLanguageIsValid ? (\n <Warning>\n Select a supported language. Current language value:{' '}\n <code>{sourceLanguageId}</code>\n </Warning>\n ) : null}\n </>\n )}\n {supportedLanguages\n .filter((language) => {\n if (query) {\n return language.title.toLowerCase().includes(query.toLowerCase())\n }\n return true\n })\n .map((language) =>\n !loading && sourceLanguageId && sourceLanguageIsValid ? (\n // Button to duplicate this document to a new translation\n // And either create or update the metadata document\n <LanguageOption\n key={language.id}\n language={language}\n schemaType={schemaType}\n documentId={documentId}\n disabled={!allLanguagesAreValid}\n current={language.id === sourceLanguageId}\n metadata={metadata}\n metadataId={metadataId}\n source={source}\n sourceLanguageId={sourceLanguageId}\n />\n ) : (\n // Button to set a language field on *this* document\n <LanguagePatch\n key={language.id}\n source={source}\n language={language}\n // Only allow language patch change to:\n // - Keys not in metadata\n // - The key of this document in the metadata\n disabled={\n (loading ||\n !allLanguagesAreValid ||\n metadata?.translations\n .filter((t) => t?.value?._ref !== documentId)\n .some((t) => t[LANGUAGE_FIELD_NAME] === language.id)) ??\n false\n }\n />\n ),\n )}\n </>\n ) : null}\n </Stack>\n )}\n </Box>\n )\n\n const issueWithTranslations = !loading && sourceLanguageId && !sourceLanguageIsValid\n\n if (!documentId) {\n return null\n }\n\n if (!schemaType || !schemaType.name) {\n return null\n }\n\n return (\n <Popover\n animate\n constrainSize\n content={content}\n open={open}\n portal\n ref={popoverRef}\n overflow=\"auto\"\n tone=\"default\"\n >\n <Button\n text=\"Translations\"\n mode=\"bleed\"\n disabled={!source}\n tone={!source || loading || !issueWithTranslations ? undefined : `caution`}\n icon={TranslateIcon}\n onClick={handleClick}\n ref={buttonRef}\n selected={open}\n data-testid=\"document-internationalization-menu\"\n />\n </Popover>\n )\n}\n","import {TrashIcon} from '@sanity/icons/Trash'\nimport {useToast} from '@sanity/ui/toast'\nimport {useCallback, useMemo, useState} from 'react'\nimport {\n type DocumentActionDescription,\n type DocumentActionProps,\n type KeyedObject,\n type Reference,\n type TypedObject,\n useClient,\n} from 'sanity'\n\nimport {API_VERSION, TRANSLATIONS_ARRAY_NAME} from '../constants'\n\ntype TranslationReference = TypedObject &\n KeyedObject & {\n value: Reference\n }\n\n/**\n * Document action that deletes a translation metadata document along with all\n * its referenced translation documents. Opens a confirmation dialog showing\n * how many translations will be deleted. Executes a single transaction that\n * unsets the translations array, deletes each referenced document (both\n * published and draft), and finally deletes the metadata document itself.\n */\nexport const useDeleteMetadataAction = (props: DocumentActionProps): DocumentActionDescription => {\n const {id: documentId, published, draft} = props\n const doc = draft || published\n\n const [isDialogOpen, setDialogOpen] = useState(false)\n const onClose = useCallback(() => setDialogOpen(false), [])\n const translations: TranslationReference[] = useMemo(\n () =>\n doc && Array.isArray(doc[TRANSLATIONS_ARRAY_NAME])\n ? // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion\n (doc[TRANSLATIONS_ARRAY_NAME] as TranslationReference[])\n : [],\n [doc],\n )\n\n const toast = useToast()\n const client = useClient({apiVersion: API_VERSION})\n\n // Remove translation reference and delete document in one transaction\n const onProceed = useCallback(() => {\n const tx = client.transaction()\n\n tx.patch(documentId, (patch) => patch.unset([TRANSLATIONS_ARRAY_NAME]))\n\n if (translations.length > 0) {\n translations.forEach((translation) => {\n tx.delete(translation.value._ref)\n tx.delete(`drafts.${translation.value._ref}`)\n })\n }\n\n tx.delete(documentId)\n // Shouldn't exist as this document type is in liveEdit\n tx.delete(`drafts.${documentId}`)\n\n tx.commit()\n .then(() => {\n onClose()\n\n toast.push({\n status: 'success',\n title: 'Deleted document and translations',\n })\n return undefined\n })\n .catch((err: Error) => {\n toast.push({\n status: 'error',\n title: 'Failed to delete document and translations',\n description: err.message,\n })\n })\n }, [client, translations, documentId, onClose, toast])\n\n return {\n label: `Delete all translations`,\n disabled: !doc || !translations.length,\n icon: TrashIcon,\n tone: 'critical',\n onHandle: () => {\n setDialogOpen(true)\n },\n dialog: isDialogOpen && {\n type: 'confirm',\n onCancel: onClose,\n onConfirm: () => {\n onProceed()\n onClose()\n },\n tone: 'critical',\n message:\n translations.length === 1\n ? `Delete 1 translation and this document`\n : `Delete all ${translations.length} translations and this document`,\n },\n }\n}\n","import type {DocumentBadgeDescription, DocumentBadgeProps} from 'sanity'\n\nimport {useDocumentInternationalizationContext} from '../components/DocumentInternationalizationContext'\n\n/**\n * Document badge that displays the language identifier of a document.\n * Reads the configured `languageField` from the version, draft or published\n * document, looks up the matching language in `supportedLanguages` to resolve\n * the title, and returns a badge descriptor with `primary` color. Returns\n * `null` when no document exists or the language field is empty/non-string.\n */\nexport function LanguageBadge(props: DocumentBadgeProps): DocumentBadgeDescription | null {\n const source = props?.version || props?.draft || props?.published\n const {languageField, supportedLanguages} = useDocumentInternationalizationContext()\n const languageId = source?.[languageField]\n\n if (!languageId || typeof languageId !== 'string') {\n return null\n }\n\n const language = Array.isArray(supportedLanguages)\n ? supportedLanguages.find((l) => l.id === languageId)\n : null\n\n // Currently we only show the language id if the supportedLanguages are async\n return {\n label: language?.id ?? languageId,\n title: language?.title ?? undefined,\n color: `primary`,\n }\n}\n","import {Card, Spinner} from '@sanity/ui'\nimport {useEffect, useMemo} from 'react'\nimport {Preview, useEditState, useSchema, useValidationStatus} from 'sanity'\n\ntype DocumentCheckProps = {\n id: string\n onCheckComplete: (id: string) => void\n addInvalidId: (id: string) => void\n removeInvalidId: (id: string) => void\n addDraftId: (id: string) => void\n removeDraftId: (id: string) => void\n}\n\n// Check if the document has a draft\n// Check if that draft is valid\n// Report back to parent that it can be added to bulk publish\nexport default function DocumentCheck(props: DocumentCheckProps) {\n const {id, onCheckComplete, addInvalidId, removeInvalidId, addDraftId, removeDraftId} = props\n // Use empty string for type initially - we get the actual type from the loaded document\n const editState = useEditState(id, '')\n const documentType = editState.draft?._type ?? editState.published?._type ?? ''\n // oxlint-disable-next-line no-useless-default-assignment\n const {isValidating, validation = []} = useValidationStatus(id, documentType, false)\n const schema = useSchema()\n\n const validationHasErrors = useMemo(() => {\n return !isValidating && validation.some((item) => item.level === 'error')\n }, [isValidating, validation])\n\n useEffect(() => {\n if (validationHasErrors) {\n addInvalidId(id)\n } else {\n removeInvalidId(id)\n }\n\n if (editState.draft) {\n addDraftId(id)\n } else {\n removeDraftId(id)\n }\n\n if (!isValidating) {\n onCheckComplete(id)\n }\n }, [\n addDraftId,\n addInvalidId,\n editState.draft,\n id,\n isValidating,\n onCheckComplete,\n removeDraftId,\n removeInvalidId,\n validationHasErrors,\n ])\n\n // We only care about drafts\n if (!editState.draft) {\n return null\n }\n\n const schemaType = schema.get(editState.draft._type)\n\n return (\n <Card border padding={2} tone={validationHasErrors ? `critical` : `positive`}>\n {editState.draft && schemaType ? (\n <Preview layout=\"default\" value={editState.draft} schemaType={schemaType} />\n ) : (\n <Spinner />\n )}\n </Card>\n )\n}\n","import {Box, type ButtonTone, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport type {ComponentType, PropsWithChildren} from 'react'\nimport {TextWithTone} from 'sanity'\n\ntype InfoIconProps = PropsWithChildren & {\n icon: ComponentType\n tone: ButtonTone\n text?: string\n}\n\nexport default function InfoIcon(props: InfoIconProps) {\n const {text, icon, tone, children} = props\n const Icon = icon\n\n return (\n <Tooltip\n animate\n portal\n content={\n children ? (\n <>{children}</>\n ) : (\n <Box padding={2}>\n <Text size={1}>{text}</Text>\n </Box>\n )\n }\n >\n <TextWithTone tone={tone} size={1}>\n <Icon />\n </TextWithTone>\n </Tooltip>\n )\n}\n","import {InfoOutlineIcon} from '@sanity/icons/InfoOutline'\nimport {Box, Stack, Text} from '@sanity/ui'\n\nimport InfoIcon from './InfoIcon'\n\nexport default function Info() {\n return (\n <InfoIcon icon={InfoOutlineIcon} tone=\"primary\">\n <Stack padding={3} gap={4} style={{maxWidth: 250}}>\n <Box>\n <Text size={1}>Bulk publishing uses the Scheduling API.</Text>\n </Box>\n <Box>\n <Text size={1}>\n Customized Document Actions in the Studio will not execute. Webhooks will execute.\n </Text>\n </Box>\n <Box>\n <Text size={1}>\n Validation is checked before rendering the button below, but the Scheduling API will not\n check for – or enforce – validation.\n </Text>\n </Box>\n </Stack>\n </InfoIcon>\n )\n}\n","import {Button, Card, Dialog, Inline, Stack, Text} from '@sanity/ui'\nimport {useToast} from '@sanity/ui/toast'\nimport {useCallback, useState} from 'react'\nimport {TextWithTone, useClient, useWorkspace} from 'sanity'\n\nimport {API_VERSION} from '../../constants'\nimport type {TranslationReference} from '../../types'\nimport DocumentCheck from './DocumentCheck'\nimport Info from './Info'\n\nexport type BulkPublishProps = {\n translations: TranslationReference[]\n}\n\n// A root-level component with UI for hitting the Publishing API\nexport default function BulkPublish(props: BulkPublishProps) {\n const {translations} = props\n const client = useClient({apiVersion: API_VERSION})\n const {projectId, dataset} = useWorkspace()\n const toast = useToast()\n const [invalidIds, setInvalidIds] = useState<string[] | null>(null)\n const [checkedIds, setCheckedIds] = useState<string[]>([])\n\n const onCheckComplete = useCallback((id: string) => {\n setCheckedIds((ids) => Array.from(new Set([...ids, id])))\n }, [])\n\n // Handle dialog\n const [open, setOpen] = useState(false)\n const onOpen = useCallback(() => setOpen(true), [])\n const onClose = useCallback(() => setOpen(false), [])\n\n const addInvalidId = useCallback((id: string) => {\n setInvalidIds((ids) => (ids ? Array.from(new Set([...ids, id])) : [id]))\n }, [])\n\n const removeInvalidId = useCallback((id: string) => {\n setInvalidIds((ids) => (ids ? ids.filter((i) => i !== id) : []))\n }, [])\n\n const [draftIds, setDraftIds] = useState<string[]>([])\n\n const addDraftId = useCallback((id: string) => {\n setDraftIds((ids) => Array.from(new Set([...ids, id])))\n }, [])\n\n const removeDraftId = useCallback((id: string) => {\n setDraftIds((ids) => ids.filter((i) => i !== id))\n }, [])\n\n const handleBulkPublish = useCallback(() => {\n const body = translations.map((translation) => ({\n documentId: translation.value._ref,\n }))\n client\n .request({\n url: `/publish/${projectId}/${dataset}`,\n method: 'POST',\n body,\n })\n .then(() => {\n toast.push({\n status: 'success',\n title: 'Success',\n description: 'Bulk publish complete',\n })\n return undefined\n })\n .catch((err: Error) => {\n console.error(err)\n toast.push({\n status: 'error',\n title: 'Error',\n description: 'Bulk publish failed',\n })\n })\n }, [translations, client, projectId, dataset, toast])\n\n const disabled =\n // Not all documents have been checked\n checkedIds.length !== translations.length ||\n // Some document(s) are invalid\n Boolean(invalidIds && invalidIds?.length > 0) ||\n // No documents are drafts\n !draftIds.length\n\n return translations?.length > 0 ? (\n <Card padding={4} border radius={2}>\n <Stack gap={3}>\n <Inline gap={3}>\n <Text weight=\"bold\" size={1}>\n Bulk publishing\n </Text>\n <Info />\n </Inline>\n\n <Stack>\n <Button onClick={onOpen} text=\"Prepare bulk publishing\" mode=\"ghost\" />\n </Stack>\n\n {open && (\n <Dialog\n animate\n header=\"Bulk publishing\"\n id=\"bulk-publish-dialog\"\n onClose={onClose}\n zOffset={1000}\n width={3}\n >\n <Stack gap={4} padding={4}>\n {draftIds.length > 0 ? (\n <Stack gap={2}>\n <Text size={1}>\n There{' '}\n {draftIds.length === 1\n ? `is 1 draft document`\n : `are ${draftIds.length} draft documents`}\n .\n </Text>\n {invalidIds && invalidIds.length > 0 ? (\n <TextWithTone tone=\"critical\" size={1}>\n {invalidIds.length === 1\n ? `1 draft document has`\n : `${invalidIds.length} draft documents have`}{' '}\n validation issues that must be addressed first\n </TextWithTone>\n ) : (\n <TextWithTone tone=\"positive\" size={1}>\n All drafts are valid and can be bulk published\n </TextWithTone>\n )}\n </Stack>\n ) : null}\n\n <Stack gap={1}>\n {translations\n .filter((translation) => translation?.value?._ref)\n .map((translation) => (\n <DocumentCheck\n key={translation._key}\n id={translation.value._ref}\n onCheckComplete={onCheckComplete}\n addInvalidId={addInvalidId}\n removeInvalidId={removeInvalidId}\n addDraftId={addDraftId}\n removeDraftId={removeDraftId}\n />\n ))}\n </Stack>\n {draftIds.length > 0 ? (\n <Button\n mode=\"ghost\"\n tone={invalidIds && invalidIds?.length > 0 ? 'caution' : 'positive'}\n text={\n draftIds.length === 1\n ? `Publish draft document`\n : `Bulk publish ${draftIds.length} draft documents`\n }\n onClick={handleBulkPublish}\n disabled={disabled}\n />\n ) : (\n <Text muted size={1}>\n No draft documents to publish\n </Text>\n )}\n </Stack>\n </Dialog>\n )}\n </Stack>\n </Card>\n ) : null\n}\n","import {useEffect} from 'react'\nimport {PatchEvent, unset, useUnstableObserveDocument} from 'sanity'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport type {TranslationReference} from '../../types'\n\ntype ReferencePatcherProps = {\n translation: TranslationReference\n}\n\n// For every reference, check if it is published, and if so, strengthen the reference\nexport default function ReferencePatcher(props: ReferencePatcherProps) {\n const {translation} = props\n const {document: publishedDocument, loading} = useUnstableObserveDocument(translation.value._ref)\n const {onChange, ready, formState} = useDocumentPane()\n\n useEffect(() => {\n if (\n // We have a reference\n translation.value._ref &&\n // It's still weak and not-yet-strengthened\n translation.value._weak &&\n // We also want to keep this check because maybe the user *configured* weak refs\n translation.value._strengthenOnPublish &&\n !loading &&\n publishedDocument &&\n // The metadata pane is ready to accept patches\n ready &&\n !formState?.readOnly\n ) {\n const referencePathBase = ['translations', {_key: translation._key}, 'value']\n\n onChange(\n new PatchEvent([\n unset([...referencePathBase, '_weak']),\n unset([...referencePathBase, '_strengthenOnPublish']),\n ]),\n )\n }\n }, [\n formState?.readOnly,\n loading,\n onChange,\n publishedDocument,\n ready,\n translation._key,\n translation.value._ref,\n translation.value._strengthenOnPublish,\n translation.value._weak,\n ])\n\n return null\n}\n","import type {TranslationReference} from '../../types'\nimport ReferencePatcher from './ReferencePatcher'\n\ntype OptimisticallyStrengthenProps = {\n translations: TranslationReference[]\n}\n\n// There's no good reason to leave published references as weak\n// So this component will run on every render and strengthen them\nexport default function OptimisticallyStrengthen(props: OptimisticallyStrengthenProps) {\n // oxlint-disable-next-line no-useless-default-assignment\n const {translations = []} = props\n\n if (!translations.length) {\n return null\n }\n\n return (\n <>\n {translations.map((translation) =>\n translation.value._strengthenOnPublish?.type ? (\n <ReferencePatcher key={translation._key} translation={translation} />\n ) : null,\n )}\n </>\n )\n}\n","import {TranslateIcon} from '@sanity/icons/Translate'\nimport {defineField, defineType, type DocumentDefinition, type FieldDefinition} from 'sanity'\nimport {LANGUAGE_FIELD_NAME} from 'sanity-plugin-internationalized-array'\n\nimport {METADATA_SCHEMA_NAME, TRANSLATIONS_ARRAY_NAME} from '../../constants'\nimport type {TranslationReference} from '../../types'\n\n/**\n * Creates the `translation.metadata` document schema definition. This schema\n * type stores the array of translation references linking all language versions\n * of a document together, along with the allowed schema types and any custom\n * metadata fields provided by the plugin consumer. The document uses `liveEdit`\n * so changes are published immediately without drafts.\n */\nexport default (\n schemaTypes: string[],\n metadataFields: FieldDefinition[],\n omnisearchVisibility = true,\n): DocumentDefinition =>\n defineType({\n type: 'document',\n name: METADATA_SCHEMA_NAME,\n title: 'Translation metadata',\n icon: TranslateIcon,\n liveEdit: true,\n __experimental_omnisearch_visibility: omnisearchVisibility,\n fields: [\n defineField({\n name: TRANSLATIONS_ARRAY_NAME,\n type: 'internationalizedArrayReference',\n }),\n defineField({\n name: 'schemaTypes',\n description:\n 'Optional: Used to filter the reference fields above so all translations share the same types.',\n type: 'array',\n of: [{type: 'string'}],\n options: {list: schemaTypes},\n readOnly: ({value}) => Boolean(value),\n }),\n ...metadataFields,\n ],\n preview: {\n select: {\n translations: TRANSLATIONS_ARRAY_NAME,\n documentSchemaTypes: 'schemaTypes',\n },\n prepare(selection) {\n const {translations = [], documentSchemaTypes = []} = selection\n const title =\n translations.length === 1 ? `1 Translation` : `${translations.length} Translations`\n const languageKeys = translations.length\n ? translations\n .map((t: TranslationReference) => t[LANGUAGE_FIELD_NAME].toUpperCase())\n .join(', ')\n : ``\n const subtitle = [\n languageKeys ? `(${languageKeys})` : null,\n documentSchemaTypes?.length ? documentSchemaTypes.map((s: string) => s).join(`, `) : ``,\n ]\n .filter(Boolean)\n .join(` `)\n\n return {\n title,\n subtitle,\n }\n },\n },\n })\n","import {Stack} from '@sanity/ui'\nimport {defineField, definePlugin, isSanityDocument} from 'sanity'\nimport {internationalizedArray, LANGUAGE_FIELD_NAME} from 'sanity-plugin-internationalized-array'\n\nimport {useDeleteMetadataAction} from './actions/DeleteMetadataAction'\nimport {LanguageBadge} from './badges'\nimport BulkPublish from './components/BulkPublish'\nimport {DocumentInternationalizationProvider} from './components/DocumentInternationalizationContext'\nimport {DocumentInternationalizationMenu} from './components/DocumentInternationalizationMenu'\nimport OptimisticallyStrengthen from './components/OptimisticallyStrengthen'\nimport {API_VERSION, DEFAULT_CONFIG, METADATA_SCHEMA_NAME} from './constants'\nimport {documentInternationalizationUsEnglishLocaleBundle} from './i18n'\nimport metadata from './schema/translation/metadata'\nimport type {PluginConfig, TranslationReference} from './types'\n\nexport const documentInternationalization = definePlugin<PluginConfig>((config) => {\n const pluginConfig = {...DEFAULT_CONFIG, ...config}\n const {\n supportedLanguages,\n schemaTypes,\n languageField,\n bulkPublish,\n metadataFields,\n hideLanguageFilter,\n metadataOmnisearchVisibility,\n metadataInternationalization,\n addTemplates,\n } = pluginConfig\n\n if (schemaTypes.length === 0) {\n throw new Error(\n 'You must specify at least one schema type on which to enable document internationalization. Update the `schemaTypes` option in the documentInternationalization() configuration.',\n )\n }\n\n return {\n name: '@sanity/document-internationalization',\n\n studio: {\n components: {\n layout: (props) => (\n <DocumentInternationalizationProvider {...props} pluginConfig={pluginConfig} />\n ),\n },\n },\n\n i18n: {\n bundles: [documentInternationalizationUsEnglishLocaleBundle],\n },\n\n // Adds:\n // - A bulk-publishing UI component to the form\n // - Will only work for projects on a compatible plan\n form: {\n components: {\n input: (props) => {\n if (\n props.id === 'root' &&\n props.schemaType.name === METADATA_SCHEMA_NAME &&\n isSanityDocument(props?.value)\n ) {\n const translations =\n // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion\n (props?.value?.['translations'] as TranslationReference[]) ?? []\n const weakAndTypedTranslations = translations.filter(\n ({value}) => value?._weak && value._strengthenOnPublish,\n )\n\n return (\n <Stack gap={5}>\n {bulkPublish ? <BulkPublish translations={translations} /> : null}\n {weakAndTypedTranslations.length > 0 ? (\n <OptimisticallyStrengthen translations={weakAndTypedTranslations} />\n ) : null}\n {props.renderDefault(props)}\n </Stack>\n )\n }\n\n return props.renderDefault(props)\n },\n },\n },\n\n // Adds:\n // - The `Translations` dropdown to the editing form\n // - `Badges` to documents with a language value\n // - The `DeleteMetadataAction` action to the metadata document type\n document: {\n unstable_languageFilter: (prev, ctx) => {\n const {schemaType, documentId} = ctx\n\n if (typeof hideLanguageFilter === 'function') {\n if (hideLanguageFilter(ctx)) return prev\n } else if (Array.isArray(hideLanguageFilter)) {\n if (hideLanguageFilter.includes(schemaType)) return prev\n } else if (hideLanguageFilter) {\n return prev\n }\n\n return schemaTypes.includes(schemaType) && documentId\n ? [...prev, (props) => DocumentInternationalizationMenu({...props, documentId})]\n : prev\n },\n badges: (prev, {schemaType}) => {\n if (!schemaTypes.includes(schemaType)) {\n return prev\n }\n\n return [(props) => LanguageBadge(props), ...prev]\n },\n actions: (prev, {schemaType}) => {\n if (schemaType === METADATA_SCHEMA_NAME) {\n return [...prev, useDeleteMetadataAction]\n }\n\n return prev\n },\n },\n\n // Adds:\n // - The `Translations metadata` document type to the schema\n schema: {\n // Create the metadata document type\n types: [metadata(schemaTypes, metadataFields, metadataOmnisearchVisibility)],\n\n // For every schema type this plugin is enabled on\n // Create an initial value template to set the language\n templates: (prev, {schema}) => {\n if (!addTemplates) {\n return prev\n }\n\n // Templates are not setup for async languages\n if (!Array.isArray(supportedLanguages)) {\n return prev\n }\n\n const parameterizedTemplates = schemaTypes.map((schemaType) => ({\n id: `${schemaType}-parameterized`,\n title: `${schema?.get(schemaType)?.title ?? schemaType}: with Language`,\n schemaType,\n parameters: [{name: `languageId`, title: `Language ID`, type: `string`}],\n value: ({languageId}: {languageId: string}) => ({\n [languageField]: languageId,\n }),\n }))\n\n const staticTemplates = schemaTypes.flatMap((schemaType) => {\n return supportedLanguages.map((language) => ({\n id: `${schemaType}-${language.id}`,\n title: `${language.title} ${schema?.get(schemaType)?.title ?? schemaType}`,\n schemaType,\n value: {\n [languageField]: language.id,\n },\n }))\n })\n\n return [...prev, ...parameterizedTemplates, ...staticTemplates]\n },\n },\n\n // Uses:\n // - `sanity-plugin-internationalized-array` to maintain the translations array\n plugins: [\n // Translation metadata stores its references using this plugin\n // It cuts down on attribute usage and gives UI conveniences to add new translations\n internationalizedArray({\n ...metadataInternationalization,\n apiVersion: pluginConfig.apiVersion,\n languages: supportedLanguages,\n includeForDocumentType: (documentType) => documentType === METADATA_SCHEMA_NAME,\n fieldTypes: [\n defineField(\n {\n name: 'reference',\n type: 'reference',\n to: schemaTypes.map((type) => ({type})),\n weak: pluginConfig.weakReferences,\n // Reference filters don't actually enforce validation!\n validation: (Rule) =>\n // @ts-expect-error - fix typings\n Rule.custom(async (item: TranslationReference, context) => {\n if (!item?.value?._ref || !item?.[LANGUAGE_FIELD_NAME]) {\n return true\n }\n\n const client = context.getClient({apiVersion: API_VERSION})\n const valueLanguage = await client.fetch(\n `*[_id in [$ref, $draftRef]][0].${languageField}`,\n {\n ref: item.value._ref,\n draftRef: `drafts.${item.value._ref}`,\n },\n )\n\n if (valueLanguage && valueLanguage === item[LANGUAGE_FIELD_NAME]) {\n return true\n }\n\n return `Referenced document does not have the correct language value`\n }),\n options: {\n // @ts-expect-error - Update type once it knows the values of this filter\n filter: ({parent, document}) => {\n if (!parent) return null\n\n // I'm not sure in what instance there's an array of parents\n // But the Type suggests it's possible\n const parentArray = Array.isArray(parent) ? parent : [parent]\n const language = parentArray.find((p) => p[LANGUAGE_FIELD_NAME])\n\n if (!language?.[LANGUAGE_FIELD_NAME]) return null\n\n if (document['schemaTypes']) {\n return {\n filter: `_type in $schemaTypes && ${languageField} == $language`,\n params: {\n schemaTypes: document['schemaTypes'],\n language: language[LANGUAGE_FIELD_NAME],\n },\n }\n }\n\n return {\n filter: `${languageField} == $language`,\n params: {language: language[LANGUAGE_FIELD_NAME]},\n }\n },\n },\n },\n {strict: false},\n ),\n ],\n }),\n ],\n }\n})\n"],"mappings":"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"}
\ No newline at end of file