@stackframe/js 2.8.41 → 2.8.44

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 (43) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/esm/integrations/convex/component/convex.config.js +8 -0
  3. package/dist/esm/integrations/convex/component/convex.config.js.map +1 -0
  4. package/dist/esm/integrations/convex.js +5 -4
  5. package/dist/esm/integrations/convex.js.map +1 -1
  6. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js +17 -28
  7. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
  8. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js +89 -24
  9. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
  10. package/dist/esm/lib/stack-app/apps/implementations/common.js +12 -3
  11. package/dist/esm/lib/stack-app/apps/implementations/common.js.map +1 -1
  12. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js +107 -43
  13. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
  14. package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js.map +1 -1
  15. package/dist/esm/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
  16. package/dist/esm/lib/stack-app/apps/interfaces/server-app.js.map +1 -1
  17. package/dist/esm/lib/stack-app/projects/index.js.map +1 -1
  18. package/dist/esm/lib/stack-app/users/index.js +16 -0
  19. package/dist/esm/lib/stack-app/users/index.js.map +1 -1
  20. package/dist/index.d.mts +86 -23
  21. package/dist/index.d.ts +86 -23
  22. package/dist/integrations/convex/component/convex.config.d.mts +5 -0
  23. package/dist/integrations/convex/component/convex.config.d.ts +5 -0
  24. package/dist/integrations/convex/component/convex.config.js +29 -0
  25. package/dist/integrations/convex/component/convex.config.js.map +1 -0
  26. package/dist/integrations/convex.js +4 -3
  27. package/dist/integrations/convex.js.map +1 -1
  28. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js +16 -27
  29. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
  30. package/dist/lib/stack-app/apps/implementations/client-app-impl.js +87 -22
  31. package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
  32. package/dist/lib/stack-app/apps/implementations/common.js +14 -3
  33. package/dist/lib/stack-app/apps/implementations/common.js.map +1 -1
  34. package/dist/lib/stack-app/apps/implementations/server-app-impl.js +105 -41
  35. package/dist/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
  36. package/dist/lib/stack-app/apps/interfaces/admin-app.js.map +1 -1
  37. package/dist/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
  38. package/dist/lib/stack-app/apps/interfaces/server-app.js.map +1 -1
  39. package/dist/lib/stack-app/customers/index.js.map +1 -1
  40. package/dist/lib/stack-app/projects/index.js.map +1 -1
  41. package/dist/lib/stack-app/users/index.js +17 -0
  42. package/dist/lib/stack-app/users/index.js.map +1 -1
  43. package/package.json +12 -3
@@ -24,13 +24,15 @@ __export(common_exports, {
24
24
  createCache: () => createCache,
25
25
  createCacheBySession: () => createCacheBySession,
26
26
  createEmptyTokenStore: () => createEmptyTokenStore,
27
+ defaultBaseUrl: () => defaultBaseUrl,
27
28
  getBaseUrl: () => getBaseUrl,
28
29
  getDefaultExtraRequestHeaders: () => getDefaultExtraRequestHeaders,
29
30
  getDefaultProjectId: () => getDefaultProjectId,
30
31
  getDefaultPublishableClientKey: () => getDefaultPublishableClientKey,
31
32
  getDefaultSecretServerKey: () => getDefaultSecretServerKey,
32
33
  getDefaultSuperSecretAdminKey: () => getDefaultSuperSecretAdminKey,
33
- getUrls: () => getUrls
34
+ getUrls: () => getUrls,
35
+ resolveConstructorOptions: () => resolveConstructorOptions
34
36
  });
35
37
  module.exports = __toCommonJS(common_exports);
36
38
  var import_caches = require("@stackframe/stack-shared/dist/utils/caches");
@@ -39,8 +41,9 @@ var import_errors = require("@stackframe/stack-shared/dist/utils/errors");
39
41
  var import_objects = require("@stackframe/stack-shared/dist/utils/objects");
40
42
  var import_results = require("@stackframe/stack-shared/dist/utils/results");
41
43
  var import_stores = require("@stackframe/stack-shared/dist/utils/stores");
44
+ var import_common = require("../../common.js");
42
45
  var process = globalThis.process ?? { env: {} };
43
- var clientVersion = "js @stackframe/js@2.8.41";
46
+ var clientVersion = "js @stackframe/js@2.8.44";
44
47
  if (clientVersion.startsWith("STACK_COMPILE_TIME")) {
45
48
  throw new import_errors.StackAssertionError("Client version was not replaced. Something went wrong during build!");
46
49
  }
@@ -61,6 +64,12 @@ var createCacheBySession = (fetcher) => {
61
64
  }
62
65
  );
63
66
  };
67
+ function resolveConstructorOptions(options) {
68
+ return {
69
+ ...options.inheritsFrom?.[import_common.stackAppInternalsSymbol].getConstructorOptions() ?? {},
70
+ ...(0, import_objects.filterUndefined)((0, import_objects.omit)(options, ["inheritsFrom"]))
71
+ };
72
+ }
64
73
  function getUrls(partial) {
65
74
  const handler = partial.handler ?? "/handler";
66
75
  const home = partial.home ?? "/";
@@ -136,12 +145,14 @@ function createEmptyTokenStore() {
136
145
  createCache,
137
146
  createCacheBySession,
138
147
  createEmptyTokenStore,
148
+ defaultBaseUrl,
139
149
  getBaseUrl,
140
150
  getDefaultExtraRequestHeaders,
141
151
  getDefaultProjectId,
142
152
  getDefaultPublishableClientKey,
143
153
  getDefaultSecretServerKey,
144
154
  getDefaultSuperSecretAdminKey,
145
- getUrls
155
+ getUrls,
156
+ resolveConstructorOptions
146
157
  });
147
158
  //# sourceMappingURL=common.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/lib/stack-app/apps/implementations/common.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { InternalSession } from \"@stackframe/stack-shared/dist/sessions\";\nimport { AsyncCache } from \"@stackframe/stack-shared/dist/utils/caches\";\nimport { isBrowserLike } from \"@stackframe/stack-shared/dist/utils/env\";\nimport { StackAssertionError, concatStacktraces, throwErr } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { filterUndefined } from \"@stackframe/stack-shared/dist/utils/objects\";\nimport { ReactPromise } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { suspendIfSsr } from \"@stackframe/stack-shared/dist/utils/react\";\nimport { Result } from \"@stackframe/stack-shared/dist/utils/results\";\nimport { Store } from \"@stackframe/stack-shared/dist/utils/stores\";\nimport { HandlerUrls } from \"../../common\";\n\n// hack to make sure process is defined in non-node environments\nconst process = (globalThis as any).process ?? { env: {} }; // THIS_LINE_PLATFORM js react\n\nexport const clientVersion = \"js @stackframe/js@2.8.41\";\nif (clientVersion.startsWith(\"STACK_COMPILE_TIME\")) {\n throw new StackAssertionError(\"Client version was not replaced. Something went wrong during build!\");\n}\n\n\nexport const createCache = <D extends any[], T>(fetcher: (dependencies: D) => Promise<T>) => {\n return new AsyncCache<D, Result<T>>(\n async (dependencies) => await Result.fromThrowingAsync(async () => await fetcher(dependencies)),\n {},\n );\n};\n\nexport const createCacheBySession = <D extends any[], T>(fetcher: (session: InternalSession, extraDependencies: D) => Promise<T> ) => {\n return new AsyncCache<[InternalSession, ...D], Result<T>>(\n async ([session, ...extraDependencies]) => await Result.fromThrowingAsync(async () => await fetcher(session, extraDependencies)),\n {\n onSubscribe: ([session], refresh) => {\n const handler = session.onInvalidate(() => refresh());\n return () => handler.unsubscribe();\n },\n },\n );\n};\n\nexport function getUrls(partial: Partial<HandlerUrls>): HandlerUrls {\n const handler = partial.handler ?? \"/handler\";\n const home = partial.home ?? \"/\";\n const afterSignIn = partial.afterSignIn ?? home;\n return {\n handler,\n signIn: `${handler}/sign-in`,\n afterSignIn: home,\n signUp: `${handler}/sign-up`,\n afterSignUp: afterSignIn,\n signOut: `${handler}/sign-out`,\n afterSignOut: home,\n emailVerification: `${handler}/email-verification`,\n passwordReset: `${handler}/password-reset`,\n forgotPassword: `${handler}/forgot-password`,\n oauthCallback: `${handler}/oauth-callback`,\n magicLinkCallback: `${handler}/magic-link-callback`,\n home: home,\n accountSettings: `${handler}/account-settings`,\n error: `${handler}/error`,\n teamInvitation: `${handler}/team-invitation`,\n mfa: `${handler}/mfa`,\n ...filterUndefined(partial),\n };\n}\n\nexport function getDefaultProjectId() {\n return process.env.NEXT_PUBLIC_STACK_PROJECT_ID || process.env.STACK_PROJECT_ID || throwErr(new Error(\"Welcome to Stack Auth! It seems that you haven't provided a project ID. Please create a project on the Stack dashboard at https://app.stack-auth.com and put it in the NEXT_PUBLIC_STACK_PROJECT_ID environment variable.\"));\n}\n\nexport function getDefaultPublishableClientKey() {\n return process.env.NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY || process.env.STACK_PUBLISHABLE_CLIENT_KEY || throwErr(new Error(\"Welcome to Stack Auth! It seems that you haven't provided a publishable client key. Please create an API key for your project on the Stack dashboard at https://app.stack-auth.com and copy your publishable client key into the NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY environment variable.\"));\n}\n\nexport function getDefaultSecretServerKey() {\n return process.env.STACK_SECRET_SERVER_KEY || throwErr(new Error(\"No secret server key provided. Please copy your key from the Stack dashboard and put it in the STACK_SECRET_SERVER_KEY environment variable.\"));\n}\n\nexport function getDefaultSuperSecretAdminKey() {\n return process.env.STACK_SUPER_SECRET_ADMIN_KEY || throwErr(new Error(\"No super secret admin key provided. Please copy your key from the Stack dashboard and put it in the STACK_SUPER_SECRET_ADMIN_KEY environment variable.\"));\n}\n\nexport function getDefaultExtraRequestHeaders() {\n return JSON.parse(process.env.NEXT_PUBLIC_STACK_EXTRA_REQUEST_HEADERS || process.env.STACK_EXTRA_REQUEST_HEADERS || '{}');\n}\n\n/**\n * Returns the base URL for the Stack API.\n *\n * The URL can be specified in several ways, in order of precedence:\n * 1. Directly through userSpecifiedBaseUrl parameter as string or browser/server object\n * 2. Through environment variables:\n * - Browser: NEXT_PUBLIC_BROWSER_STACK_API_URL\n * - Server: NEXT_PUBLIC_SERVER_STACK_API_URL\n * - Fallback: NEXT_PUBLIC_STACK_API_URL or NEXT_PUBLIC_STACK_URL\n * 3. Default base URL if none of the above are specified\n *\n * The function also ensures the URL doesn't end with a trailing slash\n * by removing it if present.\n *\n * @param userSpecifiedBaseUrl - Optional URL override as string or {browser, server} object\n * @returns The configured base URL without trailing slash\n\n */\nexport function getBaseUrl(userSpecifiedBaseUrl: string | { browser: string, server: string } | undefined) {\n let url;\n if (userSpecifiedBaseUrl) {\n if (typeof userSpecifiedBaseUrl === \"string\") {\n url = userSpecifiedBaseUrl;\n } else {\n if (isBrowserLike()) {\n url = userSpecifiedBaseUrl.browser;\n } else {\n url = userSpecifiedBaseUrl.server;\n }\n }\n } else {\n // note: NEXT_PUBLIC_BROWSER_STACK_API_URL was renamed to NEXT_PUBLIC_STACK_API_URL_BROWSER, and NEXT_PUBLIC_STACK_URL to NEXT_PUBLIC_STACK_API_URL\n if (isBrowserLike()) {\n url = process.env.NEXT_PUBLIC_BROWSER_STACK_API_URL || process.env.NEXT_PUBLIC_STACK_API_URL_BROWSER || process.env.STACK_API_URL_BROWSER;\n } else {\n url = process.env.NEXT_PUBLIC_SERVER_STACK_API_URL || process.env.NEXT_PUBLIC_STACK_API_URL_SERVER || process.env.STACK_API_URL_SERVER;\n }\n url = url || process.env.NEXT_PUBLIC_STACK_API_URL || process.env.STACK_API_URL || process.env.NEXT_PUBLIC_STACK_URL || defaultBaseUrl;\n }\n\n return url.endsWith('/') ? url.slice(0, -1) : url;\n}\nconst defaultBaseUrl = \"https://api.stack-auth.com\";\n\nexport type TokenObject = {\n accessToken: string | null,\n refreshToken: string | null,\n};\n\nexport function createEmptyTokenStore() {\n return new Store<TokenObject>({\n refreshToken: null,\n accessToken: null,\n });\n}\n\n\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../src/lib/stack-app/apps/implementations/common.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { InternalSession } from \"@stackframe/stack-shared/dist/sessions\";\nimport { AsyncCache } from \"@stackframe/stack-shared/dist/utils/caches\";\nimport { isBrowserLike } from \"@stackframe/stack-shared/dist/utils/env\";\nimport { StackAssertionError, concatStacktraces, throwErr } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { getGlobal } from \"@stackframe/stack-shared/dist/utils/globals\";\nimport { filterUndefined, omit } from \"@stackframe/stack-shared/dist/utils/objects\";\nimport { ReactPromise } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { suspendIfSsr } from \"@stackframe/stack-shared/dist/utils/react\";\nimport { Result } from \"@stackframe/stack-shared/dist/utils/results\";\nimport { Store } from \"@stackframe/stack-shared/dist/utils/stores\";\nimport { HandlerUrls, stackAppInternalsSymbol } from \"../../common\";\n\n// hack to make sure process is defined in non-node environments\nconst process = (globalThis as any).process ?? { env: {} }; // THIS_LINE_PLATFORM js react\n\nexport const clientVersion = \"js @stackframe/js@2.8.44\";\nif (clientVersion.startsWith(\"STACK_COMPILE_TIME\")) {\n throw new StackAssertionError(\"Client version was not replaced. Something went wrong during build!\");\n}\n\n\nexport const createCache = <D extends any[], T>(fetcher: (dependencies: D) => Promise<T>) => {\n return new AsyncCache<D, Result<T>>(\n async (dependencies) => await Result.fromThrowingAsync(async () => await fetcher(dependencies)),\n {},\n );\n};\n\nexport const createCacheBySession = <D extends any[], T>(fetcher: (session: InternalSession, extraDependencies: D) => Promise<T> ) => {\n return new AsyncCache<[InternalSession, ...D], Result<T>>(\n async ([session, ...extraDependencies]) => await Result.fromThrowingAsync(async () => await fetcher(session, extraDependencies)),\n {\n onSubscribe: ([session], refresh) => {\n const handler = session.onInvalidate(() => refresh());\n return () => handler.unsubscribe();\n },\n },\n );\n};\n\n\ntype AppLike = { [stackAppInternalsSymbol]: { getConstructorOptions: () => any } };\nexport function resolveConstructorOptions<T extends { inheritsFrom?: AppLike }>(options: T): T & { inheritsFrom?: undefined } {\n return {\n ...options.inheritsFrom?.[stackAppInternalsSymbol].getConstructorOptions() ?? {},\n ...filterUndefined(omit(options, [\"inheritsFrom\"])),\n };\n}\n\nexport function getUrls(partial: Partial<HandlerUrls>): HandlerUrls {\n const handler = partial.handler ?? \"/handler\";\n const home = partial.home ?? \"/\";\n const afterSignIn = partial.afterSignIn ?? home;\n return {\n handler,\n signIn: `${handler}/sign-in`,\n afterSignIn: home,\n signUp: `${handler}/sign-up`,\n afterSignUp: afterSignIn,\n signOut: `${handler}/sign-out`,\n afterSignOut: home,\n emailVerification: `${handler}/email-verification`,\n passwordReset: `${handler}/password-reset`,\n forgotPassword: `${handler}/forgot-password`,\n oauthCallback: `${handler}/oauth-callback`,\n magicLinkCallback: `${handler}/magic-link-callback`,\n home: home,\n accountSettings: `${handler}/account-settings`,\n error: `${handler}/error`,\n teamInvitation: `${handler}/team-invitation`,\n mfa: `${handler}/mfa`,\n ...filterUndefined(partial),\n };\n}\n\nexport function getDefaultProjectId() {\n return process.env.NEXT_PUBLIC_STACK_PROJECT_ID || process.env.STACK_PROJECT_ID || throwErr(new Error(\"Welcome to Stack Auth! It seems that you haven't provided a project ID. Please create a project on the Stack dashboard at https://app.stack-auth.com and put it in the NEXT_PUBLIC_STACK_PROJECT_ID environment variable.\"));\n}\n\nexport function getDefaultPublishableClientKey() {\n return process.env.NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY || process.env.STACK_PUBLISHABLE_CLIENT_KEY || throwErr(new Error(\"Welcome to Stack Auth! It seems that you haven't provided a publishable client key. Please create an API key for your project on the Stack dashboard at https://app.stack-auth.com and copy your publishable client key into the NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY environment variable.\"));\n}\n\nexport function getDefaultSecretServerKey() {\n return process.env.STACK_SECRET_SERVER_KEY || throwErr(new Error(\"No secret server key provided. Please copy your key from the Stack dashboard and put it in the STACK_SECRET_SERVER_KEY environment variable.\"));\n}\n\nexport function getDefaultSuperSecretAdminKey() {\n return process.env.STACK_SUPER_SECRET_ADMIN_KEY || throwErr(new Error(\"No super secret admin key provided. Please copy your key from the Stack dashboard and put it in the STACK_SUPER_SECRET_ADMIN_KEY environment variable.\"));\n}\n\nexport function getDefaultExtraRequestHeaders() {\n return JSON.parse(process.env.NEXT_PUBLIC_STACK_EXTRA_REQUEST_HEADERS || process.env.STACK_EXTRA_REQUEST_HEADERS || '{}');\n}\n\n/**\n * Returns the base URL for the Stack API.\n *\n * The URL can be specified in several ways, in order of precedence:\n * 1. Directly through userSpecifiedBaseUrl parameter as string or browser/server object\n * 2. Through environment variables:\n * - Browser: NEXT_PUBLIC_BROWSER_STACK_API_URL\n * - Server: NEXT_PUBLIC_SERVER_STACK_API_URL\n * - Fallback: NEXT_PUBLIC_STACK_API_URL or NEXT_PUBLIC_STACK_URL\n * 3. Default base URL if none of the above are specified\n *\n * The function also ensures the URL doesn't end with a trailing slash\n * by removing it if present.\n *\n * @param userSpecifiedBaseUrl - Optional URL override as string or {browser, server} object\n * @returns The configured base URL without trailing slash\n\n */\nexport function getBaseUrl(userSpecifiedBaseUrl: string | { browser: string, server: string } | undefined) {\n let url;\n if (userSpecifiedBaseUrl) {\n if (typeof userSpecifiedBaseUrl === \"string\") {\n url = userSpecifiedBaseUrl;\n } else {\n if (isBrowserLike()) {\n url = userSpecifiedBaseUrl.browser;\n } else {\n url = userSpecifiedBaseUrl.server;\n }\n }\n } else {\n // note: NEXT_PUBLIC_BROWSER_STACK_API_URL was renamed to NEXT_PUBLIC_STACK_API_URL_BROWSER, and NEXT_PUBLIC_STACK_URL to NEXT_PUBLIC_STACK_API_URL\n if (isBrowserLike()) {\n url = process.env.NEXT_PUBLIC_BROWSER_STACK_API_URL || process.env.NEXT_PUBLIC_STACK_API_URL_BROWSER || process.env.STACK_API_URL_BROWSER;\n } else {\n url = process.env.NEXT_PUBLIC_SERVER_STACK_API_URL || process.env.NEXT_PUBLIC_STACK_API_URL_SERVER || process.env.STACK_API_URL_SERVER;\n }\n url = url || process.env.NEXT_PUBLIC_STACK_API_URL || process.env.STACK_API_URL || process.env.NEXT_PUBLIC_STACK_URL || defaultBaseUrl;\n }\n\n return url.endsWith('/') ? url.slice(0, -1) : url;\n}\nexport const defaultBaseUrl = \"https://api.stack-auth.com\";\n\nexport type TokenObject = {\n accessToken: string | null,\n refreshToken: string | null,\n};\n\nexport function createEmptyTokenStore() {\n return new Store<TokenObject>({\n refreshToken: null,\n accessToken: null,\n });\n}\n\n\n"],"mappings":"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","names":[]}
@@ -34,29 +34,18 @@ var import_users = require("../../users/index.js");
34
34
  var import_client_app_impl = require("./client-app-impl.js");
35
35
  var import_common = require("./common.js");
36
36
  var _StackServerAppImplIncomplete = class extends import_client_app_impl._StackClientAppImplIncomplete {
37
- constructor(options) {
38
- super("interface" in options ? {
39
- interface: options.interface,
40
- tokenStore: options.tokenStore,
41
- urls: options.urls,
42
- oauthScopesOnSignIn: options.oauthScopesOnSignIn
43
- } : {
44
- interface: new import_stack_shared.StackServerInterface({
45
- getBaseUrl: () => (0, import_common.getBaseUrl)(options.baseUrl),
46
- projectId: options.projectId ?? (0, import_common.getDefaultProjectId)(),
47
- extraRequestHeaders: options.extraRequestHeaders ?? (0, import_common.getDefaultExtraRequestHeaders)(),
37
+ constructor(options, extraOptions) {
38
+ const resolvedOptions = (0, import_common.resolveConstructorOptions)(options);
39
+ super(resolvedOptions, {
40
+ ...extraOptions,
41
+ interface: extraOptions?.interface ?? new import_stack_shared.StackServerInterface({
42
+ getBaseUrl: () => (0, import_common.getBaseUrl)(resolvedOptions.baseUrl),
43
+ projectId: resolvedOptions.projectId ?? (0, import_common.getDefaultProjectId)(),
44
+ extraRequestHeaders: resolvedOptions.extraRequestHeaders ?? (0, import_common.getDefaultExtraRequestHeaders)(),
48
45
  clientVersion: import_common.clientVersion,
49
- publishableClientKey: options.publishableClientKey ?? (0, import_common.getDefaultPublishableClientKey)(),
50
- secretServerKey: options.secretServerKey ?? (0, import_common.getDefaultSecretServerKey)()
51
- }),
52
- baseUrl: options.baseUrl,
53
- extraRequestHeaders: options.extraRequestHeaders,
54
- projectId: options.projectId,
55
- publishableClientKey: options.publishableClientKey,
56
- tokenStore: options.tokenStore,
57
- urls: options.urls,
58
- oauthScopesOnSignIn: options.oauthScopesOnSignIn,
59
- redirectMethod: options.redirectMethod
46
+ publishableClientKey: resolvedOptions.publishableClientKey ?? (0, import_common.getDefaultPublishableClientKey)(),
47
+ secretServerKey: resolvedOptions.secretServerKey ?? (0, import_common.getDefaultSecretServerKey)()
48
+ })
60
49
  });
61
50
  // TODO override the client user cache to use the server user cache, so we save some requests
62
51
  this._currentServerUserCache = (0, import_common.createCacheBySession)(async (session) => {
@@ -185,6 +174,67 @@ var _StackServerAppImplIncomplete = class extends import_client_app_impl._StackC
185
174
  return await this._interface.getItem({ customCustomerId, itemId }, null);
186
175
  }
187
176
  );
177
+ this._serverUserProductsCache = (0, import_common.createCache)(
178
+ async ([userId, cursor, limit]) => {
179
+ return await this._interface.listProducts({
180
+ customer_type: "user",
181
+ customer_id: userId,
182
+ cursor: cursor ?? void 0,
183
+ limit: limit ?? void 0
184
+ }, null);
185
+ }
186
+ );
187
+ this._serverTeamProductsCache = (0, import_common.createCache)(
188
+ async ([teamId, cursor, limit]) => {
189
+ return await this._interface.listProducts({
190
+ customer_type: "team",
191
+ customer_id: teamId,
192
+ cursor: cursor ?? void 0,
193
+ limit: limit ?? void 0
194
+ }, null);
195
+ }
196
+ );
197
+ this._serverCustomProductsCache = (0, import_common.createCache)(
198
+ async ([customCustomerId, cursor, limit]) => {
199
+ return await this._interface.listProducts({
200
+ customer_type: "custom",
201
+ customer_id: customCustomerId,
202
+ cursor: cursor ?? void 0,
203
+ limit: limit ?? void 0
204
+ }, null);
205
+ }
206
+ );
207
+ }
208
+ _createServerCustomer(userIdOrTeamId, type) {
209
+ const app = this;
210
+ const productsCache = type === "user" ? app._serverUserProductsCache : app._serverTeamProductsCache;
211
+ const customerOptions = type === "user" ? { userId: userIdOrTeamId } : { teamId: userIdOrTeamId };
212
+ return {
213
+ ...this._createCustomer(userIdOrTeamId, type, null),
214
+ async getItem(itemId) {
215
+ return await app.getItem({ itemId, ...customerOptions });
216
+ },
217
+ async grantProduct(productOptions) {
218
+ if (type === "user") {
219
+ if ("productId" in productOptions) {
220
+ await app.grantProduct({ userId: userIdOrTeamId, productId: productOptions.productId, quantity: productOptions.quantity });
221
+ } else {
222
+ await app.grantProduct({ userId: userIdOrTeamId, product: productOptions.product, quantity: productOptions.quantity });
223
+ }
224
+ } else {
225
+ if ("productId" in productOptions) {
226
+ await app.grantProduct({ teamId: userIdOrTeamId, productId: productOptions.productId, quantity: productOptions.quantity });
227
+ } else {
228
+ await app.grantProduct({ teamId: userIdOrTeamId, product: productOptions.product, quantity: productOptions.quantity });
229
+ }
230
+ }
231
+ await productsCache.refresh([userIdOrTeamId, null, null]);
232
+ },
233
+ async createCheckoutUrl(options) {
234
+ const productIdOrInline = "productId" in options ? options.productId : options.product;
235
+ return await app._interface.createCheckoutUrl(type, userIdOrTeamId, productIdOrInline, null, options.returnUrl);
236
+ }
237
+ };
188
238
  }
189
239
  async _updateServerUser(userId, update) {
190
240
  const result = await this._interface.updateServerUser(userId, (0, import_users.serverUserUpdateOptionsToCrud)(update));
@@ -311,7 +361,7 @@ var _StackServerAppImplIncomplete = class extends import_client_app_impl._StackC
311
361
  const scopeString = options?.scopes?.join(" ");
312
362
  return import_results.Result.orThrow(await app._serverUserOAuthConnectionCache.getOrWait([crud.id, id, scopeString || "", options?.or === "redirect"], "write-only"));
313
363
  }
314
- return {
364
+ const serverUser = {
315
365
  ...super._createBaseUser(crud),
316
366
  lastActiveAt: new Date(crud.last_active_at_millis),
317
367
  serverMetadata: crud.server_metadata,
@@ -495,24 +545,21 @@ var _StackServerAppImplIncomplete = class extends import_client_app_impl._StackC
495
545
  const providers = await this.listOAuthProviders();
496
546
  return providers.find((p) => p.id === id) ?? null;
497
547
  },
498
- async createCheckoutUrl(options) {
499
- const offerIdOrInline = "offerId" in options ? options.offerId : options.offer;
500
- return await app._interface.createCheckoutUrl("user", crud.id, offerIdOrInline, null);
501
- },
502
- async getItem(itemId) {
503
- const result = import_results.Result.orThrow(await app._serverUserItemsCache.getOrWait([crud.id, itemId], "write-only"));
504
- return app._serverItemFromCrud({ type: "user", id: crud.id }, result);
505
- }
548
+ ...app._createServerCustomer(crud.id, "user")
506
549
  };
550
+ (0, import_users.attachUserDestructureGuard)(serverUser);
551
+ return serverUser;
507
552
  }
508
553
  _serverTeamUserFromCrud(crud) {
509
- return {
554
+ const teamUser = {
510
555
  ...this._serverUserFromCrud(crud.user),
511
556
  teamProfile: {
512
557
  displayName: crud.display_name,
513
558
  profileImageUrl: crud.profile_image_url
514
559
  }
515
560
  };
561
+ (0, import_users.attachUserDestructureGuard)(teamUser);
562
+ return teamUser;
516
563
  }
517
564
  _serverTeamInvitationFromCrud(crud) {
518
565
  return {
@@ -521,16 +568,17 @@ var _StackServerAppImplIncomplete = class extends import_client_app_impl._StackC
521
568
  expiresAt: new Date(crud.expires_at_millis),
522
569
  revoke: async () => {
523
570
  await this._interface.revokeServerTeamInvitation(crud.id, crud.team_id);
571
+ await this._serverTeamInvitationsCache.refresh([crud.team_id]);
524
572
  }
525
573
  };
526
574
  }
527
575
  _currentUserFromCrud(crud, session) {
528
- const app = this;
529
576
  const currentUser = {
530
577
  ...this._serverUserFromCrud(crud),
531
578
  ...this._createAuth(session),
532
579
  ...this._isInternalProject() ? this._createInternalUserExtra(session) : {}
533
580
  };
581
+ (0, import_users.attachUserDestructureGuard)(currentUser);
534
582
  Object.freeze(currentUser);
535
583
  return currentUser;
536
584
  }
@@ -595,14 +643,7 @@ var _StackServerAppImplIncomplete = class extends import_client_app_impl._StackC
595
643
  await app._serverTeamApiKeysCache.refresh([crud.id]);
596
644
  return app._serverApiKeyFromCrud(result);
597
645
  },
598
- async getItem(itemId) {
599
- const result = import_results.Result.orThrow(await app._serverTeamItemsCache.getOrWait([crud.id, itemId], "write-only"));
600
- return app._serverItemFromCrud({ type: "team", id: crud.id }, result);
601
- },
602
- async createCheckoutUrl(options) {
603
- const offerIdOrInline = "offerId" in options ? options.offerId : options.offer;
604
- return await app._interface.createCheckoutUrl("team", crud.id, offerIdOrInline, null);
605
- }
646
+ ...app._createServerCustomer(crud.id, "team")
606
647
  };
607
648
  }
608
649
  _serverItemFromCrud(customer, crud) {
@@ -767,6 +808,29 @@ var _StackServerAppImplIncomplete = class extends import_client_app_impl._StackC
767
808
  return this._serverItemFromCrud({ type: "custom", id: options.customCustomerId }, result);
768
809
  }
769
810
  }
811
+ async grantProduct(options) {
812
+ let customerType;
813
+ let customerId;
814
+ if ("userId" in options) {
815
+ customerType = "user";
816
+ customerId = options.userId;
817
+ } else if ("teamId" in options) {
818
+ customerType = "team";
819
+ customerId = options.teamId;
820
+ } else {
821
+ customerType = "custom";
822
+ customerId = options.customCustomerId;
823
+ }
824
+ await this._interface.grantProduct({
825
+ customerType,
826
+ customerId,
827
+ productId: "productId" in options ? options.productId : void 0,
828
+ product: "product" in options ? options.product : void 0,
829
+ quantity: options.quantity
830
+ });
831
+ const cache = customerType === "user" ? this._serverUserProductsCache : customerType === "team" ? this._serverTeamProductsCache : this._serverCustomProductsCache;
832
+ await cache.refresh([customerId, null, null]);
833
+ }
770
834
  async createTeam(data) {
771
835
  const team = await this._interface.createServerTeam((0, import_teams.serverTeamCreateOptionsToCrud)(data));
772
836
  await this._serverTeamsCache.refresh([void 0]);