@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/CHANGELOG.md +354 -0
- package/README.md +14 -10
- package/dist/index.cjs +237 -189
- package/dist/index.d.cts +40 -14
- package/dist/index.d.ts +40 -14
- package/dist/index.js +236 -200
- package/package.json +7 -6
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
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 {
|
|
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;
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
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
|
-
),
|
|
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
|
-
|
|
98
|
-
return editState.version ?? editState.draft ?? editState.published;
|
|
110
|
+
if (editState.ready) return editState.version ?? editState.draft ?? editState.published;
|
|
99
111
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
}) {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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
|
-
|
|
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
|
-
|
|
122
|
-
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
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
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
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
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
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
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
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
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
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.
|
|
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": "
|
|
41
|
+
"access": "public"
|
|
41
42
|
},
|
|
42
43
|
"dependencies": {
|
|
43
|
-
"@sanity/workflow-engine": "0.
|
|
44
|
-
"@sanity/workflow-react": "0.
|
|
45
|
-
"@sanity/workflow-sdk": "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",
|