@strapi/core 5.52.0 → 5.52.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 (76) hide show
  1. package/dist/Strapi.d.ts +1 -0
  2. package/dist/Strapi.d.ts.map +1 -1
  3. package/dist/Strapi.js +5 -1
  4. package/dist/Strapi.js.map +1 -1
  5. package/dist/Strapi.mjs +5 -1
  6. package/dist/Strapi.mjs.map +1 -1
  7. package/dist/core-api/routes/validation/common.d.ts +3 -3
  8. package/dist/core-api/routes/validation/common.js +3 -3
  9. package/dist/core-api/routes/validation/common.js.map +1 -1
  10. package/dist/core-api/routes/validation/common.mjs +3 -3
  11. package/dist/core-api/routes/validation/common.mjs.map +1 -1
  12. package/dist/core-api/routes/validation/content-type.d.ts +3 -3
  13. package/dist/core-api/routes/validation/content-type.d.ts.map +1 -1
  14. package/dist/core-api/routes/validation/content-type.js +1 -1
  15. package/dist/core-api/routes/validation/content-type.js.map +1 -1
  16. package/dist/core-api/routes/validation/content-type.mjs +1 -1
  17. package/dist/core-api/routes/validation/content-type.mjs.map +1 -1
  18. package/dist/core-api/routes/validation/schema-registry.d.ts +21 -0
  19. package/dist/core-api/routes/validation/schema-registry.d.ts.map +1 -0
  20. package/dist/core-api/routes/validation/schema-registry.js +99 -0
  21. package/dist/core-api/routes/validation/schema-registry.js.map +1 -0
  22. package/dist/core-api/routes/validation/schema-registry.mjs +77 -0
  23. package/dist/core-api/routes/validation/schema-registry.mjs.map +1 -0
  24. package/dist/core-api/routes/validation/utils.d.ts +6 -6
  25. package/dist/core-api/routes/validation/utils.d.ts.map +1 -1
  26. package/dist/core-api/routes/validation/utils.js +34 -34
  27. package/dist/core-api/routes/validation/utils.js.map +1 -1
  28. package/dist/core-api/routes/validation/utils.mjs +34 -34
  29. package/dist/core-api/routes/validation/utils.mjs.map +1 -1
  30. package/dist/loaders/plugins/get-enabled-plugins.d.ts.map +1 -1
  31. package/dist/loaders/plugins/get-enabled-plugins.js +2 -7
  32. package/dist/loaders/plugins/get-enabled-plugins.js.map +1 -1
  33. package/dist/loaders/plugins/get-enabled-plugins.mjs +2 -3
  34. package/dist/loaders/plugins/get-enabled-plugins.mjs.map +1 -1
  35. package/dist/loaders/plugins/get-user-plugins-config.d.ts +6 -1
  36. package/dist/loaders/plugins/get-user-plugins-config.d.ts.map +1 -1
  37. package/dist/loaders/plugins/get-user-plugins-config.js.map +1 -1
  38. package/dist/loaders/plugins/get-user-plugins-config.mjs.map +1 -1
  39. package/dist/migrations/database/5.0.0-discard-drafts.d.ts.map +1 -1
  40. package/dist/migrations/database/5.0.0-discard-drafts.js +4 -0
  41. package/dist/migrations/database/5.0.0-discard-drafts.js.map +1 -1
  42. package/dist/migrations/database/5.0.0-discard-drafts.mjs +4 -0
  43. package/dist/migrations/database/5.0.0-discard-drafts.mjs.map +1 -1
  44. package/dist/migrations/database/serialize-json-columns.d.ts +12 -0
  45. package/dist/migrations/database/serialize-json-columns.d.ts.map +1 -0
  46. package/dist/migrations/database/serialize-json-columns.js +35 -0
  47. package/dist/migrations/database/serialize-json-columns.js.map +1 -0
  48. package/dist/migrations/database/serialize-json-columns.mjs +33 -0
  49. package/dist/migrations/database/serialize-json-columns.mjs.map +1 -0
  50. package/dist/package.json.js +14 -14
  51. package/dist/package.json.mjs +14 -14
  52. package/dist/services/content-api/index.d.ts.map +1 -1
  53. package/dist/services/content-api/index.js +33 -41
  54. package/dist/services/content-api/index.js.map +1 -1
  55. package/dist/services/content-api/index.mjs +33 -38
  56. package/dist/services/content-api/index.mjs.map +1 -1
  57. package/dist/services/content-api/permissions/index.js +2 -2
  58. package/dist/services/content-api/permissions/index.js.map +1 -1
  59. package/dist/services/content-api/permissions/index.mjs +2 -2
  60. package/dist/services/content-api/permissions/index.mjs.map +1 -1
  61. package/dist/services/server/register-routes.js +7 -7
  62. package/dist/services/server/register-routes.js.map +1 -1
  63. package/dist/services/server/register-routes.mjs +7 -7
  64. package/dist/services/server/register-routes.mjs.map +1 -1
  65. package/dist/services/session-manager.d.ts.map +1 -1
  66. package/dist/services/session-manager.js +9 -9
  67. package/dist/services/session-manager.js.map +1 -1
  68. package/dist/services/session-manager.mjs +9 -9
  69. package/dist/services/session-manager.mjs.map +1 -1
  70. package/dist/utils/zod.d.ts +23 -0
  71. package/dist/utils/zod.d.ts.map +1 -0
  72. package/dist/utils/zod.js +46 -0
  73. package/dist/utils/zod.js.map +1 -0
  74. package/dist/utils/zod.mjs +43 -0
  75. package/dist/utils/zod.mjs.map +1 -0
  76. package/package.json +14 -14
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../src/core-api/routes/validation/utils.ts"],"sourcesContent":["import { transformUidToValidOpenApiName } from '@strapi/utils';\nimport type { Core, Internal } from '@strapi/types';\nimport * as z from 'zod/v4';\n\n// Schema generation happens on-demand when schemas don't exist in the registry\n\n/**\n * Safely adds or updates a schema in Zod's global registry.\n *\n * If a schema with the given `id` already exists, it will be removed before adding the new one.\n *\n * This is useful for hot-reloading or preventing issues with cyclical dependencies.\n *\n * @param id - The unique identifier for the schema in the global registry.\n * @param schema - The Zod schema to register.\n * @example\n * ```typescript\n * safeGlobalRegistrySet(\"mySchema\", z.object({ name: z.string() }));\n * ```\n */\nexport const safeGlobalRegistrySet = (\n strapi: Core.Strapi,\n id: Internal.UID.Schema,\n schema: z.ZodType\n) => {\n try {\n const { _idmap: idMap } = z.globalRegistry;\n\n const transformedId = transformUidToValidOpenApiName(id);\n\n const isReplacing = idMap.has(transformedId);\n\n if (isReplacing) {\n // Remove existing schema to prevent conflicts\n idMap.delete(transformedId);\n }\n\n strapi.log.debug(\n `${isReplacing ? 'Replacing' : 'Registering'} schema ${transformedId} in global registry`\n );\n z.globalRegistry.add(schema, { id: transformedId });\n } catch (error) {\n strapi.log.error(\n `Schema registration failed: Failed to register schema ${id} in global registry`\n );\n\n throw error;\n }\n};\n\n/**\n * Safely creates and registers a Zod schema in the global registry, particularly useful for handling cyclical data structures.\n *\n * If a schema with the given `id` already exists in the global registry, it returns the existing schema.\n *\n * Otherwise, it registers a temporary `z.any()` schema, calls the provided `callback` to create the actual schema,\n * and then replaces the temporary schema with the actual one in the registry.\n *\n * This prevents infinite loops in cases of cyclical dependencies.\n *\n * @param id - The unique identifier for the schema in the global registry.\n * @param callback - A function that returns the Zod schema to be created and registered.\n * @returns The created or retrieved Zod schema.\n * @example\n * ```typescript\n * const CategorySchema = safeSchemaCreation(\"Category\", () =>\n * z.object({\n * name: z.string(),\n * products: z.array(safeSchemaCreation(\"Product\", () =>\n * z.object({\n * name: z.string(),\n * category: z.lazy(() => CategorySchema) // Cyclical reference\n * })\n * ))\n * })\n * );\n * ```\n */\nexport const safeSchemaCreation = (\n strapi: Core.Strapi,\n id: Internal.UID.Schema,\n callback: () => z.ZodType\n) => {\n try {\n const { _idmap: idMap } = z.globalRegistry;\n\n const transformedId = transformUidToValidOpenApiName(id);\n\n // Return existing schema if already registered\n const mapItem = idMap.get(transformedId);\n if (mapItem) {\n // Schema already exists, return it silently\n return mapItem;\n }\n\n strapi.log.debug(`Schema ${transformedId} not found in registry, generating new schema`);\n\n // Determine if this is a built-in schema or user content\n const isBuiltInSchema = id.startsWith('plugin::') || id.startsWith('admin');\n\n if (isBuiltInSchema) {\n strapi.log.debug(`Initializing validation schema for ${transformedId}`);\n } else {\n const schemaName = transformedId\n .replace('Document', '')\n .replace('Entry', '')\n .replace(/([A-Z])/g, ' $1')\n .trim();\n strapi.log.debug(`📝 Generating validation schema for \"${schemaName}\"`);\n }\n\n // Temporary any placeholder before replacing with the actual schema type\n // Used to prevent infinite loops in cyclical data structures\n safeGlobalRegistrySet(strapi, id, z.any());\n\n // Generate the actual schema using the callback\n const schema = callback();\n\n // Replace the placeholder with the real schema\n safeGlobalRegistrySet(strapi, id, schema);\n\n // Show completion for user content only\n if (!isBuiltInSchema) {\n const fieldCount = Object.keys((schema as any)?._def?.shape || {}).length || 0;\n const schemaName = transformedId\n .replace('Document', '')\n .replace('Entry', '')\n .replace(/([A-Z])/g, ' $1')\n .trim();\n strapi.log.debug(` ✅ \"${schemaName}\" schema created with ${fieldCount} fields`);\n }\n\n return schema;\n } catch (error) {\n strapi.log.error(`Schema creation failed: Failed to create schema ${id}`);\n\n throw error;\n }\n};\n"],"names":["safeGlobalRegistrySet","strapi","id","schema","_idmap","idMap","z","globalRegistry","transformedId","transformUidToValidOpenApiName","isReplacing","has","delete","log","debug","add","error","safeSchemaCreation","callback","mapItem","get","isBuiltInSchema","startsWith","schemaName","replace","trim","any","fieldCount","Object","keys","_def","shape","length"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sources":["../../../../src/core-api/routes/validation/utils.ts"],"sourcesContent":["import { transformUidToValidOpenApiName } from '@strapi/utils';\nimport type { Core, Internal } from '@strapi/types';\nimport * as z from 'zod/v4';\n\nimport { inspectZodSchema } from '../../../utils/zod';\n\n// Schema generation happens on-demand when schemas don't exist in the registry\n\n/**\n * Safely adds or updates a schema in Strapi's owned OpenAPI registry.\n *\n * If a schema with the given `id` already exists, it will be removed before adding the new one.\n *\n * This is useful for hot-reloading or preventing issues with cyclical dependencies.\n *\n * @param id - The unique identifier for the schema in Strapi's registry.\n * @param schema - The Zod schema to register.\n * @example\n * ```typescript\n * safeGlobalRegistrySet(\"mySchema\", z.object({ name: z.string() }));\n * ```\n */\nexport const safeGlobalRegistrySet = (\n strapi: Core.Strapi,\n id: Internal.UID.Schema,\n schema: z.ZodType\n) => {\n try {\n const transformedId = transformUidToValidOpenApiName(id);\n\n const schemaStore = strapi.contentAPISchemaRegistry;\n const isReplacing = schemaStore.has(transformedId);\n\n strapi.log.debug(\n `${isReplacing ? 'Replacing' : 'Registering'} schema ${transformedId} in Strapi registry`\n );\n schemaStore.set(transformedId, schema);\n } catch (error) {\n strapi.log.error(\n `Schema registration failed: Failed to register schema ${id} in Strapi registry`\n );\n\n throw error;\n }\n};\n\n/**\n * Safely creates and registers a Zod schema in Strapi's owned OpenAPI registry, particularly useful for handling cyclical data structures.\n *\n * If a schema with the given `id` already exists in Strapi's registry, it returns the existing schema.\n *\n * Otherwise, it registers a temporary `z.any()` schema, calls the provided `callback` to create the actual schema,\n * and then replaces the temporary schema with the actual one in the registry.\n *\n * This prevents infinite loops in cases of cyclical dependencies.\n *\n * @param id - The unique identifier for the schema in Strapi's registry.\n * @param callback - A function that returns the Zod schema to be created and registered.\n * @returns The created or retrieved Zod schema.\n * @example\n * ```typescript\n * const CategorySchema = safeSchemaCreation(\"Category\", () =>\n * z.object({\n * name: z.string(),\n * products: z.array(safeSchemaCreation(\"Product\", () =>\n * z.object({\n * name: z.string(),\n * category: z.lazy(() => CategorySchema) // Cyclical reference\n * })\n * ))\n * })\n * );\n * ```\n */\nexport const safeSchemaCreation = (\n strapi: Core.Strapi,\n id: Internal.UID.Schema,\n callback: () => z.ZodType\n) => {\n try {\n const transformedId = transformUidToValidOpenApiName(id);\n const schemaStore = strapi.contentAPISchemaRegistry;\n\n // Return existing schema if already registered\n const existingSchema = schemaStore.getOrDefer(transformedId);\n if (existingSchema !== undefined) {\n return existingSchema;\n }\n\n strapi.log.debug(`Schema ${transformedId} not found in registry, generating new schema`);\n\n // Determine if this is a built-in schema or user content\n const isBuiltInSchema = id.startsWith('plugin::') || id.startsWith('admin');\n\n if (isBuiltInSchema) {\n strapi.log.debug(`Initializing validation schema for ${transformedId}`);\n } else {\n const schemaName = transformedId\n .replace('Document', '')\n .replace('Entry', '')\n .replace(/([A-Z])/g, ' $1')\n .trim();\n strapi.log.debug(`📝 Generating validation schema for \"${schemaName}\"`);\n }\n\n schemaStore.startPending(transformedId);\n\n try {\n // Temporary any placeholder before replacing with the actual schema type\n // Used to prevent infinite loops in cyclical data structures\n safeGlobalRegistrySet(strapi, id, z.any());\n\n // Generate the actual schema using the callback\n const schema = callback();\n\n // Replace the placeholder with the real schema\n safeGlobalRegistrySet(strapi, id, schema);\n\n // Show completion for user content only\n if (!isBuiltInSchema) {\n const inspection = inspectZodSchema(schema);\n const fieldCount = inspection.type === 'object' ? Object.keys(inspection.shape).length : 0;\n const schemaName = transformedId\n .replace('Document', '')\n .replace('Entry', '')\n .replace(/([A-Z])/g, ' $1')\n .trim();\n strapi.log.debug(` ✅ \"${schemaName}\" schema created with ${fieldCount} fields`);\n }\n\n return schema;\n } finally {\n schemaStore.finishPending(transformedId);\n }\n } catch (error) {\n strapi.log.error(`Schema creation failed: Failed to create schema ${id}`);\n\n throw error;\n }\n};\n"],"names":["safeGlobalRegistrySet","strapi","id","schema","transformedId","transformUidToValidOpenApiName","schemaStore","contentAPISchemaRegistry","isReplacing","has","log","debug","set","error","safeSchemaCreation","callback","existingSchema","getOrDefer","undefined","isBuiltInSchema","startsWith","schemaName","replace","trim","startPending","z","any","inspection","inspectZodSchema","fieldCount","type","Object","keys","shape","length","finishPending"],"mappings":"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"}
@@ -1,15 +1,16 @@
1
1
  import { transformUidToValidOpenApiName } from '@strapi/utils';
2
2
  import * as z from 'zod/v4';
3
+ import { inspectZodSchema } from '../../../utils/zod.mjs';
3
4
 
4
5
  // Schema generation happens on-demand when schemas don't exist in the registry
5
6
  /**
6
- * Safely adds or updates a schema in Zod's global registry.
7
+ * Safely adds or updates a schema in Strapi's owned OpenAPI registry.
7
8
  *
8
9
  * If a schema with the given `id` already exists, it will be removed before adding the new one.
9
10
  *
10
11
  * This is useful for hot-reloading or preventing issues with cyclical dependencies.
11
12
  *
12
- * @param id - The unique identifier for the schema in the global registry.
13
+ * @param id - The unique identifier for the schema in Strapi's registry.
13
14
  * @param schema - The Zod schema to register.
14
15
  * @example
15
16
  * ```typescript
@@ -17,33 +18,27 @@ import * as z from 'zod/v4';
17
18
  * ```
18
19
  */ const safeGlobalRegistrySet = (strapi, id, schema)=>{
19
20
  try {
20
- const { _idmap: idMap } = z.globalRegistry;
21
21
  const transformedId = transformUidToValidOpenApiName(id);
22
- const isReplacing = idMap.has(transformedId);
23
- if (isReplacing) {
24
- // Remove existing schema to prevent conflicts
25
- idMap.delete(transformedId);
26
- }
27
- strapi.log.debug(`${isReplacing ? 'Replacing' : 'Registering'} schema ${transformedId} in global registry`);
28
- z.globalRegistry.add(schema, {
29
- id: transformedId
30
- });
22
+ const schemaStore = strapi.contentAPISchemaRegistry;
23
+ const isReplacing = schemaStore.has(transformedId);
24
+ strapi.log.debug(`${isReplacing ? 'Replacing' : 'Registering'} schema ${transformedId} in Strapi registry`);
25
+ schemaStore.set(transformedId, schema);
31
26
  } catch (error) {
32
- strapi.log.error(`Schema registration failed: Failed to register schema ${id} in global registry`);
27
+ strapi.log.error(`Schema registration failed: Failed to register schema ${id} in Strapi registry`);
33
28
  throw error;
34
29
  }
35
30
  };
36
31
  /**
37
- * Safely creates and registers a Zod schema in the global registry, particularly useful for handling cyclical data structures.
32
+ * Safely creates and registers a Zod schema in Strapi's owned OpenAPI registry, particularly useful for handling cyclical data structures.
38
33
  *
39
- * If a schema with the given `id` already exists in the global registry, it returns the existing schema.
34
+ * If a schema with the given `id` already exists in Strapi's registry, it returns the existing schema.
40
35
  *
41
36
  * Otherwise, it registers a temporary `z.any()` schema, calls the provided `callback` to create the actual schema,
42
37
  * and then replaces the temporary schema with the actual one in the registry.
43
38
  *
44
39
  * This prevents infinite loops in cases of cyclical dependencies.
45
40
  *
46
- * @param id - The unique identifier for the schema in the global registry.
41
+ * @param id - The unique identifier for the schema in Strapi's registry.
47
42
  * @param callback - A function that returns the Zod schema to be created and registered.
48
43
  * @returns The created or retrieved Zod schema.
49
44
  * @example
@@ -62,13 +57,12 @@ import * as z from 'zod/v4';
62
57
  * ```
63
58
  */ const safeSchemaCreation = (strapi, id, callback)=>{
64
59
  try {
65
- const { _idmap: idMap } = z.globalRegistry;
66
60
  const transformedId = transformUidToValidOpenApiName(id);
61
+ const schemaStore = strapi.contentAPISchemaRegistry;
67
62
  // Return existing schema if already registered
68
- const mapItem = idMap.get(transformedId);
69
- if (mapItem) {
70
- // Schema already exists, return it silently
71
- return mapItem;
63
+ const existingSchema = schemaStore.getOrDefer(transformedId);
64
+ if (existingSchema !== undefined) {
65
+ return existingSchema;
72
66
  }
73
67
  strapi.log.debug(`Schema ${transformedId} not found in registry, generating new schema`);
74
68
  // Determine if this is a built-in schema or user content
@@ -79,20 +73,26 @@ import * as z from 'zod/v4';
79
73
  const schemaName = transformedId.replace('Document', '').replace('Entry', '').replace(/([A-Z])/g, ' $1').trim();
80
74
  strapi.log.debug(`📝 Generating validation schema for "${schemaName}"`);
81
75
  }
82
- // Temporary any placeholder before replacing with the actual schema type
83
- // Used to prevent infinite loops in cyclical data structures
84
- safeGlobalRegistrySet(strapi, id, z.any());
85
- // Generate the actual schema using the callback
86
- const schema = callback();
87
- // Replace the placeholder with the real schema
88
- safeGlobalRegistrySet(strapi, id, schema);
89
- // Show completion for user content only
90
- if (!isBuiltInSchema) {
91
- const fieldCount = Object.keys(schema?._def?.shape || {}).length || 0;
92
- const schemaName = transformedId.replace('Document', '').replace('Entry', '').replace(/([A-Z])/g, ' $1').trim();
93
- strapi.log.debug(` ✅ "${schemaName}" schema created with ${fieldCount} fields`);
76
+ schemaStore.startPending(transformedId);
77
+ try {
78
+ // Temporary any placeholder before replacing with the actual schema type
79
+ // Used to prevent infinite loops in cyclical data structures
80
+ safeGlobalRegistrySet(strapi, id, z.any());
81
+ // Generate the actual schema using the callback
82
+ const schema = callback();
83
+ // Replace the placeholder with the real schema
84
+ safeGlobalRegistrySet(strapi, id, schema);
85
+ // Show completion for user content only
86
+ if (!isBuiltInSchema) {
87
+ const inspection = inspectZodSchema(schema);
88
+ const fieldCount = inspection.type === 'object' ? Object.keys(inspection.shape).length : 0;
89
+ const schemaName = transformedId.replace('Document', '').replace('Entry', '').replace(/([A-Z])/g, ' $1').trim();
90
+ strapi.log.debug(` ✅ "${schemaName}" schema created with ${fieldCount} fields`);
91
+ }
92
+ return schema;
93
+ } finally{
94
+ schemaStore.finishPending(transformedId);
94
95
  }
95
- return schema;
96
96
  } catch (error) {
97
97
  strapi.log.error(`Schema creation failed: Failed to create schema ${id}`);
98
98
  throw error;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.mjs","sources":["../../../../src/core-api/routes/validation/utils.ts"],"sourcesContent":["import { transformUidToValidOpenApiName } from '@strapi/utils';\nimport type { Core, Internal } from '@strapi/types';\nimport * as z from 'zod/v4';\n\n// Schema generation happens on-demand when schemas don't exist in the registry\n\n/**\n * Safely adds or updates a schema in Zod's global registry.\n *\n * If a schema with the given `id` already exists, it will be removed before adding the new one.\n *\n * This is useful for hot-reloading or preventing issues with cyclical dependencies.\n *\n * @param id - The unique identifier for the schema in the global registry.\n * @param schema - The Zod schema to register.\n * @example\n * ```typescript\n * safeGlobalRegistrySet(\"mySchema\", z.object({ name: z.string() }));\n * ```\n */\nexport const safeGlobalRegistrySet = (\n strapi: Core.Strapi,\n id: Internal.UID.Schema,\n schema: z.ZodType\n) => {\n try {\n const { _idmap: idMap } = z.globalRegistry;\n\n const transformedId = transformUidToValidOpenApiName(id);\n\n const isReplacing = idMap.has(transformedId);\n\n if (isReplacing) {\n // Remove existing schema to prevent conflicts\n idMap.delete(transformedId);\n }\n\n strapi.log.debug(\n `${isReplacing ? 'Replacing' : 'Registering'} schema ${transformedId} in global registry`\n );\n z.globalRegistry.add(schema, { id: transformedId });\n } catch (error) {\n strapi.log.error(\n `Schema registration failed: Failed to register schema ${id} in global registry`\n );\n\n throw error;\n }\n};\n\n/**\n * Safely creates and registers a Zod schema in the global registry, particularly useful for handling cyclical data structures.\n *\n * If a schema with the given `id` already exists in the global registry, it returns the existing schema.\n *\n * Otherwise, it registers a temporary `z.any()` schema, calls the provided `callback` to create the actual schema,\n * and then replaces the temporary schema with the actual one in the registry.\n *\n * This prevents infinite loops in cases of cyclical dependencies.\n *\n * @param id - The unique identifier for the schema in the global registry.\n * @param callback - A function that returns the Zod schema to be created and registered.\n * @returns The created or retrieved Zod schema.\n * @example\n * ```typescript\n * const CategorySchema = safeSchemaCreation(\"Category\", () =>\n * z.object({\n * name: z.string(),\n * products: z.array(safeSchemaCreation(\"Product\", () =>\n * z.object({\n * name: z.string(),\n * category: z.lazy(() => CategorySchema) // Cyclical reference\n * })\n * ))\n * })\n * );\n * ```\n */\nexport const safeSchemaCreation = (\n strapi: Core.Strapi,\n id: Internal.UID.Schema,\n callback: () => z.ZodType\n) => {\n try {\n const { _idmap: idMap } = z.globalRegistry;\n\n const transformedId = transformUidToValidOpenApiName(id);\n\n // Return existing schema if already registered\n const mapItem = idMap.get(transformedId);\n if (mapItem) {\n // Schema already exists, return it silently\n return mapItem;\n }\n\n strapi.log.debug(`Schema ${transformedId} not found in registry, generating new schema`);\n\n // Determine if this is a built-in schema or user content\n const isBuiltInSchema = id.startsWith('plugin::') || id.startsWith('admin');\n\n if (isBuiltInSchema) {\n strapi.log.debug(`Initializing validation schema for ${transformedId}`);\n } else {\n const schemaName = transformedId\n .replace('Document', '')\n .replace('Entry', '')\n .replace(/([A-Z])/g, ' $1')\n .trim();\n strapi.log.debug(`📝 Generating validation schema for \"${schemaName}\"`);\n }\n\n // Temporary any placeholder before replacing with the actual schema type\n // Used to prevent infinite loops in cyclical data structures\n safeGlobalRegistrySet(strapi, id, z.any());\n\n // Generate the actual schema using the callback\n const schema = callback();\n\n // Replace the placeholder with the real schema\n safeGlobalRegistrySet(strapi, id, schema);\n\n // Show completion for user content only\n if (!isBuiltInSchema) {\n const fieldCount = Object.keys((schema as any)?._def?.shape || {}).length || 0;\n const schemaName = transformedId\n .replace('Document', '')\n .replace('Entry', '')\n .replace(/([A-Z])/g, ' $1')\n .trim();\n strapi.log.debug(` ✅ \"${schemaName}\" schema created with ${fieldCount} fields`);\n }\n\n return schema;\n } catch (error) {\n strapi.log.error(`Schema creation failed: Failed to create schema ${id}`);\n\n throw error;\n }\n};\n"],"names":["safeGlobalRegistrySet","strapi","id","schema","_idmap","idMap","z","globalRegistry","transformedId","transformUidToValidOpenApiName","isReplacing","has","delete","log","debug","add","error","safeSchemaCreation","callback","mapItem","get","isBuiltInSchema","startsWith","schemaName","replace","trim","any","fieldCount","Object","keys","_def","shape","length"],"mappings":"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"}
1
+ {"version":3,"file":"utils.mjs","sources":["../../../../src/core-api/routes/validation/utils.ts"],"sourcesContent":["import { transformUidToValidOpenApiName } from '@strapi/utils';\nimport type { Core, Internal } from '@strapi/types';\nimport * as z from 'zod/v4';\n\nimport { inspectZodSchema } from '../../../utils/zod';\n\n// Schema generation happens on-demand when schemas don't exist in the registry\n\n/**\n * Safely adds or updates a schema in Strapi's owned OpenAPI registry.\n *\n * If a schema with the given `id` already exists, it will be removed before adding the new one.\n *\n * This is useful for hot-reloading or preventing issues with cyclical dependencies.\n *\n * @param id - The unique identifier for the schema in Strapi's registry.\n * @param schema - The Zod schema to register.\n * @example\n * ```typescript\n * safeGlobalRegistrySet(\"mySchema\", z.object({ name: z.string() }));\n * ```\n */\nexport const safeGlobalRegistrySet = (\n strapi: Core.Strapi,\n id: Internal.UID.Schema,\n schema: z.ZodType\n) => {\n try {\n const transformedId = transformUidToValidOpenApiName(id);\n\n const schemaStore = strapi.contentAPISchemaRegistry;\n const isReplacing = schemaStore.has(transformedId);\n\n strapi.log.debug(\n `${isReplacing ? 'Replacing' : 'Registering'} schema ${transformedId} in Strapi registry`\n );\n schemaStore.set(transformedId, schema);\n } catch (error) {\n strapi.log.error(\n `Schema registration failed: Failed to register schema ${id} in Strapi registry`\n );\n\n throw error;\n }\n};\n\n/**\n * Safely creates and registers a Zod schema in Strapi's owned OpenAPI registry, particularly useful for handling cyclical data structures.\n *\n * If a schema with the given `id` already exists in Strapi's registry, it returns the existing schema.\n *\n * Otherwise, it registers a temporary `z.any()` schema, calls the provided `callback` to create the actual schema,\n * and then replaces the temporary schema with the actual one in the registry.\n *\n * This prevents infinite loops in cases of cyclical dependencies.\n *\n * @param id - The unique identifier for the schema in Strapi's registry.\n * @param callback - A function that returns the Zod schema to be created and registered.\n * @returns The created or retrieved Zod schema.\n * @example\n * ```typescript\n * const CategorySchema = safeSchemaCreation(\"Category\", () =>\n * z.object({\n * name: z.string(),\n * products: z.array(safeSchemaCreation(\"Product\", () =>\n * z.object({\n * name: z.string(),\n * category: z.lazy(() => CategorySchema) // Cyclical reference\n * })\n * ))\n * })\n * );\n * ```\n */\nexport const safeSchemaCreation = (\n strapi: Core.Strapi,\n id: Internal.UID.Schema,\n callback: () => z.ZodType\n) => {\n try {\n const transformedId = transformUidToValidOpenApiName(id);\n const schemaStore = strapi.contentAPISchemaRegistry;\n\n // Return existing schema if already registered\n const existingSchema = schemaStore.getOrDefer(transformedId);\n if (existingSchema !== undefined) {\n return existingSchema;\n }\n\n strapi.log.debug(`Schema ${transformedId} not found in registry, generating new schema`);\n\n // Determine if this is a built-in schema or user content\n const isBuiltInSchema = id.startsWith('plugin::') || id.startsWith('admin');\n\n if (isBuiltInSchema) {\n strapi.log.debug(`Initializing validation schema for ${transformedId}`);\n } else {\n const schemaName = transformedId\n .replace('Document', '')\n .replace('Entry', '')\n .replace(/([A-Z])/g, ' $1')\n .trim();\n strapi.log.debug(`📝 Generating validation schema for \"${schemaName}\"`);\n }\n\n schemaStore.startPending(transformedId);\n\n try {\n // Temporary any placeholder before replacing with the actual schema type\n // Used to prevent infinite loops in cyclical data structures\n safeGlobalRegistrySet(strapi, id, z.any());\n\n // Generate the actual schema using the callback\n const schema = callback();\n\n // Replace the placeholder with the real schema\n safeGlobalRegistrySet(strapi, id, schema);\n\n // Show completion for user content only\n if (!isBuiltInSchema) {\n const inspection = inspectZodSchema(schema);\n const fieldCount = inspection.type === 'object' ? Object.keys(inspection.shape).length : 0;\n const schemaName = transformedId\n .replace('Document', '')\n .replace('Entry', '')\n .replace(/([A-Z])/g, ' $1')\n .trim();\n strapi.log.debug(` ✅ \"${schemaName}\" schema created with ${fieldCount} fields`);\n }\n\n return schema;\n } finally {\n schemaStore.finishPending(transformedId);\n }\n } catch (error) {\n strapi.log.error(`Schema creation failed: Failed to create schema ${id}`);\n\n throw error;\n }\n};\n"],"names":["safeGlobalRegistrySet","strapi","id","schema","transformedId","transformUidToValidOpenApiName","schemaStore","contentAPISchemaRegistry","isReplacing","has","log","debug","set","error","safeSchemaCreation","callback","existingSchema","getOrDefer","undefined","isBuiltInSchema","startsWith","schemaName","replace","trim","startPending","z","any","inspection","inspectZodSchema","fieldCount","type","Object","keys","shape","length","finishPending"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-enabled-plugins.d.ts","sourceRoot":"","sources":["../../../src/loaders/plugins/get-enabled-plugins.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAkF1C,eAAO,MAAM,iBAAiB,GAAU,QAAQ,IAAI,CAAC,MAAM,EAAE;;CAA8B,iBAoF1F,CAAC"}
1
+ {"version":3,"file":"get-enabled-plugins.d.ts","sourceRoot":"","sources":["../../../src/loaders/plugins/get-enabled-plugins.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AA4E1C,eAAO,MAAM,iBAAiB,GAAU,QAAQ,IAAI,CAAC,MAAM,EAAE;;CAA8B,iBAoF1F,CAAC"}
@@ -2,15 +2,10 @@
2
2
 
3
3
  var path = require('path');
4
4
  var fs = require('fs');
5
- var _ = require('lodash');
6
5
  var fp = require('lodash/fp');
7
6
  var strapiUtils = require('@strapi/utils');
8
7
  var getUserPluginsConfig = require('./get-user-plugins-config.js');
9
8
 
10
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
-
12
- var ___default = /*#__PURE__*/_interopDefault(_);
13
-
14
9
  /**
15
10
  * otherwise known as "core features"
16
11
  *
@@ -113,7 +108,7 @@ const getEnabledPlugins = async (strapi1, { client } = {
113
108
  }
114
109
  const declaredPlugins = {};
115
110
  const userPluginsConfig = await getUserPluginsConfig.getUserPluginsConfig();
116
- ___default.default.forEach(userPluginsConfig, (declaration, pluginName)=>{
111
+ for (const [pluginName, declaration] of Object.entries(userPluginsConfig)){
117
112
  validatePluginName(pluginName);
118
113
  declaredPlugins[pluginName] = {
119
114
  ...toDetailedDeclaration(declaration),
@@ -129,7 +124,7 @@ const getEnabledPlugins = async (strapi1, { client } = {
129
124
  declaredPlugins[pluginName].packageInfo = packageInfo;
130
125
  }
131
126
  }
132
- });
127
+ }
133
128
  const declaredPluginsResolves = fp.map(fp.prop('pathToPlugin'), declaredPlugins);
134
129
  const installedPluginsNotAlreadyUsed = fp.pickBy((p)=>!declaredPluginsResolves.includes(p.pathToPlugin), installedPlugins);
135
130
  const enabledPlugins = fp.pipe(fp.defaultsDeep(declaredPlugins), fp.defaultsDeep(installedPluginsNotAlreadyUsed), fp.pickBy((p)=>p.enabled))(internalPlugins);
@@ -1 +1 @@
1
- {"version":3,"file":"get-enabled-plugins.js","sources":["../../../src/loaders/plugins/get-enabled-plugins.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\nimport { dirname, join, resolve } from 'path';\nimport { statSync, existsSync } from 'fs';\nimport _ from 'lodash';\nimport { get, pickBy, defaultsDeep, map, prop, pipe } from 'lodash/fp';\nimport { strings } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport { getUserPluginsConfig } from './get-user-plugins-config';\n\ninterface PluginMeta {\n enabled: boolean;\n pathToPlugin?: string;\n info: Record<string, unknown>;\n packageInfo?: Record<string, unknown>;\n}\n\ntype PluginMetas = Record<string, PluginMeta>;\n\ninterface PluginInfo {\n name: string;\n kind: string;\n}\n\ninterface PluginDeclaration {\n enabled: boolean;\n resolve: string;\n isModule: boolean;\n}\n\n/**\n * otherwise known as \"core features\"\n *\n * NOTE: These are excluded from the content manager plugin list, as they are always enabled.\n * See admin.ts server controller on the content-manager plugin for more details.\n */\nconst INTERNAL_PLUGINS = [\n '@strapi/content-manager',\n '@strapi/content-type-builder',\n '@strapi/email',\n '@strapi/upload',\n '@strapi/i18n',\n '@strapi/content-releases',\n '@strapi/review-workflows',\n];\n\nconst isStrapiPlugin = (info: PluginInfo) => get('strapi.kind', info) === 'plugin';\n\nconst validatePluginName = (pluginName: string) => {\n if (!strings.isKebabCase(pluginName)) {\n throw new Error(`Plugin name \"${pluginName}\" is not in kebab (an-example-of-kebab-case)`);\n }\n};\n\nconst toDetailedDeclaration = (declaration: boolean | PluginDeclaration) => {\n if (typeof declaration === 'boolean') {\n return { enabled: declaration };\n }\n\n const detailedDeclaration: { enabled: boolean; pathToPlugin?: string } = {\n enabled: declaration.enabled,\n };\n\n if (declaration?.resolve) {\n let pathToPlugin = '';\n\n if (declaration.isModule) {\n /**\n * we only want the node_module here, not the package.json\n */\n pathToPlugin = join(declaration.resolve, '..');\n } else {\n try {\n pathToPlugin = dirname(require.resolve(declaration.resolve));\n } catch {\n pathToPlugin = resolve(strapi.dirs.app.root, declaration.resolve);\n\n if (!existsSync(pathToPlugin) || !statSync(pathToPlugin).isDirectory()) {\n throw new Error(`${declaration.resolve} couldn't be resolved`);\n }\n }\n }\n\n detailedDeclaration.pathToPlugin = pathToPlugin;\n }\n\n return detailedDeclaration;\n};\n\nexport const getEnabledPlugins = async (strapi: Core.Strapi, { client } = { client: false }) => {\n const internalPlugins: PluginMetas = {};\n\n for (const dep of INTERNAL_PLUGINS) {\n const packagePath = join(dep, 'package.json');\n\n // NOTE: internal plugins should be resolved from the strapi package\n const packageModulePath = require.resolve(packagePath, {\n paths: [require.resolve('@strapi/strapi/package.json'), process.cwd()],\n });\n\n const packageInfo = require(packageModulePath);\n\n validatePluginName(packageInfo.strapi.name);\n internalPlugins[packageInfo.strapi.name] = {\n ...toDetailedDeclaration({ enabled: true, resolve: packageModulePath, isModule: client }),\n info: packageInfo.strapi,\n packageInfo,\n };\n }\n\n const installedPlugins: PluginMetas = {};\n const dependencies = strapi.config.get('info.dependencies', {});\n\n for (const dep of Object.keys(dependencies)) {\n const packagePath = join(dep, 'package.json');\n let packageInfo;\n try {\n packageInfo = require(packagePath);\n } catch {\n continue;\n }\n\n if (isStrapiPlugin(packageInfo)) {\n validatePluginName(packageInfo.strapi.name);\n installedPlugins[packageInfo.strapi.name] = {\n ...toDetailedDeclaration({ enabled: true, resolve: packagePath, isModule: client }),\n info: {\n ...packageInfo.strapi,\n packageName: packageInfo.name,\n },\n packageInfo,\n };\n }\n }\n\n const declaredPlugins: PluginMetas = {};\n const userPluginsConfig = await getUserPluginsConfig();\n\n _.forEach(userPluginsConfig, (declaration, pluginName) => {\n validatePluginName(pluginName);\n\n declaredPlugins[pluginName] = {\n ...toDetailedDeclaration(declaration),\n info: {},\n };\n\n const { pathToPlugin } = declaredPlugins[pluginName];\n\n // for manually resolved plugins\n if (pathToPlugin) {\n const packagePath = join(pathToPlugin, 'package.json');\n const packageInfo = require(packagePath);\n\n if (isStrapiPlugin(packageInfo)) {\n declaredPlugins[pluginName].info = packageInfo.strapi || {};\n declaredPlugins[pluginName].packageInfo = packageInfo;\n }\n }\n });\n\n const declaredPluginsResolves = map(prop('pathToPlugin'), declaredPlugins);\n const installedPluginsNotAlreadyUsed = pickBy(\n (p) => !declaredPluginsResolves.includes(p.pathToPlugin),\n installedPlugins\n );\n\n const enabledPlugins = pipe(\n defaultsDeep(declaredPlugins),\n defaultsDeep(installedPluginsNotAlreadyUsed),\n pickBy((p: PluginMeta) => p.enabled)\n )(internalPlugins);\n\n return enabledPlugins;\n};\n"],"names":["INTERNAL_PLUGINS","isStrapiPlugin","info","get","validatePluginName","pluginName","strings","isKebabCase","Error","toDetailedDeclaration","declaration","enabled","detailedDeclaration","resolve","pathToPlugin","isModule","join","dirname","require","strapi","dirs","app","root","existsSync","statSync","isDirectory","getEnabledPlugins","client","internalPlugins","dep","packagePath","packageModulePath","paths","process","cwd","packageInfo","name","installedPlugins","dependencies","config","Object","keys","packageName","declaredPlugins","userPluginsConfig","getUserPluginsConfig","_","forEach","declaredPluginsResolves","map","prop","installedPluginsNotAlreadyUsed","pickBy","p","includes","enabledPlugins","pipe","defaultsDeep"],"mappings":"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"}
1
+ {"version":3,"file":"get-enabled-plugins.js","sources":["../../../src/loaders/plugins/get-enabled-plugins.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\nimport { dirname, join, resolve } from 'path';\nimport { statSync, existsSync } from 'fs';\nimport { get, pickBy, defaultsDeep, map, prop, pipe } from 'lodash/fp';\nimport { strings } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport { getUserPluginsConfig, PluginDeclaration } from './get-user-plugins-config';\n\ninterface PluginMeta {\n enabled: boolean;\n pathToPlugin?: string;\n info: Record<string, unknown>;\n packageInfo?: Record<string, unknown>;\n}\n\ntype PluginMetas = Record<string, PluginMeta>;\n\ninterface PluginInfo {\n name: string;\n kind: string;\n}\n\n/**\n * otherwise known as \"core features\"\n *\n * NOTE: These are excluded from the content manager plugin list, as they are always enabled.\n * See admin.ts server controller on the content-manager plugin for more details.\n */\nconst INTERNAL_PLUGINS = [\n '@strapi/content-manager',\n '@strapi/content-type-builder',\n '@strapi/email',\n '@strapi/upload',\n '@strapi/i18n',\n '@strapi/content-releases',\n '@strapi/review-workflows',\n];\n\nconst isStrapiPlugin = (info: PluginInfo) => get('strapi.kind', info) === 'plugin';\n\nconst validatePluginName = (pluginName: string) => {\n if (!strings.isKebabCase(pluginName)) {\n throw new Error(`Plugin name \"${pluginName}\" is not in kebab (an-example-of-kebab-case)`);\n }\n};\n\nconst toDetailedDeclaration = (declaration: boolean | PluginDeclaration) => {\n if (typeof declaration === 'boolean') {\n return { enabled: declaration };\n }\n\n const detailedDeclaration: { enabled: boolean; pathToPlugin?: string } = {\n enabled: declaration.enabled,\n };\n\n if (declaration?.resolve) {\n let pathToPlugin = '';\n\n if (declaration.isModule) {\n /**\n * we only want the node_module here, not the package.json\n */\n pathToPlugin = join(declaration.resolve, '..');\n } else {\n try {\n pathToPlugin = dirname(require.resolve(declaration.resolve));\n } catch {\n pathToPlugin = resolve(strapi.dirs.app.root, declaration.resolve);\n\n if (!existsSync(pathToPlugin) || !statSync(pathToPlugin).isDirectory()) {\n throw new Error(`${declaration.resolve} couldn't be resolved`);\n }\n }\n }\n\n detailedDeclaration.pathToPlugin = pathToPlugin;\n }\n\n return detailedDeclaration;\n};\n\nexport const getEnabledPlugins = async (strapi: Core.Strapi, { client } = { client: false }) => {\n const internalPlugins: PluginMetas = {};\n\n for (const dep of INTERNAL_PLUGINS) {\n const packagePath = join(dep, 'package.json');\n\n // NOTE: internal plugins should be resolved from the strapi package\n const packageModulePath = require.resolve(packagePath, {\n paths: [require.resolve('@strapi/strapi/package.json'), process.cwd()],\n });\n\n const packageInfo = require(packageModulePath);\n\n validatePluginName(packageInfo.strapi.name);\n internalPlugins[packageInfo.strapi.name] = {\n ...toDetailedDeclaration({ enabled: true, resolve: packageModulePath, isModule: client }),\n info: packageInfo.strapi,\n packageInfo,\n };\n }\n\n const installedPlugins: PluginMetas = {};\n const dependencies = strapi.config.get('info.dependencies', {});\n\n for (const dep of Object.keys(dependencies)) {\n const packagePath = join(dep, 'package.json');\n let packageInfo;\n try {\n packageInfo = require(packagePath);\n } catch {\n continue;\n }\n\n if (isStrapiPlugin(packageInfo)) {\n validatePluginName(packageInfo.strapi.name);\n installedPlugins[packageInfo.strapi.name] = {\n ...toDetailedDeclaration({ enabled: true, resolve: packagePath, isModule: client }),\n info: {\n ...packageInfo.strapi,\n packageName: packageInfo.name,\n },\n packageInfo,\n };\n }\n }\n\n const declaredPlugins: PluginMetas = {};\n const userPluginsConfig = await getUserPluginsConfig();\n\n for (const [pluginName, declaration] of Object.entries(userPluginsConfig)) {\n validatePluginName(pluginName);\n\n declaredPlugins[pluginName] = {\n ...toDetailedDeclaration(declaration),\n info: {},\n };\n\n const { pathToPlugin } = declaredPlugins[pluginName];\n\n // for manually resolved plugins\n if (pathToPlugin) {\n const packagePath = join(pathToPlugin, 'package.json');\n const packageInfo = require(packagePath);\n\n if (isStrapiPlugin(packageInfo)) {\n declaredPlugins[pluginName].info = packageInfo.strapi || {};\n declaredPlugins[pluginName].packageInfo = packageInfo;\n }\n }\n }\n\n const declaredPluginsResolves = map(prop('pathToPlugin'), declaredPlugins);\n const installedPluginsNotAlreadyUsed = pickBy(\n (p) => !declaredPluginsResolves.includes(p.pathToPlugin),\n installedPlugins\n );\n\n const enabledPlugins = pipe(\n defaultsDeep(declaredPlugins),\n defaultsDeep(installedPluginsNotAlreadyUsed),\n pickBy((p: PluginMeta) => p.enabled)\n )(internalPlugins);\n\n return enabledPlugins;\n};\n"],"names":["INTERNAL_PLUGINS","isStrapiPlugin","info","get","validatePluginName","pluginName","strings","isKebabCase","Error","toDetailedDeclaration","declaration","enabled","detailedDeclaration","resolve","pathToPlugin","isModule","join","dirname","require","strapi","dirs","app","root","existsSync","statSync","isDirectory","getEnabledPlugins","client","internalPlugins","dep","packagePath","packageModulePath","paths","process","cwd","packageInfo","name","installedPlugins","dependencies","config","Object","keys","packageName","declaredPlugins","userPluginsConfig","getUserPluginsConfig","entries","declaredPluginsResolves","map","prop","installedPluginsNotAlreadyUsed","pickBy","p","includes","enabledPlugins","pipe","defaultsDeep"],"mappings":"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"}
@@ -1,6 +1,5 @@
1
1
  import { join, dirname, resolve } from 'path';
2
2
  import { existsSync, statSync } from 'fs';
3
- import _ from 'lodash';
4
3
  import { map, prop, pickBy, pipe, defaultsDeep, get } from 'lodash/fp';
5
4
  import { strings } from '@strapi/utils';
6
5
  import { getUserPluginsConfig } from './get-user-plugins-config.mjs';
@@ -107,7 +106,7 @@ const getEnabledPlugins = async (strapi1, { client } = {
107
106
  }
108
107
  const declaredPlugins = {};
109
108
  const userPluginsConfig = await getUserPluginsConfig();
110
- _.forEach(userPluginsConfig, (declaration, pluginName)=>{
109
+ for (const [pluginName, declaration] of Object.entries(userPluginsConfig)){
111
110
  validatePluginName(pluginName);
112
111
  declaredPlugins[pluginName] = {
113
112
  ...toDetailedDeclaration(declaration),
@@ -123,7 +122,7 @@ const getEnabledPlugins = async (strapi1, { client } = {
123
122
  declaredPlugins[pluginName].packageInfo = packageInfo;
124
123
  }
125
124
  }
126
- });
125
+ }
127
126
  const declaredPluginsResolves = map(prop('pathToPlugin'), declaredPlugins);
128
127
  const installedPluginsNotAlreadyUsed = pickBy((p)=>!declaredPluginsResolves.includes(p.pathToPlugin), installedPlugins);
129
128
  const enabledPlugins = pipe(defaultsDeep(declaredPlugins), defaultsDeep(installedPluginsNotAlreadyUsed), pickBy((p)=>p.enabled))(internalPlugins);
@@ -1 +1 @@
1
- {"version":3,"file":"get-enabled-plugins.mjs","sources":["../../../src/loaders/plugins/get-enabled-plugins.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\nimport { dirname, join, resolve } from 'path';\nimport { statSync, existsSync } from 'fs';\nimport _ from 'lodash';\nimport { get, pickBy, defaultsDeep, map, prop, pipe } from 'lodash/fp';\nimport { strings } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport { getUserPluginsConfig } from './get-user-plugins-config';\n\ninterface PluginMeta {\n enabled: boolean;\n pathToPlugin?: string;\n info: Record<string, unknown>;\n packageInfo?: Record<string, unknown>;\n}\n\ntype PluginMetas = Record<string, PluginMeta>;\n\ninterface PluginInfo {\n name: string;\n kind: string;\n}\n\ninterface PluginDeclaration {\n enabled: boolean;\n resolve: string;\n isModule: boolean;\n}\n\n/**\n * otherwise known as \"core features\"\n *\n * NOTE: These are excluded from the content manager plugin list, as they are always enabled.\n * See admin.ts server controller on the content-manager plugin for more details.\n */\nconst INTERNAL_PLUGINS = [\n '@strapi/content-manager',\n '@strapi/content-type-builder',\n '@strapi/email',\n '@strapi/upload',\n '@strapi/i18n',\n '@strapi/content-releases',\n '@strapi/review-workflows',\n];\n\nconst isStrapiPlugin = (info: PluginInfo) => get('strapi.kind', info) === 'plugin';\n\nconst validatePluginName = (pluginName: string) => {\n if (!strings.isKebabCase(pluginName)) {\n throw new Error(`Plugin name \"${pluginName}\" is not in kebab (an-example-of-kebab-case)`);\n }\n};\n\nconst toDetailedDeclaration = (declaration: boolean | PluginDeclaration) => {\n if (typeof declaration === 'boolean') {\n return { enabled: declaration };\n }\n\n const detailedDeclaration: { enabled: boolean; pathToPlugin?: string } = {\n enabled: declaration.enabled,\n };\n\n if (declaration?.resolve) {\n let pathToPlugin = '';\n\n if (declaration.isModule) {\n /**\n * we only want the node_module here, not the package.json\n */\n pathToPlugin = join(declaration.resolve, '..');\n } else {\n try {\n pathToPlugin = dirname(require.resolve(declaration.resolve));\n } catch {\n pathToPlugin = resolve(strapi.dirs.app.root, declaration.resolve);\n\n if (!existsSync(pathToPlugin) || !statSync(pathToPlugin).isDirectory()) {\n throw new Error(`${declaration.resolve} couldn't be resolved`);\n }\n }\n }\n\n detailedDeclaration.pathToPlugin = pathToPlugin;\n }\n\n return detailedDeclaration;\n};\n\nexport const getEnabledPlugins = async (strapi: Core.Strapi, { client } = { client: false }) => {\n const internalPlugins: PluginMetas = {};\n\n for (const dep of INTERNAL_PLUGINS) {\n const packagePath = join(dep, 'package.json');\n\n // NOTE: internal plugins should be resolved from the strapi package\n const packageModulePath = require.resolve(packagePath, {\n paths: [require.resolve('@strapi/strapi/package.json'), process.cwd()],\n });\n\n const packageInfo = require(packageModulePath);\n\n validatePluginName(packageInfo.strapi.name);\n internalPlugins[packageInfo.strapi.name] = {\n ...toDetailedDeclaration({ enabled: true, resolve: packageModulePath, isModule: client }),\n info: packageInfo.strapi,\n packageInfo,\n };\n }\n\n const installedPlugins: PluginMetas = {};\n const dependencies = strapi.config.get('info.dependencies', {});\n\n for (const dep of Object.keys(dependencies)) {\n const packagePath = join(dep, 'package.json');\n let packageInfo;\n try {\n packageInfo = require(packagePath);\n } catch {\n continue;\n }\n\n if (isStrapiPlugin(packageInfo)) {\n validatePluginName(packageInfo.strapi.name);\n installedPlugins[packageInfo.strapi.name] = {\n ...toDetailedDeclaration({ enabled: true, resolve: packagePath, isModule: client }),\n info: {\n ...packageInfo.strapi,\n packageName: packageInfo.name,\n },\n packageInfo,\n };\n }\n }\n\n const declaredPlugins: PluginMetas = {};\n const userPluginsConfig = await getUserPluginsConfig();\n\n _.forEach(userPluginsConfig, (declaration, pluginName) => {\n validatePluginName(pluginName);\n\n declaredPlugins[pluginName] = {\n ...toDetailedDeclaration(declaration),\n info: {},\n };\n\n const { pathToPlugin } = declaredPlugins[pluginName];\n\n // for manually resolved plugins\n if (pathToPlugin) {\n const packagePath = join(pathToPlugin, 'package.json');\n const packageInfo = require(packagePath);\n\n if (isStrapiPlugin(packageInfo)) {\n declaredPlugins[pluginName].info = packageInfo.strapi || {};\n declaredPlugins[pluginName].packageInfo = packageInfo;\n }\n }\n });\n\n const declaredPluginsResolves = map(prop('pathToPlugin'), declaredPlugins);\n const installedPluginsNotAlreadyUsed = pickBy(\n (p) => !declaredPluginsResolves.includes(p.pathToPlugin),\n installedPlugins\n );\n\n const enabledPlugins = pipe(\n defaultsDeep(declaredPlugins),\n defaultsDeep(installedPluginsNotAlreadyUsed),\n pickBy((p: PluginMeta) => p.enabled)\n )(internalPlugins);\n\n return enabledPlugins;\n};\n"],"names":["INTERNAL_PLUGINS","isStrapiPlugin","info","get","validatePluginName","pluginName","strings","isKebabCase","Error","toDetailedDeclaration","declaration","enabled","detailedDeclaration","resolve","pathToPlugin","isModule","join","dirname","require","strapi","dirs","app","root","existsSync","statSync","isDirectory","getEnabledPlugins","client","internalPlugins","dep","packagePath","packageModulePath","paths","process","cwd","packageInfo","name","installedPlugins","dependencies","config","Object","keys","packageName","declaredPlugins","userPluginsConfig","getUserPluginsConfig","_","forEach","declaredPluginsResolves","map","prop","installedPluginsNotAlreadyUsed","pickBy","p","includes","enabledPlugins","pipe","defaultsDeep"],"mappings":"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"}
1
+ {"version":3,"file":"get-enabled-plugins.mjs","sources":["../../../src/loaders/plugins/get-enabled-plugins.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\nimport { dirname, join, resolve } from 'path';\nimport { statSync, existsSync } from 'fs';\nimport { get, pickBy, defaultsDeep, map, prop, pipe } from 'lodash/fp';\nimport { strings } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport { getUserPluginsConfig, PluginDeclaration } from './get-user-plugins-config';\n\ninterface PluginMeta {\n enabled: boolean;\n pathToPlugin?: string;\n info: Record<string, unknown>;\n packageInfo?: Record<string, unknown>;\n}\n\ntype PluginMetas = Record<string, PluginMeta>;\n\ninterface PluginInfo {\n name: string;\n kind: string;\n}\n\n/**\n * otherwise known as \"core features\"\n *\n * NOTE: These are excluded from the content manager plugin list, as they are always enabled.\n * See admin.ts server controller on the content-manager plugin for more details.\n */\nconst INTERNAL_PLUGINS = [\n '@strapi/content-manager',\n '@strapi/content-type-builder',\n '@strapi/email',\n '@strapi/upload',\n '@strapi/i18n',\n '@strapi/content-releases',\n '@strapi/review-workflows',\n];\n\nconst isStrapiPlugin = (info: PluginInfo) => get('strapi.kind', info) === 'plugin';\n\nconst validatePluginName = (pluginName: string) => {\n if (!strings.isKebabCase(pluginName)) {\n throw new Error(`Plugin name \"${pluginName}\" is not in kebab (an-example-of-kebab-case)`);\n }\n};\n\nconst toDetailedDeclaration = (declaration: boolean | PluginDeclaration) => {\n if (typeof declaration === 'boolean') {\n return { enabled: declaration };\n }\n\n const detailedDeclaration: { enabled: boolean; pathToPlugin?: string } = {\n enabled: declaration.enabled,\n };\n\n if (declaration?.resolve) {\n let pathToPlugin = '';\n\n if (declaration.isModule) {\n /**\n * we only want the node_module here, not the package.json\n */\n pathToPlugin = join(declaration.resolve, '..');\n } else {\n try {\n pathToPlugin = dirname(require.resolve(declaration.resolve));\n } catch {\n pathToPlugin = resolve(strapi.dirs.app.root, declaration.resolve);\n\n if (!existsSync(pathToPlugin) || !statSync(pathToPlugin).isDirectory()) {\n throw new Error(`${declaration.resolve} couldn't be resolved`);\n }\n }\n }\n\n detailedDeclaration.pathToPlugin = pathToPlugin;\n }\n\n return detailedDeclaration;\n};\n\nexport const getEnabledPlugins = async (strapi: Core.Strapi, { client } = { client: false }) => {\n const internalPlugins: PluginMetas = {};\n\n for (const dep of INTERNAL_PLUGINS) {\n const packagePath = join(dep, 'package.json');\n\n // NOTE: internal plugins should be resolved from the strapi package\n const packageModulePath = require.resolve(packagePath, {\n paths: [require.resolve('@strapi/strapi/package.json'), process.cwd()],\n });\n\n const packageInfo = require(packageModulePath);\n\n validatePluginName(packageInfo.strapi.name);\n internalPlugins[packageInfo.strapi.name] = {\n ...toDetailedDeclaration({ enabled: true, resolve: packageModulePath, isModule: client }),\n info: packageInfo.strapi,\n packageInfo,\n };\n }\n\n const installedPlugins: PluginMetas = {};\n const dependencies = strapi.config.get('info.dependencies', {});\n\n for (const dep of Object.keys(dependencies)) {\n const packagePath = join(dep, 'package.json');\n let packageInfo;\n try {\n packageInfo = require(packagePath);\n } catch {\n continue;\n }\n\n if (isStrapiPlugin(packageInfo)) {\n validatePluginName(packageInfo.strapi.name);\n installedPlugins[packageInfo.strapi.name] = {\n ...toDetailedDeclaration({ enabled: true, resolve: packagePath, isModule: client }),\n info: {\n ...packageInfo.strapi,\n packageName: packageInfo.name,\n },\n packageInfo,\n };\n }\n }\n\n const declaredPlugins: PluginMetas = {};\n const userPluginsConfig = await getUserPluginsConfig();\n\n for (const [pluginName, declaration] of Object.entries(userPluginsConfig)) {\n validatePluginName(pluginName);\n\n declaredPlugins[pluginName] = {\n ...toDetailedDeclaration(declaration),\n info: {},\n };\n\n const { pathToPlugin } = declaredPlugins[pluginName];\n\n // for manually resolved plugins\n if (pathToPlugin) {\n const packagePath = join(pathToPlugin, 'package.json');\n const packageInfo = require(packagePath);\n\n if (isStrapiPlugin(packageInfo)) {\n declaredPlugins[pluginName].info = packageInfo.strapi || {};\n declaredPlugins[pluginName].packageInfo = packageInfo;\n }\n }\n }\n\n const declaredPluginsResolves = map(prop('pathToPlugin'), declaredPlugins);\n const installedPluginsNotAlreadyUsed = pickBy(\n (p) => !declaredPluginsResolves.includes(p.pathToPlugin),\n installedPlugins\n );\n\n const enabledPlugins = pipe(\n defaultsDeep(declaredPlugins),\n defaultsDeep(installedPluginsNotAlreadyUsed),\n pickBy((p: PluginMeta) => p.enabled)\n )(internalPlugins);\n\n return enabledPlugins;\n};\n"],"names":["INTERNAL_PLUGINS","isStrapiPlugin","info","get","validatePluginName","pluginName","strings","isKebabCase","Error","toDetailedDeclaration","declaration","enabled","detailedDeclaration","resolve","pathToPlugin","isModule","join","dirname","require","strapi","dirs","app","root","existsSync","statSync","isDirectory","getEnabledPlugins","client","internalPlugins","dep","packagePath","packageModulePath","paths","process","cwd","packageInfo","name","installedPlugins","dependencies","config","Object","keys","packageName","declaredPlugins","userPluginsConfig","getUserPluginsConfig","entries","declaredPluginsResolves","map","prop","installedPluginsNotAlreadyUsed","pickBy","p","includes","enabledPlugins","pipe","defaultsDeep"],"mappings":";;;;;;AAsBA;;;;;AAKC,IACD,MAAMA,gBAAAA,GAAmB;AACvB,IAAA,yBAAA;AACA,IAAA,8BAAA;AACA,IAAA,eAAA;AACA,IAAA,gBAAA;AACA,IAAA,cAAA;AACA,IAAA,0BAAA;AACA,IAAA;AACD,CAAA;AAED,MAAMC,cAAAA,GAAiB,CAACC,IAAAA,GAAqBC,GAAAA,CAAI,eAAeD,IAAAA,CAAAA,KAAU,QAAA;AAE1E,MAAME,qBAAqB,CAACC,UAAAA,GAAAA;AAC1B,IAAA,IAAI,CAACC,OAAAA,CAAQC,WAAW,CAACF,UAAAA,CAAAA,EAAa;AACpC,QAAA,MAAM,IAAIG,KAAAA,CAAM,CAAC,aAAa,EAAEH,UAAAA,CAAW,4CAA4C,CAAC,CAAA;AAC1F,IAAA;AACF,CAAA;AAEA,MAAMI,wBAAwB,CAACC,WAAAA,GAAAA;IAC7B,IAAI,OAAOA,gBAAgB,SAAA,EAAW;QACpC,OAAO;YAAEC,OAAAA,EAASD;AAAY,SAAA;AAChC,IAAA;AAEA,IAAA,MAAME,mBAAAA,GAAmE;AACvED,QAAAA,OAAAA,EAASD,YAAYC;AACvB,KAAA;AAEA,IAAA,IAAID,aAAaG,OAAAA,EAAS;AACxB,QAAA,IAAIC,YAAAA,GAAe,EAAA;QAEnB,IAAIJ,WAAAA,CAAYK,QAAQ,EAAE;AACxB;;AAEC,UACDD,YAAAA,GAAeE,IAAAA,CAAKN,WAAAA,CAAYG,OAAO,EAAE,IAAA,CAAA;QAC3C,CAAA,MAAO;YACL,IAAI;AACFC,gBAAAA,YAAAA,GAAeG,OAAAA,CAAQC,OAAAA,CAAQL,OAAO,CAACH,YAAYG,OAAO,CAAA,CAAA;AAC5D,YAAA,CAAA,CAAE,OAAM;gBACNC,YAAAA,GAAeD,OAAAA,CAAQM,OAAOC,IAAI,CAACC,GAAG,CAACC,IAAI,EAAEZ,WAAAA,CAAYG,OAAO,CAAA;AAEhE,gBAAA,IAAI,CAACU,UAAAA,CAAWT,YAAAA,CAAAA,IAAiB,CAACU,QAAAA,CAASV,YAAAA,CAAAA,CAAcW,WAAW,EAAA,EAAI;AACtE,oBAAA,MAAM,IAAIjB,KAAAA,CAAM,CAAA,EAAGE,YAAYG,OAAO,CAAC,qBAAqB,CAAC,CAAA;AAC/D,gBAAA;AACF,YAAA;AACF,QAAA;AAEAD,QAAAA,mBAAAA,CAAoBE,YAAY,GAAGA,YAAAA;AACrC,IAAA;IAEA,OAAOF,mBAAAA;AACT,CAAA;MAEac,iBAAAA,GAAoB,OAAOP,SAAqB,EAAEQ,MAAM,EAAE,GAAG;IAAEA,MAAAA,EAAQ;AAAM,CAAC,GAAA;AACzF,IAAA,MAAMC,kBAA+B,EAAC;IAEtC,KAAK,MAAMC,OAAO7B,gBAAAA,CAAkB;QAClC,MAAM8B,WAAAA,GAAcd,KAAKa,GAAAA,EAAK,cAAA,CAAA;;AAG9B,QAAA,MAAME,iBAAAA,GAAoBb,OAAAA,CAAQL,OAAO,CAACiB,WAAAA,EAAa;YACrDE,KAAAA,EAAO;AAACd,gBAAAA,OAAAA,CAAQL,OAAO,CAAC,6BAAA,CAAA;AAAgCoB,gBAAAA,OAAAA,CAAQC,GAAG;AAAG;AACxE,SAAA,CAAA;AAEA,QAAA,MAAMC,cAAcjB,OAAAA,CAAQa,iBAAAA,CAAAA;QAE5B3B,kBAAAA,CAAmB+B,WAAAA,CAAYhB,MAAM,CAACiB,IAAI,CAAA;AAC1CR,QAAAA,eAAe,CAACO,WAAAA,CAAYhB,MAAM,CAACiB,IAAI,CAAC,GAAG;AACzC,YAAA,GAAG3B,qBAAAA,CAAsB;gBAAEE,OAAAA,EAAS,IAAA;gBAAME,OAAAA,EAASkB,iBAAAA;gBAAmBhB,QAAAA,EAAUY;aAAO,CAAE;AACzFzB,YAAAA,IAAAA,EAAMiC,YAAYhB,MAAM;AACxBgB,YAAAA;AACF,SAAA;AACF,IAAA;AAEA,IAAA,MAAME,mBAAgC,EAAC;AACvC,IAAA,MAAMC,eAAenB,OAAAA,CAAOoB,MAAM,CAACpC,GAAG,CAAC,qBAAqB,EAAC,CAAA;AAE7D,IAAA,KAAK,MAAM0B,GAAAA,IAAOW,MAAAA,CAAOC,IAAI,CAACH,YAAAA,CAAAA,CAAe;QAC3C,MAAMR,WAAAA,GAAcd,KAAKa,GAAAA,EAAK,cAAA,CAAA;QAC9B,IAAIM,WAAAA;QACJ,IAAI;AACFA,YAAAA,WAAAA,GAAcjB,OAAAA,CAAQY,WAAAA,CAAAA;AACxB,QAAA,CAAA,CAAE,OAAM;AACN,YAAA;AACF,QAAA;AAEA,QAAA,IAAI7B,eAAekC,WAAAA,CAAAA,EAAc;YAC/B/B,kBAAAA,CAAmB+B,WAAAA,CAAYhB,MAAM,CAACiB,IAAI,CAAA;AAC1CC,YAAAA,gBAAgB,CAACF,WAAAA,CAAYhB,MAAM,CAACiB,IAAI,CAAC,GAAG;AAC1C,gBAAA,GAAG3B,qBAAAA,CAAsB;oBAAEE,OAAAA,EAAS,IAAA;oBAAME,OAAAA,EAASiB,WAAAA;oBAAaf,QAAAA,EAAUY;iBAAO,CAAE;gBACnFzB,IAAAA,EAAM;AACJ,oBAAA,GAAGiC,YAAYhB,MAAM;AACrBuB,oBAAAA,WAAAA,EAAaP,YAAYC;AAC3B,iBAAA;AACAD,gBAAAA;AACF,aAAA;AACF,QAAA;AACF,IAAA;AAEA,IAAA,MAAMQ,kBAA+B,EAAC;AACtC,IAAA,MAAMC,oBAAoB,MAAMC,oBAAAA,EAAAA;IAEhC,KAAK,MAAM,CAACxC,UAAAA,EAAYK,WAAAA,CAAY,IAAI8B,MAAAA,CAAOM,OAAO,CAACF,iBAAAA,CAAAA,CAAoB;QACzExC,kBAAAA,CAAmBC,UAAAA,CAAAA;QAEnBsC,eAAe,CAACtC,WAAW,GAAG;AAC5B,YAAA,GAAGI,sBAAsBC,WAAAA,CAAY;AACrCR,YAAAA,IAAAA,EAAM;AACR,SAAA;AAEA,QAAA,MAAM,EAAEY,YAAY,EAAE,GAAG6B,eAAe,CAACtC,UAAAA,CAAW;;AAGpD,QAAA,IAAIS,YAAAA,EAAc;YAChB,MAAMgB,WAAAA,GAAcd,KAAKF,YAAAA,EAAc,cAAA,CAAA;AACvC,YAAA,MAAMqB,cAAcjB,OAAAA,CAAQY,WAAAA,CAAAA;AAE5B,YAAA,IAAI7B,eAAekC,WAAAA,CAAAA,EAAc;gBAC/BQ,eAAe,CAACtC,WAAW,CAACH,IAAI,GAAGiC,WAAAA,CAAYhB,MAAM,IAAI,EAAC;AAC1DwB,gBAAAA,eAAe,CAACtC,UAAAA,CAAW,CAAC8B,WAAW,GAAGA,WAAAA;AAC5C,YAAA;AACF,QAAA;AACF,IAAA;IAEA,MAAMY,uBAAAA,GAA0BC,GAAAA,CAAIC,IAAAA,CAAK,cAAA,CAAA,EAAiBN,eAAAA,CAAAA;IAC1D,MAAMO,8BAAAA,GAAiCC,MAAAA,CACrC,CAACC,CAAAA,GAAM,CAACL,wBAAwBM,QAAQ,CAACD,CAAAA,CAAEtC,YAAY,CAAA,EACvDuB,gBAAAA,CAAAA;IAGF,MAAMiB,cAAAA,GAAiBC,IAAAA,CACrBC,YAAAA,CAAab,eAAAA,CAAAA,EACba,YAAAA,CAAaN,8BAAAA,CAAAA,EACbC,MAAAA,CAAO,CAACC,CAAAA,GAAkBA,CAAAA,CAAEzC,OAAO,CAAA,CAAA,CACnCiB,eAAAA,CAAAA;IAEF,OAAO0B,cAAAA;AACT;;;;"}
@@ -1,7 +1,12 @@
1
+ export interface PluginDeclaration {
2
+ enabled: boolean;
3
+ resolve: string;
4
+ isModule: boolean;
5
+ }
1
6
  /**
2
7
  * Return user defined plugins' config
3
8
  * first load config from `config/plugins.js`
4
9
  * and then merge config from `config/env/{env}/plugins.js`
5
10
  */
6
- export declare const getUserPluginsConfig: () => Promise<{}>;
11
+ export declare const getUserPluginsConfig: () => Promise<Record<string, boolean | PluginDeclaration>>;
7
12
  //# sourceMappingURL=get-user-plugins-config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-user-plugins-config.d.ts","sourceRoot":"","sources":["../../../src/loaders/plugins/get-user-plugins-config.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,mBAqBhC,CAAC"}
1
+ {"version":3,"file":"get-user-plugins-config.d.ts","sourceRoot":"","sources":["../../../src/loaders/plugins/get-user-plugins-config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,4DAqBhC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-user-plugins-config.js","sources":["../../../src/loaders/plugins/get-user-plugins-config.ts"],"sourcesContent":["import { join } from 'path';\nimport fse from 'fs-extra';\nimport { merge } from 'lodash/fp';\nimport { loadConfigFile } from '../../utils/load-config-file';\n\n/**\n * Return user defined plugins' config\n * first load config from `config/plugins.js`\n * and then merge config from `config/env/{env}/plugins.js`\n */\nexport const getUserPluginsConfig = async () => {\n const globalUserConfigPath = join(strapi.dirs.dist.config, 'plugins.js');\n const currentEnvUserConfigPath = join(\n strapi.dirs.dist.config,\n 'env',\n process.env.NODE_ENV as string,\n 'plugins.js'\n );\n let config = {};\n\n // assign global user config if exists\n if (await fse.pathExists(globalUserConfigPath)) {\n config = loadConfigFile(globalUserConfigPath);\n }\n\n // and merge user config by environment if exists\n if (await fse.pathExists(currentEnvUserConfigPath)) {\n config = merge(config, loadConfigFile(currentEnvUserConfigPath));\n }\n\n return config;\n};\n"],"names":["getUserPluginsConfig","globalUserConfigPath","join","strapi","dirs","dist","config","currentEnvUserConfigPath","process","env","NODE_ENV","fse","pathExists","loadConfigFile","merge"],"mappings":";;;;;;;;;;;AAKA;;;;UAKaA,oBAAAA,GAAuB,UAAA;IAClC,MAAMC,oBAAAA,GAAuBC,UAAKC,MAAAA,CAAOC,IAAI,CAACC,IAAI,CAACC,MAAM,EAAE,YAAA,CAAA;AAC3D,IAAA,MAAMC,wBAAAA,GAA2BL,SAAAA,CAC/BC,MAAAA,CAAOC,IAAI,CAACC,IAAI,CAACC,MAAM,EACvB,KAAA,EACAE,OAAAA,CAAQC,GAAG,CAACC,QAAQ,EACpB,YAAA,CAAA;AAEF,IAAA,IAAIJ,SAAS,EAAC;;AAGd,IAAA,IAAI,MAAMK,oBAAAA,CAAIC,UAAU,CAACX,oBAAAA,CAAAA,EAAuB;AAC9CK,QAAAA,MAAAA,GAASO,6BAAAA,CAAeZ,oBAAAA,CAAAA;AAC1B,IAAA;;AAGA,IAAA,IAAI,MAAMU,oBAAAA,CAAIC,UAAU,CAACL,wBAAAA,CAAAA,EAA2B;QAClDD,MAAAA,GAASQ,QAAAA,CAAMR,QAAQO,6BAAAA,CAAeN,wBAAAA,CAAAA,CAAAA;AACxC,IAAA;IAEA,OAAOD,MAAAA;AACT;;;;"}
1
+ {"version":3,"file":"get-user-plugins-config.js","sources":["../../../src/loaders/plugins/get-user-plugins-config.ts"],"sourcesContent":["import { join } from 'path';\nimport fse from 'fs-extra';\nimport { merge } from 'lodash/fp';\nimport { loadConfigFile } from '../../utils/load-config-file';\n\nexport interface PluginDeclaration {\n enabled: boolean;\n resolve: string;\n isModule: boolean;\n}\n\n/**\n * Return user defined plugins' config\n * first load config from `config/plugins.js`\n * and then merge config from `config/env/{env}/plugins.js`\n */\nexport const getUserPluginsConfig = async () => {\n const globalUserConfigPath = join(strapi.dirs.dist.config, 'plugins.js');\n const currentEnvUserConfigPath = join(\n strapi.dirs.dist.config,\n 'env',\n process.env.NODE_ENV as string,\n 'plugins.js'\n );\n let config: Record<string, PluginDeclaration | boolean> = {};\n\n // assign global user config if exists\n if (await fse.pathExists(globalUserConfigPath)) {\n config = loadConfigFile(globalUserConfigPath);\n }\n\n // and merge user config by environment if exists\n if (await fse.pathExists(currentEnvUserConfigPath)) {\n config = merge(config, loadConfigFile(currentEnvUserConfigPath));\n }\n\n return config;\n};\n"],"names":["getUserPluginsConfig","globalUserConfigPath","join","strapi","dirs","dist","config","currentEnvUserConfigPath","process","env","NODE_ENV","fse","pathExists","loadConfigFile","merge"],"mappings":";;;;;;;;;;;AAWA;;;;UAKaA,oBAAAA,GAAuB,UAAA;IAClC,MAAMC,oBAAAA,GAAuBC,UAAKC,MAAAA,CAAOC,IAAI,CAACC,IAAI,CAACC,MAAM,EAAE,YAAA,CAAA;AAC3D,IAAA,MAAMC,wBAAAA,GAA2BL,SAAAA,CAC/BC,MAAAA,CAAOC,IAAI,CAACC,IAAI,CAACC,MAAM,EACvB,KAAA,EACAE,OAAAA,CAAQC,GAAG,CAACC,QAAQ,EACpB,YAAA,CAAA;AAEF,IAAA,IAAIJ,SAAsD,EAAC;;AAG3D,IAAA,IAAI,MAAMK,oBAAAA,CAAIC,UAAU,CAACX,oBAAAA,CAAAA,EAAuB;AAC9CK,QAAAA,MAAAA,GAASO,6BAAAA,CAAeZ,oBAAAA,CAAAA;AAC1B,IAAA;;AAGA,IAAA,IAAI,MAAMU,oBAAAA,CAAIC,UAAU,CAACL,wBAAAA,CAAAA,EAA2B;QAClDD,MAAAA,GAASQ,QAAAA,CAAMR,QAAQO,6BAAAA,CAAeN,wBAAAA,CAAAA,CAAAA;AACxC,IAAA;IAEA,OAAOD,MAAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-user-plugins-config.mjs","sources":["../../../src/loaders/plugins/get-user-plugins-config.ts"],"sourcesContent":["import { join } from 'path';\nimport fse from 'fs-extra';\nimport { merge } from 'lodash/fp';\nimport { loadConfigFile } from '../../utils/load-config-file';\n\n/**\n * Return user defined plugins' config\n * first load config from `config/plugins.js`\n * and then merge config from `config/env/{env}/plugins.js`\n */\nexport const getUserPluginsConfig = async () => {\n const globalUserConfigPath = join(strapi.dirs.dist.config, 'plugins.js');\n const currentEnvUserConfigPath = join(\n strapi.dirs.dist.config,\n 'env',\n process.env.NODE_ENV as string,\n 'plugins.js'\n );\n let config = {};\n\n // assign global user config if exists\n if (await fse.pathExists(globalUserConfigPath)) {\n config = loadConfigFile(globalUserConfigPath);\n }\n\n // and merge user config by environment if exists\n if (await fse.pathExists(currentEnvUserConfigPath)) {\n config = merge(config, loadConfigFile(currentEnvUserConfigPath));\n }\n\n return config;\n};\n"],"names":["getUserPluginsConfig","globalUserConfigPath","join","strapi","dirs","dist","config","currentEnvUserConfigPath","process","env","NODE_ENV","fse","pathExists","loadConfigFile","merge"],"mappings":";;;;;AAKA;;;;UAKaA,oBAAAA,GAAuB,UAAA;IAClC,MAAMC,oBAAAA,GAAuBC,KAAKC,MAAAA,CAAOC,IAAI,CAACC,IAAI,CAACC,MAAM,EAAE,YAAA,CAAA;AAC3D,IAAA,MAAMC,wBAAAA,GAA2BL,IAAAA,CAC/BC,MAAAA,CAAOC,IAAI,CAACC,IAAI,CAACC,MAAM,EACvB,KAAA,EACAE,OAAAA,CAAQC,GAAG,CAACC,QAAQ,EACpB,YAAA,CAAA;AAEF,IAAA,IAAIJ,SAAS,EAAC;;AAGd,IAAA,IAAI,MAAMK,GAAAA,CAAIC,UAAU,CAACX,oBAAAA,CAAAA,EAAuB;AAC9CK,QAAAA,MAAAA,GAASO,cAAAA,CAAeZ,oBAAAA,CAAAA;AAC1B,IAAA;;AAGA,IAAA,IAAI,MAAMU,GAAAA,CAAIC,UAAU,CAACL,wBAAAA,CAAAA,EAA2B;QAClDD,MAAAA,GAASQ,KAAAA,CAAMR,QAAQO,cAAAA,CAAeN,wBAAAA,CAAAA,CAAAA;AACxC,IAAA;IAEA,OAAOD,MAAAA;AACT;;;;"}
1
+ {"version":3,"file":"get-user-plugins-config.mjs","sources":["../../../src/loaders/plugins/get-user-plugins-config.ts"],"sourcesContent":["import { join } from 'path';\nimport fse from 'fs-extra';\nimport { merge } from 'lodash/fp';\nimport { loadConfigFile } from '../../utils/load-config-file';\n\nexport interface PluginDeclaration {\n enabled: boolean;\n resolve: string;\n isModule: boolean;\n}\n\n/**\n * Return user defined plugins' config\n * first load config from `config/plugins.js`\n * and then merge config from `config/env/{env}/plugins.js`\n */\nexport const getUserPluginsConfig = async () => {\n const globalUserConfigPath = join(strapi.dirs.dist.config, 'plugins.js');\n const currentEnvUserConfigPath = join(\n strapi.dirs.dist.config,\n 'env',\n process.env.NODE_ENV as string,\n 'plugins.js'\n );\n let config: Record<string, PluginDeclaration | boolean> = {};\n\n // assign global user config if exists\n if (await fse.pathExists(globalUserConfigPath)) {\n config = loadConfigFile(globalUserConfigPath);\n }\n\n // and merge user config by environment if exists\n if (await fse.pathExists(currentEnvUserConfigPath)) {\n config = merge(config, loadConfigFile(currentEnvUserConfigPath));\n }\n\n return config;\n};\n"],"names":["getUserPluginsConfig","globalUserConfigPath","join","strapi","dirs","dist","config","currentEnvUserConfigPath","process","env","NODE_ENV","fse","pathExists","loadConfigFile","merge"],"mappings":";;;;;AAWA;;;;UAKaA,oBAAAA,GAAuB,UAAA;IAClC,MAAMC,oBAAAA,GAAuBC,KAAKC,MAAAA,CAAOC,IAAI,CAACC,IAAI,CAACC,MAAM,EAAE,YAAA,CAAA;AAC3D,IAAA,MAAMC,wBAAAA,GAA2BL,IAAAA,CAC/BC,MAAAA,CAAOC,IAAI,CAACC,IAAI,CAACC,MAAM,EACvB,KAAA,EACAE,OAAAA,CAAQC,GAAG,CAACC,QAAQ,EACpB,YAAA,CAAA;AAEF,IAAA,IAAIJ,SAAsD,EAAC;;AAG3D,IAAA,IAAI,MAAMK,GAAAA,CAAIC,UAAU,CAACX,oBAAAA,CAAAA,EAAuB;AAC9CK,QAAAA,MAAAA,GAASO,cAAAA,CAAeZ,oBAAAA,CAAAA;AAC1B,IAAA;;AAGA,IAAA,IAAI,MAAMU,GAAAA,CAAIC,UAAU,CAACL,wBAAAA,CAAAA,EAA2B;QAClDD,MAAAA,GAASQ,KAAAA,CAAMR,QAAQO,cAAAA,CAAeN,wBAAAA,CAAAA,CAAAA;AACxC,IAAA;IAEA,OAAOD,MAAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"5.0.0-discard-drafts.d.ts","sourceRoot":"","sources":["../../../src/migrations/database/5.0.0-discard-drafts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAY5D,KAAK,eAAe,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAC9D,KAAK,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AA2+G3C;;;;;GAKG;AACH,wBAAuB,iBAAiB,CAAC,EACvC,EAAE,EACF,GAAG,EACH,GAAG,EACH,gBAAuB,GACxB,EAAE;IACD,EAAE,EAAE,QAAQ,CAAC;IACb,GAAG,EAAE,IAAI,CAAC;IACV,GAAG,EAAE,MAAM,CAAC;IACZ,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,oDAwBA;AAED,eAAO,MAAM,qBAAqB,EAAE,SAQnC,CAAC"}
1
+ {"version":3,"file":"5.0.0-discard-drafts.d.ts","sourceRoot":"","sources":["../../../src/migrations/database/5.0.0-discard-drafts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAa5D,KAAK,eAAe,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAC9D,KAAK,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AA++G3C;;;;;GAKG;AACH,wBAAuB,iBAAiB,CAAC,EACvC,EAAE,EACF,GAAG,EACH,GAAG,EACH,gBAAuB,GACxB,EAAE;IACD,EAAE,EAAE,QAAQ,CAAC;IACb,GAAG,EAAE,IAAI,CAAC;IACV,GAAG,EAAE,MAAM,CAAC;IACZ,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,oDAwBA;AAED,eAAO,MAAM,qBAAqB,EAAE,SAQnC,CAAC"}
@@ -4,6 +4,7 @@ var cuid2 = require('@paralleldrive/cuid2');
4
4
  var strapiUtils = require('@strapi/utils');
5
5
  var createDebug = require('debug');
6
6
  var transformContentTypesToModels = require('../../utils/transform-content-types-to-models.js');
7
+ var serializeJsonColumns = require('./serialize-json-columns.js');
7
8
 
8
9
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
10
 
@@ -1272,6 +1273,9 @@ const debug = createDebug__default.default('strapi::migration::discard-drafts');
1272
1273
  }
1273
1274
  newComponentRow[columnName] = await mapTargetId(trx, newComponentRow[columnName], attribute.target, parentUid, parentPublishedToDraftMap, draftMapCache, isForDraftEntity, reverseMapCache);
1274
1275
  }
1276
+ // mysql2 deserializes JSON columns on SELECT but knex does not re-serialize
1277
+ // them on INSERT. Ensure any object values in JSON/blocks columns are stringified.
1278
+ serializeJsonColumns.serializeJsonColumns(newComponentRow, componentMeta);
1275
1279
  let insertResult;
1276
1280
  if (supportsReturning(trx)) {
1277
1281
  try {