@sanity/cross-dataset-duplicator 0.3.3 → 0.3.4
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/lib/actions/DuplicateToAction.js.map +1 -1
- package/lib/actions/index.js.map +1 -1
- package/lib/components/CrossDatasetDuplicator.js.map +1 -1
- package/lib/components/DuplicatorQuery.js.map +1 -1
- package/lib/components/DuplicatorTool.js +1 -1
- package/lib/components/DuplicatorTool.js.map +1 -1
- package/lib/components/ResetSecret.js.map +1 -1
- package/lib/components/SelectButtons.js.map +1 -1
- package/lib/helpers/getDocumentsInArray.js.map +1 -1
- package/lib/tool/index.js.map +1 -1
- package/package.json +1 -1
- package/src/components/DuplicatorTool.tsx +2 -3
|
@@ -1 +1 @@
|
|
|
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,
|
|
1
|
+
{"version":3,"file":"DuplicateToAction.js","names":["DuplicateToAction","draft","published","onComplete","useState","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,IAAAC,eAAA,EAAS,KAAT,CAApC;EAAA;EAAA,IAAOC,UAAP;EAAA,IAAmBC,aAAnB;;EAEA,OAAO;IACLC,QAAQ,EAAEN,KADL;IAELO,KAAK,EAAEP,KAAK,2CAA2C,IAFlD;IAGLQ,KAAK,EAAE,iBAHF;IAILC,MAAM,EAAEL,UAAU,IAAIH,SAAd,IAA2B;MACjCS,IAAI,EAAE,OAD2B;MAEjCH,KAAK,EAAE,0BAF0B;MAGjCI,OAAO,eAAE,6BAAC,+BAAD;QAAwB,IAAI,EAAE,CAACV,SAAD,CAA9B;QAA2C,IAAI,EAAC;MAAhD,EAHwB;MAIjCW,OAAO,EAAE,MAAMV,UAAU;IAJQ,CAJ9B;IAULW,QAAQ,EAAE,MAAMR,aAAa,CAAC,IAAD,CAVxB;IAWLS,IAAI,EAAEC;EAXD,CAAP;AAaD"}
|
package/lib/actions/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,
|
|
1
|
+
{"version":3,"file":"index.js","names":["resolveDocumentActions","props","duplicatorTypes","config","types","defaultActions","defaultResolve","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,+BAAA,CAAQC,KAAX,yDAAoB,EAAzC;EACA,IAAMC,cAAc,GAAG,IAAAC,wBAAA,EAAeL,KAAf,CAAvB,CAFoD,CAIpD;;EACA,IAAIC,eAAe,CAACK,QAAhB,CAAyBN,KAAzB,aAAyBA,KAAzB,uBAAyBA,KAAK,CAAEO,IAAhC,CAAJ,EAA2C;IACzC,OAAOH,cAAc,CAACI,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,OAAON,cAAP;AACD"}
|
|
@@ -1 +1 @@
|
|
|
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
|
|
1
|
+
{"version":3,"file":"CrossDatasetDuplicator.js","names":["secretConfigKeys","key","title","description","CrossDatasetDuplicator","props","mode","docs","secretsData","useSecrets","SECRET_NAMESPACE","loading","secrets","useState","showSecretsPrompt","setShowSecretsPrompt","useEffect","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,IAAAC,yBAAA,EAAWC,2BAAX,CAApB;EACA,IAAOC,OAAP,GAAiEH,WAAjE,CAAOG,OAAP;EAAA,IAAgBC,OAAhB,GAAiEJ,WAAjE,CAAgBI,OAAhB;;EACA,gBAAkD,IAAAC,eAAA,EAAS,KAAT,CAAlD;EAAA;EAAA,IAAOC,iBAAP;EAAA,IAA0BC,oBAA1B;;EAEA,IAAAC,gBAAA,EAAU,MAAM;IACd,IAAIJ,OAAJ,EAAa;MACXG,oBAAoB,CAAC,EAACH,OAAD,aAACA,OAAD,eAACA,OAAO,CAAEK,WAAV,CAAD,CAApB;IACD;EACF,CAJD,EAIG,CAACL,OAAD,CAJH;;EAMA,IAAI,CAACJ,WAAL,EAAkB;IAChB,oBACE,6BAAC,iBAAD,8FADF;EAKD;;EAED,IAAIG,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,IAAYG,iBAAb,IAAmC,EAACF,OAAD,aAACA,OAAD,eAACA,OAAO,CAAEK,WAAV,CAAvC,EAA8D;IAC5D,oBACE,6BAAC,iBAAD,qBACE,6BAAC,2BAAD;MACE,KAAK,EAAC,gBADR;MAEE,SAAS,EAAEP,2BAFb;MAGE,IAAI,EAAEV,gBAHR,CAIE;MAJF;MAKE,OAAO,EAAE,MAAMe,oBAAoB,CAAC,KAAD;IALrC,EADF,CADF;EAWD;;EAED,IAAIT,IAAI,KAAK,MAAb,EAAqB;IACnB,oBACE,6BAAC,iBAAD,qBACE,6BAAC,wBAAD;MAAiB,KAAK,EAAEM,OAAF,aAAEA,OAAF,uBAAEA,OAAO,CAAEK;IAAjC,EADF,eAEE,6BAAC,oBAAD,OAFF,CADF;EAMD;;EAED,IAAI,EAACV,IAAD,aAACA,IAAD,eAACA,IAAI,CAAEW,MAAP,CAAJ,EAAmB;IACjB,oBACE,6BAAC,iBAAD,qBACE,6BAAC,iBAAD,8CADF,CADF;EAKD;;EAED,oBACE,6BAAC,iBAAD,qBACE,6BAAC,uBAAD;IAAgB,IAAI,EAAEX,IAAtB;IAA4B,KAAK,EAAEK,OAAF,aAAEA,OAAF,uBAAEA,OAAO,CAAEK;EAA5C,EADF,CADF;AAKD"}
|
|
@@ -1 +1 @@
|
|
|
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":";;;;;;;AAAA;;AACA;;AACA;;AACA;;AAEA;;AACA;;;;;;;;;;;;;;;;;;;;AAEA,IAAMA,YAAY,GAAGC,
|
|
1
|
+
{"version":3,"file":"DuplicatorQuery.js","names":["originClient","sanityClient","withConfig","clientConfig","schemaTypes","schema","getTypeNames","DuplicatorQuery","props","token","useState","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","useEffect","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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"}
|
|
@@ -97,7 +97,7 @@ function DuplicatorTool(props) {
|
|
|
97
97
|
doc: item,
|
|
98
98
|
include: true,
|
|
99
99
|
status: null,
|
|
100
|
-
hasDraft: draftIds.includes("drafts.".concat(item._id))
|
|
100
|
+
hasDraft: draftIds !== null && draftIds !== void 0 && draftIds.length ? draftIds.includes("drafts.".concat(item._id)) : false
|
|
101
101
|
})) : []),
|
|
102
102
|
_useState6 = _slicedToArray(_useState5, 2),
|
|
103
103
|
payload = _useState6[0],
|
|
@@ -1 +1 @@
|
|
|
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":";;;;;;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAaA;;AACA;;AACA;;AACA;;AACA;;AAEA;;AACA;;AACA;;AACA;;AACA;;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQe,SAASA,cAAT,CAAwBC,KAAxB,EAAoD;EAAA;;EACjE,IAAOC,IAAP,GAAgCD,KAAhC,CAAOC,IAAP;EAAA,IAAaC,QAAb,GAAgCF,KAAhC,CAAaE,QAAb;EAAA,IAAuBC,KAAvB,GAAgCH,KAAhC,CAAuBG,KAAvB,CADiE,CAGjE;EACA;;EACA,IAAMC,YAAY,GAAGC,gBAAaC,UAAb,CAAwBC,0BAAxB,CAArB,CALiE,CAOjE;EACA;;;EACA,IAAMC,aAAa,GAAGC,qHAAQC,qBAAR,wEAA+BC,MAA/B,GAClBF,sBAAOC,qBAAP,CAA6BE,GAA7B,CAAkCC,KAAD,oCAC5BA,KAD4B;IAE/BC,QAAQ,EACND,KAAK,CAACE,GAAN,CAAUC,OAAV,KAAsBZ,YAAY,CAACK,MAAb,GAAsBO,OAA5C,IACAH,KAAK,CAACE,GAAN,CAAUE,SAAV,KAAwBb,YAAY,CAACK,MAAb,GAAsBQ;EAJjB,EAAjC,CADkB,GAOlB,EAPJ;;EASA,gBAAsC,qBACpCT,aAAa,CAACG,MAAd,GAAuBH,aAAa,CAACU,IAAd,CAAoBL,KAAD,IAAW,CAACA,KAAK,CAACC,QAArC,CAAvB,GAAwE,EADpC,CAAtC;EAAA;EAAA,IAAOK,WAAP;EAAA,IAAoBC,cAApB;;EAGA,iBAA8B,qBAAS,EAAT,CAA9B;EAAA;EAAA,IAAOC,OAAP;EAAA,IAAgBC,UAAhB;;EACA,iBAA8B,qBAC5BrB,IAAI,CAACU,MAAL,GACIV,IAAI,CAACW,GAAL,CAAUW,IAAD,KAAW;IAClBC,GAAG,EAAED,IADa;IAElBE,OAAO,EAAE,IAFS;IAGlBC,MAAM,EAAE,IAHU;IAIlBC,QAAQ,EAAEzB,QAAQ,CAAC0B,QAAT,kBAA4BL,IAAI,CAACM,GAAjC;EAJQ,CAAX,CAAT,CADJ,GAOI,EARwB,CAA9B;EAAA;EAAA,IAAOC,OAAP;EAAA,IAAgBC,UAAhB;;EAUA,iBAA0C,qBAAS,KAAT,CAA1C;EAAA;EAAA,IAAOC,aAAP;EAAA,IAAsBC,gBAAtB;;EACA,iBAA0C,qBAAS,KAAT,CAA1C;EAAA;EAAA,IAAOC,aAAP;EAAA,IAAsBC,gBAAtB;;EACA,kBAAsC,qBAAS,KAAT,CAAtC;EAAA;EAAA,IAAOC,WAAP;EAAA,IAAoBC,cAApB;;EACA,kBAAgC,qBAAS,CAAC,CAAD,EAAI,CAAJ,CAAT,CAAhC;EAAA;EAAA,IAAOC,QAAP;EAAA,IAAiBC,WAAjB,kBAnCiE,CAqCjE;;;EACA,sBAAU,MAAM;IACd,IAAMC,IAAI,WAAV;IACA,IAAMC,WAAW,GAAG,EAApB;IACA,IAAMC,cAAc,GAAG,EAAvB;IAEAzC,IAAI,CAAC0C,OAAL,CAAcnB,GAAD,IAAS;MACpBiB,WAAW,CAACG,IAAZ,CAAiB,GAAG,sBAAQJ,IAAR,EAAchB,GAAd,CAApB;MACAkB,cAAc,CAACE,IAAf,CAAoB;QAACnB,OAAO,EAAE,IAAV;QAAgBD;MAAhB,CAApB;IACD,CAHD;IAKAO,UAAU,CAACW,cAAD,CAAV;IAEA,IAAMG,QAAQ,GAAG5C,IAAI,CAACU,MAAtB;IACA,IAAMmC,SAAS,GAAGL,WAAW,CAAC9B,MAA9B;;IAEA,IAAI8B,WAAW,CAAC9B,MAAhB,EAAwB;MACtBsB,gBAAgB,CAAC,IAAD,CAAhB;MAEAX,UAAU,CAAC;QACTyB,IAAI,WADK;QAETC,IAAI,EAAE,mCAAqBH,QAArB,EAA+BC,SAA/B;MAFG,CAAD,CAAV;IAID;EACF,CAvBD,EAuBG,CAAC7C,IAAD,CAvBH,EAtCiE,CA+DjE;EACA;;EACA,sBAAU,MAAM;IACdgD,qBAAqB;EACtB,CAFD,EAEG,CAAC9B,WAAD,EAAclB,IAAd,CAFH,EAjEiE,CAqEjE;;EArEiE,SAsElDgD,qBAtEkD;IAAA;EAAA;;EAAA;IAAA,2CAsEjE,aAAsD;MAAA,IAAjBC,UAAiB,uEAAJ,EAAI;MACpD,IAAMC,aAAa,GAAGD,UAAU,CAACvC,MAAX,GAAoBuC,UAApB,GAAiCpB,OAAvD;;MAEA,IAAI,CAACqB,aAAa,CAACxC,MAAf,IAAyB,EAACQ,WAAD,aAACA,WAAD,eAACA,WAAW,CAAEiC,IAAd,CAA7B,EAAiD;QAC/C;MACD;;MAED,IAAMC,UAAU,GAAGF,aAAa,CAACvC,GAAd,CAAkB;QAAA,IAAEY,GAAF,SAAEA,GAAF;QAAA,OAAWA,GAAG,CAACK,GAAf;MAAA,CAAlB,CAAnB;;MACA,IAAMyB,iBAAiB,GAAGjD,gBAAaC,UAAb,iCACrBC,0BADqB;QAExBS,OAAO,EAAEG,WAAW,CAACJ,GAAZ,CAAgBC,OAFD;QAGxBC,SAAS,EAAEE,WAAW,CAACJ,GAAZ,CAAgBE;MAHH,GAA1B;;MAKA,IAAMsC,eAAe,SAASD,iBAAiB,CAACE,KAAlB,6CAE5B;QAACH;MAAD,CAF4B,CAA9B;MAKA,IAAMI,cAAc,GAAGN,aAAa,CAACvC,GAAd,CAAmBW,IAAD,IAAU;QAAA;;QACjD,IAAMmC,WAAW,GAAGH,eAAe,CAACrC,IAAhB,CAAsBM,GAAD,IAASA,GAAG,CAACK,GAAJ,KAAYN,IAAI,CAACC,GAAL,CAASK,GAAnD,CAApB;;QAEA,IAAI6B,WAAW,SAAX,IAAAA,WAAW,WAAX,IAAAA,WAAW,CAAEC,UAAb,IAA2BpC,IAA3B,aAA2BA,IAA3B,4BAA2BA,IAAI,CAAEC,GAAjC,sCAA2B,UAAWmC,UAA1C,EAAsD;UACpD,IAAID,WAAW,CAACC,UAAZ,KAA2BpC,IAAI,CAACC,GAAL,CAASmC,UAAxC,EAAoD;YAClD;YACA;YACApC,IAAI,CAACG,MAAL;UACD,CAJD,MAIO,IAAIgC,WAAW,CAACC,UAAZ,IAA0BpC,IAAI,CAACC,GAAL,CAASmC,UAAvC,EAAmD;YACxDpC,IAAI,CAACG,MAAL,GACE,IAAIkC,IAAJ,CAASF,WAAW,CAACC,UAArB,IAAmC,IAAIC,IAAJ,CAASrC,IAAI,CAACC,GAAL,CAASmC,UAAlB,CAAnC,GACI;YADJ,cAGI;YAHJ,QADF;UAMD;QACF,CAbD,MAaO;UACLpC,IAAI,CAACG,MAAL,GAAc,QAAd;QACD;;QAED,OAAOH,IAAP;MACD,CArBsB,CAAvB;MAuBAQ,UAAU,CAAC0B,cAAD,CAAV;IACD,CAhHgE;IAAA;EAAA;;EAkHjE,SAASI,cAAT,CAAwBhC,GAAxB,EAA6B;IAC3B,IAAM4B,cAAc,GAAG3B,OAAO,CAAClB,GAAR,CAAaW,IAAD,IAAU;MAC3C,IAAIA,IAAI,CAACC,GAAL,CAASK,GAAT,KAAiBA,GAArB,EAA0B;QACxBN,IAAI,CAACE,OAAL,GAAe,CAACF,IAAI,CAACE,OAArB;MACD;;MAED,OAAOF,IAAP;IACD,CANsB,CAAvB;IAQAQ,UAAU,CAAC0B,cAAD,CAAV;EACD,CA5HgE,CA8HjE;;;EA9HiE,SA+HlDK,gBA/HkD;IAAA;EAAA,EA4JjE;;;EA5JiE;IAAA,sCA+HjE,aAAkC;MAChCzB,cAAc,CAAC,IAAD,CAAd;MACA,IAAM0B,MAAM,GAAG9D,IAAI,CAACW,GAAL,CAAUY,GAAD,IAASA,GAAG,CAACK,GAAtB,CAAf;MAEA,IAAMmC,WAAW,SAAS,8CAAoBD,MAApB,EAA4B3D,YAA5B,EAA0C,IAA1C,CAA1B;MACA,IAAM6D,SAAS,SAAS,8CACtBF,MAAM,CAACnD,GAAP,CAAYsD,EAAD,qBAAkBA,EAAlB,CAAX,CADsB,EAEtB9D,YAFsB,EAGtB,IAHsB,UAAxB;MAMA,IAAM+D,YAAY,GAAG,IAAIC,GAAJ,CAAQH,SAAS,CAACrD,GAAV,CAAc;QAAA,IAAEiB,GAAF,SAAEA,GAAF;QAAA,OAAWA,GAAX;MAAA,CAAd,CAAR,CAArB,CAXgC,CAahC;;MACA,IAAMwC,aAAa,GAAGL,WAAW,CAACpD,GAAZ,CAAiBY,GAAD,KAAU;QAC9CA,GAD8C;QAE9C;QACAC,OAAO,EAAE,IAHqC;QAI9C;QACAC,MAAM,EAAE,EALsC;QAM9C;QACAC,QAAQ,EAAEwC,YAAY,CAACG,GAAb,kBAA2B9C,GAAG,CAACK,GAA/B;MAPoC,CAAV,CAAhB,CAAtB;MAUAE,UAAU,CAACsC,aAAD,CAAV;MACApB,qBAAqB,CAACoB,aAAD,CAArB;MACAhC,cAAc,CAAC,KAAD,CAAd;IACD,CA1JgE;IAAA;EAAA;;EAAA,SA6JlDkC,eA7JkD;IAAA;EAAA;;EAAA;IAAA,qCA6JjE,aAAiC;MAC/BpC,gBAAgB,CAAC,IAAD,CAAhB;MAEA,IAAMqC,WAAW,GAAG1C,OAAO,CAAC2C,MAAR,CAAe;QAAA,IAAEjD,GAAF,SAAEA,GAAF;QAAA,IAAOC,OAAP,SAAOA,OAAP;QAAA,OAAoBA,OAAO,IAAI,0BAAYD,GAAG,CAACkD,KAAhB,CAA/B;MAAA,CAAf,EAAsE/D,MAA1F;MACA,IAAIgE,eAAe,GAAG,CAAtB;MACApC,WAAW,CAAC,CAACoC,eAAD,EAAkBH,WAAlB,CAAD,CAAX;MAEAlD,UAAU,CAAC;QAAC0B,IAAI,EAAE;MAAP,CAAD,CAAV;;MAEA,IAAMM,iBAAiB,GAAGjD,gBAAaC,UAAb,iCACrBC,0BADqB;QAExBS,OAAO,EAAEG,WAAW,CAACJ,GAAZ,CAAgBC,OAFD;QAGxBC,SAAS,EAAEE,WAAW,CAACJ,GAAZ,CAAgBE;MAHH,GAA1B;;MAMA,IAAM2D,eAAe,GAAG,EAAxB;MACA,IAAMC,OAAO,GAAG,EAAhB,CAhB+B,CAkB/B;;MAlB+B,SAmBhBC,QAnBgB;QAAA;MAAA,EAuD/B;;;MAvD+B;QAAA,8BAmB/B,WAAwBtD,GAAxB,EAA6B;UAC3B,IAAI,0BAAYA,GAAG,CAACkD,KAAhB,CAAJ,EAA4B;YAC1B;YACA;YACA,IAAMK,UAAU,GAAGvD,GAAG,CAACkD,KAAJ,CAAUM,KAAV,CAAgB,GAAhB,EAAqBC,GAArB,GAA2BC,OAA3B,CAAmC,OAAnC,EAA4C,EAA5C,CAAnB;;YACA,IAAMC,WAAW,GAAGJ,UAAU,KAAK,OAAf,aAA4BvD,GAAG,CAAC4D,GAAhC,mBAAmD5D,GAAG,CAAC4D,GAA3E;YACA,IAAMC,cAAc,GAClBN,UAAU,KAAK,OAAf,GAAyB;cAACO,OAAO,EAAE;gBAACC,aAAa,mBAAYpF,KAAZ;cAAd;YAAV,CAAzB,GAAyE,EAD3E;YAGA,MAAMqD,KAAK,CAAC2B,WAAD,EAAcE,cAAd,CAAL,CAAmCG,IAAnC;cAAA,8BAAwC,WAAOC,GAAP,EAAe;gBAC3D,IAAMC,SAAS,SAASD,GAAG,CAACE,IAAJ,EAAxB;gBAEA,IAAMC,OAAO,GAAG;kBAACC,QAAQ,EAAErE,GAAG,CAACsE;gBAAf,CAAhB;gBACA,IAAMC,QAAQ,SAASzC,iBAAiB,CAAC0C,MAAlB,CAAyBC,MAAzB,CAAgClB,UAAhC,EAA4CW,SAA5C,EAAuDE,OAAvD,CAAvB,CAJ2D,CAM3D;;gBACA,IAAI,CAAApE,GAAG,SAAH,IAAAA,GAAG,WAAH,YAAAA,GAAG,CAAE0E,SAAL,MAAmB,KAAvB,EAA8B;kBAC5BrB,OAAO,CAACjC,IAAR,CAAa;oBAACuD,GAAG,EAAE3E,GAAG,CAACK,GAAV;oBAAeuE,GAAG,EAAEL,QAAQ,CAAClE;kBAA7B,CAAb;gBACD;;gBAED+C,eAAe,CAAChC,IAAhB,CAAqBmD,QAArB;cACD,CAZK;;cAAA;gBAAA;cAAA;YAAA,IAAN;YAcApB,eAAe,IAAI,CAAnB;YACArD,UAAU,CAAC;cACT0B,IAAI,wBAAiB2B,eAAjB,cAAoCH,WAApC,cACFA,WAAW,KAAK,CAAhB,sBADE;YADK,CAAD,CAAV;YAMA,OAAOjC,WAAW,CAAC,CAACoC,eAAD,EAAkBH,WAAlB,CAAD,CAAlB;UACD;;UAED,OAAOI,eAAe,CAAChC,IAAhB,CAAqBpB,GAArB,CAAP;QACD,CArD8B;QAAA;MAAA;;MAwD/B,IAAM6E,MAAM,GAAG,IAAIC,OAAJ,CAAY,CAACC,OAAD,EAAUC,MAAV,KAAqB;QAC9C,IAAMC,mBAAmB,GAAG3E,OAAO,CAAC2C,MAAR,CAAgBlD,IAAD,IAAUA,IAAI,CAACE,OAA9B,EAAuCb,GAAvC,CAA4CW,IAAD,IAAUA,IAAI,CAACC,GAA1D,CAA5B;QAEA,uBAASiF,mBAAT,EAA8B,CAA9B,EAAiC,uBAAS3B,QAAT,CAAjC,EAAsD4B,GAAD,IAAS;UAC5D,IAAIA,GAAJ,EAAS;YACPvE,gBAAgB,CAAC,KAAD,CAAhB;YACAb,UAAU,CAAC;cAACyB,IAAI,EAAE,UAAP;cAAmBC,IAAI;YAAvB,CAAD,CAAV;YACA2D,OAAO,CAACC,KAAR,CAAcF,GAAd;YACAF,MAAM,CAAC,IAAIK,KAAJ,CAAU,oBAAV,CAAD,CAAN;UACD;;UAEDN,OAAO;QACR,CATD;MAUD,CAbc,CAAf;MAeA,MAAMF,MAAN,CAvE+B,CAyE/B;;MACA,IAAMS,qBAAqB,GAAGlC,eAAe,CAAChE,GAAhB,CAAqBY,GAAD,IAAS;QACzD,IAAMgB,IAAI,WAAV;QACA,IAAMuE,UAAU,GAAG,8BAAgBvE,IAAhB,EAAsBhB,GAAtB,CAAnB;;QAEA,IAAI,CAACuF,UAAU,CAACpG,MAAhB,EAAwB;UACtB,OAAOa,GAAP;QACD,CANwD,CAQzD;;;QACAuF,UAAU,CAACpE,OAAX,CAAoBqE,GAAD,IAAS;UAAA;;UAC1B,IAAMC,WAAW,oBAAGpC,OAAO,CAAC3D,IAAR,CAAcgG,KAAD,IAAWA,KAAK,CAACf,GAAN,KAAca,GAAG,CAACG,KAA1C,CAAH,kDAAG,cAAkDf,GAAtE;;UAEA,IAAIa,WAAJ,EAAiB;YACf,IAAMG,OAAO,GAAGJ,GAAG,CAACK,IAAJ,CAASC,IAAT,CAAc,GAAd,CAAhB;YAEA,gBAAK9F,GAAL,EAAU4F,OAAV,EAAmBH,WAAnB;UACD;QACF,CARD;QAUA,OAAOzF,GAAP;MACD,CApB6B,CAA9B,CA1E+B,CAgG/B;;MACA,IAAM+F,WAAW,GAAGjE,iBAAiB,CAACiE,WAAlB,EAApB;MAEAT,qBAAqB,CAACnE,OAAtB,CAA+BnB,GAAD,IAAS;QACrC+F,WAAW,CAACC,eAAZ,CAA4BhG,GAA5B;MACD,CAFD;MAIA,MAAM+F,WAAW,CACdE,MADG,GAEHjC,IAFG,CAEGC,GAAD,IAAS;QACbnE,UAAU,CAAC;UAACyB,IAAI,EAAE,UAAP;UAAmBC,IAAI,EAAE;QAAzB,CAAD,CAAV;QAEAC,qBAAqB;MACtB,CANG,EAOHyE,KAPG,CAOIhB,GAAD,IAAS;QACdpF,UAAU,CAAC;UAACyB,IAAI,EAAE,UAAP;UAAmBC,IAAI,EAAE0D,GAAG,CAACiB,OAAJ,CAAYC;QAArC,CAAD,CAAV;MACD,CATG,CAAN;MAWAzF,gBAAgB,CAAC,KAAD,CAAhB;MACAI,WAAW,CAAC,CAAD,CAAX;IACD,CAjRgE;IAAA;EAAA;;EAmRjE,SAASsF,YAAT,CAAsBC,CAAtB,EAAyB;IACvB1G,cAAc,CAACZ,aAAa,CAACU,IAAd,CAAoBL,KAAD,IAAWA,KAAK,CAACuC,IAAN,KAAe0E,CAAC,CAACC,aAAF,CAAgBZ,KAA7D,CAAD,CAAd;EACD;;EAED,IAAI,CAAC3G,aAAa,CAACG,MAAnB,EAA2B;IACzB,oBACE,6BAAC,iBAAD;MAAU,IAAI,EAAC;IAAf,gBACE,mEADF,iCACkD,yDADlD,CADF;EAKD;;EAED,IAAMqH,YAAY,GAAGlG,OAAO,CAACnB,MAA7B;EACA,IAAMsH,aAAa,GAAGnG,OAAO,CAACoG,SAAR,CAAkB;IAAA,IAAE1G,GAAF,QAAEA,GAAF;IAAA,OAAWA,GAAG,CAAC0E,SAAJ,KAAkB,KAA7B;EAAA,CAAlB,CAAtB;EACA,IAAMiC,sBAAsB,GAAGrG,OAAO,CAAC2C,MAAR,CAC5BlD,IAAD,IAAUA,IAAI,CAACE,OAAL,IAAgB,CAAC,0BAAYF,IAAI,CAACC,GAAL,CAASkD,KAArB,CADE,EAE7B/D,MAFF;EAGA,IAAMyH,mBAAmB,GAAGtG,OAAO,CAAC2C,MAAR,CACzBlD,IAAD,IAAUA,IAAI,CAACE,OAAL,IAAgB,0BAAYF,IAAI,CAACC,GAAL,CAASkD,KAArB,CADA,EAE1B/D,MAFF;EAGA,IAAM0H,aAAa,GAAGF,sBAAsB,GAAGC,mBAA/C;EACA,IAAME,gBAAgB,yBAAGnH,WAAH,aAAGA,WAAH,uBAAGA,WAAW,CAAEoH,KAAhB,mEAAyBpH,WAAzB,aAAyBA,WAAzB,uBAAyBA,WAAW,CAAEiC,IAA5D;EACA,IAAMoF,qBAAqB,GACzB,IAAIpE,GAAJ,CAAQ5D,aAAa,CAACI,GAAd,CAAmBC,KAAD;IAAA;;IAAA,OAAWA,KAAX,aAAWA,KAAX,qCAAWA,KAAK,CAAEE,GAAlB,+CAAW,WAAYE,SAAvB;EAAA,CAAlB,EAAoDwD,MAApD,CAA2DgE,OAA3D,CAAR,EAA6EC,IAA7E,GAAoF,CADtF;EAGA,IAAMC,WAAW,GAAG,CAACN,aAAD,OAAqBL,YAArB,mCAAoEV,IAApE,KAApB;;EAEA,IAAMsB,UAAU,GAAGC,eAAMC,OAAN,CAAc,MAAM;IACrC,IAAI9F,IAAI,GAAG,aAAX;;IAEA,IAAImF,sBAAsB,GAAG,CAA7B,EAAgC;MAC9BnF,IAAI,CAACJ,IAAL,CAAUuF,sBAAV,EAAkCA,sBAAsB,KAAK,CAA3B,2BAAlC;IACD;;IAED,IAAIC,mBAAmB,GAAG,CAA1B,EAA6B;MAC3BpF,IAAI,CAACJ,IAAL,QAAiBwF,mBAAjB,EAAsCA,mBAAmB,KAAK,CAAxB,qBAAtC;IACD;;IAED,IAAIhI,YAAY,CAACK,MAAb,GAAsBQ,SAAtB,KAAoCE,WAAW,CAACJ,GAAZ,CAAgBE,SAAxD,EAAmE;MACjE+B,IAAI,CAACJ,IAAL;IACD;;IAEDI,IAAI,CAACJ,IAAL,OAAgB0F,gBAAhB;IAEA,OAAOtF,IAAI,CAACsE,IAAL,KAAP;EACD,CAlBkB,EAkBhB,CAACa,sBAAD,EAAyBC,mBAAzB,EAA8CE,gBAA9C,CAlBgB,CAAnB;;EAoBA,oBACE,6BAAC,aAAD;IAAW,KAAK,EAAE;EAAlB,gBACE,6BAAC,QAAD,qBACE,6BAAC,SAAD,qBACE,yEACE,6BAAC,QAAD;IAAM,YAAY,MAAlB;IAAmB,OAAO,EAAE,CAA5B;IAA+B,KAAK,EAAES;EAAtC,gBACE,6BAAC,SAAD;IAAO,KAAK,EAAE;EAAd,gBACE,6BAAC,QAAD;IAAM,KAAK,EAAE;EAAb,gBACE,6BAAC,SAAD;IAAO,KAAK,EAAE;MAACC,IAAI,EAAE;IAAP,CAAd;IAAyB,KAAK,EAAE;EAAhC,gBACE,6BAAC,SAAD,yBADF,eAEE,6BAAC,UAAD;IAAQ,QAAQ,MAAhB;IAAiB,KAAK,yBAAExI,aAAa,CAACU,IAAd,CAAoBL,KAAD,IAAWA,KAAK,CAACC,QAApC,CAAF,wDAAE,oBAA+CsC;EAAvE,GACG5C,aAAa,CACXiE,MADF,CACU5D,KAAD,IAAWA,KAAK,CAACC,QAD1B,EAEEF,GAFF,CAEOC,KAAD;IAAA;;IAAA,oBACH;MAAQ,GAAG,EAAEA,KAAK,CAACuC,IAAnB;MAAyB,KAAK,EAAEvC,KAAK,CAACuC,IAAtC;MAA4C,QAAQ,EAAEvC,KAAK,CAACC;IAA5D,mBACGD,KAAK,CAAC0H,KADT,uDACkB1H,KAAK,CAACuC,IADxB,EAEGoF,qBAAqB,eAAQ3H,KAAK,CAACE,GAAN,CAAUE,SAAlB,WAFxB,CADG;EAAA,CAFN,CADH,CAFF,CADF,eAcE,6BAAC,OAAD;IAAK,OAAO,EAAE,CAAd;IAAiB,UAAU,EAAE,CAA7B;IAAgC,aAAa,EAAE;EAA/C,gBACE,6BAAC,QAAD;IAAM,IAAI,EAAE;EAAZ,gBACE,6BAAC,qBAAD,OADF,CADF,CAdF,eAmBE,6BAAC,SAAD;IAAO,KAAK,EAAE;MAAC+H,IAAI,EAAE;IAAP,CAAd;IAAyB,KAAK,EAAE;EAAhC,gBACE,6BAAC,SAAD,yBADF,eAEE,6BAAC,UAAD;IAAQ,QAAQ,EAAEnB;EAAlB,GACGrH,aAAa,CAACI,GAAd,CAAmBC,KAAD;IAAA;;IAAA,oBACjB;MAAQ,GAAG,EAAEA,KAAK,CAACuC,IAAnB;MAAyB,KAAK,EAAEvC,KAAK,CAACuC,IAAtC;MAA4C,QAAQ,EAAEvC,KAAK,CAACC;IAA5D,oBACGD,KAAK,CAAC0H,KADT,yDACkB1H,KAAK,CAACuC,IADxB,EAEGoF,qBAAqB,eAAQ3H,KAAK,CAACE,GAAN,CAAUE,SAAlB,WAFxB,EAGGJ,KAAK,CAACC,QAAN,oBAHH,CADiB;EAAA,CAAlB,CADH,CAFF,CAnBF,CADF,EAkCGoB,aAAa,iBACZ,6BAAC,QAAD;IAAM,MAAM,MAAZ;IAAa,MAAM,EAAE;EAArB,gBACE,6BAAC,QAAD;IACE,KAAK,EAAE;MACL+G,KAAK,EAAE,MADF;MAELC,SAAS,mBAAY5G,QAAQ,CAAC,CAAD,CAAR,GAAcA,QAAQ,CAAC,CAAD,CAAlC,MAFJ;MAGL6G,eAAe,EAAE,MAHZ;MAILC,UAAU,EAAE,oBAJP;MAKLC,SAAS,EAAE;IALN,CADT;IAQE,OAAO,EAAE,CARX;IASE,IAAI,EAAC;EATP,EADF,CAnCJ,EAiDGvH,OAAO,CAACnB,MAAR,GAAiB,CAAjB,iBACC,yEACE,6BAAC,SAAD,QAAQgI,WAAR,CADF,eAEE,6BAAC,sBAAD;IAAe,OAAO,EAAE7G,OAAxB;IAAiC,UAAU,EAAEC;EAA7C,EAFF,CAlDJ,CADF,CADF,EA2DG,CAAAV,OAAO,SAAP,IAAAA,OAAO,WAAP,YAAAA,OAAO,CAAE2B,IAAT,kBACC,6BAAC,OAAD;IAAK,QAAQ,EAAE,CAAf;IAAkB,UAAU,EAAE;EAA9B,gBACE,6BAAC,QAAD;IAAM,OAAO,EAAE,CAAf;IAAkB,MAAM,EAAE,CAA1B;IAA6B,MAAM,EAAE,CAArC;IAAwC,IAAI,mBAAE3B,OAAF,aAAEA,OAAF,uBAAEA,OAAO,CAAE0B,IAAX,yDAAmB;EAA/D,gBACE,6BAAC,QAAD;IAAM,IAAI,EAAE;EAAZ,GAAgB1B,OAAO,CAAC2B,IAAxB,CADF,CADF,CA5DJ,EAkEGlB,OAAO,CAACnB,MAAR,GAAiB,CAAjB,iBACC,6BAAC,SAAD;IAAO,OAAO,EAAE,CAAhB;IAAmB,KAAK,EAAE;EAA1B,GACGmB,OAAO,CAAClB,GAAR,CAAY,QAAmC0I,KAAnC;IAAA,IAAE9H,GAAF,SAAEA,GAAF;IAAA,IAAOC,OAAP,SAAOA,OAAP;IAAA,IAAgBC,MAAhB,SAAgBA,MAAhB;IAAA,IAAwBC,QAAxB,SAAwBA,QAAxB;IAAA,oBACX,6BAAC,cAAD,CAAO,QAAP;MAAgB,GAAG,EAAEH,GAAG,CAACK;IAAzB,gBACE,6BAAC,QAAD;MAAM,KAAK,EAAC;IAAZ,gBACE,6BAAC,YAAD;MAAU,OAAO,EAAEJ,OAAnB;MAA4B,QAAQ,EAAE,MAAMoC,cAAc,CAACrC,GAAG,CAACK,GAAL;IAA1D,EADF,eAEE,6BAAC,OAAD;MAAK,IAAI,EAAE,CAAX;MAAc,QAAQ,EAAE;IAAxB,gBACE,6BAAC,gBAAD;MAAS,KAAK,EAAEL,GAAhB;MAAqB,IAAI,EAAE+H,gBAAOC,GAAP,CAAWhI,GAAG,CAACkD,KAAf;IAA3B,EADF,CAFF,eAKE,6BAAC,QAAD;MAAM,KAAK,EAAC,QAAZ;MAAqB,GAAG,EAAE;IAA1B,GACG/C,QAAQ,gBAAG,6BAAC,oBAAD;MAAa,MAAM,EAAC,aAApB;MAAkC,OAAO,EAAE;IAA3C,EAAH,GAA0D,IADrE,eAEE,6BAAC,oBAAD;MAAa,MAAM,EAAED,MAArB;MAA6B,OAAO,EAAE,0BAAYF,GAAG,CAACkD,KAAhB;IAAtC,EAFF,CALF,CADF,EAWG,CAAAlD,GAAG,SAAH,IAAAA,GAAG,WAAH,YAAAA,GAAG,CAAE0E,SAAL,MAAmB,KAAnB,IAA4BoD,KAAK,KAAKrB,aAAtC,iBACC,6BAAC,QAAD;MAAM,OAAO,EAAE,CAAf;MAAkB,MAAM,EAAE,CAA1B;MAA6B,MAAM,EAAE,CAArC;MAAwC,IAAI,EAAC;IAA7C,gBACE,6BAAC,QAAD;MAAM,IAAI,EAAE;IAAZ,2GAEe,iDAFf,gDAE0E,GAF1E,eAGE,iDAHF,wFAIc,iDAJd,sHAKyD,iDALzD,MADF,CAZJ,CADW;EAAA,CAAZ,CADH,CAnEJ,eA+FE,6BAAC,SAAD;IAAO,KAAK,EAAE,CAAd;IAAiB,OAAO,EAAE,CAA1B;IAA6B,UAAU,EAAE;EAAzC,GACGjG,aAAa,iBACZ,6BAAC,UAAD;IACE,QAAQ,EAAE,CADZ;IAEE,OAAO,EAAE,CAFX;IAGE,IAAI,EAAC,UAHP;IAIE,IAAI,EAAC,OAJP;IAKE,IAAI,EAAEyH,iBALR;IAME,OAAO,EAAE3F,gBANX;IAOE,IAAI,EAAC,mBAPP;IAQE,QAAQ,EAAE5B,aAAa,IAAI,CAACmG,aAAlB,IAAmCjG;EAR/C,EAFJ,eAaE,6BAAC,UAAD;IACE,QAAQ,EAAE,CADZ;IAEE,OAAO,EAAE,CAFX;IAGE,IAAI,EAAC,UAHP;IAIE,IAAI,EAAEsH,iBAJR;IAKE,OAAO,EAAEnF,eALX;IAME,IAAI,EAAEqE,UANR;IAOE,QAAQ,EAAE1G,aAAa,IAAI,CAACmG,aAAlB,IAAmCjG;EAP/C,EAbF,CA/FF,CADF,CADF,CADF,CADF;AA+HD"}
|
|
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","useState","find","destination","setDestination","message","setMessage","item","doc","include","status","hasDraft","includes","_id","payload","setPayload","hasReferences","setHasReferences","isDuplicating","setIsDuplicating","isGathering","setIsGathering","progress","setProgress","useEffect","expr","initialRefs","initialPayload","forEach","push","extract","docCount","refsCount","tone","text","createInitialMessage","updatePayloadStatuses","newPayload","payloadActual","name","payloadIds","destinationClient","destinationData","fetch","updatedPayload","existingDoc","_updatedAt","Date","handleCheckbox","handleReferences","docIds","payloadDocs","getDocumentsInArray","draftDocs","id","draftDocsIds","Set","payloadShaped","has","handleDuplicate","assetsCount","filter","typeIsAsset","_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","mapLimit","asyncify","err","console","error","Error","transactionDocsMapped","references","extractWithPath","ref","newRefValue","asset","value","refPath","path","join","dset","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} 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?.length ? draftIds.includes(`drafts.${item._id}`) : false,\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 const 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":";;;;;;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAYA;;AACA;;AACA;;AACA;;AACA;;AAEA;;AACA;;AACA;;AACA;;AACA;;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQe,SAASA,cAAT,CAAwBC,KAAxB,EAAoD;EAAA;;EACjE,IAAOC,IAAP,GAAgCD,KAAhC,CAAOC,IAAP;EAAA,IAAaC,QAAb,GAAgCF,KAAhC,CAAaE,QAAb;EAAA,IAAuBC,KAAvB,GAAgCH,KAAhC,CAAuBG,KAAvB,CADiE,CAGjE;EACA;;EACA,IAAMC,YAAY,GAAGC,eAAA,CAAaC,UAAb,CAAwBC,0BAAxB,CAArB,CALiE,CAOjE;EACA;;;EACA,IAAMC,aAAa,GAAGC,qBAAA,aAAAA,qBAAA,wCAAAA,qBAAA,CAAQC,qBAAR,wEAA+BC,MAA/B,GAClBF,qBAAA,CAAOC,qBAAP,CAA6BE,GAA7B,CAAkCC,KAAD,oCAC5BA,KAD4B;IAE/BC,QAAQ,EACND,KAAK,CAACE,GAAN,CAAUC,OAAV,KAAsBZ,YAAY,CAACK,MAAb,GAAsBO,OAA5C,IACAH,KAAK,CAACE,GAAN,CAAUE,SAAV,KAAwBb,YAAY,CAACK,MAAb,GAAsBQ;EAJjB,EAAjC,CADkB,GAOlB,EAPJ;;EASA,gBAAsC,IAAAC,eAAA,EACpCV,aAAa,CAACG,MAAd,GAAuBH,aAAa,CAACW,IAAd,CAAoBN,KAAD,IAAW,CAACA,KAAK,CAACC,QAArC,CAAvB,GAAwE,EADpC,CAAtC;EAAA;EAAA,IAAOM,WAAP;EAAA,IAAoBC,cAApB;;EAGA,iBAA8B,IAAAH,eAAA,EAAS,EAAT,CAA9B;EAAA;EAAA,IAAOI,OAAP;EAAA,IAAgBC,UAAhB;;EACA,iBAA8B,IAAAL,eAAA,EAC5BjB,IAAI,CAACU,MAAL,GACIV,IAAI,CAACW,GAAL,CAAUY,IAAD,KAAW;IAClBC,GAAG,EAAED,IADa;IAElBE,OAAO,EAAE,IAFS;IAGlBC,MAAM,EAAE,IAHU;IAIlBC,QAAQ,EAAE1B,QAAQ,SAAR,IAAAA,QAAQ,WAAR,IAAAA,QAAQ,CAAES,MAAV,GAAmBT,QAAQ,CAAC2B,QAAT,kBAA4BL,IAAI,CAACM,GAAjC,EAAnB,GAA6D;EAJrD,CAAX,CAAT,CADJ,GAOI,EARwB,CAA9B;EAAA;EAAA,IAAOC,OAAP;EAAA,IAAgBC,UAAhB;;EAUA,iBAA0C,IAAAd,eAAA,EAAS,KAAT,CAA1C;EAAA;EAAA,IAAOe,aAAP;EAAA,IAAsBC,gBAAtB;;EACA,iBAA0C,IAAAhB,eAAA,EAAS,KAAT,CAA1C;EAAA;EAAA,IAAOiB,aAAP;EAAA,IAAsBC,gBAAtB;;EACA,kBAAsC,IAAAlB,eAAA,EAAS,KAAT,CAAtC;EAAA;EAAA,IAAOmB,WAAP;EAAA,IAAoBC,cAApB;;EACA,kBAAgC,IAAApB,eAAA,EAAS,CAAC,CAAD,EAAI,CAAJ,CAAT,CAAhC;EAAA;EAAA,IAAOqB,QAAP;EAAA,IAAiBC,WAAjB,kBAnCiE,CAqCjE;;;EACA,IAAAC,gBAAA,EAAU,MAAM;IACd,IAAMC,IAAI,WAAV;IACA,IAAMC,WAAW,GAAG,EAApB;IACA,IAAMC,cAAc,GAAG,EAAvB;IAEA3C,IAAI,CAAC4C,OAAL,CAAcpB,GAAD,IAAS;MACpBkB,WAAW,CAACG,IAAZ,CAAiB,GAAG,IAAAC,gBAAA,EAAQL,IAAR,EAAcjB,GAAd,CAApB;MACAmB,cAAc,CAACE,IAAf,CAAoB;QAACpB,OAAO,EAAE,IAAV;QAAgBD;MAAhB,CAApB;IACD,CAHD;IAKAO,UAAU,CAACY,cAAD,CAAV;IAEA,IAAMI,QAAQ,GAAG/C,IAAI,CAACU,MAAtB;IACA,IAAMsC,SAAS,GAAGN,WAAW,CAAChC,MAA9B;;IAEA,IAAIgC,WAAW,CAAChC,MAAhB,EAAwB;MACtBuB,gBAAgB,CAAC,IAAD,CAAhB;MAEAX,UAAU,CAAC;QACT2B,IAAI,WADK;QAETC,IAAI,EAAE,IAAAC,6BAAA,EAAqBJ,QAArB,EAA+BC,SAA/B;MAFG,CAAD,CAAV;IAID;EACF,CAvBD,EAuBG,CAAChD,IAAD,CAvBH,EAtCiE,CA+DjE;EACA;;EACA,IAAAwC,gBAAA,EAAU,MAAM;IACdY,qBAAqB;EACtB,CAFD,EAEG,CAACjC,WAAD,EAAcnB,IAAd,CAFH,EAjEiE,CAqEjE;;EArEiE,SAsElDoD,qBAtEkD;IAAA;EAAA;;EAAA;IAAA,2CAsEjE,aAAsD;MAAA,IAAjBC,UAAiB,uEAAJ,EAAI;MACpD,IAAMC,aAAa,GAAGD,UAAU,CAAC3C,MAAX,GAAoB2C,UAApB,GAAiCvB,OAAvD;;MAEA,IAAI,CAACwB,aAAa,CAAC5C,MAAf,IAAyB,EAACS,WAAD,aAACA,WAAD,eAACA,WAAW,CAAEoC,IAAd,CAA7B,EAAiD;QAC/C;MACD;;MAED,IAAMC,UAAU,GAAGF,aAAa,CAAC3C,GAAd,CAAkB;QAAA,IAAEa,GAAF,SAAEA,GAAF;QAAA,OAAWA,GAAG,CAACK,GAAf;MAAA,CAAlB,CAAnB;;MACA,IAAM4B,iBAAiB,GAAGrD,eAAA,CAAaC,UAAb,iCACrBC,0BADqB;QAExBS,OAAO,EAAEI,WAAW,CAACL,GAAZ,CAAgBC,OAFD;QAGxBC,SAAS,EAAEG,WAAW,CAACL,GAAZ,CAAgBE;MAHH,GAA1B;;MAKA,IAAM0C,eAAe,SAASD,iBAAiB,CAACE,KAAlB,6CAE5B;QAACH;MAAD,CAF4B,CAA9B;MAKA,IAAMI,cAAc,GAAGN,aAAa,CAAC3C,GAAd,CAAmBY,IAAD,IAAU;QAAA;;QACjD,IAAMsC,WAAW,GAAGH,eAAe,CAACxC,IAAhB,CAAsBM,GAAD,IAASA,GAAG,CAACK,GAAJ,KAAYN,IAAI,CAACC,GAAL,CAASK,GAAnD,CAApB;;QAEA,IAAIgC,WAAW,SAAX,IAAAA,WAAW,WAAX,IAAAA,WAAW,CAAEC,UAAb,IAA2BvC,IAA3B,aAA2BA,IAA3B,4BAA2BA,IAAI,CAAEC,GAAjC,sCAA2B,UAAWsC,UAA1C,EAAsD;UACpD,IAAID,WAAW,CAACC,UAAZ,KAA2BvC,IAAI,CAACC,GAAL,CAASsC,UAAxC,EAAoD;YAClD;YACA;YACAvC,IAAI,CAACG,MAAL;UACD,CAJD,MAIO,IAAImC,WAAW,CAACC,UAAZ,IAA0BvC,IAAI,CAACC,GAAL,CAASsC,UAAvC,EAAmD;YACxDvC,IAAI,CAACG,MAAL,GACE,IAAIqC,IAAJ,CAASF,WAAW,CAACC,UAArB,IAAmC,IAAIC,IAAJ,CAASxC,IAAI,CAACC,GAAL,CAASsC,UAAlB,CAAnC,GACI;YADJ,cAGI;YAHJ,QADF;UAMD;QACF,CAbD,MAaO;UACLvC,IAAI,CAACG,MAAL,GAAc,QAAd;QACD;;QAED,OAAOH,IAAP;MACD,CArBsB,CAAvB;MAuBAQ,UAAU,CAAC6B,cAAD,CAAV;IACD,CAhHgE;IAAA;EAAA;;EAkHjE,SAASI,cAAT,CAAwBnC,GAAxB,EAA6B;IAC3B,IAAM+B,cAAc,GAAG9B,OAAO,CAACnB,GAAR,CAAaY,IAAD,IAAU;MAC3C,IAAIA,IAAI,CAACC,GAAL,CAASK,GAAT,KAAiBA,GAArB,EAA0B;QACxBN,IAAI,CAACE,OAAL,GAAe,CAACF,IAAI,CAACE,OAArB;MACD;;MAED,OAAOF,IAAP;IACD,CANsB,CAAvB;IAQAQ,UAAU,CAAC6B,cAAD,CAAV;EACD,CA5HgE,CA8HjE;;;EA9HiE,SA+HlDK,gBA/HkD;IAAA;EAAA,EA4JjE;;;EA5JiE;IAAA,sCA+HjE,aAAkC;MAChC5B,cAAc,CAAC,IAAD,CAAd;MACA,IAAM6B,MAAM,GAAGlE,IAAI,CAACW,GAAL,CAAUa,GAAD,IAASA,GAAG,CAACK,GAAtB,CAAf;MAEA,IAAMsC,WAAW,SAAS,IAAAC,wCAAA,EAAoBF,MAApB,EAA4B/D,YAA5B,EAA0C,IAA1C,CAA1B;MACA,IAAMkE,SAAS,SAAS,IAAAD,wCAAA,EACtBF,MAAM,CAACvD,GAAP,CAAY2D,EAAD,qBAAkBA,EAAlB,CAAX,CADsB,EAEtBnE,YAFsB,EAGtB,IAHsB,UAAxB;MAMA,IAAMoE,YAAY,GAAG,IAAIC,GAAJ,CAAQH,SAAS,CAAC1D,GAAV,CAAc;QAAA,IAAEkB,GAAF,SAAEA,GAAF;QAAA,OAAWA,GAAX;MAAA,CAAd,CAAR,CAArB,CAXgC,CAahC;;MACA,IAAM4C,aAAa,GAAGN,WAAW,CAACxD,GAAZ,CAAiBa,GAAD,KAAU;QAC9CA,GAD8C;QAE9C;QACAC,OAAO,EAAE,IAHqC;QAI9C;QACAC,MAAM,EAAE,EALsC;QAM9C;QACAC,QAAQ,EAAE4C,YAAY,CAACG,GAAb,kBAA2BlD,GAAG,CAACK,GAA/B;MAPoC,CAAV,CAAhB,CAAtB;MAUAE,UAAU,CAAC0C,aAAD,CAAV;MACArB,qBAAqB,CAACqB,aAAD,CAArB;MACApC,cAAc,CAAC,KAAD,CAAd;IACD,CA1JgE;IAAA;EAAA;;EAAA,SA6JlDsC,eA7JkD;IAAA;EAAA;;EAAA;IAAA,qCA6JjE,aAAiC;MAC/BxC,gBAAgB,CAAC,IAAD,CAAhB;MAEA,IAAMyC,WAAW,GAAG9C,OAAO,CAAC+C,MAAR,CAAe;QAAA,IAAErD,GAAF,SAAEA,GAAF;QAAA,IAAOC,OAAP,SAAOA,OAAP;QAAA,OAAoBA,OAAO,IAAI,IAAAqD,oBAAA,EAAYtD,GAAG,CAACuD,KAAhB,CAA/B;MAAA,CAAf,EAAsErE,MAA1F;MACA,IAAIsE,eAAe,GAAG,CAAtB;MACAzC,WAAW,CAAC,CAACyC,eAAD,EAAkBJ,WAAlB,CAAD,CAAX;MAEAtD,UAAU,CAAC;QAAC4B,IAAI,EAAE;MAAP,CAAD,CAAV;;MAEA,IAAMO,iBAAiB,GAAGrD,eAAA,CAAaC,UAAb,iCACrBC,0BADqB;QAExBS,OAAO,EAAEI,WAAW,CAACL,GAAZ,CAAgBC,OAFD;QAGxBC,SAAS,EAAEG,WAAW,CAACL,GAAZ,CAAgBE;MAHH,GAA1B;;MAMA,IAAMiE,eAAe,GAAG,EAAxB;MACA,IAAMC,OAAO,GAAG,EAAhB,CAhB+B,CAkB/B;;MAlB+B,SAmBhBC,QAnBgB;QAAA;MAAA,EAuD/B;;;MAvD+B;QAAA,8BAmB/B,WAAwB3D,GAAxB,EAA6B;UAC3B,IAAI,IAAAsD,oBAAA,EAAYtD,GAAG,CAACuD,KAAhB,CAAJ,EAA4B;YAC1B;YACA;YACA,IAAMK,UAAU,GAAG5D,GAAG,CAACuD,KAAJ,CAAUM,KAAV,CAAgB,GAAhB,EAAqBC,GAArB,GAA2BC,OAA3B,CAAmC,OAAnC,EAA4C,EAA5C,CAAnB;;YACA,IAAMC,WAAW,GAAGJ,UAAU,KAAK,OAAf,aAA4B5D,GAAG,CAACiE,GAAhC,mBAAmDjE,GAAG,CAACiE,GAA3E;YACA,IAAMC,cAAc,GAClBN,UAAU,KAAK,OAAf,GAAyB;cAACO,OAAO,EAAE;gBAACC,aAAa,mBAAY1F,KAAZ;cAAd;YAAV,CAAzB,GAAyE,EAD3E;YAGA,MAAMyD,KAAK,CAAC6B,WAAD,EAAcE,cAAd,CAAL,CAAmCG,IAAnC;cAAA,8BAAwC,WAAOC,GAAP,EAAe;gBAC3D,IAAMC,SAAS,SAASD,GAAG,CAACE,IAAJ,EAAxB;gBAEA,IAAMC,OAAO,GAAG;kBAACC,QAAQ,EAAE1E,GAAG,CAAC2E;gBAAf,CAAhB;gBACA,IAAMC,QAAQ,SAAS3C,iBAAiB,CAAC4C,MAAlB,CAAyBC,MAAzB,CAAgClB,UAAhC,EAA4CW,SAA5C,EAAuDE,OAAvD,CAAvB,CAJ2D,CAM3D;;gBACA,IAAI,CAAAzE,GAAG,SAAH,IAAAA,GAAG,WAAH,YAAAA,GAAG,CAAE+E,SAAL,MAAmB,KAAvB,EAA8B;kBAC5BrB,OAAO,CAACrC,IAAR,CAAa;oBAAC2D,GAAG,EAAEhF,GAAG,CAACK,GAAV;oBAAe4E,GAAG,EAAEL,QAAQ,CAACvE;kBAA7B,CAAb;gBACD;;gBAEDoD,eAAe,CAACpC,IAAhB,CAAqBuD,QAArB;cACD,CAZK;;cAAA;gBAAA;cAAA;YAAA,IAAN;YAcApB,eAAe,IAAI,CAAnB;YACA1D,UAAU,CAAC;cACT4B,IAAI,wBAAiB8B,eAAjB,cAAoCJ,WAApC,cACFA,WAAW,KAAK,CAAhB,sBADE;YADK,CAAD,CAAV;YAMA,OAAOrC,WAAW,CAAC,CAACyC,eAAD,EAAkBJ,WAAlB,CAAD,CAAlB;UACD;;UAED,OAAOK,eAAe,CAACpC,IAAhB,CAAqBrB,GAArB,CAAP;QACD,CArD8B;QAAA;MAAA;;MAwD/B,IAAMkF,MAAM,GAAG,IAAIC,OAAJ,CAAY,CAACC,OAAD,EAAUC,MAAV,KAAqB;QAC9C,IAAMC,mBAAmB,GAAGhF,OAAO,CAAC+C,MAAR,CAAgBtD,IAAD,IAAUA,IAAI,CAACE,OAA9B,EAAuCd,GAAvC,CAA4CY,IAAD,IAAUA,IAAI,CAACC,GAA1D,CAA5B;QAEA,IAAAuF,iBAAA,EAASD,mBAAT,EAA8B,CAA9B,EAAiC,IAAAE,iBAAA,EAAS7B,QAAT,CAAjC,EAAsD8B,GAAD,IAAS;UAC5D,IAAIA,GAAJ,EAAS;YACP9E,gBAAgB,CAAC,KAAD,CAAhB;YACAb,UAAU,CAAC;cAAC2B,IAAI,EAAE,UAAP;cAAmBC,IAAI;YAAvB,CAAD,CAAV;YACAgE,OAAO,CAACC,KAAR,CAAcF,GAAd;YACAJ,MAAM,CAAC,IAAIO,KAAJ,CAAU,oBAAV,CAAD,CAAN;UACD;;UAEDR,OAAO;QACR,CATD;MAUD,CAbc,CAAf;MAeA,MAAMF,MAAN,CAvE+B,CAyE/B;;MACA,IAAMW,qBAAqB,GAAGpC,eAAe,CAACtE,GAAhB,CAAqBa,GAAD,IAAS;QACzD,IAAMiB,IAAI,WAAV;QACA,IAAM6E,UAAU,GAAG,IAAAC,wBAAA,EAAgB9E,IAAhB,EAAsBjB,GAAtB,CAAnB;;QAEA,IAAI,CAAC8F,UAAU,CAAC5G,MAAhB,EAAwB;UACtB,OAAOc,GAAP;QACD,CANwD,CAQzD;;;QACA8F,UAAU,CAAC1E,OAAX,CAAoB4E,GAAD,IAAS;UAAA;;UAC1B,IAAMC,WAAW,oBAAGvC,OAAO,CAAChE,IAAR,CAAcwG,KAAD,IAAWA,KAAK,CAAClB,GAAN,KAAcgB,GAAG,CAACG,KAA1C,CAAH,kDAAG,cAAkDlB,GAAtE;;UAEA,IAAIgB,WAAJ,EAAiB;YACf,IAAMG,OAAO,GAAGJ,GAAG,CAACK,IAAJ,CAASC,IAAT,CAAc,GAAd,CAAhB;YAEA,IAAAC,UAAA,EAAKvG,GAAL,EAAUoG,OAAV,EAAmBH,WAAnB;UACD;QACF,CARD;QAUA,OAAOjG,GAAP;MACD,CApB6B,CAA9B,CA1E+B,CAgG/B;;MACA,IAAMwG,WAAW,GAAGvE,iBAAiB,CAACuE,WAAlB,EAApB;MAEAX,qBAAqB,CAACzE,OAAtB,CAA+BpB,GAAD,IAAS;QACrCwG,WAAW,CAACC,eAAZ,CAA4BzG,GAA5B;MACD,CAFD;MAIA,MAAMwG,WAAW,CACdE,MADG,GAEHrC,IAFG,CAEGC,GAAD,IAAS;QACbxE,UAAU,CAAC;UAAC2B,IAAI,EAAE,UAAP;UAAmBC,IAAI,EAAE;QAAzB,CAAD,CAAV;QAEAE,qBAAqB;MACtB,CANG,EAOH+E,KAPG,CAOIlB,GAAD,IAAS;QACd3F,UAAU,CAAC;UAAC2B,IAAI,EAAE,UAAP;UAAmBC,IAAI,EAAE+D,GAAG,CAACmB,OAAJ,CAAYC;QAArC,CAAD,CAAV;MACD,CATG,CAAN;MAWAlG,gBAAgB,CAAC,KAAD,CAAhB;MACAI,WAAW,CAAC,CAAD,CAAX;IACD,CAjRgE;IAAA;EAAA;;EAmRjE,SAAS+F,YAAT,CAAsBC,CAAtB,EAAyB;IACvBnH,cAAc,CAACb,aAAa,CAACW,IAAd,CAAoBN,KAAD,IAAWA,KAAK,CAAC2C,IAAN,KAAegF,CAAC,CAACC,aAAF,CAAgBb,KAA7D,CAAD,CAAd;EACD;;EAED,IAAI,CAACpH,aAAa,CAACG,MAAnB,EAA2B;IACzB,oBACE,6BAAC,iBAAD;MAAU,IAAI,EAAC;IAAf,gBACE,mEADF,iCACkD,yDADlD,CADF;EAKD;;EAED,IAAM+H,YAAY,GAAG3G,OAAO,CAACpB,MAA7B;EACA,IAAMgI,aAAa,GAAG5G,OAAO,CAAC6G,SAAR,CAAkB;IAAA,IAAEnH,GAAF,QAAEA,GAAF;IAAA,OAAWA,GAAG,CAAC+E,SAAJ,KAAkB,KAA7B;EAAA,CAAlB,CAAtB;EACA,IAAMqC,sBAAsB,GAAG9G,OAAO,CAAC+C,MAAR,CAC5BtD,IAAD,IAAUA,IAAI,CAACE,OAAL,IAAgB,CAAC,IAAAqD,oBAAA,EAAYvD,IAAI,CAACC,GAAL,CAASuD,KAArB,CADE,EAE7BrE,MAFF;EAGA,IAAMmI,mBAAmB,GAAG/G,OAAO,CAAC+C,MAAR,CACzBtD,IAAD,IAAUA,IAAI,CAACE,OAAL,IAAgB,IAAAqD,oBAAA,EAAYvD,IAAI,CAACC,GAAL,CAASuD,KAArB,CADA,EAE1BrE,MAFF;EAGA,IAAMoI,aAAa,GAAGF,sBAAsB,GAAGC,mBAA/C;EACA,IAAME,gBAAgB,yBAAG5H,WAAH,aAAGA,WAAH,uBAAGA,WAAW,CAAE6H,KAAhB,mEAAyB7H,WAAzB,aAAyBA,WAAzB,uBAAyBA,WAAW,CAAEoC,IAA5D;EACA,IAAM0F,qBAAqB,GACzB,IAAIzE,GAAJ,CAAQjE,aAAa,CAACI,GAAd,CAAmBC,KAAD;IAAA;;IAAA,OAAWA,KAAX,aAAWA,KAAX,qCAAWA,KAAK,CAAEE,GAAlB,+CAAW,WAAYE,SAAvB;EAAA,CAAlB,EAAoD6D,MAApD,CAA2DqE,OAA3D,CAAR,EAA6EC,IAA7E,GAAoF,CADtF;EAGA,IAAMC,WAAW,GAAG,CAACN,aAAD,OAAqBL,YAArB,mCAAoEX,IAApE,KAApB;;EAEA,IAAMuB,UAAU,GAAGC,cAAA,CAAMC,OAAN,CAAc,MAAM;IACrC,IAAMrG,IAAI,GAAG,aAAb;;IAEA,IAAI0F,sBAAsB,GAAG,CAA7B,EAAgC;MAC9B1F,IAAI,CAACL,IAAL,CAAU+F,sBAAV,EAAkCA,sBAAsB,KAAK,CAA3B,2BAAlC;IACD;;IAED,IAAIC,mBAAmB,GAAG,CAA1B,EAA6B;MAC3B3F,IAAI,CAACL,IAAL,QAAiBgG,mBAAjB,EAAsCA,mBAAmB,KAAK,CAAxB,qBAAtC;IACD;;IAED,IAAI1I,YAAY,CAACK,MAAb,GAAsBQ,SAAtB,KAAoCG,WAAW,CAACL,GAAZ,CAAgBE,SAAxD,EAAmE;MACjEkC,IAAI,CAACL,IAAL;IACD;;IAEDK,IAAI,CAACL,IAAL,OAAgBkG,gBAAhB;IAEA,OAAO7F,IAAI,CAAC4E,IAAL,KAAP;EACD,CAlBkB,EAkBhB,CAACc,sBAAD,EAAyBC,mBAAzB,EAA8CE,gBAA9C,CAlBgB,CAAnB;;EAoBA,oBACE,6BAAC,aAAD;IAAW,KAAK,EAAE;EAAlB,gBACE,6BAAC,QAAD,qBACE,6BAAC,SAAD,qBACE,yEACE,6BAAC,QAAD;IAAM,YAAY,MAAlB;IAAmB,OAAO,EAAE,CAA5B;IAA+B,KAAK,EAAES;EAAtC,gBACE,6BAAC,SAAD;IAAO,KAAK,EAAE;EAAd,gBACE,6BAAC,QAAD;IAAM,KAAK,EAAE;EAAb,gBACE,6BAAC,SAAD;IAAO,KAAK,EAAE;MAACC,IAAI,EAAE;IAAP,CAAd;IAAyB,KAAK,EAAE;EAAhC,gBACE,6BAAC,SAAD,yBADF,eAEE,6BAAC,UAAD;IAAQ,QAAQ,MAAhB;IAAiB,KAAK,yBAAElJ,aAAa,CAACW,IAAd,CAAoBN,KAAD,IAAWA,KAAK,CAACC,QAApC,CAAF,wDAAE,oBAA+C0C;EAAvE,GACGhD,aAAa,CACXsE,MADF,CACUjE,KAAD,IAAWA,KAAK,CAACC,QAD1B,EAEEF,GAFF,CAEOC,KAAD;IAAA;;IAAA,oBACH;MAAQ,GAAG,EAAEA,KAAK,CAAC2C,IAAnB;MAAyB,KAAK,EAAE3C,KAAK,CAAC2C,IAAtC;MAA4C,QAAQ,EAAE3C,KAAK,CAACC;IAA5D,mBACGD,KAAK,CAACoI,KADT,uDACkBpI,KAAK,CAAC2C,IADxB,EAEG0F,qBAAqB,eAAQrI,KAAK,CAACE,GAAN,CAAUE,SAAlB,WAFxB,CADG;EAAA,CAFN,CADH,CAFF,CADF,eAcE,6BAAC,OAAD;IAAK,OAAO,EAAE,CAAd;IAAiB,UAAU,EAAE,CAA7B;IAAgC,aAAa,EAAE;EAA/C,gBACE,6BAAC,QAAD;IAAM,IAAI,EAAE;EAAZ,gBACE,6BAAC,qBAAD,OADF,CADF,CAdF,eAmBE,6BAAC,SAAD;IAAO,KAAK,EAAE;MAACyI,IAAI,EAAE;IAAP,CAAd;IAAyB,KAAK,EAAE;EAAhC,gBACE,6BAAC,SAAD,yBADF,eAEE,6BAAC,UAAD;IAAQ,QAAQ,EAAEnB;EAAlB,GACG/H,aAAa,CAACI,GAAd,CAAmBC,KAAD;IAAA;;IAAA,oBACjB;MAAQ,GAAG,EAAEA,KAAK,CAAC2C,IAAnB;MAAyB,KAAK,EAAE3C,KAAK,CAAC2C,IAAtC;MAA4C,QAAQ,EAAE3C,KAAK,CAACC;IAA5D,oBACGD,KAAK,CAACoI,KADT,yDACkBpI,KAAK,CAAC2C,IADxB,EAEG0F,qBAAqB,eAAQrI,KAAK,CAACE,GAAN,CAAUE,SAAlB,WAFxB,EAGGJ,KAAK,CAACC,QAAN,oBAHH,CADiB;EAAA,CAAlB,CADH,CAFF,CAnBF,CADF,EAkCGqB,aAAa,iBACZ,6BAAC,QAAD;IAAM,MAAM,MAAZ;IAAa,MAAM,EAAE;EAArB,gBACE,6BAAC,QAAD;IACE,KAAK,EAAE;MACLwH,KAAK,EAAE,MADF;MAELC,SAAS,mBAAYrH,QAAQ,CAAC,CAAD,CAAR,GAAcA,QAAQ,CAAC,CAAD,CAAlC,MAFJ;MAGLsH,eAAe,EAAE,MAHZ;MAILC,UAAU,EAAE,oBAJP;MAKLC,SAAS,EAAE;IALN,CADT;IAQE,OAAO,EAAE,CARX;IASE,IAAI,EAAC;EATP,EADF,CAnCJ,EAiDGhI,OAAO,CAACpB,MAAR,GAAiB,CAAjB,iBACC,yEACE,6BAAC,SAAD,QAAQ0I,WAAR,CADF,eAEE,6BAAC,sBAAD;IAAe,OAAO,EAAEtH,OAAxB;IAAiC,UAAU,EAAEC;EAA7C,EAFF,CAlDJ,CADF,CADF,EA2DG,CAAAV,OAAO,SAAP,IAAAA,OAAO,WAAP,YAAAA,OAAO,CAAE6B,IAAT,kBACC,6BAAC,OAAD;IAAK,QAAQ,EAAE,CAAf;IAAkB,UAAU,EAAE;EAA9B,gBACE,6BAAC,QAAD;IAAM,OAAO,EAAE,CAAf;IAAkB,MAAM,EAAE,CAA1B;IAA6B,MAAM,EAAE,CAArC;IAAwC,IAAI,mBAAE7B,OAAF,aAAEA,OAAF,uBAAEA,OAAO,CAAE4B,IAAX,yDAAmB;EAA/D,gBACE,6BAAC,QAAD;IAAM,IAAI,EAAE;EAAZ,GAAgB5B,OAAO,CAAC6B,IAAxB,CADF,CADF,CA5DJ,EAkEGpB,OAAO,CAACpB,MAAR,GAAiB,CAAjB,iBACC,6BAAC,SAAD;IAAO,OAAO,EAAE,CAAhB;IAAmB,KAAK,EAAE;EAA1B,GACGoB,OAAO,CAACnB,GAAR,CAAY,QAAmCoJ,KAAnC;IAAA,IAAEvI,GAAF,SAAEA,GAAF;IAAA,IAAOC,OAAP,SAAOA,OAAP;IAAA,IAAgBC,MAAhB,SAAgBA,MAAhB;IAAA,IAAwBC,QAAxB,SAAwBA,QAAxB;IAAA,oBACX,6BAAC,cAAD,CAAO,QAAP;MAAgB,GAAG,EAAEH,GAAG,CAACK;IAAzB,gBACE,6BAAC,QAAD;MAAM,KAAK,EAAC;IAAZ,gBACE,6BAAC,YAAD;MAAU,OAAO,EAAEJ,OAAnB;MAA4B,QAAQ,EAAE,MAAMuC,cAAc,CAACxC,GAAG,CAACK,GAAL;IAA1D,EADF,eAEE,6BAAC,OAAD;MAAK,IAAI,EAAE,CAAX;MAAc,QAAQ,EAAE;IAAxB,gBACE,6BAAC,gBAAD;MAAS,KAAK,EAAEL,GAAhB;MAAqB,IAAI,EAAEwI,eAAA,CAAOC,GAAP,CAAWzI,GAAG,CAACuD,KAAf;IAA3B,EADF,CAFF,eAKE,6BAAC,QAAD;MAAM,KAAK,EAAC,QAAZ;MAAqB,GAAG,EAAE;IAA1B,GACGpD,QAAQ,gBAAG,6BAAC,oBAAD;MAAa,MAAM,EAAC,aAApB;MAAkC,OAAO,EAAE;IAA3C,EAAH,GAA0D,IADrE,eAEE,6BAAC,oBAAD;MAAa,MAAM,EAAED,MAArB;MAA6B,OAAO,EAAE,IAAAoD,oBAAA,EAAYtD,GAAG,CAACuD,KAAhB;IAAtC,EAFF,CALF,CADF,EAWG,CAAAvD,GAAG,SAAH,IAAAA,GAAG,WAAH,YAAAA,GAAG,CAAE+E,SAAL,MAAmB,KAAnB,IAA4BwD,KAAK,KAAKrB,aAAtC,iBACC,6BAAC,QAAD;MAAM,OAAO,EAAE,CAAf;MAAkB,MAAM,EAAE,CAA1B;MAA6B,MAAM,EAAE,CAArC;MAAwC,IAAI,EAAC;IAA7C,gBACE,6BAAC,QAAD;MAAM,IAAI,EAAE;IAAZ,2GAEe,iDAFf,gDAE0E,GAF1E,eAGE,iDAHF,wFAIc,iDAJd,sHAKyD,iDALzD,MADF,CAZJ,CADW;EAAA,CAAZ,CADH,CAnEJ,eA+FE,6BAAC,SAAD;IAAO,KAAK,EAAE,CAAd;IAAiB,OAAO,EAAE,CAA1B;IAA6B,UAAU,EAAE;EAAzC,GACG1G,aAAa,iBACZ,6BAAC,UAAD;IACE,QAAQ,EAAE,CADZ;IAEE,OAAO,EAAE,CAFX;IAGE,IAAI,EAAC,UAHP;IAIE,IAAI,EAAC,OAJP;IAKE,IAAI,EAAEkI,iBALR;IAME,OAAO,EAAEjG,gBANX;IAOE,IAAI,EAAC,mBAPP;IAQE,QAAQ,EAAE/B,aAAa,IAAI,CAAC4G,aAAlB,IAAmC1G;EAR/C,EAFJ,eAaE,6BAAC,UAAD;IACE,QAAQ,EAAE,CADZ;IAEE,OAAO,EAAE,CAFX;IAGE,IAAI,EAAC,UAHP;IAIE,IAAI,EAAE+H,iBAJR;IAKE,OAAO,EAAExF,eALX;IAME,IAAI,EAAE0E,UANR;IAOE,QAAQ,EAAEnH,aAAa,IAAI,CAAC4G,aAAlB,IAAmC1G;EAP/C,EAbF,CA/FF,CADF,CADF,CADF,CADF;AA+HD"}
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,eAAA,CAAaC,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,"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":";;;;;;;AAAA;;AACA;;AACA;;;;;;;;;;;;;;;;;;AAGA,IAAMA,OAAO,GAAG,gBAAgB,IAAhB,8BAAkD,IAAlD,wBAAhB;;AAOe,SAASC,aAAT,CAAuBC,KAAvB,EAAkD;EAC/D,IAAOC,OAAP,GAA8BD,KAA9B,CAAOC,OAAP;EAAA,IAAgBC,UAAhB,GAA8BF,KAA9B,CAAgBE,UAAhB;;EACA,gBAA8C,
|
|
1
|
+
{"version":3,"file":"SelectButtons.js","names":["buttons","SelectButtons","props","payload","setPayload","useState","disabledActions","setDisabledActions","useEffect","length","every","item","include","handleSelectButton","action","newPayload","map","Boolean","status","typeIsAsset","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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"}
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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","extract","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,IAAAC,gBAAA,EAAQF,IAAR,EAAcD,GAAd,CAAnB;;UAEA,IAAIE,UAAU,CAAClB,MAAf,EAAuB;YACrB;YACA,IAAMoB,eAAe,GAAG,IAAIlB,GAAJ,CAAQgB,UAAU,CAACX,MAAX,CAAmBc,KAAD,IAAW,CAACpB,eAAe,CAACS,GAAhB,CAAoBW,KAApB,CAA9B,CAAR,CAAxB;;YAEA,IAAID,eAAe,CAACX,IAApB,EAA0B;cACxB;cACA,IAAMa,aAAa,SAAS/B,mBAAmB,CAC7CgC,KAAK,CAACC,IAAN,CAAWJ,eAAX,CAD6C,EAE7C3B,MAF6C,EAG7CQ,eAH6C,CAA/C;;cAMA,IAAIqB,aAAJ,aAAIA,aAAJ,eAAIA,aAAa,CAAEtB,MAAnB,EAA2B;gBACzBJ,UAAU,CAACgB,IAAX,CAAgB,GAAGU,aAAnB;cACD;YACF;UACF;QACF,CArBD;;QAAA;UAAA;QAAA;MAAA,IADI,CAAN;IAwBD,CApDD,CAsDA;IACA;;;IACA,IAAMG,gBAAgB,GAAG7B,UAAU,CAACW,MAAX,CAAkBI,OAAlB,EAA2Be,MAA3B,CAAkC,CAACC,GAAD,EAAMC,GAAN,KAAc;MACvE,IAAID,GAAG,CAACE,IAAJ,CAAUb,GAAD,IAASA,GAAG,CAACV,GAAJ,KAAYsB,GAAG,CAACtB,GAAlC,CAAJ,EAA4C;QAC1C,OAAOqB,GAAP;MACD;;MAED,OAAO,CAAC,GAAGA,GAAJ,EAASC,GAAT,CAAP;IACD,CANwB,EAMtB,EANsB,CAAzB;IAQA,OAAOH,gBAAP;EACD,C"}
|
package/lib/tool/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,+BAAA,aAAAA,+BAAA,eAAAA,+BAAA,CAAQC,IAAR,GACX;EACEC,KAAK,EAAE,YADT;EAEEC,IAAI,EAAE,YAFR;EAGEC,IAAI,EAAEC,iBAHR;EAIEC,SAAS,EAAEC;AAJb,CADW,GAOX,I"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sanity/cross-dataset-duplicator",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.4",
|
|
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": {
|
|
@@ -15,7 +15,6 @@ import {
|
|
|
15
15
|
Select,
|
|
16
16
|
Flex,
|
|
17
17
|
Checkbox,
|
|
18
|
-
Badge,
|
|
19
18
|
} from '@sanity/ui'
|
|
20
19
|
import {ArrowRightIcon, SearchIcon, LaunchIcon} from '@sanity/icons'
|
|
21
20
|
import sanityClient from 'part:@sanity/base/client'
|
|
@@ -65,7 +64,7 @@ export default function DuplicatorTool(props: DuplicatorToolProps) {
|
|
|
65
64
|
doc: item,
|
|
66
65
|
include: true,
|
|
67
66
|
status: null,
|
|
68
|
-
hasDraft: draftIds.includes(`drafts.${item._id}`),
|
|
67
|
+
hasDraft: draftIds?.length ? draftIds.includes(`drafts.${item._id}`) : false,
|
|
69
68
|
}))
|
|
70
69
|
: []
|
|
71
70
|
)
|
|
@@ -340,7 +339,7 @@ export default function DuplicatorTool(props: DuplicatorToolProps) {
|
|
|
340
339
|
const headingText = [selectedTotal, `/`, payloadCount, `Documents and Assets selected`].join(` `)
|
|
341
340
|
|
|
342
341
|
const buttonText = React.useMemo(() => {
|
|
343
|
-
|
|
342
|
+
const text = [`Duplicate`]
|
|
344
343
|
|
|
345
344
|
if (selectedDocumentsCount > 1) {
|
|
346
345
|
text.push(selectedDocumentsCount, selectedDocumentsCount === 1 ? `Document` : `Documents`)
|