@w6w/react 0.6.0 → 0.9.9

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.
@@ -1,21 +1,37 @@
1
1
  /**
2
- * The hook set — one small primitive underneath (`useAsync` / a private
3
- * mutation primitive), every read/mutation hook a thin wrapper over
4
- * `useW6WClient()`. No react-query or any other data-fetching dependency
5
- * anywhere (`package.json` carries none — see README).
2
+ * The hook set — one small primitive underneath (`useAsync` for reads, a
3
+ * private mutation primitive for writes), every hook a thin wrapper over the
4
+ * provider's `W6WClient`. No react-query or any other data-fetching
5
+ * dependency anywhere (`package.json` carries none — see README).
6
6
  *
7
7
  * Built only over the PUBLIC, non-`console` surface (`me`, `documents`,
8
- * `vars`, `connections`, `workflows`, `run`) — `console.*` is studio-internal
9
- * and unstable (see README), so no hook here reaches for it.
8
+ * `vars`, `connections`, `workflows`, `functions`, `run`) — `console.*` is
9
+ * studio-internal and unstable (see README), so no hook here reaches for it.
10
+ * The workflow and Function definition lifecycles moved onto that public
11
+ * surface at contract `0.5.0`, which is why hooks for them live here now
12
+ * rather than being unreachable without `console.*`.
10
13
  *
11
- * Cancellation: `@w6w/sdk`'s transport has no `AbortSignal` to hook into
12
- * (`node/src/http.ts`), so a read hook can only IGNORE a result that resolves
13
- * after unmount (the `mountedRef` guard below), never truly abort the
14
- * in-flight request. See README.
14
+ * Cancellation and sharing: every read method a hook here calls takes an
15
+ * optional `signal` (`@w6w/sdk`'s `CallOptions`, threaded to the injected
16
+ * `fetch`'s own `RequestInit.signal`, `node/src/http.ts`). Reads are
17
+ * single-flighted per client (`single-flight.ts`): hooks asking for the same
18
+ * thing (same hook, same arguments) while a request is in flight share ONE
19
+ * request and one `AbortController`, and nothing is kept once it settles. The
20
+ * controller is refcounted — it aborts only when the LAST subscriber has gone
21
+ * (unmount, `identityKey`/client switch, `ready: false`) and stayed gone past
22
+ * a microtask, so React StrictMode's synchronous cleanup -> remount (or a
23
+ * second consumer) re-attaches to the flight instead of aborting and
24
+ * re-firing it. A stale request's resolution or rejection can never commit
25
+ * into a hook that has moved on, and a genuinely abandoned request is told to
26
+ * stop rather than merely ignored.
27
+ *
28
+ * Every read hook also gates on `ready` (`<W6WProvider ready={...}>`,
29
+ * default `true`): while `false`, `useAsync` never calls the fetcher at all
30
+ * and reports `loading: true`.
15
31
  *
16
32
  * @module
17
33
  */
18
- import type { ConnectionSummary, Doc, DocumentCreateInput, DocumentOptions, DocumentPatch, Me, RunEnvelope, RunInput, Var, VarCreateInput, VarPatch, WorkflowListOptions, WorkflowRunOptions, WorkflowRunResult, WorkflowSummary } from "@w6w/sdk";
34
+ import type { ConnectionSummary, Doc, DocumentCreateInput, DocumentOptions, DocumentPatch, FunctionDefinition, FunctionDetail, FunctionSummary, Me, RunEnvelope, RunInput, Var, VarCreateInput, VarPatch, WorkflowDefinition, WorkflowDetail, WorkflowListOptions, WorkflowRunOptions, WorkflowRunResult, WorkflowSaveResult, WorkflowSummary, WorkflowWriteOptions } from "@w6w/sdk";
19
35
  /** What every read hook returns. */
20
36
  export interface ReadResult<T> {
21
37
  /** The last successfully fetched value, or `undefined` before the first resolves. */
@@ -46,6 +62,19 @@ export declare function useVars(): ReadResult<Var[]>;
46
62
  export declare function useVar(id: string): ReadResult<Var>;
47
63
  export declare function useConnections(): ReadResult<ConnectionSummary[]>;
48
64
  export declare function useWorkflows(options?: WorkflowListOptions): ReadResult<WorkflowSummary[]>;
65
+ /**
66
+ * One workflow's stored definition, plus the two things that are not in it.
67
+ *
68
+ * `data.updatedAt` is the optimistic-concurrency token: hand it to
69
+ * {@linkcode useUpdateWorkflow}'s `ifUnmodifiedSince` and a save that would
70
+ * clobber someone else's edit is refused instead of winning silently. That is
71
+ * the whole reason this is a read hook and not just a fetch — the token has to
72
+ * survive from the read to the write, and a component that re-reads on every
73
+ * render would keep handing itself a fresh one.
74
+ */
75
+ export declare function useWorkflow(id: string): ReadResult<WorkflowDetail>;
76
+ export declare function useFunctions(): ReadResult<FunctionSummary[]>;
77
+ export declare function useFunction(id: string): ReadResult<FunctionDetail>;
49
78
  export declare function useCreateDocument(): MutationResult<[DocumentCreateInput, DocumentOptions?], Doc>;
50
79
  export declare function useUpdateDocument(): MutationResult<[
51
80
  string,
@@ -67,4 +96,54 @@ export declare function useDeleteVar(): MutationResult<[string], void>;
67
96
  */
68
97
  export declare function useRunWorkflow(): MutationResult<[string, WorkflowRunOptions?], WorkflowRunResult>;
69
98
  export declare function useRun(): MutationResult<[RunInput], RunEnvelope>;
99
+ /**
100
+ * ── The definition lifecycle ──
101
+ *
102
+ * Ten hooks over the same ten SDK methods, and three properties they inherit
103
+ * from it rather than invent:
104
+ *
105
+ * 1. **`create` mints the id.** The server requires one in the body and never
106
+ * generates it, so `create({name, steps})` works and the `wf_…`/`fn_…` id
107
+ * comes back in the result.
108
+ * 2. **`update` is a full replacement, not a patch.** This is the one place
109
+ * these differ from `useUpdateDocument`/`useUpdateVar`, whose second
110
+ * argument is a `Patch` of the fields to change. Here it is the whole
111
+ * definition: read with {@linkcode useWorkflow} / {@linkcode useFunction},
112
+ * spread, change, send. A component that passed only the changed fields
113
+ * would delete the rest.
114
+ * 3. **Deleting a workflow is two calls**, `archive` then `delete`. No hook
115
+ * here chains them — a UI that offers "delete" should offer the archive
116
+ * step too, because that is the step a user can still change their mind
117
+ * after.
118
+ *
119
+ * None of them refetch a list on success, matching every other mutation hook
120
+ * in this file: this lane carries no cache to invalidate (no react-query, by
121
+ * design — see README), so a component pairs the mutation with the read hook's
122
+ * own `refetch`.
123
+ */
124
+ export declare function useCreateWorkflow(): MutationResult<[
125
+ WorkflowDefinition,
126
+ WorkflowWriteOptions?
127
+ ], WorkflowSaveResult>;
128
+ export declare function useUpdateWorkflow(): MutationResult<[
129
+ string,
130
+ WorkflowDefinition,
131
+ WorkflowWriteOptions?
132
+ ], WorkflowSaveResult>;
133
+ export declare function useArchiveWorkflow(): MutationResult<[string], WorkflowDefinition>;
134
+ export declare function useDeleteWorkflow(): MutationResult<[string], void>;
135
+ export declare function useCreateFunction(): MutationResult<[
136
+ FunctionDefinition
137
+ ], {
138
+ id: string;
139
+ key: string;
140
+ }>;
141
+ export declare function useUpdateFunction(): MutationResult<[
142
+ string,
143
+ FunctionDefinition
144
+ ], {
145
+ id: string;
146
+ key: string;
147
+ }>;
148
+ export declare function useDeleteFunction(): MutationResult<[string], void>;
70
149
  //# sourceMappingURL=hooks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EACV,iBAAiB,EACjB,GAAG,EACH,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,EAAE,EACF,WAAW,EACX,QAAQ,EACR,GAAG,EACH,cAAc,EACd,QAAQ,EACR,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EAChB,MAAM,UAAU,CAAC;AAIlB,oCAAoC;AACpC,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,qFAAqF;IACrF,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC;IACpB,8DAA8D;IAC9D,KAAK,EAAE,OAAO,CAAC;IACf,gFAAgF;IAChF,OAAO,EAAE,OAAO,CAAC;IACjB,qCAAqC;IACrC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wCAAwC;AACxC,MAAM,WAAW,cAAc,CAAC,IAAI,SAAS,OAAO,EAAE,EAAE,CAAC;IACvD,+FAA+F;IAC/F,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IACpC,kDAAkD;IAClD,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC;IACpB,6DAA6D;IAC7D,KAAK,EAAE,OAAO,CAAC;IACf,wCAAwC;IACxC,OAAO,EAAE,OAAO,CAAC;CAClB;AAmFD,wBAAgB,KAAK,IAAI,UAAU,CAAC,EAAE,CAAC,CAItC;AAED,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,CAQzE;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,UAAU,CAAC,GAAG,CAAC,CAQlF;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,UAAU,CAAC,GAAG,CAAC,CAQxF;AAED,wBAAgB,OAAO,IAAI,UAAU,CAAC,GAAG,EAAE,CAAC,CAI3C;AAED,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAIlD;AAED,wBAAgB,cAAc,IAAI,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAIhE;AAED,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,UAAU,CAAC,eAAe,EAAE,CAAC,CAQzF;AAID,wBAAgB,iBAAiB,IAAI,cAAc,CAAC,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,CAKhG;AAED,wBAAgB,iBAAiB,IAAI,cAAc,CACjD;IAAC,MAAM;IAAE,aAAa;IAAE,eAAe,CAAC;CAAC,EACzC,GAAG,CACJ,CAKA;AAED,wBAAgB,iBAAiB,IAAI,cAAc,CAAC,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,CAKpF;AAED,wBAAgB,YAAY,IAAI,cAAc,CAAC,CAAC,cAAc,CAAC,EAAE,GAAG,CAAC,CAGpE;AAED,wBAAgB,YAAY,IAAI,cAAc,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,CAGtE;AAED,wBAAgB,YAAY,IAAI,cAAc,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAG7D;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,IAAI,cAAc,CAAC,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAKjG;AAED,wBAAgB,MAAM,IAAI,cAAc,CAAC,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,CAGhE"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/hooks.ts"],"names":[],"mappings":"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"}
package/dist/src/hooks.js CHANGED
@@ -1,39 +1,100 @@
1
1
  import { useCallback, useEffect, useRef, useState } from "react";
2
- import { useW6WClient } from "./W6WProvider.js";
2
+ import { useW6WClient, useW6WProviderContext } from "./W6WProvider.js";
3
+ import { subscribe } from "./single-flight.js";
3
4
  /**
4
- * Shared plumbing behind every read hook: fetch once on mount, expose
5
- * `refetch` for an imperative re-fetch, and drop a result that resolves after
6
- * unmount. `fetcher` must be a `useCallback`-stabilized function — each hook
7
- * below owns that decision by listing exactly the values its own fetch
8
- * depends on, so this primitive's own dependency array (`[fetcher]`) stays
9
- * exhaustive and needs no lint override.
5
+ * Shared plumbing behind every read hook: fetch on mount, on every
6
+ * `fetcher`/`client`/`ready` change, and on an imperative `refetch()`; drop
7
+ * any result that is no longer current.
8
+ *
9
+ * `fetcher` must be a `useCallback`-stabilized function taking the call's
10
+ * `AbortSignal` — each hook below owns that decision by listing exactly the
11
+ * values its own fetch depends on (including `client`), so this primitive's
12
+ * own dependency array stays exhaustive and needs no lint override. `client`
13
+ * is passed SEPARATELY (not inferred from `fetcher`'s identity) because it is
14
+ * the one thing that decides whether a reset is a "client change" (blank the
15
+ * stale data before refetching — R-7) or an ordinary same-client refetch
16
+ * (keep today's behaviour: loading flips true, previous data stays visible
17
+ * until the new result lands).
18
+ *
19
+ * Sequencing: a monotonic per-call generation number, bumped on every real
20
+ * fetch. Only the call whose generation is still the LATEST when it settles
21
+ * is allowed to commit — a superseded call (a newer one started, whether by
22
+ * `client` changing or by `refetch()`) can never write `state`, on resolution
23
+ * OR rejection. The previous call's `AbortController` is also aborted before
24
+ * the new one starts, and on unmount, so a genuinely abandoned request is
25
+ * told to stop rather than merely ignored.
26
+ *
27
+ * `ready === false` short-circuits before any of that: the fetcher is never
28
+ * called, any in-flight call is aborted, and state reports
29
+ * `{data: undefined, error: undefined, loading: true}`.
30
+ *
31
+ * A rejection named `ConfigError` (`@w6w/sdk`'s `requireToken` — no token yet,
32
+ * P-6) is reported as `loading: true`, not `error` — the same floor as
33
+ * `ready: false`, since from a caller's point of view "no credential yet" and
34
+ * "not ready yet" are the same state.
35
+ *
36
+ * `key` identifies the read for sharing: `JSON.stringify([method, ...args])`
37
+ * over the SDK method and EVERY argument `fetcher` closes over. `refetch()`
38
+ * starts a fresh flight (replacing the key's slot) and never aborts a flight
39
+ * another subscriber still holds.
10
40
  */
11
- function useAsync(fetcher) {
41
+ function useAsync(key, fetcher, client, ready) {
12
42
  const [state, setState] = useState({
13
43
  data: undefined,
14
44
  error: undefined,
15
45
  loading: true,
16
46
  });
17
47
  const mountedRef = useRef(true);
48
+ const generationRef = useRef(0);
49
+ const subRef = useRef(null);
50
+ const clientRef = useRef(client);
18
51
  useEffect(() => {
19
52
  mountedRef.current = true;
20
53
  return () => {
21
54
  mountedRef.current = false;
55
+ subRef.current?.detach();
56
+ subRef.current = null;
22
57
  };
23
58
  }, []);
24
- const refetch = useCallback(() => {
25
- setState((s) => ({ ...s, loading: true }));
26
- fetcher().then((data) => {
27
- if (mountedRef.current)
28
- setState({ data, error: undefined, loading: false });
59
+ const run = useCallback((fresh = false) => {
60
+ const clientChanged = clientRef.current !== client;
61
+ clientRef.current = client;
62
+ // Abort whatever this hook had in flight — superseded by this call,
63
+ // whether it is a real fetch or a `ready: false` short-circuit.
64
+ subRef.current?.detach();
65
+ subRef.current = null;
66
+ if (!ready) {
67
+ // Bump the generation too, not just abort the controller — a rejection
68
+ // from the just-aborted call must never land after this point and flip
69
+ // `loading` back to `false` out from under the `ready: false` floor.
70
+ ++generationRef.current;
71
+ setState({ data: undefined, error: undefined, loading: true });
72
+ return;
73
+ }
74
+ const generation = ++generationRef.current;
75
+ const sub = subscribe(client, key, fetcher, fresh);
76
+ subRef.current = sub;
77
+ setState((s) => clientChanged
78
+ ? { data: undefined, error: undefined, loading: true }
79
+ : { ...s, loading: true });
80
+ sub.promise.then((data) => {
81
+ if (!mountedRef.current || generation !== generationRef.current)
82
+ return;
83
+ setState({ data, error: undefined, loading: false });
29
84
  }, (error) => {
30
- if (mountedRef.current)
31
- setState({ data: undefined, error, loading: false });
85
+ if (!mountedRef.current || generation !== generationRef.current)
86
+ return;
87
+ if (error instanceof Error && error.name === "ConfigError") {
88
+ setState({ data: undefined, error: undefined, loading: true });
89
+ return;
90
+ }
91
+ setState({ data: undefined, error, loading: false });
32
92
  });
33
- }, [fetcher]);
93
+ }, [key, fetcher, client, ready]);
34
94
  useEffect(() => {
35
- refetch();
36
- }, [refetch]);
95
+ run();
96
+ }, [run]);
97
+ const refetch = useCallback(() => run(true), [run]);
37
98
  return { data: state.data, error: state.error, loading: state.loading, refetch };
38
99
  }
39
100
  /**
@@ -66,48 +127,73 @@ function useMutationResource(mutator) {
66
127
  }
67
128
  // ── reads ────────────────────────────────────────────────────────────────
68
129
  export function useMe() {
69
- const client = useW6WClient();
70
- const fetcher = useCallback(() => client.me(), [client]);
71
- return useAsync(fetcher);
130
+ const { client, ready } = useW6WProviderContext();
131
+ const fetcher = useCallback((signal) => client.me({ signal }), [client]);
132
+ return useAsync(JSON.stringify(["me"]), fetcher, client, ready);
72
133
  }
73
134
  export function useDocuments(options) {
74
- const client = useW6WClient();
135
+ const { client, ready } = useW6WProviderContext();
75
136
  const project = options?.project;
76
- const fetcher = useCallback(() => client.documents.list(project === undefined ? undefined : { project }), [client, project]);
77
- return useAsync(fetcher);
137
+ const fetcher = useCallback((signal) => client.documents.list({ project, signal }), [client, project]);
138
+ return useAsync(JSON.stringify(["documents.list", project ?? null]), fetcher, client, ready);
78
139
  }
79
140
  export function useDocument(id, options) {
80
- const client = useW6WClient();
141
+ const { client, ready } = useW6WProviderContext();
81
142
  const project = options?.project;
82
- const fetcher = useCallback(() => client.documents.get(id, project === undefined ? undefined : { project }), [client, id, project]);
83
- return useAsync(fetcher);
143
+ const fetcher = useCallback((signal) => client.documents.get(id, { project, signal }), [client, id, project]);
144
+ return useAsync(JSON.stringify(["documents.get", id, project ?? null]), fetcher, client, ready);
84
145
  }
85
146
  export function useDocumentByKey(key, options) {
86
- const client = useW6WClient();
147
+ const { client, ready } = useW6WProviderContext();
87
148
  const project = options?.project;
88
- const fetcher = useCallback(() => client.documents.getByKey(key, project === undefined ? undefined : { project }), [client, key, project]);
89
- return useAsync(fetcher);
149
+ const fetcher = useCallback((signal) => client.documents.getByKey(key, { project, signal }), [client, key, project]);
150
+ return useAsync(JSON.stringify(["documents.getByKey", key, project ?? null]), fetcher, client, ready);
90
151
  }
91
152
  export function useVars() {
92
- const client = useW6WClient();
93
- const fetcher = useCallback(() => client.vars.list(), [client]);
94
- return useAsync(fetcher);
153
+ const { client, ready } = useW6WProviderContext();
154
+ const fetcher = useCallback((signal) => client.vars.list({ signal }), [client]);
155
+ return useAsync(JSON.stringify(["vars.list"]), fetcher, client, ready);
95
156
  }
96
157
  export function useVar(id) {
97
- const client = useW6WClient();
98
- const fetcher = useCallback(() => client.vars.get(id), [client, id]);
99
- return useAsync(fetcher);
158
+ const { client, ready } = useW6WProviderContext();
159
+ const fetcher = useCallback((signal) => client.vars.get(id, { signal }), [client, id]);
160
+ return useAsync(JSON.stringify(["vars.get", id]), fetcher, client, ready);
100
161
  }
101
162
  export function useConnections() {
102
- const client = useW6WClient();
103
- const fetcher = useCallback(() => client.connections.list(), [client]);
104
- return useAsync(fetcher);
163
+ const { client, ready } = useW6WProviderContext();
164
+ const fetcher = useCallback((signal) => client.connections.list({ signal }), [client]);
165
+ return useAsync(JSON.stringify(["connections.list"]), fetcher, client, ready);
105
166
  }
106
167
  export function useWorkflows(options) {
107
- const client = useW6WClient();
168
+ const { client, ready } = useW6WProviderContext();
108
169
  const project = options?.project;
109
- const fetcher = useCallback(() => client.workflows.list(project === undefined ? undefined : { project }), [client, project]);
110
- return useAsync(fetcher);
170
+ const fetcher = useCallback((signal) => client.workflows.list({ project, signal }), [client, project]);
171
+ return useAsync(JSON.stringify(["workflows.list", project ?? null]), fetcher, client, ready);
172
+ }
173
+ /**
174
+ * One workflow's stored definition, plus the two things that are not in it.
175
+ *
176
+ * `data.updatedAt` is the optimistic-concurrency token: hand it to
177
+ * {@linkcode useUpdateWorkflow}'s `ifUnmodifiedSince` and a save that would
178
+ * clobber someone else's edit is refused instead of winning silently. That is
179
+ * the whole reason this is a read hook and not just a fetch — the token has to
180
+ * survive from the read to the write, and a component that re-reads on every
181
+ * render would keep handing itself a fresh one.
182
+ */
183
+ export function useWorkflow(id) {
184
+ const { client, ready } = useW6WProviderContext();
185
+ const fetcher = useCallback((signal) => client.workflows.get(id, { signal }), [client, id]);
186
+ return useAsync(JSON.stringify(["workflows.get", id]), fetcher, client, ready);
187
+ }
188
+ export function useFunctions() {
189
+ const { client, ready } = useW6WProviderContext();
190
+ const fetcher = useCallback((signal) => client.functions.list({ signal }), [client]);
191
+ return useAsync(JSON.stringify(["functions.list"]), fetcher, client, ready);
192
+ }
193
+ export function useFunction(id) {
194
+ const { client, ready } = useW6WProviderContext();
195
+ const fetcher = useCallback((signal) => client.functions.get(id, { signal }), [client, id]);
196
+ return useAsync(JSON.stringify(["functions.get", id]), fetcher, client, ready);
111
197
  }
112
198
  // ── mutations ────────────────────────────────────────────────────────────
113
199
  export function useCreateDocument() {
@@ -151,4 +237,57 @@ export function useRun() {
151
237
  const client = useW6WClient();
152
238
  return useMutationResource((input) => client.run(input));
153
239
  }
240
+ /**
241
+ * ── The definition lifecycle ──
242
+ *
243
+ * Ten hooks over the same ten SDK methods, and three properties they inherit
244
+ * from it rather than invent:
245
+ *
246
+ * 1. **`create` mints the id.** The server requires one in the body and never
247
+ * generates it, so `create({name, steps})` works and the `wf_…`/`fn_…` id
248
+ * comes back in the result.
249
+ * 2. **`update` is a full replacement, not a patch.** This is the one place
250
+ * these differ from `useUpdateDocument`/`useUpdateVar`, whose second
251
+ * argument is a `Patch` of the fields to change. Here it is the whole
252
+ * definition: read with {@linkcode useWorkflow} / {@linkcode useFunction},
253
+ * spread, change, send. A component that passed only the changed fields
254
+ * would delete the rest.
255
+ * 3. **Deleting a workflow is two calls**, `archive` then `delete`. No hook
256
+ * here chains them — a UI that offers "delete" should offer the archive
257
+ * step too, because that is the step a user can still change their mind
258
+ * after.
259
+ *
260
+ * None of them refetch a list on success, matching every other mutation hook
261
+ * in this file: this lane carries no cache to invalidate (no react-query, by
262
+ * design — see README), so a component pairs the mutation with the read hook's
263
+ * own `refetch`.
264
+ */
265
+ export function useCreateWorkflow() {
266
+ const client = useW6WClient();
267
+ return useMutationResource((definition, options) => client.workflows.create(definition, options));
268
+ }
269
+ export function useUpdateWorkflow() {
270
+ const client = useW6WClient();
271
+ return useMutationResource((id, definition, options) => client.workflows.update(id, definition, options));
272
+ }
273
+ export function useArchiveWorkflow() {
274
+ const client = useW6WClient();
275
+ return useMutationResource((id) => client.workflows.archive(id));
276
+ }
277
+ export function useDeleteWorkflow() {
278
+ const client = useW6WClient();
279
+ return useMutationResource((id) => client.workflows.delete(id));
280
+ }
281
+ export function useCreateFunction() {
282
+ const client = useW6WClient();
283
+ return useMutationResource((definition) => client.functions.create(definition));
284
+ }
285
+ export function useUpdateFunction() {
286
+ const client = useW6WClient();
287
+ return useMutationResource((id, definition) => client.functions.update(id, definition));
288
+ }
289
+ export function useDeleteFunction() {
290
+ const client = useW6WClient();
291
+ return useMutationResource((id) => client.functions.delete(id));
292
+ }
154
293
  //# sourceMappingURL=hooks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/hooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Single-flight store behind the read hooks: identical in-flight reads (same
3
+ * client, same key) share ONE request, and nothing outlives it.
4
+ *
5
+ * Scoping: one `Map` per `W6WClient` object, held in a `WeakMap` — never a
6
+ * bare module-level map and never keyed by `baseUrl`/token, so two providers
7
+ * with identical props (different tenants) cannot see each other's data.
8
+ *
9
+ * Lifetime: an entry exists only while its request is pending. It is deleted
10
+ * on resolve OR reject (only if it is still the mapped entry), so a consumer
11
+ * that mounts after the flight settled sends a fresh request — no staleness.
12
+ *
13
+ * Abort: refcounted. The shared `AbortController` aborts only when the last
14
+ * subscriber has detached AND stayed detached past a microtask grace. React
15
+ * StrictMode's synchronous cleanup -> remount re-attaches inside that grace,
16
+ * so it re-joins the flight instead of abort + refire.
17
+ *
18
+ * @module
19
+ */
20
+ /** One subscriber's hold on a shared flight. */
21
+ export interface Subscription<T> {
22
+ /** The shared request's result — the same promise for every subscriber. */
23
+ readonly promise: Promise<T>;
24
+ /** Release this subscriber's hold. Idempotent. */
25
+ detach(): void;
26
+ }
27
+ /**
28
+ * Join the pending flight for `(client, key)`, or start one with `start`.
29
+ * `fresh` always starts a new flight and takes over the key's slot; the entry
30
+ * it replaces keeps running for whoever still holds it.
31
+ */
32
+ export declare function subscribe<T>(client: object, key: string, start: (signal: AbortSignal) => Promise<T>, fresh?: boolean): Subscription<T>;
33
+ //# sourceMappingURL=single-flight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"single-flight.d.ts","sourceRoot":"","sources":["../../src/single-flight.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAQH,gDAAgD;AAChD,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7B,kDAAkD;IAClD,MAAM,IAAI,IAAI,CAAC;CAChB;AAID;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,CAAC,EACzB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,EAC1C,KAAK,UAAQ,GACZ,YAAY,CAAC,CAAC,CAAC,CAyCjB"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Single-flight store behind the read hooks: identical in-flight reads (same
3
+ * client, same key) share ONE request, and nothing outlives it.
4
+ *
5
+ * Scoping: one `Map` per `W6WClient` object, held in a `WeakMap` — never a
6
+ * bare module-level map and never keyed by `baseUrl`/token, so two providers
7
+ * with identical props (different tenants) cannot see each other's data.
8
+ *
9
+ * Lifetime: an entry exists only while its request is pending. It is deleted
10
+ * on resolve OR reject (only if it is still the mapped entry), so a consumer
11
+ * that mounts after the flight settled sends a fresh request — no staleness.
12
+ *
13
+ * Abort: refcounted. The shared `AbortController` aborts only when the last
14
+ * subscriber has detached AND stayed detached past a microtask grace. React
15
+ * StrictMode's synchronous cleanup -> remount re-attaches inside that grace,
16
+ * so it re-joins the flight instead of abort + refire.
17
+ *
18
+ * @module
19
+ */
20
+ const stores = new WeakMap();
21
+ /**
22
+ * Join the pending flight for `(client, key)`, or start one with `start`.
23
+ * `fresh` always starts a new flight and takes over the key's slot; the entry
24
+ * it replaces keeps running for whoever still holds it.
25
+ */
26
+ export function subscribe(client, key, start, fresh = false) {
27
+ let map = stores.get(client);
28
+ if (!map) {
29
+ map = new Map();
30
+ stores.set(client, map);
31
+ }
32
+ const slots = map;
33
+ let entry = fresh ? undefined : slots.get(key);
34
+ if (!entry) {
35
+ const controller = new AbortController();
36
+ const created = {
37
+ promise: start(controller.signal),
38
+ controller,
39
+ refs: 0,
40
+ };
41
+ const settle = () => {
42
+ if (slots.get(key) === created)
43
+ slots.delete(key);
44
+ };
45
+ created.promise.then(settle, settle);
46
+ slots.set(key, created);
47
+ entry = created;
48
+ }
49
+ const held = entry;
50
+ held.refs++;
51
+ let detached = false;
52
+ return {
53
+ promise: held.promise,
54
+ detach() {
55
+ if (detached)
56
+ return;
57
+ detached = true;
58
+ held.refs--;
59
+ if (held.refs > 0)
60
+ return;
61
+ queueMicrotask(() => {
62
+ if (held.refs > 0)
63
+ return;
64
+ if (slots.get(key) === held)
65
+ slots.delete(key);
66
+ held.controller.abort();
67
+ });
68
+ },
69
+ };
70
+ }
71
+ //# sourceMappingURL=single-flight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"single-flight.js","sourceRoot":"","sources":["../../src/single-flight.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAgBH,MAAM,MAAM,GAAG,IAAI,OAAO,EAAuC,CAAC;AAElE;;;;GAIG;AACH,MAAM,UAAU,SAAS,CACvB,MAAc,EACd,GAAW,EACX,KAA0C,EAC1C,KAAK,GAAG,KAAK;IAEb,IAAI,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;QAChB,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC;IAElB,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAA0B,CAAC;IACzE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAa;YACxB,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;YACjC,UAAU;YACV,IAAI,EAAE,CAAC;SACR,CAAC;QACF,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,OAAO;gBAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpD,CAAC,CAAC;QACF,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAyB,CAAC,CAAC;QAC1C,KAAK,GAAG,OAAO,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC;IACnB,IAAI,CAAC,IAAI,EAAE,CAAC;IAEZ,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,MAAM;YACJ,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAChB,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC;gBAAE,OAAO;YAC1B,cAAc,CAAC,GAAG,EAAE;gBAClB,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC;oBAAE,OAAO;gBAC1B,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI;oBAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC/C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YAC1B,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -15,5 +15,5 @@
15
15
  * every wrapper's version in lockstep, and that pattern depends on the literal
16
16
  * `: string` shape being present.
17
17
  */
18
- export const VERSION = "0.6.0";
18
+ export const VERSION = "0.9.9";
19
19
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@w6w/react",
3
- "version": "0.6.0",
3
+ "version": "0.9.9",
4
4
  "description": "React bindings for @w6w/sdk — a <W6WProvider>, a small hook set, and a structural adapter for @w6w/ui's W6WApi contract.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -10,7 +10,13 @@
10
10
  },
11
11
  "homepage": "https://github.com/w6w-io/w6w-wrappers/tree/main/react#readme",
12
12
  "bugs": "https://github.com/w6w-io/w6w-wrappers/issues",
13
- "keywords": ["w6w", "workflow", "react", "sdk", "hooks"],
13
+ "keywords": [
14
+ "w6w",
15
+ "workflow",
16
+ "react",
17
+ "sdk",
18
+ "hooks"
19
+ ],
14
20
  "type": "module",
15
21
  "types": "./dist/mod.d.ts",
16
22
  "main": "./dist/mod.js",
@@ -20,7 +26,9 @@
20
26
  "import": "./dist/mod.js"
21
27
  }
22
28
  },
23
- "files": ["dist"],
29
+ "files": [
30
+ "dist"
31
+ ],
24
32
  "sideEffects": false,
25
33
  "engines": {
26
34
  "node": ">=18"
@@ -36,11 +44,12 @@
36
44
  "react": ">=18"
37
45
  },
38
46
  "dependencies": {
39
- "@w6w/sdk": "^0.6.0"
47
+ "@w6w/sdk": "^0.9.9"
40
48
  },
41
49
  "devDependencies": {
42
50
  "@biomejs/biome": "^1.9.4",
43
51
  "@types/react": "^18.3.17",
52
+ "@w6w/ui": "github:w6w-io/w6w-ui#76c11dfbd750fe8227ccdef6600726e26ea0e268",
44
53
  "jsdom": "^30.0.1",
45
54
  "react": "^18.3.1",
46
55
  "react-dom": "^18.3.1",