@sanity/cross-dataset-duplicator 0.3.0

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.
Files changed (55) hide show
  1. package/.babelrc +3 -0
  2. package/.eslintignore +1 -0
  3. package/LICENSE +21 -0
  4. package/README.md +101 -0
  5. package/config.dist.json +4 -0
  6. package/lib/actions/DuplicateToAction.js +59 -0
  7. package/lib/actions/DuplicateToAction.js.map +1 -0
  8. package/lib/actions/index.js +38 -0
  9. package/lib/actions/index.js.map +1 -0
  10. package/lib/components/CrossDatasetDuplicator.js +107 -0
  11. package/lib/components/CrossDatasetDuplicator.js.map +1 -0
  12. package/lib/components/DuplicatorQuery.js +113 -0
  13. package/lib/components/DuplicatorQuery.js.map +1 -0
  14. package/lib/components/DuplicatorTool.js +557 -0
  15. package/lib/components/DuplicatorTool.js.map +1 -0
  16. package/lib/components/Feedback.js +27 -0
  17. package/lib/components/Feedback.js.map +1 -0
  18. package/lib/components/ResetSecret.js +43 -0
  19. package/lib/components/ResetSecret.js.map +1 -0
  20. package/lib/components/SelectButtons.js +109 -0
  21. package/lib/components/SelectButtons.js.map +1 -0
  22. package/lib/components/StatusBadge.js +87 -0
  23. package/lib/components/StatusBadge.js.map +1 -0
  24. package/lib/helpers/clientConfig.js +11 -0
  25. package/lib/helpers/clientConfig.js.map +1 -0
  26. package/lib/helpers/constants.js +9 -0
  27. package/lib/helpers/constants.js.map +1 -0
  28. package/lib/helpers/getDocumentsInArray.js +80 -0
  29. package/lib/helpers/getDocumentsInArray.js.map +1 -0
  30. package/lib/helpers/index.js +30 -0
  31. package/lib/helpers/index.js.map +1 -0
  32. package/lib/index.js +24 -0
  33. package/lib/index.js.map +1 -0
  34. package/lib/tool/index.js +24 -0
  35. package/lib/tool/index.js.map +1 -0
  36. package/lib/types/index.js +2 -0
  37. package/lib/types/index.js.map +1 -0
  38. package/package.json +71 -0
  39. package/sanity.json +16 -0
  40. package/src/actions/DuplicateToAction.tsx +22 -0
  41. package/src/actions/index.ts +22 -0
  42. package/src/components/CrossDatasetDuplicator.tsx +100 -0
  43. package/src/components/DuplicatorQuery.tsx +93 -0
  44. package/src/components/DuplicatorTool.tsx +460 -0
  45. package/src/components/Feedback.tsx +18 -0
  46. package/src/components/ResetSecret.tsx +27 -0
  47. package/src/components/SelectButtons.tsx +80 -0
  48. package/src/components/StatusBadge.tsx +97 -0
  49. package/src/helpers/clientConfig.ts +1 -0
  50. package/src/helpers/constants.ts +1 -0
  51. package/src/helpers/getDocumentsInArray.ts +74 -0
  52. package/src/helpers/index.ts +23 -0
  53. package/src/index.js +7 -0
  54. package/src/tool/index.ts +13 -0
  55. package/src/types/index.ts +10 -0
package/.babelrc ADDED
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "sanipack/babel"
3
+ }
package/.eslintignore ADDED
@@ -0,0 +1 @@
1
+ lib
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2021 Simeon Griggs
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,101 @@
1
+ # Sanity Cross Dataset Duplicator
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.
4
+
5
+ ## Important Notes
6
+
7
+ This plugin is designed as a convenience for Authors to make small, infrequent content migrations between Datasets.
8
+
9
+ - This plugin should be used in conjunction with a reliable backup strategy.
10
+ - Proceed with caution as this plugin can instantly write changes to Datasets.
11
+ - 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.
13
+
14
+ ## Tool
15
+
16
+ The **Duplicate** Tool allows you to migrate Documents that are returned from any GROQ query.
17
+
18
+ ![2022-04-04 13 23 57](https://user-images.githubusercontent.com/9684022/161548068-80f2552a-3cb6-47fb-ac13-b4e24a98bd05.gif)
19
+
20
+ ## Document Action
21
+
22
+ The **Duplicate to...** Document Action allows you to migrate an individual Document.
23
+
24
+ ![2022-04-04 13 52 14](https://user-images.githubusercontent.com/9684022/161548033-216f5de1-5617-4f2c-a201-3ab9efbf0803.gif)
25
+
26
+ **Note:** If your Studio registered its own Document Actions, the plugin config will be overruled. See "Importing the Document Action" below.
27
+
28
+ ## Required Setup
29
+
30
+ ### 1. Spaces
31
+
32
+ You must have [Spaces configured](https://www.sanity.io/docs/spaces) to use this plugin. Spaces are still listed as an experimental feature but have been supported for some time.
33
+
34
+ All Datasets setup in Spaces will become selectable "destinations" for Migrations.
35
+
36
+ Once setup, you will see a dropdown menu next to the Search bar in the Studio with the Datasets you have configured in Spaces.
37
+
38
+ ### 2. Configuration
39
+
40
+ The plugin has some configuration options. These can be set by adding a config file to your Studio
41
+
42
+ ```json
43
+ // ./config/@sanity/cross-dataset-duplicator.json
44
+
45
+ {
46
+ "tool": true,
47
+ "types": ["article", "page"]
48
+ }
49
+ ```
50
+
51
+ Options:
52
+
53
+ - `tool` (boolean, default: true) – Set whether the Migration Tool is enabled.
54
+ - `types` (Array[String], default: []) – Set which Schema Types the Migration Action should be enabled in.
55
+
56
+ ### 3. Authentication Key
57
+
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.
59
+
60
+ This plugin uses [Sanity Secrets](https://github.com/sanity-io/sanity-studio-secrets/) to store the token in the Dataset itself.
61
+
62
+ You can reveal the token belonging to your user account with `sanity debug --secrets`.
63
+
64
+ ## Importing the Document Action
65
+
66
+ In your Studio's `sanity.json` file, look for the `document-actions/resolver` part, it will look like this:
67
+
68
+ ```json
69
+ {
70
+ "implements": "part:@sanity/base/document-actions/resolver",
71
+ "path": "./src/document-actions"
72
+ }
73
+ ```
74
+
75
+ Now update your Studio's Document Actions resolver to be something like this
76
+
77
+ ```js
78
+ import defaultResolve from 'part:@sanity/base/document-actions'
79
+ import {DuplicateToAction} from 'sanity-plugin-migration'
80
+ import config from 'config:@sanity/cross-dataset-duplicator'
81
+
82
+ export default function resolveDocumentActions(props) {
83
+ const defaultActions = defaultResolve(props)
84
+
85
+ // This will look through the "types" array in your migration.json config file
86
+ // If the type of this document is found in that array, the Migrate Action will show
87
+ if (config?.types?.length && config.types.includes(props.type)) {
88
+ return [...defaultActions, DuplicateToAction]
89
+ }
90
+
91
+ // ...all your other document action code
92
+
93
+ return defaultActions
94
+ }
95
+ ```
96
+
97
+ ## Future feature ideas
98
+
99
+ - Save predefined GROQ queries in the Tool to make bulk repeated Migrations simpler
100
+ - Config options for allowed migrations (eg Dev -> Staging but not Dev -> Live)
101
+ - Config options for permissions/user role checks
@@ -0,0 +1,4 @@
1
+ {
2
+ "tool": true,
3
+ "types": []
4
+ }
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = DuplicateToAction;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _icons = require("@sanity/icons");
11
+
12
+ var _CrossDatasetDuplicator = _interopRequireDefault(require("../components/CrossDatasetDuplicator"));
13
+
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+
16
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
17
+
18
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
19
+
20
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
21
+
22
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
23
+
24
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
25
+
26
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
27
+
28
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
29
+
30
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
31
+
32
+ function DuplicateToAction(_ref) {
33
+ var draft = _ref.draft,
34
+ published = _ref.published,
35
+ onComplete = _ref.onComplete;
36
+
37
+ var _useState = (0, _react.useState)(false),
38
+ _useState2 = _slicedToArray(_useState, 2),
39
+ dialogOpen = _useState2[0],
40
+ setDialogOpen = _useState2[1];
41
+
42
+ return {
43
+ disabled: draft,
44
+ title: draft ? "Document must be Published to begin" : null,
45
+ label: 'Duplicate to...',
46
+ dialog: dialogOpen && published && {
47
+ type: 'modal',
48
+ title: 'Cross Dataset Duplicator',
49
+ content: /*#__PURE__*/_react.default.createElement(_CrossDatasetDuplicator.default, {
50
+ docs: [published],
51
+ mode: "action"
52
+ }),
53
+ onClose: () => onComplete()
54
+ },
55
+ onHandle: () => setDialogOpen(true),
56
+ icon: _icons.LaunchIcon
57
+ };
58
+ }
59
+ //# sourceMappingURL=DuplicateToAction.js.map
@@ -0,0 +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"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = resolveDocumentActions;
7
+
8
+ var _documentActions = _interopRequireWildcard(require("part:@sanity/base/document-actions"));
9
+
10
+ var _crossDatasetDuplicator = _interopRequireDefault(require("config:@sanity/cross-dataset-duplicator"));
11
+
12
+ var _DuplicateToAction = _interopRequireDefault(require("./DuplicateToAction"));
13
+
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+
16
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
17
+
18
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
19
+
20
+ function resolveDocumentActions(props) {
21
+ var _config$types;
22
+
23
+ var duplicatorTypes = (_config$types = _crossDatasetDuplicator.default === null || _crossDatasetDuplicator.default === void 0 ? void 0 : _crossDatasetDuplicator.default.types) !== null && _config$types !== void 0 ? _config$types : [];
24
+ var defaultActions = (0, _documentActions.default)(props); // Insert 'Duplicate to...' after 'Duplicate' only on config'd types
25
+
26
+ if (duplicatorTypes.includes(props === null || props === void 0 ? void 0 : props.type)) {
27
+ return defaultActions.reduce((acc, cur) => {
28
+ if (cur === _documentActions.DuplicateAction) {
29
+ return [...acc, cur, _DuplicateToAction.default];
30
+ }
31
+
32
+ return [...acc, cur];
33
+ }, []);
34
+ }
35
+
36
+ return defaultActions;
37
+ }
38
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"}
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = CrossDatasetDuplicator;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _sanitySecrets = require("sanity-secrets");
11
+
12
+ var _ui = require("@sanity/ui");
13
+
14
+ var _DuplicatorQuery = _interopRequireDefault(require("./DuplicatorQuery"));
15
+
16
+ var _DuplicatorTool = _interopRequireDefault(require("./DuplicatorTool"));
17
+
18
+ var _ResetSecret = _interopRequireDefault(require("./ResetSecret"));
19
+
20
+ var _Feedback = _interopRequireDefault(require("./Feedback"));
21
+
22
+ var _constants = require("../helpers/constants");
23
+
24
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
+
26
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
27
+
28
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
29
+
30
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
31
+
32
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
33
+
34
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
35
+
36
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
37
+
38
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
39
+
40
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
41
+
42
+ // Check for auth secret (required for asset uploads)
43
+ var secretConfigKeys = [{
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`.',
46
+ description: ''
47
+ }];
48
+
49
+ function CrossDatasetDuplicator(props) {
50
+ var _props$mode = props.mode,
51
+ mode = _props$mode === void 0 ? "tool" : _props$mode,
52
+ _props$docs = props.docs,
53
+ docs = _props$docs === void 0 ? [] : _props$docs;
54
+ var secretsData = (0, _sanitySecrets.useSecrets)(_constants.SECRET_NAMESPACE);
55
+ var loading = secretsData.loading,
56
+ secrets = secretsData.secrets;
57
+
58
+ var _useState = (0, _react.useState)(false),
59
+ _useState2 = _slicedToArray(_useState, 2),
60
+ showSecretsPrompt = _useState2[0],
61
+ setShowSecretsPrompt = _useState2[1];
62
+
63
+ (0, _react.useEffect)(() => {
64
+ if (secrets) {
65
+ setShowSecretsPrompt(!(secrets !== null && secrets !== void 0 && secrets.bearerToken));
66
+ }
67
+ }, [secrets]);
68
+
69
+ if (!secretsData) {
70
+ return /*#__PURE__*/_react.default.createElement(_Feedback.default, null, "Could not query for Secrets. You may have insufficient permissions on your account.");
71
+ }
72
+
73
+ if (loading) {
74
+ return /*#__PURE__*/_react.default.createElement(_ui.ThemeProvider, null, /*#__PURE__*/_react.default.createElement(_ui.Flex, {
75
+ justify: "center",
76
+ align: "center"
77
+ }, /*#__PURE__*/_react.default.createElement(_ui.Box, {
78
+ padding: 5
79
+ }, /*#__PURE__*/_react.default.createElement(_ui.Spinner, null))));
80
+ }
81
+
82
+ if (!loading && showSecretsPrompt || !(secrets !== null && secrets !== void 0 && secrets.bearerToken)) {
83
+ return /*#__PURE__*/_react.default.createElement(_ui.ThemeProvider, null, /*#__PURE__*/_react.default.createElement(_sanitySecrets.SettingsView, {
84
+ title: "Token Required",
85
+ namespace: _constants.SECRET_NAMESPACE,
86
+ keys: secretConfigKeys // eslint-disable-next-line react/jsx-no-bind
87
+ ,
88
+ onClose: () => setShowSecretsPrompt(false)
89
+ }));
90
+ }
91
+
92
+ if (mode === 'tool') {
93
+ return /*#__PURE__*/_react.default.createElement(_ui.ThemeProvider, null, /*#__PURE__*/_react.default.createElement(_DuplicatorQuery.default, {
94
+ token: secrets === null || secrets === void 0 ? void 0 : secrets.bearerToken
95
+ }), /*#__PURE__*/_react.default.createElement(_ResetSecret.default, null));
96
+ }
97
+
98
+ if (!(docs !== null && docs !== void 0 && docs.length)) {
99
+ return /*#__PURE__*/_react.default.createElement(_ui.ThemeProvider, null, /*#__PURE__*/_react.default.createElement(_Feedback.default, null, "No docs passed into Duplicator Tool"));
100
+ }
101
+
102
+ return /*#__PURE__*/_react.default.createElement(_ui.ThemeProvider, null, /*#__PURE__*/_react.default.createElement(_DuplicatorTool.default, {
103
+ docs: docs,
104
+ token: secrets === null || secrets === void 0 ? void 0 : secrets.bearerToken
105
+ }));
106
+ }
107
+ //# sourceMappingURL=CrossDatasetDuplicator.js.map
@@ -0,0 +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"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = DuplicatorQuery;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _client = _interopRequireDefault(require("part:@sanity/base/client"));
11
+
12
+ var _schema = _interopRequireDefault(require("part:@sanity/base/schema"));
13
+
14
+ var _ui = require("@sanity/ui");
15
+
16
+ var _DuplicatorTool = _interopRequireDefault(require("./DuplicatorTool"));
17
+
18
+ var _clientConfig = require("../helpers/clientConfig");
19
+
20
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
+
22
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
23
+
24
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
25
+
26
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
27
+
28
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
29
+
30
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
31
+
32
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
33
+
34
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
35
+
36
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
37
+
38
+ var originClient = _client.default.withConfig(_clientConfig.clientConfig);
39
+
40
+ function DuplicatorQuery(props) {
41
+ var token = props.token;
42
+
43
+ var _useState = (0, _react.useState)(""),
44
+ _useState2 = _slicedToArray(_useState, 2),
45
+ value = _useState2[0],
46
+ setValue = _useState2[1];
47
+
48
+ var _useState3 = (0, _react.useState)([]),
49
+ _useState4 = _slicedToArray(_useState3, 2),
50
+ docs = _useState4[0],
51
+ setDocs = _useState4[1];
52
+
53
+ function handleSubmit(e) {
54
+ if (e) e.preventDefault();
55
+ originClient.fetch(value).then(res => {
56
+ // Ensure queried docs are registered to the schema
57
+ var registeredDocs = res.length ? res.filter(doc => _schema.default.get(doc._type)) : [];
58
+ setDocs(registeredDocs);
59
+ }).catch(err => console.error(err));
60
+ } // Auto-load initial textinput value
61
+
62
+
63
+ (0, _react.useEffect)(() => {
64
+ if (!(docs !== null && docs !== void 0 && docs.length) && value) {
65
+ handleSubmit();
66
+ }
67
+ }, []);
68
+ return /*#__PURE__*/_react.default.createElement(_ui.Container, {
69
+ width: [1, 1, 1, 3],
70
+ padding: [0, 0, 0, 5]
71
+ }, /*#__PURE__*/_react.default.createElement(_ui.Grid, {
72
+ columns: [1, 1, 1, 2],
73
+ gap: [1, 1, 1, 4]
74
+ }, /*#__PURE__*/_react.default.createElement(_ui.Box, {
75
+ padding: [2, 2, 2, 0]
76
+ }, /*#__PURE__*/_react.default.createElement(_ui.Card, {
77
+ padding: 4,
78
+ scheme: "dark",
79
+ radius: 3
80
+ }, /*#__PURE__*/_react.default.createElement(_ui.Stack, {
81
+ 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", {
83
+ onSubmit: handleSubmit
84
+ }, /*#__PURE__*/_react.default.createElement(_ui.Flex, null, /*#__PURE__*/_react.default.createElement(_ui.Box, {
85
+ flex: 1,
86
+ paddingRight: 2
87
+ }, /*#__PURE__*/_react.default.createElement(_ui.TextInput, {
88
+ style: {
89
+ fontFamily: 'monospace'
90
+ },
91
+ fontSize: 2 // eslint-disable-next-line react/jsx-no-bind
92
+ ,
93
+ onChange: event => setValue(event.currentTarget.value),
94
+ padding: 4,
95
+ placeholder: "*[_type == \"article\"]",
96
+ value: value !== null && value !== void 0 ? value : ""
97
+ })), /*#__PURE__*/_react.default.createElement(_ui.Button, {
98
+ padding: 2,
99
+ paddingX: 4,
100
+ tone: "primary",
101
+ onClick: handleSubmit,
102
+ text: "Query",
103
+ disabled: !value
104
+ })))))), !(docs !== null && docs !== void 0 && docs.length) || docs.length < 1 && /*#__PURE__*/_react.default.createElement(_ui.Container, {
105
+ width: 1
106
+ }, /*#__PURE__*/_react.default.createElement(_ui.Card, {
107
+ 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,
110
+ token: token
111
+ })));
112
+ }
113
+ //# sourceMappingURL=DuplicatorQuery.js.map
@@ -0,0 +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":";;;;;;;AAAA;;AACA;;AACA;;AACA;;AAEA;;AACA;;;;;;;;;;;;;;;;;;;;AAEA,IAAMA,YAAY,GAAGC,gBAAaC,UAAb,CAAwBC,0BAAxB,CAArB;;AAMe,SAASC,eAAT,CAAyBC,KAAzB,EAAsD;AACnE,MAAOC,KAAP,GAAgBD,KAAhB,CAAOC,KAAP;;AAEA,kBAA0B,wBAA1B;AAAA;AAAA,MAAOC,KAAP;AAAA,MAAcC,QAAd;;AACA,mBAAwB,qBAAS,EAAT,CAAxB;AAAA;AAAA,MAAOC,IAAP;AAAA,MAAaC,OAAb;;AAEA,WAASC,YAAT,CAAsBC,CAAtB,EAA+B;AAC7B,QAAIA,CAAJ,EAAOA,CAAC,CAACC,cAAF;AAEPb,IAAAA,YAAY,CACTc,KADH,CACSP,KADT,EAEGQ,IAFH,CAESC,GAAD,IAAS;AACb;AACA,UAAMC,cAAc,GAAGD,GAAG,CAACE,MAAJ,GAAaF,GAAG,CAACG,MAAJ,CAAYC,GAAD,IAASC,gBAAOC,GAAP,CAAWF,GAAG,CAACG,KAAf,CAApB,CAAb,GAA0D,EAAjF;AAEAb,MAAAA,OAAO,CAACO,cAAD,CAAP;AACD,KAPH,EAQGO,KARH,CAQUC,GAAD,IAASC,OAAO,CAACC,KAAR,CAAcF,GAAd,CARlB;AASD,GAlBkE,CAoBnE;;;AACA,wBAAU,MAAM;AACd,QAAI,EAAChB,IAAD,aAACA,IAAD,eAACA,IAAI,CAAES,MAAP,KAAiBX,KAArB,EAA4B;AAC1BI,MAAAA,YAAY;AACb;AACF,GAJD,EAIG,EAJH;AAMA,sBACE,6BAAC,aAAD;AAAW,IAAA,KAAK,EAAE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CAAlB;AAAgC,IAAA,OAAO,EAAE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV;AAAzC,kBACE,6BAAC,QAAD;AAAM,IAAA,OAAO,EAAE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CAAf;AAA6B,IAAA,GAAG,EAAE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV;AAAlC,kBACE,6BAAC,OAAD;AAAK,IAAA,OAAO,EAAE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV;AAAd,kBACE,6BAAC,QAAD;AAAM,IAAA,OAAO,EAAE,CAAf;AAAkB,IAAA,MAAM,EAAC,MAAzB;AAAgC,IAAA,MAAM,EAAE;AAAxC,kBACE,6BAAC,SAAD;AAAO,IAAA,KAAK,EAAE;AAAd,kBACE,6BAAC,OAAD,qBACE,6BAAC,SAAD,kCADF,CADF,eAIE,6BAAC,OAAD,qBACE,6BAAC,QAAD,sHADF,CAJF,eASE;AAAM,IAAA,QAAQ,EAAEA;AAAhB,kBACE,6BAAC,QAAD,qBACE,6BAAC,OAAD;AAAK,IAAA,IAAI,EAAE,CAAX;AAAc,IAAA,YAAY,EAAE;AAA5B,kBACE,6BAAC,aAAD;AACE,IAAA,KAAK,EAAE;AAACiB,MAAAA,UAAU,EAAE;AAAb,KADT;AAEE,IAAA,QAAQ,EAAE,CAFZ,CAGE;AAHF;AAIE,IAAA,QAAQ,EAAGC,KAAD,IAAWrB,QAAQ,CAACqB,KAAK,CAACC,aAAN,CAAoBvB,KAArB,CAJ/B;AAKE,IAAA,OAAO,EAAE,CALX;AAME,IAAA,WAAW,2BANb;AAOE,IAAA,KAAK,EAAEA,KAAF,aAAEA,KAAF,cAAEA,KAAF;AAPP,IADF,CADF,eAYE,6BAAC,UAAD;AACE,IAAA,OAAO,EAAE,CADX;AAEE,IAAA,QAAQ,EAAE,CAFZ;AAGE,IAAA,IAAI,EAAC,SAHP;AAIE,IAAA,OAAO,EAAEI,YAJX;AAKE,IAAA,IAAI,EAAC,OALP;AAME,IAAA,QAAQ,EAAE,CAACJ;AANb,IAZF,CADF,CATF,CADF,CADF,CADF,EAsCG,EAACE,IAAD,aAACA,IAAD,eAACA,IAAI,CAAES,MAAP,KAAiBT,IAAI,CAACS,MAAL,GAAc,CAAd,iBAChB,6BAAC,aAAD;AAAW,IAAA,KAAK,EAAE;AAAlB,kBACE,6BAAC,QAAD;AAAM,IAAA,OAAO,EAAE;AAAf,KACGX,KAAK,6FADR,CADF,CAvCJ,EA6CG,CAAAE,IAAI,SAAJ,IAAAA,IAAI,WAAJ,YAAAA,IAAI,CAAES,MAAN,IAAe,CAAf,iBAAoB,6BAAC,uBAAD;AAAgB,IAAA,IAAI,EAAET,IAAtB;AAA4B,IAAA,KAAK,EAAEH;AAAnC,IA7CvB,CADF,CADF;AAmDD","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"}