@sanity/vercel-protection-bypass 2.1.1 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +24 -0
- package/dist/_chunks-es/VercelProtectionBypassTool.js +25 -3
- package/dist/_chunks-es/VercelProtectionBypassTool.js.map +1 -1
- package/dist/index.d.ts +4 -7
- package/dist/index.js +39 -7
- package/dist/index.js.map +1 -1
- package/package.json +15 -14
- package/dist/_chunks-cjs/VercelProtectionBypassTool.cjs +0 -188
- package/dist/_chunks-cjs/VercelProtectionBypassTool.cjs.map +0 -1
- package/dist/index.cjs +0 -26
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -11
- package/src/VercelProtectionBypassTool.tsx +0 -264
- package/src/index.ts +0 -29
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
# @sanity/vercel-protection-bypass
|
|
2
2
|
|
|
3
|
+
## 3.1.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [`d090d93`](https://github.com/sanity-io/plugins/commit/d090d939e29a2aa46ccf1e1f18a63eb383630bdd) Thanks [@stipsan](https://github.com/stipsan)! - Add schema type for debugging
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- [`4f82b31`](https://github.com/sanity-io/plugins/commit/4f82b3120b3006821a74f444589ac3e752475c4e) Thanks [@stipsan](https://github.com/stipsan)! - Stop publishing src folder to npm
|
|
12
|
+
|
|
13
|
+
## 3.0.0
|
|
14
|
+
|
|
15
|
+
### Major Changes
|
|
16
|
+
|
|
17
|
+
- [#11](https://github.com/sanity-io/plugins/pull/11) [`d2283b2`](https://github.com/sanity-io/plugins/commit/d2283b2cb214f8c3478e986f0afa06180343dd35) Thanks [@stipsan](https://github.com/stipsan)! - Set node engines to minimum v22.12 in addition to the existing required v20.19 or later
|
|
18
|
+
|
|
19
|
+
- [#11](https://github.com/sanity-io/plugins/pull/11) [`d2283b2`](https://github.com/sanity-io/plugins/commit/d2283b2cb214f8c3478e986f0afa06180343dd35) Thanks [@stipsan](https://github.com/stipsan)! - Remove CJS, this package is now ESM-only
|
|
20
|
+
|
|
21
|
+
### Patch Changes
|
|
22
|
+
|
|
23
|
+
- [#8](https://github.com/sanity-io/plugins/pull/8) [`17e4495`](https://github.com/sanity-io/plugins/commit/17e44959f157bf6b7239db06f19aec31265d7ca9) Thanks [@renovate](https://github.com/apps/renovate)! - fix(deps): Update dependency @sanity/preview-url-secret to ^2.1.16
|
|
24
|
+
|
|
25
|
+
- [`2bda9e1`](https://github.com/sanity-io/plugins/commit/2bda9e147d8bf98b59c83b12b994f821262b7689) Thanks [@stipsan](https://github.com/stipsan)! - Reduce reliance on `@sanity/preview-url-secret`
|
|
26
|
+
|
|
3
27
|
## 2.1.1
|
|
4
28
|
|
|
5
29
|
### Patch Changes
|
|
@@ -3,8 +3,8 @@ import { c } from "react-compiler-runtime";
|
|
|
3
3
|
import { useReducer, useEffect } from "react";
|
|
4
4
|
import { useClient } from "sanity";
|
|
5
5
|
import { TrashIcon, AddIcon } from "@sanity/icons";
|
|
6
|
-
import { apiVersion } from "@sanity/preview-url-secret/constants";
|
|
7
|
-
import {
|
|
6
|
+
import { apiVersion, vercelProtectionBypassSchemaId, vercelProtectionBypassSchemaType, tag } from "@sanity/preview-url-secret/constants";
|
|
7
|
+
import { subscribeToVercelProtectionBypass } from "@sanity/preview-url-secret/toggle-vercel-protection-bypass";
|
|
8
8
|
import { useToast, Heading, Box, Stack, Card, Text, Button, Dialog, TextInput } from "@sanity/ui";
|
|
9
9
|
function reducer(prevState, action) {
|
|
10
10
|
switch (action.type) {
|
|
@@ -52,6 +52,28 @@ function reducer(prevState, action) {
|
|
|
52
52
|
return prevState;
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
|
+
async function enableVercelProtectionBypass(client, secret) {
|
|
56
|
+
const patch = client.patch(vercelProtectionBypassSchemaId).set({
|
|
57
|
+
secret
|
|
58
|
+
});
|
|
59
|
+
await client.transaction().createIfNotExists({
|
|
60
|
+
_id: vercelProtectionBypassSchemaId,
|
|
61
|
+
_type: vercelProtectionBypassSchemaType
|
|
62
|
+
}).patch(patch).commit({
|
|
63
|
+
tag
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
async function disableVercelProtectionBypass(client) {
|
|
67
|
+
const patch = client.patch(vercelProtectionBypassSchemaId).set({
|
|
68
|
+
secret: null
|
|
69
|
+
});
|
|
70
|
+
await client.transaction().createIfNotExists({
|
|
71
|
+
_id: vercelProtectionBypassSchemaId,
|
|
72
|
+
_type: vercelProtectionBypassSchemaType
|
|
73
|
+
}).patch(patch).commit({
|
|
74
|
+
tag
|
|
75
|
+
});
|
|
76
|
+
}
|
|
55
77
|
function VercelProtectionBypassTool() {
|
|
56
78
|
const $ = c(25);
|
|
57
79
|
let t0;
|
|
@@ -89,7 +111,7 @@ function VercelProtectionBypassTool() {
|
|
|
89
111
|
const handleEnable = t2;
|
|
90
112
|
let t3, t4;
|
|
91
113
|
$[5] !== client ? (t3 = () => {
|
|
92
|
-
const unsubscribe =
|
|
114
|
+
const unsubscribe = subscribeToVercelProtectionBypass(client, (secret_0) => dispatch({
|
|
93
115
|
type: secret_0 ? "saved-secret" : "removed-secret"
|
|
94
116
|
}));
|
|
95
117
|
return () => unsubscribe();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VercelProtectionBypassTool.js","sources":["../../src/VercelProtectionBypassTool.tsx"],"sourcesContent":["import {useEffect, useReducer} from 'react'\nimport {useClient} from 'sanity'\n\nimport {AddIcon, TrashIcon} from '@sanity/icons'\nimport {apiVersion} from '@sanity/preview-url-secret/constants'\nimport {\n disableVercelProtectionBypass,\n enableVercelProtectionBypass,\n subcribeToVercelProtectionBypass,\n} from '@sanity/preview-url-secret/toggle-vercel-protection-bypass'\nimport {Box, Button, Card, Dialog, Heading, Stack, Text, TextInput, useToast} from '@sanity/ui'\n\ninterface State {\n status:\n | 'loading'\n | 'disabled'\n | 'add-secret-dialog'\n | 'adding-secret'\n | 'enabled'\n | 'removing-secret'\n}\ntype Action =\n | {type: 'add-secret'}\n | {type: 'save-secret'}\n | {type: 'cancel-add-secret'}\n | {type: 'failed-add-secret'}\n | {type: 'saved-secret'}\n | {type: 'remove-secret'}\n | {type: 'failed-remove-secret'}\n | {type: 'removed-secret'}\n\nfunction reducer(prevState: State, action: Action): State {\n switch (action.type) {\n case 'removed-secret':\n return {...prevState, status: 'disabled'}\n case 'remove-secret':\n return {...prevState, status: 'removing-secret'}\n case 'saved-secret':\n return {...prevState, status: 'enabled'}\n case 'save-secret':\n return {...prevState, status: 'adding-secret'}\n case 'cancel-add-secret':\n return {...prevState, status: 'disabled'}\n case 'add-secret':\n return {...prevState, status: 'add-secret-dialog'}\n case 'failed-remove-secret':\n return {...prevState, status: 'enabled'}\n case 'failed-add-secret':\n return {...prevState, status: 'add-secret-dialog'}\n default:\n return prevState\n }\n}\n\nexport default function VercelProtectionBypassTool(): React.JSX.Element {\n const client = useClient({apiVersion: apiVersion})\n const {push: pushToast} = useToast()\n const [state, dispatch] = useReducer(reducer, {status: 'loading'})\n const adding = state.status === 'adding-secret'\n const removing = state.status === 'removing-secret'\n\n const handleEnable = (secret: string) => {\n dispatch({type: 'save-secret'})\n enableVercelProtectionBypass(client, secret)\n .then(() => {\n dispatch({type: 'saved-secret'})\n pushToast({\n status: 'success',\n title: 'Protection bypass is now enabled',\n })\n })\n .catch((reason) => {\n // eslint-disable-next-line no-console\n console.error(reason)\n pushToast({\n status: 'error',\n title:\n 'There was an error when trying to enable protection bypass. See the browser console for more information.',\n })\n dispatch({type: 'failed-add-secret'})\n })\n }\n\n useEffect(() => {\n const unsubscribe = subcribeToVercelProtectionBypass(client, (secret) =>\n dispatch({type: secret ? 'saved-secret' : 'removed-secret'}),\n )\n return () => unsubscribe()\n }, [client])\n\n const enabled = state.status === 'enabled' || removing\n\n return (\n <>\n <Box\n sizing=\"border\"\n display=\"flex\"\n style={{\n height: '100%',\n alignItems: 'center',\n justifyContent: 'center',\n flexDirection: 'column',\n }}\n >\n <Stack space={5}>\n <Card padding={4} style={{maxWidth: 640}}>\n <Stack space={4} style={{justifyItems: 'flex-start', textWrap: 'pretty'}}>\n <Heading>Vercel Protection Bypass</Heading>\n {enabled ? (\n <>\n <Box>\n <Text style={{textWrap: 'pretty'}}>\n Sanity Presentation is setup to use{' '}\n <a\n href=\"https://vercel.com/docs/security/deployment-protection/methods-to-bypass-deployment-protection/protection-bypass-automation\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n protection bypass for automation\n </a>{' '}\n in order to display protected deployments in its preview iframe for the\n current Sanity dataset.\n </Text>\n </Box>\n <Box>\n <Text>\n You can turn off automatic protection bypass at any time by clicking the\n button below.\n </Text>\n </Box>\n <Button\n mode=\"ghost\"\n tone=\"critical\"\n icon={<TrashIcon />}\n loading={removing}\n onClick={() => {\n dispatch({type: 'remove-secret'})\n disableVercelProtectionBypass(client)\n .then(() => {\n pushToast({\n status: 'warning',\n title: 'Protection bypass is now disabled',\n })\n dispatch({type: 'removed-secret'})\n })\n .catch((reason) => {\n // eslint-disable-next-line no-console\n console.error(reason)\n pushToast({\n status: 'error',\n title:\n 'There was an error when trying to disable protection bypass. See the browser console for more information.',\n })\n dispatch({type: 'failed-remove-secret'})\n })\n }}\n text=\"Remove secret\"\n />\n <Text>\n Protection bypass remains enabled if this plugin is removed from your Sanity\n config.\n </Text>\n </>\n ) : (\n <>\n <Box>\n <Text style={{textWrap: 'pretty'}}>\n Follow the instructions on{' '}\n <a\n href=\"https://vercel.com/docs/security/deployment-protection/methods-to-bypass-deployment-protection/protection-bypass-automation\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n how to enable protection bypass for automation\n </a>\n .\n </Text>\n </Box>\n <Box>\n <Text>\n This will setup a secret that Vercel exposes as an environment variable called\n VERCEL_AUTOMATION_BYPASS_SECRET, its value is the secret you need.\n </Text>\n </Box>\n <Button\n mode=\"ghost\"\n icon={<AddIcon />}\n loading={state.status === 'loading'}\n onClick={() => {\n dispatch({type: 'add-secret'})\n }}\n text=\"Add secret\"\n />\n <Text>\n If you're using Sanity Presentation Tool with multiple protected\n deployments ensure that they have the same secret set, as this tool will set a\n secret that is shared in your dataset with all instances of Presentation Tool.\n </Text>\n </>\n )}\n </Stack>\n </Card>\n </Stack>\n </Box>\n {(state.status === 'add-secret-dialog' || state.status === 'adding-secret') && (\n <Dialog\n animate\n id=\"add-secret-dialog\"\n onClickOutside={() => dispatch({type: 'cancel-add-secret'})}\n >\n <Card padding={3}>\n <form\n onSubmit={(event) => {\n event.preventDefault()\n event.currentTarget.reportValidity()\n const formData = new FormData(event.currentTarget)\n const secret = formData.get('secret') as string\n if (secret) handleEnable(secret)\n }}\n >\n <Stack space={3}>\n <Stack space={2}>\n <Text as=\"label\" weight=\"semibold\" size={1}>\n Add bypass secret\n </Text>\n <Text muted size={1}>\n {`Make sure it's the same secret the Vercel deployment is using that's loaded in the preview iframe.`}\n </Text>\n <TextInput\n name=\"secret\"\n onFocus={(event) => {\n event.currentTarget.setCustomValidity('')\n }}\n onBlur={(event) => {\n event.currentTarget.setCustomValidity(\n event.currentTarget.value.length == 32\n ? ''\n : 'Secret must be 32 characters long',\n )\n event.currentTarget.required = true\n }}\n minLength={32}\n maxLength={32}\n autoComplete=\"off\"\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n spellCheck=\"false\"\n disabled={adding}\n />\n </Stack>\n <Button\n type=\"submit\"\n loading={adding}\n text={adding ? 'Saving…' : 'Save'}\n tone=\"positive\"\n />\n </Stack>\n </form>\n </Card>\n </Dialog>\n )}\n </>\n )\n}\n"],"names":["reducer","prevState","action","type","status","VercelProtectionBypassTool","$","_c","t0","Symbol","for","apiVersion","client","useClient","push","pushToast","useToast","t1","state","dispatch","useReducer","adding","removing","t2","secret","enableVercelProtectionBypass","then","title","catch","reason","console","error","handleEnable","t3","t4","unsubscribe","subcribeToVercelProtectionBypass","secret_0","useEffect","enabled","t5","height","alignItems","justifyContent","flexDirection","t6","maxWidth","t7","t8","justifyItems","textWrap","t9","disableVercelProtectionBypass","reason_0","t10","event","preventDefault","currentTarget","reportValidity","secret_1","FormData","get","_temp","_temp2","t11","event_1","setCustomValidity","value","length","required","event_0"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VercelProtectionBypassTool.js","sources":["../../src/VercelProtectionBypassTool.tsx"],"sourcesContent":["import {useEffect, useReducer} from 'react'\nimport {useClient, type SanityClient} from 'sanity'\n\nimport {AddIcon, TrashIcon} from '@sanity/icons'\nimport {apiVersion} from '@sanity/preview-url-secret/constants'\nimport {\n vercelProtectionBypassSchemaId as _id,\n vercelProtectionBypassSchemaType as _type,\n tag,\n} from '@sanity/preview-url-secret/constants'\nimport {subscribeToVercelProtectionBypass} from '@sanity/preview-url-secret/toggle-vercel-protection-bypass'\nimport {Box, Button, Card, Dialog, Heading, Stack, Text, TextInput, useToast} from '@sanity/ui'\n\ninterface State {\n status:\n | 'loading'\n | 'disabled'\n | 'add-secret-dialog'\n | 'adding-secret'\n | 'enabled'\n | 'removing-secret'\n}\ntype Action =\n | {type: 'add-secret'}\n | {type: 'save-secret'}\n | {type: 'cancel-add-secret'}\n | {type: 'failed-add-secret'}\n | {type: 'saved-secret'}\n | {type: 'remove-secret'}\n | {type: 'failed-remove-secret'}\n | {type: 'removed-secret'}\n\nfunction reducer(prevState: State, action: Action): State {\n switch (action.type) {\n case 'removed-secret':\n return {...prevState, status: 'disabled'}\n case 'remove-secret':\n return {...prevState, status: 'removing-secret'}\n case 'saved-secret':\n return {...prevState, status: 'enabled'}\n case 'save-secret':\n return {...prevState, status: 'adding-secret'}\n case 'cancel-add-secret':\n return {...prevState, status: 'disabled'}\n case 'add-secret':\n return {...prevState, status: 'add-secret-dialog'}\n case 'failed-remove-secret':\n return {...prevState, status: 'enabled'}\n case 'failed-add-secret':\n return {...prevState, status: 'add-secret-dialog'}\n default:\n return prevState\n }\n}\n\nasync function enableVercelProtectionBypass(client: SanityClient, secret: string): Promise<void> {\n const patch = client.patch(_id).set({secret})\n await client.transaction().createIfNotExists({_id, _type}).patch(patch).commit({tag})\n}\n\nasync function disableVercelProtectionBypass(client: SanityClient): Promise<void> {\n const patch = client.patch(_id).set({secret: null})\n await client.transaction().createIfNotExists({_id, _type}).patch(patch).commit({tag})\n}\n\nexport default function VercelProtectionBypassTool(): React.JSX.Element {\n const client = useClient({apiVersion: apiVersion})\n const {push: pushToast} = useToast()\n const [state, dispatch] = useReducer(reducer, {status: 'loading'})\n const adding = state.status === 'adding-secret'\n const removing = state.status === 'removing-secret'\n\n const handleEnable = (secret: string) => {\n dispatch({type: 'save-secret'})\n enableVercelProtectionBypass(client, secret)\n .then(() => {\n dispatch({type: 'saved-secret'})\n pushToast({\n status: 'success',\n title: 'Protection bypass is now enabled',\n })\n })\n .catch((reason) => {\n // eslint-disable-next-line no-console\n console.error(reason)\n pushToast({\n status: 'error',\n title:\n 'There was an error when trying to enable protection bypass. See the browser console for more information.',\n })\n dispatch({type: 'failed-add-secret'})\n })\n }\n\n useEffect(() => {\n const unsubscribe = subscribeToVercelProtectionBypass(client, (secret) =>\n dispatch({type: secret ? 'saved-secret' : 'removed-secret'}),\n )\n return () => unsubscribe()\n }, [client])\n\n const enabled = state.status === 'enabled' || removing\n\n return (\n <>\n <Box\n sizing=\"border\"\n display=\"flex\"\n style={{\n height: '100%',\n alignItems: 'center',\n justifyContent: 'center',\n flexDirection: 'column',\n }}\n >\n <Stack space={5}>\n <Card padding={4} style={{maxWidth: 640}}>\n <Stack space={4} style={{justifyItems: 'flex-start', textWrap: 'pretty'}}>\n <Heading>Vercel Protection Bypass</Heading>\n {enabled ? (\n <>\n <Box>\n <Text style={{textWrap: 'pretty'}}>\n Sanity Presentation is setup to use{' '}\n <a\n href=\"https://vercel.com/docs/security/deployment-protection/methods-to-bypass-deployment-protection/protection-bypass-automation\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n protection bypass for automation\n </a>{' '}\n in order to display protected deployments in its preview iframe for the\n current Sanity dataset.\n </Text>\n </Box>\n <Box>\n <Text>\n You can turn off automatic protection bypass at any time by clicking the\n button below.\n </Text>\n </Box>\n <Button\n mode=\"ghost\"\n tone=\"critical\"\n icon={<TrashIcon />}\n loading={removing}\n onClick={() => {\n dispatch({type: 'remove-secret'})\n disableVercelProtectionBypass(client)\n .then(() => {\n pushToast({\n status: 'warning',\n title: 'Protection bypass is now disabled',\n })\n dispatch({type: 'removed-secret'})\n })\n .catch((reason) => {\n // eslint-disable-next-line no-console\n console.error(reason)\n pushToast({\n status: 'error',\n title:\n 'There was an error when trying to disable protection bypass. See the browser console for more information.',\n })\n dispatch({type: 'failed-remove-secret'})\n })\n }}\n text=\"Remove secret\"\n />\n <Text>\n Protection bypass remains enabled if this plugin is removed from your Sanity\n config.\n </Text>\n </>\n ) : (\n <>\n <Box>\n <Text style={{textWrap: 'pretty'}}>\n Follow the instructions on{' '}\n <a\n href=\"https://vercel.com/docs/security/deployment-protection/methods-to-bypass-deployment-protection/protection-bypass-automation\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n how to enable protection bypass for automation\n </a>\n .\n </Text>\n </Box>\n <Box>\n <Text>\n This will setup a secret that Vercel exposes as an environment variable called\n VERCEL_AUTOMATION_BYPASS_SECRET, its value is the secret you need.\n </Text>\n </Box>\n <Button\n mode=\"ghost\"\n icon={<AddIcon />}\n loading={state.status === 'loading'}\n onClick={() => {\n dispatch({type: 'add-secret'})\n }}\n text=\"Add secret\"\n />\n <Text>\n If you're using Sanity Presentation Tool with multiple protected\n deployments ensure that they have the same secret set, as this tool will set a\n secret that is shared in your dataset with all instances of Presentation Tool.\n </Text>\n </>\n )}\n </Stack>\n </Card>\n </Stack>\n </Box>\n {(state.status === 'add-secret-dialog' || state.status === 'adding-secret') && (\n <Dialog\n animate\n id=\"add-secret-dialog\"\n onClickOutside={() => dispatch({type: 'cancel-add-secret'})}\n >\n <Card padding={3}>\n <form\n onSubmit={(event) => {\n event.preventDefault()\n event.currentTarget.reportValidity()\n const formData = new FormData(event.currentTarget)\n const secret = formData.get('secret') as string\n if (secret) handleEnable(secret)\n }}\n >\n <Stack space={3}>\n <Stack space={2}>\n <Text as=\"label\" weight=\"semibold\" size={1}>\n Add bypass secret\n </Text>\n <Text muted size={1}>\n {`Make sure it's the same secret the Vercel deployment is using that's loaded in the preview iframe.`}\n </Text>\n <TextInput\n name=\"secret\"\n onFocus={(event) => {\n event.currentTarget.setCustomValidity('')\n }}\n onBlur={(event) => {\n event.currentTarget.setCustomValidity(\n event.currentTarget.value.length == 32\n ? ''\n : 'Secret must be 32 characters long',\n )\n event.currentTarget.required = true\n }}\n minLength={32}\n maxLength={32}\n autoComplete=\"off\"\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n spellCheck=\"false\"\n disabled={adding}\n />\n </Stack>\n <Button\n type=\"submit\"\n loading={adding}\n text={adding ? 'Saving…' : 'Save'}\n tone=\"positive\"\n />\n </Stack>\n </form>\n </Card>\n </Dialog>\n )}\n </>\n )\n}\n"],"names":["reducer","prevState","action","type","status","enableVercelProtectionBypass","client","secret","patch","_id","set","transaction","createIfNotExists","_type","commit","tag","disableVercelProtectionBypass","VercelProtectionBypassTool","$","_c","t0","Symbol","for","apiVersion","useClient","push","pushToast","useToast","t1","state","dispatch","useReducer","adding","removing","t2","then","title","catch","reason","console","error","handleEnable","t3","t4","unsubscribe","subscribeToVercelProtectionBypass","secret_0","useEffect","enabled","t5","height","alignItems","justifyContent","flexDirection","t6","maxWidth","t7","t8","justifyItems","textWrap","t9","reason_0","t10","event","preventDefault","currentTarget","reportValidity","secret_1","FormData","get","_temp","_temp2","t11","event_1","setCustomValidity","value","length","required","event_0"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
export declare interface VercelProtectionBypassConfig {
|
|
1
|
+
import * as sanity0 from "sanity";
|
|
2
|
+
interface VercelProtectionBypassConfig {
|
|
4
3
|
name?: string;
|
|
5
4
|
title?: string;
|
|
6
5
|
icon?: React.ComponentType;
|
|
7
6
|
}
|
|
8
|
-
|
|
9
|
-
export
|
|
10
|
-
|
|
11
|
-
export {};
|
|
7
|
+
declare const vercelProtectionBypassTool: sanity0.Plugin<void | VercelProtectionBypassConfig>;
|
|
8
|
+
export { VercelProtectionBypassConfig, vercelProtectionBypassTool };
|
package/dist/index.js
CHANGED
|
@@ -1,22 +1,54 @@
|
|
|
1
1
|
import { lazy } from "react";
|
|
2
|
-
import { definePlugin } from "sanity";
|
|
2
|
+
import { definePlugin, defineType } from "sanity";
|
|
3
|
+
import { LockIcon, CheckmarkCircleIcon, CloseCircleIcon } from "@sanity/icons";
|
|
4
|
+
import { vercelProtectionBypassSchemaType } from "@sanity/preview-url-secret/constants";
|
|
3
5
|
const id = "vercel-protection-bypass", vercelProtectionBypassTool = definePlugin((options) => {
|
|
4
6
|
const {
|
|
5
|
-
name,
|
|
6
|
-
title,
|
|
7
|
-
icon,
|
|
7
|
+
name = "vercel-protection-bypass",
|
|
8
|
+
title = "Vercel Protection Bypass",
|
|
9
|
+
icon = LockIcon,
|
|
8
10
|
...config
|
|
9
11
|
} = options || {};
|
|
10
12
|
return {
|
|
11
13
|
name: `@sanity/preview-url-secret/${id}`,
|
|
12
14
|
tools: [{
|
|
13
|
-
name
|
|
14
|
-
title
|
|
15
|
+
name,
|
|
16
|
+
title,
|
|
15
17
|
icon,
|
|
16
18
|
component: lazy(() => import("./_chunks-es/VercelProtectionBypassTool.js")),
|
|
17
19
|
options: config,
|
|
18
20
|
__internalApplicationType: `sanity/${id}`
|
|
19
|
-
}]
|
|
21
|
+
}],
|
|
22
|
+
document: {
|
|
23
|
+
actions: (prev, context) => context.schemaType !== vercelProtectionBypassSchemaType ? prev : []
|
|
24
|
+
},
|
|
25
|
+
schema: {
|
|
26
|
+
types: [defineType({
|
|
27
|
+
type: "document",
|
|
28
|
+
icon: LockIcon,
|
|
29
|
+
name: vercelProtectionBypassSchemaType,
|
|
30
|
+
title,
|
|
31
|
+
readOnly: !0,
|
|
32
|
+
fields: [{
|
|
33
|
+
type: "string",
|
|
34
|
+
name: "secret",
|
|
35
|
+
title: "Secret"
|
|
36
|
+
}],
|
|
37
|
+
preview: {
|
|
38
|
+
select: {
|
|
39
|
+
secret: "secret"
|
|
40
|
+
},
|
|
41
|
+
prepare(data) {
|
|
42
|
+
const enabled = data.secret !== null;
|
|
43
|
+
return {
|
|
44
|
+
title: enabled ? "Enabled" : "Disabled",
|
|
45
|
+
subtitle: title,
|
|
46
|
+
media: enabled ? CheckmarkCircleIcon : CloseCircleIcon
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
})]
|
|
51
|
+
}
|
|
20
52
|
};
|
|
21
53
|
});
|
|
22
54
|
export {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import {lazy} from 'react'\nimport {definePlugin} from 'sanity'\n\nconst id = 'vercel-protection-bypass'\n\nexport interface VercelProtectionBypassConfig {\n name?: string\n title?: string\n icon?: React.ComponentType\n}\n\nexport const vercelProtectionBypassTool = definePlugin<VercelProtectionBypassConfig | void>(\n (options) => {\n const {name
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import {lazy} from 'react'\nimport {definePlugin, defineType} from 'sanity'\n\nimport {CheckmarkCircleIcon, CloseCircleIcon, LockIcon} from '@sanity/icons'\nimport {\n vercelProtectionBypassSchemaId as _id,\n vercelProtectionBypassSchemaType as type,\n} from '@sanity/preview-url-secret/constants'\n\nconst id = 'vercel-protection-bypass'\n\nexport interface VercelProtectionBypassConfig {\n name?: string\n title?: string\n icon?: React.ComponentType\n}\n\nexport const vercelProtectionBypassTool = definePlugin<VercelProtectionBypassConfig | void>(\n (options) => {\n const {\n name = 'vercel-protection-bypass',\n title = 'Vercel Protection Bypass',\n icon = LockIcon,\n ...config\n } = options || {}\n return {\n name: `@sanity/preview-url-secret/${id}`,\n tools: [\n {\n name,\n title,\n icon: icon,\n component: lazy(() => import('./VercelProtectionBypassTool')),\n options: config,\n __internalApplicationType: `sanity/${id}`,\n },\n ],\n document: {\n actions: (prev, context) => {\n if (context.schemaType !== type) {\n return prev\n }\n return []\n },\n },\n schema: {\n types: [\n defineType({\n type: 'document',\n icon: LockIcon,\n name: type,\n title,\n readOnly: true,\n fields: [\n {\n type: 'string',\n name: 'secret',\n title: 'Secret',\n },\n ],\n preview: {\n select: {\n secret: 'secret',\n },\n prepare(data) {\n const enabled = data['secret'] !== null\n return {\n title: enabled ? 'Enabled' : 'Disabled',\n subtitle: title,\n media: enabled ? CheckmarkCircleIcon : CloseCircleIcon,\n }\n },\n },\n }),\n ],\n },\n }\n },\n)\n"],"names":["id","vercelProtectionBypassTool","definePlugin","options","name","title","icon","LockIcon","config","tools","component","lazy","__internalApplicationType","document","actions","prev","context","schemaType","type","schema","types","defineType","readOnly","fields","preview","select","secret","prepare","data","enabled","subtitle","media","CheckmarkCircleIcon","CloseCircleIcon"],"mappings":";;;;AASA,MAAMA,KAAK,4BAQEC,6BAA6BC,aACvCC,CAAAA,YAAY;AACX,QAAM;AAAA,IACJC,OAAO;AAAA,IACPC,QAAQ;AAAA,IACRC,OAAOC;AAAAA,IACP,GAAGC;AAAAA,EAAAA,IACDL,WAAW,CAAA;AACf,SAAO;AAAA,IACLC,MAAM,8BAA8BJ,EAAE;AAAA,IACtCS,OAAO,CACL;AAAA,MACEL;AAAAA,MACAC;AAAAA,MACAC;AAAAA,MACAI,WAAWC,KAAK,MAAM,OAAO,4CAA8B,CAAC;AAAA,MAC5DR,SAASK;AAAAA,MACTI,2BAA2B,UAAUZ,EAAE;AAAA,IAAA,CACxC;AAAA,IAEHa,UAAU;AAAA,MACRC,SAASA,CAACC,MAAMC,YACVA,QAAQC,eAAeC,mCAClBH,OAEF,CAAA;AAAA,IAAA;AAAA,IAGXI,QAAQ;AAAA,MACNC,OAAO,CACLC,WAAW;AAAA,QACTH,MAAM;AAAA,QACNZ,MAAMC;AAAAA,QACNH,MAAMc;AAAAA,QACNb;AAAAA,QACAiB,UAAU;AAAA,QACVC,QAAQ,CACN;AAAA,UACEL,MAAM;AAAA,UACNd,MAAM;AAAA,UACNC,OAAO;AAAA,QAAA,CACR;AAAA,QAEHmB,SAAS;AAAA,UACPC,QAAQ;AAAA,YACNC,QAAQ;AAAA,UAAA;AAAA,UAEVC,QAAQC,MAAM;AACZ,kBAAMC,UAAUD,KAAK,WAAc;AACnC,mBAAO;AAAA,cACLvB,OAAOwB,UAAU,YAAY;AAAA,cAC7BC,UAAUzB;AAAAA,cACV0B,OAAOF,UAAUG,sBAAsBC;AAAAA,YAAAA;AAAAA,UAE3C;AAAA,QAAA;AAAA,MACF,CACD,CAAC;AAAA,IAAA;AAAA,EAEN;AAEJ,CACF;"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sanity/vercel-protection-bypass",
|
|
3
|
-
"version": "
|
|
4
|
-
"homepage": "https://github.com/sanity-io/plugins/tree/main/packages
|
|
3
|
+
"version": "3.1.0",
|
|
4
|
+
"homepage": "https://github.com/sanity-io/plugins/tree/main/packages/%40sanity/vercel-protection-bypass#readme",
|
|
5
5
|
"bugs": {
|
|
6
6
|
"url": "https://github.com/sanity-io/plugins/issues"
|
|
7
7
|
},
|
|
@@ -10,54 +10,55 @@
|
|
|
10
10
|
"url": "git+ssh://git@github.com/sanity-io/plugins.git",
|
|
11
11
|
"directory": "packages/@sanity/vercel-protection-bypass"
|
|
12
12
|
},
|
|
13
|
+
"keywords": [
|
|
14
|
+
"sanity",
|
|
15
|
+
"studio",
|
|
16
|
+
"sanity-plugin",
|
|
17
|
+
"vercel"
|
|
18
|
+
],
|
|
13
19
|
"license": "MIT",
|
|
14
20
|
"author": "Sanity.io <hello@sanity.io>",
|
|
15
|
-
"sideEffects": false,
|
|
16
21
|
"type": "module",
|
|
17
22
|
"exports": {
|
|
18
23
|
".": {
|
|
19
24
|
"source": "./src/index.ts",
|
|
20
|
-
"import": "./dist/index.js",
|
|
21
|
-
"require": "./dist/index.cjs",
|
|
22
25
|
"default": "./dist/index.js"
|
|
23
26
|
},
|
|
24
27
|
"./package.json": "./package.json"
|
|
25
28
|
},
|
|
26
|
-
"main": "./dist/index.cjs",
|
|
27
|
-
"module": "./dist/index.js",
|
|
28
29
|
"types": "./dist/index.d.ts",
|
|
29
30
|
"files": [
|
|
30
31
|
"dist",
|
|
31
|
-
"src",
|
|
32
|
-
"!src/**/*.test.ts",
|
|
33
|
-
"!src/**/*.test-d.ts",
|
|
34
32
|
"CHANGELOG.md"
|
|
35
33
|
],
|
|
36
34
|
"dependencies": {
|
|
37
35
|
"@sanity/icons": "^3.7.4",
|
|
38
|
-
"@sanity/preview-url-secret": "^2.1.
|
|
36
|
+
"@sanity/preview-url-secret": "^2.1.16",
|
|
39
37
|
"@sanity/ui": "^3.1.11",
|
|
40
38
|
"react-compiler-runtime": "^1.0.0"
|
|
41
39
|
},
|
|
42
40
|
"devDependencies": {
|
|
43
41
|
"@sanity/pkg-utils": "^9.1.1",
|
|
44
42
|
"@types/react": "^19.2.6",
|
|
43
|
+
"@typescript/native-preview": "7.0.0-dev.20251118.1",
|
|
45
44
|
"babel-plugin-react-compiler": "^1.0.0",
|
|
46
45
|
"react": "^19.2.0",
|
|
47
|
-
"sanity": "^4.
|
|
48
|
-
"typescript": "5.9.3"
|
|
46
|
+
"sanity": "^4.17.0",
|
|
47
|
+
"typescript": "5.9.3",
|
|
48
|
+
"@repo/package.config": "0.0.0"
|
|
49
49
|
},
|
|
50
50
|
"peerDependencies": {
|
|
51
51
|
"react": "^18.3 || ^19",
|
|
52
52
|
"sanity": "^3.93.0 || ^4"
|
|
53
53
|
},
|
|
54
54
|
"engines": {
|
|
55
|
-
"node": ">=20.19"
|
|
55
|
+
"node": ">=20.19 <22 || >=22.12"
|
|
56
56
|
},
|
|
57
57
|
"publishConfig": {
|
|
58
58
|
"access": "public"
|
|
59
59
|
},
|
|
60
60
|
"scripts": {
|
|
61
|
+
"typecheck": "(cd ../../.. && tsgo --project plugins/@sanity/vercel-protection-bypass/tsconfig.json)",
|
|
61
62
|
"build": "pkg build --strict --check --clean"
|
|
62
63
|
}
|
|
63
64
|
}
|
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var jsxRuntime = require("react/jsx-runtime"), reactCompilerRuntime = require("react-compiler-runtime"), react = require("react"), sanity = require("sanity"), icons = require("@sanity/icons"), constants = require("@sanity/preview-url-secret/constants"), toggleVercelProtectionBypass = require("@sanity/preview-url-secret/toggle-vercel-protection-bypass"), ui = require("@sanity/ui");
|
|
3
|
-
function reducer(prevState, action) {
|
|
4
|
-
switch (action.type) {
|
|
5
|
-
case "removed-secret":
|
|
6
|
-
return {
|
|
7
|
-
...prevState,
|
|
8
|
-
status: "disabled"
|
|
9
|
-
};
|
|
10
|
-
case "remove-secret":
|
|
11
|
-
return {
|
|
12
|
-
...prevState,
|
|
13
|
-
status: "removing-secret"
|
|
14
|
-
};
|
|
15
|
-
case "saved-secret":
|
|
16
|
-
return {
|
|
17
|
-
...prevState,
|
|
18
|
-
status: "enabled"
|
|
19
|
-
};
|
|
20
|
-
case "save-secret":
|
|
21
|
-
return {
|
|
22
|
-
...prevState,
|
|
23
|
-
status: "adding-secret"
|
|
24
|
-
};
|
|
25
|
-
case "cancel-add-secret":
|
|
26
|
-
return {
|
|
27
|
-
...prevState,
|
|
28
|
-
status: "disabled"
|
|
29
|
-
};
|
|
30
|
-
case "add-secret":
|
|
31
|
-
return {
|
|
32
|
-
...prevState,
|
|
33
|
-
status: "add-secret-dialog"
|
|
34
|
-
};
|
|
35
|
-
case "failed-remove-secret":
|
|
36
|
-
return {
|
|
37
|
-
...prevState,
|
|
38
|
-
status: "enabled"
|
|
39
|
-
};
|
|
40
|
-
case "failed-add-secret":
|
|
41
|
-
return {
|
|
42
|
-
...prevState,
|
|
43
|
-
status: "add-secret-dialog"
|
|
44
|
-
};
|
|
45
|
-
default:
|
|
46
|
-
return prevState;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
function VercelProtectionBypassTool() {
|
|
50
|
-
const $ = reactCompilerRuntime.c(25);
|
|
51
|
-
let t0;
|
|
52
|
-
$[0] === Symbol.for("react.memo_cache_sentinel") ? (t0 = {
|
|
53
|
-
apiVersion: constants.apiVersion
|
|
54
|
-
}, $[0] = t0) : t0 = $[0];
|
|
55
|
-
const client = sanity.useClient(t0), {
|
|
56
|
-
push: pushToast
|
|
57
|
-
} = ui.useToast();
|
|
58
|
-
let t1;
|
|
59
|
-
$[1] === Symbol.for("react.memo_cache_sentinel") ? (t1 = {
|
|
60
|
-
status: "loading"
|
|
61
|
-
}, $[1] = t1) : t1 = $[1];
|
|
62
|
-
const [state, dispatch] = react.useReducer(reducer, t1), adding = state.status === "adding-secret", removing = state.status === "removing-secret";
|
|
63
|
-
let t2;
|
|
64
|
-
$[2] !== client || $[3] !== pushToast ? (t2 = (secret) => {
|
|
65
|
-
dispatch({
|
|
66
|
-
type: "save-secret"
|
|
67
|
-
}), toggleVercelProtectionBypass.enableVercelProtectionBypass(client, secret).then(() => {
|
|
68
|
-
dispatch({
|
|
69
|
-
type: "saved-secret"
|
|
70
|
-
}), pushToast({
|
|
71
|
-
status: "success",
|
|
72
|
-
title: "Protection bypass is now enabled"
|
|
73
|
-
});
|
|
74
|
-
}).catch((reason) => {
|
|
75
|
-
console.error(reason), pushToast({
|
|
76
|
-
status: "error",
|
|
77
|
-
title: "There was an error when trying to enable protection bypass. See the browser console for more information."
|
|
78
|
-
}), dispatch({
|
|
79
|
-
type: "failed-add-secret"
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
}, $[2] = client, $[3] = pushToast, $[4] = t2) : t2 = $[4];
|
|
83
|
-
const handleEnable = t2;
|
|
84
|
-
let t3, t4;
|
|
85
|
-
$[5] !== client ? (t3 = () => {
|
|
86
|
-
const unsubscribe = toggleVercelProtectionBypass.subcribeToVercelProtectionBypass(client, (secret_0) => dispatch({
|
|
87
|
-
type: secret_0 ? "saved-secret" : "removed-secret"
|
|
88
|
-
}));
|
|
89
|
-
return () => unsubscribe();
|
|
90
|
-
}, t4 = [client], $[5] = client, $[6] = t3, $[7] = t4) : (t3 = $[6], t4 = $[7]), react.useEffect(t3, t4);
|
|
91
|
-
const enabled = state.status === "enabled" || removing;
|
|
92
|
-
let t5;
|
|
93
|
-
$[8] === Symbol.for("react.memo_cache_sentinel") ? (t5 = {
|
|
94
|
-
height: "100%",
|
|
95
|
-
alignItems: "center",
|
|
96
|
-
justifyContent: "center",
|
|
97
|
-
flexDirection: "column"
|
|
98
|
-
}, $[8] = t5) : t5 = $[8];
|
|
99
|
-
let t6;
|
|
100
|
-
$[9] === Symbol.for("react.memo_cache_sentinel") ? (t6 = {
|
|
101
|
-
maxWidth: 640
|
|
102
|
-
}, $[9] = t6) : t6 = $[9];
|
|
103
|
-
let t7, t8;
|
|
104
|
-
$[10] === Symbol.for("react.memo_cache_sentinel") ? (t7 = {
|
|
105
|
-
justifyItems: "flex-start",
|
|
106
|
-
textWrap: "pretty"
|
|
107
|
-
}, t8 = /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Vercel Protection Bypass" }), $[10] = t7, $[11] = t8) : (t7 = $[10], t8 = $[11]);
|
|
108
|
-
let t9;
|
|
109
|
-
$[12] !== client || $[13] !== enabled || $[14] !== pushToast || $[15] !== removing || $[16] !== state.status ? (t9 = /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { sizing: "border", display: "flex", style: t5, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Stack, { space: 5, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Card, { padding: 4, style: t6, children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Stack, { space: 4, style: t7, children: [
|
|
110
|
-
t8,
|
|
111
|
-
enabled ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
112
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Box, { children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { style: {
|
|
113
|
-
textWrap: "pretty"
|
|
114
|
-
}, children: [
|
|
115
|
-
"Sanity Presentation is setup to use",
|
|
116
|
-
" ",
|
|
117
|
-
/* @__PURE__ */ jsxRuntime.jsx("a", { href: "https://vercel.com/docs/security/deployment-protection/methods-to-bypass-deployment-protection/protection-bypass-automation", target: "_blank", rel: "noreferrer", children: "protection bypass for automation" }),
|
|
118
|
-
" ",
|
|
119
|
-
"in order to display protected deployments in its preview iframe for the current Sanity dataset."
|
|
120
|
-
] }) }),
|
|
121
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Box, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { children: "You can turn off automatic protection bypass at any time by clicking the button below." }) }),
|
|
122
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { mode: "ghost", tone: "critical", icon: /* @__PURE__ */ jsxRuntime.jsx(icons.TrashIcon, {}), loading: removing, onClick: () => {
|
|
123
|
-
dispatch({
|
|
124
|
-
type: "remove-secret"
|
|
125
|
-
}), toggleVercelProtectionBypass.disableVercelProtectionBypass(client).then(() => {
|
|
126
|
-
pushToast({
|
|
127
|
-
status: "warning",
|
|
128
|
-
title: "Protection bypass is now disabled"
|
|
129
|
-
}), dispatch({
|
|
130
|
-
type: "removed-secret"
|
|
131
|
-
});
|
|
132
|
-
}).catch((reason_0) => {
|
|
133
|
-
console.error(reason_0), pushToast({
|
|
134
|
-
status: "error",
|
|
135
|
-
title: "There was an error when trying to disable protection bypass. See the browser console for more information."
|
|
136
|
-
}), dispatch({
|
|
137
|
-
type: "failed-remove-secret"
|
|
138
|
-
});
|
|
139
|
-
});
|
|
140
|
-
}, text: "Remove secret" }),
|
|
141
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { children: "Protection bypass remains enabled if this plugin is removed from your Sanity config." })
|
|
142
|
-
] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
143
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Box, { children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { style: {
|
|
144
|
-
textWrap: "pretty"
|
|
145
|
-
}, children: [
|
|
146
|
-
"Follow the instructions on",
|
|
147
|
-
" ",
|
|
148
|
-
/* @__PURE__ */ jsxRuntime.jsx("a", { href: "https://vercel.com/docs/security/deployment-protection/methods-to-bypass-deployment-protection/protection-bypass-automation", target: "_blank", rel: "noreferrer", children: "how to enable protection bypass for automation" }),
|
|
149
|
-
"."
|
|
150
|
-
] }) }),
|
|
151
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Box, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { children: "This will setup a secret that Vercel exposes as an environment variable called VERCEL_AUTOMATION_BYPASS_SECRET, its value is the secret you need." }) }),
|
|
152
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { mode: "ghost", icon: /* @__PURE__ */ jsxRuntime.jsx(icons.AddIcon, {}), loading: state.status === "loading", onClick: () => {
|
|
153
|
-
dispatch({
|
|
154
|
-
type: "add-secret"
|
|
155
|
-
});
|
|
156
|
-
}, text: "Add secret" }),
|
|
157
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { children: "If you're using Sanity Presentation Tool with multiple protected deployments ensure that they have the same secret set, as this tool will set a secret that is shared in your dataset with all instances of Presentation Tool." })
|
|
158
|
-
] })
|
|
159
|
-
] }) }) }) }), $[12] = client, $[13] = enabled, $[14] = pushToast, $[15] = removing, $[16] = state.status, $[17] = t9) : t9 = $[17];
|
|
160
|
-
let t10;
|
|
161
|
-
$[18] !== adding || $[19] !== handleEnable || $[20] !== state.status ? (t10 = (state.status === "add-secret-dialog" || state.status === "adding-secret") && /* @__PURE__ */ jsxRuntime.jsx(ui.Dialog, { animate: !0, id: "add-secret-dialog", onClickOutside: () => dispatch({
|
|
162
|
-
type: "cancel-add-secret"
|
|
163
|
-
}), children: /* @__PURE__ */ jsxRuntime.jsx(ui.Card, { padding: 3, children: /* @__PURE__ */ jsxRuntime.jsx("form", { onSubmit: (event) => {
|
|
164
|
-
event.preventDefault(), event.currentTarget.reportValidity();
|
|
165
|
-
const secret_1 = new FormData(event.currentTarget).get("secret");
|
|
166
|
-
secret_1 && handleEnable(secret_1);
|
|
167
|
-
}, children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Stack, { space: 3, children: [
|
|
168
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ui.Stack, { space: 2, children: [
|
|
169
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { as: "label", weight: "semibold", size: 1, children: "Add bypass secret" }),
|
|
170
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { muted: !0, size: 1, children: "Make sure it's the same secret the Vercel deployment is using that's loaded in the preview iframe." }),
|
|
171
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.TextInput, { name: "secret", onFocus: _temp, onBlur: _temp2, minLength: 32, maxLength: 32, autoComplete: "off", autoCapitalize: "off", autoCorrect: "off", spellCheck: "false", disabled: adding })
|
|
172
|
-
] }),
|
|
173
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { type: "submit", loading: adding, text: adding ? "Saving\u2026" : "Save", tone: "positive" })
|
|
174
|
-
] }) }) }) }), $[18] = adding, $[19] = handleEnable, $[20] = state.status, $[21] = t10) : t10 = $[21];
|
|
175
|
-
let t11;
|
|
176
|
-
return $[22] !== t10 || $[23] !== t9 ? (t11 = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
177
|
-
t9,
|
|
178
|
-
t10
|
|
179
|
-
] }), $[22] = t10, $[23] = t9, $[24] = t11) : t11 = $[24], t11;
|
|
180
|
-
}
|
|
181
|
-
function _temp2(event_1) {
|
|
182
|
-
event_1.currentTarget.setCustomValidity(event_1.currentTarget.value.length == 32 ? "" : "Secret must be 32 characters long"), event_1.currentTarget.required = !0;
|
|
183
|
-
}
|
|
184
|
-
function _temp(event_0) {
|
|
185
|
-
event_0.currentTarget.setCustomValidity("");
|
|
186
|
-
}
|
|
187
|
-
exports.default = VercelProtectionBypassTool;
|
|
188
|
-
//# sourceMappingURL=VercelProtectionBypassTool.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"VercelProtectionBypassTool.cjs","sources":["../../src/VercelProtectionBypassTool.tsx"],"sourcesContent":["import {useEffect, useReducer} from 'react'\nimport {useClient} from 'sanity'\n\nimport {AddIcon, TrashIcon} from '@sanity/icons'\nimport {apiVersion} from '@sanity/preview-url-secret/constants'\nimport {\n disableVercelProtectionBypass,\n enableVercelProtectionBypass,\n subcribeToVercelProtectionBypass,\n} from '@sanity/preview-url-secret/toggle-vercel-protection-bypass'\nimport {Box, Button, Card, Dialog, Heading, Stack, Text, TextInput, useToast} from '@sanity/ui'\n\ninterface State {\n status:\n | 'loading'\n | 'disabled'\n | 'add-secret-dialog'\n | 'adding-secret'\n | 'enabled'\n | 'removing-secret'\n}\ntype Action =\n | {type: 'add-secret'}\n | {type: 'save-secret'}\n | {type: 'cancel-add-secret'}\n | {type: 'failed-add-secret'}\n | {type: 'saved-secret'}\n | {type: 'remove-secret'}\n | {type: 'failed-remove-secret'}\n | {type: 'removed-secret'}\n\nfunction reducer(prevState: State, action: Action): State {\n switch (action.type) {\n case 'removed-secret':\n return {...prevState, status: 'disabled'}\n case 'remove-secret':\n return {...prevState, status: 'removing-secret'}\n case 'saved-secret':\n return {...prevState, status: 'enabled'}\n case 'save-secret':\n return {...prevState, status: 'adding-secret'}\n case 'cancel-add-secret':\n return {...prevState, status: 'disabled'}\n case 'add-secret':\n return {...prevState, status: 'add-secret-dialog'}\n case 'failed-remove-secret':\n return {...prevState, status: 'enabled'}\n case 'failed-add-secret':\n return {...prevState, status: 'add-secret-dialog'}\n default:\n return prevState\n }\n}\n\nexport default function VercelProtectionBypassTool(): React.JSX.Element {\n const client = useClient({apiVersion: apiVersion})\n const {push: pushToast} = useToast()\n const [state, dispatch] = useReducer(reducer, {status: 'loading'})\n const adding = state.status === 'adding-secret'\n const removing = state.status === 'removing-secret'\n\n const handleEnable = (secret: string) => {\n dispatch({type: 'save-secret'})\n enableVercelProtectionBypass(client, secret)\n .then(() => {\n dispatch({type: 'saved-secret'})\n pushToast({\n status: 'success',\n title: 'Protection bypass is now enabled',\n })\n })\n .catch((reason) => {\n // eslint-disable-next-line no-console\n console.error(reason)\n pushToast({\n status: 'error',\n title:\n 'There was an error when trying to enable protection bypass. See the browser console for more information.',\n })\n dispatch({type: 'failed-add-secret'})\n })\n }\n\n useEffect(() => {\n const unsubscribe = subcribeToVercelProtectionBypass(client, (secret) =>\n dispatch({type: secret ? 'saved-secret' : 'removed-secret'}),\n )\n return () => unsubscribe()\n }, [client])\n\n const enabled = state.status === 'enabled' || removing\n\n return (\n <>\n <Box\n sizing=\"border\"\n display=\"flex\"\n style={{\n height: '100%',\n alignItems: 'center',\n justifyContent: 'center',\n flexDirection: 'column',\n }}\n >\n <Stack space={5}>\n <Card padding={4} style={{maxWidth: 640}}>\n <Stack space={4} style={{justifyItems: 'flex-start', textWrap: 'pretty'}}>\n <Heading>Vercel Protection Bypass</Heading>\n {enabled ? (\n <>\n <Box>\n <Text style={{textWrap: 'pretty'}}>\n Sanity Presentation is setup to use{' '}\n <a\n href=\"https://vercel.com/docs/security/deployment-protection/methods-to-bypass-deployment-protection/protection-bypass-automation\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n protection bypass for automation\n </a>{' '}\n in order to display protected deployments in its preview iframe for the\n current Sanity dataset.\n </Text>\n </Box>\n <Box>\n <Text>\n You can turn off automatic protection bypass at any time by clicking the\n button below.\n </Text>\n </Box>\n <Button\n mode=\"ghost\"\n tone=\"critical\"\n icon={<TrashIcon />}\n loading={removing}\n onClick={() => {\n dispatch({type: 'remove-secret'})\n disableVercelProtectionBypass(client)\n .then(() => {\n pushToast({\n status: 'warning',\n title: 'Protection bypass is now disabled',\n })\n dispatch({type: 'removed-secret'})\n })\n .catch((reason) => {\n // eslint-disable-next-line no-console\n console.error(reason)\n pushToast({\n status: 'error',\n title:\n 'There was an error when trying to disable protection bypass. See the browser console for more information.',\n })\n dispatch({type: 'failed-remove-secret'})\n })\n }}\n text=\"Remove secret\"\n />\n <Text>\n Protection bypass remains enabled if this plugin is removed from your Sanity\n config.\n </Text>\n </>\n ) : (\n <>\n <Box>\n <Text style={{textWrap: 'pretty'}}>\n Follow the instructions on{' '}\n <a\n href=\"https://vercel.com/docs/security/deployment-protection/methods-to-bypass-deployment-protection/protection-bypass-automation\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n how to enable protection bypass for automation\n </a>\n .\n </Text>\n </Box>\n <Box>\n <Text>\n This will setup a secret that Vercel exposes as an environment variable called\n VERCEL_AUTOMATION_BYPASS_SECRET, its value is the secret you need.\n </Text>\n </Box>\n <Button\n mode=\"ghost\"\n icon={<AddIcon />}\n loading={state.status === 'loading'}\n onClick={() => {\n dispatch({type: 'add-secret'})\n }}\n text=\"Add secret\"\n />\n <Text>\n If you're using Sanity Presentation Tool with multiple protected\n deployments ensure that they have the same secret set, as this tool will set a\n secret that is shared in your dataset with all instances of Presentation Tool.\n </Text>\n </>\n )}\n </Stack>\n </Card>\n </Stack>\n </Box>\n {(state.status === 'add-secret-dialog' || state.status === 'adding-secret') && (\n <Dialog\n animate\n id=\"add-secret-dialog\"\n onClickOutside={() => dispatch({type: 'cancel-add-secret'})}\n >\n <Card padding={3}>\n <form\n onSubmit={(event) => {\n event.preventDefault()\n event.currentTarget.reportValidity()\n const formData = new FormData(event.currentTarget)\n const secret = formData.get('secret') as string\n if (secret) handleEnable(secret)\n }}\n >\n <Stack space={3}>\n <Stack space={2}>\n <Text as=\"label\" weight=\"semibold\" size={1}>\n Add bypass secret\n </Text>\n <Text muted size={1}>\n {`Make sure it's the same secret the Vercel deployment is using that's loaded in the preview iframe.`}\n </Text>\n <TextInput\n name=\"secret\"\n onFocus={(event) => {\n event.currentTarget.setCustomValidity('')\n }}\n onBlur={(event) => {\n event.currentTarget.setCustomValidity(\n event.currentTarget.value.length == 32\n ? ''\n : 'Secret must be 32 characters long',\n )\n event.currentTarget.required = true\n }}\n minLength={32}\n maxLength={32}\n autoComplete=\"off\"\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n spellCheck=\"false\"\n disabled={adding}\n />\n </Stack>\n <Button\n type=\"submit\"\n loading={adding}\n text={adding ? 'Saving…' : 'Save'}\n tone=\"positive\"\n />\n </Stack>\n </form>\n </Card>\n </Dialog>\n )}\n </>\n )\n}\n"],"names":["reducer","prevState","action","type","status","VercelProtectionBypassTool","$","_c","t0","Symbol","for","apiVersion","client","useClient","push","pushToast","useToast","t1","state","dispatch","useReducer","adding","removing","t2","secret","enableVercelProtectionBypass","then","title","catch","reason","console","error","handleEnable","t3","t4","unsubscribe","subcribeToVercelProtectionBypass","secret_0","useEffect","enabled","t5","height","alignItems","justifyContent","flexDirection","t6","maxWidth","t7","t8","justifyItems","textWrap","Heading","t9","Box","jsx","Stack","Card","jsxs","Fragment","Text","Button","TrashIcon","disableVercelProtectionBypass","reason_0","AddIcon","t10","Dialog","event","preventDefault","currentTarget","reportValidity","secret_1","FormData","get","TextInput","_temp","_temp2","t11","event_1","setCustomValidity","value","length","required","event_0"],"mappings":"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"}
|
package/dist/index.cjs
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: !0 });
|
|
3
|
-
var react = require("react"), sanity = require("sanity");
|
|
4
|
-
const id = "vercel-protection-bypass", vercelProtectionBypassTool = sanity.definePlugin((options) => {
|
|
5
|
-
const {
|
|
6
|
-
name,
|
|
7
|
-
title,
|
|
8
|
-
icon,
|
|
9
|
-
...config
|
|
10
|
-
} = options || {};
|
|
11
|
-
return {
|
|
12
|
-
name: `@sanity/preview-url-secret/${id}`,
|
|
13
|
-
tools: [{
|
|
14
|
-
name: name || "vercel-protection-bypass",
|
|
15
|
-
title: title || "Vercel Protection Bypass",
|
|
16
|
-
icon,
|
|
17
|
-
component: react.lazy(() => Promise.resolve().then(function() {
|
|
18
|
-
return require("./_chunks-cjs/VercelProtectionBypassTool.cjs");
|
|
19
|
-
})),
|
|
20
|
-
options: config,
|
|
21
|
-
__internalApplicationType: `sanity/${id}`
|
|
22
|
-
}]
|
|
23
|
-
};
|
|
24
|
-
});
|
|
25
|
-
exports.vercelProtectionBypassTool = vercelProtectionBypassTool;
|
|
26
|
-
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":["import {lazy} from 'react'\nimport {definePlugin} from 'sanity'\n\nconst id = 'vercel-protection-bypass'\n\nexport interface VercelProtectionBypassConfig {\n name?: string\n title?: string\n icon?: React.ComponentType\n}\n\nexport const vercelProtectionBypassTool = definePlugin<VercelProtectionBypassConfig | void>(\n (options) => {\n const {name, title, icon, ...config} = options || {}\n return {\n name: `@sanity/preview-url-secret/${id}`,\n tools: [\n {\n name: name || 'vercel-protection-bypass',\n title: title || 'Vercel Protection Bypass',\n icon: icon,\n component: lazy(() => import('./VercelProtectionBypassTool')),\n options: config,\n __internalApplicationType: `sanity/${id}`,\n },\n ],\n }\n },\n)\n"],"names":["id","vercelProtectionBypassTool","definePlugin","options","name","title","icon","config","tools","component","lazy","__internalApplicationType"],"mappings":";;;AAGA,MAAMA,KAAK,4BAQEC,6BAA6BC,OAAAA,aACvCC,CAAAA,YAAY;AACX,QAAM;AAAA,IAACC;AAAAA,IAAMC;AAAAA,IAAOC;AAAAA,IAAM,GAAGC;AAAAA,EAAAA,IAAUJ,WAAW,CAAA;AAClD,SAAO;AAAA,IACLC,MAAM,8BAA8BJ,EAAE;AAAA,IACtCQ,OAAO,CACL;AAAA,MACEJ,MAAMA,QAAQ;AAAA,MACdC,OAAOA,SAAS;AAAA,MAChBC;AAAAA,MACAG,WAAWC,MAAAA,KAAK,MAAM,QAAA,QAAA,EAAA,KAAA,WAAA;AAAA,eAAA,QAAO,8CAA8B;AAAA,QAAC;AAAA,MAC5DP,SAASI;AAAAA,MACTI,2BAA2B,UAAUX,EAAE;AAAA,IAAA,CACxC;AAAA,EAAA;AAGP,CACF;;"}
|
package/dist/index.d.cts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { Plugin as Plugin_2 } from "sanity";
|
|
2
|
-
|
|
3
|
-
export declare interface VercelProtectionBypassConfig {
|
|
4
|
-
name?: string;
|
|
5
|
-
title?: string;
|
|
6
|
-
icon?: React.ComponentType;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export declare const vercelProtectionBypassTool: Plugin_2<void | VercelProtectionBypassConfig>;
|
|
10
|
-
|
|
11
|
-
export {};
|
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
import {useEffect, useReducer} from 'react'
|
|
2
|
-
import {useClient} from 'sanity'
|
|
3
|
-
|
|
4
|
-
import {AddIcon, TrashIcon} from '@sanity/icons'
|
|
5
|
-
import {apiVersion} from '@sanity/preview-url-secret/constants'
|
|
6
|
-
import {
|
|
7
|
-
disableVercelProtectionBypass,
|
|
8
|
-
enableVercelProtectionBypass,
|
|
9
|
-
subcribeToVercelProtectionBypass,
|
|
10
|
-
} from '@sanity/preview-url-secret/toggle-vercel-protection-bypass'
|
|
11
|
-
import {Box, Button, Card, Dialog, Heading, Stack, Text, TextInput, useToast} from '@sanity/ui'
|
|
12
|
-
|
|
13
|
-
interface State {
|
|
14
|
-
status:
|
|
15
|
-
| 'loading'
|
|
16
|
-
| 'disabled'
|
|
17
|
-
| 'add-secret-dialog'
|
|
18
|
-
| 'adding-secret'
|
|
19
|
-
| 'enabled'
|
|
20
|
-
| 'removing-secret'
|
|
21
|
-
}
|
|
22
|
-
type Action =
|
|
23
|
-
| {type: 'add-secret'}
|
|
24
|
-
| {type: 'save-secret'}
|
|
25
|
-
| {type: 'cancel-add-secret'}
|
|
26
|
-
| {type: 'failed-add-secret'}
|
|
27
|
-
| {type: 'saved-secret'}
|
|
28
|
-
| {type: 'remove-secret'}
|
|
29
|
-
| {type: 'failed-remove-secret'}
|
|
30
|
-
| {type: 'removed-secret'}
|
|
31
|
-
|
|
32
|
-
function reducer(prevState: State, action: Action): State {
|
|
33
|
-
switch (action.type) {
|
|
34
|
-
case 'removed-secret':
|
|
35
|
-
return {...prevState, status: 'disabled'}
|
|
36
|
-
case 'remove-secret':
|
|
37
|
-
return {...prevState, status: 'removing-secret'}
|
|
38
|
-
case 'saved-secret':
|
|
39
|
-
return {...prevState, status: 'enabled'}
|
|
40
|
-
case 'save-secret':
|
|
41
|
-
return {...prevState, status: 'adding-secret'}
|
|
42
|
-
case 'cancel-add-secret':
|
|
43
|
-
return {...prevState, status: 'disabled'}
|
|
44
|
-
case 'add-secret':
|
|
45
|
-
return {...prevState, status: 'add-secret-dialog'}
|
|
46
|
-
case 'failed-remove-secret':
|
|
47
|
-
return {...prevState, status: 'enabled'}
|
|
48
|
-
case 'failed-add-secret':
|
|
49
|
-
return {...prevState, status: 'add-secret-dialog'}
|
|
50
|
-
default:
|
|
51
|
-
return prevState
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export default function VercelProtectionBypassTool(): React.JSX.Element {
|
|
56
|
-
const client = useClient({apiVersion: apiVersion})
|
|
57
|
-
const {push: pushToast} = useToast()
|
|
58
|
-
const [state, dispatch] = useReducer(reducer, {status: 'loading'})
|
|
59
|
-
const adding = state.status === 'adding-secret'
|
|
60
|
-
const removing = state.status === 'removing-secret'
|
|
61
|
-
|
|
62
|
-
const handleEnable = (secret: string) => {
|
|
63
|
-
dispatch({type: 'save-secret'})
|
|
64
|
-
enableVercelProtectionBypass(client, secret)
|
|
65
|
-
.then(() => {
|
|
66
|
-
dispatch({type: 'saved-secret'})
|
|
67
|
-
pushToast({
|
|
68
|
-
status: 'success',
|
|
69
|
-
title: 'Protection bypass is now enabled',
|
|
70
|
-
})
|
|
71
|
-
})
|
|
72
|
-
.catch((reason) => {
|
|
73
|
-
// eslint-disable-next-line no-console
|
|
74
|
-
console.error(reason)
|
|
75
|
-
pushToast({
|
|
76
|
-
status: 'error',
|
|
77
|
-
title:
|
|
78
|
-
'There was an error when trying to enable protection bypass. See the browser console for more information.',
|
|
79
|
-
})
|
|
80
|
-
dispatch({type: 'failed-add-secret'})
|
|
81
|
-
})
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
useEffect(() => {
|
|
85
|
-
const unsubscribe = subcribeToVercelProtectionBypass(client, (secret) =>
|
|
86
|
-
dispatch({type: secret ? 'saved-secret' : 'removed-secret'}),
|
|
87
|
-
)
|
|
88
|
-
return () => unsubscribe()
|
|
89
|
-
}, [client])
|
|
90
|
-
|
|
91
|
-
const enabled = state.status === 'enabled' || removing
|
|
92
|
-
|
|
93
|
-
return (
|
|
94
|
-
<>
|
|
95
|
-
<Box
|
|
96
|
-
sizing="border"
|
|
97
|
-
display="flex"
|
|
98
|
-
style={{
|
|
99
|
-
height: '100%',
|
|
100
|
-
alignItems: 'center',
|
|
101
|
-
justifyContent: 'center',
|
|
102
|
-
flexDirection: 'column',
|
|
103
|
-
}}
|
|
104
|
-
>
|
|
105
|
-
<Stack space={5}>
|
|
106
|
-
<Card padding={4} style={{maxWidth: 640}}>
|
|
107
|
-
<Stack space={4} style={{justifyItems: 'flex-start', textWrap: 'pretty'}}>
|
|
108
|
-
<Heading>Vercel Protection Bypass</Heading>
|
|
109
|
-
{enabled ? (
|
|
110
|
-
<>
|
|
111
|
-
<Box>
|
|
112
|
-
<Text style={{textWrap: 'pretty'}}>
|
|
113
|
-
Sanity Presentation is setup to use{' '}
|
|
114
|
-
<a
|
|
115
|
-
href="https://vercel.com/docs/security/deployment-protection/methods-to-bypass-deployment-protection/protection-bypass-automation"
|
|
116
|
-
target="_blank"
|
|
117
|
-
rel="noreferrer"
|
|
118
|
-
>
|
|
119
|
-
protection bypass for automation
|
|
120
|
-
</a>{' '}
|
|
121
|
-
in order to display protected deployments in its preview iframe for the
|
|
122
|
-
current Sanity dataset.
|
|
123
|
-
</Text>
|
|
124
|
-
</Box>
|
|
125
|
-
<Box>
|
|
126
|
-
<Text>
|
|
127
|
-
You can turn off automatic protection bypass at any time by clicking the
|
|
128
|
-
button below.
|
|
129
|
-
</Text>
|
|
130
|
-
</Box>
|
|
131
|
-
<Button
|
|
132
|
-
mode="ghost"
|
|
133
|
-
tone="critical"
|
|
134
|
-
icon={<TrashIcon />}
|
|
135
|
-
loading={removing}
|
|
136
|
-
onClick={() => {
|
|
137
|
-
dispatch({type: 'remove-secret'})
|
|
138
|
-
disableVercelProtectionBypass(client)
|
|
139
|
-
.then(() => {
|
|
140
|
-
pushToast({
|
|
141
|
-
status: 'warning',
|
|
142
|
-
title: 'Protection bypass is now disabled',
|
|
143
|
-
})
|
|
144
|
-
dispatch({type: 'removed-secret'})
|
|
145
|
-
})
|
|
146
|
-
.catch((reason) => {
|
|
147
|
-
// eslint-disable-next-line no-console
|
|
148
|
-
console.error(reason)
|
|
149
|
-
pushToast({
|
|
150
|
-
status: 'error',
|
|
151
|
-
title:
|
|
152
|
-
'There was an error when trying to disable protection bypass. See the browser console for more information.',
|
|
153
|
-
})
|
|
154
|
-
dispatch({type: 'failed-remove-secret'})
|
|
155
|
-
})
|
|
156
|
-
}}
|
|
157
|
-
text="Remove secret"
|
|
158
|
-
/>
|
|
159
|
-
<Text>
|
|
160
|
-
Protection bypass remains enabled if this plugin is removed from your Sanity
|
|
161
|
-
config.
|
|
162
|
-
</Text>
|
|
163
|
-
</>
|
|
164
|
-
) : (
|
|
165
|
-
<>
|
|
166
|
-
<Box>
|
|
167
|
-
<Text style={{textWrap: 'pretty'}}>
|
|
168
|
-
Follow the instructions on{' '}
|
|
169
|
-
<a
|
|
170
|
-
href="https://vercel.com/docs/security/deployment-protection/methods-to-bypass-deployment-protection/protection-bypass-automation"
|
|
171
|
-
target="_blank"
|
|
172
|
-
rel="noreferrer"
|
|
173
|
-
>
|
|
174
|
-
how to enable protection bypass for automation
|
|
175
|
-
</a>
|
|
176
|
-
.
|
|
177
|
-
</Text>
|
|
178
|
-
</Box>
|
|
179
|
-
<Box>
|
|
180
|
-
<Text>
|
|
181
|
-
This will setup a secret that Vercel exposes as an environment variable called
|
|
182
|
-
VERCEL_AUTOMATION_BYPASS_SECRET, its value is the secret you need.
|
|
183
|
-
</Text>
|
|
184
|
-
</Box>
|
|
185
|
-
<Button
|
|
186
|
-
mode="ghost"
|
|
187
|
-
icon={<AddIcon />}
|
|
188
|
-
loading={state.status === 'loading'}
|
|
189
|
-
onClick={() => {
|
|
190
|
-
dispatch({type: 'add-secret'})
|
|
191
|
-
}}
|
|
192
|
-
text="Add secret"
|
|
193
|
-
/>
|
|
194
|
-
<Text>
|
|
195
|
-
If you're using Sanity Presentation Tool with multiple protected
|
|
196
|
-
deployments ensure that they have the same secret set, as this tool will set a
|
|
197
|
-
secret that is shared in your dataset with all instances of Presentation Tool.
|
|
198
|
-
</Text>
|
|
199
|
-
</>
|
|
200
|
-
)}
|
|
201
|
-
</Stack>
|
|
202
|
-
</Card>
|
|
203
|
-
</Stack>
|
|
204
|
-
</Box>
|
|
205
|
-
{(state.status === 'add-secret-dialog' || state.status === 'adding-secret') && (
|
|
206
|
-
<Dialog
|
|
207
|
-
animate
|
|
208
|
-
id="add-secret-dialog"
|
|
209
|
-
onClickOutside={() => dispatch({type: 'cancel-add-secret'})}
|
|
210
|
-
>
|
|
211
|
-
<Card padding={3}>
|
|
212
|
-
<form
|
|
213
|
-
onSubmit={(event) => {
|
|
214
|
-
event.preventDefault()
|
|
215
|
-
event.currentTarget.reportValidity()
|
|
216
|
-
const formData = new FormData(event.currentTarget)
|
|
217
|
-
const secret = formData.get('secret') as string
|
|
218
|
-
if (secret) handleEnable(secret)
|
|
219
|
-
}}
|
|
220
|
-
>
|
|
221
|
-
<Stack space={3}>
|
|
222
|
-
<Stack space={2}>
|
|
223
|
-
<Text as="label" weight="semibold" size={1}>
|
|
224
|
-
Add bypass secret
|
|
225
|
-
</Text>
|
|
226
|
-
<Text muted size={1}>
|
|
227
|
-
{`Make sure it's the same secret the Vercel deployment is using that's loaded in the preview iframe.`}
|
|
228
|
-
</Text>
|
|
229
|
-
<TextInput
|
|
230
|
-
name="secret"
|
|
231
|
-
onFocus={(event) => {
|
|
232
|
-
event.currentTarget.setCustomValidity('')
|
|
233
|
-
}}
|
|
234
|
-
onBlur={(event) => {
|
|
235
|
-
event.currentTarget.setCustomValidity(
|
|
236
|
-
event.currentTarget.value.length == 32
|
|
237
|
-
? ''
|
|
238
|
-
: 'Secret must be 32 characters long',
|
|
239
|
-
)
|
|
240
|
-
event.currentTarget.required = true
|
|
241
|
-
}}
|
|
242
|
-
minLength={32}
|
|
243
|
-
maxLength={32}
|
|
244
|
-
autoComplete="off"
|
|
245
|
-
autoCapitalize="off"
|
|
246
|
-
autoCorrect="off"
|
|
247
|
-
spellCheck="false"
|
|
248
|
-
disabled={adding}
|
|
249
|
-
/>
|
|
250
|
-
</Stack>
|
|
251
|
-
<Button
|
|
252
|
-
type="submit"
|
|
253
|
-
loading={adding}
|
|
254
|
-
text={adding ? 'Saving…' : 'Save'}
|
|
255
|
-
tone="positive"
|
|
256
|
-
/>
|
|
257
|
-
</Stack>
|
|
258
|
-
</form>
|
|
259
|
-
</Card>
|
|
260
|
-
</Dialog>
|
|
261
|
-
)}
|
|
262
|
-
</>
|
|
263
|
-
)
|
|
264
|
-
}
|
package/src/index.ts
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import {lazy} from 'react'
|
|
2
|
-
import {definePlugin} from 'sanity'
|
|
3
|
-
|
|
4
|
-
const id = 'vercel-protection-bypass'
|
|
5
|
-
|
|
6
|
-
export interface VercelProtectionBypassConfig {
|
|
7
|
-
name?: string
|
|
8
|
-
title?: string
|
|
9
|
-
icon?: React.ComponentType
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export const vercelProtectionBypassTool = definePlugin<VercelProtectionBypassConfig | void>(
|
|
13
|
-
(options) => {
|
|
14
|
-
const {name, title, icon, ...config} = options || {}
|
|
15
|
-
return {
|
|
16
|
-
name: `@sanity/preview-url-secret/${id}`,
|
|
17
|
-
tools: [
|
|
18
|
-
{
|
|
19
|
-
name: name || 'vercel-protection-bypass',
|
|
20
|
-
title: title || 'Vercel Protection Bypass',
|
|
21
|
-
icon: icon,
|
|
22
|
-
component: lazy(() => import('./VercelProtectionBypassTool')),
|
|
23
|
-
options: config,
|
|
24
|
-
__internalApplicationType: `sanity/${id}`,
|
|
25
|
-
},
|
|
26
|
-
],
|
|
27
|
-
}
|
|
28
|
-
},
|
|
29
|
-
)
|