feathers-utils 6.0.0 → 7.0.1

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 (59) hide show
  1. package/README.md +3 -4
  2. package/dist/index.cjs +81 -99
  3. package/dist/index.d.cts +35 -33
  4. package/dist/index.d.mts +35 -33
  5. package/dist/index.d.ts +35 -33
  6. package/dist/index.mjs +81 -99
  7. package/package.json +29 -32
  8. package/src/.DS_Store +0 -0
  9. package/src/filters/array.ts +11 -13
  10. package/src/filters/index.ts +2 -2
  11. package/src/filters/object.ts +11 -11
  12. package/src/hooks/.DS_Store +0 -0
  13. package/src/hooks/checkMulti.ts +98 -82
  14. package/src/hooks/createRelated.ts +41 -41
  15. package/src/hooks/forEach.ts +32 -32
  16. package/src/hooks/from-client-for-server/common.ts +1 -1
  17. package/src/hooks/from-client-for-server/index.ts +2 -2
  18. package/src/hooks/from-client-for-server/paramsForServer.ts +32 -32
  19. package/src/hooks/from-client-for-server/paramsFromClient.ts +25 -25
  20. package/src/hooks/index.ts +9 -9
  21. package/src/hooks/onDelete.ts +54 -55
  22. package/src/hooks/parseFields.ts +13 -13
  23. package/src/hooks/removeRelated.ts +22 -20
  24. package/src/hooks/runPerItem.ts +17 -18
  25. package/src/hooks/setData.ts +295 -264
  26. package/src/index.ts +6 -6
  27. package/src/mixins/debounce-mixin/DebouncedStore.ts +29 -29
  28. package/src/mixins/debounce-mixin/debounceMixin.ts +17 -17
  29. package/src/mixins/debounce-mixin/index.ts +3 -3
  30. package/src/mixins/debounce-mixin/types.ts +9 -9
  31. package/src/mixins/debounce-mixin/utils.ts +3 -3
  32. package/src/mixins/index.ts +1 -1
  33. package/src/types.ts +3 -5
  34. package/src/typesInternal.ts +14 -14
  35. package/src/utility-types/index.ts +48 -48
  36. package/src/utils/_utils.internal.ts +5 -5
  37. package/src/utils/defineHooks.ts +8 -8
  38. package/src/utils/deflattenQuery.ts +31 -31
  39. package/src/utils/filterQuery.ts +58 -58
  40. package/src/utils/flattenQuery.ts +54 -54
  41. package/src/utils/getItemsIsArray.ts +148 -149
  42. package/src/utils/getPaginate.ts +31 -31
  43. package/src/utils/index.ts +17 -17
  44. package/src/utils/isMulti.ts +48 -40
  45. package/src/utils/isPaginated.ts +30 -30
  46. package/src/utils/markHookForSkip.ts +177 -178
  47. package/src/utils/mergeQuery/index.ts +3 -3
  48. package/src/utils/mergeQuery/mergeArrays.ts +67 -67
  49. package/src/utils/mergeQuery/mergeQuery.ts +211 -211
  50. package/src/utils/mergeQuery/types.ts +12 -12
  51. package/src/utils/mergeQuery/utils.ts +224 -224
  52. package/src/utils/optimizeBatchPatch.ts +42 -42
  53. package/src/utils/pushSet.ts +57 -57
  54. package/src/utils/setQueryKeySafely.ts +68 -68
  55. package/src/utils/setResultEmpty.ts +125 -123
  56. package/src/utils/shouldSkip.ts +72 -72
  57. package/src/utils/toJSON.ts +4 -4
  58. package/src/utils/validateQueryProperty.ts +10 -10
  59. package/src/hooks/makeSequelizeQuery.ts_ +0 -90
@@ -1,12 +1,12 @@
1
- import type { Query } from "@feathersjs/feathers";
1
+ import type { Query } from '@feathersjs/feathers'
2
2
 
3
3
  type FilterQueryResult<Q extends Query = Query> = {
4
- $select: Q["$select"] extends any ? Q["$select"] : never;
5
- $limit: Q["$limit"] extends any ? Q["$limit"] : never;
6
- $skip: Q["$skip"] extends any ? Q["$skip"] : never;
7
- $sort: Q["$sort"] extends any ? Q["$sort"] : never;
8
- query: Omit<Q, "$select" | "$limit" | "$skip" | "$sort">;
9
- };
4
+ $select: Q['$select'] extends any ? Q['$select'] : never
5
+ $limit: Q['$limit'] extends any ? Q['$limit'] : never
6
+ $skip: Q['$skip'] extends any ? Q['$skip'] : never
7
+ $sort: Q['$sort'] extends any ? Q['$sort'] : never
8
+ query: Omit<Q, '$select' | '$limit' | '$skip' | '$sort'>
9
+ }
10
10
 
11
11
  /**
12
12
  * Extracts $select, $limit, $skip, $sort from a query and returns the rest as a query object.
@@ -17,61 +17,61 @@ type FilterQueryResult<Q extends Query = Query> = {
17
17
  export function filterQuery<Q extends Query>(
18
18
  providedQuery?: Q,
19
19
  ): FilterQueryResult<Q> {
20
- providedQuery ??= {} as Q;
21
- const { $select, $limit, $skip, $sort, ...query } = providedQuery;
20
+ providedQuery ??= {} as Q
21
+ const { $select, $limit, $skip, $sort, ...query } = providedQuery
22
22
 
23
- const result: FilterQueryResult<Q> = { query } as any;
23
+ const result: FilterQueryResult<Q> = { query } as any
24
24
 
25
- if ("$select" in providedQuery) {
26
- result.$select = $select;
25
+ if ('$select' in providedQuery) {
26
+ result.$select = $select
27
27
  }
28
28
 
29
- if ("$limit" in providedQuery) {
30
- result.$limit = $limit;
29
+ if ('$limit' in providedQuery) {
30
+ result.$limit = $limit
31
31
  }
32
32
 
33
- if ("$skip" in providedQuery) {
34
- result.$skip = $skip;
33
+ if ('$skip' in providedQuery) {
34
+ result.$skip = $skip
35
35
  }
36
36
 
37
- if ("$sort" in providedQuery) {
38
- result.$sort = $sort;
37
+ if ('$sort' in providedQuery) {
38
+ result.$sort = $sort
39
39
  }
40
40
 
41
- return result;
41
+ return result
42
42
  }
43
43
 
44
44
  export function reassembleQuery(query: FilterQueryResult): Query {
45
- const { $select, $limit, $skip, $sort, query: rest } = query;
45
+ const { $select, $limit, $skip, $sort, query: rest } = query
46
46
 
47
- const result: Query = rest;
47
+ const result: Query = rest
48
48
 
49
49
  if ($select !== undefined) {
50
- result.$select = $select;
50
+ result.$select = $select
51
51
  }
52
52
 
53
53
  if ($limit !== undefined) {
54
- result.$limit = $limit;
54
+ result.$limit = $limit
55
55
  }
56
56
 
57
57
  if ($skip !== undefined) {
58
- result.$skip = $skip;
58
+ result.$skip = $skip
59
59
  }
60
60
 
61
61
  if ($sort !== undefined) {
62
- result.$sort = $sort;
62
+ result.$sort = $sort
63
63
  }
64
64
 
65
- return result;
65
+ return result
66
66
  }
67
67
 
68
68
  if (import.meta.vitest) {
69
- const { describe, it, expect } = import.meta.vitest;
69
+ const { describe, it, expect } = import.meta.vitest
70
70
 
71
- describe("filterQuery", () => {
72
- it("should filter query", () => {
71
+ describe('filterQuery', () => {
72
+ it('should filter query', () => {
73
73
  const query = {
74
- $select: ["a"],
74
+ $select: ['a'],
75
75
  $limit: 10,
76
76
  $skip: 10,
77
77
  $sort: {
@@ -79,10 +79,10 @@ if (import.meta.vitest) {
79
79
  },
80
80
  a: 1,
81
81
  b: 2,
82
- };
82
+ }
83
83
 
84
84
  expect(filterQuery(query)).toEqual({
85
- $select: ["a"],
85
+ $select: ['a'],
86
86
  $limit: 10,
87
87
  $skip: 10,
88
88
  $sort: {
@@ -92,42 +92,42 @@ if (import.meta.vitest) {
92
92
  a: 1,
93
93
  b: 2,
94
94
  },
95
- });
96
- });
95
+ })
96
+ })
97
97
 
98
- it("should not include filters if not provided", () => {
98
+ it('should not include filters if not provided', () => {
99
99
  const query = {
100
100
  a: 1,
101
101
  b: 2,
102
- };
102
+ }
103
103
 
104
104
  expect(filterQuery(query)).toEqual({
105
105
  query: {
106
106
  a: 1,
107
107
  b: 2,
108
108
  },
109
- });
110
- });
109
+ })
110
+ })
111
111
 
112
- it("sets empty query object if empty object is provided", () => {
112
+ it('sets empty query object if empty object is provided', () => {
113
113
  expect(filterQuery({})).toEqual({
114
114
  query: {},
115
- });
116
- });
115
+ })
116
+ })
117
117
 
118
- it("sets empty query object if undefined is provided", () => {
118
+ it('sets empty query object if undefined is provided', () => {
119
119
  expect(filterQuery(undefined)).toEqual({
120
120
  query: {},
121
- });
122
- });
123
- });
121
+ })
122
+ })
123
+ })
124
124
 
125
- describe("reassembleQuery", () => {
126
- it("should filter query", () => {
125
+ describe('reassembleQuery', () => {
126
+ it('should filter query', () => {
127
127
  expect(
128
128
  reassembleQuery(
129
129
  filterQuery({
130
- $select: ["a"],
130
+ $select: ['a'],
131
131
  $limit: 10,
132
132
  $skip: 10,
133
133
  $sort: {
@@ -138,7 +138,7 @@ if (import.meta.vitest) {
138
138
  }),
139
139
  ),
140
140
  ).toEqual({
141
- $select: ["a"],
141
+ $select: ['a'],
142
142
  $limit: 10,
143
143
  $skip: 10,
144
144
  $sort: {
@@ -146,10 +146,10 @@ if (import.meta.vitest) {
146
146
  },
147
147
  a: 1,
148
148
  b: 2,
149
- });
150
- });
149
+ })
150
+ })
151
151
 
152
- it("should not include filters if not provided", () => {
152
+ it('should not include filters if not provided', () => {
153
153
  expect(
154
154
  reassembleQuery(
155
155
  filterQuery({
@@ -160,11 +160,11 @@ if (import.meta.vitest) {
160
160
  ).toEqual({
161
161
  a: 1,
162
162
  b: 2,
163
- });
164
- });
163
+ })
164
+ })
165
165
 
166
- it("sets empty query object if empty object is provided", () => {
167
- expect(reassembleQuery(filterQuery({}))).toEqual({});
168
- });
169
- });
166
+ it('sets empty query object if empty object is provided', () => {
167
+ expect(reassembleQuery(filterQuery({}))).toEqual({})
168
+ })
169
+ })
170
170
  }
@@ -1,63 +1,63 @@
1
- import type { Query } from "@feathersjs/feathers";
2
- import { filterQuery, reassembleQuery } from "./filterQuery";
3
- import _set from "lodash/set.js";
4
- import { isObject } from "./_utils.internal";
1
+ import type { Query } from '@feathersjs/feathers'
2
+ import { filterQuery, reassembleQuery } from './filterQuery.js'
3
+ import _set from 'lodash/set.js'
4
+ import { isObject } from './_utils.internal.js'
5
5
 
6
- export function flattenQuery(q: Query) {
6
+ export function flattenQuery(q: Query): Query {
7
7
  if (Array.isArray(q)) {
8
- return q.map(flattenQuery);
8
+ return q.map(flattenQuery)
9
9
  }
10
10
 
11
11
  if (!isObject(q)) {
12
- return q;
12
+ return q
13
13
  }
14
14
 
15
- const { query, $limit, $select, $skip, $sort } = filterQuery(q);
15
+ const { query, $limit, $select, $skip, $sort } = filterQuery(q)
16
16
 
17
17
  type StepOptions = {
18
- prev?: string[];
19
- result?: Query;
20
- };
18
+ prev?: string[]
19
+ result?: Query
20
+ }
21
21
 
22
- const res = {};
22
+ const res = {}
23
23
 
24
24
  function step(object: Query, options?: StepOptions) {
25
- const { prev = [], result = res } = options ?? {};
25
+ const { prev = [], result = res } = options ?? {}
26
26
 
27
27
  Object.keys(object).forEach((key) => {
28
- const value = object[key];
28
+ const value = object[key]
29
29
  if (Array.isArray(value)) {
30
30
  const newValues = value.map((v) =>
31
31
  step(v, {
32
32
  result: {},
33
33
  }),
34
- );
35
- _set(result, [...prev, key], newValues);
36
- return;
34
+ )
35
+ _set(result, [...prev, key], newValues)
36
+ return
37
37
  }
38
38
 
39
- if (key.startsWith("$")) {
40
- _set(result, [...prev, key], value);
41
- return;
39
+ if (key.startsWith('$')) {
40
+ _set(result, [...prev, key], value)
41
+ return
42
42
  }
43
43
 
44
44
  const newKey = !prev.length
45
45
  ? [key]
46
- : [...prev.slice(0, -1), `${prev[prev.length - 1]}.${key}`];
46
+ : [...prev.slice(0, -1), `${prev[prev.length - 1]}.${key}`]
47
47
 
48
48
  if (!isObject(value)) {
49
- _set(result, newKey, value);
50
- return;
49
+ _set(result, newKey, value)
50
+ return
51
51
  } else {
52
52
  step(value, {
53
53
  prev: newKey,
54
54
  result,
55
- });
56
- return;
55
+ })
56
+ return
57
57
  }
58
- });
58
+ })
59
59
 
60
- return result;
60
+ return result
61
61
  }
62
62
 
63
63
  return reassembleQuery({
@@ -66,14 +66,14 @@ export function flattenQuery(q: Query) {
66
66
  $skip,
67
67
  $sort,
68
68
  query: step(query),
69
- });
69
+ })
70
70
  }
71
71
 
72
72
  if (import.meta.vitest) {
73
- const { describe, it, expect } = import.meta.vitest;
73
+ const { describe, it, expect } = import.meta.vitest
74
74
 
75
- describe("flattenQuery", () => {
76
- it("should flatten a query", () => {
75
+ describe('flattenQuery', () => {
76
+ it('should flatten a query', () => {
77
77
  expect(
78
78
  flattenQuery({
79
79
  a: 1,
@@ -89,14 +89,14 @@ if (import.meta.vitest) {
89
89
  }),
90
90
  ).toEqual({
91
91
  a: 1,
92
- "b.c": 1,
93
- "b.d": 1,
94
- "e.f.g": 1,
95
- });
96
- });
97
- });
98
-
99
- it("should handle operators", () => {
92
+ 'b.c': 1,
93
+ 'b.d': 1,
94
+ 'e.f.g': 1,
95
+ })
96
+ })
97
+ })
98
+
99
+ it('should handle operators', () => {
100
100
  expect(
101
101
  flattenQuery({
102
102
  a: {
@@ -108,15 +108,15 @@ if (import.meta.vitest) {
108
108
  },
109
109
  }),
110
110
  ).toEqual({
111
- "a.b": 1,
111
+ 'a.b': 1,
112
112
  c: {
113
113
  $gt: 1,
114
114
  $lte: 1,
115
115
  },
116
- });
117
- });
116
+ })
117
+ })
118
118
 
119
- it("should handle $or / $and", () => {
119
+ it('should handle $or / $and', () => {
120
120
  expect(
121
121
  flattenQuery({
122
122
  a: {
@@ -138,21 +138,21 @@ if (import.meta.vitest) {
138
138
  ],
139
139
  }),
140
140
  ).toEqual({
141
- "a.b": 1,
141
+ 'a.b': 1,
142
142
  $and: [
143
143
  {
144
- "c.d": 1,
144
+ 'c.d': 1,
145
145
  },
146
146
  ],
147
147
  $or: [
148
148
  {
149
- "e.f": 1,
149
+ 'e.f': 1,
150
150
  },
151
151
  ],
152
- });
153
- });
152
+ })
153
+ })
154
154
 
155
- it("should handle nested $or / $and with operators", () => {
155
+ it('should handle nested $or / $and with operators', () => {
156
156
  expect(
157
157
  flattenQuery({
158
158
  a: {
@@ -178,21 +178,21 @@ if (import.meta.vitest) {
178
178
  ],
179
179
  }),
180
180
  ).toEqual({
181
- "a.b": 1,
181
+ 'a.b': 1,
182
182
  $and: [
183
183
  {
184
184
  $or: [
185
185
  {
186
- "c1.d1": 1,
186
+ 'c1.d1': 1,
187
187
  },
188
188
  {
189
- "c2.d2": {
189
+ 'c2.d2': {
190
190
  $gt: 1,
191
191
  },
192
192
  },
193
193
  ],
194
194
  },
195
195
  ],
196
- });
197
- });
196
+ })
197
+ })
198
198
  }