@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":"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"}
\ 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