sanity-plugin-dashboard-widget-vercel
4.0.284.0.29
dist/index.js.map~
dist/index.js.mapModified+1−1
Index: package/dist/index.js.map
===================================================================
--- package/dist/index.js.map
+++ package/dist/index.js.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.js","names":["{apiVersion: API_VERSION}","fetcher(deploymentTarget)","deployLimit","hash(deploymentTarget)","[hash(deploymentTarget)]","() => fetchUrl(API_ENDPOINT_DEPLOYMENTS, deployParams)","{\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 }","options?.enabled ?? true","[hash(deploymentTarget), 'aliases']","() => fetchUrl(API_ENDPOINT_ALIASES, aliasParams)","{\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 }","!!deploymentsData","deploymentsData?.deployments?.map((val: Vercel.DeploymentWithAlias) => {\n const alias = aliases.find((a) => a.deploymentId === val.uid)\n return Object.assign(val, {alias: alias?.alias})\n })","deployments","{\n deployments: deploymentsWithAlias,\n error: aliasesError || deploymentsError,\n isFetching: aliasesIsFetching || deploymentsIsFetching,\n isSuccess: aliasesIsSuccess && deploymentsIsSuccess,\n refetch,\n }","aliasesError || deploymentsError","aliasesIsFetching || deploymentsIsFetching","aliasesIsSuccess && deploymentsIsSuccess","{border: color.border}","border","{\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 }","<Text size={0}>Name: {name}</Text>","JSON.stringify(state.value)","value","<Text size={0}>state.value: {JSON.stringify(state.value)}</Text>","<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 gap={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 input: {deployHook},\n }","deployState.matches('error')","deployState.matches('success')","() => {\n deployStateTransition({type: 'DEPLOY'})\n }","() => {\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]","error","() => {\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]","{position: 'relative'}","<StateDebug name=\"Deploy\" state={deployState} />","<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 />","disabled","`${deployState.context.label} ${targetName}`","<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>","{state}: Props","<Box\n style={{\n backgroundColor: VERCEL_STATUS_COLORS[state],\n borderRadius: '20px',\n height: '9px',\n width: '9px',\n }}\n />","VERCEL_STATUS_COLORS[state]","['none', 'none', 'none', 'table-cell']","['none', 'none', 'none', 'none', 'table-cell']","{\n maxWidth: cellWidth,\n position: 'relative',\n textAlign: 'left',\n width: cellWidth,\n }","<Label size={0}>{children}</Label>","<Box\n as=\"th\"\n colSpan={colSpan}\n // @ts-expect-error -- local `display` allows 'table-cell', which is not part of @sanity/ui's `BoxDisplay` union\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>","[2, 2, 3]","{\n borderTop: `1px solid ${border}`,\n maxWidth: cellWidth,\n position: 'relative',\n textAlign: 'left',\n width: cellWidth,\n }","`1px solid ${border}`","<Box\n as=\"td\"\n colSpan={colSpan}\n // @ts-expect-error -- local `display` allows 'table-cell', which is not part of @sanity/ui's `BoxDisplay` union\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>","new Date(deployment.created)","created","useMemo(() => new Date(deployment.created), [deployment.created])","'githubCommitMessage'","'githubCommitRef'","['block', 'block', 'block', 'block', 'none']","{flexShrink: 0}","<Box\n display={['block', 'block', 'block', 'block', 'none']}\n marginRight={3}\n style={{flexShrink: 0}}\n >\n <StatusDot state={deployment.state} />\n </Box>","state","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 )","alias","<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>","<StatusDot state={deployment.state} />","deployment.state\n .trim()\n .toLowerCase()\n .replace(/^[a-z]/i, (t) => t.toUpperCase())","/^[a-z]/i","(t) => t.toUpperCase()","<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>","<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>","<Text size={1} textOverflow=\"ellipsis\">\n {commitRef}\n </Text>","commitMessage && (\n <Text muted size={1} textOverflow=\"ellipsis\">\n {commitMessage}\n </Text>\n )","<TableCell variant=\"branch\">\n <Stack gap={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>","<TableCell variant=\"age\">\n <Flex align=\"center\">\n <Text size={1}>\n <ReactTimeAgo date={date} locale=\"en-US\" timeStyle=\"mini\" />\n </Text>\n </Flex>\n </TableCell>","{\n borderRadius: '20px',\n height: '20px',\n width: '20px',\n }","<TableCell variant=\"creator\">\n <Flex align=\"center\" justify=\"center\">\n <img\n alt={deployment?.creator?.username || 'Deployment creator avatar'}\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>","deployment?.creator?.username || 'Deployment creator avatar'","`https://vercel.com/api/www/avatar/${deployment?.creator?.uid}?&s=48`","<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 gap={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} 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 alt={deployment?.creator?.username || 'Deployment creator avatar'}\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>","<Box\n style={{\n backgroundColor: border,\n borderRadius: '20px',\n height: '20px',\n userSelect: 'none',\n width: '20px',\n }}\n />","{\n backgroundColor: border,\n borderRadius: '3px',\n userSelect: 'none',\n width: '100%',\n }","<Stack gap={2}>\n {Array.from({length: rows}, (_, index) => (\n <Text key={index} size={1}>\n \n </Text>\n ))}\n </Stack>","(_, index) => (\n <Text key={index} size={1}>\n \n </Text>\n )","<Box\n style={{\n backgroundColor: border,\n borderRadius: '3px',\n userSelect: 'none',\n width: '100%',\n }}\n >\n <Stack gap={2}>\n {Array.from({length: rows}, (_, index) => (\n <Text key={index} size={1}>\n \n </Text>\n ))}\n </Stack>\n </Box>","<TableCell>\n <PlaceholderText rows={1} />\n </TableCell>","<TableCell variant=\"state\">\n <PlaceholderText rows={1} />\n </TableCell>","<TableCell variant=\"branch\">\n <PlaceholderText rows={2} />\n </TableCell>","<TableCell variant=\"age\">\n <PlaceholderText rows={1} />\n </TableCell>","<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>","refreshState.matches('error')","{\n enabled: !refreshState.matches('error'),\n }","!refreshState.matches('error')","() => {\n if (refTimeout.current) {\n clearTimeout(refTimeout.current)\n }\n refTimeout.current = setTimeout(() => {\n void refetch({\n cancelRefetch: true,\n throwOnError: true,\n })\n }, 4000)\n }","() => {\n return () => {\n if (refTimeout.current) {\n clearTimeout(refTimeout.current)\n }\n }\n }","[]","() => {\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 if (!refreshState.matches('refreshing')) {\n refreshStateTransition({type: 'REFRESH'})\n }\n }","[deploymentTarget]","() => {\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.name","[deploymentTarget, isError]","{position: 'relative'}","<StateDebug name=\"Refresh\" state={refreshState} />","!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=\"creator\">\n Creator\n </TableCell>\n </tr>\n </Box>\n\n <Box as=\"tbody\" style={{display: 'table-row-group'}}>\n {/* Placeholders */}\n {!deployments &&\n Array.from({length: deploymentTarget.deployLimit}, (_, index) => (\n <DeploymentPlaceholder key={index} />\n ))}\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 )","deploymentTarget.deployLimit","(_, index) => (\n <DeploymentPlaceholder key={index} />\n )","(deployment) => (\n <Deployment deployment={deployment} key={deployment.uid} />\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 )","!refreshState.matches('error') && deploymentTarget.deployHook && (\n <Box>\n <DeployButton\n deployHook={deploymentTarget.deployHook}\n onDeploySuccess={handleDeploySuccess}\n targetName={deploymentTarget.name}\n />\n </Box>\n )","deploymentTarget.deployHook","<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=\"creator\">\n Creator\n </TableCell>\n </tr>\n </Box>\n\n <Box as=\"tbody\" style={{display: 'table-row-group'}}>\n {/* Placeholders */}\n {!deployments &&\n Array.from({length: deploymentTarget.deployLimit}, (_, index) => (\n <DeploymentPlaceholder key={index} />\n ))}\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 deployHook: item.deployHook,\n deployLimit: item.deployLimit,\n name: item.name,\n projectId: item.projectId,\n teamId: item.teamId,\n token: item.token,\n }","deployHook","deployLimit","name","projectId","teamId","token","{position: 'relative'}","<Text size={2}>{item.name}</Text>","<Box padding={2}>\n <Text muted size={1}>\n Edit deployment target\n </Text>\n </Box>","<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>","<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>","<Deployments deploymentTarget={deploymentTarget} />","<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>","items?.map((item) => (\n <DeploymentTarget item={item} key={item._id} onDialogEdit={onDialogEdit} />\n ))","items?.map","<Stack gap={5}>\n {items?.map((item) => (\n <DeploymentTarget item={item} key={item._id} onDialogEdit={onDialogEdit} />\n ))}\n </Stack>","<Text as=\"label\" htmlFor={name} size={1} weight=\"semibold\">\n {label}\n </Text>","error && (\n <Text size={1}>\n <Tooltip\n content={\n <Box padding={2}>\n <Text muted size={1}>\n <ErrorOutlineIcon style={{...errorIconStyle, marginRight: '0.1em'}} />\n {error.message}\n </Text>\n </Box>\n }\n fallbackPlacements={['top', 'left']}\n placement=\"right\"\n portal\n >\n <ErrorOutlineIcon style={errorIconStyle} />\n </Tooltip>\n </Text>\n )","<Inline gap={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 <ErrorOutlineIcon style={{...errorIconStyle, marginRight: '0.1em'}} />\n {error.message}\n </Text>\n </Box>\n }\n fallbackPlacements={['top', 'left']}\n placement=\"right\"\n portal\n >\n <ErrorOutlineIcon style={errorIconStyle} />\n </Tooltip>\n </Text>\n )}\n </Inline>","description && (\n <Box marginY={3}>\n <Text as=\"p\" muted size={1}>\n {description}\n </Text>\n </Box>\n )","<Box marginBottom={3}>\n {/* Label */}\n <Inline gap={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 <ErrorOutlineIcon style={{...errorIconStyle, marginRight: '0.1em'}} />\n {error.message}\n </Text>\n </Box>\n }\n fallbackPlacements={['top', 'left']}\n placement=\"right\"\n portal\n >\n <ErrorOutlineIcon style={errorIconStyle} />\n </Tooltip>\n </Text>\n )}\n </Inline>\n\n {/* Description */}\n {description && (\n <Box marginY={3}>\n <Text as=\"p\" muted size={1}>\n {description}\n </Text>\n </Box>\n )}\n </Box>","<FormFieldInputLabel description={description} error={error} label={label} name={name} />","<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 />","<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 input: {client},\n }","formState.hasTag('busy')","{\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 }","deploymentTarget?.deployHook || ''","deploymentTarget?.deployLimit || 5","deploymentTarget?.name || ''","deploymentTarget?.projectId || ''","deploymentTarget?.teamId || ''","deploymentTarget?.token || ''","yupResolver(formSchema)","{\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 }","{errors, isDirty, isValid}","() => {\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]","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 }","async () => {\n if (!deploymentTarget) {\n return\n }\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 }","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 )","formState.matches('creating') || formState.matches('updating')","handleSubmit(onSubmit)","<Button\n loading={formState.matches('creating') || formState.matches('updating')}\n disabled={!isDirty || !isValid}\n fontSize={1}\n // @ts-expect-error - yup 0.32 schema types do not line up with @hookform/resolvers, fix typings later\n onClick={handleSubmit(onSubmit)}\n text={deploymentTarget ? 'Update and close' : 'Create'}\n tone=\"primary\"\n />","!isDirty || !isValid","deploymentTarget ? 'Update and close' : 'Create'","<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 // @ts-expect-error - yup 0.32 schema types do not line up with @hookform/resolvers, fix typings later\n onClick={handleSubmit(onSubmit)}\n text={deploymentTarget ? 'Update and close' : 'Create'}\n tone=\"primary\"\n />\n </Flex>\n </Box>","deploymentTarget ? 'space-between' : 'flex-end'","<button aria-label=\"Submit\" style={{display: 'none'}} tabIndex={-1} type=\"submit\" />","register('name')","<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 />","errors?.name","register('token')","<FormFieldInputText\n disabled={formUpdating}\n error={errors?.token}\n label=\"Vercel Account Token\"\n // @ts-expect-error - fix typings later\n {...register('token')}\n />","errors?.token","register('projectId')","<FormFieldInputText\n disabled={formUpdating}\n error={errors?.projectId}\n label=\"Vercel Project ID\"\n // @ts-expect-error - fix typings later\n {...register('projectId')}\n />","errors?.projectId","register('teamId')","<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 />","errors?.teamId","register('deployHook')","<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 />","errors?.deployHook","register('deployLimit', {valueAsNumber: true})","<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 />","errors?.deployLimit","<Stack gap={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>","<Box\n as=\"form\"\n padding={4}\n // @ts-expect-error - yup 0.32 schema types do not line up with @hookform/resolvers, fix typings later\n onSubmit={handleSubmit(onSubmit)}\n >\n {/* Hidden button to enable enter key submissions */}\n <button aria-label=\"Submit\" style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n {/* Form fields */}\n <Stack gap={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>","<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 // @ts-expect-error - yup 0.32 schema types do not line up with @hookform/resolvers, fix typings later\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\n as=\"form\"\n padding={4}\n // @ts-expect-error - yup 0.32 schema types do not line up with @hookform/resolvers, fix typings later\n onSubmit={handleSubmit(onSubmit)}\n >\n {/* Hidden button to enable enter key submissions */}\n <button aria-label=\"Submit\" style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n {/* Form fields */}\n <Stack gap={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>","`${deploymentTarget ? 'Edit' : 'Create'} deployment target`","{input: {client}}","() => {\n dialogStateTransition({type: 'CLOSE'})\n }","() => {\n dialogStateTransition({type: 'CREATE'})\n }","(deploymentTarget: Sanity.DeploymentTarget) => {\n dialogStateTransition({type: 'EDIT', deploymentTarget})\n }","(deploymentTarget: Sanity.DeploymentTarget) => {\n deploymentTargetListStateTransition({type: 'CREATE', deploymentTarget})\n }","(id: string) => {\n deploymentTargetListStateTransition({type: 'DELETE', id})\n }","(deploymentTarget: Sanity.DeploymentTarget) => {\n deploymentTargetListStateTransition({type: 'UPDATE', deploymentTarget})\n }","{overflow: 'hidden '}","<StateDebug name=\"List\" state={deploymentTargetListState} />","<Text size={5} weight=\"semibold\">\n Vercel deployments\n </Text>","<Box padding={2}>\n <Text muted size={1}>\n Create new deployment target\n </Text>\n </Box>","<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>","deploymentTargetListState.matches('pending') && (\n <Box paddingX={3} paddingY={4}>\n <Text>Loading...</Text>\n </Box>\n )","deploymentTargetListState.matches({ready: 'withoutData'}) && (\n <Flex align=\"center\" gap={3} paddingX={3} paddingY={4}>\n <Text>No deployment targets found.</Text>\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleDialogShowCreate}\n text=\"Create a new target\"\n />\n </Flex>\n )","deploymentTargetListState.matches({ready: 'withData'}) && (\n <DeploymentTargets\n items={deploymentTargetListState.context.results}\n onDialogEdit={handleDialogShowEdit}\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 )","<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 <Flex align=\"center\" gap={3} paddingX={3} paddingY={4}>\n <Text>No deployment targets found.</Text>\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleDialogShowCreate}\n text=\"Create a new target\"\n />\n </Flex>\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>","<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 <Flex align=\"center\" gap={3} paddingX={3} paddingY={4}>\n <Text>No deployment targets found.</Text>\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleDialogShowCreate}\n text=\"Create a new target\"\n />\n </Flex>\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>","dialogState.matches('create') && (\n <DialogForm onClose={handleDialogClose} onCreate={handleTargetCreate} />\n )","dialogState.matches('edit') && (\n <DialogForm\n deploymentTarget={dialogState.context.editDeploymentTarget}\n onClose={handleDialogClose}\n onDelete={handleTargetDelete}\n onUpdate={handleTargetUpdate}\n />\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 <Flex align=\"center\" gap={3} paddingX={3} paddingY={4}>\n <Text>No deployment targets found.</Text>\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleDialogShowCreate}\n text=\"Create a new target\"\n />\n </Flex>\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>"],"sources":["../src/constants.ts","../src/client.ts","../src/utils/fetcher.ts","../src/hooks/useDeployments.ts","../src/machines/refresh.ts","../src/utils/useCardColor.ts","../src/machines/deploy.ts","../src/components/StateDebug/index.tsx","../src/components/DeployButton/index.tsx","../src/components/StatusDot/index.tsx","../src/components/TableCell/index.tsx","../src/components/Deployment/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/components/DialogForm/index.tsx","../src/machines/deploymentTargetList.ts","../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 {type SanityClient, useClient} from 'sanity'\n\nimport {API_VERSION} from './constants'\n\nexport function useSanityClient(): SanityClient {\n return useClient({apiVersion: API_VERSION})\n}\n","import {type Sanity} from '../types'\n\nconst fetcher =\n (deploymentTarget: Sanity.DeploymentTargetConfig) =>\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 await response.json()\n } catch (err) {\n throw new Error('Unable to parse response as JSON', {cause: err})\n }\n }\n\nexport default fetcher\n","import {useQuery} from '@tanstack/react-query'\nimport hash from 'object-hash'\n\nimport {API_ENDPOINT_ALIASES, API_ENDPOINT_DEPLOYMENTS} from '../constants'\nimport {type Sanity, type Vercel} from '../types'\nimport fetcher from '../utils/fetcher'\n\ntype Options = {\n enabled?: boolean\n}\n\nconst useDeployments = (deploymentTarget: Sanity.DeploymentTargetConfig, 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[]}>({\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 aliases: Vercel.Alias[]\n pagination: {\n count: number\n next?: number\n prev?: number\n }\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\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 Object.assign(val, {alias: alias?.alias})\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_v2} from '@sanity/ui'\n\nexport function useCardColor(): {border: string} {\n const {color} = useTheme_v2()\n return {border: color.border}\n}\n","import {assign, setup, fromPromise} from 'xstate'\n\nimport {type 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: {error?: Vercel.Error} | null = await res.json()\n if (!res.ok) {\n const errorMessage = data?.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', {cause: err})\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 const {error} = event\n if (typeof error === 'string') {\n return error\n }\n if (error instanceof Error) {\n return error.message\n }\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 {Box, Card, Stack, Text} from '@sanity/ui'\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 gap={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 {UploadIcon} from '@sanity/icons/Upload'\nimport {Box, Button} from '@sanity/ui'\nimport {useToast} from '@sanity/ui/toast'\nimport {useMachine} from '@xstate/react'\nimport {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'\n\nimport {VERCEL_STATUS_COLORS} from '../../constants'\nimport {type 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, Label} from '@sanity/ui'\nimport type {ReactNode} from 'react'\n\nimport {type 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-expect-error -- local `display` allows 'table-cell', which is not part of @sanity/ui's `BoxDisplay` union\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-expect-error -- local `display` allows 'table-cell', which is not part of @sanity/ui's `BoxDisplay` union\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 {LinkIcon} from '@sanity/icons/Link'\nimport {Box, Flex, Stack, Text} from '@sanity/ui'\nimport {useMemo} from 'react'\n// oxlint-disable-next-line import/no-unassigned-import\nimport 'react-time-ago/locale/en'\nimport ReactTimeAgo from 'react-time-ago'\n\nimport {type Vercel} from '../../types'\nimport StatusDot from '../StatusDot'\nimport TableCell from '../TableCell'\n\ntype Props = {\n deployment: Vercel.DeploymentWithAlias\n}\n\nconst Deployment = (props: Props) => {\n const {deployment} = props\n\n const date = useMemo(() => new Date(deployment.created), [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 gap={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} 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 alt={deployment?.creator?.username || 'Deployment creator avatar'}\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 {Box} from '@sanity/ui'\n\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'\n\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 gap={2}>\n {Array.from({length: rows}, (_, 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'\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} from '@sanity/ui'\nimport {useToast} from '@sanity/ui/toast'\nimport {useMachine} from '@xstate/react'\nimport {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 {type Sanity} from '../../types'\nimport {useCardColor} from '../../utils/useCardColor'\nimport DeployButton from '../DeployButton'\nimport Deployment from '../Deployment'\nimport DeploymentPlaceholder from '../DeploymentPlaceholder'\nimport StateDebug from '../StateDebug'\nimport TableCell from '../TableCell'\n\ntype Props = {\n deploymentTarget: Sanity.DeploymentTargetConfig\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 void 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=\"creator\">\n Creator\n </TableCell>\n </tr>\n </Box>\n\n <Box as=\"tbody\" style={{display: 'table-row-group'}}>\n {/* Placeholders */}\n {!deployments &&\n Array.from({length: deploymentTarget.deployLimit}, (_, index) => (\n <DeploymentPlaceholder key={index} />\n ))}\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/Edit'\nimport {Box, Button, Flex, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport type {FC} from 'react'\n\nimport {type Sanity} from '../../types'\nimport Deployments from '../Deployments'\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: Sanity.DeploymentTargetConfig = {\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 }\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 {Stack} from '@sanity/ui'\n\nimport {type Sanity} from '../../types'\nimport DeploymentTarget from '../DeploymentTarget'\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 gap={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 {uuid} from '@sanity/uuid'\nimport type {SanityClient, SanityDocument} from 'sanity'\nimport {assertEvent, assign, fromPromise, setup} from 'xstate'\n\nimport {DEPLOYMENT_TARGET_DOCUMENT_TYPE} from '../constants'\nimport type {Sanity} from '../types'\n\n// Named locally so dts emit does not reach into `@sanity/client` (TS2883).\ntype DeleteMutationResult = {\n transactionId: string\n documentIds: string[]\n results: {id: string; operation: string}[]\n}\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 // Explicit return types keep the inferred machine type portable for\n // declaration emit (TS2883), by referencing aliases imported from `sanity`\n // instead of a deep `@sanity/client` path. `delete` returns a mutation\n // result in client v8, not the deleted document.\n 'create document': fromPromise(\n ({\n input,\n }: {\n input: Required<Pick<Context, 'client' | 'formData'>>\n }): Promise<SanityDocument> => {\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 ({\n input,\n }: {\n input: Required<Pick<Context, 'client' | 'id' | 'formData'>>\n }): Promise<SanityDocument> => {\n return input.client.patch(input.id).set(input.formData).commit()\n },\n ),\n 'delete document': fromPromise(\n ({\n input,\n }: {\n input: Required<Pick<Context, 'client' | 'id'>>\n }): Promise<DeleteMutationResult> => {\n return input.client.delete(input.id)\n },\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 fields\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 {red} from '@sanity/color'\nimport {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {Box, Inline, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport type {FC} from 'react'\nimport {type FieldError} from 'react-hook-form'\n\ntype Props = {\n description?: string\n error?: FieldError\n label: string\n name: string\n}\n\nconst errorIconStyle = {color: red[500].hex}\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 gap={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 <ErrorOutlineIcon style={{...errorIconStyle, marginRight: '0.1em'}} />\n {error.message}\n </Text>\n </Box>\n }\n fallbackPlacements={['top', 'left']}\n placement=\"right\"\n portal\n >\n <ErrorOutlineIcon style={errorIconStyle} />\n </Tooltip>\n </Text>\n )}\n </Inline>\n\n {/* Description */}\n {description && (\n <Box marginY={3}>\n <Text as=\"p\" 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 {type ChangeEventHandler, type FocusEventHandler, type Ref} from 'react'\nimport {type 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?: ChangeEventHandler<HTMLInputElement>\n onBlur?: FocusEventHandler<HTMLInputElement>\n ref?: Ref<HTMLInputElement>\n}\n\nconst FormFieldInputText = (props: Props) => {\n const {description, disabled, error, label, name, placeholder, value, onChange, onBlur, ref} =\n 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 {yupResolver} from '@hookform/resolvers/yup'\nimport {Box, Button, Dialog, Flex, Stack} from '@sanity/ui'\nimport {useToast} from '@sanity/ui/toast'\nimport {useActor} from '@xstate/react'\nimport {type FC, useEffect} from 'react'\nimport {useForm} from 'react-hook-form'\nimport {toPromise} from 'xstate'\nimport * as yup from 'yup'\n\nimport {useSanityClient} from '../../client'\nimport {Z_INDEX_DIALOG} from '../../constants'\nimport {formMachine} from '../../machines/form'\nimport {type Sanity} from '../../types'\nimport sanitizeFormData from '../../utils/sanitizeFormData'\nimport FormFieldInputText from '../FormFieldInputText'\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 if (!deploymentTarget) {\n return\n }\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 // @ts-expect-error - yup 0.32 schema types do not line up with @hookform/resolvers, fix typings later\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\n as=\"form\"\n padding={4}\n // @ts-expect-error - yup 0.32 schema types do not line up with @hookform/resolvers, fix typings later\n onSubmit={handleSubmit(onSubmit)}\n >\n {/* Hidden button to enable enter key submissions */}\n <button aria-label=\"Submit\" style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n {/* Form fields */}\n <Stack gap={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 type {SanityClient} from 'sanity'\nimport {assign, setup, fromPromise, assertEvent} from 'xstate'\n\nimport {DEPLOYMENT_TARGET_DOCUMENT_TYPE} from '../constants'\nimport {type Sanity} from '../types'\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 {assertEvent, assign, setup} from 'xstate'\n\nimport {type 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/Add'\nimport {Box, Button, Card, Flex, Text} from '@sanity/ui'\nimport {ToastProvider} from '@sanity/ui/toast'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {QueryClient, QueryClientProvider} from '@tanstack/react-query'\nimport {useMachine} from '@xstate/react'\n\nimport {useSanityClient} from './client'\nimport DeploymentTargets from './components/DeploymentTargets'\nimport DialogForm from './components/DialogForm'\nimport StateDebug from './components/StateDebug'\nimport {Z_INDEX_TOAST_PROVIDER} from './constants'\nimport {deploymentTargetListMachine} from './machines/deploymentTargetList'\nimport {dialogMachine} from './machines/dialog'\nimport {type Sanity} from './types'\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 <Flex align=\"center\" gap={3} paddingX={3} paddingY={4}>\n <Text>No deployment targets found.</Text>\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleDialogShowCreate}\n text=\"Create a new target\"\n />\n </Flex>\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 '@sanity/ui/styles.css'\nimport type {DashboardWidget, LayoutConfig} from '@sanity/dashboard'\n\nimport Widget from './app'\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"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["{apiVersion: API_VERSION}","_c","fetcher(deploymentTarget)","deployLimit","hash(deploymentTarget)","[hash(deploymentTarget)]","() => fetchUrl(API_ENDPOINT_DEPLOYMENTS, deployParams)","{\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 }","options?.enabled ?? true","[hash(deploymentTarget), 'aliases']","() => fetchUrl(API_ENDPOINT_ALIASES, aliasParams)","{\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 }","!!deploymentsData","deploymentsData?.deployments?.map((val: Vercel.DeploymentWithAlias) => {\n const alias = aliases.find((a) => a.deploymentId === val.uid)\n return Object.assign(val, {alias: alias?.alias})\n })","deployments","{\n deployments: deploymentsWithAlias,\n error: aliasesError || deploymentsError,\n isFetching: aliasesIsFetching || deploymentsIsFetching,\n isSuccess: aliasesIsSuccess && deploymentsIsSuccess,\n refetch,\n }","aliasesError || deploymentsError","aliasesIsFetching || deploymentsIsFetching","aliasesIsSuccess && deploymentsIsSuccess","_c","{border: color.border}","border","_c","{\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 }","<Text size={0}>Name: {name}</Text>","JSON.stringify(state.value)","value","<Text size={0}>state.value: {JSON.stringify(state.value)}</Text>","<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 gap={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>","_c","{\n input: {deployHook},\n }","deployState.matches('error')","deployState.matches('success')","() => {\n deployStateTransition({type: 'DEPLOY'})\n }","() => {\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]","error","() => {\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]","{position: 'relative'}","<StateDebug name=\"Deploy\" state={deployState} />","<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 />","disabled","`${deployState.context.label} ${targetName}`","<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>","_c","{state}: Props","<Box\n style={{\n backgroundColor: VERCEL_STATUS_COLORS[state],\n borderRadius: '20px',\n height: '9px',\n width: '9px',\n }}\n />","VERCEL_STATUS_COLORS[state]","_c","['none', 'none', 'none', 'table-cell']","['none', 'none', 'none', 'none', 'table-cell']","{\n maxWidth: cellWidth,\n position: 'relative',\n textAlign: 'left',\n width: cellWidth,\n }","<Label size={0}>{children}</Label>","<Box\n as=\"th\"\n colSpan={colSpan}\n // @ts-expect-error -- local `display` allows 'table-cell', which is not part of @sanity/ui's `BoxDisplay` union\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>","[2, 2, 3]","{\n borderTop: `1px solid ${border}`,\n maxWidth: cellWidth,\n position: 'relative',\n textAlign: 'left',\n width: cellWidth,\n }","`1px solid ${border}`","<Box\n as=\"td\"\n colSpan={colSpan}\n // @ts-expect-error -- local `display` allows 'table-cell', which is not part of @sanity/ui's `BoxDisplay` union\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>","_c","new Date(deployment.created)","created","useMemo(() => new Date(deployment.created), [deployment.created])","['block', 'block', 'block', 'block', 'none']","{flexShrink: 0}","<Box\n display={['block', 'block', 'block', 'block', 'none']}\n marginRight={3}\n style={{flexShrink: 0}}\n >\n <StatusDot state={deployment.state} />\n </Box>","state","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 )","alias","<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>","<StatusDot state={deployment.state} />","deployment.state\n .trim()\n .toLowerCase()\n .replace(/^[a-z]/i, (t) => t.toUpperCase())","/^[a-z]/i","(t) => t.toUpperCase()","<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>","<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>","<Text size={1} textOverflow=\"ellipsis\">\n {commitRef}\n </Text>","commitMessage && (\n <Text muted size={1} textOverflow=\"ellipsis\">\n {commitMessage}\n </Text>\n )","<TableCell variant=\"branch\">\n <Stack gap={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>","<TableCell variant=\"age\">\n <Flex align=\"center\">\n <Text size={1}>\n <ReactTimeAgo date={date} locale=\"en-US\" timeStyle=\"mini\" />\n </Text>\n </Flex>\n </TableCell>","{\n borderRadius: '20px',\n height: '20px',\n width: '20px',\n }","<TableCell variant=\"creator\">\n <Flex align=\"center\" justify=\"center\">\n <img\n alt={deployment?.creator?.username || 'Deployment creator avatar'}\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>","deployment?.creator?.username || 'Deployment creator avatar'","`https://vercel.com/api/www/avatar/${deployment?.creator?.uid}?&s=48`","<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 gap={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} 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 alt={deployment?.creator?.username || 'Deployment creator avatar'}\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>","_c","_Fragment","_temp","<Box\n style={{\n backgroundColor: border,\n borderRadius: '20px',\n height: '20px',\n userSelect: 'none',\n width: '20px',\n }}\n />","_c","{\n backgroundColor: border,\n borderRadius: '3px',\n userSelect: 'none',\n width: '100%',\n }","<Stack gap={2}>\n {Array.from({length: rows}, (_, index) => (\n <Text key={index} size={1}>\n \n </Text>\n ))}\n </Stack>","(_, index) => (\n <Text key={index} size={1}>\n \n </Text>\n )","<Box\n style={{\n backgroundColor: border,\n borderRadius: '3px',\n userSelect: 'none',\n width: '100%',\n }}\n >\n <Stack gap={2}>\n {Array.from({length: rows}, (_, index) => (\n <Text key={index} size={1}>\n \n </Text>\n ))}\n </Stack>\n </Box>","_c","_temp","<TableCell>\n <PlaceholderText rows={1} />\n </TableCell>","<TableCell variant=\"state\">\n <PlaceholderText rows={1} />\n </TableCell>","<TableCell variant=\"branch\">\n <PlaceholderText rows={2} />\n </TableCell>","<TableCell variant=\"age\">\n <PlaceholderText rows={1} />\n </TableCell>","<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>","_c","refreshState.matches('error')","{\n enabled: !refreshState.matches('error'),\n }","!refreshState.matches('error')","() => {\n if (refTimeout.current) {\n clearTimeout(refTimeout.current)\n }\n refTimeout.current = setTimeout(() => {\n void refetch({\n cancelRefetch: true,\n throwOnError: true,\n })\n }, 4000)\n }","() => {\n return () => {\n if (refTimeout.current) {\n clearTimeout(refTimeout.current)\n }\n }\n }","[]","() => {\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 if (!refreshState.matches('refreshing')) {\n refreshStateTransition({type: 'REFRESH'})\n }\n }","[deploymentTarget]","() => {\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.name","[deploymentTarget, isError]","{position: 'relative'}","<StateDebug name=\"Refresh\" state={refreshState} />","!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=\"creator\">\n Creator\n </TableCell>\n </tr>\n </Box>\n\n <Box as=\"tbody\" style={{display: 'table-row-group'}}>\n {/* Placeholders */}\n {!deployments &&\n Array.from({length: deploymentTarget.deployLimit}, (_, index) => (\n <DeploymentPlaceholder key={index} />\n ))}\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 )","deploymentTarget.deployLimit","(_, index) => (\n <DeploymentPlaceholder key={index} />\n )","(deployment) => (\n <Deployment deployment={deployment} key={deployment.uid} />\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 )","!refreshState.matches('error') && deploymentTarget.deployHook && (\n <Box>\n <DeployButton\n deployHook={deploymentTarget.deployHook}\n onDeploySuccess={handleDeploySuccess}\n targetName={deploymentTarget.name}\n />\n </Box>\n )","deploymentTarget.deployHook","<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=\"creator\">\n Creator\n </TableCell>\n </tr>\n </Box>\n\n <Box as=\"tbody\" style={{display: 'table-row-group'}}>\n {/* Placeholders */}\n {!deployments &&\n Array.from({length: deploymentTarget.deployLimit}, (_, index) => (\n <DeploymentPlaceholder key={index} />\n ))}\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>","_c","_Fragment","{\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 }","deployHook","deployLimit","name","projectId","teamId","token","{position: 'relative'}","<Text size={2}>{item.name}</Text>","<Box padding={2}>\n <Text muted size={1}>\n Edit deployment target\n </Text>\n </Box>","<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>","<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>","<Deployments deploymentTarget={deploymentTarget} />","<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>","_c","items?.map((item) => (\n <DeploymentTarget item={item} key={item._id} onDialogEdit={onDialogEdit} />\n ))","items?.map","<Stack gap={5}>\n {items?.map((item) => (\n <DeploymentTarget item={item} key={item._id} onDialogEdit={onDialogEdit} />\n ))}\n </Stack>","_c","<Text as=\"label\" htmlFor={name} size={1} weight=\"semibold\">\n {label}\n </Text>","error && (\n <Text size={1}>\n <Tooltip\n content={\n <Box padding={2}>\n <Text muted size={1}>\n <ErrorOutlineIcon style={{...errorIconStyle, marginRight: '0.1em'}} />\n {error.message}\n </Text>\n </Box>\n }\n fallbackPlacements={['top', 'left']}\n placement=\"right\"\n portal\n >\n <ErrorOutlineIcon style={errorIconStyle} />\n </Tooltip>\n </Text>\n )","<Inline gap={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 <ErrorOutlineIcon style={{...errorIconStyle, marginRight: '0.1em'}} />\n {error.message}\n </Text>\n </Box>\n }\n fallbackPlacements={['top', 'left']}\n placement=\"right\"\n portal\n >\n <ErrorOutlineIcon style={errorIconStyle} />\n </Tooltip>\n </Text>\n )}\n </Inline>","description && (\n <Box marginY={3}>\n <Text as=\"p\" muted size={1}>\n {description}\n </Text>\n </Box>\n )","<Box marginBottom={3}>\n {/* Label */}\n <Inline gap={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 <ErrorOutlineIcon style={{...errorIconStyle, marginRight: '0.1em'}} />\n {error.message}\n </Text>\n </Box>\n }\n fallbackPlacements={['top', 'left']}\n placement=\"right\"\n portal\n >\n <ErrorOutlineIcon style={errorIconStyle} />\n </Tooltip>\n </Text>\n )}\n </Inline>\n\n {/* Description */}\n {description && (\n <Box marginY={3}>\n <Text as=\"p\" muted size={1}>\n {description}\n </Text>\n </Box>\n )}\n </Box>","_c","<FormFieldInputLabel description={description} error={error} label={label} name={name} />","<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 />","<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>","_c","{\n input: {client},\n }","formState.hasTag('busy')","{\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 }","deploymentTarget?.deployHook || ''","deploymentTarget?.deployLimit || 5","deploymentTarget?.name || ''","deploymentTarget?.projectId || ''","deploymentTarget?.teamId || ''","deploymentTarget?.token || ''","yupResolver(formSchema)","{\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 }","{errors, isDirty, isValid}","() => {\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]","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 }","async () => {\n if (!deploymentTarget) {\n return\n }\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 }","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 )","formState.matches('creating') || formState.matches('updating')","handleSubmit(onSubmit)","<Button\n loading={formState.matches('creating') || formState.matches('updating')}\n disabled={!isDirty || !isValid}\n fontSize={1}\n // @ts-expect-error - yup 0.32 schema types do not line up with @hookform/resolvers, fix typings later\n onClick={handleSubmit(onSubmit)}\n text={deploymentTarget ? 'Update and close' : 'Create'}\n tone=\"primary\"\n />","!isDirty || !isValid","deploymentTarget ? 'Update and close' : 'Create'","<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 // @ts-expect-error - yup 0.32 schema types do not line up with @hookform/resolvers, fix typings later\n onClick={handleSubmit(onSubmit)}\n text={deploymentTarget ? 'Update and close' : 'Create'}\n tone=\"primary\"\n />\n </Flex>\n </Box>","deploymentTarget ? 'space-between' : 'flex-end'","<button aria-label=\"Submit\" style={{display: 'none'}} tabIndex={-1} type=\"submit\" />","register('name')","<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 />","errors?.name","register('token')","<FormFieldInputText\n disabled={formUpdating}\n error={errors?.token}\n label=\"Vercel Account Token\"\n // @ts-expect-error - fix typings later\n {...register('token')}\n />","errors?.token","register('projectId')","<FormFieldInputText\n disabled={formUpdating}\n error={errors?.projectId}\n label=\"Vercel Project ID\"\n // @ts-expect-error - fix typings later\n {...register('projectId')}\n />","errors?.projectId","register('teamId')","<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 />","errors?.teamId","register('deployHook')","<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 />","errors?.deployHook","register('deployLimit', {valueAsNumber: true})","<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 />","errors?.deployLimit","<Stack gap={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>","<Box\n as=\"form\"\n padding={4}\n // @ts-expect-error - yup 0.32 schema types do not line up with @hookform/resolvers, fix typings later\n onSubmit={handleSubmit(onSubmit)}\n >\n {/* Hidden button to enable enter key submissions */}\n <button aria-label=\"Submit\" style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n {/* Form fields */}\n <Stack gap={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>","<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 // @ts-expect-error - yup 0.32 schema types do not line up with @hookform/resolvers, fix typings later\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\n as=\"form\"\n padding={4}\n // @ts-expect-error - yup 0.32 schema types do not line up with @hookform/resolvers, fix typings later\n onSubmit={handleSubmit(onSubmit)}\n >\n {/* Hidden button to enable enter key submissions */}\n <button aria-label=\"Submit\" style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n {/* Form fields */}\n <Stack gap={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>","`${deploymentTarget ? 'Edit' : 'Create'} deployment target`","_c","{input: {client}}","() => {\n dialogStateTransition({type: 'CLOSE'})\n }","() => {\n dialogStateTransition({type: 'CREATE'})\n }","(deploymentTarget: Sanity.DeploymentTarget) => {\n dialogStateTransition({type: 'EDIT', deploymentTarget})\n }","(deploymentTarget: Sanity.DeploymentTarget) => {\n deploymentTargetListStateTransition({type: 'CREATE', deploymentTarget})\n }","(id: string) => {\n deploymentTargetListStateTransition({type: 'DELETE', id})\n }","(deploymentTarget: Sanity.DeploymentTarget) => {\n deploymentTargetListStateTransition({type: 'UPDATE', deploymentTarget})\n }","{overflow: 'hidden '}","<StateDebug name=\"List\" state={deploymentTargetListState} />","<Text size={5} weight=\"semibold\">\n Vercel deployments\n </Text>","<Box padding={2}>\n <Text muted size={1}>\n Create new deployment target\n </Text>\n </Box>","<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>","deploymentTargetListState.matches('pending') && (\n <Box paddingX={3} paddingY={4}>\n <Text>Loading...</Text>\n </Box>\n )","deploymentTargetListState.matches({ready: 'withoutData'}) && (\n <Flex align=\"center\" gap={3} paddingX={3} paddingY={4}>\n <Text>No deployment targets found.</Text>\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleDialogShowCreate}\n text=\"Create a new target\"\n />\n </Flex>\n )","deploymentTargetListState.matches({ready: 'withData'}) && (\n <DeploymentTargets\n items={deploymentTargetListState.context.results}\n onDialogEdit={handleDialogShowEdit}\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 )","<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 <Flex align=\"center\" gap={3} paddingX={3} paddingY={4}>\n <Text>No deployment targets found.</Text>\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleDialogShowCreate}\n text=\"Create a new target\"\n />\n </Flex>\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>","<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 <Flex align=\"center\" gap={3} paddingX={3} paddingY={4}>\n <Text>No deployment targets found.</Text>\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleDialogShowCreate}\n text=\"Create a new target\"\n />\n </Flex>\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>","dialogState.matches('create') && (\n <DialogForm onClose={handleDialogClose} onCreate={handleTargetCreate} />\n )","dialogState.matches('edit') && (\n <DialogForm\n deploymentTarget={dialogState.context.editDeploymentTarget}\n onClose={handleDialogClose}\n onDelete={handleTargetDelete}\n onUpdate={handleTargetUpdate}\n />\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 <Flex align=\"center\" gap={3} paddingX={3} paddingY={4}>\n <Text>No deployment targets found.</Text>\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleDialogShowCreate}\n text=\"Create a new target\"\n />\n </Flex>\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>","_c","\"githubCommitMessage\"","\"githubCommitRef\""],"sources":["../src/constants.ts","../src/client.ts","../src/utils/fetcher.ts","../src/hooks/useDeployments.ts","../src/machines/refresh.ts","../src/utils/useCardColor.ts","../src/machines/deploy.ts","../src/components/StateDebug/index.tsx","../src/components/DeployButton/index.tsx","../src/components/StatusDot/index.tsx","../src/components/TableCell/index.tsx","../src/components/Deployment/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/components/DialogForm/index.tsx","../src/machines/deploymentTargetList.ts","../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 {type SanityClient, useClient} from 'sanity'\n\nimport {API_VERSION} from './constants'\n\nexport function useSanityClient(): SanityClient {\n return useClient({apiVersion: API_VERSION})\n}\n","import {type Sanity} from '../types'\n\nconst fetcher =\n (deploymentTarget: Sanity.DeploymentTargetConfig) =>\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 await response.json()\n } catch (err) {\n throw new Error('Unable to parse response as JSON', {cause: err})\n }\n }\n\nexport default fetcher\n","import {useQuery} from '@tanstack/react-query'\nimport hash from 'object-hash'\n\nimport {API_ENDPOINT_ALIASES, API_ENDPOINT_DEPLOYMENTS} from '../constants'\nimport {type Sanity, type Vercel} from '../types'\nimport fetcher from '../utils/fetcher'\n\ntype Options = {\n enabled?: boolean\n}\n\nconst useDeployments = (deploymentTarget: Sanity.DeploymentTargetConfig, 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[]}>({\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 aliases: Vercel.Alias[]\n pagination: {\n count: number\n next?: number\n prev?: number\n }\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\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 Object.assign(val, {alias: alias?.alias})\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_v2} from '@sanity/ui'\n\nexport function useCardColor(): {border: string} {\n const {color} = useTheme_v2()\n return {border: color.border}\n}\n","import {assign, setup, fromPromise} from 'xstate'\n\nimport {type 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: {error?: Vercel.Error} | null = await res.json()\n if (!res.ok) {\n const errorMessage = data?.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', {cause: err})\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 const {error} = event\n if (typeof error === 'string') {\n return error\n }\n if (error instanceof Error) {\n return error.message\n }\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 {Box, Card, Stack, Text} from '@sanity/ui'\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 gap={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 {UploadIcon} from '@sanity/icons/Upload'\nimport {Box, Button} from '@sanity/ui'\nimport {useToast} from '@sanity/ui/toast'\nimport {useMachine} from '@xstate/react'\nimport {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'\n\nimport {VERCEL_STATUS_COLORS} from '../../constants'\nimport {type 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, Label} from '@sanity/ui'\nimport type {ReactNode} from 'react'\n\nimport {type 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-expect-error -- local `display` allows 'table-cell', which is not part of @sanity/ui's `BoxDisplay` union\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-expect-error -- local `display` allows 'table-cell', which is not part of @sanity/ui's `BoxDisplay` union\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 {LinkIcon} from '@sanity/icons/Link'\nimport {Box, Flex, Stack, Text} from '@sanity/ui'\nimport {useMemo} from 'react'\n// oxlint-disable-next-line import/no-unassigned-import\nimport 'react-time-ago/locale/en'\nimport ReactTimeAgo from 'react-time-ago'\n\nimport {type Vercel} from '../../types'\nimport StatusDot from '../StatusDot'\nimport TableCell from '../TableCell'\n\ntype Props = {\n deployment: Vercel.DeploymentWithAlias\n}\n\nconst Deployment = (props: Props) => {\n const {deployment} = props\n\n const date = useMemo(() => new Date(deployment.created), [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 gap={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} 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 alt={deployment?.creator?.username || 'Deployment creator avatar'}\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 {Box} from '@sanity/ui'\n\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'\n\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 gap={2}>\n {Array.from({length: rows}, (_, 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'\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} from '@sanity/ui'\nimport {useToast} from '@sanity/ui/toast'\nimport {useMachine} from '@xstate/react'\nimport {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 {type Sanity} from '../../types'\nimport {useCardColor} from '../../utils/useCardColor'\nimport DeployButton from '../DeployButton'\nimport Deployment from '../Deployment'\nimport DeploymentPlaceholder from '../DeploymentPlaceholder'\nimport StateDebug from '../StateDebug'\nimport TableCell from '../TableCell'\n\ntype Props = {\n deploymentTarget: Sanity.DeploymentTargetConfig\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 void 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=\"creator\">\n Creator\n </TableCell>\n </tr>\n </Box>\n\n <Box as=\"tbody\" style={{display: 'table-row-group'}}>\n {/* Placeholders */}\n {!deployments &&\n Array.from({length: deploymentTarget.deployLimit}, (_, index) => (\n <DeploymentPlaceholder key={index} />\n ))}\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/Edit'\nimport {Box, Button, Flex, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport type {FC} from 'react'\n\nimport {type Sanity} from '../../types'\nimport Deployments from '../Deployments'\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: Sanity.DeploymentTargetConfig = {\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 }\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 {Stack} from '@sanity/ui'\n\nimport {type Sanity} from '../../types'\nimport DeploymentTarget from '../DeploymentTarget'\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 gap={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 {uuid} from '@sanity/uuid'\nimport type {SanityClient, SanityDocument} from 'sanity'\nimport {assertEvent, assign, fromPromise, setup} from 'xstate'\n\nimport {DEPLOYMENT_TARGET_DOCUMENT_TYPE} from '../constants'\nimport type {Sanity} from '../types'\n\n// Named locally so dts emit does not reach into `@sanity/client` (TS2883).\ntype DeleteMutationResult = {\n transactionId: string\n documentIds: string[]\n results: {id: string; operation: string}[]\n}\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 // Explicit return types keep the inferred machine type portable for\n // declaration emit (TS2883), by referencing aliases imported from `sanity`\n // instead of a deep `@sanity/client` path. `delete` returns a mutation\n // result in client v8, not the deleted document.\n 'create document': fromPromise(\n ({\n input,\n }: {\n input: Required<Pick<Context, 'client' | 'formData'>>\n }): Promise<SanityDocument> => {\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 ({\n input,\n }: {\n input: Required<Pick<Context, 'client' | 'id' | 'formData'>>\n }): Promise<SanityDocument> => {\n return input.client.patch(input.id).set(input.formData).commit()\n },\n ),\n 'delete document': fromPromise(\n ({\n input,\n }: {\n input: Required<Pick<Context, 'client' | 'id'>>\n }): Promise<DeleteMutationResult> => {\n return input.client.delete(input.id)\n },\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 fields\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 {red} from '@sanity/color'\nimport {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {Box, Inline, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport type {FC} from 'react'\nimport {type FieldError} from 'react-hook-form'\n\ntype Props = {\n description?: string\n error?: FieldError\n label: string\n name: string\n}\n\nconst errorIconStyle = {color: red[500].hex}\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 gap={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 <ErrorOutlineIcon style={{...errorIconStyle, marginRight: '0.1em'}} />\n {error.message}\n </Text>\n </Box>\n }\n fallbackPlacements={['top', 'left']}\n placement=\"right\"\n portal\n >\n <ErrorOutlineIcon style={errorIconStyle} />\n </Tooltip>\n </Text>\n )}\n </Inline>\n\n {/* Description */}\n {description && (\n <Box marginY={3}>\n <Text as=\"p\" 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 {type ChangeEventHandler, type FocusEventHandler, type Ref} from 'react'\nimport {type 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?: ChangeEventHandler<HTMLInputElement>\n onBlur?: FocusEventHandler<HTMLInputElement>\n ref?: Ref<HTMLInputElement>\n}\n\nconst FormFieldInputText = (props: Props) => {\n const {description, disabled, error, label, name, placeholder, value, onChange, onBlur, ref} =\n 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 {yupResolver} from '@hookform/resolvers/yup'\nimport {Box, Button, Dialog, Flex, Stack} from '@sanity/ui'\nimport {useToast} from '@sanity/ui/toast'\nimport {useActor} from '@xstate/react'\nimport {type FC, useEffect} from 'react'\nimport {useForm} from 'react-hook-form'\nimport {toPromise} from 'xstate'\nimport * as yup from 'yup'\n\nimport {useSanityClient} from '../../client'\nimport {Z_INDEX_DIALOG} from '../../constants'\nimport {formMachine} from '../../machines/form'\nimport {type Sanity} from '../../types'\nimport sanitizeFormData from '../../utils/sanitizeFormData'\nimport FormFieldInputText from '../FormFieldInputText'\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 if (!deploymentTarget) {\n return\n }\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 // @ts-expect-error - yup 0.32 schema types do not line up with @hookform/resolvers, fix typings later\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\n as=\"form\"\n padding={4}\n // @ts-expect-error - yup 0.32 schema types do not line up with @hookform/resolvers, fix typings later\n onSubmit={handleSubmit(onSubmit)}\n >\n {/* Hidden button to enable enter key submissions */}\n <button aria-label=\"Submit\" style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n {/* Form fields */}\n <Stack gap={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 type {SanityClient} from 'sanity'\nimport {assign, setup, fromPromise, assertEvent} from 'xstate'\n\nimport {DEPLOYMENT_TARGET_DOCUMENT_TYPE} from '../constants'\nimport {type Sanity} from '../types'\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 {assertEvent, assign, setup} from 'xstate'\n\nimport {type 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/Add'\nimport {Box, Button, Card, Flex, Text} from '@sanity/ui'\nimport {ToastProvider} from '@sanity/ui/toast'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {QueryClient, QueryClientProvider} from '@tanstack/react-query'\nimport {useMachine} from '@xstate/react'\n\nimport {useSanityClient} from './client'\nimport DeploymentTargets from './components/DeploymentTargets'\nimport DialogForm from './components/DialogForm'\nimport StateDebug from './components/StateDebug'\nimport {Z_INDEX_TOAST_PROVIDER} from './constants'\nimport {deploymentTargetListMachine} from './machines/deploymentTargetList'\nimport {dialogMachine} from './machines/dialog'\nimport {type Sanity} from './types'\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 <Flex align=\"center\" gap={3} paddingX={3} paddingY={4}>\n <Text>No deployment targets found.</Text>\n <Button\n fontSize={1}\n mode=\"ghost\"\n onClick={handleDialogShowCreate}\n text=\"Create a new target\"\n />\n </Flex>\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 '@sanity/ui/styles.css'\nimport type {DashboardWidget, LayoutConfig} from '@sanity/dashboard'\n\nimport Widget from './app'\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"],"mappings":"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"}
\ No newline at end of file