payload 3.0.0-beta.123 → 3.0.0-beta.124

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.
@@ -1 +1 @@
1
- {"version":3,"file":"validateSearchParams.d.ts","sourceRoot":"","sources":["../../../src/database/queryValidation/validateSearchParams.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAClF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAA;AACzD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAA;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,YAAY,CAAA;AAQ7D,KAAK,IAAI,GAAG;IACV,gBAAgB,CAAC,EAAE,yBAAyB,CAAA;IAC5C,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC1B,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,YAAY,CAAC,EAAE,qBAAqB,CAAA;IACpC,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,EAAE,OAAO,CAAA;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,cAAc,CAAA;IACxB,GAAG,EAAE,cAAc,CAAA;IACnB,GAAG,EAAE,OAAO,CAAA;IACZ,aAAa,CAAC,EAAE,KAAK,EAAE,CAAA;CACxB,CAAA;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,EACxC,gBAAgB,EAChB,MAAM,EACN,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,IAAI,EAAE,YAAY,EAClB,QAAQ,EACR,GAAG,EACH,GAAG,EACH,aAAa,GACd,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CA2ItB"}
1
+ {"version":3,"file":"validateSearchParams.d.ts","sourceRoot":"","sources":["../../../src/database/queryValidation/validateSearchParams.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAClF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAA;AACzD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAA;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,YAAY,CAAA;AAQ7D,KAAK,IAAI,GAAG;IACV,gBAAgB,CAAC,EAAE,yBAAyB,CAAA;IAC5C,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC1B,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,YAAY,CAAC,EAAE,qBAAqB,CAAA;IACpC,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,EAAE,OAAO,CAAA;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,cAAc,CAAA;IACxB,GAAG,EAAE,cAAc,CAAA;IACnB,GAAG,EAAE,OAAO,CAAA;IACZ,aAAa,CAAC,EAAE,KAAK,EAAE,CAAA;CACxB,CAAA;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,EACxC,gBAAgB,EAChB,MAAM,EACN,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,IAAI,EAAE,YAAY,EAClB,QAAQ,EACR,GAAG,EACH,GAAG,EACH,aAAa,GACd,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAyJtB"}
@@ -38,6 +38,13 @@ import { validateQueryPaths } from './validateQueryPaths.js';
38
38
  });
39
39
  }
40
40
  const promises = [];
41
+ // Sanitize relation.otherRelation.id to relation.otherRelation
42
+ if (paths.at(-1)?.path === 'id') {
43
+ const previousField = paths.at(-2)?.field;
44
+ if (previousField && (previousField.type === 'relationship' || previousField.type === 'upload') && typeof previousField.relationTo === 'string') {
45
+ paths.pop();
46
+ }
47
+ }
41
48
  promises.push(...paths.map(async ({ collectionSlug, field, invalid, path }, i)=>{
42
49
  if (invalid) {
43
50
  errors.push({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/database/queryValidation/validateSearchParams.ts"],"sourcesContent":["import type { SanitizedCollectionConfig } from '../../collections/config/types.js'\nimport type { Field } from '../../fields/config/types.js'\nimport type { SanitizedGlobalConfig } from '../../globals/config/types.js'\nimport type { PayloadRequest } from '../../types/index.js'\nimport type { EntityPolicies, PathToQuery } from './types.js'\n\nimport { fieldAffectsData, fieldIsVirtual } from '../../fields/config/types.js'\nimport { getEntityPolicies } from '../../utilities/getEntityPolicies.js'\nimport isolateObjectProperty from '../../utilities/isolateObjectProperty.js'\nimport { getLocalizedPaths } from '../getLocalizedPaths.js'\nimport { validateQueryPaths } from './validateQueryPaths.js'\n\ntype Args = {\n collectionConfig?: SanitizedCollectionConfig\n errors: { path: string }[]\n fields: Field[]\n globalConfig?: SanitizedGlobalConfig\n operator: string\n overrideAccess: boolean\n path: string\n policies: EntityPolicies\n req: PayloadRequest\n val: unknown\n versionFields?: Field[]\n}\n\n/**\n * Validate the Payload key / value / operator\n */\nexport async function validateSearchParam({\n collectionConfig,\n errors,\n fields,\n globalConfig,\n operator,\n overrideAccess,\n path: incomingPath,\n policies,\n req,\n val,\n versionFields,\n}: Args): Promise<void> {\n // Replace GraphQL nested field double underscore formatting\n let sanitizedPath\n if (incomingPath === '_id') {\n sanitizedPath = 'id'\n } else {\n sanitizedPath = incomingPath.replace(/__/g, '.')\n }\n let paths: PathToQuery[] = []\n const { slug } = collectionConfig || globalConfig\n\n if (globalConfig && !policies.globals[slug]) {\n globalConfig.fields = fields\n\n policies.globals[slug] = await getEntityPolicies({\n type: 'global',\n entity: globalConfig,\n operations: ['read'],\n req,\n })\n }\n\n if (sanitizedPath !== 'id') {\n paths = await getLocalizedPaths({\n collectionSlug: collectionConfig?.slug,\n fields,\n globalSlug: globalConfig?.slug,\n incomingPath: sanitizedPath,\n locale: req.locale,\n overrideAccess,\n payload: req.payload,\n })\n }\n const promises = []\n promises.push(\n ...paths.map(async ({ collectionSlug, field, invalid, path }, i) => {\n if (invalid) {\n errors.push({ path })\n return\n }\n\n if (fieldIsVirtual(field)) {\n errors.push({ path })\n }\n\n if (!overrideAccess && fieldAffectsData(field)) {\n if (collectionSlug) {\n if (!policies.collections[collectionSlug]) {\n policies.collections[collectionSlug] = await getEntityPolicies({\n type: 'collection',\n entity: req.payload.collections[collectionSlug].config,\n operations: ['read'],\n req: isolateObjectProperty(req, 'transactionID'),\n })\n }\n\n if (\n ['hash', 'salt'].includes(incomingPath) &&\n collectionConfig.auth &&\n !collectionConfig.auth?.disableLocalStrategy\n ) {\n errors.push({ path: incomingPath })\n }\n }\n let fieldPath = path\n // remove locale from end of path\n if (path.endsWith(`.${req.locale}`)) {\n fieldPath = path.slice(0, -(req.locale.length + 1))\n }\n // remove \".value\" from ends of polymorphic relationship paths\n if (\n (field.type === 'relationship' || field.type === 'upload') &&\n Array.isArray(field.relationTo)\n ) {\n fieldPath = fieldPath.replace('.value', '')\n }\n const entityType: 'collections' | 'globals' = globalConfig ? 'globals' : 'collections'\n const entitySlug = collectionSlug || globalConfig.slug\n const segments = fieldPath.split('.')\n\n let fieldAccess\n if (versionFields) {\n fieldAccess = policies[entityType][entitySlug]\n if (segments[0] === 'parent' || segments[0] === 'version') {\n segments.shift()\n }\n } else {\n fieldAccess = policies[entityType][entitySlug].fields\n }\n\n segments.forEach((segment) => {\n if (fieldAccess[segment]) {\n if ('fields' in fieldAccess[segment]) {\n fieldAccess = fieldAccess[segment].fields\n } else if ('blocks' in fieldAccess[segment]) {\n fieldAccess = fieldAccess[segment]\n } else {\n fieldAccess = fieldAccess[segment]\n }\n }\n })\n\n if (!fieldAccess?.read?.permission) {\n errors.push({ path: fieldPath })\n }\n }\n\n if (i > 1) {\n // Remove top collection and reverse array\n // to work backwards from top\n const pathsToQuery = paths.slice(1).reverse()\n\n pathsToQuery.forEach(\n ({ collectionSlug: pathCollectionSlug, path: subPath }, pathToQueryIndex) => {\n // On the \"deepest\" collection,\n // validate query of the relationship\n if (pathToQueryIndex === 0) {\n promises.push(\n validateQueryPaths({\n collectionConfig: req.payload.collections[pathCollectionSlug].config,\n errors,\n globalConfig: undefined,\n overrideAccess,\n policies,\n req,\n where: {\n [subPath]: {\n [operator]: val,\n },\n },\n }),\n )\n }\n },\n )\n }\n }),\n )\n await Promise.all(promises)\n}\n"],"names":["fieldAffectsData","fieldIsVirtual","getEntityPolicies","isolateObjectProperty","getLocalizedPaths","validateQueryPaths","validateSearchParam","collectionConfig","errors","fields","globalConfig","operator","overrideAccess","path","incomingPath","policies","req","val","versionFields","sanitizedPath","replace","paths","slug","globals","type","entity","operations","collectionSlug","globalSlug","locale","payload","promises","push","map","field","invalid","i","collections","config","includes","auth","disableLocalStrategy","fieldPath","endsWith","slice","length","Array","isArray","relationTo","entityType","entitySlug","segments","split","fieldAccess","shift","forEach","segment","read","permission","pathsToQuery","reverse","pathCollectionSlug","subPath","pathToQueryIndex","undefined","where","Promise","all"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/database/queryValidation/validateSearchParams.ts"],"sourcesContent":["import type { SanitizedCollectionConfig } from '../../collections/config/types.js'\nimport type { Field } from '../../fields/config/types.js'\nimport type { SanitizedGlobalConfig } from '../../globals/config/types.js'\nimport type { PayloadRequest } from '../../types/index.js'\nimport type { EntityPolicies, PathToQuery } from './types.js'\n\nimport { fieldAffectsData, fieldIsVirtual } from '../../fields/config/types.js'\nimport { getEntityPolicies } from '../../utilities/getEntityPolicies.js'\nimport isolateObjectProperty from '../../utilities/isolateObjectProperty.js'\nimport { getLocalizedPaths } from '../getLocalizedPaths.js'\nimport { validateQueryPaths } from './validateQueryPaths.js'\n\ntype Args = {\n collectionConfig?: SanitizedCollectionConfig\n errors: { path: string }[]\n fields: Field[]\n globalConfig?: SanitizedGlobalConfig\n operator: string\n overrideAccess: boolean\n path: string\n policies: EntityPolicies\n req: PayloadRequest\n val: unknown\n versionFields?: Field[]\n}\n\n/**\n * Validate the Payload key / value / operator\n */\nexport async function validateSearchParam({\n collectionConfig,\n errors,\n fields,\n globalConfig,\n operator,\n overrideAccess,\n path: incomingPath,\n policies,\n req,\n val,\n versionFields,\n}: Args): Promise<void> {\n // Replace GraphQL nested field double underscore formatting\n let sanitizedPath\n if (incomingPath === '_id') {\n sanitizedPath = 'id'\n } else {\n sanitizedPath = incomingPath.replace(/__/g, '.')\n }\n let paths: PathToQuery[] = []\n const { slug } = collectionConfig || globalConfig\n\n if (globalConfig && !policies.globals[slug]) {\n globalConfig.fields = fields\n\n policies.globals[slug] = await getEntityPolicies({\n type: 'global',\n entity: globalConfig,\n operations: ['read'],\n req,\n })\n }\n\n if (sanitizedPath !== 'id') {\n paths = await getLocalizedPaths({\n collectionSlug: collectionConfig?.slug,\n fields,\n globalSlug: globalConfig?.slug,\n incomingPath: sanitizedPath,\n locale: req.locale,\n overrideAccess,\n payload: req.payload,\n })\n }\n const promises = []\n\n // Sanitize relation.otherRelation.id to relation.otherRelation\n if (paths.at(-1)?.path === 'id') {\n const previousField = paths.at(-2)?.field\n if (\n previousField &&\n (previousField.type === 'relationship' || previousField.type === 'upload') &&\n typeof previousField.relationTo === 'string'\n ) {\n paths.pop()\n }\n }\n\n promises.push(\n ...paths.map(async ({ collectionSlug, field, invalid, path }, i) => {\n if (invalid) {\n errors.push({ path })\n return\n }\n\n if (fieldIsVirtual(field)) {\n errors.push({ path })\n }\n\n if (!overrideAccess && fieldAffectsData(field)) {\n if (collectionSlug) {\n if (!policies.collections[collectionSlug]) {\n policies.collections[collectionSlug] = await getEntityPolicies({\n type: 'collection',\n entity: req.payload.collections[collectionSlug].config,\n operations: ['read'],\n req: isolateObjectProperty(req, 'transactionID'),\n })\n }\n\n if (\n ['hash', 'salt'].includes(incomingPath) &&\n collectionConfig.auth &&\n !collectionConfig.auth?.disableLocalStrategy\n ) {\n errors.push({ path: incomingPath })\n }\n }\n let fieldPath = path\n // remove locale from end of path\n if (path.endsWith(`.${req.locale}`)) {\n fieldPath = path.slice(0, -(req.locale.length + 1))\n }\n // remove \".value\" from ends of polymorphic relationship paths\n if (\n (field.type === 'relationship' || field.type === 'upload') &&\n Array.isArray(field.relationTo)\n ) {\n fieldPath = fieldPath.replace('.value', '')\n }\n\n const entityType: 'collections' | 'globals' = globalConfig ? 'globals' : 'collections'\n const entitySlug = collectionSlug || globalConfig.slug\n const segments = fieldPath.split('.')\n\n let fieldAccess\n if (versionFields) {\n fieldAccess = policies[entityType][entitySlug]\n if (segments[0] === 'parent' || segments[0] === 'version') {\n segments.shift()\n }\n } else {\n fieldAccess = policies[entityType][entitySlug].fields\n }\n\n segments.forEach((segment) => {\n if (fieldAccess[segment]) {\n if ('fields' in fieldAccess[segment]) {\n fieldAccess = fieldAccess[segment].fields\n } else if ('blocks' in fieldAccess[segment]) {\n fieldAccess = fieldAccess[segment]\n } else {\n fieldAccess = fieldAccess[segment]\n }\n }\n })\n\n if (!fieldAccess?.read?.permission) {\n errors.push({ path: fieldPath })\n }\n }\n\n if (i > 1) {\n // Remove top collection and reverse array\n // to work backwards from top\n const pathsToQuery = paths.slice(1).reverse()\n\n pathsToQuery.forEach(\n ({ collectionSlug: pathCollectionSlug, path: subPath }, pathToQueryIndex) => {\n // On the \"deepest\" collection,\n // validate query of the relationship\n if (pathToQueryIndex === 0) {\n promises.push(\n validateQueryPaths({\n collectionConfig: req.payload.collections[pathCollectionSlug].config,\n errors,\n globalConfig: undefined,\n overrideAccess,\n policies,\n req,\n where: {\n [subPath]: {\n [operator]: val,\n },\n },\n }),\n )\n }\n },\n )\n }\n }),\n )\n await Promise.all(promises)\n}\n"],"names":["fieldAffectsData","fieldIsVirtual","getEntityPolicies","isolateObjectProperty","getLocalizedPaths","validateQueryPaths","validateSearchParam","collectionConfig","errors","fields","globalConfig","operator","overrideAccess","path","incomingPath","policies","req","val","versionFields","sanitizedPath","replace","paths","slug","globals","type","entity","operations","collectionSlug","globalSlug","locale","payload","promises","at","previousField","field","relationTo","pop","push","map","invalid","i","collections","config","includes","auth","disableLocalStrategy","fieldPath","endsWith","slice","length","Array","isArray","entityType","entitySlug","segments","split","fieldAccess","shift","forEach","segment","read","permission","pathsToQuery","reverse","pathCollectionSlug","subPath","pathToQueryIndex","undefined","where","Promise","all"],"mappings":"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"}
@@ -21,7 +21,7 @@ export interface Config {
21
21
  'payload-preferences': PayloadPreference;
22
22
  'payload-migrations': PayloadMigration;
23
23
  };
24
- collectionsSelect?: {
24
+ collectionsSelect: {
25
25
  posts: PostsSelect;
26
26
  users: UsersSelect;
27
27
  'payload-locked-documents': PayloadLockedDocumentsSelect;
@@ -32,7 +32,7 @@ export interface Config {
32
32
  defaultIDType: string;
33
33
  };
34
34
  globals: {};
35
- globalsSelect?: {};
35
+ globalsSelect: {};
36
36
  locale: null;
37
37
  user: User & {
38
38
  collection: 'users';
@@ -294,7 +294,7 @@ export interface Config {
294
294
  'payload-preferences': PayloadPreference;
295
295
  'payload-migrations': PayloadMigration;
296
296
  };
297
- collectionsSelect?: {
297
+ collectionsSelect: {
298
298
  posts: PostsSelect<false> | PostsSelect<true>;
299
299
  users: UsersSelect<false> | UsersSelect<true>;
300
300
  'payload-locked-documents': PayloadLockedDocumentsSelect<false> | PayloadLockedDocumentsSelect<true>;
@@ -305,7 +305,7 @@ export interface Config {
305
305
  defaultIDType: string;
306
306
  };
307
307
  globals: {};
308
- globalsSelect?: {};
308
+ globalsSelect: {};
309
309
  locale: null;
310
310
  user: User & {
311
311
  collection: 'users';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/addSelectGenericsToGeneratedTyoes.spec.ts"],"sourcesContent":["import { addSelectGenericsToGeneratedTypes } from './addSelectGenericsToGeneretedTypes.js'\n\nconst INPUT_AND_OUTPUT = [\n {\n input: `\n/* tslint:disable */\n/* eslint-disable */\n/**\n * This file was automatically generated by Payload.\n * DO NOT MODIFY IT BY HAND. Instead, modify your source Payload config,\n * and re-run \\`payload generate:types\\` to regenerate this file.\n */\n\nexport interface Config {\n auth: {\n users: UserAuthOperations;\n };\n collections: {\n posts: Post;\n users: User;\n 'payload-locked-documents': PayloadLockedDocument;\n 'payload-preferences': PayloadPreference;\n 'payload-migrations': PayloadMigration;\n };\n collectionsSelect?: {\n posts: PostsSelect;\n users: UsersSelect;\n 'payload-locked-documents': PayloadLockedDocumentsSelect;\n 'payload-preferences': PayloadPreferencesSelect;\n 'payload-migrations': PayloadMigrationsSelect;\n };\n db: {\n defaultIDType: string;\n };\n globals: {};\n globalsSelect?: {};\n locale: null;\n user: User & {\n collection: 'users';\n };\n}\nexport interface UserAuthOperations {\n forgotPassword: {\n email: string;\n password: string;\n };\n login: {\n email: string;\n password: string;\n };\n registerFirstUser: {\n email: string;\n password: string;\n };\n unlock: {\n email: string;\n password: string;\n };\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"posts\".\n */\nexport interface Post {\n id: string;\n text?: string | null;\n number?: number | null;\n group?: {\n text?: string | null;\n number?: number | null;\n };\n array?:\n | {\n text?: string | null;\n number?: number | null;\n id?: string | null;\n }[]\n | null;\n blocks?:\n | (\n | {\n text?: string | null;\n introText?: string | null;\n id?: string | null;\n blockName?: string | null;\n blockType: 'intro';\n }\n | {\n text?: string | null;\n ctaText?: string | null;\n id?: string | null;\n blockName?: string | null;\n blockType: 'cta';\n }\n )[]\n | null;\n updatedAt: string;\n createdAt: string;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"users\".\n */\nexport interface User {\n id: string;\n updatedAt: string;\n createdAt: string;\n email: string;\n resetPasswordToken?: string | null;\n resetPasswordExpiration?: string | null;\n salt?: string | null;\n hash?: string | null;\n loginAttempts?: number | null;\n lockUntil?: string | null;\n password?: string | null;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"payload-locked-documents\".\n */\nexport interface PayloadLockedDocument {\n id: string;\n document?:\n | ({\n relationTo: 'posts';\n value: string | Post;\n } | null)\n | ({\n relationTo: 'users';\n value: string | User;\n } | null);\n globalSlug?: string | null;\n user: {\n relationTo: 'users';\n value: string | User;\n };\n updatedAt: string;\n createdAt: string;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"payload-preferences\".\n */\nexport interface PayloadPreference {\n id: string;\n user: {\n relationTo: 'users';\n value: string | User;\n };\n key?: string | null;\n value?:\n | {\n [k: string]: unknown;\n }\n | unknown[]\n | string\n | number\n | boolean\n | null;\n updatedAt: string;\n createdAt: string;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"payload-migrations\".\n */\nexport interface PayloadMigration {\n id: string;\n name?: string | null;\n batch?: number | null;\n updatedAt: string;\n createdAt: string;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"posts_select\".\n */\nexport interface PostsSelect {\n text?: boolean;\n number?: boolean;\n group?:\n | boolean\n | {\n text?: boolean;\n number?: boolean;\n };\n array?:\n | boolean\n | {\n text?: boolean;\n number?: boolean;\n id?: boolean;\n };\n blocks?:\n | boolean\n | {\n intro?:\n | boolean\n | {\n text?: boolean;\n introText?: boolean;\n id?: boolean;\n blockName?: boolean;\n };\n cta?:\n | boolean\n | {\n text?: boolean;\n ctaText?: boolean;\n id?: boolean;\n blockName?: boolean;\n };\n };\n updatedAt?: boolean;\n createdAt?: boolean;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"users_select\".\n */\nexport interface UsersSelect {\n updatedAt?: boolean;\n createdAt?: boolean;\n email?: boolean;\n resetPasswordToken?: boolean;\n resetPasswordExpiration?: boolean;\n salt?: boolean;\n hash?: boolean;\n loginAttempts?: boolean;\n lockUntil?: boolean;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"payload-locked-documents_select\".\n */\nexport interface PayloadLockedDocumentsSelect {\n document?: boolean;\n globalSlug?: boolean;\n user?: boolean;\n updatedAt?: boolean;\n createdAt?: boolean;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"payload-preferences_select\".\n */\nexport interface PayloadPreferencesSelect {\n user?: boolean;\n key?: boolean;\n value?: boolean;\n updatedAt?: boolean;\n createdAt?: boolean;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"payload-migrations_select\".\n */\nexport interface PayloadMigrationsSelect {\n name?: boolean;\n batch?: boolean;\n updatedAt?: boolean;\n createdAt?: boolean;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"auth\".\n */\nexport interface Auth {\n [k: string]: unknown;\n}\n\n\ndeclare module 'payload' {\n // @ts-ignore \n export interface GeneratedTypes extends Config {}\n}\n`,\n output: `\n/* tslint:disable */\n/* eslint-disable */\n/**\n * This file was automatically generated by Payload.\n * DO NOT MODIFY IT BY HAND. Instead, modify your source Payload config,\n * and re-run \\`payload generate:types\\` to regenerate this file.\n */\n\nexport interface Config {\n auth: {\n users: UserAuthOperations;\n };\n collections: {\n posts: Post;\n users: User;\n 'payload-locked-documents': PayloadLockedDocument;\n 'payload-preferences': PayloadPreference;\n 'payload-migrations': PayloadMigration;\n };\n collectionsSelect?: {\n posts: PostsSelect<false> | PostsSelect<true>;\n users: UsersSelect<false> | UsersSelect<true>;\n 'payload-locked-documents': PayloadLockedDocumentsSelect<false> | PayloadLockedDocumentsSelect<true>;\n 'payload-preferences': PayloadPreferencesSelect<false> | PayloadPreferencesSelect<true>;\n 'payload-migrations': PayloadMigrationsSelect<false> | PayloadMigrationsSelect<true>;\n };\n db: {\n defaultIDType: string;\n };\n globals: {};\n globalsSelect?: {};\n locale: null;\n user: User & {\n collection: 'users';\n };\n}\nexport interface UserAuthOperations {\n forgotPassword: {\n email: string;\n password: string;\n };\n login: {\n email: string;\n password: string;\n };\n registerFirstUser: {\n email: string;\n password: string;\n };\n unlock: {\n email: string;\n password: string;\n };\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"posts\".\n */\nexport interface Post {\n id: string;\n text?: string | null;\n number?: number | null;\n group?: {\n text?: string | null;\n number?: number | null;\n };\n array?:\n | {\n text?: string | null;\n number?: number | null;\n id?: string | null;\n }[]\n | null;\n blocks?:\n | (\n | {\n text?: string | null;\n introText?: string | null;\n id?: string | null;\n blockName?: string | null;\n blockType: 'intro';\n }\n | {\n text?: string | null;\n ctaText?: string | null;\n id?: string | null;\n blockName?: string | null;\n blockType: 'cta';\n }\n )[]\n | null;\n updatedAt: string;\n createdAt: string;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"users\".\n */\nexport interface User {\n id: string;\n updatedAt: string;\n createdAt: string;\n email: string;\n resetPasswordToken?: string | null;\n resetPasswordExpiration?: string | null;\n salt?: string | null;\n hash?: string | null;\n loginAttempts?: number | null;\n lockUntil?: string | null;\n password?: string | null;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"payload-locked-documents\".\n */\nexport interface PayloadLockedDocument {\n id: string;\n document?:\n | ({\n relationTo: 'posts';\n value: string | Post;\n } | null)\n | ({\n relationTo: 'users';\n value: string | User;\n } | null);\n globalSlug?: string | null;\n user: {\n relationTo: 'users';\n value: string | User;\n };\n updatedAt: string;\n createdAt: string;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"payload-preferences\".\n */\nexport interface PayloadPreference {\n id: string;\n user: {\n relationTo: 'users';\n value: string | User;\n };\n key?: string | null;\n value?:\n | {\n [k: string]: unknown;\n }\n | unknown[]\n | string\n | number\n | boolean\n | null;\n updatedAt: string;\n createdAt: string;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"payload-migrations\".\n */\nexport interface PayloadMigration {\n id: string;\n name?: string | null;\n batch?: number | null;\n updatedAt: string;\n createdAt: string;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"posts_select\".\n */\nexport interface PostsSelect<T extends boolean = true> {\n text?: T;\n number?: T;\n group?:\n | T\n | {\n text?: T;\n number?: T;\n };\n array?:\n | T\n | {\n text?: T;\n number?: T;\n id?: T;\n };\n blocks?:\n | T\n | {\n intro?:\n | T\n | {\n text?: T;\n introText?: T;\n id?: T;\n blockName?: T;\n };\n cta?:\n | T\n | {\n text?: T;\n ctaText?: T;\n id?: T;\n blockName?: T;\n };\n };\n updatedAt?: T;\n createdAt?: T;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"users_select\".\n */\nexport interface UsersSelect<T extends boolean = true> {\n updatedAt?: T;\n createdAt?: T;\n email?: T;\n resetPasswordToken?: T;\n resetPasswordExpiration?: T;\n salt?: T;\n hash?: T;\n loginAttempts?: T;\n lockUntil?: T;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"payload-locked-documents_select\".\n */\nexport interface PayloadLockedDocumentsSelect<T extends boolean = true> {\n document?: T;\n globalSlug?: T;\n user?: T;\n updatedAt?: T;\n createdAt?: T;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"payload-preferences_select\".\n */\nexport interface PayloadPreferencesSelect<T extends boolean = true> {\n user?: T;\n key?: T;\n value?: T;\n updatedAt?: T;\n createdAt?: T;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"payload-migrations_select\".\n */\nexport interface PayloadMigrationsSelect<T extends boolean = true> {\n name?: T;\n batch?: T;\n updatedAt?: T;\n createdAt?: T;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"auth\".\n */\nexport interface Auth {\n [k: string]: unknown;\n}\n\n\ndeclare module 'payload' {\n // @ts-ignore \n export interface GeneratedTypes extends Config {}\n}\n`,\n },\n]\n\ndescribe('addSelectGenericsToGeneratedTypes', () => {\n it('should match return of given input with output', () => {\n for (const { input, output } of INPUT_AND_OUTPUT) {\n expect(\n addSelectGenericsToGeneratedTypes({\n compiledGeneratedTypes: input,\n }),\n ).toStrictEqual(output)\n }\n })\n})\n"],"names":["addSelectGenericsToGeneratedTypes","INPUT_AND_OUTPUT","input","output","describe","it","expect","compiledGeneratedTypes","toStrictEqual"],"mappings":"AAAA,SAASA,iCAAiC,QAAQ,yCAAwC;AAE1F,MAAMC,mBAAmB;IACvB;QACEC,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgRZ,CAAC;QACGC,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgRb,CAAC;IACC;CACD;AAEDC,SAAS,qCAAqC;IAC5CC,GAAG,kDAAkD;QACnD,KAAK,MAAM,EAAEH,KAAK,EAAEC,MAAM,EAAE,IAAIF,iBAAkB;YAChDK,OACEN,kCAAkC;gBAChCO,wBAAwBL;YAC1B,IACAM,aAAa,CAACL;QAClB;IACF;AACF"}
1
+ {"version":3,"sources":["../../src/utilities/addSelectGenericsToGeneratedTyoes.spec.ts"],"sourcesContent":["import { addSelectGenericsToGeneratedTypes } from './addSelectGenericsToGeneretedTypes.js'\n\nconst INPUT_AND_OUTPUT = [\n {\n input: `\n/* tslint:disable */\n/* eslint-disable */\n/**\n * This file was automatically generated by Payload.\n * DO NOT MODIFY IT BY HAND. Instead, modify your source Payload config,\n * and re-run \\`payload generate:types\\` to regenerate this file.\n */\n\nexport interface Config {\n auth: {\n users: UserAuthOperations;\n };\n collections: {\n posts: Post;\n users: User;\n 'payload-locked-documents': PayloadLockedDocument;\n 'payload-preferences': PayloadPreference;\n 'payload-migrations': PayloadMigration;\n };\n collectionsSelect: {\n posts: PostsSelect;\n users: UsersSelect;\n 'payload-locked-documents': PayloadLockedDocumentsSelect;\n 'payload-preferences': PayloadPreferencesSelect;\n 'payload-migrations': PayloadMigrationsSelect;\n };\n db: {\n defaultIDType: string;\n };\n globals: {};\n globalsSelect: {};\n locale: null;\n user: User & {\n collection: 'users';\n };\n}\nexport interface UserAuthOperations {\n forgotPassword: {\n email: string;\n password: string;\n };\n login: {\n email: string;\n password: string;\n };\n registerFirstUser: {\n email: string;\n password: string;\n };\n unlock: {\n email: string;\n password: string;\n };\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"posts\".\n */\nexport interface Post {\n id: string;\n text?: string | null;\n number?: number | null;\n group?: {\n text?: string | null;\n number?: number | null;\n };\n array?:\n | {\n text?: string | null;\n number?: number | null;\n id?: string | null;\n }[]\n | null;\n blocks?:\n | (\n | {\n text?: string | null;\n introText?: string | null;\n id?: string | null;\n blockName?: string | null;\n blockType: 'intro';\n }\n | {\n text?: string | null;\n ctaText?: string | null;\n id?: string | null;\n blockName?: string | null;\n blockType: 'cta';\n }\n )[]\n | null;\n updatedAt: string;\n createdAt: string;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"users\".\n */\nexport interface User {\n id: string;\n updatedAt: string;\n createdAt: string;\n email: string;\n resetPasswordToken?: string | null;\n resetPasswordExpiration?: string | null;\n salt?: string | null;\n hash?: string | null;\n loginAttempts?: number | null;\n lockUntil?: string | null;\n password?: string | null;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"payload-locked-documents\".\n */\nexport interface PayloadLockedDocument {\n id: string;\n document?:\n | ({\n relationTo: 'posts';\n value: string | Post;\n } | null)\n | ({\n relationTo: 'users';\n value: string | User;\n } | null);\n globalSlug?: string | null;\n user: {\n relationTo: 'users';\n value: string | User;\n };\n updatedAt: string;\n createdAt: string;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"payload-preferences\".\n */\nexport interface PayloadPreference {\n id: string;\n user: {\n relationTo: 'users';\n value: string | User;\n };\n key?: string | null;\n value?:\n | {\n [k: string]: unknown;\n }\n | unknown[]\n | string\n | number\n | boolean\n | null;\n updatedAt: string;\n createdAt: string;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"payload-migrations\".\n */\nexport interface PayloadMigration {\n id: string;\n name?: string | null;\n batch?: number | null;\n updatedAt: string;\n createdAt: string;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"posts_select\".\n */\nexport interface PostsSelect {\n text?: boolean;\n number?: boolean;\n group?:\n | boolean\n | {\n text?: boolean;\n number?: boolean;\n };\n array?:\n | boolean\n | {\n text?: boolean;\n number?: boolean;\n id?: boolean;\n };\n blocks?:\n | boolean\n | {\n intro?:\n | boolean\n | {\n text?: boolean;\n introText?: boolean;\n id?: boolean;\n blockName?: boolean;\n };\n cta?:\n | boolean\n | {\n text?: boolean;\n ctaText?: boolean;\n id?: boolean;\n blockName?: boolean;\n };\n };\n updatedAt?: boolean;\n createdAt?: boolean;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"users_select\".\n */\nexport interface UsersSelect {\n updatedAt?: boolean;\n createdAt?: boolean;\n email?: boolean;\n resetPasswordToken?: boolean;\n resetPasswordExpiration?: boolean;\n salt?: boolean;\n hash?: boolean;\n loginAttempts?: boolean;\n lockUntil?: boolean;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"payload-locked-documents_select\".\n */\nexport interface PayloadLockedDocumentsSelect {\n document?: boolean;\n globalSlug?: boolean;\n user?: boolean;\n updatedAt?: boolean;\n createdAt?: boolean;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"payload-preferences_select\".\n */\nexport interface PayloadPreferencesSelect {\n user?: boolean;\n key?: boolean;\n value?: boolean;\n updatedAt?: boolean;\n createdAt?: boolean;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"payload-migrations_select\".\n */\nexport interface PayloadMigrationsSelect {\n name?: boolean;\n batch?: boolean;\n updatedAt?: boolean;\n createdAt?: boolean;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"auth\".\n */\nexport interface Auth {\n [k: string]: unknown;\n}\n\n\ndeclare module 'payload' {\n // @ts-ignore \n export interface GeneratedTypes extends Config {}\n}\n`,\n output: `\n/* tslint:disable */\n/* eslint-disable */\n/**\n * This file was automatically generated by Payload.\n * DO NOT MODIFY IT BY HAND. Instead, modify your source Payload config,\n * and re-run \\`payload generate:types\\` to regenerate this file.\n */\n\nexport interface Config {\n auth: {\n users: UserAuthOperations;\n };\n collections: {\n posts: Post;\n users: User;\n 'payload-locked-documents': PayloadLockedDocument;\n 'payload-preferences': PayloadPreference;\n 'payload-migrations': PayloadMigration;\n };\n collectionsSelect: {\n posts: PostsSelect<false> | PostsSelect<true>;\n users: UsersSelect<false> | UsersSelect<true>;\n 'payload-locked-documents': PayloadLockedDocumentsSelect<false> | PayloadLockedDocumentsSelect<true>;\n 'payload-preferences': PayloadPreferencesSelect<false> | PayloadPreferencesSelect<true>;\n 'payload-migrations': PayloadMigrationsSelect<false> | PayloadMigrationsSelect<true>;\n };\n db: {\n defaultIDType: string;\n };\n globals: {};\n globalsSelect: {};\n locale: null;\n user: User & {\n collection: 'users';\n };\n}\nexport interface UserAuthOperations {\n forgotPassword: {\n email: string;\n password: string;\n };\n login: {\n email: string;\n password: string;\n };\n registerFirstUser: {\n email: string;\n password: string;\n };\n unlock: {\n email: string;\n password: string;\n };\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"posts\".\n */\nexport interface Post {\n id: string;\n text?: string | null;\n number?: number | null;\n group?: {\n text?: string | null;\n number?: number | null;\n };\n array?:\n | {\n text?: string | null;\n number?: number | null;\n id?: string | null;\n }[]\n | null;\n blocks?:\n | (\n | {\n text?: string | null;\n introText?: string | null;\n id?: string | null;\n blockName?: string | null;\n blockType: 'intro';\n }\n | {\n text?: string | null;\n ctaText?: string | null;\n id?: string | null;\n blockName?: string | null;\n blockType: 'cta';\n }\n )[]\n | null;\n updatedAt: string;\n createdAt: string;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"users\".\n */\nexport interface User {\n id: string;\n updatedAt: string;\n createdAt: string;\n email: string;\n resetPasswordToken?: string | null;\n resetPasswordExpiration?: string | null;\n salt?: string | null;\n hash?: string | null;\n loginAttempts?: number | null;\n lockUntil?: string | null;\n password?: string | null;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"payload-locked-documents\".\n */\nexport interface PayloadLockedDocument {\n id: string;\n document?:\n | ({\n relationTo: 'posts';\n value: string | Post;\n } | null)\n | ({\n relationTo: 'users';\n value: string | User;\n } | null);\n globalSlug?: string | null;\n user: {\n relationTo: 'users';\n value: string | User;\n };\n updatedAt: string;\n createdAt: string;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"payload-preferences\".\n */\nexport interface PayloadPreference {\n id: string;\n user: {\n relationTo: 'users';\n value: string | User;\n };\n key?: string | null;\n value?:\n | {\n [k: string]: unknown;\n }\n | unknown[]\n | string\n | number\n | boolean\n | null;\n updatedAt: string;\n createdAt: string;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"payload-migrations\".\n */\nexport interface PayloadMigration {\n id: string;\n name?: string | null;\n batch?: number | null;\n updatedAt: string;\n createdAt: string;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"posts_select\".\n */\nexport interface PostsSelect<T extends boolean = true> {\n text?: T;\n number?: T;\n group?:\n | T\n | {\n text?: T;\n number?: T;\n };\n array?:\n | T\n | {\n text?: T;\n number?: T;\n id?: T;\n };\n blocks?:\n | T\n | {\n intro?:\n | T\n | {\n text?: T;\n introText?: T;\n id?: T;\n blockName?: T;\n };\n cta?:\n | T\n | {\n text?: T;\n ctaText?: T;\n id?: T;\n blockName?: T;\n };\n };\n updatedAt?: T;\n createdAt?: T;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"users_select\".\n */\nexport interface UsersSelect<T extends boolean = true> {\n updatedAt?: T;\n createdAt?: T;\n email?: T;\n resetPasswordToken?: T;\n resetPasswordExpiration?: T;\n salt?: T;\n hash?: T;\n loginAttempts?: T;\n lockUntil?: T;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"payload-locked-documents_select\".\n */\nexport interface PayloadLockedDocumentsSelect<T extends boolean = true> {\n document?: T;\n globalSlug?: T;\n user?: T;\n updatedAt?: T;\n createdAt?: T;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"payload-preferences_select\".\n */\nexport interface PayloadPreferencesSelect<T extends boolean = true> {\n user?: T;\n key?: T;\n value?: T;\n updatedAt?: T;\n createdAt?: T;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"payload-migrations_select\".\n */\nexport interface PayloadMigrationsSelect<T extends boolean = true> {\n name?: T;\n batch?: T;\n updatedAt?: T;\n createdAt?: T;\n}\n/**\n * This interface was referenced by \\`Config\\`'s JSON-Schema\n * via the \\`definition\\` \"auth\".\n */\nexport interface Auth {\n [k: string]: unknown;\n}\n\n\ndeclare module 'payload' {\n // @ts-ignore \n export interface GeneratedTypes extends Config {}\n}\n`,\n },\n]\n\ndescribe('addSelectGenericsToGeneratedTypes', () => {\n it('should match return of given input with output', () => {\n for (const { input, output } of INPUT_AND_OUTPUT) {\n expect(\n addSelectGenericsToGeneratedTypes({\n compiledGeneratedTypes: input,\n }),\n ).toStrictEqual(output)\n }\n })\n})\n"],"names":["addSelectGenericsToGeneratedTypes","INPUT_AND_OUTPUT","input","output","describe","it","expect","compiledGeneratedTypes","toStrictEqual"],"mappings":"AAAA,SAASA,iCAAiC,QAAQ,yCAAwC;AAE1F,MAAMC,mBAAmB;IACvB;QACEC,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgRZ,CAAC;QACGC,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgRb,CAAC;IACC;CACD;AAEDC,SAAS,qCAAqC;IAC5CC,GAAG,kDAAkD;QACnD,KAAK,MAAM,EAAEH,KAAK,EAAEC,MAAM,EAAE,IAAIF,iBAAkB;YAChDK,OACEN,kCAAkC;gBAChCO,wBAAwBL;YAC1B,IACAM,aAAa,CAACL;QAClB;IACF;AACF"}
@@ -4,7 +4,7 @@ export const addSelectGenericsToGeneratedTypes = ({ compiledGeneratedTypes })=>{
4
4
  let isSelectTypeToken = false;
5
5
  for (const line of compiledGeneratedTypes.split('\n')){
6
6
  let newLine = line;
7
- if (line === ` collectionsSelect?: {` || line === ` globalsSelect?: {`) {
7
+ if (line === ` collectionsSelect: {` || line === ` globalsSelect: {`) {
8
8
  isCollectionsSelectToken = true;
9
9
  }
10
10
  if (isCollectionsSelectToken) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/addSelectGenericsToGeneretedTypes.ts"],"sourcesContent":["export const addSelectGenericsToGeneratedTypes = ({\n compiledGeneratedTypes,\n}: {\n compiledGeneratedTypes: string\n}) => {\n const modifiedLines = []\n\n let isCollectionsSelectToken = false\n let isSelectTypeToken = false\n\n for (const line of compiledGeneratedTypes.split('\\n')) {\n let newLine = line\n if (line === ` collectionsSelect?: {` || line === ` globalsSelect?: {`) {\n isCollectionsSelectToken = true\n }\n\n if (isCollectionsSelectToken) {\n if (line === ' };') {\n isCollectionsSelectToken = false\n } else {\n // replace <posts: PostsSelect;> with <posts: PostsSelect<true> | PostsSelect<false;>\n newLine = line.replace(/(['\"]?\\w+['\"]?):\\s*(\\w+);/g, (_, variable, type) => {\n return `${variable}: ${type}<false> | ${type}<true>;`\n })\n }\n }\n\n // eslint-disable-next-line regexp/no-unused-capturing-group\n if (line.match(/via the `definition` \"([\\w-]+_select)\"/g)) {\n isSelectTypeToken = true\n }\n\n if (isSelectTypeToken) {\n if (line.startsWith('export interface')) {\n // add generic to the interface\n newLine = line.replace(/(export interface\\s+\\w+)(\\s*\\{)/g, '$1<T extends boolean = true>$2')\n } else {\n // replace booleans with T on the line\n newLine = line.replace(/(?<!\\?)\\bboolean\\b/g, 'T')\n\n if (line === '}') {\n isSelectTypeToken = false\n }\n }\n }\n\n modifiedLines.push(newLine)\n }\n\n return modifiedLines.join('\\n')\n}\n"],"names":["addSelectGenericsToGeneratedTypes","compiledGeneratedTypes","modifiedLines","isCollectionsSelectToken","isSelectTypeToken","line","split","newLine","replace","_","variable","type","match","startsWith","push","join"],"mappings":"AAAA,OAAO,MAAMA,oCAAoC,CAAC,EAChDC,sBAAsB,EAGvB;IACC,MAAMC,gBAAgB,EAAE;IAExB,IAAIC,2BAA2B;IAC/B,IAAIC,oBAAoB;IAExB,KAAK,MAAMC,QAAQJ,uBAAuBK,KAAK,CAAC,MAAO;QACrD,IAAIC,UAAUF;QACd,IAAIA,SAAS,CAAC,uBAAuB,CAAC,IAAIA,SAAS,CAAC,mBAAmB,CAAC,EAAE;YACxEF,2BAA2B;QAC7B;QAEA,IAAIA,0BAA0B;YAC5B,IAAIE,SAAS,QAAQ;gBACnBF,2BAA2B;YAC7B,OAAO;gBACL,qFAAqF;gBACrFI,UAAUF,KAAKG,OAAO,CAAC,8BAA8B,CAACC,GAAGC,UAAUC;oBACjE,OAAO,CAAC,EAAED,SAAS,EAAE,EAAEC,KAAK,UAAU,EAAEA,KAAK,OAAO,CAAC;gBACvD;YACF;QACF;QAEA,4DAA4D;QAC5D,IAAIN,KAAKO,KAAK,CAAC,4CAA4C;YACzDR,oBAAoB;QACtB;QAEA,IAAIA,mBAAmB;YACrB,IAAIC,KAAKQ,UAAU,CAAC,qBAAqB;gBACvC,+BAA+B;gBAC/BN,UAAUF,KAAKG,OAAO,CAAC,oCAAoC;YAC7D,OAAO;gBACL,sCAAsC;gBACtCD,UAAUF,KAAKG,OAAO,CAAC,uBAAuB;gBAE9C,IAAIH,SAAS,KAAK;oBAChBD,oBAAoB;gBACtB;YACF;QACF;QAEAF,cAAcY,IAAI,CAACP;IACrB;IAEA,OAAOL,cAAca,IAAI,CAAC;AAC5B,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/addSelectGenericsToGeneretedTypes.ts"],"sourcesContent":["export const addSelectGenericsToGeneratedTypes = ({\n compiledGeneratedTypes,\n}: {\n compiledGeneratedTypes: string\n}) => {\n const modifiedLines = []\n\n let isCollectionsSelectToken = false\n let isSelectTypeToken = false\n\n for (const line of compiledGeneratedTypes.split('\\n')) {\n let newLine = line\n if (line === ` collectionsSelect: {` || line === ` globalsSelect: {`) {\n isCollectionsSelectToken = true\n }\n\n if (isCollectionsSelectToken) {\n if (line === ' };') {\n isCollectionsSelectToken = false\n } else {\n // replace <posts: PostsSelect;> with <posts: PostsSelect<true> | PostsSelect<false;>\n newLine = line.replace(/(['\"]?\\w+['\"]?):\\s*(\\w+);/g, (_, variable, type) => {\n return `${variable}: ${type}<false> | ${type}<true>;`\n })\n }\n }\n\n // eslint-disable-next-line regexp/no-unused-capturing-group\n if (line.match(/via the `definition` \"([\\w-]+_select)\"/g)) {\n isSelectTypeToken = true\n }\n\n if (isSelectTypeToken) {\n if (line.startsWith('export interface')) {\n // add generic to the interface\n newLine = line.replace(/(export interface\\s+\\w+)(\\s*\\{)/g, '$1<T extends boolean = true>$2')\n } else {\n // replace booleans with T on the line\n newLine = line.replace(/(?<!\\?)\\bboolean\\b/g, 'T')\n\n if (line === '}') {\n isSelectTypeToken = false\n }\n }\n }\n\n modifiedLines.push(newLine)\n }\n\n return modifiedLines.join('\\n')\n}\n"],"names":["addSelectGenericsToGeneratedTypes","compiledGeneratedTypes","modifiedLines","isCollectionsSelectToken","isSelectTypeToken","line","split","newLine","replace","_","variable","type","match","startsWith","push","join"],"mappings":"AAAA,OAAO,MAAMA,oCAAoC,CAAC,EAChDC,sBAAsB,EAGvB;IACC,MAAMC,gBAAgB,EAAE;IAExB,IAAIC,2BAA2B;IAC/B,IAAIC,oBAAoB;IAExB,KAAK,MAAMC,QAAQJ,uBAAuBK,KAAK,CAAC,MAAO;QACrD,IAAIC,UAAUF;QACd,IAAIA,SAAS,CAAC,sBAAsB,CAAC,IAAIA,SAAS,CAAC,kBAAkB,CAAC,EAAE;YACtEF,2BAA2B;QAC7B;QAEA,IAAIA,0BAA0B;YAC5B,IAAIE,SAAS,QAAQ;gBACnBF,2BAA2B;YAC7B,OAAO;gBACL,qFAAqF;gBACrFI,UAAUF,KAAKG,OAAO,CAAC,8BAA8B,CAACC,GAAGC,UAAUC;oBACjE,OAAO,CAAC,EAAED,SAAS,EAAE,EAAEC,KAAK,UAAU,EAAEA,KAAK,OAAO,CAAC;gBACvD;YACF;QACF;QAEA,4DAA4D;QAC5D,IAAIN,KAAKO,KAAK,CAAC,4CAA4C;YACzDR,oBAAoB;QACtB;QAEA,IAAIA,mBAAmB;YACrB,IAAIC,KAAKQ,UAAU,CAAC,qBAAqB;gBACvC,+BAA+B;gBAC/BN,UAAUF,KAAKG,OAAO,CAAC,oCAAoC;YAC7D,OAAO;gBACL,sCAAsC;gBACtCD,UAAUF,KAAKG,OAAO,CAAC,uBAAuB;gBAE9C,IAAIH,SAAS,KAAK;oBAChBD,oBAAoB;gBACtB;YACF;QACF;QAEAF,cAAcY,IAAI,CAACP;IACrB;IAEA,OAAOL,cAAca,IAAI,CAAC;AAC5B,EAAC"}
@@ -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;AAMnE,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;AAoJvE;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,mBAAmB,EAC9B,UAAU,EAAE,OAAO,GAClB,mBAAmB,GAAG,mBAAmB,EAAE,CAO7C;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,CA6ZA;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,EAChC,sBAAsB,CAAC,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAA;CAAE,GAC9D,WAAW,CA8Cb;AAED,wBAAgB,wBAAwB,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,KAAK,EAAE,CAAA;CAAE,GAAG,WAAW,CA0FrF;AAgHD,wBAAgB,oCAAoC,CAClD,MAAM,EAAE,yBAAyB,GAChC,WAAW,CA0Bb;AAoBD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,eAAe,EACvB,aAAa,CAAC,EAAE,QAAQ,GAAG,MAAM,GAChC,WAAW,CA0Gb"}
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;AAMnE,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;AAoJvE;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,mBAAmB,EAC9B,UAAU,EAAE,OAAO,GAClB,mBAAmB,GAAG,mBAAmB,EAAE,CAO7C;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,CA6ZA;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,EAChC,sBAAsB,CAAC,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAA;CAAE,GAC9D,WAAW,CA8Cb;AAED,wBAAgB,wBAAwB,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,KAAK,EAAE,CAAA;CAAE,GAAG,WAAW,CA0FrF;AAgHD,wBAAgB,oCAAoC,CAClD,MAAM,EAAE,yBAAyB,GAChC,WAAW,CA0Bb;AAoBD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,eAAe,EACvB,aAAa,CAAC,EAAE,QAAQ,GAAG,MAAM,GAChC,WAAW,CAmHb"}
@@ -935,6 +935,8 @@ function generateAuthOperationSchemas(collections) {
935
935
  'user',
936
936
  'locale',
937
937
  'collections',
938
+ 'collectionsSelect',
939
+ 'globalsSelect',
938
940
  'globals',
939
941
  'auth',
940
942
  'db'
@@ -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 { Auth } from '../auth/types.js'\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 { MissingEditorProp } from '../errors/MissingEditorProp.js'\nimport { fieldAffectsData, tabHasName } from '../fields/config/types.js'\nimport { generateJobsJSONSchemas } from '../queues/config/generateJobsJSONSchemas.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) {\n return false\n }\n\n const isMarkedRequired = 'required' in field && field.required === true\n if (fieldAffectsData(field) && isMarkedRequired) {\n return true\n }\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 generateEntitySelectSchemas(\n entities: (SanitizedCollectionConfig | SanitizedGlobalConfig)[],\n): JSONSchema4 {\n const properties = [...entities].reduce((acc, { slug }) => {\n acc[slug] = {\n $ref: `#/definitions/${slug}_select`,\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 * Generates the JSON Schema for database configuration\n *\n * @example { db: idType: string }\n */\nfunction generateDbEntitySchema(config: SanitizedConfig): JSONSchema4 {\n const defaultIDType: JSONSchema4 =\n config.db?.defaultIDType === 'number' ? { type: 'number' } : { type: 'string' }\n\n return {\n type: 'object',\n additionalProperties: false,\n properties: {\n defaultIDType,\n },\n required: ['defaultIDType'],\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) {\n return fieldType\n }\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) {\n requiredFieldNames.add(field.name)\n }\n\n let fieldSchema: JSONSchema4\n\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 = field.jsonSchema?.schema || {\n type: ['object', 'array', 'string', 'number', 'boolean', 'null'],\n }\n break\n }\n\n case 'richText': {\n if (!field?.editor) {\n throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor\n }\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 },\n }\n if (optionEnums?.length) {\n ;(fieldSchema.items as JSONSchema4).enum = optionEnums\n }\n } else {\n fieldSchema = {\n type: withNullableJSONSchemaType('string', isRequired),\n }\n if (optionEnums?.length) {\n fieldSchema.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 'join': {\n fieldSchema = {\n type: withNullableJSONSchemaType('object', false),\n additionalProperties: false,\n properties: {\n docs: {\n type: withNullableJSONSchemaType('array', false),\n items: {\n oneOf: [\n {\n type: collectionIDFieldTypes[field.collection],\n },\n {\n $ref: `#/definitions/${field.collection}`,\n },\n ],\n },\n },\n hasNextPage: { type: withNullableJSONSchemaType('boolean', false) },\n },\n }\n break\n }\n\n case 'upload':\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 'blocks': {\n // Check for a case where no blocks are provided.\n // We need to generate an empty array for this case, note that JSON schema 4 doesn't support empty arrays\n // so the best we can get is `unknown[]`\n const hasBlocks = Boolean(field.blocks.length)\n\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: hasBlocks\n ? {\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 }\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 ('typescriptSchema' in field && field?.typescriptSchema?.length) {\n for (const schema of field.typescriptSchema) {\n fieldSchema = schema({ jsonSchema: fieldSchema })\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 collectionIDFieldTypes?: { [key: string]: 'number' | 'string' },\n): JSONSchema4 {\n if (!collectionIDFieldTypes) {\n collectionIDFieldTypes = getCollectionIDFieldTypes({ config, defaultIDType })\n }\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 return {\n type: 'object',\n additionalProperties: false,\n title,\n ...fieldsToJSONSchema(collectionIDFieldTypes, entity.fields, interfaceNameDefinitions, config),\n }\n}\n\nexport function fieldsToSelectJSONSchema({ fields }: { fields: Field[] }): JSONSchema4 {\n const schema: JSONSchema4 = {\n type: 'object',\n additionalProperties: false,\n properties: {},\n }\n\n for (const field of fields) {\n switch (field.type) {\n case 'row':\n case 'collapsible':\n schema.properties = {\n ...schema.properties,\n ...fieldsToSelectJSONSchema({ fields: field.fields }).properties,\n }\n\n break\n\n case 'array':\n case 'group':\n schema.properties[field.name] = {\n oneOf: [\n {\n type: 'boolean',\n },\n fieldsToSelectJSONSchema({ fields: field.fields }),\n ],\n }\n break\n\n case 'tabs':\n for (const tab of field.tabs) {\n if (tabHasName(tab)) {\n schema.properties[tab.name] = {\n oneOf: [\n {\n type: 'boolean',\n },\n fieldsToSelectJSONSchema({ fields: tab.fields }),\n ],\n }\n continue\n }\n\n schema.properties = {\n ...schema.properties,\n ...fieldsToSelectJSONSchema({ fields: tab.fields }).properties,\n }\n }\n break\n\n case 'blocks': {\n const blocksSchema: JSONSchema4 = {\n type: 'object',\n additionalProperties: false,\n properties: {},\n }\n\n for (const block of field.blocks) {\n blocksSchema.properties[block.slug] = {\n oneOf: [\n {\n type: 'boolean',\n },\n fieldsToSelectJSONSchema({ fields: block.fields }),\n ],\n }\n }\n\n schema.properties[field.name] = {\n oneOf: [\n {\n type: 'boolean',\n },\n blocksSchema,\n ],\n }\n\n break\n }\n\n default:\n schema.properties[field.name] = {\n type: 'boolean',\n }\n break\n }\n }\n\n return schema\n}\n\nconst fieldType: JSONSchema4 = {\n type: 'string',\n required: false,\n}\nconst generateAuthFieldTypes = ({\n type,\n loginWithUsername,\n}: {\n loginWithUsername: Auth['loginWithUsername']\n type: 'forgotOrUnlock' | 'login' | 'register'\n}): JSONSchema4 => {\n if (loginWithUsername) {\n switch (type) {\n case 'login': {\n if (loginWithUsername.allowEmailLogin) {\n // allow username or email and require password for login\n return {\n additionalProperties: false,\n oneOf: [\n {\n additionalProperties: false,\n properties: { email: fieldType, password: fieldType },\n required: ['email', 'password'],\n },\n {\n additionalProperties: false,\n properties: { password: fieldType, username: fieldType },\n required: ['username', 'password'],\n },\n ],\n }\n } else {\n // allow only username and password for login\n return {\n additionalProperties: false,\n properties: {\n password: fieldType,\n username: fieldType,\n },\n required: ['username', 'password'],\n }\n }\n }\n\n case 'register': {\n const requiredFields: ('email' | 'password' | 'username')[] = ['password']\n const properties: {\n email?: JSONSchema4['properties']\n password?: JSONSchema4['properties']\n username?: JSONSchema4['properties']\n } = {\n password: fieldType,\n username: fieldType,\n }\n\n if (loginWithUsername.requireEmail) {\n requiredFields.push('email')\n }\n if (loginWithUsername.requireUsername) {\n requiredFields.push('username')\n }\n if (loginWithUsername.requireEmail || loginWithUsername.allowEmailLogin) {\n properties.email = fieldType\n }\n\n return {\n additionalProperties: false,\n properties,\n required: requiredFields,\n }\n }\n\n case 'forgotOrUnlock': {\n if (loginWithUsername.allowEmailLogin) {\n // allow email or username for unlock/forgot-password\n return {\n additionalProperties: false,\n oneOf: [\n {\n additionalProperties: false,\n properties: { email: fieldType },\n required: ['email'],\n },\n {\n additionalProperties: false,\n properties: { username: fieldType },\n required: ['username'],\n },\n ],\n }\n } else {\n // allow only username for unlock/forgot-password\n return {\n additionalProperties: false,\n properties: { username: fieldType },\n required: ['username'],\n }\n }\n }\n }\n }\n\n // default email (and password for login/register)\n return {\n additionalProperties: false,\n properties: { email: fieldType, password: fieldType },\n required: ['email', 'password'],\n }\n}\n\nexport function authCollectionToOperationsJSONSchema(\n config: SanitizedCollectionConfig,\n): JSONSchema4 {\n const loginWithUsername = config.auth?.loginWithUsername\n const loginUserFields: JSONSchema4 = generateAuthFieldTypes({ type: 'login', loginWithUsername })\n const forgotOrUnlockUserFields: JSONSchema4 = generateAuthFieldTypes({\n type: 'forgotOrUnlock',\n loginWithUsername,\n })\n const registerUserFields: JSONSchema4 = generateAuthFieldTypes({\n type: 'register',\n loginWithUsername,\n })\n\n const properties: JSONSchema4['properties'] = {\n forgotPassword: forgotOrUnlockUserFields,\n login: loginUserFields,\n registerFirstUser: registerUserFields,\n unlock: forgotOrUnlockUserFields,\n }\n\n return {\n type: 'object',\n additionalProperties: false,\n properties,\n required: Object.keys(properties),\n title: `${singular(toWords(`${config.slug}`, true))}AuthOperations`,\n }\n}\n\nfunction generateAuthOperationSchemas(collections: SanitizedCollectionConfig[]): JSONSchema4 {\n const properties = collections.reduce((acc, collection) => {\n if (collection.auth) {\n acc[collection.slug] = {\n $ref: `#/definitions/auth/${collection.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\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 // 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 // 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\n const entities: {\n entity: SanitizedCollectionConfig | SanitizedGlobalConfig\n type: 'collection' | 'global'\n }[] = [\n ...config.globals.map((global) => ({ type: 'global' as const, entity: global })),\n ...config.collections.map((collection) => ({\n type: 'collection' as const,\n entity: collection,\n })),\n ]\n\n const entityDefinitions: { [k: string]: JSONSchema4 } = entities.reduce(\n (acc, { type, entity }) => {\n acc[entity.slug] = entityToJSONSchema(\n config,\n entity,\n interfaceNameDefinitions,\n defaultIDType,\n collectionIDFieldTypes,\n )\n const select = fieldsToSelectJSONSchema({ fields: entity.fields })\n\n if (type === 'global') {\n select.properties.globalType = {\n type: 'boolean',\n }\n }\n\n acc[`${entity.slug}_select`] = {\n type: 'object',\n additionalProperties: false,\n ...select,\n }\n\n return acc\n },\n {},\n )\n\n const authOperationDefinitions = [...config.collections]\n .filter(({ auth }) => Boolean(auth))\n .reduce(\n (acc, authCollection) => {\n acc.auth[authCollection.slug] = authCollectionToOperationsJSONSchema(authCollection)\n return acc\n },\n { auth: {} },\n )\n\n const jobsSchemas = config.jobs\n ? generateJobsJSONSchemas(config, config.jobs, interfaceNameDefinitions, collectionIDFieldTypes)\n : {}\n\n let jsonSchema: JSONSchema4 = {\n additionalProperties: false,\n definitions: {\n ...entityDefinitions,\n ...Object.fromEntries(interfaceNameDefinitions),\n ...authOperationDefinitions,\n },\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 auth: generateAuthOperationSchemas(config.collections),\n collections: generateEntitySchemas(config.collections || []),\n collectionsSelect: generateEntitySelectSchemas(config.collections || []),\n db: generateDbEntitySchema(config),\n globals: generateEntitySchemas(config.globals || []),\n globalsSelect: generateEntitySelectSchemas(config.globals || []),\n locale: generateLocaleEntitySchemas(config.localization),\n user: generateAuthEntitySchemas(config.collections),\n },\n required: ['user', 'locale', 'collections', 'globals', 'auth', 'db'],\n title: 'Config',\n }\n if (jobsSchemas.definitions?.size) {\n for (const [key, value] of jobsSchemas.definitions) {\n jsonSchema.definitions[key] = value\n }\n }\n if (jobsSchemas.properties) {\n jsonSchema.properties.jobs = {\n type: 'object',\n additionalProperties: false,\n properties: jobsSchemas.properties,\n required: ['tasks'],\n }\n }\n\n if (config?.typescript?.schema?.length) {\n for (const schema of config.typescript.schema) {\n jsonSchema = schema({ jsonSchema })\n }\n }\n\n return jsonSchema\n}\n"],"names":["pluralize","singular","MissingEditorProp","fieldAffectsData","tabHasName","generateJobsJSONSchemas","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","generateEntitySelectSchemas","generateLocaleEntitySchemas","localization","locales","localesFromConfig","locale","code","enum","generateAuthEntitySchemas","filter","auth","allOf","collection","oneOf","generateDbEntitySchema","config","defaultIDType","db","withNullableJSONSchemaType","fieldType","isRequired","fieldTypes","push","fieldsToJSONSchema","collectionIDFieldTypes","interfaceNameDefinitions","requiredFieldNames","Set","fromEntries","fieldSchemas","add","name","fieldSchema","hasMany","items","jsonSchema","schema","editor","Error","outputSchema","optionEnums","length","maxItems","minItems","docs","hasNextPage","Array","isArray","relationTo","relation","const","hasBlocks","blocks","block","blockFieldSchemas","blockSchema","blockType","interfaceName","set","childSchema","entries","forEach","propName","propSchema","hasRequiredFields","typescriptSchema","Map","from","entityToJSONSchema","incomingEntity","entity","title","typescript","interface","idField","customIdField","find","unshift","timestamps","disableLocalStrategy","fieldsToSelectJSONSchema","blocksSchema","generateAuthFieldTypes","loginWithUsername","allowEmailLogin","email","password","username","requiredFields","requireEmail","requireUsername","authCollectionToOperationsJSONSchema","loginUserFields","forgotOrUnlockUserFields","registerUserFields","forgotPassword","login","registerFirstUser","unlock","generateAuthOperationSchemas","collections","configToJSONSchema","globals","global","entityDefinitions","select","globalType","authOperationDefinitions","authCollection","jobsSchemas","jobs","definitions","collectionsSelect","globalsSelect","user","size","key"],"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 { Auth } from '../auth/types.js'\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 { MissingEditorProp } from '../errors/MissingEditorProp.js'\nimport { fieldAffectsData, tabHasName } from '../fields/config/types.js'\nimport { generateJobsJSONSchemas } from '../queues/config/generateJobsJSONSchemas.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) {\n return false\n }\n\n const isMarkedRequired = 'required' in field && field.required === true\n if (fieldAffectsData(field) && isMarkedRequired) {\n return true\n }\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 generateEntitySelectSchemas(\n entities: (SanitizedCollectionConfig | SanitizedGlobalConfig)[],\n): JSONSchema4 {\n const properties = [...entities].reduce((acc, { slug }) => {\n acc[slug] = {\n $ref: `#/definitions/${slug}_select`,\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 * Generates the JSON Schema for database configuration\n *\n * @example { db: idType: string }\n */\nfunction generateDbEntitySchema(config: SanitizedConfig): JSONSchema4 {\n const defaultIDType: JSONSchema4 =\n config.db?.defaultIDType === 'number' ? { type: 'number' } : { type: 'string' }\n\n return {\n type: 'object',\n additionalProperties: false,\n properties: {\n defaultIDType,\n },\n required: ['defaultIDType'],\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) {\n return fieldType\n }\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) {\n requiredFieldNames.add(field.name)\n }\n\n let fieldSchema: JSONSchema4\n\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 = field.jsonSchema?.schema || {\n type: ['object', 'array', 'string', 'number', 'boolean', 'null'],\n }\n break\n }\n\n case 'richText': {\n if (!field?.editor) {\n throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor\n }\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 },\n }\n if (optionEnums?.length) {\n ;(fieldSchema.items as JSONSchema4).enum = optionEnums\n }\n } else {\n fieldSchema = {\n type: withNullableJSONSchemaType('string', isRequired),\n }\n if (optionEnums?.length) {\n fieldSchema.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 'join': {\n fieldSchema = {\n type: withNullableJSONSchemaType('object', false),\n additionalProperties: false,\n properties: {\n docs: {\n type: withNullableJSONSchemaType('array', false),\n items: {\n oneOf: [\n {\n type: collectionIDFieldTypes[field.collection],\n },\n {\n $ref: `#/definitions/${field.collection}`,\n },\n ],\n },\n },\n hasNextPage: { type: withNullableJSONSchemaType('boolean', false) },\n },\n }\n break\n }\n\n case 'upload':\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 'blocks': {\n // Check for a case where no blocks are provided.\n // We need to generate an empty array for this case, note that JSON schema 4 doesn't support empty arrays\n // so the best we can get is `unknown[]`\n const hasBlocks = Boolean(field.blocks.length)\n\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: hasBlocks\n ? {\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 }\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 ('typescriptSchema' in field && field?.typescriptSchema?.length) {\n for (const schema of field.typescriptSchema) {\n fieldSchema = schema({ jsonSchema: fieldSchema })\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 collectionIDFieldTypes?: { [key: string]: 'number' | 'string' },\n): JSONSchema4 {\n if (!collectionIDFieldTypes) {\n collectionIDFieldTypes = getCollectionIDFieldTypes({ config, defaultIDType })\n }\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 return {\n type: 'object',\n additionalProperties: false,\n title,\n ...fieldsToJSONSchema(collectionIDFieldTypes, entity.fields, interfaceNameDefinitions, config),\n }\n}\n\nexport function fieldsToSelectJSONSchema({ fields }: { fields: Field[] }): JSONSchema4 {\n const schema: JSONSchema4 = {\n type: 'object',\n additionalProperties: false,\n properties: {},\n }\n\n for (const field of fields) {\n switch (field.type) {\n case 'row':\n case 'collapsible':\n schema.properties = {\n ...schema.properties,\n ...fieldsToSelectJSONSchema({ fields: field.fields }).properties,\n }\n\n break\n\n case 'array':\n case 'group':\n schema.properties[field.name] = {\n oneOf: [\n {\n type: 'boolean',\n },\n fieldsToSelectJSONSchema({ fields: field.fields }),\n ],\n }\n break\n\n case 'tabs':\n for (const tab of field.tabs) {\n if (tabHasName(tab)) {\n schema.properties[tab.name] = {\n oneOf: [\n {\n type: 'boolean',\n },\n fieldsToSelectJSONSchema({ fields: tab.fields }),\n ],\n }\n continue\n }\n\n schema.properties = {\n ...schema.properties,\n ...fieldsToSelectJSONSchema({ fields: tab.fields }).properties,\n }\n }\n break\n\n case 'blocks': {\n const blocksSchema: JSONSchema4 = {\n type: 'object',\n additionalProperties: false,\n properties: {},\n }\n\n for (const block of field.blocks) {\n blocksSchema.properties[block.slug] = {\n oneOf: [\n {\n type: 'boolean',\n },\n fieldsToSelectJSONSchema({ fields: block.fields }),\n ],\n }\n }\n\n schema.properties[field.name] = {\n oneOf: [\n {\n type: 'boolean',\n },\n blocksSchema,\n ],\n }\n\n break\n }\n\n default:\n schema.properties[field.name] = {\n type: 'boolean',\n }\n break\n }\n }\n\n return schema\n}\n\nconst fieldType: JSONSchema4 = {\n type: 'string',\n required: false,\n}\nconst generateAuthFieldTypes = ({\n type,\n loginWithUsername,\n}: {\n loginWithUsername: Auth['loginWithUsername']\n type: 'forgotOrUnlock' | 'login' | 'register'\n}): JSONSchema4 => {\n if (loginWithUsername) {\n switch (type) {\n case 'login': {\n if (loginWithUsername.allowEmailLogin) {\n // allow username or email and require password for login\n return {\n additionalProperties: false,\n oneOf: [\n {\n additionalProperties: false,\n properties: { email: fieldType, password: fieldType },\n required: ['email', 'password'],\n },\n {\n additionalProperties: false,\n properties: { password: fieldType, username: fieldType },\n required: ['username', 'password'],\n },\n ],\n }\n } else {\n // allow only username and password for login\n return {\n additionalProperties: false,\n properties: {\n password: fieldType,\n username: fieldType,\n },\n required: ['username', 'password'],\n }\n }\n }\n\n case 'register': {\n const requiredFields: ('email' | 'password' | 'username')[] = ['password']\n const properties: {\n email?: JSONSchema4['properties']\n password?: JSONSchema4['properties']\n username?: JSONSchema4['properties']\n } = {\n password: fieldType,\n username: fieldType,\n }\n\n if (loginWithUsername.requireEmail) {\n requiredFields.push('email')\n }\n if (loginWithUsername.requireUsername) {\n requiredFields.push('username')\n }\n if (loginWithUsername.requireEmail || loginWithUsername.allowEmailLogin) {\n properties.email = fieldType\n }\n\n return {\n additionalProperties: false,\n properties,\n required: requiredFields,\n }\n }\n\n case 'forgotOrUnlock': {\n if (loginWithUsername.allowEmailLogin) {\n // allow email or username for unlock/forgot-password\n return {\n additionalProperties: false,\n oneOf: [\n {\n additionalProperties: false,\n properties: { email: fieldType },\n required: ['email'],\n },\n {\n additionalProperties: false,\n properties: { username: fieldType },\n required: ['username'],\n },\n ],\n }\n } else {\n // allow only username for unlock/forgot-password\n return {\n additionalProperties: false,\n properties: { username: fieldType },\n required: ['username'],\n }\n }\n }\n }\n }\n\n // default email (and password for login/register)\n return {\n additionalProperties: false,\n properties: { email: fieldType, password: fieldType },\n required: ['email', 'password'],\n }\n}\n\nexport function authCollectionToOperationsJSONSchema(\n config: SanitizedCollectionConfig,\n): JSONSchema4 {\n const loginWithUsername = config.auth?.loginWithUsername\n const loginUserFields: JSONSchema4 = generateAuthFieldTypes({ type: 'login', loginWithUsername })\n const forgotOrUnlockUserFields: JSONSchema4 = generateAuthFieldTypes({\n type: 'forgotOrUnlock',\n loginWithUsername,\n })\n const registerUserFields: JSONSchema4 = generateAuthFieldTypes({\n type: 'register',\n loginWithUsername,\n })\n\n const properties: JSONSchema4['properties'] = {\n forgotPassword: forgotOrUnlockUserFields,\n login: loginUserFields,\n registerFirstUser: registerUserFields,\n unlock: forgotOrUnlockUserFields,\n }\n\n return {\n type: 'object',\n additionalProperties: false,\n properties,\n required: Object.keys(properties),\n title: `${singular(toWords(`${config.slug}`, true))}AuthOperations`,\n }\n}\n\nfunction generateAuthOperationSchemas(collections: SanitizedCollectionConfig[]): JSONSchema4 {\n const properties = collections.reduce((acc, collection) => {\n if (collection.auth) {\n acc[collection.slug] = {\n $ref: `#/definitions/auth/${collection.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\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 // 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 // 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\n const entities: {\n entity: SanitizedCollectionConfig | SanitizedGlobalConfig\n type: 'collection' | 'global'\n }[] = [\n ...config.globals.map((global) => ({ type: 'global' as const, entity: global })),\n ...config.collections.map((collection) => ({\n type: 'collection' as const,\n entity: collection,\n })),\n ]\n\n const entityDefinitions: { [k: string]: JSONSchema4 } = entities.reduce(\n (acc, { type, entity }) => {\n acc[entity.slug] = entityToJSONSchema(\n config,\n entity,\n interfaceNameDefinitions,\n defaultIDType,\n collectionIDFieldTypes,\n )\n const select = fieldsToSelectJSONSchema({ fields: entity.fields })\n\n if (type === 'global') {\n select.properties.globalType = {\n type: 'boolean',\n }\n }\n\n acc[`${entity.slug}_select`] = {\n type: 'object',\n additionalProperties: false,\n ...select,\n }\n\n return acc\n },\n {},\n )\n\n const authOperationDefinitions = [...config.collections]\n .filter(({ auth }) => Boolean(auth))\n .reduce(\n (acc, authCollection) => {\n acc.auth[authCollection.slug] = authCollectionToOperationsJSONSchema(authCollection)\n return acc\n },\n { auth: {} },\n )\n\n const jobsSchemas = config.jobs\n ? generateJobsJSONSchemas(config, config.jobs, interfaceNameDefinitions, collectionIDFieldTypes)\n : {}\n\n let jsonSchema: JSONSchema4 = {\n additionalProperties: false,\n definitions: {\n ...entityDefinitions,\n ...Object.fromEntries(interfaceNameDefinitions),\n ...authOperationDefinitions,\n },\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 auth: generateAuthOperationSchemas(config.collections),\n collections: generateEntitySchemas(config.collections || []),\n collectionsSelect: generateEntitySelectSchemas(config.collections || []),\n db: generateDbEntitySchema(config),\n globals: generateEntitySchemas(config.globals || []),\n globalsSelect: generateEntitySelectSchemas(config.globals || []),\n locale: generateLocaleEntitySchemas(config.localization),\n user: generateAuthEntitySchemas(config.collections),\n },\n required: [\n 'user',\n 'locale',\n 'collections',\n 'collectionsSelect',\n 'globalsSelect',\n 'globals',\n 'auth',\n 'db',\n ],\n title: 'Config',\n }\n if (jobsSchemas.definitions?.size) {\n for (const [key, value] of jobsSchemas.definitions) {\n jsonSchema.definitions[key] = value\n }\n }\n if (jobsSchemas.properties) {\n jsonSchema.properties.jobs = {\n type: 'object',\n additionalProperties: false,\n properties: jobsSchemas.properties,\n required: ['tasks'],\n }\n }\n\n if (config?.typescript?.schema?.length) {\n for (const schema of config.typescript.schema) {\n jsonSchema = schema({ jsonSchema })\n }\n }\n\n return jsonSchema\n}\n"],"names":["pluralize","singular","MissingEditorProp","fieldAffectsData","tabHasName","generateJobsJSONSchemas","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","generateEntitySelectSchemas","generateLocaleEntitySchemas","localization","locales","localesFromConfig","locale","code","enum","generateAuthEntitySchemas","filter","auth","allOf","collection","oneOf","generateDbEntitySchema","config","defaultIDType","db","withNullableJSONSchemaType","fieldType","isRequired","fieldTypes","push","fieldsToJSONSchema","collectionIDFieldTypes","interfaceNameDefinitions","requiredFieldNames","Set","fromEntries","fieldSchemas","add","name","fieldSchema","hasMany","items","jsonSchema","schema","editor","Error","outputSchema","optionEnums","length","maxItems","minItems","docs","hasNextPage","Array","isArray","relationTo","relation","const","hasBlocks","blocks","block","blockFieldSchemas","blockSchema","blockType","interfaceName","set","childSchema","entries","forEach","propName","propSchema","hasRequiredFields","typescriptSchema","Map","from","entityToJSONSchema","incomingEntity","entity","title","typescript","interface","idField","customIdField","find","unshift","timestamps","disableLocalStrategy","fieldsToSelectJSONSchema","blocksSchema","generateAuthFieldTypes","loginWithUsername","allowEmailLogin","email","password","username","requiredFields","requireEmail","requireUsername","authCollectionToOperationsJSONSchema","loginUserFields","forgotOrUnlockUserFields","registerUserFields","forgotPassword","login","registerFirstUser","unlock","generateAuthOperationSchemas","collections","configToJSONSchema","globals","global","entityDefinitions","select","globalType","authOperationDefinitions","authCollection","jobsSchemas","jobs","definitions","collectionsSelect","globalsSelect","user","size","key"],"mappings":"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"}
@@ -14,6 +14,7 @@ export type BaseEvent = {
14
14
  nodeVersion: string;
15
15
  payloadVersion: string;
16
16
  projectID: string;
17
+ projectIDSource: 'cwd' | 'git' | 'packageJSON' | 'serverURL';
17
18
  uploadAdapters: string[];
18
19
  };
19
20
  type PackageJSON = {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utilities/telemetry/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAM7D,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAE,IAAI,GAAG,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,IAAI,GAAG,MAAM,CAAA;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,yBAAyB,EAAE,IAAI,GAAG,MAAM,CAAA;IACxC,mBAAmB,EAAE,OAAO,CAAA;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,EAAE,CAAA;CACzB,CAAA;AAED,KAAK,WAAW,GAAG;IACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IAChD,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,KAAK,cAAc,GAAG,cAAc,GAAG,eAAe,CAAA;AAEtD,KAAK,IAAI,GAAG;IACV,KAAK,EAAE,cAAc,CAAA;IACrB,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAID,eAAO,MAAM,SAAS,uBAA8B,IAAI,KAAG,OAAO,CAAC,IAAI,CAyCtE,CAAA;AAmED,eAAO,MAAM,iBAAiB,gBAAiB,WAAW,KAAG,MAE5D,CAAA;AAED,eAAO,MAAM,mBAAmB,YACrB,OAAO,KACf,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,2BAA2B,GAAG,qBAAqB,CAcjF,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utilities/telemetry/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAM7D,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAE,IAAI,GAAG,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,IAAI,GAAG,MAAM,CAAA;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,yBAAyB,EAAE,IAAI,GAAG,MAAM,CAAA;IACxC,mBAAmB,EAAE,OAAO,CAAA;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,KAAK,GAAG,KAAK,GAAG,aAAa,GAAG,WAAW,CAAA;IAC5D,cAAc,EAAE,MAAM,EAAE,CAAA;CACzB,CAAA;AAED,KAAK,WAAW,GAAG;IACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IAChD,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,KAAK,cAAc,GAAG,cAAc,GAAG,eAAe,CAAA;AAEtD,KAAK,IAAI,GAAG;IACV,KAAK,EAAE,cAAc,CAAA;IACrB,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAID,eAAO,MAAM,SAAS,uBAA8B,IAAI,KAAG,OAAO,CAAC,IAAI,CA2CtE,CAAA;AAiFD,eAAO,MAAM,iBAAiB,gBAAiB,WAAW,KAAG,MAE5D,CAAA;AAED,eAAO,MAAM,mBAAmB,YACrB,OAAO,KACf,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,2BAA2B,GAAG,qBAAqB,CAcjF,CAAA"}
@@ -13,6 +13,7 @@ export const sendEvent = async ({ event, payload })=>{
13
13
  const { packageJSON, packageJSONPath } = await getPackageJSON();
14
14
  // Only generate the base event once
15
15
  if (!baseEvent) {
16
+ const { projectID, source: projectIDSource } = getProjectID(payload, packageJSON);
16
17
  baseEvent = {
17
18
  ciName: ciInfo.isCI ? ciInfo.name : null,
18
19
  envID: getEnvID(),
@@ -20,7 +21,8 @@ export const sendEvent = async ({ event, payload })=>{
20
21
  nodeEnv: process.env.NODE_ENV || 'development',
21
22
  nodeVersion: process.version,
22
23
  payloadVersion: getPayloadVersion(packageJSON),
23
- projectID: getProjectID(payload, packageJSON),
24
+ projectID,
25
+ projectIDSource,
24
26
  ...getLocalizationInfo(payload),
25
27
  dbAdapter: payload.db.name,
26
28
  emailAdapter: payload.email?.name || null,
@@ -69,8 +71,32 @@ export const sendEvent = async ({ event, payload })=>{
69
71
  return generated;
70
72
  };
71
73
  const getProjectID = (payload, packageJSON)=>{
72
- const projectID = getGitID(payload) || getPackageJSONID(payload, packageJSON) || payload.config.serverURL || process.cwd();
73
- return oneWayHash(projectID, payload.secret);
74
+ const gitID = getGitID(payload);
75
+ if (gitID) {
76
+ return {
77
+ projectID: oneWayHash(gitID, payload.secret),
78
+ source: 'git'
79
+ };
80
+ }
81
+ const packageJSONID = getPackageJSONID(payload, packageJSON);
82
+ if (packageJSONID) {
83
+ return {
84
+ projectID: oneWayHash(packageJSONID, payload.secret),
85
+ source: 'packageJSON'
86
+ };
87
+ }
88
+ const serverURL = payload.config.serverURL;
89
+ if (serverURL) {
90
+ return {
91
+ projectID: oneWayHash(serverURL, payload.secret),
92
+ source: 'serverURL'
93
+ };
94
+ }
95
+ const cwd = process.cwd();
96
+ return {
97
+ projectID: oneWayHash(cwd, payload.secret),
98
+ source: 'cwd'
99
+ };
74
100
  };
75
101
  const getGitID = (payload)=>{
76
102
  try {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utilities/telemetry/index.ts"],"sourcesContent":["import { execSync } from 'child_process'\nimport ciInfo from 'ci-info'\nimport { randomBytes } from 'crypto'\nimport fs from 'fs'\nimport path from 'path'\nimport { fileURLToPath } from 'url'\n\nimport type { Payload } from '../../types/index.js'\nimport type { AdminInitEvent } from './events/adminInit.js'\nimport type { ServerInitEvent } from './events/serverInit.js'\n\nimport { findUp } from '../findUp.js'\nimport { Conf } from './conf/index.js'\nimport { oneWayHash } from './oneWayHash.js'\n\nexport type BaseEvent = {\n ciName: null | string\n dbAdapter: string\n emailAdapter: null | string\n envID: string\n isCI: boolean\n locales: string[]\n localizationDefaultLocale: null | string\n localizationEnabled: boolean\n nodeEnv: string\n nodeVersion: string\n payloadVersion: string\n projectID: string\n uploadAdapters: string[]\n}\n\ntype PackageJSON = {\n dependencies: Record<string, string | undefined>\n name: string\n}\n\ntype TelemetryEvent = AdminInitEvent | ServerInitEvent\n\ntype Args = {\n event: TelemetryEvent\n payload: Payload\n}\n\nlet baseEvent: BaseEvent | null = null\n\nexport const sendEvent = async ({ event, payload }: Args): Promise<void> => {\n try {\n const { packageJSON, packageJSONPath } = await getPackageJSON()\n\n // Only generate the base event once\n if (!baseEvent) {\n baseEvent = {\n ciName: ciInfo.isCI ? ciInfo.name : null,\n envID: getEnvID(),\n isCI: ciInfo.isCI,\n nodeEnv: process.env.NODE_ENV || 'development',\n nodeVersion: process.version,\n payloadVersion: getPayloadVersion(packageJSON),\n projectID: getProjectID(payload, packageJSON),\n ...getLocalizationInfo(payload),\n dbAdapter: payload.db.name,\n emailAdapter: payload.email?.name || null,\n uploadAdapters: payload.config.upload.adapters,\n }\n }\n\n if (process.env.PAYLOAD_TELEMETRY_DEBUG) {\n payload.logger.info({\n event: { ...baseEvent, ...event, packageJSONPath },\n msg: 'Telemetry Event',\n })\n return\n }\n\n if (payload.config.telemetry !== false) {\n await fetch('https://telemetry.payloadcms.com/events', {\n body: JSON.stringify({ ...baseEvent, ...event }),\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'post',\n })\n }\n } catch (_) {\n // Eat any errors in sending telemetry event\n }\n}\n\n/**\n * This is a quasi-persistent identifier used to dedupe recurring events. It's\n * generated from random data and completely anonymous.\n */\nconst getEnvID = (): string => {\n const conf = new Conf()\n const ENV_ID = 'envID'\n\n const val = conf.get(ENV_ID)\n if (val) {\n return val as string\n }\n\n const generated = randomBytes(32).toString('hex')\n conf.set(ENV_ID, generated)\n return generated\n}\n\nconst getProjectID = (payload: Payload, packageJSON: PackageJSON): string => {\n const projectID =\n getGitID(payload) ||\n getPackageJSONID(payload, packageJSON) ||\n payload.config.serverURL ||\n process.cwd()\n return oneWayHash(projectID, payload.secret)\n}\n\nconst getGitID = (payload: Payload) => {\n try {\n const originBuffer = execSync('git config --local --get remote.origin.url', {\n stdio: 'pipe',\n timeout: 1000,\n })\n\n return oneWayHash(String(originBuffer).trim(), payload.secret)\n } catch (_) {\n return null\n }\n}\n\nconst getPackageJSON = async (): Promise<{\n packageJSON?: PackageJSON\n packageJSONPath: string\n}> => {\n let packageJSONPath = path.resolve(process.cwd(), 'package.json')\n\n if (!fs.existsSync(packageJSONPath)) {\n // Old logic\n const filename = fileURLToPath(import.meta.url)\n const dirname = path.dirname(filename)\n packageJSONPath = await findUp({\n dir: dirname,\n fileNames: ['package.json'],\n })\n }\n\n const jsonContentString = await fs.promises.readFile(packageJSONPath, 'utf-8')\n const jsonContent: PackageJSON = JSON.parse(jsonContentString)\n return { packageJSON: jsonContent, packageJSONPath }\n}\n\nconst getPackageJSONID = (payload: Payload, packageJSON: PackageJSON): string => {\n return oneWayHash(packageJSON.name, payload.secret)\n}\n\nexport const getPayloadVersion = (packageJSON: PackageJSON): string => {\n return packageJSON?.dependencies?.payload ?? ''\n}\n\nexport const getLocalizationInfo = (\n payload: Payload,\n): Pick<BaseEvent, 'locales' | 'localizationDefaultLocale' | 'localizationEnabled'> => {\n if (!payload.config.localization) {\n return {\n locales: [],\n localizationDefaultLocale: null,\n localizationEnabled: false,\n }\n }\n\n return {\n locales: payload.config.localization.localeCodes,\n localizationDefaultLocale: payload.config.localization.defaultLocale,\n localizationEnabled: true,\n }\n}\n"],"names":["execSync","ciInfo","randomBytes","fs","path","fileURLToPath","findUp","Conf","oneWayHash","baseEvent","sendEvent","event","payload","packageJSON","packageJSONPath","getPackageJSON","ciName","isCI","name","envID","getEnvID","nodeEnv","process","env","NODE_ENV","nodeVersion","version","payloadVersion","getPayloadVersion","projectID","getProjectID","getLocalizationInfo","dbAdapter","db","emailAdapter","email","uploadAdapters","config","upload","adapters","PAYLOAD_TELEMETRY_DEBUG","logger","info","msg","telemetry","fetch","body","JSON","stringify","headers","method","_","conf","ENV_ID","val","get","generated","toString","set","getGitID","getPackageJSONID","serverURL","cwd","secret","originBuffer","stdio","timeout","String","trim","resolve","existsSync","filename","url","dirname","dir","fileNames","jsonContentString","promises","readFile","jsonContent","parse","dependencies","localization","locales","localizationDefaultLocale","localizationEnabled","localeCodes","defaultLocale"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/utilities/telemetry/index.ts"],"sourcesContent":["import { execSync } from 'child_process'\nimport ciInfo from 'ci-info'\nimport { randomBytes } from 'crypto'\nimport fs from 'fs'\nimport path from 'path'\nimport { fileURLToPath } from 'url'\n\nimport type { Payload } from '../../types/index.js'\nimport type { AdminInitEvent } from './events/adminInit.js'\nimport type { ServerInitEvent } from './events/serverInit.js'\n\nimport { findUp } from '../findUp.js'\nimport { Conf } from './conf/index.js'\nimport { oneWayHash } from './oneWayHash.js'\n\nexport type BaseEvent = {\n ciName: null | string\n dbAdapter: string\n emailAdapter: null | string\n envID: string\n isCI: boolean\n locales: string[]\n localizationDefaultLocale: null | string\n localizationEnabled: boolean\n nodeEnv: string\n nodeVersion: string\n payloadVersion: string\n projectID: string\n projectIDSource: 'cwd' | 'git' | 'packageJSON' | 'serverURL'\n uploadAdapters: string[]\n}\n\ntype PackageJSON = {\n dependencies: Record<string, string | undefined>\n name: string\n}\n\ntype TelemetryEvent = AdminInitEvent | ServerInitEvent\n\ntype Args = {\n event: TelemetryEvent\n payload: Payload\n}\n\nlet baseEvent: BaseEvent | null = null\n\nexport const sendEvent = async ({ event, payload }: Args): Promise<void> => {\n try {\n const { packageJSON, packageJSONPath } = await getPackageJSON()\n\n // Only generate the base event once\n if (!baseEvent) {\n const { projectID, source: projectIDSource } = getProjectID(payload, packageJSON)\n baseEvent = {\n ciName: ciInfo.isCI ? ciInfo.name : null,\n envID: getEnvID(),\n isCI: ciInfo.isCI,\n nodeEnv: process.env.NODE_ENV || 'development',\n nodeVersion: process.version,\n payloadVersion: getPayloadVersion(packageJSON),\n projectID,\n projectIDSource,\n ...getLocalizationInfo(payload),\n dbAdapter: payload.db.name,\n emailAdapter: payload.email?.name || null,\n uploadAdapters: payload.config.upload.adapters,\n }\n }\n\n if (process.env.PAYLOAD_TELEMETRY_DEBUG) {\n payload.logger.info({\n event: { ...baseEvent, ...event, packageJSONPath },\n msg: 'Telemetry Event',\n })\n return\n }\n\n if (payload.config.telemetry !== false) {\n await fetch('https://telemetry.payloadcms.com/events', {\n body: JSON.stringify({ ...baseEvent, ...event }),\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'post',\n })\n }\n } catch (_) {\n // Eat any errors in sending telemetry event\n }\n}\n\n/**\n * This is a quasi-persistent identifier used to dedupe recurring events. It's\n * generated from random data and completely anonymous.\n */\nconst getEnvID = (): string => {\n const conf = new Conf()\n const ENV_ID = 'envID'\n\n const val = conf.get(ENV_ID)\n if (val) {\n return val as string\n }\n\n const generated = randomBytes(32).toString('hex')\n conf.set(ENV_ID, generated)\n return generated\n}\n\nconst getProjectID = (\n payload: Payload,\n packageJSON: PackageJSON,\n): { projectID: string; source: BaseEvent['projectIDSource'] } => {\n const gitID = getGitID(payload)\n if (gitID) {\n return { projectID: oneWayHash(gitID, payload.secret), source: 'git' }\n }\n\n const packageJSONID = getPackageJSONID(payload, packageJSON)\n if (packageJSONID) {\n return { projectID: oneWayHash(packageJSONID, payload.secret), source: 'packageJSON' }\n }\n\n const serverURL = payload.config.serverURL\n if (serverURL) {\n return { projectID: oneWayHash(serverURL, payload.secret), source: 'serverURL' }\n }\n\n const cwd = process.cwd()\n return { projectID: oneWayHash(cwd, payload.secret), source: 'cwd' }\n}\n\nconst getGitID = (payload: Payload) => {\n try {\n const originBuffer = execSync('git config --local --get remote.origin.url', {\n stdio: 'pipe',\n timeout: 1000,\n })\n\n return oneWayHash(String(originBuffer).trim(), payload.secret)\n } catch (_) {\n return null\n }\n}\n\nconst getPackageJSON = async (): Promise<{\n packageJSON?: PackageJSON\n packageJSONPath: string\n}> => {\n let packageJSONPath = path.resolve(process.cwd(), 'package.json')\n\n if (!fs.existsSync(packageJSONPath)) {\n // Old logic\n const filename = fileURLToPath(import.meta.url)\n const dirname = path.dirname(filename)\n packageJSONPath = await findUp({\n dir: dirname,\n fileNames: ['package.json'],\n })\n }\n\n const jsonContentString = await fs.promises.readFile(packageJSONPath, 'utf-8')\n const jsonContent: PackageJSON = JSON.parse(jsonContentString)\n return { packageJSON: jsonContent, packageJSONPath }\n}\n\nconst getPackageJSONID = (payload: Payload, packageJSON: PackageJSON): string => {\n return oneWayHash(packageJSON.name, payload.secret)\n}\n\nexport const getPayloadVersion = (packageJSON: PackageJSON): string => {\n return packageJSON?.dependencies?.payload ?? ''\n}\n\nexport const getLocalizationInfo = (\n payload: Payload,\n): Pick<BaseEvent, 'locales' | 'localizationDefaultLocale' | 'localizationEnabled'> => {\n if (!payload.config.localization) {\n return {\n locales: [],\n localizationDefaultLocale: null,\n localizationEnabled: false,\n }\n }\n\n return {\n locales: payload.config.localization.localeCodes,\n localizationDefaultLocale: payload.config.localization.defaultLocale,\n localizationEnabled: true,\n }\n}\n"],"names":["execSync","ciInfo","randomBytes","fs","path","fileURLToPath","findUp","Conf","oneWayHash","baseEvent","sendEvent","event","payload","packageJSON","packageJSONPath","getPackageJSON","projectID","source","projectIDSource","getProjectID","ciName","isCI","name","envID","getEnvID","nodeEnv","process","env","NODE_ENV","nodeVersion","version","payloadVersion","getPayloadVersion","getLocalizationInfo","dbAdapter","db","emailAdapter","email","uploadAdapters","config","upload","adapters","PAYLOAD_TELEMETRY_DEBUG","logger","info","msg","telemetry","fetch","body","JSON","stringify","headers","method","_","conf","ENV_ID","val","get","generated","toString","set","gitID","getGitID","secret","packageJSONID","getPackageJSONID","serverURL","cwd","originBuffer","stdio","timeout","String","trim","resolve","existsSync","filename","url","dirname","dir","fileNames","jsonContentString","promises","readFile","jsonContent","parse","dependencies","localization","locales","localizationDefaultLocale","localizationEnabled","localeCodes","defaultLocale"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "payload",
3
- "version": "3.0.0-beta.123",
3
+ "version": "3.0.0-beta.124",
4
4
  "description": "Node, React, Headless CMS and Application Framework built on Next.js",
5
5
  "keywords": [
6
6
  "admin panel",
@@ -96,7 +96,7 @@
96
96
  "ts-essentials": "10.0.2",
97
97
  "tsx": "4.19.1",
98
98
  "uuid": "10.0.0",
99
- "@payloadcms/translations": "3.0.0-beta.123"
99
+ "@payloadcms/translations": "3.0.0-beta.124"
100
100
  },
101
101
  "devDependencies": {
102
102
  "@hyrious/esbuild-plugin-commonjs": "^0.2.4",