quetch 0.14.0 → 0.16.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 (232) hide show
  1. package/dist/middlewares/aggregate.js +1 -1
  2. package/dist/middlewares/aggregate.js.map +1 -1
  3. package/dist/middlewares/fetchExternal.js +1 -1
  4. package/dist/middlewares/fetchExternal.js.map +1 -1
  5. package/dist/middlewares/retry.js +1 -1
  6. package/dist/middlewares/retry.js.map +1 -1
  7. package/dist/tools/defineCheckQuery.d.ts +3 -7
  8. package/dist/tools/defineCustomFetch.d.ts +1 -1
  9. package/dist/tools/fieldListFromFilter.d.ts +8 -0
  10. package/dist/tools/fieldListFromFilter.js +37 -0
  11. package/dist/tools/fieldListFromFilter.js.map +1 -0
  12. package/dist/tools/get.d.ts +1 -3
  13. package/dist/tools/get.js.map +1 -1
  14. package/dist/tools/normalizeOrder.d.ts +9 -3
  15. package/dist/tools/normalizeOrder.js +13 -6
  16. package/dist/tools/normalizeOrder.js.map +1 -1
  17. package/dist/tools/queryItemList.d.ts +7 -2
  18. package/dist/tools/queryItemList.js +72 -31
  19. package/dist/tools/queryItemList.js.map +1 -1
  20. package/dist/tools/reverseOrder.d.ts +11 -0
  21. package/dist/tools/reverseOrder.js +15 -0
  22. package/dist/tools/reverseOrder.js.map +1 -0
  23. package/dist/tools/sortItemList.d.ts +2 -2
  24. package/dist/tools/sortItemList.js +11 -8
  25. package/dist/tools/sortItemList.js.map +1 -1
  26. package/dist/tools/{filterItem.d.ts → testFilter.d.ts} +2 -2
  27. package/dist/tools/testFilter.js +214 -0
  28. package/dist/tools/testFilter.js.map +1 -0
  29. package/dist/tools.d.ts +3 -1
  30. package/dist/tools.js +3 -1
  31. package/dist/tools.js.map +1 -1
  32. package/dist/types/AggregateFunction.d.ts +4 -0
  33. package/dist/types/AggregateFunction.js +0 -1
  34. package/dist/types/AggregateFunctionOperator.js +0 -1
  35. package/dist/types/Any.js +0 -1
  36. package/dist/types/Context.js +0 -1
  37. package/dist/types/CustomFetch.js +0 -1
  38. package/dist/types/CustomFieldAggregateMap.js +0 -1
  39. package/dist/types/CustomFieldMap.js +0 -1
  40. package/dist/types/Field.js +0 -1
  41. package/dist/types/FieldFiltered.d.ts +1 -1
  42. package/dist/types/FieldFiltered.js +0 -1
  43. package/dist/types/FieldFunction.js +0 -1
  44. package/dist/types/FieldFunctionCustom.js +0 -1
  45. package/dist/types/FieldFunctionFormatDate.js +0 -1
  46. package/dist/types/FieldFunctionReturn.js +0 -1
  47. package/dist/types/Filter.js +0 -1
  48. package/dist/types/FilterArray.d.ts +2 -2
  49. package/dist/types/FilterArray.js +0 -1
  50. package/dist/types/FilterBoolean.d.ts +2 -2
  51. package/dist/types/FilterBoolean.js +0 -1
  52. package/dist/types/FilterChildren.js +0 -1
  53. package/dist/types/FilterCustom.js +0 -1
  54. package/dist/types/FilterField.d.ts +2 -2
  55. package/dist/types/FilterField.js +0 -1
  56. package/dist/types/FilterGroup.js +0 -1
  57. package/dist/types/FilterNumber.d.ts +2 -2
  58. package/dist/types/FilterNumber.js +0 -1
  59. package/dist/types/FilterOperator.js +0 -1
  60. package/dist/types/FilterString.d.ts +2 -2
  61. package/dist/types/FilterString.js +0 -1
  62. package/dist/types/FilterStringIntersect.d.ts +2 -2
  63. package/dist/types/FilterStringIntersect.js +0 -1
  64. package/dist/types/FilterStringMatch.d.ts +3 -6
  65. package/dist/types/FilterStringMatch.js +0 -1
  66. package/dist/types/Get.d.ts +2 -2
  67. package/dist/types/Get.js +0 -1
  68. package/dist/types/Group.js +0 -1
  69. package/dist/types/Handler.js +0 -1
  70. package/dist/types/Immutable.js +0 -1
  71. package/dist/types/Increment.d.ts +4 -0
  72. package/dist/types/Increment.js +1 -0
  73. package/dist/types/Increment.js.map +1 -0
  74. package/dist/types/InjectCustomFields.js +0 -1
  75. package/dist/types/Item.js +0 -1
  76. package/dist/types/Join.d.ts +1 -0
  77. package/dist/types/Join.js +1 -0
  78. package/dist/types/Join.js.map +1 -0
  79. package/dist/types/Key.js +0 -1
  80. package/dist/types/KeyFiltered.js +0 -1
  81. package/dist/types/Locale.js +0 -1
  82. package/dist/types/Mutable.js +0 -1
  83. package/dist/types/NextHandler.js +0 -1
  84. package/dist/types/Order.d.ts +3 -2
  85. package/dist/types/Order.js +0 -1
  86. package/dist/types/Parameters.js +0 -1
  87. package/dist/types/Path.d.ts +3 -2
  88. package/dist/types/Path.js +0 -1
  89. package/dist/types/PathFiltered.d.ts +3 -2
  90. package/dist/types/PathFiltered.js +0 -1
  91. package/dist/types/Query.js +0 -1
  92. package/dist/types/QueryAggregate.d.ts +16 -0
  93. package/dist/types/QueryAggregate.js +0 -1
  94. package/dist/types/QueryCreate.js +0 -1
  95. package/dist/types/QueryCreateMultiple.js +0 -1
  96. package/dist/types/QueryDelete.js +0 -1
  97. package/dist/types/QueryDeleteMultiple.js +0 -1
  98. package/dist/types/QueryMethod.js +0 -1
  99. package/dist/types/QueryRead.d.ts +5 -2
  100. package/dist/types/QueryRead.js +0 -1
  101. package/dist/types/QueryReadMultiple.js +0 -1
  102. package/dist/types/QuerySettings.js +0 -1
  103. package/dist/types/QueryUpdate.js +0 -1
  104. package/dist/types/QueryUpdateMultiple.js +0 -1
  105. package/dist/types/Result.js +0 -1
  106. package/dist/types/Store.js +0 -1
  107. package/dist/types/Value.d.ts +15 -0
  108. package/dist/types/Value.js +1 -0
  109. package/dist/types/Value.js.map +1 -0
  110. package/dist/types.d.ts +3 -0
  111. package/dist/types.js +0 -1
  112. package/doc/README.md +85 -2042
  113. package/doc/classes/RequestError.md +30 -39
  114. package/doc/functions/aggregate.md +49 -0
  115. package/doc/functions/branch.md +46 -0
  116. package/doc/functions/cache.md +59 -0
  117. package/doc/functions/combine.md +117 -0
  118. package/doc/functions/cork.md +23 -0
  119. package/doc/functions/defineCheckQuery.md +55 -0
  120. package/doc/functions/defineCustomFetch.md +63 -0
  121. package/doc/functions/defineGenericFetch.md +54 -0
  122. package/doc/functions/escapeRegex.md +27 -0
  123. package/doc/functions/fetchExternal.md +27 -0
  124. package/doc/functions/fetchLocal.md +25 -0
  125. package/doc/functions/fieldListFromFilter.md +31 -0
  126. package/doc/functions/filterChildren.md +31 -0
  127. package/doc/functions/filterFromContext.md +25 -0
  128. package/doc/functions/get.md +40 -0
  129. package/doc/functions/identity.md +33 -0
  130. package/doc/functions/isFilterGroup.md +31 -0
  131. package/doc/functions/log.md +35 -0
  132. package/doc/functions/normalizeOrder.md +39 -0
  133. package/doc/functions/queryItemList.md +33 -0
  134. package/doc/functions/retry.md +33 -0
  135. package/doc/functions/reverseOrder.md +39 -0
  136. package/doc/functions/sortItemList.md +35 -0
  137. package/doc/functions/testFilter.md +39 -0
  138. package/doc/interfaces/CustomFetch.md +15 -21
  139. package/doc/type-aliases/AggregateFunction.md +19 -0
  140. package/doc/type-aliases/AggregateFunctionOperator.md +13 -0
  141. package/doc/type-aliases/Any.md +13 -0
  142. package/doc/type-aliases/Context.md +17 -0
  143. package/doc/type-aliases/CustomFieldAggregateMap.md +17 -0
  144. package/doc/type-aliases/CustomFieldMap.md +17 -0
  145. package/doc/type-aliases/Field.md +17 -0
  146. package/doc/type-aliases/FieldFiltered.md +19 -0
  147. package/doc/type-aliases/FieldFunction.md +17 -0
  148. package/doc/type-aliases/FieldFunctionCustom.md +37 -0
  149. package/doc/type-aliases/FieldFunctionFormatDate.md +33 -0
  150. package/doc/type-aliases/FieldFunctionReturn.md +21 -0
  151. package/doc/type-aliases/Filter.md +19 -0
  152. package/doc/type-aliases/FilterArray.md +31 -0
  153. package/doc/type-aliases/FilterBoolean.md +29 -0
  154. package/doc/type-aliases/FilterChildren.md +38 -0
  155. package/doc/type-aliases/FilterCustom.md +37 -0
  156. package/doc/type-aliases/FilterField.md +31 -0
  157. package/doc/type-aliases/FilterGroup.md +19 -0
  158. package/doc/type-aliases/FilterNumber.md +29 -0
  159. package/doc/type-aliases/FilterOperator.md +13 -0
  160. package/doc/type-aliases/FilterString.md +37 -0
  161. package/doc/type-aliases/FilterStringIntersect.md +37 -0
  162. package/doc/type-aliases/FilterStringMatch.md +53 -0
  163. package/doc/type-aliases/Get.md +21 -0
  164. package/doc/type-aliases/Group.md +19 -0
  165. package/doc/type-aliases/Handler.md +35 -0
  166. package/doc/type-aliases/Immutable.md +17 -0
  167. package/doc/type-aliases/Increment.md +17 -0
  168. package/doc/type-aliases/InjectCustomFields.md +21 -0
  169. package/doc/type-aliases/Item.md +21 -0
  170. package/doc/type-aliases/Join.md +19 -0
  171. package/doc/type-aliases/Key.md +13 -0
  172. package/doc/type-aliases/KeyFiltered.md +21 -0
  173. package/doc/type-aliases/Locale.md +13 -0
  174. package/doc/type-aliases/Mutable.md +17 -0
  175. package/doc/type-aliases/NextHandler.md +29 -0
  176. package/doc/type-aliases/Order.md +19 -0
  177. package/doc/type-aliases/Parameters.md +13 -0
  178. package/doc/type-aliases/Path.md +19 -0
  179. package/doc/type-aliases/PathFiltered.md +21 -0
  180. package/doc/type-aliases/Query.md +19 -0
  181. package/doc/type-aliases/QueryAggregate.md +71 -0
  182. package/doc/type-aliases/QueryCreate.md +53 -0
  183. package/doc/type-aliases/QueryCreateMultiple.md +51 -0
  184. package/doc/type-aliases/QueryDelete.md +51 -0
  185. package/doc/type-aliases/QueryDeleteMultiple.md +51 -0
  186. package/doc/type-aliases/QueryMethod.md +15 -0
  187. package/doc/type-aliases/QueryRead.md +79 -0
  188. package/doc/type-aliases/QueryReadMultiple.md +83 -0
  189. package/doc/type-aliases/QuerySettings.md +63 -0
  190. package/doc/type-aliases/QueryUpdate.md +71 -0
  191. package/doc/type-aliases/QueryUpdateMultiple.md +75 -0
  192. package/doc/type-aliases/Result.md +19 -0
  193. package/doc/type-aliases/Store.md +61 -0
  194. package/doc/type-aliases/Value.md +21 -0
  195. package/lib/middlewares/aggregate.ts +1 -1
  196. package/lib/middlewares/fetchExternal.ts +1 -1
  197. package/lib/middlewares/retry.ts +1 -1
  198. package/lib/tools/fieldListFromFilter.ts +41 -0
  199. package/lib/tools/get.test.ts +13 -4
  200. package/lib/tools/get.ts +1 -11
  201. package/lib/tools/normalizeOrder.ts +19 -8
  202. package/lib/tools/queryItemList.test.ts +61 -0
  203. package/lib/tools/queryItemList.ts +94 -51
  204. package/lib/tools/reverseOrder.ts +22 -0
  205. package/lib/tools/sortItemList.ts +11 -8
  206. package/lib/tools/{filterItem.test.ts → testFilter.test.ts} +44 -38
  207. package/lib/tools/testFilter.ts +320 -0
  208. package/lib/tools.ts +3 -1
  209. package/lib/types/AggregateFunction.ts +4 -0
  210. package/lib/types/FieldFiltered.ts +2 -2
  211. package/lib/types/FilterArray.ts +2 -2
  212. package/lib/types/FilterBoolean.ts +2 -2
  213. package/lib/types/FilterField.ts +2 -2
  214. package/lib/types/FilterNumber.ts +2 -2
  215. package/lib/types/FilterString.ts +2 -2
  216. package/lib/types/FilterStringIntersect.ts +2 -2
  217. package/lib/types/FilterStringMatch.ts +3 -6
  218. package/lib/types/Get.ts +4 -2
  219. package/lib/types/Increment.ts +5 -0
  220. package/lib/types/Join.ts +12 -0
  221. package/lib/types/Order.ts +4 -2
  222. package/lib/types/Path.ts +7 -3
  223. package/lib/types/PathFiltered.ts +9 -3
  224. package/lib/types/QueryAggregate.ts +16 -0
  225. package/lib/types/QueryRead.ts +5 -2
  226. package/lib/types/QuerySettings.ts +1 -0
  227. package/lib/types/Value.ts +18 -0
  228. package/lib/types.ts +3 -0
  229. package/package.json +30 -29
  230. package/dist/tools/filterItem.js +0 -197
  231. package/dist/tools/filterItem.js.map +0 -1
  232. package/lib/tools/filterItem.ts +0 -299
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "quetch",
3
- "version": "0.14.0",
3
+ "version": "0.16.0",
4
4
  "type": "module",
5
5
  "main": "./dist/main.js",
6
6
  "exports": {
@@ -48,36 +48,37 @@
48
48
  "release:beta": "npm version prerelease --preid=beta && git push origin --follow-tags && npm publish --tag=next"
49
49
  },
50
50
  "devDependencies": {
51
- "@eslint/js": "^8.53.0",
52
- "@preact/preset-vite": "^2.6.0",
53
- "@types/eslint": "^8.44.6",
54
- "@types/node": "^20.8.10",
55
- "@typescript-eslint/parser": "^6.9.1",
56
- "autoprefixer": "^10.4.16",
57
- "cssnano": "^6.0.1",
58
- "eslint": "^8.51.0",
59
- "eslint-config-preact": "^1.3.0",
60
- "eslint-config-prettier": "^9.0.0",
61
- "eslint-plugin-import": "^2.28.1",
62
- "eslint-plugin-inferno": "^7.32.2",
51
+ "@eslint/js": "^8.57.1",
52
+ "@nevoland/get-global": "^2.0.2",
53
+ "@preact/preset-vite": "^2.9.1",
54
+ "@types/eslint": "^9.6.1",
55
+ "@types/node": "^22.7.5",
56
+ "@typescript-eslint/parser": "^8.8.1",
57
+ "autoprefixer": "^10.4.20",
58
+ "cssnano": "^6.1.2",
59
+ "eslint": "^8.57.1",
60
+ "eslint-config-preact": "^1.5.0",
61
+ "eslint-config-prettier": "^9.1.0",
62
+ "eslint-plugin-import": "^2.31.0",
63
+ "eslint-plugin-inferno": "^7.34.0",
63
64
  "eslint-plugin-sort-keys": "^2.3.5",
64
- "eslint-plugin-tailwindcss": "^3.13.0",
65
- "eslint-plugin-vitest": "^0.3.2",
66
- "postcss": "^8.4.31",
67
- "postcss-pseudo-classes": "^0.2.1",
68
- "preact": "^10.18.1",
69
- "prettier": "^3.0.3",
70
- "prettier-plugin-tailwindcss": "^0.5.5",
71
- "tailwindcss": "^3.3.3",
72
- "typedoc": "^0.25.13",
73
- "typedoc-plugin-markdown": "^3.17.1",
74
- "typescript": "^5.4.5",
75
- "vite": "^4.4.11",
76
- "vite-plugin-module-list": "^2.1.0",
77
- "vitest": "^0.34.6"
65
+ "eslint-plugin-tailwindcss": "^3.17.5",
66
+ "eslint-plugin-vitest": "^0.5.4",
67
+ "postcss": "^8.4.47",
68
+ "postcss-pseudo-classes": "^0.4.0",
69
+ "preact": "^10.24.2",
70
+ "prettier": "^3.3.3",
71
+ "prettier-plugin-tailwindcss": "^0.6.8",
72
+ "tailwindcss": "^3.4.13",
73
+ "typedoc": "^0.26.8",
74
+ "typedoc-plugin-markdown": "^4.2.9",
75
+ "typescript": "^5.6.3",
76
+ "vite": "^5.4.8",
77
+ "vite-plugin-module-list": "^2.2.2",
78
+ "vitest": "^2.1.2"
78
79
  },
79
80
  "dependencies": {
80
- "@davidbonnet/get-global": "^2.0.1",
81
- "futurise": "^1.2.3"
81
+ "futurise": "^1.7.1",
82
+ "unchangeable": "^1.7.0"
82
83
  }
83
84
  }
@@ -1,197 +0,0 @@
1
- import { SymbolCache } from "../constants/SymbolCache.js";
2
- import { filterChildren } from "./filterChildren.js";
3
- import { get } from "./get.js";
4
- const { isArray } = Array;
5
- /**
6
- * Checks wether the provided `value` matches the `filter` or not.
7
- *
8
- * @param filter The filter to apply.
9
- * @param value The value to check.
10
- * @param settings Optional query settings.
11
- * @returns `true` if the `value` matches the `filter` and `false` otherwise.
12
- */
13
- export function filterItem(filter, value, settings) {
14
- if (value === undefined) {
15
- return false;
16
- }
17
- if (filter === undefined) {
18
- return true;
19
- }
20
- switch (filter.operator) {
21
- case "all":
22
- return filter.value.every((filter) => filterItem(filter, value));
23
- case "any": {
24
- if (filter.value === undefined || filter.value.length === 0) {
25
- return true;
26
- }
27
- return filter.value.some((filter) => filterItem(filter, value));
28
- }
29
- case "none": {
30
- if (filter.value === undefined || filter.value.length === 0) {
31
- return false;
32
- }
33
- return filter.value.every((filter) => !filterItem(filter, value));
34
- }
35
- case "exist":
36
- return get(value, filter.value) !== undefined;
37
- case "equal": {
38
- if (isArray(filter.value)) {
39
- const item = get(value, filter.field);
40
- if (!isArray(item)) {
41
- return false;
42
- }
43
- if (filter.value.length !== item.length) {
44
- return false;
45
- }
46
- return filter.value.every((value) => item.includes(value));
47
- }
48
- const item = get(value, filter.field);
49
- if (item === filter.value) {
50
- return true;
51
- }
52
- if (("options" in filter && filter.options) ||
53
- ("locale" in filter && filter.locale)) {
54
- return (item !== undefined &&
55
- filter.value.localeCompare(item, filter.locale, filter.options) === 0);
56
- }
57
- return false;
58
- }
59
- case "notEqual": {
60
- const item = get(value, filter.field);
61
- if (item === filter.value) {
62
- return false;
63
- }
64
- if (("options" in filter && filter.options) ||
65
- ("locale" in filter && filter.locale)) {
66
- return (filter.value.localeCompare(get(value, filter.field), filter.locale, filter.options) !== 0);
67
- }
68
- return true;
69
- }
70
- case "children": {
71
- if (filter[SymbolCache] === undefined) {
72
- switch (true) {
73
- case settings?.transformFilterChildren !== undefined:
74
- filter[SymbolCache] = settings.transformFilterChildren(filter);
75
- break;
76
- default: {
77
- const { pathFieldKey = "id", pathFieldSeparator = "/", } = settings || {};
78
- filter[SymbolCache] = filterChildren(filter.value, pathFieldKey, filter.deep, pathFieldSeparator);
79
- }
80
- }
81
- }
82
- return filterItem(filter[SymbolCache], value);
83
- }
84
- case "custom": {
85
- return filter.value(value);
86
- }
87
- case "startWith": {
88
- const item = get(value, filter.field);
89
- if (item === undefined || item.length < filter.value.length) {
90
- return false;
91
- }
92
- if (filter.options !== undefined || filter.locale !== undefined) {
93
- return (filter.value.localeCompare(item.slice(0, filter.value.length), filter.locale, filter.options) !== 0);
94
- }
95
- return item.startsWith(filter.value) ?? false;
96
- }
97
- case "endWith": {
98
- const item = get(value, filter.field);
99
- if (item === undefined || item.length < filter.value.length) {
100
- return false;
101
- }
102
- if (filter.options !== undefined || filter.locale !== undefined) {
103
- return (filter.value.localeCompare(item.slice(-filter.value.length), filter.locale, filter.options) !== 0);
104
- }
105
- return item.endsWith(filter.value) ?? false;
106
- }
107
- case "include": {
108
- const item = get(value, filter.field);
109
- if (item == null) {
110
- return false;
111
- }
112
- if (isArray(filter.value)) {
113
- // FIXME: Get unique values
114
- if (!isArray(item) || item.length < filter.value.length) {
115
- return false;
116
- }
117
- return filter.value.every((value) => item.includes(value));
118
- }
119
- if (isArray(item) || item.length < filter.value.length) {
120
- return false;
121
- }
122
- if (("options" in filter && filter.options) ||
123
- ("locale" in filter && filter.locale)) {
124
- const { length } = filter.value;
125
- const end = item.length - length + 1;
126
- for (let i = 0; i < end; i++) {
127
- if (filter.value.localeCompare(item.slice(i, i + length), filter.locale, filter.options) === 0) {
128
- return true;
129
- }
130
- }
131
- return false;
132
- }
133
- return item.includes?.(filter.value) ?? false;
134
- }
135
- case "greaterThan": {
136
- const item = get(value, filter.field);
137
- if (("options" in filter && filter.options) ||
138
- ("locale" in filter && filter.locale)) {
139
- return (filter.value.localeCompare(item, filter.locale, filter.options) < 0);
140
- }
141
- return item > filter.value;
142
- }
143
- case "greaterThanOrEqual": {
144
- const item = get(value, filter.field);
145
- if (("options" in filter && filter.options) ||
146
- ("locale" in filter && filter.locale)) {
147
- return (filter.value.localeCompare(item, filter.locale, filter.options) <= 0);
148
- }
149
- return item >= filter.value;
150
- }
151
- case "lowerThan": {
152
- const item = get(value, filter.field);
153
- if (("options" in filter && filter.options) ||
154
- ("locale" in filter && filter.locale)) {
155
- return (filter.value.localeCompare(item, filter.locale, filter.options) > 0);
156
- }
157
- return item < filter.value;
158
- }
159
- case "lowerThanOrEqual": {
160
- const item = get(value, filter.field);
161
- if (("options" in filter && filter.options) ||
162
- ("locale" in filter && filter.locale)) {
163
- return (filter.value.localeCompare(item, filter.locale, filter.options) >= 0);
164
- }
165
- return item <= filter.value;
166
- }
167
- case "match": {
168
- const item = get(value, filter.field);
169
- if (item === undefined) {
170
- return false;
171
- }
172
- if (filter[SymbolCache] === undefined) {
173
- filter[SymbolCache] = new RegExp(filter.value, `${filter.options?.ignoreCase ? "i" : ""}${filter.options?.dotAll ? "s" : ""}`);
174
- }
175
- return filter[SymbolCache].test(item);
176
- }
177
- case "intersect": {
178
- const item = get(value, filter.field);
179
- if (item == null) {
180
- return false;
181
- }
182
- if (isArray(item)) {
183
- return (isArray(filter.value) &&
184
- filter.value.some((value) => item.includes(value)));
185
- }
186
- if (("options" in filter && filter.options) ||
187
- ("locale" in filter && filter.locale)) {
188
- return (item !== undefined &&
189
- filter.value.some((value) => value.localeCompare(item, filter.locale, filter.options) === 0));
190
- }
191
- return filter.value.includes(item);
192
- }
193
- default:
194
- throw new Error(`Unknown filter operator '${filter.operator}'`);
195
- }
196
- }
197
- //# sourceMappingURL=filterItem.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"filterItem.js","sourceRoot":"","sources":["../../lib/tools/filterItem.ts"],"names":[],"mappings":"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"}
@@ -1,299 +0,0 @@
1
- import { SymbolCache } from "../constants/SymbolCache.js";
2
- import type { Any, FieldFiltered, Filter } from "../types";
3
- import type { QuerySettings } from "../types/QuerySettings.js";
4
-
5
- import { filterChildren } from "./filterChildren.js";
6
- import { get } from "./get.js";
7
-
8
- const { isArray } = Array;
9
-
10
- /**
11
- * Checks wether the provided `value` matches the `filter` or not.
12
- *
13
- * @param filter The filter to apply.
14
- * @param value The value to check.
15
- * @param settings Optional query settings.
16
- * @returns `true` if the `value` matches the `filter` and `false` otherwise.
17
- */
18
- export function filterItem<T extends object>(
19
- filter: Filter<T> | undefined,
20
- value: T | undefined,
21
- settings?: QuerySettings<T>,
22
- ): boolean {
23
- if (value === undefined) {
24
- return false;
25
- }
26
- if (filter === undefined) {
27
- return true;
28
- }
29
- switch (filter.operator) {
30
- case "all":
31
- return filter.value.every((filter) => filterItem(filter, value));
32
- case "any": {
33
- if (filter.value === undefined || filter.value.length === 0) {
34
- return true;
35
- }
36
- return filter.value.some((filter) => filterItem(filter, value));
37
- }
38
- case "none": {
39
- if (filter.value === undefined || filter.value.length === 0) {
40
- return false;
41
- }
42
- return filter.value.every((filter) => !filterItem(filter, value));
43
- }
44
- case "exist":
45
- return get(value, filter.value) !== undefined;
46
- case "equal": {
47
- if (isArray(filter.value)) {
48
- const item = get(value, filter.field) as Any[] | undefined;
49
- if (!isArray(item)) {
50
- return false;
51
- }
52
- if (filter.value.length !== item.length) {
53
- return false;
54
- }
55
- return filter.value.every((value) => item.includes(value));
56
- }
57
- const item = get(value, filter.field);
58
- if (item === filter.value) {
59
- return true;
60
- }
61
- if (
62
- ("options" in filter && filter.options) ||
63
- ("locale" in filter && filter.locale)
64
- ) {
65
- return (
66
- item !== undefined &&
67
- filter.value.localeCompare(
68
- item as any,
69
- filter.locale,
70
- filter.options,
71
- ) === 0
72
- );
73
- }
74
- return false;
75
- }
76
- case "notEqual": {
77
- const item = get(value, filter.field);
78
- if (item === filter.value) {
79
- return false;
80
- }
81
- if (
82
- ("options" in filter && filter.options) ||
83
- ("locale" in filter && filter.locale)
84
- ) {
85
- return (
86
- filter.value.localeCompare(
87
- get(value, filter.field) as string,
88
- filter.locale,
89
- filter.options,
90
- ) !== 0
91
- );
92
- }
93
- return true;
94
- }
95
- case "children": {
96
- if (filter[SymbolCache] === undefined) {
97
- switch (true) {
98
- case settings?.transformFilterChildren !== undefined:
99
- filter[SymbolCache] = settings.transformFilterChildren(filter);
100
- break;
101
- default: {
102
- const {
103
- pathFieldKey = "id" as FieldFiltered<T, string>,
104
- pathFieldSeparator = "/",
105
- } = settings || {};
106
- filter[SymbolCache] = filterChildren(
107
- filter.value as string,
108
- pathFieldKey,
109
- filter.deep,
110
- pathFieldSeparator,
111
- );
112
- }
113
- }
114
- }
115
- return filterItem(filter[SymbolCache], value);
116
- }
117
- case "custom": {
118
- return filter.value(value);
119
- }
120
- case "startWith": {
121
- const item = get(value, filter.field) as string | undefined;
122
- if (item === undefined || item.length < filter.value.length) {
123
- return false;
124
- }
125
- if (filter.options !== undefined || filter.locale !== undefined) {
126
- return (
127
- filter.value.localeCompare(
128
- item.slice(0, filter.value.length),
129
- filter.locale,
130
- filter.options,
131
- ) !== 0
132
- );
133
- }
134
- return item.startsWith(filter.value) ?? false;
135
- }
136
- case "endWith": {
137
- const item = get(value, filter.field) as string | undefined;
138
- if (item === undefined || item.length < filter.value.length) {
139
- return false;
140
- }
141
- if (filter.options !== undefined || filter.locale !== undefined) {
142
- return (
143
- filter.value.localeCompare(
144
- item.slice(-filter.value.length),
145
- filter.locale,
146
- filter.options,
147
- ) !== 0
148
- );
149
- }
150
- return item.endsWith(filter.value) ?? false;
151
- }
152
- case "include": {
153
- const item = get(value, filter.field) as string | any[];
154
- if (item == null) {
155
- return false;
156
- }
157
- if (isArray(filter.value)) {
158
- // FIXME: Get unique values
159
- if (!isArray(item) || item.length < filter.value.length) {
160
- return false;
161
- }
162
- return filter.value.every((value) => item.includes(value));
163
- }
164
- if (isArray(item) || item.length < filter.value.length) {
165
- return false;
166
- }
167
- if (
168
- ("options" in filter && filter.options) ||
169
- ("locale" in filter && filter.locale)
170
- ) {
171
- const { length } = filter.value;
172
- const end = item.length - length + 1;
173
- for (let i = 0; i < end; i++) {
174
- if (
175
- filter.value.localeCompare(
176
- item.slice(i, i + length),
177
- filter.locale,
178
- filter.options,
179
- ) === 0
180
- ) {
181
- return true;
182
- }
183
- }
184
- return false;
185
- }
186
- return item.includes?.(filter.value) ?? false;
187
- }
188
- case "greaterThan": {
189
- const item = get(value, filter.field);
190
- if (
191
- ("options" in filter && filter.options) ||
192
- ("locale" in filter && filter.locale)
193
- ) {
194
- return (
195
- filter.value.localeCompare(
196
- item as string,
197
- filter.locale,
198
- filter.options,
199
- ) < 0
200
- );
201
- }
202
- return item > filter.value;
203
- }
204
- case "greaterThanOrEqual": {
205
- const item = get(value, filter.field);
206
- if (
207
- ("options" in filter && filter.options) ||
208
- ("locale" in filter && filter.locale)
209
- ) {
210
- return (
211
- filter.value.localeCompare(
212
- item as string,
213
- filter.locale,
214
- filter.options,
215
- ) <= 0
216
- );
217
- }
218
- return item >= filter.value;
219
- }
220
- case "lowerThan": {
221
- const item = get(value, filter.field);
222
- if (
223
- ("options" in filter && filter.options) ||
224
- ("locale" in filter && filter.locale)
225
- ) {
226
- return (
227
- filter.value.localeCompare(
228
- item as string,
229
- filter.locale,
230
- filter.options,
231
- ) > 0
232
- );
233
- }
234
- return item < filter.value;
235
- }
236
- case "lowerThanOrEqual": {
237
- const item = get(value, filter.field);
238
- if (
239
- ("options" in filter && filter.options) ||
240
- ("locale" in filter && filter.locale)
241
- ) {
242
- return (
243
- filter.value.localeCompare(
244
- item as string,
245
- filter.locale,
246
- filter.options,
247
- ) >= 0
248
- );
249
- }
250
- return item <= filter.value;
251
- }
252
- case "match": {
253
- const item = get(value, filter.field) as string | undefined;
254
- if (item === undefined) {
255
- return false;
256
- }
257
- if (filter[SymbolCache] === undefined) {
258
- filter[SymbolCache] = new RegExp(
259
- filter.value,
260
- `${filter.options?.ignoreCase ? "i" : ""}${
261
- filter.options?.dotAll ? "s" : ""
262
- }`,
263
- );
264
- }
265
- return filter[SymbolCache].test(item);
266
- }
267
- case "intersect": {
268
- const item = get(value, filter.field);
269
- if (item == null) {
270
- return false;
271
- }
272
- if (isArray(item)) {
273
- return (
274
- isArray(filter.value) &&
275
- filter.value.some((value) => item.includes(value))
276
- );
277
- }
278
- if (
279
- ("options" in filter && filter.options) ||
280
- ("locale" in filter && filter.locale)
281
- ) {
282
- return (
283
- item !== undefined &&
284
- filter.value.some(
285
- (value) =>
286
- value.localeCompare(
287
- item as string,
288
- filter.locale,
289
- filter.options,
290
- ) === 0,
291
- )
292
- );
293
- }
294
- return filter.value.includes(item as string);
295
- }
296
- default:
297
- throw new Error(`Unknown filter operator '${(filter as any).operator}'`);
298
- }
299
- }