@stackframe/stack-shared 1.1.0 → 1.2.1

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 (48) hide show
  1. package/dist/helpers/fetch-token.d.ts +1 -0
  2. package/dist/helpers/password.d.ts +1 -0
  3. package/dist/hooks/use-async-external-store.d.ts +1 -0
  4. package/dist/hooks/use-strict-memo.d.ts +1 -0
  5. package/dist/index.d.ts +3 -2
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/interface/adminInterface.d.ts +44 -53
  8. package/dist/interface/adminInterface.d.ts.map +1 -1
  9. package/dist/interface/adminInterface.js +10 -52
  10. package/dist/interface/clientInterface.d.ts +30 -21
  11. package/dist/interface/clientInterface.d.ts.map +1 -1
  12. package/dist/interface/clientInterface.js +38 -56
  13. package/dist/interface/serverInterface.d.ts +4 -6
  14. package/dist/interface/serverInterface.d.ts.map +1 -1
  15. package/dist/interface/serverInterface.js +0 -23
  16. package/dist/utils/arrays.d.ts +1 -0
  17. package/dist/utils/bytes.d.ts +1 -0
  18. package/dist/utils/caches.d.ts +30 -28
  19. package/dist/utils/caches.d.ts.map +1 -1
  20. package/dist/utils/caches.js +66 -46
  21. package/dist/utils/crypto.d.ts +1 -0
  22. package/dist/utils/dates.d.ts +1 -0
  23. package/dist/utils/dom.d.ts +1 -0
  24. package/dist/utils/env.d.ts +1 -0
  25. package/dist/utils/errors.d.ts +1 -0
  26. package/dist/utils/html.d.ts +1 -0
  27. package/dist/utils/json.d.ts +1 -0
  28. package/dist/utils/jwt.d.ts +1 -0
  29. package/dist/utils/maps.d.ts +2 -0
  30. package/dist/utils/maps.d.ts.map +1 -1
  31. package/dist/utils/maps.js +3 -0
  32. package/dist/utils/math.d.ts +1 -0
  33. package/dist/utils/numbers.d.ts +1 -0
  34. package/dist/utils/objects.d.ts +1 -0
  35. package/dist/utils/password.d.ts +1 -0
  36. package/dist/utils/promises.d.ts +2 -0
  37. package/dist/utils/promises.d.ts.map +1 -1
  38. package/dist/utils/promises.js +4 -1
  39. package/dist/utils/react.d.ts +1 -0
  40. package/dist/utils/results.d.ts +1 -0
  41. package/dist/utils/stores.d.ts +1 -0
  42. package/dist/utils/stores.d.ts.map +1 -1
  43. package/dist/utils/stores.js +2 -4
  44. package/dist/utils/strings.d.ts +1 -0
  45. package/dist/utils/types.d.ts +11 -13
  46. package/dist/utils/types.d.ts.map +1 -1
  47. package/dist/utils/uuids.d.ts +1 -0
  48. package/package.json +1 -1
@@ -1 +1,2 @@
1
1
  export declare const fetchTokenPrefix = "#stack-auth--if-you-see-this-you-probably-forgot-to-add-an-auth-provider----";
2
+ //# sourceMappingURL=fetch-token.d.ts.map
@@ -1 +1,2 @@
1
1
  export declare function getPasswordError(password: string): string | null;
2
+ //# sourceMappingURL=password.d.ts.map
@@ -2,3 +2,4 @@ import { AsyncResult } from "../utils/results";
2
2
  export declare function useAsyncExternalStore<T>(subscribe: (callback: (t: T) => void) => (() => void)): AsyncResult<T, never> & {
3
3
  status: "ok" | "pending";
4
4
  };
5
+ //# sourceMappingURL=use-async-external-store.d.ts.map
@@ -4,3 +4,4 @@
4
4
  * The most recent value will be kept from garbage collection until one of the dependencies becomes unreachable. This may be true even after the component no longer renders. Be wary of memory leaks.
5
5
  */
6
6
  export declare function useStrictMemo<T>(callback: () => T, dependencies: any[]): T;
7
+ //# sourceMappingURL=use-strict-memo.d.ts.map
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- export { StackClientInterface, UserJson as UserJson, UserCustomizableJson, ClientProjectJson, ProjectJson, OauthProviderConfigJson, getProductionModeErrors, } from "./interface/clientInterface";
1
+ export { StackClientInterface, UserJson as UserJson, UserCustomizableJson, ClientProjectJson, ProjectJson, OAuthProviderConfigJson, getProductionModeErrors, } from "./interface/clientInterface";
2
2
  export { StackServerInterface, ServerUserJson, ServerUserCustomizableJson, } from "./interface/serverInterface";
3
- export { StackAdminInterface, ApiKeySetBase, ApiKeySetBaseJson, ApiKeySetFirstView, ApiKeySetFirstViewJson, ApiKeySetSummary, ApiKeySetSummaryJson, } from "./interface/adminInterface";
3
+ export { StackAdminInterface, ApiKeySetBaseJson, ApiKeySetFirstViewJson, ApiKeySetJson, } from "./interface/adminInterface";
4
4
  export { fetchTokenPrefix } from "./helpers/fetch-token";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,QAAQ,IAAI,QAAQ,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,WAAW,EACX,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,0BAA0B,GAC3B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,QAAQ,IAAI,QAAQ,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,WAAW,EACX,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,0BAA0B,GAC3B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,aAAa,GACd,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -1,49 +1,46 @@
1
1
  import { ServerAuthApplicationOptions, StackServerInterface } from "./serverInterface";
2
- import { AsyncValueCache } from "../utils/caches";
3
- import { ProjectJson, TokenStore } from "./clientInterface";
2
+ import { ProjectJson, ReadonlyTokenStore, SharedProvider, StandardProvider, TokenStore } from "./clientInterface";
4
3
  export type AdminAuthApplicationOptions = Readonly<ServerAuthApplicationOptions & ({
5
4
  superSecretAdminKey: string;
6
5
  } | {
7
- internalAdminAccessToken: string;
6
+ projectOwnerTokens: ReadonlyTokenStore;
8
7
  })>;
9
- export type ApiKeySetBase = Readonly<{
8
+ export type OAuthProviderUpdateOptions = {
10
9
  id: string;
11
- description: string;
12
- expiresAt: Date;
13
- manuallyRevokedAt: Date | null;
14
- createdAt: Date;
15
- isValid(): boolean;
16
- whyInvalid(): "expired" | "manually-revoked" | null;
17
- }>;
18
- export type ApiKeySetBaseJson = Readonly<{
10
+ enabled: boolean;
11
+ } & ({
12
+ type: SharedProvider;
13
+ } | {
14
+ type: StandardProvider;
15
+ clientId: string;
16
+ clientSecret: string;
17
+ tenantId?: string;
18
+ });
19
+ export type ProjectUpdateOptions = {
20
+ isProductionMode?: boolean;
21
+ config?: {
22
+ domains?: {
23
+ domain: string;
24
+ handlerPath: string;
25
+ }[];
26
+ oauthProviders?: OAuthProviderUpdateOptions[];
27
+ credentialEnabled?: boolean;
28
+ allowLocalhost?: boolean;
29
+ };
30
+ };
31
+ export type ApiKeySetBaseJson = {
19
32
  id: string;
20
33
  description: string;
21
34
  expiresAtMillis: number;
22
35
  manuallyRevokedAtMillis: number | null;
23
36
  createdAtMillis: number;
24
- }>;
25
- export type ApiKeySetFirstView = Readonly<ApiKeySetBase & {
37
+ };
38
+ export type ApiKeySetFirstViewJson = ApiKeySetBaseJson & {
26
39
  publishableClientKey?: string;
27
40
  secretServerKey?: string;
28
41
  superSecretAdminKey?: string;
29
- }>;
30
- export type ApiKeySetFirstViewJson = Readonly<ApiKeySetBaseJson & {
31
- publishableClientKey?: string;
32
- secretServerKey?: string;
33
- superSecretAdminKey?: string;
34
- }>;
35
- export type ApiKeySetSummary = Readonly<ApiKeySetBase & {
36
- publishableClientKey: null | {
37
- lastFour: string;
38
- };
39
- secretServerKey: null | {
40
- lastFour: string;
41
- };
42
- superSecretAdminKey: null | {
43
- lastFour: string;
44
- };
45
- }>;
46
- export type ApiKeySetSummaryJson = Readonly<ApiKeySetBaseJson & {
42
+ };
43
+ export type ApiKeySetJson = ApiKeySetBaseJson & {
47
44
  publishableClientKey: null | {
48
45
  lastFour: string;
49
46
  };
@@ -53,10 +50,16 @@ export type ApiKeySetSummaryJson = Readonly<ApiKeySetBaseJson & {
53
50
  superSecretAdminKey: null | {
54
51
  lastFour: string;
55
52
  };
56
- }>;
53
+ };
54
+ export type ApiKeySetCreateOptions = {
55
+ hasPublishableClientKey: boolean;
56
+ hasSecretServerKey: boolean;
57
+ hasSuperSecretAdminKey: boolean;
58
+ expiresAt: Date;
59
+ description: string;
60
+ };
57
61
  export declare class StackAdminInterface extends StackServerInterface {
58
62
  readonly options: AdminAuthApplicationOptions;
59
- readonly projectCache: AsyncValueCache<ProjectJson>;
60
63
  constructor(options: AdminAuthApplicationOptions);
61
64
  protected sendAdminRequest(path: string, options: RequestInit, tokenStore: TokenStore | null): Promise<Response & {
62
65
  usedTokens: Readonly<{
@@ -64,25 +67,13 @@ export declare class StackAdminInterface extends StackServerInterface {
64
67
  accessToken: string | null;
65
68
  }>;
66
69
  }>;
67
- refreshProject(): Promise<void>;
68
- getProject(): Promise<ProjectJson>;
69
- updateProject(update: {
70
- isProductionMode?: boolean;
71
- config?: {
72
- domains?: {
73
- domain: string;
74
- handlerPath: string;
75
- }[];
76
- };
70
+ getProject(options?: {
71
+ showDisabledOAuth?: boolean;
77
72
  }): Promise<ProjectJson>;
78
- createApiKeySet(options: {
79
- hasPublishableClientKey: boolean;
80
- hasSecretServerKey: boolean;
81
- hasSuperSecretAdminKey: boolean;
82
- expiresAt: Date;
83
- description: string;
84
- }): Promise<ApiKeySetFirstView>;
85
- listApiKeySets(): Promise<ApiKeySetSummary[]>;
73
+ updateProject(update: ProjectUpdateOptions): Promise<ProjectJson>;
74
+ createApiKeySet(options: ApiKeySetCreateOptions): Promise<ApiKeySetFirstViewJson>;
75
+ listApiKeySets(): Promise<ApiKeySetJson[]>;
86
76
  revokeApiKeySetById(id: string): Promise<void>;
87
- getApiKeySet(id: string, tokenStore: TokenStore): Promise<ApiKeySetSummary>;
77
+ getApiKeySet(id: string, tokenStore: TokenStore): Promise<ApiKeySetJson>;
88
78
  }
79
+ //# sourceMappingURL=adminInterface.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"adminInterface.d.ts","sourceRoot":"","sources":["../../src/interface/adminInterface.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adminInterface.d.ts","sourceRoot":"","sources":["../../src/interface/adminInterface.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,9 @@
1
1
  import { StackServerInterface } from "./serverInterface";
2
- import { AsyncValueCache } from "../utils/caches";
3
- import { throwErr } from "../utils/errors";
4
2
  export class StackAdminInterface extends StackServerInterface {
5
3
  options;
6
- projectCache;
7
4
  constructor(options) {
8
5
  super(options);
9
6
  this.options = options;
10
- this.projectCache = new AsyncValueCache(async () => {
11
- return await this.getProject() ?? throwErr("Can't fetch project because it was not found");
12
- });
13
7
  }
14
8
  async sendAdminRequest(path, options, tokenStore) {
15
9
  return await this.sendServerRequest(path, {
@@ -20,14 +14,14 @@ export class StackAdminInterface extends StackServerInterface {
20
14
  },
21
15
  }, tokenStore);
22
16
  }
23
- async refreshProject() {
24
- await Promise.all([
25
- super.refreshProject(),
26
- this.projectCache.refresh(),
27
- ]);
28
- }
29
- async getProject() {
30
- const response = await this.sendAdminRequest("/projects/" + encodeURIComponent(this.projectId), {}, null);
17
+ async getProject(options) {
18
+ const response = await this.sendAdminRequest("/projects/" + encodeURIComponent(this.projectId), {
19
+ method: "POST",
20
+ headers: {
21
+ "content-type": "application/json",
22
+ },
23
+ body: JSON.stringify(options ?? {}),
24
+ }, null);
31
25
  return await response.json();
32
26
  }
33
27
  async updateProject(update) {
@@ -38,7 +32,6 @@ export class StackAdminInterface extends StackServerInterface {
38
32
  },
39
33
  body: JSON.stringify(update),
40
34
  }, null);
41
- await this.refreshProject();
42
35
  return await response.json();
43
36
  }
44
37
  async createApiKeySet(options) {
@@ -49,12 +42,12 @@ export class StackAdminInterface extends StackServerInterface {
49
42
  },
50
43
  body: JSON.stringify(options),
51
44
  }, null);
52
- return createApiKeySetFirstViewFromJson(await response.json());
45
+ return await response.json();
53
46
  }
54
47
  async listApiKeySets() {
55
48
  const response = await this.sendAdminRequest("/api-keys", {}, null);
56
49
  const json = await response.json();
57
- return json.map((k) => createApiKeySetSummaryFromJson(k));
50
+ return json.map((k) => k);
58
51
  }
59
52
  async revokeApiKeySetById(id) {
60
53
  await this.sendAdminRequest(`/api-keys/${id}`, {
@@ -72,38 +65,3 @@ export class StackAdminInterface extends StackServerInterface {
72
65
  return await response.json();
73
66
  }
74
67
  }
75
- function createApiKeySetBaseFromJson(data) {
76
- return {
77
- id: data.id,
78
- description: data.description,
79
- expiresAt: new Date(data.expiresAtMillis),
80
- manuallyRevokedAt: data.manuallyRevokedAtMillis ? new Date(data.manuallyRevokedAtMillis) : null,
81
- createdAt: new Date(data.createdAtMillis),
82
- isValid() {
83
- return this.whyInvalid() === null;
84
- },
85
- whyInvalid() {
86
- if (this.expiresAt.getTime() < Date.now())
87
- return "expired";
88
- if (this.manuallyRevokedAt)
89
- return "manually-revoked";
90
- return null;
91
- },
92
- };
93
- }
94
- function createApiKeySetSummaryFromJson(data) {
95
- return {
96
- ...createApiKeySetBaseFromJson(data),
97
- publishableClientKey: data.publishableClientKey ? { lastFour: data.publishableClientKey.lastFour } : null,
98
- secretServerKey: data.secretServerKey ? { lastFour: data.secretServerKey.lastFour } : null,
99
- superSecretAdminKey: data.superSecretAdminKey ? { lastFour: data.superSecretAdminKey.lastFour } : null,
100
- };
101
- }
102
- function createApiKeySetFirstViewFromJson(data) {
103
- return {
104
- ...createApiKeySetBaseFromJson(data),
105
- publishableClientKey: data.publishableClientKey,
106
- secretServerKey: data.secretServerKey,
107
- superSecretAdminKey: data.superSecretAdminKey,
108
- };
109
- }
@@ -1,7 +1,7 @@
1
- import { ReadonlyJson, SignInErrorCode, SignUpErrorCode, EmailVerificationLinkErrorCode, PasswordResetLinkErrorCode } from "../utils/types";
1
+ import { SignInErrorCode, SignUpErrorCode, EmailVerificationLinkErrorCode, PasswordResetLinkErrorCode, KnownErrorCode } from "../utils/types";
2
2
  import { Result } from "../utils/results";
3
- import { AsyncCache, AsyncValueCache } from '../utils/caches';
4
- import { AsyncStore } from '../utils/stores';
3
+ import { ReadonlyJson } from '../utils/json';
4
+ import { AsyncStore, ReadonlyAsyncStore } from '../utils/stores';
5
5
  export type UserCustomizableJson = {
6
6
  readonly projectId: string;
7
7
  readonly displayName: string | null;
@@ -18,8 +18,10 @@ export type UserJson = UserCustomizableJson & {
18
18
  };
19
19
  export type ClientProjectJson = {
20
20
  readonly id: string;
21
+ readonly credentialEnabled: boolean;
21
22
  readonly oauthProviders: readonly {
22
23
  id: string;
24
+ enabled: boolean;
23
25
  }[];
24
26
  };
25
27
  export type ClientInterfaceOptions = {
@@ -28,14 +30,21 @@ export type ClientInterfaceOptions = {
28
30
  } & ({
29
31
  readonly publishableClientKey: string;
30
32
  } | {
31
- readonly internalAdminAccessToken: string;
33
+ readonly projectOwnerTokens: ReadonlyTokenStore;
32
34
  });
35
+ export type SharedProvider = "shared-github" | "shared-google" | "shared-facebook" | "shared-microsoft";
36
+ export declare const sharedProviders: readonly ["shared-github", "shared-google", "shared-facebook", "shared-microsoft"];
37
+ export type StandardProvider = "github" | "facebook" | "google" | "microsoft";
38
+ export declare const standardProviders: readonly ["github", "facebook", "google", "microsoft"];
39
+ export declare function toStandardProvider(provider: SharedProvider | StandardProvider): StandardProvider;
40
+ export declare function toSharedProvider(provider: SharedProvider | StandardProvider): SharedProvider;
41
+ export type ReadonlyTokenStore = ReadonlyAsyncStore<TokenObject>;
33
42
  export type TokenStore = AsyncStore<TokenObject>;
34
43
  export type TokenObject = Readonly<{
35
44
  refreshToken: string | null;
36
45
  accessToken: string | null;
37
46
  }>;
38
- export type ProjectJson = Readonly<{
47
+ export type ProjectJson = {
39
48
  id: string;
40
49
  displayName: string;
41
50
  description?: string;
@@ -45,17 +54,19 @@ export type ProjectJson = Readonly<{
45
54
  evaluatedConfig: {
46
55
  id: string;
47
56
  allowLocalhost: boolean;
48
- oauthProviders: OauthProviderConfigJson[];
57
+ credentialEnabled: boolean;
58
+ oauthProviders: OAuthProviderConfigJson[];
49
59
  emailConfig?: EmailConfigJson;
50
60
  domains: DomainConfigJson[];
51
61
  };
52
- }>;
53
- export type OauthProviderConfigJson = {
62
+ };
63
+ export type OAuthProviderConfigJson = {
54
64
  id: string;
65
+ enabled: boolean;
55
66
  } & ({
56
- type: "shared-github" | "shared-google" | "shared-facebook" | "shared-slack" | "shared-twitter" | "shared-linkedin" | "shared-microsoft";
67
+ type: SharedProvider;
57
68
  } | {
58
- type: "github" | "facebook" | "slack" | "twitter" | "linkedin" | "google" | "microsoft";
69
+ type: StandardProvider;
59
70
  clientId: string;
60
71
  clientSecret: string;
61
72
  tenantId?: string;
@@ -76,16 +87,16 @@ export type DomainConfigJson = {
76
87
  domain: string;
77
88
  handlerPath: string;
78
89
  };
90
+ export type ProductionModeError = {
91
+ errorMessage: string;
92
+ fixUrlRelative: string;
93
+ };
79
94
  export declare class StackClientInterface {
80
95
  readonly options: ClientInterfaceOptions;
81
- readonly currentUserCache: AsyncCache<TokenStore, UserJson | null>;
82
- readonly clientProjectCache: AsyncValueCache<ClientProjectJson>;
83
96
  constructor(options: ClientInterfaceOptions);
84
97
  get projectId(): string;
85
98
  getSessionCookieName(): string;
86
99
  getApiUrl(): string;
87
- refreshUser(tokenStore: TokenStore): Promise<void>;
88
- refreshProject(): Promise<void>;
89
100
  protected refreshAccessToken(tokenStore: TokenStore): Promise<void>;
90
101
  protected sendClientRequest(path: string, requestOptions: RequestInit, tokenStoreOrNull: TokenStore | null): Promise<Response & {
91
102
  usedTokens: Readonly<{
@@ -93,7 +104,7 @@ export declare class StackClientInterface {
93
104
  accessToken: string | null;
94
105
  }>;
95
106
  }>;
96
- protected sendClientRequestAndCatchKnownError<E>(path: string, requestOptions: RequestInit, tokenStoreOrNull: TokenStore | null, errorCodes: string[]): Promise<({
107
+ protected sendClientRequestAndCatchKnownError<E extends KnownErrorCode>(path: string, requestOptions: RequestInit, tokenStoreOrNull: TokenStore | null, errorCodes: readonly E[]): Promise<({
97
108
  status: "ok";
98
109
  data: Response & {
99
110
  usedTokens: Readonly<{
@@ -119,8 +130,8 @@ export declare class StackClientInterface {
119
130
  verifyEmail(code: string): Promise<EmailVerificationLinkErrorCode | undefined>;
120
131
  signInWithCredential(email: string, password: string, tokenStore: TokenStore): Promise<SignInErrorCode | undefined>;
121
132
  signUpWithCredential(email: string, password: string, emailVerificationRedirectUrl: string, tokenStore: TokenStore): Promise<SignUpErrorCode | undefined>;
122
- getOauthUrl(provider: string, redirectUrl: string, codeChallenge: string, state: string): Promise<string>;
123
- callOauthCallback(oauthParams: URLSearchParams, redirectUri: string, codeVerifier: string, state: string, tokenStore: TokenStore): Promise<void>;
133
+ getOAuthUrl(provider: string, redirectUrl: string, codeChallenge: string, state: string): Promise<string>;
134
+ callOAuthCallback(oauthParams: URLSearchParams, redirectUri: string, codeVerifier: string, state: string, tokenStore: TokenStore): Promise<void>;
124
135
  signOut(tokenStore: TokenStore): Promise<void>;
125
136
  getClientUserByToken(tokenStore: TokenStore): Promise<Result<UserJson>>;
126
137
  getClientProject(): Promise<Result<ClientProjectJson>>;
@@ -128,7 +139,5 @@ export declare class StackClientInterface {
128
139
  listProjects(tokenStore: TokenStore): Promise<ProjectJson[]>;
129
140
  createProject(project: Pick<ProjectJson, "displayName" | "description">, tokenStore: TokenStore): Promise<ProjectJson>;
130
141
  }
131
- export declare function getProductionModeErrors(project: ProjectJson): {
132
- errorMessage: string;
133
- fixUrlRelative: string;
134
- }[];
142
+ export declare function getProductionModeErrors(project: ProjectJson): ProductionModeError[];
143
+ //# sourceMappingURL=clientInterface.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"clientInterface.d.ts","sourceRoot":"","sources":["../../src/interface/clientInterface.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"clientInterface.d.ts","sourceRoot":"","sources":["../../src/interface/clientInterface.ts"],"names":[],"mappings":"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"}
@@ -1,37 +1,36 @@
1
1
  import * as oauth from 'oauth4webapi';
2
2
  import crypto from "crypto";
3
- import { AccessTokenExpiredErrorCode, GrantInvalidErrorCode, KnownErrorCodes, KnownError, SignUpErrorCodes, SignInErrorCodes, EmailVerificationLinkErrorCodes, PasswordResetLinkErrorCodes } from "../utils/types";
4
- import { Result } from "../utils/results";
3
+ import { AccessTokenExpiredErrorCode, GrantInvalidErrorCode, KnownErrorCodes, KnownError, SignUpErrorCodes, SignInErrorCodes, EmailVerificationLinkErrorCodes, PasswordResetLinkErrorCodes, } from "../utils/types";
4
+ import { AsyncResult, Result } from "../utils/results";
5
5
  import { parseJson } from '../utils/json';
6
- import { AsyncCache, AsyncValueCache } from '../utils/caches';
7
6
  import { typedAssign } from '../utils/objects';
8
7
  import { AsyncStore } from '../utils/stores';
9
- import { neverResolve, runAsynchronously } from '../utils/promises';
8
+ export const sharedProviders = [
9
+ "shared-github",
10
+ "shared-google",
11
+ "shared-facebook",
12
+ "shared-microsoft",
13
+ ];
14
+ export const standardProviders = [
15
+ "github",
16
+ "facebook",
17
+ "google",
18
+ "microsoft",
19
+ ];
20
+ export function toStandardProvider(provider) {
21
+ return provider.replace("shared-", "");
22
+ }
23
+ export function toSharedProvider(provider) {
24
+ return "shared-" + provider;
25
+ }
10
26
  function getSessionCookieName(projectId) {
11
27
  return "__stack-token-" + crypto.createHash("sha256").update(projectId).digest("hex");
12
28
  }
13
29
  export class StackClientInterface {
14
30
  options;
15
- // note that we intentionally use TokenStore (a reference type) as a key, as different token stores with the same tokens should be treated differently
16
- // (if we wouldn't do that, we would cache users across requests, which may cause caching issues)
17
- currentUserCache;
18
- clientProjectCache;
19
31
  constructor(options) {
20
32
  this.options = options;
21
- this.currentUserCache = new AsyncCache(async (key, isFirst) => {
22
- if (isFirst) {
23
- key.onChange((newValue, oldValue) => {
24
- if (JSON.stringify(newValue) === JSON.stringify(oldValue))
25
- return;
26
- runAsynchronously(this.currentUserCache.refresh(key));
27
- });
28
- }
29
- const user = await this.getClientUserByToken(key);
30
- return Result.or(user, null);
31
- });
32
- this.clientProjectCache = new AsyncValueCache(async () => {
33
- return Result.orThrow(await this.getClientProject());
34
- });
33
+ // nothing here
35
34
  }
36
35
  get projectId() {
37
36
  return this.options.projectId;
@@ -42,12 +41,6 @@ export class StackClientInterface {
42
41
  getApiUrl() {
43
42
  return this.options.baseUrl + "/api/v1";
44
43
  }
45
- async refreshUser(tokenStore) {
46
- await this.currentUserCache.refresh(tokenStore);
47
- }
48
- async refreshProject() {
49
- await this.clientProjectCache.refresh();
50
- }
51
44
  async refreshAccessToken(tokenStore) {
52
45
  if (!('publishableClientKey' in this.options)) {
53
46
  // TODO fix
@@ -108,25 +101,14 @@ export class StackClientInterface {
108
101
  accessToken: null,
109
102
  refreshToken: null,
110
103
  });
111
- try {
112
- return await Result.orThrowAsync(Result.retry(() => this.sendClientRequestInner(path, requestOptions, tokenStore), 5, { exponentialDelayBase: 1000 }));
113
- }
114
- catch (error) {
115
- // TODO this is a hack. Occurs when the admin access token is invalid, or expired. Has plenty of weird side effects so we should replace this
116
- if ("internalAdminAccessToken" in this.options && error?.message?.includes?.("Invalid API key") && typeof window !== "undefined") {
117
- alert("Your session has expired. The page will now reload." + (process.env.NODE_ENV == "development" ? "\n\nThis is a hack and we should probably fix this at some point." : ""));
118
- window.location.reload();
119
- await neverResolve();
120
- }
121
- throw error;
122
- }
104
+ return await Result.orThrowAsync(Result.retry(() => this.sendClientRequestInner(path, requestOptions, tokenStore), 5, { exponentialDelayBase: 1000 }));
123
105
  }
124
106
  async sendClientRequestAndCatchKnownError(path, requestOptions, tokenStoreOrNull, errorCodes) {
125
107
  try {
126
108
  return Result.ok(await this.sendClientRequest(path, requestOptions, tokenStoreOrNull));
127
109
  }
128
110
  catch (e) {
129
- if (e instanceof KnownError && errorCodes.includes(e.errorCode)) {
111
+ if (e instanceof KnownError && errorCodes.some(code => code === e.errorCode)) {
130
112
  return Result.error(e.errorCode);
131
113
  }
132
114
  throw e;
@@ -153,8 +135,8 @@ export class StackClientInterface {
153
135
  ...'publishableClientKey' in this.options ? {
154
136
  "x-stack-publishable-client-key": this.options.publishableClientKey,
155
137
  } : {},
156
- ...'internalAdminAccessToken' in this.options ? {
157
- "x-stack-admin-access-token": this.options.internalAdminAccessToken,
138
+ ...'projectOwnerTokens' in this.options ? {
139
+ "x-stack-admin-access-token": AsyncResult.or(this.options.projectOwnerTokens?.get(), null)?.accessToken ?? "",
158
140
  } : {},
159
141
  ...options.headers,
160
142
  },
@@ -264,7 +246,6 @@ export class StackClientInterface {
264
246
  accessToken: result.access_token,
265
247
  refreshToken: result.refresh_token,
266
248
  });
267
- await this.refreshUser(tokenStore);
268
249
  }
269
250
  async signUpWithCredential(email, password, emailVerificationRedirectUrl, tokenStore) {
270
251
  const res = await this.sendClientRequestAndCatchKnownError("/auth/signup", {
@@ -286,9 +267,8 @@ export class StackClientInterface {
286
267
  accessToken: result.access_token,
287
268
  refreshToken: result.refresh_token,
288
269
  });
289
- await this.refreshUser(tokenStore);
290
270
  }
291
- async getOauthUrl(provider, redirectUrl, codeChallenge, state) {
271
+ async getOAuthUrl(provider, redirectUrl, codeChallenge, state) {
292
272
  const updatedRedirectUrl = new URL(redirectUrl);
293
273
  for (const key of ["code", "state"]) {
294
274
  if (updatedRedirectUrl.searchParams.has(key)) {
@@ -298,7 +278,7 @@ export class StackClientInterface {
298
278
  }
299
279
  if (!('publishableClientKey' in this.options)) {
300
280
  // TODO fix
301
- throw new Error("Admin session token is currently not supported for Oauth");
281
+ throw new Error("Admin session token is currently not supported for OAuth");
302
282
  }
303
283
  const url = new URL(this.getApiUrl() + "/auth/authorize/" + provider.toLowerCase());
304
284
  url.searchParams.set("client_id", this.projectId);
@@ -312,10 +292,10 @@ export class StackClientInterface {
312
292
  url.searchParams.set("response_type", "code");
313
293
  return url.toString();
314
294
  }
315
- async callOauthCallback(oauthParams, redirectUri, codeVerifier, state, tokenStore) {
295
+ async callOAuthCallback(oauthParams, redirectUri, codeVerifier, state, tokenStore) {
316
296
  if (!('publishableClientKey' in this.options)) {
317
297
  // TODO fix
318
- throw new Error("Admin session token is currently not supported for Oauth");
298
+ throw new Error("Admin session token is currently not supported for OAuth");
319
299
  }
320
300
  const as = {
321
301
  issuer: this.options.baseUrl,
@@ -349,7 +329,6 @@ export class StackClientInterface {
349
329
  accessToken: result.access_token ?? null,
350
330
  refreshToken: result.refresh_token ?? old?.refreshToken ?? null,
351
331
  }));
352
- await this.refreshUser(tokenStore);
353
332
  }
354
333
  async signOut(tokenStore) {
355
334
  const tokenObj = await tokenStore.getOrWait();
@@ -367,7 +346,6 @@ export class StackClientInterface {
367
346
  accessToken: null,
368
347
  refreshToken: null,
369
348
  });
370
- await this.refreshUser(tokenStore);
371
349
  }
372
350
  async getClientUserByToken(tokenStore) {
373
351
  const response = await this.sendClientRequest("/current-user", {}, tokenStore);
@@ -391,7 +369,6 @@ export class StackClientInterface {
391
369
  },
392
370
  body: JSON.stringify(update),
393
371
  }, tokenStore);
394
- await this.refreshUser(tokenStore);
395
372
  }
396
373
  async listProjects(tokenStore) {
397
374
  const response = await this.sendClientRequest("/projects", {}, tokenStore);
@@ -418,9 +395,14 @@ export class StackClientInterface {
418
395
  }
419
396
  export function getProductionModeErrors(project) {
420
397
  const errors = [];
421
- for (const { domain, handlerPath } of project.evaluatedConfig.domains) {
422
- // TODO: check if handlerPath is valid
423
- const fixUrlRelative = `/projects/${encodeURIComponent(project.id)}/auth/urls-and-callbacks`;
398
+ const fixUrlRelative = `/projects/${encodeURIComponent(project.id)}/auth/urls-and-callbacks`;
399
+ if (project.evaluatedConfig.allowLocalhost) {
400
+ errors.push({
401
+ errorMessage: "Localhost is not allowed in production mode, turn off 'Allow localhost' in project settings",
402
+ fixUrlRelative,
403
+ });
404
+ }
405
+ for (const { domain } of project.evaluatedConfig.domains) {
424
406
  let url;
425
407
  try {
426
408
  url = new URL(domain);
@@ -446,7 +428,7 @@ export function getProductionModeErrors(project) {
446
428
  }
447
429
  else if (url.protocol !== "https:") {
448
430
  errors.push({
449
- errorMessage: "Auth callback prefix should be HTTPS: " + domain,
431
+ errorMessage: "Domain should be HTTPS: " + domain,
450
432
  fixUrlRelative,
451
433
  });
452
434
  }