@sanity/studio-secrets
4.0.154.0.16
~
Modified (5 files)
Index: package/dist/index.js
===================================================================
--- package/dist/index.js
+++ package/dist/index.js
@@ -1,4 +1,5 @@
+import "@sanity/ui/styles.css";
import { c } from "react/compiler-runtime";
import { Button, Card, Dialog, Stack, Text, TextInput } from "@sanity/ui";
import { useEffect, useState } from "react";
import { useObservable } from "react-rx"; Index: package/package.json
===================================================================
--- package/package.json
+++ package/package.json
@@ -1,7 +1,7 @@
{
"name": "@sanity/studio-secrets",
- "version": "4.0.15",
+ "version": "4.0.16",
"description": "React hooks and UI for reading and managing secrets in a Sanity Studio. This is a good pattern for keeping configuration secret. Instead of using environment variables which would be bundled with the Studio source (it is an SPA), we store secret information in a separate, access-controlled dataset that is only queried at runtime.",
"keywords": [
"sanity",
"sanity-plugin"
@@ -26,9 +26,9 @@
".": "./dist/index.js",
"./package.json": "./package.json"
},
"dependencies": {
- "@sanity/ui": "^3.5.1",
+ "@sanity/ui": "^4.0.0",
"react-rx": "^4.2.5",
"rxjs": "^7.8.2"
},
"devDependencies": {
@@ -42,9 +42,9 @@
"babel-plugin-react-compiler": "^1.0.0",
"jsdom": "^29.1.1",
"react": "^19.2.8",
"react-dom": "^19.2.8",
- "sanity": "^6.7.0",
+ "sanity": "^6.9.0",
"styled-components": "^6.4.4",
"tsdown": "^0.22.14"
},
"peerDependencies": { Index: package/dist/index.d.ts.map
===================================================================
--- package/dist/index.d.ts.map
+++ package/dist/index.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.d.ts","names":[],"sources":["../src/Settings.tsx","../src/useSecrets.ts"],"mappings":";KAaY;EACV;EACA;EACA;;KAGU;EACV;EACA;EACA,MAAM;EACN;;cAGW,iBAAY,WAAA,MAAA,SAAA,SAMtB,sBAAoB;UCzBN,QAAQ;EACvB;EACA,UAAU;EACV,eAAe,SAAS;;iBAKV,WAAW,GAAG,oBAAoB,QAAQ"}
\ No newline at end of file
+{"version":3,"file":"index.d.ts","names":[],"sources":["../src/Settings.tsx","../src/useSecrets.ts"],"mappings":";;KAaY;EACV;EACA;EACA;;KAGU;EACV;EACA;EACA,MAAM;EACN;;cAGW,iBAAY,WAAA,MAAA,SAAA,SAMtB,sBAAoB;UCzBN,QAAQ;EACvB;EACA,UAAU;EACV,eAAe,SAAS;;iBAKV,WAAW,GAAG,oBAAoB,QAAQ"}
\ No newline at end of file Index: package/dist/index.js.map
===================================================================
--- package/dist/index.js.map
+++ package/dist/index.js.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.js","names":["useCallback","useMemo","useState","useObservable","map","useClient","useDocumentPreviewStore","type","Secrets","loading","secrets","T","storeSecrets","INITIAL_STATE","undefined","useSecrets","namespace","$","_c","saving","setSaving","t0","Symbol","for","apiVersion","client","documentPreviewStore","id","t1","unstable_observeDocument","pipe","_temp","secrets$","readLoading","t2","updatedSecret","keysPatch","patch","set","transaction","createIfNotExists","_id","_type","commit","visibility","tag","catch","_temp2","finally","t3","t4","doc","Record","Button","Card","Dialog","Stack","Text","TextInput","ChangeEvent","Dispatch","ReactElement","SetStateAction","useCallback","useEffect","useState","useSecrets","SettingsKey","key","title","description","SettingsViewProps","namespace","keys","onClose","SettingsView","t0","$","_c","t1","undefined","loading","secrets","storeSecrets","t2","Symbol","for","newSecrets","setNewSecrets","t3","t4","t5","onClick","t6","t7","keyEntry","map","t8","t9","t10","SettingsKeyProps","Record","SettingsKeyEntry","event","target","currentTarget","value","prevState","newState","onChange","inputId","descriptionId"],"sources":["../src/useSecrets.ts","../src/Settings.tsx"],"sourcesContent":["import {useCallback, useMemo, useState} from 'react'\nimport {useObservable} from 'react-rx'\nimport {map} from 'rxjs'\nimport {useClient, useDocumentPreviewStore} from 'sanity'\n\nconst type = 'pluginSecrets'\n\nexport interface Secrets<T> {\n loading: boolean\n secrets?: T\n storeSecrets: (secrets: T) => void\n}\n\nconst INITIAL_STATE = {loading: true, secrets: undefined}\n\nexport function useSecrets<T>(namespace: string): Secrets<T> {\n const [saving, setSaving] = useState(false)\n\n const client = useClient({apiVersion: '2021-03-01'})\n const documentPreviewStore = useDocumentPreviewStore()\n const id = `secrets.${namespace}`\n\n const secrets$ = useMemo(\n () =>\n documentPreviewStore.unstable_observeDocument(id).pipe(\n map((doc) => ({\n loading: false,\n // oxlint-disable-next-line no-unsafe-type-assertion\n secrets: (doc as Record<string, unknown> | undefined)?.['secrets'] as T | undefined,\n })),\n ),\n [id, documentPreviewStore],\n )\n\n const {loading: readLoading, secrets} = useObservable(secrets$, INITIAL_STATE)\n\n const storeSecrets = useCallback(\n (updatedSecret: T) => {\n setSaving(true)\n const keysPatch = client.patch(id).set({secrets: updatedSecret})\n void client\n .transaction()\n .createIfNotExists({_id: id, _type: type})\n .patch(keysPatch)\n .commit({visibility: 'async', tag: 'secrets.store'})\n .catch(() => {\n // Non-fatal — the listener will deliver the updated value\n })\n .finally(() => setSaving(false))\n },\n [client, id],\n )\n\n return {loading: readLoading || saving, secrets, storeSecrets}\n}\n","import {Button, Card, Dialog, Stack, Text, TextInput} from '@sanity/ui'\nimport {\n type ChangeEvent,\n type Dispatch,\n type ReactElement,\n type SetStateAction,\n useCallback,\n useEffect,\n useState,\n} from 'react'\n\nimport {useSecrets} from './useSecrets'\n\nexport type SettingsKey = {\n key: string\n title: string\n description?: string\n}\n\nexport type SettingsViewProps = {\n title: string\n namespace: string\n keys: SettingsKey[]\n onClose: () => void\n}\n\nexport const SettingsView = ({\n namespace,\n keys,\n onClose,\n // oxlint-disable-next-line no-useless-default-assignment\n title = 'Configure',\n}: SettingsViewProps): ReactElement => {\n const {loading, secrets, storeSecrets} = useSecrets<Record<string, any>>(namespace)\n const [newSecrets, setNewSecrets] = useState<Record<string, any>>({})\n\n // Sync async-loaded secrets into form state. This is a legitimate\n // useEffect for external data sync, not a cascading render issue.\n // See: https://github.com/facebook/react/issues/34743\n useEffect(() => {\n if (secrets) {\n // oxlint-disable-next-line react/react-compiler\n setNewSecrets(secrets)\n }\n }, [secrets])\n\n const onClick = useCallback(() => storeSecrets(newSecrets), [storeSecrets, newSecrets])\n\n return (\n <Dialog animate id=\"studio-secrets-settings\" onClose={onClose} header={title}>\n <Card padding={3}>\n <Stack gap={3}>\n {keys.map((keyEntry) => (\n <SettingsKeyEntry\n key={keyEntry.key}\n keyEntry={keyEntry}\n loading={loading}\n newSecrets={newSecrets}\n setNewSecrets={setNewSecrets}\n />\n ))}\n <Button\n disabled={loading}\n onClick={onClick}\n text={loading ? 'Loading…' : 'Save'}\n tone=\"positive\"\n />\n </Stack>\n </Card>\n </Dialog>\n )\n}\n\ninterface SettingsKeyProps {\n loading: boolean\n newSecrets: Record<string, any>\n setNewSecrets: Dispatch<SetStateAction<Record<string, any>>>\n keyEntry: SettingsKey\n}\n\nfunction SettingsKeyEntry({loading, setNewSecrets, newSecrets, keyEntry}: SettingsKeyProps) {\n const onChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const target = event.currentTarget\n const {value} = target\n setNewSecrets((prevState) => {\n const newState = {...prevState}\n newState[keyEntry.key] = value\n return newState\n })\n },\n [keyEntry, setNewSecrets],\n )\n\n const inputId = `studio-secrets-${keyEntry.key}`\n const descriptionId = `${inputId}-description`\n\n return (\n <Stack gap={2}>\n <Text as=\"label\" htmlFor={inputId} weight=\"semibold\" size={1}>\n {keyEntry.title}\n </Text>\n {keyEntry.description && (\n <Text id={descriptionId} muted size={1}>\n {keyEntry.description}\n </Text>\n )}\n <TextInput\n disabled={loading}\n id={inputId}\n aria-describedby={keyEntry.description ? descriptionId : undefined}\n onChange={onChange}\n value={newSecrets[keyEntry.key] ?? ''}\n />\n </Stack>\n )\n}\n"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["useCallback","useMemo","useState","useObservable","map","useClient","useDocumentPreviewStore","type","Secrets","loading","secrets","T","storeSecrets","INITIAL_STATE","undefined","useSecrets","namespace","$","_c","saving","setSaving","t0","Symbol","for","apiVersion","client","documentPreviewStore","id","t1","unstable_observeDocument","pipe","_temp","secrets$","readLoading","t2","updatedSecret","keysPatch","patch","set","transaction","createIfNotExists","_id","_type","commit","visibility","tag","catch","_temp2","finally","t3","t4","doc","Record","Button","Card","Dialog","Stack","Text","TextInput","ChangeEvent","Dispatch","ReactElement","SetStateAction","useCallback","useEffect","useState","useSecrets","SettingsKey","key","title","description","SettingsViewProps","namespace","keys","onClose","SettingsView","t0","$","_c","t1","undefined","loading","secrets","storeSecrets","t2","Symbol","for","newSecrets","setNewSecrets","t3","t4","t5","onClick","t6","t7","keyEntry","map","t8","t9","t10","SettingsKeyProps","Record","SettingsKeyEntry","event","target","currentTarget","value","prevState","newState","onChange","inputId","descriptionId"],"sources":["../src/useSecrets.ts","../src/Settings.tsx"],"sourcesContent":["import {useCallback, useMemo, useState} from 'react'\nimport {useObservable} from 'react-rx'\nimport {map} from 'rxjs'\nimport {useClient, useDocumentPreviewStore} from 'sanity'\n\nconst type = 'pluginSecrets'\n\nexport interface Secrets<T> {\n loading: boolean\n secrets?: T\n storeSecrets: (secrets: T) => void\n}\n\nconst INITIAL_STATE = {loading: true, secrets: undefined}\n\nexport function useSecrets<T>(namespace: string): Secrets<T> {\n const [saving, setSaving] = useState(false)\n\n const client = useClient({apiVersion: '2021-03-01'})\n const documentPreviewStore = useDocumentPreviewStore()\n const id = `secrets.${namespace}`\n\n const secrets$ = useMemo(\n () =>\n documentPreviewStore.unstable_observeDocument(id).pipe(\n map((doc) => ({\n loading: false,\n // oxlint-disable-next-line no-unsafe-type-assertion\n secrets: (doc as Record<string, unknown> | undefined)?.['secrets'] as T | undefined,\n })),\n ),\n [id, documentPreviewStore],\n )\n\n const {loading: readLoading, secrets} = useObservable(secrets$, INITIAL_STATE)\n\n const storeSecrets = useCallback(\n (updatedSecret: T) => {\n setSaving(true)\n const keysPatch = client.patch(id).set({secrets: updatedSecret})\n void client\n .transaction()\n .createIfNotExists({_id: id, _type: type})\n .patch(keysPatch)\n .commit({visibility: 'async', tag: 'secrets.store'})\n .catch(() => {\n // Non-fatal — the listener will deliver the updated value\n })\n .finally(() => setSaving(false))\n },\n [client, id],\n )\n\n return {loading: readLoading || saving, secrets, storeSecrets}\n}\n","import {Button, Card, Dialog, Stack, Text, TextInput} from '@sanity/ui'\nimport {\n type ChangeEvent,\n type Dispatch,\n type ReactElement,\n type SetStateAction,\n useCallback,\n useEffect,\n useState,\n} from 'react'\n\nimport {useSecrets} from './useSecrets'\n\nexport type SettingsKey = {\n key: string\n title: string\n description?: string\n}\n\nexport type SettingsViewProps = {\n title: string\n namespace: string\n keys: SettingsKey[]\n onClose: () => void\n}\n\nexport const SettingsView = ({\n namespace,\n keys,\n onClose,\n // oxlint-disable-next-line no-useless-default-assignment\n title = 'Configure',\n}: SettingsViewProps): ReactElement => {\n const {loading, secrets, storeSecrets} = useSecrets<Record<string, any>>(namespace)\n const [newSecrets, setNewSecrets] = useState<Record<string, any>>({})\n\n // Sync async-loaded secrets into form state. This is a legitimate\n // useEffect for external data sync, not a cascading render issue.\n // See: https://github.com/facebook/react/issues/34743\n useEffect(() => {\n if (secrets) {\n // oxlint-disable-next-line react/react-compiler\n setNewSecrets(secrets)\n }\n }, [secrets])\n\n const onClick = useCallback(() => storeSecrets(newSecrets), [storeSecrets, newSecrets])\n\n return (\n <Dialog animate id=\"studio-secrets-settings\" onClose={onClose} header={title}>\n <Card padding={3}>\n <Stack gap={3}>\n {keys.map((keyEntry) => (\n <SettingsKeyEntry\n key={keyEntry.key}\n keyEntry={keyEntry}\n loading={loading}\n newSecrets={newSecrets}\n setNewSecrets={setNewSecrets}\n />\n ))}\n <Button\n disabled={loading}\n onClick={onClick}\n text={loading ? 'Loading…' : 'Save'}\n tone=\"positive\"\n />\n </Stack>\n </Card>\n </Dialog>\n )\n}\n\ninterface SettingsKeyProps {\n loading: boolean\n newSecrets: Record<string, any>\n setNewSecrets: Dispatch<SetStateAction<Record<string, any>>>\n keyEntry: SettingsKey\n}\n\nfunction SettingsKeyEntry({loading, setNewSecrets, newSecrets, keyEntry}: SettingsKeyProps) {\n const onChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const target = event.currentTarget\n const {value} = target\n setNewSecrets((prevState) => {\n const newState = {...prevState}\n newState[keyEntry.key] = value\n return newState\n })\n },\n [keyEntry, setNewSecrets],\n )\n\n const inputId = `studio-secrets-${keyEntry.key}`\n const descriptionId = `${inputId}-description`\n\n return (\n <Stack gap={2}>\n <Text as=\"label\" htmlFor={inputId} weight=\"semibold\" size={1}>\n {keyEntry.title}\n </Text>\n {keyEntry.description && (\n <Text id={descriptionId} muted size={1}>\n {keyEntry.description}\n </Text>\n )}\n <TextInput\n disabled={loading}\n id={inputId}\n aria-describedby={keyEntry.description ? descriptionId : undefined}\n onChange={onChange}\n value={newSecrets[keyEntry.key] ?? ''}\n />\n </Stack>\n )\n}\n"],"mappings":"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"}
\ No newline at end of file Index: package/dist/index.d.ts
===================================================================
--- package/dist/index.d.ts
+++ package/dist/index.d.ts
@@ -1,4 +1,5 @@
+import "@sanity/ui/styles.css";
import { ReactElement } from "react";
type SettingsKey = {
key: string;
title: string;