@strapi/utils 4.12.6 → 4.13.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/dist/content-types.d.ts +2 -1
  2. package/dist/content-types.js +12 -1
  3. package/dist/content-types.js.map +1 -1
  4. package/dist/index.d.ts +11 -0
  5. package/dist/index.js +2 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/sanitize/index.js +22 -1
  8. package/dist/sanitize/index.js.map +1 -1
  9. package/dist/sanitize/sanitizers.js +35 -2
  10. package/dist/sanitize/sanitizers.js.map +1 -1
  11. package/dist/sanitize/visitors/index.d.ts +2 -2
  12. package/dist/sanitize/visitors/index.js +5 -5
  13. package/dist/sanitize/visitors/index.js.map +1 -1
  14. package/dist/sanitize/visitors/{allowed-fields.js → remove-disallowed-fields.js} +4 -4
  15. package/dist/sanitize/visitors/remove-disallowed-fields.js.map +1 -0
  16. package/dist/sanitize/visitors/{restricted-fields.js → remove-restricted-fields.js} +4 -4
  17. package/dist/sanitize/visitors/remove-restricted-fields.js.map +1 -0
  18. package/dist/traverse/factory.d.ts +1 -1
  19. package/dist/traverse/query-populate.js +1 -0
  20. package/dist/traverse/query-populate.js.map +1 -1
  21. package/dist/traverse/query-sort.js +1 -0
  22. package/dist/traverse/query-sort.js.map +1 -1
  23. package/dist/validate/index.d.ts +21 -0
  24. package/dist/validate/index.js +121 -0
  25. package/dist/validate/index.js.map +1 -0
  26. package/dist/validate/utils.d.ts +3 -0
  27. package/dist/validate/utils.js +9 -0
  28. package/dist/validate/utils.js.map +1 -0
  29. package/dist/validate/validators.d.ts +8 -0
  30. package/dist/validate/validators.js +115 -0
  31. package/dist/validate/validators.js.map +1 -0
  32. package/dist/validate/visitors/index.d.ts +7 -0
  33. package/dist/validate/visitors/index.js +21 -0
  34. package/dist/validate/visitors/index.js.map +1 -0
  35. package/dist/validate/visitors/throw-disallowed-fields.d.ts +3 -0
  36. package/dist/validate/visitors/throw-disallowed-fields.js +84 -0
  37. package/dist/validate/visitors/throw-disallowed-fields.js.map +1 -0
  38. package/dist/validate/visitors/throw-dynamic-zones.d.ts +3 -0
  39. package/dist/validate/visitors/throw-dynamic-zones.js +11 -0
  40. package/dist/validate/visitors/throw-dynamic-zones.js.map +1 -0
  41. package/dist/validate/visitors/throw-morph-to-relations.d.ts +3 -0
  42. package/dist/validate/visitors/throw-morph-to-relations.js +11 -0
  43. package/dist/validate/visitors/throw-morph-to-relations.js.map +1 -0
  44. package/dist/validate/visitors/throw-password.d.ts +3 -0
  45. package/dist/validate/visitors/throw-password.js +10 -0
  46. package/dist/validate/visitors/throw-password.js.map +1 -0
  47. package/dist/validate/visitors/throw-private.d.ts +3 -0
  48. package/dist/validate/visitors/throw-private.js +15 -0
  49. package/dist/validate/visitors/throw-private.js.map +1 -0
  50. package/dist/validate/visitors/throw-restricted-fields.d.ts +3 -0
  51. package/dist/validate/visitors/throw-restricted-fields.js +24 -0
  52. package/dist/validate/visitors/throw-restricted-fields.js.map +1 -0
  53. package/dist/validate/visitors/throw-restricted-relations.d.ts +3 -0
  54. package/dist/validate/visitors/throw-restricted-relations.js +81 -0
  55. package/dist/validate/visitors/throw-restricted-relations.js.map +1 -0
  56. package/package.json +4 -4
  57. package/dist/sanitize/visitors/allowed-fields.js.map +0 -1
  58. package/dist/sanitize/visitors/restricted-fields.js.map +0 -1
  59. /package/dist/sanitize/visitors/{allowed-fields.d.ts → remove-disallowed-fields.d.ts} +0 -0
  60. /package/dist/sanitize/visitors/{restricted-fields.d.ts → remove-restricted-fields.d.ts} +0 -0
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const fp_1 = require("lodash/fp");
30
+ const content_types_1 = require("../content-types");
31
+ const async_1 = require("../async");
32
+ const visitors = __importStar(require("./visitors"));
33
+ const validators = __importStar(require("./validators"));
34
+ const traverse_entity_1 = __importDefault(require("../traverse-entity"));
35
+ const traverse_1 = require("../traverse");
36
+ const createContentAPIValidators = () => {
37
+ const validateInput = async (data, schema, { auth } = {}) => {
38
+ if (!schema) {
39
+ throw new Error('Missing schema in validateInput');
40
+ }
41
+ if ((0, fp_1.isArray)(data)) {
42
+ await Promise.all(data.map((entry) => validateInput(entry, schema, { auth })));
43
+ return;
44
+ }
45
+ const nonWritableAttributes = (0, content_types_1.getNonWritableAttributes)(schema);
46
+ const transforms = [
47
+ // non writable attributes
48
+ (0, traverse_entity_1.default)(visitors.throwRestrictedFields(nonWritableAttributes), { schema }),
49
+ ];
50
+ if (auth) {
51
+ // restricted relations
52
+ transforms.push((0, traverse_entity_1.default)(visitors.throwRestrictedRelations(auth), { schema }));
53
+ }
54
+ // Apply validators from registry if exists
55
+ strapi.validators
56
+ .get('content-api.input')
57
+ .forEach((validator) => transforms.push(validator(schema)));
58
+ (0, async_1.pipeAsync)(...transforms)(data);
59
+ };
60
+ const validateQuery = async (query, schema, { auth } = {}) => {
61
+ if (!schema) {
62
+ throw new Error('Missing schema in validateQuery');
63
+ }
64
+ const { filters, sort, fields } = query;
65
+ if (filters) {
66
+ await validateFilters(filters, schema, { auth });
67
+ }
68
+ if (sort) {
69
+ await validateSort(sort, schema, { auth });
70
+ }
71
+ if (fields) {
72
+ await validateFields(fields, schema);
73
+ }
74
+ // TODO: validate populate
75
+ };
76
+ const validateFilters = async (filters, schema, { auth } = {}) => {
77
+ if (!schema) {
78
+ throw new Error('Missing schema in validateFilters');
79
+ }
80
+ if ((0, fp_1.isArray)(filters)) {
81
+ await Promise.all(filters.map((filter) => validateFilters(filter, schema, { auth })));
82
+ return;
83
+ }
84
+ const transforms = [validators.defaultValidateFilters(schema)];
85
+ if (auth) {
86
+ transforms.push((0, traverse_1.traverseQueryFilters)(visitors.throwRestrictedRelations(auth), { schema }));
87
+ }
88
+ return (0, async_1.pipeAsync)(...transforms)(filters);
89
+ };
90
+ const validateSort = async (sort, schema, { auth } = {}) => {
91
+ if (!schema) {
92
+ throw new Error('Missing schema in validateSort');
93
+ }
94
+ const transforms = [validators.defaultValidateSort(schema)];
95
+ if (auth) {
96
+ transforms.push((0, traverse_1.traverseQuerySort)(visitors.throwRestrictedRelations(auth), { schema }));
97
+ }
98
+ return (0, async_1.pipeAsync)(...transforms)(sort);
99
+ };
100
+ const validateFields = (fields, schema) => {
101
+ if (!schema) {
102
+ throw new Error('Missing schema in validateFields');
103
+ }
104
+ const transforms = [validators.defaultValidateFields(schema)];
105
+ return (0, async_1.pipeAsync)(...transforms)(fields);
106
+ };
107
+ return {
108
+ input: validateInput,
109
+ query: validateQuery,
110
+ filters: validateFilters,
111
+ sort: validateSort,
112
+ fields: validateFields,
113
+ };
114
+ };
115
+ const contentAPI = createContentAPIValidators();
116
+ exports.default = {
117
+ contentAPI,
118
+ validators,
119
+ visitors,
120
+ };
121
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validate/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const throwInvalidParam: ({ key }: {
2
+ key: string;
3
+ }) => never;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.throwInvalidParam = void 0;
4
+ const errors_1 = require("../errors");
5
+ const throwInvalidParam = ({ key }) => {
6
+ throw new errors_1.ValidationError(`Invalid parameter ${key}`);
7
+ };
8
+ exports.throwInvalidParam = throwInvalidParam;
9
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/validate/utils.ts"],"names":[],"mappings":";;;AAAA,sCAA4C;AAErC,MAAM,iBAAiB,GAAG,CAAC,EAAE,GAAG,EAAmB,EAAE,EAAE;IAC5D,MAAM,IAAI,wBAAe,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;AACxD,CAAC,CAAC;AAFW,QAAA,iBAAiB,qBAE5B"}
@@ -0,0 +1,8 @@
1
+ /// <reference types="lodash" />
2
+ import { Data } from '../traverse-entity';
3
+ import type { Model } from '../types';
4
+ declare const throwPasswords: (schema: Model) => (entity: Data) => Promise<Data>;
5
+ declare const defaultValidateFilters: import("lodash").CurriedFunction2<Model, unknown, Promise<unknown>>;
6
+ declare const defaultValidateSort: import("lodash").CurriedFunction2<Model, unknown, Promise<unknown>>;
7
+ declare const defaultValidateFields: import("lodash").CurriedFunction2<Model, unknown, Promise<unknown>>;
8
+ export { throwPasswords, defaultValidateFilters, defaultValidateSort, defaultValidateFields };
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.defaultValidateFields = exports.defaultValidateSort = exports.defaultValidateFilters = exports.throwPasswords = void 0;
7
+ const fp_1 = require("lodash/fp");
8
+ const async_1 = require("../async");
9
+ const traverse_entity_1 = __importDefault(require("../traverse-entity"));
10
+ const content_types_1 = require("../content-types");
11
+ const traverse_1 = require("../traverse");
12
+ const visitors_1 = require("./visitors");
13
+ const operators_1 = require("../operators");
14
+ const utils_1 = require("./utils");
15
+ const throwPasswords = (schema) => async (entity) => {
16
+ if (!schema) {
17
+ throw new Error('Missing schema in throwPasswords');
18
+ }
19
+ return (0, traverse_entity_1.default)(visitors_1.throwPassword, { schema }, entity);
20
+ };
21
+ exports.throwPasswords = throwPasswords;
22
+ const defaultValidateFilters = (0, fp_1.curry)((schema, filters) => {
23
+ // TODO: schema checks should check that it is a validate schema with yup
24
+ if (!schema) {
25
+ throw new Error('Missing schema in defaultValidateFilters');
26
+ }
27
+ return (0, async_1.pipeAsync)(
28
+ // keys that are not attributes or valid operators
29
+ (0, traverse_1.traverseQueryFilters)(({ key, attribute }) => {
30
+ // ID is not an attribute per se, so we need to make
31
+ // an extra check to ensure we're not removing it
32
+ if (key === 'id') {
33
+ return;
34
+ }
35
+ const isAttribute = !!attribute;
36
+ if (!isAttribute && !(0, operators_1.isOperator)(key)) {
37
+ (0, utils_1.throwInvalidParam)({ key });
38
+ }
39
+ }, { schema }),
40
+ // dynamic zones from filters
41
+ (0, traverse_1.traverseQueryFilters)(visitors_1.throwDynamicZones, { schema }),
42
+ // morphTo relations from filters; because you can't have deep filtering on morph relations
43
+ (0, traverse_1.traverseQueryFilters)(visitors_1.throwMorphToRelations, { schema }),
44
+ // passwords from filters
45
+ (0, traverse_1.traverseQueryFilters)(visitors_1.throwPassword, { schema }),
46
+ // private from filters
47
+ (0, traverse_1.traverseQueryFilters)(visitors_1.throwPrivate, { schema }),
48
+ // empty objects
49
+ (0, traverse_1.traverseQueryFilters)(({ key, value }) => {
50
+ if ((0, fp_1.isObject)(value) && (0, fp_1.isEmpty)(value)) {
51
+ (0, utils_1.throwInvalidParam)({ key });
52
+ }
53
+ }, { schema }))(filters);
54
+ });
55
+ exports.defaultValidateFilters = defaultValidateFilters;
56
+ const defaultValidateSort = (0, fp_1.curry)((schema, sort) => {
57
+ if (!schema) {
58
+ throw new Error('Missing schema in defaultValidateSort');
59
+ }
60
+ return (0, async_1.pipeAsync)(
61
+ // non attribute keys
62
+ (0, traverse_1.traverseQuerySort)(({ key, attribute }) => {
63
+ // ID is not an attribute per se, so we need to make
64
+ // an extra check to ensure we're not removing it
65
+ if (key === 'id') {
66
+ return;
67
+ }
68
+ if (!attribute) {
69
+ (0, utils_1.throwInvalidParam)({ key });
70
+ }
71
+ }, { schema }),
72
+ // dynamic zones from sort
73
+ (0, traverse_1.traverseQuerySort)(visitors_1.throwDynamicZones, { schema }),
74
+ // morphTo relations from sort
75
+ (0, traverse_1.traverseQuerySort)(visitors_1.throwMorphToRelations, { schema }),
76
+ // private from sort
77
+ (0, traverse_1.traverseQuerySort)(visitors_1.throwPrivate, { schema }),
78
+ // passwords from filters
79
+ (0, traverse_1.traverseQuerySort)(visitors_1.throwPassword, { schema }),
80
+ // keys for empty non-scalar values
81
+ (0, traverse_1.traverseQuerySort)(({ key, attribute, value }) => {
82
+ // ID is not an attribute per se, so we need to make
83
+ // an extra check to ensure we're not removing it
84
+ if (key === 'id') {
85
+ return;
86
+ }
87
+ if (!(0, content_types_1.isScalarAttribute)(attribute) && (0, fp_1.isEmpty)(value)) {
88
+ (0, utils_1.throwInvalidParam)({ key });
89
+ }
90
+ }, { schema }))(sort);
91
+ });
92
+ exports.defaultValidateSort = defaultValidateSort;
93
+ const defaultValidateFields = (0, fp_1.curry)((schema, fields) => {
94
+ if (!schema) {
95
+ throw new Error('Missing schema in defaultValidateFields');
96
+ }
97
+ return (0, async_1.pipeAsync)(
98
+ // Only allow scalar attributes
99
+ (0, traverse_1.traverseQueryFields)(({ key, attribute }) => {
100
+ // ID is not an attribute per se, so we need to make
101
+ // an extra check to ensure we're not removing it
102
+ if (key === 'id') {
103
+ return;
104
+ }
105
+ if ((0, fp_1.isNil)(attribute) || !(0, content_types_1.isScalarAttribute)(attribute)) {
106
+ (0, utils_1.throwInvalidParam)({ key });
107
+ }
108
+ }, { schema }),
109
+ // private fields
110
+ (0, traverse_1.traverseQueryFields)(visitors_1.throwPrivate, { schema }),
111
+ // password fields
112
+ (0, traverse_1.traverseQueryFields)(visitors_1.throwPassword, { schema }))(fields);
113
+ });
114
+ exports.defaultValidateFields = defaultValidateFields;
115
+ //# sourceMappingURL=validators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/validate/validators.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { default as throwPassword } from './throw-password';
2
+ export { default as throwPrivate } from './throw-private';
3
+ export { default as throwRestrictedRelations } from './throw-restricted-relations';
4
+ export { default as throwMorphToRelations } from './throw-morph-to-relations';
5
+ export { default as throwDynamicZones } from './throw-dynamic-zones';
6
+ export { default as throwDisallowedFields } from './throw-disallowed-fields';
7
+ export { default as throwRestrictedFields } from './throw-restricted-fields';
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.throwRestrictedFields = exports.throwDisallowedFields = exports.throwDynamicZones = exports.throwMorphToRelations = exports.throwRestrictedRelations = exports.throwPrivate = exports.throwPassword = void 0;
7
+ var throw_password_1 = require("./throw-password");
8
+ Object.defineProperty(exports, "throwPassword", { enumerable: true, get: function () { return __importDefault(throw_password_1).default; } });
9
+ var throw_private_1 = require("./throw-private");
10
+ Object.defineProperty(exports, "throwPrivate", { enumerable: true, get: function () { return __importDefault(throw_private_1).default; } });
11
+ var throw_restricted_relations_1 = require("./throw-restricted-relations");
12
+ Object.defineProperty(exports, "throwRestrictedRelations", { enumerable: true, get: function () { return __importDefault(throw_restricted_relations_1).default; } });
13
+ var throw_morph_to_relations_1 = require("./throw-morph-to-relations");
14
+ Object.defineProperty(exports, "throwMorphToRelations", { enumerable: true, get: function () { return __importDefault(throw_morph_to_relations_1).default; } });
15
+ var throw_dynamic_zones_1 = require("./throw-dynamic-zones");
16
+ Object.defineProperty(exports, "throwDynamicZones", { enumerable: true, get: function () { return __importDefault(throw_dynamic_zones_1).default; } });
17
+ var throw_disallowed_fields_1 = require("./throw-disallowed-fields");
18
+ Object.defineProperty(exports, "throwDisallowedFields", { enumerable: true, get: function () { return __importDefault(throw_disallowed_fields_1).default; } });
19
+ var throw_restricted_fields_1 = require("./throw-restricted-fields");
20
+ Object.defineProperty(exports, "throwRestrictedFields", { enumerable: true, get: function () { return __importDefault(throw_restricted_fields_1).default; } });
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/validate/visitors/index.ts"],"names":[],"mappings":";;;;;;AAAA,mDAA4D;AAAnD,gIAAA,OAAO,OAAiB;AACjC,iDAA0D;AAAjD,8HAAA,OAAO,OAAgB;AAChC,2EAAmF;AAA1E,uJAAA,OAAO,OAA4B;AAC5C,uEAA8E;AAArE,kJAAA,OAAO,OAAyB;AACzC,6DAAqE;AAA5D,yIAAA,OAAO,OAAqB;AACrC,qEAA6E;AAApE,iJAAA,OAAO,OAAyB;AACzC,qEAA6E;AAApE,iJAAA,OAAO,OAAyB"}
@@ -0,0 +1,3 @@
1
+ import type { Visitor } from '../../traverse/factory';
2
+ declare const _default: (allowedFields?: string[] | null) => Visitor;
3
+ export default _default;
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const fp_1 = require("lodash/fp");
4
+ const utils_1 = require("../utils");
5
+ exports.default = (allowedFields = null) => ({ key, path: { attribute: path } }) => {
6
+ // All fields are allowed
7
+ if (allowedFields === null) {
8
+ return;
9
+ }
10
+ // Throw on invalid formats
11
+ if (!((0, fp_1.isArray)(allowedFields) && allowedFields.every(fp_1.isString))) {
12
+ throw new TypeError(`Expected array of strings for allowedFields but got "${typeof allowedFields}"`);
13
+ }
14
+ if ((0, fp_1.isNil)(path)) {
15
+ return;
16
+ }
17
+ const containedPaths = getContainedPaths(path);
18
+ /**
19
+ * Tells if the current path should be kept or not based
20
+ * on the success of the check functions for any of the allowed paths.
21
+ *
22
+ * The check functions are defined as follow:
23
+ *
24
+ * `containedPaths.includes(p)`
25
+ * @example
26
+ * ```js
27
+ * const path = 'foo.bar.field';
28
+ * const p = 'foo.bar';
29
+ * // it should match
30
+ *
31
+ * const path = 'foo.bar.field';
32
+ * const p = 'bar.foo';
33
+ * // it shouldn't match
34
+ *
35
+ * const path = 'foo.bar';
36
+ * const p = 'foo.bar.field';
37
+ * // it should match but isn't handled by this check
38
+ * ```
39
+ *
40
+ * `p.startsWith(`${path}.`)`
41
+ * @example
42
+ * ```js
43
+ * const path = 'foo.bar';
44
+ * const p = 'foo.bar.field';
45
+ * // it should match
46
+ *
47
+ * const path = 'foo.bar.field';
48
+ * const p = 'bar.foo';
49
+ * // it shouldn't match
50
+ *
51
+ * const path = 'foo.bar.field';
52
+ * const p = 'foo.bar';
53
+ * // it should match but isn't handled by this check
54
+ * ```
55
+ */
56
+ const isPathAllowed = allowedFields.some((p) => containedPaths.includes(p) || p.startsWith(`${path}.`));
57
+ if (isPathAllowed) {
58
+ return;
59
+ }
60
+ // throw otherwise
61
+ (0, utils_1.throwInvalidParam)({ key });
62
+ };
63
+ /**
64
+ * Retrieve the list of allowed paths based on the given path
65
+ *
66
+ * @example
67
+ * ```js
68
+ * const containedPaths = getContainedPaths('foo');
69
+ * // ['foo']
70
+ *
71
+ * * const containedPaths = getContainedPaths('foo.bar');
72
+ * // ['foo', 'foo.bar']
73
+ *
74
+ * * const containedPaths = getContainedPaths('foo.bar.field');
75
+ * // ['foo', 'foo.bar', 'foo.bar.field']
76
+ * ```
77
+ */
78
+ const getContainedPaths = (path) => {
79
+ const parts = (0, fp_1.toPath)(path);
80
+ return parts.reduce((acc, value, index, list) => {
81
+ return [...acc, list.slice(0, index + 1).join('.')];
82
+ }, []);
83
+ };
84
+ //# sourceMappingURL=throw-disallowed-fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throw-disallowed-fields.js","sourceRoot":"","sources":["../../../src/validate/visitors/throw-disallowed-fields.ts"],"names":[],"mappings":";;AAAA,kCAA6D;AAE7D,oCAA6C;AAE7C,kBAAe,CAAC,gBAAiC,IAAI,EAAW,EAAE,CAChE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;IACrC,yBAAyB;IACzB,IAAI,aAAa,KAAK,IAAI,EAAE;QAC1B,OAAO;KACR;IAED,2BAA2B;IAC3B,IAAI,CAAC,CAAC,IAAA,YAAO,EAAC,aAAa,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,aAAQ,CAAC,CAAC,EAAE;QAC9D,MAAM,IAAI,SAAS,CACjB,wDAAwD,OAAO,aAAa,GAAG,CAChF,CAAC;KACH;IAED,IAAI,IAAA,UAAK,EAAC,IAAI,CAAC,EAAE;QACf,OAAO;KACR;IAED,MAAM,cAAc,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAqCG;IACH,MAAM,aAAa,GAAG,aAAa,CAAC,IAAI,CACtC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,CAC9D,CAAC;IAEF,IAAI,aAAa,EAAE;QACjB,OAAO;KACR;IAED,kBAAkB;IAClB,IAAA,yBAAiB,EAAC,EAAE,GAAG,EAAE,CAAC,CAAC;AAC7B,CAAC,CAAC;AAEJ;;;;;;;;;;;;;;GAcG;AACH,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAE,EAAE;IACzC,MAAM,KAAK,GAAG,IAAA,WAAM,EAAC,IAAI,CAAC,CAAC;IAE3B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC9C,OAAO,CAAC,GAAG,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACtD,CAAC,EAAE,EAAc,CAAC,CAAC;AACrB,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Visitor } from '../../traverse/factory';
2
+ declare const visitor: Visitor;
3
+ export default visitor;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const content_types_1 = require("../../content-types");
4
+ const utils_1 = require("../utils");
5
+ const visitor = ({ key, attribute }) => {
6
+ if ((0, content_types_1.isDynamicZoneAttribute)(attribute)) {
7
+ (0, utils_1.throwInvalidParam)({ key });
8
+ }
9
+ };
10
+ exports.default = visitor;
11
+ //# sourceMappingURL=throw-dynamic-zones.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throw-dynamic-zones.js","sourceRoot":"","sources":["../../../src/validate/visitors/throw-dynamic-zones.ts"],"names":[],"mappings":";;AAAA,uDAA6D;AAC7D,oCAA6C;AAG7C,MAAM,OAAO,GAAY,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE;IAC9C,IAAI,IAAA,sCAAsB,EAAC,SAAS,CAAC,EAAE;QACrC,IAAA,yBAAiB,EAAC,EAAE,GAAG,EAAE,CAAC,CAAC;KAC5B;AACH,CAAC,CAAC;AAEF,kBAAe,OAAO,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Visitor } from '../../traverse/factory';
2
+ declare const visitor: Visitor;
3
+ export default visitor;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const content_types_1 = require("../../content-types");
4
+ const utils_1 = require("../utils");
5
+ const visitor = ({ key, attribute }) => {
6
+ if ((0, content_types_1.isMorphToRelationalAttribute)(attribute)) {
7
+ (0, utils_1.throwInvalidParam)({ key });
8
+ }
9
+ };
10
+ exports.default = visitor;
11
+ //# sourceMappingURL=throw-morph-to-relations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throw-morph-to-relations.js","sourceRoot":"","sources":["../../../src/validate/visitors/throw-morph-to-relations.ts"],"names":[],"mappings":";;AAAA,uDAAmE;AACnE,oCAA6C;AAG7C,MAAM,OAAO,GAAY,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE;IAC9C,IAAI,IAAA,4CAA4B,EAAC,SAAS,CAAC,EAAE;QAC3C,IAAA,yBAAiB,EAAC,EAAE,GAAG,EAAE,CAAC,CAAC;KAC5B;AACH,CAAC,CAAC;AAEF,kBAAe,OAAO,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Visitor } from '../../traverse/factory';
2
+ declare const visitor: Visitor;
3
+ export default visitor;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_1 = require("../utils");
4
+ const visitor = ({ key, attribute }) => {
5
+ if (attribute?.type === 'password') {
6
+ (0, utils_1.throwInvalidParam)({ key });
7
+ }
8
+ };
9
+ exports.default = visitor;
10
+ //# sourceMappingURL=throw-password.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throw-password.js","sourceRoot":"","sources":["../../../src/validate/visitors/throw-password.ts"],"names":[],"mappings":";;AAAA,oCAA6C;AAG7C,MAAM,OAAO,GAAY,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE;IAC9C,IAAI,SAAS,EAAE,IAAI,KAAK,UAAU,EAAE;QAClC,IAAA,yBAAiB,EAAC,EAAE,GAAG,EAAE,CAAC,CAAC;KAC5B;AACH,CAAC,CAAC;AAEF,kBAAe,OAAO,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Visitor } from '../../traverse/factory';
2
+ declare const visitor: Visitor;
3
+ export default visitor;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const content_types_1 = require("../../content-types");
4
+ const utils_1 = require("../utils");
5
+ const visitor = ({ schema, key, attribute }) => {
6
+ if (!attribute) {
7
+ return;
8
+ }
9
+ const isPrivate = attribute.private === true || (0, content_types_1.isPrivateAttribute)(schema, key);
10
+ if (isPrivate) {
11
+ (0, utils_1.throwInvalidParam)({ key });
12
+ }
13
+ };
14
+ exports.default = visitor;
15
+ //# sourceMappingURL=throw-private.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throw-private.js","sourceRoot":"","sources":["../../../src/validate/visitors/throw-private.ts"],"names":[],"mappings":";;AAAA,uDAAyD;AACzD,oCAA6C;AAG7C,MAAM,OAAO,GAAY,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE;IACtD,IAAI,CAAC,SAAS,EAAE;QACd,OAAO;KACR;IAED,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,KAAK,IAAI,IAAI,IAAA,kCAAkB,EAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEhF,IAAI,SAAS,EAAE;QACb,IAAA,yBAAiB,EAAC,EAAE,GAAG,EAAE,CAAC,CAAC;KAC5B;AACH,CAAC,CAAC;AAEF,kBAAe,OAAO,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Visitor } from '../../traverse/factory';
2
+ declare const _default: (restrictedFields?: string[] | null) => Visitor;
3
+ export default _default;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const fp_1 = require("lodash/fp");
4
+ const utils_1 = require("../utils");
5
+ exports.default = (restrictedFields = null) => ({ key, path: { attribute: path } }) => {
6
+ // all fields
7
+ if (restrictedFields === null) {
8
+ (0, utils_1.throwInvalidParam)({ key });
9
+ }
10
+ // Throw on invalid formats
11
+ if (!((0, fp_1.isArray)(restrictedFields) && restrictedFields.every(fp_1.isString))) {
12
+ throw new TypeError(`Expected array of strings for restrictedFields but got "${typeof restrictedFields}"`);
13
+ }
14
+ // if an exact match was found
15
+ if (restrictedFields.includes(path)) {
16
+ (0, utils_1.throwInvalidParam)({ key });
17
+ }
18
+ // nested matches
19
+ const isRestrictedNested = restrictedFields.some((allowedPath) => path?.toString().startsWith(`${allowedPath}.`));
20
+ if (isRestrictedNested) {
21
+ (0, utils_1.throwInvalidParam)({ key });
22
+ }
23
+ };
24
+ //# sourceMappingURL=throw-restricted-fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throw-restricted-fields.js","sourceRoot":"","sources":["../../../src/validate/visitors/throw-restricted-fields.ts"],"names":[],"mappings":";;AAAA,kCAA8C;AAE9C,oCAA6C;AAE7C,kBAAe,CAAC,mBAAoC,IAAI,EAAW,EAAE,CACnE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;IACrC,aAAa;IACb,IAAI,gBAAgB,KAAK,IAAI,EAAE;QAC7B,IAAA,yBAAiB,EAAC,EAAE,GAAG,EAAE,CAAC,CAAC;KAC5B;IAED,2BAA2B;IAC3B,IAAI,CAAC,CAAC,IAAA,YAAO,EAAC,gBAAgB,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAC,aAAQ,CAAC,CAAC,EAAE;QACpE,MAAM,IAAI,SAAS,CACjB,2DAA2D,OAAO,gBAAgB,GAAG,CACtF,CAAC;KACH;IAED,8BAA8B;IAC9B,IAAI,gBAAgB,CAAC,QAAQ,CAAC,IAAc,CAAC,EAAE;QAC7C,IAAA,yBAAiB,EAAC,EAAE,GAAG,EAAE,CAAC,CAAC;KAC5B;IAED,iBAAiB;IACjB,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAC/D,IAAI,EAAE,QAAQ,EAAE,CAAC,UAAU,CAAC,GAAG,WAAW,GAAG,CAAC,CAC/C,CAAC;IACF,IAAI,kBAAkB,EAAE;QACtB,IAAA,yBAAiB,EAAC,EAAE,GAAG,EAAE,CAAC,CAAC;KAC5B;AACH,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Visitor } from '../../traverse/factory';
2
+ declare const _default: (auth: unknown) => Visitor;
3
+ export default _default;
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ const contentTypeUtils = __importStar(require("../../content-types"));
27
+ const utils_1 = require("../utils");
28
+ const ACTIONS_TO_VERIFY = ['find'];
29
+ const { CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } = contentTypeUtils.constants;
30
+ exports.default = (auth) => async ({ data, key, attribute, schema }, { set }) => {
31
+ if (!attribute) {
32
+ return;
33
+ }
34
+ const isRelation = attribute.type === 'relation';
35
+ if (!isRelation) {
36
+ return;
37
+ }
38
+ const handleMorphRelation = async () => {
39
+ for (const element of data[key]) {
40
+ const scopes = ACTIONS_TO_VERIFY.map((action) => `${element.__type}.${action}`);
41
+ const isAllowed = await hasAccessToSomeScopes(scopes, auth);
42
+ if (!isAllowed) {
43
+ (0, utils_1.throwInvalidParam)({ key });
44
+ }
45
+ }
46
+ };
47
+ const handleRegularRelation = async () => {
48
+ const scopes = ACTIONS_TO_VERIFY.map((action) => `${attribute.target}.${action}`);
49
+ const isAllowed = await hasAccessToSomeScopes(scopes, auth);
50
+ // If the authenticated user don't have access to any of the scopes
51
+ if (!isAllowed) {
52
+ (0, utils_1.throwInvalidParam)({ key });
53
+ }
54
+ };
55
+ const isCreatorRelation = [CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE].includes(key);
56
+ // Polymorphic relations
57
+ if (contentTypeUtils.isMorphToRelationalAttribute(attribute)) {
58
+ await handleMorphRelation();
59
+ return;
60
+ }
61
+ // Creator relations
62
+ if (isCreatorRelation && schema.options.populateCreatorFields) {
63
+ // do nothing
64
+ return;
65
+ }
66
+ // Regular relations
67
+ await handleRegularRelation();
68
+ };
69
+ const hasAccessToSomeScopes = async (scopes, auth) => {
70
+ for (const scope of scopes) {
71
+ try {
72
+ await strapi.auth.verify(auth, { scope });
73
+ return true;
74
+ }
75
+ catch {
76
+ continue;
77
+ }
78
+ }
79
+ return false;
80
+ };
81
+ //# sourceMappingURL=throw-restricted-relations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throw-restricted-relations.js","sourceRoot":"","sources":["../../../src/validate/visitors/throw-restricted-relations.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sEAAwD;AACxD,oCAA6C;AAG7C,MAAM,iBAAiB,GAAG,CAAC,MAAM,CAAC,CAAC;AACnC,MAAM,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,GAAG,gBAAgB,CAAC,SAAS,CAAC;AAIlF,kBAAe,CAAC,IAAa,EAAW,EAAE,CACxC,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;IAClD,IAAI,CAAC,SAAS,EAAE;QACd,OAAO;KACR;IAED,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,KAAK,UAAU,CAAC;IAEjD,IAAI,CAAC,UAAU,EAAE;QACf,OAAO;KACR;IAED,MAAM,mBAAmB,GAAG,KAAK,IAAI,EAAE;QACrC,KAAK,MAAM,OAAO,IAAK,IAAmC,CAAC,GAAG,CAAC,EAAE;YAC/D,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC,CAAC;YAChF,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAE5D,IAAI,CAAC,SAAS,EAAE;gBACd,IAAA,yBAAiB,EAAC,EAAE,GAAG,EAAE,CAAC,CAAC;aAC5B;SACF;IACH,CAAC,CAAC;IAEF,MAAM,qBAAqB,GAAG,KAAK,IAAI,EAAE;QACvC,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC,CAAC;QAElF,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAE5D,mEAAmE;QACnE,IAAI,CAAC,SAAS,EAAE;YACd,IAAA,yBAAiB,EAAC,EAAE,GAAG,EAAE,CAAC,CAAC;SAC5B;IACH,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAErF,wBAAwB;IACxB,IAAI,gBAAgB,CAAC,4BAA4B,CAAC,SAAS,CAAC,EAAE;QAC5D,MAAM,mBAAmB,EAAE,CAAC;QAC5B,OAAO;KACR;IAED,oBAAoB;IACpB,IAAI,iBAAiB,IAAI,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE;QAC7D,aAAa;QACb,OAAO;KACR;IAED,oBAAoB;IACpB,MAAM,qBAAqB,EAAE,CAAC;AAChC,CAAC,CAAC;AAEJ,MAAM,qBAAqB,GAAG,KAAK,EAAE,MAAgB,EAAE,IAAa,EAAE,EAAE;IACtE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;QAC1B,IAAI;YACF,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC;SACb;QAAC,MAAM;YACN,SAAS;SACV;KACF;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}