@stackframe/stack-shared 2.8.16 → 2.8.19

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 (72) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/config/schema.d.mts +4 -0
  3. package/dist/config/schema.d.ts +4 -0
  4. package/dist/config/schema.js +4 -2
  5. package/dist/config/schema.js.map +1 -1
  6. package/dist/esm/config/schema.js +4 -2
  7. package/dist/esm/config/schema.js.map +1 -1
  8. package/dist/esm/interface/admin-interface.js +38 -0
  9. package/dist/esm/interface/admin-interface.js.map +1 -1
  10. package/dist/esm/interface/client-interface.js +24 -0
  11. package/dist/esm/interface/client-interface.js.map +1 -1
  12. package/dist/esm/interface/crud/email-templates.js +1 -1
  13. package/dist/esm/interface/crud/email-templates.js.map +1 -1
  14. package/dist/esm/interface/crud/notification-preferences.js +20 -0
  15. package/dist/esm/interface/crud/notification-preferences.js.map +1 -0
  16. package/dist/esm/interface/crud/projects.js +2 -0
  17. package/dist/esm/interface/crud/projects.js.map +1 -1
  18. package/dist/esm/interface/server-interface.js +26 -0
  19. package/dist/esm/interface/server-interface.js.map +1 -1
  20. package/dist/esm/known-errors.js +12 -1
  21. package/dist/esm/known-errors.js.map +1 -1
  22. package/dist/esm/schema-fields.js +2 -0
  23. package/dist/esm/schema-fields.js.map +1 -1
  24. package/dist/esm/utils/react.js +11 -1
  25. package/dist/esm/utils/react.js.map +1 -1
  26. package/dist/index.d.mts +1 -0
  27. package/dist/index.d.ts +1 -0
  28. package/dist/interface/admin-interface.d.mts +11 -0
  29. package/dist/interface/admin-interface.d.ts +11 -0
  30. package/dist/interface/admin-interface.js +38 -0
  31. package/dist/interface/admin-interface.js.map +1 -1
  32. package/dist/interface/client-interface.d.mts +3 -0
  33. package/dist/interface/client-interface.d.ts +3 -0
  34. package/dist/interface/client-interface.js +24 -0
  35. package/dist/interface/client-interface.js.map +1 -1
  36. package/dist/interface/crud/current-user.d.mts +1 -1
  37. package/dist/interface/crud/current-user.d.ts +1 -1
  38. package/dist/interface/crud/email-templates.d.mts +5 -5
  39. package/dist/interface/crud/email-templates.d.ts +5 -5
  40. package/dist/interface/crud/email-templates.js +1 -1
  41. package/dist/interface/crud/email-templates.js.map +1 -1
  42. package/dist/interface/crud/notification-preferences.d.mts +25 -0
  43. package/dist/interface/crud/notification-preferences.d.ts +25 -0
  44. package/dist/interface/crud/notification-preferences.js +45 -0
  45. package/dist/interface/crud/notification-preferences.js.map +1 -0
  46. package/dist/interface/crud/project-api-keys.d.mts +4 -4
  47. package/dist/interface/crud/project-api-keys.d.ts +4 -4
  48. package/dist/interface/crud/projects.d.mts +17 -7
  49. package/dist/interface/crud/projects.d.ts +17 -7
  50. package/dist/interface/crud/projects.js +2 -0
  51. package/dist/interface/crud/projects.js.map +1 -1
  52. package/dist/interface/crud/team-member-profiles.d.mts +2 -2
  53. package/dist/interface/crud/team-member-profiles.d.ts +2 -2
  54. package/dist/interface/crud/users.d.mts +4 -4
  55. package/dist/interface/crud/users.d.ts +4 -4
  56. package/dist/interface/server-interface.d.mts +3 -0
  57. package/dist/interface/server-interface.d.ts +3 -0
  58. package/dist/interface/server-interface.js +26 -0
  59. package/dist/interface/server-interface.js.map +1 -1
  60. package/dist/known-errors.d.mts +4 -1
  61. package/dist/known-errors.d.ts +4 -1
  62. package/dist/known-errors.js +12 -1
  63. package/dist/known-errors.js.map +1 -1
  64. package/dist/schema-fields.d.mts +2 -1
  65. package/dist/schema-fields.d.ts +2 -1
  66. package/dist/schema-fields.js +3 -0
  67. package/dist/schema-fields.js.map +1 -1
  68. package/dist/utils/react.d.mts +7 -2
  69. package/dist/utils/react.d.ts +7 -2
  70. package/dist/utils/react.js +13 -2
  71. package/dist/utils/react.js.map +1 -1
  72. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # @stackframe/stack-shared
2
2
 
3
+ ## 2.8.19
4
+
5
+ ### Patch Changes
6
+
7
+ - Various changes
8
+
9
+ ## 2.8.18
10
+
11
+ ### Patch Changes
12
+
13
+ - Various changes
14
+
15
+ ## 2.8.17
16
+
3
17
  ## 2.8.16
4
18
 
5
19
  ### Patch Changes
@@ -177,6 +177,7 @@ declare const environmentConfigSchema: yup.ObjectSchema<{
177
177
  }) | undefined;
178
178
  }) | undefined;
179
179
  emails: Omit<{}, never> & {
180
+ theme?: "default-light" | "default-dark" | undefined;
180
181
  server: {
181
182
  host?: string | undefined;
182
183
  port?: number | undefined;
@@ -229,6 +230,7 @@ declare const environmentConfigSchema: yup.ObjectSchema<{
229
230
  }) | undefined;
230
231
  }) | undefined;
231
232
  emails: Omit<{}, never> & {
233
+ theme?: "default-light" | "default-dark" | undefined;
232
234
  server: {
233
235
  host?: string | undefined;
234
236
  port?: number | undefined;
@@ -474,6 +476,7 @@ declare const organizationConfigSchema: yup.ObjectSchema<{
474
476
  }) | undefined;
475
477
  }) | undefined;
476
478
  emails: Omit<{}, never> & {
479
+ theme?: "default-light" | "default-dark" | undefined;
477
480
  server: {
478
481
  host?: string | undefined;
479
482
  port?: number | undefined;
@@ -691,6 +694,7 @@ declare const organizationConfigDefaults: {
691
694
  server: {
692
695
  isShared: true;
693
696
  };
697
+ theme: "default-light";
694
698
  };
695
699
  };
696
700
  type DeepReplaceAllowFunctionsForObjects<T> = T extends object ? {
@@ -177,6 +177,7 @@ declare const environmentConfigSchema: yup.ObjectSchema<{
177
177
  }) | undefined;
178
178
  }) | undefined;
179
179
  emails: Omit<{}, never> & {
180
+ theme?: "default-light" | "default-dark" | undefined;
180
181
  server: {
181
182
  host?: string | undefined;
182
183
  port?: number | undefined;
@@ -229,6 +230,7 @@ declare const environmentConfigSchema: yup.ObjectSchema<{
229
230
  }) | undefined;
230
231
  }) | undefined;
231
232
  emails: Omit<{}, never> & {
233
+ theme?: "default-light" | "default-dark" | undefined;
232
234
  server: {
233
235
  host?: string | undefined;
234
236
  port?: number | undefined;
@@ -474,6 +476,7 @@ declare const organizationConfigSchema: yup.ObjectSchema<{
474
476
  }) | undefined;
475
477
  }) | undefined;
476
478
  emails: Omit<{}, never> & {
479
+ theme?: "default-light" | "default-dark" | undefined;
477
480
  server: {
478
481
  host?: string | undefined;
479
482
  port?: number | undefined;
@@ -691,6 +694,7 @@ declare const organizationConfigDefaults: {
691
694
  server: {
692
695
  isShared: true;
693
696
  };
697
+ theme: "default-light";
694
698
  };
695
699
  };
696
700
  type DeepReplaceAllowFunctionsForObjects<T> = T extends object ? {
@@ -145,7 +145,8 @@ var environmentConfigSchema = branchConfigSchema.concat((0, import_schema_fields
145
145
  password: schemaFields.emailPasswordSchema.optional().nonEmpty(),
146
146
  senderName: schemaFields.emailSenderNameSchema.optional().nonEmpty(),
147
147
  senderEmail: schemaFields.emailSenderEmailSchema.optional().nonEmpty()
148
- })
148
+ }),
149
+ theme: schemaFields.emailThemeSchema.optional()
149
150
  }).optional()),
150
151
  domains: branchConfigSchema.getNested("domains").concat((0, import_schema_fields.yupObject)({
151
152
  trustedDomains: (0, import_schema_fields.yupRecord)(
@@ -212,7 +213,8 @@ var organizationConfigDefaults = {
212
213
  emails: {
213
214
  server: {
214
215
  isShared: true
215
- }
216
+ },
217
+ theme: "default-light"
216
218
  }
217
219
  };
218
220
  function applyDefaults(defaults, config) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/config/schema.ts"],"sourcesContent":["import * as yup from \"yup\";\nimport * as schemaFields from \"../schema-fields\";\nimport { yupBoolean, yupObject, yupRecord, yupString } from \"../schema-fields\";\nimport { allProviders } from \"../utils/oauth\";\nimport { DeepMerge, DeepPartial, get, has, isObjectLike, mapValues, set } from \"../utils/objects\";\nimport { PrettifyType } from \"../utils/types\";\nimport { Config, NormalizesTo } from \"./format\";\n\n// NOTE: The validation schemas in here are all schematic validators, not sanity-check validators.\n// For more info, see ./README.md\n\n\nexport const configLevels = ['project', 'branch', 'environment', 'organization'] as const;\nexport type ConfigLevel = typeof configLevels[number];\nconst permissionRegex = /^\\$?[a-z0-9_:]+$/;\nconst customPermissionRegex = /^[a-z0-9_:]+$/;\n\n/**\n * All fields that can be overridden at this level.\n */\nexport const projectConfigSchema = yupObject({});\n\n// --- NEW RBAC Schema ---\nconst branchRbacDefaultPermissions = yupRecord(\n yupString().optional().matches(permissionRegex),\n yupBoolean().isTrue().optional(),\n).optional();\n\nconst branchRbacSchema = yupObject({\n permissions: yupRecord(\n yupString().optional().matches(customPermissionRegex),\n yupObject({\n description: yupString().optional(),\n scope: yupString().oneOf(['team', 'project']).optional(),\n containedPermissionIds: yupRecord(\n yupString().optional().matches(permissionRegex),\n yupBoolean().isTrue().optional()\n ).optional(),\n }).optional(),\n ).optional(),\n defaultPermissions: yupObject({\n teamCreator: branchRbacDefaultPermissions,\n teamMember: branchRbacDefaultPermissions,\n signUp: branchRbacDefaultPermissions,\n }).optional(),\n}).optional();\n// --- END NEW RBAC Schema ---\n\n// --- NEW API Keys Schema ---\nconst branchApiKeysSchema = yupObject({\n enabled: yupObject({\n team: yupBoolean().optional(),\n user: yupBoolean().optional(),\n }).optional(),\n}).optional();\n// --- END NEW API Keys Schema ---\n\n\nconst branchAuthSchema = yupObject({\n allowSignUp: yupBoolean().optional(),\n password: yupObject({\n allowSignIn: yupBoolean().optional(),\n }).optional(),\n otp: yupObject({\n allowSignIn: yupBoolean().optional(),\n }).optional(),\n passkey: yupObject({\n allowSignIn: yupBoolean().optional(),\n }).optional(),\n oauth: yupObject({\n accountMergeStrategy: yupString().oneOf(['link_method', 'raise_error', 'allow_duplicates']).optional(),\n providers: yupRecord(\n yupString().optional().matches(permissionRegex),\n yupObject({\n type: yupString().oneOf(allProviders).optional(),\n allowSignIn: yupBoolean().optional(),\n allowConnectedAccounts: yupBoolean().optional(),\n }).defined(),\n ).optional(),\n }).optional(),\n}).optional();\n\nconst branchDomain = yupObject({\n allowLocalhost: yupBoolean().optional(),\n}).optional();\n\nexport const branchConfigSchema = projectConfigSchema.concat(yupObject({\n rbac: branchRbacSchema,\n\n teams: yupObject({\n createPersonalTeamOnSignUp: yupBoolean().optional(),\n allowClientTeamCreation: yupBoolean().optional(),\n }).optional(),\n\n users: yupObject({\n allowClientUserDeletion: yupBoolean().optional(),\n }).optional(),\n\n apiKeys: branchApiKeysSchema,\n\n domains: branchDomain,\n\n auth: branchAuthSchema,\n\n emails: yupObject({}),\n}));\n\n\nexport const environmentConfigSchema = branchConfigSchema.concat(yupObject({\n auth: branchConfigSchema.getNested(\"auth\").concat(yupObject({\n oauth: branchConfigSchema.getNested(\"auth\").getNested(\"oauth\").concat(yupObject({\n providers: yupRecord(\n yupString().optional().matches(permissionRegex),\n yupObject({\n type: yupString().oneOf(allProviders).optional(),\n isShared: yupBoolean().optional(),\n clientId: schemaFields.oauthClientIdSchema.optional(),\n clientSecret: schemaFields.oauthClientSecretSchema.optional(),\n facebookConfigId: schemaFields.oauthFacebookConfigIdSchema.optional(),\n microsoftTenantId: schemaFields.oauthMicrosoftTenantIdSchema.optional(),\n allowSignIn: yupBoolean().optional(),\n allowConnectedAccounts: yupBoolean().optional(),\n }),\n ).optional(),\n }).optional()),\n })),\n\n emails: branchConfigSchema.getNested(\"emails\").concat(yupObject({\n server: yupObject({\n isShared: yupBoolean().optional(),\n host: schemaFields.emailHostSchema.optional().nonEmpty(),\n port: schemaFields.emailPortSchema.optional(),\n username: schemaFields.emailUsernameSchema.optional().nonEmpty(),\n password: schemaFields.emailPasswordSchema.optional().nonEmpty(),\n senderName: schemaFields.emailSenderNameSchema.optional().nonEmpty(),\n senderEmail: schemaFields.emailSenderEmailSchema.optional().nonEmpty(),\n }),\n }).optional()),\n\n domains: branchConfigSchema.getNested(\"domains\").concat(yupObject({\n trustedDomains: yupRecord(\n yupString().uuid().optional(),\n yupObject({\n baseUrl: schemaFields.urlSchema.optional(),\n handlerPath: schemaFields.handlerPathSchema.optional(),\n }),\n ).optional(),\n })),\n}));\n\nexport const organizationConfigSchema = environmentConfigSchema.concat(yupObject({}));\n\n\n// Defaults\n// these are objects that are merged together to form the rendered config (see ./README.md)\n// Wherever an object could be used as a value, a function can instead be used to generate the default values on a per-key basis\n// NOTE: These values are the defaults of the schema, NOT the defaults for newly created projects. The values here signify what `null` means for each property. If you want new projects by default to have a certain value set to true, you should update the corresponding function in the backend instead.\nexport const projectConfigDefaults = {} satisfies DeepReplaceAllowFunctionsForObjects<ProjectConfigStrippedNormalizedOverride>;\n\nexport const branchConfigDefaults = {} satisfies DeepReplaceAllowFunctionsForObjects<BranchConfigStrippedNormalizedOverride>;\n\nexport const environmentConfigDefaults = {} satisfies DeepReplaceAllowFunctionsForObjects<EnvironmentConfigStrippedNormalizedOverride>;\n\nexport const organizationConfigDefaults = {\n rbac: {\n permissions: (key: string) => ({}),\n defaultPermissions: {\n teamCreator: {},\n teamMember: {},\n signUp: {},\n },\n },\n\n apiKeys: {\n enabled: {\n team: false,\n user: false,\n },\n },\n\n teams: {\n createPersonalTeamOnSignUp: false,\n allowClientTeamCreation: false,\n },\n\n users: {\n allowClientUserDeletion: false,\n },\n\n domains: {\n allowLocalhost: false,\n trustedDomains: (key: string) => ({\n handlerPath: '/handler',\n }),\n },\n\n auth: {\n allowSignUp: true,\n password: {\n allowSignIn: false,\n },\n otp: {\n allowSignIn: false,\n },\n passkey: {\n allowSignIn: false,\n },\n oauth: {\n accountMergeStrategy: 'link_method',\n providers: (key: string) => ({\n isShared: true,\n allowSignIn: false,\n allowConnectedAccounts: false,\n }),\n },\n },\n\n emails: {\n server: {\n isShared: true,\n },\n },\n} satisfies DeepReplaceAllowFunctionsForObjects<OrganizationConfigStrippedNormalizedOverride>;\n\nexport type DeepReplaceAllowFunctionsForObjects<T> = T extends object ? { [K in keyof T]: DeepReplaceAllowFunctionsForObjects<T[K]> } | ((arg: keyof T) => DeepReplaceAllowFunctionsForObjects<T[keyof T]>) : T;\nexport type DeepReplaceFunctionsWithObjects<T> = T extends (arg: infer K extends string) => infer R ? DeepReplaceFunctionsWithObjects<Record<K, R>> : (T extends object ? { [K in keyof T]: DeepReplaceFunctionsWithObjects<T[K]> } : T);\nexport type ApplyDefaults<D extends object | ((key: string) => unknown), C extends object> = DeepMerge<DeepReplaceFunctionsWithObjects<D>, C>;\nexport function applyDefaults<D extends object | ((key: string) => unknown), C extends object>(defaults: D, config: C): ApplyDefaults<D, C> {\n const res: any = typeof defaults === 'function' ? {} : mapValues(defaults, v => typeof v === 'function' ? {} : (typeof v === 'object' ? applyDefaults(v as any, {}) : v));\n for (const [key, mergeValue] of Object.entries(config)) {\n const baseValue = typeof defaults === 'function' ? defaults(key) : (has(defaults, key as any) ? get(defaults, key as any) : undefined);\n if (baseValue !== undefined) {\n if (isObjectLike(baseValue) && isObjectLike(mergeValue)) {\n set(res, key, applyDefaults(baseValue, mergeValue));\n continue;\n }\n }\n set(res, key, mergeValue);\n }\n return res as any;\n}\nundefined?.test(\"applyDefaults\", ({ expect }) => {\n expect(applyDefaults({ a: 1 }, { a: 2 })).toEqual({ a: 2 });\n expect(applyDefaults({ a: { b: 1 } }, { a: { c: 2 } })).toEqual({ a: { b: 1, c: 2 } });\n expect(applyDefaults((key: string) => ({ b: key }), { a: {} })).toEqual({ a: { b: \"a\" } });\n expect(applyDefaults({ a: (key: string) => ({ b: key }) }, { a: { c: { d: 1 } } })).toEqual({ a: { c: { b: \"c\", d: 1 } } });\n expect(applyDefaults({ a: (key: string) => ({ b: key }) }, {})).toEqual({ a: {} });\n expect(applyDefaults({ a: { b: (key: string) => ({ b: key }) } }, {})).toEqual({ a: { b: {} } });\n});\n\n// Normalized overrides\nexport type ProjectConfigNormalizedOverride = yup.InferType<typeof projectConfigSchema>;\nexport type BranchConfigNormalizedOverride = yup.InferType<typeof branchConfigSchema>;\nexport type EnvironmentConfigNormalizedOverride = yup.InferType<typeof environmentConfigSchema>;\nexport type OrganizationConfigNormalizedOverride = yup.InferType<typeof organizationConfigSchema>;\n\n// Normalized overrides, without the properties that may be overridden still\nexport type ProjectConfigStrippedNormalizedOverride = Omit<ProjectConfigNormalizedOverride,\n | keyof BranchConfigNormalizedOverride\n | keyof EnvironmentConfigNormalizedOverride\n | keyof OrganizationConfigNormalizedOverride\n>;\nexport type BranchConfigStrippedNormalizedOverride = Omit<BranchConfigNormalizedOverride,\n | keyof EnvironmentConfigNormalizedOverride\n | keyof OrganizationConfigNormalizedOverride\n>;\nexport type EnvironmentConfigStrippedNormalizedOverride = Omit<EnvironmentConfigNormalizedOverride,\n | keyof OrganizationConfigNormalizedOverride\n>;\nexport type OrganizationConfigStrippedNormalizedOverride = OrganizationConfigNormalizedOverride;\n\n// Overrides\nexport type ProjectConfigOverride = NormalizesTo<ProjectConfigNormalizedOverride>;\nexport type BranchConfigOverride = NormalizesTo<BranchConfigNormalizedOverride>;\nexport type EnvironmentConfigOverride = NormalizesTo<EnvironmentConfigNormalizedOverride>;\nexport type OrganizationConfigOverride = NormalizesTo<OrganizationConfigNormalizedOverride>;\n\n// Override overrides (used to update the overrides)\nexport type ProjectConfigOverrideOverride = Config & DeepPartial<ProjectConfigOverride>;\nexport type BranchConfigOverrideOverride = Config & DeepPartial<BranchConfigOverride>;\nexport type EnvironmentConfigOverrideOverride = Config & DeepPartial<EnvironmentConfigOverride>;\nexport type OrganizationConfigOverrideOverride = Config & DeepPartial<OrganizationConfigOverride>;\n\n// Incomplete configs\nexport type ProjectIncompleteConfig = ProjectConfigNormalizedOverride;\nexport type BranchIncompleteConfig = ProjectIncompleteConfig & BranchConfigNormalizedOverride;\nexport type EnvironmentIncompleteConfig = BranchIncompleteConfig & EnvironmentConfigNormalizedOverride;\nexport type OrganizationIncompleteConfig = EnvironmentIncompleteConfig & OrganizationConfigNormalizedOverride;\n\n// Rendered configs\nexport type ProjectRenderedConfig = PrettifyType<ApplyDefaults<typeof projectConfigDefaults, ProjectConfigStrippedNormalizedOverride>>;\nexport type BranchRenderedConfig = PrettifyType<ProjectRenderedConfig & ApplyDefaults<typeof branchConfigDefaults, BranchConfigStrippedNormalizedOverride>>;\nexport type EnvironmentRenderedConfig = PrettifyType<BranchRenderedConfig & ApplyDefaults<typeof environmentConfigDefaults, EnvironmentConfigStrippedNormalizedOverride>>;\nexport type OrganizationRenderedConfig = PrettifyType<EnvironmentRenderedConfig & ApplyDefaults<typeof organizationConfigDefaults, OrganizationConfigStrippedNormalizedOverride>>;\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/config/schema.ts"],"sourcesContent":["import * as yup from \"yup\";\nimport * as schemaFields from \"../schema-fields\";\nimport { yupBoolean, yupObject, yupRecord, yupString } from \"../schema-fields\";\nimport { allProviders } from \"../utils/oauth\";\nimport { DeepMerge, DeepPartial, get, has, isObjectLike, mapValues, set } from \"../utils/objects\";\nimport { PrettifyType } from \"../utils/types\";\nimport { Config, NormalizesTo } from \"./format\";\n\n// NOTE: The validation schemas in here are all schematic validators, not sanity-check validators.\n// For more info, see ./README.md\n\n\nexport const configLevels = ['project', 'branch', 'environment', 'organization'] as const;\nexport type ConfigLevel = typeof configLevels[number];\nconst permissionRegex = /^\\$?[a-z0-9_:]+$/;\nconst customPermissionRegex = /^[a-z0-9_:]+$/;\n\n/**\n * All fields that can be overridden at this level.\n */\nexport const projectConfigSchema = yupObject({});\n\n// --- NEW RBAC Schema ---\nconst branchRbacDefaultPermissions = yupRecord(\n yupString().optional().matches(permissionRegex),\n yupBoolean().isTrue().optional(),\n).optional();\n\nconst branchRbacSchema = yupObject({\n permissions: yupRecord(\n yupString().optional().matches(customPermissionRegex),\n yupObject({\n description: yupString().optional(),\n scope: yupString().oneOf(['team', 'project']).optional(),\n containedPermissionIds: yupRecord(\n yupString().optional().matches(permissionRegex),\n yupBoolean().isTrue().optional()\n ).optional(),\n }).optional(),\n ).optional(),\n defaultPermissions: yupObject({\n teamCreator: branchRbacDefaultPermissions,\n teamMember: branchRbacDefaultPermissions,\n signUp: branchRbacDefaultPermissions,\n }).optional(),\n}).optional();\n// --- END NEW RBAC Schema ---\n\n// --- NEW API Keys Schema ---\nconst branchApiKeysSchema = yupObject({\n enabled: yupObject({\n team: yupBoolean().optional(),\n user: yupBoolean().optional(),\n }).optional(),\n}).optional();\n// --- END NEW API Keys Schema ---\n\n\nconst branchAuthSchema = yupObject({\n allowSignUp: yupBoolean().optional(),\n password: yupObject({\n allowSignIn: yupBoolean().optional(),\n }).optional(),\n otp: yupObject({\n allowSignIn: yupBoolean().optional(),\n }).optional(),\n passkey: yupObject({\n allowSignIn: yupBoolean().optional(),\n }).optional(),\n oauth: yupObject({\n accountMergeStrategy: yupString().oneOf(['link_method', 'raise_error', 'allow_duplicates']).optional(),\n providers: yupRecord(\n yupString().optional().matches(permissionRegex),\n yupObject({\n type: yupString().oneOf(allProviders).optional(),\n allowSignIn: yupBoolean().optional(),\n allowConnectedAccounts: yupBoolean().optional(),\n }).defined(),\n ).optional(),\n }).optional(),\n}).optional();\n\nconst branchDomain = yupObject({\n allowLocalhost: yupBoolean().optional(),\n}).optional();\n\nexport const branchConfigSchema = projectConfigSchema.concat(yupObject({\n rbac: branchRbacSchema,\n\n teams: yupObject({\n createPersonalTeamOnSignUp: yupBoolean().optional(),\n allowClientTeamCreation: yupBoolean().optional(),\n }).optional(),\n\n users: yupObject({\n allowClientUserDeletion: yupBoolean().optional(),\n }).optional(),\n\n apiKeys: branchApiKeysSchema,\n\n domains: branchDomain,\n\n auth: branchAuthSchema,\n\n emails: yupObject({}),\n}));\n\n\nexport const environmentConfigSchema = branchConfigSchema.concat(yupObject({\n auth: branchConfigSchema.getNested(\"auth\").concat(yupObject({\n oauth: branchConfigSchema.getNested(\"auth\").getNested(\"oauth\").concat(yupObject({\n providers: yupRecord(\n yupString().optional().matches(permissionRegex),\n yupObject({\n type: yupString().oneOf(allProviders).optional(),\n isShared: yupBoolean().optional(),\n clientId: schemaFields.oauthClientIdSchema.optional(),\n clientSecret: schemaFields.oauthClientSecretSchema.optional(),\n facebookConfigId: schemaFields.oauthFacebookConfigIdSchema.optional(),\n microsoftTenantId: schemaFields.oauthMicrosoftTenantIdSchema.optional(),\n allowSignIn: yupBoolean().optional(),\n allowConnectedAccounts: yupBoolean().optional(),\n }),\n ).optional(),\n }).optional()),\n })),\n\n emails: branchConfigSchema.getNested(\"emails\").concat(yupObject({\n server: yupObject({\n isShared: yupBoolean().optional(),\n host: schemaFields.emailHostSchema.optional().nonEmpty(),\n port: schemaFields.emailPortSchema.optional(),\n username: schemaFields.emailUsernameSchema.optional().nonEmpty(),\n password: schemaFields.emailPasswordSchema.optional().nonEmpty(),\n senderName: schemaFields.emailSenderNameSchema.optional().nonEmpty(),\n senderEmail: schemaFields.emailSenderEmailSchema.optional().nonEmpty(),\n }),\n theme: schemaFields.emailThemeSchema.optional(),\n }).optional()),\n\n domains: branchConfigSchema.getNested(\"domains\").concat(yupObject({\n trustedDomains: yupRecord(\n yupString().uuid().optional(),\n yupObject({\n baseUrl: schemaFields.urlSchema.optional(),\n handlerPath: schemaFields.handlerPathSchema.optional(),\n }),\n ).optional(),\n })),\n}));\n\nexport const organizationConfigSchema = environmentConfigSchema.concat(yupObject({}));\n\n\n// Defaults\n// these are objects that are merged together to form the rendered config (see ./README.md)\n// Wherever an object could be used as a value, a function can instead be used to generate the default values on a per-key basis\n// NOTE: These values are the defaults of the schema, NOT the defaults for newly created projects. The values here signify what `null` means for each property. If you want new projects by default to have a certain value set to true, you should update the corresponding function in the backend instead.\nexport const projectConfigDefaults = {} satisfies DeepReplaceAllowFunctionsForObjects<ProjectConfigStrippedNormalizedOverride>;\n\nexport const branchConfigDefaults = {} satisfies DeepReplaceAllowFunctionsForObjects<BranchConfigStrippedNormalizedOverride>;\n\nexport const environmentConfigDefaults = {} satisfies DeepReplaceAllowFunctionsForObjects<EnvironmentConfigStrippedNormalizedOverride>;\n\nexport const organizationConfigDefaults = {\n rbac: {\n permissions: (key: string) => ({}),\n defaultPermissions: {\n teamCreator: {},\n teamMember: {},\n signUp: {},\n },\n },\n\n apiKeys: {\n enabled: {\n team: false,\n user: false,\n },\n },\n\n teams: {\n createPersonalTeamOnSignUp: false,\n allowClientTeamCreation: false,\n },\n\n users: {\n allowClientUserDeletion: false,\n },\n\n domains: {\n allowLocalhost: false,\n trustedDomains: (key: string) => ({\n handlerPath: '/handler',\n }),\n },\n\n auth: {\n allowSignUp: true,\n password: {\n allowSignIn: false,\n },\n otp: {\n allowSignIn: false,\n },\n passkey: {\n allowSignIn: false,\n },\n oauth: {\n accountMergeStrategy: 'link_method',\n providers: (key: string) => ({\n isShared: true,\n allowSignIn: false,\n allowConnectedAccounts: false,\n }),\n },\n },\n\n emails: {\n server: {\n isShared: true,\n },\n theme: 'default-light',\n },\n} satisfies DeepReplaceAllowFunctionsForObjects<OrganizationConfigStrippedNormalizedOverride>;\n\nexport type DeepReplaceAllowFunctionsForObjects<T> = T extends object ? { [K in keyof T]: DeepReplaceAllowFunctionsForObjects<T[K]> } | ((arg: keyof T) => DeepReplaceAllowFunctionsForObjects<T[keyof T]>) : T;\nexport type DeepReplaceFunctionsWithObjects<T> = T extends (arg: infer K extends string) => infer R ? DeepReplaceFunctionsWithObjects<Record<K, R>> : (T extends object ? { [K in keyof T]: DeepReplaceFunctionsWithObjects<T[K]> } : T);\nexport type ApplyDefaults<D extends object | ((key: string) => unknown), C extends object> = DeepMerge<DeepReplaceFunctionsWithObjects<D>, C>;\nexport function applyDefaults<D extends object | ((key: string) => unknown), C extends object>(defaults: D, config: C): ApplyDefaults<D, C> {\n const res: any = typeof defaults === 'function' ? {} : mapValues(defaults, v => typeof v === 'function' ? {} : (typeof v === 'object' ? applyDefaults(v as any, {}) : v));\n for (const [key, mergeValue] of Object.entries(config)) {\n const baseValue = typeof defaults === 'function' ? defaults(key) : (has(defaults, key as any) ? get(defaults, key as any) : undefined);\n if (baseValue !== undefined) {\n if (isObjectLike(baseValue) && isObjectLike(mergeValue)) {\n set(res, key, applyDefaults(baseValue, mergeValue));\n continue;\n }\n }\n set(res, key, mergeValue);\n }\n return res as any;\n}\nundefined?.test(\"applyDefaults\", ({ expect }) => {\n expect(applyDefaults({ a: 1 }, { a: 2 })).toEqual({ a: 2 });\n expect(applyDefaults({ a: { b: 1 } }, { a: { c: 2 } })).toEqual({ a: { b: 1, c: 2 } });\n expect(applyDefaults((key: string) => ({ b: key }), { a: {} })).toEqual({ a: { b: \"a\" } });\n expect(applyDefaults({ a: (key: string) => ({ b: key }) }, { a: { c: { d: 1 } } })).toEqual({ a: { c: { b: \"c\", d: 1 } } });\n expect(applyDefaults({ a: (key: string) => ({ b: key }) }, {})).toEqual({ a: {} });\n expect(applyDefaults({ a: { b: (key: string) => ({ b: key }) } }, {})).toEqual({ a: { b: {} } });\n});\n\n// Normalized overrides\nexport type ProjectConfigNormalizedOverride = yup.InferType<typeof projectConfigSchema>;\nexport type BranchConfigNormalizedOverride = yup.InferType<typeof branchConfigSchema>;\nexport type EnvironmentConfigNormalizedOverride = yup.InferType<typeof environmentConfigSchema>;\nexport type OrganizationConfigNormalizedOverride = yup.InferType<typeof organizationConfigSchema>;\n\n// Normalized overrides, without the properties that may be overridden still\nexport type ProjectConfigStrippedNormalizedOverride = Omit<ProjectConfigNormalizedOverride,\n | keyof BranchConfigNormalizedOverride\n | keyof EnvironmentConfigNormalizedOverride\n | keyof OrganizationConfigNormalizedOverride\n>;\nexport type BranchConfigStrippedNormalizedOverride = Omit<BranchConfigNormalizedOverride,\n | keyof EnvironmentConfigNormalizedOverride\n | keyof OrganizationConfigNormalizedOverride\n>;\nexport type EnvironmentConfigStrippedNormalizedOverride = Omit<EnvironmentConfigNormalizedOverride,\n | keyof OrganizationConfigNormalizedOverride\n>;\nexport type OrganizationConfigStrippedNormalizedOverride = OrganizationConfigNormalizedOverride;\n\n// Overrides\nexport type ProjectConfigOverride = NormalizesTo<ProjectConfigNormalizedOverride>;\nexport type BranchConfigOverride = NormalizesTo<BranchConfigNormalizedOverride>;\nexport type EnvironmentConfigOverride = NormalizesTo<EnvironmentConfigNormalizedOverride>;\nexport type OrganizationConfigOverride = NormalizesTo<OrganizationConfigNormalizedOverride>;\n\n// Override overrides (used to update the overrides)\nexport type ProjectConfigOverrideOverride = Config & DeepPartial<ProjectConfigOverride>;\nexport type BranchConfigOverrideOverride = Config & DeepPartial<BranchConfigOverride>;\nexport type EnvironmentConfigOverrideOverride = Config & DeepPartial<EnvironmentConfigOverride>;\nexport type OrganizationConfigOverrideOverride = Config & DeepPartial<OrganizationConfigOverride>;\n\n// Incomplete configs\nexport type ProjectIncompleteConfig = ProjectConfigNormalizedOverride;\nexport type BranchIncompleteConfig = ProjectIncompleteConfig & BranchConfigNormalizedOverride;\nexport type EnvironmentIncompleteConfig = BranchIncompleteConfig & EnvironmentConfigNormalizedOverride;\nexport type OrganizationIncompleteConfig = EnvironmentIncompleteConfig & OrganizationConfigNormalizedOverride;\n\n// Rendered configs\nexport type ProjectRenderedConfig = PrettifyType<ApplyDefaults<typeof projectConfigDefaults, ProjectConfigStrippedNormalizedOverride>>;\nexport type BranchRenderedConfig = PrettifyType<ProjectRenderedConfig & ApplyDefaults<typeof branchConfigDefaults, BranchConfigStrippedNormalizedOverride>>;\nexport type EnvironmentRenderedConfig = PrettifyType<BranchRenderedConfig & ApplyDefaults<typeof environmentConfigDefaults, EnvironmentConfigStrippedNormalizedOverride>>;\nexport type OrganizationRenderedConfig = PrettifyType<EnvironmentRenderedConfig & ApplyDefaults<typeof organizationConfigDefaults, OrganizationConfigStrippedNormalizedOverride>>;\n"],"mappings":"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","names":[]}
@@ -102,7 +102,8 @@ var environmentConfigSchema = branchConfigSchema.concat(yupObject({
102
102
  password: schemaFields.emailPasswordSchema.optional().nonEmpty(),
103
103
  senderName: schemaFields.emailSenderNameSchema.optional().nonEmpty(),
104
104
  senderEmail: schemaFields.emailSenderEmailSchema.optional().nonEmpty()
105
- })
105
+ }),
106
+ theme: schemaFields.emailThemeSchema.optional()
106
107
  }).optional()),
107
108
  domains: branchConfigSchema.getNested("domains").concat(yupObject({
108
109
  trustedDomains: yupRecord(
@@ -169,7 +170,8 @@ var organizationConfigDefaults = {
169
170
  emails: {
170
171
  server: {
171
172
  isShared: true
172
- }
173
+ },
174
+ theme: "default-light"
173
175
  }
174
176
  };
175
177
  function applyDefaults(defaults, config) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/config/schema.ts"],"sourcesContent":["import * as yup from \"yup\";\nimport * as schemaFields from \"../schema-fields\";\nimport { yupBoolean, yupObject, yupRecord, yupString } from \"../schema-fields\";\nimport { allProviders } from \"../utils/oauth\";\nimport { DeepMerge, DeepPartial, get, has, isObjectLike, mapValues, set } from \"../utils/objects\";\nimport { PrettifyType } from \"../utils/types\";\nimport { Config, NormalizesTo } from \"./format\";\n\n// NOTE: The validation schemas in here are all schematic validators, not sanity-check validators.\n// For more info, see ./README.md\n\n\nexport const configLevels = ['project', 'branch', 'environment', 'organization'] as const;\nexport type ConfigLevel = typeof configLevels[number];\nconst permissionRegex = /^\\$?[a-z0-9_:]+$/;\nconst customPermissionRegex = /^[a-z0-9_:]+$/;\n\n/**\n * All fields that can be overridden at this level.\n */\nexport const projectConfigSchema = yupObject({});\n\n// --- NEW RBAC Schema ---\nconst branchRbacDefaultPermissions = yupRecord(\n yupString().optional().matches(permissionRegex),\n yupBoolean().isTrue().optional(),\n).optional();\n\nconst branchRbacSchema = yupObject({\n permissions: yupRecord(\n yupString().optional().matches(customPermissionRegex),\n yupObject({\n description: yupString().optional(),\n scope: yupString().oneOf(['team', 'project']).optional(),\n containedPermissionIds: yupRecord(\n yupString().optional().matches(permissionRegex),\n yupBoolean().isTrue().optional()\n ).optional(),\n }).optional(),\n ).optional(),\n defaultPermissions: yupObject({\n teamCreator: branchRbacDefaultPermissions,\n teamMember: branchRbacDefaultPermissions,\n signUp: branchRbacDefaultPermissions,\n }).optional(),\n}).optional();\n// --- END NEW RBAC Schema ---\n\n// --- NEW API Keys Schema ---\nconst branchApiKeysSchema = yupObject({\n enabled: yupObject({\n team: yupBoolean().optional(),\n user: yupBoolean().optional(),\n }).optional(),\n}).optional();\n// --- END NEW API Keys Schema ---\n\n\nconst branchAuthSchema = yupObject({\n allowSignUp: yupBoolean().optional(),\n password: yupObject({\n allowSignIn: yupBoolean().optional(),\n }).optional(),\n otp: yupObject({\n allowSignIn: yupBoolean().optional(),\n }).optional(),\n passkey: yupObject({\n allowSignIn: yupBoolean().optional(),\n }).optional(),\n oauth: yupObject({\n accountMergeStrategy: yupString().oneOf(['link_method', 'raise_error', 'allow_duplicates']).optional(),\n providers: yupRecord(\n yupString().optional().matches(permissionRegex),\n yupObject({\n type: yupString().oneOf(allProviders).optional(),\n allowSignIn: yupBoolean().optional(),\n allowConnectedAccounts: yupBoolean().optional(),\n }).defined(),\n ).optional(),\n }).optional(),\n}).optional();\n\nconst branchDomain = yupObject({\n allowLocalhost: yupBoolean().optional(),\n}).optional();\n\nexport const branchConfigSchema = projectConfigSchema.concat(yupObject({\n rbac: branchRbacSchema,\n\n teams: yupObject({\n createPersonalTeamOnSignUp: yupBoolean().optional(),\n allowClientTeamCreation: yupBoolean().optional(),\n }).optional(),\n\n users: yupObject({\n allowClientUserDeletion: yupBoolean().optional(),\n }).optional(),\n\n apiKeys: branchApiKeysSchema,\n\n domains: branchDomain,\n\n auth: branchAuthSchema,\n\n emails: yupObject({}),\n}));\n\n\nexport const environmentConfigSchema = branchConfigSchema.concat(yupObject({\n auth: branchConfigSchema.getNested(\"auth\").concat(yupObject({\n oauth: branchConfigSchema.getNested(\"auth\").getNested(\"oauth\").concat(yupObject({\n providers: yupRecord(\n yupString().optional().matches(permissionRegex),\n yupObject({\n type: yupString().oneOf(allProviders).optional(),\n isShared: yupBoolean().optional(),\n clientId: schemaFields.oauthClientIdSchema.optional(),\n clientSecret: schemaFields.oauthClientSecretSchema.optional(),\n facebookConfigId: schemaFields.oauthFacebookConfigIdSchema.optional(),\n microsoftTenantId: schemaFields.oauthMicrosoftTenantIdSchema.optional(),\n allowSignIn: yupBoolean().optional(),\n allowConnectedAccounts: yupBoolean().optional(),\n }),\n ).optional(),\n }).optional()),\n })),\n\n emails: branchConfigSchema.getNested(\"emails\").concat(yupObject({\n server: yupObject({\n isShared: yupBoolean().optional(),\n host: schemaFields.emailHostSchema.optional().nonEmpty(),\n port: schemaFields.emailPortSchema.optional(),\n username: schemaFields.emailUsernameSchema.optional().nonEmpty(),\n password: schemaFields.emailPasswordSchema.optional().nonEmpty(),\n senderName: schemaFields.emailSenderNameSchema.optional().nonEmpty(),\n senderEmail: schemaFields.emailSenderEmailSchema.optional().nonEmpty(),\n }),\n }).optional()),\n\n domains: branchConfigSchema.getNested(\"domains\").concat(yupObject({\n trustedDomains: yupRecord(\n yupString().uuid().optional(),\n yupObject({\n baseUrl: schemaFields.urlSchema.optional(),\n handlerPath: schemaFields.handlerPathSchema.optional(),\n }),\n ).optional(),\n })),\n}));\n\nexport const organizationConfigSchema = environmentConfigSchema.concat(yupObject({}));\n\n\n// Defaults\n// these are objects that are merged together to form the rendered config (see ./README.md)\n// Wherever an object could be used as a value, a function can instead be used to generate the default values on a per-key basis\n// NOTE: These values are the defaults of the schema, NOT the defaults for newly created projects. The values here signify what `null` means for each property. If you want new projects by default to have a certain value set to true, you should update the corresponding function in the backend instead.\nexport const projectConfigDefaults = {} satisfies DeepReplaceAllowFunctionsForObjects<ProjectConfigStrippedNormalizedOverride>;\n\nexport const branchConfigDefaults = {} satisfies DeepReplaceAllowFunctionsForObjects<BranchConfigStrippedNormalizedOverride>;\n\nexport const environmentConfigDefaults = {} satisfies DeepReplaceAllowFunctionsForObjects<EnvironmentConfigStrippedNormalizedOverride>;\n\nexport const organizationConfigDefaults = {\n rbac: {\n permissions: (key: string) => ({}),\n defaultPermissions: {\n teamCreator: {},\n teamMember: {},\n signUp: {},\n },\n },\n\n apiKeys: {\n enabled: {\n team: false,\n user: false,\n },\n },\n\n teams: {\n createPersonalTeamOnSignUp: false,\n allowClientTeamCreation: false,\n },\n\n users: {\n allowClientUserDeletion: false,\n },\n\n domains: {\n allowLocalhost: false,\n trustedDomains: (key: string) => ({\n handlerPath: '/handler',\n }),\n },\n\n auth: {\n allowSignUp: true,\n password: {\n allowSignIn: false,\n },\n otp: {\n allowSignIn: false,\n },\n passkey: {\n allowSignIn: false,\n },\n oauth: {\n accountMergeStrategy: 'link_method',\n providers: (key: string) => ({\n isShared: true,\n allowSignIn: false,\n allowConnectedAccounts: false,\n }),\n },\n },\n\n emails: {\n server: {\n isShared: true,\n },\n },\n} satisfies DeepReplaceAllowFunctionsForObjects<OrganizationConfigStrippedNormalizedOverride>;\n\nexport type DeepReplaceAllowFunctionsForObjects<T> = T extends object ? { [K in keyof T]: DeepReplaceAllowFunctionsForObjects<T[K]> } | ((arg: keyof T) => DeepReplaceAllowFunctionsForObjects<T[keyof T]>) : T;\nexport type DeepReplaceFunctionsWithObjects<T> = T extends (arg: infer K extends string) => infer R ? DeepReplaceFunctionsWithObjects<Record<K, R>> : (T extends object ? { [K in keyof T]: DeepReplaceFunctionsWithObjects<T[K]> } : T);\nexport type ApplyDefaults<D extends object | ((key: string) => unknown), C extends object> = DeepMerge<DeepReplaceFunctionsWithObjects<D>, C>;\nexport function applyDefaults<D extends object | ((key: string) => unknown), C extends object>(defaults: D, config: C): ApplyDefaults<D, C> {\n const res: any = typeof defaults === 'function' ? {} : mapValues(defaults, v => typeof v === 'function' ? {} : (typeof v === 'object' ? applyDefaults(v as any, {}) : v));\n for (const [key, mergeValue] of Object.entries(config)) {\n const baseValue = typeof defaults === 'function' ? defaults(key) : (has(defaults, key as any) ? get(defaults, key as any) : undefined);\n if (baseValue !== undefined) {\n if (isObjectLike(baseValue) && isObjectLike(mergeValue)) {\n set(res, key, applyDefaults(baseValue, mergeValue));\n continue;\n }\n }\n set(res, key, mergeValue);\n }\n return res as any;\n}\nundefined?.test(\"applyDefaults\", ({ expect }) => {\n expect(applyDefaults({ a: 1 }, { a: 2 })).toEqual({ a: 2 });\n expect(applyDefaults({ a: { b: 1 } }, { a: { c: 2 } })).toEqual({ a: { b: 1, c: 2 } });\n expect(applyDefaults((key: string) => ({ b: key }), { a: {} })).toEqual({ a: { b: \"a\" } });\n expect(applyDefaults({ a: (key: string) => ({ b: key }) }, { a: { c: { d: 1 } } })).toEqual({ a: { c: { b: \"c\", d: 1 } } });\n expect(applyDefaults({ a: (key: string) => ({ b: key }) }, {})).toEqual({ a: {} });\n expect(applyDefaults({ a: { b: (key: string) => ({ b: key }) } }, {})).toEqual({ a: { b: {} } });\n});\n\n// Normalized overrides\nexport type ProjectConfigNormalizedOverride = yup.InferType<typeof projectConfigSchema>;\nexport type BranchConfigNormalizedOverride = yup.InferType<typeof branchConfigSchema>;\nexport type EnvironmentConfigNormalizedOverride = yup.InferType<typeof environmentConfigSchema>;\nexport type OrganizationConfigNormalizedOverride = yup.InferType<typeof organizationConfigSchema>;\n\n// Normalized overrides, without the properties that may be overridden still\nexport type ProjectConfigStrippedNormalizedOverride = Omit<ProjectConfigNormalizedOverride,\n | keyof BranchConfigNormalizedOverride\n | keyof EnvironmentConfigNormalizedOverride\n | keyof OrganizationConfigNormalizedOverride\n>;\nexport type BranchConfigStrippedNormalizedOverride = Omit<BranchConfigNormalizedOverride,\n | keyof EnvironmentConfigNormalizedOverride\n | keyof OrganizationConfigNormalizedOverride\n>;\nexport type EnvironmentConfigStrippedNormalizedOverride = Omit<EnvironmentConfigNormalizedOverride,\n | keyof OrganizationConfigNormalizedOverride\n>;\nexport type OrganizationConfigStrippedNormalizedOverride = OrganizationConfigNormalizedOverride;\n\n// Overrides\nexport type ProjectConfigOverride = NormalizesTo<ProjectConfigNormalizedOverride>;\nexport type BranchConfigOverride = NormalizesTo<BranchConfigNormalizedOverride>;\nexport type EnvironmentConfigOverride = NormalizesTo<EnvironmentConfigNormalizedOverride>;\nexport type OrganizationConfigOverride = NormalizesTo<OrganizationConfigNormalizedOverride>;\n\n// Override overrides (used to update the overrides)\nexport type ProjectConfigOverrideOverride = Config & DeepPartial<ProjectConfigOverride>;\nexport type BranchConfigOverrideOverride = Config & DeepPartial<BranchConfigOverride>;\nexport type EnvironmentConfigOverrideOverride = Config & DeepPartial<EnvironmentConfigOverride>;\nexport type OrganizationConfigOverrideOverride = Config & DeepPartial<OrganizationConfigOverride>;\n\n// Incomplete configs\nexport type ProjectIncompleteConfig = ProjectConfigNormalizedOverride;\nexport type BranchIncompleteConfig = ProjectIncompleteConfig & BranchConfigNormalizedOverride;\nexport type EnvironmentIncompleteConfig = BranchIncompleteConfig & EnvironmentConfigNormalizedOverride;\nexport type OrganizationIncompleteConfig = EnvironmentIncompleteConfig & OrganizationConfigNormalizedOverride;\n\n// Rendered configs\nexport type ProjectRenderedConfig = PrettifyType<ApplyDefaults<typeof projectConfigDefaults, ProjectConfigStrippedNormalizedOverride>>;\nexport type BranchRenderedConfig = PrettifyType<ProjectRenderedConfig & ApplyDefaults<typeof branchConfigDefaults, BranchConfigStrippedNormalizedOverride>>;\nexport type EnvironmentRenderedConfig = PrettifyType<BranchRenderedConfig & ApplyDefaults<typeof environmentConfigDefaults, EnvironmentConfigStrippedNormalizedOverride>>;\nexport type OrganizationRenderedConfig = PrettifyType<EnvironmentRenderedConfig & ApplyDefaults<typeof organizationConfigDefaults, OrganizationConfigStrippedNormalizedOverride>>;\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/config/schema.ts"],"sourcesContent":["import * as yup from \"yup\";\nimport * as schemaFields from \"../schema-fields\";\nimport { yupBoolean, yupObject, yupRecord, yupString } from \"../schema-fields\";\nimport { allProviders } from \"../utils/oauth\";\nimport { DeepMerge, DeepPartial, get, has, isObjectLike, mapValues, set } from \"../utils/objects\";\nimport { PrettifyType } from \"../utils/types\";\nimport { Config, NormalizesTo } from \"./format\";\n\n// NOTE: The validation schemas in here are all schematic validators, not sanity-check validators.\n// For more info, see ./README.md\n\n\nexport const configLevels = ['project', 'branch', 'environment', 'organization'] as const;\nexport type ConfigLevel = typeof configLevels[number];\nconst permissionRegex = /^\\$?[a-z0-9_:]+$/;\nconst customPermissionRegex = /^[a-z0-9_:]+$/;\n\n/**\n * All fields that can be overridden at this level.\n */\nexport const projectConfigSchema = yupObject({});\n\n// --- NEW RBAC Schema ---\nconst branchRbacDefaultPermissions = yupRecord(\n yupString().optional().matches(permissionRegex),\n yupBoolean().isTrue().optional(),\n).optional();\n\nconst branchRbacSchema = yupObject({\n permissions: yupRecord(\n yupString().optional().matches(customPermissionRegex),\n yupObject({\n description: yupString().optional(),\n scope: yupString().oneOf(['team', 'project']).optional(),\n containedPermissionIds: yupRecord(\n yupString().optional().matches(permissionRegex),\n yupBoolean().isTrue().optional()\n ).optional(),\n }).optional(),\n ).optional(),\n defaultPermissions: yupObject({\n teamCreator: branchRbacDefaultPermissions,\n teamMember: branchRbacDefaultPermissions,\n signUp: branchRbacDefaultPermissions,\n }).optional(),\n}).optional();\n// --- END NEW RBAC Schema ---\n\n// --- NEW API Keys Schema ---\nconst branchApiKeysSchema = yupObject({\n enabled: yupObject({\n team: yupBoolean().optional(),\n user: yupBoolean().optional(),\n }).optional(),\n}).optional();\n// --- END NEW API Keys Schema ---\n\n\nconst branchAuthSchema = yupObject({\n allowSignUp: yupBoolean().optional(),\n password: yupObject({\n allowSignIn: yupBoolean().optional(),\n }).optional(),\n otp: yupObject({\n allowSignIn: yupBoolean().optional(),\n }).optional(),\n passkey: yupObject({\n allowSignIn: yupBoolean().optional(),\n }).optional(),\n oauth: yupObject({\n accountMergeStrategy: yupString().oneOf(['link_method', 'raise_error', 'allow_duplicates']).optional(),\n providers: yupRecord(\n yupString().optional().matches(permissionRegex),\n yupObject({\n type: yupString().oneOf(allProviders).optional(),\n allowSignIn: yupBoolean().optional(),\n allowConnectedAccounts: yupBoolean().optional(),\n }).defined(),\n ).optional(),\n }).optional(),\n}).optional();\n\nconst branchDomain = yupObject({\n allowLocalhost: yupBoolean().optional(),\n}).optional();\n\nexport const branchConfigSchema = projectConfigSchema.concat(yupObject({\n rbac: branchRbacSchema,\n\n teams: yupObject({\n createPersonalTeamOnSignUp: yupBoolean().optional(),\n allowClientTeamCreation: yupBoolean().optional(),\n }).optional(),\n\n users: yupObject({\n allowClientUserDeletion: yupBoolean().optional(),\n }).optional(),\n\n apiKeys: branchApiKeysSchema,\n\n domains: branchDomain,\n\n auth: branchAuthSchema,\n\n emails: yupObject({}),\n}));\n\n\nexport const environmentConfigSchema = branchConfigSchema.concat(yupObject({\n auth: branchConfigSchema.getNested(\"auth\").concat(yupObject({\n oauth: branchConfigSchema.getNested(\"auth\").getNested(\"oauth\").concat(yupObject({\n providers: yupRecord(\n yupString().optional().matches(permissionRegex),\n yupObject({\n type: yupString().oneOf(allProviders).optional(),\n isShared: yupBoolean().optional(),\n clientId: schemaFields.oauthClientIdSchema.optional(),\n clientSecret: schemaFields.oauthClientSecretSchema.optional(),\n facebookConfigId: schemaFields.oauthFacebookConfigIdSchema.optional(),\n microsoftTenantId: schemaFields.oauthMicrosoftTenantIdSchema.optional(),\n allowSignIn: yupBoolean().optional(),\n allowConnectedAccounts: yupBoolean().optional(),\n }),\n ).optional(),\n }).optional()),\n })),\n\n emails: branchConfigSchema.getNested(\"emails\").concat(yupObject({\n server: yupObject({\n isShared: yupBoolean().optional(),\n host: schemaFields.emailHostSchema.optional().nonEmpty(),\n port: schemaFields.emailPortSchema.optional(),\n username: schemaFields.emailUsernameSchema.optional().nonEmpty(),\n password: schemaFields.emailPasswordSchema.optional().nonEmpty(),\n senderName: schemaFields.emailSenderNameSchema.optional().nonEmpty(),\n senderEmail: schemaFields.emailSenderEmailSchema.optional().nonEmpty(),\n }),\n theme: schemaFields.emailThemeSchema.optional(),\n }).optional()),\n\n domains: branchConfigSchema.getNested(\"domains\").concat(yupObject({\n trustedDomains: yupRecord(\n yupString().uuid().optional(),\n yupObject({\n baseUrl: schemaFields.urlSchema.optional(),\n handlerPath: schemaFields.handlerPathSchema.optional(),\n }),\n ).optional(),\n })),\n}));\n\nexport const organizationConfigSchema = environmentConfigSchema.concat(yupObject({}));\n\n\n// Defaults\n// these are objects that are merged together to form the rendered config (see ./README.md)\n// Wherever an object could be used as a value, a function can instead be used to generate the default values on a per-key basis\n// NOTE: These values are the defaults of the schema, NOT the defaults for newly created projects. The values here signify what `null` means for each property. If you want new projects by default to have a certain value set to true, you should update the corresponding function in the backend instead.\nexport const projectConfigDefaults = {} satisfies DeepReplaceAllowFunctionsForObjects<ProjectConfigStrippedNormalizedOverride>;\n\nexport const branchConfigDefaults = {} satisfies DeepReplaceAllowFunctionsForObjects<BranchConfigStrippedNormalizedOverride>;\n\nexport const environmentConfigDefaults = {} satisfies DeepReplaceAllowFunctionsForObjects<EnvironmentConfigStrippedNormalizedOverride>;\n\nexport const organizationConfigDefaults = {\n rbac: {\n permissions: (key: string) => ({}),\n defaultPermissions: {\n teamCreator: {},\n teamMember: {},\n signUp: {},\n },\n },\n\n apiKeys: {\n enabled: {\n team: false,\n user: false,\n },\n },\n\n teams: {\n createPersonalTeamOnSignUp: false,\n allowClientTeamCreation: false,\n },\n\n users: {\n allowClientUserDeletion: false,\n },\n\n domains: {\n allowLocalhost: false,\n trustedDomains: (key: string) => ({\n handlerPath: '/handler',\n }),\n },\n\n auth: {\n allowSignUp: true,\n password: {\n allowSignIn: false,\n },\n otp: {\n allowSignIn: false,\n },\n passkey: {\n allowSignIn: false,\n },\n oauth: {\n accountMergeStrategy: 'link_method',\n providers: (key: string) => ({\n isShared: true,\n allowSignIn: false,\n allowConnectedAccounts: false,\n }),\n },\n },\n\n emails: {\n server: {\n isShared: true,\n },\n theme: 'default-light',\n },\n} satisfies DeepReplaceAllowFunctionsForObjects<OrganizationConfigStrippedNormalizedOverride>;\n\nexport type DeepReplaceAllowFunctionsForObjects<T> = T extends object ? { [K in keyof T]: DeepReplaceAllowFunctionsForObjects<T[K]> } | ((arg: keyof T) => DeepReplaceAllowFunctionsForObjects<T[keyof T]>) : T;\nexport type DeepReplaceFunctionsWithObjects<T> = T extends (arg: infer K extends string) => infer R ? DeepReplaceFunctionsWithObjects<Record<K, R>> : (T extends object ? { [K in keyof T]: DeepReplaceFunctionsWithObjects<T[K]> } : T);\nexport type ApplyDefaults<D extends object | ((key: string) => unknown), C extends object> = DeepMerge<DeepReplaceFunctionsWithObjects<D>, C>;\nexport function applyDefaults<D extends object | ((key: string) => unknown), C extends object>(defaults: D, config: C): ApplyDefaults<D, C> {\n const res: any = typeof defaults === 'function' ? {} : mapValues(defaults, v => typeof v === 'function' ? {} : (typeof v === 'object' ? applyDefaults(v as any, {}) : v));\n for (const [key, mergeValue] of Object.entries(config)) {\n const baseValue = typeof defaults === 'function' ? defaults(key) : (has(defaults, key as any) ? get(defaults, key as any) : undefined);\n if (baseValue !== undefined) {\n if (isObjectLike(baseValue) && isObjectLike(mergeValue)) {\n set(res, key, applyDefaults(baseValue, mergeValue));\n continue;\n }\n }\n set(res, key, mergeValue);\n }\n return res as any;\n}\nundefined?.test(\"applyDefaults\", ({ expect }) => {\n expect(applyDefaults({ a: 1 }, { a: 2 })).toEqual({ a: 2 });\n expect(applyDefaults({ a: { b: 1 } }, { a: { c: 2 } })).toEqual({ a: { b: 1, c: 2 } });\n expect(applyDefaults((key: string) => ({ b: key }), { a: {} })).toEqual({ a: { b: \"a\" } });\n expect(applyDefaults({ a: (key: string) => ({ b: key }) }, { a: { c: { d: 1 } } })).toEqual({ a: { c: { b: \"c\", d: 1 } } });\n expect(applyDefaults({ a: (key: string) => ({ b: key }) }, {})).toEqual({ a: {} });\n expect(applyDefaults({ a: { b: (key: string) => ({ b: key }) } }, {})).toEqual({ a: { b: {} } });\n});\n\n// Normalized overrides\nexport type ProjectConfigNormalizedOverride = yup.InferType<typeof projectConfigSchema>;\nexport type BranchConfigNormalizedOverride = yup.InferType<typeof branchConfigSchema>;\nexport type EnvironmentConfigNormalizedOverride = yup.InferType<typeof environmentConfigSchema>;\nexport type OrganizationConfigNormalizedOverride = yup.InferType<typeof organizationConfigSchema>;\n\n// Normalized overrides, without the properties that may be overridden still\nexport type ProjectConfigStrippedNormalizedOverride = Omit<ProjectConfigNormalizedOverride,\n | keyof BranchConfigNormalizedOverride\n | keyof EnvironmentConfigNormalizedOverride\n | keyof OrganizationConfigNormalizedOverride\n>;\nexport type BranchConfigStrippedNormalizedOverride = Omit<BranchConfigNormalizedOverride,\n | keyof EnvironmentConfigNormalizedOverride\n | keyof OrganizationConfigNormalizedOverride\n>;\nexport type EnvironmentConfigStrippedNormalizedOverride = Omit<EnvironmentConfigNormalizedOverride,\n | keyof OrganizationConfigNormalizedOverride\n>;\nexport type OrganizationConfigStrippedNormalizedOverride = OrganizationConfigNormalizedOverride;\n\n// Overrides\nexport type ProjectConfigOverride = NormalizesTo<ProjectConfigNormalizedOverride>;\nexport type BranchConfigOverride = NormalizesTo<BranchConfigNormalizedOverride>;\nexport type EnvironmentConfigOverride = NormalizesTo<EnvironmentConfigNormalizedOverride>;\nexport type OrganizationConfigOverride = NormalizesTo<OrganizationConfigNormalizedOverride>;\n\n// Override overrides (used to update the overrides)\nexport type ProjectConfigOverrideOverride = Config & DeepPartial<ProjectConfigOverride>;\nexport type BranchConfigOverrideOverride = Config & DeepPartial<BranchConfigOverride>;\nexport type EnvironmentConfigOverrideOverride = Config & DeepPartial<EnvironmentConfigOverride>;\nexport type OrganizationConfigOverrideOverride = Config & DeepPartial<OrganizationConfigOverride>;\n\n// Incomplete configs\nexport type ProjectIncompleteConfig = ProjectConfigNormalizedOverride;\nexport type BranchIncompleteConfig = ProjectIncompleteConfig & BranchConfigNormalizedOverride;\nexport type EnvironmentIncompleteConfig = BranchIncompleteConfig & EnvironmentConfigNormalizedOverride;\nexport type OrganizationIncompleteConfig = EnvironmentIncompleteConfig & OrganizationConfigNormalizedOverride;\n\n// Rendered configs\nexport type ProjectRenderedConfig = PrettifyType<ApplyDefaults<typeof projectConfigDefaults, ProjectConfigStrippedNormalizedOverride>>;\nexport type BranchRenderedConfig = PrettifyType<ProjectRenderedConfig & ApplyDefaults<typeof branchConfigDefaults, BranchConfigStrippedNormalizedOverride>>;\nexport type EnvironmentRenderedConfig = PrettifyType<BranchRenderedConfig & ApplyDefaults<typeof environmentConfigDefaults, EnvironmentConfigStrippedNormalizedOverride>>;\nexport type OrganizationRenderedConfig = PrettifyType<EnvironmentRenderedConfig & ApplyDefaults<typeof organizationConfigDefaults, OrganizationConfigStrippedNormalizedOverride>>;\n"],"mappings":"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","names":[]}
@@ -237,6 +237,44 @@ var StackAdminInterface = class extends StackServerInterface {
237
237
  }, null);
238
238
  return await response.json();
239
239
  }
240
+ async sendEmail(options) {
241
+ await this.sendAdminRequest("/emails/send-email", {
242
+ method: "POST",
243
+ headers: {
244
+ "content-type": "application/json"
245
+ },
246
+ body: JSON.stringify(options)
247
+ }, null);
248
+ }
249
+ async sendSignInInvitationEmail(email, callbackUrl) {
250
+ await this.sendAdminRequest(
251
+ "/internal/send-sign-in-invitation",
252
+ {
253
+ method: "POST",
254
+ headers: {
255
+ "Content-Type": "application/json"
256
+ },
257
+ body: JSON.stringify({
258
+ email,
259
+ callback_url: callbackUrl
260
+ })
261
+ },
262
+ null
263
+ );
264
+ }
265
+ async renderEmailThemePreview(theme, content) {
266
+ const response = await this.sendAdminRequest(`/emails/render-email`, {
267
+ method: "POST",
268
+ headers: {
269
+ "content-type": "application/json"
270
+ },
271
+ body: JSON.stringify({
272
+ theme,
273
+ preview_html: content
274
+ })
275
+ }, null);
276
+ return await response.json();
277
+ }
240
278
  };
241
279
  export {
242
280
  StackAdminInterface
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/interface/admin-interface.ts"],"sourcesContent":["import { InternalSession } from \"../sessions\";\nimport { EmailTemplateCrud, EmailTemplateType } from \"./crud/email-templates\";\nimport { InternalEmailsCrud } from \"./crud/emails\";\nimport { InternalApiKeysCrud } from \"./crud/internal-api-keys\";\nimport { ProjectPermissionDefinitionsCrud } from \"./crud/project-permissions\";\nimport { ProjectsCrud } from \"./crud/projects\";\nimport { SvixTokenCrud } from \"./crud/svix-token\";\nimport { TeamPermissionDefinitionsCrud } from \"./crud/team-permissions\";\nimport { ServerAuthApplicationOptions, StackServerInterface } from \"./server-interface\";\n\nexport type AdminAuthApplicationOptions = ServerAuthApplicationOptions &(\n | {\n superSecretAdminKey: string,\n }\n | {\n projectOwnerSession: InternalSession,\n }\n);\n\nexport type InternalApiKeyCreateCrudRequest = {\n has_publishable_client_key: boolean,\n has_secret_server_key: boolean,\n has_super_secret_admin_key: boolean,\n expires_at_millis: number,\n description: string,\n};\n\nexport type InternalApiKeyCreateCrudResponse = InternalApiKeysCrud[\"Admin\"][\"Read\"] & {\n publishable_client_key?: string,\n secret_server_key?: string,\n super_secret_admin_key?: string,\n};\n\nexport class StackAdminInterface extends StackServerInterface {\n constructor(public readonly options: AdminAuthApplicationOptions) {\n super(options);\n }\n\n public async sendAdminRequest(path: string, options: RequestInit, session: InternalSession | null, requestType: \"admin\" = \"admin\") {\n return await this.sendServerRequest(\n path,\n {\n ...options,\n headers: {\n \"x-stack-super-secret-admin-key\": \"superSecretAdminKey\" in this.options ? this.options.superSecretAdminKey : \"\",\n ...options.headers,\n },\n },\n session,\n requestType,\n );\n }\n\n async getProject(): Promise<ProjectsCrud[\"Admin\"][\"Read\"]> {\n const response = await this.sendAdminRequest(\n \"/internal/projects/current\",\n {\n method: \"GET\",\n },\n null,\n );\n return await response.json();\n }\n\n async updateProject(update: ProjectsCrud[\"Admin\"][\"Update\"]): Promise<ProjectsCrud[\"Admin\"][\"Read\"]> {\n const response = await this.sendAdminRequest(\n \"/internal/projects/current\",\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(update),\n },\n null,\n );\n return await response.json();\n }\n\n async createInternalApiKey(\n options: InternalApiKeyCreateCrudRequest,\n ): Promise<InternalApiKeyCreateCrudResponse> {\n const response = await this.sendAdminRequest(\n \"/internal/api-keys\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(options),\n },\n null,\n );\n return await response.json();\n }\n\n async listInternalApiKeys(): Promise<InternalApiKeysCrud[\"Admin\"][\"Read\"][]> {\n const response = await this.sendAdminRequest(\"/internal/api-keys\", {}, null);\n const result = await response.json() as InternalApiKeysCrud[\"Admin\"][\"List\"];\n return result.items;\n }\n\n async revokeInternalApiKeyById(id: string) {\n await this.sendAdminRequest(\n `/internal/api-keys/${id}`, {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n revoked: true,\n }),\n },\n null,\n );\n }\n\n async getInternalApiKey(id: string, session: InternalSession): Promise<InternalApiKeysCrud[\"Admin\"][\"Read\"]> {\n const response = await this.sendAdminRequest(`/internal/api-keys/${id}`, {}, session);\n return await response.json();\n }\n\n async listEmailTemplates(): Promise<EmailTemplateCrud['Admin']['Read'][]> {\n const response = await this.sendAdminRequest(`/email-templates`, {}, null);\n const result = await response.json() as EmailTemplateCrud['Admin']['List'];\n return result.items;\n }\n\n async updateEmailTemplate(type: EmailTemplateType, data: EmailTemplateCrud['Admin']['Update']): Promise<EmailTemplateCrud['Admin']['Read']> {\n const result = await this.sendAdminRequest(\n `/email-templates/${type}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await result.json();\n }\n\n async resetEmailTemplate(type: EmailTemplateType): Promise<void> {\n await this.sendAdminRequest(\n `/email-templates/${type}`,\n { method: \"DELETE\" },\n null\n );\n }\n\n // Team permission definitions methods\n async listTeamPermissionDefinitions(): Promise<TeamPermissionDefinitionsCrud['Admin']['Read'][]> {\n const response = await this.sendAdminRequest(`/team-permission-definitions`, {}, null);\n const result = await response.json() as TeamPermissionDefinitionsCrud['Admin']['List'];\n return result.items;\n }\n\n async createTeamPermissionDefinition(data: TeamPermissionDefinitionsCrud['Admin']['Create']): Promise<TeamPermissionDefinitionsCrud['Admin']['Read']> {\n const response = await this.sendAdminRequest(\n \"/team-permission-definitions\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n async updateTeamPermissionDefinition(permissionId: string, data: TeamPermissionDefinitionsCrud['Admin']['Update']): Promise<TeamPermissionDefinitionsCrud['Admin']['Read']> {\n const response = await this.sendAdminRequest(\n `/team-permission-definitions/${permissionId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n async deleteTeamPermissionDefinition(permissionId: string): Promise<void> {\n await this.sendAdminRequest(\n `/team-permission-definitions/${permissionId}`,\n { method: \"DELETE\" },\n null,\n );\n }\n\n async listProjectPermissionDefinitions(): Promise<ProjectPermissionDefinitionsCrud['Admin']['Read'][]> {\n const response = await this.sendAdminRequest(`/project-permission-definitions`, {}, null);\n const result = await response.json() as ProjectPermissionDefinitionsCrud['Admin']['List'];\n return result.items;\n }\n\n async createProjectPermissionDefinition(data: ProjectPermissionDefinitionsCrud['Admin']['Create']): Promise<ProjectPermissionDefinitionsCrud['Admin']['Read']> {\n const response = await this.sendAdminRequest(\n \"/project-permission-definitions\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n async updateProjectPermissionDefinition(permissionId: string, data: ProjectPermissionDefinitionsCrud['Admin']['Update']): Promise<ProjectPermissionDefinitionsCrud['Admin']['Read']> {\n const response = await this.sendAdminRequest(\n `/project-permission-definitions/${permissionId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n async deleteProjectPermissionDefinition(permissionId: string): Promise<void> {\n await this.sendAdminRequest(\n `/project-permission-definitions/${permissionId}`,\n { method: \"DELETE\" },\n null,\n );\n }\n\n async getSvixToken(): Promise<SvixTokenCrud[\"Admin\"][\"Read\"]> {\n const response = await this.sendAdminRequest(\n \"/webhooks/svix-token\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n null,\n );\n return await response.json();\n }\n\n async deleteProject(): Promise<void> {\n await this.sendAdminRequest(\n \"/internal/projects/current\",\n {\n method: \"DELETE\",\n },\n null,\n );\n }\n\n async getMetrics(): Promise<any> {\n const response = await this.sendAdminRequest(\n \"/internal/metrics\",\n {\n method: \"GET\",\n },\n null,\n );\n return await response.json();\n }\n\n async sendTestEmail(data: {\n recipient_email: string,\n email_config: {\n host: string,\n port: number,\n username: string,\n password: string,\n sender_email: string,\n sender_name: string,\n },\n }): Promise<{ success: boolean, error_message?: string }> {\n const response = await this.sendAdminRequest(`/internal/send-test-email`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }, null);\n return await response.json();\n }\n\n async listSentEmails(): Promise<InternalEmailsCrud[\"Admin\"][\"List\"]> {\n const response = await this.sendAdminRequest(\"/internal/emails\", {\n method: \"GET\",\n }, null);\n return await response.json();\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/interface/admin-interface.ts"],"sourcesContent":["import { InternalSession } from \"../sessions\";\nimport { EmailTemplateCrud, EmailTemplateType } from \"./crud/email-templates\";\nimport { InternalEmailsCrud } from \"./crud/emails\";\nimport { InternalApiKeysCrud } from \"./crud/internal-api-keys\";\nimport { ProjectPermissionDefinitionsCrud } from \"./crud/project-permissions\";\nimport { ProjectsCrud } from \"./crud/projects\";\nimport { SvixTokenCrud } from \"./crud/svix-token\";\nimport { TeamPermissionDefinitionsCrud } from \"./crud/team-permissions\";\nimport { ServerAuthApplicationOptions, StackServerInterface } from \"./server-interface\";\n\nexport type AdminAuthApplicationOptions = ServerAuthApplicationOptions &(\n | {\n superSecretAdminKey: string,\n }\n | {\n projectOwnerSession: InternalSession,\n }\n);\n\nexport type InternalApiKeyCreateCrudRequest = {\n has_publishable_client_key: boolean,\n has_secret_server_key: boolean,\n has_super_secret_admin_key: boolean,\n expires_at_millis: number,\n description: string,\n};\n\nexport type InternalApiKeyCreateCrudResponse = InternalApiKeysCrud[\"Admin\"][\"Read\"] & {\n publishable_client_key?: string,\n secret_server_key?: string,\n super_secret_admin_key?: string,\n};\n\nexport class StackAdminInterface extends StackServerInterface {\n constructor(public readonly options: AdminAuthApplicationOptions) {\n super(options);\n }\n\n public async sendAdminRequest(path: string, options: RequestInit, session: InternalSession | null, requestType: \"admin\" = \"admin\") {\n return await this.sendServerRequest(\n path,\n {\n ...options,\n headers: {\n \"x-stack-super-secret-admin-key\": \"superSecretAdminKey\" in this.options ? this.options.superSecretAdminKey : \"\",\n ...options.headers,\n },\n },\n session,\n requestType,\n );\n }\n\n async getProject(): Promise<ProjectsCrud[\"Admin\"][\"Read\"]> {\n const response = await this.sendAdminRequest(\n \"/internal/projects/current\",\n {\n method: \"GET\",\n },\n null,\n );\n return await response.json();\n }\n\n async updateProject(update: ProjectsCrud[\"Admin\"][\"Update\"]): Promise<ProjectsCrud[\"Admin\"][\"Read\"]> {\n const response = await this.sendAdminRequest(\n \"/internal/projects/current\",\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(update),\n },\n null,\n );\n return await response.json();\n }\n\n async createInternalApiKey(\n options: InternalApiKeyCreateCrudRequest,\n ): Promise<InternalApiKeyCreateCrudResponse> {\n const response = await this.sendAdminRequest(\n \"/internal/api-keys\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(options),\n },\n null,\n );\n return await response.json();\n }\n\n async listInternalApiKeys(): Promise<InternalApiKeysCrud[\"Admin\"][\"Read\"][]> {\n const response = await this.sendAdminRequest(\"/internal/api-keys\", {}, null);\n const result = await response.json() as InternalApiKeysCrud[\"Admin\"][\"List\"];\n return result.items;\n }\n\n async revokeInternalApiKeyById(id: string) {\n await this.sendAdminRequest(\n `/internal/api-keys/${id}`, {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n revoked: true,\n }),\n },\n null,\n );\n }\n\n async getInternalApiKey(id: string, session: InternalSession): Promise<InternalApiKeysCrud[\"Admin\"][\"Read\"]> {\n const response = await this.sendAdminRequest(`/internal/api-keys/${id}`, {}, session);\n return await response.json();\n }\n\n async listEmailTemplates(): Promise<EmailTemplateCrud['Admin']['Read'][]> {\n const response = await this.sendAdminRequest(`/email-templates`, {}, null);\n const result = await response.json() as EmailTemplateCrud['Admin']['List'];\n return result.items;\n }\n\n async updateEmailTemplate(type: EmailTemplateType, data: EmailTemplateCrud['Admin']['Update']): Promise<EmailTemplateCrud['Admin']['Read']> {\n const result = await this.sendAdminRequest(\n `/email-templates/${type}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await result.json();\n }\n\n async resetEmailTemplate(type: EmailTemplateType): Promise<void> {\n await this.sendAdminRequest(\n `/email-templates/${type}`,\n { method: \"DELETE\" },\n null\n );\n }\n\n // Team permission definitions methods\n async listTeamPermissionDefinitions(): Promise<TeamPermissionDefinitionsCrud['Admin']['Read'][]> {\n const response = await this.sendAdminRequest(`/team-permission-definitions`, {}, null);\n const result = await response.json() as TeamPermissionDefinitionsCrud['Admin']['List'];\n return result.items;\n }\n\n async createTeamPermissionDefinition(data: TeamPermissionDefinitionsCrud['Admin']['Create']): Promise<TeamPermissionDefinitionsCrud['Admin']['Read']> {\n const response = await this.sendAdminRequest(\n \"/team-permission-definitions\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n async updateTeamPermissionDefinition(permissionId: string, data: TeamPermissionDefinitionsCrud['Admin']['Update']): Promise<TeamPermissionDefinitionsCrud['Admin']['Read']> {\n const response = await this.sendAdminRequest(\n `/team-permission-definitions/${permissionId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n async deleteTeamPermissionDefinition(permissionId: string): Promise<void> {\n await this.sendAdminRequest(\n `/team-permission-definitions/${permissionId}`,\n { method: \"DELETE\" },\n null,\n );\n }\n\n async listProjectPermissionDefinitions(): Promise<ProjectPermissionDefinitionsCrud['Admin']['Read'][]> {\n const response = await this.sendAdminRequest(`/project-permission-definitions`, {}, null);\n const result = await response.json() as ProjectPermissionDefinitionsCrud['Admin']['List'];\n return result.items;\n }\n\n async createProjectPermissionDefinition(data: ProjectPermissionDefinitionsCrud['Admin']['Create']): Promise<ProjectPermissionDefinitionsCrud['Admin']['Read']> {\n const response = await this.sendAdminRequest(\n \"/project-permission-definitions\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n async updateProjectPermissionDefinition(permissionId: string, data: ProjectPermissionDefinitionsCrud['Admin']['Update']): Promise<ProjectPermissionDefinitionsCrud['Admin']['Read']> {\n const response = await this.sendAdminRequest(\n `/project-permission-definitions/${permissionId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n async deleteProjectPermissionDefinition(permissionId: string): Promise<void> {\n await this.sendAdminRequest(\n `/project-permission-definitions/${permissionId}`,\n { method: \"DELETE\" },\n null,\n );\n }\n\n async getSvixToken(): Promise<SvixTokenCrud[\"Admin\"][\"Read\"]> {\n const response = await this.sendAdminRequest(\n \"/webhooks/svix-token\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n null,\n );\n return await response.json();\n }\n\n async deleteProject(): Promise<void> {\n await this.sendAdminRequest(\n \"/internal/projects/current\",\n {\n method: \"DELETE\",\n },\n null,\n );\n }\n\n async getMetrics(): Promise<any> {\n const response = await this.sendAdminRequest(\n \"/internal/metrics\",\n {\n method: \"GET\",\n },\n null,\n );\n return await response.json();\n }\n\n async sendTestEmail(data: {\n recipient_email: string,\n email_config: {\n host: string,\n port: number,\n username: string,\n password: string,\n sender_email: string,\n sender_name: string,\n },\n }): Promise<{ success: boolean, error_message?: string }> {\n const response = await this.sendAdminRequest(`/internal/send-test-email`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }, null);\n return await response.json();\n }\n\n async listSentEmails(): Promise<InternalEmailsCrud[\"Admin\"][\"List\"]> {\n const response = await this.sendAdminRequest(\"/internal/emails\", {\n method: \"GET\",\n }, null);\n return await response.json();\n }\n\n async sendEmail(options: {\n user_ids: string[],\n subject: string,\n html: string,\n notification_category_name: string,\n }): Promise<void> {\n await this.sendAdminRequest(\"/emails/send-email\", {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(options),\n }, null);\n }\n\n async sendSignInInvitationEmail(\n email: string,\n callbackUrl: string,\n ): Promise<void> {\n await this.sendAdminRequest(\n \"/internal/send-sign-in-invitation\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n email,\n callback_url: callbackUrl,\n }),\n },\n null,\n );\n }\n\n async renderEmailThemePreview(theme: string, content: string): Promise<{ html: string }> {\n const response = await this.sendAdminRequest(`/emails/render-email`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n theme,\n preview_html: content,\n }),\n }, null);\n return await response.json();\n }\n}\n"],"mappings":"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","names":[]}
@@ -1230,6 +1230,30 @@ var StackClientInterface = class {
1230
1230
  }
1231
1231
  return await result.data.json();
1232
1232
  }
1233
+ async listNotificationCategories(session) {
1234
+ const response = await this.sendClientRequest(
1235
+ `/emails/notification-preference/me`,
1236
+ {},
1237
+ session
1238
+ );
1239
+ const result = await response.json();
1240
+ return result.items;
1241
+ }
1242
+ async setNotificationsEnabled(notificationCategoryId, enabled, session) {
1243
+ await this.sendClientRequest(
1244
+ `/emails/notification-preference/me/${notificationCategoryId}`,
1245
+ {
1246
+ method: "PATCH",
1247
+ headers: {
1248
+ "content-type": "application/json"
1249
+ },
1250
+ body: JSON.stringify({
1251
+ enabled
1252
+ })
1253
+ },
1254
+ session
1255
+ );
1256
+ }
1233
1257
  };
1234
1258
  export {
1235
1259
  StackClientInterface