sanity-plugin-dashboard-widget-vercel 3.1.0 → 3.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.js +36 -46
- package/lib/index.js.map +1 -1
- package/lib/index.mjs +36 -46
- package/lib/index.mjs.map +1 -1
- package/package.json +4 -4
- package/src/app.tsx +2 -2
- package/src/components/DialogForm/index.tsx +18 -20
- package/src/components/FormFieldInputLabel/index.tsx +0 -1
- package/src/components/FormFieldInputText/index.tsx +6 -5
- package/src/hooks/useDeployments.ts +21 -25
package/lib/index.mjs
CHANGED
|
@@ -2,7 +2,7 @@ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
|
2
2
|
import { LinkIcon, UploadIcon, EditIcon, ErrorOutlineIcon, AddIcon } from "@sanity/icons";
|
|
3
3
|
import { useTheme, Box, Label, Flex, Text, Stack, useToast, Button, Tooltip, Inline, TextInput, Dialog, ToastProvider, Card } from "@sanity/ui";
|
|
4
4
|
import { useMachine } from "@xstate/react";
|
|
5
|
-
import { useQuery, QueryClient, QueryClientProvider } from "react-query";
|
|
5
|
+
import { useQuery, QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
|
6
6
|
import { Machine, assign } from "xstate";
|
|
7
7
|
import { useRef, useMemo, useEffect, forwardRef } from "react";
|
|
8
8
|
import useDeepCompareEffect from "use-deep-compare-effect";
|
|
@@ -119,39 +119,33 @@ const API_ENDPOINT_DEPLOYMENTS = "https://api.vercel.com/v5/now/deployments", AP
|
|
|
119
119
|
isSuccess: deploymentsIsSuccess,
|
|
120
120
|
error: deploymentsError,
|
|
121
121
|
refetch
|
|
122
|
-
} = useQuery(
|
|
123
|
-
hash(deploymentTarget),
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
retry: !1
|
|
135
|
-
}
|
|
136
|
-
), aliasParams = new URLSearchParams();
|
|
122
|
+
} = useQuery({
|
|
123
|
+
queryKey: [hash(deploymentTarget)],
|
|
124
|
+
queryFn: () => fetchUrl(API_ENDPOINT_DEPLOYMENTS, deployParams),
|
|
125
|
+
enabled: options?.enabled ?? !0,
|
|
126
|
+
refetchInterval: 2e4,
|
|
127
|
+
// ms
|
|
128
|
+
refetchIntervalInBackground: !1,
|
|
129
|
+
refetchOnMount: !0,
|
|
130
|
+
refetchOnReconnect: "always",
|
|
131
|
+
refetchOnWindowFocus: !1,
|
|
132
|
+
retry: !1
|
|
133
|
+
}), aliasParams = new URLSearchParams();
|
|
137
134
|
aliasParams.set("limit", "20");
|
|
138
135
|
const {
|
|
139
136
|
data: aliasesData,
|
|
140
137
|
isFetching: aliasesIsFetching,
|
|
141
138
|
isSuccess: aliasesIsSuccess,
|
|
142
139
|
error: aliasesError
|
|
143
|
-
} = useQuery(
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
retry: !1
|
|
153
|
-
}
|
|
154
|
-
), aliases = aliasesData?.aliases;
|
|
140
|
+
} = useQuery({
|
|
141
|
+
queryKey: [hash(deploymentTarget), "aliases"],
|
|
142
|
+
queryFn: () => fetchUrl(API_ENDPOINT_ALIASES, aliasParams),
|
|
143
|
+
enabled: !!deploymentsData,
|
|
144
|
+
refetchOnMount: !1,
|
|
145
|
+
refetchOnReconnect: !1,
|
|
146
|
+
refetchOnWindowFocus: !1,
|
|
147
|
+
retry: !1
|
|
148
|
+
}), aliases = aliasesData?.aliases;
|
|
155
149
|
let deploymentsWithAlias;
|
|
156
150
|
return aliases && (deploymentsWithAlias = deploymentsData?.deployments?.map((val) => {
|
|
157
151
|
const alias = aliases.find((a) => a.deploymentId === val.uid);
|
|
@@ -662,7 +656,7 @@ const TableCell = (props) => {
|
|
|
662
656
|
description && /* @__PURE__ */ jsx(Box, { marginY: 3, children: /* @__PURE__ */ jsx(Text, { htmlFor: name, muted: !0, size: 1, children: description }) })
|
|
663
657
|
] });
|
|
664
658
|
}, FormFieldInputText = forwardRef((props, ref) => {
|
|
665
|
-
const { description, disabled, error, label, name, placeholder, value } = props;
|
|
659
|
+
const { description, disabled, error, label, name, placeholder, value, onChange, onBlur } = props;
|
|
666
660
|
return /* @__PURE__ */ jsxs(Box, { children: [
|
|
667
661
|
/* @__PURE__ */ jsx(FormFieldInputLabel, { description, error, label, name }),
|
|
668
662
|
/* @__PURE__ */ jsx(
|
|
@@ -675,6 +669,8 @@ const TableCell = (props) => {
|
|
|
675
669
|
id: name,
|
|
676
670
|
name,
|
|
677
671
|
placeholder,
|
|
672
|
+
onChange,
|
|
673
|
+
onBlur,
|
|
678
674
|
ref
|
|
679
675
|
}
|
|
680
676
|
)
|
|
@@ -732,18 +728,18 @@ const formSchema = yup.object().shape({
|
|
|
732
728
|
}
|
|
733
729
|
}
|
|
734
730
|
}), formUpdating = formState.matches("creating") || formState.matches("deleting") || formState.matches("updating"), {
|
|
735
|
-
// Read the formState before render to subscribe the form state through Proxy
|
|
736
731
|
formState: { errors, isDirty, isValid },
|
|
737
732
|
handleSubmit,
|
|
738
733
|
register
|
|
739
734
|
} = useForm({
|
|
735
|
+
// @ts-expect-error - fix typings later
|
|
740
736
|
defaultValues: {
|
|
741
737
|
deployHook: deploymentTarget?.deployHook || "",
|
|
742
738
|
deployLimit: deploymentTarget?.deployLimit || 5,
|
|
743
|
-
name: deploymentTarget?.name,
|
|
744
|
-
projectId: deploymentTarget?.projectId,
|
|
739
|
+
name: deploymentTarget?.name || "",
|
|
740
|
+
projectId: deploymentTarget?.projectId || "",
|
|
745
741
|
teamId: deploymentTarget?.teamId || "",
|
|
746
|
-
token: deploymentTarget?.token
|
|
742
|
+
token: deploymentTarget?.token || ""
|
|
747
743
|
},
|
|
748
744
|
mode: "onChange",
|
|
749
745
|
resolver: yupResolver(formSchema)
|
|
@@ -796,8 +792,7 @@ const formSchema = yup.object().shape({
|
|
|
796
792
|
description: "Name displayed in this plugin (e.g. production, staging)",
|
|
797
793
|
error: errors?.name,
|
|
798
794
|
label: "Name",
|
|
799
|
-
|
|
800
|
-
ref: register
|
|
795
|
+
...register("name")
|
|
801
796
|
}
|
|
802
797
|
),
|
|
803
798
|
/* @__PURE__ */ jsx(
|
|
@@ -806,8 +801,7 @@ const formSchema = yup.object().shape({
|
|
|
806
801
|
disabled: formUpdating,
|
|
807
802
|
error: errors?.token,
|
|
808
803
|
label: "Vercel Account Token",
|
|
809
|
-
|
|
810
|
-
ref: register
|
|
804
|
+
...register("token")
|
|
811
805
|
}
|
|
812
806
|
),
|
|
813
807
|
/* @__PURE__ */ jsx(
|
|
@@ -816,8 +810,7 @@ const formSchema = yup.object().shape({
|
|
|
816
810
|
disabled: formUpdating,
|
|
817
811
|
error: errors?.projectId,
|
|
818
812
|
label: "Vercel Project ID",
|
|
819
|
-
|
|
820
|
-
ref: register
|
|
813
|
+
...register("projectId")
|
|
821
814
|
}
|
|
822
815
|
),
|
|
823
816
|
/* @__PURE__ */ jsx(
|
|
@@ -827,8 +820,7 @@ const formSchema = yup.object().shape({
|
|
|
827
820
|
disabled: formUpdating,
|
|
828
821
|
error: errors?.teamId,
|
|
829
822
|
label: "Vercel Team ID (optional)",
|
|
830
|
-
|
|
831
|
-
ref: register
|
|
823
|
+
...register("teamId")
|
|
832
824
|
}
|
|
833
825
|
),
|
|
834
826
|
/* @__PURE__ */ jsx(
|
|
@@ -838,8 +830,7 @@ const formSchema = yup.object().shape({
|
|
|
838
830
|
disabled: formUpdating,
|
|
839
831
|
error: errors?.deployHook,
|
|
840
832
|
label: "Vercel Deploy Hook (optional)",
|
|
841
|
-
|
|
842
|
-
ref: register
|
|
833
|
+
...register("deployHook")
|
|
843
834
|
}
|
|
844
835
|
),
|
|
845
836
|
/* @__PURE__ */ jsx(
|
|
@@ -848,8 +839,7 @@ const formSchema = yup.object().shape({
|
|
|
848
839
|
disabled: formUpdating,
|
|
849
840
|
error: errors?.deployLimit,
|
|
850
841
|
label: "Number of deploys to display",
|
|
851
|
-
|
|
852
|
-
ref: register({ valueAsNumber: !0 })
|
|
842
|
+
...register("deployLimit", { valueAsNumber: !0 })
|
|
853
843
|
}
|
|
854
844
|
)
|
|
855
845
|
] })
|
|
@@ -906,7 +896,7 @@ const formSchema = yup.object().shape({
|
|
|
906
896
|
), [dialogState, dialogStateTransition] = useMachine(dialogMachine), queryClient = new QueryClient({
|
|
907
897
|
defaultOptions: {
|
|
908
898
|
queries: {
|
|
909
|
-
|
|
899
|
+
gcTime: 0,
|
|
910
900
|
staleTime: 0
|
|
911
901
|
}
|
|
912
902
|
}
|
package/lib/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/constants.ts","../src/components/StateDebug/index.tsx","../src/machines/deploymentTargetList.ts","../src/utils/fetcher.ts","../src/hooks/useDeployments.ts","../src/machines/refresh.ts","../src/utils/useCardColor.ts","../src/components/TableCell/index.tsx","../src/components/StatusDot/index.tsx","../src/components/Deployment/index.tsx","../src/machines/deploy.ts","../src/components/DeployButton/index.tsx","../src/components/PlaceholderAvatar/index.tsx","../src/components/PlaceholderText/index.tsx","../src/components/DeploymentPlaceholder/index.tsx","../src/components/Deployments/index.tsx","../src/components/DeploymentTarget/index.tsx","../src/components/DeploymentTargets/index.tsx","../src/machines/form.ts","../src/utils/sanitizeFormData.ts","../src/components/FormFieldInputLabel/index.tsx","../src/components/FormFieldInputText/index.tsx","../src/client.ts","../src/components/DialogForm/index.tsx","../src/machines/dialog.ts","../src/app.tsx","../src/index.ts"],"sourcesContent":["// https://vercel.com/docs/platform/limits\nexport const API_ENDPOINT_DEPLOYMENTS = 'https://api.vercel.com/v5/now/deployments'\nexport const API_ENDPOINT_ALIASES = 'https://api.vercel.com/v3/now/aliases'\n\n// Sanity API version\nexport const API_VERSION = '1'\n\nexport const DEBUG_MODE = false\n\nexport const DEPLOYMENT_TARGET_DOCUMENT_TYPE = 'vercel.deploymentTarget'\n\nexport const VERCEL_STATUS_COLORS = {\n BUILDING: '#f5a623',\n CANCELED: '#ff0000',\n ERROR: '#ff0000',\n READY: '#50e3c2',\n QUEUED: '#333',\n}\n\n// Name displayed in toasts\nexport const WIDGET_NAME = 'Vercel (dashboard)'\n\n// NOTE: Manually set plugin z-index values to be higher than Sanity's header search field\n// (which is currently 500202). Also ensure toasts always sit above dialogs.\nexport const Z_INDEX_DIALOG = 600001\nexport const Z_INDEX_TOAST_PROVIDER = 600002\n","import {Box, Card, Stack, Text} from '@sanity/ui'\nimport React from 'react'\n\nimport {DEBUG_MODE} from '../../constants'\n\ntype Props = {\n name: string\n state: any // TODO: type correctly\n}\n\nconst StateDebug = (props: Props) => {\n const {name, state} = props\n\n if (!DEBUG_MODE) {\n return null\n }\n\n return (\n <Card\n scheme=\"dark\"\n style={{\n backgroundColor: 'rgba(0, 0, 255, 0.9)',\n borderRadius: '3px',\n fontSize: 1,\n fontWeight: 500,\n lineHeight: 'body',\n right: 0,\n opacity: 0.75,\n pointerEvents: 'none',\n position: 'absolute',\n textAlign: 'left',\n top: 0,\n zIndex: 9000,\n }}\n >\n <Box padding={2}>\n <Stack space={2}>\n <Text size={0}>Name: {name}</Text>\n <Text size={0}>state.value: {JSON.stringify(state.value)}</Text>\n </Stack>\n </Box>\n </Card>\n )\n}\n\nexport default StateDebug\n","import {assign, Machine} from 'xstate'\nimport {Sanity} from '../types'\n\ntype Context = {\n message: string\n results: Sanity.DeploymentTarget[] // TODO: type correctly\n}\n\ntype Event =\n | {type: 'CLOSE'}\n | {type: 'CREATE'; deploymentTarget: Sanity.DeploymentTarget}\n | {type: 'DELETE'; id: string}\n | {type: 'FETCH'}\n | {type: 'REJECT'; message: string}\n | {type: 'RESOLVE'; results: any[]}\n | {type: 'UPDATE'}\n\ntype Schema = {\n states: {\n failed: {}\n pending: {}\n ready: {\n states: {\n unknown: {}\n withData: {}\n withoutData: {}\n }\n }\n }\n}\n\nconst sortByTargetName = (items: Sanity.DeploymentTarget[]) => {\n return items.sort((a, b) => {\n if (a.name > b.name) {\n return 1\n }\n\n if (a.name < b.name) {\n return -1\n }\n\n return 0\n })\n}\n\nconst deploymentTargetListMachine = () =>\n Machine<Context, Schema, Event>(\n {\n context: {\n message: '',\n results: [],\n },\n initial: 'pending',\n states: {\n pending: {\n invoke: {\n src: 'fetchDataService',\n onDone: {actions: ['setResults'], target: 'ready'},\n onError: {actions: ['setMessage'], target: 'failed'},\n },\n },\n ready: {\n initial: 'unknown',\n on: {\n CREATE: {actions: ['targetCreate']},\n DELETE: {actions: ['targetDelete']},\n UPDATE: {actions: ['targetUpdate']},\n },\n states: {\n unknown: {\n always: [\n {cond: 'hasData', target: 'withData'},\n {cond: 'hasNoData', target: 'withoutData'},\n ],\n },\n withData: {\n always: [{cond: 'hasNoData', target: 'withoutData'}],\n },\n withoutData: {\n always: [{cond: 'hasData', target: 'withData'}],\n },\n },\n },\n failed: {\n type: 'final',\n },\n },\n },\n {\n actions: {\n setMessage: assign((_context, event: any) => ({\n message: event.data.details.description,\n })),\n setResults: assign((_context, event: any) => ({\n results: event.data,\n })),\n targetCreate: assign((context, event: any) => ({\n results: sortByTargetName([...context.results, event.deploymentTarget]),\n })),\n targetDelete: assign((context, event: any) => ({\n results: context.results.filter((target) => target._id !== event.id),\n })),\n targetUpdate: assign((context, event: any) => {\n const {deploymentTarget} = event\n const index = context.results.findIndex((target) => target._id === deploymentTarget._id)\n const updatedResults = Object.assign([], context.results, {\n [index]: event.deploymentTarget,\n })\n\n return {\n results: sortByTargetName(updatedResults),\n }\n }),\n },\n guards: {\n hasData: (context) => {\n return context?.results?.length > 0\n },\n hasNoData: (context) => {\n return context?.results?.length === 0\n },\n },\n }\n )\n\nexport default deploymentTargetListMachine\n","import fetch from 'unfetch'\nimport {Sanity} from '../types'\n\nconst fetcher =\n (deploymentTarget: Sanity.DeploymentTarget) =>\n async (url: string, extraParams?: URLSearchParams) => {\n const params = new URLSearchParams()\n params.set('projectId', deploymentTarget.projectId)\n if (deploymentTarget.teamId) {\n params.set('teamId', deploymentTarget.teamId)\n }\n\n if (extraParams) {\n for (const [k, v] of extraParams.entries()) {\n params.append(k, v)\n }\n }\n\n const response = await fetch(`${url}?${params.toString()}`, {\n headers: {\n Authorization: `Bearer ${deploymentTarget.token}`,\n },\n })\n\n // Manually throw on non-OK responses for react-query\n // https://react-query.tanstack.com/guides/query-functions#usage-with-fetch-and-others-clients-that-do-not-throw-by-default\n if (!response.ok) {\n throw new Error('Response not OK')\n }\n\n try {\n return response.json()\n } catch (err) {\n throw new Error(err as string)\n }\n }\n\nexport default fetcher\n","import hash from 'object-hash'\nimport {useQuery} from 'react-query'\n\nimport fetcher from '../utils/fetcher'\nimport {API_ENDPOINT_ALIASES, API_ENDPOINT_DEPLOYMENTS} from '../constants'\nimport {Sanity, Vercel} from '../types'\n\ntype Options = {\n enabled?: boolean\n}\n\nconst useDeployments = (deploymentTarget: Sanity.DeploymentTarget, options?: Options) => {\n const fetchUrl = fetcher(deploymentTarget)\n\n // Fetch deployments\n const deployParams = new URLSearchParams()\n deployParams.set('limit', String(deploymentTarget?.deployLimit))\n\n const {\n data: deploymentsData,\n isFetching: deploymentsIsFetching,\n isSuccess: deploymentsIsSuccess,\n error: deploymentsError,\n refetch,\n } = useQuery<{deployments: Vercel.Deployment[]}, Error>(\n hash(deploymentTarget), // key\n () => fetchUrl(API_ENDPOINT_DEPLOYMENTS, deployParams),\n {\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\n // Fetch aliases (only if deployments have been retrieved)\n const aliasParams = new URLSearchParams()\n aliasParams.set('limit', '20')\n\n const {\n data: aliasesData,\n isFetching: aliasesIsFetching,\n isSuccess: aliasesIsSuccess,\n error: aliasesError,\n } = useQuery<\n {\n aliases: Vercel.Alias[]\n pagination: {\n count: number\n next?: number\n prev?: number\n }\n },\n Error\n >(\n `${hash(deploymentTarget)}-aliases`, // key\n () => fetchUrl(API_ENDPOINT_ALIASES, aliasParams),\n {\n enabled: !!deploymentsData,\n refetchOnMount: false,\n refetchOnReconnect: false,\n refetchOnWindowFocus: false,\n retry: false,\n }\n )\n\n const aliases = aliasesData?.aliases as Vercel.Alias[]\n\n let deploymentsWithAlias: Vercel.DeploymentWithAlias[] | undefined\n\n if (aliases) {\n deploymentsWithAlias = deploymentsData?.deployments?.map((val: Vercel.DeploymentWithAlias) => {\n const alias = aliases.find((a) => a.deploymentId === val.uid)\n return {\n ...val,\n alias: alias?.alias,\n }\n })\n }\n\n return {\n deployments: deploymentsWithAlias,\n error: aliasesError || deploymentsError,\n isFetching: aliasesIsFetching || deploymentsIsFetching,\n isSuccess: aliasesIsSuccess && deploymentsIsSuccess,\n refetch,\n }\n}\n\nexport default useDeployments\n","import {Machine} from 'xstate'\n\ntype Context = {}\n\ntype Event = {type: 'ERROR'} | {type: 'REFRESH'} | {type: 'REFRESHED'} | {type: 'RETRY'}\n\ntype Schema = {\n states: {\n idle: {}\n refreshing: {}\n refreshed: {}\n error: {}\n }\n}\n\nconst refreshMachine = Machine<Context, Schema, Event>({\n initial: 'idle',\n states: {\n idle: {\n on: {\n REFRESH: 'refreshing',\n },\n },\n refreshing: {\n on: {\n ERROR: 'error',\n REFRESHED: 'refreshed',\n },\n },\n refreshed: {\n on: {\n REFRESH: 'refreshing',\n },\n },\n error: {\n on: {\n REFRESH: 'refreshing',\n },\n },\n },\n})\n\nexport default refreshMachine\n","import {useTheme} from '@sanity/ui'\n\nexport function useCardColor() {\n return useTheme().sanity.color.card.enabled\n}\n","import {Box, Label} from '@sanity/ui'\nimport React, {ReactNode} from 'react'\nimport {Sanity} from '../../types'\nimport {useCardColor} from '../../utils/useCardColor'\n\ntype Props = {\n children: ReactNode\n colSpan?: number\n header?: boolean\n variant?: 'age' | 'branch' | 'creator' | 'state'\n}\n\nconst TableCell = (props: Props) => {\n const {children, colSpan, header, variant} = props\n\n let display: Sanity.BoxDisplay | Sanity.BoxDisplay[] = 'table-cell'\n let cellWidth: string = 'auto'\n\n switch (variant) {\n case 'age':\n cellWidth = '50px'\n break\n case 'branch':\n cellWidth = '300px'\n display = ['none', 'none', 'none', 'table-cell']\n break\n case 'creator':\n cellWidth = '80px'\n break\n case 'state':\n cellWidth = '110px'\n display = ['none', 'none', 'none', 'none', 'table-cell']\n break\n default:\n break\n }\n\n const {border} = useCardColor()\n\n if (header) {\n return (\n <Box\n as=\"th\"\n colSpan={colSpan}\n // @ts-ignore\n display={display}\n paddingX={3}\n paddingY={2}\n style={{\n maxWidth: cellWidth,\n position: 'relative',\n textAlign: 'left',\n width: cellWidth,\n }}\n >\n <Label size={0}>{children}</Label>\n </Box>\n )\n }\n return (\n <Box\n as=\"td\"\n colSpan={colSpan}\n // @ts-ignore\n display={display}\n paddingX={3}\n paddingY={[2, 2, 3]}\n style={{\n borderTop: `1px solid ${border}`,\n maxWidth: cellWidth,\n position: 'relative',\n textAlign: 'left',\n width: cellWidth,\n }}\n >\n {children}\n </Box>\n )\n}\n\nexport default TableCell\n","import {Box} from '@sanity/ui'\nimport React from 'react'\n\nimport {VERCEL_STATUS_COLORS} from '../../constants'\nimport {Vercel} from '../../types'\n\ntype Props = {\n state: Vercel.DeploymentState\n}\n\nconst StatusDot = ({state}: Props) => (\n <Box\n style={{\n backgroundColor: `${VERCEL_STATUS_COLORS[state]}`,\n borderRadius: '20px',\n height: '9px',\n width: '9px',\n }}\n />\n)\n\nexport default StatusDot\n","import {Box, Flex, Stack, Text} from '@sanity/ui'\nimport React, {useRef} from 'react'\nimport ReactTimeAgo from 'react-time-ago'\n\nimport TableCell from '../TableCell'\nimport StatusDot from '../StatusDot'\nimport {LinkIcon} from '@sanity/icons'\nimport {Vercel} from '../../types'\n\ntype Props = {\n deployment: Vercel.DeploymentWithAlias\n}\n\nconst Deployment = (props: Props) => {\n const {deployment} = props\n\n const date = useRef(new Date(deployment.created))\n\n const commitMessage = deployment?.meta?.githubCommitMessage\n const commitRef = deployment?.meta?.githubCommitRef\n\n const targetUrl = deployment.alias ?? deployment.url\n\n return (\n <tr>\n {/* Deployment - alias or regular deployment URL */}\n <TableCell>\n <Flex align=\"center\">\n <Box\n display={['block', 'block', 'block', 'block', 'none']}\n marginRight={3}\n style={{flexShrink: 0}}\n >\n <StatusDot state={deployment.state} />\n </Box>\n\n {targetUrl ? (\n <>\n {/* Alias icon */}\n {deployment.alias && <LinkIcon />}\n\n <Box marginLeft={deployment.alias ? 1 : 0}>\n <Text\n muted={!(deployment.state === 'READY')}\n size={1}\n style={{\n textDecoration:\n deployment.state === 'CANCELED' || deployment.state === 'ERROR'\n ? 'line-through'\n : 'normal',\n }}\n textOverflow=\"ellipsis\"\n >\n {deployment.state === 'READY' ? (\n <a href={`https://${targetUrl}`} rel=\"noopener noreferrer\" target=\"_blank\">\n {targetUrl}\n </a>\n ) : (\n targetUrl\n )}\n </Text>\n </Box>\n </>\n ) : (\n <Text size={1}>Uploading...</Text>\n )}\n </Flex>\n </TableCell>\n\n {/* State */}\n <TableCell variant=\"state\">\n <Flex align=\"center\">\n <StatusDot state={deployment.state} />\n <Box marginLeft={2}>\n <Text size={1}>\n {deployment.state\n .trim()\n .toLowerCase()\n .replace(/^[a-z]/i, (t) => t.toUpperCase())}\n </Text>\n </Box>\n </Flex>\n </TableCell>\n\n {/* Branch */}\n <TableCell variant=\"branch\">\n <Stack space={2}>\n <Text size={1} textOverflow=\"ellipsis\">\n {commitRef}\n </Text>\n {commitMessage && (\n <Text muted size={1} textOverflow=\"ellipsis\">\n {commitMessage}\n </Text>\n )}\n </Stack>\n </TableCell>\n\n {/* Age */}\n <TableCell variant=\"age\">\n <Flex align=\"center\">\n <Text size={1}>\n <ReactTimeAgo date={date.current} locale=\"en-US\" timeStyle=\"mini\" />\n </Text>\n </Flex>\n </TableCell>\n\n {/* Creator */}\n <TableCell variant=\"creator\">\n <Flex align=\"center\" justify=\"center\">\n <img\n draggable={false}\n src={`https://vercel.com/api/www/avatar/${deployment?.creator?.uid}?&s=48`}\n style={{\n borderRadius: '20px',\n height: '20px',\n width: '20px',\n }}\n />\n </Flex>\n </TableCell>\n </tr>\n )\n}\n\nexport default Deployment\n","import fetch from 'unfetch'\nimport {assign, Machine} from 'xstate'\nimport {Vercel} from '../types'\n\ntype Context = {\n disabled: boolean\n feedback?: string\n label?: string\n error?: string\n}\n\ntype Event = {type: 'DEPLOY'}\n\ntype Schema = {\n states: {\n idle: {}\n deploying: {}\n success: {}\n error: {}\n }\n}\n\nconst deployMachine = (deployHook: string) =>\n Machine<Context, Schema, Event>(\n // Machine\n {\n id: 'deploy',\n initial: 'idle',\n context: {\n disabled: false,\n feedback: undefined,\n label: undefined,\n error: undefined,\n },\n states: {\n idle: {\n entry: assign({\n feedback: () => undefined,\n label: () => 'Deploy',\n }),\n on: {\n DEPLOY: 'deploying',\n },\n },\n deploying: {\n entry: assign({\n disabled: () => true,\n label: () => 'Deploying',\n }),\n exit: assign({\n disabled: () => false,\n label: () => 'Deploy',\n }),\n invoke: {\n onDone: {\n target: 'success',\n },\n onError: {\n target: 'error',\n actions: assign({\n error: (_context, event) => {\n return event.data\n },\n }),\n },\n src: 'deploy',\n },\n },\n success: {\n entry: [assign({feedback: () => 'Succesfully started!'})],\n exit: assign({\n feedback: () => undefined,\n }),\n on: {\n DEPLOY: 'deploying',\n },\n },\n error: {\n on: {\n DEPLOY: 'deploying',\n },\n },\n },\n },\n // Config\n {\n services: {\n deploy: (): Promise<void> => {\n return new Promise(async (resolve, reject) => {\n try {\n if (!deployHook) {\n return reject(new Error('No deployHook URL defined'))\n }\n\n const res = await fetch(deployHook, {method: 'POST'})\n const data = await res.json()\n\n if (!res.ok) {\n const errorMessage = (data?.error as Vercel.Error).message || res.statusText\n return reject(errorMessage)\n }\n\n return resolve()\n } catch (err) {\n console.error('Unable to deploy with error:', err)\n return reject(new Error('Please check the developer console for more information'))\n }\n })\n },\n },\n }\n )\n\nexport default deployMachine\n","import {UploadIcon} from '@sanity/icons'\nimport {Box, Button, useToast} from '@sanity/ui'\nimport {useMachine} from '@xstate/react'\nimport React, {useEffect, useMemo} from 'react'\n\nimport {WIDGET_NAME} from '../../constants'\nimport deployMachine from '../../machines/deploy'\nimport StateDebug from '../StateDebug'\n\ntype Props = {\n deployHook: string\n onDeploySuccess?: () => void\n targetName: string\n}\n\nconst DeployButton = (props: Props) => {\n const {deployHook, onDeploySuccess, targetName} = props\n\n const machine = useMemo(() => deployMachine(deployHook), [deployHook])\n\n const [deployState, deployStateTransition, deployStateInterpreter] = useMachine(machine)\n\n const toast = useToast()\n\n const isError = deployState.matches('error')\n const isSuccess = deployState.matches('success')\n\n // Callbacks\n const handleDeploy = () => {\n deployStateTransition({type: 'DEPLOY'})\n }\n\n // Effects\n useEffect(() => {\n if (isError) {\n toast.push({\n closable: true,\n description: `Unable to queue deploy for ${targetName}: ${deployState.context.error}`,\n duration: 8000,\n status: 'error',\n title: WIDGET_NAME,\n })\n }\n\n if (isSuccess) {\n toast.push({\n closable: true,\n description: `Deploy queued for ${targetName}`,\n duration: 8000,\n status: 'success',\n title: WIDGET_NAME,\n })\n }\n }, [isError, isSuccess, toast, targetName, deployState.context.error])\n\n useEffect(() => {\n deployStateInterpreter.onTransition((state) => {\n if (state.value === 'success') {\n if (onDeploySuccess) {\n onDeploySuccess()\n }\n }\n })\n }, [deployStateInterpreter, onDeploySuccess])\n\n return (\n <Box padding={3} style={{position: 'relative'}}>\n {/* xstate debug */}\n <StateDebug name=\"Deploy\" state={deployState} />\n\n <Button\n disabled={deployState.context.disabled}\n fontSize={1}\n icon={UploadIcon}\n mode=\"ghost\"\n onClick={handleDeploy}\n padding={3}\n text={`${deployState.context.label} ${targetName}`}\n tone=\"default\"\n />\n </Box>\n )\n}\n\nexport default DeployButton\n","import {Box} from '@sanity/ui'\nimport React from 'react'\nimport {useCardColor} from '../../utils/useCardColor'\n\nconst PlaceholderAvatar = () => {\n const {border} = useCardColor()\n return (\n <Box\n style={{\n backgroundColor: border,\n borderRadius: '20px',\n height: '20px',\n userSelect: 'none',\n width: '20px',\n }}\n />\n )\n}\n\nexport default PlaceholderAvatar\n","import {Box, Stack, Text} from '@sanity/ui'\nimport React from 'react'\nimport {useCardColor} from '../../utils/useCardColor'\n\ntype Props = {\n rows: number\n}\n\nconst PlaceholderText = (props: Props) => {\n const {rows} = props\n const {border} = useCardColor()\n return (\n <Box\n style={{\n backgroundColor: border,\n borderRadius: '3px',\n userSelect: 'none',\n width: '100%',\n }}\n >\n <Stack space={2}>\n {new Array(rows).fill(undefined).map((_, index) => (\n <Text key={index} size={1}>\n \n </Text>\n ))}\n </Stack>\n </Box>\n )\n}\n\nexport default PlaceholderText\n","import {Flex} from '@sanity/ui'\nimport React from 'react'\n\nimport PlaceholderAvatar from '../PlaceholderAvatar'\nimport PlaceholderText from '../PlaceholderText'\nimport TableCell from '../TableCell'\n\nconst DeploymentPlaceholder = () => {\n return (\n <tr>\n {/* Deployment - alias or regular deployment URL */}\n <TableCell>\n <PlaceholderText rows={1} />\n </TableCell>\n\n {/* State */}\n <TableCell variant=\"state\">\n <PlaceholderText rows={1} />\n </TableCell>\n\n {/* Branch */}\n <TableCell variant=\"branch\">\n <PlaceholderText rows={2} />\n </TableCell>\n\n {/* Age */}\n <TableCell variant=\"age\">\n <PlaceholderText rows={1} />\n </TableCell>\n\n {/* Creator */}\n <TableCell variant=\"creator\">\n <Flex justify=\"center\">\n <PlaceholderAvatar />\n </Flex>\n </TableCell>\n </tr>\n )\n}\n\nexport default DeploymentPlaceholder\n","import {Box, Text, useToast} from '@sanity/ui'\nimport {useMachine} from '@xstate/react'\nimport React, {useEffect, useRef} from 'react'\nimport useDeepCompareEffect from 'use-deep-compare-effect'\n\nimport {WIDGET_NAME} from '../../constants'\nimport useDeployments from '../../hooks/useDeployments'\nimport refreshMachine from '../../machines/refresh'\nimport Deployment from '../Deployment'\nimport DeployButton from '../DeployButton'\nimport DeploymentPlaceholder from '../DeploymentPlaceholder'\nimport StateDebug from '../StateDebug'\nimport TableCell from '../TableCell'\nimport {Sanity} from '../../types'\nimport {useCardColor} from '../../utils/useCardColor'\n\ntype Props = {\n deploymentTarget: Sanity.DeploymentTarget\n}\n\nconst Deployments = (props: Props) => {\n const {deploymentTarget} = props\n\n // Refs\n const refTimeout = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n // XState\n const [refreshState, refreshStateTransition] = useMachine(refreshMachine)\n\n // Fetch deployments - disable hook / auto-refetching on error state\n const {deployments, error, isFetching, isSuccess, refetch} = useDeployments(deploymentTarget, {\n enabled: !refreshState.matches('error'),\n })\n\n const toast = useToast()\n const isError = refreshState.matches('error')\n\n const handleDeploySuccess = () => {\n if (refTimeout.current) {\n clearTimeout(refTimeout.current)\n }\n refTimeout.current = setTimeout(() => {\n refetch({\n cancelRefetch: true,\n throwOnError: true,\n })\n }, 4000)\n }\n\n useEffect(() => {\n return () => {\n if (refTimeout.current) {\n clearTimeout(refTimeout.current)\n }\n }\n }, [])\n\n useEffect(() => {\n if (error) {\n refreshStateTransition({type: 'ERROR'})\n }\n\n if (isFetching) {\n refreshStateTransition({type: 'REFRESH'})\n }\n\n if (!isFetching && isSuccess) {\n refreshStateTransition({type: 'REFRESHED'})\n }\n }, [error, isFetching, isSuccess, refreshStateTransition])\n\n useDeepCompareEffect(() => {\n if (!refreshState.matches('refreshing')) {\n refreshStateTransition({type: 'REFRESH'})\n }\n }, [deploymentTarget])\n\n useDeepCompareEffect(() => {\n if (isError) {\n toast.push({\n closable: true,\n description: `Unable to fetch deployments for ${deploymentTarget.name}`,\n duration: 8000,\n status: 'error',\n title: WIDGET_NAME,\n })\n }\n }, [deploymentTarget, isError])\n\n const hasFetched = typeof deployments !== 'undefined'\n const hasDeployments = deployments && deployments.length > 0\n\n const {border} = useCardColor()\n return (\n <Box marginTop={3} style={{position: 'relative'}}>\n {/* xstate debug */}\n <StateDebug name=\"Refresh\" state={refreshState} />\n\n {!refreshState.matches('error') && (\n <>\n <Box\n as=\"table\"\n style={{\n borderBottom: `1px solid ${border}`,\n borderCollapse: 'collapse',\n display: 'table',\n tableLayout: 'fixed',\n width: '100%',\n }}\n >\n <Box as=\"thead\" style={{display: 'table-header-group'}}>\n <tr>\n {/* Deployment */}\n <TableCell header>Deployment</TableCell>\n\n {/* State */}\n <TableCell header variant=\"state\">\n State\n </TableCell>\n\n {/* Branch */}\n <TableCell header variant=\"branch\">\n Branch\n </TableCell>\n\n {/* Age */}\n <TableCell header variant=\"age\">\n Age\n </TableCell>\n\n {/* Creator */}\n <TableCell header variant=\"age\">\n Creator\n </TableCell>\n </tr>\n </Box>\n\n <Box as=\"tbody\" style={{display: 'table-header-group'}}>\n {/* Placeholders */}\n {!deployments &&\n new Array(deploymentTarget?.deployLimit)\n .fill(undefined)\n .map((_, index) => <DeploymentPlaceholder key={index} />)}\n {/* Deployments */}\n {hasDeployments &&\n deployments?.map((deployment) => (\n <Deployment deployment={deployment} key={deployment.uid} />\n ))}\n </Box>\n </Box>\n\n {/* No results */}\n {hasFetched && !hasDeployments && (\n <Box padding={3} style={{width: '100%'}}>\n <Text muted size={1}>\n No deployments found. Don't forget to specify a valid team ID if your project\n belongs to a team.\n </Text>\n </Box>\n )}\n </>\n )}\n\n {/* Error message */}\n {refreshState.matches('error') && (\n <Box padding={3}>\n <Text muted size={1}>\n Unable to fetch recent deployments. Please check your network and deployment settings.\n </Text>\n </Box>\n )}\n\n {/* Deploy button */}\n {!refreshState.matches('error') && deploymentTarget.deployHook && (\n <Box>\n <DeployButton\n deployHook={deploymentTarget.deployHook}\n onDeploySuccess={handleDeploySuccess}\n targetName={deploymentTarget.name}\n />\n </Box>\n )}\n </Box>\n )\n}\n\nexport default Deployments\n","import {EditIcon} from '@sanity/icons'\nimport {Box, Button, Flex, Text, Tooltip} from '@sanity/ui'\nimport React, {FC} from 'react'\n\nimport Deployments from '../Deployments'\nimport {Sanity} from '../../types'\n\ntype Props = {\n item: Sanity.DeploymentTarget\n onDialogEdit: (deploymentTarget: Sanity.DeploymentTarget) => void\n}\n\nconst DeploymentTarget: FC<Props> = (props: Props) => {\n const {item, onDialogEdit} = props\n\n const deploymentTarget = {\n deployHook: item.deployHook,\n deployLimit: item.deployLimit,\n name: item.name,\n projectId: item.projectId,\n teamId: item.teamId,\n token: item.token,\n } as Sanity.DeploymentTarget\n\n return (\n <Box style={{position: 'relative'}}>\n {/* Header */}\n <Flex align=\"center\" justify=\"space-between\" marginTop={2} paddingX={3}>\n <Text size={2}>{item.name}</Text>\n\n <Tooltip\n content={\n <Box padding={2}>\n <Text muted size={1}>\n Edit deployment target\n </Text>\n </Box>\n }\n placement=\"left\"\n >\n <Button fontSize={1} icon={EditIcon} mode=\"bleed\" onClick={() => onDialogEdit(item)} />\n </Tooltip>\n </Flex>\n\n {/* Content */}\n <Deployments deploymentTarget={deploymentTarget} />\n </Box>\n )\n}\n\nexport default DeploymentTarget\n","import React from 'react'\nimport {Stack} from '@sanity/ui'\n\nimport DeploymentTarget from '../DeploymentTarget'\nimport {Sanity} from '../../types'\n\ntype Props = {\n items: Sanity.DeploymentTarget[]\n onDialogEdit: (deploymentTarget: Sanity.DeploymentTarget) => void\n}\n\nconst DeploymentTargets = (props: Props) => {\n const {items, onDialogEdit} = props\n\n return (\n <Stack space={5}>\n {items?.map((item) => (\n <DeploymentTarget item={item} key={item._id} onDialogEdit={onDialogEdit} />\n ))}\n </Stack>\n )\n}\n\nexport default DeploymentTargets\n","import {assign, Machine} from 'xstate'\n\ntype Context = {\n formData?: Record<string, any>\n message: string\n}\n\ntype Event =\n | {type: 'CREATE'}\n | {type: 'DELETE'}\n | {type: 'REJECT'}\n | {type: 'RESOLVE'}\n | {type: 'SUBMIT'}\n | {type: 'UPDATE'}\n\ntype Schema = {\n states: {\n idle: {}\n creating: {}\n updating: {}\n deleting: {}\n success: {}\n error: {}\n }\n}\n\nconst formMachine = Machine<Context, Schema, Event>(\n {\n context: {\n formData: {},\n message: '',\n },\n initial: 'idle',\n states: {\n idle: {\n on: {\n CREATE: {\n actions: ['createDocument'],\n target: 'creating',\n },\n DELETE: {\n actions: ['deleteDocument'],\n target: 'deleting',\n },\n UPDATE: {\n actions: ['updateDocument'],\n target: 'updating',\n },\n },\n },\n creating: {\n invoke: {\n src: 'createDocumentService',\n onDone: {target: 'success'},\n onError: {actions: ['setMessage'], target: 'error'},\n },\n on: {\n RESOLVE: 'success',\n REJECT: 'error',\n },\n },\n updating: {\n invoke: {\n src: 'updateDocumentService',\n onDone: {target: 'success'},\n onError: {actions: ['setMessage'], target: 'error'},\n },\n on: {\n RESOLVE: 'success',\n REJECT: 'error',\n },\n },\n deleting: {\n invoke: {\n src: 'deleteDocumentService',\n onDone: {target: 'success'},\n onError: {actions: ['setMessage'], target: 'error'},\n },\n on: {\n RESOLVE: 'success',\n REJECT: 'error',\n },\n },\n success: {\n invoke: {\n src: 'formSubmittedService',\n },\n },\n error: {},\n },\n },\n {\n actions: {\n setMessage: assign((_context, event: any) => ({\n message: event.data.details.description,\n })),\n createDocument: assign((_context, event: any) => ({\n formData: event.formData,\n })),\n deleteDocument: assign(() => ({\n // id: event.id,\n })),\n updateDocument: assign((_context, event: any) => ({\n formData: event.formData,\n })),\n },\n }\n)\n\nexport default formMachine\n","// Recursively sanitize form data:\n// - convert empty strings, undefined values and empty arrays to null (to correctly unset / delete fields)\n// - trim whitespace on string fleids\n\ntype FormData = Record<string, any>\n\nconst sanitizeFormData = (formData: FormData): FormData => {\n return Object.keys(formData).reduce((acc: FormData, key) => {\n const val = formData[key]\n\n // TODO: refactor\n if (typeof val === 'object' && val !== null && val.constructor !== Array) {\n acc[key] = sanitizeFormData(val)\n } else if (val === '' || typeof val === 'undefined' || val?.length === 0) {\n acc[key] = null\n } else if (typeof val === 'string' && val) {\n acc[key] = formData[key].trim()\n } else {\n acc[key] = formData[key]\n }\n\n return acc\n }, {})\n}\n\nexport default sanitizeFormData\n","import {ErrorOutlineIcon} from '@sanity/icons'\nimport {Box, Inline, Text, Tooltip} from '@sanity/ui'\nimport React, {FC} from 'react'\n// @ts-expect-error - fix typings later\nimport {FieldError} from 'react-hook-form'\nimport {styled} from 'styled-components'\n\ntype Props = {\n description?: string\n error?: FieldError\n label: string\n name: string\n}\n\nconst StyledErrorOutlineIcon = styled(ErrorOutlineIcon)(({theme}) => {\n return {\n color: theme.sanity.color.spot.red,\n }\n})\n\nconst FormFieldInputLabel: FC<Props> = (props: Props) => {\n const {description, error, label, name} = props\n\n return (\n <Box marginBottom={3}>\n {/* Label */}\n <Inline space={2}>\n <Text as=\"label\" htmlFor={name} size={1} weight=\"semibold\">\n {label}\n </Text>\n\n {/* Error icon + tooltip */}\n {error && (\n <Text size={1}>\n <Tooltip\n content={\n <Box padding={2}>\n <Text muted size={1}>\n <StyledErrorOutlineIcon style={{marginRight: '0.1em'}} />\n {error.message}\n </Text>\n </Box>\n }\n fallbackPlacements={['top', 'left']}\n placement=\"right\"\n portal\n >\n <StyledErrorOutlineIcon />\n </Tooltip>\n </Text>\n )}\n </Inline>\n\n {/* Description */}\n {description && (\n <Box marginY={3}>\n <Text htmlFor={name} muted size={1}>\n {description}\n </Text>\n </Box>\n )}\n </Box>\n )\n}\n\nexport default FormFieldInputLabel\n","import {Box, TextInput} from '@sanity/ui'\nimport React, {forwardRef} from 'react'\n// @ts-expect-error - fix typings later\nimport {FieldError} from 'react-hook-form'\n\nimport FormFieldInputLabel from '../FormFieldInputLabel'\n\ntype Props = {\n description?: string\n disabled?: boolean\n error?: FieldError\n label: string\n name: string\n placeholder?: string\n value?: string\n}\n\ntype Ref = HTMLInputElement\n\nconst FormFieldInputText = forwardRef<Ref, Props>((props: Props, ref) => {\n const {description, disabled, error, label, name, placeholder, value} = props\n\n return (\n <Box>\n {/* Label */}\n <FormFieldInputLabel description={description} error={error} label={label} name={name} />\n {/* Input */}\n <TextInput\n autoComplete=\"off\"\n autoFocus\n defaultValue={value}\n disabled={disabled}\n id={name}\n name={name}\n placeholder={placeholder}\n ref={ref}\n />\n </Box>\n )\n})\n\nexport default FormFieldInputText\n","import type {SanityClient} from '@sanity/client'\nimport {API_VERSION} from './constants'\nimport {useClient} from 'sanity'\n\nexport function useSanityClient(): SanityClient {\n return useClient({apiVersion: API_VERSION})\n}\n","// @ts-expect-error - fix typings later\nimport {yupResolver} from '@hookform/resolvers/yup'\nimport {Box, Button, Dialog, Flex, Stack} from '@sanity/ui'\nimport {uuid} from '@sanity/uuid'\nimport {useMachine} from '@xstate/react'\nimport React, {FC} from 'react'\n// @ts-expect-error - fix typings later\nimport {useForm} from 'react-hook-form'\nimport * as yup from 'yup'\n\nimport {DEPLOYMENT_TARGET_DOCUMENT_TYPE, Z_INDEX_DIALOG} from '../../constants'\nimport formMachine from '../../machines/form'\nimport sanitizeFormData from '../../utils/sanitizeFormData'\nimport FormFieldInputText from '../FormFieldInputText'\nimport {Sanity} from '../../types'\nimport {useSanityClient} from '../../client'\n\ntype Props = {\n deploymentTarget?: Sanity.DeploymentTarget\n onClose: () => void\n onCreate?: (deploymentTarget: Sanity.DeploymentTarget) => void\n onDelete?: (id: string) => void\n onUpdate?: (deploymentTarget: Sanity.DeploymentTarget) => void\n}\n\ntype FormData = yup.InferType<typeof formSchema>\n\nconst formSchema = yup.object().shape({\n deployHook: yup.string().url('Deploy hook must be a valid URL'),\n deployLimit: yup\n .number()\n .positive()\n .integer()\n .min(1, 'Deploy limit must no less than 1')\n .max(15, 'Deploy limit must no higher than 15')\n .typeError('Deploy limit must be a number')\n .required('Deploy limit must be a positive integer between 1 and 15'),\n name: yup.string().required('Name cannot be empty'),\n projectId: yup.string().required('Vercel Project ID cannot be empty'),\n teamId: yup.string(),\n token: yup.string().required('Vercel Account Token cannot be empty'),\n})\n\nconst DialogForm: FC<Props> = (props: Props) => {\n const {deploymentTarget, onClose, onCreate, onDelete, onUpdate} = props\n const client = useSanityClient()\n\n // xstate\n const [formState, formStateTransition] = useMachine(formMachine, {\n services: {\n formSubmittedService: async () => {\n onClose()\n },\n // TODO: refactor\n createDocumentService: async (_context, event: any) => {\n let document\n try {\n document = await client.create({\n _id: `vercel.${uuid()}`,\n _type: DEPLOYMENT_TARGET_DOCUMENT_TYPE,\n ...event.formData,\n })\n if (onCreate) {\n onCreate(document as Sanity.DeploymentTarget)\n }\n return Promise.resolve()\n } catch (e) {\n return Promise.reject(e)\n }\n },\n // TODO: refactor\n deleteDocumentService: async () => {\n if (deploymentTarget) {\n try {\n await client.delete(deploymentTarget._id)\n if (onDelete) {\n onDelete(deploymentTarget._id)\n }\n return Promise.resolve()\n } catch (e) {\n return Promise.reject(e)\n }\n }\n return Promise.resolve()\n },\n // TODO: refactor\n updateDocumentService: async (_context, event: any) => {\n let document\n if (deploymentTarget) {\n try {\n document = await client.patch(deploymentTarget._id).set(event.formData).commit()\n if (onUpdate) {\n onUpdate(document as Sanity.DeploymentTarget)\n }\n return Promise.resolve()\n } catch (e) {\n return Promise.reject(e)\n }\n }\n return Promise.resolve()\n },\n },\n })\n\n const formUpdating =\n formState.matches('creating') || formState.matches('deleting') || formState.matches('updating')\n\n // react-hook-form\n const {\n // Read the formState before render to subscribe the form state through Proxy\n formState: {errors, isDirty, isValid},\n handleSubmit,\n register,\n } = useForm({\n defaultValues: {\n deployHook: deploymentTarget?.deployHook || '',\n deployLimit: deploymentTarget?.deployLimit || 5,\n name: deploymentTarget?.name,\n projectId: deploymentTarget?.projectId,\n teamId: deploymentTarget?.teamId || '',\n token: deploymentTarget?.token,\n },\n mode: 'onChange',\n resolver: yupResolver(formSchema),\n })\n\n // Callbacks\n // - submit react-hook-form\n const onSubmit = async (formData: FormData) => {\n const sanitizedFormData = sanitizeFormData(formData)\n await formStateTransition(deploymentTarget ? 'UPDATE' : 'CREATE', {\n formData: sanitizedFormData,\n })\n }\n\n const handleDelete = () => {\n formStateTransition('DELETE', {id: deploymentTarget?._id})\n }\n\n const Footer = () => (\n <Box padding={3}>\n <Flex justify={deploymentTarget ? 'space-between' : 'flex-end'}>\n {/* Delete button */}\n {deploymentTarget && (\n <Button\n disabled={formUpdating}\n fontSize={1}\n mode=\"bleed\"\n onClick={handleDelete}\n text=\"Delete\"\n tone=\"critical\"\n />\n )}\n\n {/* Submit button */}\n <Button\n disabled={formUpdating || !isDirty || !isValid}\n fontSize={1}\n onClick={handleSubmit(onSubmit)}\n text={deploymentTarget ? 'Update and close' : 'Create'}\n tone=\"primary\"\n />\n </Flex>\n </Box>\n )\n\n return (\n <Dialog\n footer={<Footer />}\n header={`${deploymentTarget ? 'Edit' : 'Create'} deployment target`}\n id=\"create\"\n onClose={onClose}\n width={1}\n zOffset={Z_INDEX_DIALOG}\n >\n {/* We reverse direction to ensure that inline links dont autofocus before other form elements */}\n <Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n {/* Hidden button to enable enter key submissions */}\n <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n {/* Form fields */}\n <Stack space={5}>\n {/* Title */}\n <FormFieldInputText\n disabled={formUpdating}\n description=\"Name displayed in this plugin (e.g. production, staging)\"\n error={errors?.name}\n label=\"Name\"\n name=\"name\"\n ref={register}\n />\n\n <FormFieldInputText\n disabled={formUpdating}\n error={errors?.token}\n label=\"Vercel Account Token\"\n name=\"token\"\n ref={register}\n />\n\n <FormFieldInputText\n disabled={formUpdating}\n error={errors?.projectId}\n label=\"Vercel Project ID\"\n name=\"projectId\"\n ref={register}\n />\n\n <FormFieldInputText\n description=\"Required only if your project is owned by a team account\"\n disabled={formUpdating}\n error={errors?.teamId}\n label=\"Vercel Team ID (optional)\"\n name=\"teamId\"\n ref={register}\n />\n\n <FormFieldInputText\n description=\"Enter a valid deploy hook URL to enable manual deploys\"\n disabled={formUpdating}\n error={errors?.deployHook}\n label=\"Vercel Deploy Hook (optional)\"\n name=\"deployHook\"\n ref={register}\n />\n\n <FormFieldInputText\n disabled={formUpdating}\n error={errors?.deployLimit}\n label=\"Number of deploys to display\"\n name=\"deployLimit\"\n ref={register({valueAsNumber: true})}\n />\n </Stack>\n </Box>\n </Dialog>\n )\n}\n\nexport default DialogForm\n","import {assign, Machine} from 'xstate'\nimport {Sanity} from '../types'\n\ntype Context = {\n editDeploymentTarget?: Sanity.DeploymentTarget\n}\n\ntype Event =\n | {type: 'CREATE'}\n | {type: 'CLOSE'}\n | {type: 'EDIT'; deploymentTarget: Sanity.DeploymentTarget}\n\ntype Schema = {\n states: {\n idle: {}\n edit: {}\n create: {}\n }\n}\n\nconst dialogMachine = () =>\n Machine<Context, Schema, Event>(\n {\n context: {\n editDeploymentTarget: undefined,\n },\n initial: 'idle',\n states: {\n idle: {\n entry: assign({\n editDeploymentTarget: () => undefined,\n }),\n on: {\n CREATE: 'create',\n EDIT: {\n actions: ['setEditDeploymentTarget'],\n target: 'edit',\n },\n },\n },\n edit: {\n on: {\n CLOSE: 'idle',\n },\n },\n create: {\n on: {\n CLOSE: 'idle',\n },\n },\n },\n },\n {\n actions: {\n setEditDeploymentTarget: assign((_context, event: any) => ({\n editDeploymentTarget: event.deploymentTarget,\n })),\n },\n }\n )\n\nexport default dialogMachine\n","import {AddIcon} from '@sanity/icons'\nimport {Box, Button, Card, Flex, Text, ToastProvider, Tooltip} from '@sanity/ui'\nimport {useMachine} from '@xstate/react'\nimport React from 'react'\nimport {QueryClient, QueryClientProvider} from 'react-query'\n\nimport StateDebug from './components/StateDebug'\nimport {DEPLOYMENT_TARGET_DOCUMENT_TYPE, Z_INDEX_TOAST_PROVIDER} from './constants'\nimport deploymentTargetListMachine from './machines/deploymentTargetList'\nimport DeploymentTargets from './components/DeploymentTargets'\nimport DialogForm from './components/DialogForm'\nimport dialogMachine from './machines/dialog'\nimport {Sanity} from './types'\nimport {useSanityClient} from './client'\n\nconst Widget = () => {\n const client = useSanityClient()\n // xstate\n const [deploymentTargetListState, deploymentTargetListStateTransition] = useMachine(\n deploymentTargetListMachine,\n {\n services: {\n fetchDataService: () => {\n return client\n .fetch(`*[_type == \"${DEPLOYMENT_TARGET_DOCUMENT_TYPE}\"] | order(name asc)`)\n .then((result: any) => result)\n },\n },\n }\n )\n const [dialogState, dialogStateTransition] = useMachine(dialogMachine)\n\n const queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n cacheTime: 0,\n staleTime: 0,\n },\n },\n })\n\n // Callbacks\n const handleDialogClose = () => {\n dialogStateTransition('CLOSE')\n }\n const handleDialogShowCreate = () => {\n dialogStateTransition('CREATE')\n }\n const handleDialogShowEdit = (deploymentTarget: Sanity.DeploymentTarget) => {\n dialogStateTransition('EDIT', {deploymentTarget})\n }\n const handleTargetCreate = (deploymentTarget: Sanity.DeploymentTarget) => {\n deploymentTargetListStateTransition('CREATE', {deploymentTarget})\n }\n const handleTargetDelete = (id: string) => {\n deploymentTargetListStateTransition('DELETE', {id})\n }\n const handleTargetUpdate = (deploymentTarget: Sanity.DeploymentTarget) => {\n deploymentTargetListStateTransition('UPDATE', {deploymentTarget})\n }\n\n return (\n <ToastProvider zOffset={Z_INDEX_TOAST_PROVIDER}>\n <QueryClientProvider client={queryClient}>\n <Card radius={2} style={{overflow: 'hidden '}}>\n {/* xstate debug */}\n <StateDebug name=\"List\" state={deploymentTargetListState} />\n\n {/* Header */}\n <Flex align=\"center\" justify=\"space-between\" paddingX={3} paddingY={2}>\n <Text size={5} weight=\"semibold\">\n Vercel deployments\n </Text>\n\n <Tooltip\n content={\n <Box padding={2}>\n <Text muted size={1}>\n Create new deployment target\n </Text>\n </Box>\n }\n placement=\"left\"\n >\n <Button fontSize={1} icon={AddIcon} onClick={handleDialogShowCreate} mode=\"bleed\" />\n </Tooltip>\n </Flex>\n\n <Box>\n {deploymentTargetListState.matches('pending') && (\n <Box paddingX={3} paddingY={4}>\n <Text>Loading...</Text>\n </Box>\n )}\n\n {deploymentTargetListState.matches('ready.withoutData') && (\n <Box paddingX={3} paddingY={4}>\n <Text>\n No deployment targets found.{' '}\n <a onClick={handleDialogShowCreate} style={{cursor: 'pointer'}}>\n Create a new target?\n </a>\n </Text>\n </Box>\n )}\n\n {deploymentTargetListState.matches('ready.withData') && (\n <DeploymentTargets\n items={deploymentTargetListState.context.results}\n onDialogEdit={handleDialogShowEdit}\n />\n )}\n\n {deploymentTargetListState.matches('failed') && (\n <Box paddingX={3} paddingY={4}>\n <Text>\n Failed to retrieve deployment targets. Please check the developer console log for\n more information.\n </Text>\n </Box>\n )}\n </Box>\n </Card>\n\n {/* Dialogs */}\n {dialogState.matches('create') && (\n <DialogForm onClose={handleDialogClose} onCreate={handleTargetCreate} />\n )}\n\n {dialogState.matches('edit') && (\n <DialogForm\n deploymentTarget={dialogState.context.editDeploymentTarget}\n onClose={handleDialogClose}\n onDelete={handleTargetDelete}\n onUpdate={handleTargetUpdate}\n />\n )}\n </QueryClientProvider>\n </ToastProvider>\n )\n}\n\nexport default Widget\n","import Widget from './app'\n\n// Initialize `javascript-time-ago` locale (required for react-time-ago)\nimport TimeAgo from 'javascript-time-ago'\nimport en from 'javascript-time-ago/locale/en'\nimport {DashboardWidget, type LayoutConfig} from '@sanity/dashboard'\n\nTimeAgo.addDefaultLocale(en)\n\nexport function vercelWidget(config: {layout?: LayoutConfig} = {}): DashboardWidget {\n return {\n name: 'vercel',\n component: Widget,\n layout: config.layout ?? {width: 'full'},\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/constants.ts","../src/components/StateDebug/index.tsx","../src/machines/deploymentTargetList.ts","../src/utils/fetcher.ts","../src/hooks/useDeployments.ts","../src/machines/refresh.ts","../src/utils/useCardColor.ts","../src/components/TableCell/index.tsx","../src/components/StatusDot/index.tsx","../src/components/Deployment/index.tsx","../src/machines/deploy.ts","../src/components/DeployButton/index.tsx","../src/components/PlaceholderAvatar/index.tsx","../src/components/PlaceholderText/index.tsx","../src/components/DeploymentPlaceholder/index.tsx","../src/components/Deployments/index.tsx","../src/components/DeploymentTarget/index.tsx","../src/components/DeploymentTargets/index.tsx","../src/machines/form.ts","../src/utils/sanitizeFormData.ts","../src/components/FormFieldInputLabel/index.tsx","../src/components/FormFieldInputText/index.tsx","../src/client.ts","../src/components/DialogForm/index.tsx","../src/machines/dialog.ts","../src/app.tsx","../src/index.ts"],"sourcesContent":["// https://vercel.com/docs/platform/limits\nexport const API_ENDPOINT_DEPLOYMENTS = 'https://api.vercel.com/v5/now/deployments'\nexport const API_ENDPOINT_ALIASES = 'https://api.vercel.com/v3/now/aliases'\n\n// Sanity API version\nexport const API_VERSION = '1'\n\nexport const DEBUG_MODE = false\n\nexport const DEPLOYMENT_TARGET_DOCUMENT_TYPE = 'vercel.deploymentTarget'\n\nexport const VERCEL_STATUS_COLORS = {\n BUILDING: '#f5a623',\n CANCELED: '#ff0000',\n ERROR: '#ff0000',\n READY: '#50e3c2',\n QUEUED: '#333',\n}\n\n// Name displayed in toasts\nexport const WIDGET_NAME = 'Vercel (dashboard)'\n\n// NOTE: Manually set plugin z-index values to be higher than Sanity's header search field\n// (which is currently 500202). Also ensure toasts always sit above dialogs.\nexport const Z_INDEX_DIALOG = 600001\nexport const Z_INDEX_TOAST_PROVIDER = 600002\n","import {Box, Card, Stack, Text} from '@sanity/ui'\nimport React from 'react'\n\nimport {DEBUG_MODE} from '../../constants'\n\ntype Props = {\n name: string\n state: any // TODO: type correctly\n}\n\nconst StateDebug = (props: Props) => {\n const {name, state} = props\n\n if (!DEBUG_MODE) {\n return null\n }\n\n return (\n <Card\n scheme=\"dark\"\n style={{\n backgroundColor: 'rgba(0, 0, 255, 0.9)',\n borderRadius: '3px',\n fontSize: 1,\n fontWeight: 500,\n lineHeight: 'body',\n right: 0,\n opacity: 0.75,\n pointerEvents: 'none',\n position: 'absolute',\n textAlign: 'left',\n top: 0,\n zIndex: 9000,\n }}\n >\n <Box padding={2}>\n <Stack space={2}>\n <Text size={0}>Name: {name}</Text>\n <Text size={0}>state.value: {JSON.stringify(state.value)}</Text>\n </Stack>\n </Box>\n </Card>\n )\n}\n\nexport default StateDebug\n","import {assign, Machine} from 'xstate'\nimport {Sanity} from '../types'\n\ntype Context = {\n message: string\n results: Sanity.DeploymentTarget[] // TODO: type correctly\n}\n\ntype Event =\n | {type: 'CLOSE'}\n | {type: 'CREATE'; deploymentTarget: Sanity.DeploymentTarget}\n | {type: 'DELETE'; id: string}\n | {type: 'FETCH'}\n | {type: 'REJECT'; message: string}\n | {type: 'RESOLVE'; results: any[]}\n | {type: 'UPDATE'}\n\ntype Schema = {\n states: {\n failed: {}\n pending: {}\n ready: {\n states: {\n unknown: {}\n withData: {}\n withoutData: {}\n }\n }\n }\n}\n\nconst sortByTargetName = (items: Sanity.DeploymentTarget[]) => {\n return items.sort((a, b) => {\n if (a.name > b.name) {\n return 1\n }\n\n if (a.name < b.name) {\n return -1\n }\n\n return 0\n })\n}\n\nconst deploymentTargetListMachine = () =>\n Machine<Context, Schema, Event>(\n {\n context: {\n message: '',\n results: [],\n },\n initial: 'pending',\n states: {\n pending: {\n invoke: {\n src: 'fetchDataService',\n onDone: {actions: ['setResults'], target: 'ready'},\n onError: {actions: ['setMessage'], target: 'failed'},\n },\n },\n ready: {\n initial: 'unknown',\n on: {\n CREATE: {actions: ['targetCreate']},\n DELETE: {actions: ['targetDelete']},\n UPDATE: {actions: ['targetUpdate']},\n },\n states: {\n unknown: {\n always: [\n {cond: 'hasData', target: 'withData'},\n {cond: 'hasNoData', target: 'withoutData'},\n ],\n },\n withData: {\n always: [{cond: 'hasNoData', target: 'withoutData'}],\n },\n withoutData: {\n always: [{cond: 'hasData', target: 'withData'}],\n },\n },\n },\n failed: {\n type: 'final',\n },\n },\n },\n {\n actions: {\n setMessage: assign((_context, event: any) => ({\n message: event.data.details.description,\n })),\n setResults: assign((_context, event: any) => ({\n results: event.data,\n })),\n targetCreate: assign((context, event: any) => ({\n results: sortByTargetName([...context.results, event.deploymentTarget]),\n })),\n targetDelete: assign((context, event: any) => ({\n results: context.results.filter((target) => target._id !== event.id),\n })),\n targetUpdate: assign((context, event: any) => {\n const {deploymentTarget} = event\n const index = context.results.findIndex((target) => target._id === deploymentTarget._id)\n const updatedResults = Object.assign([], context.results, {\n [index]: event.deploymentTarget,\n })\n\n return {\n results: sortByTargetName(updatedResults),\n }\n }),\n },\n guards: {\n hasData: (context) => {\n return context?.results?.length > 0\n },\n hasNoData: (context) => {\n return context?.results?.length === 0\n },\n },\n }\n )\n\nexport default deploymentTargetListMachine\n","import fetch from 'unfetch'\nimport {Sanity} from '../types'\n\nconst fetcher =\n (deploymentTarget: Sanity.DeploymentTarget) =>\n async (url: string, extraParams?: URLSearchParams) => {\n const params = new URLSearchParams()\n params.set('projectId', deploymentTarget.projectId)\n if (deploymentTarget.teamId) {\n params.set('teamId', deploymentTarget.teamId)\n }\n\n if (extraParams) {\n for (const [k, v] of extraParams.entries()) {\n params.append(k, v)\n }\n }\n\n const response = await fetch(`${url}?${params.toString()}`, {\n headers: {\n Authorization: `Bearer ${deploymentTarget.token}`,\n },\n })\n\n // Manually throw on non-OK responses for react-query\n // https://react-query.tanstack.com/guides/query-functions#usage-with-fetch-and-others-clients-that-do-not-throw-by-default\n if (!response.ok) {\n throw new Error('Response not OK')\n }\n\n try {\n return response.json()\n } catch (err) {\n throw new Error(err as string)\n }\n }\n\nexport default fetcher\n","import hash from 'object-hash'\nimport {useQuery} from '@tanstack/react-query'\n\nimport fetcher from '../utils/fetcher'\nimport {API_ENDPOINT_ALIASES, API_ENDPOINT_DEPLOYMENTS} from '../constants'\nimport {Sanity, Vercel} from '../types'\n\ntype Options = {\n enabled?: boolean\n}\n\nconst useDeployments = (deploymentTarget: Sanity.DeploymentTarget, options?: Options) => {\n const fetchUrl = fetcher(deploymentTarget)\n\n // Fetch deployments\n const deployParams = new URLSearchParams()\n deployParams.set('limit', String(deploymentTarget?.deployLimit))\n\n const {\n data: deploymentsData,\n isFetching: deploymentsIsFetching,\n isSuccess: deploymentsIsSuccess,\n error: deploymentsError,\n refetch,\n } = useQuery<{deployments: Vercel.Deployment[]}, Error>({\n queryKey: [hash(deploymentTarget)],\n queryFn: () => fetchUrl(API_ENDPOINT_DEPLOYMENTS, deployParams),\n enabled: options?.enabled ?? true,\n refetchInterval: 20000, // ms\n refetchIntervalInBackground: false,\n refetchOnMount: true,\n refetchOnReconnect: 'always',\n refetchOnWindowFocus: false,\n retry: false,\n })\n\n // Fetch aliases (only if deployments have been retrieved)\n const aliasParams = new URLSearchParams()\n aliasParams.set('limit', '20')\n\n const {\n data: aliasesData,\n isFetching: aliasesIsFetching,\n isSuccess: aliasesIsSuccess,\n error: aliasesError,\n } = useQuery<\n {\n aliases: Vercel.Alias[]\n pagination: {\n count: number\n next?: number\n prev?: number\n }\n },\n Error\n >({\n queryKey: [hash(deploymentTarget), 'aliases'],\n queryFn: () => fetchUrl(API_ENDPOINT_ALIASES, aliasParams),\n enabled: !!deploymentsData,\n refetchOnMount: false,\n refetchOnReconnect: false,\n refetchOnWindowFocus: false,\n retry: false,\n })\n\n const aliases = aliasesData?.aliases as Vercel.Alias[]\n\n let deploymentsWithAlias: Vercel.DeploymentWithAlias[] | undefined\n\n if (aliases) {\n deploymentsWithAlias = deploymentsData?.deployments?.map((val: Vercel.DeploymentWithAlias) => {\n const alias = aliases.find((a) => a.deploymentId === val.uid)\n return {\n ...val,\n alias: alias?.alias,\n }\n })\n }\n\n return {\n deployments: deploymentsWithAlias,\n error: aliasesError || deploymentsError,\n isFetching: aliasesIsFetching || deploymentsIsFetching,\n isSuccess: aliasesIsSuccess && deploymentsIsSuccess,\n refetch,\n }\n}\n\nexport default useDeployments\n","import {Machine} from 'xstate'\n\ntype Context = {}\n\ntype Event = {type: 'ERROR'} | {type: 'REFRESH'} | {type: 'REFRESHED'} | {type: 'RETRY'}\n\ntype Schema = {\n states: {\n idle: {}\n refreshing: {}\n refreshed: {}\n error: {}\n }\n}\n\nconst refreshMachine = Machine<Context, Schema, Event>({\n initial: 'idle',\n states: {\n idle: {\n on: {\n REFRESH: 'refreshing',\n },\n },\n refreshing: {\n on: {\n ERROR: 'error',\n REFRESHED: 'refreshed',\n },\n },\n refreshed: {\n on: {\n REFRESH: 'refreshing',\n },\n },\n error: {\n on: {\n REFRESH: 'refreshing',\n },\n },\n },\n})\n\nexport default refreshMachine\n","import {useTheme} from '@sanity/ui'\n\nexport function useCardColor() {\n return useTheme().sanity.color.card.enabled\n}\n","import {Box, Label} from '@sanity/ui'\nimport React, {ReactNode} from 'react'\nimport {Sanity} from '../../types'\nimport {useCardColor} from '../../utils/useCardColor'\n\ntype Props = {\n children: ReactNode\n colSpan?: number\n header?: boolean\n variant?: 'age' | 'branch' | 'creator' | 'state'\n}\n\nconst TableCell = (props: Props) => {\n const {children, colSpan, header, variant} = props\n\n let display: Sanity.BoxDisplay | Sanity.BoxDisplay[] = 'table-cell'\n let cellWidth: string = 'auto'\n\n switch (variant) {\n case 'age':\n cellWidth = '50px'\n break\n case 'branch':\n cellWidth = '300px'\n display = ['none', 'none', 'none', 'table-cell']\n break\n case 'creator':\n cellWidth = '80px'\n break\n case 'state':\n cellWidth = '110px'\n display = ['none', 'none', 'none', 'none', 'table-cell']\n break\n default:\n break\n }\n\n const {border} = useCardColor()\n\n if (header) {\n return (\n <Box\n as=\"th\"\n colSpan={colSpan}\n // @ts-ignore\n display={display}\n paddingX={3}\n paddingY={2}\n style={{\n maxWidth: cellWidth,\n position: 'relative',\n textAlign: 'left',\n width: cellWidth,\n }}\n >\n <Label size={0}>{children}</Label>\n </Box>\n )\n }\n return (\n <Box\n as=\"td\"\n colSpan={colSpan}\n // @ts-ignore\n display={display}\n paddingX={3}\n paddingY={[2, 2, 3]}\n style={{\n borderTop: `1px solid ${border}`,\n maxWidth: cellWidth,\n position: 'relative',\n textAlign: 'left',\n width: cellWidth,\n }}\n >\n {children}\n </Box>\n )\n}\n\nexport default TableCell\n","import {Box} from '@sanity/ui'\nimport React from 'react'\n\nimport {VERCEL_STATUS_COLORS} from '../../constants'\nimport {Vercel} from '../../types'\n\ntype Props = {\n state: Vercel.DeploymentState\n}\n\nconst StatusDot = ({state}: Props) => (\n <Box\n style={{\n backgroundColor: `${VERCEL_STATUS_COLORS[state]}`,\n borderRadius: '20px',\n height: '9px',\n width: '9px',\n }}\n />\n)\n\nexport default StatusDot\n","import {Box, Flex, Stack, Text} from '@sanity/ui'\nimport React, {useRef} from 'react'\nimport ReactTimeAgo from 'react-time-ago'\n\nimport TableCell from '../TableCell'\nimport StatusDot from '../StatusDot'\nimport {LinkIcon} from '@sanity/icons'\nimport {Vercel} from '../../types'\n\ntype Props = {\n deployment: Vercel.DeploymentWithAlias\n}\n\nconst Deployment = (props: Props) => {\n const {deployment} = props\n\n const date = useRef(new Date(deployment.created))\n\n const commitMessage = deployment?.meta?.githubCommitMessage\n const commitRef = deployment?.meta?.githubCommitRef\n\n const targetUrl = deployment.alias ?? deployment.url\n\n return (\n <tr>\n {/* Deployment - alias or regular deployment URL */}\n <TableCell>\n <Flex align=\"center\">\n <Box\n display={['block', 'block', 'block', 'block', 'none']}\n marginRight={3}\n style={{flexShrink: 0}}\n >\n <StatusDot state={deployment.state} />\n </Box>\n\n {targetUrl ? (\n <>\n {/* Alias icon */}\n {deployment.alias && <LinkIcon />}\n\n <Box marginLeft={deployment.alias ? 1 : 0}>\n <Text\n muted={!(deployment.state === 'READY')}\n size={1}\n style={{\n textDecoration:\n deployment.state === 'CANCELED' || deployment.state === 'ERROR'\n ? 'line-through'\n : 'normal',\n }}\n textOverflow=\"ellipsis\"\n >\n {deployment.state === 'READY' ? (\n <a href={`https://${targetUrl}`} rel=\"noopener noreferrer\" target=\"_blank\">\n {targetUrl}\n </a>\n ) : (\n targetUrl\n )}\n </Text>\n </Box>\n </>\n ) : (\n <Text size={1}>Uploading...</Text>\n )}\n </Flex>\n </TableCell>\n\n {/* State */}\n <TableCell variant=\"state\">\n <Flex align=\"center\">\n <StatusDot state={deployment.state} />\n <Box marginLeft={2}>\n <Text size={1}>\n {deployment.state\n .trim()\n .toLowerCase()\n .replace(/^[a-z]/i, (t) => t.toUpperCase())}\n </Text>\n </Box>\n </Flex>\n </TableCell>\n\n {/* Branch */}\n <TableCell variant=\"branch\">\n <Stack space={2}>\n <Text size={1} textOverflow=\"ellipsis\">\n {commitRef}\n </Text>\n {commitMessage && (\n <Text muted size={1} textOverflow=\"ellipsis\">\n {commitMessage}\n </Text>\n )}\n </Stack>\n </TableCell>\n\n {/* Age */}\n <TableCell variant=\"age\">\n <Flex align=\"center\">\n <Text size={1}>\n <ReactTimeAgo date={date.current} locale=\"en-US\" timeStyle=\"mini\" />\n </Text>\n </Flex>\n </TableCell>\n\n {/* Creator */}\n <TableCell variant=\"creator\">\n <Flex align=\"center\" justify=\"center\">\n <img\n draggable={false}\n src={`https://vercel.com/api/www/avatar/${deployment?.creator?.uid}?&s=48`}\n style={{\n borderRadius: '20px',\n height: '20px',\n width: '20px',\n }}\n />\n </Flex>\n </TableCell>\n </tr>\n )\n}\n\nexport default Deployment\n","import fetch from 'unfetch'\nimport {assign, Machine} from 'xstate'\nimport {Vercel} from '../types'\n\ntype Context = {\n disabled: boolean\n feedback?: string\n label?: string\n error?: string\n}\n\ntype Event = {type: 'DEPLOY'}\n\ntype Schema = {\n states: {\n idle: {}\n deploying: {}\n success: {}\n error: {}\n }\n}\n\nconst deployMachine = (deployHook: string) =>\n Machine<Context, Schema, Event>(\n // Machine\n {\n id: 'deploy',\n initial: 'idle',\n context: {\n disabled: false,\n feedback: undefined,\n label: undefined,\n error: undefined,\n },\n states: {\n idle: {\n entry: assign({\n feedback: () => undefined,\n label: () => 'Deploy',\n }),\n on: {\n DEPLOY: 'deploying',\n },\n },\n deploying: {\n entry: assign({\n disabled: () => true,\n label: () => 'Deploying',\n }),\n exit: assign({\n disabled: () => false,\n label: () => 'Deploy',\n }),\n invoke: {\n onDone: {\n target: 'success',\n },\n onError: {\n target: 'error',\n actions: assign({\n error: (_context, event) => {\n return event.data\n },\n }),\n },\n src: 'deploy',\n },\n },\n success: {\n entry: [assign({feedback: () => 'Succesfully started!'})],\n exit: assign({\n feedback: () => undefined,\n }),\n on: {\n DEPLOY: 'deploying',\n },\n },\n error: {\n on: {\n DEPLOY: 'deploying',\n },\n },\n },\n },\n // Config\n {\n services: {\n deploy: (): Promise<void> => {\n return new Promise(async (resolve, reject) => {\n try {\n if (!deployHook) {\n return reject(new Error('No deployHook URL defined'))\n }\n\n const res = await fetch(deployHook, {method: 'POST'})\n const data = await res.json()\n\n if (!res.ok) {\n const errorMessage = (data?.error as Vercel.Error).message || res.statusText\n return reject(errorMessage)\n }\n\n return resolve()\n } catch (err) {\n console.error('Unable to deploy with error:', err)\n return reject(new Error('Please check the developer console for more information'))\n }\n })\n },\n },\n }\n )\n\nexport default deployMachine\n","import {UploadIcon} from '@sanity/icons'\nimport {Box, Button, useToast} from '@sanity/ui'\nimport {useMachine} from '@xstate/react'\nimport React, {useEffect, useMemo} from 'react'\n\nimport {WIDGET_NAME} from '../../constants'\nimport deployMachine from '../../machines/deploy'\nimport StateDebug from '../StateDebug'\n\ntype Props = {\n deployHook: string\n onDeploySuccess?: () => void\n targetName: string\n}\n\nconst DeployButton = (props: Props) => {\n const {deployHook, onDeploySuccess, targetName} = props\n\n const machine = useMemo(() => deployMachine(deployHook), [deployHook])\n\n const [deployState, deployStateTransition, deployStateInterpreter] = useMachine(machine)\n\n const toast = useToast()\n\n const isError = deployState.matches('error')\n const isSuccess = deployState.matches('success')\n\n // Callbacks\n const handleDeploy = () => {\n deployStateTransition({type: 'DEPLOY'})\n }\n\n // Effects\n useEffect(() => {\n if (isError) {\n toast.push({\n closable: true,\n description: `Unable to queue deploy for ${targetName}: ${deployState.context.error}`,\n duration: 8000,\n status: 'error',\n title: WIDGET_NAME,\n })\n }\n\n if (isSuccess) {\n toast.push({\n closable: true,\n description: `Deploy queued for ${targetName}`,\n duration: 8000,\n status: 'success',\n title: WIDGET_NAME,\n })\n }\n }, [isError, isSuccess, toast, targetName, deployState.context.error])\n\n useEffect(() => {\n deployStateInterpreter.onTransition((state) => {\n if (state.value === 'success') {\n if (onDeploySuccess) {\n onDeploySuccess()\n }\n }\n })\n }, [deployStateInterpreter, onDeploySuccess])\n\n return (\n <Box padding={3} style={{position: 'relative'}}>\n {/* xstate debug */}\n <StateDebug name=\"Deploy\" state={deployState} />\n\n <Button\n disabled={deployState.context.disabled}\n fontSize={1}\n icon={UploadIcon}\n mode=\"ghost\"\n onClick={handleDeploy}\n padding={3}\n text={`${deployState.context.label} ${targetName}`}\n tone=\"default\"\n />\n </Box>\n )\n}\n\nexport default DeployButton\n","import {Box} from '@sanity/ui'\nimport React from 'react'\nimport {useCardColor} from '../../utils/useCardColor'\n\nconst PlaceholderAvatar = () => {\n const {border} = useCardColor()\n return (\n <Box\n style={{\n backgroundColor: border,\n borderRadius: '20px',\n height: '20px',\n userSelect: 'none',\n width: '20px',\n }}\n />\n )\n}\n\nexport default PlaceholderAvatar\n","import {Box, Stack, Text} from '@sanity/ui'\nimport React from 'react'\nimport {useCardColor} from '../../utils/useCardColor'\n\ntype Props = {\n rows: number\n}\n\nconst PlaceholderText = (props: Props) => {\n const {rows} = props\n const {border} = useCardColor()\n return (\n <Box\n style={{\n backgroundColor: border,\n borderRadius: '3px',\n userSelect: 'none',\n width: '100%',\n }}\n >\n <Stack space={2}>\n {new Array(rows).fill(undefined).map((_, index) => (\n <Text key={index} size={1}>\n \n </Text>\n ))}\n </Stack>\n </Box>\n )\n}\n\nexport default PlaceholderText\n","import {Flex} from '@sanity/ui'\nimport React from 'react'\n\nimport PlaceholderAvatar from '../PlaceholderAvatar'\nimport PlaceholderText from '../PlaceholderText'\nimport TableCell from '../TableCell'\n\nconst DeploymentPlaceholder = () => {\n return (\n <tr>\n {/* Deployment - alias or regular deployment URL */}\n <TableCell>\n <PlaceholderText rows={1} />\n </TableCell>\n\n {/* State */}\n <TableCell variant=\"state\">\n <PlaceholderText rows={1} />\n </TableCell>\n\n {/* Branch */}\n <TableCell variant=\"branch\">\n <PlaceholderText rows={2} />\n </TableCell>\n\n {/* Age */}\n <TableCell variant=\"age\">\n <PlaceholderText rows={1} />\n </TableCell>\n\n {/* Creator */}\n <TableCell variant=\"creator\">\n <Flex justify=\"center\">\n <PlaceholderAvatar />\n </Flex>\n </TableCell>\n </tr>\n )\n}\n\nexport default DeploymentPlaceholder\n","import {Box, Text, useToast} from '@sanity/ui'\nimport {useMachine} from '@xstate/react'\nimport React, {useEffect, useRef} from 'react'\nimport useDeepCompareEffect from 'use-deep-compare-effect'\n\nimport {WIDGET_NAME} from '../../constants'\nimport useDeployments from '../../hooks/useDeployments'\nimport refreshMachine from '../../machines/refresh'\nimport Deployment from '../Deployment'\nimport DeployButton from '../DeployButton'\nimport DeploymentPlaceholder from '../DeploymentPlaceholder'\nimport StateDebug from '../StateDebug'\nimport TableCell from '../TableCell'\nimport {Sanity} from '../../types'\nimport {useCardColor} from '../../utils/useCardColor'\n\ntype Props = {\n deploymentTarget: Sanity.DeploymentTarget\n}\n\nconst Deployments = (props: Props) => {\n const {deploymentTarget} = props\n\n // Refs\n const refTimeout = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n // XState\n const [refreshState, refreshStateTransition] = useMachine(refreshMachine)\n\n // Fetch deployments - disable hook / auto-refetching on error state\n const {deployments, error, isFetching, isSuccess, refetch} = useDeployments(deploymentTarget, {\n enabled: !refreshState.matches('error'),\n })\n\n const toast = useToast()\n const isError = refreshState.matches('error')\n\n const handleDeploySuccess = () => {\n if (refTimeout.current) {\n clearTimeout(refTimeout.current)\n }\n refTimeout.current = setTimeout(() => {\n refetch({\n cancelRefetch: true,\n throwOnError: true,\n })\n }, 4000)\n }\n\n useEffect(() => {\n return () => {\n if (refTimeout.current) {\n clearTimeout(refTimeout.current)\n }\n }\n }, [])\n\n useEffect(() => {\n if (error) {\n refreshStateTransition({type: 'ERROR'})\n }\n\n if (isFetching) {\n refreshStateTransition({type: 'REFRESH'})\n }\n\n if (!isFetching && isSuccess) {\n refreshStateTransition({type: 'REFRESHED'})\n }\n }, [error, isFetching, isSuccess, refreshStateTransition])\n\n useDeepCompareEffect(() => {\n if (!refreshState.matches('refreshing')) {\n refreshStateTransition({type: 'REFRESH'})\n }\n }, [deploymentTarget])\n\n useDeepCompareEffect(() => {\n if (isError) {\n toast.push({\n closable: true,\n description: `Unable to fetch deployments for ${deploymentTarget.name}`,\n duration: 8000,\n status: 'error',\n title: WIDGET_NAME,\n })\n }\n }, [deploymentTarget, isError])\n\n const hasFetched = typeof deployments !== 'undefined'\n const hasDeployments = deployments && deployments.length > 0\n\n const {border} = useCardColor()\n return (\n <Box marginTop={3} style={{position: 'relative'}}>\n {/* xstate debug */}\n <StateDebug name=\"Refresh\" state={refreshState} />\n\n {!refreshState.matches('error') && (\n <>\n <Box\n as=\"table\"\n style={{\n borderBottom: `1px solid ${border}`,\n borderCollapse: 'collapse',\n display: 'table',\n tableLayout: 'fixed',\n width: '100%',\n }}\n >\n <Box as=\"thead\" style={{display: 'table-header-group'}}>\n <tr>\n {/* Deployment */}\n <TableCell header>Deployment</TableCell>\n\n {/* State */}\n <TableCell header variant=\"state\">\n State\n </TableCell>\n\n {/* Branch */}\n <TableCell header variant=\"branch\">\n Branch\n </TableCell>\n\n {/* Age */}\n <TableCell header variant=\"age\">\n Age\n </TableCell>\n\n {/* Creator */}\n <TableCell header variant=\"age\">\n Creator\n </TableCell>\n </tr>\n </Box>\n\n <Box as=\"tbody\" style={{display: 'table-header-group'}}>\n {/* Placeholders */}\n {!deployments &&\n new Array(deploymentTarget?.deployLimit)\n .fill(undefined)\n .map((_, index) => <DeploymentPlaceholder key={index} />)}\n {/* Deployments */}\n {hasDeployments &&\n deployments?.map((deployment) => (\n <Deployment deployment={deployment} key={deployment.uid} />\n ))}\n </Box>\n </Box>\n\n {/* No results */}\n {hasFetched && !hasDeployments && (\n <Box padding={3} style={{width: '100%'}}>\n <Text muted size={1}>\n No deployments found. Don't forget to specify a valid team ID if your project\n belongs to a team.\n </Text>\n </Box>\n )}\n </>\n )}\n\n {/* Error message */}\n {refreshState.matches('error') && (\n <Box padding={3}>\n <Text muted size={1}>\n Unable to fetch recent deployments. Please check your network and deployment settings.\n </Text>\n </Box>\n )}\n\n {/* Deploy button */}\n {!refreshState.matches('error') && deploymentTarget.deployHook && (\n <Box>\n <DeployButton\n deployHook={deploymentTarget.deployHook}\n onDeploySuccess={handleDeploySuccess}\n targetName={deploymentTarget.name}\n />\n </Box>\n )}\n </Box>\n )\n}\n\nexport default Deployments\n","import {EditIcon} from '@sanity/icons'\nimport {Box, Button, Flex, Text, Tooltip} from '@sanity/ui'\nimport React, {FC} from 'react'\n\nimport Deployments from '../Deployments'\nimport {Sanity} from '../../types'\n\ntype Props = {\n item: Sanity.DeploymentTarget\n onDialogEdit: (deploymentTarget: Sanity.DeploymentTarget) => void\n}\n\nconst DeploymentTarget: FC<Props> = (props: Props) => {\n const {item, onDialogEdit} = props\n\n const deploymentTarget = {\n deployHook: item.deployHook,\n deployLimit: item.deployLimit,\n name: item.name,\n projectId: item.projectId,\n teamId: item.teamId,\n token: item.token,\n } as Sanity.DeploymentTarget\n\n return (\n <Box style={{position: 'relative'}}>\n {/* Header */}\n <Flex align=\"center\" justify=\"space-between\" marginTop={2} paddingX={3}>\n <Text size={2}>{item.name}</Text>\n\n <Tooltip\n content={\n <Box padding={2}>\n <Text muted size={1}>\n Edit deployment target\n </Text>\n </Box>\n }\n placement=\"left\"\n >\n <Button fontSize={1} icon={EditIcon} mode=\"bleed\" onClick={() => onDialogEdit(item)} />\n </Tooltip>\n </Flex>\n\n {/* Content */}\n <Deployments deploymentTarget={deploymentTarget} />\n </Box>\n )\n}\n\nexport default DeploymentTarget\n","import React from 'react'\nimport {Stack} from '@sanity/ui'\n\nimport DeploymentTarget from '../DeploymentTarget'\nimport {Sanity} from '../../types'\n\ntype Props = {\n items: Sanity.DeploymentTarget[]\n onDialogEdit: (deploymentTarget: Sanity.DeploymentTarget) => void\n}\n\nconst DeploymentTargets = (props: Props) => {\n const {items, onDialogEdit} = props\n\n return (\n <Stack space={5}>\n {items?.map((item) => (\n <DeploymentTarget item={item} key={item._id} onDialogEdit={onDialogEdit} />\n ))}\n </Stack>\n )\n}\n\nexport default DeploymentTargets\n","import {assign, Machine} from 'xstate'\n\ntype Context = {\n formData?: Record<string, any>\n message: string\n}\n\ntype Event =\n | {type: 'CREATE'}\n | {type: 'DELETE'}\n | {type: 'REJECT'}\n | {type: 'RESOLVE'}\n | {type: 'SUBMIT'}\n | {type: 'UPDATE'}\n\ntype Schema = {\n states: {\n idle: {}\n creating: {}\n updating: {}\n deleting: {}\n success: {}\n error: {}\n }\n}\n\nconst formMachine = Machine<Context, Schema, Event>(\n {\n context: {\n formData: {},\n message: '',\n },\n initial: 'idle',\n states: {\n idle: {\n on: {\n CREATE: {\n actions: ['createDocument'],\n target: 'creating',\n },\n DELETE: {\n actions: ['deleteDocument'],\n target: 'deleting',\n },\n UPDATE: {\n actions: ['updateDocument'],\n target: 'updating',\n },\n },\n },\n creating: {\n invoke: {\n src: 'createDocumentService',\n onDone: {target: 'success'},\n onError: {actions: ['setMessage'], target: 'error'},\n },\n on: {\n RESOLVE: 'success',\n REJECT: 'error',\n },\n },\n updating: {\n invoke: {\n src: 'updateDocumentService',\n onDone: {target: 'success'},\n onError: {actions: ['setMessage'], target: 'error'},\n },\n on: {\n RESOLVE: 'success',\n REJECT: 'error',\n },\n },\n deleting: {\n invoke: {\n src: 'deleteDocumentService',\n onDone: {target: 'success'},\n onError: {actions: ['setMessage'], target: 'error'},\n },\n on: {\n RESOLVE: 'success',\n REJECT: 'error',\n },\n },\n success: {\n invoke: {\n src: 'formSubmittedService',\n },\n },\n error: {},\n },\n },\n {\n actions: {\n setMessage: assign((_context, event: any) => ({\n message: event.data.details.description,\n })),\n createDocument: assign((_context, event: any) => ({\n formData: event.formData,\n })),\n deleteDocument: assign(() => ({\n // id: event.id,\n })),\n updateDocument: assign((_context, event: any) => ({\n formData: event.formData,\n })),\n },\n }\n)\n\nexport default formMachine\n","// Recursively sanitize form data:\n// - convert empty strings, undefined values and empty arrays to null (to correctly unset / delete fields)\n// - trim whitespace on string fleids\n\ntype FormData = Record<string, any>\n\nconst sanitizeFormData = (formData: FormData): FormData => {\n return Object.keys(formData).reduce((acc: FormData, key) => {\n const val = formData[key]\n\n // TODO: refactor\n if (typeof val === 'object' && val !== null && val.constructor !== Array) {\n acc[key] = sanitizeFormData(val)\n } else if (val === '' || typeof val === 'undefined' || val?.length === 0) {\n acc[key] = null\n } else if (typeof val === 'string' && val) {\n acc[key] = formData[key].trim()\n } else {\n acc[key] = formData[key]\n }\n\n return acc\n }, {})\n}\n\nexport default sanitizeFormData\n","import {ErrorOutlineIcon} from '@sanity/icons'\nimport {Box, Inline, Text, Tooltip} from '@sanity/ui'\nimport React, {FC} from 'react'\nimport {FieldError} from 'react-hook-form'\nimport {styled} from 'styled-components'\n\ntype Props = {\n description?: string\n error?: FieldError\n label: string\n name: string\n}\n\nconst StyledErrorOutlineIcon = styled(ErrorOutlineIcon)(({theme}) => {\n return {\n color: theme.sanity.color.spot.red,\n }\n})\n\nconst FormFieldInputLabel: FC<Props> = (props: Props) => {\n const {description, error, label, name} = props\n\n return (\n <Box marginBottom={3}>\n {/* Label */}\n <Inline space={2}>\n <Text as=\"label\" htmlFor={name} size={1} weight=\"semibold\">\n {label}\n </Text>\n\n {/* Error icon + tooltip */}\n {error && (\n <Text size={1}>\n <Tooltip\n content={\n <Box padding={2}>\n <Text muted size={1}>\n <StyledErrorOutlineIcon style={{marginRight: '0.1em'}} />\n {error.message}\n </Text>\n </Box>\n }\n fallbackPlacements={['top', 'left']}\n placement=\"right\"\n portal\n >\n <StyledErrorOutlineIcon />\n </Tooltip>\n </Text>\n )}\n </Inline>\n\n {/* Description */}\n {description && (\n <Box marginY={3}>\n <Text htmlFor={name} muted size={1}>\n {description}\n </Text>\n </Box>\n )}\n </Box>\n )\n}\n\nexport default FormFieldInputLabel\n","import {Box, TextInput} from '@sanity/ui'\nimport React, {forwardRef} from 'react'\nimport {FieldError} from 'react-hook-form'\n\nimport FormFieldInputLabel from '../FormFieldInputLabel'\n\ntype Props = {\n description?: string\n disabled?: boolean\n error?: FieldError\n label: string\n name: string\n placeholder?: string\n value?: string\n onChange?: React.ChangeEventHandler<HTMLInputElement>\n onBlur?: React.FocusEventHandler<HTMLInputElement>\n}\n\nconst FormFieldInputText = forwardRef<HTMLInputElement, Props>((props: Props, ref) => {\n const {description, disabled, error, label, name, placeholder, value, onChange, onBlur} = props\n\n return (\n <Box>\n {/* Label */}\n <FormFieldInputLabel description={description} error={error} label={label} name={name} />\n {/* Input */}\n <TextInput\n autoComplete=\"off\"\n autoFocus\n defaultValue={value}\n disabled={disabled}\n id={name}\n name={name}\n placeholder={placeholder}\n onChange={onChange}\n onBlur={onBlur}\n ref={ref}\n />\n </Box>\n )\n})\n\nexport default FormFieldInputText\n","import type {SanityClient} from '@sanity/client'\nimport {API_VERSION} from './constants'\nimport {useClient} from 'sanity'\n\nexport function useSanityClient(): SanityClient {\n return useClient({apiVersion: API_VERSION})\n}\n","import {yupResolver} from '@hookform/resolvers/yup'\nimport {Box, Button, Dialog, Flex, Stack} from '@sanity/ui'\nimport {uuid} from '@sanity/uuid'\nimport {useMachine} from '@xstate/react'\nimport React, {FC} from 'react'\nimport {useForm} from 'react-hook-form'\nimport * as yup from 'yup'\n\nimport {DEPLOYMENT_TARGET_DOCUMENT_TYPE, Z_INDEX_DIALOG} from '../../constants'\nimport formMachine from '../../machines/form'\nimport sanitizeFormData from '../../utils/sanitizeFormData'\nimport FormFieldInputText from '../FormFieldInputText'\nimport {Sanity} from '../../types'\nimport {useSanityClient} from '../../client'\n\ntype Props = {\n deploymentTarget?: Sanity.DeploymentTarget\n onClose: () => void\n onCreate?: (deploymentTarget: Sanity.DeploymentTarget) => void\n onDelete?: (id: string) => void\n onUpdate?: (deploymentTarget: Sanity.DeploymentTarget) => void\n}\n\ntype FormData = yup.InferType<typeof formSchema>\n\nconst formSchema = yup.object().shape({\n deployHook: yup.string().url('Deploy hook must be a valid URL'),\n deployLimit: yup\n .number()\n .positive()\n .integer()\n .min(1, 'Deploy limit must no less than 1')\n .max(15, 'Deploy limit must no higher than 15')\n .typeError('Deploy limit must be a number')\n .required('Deploy limit must be a positive integer between 1 and 15'),\n name: yup.string().required('Name cannot be empty'),\n projectId: yup.string().required('Vercel Project ID cannot be empty'),\n teamId: yup.string(),\n token: yup.string().required('Vercel Account Token cannot be empty'),\n})\n\nconst DialogForm: FC<Props> = (props: Props) => {\n const {deploymentTarget, onClose, onCreate, onDelete, onUpdate} = props\n const client = useSanityClient()\n\n // xstate\n const [formState, formStateTransition] = useMachine(formMachine, {\n services: {\n formSubmittedService: async () => {\n onClose()\n },\n // TODO: refactor\n createDocumentService: async (_context, event: any) => {\n let document\n try {\n document = await client.create({\n _id: `vercel.${uuid()}`,\n _type: DEPLOYMENT_TARGET_DOCUMENT_TYPE,\n ...event.formData,\n })\n if (onCreate) {\n onCreate(document as Sanity.DeploymentTarget)\n }\n return Promise.resolve()\n } catch (e) {\n return Promise.reject(e)\n }\n },\n // TODO: refactor\n deleteDocumentService: async () => {\n if (deploymentTarget) {\n try {\n await client.delete(deploymentTarget._id)\n if (onDelete) {\n onDelete(deploymentTarget._id)\n }\n return Promise.resolve()\n } catch (e) {\n return Promise.reject(e)\n }\n }\n return Promise.resolve()\n },\n // TODO: refactor\n updateDocumentService: async (_context, event: any) => {\n let document\n if (deploymentTarget) {\n try {\n document = await client.patch(deploymentTarget._id).set(event.formData).commit()\n if (onUpdate) {\n onUpdate(document as Sanity.DeploymentTarget)\n }\n return Promise.resolve()\n } catch (e) {\n return Promise.reject(e)\n }\n }\n return Promise.resolve()\n },\n },\n })\n\n const formUpdating =\n formState.matches('creating') || formState.matches('deleting') || formState.matches('updating')\n\n // react-hook-form 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 // Callbacks\n // - submit react-hook-form\n const onSubmit = async (formData: FormData) => {\n const sanitizedFormData = sanitizeFormData(formData)\n await formStateTransition(deploymentTarget ? 'UPDATE' : 'CREATE', {\n formData: sanitizedFormData,\n })\n }\n\n const handleDelete = () => {\n formStateTransition('DELETE', {id: deploymentTarget?._id})\n }\n\n const Footer = () => (\n <Box padding={3}>\n <Flex justify={deploymentTarget ? 'space-between' : 'flex-end'}>\n {/* Delete button */}\n {deploymentTarget && (\n <Button\n disabled={formUpdating}\n fontSize={1}\n mode=\"bleed\"\n onClick={handleDelete}\n text=\"Delete\"\n tone=\"critical\"\n />\n )}\n\n {/* Submit button */}\n <Button\n disabled={formUpdating || !isDirty || !isValid}\n fontSize={1}\n onClick={handleSubmit(onSubmit)}\n text={deploymentTarget ? 'Update and close' : 'Create'}\n tone=\"primary\"\n />\n </Flex>\n </Box>\n )\n\n return (\n <Dialog\n footer={<Footer />}\n header={`${deploymentTarget ? 'Edit' : 'Create'} deployment target`}\n id=\"create\"\n onClose={onClose}\n width={1}\n zOffset={Z_INDEX_DIALOG}\n >\n {/* We reverse direction to ensure that inline links dont autofocus before other form elements */}\n <Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n {/* Hidden button to enable enter key submissions */}\n <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n {/* Form fields */}\n <Stack space={5}>\n {/* Title */}\n <FormFieldInputText\n disabled={formUpdating}\n description=\"Name displayed in this plugin (e.g. production, staging)\"\n error={errors?.name}\n label=\"Name\"\n // @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 {assign, Machine} from 'xstate'\nimport {Sanity} from '../types'\n\ntype Context = {\n editDeploymentTarget?: Sanity.DeploymentTarget\n}\n\ntype Event =\n | {type: 'CREATE'}\n | {type: 'CLOSE'}\n | {type: 'EDIT'; deploymentTarget: Sanity.DeploymentTarget}\n\ntype Schema = {\n states: {\n idle: {}\n edit: {}\n create: {}\n }\n}\n\nconst dialogMachine = () =>\n Machine<Context, Schema, Event>(\n {\n context: {\n editDeploymentTarget: undefined,\n },\n initial: 'idle',\n states: {\n idle: {\n entry: assign({\n editDeploymentTarget: () => undefined,\n }),\n on: {\n CREATE: 'create',\n EDIT: {\n actions: ['setEditDeploymentTarget'],\n target: 'edit',\n },\n },\n },\n edit: {\n on: {\n CLOSE: 'idle',\n },\n },\n create: {\n on: {\n CLOSE: 'idle',\n },\n },\n },\n },\n {\n actions: {\n setEditDeploymentTarget: assign((_context, event: any) => ({\n editDeploymentTarget: event.deploymentTarget,\n })),\n },\n }\n )\n\nexport default dialogMachine\n","import {AddIcon} from '@sanity/icons'\nimport {Box, Button, Card, Flex, Text, ToastProvider, Tooltip} from '@sanity/ui'\nimport {useMachine} from '@xstate/react'\nimport React from 'react'\nimport {QueryClient, QueryClientProvider} from '@tanstack/react-query'\n\nimport StateDebug from './components/StateDebug'\nimport {DEPLOYMENT_TARGET_DOCUMENT_TYPE, Z_INDEX_TOAST_PROVIDER} from './constants'\nimport deploymentTargetListMachine from './machines/deploymentTargetList'\nimport DeploymentTargets from './components/DeploymentTargets'\nimport DialogForm from './components/DialogForm'\nimport dialogMachine from './machines/dialog'\nimport {Sanity} from './types'\nimport {useSanityClient} from './client'\n\nconst Widget = () => {\n const client = useSanityClient()\n // xstate\n const [deploymentTargetListState, deploymentTargetListStateTransition] = useMachine(\n deploymentTargetListMachine,\n {\n services: {\n fetchDataService: () => {\n return client\n .fetch(`*[_type == \"${DEPLOYMENT_TARGET_DOCUMENT_TYPE}\"] | order(name asc)`)\n .then((result: any) => result)\n },\n },\n }\n )\n const [dialogState, dialogStateTransition] = useMachine(dialogMachine)\n\n const queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n gcTime: 0,\n staleTime: 0,\n },\n },\n })\n\n // Callbacks\n const handleDialogClose = () => {\n dialogStateTransition('CLOSE')\n }\n const handleDialogShowCreate = () => {\n dialogStateTransition('CREATE')\n }\n const handleDialogShowEdit = (deploymentTarget: Sanity.DeploymentTarget) => {\n dialogStateTransition('EDIT', {deploymentTarget})\n }\n const handleTargetCreate = (deploymentTarget: Sanity.DeploymentTarget) => {\n deploymentTargetListStateTransition('CREATE', {deploymentTarget})\n }\n const handleTargetDelete = (id: string) => {\n deploymentTargetListStateTransition('DELETE', {id})\n }\n const handleTargetUpdate = (deploymentTarget: Sanity.DeploymentTarget) => {\n deploymentTargetListStateTransition('UPDATE', {deploymentTarget})\n }\n\n return (\n <ToastProvider zOffset={Z_INDEX_TOAST_PROVIDER}>\n <QueryClientProvider client={queryClient}>\n <Card radius={2} style={{overflow: 'hidden '}}>\n {/* xstate debug */}\n <StateDebug name=\"List\" state={deploymentTargetListState} />\n\n {/* Header */}\n <Flex align=\"center\" justify=\"space-between\" paddingX={3} paddingY={2}>\n <Text size={5} weight=\"semibold\">\n Vercel deployments\n </Text>\n\n <Tooltip\n content={\n <Box padding={2}>\n <Text muted size={1}>\n Create new deployment target\n </Text>\n </Box>\n }\n placement=\"left\"\n >\n <Button fontSize={1} icon={AddIcon} onClick={handleDialogShowCreate} mode=\"bleed\" />\n </Tooltip>\n </Flex>\n\n <Box>\n {deploymentTargetListState.matches('pending') && (\n <Box paddingX={3} paddingY={4}>\n <Text>Loading...</Text>\n </Box>\n )}\n\n {deploymentTargetListState.matches('ready.withoutData') && (\n <Box paddingX={3} paddingY={4}>\n <Text>\n No deployment targets found.{' '}\n <a onClick={handleDialogShowCreate} style={{cursor: 'pointer'}}>\n Create a new target?\n </a>\n </Text>\n </Box>\n )}\n\n {deploymentTargetListState.matches('ready.withData') && (\n <DeploymentTargets\n items={deploymentTargetListState.context.results}\n onDialogEdit={handleDialogShowEdit}\n />\n )}\n\n {deploymentTargetListState.matches('failed') && (\n <Box paddingX={3} paddingY={4}>\n <Text>\n Failed to retrieve deployment targets. Please check the developer console log for\n more information.\n </Text>\n </Box>\n )}\n </Box>\n </Card>\n\n {/* Dialogs */}\n {dialogState.matches('create') && (\n <DialogForm onClose={handleDialogClose} onCreate={handleTargetCreate} />\n )}\n\n {dialogState.matches('edit') && (\n <DialogForm\n deploymentTarget={dialogState.context.editDeploymentTarget}\n onClose={handleDialogClose}\n onDelete={handleTargetDelete}\n onUpdate={handleTargetUpdate}\n />\n )}\n </QueryClientProvider>\n </ToastProvider>\n )\n}\n\nexport default Widget\n","import Widget from './app'\n\n// Initialize `javascript-time-ago` locale (required for react-time-ago)\nimport TimeAgo from 'javascript-time-ago'\nimport en from 'javascript-time-ago/locale/en'\nimport {DashboardWidget, type LayoutConfig} from '@sanity/dashboard'\n\nTimeAgo.addDefaultLocale(en)\n\nexport function vercelWidget(config: {layout?: LayoutConfig} = {}): DashboardWidget {\n return {\n name: 'vercel',\n component: Widget,\n layout: config.layout ?? {width: 'full'},\n }\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sanity-plugin-dashboard-widget-vercel",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.2",
|
|
4
4
|
"description": "View your recent Vercel deployments and manually trigger builds directly from your Sanity dashboard.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"sanity",
|
|
@@ -58,16 +58,16 @@
|
|
|
58
58
|
}
|
|
59
59
|
},
|
|
60
60
|
"dependencies": {
|
|
61
|
-
"@hookform/resolvers": "
|
|
61
|
+
"@hookform/resolvers": "^3.3.2",
|
|
62
62
|
"@sanity/icons": "^3.7.0",
|
|
63
63
|
"@sanity/incompatible-plugin": "^1.0.5",
|
|
64
64
|
"@sanity/ui": "^2.15.2",
|
|
65
65
|
"@sanity/uuid": "^3.0.2",
|
|
66
66
|
"@xstate/react": "^3.0.1",
|
|
67
|
+
"@tanstack/react-query": "^5.67.2",
|
|
67
68
|
"javascript-time-ago": "^2.5.7",
|
|
68
69
|
"object-hash": "3.0.0",
|
|
69
|
-
"react-hook-form": "^
|
|
70
|
-
"react-query": "^3.39.2",
|
|
70
|
+
"react-hook-form": "^7.48.2",
|
|
71
71
|
"react-time-ago": "^7.2.1",
|
|
72
72
|
"unfetch": "^4.2.0",
|
|
73
73
|
"use-deep-compare-effect": "^1.8.1",
|
package/src/app.tsx
CHANGED
|
@@ -2,7 +2,7 @@ import {AddIcon} from '@sanity/icons'
|
|
|
2
2
|
import {Box, Button, Card, Flex, Text, ToastProvider, Tooltip} from '@sanity/ui'
|
|
3
3
|
import {useMachine} from '@xstate/react'
|
|
4
4
|
import React from 'react'
|
|
5
|
-
import {QueryClient, QueryClientProvider} from 'react-query'
|
|
5
|
+
import {QueryClient, QueryClientProvider} from '@tanstack/react-query'
|
|
6
6
|
|
|
7
7
|
import StateDebug from './components/StateDebug'
|
|
8
8
|
import {DEPLOYMENT_TARGET_DOCUMENT_TYPE, Z_INDEX_TOAST_PROVIDER} from './constants'
|
|
@@ -33,7 +33,7 @@ const Widget = () => {
|
|
|
33
33
|
const queryClient = new QueryClient({
|
|
34
34
|
defaultOptions: {
|
|
35
35
|
queries: {
|
|
36
|
-
|
|
36
|
+
gcTime: 0,
|
|
37
37
|
staleTime: 0,
|
|
38
38
|
},
|
|
39
39
|
},
|