@sanity/workflow-studio 0.6.0 → 0.7.1

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,261 @@
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, contentDraftFallback, 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, draftFallback: draftFallback}) => observableStore({
43
+ observable: documentStore.pair.editState(id, type, release),
44
+ resolve: editState => resolveEditState(editState, draftFallback),
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
+ draftFallback: !0
57
+ }) : sdkInstanceDocStore({
58
+ sdk: requireSdk(`instance "${instanceId}" lives in the engine dataset ${engineResource.projectId}.${engineResource.dataset}`),
59
+ instanceId: instanceId,
60
+ engineResource: engineResource
61
+ }),
62
+ observeDocs: (documents, perspective) => combineDocStores(documents.map(ref => classifyRef(ref, mounted) === "mounted-dataset" ? {
63
+ key: ref.globalDocumentId,
64
+ store: editStateStore({
65
+ id: ref.documentId,
66
+ type: ref.type,
67
+ release: contentReleaseName({
68
+ ref: ref,
69
+ perspective: perspective
70
+ }),
71
+ draftFallback: contentDraftFallback({
72
+ ref: ref,
73
+ perspective: perspective
74
+ })
75
+ })
76
+ } : {
77
+ key: ref.globalDocumentId,
78
+ store: sdkContentDocStore({
79
+ sdk: requireSdk(`"${ref.globalDocumentId}" lives outside this workspace`),
80
+ ref: ref,
81
+ perspective: perspective
82
+ })
83
+ })),
84
+ observeGuards: (instanceId, resources) => combineGuardStores(resources.map(resource => {
85
+ if (sameDataset(resource, mounted)) {
86
+ const {query: query, params: params} = instanceGuardQuery(instanceId);
87
+ return observableStore({
88
+ observable: documentStore.listenQuery(query, params, {}),
89
+ resolve: docs => docs,
90
+ initial: void 0,
91
+ name: `the guard list for "${instanceId}"`
92
+ });
93
+ }
94
+ return sdkGuardStore({
95
+ sdk: requireSdk(`guards for "${instanceId}" live in ${resource.projectId}.${resource.dataset}`),
96
+ instanceId: instanceId,
97
+ resource: resource
98
+ });
99
+ })),
100
+ observeInstances: query => engineIsMounted ? observableStore({
101
+ observable: documentStore.listenQuery(query.query, query.params, {}),
102
+ resolve: docs => docs,
103
+ initial: void 0,
104
+ name: "the instance list"
105
+ }) : sdkInstancesStore({
106
+ sdk: requireSdk(`the instance list lives in the engine dataset ${engineResource.projectId}.${engineResource.dataset}`),
107
+ query: query,
108
+ resource: engineResource
109
+ }),
110
+ ensureDocumentExists: args => ensureDocumentExists(client, args)
111
+ };
95
112
  }
96
- function resolveEditState(editState) {
97
- if (editState.ready)
98
- return editState.version ?? editState.draft ?? editState.published;
113
+
114
+ function resolveEditState(editState, draftFallback) {
115
+ if (!editState.ready) return;
116
+ const draft = draftFallback ? editState.draft : null;
117
+ return editState.version ?? draft ?? editState.published;
99
118
  }
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)
119
+
120
+ const SESSION_CLIENT_OPTIONS = {
121
+ apiVersion: ENGINE_API_VERSION
122
+ };
123
+
124
+ function useStudioObserver({engine: engine, sdk: suppliedSdk}) {
125
+ const documentStore = useDocumentStore(), source = useSource(), {projectId: projectId, dataset: dataset} = source, mounted = useMemo(() => ({
126
+ projectId: projectId,
127
+ dataset: dataset
128
+ }), [ projectId, dataset ]), engineResource = useMemo(() => datasetResourceId(engine.workflowResource), [ engine ]), sdk = useEmbeddedSdk({
129
+ supplied: suppliedSdk,
130
+ needed: !sameDataset(engineResource, mounted),
131
+ mounted: mounted,
132
+ sessionToken: source.getClient(SESSION_CLIENT_OPTIONS).config().token
118
133
  });
119
- }, [client, resource, tag, resourceClients]);
134
+ return useMemo(() => makeStudioObserver(documentStore, {
135
+ mounted: mounted,
136
+ client: source.getClient(SESSION_CLIENT_OPTIONS),
137
+ engineResource: engineResource,
138
+ ...sdk !== void 0 ? {
139
+ sdk: sdk
140
+ } : {}
141
+ }), [ documentStore, source, mounted, engineResource, sdk ]);
120
142
  }
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;
143
+
144
+ function useEmbeddedSdk({supplied: supplied, needed: needed, mounted: mounted, sessionToken: sessionToken}) {
145
+ const wanted = supplied === void 0 && needed, held = useRef(void 0), key = `${mounted.projectId}.${mounted.dataset}`;
146
+ wanted && (held.current?.key !== key || held.current.instance.isDisposed()) && (held.current = {
147
+ key: key,
148
+ instance: bootstrapInstance(mounted, sessionToken)
149
+ });
150
+ const embedded = wanted ? held.current?.instance : void 0;
151
+ return useDeferredDispose(embedded), supplied ?? embedded;
158
152
  }
153
+
159
154
  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
- });
155
+ 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}).");
156
+ return createSanityInstance({
157
+ projectId: mounted.projectId,
158
+ dataset: mounted.dataset,
159
+ auth: {
160
+ token: sessionToken
161
+ }
162
+ });
169
163
  }
164
+
170
165
  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)
166
+ const disposal = useRef(void 0);
167
+ useEffect(() => {
168
+ if (instance !== void 0) return disposal.current?.instance === instance && (clearTimeout(disposal.current.timeoutId),
169
+ disposal.current = void 0), () => {
170
+ disposal.current = {
171
+ instance: instance,
172
+ timeoutId: setTimeout(() => {
173
+ instance.isDisposed() || instance.dispose();
174
+ }, 0)
175
+ };
180
176
  };
181
- };
182
- }, [instance]);
177
+ }, [ instance ]);
183
178
  }
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 } });
179
+
180
+ function useWorkflowEngine({workflowResource: workflowResource, tag: tag, resourceClients: resourceClients, effectHandlers: effectHandlers, missingHandler: missingHandler}) {
181
+ const client = useClient({
182
+ apiVersion: ENGINE_API_VERSION
183
+ }), resource = useKeyed([ workflowResource.type, workflowResource.id ], () => workflowResource), telemetry = useWorkflowTelemetry();
184
+ return useMemo(() => {
185
+ const engineDataset = datasetResourceId(resource), engineClient = client.withConfig({
186
+ projectId: engineDataset.projectId,
187
+ dataset: engineDataset.dataset,
188
+ useCdn: !1,
189
+ requestTagPrefix: "sanity.workflows.studio"
190
+ });
191
+ return createEngine({
192
+ client: engineClient,
193
+ workflowResource: resource,
194
+ tag: tag,
195
+ resourceClients: resourceClients ?? studioResourceClients(client),
196
+ executionContext: {
197
+ kind: EXECUTION_KINDS.studio
198
+ },
199
+ ...effectHandlers !== void 0 ? {
200
+ effectHandlers: effectHandlers
201
+ } : {},
202
+ ...missingHandler !== void 0 ? {
203
+ missingHandler: missingHandler
204
+ } : {},
205
+ telemetry: telemetry
206
+ });
207
+ }, [ client, resource, tag, resourceClients, effectHandlers, missingHandler, telemetry ]);
193
208
  }
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 } : {} });
209
+
210
+ function studioResourceClients(client) {
211
+ return parsed => parsed.scheme === "dataset" && parsed.projectId !== void 0 && parsed.dataset !== void 0 ? client.withConfig({
212
+ projectId: parsed.projectId,
213
+ dataset: parsed.dataset,
214
+ useCdn: !1,
215
+ requestTagPrefix: "sanity.workflows.studio"
216
+ }) : void 0;
201
217
  }
202
- function useDocumentWorkflows({
203
- engine,
204
- document,
205
- sdk
206
- }) {
207
- const observer = useStudioObserver({ engine, sdk });
208
- return useDocumentWorkflows$1({ engine, observer, document });
218
+
219
+ function useWorkflowSession({engine: engine, instanceId: instanceId, grantsFromPath: grantsFromPath, sdk: sdk}) {
220
+ const observer = useStudioObserver({
221
+ engine: engine,
222
+ sdk: sdk
223
+ });
224
+ return useWorkflowSession$1({
225
+ engine: engine,
226
+ instanceId: instanceId,
227
+ observer: observer,
228
+ host: "studio",
229
+ opts: {
230
+ grantsFromPath: grantsFromPath
231
+ }
232
+ });
209
233
  }
210
- export {
211
- makeStudioObserver,
212
- studioResourceClients,
213
- useDocumentWorkflows,
214
- useWorkflowEngine,
215
- useWorkflowInstances,
216
- useWorkflowSession
217
- };
218
- //# sourceMappingURL=index.js.map
234
+
235
+ function useWorkflowInstances({engine: engine, filter: filter, sdk: sdk}) {
236
+ const observer = useStudioObserver({
237
+ engine: engine,
238
+ sdk: sdk
239
+ });
240
+ return useWorkflowInstances$1({
241
+ engine: engine,
242
+ observer: observer,
243
+ ...filter !== void 0 ? {
244
+ filter: filter
245
+ } : {}
246
+ });
247
+ }
248
+
249
+ function useDocumentWorkflows({engine: engine, document: document, sdk: sdk}) {
250
+ const observer = useStudioObserver({
251
+ engine: engine,
252
+ sdk: sdk
253
+ });
254
+ return useDocumentWorkflows$1({
255
+ engine: engine,
256
+ observer: observer,
257
+ document: document
258
+ });
259
+ }
260
+
261
+ 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.1",
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.16.0",
45
+ "@sanity/workflow-react": "0.11.0",
46
+ "@sanity/workflow-sdk": "0.8.0"
46
47
  },
47
48
  "devDependencies": {
48
49
  "@sanity/pkg-utils": "^10.5.2",