@strapi/utils 4.11.0-exp.9xg4-3qfm-9w8f.1 → 4.11.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 (134) hide show
  1. package/dist/async.d.ts +10 -0
  2. package/dist/async.js +33 -0
  3. package/dist/async.js.map +1 -0
  4. package/dist/code-generator.d.ts +2 -0
  5. package/dist/code-generator.js +11 -0
  6. package/dist/code-generator.js.map +1 -0
  7. package/dist/config.d.ts +8 -0
  8. package/dist/config.js +79 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/content-types.d.ts +60 -0
  11. package/dist/content-types.js +147 -0
  12. package/dist/content-types.js.map +1 -0
  13. package/dist/convert-query-params.d.ts +72 -0
  14. package/dist/convert-query-params.js +451 -0
  15. package/dist/convert-query-params.js.map +1 -0
  16. package/dist/env-helper.d.ts +18 -0
  17. package/dist/env-helper.js +84 -0
  18. package/dist/env-helper.js.map +1 -0
  19. package/dist/errors.d.ts +37 -0
  20. package/dist/errors.js +100 -0
  21. package/dist/errors.js.map +1 -0
  22. package/dist/file.d.ts +16 -0
  23. package/dist/file.js +54 -0
  24. package/dist/file.js.map +1 -0
  25. package/dist/format-yup-error.d.ts +10 -0
  26. package/dist/format-yup-error.js +17 -0
  27. package/dist/format-yup-error.js.map +1 -0
  28. package/dist/hooks.d.ts +92 -0
  29. package/dist/hooks.js +89 -0
  30. package/dist/hooks.js.map +1 -0
  31. package/dist/import-default.d.ts +1 -0
  32. package/dist/import-default.js +10 -0
  33. package/dist/import-default.js.map +1 -0
  34. package/dist/index.d.ts +200 -0
  35. package/dist/index.js +151 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/object-formatting.d.ts +3 -0
  38. package/dist/object-formatting.js +14 -0
  39. package/dist/object-formatting.js.map +1 -0
  40. package/dist/pagination.d.ts +14 -0
  41. package/dist/pagination.js +80 -0
  42. package/dist/pagination.js.map +1 -0
  43. package/dist/parse-multipart.d.ts +8 -0
  44. package/dist/parse-multipart.js +36 -0
  45. package/dist/parse-multipart.js.map +1 -0
  46. package/dist/parse-type.d.ts +21 -0
  47. package/dist/parse-type.js +97 -0
  48. package/dist/parse-type.js.map +1 -0
  49. package/dist/policy.d.ts +41 -0
  50. package/dist/policy.js +109 -0
  51. package/dist/policy.js.map +1 -0
  52. package/dist/print-value.d.ts +2 -0
  53. package/dist/print-value.js +50 -0
  54. package/dist/print-value.js.map +1 -0
  55. package/dist/provider-factory.d.ts +84 -0
  56. package/dist/provider-factory.js +88 -0
  57. package/dist/provider-factory.js.map +1 -0
  58. package/dist/relations.d.ts +10 -0
  59. package/dist/relations.js +23 -0
  60. package/dist/relations.js.map +1 -0
  61. package/dist/sanitize/index.d.ts +23 -0
  62. package/dist/sanitize/index.js +135 -0
  63. package/dist/sanitize/index.js.map +1 -0
  64. package/dist/sanitize/sanitizers.d.ts +10 -0
  65. package/dist/sanitize/sanitizers.js +106 -0
  66. package/dist/sanitize/sanitizers.js.map +1 -0
  67. package/dist/sanitize/visitors/allowed-fields.d.ts +3 -0
  68. package/dist/sanitize/visitors/allowed-fields.js +83 -0
  69. package/dist/sanitize/visitors/allowed-fields.js.map +1 -0
  70. package/dist/sanitize/visitors/index.d.ts +7 -0
  71. package/dist/sanitize/visitors/index.js +21 -0
  72. package/dist/sanitize/visitors/index.js.map +1 -0
  73. package/dist/sanitize/visitors/remove-dynamic-zones.d.ts +3 -0
  74. package/dist/sanitize/visitors/remove-dynamic-zones.js +10 -0
  75. package/dist/sanitize/visitors/remove-dynamic-zones.js.map +1 -0
  76. package/dist/sanitize/visitors/remove-morph-to-relations.d.ts +3 -0
  77. package/dist/sanitize/visitors/remove-morph-to-relations.js +10 -0
  78. package/dist/sanitize/visitors/remove-morph-to-relations.js.map +1 -0
  79. package/dist/sanitize/visitors/remove-password.d.ts +3 -0
  80. package/dist/sanitize/visitors/remove-password.js +9 -0
  81. package/dist/sanitize/visitors/remove-password.js.map +1 -0
  82. package/dist/sanitize/visitors/remove-private.d.ts +3 -0
  83. package/dist/sanitize/visitors/remove-private.js +14 -0
  84. package/dist/sanitize/visitors/remove-private.js.map +1 -0
  85. package/dist/sanitize/visitors/remove-restricted-relations.d.ts +3 -0
  86. package/dist/sanitize/visitors/remove-restricted-relations.js +88 -0
  87. package/dist/sanitize/visitors/remove-restricted-relations.js.map +1 -0
  88. package/dist/sanitize/visitors/restricted-fields.d.ts +3 -0
  89. package/dist/sanitize/visitors/restricted-fields.js +25 -0
  90. package/dist/sanitize/visitors/restricted-fields.js.map +1 -0
  91. package/dist/set-creator-fields.d.ts +9 -0
  92. package/dist/set-creator-fields.js +38 -0
  93. package/dist/set-creator-fields.js.map +1 -0
  94. package/dist/string-formatting.d.ts +16 -0
  95. package/dist/string-formatting.js +85 -0
  96. package/dist/string-formatting.js.map +1 -0
  97. package/dist/template-configuration.d.ts +5 -0
  98. package/dist/template-configuration.js +28 -0
  99. package/dist/template-configuration.js.map +1 -0
  100. package/dist/template.d.ts +9 -0
  101. package/dist/template.js +20 -0
  102. package/dist/template.js.map +1 -0
  103. package/dist/traverse/factory.d.ts +80 -0
  104. package/dist/traverse/factory.js +127 -0
  105. package/dist/traverse/factory.js.map +1 -0
  106. package/dist/traverse/index.d.ts +5 -0
  107. package/dist/traverse/index.js +17 -0
  108. package/dist/traverse/index.js.map +1 -0
  109. package/dist/traverse/query-fields.d.ts +3 -0
  110. package/dist/traverse/query-fields.js +35 -0
  111. package/dist/traverse/query-fields.js.map +1 -0
  112. package/dist/traverse/query-filters.d.ts +3 -0
  113. package/dist/traverse/query-filters.js +75 -0
  114. package/dist/traverse/query-filters.js.map +1 -0
  115. package/dist/traverse/query-populate.d.ts +3 -0
  116. package/dist/traverse/query-populate.js +144 -0
  117. package/dist/traverse/query-populate.js.map +1 -0
  118. package/dist/traverse/query-sort.d.ts +3 -0
  119. package/dist/traverse/query-sort.js +116 -0
  120. package/dist/traverse/query-sort.js.map +1 -0
  121. package/dist/traverse-entity.d.ts +33 -0
  122. package/dist/traverse-entity.js +134 -0
  123. package/dist/traverse-entity.js.map +1 -0
  124. package/dist/types.d.ts +66 -0
  125. package/dist/types.js +4 -0
  126. package/dist/types.js.map +1 -0
  127. package/dist/validators.d.ts +13 -0
  128. package/dist/validators.js +120 -0
  129. package/dist/validators.js.map +1 -0
  130. package/dist/webhook.d.ts +10 -0
  131. package/dist/webhook.js +14 -0
  132. package/dist/webhook.js.map +1 -0
  133. package/lib/content-types.js +5 -4
  134. package/package.json +2 -2
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ // Code copied from the yup library (https://github.com/jquense/yup)
3
+ // https://github.com/jquense/yup/blob/2778b88bdacd5260d593c6468793da2e77daf21f/src/util/printValue.ts
4
+ const { toString } = Object.prototype;
5
+ const errorToString = Error.prototype.toString;
6
+ const regExpToString = RegExp.prototype.toString;
7
+ const symbolToString = typeof Symbol !== 'undefined' ? Symbol.prototype.toString : () => '';
8
+ const SYMBOL_REGEXP = /^Symbol\((.*)\)(.*)$/;
9
+ function printNumber(val) {
10
+ // eslint-disable-next-line eqeqeq
11
+ if (val != +val)
12
+ return 'NaN';
13
+ const isNegativeZero = val === 0 && 1 / val < 0;
14
+ return isNegativeZero ? '-0' : `${val}`;
15
+ }
16
+ function printSimpleValue(val, quoteStrings = false) {
17
+ if (val == null || val === true || val === false)
18
+ return `${val}`;
19
+ if (typeof val === 'number')
20
+ return printNumber(val);
21
+ if (typeof val === 'string')
22
+ return quoteStrings ? `"${val}"` : val;
23
+ if (typeof val === 'function')
24
+ return `[Function ${val.name || 'anonymous'}]`;
25
+ if (typeof val === 'symbol')
26
+ return symbolToString.call(val).replace(SYMBOL_REGEXP, 'Symbol($1)');
27
+ const tag = toString.call(val).slice(8, -1);
28
+ if (tag === 'Date') {
29
+ const v = val;
30
+ return Number.isNaN(v.getTime()) ? `${v}` : v.toISOString();
31
+ }
32
+ if (tag === 'Error' || val instanceof Error)
33
+ return `[${errorToString.call(val)}]`;
34
+ if (tag === 'RegExp')
35
+ return regExpToString.call(val);
36
+ return null;
37
+ }
38
+ function printValue(value, quoteStrings) {
39
+ const result = printSimpleValue(value, quoteStrings);
40
+ if (result !== null)
41
+ return result;
42
+ return JSON.stringify(value, function replacer(key, value) {
43
+ const result = printSimpleValue(this[key], quoteStrings);
44
+ if (result !== null)
45
+ return result;
46
+ return value;
47
+ }, 2);
48
+ }
49
+ module.exports = printValue;
50
+ //# sourceMappingURL=print-value.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"print-value.js","sourceRoot":"","sources":["../src/print-value.ts"],"names":[],"mappings":";AAAA,oEAAoE;AACpE,sGAAsG;AAEtG,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC;AACtC,MAAM,aAAa,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC;AAC/C,MAAM,cAAc,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC;AACjD,MAAM,cAAc,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;AAE5F,MAAM,aAAa,GAAG,sBAAsB,CAAC;AAE7C,SAAS,WAAW,CAAC,GAAW;IAC9B,kCAAkC;IAClC,IAAI,GAAG,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IAC9B,MAAM,cAAc,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;IAChD,OAAO,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;AAC1C,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAY,EAAE,YAAY,GAAG,KAAK;IAC1D,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,GAAG,GAAG,EAAE,CAAC;IAElE,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;IACrD,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,YAAY,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACpE,IAAI,OAAO,GAAG,KAAK,UAAU;QAAE,OAAO,aAAa,GAAG,CAAC,IAAI,IAAI,WAAW,GAAG,CAAC;IAC9E,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAElG,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAE5C,IAAI,GAAG,KAAK,MAAM,EAAE;QAClB,MAAM,CAAC,GAAG,GAAW,CAAC;QACtB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;KAC7D;IACD,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,YAAY,KAAK;QAAE,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACnF,IAAI,GAAG,KAAK,QAAQ;QAAE,OAAO,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEtD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,UAAU,CAAC,KAAc,EAAE,YAAqB;IACvD,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IACrD,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAEnC,OAAO,IAAI,CAAC,SAAS,CACnB,KAAK,EACL,SAAS,QAAQ,CAAC,GAAG,EAAE,KAAK;QAC1B,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC;QACzD,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,MAAM,CAAC;QACnC,OAAO,KAAK,CAAC;IACf,CAAC,EACD,CAAC,CACF,CAAC;AACJ,CAAC;AAED,iBAAS,UAAU,CAAC"}
@@ -0,0 +1,84 @@
1
+ export interface Options {
2
+ throwOnDuplicates?: boolean;
3
+ }
4
+ /**
5
+ * A Provider factory
6
+ */
7
+ declare const providerFactory: (options?: Options) => {
8
+ hooks: {
9
+ willRegister: {
10
+ call(context: unknown): Promise<void>;
11
+ getHandlers(): import("./hooks").Handler[];
12
+ register(handler: import("./hooks").Handler): {
13
+ getHandlers(): import("./hooks").Handler[];
14
+ register(handler: import("./hooks").Handler): any;
15
+ delete(handler: import("./hooks").Handler): any;
16
+ call(): never;
17
+ };
18
+ delete(handler: import("./hooks").Handler): {
19
+ getHandlers(): import("./hooks").Handler[];
20
+ register(handler: import("./hooks").Handler): any;
21
+ delete(handler: import("./hooks").Handler): any;
22
+ call(): never;
23
+ };
24
+ };
25
+ didRegister: {
26
+ call(context: unknown): Promise<any[]>;
27
+ getHandlers(): import("./hooks").Handler[];
28
+ register(handler: import("./hooks").Handler): {
29
+ getHandlers(): import("./hooks").Handler[];
30
+ register(handler: import("./hooks").Handler): any;
31
+ delete(handler: import("./hooks").Handler): any;
32
+ call(): never;
33
+ };
34
+ delete(handler: import("./hooks").Handler): {
35
+ getHandlers(): import("./hooks").Handler[];
36
+ register(handler: import("./hooks").Handler): any;
37
+ delete(handler: import("./hooks").Handler): any;
38
+ call(): never;
39
+ };
40
+ };
41
+ willDelete: {
42
+ call(context: unknown): Promise<any[]>;
43
+ getHandlers(): import("./hooks").Handler[];
44
+ register(handler: import("./hooks").Handler): {
45
+ getHandlers(): import("./hooks").Handler[];
46
+ register(handler: import("./hooks").Handler): any;
47
+ delete(handler: import("./hooks").Handler): any;
48
+ call(): never;
49
+ };
50
+ delete(handler: import("./hooks").Handler): {
51
+ getHandlers(): import("./hooks").Handler[];
52
+ register(handler: import("./hooks").Handler): any;
53
+ delete(handler: import("./hooks").Handler): any;
54
+ call(): never;
55
+ };
56
+ };
57
+ didDelete: {
58
+ call(context: unknown): Promise<any[]>;
59
+ getHandlers(): import("./hooks").Handler[];
60
+ register(handler: import("./hooks").Handler): {
61
+ getHandlers(): import("./hooks").Handler[];
62
+ register(handler: import("./hooks").Handler): any;
63
+ delete(handler: import("./hooks").Handler): any;
64
+ call(): never;
65
+ };
66
+ delete(handler: import("./hooks").Handler): {
67
+ getHandlers(): import("./hooks").Handler[];
68
+ register(handler: import("./hooks").Handler): any;
69
+ delete(handler: import("./hooks").Handler): any;
70
+ call(): never;
71
+ };
72
+ };
73
+ };
74
+ register(key: string, item: unknown): Promise<any>;
75
+ delete(key: string): Promise<any>;
76
+ get(key: string): any;
77
+ getWhere(filters?: {}): any[];
78
+ values(): any[];
79
+ keys(): any[];
80
+ has(key: string): boolean;
81
+ size(): number;
82
+ clear(): Promise<any>;
83
+ };
84
+ export default providerFactory;
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const fp_1 = require("lodash/fp");
4
+ const hooks_1 = require("./hooks");
5
+ /**
6
+ * @typedef ProviderHooksMap
7
+ * @property willRegister
8
+ * @property didRegister
9
+ * @property willDelete
10
+ * @property didDelete
11
+ */
12
+ /**
13
+ * Creates a new object containing various hooks used by the providers
14
+ * @return {ProviderHooksMap}
15
+ */
16
+ const createProviderHooksMap = () => ({
17
+ // Register events
18
+ willRegister: (0, hooks_1.createAsyncSeriesHook)(),
19
+ didRegister: (0, hooks_1.createAsyncParallelHook)(),
20
+ // Delete events
21
+ willDelete: (0, hooks_1.createAsyncParallelHook)(),
22
+ didDelete: (0, hooks_1.createAsyncParallelHook)(),
23
+ });
24
+ /**
25
+ * A Provider factory
26
+ */
27
+ const providerFactory = (options = {}) => {
28
+ const { throwOnDuplicates = true } = options;
29
+ const state = {
30
+ hooks: createProviderHooksMap(),
31
+ registry: new Map(),
32
+ };
33
+ return {
34
+ hooks: state.hooks,
35
+ async register(key, item) {
36
+ if (throwOnDuplicates && this.has(key)) {
37
+ throw new Error(`Duplicated item key: ${key}`);
38
+ }
39
+ await state.hooks.willRegister.call({ key, value: item });
40
+ state.registry.set(key, item);
41
+ await state.hooks.didRegister.call({ key, value: (0, fp_1.cloneDeep)(item) });
42
+ return this;
43
+ },
44
+ async delete(key) {
45
+ if (this.has(key)) {
46
+ const item = this.get(key);
47
+ await state.hooks.willDelete.call({ key, value: (0, fp_1.cloneDeep)(item) });
48
+ state.registry.delete(key);
49
+ await state.hooks.didDelete.call({ key, value: (0, fp_1.cloneDeep)(item) });
50
+ }
51
+ return this;
52
+ },
53
+ get(key) {
54
+ return state.registry.get(key);
55
+ },
56
+ getWhere(filters = {}) {
57
+ const items = this.values();
58
+ const filtersEntries = Object.entries(filters);
59
+ if (filtersEntries.length === 0) {
60
+ return items;
61
+ }
62
+ return items.filter((item) => {
63
+ return filtersEntries.every(([key, value]) => item[key] === value);
64
+ });
65
+ },
66
+ values() {
67
+ return Array.from(state.registry.values());
68
+ },
69
+ keys() {
70
+ return Array.from(state.registry.keys());
71
+ },
72
+ has(key) {
73
+ return state.registry.has(key);
74
+ },
75
+ size() {
76
+ return state.registry.size;
77
+ },
78
+ async clear() {
79
+ const keys = this.keys();
80
+ for (const key of keys) {
81
+ await this.delete(key);
82
+ }
83
+ return this;
84
+ },
85
+ };
86
+ };
87
+ exports.default = providerFactory;
88
+ //# sourceMappingURL=provider-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-factory.js","sourceRoot":"","sources":["../src/provider-factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Attribute, Model } from './types';
2
+ declare const getRelationalFields: (contentType: Model) => string[];
3
+ declare const isOneToAny: (attribute: Attribute) => boolean;
4
+ declare const isManyToAny: (attribute: Attribute) => boolean;
5
+ declare const isAnyToOne: (attribute: Attribute) => boolean;
6
+ declare const isAnyToMany: (attribute: Attribute) => boolean;
7
+ export declare const constants: {
8
+ MANY_RELATIONS: string[];
9
+ };
10
+ export { getRelationalFields, isOneToAny, isManyToAny, isAnyToOne, isAnyToMany };
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isAnyToMany = exports.isAnyToOne = exports.isManyToAny = exports.isOneToAny = exports.getRelationalFields = exports.constants = void 0;
4
+ const content_types_1 = require("./content-types");
5
+ const MANY_RELATIONS = ['oneToMany', 'manyToMany'];
6
+ const getRelationalFields = (contentType) => {
7
+ return Object.keys(contentType.attributes).filter((attributeName) => {
8
+ return contentType.attributes[attributeName].type === 'relation';
9
+ });
10
+ };
11
+ exports.getRelationalFields = getRelationalFields;
12
+ const isOneToAny = (attribute) => (0, content_types_1.isRelationalAttribute)(attribute) && ['oneToOne', 'oneToMany'].includes(attribute.relation);
13
+ exports.isOneToAny = isOneToAny;
14
+ const isManyToAny = (attribute) => (0, content_types_1.isRelationalAttribute)(attribute) && ['manyToMany', 'manyToOne'].includes(attribute.relation);
15
+ exports.isManyToAny = isManyToAny;
16
+ const isAnyToOne = (attribute) => (0, content_types_1.isRelationalAttribute)(attribute) && ['oneToOne', 'manyToOne'].includes(attribute.relation);
17
+ exports.isAnyToOne = isAnyToOne;
18
+ const isAnyToMany = (attribute) => (0, content_types_1.isRelationalAttribute)(attribute) && ['oneToMany', 'manyToMany'].includes(attribute.relation);
19
+ exports.isAnyToMany = isAnyToMany;
20
+ exports.constants = {
21
+ MANY_RELATIONS,
22
+ };
23
+ //# sourceMappingURL=relations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relations.js","sourceRoot":"","sources":["../src/relations.ts"],"names":[],"mappings":";;;AAEA,mDAAwD;AAExD,MAAM,cAAc,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;AAEnD,MAAM,mBAAmB,GAAG,CAAC,WAAkB,EAAE,EAAE;IACjD,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,EAAE;QAClE,OAAO,WAAW,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAeO,kDAAmB;AAb5B,MAAM,UAAU,GAAG,CAAC,SAAoB,EAAE,EAAE,CAC1C,IAAA,qCAAqB,EAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AAY/D,gCAAU;AAXxC,MAAM,WAAW,GAAG,CAAC,SAAoB,EAAE,EAAE,CAC3C,IAAA,qCAAqB,EAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AAUrD,kCAAW;AATrD,MAAM,UAAU,GAAG,CAAC,SAAoB,EAAE,EAAE,CAC1C,IAAA,qCAAqB,EAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AAQtC,gCAAU;AAPjE,MAAM,WAAW,GAAG,CAAC,SAAoB,EAAE,EAAE,CAC3C,IAAA,qCAAqB,EAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AAM5B,kCAAW;AAJjE,QAAA,SAAS,GAAG;IACvB,cAAc;CACf,CAAC"}
@@ -0,0 +1,23 @@
1
+ import * as visitors from './visitors';
2
+ import * as sanitizers from './sanitizers';
3
+ import { Model } from '../types';
4
+ export interface Options {
5
+ auth?: unknown;
6
+ }
7
+ export interface SanitizeFunc {
8
+ (data: unknown, schema: Model, options?: Options): Promise<unknown>;
9
+ }
10
+ declare const _default: {
11
+ contentAPI: {
12
+ input: SanitizeFunc;
13
+ output: SanitizeFunc;
14
+ query: (query: Record<string, unknown>, schema: Model, { auth }?: Options) => Promise<Record<string, unknown>>;
15
+ filters: SanitizeFunc;
16
+ sort: SanitizeFunc;
17
+ fields: SanitizeFunc;
18
+ populate: SanitizeFunc;
19
+ };
20
+ sanitizers: typeof sanitizers;
21
+ visitors: typeof visitors;
22
+ };
23
+ export default _default;
@@ -0,0 +1,135 @@
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 sanitizers = __importStar(require("./sanitizers"));
34
+ const traverse_entity_1 = __importDefault(require("../traverse-entity"));
35
+ const traverse_1 = require("../traverse");
36
+ const createContentAPISanitizers = () => {
37
+ const sanitizeInput = (data, schema, { auth } = {}) => {
38
+ if ((0, fp_1.isArray)(data)) {
39
+ return Promise.all(data.map((entry) => sanitizeInput(entry, schema, { auth })));
40
+ }
41
+ const nonWritableAttributes = (0, content_types_1.getNonWritableAttributes)(schema);
42
+ const transforms = [
43
+ // Remove non writable attributes
44
+ (0, traverse_entity_1.default)(visitors.restrictedFields(nonWritableAttributes), { schema }),
45
+ ];
46
+ if (auth) {
47
+ // Remove restricted relations
48
+ transforms.push((0, traverse_entity_1.default)(visitors.removeRestrictedRelations(auth), { schema }));
49
+ }
50
+ // Apply sanitizers from registry if exists
51
+ strapi.sanitizers
52
+ .get('content-api.input')
53
+ .forEach((sanitizer) => transforms.push(sanitizer(schema)));
54
+ return (0, async_1.pipeAsync)(...transforms)(data);
55
+ };
56
+ const sanitizeOutput = async (data, schema, { auth } = {}) => {
57
+ if ((0, fp_1.isArray)(data)) {
58
+ const res = new Array(data.length);
59
+ for (let i = 0; i < data.length; i += 1) {
60
+ res[i] = await sanitizeOutput(data[i], schema, { auth });
61
+ }
62
+ return res;
63
+ }
64
+ const transforms = [(data) => sanitizers.defaultSanitizeOutput(schema, data)];
65
+ if (auth) {
66
+ transforms.push((0, traverse_entity_1.default)(visitors.removeRestrictedRelations(auth), { schema }));
67
+ }
68
+ // Apply sanitizers from registry if exists
69
+ strapi.sanitizers
70
+ .get('content-api.output')
71
+ .forEach((sanitizer) => transforms.push(sanitizer(schema)));
72
+ return (0, async_1.pipeAsync)(...transforms)(data);
73
+ };
74
+ const sanitizeQuery = async (query, schema, { auth } = {}) => {
75
+ const { filters, sort, fields, populate } = query;
76
+ const sanitizedQuery = (0, fp_1.cloneDeep)(query);
77
+ if (filters) {
78
+ Object.assign(sanitizedQuery, { filters: await sanitizeFilters(filters, schema, { auth }) });
79
+ }
80
+ if (sort) {
81
+ Object.assign(sanitizedQuery, { sort: await sanitizeSort(sort, schema, { auth }) });
82
+ }
83
+ if (fields) {
84
+ Object.assign(sanitizedQuery, { fields: await sanitizeFields(fields, schema) });
85
+ }
86
+ if (populate) {
87
+ Object.assign(sanitizedQuery, { populate: await sanitizePopulate(populate, schema) });
88
+ }
89
+ return sanitizedQuery;
90
+ };
91
+ const sanitizeFilters = (filters, schema, { auth } = {}) => {
92
+ if ((0, fp_1.isArray)(filters)) {
93
+ return Promise.all(filters.map((filter) => sanitizeFilters(filter, schema, { auth })));
94
+ }
95
+ const transforms = [sanitizers.defaultSanitizeFilters(schema)];
96
+ if (auth) {
97
+ transforms.push((0, traverse_1.traverseQueryFilters)(visitors.removeRestrictedRelations(auth), { schema }));
98
+ }
99
+ return (0, async_1.pipeAsync)(...transforms)(filters);
100
+ };
101
+ const sanitizeSort = (sort, schema, { auth } = {}) => {
102
+ const transforms = [sanitizers.defaultSanitizeSort(schema)];
103
+ if (auth) {
104
+ transforms.push((0, traverse_1.traverseQuerySort)(visitors.removeRestrictedRelations(auth), { schema }));
105
+ }
106
+ return (0, async_1.pipeAsync)(...transforms)(sort);
107
+ };
108
+ const sanitizeFields = (fields, schema) => {
109
+ const transforms = [sanitizers.defaultSanitizeFields(schema)];
110
+ return (0, async_1.pipeAsync)(...transforms)(fields);
111
+ };
112
+ const sanitizePopulate = (populate, schema, { auth } = {}) => {
113
+ const transforms = [sanitizers.defaultSanitizePopulate(schema)];
114
+ if (auth) {
115
+ transforms.push((0, traverse_1.traverseQueryPopulate)(visitors.removeRestrictedRelations(auth), { schema }));
116
+ }
117
+ return (0, async_1.pipeAsync)(...transforms)(populate);
118
+ };
119
+ return {
120
+ input: sanitizeInput,
121
+ output: sanitizeOutput,
122
+ query: sanitizeQuery,
123
+ filters: sanitizeFilters,
124
+ sort: sanitizeSort,
125
+ fields: sanitizeFields,
126
+ populate: sanitizePopulate,
127
+ };
128
+ };
129
+ const contentAPI = createContentAPISanitizers();
130
+ exports.default = {
131
+ contentAPI,
132
+ sanitizers,
133
+ visitors,
134
+ };
135
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sanitize/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /// <reference types="lodash" />
2
+ import { Data } from '../traverse-entity';
3
+ import type { Model } from '../types';
4
+ declare const sanitizePasswords: (schema: Model) => (entity: Data) => Promise<Data>;
5
+ declare const defaultSanitizeOutput: (schema: Model, entity: Data) => Promise<Data>;
6
+ declare const defaultSanitizeFilters: import("lodash").CurriedFunction2<Model, unknown, Promise<unknown>>;
7
+ declare const defaultSanitizeSort: import("lodash").CurriedFunction2<Model, unknown, Promise<unknown>>;
8
+ declare const defaultSanitizeFields: import("lodash").CurriedFunction2<Model, unknown, Promise<any>>;
9
+ declare const defaultSanitizePopulate: import("lodash").CurriedFunction2<Model, unknown, Promise<unknown>>;
10
+ export { sanitizePasswords, defaultSanitizeOutput, defaultSanitizeFilters, defaultSanitizeSort, defaultSanitizeFields, defaultSanitizePopulate, };
@@ -0,0 +1,106 @@
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.defaultSanitizePopulate = exports.defaultSanitizeFields = exports.defaultSanitizeSort = exports.defaultSanitizeFilters = exports.defaultSanitizeOutput = exports.sanitizePasswords = 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 sanitizePasswords = (schema) => async (entity) => {
14
+ return (0, traverse_entity_1.default)(visitors_1.removePassword, { schema }, entity);
15
+ };
16
+ exports.sanitizePasswords = sanitizePasswords;
17
+ const defaultSanitizeOutput = async (schema, entity) => {
18
+ return (0, traverse_entity_1.default)((...args) => {
19
+ (0, visitors_1.removePassword)(...args);
20
+ (0, visitors_1.removePrivate)(...args);
21
+ }, { schema }, entity);
22
+ };
23
+ exports.defaultSanitizeOutput = defaultSanitizeOutput;
24
+ const defaultSanitizeFilters = (0, fp_1.curry)((schema, filters) => {
25
+ return (0, async_1.pipeAsync)(
26
+ // Remove dynamic zones from filters
27
+ (0, traverse_1.traverseQueryFilters)(visitors_1.removeDynamicZones, { schema }),
28
+ // Remove morpTo relations from filters
29
+ (0, traverse_1.traverseQueryFilters)(visitors_1.removeMorphToRelations, { schema }),
30
+ // Remove passwords from filters
31
+ (0, traverse_1.traverseQueryFilters)(visitors_1.removePassword, { schema }),
32
+ // Remove private from filters
33
+ (0, traverse_1.traverseQueryFilters)(visitors_1.removePrivate, { schema }),
34
+ // Remove empty objects
35
+ (0, traverse_1.traverseQueryFilters)(({ key, value }, { remove }) => {
36
+ if ((0, fp_1.isObject)(value) && (0, fp_1.isEmpty)(value)) {
37
+ remove(key);
38
+ }
39
+ }, { schema }))(filters);
40
+ });
41
+ exports.defaultSanitizeFilters = defaultSanitizeFilters;
42
+ const defaultSanitizeSort = (0, fp_1.curry)((schema, sort) => {
43
+ return (0, async_1.pipeAsync)(
44
+ // Remove non attribute keys
45
+ (0, traverse_1.traverseQuerySort)(({ key, attribute }, { remove }) => {
46
+ // ID is not an attribute per se, so we need to make
47
+ // an extra check to ensure we're not removing it
48
+ if (key === 'id') {
49
+ return;
50
+ }
51
+ if (!attribute) {
52
+ remove(key);
53
+ }
54
+ }, { schema }),
55
+ // Remove dynamic zones from sort
56
+ (0, traverse_1.traverseQuerySort)(visitors_1.removeDynamicZones, { schema }),
57
+ // Remove morpTo relations from sort
58
+ (0, traverse_1.traverseQuerySort)(visitors_1.removeMorphToRelations, { schema }),
59
+ // Remove private from sort
60
+ (0, traverse_1.traverseQuerySort)(visitors_1.removePrivate, { schema }),
61
+ // Remove passwords from filters
62
+ (0, traverse_1.traverseQuerySort)(visitors_1.removePassword, { schema }),
63
+ // Remove keys for empty non-scalar values
64
+ (0, traverse_1.traverseQuerySort)(({ key, attribute, value }, { remove }) => {
65
+ if (!(0, content_types_1.isScalarAttribute)(attribute) && (0, fp_1.isEmpty)(value)) {
66
+ remove(key);
67
+ }
68
+ }, { schema }))(sort);
69
+ });
70
+ exports.defaultSanitizeSort = defaultSanitizeSort;
71
+ const defaultSanitizeFields = (0, fp_1.curry)((schema, fields) => {
72
+ return (0, async_1.pipeAsync)(
73
+ // Only keep scalar attributes
74
+ (0, traverse_1.traverseQueryFields)(({ key, attribute }, { remove }) => {
75
+ if ((0, fp_1.isNil)(attribute) || !(0, content_types_1.isScalarAttribute)(attribute)) {
76
+ remove(key);
77
+ }
78
+ }, { schema }),
79
+ // Remove private fields
80
+ (0, traverse_1.traverseQueryFields)(visitors_1.removePrivate, { schema }),
81
+ // Remove password fields
82
+ (0, traverse_1.traverseQueryFields)(visitors_1.removePassword, { schema }),
83
+ // Remove nil values from fields array
84
+ (value) => ((0, fp_1.isArray)(value) ? value.filter((field) => !(0, fp_1.isNil)(field)) : value))(fields);
85
+ });
86
+ exports.defaultSanitizeFields = defaultSanitizeFields;
87
+ const defaultSanitizePopulate = (0, fp_1.curry)((schema, populate) => {
88
+ return (0, async_1.pipeAsync)((0, traverse_1.traverseQueryPopulate)(async ({ key, value, schema, attribute }, { set }) => {
89
+ if (attribute) {
90
+ return;
91
+ }
92
+ if (key === 'sort') {
93
+ set(key, await defaultSanitizeSort(schema, value));
94
+ }
95
+ if (key === 'filters') {
96
+ set(key, await defaultSanitizeFilters(schema, value));
97
+ }
98
+ if (key === 'fields') {
99
+ set(key, await defaultSanitizeFields(schema, value));
100
+ }
101
+ }, { schema }),
102
+ // Remove private fields
103
+ (0, traverse_1.traverseQueryPopulate)(visitors_1.removePrivate, { schema }))(populate);
104
+ });
105
+ exports.defaultSanitizePopulate = defaultSanitizePopulate;
106
+ //# sourceMappingURL=sanitizers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitizers.js","sourceRoot":"","sources":["../../src/sanitize/sanitizers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Visitor } from '../../traverse/factory';
2
+ declare const _default: (allowedFields?: string[] | null) => Visitor;
3
+ export default _default;