@gusnips/react 0.9.24 → 0.9.26

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.
Files changed (116) hide show
  1. package/README.md +173 -36
  2. package/dist/api-client.d.ts +51 -51
  3. package/dist/api-client.d.ts.map +1 -1
  4. package/dist/api-client.js +3 -3
  5. package/dist/api-error.d.ts +11 -11
  6. package/dist/api-error.js +11 -11
  7. package/dist/auth-email.d.ts +40 -0
  8. package/dist/auth-email.d.ts.map +1 -0
  9. package/dist/auth-email.js +106 -0
  10. package/dist/auth-email.js.map +1 -0
  11. package/dist/auth-store.d.ts +23 -23
  12. package/dist/auth-store.js +13 -13
  13. package/dist/commands.d.ts +80 -0
  14. package/dist/commands.d.ts.map +1 -0
  15. package/dist/commands.js +192 -0
  16. package/dist/commands.js.map +1 -0
  17. package/dist/copy.d.ts +3 -3
  18. package/dist/copy.js +3 -3
  19. package/dist/deploy-recovery.d.ts +40 -40
  20. package/dist/deploy-recovery.js +40 -40
  21. package/dist/describe-error.d.ts +68 -68
  22. package/dist/describe-error.d.ts.map +1 -1
  23. package/dist/describe-error.js +5 -5
  24. package/dist/error-boundary.d.ts +12 -12
  25. package/dist/guards.d.ts +15 -15
  26. package/dist/guards.js +3 -3
  27. package/dist/hydrate.d.ts +15 -16
  28. package/dist/hydrate.d.ts.map +1 -1
  29. package/dist/hydrate.js +9 -9
  30. package/dist/hydrate.js.map +1 -1
  31. package/dist/i18n.d.ts +15 -16
  32. package/dist/i18n.d.ts.map +1 -1
  33. package/dist/i18n.js +5 -6
  34. package/dist/i18n.js.map +1 -1
  35. package/dist/index.d.ts +1 -0
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +1 -0
  38. package/dist/index.js.map +1 -1
  39. package/dist/internal-path.d.ts +8 -7
  40. package/dist/internal-path.d.ts.map +1 -1
  41. package/dist/internal-path.js +8 -7
  42. package/dist/internal-path.js.map +1 -1
  43. package/dist/prerender-contract.d.ts +7 -7
  44. package/dist/prerender-contract.js +7 -7
  45. package/dist/query.d.ts +16 -17
  46. package/dist/query.d.ts.map +1 -1
  47. package/dist/query.js +2 -2
  48. package/dist/query.js.map +1 -1
  49. package/dist/sse.d.ts +19 -20
  50. package/dist/sse.d.ts.map +1 -1
  51. package/dist/sse.js +18 -19
  52. package/dist/sse.js.map +1 -1
  53. package/dist/states.d.ts +12 -12
  54. package/dist/states.d.ts.map +1 -1
  55. package/dist/supabase-session.d.ts +47 -48
  56. package/dist/supabase-session.d.ts.map +1 -1
  57. package/dist/supabase-session.js +35 -35
  58. package/dist/supabase-session.js.map +1 -1
  59. package/dist/theme.d.ts +4 -4
  60. package/dist/theme.js +4 -4
  61. package/dist/ui/class-name.d.ts +3 -4
  62. package/dist/ui/class-name.d.ts.map +1 -1
  63. package/dist/ui/class-name.js +3 -4
  64. package/dist/ui/class-name.js.map +1 -1
  65. package/dist/ui/combobox.d.ts +11 -11
  66. package/dist/ui/combobox.d.ts.map +1 -1
  67. package/dist/ui/dialog.d.ts +5 -5
  68. package/dist/ui/dialog.js +2 -2
  69. package/dist/ui/drawer.d.ts +10 -10
  70. package/dist/ui/drawer.d.ts.map +1 -1
  71. package/dist/ui/drawer.js +2 -2
  72. package/dist/ui/input.d.ts +2 -2
  73. package/dist/ui/input.js +2 -2
  74. package/dist/ui/menu.d.ts +9 -9
  75. package/dist/ui/menu.d.ts.map +1 -1
  76. package/dist/ui/menu.js +4 -4
  77. package/dist/ui/menu.js.map +1 -1
  78. package/dist/ui/select.d.ts +12 -12
  79. package/dist/ui/select.d.ts.map +1 -1
  80. package/dist/ui/select.js +3 -3
  81. package/dist/ui/tabs.d.ts +14 -15
  82. package/dist/ui/tabs.d.ts.map +1 -1
  83. package/dist/ui/tabs.js +13 -14
  84. package/dist/ui/tabs.js.map +1 -1
  85. package/package.json +5 -1
  86. package/src/api-client.ts +51 -51
  87. package/src/api-error.ts +11 -11
  88. package/src/auth-email.test.ts +145 -0
  89. package/src/auth-email.ts +112 -0
  90. package/src/auth-store.ts +23 -23
  91. package/src/commands-hook.test.ts +444 -0
  92. package/src/commands.test.ts +245 -0
  93. package/src/commands.ts +268 -0
  94. package/src/copy.ts +3 -3
  95. package/src/deploy-recovery.ts +40 -40
  96. package/src/describe-error.ts +68 -68
  97. package/src/error-boundary.tsx +12 -12
  98. package/src/guards.tsx +15 -15
  99. package/src/hydrate.ts +15 -16
  100. package/src/i18n.ts +15 -16
  101. package/src/index.ts +2 -0
  102. package/src/internal-path.ts +8 -7
  103. package/src/prerender-contract.ts +7 -7
  104. package/src/query.ts +16 -17
  105. package/src/sse.ts +19 -20
  106. package/src/states.ts +12 -12
  107. package/src/supabase-session.ts +46 -47
  108. package/src/theme.ts +4 -4
  109. package/src/ui/class-name.ts +3 -4
  110. package/src/ui/combobox.tsx +11 -11
  111. package/src/ui/dialog.tsx +5 -5
  112. package/src/ui/drawer.tsx +10 -10
  113. package/src/ui/input.tsx +2 -2
  114. package/src/ui/menu.tsx +8 -8
  115. package/src/ui/select.tsx +12 -12
  116. package/src/ui/tabs.tsx +14 -15
package/dist/query.d.ts CHANGED
@@ -1,37 +1,36 @@
1
1
  import type { DefaultOptions } from "@tanstack/react-query";
2
2
  /**
3
- * react-query defaults — the merge of three repos that each got part of this right.
3
+ * react-query defaults merged from three repos that each got part of this right.
4
4
  *
5
5
  * The default is three blind retries, which is wrong for an API that answers refusals
6
6
  * precisely: a 402, a 403 or a 451 says exactly the same thing three times, and a 429 we hammer
7
7
  * is a 429 we deserve. All three donors knew that much. What each knew alone:
8
8
  *
9
9
  * - one allowed **408** through, the only 4xx that a second attempt genuinely fixes;
10
- * - one refused to retry a 429 whose CODE says the limit is durable — a monthly quota or a
11
- * spent balance clears by buying, not by waiting, so retrying burns another request against
10
+ * - one refused to retry a 429 whose CODE says the limit is durable. A monthly quota or a spent balance clears by buying, not by waiting, so retrying burns another request against
12
11
  * the limiter and cannot succeed;
13
12
  * - one set **`refetchOnReconnect`**, which none of the others had, and which is the single
14
13
  * most useful refetch there is: coming back from a tunnel is exactly when the screen is stale.
15
14
  *
16
15
  * The second migration added the fourth rule, which no donor had: **when a 429 says how long,
17
16
  * believe it.** Its limiter answers `Retry-After: 60` on a per-minute window, and the default
18
- * backoff retries at 1s and 2s — two more requests that cannot succeed, both charged against the
19
- * same limiter, and three seconds added before the screen says anything. So a stated wait is
17
+ * backoff retries at 1s and 2s, sending two more requests that cannot succeed, both charged against
18
+ * the same limiter, and three seconds added before the screen says anything. So a stated wait is
20
19
  * waited out when it is short, and is an ANSWER when it is not.
21
20
  *
22
21
  * The fifth rule came from the server half of this fleet rather than from a donor: a refusal can
23
22
  * state that waiting will never fix it at all, by sending `details.retryAfterSecs: null`. Read as
24
- * "did not say how long" — which is what every version before this one did — that 429 is retried
25
- * against a limit no amount of time moves.
23
+ * "did not say how long", as every version before this one did, that 429 is retried against a limit
24
+ * no amount of time moves.
26
25
  *
27
26
  * This is invariant 8. The rule itself lives in `@gusnips/http/retry`, so an SDK with no React
28
27
  * in it follows the same one; what is here is the binding to react-query.
29
28
  */
30
29
  export interface QueryDefaultsOptions {
31
30
  /**
32
- * Error codes that mean "this limit does not clear by waiting" — a spent monthly quota, a
33
- * balance that needs topping up. They usually arrive as 402 or 429; the status alone cannot
34
- * tell them apart from a burst limit, which is why the caller names them.
31
+ * Error codes for limits that do not clear by waiting, such as a spent monthly quota or a balance
32
+ * that needs topping up. They usually arrive as 402 or 429; the status alone cannot tell them
33
+ * apart from a burst limit, which is why the caller names them.
35
34
  *
36
35
  * Only needed where the server does not say so itself. One that sends
37
36
  * `details.retryAfterSecs: null` has already made the claim and `shouldRetry` reads it, which
@@ -43,10 +42,10 @@ export interface QueryDefaultsOptions {
43
42
  /**
44
43
  * Longest stated wait still worth retrying. Default 10 seconds.
45
44
  *
46
- * Only applies when the refusal named its own expiry (`Retry-After`, or `retryAfterSecs` in
47
- * the body). A burst limit that clears in two seconds is worth sitting out; a monthly ceiling
48
- * that clears in an hour is an answer, and holding a spinner for it helps nobody — show the
49
- * wait instead, which is what `humanizeWait` is for.
45
+ * Only applies when the refusal named its own expiry (`Retry-After`, or `retryAfterSecs` in the
46
+ * body). A burst limit that clears in two seconds is worth sitting out; a monthly ceiling that
47
+ * clears in an hour is an answer, and holding a spinner for it helps nobody. Show the wait
48
+ * instead, which is what `humanizeWait` is for.
50
49
  */
51
50
  maxRetryWaitSecs?: number;
52
51
  staleTime?: number;
@@ -67,8 +66,8 @@ export interface QueryDefaultsOptions {
67
66
  export declare function shouldRetry(error: unknown, durableLimitCodes?: readonly string[], maxRetryWaitSecs?: number): boolean;
68
67
  /**
69
68
  * How long before the next attempt: the server's stated wait when there is one, an exponential
70
- * backoff with jitter otherwise, and never less than the backoff — a `Retry-After: 0` is a
71
- * server saying "immediately", which for a client that just got refused is still too soon.
69
+ * backoff with jitter otherwise, and never less than the backoff. A `Retry-After: 0` is a server
70
+ * saying "immediately", which for a client that just got refused is still too soon.
72
71
  */
73
72
  export declare function retryDelayMs(attemptIndex: number, error: unknown): number;
74
73
  export declare function queryDefaults({ durableLimitCodes, maxRetries, maxRetryWaitSecs, staleTime, gcTime, refetchOnWindowFocus, }?: QueryDefaultsOptions): DefaultOptions;
@@ -77,7 +76,7 @@ export declare function queryDefaults({ durableLimitCodes, maxRetries, maxRetryW
77
76
  * When it is ready, `refreshError` says whether the last refresh failed.
78
77
  *
79
78
  * **Never gate a screen on `isError`.** It is also true when a BACKGROUND refetch fails over data
80
- * already on screen — a window regaining focus, a poll, the invalidation after a save — so
79
+ * already on screen after a window regains focus, a poll or the invalidation after a save. So
81
80
  * `isError ? <failure panel> : <data>` throws away what the reader was looking at over one blip.
82
81
  * The adopters that had noticed each wrote `isLoadingError` beside a comment saying so; the ones
83
82
  * that had not were a boundary and a great many inline ternaries. A refresh that failed is not a
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,MAAM,WAAW,oBAAoB;IACnC;;;;;;;;OAQG;IACH,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,kFAAkF;IAClF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,OAAO,EACd,iBAAiB,GAAE,SAAS,MAAM,EAAO,EACzC,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAOT;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAEzE;AAYD,wBAAgB,aAAa,CAAC,EAC5B,iBAAsB,EACtB,UAAc,EACd,gBAAgB,EAChB,SAAyB,EACzB,MAAuB,EACvB,oBAA4B,GAC7B,GAAE,oBAAyB,GAAG,cAAc,CAe5C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,IAChC;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;CAAE,GAC7B;IAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAC/C;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,GAAG,IAAI,CAAA;CAAE,CAAC;AAEnF,wBAAgB,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE;IACrC,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;CAC3B,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAMlB"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,MAAM,WAAW,oBAAoB;IACnC;;;;;;;;OAQG;IACH,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,kFAAkF;IAClF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,OAAO,EACd,iBAAiB,GAAE,SAAS,MAAM,EAAO,EACzC,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAOT;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAEzE;AAYD,wBAAgB,aAAa,CAAC,EAC5B,iBAAsB,EACtB,UAAc,EACd,gBAAgB,EAChB,SAAyB,EACzB,MAAuB,EACvB,oBAA4B,GAC7B,GAAE,oBAAyB,GAAG,cAAc,CAe5C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,IAChC;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;CAAE,GAC7B;IAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAC/C;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,GAAG,IAAI,CAAA;CAAE,CAAC;AAEnF,wBAAgB,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE;IACrC,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;CAC3B,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAMlB"}
package/dist/query.js CHANGED
@@ -16,8 +16,8 @@ export function shouldRetry(error, durableLimitCodes = [], maxRetryWaitSecs) {
16
16
  }
17
17
  /**
18
18
  * How long before the next attempt: the server's stated wait when there is one, an exponential
19
- * backoff with jitter otherwise, and never less than the backoff — a `Retry-After: 0` is a
20
- * server saying "immediately", which for a client that just got refused is still too soon.
19
+ * backoff with jitter otherwise, and never less than the backoff. A `Retry-After: 0` is a server
20
+ * saying "immediately", which for a client that just got refused is still too soon.
21
21
  */
22
22
  export function retryDelayMs(attemptIndex, error) {
23
23
  return delayFor(attemptIndex, answerOf(error));
package/dist/query.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,IAAI,QAAQ,EAAE,WAAW,IAAI,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEzF,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AA+D1C;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CACzB,KAAc,EACd,oBAAuC,EAAE,EACzC,gBAAyB;IAEzB,gGAAgG;IAChG,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;QAChC,UAAU,EAAE,IAAI;QAChB,YAAY,EAAE,iBAAiB;QAC/B,WAAW,EAAE,gBAAgB;KAC9B,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,YAAoB,EAAE,KAAc;IAC/D,OAAO,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AACjD,CAAC;AAED;;;;;GAKG;AACH,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,KAAK,YAAY,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAC5B,iBAAiB,GAAG,EAAE,EACtB,UAAU,GAAG,CAAC,EACd,gBAAgB,EAChB,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,EACzB,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EACvB,oBAAoB,GAAG,KAAK,MACJ,EAAE;IAC1B,OAAO;QACL,OAAO,EAAE;YACP,SAAS;YACT,MAAM;YACN,KAAK,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,CAC7B,YAAY,GAAG,UAAU,IAAI,WAAW,CAAC,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,CAAC;YACtF,UAAU,EAAE,YAAY;YACxB,oBAAoB;YACpB,kBAAkB,EAAE,IAAI;SACzB;QACD,2FAA2F;QAC3F,yFAAyF;QACzF,SAAS,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;KAC5B,CAAC;AACJ,CAAC;AAkCD,MAAM,UAAU,SAAS,CAAO,KAG/B;IACC,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IACvB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC;IAClC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IAC7E,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACtD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAC9B,CAAC"}
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,IAAI,QAAQ,EAAE,WAAW,IAAI,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEzF,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AA8D1C;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CACzB,KAAc,EACd,oBAAuC,EAAE,EACzC,gBAAyB;IAEzB,gGAAgG;IAChG,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;QAChC,UAAU,EAAE,IAAI;QAChB,YAAY,EAAE,iBAAiB;QAC/B,WAAW,EAAE,gBAAgB;KAC9B,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,YAAoB,EAAE,KAAc;IAC/D,OAAO,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AACjD,CAAC;AAED;;;;;GAKG;AACH,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,KAAK,YAAY,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAC5B,iBAAiB,GAAG,EAAE,EACtB,UAAU,GAAG,CAAC,EACd,gBAAgB,EAChB,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,EACzB,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EACvB,oBAAoB,GAAG,KAAK,MACJ,EAAE;IAC1B,OAAO;QACL,OAAO,EAAE;YACP,SAAS;YACT,MAAM;YACN,KAAK,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,CAC7B,YAAY,GAAG,UAAU,IAAI,WAAW,CAAC,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,CAAC;YACtF,UAAU,EAAE,YAAY;YACxB,oBAAoB;YACpB,kBAAkB,EAAE,IAAI;SACzB;QACD,2FAA2F;QAC3F,yFAAyF;QACzF,SAAS,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;KAC5B,CAAC;AACJ,CAAC;AAkCD,MAAM,UAAU,SAAS,CAAO,KAG/B;IACC,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IACvB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC;IAClC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IAC7E,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACtD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAC9B,CAAC"}
package/dist/sse.d.ts CHANGED
@@ -1,25 +1,25 @@
1
1
  /**
2
2
  * Server-sent events: the framing and the transport, kept apart.
3
3
  *
4
- * Three donors had three readers and each had half the answer. One was spec-correct about the
5
- * wire but welded to `TextDecoderStream`, so the React Native app — whose fetch has no body
6
- * reader — could not use a line of it. One was a platform-free `feed(text)` that three
7
- * transports shared, and it silently dropped data. One was a whole second transport with its
8
- * own fetch and its own 401 handling, bypassing the app's only API client.
4
+ * Three donors had three readers and each had half the answer. One was spec-correct about the wire
5
+ * but welded to `TextDecoderStream`, so the React Native app, whose fetch has no body reader, could
6
+ * not use a line of it. One was a platform-free `feed(text)` that three transports shared, and it
7
+ * silently dropped data. One was a whole second transport with its own fetch and its own 401
8
+ * handling, bypassing the app's only API client.
9
9
  *
10
10
  * So: {@link createSseParser} is the state machine and knows about no platform at all;
11
11
  * {@link readSseStream} is fifteen lines of `ReadableStream` on top of it. A caller on a
12
12
  * platform without body readers keeps its own fifteen lines and shares the machine underneath.
13
13
  * (providerkit reached this exact split from the other direction and for the same reason.)
14
14
  *
15
- * And streams ride the ordinary API client — `client.request(path, {headers: {Accept:
16
- * "text/event-stream"}, timeoutMs: null})`. Not `EventSource`, which cannot carry an
17
- * Authorization header, and not a second fetch, which would need its own copy of the refresh
18
- * logic and would drift from it.
15
+ * And streams ride the ordinary API client: `client.request(path, {headers: {Accept:
16
+ * "text/event-stream"}, timeoutMs: null})`. Not `EventSource`, which cannot carry an Authorization
17
+ * header, and not a second fetch, which would need its own copy of the refresh logic and would
18
+ * drift from it.
19
19
  */
20
20
  /** One frame off the wire. `data` is raw text; see {@link createSseParser} on why. */
21
21
  export interface SseFrame {
22
- /** The `event:` field, or `"message"` — which is what the spec says an unnamed frame is. */
22
+ /** The `event:` field, or `"message"` for an unnamed frame, as the spec requires. */
23
23
  event: string;
24
24
  /** Every `data:` line in the frame, joined with newlines. Never parsed here. */
25
25
  data: string;
@@ -29,23 +29,22 @@ export interface SseFrame {
29
29
  /**
30
30
  * An incremental parser. Feed it text in whatever sizes the transport delivers.
31
31
  *
32
- * Frames split across reads are held until they complete, so a payload cut mid-line is never
33
- * lost or truncated — which is the failure this shape exists to prevent, and the one that only
34
- * shows up under a slow network.
32
+ * Frames split across reads are held until they complete, so a payload cut mid-line is never lost
33
+ * or truncated. That is the failure this shape exists to prevent, and the one that only shows up
34
+ * under a slow network.
35
35
  *
36
36
  * Three rules that are easy to get wrong, and one donor got each of them wrong:
37
37
  *
38
38
  * - **`data:` repeats.** A frame may carry several `data:` lines and they are JOINED with
39
- * newlines. One donor assigned instead of appending, so a multi-line payload arrived as its
40
- * last line only — no error, no warning, just a truncated message.
39
+ * newlines. One donor assigned instead of appending, so a multi-line payload arrived as its last line only, with no error or warning, just a truncated message.
41
40
  * - **Strip ONE leading space after the colon**, not all whitespace. `.trim()` is the obvious
42
41
  * thing and it corrupts any payload whose own content begins or ends with a space.
43
42
  * - **A frame with no `data:` is not dispatched.** That is what lets a server send bare
44
43
  * `event: heartbeat` keepalives, or `:` comment lines, without waking a consumer.
45
44
  *
46
- * `data` is handed back as a raw string and deliberately NOT JSON-parsed. One donor parsed here
47
- * and its three consumers wanted three different things — one wraps non-JSON, one uses a
48
- * tolerant parser, one parses directly. Parsing in the parser picks a policy for all of them.
45
+ * `data` is handed back as a raw string and deliberately NOT JSON-parsed. One donor parsed here and
46
+ * its three consumers wanted three different things: one wraps non-JSON, one uses a tolerant
47
+ * parser, one parses directly. Parsing in the parser picks a policy for all of them.
49
48
  */
50
49
  export declare function createSseParser(onFrame: (frame: SseFrame) => void): {
51
50
  feed: (text: string) => void;
@@ -57,8 +56,8 @@ export declare function createSseParser(onFrame: (frame: SseFrame) => void): {
57
56
  * single-flight refresh, and a 402 or a 404 arriving as an `ApiError` the page can explain
58
57
  * rather than an `onerror` event with nothing in it.
59
58
  *
60
- * Cancels the reader on the way out however it leaves — a stream abandoned without cancelling
61
- * holds the connection open until the server gives up on it.
59
+ * Cancels the reader on the way out however it leaves. A stream abandoned without cancelling holds
60
+ * the connection open until the server gives up on it.
62
61
  */
63
62
  export declare function readSseStream(response: Response, onFrame: (frame: SseFrame) => void): Promise<void>;
64
63
  //# sourceMappingURL=sse.d.ts.map
package/dist/sse.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../src/sse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,sFAAsF;AACtF,MAAM,WAAW,QAAQ;IACvB,4FAA4F;IAC5F,KAAK,EAAE,MAAM,CAAC;IACd,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAC;IACb,0FAA0F;IAC1F,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG;IACnE,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B,CAgBA;AAqBD;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GACjC,OAAO,CAAC,IAAI,CAAC,CAaf"}
1
+ {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../src/sse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,sFAAsF;AACtF,MAAM,WAAW,QAAQ;IACvB,qFAAqF;IACrF,KAAK,EAAE,MAAM,CAAC;IACd,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAC;IACb,0FAA0F;IAC1F,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG;IACnE,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B,CAgBA;AAqBD;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GACjC,OAAO,CAAC,IAAI,CAAC,CAaf"}
package/dist/sse.js CHANGED
@@ -1,42 +1,41 @@
1
1
  /**
2
2
  * Server-sent events: the framing and the transport, kept apart.
3
3
  *
4
- * Three donors had three readers and each had half the answer. One was spec-correct about the
5
- * wire but welded to `TextDecoderStream`, so the React Native app — whose fetch has no body
6
- * reader — could not use a line of it. One was a platform-free `feed(text)` that three
7
- * transports shared, and it silently dropped data. One was a whole second transport with its
8
- * own fetch and its own 401 handling, bypassing the app's only API client.
4
+ * Three donors had three readers and each had half the answer. One was spec-correct about the wire
5
+ * but welded to `TextDecoderStream`, so the React Native app, whose fetch has no body reader, could
6
+ * not use a line of it. One was a platform-free `feed(text)` that three transports shared, and it
7
+ * silently dropped data. One was a whole second transport with its own fetch and its own 401
8
+ * handling, bypassing the app's only API client.
9
9
  *
10
10
  * So: {@link createSseParser} is the state machine and knows about no platform at all;
11
11
  * {@link readSseStream} is fifteen lines of `ReadableStream` on top of it. A caller on a
12
12
  * platform without body readers keeps its own fifteen lines and shares the machine underneath.
13
13
  * (providerkit reached this exact split from the other direction and for the same reason.)
14
14
  *
15
- * And streams ride the ordinary API client — `client.request(path, {headers: {Accept:
16
- * "text/event-stream"}, timeoutMs: null})`. Not `EventSource`, which cannot carry an
17
- * Authorization header, and not a second fetch, which would need its own copy of the refresh
18
- * logic and would drift from it.
15
+ * And streams ride the ordinary API client: `client.request(path, {headers: {Accept:
16
+ * "text/event-stream"}, timeoutMs: null})`. Not `EventSource`, which cannot carry an Authorization
17
+ * header, and not a second fetch, which would need its own copy of the refresh logic and would
18
+ * drift from it.
19
19
  */
20
20
  /**
21
21
  * An incremental parser. Feed it text in whatever sizes the transport delivers.
22
22
  *
23
- * Frames split across reads are held until they complete, so a payload cut mid-line is never
24
- * lost or truncated — which is the failure this shape exists to prevent, and the one that only
25
- * shows up under a slow network.
23
+ * Frames split across reads are held until they complete, so a payload cut mid-line is never lost
24
+ * or truncated. That is the failure this shape exists to prevent, and the one that only shows up
25
+ * under a slow network.
26
26
  *
27
27
  * Three rules that are easy to get wrong, and one donor got each of them wrong:
28
28
  *
29
29
  * - **`data:` repeats.** A frame may carry several `data:` lines and they are JOINED with
30
- * newlines. One donor assigned instead of appending, so a multi-line payload arrived as its
31
- * last line only — no error, no warning, just a truncated message.
30
+ * newlines. One donor assigned instead of appending, so a multi-line payload arrived as its last line only, with no error or warning, just a truncated message.
32
31
  * - **Strip ONE leading space after the colon**, not all whitespace. `.trim()` is the obvious
33
32
  * thing and it corrupts any payload whose own content begins or ends with a space.
34
33
  * - **A frame with no `data:` is not dispatched.** That is what lets a server send bare
35
34
  * `event: heartbeat` keepalives, or `:` comment lines, without waking a consumer.
36
35
  *
37
- * `data` is handed back as a raw string and deliberately NOT JSON-parsed. One donor parsed here
38
- * and its three consumers wanted three different things — one wraps non-JSON, one uses a
39
- * tolerant parser, one parses directly. Parsing in the parser picks a policy for all of them.
36
+ * `data` is handed back as a raw string and deliberately NOT JSON-parsed. One donor parsed here and
37
+ * its three consumers wanted three different things: one wraps non-JSON, one uses a tolerant
38
+ * parser, one parses directly. Parsing in the parser picks a policy for all of them.
40
39
  */
41
40
  export function createSseParser(onFrame) {
42
41
  let buffer = "";
@@ -82,8 +81,8 @@ function parseFrame(raw) {
82
81
  * single-flight refresh, and a 402 or a 404 arriving as an `ApiError` the page can explain
83
82
  * rather than an `onerror` event with nothing in it.
84
83
  *
85
- * Cancels the reader on the way out however it leaves — a stream abandoned without cancelling
86
- * holds the connection open until the server gives up on it.
84
+ * Cancels the reader on the way out however it leaves. A stream abandoned without cancelling holds
85
+ * the connection open until the server gives up on it.
87
86
  */
88
87
  export async function readSseStream(response, onFrame) {
89
88
  if (!response.body)
package/dist/sse.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sse.js","sourceRoot":"","sources":["../src/sse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAYH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,eAAe,CAAC,OAAkC;IAGhE,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,OAAO;QACL,IAAI,CAAC,IAAY;YACf,yEAAyE;YACzE,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACtC,IAAI,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACjC,OAAO,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;gBAClB,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC/C,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;gBAC/B,IAAI,KAAK;oBAAE,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC1B,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,gGAAgG;AAChG,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,KAAK,GAAG,SAAS,CAAC;IACtB,IAAI,EAAsB,CAAC;IAC3B,MAAM,IAAI,GAAa,EAAE,CAAC;IAE1B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAClD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1E,IAAI,KAAK,KAAK,OAAO;YAAE,KAAK,GAAG,KAAK,CAAC;aAChC,IAAI,KAAK,KAAK,IAAI;YAAE,EAAE,GAAG,KAAK,CAAC;aAC/B,IAAI,KAAK,KAAK,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;AACzE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAAkB,EAClB,OAAkC;IAElC,IAAI,CAAC,QAAQ,CAAC,IAAI;QAAE,OAAO;IAC3B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;IAC9E,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,CAAC;QACH,SAAS,CAAC;YACR,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI;gBAAE,MAAM;YAChB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACxC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../src/sse.ts"],"names":[],"mappings":"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"}
package/dist/states.d.ts CHANGED
@@ -4,10 +4,10 @@ import type { ReactNode } from "react";
4
4
  * somebody remembers.
5
5
  *
6
6
  * **No component ships here, on purpose.** Seven repos have an `EmptyState.tsx` and an
7
- * `ErrorState.tsx`, and read side by side they overlap 9–37%: one draws a tinted icon badge,
8
- * one a branded illustration set, one a mascot. What they genuinely share is the PROP SHAPE —
9
- * which is the rule itself, and the only part a package can hold without deciding how eight
10
- * brands look. Same reasoning as the styled Button: share behaviour, skin per product.
7
+ * `ErrorState.tsx`, and read side by side they overlap 9–37%: one draws a tinted icon badge, one a
8
+ * branded illustration set, one a mascot. What they genuinely share is the PROP SHAPE, which is the
9
+ * rule itself, and the only part a package can hold without deciding how eight brands look. Same
10
+ * reasoning as the styled Button: share behaviour, skin per product.
11
11
  *
12
12
  * Import the type, write your own component against it, and the compiler enforces the rest.
13
13
  */
@@ -20,16 +20,16 @@ import type { ReactNode } from "react";
20
20
  * `action` is optional only because some panels fill themselves once a job upstream finishes.
21
21
  */
22
22
  export interface EmptyStateProps {
23
- /** What this panel is for. "No lookups yet" — not "No results". */
23
+ /** What this panel is for. Use "No lookups yet", not "No results". */
24
24
  title: string;
25
25
  /** What belongs here, and what it will show once it does. */
26
26
  description: ReactNode;
27
27
  /** The way forward, as a control. Usually one button. */
28
28
  action?: ReactNode;
29
29
  /**
30
- * `3` inside a panel that already sits under a page heading — the default and the common
31
- * case. `1` when this composer IS the page (a 404, a suspended account), which otherwise
32
- * ships a document with no `h1` in it at all.
30
+ * Defaults to `3` for a panel that already sits under a page heading, the common case. `1` when
31
+ * this composer IS the page (a 404, a suspended account), which otherwise ships a document with
32
+ * no `h1` in it at all.
33
33
  *
34
34
  * Only one donor had this, and it is the difference between a screen reader announcing a
35
35
  * page and announcing nothing.
@@ -46,9 +46,9 @@ export interface EmptyStateProps {
46
46
  * Something did not work.
47
47
  *
48
48
  * `problem` names what failed, `cause` says why it most likely happened, `fix` says what to do
49
- * about it, and `action` is that fix as a control. **`fix` and `action` are both required** — a
50
- * required prop is the only version of "never dead-end" that a caller in a hurry cannot skip,
51
- * and the donor that made them required is the one whose error screens all have a way out.
49
+ * about it, and `action` is that fix as a control. **`fix` and `action` are both required**. A
50
+ * required prop is the only version of "never dead-end" that a caller in a hurry cannot skip, and
51
+ * the donor that made them required is the one whose error screens all have a way out.
52
52
  *
53
53
  * Not a place for a stack trace. `cause` is what a person can act on ("the site answered too
54
54
  * slowly"), with the request id, if there is one, alongside it in `reference`.
@@ -63,7 +63,7 @@ export interface ErrorStateProps {
63
63
  cause?: ReactNode;
64
64
  /** The way forward, in words. */
65
65
  fix: ReactNode;
66
- /** The way forward, as a control — usually a retry button. */
66
+ /** The way forward as a control, usually a retry button. */
67
67
  action: ReactNode;
68
68
  /** A request id or code, for a support thread. Set in mono, never shouted. */
69
69
  reference?: ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"states.d.ts","sourceRoot":"","sources":["../src/states.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC;;;;;;;;;;;GAWG;AAEH;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC9B,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,WAAW,EAAE,SAAS,CAAC;IACvB,yDAAyD;IACzD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB;;;;;;;;;;;;OAYG;IACH,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,eAAe;IAC9B,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,iCAAiC;IACjC,GAAG,EAAE,SAAS,CAAC;IACf,8DAA8D;IAC9D,MAAM,EAAE,SAAS,CAAC;IAClB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,gDAAgD;IAChD,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
1
+ {"version":3,"file":"states.d.ts","sourceRoot":"","sources":["../src/states.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC;;;;;;;;;;;GAWG;AAEH;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC9B,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,WAAW,EAAE,SAAS,CAAC;IACvB,yDAAyD;IACzD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB;;;;;;;;;;;;OAYG;IACH,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,eAAe;IAC9B,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,iCAAiC;IACjC,GAAG,EAAE,SAAS,CAAC;IACf,4DAA4D;IAC5D,MAAM,EAAE,SAAS,CAAC;IAClB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,gDAAgD;IAChD,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
@@ -32,33 +32,33 @@ export interface SupabaseSessionStorage {
32
32
  * Auth FAILED rather than answered, so nothing is known about the credential it was handed:
33
33
  * either the request never landed, or GoTrue failed on its own.
34
34
  *
35
- * This is the question every site that ends a session has to ask — a token refresh, an API
36
- * door, and a callback choosing between "try again" and "that link is spent". Without it one
37
- * bad minute at GoTrue signs out everybody whose token happened to need refreshing, and tells
38
- * everybody clicking a recovery link that it has expired, which sends them to ask the service
39
- * that is down for a replacement.
35
+ * This is the question every site that ends a session has to ask: a token refresh, an API door, and
36
+ * a callback choosing between "try again" and "that link is spent". Without it one bad minute at
37
+ * GoTrue signs out everybody whose token happened to need refreshing, and tells everybody clicking
38
+ * a recovery link that it has expired, which sends them to ask the service that is down for a
39
+ * replacement.
40
40
  *
41
41
  * Both clauses carry weight, and the second is why this is a function rather than one call.
42
42
  * `isAuthRetryableFetchError` is a NAME check, and the statuses that earn that name are a list
43
- * auth-js owns. The list has drifted — 502, 503 and 504 at 2.91; those plus the 52x family and
44
- * still no 500 at 2.106; 500 through 530 at 2.108 — so code leaning on it alone is right at
45
- * whichever version happens to be installed, which is not the same as being right, and a fleet
46
- * installs several versions at once. It is also a LIST rather than a range, so it has holes at
47
- * every version, drift or no drift: at 2.112 nothing covers 505 through 519 or 531 up, and a
48
- * 507 or a 599 with a JSON body arrives as a plain `AuthApiError`. Pinning a recent SDK does not
49
- * make the status clause redundant.
50
- *
51
- * The same statuses with a body that is NOT JSON — a proxy's HTML page — arrive as an
52
- * `AuthUnknownError`, which carries no status at any status, so nothing here can tell that 507
53
- * from a malformed 400. It answers false for both, on purpose: reading an unreadable 4xx as an
54
- * outage would leave a dead session retrying forever, which is the other half of the same bug.
43
+ * auth-js owns. The list has drifted: 502, 503 and 504 at 2.91; those plus the 52x family and still
44
+ * no 500 at 2.106; 500 through 530 at 2.108. Code leaning on it alone is right at whichever version
45
+ * happens to be installed, which is not the same as being right, and a fleet installs several
46
+ * versions at once. It is also a LIST rather than a range, so it has holes at every version, drift
47
+ * or no drift: at 2.112 nothing covers 505 through 519 or 531 up, and a 507 or a 599 with a JSON
48
+ * body arrives as a plain `AuthApiError`. Pinning a recent SDK does not make the status clause
49
+ * redundant.
50
+ *
51
+ * The same statuses with a body that is NOT JSON, such as a proxy's HTML page, arrive as an
52
+ * `AuthUnknownError`, which carries no status at any status, so nothing here can tell that 507 from
53
+ * a malformed 400. It answers false for both, on purpose: reading an unreadable 4xx as an outage
54
+ * would leave a dead session retrying forever, which is the other half of the same bug.
55
55
  *
56
56
  * Read the version a tree really serves with `bun why @supabase/auth-js`, which prints one
57
57
  * heading per RESOLVED version; `node_modules` keeps copies the resolver does not serve.
58
58
  *
59
- * Anything that is not an auth error at all answers true: a failure from outside auth-js is not
60
- * a verdict on the credential either. Nothing at all answers false — `null` is what every
61
- * supabase-js auth call returns on success, and success is not an outage.
59
+ * Anything that is not an auth error at all answers true: a failure from outside auth-js is not a
60
+ * verdict on the credential either. Nothing at all answers false. `null` is what every supabase-js
61
+ * auth call returns on success, and success is not an outage.
62
62
  */
63
63
  export declare function isAuthOutage(error: unknown): boolean;
64
64
  /**
@@ -108,12 +108,12 @@ export declare function supabaseAuthStorage(supabaseUrl: string): SupabaseSessio
108
108
  * 2.116.0 and 41–51 s at 2.106.2. Nobody at a shared computer waits that long, and a page that
109
109
  * navigates away in the meantime takes the removal with it.
110
110
  *
111
- * It resolves once the stored session is gone. `error` is `null` when auth ended the session on
112
- * the server too. Otherwise it is the reason auth did not — its error, a thrown value, or the
113
- * deadline — and the session may still be live on the server and on other devices. `SIGNED_OUT`
114
- * arrives once auth-js has finished with the first call: about 100 ms later from 2.108.2 on, and
115
- * up to 22 s later at 2.106.2. If your screen does not reload, clear your own store when this
116
- * resolves instead of waiting for the event.
111
+ * It resolves once the stored session is gone. `error` is `null` when auth ended the session on the
112
+ * server too. Otherwise it is the reason auth did not: its error, a thrown value or the deadline.
113
+ * The session may still be live on the server and on other devices. `SIGNED_OUT` arrives once
114
+ * auth-js has finished with the first call: about 100 ms later from 2.108.2 on, and up to 22 s
115
+ * later at 2.106.2. If your screen does not reload, clear your own store when this resolves instead
116
+ * of waiting for the event.
117
117
  */
118
118
  export declare function signOutEvenOffline(auth: Pick<SupabaseSessionAuth, "signOut">, { storage, storageKey }: SupabaseSessionStorage): Promise<{
119
119
  error: unknown;
@@ -138,7 +138,7 @@ export declare function signOutEvenOffline(auth: Pick<SupabaseSessionAuth, "sign
138
138
  */
139
139
  export declare function createSupabaseSessionAdapter(auth: SupabaseSessionAuth, stored?: SupabaseSessionStorage): SessionAdapter;
140
140
  /**
141
- * Every link type a GoTrue email can carry — not only the ones this app's templates send today.
141
+ * Every link type a GoTrue email can carry, including ones this app's templates do not send today.
142
142
  * One donor rejected `invite` because "invites are never sent", which was true of the product and
143
143
  * false of the deployment: an operator inviting somebody from Studio sent a branded email whose
144
144
  * link then said it was invalid. A type the templates never emit costs nothing to accept: the hash
@@ -146,9 +146,9 @@ export declare function createSupabaseSessionAdapter(auth: SupabaseSessionAuth,
146
146
  *
147
147
  * Closed on purpose: auth-js's own `EmailOtpType` ends in `(string & {})`, so it cannot make a
148
148
  * destination map name every case. `Record<EmailLinkType, string>` can, and that is where an app
149
- * decides that `recovery` and `invite` both continue to the new-password screen — GoTrue creates
150
- * an invited account with NO password, so landing one "inside" signs them in once and locks them
151
- * out after.
149
+ * decides that `recovery` and `invite` both continue to the new-password screen. GoTrue creates an
150
+ * invited account with NO password, so landing one "inside" signs them in once and locks them out
151
+ * after.
152
152
  */
153
153
  export type EmailLinkType = "signup" | "invite" | "magiclink" | "recovery" | "email_change" | "email";
154
154
  /** Everything an auth callback address can carry, decided from the address alone. */
@@ -161,10 +161,10 @@ export type AuthCallback =
161
161
  }
162
162
  /**
163
163
  * A session arriving in the address: a PKCE `code`, or the implicit flow's tokens. In a browser
164
- * with `detectSessionInUrl` on, the client has already taken it — wait for the session, and do
165
- * not trade it again, which would be a second exchange racing the first. Where nothing reads
166
- * the address for you (React Native), `credential` is what `exchangeCodeForSession` or
167
- * `setSession` takes.
164
+ * with `detectSessionInUrl` on, the client has already taken it. Wait for the session, and do not
165
+ * trade it again, which would be a second exchange racing the first. Where nothing reads the
166
+ * address for you (React Native), `credential` is what `exchangeCodeForSession` or `setSession`
167
+ * takes.
168
168
  */
169
169
  | {
170
170
  kind: "session";
@@ -177,10 +177,9 @@ export type AuthCallback =
177
177
  };
178
178
  }
179
179
  /**
180
- * GoTrue, or the provider behind it, reported a failure in the address. `code` is GoTrue's
181
- * stable `error_code` (`otp_expired`, `bad_oauth_state`, …) and is what to choose words by;
182
- * `error_description` is left out on purpose — it is English-only and often names the wrong
183
- * cause.
180
+ * GoTrue, or the provider behind it, reported a failure in the address. `code` is GoTrue's stable
181
+ * `error_code` (`otp_expired`, `bad_oauth_state`, …) and is what to choose words by;
182
+ * `error_description` is left out because it is English-only and often names the wrong cause.
184
183
  */
185
184
  | {
186
185
  kind: "error";
@@ -194,19 +193,19 @@ export type AuthCallback =
194
193
  };
195
194
  /**
196
195
  * Reads an auth callback address. Pure, so every edge case is testable without a router or a
197
- * client — pass `location.search` and `location.hash`, or the two halves of a deep link.
196
+ * client. Pass `location.search` and `location.hash`, or the two halves of a deep link.
198
197
  *
199
- * GoTrue writes a failure into the FRAGMENT on every path and into the query only on some — the
200
- * query too after a provider round trip, the fragment alone after an implicit-flow email link —
201
- * so a callback reading one of the two misses a failure the other carries, and the person lands
198
+ * GoTrue writes a failure into the FRAGMENT on every path and into the query only on some. After a
199
+ * provider round trip, it writes both; after an implicit-flow email link, it writes the fragment
200
+ * alone. A callback reading one of the two misses a failure the other carries, and the person lands
202
201
  * on a screen that says nothing. Both are read here.
203
202
  *
204
- * `cancelled` is the provider refusing on its own, which for Google is the person pressing Cancel
205
- * — their choice, not a failure to report. It is NOT `error === "access_denied"`: GoTrue writes
206
- * that same value for an expired email link, a banned user and a disabled signup, each with an
207
- * `error_code` beside it, while a refusal relayed from the provider arrives with none. The obvious
208
- * test reads an expired link as a change of mind. And `error` itself is absent for a status
209
- * outside GoTrue's OAuth mapping — a rate-limited link arrives with `error_code` alone.
203
+ * `cancelled` is the provider refusing on its own, which for Google is the person pressing Cancel.
204
+ * That is their choice, not a failure to report. It is NOT `error === "access_denied"`: GoTrue
205
+ * writes that same value for an expired email link, a banned user and a disabled signup, each with
206
+ * an `error_code` beside it, while a refusal relayed from the provider arrives with none. The
207
+ * obvious test reads an expired link as a change of mind. And `error` itself is absent for a status
208
+ * outside GoTrue's OAuth mapping. A rate-limited link arrives with `error_code` alone.
210
209
  */
211
210
  export declare function parseAuthCallback(search: string | URLSearchParams, hash?: string): AuthCallback;
212
211
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"supabase-session.d.ts","sourceRoot":"","sources":["../src/supabase-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,OAAO,EAGZ,KAAK,gBAAgB,EACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE3E,UAAU,qBAAqB;IAC7B,IAAI,EAAE;QAAE,OAAO,EAAE;YAAE,YAAY,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAA;KAAE,CAAC;CACpD;AAED,8FAA8F;AAC9F,MAAM,WAAW,mBAAmB;IAClC,UAAU,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC7C,cAAc,IAAI,OAAO,CAAC,qBAAqB,GAAG;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACtE,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACzD;AAED;;;;;;GAMG;AACH,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAUD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CASpD;AAaD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,sBAAsB,CAE/E;AA2BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,IAAI,CAAC,mBAAmB,EAAE,SAAS,CAAC,EAC1C,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,sBAAsB,GAC9C,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,CAyB7B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,mBAAmB,EACzB,MAAM,CAAC,EAAE,sBAAsB,GAC9B,cAAc,CAsBhB;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,aAAa,GACvB,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,GAAG,cAAc,GAAG,OAAO,CAAC;AAiB5E,qFAAqF;AACrF,MAAM,MAAM,YAAY;AACtB,0FAA0F;AACxF;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,aAAa,CAAA;CAAE;AAChE;;;;;;GAMG;GACD;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;CAChF;AACH;;;;;GAKG;GACD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE;AAClF,qFAAqF;GACnF;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAExB;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,EAAE,IAAI,SAAK,GAAG,YAAY,CA6B3F"}
1
+ {"version":3,"file":"supabase-session.d.ts","sourceRoot":"","sources":["../src/supabase-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,OAAO,EAGZ,KAAK,gBAAgB,EACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE3E,UAAU,qBAAqB;IAC7B,IAAI,EAAE;QAAE,OAAO,EAAE;YAAE,YAAY,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAA;KAAE,CAAC;CACpD;AAED,8FAA8F;AAC9F,MAAM,WAAW,mBAAmB;IAClC,UAAU,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC7C,cAAc,IAAI,OAAO,CAAC,qBAAqB,GAAG;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACtE,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACzD;AAED;;;;;;GAMG;AACH,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAUD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CASpD;AAaD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,sBAAsB,CAE/E;AA2BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,IAAI,CAAC,mBAAmB,EAAE,SAAS,CAAC,EAC1C,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,sBAAsB,GAC9C,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,CAyB7B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,mBAAmB,EACzB,MAAM,CAAC,EAAE,sBAAsB,GAC9B,cAAc,CAsBhB;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,aAAa,GACvB,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,GAAG,cAAc,GAAG,OAAO,CAAC;AAiB5E,qFAAqF;AACrF,MAAM,MAAM,YAAY;AACtB,0FAA0F;AACxF;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,aAAa,CAAA;CAAE;AAChE;;;;;;GAMG;GACD;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;CAChF;AACH;;;;GAIG;GACD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE;AAClF,qFAAqF;GACnF;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAExB;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,EAAE,IAAI,SAAK,GAAG,YAAY,CA6B3F"}