@sanity/cross-dataset-duplicator 0.3.0 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,15 +1,24 @@
1
- # Sanity Cross Dataset Duplicator
1
+ # Cross Dataset Duplicator
2
2
 
3
- Studio Tool and Document Action for empowering content editors to migrate Documents and Assets between Sanity Datasets and Projects from inside the Studio.
3
+ Sanity Studio Tool and Document Action for empowering content editors to migrate Documents and Assets between Sanity Datasets and Projects from inside the Studio.
4
4
 
5
- ## Important Notes
5
+ ## Install
6
+
7
+ From the root directory of your studio
8
+
9
+ ```
10
+ sanity install @sanity/cross-dataset-duplicator
11
+ ```
12
+
13
+ ### Important Notes
6
14
 
7
15
  This plugin is designed as a convenience for Authors to make small, infrequent content migrations between Datasets.
8
16
 
9
17
  - This plugin should be used in conjunction with a reliable backup strategy.
10
18
  - Proceed with caution as this plugin can instantly write changes to Datasets.
11
19
  - Larger migrations may take more time, especially with Assets. The plugin tries to mitigate this with rate limiting asset uploads to 3 at a time.
12
- - Before starting a Duplication you can select which Documents and Assets to include. Keep in mind Migrations will likely fail if every Referenced Document or Asset is not already present at the destination Dataset.
20
+ - If an Asset is already present at the destination, there's no need to duplicate it again.
21
+ - Before starting a Duplication you can select which Documents and Assets to include. Migrations will fail if every Referenced Document or Asset is not included in the transaction or already present at the destination Dataset.
13
22
 
14
23
  ## Tool
15
24
 
@@ -39,9 +48,11 @@ Once setup, you will see a dropdown menu next to the Search bar in the Studio wi
39
48
 
40
49
  The plugin has some configuration options. These can be set by adding a config file to your Studio
41
50
 
42
- ```json
51
+ ```js
43
52
  // ./config/@sanity/cross-dataset-duplicator.json
53
+ ```
44
54
 
55
+ ```json
45
56
  {
46
57
  "tool": true,
47
58
  "types": ["article", "page"]
@@ -55,11 +66,16 @@ Options:
55
66
 
56
67
  ### 3. Authentication Key
57
68
 
58
- To Duplicate the original files of Assets, an additional Authentication Token is required. You will be prompted for this the first time you attempt to use either the Tool or Document Action on any Dataset.
69
+ To Duplicate the original files of Assets, an API Token with Viewer permissions is required. You will be prompted for this the first time you attempt to use either the Tool or Document Action on any Dataset.
59
70
 
60
71
  This plugin uses [Sanity Secrets](https://github.com/sanity-io/sanity-studio-secrets/) to store the token in the Dataset itself.
61
72
 
62
- You can reveal the token belonging to your user account with `sanity debug --secrets`.
73
+ You can [create API tokens in manage](https://sanity.io/manage)
74
+
75
+ ### 4. CORS origins
76
+
77
+ If you want to duplicate data across different projects, you need to enable CORS for the different hosts. This allows different projects to connect to each other through the project API. CORS origins configuration can be found in your project page, under the API tab.
78
+
63
79
 
64
80
  ## Importing the Document Action
65
81
 
@@ -76,7 +92,7 @@ Now update your Studio's Document Actions resolver to be something like this
76
92
 
77
93
  ```js
78
94
  import defaultResolve from 'part:@sanity/base/document-actions'
79
- import {DuplicateToAction} from 'sanity-plugin-migration'
95
+ import {DuplicateToAction} from '@sanity/cross-dataset-duplicator'
80
96
  import config from 'config:@sanity/cross-dataset-duplicator'
81
97
 
82
98
  export default function resolveDocumentActions(props) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/actions/DuplicateToAction.tsx"],"names":["DuplicateToAction","draft","published","onComplete","dialogOpen","setDialogOpen","disabled","title","label","dialog","type","content","onClose","onHandle","icon","LaunchIcon"],"mappings":";;;;;;;AAAA;;AACA;;AAEA;;;;;;;;;;;;;;;;;;;;AAEe,SAASA,iBAAT,OAA2D;AAAA,MAA/BC,KAA+B,QAA/BA,KAA+B;AAAA,MAAxBC,SAAwB,QAAxBA,SAAwB;AAAA,MAAbC,UAAa,QAAbA,UAAa;;AACxE,kBAAoC,qBAAS,KAAT,CAApC;AAAA;AAAA,MAAOC,UAAP;AAAA,MAAmBC,aAAnB;;AAEA,SAAO;AACLC,IAAAA,QAAQ,EAAEL,KADL;AAELM,IAAAA,KAAK,EAAEN,KAAK,2CAA2C,IAFlD;AAGLO,IAAAA,KAAK,EAAE,iBAHF;AAILC,IAAAA,MAAM,EAAEL,UAAU,IAAIF,SAAd,IAA2B;AACjCQ,MAAAA,IAAI,EAAE,OAD2B;AAEjCH,MAAAA,KAAK,EAAE,0BAF0B;AAGjCI,MAAAA,OAAO,eAAE,6BAAC,+BAAD;AAAwB,QAAA,IAAI,EAAE,CAACT,SAAD,CAA9B;AAA2C,QAAA,IAAI,EAAC;AAAhD,QAHwB;AAIjCU,MAAAA,OAAO,EAAE,MAAMT,UAAU;AAJQ,KAJ9B;AAULU,IAAAA,QAAQ,EAAE,MAAMR,aAAa,CAAC,IAAD,CAVxB;AAWLS,IAAAA,IAAI,EAAEC;AAXD,GAAP;AAaD","sourcesContent":["import React, {useState} from 'react'\nimport {LaunchIcon} from '@sanity/icons'\n\nimport CrossDatasetDuplicator from '../components/CrossDatasetDuplicator'\n\nexport default function DuplicateToAction({draft, published, onComplete}) {\n const [dialogOpen, setDialogOpen] = useState(false)\n\n return {\n disabled: draft,\n title: draft ? `Document must be Published to begin` : null,\n label: 'Duplicate to...',\n dialog: dialogOpen && published && {\n type: 'modal',\n title: 'Cross Dataset Duplicator',\n content: <CrossDatasetDuplicator docs={[published]} mode=\"action\" />,\n onClose: () => onComplete(),\n },\n onHandle: () => setDialogOpen(true),\n icon: LaunchIcon,\n }\n}\n"],"file":"DuplicateToAction.js"}
1
+ {"version":3,"file":"DuplicateToAction.js","names":["DuplicateToAction","draft","published","onComplete","dialogOpen","setDialogOpen","disabled","title","label","dialog","type","content","onClose","onHandle","icon","LaunchIcon"],"sources":["../../src/actions/DuplicateToAction.tsx"],"sourcesContent":["import React, {useState} from 'react'\nimport {LaunchIcon} from '@sanity/icons'\n\nimport CrossDatasetDuplicator from '../components/CrossDatasetDuplicator'\n\nexport default function DuplicateToAction({draft, published, onComplete}) {\n const [dialogOpen, setDialogOpen] = useState(false)\n\n return {\n disabled: draft,\n title: draft ? `Document must be Published to begin` : null,\n label: 'Duplicate to...',\n dialog: dialogOpen && published && {\n type: 'modal',\n title: 'Cross Dataset Duplicator',\n content: <CrossDatasetDuplicator docs={[published]} mode=\"action\" />,\n onClose: () => onComplete(),\n },\n onHandle: () => setDialogOpen(true),\n icon: LaunchIcon,\n }\n}\n"],"mappings":";;;;;;;AAAA;;AACA;;AAEA;;;;;;;;;;;;;;;;;;;;AAEe,SAASA,iBAAT,OAA2D;EAAA,IAA/BC,KAA+B,QAA/BA,KAA+B;EAAA,IAAxBC,SAAwB,QAAxBA,SAAwB;EAAA,IAAbC,UAAa,QAAbA,UAAa;;EACxE,gBAAoC,qBAAS,KAAT,CAApC;EAAA;EAAA,IAAOC,UAAP;EAAA,IAAmBC,aAAnB;;EAEA,OAAO;IACLC,QAAQ,EAAEL,KADL;IAELM,KAAK,EAAEN,KAAK,2CAA2C,IAFlD;IAGLO,KAAK,EAAE,iBAHF;IAILC,MAAM,EAAEL,UAAU,IAAIF,SAAd,IAA2B;MACjCQ,IAAI,EAAE,OAD2B;MAEjCH,KAAK,EAAE,0BAF0B;MAGjCI,OAAO,eAAE,6BAAC,+BAAD;QAAwB,IAAI,EAAE,CAACT,SAAD,CAA9B;QAA2C,IAAI,EAAC;MAAhD,EAHwB;MAIjCU,OAAO,EAAE,MAAMT,UAAU;IAJQ,CAJ9B;IAULU,QAAQ,EAAE,MAAMR,aAAa,CAAC,IAAD,CAVxB;IAWLS,IAAI,EAAEC;EAXD,CAAP;AAaD"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/actions/index.ts"],"names":["resolveDocumentActions","props","duplicatorTypes","config","types","defaultActions","includes","type","reduce","acc","cur","DuplicateAction","DuplicateToAction"],"mappings":";;;;;;;AAAA;;AACA;;AAEA;;;;;;;;AAEe,SAASA,sBAAT,CAAgCC,KAAhC,EAAuC;AAAA;;AACpD,MAAMC,eAAe,oBAAGC,+BAAH,aAAGA,+BAAH,uBAAGA,gCAAQC,KAAX,yDAAoB,EAAzC;AACA,MAAMC,cAAc,GAAG,8BAAeJ,KAAf,CAAvB,CAFoD,CAIpD;;AACA,MAAIC,eAAe,CAACI,QAAhB,CAAyBL,KAAzB,aAAyBA,KAAzB,uBAAyBA,KAAK,CAAEM,IAAhC,CAAJ,EAA2C;AACzC,WAAOF,cAAc,CAACG,MAAf,CAAsB,CAACC,GAAD,EAAMC,GAAN,KAAc;AACzC,UAAIA,GAAG,KAAKC,gCAAZ,EAA6B;AAC3B,eAAO,CAAC,GAAGF,GAAJ,EAASC,GAAT,EAAcE,0BAAd,CAAP;AACD;;AAED,aAAO,CAAC,GAAGH,GAAJ,EAASC,GAAT,CAAP;AACD,KANM,EAMJ,EANI,CAAP;AAOD;;AAED,SAAOL,cAAP;AACD","sourcesContent":["import defaultResolve, {DuplicateAction} from 'part:@sanity/base/document-actions'\nimport config from 'config:@sanity/cross-dataset-duplicator'\n\nimport DuplicateToAction from './DuplicateToAction'\n\nexport default function resolveDocumentActions(props) { \n const duplicatorTypes = config?.types ?? []\n const defaultActions = defaultResolve(props)\n\n // Insert 'Duplicate to...' after 'Duplicate' only on config'd types\n if (duplicatorTypes.includes(props?.type)) {\n return defaultActions.reduce((acc, cur) => {\n if (cur === DuplicateAction) {\n return [...acc, cur, DuplicateToAction]\n }\n\n return [...acc, cur]\n }, [])\n }\n\n return defaultActions\n}\n"],"file":"index.js"}
1
+ {"version":3,"file":"index.js","names":["resolveDocumentActions","props","duplicatorTypes","config","types","defaultActions","includes","type","reduce","acc","cur","DuplicateAction","DuplicateToAction"],"sources":["../../src/actions/index.ts"],"sourcesContent":["import defaultResolve, {DuplicateAction} from 'part:@sanity/base/document-actions'\nimport config from 'config:@sanity/cross-dataset-duplicator'\n\nimport DuplicateToAction from './DuplicateToAction'\n\nexport default function resolveDocumentActions(props) { \n const duplicatorTypes = config?.types ?? []\n const defaultActions = defaultResolve(props)\n\n // Insert 'Duplicate to...' after 'Duplicate' only on config'd types\n if (duplicatorTypes.includes(props?.type)) {\n return defaultActions.reduce((acc, cur) => {\n if (cur === DuplicateAction) {\n return [...acc, cur, DuplicateToAction]\n }\n\n return [...acc, cur]\n }, [])\n }\n\n return defaultActions\n}\n"],"mappings":";;;;;;;AAAA;;AACA;;AAEA;;;;;;;;AAEe,SAASA,sBAAT,CAAgCC,KAAhC,EAAuC;EAAA;;EACpD,IAAMC,eAAe,oBAAGC,+BAAH,aAAGA,+BAAH,uBAAGA,gCAAQC,KAAX,yDAAoB,EAAzC;EACA,IAAMC,cAAc,GAAG,8BAAeJ,KAAf,CAAvB,CAFoD,CAIpD;;EACA,IAAIC,eAAe,CAACI,QAAhB,CAAyBL,KAAzB,aAAyBA,KAAzB,uBAAyBA,KAAK,CAAEM,IAAhC,CAAJ,EAA2C;IACzC,OAAOF,cAAc,CAACG,MAAf,CAAsB,CAACC,GAAD,EAAMC,GAAN,KAAc;MACzC,IAAIA,GAAG,KAAKC,gCAAZ,EAA6B;QAC3B,OAAO,CAAC,GAAGF,GAAJ,EAASC,GAAT,EAAcE,0BAAd,CAAP;MACD;;MAED,OAAO,CAAC,GAAGH,GAAJ,EAASC,GAAT,CAAP;IACD,CANM,EAMJ,EANI,CAAP;EAOD;;EAED,OAAOL,cAAP;AACD"}
@@ -42,7 +42,7 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
42
42
  // Check for auth secret (required for asset uploads)
43
43
  var secretConfigKeys = [{
44
44
  key: 'bearerToken',
45
- title: 'An "Auth Token" is required to duplicate the original files of assets, and will be used for all Duplications. You can retrieve yours using the Sanity CLI `sanity debug --secrets`.',
45
+ title: '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',
46
46
  description: ''
47
47
  }];
48
48
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/CrossDatasetDuplicator.tsx"],"names":["secretConfigKeys","key","title","description","CrossDatasetDuplicator","props","mode","docs","secretsData","SECRET_NAMESPACE","loading","secrets","showSecretsPrompt","setShowSecretsPrompt","bearerToken","length"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AAEA;;AACA;;AACA;;AACA;;AAEA;;;;;;;;;;;;;;;;;;;;AAEA;AACA,IAAMA,gBAAgB,GAAG,CACvB;AACEC,EAAAA,GAAG,EAAE,aADP;AAEEC,EAAAA,KAAK,EACH,qLAHJ;AAIEC,EAAAA,WAAW,EAAE;AAJf,CADuB,CAAzB;;AAkBe,SAASC,sBAAT,CAAgCC,KAAhC,EAAoE;AACjF,oBAAmCA,KAAnC,CAAOC,IAAP;AAAA,MAAOA,IAAP;AAAA,oBAAmCD,KAAnC,CAAsBE,IAAtB;AAAA,MAAsBA,IAAtB,4BAA6B,EAA7B;AAEA,MAAMC,WAAW,GAAG,+BAAWC,2BAAX,CAApB;AACA,MAAOC,OAAP,GAAiEF,WAAjE,CAAOE,OAAP;AAAA,MAAgBC,OAAhB,GAAiEH,WAAjE,CAAgBG,OAAhB;;AACA,kBAAkD,qBAAS,KAAT,CAAlD;AAAA;AAAA,MAAOC,iBAAP;AAAA,MAA0BC,oBAA1B;;AAEA,wBAAU,MAAM;AACd,QAAIF,OAAJ,EAAa;AACXE,MAAAA,oBAAoB,CAAC,EAACF,OAAD,aAACA,OAAD,eAACA,OAAO,CAAEG,WAAV,CAAD,CAApB;AACD;AACF,GAJD,EAIG,CAACH,OAAD,CAJH;;AAMA,MAAI,CAACH,WAAL,EAAkB;AAChB,wBACE,6BAAC,iBAAD,8FADF;AAKD;;AAED,MAAIE,OAAJ,EAAa;AACX,wBACE,6BAAC,iBAAD,qBACE,6BAAC,QAAD;AAAM,MAAA,OAAO,EAAC,QAAd;AAAuB,MAAA,KAAK,EAAC;AAA7B,oBACE,6BAAC,OAAD;AAAK,MAAA,OAAO,EAAE;AAAd,oBACE,6BAAC,WAAD,OADF,CADF,CADF,CADF;AASD;;AAED,MAAK,CAACA,OAAD,IAAYE,iBAAb,IAAmC,EAACD,OAAD,aAACA,OAAD,eAACA,OAAO,CAAEG,WAAV,CAAvC,EAA8D;AAC5D,wBACE,6BAAC,iBAAD,qBACE,6BAAC,2BAAD;AACE,MAAA,KAAK,EAAC,gBADR;AAEE,MAAA,SAAS,EAAEL,2BAFb;AAGE,MAAA,IAAI,EAAET,gBAHR,CAIE;AAJF;AAKE,MAAA,OAAO,EAAE,MAAMa,oBAAoB,CAAC,KAAD;AALrC,MADF,CADF;AAWD;;AAED,MAAIP,IAAI,KAAK,MAAb,EAAqB;AACnB,wBACE,6BAAC,iBAAD,qBACE,6BAAC,wBAAD;AAAiB,MAAA,KAAK,EAAEK,OAAF,aAAEA,OAAF,uBAAEA,OAAO,CAAEG;AAAjC,MADF,eAEE,6BAAC,oBAAD,OAFF,CADF;AAMD;;AAED,MAAI,EAACP,IAAD,aAACA,IAAD,eAACA,IAAI,CAAEQ,MAAP,CAAJ,EAAmB;AACjB,wBACE,6BAAC,iBAAD,qBACE,6BAAC,iBAAD,8CADF,CADF;AAKD;;AAED,sBACE,6BAAC,iBAAD,qBACE,6BAAC,uBAAD;AAAgB,IAAA,IAAI,EAAER,IAAtB;AAA4B,IAAA,KAAK,EAAEI,OAAF,aAAEA,OAAF,uBAAEA,OAAO,CAAEG;AAA5C,IADF,CADF;AAKD","sourcesContent":["import React, {useEffect, useState} from 'react'\nimport {useSecrets, SettingsView} from 'sanity-secrets'\nimport {ThemeProvider, Flex, Box, Spinner} from '@sanity/ui'\n\nimport DuplicatorQuery from './DuplicatorQuery'\nimport DuplicatorTool from './DuplicatorTool'\nimport ResetSecret from './ResetSecret'\nimport Feedback from './Feedback'\nimport {SanityDocument} from '../types'\nimport {SECRET_NAMESPACE} from '../helpers/constants'\n\n// Check for auth secret (required for asset uploads)\nconst secretConfigKeys = [\n {\n key: 'bearerToken',\n title:\n 'An \"Auth Token\" is required to duplicate the original files of assets, and will be used for all Duplications. You can retrieve yours using the Sanity CLI `sanity debug --secrets`.',\n description: '',\n },\n]\n\ntype CrossDatasetDuplicatorProps = {\n mode: 'tool' | 'action'\n docs: SanityDocument[]\n}\n\ntype Secrets = {\n bearerToken?: string\n}\n\nexport default function CrossDatasetDuplicator(props: CrossDatasetDuplicatorProps) {\n const {mode = `tool`, docs = []} = props\n\n const secretsData = useSecrets(SECRET_NAMESPACE)\n const {loading, secrets}: {loading: boolean; secrets: Secrets} = secretsData\n const [showSecretsPrompt, setShowSecretsPrompt] = useState(false)\n\n useEffect(() => {\n if (secrets) {\n setShowSecretsPrompt(!secrets?.bearerToken)\n }\n }, [secrets])\n\n if (!secretsData) {\n return (\n <Feedback>\n Could not query for Secrets. You may have insufficient permissions on your account.\n </Feedback>\n )\n }\n\n if (loading) {\n return (\n <ThemeProvider>\n <Flex justify=\"center\" align=\"center\">\n <Box padding={5}>\n <Spinner />\n </Box>\n </Flex>\n </ThemeProvider>\n )\n }\n\n if ((!loading && showSecretsPrompt) || !secrets?.bearerToken) {\n return (\n <ThemeProvider>\n <SettingsView\n title=\"Token Required\"\n namespace={SECRET_NAMESPACE}\n keys={secretConfigKeys}\n // eslint-disable-next-line react/jsx-no-bind\n onClose={() => setShowSecretsPrompt(false)}\n />\n </ThemeProvider>\n )\n }\n\n if (mode === 'tool') {\n return (\n <ThemeProvider>\n <DuplicatorQuery token={secrets?.bearerToken} />\n <ResetSecret />\n </ThemeProvider>\n )\n }\n\n if (!docs?.length) {\n return (\n <ThemeProvider>\n <Feedback>No docs passed into Duplicator Tool</Feedback>\n </ThemeProvider>\n )\n }\n\n return (\n <ThemeProvider>\n <DuplicatorTool docs={docs} token={secrets?.bearerToken} />\n </ThemeProvider>\n )\n}\n"],"file":"CrossDatasetDuplicator.js"}
1
+ {"version":3,"file":"CrossDatasetDuplicator.js","names":["secretConfigKeys","key","title","description","CrossDatasetDuplicator","props","mode","docs","secretsData","SECRET_NAMESPACE","loading","secrets","showSecretsPrompt","setShowSecretsPrompt","bearerToken","length"],"sources":["../../src/components/CrossDatasetDuplicator.tsx"],"sourcesContent":["import React, {useEffect, useState} from 'react'\nimport {useSecrets, SettingsView} from 'sanity-secrets'\nimport {ThemeProvider, Flex, Box, Spinner} from '@sanity/ui'\n\nimport DuplicatorQuery from './DuplicatorQuery'\nimport DuplicatorTool from './DuplicatorTool'\nimport ResetSecret from './ResetSecret'\nimport Feedback from './Feedback'\nimport {SanityDocument} from '../types'\nimport {SECRET_NAMESPACE} from '../helpers/constants'\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 CrossDatasetDuplicatorProps = {\n mode: 'tool' | 'action'\n docs: SanityDocument[]\n}\n\ntype Secrets = {\n bearerToken?: string\n}\n\nexport default function CrossDatasetDuplicator(props: CrossDatasetDuplicatorProps) {\n const {mode = `tool`, docs = []} = props\n\n const secretsData = useSecrets(SECRET_NAMESPACE)\n const {loading, secrets}: {loading: boolean; secrets: Secrets} = secretsData\n const [showSecretsPrompt, setShowSecretsPrompt] = useState(false)\n\n useEffect(() => {\n if (secrets) {\n setShowSecretsPrompt(!secrets?.bearerToken)\n }\n }, [secrets])\n\n if (!secretsData) {\n return (\n <Feedback>\n Could not query for Secrets. You may have insufficient permissions on your account.\n </Feedback>\n )\n }\n\n if (loading) {\n return (\n <ThemeProvider>\n <Flex justify=\"center\" align=\"center\">\n <Box padding={5}>\n <Spinner />\n </Box>\n </Flex>\n </ThemeProvider>\n )\n }\n\n if ((!loading && showSecretsPrompt) || !secrets?.bearerToken) {\n return (\n <ThemeProvider>\n <SettingsView\n title=\"Token Required\"\n namespace={SECRET_NAMESPACE}\n keys={secretConfigKeys}\n // eslint-disable-next-line react/jsx-no-bind\n onClose={() => setShowSecretsPrompt(false)}\n />\n </ThemeProvider>\n )\n }\n\n if (mode === 'tool') {\n return (\n <ThemeProvider>\n <DuplicatorQuery token={secrets?.bearerToken} />\n <ResetSecret />\n </ThemeProvider>\n )\n }\n\n if (!docs?.length) {\n return (\n <ThemeProvider>\n <Feedback>No docs passed into Duplicator Tool</Feedback>\n </ThemeProvider>\n )\n }\n\n return (\n <ThemeProvider>\n <DuplicatorTool docs={docs} token={secrets?.bearerToken} />\n </ThemeProvider>\n )\n}\n"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AAEA;;AACA;;AACA;;AACA;;AAEA;;;;;;;;;;;;;;;;;;;;AAEA;AACA,IAAMA,gBAAgB,GAAG,CACvB;EACEC,GAAG,EAAE,aADP;EAEEC,KAAK,EACH,mKAHJ;EAIEC,WAAW,EAAE;AAJf,CADuB,CAAzB;;AAkBe,SAASC,sBAAT,CAAgCC,KAAhC,EAAoE;EACjF,kBAAmCA,KAAnC,CAAOC,IAAP;EAAA,IAAOA,IAAP;EAAA,kBAAmCD,KAAnC,CAAsBE,IAAtB;EAAA,IAAsBA,IAAtB,4BAA6B,EAA7B;EAEA,IAAMC,WAAW,GAAG,+BAAWC,2BAAX,CAApB;EACA,IAAOC,OAAP,GAAiEF,WAAjE,CAAOE,OAAP;EAAA,IAAgBC,OAAhB,GAAiEH,WAAjE,CAAgBG,OAAhB;;EACA,gBAAkD,qBAAS,KAAT,CAAlD;EAAA;EAAA,IAAOC,iBAAP;EAAA,IAA0BC,oBAA1B;;EAEA,sBAAU,MAAM;IACd,IAAIF,OAAJ,EAAa;MACXE,oBAAoB,CAAC,EAACF,OAAD,aAACA,OAAD,eAACA,OAAO,CAAEG,WAAV,CAAD,CAApB;IACD;EACF,CAJD,EAIG,CAACH,OAAD,CAJH;;EAMA,IAAI,CAACH,WAAL,EAAkB;IAChB,oBACE,6BAAC,iBAAD,8FADF;EAKD;;EAED,IAAIE,OAAJ,EAAa;IACX,oBACE,6BAAC,iBAAD,qBACE,6BAAC,QAAD;MAAM,OAAO,EAAC,QAAd;MAAuB,KAAK,EAAC;IAA7B,gBACE,6BAAC,OAAD;MAAK,OAAO,EAAE;IAAd,gBACE,6BAAC,WAAD,OADF,CADF,CADF,CADF;EASD;;EAED,IAAK,CAACA,OAAD,IAAYE,iBAAb,IAAmC,EAACD,OAAD,aAACA,OAAD,eAACA,OAAO,CAAEG,WAAV,CAAvC,EAA8D;IAC5D,oBACE,6BAAC,iBAAD,qBACE,6BAAC,2BAAD;MACE,KAAK,EAAC,gBADR;MAEE,SAAS,EAAEL,2BAFb;MAGE,IAAI,EAAET,gBAHR,CAIE;MAJF;MAKE,OAAO,EAAE,MAAMa,oBAAoB,CAAC,KAAD;IALrC,EADF,CADF;EAWD;;EAED,IAAIP,IAAI,KAAK,MAAb,EAAqB;IACnB,oBACE,6BAAC,iBAAD,qBACE,6BAAC,wBAAD;MAAiB,KAAK,EAAEK,OAAF,aAAEA,OAAF,uBAAEA,OAAO,CAAEG;IAAjC,EADF,eAEE,6BAAC,oBAAD,OAFF,CADF;EAMD;;EAED,IAAI,EAACP,IAAD,aAACA,IAAD,eAACA,IAAI,CAAEQ,MAAP,CAAJ,EAAmB;IACjB,oBACE,6BAAC,iBAAD,qBACE,6BAAC,iBAAD,8CADF,CADF;EAKD;;EAED,oBACE,6BAAC,iBAAD,qBACE,6BAAC,uBAAD;IAAgB,IAAI,EAAER,IAAtB;IAA4B,KAAK,EAAEI,OAAF,aAAEA,OAAF,uBAAEA,OAAO,CAAEG;EAA5C,EADF,CADF;AAKD"}
@@ -37,7 +37,11 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
37
37
 
38
38
  var originClient = _client.default.withConfig(_clientConfig.clientConfig);
39
39
 
40
+ var schemaTypes = _schema.default.getTypeNames();
41
+
40
42
  function DuplicatorQuery(props) {
43
+ var _initialData$docs2, _initialData$docs3;
44
+
41
45
  var token = props.token;
42
46
 
43
47
  var _useState = (0, _react.useState)(""),
@@ -45,23 +49,32 @@ function DuplicatorQuery(props) {
45
49
  value = _useState2[0],
46
50
  setValue = _useState2[1];
47
51
 
48
- var _useState3 = (0, _react.useState)([]),
52
+ var _useState3 = (0, _react.useState)({
53
+ docs: [],
54
+ draftIds: []
55
+ }),
49
56
  _useState4 = _slicedToArray(_useState3, 2),
50
- docs = _useState4[0],
51
- setDocs = _useState4[1];
57
+ initialData = _useState4[0],
58
+ setInitialData = _useState4[1];
52
59
 
53
60
  function handleSubmit(e) {
54
61
  if (e) e.preventDefault();
55
62
  originClient.fetch(value).then(res => {
56
63
  // Ensure queried docs are registered to the schema
57
- var registeredDocs = res.length ? res.filter(doc => _schema.default.get(doc._type)) : [];
58
- setDocs(registeredDocs);
64
+ var registeredAndPublishedDocs = res.length ? res.filter(doc => schemaTypes.includes(doc._type)).filter(doc => !doc._id.startsWith("drafts.")) : [];
65
+ var initialDraftIds = res.length ? res.filter(doc => doc._id.startsWith("drafts.")).map(doc => doc._id) : [];
66
+ setInitialData({
67
+ docs: registeredAndPublishedDocs,
68
+ draftIds: initialDraftIds
69
+ });
59
70
  }).catch(err => console.error(err));
60
71
  } // Auto-load initial textinput value
61
72
 
62
73
 
63
74
  (0, _react.useEffect)(() => {
64
- if (!(docs !== null && docs !== void 0 && docs.length) && value) {
75
+ var _initialData$docs;
76
+
77
+ if (!((_initialData$docs = initialData.docs) !== null && _initialData$docs !== void 0 && _initialData$docs.length) && value) {
65
78
  handleSubmit();
66
79
  }
67
80
  }, []);
@@ -79,7 +92,7 @@ function DuplicatorQuery(props) {
79
92
  radius: 3
80
93
  }, /*#__PURE__*/_react.default.createElement(_ui.Stack, {
81
94
  space: 4
82
- }, /*#__PURE__*/_react.default.createElement(_ui.Box, null, /*#__PURE__*/_react.default.createElement(_ui.Label, null, "Initial Documents Query")), /*#__PURE__*/_react.default.createElement(_ui.Box, null, /*#__PURE__*/_react.default.createElement(_ui.Text, null, "Start with a valid GROQ query to load initial documents. The query will need to return an Array of Objects.")), /*#__PURE__*/_react.default.createElement("form", {
95
+ }, /*#__PURE__*/_react.default.createElement(_ui.Box, null, /*#__PURE__*/_react.default.createElement(_ui.Label, null, "Initial Documents Query")), /*#__PURE__*/_react.default.createElement(_ui.Box, null, /*#__PURE__*/_react.default.createElement(_ui.Text, null, "Start with a valid GROQ query to load initial documents. The query will need to return an Array of Objects. Drafts will be removed from the results.")), /*#__PURE__*/_react.default.createElement("form", {
83
96
  onSubmit: handleSubmit
84
97
  }, /*#__PURE__*/_react.default.createElement(_ui.Flex, null, /*#__PURE__*/_react.default.createElement(_ui.Box, {
85
98
  flex: 1,
@@ -101,12 +114,13 @@ function DuplicatorQuery(props) {
101
114
  onClick: handleSubmit,
102
115
  text: "Query",
103
116
  disabled: !value
104
- })))))), !(docs !== null && docs !== void 0 && docs.length) || docs.length < 1 && /*#__PURE__*/_react.default.createElement(_ui.Container, {
117
+ })))))), !((_initialData$docs2 = initialData.docs) !== null && _initialData$docs2 !== void 0 && _initialData$docs2.length) || initialData.docs.length < 1 && /*#__PURE__*/_react.default.createElement(_ui.Container, {
105
118
  width: 1
106
119
  }, /*#__PURE__*/_react.default.createElement(_ui.Card, {
107
120
  padding: 5
108
- }, value ? "No Documents registered to the Schema match this query" : "Start with a valid GROQ query")), (docs === null || docs === void 0 ? void 0 : docs.length) > 0 && /*#__PURE__*/_react.default.createElement(_DuplicatorTool.default, {
109
- docs: docs,
121
+ }, value ? "No Documents registered to the Schema match this query" : "Start with a valid GROQ query")), ((_initialData$docs3 = initialData.docs) === null || _initialData$docs3 === void 0 ? void 0 : _initialData$docs3.length) > 0 && /*#__PURE__*/_react.default.createElement(_DuplicatorTool.default, {
122
+ docs: initialData.docs,
123
+ draftIds: initialData.draftIds,
110
124
  token: token
111
125
  })));
112
126
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/DuplicatorQuery.tsx"],"names":["originClient","sanityClient","withConfig","clientConfig","DuplicatorQuery","props","token","value","setValue","docs","setDocs","handleSubmit","e","preventDefault","fetch","then","res","registeredDocs","length","filter","doc","schema","get","_type","catch","err","console","error","fontFamily","event","currentTarget"],"mappings":"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","sourcesContent":["import React, {useEffect, useState} from 'react'\nimport sanityClient from 'part:@sanity/base/client'\nimport schema from 'part:@sanity/base/schema'\nimport {Button, Stack, Box, Label, Text, Card, Flex, Grid, Container, TextInput} from '@sanity/ui'\n\nimport DuplicatorTool from './DuplicatorTool'\nimport { clientConfig } from '../helpers/clientConfig'\n\nconst originClient = sanityClient.withConfig(clientConfig)\n\ntype DuplicatorQueryProps = {\n token: string\n}\n\nexport default function DuplicatorQuery(props: DuplicatorQueryProps) {\n const {token} = props\n\n const [value, setValue] = useState(``)\n const [docs, setDocs] = useState([])\n\n function handleSubmit(e?: any) {\n if (e) e.preventDefault()\n\n originClient\n .fetch(value)\n .then((res) => {\n // Ensure queried docs are registered to the schema\n const registeredDocs = res.length ? res.filter((doc) => schema.get(doc._type)) : []\n\n setDocs(registeredDocs)\n })\n .catch((err) => console.error(err))\n }\n\n // Auto-load initial textinput value\n useEffect(() => {\n if (!docs?.length && value) {\n handleSubmit()\n }\n }, [])\n\n return (\n <Container width={[1, 1, 1, 3]} padding={[0, 0, 0, 5]}>\n <Grid columns={[1, 1, 1, 2]} gap={[1, 1, 1, 4]}>\n <Box padding={[2, 2, 2, 0]}>\n <Card padding={4} scheme=\"dark\" radius={3}>\n <Stack space={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 return an Array of Objects.\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 // eslint-disable-next-line react/jsx-no-bind\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 </Box>\n {!docs?.length || docs.length < 1 && (\n <Container width={1}>\n <Card padding={5}>\n {value ? `No Documents registered to the Schema match this query` : `Start with a valid GROQ query`}\n </Card>\n </Container>\n )}\n {docs?.length > 0 && <DuplicatorTool docs={docs} token={token} />}\n </Grid>\n </Container>\n )\n}\n"],"file":"DuplicatorQuery.js"}
1
+ {"version":3,"file":"DuplicatorQuery.js","names":["originClient","sanityClient","withConfig","clientConfig","schemaTypes","schema","getTypeNames","DuplicatorQuery","props","token","value","setValue","docs","draftIds","initialData","setInitialData","handleSubmit","e","preventDefault","fetch","then","res","registeredAndPublishedDocs","length","filter","doc","includes","_type","_id","startsWith","initialDraftIds","map","catch","err","console","error","fontFamily","event","currentTarget"],"sources":["../../src/components/DuplicatorQuery.tsx"],"sourcesContent":["import React, {useEffect, useState} from 'react'\nimport sanityClient from 'part:@sanity/base/client'\nimport schema from 'part:@sanity/base/schema'\nimport {Button, Stack, Box, Label, Text, Card, Flex, Grid, Container, TextInput} from '@sanity/ui'\n\nimport DuplicatorTool from './DuplicatorTool'\nimport {clientConfig} from '../helpers/clientConfig'\n\nconst originClient = sanityClient.withConfig(clientConfig)\n\ntype DuplicatorQueryProps = {\n token: string\n}\n\nconst schemaTypes = schema.getTypeNames()\n\nexport default function DuplicatorQuery(props: DuplicatorQueryProps) {\n const {token} = props\n\n const [value, setValue] = useState(``)\n const [initialData, setInitialData] = useState({docs: [], draftIds: []});\n\n function handleSubmit(e?: any) {\n if (e) e.preventDefault()\n\n originClient\n .fetch(value)\n .then((res) => {\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 const initialDraftIds = res.length ? res.filter(doc => doc._id.startsWith(`drafts.`)).map(doc => doc._id) : []\n\n setInitialData({docs: registeredAndPublishedDocs, draftIds: initialDraftIds})\n })\n .catch((err) => console.error(err))\n }\n\n // Auto-load initial textinput value\n useEffect(() => {\n if (!initialData.docs?.length && value) {\n handleSubmit()\n }\n }, [])\n\n return (\n <Container width={[1, 1, 1, 3]} padding={[0, 0, 0, 5]}>\n <Grid columns={[1, 1, 1, 2]} gap={[1, 1, 1, 4]}>\n <Box padding={[2, 2, 2, 0]}>\n <Card padding={4} scheme=\"dark\" radius={3}>\n <Stack space={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 // eslint-disable-next-line react/jsx-no-bind\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 </Box>\n {!initialData.docs?.length ||\n (initialData.docs.length < 1 && (\n <Container width={1}>\n <Card padding={5}>\n {value\n ? `No Documents registered to the Schema match this query`\n : `Start with a valid GROQ query`}\n </Card>\n </Container>\n ))}\n {initialData.docs?.length > 0 && <DuplicatorTool docs={initialData.docs} draftIds={initialData.draftIds} token={token} />}\n </Grid>\n </Container>\n )\n}\n"],"mappings":"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"}
@@ -71,6 +71,7 @@ function DuplicatorTool(props) {
71
71
  var _config$__experimenta, _destination$title, _spacesOptions$find, _message$tone;
72
72
 
73
73
  var docs = props.docs,
74
+ draftIds = props.draftIds,
74
75
  token = props.token; // Prepare origin (this Studio) client
75
76
  // In function-scope so it is up to date on every render
76
77
 
@@ -79,7 +80,7 @@ function DuplicatorTool(props) {
79
80
 
80
81
 
81
82
  var spacesOptions = _configSanity.default !== null && _configSanity.default !== void 0 && (_config$__experimenta = _configSanity.default.__experimental_spaces) !== null && _config$__experimenta !== void 0 && _config$__experimenta.length ? _configSanity.default.__experimental_spaces.map(space => _objectSpread(_objectSpread({}, space), {}, {
82
- disabled: space.api.dataset === originClient.config().dataset
83
+ disabled: space.api.dataset === originClient.config().dataset && space.api.projectId === originClient.config().projectId
83
84
  })) : [];
84
85
 
85
86
  var _useState = (0, _react.useState)(spacesOptions.length ? spacesOptions.find(space => !space.disabled) : {}),
@@ -95,7 +96,8 @@ function DuplicatorTool(props) {
95
96
  var _useState5 = (0, _react.useState)(docs.length ? docs.map(item => ({
96
97
  doc: item,
97
98
  include: true,
98
- status: null
99
+ status: null,
100
+ hasDraft: draftIds.includes("drafts.".concat(item._id))
99
101
  })) : []),
100
102
  _useState6 = _slicedToArray(_useState5, 2),
101
103
  payload = _useState6[0],
@@ -224,14 +226,21 @@ function DuplicatorTool(props) {
224
226
  _handleReferences = _asyncToGenerator(function* () {
225
227
  setIsGathering(true);
226
228
  var docIds = docs.map(doc => doc._id);
227
- var payloadDocs = yield (0, _getDocumentsInArray.getDocumentsInArray)(docIds, originClient, null); // Shape it up
229
+ var payloadDocs = yield (0, _getDocumentsInArray.getDocumentsInArray)(docIds, originClient, null);
230
+ var draftDocs = yield (0, _getDocumentsInArray.getDocumentsInArray)(docIds.map(id => "drafts.".concat(id)), originClient, null, "{_id}");
231
+ var draftDocsIds = new Set(draftDocs.map(_ref4 => {
232
+ var _id = _ref4._id;
233
+ return _id;
234
+ })); // Shape it up
228
235
 
229
236
  var payloadShaped = payloadDocs.map(doc => ({
230
237
  doc,
231
238
  // Include this in the transaction?
232
239
  include: true,
233
240
  // Does it exist at the destination?
234
- status: ''
241
+ status: '',
242
+ // Does it have any drafts?
243
+ hasDraft: draftDocsIds.has("drafts.".concat(doc._id))
235
244
  }));
236
245
  setPayload(payloadShaped);
237
246
  updatePayloadStatuses(payloadShaped);
@@ -247,9 +256,9 @@ function DuplicatorTool(props) {
247
256
  function _handleDuplicate() {
248
257
  _handleDuplicate = _asyncToGenerator(function* () {
249
258
  setIsDuplicating(true);
250
- var assetsCount = payload.filter(_ref4 => {
251
- var doc = _ref4.doc,
252
- include = _ref4.include;
259
+ var assetsCount = payload.filter(_ref5 => {
260
+ var doc = _ref5.doc,
261
+ include = _ref5.include;
253
262
  return include && (0, _helpers.typeIsAsset)(doc._type);
254
263
  }).length;
255
264
  var currentProgress = 0;
@@ -281,11 +290,11 @@ function DuplicatorTool(props) {
281
290
  var downloadUrl = uploadType === 'image' ? "".concat(doc.url, "?dlRaw=true") : doc.url;
282
291
  var downloadConfig = uploadType === 'image' ? {
283
292
  headers: {
284
- Authorization: token ? "Bearer ".concat(token) : ""
293
+ Authorization: "Bearer ".concat(token)
285
294
  }
286
295
  } : {};
287
296
  yield fetch(downloadUrl, downloadConfig).then( /*#__PURE__*/function () {
288
- var _ref5 = _asyncToGenerator(function* (res) {
297
+ var _ref6 = _asyncToGenerator(function* (res) {
289
298
  var assetData = yield res.blob();
290
299
  var options = {
291
300
  filename: doc.originalFilename
@@ -303,7 +312,7 @@ function DuplicatorTool(props) {
303
312
  });
304
313
 
305
314
  return function (_x2) {
306
- return _ref5.apply(this, arguments);
315
+ return _ref6.apply(this, arguments);
307
316
  };
308
317
  }());
309
318
  currentProgress += 1;
@@ -504,7 +513,8 @@ function DuplicatorTool(props) {
504
513
  }, payload.map((_ref2, index) => {
505
514
  var doc = _ref2.doc,
506
515
  include = _ref2.include,
507
- status = _ref2.status;
516
+ status = _ref2.status,
517
+ hasDraft = _ref2.hasDraft;
508
518
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, {
509
519
  key: doc._id
510
520
  }, /*#__PURE__*/_react.default.createElement(_ui.Flex, {
@@ -513,24 +523,28 @@ function DuplicatorTool(props) {
513
523
  checked: include,
514
524
  onChange: () => handleCheckbox(doc._id)
515
525
  }), /*#__PURE__*/_react.default.createElement(_ui.Box, {
516
- style: {
517
- flex: 1
518
- },
526
+ flex: 1,
519
527
  paddingX: 3
520
528
  }, /*#__PURE__*/_react.default.createElement(_preview.default, {
521
529
  value: doc,
522
530
  type: _schema.default.get(doc._type)
523
- })), /*#__PURE__*/_react.default.createElement(_StatusBadge.default, {
531
+ })), /*#__PURE__*/_react.default.createElement(_ui.Flex, {
532
+ items: "center",
533
+ gap: 2
534
+ }, hasDraft ? /*#__PURE__*/_react.default.createElement(_StatusBadge.default, {
535
+ status: "UNPUBLISHED",
536
+ isAsset: false
537
+ }) : null, /*#__PURE__*/_react.default.createElement(_StatusBadge.default, {
524
538
  status: status,
525
539
  isAsset: (0, _helpers.typeIsAsset)(doc._type)
526
- })), (doc === null || doc === void 0 ? void 0 : doc.extension) === 'svg' && index === firstSvgIndex && /*#__PURE__*/_react.default.createElement(_ui.Card, {
540
+ }))), (doc === null || doc === void 0 ? void 0 : doc.extension) === 'svg' && index === firstSvgIndex && /*#__PURE__*/_react.default.createElement(_ui.Card, {
527
541
  padding: 3,
528
542
  radius: 2,
529
543
  shadow: 1,
530
544
  tone: "caution"
531
545
  }, /*#__PURE__*/_react.default.createElement(_ui.Text, {
532
546
  size: 1
533
- }, "Due to how SVGs are sanitized after first uploaded, duplicated SVG assets may have new", ' ', /*#__PURE__*/_react.default.createElement("code", null, "_id"), "'s at the destination. The newly generated ", /*#__PURE__*/_react.default.createElement("code", null, "_id"), ' ', "will be the same in each duplication, but it will never be the same", ' ', /*#__PURE__*/_react.default.createElement("code", null, "_id"), " as the first time this Asset was uploaded. References to the asset will be updated to use the new ", /*#__PURE__*/_react.default.createElement("code", null, "_id"), ".")));
547
+ }, "Due to how SVGs are sanitized after first uploaded, duplicated SVG assets may have new ", /*#__PURE__*/_react.default.createElement("code", null, "_id"), "'s at the destination. The newly generated", ' ', /*#__PURE__*/_react.default.createElement("code", null, "_id"), " will be the same in each duplication, but it will never be the same ", /*#__PURE__*/_react.default.createElement("code", null, "_id"), " as the first time this Asset was uploaded. References to the asset will be updated to use the new ", /*#__PURE__*/_react.default.createElement("code", null, "_id"), ".")));
534
548
  })), /*#__PURE__*/_react.default.createElement(_ui.Stack, {
535
549
  space: 2,
536
550
  padding: 4,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/DuplicatorTool.tsx"],"names":["DuplicatorTool","props","docs","token","originClient","sanityClient","withConfig","clientConfig","spacesOptions","config","__experimental_spaces","length","map","space","disabled","api","dataset","find","destination","setDestination","message","setMessage","item","doc","include","status","payload","setPayload","hasReferences","setHasReferences","isDuplicating","setIsDuplicating","isGathering","setIsGathering","progress","setProgress","expr","initialRefs","initialPayload","forEach","push","docCount","refsCount","tone","text","updatePayloadStatuses","newPayload","payloadActual","name","payloadIds","_id","destinationClient","projectId","destinationData","fetch","updatedPayload","existingDoc","_updatedAt","Date","handleCheckbox","handleReferences","docIds","payloadDocs","payloadShaped","handleDuplicate","assetsCount","filter","_type","currentProgress","transactionDocs","svgMaps","fetchDoc","uploadType","split","pop","replace","downloadUrl","url","downloadConfig","headers","Authorization","then","res","assetData","blob","options","filename","originalFilename","assetDoc","assets","upload","extension","old","new","result","Promise","resolve","reject","payloadIncludedDocs","err","console","error","Error","transactionDocsMapped","references","ref","newRefValue","asset","value","refPath","path","join","transaction","createOrReplace","commit","catch","details","description","handleChange","e","currentTarget","payloadCount","firstSvgIndex","findIndex","selectedDocumentsCount","selectedAssetsCount","selectedTotal","destinationTitle","title","hasMultipleProjectIds","Set","Boolean","size","headingText","buttonText","React","useMemo","stickyStyles","flex","width","transform","transformOrigin","transition","boxSizing","index","schema","get","SearchIcon","LaunchIcon"],"mappings":"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","sourcesContent":["/* eslint-disable react/jsx-no-bind */\nimport React, {useState, useEffect} from 'react'\nimport mapLimit from 'async/mapLimit'\nimport asyncify from 'async/asyncify'\nimport {extract, extractWithPath} from '@sanity/mutator'\nimport {dset} from 'dset'\nimport {Card, Container, Text, Box, Button, Label, Stack, Select, Flex, Checkbox} from '@sanity/ui'\nimport {ArrowRightIcon, SearchIcon, LaunchIcon} from '@sanity/icons'\nimport sanityClient from 'part:@sanity/base/client'\nimport Preview from 'part:@sanity/base/preview'\nimport schema from 'part:@sanity/base/schema'\nimport config from 'config:sanity'\n\nimport {typeIsAsset, stickyStyles, createInitialMessage} from '../helpers'\nimport {getDocumentsInArray} from '../helpers/getDocumentsInArray'\nimport SelectButtons from './SelectButtons'\nimport StatusBadge from './StatusBadge'\nimport Feedback from './Feedback'\nimport {SanityDocument} from '../types'\nimport {clientConfig} from '../helpers/clientConfig'\n\ntype DuplicatorToolProps = {\n docs: SanityDocument[]\n token: string\n}\n\nexport default function DuplicatorTool(props: DuplicatorToolProps) {\n const {docs, token} = props\n\n // Prepare origin (this Studio) client\n // In function-scope so it is up to date on every render\n const originClient = sanityClient.withConfig(clientConfig)\n\n // Create list of dataset options\n // and set initial value of dropdown\n const spacesOptions = config?.__experimental_spaces?.length\n ? config.__experimental_spaces.map((space) => ({\n ...space,\n disabled: space.api.dataset === originClient.config().dataset,\n }))\n : []\n\n const [destination, setDestination] = useState(\n spacesOptions.length ? spacesOptions.find((space) => !space.disabled) : {}\n )\n const [message, setMessage] = useState({})\n const [payload, setPayload] = useState(\n docs.length\n ? docs.map((item) => ({\n doc: item,\n include: true,\n status: null,\n }))\n : []\n )\n const [hasReferences, setHasReferences] = useState(false)\n const [isDuplicating, setIsDuplicating] = useState(false)\n const [isGathering, setIsGathering] = useState(false)\n const [progress, setProgress] = useState([0, 0])\n\n // Check for References and update message\n useEffect(() => {\n const expr = `.._ref`\n const initialRefs = []\n const initialPayload = []\n\n docs.forEach((doc) => {\n initialRefs.push(...extract(expr, doc))\n initialPayload.push({include: true, doc})\n })\n\n setPayload(initialPayload)\n\n const docCount = docs.length\n const refsCount = initialRefs.length\n\n if (initialRefs.length) {\n setHasReferences(true)\n\n setMessage({\n tone: `caution`,\n text: createInitialMessage(docCount, refsCount),\n })\n }\n }, [docs])\n\n // Re-check payload on destination when value changes\n // (On initial render + select change)\n useEffect(() => {\n updatePayloadStatuses()\n }, [destination, docs])\n\n // Check if payload documents exist at destination\n async function updatePayloadStatuses(newPayload = []) {\n const payloadActual = newPayload.length ? newPayload : payload\n\n if (!payloadActual.length || !destination?.name) {\n return\n }\n\n const payloadIds = payloadActual.map(({doc}) => doc._id)\n const destinationClient = sanityClient.withConfig({\n ...clientConfig,\n dataset: destination.api.dataset,\n projectId: destination.api.projectId,\n })\n const destinationData = await destinationClient.fetch(\n `*[_id in $payloadIds]{ _id, _updatedAt }`,\n {payloadIds}\n )\n\n const updatedPayload = payloadActual.map((item) => {\n const existingDoc = destinationData.find((doc) => doc._id === item.doc._id)\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 item.status = `EXISTS`\n } else if (existingDoc._updatedAt && item.doc._updatedAt) {\n item.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 } else {\n item.status = 'CREATE'\n }\n\n return item\n })\n\n setPayload(updatedPayload)\n }\n\n function handleCheckbox(_id) {\n const updatedPayload = payload.map((item) => {\n if (item.doc._id === _id) {\n item.include = !item.include\n }\n\n return item\n })\n\n setPayload(updatedPayload)\n }\n\n // Find and recursively follow references beginning with this document\n async function handleReferences() {\n setIsGathering(true)\n const docIds = docs.map((doc) => doc._id)\n\n const payloadDocs = await getDocumentsInArray(docIds, originClient, null)\n\n // Shape it up\n const payloadShaped = payloadDocs.map((doc) => ({\n doc,\n // Include this in the transaction?\n include: true,\n // Does it exist at the destination?\n status: '',\n }))\n\n setPayload(payloadShaped)\n updatePayloadStatuses(payloadShaped)\n setIsGathering(false)\n }\n\n // Duplicate payload to destination dataset\n async function handleDuplicate() {\n setIsDuplicating(true)\n\n const assetsCount = payload.filter(({doc, include}) => include && typeIsAsset(doc._type)).length\n let currentProgress = 0\n setProgress([currentProgress, assetsCount])\n\n setMessage({text: 'Duplicating...'})\n\n const destinationClient = sanityClient.withConfig({\n ...clientConfig,\n dataset: destination.api.dataset,\n projectId: destination.api.projectId,\n })\n\n const transactionDocs = []\n const svgMaps = []\n\n // Upload assets and then add to transaction\n async function fetchDoc(doc) {\n if (typeIsAsset(doc._type)) {\n // Download and upload asset\n // Get the *original* image with this dlRaw param to create the same determenistic _id\n const uploadType = doc._type.split('.').pop().replace('Asset', '')\n const downloadUrl = uploadType === 'image' ? `${doc.url}?dlRaw=true` : doc.url\n const downloadConfig =\n uploadType === 'image' ? {headers: {Authorization: token ? `Bearer ${token}` : ``}} : {}\n\n await fetch(downloadUrl, downloadConfig).then(async (res) => {\n const assetData = await res.blob()\n\n const options = {filename: doc.originalFilename}\n const assetDoc = await destinationClient.assets.upload(uploadType, assetData, options)\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 transactionDocs.push(assetDoc)\n })\n\n currentProgress += 1\n setMessage({\n text: `Duplicating ${currentProgress}/${assetsCount} ${\n assetsCount === 1 ? `Assets` : `Assets`\n }`,\n })\n\n return setProgress([currentProgress, assetsCount])\n }\n\n return transactionDocs.push(doc)\n }\n\n // Promises are limited to three at once\n const result = new Promise((resolve, reject) => {\n const payloadIncludedDocs = payload.filter((item) => item.include).map((item) => item.doc)\n\n mapLimit(payloadIncludedDocs, 3, asyncify(fetchDoc), (err) => {\n if (err) {\n setIsDuplicating(false)\n setMessage({tone: 'critical', text: `Duplication Failed`})\n console.error(err)\n reject(new Error('Duplication Failed'))\n }\n\n resolve()\n })\n })\n\n await result\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 await transaction\n .commit()\n .then((res) => {\n setMessage({tone: 'positive', text: 'Duplication complete!'})\n\n updatePayloadStatuses()\n })\n .catch((err) => {\n setMessage({tone: 'critical', text: err.details.description})\n })\n\n setIsDuplicating(false)\n setProgress(0)\n }\n\n function handleChange(e) {\n setDestination(spacesOptions.find((space) => space.name === e.currentTarget.value))\n }\n\n if (!spacesOptions.length) {\n return (\n <Feedback tone=\"critical\">\n <code>__experimental_spaces</code> not found in <code>sanity.json</code>\n </Feedback>\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 && !typeIsAsset(item.doc._type)\n ).length\n const selectedAssetsCount = payload.filter(\n (item) => item.include && typeIsAsset(item.doc._type)\n ).length\n const selectedTotal = selectedDocumentsCount + selectedAssetsCount\n const destinationTitle = destination?.title ?? destination?.name\n const hasMultipleProjectIds =\n new Set(spacesOptions.map((space) => space?.api?.projectId).filter(Boolean)).size > 1\n\n const headingText = [selectedTotal, `/`, payloadCount, `Documents and Assets selected`].join(` `)\n\n const buttonText = React.useMemo(() => {\n let text = [`Duplicate`]\n\n if (selectedDocumentsCount > 1) {\n text.push(selectedDocumentsCount, selectedDocumentsCount === 1 ? `Document` : `Documents`)\n }\n\n if (selectedAssetsCount > 1) {\n text.push(`and`, selectedAssetsCount, selectedAssetsCount === 1 ? `Asset` : `Assets`)\n }\n\n if (originClient.config().projectId !== destination.api.projectId) {\n text.push(`between Projects`)\n }\n\n text.push(`to`, destinationTitle)\n\n return text.join(` `)\n }, [selectedDocumentsCount, selectedAssetsCount, destinationTitle])\n\n return (\n <Container width={1}>\n <Card>\n <Stack>\n <>\n <Card borderBottom padding={4} style={stickyStyles}>\n <Stack space={4}>\n <Flex space={3}>\n <Stack style={{flex: 1}} space={3}>\n <Label>Duplicate from</Label>\n <Select readOnly value={spacesOptions.find((space) => space.disabled)?.name}>\n {spacesOptions\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.api.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}} space={3}>\n <Label>To Destination</Label>\n <Select onChange={handleChange}>\n {spacesOptions.map((space) => (\n <option key={space.name} value={space.name} disabled={space.disabled}>\n {space.title ?? space.name}\n {hasMultipleProjectIds ? ` (${space.api.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 {message?.text && (\n <Box paddingX={4} paddingTop={4}>\n <Card padding={3} radius={2} shadow={1} tone={message?.tone ?? 'transparent'}>\n <Text size={1}>{message.text}</Text>\n </Card>\n </Box>\n )}\n {payload.length > 0 && (\n <Stack padding={4} space={3}>\n {payload.map(({doc, include, status}, index) => (\n <React.Fragment key={doc._id}>\n <Flex align=\"center\">\n <Checkbox checked={include} onChange={() => handleCheckbox(doc._id)} />\n <Box style={{flex: 1}} paddingX={3}>\n <Preview value={doc} type={schema.get(doc._type)} />\n </Box>\n <StatusBadge status={status} isAsset={typeIsAsset(doc._type)} />\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 assets may have new{' '}\n <code>_id</code>'s at the destination. The newly generated <code>_id</code>{' '}\n will be the same in each duplication, but it will never be the same{' '}\n <code>_id</code> as the first time this Asset was uploaded. References to the asset will be updated to use the new <code>_id</code>.\n </Text>\n </Card>\n )}\n </React.Fragment>\n ))}\n </Stack>\n )}\n <Stack space={2} padding={4} paddingTop={0}>\n {hasReferences && (\n <Button\n fontSize={2}\n padding={4}\n tone=\"positive\"\n mode=\"ghost\"\n icon={SearchIcon}\n onClick={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={handleDuplicate}\n text={buttonText}\n disabled={isDuplicating || !selectedTotal || isGathering}\n />\n </Stack>\n </>\n </Stack>\n </Card>\n </Container>\n )\n}\n"],"file":"DuplicatorTool.js"}
1
+ {"version":3,"file":"DuplicatorTool.js","names":["DuplicatorTool","props","docs","draftIds","token","originClient","sanityClient","withConfig","clientConfig","spacesOptions","config","__experimental_spaces","length","map","space","disabled","api","dataset","projectId","find","destination","setDestination","message","setMessage","item","doc","include","status","hasDraft","includes","_id","payload","setPayload","hasReferences","setHasReferences","isDuplicating","setIsDuplicating","isGathering","setIsGathering","progress","setProgress","expr","initialRefs","initialPayload","forEach","push","docCount","refsCount","tone","text","updatePayloadStatuses","newPayload","payloadActual","name","payloadIds","destinationClient","destinationData","fetch","updatedPayload","existingDoc","_updatedAt","Date","handleCheckbox","handleReferences","docIds","payloadDocs","draftDocs","id","draftDocsIds","Set","payloadShaped","has","handleDuplicate","assetsCount","filter","_type","currentProgress","transactionDocs","svgMaps","fetchDoc","uploadType","split","pop","replace","downloadUrl","url","downloadConfig","headers","Authorization","then","res","assetData","blob","options","filename","originalFilename","assetDoc","assets","upload","extension","old","new","result","Promise","resolve","reject","payloadIncludedDocs","err","console","error","Error","transactionDocsMapped","references","ref","newRefValue","asset","value","refPath","path","join","transaction","createOrReplace","commit","catch","details","description","handleChange","e","currentTarget","payloadCount","firstSvgIndex","findIndex","selectedDocumentsCount","selectedAssetsCount","selectedTotal","destinationTitle","title","hasMultipleProjectIds","Boolean","size","headingText","buttonText","React","useMemo","stickyStyles","flex","width","transform","transformOrigin","transition","boxSizing","index","schema","get","SearchIcon","LaunchIcon"],"sources":["../../src/components/DuplicatorTool.tsx"],"sourcesContent":["/* eslint-disable react/jsx-no-bind */\nimport React, {useState, useEffect} from 'react'\nimport mapLimit from 'async/mapLimit'\nimport asyncify from 'async/asyncify'\nimport {extract, extractWithPath} from '@sanity/mutator'\nimport {dset} from 'dset'\nimport {\n Card,\n Container,\n Text,\n Box,\n Button,\n Label,\n Stack,\n Select,\n Flex,\n Checkbox,\n Badge,\n} from '@sanity/ui'\nimport {ArrowRightIcon, SearchIcon, LaunchIcon} from '@sanity/icons'\nimport sanityClient from 'part:@sanity/base/client'\nimport Preview from 'part:@sanity/base/preview'\nimport schema from 'part:@sanity/base/schema'\nimport config from 'config:sanity'\n\nimport {typeIsAsset, stickyStyles, createInitialMessage} from '../helpers'\nimport {getDocumentsInArray} from '../helpers/getDocumentsInArray'\nimport SelectButtons from './SelectButtons'\nimport StatusBadge from './StatusBadge'\nimport Feedback from './Feedback'\nimport {SanityDocument} from '../types'\nimport {clientConfig} from '../helpers/clientConfig'\n\ntype DuplicatorToolProps = {\n docs: SanityDocument[]\n draftIds: string[]\n token: string\n}\n\nexport default function DuplicatorTool(props: DuplicatorToolProps) {\n const {docs, draftIds, token} = props\n\n // Prepare origin (this Studio) client\n // In function-scope so it is up to date on every render\n const originClient = sanityClient.withConfig(clientConfig)\n\n // Create list of dataset options\n // and set initial value of dropdown\n const spacesOptions = config?.__experimental_spaces?.length\n ? config.__experimental_spaces.map((space) => ({\n ...space,\n disabled:\n space.api.dataset === originClient.config().dataset &&\n space.api.projectId === originClient.config().projectId,\n }))\n : []\n\n const [destination, setDestination] = useState(\n spacesOptions.length ? spacesOptions.find((space) => !space.disabled) : {}\n )\n const [message, setMessage] = useState({})\n const [payload, setPayload] = useState(\n docs.length\n ? docs.map((item) => ({\n doc: item,\n include: true,\n status: null,\n hasDraft: draftIds.includes(`drafts.${item._id}`),\n }))\n : []\n )\n const [hasReferences, setHasReferences] = useState(false)\n const [isDuplicating, setIsDuplicating] = useState(false)\n const [isGathering, setIsGathering] = useState(false)\n const [progress, setProgress] = useState([0, 0])\n\n // Check for References and update message\n useEffect(() => {\n const expr = `.._ref`\n const initialRefs = []\n const initialPayload = []\n\n docs.forEach((doc) => {\n initialRefs.push(...extract(expr, doc))\n initialPayload.push({include: true, doc})\n })\n\n setPayload(initialPayload)\n\n const docCount = docs.length\n const refsCount = initialRefs.length\n\n if (initialRefs.length) {\n setHasReferences(true)\n\n setMessage({\n tone: `caution`,\n text: createInitialMessage(docCount, refsCount),\n })\n }\n }, [docs])\n\n // Re-check payload on destination when value changes\n // (On initial render + select change)\n useEffect(() => {\n updatePayloadStatuses()\n }, [destination, docs])\n\n // Check if payload documents exist at destination\n async function updatePayloadStatuses(newPayload = []) {\n const payloadActual = newPayload.length ? newPayload : payload\n\n if (!payloadActual.length || !destination?.name) {\n return\n }\n\n const payloadIds = payloadActual.map(({doc}) => doc._id)\n const destinationClient = sanityClient.withConfig({\n ...clientConfig,\n dataset: destination.api.dataset,\n projectId: destination.api.projectId,\n })\n const destinationData = await destinationClient.fetch(\n `*[_id in $payloadIds]{ _id, _updatedAt }`,\n {payloadIds}\n )\n\n const updatedPayload = payloadActual.map((item) => {\n const existingDoc = destinationData.find((doc) => doc._id === item.doc._id)\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 item.status = `EXISTS`\n } else if (existingDoc._updatedAt && item.doc._updatedAt) {\n item.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 } else {\n item.status = 'CREATE'\n }\n\n return item\n })\n\n setPayload(updatedPayload)\n }\n\n function handleCheckbox(_id) {\n const updatedPayload = payload.map((item) => {\n if (item.doc._id === _id) {\n item.include = !item.include\n }\n\n return item\n })\n\n setPayload(updatedPayload)\n }\n\n // Find and recursively follow references beginning with this document\n async function handleReferences() {\n setIsGathering(true)\n const docIds = docs.map((doc) => doc._id)\n\n const payloadDocs = await getDocumentsInArray(docIds, originClient, null)\n const draftDocs = await getDocumentsInArray(\n docIds.map((id) => `drafts.${id}`),\n originClient,\n null,\n `{_id}`\n )\n const draftDocsIds = new Set(draftDocs.map(({_id}) => _id))\n\n // Shape it up\n const payloadShaped = payloadDocs.map((doc) => ({\n doc,\n // Include this in the transaction?\n include: true,\n // Does it exist at the destination?\n status: '',\n // Does it have any drafts?\n hasDraft: draftDocsIds.has(`drafts.${doc._id}`),\n }))\n\n setPayload(payloadShaped)\n updatePayloadStatuses(payloadShaped)\n setIsGathering(false)\n }\n\n // Duplicate payload to destination dataset\n async function handleDuplicate() {\n setIsDuplicating(true)\n\n const assetsCount = payload.filter(({doc, include}) => include && typeIsAsset(doc._type)).length\n let currentProgress = 0\n setProgress([currentProgress, assetsCount])\n\n setMessage({text: 'Duplicating...'})\n\n const destinationClient = sanityClient.withConfig({\n ...clientConfig,\n dataset: destination.api.dataset,\n projectId: destination.api.projectId,\n })\n\n const transactionDocs = []\n const svgMaps = []\n\n // Upload assets and then add to transaction\n async function fetchDoc(doc) {\n if (typeIsAsset(doc._type)) {\n // Download and upload asset\n // Get the *original* image with this dlRaw param to create the same determenistic _id\n const uploadType = doc._type.split('.').pop().replace('Asset', '')\n const downloadUrl = uploadType === 'image' ? `${doc.url}?dlRaw=true` : doc.url\n const downloadConfig =\n uploadType === 'image' ? {headers: {Authorization: `Bearer ${token}`}} : {}\n\n await fetch(downloadUrl, downloadConfig).then(async (res) => {\n const assetData = await res.blob()\n\n const options = {filename: doc.originalFilename}\n const assetDoc = await destinationClient.assets.upload(uploadType, assetData, options)\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 transactionDocs.push(assetDoc)\n })\n\n currentProgress += 1\n setMessage({\n text: `Duplicating ${currentProgress}/${assetsCount} ${\n assetsCount === 1 ? `Assets` : `Assets`\n }`,\n })\n\n return setProgress([currentProgress, assetsCount])\n }\n\n return transactionDocs.push(doc)\n }\n\n // Promises are limited to three at once\n const result = new Promise((resolve, reject) => {\n const payloadIncludedDocs = payload.filter((item) => item.include).map((item) => item.doc)\n\n mapLimit(payloadIncludedDocs, 3, asyncify(fetchDoc), (err) => {\n if (err) {\n setIsDuplicating(false)\n setMessage({tone: 'critical', text: `Duplication Failed`})\n console.error(err)\n reject(new Error('Duplication Failed'))\n }\n\n resolve()\n })\n })\n\n await result\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 await transaction\n .commit()\n .then((res) => {\n setMessage({tone: 'positive', text: 'Duplication complete!'})\n\n updatePayloadStatuses()\n })\n .catch((err) => {\n setMessage({tone: 'critical', text: err.details.description})\n })\n\n setIsDuplicating(false)\n setProgress(0)\n }\n\n function handleChange(e) {\n setDestination(spacesOptions.find((space) => space.name === e.currentTarget.value))\n }\n\n if (!spacesOptions.length) {\n return (\n <Feedback tone=\"critical\">\n <code>__experimental_spaces</code> not found in <code>sanity.json</code>\n </Feedback>\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 && !typeIsAsset(item.doc._type)\n ).length\n const selectedAssetsCount = payload.filter(\n (item) => item.include && typeIsAsset(item.doc._type)\n ).length\n const selectedTotal = selectedDocumentsCount + selectedAssetsCount\n const destinationTitle = destination?.title ?? destination?.name\n const hasMultipleProjectIds =\n new Set(spacesOptions.map((space) => space?.api?.projectId).filter(Boolean)).size > 1\n\n const headingText = [selectedTotal, `/`, payloadCount, `Documents and Assets selected`].join(` `)\n\n const buttonText = React.useMemo(() => {\n let text = [`Duplicate`]\n\n if (selectedDocumentsCount > 1) {\n text.push(selectedDocumentsCount, selectedDocumentsCount === 1 ? `Document` : `Documents`)\n }\n\n if (selectedAssetsCount > 1) {\n text.push(`and`, selectedAssetsCount, selectedAssetsCount === 1 ? `Asset` : `Assets`)\n }\n\n if (originClient.config().projectId !== destination.api.projectId) {\n text.push(`between Projects`)\n }\n\n text.push(`to`, destinationTitle)\n\n return text.join(` `)\n }, [selectedDocumentsCount, selectedAssetsCount, destinationTitle])\n\n return (\n <Container width={1}>\n <Card>\n <Stack>\n <>\n <Card borderBottom padding={4} style={stickyStyles}>\n <Stack space={4}>\n <Flex space={3}>\n <Stack style={{flex: 1}} space={3}>\n <Label>Duplicate from</Label>\n <Select readOnly value={spacesOptions.find((space) => space.disabled)?.name}>\n {spacesOptions\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.api.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}} space={3}>\n <Label>To Destination</Label>\n <Select onChange={handleChange}>\n {spacesOptions.map((space) => (\n <option key={space.name} value={space.name} disabled={space.disabled}>\n {space.title ?? space.name}\n {hasMultipleProjectIds ? ` (${space.api.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 {message?.text && (\n <Box paddingX={4} paddingTop={4}>\n <Card padding={3} radius={2} shadow={1} tone={message?.tone ?? 'transparent'}>\n <Text size={1}>{message.text}</Text>\n </Card>\n </Box>\n )}\n {payload.length > 0 && (\n <Stack padding={4} space={3}>\n {payload.map(({doc, include, status, hasDraft}, index) => (\n <React.Fragment key={doc._id}>\n <Flex align=\"center\">\n <Checkbox checked={include} onChange={() => handleCheckbox(doc._id)} />\n <Box flex={1} paddingX={3}>\n <Preview value={doc} type={schema.get(doc._type)} />\n </Box>\n <Flex items=\"center\" gap={2}>\n {hasDraft ? <StatusBadge status=\"UNPUBLISHED\" isAsset={false} /> : null}\n <StatusBadge status={status} isAsset={typeIsAsset(doc._type)} />\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 assets\n may have new <code>_id</code>'s at the destination. The newly generated{' '}\n <code>_id</code> will be the same in each duplication, but it will never\n be the same <code>_id</code> as the first time this Asset was uploaded.\n References to the asset will be updated to use the new <code>_id</code>.\n </Text>\n </Card>\n )}\n </React.Fragment>\n ))}\n </Stack>\n )}\n <Stack space={2} padding={4} paddingTop={0}>\n {hasReferences && (\n <Button\n fontSize={2}\n padding={4}\n tone=\"positive\"\n mode=\"ghost\"\n icon={SearchIcon}\n onClick={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={handleDuplicate}\n text={buttonText}\n disabled={isDuplicating || !selectedTotal || isGathering}\n />\n </Stack>\n </>\n </Stack>\n </Card>\n </Container>\n )\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/Feedback.tsx"],"names":["Feedback","props","children","tone"],"mappings":";;;;;;;AAAA;;AACA;;;;AAQe,SAASA,QAAT,CAAkBC,KAAlB,EAAwC;AACrD,MAAOC,QAAP,GAAqCD,KAArC,CAAOC,QAAP;AAAA,oBAAqCD,KAArC,CAAiBE,IAAjB;AAAA,MAAiBA,IAAjB;AAEA,sBACE,6BAAC,QAAD;AAAM,IAAA,OAAO,EAAE,CAAf;AAAkB,IAAA,MAAM,EAAE,CAA1B;AAA6B,IAAA,MAAM,EAAE,CAArC;AAAwC,IAAA,IAAI,EAAEA;AAA9C,kBACE,6BAAC,QAAD;AAAM,IAAA,IAAI,EAAE;AAAZ,KAAgBD,QAAhB,CADF,CADF;AAKD","sourcesContent":["import React from 'react'\nimport {Card, Text} from '@sanity/ui'\nimport type {BadgeTone} from '@sanity/ui'\n\ntype FeedbackProps = {\n children?: React.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"],"file":"Feedback.js"}
1
+ {"version":3,"file":"Feedback.js","names":["Feedback","props","children","tone"],"sources":["../../src/components/Feedback.tsx"],"sourcesContent":["import React from 'react'\nimport {Card, Text} from '@sanity/ui'\nimport type {BadgeTone} from '@sanity/ui'\n\ntype FeedbackProps = {\n children?: React.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"],"mappings":";;;;;;;AAAA;;AACA;;;;AAQe,SAASA,QAAT,CAAkBC,KAAlB,EAAwC;EACrD,IAAOC,QAAP,GAAqCD,KAArC,CAAOC,QAAP;EAAA,kBAAqCD,KAArC,CAAiBE,IAAjB;EAAA,IAAiBA,IAAjB;EAEA,oBACE,6BAAC,QAAD;IAAM,OAAO,EAAE,CAAf;IAAkB,MAAM,EAAE,CAA1B;IAA6B,MAAM,EAAE,CAArC;IAAwC,IAAI,EAAEA;EAA9C,gBACE,6BAAC,QAAD;IAAM,IAAI,EAAE;EAAZ,GAAgBD,QAAhB,CADF,CADF;AAKD"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/ResetSecret.tsx"],"names":["client","sanityClient","withConfig","clientConfig","handleClick","delete","query","SECRET_NAMESPACE","ResetSecret"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AAEA;;AACA;;;;AAEA,IAAMA,MAAM,GAAGC,gBAAaC,UAAb,CAAwBC,0BAAxB,CAAf;;AAEA,SAASC,WAAT,GAAuB;AACrBJ,EAAAA,MAAM,CAACK,MAAP,CAAc;AAACC,IAAAA,KAAK,+BAAuBC,2BAAvB;AAAN,GAAd;AACD;;AAEc,SAASC,WAAT,GAAuB;AACpC,sBACE,6BAAC,QAAD;AAAM,IAAA,KAAK,EAAC,QAAZ;AAAqB,IAAA,OAAO,EAAC,UAA7B;AAAwC,IAAA,QAAQ,EAAE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CAAlD;AAAgE,IAAA,QAAQ,EAAE;AAA1E,kBACE,6BAAC,UAAD;AACE,IAAA,IAAI,EAAC,cADP;AAEE,IAAA,OAAO,EAAE,MAAMJ,WAAW,EAF5B;AAGE,IAAA,IAAI,EAAC,OAHP;AAIE,IAAA,IAAI,EAAC,UAJP;AAKE,IAAA,QAAQ,EAAE,CALZ;AAME,IAAA,OAAO,EAAE;AANX,IADF,CADF;AAYD","sourcesContent":["import React from 'react'\nimport {Button, Flex} from '@sanity/ui'\nimport sanityClient from 'part:@sanity/base/client'\n\nimport { clientConfig } from '../helpers/clientConfig'\nimport { SECRET_NAMESPACE } from '../helpers/constants'\n\nconst client = sanityClient.withConfig(clientConfig)\n\nfunction handleClick() {\n client.delete({query: `*[_id == \"secrets.${SECRET_NAMESPACE}\"]`})\n}\n\nexport default function ResetSecret() {\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"],"file":"ResetSecret.js"}
1
+ {"version":3,"file":"ResetSecret.js","names":["client","sanityClient","withConfig","clientConfig","handleClick","delete","query","SECRET_NAMESPACE","ResetSecret"],"sources":["../../src/components/ResetSecret.tsx"],"sourcesContent":["import React from 'react'\nimport {Button, Flex} from '@sanity/ui'\nimport sanityClient from 'part:@sanity/base/client'\n\nimport { clientConfig } from '../helpers/clientConfig'\nimport { SECRET_NAMESPACE } from '../helpers/constants'\n\nconst client = sanityClient.withConfig(clientConfig)\n\nfunction handleClick() {\n client.delete({query: `*[_id == \"secrets.${SECRET_NAMESPACE}\"]`})\n}\n\nexport default function ResetSecret() {\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"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AAEA;;AACA;;;;AAEA,IAAMA,MAAM,GAAGC,gBAAaC,UAAb,CAAwBC,0BAAxB,CAAf;;AAEA,SAASC,WAAT,GAAuB;EACrBJ,MAAM,CAACK,MAAP,CAAc;IAACC,KAAK,+BAAuBC,2BAAvB;EAAN,CAAd;AACD;;AAEc,SAASC,WAAT,GAAuB;EACpC,oBACE,6BAAC,QAAD;IAAM,KAAK,EAAC,QAAZ;IAAqB,OAAO,EAAC,UAA7B;IAAwC,QAAQ,EAAE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CAAlD;IAAgE,QAAQ,EAAE;EAA1E,gBACE,6BAAC,UAAD;IACE,IAAI,EAAC,cADP;IAEE,OAAO,EAAE,MAAMJ,WAAW,EAF5B;IAGE,IAAI,EAAC,OAHP;IAIE,IAAI,EAAC,UAJP;IAKE,QAAQ,EAAE,CALZ;IAME,OAAO,EAAE;EANX,EADF,CADF;AAYD"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/SelectButtons.tsx"],"names":["buttons","SelectButtons","props","payload","setPayload","disabledActions","setDisabledActions","length","every","item","include","handleSelectButton","action","newPayload","map","Boolean","status","doc","_type","actionIndex","includes","toUpperCase"],"mappings":"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","sourcesContent":["import React, {useState, useEffect} from 'react'\nimport {Button, Card, Flex} from '@sanity/ui'\nimport {typeIsAsset} from '../helpers'\nimport {PayloadItem} from '../types'\n\nconst buttons = [`All`, `None`, null, `New`, `Existing`, `Older`, null, `Documents`, `Assets`]\n\ntype SelectButtonsProps = {\n payload: PayloadItem[]\n setPayload: Function\n}\n\nexport default function SelectButtons(props: SelectButtonsProps) {\n const {payload, setPayload} = props\n const [disabledActions, setDisabledActions] = useState([])\n\n // Set intiial disabled button\n useEffect(() => {\n if (!disabledActions?.length && payload.every((item) => item.include)) {\n setDisabledActions([`ALL`])\n }\n }, [])\n\n function handleSelectButton(action = ``) {\n if (!action || !payload.length) return\n\n const newPayload = [...payload]\n\n switch (action) {\n case 'ALL':\n newPayload.map((item) => (item.include = true))\n break\n case 'NONE':\n newPayload.map((item) => (item.include = false))\n break\n case 'NEW':\n newPayload.map((item) => (item.include = Boolean(item.status === 'CREATE')))\n break\n case 'EXISTING':\n newPayload.map((item) => (item.include = Boolean(item.status === 'EXISTS')))\n break\n case 'OLDER':\n newPayload.map((item) => (item.include = Boolean(item.status === 'OVERWRITE')))\n break\n case 'ASSETS':\n newPayload.map((item) => (item.include = typeIsAsset(item.doc._type)))\n break\n case 'DOCUMENTS':\n newPayload.map((item) => (item.include = !typeIsAsset(item.doc._type)))\n break\n default:\n break\n }\n\n setDisabledActions([action])\n setPayload(newPayload)\n }\n\n return (\n <Card padding={1} radius={3} shadow={1}>\n <Flex gap={2}>\n {buttons.map((action, actionIndex) =>\n action ? (\n <Button\n key={action}\n fontSize={1}\n mode=\"bleed\"\n padding={2}\n text={action}\n disabled={disabledActions.includes(action.toUpperCase())}\n onClick={() => handleSelectButton(action.toUpperCase())}\n />\n ) : (\n <Card key={`divider-${actionIndex}`} borderLeft />\n )\n )}\n </Flex>\n </Card>\n )\n}\n"],"file":"SelectButtons.js"}
1
+ {"version":3,"file":"SelectButtons.js","names":["buttons","SelectButtons","props","payload","setPayload","disabledActions","setDisabledActions","length","every","item","include","handleSelectButton","action","newPayload","map","Boolean","status","doc","_type","actionIndex","includes","toUpperCase"],"sources":["../../src/components/SelectButtons.tsx"],"sourcesContent":["import React, {useState, useEffect} from 'react'\nimport {Button, Card, Flex} from '@sanity/ui'\nimport {typeIsAsset} from '../helpers'\nimport {PayloadItem} from '../types'\n\nconst buttons = [`All`, `None`, null, `New`, `Existing`, `Older`, null, `Documents`, `Assets`]\n\ntype SelectButtonsProps = {\n payload: PayloadItem[]\n setPayload: Function\n}\n\nexport default function SelectButtons(props: SelectButtonsProps) {\n const {payload, setPayload} = props\n const [disabledActions, setDisabledActions] = useState([])\n\n // Set intiial disabled button\n useEffect(() => {\n if (!disabledActions?.length && payload.every((item) => item.include)) {\n setDisabledActions([`ALL`])\n }\n }, [])\n\n function handleSelectButton(action = ``) {\n if (!action || !payload.length) return\n\n const newPayload = [...payload]\n\n switch (action) {\n case 'ALL':\n newPayload.map((item) => (item.include = true))\n break\n case 'NONE':\n newPayload.map((item) => (item.include = false))\n break\n case 'NEW':\n newPayload.map((item) => (item.include = Boolean(item.status === 'CREATE')))\n break\n case 'EXISTING':\n newPayload.map((item) => (item.include = Boolean(item.status === 'EXISTS')))\n break\n case 'OLDER':\n newPayload.map((item) => (item.include = Boolean(item.status === 'OVERWRITE')))\n break\n case 'ASSETS':\n newPayload.map((item) => (item.include = typeIsAsset(item.doc._type)))\n break\n case 'DOCUMENTS':\n newPayload.map((item) => (item.include = !typeIsAsset(item.doc._type)))\n break\n default:\n break\n }\n\n setDisabledActions([action])\n setPayload(newPayload)\n }\n\n return (\n <Card padding={1} radius={3} shadow={1}>\n <Flex gap={2}>\n {buttons.map((action, actionIndex) =>\n action ? (\n <Button\n key={action}\n fontSize={1}\n mode=\"bleed\"\n padding={2}\n text={action}\n disabled={disabledActions.includes(action.toUpperCase())}\n onClick={() => handleSelectButton(action.toUpperCase())}\n />\n ) : (\n <Card key={`divider-${actionIndex}`} borderLeft />\n )\n )}\n </Flex>\n </Card>\n )\n}\n"],"mappings":"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"}
@@ -15,13 +15,15 @@ var documentTones = {
15
15
  EXISTS: "primary",
16
16
  OVERWRITE: "critical",
17
17
  UPDATE: "caution",
18
- CREATE: "positive"
18
+ CREATE: "positive",
19
+ UNPUBLISHED: "caution"
19
20
  };
20
21
  var assetTones = {
21
22
  EXISTS: "critical",
22
23
  OVERWRITE: "critical",
23
24
  UPDATE: "critical",
24
- CREATE: "positive"
25
+ CREATE: "positive",
26
+ UNPUBLISHED: "default"
25
27
  };
26
28
  var documentMessages = {
27
29
  // Only happens once document is copied the first time, and _updatedAt is the same
@@ -33,19 +35,22 @@ var documentMessages = {
33
35
  // Document at destination is older
34
36
  UPDATE: "An older version of this document exists at the Destination, and it will be overwritten with this version.",
35
37
  // Document at destination doesn't exist
36
- CREATE: "This document will be created at the destination."
38
+ CREATE: "This document will be created at the destination.",
39
+ UNPUBLISHED: "A Draft version of this Document exists in this Dataset, but only the Published version will be duplicated to the destination."
37
40
  };
38
41
  var assetMessages = {
39
42
  EXISTS: "This Asset already exists at the Destination",
40
43
  OVERWRITE: "This Asset already exists at the Destination",
41
44
  UPDATE: "This Asset already exists at the Destination",
42
- CREATE: "This Asset does not yet exist at the Destination"
45
+ CREATE: "This Asset does not yet exist at the Destination",
46
+ UNPUBLISHED: ""
43
47
  };
44
48
  var assetStatus = {
45
49
  EXISTS: "RE-UPLOAD",
46
50
  OVERWRITE: "RE-UPLOAD",
47
51
  UPDATE: "RE-UPLOAD",
48
- CREATE: "UPLOAD"
52
+ CREATE: "UPLOAD",
53
+ UNPUBLISHED: ""
49
54
  };
50
55
 
51
56
  function StatusBadge(props) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/StatusBadge.tsx"],"names":["documentTones","EXISTS","OVERWRITE","UPDATE","CREATE","assetTones","documentMessages","assetMessages","assetStatus","StatusBadge","props","status","isAsset","badgeTone","badgeText","badgeStatus","maxWidth"],"mappings":";;;;;;;AAAA;;AACA;;;;AAUA,IAAMA,aAA0B,GAAG;AACjCC,EAAAA,MAAM,WAD2B;AAEjCC,EAAAA,SAAS,YAFwB;AAGjCC,EAAAA,MAAM,WAH2B;AAIjCC,EAAAA,MAAM;AAJ2B,CAAnC;AAOA,IAAMC,UAAuB,GAAG;AAC9BJ,EAAAA,MAAM,YADwB;AAE9BC,EAAAA,SAAS,YAFqB;AAG9BC,EAAAA,MAAM,YAHwB;AAI9BC,EAAAA,MAAM;AAJwB,CAAhC;AAcA,IAAME,gBAA8B,GAAG;AACrC;AACAL,EAAAA,MAAM,gGAF+B;AAGrC;AACA;AACA;AACAC,EAAAA,SAAS,6GAN4B;AAOrC;AACAC,EAAAA,MAAM,8GAR+B;AASrC;AACAC,EAAAA,MAAM;AAV+B,CAAvC;AAaA,IAAMG,aAA2B,GAAG;AAClCN,EAAAA,MAAM,gDAD4B;AAElCC,EAAAA,SAAS,gDAFyB;AAGlCC,EAAAA,MAAM,gDAH4B;AAIlCC,EAAAA,MAAM;AAJ4B,CAApC;AAOA,IAAMI,WAAyB,GAAG;AAChCP,EAAAA,MAAM,aAD0B;AAEhCC,EAAAA,SAAS,aAFuB;AAGhCC,EAAAA,MAAM,aAH0B;AAIhCC,EAAAA,MAAM;AAJ0B,CAAlC;;AAYe,SAASK,WAAT,CAAqBC,KAArB,EAA8C;AAC3D,MAAOC,MAAP,GAA0BD,KAA1B,CAAOC,MAAP;AAAA,MAAeC,OAAf,GAA0BF,KAA1B,CAAeE,OAAf;AAEA,MAAMC,SAAS,GAAGD,OAAO,GAAGP,UAAU,CAACM,MAAD,CAAb,GAAwBX,aAAa,CAACW,MAAD,CAA9D;;AAEA,MAAI,CAACE,SAAL,EAAgB;AACd,wBACE,6BAAC,SAAD;AAAO,MAAA,KAAK,MAAZ;AAAa,MAAA,OAAO,EAAE,CAAtB;AAAyB,MAAA,QAAQ,EAAE,CAAnC;AAAsC,MAAA,IAAI,EAAC;AAA3C,qBADF;AAKD;;AAED,MAAMC,SAAS,GAAGF,OAAO,GAAGL,aAAa,CAACI,MAAD,CAAhB,GAA2BL,gBAAgB,CAACK,MAAD,CAApE;AACA,MAAMI,WAAW,GAAGH,OAAO,GAAGJ,WAAW,CAACG,MAAD,CAAd,GAAyBA,MAApD;AAEA,sBACE,6BAAC,WAAD;AACE,IAAA,OAAO,eACL,6BAAC,OAAD;AAAK,MAAA,OAAO,EAAE,CAAd;AAAiB,MAAA,KAAK,EAAE;AAACK,QAAAA,QAAQ,EAAE;AAAX;AAAxB,oBACE,6BAAC,QAAD;AAAM,MAAA,IAAI,EAAE;AAAZ,OAAgBF,SAAhB,CADF,CAFJ;AAME,IAAA,kBAAkB,EAAE,CAAC,OAAD,EAAU,MAAV,CANtB;AAOE,IAAA,SAAS,EAAC,KAPZ;AAQE,IAAA,MAAM;AARR,kBAUE,6BAAC,SAAD;AAAO,IAAA,KAAK,MAAZ;AAAa,IAAA,OAAO,EAAE,CAAtB;AAAyB,IAAA,QAAQ,EAAE,CAAnC;AAAsC,IAAA,IAAI,EAAED,SAA5C;AAAuD,IAAA,IAAI,EAAC;AAA5D,KACGE,WADH,CAVF,CADF;AAgBD","sourcesContent":["import React from 'react'\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}\n\nconst documentTones: StatusTones = {\n EXISTS: `primary`,\n OVERWRITE: `critical`,\n UPDATE: `caution`,\n CREATE: `positive`,\n}\n\nconst assetTones: StatusTones = {\n EXISTS: `critical`,\n OVERWRITE: `critical`,\n UPDATE: `critical`,\n CREATE: `positive`,\n}\n\ntype messageTypes = {\n EXISTS: string\n OVERWRITE: string\n UPDATE: string\n CREATE: 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}\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}\n\nconst assetStatus: messageTypes = {\n EXISTS: `RE-UPLOAD`,\n OVERWRITE: `RE-UPLOAD`,\n UPDATE: `RE-UPLOAD`,\n CREATE: `UPLOAD`,\n}\n\ntype StatusBadgeProps = {\n status: 'EXISTS' | 'OVERWRITE' | 'UPDATE' | 'CREATE' | undefined\n isAsset: boolean\n}\n\nexport default function StatusBadge(props: StatusBadgeProps) {\n const {status, isAsset} = props\n\n const badgeTone = isAsset ? assetTones[status] : documentTones[status]\n \n if (!badgeTone) {\n return (\n <Badge muted padding={2} fontSize={1} mode=\"outline\">\n Checking...\n </Badge>\n )\n }\n \n const badgeText = isAsset ? assetMessages[status] : documentMessages[status]\n const badgeStatus = isAsset ? assetStatus[status] : status\n\n return (\n <Tooltip\n content={\n <Box padding={3} style={{maxWidth: 200}}>\n <Text size={1}>{badgeText}</Text>\n </Box>\n }\n fallbackPlacements={['right', 'left']}\n placement=\"top\"\n portal\n >\n <Badge muted padding={2} fontSize={1} tone={badgeTone} mode=\"outline\">\n {badgeStatus}\n </Badge>\n </Tooltip>\n )\n}\n"],"file":"StatusBadge.js"}
1
+ {"version":3,"file":"StatusBadge.js","names":["documentTones","EXISTS","OVERWRITE","UPDATE","CREATE","UNPUBLISHED","assetTones","documentMessages","assetMessages","assetStatus","StatusBadge","props","status","isAsset","badgeTone","badgeText","badgeStatus","maxWidth"],"sources":["../../src/components/StatusBadge.tsx"],"sourcesContent":["import React from 'react'\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\ntype 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 status: 'EXISTS' | 'OVERWRITE' | 'UPDATE' | 'CREATE' | 'UNPUBLISHED' | undefined\n isAsset: boolean\n}\n\nexport default function StatusBadge(props: StatusBadgeProps) {\n const {status, isAsset} = props\n\n const badgeTone = isAsset ? assetTones[status] : documentTones[status]\n \n if (!badgeTone) {\n return (\n <Badge muted padding={2} fontSize={1} mode=\"outline\">\n Checking...\n </Badge>\n )\n }\n \n const badgeText = isAsset ? assetMessages[status] : documentMessages[status]\n const badgeStatus = isAsset ? assetStatus[status] : status\n\n return (\n <Tooltip\n content={\n <Box padding={3} style={{maxWidth: 200}}>\n <Text size={1}>{badgeText}</Text>\n </Box>\n }\n fallbackPlacements={['right', 'left']}\n placement=\"top\"\n portal\n >\n <Badge muted padding={2} fontSize={1} tone={badgeTone} mode=\"outline\">\n {badgeStatus}\n </Badge>\n </Tooltip>\n )\n}\n"],"mappings":";;;;;;;AAAA;;AACA;;;;AAWA,IAAMA,aAA0B,GAAG;EACjCC,MAAM,WAD2B;EAEjCC,SAAS,YAFwB;EAGjCC,MAAM,WAH2B;EAIjCC,MAAM,YAJ2B;EAKjCC,WAAW;AALsB,CAAnC;AAQA,IAAMC,UAAuB,GAAG;EAC9BL,MAAM,YADwB;EAE9BC,SAAS,YAFqB;EAG9BC,MAAM,YAHwB;EAI9BC,MAAM,YAJwB;EAK9BC,WAAW;AALmB,CAAhC;AAgBA,IAAME,gBAA8B,GAAG;EACrC;EACAN,MAAM,gGAF+B;EAGrC;EACA;EACA;EACAC,SAAS,6GAN4B;EAOrC;EACAC,MAAM,8GAR+B;EASrC;EACAC,MAAM,qDAV+B;EAWrCC,WAAW;AAX0B,CAAvC;AAcA,IAAMG,aAA2B,GAAG;EAClCP,MAAM,gDAD4B;EAElCC,SAAS,gDAFyB;EAGlCC,MAAM,gDAH4B;EAIlCC,MAAM,oDAJ4B;EAKlCC,WAAW;AALuB,CAApC;AAQA,IAAMI,WAAyB,GAAG;EAChCR,MAAM,aAD0B;EAEhCC,SAAS,aAFuB;EAGhCC,MAAM,aAH0B;EAIhCC,MAAM,UAJ0B;EAKhCC,WAAW;AALqB,CAAlC;;AAae,SAASK,WAAT,CAAqBC,KAArB,EAA8C;EAC3D,IAAOC,MAAP,GAA0BD,KAA1B,CAAOC,MAAP;EAAA,IAAeC,OAAf,GAA0BF,KAA1B,CAAeE,OAAf;EAEA,IAAMC,SAAS,GAAGD,OAAO,GAAGP,UAAU,CAACM,MAAD,CAAb,GAAwBZ,aAAa,CAACY,MAAD,CAA9D;;EAEA,IAAI,CAACE,SAAL,EAAgB;IACd,oBACE,6BAAC,SAAD;MAAO,KAAK,MAAZ;MAAa,OAAO,EAAE,CAAtB;MAAyB,QAAQ,EAAE,CAAnC;MAAsC,IAAI,EAAC;IAA3C,iBADF;EAKD;;EAED,IAAMC,SAAS,GAAGF,OAAO,GAAGL,aAAa,CAACI,MAAD,CAAhB,GAA2BL,gBAAgB,CAACK,MAAD,CAApE;EACA,IAAMI,WAAW,GAAGH,OAAO,GAAGJ,WAAW,CAACG,MAAD,CAAd,GAAyBA,MAApD;EAEA,oBACE,6BAAC,WAAD;IACE,OAAO,eACL,6BAAC,OAAD;MAAK,OAAO,EAAE,CAAd;MAAiB,KAAK,EAAE;QAACK,QAAQ,EAAE;MAAX;IAAxB,gBACE,6BAAC,QAAD;MAAM,IAAI,EAAE;IAAZ,GAAgBF,SAAhB,CADF,CAFJ;IAME,kBAAkB,EAAE,CAAC,OAAD,EAAU,MAAV,CANtB;IAOE,SAAS,EAAC,KAPZ;IAQE,MAAM;EARR,gBAUE,6BAAC,SAAD;IAAO,KAAK,MAAZ;IAAa,OAAO,EAAE,CAAtB;IAAyB,QAAQ,EAAE,CAAnC;IAAsC,IAAI,EAAED,SAA5C;IAAuD,IAAI,EAAC;EAA5D,GACGE,WADH,CAVF,CADF;AAgBD"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/helpers/clientConfig.ts"],"names":["clientConfig","apiVersion"],"mappings":";;;;;;AAAO,IAAMA,YAAY,GAAG;AAACC,EAAAA,UAAU;AAAX,CAArB","sourcesContent":["export const clientConfig = {apiVersion: `2021-05-19`}"],"file":"clientConfig.js"}
1
+ {"version":3,"file":"clientConfig.js","names":["clientConfig","apiVersion"],"sources":["../../src/helpers/clientConfig.ts"],"sourcesContent":["export const clientConfig = {apiVersion: `2021-05-19`}"],"mappings":";;;;;;AAAO,IAAMA,YAAY,GAAG;EAACC,UAAU;AAAX,CAArB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/helpers/constants.ts"],"names":["SECRET_NAMESPACE"],"mappings":";;;;;;AAAO,IAAMA,gBAAgB,2BAAtB","sourcesContent":["export const SECRET_NAMESPACE = `CrossDatasetDuplicator`"],"file":"constants.js"}
1
+ {"version":3,"file":"constants.js","names":["SECRET_NAMESPACE"],"sources":["../../src/helpers/constants.ts"],"sourcesContent":["export const SECRET_NAMESPACE = `CrossDatasetDuplicator`"],"mappings":";;;;;;AAAO,IAAMA,gBAAgB,2BAAtB"}
@@ -13,15 +13,16 @@ function _asyncToGenerator(fn) { return function () { var self = this, args = ar
13
13
 
14
14
  // Recursively fetch Documents from an array of _id's and their references
15
15
  // Heavy use of Set is to avoid recursively querying for id's already in the payload
16
- function getDocumentsInArray(_x, _x2, _x3) {
16
+ function getDocumentsInArray(_x, _x2, _x3, _x4) {
17
17
  return _getDocumentsInArray.apply(this, arguments);
18
18
  }
19
19
 
20
20
  function _getDocumentsInArray() {
21
- _getDocumentsInArray = _asyncToGenerator(function* (fetchIds, client, currentIds) {
21
+ _getDocumentsInArray = _asyncToGenerator(function* (fetchIds, client, currentIds, projection) {
22
22
  var collection = []; // Find initial docs
23
23
 
24
- var data = yield client.fetch("*[_id in $fetchIds]", {
24
+ var query = "*[_id in $fetchIds]".concat(projection !== null && projection !== void 0 ? projection : "");
25
+ var data = yield client.fetch(query, {
25
26
  fetchIds: fetchIds !== null && fetchIds !== void 0 ? fetchIds : []
26
27
  });
27
28
 
@@ -58,7 +59,7 @@ function _getDocumentsInArray() {
58
59
  }
59
60
  });
60
61
 
61
- return function (_x4) {
62
+ return function (_x5) {
62
63
  return _ref.apply(this, arguments);
63
64
  };
64
65
  }()));
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/helpers/getDocumentsInArray.ts"],"names":["getDocumentsInArray","fetchIds","client","currentIds","collection","data","fetch","length","localCurrentIds","Set","newDataIds","map","dataDoc","_id","filter","id","size","has","Boolean","push","add","Promise","all","doc","expr","references","newReferenceIds","refId","referenceDocs","Array","from","uniqueCollection","reduce","acc","cur","some"],"mappings":";;;;;;;AAAA;;;;;;AAGA;AACA;SACsBA,mB;;;;;2CAAf,WACLC,QADK,EAELC,MAFK,EAGLC,UAHK,EAIL;AACA,QAAMC,UAAU,GAAG,EAAnB,CADA,CAGA;;AACA,QAAMC,IAAsB,SAASH,MAAM,CAACI,KAAP,wBAAoC;AACvEL,MAAAA,QAAQ,EAAEA,QAAF,aAAEA,QAAF,cAAEA,QAAF,GAAc;AADiD,KAApC,CAArC;;AAIA,QAAI,EAACI,IAAD,aAACA,IAAD,eAACA,IAAI,CAAEE,MAAP,CAAJ,EAAmB;AACjB,aAAO,EAAP;AACD;;AAED,QAAMC,eAAe,GAAGL,UAAH,aAAGA,UAAH,cAAGA,UAAH,GAAiB,IAAIM,GAAJ,EAAtC,CAZA,CAcA;AACA;;AACA,QAAMC,UAAuB,GAAG,IAAID,GAAJ,CAC9BJ,IAAI,CACDM,GADH,CACQC,OAAD,IAAaA,OAAO,CAACC,GAD5B,EAEGC,MAFH,CAEWC,EAAD,IAASZ,UAAU,SAAV,IAAAA,UAAU,WAAV,IAAAA,UAAU,CAAEa,IAAZ,GAAmB,CAACR,eAAe,CAACS,GAAhB,CAAoBF,EAApB,CAApB,GAA8CG,OAAO,CAACH,EAAD,CAFxE,CAD8B,CAAhC;;AAMA,QAAIL,UAAU,CAACM,IAAf,EAAqB;AACnBZ,MAAAA,UAAU,CAACe,IAAX,CAAgB,GAAGd,IAAnB;AACAG,MAAAA,eAAe,CAACY,GAAhB,CAAoB,GAAGV,UAAvB,EAFmB,CAInB;;AACA,YAAMW,OAAO,CAACC,GAAR,CACJjB,IAAI,CAACM,GAAL;AAAA,qCAAS,WAAOY,GAAP,EAAe;AACtB,cAAMC,IAAI,WAAV;AACA,cAAMC,UAAU,GAAG,sBAAQD,IAAR,EAAcD,GAAd,CAAnB;;AAEA,cAAIE,UAAU,CAAClB,MAAf,EAAuB;AACrB;AACA,gBAAMmB,eAAe,GAAG,IAAIjB,GAAJ,CAAQgB,UAAU,CAACX,MAAX,CAAmBa,KAAD,IAAW,CAACnB,eAAe,CAACS,GAAhB,CAAoBU,KAApB,CAA9B,CAAR,CAAxB;;AAEA,gBAAID,eAAe,CAACV,IAApB,EAA0B;AACxB;AACA,kBAAMY,aAAa,SAAS5B,mBAAmB,CAC7C6B,KAAK,CAACC,IAAN,CAAWJ,eAAX,CAD6C,EAE7CxB,MAF6C,EAG7CM,eAH6C,CAA/C;;AAMA,kBAAIoB,aAAJ,aAAIA,aAAJ,eAAIA,aAAa,CAAErB,MAAnB,EAA2B;AACzBH,gBAAAA,UAAU,CAACe,IAAX,CAAgB,GAAGS,aAAnB;AACD;AACF;AACF;AACF,SArBD;;AAAA;AAAA;AAAA;AAAA,UADI,CAAN;AAwBD,KAnDD,CAqDA;AACA;;;AACA,QAAMG,gBAAgB,GAAG3B,UAAU,CAACU,MAAX,CAAkBI,OAAlB,EAA2Bc,MAA3B,CAAkC,CAACC,GAAD,EAAMC,GAAN,KAAc;AACvE,UAAID,GAAG,CAACE,IAAJ,CAAUZ,GAAD,IAASA,GAAG,CAACV,GAAJ,KAAYqB,GAAG,CAACrB,GAAlC,CAAJ,EAA4C;AAC1C,eAAOoB,GAAP;AACD;;AAED,aAAO,CAAC,GAAGA,GAAJ,EAASC,GAAT,CAAP;AACD,KANwB,EAMtB,EANsB,CAAzB;AAQA,WAAOH,gBAAP;AACD,G","sourcesContent":["import {extract} from '@sanity/mutator'\nimport {SanityDocument} from '../types'\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(\n fetchIds: string[],\n client: any,\n currentIds?: Set<string>\n) {\n const collection = []\n\n // Find initial docs\n const data: SanityDocument[] = await client.fetch(`*[_id in $fetchIds]`, {\n fetchIds: fetchIds ?? [],\n })\n\n if (!data?.length) {\n return []\n }\n\n const localCurrentIds = currentIds ?? new Set()\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: Set<string> = new Set(\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 localCurrentIds.add(...newDataIds)\n\n // Check new data for more references\n await Promise.all(\n data.map(async (doc) => {\n const expr = `.._ref`\n const references = extract(expr, doc)\n\n if (references.length) {\n // Find references not already in the Collection\n const newReferenceIds = new Set(references.filter((refId) => !localCurrentIds.has(refId)))\n\n if (newReferenceIds.size) {\n // Recusive query for new documents\n const referenceDocs = await getDocumentsInArray(\n Array.from(newReferenceIds),\n client,\n localCurrentIds\n )\n\n if (referenceDocs?.length) {\n collection.push(...referenceDocs)\n }\n }\n }\n })\n )\n }\n\n // Create a unique array of objects from collection\n // Set() wasn't working for unique id's ¯\\_(ツ)_/¯\n const uniqueCollection = collection.filter(Boolean).reduce((acc, cur) => {\n if (acc.some((doc) => doc._id === cur._id)) {\n return acc\n }\n\n return [...acc, cur]\n }, []) \n\n return uniqueCollection\n}\n"],"file":"getDocumentsInArray.js"}
1
+ {"version":3,"file":"getDocumentsInArray.js","names":["getDocumentsInArray","fetchIds","client","currentIds","projection","collection","query","data","fetch","length","localCurrentIds","Set","newDataIds","map","dataDoc","_id","filter","id","size","has","Boolean","push","add","Promise","all","doc","expr","references","newReferenceIds","refId","referenceDocs","Array","from","uniqueCollection","reduce","acc","cur","some"],"sources":["../../src/helpers/getDocumentsInArray.ts"],"sourcesContent":["import {extract} from '@sanity/mutator'\nimport {SanityDocument} from '../types'\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(\n fetchIds: string[],\n client: any,\n currentIds?: Set<string>,\n projection?: string,\n) {\n const collection = []\n\n // Find initial docs\n const query = `*[_id in $fetchIds]${projection ?? ``}`\n const data: SanityDocument[] = await client.fetch(query, {\n fetchIds: fetchIds ?? [],\n })\n\n if (!data?.length) {\n return []\n }\n\n const localCurrentIds = currentIds ?? new Set()\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: Set<string> = new Set(\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 localCurrentIds.add(...newDataIds)\n\n // Check new data for more references\n await Promise.all(\n data.map(async (doc) => {\n const expr = `.._ref`\n const references = extract(expr, doc)\n\n if (references.length) {\n // Find references not already in the Collection\n const newReferenceIds = new Set(references.filter((refId) => !localCurrentIds.has(refId)))\n\n if (newReferenceIds.size) {\n // Recusive query for new documents\n const referenceDocs = await getDocumentsInArray(\n Array.from(newReferenceIds),\n client,\n localCurrentIds\n )\n\n if (referenceDocs?.length) {\n collection.push(...referenceDocs)\n }\n }\n }\n })\n )\n }\n\n // Create a unique array of objects from collection\n // Set() wasn't working for unique id's ¯\\_(ツ)_/¯\n const uniqueCollection = collection.filter(Boolean).reduce((acc, cur) => {\n if (acc.some((doc) => doc._id === cur._id)) {\n return acc\n }\n\n return [...acc, cur]\n }, []) \n\n return uniqueCollection\n}\n"],"mappings":";;;;;;;AAAA;;;;;;AAGA;AACA;SACsBA,mB;;;;;2CAAf,WACLC,QADK,EAELC,MAFK,EAGLC,UAHK,EAILC,UAJK,EAKL;IACA,IAAMC,UAAU,GAAG,EAAnB,CADA,CAGA;;IACA,IAAMC,KAAK,gCAAyBF,UAAzB,aAAyBA,UAAzB,cAAyBA,UAAzB,MAAX;IACA,IAAMG,IAAsB,SAASL,MAAM,CAACM,KAAP,CAAaF,KAAb,EAAoB;MACvDL,QAAQ,EAAEA,QAAF,aAAEA,QAAF,cAAEA,QAAF,GAAc;IADiC,CAApB,CAArC;;IAIA,IAAI,EAACM,IAAD,aAACA,IAAD,eAACA,IAAI,CAAEE,MAAP,CAAJ,EAAmB;MACjB,OAAO,EAAP;IACD;;IAED,IAAMC,eAAe,GAAGP,UAAH,aAAGA,UAAH,cAAGA,UAAH,GAAiB,IAAIQ,GAAJ,EAAtC,CAbA,CAeA;IACA;;IACA,IAAMC,UAAuB,GAAG,IAAID,GAAJ,CAC9BJ,IAAI,CACDM,GADH,CACQC,OAAD,IAAaA,OAAO,CAACC,GAD5B,EAEGC,MAFH,CAEWC,EAAD,IAASd,UAAU,SAAV,IAAAA,UAAU,WAAV,IAAAA,UAAU,CAAEe,IAAZ,GAAmB,CAACR,eAAe,CAACS,GAAhB,CAAoBF,EAApB,CAApB,GAA8CG,OAAO,CAACH,EAAD,CAFxE,CAD8B,CAAhC;;IAMA,IAAIL,UAAU,CAACM,IAAf,EAAqB;MACnBb,UAAU,CAACgB,IAAX,CAAgB,GAAGd,IAAnB;MACAG,eAAe,CAACY,GAAhB,CAAoB,GAAGV,UAAvB,EAFmB,CAInB;;MACA,MAAMW,OAAO,CAACC,GAAR,CACJjB,IAAI,CAACM,GAAL;QAAA,6BAAS,WAAOY,GAAP,EAAe;UACtB,IAAMC,IAAI,WAAV;UACA,IAAMC,UAAU,GAAG,sBAAQD,IAAR,EAAcD,GAAd,CAAnB;;UAEA,IAAIE,UAAU,CAAClB,MAAf,EAAuB;YACrB;YACA,IAAMmB,eAAe,GAAG,IAAIjB,GAAJ,CAAQgB,UAAU,CAACX,MAAX,CAAmBa,KAAD,IAAW,CAACnB,eAAe,CAACS,GAAhB,CAAoBU,KAApB,CAA9B,CAAR,CAAxB;;YAEA,IAAID,eAAe,CAACV,IAApB,EAA0B;cACxB;cACA,IAAMY,aAAa,SAAS9B,mBAAmB,CAC7C+B,KAAK,CAACC,IAAN,CAAWJ,eAAX,CAD6C,EAE7C1B,MAF6C,EAG7CQ,eAH6C,CAA/C;;cAMA,IAAIoB,aAAJ,aAAIA,aAAJ,eAAIA,aAAa,CAAErB,MAAnB,EAA2B;gBACzBJ,UAAU,CAACgB,IAAX,CAAgB,GAAGS,aAAnB;cACD;YACF;UACF;QACF,CArBD;;QAAA;UAAA;QAAA;MAAA,IADI,CAAN;IAwBD,CApDD,CAsDA;IACA;;;IACA,IAAMG,gBAAgB,GAAG5B,UAAU,CAACW,MAAX,CAAkBI,OAAlB,EAA2Bc,MAA3B,CAAkC,CAACC,GAAD,EAAMC,GAAN,KAAc;MACvE,IAAID,GAAG,CAACE,IAAJ,CAAUZ,GAAD,IAASA,GAAG,CAACV,GAAJ,KAAYqB,GAAG,CAACrB,GAAlC,CAAJ,EAA4C;QAC1C,OAAOoB,GAAP;MACD;;MAED,OAAO,CAAC,GAAGA,GAAJ,EAASC,GAAT,CAAP;IACD,CANwB,EAMtB,EANsB,CAAzB;IAQA,OAAOH,gBAAP;EACD,C"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/helpers/index.ts"],"names":["typeIsAsset","type","includes","createInitialMessage","docCount","refsCount","message","join","stickyStyles","position","top","zIndex","backgroundColor"],"mappings":";;;;;;;;;AAAO,SAASA,WAAT,GAAgC;AAAA,MAAXC,IAAW;AACrC,MAAI,CAACA,IAAL,EAAW,OAAO,KAAP;AAEX,SAAO,CAAC,mBAAD,EAAsB,kBAAtB,EAA0CC,QAA1C,CAAmDD,IAAnD,CAAP;AACD;;AAEM,SAASE,oBAAT,GAA2D;AAAA,MAA7BC,QAA6B,uEAAlB,CAAkB;AAAA,MAAfC,SAAe,uEAAH,CAAG;AAChE,MAAMC,OAAO,GAAG,CACdF,QAAQ,KAAK,CAAb,8CAAqDA,QAArD,uBADc,EAEdC,SAAS,KAAK,CAAd,8BAAsCA,SAAtC,iBAFc,EAGdA,SAAS,KAAK,CAAd,sCAHc,yHAAhB;AAOA,SAAOC,OAAO,CAACC,IAAR,KAAP;AACD;;AAEM,IAAMC,YAAY,GAAG;AAC1BC,EAAAA,QAAQ,EAAE,QADgB;AAE1BC,EAAAA,GAAG,EAAE,CAFqB;AAG1BC,EAAAA,MAAM,EAAE,GAHkB;AAI1BC,EAAAA,eAAe;AAJW,CAArB","sourcesContent":["export function typeIsAsset(type = ``) {\n if (!type) return false\n\n return ['sanity.imageAsset', 'sanity.fileAsset'].includes(type)\n}\n\nexport function createInitialMessage(docCount = 0, refsCount = 0) {\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 = {\n position: 'sticky',\n top: 0,\n zIndex: 100,\n backgroundColor: `rgba(255,255,255,0.95)`,\n}"],"file":"index.js"}
1
+ {"version":3,"file":"index.js","names":["typeIsAsset","type","includes","createInitialMessage","docCount","refsCount","message","join","stickyStyles","position","top","zIndex","backgroundColor"],"sources":["../../src/helpers/index.ts"],"sourcesContent":["export function typeIsAsset(type = ``) {\n if (!type) return false\n\n return ['sanity.imageAsset', 'sanity.fileAsset'].includes(type)\n}\n\nexport function createInitialMessage(docCount = 0, refsCount = 0) {\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 = {\n position: 'sticky',\n top: 0,\n zIndex: 100,\n backgroundColor: `rgba(255,255,255,0.95)`,\n}"],"mappings":";;;;;;;;;AAAO,SAASA,WAAT,GAAgC;EAAA,IAAXC,IAAW;EACrC,IAAI,CAACA,IAAL,EAAW,OAAO,KAAP;EAEX,OAAO,CAAC,mBAAD,EAAsB,kBAAtB,EAA0CC,QAA1C,CAAmDD,IAAnD,CAAP;AACD;;AAEM,SAASE,oBAAT,GAA2D;EAAA,IAA7BC,QAA6B,uEAAlB,CAAkB;EAAA,IAAfC,SAAe,uEAAH,CAAG;EAChE,IAAMC,OAAO,GAAG,CACdF,QAAQ,KAAK,CAAb,8CAAqDA,QAArD,uBADc,EAEdC,SAAS,KAAK,CAAd,8BAAsCA,SAAtC,iBAFc,EAGdA,SAAS,KAAK,CAAd,sCAHc,yHAAhB;EAOA,OAAOC,OAAO,CAACC,IAAR,KAAP;AACD;;AAEM,IAAMC,YAAY,GAAG;EAC1BC,QAAQ,EAAE,QADgB;EAE1BC,GAAG,EAAE,CAFqB;EAG1BC,MAAM,EAAE,GAHkB;EAI1BC,eAAe;AAJW,CAArB"}
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA;;AACA","sourcesContent":["import DuplicateToAction from \"./actions/DuplicateToAction\";\nimport CrossDatasetDuplicator from \"./components/CrossDatasetDuplicator\";\n\nexport {\n DuplicateToAction,\n CrossDatasetDuplicator\n}"],"file":"index.js"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/index.js"],"sourcesContent":["import DuplicateToAction from \"./actions/DuplicateToAction\";\nimport CrossDatasetDuplicator from \"./components/CrossDatasetDuplicator\";\n\nexport {\n DuplicateToAction,\n CrossDatasetDuplicator\n}"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;;AACA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/tool/index.ts"],"names":["config","tool","title","name","icon","LaunchIcon","component","CrossDatasetDuplicator"],"mappings":";;;;;;;AAAA;;AACA;;AAEA;;;;eAEeA,0HAAQC,IAAR,GACX;AACEC,EAAAA,KAAK,EAAE,YADT;AAEEC,EAAAA,IAAI,EAAE,YAFR;AAGEC,EAAAA,IAAI,EAAEC,iBAHR;AAIEC,EAAAA,SAAS,EAAEC;AAJb,CADW,GAOX,I","sourcesContent":["import {LaunchIcon} from '@sanity/icons'\nimport config from 'config:@sanity/cross-dataset-duplicator'\n\nimport CrossDatasetDuplicator from '../components/CrossDatasetDuplicator'\n\nexport default config?.tool\n ? {\n title: 'Duplicator',\n name: 'duplicator',\n icon: LaunchIcon,\n component: CrossDatasetDuplicator,\n }\n : null\n"],"file":"index.js"}
1
+ {"version":3,"file":"index.js","names":["config","tool","title","name","icon","LaunchIcon","component","CrossDatasetDuplicator"],"sources":["../../src/tool/index.ts"],"sourcesContent":["import {LaunchIcon} from '@sanity/icons'\nimport config from 'config:@sanity/cross-dataset-duplicator'\n\nimport CrossDatasetDuplicator from '../components/CrossDatasetDuplicator'\n\nexport default config?.tool\n ? {\n title: 'Duplicator',\n name: 'duplicator',\n icon: LaunchIcon,\n component: CrossDatasetDuplicator,\n }\n : null\n"],"mappings":";;;;;;;AAAA;;AACA;;AAEA;;;;eAEeA,0HAAQC,IAAR,GACX;EACEC,KAAK,EAAE,YADT;EAEEC,IAAI,EAAE,YAFR;EAGEC,IAAI,EAAEC,iBAHR;EAIEC,SAAS,EAAEC;AAJb,CADW,GAOX,I"}
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","sourcesContent":[],"file":"index.js"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/types/index.ts"],"sourcesContent":["export type SanityDocument = {\n _id: string\n _type: string\n}\n\nexport type PayloadItem = {\n include: boolean\n status: 'EXISTS' | 'OVERWRITE' | 'UPDATE' | 'CREATE'\n doc: SanityDocument\n}\n"],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sanity/cross-dataset-duplicator",
3
- "version": "0.3.0",
3
+ "version": "0.3.3",
4
4
  "description": "Empower content editors to migrate Documents and Assets between Sanity Projects and Datasets from inside Sanity Studio",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -19,7 +19,7 @@
19
19
  },
20
20
  "repository": {
21
21
  "type": "git",
22
- "url": "git+ssh://git@github.com/@sanity-io/cross-dataset-duplicator.git"
22
+ "url": "git+ssh://git@github.com/sanity-io/cross-dataset-duplicator.git"
23
23
  },
24
24
  "keywords": [
25
25
  "sanity",
@@ -51,9 +51,9 @@
51
51
  "react": "^17.0.0"
52
52
  },
53
53
  "bugs": {
54
- "url": "https://github.com/@sanity-io/cross-dataset-duplicator/issues"
54
+ "url": "https://github.com/sanity-io/cross-dataset-duplicator/issues"
55
55
  },
56
- "homepage": "https://github.com/@sanity-io/cross-dataset-duplicator#readme",
56
+ "homepage": "https://github.com/sanity-io/cross-dataset-duplicator#readme",
57
57
  "prettier": {
58
58
  "semi": false,
59
59
  "printWidth": 100,
@@ -14,7 +14,7 @@ const secretConfigKeys = [
14
14
  {
15
15
  key: 'bearerToken',
16
16
  title:
17
- 'An "Auth Token" is required to duplicate the original files of assets, and will be used for all Duplications. You can retrieve yours using the Sanity CLI `sanity debug --secrets`.',
17
+ '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',
18
18
  description: '',
19
19
  },
20
20
  ]
@@ -4,7 +4,7 @@ import schema from 'part:@sanity/base/schema'
4
4
  import {Button, Stack, Box, Label, Text, Card, Flex, Grid, Container, TextInput} from '@sanity/ui'
5
5
 
6
6
  import DuplicatorTool from './DuplicatorTool'
7
- import { clientConfig } from '../helpers/clientConfig'
7
+ import {clientConfig} from '../helpers/clientConfig'
8
8
 
9
9
  const originClient = sanityClient.withConfig(clientConfig)
10
10
 
@@ -12,11 +12,13 @@ type DuplicatorQueryProps = {
12
12
  token: string
13
13
  }
14
14
 
15
+ const schemaTypes = schema.getTypeNames()
16
+
15
17
  export default function DuplicatorQuery(props: DuplicatorQueryProps) {
16
18
  const {token} = props
17
19
 
18
20
  const [value, setValue] = useState(``)
19
- const [docs, setDocs] = useState([])
21
+ const [initialData, setInitialData] = useState({docs: [], draftIds: []});
20
22
 
21
23
  function handleSubmit(e?: any) {
22
24
  if (e) e.preventDefault()
@@ -25,16 +27,21 @@ export default function DuplicatorQuery(props: DuplicatorQueryProps) {
25
27
  .fetch(value)
26
28
  .then((res) => {
27
29
  // Ensure queried docs are registered to the schema
28
- const registeredDocs = res.length ? res.filter((doc) => schema.get(doc._type)) : []
30
+ const registeredAndPublishedDocs = res.length
31
+ ? res
32
+ .filter((doc) => schemaTypes.includes(doc._type))
33
+ .filter((doc) => !doc._id.startsWith(`drafts.`))
34
+ : []
35
+ const initialDraftIds = res.length ? res.filter(doc => doc._id.startsWith(`drafts.`)).map(doc => doc._id) : []
29
36
 
30
- setDocs(registeredDocs)
37
+ setInitialData({docs: registeredAndPublishedDocs, draftIds: initialDraftIds})
31
38
  })
32
39
  .catch((err) => console.error(err))
33
40
  }
34
41
 
35
42
  // Auto-load initial textinput value
36
43
  useEffect(() => {
37
- if (!docs?.length && value) {
44
+ if (!initialData.docs?.length && value) {
38
45
  handleSubmit()
39
46
  }
40
47
  }, [])
@@ -50,7 +57,8 @@ export default function DuplicatorQuery(props: DuplicatorQueryProps) {
50
57
  </Box>
51
58
  <Box>
52
59
  <Text>
53
- Start with a valid GROQ query to load initial documents. The query will need to return an Array of Objects.
60
+ Start with a valid GROQ query to load initial documents. The query will need to
61
+ return an Array of Objects. Drafts will be removed from the results.
54
62
  </Text>
55
63
  </Box>
56
64
  <form onSubmit={handleSubmit}>
@@ -79,14 +87,17 @@ export default function DuplicatorQuery(props: DuplicatorQueryProps) {
79
87
  </Stack>
80
88
  </Card>
81
89
  </Box>
82
- {!docs?.length || docs.length < 1 && (
83
- <Container width={1}>
84
- <Card padding={5}>
85
- {value ? `No Documents registered to the Schema match this query` : `Start with a valid GROQ query`}
86
- </Card>
87
- </Container>
88
- )}
89
- {docs?.length > 0 && <DuplicatorTool docs={docs} token={token} />}
90
+ {!initialData.docs?.length ||
91
+ (initialData.docs.length < 1 && (
92
+ <Container width={1}>
93
+ <Card padding={5}>
94
+ {value
95
+ ? `No Documents registered to the Schema match this query`
96
+ : `Start with a valid GROQ query`}
97
+ </Card>
98
+ </Container>
99
+ ))}
100
+ {initialData.docs?.length > 0 && <DuplicatorTool docs={initialData.docs} draftIds={initialData.draftIds} token={token} />}
90
101
  </Grid>
91
102
  </Container>
92
103
  )
@@ -4,7 +4,19 @@ import mapLimit from 'async/mapLimit'
4
4
  import asyncify from 'async/asyncify'
5
5
  import {extract, extractWithPath} from '@sanity/mutator'
6
6
  import {dset} from 'dset'
7
- import {Card, Container, Text, Box, Button, Label, Stack, Select, Flex, Checkbox} from '@sanity/ui'
7
+ import {
8
+ Card,
9
+ Container,
10
+ Text,
11
+ Box,
12
+ Button,
13
+ Label,
14
+ Stack,
15
+ Select,
16
+ Flex,
17
+ Checkbox,
18
+ Badge,
19
+ } from '@sanity/ui'
8
20
  import {ArrowRightIcon, SearchIcon, LaunchIcon} from '@sanity/icons'
9
21
  import sanityClient from 'part:@sanity/base/client'
10
22
  import Preview from 'part:@sanity/base/preview'
@@ -21,11 +33,12 @@ import {clientConfig} from '../helpers/clientConfig'
21
33
 
22
34
  type DuplicatorToolProps = {
23
35
  docs: SanityDocument[]
36
+ draftIds: string[]
24
37
  token: string
25
38
  }
26
39
 
27
40
  export default function DuplicatorTool(props: DuplicatorToolProps) {
28
- const {docs, token} = props
41
+ const {docs, draftIds, token} = props
29
42
 
30
43
  // Prepare origin (this Studio) client
31
44
  // In function-scope so it is up to date on every render
@@ -36,7 +49,9 @@ export default function DuplicatorTool(props: DuplicatorToolProps) {
36
49
  const spacesOptions = config?.__experimental_spaces?.length
37
50
  ? config.__experimental_spaces.map((space) => ({
38
51
  ...space,
39
- disabled: space.api.dataset === originClient.config().dataset,
52
+ disabled:
53
+ space.api.dataset === originClient.config().dataset &&
54
+ space.api.projectId === originClient.config().projectId,
40
55
  }))
41
56
  : []
42
57
 
@@ -50,6 +65,7 @@ export default function DuplicatorTool(props: DuplicatorToolProps) {
50
65
  doc: item,
51
66
  include: true,
52
67
  status: null,
68
+ hasDraft: draftIds.includes(`drafts.${item._id}`),
53
69
  }))
54
70
  : []
55
71
  )
@@ -153,6 +169,13 @@ export default function DuplicatorTool(props: DuplicatorToolProps) {
153
169
  const docIds = docs.map((doc) => doc._id)
154
170
 
155
171
  const payloadDocs = await getDocumentsInArray(docIds, originClient, null)
172
+ const draftDocs = await getDocumentsInArray(
173
+ docIds.map((id) => `drafts.${id}`),
174
+ originClient,
175
+ null,
176
+ `{_id}`
177
+ )
178
+ const draftDocsIds = new Set(draftDocs.map(({_id}) => _id))
156
179
 
157
180
  // Shape it up
158
181
  const payloadShaped = payloadDocs.map((doc) => ({
@@ -161,6 +184,8 @@ export default function DuplicatorTool(props: DuplicatorToolProps) {
161
184
  include: true,
162
185
  // Does it exist at the destination?
163
186
  status: '',
187
+ // Does it have any drafts?
188
+ hasDraft: draftDocsIds.has(`drafts.${doc._id}`),
164
189
  }))
165
190
 
166
191
  setPayload(payloadShaped)
@@ -195,7 +220,7 @@ export default function DuplicatorTool(props: DuplicatorToolProps) {
195
220
  const uploadType = doc._type.split('.').pop().replace('Asset', '')
196
221
  const downloadUrl = uploadType === 'image' ? `${doc.url}?dlRaw=true` : doc.url
197
222
  const downloadConfig =
198
- uploadType === 'image' ? {headers: {Authorization: token ? `Bearer ${token}` : ``}} : {}
223
+ uploadType === 'image' ? {headers: {Authorization: `Bearer ${token}`}} : {}
199
224
 
200
225
  await fetch(downloadUrl, downloadConfig).then(async (res) => {
201
226
  const assetData = await res.blob()
@@ -406,22 +431,26 @@ export default function DuplicatorTool(props: DuplicatorToolProps) {
406
431
  )}
407
432
  {payload.length > 0 && (
408
433
  <Stack padding={4} space={3}>
409
- {payload.map(({doc, include, status}, index) => (
434
+ {payload.map(({doc, include, status, hasDraft}, index) => (
410
435
  <React.Fragment key={doc._id}>
411
436
  <Flex align="center">
412
437
  <Checkbox checked={include} onChange={() => handleCheckbox(doc._id)} />
413
- <Box style={{flex: 1}} paddingX={3}>
438
+ <Box flex={1} paddingX={3}>
414
439
  <Preview value={doc} type={schema.get(doc._type)} />
415
440
  </Box>
416
- <StatusBadge status={status} isAsset={typeIsAsset(doc._type)} />
441
+ <Flex items="center" gap={2}>
442
+ {hasDraft ? <StatusBadge status="UNPUBLISHED" isAsset={false} /> : null}
443
+ <StatusBadge status={status} isAsset={typeIsAsset(doc._type)} />
444
+ </Flex>
417
445
  </Flex>
418
446
  {doc?.extension === 'svg' && index === firstSvgIndex && (
419
447
  <Card padding={3} radius={2} shadow={1} tone="caution">
420
448
  <Text size={1}>
421
- Due to how SVGs are sanitized after first uploaded, duplicated SVG assets may have new{' '}
422
- <code>_id</code>'s at the destination. The newly generated <code>_id</code>{' '}
423
- will be the same in each duplication, but it will never be the same{' '}
424
- <code>_id</code> as the first time this Asset was uploaded. References to the asset will be updated to use the new <code>_id</code>.
449
+ Due to how SVGs are sanitized after first uploaded, duplicated SVG assets
450
+ may have new <code>_id</code>'s at the destination. The newly generated{' '}
451
+ <code>_id</code> will be the same in each duplication, but it will never
452
+ be the same <code>_id</code> as the first time this Asset was uploaded.
453
+ References to the asset will be updated to use the new <code>_id</code>.
425
454
  </Text>
426
455
  </Card>
427
456
  )}
@@ -7,6 +7,7 @@ type StatusTones = {
7
7
  OVERWRITE: BadgeTone
8
8
  UPDATE: BadgeTone
9
9
  CREATE: BadgeTone
10
+ UNPUBLISHED: BadgeTone
10
11
  }
11
12
 
12
13
  const documentTones: StatusTones = {
@@ -14,6 +15,7 @@ const documentTones: StatusTones = {
14
15
  OVERWRITE: `critical`,
15
16
  UPDATE: `caution`,
16
17
  CREATE: `positive`,
18
+ UNPUBLISHED: `caution`,
17
19
  }
18
20
 
19
21
  const assetTones: StatusTones = {
@@ -21,6 +23,7 @@ const assetTones: StatusTones = {
21
23
  OVERWRITE: `critical`,
22
24
  UPDATE: `critical`,
23
25
  CREATE: `positive`,
26
+ UNPUBLISHED: `default`
24
27
  }
25
28
 
26
29
  type messageTypes = {
@@ -28,6 +31,7 @@ type messageTypes = {
28
31
  OVERWRITE: string
29
32
  UPDATE: string
30
33
  CREATE: string
34
+ UNPUBLISHED: string
31
35
  }
32
36
 
33
37
  const documentMessages: messageTypes = {
@@ -41,6 +45,7 @@ const documentMessages: messageTypes = {
41
45
  UPDATE: `An older version of this document exists at the Destination, and it will be overwritten with this version.`,
42
46
  // Document at destination doesn't exist
43
47
  CREATE: `This document will be created at the destination.`,
48
+ UNPUBLISHED: `A Draft version of this Document exists in this Dataset, but only the Published version will be duplicated to the destination.`
44
49
  }
45
50
 
46
51
  const assetMessages: messageTypes = {
@@ -48,6 +53,7 @@ const assetMessages: messageTypes = {
48
53
  OVERWRITE: `This Asset already exists at the Destination`,
49
54
  UPDATE: `This Asset already exists at the Destination`,
50
55
  CREATE: `This Asset does not yet exist at the Destination`,
56
+ UNPUBLISHED: ``,
51
57
  }
52
58
 
53
59
  const assetStatus: messageTypes = {
@@ -55,10 +61,11 @@ const assetStatus: messageTypes = {
55
61
  OVERWRITE: `RE-UPLOAD`,
56
62
  UPDATE: `RE-UPLOAD`,
57
63
  CREATE: `UPLOAD`,
64
+ UNPUBLISHED: ``,
58
65
  }
59
66
 
60
67
  type StatusBadgeProps = {
61
- status: 'EXISTS' | 'OVERWRITE' | 'UPDATE' | 'CREATE' | undefined
68
+ status: 'EXISTS' | 'OVERWRITE' | 'UPDATE' | 'CREATE' | 'UNPUBLISHED' | undefined
62
69
  isAsset: boolean
63
70
  }
64
71
 
@@ -6,12 +6,14 @@ import {SanityDocument} from '../types'
6
6
  export async function getDocumentsInArray(
7
7
  fetchIds: string[],
8
8
  client: any,
9
- currentIds?: Set<string>
9
+ currentIds?: Set<string>,
10
+ projection?: string,
10
11
  ) {
11
12
  const collection = []
12
13
 
13
14
  // Find initial docs
14
- const data: SanityDocument[] = await client.fetch(`*[_id in $fetchIds]`, {
15
+ const query = `*[_id in $fetchIds]${projection ?? ``}`
16
+ const data: SanityDocument[] = await client.fetch(query, {
15
17
  fetchIds: fetchIds ?? [],
16
18
  })
17
19