@sanity/cross-dataset-duplicator 2.0.0 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -9
- package/dist/index.js.map +1 -1
- package/package.json +9 -9
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { DocumentActionProps, SanityDocument } from "sanity";
|
|
2
|
+
import { LaunchIcon } from "@sanity/icons/Launch";
|
|
2
3
|
type PreDefinedQuery = {
|
|
3
4
|
label: string;
|
|
4
5
|
query: string;
|
|
@@ -44,7 +45,7 @@ declare const DuplicateToAction: {
|
|
|
44
45
|
onClose: () => void;
|
|
45
46
|
} | null;
|
|
46
47
|
onHandle: () => void;
|
|
47
|
-
icon:
|
|
48
|
+
icon: typeof LaunchIcon;
|
|
48
49
|
};
|
|
49
50
|
action: string;
|
|
50
51
|
};
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/types/index.ts","../src/plugin.tsx","../src/actions/DuplicateToAction.tsx","../src/context/ConfigProvider.tsx","../src/components/CrossDatasetDuplicatorAction.tsx"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/types/index.ts","../src/plugin.tsx","../src/actions/DuplicateToAction.tsx","../src/context/ConfigProvider.tsx","../src/components/CrossDatasetDuplicatorAction.tsx"],"mappings":";;KAEK,eAAA;EACH,KAAA;EACA,KAAK;AAAA;;;AAAA;AAMP;UAAiB,YAAA;EACf,UAAA;EACA,IAAA;EACA,KAAA;EACA,MAAA;EACA,MAAA;EACA,OAAA,GAAU,eAAe;AAAA;;;;AAAA;KAOf,iCAAA;EACV,IAAA,EAAM,cAAA;EACN,YAAA,SAAqB,OAAO;AAAA;;;AAzBY;;cCY7B,sBAAA,mBAAsB,MAAA,QAAA,OAAA,CAAA,YAAA;;ADZO;;;cEU7B,iBAAA;EAAA,QAA4B,mBAAA;;;;;;;;;;;iBAAA,UAAA;EAAA;;;;;AFNlC;AAMP;iBGIgB,+BAAA,IAA+B,QAAA,CAAA,YAAA;;;AHdL;;iBIO1B,4BAAA,CAA6B,KAAA,EAAO,iCAAiC,mBAAA,GAAA,CAAA,OAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
|
-
import { jsx, jsxs, Fragment
|
|
1
|
+
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { useClient, useSchema, useWorkspaces, Preview, definePlugin } from "sanity";
|
|
3
|
-
import {
|
|
4
|
-
import { createContext, useContext, useState, useEffectEvent, useEffect, Fragment } from "react";
|
|
3
|
+
import { LaunchIcon } from "@sanity/icons/Launch";
|
|
4
|
+
import { createContext, useContext, useState, useEffectEvent, useEffect, Fragment as Fragment$1 } from "react";
|
|
5
5
|
import { c } from "react/compiler-runtime";
|
|
6
6
|
import { useSecrets, SettingsView } from "@sanity/studio-secrets";
|
|
7
|
-
import { Card, Text, Button, Flex, Badge, Tooltip, Box, useTheme, Select, Stack, Checkbox, Spinner, Container,
|
|
7
|
+
import { Card, Text, Button, Flex, Badge, Tooltip, Box, useTheme, Select, Stack, Label, Checkbox, Spinner, Container, Grid, TextInput } from "@sanity/ui";
|
|
8
8
|
import { isAssetId, isSanityFileAsset } from "@sanity/asset-utils";
|
|
9
|
+
import { ArrowRightIcon } from "@sanity/icons/ArrowRight";
|
|
10
|
+
import { SearchIcon } from "@sanity/icons/Search";
|
|
9
11
|
import { extractWithPath } from "@sanity/mutator";
|
|
10
12
|
import { getTheme_v2 } from "@sanity/ui/theme";
|
|
11
13
|
import { dset } from "dset";
|
|
14
|
+
import { InfoOutlineIcon } from "@sanity/icons/InfoOutline";
|
|
12
15
|
const SECRET_NAMESPACE = "CrossDatasetDuplicator", DEFAULT_CONFIG = {
|
|
13
16
|
apiVersion: "2025-02-19",
|
|
14
17
|
tool: !0,
|
|
@@ -208,7 +211,7 @@ function StatusBadge(props) {
|
|
|
208
211
|
const badgeTone = isAsset ? assetTones[status] : documentTones[status];
|
|
209
212
|
if (!badgeTone) {
|
|
210
213
|
let t02;
|
|
211
|
-
return $[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t02 = /* @__PURE__ */ jsx(Badge, {
|
|
214
|
+
return $[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t02 = /* @__PURE__ */ jsx(Badge, { padding: 2, fontSize: 1, children: "Checking..." }), $[0] = t02) : t02 = $[0], t02;
|
|
212
215
|
}
|
|
213
216
|
const badgeText = isAsset ? assetMessages[status] : documentMessages[status], badgeStatus = isAsset ? assetStatus[status] : status;
|
|
214
217
|
let t0;
|
|
@@ -222,7 +225,7 @@ function StatusBadge(props) {
|
|
|
222
225
|
let t3;
|
|
223
226
|
$[5] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t3 = /* @__PURE__ */ jsx(Box, { marginLeft: 2, display: "inline-block", as: "span", children: /* @__PURE__ */ jsx(InfoOutlineIcon, {}) }), $[5] = t3) : t3 = $[5];
|
|
224
227
|
let t4;
|
|
225
|
-
$[6] !== badgeStatus || $[7] !== badgeTone ? (t4 = /* @__PURE__ */ jsxs(Badge, {
|
|
228
|
+
$[6] !== badgeStatus || $[7] !== badgeTone ? (t4 = /* @__PURE__ */ jsxs(Badge, { padding: 3, fontSize: 1, tone: badgeTone, children: [
|
|
226
229
|
badgeStatus,
|
|
227
230
|
t3
|
|
228
231
|
] }), $[6] = badgeStatus, $[7] = badgeTone, $[8] = t4) : t4 = $[8];
|
|
@@ -501,7 +504,7 @@ function Duplicator(props) {
|
|
|
501
504
|
boxSizing: "border-box"
|
|
502
505
|
}, padding: 1, tone: "positive" }) }), $[72] = isDuplicating, $[73] = progress, $[74] = t28) : t28 = $[74];
|
|
503
506
|
let t29;
|
|
504
|
-
$[75] !== headingText || $[76] !== payload || $[77] !== setPayload ? (t29 = payload.length > 0 && /* @__PURE__ */ jsxs(Fragment
|
|
507
|
+
$[75] !== headingText || $[76] !== payload || $[77] !== setPayload ? (t29 = payload.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
505
508
|
/* @__PURE__ */ jsx(Label, { children: headingText }),
|
|
506
509
|
/* @__PURE__ */ jsx(SelectButtons, { payload, setPayload })
|
|
507
510
|
] }), $[75] = headingText, $[76] = payload, $[77] = setPayload, $[78] = t29) : t29 = $[78];
|
|
@@ -515,7 +518,7 @@ function Duplicator(props) {
|
|
|
515
518
|
status: status_0,
|
|
516
519
|
hasDraft
|
|
517
520
|
} = t322, schemaType = schema.get(doc_10._type);
|
|
518
|
-
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
521
|
+
return /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
519
522
|
/* @__PURE__ */ jsxs(Flex, { align: "center", children: [
|
|
520
523
|
/* @__PURE__ */ jsx(Checkbox, { checked: include_0, onChange: () => handleCheckbox(doc_10._id) }),
|
|
521
524
|
/* @__PURE__ */ jsx(Box, { flex: 1, paddingX: 3, children: schemaType ? /* @__PURE__ */ jsx(Preview, { value: doc_10, schemaType }) : /* @__PURE__ */ jsx(Card, { tone: "caution", children: "Invalid schema type" }) }),
|
|
@@ -777,7 +780,7 @@ function CrossDatasetDuplicator(props) {
|
|
|
777
780
|
let t1;
|
|
778
781
|
$[5] !== pluginConfig.apiVersion ? (t1 = /* @__PURE__ */ jsx(ResetSecret, { apiVersion: pluginConfig.apiVersion }), $[5] = pluginConfig.apiVersion, $[6] = t1) : t1 = $[6];
|
|
779
782
|
let t2;
|
|
780
|
-
return $[7] !== t02 || $[8] !== t1 ? (t2 = /* @__PURE__ */ jsxs(Fragment
|
|
783
|
+
return $[7] !== t02 || $[8] !== t1 ? (t2 = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
781
784
|
t02,
|
|
782
785
|
t1
|
|
783
786
|
] }), $[7] = t02, $[8] = t1, $[9] = t2) : t2 = $[9], t2;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/helpers/constants.ts","../src/context/ConfigProvider.tsx","../src/helpers/index.ts","../src/helpers/getDocumentsInArray.ts","../src/components/Feedback.tsx","../src/components/SelectButtons.tsx","../src/components/StatusBadge.tsx","../src/components/Duplicator.tsx","../src/components/DuplicatorQuery.tsx","../src/components/DuplicatorWrapper.tsx","../src/components/ResetSecret.tsx","../src/components/CrossDatasetDuplicator.tsx","../src/components/CrossDatasetDuplicatorAction.tsx","../src/actions/DuplicateToAction.tsx","../src/components/CrossDatasetDuplicatorTool.tsx","../src/tool/index.ts","../src/plugin.tsx"],"sourcesContent":["import type {PluginConfig} from '../types'\n\nexport const SECRET_NAMESPACE = `CrossDatasetDuplicator`\n\nexport const DEFAULT_CONFIG: Required<PluginConfig> = {\n apiVersion: '2025-02-19',\n tool: true,\n types: [],\n filter: '',\n follow: ['outbound'],\n queries: [],\n}\n","import {createContext, useContext} from 'react'\nimport type {LayoutProps} from 'sanity'\n\nimport {DEFAULT_CONFIG} from '../helpers/constants'\nimport type {PluginConfig} from '../types'\n\nconst CrossDatasetDuplicatorContext = createContext(DEFAULT_CONFIG)\n\ntype ConfigProviderProps = LayoutProps & {pluginConfig: Required<PluginConfig>}\n\n/**\n * Plugin config context hook from the Cross Dataset Duplicator plugin\n * @public\n */\nexport function useCrossDatasetDuplicatorConfig() {\n const pluginConfig = useContext(CrossDatasetDuplicatorContext)\n\n return pluginConfig\n}\n\nexport function ConfigProvider(props: ConfigProviderProps) {\n const {pluginConfig, ...rest} = props\n\n return (\n <CrossDatasetDuplicatorContext.Provider value={pluginConfig}>\n {props.renderDefault(rest)}\n </CrossDatasetDuplicatorContext.Provider>\n )\n}\n","import type {CSSProperties} from 'react'\n\nexport function createInitialMessage(docCount = 0, refsCount = 0): string {\n const message = [\n docCount === 1 ? `This Document contains` : `These ${docCount} Documents contain`,\n refsCount === 1 ? `1 Reference.` : `${refsCount} References.`,\n refsCount === 1 ? `That Document` : `Those Documents`,\n `may have References too. If referenced Documents do not exist at the target Destination, this transaction will fail.`,\n ]\n\n return message.join(` `)\n}\n\nexport const stickyStyles = (isDarkMode = true): CSSProperties => ({\n position: 'sticky',\n top: 0,\n zIndex: 100,\n backgroundColor: isDarkMode ? `rgba(10,10,10,0.95)` : `rgba(255,255,255,0.95)`,\n})\n","import {extractWithPath} from '@sanity/mutator'\nimport type {SanityClient, SanityDocument} from 'sanity'\n\nimport type {PluginConfig} from '../types'\n\ntype OptionsBag = {\n fetchIds: string[]\n client: SanityClient\n pluginConfig: PluginConfig\n currentIds?: Set<string> | null\n projection?: string\n}\n\n// Recursively fetch Documents from an array of _id's and their references\n// Heavy use of Set is to avoid recursively querying for id's already in the payload\nexport async function getDocumentsInArray(options: OptionsBag): Promise<SanityDocument[]> {\n const {fetchIds, client, pluginConfig, currentIds, projection} = options\n const collection: SanityDocument[] = []\n\n // Find initial docs\n const filter = ['_id in $fetchIds', pluginConfig.filter].filter(Boolean).join(' && ')\n const query = `*[${filter}]${projection ?? ``}`\n const data = await client.fetch<SanityDocument[]>(query, {\n fetchIds: fetchIds ?? [],\n })\n\n if (!data?.length) {\n return []\n }\n\n const localCurrentIds = currentIds ?? new Set<string>()\n\n // Find new ids in the returned data\n // Unless we started with an empty set, get the _ids from the data\n const newDataIds = new Set<string>(\n data\n .map((dataDoc) => dataDoc._id)\n .filter((id) => (currentIds?.size ? !localCurrentIds.has(id) : Boolean(id))),\n )\n\n if (newDataIds.size) {\n collection.push(...data)\n for (const id of newDataIds) {\n localCurrentIds.add(id)\n }\n\n // Check new data for more references\n await Promise.all(\n data.map(async (doc) => {\n const expr = `.._ref`\n const references = extractWithPath(expr, doc).flatMap((ref) =>\n typeof ref.value === 'string' ? [ref.value] : [],\n )\n\n if (references.length) {\n // Find references not already in the Collection\n const newReferenceIds = new Set<string>(\n references.filter((ref) => !localCurrentIds.has(ref)),\n )\n\n if (newReferenceIds.size) {\n // Recursive query for new documents\n const referenceDocs = await getDocumentsInArray({\n fetchIds: Array.from(newReferenceIds),\n currentIds: localCurrentIds,\n client,\n pluginConfig,\n })\n\n if (referenceDocs?.length) {\n collection.push(...referenceDocs)\n }\n }\n }\n }),\n )\n }\n\n // Create a unique array of documents, keeping the first occurrence of each _id\n const seenIds = new Set<string>()\n const uniqueCollection: SanityDocument[] = []\n\n for (const doc of collection) {\n if (doc && !seenIds.has(doc._id)) {\n seenIds.add(doc._id)\n uniqueCollection.push(doc)\n }\n }\n\n return uniqueCollection\n}\n","import {Card, Text} from '@sanity/ui'\nimport type {BadgeTone} from '@sanity/ui'\nimport type {ReactNode} from 'react'\n\ntype FeedbackProps = {\n children?: ReactNode\n tone?: BadgeTone\n}\n\nexport default function Feedback(props: FeedbackProps) {\n const {children, tone = 'caution'} = props\n\n return (\n <Card padding={3} radius={2} shadow={1} tone={tone}>\n <Text size={1}>{children}</Text>\n </Card>\n )\n}\n","import {isAssetId} from '@sanity/asset-utils'\nimport {Button, Card, Flex} from '@sanity/ui'\nimport {type Dispatch, type SetStateAction, useState} from 'react'\n\nimport type {PayloadItem} from './Duplicator'\n\ntype Action = 'ALL' | 'NONE' | 'NEW' | 'EXISTING' | 'OLDER' | 'ASSETS' | 'DOCUMENTS'\n\ntype ButtonItem = {label: string; action: Action} | {divider: string}\n\nconst buttons: ButtonItem[] = [\n {label: 'All', action: 'ALL'},\n {label: 'None', action: 'NONE'},\n {divider: 'divider-1'},\n {label: 'New', action: 'NEW'},\n {label: 'Existing', action: 'EXISTING'},\n {label: 'Older', action: 'OLDER'},\n {divider: 'divider-2'},\n {label: 'Documents', action: 'DOCUMENTS'},\n {label: 'Assets', action: 'ASSETS'},\n]\n\nfunction shouldInclude(item: PayloadItem, action: Action): boolean {\n switch (action) {\n case 'ALL':\n return true\n case 'NONE':\n return false\n case 'NEW':\n return item.status === 'CREATE'\n case 'EXISTING':\n return item.status === 'EXISTS'\n case 'OLDER':\n return item.status === 'OVERWRITE'\n case 'ASSETS':\n return isAssetId(item.doc._id)\n case 'DOCUMENTS':\n return !isAssetId(item.doc._id)\n default:\n return item.include\n }\n}\n\ntype SelectButtonsProps = {\n payload: PayloadItem[]\n setPayload: Dispatch<SetStateAction<PayloadItem[]>>\n}\n\nexport default function SelectButtons(props: SelectButtonsProps) {\n const {payload, setPayload} = props\n const [disabledActions, setDisabledActions] = useState<Action[]>(() =>\n payload.length && payload.every((item) => item.include) ? ['ALL'] : [],\n )\n\n function handleSelectButton(action: Action) {\n if (!payload.length) return\n\n setPayload((current) =>\n current.map((item) => ({...item, include: shouldInclude(item, action)})),\n )\n setDisabledActions([action])\n }\n\n return (\n <Card padding={1} radius={3} shadow={1}>\n <Flex gap={2} wrap=\"wrap\">\n {buttons.map((button) =>\n 'action' in button ? (\n <Button\n key={button.action}\n fontSize={1}\n mode=\"bleed\"\n padding={2}\n text={button.label}\n disabled={disabledActions.includes(button.action)}\n onClick={() => handleSelectButton(button.action)}\n />\n ) : (\n <Card key={button.divider} borderLeft />\n ),\n )}\n </Flex>\n </Card>\n )\n}\n","import {InfoOutlineIcon} from '@sanity/icons'\nimport {Box, Text, Badge, Tooltip} from '@sanity/ui'\nimport type {BadgeTone} from '@sanity/ui'\n\ntype StatusTones = {\n EXISTS: BadgeTone\n OVERWRITE: BadgeTone\n UPDATE: BadgeTone\n CREATE: BadgeTone\n UNPUBLISHED: BadgeTone\n}\n\nconst documentTones: StatusTones = {\n EXISTS: `primary`,\n OVERWRITE: `critical`,\n UPDATE: `caution`,\n CREATE: `positive`,\n UNPUBLISHED: `caution`,\n}\n\nconst assetTones: StatusTones = {\n EXISTS: `critical`,\n OVERWRITE: `critical`,\n UPDATE: `critical`,\n CREATE: `positive`,\n UNPUBLISHED: `default`,\n}\n\nexport type MessageTypes = {\n EXISTS: string\n OVERWRITE: string\n UPDATE: string\n CREATE: string\n UNPUBLISHED: string\n}\n\nconst documentMessages: MessageTypes = {\n // Only happens once document is copied the first time, and _updatedAt is the same\n EXISTS: `This document already exists at the Destination with the same ID with the same Updated time.`,\n // Is true immediately after transaction as _updatedAt is updated by API after mutation\n // Is also true if the document at the destination has been manually modified\n // Presently, the plugin doesn't actually compare the two documents\n OVERWRITE: `A newer version of this document exists at the Destination, and it will be overwritten with this version.`,\n // Document at destination is older\n UPDATE: `An older version of this document exists at the Destination, and it will be overwritten with this version.`,\n // Document at destination doesn't exist\n CREATE: `This document will be created at the destination.`,\n UNPUBLISHED: `A Draft version of this Document exists in this Dataset, but only the Published version will be duplicated to the destination.`,\n}\n\nconst assetMessages: MessageTypes = {\n EXISTS: `This Asset already exists at the Destination`,\n OVERWRITE: `This Asset already exists at the Destination`,\n UPDATE: `This Asset already exists at the Destination`,\n CREATE: `This Asset does not yet exist at the Destination`,\n UNPUBLISHED: ``,\n}\n\nconst assetStatus: MessageTypes = {\n EXISTS: `RE-UPLOAD`,\n OVERWRITE: `RE-UPLOAD`,\n UPDATE: `RE-UPLOAD`,\n CREATE: `UPLOAD`,\n UNPUBLISHED: ``,\n}\n\ntype StatusBadgeProps = {\n isAsset: boolean\n status?: keyof MessageTypes\n}\n\nexport default function StatusBadge(props: StatusBadgeProps) {\n const {status, isAsset} = props\n\n if (!status) {\n return null\n }\n\n const badgeTone = isAsset ? assetTones[status] : documentTones[status]\n\n if (!badgeTone) {\n return (\n <Badge muted padding={2} fontSize={1}>\n Checking...\n </Badge>\n )\n }\n\n const badgeText = isAsset ? assetMessages[status] : documentMessages[status]\n const badgeStatus = isAsset ? assetStatus[status] : status\n\n return (\n <Tooltip\n content={\n <Box padding={3} style={{maxWidth: 200}}>\n <Text size={1}>{badgeText}</Text>\n </Box>\n }\n fallbackPlacements={['right', 'left']}\n placement=\"top\"\n portal\n >\n <Badge muted padding={3} fontSize={1} tone={badgeTone}>\n {badgeStatus}\n <Box marginLeft={2} display={'inline-block'} as=\"span\">\n <InfoOutlineIcon />\n </Box>\n </Badge>\n </Tooltip>\n )\n}\n","import {isAssetId, isSanityFileAsset} from '@sanity/asset-utils'\nimport type {SanityAssetDocument} from '@sanity/client'\nimport {ArrowRightIcon, SearchIcon, LaunchIcon} from '@sanity/icons'\nimport {extractWithPath} from '@sanity/mutator'\nimport {\n Card,\n Container,\n Text,\n Box,\n Button,\n Label,\n Stack,\n Select,\n Flex,\n Checkbox,\n type CardTone,\n useTheme,\n Spinner,\n} from '@sanity/ui'\nimport {getTheme_v2} from '@sanity/ui/theme'\nimport {dset} from 'dset'\nimport {type ChangeEvent, Fragment, useEffect, useEffectEvent, useMemo, useState} from 'react'\nimport {\n useClient,\n Preview,\n useSchema,\n useWorkspaces,\n type WorkspaceSummary,\n type SanityDocument,\n} from 'sanity'\n\nimport {stickyStyles, createInitialMessage} from '../helpers'\nimport {getDocumentsInArray} from '../helpers/getDocumentsInArray'\nimport type {PluginConfig} from '../types'\nimport Feedback from './Feedback'\nimport SelectButtons from './SelectButtons'\nimport StatusBadge, {type MessageTypes} from './StatusBadge'\n\nexport type DuplicatorProps = {\n docs: SanityDocument[]\n token: string\n pluginConfig: Required<PluginConfig>\n onDuplicated?: () => Promise<void>\n}\n\nexport type PayloadItem = {\n doc: SanityDocument\n include: boolean\n status?: keyof MessageTypes\n hasDraft?: boolean\n}\n\ntype WorkspaceOption = WorkspaceSummary & {\n disabled: boolean\n}\n\ntype Message = {\n text: string\n tone: CardTone\n}\n\nfunction isAssetDocument(doc: SanityDocument): doc is SanityDocument & SanityAssetDocument {\n return isAssetId(doc._id)\n}\n\n// Run an async function over every item with a maximum concurrency\nasync function mapWithConcurrency<T>(\n items: T[],\n limit: number,\n fn: (item: T) => Promise<void>,\n): Promise<void> {\n const queue = [...items]\n\n async function work(): Promise<void> {\n const item = queue.shift()\n\n if (item === undefined) {\n return undefined\n }\n\n await fn(item)\n\n return work()\n }\n\n const workers = Array.from({length: Math.min(limit, queue.length)}, () => work())\n\n await Promise.all(workers)\n}\n\nexport default function Duplicator(props: DuplicatorProps) {\n const {docs, token, pluginConfig, onDuplicated} = props\n const theme = useTheme()\n const isDarkMode = getTheme_v2({sanity: theme.sanity}).color._dark\n\n // Prepare origin (this Studio) client\n const originClient = useClient({apiVersion: pluginConfig.apiVersion})\n\n const schema = useSchema()\n\n // Create list of dataset options\n // and set initial value of dropdown\n const workspaces = useWorkspaces()\n const workspacesOptions: WorkspaceOption[] = workspaces.map((workspace) => ({\n ...workspace,\n disabled:\n workspace.dataset === originClient.config().dataset &&\n workspace.projectId === originClient.config().projectId,\n }))\n\n const [destination, setDestination] = useState<WorkspaceOption | null>(\n workspaces.length ? (workspacesOptions.find((space) => !space.disabled) ?? null) : null,\n )\n const [message, setMessage] = useState<Message | null>(null)\n const [payload, setPayload] = useState<PayloadItem[]>([])\n\n const [isDuplicating, setIsDuplicating] = useState(false)\n const [isGathering, setIsGathering] = useState(false)\n const [progress, setProgress] = useState<[number, number]>([0, 0])\n\n // References found in the initial docs\n const initialRefsCount = useMemo(\n () => docs.reduce((acc, doc) => acc + extractWithPath(`.._ref`, doc).length, 0),\n [docs],\n )\n const hasReferences = initialRefsCount > 0\n const initialMessage: Message | null = hasReferences\n ? {tone: `caution`, text: createInitialMessage(docs.length, initialRefsCount)}\n : null\n const displayMessage = message ?? initialMessage\n\n // Check if payload documents exist at destination\n async function updatePayloadStatuses(payloadActual: PayloadItem[], dest: WorkspaceOption | null) {\n if (!payloadActual.length || !dest?.name) {\n return\n }\n\n const payloadIds = payloadActual.map(({doc}) => doc._id)\n const destinationClient = originClient.withConfig({\n dataset: dest.dataset,\n projectId: dest.projectId,\n })\n const destinationData = await destinationClient.fetch<SanityDocument[]>(\n `*[_id in $payloadIds]{ _id, _updatedAt }`,\n {payloadIds},\n )\n\n setPayload(\n payloadActual.map((item) => {\n const existingDoc = destinationData.find((doc) => doc._id === item.doc._id)\n let status: keyof MessageTypes = 'CREATE'\n\n if (existingDoc?._updatedAt && item.doc._updatedAt) {\n if (existingDoc._updatedAt === item.doc._updatedAt) {\n // Exact same document exists at destination\n // We don't compare by _rev because that is updated in a transaction\n status = `EXISTS`\n } else {\n status =\n new Date(existingDoc._updatedAt) > new Date(item.doc._updatedAt)\n ? // Document at destination is newer\n `OVERWRITE`\n : // Document at destination is older\n `UPDATE`\n }\n }\n\n return {...item, status}\n }),\n )\n }\n\n // Build the initial payload and check statuses at the current destination\n const initializePayload = useEffectEvent((nextDocs: SanityDocument[]) => {\n const initialPayload: PayloadItem[] = nextDocs.map((doc) => ({include: true, doc}))\n updatePayloadStatuses(initialPayload, destination).catch(console.error)\n })\n\n // Sync the payload with the docs prop and the destination dataset.\n // setPayload only runs after fetching document statuses from the\n // destination resolves, not synchronously within the effect.\n // See: https://github.com/facebook/react/issues/34743\n useEffect(() => {\n // oxlint-disable-next-line react/react-compiler\n initializePayload(docs)\n }, [docs])\n\n function handleCheckbox(_id: string) {\n setPayload((current) =>\n current.map((item) => (item.doc._id === _id ? {...item, include: !item.include} : item)),\n )\n }\n\n // Find and recursively follow references beginning with this document\n async function handleReferences() {\n setIsGathering(true)\n\n try {\n const docIds = docs.map((doc) => doc._id)\n\n const payloadDocs = await getDocumentsInArray({\n fetchIds: docIds,\n client: originClient,\n pluginConfig,\n })\n const draftDocs = await getDocumentsInArray({\n fetchIds: docIds.map((id) => `drafts.${id}`),\n client: originClient,\n projection: `{_id}`,\n pluginConfig,\n })\n const draftDocsIds = new Set(draftDocs.map(({_id}) => _id))\n\n // Shape it up\n const payloadShaped: PayloadItem[] = payloadDocs.map((doc) => ({\n doc,\n // Include this in the transaction?\n include: true,\n // Does it exist at the destination?\n status: undefined,\n // Does it have any drafts?\n hasDraft: draftDocsIds.has(`drafts.${doc._id}`),\n }))\n\n setPayload(payloadShaped)\n updatePayloadStatuses(payloadShaped, destination).catch(console.error)\n } catch (err) {\n console.error(err)\n }\n\n setIsGathering(false)\n }\n\n // Duplicate payload to destination dataset\n async function handleDuplicate() {\n if (!destination) {\n return\n }\n\n setIsDuplicating(true)\n\n const assetsCount = payload.filter(({doc, include}) => include && isAssetId(doc._id)).length\n let currentProgress = 0\n setProgress([currentProgress, assetsCount])\n\n setMessage({text: 'Duplicating...', tone: `transparent`})\n\n const destinationClient = originClient.withConfig({\n apiVersion: pluginConfig.apiVersion,\n dataset: destination.dataset,\n projectId: destination.projectId,\n })\n\n const transactionDocs: SanityDocument[] = []\n const svgMaps: {old: string; new: string}[] = []\n\n // Upload assets and then add to transaction\n async function processDoc(doc: SanityDocument): Promise<void> {\n if (!isAssetDocument(doc)) {\n transactionDocs.push(doc)\n\n return\n }\n\n // Download and upload asset\n // Get the *original* image with this dlRaw param to create the same deterministic _id\n const typeIsFile = isSanityFileAsset(doc)\n const downloadUrl = typeIsFile ? doc.url : `${doc.url}?dlRaw=true`\n const downloadConfig = typeIsFile ? {} : {headers: {Authorization: `Bearer ${token}`}}\n\n const res = await fetch(downloadUrl, downloadConfig)\n const assetData = await res.blob()\n\n const options = {filename: doc.originalFilename}\n const assetDoc = await destinationClient.assets.upload(\n typeIsFile ? `file` : `image`,\n assetData,\n options,\n )\n\n // SVG _id's need remapping before transaction\n if (doc.extension === 'svg') {\n svgMaps.push({old: doc._id, new: assetDoc._id})\n }\n\n // This adds the newly created asset document to the transaction but ...\n // it doesn't have some of the original asset's metadata like `altText` or `title`\n transactionDocs.push(assetDoc)\n\n // So the original `doc` is added to the transaction as well below\n // However, we don't want to retain the original `url` or `path` values\n // because these strings contain the origin's dataset name\n transactionDocs.push({...doc, url: assetDoc.url, path: assetDoc.path})\n\n currentProgress += 1\n setMessage({\n text: `Duplicating ${currentProgress}/${assetsCount} Assets`,\n tone: 'default',\n })\n setProgress([currentProgress, assetsCount])\n }\n\n try {\n const payloadIncludedDocs = payload.filter((item) => item.include).map((item) => item.doc)\n\n // Promises are limited to three at once\n await mapWithConcurrency(payloadIncludedDocs, 3, processDoc)\n } catch (err) {\n console.error(err)\n setIsDuplicating(false)\n setProgress([0, 0])\n setMessage({tone: 'critical', text: `Duplication Failed`})\n\n return\n }\n\n // Remap SVG references to new _id's\n const transactionDocsMapped = transactionDocs.map((doc) => {\n const expr = `.._ref`\n const references = extractWithPath(expr, doc)\n\n if (!references.length) {\n return doc\n }\n\n // For every found _ref, search for an SVG asset _id and update\n references.forEach((ref) => {\n const newRefValue = svgMaps.find((asset) => asset.old === ref.value)?.new\n\n if (newRefValue) {\n const refPath = ref.path.join('.')\n\n dset(doc, refPath, newRefValue)\n }\n })\n\n return doc\n })\n\n // Create transaction\n const transaction = destinationClient.transaction()\n\n transactionDocsMapped.forEach((doc) => {\n transaction.createOrReplace(doc)\n })\n\n try {\n await transaction.commit()\n setMessage({tone: 'positive', text: 'Duplication complete!'})\n\n updatePayloadStatuses(payload, destination).catch(console.error)\n } catch (err) {\n setMessage({\n tone: 'critical',\n text: err instanceof Error ? err.message : `Duplication Failed`,\n })\n }\n\n setIsDuplicating(false)\n setProgress([0, 0])\n if (onDuplicated) {\n try {\n await onDuplicated()\n } catch (error) {\n const text = error instanceof Error ? error.message : String(error)\n setMessage({tone: 'critical', text: `Error in onDuplicated hook: ${text}`})\n }\n }\n }\n\n function handleChange(e: ChangeEvent<HTMLSelectElement>) {\n if (!workspacesOptions.length) {\n return\n }\n\n const targeted = workspacesOptions.find((space) => space.name === e.currentTarget.value)\n\n if (targeted) {\n setDestination(targeted)\n updatePayloadStatuses(payload, targeted).catch(console.error)\n }\n }\n\n const payloadCount = payload.length\n const firstSvgIndex = payload.findIndex(({doc}) => doc['extension'] === 'svg')\n const selectedDocumentsCount = payload.filter(\n (item) => item.include && !isAssetId(item.doc._id),\n ).length\n const selectedAssetsCount = payload.filter(\n (item) => item.include && isAssetId(item.doc._id),\n ).length\n const selectedTotal = selectedDocumentsCount + selectedAssetsCount\n const destinationTitle = destination?.title ?? destination?.name\n const hasMultipleProjectIds =\n new Set(workspacesOptions.map((space) => space?.projectId).filter(Boolean)).size > 1\n\n const headingText = [selectedTotal, `/`, payloadCount, `Documents and Assets selected`].join(` `)\n\n const buttonTextParts = [`Duplicate`]\n\n if (selectedDocumentsCount > 1) {\n buttonTextParts.push(\n String(selectedDocumentsCount),\n selectedDocumentsCount === 1 ? `Document` : `Documents`,\n )\n }\n\n if (selectedAssetsCount > 1) {\n buttonTextParts.push(\n `and`,\n String(selectedAssetsCount),\n selectedAssetsCount === 1 ? `Asset` : `Assets`,\n )\n }\n\n if (originClient.config().projectId !== destination?.projectId) {\n buttonTextParts.push(`between Projects`)\n }\n\n buttonTextParts.push(`to`, String(destinationTitle))\n\n const buttonText = buttonTextParts.join(` `)\n\n if (workspacesOptions.length < 2) {\n return (\n <Feedback tone=\"critical\">\n <code>sanity.config.ts</code> must contain at least two Workspaces to use this plugin.\n </Feedback>\n )\n }\n\n return (\n <Container width={1}>\n <Card border>\n <Stack>\n <Card padding={4} style={stickyStyles(isDarkMode)}>\n <Stack gap={4}>\n <Flex gap={3}>\n <Stack style={{flex: 1}} gap={3}>\n <Label>Duplicate from</Label>\n <Select readOnly value={workspacesOptions.find((space) => space.disabled)?.name}>\n {workspacesOptions\n .filter((space) => space.disabled)\n .map((space) => (\n <option key={space.name} value={space.name} disabled={space.disabled}>\n {space.title ?? space.name}\n {hasMultipleProjectIds ? ` (${space.projectId})` : ``}\n </option>\n ))}\n </Select>\n </Stack>\n <Box padding={4} paddingTop={5} paddingBottom={0}>\n <Text size={3}>\n <ArrowRightIcon />\n </Text>\n </Box>\n <Stack style={{flex: 1}} gap={3}>\n <Label>To Destination</Label>\n <Select onChange={handleChange}>\n {workspacesOptions.map((space) => (\n <option key={space.name} value={space.name} disabled={space.disabled}>\n {space.title ?? space.name}\n {hasMultipleProjectIds ? ` (${space.projectId})` : ``}\n {space.disabled ? ` (Current)` : ``}\n </option>\n ))}\n </Select>\n </Stack>\n </Flex>\n\n {isDuplicating && (\n <Card border radius={2}>\n <Card\n style={{\n width: '100%',\n transform: `scaleX(${progress[0] / progress[1]})`,\n transformOrigin: 'left',\n transition: 'transform .2s ease',\n boxSizing: 'border-box',\n }}\n padding={1}\n tone=\"positive\"\n />\n </Card>\n )}\n {payload.length > 0 && (\n <>\n <Label>{headingText}</Label>\n <SelectButtons payload={payload} setPayload={setPayload} />\n </>\n )}\n </Stack>\n </Card>\n <Card borderTop padding={4}>\n <Stack gap={3}>\n {displayMessage && (\n <Card padding={3} radius={2} shadow={1} tone={displayMessage.tone}>\n <Text size={1}>{displayMessage.text}</Text>\n </Card>\n )}\n {payload.length > 0 ? (\n <Stack>\n {payload.map(({doc, include, status, hasDraft}, index) => {\n const schemaType = schema.get(doc._type)\n\n return (\n <Fragment key={doc._id}>\n <Flex align=\"center\">\n <Checkbox checked={include} onChange={() => handleCheckbox(doc._id)} />\n <Box flex={1} paddingX={3}>\n {schemaType ? (\n <Preview value={doc} schemaType={schemaType} />\n ) : (\n <Card tone=\"caution\">Invalid schema type</Card>\n )}\n </Box>\n <Flex align=\"center\" gap={2}>\n {hasDraft ? <StatusBadge status=\"UNPUBLISHED\" isAsset={false} /> : null}\n <StatusBadge status={status} isAsset={isAssetId(doc._id)} />\n </Flex>\n </Flex>\n {doc['extension'] === 'svg' && index === firstSvgIndex && (\n <Card padding={3} radius={2} shadow={1} tone=\"caution\">\n <Text size={1}>\n Due to how SVGs are sanitized after first uploaded, duplicated SVG\n assets may have new <code>_id</code>'s at the destination. The newly\n generated <code>_id</code> will be the same in each duplication, but\n it will never be the same <code>_id</code> as the first time this\n Asset was uploaded. References to the asset will be updated to use the\n new <code>_id</code>.\n </Text>\n </Card>\n )}\n </Fragment>\n )\n })}\n </Stack>\n ) : (\n <Flex padding={4} align=\"center\" justify=\"center\">\n <Spinner />\n </Flex>\n )}\n <Stack gap={2}>\n {hasReferences && (\n <Button\n fontSize={2}\n padding={4}\n tone=\"positive\"\n mode=\"ghost\"\n icon={SearchIcon}\n onClick={() => void handleReferences()}\n text=\"Gather References\"\n disabled={isDuplicating || !selectedTotal || isGathering}\n />\n )}\n <Button\n fontSize={2}\n padding={4}\n tone=\"positive\"\n icon={LaunchIcon}\n onClick={() => void handleDuplicate()}\n text={buttonText}\n disabled={isDuplicating || !selectedTotal || isGathering}\n />\n </Stack>\n </Stack>\n </Card>\n </Stack>\n </Card>\n </Container>\n )\n}\n","import {Button, Stack, Box, Label, Text, Card, Flex, Grid, Container, TextInput} from '@sanity/ui'\nimport {type SubmitEvent, useState} from 'react'\nimport {useSchema, useClient, type SanityDocument} from 'sanity'\n\nimport type {PluginConfig} from '../types'\nimport Duplicator from './Duplicator'\n\ntype DuplicatorQueryProps = {\n token: string\n pluginConfig: Required<PluginConfig>\n}\n\ntype InitialData = {\n docs: SanityDocument[]\n}\n\nexport default function DuplicatorQuery(props: DuplicatorQueryProps) {\n const {token, pluginConfig} = props\n\n const {queries: preDefinedQueries, apiVersion} = pluginConfig\n const originClient = useClient({apiVersion})\n\n const schema = useSchema()\n const schemaTypes = schema.getTypeNames()\n\n const [value, setValue] = useState(``)\n const [fetched, setFetched] = useState(false)\n const [initialData, setInitialData] = useState<InitialData>({\n docs: [],\n })\n\n async function runQuery() {\n try {\n const res = await originClient.fetch<SanityDocument[]>(value)\n\n // Ensure queried docs are registered to the schema\n const registeredAndPublishedDocs = res.length\n ? res\n .filter((doc) => schemaTypes.includes(doc._type))\n .filter((doc) => !doc._id.startsWith(`drafts.`))\n : []\n\n setInitialData({\n docs: registeredAndPublishedDocs,\n })\n setFetched(true)\n } catch (err) {\n console.error(err)\n }\n }\n\n function handleSubmit(e?: SubmitEvent<HTMLFormElement>) {\n if (e) e.preventDefault()\n void runQuery()\n }\n\n return (\n <Card padding={[0, 0, 0, 5]}>\n <Container>\n <Grid gridTemplateColumns={[1, 1, 1, 2]} gap={[1, 1, 1, 4]}>\n <Box padding={[2, 2, 2, 0]}>\n <Card padding={4} radius={3} border>\n <Stack gap={4}>\n <Box>\n <Label>Initial Documents Query</Label>\n </Box>\n <Box>\n <Text>\n Start with a valid GROQ query to load initial documents. The query will need to\n return an Array of Objects. Drafts will be removed from the results.\n </Text>\n </Box>\n <form onSubmit={handleSubmit}>\n <Flex>\n <Box flex={1} paddingRight={2}>\n <TextInput\n style={{fontFamily: 'monospace'}}\n fontSize={2}\n onChange={(event) => setValue(event.currentTarget.value)}\n padding={4}\n placeholder={`*[_type == \"article\"]`}\n value={value ?? ``}\n />\n </Box>\n <Button\n padding={2}\n paddingX={4}\n tone=\"primary\"\n onClick={() => handleSubmit()}\n text=\"Query\"\n disabled={!value}\n />\n </Flex>\n </form>\n </Stack>\n </Card>\n {preDefinedQueries && preDefinedQueries?.length > 0 && (\n <Card marginTop={2} padding={4} radius={3} border>\n <Box>\n <Stack gap={4}>\n <Box>\n <Label>Predefined Queries</Label>\n </Box>\n <Stack gap={2}>\n {preDefinedQueries.map((query) => (\n <Button\n key={query.label.replace(/\\s+/g, '-')}\n padding={2}\n paddingX={4}\n tone=\"primary\"\n onClick={() => setValue(`*[${query.query}]`)}\n text={query.label}\n />\n ))}\n </Stack>\n </Stack>\n </Box>\n </Card>\n )}\n </Box>\n {fetched && initialData.docs.length < 1 && (\n <Container width={1}>\n <Card padding={5}>\n {value ? `No documents match this query` : `Start with a valid GROQ query`}\n </Card>\n </Container>\n )}\n {initialData.docs?.length > 0 && (\n <Duplicator docs={initialData.docs} token={token} pluginConfig={pluginConfig} />\n )}\n </Grid>\n </Container>\n </Card>\n )\n}\n","import {Grid, Card, Container, Button} from '@sanity/ui'\nimport {useState, useEffect} from 'react'\nimport {type SanityDocument, useClient} from 'sanity'\n\nimport type {DuplicatorProps} from './Duplicator'\nimport Duplicator from './Duplicator'\n\nexport default function DuplicatorWrapper(props: DuplicatorProps) {\n const {docs, token, pluginConfig, onDuplicated} = props\n const [inbound, setInbound] = useState<SanityDocument[]>([])\n const {follow, apiVersion} = pluginConfig\n\n // Make the first mode the default if there's only one\n const [mode, setMode] = useState<'inbound' | 'outbound'>(\n follow.length === 1 ? (follow[0] ?? 'outbound') : 'outbound',\n )\n const client = useClient({apiVersion})\n\n // \"Inbound\" will start with all documents that reference the first one\n // And then you can gather \"Outbound\" references thereafter\n useEffect(() => {\n async function fetchInbound() {\n const firstDocId = docs[0]?._id\n\n if (!follow.includes(`inbound`) || !firstDocId) {\n return\n }\n\n const inboundReferences = await client.fetch<SanityDocument[]>(`*[references($id)]`, {\n id: firstDocId,\n })\n setInbound([...docs, ...inboundReferences])\n }\n\n fetchInbound().catch(console.error)\n }, [client, docs, follow])\n\n return (\n <Container>\n {follow.length > 1 && (follow.includes(`inbound`) || follow.includes(`outbound`)) ? (\n <Card paddingX={4} paddingBottom={4} marginBottom={4} borderBottom>\n <Grid gridTemplateColumns={2} gap={4}>\n {follow.includes(`outbound`) ? (\n <Button\n mode=\"ghost\"\n tone=\"primary\"\n selected={mode === 'outbound'}\n onClick={() => setMode('outbound')}\n text=\"Outbound\"\n />\n ) : null}\n {follow.includes(`inbound`) ? (\n <Button\n mode=\"ghost\"\n tone=\"primary\"\n selected={mode === 'inbound'}\n onClick={() => setMode('inbound')}\n disabled={inbound.length === 0}\n text={inbound.length > 0 ? `Inbound (${inbound.length})` : 'No inbound references'}\n />\n ) : null}\n </Grid>\n </Card>\n ) : null}\n <Duplicator\n docs={mode === 'outbound' ? docs : inbound}\n token={token}\n pluginConfig={pluginConfig}\n onDuplicated={onDuplicated}\n />\n </Container>\n )\n}\n","import {Button, Flex} from '@sanity/ui'\nimport {useCallback} from 'react'\nimport {useClient} from 'sanity'\n\nimport {SECRET_NAMESPACE} from '../helpers/constants'\n\ntype ResetSecretProps = {\n apiVersion: string\n}\n\nexport default function ResetSecret({apiVersion}: ResetSecretProps) {\n const client = useClient({apiVersion})\n\n const handleClick = useCallback(() => {\n client.delete({query: `*[_id == \"secrets.${SECRET_NAMESPACE}\"]`}).catch(console.error)\n }, [client])\n\n return (\n <Flex align=\"center\" justify=\"flex-end\" paddingX={[2, 2, 2, 5]} paddingY={5}>\n <Button\n text=\"Reset Secret\"\n onClick={handleClick}\n mode=\"ghost\"\n tone=\"critical\"\n fontSize={1}\n padding={2}\n />\n </Flex>\n )\n}\n","import {useSecrets, SettingsView} from '@sanity/studio-secrets'\nimport {Flex, Box, Spinner} from '@sanity/ui'\nimport type {SanityDocument} from 'sanity'\n\nimport {useCrossDatasetDuplicatorConfig} from '../context/ConfigProvider'\nimport {SECRET_NAMESPACE} from '../helpers/constants'\nimport DuplicatorQuery from './DuplicatorQuery'\nimport DuplicatorWrapper from './DuplicatorWrapper'\nimport Feedback from './Feedback'\nimport ResetSecret from './ResetSecret'\n\n// Check for auth secret (required for asset uploads)\nconst secretConfigKeys = [\n {\n key: 'bearerToken',\n title:\n 'An API token with Viewer permissions is required to duplicate the original files of assets, and will be used for all Duplications. Create one at sanity.io/manage',\n description: '',\n },\n]\n\ntype Secrets = {\n bearerToken?: string\n}\n\ntype CrossDatasetDuplicatorProps = {\n mode: 'tool' | 'action'\n docs: SanityDocument[]\n onDuplicated?: () => Promise<void>\n}\n\nexport default function CrossDatasetDuplicator(props: CrossDatasetDuplicatorProps) {\n const {mode, docs, onDuplicated} = props\n const pluginConfig = useCrossDatasetDuplicatorConfig()\n\n const {loading, secrets} = useSecrets<Secrets>(SECRET_NAMESPACE)\n\n if (loading) {\n return (\n <Flex justify=\"center\" align=\"center\">\n <Box padding={5}>\n <Spinner />\n </Box>\n </Flex>\n )\n }\n\n // A bearer token is required to duplicate assets, so the prompt cannot be\n // dismissed until one is saved\n if (!secrets?.bearerToken) {\n return (\n <SettingsView\n title=\"Token Required\"\n namespace={SECRET_NAMESPACE}\n keys={secretConfigKeys}\n onClose={() => null}\n />\n )\n }\n\n if (mode === 'tool' && pluginConfig) {\n return (\n <>\n <DuplicatorQuery token={secrets.bearerToken} pluginConfig={pluginConfig} />\n <ResetSecret apiVersion={pluginConfig.apiVersion} />\n </>\n )\n }\n\n if (!docs?.length) {\n return <Feedback>No docs passed into Duplicator Tool</Feedback>\n }\n\n if (!pluginConfig) {\n return <Feedback>No plugin config</Feedback>\n }\n\n return (\n <DuplicatorWrapper\n docs={docs}\n token={secrets.bearerToken}\n pluginConfig={pluginConfig}\n onDuplicated={onDuplicated}\n />\n )\n}\n","import type {CrossDatasetDuplicatorActionProps} from '../types'\nimport CrossDatasetDuplicator from './CrossDatasetDuplicator'\n\n/**\n * Component to perform a migration from the Cross Dataset Duplicator plugin\n * @public\n */\nexport function CrossDatasetDuplicatorAction(props: CrossDatasetDuplicatorActionProps) {\n const {docs, onDuplicated} = props\n\n return <CrossDatasetDuplicator mode=\"action\" docs={docs} onDuplicated={onDuplicated} />\n}\n","import {LaunchIcon} from '@sanity/icons'\nimport {useState} from 'react'\nimport type {DocumentActionProps} from 'sanity'\n\nimport {CrossDatasetDuplicatorAction} from '../components/CrossDatasetDuplicatorAction'\n\n/**\n * Document action from the Cross Dataset Duplicator plugin\n * @public\n */\nexport const DuplicateToAction = (props: DocumentActionProps) => {\n const {draft, published} = props\n const [dialogOpen, setDialogOpen] = useState(false)\n\n return {\n disabled: Boolean(draft),\n title: draft ? `Document must be Published to begin` : null,\n label: 'Duplicate to...',\n dialog: dialogOpen &&\n published && {\n type: 'modal',\n title: 'Cross Dataset Duplicator',\n content: <CrossDatasetDuplicatorAction docs={[published]} />,\n onClose: () => setDialogOpen(false),\n },\n onHandle: () => setDialogOpen(true),\n icon: LaunchIcon,\n }\n}\n\nDuplicateToAction.action = 'duplicateTo'\n","import type {SanityDocument, Tool} from 'sanity'\n\nimport CrossDatasetDuplicator from './CrossDatasetDuplicator'\n\nexport type MultiToolConfig = {\n docs: SanityDocument[]\n}\n\ntype CrossDatasetDuplicatorProps = {\n tool: Tool<MultiToolConfig>\n}\n\nexport function CrossDatasetDuplicatorTool(props: CrossDatasetDuplicatorProps) {\n const {docs = []} = props.tool.options ?? {}\n\n return <CrossDatasetDuplicator mode=\"tool\" docs={docs} />\n}\n","import {LaunchIcon} from '@sanity/icons'\nimport type {Tool} from 'sanity'\n\nimport {\n CrossDatasetDuplicatorTool,\n type MultiToolConfig,\n} from '../components/CrossDatasetDuplicatorTool'\n\nexport const crossDatasetDuplicatorTool = (): Tool<MultiToolConfig> => ({\n title: 'Duplicator',\n name: 'duplicator',\n icon: LaunchIcon,\n component: CrossDatasetDuplicatorTool,\n options: {\n docs: [],\n },\n})\n","import {definePlugin} from 'sanity'\n\nimport {DuplicateToAction} from './actions/DuplicateToAction'\nimport {ConfigProvider} from './context/ConfigProvider'\nimport {DEFAULT_CONFIG} from './helpers/constants'\nimport {crossDatasetDuplicatorTool} from './tool'\nimport type {PluginConfig} from './types'\n\n/**\n * Plugin: Cross Dataset Duplicator\n * @public\n */\nexport const crossDatasetDuplicator = definePlugin<Partial<PluginConfig> | void>((config = {}) => {\n const pluginConfig = {...DEFAULT_CONFIG, ...config}\n const {types} = pluginConfig\n\n return {\n name: '@sanity/cross-dataset-duplicator',\n tools: (prev) => (pluginConfig.tool ? [...prev, crossDatasetDuplicatorTool()] : prev),\n studio: {\n components: {\n layout: (props) => <ConfigProvider {...props} pluginConfig={pluginConfig} />,\n },\n },\n document: {\n actions: (prev, {schemaType}) => {\n return types && types.includes(schemaType) ? [...prev, DuplicateToAction] : prev\n },\n },\n }\n})\n"],"names":["SECRET_NAMESPACE","DEFAULT_CONFIG","apiVersion","tool","types","filter","follow","queries","CrossDatasetDuplicatorContext","createContext","useCrossDatasetDuplicatorConfig","useContext","ConfigProvider","props","$","_c","T0","t0","t1","pluginConfig","rest","Provider","renderDefault","t2","createInitialMessage","docCount","refsCount","join","stickyStyles","isDarkMode","position","top","zIndex","backgroundColor","getDocumentsInArray","options","fetchIds","client","currentIds","projection","collection","query","Boolean","data","fetch","length","localCurrentIds","Set","newDataIds","map","dataDoc","_id","id","size","has","push","add","Promise","all","doc","references","extractWithPath","flatMap","ref","value","newReferenceIds","referenceDocs","Array","from","seenIds","uniqueCollection","Feedback","children","tone","undefined","buttons","label","action","divider","shouldInclude","item","status","isAssetId","include","SelectButtons","payload","setPayload","every","_temp","disabledActions","setDisabledActions","useState","current","item_0","handleSelectButton","button","includes","t3","documentTones","EXISTS","OVERWRITE","UPDATE","CREATE","UNPUBLISHED","assetTones","documentMessages","assetMessages","assetStatus","StatusBadge","isAsset","badgeTone","Symbol","for","badgeText","badgeStatus","maxWidth","t4","t5","isAssetDocument","mapWithConcurrency","items","limit","fn","queue","work","shift","workers","Math","min","Duplicator","docs","token","onDuplicated","theme","useTheme","getTheme_v2","sanity","color","_dark","originClient","useClient","schema","useSchema","workspaces","useWorkspaces","workspace","disabled","dataset","config","projectId","workspacesOptions","destination","setDestination","find","message","setMessage","isDuplicating","setIsDuplicating","isGathering","setIsGathering","progress","setProgress","initialRefsCount","reduce","_temp2","hasReferences","text","displayMessage","payloadActual","dest","name","payloadIds","_temp3","destinationData","withConfig","existingDoc","doc_1","_updatedAt","Date","updatePayloadStatuses","t6","nextDocs","initialPayload","_temp4","catch","console","error","initializePayload","useEffectEvent","t7","t8","useEffect","t9","handleCheckbox","t10","docIds","_temp5","payloadDocs","draftDocs","_temp6","draftDocsIds","_temp7","payloadShaped","doc_4","hasDraft","t11","err","handleReferences","assetsCount","_temp8","currentProgress","destinationClient_0","transactionDocs","svgMaps","processDoc","doc_6","typeIsFile","isSanityFileAsset","downloadUrl","url","downloadConfig","headers","Authorization","assetData","blob","filename","originalFilename","assetDoc","destinationClient","assets","upload","extension","old","new","path","payloadIncludedDocs","_temp9","_temp0","t12","transactionDocsMapped","doc_7","forEach","newRefValue","asset","refPath","dset","transaction","doc_8","createOrReplace","commit","t13","Error","t14","String","handleDuplicate","handleChange","e","targeted","space_0","space","currentTarget","payloadCount","findIndex","_temp1","firstSvgIndex","_temp10","selectedDocumentsCount","_temp11","selectedAssetsCount","selectedTotal","destinationTitle","title","hasMultipleProjectIds","_temp12","t15","headingText","buttonTextParts","buttonText","t16","t17","flex","t18","t19","space_4","t20","Stack","t21","t22","t23","T1","Select","t24","space_5","t25","t26","t27","t28","width","transform","transformOrigin","transition","boxSizing","t29","Fragment","t30","t31","t32","index","doc_10","include_0","status_0","schemaType","get","_type","SearchIcon","t33","t34","t35","LaunchIcon","t36","t37","_temp13","_temp14","space_3","space_2","space_1","item_4","item_3","doc_9","item_2","item_1","doc_5","_id_0","doc_3","doc_2","doc_0","acc","DuplicatorQuery","preDefinedQueries","schemaTypes","getTypeNames","setValue","fetched","setFetched","initialData","setInitialData","runQuery","res","registeredAndPublishedDocs","startsWith","handleSubmit","preventDefault","fontFamily","event","replace","DuplicatorWrapper","inbound","setInbound","mode","setMode","fetchInbound","firstDocId","inboundReferences","ResetSecret","delete","handleClick","secretConfigKeys","key","description","CrossDatasetDuplicator","loading","secrets","useSecrets","bearerToken","CrossDatasetDuplicatorAction","DuplicateToAction","draft","published","dialogOpen","setDialogOpen","dialog","type","content","onClose","onHandle","icon","CrossDatasetDuplicatorTool","crossDatasetDuplicatorTool","component","crossDatasetDuplicator","definePlugin","tools","prev","studio","components","layout","document","actions"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/helpers/constants.ts","../src/context/ConfigProvider.tsx","../src/helpers/index.ts","../src/helpers/getDocumentsInArray.ts","../src/components/Feedback.tsx","../src/components/SelectButtons.tsx","../src/components/StatusBadge.tsx","../src/components/Duplicator.tsx","../src/components/DuplicatorQuery.tsx","../src/components/DuplicatorWrapper.tsx","../src/components/ResetSecret.tsx","../src/components/CrossDatasetDuplicator.tsx","../src/components/CrossDatasetDuplicatorAction.tsx","../src/actions/DuplicateToAction.tsx","../src/components/CrossDatasetDuplicatorTool.tsx","../src/tool/index.ts","../src/plugin.tsx"],"sourcesContent":["import type {PluginConfig} from '../types'\n\nexport const SECRET_NAMESPACE = `CrossDatasetDuplicator`\n\nexport const DEFAULT_CONFIG: Required<PluginConfig> = {\n apiVersion: '2025-02-19',\n tool: true,\n types: [],\n filter: '',\n follow: ['outbound'],\n queries: [],\n}\n","import {createContext, useContext} from 'react'\nimport type {LayoutProps} from 'sanity'\n\nimport {DEFAULT_CONFIG} from '../helpers/constants'\nimport type {PluginConfig} from '../types'\n\nconst CrossDatasetDuplicatorContext = createContext(DEFAULT_CONFIG)\n\ntype ConfigProviderProps = LayoutProps & {pluginConfig: Required<PluginConfig>}\n\n/**\n * Plugin config context hook from the Cross Dataset Duplicator plugin\n * @public\n */\nexport function useCrossDatasetDuplicatorConfig() {\n const pluginConfig = useContext(CrossDatasetDuplicatorContext)\n\n return pluginConfig\n}\n\nexport function ConfigProvider(props: ConfigProviderProps) {\n const {pluginConfig, ...rest} = props\n\n return (\n <CrossDatasetDuplicatorContext.Provider value={pluginConfig}>\n {props.renderDefault(rest)}\n </CrossDatasetDuplicatorContext.Provider>\n )\n}\n","import type {CSSProperties} from 'react'\n\nexport function createInitialMessage(docCount = 0, refsCount = 0): string {\n const message = [\n docCount === 1 ? `This Document contains` : `These ${docCount} Documents contain`,\n refsCount === 1 ? `1 Reference.` : `${refsCount} References.`,\n refsCount === 1 ? `That Document` : `Those Documents`,\n `may have References too. If referenced Documents do not exist at the target Destination, this transaction will fail.`,\n ]\n\n return message.join(` `)\n}\n\nexport const stickyStyles = (isDarkMode = true): CSSProperties => ({\n position: 'sticky',\n top: 0,\n zIndex: 100,\n backgroundColor: isDarkMode ? `rgba(10,10,10,0.95)` : `rgba(255,255,255,0.95)`,\n})\n","import {extractWithPath} from '@sanity/mutator'\nimport type {SanityClient, SanityDocument} from 'sanity'\n\nimport type {PluginConfig} from '../types'\n\ntype OptionsBag = {\n fetchIds: string[]\n client: SanityClient\n pluginConfig: PluginConfig\n currentIds?: Set<string> | null\n projection?: string\n}\n\n// Recursively fetch Documents from an array of _id's and their references\n// Heavy use of Set is to avoid recursively querying for id's already in the payload\nexport async function getDocumentsInArray(options: OptionsBag): Promise<SanityDocument[]> {\n const {fetchIds, client, pluginConfig, currentIds, projection} = options\n const collection: SanityDocument[] = []\n\n // Find initial docs\n const filter = ['_id in $fetchIds', pluginConfig.filter].filter(Boolean).join(' && ')\n const query = `*[${filter}]${projection ?? ``}`\n const data = await client.fetch<SanityDocument[]>(query, {\n fetchIds: fetchIds ?? [],\n })\n\n if (!data?.length) {\n return []\n }\n\n const localCurrentIds = currentIds ?? new Set<string>()\n\n // Find new ids in the returned data\n // Unless we started with an empty set, get the _ids from the data\n const newDataIds = new Set<string>(\n data\n .map((dataDoc) => dataDoc._id)\n .filter((id) => (currentIds?.size ? !localCurrentIds.has(id) : Boolean(id))),\n )\n\n if (newDataIds.size) {\n collection.push(...data)\n for (const id of newDataIds) {\n localCurrentIds.add(id)\n }\n\n // Check new data for more references\n await Promise.all(\n data.map(async (doc) => {\n const expr = `.._ref`\n const references = extractWithPath(expr, doc).flatMap((ref) =>\n typeof ref.value === 'string' ? [ref.value] : [],\n )\n\n if (references.length) {\n // Find references not already in the Collection\n const newReferenceIds = new Set<string>(\n references.filter((ref) => !localCurrentIds.has(ref)),\n )\n\n if (newReferenceIds.size) {\n // Recursive query for new documents\n const referenceDocs = await getDocumentsInArray({\n fetchIds: Array.from(newReferenceIds),\n currentIds: localCurrentIds,\n client,\n pluginConfig,\n })\n\n if (referenceDocs?.length) {\n collection.push(...referenceDocs)\n }\n }\n }\n }),\n )\n }\n\n // Create a unique array of documents, keeping the first occurrence of each _id\n const seenIds = new Set<string>()\n const uniqueCollection: SanityDocument[] = []\n\n for (const doc of collection) {\n if (doc && !seenIds.has(doc._id)) {\n seenIds.add(doc._id)\n uniqueCollection.push(doc)\n }\n }\n\n return uniqueCollection\n}\n","import {Card, Text} from '@sanity/ui'\nimport type {BadgeTone} from '@sanity/ui'\nimport type {ReactNode} from 'react'\n\ntype FeedbackProps = {\n children?: ReactNode\n tone?: BadgeTone\n}\n\nexport default function Feedback(props: FeedbackProps) {\n const {children, tone = 'caution'} = props\n\n return (\n <Card padding={3} radius={2} shadow={1} tone={tone}>\n <Text size={1}>{children}</Text>\n </Card>\n )\n}\n","import {isAssetId} from '@sanity/asset-utils'\nimport {Button, Card, Flex} from '@sanity/ui'\nimport {type Dispatch, type SetStateAction, useState} from 'react'\n\nimport type {PayloadItem} from './Duplicator'\n\ntype Action = 'ALL' | 'NONE' | 'NEW' | 'EXISTING' | 'OLDER' | 'ASSETS' | 'DOCUMENTS'\n\ntype ButtonItem = {label: string; action: Action} | {divider: string}\n\nconst buttons: ButtonItem[] = [\n {label: 'All', action: 'ALL'},\n {label: 'None', action: 'NONE'},\n {divider: 'divider-1'},\n {label: 'New', action: 'NEW'},\n {label: 'Existing', action: 'EXISTING'},\n {label: 'Older', action: 'OLDER'},\n {divider: 'divider-2'},\n {label: 'Documents', action: 'DOCUMENTS'},\n {label: 'Assets', action: 'ASSETS'},\n]\n\nfunction shouldInclude(item: PayloadItem, action: Action): boolean {\n switch (action) {\n case 'ALL':\n return true\n case 'NONE':\n return false\n case 'NEW':\n return item.status === 'CREATE'\n case 'EXISTING':\n return item.status === 'EXISTS'\n case 'OLDER':\n return item.status === 'OVERWRITE'\n case 'ASSETS':\n return isAssetId(item.doc._id)\n case 'DOCUMENTS':\n return !isAssetId(item.doc._id)\n default:\n return item.include\n }\n}\n\ntype SelectButtonsProps = {\n payload: PayloadItem[]\n setPayload: Dispatch<SetStateAction<PayloadItem[]>>\n}\n\nexport default function SelectButtons(props: SelectButtonsProps) {\n const {payload, setPayload} = props\n const [disabledActions, setDisabledActions] = useState<Action[]>(() =>\n payload.length && payload.every((item) => item.include) ? ['ALL'] : [],\n )\n\n function handleSelectButton(action: Action) {\n if (!payload.length) return\n\n setPayload((current) =>\n current.map((item) => ({...item, include: shouldInclude(item, action)})),\n )\n setDisabledActions([action])\n }\n\n return (\n <Card padding={1} radius={3} shadow={1}>\n <Flex gap={2} wrap=\"wrap\">\n {buttons.map((button) =>\n 'action' in button ? (\n <Button\n key={button.action}\n fontSize={1}\n mode=\"bleed\"\n padding={2}\n text={button.label}\n disabled={disabledActions.includes(button.action)}\n onClick={() => handleSelectButton(button.action)}\n />\n ) : (\n <Card key={button.divider} borderLeft />\n ),\n )}\n </Flex>\n </Card>\n )\n}\n","import {InfoOutlineIcon} from '@sanity/icons/InfoOutline'\nimport {Box, Text, Badge, Tooltip} from '@sanity/ui'\nimport type {BadgeTone} from '@sanity/ui'\n\ntype StatusTones = {\n EXISTS: BadgeTone\n OVERWRITE: BadgeTone\n UPDATE: BadgeTone\n CREATE: BadgeTone\n UNPUBLISHED: BadgeTone\n}\n\nconst documentTones: StatusTones = {\n EXISTS: `primary`,\n OVERWRITE: `critical`,\n UPDATE: `caution`,\n CREATE: `positive`,\n UNPUBLISHED: `caution`,\n}\n\nconst assetTones: StatusTones = {\n EXISTS: `critical`,\n OVERWRITE: `critical`,\n UPDATE: `critical`,\n CREATE: `positive`,\n UNPUBLISHED: `default`,\n}\n\nexport type MessageTypes = {\n EXISTS: string\n OVERWRITE: string\n UPDATE: string\n CREATE: string\n UNPUBLISHED: string\n}\n\nconst documentMessages: MessageTypes = {\n // Only happens once document is copied the first time, and _updatedAt is the same\n EXISTS: `This document already exists at the Destination with the same ID with the same Updated time.`,\n // Is true immediately after transaction as _updatedAt is updated by API after mutation\n // Is also true if the document at the destination has been manually modified\n // Presently, the plugin doesn't actually compare the two documents\n OVERWRITE: `A newer version of this document exists at the Destination, and it will be overwritten with this version.`,\n // Document at destination is older\n UPDATE: `An older version of this document exists at the Destination, and it will be overwritten with this version.`,\n // Document at destination doesn't exist\n CREATE: `This document will be created at the destination.`,\n UNPUBLISHED: `A Draft version of this Document exists in this Dataset, but only the Published version will be duplicated to the destination.`,\n}\n\nconst assetMessages: MessageTypes = {\n EXISTS: `This Asset already exists at the Destination`,\n OVERWRITE: `This Asset already exists at the Destination`,\n UPDATE: `This Asset already exists at the Destination`,\n CREATE: `This Asset does not yet exist at the Destination`,\n UNPUBLISHED: ``,\n}\n\nconst assetStatus: MessageTypes = {\n EXISTS: `RE-UPLOAD`,\n OVERWRITE: `RE-UPLOAD`,\n UPDATE: `RE-UPLOAD`,\n CREATE: `UPLOAD`,\n UNPUBLISHED: ``,\n}\n\ntype StatusBadgeProps = {\n isAsset: boolean\n status?: keyof MessageTypes\n}\n\nexport default function StatusBadge(props: StatusBadgeProps) {\n const {status, isAsset} = props\n\n if (!status) {\n return null\n }\n\n const badgeTone = isAsset ? assetTones[status] : documentTones[status]\n\n if (!badgeTone) {\n return (\n <Badge padding={2} fontSize={1}>\n Checking...\n </Badge>\n )\n }\n\n const badgeText = isAsset ? assetMessages[status] : documentMessages[status]\n const badgeStatus = isAsset ? assetStatus[status] : status\n\n return (\n <Tooltip\n content={\n <Box padding={3} style={{maxWidth: 200}}>\n <Text size={1}>{badgeText}</Text>\n </Box>\n }\n fallbackPlacements={['right', 'left']}\n placement=\"top\"\n portal\n >\n <Badge padding={3} fontSize={1} tone={badgeTone}>\n {badgeStatus}\n <Box marginLeft={2} display={'inline-block'} as=\"span\">\n <InfoOutlineIcon />\n </Box>\n </Badge>\n </Tooltip>\n )\n}\n","import {isAssetId, isSanityFileAsset} from '@sanity/asset-utils'\nimport type {SanityAssetDocument} from '@sanity/client'\nimport {ArrowRightIcon} from '@sanity/icons/ArrowRight'\nimport {LaunchIcon} from '@sanity/icons/Launch'\nimport {SearchIcon} from '@sanity/icons/Search'\nimport {extractWithPath} from '@sanity/mutator'\nimport {\n Card,\n Container,\n Text,\n Box,\n Button,\n Label,\n Stack,\n Select,\n Flex,\n Checkbox,\n type CardTone,\n useTheme,\n Spinner,\n} from '@sanity/ui'\nimport {getTheme_v2} from '@sanity/ui/theme'\nimport {dset} from 'dset'\nimport {type ChangeEvent, Fragment, useEffect, useEffectEvent, useMemo, useState} from 'react'\nimport {\n useClient,\n Preview,\n useSchema,\n useWorkspaces,\n type WorkspaceSummary,\n type SanityDocument,\n} from 'sanity'\n\nimport {stickyStyles, createInitialMessage} from '../helpers'\nimport {getDocumentsInArray} from '../helpers/getDocumentsInArray'\nimport type {PluginConfig} from '../types'\nimport Feedback from './Feedback'\nimport SelectButtons from './SelectButtons'\nimport StatusBadge, {type MessageTypes} from './StatusBadge'\n\nexport type DuplicatorProps = {\n docs: SanityDocument[]\n token: string\n pluginConfig: Required<PluginConfig>\n onDuplicated?: () => Promise<void>\n}\n\nexport type PayloadItem = {\n doc: SanityDocument\n include: boolean\n status?: keyof MessageTypes\n hasDraft?: boolean\n}\n\ntype WorkspaceOption = WorkspaceSummary & {\n disabled: boolean\n}\n\ntype Message = {\n text: string\n tone: CardTone\n}\n\nfunction isAssetDocument(doc: SanityDocument): doc is SanityDocument & SanityAssetDocument {\n return isAssetId(doc._id)\n}\n\n// Run an async function over every item with a maximum concurrency\nasync function mapWithConcurrency<T>(\n items: T[],\n limit: number,\n fn: (item: T) => Promise<void>,\n): Promise<void> {\n const queue = [...items]\n\n async function work(): Promise<void> {\n const item = queue.shift()\n\n if (item === undefined) {\n return undefined\n }\n\n await fn(item)\n\n return work()\n }\n\n const workers = Array.from({length: Math.min(limit, queue.length)}, () => work())\n\n await Promise.all(workers)\n}\n\nexport default function Duplicator(props: DuplicatorProps) {\n const {docs, token, pluginConfig, onDuplicated} = props\n const theme = useTheme()\n const isDarkMode = getTheme_v2({sanity: theme.sanity}).color._dark\n\n // Prepare origin (this Studio) client\n const originClient = useClient({apiVersion: pluginConfig.apiVersion})\n\n const schema = useSchema()\n\n // Create list of dataset options\n // and set initial value of dropdown\n const workspaces = useWorkspaces()\n const workspacesOptions: WorkspaceOption[] = workspaces.map((workspace) => ({\n ...workspace,\n disabled:\n workspace.dataset === originClient.config().dataset &&\n workspace.projectId === originClient.config().projectId,\n }))\n\n const [destination, setDestination] = useState<WorkspaceOption | null>(\n workspaces.length ? (workspacesOptions.find((space) => !space.disabled) ?? null) : null,\n )\n const [message, setMessage] = useState<Message | null>(null)\n const [payload, setPayload] = useState<PayloadItem[]>([])\n\n const [isDuplicating, setIsDuplicating] = useState(false)\n const [isGathering, setIsGathering] = useState(false)\n const [progress, setProgress] = useState<[number, number]>([0, 0])\n\n // References found in the initial docs\n const initialRefsCount = useMemo(\n () => docs.reduce((acc, doc) => acc + extractWithPath(`.._ref`, doc).length, 0),\n [docs],\n )\n const hasReferences = initialRefsCount > 0\n const initialMessage: Message | null = hasReferences\n ? {tone: `caution`, text: createInitialMessage(docs.length, initialRefsCount)}\n : null\n const displayMessage = message ?? initialMessage\n\n // Check if payload documents exist at destination\n async function updatePayloadStatuses(payloadActual: PayloadItem[], dest: WorkspaceOption | null) {\n if (!payloadActual.length || !dest?.name) {\n return\n }\n\n const payloadIds = payloadActual.map(({doc}) => doc._id)\n const destinationClient = originClient.withConfig({\n dataset: dest.dataset,\n projectId: dest.projectId,\n })\n const destinationData = await destinationClient.fetch<SanityDocument[]>(\n `*[_id in $payloadIds]{ _id, _updatedAt }`,\n {payloadIds},\n )\n\n setPayload(\n payloadActual.map((item) => {\n const existingDoc = destinationData.find((doc) => doc._id === item.doc._id)\n let status: keyof MessageTypes = 'CREATE'\n\n if (existingDoc?._updatedAt && item.doc._updatedAt) {\n if (existingDoc._updatedAt === item.doc._updatedAt) {\n // Exact same document exists at destination\n // We don't compare by _rev because that is updated in a transaction\n status = `EXISTS`\n } else {\n status =\n new Date(existingDoc._updatedAt) > new Date(item.doc._updatedAt)\n ? // Document at destination is newer\n `OVERWRITE`\n : // Document at destination is older\n `UPDATE`\n }\n }\n\n return {...item, status}\n }),\n )\n }\n\n // Build the initial payload and check statuses at the current destination\n const initializePayload = useEffectEvent((nextDocs: SanityDocument[]) => {\n const initialPayload: PayloadItem[] = nextDocs.map((doc) => ({include: true, doc}))\n updatePayloadStatuses(initialPayload, destination).catch(console.error)\n })\n\n // Sync the payload with the docs prop and the destination dataset.\n // setPayload only runs after fetching document statuses from the\n // destination resolves, not synchronously within the effect.\n // See: https://github.com/facebook/react/issues/34743\n useEffect(() => {\n // oxlint-disable-next-line react/react-compiler\n initializePayload(docs)\n }, [docs])\n\n function handleCheckbox(_id: string) {\n setPayload((current) =>\n current.map((item) => (item.doc._id === _id ? {...item, include: !item.include} : item)),\n )\n }\n\n // Find and recursively follow references beginning with this document\n async function handleReferences() {\n setIsGathering(true)\n\n try {\n const docIds = docs.map((doc) => doc._id)\n\n const payloadDocs = await getDocumentsInArray({\n fetchIds: docIds,\n client: originClient,\n pluginConfig,\n })\n const draftDocs = await getDocumentsInArray({\n fetchIds: docIds.map((id) => `drafts.${id}`),\n client: originClient,\n projection: `{_id}`,\n pluginConfig,\n })\n const draftDocsIds = new Set(draftDocs.map(({_id}) => _id))\n\n // Shape it up\n const payloadShaped: PayloadItem[] = payloadDocs.map((doc) => ({\n doc,\n // Include this in the transaction?\n include: true,\n // Does it exist at the destination?\n status: undefined,\n // Does it have any drafts?\n hasDraft: draftDocsIds.has(`drafts.${doc._id}`),\n }))\n\n setPayload(payloadShaped)\n updatePayloadStatuses(payloadShaped, destination).catch(console.error)\n } catch (err) {\n console.error(err)\n }\n\n setIsGathering(false)\n }\n\n // Duplicate payload to destination dataset\n async function handleDuplicate() {\n if (!destination) {\n return\n }\n\n setIsDuplicating(true)\n\n const assetsCount = payload.filter(({doc, include}) => include && isAssetId(doc._id)).length\n let currentProgress = 0\n setProgress([currentProgress, assetsCount])\n\n setMessage({text: 'Duplicating...', tone: `transparent`})\n\n const destinationClient = originClient.withConfig({\n apiVersion: pluginConfig.apiVersion,\n dataset: destination.dataset,\n projectId: destination.projectId,\n })\n\n const transactionDocs: SanityDocument[] = []\n const svgMaps: {old: string; new: string}[] = []\n\n // Upload assets and then add to transaction\n async function processDoc(doc: SanityDocument): Promise<void> {\n if (!isAssetDocument(doc)) {\n transactionDocs.push(doc)\n\n return\n }\n\n // Download and upload asset\n // Get the *original* image with this dlRaw param to create the same deterministic _id\n const typeIsFile = isSanityFileAsset(doc)\n const downloadUrl = typeIsFile ? doc.url : `${doc.url}?dlRaw=true`\n const downloadConfig = typeIsFile ? {} : {headers: {Authorization: `Bearer ${token}`}}\n\n const res = await fetch(downloadUrl, downloadConfig)\n const assetData = await res.blob()\n\n const options = {filename: doc.originalFilename}\n const assetDoc = await destinationClient.assets.upload(\n typeIsFile ? `file` : `image`,\n assetData,\n options,\n )\n\n // SVG _id's need remapping before transaction\n if (doc.extension === 'svg') {\n svgMaps.push({old: doc._id, new: assetDoc._id})\n }\n\n // This adds the newly created asset document to the transaction but ...\n // it doesn't have some of the original asset's metadata like `altText` or `title`\n transactionDocs.push(assetDoc)\n\n // So the original `doc` is added to the transaction as well below\n // However, we don't want to retain the original `url` or `path` values\n // because these strings contain the origin's dataset name\n transactionDocs.push({...doc, url: assetDoc.url, path: assetDoc.path})\n\n currentProgress += 1\n setMessage({\n text: `Duplicating ${currentProgress}/${assetsCount} Assets`,\n tone: 'default',\n })\n setProgress([currentProgress, assetsCount])\n }\n\n try {\n const payloadIncludedDocs = payload.filter((item) => item.include).map((item) => item.doc)\n\n // Promises are limited to three at once\n await mapWithConcurrency(payloadIncludedDocs, 3, processDoc)\n } catch (err) {\n console.error(err)\n setIsDuplicating(false)\n setProgress([0, 0])\n setMessage({tone: 'critical', text: `Duplication Failed`})\n\n return\n }\n\n // Remap SVG references to new _id's\n const transactionDocsMapped = transactionDocs.map((doc) => {\n const expr = `.._ref`\n const references = extractWithPath(expr, doc)\n\n if (!references.length) {\n return doc\n }\n\n // For every found _ref, search for an SVG asset _id and update\n references.forEach((ref) => {\n const newRefValue = svgMaps.find((asset) => asset.old === ref.value)?.new\n\n if (newRefValue) {\n const refPath = ref.path.join('.')\n\n dset(doc, refPath, newRefValue)\n }\n })\n\n return doc\n })\n\n // Create transaction\n const transaction = destinationClient.transaction()\n\n transactionDocsMapped.forEach((doc) => {\n transaction.createOrReplace(doc)\n })\n\n try {\n await transaction.commit()\n setMessage({tone: 'positive', text: 'Duplication complete!'})\n\n updatePayloadStatuses(payload, destination).catch(console.error)\n } catch (err) {\n setMessage({\n tone: 'critical',\n text: err instanceof Error ? err.message : `Duplication Failed`,\n })\n }\n\n setIsDuplicating(false)\n setProgress([0, 0])\n if (onDuplicated) {\n try {\n await onDuplicated()\n } catch (error) {\n const text = error instanceof Error ? error.message : String(error)\n setMessage({tone: 'critical', text: `Error in onDuplicated hook: ${text}`})\n }\n }\n }\n\n function handleChange(e: ChangeEvent<HTMLSelectElement>) {\n if (!workspacesOptions.length) {\n return\n }\n\n const targeted = workspacesOptions.find((space) => space.name === e.currentTarget.value)\n\n if (targeted) {\n setDestination(targeted)\n updatePayloadStatuses(payload, targeted).catch(console.error)\n }\n }\n\n const payloadCount = payload.length\n const firstSvgIndex = payload.findIndex(({doc}) => doc['extension'] === 'svg')\n const selectedDocumentsCount = payload.filter(\n (item) => item.include && !isAssetId(item.doc._id),\n ).length\n const selectedAssetsCount = payload.filter(\n (item) => item.include && isAssetId(item.doc._id),\n ).length\n const selectedTotal = selectedDocumentsCount + selectedAssetsCount\n const destinationTitle = destination?.title ?? destination?.name\n const hasMultipleProjectIds =\n new Set(workspacesOptions.map((space) => space?.projectId).filter(Boolean)).size > 1\n\n const headingText = [selectedTotal, `/`, payloadCount, `Documents and Assets selected`].join(` `)\n\n const buttonTextParts = [`Duplicate`]\n\n if (selectedDocumentsCount > 1) {\n buttonTextParts.push(\n String(selectedDocumentsCount),\n selectedDocumentsCount === 1 ? `Document` : `Documents`,\n )\n }\n\n if (selectedAssetsCount > 1) {\n buttonTextParts.push(\n `and`,\n String(selectedAssetsCount),\n selectedAssetsCount === 1 ? `Asset` : `Assets`,\n )\n }\n\n if (originClient.config().projectId !== destination?.projectId) {\n buttonTextParts.push(`between Projects`)\n }\n\n buttonTextParts.push(`to`, String(destinationTitle))\n\n const buttonText = buttonTextParts.join(` `)\n\n if (workspacesOptions.length < 2) {\n return (\n <Feedback tone=\"critical\">\n <code>sanity.config.ts</code> must contain at least two Workspaces to use this plugin.\n </Feedback>\n )\n }\n\n return (\n <Container width={1}>\n <Card border>\n <Stack>\n <Card padding={4} style={stickyStyles(isDarkMode)}>\n <Stack gap={4}>\n <Flex gap={3}>\n <Stack style={{flex: 1}} gap={3}>\n <Label>Duplicate from</Label>\n <Select readOnly value={workspacesOptions.find((space) => space.disabled)?.name}>\n {workspacesOptions\n .filter((space) => space.disabled)\n .map((space) => (\n <option key={space.name} value={space.name} disabled={space.disabled}>\n {space.title ?? space.name}\n {hasMultipleProjectIds ? ` (${space.projectId})` : ``}\n </option>\n ))}\n </Select>\n </Stack>\n <Box padding={4} paddingTop={5} paddingBottom={0}>\n <Text size={3}>\n <ArrowRightIcon />\n </Text>\n </Box>\n <Stack style={{flex: 1}} gap={3}>\n <Label>To Destination</Label>\n <Select onChange={handleChange}>\n {workspacesOptions.map((space) => (\n <option key={space.name} value={space.name} disabled={space.disabled}>\n {space.title ?? space.name}\n {hasMultipleProjectIds ? ` (${space.projectId})` : ``}\n {space.disabled ? ` (Current)` : ``}\n </option>\n ))}\n </Select>\n </Stack>\n </Flex>\n\n {isDuplicating && (\n <Card border radius={2}>\n <Card\n style={{\n width: '100%',\n transform: `scaleX(${progress[0] / progress[1]})`,\n transformOrigin: 'left',\n transition: 'transform .2s ease',\n boxSizing: 'border-box',\n }}\n padding={1}\n tone=\"positive\"\n />\n </Card>\n )}\n {payload.length > 0 && (\n <>\n <Label>{headingText}</Label>\n <SelectButtons payload={payload} setPayload={setPayload} />\n </>\n )}\n </Stack>\n </Card>\n <Card borderTop padding={4}>\n <Stack gap={3}>\n {displayMessage && (\n <Card padding={3} radius={2} shadow={1} tone={displayMessage.tone}>\n <Text size={1}>{displayMessage.text}</Text>\n </Card>\n )}\n {payload.length > 0 ? (\n <Stack>\n {payload.map(({doc, include, status, hasDraft}, index) => {\n const schemaType = schema.get(doc._type)\n\n return (\n <Fragment key={doc._id}>\n <Flex align=\"center\">\n <Checkbox checked={include} onChange={() => handleCheckbox(doc._id)} />\n <Box flex={1} paddingX={3}>\n {schemaType ? (\n <Preview value={doc} schemaType={schemaType} />\n ) : (\n <Card tone=\"caution\">Invalid schema type</Card>\n )}\n </Box>\n <Flex align=\"center\" gap={2}>\n {hasDraft ? <StatusBadge status=\"UNPUBLISHED\" isAsset={false} /> : null}\n <StatusBadge status={status} isAsset={isAssetId(doc._id)} />\n </Flex>\n </Flex>\n {doc['extension'] === 'svg' && index === firstSvgIndex && (\n <Card padding={3} radius={2} shadow={1} tone=\"caution\">\n <Text size={1}>\n Due to how SVGs are sanitized after first uploaded, duplicated SVG\n assets may have new <code>_id</code>'s at the destination. The newly\n generated <code>_id</code> will be the same in each duplication, but\n it will never be the same <code>_id</code> as the first time this\n Asset was uploaded. References to the asset will be updated to use the\n new <code>_id</code>.\n </Text>\n </Card>\n )}\n </Fragment>\n )\n })}\n </Stack>\n ) : (\n <Flex padding={4} align=\"center\" justify=\"center\">\n <Spinner />\n </Flex>\n )}\n <Stack gap={2}>\n {hasReferences && (\n <Button\n fontSize={2}\n padding={4}\n tone=\"positive\"\n mode=\"ghost\"\n icon={SearchIcon}\n onClick={() => void handleReferences()}\n text=\"Gather References\"\n disabled={isDuplicating || !selectedTotal || isGathering}\n />\n )}\n <Button\n fontSize={2}\n padding={4}\n tone=\"positive\"\n icon={LaunchIcon}\n onClick={() => void handleDuplicate()}\n text={buttonText}\n disabled={isDuplicating || !selectedTotal || isGathering}\n />\n </Stack>\n </Stack>\n </Card>\n </Stack>\n </Card>\n </Container>\n )\n}\n","import {Button, Stack, Box, Label, Text, Card, Flex, Grid, Container, TextInput} from '@sanity/ui'\nimport {type SubmitEvent, useState} from 'react'\nimport {useSchema, useClient, type SanityDocument} from 'sanity'\n\nimport type {PluginConfig} from '../types'\nimport Duplicator from './Duplicator'\n\ntype DuplicatorQueryProps = {\n token: string\n pluginConfig: Required<PluginConfig>\n}\n\ntype InitialData = {\n docs: SanityDocument[]\n}\n\nexport default function DuplicatorQuery(props: DuplicatorQueryProps) {\n const {token, pluginConfig} = props\n\n const {queries: preDefinedQueries, apiVersion} = pluginConfig\n const originClient = useClient({apiVersion})\n\n const schema = useSchema()\n const schemaTypes = schema.getTypeNames()\n\n const [value, setValue] = useState(``)\n const [fetched, setFetched] = useState(false)\n const [initialData, setInitialData] = useState<InitialData>({\n docs: [],\n })\n\n async function runQuery() {\n try {\n const res = await originClient.fetch<SanityDocument[]>(value)\n\n // Ensure queried docs are registered to the schema\n const registeredAndPublishedDocs = res.length\n ? res\n .filter((doc) => schemaTypes.includes(doc._type))\n .filter((doc) => !doc._id.startsWith(`drafts.`))\n : []\n\n setInitialData({\n docs: registeredAndPublishedDocs,\n })\n setFetched(true)\n } catch (err) {\n console.error(err)\n }\n }\n\n function handleSubmit(e?: SubmitEvent<HTMLFormElement>) {\n if (e) e.preventDefault()\n void runQuery()\n }\n\n return (\n <Card padding={[0, 0, 0, 5]}>\n <Container>\n <Grid gridTemplateColumns={[1, 1, 1, 2]} gap={[1, 1, 1, 4]}>\n <Box padding={[2, 2, 2, 0]}>\n <Card padding={4} radius={3} border>\n <Stack gap={4}>\n <Box>\n <Label>Initial Documents Query</Label>\n </Box>\n <Box>\n <Text>\n Start with a valid GROQ query to load initial documents. The query will need to\n return an Array of Objects. Drafts will be removed from the results.\n </Text>\n </Box>\n <form onSubmit={handleSubmit}>\n <Flex>\n <Box flex={1} paddingRight={2}>\n <TextInput\n style={{fontFamily: 'monospace'}}\n fontSize={2}\n onChange={(event) => setValue(event.currentTarget.value)}\n padding={4}\n placeholder={`*[_type == \"article\"]`}\n value={value ?? ``}\n />\n </Box>\n <Button\n padding={2}\n paddingX={4}\n tone=\"primary\"\n onClick={() => handleSubmit()}\n text=\"Query\"\n disabled={!value}\n />\n </Flex>\n </form>\n </Stack>\n </Card>\n {preDefinedQueries && preDefinedQueries?.length > 0 && (\n <Card marginTop={2} padding={4} radius={3} border>\n <Box>\n <Stack gap={4}>\n <Box>\n <Label>Predefined Queries</Label>\n </Box>\n <Stack gap={2}>\n {preDefinedQueries.map((query) => (\n <Button\n key={query.label.replace(/\\s+/g, '-')}\n padding={2}\n paddingX={4}\n tone=\"primary\"\n onClick={() => setValue(`*[${query.query}]`)}\n text={query.label}\n />\n ))}\n </Stack>\n </Stack>\n </Box>\n </Card>\n )}\n </Box>\n {fetched && initialData.docs.length < 1 && (\n <Container width={1}>\n <Card padding={5}>\n {value ? `No documents match this query` : `Start with a valid GROQ query`}\n </Card>\n </Container>\n )}\n {initialData.docs?.length > 0 && (\n <Duplicator docs={initialData.docs} token={token} pluginConfig={pluginConfig} />\n )}\n </Grid>\n </Container>\n </Card>\n )\n}\n","import {Grid, Card, Container, Button} from '@sanity/ui'\nimport {useState, useEffect} from 'react'\nimport {type SanityDocument, useClient} from 'sanity'\n\nimport type {DuplicatorProps} from './Duplicator'\nimport Duplicator from './Duplicator'\n\nexport default function DuplicatorWrapper(props: DuplicatorProps) {\n const {docs, token, pluginConfig, onDuplicated} = props\n const [inbound, setInbound] = useState<SanityDocument[]>([])\n const {follow, apiVersion} = pluginConfig\n\n // Make the first mode the default if there's only one\n const [mode, setMode] = useState<'inbound' | 'outbound'>(\n follow.length === 1 ? (follow[0] ?? 'outbound') : 'outbound',\n )\n const client = useClient({apiVersion})\n\n // \"Inbound\" will start with all documents that reference the first one\n // And then you can gather \"Outbound\" references thereafter\n useEffect(() => {\n async function fetchInbound() {\n const firstDocId = docs[0]?._id\n\n if (!follow.includes(`inbound`) || !firstDocId) {\n return\n }\n\n const inboundReferences = await client.fetch<SanityDocument[]>(`*[references($id)]`, {\n id: firstDocId,\n })\n setInbound([...docs, ...inboundReferences])\n }\n\n fetchInbound().catch(console.error)\n }, [client, docs, follow])\n\n return (\n <Container>\n {follow.length > 1 && (follow.includes(`inbound`) || follow.includes(`outbound`)) ? (\n <Card paddingX={4} paddingBottom={4} marginBottom={4} borderBottom>\n <Grid gridTemplateColumns={2} gap={4}>\n {follow.includes(`outbound`) ? (\n <Button\n mode=\"ghost\"\n tone=\"primary\"\n selected={mode === 'outbound'}\n onClick={() => setMode('outbound')}\n text=\"Outbound\"\n />\n ) : null}\n {follow.includes(`inbound`) ? (\n <Button\n mode=\"ghost\"\n tone=\"primary\"\n selected={mode === 'inbound'}\n onClick={() => setMode('inbound')}\n disabled={inbound.length === 0}\n text={inbound.length > 0 ? `Inbound (${inbound.length})` : 'No inbound references'}\n />\n ) : null}\n </Grid>\n </Card>\n ) : null}\n <Duplicator\n docs={mode === 'outbound' ? docs : inbound}\n token={token}\n pluginConfig={pluginConfig}\n onDuplicated={onDuplicated}\n />\n </Container>\n )\n}\n","import {Button, Flex} from '@sanity/ui'\nimport {useCallback} from 'react'\nimport {useClient} from 'sanity'\n\nimport {SECRET_NAMESPACE} from '../helpers/constants'\n\ntype ResetSecretProps = {\n apiVersion: string\n}\n\nexport default function ResetSecret({apiVersion}: ResetSecretProps) {\n const client = useClient({apiVersion})\n\n const handleClick = useCallback(() => {\n client.delete({query: `*[_id == \"secrets.${SECRET_NAMESPACE}\"]`}).catch(console.error)\n }, [client])\n\n return (\n <Flex align=\"center\" justify=\"flex-end\" paddingX={[2, 2, 2, 5]} paddingY={5}>\n <Button\n text=\"Reset Secret\"\n onClick={handleClick}\n mode=\"ghost\"\n tone=\"critical\"\n fontSize={1}\n padding={2}\n />\n </Flex>\n )\n}\n","import {useSecrets, SettingsView} from '@sanity/studio-secrets'\nimport {Flex, Box, Spinner} from '@sanity/ui'\nimport type {SanityDocument} from 'sanity'\n\nimport {useCrossDatasetDuplicatorConfig} from '../context/ConfigProvider'\nimport {SECRET_NAMESPACE} from '../helpers/constants'\nimport DuplicatorQuery from './DuplicatorQuery'\nimport DuplicatorWrapper from './DuplicatorWrapper'\nimport Feedback from './Feedback'\nimport ResetSecret from './ResetSecret'\n\n// Check for auth secret (required for asset uploads)\nconst secretConfigKeys = [\n {\n key: 'bearerToken',\n title:\n 'An API token with Viewer permissions is required to duplicate the original files of assets, and will be used for all Duplications. Create one at sanity.io/manage',\n description: '',\n },\n]\n\ntype Secrets = {\n bearerToken?: string\n}\n\ntype CrossDatasetDuplicatorProps = {\n mode: 'tool' | 'action'\n docs: SanityDocument[]\n onDuplicated?: () => Promise<void>\n}\n\nexport default function CrossDatasetDuplicator(props: CrossDatasetDuplicatorProps) {\n const {mode, docs, onDuplicated} = props\n const pluginConfig = useCrossDatasetDuplicatorConfig()\n\n const {loading, secrets} = useSecrets<Secrets>(SECRET_NAMESPACE)\n\n if (loading) {\n return (\n <Flex justify=\"center\" align=\"center\">\n <Box padding={5}>\n <Spinner />\n </Box>\n </Flex>\n )\n }\n\n // A bearer token is required to duplicate assets, so the prompt cannot be\n // dismissed until one is saved\n if (!secrets?.bearerToken) {\n return (\n <SettingsView\n title=\"Token Required\"\n namespace={SECRET_NAMESPACE}\n keys={secretConfigKeys}\n onClose={() => null}\n />\n )\n }\n\n if (mode === 'tool' && pluginConfig) {\n return (\n <>\n <DuplicatorQuery token={secrets.bearerToken} pluginConfig={pluginConfig} />\n <ResetSecret apiVersion={pluginConfig.apiVersion} />\n </>\n )\n }\n\n if (!docs?.length) {\n return <Feedback>No docs passed into Duplicator Tool</Feedback>\n }\n\n if (!pluginConfig) {\n return <Feedback>No plugin config</Feedback>\n }\n\n return (\n <DuplicatorWrapper\n docs={docs}\n token={secrets.bearerToken}\n pluginConfig={pluginConfig}\n onDuplicated={onDuplicated}\n />\n )\n}\n","import type {CrossDatasetDuplicatorActionProps} from '../types'\nimport CrossDatasetDuplicator from './CrossDatasetDuplicator'\n\n/**\n * Component to perform a migration from the Cross Dataset Duplicator plugin\n * @public\n */\nexport function CrossDatasetDuplicatorAction(props: CrossDatasetDuplicatorActionProps) {\n const {docs, onDuplicated} = props\n\n return <CrossDatasetDuplicator mode=\"action\" docs={docs} onDuplicated={onDuplicated} />\n}\n","import {LaunchIcon} from '@sanity/icons/Launch'\nimport {useState} from 'react'\nimport type {DocumentActionProps} from 'sanity'\n\nimport {CrossDatasetDuplicatorAction} from '../components/CrossDatasetDuplicatorAction'\n\n/**\n * Document action from the Cross Dataset Duplicator plugin\n * @public\n */\nexport const DuplicateToAction = (props: DocumentActionProps) => {\n const {draft, published} = props\n const [dialogOpen, setDialogOpen] = useState(false)\n\n return {\n disabled: Boolean(draft),\n title: draft ? `Document must be Published to begin` : null,\n label: 'Duplicate to...',\n dialog: dialogOpen &&\n published && {\n type: 'modal',\n title: 'Cross Dataset Duplicator',\n content: <CrossDatasetDuplicatorAction docs={[published]} />,\n onClose: () => setDialogOpen(false),\n },\n onHandle: () => setDialogOpen(true),\n icon: LaunchIcon,\n }\n}\n\nDuplicateToAction.action = 'duplicateTo'\n","import type {SanityDocument, Tool} from 'sanity'\n\nimport CrossDatasetDuplicator from './CrossDatasetDuplicator'\n\nexport type MultiToolConfig = {\n docs: SanityDocument[]\n}\n\ntype CrossDatasetDuplicatorProps = {\n tool: Tool<MultiToolConfig>\n}\n\nexport function CrossDatasetDuplicatorTool(props: CrossDatasetDuplicatorProps) {\n const {docs = []} = props.tool.options ?? {}\n\n return <CrossDatasetDuplicator mode=\"tool\" docs={docs} />\n}\n","import {LaunchIcon} from '@sanity/icons/Launch'\nimport type {Tool} from 'sanity'\n\nimport {\n CrossDatasetDuplicatorTool,\n type MultiToolConfig,\n} from '../components/CrossDatasetDuplicatorTool'\n\nexport const crossDatasetDuplicatorTool = (): Tool<MultiToolConfig> => ({\n title: 'Duplicator',\n name: 'duplicator',\n icon: LaunchIcon,\n component: CrossDatasetDuplicatorTool,\n options: {\n docs: [],\n },\n})\n","import {definePlugin} from 'sanity'\n\nimport {DuplicateToAction} from './actions/DuplicateToAction'\nimport {ConfigProvider} from './context/ConfigProvider'\nimport {DEFAULT_CONFIG} from './helpers/constants'\nimport {crossDatasetDuplicatorTool} from './tool'\nimport type {PluginConfig} from './types'\n\n/**\n * Plugin: Cross Dataset Duplicator\n * @public\n */\nexport const crossDatasetDuplicator = definePlugin<Partial<PluginConfig> | void>((config = {}) => {\n const pluginConfig = {...DEFAULT_CONFIG, ...config}\n const {types} = pluginConfig\n\n return {\n name: '@sanity/cross-dataset-duplicator',\n tools: (prev) => (pluginConfig.tool ? [...prev, crossDatasetDuplicatorTool()] : prev),\n studio: {\n components: {\n layout: (props) => <ConfigProvider {...props} pluginConfig={pluginConfig} />,\n },\n },\n document: {\n actions: (prev, {schemaType}) => {\n return types && types.includes(schemaType) ? [...prev, DuplicateToAction] : prev\n },\n },\n }\n})\n"],"names":["SECRET_NAMESPACE","DEFAULT_CONFIG","apiVersion","tool","types","filter","follow","queries","CrossDatasetDuplicatorContext","createContext","useCrossDatasetDuplicatorConfig","useContext","ConfigProvider","props","$","_c","T0","t0","t1","pluginConfig","rest","Provider","renderDefault","t2","createInitialMessage","docCount","refsCount","join","stickyStyles","isDarkMode","position","top","zIndex","backgroundColor","getDocumentsInArray","options","fetchIds","client","currentIds","projection","collection","query","Boolean","data","fetch","length","localCurrentIds","Set","newDataIds","map","dataDoc","_id","id","size","has","push","add","Promise","all","doc","references","extractWithPath","flatMap","ref","value","newReferenceIds","referenceDocs","Array","from","seenIds","uniqueCollection","Feedback","children","tone","undefined","buttons","label","action","divider","shouldInclude","item","status","isAssetId","include","SelectButtons","payload","setPayload","every","_temp","disabledActions","setDisabledActions","useState","current","item_0","handleSelectButton","button","includes","t3","documentTones","EXISTS","OVERWRITE","UPDATE","CREATE","UNPUBLISHED","assetTones","documentMessages","assetMessages","assetStatus","StatusBadge","isAsset","badgeTone","Symbol","for","badgeText","badgeStatus","maxWidth","t4","t5","isAssetDocument","mapWithConcurrency","items","limit","fn","queue","work","shift","workers","Math","min","Duplicator","docs","token","onDuplicated","theme","useTheme","getTheme_v2","sanity","color","_dark","originClient","useClient","schema","useSchema","workspaces","useWorkspaces","workspace","disabled","dataset","config","projectId","workspacesOptions","destination","setDestination","find","message","setMessage","isDuplicating","setIsDuplicating","isGathering","setIsGathering","progress","setProgress","initialRefsCount","reduce","_temp2","hasReferences","text","displayMessage","payloadActual","dest","name","payloadIds","_temp3","destinationData","withConfig","existingDoc","doc_1","_updatedAt","Date","updatePayloadStatuses","t6","nextDocs","initialPayload","_temp4","catch","console","error","initializePayload","useEffectEvent","t7","t8","useEffect","t9","handleCheckbox","t10","docIds","_temp5","payloadDocs","draftDocs","_temp6","draftDocsIds","_temp7","payloadShaped","doc_4","hasDraft","t11","err","handleReferences","assetsCount","_temp8","currentProgress","destinationClient_0","transactionDocs","svgMaps","processDoc","doc_6","typeIsFile","isSanityFileAsset","downloadUrl","url","downloadConfig","headers","Authorization","assetData","blob","filename","originalFilename","assetDoc","destinationClient","assets","upload","extension","old","new","path","payloadIncludedDocs","_temp9","_temp0","t12","transactionDocsMapped","doc_7","forEach","newRefValue","asset","refPath","dset","transaction","doc_8","createOrReplace","commit","t13","Error","t14","String","handleDuplicate","handleChange","e","targeted","space_0","space","currentTarget","payloadCount","findIndex","_temp1","firstSvgIndex","_temp10","selectedDocumentsCount","_temp11","selectedAssetsCount","selectedTotal","destinationTitle","title","hasMultipleProjectIds","_temp12","t15","headingText","buttonTextParts","buttonText","t16","t17","flex","t18","t19","space_4","t20","Stack","t21","t22","t23","T1","Select","t24","space_5","t25","t26","t27","t28","width","transform","transformOrigin","transition","boxSizing","t29","t30","t31","t32","index","doc_10","include_0","status_0","schemaType","get","_type","Fragment","SearchIcon","t33","t34","t35","LaunchIcon","t36","t37","_temp13","_temp14","space_3","space_2","space_1","item_4","item_3","doc_9","item_2","item_1","doc_5","_id_0","doc_3","doc_2","doc_0","acc","DuplicatorQuery","preDefinedQueries","schemaTypes","getTypeNames","setValue","fetched","setFetched","initialData","setInitialData","runQuery","res","registeredAndPublishedDocs","startsWith","handleSubmit","preventDefault","fontFamily","event","replace","DuplicatorWrapper","inbound","setInbound","mode","setMode","fetchInbound","firstDocId","inboundReferences","ResetSecret","delete","handleClick","secretConfigKeys","key","description","CrossDatasetDuplicator","loading","secrets","useSecrets","bearerToken","CrossDatasetDuplicatorAction","DuplicateToAction","draft","published","dialogOpen","setDialogOpen","dialog","type","content","onClose","onHandle","icon","CrossDatasetDuplicatorTool","crossDatasetDuplicatorTool","component","crossDatasetDuplicator","definePlugin","tools","prev","studio","components","layout","document","actions"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sanity/cross-dataset-duplicator",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.2",
|
|
4
4
|
"description": "Empower content editors to migrate Documents and Assets between Sanity Projects and Datasets from inside Sanity Studio",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"sanity",
|
|
@@ -28,23 +28,23 @@
|
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"@sanity/asset-utils": "^2.3.0",
|
|
31
|
-
"@sanity/icons": "^
|
|
32
|
-
"@sanity/mutator": "^6.
|
|
33
|
-
"@sanity/ui": "^3.
|
|
34
|
-
"dset": "^3.1.
|
|
35
|
-
"@sanity/studio-secrets": "4.0.5"
|
|
31
|
+
"@sanity/icons": "^4.1.0",
|
|
32
|
+
"@sanity/mutator": "^6.3.0",
|
|
33
|
+
"@sanity/ui": "^3.3.0",
|
|
34
|
+
"dset": "^3.1.4",
|
|
35
|
+
"@sanity/studio-secrets": "^4.0.5"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@sanity/client": "^7.23.0",
|
|
39
|
-
"@sanity/pkg-utils": "^10.
|
|
39
|
+
"@sanity/pkg-utils": "^10.8.2",
|
|
40
40
|
"@types/react": "^19.2.17",
|
|
41
41
|
"@types/react-dom": "^19.2.3",
|
|
42
42
|
"babel-plugin-react-compiler": "^1.0.0",
|
|
43
43
|
"babel-plugin-styled-components": "^2.3.0",
|
|
44
44
|
"react": "^19.2.7",
|
|
45
45
|
"react-dom": "^19.2.7",
|
|
46
|
-
"sanity": "^6.
|
|
47
|
-
"styled-components": "^6.4.
|
|
46
|
+
"sanity": "^6.3.0",
|
|
47
|
+
"styled-components": "^6.4.3",
|
|
48
48
|
"@repo/package.config": "0.0.0",
|
|
49
49
|
"@repo/tsconfig": "0.0.0"
|
|
50
50
|
},
|