payload 3.0.0-beta.30 → 3.0.0-beta.32
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/dist/admin/RichText.d.ts +6 -5
- package/dist/admin/RichText.d.ts.map +1 -1
- package/dist/admin/RichText.js.map +1 -1
- package/dist/admin/elements/Cell.d.ts +1 -0
- package/dist/admin/elements/Cell.d.ts.map +1 -1
- package/dist/admin/elements/Tab.d.ts +1 -0
- package/dist/admin/elements/Tab.d.ts.map +1 -1
- package/dist/admin/elements/WithServerSideProps.d.ts +6 -2
- package/dist/admin/elements/WithServerSideProps.d.ts.map +1 -1
- package/dist/admin/elements/WithServerSideProps.js.map +1 -1
- package/dist/admin/forms/Error.d.ts +1 -0
- package/dist/admin/forms/Error.d.ts.map +1 -1
- package/dist/admin/forms/FieldTypes.d.ts +1 -0
- package/dist/admin/forms/FieldTypes.d.ts.map +1 -1
- package/dist/admin/forms/Label.d.ts +1 -0
- package/dist/admin/forms/Label.d.ts.map +1 -1
- package/dist/admin/types.d.ts +1 -1
- package/dist/admin/types.d.ts.map +1 -1
- package/dist/admin/types.js.map +1 -1
- package/dist/admin/views/types.d.ts +3 -2
- package/dist/admin/views/types.d.ts.map +1 -1
- package/dist/admin/views/types.js.map +1 -1
- package/dist/auth/types.d.ts +1 -1
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/auth/types.js.map +1 -1
- package/dist/bin/loader/index.d.ts.map +1 -1
- package/dist/bin/loader/index.js +1 -8
- package/dist/bin/loader/index.js.map +1 -1
- package/dist/bin/loader/read-default-tsconfig.d.ts +25 -0
- package/dist/bin/loader/read-default-tsconfig.d.ts.map +1 -1
- package/dist/bin/loader/read-default-tsconfig.js +25 -1
- package/dist/bin/loader/read-default-tsconfig.js.map +1 -1
- package/dist/collections/config/client.d.ts +1 -0
- package/dist/collections/config/client.d.ts.map +1 -1
- package/dist/collections/config/types.d.ts +1 -0
- package/dist/collections/config/types.d.ts.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +11 -3
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/sanitize.d.ts.map +1 -1
- package/dist/config/sanitize.js.map +1 -1
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +12 -4
- package/dist/config/schema.js.map +1 -1
- package/dist/config/types.d.ts +48 -20
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +7 -1
- package/dist/config/types.js.map +1 -1
- package/dist/exports/node.d.ts +2 -0
- package/dist/exports/node.d.ts.map +1 -1
- package/dist/exports/node.js +2 -0
- package/dist/exports/node.js.map +1 -1
- package/dist/exports/types.d.ts.map +1 -1
- package/dist/exports/types.js.map +1 -1
- package/dist/fields/config/client.d.ts +79 -78
- package/dist/fields/config/client.d.ts.map +1 -1
- package/dist/fields/config/types.d.ts +30 -24
- package/dist/fields/config/types.d.ts.map +1 -1
- package/dist/fields/config/types.js.map +1 -1
- package/dist/fields/validations.d.ts +1 -0
- package/dist/fields/validations.d.ts.map +1 -1
- package/dist/fields/validations.js +2 -2
- package/dist/fields/validations.js.map +1 -1
- package/dist/index.d.ts +2 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts +5 -5
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/uploads/getBaseFields.js +1 -1
- package/dist/uploads/getBaseFields.js.map +1 -1
- package/dist/utilities/configToJSONSchema.d.ts.map +1 -1
- package/dist/utilities/configToJSONSchema.js +5 -1
- package/dist/utilities/configToJSONSchema.js.map +1 -1
- package/dist/utilities/configToJSONSchema.spec.js +96 -0
- package/dist/utilities/configToJSONSchema.spec.js.map +1 -1
- package/package.json +3 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { ExecutionResult, GraphQLSchema, ValidationRule } from 'graphql'\nimport type { OperationArgs, Request as graphQLRequest } from 'graphql-http'\nimport type pino from 'pino'\n\nimport crypto from 'crypto'\n\nimport type { AuthArgs } from './auth/operations/auth.js'\nimport type { Result as ForgotPasswordResult } from './auth/operations/forgotPassword.js'\nimport type { Options as ForgotPasswordOptions } from './auth/operations/local/forgotPassword.js'\nimport type { Options as LoginOptions } from './auth/operations/local/login.js'\nimport type { Options as ResetPasswordOptions } from './auth/operations/local/resetPassword.js'\nimport type { Options as UnlockOptions } from './auth/operations/local/unlock.js'\nimport type { Options as VerifyEmailOptions } from './auth/operations/local/verifyEmail.js'\nimport type { Result as LoginResult } from './auth/operations/login.js'\nimport type { Result as ResetPasswordResult } from './auth/operations/resetPassword.js'\nimport type { AuthStrategy } from './auth/types.js'\nimport type { BulkOperationResult, Collection, TypeWithID } from './collections/config/types.js'\nimport type { Options as CountOptions } from './collections/operations/local/count.js'\nimport type { Options as CreateOptions } from './collections/operations/local/create.js'\nimport type {\n ByIDOptions as DeleteByIDOptions,\n ManyOptions as DeleteManyOptions,\n Options as DeleteOptions,\n} from './collections/operations/local/delete.js'\nimport type { Options as DuplicateOptions } from './collections/operations/local/duplicate.js'\nimport type { Options as FindOptions } from './collections/operations/local/find.js'\nimport type { Options as FindByIDOptions } from './collections/operations/local/findByID.js'\nimport type { Options as FindVersionByIDOptions } from './collections/operations/local/findVersionByID.js'\nimport type { Options as FindVersionsOptions } from './collections/operations/local/findVersions.js'\nimport type { Options as RestoreVersionOptions } from './collections/operations/local/restoreVersion.js'\nimport type {\n ByIDOptions as UpdateByIDOptions,\n ManyOptions as UpdateManyOptions,\n Options as UpdateOptions,\n} from './collections/operations/local/update.js'\nimport type { InitOptions, SanitizedConfig } from './config/types.js'\nimport type { BaseDatabaseAdapter, PaginatedDocs } from './database/types.js'\nimport type { InitializedEmailAdapter } from './email/types.js'\nimport type { TypeWithID as GlobalTypeWithID, Globals } from './globals/config/types.js'\nimport type { Options as FindGlobalOptions } from './globals/operations/local/findOne.js'\nimport type { Options as FindGlobalVersionByIDOptions } from './globals/operations/local/findVersionByID.js'\nimport type { Options as FindGlobalVersionsOptions } from './globals/operations/local/findVersions.js'\nimport type { Options as RestoreGlobalVersionOptions } from './globals/operations/local/restoreVersion.js'\nimport type { Options as UpdateGlobalOptions } from './globals/operations/local/update.js'\nimport type { TypeWithVersion } from './versions/types.js'\n\nimport { decrypt, encrypt } from './auth/crypto.js'\nimport { APIKeyAuthentication } from './auth/strategies/apiKey.js'\nimport { JWTAuthentication } from './auth/strategies/jwt.js'\nimport localOperations from './collections/operations/local/index.js'\nimport { validateSchema } from './config/validate.js'\nimport { consoleEmailAdapter } from './email/consoleEmailAdapter.js'\nimport { fieldAffectsData } from './fields/config/types.js'\nimport localGlobalOperations from './globals/operations/local/index.js'\nimport flattenFields from './utilities/flattenTopLevelFields.js'\nimport Logger from './utilities/logger.js'\nimport { serverInit as serverInitTelemetry } from './utilities/telemetry/events/serverInit.js'\n\n/**\n * @description Payload\n */\nexport class BasePayload<TGeneratedTypes extends GeneratedTypes> {\n /**\n * @description Authorization and Authentication using headers and cookies to run auth user strategies\n * @returns cookies: Map<string, string>\n * @returns permissions: Permissions\n * @returns user: User\n */\n auth = async (options: AuthArgs) => {\n const { auth } = localOperations.auth\n return auth(this, options)\n }\n\n authStrategies: AuthStrategy[]\n\n collections: {\n [slug: number | string | symbol]: Collection\n } = {}\n\n config: SanitizedConfig\n\n /**\n * @description Performs count operation\n * @param options\n * @returns count of documents satisfying query\n */\n count = async <T extends keyof TGeneratedTypes['collections']>(\n options: CountOptions<T>,\n ): Promise<{ totalDocs: number }> => {\n const { count } = localOperations\n return count(this, options)\n }\n\n /**\n * @description Performs create operation\n * @param options\n * @returns created document\n */\n create = async <T extends keyof TGeneratedTypes['collections']>(\n options: CreateOptions<T>,\n ): Promise<TGeneratedTypes['collections'][T]> => {\n const { create } = localOperations\n return create<T>(this, options)\n }\n db: DatabaseAdapter\n\n decrypt = decrypt\n\n duplicate = async <T extends keyof TGeneratedTypes['collections']>(\n options: DuplicateOptions<T>,\n ): Promise<TGeneratedTypes['collections'][T]> => {\n const { duplicate } = localOperations\n return duplicate<T>(this, options)\n }\n\n email: InitializedEmailAdapter\n\n // TODO: re-implement or remove?\n // errorHandler: ErrorHandler\n\n encrypt = encrypt\n\n extensions: (args: {\n args: OperationArgs<any>\n req: graphQLRequest<unknown, unknown>\n result: ExecutionResult\n }) => Promise<any>\n\n /**\n * @description Find documents with criteria\n * @param options\n * @returns documents satisfying query\n */\n find = async <T extends keyof TGeneratedTypes['collections']>(\n options: FindOptions<T>,\n ): Promise<PaginatedDocs<TGeneratedTypes['collections'][T]>> => {\n const { find } = localOperations\n return find<T>(this, options)\n }\n\n /**\n * @description Find document by ID\n * @param options\n * @returns document with specified ID\n */\n findByID = async <T extends keyof TGeneratedTypes['collections']>(\n options: FindByIDOptions<T>,\n ): Promise<TGeneratedTypes['collections'][T]> => {\n const { findByID } = localOperations\n return findByID<T>(this, options)\n }\n\n findGlobal = async <T extends keyof TGeneratedTypes['globals']>(\n options: FindGlobalOptions<T>,\n ): Promise<TGeneratedTypes['globals'][T]> => {\n const { findOne } = localGlobalOperations\n return findOne<T>(this, options)\n }\n\n /**\n * @description Find global version by ID\n * @param options\n * @returns global version with specified ID\n */\n findGlobalVersionByID = async <T extends keyof TGeneratedTypes['globals']>(\n options: FindGlobalVersionByIDOptions<T>,\n ): Promise<TypeWithVersion<TGeneratedTypes['globals'][T]>> => {\n const { findVersionByID } = localGlobalOperations\n return findVersionByID<T>(this, options)\n }\n\n /**\n * @description Find global versions with criteria\n * @param options\n * @returns versions satisfying query\n */\n findGlobalVersions = async <T extends keyof TGeneratedTypes['globals']>(\n options: FindGlobalVersionsOptions<T>,\n ): Promise<PaginatedDocs<TypeWithVersion<TGeneratedTypes['globals'][T]>>> => {\n const { findVersions } = localGlobalOperations\n return findVersions<T>(this, options)\n }\n\n /**\n * @description Find version by ID\n * @param options\n * @returns version with specified ID\n */\n findVersionByID = async <T extends keyof TGeneratedTypes['collections']>(\n options: FindVersionByIDOptions<T>,\n ): Promise<TypeWithVersion<TGeneratedTypes['collections'][T]>> => {\n const { findVersionByID } = localOperations\n return findVersionByID<T>(this, options)\n }\n\n /**\n * @description Find versions with criteria\n * @param options\n * @returns versions satisfying query\n */\n findVersions = async <T extends keyof TGeneratedTypes['collections']>(\n options: FindVersionsOptions<T>,\n ): Promise<PaginatedDocs<TypeWithVersion<TGeneratedTypes['collections'][T]>>> => {\n const { findVersions } = localOperations\n return findVersions<T>(this, options)\n }\n\n forgotPassword = async <T extends keyof TGeneratedTypes['collections']>(\n options: ForgotPasswordOptions<T>,\n ): Promise<ForgotPasswordResult> => {\n const { forgotPassword } = localOperations.auth\n return forgotPassword<T>(this, options)\n }\n\n getAPIURL = (): string => `${this.config.serverURL}${this.config.routes.api}`\n\n getAdminURL = (): string => `${this.config.serverURL}${this.config.routes.admin}`\n\n globals: Globals\n\n logger: pino.Logger\n\n login = async <T extends keyof TGeneratedTypes['collections']>(\n options: LoginOptions<T>,\n ): Promise<LoginResult & { user: TGeneratedTypes['collections'][T] }> => {\n const { login } = localOperations.auth\n return login<T>(this, options)\n }\n\n resetPassword = async <T extends keyof TGeneratedTypes['collections']>(\n options: ResetPasswordOptions<T>,\n ): Promise<ResetPasswordResult> => {\n const { resetPassword } = localOperations.auth\n return resetPassword<T>(this, options)\n }\n\n /**\n * @description Restore global version by ID\n * @param options\n * @returns version with specified ID\n */\n restoreGlobalVersion = async <T extends keyof TGeneratedTypes['globals']>(\n options: RestoreGlobalVersionOptions<T>,\n ): Promise<TGeneratedTypes['globals'][T]> => {\n const { restoreVersion } = localGlobalOperations\n return restoreVersion<T>(this, options)\n }\n\n /**\n * @description Restore version by ID\n * @param options\n * @returns version with specified ID\n */\n restoreVersion = async <T extends keyof TGeneratedTypes['collections']>(\n options: RestoreVersionOptions<T>,\n ): Promise<TGeneratedTypes['collections'][T]> => {\n const { restoreVersion } = localOperations\n return restoreVersion<T>(this, options)\n }\n\n schema: GraphQLSchema\n\n secret: string\n\n sendEmail: InitializedEmailAdapter['sendEmail']\n\n types: {\n arrayTypes: any\n blockInputTypes: any\n blockTypes: any\n fallbackLocaleInputType?: any\n groupTypes: any\n localeInputType?: any\n tabTypes: any\n }\n\n unlock = async <T extends keyof TGeneratedTypes['collections']>(\n options: UnlockOptions<T>,\n ): Promise<boolean> => {\n const { unlock } = localOperations.auth\n return unlock(this, options)\n }\n\n updateGlobal = async <T extends keyof TGeneratedTypes['globals']>(\n options: UpdateGlobalOptions<T>,\n ): Promise<TGeneratedTypes['globals'][T]> => {\n const { update } = localGlobalOperations\n return update<T>(this, options)\n }\n\n validationRules: (args: OperationArgs<any>) => ValidationRule[]\n\n verifyEmail = async <T extends keyof TGeneratedTypes['collections']>(\n options: VerifyEmailOptions<T>,\n ): Promise<boolean> => {\n const { verifyEmail } = localOperations.auth\n return verifyEmail(this, options)\n }\n\n versions: {\n [slug: string]: any // TODO: Type this\n } = {}\n\n /**\n * @description delete one or more documents\n * @param options\n * @returns Updated document(s)\n */\n delete<T extends keyof TGeneratedTypes['collections']>(\n options: DeleteByIDOptions<T>,\n ): Promise<TGeneratedTypes['collections'][T]>\n\n delete<T extends keyof TGeneratedTypes['collections']>(\n options: DeleteManyOptions<T>,\n ): Promise<BulkOperationResult<T>>\n\n delete<T extends keyof TGeneratedTypes['collections']>(\n options: DeleteOptions<T>,\n ): Promise<BulkOperationResult<T> | TGeneratedTypes['collections'][T]> {\n const { deleteLocal } = localOperations\n return deleteLocal<T>(this, options)\n }\n\n /**\n * @description Initializes Payload\n * @param options\n */\n async init(options: InitOptions): Promise<Payload> {\n if (!options?.config) {\n throw new Error('Error: the payload config is required to initialize payload.')\n }\n\n this.logger = Logger('payload', options.loggerOptions, options.loggerDestination)\n\n this.config = await options.config\n\n if (process.env.NODE_ENV !== 'production') {\n validateSchema(this.config, this.logger)\n }\n\n if (!this.config.secret) {\n throw new Error('Error: missing secret key. A secret key is needed to secure Payload.')\n }\n\n this.secret = crypto.createHash('sha256').update(this.config.secret).digest('hex').slice(0, 32)\n\n this.globals = {\n config: this.config.globals,\n }\n\n this.config.collections.forEach((collection) => {\n const customID = flattenFields(collection.fields).find(\n (field) => fieldAffectsData(field) && field.name === 'id',\n )\n\n let customIDType\n\n if (customID?.type === 'number' || customID?.type === 'text') customIDType = customID.type\n\n this.collections[collection.slug] = {\n config: collection,\n customIDType,\n }\n })\n\n this.db = this.config.db.init({ payload: this })\n this.db.payload = this\n\n if (this.db?.init) {\n await this.db.init()\n }\n\n if (!options.disableDBConnect && this.db.connect) {\n await this.db.connect()\n }\n\n // Load email adapter\n if (this.config.email instanceof Promise) {\n const awaitedAdapter = await this.config.email\n this.email = awaitedAdapter({ payload: this })\n } else if (this.config.email) {\n this.email = this.config.email({ payload: this })\n } else {\n this.logger.warn(\n `No email adapter provided. Email will be written to console. More info at https://payloadcms.com/docs/email/overview.`,\n )\n\n this.email = consoleEmailAdapter({ payload: this })\n }\n\n this.sendEmail = this.email['sendEmail']\n\n serverInitTelemetry(this)\n\n // 1. loop over collections, if collection has auth strategy, initialize and push to array\n let jwtStrategyEnabled = false\n this.authStrategies = this.config.collections.reduce((authStrategies, collection) => {\n if (collection?.auth) {\n if (collection.auth.strategies.length > 0) {\n authStrategies.push(...collection.auth.strategies)\n }\n\n // 2. if api key enabled, push api key strategy into the array\n if (collection.auth?.useAPIKey) {\n authStrategies.push({\n name: `${collection.slug}-api-key`,\n authenticate: APIKeyAuthentication(collection),\n })\n }\n\n // 3. if localStrategy flag is true\n if (!collection.auth.disableLocalStrategy && !jwtStrategyEnabled) {\n jwtStrategyEnabled = true\n }\n }\n\n return authStrategies\n }, [] as AuthStrategy[])\n\n // 4. if enabled, push jwt strategy into authStrategies last\n if (jwtStrategyEnabled) {\n this.authStrategies.push({\n name: 'local-jwt',\n authenticate: JWTAuthentication,\n })\n }\n\n if (!options.disableOnInit) {\n if (typeof options.onInit === 'function') await options.onInit(this)\n if (typeof this.config.onInit === 'function') await this.config.onInit(this)\n }\n\n return this\n }\n\n update<T extends keyof TGeneratedTypes['collections']>(\n options: UpdateManyOptions<T>,\n ): Promise<BulkOperationResult<T>>\n\n /**\n * @description Update one or more documents\n * @param options\n * @returns Updated document(s)\n */\n update<T extends keyof TGeneratedTypes['collections']>(\n options: UpdateByIDOptions<T>,\n ): Promise<TGeneratedTypes['collections'][T]>\n\n update<T extends keyof TGeneratedTypes['collections']>(\n options: UpdateOptions<T>,\n ): Promise<BulkOperationResult<T> | TGeneratedTypes['collections'][T]> {\n const { update } = localOperations\n return update<T>(this, options)\n }\n}\n\nconst initialized = new BasePayload()\n\nexport default initialized\n\nlet cached = global._payload\n\nif (!cached) {\n // eslint-disable-next-line no-multi-assign\n cached = global._payload = { payload: null, promise: null }\n}\n\nexport const getPayload = async (options: InitOptions): Promise<BasePayload<GeneratedTypes>> => {\n if (!options?.config) {\n throw new Error('Error: the payload config is required for getPayload to work.')\n }\n\n if (cached.payload) {\n return cached.payload\n }\n\n if (!cached.promise) {\n cached.promise = new BasePayload<GeneratedTypes>().init(options)\n }\n\n try {\n cached.payload = await cached.promise\n } catch (e) {\n cached.promise = null\n throw e\n }\n\n return cached.payload\n}\n\ntype GeneratedTypes = {\n collections: {\n [slug: number | string | symbol]: TypeWithID & Record<string, unknown>\n }\n globals: {\n [slug: number | string | symbol]: GlobalTypeWithID & Record<string, unknown>\n }\n locale: null | string\n user: TypeWithID & Record<string, unknown> & { collection: string }\n}\n\ntype Payload = BasePayload<GeneratedTypes>\n\ninterface RequestContext {\n [key: string]: unknown\n}\n\ntype DatabaseAdapter = BaseDatabaseAdapter\n\nexport type { DatabaseAdapter, GeneratedTypes, Payload, RequestContext }\n"],"names":["crypto","decrypt","encrypt","APIKeyAuthentication","JWTAuthentication","localOperations","validateSchema","consoleEmailAdapter","fieldAffectsData","localGlobalOperations","flattenFields","Logger","serverInit","serverInitTelemetry","BasePayload","auth","options","authStrategies","collections","config","count","create","db","duplicate","email","extensions","find","findByID","findGlobal","findOne","findGlobalVersionByID","findVersionByID","findGlobalVersions","findVersions","forgotPassword","getAPIURL","serverURL","routes","api","getAdminURL","admin","globals","logger","login","resetPassword","restoreGlobalVersion","restoreVersion","schema","secret","sendEmail","types","unlock","updateGlobal","update","validationRules","verifyEmail","versions","delete","deleteLocal","init","Error","loggerOptions","loggerDestination","process","env","NODE_ENV","createHash","digest","slice","forEach","collection","customID","fields","field","name","customIDType","type","slug","payload","disableDBConnect","connect","Promise","awaitedAdapter","warn","jwtStrategyEnabled","reduce","strategies","length","push","useAPIKey","authenticate","disableLocalStrategy","disableOnInit","onInit","initialized","cached","global","_payload","promise","getPayload","e"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { ExecutionResult, GraphQLSchema, ValidationRule } from 'graphql'\nimport type { OperationArgs, Request as graphQLRequest } from 'graphql-http'\nimport type pino from 'pino'\n\nimport crypto from 'crypto'\n\nimport type { AuthArgs } from './auth/operations/auth.js'\nimport type { Result as ForgotPasswordResult } from './auth/operations/forgotPassword.js'\nimport type { Options as ForgotPasswordOptions } from './auth/operations/local/forgotPassword.js'\nimport type { Options as LoginOptions } from './auth/operations/local/login.js'\nimport type { Options as ResetPasswordOptions } from './auth/operations/local/resetPassword.js'\nimport type { Options as UnlockOptions } from './auth/operations/local/unlock.js'\nimport type { Options as VerifyEmailOptions } from './auth/operations/local/verifyEmail.js'\nimport type { Result as LoginResult } from './auth/operations/login.js'\nimport type { Result as ResetPasswordResult } from './auth/operations/resetPassword.js'\nimport type { AuthStrategy, User } from './auth/types.js'\nimport type { BulkOperationResult, Collection, TypeWithID } from './collections/config/types.js'\nimport type { Options as CountOptions } from './collections/operations/local/count.js'\nimport type { Options as CreateOptions } from './collections/operations/local/create.js'\nimport type {\n ByIDOptions as DeleteByIDOptions,\n ManyOptions as DeleteManyOptions,\n Options as DeleteOptions,\n} from './collections/operations/local/delete.js'\nimport type { Options as DuplicateOptions } from './collections/operations/local/duplicate.js'\nimport type { Options as FindOptions } from './collections/operations/local/find.js'\nimport type { Options as FindByIDOptions } from './collections/operations/local/findByID.js'\nimport type { Options as FindVersionByIDOptions } from './collections/operations/local/findVersionByID.js'\nimport type { Options as FindVersionsOptions } from './collections/operations/local/findVersions.js'\nimport type { Options as RestoreVersionOptions } from './collections/operations/local/restoreVersion.js'\nimport type {\n ByIDOptions as UpdateByIDOptions,\n ManyOptions as UpdateManyOptions,\n Options as UpdateOptions,\n} from './collections/operations/local/update.js'\nimport type { InitOptions, SanitizedConfig } from './config/types.js'\nimport type { BaseDatabaseAdapter, PaginatedDocs } from './database/types.js'\nimport type { InitializedEmailAdapter } from './email/types.js'\nimport type { TypeWithID as GlobalTypeWithID, Globals } from './globals/config/types.js'\nimport type { Options as FindGlobalOptions } from './globals/operations/local/findOne.js'\nimport type { Options as FindGlobalVersionByIDOptions } from './globals/operations/local/findVersionByID.js'\nimport type { Options as FindGlobalVersionsOptions } from './globals/operations/local/findVersions.js'\nimport type { Options as RestoreGlobalVersionOptions } from './globals/operations/local/restoreVersion.js'\nimport type { Options as UpdateGlobalOptions } from './globals/operations/local/update.js'\nimport type { TypeWithVersion } from './versions/types.js'\n\nimport { decrypt, encrypt } from './auth/crypto.js'\nimport { APIKeyAuthentication } from './auth/strategies/apiKey.js'\nimport { JWTAuthentication } from './auth/strategies/jwt.js'\nimport localOperations from './collections/operations/local/index.js'\nimport { validateSchema } from './config/validate.js'\nimport { consoleEmailAdapter } from './email/consoleEmailAdapter.js'\nimport { fieldAffectsData } from './fields/config/types.js'\nimport localGlobalOperations from './globals/operations/local/index.js'\nimport flattenFields from './utilities/flattenTopLevelFields.js'\nimport Logger from './utilities/logger.js'\nimport { serverInit as serverInitTelemetry } from './utilities/telemetry/events/serverInit.js'\n\n/**\n * @description Payload\n */\nexport class BasePayload<TGeneratedTypes extends GeneratedTypes> {\n /**\n * @description Authorization and Authentication using headers and cookies to run auth user strategies\n * @returns cookies: Map<string, string>\n * @returns permissions: Permissions\n * @returns user: User\n */\n auth = async (options: AuthArgs) => {\n const { auth } = localOperations.auth\n return auth(this, options)\n }\n\n authStrategies: AuthStrategy[]\n\n collections: {\n [slug: number | string | symbol]: Collection\n } = {}\n\n config: SanitizedConfig\n\n /**\n * @description Performs count operation\n * @param options\n * @returns count of documents satisfying query\n */\n count = async <T extends keyof TGeneratedTypes['collections']>(\n options: CountOptions<T>,\n ): Promise<{ totalDocs: number }> => {\n const { count } = localOperations\n return count(this, options)\n }\n\n /**\n * @description Performs create operation\n * @param options\n * @returns created document\n */\n create = async <T extends keyof TGeneratedTypes['collections']>(\n options: CreateOptions<T>,\n ): Promise<TGeneratedTypes['collections'][T]> => {\n const { create } = localOperations\n return create<T>(this, options)\n }\n db: DatabaseAdapter\n\n decrypt = decrypt\n\n duplicate = async <T extends keyof TGeneratedTypes['collections']>(\n options: DuplicateOptions<T>,\n ): Promise<TGeneratedTypes['collections'][T]> => {\n const { duplicate } = localOperations\n return duplicate<T>(this, options)\n }\n\n email: InitializedEmailAdapter\n\n // TODO: re-implement or remove?\n // errorHandler: ErrorHandler\n\n encrypt = encrypt\n\n extensions: (args: {\n args: OperationArgs<any>\n req: graphQLRequest<unknown, unknown>\n result: ExecutionResult\n }) => Promise<any>\n\n /**\n * @description Find documents with criteria\n * @param options\n * @returns documents satisfying query\n */\n find = async <T extends keyof TGeneratedTypes['collections']>(\n options: FindOptions<T>,\n ): Promise<PaginatedDocs<TGeneratedTypes['collections'][T]>> => {\n const { find } = localOperations\n return find<T>(this, options)\n }\n\n /**\n * @description Find document by ID\n * @param options\n * @returns document with specified ID\n */\n findByID = async <T extends keyof TGeneratedTypes['collections']>(\n options: FindByIDOptions<T>,\n ): Promise<TGeneratedTypes['collections'][T]> => {\n const { findByID } = localOperations\n return findByID<T>(this, options)\n }\n\n findGlobal = async <T extends keyof TGeneratedTypes['globals']>(\n options: FindGlobalOptions<T>,\n ): Promise<TGeneratedTypes['globals'][T]> => {\n const { findOne } = localGlobalOperations\n return findOne<T>(this, options)\n }\n\n /**\n * @description Find global version by ID\n * @param options\n * @returns global version with specified ID\n */\n findGlobalVersionByID = async <T extends keyof TGeneratedTypes['globals']>(\n options: FindGlobalVersionByIDOptions<T>,\n ): Promise<TypeWithVersion<TGeneratedTypes['globals'][T]>> => {\n const { findVersionByID } = localGlobalOperations\n return findVersionByID<T>(this, options)\n }\n\n /**\n * @description Find global versions with criteria\n * @param options\n * @returns versions satisfying query\n */\n findGlobalVersions = async <T extends keyof TGeneratedTypes['globals']>(\n options: FindGlobalVersionsOptions<T>,\n ): Promise<PaginatedDocs<TypeWithVersion<TGeneratedTypes['globals'][T]>>> => {\n const { findVersions } = localGlobalOperations\n return findVersions<T>(this, options)\n }\n\n /**\n * @description Find version by ID\n * @param options\n * @returns version with specified ID\n */\n findVersionByID = async <T extends keyof TGeneratedTypes['collections']>(\n options: FindVersionByIDOptions<T>,\n ): Promise<TypeWithVersion<TGeneratedTypes['collections'][T]>> => {\n const { findVersionByID } = localOperations\n return findVersionByID<T>(this, options)\n }\n\n /**\n * @description Find versions with criteria\n * @param options\n * @returns versions satisfying query\n */\n findVersions = async <T extends keyof TGeneratedTypes['collections']>(\n options: FindVersionsOptions<T>,\n ): Promise<PaginatedDocs<TypeWithVersion<TGeneratedTypes['collections'][T]>>> => {\n const { findVersions } = localOperations\n return findVersions<T>(this, options)\n }\n\n forgotPassword = async <T extends keyof TGeneratedTypes['collections']>(\n options: ForgotPasswordOptions<T>,\n ): Promise<ForgotPasswordResult> => {\n const { forgotPassword } = localOperations.auth\n return forgotPassword<T>(this, options)\n }\n\n getAPIURL = (): string => `${this.config.serverURL}${this.config.routes.api}`\n\n getAdminURL = (): string => `${this.config.serverURL}${this.config.routes.admin}`\n\n globals: Globals\n\n logger: pino.Logger\n\n login = async <T extends keyof TGeneratedTypes['collections']>(\n options: LoginOptions<T>,\n ): Promise<LoginResult & { user: TGeneratedTypes['collections'][T] }> => {\n const { login } = localOperations.auth\n return login<T>(this, options)\n }\n\n resetPassword = async <T extends keyof TGeneratedTypes['collections']>(\n options: ResetPasswordOptions<T>,\n ): Promise<ResetPasswordResult> => {\n const { resetPassword } = localOperations.auth\n return resetPassword<T>(this, options)\n }\n\n /**\n * @description Restore global version by ID\n * @param options\n * @returns version with specified ID\n */\n restoreGlobalVersion = async <T extends keyof TGeneratedTypes['globals']>(\n options: RestoreGlobalVersionOptions<T>,\n ): Promise<TGeneratedTypes['globals'][T]> => {\n const { restoreVersion } = localGlobalOperations\n return restoreVersion<T>(this, options)\n }\n\n /**\n * @description Restore version by ID\n * @param options\n * @returns version with specified ID\n */\n restoreVersion = async <T extends keyof TGeneratedTypes['collections']>(\n options: RestoreVersionOptions<T>,\n ): Promise<TGeneratedTypes['collections'][T]> => {\n const { restoreVersion } = localOperations\n return restoreVersion<T>(this, options)\n }\n\n schema: GraphQLSchema\n\n secret: string\n\n sendEmail: InitializedEmailAdapter['sendEmail']\n\n types: {\n arrayTypes: any\n blockInputTypes: any\n blockTypes: any\n fallbackLocaleInputType?: any\n groupTypes: any\n localeInputType?: any\n tabTypes: any\n }\n\n unlock = async <T extends keyof TGeneratedTypes['collections']>(\n options: UnlockOptions<T>,\n ): Promise<boolean> => {\n const { unlock } = localOperations.auth\n return unlock(this, options)\n }\n\n updateGlobal = async <T extends keyof TGeneratedTypes['globals']>(\n options: UpdateGlobalOptions<T>,\n ): Promise<TGeneratedTypes['globals'][T]> => {\n const { update } = localGlobalOperations\n return update<T>(this, options)\n }\n\n validationRules: (args: OperationArgs<any>) => ValidationRule[]\n\n verifyEmail = async <T extends keyof TGeneratedTypes['collections']>(\n options: VerifyEmailOptions<T>,\n ): Promise<boolean> => {\n const { verifyEmail } = localOperations.auth\n return verifyEmail(this, options)\n }\n\n versions: {\n [slug: string]: any // TODO: Type this\n } = {}\n\n /**\n * @description delete one or more documents\n * @param options\n * @returns Updated document(s)\n */\n delete<T extends keyof TGeneratedTypes['collections']>(\n options: DeleteByIDOptions<T>,\n ): Promise<TGeneratedTypes['collections'][T]>\n\n delete<T extends keyof TGeneratedTypes['collections']>(\n options: DeleteManyOptions<T>,\n ): Promise<BulkOperationResult<T>>\n\n delete<T extends keyof TGeneratedTypes['collections']>(\n options: DeleteOptions<T>,\n ): Promise<BulkOperationResult<T> | TGeneratedTypes['collections'][T]> {\n const { deleteLocal } = localOperations\n return deleteLocal<T>(this, options)\n }\n\n /**\n * @description Initializes Payload\n * @param options\n */\n async init(options: InitOptions): Promise<Payload> {\n if (!options?.config) {\n throw new Error('Error: the payload config is required to initialize payload.')\n }\n\n this.logger = Logger('payload', options.loggerOptions, options.loggerDestination)\n\n this.config = await options.config\n\n if (process.env.NODE_ENV !== 'production') {\n validateSchema(this.config, this.logger)\n }\n\n if (!this.config.secret) {\n throw new Error('Error: missing secret key. A secret key is needed to secure Payload.')\n }\n\n this.secret = crypto.createHash('sha256').update(this.config.secret).digest('hex').slice(0, 32)\n\n this.globals = {\n config: this.config.globals,\n }\n\n this.config.collections.forEach((collection) => {\n const customID = flattenFields(collection.fields).find(\n (field) => fieldAffectsData(field) && field.name === 'id',\n )\n\n let customIDType\n\n if (customID?.type === 'number' || customID?.type === 'text') customIDType = customID.type\n\n this.collections[collection.slug] = {\n config: collection,\n customIDType,\n }\n })\n\n this.db = this.config.db.init({ payload: this })\n this.db.payload = this\n\n if (this.db?.init) {\n await this.db.init()\n }\n\n if (!options.disableDBConnect && this.db.connect) {\n await this.db.connect()\n }\n\n // Load email adapter\n if (this.config.email instanceof Promise) {\n const awaitedAdapter = await this.config.email\n this.email = awaitedAdapter({ payload: this })\n } else if (this.config.email) {\n this.email = this.config.email({ payload: this })\n } else {\n this.logger.warn(\n `No email adapter provided. Email will be written to console. More info at https://payloadcms.com/docs/email/overview.`,\n )\n\n this.email = consoleEmailAdapter({ payload: this })\n }\n\n this.sendEmail = this.email['sendEmail']\n\n serverInitTelemetry(this)\n\n // 1. loop over collections, if collection has auth strategy, initialize and push to array\n let jwtStrategyEnabled = false\n this.authStrategies = this.config.collections.reduce((authStrategies, collection) => {\n if (collection?.auth) {\n if (collection.auth.strategies.length > 0) {\n authStrategies.push(...collection.auth.strategies)\n }\n\n // 2. if api key enabled, push api key strategy into the array\n if (collection.auth?.useAPIKey) {\n authStrategies.push({\n name: `${collection.slug}-api-key`,\n authenticate: APIKeyAuthentication(collection),\n })\n }\n\n // 3. if localStrategy flag is true\n if (!collection.auth.disableLocalStrategy && !jwtStrategyEnabled) {\n jwtStrategyEnabled = true\n }\n }\n\n return authStrategies\n }, [] as AuthStrategy[])\n\n // 4. if enabled, push jwt strategy into authStrategies last\n if (jwtStrategyEnabled) {\n this.authStrategies.push({\n name: 'local-jwt',\n authenticate: JWTAuthentication,\n })\n }\n\n if (!options.disableOnInit) {\n if (typeof options.onInit === 'function') await options.onInit(this)\n if (typeof this.config.onInit === 'function') await this.config.onInit(this)\n }\n\n return this\n }\n\n update<T extends keyof TGeneratedTypes['collections']>(\n options: UpdateManyOptions<T>,\n ): Promise<BulkOperationResult<T>>\n\n /**\n * @description Update one or more documents\n * @param options\n * @returns Updated document(s)\n */\n update<T extends keyof TGeneratedTypes['collections']>(\n options: UpdateByIDOptions<T>,\n ): Promise<TGeneratedTypes['collections'][T]>\n\n update<T extends keyof TGeneratedTypes['collections']>(\n options: UpdateOptions<T>,\n ): Promise<BulkOperationResult<T> | TGeneratedTypes['collections'][T]> {\n const { update } = localOperations\n return update<T>(this, options)\n }\n}\n\nconst initialized = new BasePayload()\n\nexport default initialized\n\nlet cached = global._payload\n\nif (!cached) {\n // eslint-disable-next-line no-multi-assign\n cached = global._payload = { payload: null, promise: null }\n}\n\nexport const getPayload = async (options: InitOptions): Promise<BasePayload<GeneratedTypes>> => {\n if (!options?.config) {\n throw new Error('Error: the payload config is required for getPayload to work.')\n }\n\n if (cached.payload) {\n return cached.payload\n }\n\n if (!cached.promise) {\n cached.promise = new BasePayload<GeneratedTypes>().init(options)\n }\n\n try {\n cached.payload = await cached.promise\n } catch (e) {\n cached.promise = null\n throw e\n }\n\n return cached.payload\n}\n\ntype GeneratedTypes = {\n collections: {\n [slug: number | string | symbol]: TypeWithID & Record<string, unknown>\n }\n globals: {\n [slug: number | string | symbol]: GlobalTypeWithID & Record<string, unknown>\n }\n locale: null | string\n user: User\n}\n\ntype Payload = BasePayload<GeneratedTypes>\n\ninterface RequestContext {\n [key: string]: unknown\n}\n\ntype DatabaseAdapter = BaseDatabaseAdapter\n\nexport type { DatabaseAdapter, GeneratedTypes, Payload, RequestContext }\n"],"names":["crypto","decrypt","encrypt","APIKeyAuthentication","JWTAuthentication","localOperations","validateSchema","consoleEmailAdapter","fieldAffectsData","localGlobalOperations","flattenFields","Logger","serverInit","serverInitTelemetry","BasePayload","auth","options","authStrategies","collections","config","count","create","db","duplicate","email","extensions","find","findByID","findGlobal","findOne","findGlobalVersionByID","findVersionByID","findGlobalVersions","findVersions","forgotPassword","getAPIURL","serverURL","routes","api","getAdminURL","admin","globals","logger","login","resetPassword","restoreGlobalVersion","restoreVersion","schema","secret","sendEmail","types","unlock","updateGlobal","update","validationRules","verifyEmail","versions","delete","deleteLocal","init","Error","loggerOptions","loggerDestination","process","env","NODE_ENV","createHash","digest","slice","forEach","collection","customID","fields","field","name","customIDType","type","slug","payload","disableDBConnect","connect","Promise","awaitedAdapter","warn","jwtStrategyEnabled","reduce","strategies","length","push","useAPIKey","authenticate","disableLocalStrategy","disableOnInit","onInit","initialized","cached","global","_payload","promise","getPayload","e"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -18,7 +18,7 @@ export type UploadEdits = {
|
|
|
18
18
|
y?: number;
|
|
19
19
|
};
|
|
20
20
|
};
|
|
21
|
-
export type CustomPayloadRequestProperties
|
|
21
|
+
export type CustomPayloadRequestProperties = {
|
|
22
22
|
context: RequestContext;
|
|
23
23
|
/** The locale that should be used for a field when it is not translated to the requested locale */
|
|
24
24
|
fallbackLocale?: string;
|
|
@@ -58,8 +58,8 @@ export type CustomPayloadRequestProperties<U = unknown> = {
|
|
|
58
58
|
* Used to ensure consistency when multiple operations try to create a transaction concurrently on the same request
|
|
59
59
|
*/
|
|
60
60
|
transactionIDPromise?: Promise<void>;
|
|
61
|
-
/** The signed
|
|
62
|
-
user:
|
|
61
|
+
/** The signed-in user */
|
|
62
|
+
user: GeneratedTypes['user'] | null;
|
|
63
63
|
} & Pick<URL, 'hash' | 'host' | 'href' | 'origin' | 'pathname' | 'port' | 'protocol' | 'search' | 'searchParams'>;
|
|
64
64
|
export type PayloadRequestData = {
|
|
65
65
|
/** Data from the request body */
|
|
@@ -73,8 +73,8 @@ export type PayloadRequestData = {
|
|
|
73
73
|
tempFilePath?: string;
|
|
74
74
|
};
|
|
75
75
|
};
|
|
76
|
-
export type PayloadRequest
|
|
77
|
-
export type PayloadRequestWithData
|
|
76
|
+
export type PayloadRequest = Partial<Request> & Required<Pick<Request, 'headers'>> & CustomPayloadRequestProperties;
|
|
77
|
+
export type PayloadRequestWithData = PayloadRequest & PayloadRequestData;
|
|
78
78
|
export interface RequestContext {
|
|
79
79
|
[key: string]: unknown;
|
|
80
80
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAC/D,OAAO,KAAK,UAAU,MAAM,YAAY,CAAA;AAExC,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AACpF,OAAO,KAAK,OAAO,MAAM,aAAa,CAAA;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,YAAY,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,aAAa,CAAA;AAErD,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,EAAE;QACL,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,CAAC,CAAC,EAAE,MAAM,CAAA;QACV,CAAC,CAAC,EAAE,MAAM,CAAA;KACX,CAAA;IACD,UAAU,CAAC,EAAE;QACX,CAAC,CAAC,EAAE,MAAM,CAAA;QACV,CAAC,CAAC,EAAE,MAAM,CAAA;KACX,CAAA;CACF,CAAA;AAED,MAAM,MAAM,8BAA8B,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/types/index.ts"],"sourcesContent":["import type { I18n, TFunction } from '@payloadcms/translations'\nimport type DataLoader from 'dataloader'\n\nimport type { TypeWithID, TypeWithTimestamps } from '../collections/config/types.js'\nimport type payload from '../index.js'\nimport type { GeneratedTypes } from '../index.js'\nimport type { validOperators } from './constants.js'\nexport type { Payload as Payload } from '../index.js'\n\nexport type UploadEdits = {\n crop?: {\n height?: number\n width?: number\n x?: number\n y?: number\n }\n focalPoint?: {\n x?: number\n y?: number\n }\n}\n\nexport type CustomPayloadRequestProperties
|
|
1
|
+
{"version":3,"sources":["../../src/types/index.ts"],"sourcesContent":["import type { I18n, TFunction } from '@payloadcms/translations'\nimport type DataLoader from 'dataloader'\n\nimport type { TypeWithID, TypeWithTimestamps } from '../collections/config/types.js'\nimport type payload from '../index.js'\nimport type { GeneratedTypes } from '../index.js'\nimport type { validOperators } from './constants.js'\nexport type { Payload as Payload } from '../index.js'\n\nexport type UploadEdits = {\n crop?: {\n height?: number\n width?: number\n x?: number\n y?: number\n }\n focalPoint?: {\n x?: number\n y?: number\n }\n}\n\nexport type CustomPayloadRequestProperties = {\n context: RequestContext\n /** The locale that should be used for a field when it is not translated to the requested locale */\n fallbackLocale?: string\n i18n: I18n\n /**\n * The requested locale if specified\n * Only available for localized collections\n */\n locale?: GeneratedTypes['locale']\n /**\n * The payload object\n */\n payload: typeof payload\n /**\n * The context in which the request is being made\n */\n payloadAPI: 'GraphQL' | 'REST' | 'local'\n /** Optimized document loader */\n payloadDataLoader?: DataLoader<string, TypeWithID>\n /** Resized versions of the image that was uploaded during this request */\n payloadUploadSizes?: Record<string, Buffer>\n /** Query params on the request */\n query: Record<string, unknown>\n /** The route parameters\n * @example\n * /:collection/:id -> /posts/123\n * { collection: 'posts', id: '123' }\n */\n routeParams?: Record<string, unknown>\n /** Translate function - duplicate of i18n.t */\n t: TFunction\n /**\n * Identifier for the database transaction for interactions in a single, all-or-nothing operation.\n */\n transactionID?: number | string\n /**\n * Used to ensure consistency when multiple operations try to create a transaction concurrently on the same request\n */\n transactionIDPromise?: Promise<void>\n /** The signed-in user */\n user: GeneratedTypes['user'] | null\n} & Pick<\n URL,\n 'hash' | 'host' | 'href' | 'origin' | 'pathname' | 'port' | 'protocol' | 'search' | 'searchParams'\n>\nexport type PayloadRequestData = {\n /** Data from the request body */\n data?: Record<string, unknown>\n /** The locale that should be used for a field when it is not translated to the requested locale */\n file?: {\n data: Buffer\n mimetype: string\n name: string\n size: number\n tempFilePath?: string\n }\n}\nexport type PayloadRequest = Partial<Request> &\n Required<Pick<Request, 'headers'>> &\n CustomPayloadRequestProperties\nexport type PayloadRequestWithData = PayloadRequest & PayloadRequestData\nexport interface RequestContext {\n [key: string]: unknown\n}\n\nexport type Operator = (typeof validOperators)[number]\n\nexport type WhereField = {\n [key in Operator]?: unknown\n}\n\nexport type Where = {\n [key: string]: Where[] | WhereField\n and?: Where[]\n or?: Where[]\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type Document = any\n\nexport type Operation = 'create' | 'delete' | 'read' | 'update'\nexport type VersionOperations = 'readVersions'\nexport type AuthOperations = 'unlock'\nexport type AllOperations = AuthOperations | Operation | VersionOperations\n\nexport function docHasTimestamps(doc: any): doc is TypeWithTimestamps {\n return doc?.createdAt && doc?.updatedAt\n}\n\nexport type IfAny<T, Y, N> = 0 extends 1 & T ? Y : N // This is a commonly used trick to detect 'any'\nexport type IsAny<T> = IfAny<T, true, false>\nexport type ReplaceAny<T, DefaultType> = IsAny<T> extends true ? DefaultType : T\n"],"names":["docHasTimestamps","doc","createdAt","updatedAt"],"rangeMappings":";;","mappings":"AA4GA,OAAO,SAASA,iBAAiBC,GAAQ;IACvC,OAAOA,KAAKC,aAAaD,KAAKE;AAChC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/uploads/getBaseFields.ts"],"sourcesContent":["import type { CollectionConfig } from '../collections/config/types.js'\nimport type { Config } from '../config/types.js'\nimport type { Field } from '../fields/config/types.js'\nimport type { UploadConfig } from './types.js'\n\nimport { mimeTypeValidator } from './mimeTypeValidator.js'\n\ntype GenerateURLArgs = {\n collectionSlug: string\n config: Config\n filename?: string\n}\nconst generateURL = ({ collectionSlug, config, filename }: GenerateURLArgs) => {\n if (filename) {\n return `${config.serverURL || ''}${config.routes.api || ''}/${collectionSlug}/file/${filename}`\n }\n return undefined\n}\n\ntype Options = {\n collection: CollectionConfig\n config: Config\n}\n\nexport const getBaseUploadFields = ({ collection, config }: Options): Field[] => {\n const uploadOptions: UploadConfig = typeof collection.upload === 'object' ? collection.upload : {}\n\n const mimeType: Field = {\n name: 'mimeType',\n type: 'text',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: 'MIME Type',\n }\n\n const thumbnailURL: Field = {\n name: 'thumbnailURL',\n type: 'text',\n admin: {\n hidden: true,\n readOnly: true,\n },\n hooks: {\n afterRead: [\n ({ originalDoc }) => {\n const adminThumbnail =\n typeof collection.upload !== 'boolean' ? collection.upload?.adminThumbnail : undefined\n\n if (typeof adminThumbnail === 'function') {\n return adminThumbnail({ doc: originalDoc })\n }\n\n if (\n typeof adminThumbnail === 'string' &&\n 'sizes' in originalDoc &&\n originalDoc.sizes?.[adminThumbnail]?.filename\n ) {\n return generateURL({\n collectionSlug: collection.slug,\n config,\n filename: originalDoc.sizes?.[adminThumbnail].filename as string,\n })\n }\n\n return null\n },\n ],\n },\n label: 'Thumbnail URL',\n }\n\n const width: Field = {\n name: 'width',\n type: 'number',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: ({ t }) => t('upload:width'),\n }\n\n const height: Field = {\n name: 'height',\n type: 'number',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: ({ t }) => t('upload:height'),\n }\n\n const filesize: Field = {\n name: 'filesize',\n type: 'number',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: ({ t }) => t('upload:fileSize'),\n }\n\n const filename: Field = {\n name: 'filename',\n type: 'text',\n admin: {\n disableBulkEdit: true,\n hidden: true,\n readOnly: true,\n },\n index: true,\n label: ({ t }) => t('upload:fileName'),\n unique: true,\n }\n\n const url: Field = {\n name: 'url',\n type: 'text',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: 'URL',\n }\n\n let uploadFields: Field[] = [\n {\n ...url,\n hooks: {\n afterRead: [\n ({ data, value }) => {\n if (value) return value\n\n return generateURL({\n collectionSlug: collection.slug,\n config,\n filename: data?.filename,\n })\n },\n ],\n },\n },\n thumbnailURL,\n filename,\n mimeType,\n filesize,\n width,\n height,\n ]\n\n if (uploadOptions.mimeTypes) {\n mimeType.validate = mimeTypeValidator(uploadOptions.mimeTypes)\n }\n\n if (uploadOptions.imageSizes) {\n uploadFields = uploadFields.concat([\n {\n name: 'sizes',\n type: 'group',\n admin: {\n hidden: true,\n },\n fields: uploadOptions.imageSizes.map((size) => ({\n name: size.name,\n type: 'group',\n admin: {\n hidden: true,\n },\n fields: [\n {\n ...url,\n hooks: {\n afterRead: [\n ({ data, value }) => {\n if (value) return value\n\n const sizeFilename = data?.sizes?.[size.name]?.filename\n\n if (sizeFilename) {\n return `${config.serverURL}${config.routes.api}/${collection.slug}/file/${sizeFilename}`\n }\n\n return null\n },\n ],\n },\n },\n width,\n height,\n mimeType,\n filesize,\n {\n ...filename,\n unique: false,\n },\n ],\n label: size.name,\n })),\n label: ({ t }) => t('upload:
|
|
1
|
+
{"version":3,"sources":["../../src/uploads/getBaseFields.ts"],"sourcesContent":["import type { CollectionConfig } from '../collections/config/types.js'\nimport type { Config } from '../config/types.js'\nimport type { Field } from '../fields/config/types.js'\nimport type { UploadConfig } from './types.js'\n\nimport { mimeTypeValidator } from './mimeTypeValidator.js'\n\ntype GenerateURLArgs = {\n collectionSlug: string\n config: Config\n filename?: string\n}\nconst generateURL = ({ collectionSlug, config, filename }: GenerateURLArgs) => {\n if (filename) {\n return `${config.serverURL || ''}${config.routes.api || ''}/${collectionSlug}/file/${filename}`\n }\n return undefined\n}\n\ntype Options = {\n collection: CollectionConfig\n config: Config\n}\n\nexport const getBaseUploadFields = ({ collection, config }: Options): Field[] => {\n const uploadOptions: UploadConfig = typeof collection.upload === 'object' ? collection.upload : {}\n\n const mimeType: Field = {\n name: 'mimeType',\n type: 'text',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: 'MIME Type',\n }\n\n const thumbnailURL: Field = {\n name: 'thumbnailURL',\n type: 'text',\n admin: {\n hidden: true,\n readOnly: true,\n },\n hooks: {\n afterRead: [\n ({ originalDoc }) => {\n const adminThumbnail =\n typeof collection.upload !== 'boolean' ? collection.upload?.adminThumbnail : undefined\n\n if (typeof adminThumbnail === 'function') {\n return adminThumbnail({ doc: originalDoc })\n }\n\n if (\n typeof adminThumbnail === 'string' &&\n 'sizes' in originalDoc &&\n originalDoc.sizes?.[adminThumbnail]?.filename\n ) {\n return generateURL({\n collectionSlug: collection.slug,\n config,\n filename: originalDoc.sizes?.[adminThumbnail].filename as string,\n })\n }\n\n return null\n },\n ],\n },\n label: 'Thumbnail URL',\n }\n\n const width: Field = {\n name: 'width',\n type: 'number',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: ({ t }) => t('upload:width'),\n }\n\n const height: Field = {\n name: 'height',\n type: 'number',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: ({ t }) => t('upload:height'),\n }\n\n const filesize: Field = {\n name: 'filesize',\n type: 'number',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: ({ t }) => t('upload:fileSize'),\n }\n\n const filename: Field = {\n name: 'filename',\n type: 'text',\n admin: {\n disableBulkEdit: true,\n hidden: true,\n readOnly: true,\n },\n index: true,\n label: ({ t }) => t('upload:fileName'),\n unique: true,\n }\n\n const url: Field = {\n name: 'url',\n type: 'text',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: 'URL',\n }\n\n let uploadFields: Field[] = [\n {\n ...url,\n hooks: {\n afterRead: [\n ({ data, value }) => {\n if (value) return value\n\n return generateURL({\n collectionSlug: collection.slug,\n config,\n filename: data?.filename,\n })\n },\n ],\n },\n },\n thumbnailURL,\n filename,\n mimeType,\n filesize,\n width,\n height,\n ]\n\n if (uploadOptions.mimeTypes) {\n mimeType.validate = mimeTypeValidator(uploadOptions.mimeTypes)\n }\n\n if (uploadOptions.imageSizes) {\n uploadFields = uploadFields.concat([\n {\n name: 'sizes',\n type: 'group',\n admin: {\n hidden: true,\n },\n fields: uploadOptions.imageSizes.map((size) => ({\n name: size.name,\n type: 'group',\n admin: {\n hidden: true,\n },\n fields: [\n {\n ...url,\n hooks: {\n afterRead: [\n ({ data, value }) => {\n if (value) return value\n\n const sizeFilename = data?.sizes?.[size.name]?.filename\n\n if (sizeFilename) {\n return `${config.serverURL}${config.routes.api}/${collection.slug}/file/${sizeFilename}`\n }\n\n return null\n },\n ],\n },\n },\n width,\n height,\n mimeType,\n filesize,\n {\n ...filename,\n unique: false,\n },\n ],\n label: size.name,\n })),\n label: ({ t }) => t('upload:sizes'),\n },\n ])\n }\n return uploadFields\n}\n"],"names":["mimeTypeValidator","generateURL","collectionSlug","config","filename","serverURL","routes","api","undefined","getBaseUploadFields","collection","uploadOptions","upload","mimeType","name","type","admin","hidden","readOnly","label","thumbnailURL","hooks","afterRead","originalDoc","adminThumbnail","doc","sizes","slug","width","t","height","filesize","disableBulkEdit","index","unique","url","uploadFields","data","value","mimeTypes","validate","imageSizes","concat","fields","map","size","sizeFilename"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configToJSONSchema.d.ts","sourceRoot":"","sources":["../../src/utilities/configToJSONSchema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAKnE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAE,KAAK,EAA8B,MAAM,2BAA2B,CAAA;AAClF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAwGvE;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,mBAAmB,EAC9B,UAAU,EAAE,OAAO,GAClB,mBAAmB,GAAG,mBAAmB,EAAE,CAK7C;AAED,wBAAgB,kBAAkB;AAChC;;;;GAIG;AACH,sBAAsB,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAA;CAAE,EAC9D,MAAM,EAAE,KAAK,EAAE;AACf;;GAEG;AACH,wBAAwB,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EAClD,MAAM,CAAC,EAAE,eAAe,GACvB;IACD,UAAU,EAAE;QACV,CAAC,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;KACzB,CAAA;IACD,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB,
|
|
1
|
+
{"version":3,"file":"configToJSONSchema.d.ts","sourceRoot":"","sources":["../../src/utilities/configToJSONSchema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAKnE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAE,KAAK,EAA8B,MAAM,2BAA2B,CAAA;AAClF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAwGvE;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,mBAAmB,EAC9B,UAAU,EAAE,OAAO,GAClB,mBAAmB,GAAG,mBAAmB,EAAE,CAK7C;AAED,wBAAgB,kBAAkB;AAChC;;;;GAIG;AACH,sBAAsB,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAA;CAAE,EAC9D,MAAM,EAAE,KAAK,EAAE;AACf;;GAEG;AACH,wBAAwB,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EAClD,MAAM,CAAC,EAAE,eAAe,GACvB;IACD,UAAU,EAAE;QACV,CAAC,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;KACzB,CAAA;IACD,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB,CA4XA;AAGD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,eAAe,EACvB,cAAc,EAAE,yBAAyB,GAAG,qBAAqB,EACjE,wBAAwB,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EAClD,aAAa,EAAE,QAAQ,GAAG,MAAM,GAC/B,WAAW,CA8Cb;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,eAAe,EACvB,aAAa,CAAC,EAAE,QAAQ,GAAG,MAAM,GAChC,WAAW,CA4Bb"}
|
|
@@ -431,7 +431,11 @@ export function fieldsToJSONSchema(/**
|
|
|
431
431
|
additionalProperties: false,
|
|
432
432
|
...childSchema
|
|
433
433
|
});
|
|
434
|
-
|
|
434
|
+
// If the named tab has any required fields then we mark this as required otherwise it should be optional
|
|
435
|
+
const hasRequiredFields = tab.fields.some((subField)=>fieldIsRequired(subField));
|
|
436
|
+
if (hasRequiredFields) {
|
|
437
|
+
requiredFieldNames.add(tab.name);
|
|
438
|
+
}
|
|
435
439
|
} else {
|
|
436
440
|
Object.entries(childSchema.properties).forEach(([propName, propSchema])=>{
|
|
437
441
|
fieldSchemas.set(propName, propSchema);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/configToJSONSchema.ts"],"sourcesContent":["import type { JSONSchema4, JSONSchema4TypeName } from 'json-schema'\n\nimport pluralize from 'pluralize'\nconst { singular } = pluralize\n\nimport type { SanitizedCollectionConfig } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { Field, FieldAffectingData, Option } from '../fields/config/types.js'\nimport type { SanitizedGlobalConfig } from '../globals/config/types.js'\n\nimport { fieldAffectsData, tabHasName } from '../fields/config/types.js'\nimport { deepCopyObject } from './deepCopyObject.js'\nimport { toWords } from './formatLabels.js'\nimport { getCollectionIDFieldTypes } from './getCollectionIDFieldTypes.js'\n\nconst fieldIsRequired = (field: Field) => {\n const isConditional = Boolean(field?.admin && field?.admin?.condition)\n if (isConditional) return false\n\n const isMarkedRequired = 'required' in field && field.required === true\n if (fieldAffectsData(field) && isMarkedRequired) return true\n\n // if any subfields are required, this field is required\n if ('fields' in field && field.type !== 'array') {\n return field.fields.some((subField) => fieldIsRequired(subField))\n }\n\n // if any tab subfields have required fields, this field is required\n if (field.type === 'tabs') {\n return field.tabs.some((tab) => {\n if ('name' in tab) {\n return tab.fields.some((subField) => fieldIsRequired(subField))\n }\n return false\n })\n }\n\n return false\n}\n\nfunction buildOptionEnums(options: Option[]): string[] {\n return options.map((option) => {\n if (typeof option === 'object' && 'value' in option) {\n return option.value\n }\n\n return option\n })\n}\n\nfunction generateEntitySchemas(\n entities: (SanitizedCollectionConfig | SanitizedGlobalConfig)[],\n): JSONSchema4 {\n const properties = [...entities].reduce((acc, { slug }) => {\n acc[slug] = {\n $ref: `#/definitions/${slug}`,\n }\n\n return acc\n }, {})\n\n return {\n type: 'object',\n additionalProperties: false,\n properties,\n required: Object.keys(properties),\n }\n}\n\nfunction generateLocaleEntitySchemas(localization: SanitizedConfig['localization']): JSONSchema4 {\n if (localization && 'locales' in localization && localization?.locales) {\n const localesFromConfig = localization?.locales\n\n const locales = [...localesFromConfig].map((locale) => {\n return locale.code\n }, [])\n\n return {\n type: 'string',\n enum: locales,\n }\n }\n\n return {\n type: 'null',\n }\n}\n\nfunction generateAuthEntitySchemas(entities: SanitizedCollectionConfig[]): JSONSchema4 {\n const properties: JSONSchema4[] = [...entities]\n .filter(({ auth }) => Boolean(auth))\n .map(({ slug }) => {\n return {\n allOf: [\n { $ref: `#/definitions/${slug}` },\n {\n type: 'object',\n additionalProperties: false,\n properties: {\n collection: { type: 'string', enum: [slug] },\n },\n required: ['collection'],\n },\n ],\n }\n }, {})\n\n return {\n oneOf: properties,\n }\n}\n\n/**\n * Returns a JSON Schema Type with 'null' added if the field is not required.\n */\nexport function withNullableJSONSchemaType(\n fieldType: JSONSchema4TypeName,\n isRequired: boolean,\n): JSONSchema4TypeName | JSONSchema4TypeName[] {\n const fieldTypes = [fieldType]\n if (isRequired) return fieldType\n fieldTypes.push('null')\n return fieldTypes\n}\n\nexport function fieldsToJSONSchema(\n /**\n * Used for relationship fields, to determine whether to use a string or number type for the ID.\n * While there is a default ID field type set by the db adapter, they can differ on a collection-level\n * if they have custom ID fields.\n */\n collectionIDFieldTypes: { [key: string]: 'number' | 'string' },\n fields: Field[],\n /**\n * Allows you to define new top-level interfaces that can be re-used in the output schema.\n */\n interfaceNameDefinitions: Map<string, JSONSchema4>,\n config?: SanitizedConfig,\n): {\n properties: {\n [k: string]: JSONSchema4\n }\n required: string[]\n} {\n const requiredFieldNames = new Set<string>()\n\n return {\n properties: Object.fromEntries(\n fields.reduce((fieldSchemas, field) => {\n const isRequired = fieldAffectsData(field) && fieldIsRequired(field)\n if (isRequired) requiredFieldNames.add(field.name)\n\n let fieldSchema: JSONSchema4\n switch (field.type) {\n case 'text':\n if (field.hasMany === true) {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: { type: 'string' },\n }\n } else {\n fieldSchema = { type: withNullableJSONSchemaType('string', isRequired) }\n }\n break\n case 'textarea':\n case 'code':\n case 'email':\n case 'date': {\n fieldSchema = { type: withNullableJSONSchemaType('string', isRequired) }\n break\n }\n\n case 'number': {\n if (field.hasMany === true) {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: { type: 'number' },\n }\n } else {\n fieldSchema = { type: withNullableJSONSchemaType('number', isRequired) }\n }\n break\n }\n\n case 'checkbox': {\n fieldSchema = { type: withNullableJSONSchemaType('boolean', isRequired) }\n break\n }\n\n case 'json': {\n fieldSchema = {\n type: ['object', 'array', 'string', 'number', 'boolean', 'null'],\n }\n break\n }\n\n case 'richText': {\n if (typeof field.editor === 'function') {\n throw new Error('Attempted to access unsanitized rich text editor.')\n }\n if (field.editor.outputSchema) {\n fieldSchema = field.editor.outputSchema({\n collectionIDFieldTypes,\n config,\n field,\n interfaceNameDefinitions,\n isRequired,\n })\n } else {\n // Maintain backwards compatibility with existing rich text editors\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n type: 'object',\n },\n }\n }\n\n break\n }\n\n case 'radio': {\n fieldSchema = {\n type: withNullableJSONSchemaType('string', isRequired),\n enum: buildOptionEnums(field.options),\n }\n\n break\n }\n\n case 'select': {\n const optionEnums = buildOptionEnums(field.options)\n\n if (field.hasMany) {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n type: 'string',\n enum: optionEnums,\n },\n }\n } else {\n fieldSchema = {\n type: withNullableJSONSchemaType('string', isRequired),\n enum: optionEnums,\n }\n }\n\n break\n }\n\n case 'point': {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: [\n {\n type: 'number',\n },\n {\n type: 'number',\n },\n ],\n maxItems: 2,\n minItems: 2,\n }\n break\n }\n\n case 'relationship': {\n if (Array.isArray(field.relationTo)) {\n if (field.hasMany) {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n oneOf: field.relationTo.map((relation) => {\n return {\n type: 'object',\n additionalProperties: false,\n properties: {\n relationTo: {\n const: relation,\n },\n value: {\n oneOf: [\n {\n type: collectionIDFieldTypes[relation],\n },\n {\n $ref: `#/definitions/${relation}`,\n },\n ],\n },\n },\n required: ['value', 'relationTo'],\n }\n }),\n },\n }\n } else {\n fieldSchema = {\n oneOf: field.relationTo.map((relation) => {\n return {\n type: withNullableJSONSchemaType('object', isRequired),\n additionalProperties: false,\n properties: {\n relationTo: {\n const: relation,\n },\n value: {\n oneOf: [\n {\n type: collectionIDFieldTypes[relation],\n },\n {\n $ref: `#/definitions/${relation}`,\n },\n ],\n },\n },\n required: ['value', 'relationTo'],\n }\n }),\n }\n }\n } else if (field.hasMany) {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n oneOf: [\n {\n type: collectionIDFieldTypes[field.relationTo],\n },\n {\n $ref: `#/definitions/${field.relationTo}`,\n },\n ],\n },\n }\n } else {\n fieldSchema = {\n oneOf: [\n {\n type: withNullableJSONSchemaType(\n collectionIDFieldTypes[field.relationTo],\n isRequired,\n ),\n },\n {\n $ref: `#/definitions/${field.relationTo}`,\n },\n ],\n }\n }\n\n break\n }\n\n case 'upload': {\n fieldSchema = {\n oneOf: [\n {\n type: collectionIDFieldTypes[field.relationTo],\n },\n {\n $ref: `#/definitions/${field.relationTo}`,\n },\n ],\n }\n if (!isRequired) fieldSchema.oneOf.push({ type: 'null' })\n break\n }\n\n case 'blocks': {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n oneOf: field.blocks.map((block) => {\n const blockFieldSchemas = fieldsToJSONSchema(\n collectionIDFieldTypes,\n block.fields,\n interfaceNameDefinitions,\n config,\n )\n\n const blockSchema: JSONSchema4 = {\n type: 'object',\n additionalProperties: false,\n properties: {\n ...blockFieldSchemas.properties,\n blockType: {\n const: block.slug,\n },\n },\n required: ['blockType', ...blockFieldSchemas.required],\n }\n\n if (block.interfaceName) {\n interfaceNameDefinitions.set(block.interfaceName, blockSchema)\n\n return {\n $ref: `#/definitions/${block.interfaceName}`,\n }\n }\n\n return blockSchema\n }),\n },\n }\n break\n }\n\n case 'array': {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n type: 'object',\n additionalProperties: false,\n ...fieldsToJSONSchema(\n collectionIDFieldTypes,\n field.fields,\n interfaceNameDefinitions,\n config,\n ),\n },\n }\n\n if (field.interfaceName) {\n interfaceNameDefinitions.set(field.interfaceName, fieldSchema)\n\n fieldSchema = {\n $ref: `#/definitions/${field.interfaceName}`,\n }\n }\n break\n }\n\n case 'row':\n case 'collapsible': {\n const childSchema = fieldsToJSONSchema(\n collectionIDFieldTypes,\n field.fields,\n interfaceNameDefinitions,\n config,\n )\n Object.entries(childSchema.properties).forEach(([propName, propSchema]) => {\n fieldSchemas.set(propName, propSchema)\n })\n childSchema.required.forEach((propName) => {\n requiredFieldNames.add(propName)\n })\n break\n }\n\n case 'tabs': {\n field.tabs.forEach((tab) => {\n const childSchema = fieldsToJSONSchema(\n collectionIDFieldTypes,\n tab.fields,\n interfaceNameDefinitions,\n config,\n )\n if (tabHasName(tab)) {\n // could have interface\n fieldSchemas.set(tab.name, {\n type: 'object',\n additionalProperties: false,\n ...childSchema,\n })\n requiredFieldNames.add(tab.name)\n } else {\n Object.entries(childSchema.properties).forEach(([propName, propSchema]) => {\n fieldSchemas.set(propName, propSchema)\n })\n childSchema.required.forEach((propName) => {\n requiredFieldNames.add(propName)\n })\n }\n })\n break\n }\n\n case 'group': {\n fieldSchema = {\n type: 'object',\n additionalProperties: false,\n ...fieldsToJSONSchema(\n collectionIDFieldTypes,\n field.fields,\n interfaceNameDefinitions,\n config,\n ),\n }\n\n if (field.interfaceName) {\n interfaceNameDefinitions.set(field.interfaceName, fieldSchema)\n\n fieldSchema = {\n $ref: `#/definitions/${field.interfaceName}`,\n }\n }\n break\n }\n\n default: {\n break\n }\n }\n\n if (fieldSchema && fieldAffectsData(field)) {\n fieldSchemas.set(field.name, fieldSchema)\n }\n\n return fieldSchemas\n }, new Map<string, JSONSchema4>()),\n ),\n required: Array.from(requiredFieldNames),\n }\n}\n\n// This function is part of the public API and is exported through payload/utilities\nexport function entityToJSONSchema(\n config: SanitizedConfig,\n incomingEntity: SanitizedCollectionConfig | SanitizedGlobalConfig,\n interfaceNameDefinitions: Map<string, JSONSchema4>,\n defaultIDType: 'number' | 'text',\n): JSONSchema4 {\n const entity: SanitizedCollectionConfig | SanitizedGlobalConfig = deepCopyObject(incomingEntity)\n const title = entity.typescript?.interface\n ? entity.typescript.interface\n : singular(toWords(entity.slug, true))\n\n const idField: FieldAffectingData = { name: 'id', type: defaultIDType as 'text', required: true }\n const customIdField = entity.fields.find(\n (field) => fieldAffectsData(field) && field.name === 'id',\n ) as FieldAffectingData\n\n if (customIdField && customIdField.type !== 'group' && customIdField.type !== 'tab') {\n customIdField.required = true\n } else {\n entity.fields.unshift(idField)\n }\n\n // mark timestamp fields required\n if ('timestamps' in entity && entity.timestamps !== false) {\n entity.fields = entity.fields.map((field) => {\n if (fieldAffectsData(field) && (field.name === 'createdAt' || field.name === 'updatedAt')) {\n return {\n ...field,\n required: true,\n }\n }\n return field\n })\n }\n\n if ('auth' in entity && entity.auth && !entity.auth?.disableLocalStrategy) {\n entity.fields.push({\n name: 'password',\n type: 'text',\n })\n }\n\n // Used for relationship fields, to determine whether to use a string or number type for the ID.\n const collectionIDFieldTypes = getCollectionIDFieldTypes({ config, defaultIDType })\n\n return {\n type: 'object',\n additionalProperties: false,\n title,\n ...fieldsToJSONSchema(collectionIDFieldTypes, entity.fields, interfaceNameDefinitions, config),\n }\n}\n\n/**\n * This is used for generating the TypeScript types (payload-types.ts) with the payload generate:types command.\n */\nexport function configToJSONSchema(\n config: SanitizedConfig,\n defaultIDType?: 'number' | 'text',\n): JSONSchema4 {\n // a mutable Map to store custom top-level `interfaceName` types. Fields with an `interfaceName` property will be moved to the top-level definitions here\n const interfaceNameDefinitions: Map<string, JSONSchema4> = new Map()\n\n // Collections and Globals have to be moved to the top-level definitions as well. Reason: The top-level type will be the `Config` type - we don't want all collection and global\n // types to be inlined inside the `Config` type\n const entityDefinitions: { [k: string]: JSONSchema4 } = [\n ...config.globals,\n ...config.collections,\n ].reduce((acc, entity) => {\n acc[entity.slug] = entityToJSONSchema(config, entity, interfaceNameDefinitions, defaultIDType)\n return acc\n }, {})\n\n return {\n additionalProperties: false,\n definitions: { ...entityDefinitions, ...Object.fromEntries(interfaceNameDefinitions) },\n // These properties here will be very simple, as all the complexity is in the definitions. These are just the properties for the top-level `Config` type\n type: 'object',\n properties: {\n collections: generateEntitySchemas(config.collections || []),\n globals: generateEntitySchemas(config.globals || []),\n locale: generateLocaleEntitySchemas(config.localization),\n user: generateAuthEntitySchemas(config.collections),\n },\n required: ['user', 'locale', 'collections', 'globals'],\n title: 'Config',\n }\n}\n"],"names":["pluralize","singular","fieldAffectsData","tabHasName","deepCopyObject","toWords","getCollectionIDFieldTypes","fieldIsRequired","field","isConditional","Boolean","admin","condition","isMarkedRequired","required","type","fields","some","subField","tabs","tab","buildOptionEnums","options","map","option","value","generateEntitySchemas","entities","properties","reduce","acc","slug","$ref","additionalProperties","Object","keys","generateLocaleEntitySchemas","localization","locales","localesFromConfig","locale","code","enum","generateAuthEntitySchemas","filter","auth","allOf","collection","oneOf","withNullableJSONSchemaType","fieldType","isRequired","fieldTypes","push","fieldsToJSONSchema","collectionIDFieldTypes","interfaceNameDefinitions","config","requiredFieldNames","Set","fromEntries","fieldSchemas","add","name","fieldSchema","hasMany","items","editor","Error","outputSchema","optionEnums","maxItems","minItems","Array","isArray","relationTo","relation","const","blocks","block","blockFieldSchemas","blockSchema","blockType","interfaceName","set","childSchema","entries","forEach","propName","propSchema","Map","from","entityToJSONSchema","incomingEntity","defaultIDType","entity","title","typescript","interface","idField","customIdField","find","unshift","timestamps","disableLocalStrategy","configToJSONSchema","entityDefinitions","globals","collections","definitions","user"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/configToJSONSchema.ts"],"sourcesContent":["import type { JSONSchema4, JSONSchema4TypeName } from 'json-schema'\n\nimport pluralize from 'pluralize'\nconst { singular } = pluralize\n\nimport type { SanitizedCollectionConfig } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { Field, FieldAffectingData, Option } from '../fields/config/types.js'\nimport type { SanitizedGlobalConfig } from '../globals/config/types.js'\n\nimport { fieldAffectsData, tabHasName } from '../fields/config/types.js'\nimport { deepCopyObject } from './deepCopyObject.js'\nimport { toWords } from './formatLabels.js'\nimport { getCollectionIDFieldTypes } from './getCollectionIDFieldTypes.js'\n\nconst fieldIsRequired = (field: Field) => {\n const isConditional = Boolean(field?.admin && field?.admin?.condition)\n if (isConditional) return false\n\n const isMarkedRequired = 'required' in field && field.required === true\n if (fieldAffectsData(field) && isMarkedRequired) return true\n\n // if any subfields are required, this field is required\n if ('fields' in field && field.type !== 'array') {\n return field.fields.some((subField) => fieldIsRequired(subField))\n }\n\n // if any tab subfields have required fields, this field is required\n if (field.type === 'tabs') {\n return field.tabs.some((tab) => {\n if ('name' in tab) {\n return tab.fields.some((subField) => fieldIsRequired(subField))\n }\n return false\n })\n }\n\n return false\n}\n\nfunction buildOptionEnums(options: Option[]): string[] {\n return options.map((option) => {\n if (typeof option === 'object' && 'value' in option) {\n return option.value\n }\n\n return option\n })\n}\n\nfunction generateEntitySchemas(\n entities: (SanitizedCollectionConfig | SanitizedGlobalConfig)[],\n): JSONSchema4 {\n const properties = [...entities].reduce((acc, { slug }) => {\n acc[slug] = {\n $ref: `#/definitions/${slug}`,\n }\n\n return acc\n }, {})\n\n return {\n type: 'object',\n additionalProperties: false,\n properties,\n required: Object.keys(properties),\n }\n}\n\nfunction generateLocaleEntitySchemas(localization: SanitizedConfig['localization']): JSONSchema4 {\n if (localization && 'locales' in localization && localization?.locales) {\n const localesFromConfig = localization?.locales\n\n const locales = [...localesFromConfig].map((locale) => {\n return locale.code\n }, [])\n\n return {\n type: 'string',\n enum: locales,\n }\n }\n\n return {\n type: 'null',\n }\n}\n\nfunction generateAuthEntitySchemas(entities: SanitizedCollectionConfig[]): JSONSchema4 {\n const properties: JSONSchema4[] = [...entities]\n .filter(({ auth }) => Boolean(auth))\n .map(({ slug }) => {\n return {\n allOf: [\n { $ref: `#/definitions/${slug}` },\n {\n type: 'object',\n additionalProperties: false,\n properties: {\n collection: { type: 'string', enum: [slug] },\n },\n required: ['collection'],\n },\n ],\n }\n }, {})\n\n return {\n oneOf: properties,\n }\n}\n\n/**\n * Returns a JSON Schema Type with 'null' added if the field is not required.\n */\nexport function withNullableJSONSchemaType(\n fieldType: JSONSchema4TypeName,\n isRequired: boolean,\n): JSONSchema4TypeName | JSONSchema4TypeName[] {\n const fieldTypes = [fieldType]\n if (isRequired) return fieldType\n fieldTypes.push('null')\n return fieldTypes\n}\n\nexport function fieldsToJSONSchema(\n /**\n * Used for relationship fields, to determine whether to use a string or number type for the ID.\n * While there is a default ID field type set by the db adapter, they can differ on a collection-level\n * if they have custom ID fields.\n */\n collectionIDFieldTypes: { [key: string]: 'number' | 'string' },\n fields: Field[],\n /**\n * Allows you to define new top-level interfaces that can be re-used in the output schema.\n */\n interfaceNameDefinitions: Map<string, JSONSchema4>,\n config?: SanitizedConfig,\n): {\n properties: {\n [k: string]: JSONSchema4\n }\n required: string[]\n} {\n const requiredFieldNames = new Set<string>()\n\n return {\n properties: Object.fromEntries(\n fields.reduce((fieldSchemas, field) => {\n const isRequired = fieldAffectsData(field) && fieldIsRequired(field)\n if (isRequired) requiredFieldNames.add(field.name)\n\n let fieldSchema: JSONSchema4\n switch (field.type) {\n case 'text':\n if (field.hasMany === true) {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: { type: 'string' },\n }\n } else {\n fieldSchema = { type: withNullableJSONSchemaType('string', isRequired) }\n }\n break\n case 'textarea':\n case 'code':\n case 'email':\n case 'date': {\n fieldSchema = { type: withNullableJSONSchemaType('string', isRequired) }\n break\n }\n\n case 'number': {\n if (field.hasMany === true) {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: { type: 'number' },\n }\n } else {\n fieldSchema = { type: withNullableJSONSchemaType('number', isRequired) }\n }\n break\n }\n\n case 'checkbox': {\n fieldSchema = { type: withNullableJSONSchemaType('boolean', isRequired) }\n break\n }\n\n case 'json': {\n fieldSchema = {\n type: ['object', 'array', 'string', 'number', 'boolean', 'null'],\n }\n break\n }\n\n case 'richText': {\n if (typeof field.editor === 'function') {\n throw new Error('Attempted to access unsanitized rich text editor.')\n }\n if (field.editor.outputSchema) {\n fieldSchema = field.editor.outputSchema({\n collectionIDFieldTypes,\n config,\n field,\n interfaceNameDefinitions,\n isRequired,\n })\n } else {\n // Maintain backwards compatibility with existing rich text editors\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n type: 'object',\n },\n }\n }\n\n break\n }\n\n case 'radio': {\n fieldSchema = {\n type: withNullableJSONSchemaType('string', isRequired),\n enum: buildOptionEnums(field.options),\n }\n\n break\n }\n\n case 'select': {\n const optionEnums = buildOptionEnums(field.options)\n\n if (field.hasMany) {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n type: 'string',\n enum: optionEnums,\n },\n }\n } else {\n fieldSchema = {\n type: withNullableJSONSchemaType('string', isRequired),\n enum: optionEnums,\n }\n }\n\n break\n }\n\n case 'point': {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: [\n {\n type: 'number',\n },\n {\n type: 'number',\n },\n ],\n maxItems: 2,\n minItems: 2,\n }\n break\n }\n\n case 'relationship': {\n if (Array.isArray(field.relationTo)) {\n if (field.hasMany) {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n oneOf: field.relationTo.map((relation) => {\n return {\n type: 'object',\n additionalProperties: false,\n properties: {\n relationTo: {\n const: relation,\n },\n value: {\n oneOf: [\n {\n type: collectionIDFieldTypes[relation],\n },\n {\n $ref: `#/definitions/${relation}`,\n },\n ],\n },\n },\n required: ['value', 'relationTo'],\n }\n }),\n },\n }\n } else {\n fieldSchema = {\n oneOf: field.relationTo.map((relation) => {\n return {\n type: withNullableJSONSchemaType('object', isRequired),\n additionalProperties: false,\n properties: {\n relationTo: {\n const: relation,\n },\n value: {\n oneOf: [\n {\n type: collectionIDFieldTypes[relation],\n },\n {\n $ref: `#/definitions/${relation}`,\n },\n ],\n },\n },\n required: ['value', 'relationTo'],\n }\n }),\n }\n }\n } else if (field.hasMany) {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n oneOf: [\n {\n type: collectionIDFieldTypes[field.relationTo],\n },\n {\n $ref: `#/definitions/${field.relationTo}`,\n },\n ],\n },\n }\n } else {\n fieldSchema = {\n oneOf: [\n {\n type: withNullableJSONSchemaType(\n collectionIDFieldTypes[field.relationTo],\n isRequired,\n ),\n },\n {\n $ref: `#/definitions/${field.relationTo}`,\n },\n ],\n }\n }\n\n break\n }\n\n case 'upload': {\n fieldSchema = {\n oneOf: [\n {\n type: collectionIDFieldTypes[field.relationTo],\n },\n {\n $ref: `#/definitions/${field.relationTo}`,\n },\n ],\n }\n if (!isRequired) fieldSchema.oneOf.push({ type: 'null' })\n break\n }\n\n case 'blocks': {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n oneOf: field.blocks.map((block) => {\n const blockFieldSchemas = fieldsToJSONSchema(\n collectionIDFieldTypes,\n block.fields,\n interfaceNameDefinitions,\n config,\n )\n\n const blockSchema: JSONSchema4 = {\n type: 'object',\n additionalProperties: false,\n properties: {\n ...blockFieldSchemas.properties,\n blockType: {\n const: block.slug,\n },\n },\n required: ['blockType', ...blockFieldSchemas.required],\n }\n\n if (block.interfaceName) {\n interfaceNameDefinitions.set(block.interfaceName, blockSchema)\n\n return {\n $ref: `#/definitions/${block.interfaceName}`,\n }\n }\n\n return blockSchema\n }),\n },\n }\n break\n }\n\n case 'array': {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n type: 'object',\n additionalProperties: false,\n ...fieldsToJSONSchema(\n collectionIDFieldTypes,\n field.fields,\n interfaceNameDefinitions,\n config,\n ),\n },\n }\n\n if (field.interfaceName) {\n interfaceNameDefinitions.set(field.interfaceName, fieldSchema)\n\n fieldSchema = {\n $ref: `#/definitions/${field.interfaceName}`,\n }\n }\n break\n }\n\n case 'row':\n case 'collapsible': {\n const childSchema = fieldsToJSONSchema(\n collectionIDFieldTypes,\n field.fields,\n interfaceNameDefinitions,\n config,\n )\n Object.entries(childSchema.properties).forEach(([propName, propSchema]) => {\n fieldSchemas.set(propName, propSchema)\n })\n childSchema.required.forEach((propName) => {\n requiredFieldNames.add(propName)\n })\n break\n }\n\n case 'tabs': {\n field.tabs.forEach((tab) => {\n const childSchema = fieldsToJSONSchema(\n collectionIDFieldTypes,\n tab.fields,\n interfaceNameDefinitions,\n config,\n )\n if (tabHasName(tab)) {\n // could have interface\n fieldSchemas.set(tab.name, {\n type: 'object',\n additionalProperties: false,\n ...childSchema,\n })\n\n // If the named tab has any required fields then we mark this as required otherwise it should be optional\n const hasRequiredFields = tab.fields.some((subField) => fieldIsRequired(subField))\n\n if (hasRequiredFields) {\n requiredFieldNames.add(tab.name)\n }\n } else {\n Object.entries(childSchema.properties).forEach(([propName, propSchema]) => {\n fieldSchemas.set(propName, propSchema)\n })\n childSchema.required.forEach((propName) => {\n requiredFieldNames.add(propName)\n })\n }\n })\n break\n }\n\n case 'group': {\n fieldSchema = {\n type: 'object',\n additionalProperties: false,\n ...fieldsToJSONSchema(\n collectionIDFieldTypes,\n field.fields,\n interfaceNameDefinitions,\n config,\n ),\n }\n\n if (field.interfaceName) {\n interfaceNameDefinitions.set(field.interfaceName, fieldSchema)\n\n fieldSchema = {\n $ref: `#/definitions/${field.interfaceName}`,\n }\n }\n break\n }\n\n default: {\n break\n }\n }\n\n if (fieldSchema && fieldAffectsData(field)) {\n fieldSchemas.set(field.name, fieldSchema)\n }\n\n return fieldSchemas\n }, new Map<string, JSONSchema4>()),\n ),\n required: Array.from(requiredFieldNames),\n }\n}\n\n// This function is part of the public API and is exported through payload/utilities\nexport function entityToJSONSchema(\n config: SanitizedConfig,\n incomingEntity: SanitizedCollectionConfig | SanitizedGlobalConfig,\n interfaceNameDefinitions: Map<string, JSONSchema4>,\n defaultIDType: 'number' | 'text',\n): JSONSchema4 {\n const entity: SanitizedCollectionConfig | SanitizedGlobalConfig = deepCopyObject(incomingEntity)\n const title = entity.typescript?.interface\n ? entity.typescript.interface\n : singular(toWords(entity.slug, true))\n\n const idField: FieldAffectingData = { name: 'id', type: defaultIDType as 'text', required: true }\n const customIdField = entity.fields.find(\n (field) => fieldAffectsData(field) && field.name === 'id',\n ) as FieldAffectingData\n\n if (customIdField && customIdField.type !== 'group' && customIdField.type !== 'tab') {\n customIdField.required = true\n } else {\n entity.fields.unshift(idField)\n }\n\n // mark timestamp fields required\n if ('timestamps' in entity && entity.timestamps !== false) {\n entity.fields = entity.fields.map((field) => {\n if (fieldAffectsData(field) && (field.name === 'createdAt' || field.name === 'updatedAt')) {\n return {\n ...field,\n required: true,\n }\n }\n return field\n })\n }\n\n if ('auth' in entity && entity.auth && !entity.auth?.disableLocalStrategy) {\n entity.fields.push({\n name: 'password',\n type: 'text',\n })\n }\n\n // Used for relationship fields, to determine whether to use a string or number type for the ID.\n const collectionIDFieldTypes = getCollectionIDFieldTypes({ config, defaultIDType })\n\n return {\n type: 'object',\n additionalProperties: false,\n title,\n ...fieldsToJSONSchema(collectionIDFieldTypes, entity.fields, interfaceNameDefinitions, config),\n }\n}\n\n/**\n * This is used for generating the TypeScript types (payload-types.ts) with the payload generate:types command.\n */\nexport function configToJSONSchema(\n config: SanitizedConfig,\n defaultIDType?: 'number' | 'text',\n): JSONSchema4 {\n // a mutable Map to store custom top-level `interfaceName` types. Fields with an `interfaceName` property will be moved to the top-level definitions here\n const interfaceNameDefinitions: Map<string, JSONSchema4> = new Map()\n\n // Collections and Globals have to be moved to the top-level definitions as well. Reason: The top-level type will be the `Config` type - we don't want all collection and global\n // types to be inlined inside the `Config` type\n const entityDefinitions: { [k: string]: JSONSchema4 } = [\n ...config.globals,\n ...config.collections,\n ].reduce((acc, entity) => {\n acc[entity.slug] = entityToJSONSchema(config, entity, interfaceNameDefinitions, defaultIDType)\n return acc\n }, {})\n\n return {\n additionalProperties: false,\n definitions: { ...entityDefinitions, ...Object.fromEntries(interfaceNameDefinitions) },\n // These properties here will be very simple, as all the complexity is in the definitions. These are just the properties for the top-level `Config` type\n type: 'object',\n properties: {\n collections: generateEntitySchemas(config.collections || []),\n globals: generateEntitySchemas(config.globals || []),\n locale: generateLocaleEntitySchemas(config.localization),\n user: generateAuthEntitySchemas(config.collections),\n },\n required: ['user', 'locale', 'collections', 'globals'],\n title: 'Config',\n }\n}\n"],"names":["pluralize","singular","fieldAffectsData","tabHasName","deepCopyObject","toWords","getCollectionIDFieldTypes","fieldIsRequired","field","isConditional","Boolean","admin","condition","isMarkedRequired","required","type","fields","some","subField","tabs","tab","buildOptionEnums","options","map","option","value","generateEntitySchemas","entities","properties","reduce","acc","slug","$ref","additionalProperties","Object","keys","generateLocaleEntitySchemas","localization","locales","localesFromConfig","locale","code","enum","generateAuthEntitySchemas","filter","auth","allOf","collection","oneOf","withNullableJSONSchemaType","fieldType","isRequired","fieldTypes","push","fieldsToJSONSchema","collectionIDFieldTypes","interfaceNameDefinitions","config","requiredFieldNames","Set","fromEntries","fieldSchemas","add","name","fieldSchema","hasMany","items","editor","Error","outputSchema","optionEnums","maxItems","minItems","Array","isArray","relationTo","relation","const","blocks","block","blockFieldSchemas","blockSchema","blockType","interfaceName","set","childSchema","entries","forEach","propName","propSchema","hasRequiredFields","Map","from","entityToJSONSchema","incomingEntity","defaultIDType","entity","title","typescript","interface","idField","customIdField","find","unshift","timestamps","disableLocalStrategy","configToJSONSchema","entityDefinitions","globals","collections","definitions","user"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { sanitizeConfig } from '../config/sanitize.js';
|
|
|
2
2
|
import { configToJSONSchema } from './configToJSONSchema.js';
|
|
3
3
|
describe('configToJSONSchema', ()=>{
|
|
4
4
|
it('should handle optional arrays with required fields', async ()=>{
|
|
5
|
+
// @ts-expect-error
|
|
5
6
|
const config = {
|
|
6
7
|
collections: [
|
|
7
8
|
{
|
|
@@ -63,6 +64,101 @@ describe('configToJSONSchema', ()=>{
|
|
|
63
64
|
type: 'object'
|
|
64
65
|
});
|
|
65
66
|
});
|
|
67
|
+
it('should handle tabs and named tabs with required fields', async ()=>{
|
|
68
|
+
// @ts-expect-error
|
|
69
|
+
const config = {
|
|
70
|
+
collections: [
|
|
71
|
+
{
|
|
72
|
+
fields: [
|
|
73
|
+
{
|
|
74
|
+
type: 'tabs',
|
|
75
|
+
tabs: [
|
|
76
|
+
{
|
|
77
|
+
label: 'unnamedTab',
|
|
78
|
+
fields: [
|
|
79
|
+
{
|
|
80
|
+
type: 'text',
|
|
81
|
+
name: 'fieldInUnnamedTab'
|
|
82
|
+
}
|
|
83
|
+
]
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
label: 'namedTab',
|
|
87
|
+
name: 'namedTab',
|
|
88
|
+
fields: [
|
|
89
|
+
{
|
|
90
|
+
type: 'text',
|
|
91
|
+
name: 'fieldInNamedTab'
|
|
92
|
+
}
|
|
93
|
+
]
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
label: 'namedTabWithRequired',
|
|
97
|
+
name: 'namedTabWithRequired',
|
|
98
|
+
fields: [
|
|
99
|
+
{
|
|
100
|
+
type: 'text',
|
|
101
|
+
name: 'fieldInNamedTab',
|
|
102
|
+
required: true
|
|
103
|
+
}
|
|
104
|
+
]
|
|
105
|
+
}
|
|
106
|
+
]
|
|
107
|
+
}
|
|
108
|
+
],
|
|
109
|
+
slug: 'test',
|
|
110
|
+
timestamps: false
|
|
111
|
+
}
|
|
112
|
+
]
|
|
113
|
+
};
|
|
114
|
+
const sanitizedConfig = await sanitizeConfig(config);
|
|
115
|
+
const schema = configToJSONSchema(sanitizedConfig, 'text');
|
|
116
|
+
expect(schema?.definitions?.test).toStrictEqual({
|
|
117
|
+
additionalProperties: false,
|
|
118
|
+
properties: {
|
|
119
|
+
id: {
|
|
120
|
+
type: 'string'
|
|
121
|
+
},
|
|
122
|
+
fieldInUnnamedTab: {
|
|
123
|
+
type: [
|
|
124
|
+
'string',
|
|
125
|
+
'null'
|
|
126
|
+
]
|
|
127
|
+
},
|
|
128
|
+
namedTab: {
|
|
129
|
+
additionalProperties: false,
|
|
130
|
+
type: 'object',
|
|
131
|
+
properties: {
|
|
132
|
+
fieldInNamedTab: {
|
|
133
|
+
type: [
|
|
134
|
+
'string',
|
|
135
|
+
'null'
|
|
136
|
+
]
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
required: []
|
|
140
|
+
},
|
|
141
|
+
namedTabWithRequired: {
|
|
142
|
+
additionalProperties: false,
|
|
143
|
+
type: 'object',
|
|
144
|
+
properties: {
|
|
145
|
+
fieldInNamedTab: {
|
|
146
|
+
type: 'string'
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
required: [
|
|
150
|
+
'fieldInNamedTab'
|
|
151
|
+
]
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
required: [
|
|
155
|
+
'id',
|
|
156
|
+
'namedTabWithRequired'
|
|
157
|
+
],
|
|
158
|
+
title: 'Test',
|
|
159
|
+
type: 'object'
|
|
160
|
+
});
|
|
161
|
+
});
|
|
66
162
|
});
|
|
67
163
|
|
|
68
164
|
//# sourceMappingURL=configToJSONSchema.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/configToJSONSchema.spec.ts"],"sourcesContent":["import type { Config } from '../config/types.js'\n\nimport { sanitizeConfig } from '../config/sanitize.js'\nimport { configToJSONSchema } from './configToJSONSchema.js'\n\ndescribe('configToJSONSchema', () => {\n it('should handle optional arrays with required fields', async () => {\n const config: Config = {\n collections: [\n {\n fields: [\n {\n name: 'someRequiredField',\n type: 'array',\n fields: [\n {\n name: 'someRequiredField',\n required: true,\n type: 'text',\n },\n ],\n },\n ],\n slug: 'test',\n timestamps: false,\n },\n ],\n }\n\n const sanitizedConfig = await sanitizeConfig(config)\n const schema = configToJSONSchema(sanitizedConfig, 'text')\n\n expect(schema?.definitions?.test).toStrictEqual({\n additionalProperties: false,\n properties: {\n id: {\n type: 'string',\n },\n someRequiredField: {\n items: {\n additionalProperties: false,\n properties: {\n id: {\n type: ['string', 'null'],\n },\n someRequiredField: {\n type: 'string',\n },\n },\n required: ['someRequiredField'],\n type: 'object',\n },\n type: ['array', 'null'],\n },\n },\n required: ['id'],\n title: 'Test',\n type: 'object',\n })\n })\n})\n"],"names":["sanitizeConfig","configToJSONSchema","describe","it","config","collections","fields","name","type","required","slug","timestamps","sanitizedConfig","schema","expect","definitions","test","toStrictEqual","additionalProperties","properties","id","someRequiredField","items","title"],"rangeMappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/configToJSONSchema.spec.ts"],"sourcesContent":["import type { Config } from '../config/types.js'\n\nimport { sanitizeConfig } from '../config/sanitize.js'\nimport { configToJSONSchema } from './configToJSONSchema.js'\n\ndescribe('configToJSONSchema', () => {\n it('should handle optional arrays with required fields', async () => {\n // @ts-expect-error\n const config: Config = {\n collections: [\n {\n fields: [\n {\n name: 'someRequiredField',\n type: 'array',\n fields: [\n {\n name: 'someRequiredField',\n required: true,\n type: 'text',\n },\n ],\n },\n ],\n slug: 'test',\n timestamps: false,\n },\n ],\n }\n\n const sanitizedConfig = await sanitizeConfig(config)\n const schema = configToJSONSchema(sanitizedConfig, 'text')\n\n expect(schema?.definitions?.test).toStrictEqual({\n additionalProperties: false,\n properties: {\n id: {\n type: 'string',\n },\n someRequiredField: {\n items: {\n additionalProperties: false,\n properties: {\n id: {\n type: ['string', 'null'],\n },\n someRequiredField: {\n type: 'string',\n },\n },\n required: ['someRequiredField'],\n type: 'object',\n },\n type: ['array', 'null'],\n },\n },\n required: ['id'],\n title: 'Test',\n type: 'object',\n })\n })\n\n it('should handle tabs and named tabs with required fields', async () => {\n // @ts-expect-error\n const config: Config = {\n collections: [\n {\n fields: [\n {\n type: 'tabs',\n tabs: [\n {\n label: 'unnamedTab',\n fields: [\n {\n type: 'text',\n name: 'fieldInUnnamedTab',\n },\n ],\n },\n {\n label: 'namedTab',\n name: 'namedTab',\n fields: [\n {\n type: 'text',\n name: 'fieldInNamedTab',\n },\n ],\n },\n {\n label: 'namedTabWithRequired',\n name: 'namedTabWithRequired',\n fields: [\n {\n type: 'text',\n name: 'fieldInNamedTab',\n required: true,\n },\n ],\n },\n ],\n },\n ],\n slug: 'test',\n timestamps: false,\n },\n ],\n }\n\n const sanitizedConfig = await sanitizeConfig(config)\n const schema = configToJSONSchema(sanitizedConfig, 'text')\n\n expect(schema?.definitions?.test).toStrictEqual({\n additionalProperties: false,\n properties: {\n id: {\n type: 'string',\n },\n fieldInUnnamedTab: {\n type: ['string', 'null'],\n },\n namedTab: {\n additionalProperties: false,\n type: 'object',\n properties: {\n fieldInNamedTab: {\n type: ['string', 'null'],\n },\n },\n required: [],\n },\n namedTabWithRequired: {\n additionalProperties: false,\n type: 'object',\n properties: {\n fieldInNamedTab: {\n type: 'string',\n },\n },\n required: ['fieldInNamedTab'],\n },\n },\n required: ['id', 'namedTabWithRequired'],\n title: 'Test',\n type: 'object',\n })\n })\n})\n"],"names":["sanitizeConfig","configToJSONSchema","describe","it","config","collections","fields","name","type","required","slug","timestamps","sanitizedConfig","schema","expect","definitions","test","toStrictEqual","additionalProperties","properties","id","someRequiredField","items","title","tabs","label","fieldInUnnamedTab","namedTab","fieldInNamedTab","namedTabWithRequired"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAEA,SAASA,cAAc,QAAQ,wBAAuB;AACtD,SAASC,kBAAkB,QAAQ,0BAAyB;AAE5DC,SAAS,sBAAsB;IAC7BC,GAAG,sDAAsD;QACvD,mBAAmB;QACnB,MAAMC,SAAiB;YACrBC,aAAa;gBACX;oBACEC,QAAQ;wBACN;4BACEC,MAAM;4BACNC,MAAM;4BACNF,QAAQ;gCACN;oCACEC,MAAM;oCACNE,UAAU;oCACVD,MAAM;gCACR;6BACD;wBACH;qBACD;oBACDE,MAAM;oBACNC,YAAY;gBACd;aACD;QACH;QAEA,MAAMC,kBAAkB,MAAMZ,eAAeI;QAC7C,MAAMS,SAASZ,mBAAmBW,iBAAiB;QAEnDE,OAAOD,QAAQE,aAAaC,MAAMC,aAAa,CAAC;YAC9CC,sBAAsB;YACtBC,YAAY;gBACVC,IAAI;oBACFZ,MAAM;gBACR;gBACAa,mBAAmB;oBACjBC,OAAO;wBACLJ,sBAAsB;wBACtBC,YAAY;4BACVC,IAAI;gCACFZ,MAAM;oCAAC;oCAAU;iCAAO;4BAC1B;4BACAa,mBAAmB;gCACjBb,MAAM;4BACR;wBACF;wBACAC,UAAU;4BAAC;yBAAoB;wBAC/BD,MAAM;oBACR;oBACAA,MAAM;wBAAC;wBAAS;qBAAO;gBACzB;YACF;YACAC,UAAU;gBAAC;aAAK;YAChBc,OAAO;YACPf,MAAM;QACR;IACF;IAEAL,GAAG,0DAA0D;QAC3D,mBAAmB;QACnB,MAAMC,SAAiB;YACrBC,aAAa;gBACX;oBACEC,QAAQ;wBACN;4BACEE,MAAM;4BACNgB,MAAM;gCACJ;oCACEC,OAAO;oCACPnB,QAAQ;wCACN;4CACEE,MAAM;4CACND,MAAM;wCACR;qCACD;gCACH;gCACA;oCACEkB,OAAO;oCACPlB,MAAM;oCACND,QAAQ;wCACN;4CACEE,MAAM;4CACND,MAAM;wCACR;qCACD;gCACH;gCACA;oCACEkB,OAAO;oCACPlB,MAAM;oCACND,QAAQ;wCACN;4CACEE,MAAM;4CACND,MAAM;4CACNE,UAAU;wCACZ;qCACD;gCACH;6BACD;wBACH;qBACD;oBACDC,MAAM;oBACNC,YAAY;gBACd;aACD;QACH;QAEA,MAAMC,kBAAkB,MAAMZ,eAAeI;QAC7C,MAAMS,SAASZ,mBAAmBW,iBAAiB;QAEnDE,OAAOD,QAAQE,aAAaC,MAAMC,aAAa,CAAC;YAC9CC,sBAAsB;YACtBC,YAAY;gBACVC,IAAI;oBACFZ,MAAM;gBACR;gBACAkB,mBAAmB;oBACjBlB,MAAM;wBAAC;wBAAU;qBAAO;gBAC1B;gBACAmB,UAAU;oBACRT,sBAAsB;oBACtBV,MAAM;oBACNW,YAAY;wBACVS,iBAAiB;4BACfpB,MAAM;gCAAC;gCAAU;6BAAO;wBAC1B;oBACF;oBACAC,UAAU,EAAE;gBACd;gBACAoB,sBAAsB;oBACpBX,sBAAsB;oBACtBV,MAAM;oBACNW,YAAY;wBACVS,iBAAiB;4BACfpB,MAAM;wBACR;oBACF;oBACAC,UAAU;wBAAC;qBAAkB;gBAC/B;YACF;YACAA,UAAU;gBAAC;gBAAM;aAAuB;YACxCc,OAAO;YACPf,MAAM;QACR;IACF;AACF"}
|