@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/CHANGELOG.md +377 -0
- package/README.md +21 -17
- package/dist/index.cjs +245 -190
- package/dist/index.d.cts +40 -14
- package/dist/index.d.ts +40 -14
- package/dist/index.js +244 -201
- package/package.json +7 -6
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -1,212 +1,267 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: !0
|
|
5
|
+
});
|
|
6
|
+
|
|
7
|
+
var workflowEngine = require("@sanity/workflow-engine"), observer = require("@sanity/workflow-react/observer"), observer$1 = require("@sanity/workflow-sdk/observer"), sdk = require("@sanity/sdk"), react = require("react"), sanity = require("sanity"), workflowReact = require("@sanity/workflow-react");
|
|
8
|
+
|
|
9
|
+
const RESUBSCRIBE_DELAY_MS = 5e3;
|
|
10
|
+
|
|
11
|
+
function observableStore({observable: observable, resolve: resolve, initial: initial, name: name}) {
|
|
12
|
+
let latest = initial;
|
|
13
|
+
return {
|
|
14
|
+
subscribe(onChange) {
|
|
15
|
+
let subscription, retry, stopped = !1;
|
|
16
|
+
const connect = () => {
|
|
17
|
+
subscription = observable.subscribe({
|
|
18
|
+
next: value => {
|
|
19
|
+
latest = resolve(value), onChange();
|
|
20
|
+
},
|
|
21
|
+
error: err => {
|
|
22
|
+
console.error(`[workflow-studio] ${name} stream errored — resubscribing in ${RESUBSCRIBE_DELAY_MS / 1e3}s:`, err),
|
|
23
|
+
stopped || (retry = setTimeout(connect, RESUBSCRIBE_DELAY_MS));
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
return connect(), () => {
|
|
28
|
+
stopped = !0, retry !== void 0 && clearTimeout(retry), subscription?.unsubscribe();
|
|
29
|
+
};
|
|
30
|
+
},
|
|
31
|
+
getSnapshot: () => latest
|
|
32
|
+
};
|
|
19
33
|
}
|
|
34
|
+
|
|
20
35
|
function makeStudioObserver(documentStore, options) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
36
|
+
const {mounted: mounted, engineResource: engineResource, sdk: sdk2, client: client} = options, engineIsMounted = observer.sameDataset(engineResource, mounted), editStateStore = ({id: id, type: type, release: release, draftFallback: draftFallback}) => observableStore({
|
|
37
|
+
observable: documentStore.pair.editState(id, type, release),
|
|
38
|
+
resolve: editState => resolveEditState(editState, draftFallback),
|
|
39
|
+
initial: void 0,
|
|
40
|
+
name: `the edit state of "${id}"`
|
|
41
|
+
}), requireSdk = what => {
|
|
42
|
+
if (sdk2 !== void 0) return sdk2;
|
|
43
|
+
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.`);
|
|
44
|
+
};
|
|
45
|
+
return {
|
|
46
|
+
observeInstance: instanceId => engineIsMounted ? editStateStore({
|
|
47
|
+
id: instanceId,
|
|
48
|
+
type: workflowEngine.WORKFLOW_INSTANCE_TYPE,
|
|
49
|
+
release: void 0,
|
|
50
|
+
draftFallback: !0
|
|
51
|
+
}) : observer$1.sdkInstanceDocStore({
|
|
52
|
+
sdk: requireSdk(`instance "${instanceId}" lives in the engine dataset ${engineResource.projectId}.${engineResource.dataset}`),
|
|
53
|
+
instanceId: instanceId,
|
|
54
|
+
engineResource: engineResource
|
|
55
|
+
}),
|
|
56
|
+
observeDocs: (documents, perspective) => observer.combineDocStores(documents.map(ref => observer.classifyRef(ref, mounted) === "mounted-dataset" ? {
|
|
57
|
+
key: ref.globalDocumentId,
|
|
58
|
+
store: editStateStore({
|
|
59
|
+
id: ref.documentId,
|
|
60
|
+
type: ref.type,
|
|
61
|
+
release: workflowEngine.contentReleaseName({
|
|
62
|
+
ref: ref,
|
|
63
|
+
perspective: perspective
|
|
64
|
+
}),
|
|
65
|
+
draftFallback: workflowEngine.contentDraftFallback({
|
|
66
|
+
ref: ref,
|
|
67
|
+
perspective: perspective
|
|
68
|
+
})
|
|
69
|
+
})
|
|
70
|
+
} : {
|
|
71
|
+
key: ref.globalDocumentId,
|
|
72
|
+
store: observer$1.sdkContentDocStore({
|
|
73
|
+
sdk: requireSdk(`"${ref.globalDocumentId}" lives outside this workspace`),
|
|
74
|
+
ref: ref,
|
|
75
|
+
perspective: perspective
|
|
76
|
+
})
|
|
77
|
+
})),
|
|
78
|
+
observeGuards: (instanceId, resources) => observer.combineGuardStores(resources.map(resource => {
|
|
79
|
+
if (observer.sameDataset(resource, mounted)) {
|
|
80
|
+
const {query: query, params: params} = workflowEngine.instanceGuardQuery(instanceId);
|
|
81
|
+
return observableStore({
|
|
82
|
+
observable: documentStore.listenQuery(query, params, {}),
|
|
83
|
+
resolve: docs => docs,
|
|
84
|
+
initial: void 0,
|
|
85
|
+
name: `the guard list for "${instanceId}"`
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return observer$1.sdkGuardStore({
|
|
89
|
+
sdk: requireSdk(`guards for "${instanceId}" live in ${resource.projectId}.${resource.dataset}`),
|
|
90
|
+
instanceId: instanceId,
|
|
91
|
+
resource: resource
|
|
92
|
+
});
|
|
93
|
+
})),
|
|
94
|
+
observeInstances: query => engineIsMounted ? observableStore({
|
|
95
|
+
observable: documentStore.listenQuery(query.query, query.params, {}),
|
|
96
|
+
resolve: docs => docs,
|
|
97
|
+
initial: void 0,
|
|
98
|
+
name: "the instance list"
|
|
99
|
+
}) : observer$1.sdkInstancesStore({
|
|
100
|
+
sdk: requireSdk(`the instance list lives in the engine dataset ${engineResource.projectId}.${engineResource.dataset}`),
|
|
101
|
+
query: query,
|
|
102
|
+
resource: engineResource
|
|
103
|
+
}),
|
|
104
|
+
ensureDocumentExists: args => observer.ensureDocumentExists(client, args)
|
|
105
|
+
};
|
|
91
106
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
107
|
+
|
|
108
|
+
function resolveEditState(editState, draftFallback) {
|
|
109
|
+
if (!editState.ready) return;
|
|
110
|
+
const draft = draftFallback ? editState.draft : null;
|
|
111
|
+
return editState.version ?? draft ?? editState.published;
|
|
95
112
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
}) {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
client: engineClient,
|
|
111
|
-
workflowResource: resource,
|
|
112
|
-
tag,
|
|
113
|
-
resourceClients: resourceClients ?? studioResourceClients(client)
|
|
113
|
+
|
|
114
|
+
const SESSION_CLIENT_OPTIONS = {
|
|
115
|
+
apiVersion: workflowEngine.ENGINE_API_VERSION
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
function useStudioObserver({engine: engine, sdk: suppliedSdk}) {
|
|
119
|
+
const documentStore = sanity.useDocumentStore(), source = sanity.useSource(), {projectId: projectId, dataset: dataset} = source, mounted = react.useMemo(() => ({
|
|
120
|
+
projectId: projectId,
|
|
121
|
+
dataset: dataset
|
|
122
|
+
}), [ projectId, dataset ]), engineResource = react.useMemo(() => observer.datasetResourceId(engine.workflowResource), [ engine ]), sdk2 = useEmbeddedSdk({
|
|
123
|
+
supplied: suppliedSdk,
|
|
124
|
+
needed: !observer.sameDataset(engineResource, mounted),
|
|
125
|
+
mounted: mounted,
|
|
126
|
+
sessionToken: source.getClient(SESSION_CLIENT_OPTIONS).config().token
|
|
114
127
|
});
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
sdk: suppliedSdk
|
|
124
|
-
}) {
|
|
125
|
-
const documentStore = sanity.useDocumentStore(), source = sanity.useSource(), { projectId, dataset } = source, mounted = react.useMemo(() => ({ projectId, dataset }), [projectId, dataset]), engineResource = react.useMemo(() => observer.datasetResourceId(engine.workflowResource), [engine]), sdk2 = useEmbeddedSdk({
|
|
126
|
-
supplied: suppliedSdk,
|
|
127
|
-
// The engine dataset being foreign is the signal an SDK instance is
|
|
128
|
-
// needed; foreign content refs without one still fail loud per ref.
|
|
129
|
-
needed: !observer.sameDataset(engineResource, mounted),
|
|
130
|
-
mounted,
|
|
131
|
-
// The session's token rides the source client's config (absent under
|
|
132
|
-
// cookie auth) — the public read; Studio's token storage is private.
|
|
133
|
-
sessionToken: source.getClient(SESSION_CLIENT_OPTIONS).config().token
|
|
134
|
-
});
|
|
135
|
-
return react.useMemo(
|
|
136
|
-
() => makeStudioObserver(documentStore, {
|
|
137
|
-
mounted,
|
|
138
|
-
engineResource,
|
|
139
|
-
...sdk2 !== void 0 ? { sdk: sdk2 } : {}
|
|
140
|
-
}),
|
|
141
|
-
[documentStore, mounted, engineResource, sdk2]
|
|
142
|
-
);
|
|
128
|
+
return react.useMemo(() => makeStudioObserver(documentStore, {
|
|
129
|
+
mounted: mounted,
|
|
130
|
+
client: source.getClient(SESSION_CLIENT_OPTIONS),
|
|
131
|
+
engineResource: engineResource,
|
|
132
|
+
...sdk2 !== void 0 ? {
|
|
133
|
+
sdk: sdk2
|
|
134
|
+
} : {}
|
|
135
|
+
}), [ documentStore, source, mounted, engineResource, sdk2 ]);
|
|
143
136
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
return useDeferredDispose(embedded), supplied ?? embedded;
|
|
137
|
+
|
|
138
|
+
function useEmbeddedSdk({supplied: supplied, needed: needed, mounted: mounted, sessionToken: sessionToken}) {
|
|
139
|
+
const wanted = supplied === void 0 && needed, held = react.useRef(void 0), key = `${mounted.projectId}.${mounted.dataset}`;
|
|
140
|
+
wanted && (held.current?.key !== key || held.current.instance.isDisposed()) && (held.current = {
|
|
141
|
+
key: key,
|
|
142
|
+
instance: bootstrapInstance(mounted, sessionToken)
|
|
143
|
+
});
|
|
144
|
+
const embedded = wanted ? held.current?.instance : void 0;
|
|
145
|
+
return useDeferredDispose(embedded), supplied ?? embedded;
|
|
154
146
|
}
|
|
147
|
+
|
|
155
148
|
function bootstrapInstance(mounted, sessionToken) {
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
});
|
|
149
|
+
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}).");
|
|
150
|
+
return sdk.createSanityInstance({
|
|
151
|
+
projectId: mounted.projectId,
|
|
152
|
+
dataset: mounted.dataset,
|
|
153
|
+
auth: {
|
|
154
|
+
token: sessionToken
|
|
155
|
+
}
|
|
156
|
+
});
|
|
165
157
|
}
|
|
158
|
+
|
|
166
159
|
function useDeferredDispose(instance) {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
160
|
+
const disposal = react.useRef(void 0);
|
|
161
|
+
react.useEffect(() => {
|
|
162
|
+
if (instance !== void 0) return disposal.current?.instance === instance && (clearTimeout(disposal.current.timeoutId),
|
|
163
|
+
disposal.current = void 0), () => {
|
|
164
|
+
disposal.current = {
|
|
165
|
+
instance: instance,
|
|
166
|
+
timeoutId: setTimeout(() => {
|
|
167
|
+
instance.isDisposed() || instance.dispose();
|
|
168
|
+
}, 0)
|
|
169
|
+
};
|
|
176
170
|
};
|
|
177
|
-
|
|
178
|
-
}, [instance]);
|
|
171
|
+
}, [ instance ]);
|
|
179
172
|
}
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
173
|
+
|
|
174
|
+
function useWorkflowEngine({workflowResource: workflowResource, tag: tag, resourceClients: resourceClients, effectHandlers: effectHandlers, missingHandler: missingHandler}) {
|
|
175
|
+
const client = sanity.useClient({
|
|
176
|
+
apiVersion: workflowEngine.ENGINE_API_VERSION
|
|
177
|
+
}), resource = observer.useKeyed([ workflowResource.type, workflowResource.id ], () => workflowResource), telemetry = workflowReact.useWorkflowTelemetry();
|
|
178
|
+
return react.useMemo(() => {
|
|
179
|
+
const engineDataset = observer.datasetResourceId(resource), engineClient = client.withConfig({
|
|
180
|
+
projectId: engineDataset.projectId,
|
|
181
|
+
dataset: engineDataset.dataset,
|
|
182
|
+
useCdn: !1,
|
|
183
|
+
requestTagPrefix: "sanity.workflows.studio"
|
|
184
|
+
});
|
|
185
|
+
return workflowEngine.createEngine({
|
|
186
|
+
client: engineClient,
|
|
187
|
+
workflowResource: resource,
|
|
188
|
+
tag: tag,
|
|
189
|
+
resourceClients: resourceClients ?? studioResourceClients(client),
|
|
190
|
+
executionContext: {
|
|
191
|
+
kind: workflowEngine.EXECUTION_KINDS.studio
|
|
192
|
+
},
|
|
193
|
+
...effectHandlers !== void 0 ? {
|
|
194
|
+
effectHandlers: effectHandlers
|
|
195
|
+
} : {},
|
|
196
|
+
...missingHandler !== void 0 ? {
|
|
197
|
+
missingHandler: missingHandler
|
|
198
|
+
} : {},
|
|
199
|
+
telemetry: telemetry
|
|
200
|
+
});
|
|
201
|
+
}, [ client, resource, tag, resourceClients, effectHandlers, missingHandler, telemetry ]);
|
|
189
202
|
}
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
203
|
+
|
|
204
|
+
function studioResourceClients(client) {
|
|
205
|
+
return parsed => parsed.scheme === "dataset" && parsed.projectId !== void 0 && parsed.dataset !== void 0 ? client.withConfig({
|
|
206
|
+
projectId: parsed.projectId,
|
|
207
|
+
dataset: parsed.dataset,
|
|
208
|
+
useCdn: !1,
|
|
209
|
+
requestTagPrefix: "sanity.workflows.studio"
|
|
210
|
+
}) : void 0;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function useWorkflowSession({engine: engine, instanceId: instanceId, grantsFromPath: grantsFromPath, sdk: sdk2}) {
|
|
214
|
+
const observer2 = useStudioObserver({
|
|
215
|
+
engine: engine,
|
|
216
|
+
sdk: sdk2
|
|
217
|
+
});
|
|
218
|
+
return workflowReact.useWorkflowSession({
|
|
219
|
+
engine: engine,
|
|
220
|
+
instanceId: instanceId,
|
|
221
|
+
observer: observer2,
|
|
222
|
+
host: "studio",
|
|
223
|
+
opts: {
|
|
224
|
+
grantsFromPath: grantsFromPath
|
|
225
|
+
}
|
|
226
|
+
});
|
|
197
227
|
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
228
|
+
|
|
229
|
+
function useWorkflowInstances({engine: engine, filter: filter, sdk: sdk2}) {
|
|
230
|
+
const observer2 = useStudioObserver({
|
|
231
|
+
engine: engine,
|
|
232
|
+
sdk: sdk2
|
|
233
|
+
});
|
|
234
|
+
return workflowReact.useWorkflowInstances({
|
|
235
|
+
engine: engine,
|
|
236
|
+
observer: observer2,
|
|
237
|
+
...filter !== void 0 ? {
|
|
238
|
+
filter: filter
|
|
239
|
+
} : {}
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
function useDocumentWorkflows({engine: engine, document: document, sdk: sdk2}) {
|
|
244
|
+
const observer2 = useStudioObserver({
|
|
245
|
+
engine: engine,
|
|
246
|
+
sdk: sdk2
|
|
247
|
+
});
|
|
248
|
+
return workflowReact.useDocumentWorkflows({
|
|
249
|
+
engine: engine,
|
|
250
|
+
observer: observer2,
|
|
251
|
+
document: document
|
|
252
|
+
});
|
|
205
253
|
}
|
|
254
|
+
|
|
206
255
|
exports.makeStudioObserver = makeStudioObserver;
|
|
256
|
+
|
|
207
257
|
exports.studioResourceClients = studioResourceClients;
|
|
258
|
+
|
|
208
259
|
exports.useDocumentWorkflows = useDocumentWorkflows;
|
|
260
|
+
|
|
261
|
+
exports.useStudioObserver = useStudioObserver;
|
|
262
|
+
|
|
209
263
|
exports.useWorkflowEngine = useWorkflowEngine;
|
|
264
|
+
|
|
210
265
|
exports.useWorkflowInstances = useWorkflowInstances;
|
|
266
|
+
|
|
211
267
|
exports.useWorkflowSession = useWorkflowSession;
|
|
212
|
-
//# sourceMappingURL=index.cjs.map
|
package/dist/index.d.cts
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 {
|
|
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
|
|
58
|
-
* the engine
|
|
59
|
-
*
|
|
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).
|
|
85
|
-
*
|
|
86
|
-
*
|
|
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
|
-
|
|
117
|
+
effectHandlers,
|
|
118
|
+
missingHandler,
|
|
93
119
|
}: {
|
|
94
120
|
workflowResource: WorkflowResource;
|
|
95
121
|
tag: string;
|
|
96
122
|
resourceClients?: ResourceClientResolver;
|
|
97
|
-
|
|
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
|
-
*
|
|
124
|
-
*
|
|
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;
|