@sanity/cross-dataset-duplicator
2.0.62.0.7
~
Modified (4 files)
Index: package/dist/index.js
===================================================================
--- package/dist/index.js
+++ package/dist/index.js
@@ -297,9 +297,10 @@
}));
}, $[10] = originClient, $[11] = setPayload, $[12] = t5) : t5 = $[12];
let updatePayloadStatuses = t5, t6;
$[13] !== destination || $[14] !== updatePayloadStatuses ? (t6 = (nextDocs) => {
- updatePayloadStatuses(nextDocs.map(_temp4), destination).catch(console.error);
+ let initialPayload = nextDocs.map(_temp4);
+ updatePayloadStatuses(initialPayload, destination).catch(console.error);
}, $[13] = destination, $[14] = updatePayloadStatuses, $[15] = t6) : t6 = $[15];
let initializePayload = useEffectEvent(t6), t7;
$[16] !== docs || $[17] !== initializePayload ? (t7 = () => {
initializePayload(docs);
@@ -402,12 +403,12 @@
}
if (setIsDuplicating(!1), setProgress([0, 0]), onDuplicated) try {
await onDuplicated();
} catch (t14) {
- let error = t14;
+ let error = t14, text = error instanceof Error ? error.message : String(error);
setMessage({
tone: "critical",
- text: `Error in onDuplicated hook: ${error instanceof Error ? error.message : String(error)}`
+ text: `Error in onDuplicated hook: ${text}`
});
}
}, $[30] = destination, $[31] = onDuplicated, $[32] = originClient, $[33] = payload, $[34] = pluginConfig.apiVersion, $[35] = token, $[36] = updatePayloadStatuses, $[37] = t11) : t11 = $[37];
let handleDuplicate = t11, handleChange = function(e) {
@@ -705,10 +706,10 @@
function DuplicatorQuery(props) {
let { token, pluginConfig } = props, { queries: preDefinedQueries, apiVersion } = pluginConfig, originClient = useClient({ apiVersion }), schemaTypes = useSchema().getTypeNames(), [value, setValue] = useState(""), [fetched, setFetched] = useState(!1), [initialData, setInitialData] = useState({ docs: [] });
async function runQuery() {
try {
- let res = await originClient.fetch(value);
- setInitialData({ docs: res.length ? res.filter((doc) => schemaTypes.includes(doc._type)).filter((doc_0) => !doc_0._id.startsWith("drafts.")) : [] }), setFetched(!0);
+ let res = await originClient.fetch(value), registeredAndPublishedDocs = res.length ? res.filter((doc) => schemaTypes.includes(doc._type)).filter((doc_0) => !doc_0._id.startsWith("drafts.")) : [];
+ setInitialData({ docs: registeredAndPublishedDocs }), setFetched(!0);
} catch (err) {
console.error(err);
}
} Index: package/package.json
===================================================================
--- package/package.json
+++ package/package.json
@@ -1,7 +1,7 @@
{
"name": "@sanity/cross-dataset-duplicator",
- "version": "2.0.6",
+ "version": "2.0.7",
"description": "Empower content editors to migrate Documents and Assets between Sanity Projects and Datasets from inside Sanity Studio",
"keywords": [
"sanity",
"sanity-plugin"
@@ -29,24 +29,24 @@
"dependencies": {
"@sanity/asset-utils": "^2.3.0",
"@sanity/icons": "^5.0.0",
"@sanity/mutator": "^6.3.0",
- "@sanity/ui": "^3.3.1",
+ "@sanity/ui": "^3.3.5",
"dset": "^3.1.4",
- "@sanity/studio-secrets": "^4.0.8"
+ "@sanity/studio-secrets": "^4.0.9"
},
"devDependencies": {
"@sanity/client": "^7.23.0",
"@sanity/tsconfig": "^2.2.0",
- "@sanity/tsdown-config": "^0.11.0",
+ "@sanity/tsdown-config": "^0.13.1",
"@types/react": "^19.2.17",
"@types/react-dom": "^19.2.3",
"babel-plugin-react-compiler": "^1.0.0",
"react": "^19.2.7",
"react-dom": "^19.2.7",
"sanity": "^6.3.0",
"styled-components": "^6.4.3",
- "tsdown": "^0.22.3"
+ "tsdown": "^0.22.5"
},
"peerDependencies": {
"react": "^19.2",
"react-dom": "^19.2", Index: package/dist/index.d.ts.map
===================================================================
--- package/dist/index.d.ts.map
+++ package/dist/index.d.ts.map
@@ -1,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":";;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;AAAA,mCCFD,KAAA,EAAO,mBAAA;;;;;;;;;;;eAAA,UAAA;AAAA;AAAA;;;;;AFNlC;AAMP;iBGIgB,+BAAA,IAA+B,QAAA,CAAA,YAAA;;;AHdL;;iBIO1B,4BAAA,CAA6B,KAAA,EAAO,iCAAiC,mBAAA,GAAA,CAAA,OAAA"}
\ No newline at end of file
+{"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;EACH;EACA;;;;;;UAMe;EACf;EACA;EACA;EACA;EACA;EACA,UAAU;;;;;;KAOA;EACV,MAAM;EACN,qBAAqB;;;;;;cCbV,yCAAsB,cAAA,QAAA;mCCFD,OAAO;;;;;;;;;;;eAAA;;;;;;;;;iBCIzB,mCAA+B,SAAA;;;;;iBCP/B,6BAA6B,OAAO,oDAAiC,IAAA"}
\ No newline at end of file Index: package/dist/index.js.map
===================================================================
--- package/dist/index.js.map
+++ package/dist/index.js.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.js","names":["PluginConfig","SECRET_NAMESPACE","DEFAULT_CONFIG","Required","apiVersion","tool","types","filter","follow","queries","createContext","useContext","LayoutProps","DEFAULT_CONFIG","PluginConfig","CrossDatasetDuplicatorContext","ConfigProviderProps","pluginConfig","Required","useCrossDatasetDuplicatorConfig","ConfigProvider","props","$","_c","T0","t0","t1","rest","Provider","renderDefault","t2","CSSProperties","createInitialMessage","docCount","refsCount","message","join","stickyStyles","isDarkMode","position","top","zIndex","backgroundColor","extractWithPath","SanityClient","SanityDocument","PluginConfig","OptionsBag","fetchIds","client","pluginConfig","currentIds","Set","projection","getDocumentsInArray","options","Promise","collection","filter","Boolean","join","query","data","fetch","length","localCurrentIds","newDataIds","map","dataDoc","_id","id","size","has","push","add","all","doc","expr","references","flatMap","ref","value","newReferenceIds","referenceDocs","Array","from","seenIds","uniqueCollection","Card","Text","BadgeTone","ReactNode","FeedbackProps","children","tone","Feedback","props","$","_c","t0","undefined","t1","t2","isAssetId","Button","Card","Flex","Dispatch","SetStateAction","useState","PayloadItem","Action","ButtonItem","label","action","divider","buttons","shouldInclude","item","status","doc","_id","include","SelectButtonsProps","payload","setPayload","SelectButtons","props","$","_c","t0","length","every","_temp","disabledActions","setDisabledActions","t1","handleSelectButton","current","map","item_0","t2","button","includes","t3","InfoOutlineIcon","Box","Text","Badge","Tooltip","BadgeTone","StatusTones","EXISTS","OVERWRITE","UPDATE","CREATE","UNPUBLISHED","documentTones","assetTones","MessageTypes","documentMessages","assetMessages","assetStatus","StatusBadgeProps","isAsset","status","StatusBadge","props","$","_c","badgeTone","t0","Symbol","for","badgeText","badgeStatus","maxWidth","t1","t2","t3","t4","t5","isAssetId","isSanityFileAsset","SanityAssetDocument","ArrowRightIcon","LaunchIcon","SearchIcon","extractWithPath","Card","Container","Text","Box","Button","Label","Stack","Select","Flex","Checkbox","CardTone","useTheme","Spinner","getTheme_v2","dset","ChangeEvent","Fragment","useEffect","useEffectEvent","useMemo","useState","useClient","Preview","useSchema","useWorkspaces","WorkspaceSummary","SanityDocument","stickyStyles","createInitialMessage","getDocumentsInArray","PluginConfig","Feedback","SelectButtons","StatusBadge","MessageTypes","DuplicatorProps","docs","token","pluginConfig","Required","onDuplicated","Promise","PayloadItem","doc","include","status","hasDraft","WorkspaceOption","disabled","Message","text","tone","isAssetDocument","_id","mapWithConcurrency","items","T","limit","fn","item","queue","work","shift","undefined","workers","Array","from","length","Math","min","all","Duplicator","props","$","_c","theme","isDarkMode","sanity","color","_dark","t0","apiVersion","originClient","schema","workspaces","t1","workspace","dataset","config","projectId","workspacesOptions","map","destination","setDestination","find","_temp","message","setMessage","t2","Symbol","for","payload","setPayload","isDuplicating","setIsDuplicating","isGathering","setIsGathering","t3","progress","setProgress","initialRefsCount","reduce","_temp2","hasReferences","t4","initialMessage","displayMessage","t5","updatePayloadStatuses","payloadActual","dest","name","payloadIds","_temp3","destinationClient","withConfig","destinationData","fetch","existingDoc","doc_1","_updatedAt","Date","t6","nextDocs","initialPayload","_temp4","catch","console","error","initializePayload","t7","t8","t9","handleCheckbox","current","item_0","t10","handleReferences","docIds","_temp5","payloadDocs","fetchIds","client","draftDocs","_temp6","projection","draftDocsIds","Set","_temp7","payloadShaped","doc_4","has","t11","err","handleDuplicate","assetsCount","filter","_temp8","currentProgress","destinationClient_0","transactionDocs","svgMaps","processDoc","doc_6","push","typeIsFile","downloadUrl","url","downloadConfig","headers","Authorization","res","assetData","blob","options","filename","originalFilename","assetDoc","assets","upload","extension","old","new","path","payloadIncludedDocs","_temp9","_temp0","t12","transactionDocsMapped","doc_7","references","forEach","ref","newRefValue","asset","value","refPath","join","transaction","doc_8","createOrReplace","commit","t13","Error","t14","String","handleChange","e","targeted","space_0","space","currentTarget","payloadCount","findIndex","_temp1","firstSvgIndex","_temp10","selectedDocumentsCount","_temp11","selectedAssetsCount","selectedTotal","destinationTitle","title","hasMultipleProjectIds","_temp12","Boolean","size","t15","headingText","buttonTextParts","buttonText","t16","t17","flex","t18","t19","space_4","t20","T0","t21","t22","t23","T1","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","t33","t34","t35","t36","t37","_temp13","_temp14","space_3","space_2","space_1","item_4","item_3","doc_9","item_2","item_1","doc_5","_id_0","id","doc_3","doc_2","doc_0","acc","Button","Stack","Box","Label","Text","Card","Flex","Grid","Container","TextInput","SubmitEvent","useState","useSchema","useClient","SanityDocument","PluginConfig","Duplicator","DuplicatorQueryProps","token","pluginConfig","Required","InitialData","docs","DuplicatorQuery","props","queries","preDefinedQueries","apiVersion","originClient","schema","schemaTypes","getTypeNames","value","setValue","fetched","setFetched","initialData","setInitialData","runQuery","res","fetch","registeredAndPublishedDocs","length","filter","doc","includes","_type","_id","startsWith","err","console","error","handleSubmit","e","HTMLFormElement","preventDefault","fontFamily","event","currentTarget","map","query","label","replace","Grid","Card","Container","Button","useState","useEffect","SanityDocument","useClient","DuplicatorProps","Duplicator","DuplicatorWrapper","props","$","_c","docs","token","pluginConfig","onDuplicated","t0","Symbol","for","inbound","setInbound","follow","apiVersion","mode","setMode","length","t1","client","t2","t3","fetchInbound","firstDocId","_id","includes","inboundReferences","fetch","id","catch","console","error","t4","t5","t6","t7","Button","Flex","useCallback","useClient","SECRET_NAMESPACE","ResetSecretProps","apiVersion","ResetSecret","t0","$","_c","t1","client","t2","delete","query","catch","console","error","handleClick","t3","Symbol","for","t4","useSecrets","SettingsView","Flex","Box","Spinner","SanityDocument","useCrossDatasetDuplicatorConfig","SECRET_NAMESPACE","DuplicatorQuery","DuplicatorWrapper","Feedback","ResetSecret","secretConfigKeys","key","title","description","Secrets","bearerToken","CrossDatasetDuplicatorProps","mode","docs","onDuplicated","Promise","CrossDatasetDuplicator","props","$","_c","pluginConfig","loading","secrets","t0","Symbol","for","_temp","t1","apiVersion","t2","length","CrossDatasetDuplicatorActionProps","CrossDatasetDuplicator","CrossDatasetDuplicatorAction","props","$","_c","docs","onDuplicated","t0","LaunchIcon","useState","DocumentActionProps","CrossDatasetDuplicatorAction","DuplicateToAction","props","draft","published","dialogOpen","setDialogOpen","disabled","Boolean","title","label","dialog","type","content","onClose","onHandle","icon","action","SanityDocument","Tool","CrossDatasetDuplicator","MultiToolConfig","docs","CrossDatasetDuplicatorProps","tool","CrossDatasetDuplicatorTool","props","$","_c","t0","options","t1","t2","undefined","t3","LaunchIcon","Tool","CrossDatasetDuplicatorTool","MultiToolConfig","crossDatasetDuplicatorTool","title","name","icon","component","options","docs","definePlugin","DuplicateToAction","ConfigProvider","DEFAULT_CONFIG","crossDatasetDuplicatorTool","PluginConfig","crossDatasetDuplicator","Partial","config","pluginConfig","types","name","tools","prev","tool","studio","components","layout","props","document","actions","schemaType","includes"],"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"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["PluginConfig","SECRET_NAMESPACE","DEFAULT_CONFIG","Required","apiVersion","tool","types","filter","follow","queries","createContext","useContext","LayoutProps","DEFAULT_CONFIG","PluginConfig","CrossDatasetDuplicatorContext","ConfigProviderProps","pluginConfig","Required","useCrossDatasetDuplicatorConfig","ConfigProvider","props","$","_c","T0","t0","t1","rest","Provider","renderDefault","t2","CSSProperties","createInitialMessage","docCount","refsCount","message","join","stickyStyles","isDarkMode","position","top","zIndex","backgroundColor","extractWithPath","SanityClient","SanityDocument","PluginConfig","OptionsBag","fetchIds","client","pluginConfig","currentIds","Set","projection","getDocumentsInArray","options","Promise","collection","filter","Boolean","join","query","data","fetch","length","localCurrentIds","newDataIds","map","dataDoc","_id","id","size","has","push","add","all","doc","expr","references","flatMap","ref","value","newReferenceIds","referenceDocs","Array","from","seenIds","uniqueCollection","Card","Text","BadgeTone","ReactNode","FeedbackProps","children","tone","Feedback","props","$","_c","t0","undefined","t1","t2","isAssetId","Button","Card","Flex","Dispatch","SetStateAction","useState","PayloadItem","Action","ButtonItem","label","action","divider","buttons","shouldInclude","item","status","doc","_id","include","SelectButtonsProps","payload","setPayload","SelectButtons","props","$","_c","t0","length","every","_temp","disabledActions","setDisabledActions","t1","handleSelectButton","current","map","item_0","t2","button","includes","t3","InfoOutlineIcon","Box","Text","Badge","Tooltip","BadgeTone","StatusTones","EXISTS","OVERWRITE","UPDATE","CREATE","UNPUBLISHED","documentTones","assetTones","MessageTypes","documentMessages","assetMessages","assetStatus","StatusBadgeProps","isAsset","status","StatusBadge","props","$","_c","badgeTone","t0","Symbol","for","badgeText","badgeStatus","maxWidth","t1","t2","t3","t4","t5","isAssetId","isSanityFileAsset","SanityAssetDocument","ArrowRightIcon","LaunchIcon","SearchIcon","extractWithPath","Card","Container","Text","Box","Button","Label","Stack","Select","Flex","Checkbox","CardTone","useTheme","Spinner","getTheme_v2","dset","ChangeEvent","Fragment","useEffect","useEffectEvent","useMemo","useState","useClient","Preview","useSchema","useWorkspaces","WorkspaceSummary","SanityDocument","stickyStyles","createInitialMessage","getDocumentsInArray","PluginConfig","Feedback","SelectButtons","StatusBadge","MessageTypes","DuplicatorProps","docs","token","pluginConfig","Required","onDuplicated","Promise","PayloadItem","doc","include","status","hasDraft","WorkspaceOption","disabled","Message","text","tone","isAssetDocument","_id","mapWithConcurrency","items","T","limit","fn","item","queue","work","shift","undefined","workers","Array","from","length","Math","min","all","Duplicator","props","$","_c","theme","isDarkMode","sanity","color","_dark","t0","apiVersion","originClient","schema","workspaces","t1","workspace","dataset","config","projectId","workspacesOptions","map","destination","setDestination","find","_temp","message","setMessage","t2","Symbol","for","payload","setPayload","isDuplicating","setIsDuplicating","isGathering","setIsGathering","t3","progress","setProgress","initialRefsCount","reduce","_temp2","hasReferences","t4","initialMessage","displayMessage","t5","updatePayloadStatuses","payloadActual","dest","name","payloadIds","_temp3","destinationClient","withConfig","destinationData","fetch","existingDoc","doc_1","_updatedAt","Date","t6","nextDocs","initialPayload","_temp4","catch","console","error","initializePayload","t7","t8","t9","handleCheckbox","current","item_0","t10","handleReferences","docIds","_temp5","payloadDocs","fetchIds","client","draftDocs","_temp6","projection","draftDocsIds","Set","_temp7","payloadShaped","doc_4","has","t11","err","handleDuplicate","assetsCount","filter","_temp8","currentProgress","destinationClient_0","transactionDocs","svgMaps","processDoc","doc_6","push","typeIsFile","downloadUrl","url","downloadConfig","headers","Authorization","res","assetData","blob","options","filename","originalFilename","assetDoc","assets","upload","extension","old","new","path","payloadIncludedDocs","_temp9","_temp0","t12","transactionDocsMapped","doc_7","references","forEach","ref","newRefValue","asset","value","refPath","join","transaction","doc_8","createOrReplace","commit","t13","Error","t14","String","handleChange","e","targeted","space_0","space","currentTarget","payloadCount","findIndex","_temp1","firstSvgIndex","_temp10","selectedDocumentsCount","_temp11","selectedAssetsCount","selectedTotal","destinationTitle","title","hasMultipleProjectIds","_temp12","Boolean","size","t15","headingText","buttonTextParts","buttonText","t16","t17","flex","t18","t19","space_4","t20","T0","t21","t22","t23","T1","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","t33","t34","t35","t36","t37","_temp13","_temp14","space_3","space_2","space_1","item_4","item_3","doc_9","item_2","item_1","doc_5","_id_0","id","doc_3","doc_2","doc_0","acc","Button","Stack","Box","Label","Text","Card","Flex","Grid","Container","TextInput","SubmitEvent","useState","useSchema","useClient","SanityDocument","PluginConfig","Duplicator","DuplicatorQueryProps","token","pluginConfig","Required","InitialData","docs","DuplicatorQuery","props","queries","preDefinedQueries","apiVersion","originClient","schema","schemaTypes","getTypeNames","value","setValue","fetched","setFetched","initialData","setInitialData","runQuery","res","fetch","registeredAndPublishedDocs","length","filter","doc","includes","_type","_id","startsWith","err","console","error","handleSubmit","e","HTMLFormElement","preventDefault","fontFamily","event","currentTarget","map","query","label","replace","Grid","Card","Container","Button","useState","useEffect","SanityDocument","useClient","DuplicatorProps","Duplicator","DuplicatorWrapper","props","$","_c","docs","token","pluginConfig","onDuplicated","t0","Symbol","for","inbound","setInbound","follow","apiVersion","mode","setMode","length","t1","client","t2","t3","fetchInbound","firstDocId","_id","includes","inboundReferences","fetch","id","catch","console","error","t4","t5","t6","t7","Button","Flex","useCallback","useClient","SECRET_NAMESPACE","ResetSecretProps","apiVersion","ResetSecret","t0","$","_c","t1","client","t2","delete","query","catch","console","error","handleClick","t3","Symbol","for","t4","useSecrets","SettingsView","Flex","Box","Spinner","SanityDocument","useCrossDatasetDuplicatorConfig","SECRET_NAMESPACE","DuplicatorQuery","DuplicatorWrapper","Feedback","ResetSecret","secretConfigKeys","key","title","description","Secrets","bearerToken","CrossDatasetDuplicatorProps","mode","docs","onDuplicated","Promise","CrossDatasetDuplicator","props","$","_c","pluginConfig","loading","secrets","t0","Symbol","for","_temp","t1","apiVersion","t2","length","CrossDatasetDuplicatorActionProps","CrossDatasetDuplicator","CrossDatasetDuplicatorAction","props","$","_c","docs","onDuplicated","t0","LaunchIcon","useState","DocumentActionProps","CrossDatasetDuplicatorAction","DuplicateToAction","props","draft","published","dialogOpen","setDialogOpen","disabled","Boolean","title","label","dialog","type","content","onClose","onHandle","icon","action","SanityDocument","Tool","CrossDatasetDuplicator","MultiToolConfig","docs","CrossDatasetDuplicatorProps","tool","CrossDatasetDuplicatorTool","props","$","_c","t0","options","t1","t2","undefined","t3","LaunchIcon","Tool","CrossDatasetDuplicatorTool","MultiToolConfig","crossDatasetDuplicatorTool","title","name","icon","component","options","docs","definePlugin","DuplicateToAction","ConfigProvider","DEFAULT_CONFIG","crossDatasetDuplicatorTool","PluginConfig","crossDatasetDuplicator","Partial","config","pluginConfig","types","name","tools","prev","tool","studio","components","layout","props","document","actions","schemaType","includes"],"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"],"mappings":"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"}
\ No newline at end of file