payload 3.90.0 → 3.90.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/dist/database/queryValidation/validateSearchParams.d.ts.map +1 -1
  2. package/dist/database/queryValidation/validateSearchParams.js +14 -9
  3. package/dist/database/queryValidation/validateSearchParams.js.map +1 -1
  4. package/dist/index.bundled.d.ts +1 -1
  5. package/dist/utilities/telemetry/featureInfo/getFeatureInfo.d.ts +4 -0
  6. package/dist/utilities/telemetry/featureInfo/getFeatureInfo.d.ts.map +1 -0
  7. package/dist/utilities/telemetry/featureInfo/getFeatureInfo.js +248 -0
  8. package/dist/utilities/telemetry/featureInfo/getFeatureInfo.js.map +1 -0
  9. package/dist/utilities/telemetry/featureInfo/types.d.ts +62 -0
  10. package/dist/utilities/telemetry/featureInfo/types.d.ts.map +1 -0
  11. package/dist/utilities/telemetry/featureInfo/types.js +3 -0
  12. package/dist/utilities/telemetry/featureInfo/types.js.map +1 -0
  13. package/dist/utilities/telemetry/getProjectContext.d.ts +14 -0
  14. package/dist/utilities/telemetry/getProjectContext.d.ts.map +1 -0
  15. package/dist/utilities/telemetry/getProjectContext.js +36 -0
  16. package/dist/utilities/telemetry/getProjectContext.js.map +1 -0
  17. package/dist/utilities/telemetry/index.d.ts +7 -1
  18. package/dist/utilities/telemetry/index.d.ts.map +1 -1
  19. package/dist/utilities/telemetry/index.js +22 -0
  20. package/dist/utilities/telemetry/index.js.map +1 -1
  21. package/package.json +2 -2
  22. package/dist/auth/baseFields/apiKey.d.ts +0 -3
  23. package/dist/auth/baseFields/apiKey.d.ts.map +0 -1
  24. package/dist/auth/baseFields/apiKey.js +0 -59
  25. package/dist/auth/baseFields/apiKey.js.map +0 -1
@@ -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,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAClE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAA;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtE,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,YAAY,CAAA;AAW7D,KAAK,IAAI,GAAG;IACV,gBAAgB,CAAC,EAAE,yBAAyB,CAAA;IAC5C,UAAU,EAAE,UAAU,CAAA;IACtB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC1B,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,YAAY,CAAC,EAAE,qBAAqB,CAAA;IACpC,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,EAAE,OAAO,CAAA;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,IAAI,EAAE,MAAM,CAAA;IAEZ,QAAQ,EAAE,cAAc,CAAA;IACxB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,GAAG,EAAE,cAAc,CAAA;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,GAAG,EAAE,OAAO,CAAA;IACZ,aAAa,CAAC,EAAE,cAAc,EAAE,CAAA;CACjC,CAAA;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,EACxC,gBAAgB,EAChB,UAAU,EACV,MAAM,EACN,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,iBAAiB,EACjB,IAAI,EAAE,YAAY,EAClB,QAAQ,EACR,eAAe,EACf,GAAG,EACH,gBAAgB,EAChB,GAAG,EACH,aAAa,GACd,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAmStB"}
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,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAClE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAA;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtE,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,YAAY,CAAA;AAW7D,KAAK,IAAI,GAAG;IACV,gBAAgB,CAAC,EAAE,yBAAyB,CAAA;IAC5C,UAAU,EAAE,UAAU,CAAA;IACtB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC1B,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,YAAY,CAAC,EAAE,qBAAqB,CAAA;IACpC,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,EAAE,OAAO,CAAA;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,IAAI,EAAE,MAAM,CAAA;IAEZ,QAAQ,EAAE,cAAc,CAAA;IACxB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,GAAG,EAAE,cAAc,CAAA;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,GAAG,EAAE,OAAO,CAAA;IACZ,aAAa,CAAC,EAAE,cAAc,EAAE,CAAA;CACjC,CAAA;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,EACxC,gBAAgB,EAChB,UAAU,EACV,MAAM,EACN,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,iBAAiB,EACjB,IAAI,EAAE,YAAY,EAClB,QAAQ,EACR,eAAe,EACf,GAAG,EACH,gBAAgB,EAChB,GAAG,EACH,aAAa,GACd,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CA8StB"}
@@ -129,21 +129,19 @@ import { validateQueryPaths } from './validateQueryPaths.js';
129
129
  });
130
130
  }
131
131
  const relatedCollectionReadPermission = policies.collections[collectionSlug].read;
132
- if (paths.length > 1 && relatedCollectionReadPermission && typeof relatedCollectionReadPermission === 'object' && relatedCollectionReadPermission.where) {
133
- const relationshipPath = paths.slice(0, -1).map(({ path: pathToRelationship })=>pathToRelationship).join('.');
134
- const accessWhere = prefixWherePaths({
135
- prefix: relationshipPath,
136
- where: relatedCollectionReadPermission.where
137
- });
132
+ const previousSegment = paths[i - 1];
133
+ const traversedField = previousSegment?.field;
134
+ const isRelationshipHop = Boolean(traversedField) && (traversedField.type === 'relationship' || traversedField.type === 'upload' || traversedField.type === 'join');
135
+ if (isRelationshipHop && relatedCollectionReadPermission && typeof relatedCollectionReadPermission === 'object' && relatedCollectionReadPermission.where) {
136
+ const relationshipPath = paths.slice(0, i).map(({ path: pathToRelationship })=>pathToRelationship).join('.');
138
137
  const mutableWhere = constraint;
139
138
  const existingAnd = Array.isArray(mutableWhere.and) ? mutableWhere.and : [];
140
- const relationshipField = paths.at(-2)?.field;
141
139
  // Has-many relationships and joins can point to many related documents, so the user's
142
140
  // filter and the access constraint must be satisfied by the SAME related document.
143
141
  // Scoping both into a single `contains` prevents a different, readable document from
144
142
  // masking one the user cannot read (a related-document oracle).
145
- const isHasManyRelationship = relationshipField && (relationshipField.type === 'relationship' || relationshipField.type === 'upload') && relationshipField.hasMany;
146
- const isJoin = relationshipField?.type === 'join';
143
+ const isHasManyRelationship = (traversedField.type === 'relationship' || traversedField.type === 'upload') && traversedField.hasMany;
144
+ const isJoin = traversedField.type === 'join';
147
145
  if (isHasManyRelationship || isJoin) {
148
146
  const relatedFieldPath = paths.at(-1)?.path;
149
147
  if (relatedFieldPath) {
@@ -164,8 +162,15 @@ import { validateQueryPaths } from './validateQueryPaths.js';
164
162
  }
165
163
  }
166
164
  ];
165
+ // The scoped `contains` above fully replaces the user's original filter;
166
+ // so we can remove it from the top-level where clause
167
+ delete mutableWhere[incomingPath];
167
168
  }
168
169
  } else {
170
+ const accessWhere = prefixWherePaths({
171
+ prefix: relationshipPath,
172
+ where: relatedCollectionReadPermission.where
173
+ });
169
174
  mutableWhere.and = [
170
175
  ...existingAnd,
171
176
  accessWhere
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/database/queryValidation/validateSearchParams.ts"],"sourcesContent":["import type { SanitizedCollectionConfig } from '../../collections/config/types.js'\nimport type { FlattenedField } from '../../fields/config/types.js'\nimport type { SanitizedGlobalConfig } from '../../globals/config/types.js'\nimport type { PayloadRequest, WhereField } from '../../types/index.js'\nimport type { EntityPolicies, PathToQuery } from './types.js'\n\nimport { fieldAffectsData } from '../../fields/config/types.js'\nimport { SAFE_FIELD_PATH_REGEX } from '../../types/constants.js'\nimport { getEntityPermissions } from '../../utilities/getEntityPermissions/getEntityPermissions.js'\nimport { isolateObjectProperty } from '../../utilities/isolateObjectProperty.js'\nimport { getLocalizedPaths } from '../getLocalizedPaths.js'\nimport { isNestedRelationshipQuery } from '../isNestedRelationshipQuery.js'\nimport { prefixWherePaths } from '../prefixWherePaths.js'\nimport { validateQueryPaths } from './validateQueryPaths.js'\n\ntype Args = {\n collectionConfig?: SanitizedCollectionConfig\n constraint: WhereField\n errors: { path: string }[]\n fields: FlattenedField[]\n globalConfig?: SanitizedGlobalConfig\n operator: string\n overrideAccess: boolean\n parentIsLocalized?: boolean\n path: string\n // TODO: Rename to permissions or entityPermissions in 4.0\n policies: EntityPolicies\n polymorphicJoin?: boolean\n req: PayloadRequest\n showHiddenFields?: boolean\n val: unknown\n versionFields?: FlattenedField[]\n}\n\n/**\n * Validate the Payload key / value / operator\n */\nexport async function validateSearchParam({\n collectionConfig,\n constraint,\n errors,\n fields,\n globalConfig,\n operator,\n overrideAccess,\n parentIsLocalized,\n path: incomingPath,\n policies,\n polymorphicJoin,\n req,\n showHiddenFields,\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 const blockReferencesPermissions = {}\n\n if (globalConfig && !policies.globals![slug]) {\n policies.globals![slug] = await getEntityPermissions({\n blockReferencesPermissions,\n entity: globalConfig,\n entityType: 'global',\n fetchData: false,\n operations: ['read'],\n req,\n })\n }\n\n if (sanitizedPath !== 'id') {\n paths = getLocalizedPaths({\n collectionSlug: collectionConfig?.slug,\n fields,\n globalSlug: globalConfig?.slug,\n incomingPath: sanitizedPath,\n locale: req.locale!,\n overrideAccess,\n parentIsLocalized,\n payload: req.payload,\n showHiddenFields,\n })\n }\n const promises: Promise<void>[] = []\n\n const relationshipField = paths.length === 1 ? paths[0]?.field : undefined\n const hasNestedWhere = isNestedRelationshipQuery(val)\n const relatedCollectionSlug =\n relationshipField &&\n (relationshipField.type === 'relationship' || relationshipField.type === 'upload') &&\n relationshipField.hasMany &&\n typeof relationshipField.relationTo === 'string'\n ? relationshipField.relationTo\n : undefined\n // 3.x supports only the `contains` operator for nested relationship queries.\n const isNestedHasManyQuery =\n operator === 'contains' && hasNestedWhere && Boolean(relatedCollectionSlug)\n\n const isJoinContainsQuery =\n operator === 'contains' &&\n relationshipField?.type === 'join' &&\n typeof relationshipField.collection === 'string' &&\n hasNestedWhere\n\n // Plain-object values would be merged as raw query fragments.\n if (operator === 'like' || operator === 'not_like' || operator === 'contains') {\n const isValidNestedContains =\n operator === 'contains' && (isNestedHasManyQuery || isJoinContainsQuery)\n\n const containsPlainObject =\n isNestedRelationshipQuery(val) ||\n (Array.isArray(val) && val.some((entry) => isNestedRelationshipQuery(entry)))\n\n if (containsPlainObject && !isValidNestedContains) {\n errors.push({ path: incomingPath })\n return\n }\n }\n\n if (isNestedHasManyQuery && relatedCollectionSlug) {\n // Validate the nested query against the related collection.\n promises.push(\n validateQueryPaths({\n collectionConfig: req.payload.collections[relatedCollectionSlug]!.config,\n errors,\n overrideAccess,\n policies,\n req,\n showHiddenFields,\n where: val,\n }),\n )\n }\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 const isUnknownPolymorphicJoinField =\n polymorphicJoin && !field && SAFE_FIELD_PATH_REGEX.test(incomingPath)\n\n if (!isUnknownPolymorphicJoinField) {\n errors.push({ path })\n }\n\n return\n }\n\n // where: { relatedPosts: { equals: 1}} -> { 'relatedPosts.id': { equals: 1}}\n if (field.type === 'join' && path === incomingPath) {\n constraint[`${path}.id` as keyof WhereField] = constraint[path as keyof WhereField]\n delete constraint[path as keyof WhereField]\n }\n\n if ('virtual' in field && field.virtual) {\n if (field.virtual === true) {\n errors.push({ path })\n }\n }\n\n if (polymorphicJoin && path === 'relationTo') {\n return\n }\n\n if (!overrideAccess && fieldAffectsData(field)) {\n if (collectionSlug) {\n if (!policies.collections![collectionSlug]) {\n policies.collections![collectionSlug] = await getEntityPermissions({\n blockReferencesPermissions,\n entity: req.payload.collections[collectionSlug]!.config,\n entityType: 'collection',\n fetchData: false,\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 const relatedCollectionReadPermission = policies.collections![collectionSlug].read\n if (\n paths.length > 1 &&\n relatedCollectionReadPermission &&\n typeof relatedCollectionReadPermission === 'object' &&\n relatedCollectionReadPermission.where\n ) {\n const relationshipPath = paths\n .slice(0, -1)\n .map(({ path: pathToRelationship }) => pathToRelationship)\n .join('.')\n\n const accessWhere = prefixWherePaths({\n prefix: relationshipPath,\n where: relatedCollectionReadPermission.where,\n })\n const mutableWhere = constraint as Record<string, unknown>\n const existingAnd = Array.isArray(mutableWhere.and) ? mutableWhere.and : []\n const relationshipField = paths.at(-2)?.field\n\n // Has-many relationships and joins can point to many related documents, so the user's\n // filter and the access constraint must be satisfied by the SAME related document.\n // Scoping both into a single `contains` prevents a different, readable document from\n // masking one the user cannot read (a related-document oracle).\n const isHasManyRelationship =\n relationshipField &&\n (relationshipField.type === 'relationship' || relationshipField.type === 'upload') &&\n relationshipField.hasMany\n const isJoin = relationshipField?.type === 'join'\n\n if (isHasManyRelationship || isJoin) {\n const relatedFieldPath = paths.at(-1)?.path\n\n if (relatedFieldPath) {\n mutableWhere.and = [\n ...existingAnd,\n {\n [relationshipPath]: {\n contains: {\n and: [\n {\n [relatedFieldPath]: {\n [operator]: val,\n },\n },\n relatedCollectionReadPermission.where,\n ],\n },\n },\n },\n ]\n }\n } else {\n mutableWhere.and = [...existingAnd, accessWhere]\n }\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: any\n\n if (versionFields) {\n fieldAccess = policies[entityType]![entitySlug]!.fields\n\n if (\n segments[0] === 'parent' ||\n segments[0] === 'version' ||\n segments[0] === 'snapshot' ||\n segments[0] === 'latest'\n ) {\n segments.shift()\n }\n } else {\n fieldAccess = policies[entityType]![entitySlug]!.fields\n }\n\n if (segments.length) {\n segments.forEach((segment) => {\n if (fieldAccess[segment]) {\n if ('fields' in fieldAccess[segment]) {\n fieldAccess = fieldAccess[segment].fields\n } else {\n fieldAccess = fieldAccess[segment]\n }\n }\n })\n\n if (!fieldAccess?.read?.permission) {\n errors.push({ path: fieldPath })\n }\n }\n }\n\n if (!isNestedHasManyQuery && 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 showHiddenFields,\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","SAFE_FIELD_PATH_REGEX","getEntityPermissions","isolateObjectProperty","getLocalizedPaths","isNestedRelationshipQuery","prefixWherePaths","validateQueryPaths","validateSearchParam","collectionConfig","constraint","errors","fields","globalConfig","operator","overrideAccess","parentIsLocalized","path","incomingPath","policies","polymorphicJoin","req","showHiddenFields","val","versionFields","sanitizedPath","replace","paths","slug","blockReferencesPermissions","globals","entity","entityType","fetchData","operations","collectionSlug","globalSlug","locale","payload","promises","relationshipField","length","field","undefined","hasNestedWhere","relatedCollectionSlug","type","hasMany","relationTo","isNestedHasManyQuery","Boolean","isJoinContainsQuery","collection","isValidNestedContains","containsPlainObject","Array","isArray","some","entry","push","collections","config","where","at","previousField","pop","map","invalid","i","isUnknownPolymorphicJoinField","test","virtual","includes","auth","disableLocalStrategy","relatedCollectionReadPermission","read","relationshipPath","slice","pathToRelationship","join","accessWhere","prefix","mutableWhere","existingAnd","and","isHasManyRelationship","isJoin","relatedFieldPath","contains","fieldPath","endsWith","entitySlug","segments","split","fieldAccess","shift","forEach","segment","permission","pathsToQuery","reverse","pathCollectionSlug","subPath","pathToQueryIndex","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 { FlattenedField } from '../../fields/config/types.js'\nimport type { SanitizedGlobalConfig } from '../../globals/config/types.js'\nimport type { PayloadRequest, WhereField } from '../../types/index.js'\nimport type { EntityPolicies, PathToQuery } from './types.js'\n\nimport { fieldAffectsData } from '../../fields/config/types.js'\nimport { SAFE_FIELD_PATH_REGEX } from '../../types/constants.js'\nimport { getEntityPermissions } from '../../utilities/getEntityPermissions/getEntityPermissions.js'\nimport { isolateObjectProperty } from '../../utilities/isolateObjectProperty.js'\nimport { getLocalizedPaths } from '../getLocalizedPaths.js'\nimport { isNestedRelationshipQuery } from '../isNestedRelationshipQuery.js'\nimport { prefixWherePaths } from '../prefixWherePaths.js'\nimport { validateQueryPaths } from './validateQueryPaths.js'\n\ntype Args = {\n collectionConfig?: SanitizedCollectionConfig\n constraint: WhereField\n errors: { path: string }[]\n fields: FlattenedField[]\n globalConfig?: SanitizedGlobalConfig\n operator: string\n overrideAccess: boolean\n parentIsLocalized?: boolean\n path: string\n // TODO: Rename to permissions or entityPermissions in 4.0\n policies: EntityPolicies\n polymorphicJoin?: boolean\n req: PayloadRequest\n showHiddenFields?: boolean\n val: unknown\n versionFields?: FlattenedField[]\n}\n\n/**\n * Validate the Payload key / value / operator\n */\nexport async function validateSearchParam({\n collectionConfig,\n constraint,\n errors,\n fields,\n globalConfig,\n operator,\n overrideAccess,\n parentIsLocalized,\n path: incomingPath,\n policies,\n polymorphicJoin,\n req,\n showHiddenFields,\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 const blockReferencesPermissions = {}\n\n if (globalConfig && !policies.globals![slug]) {\n policies.globals![slug] = await getEntityPermissions({\n blockReferencesPermissions,\n entity: globalConfig,\n entityType: 'global',\n fetchData: false,\n operations: ['read'],\n req,\n })\n }\n\n if (sanitizedPath !== 'id') {\n paths = getLocalizedPaths({\n collectionSlug: collectionConfig?.slug,\n fields,\n globalSlug: globalConfig?.slug,\n incomingPath: sanitizedPath,\n locale: req.locale!,\n overrideAccess,\n parentIsLocalized,\n payload: req.payload,\n showHiddenFields,\n })\n }\n const promises: Promise<void>[] = []\n\n const relationshipField = paths.length === 1 ? paths[0]?.field : undefined\n const hasNestedWhere = isNestedRelationshipQuery(val)\n const relatedCollectionSlug =\n relationshipField &&\n (relationshipField.type === 'relationship' || relationshipField.type === 'upload') &&\n relationshipField.hasMany &&\n typeof relationshipField.relationTo === 'string'\n ? relationshipField.relationTo\n : undefined\n // 3.x supports only the `contains` operator for nested relationship queries.\n const isNestedHasManyQuery =\n operator === 'contains' && hasNestedWhere && Boolean(relatedCollectionSlug)\n\n const isJoinContainsQuery =\n operator === 'contains' &&\n relationshipField?.type === 'join' &&\n typeof relationshipField.collection === 'string' &&\n hasNestedWhere\n\n // Plain-object values would be merged as raw query fragments.\n if (operator === 'like' || operator === 'not_like' || operator === 'contains') {\n const isValidNestedContains =\n operator === 'contains' && (isNestedHasManyQuery || isJoinContainsQuery)\n\n const containsPlainObject =\n isNestedRelationshipQuery(val) ||\n (Array.isArray(val) && val.some((entry) => isNestedRelationshipQuery(entry)))\n\n if (containsPlainObject && !isValidNestedContains) {\n errors.push({ path: incomingPath })\n return\n }\n }\n\n if (isNestedHasManyQuery && relatedCollectionSlug) {\n // Validate the nested query against the related collection.\n promises.push(\n validateQueryPaths({\n collectionConfig: req.payload.collections[relatedCollectionSlug]!.config,\n errors,\n overrideAccess,\n policies,\n req,\n showHiddenFields,\n where: val,\n }),\n )\n }\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 const isUnknownPolymorphicJoinField =\n polymorphicJoin && !field && SAFE_FIELD_PATH_REGEX.test(incomingPath)\n\n if (!isUnknownPolymorphicJoinField) {\n errors.push({ path })\n }\n\n return\n }\n\n // where: { relatedPosts: { equals: 1}} -> { 'relatedPosts.id': { equals: 1}}\n if (field.type === 'join' && path === incomingPath) {\n constraint[`${path}.id` as keyof WhereField] = constraint[path as keyof WhereField]\n delete constraint[path as keyof WhereField]\n }\n\n if ('virtual' in field && field.virtual) {\n if (field.virtual === true) {\n errors.push({ path })\n }\n }\n\n if (polymorphicJoin && path === 'relationTo') {\n return\n }\n\n if (!overrideAccess && fieldAffectsData(field)) {\n if (collectionSlug) {\n if (!policies.collections![collectionSlug]) {\n policies.collections![collectionSlug] = await getEntityPermissions({\n blockReferencesPermissions,\n entity: req.payload.collections[collectionSlug]!.config,\n entityType: 'collection',\n fetchData: false,\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 const relatedCollectionReadPermission = policies.collections![collectionSlug].read\n const previousSegment = paths[i - 1]\n const traversedField = previousSegment?.field\n const isRelationshipHop =\n Boolean(traversedField) &&\n (traversedField!.type === 'relationship' ||\n traversedField!.type === 'upload' ||\n traversedField!.type === 'join')\n\n if (\n isRelationshipHop &&\n relatedCollectionReadPermission &&\n typeof relatedCollectionReadPermission === 'object' &&\n relatedCollectionReadPermission.where\n ) {\n const relationshipPath = paths\n .slice(0, i)\n .map(({ path: pathToRelationship }) => pathToRelationship)\n .join('.')\n\n const mutableWhere = constraint as Record<string, unknown>\n const existingAnd = Array.isArray(mutableWhere.and) ? mutableWhere.and : []\n\n // Has-many relationships and joins can point to many related documents, so the user's\n // filter and the access constraint must be satisfied by the SAME related document.\n // Scoping both into a single `contains` prevents a different, readable document from\n // masking one the user cannot read (a related-document oracle).\n const isHasManyRelationship =\n (traversedField!.type === 'relationship' || traversedField!.type === 'upload') &&\n traversedField!.hasMany\n const isJoin = traversedField!.type === 'join'\n\n if (isHasManyRelationship || isJoin) {\n const relatedFieldPath = paths.at(-1)?.path\n\n if (relatedFieldPath) {\n mutableWhere.and = [\n ...existingAnd,\n {\n [relationshipPath]: {\n contains: {\n and: [\n {\n [relatedFieldPath]: {\n [operator]: val,\n },\n },\n relatedCollectionReadPermission.where,\n ],\n },\n },\n },\n ]\n\n // The scoped `contains` above fully replaces the user's original filter;\n // so we can remove it from the top-level where clause\n delete mutableWhere[incomingPath]\n }\n } else {\n const accessWhere = prefixWherePaths({\n prefix: relationshipPath,\n where: relatedCollectionReadPermission.where,\n })\n\n mutableWhere.and = [...existingAnd, accessWhere]\n }\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: any\n\n if (versionFields) {\n fieldAccess = policies[entityType]![entitySlug]!.fields\n\n if (\n segments[0] === 'parent' ||\n segments[0] === 'version' ||\n segments[0] === 'snapshot' ||\n segments[0] === 'latest'\n ) {\n segments.shift()\n }\n } else {\n fieldAccess = policies[entityType]![entitySlug]!.fields\n }\n\n if (segments.length) {\n segments.forEach((segment) => {\n if (fieldAccess[segment]) {\n if ('fields' in fieldAccess[segment]) {\n fieldAccess = fieldAccess[segment].fields\n } else {\n fieldAccess = fieldAccess[segment]\n }\n }\n })\n\n if (!fieldAccess?.read?.permission) {\n errors.push({ path: fieldPath })\n }\n }\n }\n\n if (!isNestedHasManyQuery && 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 showHiddenFields,\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","SAFE_FIELD_PATH_REGEX","getEntityPermissions","isolateObjectProperty","getLocalizedPaths","isNestedRelationshipQuery","prefixWherePaths","validateQueryPaths","validateSearchParam","collectionConfig","constraint","errors","fields","globalConfig","operator","overrideAccess","parentIsLocalized","path","incomingPath","policies","polymorphicJoin","req","showHiddenFields","val","versionFields","sanitizedPath","replace","paths","slug","blockReferencesPermissions","globals","entity","entityType","fetchData","operations","collectionSlug","globalSlug","locale","payload","promises","relationshipField","length","field","undefined","hasNestedWhere","relatedCollectionSlug","type","hasMany","relationTo","isNestedHasManyQuery","Boolean","isJoinContainsQuery","collection","isValidNestedContains","containsPlainObject","Array","isArray","some","entry","push","collections","config","where","at","previousField","pop","map","invalid","i","isUnknownPolymorphicJoinField","test","virtual","includes","auth","disableLocalStrategy","relatedCollectionReadPermission","read","previousSegment","traversedField","isRelationshipHop","relationshipPath","slice","pathToRelationship","join","mutableWhere","existingAnd","and","isHasManyRelationship","isJoin","relatedFieldPath","contains","accessWhere","prefix","fieldPath","endsWith","entitySlug","segments","split","fieldAccess","shift","forEach","segment","permission","pathsToQuery","reverse","pathCollectionSlug","subPath","pathToQueryIndex","Promise","all"],"mappings":"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"}
@@ -19,7 +19,7 @@ import { ReadonlyRequestCookies } from 'next/dist/server/web/spec-extension/adap
19
19
  import { PinoPretty } from 'pino-pretty';
20
20
  import { DatePickerProps } from 'react-datepicker';
21
21
 
22
- declare const clientTranslationKeys: ("authentication:account" | "authentication:accountOfCurrentUser" | "authentication:accountVerified" | "authentication:alreadyActivated" | "authentication:alreadyLoggedIn" | "authentication:apiKey" | "authentication:authenticated" | "authentication:backToLogin" | "authentication:beginCreateFirstUser" | "authentication:changePassword" | "authentication:checkYourEmailForPasswordReset" | "authentication:confirmGeneration" | "authentication:confirmPassword" | "authentication:createFirstUser" | "authentication:emailNotValid" | "authentication:emailOrUsername" | "authentication:emailSent" | "authentication:emailVerified" | "authentication:enableAPIKey" | "authentication:failedToUnlock" | "authentication:forceUnlock" | "authentication:forgotPassword" | "authentication:forgotPasswordEmailInstructions" | "authentication:forgotPasswordUsernameInstructions" | "authentication:usernameNotValid" | "authentication:forgotPasswordQuestion" | "authentication:generate" | "authentication:generateNewAPIKey" | "authentication:generatingNewAPIKeyWillInvalidate" | "authentication:logBackIn" | "authentication:loggedIn" | "authentication:loggedInChangePassword" | "authentication:loggedOutInactivity" | "authentication:loggedOutSuccessfully" | "authentication:loggingOut" | "authentication:login" | "authentication:logOut" | "authentication:logout" | "authentication:logoutSuccessful" | "authentication:logoutUser" | "authentication:newAPIKeyGenerated" | "authentication:newPassword" | "authentication:passed" | "authentication:passwordResetSuccessfully" | "authentication:resend" | "authentication:resetPassword" | "authentication:stayLoggedIn" | "authentication:successfullyRegisteredFirstUser" | "authentication:successfullyUnlocked" | "authentication:tokenRefreshSuccessful" | "authentication:unableToVerify" | "authentication:username" | "authentication:verified" | "authentication:verifiedSuccessfully" | "authentication:verify" | "authentication:verifyUser" | "authentication:youAreInactive" | "dashboard:addButton" | "dashboard:addWidget" | "dashboard:deleteWidget" | "dashboard:discardConfirmLabel" | "dashboard:discardMessage" | "dashboard:discardTitle" | "dashboard:editDashboard" | "dashboard:editingDashboard" | "dashboard:noItems" | "dashboard:resetLayout" | "dashboard:searchWidgets" | "error:autosaving" | "error:correctInvalidFields" | "error:deletingTitle" | "error:documentNotFound" | "error:emailOrPasswordIncorrect" | "error:failedToResetLayout" | "error:failedToSaveLayout" | "error:insufficientClipboardPermissions" | "error:invalidClipboardData" | "error:invalidFileType" | "error:invalidRequestArgs" | "error:loadingDocument" | "error:logoutFailed" | "error:noMatchedField" | "error:notAllowedToAccessPage" | "error:notAllowedToPerformAction" | "error:previewing" | "error:problemUploadingFile" | "error:restoringTitle" | "error:revertingDocument" | "error:tokenNotProvided" | "error:unableToCopy" | "error:unableToDeleteCount" | "error:unableToReindexCollection" | "error:unableToUpdateCount" | "error:unauthorized" | "error:unauthorizedAdmin" | "error:unknown" | "error:unPublishingDocument" | "error:unspecific" | "error:unverifiedEmail" | "error:userEmailAlreadyRegistered" | "error:usernameAlreadyRegistered" | "error:usernameOrPasswordIncorrect" | "fields:blocks" | "fields:addLabel" | "fields:addLink" | "fields:addNew" | "fields:addNewLabel" | "fields:addRelationship" | "fields:addUpload" | "fields:block" | "fields:blockType" | "fields:chooseBetweenCustomTextOrDocument" | "fields:chooseDocumentToLink" | "fields:chooseFromExisting" | "fields:collapseAll" | "fields:customURL" | "fields:editLink" | "fields:editRelationship" | "fields:enterURL" | "fields:internalLink" | "fields:itemsAndMore" | "fields:labelRelationship" | "fields:latitude" | "fields:linkedTo" | "fields:linkType" | "fields:longitude" | "fields:openInNewTab" | "fields:passwordsDoNotMatch" | "fields:removeRelationship" | "fields:removeUpload" | "fields:saveChanges" | "fields:searchForBlock" | "fields:searchForLanguage" | "fields:selectFieldsToEdit" | "fields:showAll" | "fields:swapRelationship" | "fields:swapUpload" | "fields:textToDisplay" | "fields:toggleBlock" | "fields:uploadNewLabel" | "folder:browseByFolder" | "folder:byFolder" | "folder:deleteFolder" | "folder:folderName" | "folder:folders" | "folder:folderTypeDescription" | "folder:itemHasBeenMoved" | "folder:itemHasBeenMovedToRoot" | "folder:itemsMovedToFolder" | "folder:itemsMovedToRoot" | "folder:moveFolder" | "folder:moveItemsToFolderConfirmation" | "folder:moveItemsToRootConfirmation" | "folder:moveItemToFolderConfirmation" | "folder:moveItemToRootConfirmation" | "folder:movingFromFolder" | "folder:newFolder" | "folder:noFolder" | "folder:renameFolder" | "folder:searchByNameInFolder" | "folder:selectFolderForItem" | "general:items" | "general:of" | "general:dashboard" | "general:error" | "general:username" | "general:notFound" | "general:unauthorized" | "general:newLabel" | "general:saveChanges" | "general:name" | "general:aboutToDelete" | "general:aboutToPermanentlyDelete" | "general:aboutToPermanentlyDeleteTrash" | "general:aboutToRestore" | "general:aboutToRestoreAsDraft" | "general:aboutToRestoreAsDraftCount" | "general:aboutToRestoreCount" | "general:aboutToTrash" | "general:aboutToTrashCount" | "general:addBelow" | "general:addFilter" | "general:adminTheme" | "general:all" | "general:allCollections" | "general:allLocales" | "general:and" | "general:anotherUser" | "general:anotherUserTakenOver" | "general:applyChanges" | "general:ascending" | "general:automatic" | "general:backToDashboard" | "general:cancel" | "general:changesNotSaved" | "general:clear" | "general:clearAll" | "general:close" | "general:collapse" | "general:collections" | "general:columns" | "general:columnToSort" | "general:confirm" | "general:confirmCopy" | "general:confirmDeletion" | "general:confirmDuplication" | "general:confirmMove" | "general:confirmReindex" | "general:confirmReindexAll" | "general:confirmReindexDescription" | "general:confirmReindexDescriptionAll" | "general:confirmRestoration" | "general:copied" | "general:copy" | "general:copyField" | "general:copying" | "general:copyRow" | "general:copyWarning" | "general:create" | "general:created" | "general:createdAt" | "general:createNew" | "general:createNewLabel" | "general:creating" | "general:creatingNewLabel" | "general:currentlyEditing" | "general:custom" | "general:dark" | "general:delete" | "general:deleted" | "general:deletedAt" | "general:deletedCountSuccessfully" | "general:deletedSuccessfully" | "general:deleteLabel" | "general:deletePermanently" | "general:deleting" | "general:depth" | "general:descending" | "general:deselectAllRows" | "general:document" | "general:documentIsTrashed" | "general:documentLocked" | "general:documentModified" | "general:documentOutOfDate" | "general:documents" | "general:duplicate" | "general:duplicateWithoutSaving" | "general:edit" | "general:editAll" | "general:editedSince" | "general:editing" | "general:editingTakenOver" | "general:editLabel" | "general:email" | "general:emailAddress" | "general:emptyTrash" | "general:emptyTrashLabel" | "general:enterAValue" | "general:errors" | "general:exitLivePreview" | "general:export" | "general:fallbackToDefaultLocale" | "general:false" | "general:filters" | "general:filterWhere" | "general:globals" | "general:goBack" | "general:groupByLabel" | "general:import" | "general:isEditing" | "general:item" | "general:language" | "general:lastModified" | "general:layout" | "general:leaveAnyway" | "general:leaveWithoutSaving" | "general:light" | "general:livePreview" | "general:loading" | "general:locale" | "general:locales" | "general:lock" | "general:menu" | "general:moreOptions" | "general:move" | "general:moveConfirm" | "general:moveCount" | "general:moveDown" | "general:moveUp" | "general:moving" | "general:movingCount" | "general:next" | "general:no" | "general:noDateSelected" | "general:noFiltersSet" | "general:noLabel" | "general:none" | "general:noOptions" | "general:noResults" | "general:noResultsDescription" | "general:noResultsFound" | "general:nothingFound" | "general:noTrashResults" | "general:noUpcomingEventsScheduled" | "general:noValue" | "general:only" | "general:open" | "general:openInNewWindow" | "general:or" | "general:order" | "general:overwriteExistingData" | "general:pageNotFound" | "general:password" | "general:pasteField" | "general:pasteRow" | "general:payloadSettings" | "general:permanentlyDelete" | "general:permanentlyDeletedCountSuccessfully" | "general:perPage" | "general:previous" | "general:reindex" | "general:reindexingAll" | "general:reloadDocument" | "general:remove" | "general:rename" | "general:reset" | "general:resetPreferences" | "general:resetPreferencesDescription" | "general:resettingPreferences" | "general:restore" | "general:restoreAsPublished" | "general:restoredCountSuccessfully" | "general:restoring" | "general:row" | "general:rows" | "general:save" | "general:saving" | "general:schedulePublishFor" | "general:searchBy" | "general:select" | "general:selectAll" | "general:selectAllRows" | "general:selectedCount" | "general:selectLabel" | "general:selectValue" | "general:showAllLabel" | "general:sorryNotFound" | "general:sort" | "general:sortByLabelDirection" | "general:stayOnThisPage" | "general:submissionSuccessful" | "general:submit" | "general:submitting" | "general:success" | "general:successfullyCreated" | "general:successfullyDuplicated" | "general:successfullyReindexed" | "general:takeOver" | "general:thisLanguage" | "general:time" | "general:timezone" | "general:titleDeleted" | "general:titleRestored" | "general:titleTrashed" | "general:trash" | "general:trashedCountSuccessfully" | "general:true" | "general:unlock" | "general:unsavedChanges" | "general:unsavedChangesDuplicate" | "general:untitled" | "general:upcomingEvents" | "general:updatedAt" | "general:updatedCountSuccessfully" | "general:updatedLabelSuccessfully" | "general:updatedSuccessfully" | "general:updateForEveryone" | "general:updating" | "general:uploading" | "general:uploadingBulk" | "general:user" | "general:users" | "general:value" | "general:viewing" | "general:viewReadOnly" | "general:welcome" | "general:yes" | "general:aboutToDeleteCount" | "general:editingLabel" | "localization:cannotCopySameLocale" | "localization:copyFrom" | "localization:copyFromTo" | "localization:copyTo" | "localization:copyToLocale" | "localization:localeToPublish" | "localization:selectedLocales" | "localization:selectLocaleToCopy" | "localization:selectLocaleToDuplicate" | "operators:contains" | "operators:equals" | "operators:exists" | "operators:intersects" | "operators:near" | "operators:within" | "operators:isGreaterThan" | "operators:isGreaterThanOrEqualTo" | "operators:isIn" | "operators:isLessThan" | "operators:isLessThanOrEqualTo" | "operators:isLike" | "operators:isNotEqualTo" | "operators:isNotIn" | "operators:isNotLike" | "upload:addFile" | "upload:addFiles" | "upload:bulkUpload" | "upload:crop" | "upload:cropToolDescription" | "upload:download" | "upload:dragAndDrop" | "upload:editImage" | "upload:fileName" | "upload:fileSize" | "upload:filesToUpload" | "upload:fileToUpload" | "upload:focalPoint" | "upload:focalPointDescription" | "upload:height" | "upload:noFile" | "upload:pasteURL" | "upload:previewSizes" | "upload:selectCollectionToBrowse" | "upload:selectFile" | "upload:setCropArea" | "upload:setFocalPoint" | "upload:sizes" | "upload:sizesFor" | "upload:width" | "validation:username" | "validation:emailAddress" | "validation:enterNumber" | "validation:fieldHasNo" | "validation:greaterThanMax" | "validation:invalidBlock" | "validation:invalidBlocks" | "validation:invalidInput" | "validation:invalidSelection" | "validation:invalidSelections" | "validation:latitudeOutOfBounds" | "validation:lessThanMin" | "validation:limitReached" | "validation:longerThanMin" | "validation:longitudeOutOfBounds" | "validation:notValidDate" | "validation:required" | "validation:requiresAtLeast" | "validation:requiresNoMoreThan" | "validation:requiresTwoNumbers" | "validation:shorterThanMax" | "validation:timezoneRequired" | "validation:trueOrFalse" | "validation:validUploadID" | "version:version" | "version:aboutToRestore" | "version:restoring" | "version:type" | "version:aboutToPublishSelection" | "version:aboutToRestoreGlobal" | "version:aboutToRevertToPublished" | "version:aboutToUnpublish" | "version:aboutToUnpublishIn" | "version:aboutToUnpublishSelection" | "version:autosave" | "version:autosavedSuccessfully" | "version:autosavedVersion" | "version:changed" | "version:compareVersions" | "version:comparingAgainst" | "version:confirmPublish" | "version:confirmRevertToSaved" | "version:confirmUnpublish" | "version:confirmVersionRestoration" | "version:currentDraft" | "version:currentlyPublished" | "version:currentlyViewing" | "version:currentPublishedVersion" | "version:draft" | "version:draftHasPublishedVersion" | "version:draftSavedSuccessfully" | "version:lastSavedAgo" | "version:modifiedOnly" | "version:moreVersions" | "version:noFurtherVersionsFound" | "version:noLabelGroup" | "version:noRowsFound" | "version:noRowsSelected" | "version:preview" | "version:previouslyDraft" | "version:previouslyPublished" | "version:previousVersion" | "version:problemRestoringVersion" | "version:publish" | "version:publishAllLocales" | "version:publishChanges" | "version:published" | "version:publishIn" | "version:publishing" | "version:restoreAsDraft" | "version:restoredSuccessfully" | "version:restoreThisVersion" | "version:reverting" | "version:revertToPublished" | "version:revertUnsuccessful" | "version:saveDraft" | "version:scheduledSuccessfully" | "version:schedulePublish" | "version:selectLocales" | "version:selectVersionToCompare" | "version:showLocales" | "version:specificVersion" | "version:status" | "version:unpublish" | "version:unpublished" | "version:unpublishedSuccessfully" | "version:unpublishIn" | "version:unpublishing" | "version:versionAgo" | "version:versionID" | "version:versions" | "version:viewingVersion" | "version:viewingVersionGlobal" | "version:viewingVersions" | "version:viewingVersionsGlobal" | "version:changedFieldsCount")[];
22
+ declare const clientTranslationKeys: ("authentication:account" | "authentication:accountOfCurrentUser" | "authentication:accountVerified" | "authentication:alreadyActivated" | "authentication:alreadyLoggedIn" | "authentication:apiKey" | "authentication:authenticated" | "authentication:backToLogin" | "authentication:beginCreateFirstUser" | "authentication:changePassword" | "authentication:checkYourEmailForPasswordReset" | "authentication:confirmGeneration" | "authentication:confirmPassword" | "authentication:createFirstUser" | "authentication:emailNotValid" | "authentication:emailOrUsername" | "authentication:emailSent" | "authentication:emailVerified" | "authentication:enableAPIKey" | "authentication:failedToUnlock" | "authentication:forceUnlock" | "authentication:forgotPassword" | "authentication:forgotPasswordEmailInstructions" | "authentication:forgotPasswordUsernameInstructions" | "authentication:usernameNotValid" | "authentication:forgotPasswordQuestion" | "authentication:generate" | "authentication:generateNewAPIKey" | "authentication:generatingNewAPIKeyWillInvalidate" | "authentication:logBackIn" | "authentication:loggedIn" | "authentication:loggedInChangePassword" | "authentication:loggedOutInactivity" | "authentication:loggedOutSuccessfully" | "authentication:loggingOut" | "authentication:login" | "authentication:logOut" | "authentication:logout" | "authentication:logoutSuccessful" | "authentication:logoutUser" | "authentication:newAPIKeyGenerated" | "authentication:newPassword" | "authentication:passed" | "authentication:passwordResetSuccessfully" | "authentication:resend" | "authentication:resetPassword" | "authentication:stayLoggedIn" | "authentication:successfullyRegisteredFirstUser" | "authentication:successfullyUnlocked" | "authentication:tokenRefreshSuccessful" | "authentication:unableToVerify" | "authentication:username" | "authentication:verified" | "authentication:verifiedSuccessfully" | "authentication:verify" | "authentication:verifyUser" | "authentication:youAreInactive" | "dashboard:addButton" | "dashboard:addWidget" | "dashboard:deleteWidget" | "dashboard:discardConfirmLabel" | "dashboard:discardMessage" | "dashboard:discardTitle" | "dashboard:editDashboard" | "dashboard:editingDashboard" | "dashboard:noItems" | "dashboard:resetLayout" | "dashboard:searchWidgets" | "error:autosaving" | "error:correctInvalidFields" | "error:deletingTitle" | "error:documentNotFound" | "error:emailOrPasswordIncorrect" | "error:failedToResetLayout" | "error:failedToSaveLayout" | "error:insufficientClipboardPermissions" | "error:invalidClipboardData" | "error:invalidFileType" | "error:invalidRequestArgs" | "error:loadingDocument" | "error:logoutFailed" | "error:noMatchedField" | "error:notAllowedToAccessPage" | "error:notAllowedToPerformAction" | "error:previewing" | "error:problemUploadingFile" | "error:restoringTitle" | "error:revertingDocument" | "error:tokenNotProvided" | "error:unableToCopy" | "error:unableToDeleteCount" | "error:unableToReindexCollection" | "error:unableToUpdateCount" | "error:unauthorized" | "error:unauthorizedAdmin" | "error:unknown" | "error:unPublishingDocument" | "error:unspecific" | "error:unverifiedEmail" | "error:userEmailAlreadyRegistered" | "error:usernameAlreadyRegistered" | "error:usernameOrPasswordIncorrect" | "fields:blocks" | "fields:addLabel" | "fields:addLink" | "fields:addNew" | "fields:addNewLabel" | "fields:addRelationship" | "fields:addUpload" | "fields:block" | "fields:blockType" | "fields:chooseBetweenCustomTextOrDocument" | "fields:chooseDocumentToLink" | "fields:chooseFromExisting" | "fields:collapseAll" | "fields:customURL" | "fields:editLink" | "fields:editRelationship" | "fields:enterURL" | "fields:internalLink" | "fields:itemsAndMore" | "fields:labelRelationship" | "fields:latitude" | "fields:linkedTo" | "fields:linkType" | "fields:longitude" | "fields:openInNewTab" | "fields:passwordsDoNotMatch" | "fields:removeRelationship" | "fields:removeUpload" | "fields:saveChanges" | "fields:searchForBlock" | "fields:searchForLanguage" | "fields:selectFieldsToEdit" | "fields:showAll" | "fields:swapRelationship" | "fields:swapUpload" | "fields:textToDisplay" | "fields:toggleBlock" | "fields:uploadNewLabel" | "folder:browseByFolder" | "folder:byFolder" | "folder:deleteFolder" | "folder:folderName" | "folder:folders" | "folder:folderTypeDescription" | "folder:itemHasBeenMoved" | "folder:itemHasBeenMovedToRoot" | "folder:itemsMovedToFolder" | "folder:itemsMovedToRoot" | "folder:moveFolder" | "folder:moveItemsToFolderConfirmation" | "folder:moveItemsToRootConfirmation" | "folder:moveItemToFolderConfirmation" | "folder:moveItemToRootConfirmation" | "folder:movingFromFolder" | "folder:newFolder" | "folder:noFolder" | "folder:renameFolder" | "folder:searchByNameInFolder" | "folder:selectFolderForItem" | "general:items" | "general:of" | "general:language" | "general:dashboard" | "general:error" | "general:username" | "general:notFound" | "general:unauthorized" | "general:newLabel" | "general:saveChanges" | "general:name" | "general:aboutToDelete" | "general:aboutToPermanentlyDelete" | "general:aboutToPermanentlyDeleteTrash" | "general:aboutToRestore" | "general:aboutToRestoreAsDraft" | "general:aboutToRestoreAsDraftCount" | "general:aboutToRestoreCount" | "general:aboutToTrash" | "general:aboutToTrashCount" | "general:addBelow" | "general:addFilter" | "general:adminTheme" | "general:all" | "general:allCollections" | "general:allLocales" | "general:and" | "general:anotherUser" | "general:anotherUserTakenOver" | "general:applyChanges" | "general:ascending" | "general:automatic" | "general:backToDashboard" | "general:cancel" | "general:changesNotSaved" | "general:clear" | "general:clearAll" | "general:close" | "general:collapse" | "general:collections" | "general:columns" | "general:columnToSort" | "general:confirm" | "general:confirmCopy" | "general:confirmDeletion" | "general:confirmDuplication" | "general:confirmMove" | "general:confirmReindex" | "general:confirmReindexAll" | "general:confirmReindexDescription" | "general:confirmReindexDescriptionAll" | "general:confirmRestoration" | "general:copied" | "general:copy" | "general:copyField" | "general:copying" | "general:copyRow" | "general:copyWarning" | "general:create" | "general:created" | "general:createdAt" | "general:createNew" | "general:createNewLabel" | "general:creating" | "general:creatingNewLabel" | "general:currentlyEditing" | "general:custom" | "general:dark" | "general:delete" | "general:deleted" | "general:deletedAt" | "general:deletedCountSuccessfully" | "general:deletedSuccessfully" | "general:deleteLabel" | "general:deletePermanently" | "general:deleting" | "general:depth" | "general:descending" | "general:deselectAllRows" | "general:document" | "general:documentIsTrashed" | "general:documentLocked" | "general:documentModified" | "general:documentOutOfDate" | "general:documents" | "general:duplicate" | "general:duplicateWithoutSaving" | "general:edit" | "general:editAll" | "general:editedSince" | "general:editing" | "general:editingTakenOver" | "general:editLabel" | "general:email" | "general:emailAddress" | "general:emptyTrash" | "general:emptyTrashLabel" | "general:enterAValue" | "general:errors" | "general:exitLivePreview" | "general:export" | "general:fallbackToDefaultLocale" | "general:false" | "general:filters" | "general:filterWhere" | "general:globals" | "general:goBack" | "general:groupByLabel" | "general:import" | "general:isEditing" | "general:item" | "general:lastModified" | "general:layout" | "general:leaveAnyway" | "general:leaveWithoutSaving" | "general:light" | "general:livePreview" | "general:loading" | "general:locale" | "general:locales" | "general:lock" | "general:menu" | "general:moreOptions" | "general:move" | "general:moveConfirm" | "general:moveCount" | "general:moveDown" | "general:moveUp" | "general:moving" | "general:movingCount" | "general:next" | "general:no" | "general:noDateSelected" | "general:noFiltersSet" | "general:noLabel" | "general:none" | "general:noOptions" | "general:noResults" | "general:noResultsDescription" | "general:noResultsFound" | "general:nothingFound" | "general:noTrashResults" | "general:noUpcomingEventsScheduled" | "general:noValue" | "general:only" | "general:open" | "general:openInNewWindow" | "general:or" | "general:order" | "general:overwriteExistingData" | "general:pageNotFound" | "general:password" | "general:pasteField" | "general:pasteRow" | "general:payloadSettings" | "general:permanentlyDelete" | "general:permanentlyDeletedCountSuccessfully" | "general:perPage" | "general:previous" | "general:reindex" | "general:reindexingAll" | "general:reloadDocument" | "general:remove" | "general:rename" | "general:reset" | "general:resetPreferences" | "general:resetPreferencesDescription" | "general:resettingPreferences" | "general:restore" | "general:restoreAsPublished" | "general:restoredCountSuccessfully" | "general:restoring" | "general:row" | "general:rows" | "general:save" | "general:saving" | "general:schedulePublishFor" | "general:searchBy" | "general:select" | "general:selectAll" | "general:selectAllRows" | "general:selectedCount" | "general:selectLabel" | "general:selectValue" | "general:showAllLabel" | "general:sorryNotFound" | "general:sort" | "general:sortByLabelDirection" | "general:stayOnThisPage" | "general:submissionSuccessful" | "general:submit" | "general:submitting" | "general:success" | "general:successfullyCreated" | "general:successfullyDuplicated" | "general:successfullyReindexed" | "general:takeOver" | "general:thisLanguage" | "general:time" | "general:timezone" | "general:titleDeleted" | "general:titleRestored" | "general:titleTrashed" | "general:trash" | "general:trashedCountSuccessfully" | "general:true" | "general:unlock" | "general:unsavedChanges" | "general:unsavedChangesDuplicate" | "general:untitled" | "general:upcomingEvents" | "general:updatedAt" | "general:updatedCountSuccessfully" | "general:updatedLabelSuccessfully" | "general:updatedSuccessfully" | "general:updateForEveryone" | "general:updating" | "general:uploading" | "general:uploadingBulk" | "general:user" | "general:users" | "general:value" | "general:viewing" | "general:viewReadOnly" | "general:welcome" | "general:yes" | "localization:cannotCopySameLocale" | "localization:copyFrom" | "localization:copyFromTo" | "localization:copyTo" | "localization:copyToLocale" | "localization:localeToPublish" | "localization:selectedLocales" | "localization:selectLocaleToCopy" | "localization:selectLocaleToDuplicate" | "operators:contains" | "operators:equals" | "operators:exists" | "operators:intersects" | "operators:near" | "operators:within" | "operators:isGreaterThan" | "operators:isGreaterThanOrEqualTo" | "operators:isIn" | "operators:isLessThan" | "operators:isLessThanOrEqualTo" | "operators:isLike" | "operators:isNotEqualTo" | "operators:isNotIn" | "operators:isNotLike" | "upload:addFile" | "upload:addFiles" | "upload:bulkUpload" | "upload:crop" | "upload:cropToolDescription" | "upload:download" | "upload:dragAndDrop" | "upload:editImage" | "upload:fileName" | "upload:fileSize" | "upload:filesToUpload" | "upload:fileToUpload" | "upload:focalPoint" | "upload:focalPointDescription" | "upload:height" | "upload:noFile" | "upload:pasteURL" | "upload:previewSizes" | "upload:selectCollectionToBrowse" | "upload:selectFile" | "upload:setCropArea" | "upload:setFocalPoint" | "upload:sizes" | "upload:sizesFor" | "upload:width" | "validation:username" | "validation:emailAddress" | "validation:enterNumber" | "validation:fieldHasNo" | "validation:greaterThanMax" | "validation:invalidBlock" | "validation:invalidBlocks" | "validation:invalidInput" | "validation:invalidSelection" | "validation:invalidSelections" | "validation:latitudeOutOfBounds" | "validation:lessThanMin" | "validation:limitReached" | "validation:longerThanMin" | "validation:longitudeOutOfBounds" | "validation:notValidDate" | "validation:required" | "validation:requiresAtLeast" | "validation:requiresNoMoreThan" | "validation:requiresTwoNumbers" | "validation:shorterThanMax" | "validation:timezoneRequired" | "validation:trueOrFalse" | "validation:validUploadID" | "version:version" | "version:aboutToRestore" | "version:restoring" | "version:type" | "version:aboutToPublishSelection" | "version:aboutToRestoreGlobal" | "version:aboutToRevertToPublished" | "version:aboutToUnpublish" | "version:aboutToUnpublishIn" | "version:aboutToUnpublishSelection" | "version:autosave" | "version:autosavedSuccessfully" | "version:autosavedVersion" | "version:changed" | "version:compareVersions" | "version:comparingAgainst" | "version:confirmPublish" | "version:confirmRevertToSaved" | "version:confirmUnpublish" | "version:confirmVersionRestoration" | "version:currentDraft" | "version:currentlyPublished" | "version:currentlyViewing" | "version:currentPublishedVersion" | "version:draft" | "version:draftHasPublishedVersion" | "version:draftSavedSuccessfully" | "version:lastSavedAgo" | "version:modifiedOnly" | "version:moreVersions" | "version:noFurtherVersionsFound" | "version:noLabelGroup" | "version:noRowsFound" | "version:noRowsSelected" | "version:preview" | "version:previouslyDraft" | "version:previouslyPublished" | "version:previousVersion" | "version:problemRestoringVersion" | "version:publish" | "version:publishAllLocales" | "version:publishChanges" | "version:published" | "version:publishIn" | "version:publishing" | "version:restoreAsDraft" | "version:restoredSuccessfully" | "version:restoreThisVersion" | "version:reverting" | "version:revertToPublished" | "version:revertUnsuccessful" | "version:saveDraft" | "version:scheduledSuccessfully" | "version:schedulePublish" | "version:selectLocales" | "version:selectVersionToCompare" | "version:showLocales" | "version:specificVersion" | "version:status" | "version:unpublish" | "version:unpublished" | "version:unpublishedSuccessfully" | "version:unpublishIn" | "version:unpublishing" | "version:versionAgo" | "version:versionID" | "version:versions" | "version:viewingVersion" | "version:viewingVersionGlobal" | "version:viewingVersions" | "version:viewingVersionsGlobal" | "general:aboutToDeleteCount" | "general:editingLabel" | "version:changedFieldsCount")[];
23
23
 
24
24
  declare const enTranslations: {
25
25
  authentication: {
@@ -0,0 +1,4 @@
1
+ import type { SanitizedConfig } from '../../../config/types.js';
2
+ import type { FeatureInfo } from './types.js';
3
+ export declare const getFeatureInfo: (config: SanitizedConfig) => FeatureInfo;
4
+ //# sourceMappingURL=getFeatureInfo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getFeatureInfo.d.ts","sourceRoot":"","sources":["../../../../src/utilities/telemetry/featureInfo/getFeatureInfo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAE/D,OAAO,KAAK,EAAE,WAAW,EAAmB,MAAM,YAAY,CAAA;AAI9D,eAAO,MAAM,cAAc,WAAY,eAAe,KAAG,WAoBxD,CAAA"}
@@ -0,0 +1,248 @@
1
+ import { defaultUserCollection } from '../../../auth/defaultUser.js';
2
+ export const getFeatureInfo = (config)=>{
3
+ const telemetryConfig = sanitizeTelemetryConfig(config);
4
+ return Object.assign({}, ...[
5
+ collectAdminCustomization,
6
+ collectAuthentication,
7
+ collectBasicDenominators,
8
+ collectI18n,
9
+ collectJobsAndQueues,
10
+ collectOrdering,
11
+ collectPreviewAndLivePreview,
12
+ collectQueryPresets,
13
+ collectTrash,
14
+ collectUploadAndMedia,
15
+ collectVersionsAndDrafts,
16
+ collectRichTextFeatures
17
+ ].map((collect)=>safelyCollect(()=>collect(telemetryConfig))));
18
+ };
19
+ const safelyCollect = (collect)=>{
20
+ try {
21
+ return collect();
22
+ } catch (_) {
23
+ return {};
24
+ }
25
+ };
26
+ // sanitization adds 3 system widgets that we need to account for
27
+ const SYSTEM_WIDGET_COUNT = 3;
28
+ const SYSTEM_COLLECTION_SLUGS = [
29
+ 'payload-locked-documents',
30
+ 'payload-migrations',
31
+ 'payload-preferences',
32
+ 'payload-query-presets'
33
+ ];
34
+ const SYSTEM_GLOBAL_SLUGS = new Set([
35
+ 'payload-jobs-stats'
36
+ ]);
37
+ /**
38
+ * Payload adds internal collections, globals and tasks during config sanitization.
39
+ * Remove them from the telemetry view so feature metrics represent user config.
40
+ */ const sanitizeTelemetryConfig = (config)=>{
41
+ try {
42
+ const collections = config.collections ?? [];
43
+ const systemCollectionSlugs = new Set(SYSTEM_COLLECTION_SLUGS);
44
+ const kvCollectionSlug = config.kv?.kvCollection?.slug;
45
+ if (kvCollectionSlug) {
46
+ systemCollectionSlugs.add(kvCollectionSlug);
47
+ }
48
+ if (config.jobs?.enabled) {
49
+ // uses SYSTEM_COLLECTION_SLUGS (not the Set) to exclude kv slug from position detection
50
+ const firstCollectionAfterJobs = collections.findIndex(({ slug })=>SYSTEM_COLLECTION_SLUGS.includes(slug));
51
+ if (firstCollectionAfterJobs > 0) {
52
+ systemCollectionSlugs.add(collections[firstCollectionAfterJobs - 1].slug);
53
+ } else {
54
+ systemCollectionSlugs.add('payload-jobs');
55
+ }
56
+ }
57
+ const tasks = [
58
+ ...config.jobs?.tasks ?? []
59
+ ];
60
+ if (getDraftEntities(config).some(hasScheduledPublishing)) {
61
+ for(let index = tasks.length - 1; index >= 0; index--){
62
+ if (tasks[index]?.slug === 'schedulePublish') {
63
+ tasks.splice(index, 1);
64
+ break;
65
+ }
66
+ }
67
+ }
68
+ return {
69
+ ...config,
70
+ collections: collections.filter((collection)=>collection !== defaultUserCollection && !systemCollectionSlugs.has(collection.slug)),
71
+ globals: (config.globals ?? []).filter(({ slug })=>!SYSTEM_GLOBAL_SLUGS.has(slug)),
72
+ jobs: {
73
+ ...config.jobs,
74
+ tasks
75
+ }
76
+ };
77
+ } catch (_) {
78
+ return config;
79
+ }
80
+ };
81
+ const collectAdminCustomization = (config)=>({
82
+ adminCustomization: {
83
+ customAdminComponentCount: countRootAdminComponents(config),
84
+ customAdminViewCount: Object.keys(config.admin?.components?.views ?? {}).length,
85
+ customDashboardWidgetCount: Math.max(0, (config.admin?.dashboard?.widgets?.length ?? 0) - SYSTEM_WIDGET_COUNT)
86
+ }
87
+ });
88
+ const collectAuthentication = (config)=>{
89
+ const authCollections = (config.collections ?? []).filter(({ auth })=>Boolean(auth));
90
+ return {
91
+ authentication: {
92
+ apiKeyCollectionCount: authCollections.filter(({ auth })=>isObject(auth) && Boolean(auth.useAPIKey)).length,
93
+ authCollectionCount: authCollections.length,
94
+ customAuthStrategyCount: authCollections.reduce((count, { auth })=>count + (isObject(auth) && Array.isArray(auth.strategies) ? auth.strategies.length : 0), 0),
95
+ localAuthDisabledCollectionCount: authCollections.filter(({ auth })=>isObject(auth) && Boolean(auth.disableLocalStrategy)).length,
96
+ sessionsDisabledCollectionCount: authCollections.filter(({ auth })=>isObject(auth) && auth.useSessions === false).length,
97
+ usernameCollectionCount: authCollections.filter(({ auth })=>isObject(auth) && Boolean(auth.loginWithUsername)).length,
98
+ verifiedCollectionCount: authCollections.filter(({ auth })=>isObject(auth) && Boolean(auth.verify)).length
99
+ }
100
+ };
101
+ };
102
+ const collectBasicDenominators = (config)=>({
103
+ basicDenominators: {
104
+ collectionCount: config.collections?.length ?? 0,
105
+ globalCount: config.globals?.length ?? 0
106
+ }
107
+ });
108
+ const collectI18n = (config)=>({
109
+ i18n: {
110
+ hasCustomAdminTranslations: Object.keys(config.i18n?.translations ?? {}).length > 0,
111
+ supportedAdminLanguageCount: config.i18n?.supportedLanguages ? Object.keys(config.i18n.supportedLanguages).length : 1
112
+ }
113
+ });
114
+ const collectJobsAndQueues = (config)=>{
115
+ const tasks = Array.isArray(config.jobs?.tasks) ? config.jobs.tasks : [];
116
+ const workflows = Array.isArray(config.jobs?.workflows) ? config.jobs.workflows : [];
117
+ const tasksAndWorkflows = [
118
+ ...tasks,
119
+ ...workflows
120
+ ];
121
+ const scheduledPublishingEntityCount = getDraftEntities(config).filter(hasScheduledPublishing).length;
122
+ return {
123
+ jobsAndQueues: {
124
+ jobsAutoRunConfigured: config.jobs?.autoRun !== undefined,
125
+ jobsConcurrencyEnabled: tasksAndWorkflows.some(({ concurrency })=>Boolean(concurrency)),
126
+ jobsEnabled: tasks.length > 0 || workflows.length > 0 || scheduledPublishingEntityCount > 0,
127
+ jobsSchedulingEnabled: tasksAndWorkflows.some(({ schedule })=>Boolean(schedule)),
128
+ taskCount: tasks.length,
129
+ workflowCount: workflows.length
130
+ }
131
+ };
132
+ };
133
+ const collectOrdering = (config)=>({
134
+ orderableCollectionCount: (config.collections ?? []).filter(({ orderable })=>Boolean(orderable)).length
135
+ });
136
+ const collectPreviewAndLivePreview = (config)=>{
137
+ const collections = config.collections ?? [];
138
+ const globals = config.globals ?? [];
139
+ const livePreviewCollections = new Set([
140
+ ...config.admin?.livePreview?.collections ?? [],
141
+ ...collections.filter((c)=>c.admin?.livePreview).map((c)=>c.slug)
142
+ ]);
143
+ const livePreviewGlobals = new Set([
144
+ ...config.admin?.livePreview?.globals ?? [],
145
+ ...globals.filter((g)=>g.admin?.livePreview).map((g)=>g.slug)
146
+ ]);
147
+ return {
148
+ previewAndLivePreview: {
149
+ livePreviewCollectionCount: collections.filter(({ slug })=>livePreviewCollections.has(slug)).length,
150
+ livePreviewGlobalCount: globals.filter(({ slug })=>livePreviewGlobals.has(slug)).length,
151
+ previewCollectionCount: collections.filter(({ admin })=>Boolean(admin?.preview)).length,
152
+ previewGlobalCount: globals.filter(({ admin })=>Boolean(admin?.preview)).length
153
+ }
154
+ };
155
+ };
156
+ const collectQueryPresets = (config)=>({
157
+ queryPresetCollectionCount: (config.collections ?? []).filter(({ enableQueryPresets })=>Boolean(enableQueryPresets)).length
158
+ });
159
+ const collectRichTextFeatures = (config)=>{
160
+ const editor = config.editor;
161
+ const features = isObject(editor) && isObject(editor.editorConfig) ? editor.editorConfig.features : undefined;
162
+ const raw = isObject(features) && Array.isArray(features.enabledFeatures) ? features.enabledFeatures : [];
163
+ const featureSet = new Set(raw.filter((f)=>typeof f === 'string'));
164
+ // per-field editor overrides are not checked; root editor covers the vast majority of projects
165
+ return {
166
+ richTextFeatures: [
167
+ 'blocks',
168
+ 'table',
169
+ 'upload',
170
+ 'relationship'
171
+ ].filter((f)=>featureSet.has(f))
172
+ };
173
+ };
174
+ const collectTrash = (config)=>({
175
+ trashCollectionCount: (config.collections ?? []).filter(({ trash })=>Boolean(trash)).length
176
+ });
177
+ const collectUploadAndMedia = (config)=>{
178
+ const collections = config.collections ?? [];
179
+ return {
180
+ uploadAndMedia: {
181
+ cropDisabledCollectionCount: collections.filter(({ upload })=>isObject(upload) && upload.crop === false).length,
182
+ focalPointDisabledCollectionCount: collections.filter(({ upload })=>isObject(upload) && upload.focalPoint === false).length,
183
+ imageSizesCollectionCount: collections.filter(({ upload })=>isObject(upload) && Boolean(upload.imageSizes?.length)).length,
184
+ mimeRestrictedCollectionCount: collections.filter(({ upload })=>isObject(upload) && Boolean(upload.mimeTypes?.length)).length,
185
+ uploadCollectionCount: collections.filter(({ upload })=>Boolean(upload)).length
186
+ }
187
+ };
188
+ };
189
+ const collectVersionsAndDrafts = (config)=>{
190
+ const collections = config.collections ?? [];
191
+ const globals = config.globals ?? [];
192
+ const draftCollections = collections.filter(hasDrafts);
193
+ const draftGlobals = globals.filter(hasDrafts);
194
+ const draftEntities = [
195
+ ...draftCollections,
196
+ ...draftGlobals
197
+ ];
198
+ return {
199
+ versionsAndDrafts: {
200
+ autosaveEntityCount: draftEntities.filter(hasAutosave).length,
201
+ draftCollectionCount: draftCollections.length,
202
+ draftGlobalCount: draftGlobals.length,
203
+ scheduledPublishingEntityCount: draftEntities.filter(hasScheduledPublishing).length,
204
+ versionsDisabledCollectionCount: collections.filter(({ versions })=>!versions).length,
205
+ versionsDisabledGlobalCount: globals.filter(({ versions })=>!versions).length
206
+ }
207
+ };
208
+ };
209
+ const getDraftEntities = (config)=>[
210
+ ...(config.collections ?? []).filter(hasDrafts),
211
+ ...(config.globals ?? []).filter(hasDrafts)
212
+ ];
213
+ const hasDrafts = ({ versions })=>isObject(versions) && Boolean(versions.drafts);
214
+ const getDraftOptions = ({ versions })=>isObject(versions) && isObject(versions.drafts) ? versions.drafts : undefined;
215
+ const hasAutosave = (entity)=>Boolean(getDraftOptions(entity)?.autosave);
216
+ const hasScheduledPublishing = (entity)=>Boolean(getDraftOptions(entity)?.schedulePublish);
217
+ const countRootAdminComponents = (config)=>{
218
+ const admin = config.admin;
219
+ const customAvatarCount = Number(Boolean(admin?.avatar && typeof admin.avatar === 'object' && admin.avatar.Component));
220
+ const components = admin?.components;
221
+ if (!components) {
222
+ return customAvatarCount;
223
+ }
224
+ const componentArrays = [
225
+ components.actions,
226
+ components.afterDashboard,
227
+ components.afterLogin,
228
+ components.afterNav,
229
+ components.afterNavLinks,
230
+ components.beforeDashboard,
231
+ components.beforeLogin,
232
+ components.beforeNav,
233
+ components.beforeNavLinks,
234
+ components.header,
235
+ components.providers,
236
+ components.settingsMenu
237
+ ];
238
+ const directComponents = [
239
+ components.graphics?.Icon,
240
+ components.graphics?.Logo,
241
+ components.logout?.Button,
242
+ components.Nav
243
+ ];
244
+ return customAvatarCount + componentArrays.reduce((count, items)=>count + (items?.length ?? 0), 0) + directComponents.filter(Boolean).length;
245
+ };
246
+ const isObject = (value)=>value !== null && typeof value === 'object';
247
+
248
+ //# sourceMappingURL=getFeatureInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/utilities/telemetry/featureInfo/getFeatureInfo.ts"],"sourcesContent":["import type { SanitizedConfig } from '../../../config/types.js'\nimport type { IncomingDrafts } from '../../../versions/types.js'\nimport type { FeatureInfo, RichTextFeature } from './types.js'\n\nimport { defaultUserCollection } from '../../../auth/defaultUser.js'\n\nexport const getFeatureInfo = (config: SanitizedConfig): FeatureInfo => {\n const telemetryConfig = sanitizeTelemetryConfig(config)\n\n return Object.assign(\n {},\n ...[\n collectAdminCustomization,\n collectAuthentication,\n collectBasicDenominators,\n collectI18n,\n collectJobsAndQueues,\n collectOrdering,\n collectPreviewAndLivePreview,\n collectQueryPresets,\n collectTrash,\n collectUploadAndMedia,\n collectVersionsAndDrafts,\n collectRichTextFeatures,\n ].map((collect) => safelyCollect(() => collect(telemetryConfig))),\n )\n}\n\nconst safelyCollect = (collect: () => FeatureInfo): FeatureInfo => {\n try {\n return collect()\n } catch (_) {\n return {}\n }\n}\n\n// sanitization adds 3 system widgets that we need to account for\nconst SYSTEM_WIDGET_COUNT = 3\nconst SYSTEM_COLLECTION_SLUGS = [\n 'payload-locked-documents',\n 'payload-migrations',\n 'payload-preferences',\n 'payload-query-presets',\n]\nconst SYSTEM_GLOBAL_SLUGS = new Set(['payload-jobs-stats'])\n\n/**\n * Payload adds internal collections, globals and tasks during config sanitization.\n * Remove them from the telemetry view so feature metrics represent user config.\n */\nconst sanitizeTelemetryConfig = (config: SanitizedConfig): SanitizedConfig => {\n try {\n const collections = config.collections ?? []\n const systemCollectionSlugs = new Set(SYSTEM_COLLECTION_SLUGS)\n const kvCollectionSlug = config.kv?.kvCollection?.slug\n\n if (kvCollectionSlug) {\n systemCollectionSlugs.add(kvCollectionSlug)\n }\n\n if (config.jobs?.enabled) {\n // uses SYSTEM_COLLECTION_SLUGS (not the Set) to exclude kv slug from position detection\n const firstCollectionAfterJobs = collections.findIndex(({ slug }) =>\n SYSTEM_COLLECTION_SLUGS.includes(slug),\n )\n\n if (firstCollectionAfterJobs > 0) {\n systemCollectionSlugs.add(collections[firstCollectionAfterJobs - 1]!.slug)\n } else {\n systemCollectionSlugs.add('payload-jobs')\n }\n }\n\n const tasks = [...(config.jobs?.tasks ?? [])]\n\n if (getDraftEntities(config).some(hasScheduledPublishing)) {\n for (let index = tasks.length - 1; index >= 0; index--) {\n if (tasks[index]?.slug === 'schedulePublish') {\n tasks.splice(index, 1)\n break\n }\n }\n }\n\n return {\n ...config,\n collections: collections.filter(\n (collection) =>\n collection !== defaultUserCollection && !systemCollectionSlugs.has(collection.slug),\n ),\n globals: (config.globals ?? []).filter(({ slug }) => !SYSTEM_GLOBAL_SLUGS.has(slug)),\n jobs: {\n ...config.jobs,\n tasks,\n },\n }\n } catch (_) {\n return config\n }\n}\n\nconst collectAdminCustomization = (config: SanitizedConfig): FeatureInfo => ({\n adminCustomization: {\n customAdminComponentCount: countRootAdminComponents(config),\n customAdminViewCount: Object.keys(config.admin?.components?.views ?? {}).length,\n customDashboardWidgetCount: Math.max(\n 0,\n (config.admin?.dashboard?.widgets?.length ?? 0) - SYSTEM_WIDGET_COUNT,\n ),\n },\n})\n\nconst collectAuthentication = (config: SanitizedConfig): FeatureInfo => {\n const authCollections = (config.collections ?? []).filter(({ auth }) => Boolean(auth))\n\n return {\n authentication: {\n apiKeyCollectionCount: authCollections.filter(\n ({ auth }) => isObject(auth) && Boolean(auth.useAPIKey),\n ).length,\n authCollectionCount: authCollections.length,\n customAuthStrategyCount: authCollections.reduce(\n (count, { auth }) =>\n count + (isObject(auth) && Array.isArray(auth.strategies) ? auth.strategies.length : 0),\n 0,\n ),\n localAuthDisabledCollectionCount: authCollections.filter(\n ({ auth }) => isObject(auth) && Boolean(auth.disableLocalStrategy),\n ).length,\n sessionsDisabledCollectionCount: authCollections.filter(\n ({ auth }) => isObject(auth) && auth.useSessions === false,\n ).length,\n usernameCollectionCount: authCollections.filter(\n ({ auth }) => isObject(auth) && Boolean(auth.loginWithUsername),\n ).length,\n verifiedCollectionCount: authCollections.filter(\n ({ auth }) => isObject(auth) && Boolean(auth.verify),\n ).length,\n },\n }\n}\n\nconst collectBasicDenominators = (config: SanitizedConfig): FeatureInfo => ({\n basicDenominators: {\n collectionCount: config.collections?.length ?? 0,\n globalCount: config.globals?.length ?? 0,\n },\n})\n\nconst collectI18n = (config: SanitizedConfig): FeatureInfo => ({\n i18n: {\n hasCustomAdminTranslations: Object.keys(config.i18n?.translations ?? {}).length > 0,\n supportedAdminLanguageCount: config.i18n?.supportedLanguages\n ? Object.keys(config.i18n.supportedLanguages).length\n : 1,\n },\n})\n\nconst collectJobsAndQueues = (config: SanitizedConfig): FeatureInfo => {\n const tasks = Array.isArray(config.jobs?.tasks) ? config.jobs.tasks : []\n const workflows = Array.isArray(config.jobs?.workflows) ? config.jobs.workflows : []\n const tasksAndWorkflows = [...tasks, ...workflows]\n const scheduledPublishingEntityCount =\n getDraftEntities(config).filter(hasScheduledPublishing).length\n\n return {\n jobsAndQueues: {\n jobsAutoRunConfigured: config.jobs?.autoRun !== undefined,\n jobsConcurrencyEnabled: tasksAndWorkflows.some(({ concurrency }) => Boolean(concurrency)),\n jobsEnabled: tasks.length > 0 || workflows.length > 0 || scheduledPublishingEntityCount > 0,\n jobsSchedulingEnabled: tasksAndWorkflows.some(({ schedule }) => Boolean(schedule)),\n taskCount: tasks.length,\n workflowCount: workflows.length,\n },\n }\n}\n\nconst collectOrdering = (config: SanitizedConfig): FeatureInfo => ({\n orderableCollectionCount: (config.collections ?? []).filter(({ orderable }) => Boolean(orderable))\n .length,\n})\n\nconst collectPreviewAndLivePreview = (config: SanitizedConfig): FeatureInfo => {\n const collections = config.collections ?? []\n const globals = config.globals ?? []\n const livePreviewCollections = new Set([\n ...(config.admin?.livePreview?.collections ?? []),\n ...collections.filter((c) => c.admin?.livePreview).map((c) => c.slug),\n ])\n const livePreviewGlobals = new Set([\n ...(config.admin?.livePreview?.globals ?? []),\n ...globals.filter((g) => g.admin?.livePreview).map((g) => g.slug),\n ])\n\n return {\n previewAndLivePreview: {\n livePreviewCollectionCount: collections.filter(({ slug }) => livePreviewCollections.has(slug))\n .length,\n livePreviewGlobalCount: globals.filter(({ slug }) => livePreviewGlobals.has(slug)).length,\n previewCollectionCount: collections.filter(({ admin }) => Boolean(admin?.preview)).length,\n previewGlobalCount: globals.filter(({ admin }) => Boolean(admin?.preview)).length,\n },\n }\n}\n\nconst collectQueryPresets = (config: SanitizedConfig): FeatureInfo => ({\n queryPresetCollectionCount: (config.collections ?? []).filter(({ enableQueryPresets }) =>\n Boolean(enableQueryPresets),\n ).length,\n})\n\nconst collectRichTextFeatures = (config: SanitizedConfig): FeatureInfo => {\n const editor: unknown = config.editor\n const features =\n isObject(editor) && isObject(editor.editorConfig) ? editor.editorConfig.features : undefined\n const raw =\n isObject(features) && Array.isArray(features.enabledFeatures) ? features.enabledFeatures : []\n const featureSet = new Set(raw.filter((f): f is string => typeof f === 'string'))\n // per-field editor overrides are not checked; root editor covers the vast majority of projects\n return {\n richTextFeatures: (['blocks', 'table', 'upload', 'relationship'] as const).filter((f) =>\n featureSet.has(f),\n ) as RichTextFeature[],\n }\n}\n\nconst collectTrash = (config: SanitizedConfig): FeatureInfo => ({\n trashCollectionCount: (config.collections ?? []).filter(({ trash }) => Boolean(trash)).length,\n})\n\nconst collectUploadAndMedia = (config: SanitizedConfig): FeatureInfo => {\n const collections = config.collections ?? []\n\n return {\n uploadAndMedia: {\n cropDisabledCollectionCount: collections.filter(\n ({ upload }) => isObject(upload) && upload.crop === false,\n ).length,\n focalPointDisabledCollectionCount: collections.filter(\n ({ upload }) => isObject(upload) && upload.focalPoint === false,\n ).length,\n imageSizesCollectionCount: collections.filter(\n ({ upload }) => isObject(upload) && Boolean(upload.imageSizes?.length),\n ).length,\n mimeRestrictedCollectionCount: collections.filter(\n ({ upload }) => isObject(upload) && Boolean(upload.mimeTypes?.length),\n ).length,\n uploadCollectionCount: collections.filter(({ upload }) => Boolean(upload)).length,\n },\n }\n}\n\nconst collectVersionsAndDrafts = (config: SanitizedConfig): FeatureInfo => {\n const collections = config.collections ?? []\n const globals = config.globals ?? []\n const draftCollections = collections.filter(hasDrafts)\n const draftGlobals = globals.filter(hasDrafts)\n const draftEntities = [...draftCollections, ...draftGlobals]\n\n return {\n versionsAndDrafts: {\n autosaveEntityCount: draftEntities.filter(hasAutosave).length,\n draftCollectionCount: draftCollections.length,\n draftGlobalCount: draftGlobals.length,\n scheduledPublishingEntityCount: draftEntities.filter(hasScheduledPublishing).length,\n versionsDisabledCollectionCount: collections.filter(({ versions }) => !versions).length,\n versionsDisabledGlobalCount: globals.filter(({ versions }) => !versions).length,\n },\n }\n}\n\nconst getDraftEntities = (config: SanitizedConfig) => [\n ...(config.collections ?? []).filter(hasDrafts),\n ...(config.globals ?? []).filter(hasDrafts),\n]\n\nconst hasDrafts = ({ versions }: { versions?: { drafts?: unknown } | boolean }): boolean =>\n isObject(versions) && Boolean(versions.drafts)\n\nconst getDraftOptions = ({\n versions,\n}: {\n versions?: { drafts?: boolean | IncomingDrafts } | boolean\n}): IncomingDrafts | undefined =>\n isObject(versions) && isObject(versions.drafts) ? versions.drafts : undefined\n\nconst hasAutosave = (entity: Parameters<typeof getDraftOptions>[0]): boolean =>\n Boolean(getDraftOptions(entity)?.autosave)\n\nconst hasScheduledPublishing = (entity: Parameters<typeof getDraftOptions>[0]): boolean =>\n Boolean(getDraftOptions(entity)?.schedulePublish)\n\nconst countRootAdminComponents = (config: SanitizedConfig): number => {\n const admin = config.admin\n const customAvatarCount = Number(\n Boolean(admin?.avatar && typeof admin.avatar === 'object' && admin.avatar.Component),\n )\n const components = admin?.components\n\n if (!components) {\n return customAvatarCount\n }\n\n const componentArrays = [\n components.actions,\n components.afterDashboard,\n components.afterLogin,\n components.afterNav,\n components.afterNavLinks,\n components.beforeDashboard,\n components.beforeLogin,\n components.beforeNav,\n components.beforeNavLinks,\n components.header,\n components.providers,\n components.settingsMenu,\n ]\n const directComponents = [\n components.graphics?.Icon,\n components.graphics?.Logo,\n components.logout?.Button,\n components.Nav,\n ]\n return (\n customAvatarCount +\n componentArrays.reduce((count, items) => count + (items?.length ?? 0), 0) +\n directComponents.filter(Boolean).length\n )\n}\n\nconst isObject = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === 'object'\n"],"names":["defaultUserCollection","getFeatureInfo","config","telemetryConfig","sanitizeTelemetryConfig","Object","assign","collectAdminCustomization","collectAuthentication","collectBasicDenominators","collectI18n","collectJobsAndQueues","collectOrdering","collectPreviewAndLivePreview","collectQueryPresets","collectTrash","collectUploadAndMedia","collectVersionsAndDrafts","collectRichTextFeatures","map","collect","safelyCollect","_","SYSTEM_WIDGET_COUNT","SYSTEM_COLLECTION_SLUGS","SYSTEM_GLOBAL_SLUGS","Set","collections","systemCollectionSlugs","kvCollectionSlug","kv","kvCollection","slug","add","jobs","enabled","firstCollectionAfterJobs","findIndex","includes","tasks","getDraftEntities","some","hasScheduledPublishing","index","length","splice","filter","collection","has","globals","adminCustomization","customAdminComponentCount","countRootAdminComponents","customAdminViewCount","keys","admin","components","views","customDashboardWidgetCount","Math","max","dashboard","widgets","authCollections","auth","Boolean","authentication","apiKeyCollectionCount","isObject","useAPIKey","authCollectionCount","customAuthStrategyCount","reduce","count","Array","isArray","strategies","localAuthDisabledCollectionCount","disableLocalStrategy","sessionsDisabledCollectionCount","useSessions","usernameCollectionCount","loginWithUsername","verifiedCollectionCount","verify","basicDenominators","collectionCount","globalCount","i18n","hasCustomAdminTranslations","translations","supportedAdminLanguageCount","supportedLanguages","workflows","tasksAndWorkflows","scheduledPublishingEntityCount","jobsAndQueues","jobsAutoRunConfigured","autoRun","undefined","jobsConcurrencyEnabled","concurrency","jobsEnabled","jobsSchedulingEnabled","schedule","taskCount","workflowCount","orderableCollectionCount","orderable","livePreviewCollections","livePreview","c","livePreviewGlobals","g","previewAndLivePreview","livePreviewCollectionCount","livePreviewGlobalCount","previewCollectionCount","preview","previewGlobalCount","queryPresetCollectionCount","enableQueryPresets","editor","features","editorConfig","raw","enabledFeatures","featureSet","f","richTextFeatures","trashCollectionCount","trash","uploadAndMedia","cropDisabledCollectionCount","upload","crop","focalPointDisabledCollectionCount","focalPoint","imageSizesCollectionCount","imageSizes","mimeRestrictedCollectionCount","mimeTypes","uploadCollectionCount","draftCollections","hasDrafts","draftGlobals","draftEntities","versionsAndDrafts","autosaveEntityCount","hasAutosave","draftCollectionCount","draftGlobalCount","versionsDisabledCollectionCount","versions","versionsDisabledGlobalCount","drafts","getDraftOptions","entity","autosave","schedulePublish","customAvatarCount","Number","avatar","Component","componentArrays","actions","afterDashboard","afterLogin","afterNav","afterNavLinks","beforeDashboard","beforeLogin","beforeNav","beforeNavLinks","header","providers","settingsMenu","directComponents","graphics","Icon","Logo","logout","Button","Nav","items","value"],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ export type RichTextFeature = 'blocks' | 'relationship' | 'table' | 'upload';
2
+ type CompleteFeatureInfo = {
3
+ adminCustomization: {
4
+ customAdminComponentCount: number;
5
+ customAdminViewCount: number;
6
+ customDashboardWidgetCount: number;
7
+ };
8
+ authentication: {
9
+ apiKeyCollectionCount: number;
10
+ authCollectionCount: number;
11
+ customAuthStrategyCount: number;
12
+ localAuthDisabledCollectionCount: number;
13
+ sessionsDisabledCollectionCount: number;
14
+ usernameCollectionCount: number;
15
+ verifiedCollectionCount: number;
16
+ };
17
+ basicDenominators: {
18
+ collectionCount: number;
19
+ globalCount: number;
20
+ };
21
+ i18n: {
22
+ hasCustomAdminTranslations: boolean;
23
+ supportedAdminLanguageCount: number;
24
+ };
25
+ jobsAndQueues: {
26
+ jobsAutoRunConfigured: boolean;
27
+ jobsConcurrencyEnabled: boolean;
28
+ jobsEnabled: boolean;
29
+ jobsSchedulingEnabled: boolean;
30
+ taskCount: number;
31
+ workflowCount: number;
32
+ };
33
+ orderableCollectionCount: number;
34
+ previewAndLivePreview: {
35
+ livePreviewCollectionCount: number;
36
+ livePreviewGlobalCount: number;
37
+ previewCollectionCount: number;
38
+ previewGlobalCount: number;
39
+ };
40
+ queryPresetCollectionCount: number;
41
+ richTextFeatures: RichTextFeature[];
42
+ trashCollectionCount: number;
43
+ uploadAndMedia: {
44
+ cropDisabledCollectionCount: number;
45
+ focalPointDisabledCollectionCount: number;
46
+ imageSizesCollectionCount: number;
47
+ mimeRestrictedCollectionCount: number;
48
+ uploadCollectionCount: number;
49
+ };
50
+ versionsAndDrafts: {
51
+ autosaveEntityCount: number;
52
+ draftCollectionCount: number;
53
+ draftGlobalCount: number;
54
+ scheduledPublishingEntityCount: number;
55
+ versionsDisabledCollectionCount: number;
56
+ versionsDisabledGlobalCount: number;
57
+ };
58
+ };
59
+ /** Feature families are omitted individually if their collection fails. */
60
+ export type FeatureInfo = Partial<CompleteFeatureInfo>;
61
+ export {};
62
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/utilities/telemetry/featureInfo/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,cAAc,GAAG,OAAO,GAAG,QAAQ,CAAA;AAE5E,KAAK,mBAAmB,GAAG;IACzB,kBAAkB,EAAE;QAClB,yBAAyB,EAAE,MAAM,CAAA;QACjC,oBAAoB,EAAE,MAAM,CAAA;QAC5B,0BAA0B,EAAE,MAAM,CAAA;KACnC,CAAA;IACD,cAAc,EAAE;QACd,qBAAqB,EAAE,MAAM,CAAA;QAC7B,mBAAmB,EAAE,MAAM,CAAA;QAC3B,uBAAuB,EAAE,MAAM,CAAA;QAC/B,gCAAgC,EAAE,MAAM,CAAA;QACxC,+BAA+B,EAAE,MAAM,CAAA;QACvC,uBAAuB,EAAE,MAAM,CAAA;QAC/B,uBAAuB,EAAE,MAAM,CAAA;KAChC,CAAA;IACD,iBAAiB,EAAE;QACjB,eAAe,EAAE,MAAM,CAAA;QACvB,WAAW,EAAE,MAAM,CAAA;KACpB,CAAA;IACD,IAAI,EAAE;QACJ,0BAA0B,EAAE,OAAO,CAAA;QACnC,2BAA2B,EAAE,MAAM,CAAA;KACpC,CAAA;IACD,aAAa,EAAE;QACb,qBAAqB,EAAE,OAAO,CAAA;QAC9B,sBAAsB,EAAE,OAAO,CAAA;QAC/B,WAAW,EAAE,OAAO,CAAA;QACpB,qBAAqB,EAAE,OAAO,CAAA;QAC9B,SAAS,EAAE,MAAM,CAAA;QACjB,aAAa,EAAE,MAAM,CAAA;KACtB,CAAA;IACD,wBAAwB,EAAE,MAAM,CAAA;IAChC,qBAAqB,EAAE;QACrB,0BAA0B,EAAE,MAAM,CAAA;QAClC,sBAAsB,EAAE,MAAM,CAAA;QAC9B,sBAAsB,EAAE,MAAM,CAAA;QAC9B,kBAAkB,EAAE,MAAM,CAAA;KAC3B,CAAA;IACD,0BAA0B,EAAE,MAAM,CAAA;IAClC,gBAAgB,EAAE,eAAe,EAAE,CAAA;IACnC,oBAAoB,EAAE,MAAM,CAAA;IAC5B,cAAc,EAAE;QACd,2BAA2B,EAAE,MAAM,CAAA;QACnC,iCAAiC,EAAE,MAAM,CAAA;QACzC,yBAAyB,EAAE,MAAM,CAAA;QACjC,6BAA6B,EAAE,MAAM,CAAA;QACrC,qBAAqB,EAAE,MAAM,CAAA;KAC9B,CAAA;IACD,iBAAiB,EAAE;QACjB,mBAAmB,EAAE,MAAM,CAAA;QAC3B,oBAAoB,EAAE,MAAM,CAAA;QAC5B,gBAAgB,EAAE,MAAM,CAAA;QACxB,8BAA8B,EAAE,MAAM,CAAA;QACtC,+BAA+B,EAAE,MAAM,CAAA;QACvC,2BAA2B,EAAE,MAAM,CAAA;KACpC,CAAA;CACF,CAAA;AAED,2EAA2E;AAC3E,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ /** Feature families are omitted individually if their collection fails. */ export { };
2
+
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/utilities/telemetry/featureInfo/types.ts"],"sourcesContent":["export type RichTextFeature = 'blocks' | 'relationship' | 'table' | 'upload'\n\ntype CompleteFeatureInfo = {\n adminCustomization: {\n customAdminComponentCount: number\n customAdminViewCount: number\n customDashboardWidgetCount: number\n }\n authentication: {\n apiKeyCollectionCount: number\n authCollectionCount: number\n customAuthStrategyCount: number\n localAuthDisabledCollectionCount: number\n sessionsDisabledCollectionCount: number\n usernameCollectionCount: number\n verifiedCollectionCount: number\n }\n basicDenominators: {\n collectionCount: number\n globalCount: number\n }\n i18n: {\n hasCustomAdminTranslations: boolean\n supportedAdminLanguageCount: number\n }\n jobsAndQueues: {\n jobsAutoRunConfigured: boolean\n jobsConcurrencyEnabled: boolean\n jobsEnabled: boolean\n jobsSchedulingEnabled: boolean\n taskCount: number\n workflowCount: number\n }\n orderableCollectionCount: number\n previewAndLivePreview: {\n livePreviewCollectionCount: number\n livePreviewGlobalCount: number\n previewCollectionCount: number\n previewGlobalCount: number\n }\n queryPresetCollectionCount: number\n richTextFeatures: RichTextFeature[]\n trashCollectionCount: number\n uploadAndMedia: {\n cropDisabledCollectionCount: number\n focalPointDisabledCollectionCount: number\n imageSizesCollectionCount: number\n mimeRestrictedCollectionCount: number\n uploadCollectionCount: number\n }\n versionsAndDrafts: {\n autosaveEntityCount: number\n draftCollectionCount: number\n draftGlobalCount: number\n scheduledPublishingEntityCount: number\n versionsDisabledCollectionCount: number\n versionsDisabledGlobalCount: number\n }\n}\n\n/** Feature families are omitted individually if their collection fails. */\nexport type FeatureInfo = Partial<CompleteFeatureInfo>\n"],"names":[],"mappings":"AA4DA,yEAAyE,GACzE,WAAsD"}
@@ -0,0 +1,14 @@
1
+ import type { Payload } from '../../types/index.js';
2
+ export type ProjectCohort = 'cloud' | 'enterprise' | 'oss';
3
+ type Args = {
4
+ env?: NodeJS.ProcessEnv;
5
+ packages?: string[];
6
+ payload: Payload;
7
+ plugins: string[];
8
+ };
9
+ export declare const enterprisePackageNames: Set<string>;
10
+ export declare const getProjectContext: ({ env, packages, payload, plugins, }: Args) => {
11
+ projectCohorts: ProjectCohort[];
12
+ };
13
+ export {};
14
+ //# sourceMappingURL=getProjectContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getProjectContext.d.ts","sourceRoot":"","sources":["../../../src/utilities/telemetry/getProjectContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAEnD,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,YAAY,GAAG,KAAK,CAAA;AAE1D,KAAK,IAAI,GAAG;IACV,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB,CAAA;AAED,eAAO,MAAM,sBAAsB,aAcjC,CAAA;AAEF,eAAO,MAAM,iBAAiB,yCAK3B,IAAI,KAAG;IAAE,cAAc,EAAE,aAAa,EAAE,CAAA;CAoB1C,CAAA"}
@@ -0,0 +1,36 @@
1
+ export const enterprisePackageNames = new Set([
2
+ '@payloadcms/ai-model-adapter',
3
+ '@payloadcms/plugin-ab-testing',
4
+ '@payloadcms/plugin-admin-only',
5
+ '@payloadcms/plugin-ai-embeddings',
6
+ '@payloadcms/plugin-ai-translate',
7
+ '@payloadcms/plugin-audit-logs',
8
+ '@payloadcms/plugin-csm',
9
+ '@payloadcms/plugin-email-builder',
10
+ '@payloadcms/plugin-environments',
11
+ '@payloadcms/plugin-oauth2',
12
+ '@payloadcms/plugin-publication-workflows',
13
+ '@payloadcms/plugin-visual-editing',
14
+ '@payloadcms/visual-editing'
15
+ ]);
16
+ export const getProjectContext = ({ env = process.env, packages = [], payload, plugins })=>{
17
+ const projectCohorts = [];
18
+ if ([
19
+ ...packages,
20
+ ...plugins
21
+ ].some((name)=>enterprisePackageNames.has(name))) {
22
+ projectCohorts.push('enterprise');
23
+ }
24
+ const hasPayloadCloudConfig = payload.config.globals.some((global)=>global.slug === 'payload-cloud-instance');
25
+ if (env.PAYLOAD_CLOUD === 'true' && hasPayloadCloudConfig) {
26
+ projectCohorts.push('cloud');
27
+ }
28
+ if (projectCohorts.length === 0) {
29
+ projectCohorts.push('oss');
30
+ }
31
+ return {
32
+ projectCohorts
33
+ };
34
+ };
35
+
36
+ //# sourceMappingURL=getProjectContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utilities/telemetry/getProjectContext.ts"],"sourcesContent":["import type { Payload } from '../../types/index.js'\n\nexport type ProjectCohort = 'cloud' | 'enterprise' | 'oss'\n\ntype Args = {\n env?: NodeJS.ProcessEnv\n packages?: string[]\n payload: Payload\n plugins: string[]\n}\n\nexport const enterprisePackageNames = new Set([\n '@payloadcms/ai-model-adapter',\n '@payloadcms/plugin-ab-testing',\n '@payloadcms/plugin-admin-only',\n '@payloadcms/plugin-ai-embeddings',\n '@payloadcms/plugin-ai-translate',\n '@payloadcms/plugin-audit-logs',\n '@payloadcms/plugin-csm',\n '@payloadcms/plugin-email-builder',\n '@payloadcms/plugin-environments',\n '@payloadcms/plugin-oauth2',\n '@payloadcms/plugin-publication-workflows',\n '@payloadcms/plugin-visual-editing',\n '@payloadcms/visual-editing',\n])\n\nexport const getProjectContext = ({\n env = process.env,\n packages = [],\n payload,\n plugins,\n}: Args): { projectCohorts: ProjectCohort[] } => {\n const projectCohorts: ProjectCohort[] = []\n\n if ([...packages, ...plugins].some((name) => enterprisePackageNames.has(name))) {\n projectCohorts.push('enterprise')\n }\n\n const hasPayloadCloudConfig = payload.config.globals.some(\n (global) => global.slug === 'payload-cloud-instance',\n )\n\n if (env.PAYLOAD_CLOUD === 'true' && hasPayloadCloudConfig) {\n projectCohorts.push('cloud')\n }\n\n if (projectCohorts.length === 0) {\n projectCohorts.push('oss')\n }\n\n return { projectCohorts }\n}\n"],"names":["enterprisePackageNames","Set","getProjectContext","env","process","packages","payload","plugins","projectCohorts","some","name","has","push","hasPayloadCloudConfig","config","globals","global","slug","PAYLOAD_CLOUD","length"],"mappings":"AAWA,OAAO,MAAMA,yBAAyB,IAAIC,IAAI;IAC5C;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD,EAAC;AAEF,OAAO,MAAMC,oBAAoB,CAAC,EAChCC,MAAMC,QAAQD,GAAG,EACjBE,WAAW,EAAE,EACbC,OAAO,EACPC,OAAO,EACF;IACL,MAAMC,iBAAkC,EAAE;IAE1C,IAAI;WAAIH;WAAaE;KAAQ,CAACE,IAAI,CAAC,CAACC,OAASV,uBAAuBW,GAAG,CAACD,QAAQ;QAC9EF,eAAeI,IAAI,CAAC;IACtB;IAEA,MAAMC,wBAAwBP,QAAQQ,MAAM,CAACC,OAAO,CAACN,IAAI,CACvD,CAACO,SAAWA,OAAOC,IAAI,KAAK;IAG9B,IAAId,IAAIe,aAAa,KAAK,UAAUL,uBAAuB;QACzDL,eAAeI,IAAI,CAAC;IACtB;IAEA,IAAIJ,eAAeW,MAAM,KAAK,GAAG;QAC/BX,eAAeI,IAAI,CAAC;IACtB;IAEA,OAAO;QAAEJ;IAAe;AAC1B,EAAC"}
@@ -1,11 +1,14 @@
1
1
  import type { Payload } from '../../types/index.js';
2
2
  import type { AdminInitEvent } from './events/adminInit.js';
3
3
  import type { ServerInitEvent } from './events/serverInit.js';
4
+ import type { FeatureInfo } from './featureInfo/types.js';
5
+ import type { ProjectCohort } from './getProjectContext.js';
4
6
  export type BaseEvent = {
5
7
  ciName: null | string;
6
8
  dbAdapter: string;
7
9
  emailAdapter: null | string;
8
10
  envID: string;
11
+ frameworkAdapter: 'next' | 'tanstack-start' | 'unknown';
9
12
  isCI: boolean;
10
13
  locales: string[];
11
14
  localizationDefaultLocale: null | string;
@@ -13,10 +16,12 @@ export type BaseEvent = {
13
16
  nodeEnv: string;
14
17
  nodeVersion: string;
15
18
  payloadVersion: string;
19
+ plugins: string[];
20
+ projectCohorts: ProjectCohort[];
16
21
  projectID: string;
17
22
  projectIDSource: 'cwd' | 'git' | 'packageJSON' | 'serverURL';
18
23
  uploadAdapters: string[];
19
- };
24
+ } & FeatureInfo;
20
25
  type PackageJSON = {
21
26
  dependencies: Record<string, string | undefined>;
22
27
  name: string;
@@ -28,6 +33,7 @@ type Args = {
28
33
  };
29
34
  export declare const sendEvent: ({ event, payload }: Args) => Promise<void>;
30
35
  export declare const getPayloadVersion: (packageJSON: PackageJSON) => string;
36
+ export declare const getInstalledPluginSlugs: (payload: Payload) => string[];
31
37
  export declare const getLocalizationInfo: (payload: Payload) => Pick<BaseEvent, "locales" | "localizationDefaultLocale" | "localizationEnabled">;
32
38
  export {};
33
39
  //# sourceMappingURL=index.d.ts.map
@@ -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,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"}
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;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAQ3D,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,gBAAgB,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAAA;IACvD,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,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,cAAc,EAAE,aAAa,EAAE,CAAA;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,KAAK,GAAG,KAAK,GAAG,aAAa,GAAG,WAAW,CAAA;IAC5D,cAAc,EAAE,MAAM,EAAE,CAAA;CACzB,GAAG,WAAW,CAAA;AAEf,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,CAiDtE,CAAA;AAiFD,eAAO,MAAM,iBAAiB,gBAAiB,WAAW,KAAG,MAE5D,CAAA;AAcD,eAAO,MAAM,uBAAuB,YAAa,OAAO,KAAG,MAAM,EAGiC,CAAA;AAElG,eAAO,MAAM,mBAAmB,YACrB,OAAO,KACf,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,2BAA2B,GAAG,qBAAqB,CAcjF,CAAA"}
@@ -6,6 +6,8 @@ import path from 'path';
6
6
  import { fileURLToPath } from 'url';
7
7
  import { findUp } from '../findUp.js';
8
8
  import { Conf } from './conf/index.js';
9
+ import { getFeatureInfo } from './featureInfo/getFeatureInfo.js';
10
+ import { getProjectContext } from './getProjectContext.js';
9
11
  import { oneWayHash } from './oneWayHash.js';
10
12
  let baseEvent = null;
11
13
  export const sendEvent = async ({ event, payload })=>{
@@ -15,6 +17,8 @@ export const sendEvent = async ({ event, payload })=>{
15
17
  // Only generate the base event once
16
18
  if (!baseEvent) {
17
19
  const { projectID, source: projectIDSource } = getProjectID(payload, packageJSON);
20
+ const plugins = getInstalledPluginSlugs(payload);
21
+ const packages = Object.keys(packageJSON.dependencies ?? {});
18
22
  baseEvent = {
19
23
  ciName: ciInfo.isCI ? ciInfo.name : null,
20
24
  envID: getEnvID(),
@@ -24,9 +28,17 @@ export const sendEvent = async ({ event, payload })=>{
24
28
  payloadVersion: getPayloadVersion(packageJSON),
25
29
  projectID,
26
30
  projectIDSource,
31
+ ...getProjectContext({
32
+ packages,
33
+ payload,
34
+ plugins
35
+ }),
36
+ frameworkAdapter: getFrameworkAdapter(packages),
37
+ ...getFeatureInfo(payload.config),
27
38
  ...getLocalizationInfo(payload),
28
39
  dbAdapter: payload.db.name,
29
40
  emailAdapter: payload.email?.name || null,
41
+ plugins,
30
42
  uploadAdapters: payload.config.upload.adapters
31
43
  };
32
44
  }
@@ -135,6 +147,16 @@ const getPackageJSONID = (payload, packageJSON)=>{
135
147
  export const getPayloadVersion = (packageJSON)=>{
136
148
  return packageJSON?.dependencies?.payload ?? '';
137
149
  };
150
+ const getFrameworkAdapter = (packages)=>{
151
+ if (packages.includes('@payloadcms/tanstack-start')) {
152
+ return 'tanstack-start';
153
+ }
154
+ if (packages.includes('@payloadcms/next')) {
155
+ return 'next';
156
+ }
157
+ return 'unknown';
158
+ };
159
+ export const getInstalledPluginSlugs = (payload)=>(payload.config.plugins ?? []).map((plugin)=>plugin.slug).filter((slug)=>typeof slug === 'string' && slug.startsWith('@payloadcms/'));
138
160
  export const getLocalizationInfo = (payload)=>{
139
161
  if (!payload.config.localization) {
140
162
  return {
@@ -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 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 if (payload.config.telemetry !== false) {\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 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","config","telemetry","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","upload","adapters","PAYLOAD_TELEMETRY_DEBUG","logger","info","msg","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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"}
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'\nimport type { FeatureInfo } from './featureInfo/types.js'\nimport type { ProjectCohort } from './getProjectContext.js'\n\nimport { findUp } from '../findUp.js'\nimport { Conf } from './conf/index.js'\nimport { getFeatureInfo } from './featureInfo/getFeatureInfo.js'\nimport { getProjectContext } from './getProjectContext.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 frameworkAdapter: 'next' | 'tanstack-start' | 'unknown'\n isCI: boolean\n locales: string[]\n localizationDefaultLocale: null | string\n localizationEnabled: boolean\n nodeEnv: string\n nodeVersion: string\n payloadVersion: string\n plugins: string[]\n projectCohorts: ProjectCohort[]\n projectID: string\n projectIDSource: 'cwd' | 'git' | 'packageJSON' | 'serverURL'\n uploadAdapters: string[]\n} & FeatureInfo\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 if (payload.config.telemetry !== false) {\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 const plugins = getInstalledPluginSlugs(payload)\n const packages = Object.keys(packageJSON!.dependencies ?? {})\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 ...getProjectContext({ packages, payload, plugins }),\n frameworkAdapter: getFrameworkAdapter(packages),\n ...getFeatureInfo(payload.config),\n ...getLocalizationInfo(payload),\n dbAdapter: payload.db.name,\n emailAdapter: payload.email?.name || null,\n plugins,\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 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\nconst getFrameworkAdapter = (packages: string[]): 'next' | 'tanstack-start' | 'unknown' => {\n if (packages.includes('@payloadcms/tanstack-start')) {\n return 'tanstack-start'\n }\n\n if (packages.includes('@payloadcms/next')) {\n return 'next'\n }\n\n return 'unknown'\n}\n\nexport const getInstalledPluginSlugs = (payload: Payload): string[] =>\n (payload.config.plugins ?? [])\n .map((plugin) => plugin.slug)\n .filter((slug): slug is string => typeof slug === 'string' && slug.startsWith('@payloadcms/'))\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","getFeatureInfo","getProjectContext","oneWayHash","baseEvent","sendEvent","event","payload","config","telemetry","packageJSON","packageJSONPath","getPackageJSON","projectID","source","projectIDSource","getProjectID","plugins","getInstalledPluginSlugs","packages","Object","keys","dependencies","ciName","isCI","name","envID","getEnvID","nodeEnv","process","env","NODE_ENV","nodeVersion","version","payloadVersion","getPayloadVersion","frameworkAdapter","getFrameworkAdapter","getLocalizationInfo","dbAdapter","db","emailAdapter","email","uploadAdapters","upload","adapters","PAYLOAD_TELEMETRY_DEBUG","logger","info","msg","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","includes","map","plugin","slug","filter","startsWith","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.90.0",
3
+ "version": "3.90.1",
4
4
  "description": "Node, React, Headless CMS and Application Framework built on Next.js",
5
5
  "keywords": [
6
6
  "admin panel",
@@ -116,7 +116,7 @@
116
116
  "undici": "7.29.0",
117
117
  "uuid": "13.0.2",
118
118
  "ws": "^8.16.0",
119
- "@payloadcms/translations": "3.90.0"
119
+ "@payloadcms/translations": "3.90.1"
120
120
  },
121
121
  "devDependencies": {
122
122
  "@hyrious/esbuild-plugin-commonjs": "0.2.6",
@@ -1,3 +0,0 @@
1
- import type { Field } from '../../fields/config/types.js';
2
- export declare const apiKeyFields: Field[];
3
- //# sourceMappingURL=apiKey.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"apiKey.d.ts","sourceRoot":"","sources":["../../../src/auth/baseFields/apiKey.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAa,MAAM,8BAA8B,CAAA;AAOpE,eAAO,MAAM,YAAY,EAoDpB,KAAK,EAAE,CAAA"}
@@ -1,59 +0,0 @@
1
- import crypto from 'crypto';
2
- const encryptKey = ({ req, value })=>value ? req.payload.encrypt(value) : null;
3
- const decryptKey = ({ req, value })=>value ? req.payload.decrypt(value) : undefined;
4
- export const apiKeyFields = [
5
- {
6
- name: 'enableAPIKey',
7
- type: 'checkbox',
8
- admin: {
9
- components: {
10
- Field: false
11
- }
12
- },
13
- label: ({ t })=>t('authentication:enableAPIKey')
14
- },
15
- {
16
- name: 'apiKey',
17
- type: 'text',
18
- admin: {
19
- components: {
20
- Field: false
21
- }
22
- },
23
- hooks: {
24
- afterRead: [
25
- decryptKey
26
- ],
27
- beforeChange: [
28
- encryptKey
29
- ]
30
- },
31
- label: ({ t })=>t('authentication:apiKey')
32
- },
33
- {
34
- name: 'apiKeyIndex',
35
- type: 'text',
36
- admin: {
37
- disabled: true
38
- },
39
- hidden: true,
40
- hooks: {
41
- beforeValidate: [
42
- ({ data, req, value })=>{
43
- if (data?.apiKey === false || data?.apiKey === null) {
44
- return null;
45
- }
46
- if (data?.enableAPIKey === false || data?.enableAPIKey === null) {
47
- return null;
48
- }
49
- if (data?.apiKey) {
50
- return crypto.createHmac('sha256', req.payload.secret).update(data.apiKey).digest('hex');
51
- }
52
- return value;
53
- }
54
- ]
55
- }
56
- }
57
- ];
58
-
59
- //# sourceMappingURL=apiKey.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/auth/baseFields/apiKey.ts"],"sourcesContent":["import crypto from 'crypto'\n\nimport type { Field, FieldHook } from '../../fields/config/types.js'\n\nconst encryptKey: FieldHook = ({ req, value }) =>\n value ? req.payload.encrypt(value as string) : null\nconst decryptKey: FieldHook = ({ req, value }) =>\n value ? req.payload.decrypt(value as string) : undefined\n\nexport const apiKeyFields = [\n {\n name: 'enableAPIKey',\n type: 'checkbox',\n admin: {\n components: {\n Field: false,\n },\n },\n label: ({ t }) => t('authentication:enableAPIKey'),\n },\n {\n name: 'apiKey',\n type: 'text',\n admin: {\n components: {\n Field: false,\n },\n },\n hooks: {\n afterRead: [decryptKey],\n beforeChange: [encryptKey],\n },\n label: ({ t }) => t('authentication:apiKey'),\n },\n {\n name: 'apiKeyIndex',\n type: 'text',\n admin: {\n disabled: true,\n },\n hidden: true,\n hooks: {\n beforeValidate: [\n ({ data, req, value }) => {\n if (data?.apiKey === false || data?.apiKey === null) {\n return null\n }\n if (data?.enableAPIKey === false || data?.enableAPIKey === null) {\n return null\n }\n if (data?.apiKey) {\n return crypto\n .createHmac('sha256', req.payload.secret)\n .update(data.apiKey as string)\n .digest('hex')\n }\n return value\n },\n ],\n },\n },\n] as Field[]\n"],"names":["crypto","encryptKey","req","value","payload","encrypt","decryptKey","decrypt","undefined","apiKeyFields","name","type","admin","components","Field","label","t","hooks","afterRead","beforeChange","disabled","hidden","beforeValidate","data","apiKey","enableAPIKey","createHmac","secret","update","digest"],"mappings":"AAAA,OAAOA,YAAY,SAAQ;AAI3B,MAAMC,aAAwB,CAAC,EAAEC,GAAG,EAAEC,KAAK,EAAE,GAC3CA,QAAQD,IAAIE,OAAO,CAACC,OAAO,CAACF,SAAmB;AACjD,MAAMG,aAAwB,CAAC,EAAEJ,GAAG,EAAEC,KAAK,EAAE,GAC3CA,QAAQD,IAAIE,OAAO,CAACG,OAAO,CAACJ,SAAmBK;AAEjD,OAAO,MAAMC,eAAe;IAC1B;QACEC,MAAM;QACNC,MAAM;QACNC,OAAO;YACLC,YAAY;gBACVC,OAAO;YACT;QACF;QACAC,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;IACtB;IACA;QACEN,MAAM;QACNC,MAAM;QACNC,OAAO;YACLC,YAAY;gBACVC,OAAO;YACT;QACF;QACAG,OAAO;YACLC,WAAW;gBAACZ;aAAW;YACvBa,cAAc;gBAAClB;aAAW;QAC5B;QACAc,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;IACtB;IACA;QACEN,MAAM;QACNC,MAAM;QACNC,OAAO;YACLQ,UAAU;QACZ;QACAC,QAAQ;QACRJ,OAAO;YACLK,gBAAgB;gBACd,CAAC,EAAEC,IAAI,EAAErB,GAAG,EAAEC,KAAK,EAAE;oBACnB,IAAIoB,MAAMC,WAAW,SAASD,MAAMC,WAAW,MAAM;wBACnD,OAAO;oBACT;oBACA,IAAID,MAAME,iBAAiB,SAASF,MAAME,iBAAiB,MAAM;wBAC/D,OAAO;oBACT;oBACA,IAAIF,MAAMC,QAAQ;wBAChB,OAAOxB,OACJ0B,UAAU,CAAC,UAAUxB,IAAIE,OAAO,CAACuB,MAAM,EACvCC,MAAM,CAACL,KAAKC,MAAM,EAClBK,MAAM,CAAC;oBACZ;oBACA,OAAO1B;gBACT;aACD;QACH;IACF;CACD,CAAW"}