@gusnips/react 0.9.33 → 0.10.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/README.md CHANGED
@@ -703,12 +703,37 @@ export const oauthApi = createOAuthConsoleApi(api, "/auth/oauth");
703
703
  ```
704
704
 
705
705
  That is both pages' calls to the server's `oauthConsoleRoutes`, mounted at `/auth/oauth` behind
706
- your sign-in. `api` is your `createApiClient` client, or any object with its `get` and `post`.
706
+ your sign-in. `api` is your `createApiClient` client, or any object with its typed `get` and `post`
707
+ methods, including their `RequestOptions` argument.
708
+
709
+ Both hooks require `scope`, captured from your app's identity store:
710
+
711
+ ```ts
712
+ import type { OAuthScope } from "@gusnips/react/oauth";
713
+
714
+ const scope: OAuthScope = {
715
+ key: ["identity", accountId, workspaceId, generation],
716
+ isCurrent: () => identityStore.getState().generation === generation,
717
+ };
718
+ ```
719
+
720
+ Those ids, `generation` and `identityStore` belong to your app. Read them from the same snapshot.
721
+ Advance the generation whenever the account or workspace changes, including sign-out and signing
722
+ back into the same account. Do not use an access token: refreshing a token is not a new identity.
723
+ `isCurrent` compares that captured generation with the live store, not another render's copy.
724
+
725
+ Query keys start with `scope.key`, followed by `"@gusnips/react/oauth"`, the hook kind and the
726
+ request without its leading `?` or the device code's eight uppercase letters. Equal requests can
727
+ share data within one scope, never across identities. Keep your app's normal query cancellation
728
+ and cache clearing at identity boundaries; clearing a cache alone does not stop a running write.
729
+
730
+ This required argument is a breaking API change. It needs a new React 0.x minor and a paired Vite
731
+ minor before publication. Existing callers must pass a scope when adopting that release.
707
732
 
708
733
  ```tsx
709
734
  import { useConsentRequest } from "@gusnips/react/oauth";
710
735
 
711
- const consent = useConsentRequest(oauthApi.consent, useLocation().search);
736
+ const consent = useConsentRequest(oauthApi.consent, useLocation().search, scope);
712
737
 
713
738
  if (consent.state.status === "ready")
714
739
  return (
@@ -718,9 +743,13 @@ if (consent.state.status === "ready")
718
743
  );
719
744
  ```
720
745
 
721
- If your routes are your own, pass your own two calls instead: `describe(query)` and
722
- `approve(query, choice)`. The choice is anything your page adds, such as a workspace, and it reaches
723
- the server's approver. With no choice, call `approve()`.
746
+ If your routes are your own, pass your own two calls instead: `describe(query, options)` and
747
+ `approve(query, choice, options)`. `options` is `RequestOptions` from `@gusnips/react`. Forward it
748
+ to your HTTP client, including its `signal`. Reads receive TanStack Query's cancellation signal;
749
+ writes receive a signal owned by the initiating operation. For an identity-aware adapter, capture
750
+ the same account and workspace used in `scope` when building the adapter. Do not read a different
751
+ identity's headers at dispatch time. The choice is anything your page adds, such as a workspace,
752
+ and it reaches the server's approver. With no choice, call `approve()`.
724
753
 
725
754
  When your server adds fields to the view, type them after the choice:
726
755
  `createOAuthConsoleApi<string, { spaces: Space[] }>(api, "/auth/oauth")`, and
@@ -741,10 +770,22 @@ With your own calls, it is `ConsentApi<Choice, { spaces: Space[] }>`.
741
770
  for a second press. Approve sends the browser on with `window.location.assign`, which also opens
742
771
  an app's own scheme such as `cursor://`.
743
772
 
773
+ A decision captures its API calls, request and identity when pressed. A changed scope, request,
774
+ code or unmounted page invalidates it. Late answers reject with `OAuthOperationChangedError`
775
+ before successful data can enter the mutation cache. Consent checks again before redirecting.
776
+ Transport is aborted on code/request changes or cleanup, but the generation check still applies
777
+ if an adapter ignores cancellation. Aborting cannot undo a decision the server already made.
778
+ Show request errors beside the button with `approveError` or `decideError`, and let the person
779
+ press again. A stale decision does not become the new page's result or error.
780
+
781
+ Both hooks set `retry: false` and `refetchOnWindowFocus: false` for reads, even if your client's
782
+ defaults say otherwise. Writes also set `retry: false` and `networkMode: "always"`: an offline
783
+ press tries once and can fail, but it is never queued to run when the connection returns.
784
+
744
785
  ```tsx
745
786
  import { useDeviceApproval, useDeviceCodeField } from "@gusnips/react/oauth";
746
787
 
747
- const device = useDeviceApproval(oauthApi.device, useLocation().search);
788
+ const device = useDeviceApproval(oauthApi.device, useLocation().search, scope);
748
789
  const field = useDeviceCodeField(device);
749
790
 
750
791
  <label htmlFor={field.inputProps.id}>Code</label>
@@ -770,6 +811,10 @@ page stays decided: it never asks the server again, because the server no longer
770
811
  and asking on the next focus would tell someone who just said yes that their code is wrong.
771
812
 
772
813
  `approve(choice)` sends a choice with the yes, as on the consent page; `deny()` sends none.
814
+ For your own routes, the calls are `describe(code, options)` and
815
+ `decide(code, decision, choice, options)`, with the same `RequestOptions` forwarding as consent.
816
+ A new link's code replaces the field; editing a code starts a new operation. Approved and denied
817
+ states last only for that code in that scope.
773
818
  `pending` is `"approve"` or `"deny"` from the press until the server answers, so the spinner goes
774
819
  on the button that was pressed.
775
820
 
package/dist/oauth.d.ts CHANGED
@@ -1,5 +1,6 @@
1
+ import { type QueryKey } from "@tanstack/react-query";
1
2
  import { type ChangeEvent } from "react";
2
- import type { ApiClient } from "./api-client.ts";
3
+ import type { ApiClient, RequestOptions } from "./api-client.ts";
3
4
  /**
4
5
  * The two pages behind an agent's sign-in: the consent page, where Claude or ChatGPT sends a
5
6
  * person to connect, and the device page, where a script's short code is typed and approved.
@@ -46,11 +47,22 @@ export type DeviceView<Extra extends object = object> = Extra & {
46
47
  /** ISO time: JSON carries the server's `Date` as a string. */
47
48
  expiresAt: string;
48
49
  };
50
+ /** Capture this from your app's identity store on each account or workspace generation. */
51
+ export interface OAuthScope {
52
+ /** Query-key prefix, including account, workspace and the identity generation. Never a token. */
53
+ readonly key: QueryKey;
54
+ /** Compare the captured generation with the live store, even before React renders again. */
55
+ isCurrent(): boolean;
56
+ }
57
+ /** A decision outlived its account, request or page. Aborting does not undo a server-side decision. */
58
+ export declare class OAuthOperationChangedError extends Error {
59
+ constructor();
60
+ }
49
61
  export interface ConsentApi<Choice = void, Extra extends object = object> {
50
- /** Your API's call to the server's `describe`, with the query string as it came. */
51
- describe(query: string): Promise<ConsentView<Extra> | OAuthRefusal>;
62
+ /** Forward `options`, including its signal, to your HTTP client. */
63
+ describe(query: string, options?: RequestOptions): Promise<ConsentView<Extra> | OAuthRefusal>;
52
64
  /** Your API's call to `approve`. `choice` is anything your page adds, such as a workspace. */
53
- approve(query: string, choice: Choice): Promise<{
65
+ approve(query: string, choice: Choice, options?: RequestOptions): Promise<{
54
66
  ok: true;
55
67
  redirectTo: string;
56
68
  } | OAuthRefusal>;
@@ -81,15 +93,15 @@ export interface ConsentRequest<Choice = void, Extra extends object = object> {
81
93
  approveError: unknown;
82
94
  }
83
95
  /**
84
- * const consent = useConsentRequest(api.oauth, useLocation().search);
96
+ * const consent = useConsentRequest(api.oauth, useLocation().search, scope);
85
97
  * if (consent.state.status === "ready") ... consent.approve(workspaceId)
86
98
  */
87
- export declare function useConsentRequest<Choice = void, Extra extends object = object>(api: ConsentApi<Choice, Extra>, search: string): ConsentRequest<Choice, Extra>;
99
+ export declare function useConsentRequest<Choice = void, Extra extends object = object>(api: ConsentApi<Choice, Extra>, search: string, scope: OAuthScope): ConsentRequest<Choice, Extra>;
88
100
  export interface DeviceApi<Choice = void, Extra extends object = object> {
89
- /** Your API's call to the server's `describeDevice`. */
90
- describe(code: string): Promise<DeviceView<Extra> | OAuthRefusal>;
101
+ /** Forward `options`, including its signal, to your HTTP client. */
102
+ describe(code: string, options?: RequestOptions): Promise<DeviceView<Extra> | OAuthRefusal>;
91
103
  /** Your API's call to `decideDevice`. `choice` comes with a yes only, as on the consent page. */
92
- decide(code: string, decision: "approve" | "deny", choice?: Choice): Promise<{
104
+ decide(code: string, decision: "approve" | "deny", choice?: Choice, options?: RequestOptions): Promise<{
93
105
  ok: true;
94
106
  } | OAuthRefusal>;
95
107
  }
@@ -142,12 +154,12 @@ export interface DeviceApproval<Choice = void, Extra extends object = object> {
142
154
  /** Upper case, letters only, at most 8, with the dash after the fourth: what the field shows. */
143
155
  export declare function formatUserCode(input: string): string;
144
156
  /**
145
- * const device = useDeviceApproval(api.device, useLocation().search);
157
+ * const device = useDeviceApproval(api.device, useLocation().search, scope);
146
158
  * <input value={device.code} onChange={(e) => device.setCode(e.target.value)} />
147
159
  *
148
160
  * The link the script prints carries `?code=`, so the field usually starts full.
149
161
  */
150
- export declare function useDeviceApproval<Choice = void, Extra extends object = object>(api: DeviceApi<Choice, Extra>, search: string): DeviceApproval<Choice, Extra>;
162
+ export declare function useDeviceApproval<Choice = void, Extra extends object = object>(api: DeviceApi<Choice, Extra>, search: string, scope: OAuthScope): DeviceApproval<Choice, Extra>;
151
163
  export interface DeviceCodeField {
152
164
  /** Spread on the code's `<input>`. Point your `<label htmlFor>` at its `id`. */
153
165
  inputProps: {
@@ -186,8 +198,8 @@ export declare function useDeviceCodeField<Choice, Extra extends object>(device:
186
198
  export type OAuthConsoleHttp = Pick<ApiClient, "get" | "post">;
187
199
  /**
188
200
  * export const oauthApi = createOAuthConsoleApi(api, "/auth/oauth");
189
- * useConsentRequest(oauthApi.consent, search);
190
- * useDeviceApproval(oauthApi.device, search);
201
+ * useConsentRequest(oauthApi.consent, search, scope);
202
+ * useDeviceApproval(oauthApi.device, search, scope);
191
203
  *
192
204
  * Both pages' calls to the server's `oauthConsoleRoutes`, mounted at `basePath` behind your
193
205
  * sign-in. A choice travels as `choice`, which is where those routes hand it to your approver.
@@ -1 +1 @@
1
- {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
package/dist/oauth.js CHANGED
@@ -1,25 +1,105 @@
1
- import { useMutation, useQuery } from "@tanstack/react-query";
2
- import { useEffect, useId, useState } from "react";
1
+ import { hashKey, useMutation, useQuery } from "@tanstack/react-query";
2
+ import { useCallback, useEffect, useId, useLayoutEffect, useMemo, useState, } from "react";
3
+ /** A decision outlived its account, request or page. Aborting does not undo a server-side decision. */
4
+ export class OAuthOperationChangedError extends Error {
5
+ constructor() {
6
+ super("The account, sign-in request or page changed before the decision finished. Check connected apps in the account you used before trying again.");
7
+ this.name = "OAuthOperationChangedError";
8
+ }
9
+ }
10
+ function assertCurrent(operation) {
11
+ if (!operation.isCurrent())
12
+ throw new OAuthOperationChangedError();
13
+ }
14
+ function createOperationLifetime(identity) {
15
+ let mounted = false;
16
+ let generation = 0;
17
+ const controllers = new Set();
18
+ return {
19
+ identity,
20
+ invalidate() {
21
+ generation++;
22
+ for (const controller of controllers)
23
+ controller.abort();
24
+ controllers.clear();
25
+ },
26
+ mount() {
27
+ mounted = true;
28
+ return () => {
29
+ mounted = false;
30
+ this.invalidate();
31
+ };
32
+ },
33
+ capture(isCurrent) {
34
+ const started = generation;
35
+ const controller = new AbortController();
36
+ controllers.add(controller);
37
+ return {
38
+ identity,
39
+ signal: controller.signal,
40
+ isCurrent: () => mounted && started === generation && isCurrent(),
41
+ release: () => controllers.delete(controller),
42
+ };
43
+ },
44
+ };
45
+ }
46
+ /** Both pages reject late answers, even when the adapter ignores abort or the cache was cleared. */
47
+ function useOAuthOperation(scope, kind, input) {
48
+ const key = [...scope.key, "@gusnips/react/oauth", kind, input];
49
+ const identity = hashKey(key);
50
+ const lifetime = useMemo(() => createOperationLifetime(identity), [identity]);
51
+ // Invalidate by the commit, before passive cleanup can leave a late redirect window.
52
+ // Layout effects work on native too and do not run during SSR. StrictMode can mount again.
53
+ useLayoutEffect(() => lifetime.mount(), [lifetime]);
54
+ return { key, lifetime, capture: () => lifetime.capture(() => scope.isCurrent()) };
55
+ }
3
56
  /**
4
- * const consent = useConsentRequest(api.oauth, useLocation().search);
57
+ * const consent = useConsentRequest(api.oauth, useLocation().search, scope);
5
58
  * if (consent.state.status === "ready") ... consent.approve(workspaceId)
6
59
  */
7
- export function useConsentRequest(api, search) {
60
+ export function useConsentRequest(api, search, scope) {
8
61
  const query = search.replace(/^\?/, "");
62
+ const { key, lifetime, capture } = useOAuthOperation(scope, "consent", query);
9
63
  const request = useQuery({
10
- queryKey: ["@gusnips/react/oauth", "consent", query],
11
- queryFn: () => api.describe(query),
64
+ queryKey: key,
65
+ queryFn: ({ signal }) => api.describe(query, { signal }),
66
+ // A previous description is never a safe stand-in for this approval target.
67
+ placeholderData: () => undefined,
68
+ retry: false,
69
+ refetchOnWindowFocus: false,
12
70
  });
13
71
  const approval = useMutation({
14
- mutationFn: (choice) => api.approve(query, choice),
15
- onSuccess: (answer) => {
16
- if (answer.ok)
72
+ mutationFn: async (pressed) => {
73
+ const { api, query, choice, operation } = pressed;
74
+ try {
75
+ assertCurrent(operation);
76
+ const answer = await api.approve(query, choice, { signal: operation.signal });
77
+ // Before returning: stale success data must never enter the mutation cache.
78
+ assertCurrent(operation);
79
+ return answer;
80
+ }
81
+ finally {
82
+ operation.release();
83
+ }
84
+ },
85
+ onSettled: (answer, error, { operation }) => {
86
+ // Global success and settlement callbacks may await an identity change. Check last.
87
+ if (error !== null)
88
+ return;
89
+ assertCurrent(operation);
90
+ if (answer?.ok)
17
91
  window.location.assign(answer.redirectTo);
18
92
  },
93
+ retry: false,
94
+ networkMode: "always",
19
95
  });
96
+ const currentApproval = approval.variables?.operation.identity === lifetime.identity &&
97
+ approval.variables.operation.isCurrent();
20
98
  // A refusal from approve (the request went stale between the two calls) outranks the view.
21
99
  const answer = request.data;
22
- const refusal = approval.data?.ok === false ? approval.data : answer?.ok === false ? answer : null;
100
+ let refusal = answer?.ok === false ? answer : null;
101
+ if (currentApproval && approval.data?.ok === false)
102
+ refusal = approval.data;
23
103
  let state;
24
104
  if (refusal)
25
105
  state = { status: "refused", refusal };
@@ -31,14 +111,16 @@ export function useConsentRequest(api, search) {
31
111
  state = { status: "loading" };
32
112
  return {
33
113
  state,
34
- approve: (choice) => approval.mutate(choice),
35
- leaving: approval.isPending || approval.data?.ok === true,
36
- approveError: approval.error,
114
+ approve: (choice) => approval.mutate({ api, query, choice, operation: capture() }),
115
+ leaving: currentApproval && (approval.isPending || approval.data?.ok === true),
116
+ approveError: currentApproval ? approval.error : null,
37
117
  };
38
118
  }
39
119
  /** The server's alphabet: no vowels, so a code never spells a word. */
40
120
  const ALPHABET = "BCDFGHJKLMNPQRSTVWXZ";
41
121
  const LENGTH = 8;
122
+ // Private wiring between the approval and field hooks, without adding to the public page API.
123
+ const deviceAddressWrites = new WeakMap();
42
124
  /** Upper case, letters only, at most 8, with the dash after the fourth: what the field shows. */
43
125
  export function formatUserCode(input) {
44
126
  const letters = input
@@ -48,27 +130,63 @@ export function formatUserCode(input) {
48
130
  return letters.length > 4 ? `${letters.slice(0, 4)}-${letters.slice(4)}` : letters;
49
131
  }
50
132
  /**
51
- * const device = useDeviceApproval(api.device, useLocation().search);
133
+ * const device = useDeviceApproval(api.device, useLocation().search, scope);
52
134
  * <input value={device.code} onChange={(e) => device.setCode(e.target.value)} />
53
135
  *
54
136
  * The link the script prints carries `?code=`, so the field usually starts full.
55
137
  */
56
- export function useDeviceApproval(api, search) {
57
- const [code, setTyped] = useState(() => formatUserCode(new URLSearchParams(search).get("code") ?? ""));
138
+ export function useDeviceApproval(api, search, scope) {
139
+ const fromLink = formatUserCode(new URLSearchParams(search).get("code") ?? "");
140
+ const [input, setInput] = useState({ fromLink, code: fromLink });
141
+ const recordAddressWrite = useCallback((ownAddress) => {
142
+ setInput((current) => ({ ...current, ownAddress }));
143
+ }, []);
144
+ // Only external links replace input. The field also writes the address while typing and
145
+ // clears it after a decision; neither write should replace input or invalidate the decision.
146
+ const code = input.fromLink === fromLink || input.ownAddress === fromLink ? input.code : fromLink;
147
+ if (input.fromLink !== fromLink)
148
+ setInput({ fromLink, code });
58
149
  const letters = code.replace("-", "");
59
150
  const invalidLetter = [...letters].some((letter) => !ALPHABET.includes(letter));
60
151
  const complete = letters.length === LENGTH && !invalidLetter;
152
+ const { key, lifetime, capture } = useOAuthOperation(scope, "device", letters);
61
153
  const decision = useMutation({
62
- mutationFn: (pressed) => api.decide(letters, pressed.decision, pressed.choice),
154
+ mutationFn: async (pressed) => {
155
+ const { api, code, decision, choice, operation } = pressed;
156
+ try {
157
+ assertCurrent(operation);
158
+ const answer = await api.decide(code, decision, choice, { signal: operation.signal });
159
+ assertCurrent(operation);
160
+ return answer;
161
+ }
162
+ finally {
163
+ operation.release();
164
+ }
165
+ },
166
+ onSettled: (_answer, error, { operation }) => {
167
+ if (error === null)
168
+ assertCurrent(operation);
169
+ },
170
+ retry: false,
171
+ networkMode: "always",
63
172
  });
64
- const decided = decision.isSuccess && decision.data.ok ? decision.variables.decision : undefined;
173
+ const currentDecision = decision.variables?.operation.identity === lifetime.identity &&
174
+ decision.variables.operation.isCurrent();
175
+ const decided = currentDecision && decision.isSuccess && decision.data.ok
176
+ ? decision.variables.decision
177
+ : undefined;
65
178
  const request = useQuery({
66
- queryKey: ["@gusnips/react/oauth", "device", letters],
67
- queryFn: () => api.describe(letters),
179
+ queryKey: key,
180
+ queryFn: ({ signal }) => api.describe(letters, { signal }),
68
181
  enabled: complete && decided === undefined,
182
+ placeholderData: () => undefined,
183
+ retry: false,
184
+ refetchOnWindowFocus: false,
69
185
  });
70
186
  const answer = request.data;
71
- const refusal = decision.data?.ok === false ? decision.data : answer?.ok === false ? answer : null;
187
+ let refusal = answer?.ok === false ? answer : null;
188
+ if (currentDecision && decision.data?.ok === false)
189
+ refusal = decision.data;
72
190
  let state;
73
191
  if (decided !== undefined)
74
192
  state = { status: decided === "approve" ? "approved" : "denied" };
@@ -82,20 +200,26 @@ export function useDeviceApproval(api, search) {
82
200
  state = { status: "failed", error: request.error, retry: () => void request.refetch() };
83
201
  else
84
202
  state = { status: "loading" };
85
- return {
203
+ const device = {
86
204
  state,
87
205
  code,
88
- setCode: (input) => {
206
+ setCode: (value) => {
207
+ const next = formatUserCode(value);
208
+ if (next === code)
209
+ return;
210
+ lifetime.invalidate();
89
211
  decision.reset();
90
- setTyped(formatUserCode(input));
212
+ setInput((current) => ({ ...current, code: next }));
91
213
  },
92
214
  invalidLetter,
93
- approve: (choice) => decision.mutate({ decision: "approve", choice }),
94
- deny: () => decision.mutate({ decision: "deny" }),
95
- deciding: decision.isPending,
96
- pending: decision.isPending ? decision.variables.decision : null,
97
- decideError: decision.error,
215
+ approve: (choice) => decision.mutate({ api, code: letters, decision: "approve", choice, operation: capture() }),
216
+ deny: () => decision.mutate({ api, code: letters, decision: "deny", operation: capture() }),
217
+ deciding: currentDecision && decision.isPending,
218
+ pending: currentDecision && decision.isPending ? decision.variables.decision : null,
219
+ decideError: currentDecision ? decision.error : null,
98
220
  };
221
+ deviceAddressWrites.set(device, recordAddressWrite);
222
+ return device;
99
223
  }
100
224
  /**
101
225
  * const field = useDeviceCodeField(device);
@@ -113,15 +237,18 @@ export function useDeviceCodeField(device) {
113
237
  const statusId = `${id}-status`;
114
238
  const { status } = device.state;
115
239
  const inAddress = status === "approved" || status === "denied" ? "" : device.code;
240
+ const recordAddressWrite = deviceAddressWrites.get(device);
116
241
  useEffect(() => {
117
242
  const url = new URL(window.location.href);
118
243
  if (inAddress)
119
244
  url.searchParams.set("code", inAddress);
120
245
  else
121
246
  url.searchParams.delete("code");
122
- if (url.href !== window.location.href)
247
+ if (url.href !== window.location.href) {
248
+ recordAddressWrite?.(inAddress);
123
249
  window.history.replaceState(window.history.state, "", url);
124
- }, [inAddress]);
250
+ }
251
+ }, [inAddress, recordAddressWrite]);
125
252
  return {
126
253
  inputProps: {
127
254
  id,
@@ -141,8 +268,8 @@ export function useDeviceCodeField(device) {
141
268
  }
142
269
  /**
143
270
  * export const oauthApi = createOAuthConsoleApi(api, "/auth/oauth");
144
- * useConsentRequest(oauthApi.consent, search);
145
- * useDeviceApproval(oauthApi.device, search);
271
+ * useConsentRequest(oauthApi.consent, search, scope);
272
+ * useDeviceApproval(oauthApi.device, search, scope);
146
273
  *
147
274
  * Both pages' calls to the server's `oauthConsoleRoutes`, mounted at `basePath` behind your
148
275
  * sign-in. A choice travels as `choice`, which is where those routes hand it to your approver.
@@ -151,12 +278,12 @@ export function useDeviceCodeField(device) {
151
278
  export function createOAuthConsoleApi(http, basePath) {
152
279
  return {
153
280
  consent: {
154
- describe: (query) => http.get(`${basePath}/request?${query}`),
155
- approve: (query, choice) => http.post(`${basePath}/approve`, { query, choice }),
281
+ describe: (query, options) => http.get(`${basePath}/request?${query}`, options),
282
+ approve: (query, choice, options) => http.post(`${basePath}/approve`, { query, choice }, options),
156
283
  },
157
284
  device: {
158
- describe: (code) => http.get(`${basePath}/device?code=${encodeURIComponent(code)}`),
159
- decide: (code, decision, choice) => http.post(`${basePath}/device`, { code, decision, choice }),
285
+ describe: (code, options) => http.get(`${basePath}/device?code=${encodeURIComponent(code)}`, options),
286
+ decide: (code, decision, choice, options) => http.post(`${basePath}/device`, { code, decision, choice }, options),
160
287
  },
161
288
  };
162
289
  }
package/dist/oauth.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAoB,MAAM,OAAO,CAAC;AA+ErE;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAA8B,EAC9B,MAAc;IAEd,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,QAAQ,CAAC;QACvB,QAAQ,EAAE,CAAC,sBAAsB,EAAE,SAAS,EAAE,KAAK,CAAC;QACpD,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;KACnC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,WAAW,CAAC;QAC3B,UAAU,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;QAC1D,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;YACpB,IAAI,MAAM,CAAC,EAAE;gBAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC3D,CAAC;KACF,CAAC,CAAC;IAEH,2FAA2F;IAC3F,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAC5B,MAAM,OAAO,GACX,QAAQ,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACrF,IAAI,KAA0B,CAAC;IAC/B,IAAI,OAAO;QAAE,KAAK,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;SAC/C,IAAI,MAAM,EAAE,EAAE,KAAK,IAAI;QAAE,KAAK,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SACnE,IAAI,OAAO,CAAC,OAAO;QACtB,KAAK,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;;QACrF,KAAK,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAEnC,OAAO;QACL,KAAK;QACL,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;QAC5C,OAAO,EAAE,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,KAAK,IAAI;QACzD,YAAY,EAAE,QAAQ,CAAC,KAAK;KAC7B,CAAC;AACJ,CAAC;AA8CD,uEAAuE;AACvE,MAAM,QAAQ,GAAG,sBAAsB,CAAC;AACxC,MAAM,MAAM,GAAG,CAAC,CAAC;AAEjB,iGAAiG;AACjG,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,MAAM,OAAO,GAAG,KAAK;SAClB,WAAW,EAAE;SACb,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;SACtB,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACpB,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AACrF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAA6B,EAC7B,MAAc;IAEd,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CACrC,cAAc,CAAC,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAC9D,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACtC,MAAM,aAAa,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAChF,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,aAAa,CAAC;IAE7D,MAAM,QAAQ,GAAG,WAAW,CAAC;QAC3B,UAAU,EAAE,CAAC,OAA0D,EAAE,EAAE,CACzE,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC;KACxD,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACjG,MAAM,OAAO,GAAG,QAAQ,CAAC;QACvB,QAAQ,EAAE,CAAC,sBAAsB,EAAE,QAAQ,EAAE,OAAO,CAAC;QACrD,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;QACpC,OAAO,EAAE,QAAQ,IAAI,OAAO,KAAK,SAAS;KAC3C,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAC5B,MAAM,OAAO,GACX,QAAQ,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACrF,IAAI,KAAyB,CAAC;IAC9B,IAAI,OAAO,KAAK,SAAS;QAAE,KAAK,GAAG,EAAE,MAAM,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;SACxF,IAAI,CAAC,QAAQ;QAAE,KAAK,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;SAC5C,IAAI,OAAO;QAAE,KAAK,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;SACpD,IAAI,MAAM,EAAE,EAAE,KAAK,IAAI;QAAE,KAAK,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SACnE,IAAI,OAAO,CAAC,OAAO;QACtB,KAAK,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;;QACrF,KAAK,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAEnC,OAAO;QACL,KAAK;QACL,IAAI;QACJ,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjB,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,aAAa;QACb,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QACrE,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QACjD,QAAQ,EAAE,QAAQ,CAAC,SAAS;QAC5B,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI;QAChE,WAAW,EAAE,QAAQ,CAAC,KAAK;KAC5B,CAAC;AACJ,CAAC;AAsBD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAqC;IAErC,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,QAAQ,GAAG,GAAG,EAAE,SAAS,CAAC;IAChC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;IAChC,MAAM,SAAS,GAAG,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;IAClF,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,SAAS;YAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;;YAClD,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,QAAQ,CAAC,IAAI;YACnC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;IAC/D,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,OAAO;QACL,UAAU,EAAE;YACV,EAAE;YACF,KAAK,EAAE,MAAM,CAAC,IAAI;YAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;YACvD,WAAW,EAAE,WAAW;YACxB,YAAY,EAAE,KAAK;YACnB,cAAc,EAAE,YAAY;YAC5B,UAAU,EAAE,KAAK;YACjB,SAAS,EAAE,MAAM,CAAC,IAAI,KAAK,EAAE;YAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,cAAc,EAAE,MAAM,CAAC,aAAa,IAAI,MAAM,KAAK,SAAS;YAC5D,kBAAkB,EAAE,QAAQ;SAC7B;QACD,WAAW,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE;KACrD,CAAC;AACJ,CAAC;AAKD;;;;;;;;GAQG;AACH,MAAM,UAAU,qBAAqB,CAKnC,IAAsB,EACtB,QAAgB;IAEhB,OAAO;QACL,OAAO,EAAE;YACP,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,YAAY,KAAK,EAAE,CAAC;YAC7D,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;SAChF;QACD,MAAM,EAAE;YACN,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,gBAAgB,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;YACnF,MAAM,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,CACjC,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;SAC9D;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gusnips/react",
3
- "version": "0.9.33",
3
+ "version": "0.10.0",
4
4
  "description": "The headless runtime under a Vite + React SPA: typed fetch client with single-flight refresh, auth store, query defaults, route guards, error boundary, stale-tab recovery, i18n bootstrap.",
5
5
  "type": "module",
6
6
  "license": "MIT",