sanity-plugin-dashboard-widget-vercel 3.1.1 → 3.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.js +377 -345
- package/lib/index.js.map +1 -1
- package/lib/index.mjs +378 -347
- package/lib/index.mjs.map +1 -1
- package/package.json +19 -20
- package/src/app.tsx +22 -30
- package/src/components/DeployButton/index.tsx +8 -7
- package/src/components/DialogForm/index.tsx +96 -116
- package/src/components/FormFieldInputLabel/index.tsx +0 -1
- package/src/components/FormFieldInputText/index.tsx +6 -5
- package/src/machines/deploy.ts +94 -91
- package/src/machines/deploymentTargetList.ts +113 -90
- package/src/machines/dialog.ts +44 -44
- package/src/machines/form.ts +136 -91
- package/src/machines/refresh.ts +22 -18
- package/src/utils/fetcher.ts +0 -1
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/constants.ts","../src/components/StateDebug/index.tsx","../src/machines/deploymentTargetList.ts","../src/utils/fetcher.ts","../src/hooks/useDeployments.ts","../src/machines/refresh.ts","../src/utils/useCardColor.ts","../src/components/TableCell/index.tsx","../src/components/StatusDot/index.tsx","../src/components/Deployment/index.tsx","../src/machines/deploy.ts","../src/components/DeployButton/index.tsx","../src/components/PlaceholderAvatar/index.tsx","../src/components/PlaceholderText/index.tsx","../src/components/DeploymentPlaceholder/index.tsx","../src/components/Deployments/index.tsx","../src/components/DeploymentTarget/index.tsx","../src/components/DeploymentTargets/index.tsx","../src/machines/form.ts","../src/utils/sanitizeFormData.ts","../src/components/FormFieldInputLabel/index.tsx","../src/components/FormFieldInputText/index.tsx","../src/client.ts","../src/components/DialogForm/index.tsx","../src/machines/dialog.ts","../src/app.tsx","../src/index.ts"],"sourcesContent":["// https://vercel.com/docs/platform/limits\nexport const API_ENDPOINT_DEPLOYMENTS = 'https://api.vercel.com/v5/now/deployments'\nexport const API_ENDPOINT_ALIASES = 'https://api.vercel.com/v3/now/aliases'\n\n// Sanity API version\nexport const API_VERSION = '1'\n\nexport const DEBUG_MODE = false\n\nexport const DEPLOYMENT_TARGET_DOCUMENT_TYPE = 'vercel.deploymentTarget'\n\nexport const VERCEL_STATUS_COLORS = {\n BUILDING: '#f5a623',\n CANCELED: '#ff0000',\n ERROR: '#ff0000',\n READY: '#50e3c2',\n QUEUED: '#333',\n}\n\n// Name displayed in toasts\nexport const WIDGET_NAME = 'Vercel (dashboard)'\n\n// NOTE: Manually set plugin z-index values to be higher than Sanity's header search field\n// (which is currently 500202). Also ensure toasts always sit above dialogs.\nexport const Z_INDEX_DIALOG = 600001\nexport const Z_INDEX_TOAST_PROVIDER = 600002\n","import {Box, Card, Stack, Text} from '@sanity/ui'\nimport React from 'react'\n\nimport {DEBUG_MODE} from '../../constants'\n\ntype Props = {\n name: string\n state: any // TODO: type correctly\n}\n\nconst StateDebug = (props: Props) => {\n const {name, state} = props\n\n if (!DEBUG_MODE) {\n return null\n }\n\n return (\n <Card\n scheme=\"dark\"\n style={{\n backgroundColor: 'rgba(0, 0, 255, 0.9)',\n borderRadius: '3px',\n fontSize: 1,\n fontWeight: 500,\n lineHeight: 'body',\n right: 0,\n opacity: 0.75,\n pointerEvents: 'none',\n position: 'absolute',\n textAlign: 'left',\n top: 0,\n zIndex: 9000,\n }}\n >\n <Box padding={2}>\n <Stack space={2}>\n <Text size={0}>Name: {name}</Text>\n <Text size={0}>state.value: {JSON.stringify(state.value)}</Text>\n </Stack>\n </Box>\n </Card>\n )\n}\n\nexport default StateDebug\n","import {assign, Machine} from 'xstate'\nimport {Sanity} from '../types'\n\ntype Context = {\n message: string\n results: Sanity.DeploymentTarget[] // TODO: type correctly\n}\n\ntype Event =\n | {type: 'CLOSE'}\n | {type: 'CREATE'; deploymentTarget: Sanity.DeploymentTarget}\n | {type: 'DELETE'; id: string}\n | {type: 'FETCH'}\n | {type: 'REJECT'; message: string}\n | {type: 'RESOLVE'; results: any[]}\n | {type: 'UPDATE'}\n\ntype Schema = {\n states: {\n failed: {}\n pending: {}\n ready: {\n states: {\n unknown: {}\n withData: {}\n withoutData: {}\n }\n }\n }\n}\n\nconst sortByTargetName = (items: Sanity.DeploymentTarget[]) => {\n return items.sort((a, b) => {\n if (a.name > b.name) {\n return 1\n }\n\n if (a.name < b.name) {\n return -1\n }\n\n return 0\n })\n}\n\nconst deploymentTargetListMachine = () =>\n Machine<Context, Schema, Event>(\n {\n context: {\n message: '',\n results: [],\n },\n initial: 'pending',\n states: {\n pending: {\n invoke: {\n src: 'fetchDataService',\n onDone: {actions: ['setResults'], target: 'ready'},\n onError: {actions: ['setMessage'], target: 'failed'},\n },\n },\n ready: {\n initial: 'unknown',\n on: {\n CREATE: {actions: ['targetCreate']},\n DELETE: {actions: ['targetDelete']},\n UPDATE: {actions: ['targetUpdate']},\n },\n states: {\n unknown: {\n always: [\n {cond: 'hasData', target: 'withData'},\n {cond: 'hasNoData', target: 'withoutData'},\n ],\n },\n withData: {\n always: [{cond: 'hasNoData', target: 'withoutData'}],\n },\n withoutData: {\n always: [{cond: 'hasData', target: 'withData'}],\n },\n },\n },\n failed: {\n type: 'final',\n },\n },\n },\n {\n actions: {\n setMessage: assign((_context, event: any) => ({\n message: event.data.details.description,\n })),\n setResults: assign((_context, event: any) => ({\n results: event.data,\n })),\n targetCreate: assign((context, event: any) => ({\n results: sortByTargetName([...context.results, event.deploymentTarget]),\n })),\n targetDelete: assign((context, event: any) => ({\n results: context.results.filter((target) => target._id !== event.id),\n })),\n targetUpdate: assign((context, event: any) => {\n const {deploymentTarget} = event\n const index = context.results.findIndex((target) => target._id === deploymentTarget._id)\n const updatedResults = Object.assign([], context.results, {\n [index]: event.deploymentTarget,\n })\n\n return {\n results: sortByTargetName(updatedResults),\n }\n }),\n },\n guards: {\n hasData: (context) => {\n return context?.results?.length > 0\n },\n hasNoData: (context) => {\n return context?.results?.length === 0\n },\n },\n }\n )\n\nexport default deploymentTargetListMachine\n","import fetch from 'unfetch'\nimport {Sanity} from '../types'\n\nconst fetcher =\n (deploymentTarget: Sanity.DeploymentTarget) =>\n async (url: string, extraParams?: URLSearchParams) => {\n const params = new URLSearchParams()\n params.set('projectId', deploymentTarget.projectId)\n if (deploymentTarget.teamId) {\n params.set('teamId', deploymentTarget.teamId)\n }\n\n if (extraParams) {\n for (const [k, v] of extraParams.entries()) {\n params.append(k, v)\n }\n }\n\n const response = await fetch(`${url}?${params.toString()}`, {\n headers: {\n Authorization: `Bearer ${deploymentTarget.token}`,\n },\n })\n\n // Manually throw on non-OK responses for react-query\n // https://react-query.tanstack.com/guides/query-functions#usage-with-fetch-and-others-clients-that-do-not-throw-by-default\n if (!response.ok) {\n throw new Error('Response not OK')\n }\n\n try {\n return response.json()\n } catch (err) {\n throw new Error(err as string)\n }\n }\n\nexport default fetcher\n","import hash from 'object-hash'\nimport {useQuery} from '@tanstack/react-query'\n\nimport fetcher from '../utils/fetcher'\nimport {API_ENDPOINT_ALIASES, API_ENDPOINT_DEPLOYMENTS} from '../constants'\nimport {Sanity, Vercel} from '../types'\n\ntype Options = {\n enabled?: boolean\n}\n\nconst useDeployments = (deploymentTarget: Sanity.DeploymentTarget, options?: Options) => {\n const fetchUrl = fetcher(deploymentTarget)\n\n // Fetch deployments\n const deployParams = new URLSearchParams()\n deployParams.set('limit', String(deploymentTarget?.deployLimit))\n\n const {\n data: deploymentsData,\n isFetching: deploymentsIsFetching,\n isSuccess: deploymentsIsSuccess,\n error: deploymentsError,\n refetch,\n } = useQuery<{deployments: Vercel.Deployment[]}, Error>({\n queryKey: [hash(deploymentTarget)],\n queryFn: () => fetchUrl(API_ENDPOINT_DEPLOYMENTS, deployParams),\n enabled: options?.enabled ?? true,\n refetchInterval: 20000, // ms\n refetchIntervalInBackground: false,\n refetchOnMount: true,\n refetchOnReconnect: 'always',\n refetchOnWindowFocus: false,\n retry: false,\n })\n\n // Fetch aliases (only if deployments have been retrieved)\n const aliasParams = new URLSearchParams()\n aliasParams.set('limit', '20')\n\n const {\n data: aliasesData,\n isFetching: aliasesIsFetching,\n isSuccess: aliasesIsSuccess,\n error: aliasesError,\n } = useQuery<\n {\n aliases: Vercel.Alias[]\n pagination: {\n count: number\n next?: number\n prev?: number\n }\n },\n Error\n >({\n queryKey: [hash(deploymentTarget), 'aliases'],\n queryFn: () => fetchUrl(API_ENDPOINT_ALIASES, aliasParams),\n enabled: !!deploymentsData,\n refetchOnMount: false,\n refetchOnReconnect: false,\n refetchOnWindowFocus: false,\n retry: false,\n })\n\n const aliases = aliasesData?.aliases as Vercel.Alias[]\n\n let deploymentsWithAlias: Vercel.DeploymentWithAlias[] | undefined\n\n if (aliases) {\n deploymentsWithAlias = deploymentsData?.deployments?.map((val: Vercel.DeploymentWithAlias) => {\n const alias = aliases.find((a) => a.deploymentId === val.uid)\n return {\n ...val,\n alias: alias?.alias,\n }\n })\n }\n\n return {\n deployments: deploymentsWithAlias,\n error: aliasesError || deploymentsError,\n isFetching: aliasesIsFetching || deploymentsIsFetching,\n isSuccess: aliasesIsSuccess && deploymentsIsSuccess,\n refetch,\n }\n}\n\nexport default useDeployments\n","import {Machine} from 'xstate'\n\ntype Context = {}\n\ntype Event = {type: 'ERROR'} | {type: 'REFRESH'} | {type: 'REFRESHED'} | {type: 'RETRY'}\n\ntype Schema = {\n states: {\n idle: {}\n refreshing: {}\n refreshed: {}\n error: {}\n }\n}\n\nconst refreshMachine = Machine<Context, Schema, Event>({\n initial: 'idle',\n states: {\n idle: {\n on: {\n REFRESH: 'refreshing',\n },\n },\n refreshing: {\n on: {\n ERROR: 'error',\n REFRESHED: 'refreshed',\n },\n },\n refreshed: {\n on: {\n REFRESH: 'refreshing',\n },\n },\n error: {\n on: {\n REFRESH: 'refreshing',\n },\n },\n },\n})\n\nexport default refreshMachine\n","import {useTheme} from '@sanity/ui'\n\nexport function useCardColor() {\n return useTheme().sanity.color.card.enabled\n}\n","import {Box, Label} from '@sanity/ui'\nimport React, {ReactNode} from 'react'\nimport {Sanity} from '../../types'\nimport {useCardColor} from '../../utils/useCardColor'\n\ntype Props = {\n children: ReactNode\n colSpan?: number\n header?: boolean\n variant?: 'age' | 'branch' | 'creator' | 'state'\n}\n\nconst TableCell = (props: Props) => {\n const {children, colSpan, header, variant} = props\n\n let display: Sanity.BoxDisplay | Sanity.BoxDisplay[] = 'table-cell'\n let cellWidth: string = 'auto'\n\n switch (variant) {\n case 'age':\n cellWidth = '50px'\n break\n case 'branch':\n cellWidth = '300px'\n display = ['none', 'none', 'none', 'table-cell']\n break\n case 'creator':\n cellWidth = '80px'\n break\n case 'state':\n cellWidth = '110px'\n display = ['none', 'none', 'none', 'none', 'table-cell']\n break\n default:\n break\n }\n\n const {border} = useCardColor()\n\n if (header) {\n return (\n <Box\n as=\"th\"\n colSpan={colSpan}\n // @ts-ignore\n display={display}\n paddingX={3}\n paddingY={2}\n style={{\n maxWidth: cellWidth,\n position: 'relative',\n textAlign: 'left',\n width: cellWidth,\n }}\n >\n <Label size={0}>{children}</Label>\n </Box>\n )\n }\n return (\n <Box\n as=\"td\"\n colSpan={colSpan}\n // @ts-ignore\n display={display}\n paddingX={3}\n paddingY={[2, 2, 3]}\n style={{\n borderTop: `1px solid ${border}`,\n maxWidth: cellWidth,\n position: 'relative',\n textAlign: 'left',\n width: cellWidth,\n }}\n >\n {children}\n </Box>\n )\n}\n\nexport default TableCell\n","import {Box} from '@sanity/ui'\nimport React from 'react'\n\nimport {VERCEL_STATUS_COLORS} from '../../constants'\nimport {Vercel} from '../../types'\n\ntype Props = {\n state: Vercel.DeploymentState\n}\n\nconst StatusDot = ({state}: Props) => (\n <Box\n style={{\n backgroundColor: `${VERCEL_STATUS_COLORS[state]}`,\n borderRadius: '20px',\n height: '9px',\n width: '9px',\n }}\n />\n)\n\nexport default StatusDot\n","import {Box, Flex, Stack, Text} from '@sanity/ui'\nimport React, {useRef} from 'react'\nimport ReactTimeAgo from 'react-time-ago'\n\nimport TableCell from '../TableCell'\nimport StatusDot from '../StatusDot'\nimport {LinkIcon} from '@sanity/icons'\nimport {Vercel} from '../../types'\n\ntype Props = {\n deployment: Vercel.DeploymentWithAlias\n}\n\nconst Deployment = (props: Props) => {\n const {deployment} = props\n\n const date = useRef(new Date(deployment.created))\n\n const commitMessage = deployment?.meta?.githubCommitMessage\n const commitRef = deployment?.meta?.githubCommitRef\n\n const targetUrl = deployment.alias ?? deployment.url\n\n return (\n <tr>\n {/* Deployment - alias or regular deployment URL */}\n <TableCell>\n <Flex align=\"center\">\n <Box\n display={['block', 'block', 'block', 'block', 'none']}\n marginRight={3}\n style={{flexShrink: 0}}\n >\n <StatusDot state={deployment.state} />\n </Box>\n\n {targetUrl ? (\n <>\n {/* Alias icon */}\n {deployment.alias && <LinkIcon />}\n\n <Box marginLeft={deployment.alias ? 1 : 0}>\n <Text\n muted={!(deployment.state === 'READY')}\n size={1}\n style={{\n textDecoration:\n deployment.state === 'CANCELED' || deployment.state === 'ERROR'\n ? 'line-through'\n : 'normal',\n }}\n textOverflow=\"ellipsis\"\n >\n {deployment.state === 'READY' ? (\n <a href={`https://${targetUrl}`} rel=\"noopener noreferrer\" target=\"_blank\">\n {targetUrl}\n </a>\n ) : (\n targetUrl\n )}\n </Text>\n </Box>\n </>\n ) : (\n <Text size={1}>Uploading...</Text>\n )}\n </Flex>\n </TableCell>\n\n {/* State */}\n <TableCell variant=\"state\">\n <Flex align=\"center\">\n <StatusDot state={deployment.state} />\n <Box marginLeft={2}>\n <Text size={1}>\n {deployment.state\n .trim()\n .toLowerCase()\n .replace(/^[a-z]/i, (t) => t.toUpperCase())}\n </Text>\n </Box>\n </Flex>\n </TableCell>\n\n {/* Branch */}\n <TableCell variant=\"branch\">\n <Stack space={2}>\n <Text size={1} textOverflow=\"ellipsis\">\n {commitRef}\n </Text>\n {commitMessage && (\n <Text muted size={1} textOverflow=\"ellipsis\">\n {commitMessage}\n </Text>\n )}\n </Stack>\n </TableCell>\n\n {/* Age */}\n <TableCell variant=\"age\">\n <Flex align=\"center\">\n <Text size={1}>\n <ReactTimeAgo date={date.current} locale=\"en-US\" timeStyle=\"mini\" />\n </Text>\n </Flex>\n </TableCell>\n\n {/* Creator */}\n <TableCell variant=\"creator\">\n <Flex align=\"center\" justify=\"center\">\n <img\n draggable={false}\n src={`https://vercel.com/api/www/avatar/${deployment?.creator?.uid}?&s=48`}\n style={{\n borderRadius: '20px',\n height: '20px',\n width: '20px',\n }}\n />\n </Flex>\n </TableCell>\n </tr>\n )\n}\n\nexport default Deployment\n","import fetch from 'unfetch'\nimport {assign, Machine} from 'xstate'\nimport {Vercel} from '../types'\n\ntype Context = {\n disabled: boolean\n feedback?: string\n label?: string\n error?: string\n}\n\ntype Event = {type: 'DEPLOY'}\n\ntype Schema = {\n states: {\n idle: {}\n deploying: {}\n success: {}\n error: {}\n }\n}\n\nconst deployMachine = (deployHook: string) =>\n Machine<Context, Schema, Event>(\n // Machine\n {\n id: 'deploy',\n initial: 'idle',\n context: {\n disabled: false,\n feedback: undefined,\n label: undefined,\n error: undefined,\n },\n states: {\n idle: {\n entry: assign({\n feedback: () => undefined,\n label: () => 'Deploy',\n }),\n on: {\n DEPLOY: 'deploying',\n },\n },\n deploying: {\n entry: assign({\n disabled: () => true,\n label: () => 'Deploying',\n }),\n exit: assign({\n disabled: () => false,\n label: () => 'Deploy',\n }),\n invoke: {\n onDone: {\n target: 'success',\n },\n onError: {\n target: 'error',\n actions: assign({\n error: (_context, event) => {\n return event.data\n },\n }),\n },\n src: 'deploy',\n },\n },\n success: {\n entry: [assign({feedback: () => 'Succesfully started!'})],\n exit: assign({\n feedback: () => undefined,\n }),\n on: {\n DEPLOY: 'deploying',\n },\n },\n error: {\n on: {\n DEPLOY: 'deploying',\n },\n },\n },\n },\n // Config\n {\n services: {\n deploy: (): Promise<void> => {\n return new Promise(async (resolve, reject) => {\n try {\n if (!deployHook) {\n return reject(new Error('No deployHook URL defined'))\n }\n\n const res = await fetch(deployHook, {method: 'POST'})\n const data = await res.json()\n\n if (!res.ok) {\n const errorMessage = (data?.error as Vercel.Error).message || res.statusText\n return reject(errorMessage)\n }\n\n return resolve()\n } catch (err) {\n console.error('Unable to deploy with error:', err)\n return reject(new Error('Please check the developer console for more information'))\n }\n })\n },\n },\n }\n )\n\nexport default deployMachine\n","import {UploadIcon} from '@sanity/icons'\nimport {Box, Button, useToast} from '@sanity/ui'\nimport {useMachine} from '@xstate/react'\nimport React, {useEffect, useMemo} from 'react'\n\nimport {WIDGET_NAME} from '../../constants'\nimport deployMachine from '../../machines/deploy'\nimport StateDebug from '../StateDebug'\n\ntype Props = {\n deployHook: string\n onDeploySuccess?: () => void\n targetName: string\n}\n\nconst DeployButton = (props: Props) => {\n const {deployHook, onDeploySuccess, targetName} = props\n\n const machine = useMemo(() => deployMachine(deployHook), [deployHook])\n\n const [deployState, deployStateTransition, deployStateInterpreter] = useMachine(machine)\n\n const toast = useToast()\n\n const isError = deployState.matches('error')\n const isSuccess = deployState.matches('success')\n\n // Callbacks\n const handleDeploy = () => {\n deployStateTransition({type: 'DEPLOY'})\n }\n\n // Effects\n useEffect(() => {\n if (isError) {\n toast.push({\n closable: true,\n description: `Unable to queue deploy for ${targetName}: ${deployState.context.error}`,\n duration: 8000,\n status: 'error',\n title: WIDGET_NAME,\n })\n }\n\n if (isSuccess) {\n toast.push({\n closable: true,\n description: `Deploy queued for ${targetName}`,\n duration: 8000,\n status: 'success',\n title: WIDGET_NAME,\n })\n }\n }, [isError, isSuccess, toast, targetName, deployState.context.error])\n\n useEffect(() => {\n deployStateInterpreter.onTransition((state) => {\n if (state.value === 'success') {\n if (onDeploySuccess) {\n onDeploySuccess()\n }\n }\n })\n }, [deployStateInterpreter, onDeploySuccess])\n\n return (\n <Box padding={3} style={{position: 'relative'}}>\n {/* xstate debug */}\n <StateDebug name=\"Deploy\" state={deployState} />\n\n <Button\n disabled={deployState.context.disabled}\n fontSize={1}\n icon={UploadIcon}\n mode=\"ghost\"\n onClick={handleDeploy}\n padding={3}\n text={`${deployState.context.label} ${targetName}`}\n tone=\"default\"\n />\n </Box>\n )\n}\n\nexport default DeployButton\n","import {Box} from '@sanity/ui'\nimport React from 'react'\nimport {useCardColor} from '../../utils/useCardColor'\n\nconst PlaceholderAvatar = () => {\n const {border} = useCardColor()\n return (\n <Box\n style={{\n backgroundColor: border,\n borderRadius: '20px',\n height: '20px',\n userSelect: 'none',\n width: '20px',\n }}\n />\n )\n}\n\nexport default PlaceholderAvatar\n","import {Box, Stack, Text} from '@sanity/ui'\nimport React from 'react'\nimport {useCardColor} from '../../utils/useCardColor'\n\ntype Props = {\n rows: number\n}\n\nconst PlaceholderText = (props: Props) => {\n const {rows} = props\n const {border} = useCardColor()\n return (\n <Box\n style={{\n backgroundColor: border,\n borderRadius: '3px',\n userSelect: 'none',\n width: '100%',\n }}\n >\n <Stack space={2}>\n {new Array(rows).fill(undefined).map((_, index) => (\n <Text key={index} size={1}>\n \n </Text>\n ))}\n </Stack>\n </Box>\n )\n}\n\nexport default PlaceholderText\n","import {Flex} from '@sanity/ui'\nimport React from 'react'\n\nimport PlaceholderAvatar from '../PlaceholderAvatar'\nimport PlaceholderText from '../PlaceholderText'\nimport TableCell from '../TableCell'\n\nconst DeploymentPlaceholder = () => {\n return (\n <tr>\n {/* Deployment - alias or regular deployment URL */}\n <TableCell>\n <PlaceholderText rows={1} />\n </TableCell>\n\n {/* State */}\n <TableCell variant=\"state\">\n <PlaceholderText rows={1} />\n </TableCell>\n\n {/* Branch */}\n <TableCell variant=\"branch\">\n <PlaceholderText rows={2} />\n </TableCell>\n\n {/* Age */}\n <TableCell variant=\"age\">\n <PlaceholderText rows={1} />\n </TableCell>\n\n {/* Creator */}\n <TableCell variant=\"creator\">\n <Flex justify=\"center\">\n <PlaceholderAvatar />\n </Flex>\n </TableCell>\n </tr>\n )\n}\n\nexport default DeploymentPlaceholder\n","import {Box, Text, useToast} from '@sanity/ui'\nimport {useMachine} from '@xstate/react'\nimport React, {useEffect, useRef} from 'react'\nimport useDeepCompareEffect from 'use-deep-compare-effect'\n\nimport {WIDGET_NAME} from '../../constants'\nimport useDeployments from '../../hooks/useDeployments'\nimport refreshMachine from '../../machines/refresh'\nimport Deployment from '../Deployment'\nimport DeployButton from '../DeployButton'\nimport DeploymentPlaceholder from '../DeploymentPlaceholder'\nimport StateDebug from '../StateDebug'\nimport TableCell from '../TableCell'\nimport {Sanity} from '../../types'\nimport {useCardColor} from '../../utils/useCardColor'\n\ntype Props = {\n deploymentTarget: Sanity.DeploymentTarget\n}\n\nconst Deployments = (props: Props) => {\n const {deploymentTarget} = props\n\n // Refs\n const refTimeout = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n // XState\n const [refreshState, refreshStateTransition] = useMachine(refreshMachine)\n\n // Fetch deployments - disable hook / auto-refetching on error state\n const {deployments, error, isFetching, isSuccess, refetch} = useDeployments(deploymentTarget, {\n enabled: !refreshState.matches('error'),\n })\n\n const toast = useToast()\n const isError = refreshState.matches('error')\n\n const handleDeploySuccess = () => {\n if (refTimeout.current) {\n clearTimeout(refTimeout.current)\n }\n refTimeout.current = setTimeout(() => {\n refetch({\n cancelRefetch: true,\n throwOnError: true,\n })\n }, 4000)\n }\n\n useEffect(() => {\n return () => {\n if (refTimeout.current) {\n clearTimeout(refTimeout.current)\n }\n }\n }, [])\n\n useEffect(() => {\n if (error) {\n refreshStateTransition({type: 'ERROR'})\n }\n\n if (isFetching) {\n refreshStateTransition({type: 'REFRESH'})\n }\n\n if (!isFetching && isSuccess) {\n refreshStateTransition({type: 'REFRESHED'})\n }\n }, [error, isFetching, isSuccess, refreshStateTransition])\n\n useDeepCompareEffect(() => {\n if (!refreshState.matches('refreshing')) {\n refreshStateTransition({type: 'REFRESH'})\n }\n }, [deploymentTarget])\n\n useDeepCompareEffect(() => {\n if (isError) {\n toast.push({\n closable: true,\n description: `Unable to fetch deployments for ${deploymentTarget.name}`,\n duration: 8000,\n status: 'error',\n title: WIDGET_NAME,\n })\n }\n }, [deploymentTarget, isError])\n\n const hasFetched = typeof deployments !== 'undefined'\n const hasDeployments = deployments && deployments.length > 0\n\n const {border} = useCardColor()\n return (\n <Box marginTop={3} style={{position: 'relative'}}>\n {/* xstate debug */}\n <StateDebug name=\"Refresh\" state={refreshState} />\n\n {!refreshState.matches('error') && (\n <>\n <Box\n as=\"table\"\n style={{\n borderBottom: `1px solid ${border}`,\n borderCollapse: 'collapse',\n display: 'table',\n tableLayout: 'fixed',\n width: '100%',\n }}\n >\n <Box as=\"thead\" style={{display: 'table-header-group'}}>\n <tr>\n {/* Deployment */}\n <TableCell header>Deployment</TableCell>\n\n {/* State */}\n <TableCell header variant=\"state\">\n State\n </TableCell>\n\n {/* Branch */}\n <TableCell header variant=\"branch\">\n Branch\n </TableCell>\n\n {/* Age */}\n <TableCell header variant=\"age\">\n Age\n </TableCell>\n\n {/* Creator */}\n <TableCell header variant=\"age\">\n Creator\n </TableCell>\n </tr>\n </Box>\n\n <Box as=\"tbody\" style={{display: 'table-header-group'}}>\n {/* Placeholders */}\n {!deployments &&\n new Array(deploymentTarget?.deployLimit)\n .fill(undefined)\n .map((_, index) => <DeploymentPlaceholder key={index} />)}\n {/* Deployments */}\n {hasDeployments &&\n deployments?.map((deployment) => (\n <Deployment deployment={deployment} key={deployment.uid} />\n ))}\n </Box>\n </Box>\n\n {/* No results */}\n {hasFetched && !hasDeployments && (\n <Box padding={3} style={{width: '100%'}}>\n <Text muted size={1}>\n No deployments found. Don't forget to specify a valid team ID if your project\n belongs to a team.\n </Text>\n </Box>\n )}\n </>\n )}\n\n {/* Error message */}\n {refreshState.matches('error') && (\n <Box padding={3}>\n <Text muted size={1}>\n Unable to fetch recent deployments. Please check your network and deployment settings.\n </Text>\n </Box>\n )}\n\n {/* Deploy button */}\n {!refreshState.matches('error') && deploymentTarget.deployHook && (\n <Box>\n <DeployButton\n deployHook={deploymentTarget.deployHook}\n onDeploySuccess={handleDeploySuccess}\n targetName={deploymentTarget.name}\n />\n </Box>\n )}\n </Box>\n )\n}\n\nexport default Deployments\n","import {EditIcon} from '@sanity/icons'\nimport {Box, Button, Flex, Text, Tooltip} from '@sanity/ui'\nimport React, {FC} from 'react'\n\nimport Deployments from '../Deployments'\nimport {Sanity} from '../../types'\n\ntype Props = {\n item: Sanity.DeploymentTarget\n onDialogEdit: (deploymentTarget: Sanity.DeploymentTarget) => void\n}\n\nconst DeploymentTarget: FC<Props> = (props: Props) => {\n const {item, onDialogEdit} = props\n\n const deploymentTarget = {\n deployHook: item.deployHook,\n deployLimit: item.deployLimit,\n name: item.name,\n projectId: item.projectId,\n teamId: item.teamId,\n token: item.token,\n } as Sanity.DeploymentTarget\n\n return (\n <Box style={{position: 'relative'}}>\n {/* Header */}\n <Flex align=\"center\" justify=\"space-between\" marginTop={2} paddingX={3}>\n <Text size={2}>{item.name}</Text>\n\n <Tooltip\n content={\n <Box padding={2}>\n <Text muted size={1}>\n Edit deployment target\n </Text>\n </Box>\n }\n placement=\"left\"\n >\n <Button fontSize={1} icon={EditIcon} mode=\"bleed\" onClick={() => onDialogEdit(item)} />\n </Tooltip>\n </Flex>\n\n {/* Content */}\n <Deployments deploymentTarget={deploymentTarget} />\n </Box>\n )\n}\n\nexport default DeploymentTarget\n","import React from 'react'\nimport {Stack} from '@sanity/ui'\n\nimport DeploymentTarget from '../DeploymentTarget'\nimport {Sanity} from '../../types'\n\ntype Props = {\n items: Sanity.DeploymentTarget[]\n onDialogEdit: (deploymentTarget: Sanity.DeploymentTarget) => void\n}\n\nconst DeploymentTargets = (props: Props) => {\n const {items, onDialogEdit} = props\n\n return (\n <Stack space={5}>\n {items?.map((item) => (\n <DeploymentTarget item={item} key={item._id} onDialogEdit={onDialogEdit} />\n ))}\n </Stack>\n )\n}\n\nexport default DeploymentTargets\n","import {assign, Machine} from 'xstate'\n\ntype Context = {\n formData?: Record<string, any>\n message: string\n}\n\ntype Event =\n | {type: 'CREATE'}\n | {type: 'DELETE'}\n | {type: 'REJECT'}\n | {type: 'RESOLVE'}\n | {type: 'SUBMIT'}\n | {type: 'UPDATE'}\n\ntype Schema = {\n states: {\n idle: {}\n creating: {}\n updating: {}\n deleting: {}\n success: {}\n error: {}\n }\n}\n\nconst formMachine = Machine<Context, Schema, Event>(\n {\n context: {\n formData: {},\n message: '',\n },\n initial: 'idle',\n states: {\n idle: {\n on: {\n CREATE: {\n actions: ['createDocument'],\n target: 'creating',\n },\n DELETE: {\n actions: ['deleteDocument'],\n target: 'deleting',\n },\n UPDATE: {\n actions: ['updateDocument'],\n target: 'updating',\n },\n },\n },\n creating: {\n invoke: {\n src: 'createDocumentService',\n onDone: {target: 'success'},\n onError: {actions: ['setMessage'], target: 'error'},\n },\n on: {\n RESOLVE: 'success',\n REJECT: 'error',\n },\n },\n updating: {\n invoke: {\n src: 'updateDocumentService',\n onDone: {target: 'success'},\n onError: {actions: ['setMessage'], target: 'error'},\n },\n on: {\n RESOLVE: 'success',\n REJECT: 'error',\n },\n },\n deleting: {\n invoke: {\n src: 'deleteDocumentService',\n onDone: {target: 'success'},\n onError: {actions: ['setMessage'], target: 'error'},\n },\n on: {\n RESOLVE: 'success',\n REJECT: 'error',\n },\n },\n success: {\n invoke: {\n src: 'formSubmittedService',\n },\n },\n error: {},\n },\n },\n {\n actions: {\n setMessage: assign((_context, event: any) => ({\n message: event.data.details.description,\n })),\n createDocument: assign((_context, event: any) => ({\n formData: event.formData,\n })),\n deleteDocument: assign(() => ({\n // id: event.id,\n })),\n updateDocument: assign((_context, event: any) => ({\n formData: event.formData,\n })),\n },\n }\n)\n\nexport default formMachine\n","// Recursively sanitize form data:\n// - convert empty strings, undefined values and empty arrays to null (to correctly unset / delete fields)\n// - trim whitespace on string fleids\n\ntype FormData = Record<string, any>\n\nconst sanitizeFormData = (formData: FormData): FormData => {\n return Object.keys(formData).reduce((acc: FormData, key) => {\n const val = formData[key]\n\n // TODO: refactor\n if (typeof val === 'object' && val !== null && val.constructor !== Array) {\n acc[key] = sanitizeFormData(val)\n } else if (val === '' || typeof val === 'undefined' || val?.length === 0) {\n acc[key] = null\n } else if (typeof val === 'string' && val) {\n acc[key] = formData[key].trim()\n } else {\n acc[key] = formData[key]\n }\n\n return acc\n }, {})\n}\n\nexport default sanitizeFormData\n","import {ErrorOutlineIcon} from '@sanity/icons'\nimport {Box, Inline, Text, Tooltip} from '@sanity/ui'\nimport React, {FC} from 'react'\n// @ts-expect-error - fix typings later\nimport {FieldError} from 'react-hook-form'\nimport {styled} from 'styled-components'\n\ntype Props = {\n description?: string\n error?: FieldError\n label: string\n name: string\n}\n\nconst StyledErrorOutlineIcon = styled(ErrorOutlineIcon)(({theme}) => {\n return {\n color: theme.sanity.color.spot.red,\n }\n})\n\nconst FormFieldInputLabel: FC<Props> = (props: Props) => {\n const {description, error, label, name} = props\n\n return (\n <Box marginBottom={3}>\n {/* Label */}\n <Inline space={2}>\n <Text as=\"label\" htmlFor={name} size={1} weight=\"semibold\">\n {label}\n </Text>\n\n {/* Error icon + tooltip */}\n {error && (\n <Text size={1}>\n <Tooltip\n content={\n <Box padding={2}>\n <Text muted size={1}>\n <StyledErrorOutlineIcon style={{marginRight: '0.1em'}} />\n {error.message}\n </Text>\n </Box>\n }\n fallbackPlacements={['top', 'left']}\n placement=\"right\"\n portal\n >\n <StyledErrorOutlineIcon />\n </Tooltip>\n </Text>\n )}\n </Inline>\n\n {/* Description */}\n {description && (\n <Box marginY={3}>\n <Text htmlFor={name} muted size={1}>\n {description}\n </Text>\n </Box>\n )}\n </Box>\n )\n}\n\nexport default FormFieldInputLabel\n","import {Box, TextInput} from '@sanity/ui'\nimport React, {forwardRef} from 'react'\n// @ts-expect-error - fix typings later\nimport {FieldError} from 'react-hook-form'\n\nimport FormFieldInputLabel from '../FormFieldInputLabel'\n\ntype Props = {\n description?: string\n disabled?: boolean\n error?: FieldError\n label: string\n name: string\n placeholder?: string\n value?: string\n}\n\ntype Ref = HTMLInputElement\n\nconst FormFieldInputText = forwardRef<Ref, Props>((props: Props, ref) => {\n const {description, disabled, error, label, name, placeholder, value} = props\n\n return (\n <Box>\n {/* Label */}\n <FormFieldInputLabel description={description} error={error} label={label} name={name} />\n {/* Input */}\n <TextInput\n autoComplete=\"off\"\n autoFocus\n defaultValue={value}\n disabled={disabled}\n id={name}\n name={name}\n placeholder={placeholder}\n ref={ref}\n />\n </Box>\n )\n})\n\nexport default FormFieldInputText\n","import type {SanityClient} from '@sanity/client'\nimport {API_VERSION} from './constants'\nimport {useClient} from 'sanity'\n\nexport function useSanityClient(): SanityClient {\n return useClient({apiVersion: API_VERSION})\n}\n","// @ts-expect-error - fix typings later\nimport {yupResolver} from '@hookform/resolvers/yup'\nimport {Box, Button, Dialog, Flex, Stack} from '@sanity/ui'\nimport {uuid} from '@sanity/uuid'\nimport {useMachine} from '@xstate/react'\nimport React, {FC} from 'react'\n// @ts-expect-error - fix typings later\nimport {useForm} from 'react-hook-form'\nimport * as yup from 'yup'\n\nimport {DEPLOYMENT_TARGET_DOCUMENT_TYPE, Z_INDEX_DIALOG} from '../../constants'\nimport formMachine from '../../machines/form'\nimport sanitizeFormData from '../../utils/sanitizeFormData'\nimport FormFieldInputText from '../FormFieldInputText'\nimport {Sanity} from '../../types'\nimport {useSanityClient} from '../../client'\n\ntype Props = {\n deploymentTarget?: Sanity.DeploymentTarget\n onClose: () => void\n onCreate?: (deploymentTarget: Sanity.DeploymentTarget) => void\n onDelete?: (id: string) => void\n onUpdate?: (deploymentTarget: Sanity.DeploymentTarget) => void\n}\n\ntype FormData = yup.InferType<typeof formSchema>\n\nconst formSchema = yup.object().shape({\n deployHook: yup.string().url('Deploy hook must be a valid URL'),\n deployLimit: yup\n .number()\n .positive()\n .integer()\n .min(1, 'Deploy limit must no less than 1')\n .max(15, 'Deploy limit must no higher than 15')\n .typeError('Deploy limit must be a number')\n .required('Deploy limit must be a positive integer between 1 and 15'),\n name: yup.string().required('Name cannot be empty'),\n projectId: yup.string().required('Vercel Project ID cannot be empty'),\n teamId: yup.string(),\n token: yup.string().required('Vercel Account Token cannot be empty'),\n})\n\nconst DialogForm: FC<Props> = (props: Props) => {\n const {deploymentTarget, onClose, onCreate, onDelete, onUpdate} = props\n const client = useSanityClient()\n\n // xstate\n const [formState, formStateTransition] = useMachine(formMachine, {\n services: {\n formSubmittedService: async () => {\n onClose()\n },\n // TODO: refactor\n createDocumentService: async (_context, event: any) => {\n let document\n try {\n document = await client.create({\n _id: `vercel.${uuid()}`,\n _type: DEPLOYMENT_TARGET_DOCUMENT_TYPE,\n ...event.formData,\n })\n if (onCreate) {\n onCreate(document as Sanity.DeploymentTarget)\n }\n return Promise.resolve()\n } catch (e) {\n return Promise.reject(e)\n }\n },\n // TODO: refactor\n deleteDocumentService: async () => {\n if (deploymentTarget) {\n try {\n await client.delete(deploymentTarget._id)\n if (onDelete) {\n onDelete(deploymentTarget._id)\n }\n return Promise.resolve()\n } catch (e) {\n return Promise.reject(e)\n }\n }\n return Promise.resolve()\n },\n // TODO: refactor\n updateDocumentService: async (_context, event: any) => {\n let document\n if (deploymentTarget) {\n try {\n document = await client.patch(deploymentTarget._id).set(event.formData).commit()\n if (onUpdate) {\n onUpdate(document as Sanity.DeploymentTarget)\n }\n return Promise.resolve()\n } catch (e) {\n return Promise.reject(e)\n }\n }\n return Promise.resolve()\n },\n },\n })\n\n const formUpdating =\n formState.matches('creating') || formState.matches('deleting') || formState.matches('updating')\n\n // react-hook-form\n const {\n // Read the formState before render to subscribe the form state through Proxy\n formState: {errors, isDirty, isValid},\n handleSubmit,\n register,\n } = useForm({\n defaultValues: {\n deployHook: deploymentTarget?.deployHook || '',\n deployLimit: deploymentTarget?.deployLimit || 5,\n name: deploymentTarget?.name,\n projectId: deploymentTarget?.projectId,\n teamId: deploymentTarget?.teamId || '',\n token: deploymentTarget?.token,\n },\n mode: 'onChange',\n resolver: yupResolver(formSchema),\n })\n\n // Callbacks\n // - submit react-hook-form\n const onSubmit = async (formData: FormData) => {\n const sanitizedFormData = sanitizeFormData(formData)\n await formStateTransition(deploymentTarget ? 'UPDATE' : 'CREATE', {\n formData: sanitizedFormData,\n })\n }\n\n const handleDelete = () => {\n formStateTransition('DELETE', {id: deploymentTarget?._id})\n }\n\n const Footer = () => (\n <Box padding={3}>\n <Flex justify={deploymentTarget ? 'space-between' : 'flex-end'}>\n {/* Delete button */}\n {deploymentTarget && (\n <Button\n disabled={formUpdating}\n fontSize={1}\n mode=\"bleed\"\n onClick={handleDelete}\n text=\"Delete\"\n tone=\"critical\"\n />\n )}\n\n {/* Submit button */}\n <Button\n disabled={formUpdating || !isDirty || !isValid}\n fontSize={1}\n onClick={handleSubmit(onSubmit)}\n text={deploymentTarget ? 'Update and close' : 'Create'}\n tone=\"primary\"\n />\n </Flex>\n </Box>\n )\n\n return (\n <Dialog\n footer={<Footer />}\n header={`${deploymentTarget ? 'Edit' : 'Create'} deployment target`}\n id=\"create\"\n onClose={onClose}\n width={1}\n zOffset={Z_INDEX_DIALOG}\n >\n {/* We reverse direction to ensure that inline links dont autofocus before other form elements */}\n <Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n {/* Hidden button to enable enter key submissions */}\n <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n {/* Form fields */}\n <Stack space={5}>\n {/* Title */}\n <FormFieldInputText\n disabled={formUpdating}\n description=\"Name displayed in this plugin (e.g. production, staging)\"\n error={errors?.name}\n label=\"Name\"\n name=\"name\"\n ref={register}\n />\n\n <FormFieldInputText\n disabled={formUpdating}\n error={errors?.token}\n label=\"Vercel Account Token\"\n name=\"token\"\n ref={register}\n />\n\n <FormFieldInputText\n disabled={formUpdating}\n error={errors?.projectId}\n label=\"Vercel Project ID\"\n name=\"projectId\"\n ref={register}\n />\n\n <FormFieldInputText\n description=\"Required only if your project is owned by a team account\"\n disabled={formUpdating}\n error={errors?.teamId}\n label=\"Vercel Team ID (optional)\"\n name=\"teamId\"\n ref={register}\n />\n\n <FormFieldInputText\n description=\"Enter a valid deploy hook URL to enable manual deploys\"\n disabled={formUpdating}\n error={errors?.deployHook}\n label=\"Vercel Deploy Hook (optional)\"\n name=\"deployHook\"\n ref={register}\n />\n\n <FormFieldInputText\n disabled={formUpdating}\n error={errors?.deployLimit}\n label=\"Number of deploys to display\"\n name=\"deployLimit\"\n ref={register({valueAsNumber: true})}\n />\n </Stack>\n </Box>\n </Dialog>\n )\n}\n\nexport default DialogForm\n","import {assign, Machine} from 'xstate'\nimport {Sanity} from '../types'\n\ntype Context = {\n editDeploymentTarget?: Sanity.DeploymentTarget\n}\n\ntype Event =\n | {type: 'CREATE'}\n | {type: 'CLOSE'}\n | {type: 'EDIT'; deploymentTarget: Sanity.DeploymentTarget}\n\ntype Schema = {\n states: {\n idle: {}\n edit: {}\n create: {}\n }\n}\n\nconst dialogMachine = () =>\n Machine<Context, Schema, Event>(\n {\n context: {\n editDeploymentTarget: undefined,\n },\n initial: 'idle',\n states: {\n idle: {\n entry: assign({\n editDeploymentTarget: () => undefined,\n }),\n on: {\n CREATE: 'create',\n EDIT: {\n actions: ['setEditDeploymentTarget'],\n target: 'edit',\n },\n },\n },\n edit: {\n on: {\n CLOSE: 'idle',\n },\n },\n create: {\n on: {\n CLOSE: 'idle',\n },\n },\n },\n },\n {\n actions: {\n setEditDeploymentTarget: assign((_context, event: any) => ({\n editDeploymentTarget: event.deploymentTarget,\n })),\n },\n }\n )\n\nexport default dialogMachine\n","import {AddIcon} from '@sanity/icons'\nimport {Box, Button, Card, Flex, Text, ToastProvider, Tooltip} from '@sanity/ui'\nimport {useMachine} from '@xstate/react'\nimport React from 'react'\nimport {QueryClient, QueryClientProvider} from '@tanstack/react-query'\n\nimport StateDebug from './components/StateDebug'\nimport {DEPLOYMENT_TARGET_DOCUMENT_TYPE, Z_INDEX_TOAST_PROVIDER} from './constants'\nimport deploymentTargetListMachine from './machines/deploymentTargetList'\nimport DeploymentTargets from './components/DeploymentTargets'\nimport DialogForm from './components/DialogForm'\nimport dialogMachine from './machines/dialog'\nimport {Sanity} from './types'\nimport {useSanityClient} from './client'\n\nconst Widget = () => {\n const client = useSanityClient()\n // xstate\n const [deploymentTargetListState, deploymentTargetListStateTransition] = useMachine(\n deploymentTargetListMachine,\n {\n services: {\n fetchDataService: () => {\n return client\n .fetch(`*[_type == \"${DEPLOYMENT_TARGET_DOCUMENT_TYPE}\"] | order(name asc)`)\n .then((result: any) => result)\n },\n },\n }\n )\n const [dialogState, dialogStateTransition] = useMachine(dialogMachine)\n\n const queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n gcTime: 0,\n staleTime: 0,\n },\n },\n })\n\n // Callbacks\n const handleDialogClose = () => {\n dialogStateTransition('CLOSE')\n }\n const handleDialogShowCreate = () => {\n dialogStateTransition('CREATE')\n }\n const handleDialogShowEdit = (deploymentTarget: Sanity.DeploymentTarget) => {\n dialogStateTransition('EDIT', {deploymentTarget})\n }\n const handleTargetCreate = (deploymentTarget: Sanity.DeploymentTarget) => {\n deploymentTargetListStateTransition('CREATE', {deploymentTarget})\n }\n const handleTargetDelete = (id: string) => {\n deploymentTargetListStateTransition('DELETE', {id})\n }\n const handleTargetUpdate = (deploymentTarget: Sanity.DeploymentTarget) => {\n deploymentTargetListStateTransition('UPDATE', {deploymentTarget})\n }\n\n return (\n <ToastProvider zOffset={Z_INDEX_TOAST_PROVIDER}>\n <QueryClientProvider client={queryClient}>\n <Card radius={2} style={{overflow: 'hidden '}}>\n {/* xstate debug */}\n <StateDebug name=\"List\" state={deploymentTargetListState} />\n\n {/* Header */}\n <Flex align=\"center\" justify=\"space-between\" paddingX={3} paddingY={2}>\n <Text size={5} weight=\"semibold\">\n Vercel deployments\n </Text>\n\n <Tooltip\n content={\n <Box padding={2}>\n <Text muted size={1}>\n Create new deployment target\n </Text>\n </Box>\n }\n placement=\"left\"\n >\n <Button fontSize={1} icon={AddIcon} onClick={handleDialogShowCreate} mode=\"bleed\" />\n </Tooltip>\n </Flex>\n\n <Box>\n {deploymentTargetListState.matches('pending') && (\n <Box paddingX={3} paddingY={4}>\n <Text>Loading...</Text>\n </Box>\n )}\n\n {deploymentTargetListState.matches('ready.withoutData') && (\n <Box paddingX={3} paddingY={4}>\n <Text>\n No deployment targets found.{' '}\n <a onClick={handleDialogShowCreate} style={{cursor: 'pointer'}}>\n Create a new target?\n </a>\n </Text>\n </Box>\n )}\n\n {deploymentTargetListState.matches('ready.withData') && (\n <DeploymentTargets\n items={deploymentTargetListState.context.results}\n onDialogEdit={handleDialogShowEdit}\n />\n )}\n\n {deploymentTargetListState.matches('failed') && (\n <Box paddingX={3} paddingY={4}>\n <Text>\n Failed to retrieve deployment targets. Please check the developer console log for\n more information.\n </Text>\n </Box>\n )}\n </Box>\n </Card>\n\n {/* Dialogs */}\n {dialogState.matches('create') && (\n <DialogForm onClose={handleDialogClose} onCreate={handleTargetCreate} />\n )}\n\n {dialogState.matches('edit') && (\n <DialogForm\n deploymentTarget={dialogState.context.editDeploymentTarget}\n onClose={handleDialogClose}\n onDelete={handleTargetDelete}\n onUpdate={handleTargetUpdate}\n />\n )}\n </QueryClientProvider>\n </ToastProvider>\n )\n}\n\nexport default Widget\n","import Widget from './app'\n\n// Initialize `javascript-time-ago` locale (required for react-time-ago)\nimport TimeAgo from 'javascript-time-ago'\nimport en from 'javascript-time-ago/locale/en'\nimport {DashboardWidget, type LayoutConfig} from '@sanity/dashboard'\n\nTimeAgo.addDefaultLocale(en)\n\nexport function vercelWidget(config: {layout?: LayoutConfig} = {}): DashboardWidget {\n return {\n name: 'vercel',\n component: Widget,\n layout: config.layout ?? {width: 'full'},\n }\n}\n"],"names":["Machine","assign","fetch","useQuery","hash","useTheme","jsx","Box","Label","useRef","jsxs","Flex","Fragment","LinkIcon","Text","Stack","ReactTimeAgo","useMemo","useMachine","useToast","useEffect","Button","UploadIcon","useDeepCompareEffect","Tooltip","EditIcon","styled","ErrorOutlineIcon","Inline","forwardRef","TextInput","useClient","yup","uuid","useForm","yupResolver","Dialog","QueryClient","ToastProvider","QueryClientProvider","Card","AddIcon","TimeAgo","en"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/constants.ts","../src/components/StateDebug/index.tsx","../src/machines/deploymentTargetList.ts","../src/utils/fetcher.ts","../src/hooks/useDeployments.ts","../src/machines/refresh.ts","../src/utils/useCardColor.ts","../src/components/TableCell/index.tsx","../src/components/StatusDot/index.tsx","../src/components/Deployment/index.tsx","../src/machines/deploy.ts","../src/components/DeployButton/index.tsx","../src/components/PlaceholderAvatar/index.tsx","../src/components/PlaceholderText/index.tsx","../src/components/DeploymentPlaceholder/index.tsx","../src/components/Deployments/index.tsx","../src/components/DeploymentTarget/index.tsx","../src/components/DeploymentTargets/index.tsx","../src/machines/form.ts","../src/utils/sanitizeFormData.ts","../src/components/FormFieldInputLabel/index.tsx","../src/components/FormFieldInputText/index.tsx","../src/client.ts","../src/components/DialogForm/index.tsx","../src/machines/dialog.ts","../src/app.tsx","../src/index.ts"],"sourcesContent":["// https://vercel.com/docs/platform/limits\nexport const API_ENDPOINT_DEPLOYMENTS = 'https://api.vercel.com/v5/now/deployments'\nexport const API_ENDPOINT_ALIASES = 'https://api.vercel.com/v3/now/aliases'\n\n// Sanity API version\nexport const API_VERSION = '1'\n\nexport const DEBUG_MODE = false\n\nexport const DEPLOYMENT_TARGET_DOCUMENT_TYPE = 'vercel.deploymentTarget'\n\nexport const VERCEL_STATUS_COLORS = {\n BUILDING: '#f5a623',\n CANCELED: '#ff0000',\n ERROR: '#ff0000',\n READY: '#50e3c2',\n QUEUED: '#333',\n}\n\n// Name displayed in toasts\nexport const WIDGET_NAME = 'Vercel (dashboard)'\n\n// NOTE: Manually set plugin z-index values to be higher than Sanity's header search field\n// (which is currently 500202). Also ensure toasts always sit above dialogs.\nexport const Z_INDEX_DIALOG = 600001\nexport const Z_INDEX_TOAST_PROVIDER = 600002\n","import {Box, Card, Stack, Text} from '@sanity/ui'\nimport React from 'react'\n\nimport {DEBUG_MODE} from '../../constants'\n\ntype Props = {\n name: string\n state: any // TODO: type correctly\n}\n\nconst StateDebug = (props: Props) => {\n const {name, state} = props\n\n if (!DEBUG_MODE) {\n return null\n }\n\n return (\n <Card\n scheme=\"dark\"\n style={{\n backgroundColor: 'rgba(0, 0, 255, 0.9)',\n borderRadius: '3px',\n fontSize: 1,\n fontWeight: 500,\n lineHeight: 'body',\n right: 0,\n opacity: 0.75,\n pointerEvents: 'none',\n position: 'absolute',\n textAlign: 'left',\n top: 0,\n zIndex: 9000,\n }}\n >\n <Box padding={2}>\n <Stack space={2}>\n <Text size={0}>Name: {name}</Text>\n <Text size={0}>state.value: {JSON.stringify(state.value)}</Text>\n </Stack>\n </Box>\n </Card>\n )\n}\n\nexport default StateDebug\n","import {assign, setup, fromPromise, assertEvent} from 'xstate'\nimport {Sanity} from '../types'\nimport type {SanityClient} from 'sanity'\nimport {DEPLOYMENT_TARGET_DOCUMENT_TYPE} from '../constants'\n\ntype Context = {\n client: SanityClient\n results: Sanity.DeploymentTarget[] // TODO: type correctly\n}\n\ntype Event =\n | {type: 'CLOSE'}\n | {type: 'CREATE'; deploymentTarget: Sanity.DeploymentTarget}\n | {type: 'DELETE'; id: string}\n | {type: 'FETCH'}\n | {type: 'UPDATE'; deploymentTarget: Sanity.DeploymentTarget}\n\ninterface Input {\n client: SanityClient\n}\n\nconst sortByTargetName = (items: Sanity.DeploymentTarget[]) => {\n return items.sort((a, b) => {\n if (a.name > b.name) {\n return 1\n }\n if (a.name < b.name) {\n return -1\n }\n return 0\n })\n}\n\nexport const deploymentTargetListMachine = setup({\n types: {} as {\n children: {fetchData: 'fetch data'}\n context: Context\n events: Event\n input: Input\n },\n actions: {\n targetCreate: assign({\n results: ({context, event}) => {\n assertEvent(event, 'CREATE')\n return sortByTargetName([...context.results, event.deploymentTarget])\n },\n }),\n targetDelete: assign({\n results: ({context, event}) => {\n assertEvent(event, 'DELETE')\n return context.results.filter((target) => target._id !== event.id)\n },\n }),\n targetUpdate: assign({\n results: ({context, event}) => {\n assertEvent(event, 'UPDATE')\n const {deploymentTarget} = event\n const index = context.results.findIndex((target) => target._id === deploymentTarget._id)\n const updatedResults = Object.assign([], context.results, {\n [index]: deploymentTarget,\n })\n return sortByTargetName(updatedResults)\n },\n }),\n },\n guards: {\n hasData: ({context}) => {\n return context?.results?.length > 0\n },\n hasNoData: ({context}) => {\n return context?.results?.length === 0\n },\n },\n actors: {\n 'fetch data': fromPromise(\n ({input, signal}: {input: {client: SanityClient}; signal: AbortSignal}) => {\n return input.client\n .fetch<Sanity.DeploymentTarget[]>(\n '*[_type == $type] | order(name asc)',\n {\n type: DEPLOYMENT_TARGET_DOCUMENT_TYPE,\n },\n {signal}\n )\n .catch((error) => {\n if (error instanceof Error && error.name === 'AbortError') {\n return []\n }\n console.error('Failed to fetch deployment targets', error)\n throw error\n })\n }\n ),\n },\n}).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QAoC2BDAxgCwJYDswBKAOgAcx8ICoBiCAe0JIIDcGBrMEgMzABccAEXT90AbQAMAXUSgyDWLn64mckAA9EAZkkBOEgHYAjAA5DAFgBsFgEwnJAVkMAaEAE9Ep4yUeT-klbGesbaoYaGAL6RbmhYeISkFFQ0tGAATukM6eQANqI82ai8AsKiEjLqCkoqakiaOvpGZpY29sZOrh6IxpYkFo5h2oaOpnqOxraSFtGxGDgExCTpYOgQ7rQAwgBKAKIAggAqu1Ky9dXKqvjqWggWHSS9eoaS9ibao6aObp4IVh8kL56OzGII2PT-WYgOILRLLVbrWhCXYAGV2x1OVUUlzqoFu90kRm8tlM2gsL1eJJ+iEGBj0gVsFm0YWmVkctihMISSxWaw2AFUAApCI4nSrnbG1a71fGSUz9WzBezTFWvb7dO5MkjjMITZykwxjTnzbmkXnrEgAV3wHHwDAA7vhaJiJTUrjces9fFZGc9TLYrGqA9SEM9CcT7sznH5HHpjfFFmaEe4rTa7Y7ncYzvJJe6ZZ7DN7fYaA0GrCHvD4xs4S+yPnGYtCTYn4XySPblNgRGJneKc27cQ0EI4BiQ2T77noAzXyxrTIESGFGd4rP9DONTPHYTzk+3OwxLfxu+he9mQBcpR7h6Px4ylWyIrPfl9bIvJhZJIYA-7zFZoo27QgOB1C5RMsQHaU8UQABaYIQ2gv9G1AuFkmofAoHAnFIKHOwQz0bRtUMcd-j8WwpnuLdTVbdZMMvfMEFsPQQxMeViQmZkLC+f0oiQ5s4XNFNrVtB1sIvPMoIQCIK1BIsmXXWxtFJcZKJbAS934Ltylo8ShysfDHl9PRxjlekrC6Z9BhIBk5MkXpzFBFT+N3DsNIPI8tNdLCr20L0Wmscw5V0e5pMJYwBiI8kwrDRC5gTOEeHQXBckgbTB1uZwQw6RwrEBd9bEcQZYzsRDoiAA */\n context: ({input}) => ({\n client: input.client,\n results: [],\n }),\n initial: 'pending',\n states: {\n pending: {\n invoke: {\n src: 'fetch data',\n id: 'fetchData',\n input: ({context}) => ({client: context.client}),\n onDone: {\n actions: assign({results: ({event}) => event.output}),\n target: 'ready',\n },\n onError: {\n target: 'failed',\n },\n },\n },\n ready: {\n initial: 'unknown',\n on: {\n CREATE: {\n actions: 'targetCreate',\n },\n DELETE: {\n actions: 'targetDelete',\n },\n UPDATE: {\n actions: 'targetUpdate',\n },\n },\n states: {\n unknown: {\n always: [\n {target: 'withData', guard: 'hasData'},\n {target: 'withoutData', guard: 'hasNoData'},\n ],\n },\n withData: {\n always: [{target: 'withoutData', guard: 'hasNoData'}],\n },\n withoutData: {\n always: [{target: 'withData', guard: 'hasData'}],\n },\n },\n },\n failed: {\n type: 'final',\n },\n },\n})\n","import {Sanity} from '../types'\n\nconst fetcher =\n (deploymentTarget: Sanity.DeploymentTarget) =>\n async (url: string, extraParams?: URLSearchParams) => {\n const params = new URLSearchParams()\n params.set('projectId', deploymentTarget.projectId)\n if (deploymentTarget.teamId) {\n params.set('teamId', deploymentTarget.teamId)\n }\n\n if (extraParams) {\n for (const [k, v] of extraParams.entries()) {\n params.append(k, v)\n }\n }\n\n const response = await fetch(`${url}?${params.toString()}`, {\n headers: {\n Authorization: `Bearer ${deploymentTarget.token}`,\n },\n })\n\n // Manually throw on non-OK responses for react-query\n // https://react-query.tanstack.com/guides/query-functions#usage-with-fetch-and-others-clients-that-do-not-throw-by-default\n if (!response.ok) {\n throw new Error('Response not OK')\n }\n\n try {\n return response.json()\n } catch (err) {\n throw new Error(err as string)\n }\n }\n\nexport default fetcher\n","import hash from 'object-hash'\nimport {useQuery} from '@tanstack/react-query'\n\nimport fetcher from '../utils/fetcher'\nimport {API_ENDPOINT_ALIASES, API_ENDPOINT_DEPLOYMENTS} from '../constants'\nimport {Sanity, Vercel} from '../types'\n\ntype Options = {\n enabled?: boolean\n}\n\nconst useDeployments = (deploymentTarget: Sanity.DeploymentTarget, options?: Options) => {\n const fetchUrl = fetcher(deploymentTarget)\n\n // Fetch deployments\n const deployParams = new URLSearchParams()\n deployParams.set('limit', String(deploymentTarget?.deployLimit))\n\n const {\n data: deploymentsData,\n isFetching: deploymentsIsFetching,\n isSuccess: deploymentsIsSuccess,\n error: deploymentsError,\n refetch,\n } = useQuery<{deployments: Vercel.Deployment[]}, Error>({\n queryKey: [hash(deploymentTarget)],\n queryFn: () => fetchUrl(API_ENDPOINT_DEPLOYMENTS, deployParams),\n enabled: options?.enabled ?? true,\n refetchInterval: 20000, // ms\n refetchIntervalInBackground: false,\n refetchOnMount: true,\n refetchOnReconnect: 'always',\n refetchOnWindowFocus: false,\n retry: false,\n })\n\n // Fetch aliases (only if deployments have been retrieved)\n const aliasParams = new URLSearchParams()\n aliasParams.set('limit', '20')\n\n const {\n data: aliasesData,\n isFetching: aliasesIsFetching,\n isSuccess: aliasesIsSuccess,\n error: aliasesError,\n } = useQuery<\n {\n aliases: Vercel.Alias[]\n pagination: {\n count: number\n next?: number\n prev?: number\n }\n },\n Error\n >({\n queryKey: [hash(deploymentTarget), 'aliases'],\n queryFn: () => fetchUrl(API_ENDPOINT_ALIASES, aliasParams),\n enabled: !!deploymentsData,\n refetchOnMount: false,\n refetchOnReconnect: false,\n refetchOnWindowFocus: false,\n retry: false,\n })\n\n const aliases = aliasesData?.aliases as Vercel.Alias[]\n\n let deploymentsWithAlias: Vercel.DeploymentWithAlias[] | undefined\n\n if (aliases) {\n deploymentsWithAlias = deploymentsData?.deployments?.map((val: Vercel.DeploymentWithAlias) => {\n const alias = aliases.find((a) => a.deploymentId === val.uid)\n return {\n ...val,\n alias: alias?.alias,\n }\n })\n }\n\n return {\n deployments: deploymentsWithAlias,\n error: aliasesError || deploymentsError,\n isFetching: aliasesIsFetching || deploymentsIsFetching,\n isSuccess: aliasesIsSuccess && deploymentsIsSuccess,\n refetch,\n }\n}\n\nexport default useDeployments\n","import {setup} from 'xstate'\n\ntype Event = {type: 'ERROR'} | {type: 'REFRESH'} | {type: 'REFRESHED'} | {type: 'RETRY'}\n\nconst refreshMachine = setup({\n types: {\n events: {} as Event,\n },\n}).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QAoC2BDAxgCwJYDswBKAOlwgBswBiAJQFEAxBgZQAkBtABgF1FQADgHtYuAC64h+fiAAeiAIwAmAGwkuGrkoAsAZhVKlAVm0KAHABoQAT0QBOJSRN27XFXaMmz2twF9fVmhYeISkAE5gAGYRsCFQ1PS0tADytNx8SCDCohJSMvIIPnYkxhpKXGZ22kY6xla2CAq6CiQudgDsRnYqKroVfe3+gRg4BMQkEdFwcXRMrGz0ACLpMtniktKZBUUlRmUVVTXadTaISrqObUY97QodvWa6QyBBo6ETUTHYkLPM9OwrTJrXKbUDbJTFLjtMzmWraOx3doqeqKMyOeHdXp3BTHXTVZ6vELjMBhMJCMK-eaAwQidZ5LaIY6Q6Gw47wxHI04IGEkDFma5NbTtY7ufwBED4IQQOAyQljIirWkg-KIAC0nIa6oJIyJpHIVEVOQ2KsKShRCDsunUGLcHi8PhU2uC8o+U1iBCghrpoLkZ2uTk0XCq7SRRl0Zg19itXHhIZ85lMEaUTre40mX0gXuVDIQnmKRhZKk6PmaVXN2PUaLsZhj2hUOJU-JTupIJLJYSzxpzeacheLXFL2nNrkrfW8SKFnhDYt8QA */\n initial: 'idle',\n states: {\n idle: {\n on: {\n REFRESH: {\n target: 'refreshing',\n },\n },\n },\n refreshing: {\n on: {\n ERROR: {\n target: 'error',\n },\n REFRESHED: {\n target: 'refreshed',\n },\n },\n },\n refreshed: {\n on: {\n REFRESH: {\n target: 'refreshing',\n },\n },\n },\n error: {\n on: {\n REFRESH: {\n target: 'refreshing',\n },\n },\n },\n },\n})\n\nexport default refreshMachine\n","import {useTheme} from '@sanity/ui'\n\nexport function useCardColor() {\n return useTheme().sanity.color.card.enabled\n}\n","import {Box, Label} from '@sanity/ui'\nimport React, {ReactNode} from 'react'\nimport {Sanity} from '../../types'\nimport {useCardColor} from '../../utils/useCardColor'\n\ntype Props = {\n children: ReactNode\n colSpan?: number\n header?: boolean\n variant?: 'age' | 'branch' | 'creator' | 'state'\n}\n\nconst TableCell = (props: Props) => {\n const {children, colSpan, header, variant} = props\n\n let display: Sanity.BoxDisplay | Sanity.BoxDisplay[] = 'table-cell'\n let cellWidth: string = 'auto'\n\n switch (variant) {\n case 'age':\n cellWidth = '50px'\n break\n case 'branch':\n cellWidth = '300px'\n display = ['none', 'none', 'none', 'table-cell']\n break\n case 'creator':\n cellWidth = '80px'\n break\n case 'state':\n cellWidth = '110px'\n display = ['none', 'none', 'none', 'none', 'table-cell']\n break\n default:\n break\n }\n\n const {border} = useCardColor()\n\n if (header) {\n return (\n <Box\n as=\"th\"\n colSpan={colSpan}\n // @ts-ignore\n display={display}\n paddingX={3}\n paddingY={2}\n style={{\n maxWidth: cellWidth,\n position: 'relative',\n textAlign: 'left',\n width: cellWidth,\n }}\n >\n <Label size={0}>{children}</Label>\n </Box>\n )\n }\n return (\n <Box\n as=\"td\"\n colSpan={colSpan}\n // @ts-ignore\n display={display}\n paddingX={3}\n paddingY={[2, 2, 3]}\n style={{\n borderTop: `1px solid ${border}`,\n maxWidth: cellWidth,\n position: 'relative',\n textAlign: 'left',\n width: cellWidth,\n }}\n >\n {children}\n </Box>\n )\n}\n\nexport default TableCell\n","import {Box} from '@sanity/ui'\nimport React from 'react'\n\nimport {VERCEL_STATUS_COLORS} from '../../constants'\nimport {Vercel} from '../../types'\n\ntype Props = {\n state: Vercel.DeploymentState\n}\n\nconst StatusDot = ({state}: Props) => (\n <Box\n style={{\n backgroundColor: `${VERCEL_STATUS_COLORS[state]}`,\n borderRadius: '20px',\n height: '9px',\n width: '9px',\n }}\n />\n)\n\nexport default StatusDot\n","import {Box, Flex, Stack, Text} from '@sanity/ui'\nimport React, {useRef} from 'react'\nimport ReactTimeAgo from 'react-time-ago'\n\nimport TableCell from '../TableCell'\nimport StatusDot from '../StatusDot'\nimport {LinkIcon} from '@sanity/icons'\nimport {Vercel} from '../../types'\n\ntype Props = {\n deployment: Vercel.DeploymentWithAlias\n}\n\nconst Deployment = (props: Props) => {\n const {deployment} = props\n\n const date = useRef(new Date(deployment.created))\n\n const commitMessage = deployment?.meta?.githubCommitMessage\n const commitRef = deployment?.meta?.githubCommitRef\n\n const targetUrl = deployment.alias ?? deployment.url\n\n return (\n <tr>\n {/* Deployment - alias or regular deployment URL */}\n <TableCell>\n <Flex align=\"center\">\n <Box\n display={['block', 'block', 'block', 'block', 'none']}\n marginRight={3}\n style={{flexShrink: 0}}\n >\n <StatusDot state={deployment.state} />\n </Box>\n\n {targetUrl ? (\n <>\n {/* Alias icon */}\n {deployment.alias && <LinkIcon />}\n\n <Box marginLeft={deployment.alias ? 1 : 0}>\n <Text\n muted={!(deployment.state === 'READY')}\n size={1}\n style={{\n textDecoration:\n deployment.state === 'CANCELED' || deployment.state === 'ERROR'\n ? 'line-through'\n : 'normal',\n }}\n textOverflow=\"ellipsis\"\n >\n {deployment.state === 'READY' ? (\n <a href={`https://${targetUrl}`} rel=\"noopener noreferrer\" target=\"_blank\">\n {targetUrl}\n </a>\n ) : (\n targetUrl\n )}\n </Text>\n </Box>\n </>\n ) : (\n <Text size={1}>Uploading...</Text>\n )}\n </Flex>\n </TableCell>\n\n {/* State */}\n <TableCell variant=\"state\">\n <Flex align=\"center\">\n <StatusDot state={deployment.state} />\n <Box marginLeft={2}>\n <Text size={1}>\n {deployment.state\n .trim()\n .toLowerCase()\n .replace(/^[a-z]/i, (t) => t.toUpperCase())}\n </Text>\n </Box>\n </Flex>\n </TableCell>\n\n {/* Branch */}\n <TableCell variant=\"branch\">\n <Stack space={2}>\n <Text size={1} textOverflow=\"ellipsis\">\n {commitRef}\n </Text>\n {commitMessage && (\n <Text muted size={1} textOverflow=\"ellipsis\">\n {commitMessage}\n </Text>\n )}\n </Stack>\n </TableCell>\n\n {/* Age */}\n <TableCell variant=\"age\">\n <Flex align=\"center\">\n <Text size={1}>\n <ReactTimeAgo date={date.current} locale=\"en-US\" timeStyle=\"mini\" />\n </Text>\n </Flex>\n </TableCell>\n\n {/* Creator */}\n <TableCell variant=\"creator\">\n <Flex align=\"center\" justify=\"center\">\n <img\n draggable={false}\n src={`https://vercel.com/api/www/avatar/${deployment?.creator?.uid}?&s=48`}\n style={{\n borderRadius: '20px',\n height: '20px',\n width: '20px',\n }}\n />\n </Flex>\n </TableCell>\n </tr>\n )\n}\n\nexport default Deployment\n","import {assign, setup, fromPromise} from 'xstate'\nimport {Vercel} from '../types'\n\ntype Context = {\n deployHook: string\n disabled: boolean\n feedback?: string\n label?: string\n error?: string\n}\n\ntype Event = {type: 'DEPLOY'}\n\ninterface DeployActorInput {\n deployHook: string\n}\n\nexport const deployMachine = setup({\n types: {\n context: {} as Context,\n events: {} as Event,\n input: {} as DeployActorInput,\n },\n actors: {\n deploy: fromPromise(async ({input, signal}: {input: DeployActorInput; signal: AbortSignal}) => {\n try {\n if (!input.deployHook) {\n throw new Error('No deployHook URL defined')\n }\n const res = await fetch(input.deployHook, {method: 'POST', signal})\n const data = await res.json()\n if (!res.ok) {\n const errorMessage = (data?.error as Vercel.Error).message || res.statusText\n throw errorMessage\n }\n } catch (err) {\n if (typeof err === 'string') {\n throw err\n }\n console.error('Unable to deploy with error:', err)\n throw new Error('Please check the developer console for more information')\n }\n }),\n },\n}).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QTABwDYHsCeA6AlhOmAMQAiAogAoAyA8gJoDaADALqKiqaz4Au+TADtOIAB6IATCxa4AnADYAHAHYArArUslAZjksNAGhDZEARk3yVmhSxVyHC-QBYAvq+MoMOXF6zZ8ISgSCGEwAiEAN0wAa3C-HwSAoIRA6IBjAEMBYVY2PNFuXhyRJHFENTMzXElFJSUzNTVnWx0FY1MESXVcZzUdM2k1OTUVBoV3TzR-X2mcQOCwACclzCXcDGyAMzWAW1nvPCSF1KjMLJK8grKi-kFS0AkESura5QamlpY2jvMB+QcDkqLH0wxYEw8ICSuFgAFd0uk4LByNR6Mx2IUeHdhKIns1ZN9BtYQVpRnJfl1JM55P1BnY1Ep9CpGpMoXM8MtVksUbRGNcuFiSriKs4CQNurYRgZ7BSGr1ASNupIzEo+kp3JChJgUPAyklMcV7sKEABadomRAmtQAhW2wE6VnQwjEA3Yh7lBDOSQUsxeqyaPoWYbWFSO9kHfwLV1CspPHSSHQ1ZyA1UKJzJlQ+iz+5oKewKWrfNyQ6FwhFI6NG2OINOSXDiypKAxtMyZi1dEE1Qk6L0FpTSUMl8OctaVnHVhC1+uDRvNhStin6XDaHQ9liSXTJiUa1xAA */\n id: 'deploy',\n initial: 'idle',\n context: ({input}) => ({\n disabled: false,\n feedback: undefined,\n label: undefined,\n error: undefined,\n deployHook: input.deployHook,\n }),\n states: {\n idle: {\n entry: assign({\n feedback: () => undefined,\n label: () => 'Deploy',\n }),\n on: {\n DEPLOY: {\n target: 'deploying',\n },\n },\n },\n deploying: {\n entry: assign({\n disabled: () => true,\n label: () => 'Deploying',\n }),\n exit: assign({\n disabled: () => false,\n label: () => 'Deploy',\n }),\n invoke: {\n src: 'deploy',\n input: ({context}) => ({deployHook: context.deployHook}),\n onDone: {\n target: 'success',\n },\n onError: {\n target: 'error',\n actions: assign({\n error: ({event}) => {\n if ('error' in event) {\n return event.error as unknown as string\n }\n return 'Unknown error'\n },\n }),\n },\n },\n },\n success: {\n entry: assign({\n feedback: () => 'Successfully started!',\n }),\n exit: assign({\n feedback: () => undefined,\n }),\n on: {\n DEPLOY: {\n target: 'deploying',\n },\n },\n },\n error: {\n on: {\n DEPLOY: {\n target: 'deploying',\n },\n },\n },\n },\n})\n","import {UploadIcon} from '@sanity/icons'\nimport {Box, Button, useToast} from '@sanity/ui'\nimport {useMachine} from '@xstate/react'\nimport React, {useEffect} from 'react'\n\nimport {WIDGET_NAME} from '../../constants'\nimport {deployMachine} from '../../machines/deploy'\nimport StateDebug from '../StateDebug'\n\ntype Props = {\n deployHook: string\n onDeploySuccess?: () => void\n targetName: string\n}\n\nconst DeployButton = (props: Props) => {\n const {deployHook, onDeploySuccess, targetName} = props\n\n const [deployState, deployStateTransition, deployStateInterpreter] = useMachine(deployMachine, {\n input: {deployHook},\n })\n\n const toast = useToast()\n\n const isError = deployState.matches('error')\n const isSuccess = deployState.matches('success')\n\n // Callbacks\n const handleDeploy = () => {\n deployStateTransition({type: 'DEPLOY'})\n }\n\n // Effects\n useEffect(() => {\n if (isError) {\n toast.push({\n closable: true,\n description: `Unable to queue deploy for ${targetName}: ${deployState.context.error}`,\n duration: 8000,\n status: 'error',\n title: WIDGET_NAME,\n })\n }\n\n if (isSuccess) {\n toast.push({\n closable: true,\n description: `Deploy queued for ${targetName}`,\n duration: 8000,\n status: 'success',\n title: WIDGET_NAME,\n })\n }\n }, [isError, isSuccess, toast, targetName, deployState.context.error])\n\n useEffect(() => {\n const subscription = deployStateInterpreter.subscribe((state) => {\n if (state.value === 'success') {\n if (onDeploySuccess) {\n onDeploySuccess()\n }\n }\n })\n\n return () => subscription.unsubscribe()\n }, [deployStateInterpreter, onDeploySuccess])\n\n return (\n <Box padding={3} style={{position: 'relative'}}>\n <StateDebug name=\"Deploy\" state={deployState} />\n\n <Button\n disabled={deployState.context.disabled}\n fontSize={1}\n icon={UploadIcon}\n mode=\"ghost\"\n onClick={handleDeploy}\n padding={3}\n text={`${deployState.context.label} ${targetName}`}\n tone=\"default\"\n />\n </Box>\n )\n}\n\nexport default DeployButton\n","import {Box} from '@sanity/ui'\nimport React from 'react'\nimport {useCardColor} from '../../utils/useCardColor'\n\nconst PlaceholderAvatar = () => {\n const {border} = useCardColor()\n return (\n <Box\n style={{\n backgroundColor: border,\n borderRadius: '20px',\n height: '20px',\n userSelect: 'none',\n width: '20px',\n }}\n />\n )\n}\n\nexport default PlaceholderAvatar\n","import {Box, Stack, Text} from '@sanity/ui'\nimport React from 'react'\nimport {useCardColor} from '../../utils/useCardColor'\n\ntype Props = {\n rows: number\n}\n\nconst PlaceholderText = (props: Props) => {\n const {rows} = props\n const {border} = useCardColor()\n return (\n <Box\n style={{\n backgroundColor: border,\n borderRadius: '3px',\n userSelect: 'none',\n width: '100%',\n }}\n >\n <Stack space={2}>\n {new Array(rows).fill(undefined).map((_, index) => (\n <Text key={index} size={1}>\n \n </Text>\n ))}\n </Stack>\n </Box>\n )\n}\n\nexport default PlaceholderText\n","import {Flex} from '@sanity/ui'\nimport React from 'react'\n\nimport PlaceholderAvatar from '../PlaceholderAvatar'\nimport PlaceholderText from '../PlaceholderText'\nimport TableCell from '../TableCell'\n\nconst DeploymentPlaceholder = () => {\n return (\n <tr>\n {/* Deployment - alias or regular deployment URL */}\n <TableCell>\n <PlaceholderText rows={1} />\n </TableCell>\n\n {/* State */}\n <TableCell variant=\"state\">\n <PlaceholderText rows={1} />\n </TableCell>\n\n {/* Branch */}\n <TableCell variant=\"branch\">\n <PlaceholderText rows={2} />\n </TableCell>\n\n {/* Age */}\n <TableCell variant=\"age\">\n <PlaceholderText rows={1} />\n </TableCell>\n\n {/* Creator */}\n <TableCell variant=\"creator\">\n <Flex justify=\"center\">\n <PlaceholderAvatar />\n </Flex>\n </TableCell>\n </tr>\n )\n}\n\nexport default DeploymentPlaceholder\n","import {Box, Text, useToast} from '@sanity/ui'\nimport {useMachine} from '@xstate/react'\nimport React, {useEffect, useRef} from 'react'\nimport useDeepCompareEffect from 'use-deep-compare-effect'\n\nimport {WIDGET_NAME} from '../../constants'\nimport useDeployments from '../../hooks/useDeployments'\nimport refreshMachine from '../../machines/refresh'\nimport Deployment from '../Deployment'\nimport DeployButton from '../DeployButton'\nimport DeploymentPlaceholder from '../DeploymentPlaceholder'\nimport StateDebug from '../StateDebug'\nimport TableCell from '../TableCell'\nimport {Sanity} from '../../types'\nimport {useCardColor} from '../../utils/useCardColor'\n\ntype Props = {\n deploymentTarget: Sanity.DeploymentTarget\n}\n\nconst Deployments = (props: Props) => {\n const {deploymentTarget} = props\n\n // Refs\n const refTimeout = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n // XState\n const [refreshState, refreshStateTransition] = useMachine(refreshMachine)\n\n // Fetch deployments - disable hook / auto-refetching on error state\n const {deployments, error, isFetching, isSuccess, refetch} = useDeployments(deploymentTarget, {\n enabled: !refreshState.matches('error'),\n })\n\n const toast = useToast()\n const isError = refreshState.matches('error')\n\n const handleDeploySuccess = () => {\n if (refTimeout.current) {\n clearTimeout(refTimeout.current)\n }\n refTimeout.current = setTimeout(() => {\n refetch({\n cancelRefetch: true,\n throwOnError: true,\n })\n }, 4000)\n }\n\n useEffect(() => {\n return () => {\n if (refTimeout.current) {\n clearTimeout(refTimeout.current)\n }\n }\n }, [])\n\n useEffect(() => {\n if (error) {\n refreshStateTransition({type: 'ERROR'})\n }\n\n if (isFetching) {\n refreshStateTransition({type: 'REFRESH'})\n }\n\n if (!isFetching && isSuccess) {\n refreshStateTransition({type: 'REFRESHED'})\n }\n }, [error, isFetching, isSuccess, refreshStateTransition])\n\n useDeepCompareEffect(() => {\n if (!refreshState.matches('refreshing')) {\n refreshStateTransition({type: 'REFRESH'})\n }\n }, [deploymentTarget])\n\n useDeepCompareEffect(() => {\n if (isError) {\n toast.push({\n closable: true,\n description: `Unable to fetch deployments for ${deploymentTarget.name}`,\n duration: 8000,\n status: 'error',\n title: WIDGET_NAME,\n })\n }\n }, [deploymentTarget, isError])\n\n const hasFetched = typeof deployments !== 'undefined'\n const hasDeployments = deployments && deployments.length > 0\n\n const {border} = useCardColor()\n return (\n <Box marginTop={3} style={{position: 'relative'}}>\n {/* xstate debug */}\n <StateDebug name=\"Refresh\" state={refreshState} />\n\n {!refreshState.matches('error') && (\n <>\n <Box\n as=\"table\"\n style={{\n borderBottom: `1px solid ${border}`,\n borderCollapse: 'collapse',\n display: 'table',\n tableLayout: 'fixed',\n width: '100%',\n }}\n >\n <Box as=\"thead\" style={{display: 'table-header-group'}}>\n <tr>\n {/* Deployment */}\n <TableCell header>Deployment</TableCell>\n\n {/* State */}\n <TableCell header variant=\"state\">\n State\n </TableCell>\n\n {/* Branch */}\n <TableCell header variant=\"branch\">\n Branch\n </TableCell>\n\n {/* Age */}\n <TableCell header variant=\"age\">\n Age\n </TableCell>\n\n {/* Creator */}\n <TableCell header variant=\"age\">\n Creator\n </TableCell>\n </tr>\n </Box>\n\n <Box as=\"tbody\" style={{display: 'table-header-group'}}>\n {/* Placeholders */}\n {!deployments &&\n new Array(deploymentTarget?.deployLimit)\n .fill(undefined)\n .map((_, index) => <DeploymentPlaceholder key={index} />)}\n {/* Deployments */}\n {hasDeployments &&\n deployments?.map((deployment) => (\n <Deployment deployment={deployment} key={deployment.uid} />\n ))}\n </Box>\n </Box>\n\n {/* No results */}\n {hasFetched && !hasDeployments && (\n <Box padding={3} style={{width: '100%'}}>\n <Text muted size={1}>\n No deployments found. Don't forget to specify a valid team ID if your project\n belongs to a team.\n </Text>\n </Box>\n )}\n </>\n )}\n\n {/* Error message */}\n {refreshState.matches('error') && (\n <Box padding={3}>\n <Text muted size={1}>\n Unable to fetch recent deployments. Please check your network and deployment settings.\n </Text>\n </Box>\n )}\n\n {/* Deploy button */}\n {!refreshState.matches('error') && deploymentTarget.deployHook && (\n <Box>\n <DeployButton\n deployHook={deploymentTarget.deployHook}\n onDeploySuccess={handleDeploySuccess}\n targetName={deploymentTarget.name}\n />\n </Box>\n )}\n </Box>\n )\n}\n\nexport default Deployments\n","import {EditIcon} from '@sanity/icons'\nimport {Box, Button, Flex, Text, Tooltip} from '@sanity/ui'\nimport React, {FC} from 'react'\n\nimport Deployments from '../Deployments'\nimport {Sanity} from '../../types'\n\ntype Props = {\n item: Sanity.DeploymentTarget\n onDialogEdit: (deploymentTarget: Sanity.DeploymentTarget) => void\n}\n\nconst DeploymentTarget: FC<Props> = (props: Props) => {\n const {item, onDialogEdit} = props\n\n const deploymentTarget = {\n deployHook: item.deployHook,\n deployLimit: item.deployLimit,\n name: item.name,\n projectId: item.projectId,\n teamId: item.teamId,\n token: item.token,\n } as Sanity.DeploymentTarget\n\n return (\n <Box style={{position: 'relative'}}>\n {/* Header */}\n <Flex align=\"center\" justify=\"space-between\" marginTop={2} paddingX={3}>\n <Text size={2}>{item.name}</Text>\n\n <Tooltip\n content={\n <Box padding={2}>\n <Text muted size={1}>\n Edit deployment target\n </Text>\n </Box>\n }\n placement=\"left\"\n >\n <Button fontSize={1} icon={EditIcon} mode=\"bleed\" onClick={() => onDialogEdit(item)} />\n </Tooltip>\n </Flex>\n\n {/* Content */}\n <Deployments deploymentTarget={deploymentTarget} />\n </Box>\n )\n}\n\nexport default DeploymentTarget\n","import React from 'react'\nimport {Stack} from '@sanity/ui'\n\nimport DeploymentTarget from '../DeploymentTarget'\nimport {Sanity} from '../../types'\n\ntype Props = {\n items: Sanity.DeploymentTarget[]\n onDialogEdit: (deploymentTarget: Sanity.DeploymentTarget) => void\n}\n\nconst DeploymentTargets = (props: Props) => {\n const {items, onDialogEdit} = props\n\n return (\n <Stack space={5}>\n {items?.map((item) => (\n <DeploymentTarget item={item} key={item._id} onDialogEdit={onDialogEdit} />\n ))}\n </Stack>\n )\n}\n\nexport default DeploymentTargets\n","import type {SanityClient} from 'sanity'\nimport {uuid} from '@sanity/uuid'\nimport {assertEvent, assign, fromPromise, setup} from 'xstate'\nimport type {Sanity} from '../types'\nimport {DEPLOYMENT_TARGET_DOCUMENT_TYPE} from '../constants'\n\ntype Context = {\n client: SanityClient\n document?: Sanity.DeploymentTarget\n id?: string\n formData?: Record<string, any>\n message: string\n}\n\ntype Event =\n | {type: 'CREATE'; formData: Record<string, any>}\n | {type: 'UPDATE'; id: string; formData: Record<string, any>}\n | {type: 'DELETE'; id: string}\n\ninterface Input {\n client: SanityClient\n}\n\nexport const formMachine = setup({\n types: {} as {\n children: {\n createDocumentActor: 'create document'\n updateDocumentActor: 'update document'\n deleteDocumentActor: 'delete document'\n }\n context: Context\n events: Event\n input: Input\n tags: 'busy'\n },\n actions: {\n setId: assign({\n id: ({event}) => {\n assertEvent(event, ['UPDATE', 'DELETE'])\n return event.id\n },\n }),\n setFormData: assign({\n formData: ({event}) => {\n assertEvent(event, ['CREATE', 'UPDATE'])\n return event.formData\n },\n }),\n setMessage: assign({\n message: ({event}) => {\n if (\n 'data' in event &&\n event.data &&\n typeof event.data === 'object' &&\n 'details' in event.data &&\n event.data.details &&\n typeof event.data.details === 'object' &&\n 'description' in event.data.details\n ) {\n return event.data.details.description as string\n }\n return 'An error occurred'\n },\n }),\n setDocument: assign({\n document: ({event}) => {\n // @ts-expect-error - fix typings later\n return event.output\n },\n }),\n },\n actors: {\n 'create document': fromPromise(\n ({input}: {input: Required<Pick<Context, 'client' | 'formData'>>}) => {\n return input.client.create({\n _id: `vercel.${uuid()}`,\n _type: DEPLOYMENT_TARGET_DOCUMENT_TYPE,\n ...input.formData,\n })\n }\n ),\n 'update document': fromPromise(\n ({input}: {input: Required<Pick<Context, 'client' | 'id' | 'formData'>>}) => {\n return input.client.patch(input.id).set(input.formData).commit()\n }\n ),\n 'delete document': fromPromise(({input}: {input: Required<Pick<Context, 'client' | 'id'>>}) => {\n return input.client.delete(input.id)\n }),\n },\n}).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QAoC2BDAxgCwJYDswBKAOlwgBswBiAYQCUBRAQQBVGBtABgF1FQADgHtYuAC64h+fiAAeiAIwBmAGwkuGjQFYALAE4AHACYdWgwYA0IAJ6IjKgOwkdXFUYVa9h-Ua5KAvv5WaFh4hKTkVNQAqgAKACJsnLwywqISUjLyCMpqmtr6xqbmVrYIBgokWvlGWkpaCgZeKoHBGDgExGSUNPGMADKM7Nx8SCBp4pLSY9m56vm6hiZmljaIOipqdXpcDk1aWiYqBlqtICEd4SSYAE5g6BL4UNQQUmBk+ABuQgDW77f3MRgeJCTAAV1QYHwYmYmDEQhuI1SIkmmRmiGOShIDiUOh0SiaCgUegcDj0pTsjhI5iMewUpPsTSMZwuYS6AIeBGeYBuNwRJAEFAeADMEahrncHsDQRCoTC4QikWMJhlpqBspjsbj8YTiaTyWsEKouNT6noiX5zUpiQEgud2mzSGCBBBOU8Xm8Pt8-iRna6gSDwZDobD4YiUsqUaqshiDFicXiCea9WSKeVKiSVIclEYlIY-BUWQ7Ok6XW7ubz+YKRWLfWWAzLg-Kw0rBFGpjGEJqEzrkyTU4b6ToSHojHos7VXEc6kXQiWSBAwFRHs9XoQvb93ovl9Kg3LQ4qI230h30V241rE7r+wayro1A4dO4VHotA5fPTTnbWfPt2AV9QPJ8jcApCmIoo3OKf4NnuIYKuGozHqiapyLG8bakmRI3mmpjxk0XAuEoXAHI+DgtGc+BCIu8BjD+4TIieaLqogAC0Khpmxs6XF0kRgAxyGdk+aYKLSVR7Fweg6A4IkGFwChcY6EqAly-HRmeY7DnSY5GHGL4qFwRhpjpJpmriDjVMRLgGAp84ckCECqaezEIHoObUuZuwKH4xGPgoRnmCQpmOAcqhmPJ37Flcfrlo5TGoQgY4mgYHkeAS+iqH5hqSc4dSuCo+I6SoSjvjZUX1pAsUodkrlGO51TSd5b46JlZRebVuG7IcjRmA05FtHOVzQSpkaMVVdivs4CibHGxg6biSg4ZsJD2AccaFEVGwOKVXTQRVI0CWeNV1Z5jW+WmujDj4HjmMRnhEttpBAQilWdkdyX1V5RFNS1iAEpU1pHER9JWjogSBEAA */\n context: ({input}) => ({\n client: input.client,\n formData: {},\n message: '',\n }),\n initial: 'idle',\n states: {\n idle: {\n on: {\n CREATE: {\n actions: ['setFormData'],\n target: 'creating',\n },\n UPDATE: {\n actions: ['setId', 'setFormData'],\n target: 'updating',\n },\n DELETE: {\n actions: 'setId',\n target: 'deleting',\n },\n },\n },\n creating: {\n tags: ['busy'],\n invoke: {\n src: 'create document',\n id: 'createDocumentActor',\n input: ({context}) => ({client: context.client, formData: context.formData!}),\n onDone: {actions: 'setDocument', target: 'created'},\n onError: {actions: 'setMessage', target: 'error'},\n },\n },\n created: {type: 'final'},\n updating: {\n tags: ['busy'],\n invoke: {\n src: 'update document',\n id: 'updateDocumentActor',\n input: ({context}) => ({\n client: context.client,\n id: context.id!,\n formData: context.formData!,\n }),\n onDone: {actions: 'setDocument', target: 'updated'},\n onError: {actions: 'setMessage', target: 'error'},\n },\n },\n updated: {type: 'final'},\n deleting: {\n tags: ['busy'],\n invoke: {\n src: 'delete document',\n id: 'deleteDocumentActor',\n input: ({context}) => ({client: context.client, id: context.id!}),\n onDone: {target: 'deleted'},\n onError: {actions: 'setMessage', target: 'error'},\n },\n },\n deleted: {type: 'final'},\n error: {type: 'final'},\n },\n})\n","// Recursively sanitize form data:\n// - convert empty strings, undefined values and empty arrays to null (to correctly unset / delete fields)\n// - trim whitespace on string fleids\n\ntype FormData = Record<string, any>\n\nconst sanitizeFormData = (formData: FormData): FormData => {\n return Object.keys(formData).reduce((acc: FormData, key) => {\n const val = formData[key]\n\n // TODO: refactor\n if (typeof val === 'object' && val !== null && val.constructor !== Array) {\n acc[key] = sanitizeFormData(val)\n } else if (val === '' || typeof val === 'undefined' || val?.length === 0) {\n acc[key] = null\n } else if (typeof val === 'string' && val) {\n acc[key] = formData[key].trim()\n } else {\n acc[key] = formData[key]\n }\n\n return acc\n }, {})\n}\n\nexport default sanitizeFormData\n","import {ErrorOutlineIcon} from '@sanity/icons'\nimport {Box, Inline, Text, Tooltip} from '@sanity/ui'\nimport React, {FC} from 'react'\nimport {FieldError} from 'react-hook-form'\nimport {styled} from 'styled-components'\n\ntype Props = {\n description?: string\n error?: FieldError\n label: string\n name: string\n}\n\nconst StyledErrorOutlineIcon = styled(ErrorOutlineIcon)(({theme}) => {\n return {\n color: theme.sanity.color.spot.red,\n }\n})\n\nconst FormFieldInputLabel: FC<Props> = (props: Props) => {\n const {description, error, label, name} = props\n\n return (\n <Box marginBottom={3}>\n {/* Label */}\n <Inline space={2}>\n <Text as=\"label\" htmlFor={name} size={1} weight=\"semibold\">\n {label}\n </Text>\n\n {/* Error icon + tooltip */}\n {error && (\n <Text size={1}>\n <Tooltip\n content={\n <Box padding={2}>\n <Text muted size={1}>\n <StyledErrorOutlineIcon style={{marginRight: '0.1em'}} />\n {error.message}\n </Text>\n </Box>\n }\n fallbackPlacements={['top', 'left']}\n placement=\"right\"\n portal\n >\n <StyledErrorOutlineIcon />\n </Tooltip>\n </Text>\n )}\n </Inline>\n\n {/* Description */}\n {description && (\n <Box marginY={3}>\n <Text htmlFor={name} muted size={1}>\n {description}\n </Text>\n </Box>\n )}\n </Box>\n )\n}\n\nexport default FormFieldInputLabel\n","import {Box, TextInput} from '@sanity/ui'\nimport React, {forwardRef} from 'react'\nimport {FieldError} from 'react-hook-form'\n\nimport FormFieldInputLabel from '../FormFieldInputLabel'\n\ntype Props = {\n description?: string\n disabled?: boolean\n error?: FieldError\n label: string\n name: string\n placeholder?: string\n value?: string\n onChange?: React.ChangeEventHandler<HTMLInputElement>\n onBlur?: React.FocusEventHandler<HTMLInputElement>\n}\n\nconst FormFieldInputText = forwardRef<HTMLInputElement, Props>((props: Props, ref) => {\n const {description, disabled, error, label, name, placeholder, value, onChange, onBlur} = props\n\n return (\n <Box>\n {/* Label */}\n <FormFieldInputLabel description={description} error={error} label={label} name={name} />\n {/* Input */}\n <TextInput\n autoComplete=\"off\"\n autoFocus\n defaultValue={value}\n disabled={disabled}\n id={name}\n name={name}\n placeholder={placeholder}\n onChange={onChange}\n onBlur={onBlur}\n ref={ref}\n />\n </Box>\n )\n})\n\nexport default FormFieldInputText\n","import type {SanityClient} from '@sanity/client'\nimport {API_VERSION} from './constants'\nimport {useClient} from 'sanity'\n\nexport function useSanityClient(): SanityClient {\n return useClient({apiVersion: API_VERSION})\n}\n","import {yupResolver} from '@hookform/resolvers/yup'\nimport {Box, Button, Dialog, Flex, Stack, useToast} from '@sanity/ui'\nimport {useActor} from '@xstate/react'\nimport React, {FC, useEffect} from 'react'\nimport {useForm} from 'react-hook-form'\nimport * as yup from 'yup'\n\nimport {Z_INDEX_DIALOG} from '../../constants'\nimport {formMachine} from '../../machines/form'\nimport sanitizeFormData from '../../utils/sanitizeFormData'\nimport FormFieldInputText from '../FormFieldInputText'\nimport {Sanity} from '../../types'\nimport {useSanityClient} from '../../client'\nimport {toPromise} from 'xstate'\n\ntype Props = {\n deploymentTarget?: Sanity.DeploymentTarget\n onClose: () => void\n onCreate?: (deploymentTarget: Sanity.DeploymentTarget) => void\n onDelete?: (id: string) => void\n onUpdate?: (deploymentTarget: Sanity.DeploymentTarget) => void\n}\n\ntype FormData = yup.InferType<typeof formSchema>\n\nconst formSchema = yup.object().shape({\n deployHook: yup.string().url('Deploy hook must be a valid URL'),\n deployLimit: yup\n .number()\n .positive()\n .integer()\n .min(1, 'Deploy limit must no less than 1')\n .max(15, 'Deploy limit must no higher than 15')\n .typeError('Deploy limit must be a number')\n .required('Deploy limit must be a positive integer between 1 and 15'),\n name: yup.string().required('Name cannot be empty'),\n projectId: yup.string().required('Vercel Project ID cannot be empty'),\n teamId: yup.string(),\n token: yup.string().required('Vercel Account Token cannot be empty'),\n})\n\nconst DialogForm: FC<Props> = (props: Props) => {\n const {deploymentTarget, onClose, onCreate, onDelete, onUpdate} = props\n const client = useSanityClient()\n const toast = useToast()\n\n const [formState, formStateTransition, formStateActorRef] = useActor(formMachine, {\n input: {client},\n })\n\n const formUpdating = formState.hasTag('busy')\n\n // react-hook-form v7\n const {\n formState: {errors, isDirty, isValid},\n handleSubmit,\n register,\n } = useForm<FormData>({\n // @ts-expect-error - fix typings later\n defaultValues: {\n deployHook: deploymentTarget?.deployHook || '',\n deployLimit: deploymentTarget?.deployLimit || 5,\n name: deploymentTarget?.name || '',\n projectId: deploymentTarget?.projectId || '',\n teamId: deploymentTarget?.teamId || '',\n token: deploymentTarget?.token || '',\n },\n mode: 'onChange',\n resolver: yupResolver(formSchema),\n })\n\n /**\n * Handle errors and reaching the done state\n */\n useEffect(() => {\n if (formState.matches('error')) {\n toast.push({\n status: 'error',\n title: formState.context.message || 'An error occurred',\n })\n }\n /**\n * If the machine is done it means it reached updated, created, deleted or error state.\n * We don't care which one, we just want to close the dialog\n */\n if (formState.status === 'done') {\n onClose()\n }\n }, [formState, onClose, toast])\n\n // Callbacks\n // - submit react-hook-form\n const onSubmit = async (formData: FormData) => {\n const sanitizedFormData = sanitizeFormData(formData)\n if (deploymentTarget) {\n formStateTransition({type: 'UPDATE', id: deploymentTarget._id, formData: sanitizedFormData})\n } else {\n formStateTransition({type: 'CREATE', formData: sanitizedFormData})\n }\n await toPromise(formStateActorRef)\n const snapshot = formStateActorRef.getSnapshot()\n const {document} = snapshot.context\n if (!document) return\n if (snapshot.matches('created')) {\n onCreate?.(document)\n } else if (snapshot.matches('updated')) {\n onUpdate?.(document)\n }\n }\n\n const handleDelete = async () => {\n const id = deploymentTarget!._id\n formStateTransition({type: 'DELETE', id})\n await toPromise(formStateActorRef)\n if (formStateActorRef.getSnapshot().matches('deleted')) {\n onDelete?.(id)\n }\n }\n\n return (\n <Dialog\n footer={\n <Box padding={3}>\n <Flex justify={deploymentTarget ? 'space-between' : 'flex-end'}>\n {/* Delete button */}\n {deploymentTarget && (\n <Button\n loading={formState.matches('deleting')}\n disabled={formUpdating}\n fontSize={1}\n mode=\"bleed\"\n onClick={handleDelete}\n text=\"Delete\"\n tone=\"critical\"\n />\n )}\n\n {/* Submit button */}\n <Button\n loading={formState.matches('creating') || formState.matches('updating')}\n disabled={!isDirty || !isValid}\n fontSize={1}\n onClick={handleSubmit(onSubmit)}\n text={deploymentTarget ? 'Update and close' : 'Create'}\n tone=\"primary\"\n />\n </Flex>\n </Box>\n }\n header={`${deploymentTarget ? 'Edit' : 'Create'} deployment target`}\n id=\"create\"\n onClose={onClose}\n width={1}\n zOffset={Z_INDEX_DIALOG}\n >\n {/* We reverse direction to ensure that inline links dont autofocus before other form elements */}\n <Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n {/* Hidden button to enable enter key submissions */}\n <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n {/* Form fields */}\n <Stack space={5}>\n {/* Title */}\n <FormFieldInputText\n disabled={formUpdating}\n description=\"Name displayed in this plugin (e.g. production, staging)\"\n error={errors?.name}\n label=\"Name\"\n // @ts-expect-error - fix typings later\n {...register('name')}\n />\n\n <FormFieldInputText\n disabled={formUpdating}\n error={errors?.token}\n label=\"Vercel Account Token\"\n // @ts-expect-error - fix typings later\n {...register('token')}\n />\n\n <FormFieldInputText\n disabled={formUpdating}\n error={errors?.projectId}\n label=\"Vercel Project ID\"\n // @ts-expect-error - fix typings later\n {...register('projectId')}\n />\n\n <FormFieldInputText\n description=\"Required only if your project is owned by a team account\"\n disabled={formUpdating}\n error={errors?.teamId}\n label=\"Vercel Team ID (optional)\"\n // @ts-expect-error - fix typings later\n {...register('teamId')}\n />\n\n <FormFieldInputText\n description=\"Enter a valid deploy hook URL to enable manual deploys\"\n disabled={formUpdating}\n error={errors?.deployHook}\n label=\"Vercel Deploy Hook (optional)\"\n // @ts-expect-error - fix typings later\n {...register('deployHook')}\n />\n\n <FormFieldInputText\n disabled={formUpdating}\n error={errors?.deployLimit}\n label=\"Number of deploys to display\"\n // @ts-expect-error - fix typings later\n {...register('deployLimit', {valueAsNumber: true})}\n />\n </Stack>\n </Box>\n </Dialog>\n )\n}\n\nexport default DialogForm\n","import {assertEvent, assign, setup} from 'xstate'\nimport {Sanity} from '../types'\n\ntype Context = {\n editDeploymentTarget?: Sanity.DeploymentTarget\n}\n\ntype Event =\n | {type: 'CREATE'}\n | {type: 'CLOSE'}\n | {type: 'EDIT'; deploymentTarget: Sanity.DeploymentTarget}\n\nexport const dialogMachine = setup({\n types: {\n context: {} as Context,\n events: {} as Event,\n },\n actions: {\n setEditDeploymentTarget: assign({\n editDeploymentTarget: ({event}) => {\n assertEvent(event, 'EDIT')\n return event.deploymentTarget\n },\n }),\n },\n}).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QAoC2BDAxgCwJYDswBKAOlwgBswBiAYQCUBRAQQBVGBtABgF1FQADgHtYuAC64h+fiAAeiAEwKArCQCcANgAcAdmUbNOhVx0BGLQBoQAT0SmAzApJcXXexoAsW5fbWaFAL4BVmhYeISk5FTUjAAiAJKs3HxIIMKiElIy8ghKqpq6+obGZpY2ivb2zq4e5moeXKZc3kEhGDgExCSQ4nQAMgDyAMqcvDLp4pLSqTn2DSQefn7uyq5aWvZWtgjmTqsuvnU6XMoK9q0goR0RJJgATmDoYjS0gyPJ4yKTWTOIc1wLJZqFZrDZbRBaUwkfZuew6SFcepuILBED4IQQOAyK7hYifDJTbKIAC0GnBCFJFxxnUilDA+O+01AOQ8CnJGxIGn29lMpjUxhcCh0VPauNIPTEDMyTLkiA8PhIxh5Cg8DS8pgM5L5UOalSMah0cP05hFYRptweT3pqQm0qJCHlVSVphVashmvKCDUAN17j0XNMqrUyhRASAA */\n context: {\n editDeploymentTarget: undefined,\n },\n initial: 'idle',\n states: {\n idle: {\n entry: assign({\n editDeploymentTarget: () => undefined,\n }),\n on: {\n CREATE: {\n target: 'create',\n },\n EDIT: {\n actions: 'setEditDeploymentTarget',\n target: 'edit',\n },\n },\n },\n edit: {\n on: {\n CLOSE: {\n target: 'idle',\n },\n },\n },\n create: {\n on: {\n CLOSE: {\n target: 'idle',\n },\n },\n },\n },\n})\n","import {AddIcon} from '@sanity/icons'\nimport {Box, Button, Card, Flex, Text, ToastProvider, Tooltip} from '@sanity/ui'\nimport {useMachine} from '@xstate/react'\nimport React from 'react'\nimport {QueryClient, QueryClientProvider} from '@tanstack/react-query'\n\nimport StateDebug from './components/StateDebug'\nimport {Z_INDEX_TOAST_PROVIDER} from './constants'\nimport {deploymentTargetListMachine} from './machines/deploymentTargetList'\nimport DeploymentTargets from './components/DeploymentTargets'\nimport DialogForm from './components/DialogForm'\nimport {dialogMachine} from './machines/dialog'\nimport {Sanity} from './types'\nimport {useSanityClient} from './client'\n\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n gcTime: 0,\n staleTime: 0,\n },\n },\n})\n\nconst Widget = () => {\n const client = useSanityClient()\n\n const [deploymentTargetListState, deploymentTargetListStateTransition] = useMachine(\n deploymentTargetListMachine,\n {input: {client}}\n )\n const [dialogState, dialogStateTransition] = useMachine(dialogMachine)\n\n // Callbacks\n const handleDialogClose = () => {\n dialogStateTransition({type: 'CLOSE'})\n }\n const handleDialogShowCreate = () => {\n dialogStateTransition({type: 'CREATE'})\n }\n const handleDialogShowEdit = (deploymentTarget: Sanity.DeploymentTarget) => {\n dialogStateTransition({type: 'EDIT', deploymentTarget})\n }\n const handleTargetCreate = (deploymentTarget: Sanity.DeploymentTarget) => {\n deploymentTargetListStateTransition({type: 'CREATE', deploymentTarget})\n }\n const handleTargetDelete = (id: string) => {\n deploymentTargetListStateTransition({type: 'DELETE', id})\n }\n const handleTargetUpdate = (deploymentTarget: Sanity.DeploymentTarget) => {\n deploymentTargetListStateTransition({type: 'UPDATE', deploymentTarget})\n }\n\n return (\n <ToastProvider zOffset={Z_INDEX_TOAST_PROVIDER}>\n <QueryClientProvider client={queryClient}>\n <Card radius={2} style={{overflow: 'hidden '}}>\n {/* xstate debug */}\n <StateDebug name=\"List\" state={deploymentTargetListState} />\n\n {/* Header */}\n <Flex align=\"center\" justify=\"space-between\" paddingX={3} paddingY={2}>\n <Text size={5} weight=\"semibold\">\n Vercel deployments\n </Text>\n\n <Tooltip\n content={\n <Box padding={2}>\n <Text muted size={1}>\n Create new deployment target\n </Text>\n </Box>\n }\n placement=\"left\"\n >\n <Button fontSize={1} icon={AddIcon} onClick={handleDialogShowCreate} mode=\"bleed\" />\n </Tooltip>\n </Flex>\n\n <Box>\n {deploymentTargetListState.matches('pending') && (\n <Box paddingX={3} paddingY={4}>\n <Text>Loading...</Text>\n </Box>\n )}\n\n {deploymentTargetListState.matches({ready: 'withoutData'}) && (\n <Box paddingX={3} paddingY={4}>\n <Text>\n No deployment targets found.{' '}\n <a onClick={handleDialogShowCreate} style={{cursor: 'pointer'}}>\n Create a new target?\n </a>\n </Text>\n </Box>\n )}\n\n {deploymentTargetListState.matches({ready: 'withData'}) && (\n <DeploymentTargets\n items={deploymentTargetListState.context.results}\n onDialogEdit={handleDialogShowEdit}\n />\n )}\n\n {deploymentTargetListState.matches('failed') && (\n <Box paddingX={3} paddingY={4}>\n <Text>\n Failed to retrieve deployment targets. Please check the developer console log for\n more information.\n </Text>\n </Box>\n )}\n </Box>\n </Card>\n\n {/* Dialogs */}\n {dialogState.matches('create') && (\n <DialogForm onClose={handleDialogClose} onCreate={handleTargetCreate} />\n )}\n\n {dialogState.matches('edit') && (\n <DialogForm\n deploymentTarget={dialogState.context.editDeploymentTarget}\n onClose={handleDialogClose}\n onDelete={handleTargetDelete}\n onUpdate={handleTargetUpdate}\n />\n )}\n </QueryClientProvider>\n </ToastProvider>\n )\n}\n\nexport default Widget\n","import Widget from './app'\n\n// Initialize `javascript-time-ago` locale (required for react-time-ago)\nimport TimeAgo from 'javascript-time-ago'\nimport en from 'javascript-time-ago/locale/en'\nimport {DashboardWidget, type LayoutConfig} from '@sanity/dashboard'\n\nTimeAgo.addDefaultLocale(en)\n\nexport function vercelWidget(config: {layout?: LayoutConfig} = {}): DashboardWidget {\n return {\n name: 'vercel',\n component: Widget,\n layout: config.layout ?? {width: 'full'},\n }\n}\n"],"names":["setup","assign","assertEvent","fromPromise","useQuery","hash","useTheme","jsx","Box","Label","useRef","jsxs","Flex","Fragment","LinkIcon","Text","Stack","ReactTimeAgo","useMachine","useToast","useEffect","Button","UploadIcon","useDeepCompareEffect","Tooltip","EditIcon","uuid","styled","ErrorOutlineIcon","Inline","forwardRef","TextInput","useClient","yup","useActor","useForm","yupResolver","toPromise","Dialog","QueryClient","ToastProvider","QueryClientProvider","Card","AddIcon","TimeAgo","en"],"mappings":"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"}
|