@hexclave/next 1.0.66 → 1.0.68

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 (108) hide show
  1. package/dist/{admin-app-impl-2gZ3JWa0.d.ts → admin-app-impl-DFjllAVr.d.ts} +10 -5
  2. package/dist/admin-app-impl-DFjllAVr.d.ts.map +1 -0
  3. package/dist/clickmap/clickmap-core.d.ts +1 -1
  4. package/dist/clickmap/index.d.ts +1 -1
  5. package/dist/{client-app-BlA5Ptxs.d.ts → client-app-CE8FTKgO.d.ts} +13 -6
  6. package/dist/client-app-CE8FTKgO.d.ts.map +1 -0
  7. package/dist/components/selected-team-switcher.d.ts +1 -1
  8. package/dist/components/team-icon.d.ts +1 -1
  9. package/dist/components/team-switcher.d.ts +1 -1
  10. package/dist/components-page/account-settings/payments/payments-page.d.ts +1 -1
  11. package/dist/components-page/account-settings/teams/leave-team-section.d.ts +1 -1
  12. package/dist/components-page/account-settings/teams/team-api-keys-section.d.ts +1 -1
  13. package/dist/components-page/account-settings/teams/team-display-name-section.d.ts +1 -1
  14. package/dist/components-page/account-settings/teams/team-member-invitation-section.d.ts +1 -1
  15. package/dist/components-page/account-settings/teams/team-member-list-section.d.ts +1 -1
  16. package/dist/components-page/account-settings/teams/team-page.d.ts +1 -1
  17. package/dist/components-page/account-settings/teams/team-profile-image-section.d.ts +1 -1
  18. package/dist/components-page/account-settings/teams/team-profile-user-section.d.ts +1 -1
  19. package/dist/components-page/hexclave-handler-client.d.ts +1 -1
  20. package/dist/components-page/hexclave-handler.d.ts +1 -1
  21. package/dist/components-page/onboarding.js +11 -1
  22. package/dist/components-page/onboarding.js.map +1 -1
  23. package/dist/components-page/onboarding.test.d.ts +1 -0
  24. package/dist/components-page/onboarding.test.js +151 -0
  25. package/dist/components-page/onboarding.test.js.map +1 -0
  26. package/dist/dev-tool/dev-tool-core.d.ts +1 -1
  27. package/dist/dev-tool/index.d.ts +1 -1
  28. package/dist/esm/components-page/onboarding.js +11 -1
  29. package/dist/esm/components-page/onboarding.js.map +1 -1
  30. package/dist/esm/components-page/onboarding.test.d.ts +1 -0
  31. package/dist/esm/components-page/onboarding.test.js +150 -0
  32. package/dist/esm/components-page/onboarding.test.js.map +1 -0
  33. package/dist/esm/generated/quetzal-translations.d.ts +2 -2
  34. package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts +1 -1
  35. package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +1 -1
  36. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.d.ts +7 -2
  37. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.d.ts.map +1 -1
  38. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js +22 -5
  39. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -1
  40. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.sign-in-cache-warmup.test.d.ts +1 -0
  41. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.sign-in-cache-warmup.test.js +97 -0
  42. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.sign-in-cache-warmup.test.js.map +1 -0
  43. package/dist/esm/lib/hexclave-app/apps/implementations/common.js +2 -2
  44. package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.d.ts.map +1 -1
  45. package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.js +1 -4
  46. package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.js.map +1 -1
  47. package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.d.ts +1 -1
  48. package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.d.ts.map +1 -1
  49. package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.js.map +1 -1
  50. package/dist/esm/lib/hexclave-app/teams/index.d.ts +1 -0
  51. package/dist/esm/lib/hexclave-app/teams/index.d.ts.map +1 -1
  52. package/dist/esm/lib/hexclave-app/teams/index.js.map +1 -1
  53. package/dist/esm/lib/hexclave-app/users/index.d.ts +10 -4
  54. package/dist/esm/lib/hexclave-app/users/index.d.ts.map +1 -1
  55. package/dist/esm/lib/hexclave-app/users/index.js.map +1 -1
  56. package/dist/generated/quetzal-translations.d.ts +1 -1
  57. package/dist/{hexclave-provider-BxrgPM5P.d.ts → hexclave-provider-CVCzN4xG.d.ts} +3 -3
  58. package/dist/{hexclave-provider-BxrgPM5P.d.ts.map → hexclave-provider-CVCzN4xG.d.ts.map} +1 -1
  59. package/dist/{hooks-4BBvIKWJ.d.ts → hooks-BNF4UvGF.d.ts} +2 -2
  60. package/dist/{hooks-4BBvIKWJ.d.ts.map → hooks-BNF4UvGF.d.ts.map} +1 -1
  61. package/dist/{index-DDICHT5X.d.ts → index-g1JoVgIu.d.ts} +2 -2
  62. package/dist/{index-DDICHT5X.d.ts.map → index-g1JoVgIu.d.ts.map} +1 -1
  63. package/dist/index.d.ts +4 -4
  64. package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts +1 -1
  65. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.d.ts +1 -1
  66. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js +22 -5
  67. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -1
  68. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.sign-in-cache-warmup.test.d.ts +1 -0
  69. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.sign-in-cache-warmup.test.js +96 -0
  70. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.sign-in-cache-warmup.test.js.map +1 -0
  71. package/dist/lib/hexclave-app/apps/implementations/common.js +2 -2
  72. package/dist/lib/hexclave-app/apps/implementations/index.d.ts +1 -1
  73. package/dist/lib/hexclave-app/apps/implementations/server-app-impl.d.ts +1 -1
  74. package/dist/lib/hexclave-app/apps/implementations/server-app-impl.js +1 -4
  75. package/dist/lib/hexclave-app/apps/implementations/server-app-impl.js.map +1 -1
  76. package/dist/lib/hexclave-app/apps/index.d.ts +1 -1
  77. package/dist/lib/hexclave-app/apps/interfaces/admin-app.d.ts +1 -1
  78. package/dist/lib/hexclave-app/apps/interfaces/client-app.d.ts +1 -1
  79. package/dist/lib/hexclave-app/apps/interfaces/client-app.js.map +1 -1
  80. package/dist/lib/hexclave-app/apps/interfaces/server-app.d.ts +1 -1
  81. package/dist/lib/hexclave-app/index.d.ts +1 -1
  82. package/dist/lib/hexclave-app/projects/index.d.ts +1 -1
  83. package/dist/lib/hexclave-app/teams/index.d.ts +1 -1
  84. package/dist/lib/hexclave-app/teams/index.js.map +1 -1
  85. package/dist/lib/hexclave-app/users/index.d.ts +1 -1
  86. package/dist/lib/hexclave-app/users/index.js.map +1 -1
  87. package/dist/lib/hooks.d.ts +1 -1
  88. package/dist/providers/hexclave-context.d.ts +1 -1
  89. package/dist/providers/hexclave-provider-client.d.ts +1 -1
  90. package/dist/providers/hexclave-provider.d.ts +1 -1
  91. package/dist/providers/translation-provider.d.ts +1 -1
  92. package/dist/pushed-config-error-overlay/index.d.ts +1 -1
  93. package/dist/{quetzal-translations-XeH3zQ9l.d.ts → quetzal-translations-DVNj-zsr.d.ts} +3 -3
  94. package/dist/{quetzal-translations-XeH3zQ9l.d.ts.map → quetzal-translations-DVNj-zsr.d.ts.map} +1 -1
  95. package/dist/{translation-provider-WOaZXqAz.d.ts → translation-provider-DPFkLbrw.d.ts} +2 -2
  96. package/dist/{translation-provider-WOaZXqAz.d.ts.map → translation-provider-DPFkLbrw.d.ts.map} +1 -1
  97. package/package.json +4 -4
  98. package/src/components-page/onboarding.test.tsx +182 -0
  99. package/src/components-page/onboarding.tsx +17 -0
  100. package/src/integrations/convex/component/README.md +4 -4
  101. package/src/lib/hexclave-app/apps/implementations/client-app-impl.sign-in-cache-warmup.test.ts +94 -0
  102. package/src/lib/hexclave-app/apps/implementations/client-app-impl.ts +33 -8
  103. package/src/lib/hexclave-app/apps/implementations/server-app-impl.ts +1 -10
  104. package/src/lib/hexclave-app/apps/interfaces/client-app.ts +1 -1
  105. package/src/lib/hexclave-app/teams/index.ts +1 -0
  106. package/src/lib/hexclave-app/users/index.ts +9 -4
  107. package/dist/admin-app-impl-2gZ3JWa0.d.ts.map +0 -1
  108. package/dist/client-app-BlA5Ptxs.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"quetzal-translations-XeH3zQ9l.d.ts","names":[],"sources":["../src/generated/quetzal-translations.ts"],"mappings":";cAUa,WAAA,EAAW,GAAA;AAAA,cAqTX,cAAA,EAAc,GAAA,mIAAA,GAAA,66qBAAA,GAAA,usnBAAA,GAAA,iyrBAAA,GAAA,g+qBAAA,GAAA,8srBAAA,GAAA,2trBAAA,GAAA,41pBAAA,GAAA,m3eAAA,GAAA,oreAAA,GAAA,swpBAAA,GAAA,+0qBAAA,GAAA,8wbAAA,GAAA"}
1
+ {"version":3,"file":"quetzal-translations-DVNj-zsr.d.ts","names":[],"sources":["../src/generated/quetzal-translations.ts"],"mappings":";cAUa,WAAA,EAAW,GAAA;AAAA,cAqTX,cAAA,EAAc,GAAA,mIAAA,GAAA,66qBAAA,GAAA,usnBAAA,GAAA,iyrBAAA,GAAA,g+qBAAA,GAAA,8srBAAA,GAAA,2trBAAA,GAAA,41pBAAA,GAAA,m3eAAA,GAAA,oreAAA,GAAA,swpBAAA,GAAA,+0qBAAA,GAAA,8wbAAA,GAAA"}
@@ -1,4 +1,4 @@
1
- import { n as quetzalLocales } from "./quetzal-translations-XeH3zQ9l.js";
1
+ import { n as quetzalLocales } from "./quetzal-translations-DVNj-zsr.js";
2
2
 
3
3
  //#region src/providers/translation-provider.d.ts
4
4
  declare function TranslationProvider({
@@ -12,4 +12,4 @@ declare function TranslationProvider({
12
12
  }): import("react/jsx-runtime").JSX.Element;
13
13
  //#endregion
14
14
  export { TranslationProvider as t };
15
- //# sourceMappingURL=translation-provider-WOaZXqAz.d.ts.map
15
+ //# sourceMappingURL=translation-provider-DPFkLbrw.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"translation-provider-WOaZXqAz.d.ts","names":[],"sources":["../src/providers/translation-provider.tsx"],"mappings":";;;iBAQgB,mBAAA;EAAsB,IAAA;EAAM,oBAAA;EAAsB;AAAA;EAChE,IAAA,EAAM,UAAA,QAAkB,cAAA,CAAe,GAAA;EACvC,oBAAA,GAAuB,MAAA;EACvB,QAAA,EAAU,KAAA,CAAM,SAAA;AAAA,gCACjB,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"translation-provider-DPFkLbrw.d.ts","names":[],"sources":["../src/providers/translation-provider.tsx"],"mappings":";;;iBAQgB,mBAAA;EAAsB,IAAA;EAAM,oBAAA;EAAsB;AAAA;EAChE,IAAA,EAAM,UAAA,QAAkB,cAAA,CAAe,GAAA;EACvC,oBAAA,GAAuB,MAAA;EACvB,QAAA,EAAU,KAAA,CAAM,SAAA;AAAA,gCACjB,GAAA,CAAA,OAAA"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "//": "THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template (FOR package.json FILES, PLEASE EDIT package-template.json)",
3
3
  "name": "@hexclave/next",
4
- "version": "1.0.66",
4
+ "version": "1.0.68",
5
5
  "repository": "https://github.com/hexclave/hexclave",
6
6
  "sideEffects": false,
7
7
  "main": "./dist/index.js",
@@ -74,9 +74,9 @@
74
74
  "tailwindcss-animate": "^1.0.7",
75
75
  "rrweb": "^1.1.3",
76
76
  "yup": "^1.7.1",
77
- "@hexclave/sc": "1.0.66",
78
- "@hexclave/ui": "1.0.66",
79
- "@hexclave/shared": "1.0.66"
77
+ "@hexclave/shared": "1.0.68",
78
+ "@hexclave/sc": "1.0.68",
79
+ "@hexclave/ui": "1.0.68"
80
80
  },
81
81
  "peerDependencies": {
82
82
  "@types/react": ">=18.0.0",
@@ -0,0 +1,182 @@
1
+
2
+ //===========================================
3
+ // THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template
4
+ //===========================================
5
+ // @vitest-environment jsdom
6
+
7
+ import React, { act } from "react";
8
+ import { createRoot, type Root } from "react-dom/client";
9
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
10
+ import type { CurrentUser } from "../lib/hexclave-app";
11
+ import type { StackClientApp } from "../lib/hexclave-app/apps/interfaces/client-app";
12
+ import { TranslationProviderClient } from "../providers/translation-provider-client";
13
+ import { Onboarding } from "./onboarding";
14
+
15
+ const appMockState = vi.hoisted(() => ({
16
+ app: null as unknown,
17
+ user: null as unknown,
18
+ }));
19
+
20
+ vi.mock("..", () => ({
21
+ useStackApp: () => {
22
+ if (appMockState.app == null) {
23
+ throw new Error("Expected test app to be set before rendering.");
24
+ }
25
+ return appMockState.app;
26
+ },
27
+ useUser: () => appMockState.user,
28
+ }));
29
+
30
+ vi.mock("@hexclave/ui", async () => {
31
+ const React = await import("react");
32
+ return {
33
+ Button: (props: { children: React.ReactNode, onClick?: () => void }) => (
34
+ <button type="button" onClick={props.onClick}>{props.children}</button>
35
+ ),
36
+ Input: (props: Record<string, unknown>) => <input {...props} />,
37
+ Typography: (props: { children: React.ReactNode }) => <div>{props.children}</div>,
38
+ cn: (...classes: (string | false | null | undefined)[]) => classes.filter(Boolean).join(" "),
39
+ };
40
+ });
41
+
42
+ const previousActEnvironment = Reflect.get(globalThis, "IS_REACT_ACT_ENVIRONMENT");
43
+
44
+ function createAppTestDouble() {
45
+ const app = {
46
+ redirectToSignIn: vi.fn(async () => {}),
47
+ redirectToAfterSignIn: vi.fn(async () => {}),
48
+ };
49
+
50
+ // This test double intentionally implements only the StackClientApp surface that Onboarding touches.
51
+ return app as unknown as StackClientApp<true> & {
52
+ redirectToSignIn: ReturnType<typeof vi.fn>,
53
+ redirectToAfterSignIn: ReturnType<typeof vi.fn>,
54
+ };
55
+ }
56
+
57
+ function createUserTestDouble(user: Partial<CurrentUser>) {
58
+ // Same as the app test double: only the surface Onboarding touches.
59
+ return {
60
+ isAnonymous: false,
61
+ isRestricted: true,
62
+ restrictedReason: null,
63
+ restrictedByAdmin: false,
64
+ restrictedByAdminReason: null,
65
+ primaryEmail: "user@example.com",
66
+ signOut: vi.fn(async () => {}),
67
+ ...user,
68
+ } as unknown as CurrentUser;
69
+ }
70
+
71
+ let root: Root | null = null;
72
+ let container: HTMLDivElement | null = null;
73
+
74
+ async function renderOnboarding(options: {
75
+ app: StackClientApp<true>,
76
+ user: unknown,
77
+ }) {
78
+ appMockState.app = options.app;
79
+ appMockState.user = options.user;
80
+ container = document.createElement("div");
81
+ document.body.append(container);
82
+ root = createRoot(container);
83
+ await act(async () => {
84
+ root?.render(
85
+ <TranslationProviderClient quetzalKeys={new Map()} quetzalLocale={new Map()}>
86
+ <Onboarding />
87
+ </TranslationProviderClient>
88
+ );
89
+ });
90
+ return container;
91
+ }
92
+
93
+ describe("Onboarding", () => {
94
+ beforeEach(() => {
95
+ Reflect.set(globalThis, "IS_REACT_ACT_ENVIRONMENT", true);
96
+ });
97
+
98
+ afterEach(() => {
99
+ act(() => {
100
+ root?.unmount();
101
+ });
102
+ container?.remove();
103
+ root = null;
104
+ container = null;
105
+ appMockState.app = null;
106
+ appMockState.user = null;
107
+ vi.restoreAllMocks();
108
+ Reflect.set(globalThis, "IS_REACT_ACT_ENVIRONMENT", previousActEnvironment);
109
+ });
110
+
111
+ it("redirects signed-out users to sign-in", async () => {
112
+ const app = createAppTestDouble();
113
+
114
+ const container = await renderOnboarding({ app, user: null });
115
+
116
+ expect(app.redirectToSignIn).toHaveBeenCalled();
117
+ expect(container.textContent).toBe("");
118
+ });
119
+
120
+ it("redirects anonymous users to sign-in", async () => {
121
+ const app = createAppTestDouble();
122
+
123
+ const container = await renderOnboarding({ app, user: createUserTestDouble({ isAnonymous: true, restrictedReason: { type: "anonymous" } }) });
124
+
125
+ expect(app.redirectToSignIn).toHaveBeenCalled();
126
+ expect(container.textContent).toBe("");
127
+ });
128
+
129
+ it("redirects users that are no longer restricted to their destination", async () => {
130
+ const app = createAppTestDouble();
131
+
132
+ await renderOnboarding({ app, user: createUserTestDouble({ isRestricted: false }) });
133
+
134
+ expect(app.redirectToAfterSignIn).toHaveBeenCalled();
135
+ expect(app.redirectToSignIn).not.toHaveBeenCalled();
136
+ });
137
+
138
+ it("shows the administrator's public reason to admin-restricted users", async () => {
139
+ const app = createAppTestDouble();
140
+
141
+ const container = await renderOnboarding({
142
+ app,
143
+ user: createUserTestDouble({
144
+ restrictedReason: { type: "restricted_by_administrator" },
145
+ restrictedByAdmin: true,
146
+ restrictedByAdminReason: "Your sign-up was flagged by our fraud prevention rules.",
147
+ }),
148
+ });
149
+
150
+ expect(container.textContent).toContain("Your account has been restricted");
151
+ expect(container.textContent).toContain("Your sign-up was flagged by our fraud prevention rules.");
152
+ expect(container.textContent).not.toContain("Complete your account setup");
153
+ });
154
+
155
+ it("falls back to a generic restricted message when no public reason is set", async () => {
156
+ const app = createAppTestDouble();
157
+
158
+ const container = await renderOnboarding({
159
+ app,
160
+ user: createUserTestDouble({
161
+ restrictedReason: { type: "restricted_by_administrator" },
162
+ restrictedByAdmin: true,
163
+ restrictedByAdminReason: null,
164
+ }),
165
+ });
166
+
167
+ expect(container.textContent).toContain("Your account has been restricted");
168
+ expect(container.textContent).toContain("An administrator has restricted your account.");
169
+ });
170
+
171
+ it("shows the setup-required message for unknown restricted reasons", async () => {
172
+ const app = createAppTestDouble();
173
+
174
+ const container = await renderOnboarding({
175
+ app,
176
+ // The reason types are a closed union, so an unknown reason can only come from a newer backend.
177
+ user: createUserTestDouble({ restrictedReason: { type: "some_future_reason" } as unknown as CurrentUser["restrictedReason"] }),
178
+ });
179
+
180
+ expect(container.textContent).toContain("Complete your account setup");
181
+ });
182
+ });
@@ -55,6 +55,23 @@ export function Onboarding(props: {
55
55
  return <VerifyEmailScreen user={user} email={user.primaryEmail} fullPage={props.fullPage} />;
56
56
  }
57
57
 
58
+ if (restrictedReason?.type === "restricted_by_administrator") {
59
+ return (
60
+ <MessageCard
61
+ title={t("Your account has been restricted")}
62
+ fullPage={!!props.fullPage}
63
+ secondaryButtonText={t("Sign out")}
64
+ secondaryAction={async () => {
65
+ await user.signOut();
66
+ }}
67
+ >
68
+ {/* The public reason is set by the project's administrators (sign-up rules or manually), so it's the most
69
+ helpful thing we can show; the generic sentence is only a fallback for when they didn't provide one. */}
70
+ <p>{user.restrictedByAdminReason ?? t("An administrator has restricted your account. Please reach out to support if you believe this is an error.")}</p>
71
+ </MessageCard>
72
+ );
73
+ }
74
+
58
75
  // Unknown restricted reason - show generic message
59
76
  return (
60
77
  <MessageCard
@@ -30,13 +30,13 @@ Next, update or create a file in `convex/convex.config.ts`:
30
30
 
31
31
  ```ts
32
32
  import { defineApp } from "convex/server";
33
- import stackAuthComponent from "@hexclave/js/convex.config"; // Vanilla JS
34
- // or: import stackAuthComponent from "@hexclave/react/convex.config"; // React
35
- // or: import stackAuthComponent from "@hexclave/next/convex.config"; // Next.js
33
+ import hexclaveComponent from "@hexclave/js/convex.config"; // Vanilla JS
34
+ // or: import hexclaveComponent from "@hexclave/react/convex.config"; // React
35
+ // or: import hexclaveComponent from "@hexclave/next/convex.config"; // Next.js
36
36
 
37
37
 
38
38
  const app = defineApp();
39
- app.use(stackAuthComponent);
39
+ app.use(hexclaveComponent);
40
40
 
41
41
  export default app;
42
42
  ```
@@ -0,0 +1,94 @@
1
+
2
+ //===========================================
3
+ // THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template
4
+ //===========================================
5
+ import { describe, expect, it } from "vitest";
6
+ import { StackClientApp } from "../interfaces/client-app";
7
+
8
+ function createAccessTokenString(refreshTokenId: string): string {
9
+ const encode = (value: unknown) => Buffer.from(JSON.stringify(value)).toString("base64url");
10
+ const nowSeconds = Math.floor(Date.now() / 1000);
11
+ return [
12
+ encode({ alg: "none", typ: "JWT" }),
13
+ encode({ sub: "user-id", exp: nowSeconds + 60, iat: nowSeconds, refresh_token_id: refreshTokenId }),
14
+ "",
15
+ ].join(".");
16
+ }
17
+
18
+ function createTestSetup(getUser: () => Promise<unknown>) {
19
+ const clientApp = new StackClientApp({
20
+ baseUrl: "http://localhost:12345",
21
+ projectId: "00000000-0000-4000-8000-000000000000",
22
+ publishableClientKey: "stack-pk-test",
23
+ tokenStore: "memory",
24
+ redirectMethod: "none",
25
+ noAutomaticPrefetch: true,
26
+ });
27
+ Reflect.set(Reflect.get(clientApp, "_interface"), "getClientUserByToken", getUser);
28
+ const privateMethod = (name: string) => (...args: unknown[]) => Reflect.get(clientApp, name).apply(clientApp, args);
29
+ return {
30
+ currentUserCache: Reflect.get(clientApp, "_currentUserCache"),
31
+ signIn: (refreshToken: string) => privateMethod("_signInToAccountWithTokens")({
32
+ accessToken: createAccessTokenString(`${refreshToken}-id`),
33
+ refreshToken,
34
+ }),
35
+ getSessionFromTokenStore: privateMethod("_getSessionFromTokenStore"),
36
+ getTokenStore: async () => privateMethod("_getOrCreateTokenStore")(await privateMethod("_createCookieHelper")()),
37
+ };
38
+ }
39
+
40
+ describe("StackClientApp sign-in cache warm-up", () => {
41
+ it("has the new session's user cached by the time the token store change is published", async () => {
42
+ let getUserCalls = 0;
43
+ const setup = createTestSetup(async () => {
44
+ getUserCalls += 1;
45
+ return { id: "user-id", is_anonymous: false, is_restricted: false };
46
+ });
47
+
48
+ // `useUser()` hooks re-read the cache when the session changes, so if the cache were still cold here, they'd
49
+ // suspend and flash their Suspense fallback over the UI that's already on the screen.
50
+ const cacheStatusesOnTokenStoreChange: string[] = [];
51
+ const tokenStore = await setup.getTokenStore();
52
+ tokenStore.onChange(() => {
53
+ const session = setup.getSessionFromTokenStore(tokenStore);
54
+ cacheStatusesOnTokenStoreChange.push(setup.currentUserCache.getIfCached([session]).status);
55
+ });
56
+
57
+ await setup.signIn("refresh-token");
58
+
59
+ expect(cacheStatusesOnTokenStoreChange).toEqual(["ok"]);
60
+ const cachedUser = setup.currentUserCache.getIfCached([setup.getSessionFromTokenStore(tokenStore)]);
61
+ expect(cachedUser.data.data).toMatchObject({ id: "user-id" });
62
+ expect(getUserCalls).toBe(1);
63
+ });
64
+
65
+ it("doesn't let a slow sign-in publish its tokens on top of a sign-in that started later", async () => {
66
+ let onFirstFetchStarted!: () => void;
67
+ let releaseFirstFetch!: () => void;
68
+ const firstFetchStarted = new Promise<void>((resolve) => {
69
+ onFirstFetchStarted = resolve;
70
+ });
71
+ const firstFetchReleased = new Promise<void>((resolve) => {
72
+ releaseFirstFetch = resolve;
73
+ });
74
+
75
+ let getUserCalls = 0;
76
+ const setup = createTestSetup(async () => {
77
+ // Only the first sign-in's fetch blocks, so the second one deterministically gets to publish while it waits.
78
+ if (++getUserCalls === 1) {
79
+ onFirstFetchStarted();
80
+ await firstFetchReleased;
81
+ }
82
+ return { id: "user-id", is_anonymous: false, is_restricted: false };
83
+ });
84
+
85
+ const slowSignIn = setup.signIn("old-refresh-token");
86
+ await firstFetchStarted;
87
+ await setup.signIn("new-refresh-token");
88
+ releaseFirstFetch();
89
+ await slowSignIn;
90
+
91
+ expect(getUserCalls).toBe(2);
92
+ expect((await setup.getTokenStore()).get().refreshToken).toBe("new-refresh-token");
93
+ });
94
+ });
@@ -1533,8 +1533,12 @@ export class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pro
1533
1533
  * - So different token stores are separated and don't leak information between each other, eg. if the same user sends two requests to the same server they should get a different session object
1534
1534
  */
1535
1535
  private _sessionsByTokenStoreAndSessionKey = new WeakMap<Store<TokenObject>, Map<string, InternalSession>>();
1536
- protected _getSessionFromTokenStore(tokenStore: Store<TokenObject>): InternalSession {
1537
- const tokenObj = tokenStore.get();
1536
+ /**
1537
+ * @param overrideTokenObj The tokens to build the session for, if they haven't been written to the token store yet
1538
+ * (so we can warm a sign-in's session before the token store publishes it).
1539
+ */
1540
+ protected _getSessionFromTokenStore(tokenStore: Store<TokenObject>, overrideTokenObj?: TokenObject): InternalSession {
1541
+ const tokenObj = overrideTokenObj ?? tokenStore.get();
1538
1542
  const sessionKey = InternalSession.calculateSessionKey(tokenObj);
1539
1543
  const existing = sessionKey ? this._sessionsByTokenStoreAndSessionKey.get(tokenStore)?.get(sessionKey) : null;
1540
1544
  if (existing) return existing;
@@ -1587,21 +1591,33 @@ export class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pro
1587
1591
  return React.useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
1588
1592
  }
1589
1593
 
1594
+ private _signInAttemptCounter = 0;
1590
1595
  protected async _signInToAccountWithTokens(tokens: { accessToken: string | null, refreshToken: string }) {
1591
1596
  if (!("accessToken" in tokens) || !("refreshToken" in tokens)) {
1592
1597
  throw new HexclaveAssertionError("Invalid tokens object; can't sign in with this", { tokens });
1593
1598
  }
1599
+ const attemptId = ++this._signInAttemptCounter;
1594
1600
  const tokenStore = this._getOrCreateTokenStore(await this._createCookieHelper());
1595
- tokenStore.set(tokens);
1596
1601
 
1597
1602
  // If these tokens resolve to a session we already have (eg. the RDE dashboard re-installing a freshly minted
1598
1603
  // access token for the same access-only session), push the new token into it in place; constructing a new
1599
1604
  // session here would cold-invalidate every session-scoped cache and suspend the UI on each refresh.
1600
- const session = this._getSessionFromTokenStore(tokenStore);
1605
+ //
1606
+ // We build the session from the tokens instead of the token store, so that we can fetch its user before the token
1607
+ // store publishes it below: mounted `useUser()` hooks re-read the cache when the session changes, so a cold cache
1608
+ // entry at that point makes them suspend, flashing their Suspense fallback over UI that's already on the screen.
1609
+ // That's most visible on the auth pages, which sit there signed out until the analytics anonymous sign-up swaps in
1610
+ // a session a few seconds after the page loaded.
1611
+ const session = this._getSessionFromTokenStore(tokenStore, tokens);
1601
1612
  session.updateAccessToken(tokens);
1613
+ // If the fetch fails, we still publish the session (dropping a successful sign-in over a failed /users/me would be
1614
+ // much worse than a flicker); the cache stays dirty, so `useUser()` retries and surfaces the error itself.
1615
+ await Result.fromPromise(this._currentUserCache.getOrWait([session], "write-only"));
1602
1616
 
1603
- // Pre-fetch the current user so the cache is warm when useUser() re-renders (write-only, so it never suspends).
1604
- runAsynchronously(this._currentUserCache.getOrWait([session], "write-only"));
1617
+ // A sign-in that started after ours may have raced past us while we were fetching, in which case publishing our
1618
+ // (by now outdated) tokens would roll the app back to the session it just left.
1619
+ if (attemptId !== this._signInAttemptCounter) return;
1620
+ tokenStore.set(tokens);
1605
1621
  }
1606
1622
 
1607
1623
  protected _getTokenStoreInitForFreshTokens(tokens: { accessToken: string | null, refreshToken: string }): TokenStoreInit | undefined {
@@ -1780,6 +1796,12 @@ export class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pro
1780
1796
  const result = Result.orThrow(await app._teamMemberProfilesCache.getOrWait([session, crud.id], "write-only"));
1781
1797
  return result.map((crud) => app._clientTeamUserFromCrud(crud));
1782
1798
  },
1799
+ async removeUser(userId: string) {
1800
+ await app._interface.removeUserFromTeam(crud.id, userId, session);
1801
+ await app._teamMemberProfilesCache.refresh([session, crud.id]);
1802
+ await app._currentUserTeamsCache.refresh([session]);
1803
+ await app._currentUserCache.refresh([session]);
1804
+ },
1783
1805
  useUsers() {
1784
1806
  const result = useAsyncCache(app._teamMemberProfilesCache, [session, crud.id] as const, "team.useUsers()");
1785
1807
  return result.map((crud) => app._clientTeamUserFromCrud(crud));
@@ -2088,6 +2110,8 @@ export class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pro
2088
2110
  isAnonymous: crud.is_anonymous,
2089
2111
  isRestricted: crud.is_restricted,
2090
2112
  restrictedReason: crud.restricted_reason,
2113
+ restrictedByAdmin: crud.restricted_by_admin,
2114
+ restrictedByAdminReason: crud.restricted_by_admin_reason,
2091
2115
  toClientJson(): CurrentUserCrud['Client']['Read'] {
2092
2116
  return crud;
2093
2117
  }
@@ -2243,7 +2267,8 @@ export class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pro
2243
2267
  },
2244
2268
  async leaveTeam(team: Team) {
2245
2269
  await app._interface.leaveTeam(team.id, session);
2246
- // TODO: refresh cache
2270
+ await app._currentUserTeamsCache.refresh([session]);
2271
+ await app._currentUserCache.refresh([session]);
2247
2272
  },
2248
2273
  async listTeamInvitations() {
2249
2274
  const invitations = Result.orThrow(await app._currentUserTeamInvitationsCache.getOrWait([session], "write-only"));
@@ -3475,7 +3500,7 @@ export class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pro
3475
3500
  noRedirect?: boolean,
3476
3501
  noVerificationCallback?: boolean,
3477
3502
  verificationCallbackUrl?: string,
3478
- }): Promise<Result<undefined, KnownErrors["UserWithEmailAlreadyExists"] | KnownErrors['PasswordRequirementsNotMet'] | KnownErrors["BotChallengeFailed"]>> {
3503
+ }): Promise<Result<undefined, KnownErrors["UserWithEmailAlreadyExists"] | KnownErrors["ContactChannelAlreadyUsedForAuthBySomeoneElse"] | KnownErrors['PasswordRequirementsNotMet'] | KnownErrors["BotChallengeFailed"]>> {
3479
3504
  if (options.noVerificationCallback && options.verificationCallbackUrl) {
3480
3505
  throw new HexclaveAssertionError("verificationCallbackUrl is not allowed when noVerificationCallback is true");
3481
3506
  }
@@ -599,20 +599,11 @@ export class _HexclaveServerAppImplIncomplete<HasTokenStore extends boolean, Pro
599
599
  return useAsyncCache(app._serverUserOAuthConnectionCache, [crud.id, idOrAccount, scopeString, options?.or === 'redirect'] as const, "user.useConnectedAccount()");
600
600
  }
601
601
 
602
- // Type assertion needed because the new restricted_by_admin fields may not be reflected in TypeScript types yet
603
- // after schema changes - the runtime values are present after the schema is updated
604
- const crudWithAdminRestriction = crud as typeof crud & {
605
- restricted_by_admin: boolean,
606
- restricted_by_admin_reason: string | null,
607
- restricted_by_admin_private_details: string | null,
608
- };
609
602
  const serverUser = withUserDestructureGuard({
610
603
  ...super._createBaseUser(crud),
611
604
  lastActiveAt: new Date(crud.last_active_at_millis),
612
605
  serverMetadata: crud.server_metadata,
613
- restrictedByAdmin: crudWithAdminRestriction.restricted_by_admin,
614
- restrictedByAdminReason: crudWithAdminRestriction.restricted_by_admin_reason,
615
- restrictedByAdminPrivateDetails: crudWithAdminRestriction.restricted_by_admin_private_details,
606
+ restrictedByAdminPrivateDetails: crud.restricted_by_admin_private_details,
616
607
  countryCode: crud.country_code,
617
608
  riskScores: {
618
609
  signUp: {
@@ -82,7 +82,7 @@ export type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId ex
82
82
  email: string,
83
83
  password: string,
84
84
  noRedirect?: boolean,
85
- } & ({ noVerificationCallback: true } | { noVerificationCallback?: false, verificationCallbackUrl?: string })): Promise<Result<undefined, KnownErrors["UserWithEmailAlreadyExists"] | KnownErrors["PasswordRequirementsNotMet"] | KnownErrors["BotChallengeFailed"]>>,
85
+ } & ({ noVerificationCallback: true } | { noVerificationCallback?: false, verificationCallbackUrl?: string })): Promise<Result<undefined, KnownErrors["UserWithEmailAlreadyExists"] | KnownErrors["ContactChannelAlreadyUsedForAuthBySomeoneElse"] | KnownErrors["PasswordRequirementsNotMet"] | KnownErrors["BotChallengeFailed"]>>,
86
86
  signInWithPasskey(): Promise<Result<undefined, KnownErrors["PasskeyAuthenticationFailed"] | KnownErrors["InvalidTotpCode"] | KnownErrors["PasskeyWebAuthnError"]>>,
87
87
  callOAuthCallback(): Promise<boolean>,
88
88
  promptCliLogin(options: { appUrl: string, expiresInMillis?: number, anonRefreshToken?: string, promptLink?: (url: string, loginCode: string) => void }): Promise<Result<string, KnownErrors["CliAuthError"] | KnownErrors["CliAuthExpiredError"] | KnownErrors["CliAuthUsedError"]>>,
@@ -78,6 +78,7 @@ export type Team = {
78
78
  clientReadOnlyMetadata: any,
79
79
  inviteUser(options: { email: string, callbackUrl?: string }): Promise<void>,
80
80
  listUsers(): Promise<TeamUser[]>,
81
+ removeUser(userId: string): Promise<void>,
81
82
  useUsers(): TeamUser[], // THIS_LINE_PLATFORM react-like
82
83
  listInvitations(): Promise<SentTeamInvitation[]>,
83
84
  useInvitations(): SentTeamInvitation[], // THIS_LINE_PLATFORM react-like
@@ -141,6 +141,15 @@ export type BaseUser = {
141
141
  * Null if the user is not restricted.
142
142
  */
143
143
  readonly restrictedReason: RestrictedReason | null,
144
+ /** Whether the user is restricted by an administrator. Can be set manually or by sign-up rules. */
145
+ readonly restrictedByAdmin: boolean,
146
+ /**
147
+ * Public reason shown to the user explaining why an administrator restricted them, or null if none was given.
148
+ *
149
+ * This is intentionally readable by the user themselves (unlike `restrictedByAdminPrivateDetails`, which is
150
+ * server-only), so onboarding screens can tell them why they can't continue.
151
+ */
152
+ readonly restrictedByAdminReason: string | null,
144
153
  toClientJson(): CurrentUserCrud["Client"]["Read"],
145
154
 
146
155
  /**
@@ -354,10 +363,6 @@ export type ServerBaseUser = {
354
363
  setServerMetadata(metadata: any): Promise<void>,
355
364
  setClientReadOnlyMetadata(metadata: any): Promise<void>,
356
365
 
357
- /** Whether the user is restricted by an administrator. Can be set manually or by sign-up rules. */
358
- readonly restrictedByAdmin: boolean,
359
- /** Public reason shown to the user explaining why they are restricted. Optional. */
360
- readonly restrictedByAdminReason: string | null,
361
366
  /** Private details about the restriction (e.g., which sign-up rule triggered). Only visible to server access and above. */
362
367
  readonly restrictedByAdminPrivateDetails: string | null,
363
368
  /** Best-effort ISO country code captured at sign-up time from request geo headers. */
@@ -1 +0,0 @@
1
- {"version":3,"file":"admin-app-impl-2gZ3JWa0.d.ts","names":[],"sources":["../src/lib/hexclave-app/apps/implementations/client-app-impl.ts","../src/lib/hexclave-app/apps/implementations/server-app-impl.ts","../src/lib/hexclave-app/apps/implementations/admin-app-impl.ts"],"mappings":"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"}