@strapi/core 5.47.0 → 5.48.0

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 (79) hide show
  1. package/dist/Strapi.d.ts.map +1 -1
  2. package/dist/Strapi.js +12 -3
  3. package/dist/Strapi.js.map +1 -1
  4. package/dist/Strapi.mjs +12 -3
  5. package/dist/Strapi.mjs.map +1 -1
  6. package/dist/compile.d.ts.map +1 -1
  7. package/dist/compile.js +12 -5
  8. package/dist/compile.js.map +1 -1
  9. package/dist/compile.mjs +12 -5
  10. package/dist/compile.mjs.map +1 -1
  11. package/dist/configuration/index.d.ts +24 -0
  12. package/dist/configuration/index.d.ts.map +1 -1
  13. package/dist/configuration/index.js +47 -22
  14. package/dist/configuration/index.js.map +1 -1
  15. package/dist/configuration/index.mjs +47 -22
  16. package/dist/configuration/index.mjs.map +1 -1
  17. package/dist/middlewares/session.d.ts +2 -2
  18. package/dist/middlewares/session.d.ts.map +1 -1
  19. package/dist/middlewares/session.js +1 -1
  20. package/dist/middlewares/session.js.map +1 -1
  21. package/dist/middlewares/session.mjs +2 -2
  22. package/dist/middlewares/session.mjs.map +1 -1
  23. package/dist/package.json.js +16 -16
  24. package/dist/package.json.mjs +16 -16
  25. package/dist/providers/session-manager.d.ts.map +1 -1
  26. package/dist/providers/session-manager.js +3 -0
  27. package/dist/providers/session-manager.js.map +1 -1
  28. package/dist/providers/session-manager.mjs +3 -0
  29. package/dist/providers/session-manager.mjs.map +1 -1
  30. package/dist/services/cron.d.ts +1 -1
  31. package/dist/services/cron.d.ts.map +1 -1
  32. package/dist/services/cron.js +10 -2
  33. package/dist/services/cron.js.map +1 -1
  34. package/dist/services/cron.mjs +10 -2
  35. package/dist/services/cron.mjs.map +1 -1
  36. package/dist/services/document-service/draft-and-publish.d.ts +4 -4
  37. package/dist/services/document-service/internationalization.d.ts +4 -4
  38. package/dist/services/document-service/utils/unidirectional-relations.d.ts.map +1 -1
  39. package/dist/services/document-service/utils/unidirectional-relations.js +17 -4
  40. package/dist/services/document-service/utils/unidirectional-relations.js.map +1 -1
  41. package/dist/services/document-service/utils/unidirectional-relations.mjs +17 -4
  42. package/dist/services/document-service/utils/unidirectional-relations.mjs.map +1 -1
  43. package/dist/services/entity-validator/validators.d.ts.map +1 -1
  44. package/dist/services/entity-validator/validators.js +51 -2
  45. package/dist/services/entity-validator/validators.js.map +1 -1
  46. package/dist/services/entity-validator/validators.mjs +51 -2
  47. package/dist/services/entity-validator/validators.mjs.map +1 -1
  48. package/dist/services/mcp/index.d.ts.map +1 -1
  49. package/dist/services/mcp/index.js +3 -3
  50. package/dist/services/mcp/index.js.map +1 -1
  51. package/dist/services/mcp/index.mjs +3 -3
  52. package/dist/services/mcp/index.mjs.map +1 -1
  53. package/dist/services/metrics/index.d.ts.map +1 -1
  54. package/dist/services/metrics/index.js +6 -5
  55. package/dist/services/metrics/index.js.map +1 -1
  56. package/dist/services/metrics/index.mjs +6 -5
  57. package/dist/services/metrics/index.mjs.map +1 -1
  58. package/dist/services/metrics/sender.d.ts.map +1 -1
  59. package/dist/services/metrics/sender.js +11 -3
  60. package/dist/services/metrics/sender.js.map +1 -1
  61. package/dist/services/metrics/sender.mjs +11 -3
  62. package/dist/services/metrics/sender.mjs.map +1 -1
  63. package/dist/services/server/openapi.d.ts +3 -0
  64. package/dist/services/server/openapi.d.ts.map +1 -0
  65. package/dist/services/server/openapi.js +209 -0
  66. package/dist/services/server/openapi.js.map +1 -0
  67. package/dist/services/server/openapi.mjs +188 -0
  68. package/dist/services/server/openapi.mjs.map +1 -0
  69. package/dist/services/server/register-routes.d.ts.map +1 -1
  70. package/dist/services/server/register-routes.js +2 -0
  71. package/dist/services/server/register-routes.js.map +1 -1
  72. package/dist/services/server/register-routes.mjs +2 -0
  73. package/dist/services/server/register-routes.mjs.map +1 -1
  74. package/dist/utils/startup-logger.d.ts.map +1 -1
  75. package/dist/utils/startup-logger.js +18 -6
  76. package/dist/utils/startup-logger.js.map +1 -1
  77. package/dist/utils/startup-logger.mjs +18 -6
  78. package/dist/utils/startup-logger.mjs.map +1 -1
  79. package/package.json +16 -16
@@ -7,6 +7,45 @@ import { blocksValidator } from './blocks-validator.mjs';
7
7
  const num = Number(value);
8
8
  return Number.isFinite(num) ? num : undefined;
9
9
  };
10
+ const BIG_INTEGER_REGEX = /^[+-]?\d+$/;
11
+ const toBigIntegerString = (value)=>{
12
+ if (value == null) {
13
+ return undefined;
14
+ }
15
+ if (typeof value === 'bigint') {
16
+ return value.toString();
17
+ }
18
+ if (typeof value === 'number') {
19
+ if (!Number.isFinite(value) || !Number.isInteger(value)) {
20
+ return undefined;
21
+ }
22
+ return value.toString();
23
+ }
24
+ if (typeof value === 'string') {
25
+ const trimmedValue = value.trim();
26
+ if (!BIG_INTEGER_REGEX.test(trimmedValue)) {
27
+ return undefined;
28
+ }
29
+ return BigInt(trimmedValue).toString();
30
+ }
31
+ return undefined;
32
+ };
33
+ const isValidBigInteger = (value)=>toBigIntegerString(value) != null;
34
+ const isValidFiniteNumber = (value)=>typeof value === 'number' && Number.isFinite(value);
35
+ const isValidInteger = (value)=>isValidFiniteNumber(value) && Number.isInteger(value);
36
+ const shouldSkipUniqueValidation = (attrType, value)=>{
37
+ switch(attrType){
38
+ case 'integer':
39
+ return !isValidInteger(value);
40
+ case 'float':
41
+ case 'decimal':
42
+ return !isValidFiniteNumber(value);
43
+ case 'biginteger':
44
+ return !isValidBigInteger(value);
45
+ default:
46
+ return false;
47
+ }
48
+ };
10
49
  /**
11
50
  * Adds minLength validator
12
51
  */ const addMinLengthValidator = (validator, { attr }, { isDraft })=>{
@@ -189,6 +228,11 @@ const addUniqueValidator = (validator, { attr, model, updatedAttribute, entity,
189
228
  */ if (_.isNil(value) || value === '') {
190
229
  return true;
191
230
  }
231
+ // Skip unique checks for invalid scalar numeric values and let the type validator fail.
232
+ // This prevents malformed values from reaching the DB query layer when abortEarly=false.
233
+ if (shouldSkipUniqueValidation(attr.type, value)) {
234
+ return true;
235
+ }
192
236
  /**
193
237
  * We don't validate any unique constraint for draft entries.
194
238
  */ if (options.isDraft) {
@@ -271,14 +315,19 @@ const integerValidator = (metas, options)=>{
271
315
  return schema;
272
316
  };
273
317
  const floatValidator = (metas, options)=>{
274
- let schema = yup.number();
318
+ let schema = yup.number().test('is-finite-number', '${path} must be a finite number', (value)=>value == null || isValidFiniteNumber(value));
275
319
  schema = addMinFloatValidator(schema, metas, options);
276
320
  schema = addMaxFloatValidator(schema, metas);
277
321
  schema = addUniqueValidator(schema, metas, options);
278
322
  return schema;
279
323
  };
280
324
  const bigintegerValidator = (metas, options)=>{
281
- const schema = yup.mixed();
325
+ const schema = yup.mixed().transform((value, originalValue)=>toBigIntegerString(originalValue) ?? value).test('is-biginteger', '${path} must be a valid integer', (value)=>{
326
+ if (value == null) {
327
+ return true;
328
+ }
329
+ return isValidBigInteger(value);
330
+ });
282
331
  return addUniqueValidator(schema, metas, options);
283
332
  };
284
333
  const datesValidator = (metas, options)=>{
@@ -1 +1 @@
1
- {"version":3,"file":"validators.mjs","sources":["../../../src/services/entity-validator/validators.ts"],"sourcesContent":["/**\n * Validators check if the entry data meets specific criteria before saving or publishing.\n * (e.g., length, range, format).\n *\n * Drafts have limited validations (mainly max constraints),\n * while published content undergoes full validation.\n *\n * The system also takes locales into account when validating data.\n * E.g, unique fields must be unique within the same locale.\n */\nimport _ from 'lodash';\nimport { yup } from '@strapi/utils';\nimport type { Schema, Struct, Modules } from '@strapi/types';\nimport { blocksValidator } from './blocks-validator';\n\nimport type { ComponentContext } from '.';\n\nexport interface ValidatorMetas<\n TAttribute extends Schema.Attribute.AnyAttribute = Schema.Attribute.AnyAttribute,\n TValue extends Schema.Attribute.Value<TAttribute> = Schema.Attribute.Value<TAttribute>,\n> {\n attr: TAttribute;\n model: Struct.Schema;\n updatedAttribute: {\n name: string;\n value: TValue;\n };\n data: Record<string, unknown>;\n componentContext?: ComponentContext;\n entity?: Modules.EntityValidator.Entity;\n}\n\ninterface ValidatorOptions {\n isDraft: boolean;\n locale?: string;\n}\n\n/* Validator utils */\n\nconst toNumberSafe = (value: unknown): number | undefined => {\n if (value === undefined || value === null) return undefined;\n const num = Number(value);\n return Number.isFinite(num) ? num : undefined;\n};\n\n/**\n * Adds minLength validator\n */\nconst addMinLengthValidator = (\n validator: yup.StringSchema,\n {\n attr,\n }: {\n attr:\n | Schema.Attribute.String\n | Schema.Attribute.Text\n | Schema.Attribute.RichText\n | Schema.Attribute.Password\n | Schema.Attribute.Email\n | Schema.Attribute.UID;\n },\n { isDraft }: ValidatorOptions\n) => {\n return attr.minLength && _.isInteger(attr.minLength) && !isDraft\n ? validator.min(attr.minLength)\n : validator;\n};\n\n/**\n * Adds maxLength validator\n * @returns {StringSchema}\n */\nconst addMaxLengthValidator = (\n validator: yup.StringSchema,\n {\n attr,\n }: {\n attr:\n | Schema.Attribute.String\n | Schema.Attribute.Text\n | Schema.Attribute.RichText\n | Schema.Attribute.Password\n | Schema.Attribute.Email\n | Schema.Attribute.UID;\n }\n) => {\n return attr.maxLength && _.isInteger(attr.maxLength) ? validator.max(attr.maxLength) : validator;\n};\n\n/**\n * Adds min integer validator\n * @returns {NumberSchema}\n */\nconst addMinIntegerValidator = (\n validator: yup.NumberSchema,\n {\n attr,\n }: {\n attr: Schema.Attribute.Integer | Schema.Attribute.BigInteger;\n },\n { isDraft }: ValidatorOptions\n) => {\n const min = toNumberSafe(attr.min);\n return min !== undefined && !isDraft ? validator.min(_.toInteger(min)) : validator;\n};\n\n/**\n * Adds max integer validator\n */\nconst addMaxIntegerValidator = (\n validator: yup.NumberSchema,\n {\n attr,\n }: {\n attr: Schema.Attribute.Integer | Schema.Attribute.BigInteger;\n }\n) => {\n const max = toNumberSafe(attr.max);\n return max !== undefined ? validator.max(_.toInteger(max)) : validator;\n};\n\n/**\n * Adds min float/decimal validator\n */\nconst addMinFloatValidator = (\n validator: yup.NumberSchema,\n {\n attr,\n }: {\n attr: Schema.Attribute.Decimal | Schema.Attribute.Float;\n },\n { isDraft }: ValidatorOptions\n) => {\n const min = toNumberSafe(attr.min);\n return min !== undefined && !isDraft ? validator.min(min) : validator;\n};\n\n/**\n * Adds max float/decimal validator\n */\nconst addMaxFloatValidator = (\n validator: yup.NumberSchema,\n {\n attr,\n }: {\n attr: Schema.Attribute.Decimal | Schema.Attribute.Float;\n }\n) => {\n const max = toNumberSafe(attr.max);\n return max !== undefined ? validator.max(max) : validator;\n};\n\n/**\n * Adds regex validator\n */\nconst addStringRegexValidator = (\n validator: yup.StringSchema,\n {\n attr,\n }: {\n attr:\n | Schema.Attribute.String\n | Schema.Attribute.Text\n | Schema.Attribute.RichText\n | Schema.Attribute.Password\n | Schema.Attribute.Email\n | Schema.Attribute.UID;\n },\n { isDraft }: ValidatorOptions\n) => {\n return 'regex' in attr && !_.isUndefined(attr.regex) && !isDraft\n ? validator.matches(new RegExp(attr.regex), { excludeEmptyString: !attr.required })\n : validator;\n};\n\nconst addUniqueValidator = <T extends yup.AnySchema>(\n validator: T,\n {\n attr,\n model,\n updatedAttribute,\n entity,\n componentContext,\n }: ValidatorMetas<Schema.Attribute.AnyAttribute & Schema.Attribute.UniqueOption>,\n options: ValidatorOptions\n): T => {\n if (attr.type !== 'uid' && !attr.unique) {\n return validator;\n }\n\n const validateUniqueFieldWithinComponent = async (value: any): Promise<boolean> => {\n if (!componentContext) {\n return false;\n }\n\n // If we are validating a unique field within a repeatable component,\n // we first need to ensure that the repeatable in the current entity is\n // valid against itself.\n const hasRepeatableData = componentContext.repeatableData.length > 0;\n if (hasRepeatableData) {\n const { name: updatedName, value: updatedValue } = updatedAttribute;\n // Construct the full path to the unique field within the component.\n const pathToCheck = [...componentContext.pathToComponent.slice(1), updatedName].join('.');\n\n // Extract the values from the repeatable data using the constructed path\n const values = componentContext.repeatableData.map((item) => {\n return pathToCheck.split('.').reduce((acc, key) => acc[key], item as any);\n });\n\n // Check if the value is repeated in the current entity\n const isUpdatedAttributeRepeatedInThisEntity =\n values.filter((value) => value === updatedValue).length > 1;\n\n if (isUpdatedAttributeRepeatedInThisEntity) {\n return false;\n }\n }\n\n /**\n * When `componentContext` is present it means we are dealing with a unique\n * field within a component.\n *\n * The unique validation must consider the specific context of the\n * component, which will always be contained within a parent content type\n * and may also be nested within another component.\n *\n * We construct a query that takes into account the parent's model UID,\n * dimensions (such as draft and publish state/locale) and excludes the current\n * content type entity by its ID if provided.\n */\n const {\n model: parentModel,\n options: parentOptions,\n id: excludeId,\n } = componentContext.parentContent;\n\n const whereConditions: Record<string, any> = {};\n const isParentDraft = parentOptions && parentOptions.isDraft;\n\n whereConditions.publishedAt = isParentDraft ? null : { $notNull: true };\n\n if (parentOptions?.locale) {\n whereConditions.locale = parentOptions.locale;\n }\n\n if (excludeId && !Number.isNaN(excludeId)) {\n whereConditions.id = { $ne: excludeId };\n }\n\n const queryUid = parentModel.uid;\n const queryWhere = {\n ...componentContext.pathToComponent.reduceRight((acc, key) => ({ [key]: acc }), {\n [updatedAttribute.name]: value,\n }),\n\n ...whereConditions,\n };\n\n // The validation should pass if there is no other record found from the query\n return !(await strapi.db.query(queryUid).findOne({ where: queryWhere }));\n };\n\n const validateUniqueFieldWithinDynamicZoneComponent = async (\n startOfPath: string\n ): Promise<boolean> => {\n if (!componentContext) {\n return false;\n }\n\n const targetComponentUID = model.uid;\n // Ensure that the value is unique within the dynamic zone in this entity.\n const countOfValueInThisEntity = (componentContext?.fullDynamicZoneContent ?? []).reduce(\n (acc, component) => {\n if (component.__component !== targetComponentUID) {\n return acc;\n }\n\n const updatedValue = component[updatedAttribute.name];\n return updatedValue === updatedAttribute.value ? acc + 1 : acc;\n },\n 0\n );\n\n if (countOfValueInThisEntity > 1) {\n // If the value is repeated in the current entity, the validation fails.\n return false;\n }\n\n // Build a query for the parent content type to find all entities in the\n // same locale and publication state\n type QueryType = {\n select: string[];\n where: {\n published_at?: { $eq: null } | { $ne: null };\n id?: { $ne: number };\n locale?: string;\n };\n populate: {\n [key: string]: {\n on: {\n [key: string]: {\n select: string[];\n where: { [key: string]: string | number | boolean };\n };\n };\n };\n };\n };\n\n // Populate the dynamic zone for any components that share the same value\n // as the updated attribute.\n const query: QueryType = {\n select: ['id'],\n where: {},\n populate: {\n [startOfPath]: {\n on: {\n [targetComponentUID]: {\n select: ['id'],\n where: { [updatedAttribute.name]: updatedAttribute.value },\n },\n },\n },\n },\n };\n\n const { options, id } = componentContext.parentContent;\n\n if (options?.isDraft !== undefined) {\n query.where.published_at = options.isDraft ? { $eq: null } : { $ne: null };\n }\n\n if (id) {\n query.where.id = { $ne: id };\n }\n\n if (options?.locale) {\n query.where.locale = options.locale;\n }\n\n const parentModelQueryResult = await strapi.db\n .query(componentContext.parentContent.model.uid)\n .findMany(query);\n\n // Filter the results to only include results that have components in the\n // dynamic zone that match the target component type.\n const filteredResults = parentModelQueryResult\n .filter((result) => Array.isArray(result[startOfPath]) && result[startOfPath].length)\n .flatMap((result) => result[startOfPath])\n .filter((dynamicZoneComponent) => dynamicZoneComponent.__component === targetComponentUID);\n\n if (filteredResults.length >= 1) {\n return false;\n }\n\n return true;\n };\n\n return validator.test('unique', 'This attribute must be unique', async (value) => {\n /**\n * If the attribute value is `null` or an empty string we want to skip the unique validation.\n * Otherwise it'll only accept a single entry with that value in the database.\n */\n if (_.isNil(value) || value === '') {\n return true;\n }\n\n /**\n * We don't validate any unique constraint for draft entries.\n */\n if (options.isDraft) {\n return true;\n }\n\n const hasPathToComponent = componentContext && componentContext.pathToComponent.length > 0;\n if (hasPathToComponent) {\n // Detect if we are validating within a dynamiczone by checking if the first\n // path is a dynamiczone attribute in the parent content type.\n const startOfPath = componentContext.pathToComponent[0];\n const testingDZ =\n componentContext.parentContent.model.attributes[startOfPath].type === 'dynamiczone';\n\n if (testingDZ) {\n return validateUniqueFieldWithinDynamicZoneComponent(startOfPath);\n }\n\n return validateUniqueFieldWithinComponent(value);\n }\n\n /**\n * Here we are validating a scalar unique field from the content type's schema.\n * We construct a query to check if the value is unique\n * considering dimensions (e.g. locale, publication state) and excluding the current entity by its ID if available.\n */\n const scalarAttributeWhere: Record<string, any> = {\n [updatedAttribute.name]: value,\n publishedAt: { $notNull: true },\n };\n\n if (options?.locale) {\n scalarAttributeWhere.locale = options.locale;\n }\n\n if (entity?.id) {\n scalarAttributeWhere.id = { $ne: entity.id };\n }\n\n // The validation should pass if there is no other record found from the query\n return !(await strapi.db\n .query(model.uid)\n .findOne({ where: scalarAttributeWhere, select: ['id'] }));\n });\n};\n\n/* Type validators */\n\nconst stringValidator = (\n metas: ValidatorMetas<\n | Schema.Attribute.String\n | Schema.Attribute.Text\n | Schema.Attribute.RichText\n | Schema.Attribute.Password\n | Schema.Attribute.Email\n | Schema.Attribute.UID\n >,\n options: ValidatorOptions\n) => {\n let schema = yup.string().transform((val, originalVal) => originalVal);\n\n schema = addMinLengthValidator(schema, metas, options);\n schema = addMaxLengthValidator(schema, metas);\n schema = addStringRegexValidator(schema, metas, options);\n schema = addUniqueValidator(schema, metas, options);\n\n return schema;\n};\n\nexport const emailValidator = (\n metas: ValidatorMetas<Schema.Attribute.Email>,\n options: ValidatorOptions\n) => {\n const schema = stringValidator(metas, options);\n\n if (options.isDraft) {\n return schema;\n }\n\n return schema.email().min(\n 1,\n // eslint-disable-next-line no-template-curly-in-string\n '${path} cannot be empty'\n );\n};\n\nexport const uidValidator = (\n metas: ValidatorMetas<Schema.Attribute.UID>,\n options: ValidatorOptions\n) => {\n const schema = stringValidator(metas, options);\n\n if (options.isDraft) {\n return schema;\n }\n\n if (metas.attr.regex) {\n return schema.matches(new RegExp(metas.attr.regex));\n }\n\n return schema.matches(/^[A-Za-z0-9-_.~]*$/);\n};\n\nexport const enumerationValidator = ({ attr }: { attr: Schema.Attribute.Enumeration }) => {\n return yup\n .string()\n .oneOf((Array.isArray(attr.enum) ? attr.enum : [attr.enum]).concat(null as any));\n};\n\nexport const integerValidator = (\n metas: ValidatorMetas<Schema.Attribute.Integer | Schema.Attribute.BigInteger>,\n options: ValidatorOptions\n) => {\n let schema = yup.number().integer();\n\n schema = addMinIntegerValidator(schema, metas, options);\n schema = addMaxIntegerValidator(schema, metas);\n schema = addUniqueValidator(schema, metas, options);\n\n return schema;\n};\n\nexport const floatValidator = (\n metas: ValidatorMetas<Schema.Attribute.Decimal | Schema.Attribute.Float>,\n options: ValidatorOptions\n) => {\n let schema = yup.number();\n\n schema = addMinFloatValidator(schema, metas, options);\n schema = addMaxFloatValidator(schema, metas);\n schema = addUniqueValidator(schema, metas, options);\n\n return schema;\n};\n\nexport const bigintegerValidator = (\n metas: ValidatorMetas<Schema.Attribute.BigInteger>,\n options: ValidatorOptions\n) => {\n const schema = yup.mixed();\n return addUniqueValidator(schema, metas, options);\n};\n\nexport const datesValidator = (\n metas: ValidatorMetas<\n | Schema.Attribute.Date\n | Schema.Attribute.DateTime\n | Schema.Attribute.Time\n | Schema.Attribute.Timestamp\n >,\n options: ValidatorOptions\n) => {\n const schema = yup.mixed();\n return addUniqueValidator(schema, metas, options);\n};\n\nexport const Validators = {\n string: stringValidator,\n text: stringValidator,\n richtext: stringValidator,\n password: stringValidator,\n email: emailValidator,\n enumeration: enumerationValidator,\n boolean: () => yup.boolean().nullable(),\n uid: uidValidator,\n json: () => yup.mixed(),\n integer: integerValidator,\n biginteger: bigintegerValidator,\n float: floatValidator,\n decimal: floatValidator,\n date: datesValidator,\n time: datesValidator,\n datetime: datesValidator,\n timestamp: datesValidator,\n blocks: blocksValidator,\n};\n"],"names":["toNumberSafe","value","undefined","num","Number","isFinite","addMinLengthValidator","validator","attr","isDraft","minLength","_","isInteger","min","addMaxLengthValidator","maxLength","max","addMinIntegerValidator","toInteger","addMaxIntegerValidator","addMinFloatValidator","addMaxFloatValidator","addStringRegexValidator","isUndefined","regex","matches","RegExp","excludeEmptyString","required","addUniqueValidator","model","updatedAttribute","entity","componentContext","options","type","unique","validateUniqueFieldWithinComponent","hasRepeatableData","repeatableData","length","name","updatedName","updatedValue","pathToCheck","pathToComponent","slice","join","values","map","item","split","reduce","acc","key","isUpdatedAttributeRepeatedInThisEntity","filter","parentModel","parentOptions","id","excludeId","parentContent","whereConditions","isParentDraft","publishedAt","$notNull","locale","isNaN","$ne","queryUid","uid","queryWhere","reduceRight","strapi","db","query","findOne","where","validateUniqueFieldWithinDynamicZoneComponent","startOfPath","targetComponentUID","countOfValueInThisEntity","fullDynamicZoneContent","component","__component","select","populate","on","published_at","$eq","parentModelQueryResult","findMany","filteredResults","result","Array","isArray","flatMap","dynamicZoneComponent","test","isNil","hasPathToComponent","testingDZ","attributes","scalarAttributeWhere","stringValidator","metas","schema","yup","string","transform","val","originalVal","emailValidator","email","uidValidator","enumerationValidator","oneOf","enum","concat","integerValidator","number","integer","floatValidator","bigintegerValidator","mixed","datesValidator","Validators","text","richtext","password","enumeration","boolean","nullable","json","biginteger","float","decimal","date","time","datetime","timestamp","blocks","blocksValidator"],"mappings":"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"}
1
+ {"version":3,"file":"validators.mjs","sources":["../../../src/services/entity-validator/validators.ts"],"sourcesContent":["/**\n * Validators check if the entry data meets specific criteria before saving or publishing.\n * (e.g., length, range, format).\n *\n * Drafts have limited validations (mainly max constraints),\n * while published content undergoes full validation.\n *\n * The system also takes locales into account when validating data.\n * E.g, unique fields must be unique within the same locale.\n */\nimport _ from 'lodash';\nimport { yup } from '@strapi/utils';\nimport type { Schema, Struct, Modules } from '@strapi/types';\nimport { blocksValidator } from './blocks-validator';\n\nimport type { ComponentContext } from '.';\n\nexport interface ValidatorMetas<\n TAttribute extends Schema.Attribute.AnyAttribute = Schema.Attribute.AnyAttribute,\n TValue extends Schema.Attribute.Value<TAttribute> = Schema.Attribute.Value<TAttribute>,\n> {\n attr: TAttribute;\n model: Struct.Schema;\n updatedAttribute: {\n name: string;\n value: TValue;\n };\n data: Record<string, unknown>;\n componentContext?: ComponentContext;\n entity?: Modules.EntityValidator.Entity;\n}\n\ninterface ValidatorOptions {\n isDraft: boolean;\n locale?: string;\n}\n\n/* Validator utils */\n\nconst toNumberSafe = (value: unknown): number | undefined => {\n if (value === undefined || value === null) return undefined;\n const num = Number(value);\n return Number.isFinite(num) ? num : undefined;\n};\n\nconst BIG_INTEGER_REGEX = /^[+-]?\\d+$/;\n\nconst toBigIntegerString = (value: unknown): string | undefined => {\n if (value == null) {\n return undefined;\n }\n\n if (typeof value === 'bigint') {\n return value.toString();\n }\n\n if (typeof value === 'number') {\n if (!Number.isFinite(value) || !Number.isInteger(value)) {\n return undefined;\n }\n\n return value.toString();\n }\n\n if (typeof value === 'string') {\n const trimmedValue = value.trim();\n\n if (!BIG_INTEGER_REGEX.test(trimmedValue)) {\n return undefined;\n }\n\n return BigInt(trimmedValue).toString();\n }\n\n return undefined;\n};\n\nconst isValidBigInteger = (value: unknown): boolean => toBigIntegerString(value) != null;\n\nconst isValidFiniteNumber = (value: unknown): value is number =>\n typeof value === 'number' && Number.isFinite(value);\n\nconst isValidInteger = (value: unknown): value is number =>\n isValidFiniteNumber(value) && Number.isInteger(value);\n\nconst shouldSkipUniqueValidation = (\n attrType: Schema.Attribute.AnyAttribute['type'],\n value: unknown\n): boolean => {\n switch (attrType) {\n case 'integer':\n return !isValidInteger(value);\n case 'float':\n case 'decimal':\n return !isValidFiniteNumber(value);\n case 'biginteger':\n return !isValidBigInteger(value);\n default:\n return false;\n }\n};\n\n/**\n * Adds minLength validator\n */\nconst addMinLengthValidator = (\n validator: yup.StringSchema,\n {\n attr,\n }: {\n attr:\n | Schema.Attribute.String\n | Schema.Attribute.Text\n | Schema.Attribute.RichText\n | Schema.Attribute.Password\n | Schema.Attribute.Email\n | Schema.Attribute.UID;\n },\n { isDraft }: ValidatorOptions\n) => {\n return attr.minLength && _.isInteger(attr.minLength) && !isDraft\n ? validator.min(attr.minLength)\n : validator;\n};\n\n/**\n * Adds maxLength validator\n * @returns {StringSchema}\n */\nconst addMaxLengthValidator = (\n validator: yup.StringSchema,\n {\n attr,\n }: {\n attr:\n | Schema.Attribute.String\n | Schema.Attribute.Text\n | Schema.Attribute.RichText\n | Schema.Attribute.Password\n | Schema.Attribute.Email\n | Schema.Attribute.UID;\n }\n) => {\n return attr.maxLength && _.isInteger(attr.maxLength) ? validator.max(attr.maxLength) : validator;\n};\n\n/**\n * Adds min integer validator\n * @returns {NumberSchema}\n */\nconst addMinIntegerValidator = (\n validator: yup.NumberSchema,\n {\n attr,\n }: {\n attr: Schema.Attribute.Integer | Schema.Attribute.BigInteger;\n },\n { isDraft }: ValidatorOptions\n) => {\n const min = toNumberSafe(attr.min);\n return min !== undefined && !isDraft ? validator.min(_.toInteger(min)) : validator;\n};\n\n/**\n * Adds max integer validator\n */\nconst addMaxIntegerValidator = (\n validator: yup.NumberSchema,\n {\n attr,\n }: {\n attr: Schema.Attribute.Integer | Schema.Attribute.BigInteger;\n }\n) => {\n const max = toNumberSafe(attr.max);\n return max !== undefined ? validator.max(_.toInteger(max)) : validator;\n};\n\n/**\n * Adds min float/decimal validator\n */\nconst addMinFloatValidator = (\n validator: yup.NumberSchema,\n {\n attr,\n }: {\n attr: Schema.Attribute.Decimal | Schema.Attribute.Float;\n },\n { isDraft }: ValidatorOptions\n) => {\n const min = toNumberSafe(attr.min);\n return min !== undefined && !isDraft ? validator.min(min) : validator;\n};\n\n/**\n * Adds max float/decimal validator\n */\nconst addMaxFloatValidator = (\n validator: yup.NumberSchema,\n {\n attr,\n }: {\n attr: Schema.Attribute.Decimal | Schema.Attribute.Float;\n }\n) => {\n const max = toNumberSafe(attr.max);\n return max !== undefined ? validator.max(max) : validator;\n};\n\n/**\n * Adds regex validator\n */\nconst addStringRegexValidator = (\n validator: yup.StringSchema,\n {\n attr,\n }: {\n attr:\n | Schema.Attribute.String\n | Schema.Attribute.Text\n | Schema.Attribute.RichText\n | Schema.Attribute.Password\n | Schema.Attribute.Email\n | Schema.Attribute.UID;\n },\n { isDraft }: ValidatorOptions\n) => {\n return 'regex' in attr && !_.isUndefined(attr.regex) && !isDraft\n ? validator.matches(new RegExp(attr.regex), { excludeEmptyString: !attr.required })\n : validator;\n};\n\nconst addUniqueValidator = <T extends yup.AnySchema>(\n validator: T,\n {\n attr,\n model,\n updatedAttribute,\n entity,\n componentContext,\n }: ValidatorMetas<Schema.Attribute.AnyAttribute & Schema.Attribute.UniqueOption>,\n options: ValidatorOptions\n): T => {\n if (attr.type !== 'uid' && !attr.unique) {\n return validator;\n }\n\n const validateUniqueFieldWithinComponent = async (value: any): Promise<boolean> => {\n if (!componentContext) {\n return false;\n }\n\n // If we are validating a unique field within a repeatable component,\n // we first need to ensure that the repeatable in the current entity is\n // valid against itself.\n const hasRepeatableData = componentContext.repeatableData.length > 0;\n if (hasRepeatableData) {\n const { name: updatedName, value: updatedValue } = updatedAttribute;\n // Construct the full path to the unique field within the component.\n const pathToCheck = [...componentContext.pathToComponent.slice(1), updatedName].join('.');\n\n // Extract the values from the repeatable data using the constructed path\n const values = componentContext.repeatableData.map((item) => {\n return pathToCheck.split('.').reduce((acc, key) => acc[key], item as any);\n });\n\n // Check if the value is repeated in the current entity\n const isUpdatedAttributeRepeatedInThisEntity =\n values.filter((value) => value === updatedValue).length > 1;\n\n if (isUpdatedAttributeRepeatedInThisEntity) {\n return false;\n }\n }\n\n /**\n * When `componentContext` is present it means we are dealing with a unique\n * field within a component.\n *\n * The unique validation must consider the specific context of the\n * component, which will always be contained within a parent content type\n * and may also be nested within another component.\n *\n * We construct a query that takes into account the parent's model UID,\n * dimensions (such as draft and publish state/locale) and excludes the current\n * content type entity by its ID if provided.\n */\n const {\n model: parentModel,\n options: parentOptions,\n id: excludeId,\n } = componentContext.parentContent;\n\n const whereConditions: Record<string, any> = {};\n const isParentDraft = parentOptions && parentOptions.isDraft;\n\n whereConditions.publishedAt = isParentDraft ? null : { $notNull: true };\n\n if (parentOptions?.locale) {\n whereConditions.locale = parentOptions.locale;\n }\n\n if (excludeId && !Number.isNaN(excludeId)) {\n whereConditions.id = { $ne: excludeId };\n }\n\n const queryUid = parentModel.uid;\n const queryWhere = {\n ...componentContext.pathToComponent.reduceRight((acc, key) => ({ [key]: acc }), {\n [updatedAttribute.name]: value,\n }),\n\n ...whereConditions,\n };\n\n // The validation should pass if there is no other record found from the query\n return !(await strapi.db.query(queryUid).findOne({ where: queryWhere }));\n };\n\n const validateUniqueFieldWithinDynamicZoneComponent = async (\n startOfPath: string\n ): Promise<boolean> => {\n if (!componentContext) {\n return false;\n }\n\n const targetComponentUID = model.uid;\n // Ensure that the value is unique within the dynamic zone in this entity.\n const countOfValueInThisEntity = (componentContext?.fullDynamicZoneContent ?? []).reduce(\n (acc, component) => {\n if (component.__component !== targetComponentUID) {\n return acc;\n }\n\n const updatedValue = component[updatedAttribute.name];\n return updatedValue === updatedAttribute.value ? acc + 1 : acc;\n },\n 0\n );\n\n if (countOfValueInThisEntity > 1) {\n // If the value is repeated in the current entity, the validation fails.\n return false;\n }\n\n // Build a query for the parent content type to find all entities in the\n // same locale and publication state\n type QueryType = {\n select: string[];\n where: {\n published_at?: { $eq: null } | { $ne: null };\n id?: { $ne: number };\n locale?: string;\n };\n populate: {\n [key: string]: {\n on: {\n [key: string]: {\n select: string[];\n where: { [key: string]: string | number | boolean };\n };\n };\n };\n };\n };\n\n // Populate the dynamic zone for any components that share the same value\n // as the updated attribute.\n const query: QueryType = {\n select: ['id'],\n where: {},\n populate: {\n [startOfPath]: {\n on: {\n [targetComponentUID]: {\n select: ['id'],\n where: { [updatedAttribute.name]: updatedAttribute.value },\n },\n },\n },\n },\n };\n\n const { options, id } = componentContext.parentContent;\n\n if (options?.isDraft !== undefined) {\n query.where.published_at = options.isDraft ? { $eq: null } : { $ne: null };\n }\n\n if (id) {\n query.where.id = { $ne: id };\n }\n\n if (options?.locale) {\n query.where.locale = options.locale;\n }\n\n const parentModelQueryResult = await strapi.db\n .query(componentContext.parentContent.model.uid)\n .findMany(query);\n\n // Filter the results to only include results that have components in the\n // dynamic zone that match the target component type.\n const filteredResults = parentModelQueryResult\n .filter((result) => Array.isArray(result[startOfPath]) && result[startOfPath].length)\n .flatMap((result) => result[startOfPath])\n .filter((dynamicZoneComponent) => dynamicZoneComponent.__component === targetComponentUID);\n\n if (filteredResults.length >= 1) {\n return false;\n }\n\n return true;\n };\n\n return validator.test('unique', 'This attribute must be unique', async (value) => {\n /**\n * If the attribute value is `null` or an empty string we want to skip the unique validation.\n * Otherwise it'll only accept a single entry with that value in the database.\n */\n if (_.isNil(value) || value === '') {\n return true;\n }\n\n // Skip unique checks for invalid scalar numeric values and let the type validator fail.\n // This prevents malformed values from reaching the DB query layer when abortEarly=false.\n if (shouldSkipUniqueValidation(attr.type, value)) {\n return true;\n }\n\n /**\n * We don't validate any unique constraint for draft entries.\n */\n if (options.isDraft) {\n return true;\n }\n\n const hasPathToComponent = componentContext && componentContext.pathToComponent.length > 0;\n if (hasPathToComponent) {\n // Detect if we are validating within a dynamiczone by checking if the first\n // path is a dynamiczone attribute in the parent content type.\n const startOfPath = componentContext.pathToComponent[0];\n const testingDZ =\n componentContext.parentContent.model.attributes[startOfPath].type === 'dynamiczone';\n\n if (testingDZ) {\n return validateUniqueFieldWithinDynamicZoneComponent(startOfPath);\n }\n\n return validateUniqueFieldWithinComponent(value);\n }\n\n /**\n * Here we are validating a scalar unique field from the content type's schema.\n * We construct a query to check if the value is unique\n * considering dimensions (e.g. locale, publication state) and excluding the current entity by its ID if available.\n */\n const scalarAttributeWhere: Record<string, any> = {\n [updatedAttribute.name]: value,\n publishedAt: { $notNull: true },\n };\n\n if (options?.locale) {\n scalarAttributeWhere.locale = options.locale;\n }\n\n if (entity?.id) {\n scalarAttributeWhere.id = { $ne: entity.id };\n }\n\n // The validation should pass if there is no other record found from the query\n return !(await strapi.db\n .query(model.uid)\n .findOne({ where: scalarAttributeWhere, select: ['id'] }));\n });\n};\n\n/* Type validators */\n\nconst stringValidator = (\n metas: ValidatorMetas<\n | Schema.Attribute.String\n | Schema.Attribute.Text\n | Schema.Attribute.RichText\n | Schema.Attribute.Password\n | Schema.Attribute.Email\n | Schema.Attribute.UID\n >,\n options: ValidatorOptions\n) => {\n let schema = yup.string().transform((val, originalVal) => originalVal);\n\n schema = addMinLengthValidator(schema, metas, options);\n schema = addMaxLengthValidator(schema, metas);\n schema = addStringRegexValidator(schema, metas, options);\n schema = addUniqueValidator(schema, metas, options);\n\n return schema;\n};\n\nexport const emailValidator = (\n metas: ValidatorMetas<Schema.Attribute.Email>,\n options: ValidatorOptions\n) => {\n const schema = stringValidator(metas, options);\n\n if (options.isDraft) {\n return schema;\n }\n\n return schema.email().min(\n 1,\n // eslint-disable-next-line no-template-curly-in-string\n '${path} cannot be empty'\n );\n};\n\nexport const uidValidator = (\n metas: ValidatorMetas<Schema.Attribute.UID>,\n options: ValidatorOptions\n) => {\n const schema = stringValidator(metas, options);\n\n if (options.isDraft) {\n return schema;\n }\n\n if (metas.attr.regex) {\n return schema.matches(new RegExp(metas.attr.regex));\n }\n\n return schema.matches(/^[A-Za-z0-9-_.~]*$/);\n};\n\nexport const enumerationValidator = ({ attr }: { attr: Schema.Attribute.Enumeration }) => {\n return yup\n .string()\n .oneOf((Array.isArray(attr.enum) ? attr.enum : [attr.enum]).concat(null as any));\n};\n\nexport const integerValidator = (\n metas: ValidatorMetas<Schema.Attribute.Integer | Schema.Attribute.BigInteger>,\n options: ValidatorOptions\n) => {\n let schema = yup.number().integer();\n\n schema = addMinIntegerValidator(schema, metas, options);\n schema = addMaxIntegerValidator(schema, metas);\n schema = addUniqueValidator(schema, metas, options);\n\n return schema;\n};\n\nexport const floatValidator = (\n metas: ValidatorMetas<Schema.Attribute.Decimal | Schema.Attribute.Float>,\n options: ValidatorOptions\n) => {\n let schema = yup\n .number()\n .test(\n 'is-finite-number',\n '${path} must be a finite number',\n (value) => value == null || isValidFiniteNumber(value)\n );\n\n schema = addMinFloatValidator(schema, metas, options);\n schema = addMaxFloatValidator(schema, metas);\n schema = addUniqueValidator(schema, metas, options);\n\n return schema;\n};\n\nexport const bigintegerValidator = (\n metas: ValidatorMetas<Schema.Attribute.BigInteger>,\n options: ValidatorOptions\n) => {\n const schema = yup\n .mixed()\n .transform((value, originalValue) => toBigIntegerString(originalValue) ?? value)\n .test('is-biginteger', '${path} must be a valid integer', (value) => {\n if (value == null) {\n return true;\n }\n\n return isValidBigInteger(value);\n });\n\n return addUniqueValidator(schema, metas, options);\n};\n\nexport const datesValidator = (\n metas: ValidatorMetas<\n | Schema.Attribute.Date\n | Schema.Attribute.DateTime\n | Schema.Attribute.Time\n | Schema.Attribute.Timestamp\n >,\n options: ValidatorOptions\n) => {\n const schema = yup.mixed();\n return addUniqueValidator(schema, metas, options);\n};\n\nexport const Validators = {\n string: stringValidator,\n text: stringValidator,\n richtext: stringValidator,\n password: stringValidator,\n email: emailValidator,\n enumeration: enumerationValidator,\n boolean: () => yup.boolean().nullable(),\n uid: uidValidator,\n json: () => yup.mixed(),\n integer: integerValidator,\n biginteger: bigintegerValidator,\n float: floatValidator,\n decimal: floatValidator,\n date: datesValidator,\n time: datesValidator,\n datetime: datesValidator,\n timestamp: datesValidator,\n blocks: blocksValidator,\n};\n"],"names":["toNumberSafe","value","undefined","num","Number","isFinite","BIG_INTEGER_REGEX","toBigIntegerString","toString","isInteger","trimmedValue","trim","test","BigInt","isValidBigInteger","isValidFiniteNumber","isValidInteger","shouldSkipUniqueValidation","attrType","addMinLengthValidator","validator","attr","isDraft","minLength","_","min","addMaxLengthValidator","maxLength","max","addMinIntegerValidator","toInteger","addMaxIntegerValidator","addMinFloatValidator","addMaxFloatValidator","addStringRegexValidator","isUndefined","regex","matches","RegExp","excludeEmptyString","required","addUniqueValidator","model","updatedAttribute","entity","componentContext","options","type","unique","validateUniqueFieldWithinComponent","hasRepeatableData","repeatableData","length","name","updatedName","updatedValue","pathToCheck","pathToComponent","slice","join","values","map","item","split","reduce","acc","key","isUpdatedAttributeRepeatedInThisEntity","filter","parentModel","parentOptions","id","excludeId","parentContent","whereConditions","isParentDraft","publishedAt","$notNull","locale","isNaN","$ne","queryUid","uid","queryWhere","reduceRight","strapi","db","query","findOne","where","validateUniqueFieldWithinDynamicZoneComponent","startOfPath","targetComponentUID","countOfValueInThisEntity","fullDynamicZoneContent","component","__component","select","populate","on","published_at","$eq","parentModelQueryResult","findMany","filteredResults","result","Array","isArray","flatMap","dynamicZoneComponent","isNil","hasPathToComponent","testingDZ","attributes","scalarAttributeWhere","stringValidator","metas","schema","yup","string","transform","val","originalVal","emailValidator","email","uidValidator","enumerationValidator","oneOf","enum","concat","integerValidator","number","integer","floatValidator","bigintegerValidator","mixed","originalValue","datesValidator","Validators","text","richtext","password","enumeration","boolean","nullable","json","biginteger","float","decimal","date","time","datetime","timestamp","blocks","blocksValidator"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAYnD;;GAEG;AACH,eAAO,MAAM,gBAAgB,WAAY,KAAK,MAAM,KAAG,QAAQ,GAAG,CAAC,UAsHlE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAYnD;;GAEG;AACH,eAAO,MAAM,gBAAgB,WAAY,KAAK,MAAM,KAAG,QAAQ,GAAG,CAAC,UAgHlE,CAAC"}
@@ -45,19 +45,19 @@ var log = require('./tools/log.js');
45
45
  },
46
46
  registerTool (tool) {
47
47
  if (serverStatus !== 'idle') {
48
- throw new Error('[MCP] Tools must be registered before MCP server starts. Register during plugin register().');
48
+ throw new Error('[MCP] Cannot register tools after the MCP server has started.');
49
49
  }
50
50
  toolDefinitions.define(tool);
51
51
  },
52
52
  registerPrompt (prompt) {
53
53
  if (serverStatus !== 'idle') {
54
- throw new Error('[MCP] Prompts must be registered before MCP server starts. Register during plugin register().');
54
+ throw new Error('[MCP] Cannot register prompts after the MCP server has started.');
55
55
  }
56
56
  promptDefinitions.define(prompt);
57
57
  },
58
58
  registerResource (resource) {
59
59
  if (serverStatus !== 'idle') {
60
- throw new Error('[MCP] Resources must be registered before MCP server starts. Register during plugin register().');
60
+ throw new Error('[MCP] Cannot register resources after the MCP server has started.');
61
61
  }
62
62
  resourceDefinitions.define(resource);
63
63
  },
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/services/mcp/index.ts"],"sourcesContent":["import type { Core, Modules } from '@strapi/types';\nimport { createMcpAdminTokenAuthenticator } from './authentication';\nimport { createPostHandler } from './handlers/handlePost';\nimport type { McpHandlerDependencies } from './handlers/types';\nimport { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry';\nimport { McpConfiguration } from './internal/McpConfiguration';\nimport { createMcpServerWithRegistries } from './internal/McpServerFactory';\nimport { createOAuthDiscoveryFallbackMiddleware } from './middleware/oauthDiscoveryFallback';\nimport { createMcpRoutes } from './routes';\nimport { sendDidStartMcpServer } from './metrics/metrics';\nimport { logToolDefinition } from './tools/log';\n\n/**\n * Creates an MCP service instance for Strapi Core\n */\nexport const createMcpService = (strapi: Core.Strapi): Modules.MCP.McpService => {\n // Initialize configuration\n const config = new McpConfiguration(strapi);\n\n const authenticationStrategy = createMcpAdminTokenAuthenticator(strapi);\n\n // Status tracking\n let serverStatus: Modules.MCP.McpServiceStatus = 'idle';\n\n // Definition registries\n const toolDefinitions = new McpCapabilityDefinitionRegistry<\n 'tool',\n Modules.MCP.McpToolDefinition\n >('tool');\n\n const promptDefinitions = new McpCapabilityDefinitionRegistry<\n 'prompt',\n Modules.MCP.McpPromptDefinition\n >('prompt');\n\n const resourceDefinitions = new McpCapabilityDefinitionRegistry<\n 'resource',\n Modules.MCP.McpResourceDefinition\n >('resource');\n\n // Prepare handler dependencies\n const handlerDependencies: McpHandlerDependencies = {\n strapi,\n authenticationStrategy,\n config,\n createServerWithRegistries: createMcpServerWithRegistries,\n capabilityDefinitions: {\n tools: toolDefinitions,\n prompts: promptDefinitions,\n resources: resourceDefinitions,\n },\n };\n\n // Create HTTP handlers\n const handlePost = createPostHandler(handlerDependencies);\n\n const service: Modules.MCP.McpService = {\n isEnabled() {\n return config.isEnabled();\n },\n\n isRunning() {\n return serverStatus === 'running';\n },\n\n registerTool(tool: Modules.MCP.McpToolDefinition) {\n if (serverStatus !== 'idle') {\n throw new Error(\n '[MCP] Tools must be registered before MCP server starts. Register during plugin register().'\n );\n }\n\n toolDefinitions.define(tool);\n },\n\n registerPrompt(prompt) {\n if (serverStatus !== 'idle') {\n throw new Error(\n '[MCP] Prompts must be registered before MCP server starts. Register during plugin register().'\n );\n }\n promptDefinitions.define(prompt);\n },\n\n registerResource(resource) {\n if (serverStatus !== 'idle') {\n throw new Error(\n '[MCP] Resources must be registered before MCP server starts. Register during plugin register().'\n );\n }\n resourceDefinitions.define(resource);\n },\n\n async start() {\n if (service.isEnabled() === false) {\n strapi.log.debug('[MCP] Server is disabled');\n return;\n }\n if (serverStatus === 'error') {\n throw new Error('[MCP] Cannot start server: previous error state');\n }\n if (serverStatus !== 'idle') {\n throw new Error(`[MCP] Server already started or starting (status: ${serverStatus})`);\n }\n serverStatus = 'starting';\n\n strapi.server.use(createOAuthDiscoveryFallbackMiddleware());\n\n const routes = createMcpRoutes(config, { handlePost });\n strapi.server.routes(routes);\n\n serverStatus = 'running';\n\n sendDidStartMcpServer(strapi, {\n path: config.path,\n numberOfTools: toolDefinitions.size,\n numberOfPrompts: promptDefinitions.size,\n numberOfResources: resourceDefinitions.size,\n });\n\n const baseUrl = strapi.config.get('server.url', 'http://localhost:1337');\n strapi.log.info(`[MCP] Server available at ${baseUrl}${config.path}`);\n },\n\n async stop() {\n serverStatus = 'idle';\n strapi.log.info('[MCP] Service stopped');\n },\n };\n\n service.registerTool(logToolDefinition);\n\n return service;\n};\n"],"names":["createMcpService","strapi","config","McpConfiguration","authenticationStrategy","createMcpAdminTokenAuthenticator","serverStatus","toolDefinitions","McpCapabilityDefinitionRegistry","promptDefinitions","resourceDefinitions","handlerDependencies","createServerWithRegistries","createMcpServerWithRegistries","capabilityDefinitions","tools","prompts","resources","handlePost","createPostHandler","service","isEnabled","isRunning","registerTool","tool","Error","define","registerPrompt","prompt","registerResource","resource","start","log","debug","server","use","createOAuthDiscoveryFallbackMiddleware","routes","createMcpRoutes","sendDidStartMcpServer","path","numberOfTools","size","numberOfPrompts","numberOfResources","baseUrl","get","info","stop","logToolDefinition"],"mappings":";;;;;;;;;;;;AAYA;;IAGO,MAAMA,gBAAAA,GAAmB,CAACC,MAAAA,GAAAA;;IAE/B,MAAMC,MAAAA,GAAS,IAAIC,iCAAAA,CAAiBF,MAAAA,CAAAA;AAEpC,IAAA,MAAMG,yBAAyBC,+CAAAA,CAAiCJ,MAAAA,CAAAA;;AAGhE,IAAA,IAAIK,YAAAA,GAA6C,MAAA;;IAGjD,MAAMC,eAAAA,GAAkB,IAAIC,+DAAAA,CAG1B,MAAA,CAAA;IAEF,MAAMC,iBAAAA,GAAoB,IAAID,+DAAAA,CAG5B,QAAA,CAAA;IAEF,MAAME,mBAAAA,GAAsB,IAAIF,+DAAAA,CAG9B,UAAA,CAAA;;AAGF,IAAA,MAAMG,mBAAAA,GAA8C;AAClDV,QAAAA,MAAAA;AACAG,QAAAA,sBAAAA;AACAF,QAAAA,MAAAA;QACAU,0BAAAA,EAA4BC,8CAAAA;QAC5BC,qBAAAA,EAAuB;YACrBC,KAAAA,EAAOR,eAAAA;YACPS,OAAAA,EAASP,iBAAAA;YACTQ,SAAAA,EAAWP;AACb;AACF,KAAA;;AAGA,IAAA,MAAMQ,eAAaC,4BAAAA,CAAkBR,mBAAAA,CAAAA;AAErC,IAAA,MAAMS,OAAAA,GAAkC;AACtCC,QAAAA,SAAAA,CAAAA,GAAAA;AACE,YAAA,OAAOnB,OAAOmB,SAAS,EAAA;AACzB,QAAA,CAAA;AAEAC,QAAAA,SAAAA,CAAAA,GAAAA;AACE,YAAA,OAAOhB,YAAAA,KAAiB,SAAA;AAC1B,QAAA,CAAA;AAEAiB,QAAAA,YAAAA,CAAAA,CAAaC,IAAmC,EAAA;AAC9C,YAAA,IAAIlB,iBAAiB,MAAA,EAAQ;AAC3B,gBAAA,MAAM,IAAImB,KAAAA,CACR,6FAAA,CAAA;AAEJ,YAAA;AAEAlB,YAAAA,eAAAA,CAAgBmB,MAAM,CAACF,IAAAA,CAAAA;AACzB,QAAA,CAAA;AAEAG,QAAAA,cAAAA,CAAAA,CAAeC,MAAM,EAAA;AACnB,YAAA,IAAItB,iBAAiB,MAAA,EAAQ;AAC3B,gBAAA,MAAM,IAAImB,KAAAA,CACR,+FAAA,CAAA;AAEJ,YAAA;AACAhB,YAAAA,iBAAAA,CAAkBiB,MAAM,CAACE,MAAAA,CAAAA;AAC3B,QAAA,CAAA;AAEAC,QAAAA,gBAAAA,CAAAA,CAAiBC,QAAQ,EAAA;AACvB,YAAA,IAAIxB,iBAAiB,MAAA,EAAQ;AAC3B,gBAAA,MAAM,IAAImB,KAAAA,CACR,iGAAA,CAAA;AAEJ,YAAA;AACAf,YAAAA,mBAAAA,CAAoBgB,MAAM,CAACI,QAAAA,CAAAA;AAC7B,QAAA,CAAA;QAEA,MAAMC,KAAAA,CAAAA,GAAAA;YACJ,IAAIX,OAAAA,CAAQC,SAAS,EAAA,KAAO,KAAA,EAAO;gBACjCpB,MAAAA,CAAO+B,GAAG,CAACC,KAAK,CAAC,0BAAA,CAAA;AACjB,gBAAA;AACF,YAAA;AACA,YAAA,IAAI3B,iBAAiB,OAAA,EAAS;AAC5B,gBAAA,MAAM,IAAImB,KAAAA,CAAM,iDAAA,CAAA;AAClB,YAAA;AACA,YAAA,IAAInB,iBAAiB,MAAA,EAAQ;AAC3B,gBAAA,MAAM,IAAImB,KAAAA,CAAM,CAAC,kDAAkD,EAAEnB,YAAAA,CAAa,CAAC,CAAC,CAAA;AACtF,YAAA;YACAA,YAAAA,GAAe,UAAA;YAEfL,MAAAA,CAAOiC,MAAM,CAACC,GAAG,CAACC,6DAAAA,EAAAA,CAAAA;YAElB,MAAMC,QAAAA,GAASC,uBAAgBpC,MAAAA,EAAQ;AAAEgB,4BAAAA;AAAW,aAAA,CAAA;YACpDjB,MAAAA,CAAOiC,MAAM,CAACG,MAAM,CAACA,QAAAA,CAAAA;YAErB/B,YAAAA,GAAe,SAAA;AAEfiC,YAAAA,6BAAAA,CAAsBtC,MAAAA,EAAQ;AAC5BuC,gBAAAA,IAAAA,EAAMtC,OAAOsC,IAAI;AACjBC,gBAAAA,aAAAA,EAAelC,gBAAgBmC,IAAI;AACnCC,gBAAAA,eAAAA,EAAiBlC,kBAAkBiC,IAAI;AACvCE,gBAAAA,iBAAAA,EAAmBlC,oBAAoBgC;AACzC,aAAA,CAAA;AAEA,YAAA,MAAMG,UAAU5C,MAAAA,CAAOC,MAAM,CAAC4C,GAAG,CAAC,YAAA,EAAc,uBAAA,CAAA;YAChD7C,MAAAA,CAAO+B,GAAG,CAACe,IAAI,CAAC,CAAC,0BAA0B,EAAEF,OAAAA,CAAAA,EAAU3C,MAAAA,CAAOsC,IAAI,CAAA,CAAE,CAAA;AACtE,QAAA,CAAA;QAEA,MAAMQ,IAAAA,CAAAA,GAAAA;YACJ1C,YAAAA,GAAe,MAAA;YACfL,MAAAA,CAAO+B,GAAG,CAACe,IAAI,CAAC,uBAAA,CAAA;AAClB,QAAA;AACF,KAAA;AAEA3B,IAAAA,OAAAA,CAAQG,YAAY,CAAC0B,qBAAAA,CAAAA;IAErB,OAAO7B,OAAAA;AACT;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/services/mcp/index.ts"],"sourcesContent":["import type { Core, Modules } from '@strapi/types';\nimport { createMcpAdminTokenAuthenticator } from './authentication';\nimport { createPostHandler } from './handlers/handlePost';\nimport type { McpHandlerDependencies } from './handlers/types';\nimport { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry';\nimport { McpConfiguration } from './internal/McpConfiguration';\nimport { createMcpServerWithRegistries } from './internal/McpServerFactory';\nimport { createOAuthDiscoveryFallbackMiddleware } from './middleware/oauthDiscoveryFallback';\nimport { createMcpRoutes } from './routes';\nimport { sendDidStartMcpServer } from './metrics/metrics';\nimport { logToolDefinition } from './tools/log';\n\n/**\n * Creates an MCP service instance for Strapi Core\n */\nexport const createMcpService = (strapi: Core.Strapi): Modules.MCP.McpService => {\n // Initialize configuration\n const config = new McpConfiguration(strapi);\n\n const authenticationStrategy = createMcpAdminTokenAuthenticator(strapi);\n\n // Status tracking\n let serverStatus: Modules.MCP.McpServiceStatus = 'idle';\n\n // Definition registries\n const toolDefinitions = new McpCapabilityDefinitionRegistry<\n 'tool',\n Modules.MCP.McpToolDefinition\n >('tool');\n\n const promptDefinitions = new McpCapabilityDefinitionRegistry<\n 'prompt',\n Modules.MCP.McpPromptDefinition\n >('prompt');\n\n const resourceDefinitions = new McpCapabilityDefinitionRegistry<\n 'resource',\n Modules.MCP.McpResourceDefinition\n >('resource');\n\n // Prepare handler dependencies\n const handlerDependencies: McpHandlerDependencies = {\n strapi,\n authenticationStrategy,\n config,\n createServerWithRegistries: createMcpServerWithRegistries,\n capabilityDefinitions: {\n tools: toolDefinitions,\n prompts: promptDefinitions,\n resources: resourceDefinitions,\n },\n };\n\n // Create HTTP handlers\n const handlePost = createPostHandler(handlerDependencies);\n\n const service: Modules.MCP.McpService = {\n isEnabled() {\n return config.isEnabled();\n },\n\n isRunning() {\n return serverStatus === 'running';\n },\n\n registerTool(tool: Modules.MCP.McpToolDefinition) {\n if (serverStatus !== 'idle') {\n throw new Error('[MCP] Cannot register tools after the MCP server has started.');\n }\n\n toolDefinitions.define(tool);\n },\n\n registerPrompt(prompt) {\n if (serverStatus !== 'idle') {\n throw new Error('[MCP] Cannot register prompts after the MCP server has started.');\n }\n promptDefinitions.define(prompt);\n },\n\n registerResource(resource) {\n if (serverStatus !== 'idle') {\n throw new Error('[MCP] Cannot register resources after the MCP server has started.');\n }\n resourceDefinitions.define(resource);\n },\n\n async start() {\n if (service.isEnabled() === false) {\n strapi.log.debug('[MCP] Server is disabled');\n return;\n }\n if (serverStatus === 'error') {\n throw new Error('[MCP] Cannot start server: previous error state');\n }\n if (serverStatus !== 'idle') {\n throw new Error(`[MCP] Server already started or starting (status: ${serverStatus})`);\n }\n serverStatus = 'starting';\n\n strapi.server.use(createOAuthDiscoveryFallbackMiddleware());\n\n const routes = createMcpRoutes(config, { handlePost });\n strapi.server.routes(routes);\n\n serverStatus = 'running';\n\n sendDidStartMcpServer(strapi, {\n path: config.path,\n numberOfTools: toolDefinitions.size,\n numberOfPrompts: promptDefinitions.size,\n numberOfResources: resourceDefinitions.size,\n });\n\n const baseUrl = strapi.config.get('server.url', 'http://localhost:1337');\n strapi.log.info(`[MCP] Server available at ${baseUrl}${config.path}`);\n },\n\n async stop() {\n serverStatus = 'idle';\n strapi.log.info('[MCP] Service stopped');\n },\n };\n\n service.registerTool(logToolDefinition);\n\n return service;\n};\n"],"names":["createMcpService","strapi","config","McpConfiguration","authenticationStrategy","createMcpAdminTokenAuthenticator","serverStatus","toolDefinitions","McpCapabilityDefinitionRegistry","promptDefinitions","resourceDefinitions","handlerDependencies","createServerWithRegistries","createMcpServerWithRegistries","capabilityDefinitions","tools","prompts","resources","handlePost","createPostHandler","service","isEnabled","isRunning","registerTool","tool","Error","define","registerPrompt","prompt","registerResource","resource","start","log","debug","server","use","createOAuthDiscoveryFallbackMiddleware","routes","createMcpRoutes","sendDidStartMcpServer","path","numberOfTools","size","numberOfPrompts","numberOfResources","baseUrl","get","info","stop","logToolDefinition"],"mappings":"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"}
@@ -43,19 +43,19 @@ import { logToolDefinition } from './tools/log.mjs';
43
43
  },
44
44
  registerTool (tool) {
45
45
  if (serverStatus !== 'idle') {
46
- throw new Error('[MCP] Tools must be registered before MCP server starts. Register during plugin register().');
46
+ throw new Error('[MCP] Cannot register tools after the MCP server has started.');
47
47
  }
48
48
  toolDefinitions.define(tool);
49
49
  },
50
50
  registerPrompt (prompt) {
51
51
  if (serverStatus !== 'idle') {
52
- throw new Error('[MCP] Prompts must be registered before MCP server starts. Register during plugin register().');
52
+ throw new Error('[MCP] Cannot register prompts after the MCP server has started.');
53
53
  }
54
54
  promptDefinitions.define(prompt);
55
55
  },
56
56
  registerResource (resource) {
57
57
  if (serverStatus !== 'idle') {
58
- throw new Error('[MCP] Resources must be registered before MCP server starts. Register during plugin register().');
58
+ throw new Error('[MCP] Cannot register resources after the MCP server has started.');
59
59
  }
60
60
  resourceDefinitions.define(resource);
61
61
  },
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../src/services/mcp/index.ts"],"sourcesContent":["import type { Core, Modules } from '@strapi/types';\nimport { createMcpAdminTokenAuthenticator } from './authentication';\nimport { createPostHandler } from './handlers/handlePost';\nimport type { McpHandlerDependencies } from './handlers/types';\nimport { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry';\nimport { McpConfiguration } from './internal/McpConfiguration';\nimport { createMcpServerWithRegistries } from './internal/McpServerFactory';\nimport { createOAuthDiscoveryFallbackMiddleware } from './middleware/oauthDiscoveryFallback';\nimport { createMcpRoutes } from './routes';\nimport { sendDidStartMcpServer } from './metrics/metrics';\nimport { logToolDefinition } from './tools/log';\n\n/**\n * Creates an MCP service instance for Strapi Core\n */\nexport const createMcpService = (strapi: Core.Strapi): Modules.MCP.McpService => {\n // Initialize configuration\n const config = new McpConfiguration(strapi);\n\n const authenticationStrategy = createMcpAdminTokenAuthenticator(strapi);\n\n // Status tracking\n let serverStatus: Modules.MCP.McpServiceStatus = 'idle';\n\n // Definition registries\n const toolDefinitions = new McpCapabilityDefinitionRegistry<\n 'tool',\n Modules.MCP.McpToolDefinition\n >('tool');\n\n const promptDefinitions = new McpCapabilityDefinitionRegistry<\n 'prompt',\n Modules.MCP.McpPromptDefinition\n >('prompt');\n\n const resourceDefinitions = new McpCapabilityDefinitionRegistry<\n 'resource',\n Modules.MCP.McpResourceDefinition\n >('resource');\n\n // Prepare handler dependencies\n const handlerDependencies: McpHandlerDependencies = {\n strapi,\n authenticationStrategy,\n config,\n createServerWithRegistries: createMcpServerWithRegistries,\n capabilityDefinitions: {\n tools: toolDefinitions,\n prompts: promptDefinitions,\n resources: resourceDefinitions,\n },\n };\n\n // Create HTTP handlers\n const handlePost = createPostHandler(handlerDependencies);\n\n const service: Modules.MCP.McpService = {\n isEnabled() {\n return config.isEnabled();\n },\n\n isRunning() {\n return serverStatus === 'running';\n },\n\n registerTool(tool: Modules.MCP.McpToolDefinition) {\n if (serverStatus !== 'idle') {\n throw new Error(\n '[MCP] Tools must be registered before MCP server starts. Register during plugin register().'\n );\n }\n\n toolDefinitions.define(tool);\n },\n\n registerPrompt(prompt) {\n if (serverStatus !== 'idle') {\n throw new Error(\n '[MCP] Prompts must be registered before MCP server starts. Register during plugin register().'\n );\n }\n promptDefinitions.define(prompt);\n },\n\n registerResource(resource) {\n if (serverStatus !== 'idle') {\n throw new Error(\n '[MCP] Resources must be registered before MCP server starts. Register during plugin register().'\n );\n }\n resourceDefinitions.define(resource);\n },\n\n async start() {\n if (service.isEnabled() === false) {\n strapi.log.debug('[MCP] Server is disabled');\n return;\n }\n if (serverStatus === 'error') {\n throw new Error('[MCP] Cannot start server: previous error state');\n }\n if (serverStatus !== 'idle') {\n throw new Error(`[MCP] Server already started or starting (status: ${serverStatus})`);\n }\n serverStatus = 'starting';\n\n strapi.server.use(createOAuthDiscoveryFallbackMiddleware());\n\n const routes = createMcpRoutes(config, { handlePost });\n strapi.server.routes(routes);\n\n serverStatus = 'running';\n\n sendDidStartMcpServer(strapi, {\n path: config.path,\n numberOfTools: toolDefinitions.size,\n numberOfPrompts: promptDefinitions.size,\n numberOfResources: resourceDefinitions.size,\n });\n\n const baseUrl = strapi.config.get('server.url', 'http://localhost:1337');\n strapi.log.info(`[MCP] Server available at ${baseUrl}${config.path}`);\n },\n\n async stop() {\n serverStatus = 'idle';\n strapi.log.info('[MCP] Service stopped');\n },\n };\n\n service.registerTool(logToolDefinition);\n\n return service;\n};\n"],"names":["createMcpService","strapi","config","McpConfiguration","authenticationStrategy","createMcpAdminTokenAuthenticator","serverStatus","toolDefinitions","McpCapabilityDefinitionRegistry","promptDefinitions","resourceDefinitions","handlerDependencies","createServerWithRegistries","createMcpServerWithRegistries","capabilityDefinitions","tools","prompts","resources","handlePost","createPostHandler","service","isEnabled","isRunning","registerTool","tool","Error","define","registerPrompt","prompt","registerResource","resource","start","log","debug","server","use","createOAuthDiscoveryFallbackMiddleware","routes","createMcpRoutes","sendDidStartMcpServer","path","numberOfTools","size","numberOfPrompts","numberOfResources","baseUrl","get","info","stop","logToolDefinition"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/services/mcp/index.ts"],"sourcesContent":["import type { Core, Modules } from '@strapi/types';\nimport { createMcpAdminTokenAuthenticator } from './authentication';\nimport { createPostHandler } from './handlers/handlePost';\nimport type { McpHandlerDependencies } from './handlers/types';\nimport { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry';\nimport { McpConfiguration } from './internal/McpConfiguration';\nimport { createMcpServerWithRegistries } from './internal/McpServerFactory';\nimport { createOAuthDiscoveryFallbackMiddleware } from './middleware/oauthDiscoveryFallback';\nimport { createMcpRoutes } from './routes';\nimport { sendDidStartMcpServer } from './metrics/metrics';\nimport { logToolDefinition } from './tools/log';\n\n/**\n * Creates an MCP service instance for Strapi Core\n */\nexport const createMcpService = (strapi: Core.Strapi): Modules.MCP.McpService => {\n // Initialize configuration\n const config = new McpConfiguration(strapi);\n\n const authenticationStrategy = createMcpAdminTokenAuthenticator(strapi);\n\n // Status tracking\n let serverStatus: Modules.MCP.McpServiceStatus = 'idle';\n\n // Definition registries\n const toolDefinitions = new McpCapabilityDefinitionRegistry<\n 'tool',\n Modules.MCP.McpToolDefinition\n >('tool');\n\n const promptDefinitions = new McpCapabilityDefinitionRegistry<\n 'prompt',\n Modules.MCP.McpPromptDefinition\n >('prompt');\n\n const resourceDefinitions = new McpCapabilityDefinitionRegistry<\n 'resource',\n Modules.MCP.McpResourceDefinition\n >('resource');\n\n // Prepare handler dependencies\n const handlerDependencies: McpHandlerDependencies = {\n strapi,\n authenticationStrategy,\n config,\n createServerWithRegistries: createMcpServerWithRegistries,\n capabilityDefinitions: {\n tools: toolDefinitions,\n prompts: promptDefinitions,\n resources: resourceDefinitions,\n },\n };\n\n // Create HTTP handlers\n const handlePost = createPostHandler(handlerDependencies);\n\n const service: Modules.MCP.McpService = {\n isEnabled() {\n return config.isEnabled();\n },\n\n isRunning() {\n return serverStatus === 'running';\n },\n\n registerTool(tool: Modules.MCP.McpToolDefinition) {\n if (serverStatus !== 'idle') {\n throw new Error('[MCP] Cannot register tools after the MCP server has started.');\n }\n\n toolDefinitions.define(tool);\n },\n\n registerPrompt(prompt) {\n if (serverStatus !== 'idle') {\n throw new Error('[MCP] Cannot register prompts after the MCP server has started.');\n }\n promptDefinitions.define(prompt);\n },\n\n registerResource(resource) {\n if (serverStatus !== 'idle') {\n throw new Error('[MCP] Cannot register resources after the MCP server has started.');\n }\n resourceDefinitions.define(resource);\n },\n\n async start() {\n if (service.isEnabled() === false) {\n strapi.log.debug('[MCP] Server is disabled');\n return;\n }\n if (serverStatus === 'error') {\n throw new Error('[MCP] Cannot start server: previous error state');\n }\n if (serverStatus !== 'idle') {\n throw new Error(`[MCP] Server already started or starting (status: ${serverStatus})`);\n }\n serverStatus = 'starting';\n\n strapi.server.use(createOAuthDiscoveryFallbackMiddleware());\n\n const routes = createMcpRoutes(config, { handlePost });\n strapi.server.routes(routes);\n\n serverStatus = 'running';\n\n sendDidStartMcpServer(strapi, {\n path: config.path,\n numberOfTools: toolDefinitions.size,\n numberOfPrompts: promptDefinitions.size,\n numberOfResources: resourceDefinitions.size,\n });\n\n const baseUrl = strapi.config.get('server.url', 'http://localhost:1337');\n strapi.log.info(`[MCP] Server available at ${baseUrl}${config.path}`);\n },\n\n async stop() {\n serverStatus = 'idle';\n strapi.log.info('[MCP] Service stopped');\n },\n };\n\n service.registerTool(logToolDefinition);\n\n return service;\n};\n"],"names":["createMcpService","strapi","config","McpConfiguration","authenticationStrategy","createMcpAdminTokenAuthenticator","serverStatus","toolDefinitions","McpCapabilityDefinitionRegistry","promptDefinitions","resourceDefinitions","handlerDependencies","createServerWithRegistries","createMcpServerWithRegistries","capabilityDefinitions","tools","prompts","resources","handlePost","createPostHandler","service","isEnabled","isRunning","registerTool","tool","Error","define","registerPrompt","prompt","registerResource","resource","start","log","debug","server","use","createOAuthDiscoveryFallbackMiddleware","routes","createMcpRoutes","sendDidStartMcpServer","path","numberOfTools","size","numberOfPrompts","numberOfResources","baseUrl","get","info","stop","logToolDefinition"],"mappings":";;;;;;;;;;AAYA;;IAGO,MAAMA,gBAAAA,GAAmB,CAACC,MAAAA,GAAAA;;IAE/B,MAAMC,MAAAA,GAAS,IAAIC,gBAAAA,CAAiBF,MAAAA,CAAAA;AAEpC,IAAA,MAAMG,yBAAyBC,gCAAAA,CAAiCJ,MAAAA,CAAAA;;AAGhE,IAAA,IAAIK,YAAAA,GAA6C,MAAA;;IAGjD,MAAMC,eAAAA,GAAkB,IAAIC,+BAAAA,CAG1B,MAAA,CAAA;IAEF,MAAMC,iBAAAA,GAAoB,IAAID,+BAAAA,CAG5B,QAAA,CAAA;IAEF,MAAME,mBAAAA,GAAsB,IAAIF,+BAAAA,CAG9B,UAAA,CAAA;;AAGF,IAAA,MAAMG,mBAAAA,GAA8C;AAClDV,QAAAA,MAAAA;AACAG,QAAAA,sBAAAA;AACAF,QAAAA,MAAAA;QACAU,0BAAAA,EAA4BC,6BAAAA;QAC5BC,qBAAAA,EAAuB;YACrBC,KAAAA,EAAOR,eAAAA;YACPS,OAAAA,EAASP,iBAAAA;YACTQ,SAAAA,EAAWP;AACb;AACF,KAAA;;AAGA,IAAA,MAAMQ,aAAaC,iBAAAA,CAAkBR,mBAAAA,CAAAA;AAErC,IAAA,MAAMS,OAAAA,GAAkC;AACtCC,QAAAA,SAAAA,CAAAA,GAAAA;AACE,YAAA,OAAOnB,OAAOmB,SAAS,EAAA;AACzB,QAAA,CAAA;AAEAC,QAAAA,SAAAA,CAAAA,GAAAA;AACE,YAAA,OAAOhB,YAAAA,KAAiB,SAAA;AAC1B,QAAA,CAAA;AAEAiB,QAAAA,YAAAA,CAAAA,CAAaC,IAAmC,EAAA;AAC9C,YAAA,IAAIlB,iBAAiB,MAAA,EAAQ;AAC3B,gBAAA,MAAM,IAAImB,KAAAA,CAAM,+DAAA,CAAA;AAClB,YAAA;AAEAlB,YAAAA,eAAAA,CAAgBmB,MAAM,CAACF,IAAAA,CAAAA;AACzB,QAAA,CAAA;AAEAG,QAAAA,cAAAA,CAAAA,CAAeC,MAAM,EAAA;AACnB,YAAA,IAAItB,iBAAiB,MAAA,EAAQ;AAC3B,gBAAA,MAAM,IAAImB,KAAAA,CAAM,iEAAA,CAAA;AAClB,YAAA;AACAhB,YAAAA,iBAAAA,CAAkBiB,MAAM,CAACE,MAAAA,CAAAA;AAC3B,QAAA,CAAA;AAEAC,QAAAA,gBAAAA,CAAAA,CAAiBC,QAAQ,EAAA;AACvB,YAAA,IAAIxB,iBAAiB,MAAA,EAAQ;AAC3B,gBAAA,MAAM,IAAImB,KAAAA,CAAM,mEAAA,CAAA;AAClB,YAAA;AACAf,YAAAA,mBAAAA,CAAoBgB,MAAM,CAACI,QAAAA,CAAAA;AAC7B,QAAA,CAAA;QAEA,MAAMC,KAAAA,CAAAA,GAAAA;YACJ,IAAIX,OAAAA,CAAQC,SAAS,EAAA,KAAO,KAAA,EAAO;gBACjCpB,MAAAA,CAAO+B,GAAG,CAACC,KAAK,CAAC,0BAAA,CAAA;AACjB,gBAAA;AACF,YAAA;AACA,YAAA,IAAI3B,iBAAiB,OAAA,EAAS;AAC5B,gBAAA,MAAM,IAAImB,KAAAA,CAAM,iDAAA,CAAA;AAClB,YAAA;AACA,YAAA,IAAInB,iBAAiB,MAAA,EAAQ;AAC3B,gBAAA,MAAM,IAAImB,KAAAA,CAAM,CAAC,kDAAkD,EAAEnB,YAAAA,CAAa,CAAC,CAAC,CAAA;AACtF,YAAA;YACAA,YAAAA,GAAe,UAAA;YAEfL,MAAAA,CAAOiC,MAAM,CAACC,GAAG,CAACC,sCAAAA,EAAAA,CAAAA;YAElB,MAAMC,MAAAA,GAASC,gBAAgBpC,MAAAA,EAAQ;AAAEgB,gBAAAA;AAAW,aAAA,CAAA;YACpDjB,MAAAA,CAAOiC,MAAM,CAACG,MAAM,CAACA,MAAAA,CAAAA;YAErB/B,YAAAA,GAAe,SAAA;AAEfiC,YAAAA,qBAAAA,CAAsBtC,MAAAA,EAAQ;AAC5BuC,gBAAAA,IAAAA,EAAMtC,OAAOsC,IAAI;AACjBC,gBAAAA,aAAAA,EAAelC,gBAAgBmC,IAAI;AACnCC,gBAAAA,eAAAA,EAAiBlC,kBAAkBiC,IAAI;AACvCE,gBAAAA,iBAAAA,EAAmBlC,oBAAoBgC;AACzC,aAAA,CAAA;AAEA,YAAA,MAAMG,UAAU5C,MAAAA,CAAOC,MAAM,CAAC4C,GAAG,CAAC,YAAA,EAAc,uBAAA,CAAA;YAChD7C,MAAAA,CAAO+B,GAAG,CAACe,IAAI,CAAC,CAAC,0BAA0B,EAAEF,OAAAA,CAAAA,EAAU3C,MAAAA,CAAOsC,IAAI,CAAA,CAAE,CAAA;AACtE,QAAA,CAAA;QAEA,MAAMQ,IAAAA,CAAAA,GAAAA;YACJ1C,YAAAA,GAAe,MAAA;YACfL,MAAAA,CAAO+B,GAAG,CAACe,IAAI,CAAC,uBAAA,CAAA;AAClB,QAAA;AACF,KAAA;AAEA3B,IAAAA,OAAAA,CAAQG,YAAY,CAAC0B,iBAAAA,CAAAA;IAErB,OAAO7B,OAAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/metrics/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAiB1C,QAAA,MAAM,uBAAuB,WAAY,KAAK,MAAM;;;;gBA6B9B,MAAM,YAAW,OAAO,MAAM,EAAE,OAAO,CAAC;;CAS7D,CAAC;AAEF,eAAe,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/metrics/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAiB1C,QAAA,MAAM,uBAAuB,WAAY,KAAK,MAAM;;;;gBA8B9B,MAAM,YAAW,OAAO,MAAM,EAAE,OAAO,CAAC;;CAS7D,CAAC;AAEF,eAAe,uBAAuB,CAAC"}
@@ -18,16 +18,17 @@ const createTelemetryInstance = (strapi)=>{
18
18
  const uuid = strapi.config.get('uuid');
19
19
  const telemetryDisabled = strapi.config.get('packageJsonStrapi.telemetryDisabled');
20
20
  const isDisabled = !uuid || isTruthy(process.env.STRAPI_TELEMETRY_DISABLED) || isTruthy(telemetryDisabled);
21
- const sender$1 = sender(strapi);
22
- const sendEvent = rateLimiter(sender$1, {
21
+ // Skip the sender (and its tsUtils consumer) entirely when telemetry is off
22
+ const sender$1 = isDisabled ? null : sender(strapi);
23
+ const sendEvent = sender$1 ? rateLimiter(sender$1, {
23
24
  limitedEvents: LIMITED_EVENTS
24
- });
25
+ }) : null;
25
26
  return {
26
27
  get isDisabled () {
27
28
  return isDisabled;
28
29
  },
29
30
  register () {
30
- if (!isDisabled) {
31
+ if (!isDisabled && sendEvent) {
31
32
  strapi.cron.add({
32
33
  sendPingEvent: {
33
34
  task: ()=>sendEvent('ping'),
@@ -42,7 +43,7 @@ const createTelemetryInstance = (strapi)=>{
42
43
  },
43
44
  bootstrap () {},
44
45
  async send (event, payload = {}) {
45
- if (isDisabled) return true;
46
+ if (isDisabled || !sendEvent) return true;
46
47
  return sendEvent(event, payload);
47
48
  },
48
49
  destroy () {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/services/metrics/index.ts"],"sourcesContent":["/**\n * Strapi telemetry package.\n * You can learn more at https://docs.strapi.io/developer-docs/latest/getting-started/usage-information.html\n */\n\nimport type { Core } from '@strapi/types';\n\nimport wrapWithRateLimit from './rate-limiter';\nimport createSender from './sender';\nimport createMiddleware from './middleware';\nimport isTruthy from './is-truthy';\nimport { MCP_LIMITED_TELEMETRY_EVENTS } from '../mcp/metrics/metrics';\n\nconst LIMITED_EVENTS = [\n 'didSaveMediaWithAlternativeText',\n 'didSaveMediaWithCaption',\n 'didDisableResponsiveDimensions',\n 'didEnableResponsiveDimensions',\n 'didInitializePluginUpload',\n ...Object.values(MCP_LIMITED_TELEMETRY_EVENTS),\n];\n\nconst createTelemetryInstance = (strapi: Core.Strapi) => {\n const uuid = strapi.config.get('uuid');\n const telemetryDisabled = strapi.config.get('packageJsonStrapi.telemetryDisabled');\n const isDisabled =\n !uuid || isTruthy(process.env.STRAPI_TELEMETRY_DISABLED) || isTruthy(telemetryDisabled);\n\n const sender = createSender(strapi);\n const sendEvent = wrapWithRateLimit(sender, { limitedEvents: LIMITED_EVENTS });\n\n return {\n get isDisabled() {\n return isDisabled;\n },\n\n register() {\n if (!isDisabled) {\n strapi.cron.add({\n sendPingEvent: {\n task: () => sendEvent('ping'),\n options: '0 0 12 * * *',\n },\n });\n\n strapi.server.use(createMiddleware({ sendEvent, strapi }));\n }\n },\n\n bootstrap() {},\n\n async send(event: string, payload: Record<string, unknown> = {}) {\n if (isDisabled) return true;\n return sendEvent(event, payload);\n },\n\n destroy() {\n // Clean up resources if needed\n },\n };\n};\n\nexport default createTelemetryInstance;\n"],"names":["LIMITED_EVENTS","Object","values","MCP_LIMITED_TELEMETRY_EVENTS","createTelemetryInstance","strapi","uuid","config","get","telemetryDisabled","isDisabled","isTruthy","process","env","STRAPI_TELEMETRY_DISABLED","sender","createSender","sendEvent","wrapWithRateLimit","limitedEvents","register","cron","add","sendPingEvent","task","options","server","use","createMiddleware","bootstrap","send","event","payload","destroy"],"mappings":";;;;;;;;AAaA,MAAMA,cAAAA,GAAiB;AACrB,IAAA,iCAAA;AACA,IAAA,yBAAA;AACA,IAAA,gCAAA;AACA,IAAA,+BAAA;AACA,IAAA,2BAAA;AACGC,IAAAA,GAAAA,MAAAA,CAAOC,MAAM,CAACC,oCAAAA;AAClB,CAAA;AAED,MAAMC,0BAA0B,CAACC,MAAAA,GAAAA;AAC/B,IAAA,MAAMC,IAAAA,GAAOD,MAAAA,CAAOE,MAAM,CAACC,GAAG,CAAC,MAAA,CAAA;AAC/B,IAAA,MAAMC,iBAAAA,GAAoBJ,MAAAA,CAAOE,MAAM,CAACC,GAAG,CAAC,qCAAA,CAAA;IAC5C,MAAME,UAAAA,GACJ,CAACJ,IAAAA,IAAQK,QAAAA,CAASC,QAAQC,GAAG,CAACC,yBAAyB,CAAA,IAAKH,QAAAA,CAASF,iBAAAA,CAAAA;AAEvE,IAAA,MAAMM,WAASC,MAAAA,CAAaX,MAAAA,CAAAA;IAC5B,MAAMY,SAAAA,GAAYC,YAAkBH,QAAAA,EAAQ;QAAEI,aAAAA,EAAenB;AAAe,KAAA,CAAA;IAE5E,OAAO;AACL,QAAA,IAAIU,UAAAA,CAAAA,GAAa;YACf,OAAOA,UAAAA;AACT,QAAA,CAAA;AAEAU,QAAAA,QAAAA,CAAAA,GAAAA;AACE,YAAA,IAAI,CAACV,UAAAA,EAAY;gBACfL,MAAAA,CAAOgB,IAAI,CAACC,GAAG,CAAC;oBACdC,aAAAA,EAAe;AACbC,wBAAAA,IAAAA,EAAM,IAAMP,SAAAA,CAAU,MAAA,CAAA;wBACtBQ,OAAAA,EAAS;AACX;AACF,iBAAA,CAAA;AAEApB,gBAAAA,MAAAA,CAAOqB,MAAM,CAACC,GAAG,CAACC,UAAAA,CAAiB;AAAEX,oBAAAA,SAAAA;AAAWZ,oBAAAA;AAAO,iBAAA,CAAA,CAAA;AACzD,YAAA;AACF,QAAA,CAAA;QAEAwB,SAAAA,CAAAA,GAAAA,CAAa,CAAA;AAEb,QAAA,MAAMC,IAAAA,CAAAA,CAAKC,KAAa,EAAEC,OAAAA,GAAmC,EAAE,EAAA;AAC7D,YAAA,IAAItB,YAAY,OAAO,IAAA;AACvB,YAAA,OAAOO,UAAUc,KAAAA,EAAOC,OAAAA,CAAAA;AAC1B,QAAA,CAAA;AAEAC,QAAAA,OAAAA,CAAAA,GAAAA;;AAEA,QAAA;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/services/metrics/index.ts"],"sourcesContent":["/**\n * Strapi telemetry package.\n * You can learn more at https://docs.strapi.io/developer-docs/latest/getting-started/usage-information.html\n */\n\nimport type { Core } from '@strapi/types';\n\nimport wrapWithRateLimit from './rate-limiter';\nimport createSender from './sender';\nimport createMiddleware from './middleware';\nimport isTruthy from './is-truthy';\nimport { MCP_LIMITED_TELEMETRY_EVENTS } from '../mcp/metrics/metrics';\n\nconst LIMITED_EVENTS = [\n 'didSaveMediaWithAlternativeText',\n 'didSaveMediaWithCaption',\n 'didDisableResponsiveDimensions',\n 'didEnableResponsiveDimensions',\n 'didInitializePluginUpload',\n ...Object.values(MCP_LIMITED_TELEMETRY_EVENTS),\n];\n\nconst createTelemetryInstance = (strapi: Core.Strapi) => {\n const uuid = strapi.config.get('uuid');\n const telemetryDisabled = strapi.config.get('packageJsonStrapi.telemetryDisabled');\n const isDisabled =\n !uuid || isTruthy(process.env.STRAPI_TELEMETRY_DISABLED) || isTruthy(telemetryDisabled);\n\n // Skip the sender (and its tsUtils consumer) entirely when telemetry is off\n const sender = isDisabled ? null : createSender(strapi);\n const sendEvent = sender ? wrapWithRateLimit(sender, { limitedEvents: LIMITED_EVENTS }) : null;\n\n return {\n get isDisabled() {\n return isDisabled;\n },\n\n register() {\n if (!isDisabled && sendEvent) {\n strapi.cron.add({\n sendPingEvent: {\n task: () => sendEvent('ping'),\n options: '0 0 12 * * *',\n },\n });\n\n strapi.server.use(createMiddleware({ sendEvent, strapi }));\n }\n },\n\n bootstrap() {},\n\n async send(event: string, payload: Record<string, unknown> = {}) {\n if (isDisabled || !sendEvent) return true;\n return sendEvent(event, payload);\n },\n\n destroy() {\n // Clean up resources if needed\n },\n };\n};\n\nexport default createTelemetryInstance;\n"],"names":["LIMITED_EVENTS","Object","values","MCP_LIMITED_TELEMETRY_EVENTS","createTelemetryInstance","strapi","uuid","config","get","telemetryDisabled","isDisabled","isTruthy","process","env","STRAPI_TELEMETRY_DISABLED","sender","createSender","sendEvent","wrapWithRateLimit","limitedEvents","register","cron","add","sendPingEvent","task","options","server","use","createMiddleware","bootstrap","send","event","payload","destroy"],"mappings":";;;;;;;;AAaA,MAAMA,cAAAA,GAAiB;AACrB,IAAA,iCAAA;AACA,IAAA,yBAAA;AACA,IAAA,gCAAA;AACA,IAAA,+BAAA;AACA,IAAA,2BAAA;AACGC,IAAAA,GAAAA,MAAAA,CAAOC,MAAM,CAACC,oCAAAA;AAClB,CAAA;AAED,MAAMC,0BAA0B,CAACC,MAAAA,GAAAA;AAC/B,IAAA,MAAMC,IAAAA,GAAOD,MAAAA,CAAOE,MAAM,CAACC,GAAG,CAAC,MAAA,CAAA;AAC/B,IAAA,MAAMC,iBAAAA,GAAoBJ,MAAAA,CAAOE,MAAM,CAACC,GAAG,CAAC,qCAAA,CAAA;IAC5C,MAAME,UAAAA,GACJ,CAACJ,IAAAA,IAAQK,QAAAA,CAASC,QAAQC,GAAG,CAACC,yBAAyB,CAAA,IAAKH,QAAAA,CAASF,iBAAAA,CAAAA;;IAGvE,MAAMM,QAAAA,GAASL,UAAAA,GAAa,IAAA,GAAOM,MAAAA,CAAaX,MAAAA,CAAAA;IAChD,MAAMY,SAAAA,GAAYF,QAAAA,GAASG,WAAAA,CAAkBH,QAAAA,EAAQ;QAAEI,aAAAA,EAAenB;KAAe,CAAA,GAAK,IAAA;IAE1F,OAAO;AACL,QAAA,IAAIU,UAAAA,CAAAA,GAAa;YACf,OAAOA,UAAAA;AACT,QAAA,CAAA;AAEAU,QAAAA,QAAAA,CAAAA,GAAAA;YACE,IAAI,CAACV,cAAcO,SAAAA,EAAW;gBAC5BZ,MAAAA,CAAOgB,IAAI,CAACC,GAAG,CAAC;oBACdC,aAAAA,EAAe;AACbC,wBAAAA,IAAAA,EAAM,IAAMP,SAAAA,CAAU,MAAA,CAAA;wBACtBQ,OAAAA,EAAS;AACX;AACF,iBAAA,CAAA;AAEApB,gBAAAA,MAAAA,CAAOqB,MAAM,CAACC,GAAG,CAACC,UAAAA,CAAiB;AAAEX,oBAAAA,SAAAA;AAAWZ,oBAAAA;AAAO,iBAAA,CAAA,CAAA;AACzD,YAAA;AACF,QAAA,CAAA;QAEAwB,SAAAA,CAAAA,GAAAA,CAAa,CAAA;AAEb,QAAA,MAAMC,IAAAA,CAAAA,CAAKC,KAAa,EAAEC,OAAAA,GAAmC,EAAE,EAAA;YAC7D,IAAItB,UAAAA,IAAc,CAACO,SAAAA,EAAW,OAAO,IAAA;AACrC,YAAA,OAAOA,UAAUc,KAAAA,EAAOC,OAAAA,CAAAA;AAC1B,QAAA,CAAA;AAEAC,QAAAA,OAAAA,CAAAA,GAAAA;;AAEA,QAAA;AACF,KAAA;AACF;;;;"}
@@ -16,16 +16,17 @@ const createTelemetryInstance = (strapi)=>{
16
16
  const uuid = strapi.config.get('uuid');
17
17
  const telemetryDisabled = strapi.config.get('packageJsonStrapi.telemetryDisabled');
18
18
  const isDisabled = !uuid || isTruthy(process.env.STRAPI_TELEMETRY_DISABLED) || isTruthy(telemetryDisabled);
19
- const sender = createSender(strapi);
20
- const sendEvent = wrapWithRateLimit(sender, {
19
+ // Skip the sender (and its tsUtils consumer) entirely when telemetry is off
20
+ const sender = isDisabled ? null : createSender(strapi);
21
+ const sendEvent = sender ? wrapWithRateLimit(sender, {
21
22
  limitedEvents: LIMITED_EVENTS
22
- });
23
+ }) : null;
23
24
  return {
24
25
  get isDisabled () {
25
26
  return isDisabled;
26
27
  },
27
28
  register () {
28
- if (!isDisabled) {
29
+ if (!isDisabled && sendEvent) {
29
30
  strapi.cron.add({
30
31
  sendPingEvent: {
31
32
  task: ()=>sendEvent('ping'),
@@ -40,7 +41,7 @@ const createTelemetryInstance = (strapi)=>{
40
41
  },
41
42
  bootstrap () {},
42
43
  async send (event, payload = {}) {
43
- if (isDisabled) return true;
44
+ if (isDisabled || !sendEvent) return true;
44
45
  return sendEvent(event, payload);
45
46
  },
46
47
  destroy () {
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../src/services/metrics/index.ts"],"sourcesContent":["/**\n * Strapi telemetry package.\n * You can learn more at https://docs.strapi.io/developer-docs/latest/getting-started/usage-information.html\n */\n\nimport type { Core } from '@strapi/types';\n\nimport wrapWithRateLimit from './rate-limiter';\nimport createSender from './sender';\nimport createMiddleware from './middleware';\nimport isTruthy from './is-truthy';\nimport { MCP_LIMITED_TELEMETRY_EVENTS } from '../mcp/metrics/metrics';\n\nconst LIMITED_EVENTS = [\n 'didSaveMediaWithAlternativeText',\n 'didSaveMediaWithCaption',\n 'didDisableResponsiveDimensions',\n 'didEnableResponsiveDimensions',\n 'didInitializePluginUpload',\n ...Object.values(MCP_LIMITED_TELEMETRY_EVENTS),\n];\n\nconst createTelemetryInstance = (strapi: Core.Strapi) => {\n const uuid = strapi.config.get('uuid');\n const telemetryDisabled = strapi.config.get('packageJsonStrapi.telemetryDisabled');\n const isDisabled =\n !uuid || isTruthy(process.env.STRAPI_TELEMETRY_DISABLED) || isTruthy(telemetryDisabled);\n\n const sender = createSender(strapi);\n const sendEvent = wrapWithRateLimit(sender, { limitedEvents: LIMITED_EVENTS });\n\n return {\n get isDisabled() {\n return isDisabled;\n },\n\n register() {\n if (!isDisabled) {\n strapi.cron.add({\n sendPingEvent: {\n task: () => sendEvent('ping'),\n options: '0 0 12 * * *',\n },\n });\n\n strapi.server.use(createMiddleware({ sendEvent, strapi }));\n }\n },\n\n bootstrap() {},\n\n async send(event: string, payload: Record<string, unknown> = {}) {\n if (isDisabled) return true;\n return sendEvent(event, payload);\n },\n\n destroy() {\n // Clean up resources if needed\n },\n };\n};\n\nexport default createTelemetryInstance;\n"],"names":["LIMITED_EVENTS","Object","values","MCP_LIMITED_TELEMETRY_EVENTS","createTelemetryInstance","strapi","uuid","config","get","telemetryDisabled","isDisabled","isTruthy","process","env","STRAPI_TELEMETRY_DISABLED","sender","createSender","sendEvent","wrapWithRateLimit","limitedEvents","register","cron","add","sendPingEvent","task","options","server","use","createMiddleware","bootstrap","send","event","payload","destroy"],"mappings":";;;;;;AAaA,MAAMA,cAAAA,GAAiB;AACrB,IAAA,iCAAA;AACA,IAAA,yBAAA;AACA,IAAA,gCAAA;AACA,IAAA,+BAAA;AACA,IAAA,2BAAA;AACGC,IAAAA,GAAAA,MAAAA,CAAOC,MAAM,CAACC,4BAAAA;AAClB,CAAA;AAED,MAAMC,0BAA0B,CAACC,MAAAA,GAAAA;AAC/B,IAAA,MAAMC,IAAAA,GAAOD,MAAAA,CAAOE,MAAM,CAACC,GAAG,CAAC,MAAA,CAAA;AAC/B,IAAA,MAAMC,iBAAAA,GAAoBJ,MAAAA,CAAOE,MAAM,CAACC,GAAG,CAAC,qCAAA,CAAA;IAC5C,MAAME,UAAAA,GACJ,CAACJ,IAAAA,IAAQK,QAAAA,CAASC,QAAQC,GAAG,CAACC,yBAAyB,CAAA,IAAKH,QAAAA,CAASF,iBAAAA,CAAAA;AAEvE,IAAA,MAAMM,SAASC,YAAAA,CAAaX,MAAAA,CAAAA;IAC5B,MAAMY,SAAAA,GAAYC,kBAAkBH,MAAAA,EAAQ;QAAEI,aAAAA,EAAenB;AAAe,KAAA,CAAA;IAE5E,OAAO;AACL,QAAA,IAAIU,UAAAA,CAAAA,GAAa;YACf,OAAOA,UAAAA;AACT,QAAA,CAAA;AAEAU,QAAAA,QAAAA,CAAAA,GAAAA;AACE,YAAA,IAAI,CAACV,UAAAA,EAAY;gBACfL,MAAAA,CAAOgB,IAAI,CAACC,GAAG,CAAC;oBACdC,aAAAA,EAAe;AACbC,wBAAAA,IAAAA,EAAM,IAAMP,SAAAA,CAAU,MAAA,CAAA;wBACtBQ,OAAAA,EAAS;AACX;AACF,iBAAA,CAAA;AAEApB,gBAAAA,MAAAA,CAAOqB,MAAM,CAACC,GAAG,CAACC,gBAAAA,CAAiB;AAAEX,oBAAAA,SAAAA;AAAWZ,oBAAAA;AAAO,iBAAA,CAAA,CAAA;AACzD,YAAA;AACF,QAAA,CAAA;QAEAwB,SAAAA,CAAAA,GAAAA,CAAa,CAAA;AAEb,QAAA,MAAMC,IAAAA,CAAAA,CAAKC,KAAa,EAAEC,OAAAA,GAAmC,EAAE,EAAA;AAC7D,YAAA,IAAItB,YAAY,OAAO,IAAA;AACvB,YAAA,OAAOO,UAAUc,KAAAA,EAAOC,OAAAA,CAAAA;AAC1B,QAAA,CAAA;AAEAC,QAAAA,OAAAA,CAAAA,GAAAA;;AAEA,QAAA;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/services/metrics/index.ts"],"sourcesContent":["/**\n * Strapi telemetry package.\n * You can learn more at https://docs.strapi.io/developer-docs/latest/getting-started/usage-information.html\n */\n\nimport type { Core } from '@strapi/types';\n\nimport wrapWithRateLimit from './rate-limiter';\nimport createSender from './sender';\nimport createMiddleware from './middleware';\nimport isTruthy from './is-truthy';\nimport { MCP_LIMITED_TELEMETRY_EVENTS } from '../mcp/metrics/metrics';\n\nconst LIMITED_EVENTS = [\n 'didSaveMediaWithAlternativeText',\n 'didSaveMediaWithCaption',\n 'didDisableResponsiveDimensions',\n 'didEnableResponsiveDimensions',\n 'didInitializePluginUpload',\n ...Object.values(MCP_LIMITED_TELEMETRY_EVENTS),\n];\n\nconst createTelemetryInstance = (strapi: Core.Strapi) => {\n const uuid = strapi.config.get('uuid');\n const telemetryDisabled = strapi.config.get('packageJsonStrapi.telemetryDisabled');\n const isDisabled =\n !uuid || isTruthy(process.env.STRAPI_TELEMETRY_DISABLED) || isTruthy(telemetryDisabled);\n\n // Skip the sender (and its tsUtils consumer) entirely when telemetry is off\n const sender = isDisabled ? null : createSender(strapi);\n const sendEvent = sender ? wrapWithRateLimit(sender, { limitedEvents: LIMITED_EVENTS }) : null;\n\n return {\n get isDisabled() {\n return isDisabled;\n },\n\n register() {\n if (!isDisabled && sendEvent) {\n strapi.cron.add({\n sendPingEvent: {\n task: () => sendEvent('ping'),\n options: '0 0 12 * * *',\n },\n });\n\n strapi.server.use(createMiddleware({ sendEvent, strapi }));\n }\n },\n\n bootstrap() {},\n\n async send(event: string, payload: Record<string, unknown> = {}) {\n if (isDisabled || !sendEvent) return true;\n return sendEvent(event, payload);\n },\n\n destroy() {\n // Clean up resources if needed\n },\n };\n};\n\nexport default createTelemetryInstance;\n"],"names":["LIMITED_EVENTS","Object","values","MCP_LIMITED_TELEMETRY_EVENTS","createTelemetryInstance","strapi","uuid","config","get","telemetryDisabled","isDisabled","isTruthy","process","env","STRAPI_TELEMETRY_DISABLED","sender","createSender","sendEvent","wrapWithRateLimit","limitedEvents","register","cron","add","sendPingEvent","task","options","server","use","createMiddleware","bootstrap","send","event","payload","destroy"],"mappings":";;;;;;AAaA,MAAMA,cAAAA,GAAiB;AACrB,IAAA,iCAAA;AACA,IAAA,yBAAA;AACA,IAAA,gCAAA;AACA,IAAA,+BAAA;AACA,IAAA,2BAAA;AACGC,IAAAA,GAAAA,MAAAA,CAAOC,MAAM,CAACC,4BAAAA;AAClB,CAAA;AAED,MAAMC,0BAA0B,CAACC,MAAAA,GAAAA;AAC/B,IAAA,MAAMC,IAAAA,GAAOD,MAAAA,CAAOE,MAAM,CAACC,GAAG,CAAC,MAAA,CAAA;AAC/B,IAAA,MAAMC,iBAAAA,GAAoBJ,MAAAA,CAAOE,MAAM,CAACC,GAAG,CAAC,qCAAA,CAAA;IAC5C,MAAME,UAAAA,GACJ,CAACJ,IAAAA,IAAQK,QAAAA,CAASC,QAAQC,GAAG,CAACC,yBAAyB,CAAA,IAAKH,QAAAA,CAASF,iBAAAA,CAAAA;;IAGvE,MAAMM,MAAAA,GAASL,UAAAA,GAAa,IAAA,GAAOM,YAAAA,CAAaX,MAAAA,CAAAA;IAChD,MAAMY,SAAAA,GAAYF,MAAAA,GAASG,iBAAAA,CAAkBH,MAAAA,EAAQ;QAAEI,aAAAA,EAAenB;KAAe,CAAA,GAAK,IAAA;IAE1F,OAAO;AACL,QAAA,IAAIU,UAAAA,CAAAA,GAAa;YACf,OAAOA,UAAAA;AACT,QAAA,CAAA;AAEAU,QAAAA,QAAAA,CAAAA,GAAAA;YACE,IAAI,CAACV,cAAcO,SAAAA,EAAW;gBAC5BZ,MAAAA,CAAOgB,IAAI,CAACC,GAAG,CAAC;oBACdC,aAAAA,EAAe;AACbC,wBAAAA,IAAAA,EAAM,IAAMP,SAAAA,CAAU,MAAA,CAAA;wBACtBQ,OAAAA,EAAS;AACX;AACF,iBAAA,CAAA;AAEApB,gBAAAA,MAAAA,CAAOqB,MAAM,CAACC,GAAG,CAACC,gBAAAA,CAAiB;AAAEX,oBAAAA,SAAAA;AAAWZ,oBAAAA;AAAO,iBAAA,CAAA,CAAA;AACzD,YAAA;AACF,QAAA,CAAA;QAEAwB,SAAAA,CAAAA,GAAAA,CAAa,CAAA;AAEb,QAAA,MAAMC,IAAAA,CAAAA,CAAKC,KAAa,EAAEC,OAAAA,GAAmC,EAAE,EAAA;YAC7D,IAAItB,UAAAA,IAAc,CAACO,SAAAA,EAAW,OAAO,IAAA;AACrC,YAAA,OAAOA,UAAUc,KAAAA,EAAOC,OAAAA,CAAAA;AAC1B,QAAA,CAAA;AAEAC,QAAAA,OAAAA,CAAAA,GAAAA;;AAEA,QAAA;AACF,KAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"sender.d.ts","sourceRoot":"","sources":["../../../src/services/metrics/sender.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAG1C,MAAM,WAAW,OAAO;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,MAAM,MAAM,MAAM,GAAG,CACnB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,OAAO,EACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC3B,OAAO,CAAC,OAAO,CAAC,CAAC;AAgBtB;;GAEG;iCACqB,KAAK,MAAM,KAAG,MAAM;AAA5C,wBAkEE"}
1
+ {"version":3,"file":"sender.d.ts","sourceRoot":"","sources":["../../../src/services/metrics/sender.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAa1C,MAAM,WAAW,OAAO;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,MAAM,MAAM,MAAM,GAAG,CACnB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,OAAO,EACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC3B,OAAO,CAAC,OAAO,CAAC,CAAC;AAgBtB;;GAEG;iCACqB,KAAK,MAAM,KAAG,MAAM;AAA5C,wBAkEE"}
@@ -5,10 +5,18 @@ var path = require('path');
5
5
  var _ = require('lodash');
6
6
  var isDocker = require('is-docker');
7
7
  var ciEnv = require('ci-info');
8
- var tsUtils = require('@strapi/typescript-utils');
9
8
  var strapiUtils = require('@strapi/utils');
10
9
  var adminUserHash = require('./admin-user-hash.js');
11
10
 
11
+ // Lazy: only resolved when telemetry is enabled and a sender is constructed
12
+ let lazyTsUtils;
13
+ const tsUtils = ()=>{
14
+ if (!lazyTsUtils) {
15
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
16
+ lazyTsUtils = require('@strapi/typescript-utils');
17
+ }
18
+ return lazyTsUtils;
19
+ };
12
20
  const defaultQueryOpts = {
13
21
  timeout: 1000,
14
22
  headers: {
@@ -40,8 +48,8 @@ const defaultQueryOpts = {
40
48
  docker: process.env.DOCKER || isDocker(),
41
49
  isCI: ciEnv.isCI,
42
50
  version: strapi.config.get('info.strapi'),
43
- useTypescriptOnServer: tsUtils.isUsingTypeScriptSync(serverRootPath),
44
- useTypescriptOnAdmin: tsUtils.isUsingTypeScriptSync(adminRootPath),
51
+ useTypescriptOnServer: tsUtils().isUsingTypeScriptSync(serverRootPath),
52
+ useTypescriptOnAdmin: tsUtils().isUsingTypeScriptSync(adminRootPath),
45
53
  projectId: uuid,
46
54
  isHostedOnStrapiCloud: strapiUtils.env('STRAPI_HOSTING', null) === 'strapi.cloud'
47
55
  };
@@ -1 +1 @@
1
- {"version":3,"file":"sender.js","sources":["../../../src/services/metrics/sender.ts"],"sourcesContent":["import os from 'os';\nimport path from 'path';\nimport _ from 'lodash';\nimport isDocker from 'is-docker';\nimport ciEnv from 'ci-info';\nimport tsUtils from '@strapi/typescript-utils';\nimport { env, generateInstallId } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport { generateAdminUserHash } from './admin-user-hash';\n\nexport interface Payload {\n eventProperties?: Record<string, unknown>;\n userProperties?: Record<string, unknown>;\n groupProperties?: Record<string, unknown>;\n}\n\nexport type Sender = (\n event: string,\n payload?: Payload,\n opts?: Record<string, unknown>\n) => Promise<boolean>;\n\nconst defaultQueryOpts = {\n timeout: 1000,\n headers: { 'Content-Type': 'application/json' },\n};\n\n/**\n * Add properties from the package.json strapi key in the metadata\n */\nconst addPackageJsonStrapiMetadata = (metadata: Record<string, unknown>, strapi: Core.Strapi) => {\n const { packageJsonStrapi = {} } = strapi.config;\n\n _.defaults(metadata, packageJsonStrapi);\n};\n\n/**\n * Create a send function for event with all the necessary metadata\n */\nexport default (strapi: Core.Strapi): Sender => {\n const { uuid, installId: installIdFromPackageJson } = strapi.config;\n\n const installId = generateInstallId(uuid, installIdFromPackageJson);\n\n const serverRootPath = strapi.dirs.app.root;\n const adminRootPath = path.join(strapi.dirs.app.root, 'src', 'admin');\n\n const anonymousUserProperties = {\n environment: strapi.config.environment,\n os: os.type(),\n osPlatform: os.platform(),\n osArch: os.arch(),\n osRelease: os.release(),\n nodeVersion: process.versions.node,\n };\n\n const anonymousGroupProperties = {\n docker: process.env.DOCKER || isDocker(),\n isCI: ciEnv.isCI,\n version: strapi.config.get('info.strapi'),\n useTypescriptOnServer: tsUtils.isUsingTypeScriptSync(serverRootPath),\n useTypescriptOnAdmin: tsUtils.isUsingTypeScriptSync(adminRootPath),\n projectId: uuid,\n isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud',\n };\n\n addPackageJsonStrapiMetadata(anonymousGroupProperties, strapi);\n\n return async (event: string, payload: Payload = {}, opts = {}) => {\n const userId = generateAdminUserHash(strapi);\n\n const eeGroupProps: Record<string, unknown> = {};\n if (strapi.ee?.subscriptionId !== undefined && strapi.ee?.subscriptionId !== null) {\n eeGroupProps.subscriptionId = strapi.ee.subscriptionId;\n }\n if (strapi.ee?.planPriceId !== undefined && strapi.ee?.planPriceId !== null) {\n eeGroupProps.planPriceId = strapi.ee.planPriceId;\n }\n\n const reqParams = {\n method: 'POST',\n body: JSON.stringify({\n event,\n userId,\n installId,\n eventProperties: payload.eventProperties,\n userProperties: userId ? { ...anonymousUserProperties, ...payload.userProperties } : {},\n groupProperties: {\n ...anonymousGroupProperties,\n projectType: strapi.EE ? 'Enterprise' : 'Community',\n ...eeGroupProps,\n ...payload.groupProperties,\n },\n }),\n ..._.merge({ headers: { 'X-Strapi-Event': event } }, defaultQueryOpts, opts),\n };\n\n try {\n const analyticsUrl = env('STRAPI_ANALYTICS_URL', 'https://analytics.strapi.io');\n const res = await strapi.fetch(`${analyticsUrl}/api/v2/track`, reqParams);\n return res.ok;\n } catch (err) {\n return false;\n }\n };\n};\n"],"names":["defaultQueryOpts","timeout","headers","addPackageJsonStrapiMetadata","metadata","strapi","packageJsonStrapi","config","_","defaults","uuid","installId","installIdFromPackageJson","generateInstallId","serverRootPath","dirs","app","root","adminRootPath","path","join","anonymousUserProperties","environment","os","type","osPlatform","platform","osArch","arch","osRelease","release","nodeVersion","process","versions","node","anonymousGroupProperties","docker","env","DOCKER","isDocker","isCI","ciEnv","version","get","useTypescriptOnServer","tsUtils","isUsingTypeScriptSync","useTypescriptOnAdmin","projectId","isHostedOnStrapiCloud","event","payload","opts","userId","generateAdminUserHash","eeGroupProps","ee","subscriptionId","undefined","planPriceId","reqParams","method","body","JSON","stringify","eventProperties","userProperties","groupProperties","projectType","EE","merge","analyticsUrl","res","fetch","ok","err"],"mappings":";;;;;;;;;;;AAsBA,MAAMA,gBAAAA,GAAmB;IACvBC,OAAAA,EAAS,IAAA;IACTC,OAAAA,EAAS;QAAE,cAAA,EAAgB;AAAmB;AAChD,CAAA;AAEA;;IAGA,MAAMC,4BAAAA,GAA+B,CAACC,QAAAA,EAAmCC,MAAAA,GAAAA;AACvE,IAAA,MAAM,EAAEC,iBAAAA,GAAoB,EAAE,EAAE,GAAGD,OAAOE,MAAM;IAEhDC,CAAAA,CAAEC,QAAQ,CAACL,QAAAA,EAAUE,iBAAAA,CAAAA;AACvB,CAAA;AAEA;;IAGA,mBAAe,CAAA,CAACD,MAAAA,GAAAA;IACd,MAAM,EAAEK,IAAI,EAAEC,SAAAA,EAAWC,wBAAwB,EAAE,GAAGP,OAAOE,MAAM;IAEnE,MAAMI,SAAAA,GAAYE,8BAAkBH,IAAAA,EAAME,wBAAAA,CAAAA;AAE1C,IAAA,MAAME,iBAAiBT,MAAAA,CAAOU,IAAI,CAACC,GAAG,CAACC,IAAI;IAC3C,MAAMC,aAAAA,GAAgBC,IAAAA,CAAKC,IAAI,CAACf,MAAAA,CAAOU,IAAI,CAACC,GAAG,CAACC,IAAI,EAAE,KAAA,EAAO,OAAA,CAAA;AAE7D,IAAA,MAAMI,uBAAAA,GAA0B;QAC9BC,WAAAA,EAAajB,MAAAA,CAAOE,MAAM,CAACe,WAAW;AACtCC,QAAAA,EAAAA,EAAIA,GAAGC,IAAI,EAAA;AACXC,QAAAA,UAAAA,EAAYF,GAAGG,QAAQ,EAAA;AACvBC,QAAAA,MAAAA,EAAQJ,GAAGK,IAAI,EAAA;AACfC,QAAAA,SAAAA,EAAWN,GAAGO,OAAO,EAAA;QACrBC,WAAAA,EAAaC,OAAAA,CAAQC,QAAQ,CAACC;AAChC,KAAA;AAEA,IAAA,MAAMC,wBAAAA,GAA2B;AAC/BC,QAAAA,MAAAA,EAAQJ,OAAAA,CAAQK,GAAG,CAACC,MAAM,IAAIC,QAAAA,EAAAA;AAC9BC,QAAAA,IAAAA,EAAMC,MAAMD,IAAI;AAChBE,QAAAA,OAAAA,EAASrC,MAAAA,CAAOE,MAAM,CAACoC,GAAG,CAAC,aAAA,CAAA;QAC3BC,qBAAAA,EAAuBC,OAAAA,CAAQC,qBAAqB,CAAChC,cAAAA,CAAAA;QACrDiC,oBAAAA,EAAsBF,OAAAA,CAAQC,qBAAqB,CAAC5B,aAAAA,CAAAA;QACpD8B,SAAAA,EAAWtC,IAAAA;QACXuC,qBAAAA,EAAuBZ,eAAAA,CAAI,kBAAkB,IAAA,CAAA,KAAU;AACzD,KAAA;AAEAlC,IAAAA,4BAAAA,CAA6BgC,wBAAAA,EAA0B9B,MAAAA,CAAAA;IAEvD,OAAO,OAAO6C,OAAeC,OAAAA,GAAmB,EAAE,EAAEC,IAAAA,GAAO,EAAE,GAAA;AAC3D,QAAA,MAAMC,SAASC,mCAAAA,CAAsBjD,MAAAA,CAAAA;AAErC,QAAA,MAAMkD,eAAwC,EAAC;QAC/C,IAAIlD,MAAAA,CAAOmD,EAAE,EAAEC,cAAAA,KAAmBC,aAAarD,MAAAA,CAAOmD,EAAE,EAAEC,cAAAA,KAAmB,IAAA,EAAM;AACjFF,YAAAA,YAAAA,CAAaE,cAAc,GAAGpD,MAAAA,CAAOmD,EAAE,CAACC,cAAc;AACxD,QAAA;QACA,IAAIpD,MAAAA,CAAOmD,EAAE,EAAEG,WAAAA,KAAgBD,aAAarD,MAAAA,CAAOmD,EAAE,EAAEG,WAAAA,KAAgB,IAAA,EAAM;AAC3EJ,YAAAA,YAAAA,CAAaI,WAAW,GAAGtD,MAAAA,CAAOmD,EAAE,CAACG,WAAW;AAClD,QAAA;AAEA,QAAA,MAAMC,SAAAA,GAAY;YAChBC,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAMC,IAAAA,CAAKC,SAAS,CAAC;AACnBd,gBAAAA,KAAAA;AACAG,gBAAAA,MAAAA;AACA1C,gBAAAA,SAAAA;AACAsD,gBAAAA,eAAAA,EAAiBd,QAAQc,eAAe;AACxCC,gBAAAA,cAAAA,EAAgBb,MAAAA,GAAS;AAAE,oBAAA,GAAGhC,uBAAuB;AAAE,oBAAA,GAAG8B,QAAQe;AAAe,iBAAA,GAAI,EAAC;gBACtFC,eAAAA,EAAiB;AACf,oBAAA,GAAGhC,wBAAwB;oBAC3BiC,WAAAA,EAAa/D,MAAAA,CAAOgE,EAAE,GAAG,YAAA,GAAe,WAAA;AACxC,oBAAA,GAAGd,YAAY;AACf,oBAAA,GAAGJ,QAAQgB;AACb;AACF,aAAA,CAAA;YACA,GAAG3D,CAAAA,CAAE8D,KAAK,CAAC;gBAAEpE,OAAAA,EAAS;oBAAE,gBAAA,EAAkBgD;AAAM;AAAE,aAAA,EAAGlD,kBAAkBoD,IAAAA;AACzE,SAAA;QAEA,IAAI;YACF,MAAMmB,YAAAA,GAAelC,gBAAI,sBAAA,EAAwB,6BAAA,CAAA;YACjD,MAAMmC,GAAAA,GAAM,MAAMnE,MAAAA,CAAOoE,KAAK,CAAC,CAAA,EAAGF,YAAAA,CAAa,aAAa,CAAC,EAAEX,SAAAA,CAAAA;AAC/D,YAAA,OAAOY,IAAIE,EAAE;AACf,QAAA,CAAA,CAAE,OAAOC,GAAAA,EAAK;YACZ,OAAO,KAAA;AACT,QAAA;AACF,IAAA,CAAA;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"sender.js","sources":["../../../src/services/metrics/sender.ts"],"sourcesContent":["import os from 'os';\nimport path from 'path';\nimport _ from 'lodash';\nimport isDocker from 'is-docker';\nimport ciEnv from 'ci-info';\nimport { env, generateInstallId } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport { generateAdminUserHash } from './admin-user-hash';\n\n// Lazy: only resolved when telemetry is enabled and a sender is constructed\nlet lazyTsUtils: typeof import('@strapi/typescript-utils') | undefined;\nconst tsUtils = (): typeof import('@strapi/typescript-utils') => {\n if (!lazyTsUtils) {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n lazyTsUtils = require('@strapi/typescript-utils');\n }\n return lazyTsUtils as typeof import('@strapi/typescript-utils');\n};\n\nexport interface Payload {\n eventProperties?: Record<string, unknown>;\n userProperties?: Record<string, unknown>;\n groupProperties?: Record<string, unknown>;\n}\n\nexport type Sender = (\n event: string,\n payload?: Payload,\n opts?: Record<string, unknown>\n) => Promise<boolean>;\n\nconst defaultQueryOpts = {\n timeout: 1000,\n headers: { 'Content-Type': 'application/json' },\n};\n\n/**\n * Add properties from the package.json strapi key in the metadata\n */\nconst addPackageJsonStrapiMetadata = (metadata: Record<string, unknown>, strapi: Core.Strapi) => {\n const { packageJsonStrapi = {} } = strapi.config;\n\n _.defaults(metadata, packageJsonStrapi);\n};\n\n/**\n * Create a send function for event with all the necessary metadata\n */\nexport default (strapi: Core.Strapi): Sender => {\n const { uuid, installId: installIdFromPackageJson } = strapi.config;\n\n const installId = generateInstallId(uuid, installIdFromPackageJson);\n\n const serverRootPath = strapi.dirs.app.root;\n const adminRootPath = path.join(strapi.dirs.app.root, 'src', 'admin');\n\n const anonymousUserProperties = {\n environment: strapi.config.environment,\n os: os.type(),\n osPlatform: os.platform(),\n osArch: os.arch(),\n osRelease: os.release(),\n nodeVersion: process.versions.node,\n };\n\n const anonymousGroupProperties = {\n docker: process.env.DOCKER || isDocker(),\n isCI: ciEnv.isCI,\n version: strapi.config.get('info.strapi'),\n useTypescriptOnServer: tsUtils().isUsingTypeScriptSync(serverRootPath),\n useTypescriptOnAdmin: tsUtils().isUsingTypeScriptSync(adminRootPath),\n projectId: uuid,\n isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud',\n };\n\n addPackageJsonStrapiMetadata(anonymousGroupProperties, strapi);\n\n return async (event: string, payload: Payload = {}, opts = {}) => {\n const userId = generateAdminUserHash(strapi);\n\n const eeGroupProps: Record<string, unknown> = {};\n if (strapi.ee?.subscriptionId !== undefined && strapi.ee?.subscriptionId !== null) {\n eeGroupProps.subscriptionId = strapi.ee.subscriptionId;\n }\n if (strapi.ee?.planPriceId !== undefined && strapi.ee?.planPriceId !== null) {\n eeGroupProps.planPriceId = strapi.ee.planPriceId;\n }\n\n const reqParams = {\n method: 'POST',\n body: JSON.stringify({\n event,\n userId,\n installId,\n eventProperties: payload.eventProperties,\n userProperties: userId ? { ...anonymousUserProperties, ...payload.userProperties } : {},\n groupProperties: {\n ...anonymousGroupProperties,\n projectType: strapi.EE ? 'Enterprise' : 'Community',\n ...eeGroupProps,\n ...payload.groupProperties,\n },\n }),\n ..._.merge({ headers: { 'X-Strapi-Event': event } }, defaultQueryOpts, opts),\n };\n\n try {\n const analyticsUrl = env('STRAPI_ANALYTICS_URL', 'https://analytics.strapi.io');\n const res = await strapi.fetch(`${analyticsUrl}/api/v2/track`, reqParams);\n return res.ok;\n } catch (err) {\n return false;\n }\n };\n};\n"],"names":["lazyTsUtils","tsUtils","require","defaultQueryOpts","timeout","headers","addPackageJsonStrapiMetadata","metadata","strapi","packageJsonStrapi","config","_","defaults","uuid","installId","installIdFromPackageJson","generateInstallId","serverRootPath","dirs","app","root","adminRootPath","path","join","anonymousUserProperties","environment","os","type","osPlatform","platform","osArch","arch","osRelease","release","nodeVersion","process","versions","node","anonymousGroupProperties","docker","env","DOCKER","isDocker","isCI","ciEnv","version","get","useTypescriptOnServer","isUsingTypeScriptSync","useTypescriptOnAdmin","projectId","isHostedOnStrapiCloud","event","payload","opts","userId","generateAdminUserHash","eeGroupProps","ee","subscriptionId","undefined","planPriceId","reqParams","method","body","JSON","stringify","eventProperties","userProperties","groupProperties","projectType","EE","merge","analyticsUrl","res","fetch","ok","err"],"mappings":"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"}
@@ -3,10 +3,18 @@ import path from 'path';
3
3
  import _ from 'lodash';
4
4
  import isDocker from 'is-docker';
5
5
  import ciEnv from 'ci-info';
6
- import tsUtils from '@strapi/typescript-utils';
7
6
  import { generateInstallId, env } from '@strapi/utils';
8
7
  import { generateAdminUserHash } from './admin-user-hash.mjs';
9
8
 
9
+ // Lazy: only resolved when telemetry is enabled and a sender is constructed
10
+ let lazyTsUtils;
11
+ const tsUtils = ()=>{
12
+ if (!lazyTsUtils) {
13
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
14
+ lazyTsUtils = require('@strapi/typescript-utils');
15
+ }
16
+ return lazyTsUtils;
17
+ };
10
18
  const defaultQueryOpts = {
11
19
  timeout: 1000,
12
20
  headers: {
@@ -38,8 +46,8 @@ const defaultQueryOpts = {
38
46
  docker: process.env.DOCKER || isDocker(),
39
47
  isCI: ciEnv.isCI,
40
48
  version: strapi.config.get('info.strapi'),
41
- useTypescriptOnServer: tsUtils.isUsingTypeScriptSync(serverRootPath),
42
- useTypescriptOnAdmin: tsUtils.isUsingTypeScriptSync(adminRootPath),
49
+ useTypescriptOnServer: tsUtils().isUsingTypeScriptSync(serverRootPath),
50
+ useTypescriptOnAdmin: tsUtils().isUsingTypeScriptSync(adminRootPath),
43
51
  projectId: uuid,
44
52
  isHostedOnStrapiCloud: env('STRAPI_HOSTING', null) === 'strapi.cloud'
45
53
  };