@stackframe/stack-shared 2.8.28 → 2.8.31
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.
- package/CHANGELOG.md +18 -0
- package/dist/config/schema.d.mts +391 -15
- package/dist/config/schema.d.ts +391 -15
- package/dist/config/schema.js +70 -2
- package/dist/config/schema.js.map +1 -1
- package/dist/esm/config/schema.js +70 -3
- package/dist/esm/config/schema.js.map +1 -1
- package/dist/esm/interface/admin-interface.js +62 -0
- package/dist/esm/interface/admin-interface.js.map +1 -1
- package/dist/esm/interface/crud/projects.js +7 -1
- package/dist/esm/interface/crud/projects.js.map +1 -1
- package/dist/esm/known-errors.js +89 -1
- package/dist/esm/known-errors.js.map +1 -1
- package/dist/esm/schema-fields.js +67 -4
- package/dist/esm/schema-fields.js.map +1 -1
- package/dist/esm/utils/featurebase.js +176 -0
- package/dist/esm/utils/featurebase.js.map +1 -0
- package/dist/esm/utils/html.js +6 -1
- package/dist/esm/utils/html.js.map +1 -1
- package/dist/interface/admin-interface.d.mts +19 -0
- package/dist/interface/admin-interface.d.ts +19 -0
- package/dist/interface/admin-interface.js +62 -0
- package/dist/interface/admin-interface.js.map +1 -1
- package/dist/interface/crud/project-api-keys.d.mts +4 -4
- package/dist/interface/crud/project-api-keys.d.ts +4 -4
- package/dist/interface/crud/projects.d.mts +45 -7
- package/dist/interface/crud/projects.d.ts +45 -7
- package/dist/interface/crud/projects.js +7 -1
- package/dist/interface/crud/projects.js.map +1 -1
- package/dist/known-errors.d.mts +18 -0
- package/dist/known-errors.d.ts +18 -0
- package/dist/known-errors.js +89 -1
- package/dist/known-errors.js.map +1 -1
- package/dist/schema-fields.d.mts +88 -2
- package/dist/schema-fields.d.ts +88 -2
- package/dist/schema-fields.js +71 -3
- package/dist/schema-fields.js.map +1 -1
- package/dist/utils/featurebase.d.mts +28 -0
- package/dist/utils/featurebase.d.ts +28 -0
- package/dist/utils/featurebase.js +201 -0
- package/dist/utils/featurebase.js.map +1 -0
- package/dist/utils/html.d.mts +2 -1
- package/dist/utils/html.d.ts +2 -1
- package/dist/utils/html.js +8 -2
- package/dist/utils/html.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/config/schema.ts"],"sourcesContent":["// TODO: rename this file to spaghetti.ts because that's the kind of code here\n\nimport * as yup from \"yup\";\nimport { DEFAULT_EMAIL_TEMPLATES, DEFAULT_EMAIL_THEMES, DEFAULT_EMAIL_THEME_ID } from \"../helpers/emails\";\nimport * as schemaFields from \"../schema-fields\";\nimport { yupBoolean, yupDate, yupMixed, yupNever, yupNumber, yupObject, yupRecord, yupString, yupTuple, yupUnion } from \"../schema-fields\";\nimport { isShallowEqual } from \"../utils/arrays\";\nimport { StackAssertionError } from \"../utils/errors\";\nimport { allProviders } from \"../utils/oauth\";\nimport { DeepFilterUndefined, DeepMerge, DeepRequiredOrUndefined, deleteKey, filterUndefined, get, has, isObjectLike, mapValues, set, typedAssign, typedFromEntries } from \"../utils/objects\";\nimport { Result } from \"../utils/results\";\nimport { CollapseObjectUnion, Expand, IntersectAll, IsUnion, typeAssert, typeAssertExtends, typeAssertIs } from \"../utils/types\";\nimport { Config, NormalizationError, NormalizesTo, assertNormalized, getInvalidConfigReason, normalize } from \"./format\";\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_:]+$/;\ndeclare module \"yup\" {\n // eslint-disable-next-line @typescript-eslint/consistent-type-definitions\n export interface CustomSchemaMetadata {\n stackConfigCanNoLongerBeOverridden?: true,\n }\n}\n\nfunction canNoLongerBeOverridden<T extends yup.AnyObjectSchema, K extends string[]>(schema: T, keys: K): yup.Schema<Omit<yup.InferType<T>, K[number]>, T['__context'], Omit<T['__default'], K[number]>, T['__flags']> {\n const notOmitted = schema.concat(yupObject(\n Object.fromEntries(keys.map(key => [key, schema.getNested(key).meta({ stackConfigCanNoLongerBeOverridden: true })]))\n ));\n return notOmitted as any;\n}\n\n/**\n * All fields that can be overridden at this level.\n */\nexport const projectConfigSchema = yupObject({\n sourceOfTruth: yupUnion(\n yupObject({\n type: yupString().oneOf(['hosted']).defined(),\n }),\n yupObject({\n type: yupString().oneOf(['neon']).defined(),\n connectionStrings: yupRecord(\n yupString().defined(),\n yupString().defined(),\n ).defined(),\n }),\n yupObject({\n type: yupString().oneOf(['postgres']).defined(),\n connectionString: yupString().defined()\n }),\n ),\n});\n\n// --- NEW RBAC Schema ---\nconst branchRbacDefaultPermissions = yupRecord(\n yupString().matches(permissionRegex),\n yupBoolean().isTrue().optional(),\n);\n\nconst branchRbacSchema = yupObject({\n permissions: yupRecord(\n yupString().matches(customPermissionRegex),\n yupObject({\n description: yupString().optional(),\n scope: yupString().oneOf(['team', 'project']).optional(),\n containedPermissionIds: yupRecord(\n yupString().matches(permissionRegex),\n yupBoolean().isTrue().optional()\n ).optional(),\n }).optional(),\n ),\n defaultPermissions: yupObject({\n teamCreator: branchRbacDefaultPermissions,\n teamMember: branchRbacDefaultPermissions,\n signUp: branchRbacDefaultPermissions,\n }),\n});\n// --- END NEW RBAC Schema ---\n\n// --- NEW API Keys Schema ---\nconst branchApiKeysSchema = yupObject({\n enabled: yupObject({\n team: yupBoolean(),\n user: yupBoolean(),\n }),\n});\n// --- END NEW API Keys Schema ---\n\n\nconst branchAuthSchema = yupObject({\n allowSignUp: yupBoolean(),\n password: yupObject({\n allowSignIn: yupBoolean(),\n }),\n otp: yupObject({\n allowSignIn: yupBoolean(),\n }),\n passkey: yupObject({\n allowSignIn: yupBoolean(),\n }),\n oauth: yupObject({\n accountMergeStrategy: yupString().oneOf(['link_method', 'raise_error', 'allow_duplicates']).optional(),\n providers: yupRecord(\n yupString().matches(permissionRegex),\n yupObject({\n type: yupString().oneOf(allProviders).optional(),\n allowSignIn: yupBoolean(),\n allowConnectedAccounts: yupBoolean(),\n }),\n ),\n }),\n});\n\nconst branchDomain = yupObject({\n allowLocalhost: yupBoolean(),\n});\n\nexport const branchConfigSchema = canNoLongerBeOverridden(projectConfigSchema, [\"sourceOfTruth\"]).concat(yupObject({\n rbac: branchRbacSchema,\n\n teams: yupObject({\n createPersonalTeamOnSignUp: yupBoolean(),\n allowClientTeamCreation: yupBoolean(),\n }),\n\n users: yupObject({\n allowClientUserDeletion: yupBoolean(),\n }),\n\n apiKeys: branchApiKeysSchema,\n\n domains: branchDomain,\n\n auth: branchAuthSchema,\n\n emails: yupObject({\n selectedThemeId: schemaFields.emailThemeSchema,\n themes: schemaFields.emailThemeListSchema,\n templates: schemaFields.emailTemplateListSchema,\n }),\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().matches(permissionRegex),\n yupObject({\n type: yupString().oneOf(allProviders).optional(),\n isShared: yupBoolean(),\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 ),\n })),\n })),\n\n emails: branchConfigSchema.getNested(\"emails\").concat(yupObject({\n server: yupObject({\n isShared: yupBoolean(),\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 })),\n\n domains: branchConfigSchema.getNested(\"domains\").concat(yupObject({\n trustedDomains: yupRecord(\n yupString(),\n yupObject({\n baseUrl: schemaFields.urlSchema,\n handlerPath: schemaFields.handlerPathSchema,\n }),\n ),\n })),\n}));\n\nexport const organizationConfigSchema = environmentConfigSchema.concat(yupObject({}));\n\n\n// Migration functions\n//\n// These are used to migrate old config overrides to the new format on the database.\n//\n// THEY SHOULD NOT BE USED FOR ANY OTHER PURPOSE. They should not be used for default values. They should not be used\n// for sanitization. Instead, use the applicable functions for that.\n//\n// We run these migrations over the database when we do a big migration. USE THESE SPARINGLY. USE OTHER METHODS WHENEVER\n// POSSIBLE.\n//\n// The result of this function should be reproducible, and should not contain ANY randomness/non-determinism.\nexport function migrateConfigOverride(type: \"project\" | \"branch\" | \"environment\" | \"organization\", oldUnmigratedConfigOverride: any): any {\n const isBranchOrHigher = [\"branch\", \"environment\", \"organization\"].includes(type);\n const isEnvironmentOrHigher = [\"environment\", \"organization\"].includes(type);\n\n let res = oldUnmigratedConfigOverride;\n\n // BEGIN 2025-07-28: emails.theme is now emails.selectedThemeId\n if (isBranchOrHigher) {\n res = renameProperty(res, \"emails.theme\", \"emails.selectedThemeId\");\n }\n // END\n\n // BEGIN 2025-07-28: domains.trustedDomains can no longer be an array\n if (isEnvironmentOrHigher) {\n res = mapProperty(res, \"domains.trustedDomains\", (value) => {\n if (Array.isArray(value)) {\n return typedFromEntries(value.map((v, i) => [`${i}`, v]));\n }\n return value;\n });\n }\n // END\n\n // BEGIN 2025-07-28: themeList and templateList have been renamed (this was before the email release, so they're safe to remove)\n if (isBranchOrHigher) {\n res = removeProperty(res, \"emails.themeList\");\n res = removeProperty(res, \"emails.templateList\");\n }\n // END\n\n // BEGIN 2025-07-28: sourceOfTruth was mistakenly written to the environment config in some cases, so let's remove it\n if (type === \"environment\") {\n res = removeProperty(res, \"sourceOfTruth\");\n }\n // END\n\n // return the result\n return res;\n};\n\nfunction removeProperty(obj: any, path: string): any {\n return mapProperty(obj, path, () => undefined);\n}\n\nfunction mapProperty(obj: any, path: string, mapper: (value: any) => any): any {\n const keyParts = path.split(\".\");\n\n for (let i = 0; i < keyParts.length; i++) {\n const pathPrefix = keyParts.slice(0, i).join(\".\");\n const pathSuffix = keyParts.slice(i).join(\".\");\n if (has(obj, pathPrefix) && isObjectLike(get(obj, pathPrefix))) {\n const newValue = mapProperty(get(obj, pathPrefix), pathSuffix, mapper);\n set(obj, pathPrefix, newValue);\n }\n }\n if (has(obj, path)) {\n const newValue = mapper(get(obj, path));\n if (newValue !== undefined) {\n set(obj, path, newValue);\n } else {\n deleteKey(obj, path);\n }\n }\n\n return obj;\n}\nundefined?.test(\"mapProperty - basic property mapping\", ({ expect }) => {\n expect(mapProperty({ a: { b: { c: 1 } } }, \"a.b.c\", (value) => value + 1)).toEqual({ a: { b: { c: 2 } } });\n expect(mapProperty({ a: { b: { c: 1 } } }, \"a.b.d\", (value) => value + 1)).toEqual({ a: { b: { c: 1 } } });\n expect(mapProperty({ x: 5 }, \"x\", (value) => value * 2)).toEqual({ x: 10 });\n expect(mapProperty({ a: { b: { c: 1 } } }, \"b.c\", (value) => value * 10)).toEqual({ a: { b: { c: 1 } } });\n expect(mapProperty({ a: 1 }, \"b.c\", (value) => value)).toEqual({ a: 1 });\n});\n\nfunction renameProperty(obj: any, oldPath: string, newPath: string): any {\n const oldKeyParts = oldPath.split(\".\");\n const newKeyParts = newPath.split(\".\");\n if (!isShallowEqual(oldKeyParts.slice(0, -1), newKeyParts.slice(0, -1))) throw new StackAssertionError(`oldPath and newPath must have the same prefix. Provided: ${oldPath} and ${newPath}`);\n\n for (let i = 0; i < oldKeyParts.length; i++) {\n const pathPrefix = oldKeyParts.slice(0, i).join(\".\");\n const oldPathSuffix = oldKeyParts.slice(i).join(\".\");\n const newPathSuffix = newKeyParts.slice(i).join(\".\");\n if (has(obj, pathPrefix) && isObjectLike(get(obj, pathPrefix))) {\n set(obj, pathPrefix, renameProperty(get(obj, pathPrefix), oldPathSuffix, newPathSuffix));\n }\n }\n if (has(obj, oldPath)) {\n set(obj, newPath, get(obj, oldPath));\n deleteKey(obj, oldPath);\n }\n\n return obj;\n}\nundefined?.test(\"renameProperty\", ({ expect }) => {\n // Basic\n expect(renameProperty({ a: 1 }, \"a\", \"b\")).toEqual({ b: 1 });\n expect(renameProperty({ b: { c: 1 } }, \"b.c\", \"b.d\")).toEqual({ b: { d: 1 } });\n expect(renameProperty({ a: { b: { c: 1 } } }, \"a.b.c\", \"a.b.d\")).toEqual({ a: { b: { d: 1 } } });\n expect(renameProperty({ a: { b: { c: 1 } } }, \"a.b.c.d\", \"a.b.c.e\")).toEqual({ a: { b: { c: 1 } } });\n\n // Errors\n expect(() => renameProperty({ a: 1 }, \"a\", \"b.c\")).toThrow();\n});\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// To make sure you don't accidentally forget setting a default value, you must explicitly set fields with no default value to `undefined`.\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.\nconst projectConfigDefaults = {\n sourceOfTruth: {\n type: 'hosted',\n connectionStrings: undefined,\n connectionString: undefined,\n },\n} as const satisfies DefaultsType<ProjectRenderedConfigBeforeDefaults, []>;\n\nconst branchConfigDefaults = {} as const satisfies DefaultsType<BranchRenderedConfigBeforeDefaults, [typeof projectConfigDefaults]>;\n\nconst environmentConfigDefaults = {} as const satisfies DefaultsType<EnvironmentRenderedConfigBeforeDefaults, [typeof branchConfigDefaults, typeof projectConfigDefaults]>;\n\nconst organizationConfigDefaults = {\n rbac: {\n permissions: (key: string) => ({\n containedPermissionIds: (key: string) => undefined,\n description: undefined,\n scope: undefined,\n }),\n defaultPermissions: {\n teamCreator: (key: string) => undefined,\n teamMember: (key: string) => undefined,\n signUp: (key: string) => undefined,\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 baseUrl: undefined,\n handlerPath: '/handler',\n }) as const,\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 type: undefined,\n isShared: true,\n allowSignIn: false,\n allowConnectedAccounts: false,\n clientId: undefined,\n clientSecret: undefined,\n facebookConfigId: undefined,\n microsoftTenantId: undefined,\n }),\n },\n },\n\n emails: {\n server: {\n isShared: true,\n host: undefined,\n port: undefined,\n username: undefined,\n password: undefined,\n senderName: undefined,\n senderEmail: undefined,\n },\n selectedThemeId: DEFAULT_EMAIL_THEME_ID,\n themes: typedAssign((key: string) => ({\n displayName: \"Unnamed Theme\",\n tsxSource: \"Error: Theme config is missing TypeScript source code.\",\n }), DEFAULT_EMAIL_THEMES),\n templates: typedAssign((key: string) => ({\n displayName: \"Unnamed Template\",\n tsxSource: \"Error: Template config is missing TypeScript source code.\",\n themeId: undefined,\n }), DEFAULT_EMAIL_TEMPLATES),\n },\n} as const satisfies DefaultsType<OrganizationRenderedConfigBeforeDefaults, [typeof environmentConfigDefaults, typeof branchConfigDefaults, typeof projectConfigDefaults]>;\n\ntype _DeepOmitDefaultsImpl<T, U> = T extends object ? (\n (\n & /* keys that are both in T and U, *and* the key's value in U is not a subtype of the key's value in T */ { [K in { [Ki in keyof T & keyof U]: U[Ki] extends T[Ki] ? never : Ki }[keyof T & keyof U]]: DeepOmitDefaults<T[K], U[K] & object> }\n & /* keys that are in T but not in U */ { [K in Exclude<keyof T, keyof U>]: T[K] }\n )\n) : T;\ntype DeepOmitDefaults<T, U> = _DeepOmitDefaultsImpl<DeepFilterUndefined<T>, U>;\ntype DefaultsType<T, U extends any[]> = DeepReplaceAllowFunctionsForObjects<DeepOmitDefaults<DeepRequiredOrUndefined<T>, IntersectAll<{ [K in keyof U]: DeepReplaceFunctionsWithObjects<U[K]> }>>>;\ntypeAssertIs<DefaultsType<{ a: { b: Record<string, 123>, c: 456 } }, [{ a: { c: 456 } }]>, { a: { b: ((key: string) => 123) | Record<string, 123 | undefined> & ((key: string) => 123) } }>()();\n\ntype DeepReplaceAllowFunctionsForObjects<T> = T extends object\n ? (\n string extends keyof T\n ? ((arg: Exclude<keyof T, number>) => DeepReplaceAllowFunctionsForObjects<T[keyof T]>) & ({ [K in keyof T]?: DeepReplaceAllowFunctionsForObjects<T[K]> } | {})\n : { [K in keyof T]: DeepReplaceAllowFunctionsForObjects<T[K]> }\n )\n :\n T;\ntype ReplaceFunctionsWithObjects<T> = T & (T extends (arg: infer K extends string) => infer R ? Record<K, R> & object : unknown);\ntype DeepReplaceFunctionsWithObjects<T> = T extends object ? { [K in keyof ReplaceFunctionsWithObjects<T>]: DeepReplaceFunctionsWithObjects<ReplaceFunctionsWithObjects<T>[K]> } : T;\ntypeAssertIs<DeepReplaceFunctionsWithObjects<{ a: { b: 123 } & ((key: string) => number) }>, { a: { b: 123, [key: string]: number } }>()();\n\nfunction deepReplaceFunctionsWithObjects(obj: any): any {\n return mapValues({ ...obj }, v => (isObjectLike(v) ? deepReplaceFunctionsWithObjects(v as any) : v));\n}\nundefined?.test(\"deepReplaceFunctionsWithObjects\", ({ expect }) => {\n expect(deepReplaceFunctionsWithObjects(() => {})).toEqual({});\n expect(deepReplaceFunctionsWithObjects({ a: 3 })).toEqual({ a: 3 });\n expect(deepReplaceFunctionsWithObjects({ a: () => ({ b: 1 }) })).toEqual({ a: {} });\n expect(deepReplaceFunctionsWithObjects({ a: typedAssign(() => ({}), { b: { c: 1 } }) })).toEqual({ a: { b: { c: 1 } } });\n});\n\ntype ApplyDefaults<D extends object | ((key: string) => unknown), C extends object> = {} extends D ? C : DeepMerge<DeepReplaceFunctionsWithObjects<D>, C>; // the {} extends D makes TypeScript not recurse if the defaults are empty, hence allowing us more recursion until \"type instantiation too deep\" kicks in... it's a total hack, but it works, so hey?\nfunction applyDefaults<D extends object | ((key: string) => unknown), C extends object>(defaults: D, config: C): ApplyDefaults<D, C> {\n const res: any = deepReplaceFunctionsWithObjects(defaults);\n\n outer: for (const [key, mergeValue] of Object.entries(config)) {\n if (mergeValue === undefined) continue;\n const keyParts = key.split(\".\");\n let baseValue: any = defaults;\n let currentRes: any = res;\n for (const [index, part] of keyParts.entries()) {\n baseValue = has(baseValue, part) ? get(baseValue, part) : (typeof baseValue === 'function' ? (baseValue as any)(part) : undefined);\n if (baseValue === undefined || !isObjectLike(baseValue)) {\n set(res, key, mergeValue);\n continue outer;\n }\n if (!has(currentRes, part)) set(currentRes, part, deepReplaceFunctionsWithObjects(baseValue) as never);\n currentRes = get(currentRes, part);\n }\n set(res, key, isObjectLike(mergeValue) ? applyDefaults(baseValue, mergeValue) : mergeValue);\n }\n return res as any;\n}\nundefined?.test(\"applyDefaults\", ({ expect }) => {\n // Basic\n expect(applyDefaults({ a: 1 }, { a: 2 })).toEqual({ a: 2 });\n expect(applyDefaults({}, { a: 1 })).toEqual({ a: 1 });\n expect(applyDefaults({ a: { b: 1 } }, { a: { b: 2 } })).toEqual({ a: { b: 2 } });\n expect(applyDefaults({ a: { b: 1 } }, { a: { c: 2 } })).toEqual({ a: { b: 1, c: 2 } });\n expect(applyDefaults({ a: { b: { c: 1, d: 2 } } }, { a: { b: { d: 3, e: 4 } } })).toEqual({ a: { b: { c: 1, d: 3, e: 4 } } });\n\n // Functions\n expect(applyDefaults((key: string) => ({ b: key }), { a: {} })).toEqual({ a: { b: \"a\" } });\n expect(applyDefaults((key1: string) => (key2: string) => ({ a: key1, b: key2 }), { c: { d: {} } })).toEqual({ c: { d: { a: \"c\", b: \"d\" } } });\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 expect(applyDefaults(typedAssign(() => ({ b: 1 }), { a: { b: 1, c: 2 } }), { a: {} })).toEqual({ a: { b: 1, c: 2 } });\n expect(applyDefaults(typedAssign(() => ({ b: 1 }), { a: { b: 1, c: 2 } }), { d: {} })).toEqual({ a: { b: 1, c: 2 }, d: { b: 1 } });\n\n // Dot notation\n expect(applyDefaults({ a: { b: 1 } }, { \"a.c\": 2 })).toEqual({ a: { b: 1 }, \"a.c\": 2 });\n expect(applyDefaults({ a: 1 }, { \"a.b\": 2 })).toEqual({ a: 1, \"a.b\": 2 });\n expect(applyDefaults({ a: null }, { \"a.b\": 2 })).toEqual({ a: null, \"a.b\": 2 });\n expect(applyDefaults({ a: { b: { c: 1 } } }, { \"a.b\": { d: 2 } })).toEqual({ a: { b: { c: 1 } }, \"a.b\": { c: 1, d: 2 } });\n expect(applyDefaults({ a: { b: { c: { d: 1 } } } }, { \"a.b.c\": {} })).toEqual({ a: { b: { c: { d: 1 } } }, \"a.b.c\": { d: 1 } });\n expect(applyDefaults({ a: () => ({ c: 1 }) }, { \"a.b\": { d: 2 } })).toEqual({ a: { b: { c: 1 } }, \"a.b\": { c: 1, d: 2 } });\n expect(applyDefaults({ a: () => () => ({ d: 1 }) }, { \"a.b.c\": {} })).toEqual({ a: { b: { c: { d: 1 } } }, \"a.b.c\": { d: 1 } });\n expect(applyDefaults({ a: { b: () => ({ c: 1, d: 2 }) } }, { \"a.b.x-y.c\": 3 })).toEqual({ a: { b: { \"x-y\": { c: 1, d: 2 } } }, \"a.b.x-y.c\": 3 });\n});\n\nexport function applyProjectDefaults<T extends ProjectRenderedConfigBeforeDefaults>(config: T) {\n return applyDefaults(projectConfigDefaults, config);\n}\n\nexport function applyBranchDefaults<T extends BranchRenderedConfigBeforeDefaults>(config: T) {\n return applyDefaults(\n branchConfigDefaults,\n applyDefaults(\n projectConfigDefaults,\n config\n )\n );\n}\n\nexport function applyEnvironmentDefaults<T extends EnvironmentRenderedConfigBeforeDefaults>(config: T): ApplyDefaults<typeof environmentConfigDefaults, ApplyDefaults<typeof branchConfigDefaults, ApplyDefaults<typeof projectConfigDefaults, T>>> {\n return applyDefaults(\n environmentConfigDefaults,\n applyDefaults(\n branchConfigDefaults,\n applyDefaults(\n projectConfigDefaults,\n config\n ) as any\n ) as any\n ) as any;\n}\n\nexport function applyOrganizationDefaults(config: OrganizationRenderedConfigBeforeDefaults): ApplyDefaults<typeof organizationConfigDefaults, ApplyDefaults<typeof environmentConfigDefaults, ApplyDefaults<typeof branchConfigDefaults, ApplyDefaults<typeof projectConfigDefaults, OrganizationRenderedConfigBeforeDefaults>>>> {\n return applyDefaults(\n organizationConfigDefaults,\n applyDefaults(\n environmentConfigDefaults,\n applyDefaults(\n branchConfigDefaults,\n applyDefaults(\n projectConfigDefaults,\n config\n ) as any\n ) as any\n ) as any\n ) as any;\n}\n\n\nexport async function sanitizeProjectConfig<T extends ProjectRenderedConfigBeforeSanitization>(config: T) {\n assertNormalized(config);\n const oldSourceOfTruth = config.sourceOfTruth;\n const sourceOfTruth =\n oldSourceOfTruth.type === 'neon' && typeof oldSourceOfTruth.connectionStrings === 'object' ? {\n type: 'neon',\n connectionStrings: { ...filterUndefined(oldSourceOfTruth.connectionStrings) as Record<string, string> }\n } as const\n : oldSourceOfTruth.type === 'postgres' && typeof oldSourceOfTruth.connectionString === 'string' ? {\n type: 'postgres',\n connectionString: oldSourceOfTruth.connectionString,\n } as const\n : {\n type: 'hosted',\n } as const;\n\n return {\n ...config,\n sourceOfTruth,\n };\n}\n\nexport async function sanitizeBranchConfig<T extends BranchRenderedConfigBeforeSanitization>(config: T) {\n assertNormalized(config);\n const prepared = await sanitizeProjectConfig(config);\n return {\n ...prepared,\n };\n}\n\nexport async function sanitizeEnvironmentConfig<T extends EnvironmentRenderedConfigBeforeSanitization>(config: T) {\n assertNormalized(config);\n const prepared = await sanitizeBranchConfig(config);\n return {\n ...prepared,\n };\n}\n\nexport async function sanitizeOrganizationConfig(config: OrganizationRenderedConfigBeforeSanitization) {\n assertNormalized(config);\n const prepared = await sanitizeEnvironmentConfig(config);\n const themes: typeof prepared.emails.themes = {\n ...DEFAULT_EMAIL_THEMES,\n ...prepared.emails.themes,\n };\n const templates: typeof prepared.emails.templates = {\n ...DEFAULT_EMAIL_TEMPLATES,\n ...prepared.emails.templates,\n };\n return {\n ...prepared,\n emails: {\n ...prepared.emails,\n selectedThemeId: has(themes, prepared.emails.selectedThemeId) ? prepared.emails.selectedThemeId : DEFAULT_EMAIL_THEME_ID,\n themes,\n templates,\n },\n };\n}\n\n/**\n * Does not require a base config, and hence solely relies on the override itself to validate the config. If it returns\n * no error, you know that the\n *\n * It's crucial that our DB never contains any configs that are not valid according to this function, as this would mean\n * that the config object does not satisfy the ValidatedToHaveNoConfigOverrideErrors type (which is used as an assumption\n * in a whole bunch of places in the code).\n */\nexport async function getConfigOverrideErrors<T extends yup.AnySchema>(schema: T, configOverride: unknown, options: { allowPropertiesThatCanNoLongerBeOverridden?: boolean } = {}): Promise<Result<null, string>> {\n // currently, we go over the schema and ensure that the general requirements for each property are satisfied\n // importantly, we cannot check any cross-property constraints, as those may change depending on the base config\n // also, since overrides can be empty, we cannot have any required properties (TODO: can we have required properties in nested objects? would that even make sense? think about it)\n if (typeof configOverride !== \"object\" || configOverride === null) {\n return Result.error(\"Config override must be a non-null object.\");\n }\n if (Object.getPrototypeOf(configOverride) !== Object.getPrototypeOf({})) {\n return Result.error(\"Config override must be plain old JavaScript object.\");\n }\n // Check config format\n const reason = getInvalidConfigReason(configOverride, { configName: 'override' });\n if (reason) return Result.error(\"Invalid config format: \" + reason);\n\n const getSubSchema = (schema: yup.AnySchema, key: string): yup.AnySchema | undefined => {\n const keyParts = key.split(\".\");\n if (!schema.hasNested(keyParts[0])) {\n return undefined;\n }\n const nestedSchema = schema.getNested(keyParts[0]);\n if (nestedSchema.meta()?.stackConfigCanNoLongerBeOverridden && !options.allowPropertiesThatCanNoLongerBeOverridden) {\n return undefined;\n }\n if (keyParts.length === 1) {\n return nestedSchema;\n } else {\n return getSubSchema(nestedSchema, keyParts.slice(1).join(\".\"));\n }\n };\n\n const getRestrictedSchemaBase = (path: string, schema: yup.AnySchema): yup.AnySchema => {\n const schemaInfo = schema.meta()?.stackSchemaInfo;\n switch (schemaInfo?.type) {\n case \"string\": {\n const stringSchema = schema as yup.StringSchema<any>;\n const description = stringSchema.describe();\n let res = yupString();\n if (description.tests.some(t => t.name === \"uuid\")) {\n res = res.uuid();\n }\n return res;\n }\n case \"number\": {\n return yupNumber();\n }\n case \"boolean\": {\n return yupBoolean();\n }\n case \"date\": {\n return yupDate();\n }\n case \"mixed\": {\n return yupMixed();\n }\n case \"array\": {\n throw new StackAssertionError(`Arrays are not supported in config JSON files (besides tuples). Use a record instead.`, { schemaInfo, schema });\n\n // This is how the implementation would look like, but we don't support arrays in config JSON files (besides tuples)\n // const arraySchema = schema as yup.ArraySchema<any, any, any, any>;\n // const innerType = arraySchema.innerType;\n // return yupArray(innerType ? getRestrictedSchema(path + \".[]\", innerType as any) : undefined);\n }\n case \"tuple\": {\n return yupTuple(schemaInfo.items.map((s, index) => getRestrictedSchema(path + `[${index}]`, s)) as any);\n }\n case \"union\": {\n const schemas = schemaInfo.items;\n const nonObjectSchemas = [...schemas.entries()].filter(([index, s]) => s.meta()?.stackSchemaInfo?.type !== \"object\");\n const objectSchemas = schemas.filter((s): s is yup.ObjectSchema<any> => s.meta()?.stackSchemaInfo?.type === \"object\");\n\n // merge all object schemas into a single schema\n const allObjectSchemaKeys = [...new Set(objectSchemas.flatMap(s => Object.keys(s.fields)))];\n const mergedObjectSchema = yupObject(\n Object.fromEntries(\n allObjectSchemaKeys.map(key => [key, yupUnion(\n ...objectSchemas.flatMap((s, index) => s.hasNested(key) ? [s.getNested(key)] : [])\n )])\n )\n );\n\n return yupUnion(\n ...nonObjectSchemas.map(([index, s]) => getRestrictedSchema(path + `|variant-${index}|`, s)),\n ...objectSchemas.length > 0 ? [getRestrictedSchema(path + (nonObjectSchemas.length > 0 ? `|variant|` : \"\"), mergedObjectSchema)] : [],\n );\n }\n case \"record\": {\n return yupRecord(getRestrictedSchema(path + \".key\", schemaInfo.keySchema) as any, getRestrictedSchema(path + \".value\", schemaInfo.valueSchema));\n }\n case \"object\": {\n const objectSchema = schema as yup.ObjectSchema<any>;\n return yupObject(\n Object.fromEntries(\n Object.entries(objectSchema.fields)\n .map(([key, value]) => [key, getRestrictedSchema(path + \".\" + key, value as any)])\n )\n );\n }\n case \"never\": {\n return yupNever();\n }\n default: {\n throw new StackAssertionError(`Unknown schema info at path ${path}: ${JSON.stringify(schemaInfo)}`, { schemaInfo, schema });\n }\n }\n };\n const getRestrictedSchema = (path: string, schema: yup.AnySchema): yup.AnySchema => {\n let restricted = getRestrictedSchemaBase(path, schema);\n restricted = restricted.nullable();\n const description = schema.describe();\n if (description.oneOf.length > 0) {\n restricted = restricted.oneOf(description.oneOf);\n }\n if (description.notOneOf.length > 0) {\n restricted = restricted.notOneOf(description.notOneOf);\n }\n return restricted;\n };\n\n for (const [key, value] of Object.entries(configOverride)) {\n if (value === undefined) continue;\n const subSchema = getSubSchema(schema, key);\n if (!subSchema) {\n return Result.error(`The key ${JSON.stringify(key)} is not valid for the schema.`);\n }\n let restrictedSchema = getRestrictedSchema(key, subSchema);\n try {\n await restrictedSchema.validate(value, {\n strict: true,\n ...{\n // Although `path` is not part of the yup types, it is actually recognized and does the correct thing\n path: key\n },\n context: {\n noUnknownPathPrefixes: [''],\n },\n });\n } catch (error) {\n if (error instanceof yup.ValidationError) {\n return Result.error(error.message);\n }\n throw error;\n }\n }\n return Result.ok(null);\n}\nexport async function assertNoConfigOverrideErrors<T extends yup.AnySchema>(schema: T, config: unknown, options: { allowPropertiesThatCanNoLongerBeOverridden?: boolean, extraInfo?: any } = {}): Promise<void> {\n const res = await getConfigOverrideErrors(schema, config, options);\n if (res.status === \"error\") throw new StackAssertionError(`Config override is invalid — at a place where it should have already been validated! ${res.error}`, { options, config, schema });\n}\ntype _ValidatedToHaveNoConfigOverrideErrorsImpl<T> =\n IsUnion<T & object> extends true ? _ValidatedToHaveNoConfigOverrideErrorsImpl<CollapseObjectUnion<T & object> | Exclude<T, object>>\n : T extends object ? (T extends any[] ? T : { [K in keyof T]+?: _ValidatedToHaveNoConfigOverrideErrorsImpl<T[K]> })\n : T;\nexport type ValidatedToHaveNoConfigOverrideErrors<T extends yup.AnySchema> = _ValidatedToHaveNoConfigOverrideErrorsImpl<yup.InferType<T>>;\ntypeAssertIs<_ValidatedToHaveNoConfigOverrideErrorsImpl<{ a: string } | { b: number } | boolean>, { a?: string, b?: number } | boolean>()();\ntypeAssertExtends<_ValidatedToHaveNoConfigOverrideErrorsImpl<\"abc\" | 123 | null>, \"abc\" | 123 | null>()();\ntypeAssertExtends<_ValidatedToHaveNoConfigOverrideErrorsImpl<{ a: { b: { c: string } | { d: number } } }>, { a?: { b?: { c?: string, d?: number } } }>()();\n\n/**\n * Checks whether there are any warnings in the incomplete config. A warning doesn't stop the config from being valid,\n * but may require action regardless.\n *\n * The DB can contain configs that are not valid according to this function, as long as they are valid according to\n * the getConfigOverrideErrors function. (This is necessary, because a changing base config may make an override invalid\n * that was previously valid.)\n */\nexport async function getIncompleteConfigWarnings<T extends yup.AnySchema>(schema: T, incompleteConfig: Config): Promise<Result<null, string>> {\n // every rendered config should also be a config override without errors (regardless of whether it has warnings or not)\n await assertNoConfigOverrideErrors(schema, incompleteConfig, { allowPropertiesThatCanNoLongerBeOverridden: true });\n\n let normalized: Config;\n try {\n normalized = normalize(incompleteConfig, { onDotIntoNull: \"empty-object\" });\n } catch (error) {\n if (error instanceof NormalizationError) {\n return Result.error(`Config is not normalizable. ` + error.message);\n }\n throw error;\n }\n\n // test the schema against the normalized config\n try {\n await schema.validate(normalized, {\n strict: true,\n context: {\n noUnknownPathPrefixes: [''],\n },\n });\n return Result.ok(null);\n } catch (error) {\n if (error instanceof yup.ValidationError) {\n return Result.error(error.message);\n }\n throw error;\n }\n}\nexport type ValidatedToHaveNoIncompleteConfigWarnings<T extends yup.AnySchema> = yup.InferType<T>;\n\n\n// Normalized overrides\n// ex.: { a?: { b?: number, c?: string }, d?: number }\ntype ProjectConfigNormalizedOverride = Expand<ValidatedToHaveNoConfigOverrideErrors<typeof projectConfigSchema>>;\ntype BranchConfigNormalizedOverride = Expand<ValidatedToHaveNoConfigOverrideErrors<typeof branchConfigSchema>>;\ntype EnvironmentConfigNormalizedOverride = Expand<ValidatedToHaveNoConfigOverrideErrors<typeof environmentConfigSchema>>;\ntype OrganizationConfigNormalizedOverride = Expand<ValidatedToHaveNoConfigOverrideErrors<typeof organizationConfigSchema>>;\n\n// Overrides\n// ex.: { a?: null | { b?: null | number, c: string }, d?: null | number, \"a.b\"?: number, \"a.c\"?: string }\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)\n// ex.: { a?: null | { b?: null | number, c?: string }, d?: null | number, \"a.b\"?: number, \"a.c\"?: string }\nexport type ProjectConfigOverrideOverride = ProjectConfigOverride;\nexport type BranchConfigOverrideOverride = BranchConfigOverride;\nexport type EnvironmentConfigOverrideOverride = EnvironmentConfigOverride;\nexport type OrganizationConfigOverrideOverride = OrganizationConfigOverride;\n\n// Incomplete configs\n// note that we infer these types from the override types, not from the schema types directly, as there is no guarantee\n// that all configs in the DB satisfy the schema (the only guarantee we make is that this once *used* to be true)\nexport type ProjectIncompleteConfig = Expand<ProjectConfigNormalizedOverride>;\nexport type BranchIncompleteConfig = Expand<ProjectIncompleteConfig & BranchConfigNormalizedOverride>;\nexport type EnvironmentIncompleteConfig = Expand<BranchIncompleteConfig & EnvironmentConfigNormalizedOverride>;\nexport type OrganizationIncompleteConfig = Expand<EnvironmentIncompleteConfig & OrganizationConfigNormalizedOverride>;\n\n// Rendered configs before defaults, normalization, and sanitization\ntype ProjectRenderedConfigBeforeDefaults = Omit<ProjectIncompleteConfig,\n | keyof BranchConfigNormalizedOverride\n | keyof EnvironmentConfigNormalizedOverride\n | keyof OrganizationConfigNormalizedOverride\n>;\ntype BranchRenderedConfigBeforeDefaults = Omit<BranchIncompleteConfig,\n | keyof EnvironmentConfigNormalizedOverride\n | keyof OrganizationConfigNormalizedOverride\n>;\ntype EnvironmentRenderedConfigBeforeDefaults = Omit<EnvironmentIncompleteConfig,\n | keyof OrganizationConfigNormalizedOverride\n>;\ntype OrganizationRenderedConfigBeforeDefaults = OrganizationIncompleteConfig;\n\n// Rendered configs before sanitization\ntype ProjectRenderedConfigBeforeSanitization = Expand<Awaited<ReturnType<typeof applyProjectDefaults<ProjectRenderedConfigBeforeDefaults>>>>;\ntype BranchRenderedConfigBeforeSanitization = Expand<Awaited<ReturnType<typeof applyBranchDefaults<BranchRenderedConfigBeforeDefaults>>>>;\ntype EnvironmentRenderedConfigBeforeSanitization = Expand<Awaited<ReturnType<typeof applyEnvironmentDefaults<EnvironmentRenderedConfigBeforeDefaults>>>>;\ntype OrganizationRenderedConfigBeforeSanitization = Expand<Awaited<ReturnType<typeof applyOrganizationDefaults>>>;\n\n// Rendered configs after defaults, normalization, and sanitization\nexport type ProjectRenderedConfig = Expand<Awaited<ReturnType<typeof sanitizeProjectConfig<ProjectRenderedConfigBeforeSanitization>>>>;\nexport type BranchRenderedConfig = Expand<Awaited<ReturnType<typeof sanitizeBranchConfig<BranchRenderedConfigBeforeSanitization>>>>;\nexport type EnvironmentRenderedConfig = Expand<Awaited<ReturnType<typeof sanitizeEnvironmentConfig<EnvironmentRenderedConfigBeforeSanitization>>>>;\nexport type OrganizationRenderedConfig = Expand<Awaited<ReturnType<typeof sanitizeOrganizationConfig>>>;\n\n\n// Type assertions (just to make sure the types are correct)\nconst __assertEmptyObjectIsValidProjectOverride: ProjectConfigOverride = {};\nconst __assertEmptyObjectIsValidBranchOverride: BranchConfigOverride = {};\nconst __assertEmptyObjectIsValidEnvironmentOverride: EnvironmentConfigOverride = {};\nconst __assertEmptyObjectIsValidOrganizationOverride: OrganizationConfigOverride = {};\ntypeAssertExtends<ProjectRenderedConfig, { \"sourceOfTruth\": any }>()();\ntypeAssertExtends<BranchRenderedConfig, { \"sourceOfTruth\": any }>()();\ntypeAssertExtends<EnvironmentRenderedConfig, { \"sourceOfTruth\": any }>()();\ntypeAssertExtends<OrganizationRenderedConfig, { \"sourceOfTruth\": any }>()();\ntypeAssert<BranchRenderedConfig extends { \"domains\": any } ? false : true>()();\ntypeAssert<EnvironmentRenderedConfig extends { \"domains\": any } ? false : true>()();\ntypeAssertExtends<OrganizationRenderedConfig, { \"domains\": any }>()();\n"],"mappings":"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","names":["key","schema"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/config/schema.ts"],"sourcesContent":["// TODO: rename this file to spaghetti.ts because that's the kind of code here\n\nimport * as yup from \"yup\";\nimport { DEFAULT_EMAIL_TEMPLATES, DEFAULT_EMAIL_THEMES, DEFAULT_EMAIL_THEME_ID } from \"../helpers/emails\";\nimport * as schemaFields from \"../schema-fields\";\nimport { offerSchema, userSpecifiedIdSchema, yupBoolean, yupDate, yupMixed, yupNever, yupNumber, yupObject, yupRecord, yupString, yupTuple, yupUnion } from \"../schema-fields\";\nimport { isShallowEqual } from \"../utils/arrays\";\nimport { SUPPORTED_CURRENCIES } from \"../utils/currencies\";\nimport { StackAssertionError } from \"../utils/errors\";\nimport { allProviders } from \"../utils/oauth\";\nimport { DeepFilterUndefined, DeepMerge, DeepRequiredOrUndefined, deleteKey, filterUndefined, get, has, isObjectLike, mapValues, set, typedAssign, typedFromEntries } from \"../utils/objects\";\nimport { Result } from \"../utils/results\";\nimport { CollapseObjectUnion, Expand, IntersectAll, IsUnion, typeAssert, typeAssertExtends, typeAssertIs } from \"../utils/types\";\nimport { Config, NormalizationError, NormalizesTo, assertNormalized, getInvalidConfigReason, normalize } from \"./format\";\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_:]+$/;\ndeclare module \"yup\" {\n // eslint-disable-next-line @typescript-eslint/consistent-type-definitions\n export interface CustomSchemaMetadata {\n stackConfigCanNoLongerBeOverridden?: true,\n }\n}\n\nfunction canNoLongerBeOverridden<T extends yup.AnyObjectSchema, K extends string[]>(schema: T, keys: K): yup.Schema<Omit<yup.InferType<T>, K[number]>, T['__context'], Omit<T['__default'], K[number]>, T['__flags']> {\n const notOmitted = schema.concat(yupObject(\n Object.fromEntries(keys.map(key => [key, schema.getNested(key).meta({ stackConfigCanNoLongerBeOverridden: true })]))\n ));\n return notOmitted as any;\n}\n\n/**\n * All fields that can be overridden at this level.\n */\nexport const projectConfigSchema = yupObject({\n sourceOfTruth: yupUnion(\n yupObject({\n type: yupString().oneOf(['hosted']).defined(),\n }),\n yupObject({\n type: yupString().oneOf(['neon']).defined(),\n connectionStrings: yupRecord(\n yupString().defined(),\n yupString().defined(),\n ).defined(),\n }),\n yupObject({\n type: yupString().oneOf(['postgres']).defined(),\n connectionString: yupString().defined()\n }),\n ),\n});\n\n// --- NEW RBAC Schema ---\nconst branchRbacDefaultPermissions = yupRecord(\n yupString().matches(permissionRegex),\n yupBoolean().isTrue().optional(),\n);\n\nconst branchRbacSchema = yupObject({\n permissions: yupRecord(\n yupString().matches(customPermissionRegex),\n yupObject({\n description: yupString().optional(),\n scope: yupString().oneOf(['team', 'project']).optional(),\n containedPermissionIds: yupRecord(\n yupString().matches(permissionRegex),\n yupBoolean().isTrue().optional()\n ).optional(),\n }).optional(),\n ),\n defaultPermissions: yupObject({\n teamCreator: branchRbacDefaultPermissions,\n teamMember: branchRbacDefaultPermissions,\n signUp: branchRbacDefaultPermissions,\n }),\n});\n// --- END NEW RBAC Schema ---\n\n// --- NEW API Keys Schema ---\nconst branchApiKeysSchema = yupObject({\n enabled: yupObject({\n team: yupBoolean(),\n user: yupBoolean(),\n }),\n});\n// --- END NEW API Keys Schema ---\n\n\nconst branchAuthSchema = yupObject({\n allowSignUp: yupBoolean(),\n password: yupObject({\n allowSignIn: yupBoolean(),\n }),\n otp: yupObject({\n allowSignIn: yupBoolean(),\n }),\n passkey: yupObject({\n allowSignIn: yupBoolean(),\n }),\n oauth: yupObject({\n accountMergeStrategy: yupString().oneOf(['link_method', 'raise_error', 'allow_duplicates']).optional(),\n providers: yupRecord(\n yupString().matches(permissionRegex),\n yupObject({\n type: yupString().oneOf(allProviders).optional(),\n allowSignIn: yupBoolean(),\n allowConnectedAccounts: yupBoolean(),\n }),\n ),\n }),\n});\n\nexport const branchPaymentsSchema = yupObject({\n stripeAccountId: yupString().optional(),\n stripeAccountSetupComplete: yupBoolean().optional(),\n autoPay: yupObject({\n interval: schemaFields.dayIntervalSchema,\n }).optional(),\n exclusivityGroups: yupRecord(\n userSpecifiedIdSchema(\"exclusivityGroupId\"),\n yupRecord(\n userSpecifiedIdSchema(\"offerId\"),\n yupBoolean().isTrue(),\n ),\n ),\n offers: yupRecord(\n userSpecifiedIdSchema(\"offerId\"),\n offerSchema,\n ),\n items: yupRecord(\n userSpecifiedIdSchema(\"itemId\"),\n yupObject({\n displayName: yupString().optional(),\n customerType: schemaFields.customerTypeSchema,\n default: yupObject({\n quantity: yupNumber(),\n repeat: schemaFields.dayIntervalOrNeverSchema.optional(),\n expires: yupString().oneOf(['never', 'when-repeated']).optional(),\n }).default({\n quantity: 0,\n }),\n }),\n ),\n});\n\nconst branchDomain = yupObject({\n allowLocalhost: yupBoolean(),\n});\n\nexport const branchConfigSchema = canNoLongerBeOverridden(projectConfigSchema, [\"sourceOfTruth\"]).concat(yupObject({\n rbac: branchRbacSchema,\n\n teams: yupObject({\n createPersonalTeamOnSignUp: yupBoolean(),\n allowClientTeamCreation: yupBoolean(),\n }),\n\n users: yupObject({\n allowClientUserDeletion: yupBoolean(),\n }),\n\n apiKeys: branchApiKeysSchema,\n\n domains: branchDomain,\n\n auth: branchAuthSchema,\n\n emails: yupObject({\n selectedThemeId: schemaFields.emailThemeSchema,\n themes: schemaFields.emailThemeListSchema,\n templates: schemaFields.emailTemplateListSchema,\n }),\n\n payments: branchPaymentsSchema,\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().matches(permissionRegex),\n yupObject({\n type: yupString().oneOf(allProviders).optional(),\n isShared: yupBoolean(),\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 ),\n })),\n })),\n\n emails: branchConfigSchema.getNested(\"emails\").concat(yupObject({\n server: yupObject({\n isShared: yupBoolean(),\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 })),\n\n domains: branchConfigSchema.getNested(\"domains\").concat(yupObject({\n trustedDomains: yupRecord(\n userSpecifiedIdSchema(\"trustedDomainId\"),\n yupObject({\n baseUrl: schemaFields.urlSchema,\n handlerPath: schemaFields.handlerPathSchema,\n }),\n ),\n })),\n}));\n\nexport const organizationConfigSchema = environmentConfigSchema.concat(yupObject({}));\n\n\n// Migration functions\n//\n// These are used to migrate old config overrides to the new format on the database.\n//\n// THEY SHOULD NOT BE USED FOR ANY OTHER PURPOSE. They should not be used for default values. They should not be used\n// for sanitization. Instead, use the applicable functions for that.\n//\n// We run these migrations over the database when we do a big migration. USE THESE SPARINGLY. USE OTHER METHODS WHENEVER\n// POSSIBLE.\n//\n// The result of this function should be reproducible, and should not contain ANY randomness/non-determinism.\nexport function migrateConfigOverride(type: \"project\" | \"branch\" | \"environment\" | \"organization\", oldUnmigratedConfigOverride: any): any {\n const isBranchOrHigher = [\"branch\", \"environment\", \"organization\"].includes(type);\n const isEnvironmentOrHigher = [\"environment\", \"organization\"].includes(type);\n\n let res = oldUnmigratedConfigOverride;\n\n // BEGIN 2025-07-28: emails.theme is now emails.selectedThemeId\n if (isBranchOrHigher) {\n res = renameProperty(res, \"emails.theme\", \"emails.selectedThemeId\");\n }\n // END\n\n // BEGIN 2025-07-28: domains.trustedDomains can no longer be an array\n if (isEnvironmentOrHigher) {\n res = mapProperty(res, \"domains.trustedDomains\", (value) => {\n if (Array.isArray(value)) {\n return typedFromEntries(value.map((v, i) => [`${i}`, v]));\n }\n return value;\n });\n }\n // END\n\n // BEGIN 2025-07-28: themeList and templateList have been renamed (this was before the email release, so they're safe to remove)\n if (isBranchOrHigher) {\n res = removeProperty(res, \"emails.themeList\");\n res = removeProperty(res, \"emails.templateList\");\n }\n // END\n\n // BEGIN 2025-07-28: sourceOfTruth was mistakenly written to the environment config in some cases, so let's remove it\n if (type === \"environment\") {\n res = removeProperty(res, \"sourceOfTruth\");\n }\n // END\n\n // return the result\n return res;\n};\n\nfunction removeProperty(obj: any, path: string): any {\n return mapProperty(obj, path, () => undefined);\n}\n\nfunction mapProperty(obj: any, path: string, mapper: (value: any) => any): any {\n const keyParts = path.split(\".\");\n\n for (let i = 0; i < keyParts.length; i++) {\n const pathPrefix = keyParts.slice(0, i).join(\".\");\n const pathSuffix = keyParts.slice(i).join(\".\");\n if (has(obj, pathPrefix) && isObjectLike(get(obj, pathPrefix))) {\n const newValue = mapProperty(get(obj, pathPrefix), pathSuffix, mapper);\n set(obj, pathPrefix, newValue);\n }\n }\n if (has(obj, path)) {\n const newValue = mapper(get(obj, path));\n if (newValue !== undefined) {\n set(obj, path, newValue);\n } else {\n deleteKey(obj, path);\n }\n }\n\n return obj;\n}\nundefined?.test(\"mapProperty - basic property mapping\", ({ expect }) => {\n expect(mapProperty({ a: { b: { c: 1 } } }, \"a.b.c\", (value) => value + 1)).toEqual({ a: { b: { c: 2 } } });\n expect(mapProperty({ a: { b: { c: 1 } } }, \"a.b.d\", (value) => value + 1)).toEqual({ a: { b: { c: 1 } } });\n expect(mapProperty({ x: 5 }, \"x\", (value) => value * 2)).toEqual({ x: 10 });\n expect(mapProperty({ a: { b: { c: 1 } } }, \"b.c\", (value) => value * 10)).toEqual({ a: { b: { c: 1 } } });\n expect(mapProperty({ a: 1 }, \"b.c\", (value) => value)).toEqual({ a: 1 });\n});\n\nfunction renameProperty(obj: any, oldPath: string, newPath: string): any {\n const oldKeyParts = oldPath.split(\".\");\n const newKeyParts = newPath.split(\".\");\n if (!isShallowEqual(oldKeyParts.slice(0, -1), newKeyParts.slice(0, -1))) throw new StackAssertionError(`oldPath and newPath must have the same prefix. Provided: ${oldPath} and ${newPath}`);\n\n for (let i = 0; i < oldKeyParts.length; i++) {\n const pathPrefix = oldKeyParts.slice(0, i).join(\".\");\n const oldPathSuffix = oldKeyParts.slice(i).join(\".\");\n const newPathSuffix = newKeyParts.slice(i).join(\".\");\n if (has(obj, pathPrefix) && isObjectLike(get(obj, pathPrefix))) {\n set(obj, pathPrefix, renameProperty(get(obj, pathPrefix), oldPathSuffix, newPathSuffix));\n }\n }\n if (has(obj, oldPath)) {\n set(obj, newPath, get(obj, oldPath));\n deleteKey(obj, oldPath);\n }\n\n return obj;\n}\nundefined?.test(\"renameProperty\", ({ expect }) => {\n // Basic\n expect(renameProperty({ a: 1 }, \"a\", \"b\")).toEqual({ b: 1 });\n expect(renameProperty({ b: { c: 1 } }, \"b.c\", \"b.d\")).toEqual({ b: { d: 1 } });\n expect(renameProperty({ a: { b: { c: 1 } } }, \"a.b.c\", \"a.b.d\")).toEqual({ a: { b: { d: 1 } } });\n expect(renameProperty({ a: { b: { c: 1 } } }, \"a.b.c.d\", \"a.b.c.e\")).toEqual({ a: { b: { c: 1 } } });\n\n // Errors\n expect(() => renameProperty({ a: 1 }, \"a\", \"b.c\")).toThrow();\n});\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// To make sure you don't accidentally forget setting a default value, you must explicitly set fields with no default value to `undefined`.\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.\nconst projectConfigDefaults = {\n sourceOfTruth: {\n type: 'hosted',\n connectionStrings: undefined,\n connectionString: undefined,\n },\n} as const satisfies DefaultsType<ProjectRenderedConfigBeforeDefaults, []>;\n\nconst branchConfigDefaults = {} as const satisfies DefaultsType<BranchRenderedConfigBeforeDefaults, [typeof projectConfigDefaults]>;\n\nconst environmentConfigDefaults = {} as const satisfies DefaultsType<EnvironmentRenderedConfigBeforeDefaults, [typeof branchConfigDefaults, typeof projectConfigDefaults]>;\n\nconst organizationConfigDefaults = {\n rbac: {\n permissions: (key: string) => ({\n containedPermissionIds: (key: string) => undefined,\n description: undefined,\n scope: undefined,\n }),\n defaultPermissions: {\n teamCreator: (key: string) => undefined,\n teamMember: (key: string) => undefined,\n signUp: (key: string) => undefined,\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 baseUrl: undefined,\n handlerPath: '/handler',\n }) as const,\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 type: undefined,\n isShared: true,\n allowSignIn: false,\n allowConnectedAccounts: false,\n clientId: undefined,\n clientSecret: undefined,\n facebookConfigId: undefined,\n microsoftTenantId: undefined,\n }),\n },\n },\n\n emails: {\n server: {\n isShared: true,\n host: undefined,\n port: undefined,\n username: undefined,\n password: undefined,\n senderName: undefined,\n senderEmail: undefined,\n },\n selectedThemeId: DEFAULT_EMAIL_THEME_ID,\n themes: typedAssign((key: string) => ({\n displayName: \"Unnamed Theme\",\n tsxSource: \"Error: Theme config is missing TypeScript source code.\",\n }), DEFAULT_EMAIL_THEMES),\n templates: typedAssign((key: string) => ({\n displayName: \"Unnamed Template\",\n tsxSource: \"Error: Template config is missing TypeScript source code.\",\n themeId: undefined,\n }), DEFAULT_EMAIL_TEMPLATES),\n },\n\n payments: {\n stripeAccountId: undefined,\n stripeAccountSetupComplete: false,\n autoPay: undefined,\n exclusivityGroups: (key: string) => (key: string) => undefined,\n offers: (key: string) => ({\n displayName: key,\n customerType: undefined,\n freeTrial: undefined,\n serverOnly: false,\n stackable: undefined,\n prices: (key: string) => ({\n ...typedFromEntries(SUPPORTED_CURRENCIES.map(currency => [currency.code, undefined])),\n interval: undefined,\n serverOnly: false,\n freeTrial: undefined,\n }),\n includedItems: (key: string) => ({\n quantity: undefined,\n repeat: \"never\",\n expires: \"when-repeated\",\n }),\n } as const),\n items: (key: string) => ({\n displayName: key,\n default: {\n quantity: 0,\n expires: \"when-repeated\",\n repeat: \"never\",\n },\n } as const),\n },\n} as const satisfies DefaultsType<OrganizationRenderedConfigBeforeDefaults, [typeof environmentConfigDefaults, typeof branchConfigDefaults, typeof projectConfigDefaults]>;\n\ntype _DeepOmitDefaultsImpl<T, U> = T extends object ? (\n (\n & /* keys that are both in T and U, *and* the key's value in U is not a subtype of the key's value in T */ { [K in { [Ki in keyof T & keyof U]: U[Ki] extends T[Ki] ? never : Ki }[keyof T & keyof U]]: DeepOmitDefaults<T[K], U[K] & object> }\n & /* keys that are in T but not in U */ { [K in Exclude<keyof T, keyof U>]: T[K] }\n )\n) : T;\ntype DeepOmitDefaults<T, U> = _DeepOmitDefaultsImpl<DeepFilterUndefined<T>, U>;\ntype DefaultsType<T, U extends any[]> = DeepReplaceAllowFunctionsForObjects<DeepOmitDefaults<DeepRequiredOrUndefined<T>, IntersectAll<{ [K in keyof U]: DeepReplaceFunctionsWithObjects<U[K]> }>>>;\ntypeAssertIs<DefaultsType<{ a: { b: Record<string, 123>, c: 456 } }, [{ a: { c: 456 } }]>, { a: { b: ((key: string) => 123) | Record<string, 123 | undefined> & ((key: string) => 123) } }>()();\n\ntype DeepReplaceAllowFunctionsForObjects<T> = T extends object\n ? (\n string extends keyof T\n ? ((arg: Exclude<keyof T, number>) => DeepReplaceAllowFunctionsForObjects<T[keyof T]>) & ({ [K in keyof T]?: DeepReplaceAllowFunctionsForObjects<T[K]> } | {})\n : { [K in keyof T]: DeepReplaceAllowFunctionsForObjects<T[K]> }\n )\n :\n T;\ntype ReplaceFunctionsWithObjects<T> = T & (T extends (arg: infer K extends string) => infer R ? Record<K, R> & object : unknown);\ntype DeepReplaceFunctionsWithObjects<T> = T extends object ? { [K in keyof ReplaceFunctionsWithObjects<T>]: DeepReplaceFunctionsWithObjects<ReplaceFunctionsWithObjects<T>[K]> } : T;\ntypeAssertIs<DeepReplaceFunctionsWithObjects<{ a: { b: 123 } & ((key: string) => number) }>, { a: { b: 123, [key: string]: number } }>()();\n\nfunction deepReplaceFunctionsWithObjects(obj: any): any {\n return mapValues({ ...obj }, v => (isObjectLike(v) ? deepReplaceFunctionsWithObjects(v as any) : v));\n}\nundefined?.test(\"deepReplaceFunctionsWithObjects\", ({ expect }) => {\n expect(deepReplaceFunctionsWithObjects(() => { })).toEqual({});\n expect(deepReplaceFunctionsWithObjects({ a: 3 })).toEqual({ a: 3 });\n expect(deepReplaceFunctionsWithObjects({ a: () => ({ b: 1 }) })).toEqual({ a: {} });\n expect(deepReplaceFunctionsWithObjects({ a: typedAssign(() => ({}), { b: { c: 1 } }) })).toEqual({ a: { b: { c: 1 } } });\n});\n\ntype ApplyDefaults<D extends object | ((key: string) => unknown), C extends object> = {} extends D ? C : DeepMerge<DeepReplaceFunctionsWithObjects<D>, C>; // the {} extends D makes TypeScript not recurse if the defaults are empty, hence allowing us more recursion until \"type instantiation too deep\" kicks in... it's a total hack, but it works, so hey?\nfunction applyDefaults<D extends object | ((key: string) => unknown), C extends object>(defaults: D, config: C): ApplyDefaults<D, C> {\n const res: any = deepReplaceFunctionsWithObjects(defaults);\n\n outer: for (const [key, mergeValue] of Object.entries(config)) {\n if (mergeValue === undefined) continue;\n const keyParts = key.split(\".\");\n let baseValue: any = defaults;\n let currentRes: any = res;\n for (const [index, part] of keyParts.entries()) {\n baseValue = has(baseValue, part) ? get(baseValue, part) : (typeof baseValue === 'function' ? (baseValue as any)(part) : undefined);\n if (baseValue === undefined || !isObjectLike(baseValue)) {\n set(res, key, mergeValue);\n continue outer;\n }\n if (!has(currentRes, part)) set(currentRes, part, deepReplaceFunctionsWithObjects(baseValue) as never);\n currentRes = get(currentRes, part);\n }\n set(res, key, isObjectLike(mergeValue) ? applyDefaults(baseValue, mergeValue) : mergeValue);\n }\n return res as any;\n}\nundefined?.test(\"applyDefaults\", ({ expect }) => {\n // Basic\n expect(applyDefaults({ a: 1 }, { a: 2 })).toEqual({ a: 2 });\n expect(applyDefaults({}, { a: 1 })).toEqual({ a: 1 });\n expect(applyDefaults({ a: { b: 1 } }, { a: { b: 2 } })).toEqual({ a: { b: 2 } });\n expect(applyDefaults({ a: { b: 1 } }, { a: { c: 2 } })).toEqual({ a: { b: 1, c: 2 } });\n expect(applyDefaults({ a: { b: { c: 1, d: 2 } } }, { a: { b: { d: 3, e: 4 } } })).toEqual({ a: { b: { c: 1, d: 3, e: 4 } } });\n\n // Functions\n expect(applyDefaults((key: string) => ({ b: key }), { a: {} })).toEqual({ a: { b: \"a\" } });\n expect(applyDefaults((key1: string) => (key2: string) => ({ a: key1, b: key2 }), { c: { d: {} } })).toEqual({ c: { d: { a: \"c\", b: \"d\" } } });\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 expect(applyDefaults(typedAssign(() => ({ b: 1 }), { a: { b: 1, c: 2 } }), { a: {} })).toEqual({ a: { b: 1, c: 2 } });\n expect(applyDefaults(typedAssign(() => ({ b: 1 }), { a: { b: 1, c: 2 } }), { d: {} })).toEqual({ a: { b: 1, c: 2 }, d: { b: 1 } });\n\n // Dot notation\n expect(applyDefaults({ a: { b: 1 } }, { \"a.c\": 2 })).toEqual({ a: { b: 1 }, \"a.c\": 2 });\n expect(applyDefaults({ a: 1 }, { \"a.b\": 2 })).toEqual({ a: 1, \"a.b\": 2 });\n expect(applyDefaults({ a: null }, { \"a.b\": 2 })).toEqual({ a: null, \"a.b\": 2 });\n expect(applyDefaults({ a: { b: { c: 1 } } }, { \"a.b\": { d: 2 } })).toEqual({ a: { b: { c: 1 } }, \"a.b\": { c: 1, d: 2 } });\n expect(applyDefaults({ a: { b: { c: { d: 1 } } } }, { \"a.b.c\": {} })).toEqual({ a: { b: { c: { d: 1 } } }, \"a.b.c\": { d: 1 } });\n expect(applyDefaults({ a: () => ({ c: 1 }) }, { \"a.b\": { d: 2 } })).toEqual({ a: { b: { c: 1 } }, \"a.b\": { c: 1, d: 2 } });\n expect(applyDefaults({ a: () => () => ({ d: 1 }) }, { \"a.b.c\": {} })).toEqual({ a: { b: { c: { d: 1 } } }, \"a.b.c\": { d: 1 } });\n expect(applyDefaults({ a: { b: () => ({ c: 1, d: 2 }) } }, { \"a.b.x-y.c\": 3 })).toEqual({ a: { b: { \"x-y\": { c: 1, d: 2 } } }, \"a.b.x-y.c\": 3 });\n});\n\nexport function applyProjectDefaults<T extends ProjectRenderedConfigBeforeDefaults>(config: T) {\n return applyDefaults(projectConfigDefaults, config);\n}\n\nexport function applyBranchDefaults<T extends BranchRenderedConfigBeforeDefaults>(config: T) {\n return applyDefaults(\n branchConfigDefaults,\n applyDefaults(\n projectConfigDefaults,\n config\n )\n );\n}\n\nexport function applyEnvironmentDefaults<T extends EnvironmentRenderedConfigBeforeDefaults>(config: T): ApplyDefaults<typeof environmentConfigDefaults, ApplyDefaults<typeof branchConfigDefaults, ApplyDefaults<typeof projectConfigDefaults, T>>> {\n return applyDefaults(\n environmentConfigDefaults,\n applyDefaults(\n branchConfigDefaults,\n applyDefaults(\n projectConfigDefaults,\n config\n ) as any\n ) as any\n ) as any;\n}\n\nexport function applyOrganizationDefaults(config: OrganizationRenderedConfigBeforeDefaults): ApplyDefaults<typeof organizationConfigDefaults, ApplyDefaults<typeof environmentConfigDefaults, ApplyDefaults<typeof branchConfigDefaults, ApplyDefaults<typeof projectConfigDefaults, OrganizationRenderedConfigBeforeDefaults>>>> {\n return applyDefaults(\n organizationConfigDefaults,\n applyDefaults(\n environmentConfigDefaults,\n applyDefaults(\n branchConfigDefaults,\n applyDefaults(\n projectConfigDefaults,\n config\n ) as any\n ) as any\n ) as any\n ) as any;\n}\n\n\nexport async function sanitizeProjectConfig<T extends ProjectRenderedConfigBeforeSanitization>(config: T) {\n assertNormalized(config);\n const oldSourceOfTruth = config.sourceOfTruth;\n const sourceOfTruth =\n oldSourceOfTruth.type === 'neon' && typeof oldSourceOfTruth.connectionStrings === 'object' ? {\n type: 'neon',\n connectionStrings: { ...filterUndefined(oldSourceOfTruth.connectionStrings) as Record<string, string> }\n } as const\n : oldSourceOfTruth.type === 'postgres' && typeof oldSourceOfTruth.connectionString === 'string' ? {\n type: 'postgres',\n connectionString: oldSourceOfTruth.connectionString,\n } as const\n : {\n type: 'hosted',\n } as const;\n\n return {\n ...config,\n sourceOfTruth,\n };\n}\n\nexport async function sanitizeBranchConfig<T extends BranchRenderedConfigBeforeSanitization>(config: T) {\n assertNormalized(config);\n const prepared = await sanitizeProjectConfig(config);\n return {\n ...prepared,\n };\n}\n\nexport async function sanitizeEnvironmentConfig<T extends EnvironmentRenderedConfigBeforeSanitization>(config: T) {\n assertNormalized(config);\n const prepared = await sanitizeBranchConfig(config);\n return {\n ...prepared,\n };\n}\n\nexport async function sanitizeOrganizationConfig(config: OrganizationRenderedConfigBeforeSanitization) {\n assertNormalized(config);\n const prepared = await sanitizeEnvironmentConfig(config);\n const themes: typeof prepared.emails.themes = {\n ...DEFAULT_EMAIL_THEMES,\n ...prepared.emails.themes,\n };\n const templates: typeof prepared.emails.templates = {\n ...DEFAULT_EMAIL_TEMPLATES,\n ...prepared.emails.templates,\n };\n return {\n ...prepared,\n emails: {\n ...prepared.emails,\n selectedThemeId: has(themes, prepared.emails.selectedThemeId) ? prepared.emails.selectedThemeId : DEFAULT_EMAIL_THEME_ID,\n themes,\n templates,\n },\n };\n}\n\n/**\n * Does not require a base config, and hence solely relies on the override itself to validate the config. If it returns\n * no error, you know that the\n *\n * It's crucial that our DB never contains any configs that are not valid according to this function, as this would mean\n * that the config object does not satisfy the ValidatedToHaveNoConfigOverrideErrors type (which is used as an assumption\n * in a whole bunch of places in the code).\n */\nexport async function getConfigOverrideErrors<T extends yup.AnySchema>(schema: T, configOverride: unknown, options: { allowPropertiesThatCanNoLongerBeOverridden?: boolean } = {}): Promise<Result<null, string>> {\n // currently, we go over the schema and ensure that the general requirements for each property are satisfied\n // importantly, we cannot check any cross-property constraints, as those may change depending on the base config\n // also, since overrides can be empty, we cannot have any required properties (TODO: can we have required properties in nested objects? would that even make sense? think about it)\n if (typeof configOverride !== \"object\" || configOverride === null) {\n return Result.error(\"Config override must be a non-null object.\");\n }\n if (Object.getPrototypeOf(configOverride) !== Object.getPrototypeOf({})) {\n return Result.error(\"Config override must be plain old JavaScript object.\");\n }\n // Check config format\n const reason = getInvalidConfigReason(configOverride, { configName: 'override' });\n if (reason) return Result.error(\"Invalid config format: \" + reason);\n\n const getSubSchema = (schema: yup.AnySchema, key: string): yup.AnySchema | undefined => {\n const keyParts = key.split(\".\");\n if (!schema.hasNested(keyParts[0])) {\n return undefined;\n }\n const nestedSchema = schema.getNested(keyParts[0]);\n if (nestedSchema.meta()?.stackConfigCanNoLongerBeOverridden && !options.allowPropertiesThatCanNoLongerBeOverridden) {\n return undefined;\n }\n if (keyParts.length === 1) {\n return nestedSchema;\n } else {\n return getSubSchema(nestedSchema, keyParts.slice(1).join(\".\"));\n }\n };\n\n const getRestrictedSchemaBase = (path: string, schema: yup.AnySchema): yup.AnySchema => {\n const schemaInfo = schema.meta()?.stackSchemaInfo;\n switch (schemaInfo?.type) {\n case \"string\": {\n const stringSchema = schema as yup.StringSchema<any>;\n const description = stringSchema.describe();\n let res = yupString();\n if (description.tests.some(t => t.name === \"uuid\")) {\n res = res.uuid();\n }\n return res;\n }\n case \"number\": {\n return yupNumber();\n }\n case \"boolean\": {\n return yupBoolean();\n }\n case \"date\": {\n return yupDate();\n }\n case \"mixed\": {\n return yupMixed();\n }\n case \"array\": {\n throw new StackAssertionError(`Arrays are not supported in config JSON files (besides tuples). Use a record instead.`, { schemaInfo, schema });\n\n // This is how the implementation would look like, but we don't support arrays in config JSON files (besides tuples)\n // const arraySchema = schema as yup.ArraySchema<any, any, any, any>;\n // const innerType = arraySchema.innerType;\n // return yupArray(innerType ? getRestrictedSchema(path + \".[]\", innerType as any) : undefined);\n }\n case \"tuple\": {\n return yupTuple(schemaInfo.items.map((s, index) => getRestrictedSchema(path + `[${index}]`, s)) as any);\n }\n case \"union\": {\n const schemas = schemaInfo.items;\n const nonObjectSchemas = [...schemas.entries()].filter(([index, s]) => s.meta()?.stackSchemaInfo?.type !== \"object\");\n const objectSchemas = schemas.filter((s): s is yup.ObjectSchema<any> => s.meta()?.stackSchemaInfo?.type === \"object\");\n\n // merge all object schemas into a single schema\n const allObjectSchemaKeys = [...new Set(objectSchemas.flatMap(s => Object.keys(s.fields)))];\n const mergedObjectSchema = yupObject(\n Object.fromEntries(\n allObjectSchemaKeys.map(key => [key, yupUnion(\n ...objectSchemas.flatMap((s, index) => s.hasNested(key) ? [s.getNested(key)] : [])\n )])\n )\n );\n\n return yupUnion(\n ...nonObjectSchemas.map(([index, s]) => getRestrictedSchema(path + `|variant-${index}|`, s)),\n ...objectSchemas.length > 0 ? [getRestrictedSchema(path + (nonObjectSchemas.length > 0 ? `|variant|` : \"\"), mergedObjectSchema)] : [],\n );\n }\n case \"record\": {\n return yupRecord(getRestrictedSchema(path + \".key\", schemaInfo.keySchema) as any, getRestrictedSchema(path + \".value\", schemaInfo.valueSchema));\n }\n case \"object\": {\n const objectSchema = schema as yup.ObjectSchema<any>;\n return yupObject(\n Object.fromEntries(\n Object.entries(objectSchema.fields)\n .map(([key, value]) => [key, getRestrictedSchema(path + \".\" + key, value as any)])\n )\n );\n }\n case \"never\": {\n return yupNever();\n }\n default: {\n throw new StackAssertionError(`Unknown schema info at path ${path}: ${JSON.stringify(schemaInfo)}`, { schemaInfo, schema });\n }\n }\n };\n const getRestrictedSchema = (path: string, schema: yup.AnySchema): yup.AnySchema => {\n let restricted = getRestrictedSchemaBase(path, schema);\n restricted = restricted.nullable();\n const description = schema.describe();\n if (description.oneOf.length > 0) {\n restricted = restricted.oneOf(description.oneOf);\n }\n if (description.notOneOf.length > 0) {\n restricted = restricted.notOneOf(description.notOneOf);\n }\n return restricted;\n };\n\n for (const [key, value] of Object.entries(configOverride)) {\n if (value === undefined) continue;\n const subSchema = getSubSchema(schema, key);\n if (!subSchema) {\n return Result.error(`The key ${JSON.stringify(key)} is not valid for the schema.`);\n }\n let restrictedSchema = getRestrictedSchema(key, subSchema);\n try {\n await restrictedSchema.validate(value, {\n strict: true,\n ...{\n // Although `path` is not part of the yup types, it is actually recognized and does the correct thing\n path: key\n },\n context: {\n noUnknownPathPrefixes: [''],\n },\n });\n } catch (error) {\n if (error instanceof yup.ValidationError) {\n return Result.error(error.message);\n }\n throw error;\n }\n }\n return Result.ok(null);\n}\nexport async function assertNoConfigOverrideErrors<T extends yup.AnySchema>(schema: T, config: unknown, options: { allowPropertiesThatCanNoLongerBeOverridden?: boolean, extraInfo?: any } = {}): Promise<void> {\n const res = await getConfigOverrideErrors(schema, config, options);\n if (res.status === \"error\") throw new StackAssertionError(`Config override is invalid — at a place where it should have already been validated! ${res.error}`, { options, config, schema });\n}\ntype _ValidatedToHaveNoConfigOverrideErrorsImpl<T> =\n IsUnion<T & object> extends true ? _ValidatedToHaveNoConfigOverrideErrorsImpl<CollapseObjectUnion<T & object> | Exclude<T, object>>\n : T extends object ? (T extends any[] ? T : { [K in keyof T]+?: _ValidatedToHaveNoConfigOverrideErrorsImpl<T[K]> })\n : T;\nexport type ValidatedToHaveNoConfigOverrideErrors<T extends yup.AnySchema> = _ValidatedToHaveNoConfigOverrideErrorsImpl<yup.InferType<T>>;\ntypeAssertIs<_ValidatedToHaveNoConfigOverrideErrorsImpl<{ a: string } | { b: number } | boolean>, { a?: string, b?: number } | boolean>()();\ntypeAssertExtends<_ValidatedToHaveNoConfigOverrideErrorsImpl<\"abc\" | 123 | null>, \"abc\" | 123 | null>()();\ntypeAssertExtends<_ValidatedToHaveNoConfigOverrideErrorsImpl<{ a: { b: { c: string } | { d: number } } }>, { a?: { b?: { c?: string, d?: number } } }>()();\n\n/**\n * Checks whether there are any warnings in the incomplete config. A warning doesn't stop the config from being valid,\n * but may require action regardless.\n *\n * The DB can contain configs that are not valid according to this function, as long as they are valid according to\n * the getConfigOverrideErrors function. (This is necessary, because a changing base config may make an override invalid\n * that was previously valid.)\n */\nexport async function getIncompleteConfigWarnings<T extends yup.AnySchema>(schema: T, incompleteConfig: Config): Promise<Result<null, string>> {\n // every rendered config should also be a config override without errors (regardless of whether it has warnings or not)\n await assertNoConfigOverrideErrors(schema, incompleteConfig, { allowPropertiesThatCanNoLongerBeOverridden: true });\n\n let normalized: Config;\n try {\n normalized = normalize(incompleteConfig, { onDotIntoNull: \"empty-object\" });\n } catch (error) {\n if (error instanceof NormalizationError) {\n return Result.error(`Config is not normalizable. ` + error.message);\n }\n throw error;\n }\n\n // test the schema against the normalized config\n try {\n await schema.validate(normalized, {\n strict: true,\n context: {\n noUnknownPathPrefixes: [''],\n },\n });\n return Result.ok(null);\n } catch (error) {\n if (error instanceof yup.ValidationError) {\n return Result.error(error.message);\n }\n throw error;\n }\n}\nexport type ValidatedToHaveNoIncompleteConfigWarnings<T extends yup.AnySchema> = yup.InferType<T>;\n\n\n// Normalized overrides\n// ex.: { a?: { b?: number, c?: string }, d?: number }\ntype ProjectConfigNormalizedOverride = Expand<ValidatedToHaveNoConfigOverrideErrors<typeof projectConfigSchema>>;\ntype BranchConfigNormalizedOverride = Expand<ValidatedToHaveNoConfigOverrideErrors<typeof branchConfigSchema>>;\ntype EnvironmentConfigNormalizedOverride = Expand<ValidatedToHaveNoConfigOverrideErrors<typeof environmentConfigSchema>>;\ntype OrganizationConfigNormalizedOverride = Expand<ValidatedToHaveNoConfigOverrideErrors<typeof organizationConfigSchema>>;\n\n// Overrides\n// ex.: { a?: null | { b?: null | number, c: string }, d?: null | number, \"a.b\"?: number, \"a.c\"?: string }\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)\n// ex.: { a?: null | { b?: null | number, c?: string }, d?: null | number, \"a.b\"?: number, \"a.c\"?: string }\nexport type ProjectConfigOverrideOverride = ProjectConfigOverride;\nexport type BranchConfigOverrideOverride = BranchConfigOverride;\nexport type EnvironmentConfigOverrideOverride = EnvironmentConfigOverride;\nexport type OrganizationConfigOverrideOverride = OrganizationConfigOverride;\n\n// Incomplete configs\n// note that we infer these types from the override types, not from the schema types directly, as there is no guarantee\n// that all configs in the DB satisfy the schema (the only guarantee we make is that this once *used* to be true)\nexport type ProjectIncompleteConfig = Expand<ProjectConfigNormalizedOverride>;\nexport type BranchIncompleteConfig = Expand<ProjectIncompleteConfig & BranchConfigNormalizedOverride>;\nexport type EnvironmentIncompleteConfig = Expand<BranchIncompleteConfig & EnvironmentConfigNormalizedOverride>;\nexport type OrganizationIncompleteConfig = Expand<EnvironmentIncompleteConfig & OrganizationConfigNormalizedOverride>;\n\n// Rendered configs before defaults, normalization, and sanitization\ntype ProjectRenderedConfigBeforeDefaults = Omit<ProjectIncompleteConfig,\n | keyof BranchConfigNormalizedOverride\n | keyof EnvironmentConfigNormalizedOverride\n | keyof OrganizationConfigNormalizedOverride\n>;\ntype BranchRenderedConfigBeforeDefaults = Omit<BranchIncompleteConfig,\n | keyof EnvironmentConfigNormalizedOverride\n | keyof OrganizationConfigNormalizedOverride\n>;\ntype EnvironmentRenderedConfigBeforeDefaults = Omit<EnvironmentIncompleteConfig,\n | keyof OrganizationConfigNormalizedOverride\n>;\ntype OrganizationRenderedConfigBeforeDefaults = OrganizationIncompleteConfig;\n\n// Rendered configs before sanitization\ntype ProjectRenderedConfigBeforeSanitization = Expand<Awaited<ReturnType<typeof applyProjectDefaults<ProjectRenderedConfigBeforeDefaults>>>>;\ntype BranchRenderedConfigBeforeSanitization = Expand<Awaited<ReturnType<typeof applyBranchDefaults<BranchRenderedConfigBeforeDefaults>>>>;\ntype EnvironmentRenderedConfigBeforeSanitization = Expand<Awaited<ReturnType<typeof applyEnvironmentDefaults<EnvironmentRenderedConfigBeforeDefaults>>>>;\ntype OrganizationRenderedConfigBeforeSanitization = Expand<Awaited<ReturnType<typeof applyOrganizationDefaults>>>;\n\n// Rendered configs after defaults, normalization, and sanitization\nexport type ProjectRenderedConfig = Expand<Awaited<ReturnType<typeof sanitizeProjectConfig<ProjectRenderedConfigBeforeSanitization>>>>;\nexport type BranchRenderedConfig = Expand<Awaited<ReturnType<typeof sanitizeBranchConfig<BranchRenderedConfigBeforeSanitization>>>>;\nexport type EnvironmentRenderedConfig = Expand<Awaited<ReturnType<typeof sanitizeEnvironmentConfig<EnvironmentRenderedConfigBeforeSanitization>>>>;\nexport type OrganizationRenderedConfig = Expand<Awaited<ReturnType<typeof sanitizeOrganizationConfig>>>;\n\n// Complete config\nexport type CompleteConfig = OrganizationRenderedConfig;\n\n// Type assertions (just to make sure the types are correct)\nconst __assertEmptyObjectIsValidProjectOverride: ProjectConfigOverride = {};\nconst __assertEmptyObjectIsValidBranchOverride: BranchConfigOverride = {};\nconst __assertEmptyObjectIsValidEnvironmentOverride: EnvironmentConfigOverride = {};\nconst __assertEmptyObjectIsValidOrganizationOverride: OrganizationConfigOverride = {};\ntypeAssertExtends<ProjectRenderedConfig, { \"sourceOfTruth\": any }>()();\ntypeAssertExtends<BranchRenderedConfig, { \"sourceOfTruth\": any }>()();\ntypeAssertExtends<EnvironmentRenderedConfig, { \"sourceOfTruth\": any }>()();\ntypeAssertExtends<OrganizationRenderedConfig, { \"sourceOfTruth\": any }>()();\ntypeAssert<BranchRenderedConfig extends { \"domains\": any } ? false : true>()();\ntypeAssert<EnvironmentRenderedConfig extends { \"domains\": any } ? false : true>()();\ntypeAssertExtends<OrganizationRenderedConfig, { \"domains\": any }>()();\n"],"mappings":"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","names":["key","schema"]}
|
|
@@ -379,6 +379,68 @@ var StackAdminInterface = class extends StackServerInterface {
|
|
|
379
379
|
);
|
|
380
380
|
return await response.json();
|
|
381
381
|
}
|
|
382
|
+
async setupPayments() {
|
|
383
|
+
const response = await this.sendAdminRequest(
|
|
384
|
+
"/internal/payments/setup",
|
|
385
|
+
{
|
|
386
|
+
method: "POST",
|
|
387
|
+
headers: {
|
|
388
|
+
"content-type": "application/json"
|
|
389
|
+
},
|
|
390
|
+
body: JSON.stringify({})
|
|
391
|
+
},
|
|
392
|
+
null
|
|
393
|
+
);
|
|
394
|
+
return await response.json();
|
|
395
|
+
}
|
|
396
|
+
async createStripeWidgetAccountSession() {
|
|
397
|
+
const response = await this.sendAdminRequest(
|
|
398
|
+
"/internal/payments/stripe-widgets/account-session",
|
|
399
|
+
{
|
|
400
|
+
method: "POST",
|
|
401
|
+
headers: {
|
|
402
|
+
"content-type": "application/json"
|
|
403
|
+
},
|
|
404
|
+
body: JSON.stringify({})
|
|
405
|
+
},
|
|
406
|
+
null
|
|
407
|
+
);
|
|
408
|
+
return await response.json();
|
|
409
|
+
}
|
|
410
|
+
async createPurchaseUrl(options) {
|
|
411
|
+
const response = await this.sendAdminRequest(
|
|
412
|
+
"/payments/purchases/create-purchase-url",
|
|
413
|
+
{
|
|
414
|
+
method: "POST",
|
|
415
|
+
headers: {
|
|
416
|
+
"content-type": "application/json"
|
|
417
|
+
},
|
|
418
|
+
body: JSON.stringify(options)
|
|
419
|
+
},
|
|
420
|
+
null
|
|
421
|
+
);
|
|
422
|
+
const result = await response.json();
|
|
423
|
+
return result.url;
|
|
424
|
+
}
|
|
425
|
+
async createItemQuantityChange(options) {
|
|
426
|
+
const response = await this.sendAdminRequest(
|
|
427
|
+
`/payments/items/${options.customer_id}/${options.item_id}`,
|
|
428
|
+
{
|
|
429
|
+
method: "POST",
|
|
430
|
+
headers: {
|
|
431
|
+
"content-type": "application/json"
|
|
432
|
+
},
|
|
433
|
+
body: JSON.stringify({
|
|
434
|
+
quantity: options.quantity,
|
|
435
|
+
expires_at: options.expires_at,
|
|
436
|
+
description: options.description
|
|
437
|
+
})
|
|
438
|
+
},
|
|
439
|
+
null
|
|
440
|
+
);
|
|
441
|
+
const result = await response.json();
|
|
442
|
+
return result;
|
|
443
|
+
}
|
|
382
444
|
};
|
|
383
445
|
export {
|
|
384
446
|
StackAdminInterface
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/interface/admin-interface.ts"],"sourcesContent":["import { InternalSession } from \"../sessions\";\nimport { ConfigCrud, ConfigOverrideCrud } from \"./crud/config\";\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 ChatContent = Array<\n | { type: \"text\", text: string }\n | { type: \"tool-call\", toolName: string, toolCallId: string, args: any, argsText: string, result: any }\n>;\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 listInternalEmailTemplates(): Promise<{ id: string, display_name: string, theme_id?: string, tsx_source: string }[]> {\n const response = await this.sendAdminRequest(`/internal/email-templates`, {}, null);\n const result = await response.json() as { templates: { id: string, display_name: string, theme_id?: string, tsx_source: string }[] };\n return result.templates;\n }\n\n async listEmailThemes(): Promise<{ id: string, display_name: string }[]> {\n const response = await this.sendAdminRequest(`/internal/email-themes`, {}, null);\n const result = await response.json() as { themes: { id: string, display_name: string }[] };\n return result.themes;\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 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\n async sendChatMessage(\n threadId: string,\n contextType: \"email-theme\" | \"email-template\",\n messages: Array<{ role: string, content: any }>,\n abortSignal?: AbortSignal,\n ): Promise<{ content: ChatContent }> {\n const response = await this.sendAdminRequest(\n `/internal/ai-chat/${threadId}`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ context_type: contextType, messages }),\n signal: abortSignal,\n },\n null,\n );\n return await response.json();\n }\n\n async saveChatMessage(threadId: string, message: any): Promise<void> {\n await this.sendAdminRequest(\n `/internal/ai-chat/${threadId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ message }),\n },\n null,\n );\n }\n\n async listChatMessages(threadId: string): Promise<{ messages: Array<any> }> {\n const response = await this.sendAdminRequest(\n `/internal/ai-chat/${threadId}`,\n { method: \"GET\" },\n null,\n );\n return await response.json();\n }\n\n async renderEmailPreview(options: { themeId?: string | null | false, themeTsxSource?: string, templateId?: string, templateTsxSource?: 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_id: options.themeId,\n theme_tsx_source: options.themeTsxSource,\n template_id: options.templateId,\n template_tsx_source: options.templateTsxSource,\n }),\n }, null);\n return await response.json();\n }\n\n async createEmailTheme(displayName: string): Promise<{ id: string }> {\n const response = await this.sendAdminRequest(\n `/internal/email-themes`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n display_name: displayName,\n }),\n },\n null,\n );\n return await response.json();\n }\n\n async getEmailTheme(id: string): Promise<{ display_name: string, tsx_source: string }> {\n const response = await this.sendAdminRequest(\n `/internal/email-themes/${id}`,\n { method: \"GET\" },\n null,\n );\n return await response.json();\n }\n\n async updateEmailTheme(id: string, tsxSource: string): Promise<void> {\n await this.sendAdminRequest(\n `/internal/email-themes/${id}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n tsx_source: tsxSource,\n }),\n },\n null,\n );\n }\n\n async updateEmailTemplate(id: string, tsxSource: string, themeId: string | null | false): Promise<{ rendered_html: string }> {\n const response = await this.sendAdminRequest(\n `/internal/email-templates/${id}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ tsx_source: tsxSource, theme_id: themeId }),\n },\n null,\n );\n return await response.json();\n }\n\n async getConfig(): Promise<ConfigCrud[\"Admin\"][\"Read\"]> {\n const response = await this.sendAdminRequest(\n `/internal/config`,\n { method: \"GET\" },\n null,\n );\n return await response.json();\n }\n\n async updateConfig(data: { configOverride: any }): Promise<ConfigOverrideCrud[\"Admin\"][\"Read\"]> {\n const response = await this.sendAdminRequest(\n `/internal/config/override`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ config_override_string: JSON.stringify(data.configOverride) }),\n },\n null,\n );\n return await response.json();\n }\n async createEmailTemplate(displayName: string): Promise<{ id: string }> {\n const response = await this.sendAdminRequest(\n `/internal/email-templates`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n display_name: displayName,\n }),\n },\n null,\n );\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 { ConfigCrud, ConfigOverrideCrud } from \"./crud/config\";\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 ChatContent = Array<\n | { type: \"text\", text: string }\n | { type: \"tool-call\", toolName: string, toolCallId: string, args: any, argsText: string, result: any }\n>;\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 listInternalEmailTemplates(): Promise<{ id: string, display_name: string, theme_id?: string, tsx_source: string }[]> {\n const response = await this.sendAdminRequest(`/internal/email-templates`, {}, null);\n const result = await response.json() as { templates: { id: string, display_name: string, theme_id?: string, tsx_source: string }[] };\n return result.templates;\n }\n\n async listEmailThemes(): Promise<{ id: string, display_name: string }[]> {\n const response = await this.sendAdminRequest(`/internal/email-themes`, {}, null);\n const result = await response.json() as { themes: { id: string, display_name: string }[] };\n return result.themes;\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 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\n async sendChatMessage(\n threadId: string,\n contextType: \"email-theme\" | \"email-template\",\n messages: Array<{ role: string, content: any }>,\n abortSignal?: AbortSignal,\n ): Promise<{ content: ChatContent }> {\n const response = await this.sendAdminRequest(\n `/internal/ai-chat/${threadId}`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ context_type: contextType, messages }),\n signal: abortSignal,\n },\n null,\n );\n return await response.json();\n }\n\n async saveChatMessage(threadId: string, message: any): Promise<void> {\n await this.sendAdminRequest(\n `/internal/ai-chat/${threadId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ message }),\n },\n null,\n );\n }\n\n async listChatMessages(threadId: string): Promise<{ messages: Array<any> }> {\n const response = await this.sendAdminRequest(\n `/internal/ai-chat/${threadId}`,\n { method: \"GET\" },\n null,\n );\n return await response.json();\n }\n\n async renderEmailPreview(options: { themeId?: string | null | false, themeTsxSource?: string, templateId?: string, templateTsxSource?: 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_id: options.themeId,\n theme_tsx_source: options.themeTsxSource,\n template_id: options.templateId,\n template_tsx_source: options.templateTsxSource,\n }),\n }, null);\n return await response.json();\n }\n\n async createEmailTheme(displayName: string): Promise<{ id: string }> {\n const response = await this.sendAdminRequest(\n `/internal/email-themes`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n display_name: displayName,\n }),\n },\n null,\n );\n return await response.json();\n }\n\n async getEmailTheme(id: string): Promise<{ display_name: string, tsx_source: string }> {\n const response = await this.sendAdminRequest(\n `/internal/email-themes/${id}`,\n { method: \"GET\" },\n null,\n );\n return await response.json();\n }\n\n async updateEmailTheme(id: string, tsxSource: string): Promise<void> {\n await this.sendAdminRequest(\n `/internal/email-themes/${id}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n tsx_source: tsxSource,\n }),\n },\n null,\n );\n }\n\n async updateEmailTemplate(id: string, tsxSource: string, themeId: string | null | false): Promise<{ rendered_html: string }> {\n const response = await this.sendAdminRequest(\n `/internal/email-templates/${id}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ tsx_source: tsxSource, theme_id: themeId }),\n },\n null,\n );\n return await response.json();\n }\n\n async getConfig(): Promise<ConfigCrud[\"Admin\"][\"Read\"]> {\n const response = await this.sendAdminRequest(\n `/internal/config`,\n { method: \"GET\" },\n null,\n );\n return await response.json();\n }\n\n async updateConfig(data: { configOverride: any }): Promise<ConfigOverrideCrud[\"Admin\"][\"Read\"]> {\n const response = await this.sendAdminRequest(\n `/internal/config/override`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ config_override_string: JSON.stringify(data.configOverride) }),\n },\n null,\n );\n return await response.json();\n }\n async createEmailTemplate(displayName: string): Promise<{ id: string }> {\n const response = await this.sendAdminRequest(\n `/internal/email-templates`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n display_name: displayName,\n }),\n },\n null,\n );\n return await response.json();\n }\n\n async setupPayments(): Promise<{ url: string }> {\n const response = await this.sendAdminRequest(\n \"/internal/payments/setup\",\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 createStripeWidgetAccountSession(): Promise<{ client_secret: string }> {\n const response = await this.sendAdminRequest(\n \"/internal/payments/stripe-widgets/account-session\",\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 createPurchaseUrl(options: { customer_id: string, offer_id: string }): Promise<string> {\n const response = await this.sendAdminRequest(\n \"/payments/purchases/create-purchase-url\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(options),\n },\n null,\n );\n const result = await response.json() as { url: string };\n return result.url;\n }\n\n async createItemQuantityChange(options: { customer_id: string, item_id: string, quantity: number, expires_at?: string, description?: string }): Promise<{ id: string }> {\n const response = await this.sendAdminRequest(\n `/payments/items/${options.customer_id}/${options.item_id}`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n quantity: options.quantity,\n expires_at: options.expires_at,\n description: options.description,\n }),\n },\n null,\n );\n const result = await response.json() as { id: string };\n return result;\n }\n\n}\n"],"mappings":"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","names":[]}
|
|
@@ -55,8 +55,11 @@ var projectsCrudAdminReadSchema = yupObject({
|
|
|
55
55
|
id: schemaFields.projectIdSchema.defined(),
|
|
56
56
|
display_name: schemaFields.projectDisplayNameSchema.defined(),
|
|
57
57
|
description: schemaFields.projectDescriptionSchema.nonNullable().defined(),
|
|
58
|
+
logo_url: schemaFields.projectLogoUrlSchema.nullable().optional(),
|
|
59
|
+
full_logo_url: schemaFields.projectFullLogoUrlSchema.nullable().optional(),
|
|
58
60
|
created_at_millis: schemaFields.projectCreatedAtMillisSchema.defined(),
|
|
59
61
|
is_production_mode: schemaFields.projectIsProductionModeSchema.defined(),
|
|
62
|
+
owner_team_id: schemaFields.yupString().nullable().defined(),
|
|
60
63
|
/** @deprecated */
|
|
61
64
|
config: yupObject({
|
|
62
65
|
allow_localhost: schemaFields.projectAllowLocalhostSchema.defined(),
|
|
@@ -99,6 +102,8 @@ var projectsCrudClientReadSchema = yupObject({
|
|
|
99
102
|
var projectsCrudAdminUpdateSchema = yupObject({
|
|
100
103
|
display_name: schemaFields.projectDisplayNameSchema.optional(),
|
|
101
104
|
description: schemaFields.projectDescriptionSchema.optional(),
|
|
105
|
+
logo_url: schemaFields.projectLogoUrlSchema.nullable().optional(),
|
|
106
|
+
full_logo_url: schemaFields.projectFullLogoUrlSchema.nullable().optional(),
|
|
102
107
|
is_production_mode: schemaFields.projectIsProductionModeSchema.optional(),
|
|
103
108
|
config: yupObject({
|
|
104
109
|
sign_up_enabled: schemaFields.projectSignUpEnabledSchema.optional(),
|
|
@@ -122,7 +127,8 @@ var projectsCrudAdminUpdateSchema = yupObject({
|
|
|
122
127
|
}).optional().default(void 0)
|
|
123
128
|
}).defined();
|
|
124
129
|
var projectsCrudAdminCreateSchema = projectsCrudAdminUpdateSchema.concat(yupObject({
|
|
125
|
-
display_name: schemaFields.projectDisplayNameSchema.defined()
|
|
130
|
+
display_name: schemaFields.projectDisplayNameSchema.defined(),
|
|
131
|
+
owner_team_id: schemaFields.yupString().uuid().defined()
|
|
126
132
|
}).defined());
|
|
127
133
|
var projectsCrudAdminDeleteSchema = schemaFields.yupMixed();
|
|
128
134
|
var clientProjectsCrud = createCrud({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/interface/crud/projects.ts"],"sourcesContent":["import { CrudTypeOf, createCrud } from \"../../crud\";\nimport * as schemaFields from \"../../schema-fields\";\nimport { yupArray, yupObject, yupString } from \"../../schema-fields\";\n\nconst teamPermissionSchema = yupObject({\n id: yupString().defined(),\n}).defined();\n\nconst oauthProviderReadSchema = yupObject({\n provider_config_id: schemaFields.yupString().defined(),\n id: schemaFields.oauthIdSchema.defined(),\n type: schemaFields.oauthTypeSchema.defined(),\n client_id: schemaFields.yupDefinedAndNonEmptyWhen(\n schemaFields.oauthClientIdSchema,\n { type: 'standard' },\n ),\n client_secret: schemaFields.yupDefinedAndNonEmptyWhen(\n schemaFields.oauthClientSecretSchema,\n { type: 'standard' },\n ),\n\n // extra params\n facebook_config_id: schemaFields.oauthFacebookConfigIdSchema.optional(),\n microsoft_tenant_id: schemaFields.oauthMicrosoftTenantIdSchema.optional(),\n});\n\nconst oauthProviderWriteSchema = oauthProviderReadSchema.omit(['provider_config_id']);\n\nconst enabledOAuthProviderSchema = yupObject({\n id: schemaFields.oauthIdSchema.defined(),\n});\n\nexport const emailConfigSchema = yupObject({\n type: schemaFields.emailTypeSchema.defined(),\n host: schemaFields.yupDefinedAndNonEmptyWhen(schemaFields.emailHostSchema, {\n type: 'standard',\n }),\n port: schemaFields.yupDefinedWhen(schemaFields.emailPortSchema, {\n type: 'standard',\n }),\n username: schemaFields.yupDefinedAndNonEmptyWhen(schemaFields.emailUsernameSchema, {\n type: 'standard',\n }),\n password: schemaFields.yupDefinedAndNonEmptyWhen(schemaFields.emailPasswordSchema, {\n type: 'standard',\n }),\n sender_name: schemaFields.yupDefinedAndNonEmptyWhen(schemaFields.emailSenderNameSchema, {\n type: 'standard',\n }),\n sender_email: schemaFields.yupDefinedAndNonEmptyWhen(schemaFields.emailSenderEmailSchema, {\n type: 'standard',\n }),\n});\n\nexport const emailConfigWithoutPasswordSchema = emailConfigSchema.pick(['type', 'host', 'port', 'username', 'sender_name', 'sender_email']);\n\nconst domainSchema = yupObject({\n domain: schemaFields.urlSchema.defined()\n .matches(/^https?:\\/\\//, 'URL must start with http:// or https://')\n .meta({ openapiField: { description: 'URL. Must start with http:// or https://', exampleValue: 'https://example.com' } }),\n handler_path: schemaFields.handlerPathSchema.defined(),\n});\n\nexport const projectsCrudAdminReadSchema = yupObject({\n id: schemaFields.projectIdSchema.defined(),\n display_name: schemaFields.projectDisplayNameSchema.defined(),\n description: schemaFields.projectDescriptionSchema.nonNullable().defined(),\n created_at_millis: schemaFields.projectCreatedAtMillisSchema.defined(),\n is_production_mode: schemaFields.projectIsProductionModeSchema.defined(),\n /** @deprecated */\n config: yupObject({\n allow_localhost: schemaFields.projectAllowLocalhostSchema.defined(),\n sign_up_enabled: schemaFields.projectSignUpEnabledSchema.defined(),\n credential_enabled: schemaFields.projectCredentialEnabledSchema.defined(),\n magic_link_enabled: schemaFields.projectMagicLinkEnabledSchema.defined(),\n passkey_enabled: schemaFields.projectPasskeyEnabledSchema.defined(),\n // TODO: remove this\n client_team_creation_enabled: schemaFields.projectClientTeamCreationEnabledSchema.defined(),\n client_user_deletion_enabled: schemaFields.projectClientUserDeletionEnabledSchema.defined(),\n allow_user_api_keys: schemaFields.yupBoolean().defined(),\n allow_team_api_keys: schemaFields.yupBoolean().defined(),\n oauth_providers: yupArray(oauthProviderReadSchema.defined()).defined(),\n enabled_oauth_providers: yupArray(enabledOAuthProviderSchema.defined()).defined().meta({ openapiField: { hidden: true } }),\n domains: yupArray(domainSchema.defined()).defined(),\n email_config: emailConfigSchema.defined(),\n email_theme: schemaFields.emailThemeSchema.defined(),\n create_team_on_sign_up: schemaFields.projectCreateTeamOnSignUpSchema.defined(),\n team_creator_default_permissions: yupArray(teamPermissionSchema.defined()).defined(),\n team_member_default_permissions: yupArray(teamPermissionSchema.defined()).defined(),\n user_default_permissions: yupArray(teamPermissionSchema.defined()).defined(),\n oauth_account_merge_strategy: schemaFields.oauthAccountMergeStrategySchema.defined(),\n }).defined().meta({ openapiField: { hidden: true } }),\n}).defined();\n\nexport const projectsCrudClientReadSchema = yupObject({\n id: schemaFields.projectIdSchema.defined(),\n display_name: schemaFields.projectDisplayNameSchema.defined(),\n config: yupObject({\n sign_up_enabled: schemaFields.projectSignUpEnabledSchema.defined(),\n credential_enabled: schemaFields.projectCredentialEnabledSchema.defined(),\n magic_link_enabled: schemaFields.projectMagicLinkEnabledSchema.defined(),\n passkey_enabled: schemaFields.projectPasskeyEnabledSchema.defined(),\n client_team_creation_enabled: schemaFields.projectClientTeamCreationEnabledSchema.defined(),\n client_user_deletion_enabled: schemaFields.projectClientUserDeletionEnabledSchema.defined(),\n allow_user_api_keys: schemaFields.yupBoolean().defined(),\n allow_team_api_keys: schemaFields.yupBoolean().defined(),\n enabled_oauth_providers: yupArray(enabledOAuthProviderSchema.defined()).defined().meta({ openapiField: { hidden: true } }),\n }).defined().meta({ openapiField: { hidden: true } }),\n}).defined();\n\n\nexport const projectsCrudAdminUpdateSchema = yupObject({\n display_name: schemaFields.projectDisplayNameSchema.optional(),\n description: schemaFields.projectDescriptionSchema.optional(),\n is_production_mode: schemaFields.projectIsProductionModeSchema.optional(),\n config: yupObject({\n sign_up_enabled: schemaFields.projectSignUpEnabledSchema.optional(),\n credential_enabled: schemaFields.projectCredentialEnabledSchema.optional(),\n magic_link_enabled: schemaFields.projectMagicLinkEnabledSchema.optional(),\n passkey_enabled: schemaFields.projectPasskeyEnabledSchema.optional(),\n client_team_creation_enabled: schemaFields.projectClientTeamCreationEnabledSchema.optional(),\n client_user_deletion_enabled: schemaFields.projectClientUserDeletionEnabledSchema.optional(),\n allow_localhost: schemaFields.projectAllowLocalhostSchema.optional(),\n allow_user_api_keys: schemaFields.yupBoolean().optional(),\n allow_team_api_keys: schemaFields.yupBoolean().optional(),\n email_config: emailConfigSchema.optional().default(undefined),\n email_theme: schemaFields.emailThemeSchema.optional(),\n domains: yupArray(domainSchema.defined()).optional().default(undefined),\n oauth_providers: yupArray(oauthProviderWriteSchema.defined()).optional().default(undefined),\n create_team_on_sign_up: schemaFields.projectCreateTeamOnSignUpSchema.optional(),\n team_creator_default_permissions: yupArray(teamPermissionSchema.defined()).optional(),\n team_member_default_permissions: yupArray(teamPermissionSchema.defined()).optional(),\n user_default_permissions: yupArray(teamPermissionSchema.defined()).optional(),\n oauth_account_merge_strategy: schemaFields.oauthAccountMergeStrategySchema.optional(),\n }).optional().default(undefined),\n}).defined();\n\nexport const projectsCrudAdminCreateSchema = projectsCrudAdminUpdateSchema.concat(yupObject({\n display_name: schemaFields.projectDisplayNameSchema.defined(),\n}).defined());\n\nexport const projectsCrudAdminDeleteSchema = schemaFields.yupMixed();\n\nexport const clientProjectsCrud = createCrud({\n clientReadSchema: projectsCrudClientReadSchema,\n docs: {\n clientRead: {\n summary: 'Get the current project',\n description: 'Get the current project information including display name, OAuth providers and authentication methods. Useful for displaying the available login options to the user.',\n tags: ['Projects'],\n },\n },\n});\nexport type ClientProjectsCrud = CrudTypeOf<typeof clientProjectsCrud>;\n\nexport const projectsCrud = createCrud({\n adminReadSchema: projectsCrudAdminReadSchema,\n adminUpdateSchema: projectsCrudAdminUpdateSchema,\n adminDeleteSchema: projectsCrudAdminDeleteSchema,\n docs: {\n adminRead: {\n summary: 'Get the current project',\n description: 'Get the current project information and configuration including display name, OAuth providers, email configuration, etc.',\n tags: ['Projects'],\n },\n adminUpdate: {\n summary: 'Update the current project',\n description: 'Update the current project information and configuration including display name, OAuth providers, email configuration, etc.',\n tags: ['Projects'],\n },\n adminDelete: {\n summary: 'Delete the current project',\n description: 'Delete the current project and all associated data (including users, teams, API keys, project configs, etc.). Be careful, this action is irreversible.',\n tags: ['Projects'],\n },\n },\n});\nexport type ProjectsCrud = CrudTypeOf<typeof projectsCrud>;\n\nexport const adminUserProjectsCrud = createCrud({\n clientReadSchema: projectsCrudAdminReadSchema,\n clientCreateSchema: projectsCrudAdminCreateSchema,\n docs: {\n clientList: {\n hidden: true,\n },\n clientCreate: {\n hidden: true,\n },\n },\n});\nexport type AdminUserProjectsCrud = CrudTypeOf<typeof adminUserProjectsCrud>;\n"],"mappings":"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","names":["yupString"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/interface/crud/projects.ts"],"sourcesContent":["import { CrudTypeOf, createCrud } from \"../../crud\";\nimport * as schemaFields from \"../../schema-fields\";\nimport { yupArray, yupObject, yupString } from \"../../schema-fields\";\n\nconst teamPermissionSchema = yupObject({\n id: yupString().defined(),\n}).defined();\n\nconst oauthProviderReadSchema = yupObject({\n provider_config_id: schemaFields.yupString().defined(),\n id: schemaFields.oauthIdSchema.defined(),\n type: schemaFields.oauthTypeSchema.defined(),\n client_id: schemaFields.yupDefinedAndNonEmptyWhen(\n schemaFields.oauthClientIdSchema,\n { type: 'standard' },\n ),\n client_secret: schemaFields.yupDefinedAndNonEmptyWhen(\n schemaFields.oauthClientSecretSchema,\n { type: 'standard' },\n ),\n\n // extra params\n facebook_config_id: schemaFields.oauthFacebookConfigIdSchema.optional(),\n microsoft_tenant_id: schemaFields.oauthMicrosoftTenantIdSchema.optional(),\n});\n\nconst oauthProviderWriteSchema = oauthProviderReadSchema.omit(['provider_config_id']);\n\nconst enabledOAuthProviderSchema = yupObject({\n id: schemaFields.oauthIdSchema.defined(),\n});\n\nexport const emailConfigSchema = yupObject({\n type: schemaFields.emailTypeSchema.defined(),\n host: schemaFields.yupDefinedAndNonEmptyWhen(schemaFields.emailHostSchema, {\n type: 'standard',\n }),\n port: schemaFields.yupDefinedWhen(schemaFields.emailPortSchema, {\n type: 'standard',\n }),\n username: schemaFields.yupDefinedAndNonEmptyWhen(schemaFields.emailUsernameSchema, {\n type: 'standard',\n }),\n password: schemaFields.yupDefinedAndNonEmptyWhen(schemaFields.emailPasswordSchema, {\n type: 'standard',\n }),\n sender_name: schemaFields.yupDefinedAndNonEmptyWhen(schemaFields.emailSenderNameSchema, {\n type: 'standard',\n }),\n sender_email: schemaFields.yupDefinedAndNonEmptyWhen(schemaFields.emailSenderEmailSchema, {\n type: 'standard',\n }),\n});\n\nexport const emailConfigWithoutPasswordSchema = emailConfigSchema.pick(['type', 'host', 'port', 'username', 'sender_name', 'sender_email']);\n\nconst domainSchema = yupObject({\n domain: schemaFields.urlSchema.defined()\n .matches(/^https?:\\/\\//, 'URL must start with http:// or https://')\n .meta({ openapiField: { description: 'URL. Must start with http:// or https://', exampleValue: 'https://example.com' } }),\n handler_path: schemaFields.handlerPathSchema.defined(),\n});\n\nexport const projectsCrudAdminReadSchema = yupObject({\n id: schemaFields.projectIdSchema.defined(),\n display_name: schemaFields.projectDisplayNameSchema.defined(),\n description: schemaFields.projectDescriptionSchema.nonNullable().defined(),\n logo_url: schemaFields.projectLogoUrlSchema.nullable().optional(),\n full_logo_url: schemaFields.projectFullLogoUrlSchema.nullable().optional(),\n created_at_millis: schemaFields.projectCreatedAtMillisSchema.defined(),\n is_production_mode: schemaFields.projectIsProductionModeSchema.defined(),\n owner_team_id: schemaFields.yupString().nullable().defined(),\n /** @deprecated */\n config: yupObject({\n allow_localhost: schemaFields.projectAllowLocalhostSchema.defined(),\n sign_up_enabled: schemaFields.projectSignUpEnabledSchema.defined(),\n credential_enabled: schemaFields.projectCredentialEnabledSchema.defined(),\n magic_link_enabled: schemaFields.projectMagicLinkEnabledSchema.defined(),\n passkey_enabled: schemaFields.projectPasskeyEnabledSchema.defined(),\n // TODO: remove this\n client_team_creation_enabled: schemaFields.projectClientTeamCreationEnabledSchema.defined(),\n client_user_deletion_enabled: schemaFields.projectClientUserDeletionEnabledSchema.defined(),\n allow_user_api_keys: schemaFields.yupBoolean().defined(),\n allow_team_api_keys: schemaFields.yupBoolean().defined(),\n oauth_providers: yupArray(oauthProviderReadSchema.defined()).defined(),\n enabled_oauth_providers: yupArray(enabledOAuthProviderSchema.defined()).defined().meta({ openapiField: { hidden: true } }),\n domains: yupArray(domainSchema.defined()).defined(),\n email_config: emailConfigSchema.defined(),\n email_theme: schemaFields.emailThemeSchema.defined(),\n create_team_on_sign_up: schemaFields.projectCreateTeamOnSignUpSchema.defined(),\n team_creator_default_permissions: yupArray(teamPermissionSchema.defined()).defined(),\n team_member_default_permissions: yupArray(teamPermissionSchema.defined()).defined(),\n user_default_permissions: yupArray(teamPermissionSchema.defined()).defined(),\n oauth_account_merge_strategy: schemaFields.oauthAccountMergeStrategySchema.defined(),\n }).defined().meta({ openapiField: { hidden: true } }),\n}).defined();\n\nexport const projectsCrudClientReadSchema = yupObject({\n id: schemaFields.projectIdSchema.defined(),\n display_name: schemaFields.projectDisplayNameSchema.defined(),\n config: yupObject({\n sign_up_enabled: schemaFields.projectSignUpEnabledSchema.defined(),\n credential_enabled: schemaFields.projectCredentialEnabledSchema.defined(),\n magic_link_enabled: schemaFields.projectMagicLinkEnabledSchema.defined(),\n passkey_enabled: schemaFields.projectPasskeyEnabledSchema.defined(),\n client_team_creation_enabled: schemaFields.projectClientTeamCreationEnabledSchema.defined(),\n client_user_deletion_enabled: schemaFields.projectClientUserDeletionEnabledSchema.defined(),\n allow_user_api_keys: schemaFields.yupBoolean().defined(),\n allow_team_api_keys: schemaFields.yupBoolean().defined(),\n enabled_oauth_providers: yupArray(enabledOAuthProviderSchema.defined()).defined().meta({ openapiField: { hidden: true } }),\n }).defined().meta({ openapiField: { hidden: true } }),\n}).defined();\n\n\nexport const projectsCrudAdminUpdateSchema = yupObject({\n display_name: schemaFields.projectDisplayNameSchema.optional(),\n description: schemaFields.projectDescriptionSchema.optional(),\n logo_url: schemaFields.projectLogoUrlSchema.nullable().optional(),\n full_logo_url: schemaFields.projectFullLogoUrlSchema.nullable().optional(),\n is_production_mode: schemaFields.projectIsProductionModeSchema.optional(),\n config: yupObject({\n sign_up_enabled: schemaFields.projectSignUpEnabledSchema.optional(),\n credential_enabled: schemaFields.projectCredentialEnabledSchema.optional(),\n magic_link_enabled: schemaFields.projectMagicLinkEnabledSchema.optional(),\n passkey_enabled: schemaFields.projectPasskeyEnabledSchema.optional(),\n client_team_creation_enabled: schemaFields.projectClientTeamCreationEnabledSchema.optional(),\n client_user_deletion_enabled: schemaFields.projectClientUserDeletionEnabledSchema.optional(),\n allow_localhost: schemaFields.projectAllowLocalhostSchema.optional(),\n allow_user_api_keys: schemaFields.yupBoolean().optional(),\n allow_team_api_keys: schemaFields.yupBoolean().optional(),\n email_config: emailConfigSchema.optional().default(undefined),\n email_theme: schemaFields.emailThemeSchema.optional(),\n domains: yupArray(domainSchema.defined()).optional().default(undefined),\n oauth_providers: yupArray(oauthProviderWriteSchema.defined()).optional().default(undefined),\n create_team_on_sign_up: schemaFields.projectCreateTeamOnSignUpSchema.optional(),\n team_creator_default_permissions: yupArray(teamPermissionSchema.defined()).optional(),\n team_member_default_permissions: yupArray(teamPermissionSchema.defined()).optional(),\n user_default_permissions: yupArray(teamPermissionSchema.defined()).optional(),\n oauth_account_merge_strategy: schemaFields.oauthAccountMergeStrategySchema.optional(),\n }).optional().default(undefined),\n}).defined();\n\nexport const projectsCrudAdminCreateSchema = projectsCrudAdminUpdateSchema.concat(yupObject({\n display_name: schemaFields.projectDisplayNameSchema.defined(),\n owner_team_id: schemaFields.yupString().uuid().defined(),\n}).defined());\n\nexport const projectsCrudAdminDeleteSchema = schemaFields.yupMixed();\n\nexport const clientProjectsCrud = createCrud({\n clientReadSchema: projectsCrudClientReadSchema,\n docs: {\n clientRead: {\n summary: 'Get the current project',\n description: 'Get the current project information including display name, OAuth providers and authentication methods. Useful for displaying the available login options to the user.',\n tags: ['Projects'],\n },\n },\n});\nexport type ClientProjectsCrud = CrudTypeOf<typeof clientProjectsCrud>;\n\nexport const projectsCrud = createCrud({\n adminReadSchema: projectsCrudAdminReadSchema,\n adminUpdateSchema: projectsCrudAdminUpdateSchema,\n adminDeleteSchema: projectsCrudAdminDeleteSchema,\n docs: {\n adminRead: {\n summary: 'Get the current project',\n description: 'Get the current project information and configuration including display name, OAuth providers, email configuration, etc.',\n tags: ['Projects'],\n },\n adminUpdate: {\n summary: 'Update the current project',\n description: 'Update the current project information and configuration including display name, OAuth providers, email configuration, etc.',\n tags: ['Projects'],\n },\n adminDelete: {\n summary: 'Delete the current project',\n description: 'Delete the current project and all associated data (including users, teams, API keys, project configs, etc.). Be careful, this action is irreversible.',\n tags: ['Projects'],\n },\n },\n});\nexport type ProjectsCrud = CrudTypeOf<typeof projectsCrud>;\n\nexport const adminUserProjectsCrud = createCrud({\n clientReadSchema: projectsCrudAdminReadSchema,\n clientCreateSchema: projectsCrudAdminCreateSchema,\n docs: {\n clientList: {\n hidden: true,\n },\n clientCreate: {\n hidden: true,\n },\n },\n});\nexport type AdminUserProjectsCrud = CrudTypeOf<typeof adminUserProjectsCrud>;\n"],"mappings":"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","names":["yupString"]}
|