@clipboard-health/json-api-nestjs 2.2.26 → 2.2.27

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.
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "@clipboard-health/json-api-nestjs",
3
3
  "description": "TypeScript-friendly utilities for adhering to the JSON:API specification with NestJS.",
4
- "version": "2.2.26",
4
+ "version": "2.2.27",
5
5
  "bugs": "https://github.com/ClipboardHealth/core-utils/issues",
6
6
  "dependencies": {
7
7
  "@clipboard-health/contract-core": "*",
8
8
  "tslib": "2.8.1"
9
9
  },
10
10
  "devDependencies": {
11
- "@clipboard-health/testing-core": "2.2.26",
11
+ "@clipboard-health/testing-core": "2.2.27",
12
12
  "type-fest": "5.4.4",
13
13
  "zod": "3.25.76"
14
14
  },
@@ -4,8 +4,8 @@
4
4
  * We handle the following cases:
5
5
  * 1. For `?filter[age]=10,20`, `value` is `10,20`, which we transform to `{eq: "10,20"}`.
6
6
  * 2. For `?filter[age]=20`, `value` is `20`, which we transform to `{eq: "20"}`.
7
- * 3. For `?filter[age][gt]=10&filter[age]=20`, `value` is `{'20': true, gt: '10'}`, which we
8
- * transform to `{eq: "20", gt: "10"}`.
7
+ * 3. For `?filter[age][gt]=10&filter[age]=20`, `value` may be `[{gt: "10"}, "20"]` or
8
+ * `{"20": true, gt: "10"}`, which we transform to `{eq: "20", gt: "10"}`.
9
9
  * 4. For `?filter[age]=10&filter[age]=20`, `value` is `['10', '20']`, which we transform to `{eq:
10
10
  * "10,20"}`.
11
11
  * 5. For `?filter[age][gt]=5&filter[age]=10&filter[age]=20`, `value` is `{'0': '10', '1': '20', gt:
@@ -7,37 +7,61 @@ exports.queryFilterPreprocessor = queryFilterPreprocessor;
7
7
  * We handle the following cases:
8
8
  * 1. For `?filter[age]=10,20`, `value` is `10,20`, which we transform to `{eq: "10,20"}`.
9
9
  * 2. For `?filter[age]=20`, `value` is `20`, which we transform to `{eq: "20"}`.
10
- * 3. For `?filter[age][gt]=10&filter[age]=20`, `value` is `{'20': true, gt: '10'}`, which we
11
- * transform to `{eq: "20", gt: "10"}`.
10
+ * 3. For `?filter[age][gt]=10&filter[age]=20`, `value` may be `[{gt: "10"}, "20"]` or
11
+ * `{"20": true, gt: "10"}`, which we transform to `{eq: "20", gt: "10"}`.
12
12
  * 4. For `?filter[age]=10&filter[age]=20`, `value` is `['10', '20']`, which we transform to `{eq:
13
13
  * "10,20"}`.
14
14
  * 5. For `?filter[age][gt]=5&filter[age]=10&filter[age]=20`, `value` is `{'0': '10', '1': '20', gt:
15
15
  * '5'}`, which we transform to `{eq: "10,20", gt: "5"}`.
16
16
  */
17
17
  function queryFilterPreprocessor(value) {
18
+ if (Array.isArray(value)) {
19
+ return normalizeArrayFilter(value);
20
+ }
18
21
  if (!isObject(value)) {
19
22
  // Cases 1 and 2.
20
23
  return { eq: String(value) };
21
24
  }
22
- return Object.entries(value).reduce((filter, [key, value]) => {
23
- const boolValue = typeof value === "boolean";
24
- if (/^\d+$/.test(key) || boolValue) {
25
- // Cases 3 and 5.
26
- const eq = boolValue ? key : String(value);
27
- return {
28
- ...filter,
29
- eq: filter["eq"] ? `${filter["eq"]},${eq}` : eq,
30
- };
31
- }
32
- // Case 4 and other cases like `gt`, `lt`, etc.
33
- const stringValue = Array.isArray(value) ? value.join(",") : String(value);
34
- return {
35
- ...filter,
36
- [key]: filter[key] ? `${filter[key]},${stringValue}` : stringValue,
37
- };
38
- }, {});
25
+ return normalizeObjectFilter(value);
39
26
  }
40
27
  function isObject(value) {
41
28
  return value !== null && value !== undefined && typeof value === "object";
42
29
  }
30
+ function appendFilterValue(filter, key, value) {
31
+ return {
32
+ ...filter,
33
+ [key]: filter[key] ? `${filter[key]},${value}` : value,
34
+ };
35
+ }
36
+ function mergeFilters(currentFilter, newFilter) {
37
+ return Object.entries(newFilter).reduce((mergedFilter, [key, value]) => appendFilterValue(mergedFilter, key, value), currentFilter);
38
+ }
39
+ function normalizeArrayFilter(value) {
40
+ return value.reduce((filter, filterValue) => {
41
+ if (Array.isArray(filterValue)) {
42
+ return mergeFilters(filter, normalizeArrayFilter(filterValue));
43
+ }
44
+ if (isObject(filterValue)) {
45
+ return mergeFilters(filter, normalizeObjectFilter(filterValue));
46
+ }
47
+ return appendFilterValue(filter, "eq", String(filterValue));
48
+ }, {});
49
+ }
50
+ function normalizeObjectFilter(value) {
51
+ return Object.entries(value).reduce((filter, [key, filterValue]) => {
52
+ if (typeof filterValue === "boolean") {
53
+ return appendFilterValue(filter, "eq", key);
54
+ }
55
+ if (/^\d+$/.test(key)) {
56
+ if (Array.isArray(filterValue)) {
57
+ return mergeFilters(filter, normalizeArrayFilter(filterValue));
58
+ }
59
+ if (isObject(filterValue)) {
60
+ return mergeFilters(filter, normalizeObjectFilter(filterValue));
61
+ }
62
+ return appendFilterValue(filter, "eq", String(filterValue));
63
+ }
64
+ return appendFilterValue(filter, key, Array.isArray(filterValue) ? filterValue.join(",") : String(filterValue));
65
+ }, {});
66
+ }
43
67
  //# sourceMappingURL=queryFilterPreprocessor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"queryFilterPreprocessor.js","sourceRoot":"","sources":["../../../../../../packages/json-api-nestjs/src/lib/internal/queryFilterPreprocessor.ts"],"names":[],"mappings":";;AAaA,0DAwBC;AArCD;;;;;;;;;;;;GAYG;AACH,SAAgB,uBAAuB,CAAC,KAAc;IACpD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,iBAAiB;QACjB,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAC/B,CAAC;IAED,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAyB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACnF,MAAM,SAAS,GAAG,OAAO,KAAK,KAAK,SAAS,CAAC;QAC7C,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,EAAE,CAAC;YACnC,iBAAiB;YACjB,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC3C,OAAO;gBACL,GAAG,MAAM;gBACT,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE;aAChD,CAAC;QACJ,CAAC;QAED,+CAA+C;QAC/C,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3E,OAAO;YACL,GAAG,MAAM;YACT,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW;SACnE,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;AAC5E,CAAC"}
1
+ {"version":3,"file":"queryFilterPreprocessor.js","sourceRoot":"","sources":["../../../../../../packages/json-api-nestjs/src/lib/internal/queryFilterPreprocessor.ts"],"names":[],"mappings":"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"}