@strapi/core 5.50.1 → 5.50.2

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 (56) hide show
  1. package/dist/compile.d.ts +1 -1
  2. package/dist/core-api/routes/validation/common.d.ts +3 -3
  3. package/dist/core-api/routes/validation/common.d.ts.map +1 -1
  4. package/dist/core-api/service/collection-type.d.ts +2 -2
  5. package/dist/core-api/service/single-type.d.ts +2 -2
  6. package/dist/domain/content-type/index.d.ts +1 -1
  7. package/dist/domain/content-type/index.d.ts.map +1 -1
  8. package/dist/domain/content-type/index.js +9 -0
  9. package/dist/domain/content-type/index.js.map +1 -1
  10. package/dist/domain/content-type/index.mjs +9 -0
  11. package/dist/domain/content-type/index.mjs.map +1 -1
  12. package/dist/domain/content-type/validator.d.ts.map +1 -1
  13. package/dist/domain/content-type/validator.js.map +1 -1
  14. package/dist/domain/content-type/validator.mjs.map +1 -1
  15. package/dist/ee/index.js.map +1 -1
  16. package/dist/ee/index.mjs.map +1 -1
  17. package/dist/ee/license.d.ts +1 -1
  18. package/dist/ee/license.d.ts.map +1 -1
  19. package/dist/ee/license.js +51 -8
  20. package/dist/ee/license.js.map +1 -1
  21. package/dist/ee/license.mjs +32 -8
  22. package/dist/ee/license.mjs.map +1 -1
  23. package/dist/package.json.js +17 -15
  24. package/dist/package.json.js.map +1 -1
  25. package/dist/package.json.mjs +17 -15
  26. package/dist/package.json.mjs.map +1 -1
  27. package/dist/services/document-service/attributes/index.d.ts +1 -1
  28. package/dist/services/document-service/attributes/index.d.ts.map +1 -1
  29. package/dist/services/document-service/components.d.ts +2 -2
  30. package/dist/services/document-service/components.d.ts.map +1 -1
  31. package/dist/services/document-service/repository.d.ts.map +1 -1
  32. package/dist/services/document-service/repository.js +31 -11
  33. package/dist/services/document-service/repository.js.map +1 -1
  34. package/dist/services/document-service/repository.mjs +30 -10
  35. package/dist/services/document-service/repository.mjs.map +1 -1
  36. package/dist/services/document-service/utils/clone-relations.d.ts +7 -0
  37. package/dist/services/document-service/utils/clone-relations.d.ts.map +1 -0
  38. package/dist/services/document-service/utils/clone-relations.js +124 -0
  39. package/dist/services/document-service/utils/clone-relations.js.map +1 -0
  40. package/dist/services/document-service/utils/clone-relations.mjs +121 -0
  41. package/dist/services/document-service/utils/clone-relations.mjs.map +1 -0
  42. package/dist/services/mcp/tools/log.d.ts +2 -2
  43. package/dist/services/mcp/tools/log.d.ts.map +1 -1
  44. package/dist/utils/fetch.d.ts +1 -1
  45. package/dist/utils/fetch.d.ts.map +1 -1
  46. package/dist/utils/fetch.js +2 -2
  47. package/dist/utils/fetch.js.map +1 -1
  48. package/dist/utils/fetch.mjs +2 -2
  49. package/dist/utils/fetch.mjs.map +1 -1
  50. package/dist/utils/startup-logger.d.ts.map +1 -1
  51. package/dist/utils/startup-logger.js +8 -2
  52. package/dist/utils/startup-logger.js.map +1 -1
  53. package/dist/utils/startup-logger.mjs +8 -2
  54. package/dist/utils/startup-logger.mjs.map +1 -1
  55. package/dist/utils/transform-content-types-to-models.d.ts +9 -9
  56. package/package.json +17 -15
@@ -3,12 +3,32 @@
3
3
  var fs = require('fs');
4
4
  var path = require('path');
5
5
  var crypto = require('crypto');
6
+ var z = require('zod/v4');
6
7
  var strapiUtils = require('@strapi/utils');
7
8
 
8
9
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
10
 
11
+ function _interopNamespace(e) {
12
+ if (e && e.__esModule) return e;
13
+ var n = Object.create(null);
14
+ if (e) {
15
+ Object.keys(e).forEach(function (k) {
16
+ if (k !== 'default') {
17
+ var d = Object.getOwnPropertyDescriptor(e, k);
18
+ Object.defineProperty(n, k, d.get ? d : {
19
+ enumerable: true,
20
+ get: function () { return e[k]; }
21
+ });
22
+ }
23
+ });
24
+ }
25
+ n.default = e;
26
+ return Object.freeze(n);
27
+ }
28
+
10
29
  var fs__default = /*#__PURE__*/_interopDefault(fs);
11
30
  var crypto__default = /*#__PURE__*/_interopDefault(crypto);
31
+ var z__namespace = /*#__PURE__*/_interopNamespace(z);
12
32
 
13
33
  const DEFAULT_FEATURES = {
14
34
  bronze: [],
@@ -43,6 +63,18 @@ const DEFAULT_FEATURES = {
43
63
  ]
44
64
  };
45
65
  const LICENSE_REGISTRY_URI = 'https://license.strapi.io';
66
+ // Shape of a successful (200) response from the license registry.
67
+ const licenseSuccessSchema = z__namespace.object({
68
+ data: z__namespace.object({
69
+ license: z__namespace.string()
70
+ })
71
+ });
72
+ // Shape of a bad-request (400) response from the license registry.
73
+ const licenseErrorSchema = z__namespace.object({
74
+ error: z__namespace.object({
75
+ message: z__namespace.string()
76
+ })
77
+ });
46
78
  const publicKey = fs__default.default.readFileSync(path.resolve(__dirname, '../../resources/key.pub'));
47
79
  class LicenseCheckError extends Error {
48
80
  constructor(message, shouldFallback = false){
@@ -83,8 +115,11 @@ const verifyLicense = (license)=>{
83
115
  Object.freeze(licenseInfo.features);
84
116
  return licenseInfo;
85
117
  };
86
- const throwError = ()=>{
87
- throw new LicenseCheckError('Could not proceed to the online validation of your license.', true);
118
+ const createShouldFallbackError = ()=>{
119
+ return new LicenseCheckError('Could not proceed to the online validation of your license.', true);
120
+ };
121
+ const throwShouldFallbackError = ()=>{
122
+ throw createShouldFallbackError();
88
123
  };
89
124
  const fetchLicense = async ({ strapi }, key, projectId)=>{
90
125
  const { installId: installIdFromPackageJson } = strapi.config;
@@ -98,22 +133,30 @@ const fetchLicense = async ({ strapi }, key, projectId)=>{
98
133
  projectId,
99
134
  deviceId: strapiUtils.generateInstallId(projectId, installIdFromPackageJson)
100
135
  })
101
- }).catch(throwError);
136
+ }).catch(throwShouldFallbackError);
102
137
  const contentType = response.headers.get('Content-Type');
103
138
  if (contentType?.includes('application/json')) {
104
- const { data, error } = await response.json();
139
+ const body = await response.json();
105
140
  switch(response.status){
106
141
  case 200:
107
- return data.license;
142
+ {
143
+ const result = licenseSuccessSchema.safeParse(body);
144
+ if (!result.success) throw createShouldFallbackError();
145
+ return result.data.data.license;
146
+ }
108
147
  case 400:
109
- throw new LicenseCheckError(error.message);
148
+ {
149
+ const result = licenseErrorSchema.safeParse(body);
150
+ if (!result.success) throw createShouldFallbackError();
151
+ throw new LicenseCheckError(result.data.error.message);
152
+ }
110
153
  case 404:
111
154
  throw new LicenseCheckError('The license used does not exists.');
112
155
  default:
113
- throwError();
156
+ throw createShouldFallbackError();
114
157
  }
115
158
  } else {
116
- throwError();
159
+ throw createShouldFallbackError();
117
160
  }
118
161
  };
119
162
 
@@ -1 +1 @@
1
- {"version":3,"file":"license.js","sources":["../../src/ee/license.ts"],"sourcesContent":["import fs from 'fs';\nimport { join, resolve } from 'path';\nimport crypto from 'crypto';\nimport type { Core } from '@strapi/types';\n\nimport { generateInstallId } from '@strapi/utils';\n\ninterface LicenseInfo {\n type: 'bronze' | 'silver' | 'gold';\n isTrial: boolean;\n expireAt?: string;\n seats?: number;\n features?: Array<{ name: string; options?: Record<string, unknown> }>;\n subscriptionId?: string;\n planPriceId?: string;\n}\n\nconst DEFAULT_FEATURES = {\n bronze: [],\n silver: [],\n gold: [\n { name: 'sso' },\n // Set a null retention duration to allow the user to override it\n // The default of 90 days is set in the audit logs service\n { name: 'audit-logs', options: { retentionDays: null } },\n { name: 'review-workflows' },\n { name: 'cms-content-releases' },\n { name: 'cms-content-history', options: { retentionDays: 99999 } },\n { name: 'cms-advanced-preview' },\n ],\n};\n\nconst LICENSE_REGISTRY_URI = 'https://license.strapi.io';\n\nconst publicKey = fs.readFileSync(resolve(__dirname, '../../resources/key.pub'));\n\nclass LicenseCheckError extends Error {\n shouldFallback = false;\n\n constructor(message: string, shouldFallback = false) {\n super(message);\n\n this.shouldFallback = shouldFallback;\n }\n}\n\nconst readLicense = (directory: string) => {\n try {\n const path = join(directory, 'license.txt');\n return fs.readFileSync(path).toString();\n } catch (error) {\n if (typeof error === 'object' && error !== null && 'code' in error && error.code !== 'ENOENT') {\n throw Error('License file not readable, review its format and access rules.');\n }\n }\n};\n\nconst verifyLicense = (license: string) => {\n const [signature, base64Content] = Buffer.from(license, 'base64').toString().split('\\n');\n\n if (!signature || !base64Content) {\n throw new Error('Invalid license.');\n }\n\n const stringifiedContent = Buffer.from(base64Content, 'base64').toString();\n\n const verify = crypto.createVerify('RSA-SHA256');\n verify.update(stringifiedContent);\n verify.end();\n\n const verified = verify.verify(publicKey, signature, 'base64');\n\n if (!verified) {\n throw new Error('Invalid license.');\n }\n\n const licenseInfo: LicenseInfo = JSON.parse(stringifiedContent);\n\n if (!licenseInfo.features) {\n licenseInfo.features = DEFAULT_FEATURES[licenseInfo.type];\n }\n\n if (!licenseInfo.isTrial) {\n licenseInfo.isTrial = false;\n }\n\n Object.freeze(licenseInfo.features);\n return licenseInfo;\n};\n\nconst throwError = () => {\n throw new LicenseCheckError('Could not proceed to the online validation of your license.', true);\n};\n\nconst fetchLicense = async (\n { strapi }: { strapi: Core.Strapi },\n key: string,\n projectId: string\n) => {\n const { installId: installIdFromPackageJson } = strapi.config;\n\n const response = await strapi\n .fetch(`${LICENSE_REGISTRY_URI}/api/licenses/validate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n key,\n projectId,\n deviceId: generateInstallId(projectId, installIdFromPackageJson),\n }), // NOTE: Doing nothing on the LR with the installId\n })\n .catch(throwError);\n\n const contentType = response.headers.get('Content-Type');\n\n if (contentType?.includes('application/json')) {\n const { data, error } = await response.json();\n\n switch (response.status) {\n case 200:\n return data.license;\n case 400:\n throw new LicenseCheckError(error.message);\n case 404:\n throw new LicenseCheckError('The license used does not exists.');\n default:\n throwError();\n }\n } else {\n throwError();\n }\n};\n\nexport { readLicense, verifyLicense, fetchLicense, LicenseCheckError, LICENSE_REGISTRY_URI };\n"],"names":["DEFAULT_FEATURES","bronze","silver","gold","name","options","retentionDays","LICENSE_REGISTRY_URI","publicKey","fs","readFileSync","resolve","__dirname","LicenseCheckError","Error","message","shouldFallback","readLicense","directory","path","join","toString","error","code","verifyLicense","license","signature","base64Content","Buffer","from","split","stringifiedContent","verify","crypto","createVerify","update","end","verified","licenseInfo","JSON","parse","features","type","isTrial","Object","freeze","throwError","fetchLicense","strapi","key","projectId","installId","installIdFromPackageJson","config","response","fetch","method","headers","body","stringify","deviceId","generateInstallId","catch","contentType","get","includes","data","json","status"],"mappings":";;;;;;;;;;;;AAiBA,MAAMA,gBAAAA,GAAmB;AACvBC,IAAAA,MAAAA,EAAQ,EAAE;AACVC,IAAAA,MAAAA,EAAQ,EAAE;IACVC,IAAAA,EAAM;AACJ,QAAA;YAAEC,IAAAA,EAAM;AAAM,SAAA;;;AAGd,QAAA;YAAEA,IAAAA,EAAM,YAAA;YAAcC,OAAAA,EAAS;gBAAEC,aAAAA,EAAe;AAAK;AAAE,SAAA;AACvD,QAAA;YAAEF,IAAAA,EAAM;AAAmB,SAAA;AAC3B,QAAA;YAAEA,IAAAA,EAAM;AAAuB,SAAA;AAC/B,QAAA;YAAEA,IAAAA,EAAM,qBAAA;YAAuBC,OAAAA,EAAS;gBAAEC,aAAAA,EAAe;AAAM;AAAE,SAAA;AACjE,QAAA;YAAEF,IAAAA,EAAM;AAAuB;AAChC;AACH,CAAA;AAEA,MAAMG,oBAAAA,GAAuB;AAE7B,MAAMC,SAAAA,GAAYC,mBAAAA,CAAGC,YAAY,CAACC,aAAQC,SAAAA,EAAW,yBAAA,CAAA,CAAA;AAErD,MAAMC,iBAAAA,SAA0BC,KAAAA,CAAAA;AAG9B,IAAA,WAAA,CAAYC,OAAe,EAAEC,cAAAA,GAAiB,KAAK,CAAE;QACnD,KAAK,CAACD,eAHRC,cAAAA,GAAiB,KAAA;QAKf,IAAI,CAACA,cAAc,GAAGA,cAAAA;AACxB,IAAA;AACF;AAEA,MAAMC,cAAc,CAACC,SAAAA,GAAAA;IACnB,IAAI;QACF,MAAMC,MAAAA,GAAOC,UAAKF,SAAAA,EAAW,aAAA,CAAA;AAC7B,QAAA,OAAOT,mBAAAA,CAAGC,YAAY,CAACS,MAAAA,CAAAA,CAAME,QAAQ,EAAA;AACvC,IAAA,CAAA,CAAE,OAAOC,KAAAA,EAAO;QACd,IAAI,OAAOA,KAAAA,KAAU,QAAA,IAAYA,KAAAA,KAAU,IAAA,IAAQ,UAAUA,KAAAA,IAASA,KAAAA,CAAMC,IAAI,KAAK,QAAA,EAAU;AAC7F,YAAA,MAAMT,KAAAA,CAAM,gEAAA,CAAA;AACd,QAAA;AACF,IAAA;AACF;AAEA,MAAMU,gBAAgB,CAACC,OAAAA,GAAAA;AACrB,IAAA,MAAM,CAACC,SAAAA,EAAWC,aAAAA,CAAc,GAAGC,MAAAA,CAAOC,IAAI,CAACJ,OAAAA,EAAS,QAAA,CAAA,CAAUJ,QAAQ,EAAA,CAAGS,KAAK,CAAC,IAAA,CAAA;IAEnF,IAAI,CAACJ,SAAAA,IAAa,CAACC,aAAAA,EAAe;AAChC,QAAA,MAAM,IAAIb,KAAAA,CAAM,kBAAA,CAAA;AAClB,IAAA;AAEA,IAAA,MAAMiB,qBAAqBH,MAAAA,CAAOC,IAAI,CAACF,aAAAA,EAAe,UAAUN,QAAQ,EAAA;IAExE,MAAMW,MAAAA,GAASC,uBAAAA,CAAOC,YAAY,CAAC,YAAA,CAAA;AACnCF,IAAAA,MAAAA,CAAOG,MAAM,CAACJ,kBAAAA,CAAAA;AACdC,IAAAA,MAAAA,CAAOI,GAAG,EAAA;AAEV,IAAA,MAAMC,QAAAA,GAAWL,MAAAA,CAAOA,MAAM,CAACxB,WAAWkB,SAAAA,EAAW,QAAA,CAAA;AAErD,IAAA,IAAI,CAACW,QAAAA,EAAU;AACb,QAAA,MAAM,IAAIvB,KAAAA,CAAM,kBAAA,CAAA;AAClB,IAAA;IAEA,MAAMwB,WAAAA,GAA2BC,IAAAA,CAAKC,KAAK,CAACT,kBAAAA,CAAAA;IAE5C,IAAI,CAACO,WAAAA,CAAYG,QAAQ,EAAE;AACzBH,QAAAA,WAAAA,CAAYG,QAAQ,GAAGzC,gBAAgB,CAACsC,WAAAA,CAAYI,IAAI,CAAC;AAC3D,IAAA;IAEA,IAAI,CAACJ,WAAAA,CAAYK,OAAO,EAAE;AACxBL,QAAAA,WAAAA,CAAYK,OAAO,GAAG,KAAA;AACxB,IAAA;IAEAC,MAAAA,CAAOC,MAAM,CAACP,WAAAA,CAAYG,QAAQ,CAAA;IAClC,OAAOH,WAAAA;AACT;AAEA,MAAMQ,UAAAA,GAAa,IAAA;IACjB,MAAM,IAAIjC,kBAAkB,6DAAA,EAA+D,IAAA,CAAA;AAC7F,CAAA;AAEA,MAAMkC,eAAe,OACnB,EAAEC,MAAM,EAA2B,EACnCC,GAAAA,EACAC,SAAAA,GAAAA;AAEA,IAAA,MAAM,EAAEC,SAAAA,EAAWC,wBAAwB,EAAE,GAAGJ,OAAOK,MAAM;IAE7D,MAAMC,QAAAA,GAAW,MAAMN,MAAAA,CACpBO,KAAK,CAAC,CAAA,EAAGhD,oBAAAA,CAAqB,sBAAsB,CAAC,EAAE;QACtDiD,MAAAA,EAAQ,MAAA;QACRC,OAAAA,EAAS;YAAE,cAAA,EAAgB;AAAmB,SAAA;QAC9CC,IAAAA,EAAMnB,IAAAA,CAAKoB,SAAS,CAAC;AACnBV,YAAAA,GAAAA;AACAC,YAAAA,SAAAA;AACAU,YAAAA,QAAAA,EAAUC,8BAAkBX,SAAAA,EAAWE,wBAAAA;AACzC,SAAA;AACF,KAAA,CAAA,CACCU,KAAK,CAAChB,UAAAA,CAAAA;AAET,IAAA,MAAMiB,WAAAA,GAAcT,QAAAA,CAASG,OAAO,CAACO,GAAG,CAAC,cAAA,CAAA;IAEzC,IAAID,WAAAA,EAAaE,SAAS,kBAAA,CAAA,EAAqB;QAC7C,MAAM,EAAEC,IAAI,EAAE5C,KAAK,EAAE,GAAG,MAAMgC,SAASa,IAAI,EAAA;AAE3C,QAAA,OAAQb,SAASc,MAAM;YACrB,KAAK,GAAA;AACH,gBAAA,OAAOF,KAAKzC,OAAO;YACrB,KAAK,GAAA;gBACH,MAAM,IAAIZ,iBAAAA,CAAkBS,KAAAA,CAAMP,OAAO,CAAA;YAC3C,KAAK,GAAA;AACH,gBAAA,MAAM,IAAIF,iBAAAA,CAAkB,mCAAA,CAAA;AAC9B,YAAA;AACEiC,gBAAAA,UAAAA,EAAAA;AACJ;IACF,CAAA,MAAO;AACLA,QAAAA,UAAAA,EAAAA;AACF,IAAA;AACF;;;;;;;;"}
1
+ {"version":3,"file":"license.js","sources":["../../src/ee/license.ts"],"sourcesContent":["import fs from 'fs';\nimport { join, resolve } from 'path';\nimport crypto from 'crypto';\nimport * as z from 'zod/v4';\nimport type { Core } from '@strapi/types';\n\nimport { generateInstallId } from '@strapi/utils';\n\ninterface LicenseInfo {\n type: 'bronze' | 'silver' | 'gold';\n isTrial: boolean;\n expireAt?: string;\n seats?: number;\n features?: Array<{ name: string; options?: Record<string, unknown> }>;\n subscriptionId?: string;\n planPriceId?: string;\n}\n\nconst DEFAULT_FEATURES = {\n bronze: [],\n silver: [],\n gold: [\n { name: 'sso' },\n // Set a null retention duration to allow the user to override it\n // The default of 90 days is set in the audit logs service\n { name: 'audit-logs', options: { retentionDays: null } },\n { name: 'review-workflows' },\n { name: 'cms-content-releases' },\n { name: 'cms-content-history', options: { retentionDays: 99999 } },\n { name: 'cms-advanced-preview' },\n ],\n};\n\nconst LICENSE_REGISTRY_URI = 'https://license.strapi.io';\n\n// Shape of a successful (200) response from the license registry.\nconst licenseSuccessSchema = z.object({\n data: z.object({\n license: z.string(),\n }),\n});\n\n// Shape of a bad-request (400) response from the license registry.\nconst licenseErrorSchema = z.object({\n error: z.object({\n message: z.string(),\n }),\n});\n\nconst publicKey = fs.readFileSync(resolve(__dirname, '../../resources/key.pub'));\n\nclass LicenseCheckError extends Error {\n shouldFallback = false;\n\n constructor(message: string, shouldFallback = false) {\n super(message);\n\n this.shouldFallback = shouldFallback;\n }\n}\n\nconst readLicense = (directory: string) => {\n try {\n const path = join(directory, 'license.txt');\n return fs.readFileSync(path).toString();\n } catch (error) {\n if (typeof error === 'object' && error !== null && 'code' in error && error.code !== 'ENOENT') {\n throw Error('License file not readable, review its format and access rules.');\n }\n }\n};\n\nconst verifyLicense = (license: string) => {\n const [signature, base64Content] = Buffer.from(license, 'base64').toString().split('\\n');\n\n if (!signature || !base64Content) {\n throw new Error('Invalid license.');\n }\n\n const stringifiedContent = Buffer.from(base64Content, 'base64').toString();\n\n const verify = crypto.createVerify('RSA-SHA256');\n verify.update(stringifiedContent);\n verify.end();\n\n const verified = verify.verify(publicKey, signature, 'base64');\n\n if (!verified) {\n throw new Error('Invalid license.');\n }\n\n const licenseInfo: LicenseInfo = JSON.parse(stringifiedContent);\n\n if (!licenseInfo.features) {\n licenseInfo.features = DEFAULT_FEATURES[licenseInfo.type];\n }\n\n if (!licenseInfo.isTrial) {\n licenseInfo.isTrial = false;\n }\n\n Object.freeze(licenseInfo.features);\n return licenseInfo;\n};\n\nconst createShouldFallbackError = () => {\n return new LicenseCheckError('Could not proceed to the online validation of your license.', true);\n};\n\nconst throwShouldFallbackError = () => {\n throw createShouldFallbackError();\n};\n\nconst fetchLicense = async (\n { strapi }: { strapi: Core.Strapi },\n key: string,\n projectId: string\n) => {\n const { installId: installIdFromPackageJson } = strapi.config;\n\n const response = await strapi\n .fetch(`${LICENSE_REGISTRY_URI}/api/licenses/validate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n key,\n projectId,\n deviceId: generateInstallId(projectId, installIdFromPackageJson),\n }), // NOTE: Doing nothing on the LR with the installId\n })\n .catch(throwShouldFallbackError);\n\n const contentType = response.headers.get('Content-Type');\n\n if (contentType?.includes('application/json')) {\n const body = await response.json();\n\n switch (response.status) {\n case 200: {\n const result = licenseSuccessSchema.safeParse(body);\n if (!result.success) throw createShouldFallbackError();\n return result.data.data.license;\n }\n case 400: {\n const result = licenseErrorSchema.safeParse(body);\n if (!result.success) throw createShouldFallbackError();\n throw new LicenseCheckError(result.data.error.message);\n }\n case 404:\n throw new LicenseCheckError('The license used does not exists.');\n default:\n throw createShouldFallbackError();\n }\n } else {\n throw createShouldFallbackError();\n }\n};\n\nexport { readLicense, verifyLicense, fetchLicense, LicenseCheckError, LICENSE_REGISTRY_URI };\n"],"names":["DEFAULT_FEATURES","bronze","silver","gold","name","options","retentionDays","LICENSE_REGISTRY_URI","licenseSuccessSchema","z","object","data","license","string","licenseErrorSchema","error","message","publicKey","fs","readFileSync","resolve","__dirname","LicenseCheckError","Error","shouldFallback","readLicense","directory","path","join","toString","code","verifyLicense","signature","base64Content","Buffer","from","split","stringifiedContent","verify","crypto","createVerify","update","end","verified","licenseInfo","JSON","parse","features","type","isTrial","Object","freeze","createShouldFallbackError","throwShouldFallbackError","fetchLicense","strapi","key","projectId","installId","installIdFromPackageJson","config","response","fetch","method","headers","body","stringify","deviceId","generateInstallId","catch","contentType","get","includes","json","status","result","safeParse","success"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import fs from 'fs';
2
2
  import { resolve, join } from 'path';
3
3
  import crypto from 'crypto';
4
+ import * as z from 'zod/v4';
4
5
  import { generateInstallId } from '@strapi/utils';
5
6
 
6
7
  const DEFAULT_FEATURES = {
@@ -36,6 +37,18 @@ const DEFAULT_FEATURES = {
36
37
  ]
37
38
  };
38
39
  const LICENSE_REGISTRY_URI = 'https://license.strapi.io';
40
+ // Shape of a successful (200) response from the license registry.
41
+ const licenseSuccessSchema = z.object({
42
+ data: z.object({
43
+ license: z.string()
44
+ })
45
+ });
46
+ // Shape of a bad-request (400) response from the license registry.
47
+ const licenseErrorSchema = z.object({
48
+ error: z.object({
49
+ message: z.string()
50
+ })
51
+ });
39
52
  const publicKey = fs.readFileSync(resolve(__dirname, '../../resources/key.pub'));
40
53
  class LicenseCheckError extends Error {
41
54
  constructor(message, shouldFallback = false){
@@ -76,8 +89,11 @@ const verifyLicense = (license)=>{
76
89
  Object.freeze(licenseInfo.features);
77
90
  return licenseInfo;
78
91
  };
79
- const throwError = ()=>{
80
- throw new LicenseCheckError('Could not proceed to the online validation of your license.', true);
92
+ const createShouldFallbackError = ()=>{
93
+ return new LicenseCheckError('Could not proceed to the online validation of your license.', true);
94
+ };
95
+ const throwShouldFallbackError = ()=>{
96
+ throw createShouldFallbackError();
81
97
  };
82
98
  const fetchLicense = async ({ strapi }, key, projectId)=>{
83
99
  const { installId: installIdFromPackageJson } = strapi.config;
@@ -91,22 +107,30 @@ const fetchLicense = async ({ strapi }, key, projectId)=>{
91
107
  projectId,
92
108
  deviceId: generateInstallId(projectId, installIdFromPackageJson)
93
109
  })
94
- }).catch(throwError);
110
+ }).catch(throwShouldFallbackError);
95
111
  const contentType = response.headers.get('Content-Type');
96
112
  if (contentType?.includes('application/json')) {
97
- const { data, error } = await response.json();
113
+ const body = await response.json();
98
114
  switch(response.status){
99
115
  case 200:
100
- return data.license;
116
+ {
117
+ const result = licenseSuccessSchema.safeParse(body);
118
+ if (!result.success) throw createShouldFallbackError();
119
+ return result.data.data.license;
120
+ }
101
121
  case 400:
102
- throw new LicenseCheckError(error.message);
122
+ {
123
+ const result = licenseErrorSchema.safeParse(body);
124
+ if (!result.success) throw createShouldFallbackError();
125
+ throw new LicenseCheckError(result.data.error.message);
126
+ }
103
127
  case 404:
104
128
  throw new LicenseCheckError('The license used does not exists.');
105
129
  default:
106
- throwError();
130
+ throw createShouldFallbackError();
107
131
  }
108
132
  } else {
109
- throwError();
133
+ throw createShouldFallbackError();
110
134
  }
111
135
  };
112
136
 
@@ -1 +1 @@
1
- {"version":3,"file":"license.mjs","sources":["../../src/ee/license.ts"],"sourcesContent":["import fs from 'fs';\nimport { join, resolve } from 'path';\nimport crypto from 'crypto';\nimport type { Core } from '@strapi/types';\n\nimport { generateInstallId } from '@strapi/utils';\n\ninterface LicenseInfo {\n type: 'bronze' | 'silver' | 'gold';\n isTrial: boolean;\n expireAt?: string;\n seats?: number;\n features?: Array<{ name: string; options?: Record<string, unknown> }>;\n subscriptionId?: string;\n planPriceId?: string;\n}\n\nconst DEFAULT_FEATURES = {\n bronze: [],\n silver: [],\n gold: [\n { name: 'sso' },\n // Set a null retention duration to allow the user to override it\n // The default of 90 days is set in the audit logs service\n { name: 'audit-logs', options: { retentionDays: null } },\n { name: 'review-workflows' },\n { name: 'cms-content-releases' },\n { name: 'cms-content-history', options: { retentionDays: 99999 } },\n { name: 'cms-advanced-preview' },\n ],\n};\n\nconst LICENSE_REGISTRY_URI = 'https://license.strapi.io';\n\nconst publicKey = fs.readFileSync(resolve(__dirname, '../../resources/key.pub'));\n\nclass LicenseCheckError extends Error {\n shouldFallback = false;\n\n constructor(message: string, shouldFallback = false) {\n super(message);\n\n this.shouldFallback = shouldFallback;\n }\n}\n\nconst readLicense = (directory: string) => {\n try {\n const path = join(directory, 'license.txt');\n return fs.readFileSync(path).toString();\n } catch (error) {\n if (typeof error === 'object' && error !== null && 'code' in error && error.code !== 'ENOENT') {\n throw Error('License file not readable, review its format and access rules.');\n }\n }\n};\n\nconst verifyLicense = (license: string) => {\n const [signature, base64Content] = Buffer.from(license, 'base64').toString().split('\\n');\n\n if (!signature || !base64Content) {\n throw new Error('Invalid license.');\n }\n\n const stringifiedContent = Buffer.from(base64Content, 'base64').toString();\n\n const verify = crypto.createVerify('RSA-SHA256');\n verify.update(stringifiedContent);\n verify.end();\n\n const verified = verify.verify(publicKey, signature, 'base64');\n\n if (!verified) {\n throw new Error('Invalid license.');\n }\n\n const licenseInfo: LicenseInfo = JSON.parse(stringifiedContent);\n\n if (!licenseInfo.features) {\n licenseInfo.features = DEFAULT_FEATURES[licenseInfo.type];\n }\n\n if (!licenseInfo.isTrial) {\n licenseInfo.isTrial = false;\n }\n\n Object.freeze(licenseInfo.features);\n return licenseInfo;\n};\n\nconst throwError = () => {\n throw new LicenseCheckError('Could not proceed to the online validation of your license.', true);\n};\n\nconst fetchLicense = async (\n { strapi }: { strapi: Core.Strapi },\n key: string,\n projectId: string\n) => {\n const { installId: installIdFromPackageJson } = strapi.config;\n\n const response = await strapi\n .fetch(`${LICENSE_REGISTRY_URI}/api/licenses/validate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n key,\n projectId,\n deviceId: generateInstallId(projectId, installIdFromPackageJson),\n }), // NOTE: Doing nothing on the LR with the installId\n })\n .catch(throwError);\n\n const contentType = response.headers.get('Content-Type');\n\n if (contentType?.includes('application/json')) {\n const { data, error } = await response.json();\n\n switch (response.status) {\n case 200:\n return data.license;\n case 400:\n throw new LicenseCheckError(error.message);\n case 404:\n throw new LicenseCheckError('The license used does not exists.');\n default:\n throwError();\n }\n } else {\n throwError();\n }\n};\n\nexport { readLicense, verifyLicense, fetchLicense, LicenseCheckError, LICENSE_REGISTRY_URI };\n"],"names":["DEFAULT_FEATURES","bronze","silver","gold","name","options","retentionDays","LICENSE_REGISTRY_URI","publicKey","fs","readFileSync","resolve","__dirname","LicenseCheckError","Error","message","shouldFallback","readLicense","directory","path","join","toString","error","code","verifyLicense","license","signature","base64Content","Buffer","from","split","stringifiedContent","verify","crypto","createVerify","update","end","verified","licenseInfo","JSON","parse","features","type","isTrial","Object","freeze","throwError","fetchLicense","strapi","key","projectId","installId","installIdFromPackageJson","config","response","fetch","method","headers","body","stringify","deviceId","generateInstallId","catch","contentType","get","includes","data","json","status"],"mappings":"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"}
1
+ {"version":3,"file":"license.mjs","sources":["../../src/ee/license.ts"],"sourcesContent":["import fs from 'fs';\nimport { join, resolve } from 'path';\nimport crypto from 'crypto';\nimport * as z from 'zod/v4';\nimport type { Core } from '@strapi/types';\n\nimport { generateInstallId } from '@strapi/utils';\n\ninterface LicenseInfo {\n type: 'bronze' | 'silver' | 'gold';\n isTrial: boolean;\n expireAt?: string;\n seats?: number;\n features?: Array<{ name: string; options?: Record<string, unknown> }>;\n subscriptionId?: string;\n planPriceId?: string;\n}\n\nconst DEFAULT_FEATURES = {\n bronze: [],\n silver: [],\n gold: [\n { name: 'sso' },\n // Set a null retention duration to allow the user to override it\n // The default of 90 days is set in the audit logs service\n { name: 'audit-logs', options: { retentionDays: null } },\n { name: 'review-workflows' },\n { name: 'cms-content-releases' },\n { name: 'cms-content-history', options: { retentionDays: 99999 } },\n { name: 'cms-advanced-preview' },\n ],\n};\n\nconst LICENSE_REGISTRY_URI = 'https://license.strapi.io';\n\n// Shape of a successful (200) response from the license registry.\nconst licenseSuccessSchema = z.object({\n data: z.object({\n license: z.string(),\n }),\n});\n\n// Shape of a bad-request (400) response from the license registry.\nconst licenseErrorSchema = z.object({\n error: z.object({\n message: z.string(),\n }),\n});\n\nconst publicKey = fs.readFileSync(resolve(__dirname, '../../resources/key.pub'));\n\nclass LicenseCheckError extends Error {\n shouldFallback = false;\n\n constructor(message: string, shouldFallback = false) {\n super(message);\n\n this.shouldFallback = shouldFallback;\n }\n}\n\nconst readLicense = (directory: string) => {\n try {\n const path = join(directory, 'license.txt');\n return fs.readFileSync(path).toString();\n } catch (error) {\n if (typeof error === 'object' && error !== null && 'code' in error && error.code !== 'ENOENT') {\n throw Error('License file not readable, review its format and access rules.');\n }\n }\n};\n\nconst verifyLicense = (license: string) => {\n const [signature, base64Content] = Buffer.from(license, 'base64').toString().split('\\n');\n\n if (!signature || !base64Content) {\n throw new Error('Invalid license.');\n }\n\n const stringifiedContent = Buffer.from(base64Content, 'base64').toString();\n\n const verify = crypto.createVerify('RSA-SHA256');\n verify.update(stringifiedContent);\n verify.end();\n\n const verified = verify.verify(publicKey, signature, 'base64');\n\n if (!verified) {\n throw new Error('Invalid license.');\n }\n\n const licenseInfo: LicenseInfo = JSON.parse(stringifiedContent);\n\n if (!licenseInfo.features) {\n licenseInfo.features = DEFAULT_FEATURES[licenseInfo.type];\n }\n\n if (!licenseInfo.isTrial) {\n licenseInfo.isTrial = false;\n }\n\n Object.freeze(licenseInfo.features);\n return licenseInfo;\n};\n\nconst createShouldFallbackError = () => {\n return new LicenseCheckError('Could not proceed to the online validation of your license.', true);\n};\n\nconst throwShouldFallbackError = () => {\n throw createShouldFallbackError();\n};\n\nconst fetchLicense = async (\n { strapi }: { strapi: Core.Strapi },\n key: string,\n projectId: string\n) => {\n const { installId: installIdFromPackageJson } = strapi.config;\n\n const response = await strapi\n .fetch(`${LICENSE_REGISTRY_URI}/api/licenses/validate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n key,\n projectId,\n deviceId: generateInstallId(projectId, installIdFromPackageJson),\n }), // NOTE: Doing nothing on the LR with the installId\n })\n .catch(throwShouldFallbackError);\n\n const contentType = response.headers.get('Content-Type');\n\n if (contentType?.includes('application/json')) {\n const body = await response.json();\n\n switch (response.status) {\n case 200: {\n const result = licenseSuccessSchema.safeParse(body);\n if (!result.success) throw createShouldFallbackError();\n return result.data.data.license;\n }\n case 400: {\n const result = licenseErrorSchema.safeParse(body);\n if (!result.success) throw createShouldFallbackError();\n throw new LicenseCheckError(result.data.error.message);\n }\n case 404:\n throw new LicenseCheckError('The license used does not exists.');\n default:\n throw createShouldFallbackError();\n }\n } else {\n throw createShouldFallbackError();\n }\n};\n\nexport { readLicense, verifyLicense, fetchLicense, LicenseCheckError, LICENSE_REGISTRY_URI };\n"],"names":["DEFAULT_FEATURES","bronze","silver","gold","name","options","retentionDays","LICENSE_REGISTRY_URI","licenseSuccessSchema","z","object","data","license","string","licenseErrorSchema","error","message","publicKey","fs","readFileSync","resolve","__dirname","LicenseCheckError","Error","shouldFallback","readLicense","directory","path","join","toString","code","verifyLicense","signature","base64Content","Buffer","from","split","stringifiedContent","verify","crypto","createVerify","update","end","verified","licenseInfo","JSON","parse","features","type","isTrial","Object","freeze","createShouldFallbackError","throwShouldFallbackError","fetchLicense","strapi","key","projectId","installId","installIdFromPackageJson","config","response","fetch","method","headers","body","stringify","deviceId","generateInstallId","catch","contentType","get","includes","json","status","result","safeParse","success"],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var name = "@strapi/core";
6
- var version = "5.50.1";
6
+ var version = "5.50.2";
7
7
  var description = "Core of Strapi";
8
8
  var homepage = "https://strapi.io";
9
9
  var bugs = {
@@ -51,8 +51,9 @@ var scripts = {
51
51
  "build:types": "run -T tsc -p tsconfig.build.json --emitDeclarationOnly",
52
52
  watch: "run -T rollup -c -w",
53
53
  clean: "run -T rimraf ./dist",
54
- lint: "run -T eslint .",
54
+ lint: "run -T eslint . --max-warnings=0",
55
55
  prepublishOnly: "yarn clean && yarn build",
56
+ "test:ts": "run -T tsc -p tsconfig.json",
56
57
  "test:unit": "run -T jest",
57
58
  "test:unit:watch": "run -T jest --watch",
58
59
  "test:unit:vitest": "vitest run",
@@ -64,15 +65,15 @@ var dependencies = {
64
65
  "@koa/router": "12.0.2",
65
66
  "@modelcontextprotocol/sdk": "1.29.0",
66
67
  "@paralleldrive/cuid2": "2.2.2",
67
- "@strapi/admin": "5.50.1",
68
- "@strapi/database": "5.50.1",
69
- "@strapi/generators": "5.50.1",
70
- "@strapi/logger": "5.50.1",
71
- "@strapi/openapi": "5.50.1",
72
- "@strapi/permissions": "5.50.1",
73
- "@strapi/types": "5.50.1",
74
- "@strapi/typescript-utils": "5.50.1",
75
- "@strapi/utils": "5.50.1",
68
+ "@strapi/admin": "5.50.2",
69
+ "@strapi/database": "5.50.2",
70
+ "@strapi/generators": "5.50.2",
71
+ "@strapi/logger": "5.50.2",
72
+ "@strapi/openapi": "5.50.2",
73
+ "@strapi/permissions": "5.50.2",
74
+ "@strapi/types": "5.50.2",
75
+ "@strapi/typescript-utils": "5.50.2",
76
+ "@strapi/utils": "5.50.2",
76
77
  "@vercel/stega": "0.1.2",
77
78
  bcryptjs: "2.4.3",
78
79
  boxen: "5.1.2",
@@ -93,7 +94,7 @@ var dependencies = {
93
94
  inquirer: "9.3.8",
94
95
  "is-docker": "2.2.1",
95
96
  "json-logic-js": "2.0.5",
96
- jsonwebtoken: "9.0.0",
97
+ jsonwebtoken: "9.0.3",
97
98
  koa: "2.16.4",
98
99
  "koa-body": "6.0.1",
99
100
  "koa-compose": "4.1.0",
@@ -136,11 +137,12 @@ var devDependencies = {
136
137
  "@types/mime-types": "2.1.1",
137
138
  "@types/node": "20.19.41",
138
139
  "@types/node-schedule": "2.1.7",
139
- "eslint-config-custom": "5.50.1",
140
+ "eslint-config-custom": "5.50.2",
141
+ jest: "29.6.0",
140
142
  supertest: "7.2.2",
141
- tsconfig: "5.50.1",
143
+ tsconfig: "5.50.2",
142
144
  vitest: "catalog:",
143
- "vitest-config": "5.50.1"
145
+ "vitest-config": "5.50.2"
144
146
  };
145
147
  var engines = {
146
148
  node: ">=20.0.0 <=26.x.x",
@@ -1 +1 @@
1
- {"version":3,"file":"package.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"package.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,5 +1,5 @@
1
1
  var name = "@strapi/core";
2
- var version = "5.50.1";
2
+ var version = "5.50.2";
3
3
  var description = "Core of Strapi";
4
4
  var homepage = "https://strapi.io";
5
5
  var bugs = {
@@ -47,8 +47,9 @@ var scripts = {
47
47
  "build:types": "run -T tsc -p tsconfig.build.json --emitDeclarationOnly",
48
48
  watch: "run -T rollup -c -w",
49
49
  clean: "run -T rimraf ./dist",
50
- lint: "run -T eslint .",
50
+ lint: "run -T eslint . --max-warnings=0",
51
51
  prepublishOnly: "yarn clean && yarn build",
52
+ "test:ts": "run -T tsc -p tsconfig.json",
52
53
  "test:unit": "run -T jest",
53
54
  "test:unit:watch": "run -T jest --watch",
54
55
  "test:unit:vitest": "vitest run",
@@ -60,15 +61,15 @@ var dependencies = {
60
61
  "@koa/router": "12.0.2",
61
62
  "@modelcontextprotocol/sdk": "1.29.0",
62
63
  "@paralleldrive/cuid2": "2.2.2",
63
- "@strapi/admin": "5.50.1",
64
- "@strapi/database": "5.50.1",
65
- "@strapi/generators": "5.50.1",
66
- "@strapi/logger": "5.50.1",
67
- "@strapi/openapi": "5.50.1",
68
- "@strapi/permissions": "5.50.1",
69
- "@strapi/types": "5.50.1",
70
- "@strapi/typescript-utils": "5.50.1",
71
- "@strapi/utils": "5.50.1",
64
+ "@strapi/admin": "5.50.2",
65
+ "@strapi/database": "5.50.2",
66
+ "@strapi/generators": "5.50.2",
67
+ "@strapi/logger": "5.50.2",
68
+ "@strapi/openapi": "5.50.2",
69
+ "@strapi/permissions": "5.50.2",
70
+ "@strapi/types": "5.50.2",
71
+ "@strapi/typescript-utils": "5.50.2",
72
+ "@strapi/utils": "5.50.2",
72
73
  "@vercel/stega": "0.1.2",
73
74
  bcryptjs: "2.4.3",
74
75
  boxen: "5.1.2",
@@ -89,7 +90,7 @@ var dependencies = {
89
90
  inquirer: "9.3.8",
90
91
  "is-docker": "2.2.1",
91
92
  "json-logic-js": "2.0.5",
92
- jsonwebtoken: "9.0.0",
93
+ jsonwebtoken: "9.0.3",
93
94
  koa: "2.16.4",
94
95
  "koa-body": "6.0.1",
95
96
  "koa-compose": "4.1.0",
@@ -132,11 +133,12 @@ var devDependencies = {
132
133
  "@types/mime-types": "2.1.1",
133
134
  "@types/node": "20.19.41",
134
135
  "@types/node-schedule": "2.1.7",
135
- "eslint-config-custom": "5.50.1",
136
+ "eslint-config-custom": "5.50.2",
137
+ jest: "29.6.0",
136
138
  supertest: "7.2.2",
137
- tsconfig: "5.50.1",
139
+ tsconfig: "5.50.2",
138
140
  vitest: "catalog:",
139
- "vitest-config": "5.50.1"
141
+ "vitest-config": "5.50.2"
140
142
  };
141
143
  var engines = {
142
144
  node: ">=20.0.0 <=26.x.x",
@@ -1 +1 @@
1
- {"version":3,"file":"package.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"package.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,5 +1,5 @@
1
1
  import type { UID, Modules } from '@strapi/types';
2
2
  type Data = Modules.Documents.Params.Data.Input<UID.Schema>;
3
- declare const applyTransforms: import("lodash").CurriedFunction2<import("@strapi/types/dist/struct").ComponentSchema | import("@strapi/types/dist/struct").ContentTypeSchema, Data, Data>;
3
+ declare const applyTransforms: import("lodash").CurriedFunction2<import("@strapi/types/dist/struct/schema.js").ComponentSchema | import("@strapi/types/dist/struct/schema.js").ContentTypeSchema, Data, Data>;
4
4
  export { applyTransforms };
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/services/document-service/attributes/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAU,MAAM,eAAe,CAAC;AAK1D,KAAK,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAE5D,QAAA,MAAM,eAAe,4JAsBnB,CAAC;AAEH,OAAO,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/services/document-service/attributes/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAU,MAAM,eAAe,CAAC;AAK1D,KAAK,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAE5D,QAAA,MAAM,eAAe,gLAsBnB,CAAC;AAEH,OAAO,EAAE,eAAe,EAAE,CAAC"}
@@ -9,7 +9,7 @@ type DynamicZoneValue = Schema.Attribute.DynamicZoneValue<UID.Component[]>;
9
9
  type ComponentBody = {
10
10
  [key: string]: ComponentValue | DynamicZoneValue;
11
11
  };
12
- declare const omitComponentData: _.CurriedFunction2<import("@strapi/types/dist/struct").ComponentSchema | import("@strapi/types/dist/struct").ContentTypeSchema, Input<UID.Schema>, Partial<Input<UID.Schema>>>;
12
+ declare const omitComponentData: _.CurriedFunction2<import("@strapi/types/dist/struct/schema.js").ComponentSchema | import("@strapi/types/dist/struct/schema.js").ContentTypeSchema, Input<UID.Schema>, Partial<Input<UID.Schema>>>;
13
13
  declare const createComponents: <TUID extends UID.Schema, TData extends Input<TUID>>(uid: TUID, data: TData) => Promise<ComponentBody>;
14
14
  declare const getComponents: <TUID extends UID.Schema>(uid: TUID, entity: {
15
15
  id: Modules.EntityService.Params.Attribute.ID;
@@ -21,7 +21,7 @@ declare const deleteComponents: <TUID extends UID.Schema, TEntity extends Data.E
21
21
  loadComponents?: boolean | undefined;
22
22
  }) => Promise<void>;
23
23
  declare const deleteComponent: <TUID extends UID.Component>(uid: TUID, componentToDelete: Data.Component<TUID>) => Promise<void>;
24
- declare const assignComponentData: _.CurriedFunction3<import("@strapi/types/dist/struct").ComponentSchema | import("@strapi/types/dist/struct").ContentTypeSchema, ComponentBody, Input<UID.Schema>, ComponentBody & Partial<Input<UID.Schema>>>;
24
+ declare const assignComponentData: _.CurriedFunction3<import("@strapi/types/dist/struct/schema.js").ComponentSchema | import("@strapi/types/dist/struct/schema.js").ContentTypeSchema, ComponentBody, Input<UID.Schema>, ComponentBody & Partial<Input<UID.Schema>>>;
25
25
  /** *************************
26
26
  Component relation handling for document operations
27
27
  ************************** */
@@ -1 +1 @@
1
- {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../../src/services/document-service/components.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../../src/services/document-service/components.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/services/document-service/repository.ts"],"names":[],"mappings":"AAWA,OAAO,EAAqB,KAAK,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAkC3E,eAAO,MAAM,2BAA2B,EAAE,uBAosBzC,CAAC"}
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/services/document-service/repository.ts"],"names":[],"mappings":"AAWA,OAAO,EAAqB,KAAK,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAmC3E,eAAO,MAAM,2BAA2B,EAAE,uBA8tBzC,CAAC"}
@@ -19,6 +19,7 @@ var selfReferentialRelations = require('./utils/self-referential-relations.js');
19
19
  var index = require('../entity-validator/index.js');
20
20
  var firstPublishedAt = require('./first-published-at.js');
21
21
  var orderedParallel = require('./utils/ordered-parallel.js');
22
+ var cloneRelations = require('./utils/clone-relations.js');
22
23
 
23
24
  const { validators } = strapiUtils.validate;
24
25
  // we have to typecast to reconcile the differences between validator and database getModel
@@ -293,8 +294,8 @@ const createContentTypeRepository = (uid, validator = index)=>{
293
294
  return doc;
294
295
  }
295
296
  async function clone(opts = {}) {
296
- const { documentId, ...params } = opts;
297
- const queryParams = await strapiUtils.async.pipe(validateParams, draftAndPublish.filterDataPublishedAt, internationalization.defaultLocale(contentType), internationalization.multiLocaleToLookup(contentType))(params);
297
+ const { documentId, ...params$1 } = opts;
298
+ const queryParams = await strapiUtils.async.pipe(validateParams, draftAndPublish.filterDataPublishedAt, internationalization.defaultLocale(contentType), internationalization.multiLocaleToLookup(contentType))(params$1);
298
299
  // Get deep populate
299
300
  const entriesToClone = await strapi.db.query(uid).findMany({
300
301
  where: {
@@ -312,17 +313,36 @@ const createContentTypeRepository = (uid, validator = index)=>{
312
313
  ]
313
314
  })
314
315
  });
315
- const clonedEntries = await strapiUtils.async.map(entriesToClone, strapiUtils.async.pipe(fp.omit([
316
- 'id',
317
- 'createdAt',
318
- 'updatedAt'
319
- ]), // assign new documentId
320
- fp.assoc('documentId', transformContentTypesToModels.createDocumentId()), // Merge new data into it
321
- (data)=>fp.merge(data, queryParams.data), (data)=>entries$1.create({
316
+ const newDocumentId = transformContentTypesToModels.createDocumentId();
317
+ const clonedEntries = await strapiUtils.async.map(entriesToClone, async (entryToClone)=>{
318
+ const sourceEntryId = entryToClone.id;
319
+ const originalData = fp.omit([
320
+ 'id',
321
+ 'createdAt',
322
+ 'updatedAt'
323
+ ], entryToClone);
324
+ const { data, relationsToCopy } = await cloneRelations.prepareCloneData(originalData, queryParams.data, contentType, (modelUid)=>strapi.getModel(modelUid));
325
+ const dataWithDocumentId = fp.assoc('documentId', newDocumentId, data);
326
+ const doc = await entries$1.create({
327
+ ...queryParams,
328
+ data: dataWithDocumentId,
329
+ status: 'draft'
330
+ });
331
+ await cloneRelations.copyCloneRelationRows(strapi, uid, sourceEntryId, doc.id, relationsToCopy);
332
+ if (relationsToCopy.length === 0) {
333
+ return doc;
334
+ }
335
+ const selectionQuery = query.transformParamsToQuery(uid, params.pickSelectionParams({
322
336
  ...queryParams,
323
- data,
324
337
  status: 'draft'
325
- })));
338
+ }));
339
+ return strapi.db.query(uid).findOne({
340
+ ...selectionQuery,
341
+ where: {
342
+ id: doc.id
343
+ }
344
+ });
345
+ });
326
346
  clonedEntries.forEach(emitEvent('entry.create'));
327
347
  return {
328
348
  documentId: clonedEntries.at(0)?.documentId,