@sanity/workflow-studio 0.6.0 → 0.7.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/dist/index.d.ts CHANGED
@@ -1,13 +1,15 @@
1
1
  import { DatasetResourceId } from "@sanity/workflow-react/observer";
2
2
  import type { DocumentStore } from "sanity";
3
+ import { EffectHandler } from "@sanity/workflow-engine";
3
4
  import { Engine } from "@sanity/workflow-engine";
4
5
  import type { GdrUri } from "@sanity/workflow-engine";
5
6
  import type { InstancesQueryFilter } from "@sanity/workflow-engine";
7
+ import { MissingHandlerPolicy } from "@sanity/workflow-engine";
6
8
  import { MutationGuardDoc } from "@sanity/workflow-react";
7
9
  import { ResourceClientResolver } from "@sanity/workflow-engine";
8
- import type { SanityInstance } from "@sanity/sdk";
10
+ import type { SanityClient } from "sanity";
11
+ import { SanityInstance } from "@sanity/sdk";
9
12
  import { useClient } from "sanity";
10
- import type { WorkflowAccessOverride } from "@sanity/workflow-engine";
11
13
  import { WorkflowInstanceList } from "@sanity/workflow-react";
12
14
  import { WorkflowObserver } from "@sanity/workflow-react/observer";
13
15
  import { WorkflowResource } from "@sanity/workflow-engine";
@@ -40,6 +42,9 @@ export declare interface StudioObserverOptions {
40
42
  /** The workspace's project + dataset — the only resource Studio's
41
43
  * `documentStore` can address. */
42
44
  mounted: DatasetResourceId;
45
+ /** A workspace-bound client — carries `ensureDocumentExists` writes, which
46
+ * address the mounted dataset (where the workspace's subject docs live). */
47
+ client: SanityClient;
43
48
  /** The engine's state dataset (`datasetResourceId(engine.workflowResource)`)
44
49
  * — where the instance doc and its verdict-relevant guards live. Routinely
45
50
  * a dedicated `workflows` dataset distinct from the workspace. */
@@ -54,9 +59,11 @@ export declare interface StudioObserverOptions {
54
59
  /**
55
60
  * The default Studio {@link ResourceClientResolver}: any fully-addressed
56
61
  * `dataset:` GDR resolves to the workspace client rebound to that
57
- * project/dataset; other schemes (media-library, canvas) return `undefined` so
58
- * the engine falls back to its own client. A custom resolver can delegate to
59
- * this for the dataset arm and handle other schemes itself.
62
+ * project/dataset; other schemes (media-library, canvas) return `undefined`,
63
+ * letting the engine route them a sibling client derived from the engine
64
+ * client's own credentials for foreign resources, its own client for the
65
+ * workflow resource. A custom resolver can delegate to this for the dataset
66
+ * arm and handle other schemes itself.
60
67
  */
61
68
  export declare function studioResourceClients(
62
69
  client: StudioClient,
@@ -75,26 +82,46 @@ export declare function useDocumentWorkflows({
75
82
  sdk?: SanityInstance;
76
83
  }): WorkflowInstanceList;
77
84
 
85
+ /**
86
+ * The Studio observer for this engine — the shared wiring under every
87
+ * reactive hook in this package. Workspace-dataset streams ride
88
+ * `documentStore`; anything foreign (routinely the engine's dedicated
89
+ * `workflows` dataset) rides an App SDK instance, bootstrapped from the
90
+ * Studio session when the caller doesn't supply one. Must run inside Studio
91
+ * source context (so `useDocumentStore`/`useSource` resolve).
92
+ */
93
+ export declare function useStudioObserver({
94
+ engine,
95
+ sdk: suppliedSdk,
96
+ }: {
97
+ engine: Engine;
98
+ sdk?: SanityInstance | undefined;
99
+ }): WorkflowObserver;
100
+
78
101
  /**
79
102
  * Build the Studio-side engine once: the workspace client rebound to the
80
103
  * engine's state dataset, plus {@link studioResourceClients} as the default
81
104
  * per-resource routing — so subjects and refs across many content datasets
82
105
  * resolve without call sites assembling clients. Pass `resourceClients` to
83
106
  * override the routing (compose with {@link studioResourceClients} to keep
84
- * dataset-GDR routing). Memoized on the config's content, so inline
85
- * `workflowResource` literals are fine; a custom `resourceClients` function
86
- * should still be stable. Must render inside Studio source context.
107
+ * dataset-GDR routing). `effectHandlers`/`missingHandler` feed
108
+ * {@link Engine.drainEffects} for engines that drain effects in the Studio.
109
+ * Memoized on the config's content, so inline `workflowResource` literals are
110
+ * fine; custom `resourceClients` and `effectHandlers` values should still be
111
+ * stable. Must render inside Studio source context.
87
112
  */
88
113
  export declare function useWorkflowEngine({
89
114
  workflowResource,
90
115
  tag,
91
116
  resourceClients,
92
- apiVersion,
117
+ effectHandlers,
118
+ missingHandler,
93
119
  }: {
94
120
  workflowResource: WorkflowResource;
95
121
  tag: string;
96
122
  resourceClients?: ResourceClientResolver;
97
- apiVersion?: string;
123
+ effectHandlers?: Record<string, EffectHandler>;
124
+ missingHandler?: MissingHandlerPolicy;
98
125
  }): Engine;
99
126
 
100
127
  /** A live, filterable workflow-instance list observed from Sanity Studio —
@@ -120,19 +147,18 @@ export declare function useWorkflowInstances({
120
147
  * from the workspace, an SDK instance is bootstrapped automatically from the
121
148
  * Studio session (pass `sdk` to supply your own — required for
122
149
  * cookie-authenticated studios, where no session token is readable). Returns
123
- * `{evaluation, ready, guards, tick, fireAction, editField}`; the consumer decides when
124
- * to advance. Must render inside Studio source context.
150
+ * the full {@link WorkflowSession} (evaluation, ready, guards, and the
151
+ * tick/fireAction/editField/preview verbs); the consumer decides when to
152
+ * advance. Must render inside Studio source context.
125
153
  */
126
154
  export declare function useWorkflowSession({
127
155
  engine,
128
156
  instanceId,
129
- access,
130
157
  grantsFromPath,
131
158
  sdk,
132
159
  }: {
133
160
  engine: Engine;
134
161
  instanceId: string;
135
- access?: WorkflowAccessOverride;
136
162
  grantsFromPath?: string;
137
163
  sdk?: SanityInstance;
138
164
  }): WorkflowSession;
package/dist/index.js CHANGED
@@ -1,218 +1,254 @@
1
- import { instanceGuardQuery, contentReleaseName, WORKFLOW_INSTANCE_TYPE, ENGINE_API_VERSION, createEngine } from "@sanity/workflow-engine";
2
- import { sameDataset, combineGuardStores, combineDocStores, classifyRef, useKeyed, datasetResourceId } from "@sanity/workflow-react/observer";
1
+ import { instanceGuardQuery, contentReleaseName, WORKFLOW_INSTANCE_TYPE, ENGINE_API_VERSION, createEngine, EXECUTION_KINDS } from "@sanity/workflow-engine";
2
+
3
+ import { sameDataset, ensureDocumentExists, combineGuardStores, combineDocStores, classifyRef, datasetResourceId, useKeyed } from "@sanity/workflow-react/observer";
4
+
3
5
  import { sdkInstancesStore, sdkGuardStore, sdkContentDocStore, sdkInstanceDocStore } from "@sanity/workflow-sdk/observer";
4
- import { useMemo, useRef, useEffect } from "react";
5
- import { useClient, useDocumentStore, useSource } from "sanity";
6
- import { useWorkflowSession as useWorkflowSession$1, useDocumentWorkflows as useDocumentWorkflows$1, useWorkflowInstances as useWorkflowInstances$1 } from "@sanity/workflow-react";
6
+
7
7
  import { createSanityInstance } from "@sanity/sdk";
8
- function observableStore({
9
- observable,
10
- resolve,
11
- initial
12
- }) {
13
- let latest = initial;
14
- return {
15
- subscribe(onChange) {
16
- const subscription = observable.subscribe((value) => {
17
- latest = resolve(value), onChange();
18
- });
19
- return () => subscription.unsubscribe();
20
- },
21
- getSnapshot: () => latest
22
- };
8
+
9
+ import { useMemo, useRef, useEffect } from "react";
10
+
11
+ import { useDocumentStore, useSource, useClient } from "sanity";
12
+
13
+ import { useWorkflowTelemetry, useWorkflowSession as useWorkflowSession$1, useDocumentWorkflows as useDocumentWorkflows$1, useWorkflowInstances as useWorkflowInstances$1 } from "@sanity/workflow-react";
14
+
15
+ const RESUBSCRIBE_DELAY_MS = 5e3;
16
+
17
+ function observableStore({observable: observable, resolve: resolve, initial: initial, name: name}) {
18
+ let latest = initial;
19
+ return {
20
+ subscribe(onChange) {
21
+ let subscription, retry, stopped = !1;
22
+ const connect = () => {
23
+ subscription = observable.subscribe({
24
+ next: value => {
25
+ latest = resolve(value), onChange();
26
+ },
27
+ error: err => {
28
+ console.error(`[workflow-studio] ${name} stream errored — resubscribing in ${RESUBSCRIBE_DELAY_MS / 1e3}s:`, err),
29
+ stopped || (retry = setTimeout(connect, RESUBSCRIBE_DELAY_MS));
30
+ }
31
+ });
32
+ };
33
+ return connect(), () => {
34
+ stopped = !0, retry !== void 0 && clearTimeout(retry), subscription?.unsubscribe();
35
+ };
36
+ },
37
+ getSnapshot: () => latest
38
+ };
23
39
  }
40
+
24
41
  function makeStudioObserver(documentStore, options) {
25
- const { mounted, engineResource, sdk } = options, engineIsMounted = sameDataset(engineResource, mounted), editStateStore = ({
26
- id,
27
- type,
28
- release
29
- }) => observableStore({
30
- observable: documentStore.pair.editState(id, type, release),
31
- resolve: resolveEditState,
32
- initial: void 0
33
- }), requireSdk = (what) => {
34
- if (sdk !== void 0) return sdk;
35
- throw new Error(
36
- `@sanity/workflow-studio: ${what} \u2014 Studio's document store is bound to ${mounted.projectId}.${mounted.dataset} and cannot observe it. Pass an App SDK instance via the hook's \`sdk\` option (e.g. \`useWorkflowSession({engine, instanceId, sdk})\`) to observe foreign resources.`
37
- );
38
- };
39
- return {
40
- observeInstance: (instanceId) => engineIsMounted ? editStateStore({ id: instanceId, type: WORKFLOW_INSTANCE_TYPE, release: void 0 }) : sdkInstanceDocStore({
41
- sdk: requireSdk(
42
- `instance "${instanceId}" lives in the engine dataset ${engineResource.projectId}.${engineResource.dataset}`
43
- ),
44
- instanceId,
45
- engineResource
46
- }),
47
- observeDocs: (documents, perspective) => combineDocStores(
48
- documents.map((ref) => classifyRef(ref, mounted) === "mounted-dataset" ? {
49
- key: ref.globalDocumentId,
50
- store: editStateStore({
51
- id: ref.documentId,
52
- type: ref.type,
53
- release: contentReleaseName({ ref, perspective })
54
- })
55
- } : {
56
- key: ref.globalDocumentId,
57
- store: sdkContentDocStore({
58
- sdk: requireSdk(`"${ref.globalDocumentId}" lives outside this workspace`),
59
- ref,
60
- perspective
61
- })
62
- })
63
- ),
64
- observeGuards: (instanceId, resources) => combineGuardStores(
65
- resources.map((resource) => {
66
- if (sameDataset(resource, mounted)) {
67
- const { query, params } = instanceGuardQuery(instanceId);
68
- return observableStore({
69
- observable: documentStore.listenQuery(query, params, {}),
70
- resolve: (docs) => docs,
71
- initial: void 0
72
- });
73
- }
74
- return sdkGuardStore({
75
- sdk: requireSdk(
76
- `guards for "${instanceId}" live in ${resource.projectId}.${resource.dataset}`
77
- ),
78
- instanceId,
79
- resource
80
- });
81
- })
82
- ),
83
- observeInstances: (query) => engineIsMounted ? observableStore({
84
- observable: documentStore.listenQuery(query.query, query.params, {}),
85
- resolve: (docs) => docs,
86
- initial: void 0
87
- }) : sdkInstancesStore({
88
- sdk: requireSdk(
89
- `the instance list lives in the engine dataset ${engineResource.projectId}.${engineResource.dataset}`
90
- ),
91
- query,
92
- resource: engineResource
93
- })
94
- };
42
+ const {mounted: mounted, engineResource: engineResource, sdk: sdk, client: client} = options, engineIsMounted = sameDataset(engineResource, mounted), editStateStore = ({id: id, type: type, release: release}) => observableStore({
43
+ observable: documentStore.pair.editState(id, type, release),
44
+ resolve: resolveEditState,
45
+ initial: void 0,
46
+ name: `the edit state of "${id}"`
47
+ }), requireSdk = what => {
48
+ if (sdk !== void 0) return sdk;
49
+ throw new Error(`@sanity/workflow-studio: ${what} — Studio's document store is bound to ${mounted.projectId}.${mounted.dataset} and cannot observe it. Pass an App SDK instance via the hook's \`sdk\` option (e.g. \`useWorkflowSession({engine, instanceId, sdk})\`) to observe foreign resources.`);
50
+ };
51
+ return {
52
+ observeInstance: instanceId => engineIsMounted ? editStateStore({
53
+ id: instanceId,
54
+ type: WORKFLOW_INSTANCE_TYPE,
55
+ release: void 0
56
+ }) : sdkInstanceDocStore({
57
+ sdk: requireSdk(`instance "${instanceId}" lives in the engine dataset ${engineResource.projectId}.${engineResource.dataset}`),
58
+ instanceId: instanceId,
59
+ engineResource: engineResource
60
+ }),
61
+ observeDocs: (documents, perspective) => combineDocStores(documents.map(ref => classifyRef(ref, mounted) === "mounted-dataset" ? {
62
+ key: ref.globalDocumentId,
63
+ store: editStateStore({
64
+ id: ref.documentId,
65
+ type: ref.type,
66
+ release: contentReleaseName({
67
+ ref: ref,
68
+ perspective: perspective
69
+ })
70
+ })
71
+ } : {
72
+ key: ref.globalDocumentId,
73
+ store: sdkContentDocStore({
74
+ sdk: requireSdk(`"${ref.globalDocumentId}" lives outside this workspace`),
75
+ ref: ref,
76
+ perspective: perspective
77
+ })
78
+ })),
79
+ observeGuards: (instanceId, resources) => combineGuardStores(resources.map(resource => {
80
+ if (sameDataset(resource, mounted)) {
81
+ const {query: query, params: params} = instanceGuardQuery(instanceId);
82
+ return observableStore({
83
+ observable: documentStore.listenQuery(query, params, {}),
84
+ resolve: docs => docs,
85
+ initial: void 0,
86
+ name: `the guard list for "${instanceId}"`
87
+ });
88
+ }
89
+ return sdkGuardStore({
90
+ sdk: requireSdk(`guards for "${instanceId}" live in ${resource.projectId}.${resource.dataset}`),
91
+ instanceId: instanceId,
92
+ resource: resource
93
+ });
94
+ })),
95
+ observeInstances: query => engineIsMounted ? observableStore({
96
+ observable: documentStore.listenQuery(query.query, query.params, {}),
97
+ resolve: docs => docs,
98
+ initial: void 0,
99
+ name: "the instance list"
100
+ }) : sdkInstancesStore({
101
+ sdk: requireSdk(`the instance list lives in the engine dataset ${engineResource.projectId}.${engineResource.dataset}`),
102
+ query: query,
103
+ resource: engineResource
104
+ }),
105
+ ensureDocumentExists: args => ensureDocumentExists(client, args)
106
+ };
95
107
  }
108
+
96
109
  function resolveEditState(editState) {
97
- if (editState.ready)
98
- return editState.version ?? editState.draft ?? editState.published;
110
+ if (editState.ready) return editState.version ?? editState.draft ?? editState.published;
99
111
  }
100
- function useWorkflowEngine({
101
- workflowResource,
102
- tag,
103
- resourceClients,
104
- apiVersion
105
- }) {
106
- const client = useClient({ apiVersion: apiVersion ?? ENGINE_API_VERSION }), resource = useKeyed([workflowResource.type, workflowResource.id], () => workflowResource);
107
- return useMemo(() => {
108
- const engineDataset = datasetResourceId(resource), engineClient = client.withConfig({
109
- projectId: engineDataset.projectId,
110
- dataset: engineDataset.dataset,
111
- useCdn: !1
112
- });
113
- return createEngine({
114
- client: engineClient,
115
- workflowResource: resource,
116
- tag,
117
- resourceClients: resourceClients ?? studioResourceClients(client)
112
+
113
+ const SESSION_CLIENT_OPTIONS = {
114
+ apiVersion: ENGINE_API_VERSION
115
+ };
116
+
117
+ function useStudioObserver({engine: engine, sdk: suppliedSdk}) {
118
+ const documentStore = useDocumentStore(), source = useSource(), {projectId: projectId, dataset: dataset} = source, mounted = useMemo(() => ({
119
+ projectId: projectId,
120
+ dataset: dataset
121
+ }), [ projectId, dataset ]), engineResource = useMemo(() => datasetResourceId(engine.workflowResource), [ engine ]), sdk = useEmbeddedSdk({
122
+ supplied: suppliedSdk,
123
+ needed: !sameDataset(engineResource, mounted),
124
+ mounted: mounted,
125
+ sessionToken: source.getClient(SESSION_CLIENT_OPTIONS).config().token
118
126
  });
119
- }, [client, resource, tag, resourceClients]);
127
+ return useMemo(() => makeStudioObserver(documentStore, {
128
+ mounted: mounted,
129
+ client: source.getClient(SESSION_CLIENT_OPTIONS),
130
+ engineResource: engineResource,
131
+ ...sdk !== void 0 ? {
132
+ sdk: sdk
133
+ } : {}
134
+ }), [ documentStore, source, mounted, engineResource, sdk ]);
120
135
  }
121
- function studioResourceClients(client) {
122
- return (parsed) => parsed.scheme === "dataset" && parsed.projectId !== void 0 && parsed.dataset !== void 0 ? client.withConfig({ projectId: parsed.projectId, dataset: parsed.dataset, useCdn: !1 }) : void 0;
123
- }
124
- const SESSION_CLIENT_OPTIONS = { apiVersion: ENGINE_API_VERSION };
125
- function useStudioObserver({
126
- engine,
127
- sdk: suppliedSdk
128
- }) {
129
- const documentStore = useDocumentStore(), source = useSource(), { projectId, dataset } = source, mounted = useMemo(() => ({ projectId, dataset }), [projectId, dataset]), engineResource = useMemo(() => datasetResourceId(engine.workflowResource), [engine]), sdk = useEmbeddedSdk({
130
- supplied: suppliedSdk,
131
- // The engine dataset being foreign is the signal an SDK instance is
132
- // needed; foreign content refs without one still fail loud per ref.
133
- needed: !sameDataset(engineResource, mounted),
134
- mounted,
135
- // The session's token rides the source client's config (absent under
136
- // cookie auth) — the public read; Studio's token storage is private.
137
- sessionToken: source.getClient(SESSION_CLIENT_OPTIONS).config().token
138
- });
139
- return useMemo(
140
- () => makeStudioObserver(documentStore, {
141
- mounted,
142
- engineResource,
143
- ...sdk !== void 0 ? { sdk } : {}
144
- }),
145
- [documentStore, mounted, engineResource, sdk]
146
- );
147
- }
148
- function useEmbeddedSdk({
149
- supplied,
150
- needed,
151
- mounted,
152
- sessionToken
153
- }) {
154
- const wanted = supplied === void 0 && needed, held = useRef(void 0), key = `${mounted.projectId}.${mounted.dataset}`;
155
- wanted && (held.current?.key !== key || held.current.instance.isDisposed()) && (held.current = { key, instance: bootstrapInstance(mounted, sessionToken) });
156
- const embedded = wanted ? held.current?.instance : void 0;
157
- return useDeferredDispose(embedded), supplied ?? embedded;
136
+
137
+ function useEmbeddedSdk({supplied: supplied, needed: needed, mounted: mounted, sessionToken: sessionToken}) {
138
+ const wanted = supplied === void 0 && needed, held = useRef(void 0), key = `${mounted.projectId}.${mounted.dataset}`;
139
+ wanted && (held.current?.key !== key || held.current.instance.isDisposed()) && (held.current = {
140
+ key: key,
141
+ instance: bootstrapInstance(mounted, sessionToken)
142
+ });
143
+ const embedded = wanted ? held.current?.instance : void 0;
144
+ return useDeferredDispose(embedded), supplied ?? embedded;
158
145
  }
146
+
159
147
  function bootstrapInstance(mounted, sessionToken) {
160
- if (sessionToken === void 0)
161
- throw new Error(
162
- "@sanity/workflow-studio: the engine's state dataset is not this workspace's dataset, and no Studio session token is readable to bootstrap an App SDK instance (cookie-authenticated studio?). Pass one explicitly via the hook's `sdk` option, e.g. useWorkflowSession({engine, instanceId, sdk})."
163
- );
164
- return createSanityInstance({
165
- projectId: mounted.projectId,
166
- dataset: mounted.dataset,
167
- auth: { token: sessionToken }
168
- });
148
+ if (sessionToken === void 0) throw new Error("@sanity/workflow-studio: the engine's state dataset is not this workspace's dataset, and no Studio session token is readable to bootstrap an App SDK instance (cookie-authenticated studio?). Pass one explicitly via the hook's `sdk` option, e.g. useWorkflowSession({engine, instanceId, sdk}).");
149
+ return createSanityInstance({
150
+ projectId: mounted.projectId,
151
+ dataset: mounted.dataset,
152
+ auth: {
153
+ token: sessionToken
154
+ }
155
+ });
169
156
  }
157
+
170
158
  function useDeferredDispose(instance) {
171
- const disposal = useRef(void 0);
172
- useEffect(() => {
173
- if (instance !== void 0)
174
- return disposal.current?.instance === instance && (clearTimeout(disposal.current.timeoutId), disposal.current = void 0), () => {
175
- disposal.current = {
176
- instance,
177
- timeoutId: setTimeout(() => {
178
- instance.isDisposed() || instance.dispose();
179
- }, 0)
159
+ const disposal = useRef(void 0);
160
+ useEffect(() => {
161
+ if (instance !== void 0) return disposal.current?.instance === instance && (clearTimeout(disposal.current.timeoutId),
162
+ disposal.current = void 0), () => {
163
+ disposal.current = {
164
+ instance: instance,
165
+ timeoutId: setTimeout(() => {
166
+ instance.isDisposed() || instance.dispose();
167
+ }, 0)
168
+ };
180
169
  };
181
- };
182
- }, [instance]);
170
+ }, [ instance ]);
183
171
  }
184
- function useWorkflowSession({
185
- engine,
186
- instanceId,
187
- access,
188
- grantsFromPath,
189
- sdk
190
- }) {
191
- const observer = useStudioObserver({ engine, sdk });
192
- return useWorkflowSession$1({ engine, instanceId, observer, opts: { access, grantsFromPath } });
172
+
173
+ function useWorkflowEngine({workflowResource: workflowResource, tag: tag, resourceClients: resourceClients, effectHandlers: effectHandlers, missingHandler: missingHandler}) {
174
+ const client = useClient({
175
+ apiVersion: ENGINE_API_VERSION
176
+ }), resource = useKeyed([ workflowResource.type, workflowResource.id ], () => workflowResource), telemetry = useWorkflowTelemetry();
177
+ return useMemo(() => {
178
+ const engineDataset = datasetResourceId(resource), engineClient = client.withConfig({
179
+ projectId: engineDataset.projectId,
180
+ dataset: engineDataset.dataset,
181
+ useCdn: !1,
182
+ requestTagPrefix: "sanity.workflows.studio"
183
+ });
184
+ return createEngine({
185
+ client: engineClient,
186
+ workflowResource: resource,
187
+ tag: tag,
188
+ resourceClients: resourceClients ?? studioResourceClients(client),
189
+ executionContext: {
190
+ kind: EXECUTION_KINDS.studio
191
+ },
192
+ ...effectHandlers !== void 0 ? {
193
+ effectHandlers: effectHandlers
194
+ } : {},
195
+ ...missingHandler !== void 0 ? {
196
+ missingHandler: missingHandler
197
+ } : {},
198
+ telemetry: telemetry
199
+ });
200
+ }, [ client, resource, tag, resourceClients, effectHandlers, missingHandler, telemetry ]);
193
201
  }
194
- function useWorkflowInstances({
195
- engine,
196
- filter,
197
- sdk
198
- }) {
199
- const observer = useStudioObserver({ engine, sdk });
200
- return useWorkflowInstances$1({ engine, observer, ...filter !== void 0 ? { filter } : {} });
202
+
203
+ function studioResourceClients(client) {
204
+ return parsed => parsed.scheme === "dataset" && parsed.projectId !== void 0 && parsed.dataset !== void 0 ? client.withConfig({
205
+ projectId: parsed.projectId,
206
+ dataset: parsed.dataset,
207
+ useCdn: !1,
208
+ requestTagPrefix: "sanity.workflows.studio"
209
+ }) : void 0;
201
210
  }
202
- function useDocumentWorkflows({
203
- engine,
204
- document,
205
- sdk
206
- }) {
207
- const observer = useStudioObserver({ engine, sdk });
208
- return useDocumentWorkflows$1({ engine, observer, document });
211
+
212
+ function useWorkflowSession({engine: engine, instanceId: instanceId, grantsFromPath: grantsFromPath, sdk: sdk}) {
213
+ const observer = useStudioObserver({
214
+ engine: engine,
215
+ sdk: sdk
216
+ });
217
+ return useWorkflowSession$1({
218
+ engine: engine,
219
+ instanceId: instanceId,
220
+ observer: observer,
221
+ host: "studio",
222
+ opts: {
223
+ grantsFromPath: grantsFromPath
224
+ }
225
+ });
209
226
  }
210
- export {
211
- makeStudioObserver,
212
- studioResourceClients,
213
- useDocumentWorkflows,
214
- useWorkflowEngine,
215
- useWorkflowInstances,
216
- useWorkflowSession
217
- };
218
- //# sourceMappingURL=index.js.map
227
+
228
+ function useWorkflowInstances({engine: engine, filter: filter, sdk: sdk}) {
229
+ const observer = useStudioObserver({
230
+ engine: engine,
231
+ sdk: sdk
232
+ });
233
+ return useWorkflowInstances$1({
234
+ engine: engine,
235
+ observer: observer,
236
+ ...filter !== void 0 ? {
237
+ filter: filter
238
+ } : {}
239
+ });
240
+ }
241
+
242
+ function useDocumentWorkflows({engine: engine, document: document, sdk: sdk}) {
243
+ const observer = useStudioObserver({
244
+ engine: engine,
245
+ sdk: sdk
246
+ });
247
+ return useDocumentWorkflows$1({
248
+ engine: engine,
249
+ observer: observer,
250
+ document: document
251
+ });
252
+ }
253
+
254
+ export { makeStudioObserver, studioResourceClients, useDocumentWorkflows, useStudioObserver, useWorkflowEngine, useWorkflowInstances, useWorkflowSession };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sanity/workflow-studio",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "React adapter that drives the @sanity/workflow-engine reactive session from the Sanity Studio document store.",
5
5
  "keywords": [
6
6
  "sanity",
@@ -21,7 +21,8 @@
21
21
  "directory": "packages/workflow-studio"
22
22
  },
23
23
  "files": [
24
- "dist"
24
+ "dist",
25
+ "CHANGELOG.md"
25
26
  ],
26
27
  "type": "module",
27
28
  "sideEffects": false,
@@ -37,12 +38,12 @@
37
38
  "./package.json": "./package.json"
38
39
  },
39
40
  "publishConfig": {
40
- "access": "restricted"
41
+ "access": "public"
41
42
  },
42
43
  "dependencies": {
43
- "@sanity/workflow-engine": "0.14.0",
44
- "@sanity/workflow-react": "0.9.0",
45
- "@sanity/workflow-sdk": "0.6.0"
44
+ "@sanity/workflow-engine": "0.15.0",
45
+ "@sanity/workflow-react": "0.10.0",
46
+ "@sanity/workflow-sdk": "0.7.0"
46
47
  },
47
48
  "devDependencies": {
48
49
  "@sanity/pkg-utils": "^10.5.2",