@strapi/core 0.0.0-experimental.1e4c115f717b021ca11c139584d4519db28ba786 → 0.0.0-experimental.1f56e9319665c8cc385eb5e4178ceb6741c6d490
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.
Potentially problematic release.
This version of @strapi/core might be problematic. Click here for more details.
- package/dist/Strapi.d.ts +1 -0
- package/dist/Strapi.d.ts.map +1 -1
- package/dist/Strapi.js +23 -2
- package/dist/Strapi.js.map +1 -1
- package/dist/Strapi.mjs +23 -2
- package/dist/Strapi.mjs.map +1 -1
- package/dist/constants.d.ts +3 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +6 -0
- package/dist/constants.js.map +1 -0
- package/dist/constants.mjs +4 -0
- package/dist/constants.mjs.map +1 -0
- package/dist/core-api/controller/index.d.ts.map +1 -1
- package/dist/core-api/controller/index.js +2 -1
- package/dist/core-api/controller/index.js.map +1 -1
- package/dist/core-api/controller/index.mjs +2 -1
- package/dist/core-api/controller/index.mjs.map +1 -1
- package/dist/core-api/controller/transform.d.ts +3 -2
- package/dist/core-api/controller/transform.d.ts.map +1 -1
- package/dist/core-api/controller/transform.js +13 -3
- package/dist/core-api/controller/transform.js.map +1 -1
- package/dist/core-api/controller/transform.mjs +13 -3
- package/dist/core-api/controller/transform.mjs.map +1 -1
- package/dist/core-api/routes/index.d.ts.map +1 -1
- package/dist/core-api/routes/index.js +28 -9
- package/dist/core-api/routes/index.js.map +1 -1
- package/dist/core-api/routes/index.mjs +1 -1
- package/dist/core-api/routes/index.mjs.map +1 -1
- package/dist/core-api/routes/validation/attributes.d.ts +243 -90
- package/dist/core-api/routes/validation/attributes.d.ts.map +1 -1
- package/dist/core-api/routes/validation/attributes.js +541 -564
- package/dist/core-api/routes/validation/attributes.js.map +1 -1
- package/dist/core-api/routes/validation/attributes.mjs +505 -564
- package/dist/core-api/routes/validation/attributes.mjs.map +1 -1
- package/dist/core-api/routes/validation/common.d.ts +7 -5
- package/dist/core-api/routes/validation/common.d.ts.map +1 -1
- package/dist/core-api/routes/validation/common.js +29 -8
- package/dist/core-api/routes/validation/common.js.map +1 -1
- package/dist/core-api/routes/validation/common.mjs +6 -4
- package/dist/core-api/routes/validation/common.mjs.map +1 -1
- package/dist/core-api/routes/validation/component.d.ts +2 -10
- package/dist/core-api/routes/validation/component.d.ts.map +1 -1
- package/dist/core-api/routes/validation/component.js +3 -17
- package/dist/core-api/routes/validation/component.js.map +1 -1
- package/dist/core-api/routes/validation/component.mjs +3 -17
- package/dist/core-api/routes/validation/component.mjs.map +1 -1
- package/dist/core-api/routes/validation/constants.d.ts +6 -0
- package/dist/core-api/routes/validation/constants.d.ts.map +1 -1
- package/dist/core-api/routes/validation/constants.js +6 -1
- package/dist/core-api/routes/validation/constants.js.map +1 -1
- package/dist/core-api/routes/validation/constants.mjs +6 -1
- package/dist/core-api/routes/validation/constants.mjs.map +1 -1
- package/dist/core-api/routes/validation/content-type.d.ts +28 -71
- package/dist/core-api/routes/validation/content-type.d.ts.map +1 -1
- package/dist/core-api/routes/validation/content-type.js +67 -112
- package/dist/core-api/routes/validation/content-type.js.map +1 -1
- package/dist/core-api/routes/validation/content-type.mjs +36 -100
- package/dist/core-api/routes/validation/content-type.mjs.map +1 -1
- package/dist/core-api/routes/validation/index.d.ts +1 -1
- package/dist/core-api/routes/validation/index.d.ts.map +1 -1
- package/dist/core-api/routes/validation/mappers.d.ts +105 -0
- package/dist/core-api/routes/validation/mappers.d.ts.map +1 -0
- package/dist/core-api/routes/validation/mappers.js +273 -0
- package/dist/core-api/routes/validation/mappers.js.map +1 -0
- package/dist/core-api/routes/validation/mappers.mjs +249 -0
- package/dist/core-api/routes/validation/mappers.mjs.map +1 -0
- package/dist/core-api/routes/validation/utils.d.ts +47 -0
- package/dist/core-api/routes/validation/utils.d.ts.map +1 -0
- package/dist/core-api/routes/validation/utils.js +128 -0
- package/dist/core-api/routes/validation/utils.js.map +1 -0
- package/dist/core-api/routes/validation/utils.mjs +106 -0
- package/dist/core-api/routes/validation/utils.mjs.map +1 -0
- package/dist/domain/content-type/index.d.ts.map +1 -1
- package/dist/domain/content-type/index.js +17 -1
- package/dist/domain/content-type/index.js.map +1 -1
- package/dist/domain/content-type/index.mjs +17 -1
- package/dist/domain/content-type/index.mjs.map +1 -1
- package/dist/ee/index.d.ts +6 -0
- package/dist/ee/index.d.ts.map +1 -1
- package/dist/ee/index.js +29 -3
- package/dist/ee/index.js.map +1 -1
- package/dist/ee/index.mjs +30 -4
- package/dist/ee/index.mjs.map +1 -1
- package/dist/ee/license.d.ts +3 -1
- package/dist/ee/license.d.ts.map +1 -1
- package/dist/ee/license.js +6 -1
- package/dist/ee/license.js.map +1 -1
- package/dist/ee/license.mjs +6 -2
- package/dist/ee/license.mjs.map +1 -1
- package/dist/factories.js +1 -1
- package/dist/factories.mjs +1 -1
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/dist/loaders/plugins/index.js +1 -1
- package/dist/loaders/plugins/index.js.map +1 -1
- package/dist/loaders/plugins/index.mjs +1 -1
- package/dist/loaders/plugins/index.mjs.map +1 -1
- package/dist/middlewares/cors.d.ts +9 -1
- package/dist/middlewares/cors.d.ts.map +1 -1
- package/dist/middlewares/cors.js +39 -17
- package/dist/middlewares/cors.js.map +1 -1
- package/dist/middlewares/cors.mjs +39 -18
- package/dist/middlewares/cors.mjs.map +1 -1
- package/dist/migrations/first-published-at.d.ts +4 -0
- package/dist/migrations/first-published-at.d.ts.map +1 -0
- package/dist/migrations/first-published-at.js +51 -0
- package/dist/migrations/first-published-at.js.map +1 -0
- package/dist/migrations/first-published-at.mjs +49 -0
- package/dist/migrations/first-published-at.mjs.map +1 -0
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +5 -0
- package/dist/migrations/index.js.map +1 -1
- package/dist/migrations/index.mjs +5 -0
- package/dist/migrations/index.mjs.map +1 -1
- package/dist/package.json.js +17 -13
- package/dist/package.json.js.map +1 -1
- package/dist/package.json.mjs +17 -13
- package/dist/package.json.mjs.map +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +2 -0
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/index.mjs +2 -0
- package/dist/providers/index.mjs.map +1 -1
- package/dist/providers/session-manager.d.ts +3 -0
- package/dist/providers/session-manager.d.ts.map +1 -0
- package/dist/providers/session-manager.js +23 -0
- package/dist/providers/session-manager.js.map +1 -0
- package/dist/providers/session-manager.mjs +21 -0
- package/dist/providers/session-manager.mjs.map +1 -0
- package/dist/services/content-api/index.d.ts +1 -1
- package/dist/services/content-api/index.d.ts.map +1 -1
- package/dist/services/content-api/index.js +1 -1
- package/dist/services/content-api/index.js.map +1 -1
- package/dist/services/content-api/index.mjs +2 -2
- package/dist/services/content-api/index.mjs.map +1 -1
- package/dist/services/content-source-maps.d.ts +13 -0
- package/dist/services/content-source-maps.d.ts.map +1 -0
- package/dist/services/content-source-maps.js +108 -0
- package/dist/services/content-source-maps.js.map +1 -0
- package/dist/services/content-source-maps.mjs +106 -0
- package/dist/services/content-source-maps.mjs.map +1 -0
- package/dist/services/core-store.d.ts +2 -2
- package/dist/services/core-store.d.ts.map +1 -1
- package/dist/services/core-store.js.map +1 -1
- package/dist/services/core-store.mjs.map +1 -1
- package/dist/services/document-service/components.d.ts +31 -1
- package/dist/services/document-service/components.d.ts.map +1 -1
- package/dist/services/document-service/components.js +109 -0
- package/dist/services/document-service/components.js.map +1 -1
- package/dist/services/document-service/components.mjs +107 -1
- package/dist/services/document-service/components.mjs.map +1 -1
- package/dist/services/document-service/entries.d.ts.map +1 -1
- package/dist/services/document-service/entries.js +42 -0
- package/dist/services/document-service/entries.js.map +1 -1
- package/dist/services/document-service/entries.mjs +43 -1
- package/dist/services/document-service/entries.mjs.map +1 -1
- package/dist/services/document-service/first-published-at.d.ts +7 -0
- package/dist/services/document-service/first-published-at.d.ts.map +1 -0
- package/dist/services/document-service/first-published-at.js +31 -0
- package/dist/services/document-service/first-published-at.js.map +1 -0
- package/dist/services/document-service/first-published-at.mjs +28 -0
- package/dist/services/document-service/first-published-at.mjs.map +1 -0
- package/dist/services/document-service/internationalization.d.ts +6 -1
- package/dist/services/document-service/internationalization.d.ts.map +1 -1
- package/dist/services/document-service/internationalization.js +32 -0
- package/dist/services/document-service/internationalization.js.map +1 -1
- package/dist/services/document-service/internationalization.mjs +32 -1
- package/dist/services/document-service/internationalization.mjs.map +1 -1
- package/dist/services/document-service/repository.d.ts.map +1 -1
- package/dist/services/document-service/repository.js +16 -8
- package/dist/services/document-service/repository.js.map +1 -1
- package/dist/services/document-service/repository.mjs +18 -10
- package/dist/services/document-service/repository.mjs.map +1 -1
- package/dist/services/document-service/utils/clean-component-join-table.d.ts +7 -0
- package/dist/services/document-service/utils/clean-component-join-table.d.ts.map +1 -0
- package/dist/services/document-service/utils/unidirectional-relations.d.ts +19 -2
- package/dist/services/document-service/utils/unidirectional-relations.d.ts.map +1 -1
- package/dist/services/document-service/utils/unidirectional-relations.js +21 -6
- package/dist/services/document-service/utils/unidirectional-relations.js.map +1 -1
- package/dist/services/document-service/utils/unidirectional-relations.mjs +21 -6
- package/dist/services/document-service/utils/unidirectional-relations.mjs.map +1 -1
- package/dist/services/entity-validator/index.d.ts.map +1 -1
- package/dist/services/entity-validator/index.js +9 -0
- package/dist/services/entity-validator/index.js.map +1 -1
- package/dist/services/entity-validator/index.mjs +9 -0
- package/dist/services/entity-validator/index.mjs.map +1 -1
- package/dist/services/entity-validator/validators.d.ts +1 -0
- package/dist/services/entity-validator/validators.d.ts.map +1 -1
- package/dist/services/entity-validator/validators.js +3 -0
- package/dist/services/entity-validator/validators.js.map +1 -1
- package/dist/services/entity-validator/validators.mjs +3 -0
- package/dist/services/entity-validator/validators.mjs.map +1 -1
- package/dist/services/metrics/index.d.ts +1 -1
- package/dist/services/metrics/index.d.ts.map +1 -1
- package/dist/services/metrics/index.js +11 -9
- package/dist/services/metrics/index.js.map +1 -1
- package/dist/services/metrics/index.mjs +11 -9
- package/dist/services/metrics/index.mjs.map +1 -1
- package/dist/services/metrics/middleware.d.ts +2 -1
- package/dist/services/metrics/middleware.d.ts.map +1 -1
- package/dist/services/metrics/middleware.js +2 -2
- package/dist/services/metrics/middleware.js.map +1 -1
- package/dist/services/metrics/middleware.mjs +2 -2
- package/dist/services/metrics/middleware.mjs.map +1 -1
- package/dist/services/metrics/sender.d.ts.map +1 -1
- package/dist/services/metrics/sender.js +4 -3
- package/dist/services/metrics/sender.js.map +1 -1
- package/dist/services/metrics/sender.mjs +4 -3
- package/dist/services/metrics/sender.mjs.map +1 -1
- package/dist/services/session-manager.d.ts +167 -0
- package/dist/services/session-manager.d.ts.map +1 -0
- package/dist/services/session-manager.js +529 -0
- package/dist/services/session-manager.js.map +1 -0
- package/dist/services/session-manager.mjs +526 -0
- package/dist/services/session-manager.mjs.map +1 -0
- package/dist/services/utils/conditional-fields.d.ts +3 -0
- package/dist/services/utils/conditional-fields.d.ts.map +1 -0
- package/dist/services/utils/conditional-fields.js +22 -0
- package/dist/services/utils/conditional-fields.js.map +1 -0
- package/dist/services/utils/conditional-fields.mjs +20 -0
- package/dist/services/utils/conditional-fields.mjs.map +1 -0
- package/dist/utils/fetch.d.ts +5 -1
- package/dist/utils/fetch.d.ts.map +1 -1
- package/dist/utils/fetch.js +8 -4
- package/dist/utils/fetch.js.map +1 -1
- package/dist/utils/fetch.mjs +8 -4
- package/dist/utils/fetch.mjs.map +1 -1
- package/dist/utils/transform-content-types-to-models.d.ts +197 -0
- package/dist/utils/transform-content-types-to-models.d.ts.map +1 -1
- package/package.json +17 -13
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Defines the constant literal values for boolean representations.
|
|
3
|
+
*
|
|
4
|
+
* These values can be used to convert string representations of booleans (for example, 'true', 'false', '1', '0')
|
|
5
|
+
* into actual boolean types.
|
|
6
|
+
*/ const BOOLEAN_LITERAL_VALUES = [
|
|
2
7
|
't',
|
|
3
8
|
'1',
|
|
4
9
|
'true',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.mjs","sources":["../../../../src/core-api/routes/validation/constants.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"constants.mjs","sources":["../../../../src/core-api/routes/validation/constants.ts"],"sourcesContent":["/**\n * Defines the constant literal values for boolean representations.\n *\n * These values can be used to convert string representations of booleans (for example, 'true', 'false', '1', '0')\n * into actual boolean types.\n */\n\nexport const BOOLEAN_LITERAL_VALUES = ['t', '1', 'true', 'f', '0', 'false'] as const;\n"],"names":["BOOLEAN_LITERAL_VALUES"],"mappings":"AAAA;;;;;UAOaA,sBAAyB,GAAA;AAAC,IAAA,GAAA;AAAK,IAAA,GAAA;AAAK,IAAA,MAAA;AAAQ,IAAA,GAAA;AAAK,IAAA,GAAA;AAAK,IAAA;;;;;"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import
|
|
1
|
+
import type { UID } from '@strapi/types';
|
|
2
|
+
import * as z from 'zod/v4';
|
|
3
3
|
import { AbstractCoreRouteValidator } from './common';
|
|
4
4
|
export type QueryParam = 'fields' | 'populate' | 'sort' | 'status' | 'locale' | 'pagination' | 'filters' | '_q';
|
|
5
5
|
/**
|
|
6
6
|
* A validator for core content-type routes.
|
|
7
7
|
*
|
|
8
8
|
* Provides validation schemas and utilities for handling content-type-specific route validation.
|
|
9
|
+
* Extends the base AbstractRouteValidator with schema-aware validation for Strapi content types.
|
|
9
10
|
*
|
|
10
11
|
* @example
|
|
11
12
|
* ```ts
|
|
@@ -16,18 +17,11 @@ export type QueryParam = 'fields' | 'populate' | 'sort' | 'status' | 'locale' |
|
|
|
16
17
|
* // Get validation schema for document
|
|
17
18
|
* const documentSchema = validator.document;
|
|
18
19
|
*
|
|
19
|
-
* // Validate query parameters
|
|
20
|
-
* const querySchema = validator.
|
|
20
|
+
* // Validate query parameters with schema awareness
|
|
21
|
+
* const querySchema = validator.queryParams(['fields', 'populate', 'sort']);
|
|
21
22
|
* ```
|
|
22
23
|
*/
|
|
23
24
|
export declare class CoreContentTypeRouteValidator extends AbstractCoreRouteValidator<UID.ContentType> {
|
|
24
|
-
/**
|
|
25
|
-
* Creates a new instance of CoreContentTypeRouteValidator
|
|
26
|
-
*
|
|
27
|
-
* @param strapi - The Strapi instance
|
|
28
|
-
* @param uid - The content-type's unique identifier
|
|
29
|
-
*/
|
|
30
|
-
constructor(strapi: Core.Strapi, uid: UID.ContentType);
|
|
31
25
|
/**
|
|
32
26
|
* Generates a validation schema for document IDs
|
|
33
27
|
*
|
|
@@ -56,7 +50,7 @@ export declare class CoreContentTypeRouteValidator extends AbstractCoreRouteVali
|
|
|
56
50
|
get document(): z.ZodObject<{
|
|
57
51
|
documentId: z.ZodUUID;
|
|
58
52
|
id: z.ZodNumber;
|
|
59
|
-
},
|
|
53
|
+
}, z.core.$strip>;
|
|
60
54
|
/**
|
|
61
55
|
* Generates a validation schema for an array of documents
|
|
62
56
|
*
|
|
@@ -71,89 +65,52 @@ export declare class CoreContentTypeRouteValidator extends AbstractCoreRouteVali
|
|
|
71
65
|
get documents(): z.ZodArray<z.ZodObject<{
|
|
72
66
|
documentId: z.ZodUUID;
|
|
73
67
|
id: z.ZodNumber;
|
|
74
|
-
},
|
|
68
|
+
}, z.core.$strip>>;
|
|
75
69
|
/**
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
* @returns A schema for validating field selection
|
|
79
|
-
*
|
|
80
|
-
* @example
|
|
81
|
-
* ```ts
|
|
82
|
-
* const validator = new CoreContentTypeRouteValidator(strapi, uid);
|
|
83
|
-
* const fieldsSchema = validator.queryFields;
|
|
84
|
-
* ```
|
|
70
|
+
* Schema-aware fields validation that restricts to actual model fields
|
|
85
71
|
*/
|
|
86
|
-
get
|
|
72
|
+
protected get schemaAwareQueryFields(): z.ZodReadonly<z.ZodArray<z.ZodEnum<{
|
|
87
73
|
[x: string]: string;
|
|
88
74
|
}>>>;
|
|
89
75
|
/**
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
* Allows wildcard (*), single field, and multiple field population.
|
|
93
|
-
*
|
|
94
|
-
* @returns A schema for validating populate parameters
|
|
95
|
-
*
|
|
96
|
-
* @example
|
|
97
|
-
* ```ts
|
|
98
|
-
* const validator = new CoreContentTypeRouteValidator(strapi, uid);
|
|
99
|
-
* const populateSchema = validator.queryPopulate;
|
|
100
|
-
* ```
|
|
76
|
+
* Schema-aware populate validation that restricts to actual populatable fields
|
|
101
77
|
*/
|
|
102
|
-
get
|
|
78
|
+
protected get schemaAwareQueryPopulate(): z.ZodUnion<readonly [z.ZodReadonly<z.ZodLiteral<"*">>, z.ZodReadonly<z.ZodEnum<{
|
|
103
79
|
[x: string]: string;
|
|
104
80
|
}>>, z.ZodArray<z.ZodEnum<{
|
|
105
81
|
[x: string]: string;
|
|
106
82
|
}>>]>;
|
|
107
83
|
/**
|
|
108
|
-
*
|
|
109
|
-
*
|
|
110
|
-
* Allows various sorting formats including single field, multiple fields, and direction specifications
|
|
111
|
-
*
|
|
112
|
-
* @returns A schema for validating sort parameters
|
|
113
|
-
*
|
|
114
|
-
* @example
|
|
115
|
-
* ```ts
|
|
116
|
-
* const validator = new CoreContentTypeRouteValidator(strapi, uid);
|
|
117
|
-
* const sortSchema = validator.querySort;
|
|
118
|
-
* ```
|
|
119
|
-
*
|
|
120
|
-
* @remarks
|
|
121
|
-
* - Nested sorts are currently not supported
|
|
84
|
+
* Schema-aware sort validation that restricts to actual model fields
|
|
122
85
|
*/
|
|
123
|
-
get
|
|
86
|
+
protected get schemaAwareQuerySort(): z.ZodUnion<readonly [z.ZodEnum<{
|
|
124
87
|
[x: string]: string;
|
|
125
88
|
}>, z.ZodArray<z.ZodEnum<{
|
|
126
89
|
[x: string]: string;
|
|
127
90
|
}>>, z.ZodRecord<z.ZodEnum<{
|
|
128
91
|
[x: string]: string;
|
|
129
|
-
}>, z.ZodType<unknown, unknown
|
|
92
|
+
}>, z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>, z.ZodArray<z.ZodRecord<z.ZodEnum<{
|
|
93
|
+
[x: string]: string;
|
|
94
|
+
}>, z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>>]>;
|
|
95
|
+
/**
|
|
96
|
+
* Schema-aware filters validation that restricts to actual model fields
|
|
97
|
+
*/
|
|
98
|
+
protected get schemaAwareFilters(): z.ZodRecord<z.ZodEnum<{
|
|
130
99
|
[x: string]: string;
|
|
131
|
-
}>, z.
|
|
132
|
-
get locale(): z.
|
|
100
|
+
}>, z.ZodAny>;
|
|
101
|
+
get locale(): z.ZodString;
|
|
133
102
|
get status(): z.ZodEnum<{
|
|
134
103
|
draft: "draft";
|
|
135
104
|
published: "published";
|
|
136
105
|
}>;
|
|
137
|
-
get
|
|
138
|
-
withCount: z.ZodOptional<z.ZodBoolean>;
|
|
139
|
-
}, {}, {}>, z.ZodUnion<readonly [z.ZodObject<{
|
|
140
|
-
page: z.ZodNumber;
|
|
141
|
-
pageSize: z.ZodNumber;
|
|
142
|
-
}, {}, {}>, z.ZodObject<{
|
|
143
|
-
start: z.ZodNumber;
|
|
144
|
-
limit: z.ZodNumber;
|
|
145
|
-
}, {}, {}>]>>;
|
|
146
|
-
get filters(): z.ZodRecord<z.ZodEnum<{
|
|
147
|
-
[x: string]: string;
|
|
148
|
-
}>, z.ZodAny>;
|
|
149
|
-
get data(): z.ZodObject<{}, {}, {}>;
|
|
106
|
+
get data(): z.ZodObject<{}, z.core.$strip>;
|
|
150
107
|
get query(): z.ZodString;
|
|
151
108
|
get body(): z.ZodObject<{
|
|
152
|
-
data: z.ZodObject<{},
|
|
153
|
-
},
|
|
109
|
+
data: z.ZodObject<{}, z.core.$strip>;
|
|
110
|
+
}, z.core.$strip>;
|
|
154
111
|
get partialBody(): z.ZodObject<{
|
|
155
|
-
data: z.ZodObject<{},
|
|
156
|
-
},
|
|
112
|
+
data: z.ZodObject<{}, z.core.$strip>;
|
|
113
|
+
}, z.core.$strip>;
|
|
157
114
|
/**
|
|
158
115
|
* Creates validation schemas for query parameters
|
|
159
116
|
*
|
|
@@ -163,7 +120,7 @@ export declare class CoreContentTypeRouteValidator extends AbstractCoreRouteVali
|
|
|
163
120
|
* @example
|
|
164
121
|
* ```ts
|
|
165
122
|
* const validator = new CoreContentTypeRouteValidator(strapi, uid);
|
|
166
|
-
* const querySchemas = validator.
|
|
123
|
+
* const querySchemas = validator.queryParams(['fields', 'populate']);
|
|
167
124
|
* ```
|
|
168
125
|
*/
|
|
169
126
|
queryParams(params: QueryParam[]): Partial<Record<QueryParam, z.Schema>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-type.d.ts","sourceRoot":"","sources":["../../../../src/core-api/routes/validation/content-type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"content-type.d.ts","sourceRoot":"","sources":["../../../../src/core-api/routes/validation/content-type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,GAAG,EAAE,MAAM,eAAe,CAAC;AAGjD,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAI5B,OAAO,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAEtD,MAAM,MAAM,UAAU,GAClB,QAAQ,GACR,UAAU,GACV,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,YAAY,GACZ,SAAS,GACT,IAAI,CAAC;AAET;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,6BAA8B,SAAQ,0BAA0B,CAAC,GAAG,CAAC,WAAW,CAAC;IAC5F;;;;;;;;;;OAUG;IACH,IAAI,UAAU,cAEb;IAED;;;;;;;;;;;;OAYG;IACH,IAAI,QAAQ;;;sBAgBX;IAED;;;;;;;;;;OAUG;IACH,IAAI,SAAS;;;uBAEZ;IAED;;OAEG;IACH,SAAS,KAAK,sBAAsB;;SAMnC;IAED;;OAEG;IACH,SAAS,KAAK,wBAAwB;;;;UAiBrC;IAED;;OAEG;IACH,SAAS,KAAK,oBAAoB;;;;;;;;oFAYjC;IAED;;OAEG;IACH,SAAS,KAAK,kBAAkB;;kBAE/B;IAED,IAAI,MAAM,gBAET;IAED,IAAI,MAAM;;;OAIT;IAED,IAAI,IAAI,mCAYP;IAED,IAAI,KAAK,gBAER;IAED,IAAI,IAAI;;sBAEP;IAED,IAAI,WAAW;;sBAEd;IAED;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;CAiBzE"}
|
|
@@ -1,14 +1,34 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var strapiUtils = require('@strapi/utils');
|
|
4
|
-
var
|
|
5
|
-
var
|
|
4
|
+
var z = require('zod/v4');
|
|
5
|
+
var mappers = require('./mappers.js');
|
|
6
6
|
var common = require('./common.js');
|
|
7
7
|
|
|
8
|
+
function _interopNamespaceDefault(e) {
|
|
9
|
+
var n = Object.create(null);
|
|
10
|
+
if (e) {
|
|
11
|
+
Object.keys(e).forEach(function (k) {
|
|
12
|
+
if (k !== 'default') {
|
|
13
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
14
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: function () { return e[k]; }
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
n.default = e;
|
|
22
|
+
return Object.freeze(n);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
var z__namespace = /*#__PURE__*/_interopNamespaceDefault(z);
|
|
26
|
+
|
|
8
27
|
/**
|
|
9
28
|
* A validator for core content-type routes.
|
|
10
29
|
*
|
|
11
30
|
* Provides validation schemas and utilities for handling content-type-specific route validation.
|
|
31
|
+
* Extends the base AbstractRouteValidator with schema-aware validation for Strapi content types.
|
|
12
32
|
*
|
|
13
33
|
* @example
|
|
14
34
|
* ```ts
|
|
@@ -19,8 +39,8 @@ var common = require('./common.js');
|
|
|
19
39
|
* // Get validation schema for document
|
|
20
40
|
* const documentSchema = validator.document;
|
|
21
41
|
*
|
|
22
|
-
* // Validate query parameters
|
|
23
|
-
* const querySchema = validator.
|
|
42
|
+
* // Validate query parameters with schema awareness
|
|
43
|
+
* const querySchema = validator.queryParams(['fields', 'populate', 'sort']);
|
|
24
44
|
* ```
|
|
25
45
|
*/ class CoreContentTypeRouteValidator extends common.AbstractCoreRouteValidator {
|
|
26
46
|
/**
|
|
@@ -34,7 +54,7 @@ var common = require('./common.js');
|
|
|
34
54
|
* const idSchema = validator.documentID;
|
|
35
55
|
* ```
|
|
36
56
|
*/ get documentID() {
|
|
37
|
-
return
|
|
57
|
+
return z__namespace.uuid().describe('The document ID, represented by a UUID');
|
|
38
58
|
}
|
|
39
59
|
/**
|
|
40
60
|
* Generates a comprehensive validation schema for a single document.
|
|
@@ -49,27 +69,20 @@ var common = require('./common.js');
|
|
|
49
69
|
* const docSchema = validator.document;
|
|
50
70
|
* ```
|
|
51
71
|
*/ get document() {
|
|
52
|
-
const { _scalarFields, _populatableFields } = this;
|
|
53
72
|
const entries = Object.entries({
|
|
54
|
-
..._scalarFields,
|
|
55
|
-
..._populatableFields
|
|
73
|
+
...this._scalarFields,
|
|
74
|
+
...this._populatableFields
|
|
56
75
|
});
|
|
57
|
-
const
|
|
58
|
-
// TODO: Make sure we're not leaking other fields like that
|
|
76
|
+
const sanitizedAttributes = entries// Remove passwords from the attribute list
|
|
59
77
|
.filter(([, attribute])=>![
|
|
60
78
|
'password'
|
|
61
|
-
].includes(attribute.type))
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
return attributes.mapAttributeToSchema(attribute);
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
}, zod.z.object({}));
|
|
69
|
-
return attributesSchema.extend({
|
|
79
|
+
].includes(attribute.type));
|
|
80
|
+
// Merge all attributes into a single schema
|
|
81
|
+
const attributesSchema = mappers.createAttributesSchema(sanitizedAttributes);
|
|
82
|
+
return z__namespace.object({
|
|
70
83
|
documentId: this.documentID,
|
|
71
|
-
id:
|
|
72
|
-
});
|
|
84
|
+
id: z__namespace.number()
|
|
85
|
+
}).extend(attributesSchema.shape);
|
|
73
86
|
}
|
|
74
87
|
/**
|
|
75
88
|
* Generates a validation schema for an array of documents
|
|
@@ -82,126 +95,76 @@ var common = require('./common.js');
|
|
|
82
95
|
* const docsSchema = validator.documents;
|
|
83
96
|
* ```
|
|
84
97
|
*/ get documents() {
|
|
85
|
-
return
|
|
98
|
+
return z__namespace.array(this.document);
|
|
86
99
|
}
|
|
87
100
|
/**
|
|
88
|
-
*
|
|
89
|
-
|
|
90
|
-
* @returns A schema for validating field selection
|
|
91
|
-
*
|
|
92
|
-
* @example
|
|
93
|
-
* ```ts
|
|
94
|
-
* const validator = new CoreContentTypeRouteValidator(strapi, uid);
|
|
95
|
-
* const fieldsSchema = validator.queryFields;
|
|
96
|
-
* ```
|
|
97
|
-
*/ get queryFields() {
|
|
101
|
+
* Schema-aware fields validation that restricts to actual model fields
|
|
102
|
+
*/ get schemaAwareQueryFields() {
|
|
98
103
|
return this.scalarFieldsArray.readonly().describe(`The fields to return, this doesn't include populatable fields like relations, components, files, or dynamic zones`);
|
|
99
104
|
}
|
|
100
105
|
/**
|
|
101
|
-
*
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
*
|
|
105
|
-
* @returns A schema for validating populate parameters
|
|
106
|
-
*
|
|
107
|
-
* @example
|
|
108
|
-
* ```ts
|
|
109
|
-
* const validator = new CoreContentTypeRouteValidator(strapi, uid);
|
|
110
|
-
* const populateSchema = validator.queryPopulate;
|
|
111
|
-
* ```
|
|
112
|
-
*/ get queryPopulate() {
|
|
113
|
-
const wildcardPopulate = zod.z.literal('*').readonly().describe('Populate all the first level relations, components, files, and dynamic zones for the entry');
|
|
106
|
+
* Schema-aware populate validation that restricts to actual populatable fields
|
|
107
|
+
*/ get schemaAwareQueryPopulate() {
|
|
108
|
+
const wildcardPopulate = z__namespace.literal('*').readonly().describe('Populate all the first level relations, components, files, and dynamic zones for the entry');
|
|
114
109
|
const singleFieldPopulate = this.populatableFieldsEnum.readonly().describe('Populate a single relation, component, file, or dynamic zone');
|
|
115
110
|
const multiPopulate = this.populatableFieldsArray.describe('Populate a selection of multiple relations, components, files, or dynamic zones');
|
|
116
|
-
return
|
|
111
|
+
return z__namespace.union([
|
|
117
112
|
wildcardPopulate,
|
|
118
113
|
singleFieldPopulate,
|
|
119
114
|
multiPopulate
|
|
120
115
|
]);
|
|
121
116
|
}
|
|
122
117
|
/**
|
|
123
|
-
*
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
*
|
|
127
|
-
* @returns A schema for validating sort parameters
|
|
128
|
-
*
|
|
129
|
-
* @example
|
|
130
|
-
* ```ts
|
|
131
|
-
* const validator = new CoreContentTypeRouteValidator(strapi, uid);
|
|
132
|
-
* const sortSchema = validator.querySort;
|
|
133
|
-
* ```
|
|
134
|
-
*
|
|
135
|
-
* @remarks
|
|
136
|
-
* - Nested sorts are currently not supported
|
|
137
|
-
*/ get querySort() {
|
|
138
|
-
const orderDirection = zod.z.enum([
|
|
118
|
+
* Schema-aware sort validation that restricts to actual model fields
|
|
119
|
+
*/ get schemaAwareQuerySort() {
|
|
120
|
+
const orderDirection = z__namespace.enum([
|
|
139
121
|
'asc',
|
|
140
122
|
'desc'
|
|
141
123
|
]);
|
|
142
124
|
// TODO: Handle nested sorts but very low priority, very little usage
|
|
143
|
-
return
|
|
125
|
+
return z__namespace.union([
|
|
144
126
|
this.scalarFieldsEnum,
|
|
145
127
|
this.scalarFieldsArray,
|
|
146
128
|
this.fieldRecord(orderDirection),
|
|
147
|
-
|
|
129
|
+
z__namespace.array(this.fieldRecord(orderDirection))
|
|
148
130
|
]).describe('Sort the result');
|
|
149
131
|
}
|
|
132
|
+
/**
|
|
133
|
+
* Schema-aware filters validation that restricts to actual model fields
|
|
134
|
+
*/ get schemaAwareFilters() {
|
|
135
|
+
return z__namespace.record(this.scalarFieldsEnum, z__namespace.any()).describe('Filters to apply to the query');
|
|
136
|
+
}
|
|
150
137
|
get locale() {
|
|
151
|
-
return
|
|
138
|
+
return z__namespace.string().describe('Select a locale');
|
|
152
139
|
}
|
|
153
140
|
get status() {
|
|
154
|
-
return
|
|
141
|
+
return z__namespace.enum([
|
|
155
142
|
'draft',
|
|
156
143
|
'published'
|
|
157
144
|
]).describe('Fetch documents based on their status. Default to "published" if not specified.');
|
|
158
145
|
}
|
|
159
|
-
get pagination() {
|
|
160
|
-
return zod.z.intersection(zod.z.object({
|
|
161
|
-
withCount: zod.z.boolean().optional()
|
|
162
|
-
}), zod.z.union([
|
|
163
|
-
zod.z.object({
|
|
164
|
-
page: zod.z.number(),
|
|
165
|
-
pageSize: zod.z.number()
|
|
166
|
-
}).describe('Specify a page number and the number of entries per page'),
|
|
167
|
-
zod.z.object({
|
|
168
|
-
start: zod.z.number(),
|
|
169
|
-
limit: zod.z.number()
|
|
170
|
-
}).describe('Specify how many entries to skip and to return')
|
|
171
|
-
])).describe('Pagination parameters');
|
|
172
|
-
}
|
|
173
|
-
get filters() {
|
|
174
|
-
return zod.z.record(this.scalarFieldsEnum, zod.z.any()).describe('Filters to apply to the query');
|
|
175
|
-
}
|
|
176
146
|
get data() {
|
|
177
|
-
const { _scalarFields, _populatableFields, _schema } = this;
|
|
178
147
|
const isWritableAttribute = ([attributeName])=>{
|
|
179
|
-
return strapiUtils.contentTypes.isWritableAttribute(_schema, attributeName);
|
|
148
|
+
return strapiUtils.contentTypes.isWritableAttribute(this._schema, attributeName);
|
|
180
149
|
};
|
|
181
150
|
const entries = Object.entries({
|
|
182
|
-
..._scalarFields,
|
|
183
|
-
..._populatableFields
|
|
151
|
+
...this._scalarFields,
|
|
152
|
+
...this._populatableFields
|
|
184
153
|
});
|
|
185
|
-
|
|
186
|
-
.filter(isWritableAttribute)
|
|
187
|
-
.
|
|
188
|
-
return acc.extend({
|
|
189
|
-
get [attributeName] () {
|
|
190
|
-
return attributes.mapAttributeToInputSchema(attribute);
|
|
191
|
-
}
|
|
192
|
-
});
|
|
193
|
-
}, zod.z.object());
|
|
154
|
+
const sanitizedAttributes = entries// Remove non-writable attributes
|
|
155
|
+
.filter(isWritableAttribute);
|
|
156
|
+
return mappers.createAttributesInputSchema(sanitizedAttributes);
|
|
194
157
|
}
|
|
195
158
|
get query() {
|
|
196
|
-
return
|
|
159
|
+
return z__namespace.string();
|
|
197
160
|
}
|
|
198
161
|
get body() {
|
|
199
|
-
return
|
|
162
|
+
return z__namespace.object({
|
|
200
163
|
data: this.data
|
|
201
164
|
});
|
|
202
165
|
}
|
|
203
166
|
get partialBody() {
|
|
204
|
-
return
|
|
167
|
+
return z__namespace.object({
|
|
205
168
|
data: this.data.partial()
|
|
206
169
|
});
|
|
207
170
|
}
|
|
@@ -214,14 +177,14 @@ var common = require('./common.js');
|
|
|
214
177
|
* @example
|
|
215
178
|
* ```ts
|
|
216
179
|
* const validator = new CoreContentTypeRouteValidator(strapi, uid);
|
|
217
|
-
* const querySchemas = validator.
|
|
180
|
+
* const querySchemas = validator.queryParams(['fields', 'populate']);
|
|
218
181
|
* ```
|
|
219
182
|
*/ queryParams(params) {
|
|
220
183
|
const map = {
|
|
221
|
-
fields: ()=>this.
|
|
222
|
-
populate: ()=>this.
|
|
223
|
-
sort: ()=>this.
|
|
224
|
-
filters: ()=>this.
|
|
184
|
+
fields: ()=>this.schemaAwareQueryFields.optional(),
|
|
185
|
+
populate: ()=>this.schemaAwareQueryPopulate.optional(),
|
|
186
|
+
sort: ()=>this.schemaAwareQuerySort.optional(),
|
|
187
|
+
filters: ()=>this.schemaAwareFilters.optional(),
|
|
225
188
|
locale: ()=>this.locale.optional(),
|
|
226
189
|
pagination: ()=>this.pagination.optional(),
|
|
227
190
|
status: ()=>this.status.optional(),
|
|
@@ -232,14 +195,6 @@ var common = require('./common.js');
|
|
|
232
195
|
[param]: map[param]()
|
|
233
196
|
}), {});
|
|
234
197
|
}
|
|
235
|
-
/**
|
|
236
|
-
* Creates a new instance of CoreContentTypeRouteValidator
|
|
237
|
-
*
|
|
238
|
-
* @param strapi - The Strapi instance
|
|
239
|
-
* @param uid - The content-type's unique identifier
|
|
240
|
-
*/ constructor(strapi, uid){
|
|
241
|
-
super(strapi, uid);
|
|
242
|
-
}
|
|
243
198
|
}
|
|
244
199
|
|
|
245
200
|
exports.CoreContentTypeRouteValidator = CoreContentTypeRouteValidator;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-type.js","sources":["../../../../src/core-api/routes/validation/content-type.ts"],"sourcesContent":["import type { Core, Schema, UID } from '@strapi/types';\n\nimport { contentTypes } from '@strapi/utils';\nimport { z } from 'zod';\n\nimport { mapAttributeToInputSchema, mapAttributeToSchema } from './attributes';\nimport { AbstractCoreRouteValidator } from './common';\n\nexport type QueryParam =\n | 'fields'\n | 'populate'\n | 'sort'\n | 'status'\n | 'locale'\n | 'pagination'\n | 'filters'\n | '_q';\n\n/**\n * A validator for core content-type routes.\n *\n * Provides validation schemas and utilities for handling content-type-specific route validation.\n *\n * @example\n * ```ts\n * const strapi = // ... strapi instance\n * const uid = 'api::article.article'\n * const validator = new CoreContentTypeRouteValidator(strapi, uid);\n *\n * // Get validation schema for document\n * const documentSchema = validator.document;\n *\n * // Validate query parameters\n * const querySchema = validator.query(['fields', 'populate', 'sort']);\n * ```\n */\nexport class CoreContentTypeRouteValidator extends AbstractCoreRouteValidator<UID.ContentType> {\n /**\n * Creates a new instance of CoreContentTypeRouteValidator\n *\n * @param strapi - The Strapi instance\n * @param uid - The content-type's unique identifier\n */\n constructor(strapi: Core.Strapi, uid: UID.ContentType) {\n super(strapi, uid);\n }\n\n /**\n * Generates a validation schema for document IDs\n *\n * @returns A schema that validates UUIDs\n *\n * @example\n * ```ts\n * const validator = new CoreContentTypeRouteValidator(strapi, uid);\n * const idSchema = validator.documentID;\n * ```\n */\n get documentID() {\n return z.uuid().describe('The document ID, represented by a UUID');\n }\n\n /**\n * Generates a comprehensive validation schema for a single document.\n *\n * Combines scalar fields and populatable fields into a single schema.\n *\n * @returns A schema for validating complete documents\n *\n * @example\n * ```ts\n * const validator = new CoreContentTypeRouteValidator(strapi, uid);\n * const docSchema = validator.document;\n * ```\n */\n get document() {\n const { _scalarFields, _populatableFields } = this;\n\n const entries = Object.entries({ ..._scalarFields, ..._populatableFields });\n\n const attributesSchema = entries\n // Remove passwords from the attribute list\n // TODO: Make sure we're not leaking other fields like that\n .filter(([, attribute]) => !['password'].includes(attribute.type))\n // Merge all attributes into a single schema\n .reduce((acc, [attributeName, attribute]) => {\n return acc.extend({\n get [attributeName]() {\n return mapAttributeToSchema(attribute);\n },\n });\n }, z.object({}));\n\n return attributesSchema.extend({\n documentId: this.documentID,\n id: z.number(),\n });\n }\n\n /**\n * Generates a validation schema for an array of documents\n *\n * @returns A schema for validating arrays of documents\n *\n * @example\n * ```ts\n * const validator = new CoreContentTypeRouteValidator(strapi, uid);\n * const docsSchema = validator.documents;\n * ```\n */\n get documents() {\n return z.array(this.document);\n }\n\n /**\n * Generates a validation schema for field selection in queries\n *\n * @returns A schema for validating field selection\n *\n * @example\n * ```ts\n * const validator = new CoreContentTypeRouteValidator(strapi, uid);\n * const fieldsSchema = validator.queryFields;\n * ```\n */\n get queryFields() {\n return this.scalarFieldsArray\n .readonly()\n .describe(\n `The fields to return, this doesn't include populatable fields like relations, components, files, or dynamic zones`\n );\n }\n\n /**\n * Generates a validation schema for populate operations.\n *\n * Allows wildcard (*), single field, and multiple field population.\n *\n * @returns A schema for validating populate parameters\n *\n * @example\n * ```ts\n * const validator = new CoreContentTypeRouteValidator(strapi, uid);\n * const populateSchema = validator.queryPopulate;\n * ```\n */\n get queryPopulate() {\n const wildcardPopulate = z\n .literal('*')\n .readonly()\n .describe(\n 'Populate all the first level relations, components, files, and dynamic zones for the entry'\n );\n\n const singleFieldPopulate = this.populatableFieldsEnum\n .readonly()\n .describe('Populate a single relation, component, file, or dynamic zone');\n\n const multiPopulate = this.populatableFieldsArray.describe(\n 'Populate a selection of multiple relations, components, files, or dynamic zones'\n );\n\n return z.union([wildcardPopulate, singleFieldPopulate, multiPopulate]);\n }\n\n /**\n * Generates a validation schema for sorting parameters.\n *\n * Allows various sorting formats including single field, multiple fields, and direction specifications\n *\n * @returns A schema for validating sort parameters\n *\n * @example\n * ```ts\n * const validator = new CoreContentTypeRouteValidator(strapi, uid);\n * const sortSchema = validator.querySort;\n * ```\n *\n * @remarks\n * - Nested sorts are currently not supported\n */\n get querySort() {\n const orderDirection = z.enum(['asc', 'desc']);\n\n // TODO: Handle nested sorts but very low priority, very little usage\n return z\n .union([\n this.scalarFieldsEnum, // 'name' | 'title'\n this.scalarFieldsArray, // ['name', 'title']\n this.fieldRecord(orderDirection), // { name: 'desc' } | { title: 'asc' }\n z.array(this.fieldRecord(orderDirection)), // [{ name: 'desc'}, { title: 'asc' }]\n ])\n .describe('Sort the result');\n }\n\n get locale() {\n return z.string().optional().describe('Select a locale');\n }\n\n get status() {\n return z\n .enum(['draft', 'published'])\n .describe('Fetch documents based on their status. Default to \"published\" if not specified.');\n }\n\n get pagination() {\n return z\n .intersection(\n z.object({ withCount: z.boolean().optional() }),\n z.union([\n z\n .object({ page: z.number(), pageSize: z.number() })\n .describe('Specify a page number and the number of entries per page'),\n z\n .object({ start: z.number(), limit: z.number() })\n .describe('Specify how many entries to skip and to return'),\n ])\n )\n .describe('Pagination parameters');\n }\n\n get filters() {\n return z.record(this.scalarFieldsEnum, z.any()).describe('Filters to apply to the query');\n }\n\n get data() {\n const { _scalarFields, _populatableFields, _schema } = this;\n\n const isWritableAttribute = ([attributeName]: [string, Schema.Attribute.AnyAttribute]) => {\n return contentTypes.isWritableAttribute(_schema, attributeName);\n };\n\n const entries = Object.entries({ ..._scalarFields, ..._populatableFields });\n\n return (\n entries\n // Remove non-writable attributes\n .filter(isWritableAttribute)\n // Combine schemas\n .reduce((acc, [attributeName, attribute]) => {\n return acc.extend({\n get [attributeName]() {\n return mapAttributeToInputSchema(attribute);\n },\n });\n }, z.object())\n );\n }\n\n get query() {\n return z.string();\n }\n\n get body() {\n return z.object({ data: this.data });\n }\n\n get partialBody() {\n return z.object({ data: this.data.partial() });\n }\n\n /**\n * Creates validation schemas for query parameters\n *\n * @param params - Array of query parameters to validate ('fields', 'populate', 'sort', ...)\n * @returns Object containing validation schemas for requested parameters\n *\n * @example\n * ```ts\n * const validator = new CoreContentTypeRouteValidator(strapi, uid);\n * const querySchemas = validator.query(['fields', 'populate']);\n * ```\n */\n queryParams(params: QueryParam[]): Partial<Record<QueryParam, z.Schema>> {\n const map: Record<QueryParam, () => z.Schema> = {\n fields: () => this.queryFields.optional(),\n populate: () => this.queryPopulate.optional(),\n sort: () => this.querySort.optional(),\n filters: () => this.filters.optional(),\n locale: () => this.locale.optional(),\n pagination: () => this.pagination.optional(),\n status: () => this.status.optional(),\n _q: () => this.query.optional(),\n } as const;\n\n return params.reduce(\n (acc, param) => ({ ...acc, [param]: map[param]() }),\n {} as Partial<Record<QueryParam, z.Schema>>\n );\n }\n}\n"],"names":["CoreContentTypeRouteValidator","AbstractCoreRouteValidator","documentID","z","uuid","describe","document","_scalarFields","_populatableFields","entries","Object","attributesSchema","filter","attribute","includes","type","reduce","acc","attributeName","extend","mapAttributeToSchema","object","documentId","id","number","documents","array","queryFields","scalarFieldsArray","readonly","queryPopulate","wildcardPopulate","literal","singleFieldPopulate","populatableFieldsEnum","multiPopulate","populatableFieldsArray","union","querySort","orderDirection","enum","scalarFieldsEnum","fieldRecord","locale","string","optional","status","pagination","intersection","withCount","boolean","page","pageSize","start","limit","filters","record","any","data","_schema","isWritableAttribute","contentTypes","mapAttributeToInputSchema","query","body","partialBody","partial","queryParams","params","map","fields","populate","sort","_q","param","constructor","strapi","uid"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"content-type.js","sources":["../../../../src/core-api/routes/validation/content-type.ts"],"sourcesContent":["import type { Schema, UID } from '@strapi/types';\n\nimport { contentTypes } from '@strapi/utils';\nimport * as z from 'zod/v4';\n\n// eslint-disable-next-line import/no-cycle\nimport { createAttributesInputSchema, createAttributesSchema } from './mappers';\nimport { AbstractCoreRouteValidator } from './common';\n\nexport type QueryParam =\n | 'fields'\n | 'populate'\n | 'sort'\n | 'status'\n | 'locale'\n | 'pagination'\n | 'filters'\n | '_q';\n\n/**\n * A validator for core content-type routes.\n *\n * Provides validation schemas and utilities for handling content-type-specific route validation.\n * Extends the base AbstractRouteValidator with schema-aware validation for Strapi content types.\n *\n * @example\n * ```ts\n * const strapi = // ... strapi instance\n * const uid = 'api::article.article'\n * const validator = new CoreContentTypeRouteValidator(strapi, uid);\n *\n * // Get validation schema for document\n * const documentSchema = validator.document;\n *\n * // Validate query parameters with schema awareness\n * const querySchema = validator.queryParams(['fields', 'populate', 'sort']);\n * ```\n */\nexport class CoreContentTypeRouteValidator extends AbstractCoreRouteValidator<UID.ContentType> {\n /**\n * Generates a validation schema for document IDs\n *\n * @returns A schema that validates UUIDs\n *\n * @example\n * ```ts\n * const validator = new CoreContentTypeRouteValidator(strapi, uid);\n * const idSchema = validator.documentID;\n * ```\n */\n get documentID() {\n return z.uuid().describe('The document ID, represented by a UUID');\n }\n\n /**\n * Generates a comprehensive validation schema for a single document.\n *\n * Combines scalar fields and populatable fields into a single schema.\n *\n * @returns A schema for validating complete documents\n *\n * @example\n * ```ts\n * const validator = new CoreContentTypeRouteValidator(strapi, uid);\n * const docSchema = validator.document;\n * ```\n */\n get document() {\n const entries = Object.entries({ ...this._scalarFields, ...this._populatableFields });\n\n const sanitizedAttributes = entries\n // Remove passwords from the attribute list\n .filter(([, attribute]) => !['password'].includes(attribute.type));\n\n // Merge all attributes into a single schema\n const attributesSchema = createAttributesSchema(sanitizedAttributes);\n\n return z\n .object({\n documentId: this.documentID,\n id: z.number(),\n })\n .extend(attributesSchema.shape);\n }\n\n /**\n * Generates a validation schema for an array of documents\n *\n * @returns A schema for validating arrays of documents\n *\n * @example\n * ```ts\n * const validator = new CoreContentTypeRouteValidator(strapi, uid);\n * const docsSchema = validator.documents;\n * ```\n */\n get documents() {\n return z.array(this.document);\n }\n\n /**\n * Schema-aware fields validation that restricts to actual model fields\n */\n protected get schemaAwareQueryFields() {\n return this.scalarFieldsArray\n .readonly()\n .describe(\n `The fields to return, this doesn't include populatable fields like relations, components, files, or dynamic zones`\n );\n }\n\n /**\n * Schema-aware populate validation that restricts to actual populatable fields\n */\n protected get schemaAwareQueryPopulate() {\n const wildcardPopulate = z\n .literal('*')\n .readonly()\n .describe(\n 'Populate all the first level relations, components, files, and dynamic zones for the entry'\n );\n\n const singleFieldPopulate = this.populatableFieldsEnum\n .readonly()\n .describe('Populate a single relation, component, file, or dynamic zone');\n\n const multiPopulate = this.populatableFieldsArray.describe(\n 'Populate a selection of multiple relations, components, files, or dynamic zones'\n );\n\n return z.union([wildcardPopulate, singleFieldPopulate, multiPopulate]);\n }\n\n /**\n * Schema-aware sort validation that restricts to actual model fields\n */\n protected get schemaAwareQuerySort() {\n const orderDirection = z.enum(['asc', 'desc']);\n\n // TODO: Handle nested sorts but very low priority, very little usage\n return z\n .union([\n this.scalarFieldsEnum, // 'name' | 'title'\n this.scalarFieldsArray, // ['name', 'title']\n this.fieldRecord(orderDirection), // { name: 'desc' } | { title: 'asc' }\n z.array(this.fieldRecord(orderDirection)), // [{ name: 'desc'}, { title: 'asc' }]\n ])\n .describe('Sort the result');\n }\n\n /**\n * Schema-aware filters validation that restricts to actual model fields\n */\n protected get schemaAwareFilters() {\n return z.record(this.scalarFieldsEnum, z.any()).describe('Filters to apply to the query');\n }\n\n get locale() {\n return z.string().describe('Select a locale');\n }\n\n get status() {\n return z\n .enum(['draft', 'published'])\n .describe('Fetch documents based on their status. Default to \"published\" if not specified.');\n }\n\n get data() {\n const isWritableAttribute = ([attributeName]: [string, Schema.Attribute.AnyAttribute]) => {\n return contentTypes.isWritableAttribute(this._schema, attributeName);\n };\n\n const entries = Object.entries({ ...this._scalarFields, ...this._populatableFields });\n\n const sanitizedAttributes = entries\n // Remove non-writable attributes\n .filter(isWritableAttribute);\n\n return createAttributesInputSchema(sanitizedAttributes);\n }\n\n get query() {\n return z.string();\n }\n\n get body() {\n return z.object({ data: this.data });\n }\n\n get partialBody() {\n return z.object({ data: this.data.partial() });\n }\n\n /**\n * Creates validation schemas for query parameters\n *\n * @param params - Array of query parameters to validate ('fields', 'populate', 'sort', ...)\n * @returns Object containing validation schemas for requested parameters\n *\n * @example\n * ```ts\n * const validator = new CoreContentTypeRouteValidator(strapi, uid);\n * const querySchemas = validator.queryParams(['fields', 'populate']);\n * ```\n */\n queryParams(params: QueryParam[]): Partial<Record<QueryParam, z.Schema>> {\n const map: Record<QueryParam, () => z.Schema> = {\n fields: () => this.schemaAwareQueryFields.optional(),\n populate: () => this.schemaAwareQueryPopulate.optional(),\n sort: () => this.schemaAwareQuerySort.optional(),\n filters: () => this.schemaAwareFilters.optional(),\n locale: () => this.locale.optional(),\n pagination: () => this.pagination.optional(),\n status: () => this.status.optional(),\n _q: () => this.query.optional(),\n } as const;\n\n return params.reduce(\n (acc, param) => ({ ...acc, [param]: map[param]() }),\n {} as Partial<Record<QueryParam, z.Schema>>\n );\n }\n}\n"],"names":["CoreContentTypeRouteValidator","AbstractCoreRouteValidator","documentID","z","uuid","describe","document","entries","Object","_scalarFields","_populatableFields","sanitizedAttributes","filter","attribute","includes","type","attributesSchema","createAttributesSchema","object","documentId","id","number","extend","shape","documents","array","schemaAwareQueryFields","scalarFieldsArray","readonly","schemaAwareQueryPopulate","wildcardPopulate","literal","singleFieldPopulate","populatableFieldsEnum","multiPopulate","populatableFieldsArray","union","schemaAwareQuerySort","orderDirection","enum","scalarFieldsEnum","fieldRecord","schemaAwareFilters","record","any","locale","string","status","data","isWritableAttribute","attributeName","contentTypes","_schema","createAttributesInputSchema","query","body","partialBody","partial","queryParams","params","map","fields","optional","populate","sort","filters","pagination","_q","reduce","acc","param"],"mappings":"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"}
|