@eienjs/adonisjs-api-query 1.1.1 → 3.0.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.
- package/{LICENSE.md → LICENSE} +1 -1
- package/README.md +166 -2
- package/build/configure.d.ts +2 -2
- package/build/configure.js +10 -0
- package/build/index.d.ts +38 -31
- package/build/index.js +38 -154
- package/build/providers/api_query_provider.d.ts +48 -37
- package/build/providers/api_query_provider.js +26 -27
- package/build/src/allowed_filter.d.ts +44 -36
- package/build/src/allowed_filter.js +135 -0
- package/build/src/allowed_include.d.ts +15 -16
- package/build/src/allowed_include.js +47 -0
- package/build/src/allowed_sort.d.ts +17 -17
- package/build/src/allowed_sort.js +49 -0
- package/build/src/api_query_builder_request.d.ts +55 -30
- package/build/src/api_query_builder_request.js +200 -0
- package/build/src/base_filterable.d.ts +45 -0
- package/build/src/base_filterable.js +172 -0
- package/build/src/bindings/api_query_request.js +13 -0
- package/build/src/bindings/filterable_query.js +51 -0
- package/build/src/bindings/filters_query.js +38 -0
- package/build/src/bindings/includes_query.js +50 -0
- package/build/src/bindings/sorts_query.js +42 -0
- package/build/src/bindings/validation_query.js +27 -0
- package/build/src/decorators/filterable.d.ts +20 -0
- package/build/src/decorators/filterable.js +24 -0
- package/build/src/define_config.d.ts +3 -3
- package/build/src/define_config.js +25 -0
- package/build/src/enums/filter_operator.d.ts +8 -9
- package/build/src/enums/filter_operator.js +11 -0
- package/build/src/enums/sort_direction.d.ts +3 -4
- package/build/src/enums/sort_direction.js +6 -0
- package/build/src/exceptions/allowed_fields_must_be_called_before_allowed_includes.d.ts +5 -5
- package/build/src/exceptions/allowed_fields_must_be_called_before_allowed_includes.js +10 -0
- package/build/src/exceptions/filterable_not_configured.d.ts +5 -0
- package/build/src/exceptions/filterable_not_configured.js +12 -0
- package/build/src/exceptions/invalid_append_query.d.ts +6 -4
- package/build/src/exceptions/invalid_append_query.js +17 -0
- package/build/src/exceptions/invalid_direction.d.ts +3 -3
- package/build/src/exceptions/invalid_direction.js +9 -0
- package/build/src/exceptions/invalid_field_query.d.ts +6 -4
- package/build/src/exceptions/invalid_field_query.js +17 -0
- package/build/src/exceptions/invalid_filter_query.d.ts +6 -6
- package/build/src/exceptions/invalid_filter_query.js +17 -0
- package/build/src/exceptions/invalid_filter_value.d.ts +3 -3
- package/build/src/exceptions/invalid_filter_value.js +8 -0
- package/build/src/exceptions/invalid_include_query.d.ts +6 -6
- package/build/src/exceptions/invalid_include_query.js +21 -0
- package/build/src/exceptions/invalid_query.d.ts +3 -3
- package/build/{chunk-XIRHVLVQ.js → src/exceptions/invalid_query.js} +3 -7
- package/build/src/exceptions/invalid_sort_query.d.ts +6 -6
- package/build/src/exceptions/invalid_sort_query.js +17 -0
- package/build/src/exceptions/unknown_included_fields_query.d.ts +4 -4
- package/build/src/exceptions/unknown_included_fields_query.js +12 -0
- package/build/src/exceptions/vine_not_installed.d.ts +5 -0
- package/build/src/exceptions/vine_not_installed.js +12 -0
- package/build/src/filters/filters_begin_with_strict.d.ts +6 -6
- package/build/src/filters/filters_begin_with_strict.js +8 -0
- package/build/src/filters/filters_callback.d.ts +6 -6
- package/build/src/filters/filters_callback.js +11 -0
- package/build/src/filters/filters_ends_with_strict.d.ts +6 -6
- package/build/src/filters/filters_ends_with_strict.js +8 -0
- package/build/src/filters/filters_exact.d.ts +11 -11
- package/build/src/filters/filters_exact.js +50 -0
- package/build/src/filters/filters_operator.d.ts +13 -13
- package/build/src/filters/filters_operator.js +52 -0
- package/build/src/filters/filters_partial.d.ts +9 -11
- package/build/src/filters/filters_partial.js +37 -0
- package/build/src/filters/filters_scope.d.ts +12 -0
- package/build/src/filters/filters_scope.js +98 -0
- package/build/src/filters/filters_trashed.d.ts +5 -5
- package/build/src/filters/filters_trashed.js +13 -0
- package/build/src/includes/included_callback.d.ts +7 -7
- package/build/src/includes/included_callback.js +11 -0
- package/build/src/includes/included_count.d.ts +4 -4
- package/build/src/includes/included_count.js +11 -0
- package/build/src/includes/included_relationship.d.ts +8 -8
- package/build/src/includes/included_relationship.js +37 -0
- package/build/src/sorts/sorts_callback.d.ts +6 -6
- package/build/src/sorts/sorts_callback.js +11 -0
- package/build/src/sorts/sorts_field.d.ts +4 -4
- package/build/src/sorts/sorts_field.js +7 -0
- package/build/src/utils/helpers.js +14 -0
- package/build/src/validation/schema_builder.d.ts +3 -0
- package/build/src/validation/schema_builder.js +38 -0
- package/build/src/validation/vine_resolver.js +13 -0
- package/build/stubs/main.d.ts +1 -1
- package/build/stubs/main.js +3 -0
- package/build/types.d.ts +116 -0
- package/build/types.js +1 -0
- package/package.json +101 -88
- package/build/api_query_request-QXOB4BN6.js +0 -18
- package/build/api_query_request-QXOB4BN6.js.map +0 -1
- package/build/chunk-3ITWUZL5.js +0 -108
- package/build/chunk-3ITWUZL5.js.map +0 -1
- package/build/chunk-54HNQTDY.js +0 -348
- package/build/chunk-54HNQTDY.js.map +0 -1
- package/build/chunk-IV3B5WO7.js +0 -160
- package/build/chunk-IV3B5WO7.js.map +0 -1
- package/build/chunk-MKQ3HMMA.js +0 -198
- package/build/chunk-MKQ3HMMA.js.map +0 -1
- package/build/chunk-XIRHVLVQ.js.map +0 -1
- package/build/filters_query-LCFH2F2X.js +0 -55
- package/build/filters_query-LCFH2F2X.js.map +0 -1
- package/build/includes_query-PVONWQMC.js +0 -70
- package/build/includes_query-PVONWQMC.js.map +0 -1
- package/build/index.js.map +0 -1
- package/build/metafile-esm.json +0 -1
- package/build/providers/api_query_provider.js.map +0 -1
- package/build/sorts_query-NJTC5UXX.js +0 -63
- package/build/sorts_query-NJTC5UXX.js.map +0 -1
- package/build/src/bindings/api_query_request.d.ts +0 -2
- package/build/src/bindings/filters_query.d.ts +0 -3
- package/build/src/bindings/includes_query.d.ts +0 -3
- package/build/src/bindings/sorts_query.d.ts +0 -3
- package/build/src/types.d.ts +0 -90
- package/build/src/types.js +0 -1
- package/build/src/types.js.map +0 -1
- package/build/src/utils/helpers.d.ts +0 -3
- /package/build/{config.stub → stubs/config.stub} +0 -0
package/build/chunk-54HNQTDY.js
DELETED
|
@@ -1,348 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ApiQueryBuilderRequest,
|
|
3
|
-
substrReplace
|
|
4
|
-
} from "./chunk-MKQ3HMMA.js";
|
|
5
|
-
import {
|
|
6
|
-
InvalidQuery
|
|
7
|
-
} from "./chunk-XIRHVLVQ.js";
|
|
8
|
-
|
|
9
|
-
// src/filters/filters_exact.ts
|
|
10
|
-
import collect from "collect.js";
|
|
11
|
-
var FiltersExact = class {
|
|
12
|
-
constructor(addRelationConstraint = true) {
|
|
13
|
-
this.addRelationConstraint = addRelationConstraint;
|
|
14
|
-
}
|
|
15
|
-
relationConstraints = [];
|
|
16
|
-
handle(query, value, property) {
|
|
17
|
-
if (this.addRelationConstraint && this.isRelationProperty(query, property)) {
|
|
18
|
-
this.withRelationConstraint(query, value, property);
|
|
19
|
-
return;
|
|
20
|
-
}
|
|
21
|
-
if (Array.isArray(value)) {
|
|
22
|
-
void query.whereIn(this.qualifyColumn(query, property), value);
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
if (value === null) {
|
|
26
|
-
void query.whereNull(this.qualifyColumn(query, property));
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
void query.where(this.qualifyColumn(query, property), "=", value);
|
|
30
|
-
}
|
|
31
|
-
qualifyColumn(query, column) {
|
|
32
|
-
if (column.includes(".")) {
|
|
33
|
-
return column;
|
|
34
|
-
}
|
|
35
|
-
return `${query.model.table}.${query.model.$getColumn(column)?.columnName}`;
|
|
36
|
-
}
|
|
37
|
-
isRelationProperty(query, property) {
|
|
38
|
-
if (!property.includes(".")) {
|
|
39
|
-
return false;
|
|
40
|
-
}
|
|
41
|
-
if (this.relationConstraints.includes(property)) {
|
|
42
|
-
return false;
|
|
43
|
-
}
|
|
44
|
-
const firstRelationShip = property.split(".")[0];
|
|
45
|
-
return query.model.$relationsDefinitions.has(firstRelationShip);
|
|
46
|
-
}
|
|
47
|
-
withRelationConstraint(query, value, property) {
|
|
48
|
-
const [relation, relationProperty] = collect(property.split(".")).pipe((parts) => {
|
|
49
|
-
const rProperty = parts.pop();
|
|
50
|
-
const rPath = parts.implode(".");
|
|
51
|
-
return [rPath, rProperty];
|
|
52
|
-
});
|
|
53
|
-
void query.whereHas(relation, (subQuery) => {
|
|
54
|
-
const columnName = this.qualifyColumn(subQuery, relationProperty);
|
|
55
|
-
this.relationConstraints.push(columnName);
|
|
56
|
-
this.handle(subQuery, value, columnName);
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
// src/filters/filters_partial.ts
|
|
62
|
-
var FiltersPartial = class _FiltersPartial extends FiltersExact {
|
|
63
|
-
handle(query, value, property) {
|
|
64
|
-
if (this.addRelationConstraint && this.isRelationProperty(query, property)) {
|
|
65
|
-
this.withRelationConstraint(query, value, property);
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
if (Array.isArray(value)) {
|
|
69
|
-
if (value.filter((item) => item.toString().length > 0).length === 0) {
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
void query.where((subQuery) => {
|
|
73
|
-
for (const partialValue of value.filter((item) => item.toString().length > 0)) {
|
|
74
|
-
const [innerSql, innerBindings] = this.getWhereRawParameters(
|
|
75
|
-
partialValue,
|
|
76
|
-
this.parsePropertyToColumn(subQuery, property)
|
|
77
|
-
);
|
|
78
|
-
void subQuery.orWhereRaw(innerSql, innerBindings);
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
const [sql, bindings] = this.getWhereRawParameters(value, this.parsePropertyToColumn(query, property));
|
|
84
|
-
void query.whereRaw(sql, bindings);
|
|
85
|
-
}
|
|
86
|
-
parsePropertyToColumn(query, property) {
|
|
87
|
-
if (property.includes(".")) {
|
|
88
|
-
return property;
|
|
89
|
-
}
|
|
90
|
-
return query.model.$getColumn(property)?.columnName ?? property;
|
|
91
|
-
}
|
|
92
|
-
getDatabaseDialect(query) {
|
|
93
|
-
return query.client.dialect.name;
|
|
94
|
-
}
|
|
95
|
-
getWhereRawParameters(value, property) {
|
|
96
|
-
const resolvedValue = `${value}`.toLowerCase();
|
|
97
|
-
return [`LOWER(??) LIKE ?`, [property, `%${_FiltersPartial.escapeLike(resolvedValue)}%`]];
|
|
98
|
-
}
|
|
99
|
-
static escapeLike(value) {
|
|
100
|
-
return value.replaceAll("\\", "\\\\").replaceAll("_", String.raw`\\_`).replaceAll("%", String.raw`\\%`);
|
|
101
|
-
}
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
// src/filters/filters_begin_with_strict.ts
|
|
105
|
-
var FiltersBeginWithStrict = class _FiltersBeginWithStrict extends FiltersPartial {
|
|
106
|
-
getWhereRawParameters(value, property) {
|
|
107
|
-
return [`${property} LIKE ?`, [`${_FiltersBeginWithStrict.escapeLike(value.toString())}%`]];
|
|
108
|
-
}
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
// src/filters/filters_callback.ts
|
|
112
|
-
var FiltersCallback = class {
|
|
113
|
-
constructor(callback) {
|
|
114
|
-
this.callback = callback;
|
|
115
|
-
}
|
|
116
|
-
handle(query, value, property) {
|
|
117
|
-
this.callback(query, value, property);
|
|
118
|
-
}
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
// src/filters/filters_ends_with_strict.ts
|
|
122
|
-
var FiltersEndsWithStrict = class _FiltersEndsWithStrict extends FiltersPartial {
|
|
123
|
-
getWhereRawParameters(value, property) {
|
|
124
|
-
return [`${property} LIKE ?`, [`%${_FiltersEndsWithStrict.escapeLike(value.toString())}`]];
|
|
125
|
-
}
|
|
126
|
-
};
|
|
127
|
-
|
|
128
|
-
// src/enums/filter_operator.ts
|
|
129
|
-
var FilterOperator = {
|
|
130
|
-
Dynamic: "",
|
|
131
|
-
Equal: "=",
|
|
132
|
-
LessThan: "<",
|
|
133
|
-
GreaterThan: ">",
|
|
134
|
-
LessThanOrEqual: "<=",
|
|
135
|
-
GreaterThanOrEqual: ">=",
|
|
136
|
-
NotEqual: "<>"
|
|
137
|
-
};
|
|
138
|
-
|
|
139
|
-
// src/filters/filters_operator.ts
|
|
140
|
-
var FiltersOperator = class extends FiltersExact {
|
|
141
|
-
constructor($addRelationConstraint, $filterOperator, $boolean) {
|
|
142
|
-
super($addRelationConstraint);
|
|
143
|
-
this.$addRelationConstraint = $addRelationConstraint;
|
|
144
|
-
this.$filterOperator = $filterOperator;
|
|
145
|
-
this.$boolean = $boolean;
|
|
146
|
-
}
|
|
147
|
-
handle(query, value, property) {
|
|
148
|
-
let filterOperator = this.$filterOperator;
|
|
149
|
-
if (this.$addRelationConstraint && this.isRelationProperty(query, property)) {
|
|
150
|
-
this.withRelationConstraint(query, value, property);
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
if (Array.isArray(value)) {
|
|
154
|
-
const items = value;
|
|
155
|
-
void query.where((subQuery) => {
|
|
156
|
-
for (const item of items) {
|
|
157
|
-
this.handle(subQuery, item, property);
|
|
158
|
-
}
|
|
159
|
-
});
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
if (filterOperator === FilterOperator.Dynamic) {
|
|
163
|
-
filterOperator = this.getDynamicFilterOperator(value.toString());
|
|
164
|
-
value = this.removeDynamicFilterOperatorFromValue(value.toString(), filterOperator);
|
|
165
|
-
}
|
|
166
|
-
if (this.$boolean === "and") {
|
|
167
|
-
void query.where(this.qualifyColumn(query, property), filterOperator, value);
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
170
|
-
void query.orWhere(this.qualifyColumn(query, property), filterOperator, value);
|
|
171
|
-
}
|
|
172
|
-
getDynamicFilterOperator(value) {
|
|
173
|
-
let filterOperator = FilterOperator.Equal;
|
|
174
|
-
for (const filterOperatorCase of Object.values(FilterOperator)) {
|
|
175
|
-
if (value.startsWith(filterOperatorCase) && filterOperatorCase !== FilterOperator.Dynamic) {
|
|
176
|
-
filterOperator = filterOperatorCase;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
return filterOperator;
|
|
180
|
-
}
|
|
181
|
-
removeDynamicFilterOperatorFromValue(value, filterOperator) {
|
|
182
|
-
if (value.includes(filterOperator)) {
|
|
183
|
-
value = substrReplace(value, "", 0, filterOperator.length);
|
|
184
|
-
}
|
|
185
|
-
return value;
|
|
186
|
-
}
|
|
187
|
-
};
|
|
188
|
-
|
|
189
|
-
// src/filters/filters_trashed.ts
|
|
190
|
-
var FiltersTrashed = class {
|
|
191
|
-
handle(query, value, _property) {
|
|
192
|
-
if (!("withTrashed" in query && "onlyTrashed" in query)) {
|
|
193
|
-
return;
|
|
194
|
-
}
|
|
195
|
-
const queryWithSoftDeletes = query;
|
|
196
|
-
if (value === "with") {
|
|
197
|
-
void queryWithSoftDeletes.withTrashed();
|
|
198
|
-
return;
|
|
199
|
-
}
|
|
200
|
-
if (value === "only") {
|
|
201
|
-
void queryWithSoftDeletes.onlyTrashed();
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
};
|
|
205
|
-
|
|
206
|
-
// src/allowed_filter.ts
|
|
207
|
-
import { Collection } from "collect.js";
|
|
208
|
-
var AllowedFilter = class _AllowedFilter {
|
|
209
|
-
static setFilterArrayValueDelimiter(delimiter) {
|
|
210
|
-
if (delimiter) {
|
|
211
|
-
ApiQueryBuilderRequest.setFilterArrayValueDelimiter(delimiter);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
static exact(name, internalName, addRelationConstraint = true, arrayValueDelimiter) {
|
|
215
|
-
this.setFilterArrayValueDelimiter(arrayValueDelimiter);
|
|
216
|
-
return new _AllowedFilter(name, new FiltersExact(addRelationConstraint), internalName);
|
|
217
|
-
}
|
|
218
|
-
static partial(name, internalName, addRelationConstraint = true, arrayValueDelimiter) {
|
|
219
|
-
this.setFilterArrayValueDelimiter(arrayValueDelimiter);
|
|
220
|
-
return new _AllowedFilter(name, new FiltersPartial(addRelationConstraint), internalName);
|
|
221
|
-
}
|
|
222
|
-
static beginsWithStrict(name, internalName, addRelationConstraint = true, arrayValueDelimiter) {
|
|
223
|
-
this.setFilterArrayValueDelimiter(arrayValueDelimiter);
|
|
224
|
-
return new _AllowedFilter(name, new FiltersBeginWithStrict(addRelationConstraint), internalName);
|
|
225
|
-
}
|
|
226
|
-
static endsWithStrict(name, internalName, addRelationConstraint = true, arrayValueDelimiter) {
|
|
227
|
-
this.setFilterArrayValueDelimiter(arrayValueDelimiter);
|
|
228
|
-
return new _AllowedFilter(name, new FiltersEndsWithStrict(addRelationConstraint), internalName);
|
|
229
|
-
}
|
|
230
|
-
static callback(name, callback, internalName, arrayValueDelimiter) {
|
|
231
|
-
this.setFilterArrayValueDelimiter(arrayValueDelimiter);
|
|
232
|
-
return new _AllowedFilter(name, new FiltersCallback(callback), internalName);
|
|
233
|
-
}
|
|
234
|
-
static trashed(name = "trashed", internalName) {
|
|
235
|
-
return new _AllowedFilter(name, new FiltersTrashed(), internalName);
|
|
236
|
-
}
|
|
237
|
-
static custom(name, filterClass, internalName, arrayValueDelimiter) {
|
|
238
|
-
this.setFilterArrayValueDelimiter(arrayValueDelimiter);
|
|
239
|
-
return new _AllowedFilter(name, filterClass, internalName);
|
|
240
|
-
}
|
|
241
|
-
static operator(name, filterOperator, boolean = "and", internalName, addRelationConstraint = true, arrayValueDelimiter) {
|
|
242
|
-
this.setFilterArrayValueDelimiter(arrayValueDelimiter);
|
|
243
|
-
return new _AllowedFilter(
|
|
244
|
-
name,
|
|
245
|
-
new FiltersOperator(addRelationConstraint, filterOperator, boolean),
|
|
246
|
-
internalName
|
|
247
|
-
);
|
|
248
|
-
}
|
|
249
|
-
name;
|
|
250
|
-
filterClass;
|
|
251
|
-
internalName;
|
|
252
|
-
ignored;
|
|
253
|
-
default;
|
|
254
|
-
$hasDefault = false;
|
|
255
|
-
nullable = false;
|
|
256
|
-
constructor(name, filterClass, internalName) {
|
|
257
|
-
this.name = name;
|
|
258
|
-
this.filterClass = filterClass;
|
|
259
|
-
this.ignored = new Collection();
|
|
260
|
-
this.internalName = internalName ?? this.name;
|
|
261
|
-
}
|
|
262
|
-
filter(query, value) {
|
|
263
|
-
const valueToFilter = this.resolveValueForFiltering(value);
|
|
264
|
-
if (!this.nullable && valueToFilter === null) {
|
|
265
|
-
return;
|
|
266
|
-
}
|
|
267
|
-
this.filterClass.handle(query, valueToFilter, this.internalName);
|
|
268
|
-
}
|
|
269
|
-
getFilterClass() {
|
|
270
|
-
return this.filterClass;
|
|
271
|
-
}
|
|
272
|
-
getName() {
|
|
273
|
-
return this.name;
|
|
274
|
-
}
|
|
275
|
-
isForFilter(filterName) {
|
|
276
|
-
return this.name === filterName;
|
|
277
|
-
}
|
|
278
|
-
ignore(...values) {
|
|
279
|
-
this.ignored = this.ignored.merge(values).flatten();
|
|
280
|
-
return this;
|
|
281
|
-
}
|
|
282
|
-
getIgnored() {
|
|
283
|
-
return this.ignored.toArray();
|
|
284
|
-
}
|
|
285
|
-
getInternalName() {
|
|
286
|
-
return this.internalName;
|
|
287
|
-
}
|
|
288
|
-
setDefault(defaultValue) {
|
|
289
|
-
this.default = defaultValue;
|
|
290
|
-
this.$hasDefault = true;
|
|
291
|
-
if (defaultValue === null) {
|
|
292
|
-
this.setNullable(true);
|
|
293
|
-
}
|
|
294
|
-
return this;
|
|
295
|
-
}
|
|
296
|
-
getDefault() {
|
|
297
|
-
return this.default;
|
|
298
|
-
}
|
|
299
|
-
hasDefault() {
|
|
300
|
-
return this.$hasDefault;
|
|
301
|
-
}
|
|
302
|
-
setNullable(nullable = true) {
|
|
303
|
-
this.nullable = nullable;
|
|
304
|
-
return this;
|
|
305
|
-
}
|
|
306
|
-
unsetDefault() {
|
|
307
|
-
this.$hasDefault = false;
|
|
308
|
-
this.default = void 0;
|
|
309
|
-
return this;
|
|
310
|
-
}
|
|
311
|
-
resolveValueForFiltering(value) {
|
|
312
|
-
if (Array.isArray(value)) {
|
|
313
|
-
const remainingProperties = value.map((subValue) => this.resolveValueForFiltering(subValue));
|
|
314
|
-
return remainingProperties.length === 0 ? null : remainingProperties;
|
|
315
|
-
}
|
|
316
|
-
return this.ignored.contains(value) ? null : value;
|
|
317
|
-
}
|
|
318
|
-
};
|
|
319
|
-
|
|
320
|
-
// src/exceptions/invalid_filter_query.ts
|
|
321
|
-
import { ResponseStatus } from "@adonisjs/core/http";
|
|
322
|
-
var InvalidFilterQuery = class _InvalidFilterQuery extends InvalidQuery {
|
|
323
|
-
constructor(unknownFilters, allowedFilters) {
|
|
324
|
-
const notAllowed = unknownFilters.join(", ");
|
|
325
|
-
const allowed = allowedFilters.join(", ");
|
|
326
|
-
const message = `Requested filter(s) \`${notAllowed}\` are not allowed. Allowed filter(s) are \`${allowed}\``;
|
|
327
|
-
super(message, { status: ResponseStatus.BadRequest });
|
|
328
|
-
this.unknownFilters = unknownFilters;
|
|
329
|
-
this.allowedFilters = allowedFilters;
|
|
330
|
-
}
|
|
331
|
-
static filtersNotAllowed(unknownFilters, allowedFilters) {
|
|
332
|
-
return new _InvalidFilterQuery(unknownFilters, allowedFilters);
|
|
333
|
-
}
|
|
334
|
-
};
|
|
335
|
-
|
|
336
|
-
export {
|
|
337
|
-
FiltersExact,
|
|
338
|
-
FiltersPartial,
|
|
339
|
-
FiltersBeginWithStrict,
|
|
340
|
-
FiltersCallback,
|
|
341
|
-
FiltersEndsWithStrict,
|
|
342
|
-
FilterOperator,
|
|
343
|
-
FiltersOperator,
|
|
344
|
-
FiltersTrashed,
|
|
345
|
-
AllowedFilter,
|
|
346
|
-
InvalidFilterQuery
|
|
347
|
-
};
|
|
348
|
-
//# sourceMappingURL=chunk-54HNQTDY.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/filters/filters_exact.ts","../src/filters/filters_partial.ts","../src/filters/filters_begin_with_strict.ts","../src/filters/filters_callback.ts","../src/filters/filters_ends_with_strict.ts","../src/enums/filter_operator.ts","../src/filters/filters_operator.ts","../src/filters/filters_trashed.ts","../src/allowed_filter.ts","../src/exceptions/invalid_filter_query.ts"],"sourcesContent":["import { type LucidModel, type ModelQueryBuilderContract } from '@adonisjs/lucid/types/model';\nimport { type StrictValuesWithoutRaw } from '@adonisjs/lucid/types/querybuilder';\nimport { type ExtractModelRelations } from '@adonisjs/lucid/types/relations';\nimport collect, { type Collection } from 'collect.js';\nimport { type Filter } from '../types.js';\n\nexport class FiltersExact<Model extends LucidModel> implements Filter<Model> {\n protected relationConstraints: string[] = [];\n\n public constructor(protected addRelationConstraint = true) {}\n\n public handle(\n query: ModelQueryBuilderContract<Model, InstanceType<Model>>,\n value: StrictValuesWithoutRaw | null,\n property: string,\n ): void {\n if (this.addRelationConstraint && this.isRelationProperty(query, property)) {\n this.withRelationConstraint(query, value, property);\n\n return;\n }\n\n if (Array.isArray(value)) {\n void query.whereIn(this.qualifyColumn(query, property), value);\n\n return;\n }\n\n if (value === null) {\n void query.whereNull(this.qualifyColumn(query, property));\n\n return;\n }\n\n void query.where(this.qualifyColumn(query, property), '=', value);\n }\n\n protected qualifyColumn(query: ModelQueryBuilderContract<Model, InstanceType<Model>>, column: string): string {\n if (column.includes('.')) {\n return column;\n }\n\n return `${query.model.table}.${query.model.$getColumn(column)?.columnName}`;\n }\n\n protected isRelationProperty(\n query: ModelQueryBuilderContract<Model, InstanceType<Model>>,\n property: string,\n ): boolean {\n if (!property.includes('.')) {\n return false;\n }\n\n if (this.relationConstraints.includes(property)) {\n return false;\n }\n\n const firstRelationShip = property.split('.')[0];\n\n return query.model.$relationsDefinitions.has(firstRelationShip);\n }\n\n protected withRelationConstraint(\n query: ModelQueryBuilderContract<Model, InstanceType<Model>>,\n value: StrictValuesWithoutRaw | null,\n property: string,\n ): void {\n const [relation, relationProperty] = collect(property.split('.')).pipe((parts: Collection<string>) => {\n const rProperty = parts.pop();\n const rPath = parts.implode('.');\n\n return [rPath as ExtractModelRelations<InstanceType<Model>>, rProperty];\n });\n\n void query.whereHas(relation, (subQuery: ModelQueryBuilderContract<Model>) => {\n const columnName = this.qualifyColumn(subQuery, relationProperty);\n this.relationConstraints.push(columnName);\n\n this.handle(subQuery, value, columnName);\n });\n }\n}\n","import { type DialectContract } from '@adonisjs/lucid/types/database';\nimport { type LucidModel, type ModelQueryBuilderContract } from '@adonisjs/lucid/types/model';\nimport { type StrictValuesWithoutRaw } from '@adonisjs/lucid/types/querybuilder';\nimport { type Filter } from '../types.js';\nimport { FiltersExact } from './filters_exact.js';\n\nexport class FiltersPartial<Model extends LucidModel> extends FiltersExact<Model> implements Filter<Model> {\n public handle(\n query: ModelQueryBuilderContract<Model, InstanceType<Model>>,\n value: StrictValuesWithoutRaw | null,\n property: string,\n ): void {\n if (this.addRelationConstraint && this.isRelationProperty(query, property)) {\n this.withRelationConstraint(query, value, property);\n\n return;\n }\n\n if (Array.isArray(value)) {\n if (value.filter((item) => item.toString().length > 0).length === 0) {\n return;\n }\n\n void query.where((subQuery) => {\n for (const partialValue of value.filter((item) => item.toString().length > 0)) {\n const [innerSql, innerBindings] = this.getWhereRawParameters(\n partialValue,\n this.parsePropertyToColumn(subQuery, property),\n );\n void subQuery.orWhereRaw(innerSql, innerBindings);\n }\n });\n\n return;\n }\n\n const [sql, bindings] = this.getWhereRawParameters(value, this.parsePropertyToColumn(query, property));\n void query.whereRaw(sql, bindings);\n }\n\n protected parsePropertyToColumn(\n query: ModelQueryBuilderContract<Model, InstanceType<Model>>,\n property: string,\n ): string {\n if (property.includes('.')) {\n return property;\n }\n\n return query.model.$getColumn(property)?.columnName ?? property;\n }\n\n protected getDatabaseDialect(query: ModelQueryBuilderContract<Model, InstanceType<Model>>): DialectContract['name'] {\n return query.client.dialect.name;\n }\n\n protected getWhereRawParameters(value: StrictValuesWithoutRaw | null, property: string): [string, string[]] {\n const resolvedValue = `${value}`.toLowerCase();\n\n return [`LOWER(??) LIKE ?`, [property, `%${FiltersPartial.escapeLike(resolvedValue)}%`]];\n }\n\n protected static escapeLike(value: string): string {\n return value\n .replaceAll('\\\\', '\\\\\\\\')\n .replaceAll('_', String.raw`\\\\_`)\n .replaceAll('%', String.raw`\\\\%`);\n }\n}\n","import { type LucidModel } from '@adonisjs/lucid/types/model';\nimport { type StrictValuesWithoutRaw } from '@adonisjs/lucid/types/querybuilder';\nimport { type Filter } from '../types.js';\nimport { FiltersPartial } from './filters_partial.js';\n\nexport class FiltersBeginWithStrict<Model extends LucidModel> extends FiltersPartial<Model> implements Filter<Model> {\n protected getWhereRawParameters(value: StrictValuesWithoutRaw, property: string): [string, string[]] {\n return [`${property} LIKE ?`, [`${FiltersBeginWithStrict.escapeLike(value.toString())}%`]];\n }\n}\n","import { type LucidModel, type ModelQueryBuilderContract } from '@adonisjs/lucid/types/model';\nimport { type Filter } from '../types.js';\n\nexport class FiltersCallback<Model extends LucidModel> implements Filter<Model> {\n public constructor(\n private callback: (query: ModelQueryBuilderContract<Model>, value: unknown, property: string) => void,\n ) {}\n\n public handle(query: ModelQueryBuilderContract<Model, InstanceType<Model>>, value: unknown, property: string): void {\n this.callback(query, value, property);\n }\n}\n","import { type LucidModel } from '@adonisjs/lucid/types/model';\nimport { type StrictValuesWithoutRaw } from '@adonisjs/lucid/types/querybuilder';\nimport { type Filter } from '../types.js';\nimport { FiltersPartial } from './filters_partial.js';\n\nexport class FiltersEndsWithStrict<Model extends LucidModel> extends FiltersPartial<Model> implements Filter<Model> {\n protected getWhereRawParameters(value: StrictValuesWithoutRaw, property: string): [string, string[]] {\n return [`${property} LIKE ?`, [`%${FiltersEndsWithStrict.escapeLike(value.toString())}`]];\n }\n}\n","export const FilterOperator = {\n Dynamic: '',\n Equal: '=',\n LessThan: '<',\n GreaterThan: '>',\n LessThanOrEqual: '<=',\n GreaterThanOrEqual: '>=',\n NotEqual: '<>',\n} as const;\n\nexport type FilterOperator = (typeof FilterOperator)[keyof typeof FilterOperator];\n","import { type LucidModel, type ModelQueryBuilderContract } from '@adonisjs/lucid/types/model';\nimport { type StrictValuesWithoutRaw } from '@adonisjs/lucid/types/querybuilder';\nimport { FilterOperator } from '../enums/filter_operator.js';\nimport { type Filter } from '../types.js';\nimport { substrReplace } from '../utils/helpers.js';\nimport { FiltersExact } from './filters_exact.js';\n\nexport class FiltersOperator<Model extends LucidModel> extends FiltersExact<Model> implements Filter<Model> {\n public constructor(\n protected $addRelationConstraint: boolean,\n protected $filterOperator: FilterOperator,\n protected $boolean: 'and' | 'or',\n ) {\n super($addRelationConstraint);\n }\n\n public handle(\n query: ModelQueryBuilderContract<Model, InstanceType<Model>>,\n value: StrictValuesWithoutRaw,\n property: string,\n ): void {\n let filterOperator = this.$filterOperator;\n\n if (this.$addRelationConstraint && this.isRelationProperty(query, property)) {\n this.withRelationConstraint(query, value, property);\n\n return;\n }\n\n if (Array.isArray(value)) {\n const items = value;\n\n void query.where((subQuery) => {\n for (const item of items) {\n this.handle(subQuery, item, property);\n }\n });\n\n return;\n }\n\n if (filterOperator === FilterOperator.Dynamic) {\n filterOperator = this.getDynamicFilterOperator(value.toString());\n value = this.removeDynamicFilterOperatorFromValue(value.toString(), filterOperator);\n }\n\n if (this.$boolean === 'and') {\n void query.where(this.qualifyColumn(query, property), filterOperator, value);\n\n return;\n }\n\n void query.orWhere(this.qualifyColumn(query, property), filterOperator, value);\n }\n\n protected getDynamicFilterOperator(value: string): FilterOperator {\n let filterOperator: FilterOperator = FilterOperator.Equal;\n\n for (const filterOperatorCase of Object.values(FilterOperator)) {\n if (value.startsWith(filterOperatorCase) && filterOperatorCase !== FilterOperator.Dynamic) {\n filterOperator = filterOperatorCase;\n }\n }\n\n return filterOperator;\n }\n\n protected removeDynamicFilterOperatorFromValue(value: string, filterOperator: FilterOperator): string {\n if (value.includes(filterOperator)) {\n value = substrReplace(value, '', 0, filterOperator.length);\n }\n\n return value;\n }\n}\n","import { type LucidModel, type ModelQueryBuilderContract } from '@adonisjs/lucid/types/model';\nimport { type StrictValuesWithoutRaw } from '@adonisjs/lucid/types/querybuilder';\nimport { type Filter } from '../types.js';\n\nexport class FiltersTrashed<Model extends LucidModel> implements Filter<Model> {\n public handle(\n query: ModelQueryBuilderContract<Model, InstanceType<Model>>,\n value: StrictValuesWithoutRaw,\n _property: string,\n ): void {\n if (!('withTrashed' in query && 'onlyTrashed' in query)) {\n return;\n }\n\n const queryWithSoftDeletes = query as {\n withTrashed(): ModelQueryBuilderContract<Model>;\n onlyTrashed(): ModelQueryBuilderContract<Model>;\n };\n\n if (value === 'with') {\n void queryWithSoftDeletes.withTrashed();\n\n return;\n }\n\n if (value === 'only') {\n void queryWithSoftDeletes.onlyTrashed();\n }\n }\n}\n","import { type LucidModel, type ModelAttributes, type ModelQueryBuilderContract } from '@adonisjs/lucid/types/model';\nimport { type StrictValuesWithoutRaw } from '@adonisjs/lucid/types/querybuilder';\nimport { Collection } from 'collect.js';\nimport { ApiQueryBuilderRequest } from './api_query_builder_request.js';\nimport { type FilterOperator } from './enums/filter_operator.js';\nimport { FiltersBeginWithStrict } from './filters/filters_begin_with_strict.js';\nimport { FiltersCallback } from './filters/filters_callback.js';\nimport { FiltersEndsWithStrict } from './filters/filters_ends_with_strict.js';\nimport { FiltersExact } from './filters/filters_exact.js';\nimport { FiltersOperator } from './filters/filters_operator.js';\nimport { FiltersPartial } from './filters/filters_partial.js';\nimport { FiltersTrashed } from './filters/filters_trashed.js';\nimport { type ExtractKeys, type Filter } from './types.js';\n\nexport class AllowedFilter<Model extends LucidModel> {\n public static setFilterArrayValueDelimiter(delimiter?: string): void {\n if (delimiter) {\n ApiQueryBuilderRequest.setFilterArrayValueDelimiter(delimiter);\n }\n }\n\n public static exact<Model extends LucidModel>(\n name: string,\n internalName?: ExtractKeys<ModelAttributes<InstanceType<Model>>>,\n addRelationConstraint = true,\n arrayValueDelimiter?: string,\n ): AllowedFilter<Model> {\n this.setFilterArrayValueDelimiter(arrayValueDelimiter);\n\n return new AllowedFilter<Model>(name, new FiltersExact<Model>(addRelationConstraint), internalName);\n }\n\n public static partial<Model extends LucidModel>(\n name: string,\n internalName?: ExtractKeys<ModelAttributes<InstanceType<Model>>>,\n addRelationConstraint = true,\n arrayValueDelimiter?: string,\n ): AllowedFilter<Model> {\n this.setFilterArrayValueDelimiter(arrayValueDelimiter);\n\n return new AllowedFilter<Model>(name, new FiltersPartial<Model>(addRelationConstraint), internalName);\n }\n\n public static beginsWithStrict<Model extends LucidModel>(\n name: string,\n internalName?: ExtractKeys<ModelAttributes<InstanceType<Model>>>,\n addRelationConstraint = true,\n arrayValueDelimiter?: string,\n ): AllowedFilter<Model> {\n this.setFilterArrayValueDelimiter(arrayValueDelimiter);\n\n return new AllowedFilter<Model>(name, new FiltersBeginWithStrict<Model>(addRelationConstraint), internalName);\n }\n\n public static endsWithStrict<Model extends LucidModel>(\n name: string,\n internalName?: ExtractKeys<ModelAttributes<InstanceType<Model>>>,\n addRelationConstraint = true,\n arrayValueDelimiter?: string,\n ): AllowedFilter<Model> {\n this.setFilterArrayValueDelimiter(arrayValueDelimiter);\n\n return new AllowedFilter<Model>(name, new FiltersEndsWithStrict<Model>(addRelationConstraint), internalName);\n }\n\n public static callback<Model extends LucidModel>(\n name: string,\n callback: (query: ModelQueryBuilderContract<Model>, value: unknown, property: string) => void,\n internalName?: ExtractKeys<ModelAttributes<InstanceType<Model>>>,\n arrayValueDelimiter?: string,\n ): AllowedFilter<Model> {\n this.setFilterArrayValueDelimiter(arrayValueDelimiter);\n\n return new AllowedFilter<Model>(name, new FiltersCallback<Model>(callback), internalName);\n }\n\n public static trashed<Model extends LucidModel>(\n name = 'trashed',\n internalName?: ExtractKeys<ModelAttributes<InstanceType<Model>>>,\n ): AllowedFilter<Model> {\n return new AllowedFilter<Model>(name, new FiltersTrashed<Model>(), internalName);\n }\n\n public static custom<Model extends LucidModel>(\n name: string,\n filterClass: Filter<Model>,\n internalName?: ExtractKeys<ModelAttributes<InstanceType<Model>>>,\n arrayValueDelimiter?: string,\n ): AllowedFilter<Model> {\n this.setFilterArrayValueDelimiter(arrayValueDelimiter);\n\n return new AllowedFilter<Model>(name, filterClass, internalName);\n }\n\n public static operator<Model extends LucidModel>(\n name: string,\n filterOperator: FilterOperator,\n boolean: 'and' | 'or' = 'and',\n internalName?: ExtractKeys<ModelAttributes<InstanceType<Model>>>,\n addRelationConstraint = true,\n arrayValueDelimiter?: string,\n ): AllowedFilter<Model> {\n this.setFilterArrayValueDelimiter(arrayValueDelimiter);\n\n return new AllowedFilter<Model>(\n name,\n new FiltersOperator<Model>(addRelationConstraint, filterOperator, boolean),\n internalName,\n );\n }\n\n protected name: string;\n\n protected filterClass: Filter<Model>;\n\n protected internalName: string;\n\n protected ignored: Collection<unknown>;\n\n protected default: unknown;\n\n protected $hasDefault = false;\n\n protected nullable = false;\n\n public constructor(\n name: string,\n filterClass: Filter<Model>,\n internalName?: ExtractKeys<ModelAttributes<InstanceType<Model>>>,\n ) {\n this.name = name;\n this.filterClass = filterClass;\n this.ignored = new Collection();\n this.internalName = internalName ?? this.name;\n }\n\n public filter(query: ModelQueryBuilderContract<Model>, value: unknown): void {\n const valueToFilter = this.resolveValueForFiltering(value);\n if (!this.nullable && valueToFilter === null) {\n return;\n }\n\n this.filterClass.handle(query, valueToFilter, this.internalName);\n }\n\n public getFilterClass(): Filter<Model> {\n return this.filterClass;\n }\n\n public getName(): string {\n return this.name;\n }\n\n public isForFilter(filterName: string): boolean {\n return this.name === filterName;\n }\n\n public ignore(...values: unknown[]): this {\n this.ignored = this.ignored.merge(values).flatten();\n\n return this;\n }\n\n public getIgnored(): unknown[] {\n return this.ignored.toArray();\n }\n\n public getInternalName(): string {\n return this.internalName;\n }\n\n public setDefault(defaultValue: unknown): this {\n this.default = defaultValue;\n this.$hasDefault = true;\n\n if (defaultValue === null) {\n this.setNullable(true);\n }\n\n return this;\n }\n\n public getDefault(): unknown {\n return this.default;\n }\n\n public hasDefault(): boolean {\n return this.$hasDefault;\n }\n\n public setNullable(nullable = true): this {\n this.nullable = nullable;\n\n return this;\n }\n\n public unsetDefault(): this {\n this.$hasDefault = false;\n this.default = undefined;\n\n return this;\n }\n\n protected resolveValueForFiltering(value: unknown): StrictValuesWithoutRaw | null {\n if (Array.isArray(value)) {\n const remainingProperties = value.map((subValue) => this.resolveValueForFiltering(subValue));\n\n return remainingProperties.length === 0 ? null : (remainingProperties as StrictValuesWithoutRaw);\n }\n\n return this.ignored.contains(value) ? null : (value as StrictValuesWithoutRaw);\n }\n}\n","import { ResponseStatus } from '@adonisjs/core/http';\nimport { InvalidQuery } from './invalid_query.js';\n\nexport class InvalidFilterQuery extends InvalidQuery {\n public constructor(\n public readonly unknownFilters: string[],\n public readonly allowedFilters: string[],\n ) {\n const notAllowed = unknownFilters.join(', ');\n const allowed = allowedFilters.join(', ');\n const message = `Requested filter(s) \\`${notAllowed}\\` are not allowed. Allowed filter(s) are \\`${allowed}\\``;\n\n super(message, { status: ResponseStatus.BadRequest });\n }\n\n public static filtersNotAllowed(unknownFilters: string[], allowedFilters: string[]): InvalidFilterQuery {\n return new InvalidFilterQuery(unknownFilters, allowedFilters);\n }\n}\n"],"mappings":"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","names":[]}
|
package/build/chunk-IV3B5WO7.js
DELETED
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
InvalidQuery
|
|
3
|
-
} from "./chunk-XIRHVLVQ.js";
|
|
4
|
-
|
|
5
|
-
// src/includes/included_callback.ts
|
|
6
|
-
var IncludedCallback = class {
|
|
7
|
-
constructor(callback) {
|
|
8
|
-
this.callback = callback;
|
|
9
|
-
}
|
|
10
|
-
handle(query, include) {
|
|
11
|
-
void query.preload(include, this.callback);
|
|
12
|
-
}
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
// src/includes/included_count.ts
|
|
16
|
-
import app from "@adonisjs/core/services/app";
|
|
17
|
-
var IncludedCount = class {
|
|
18
|
-
handle(query, count) {
|
|
19
|
-
const suffix = app.config.get("apiquery.countSuffix", "Count");
|
|
20
|
-
const relation = count.endsWith(suffix) ? count.slice(0, -suffix.length) : count;
|
|
21
|
-
void query.withCount(relation);
|
|
22
|
-
}
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
// src/includes/included_relationship.ts
|
|
26
|
-
import { Collection } from "collect.js";
|
|
27
|
-
var IncludedRelationship = class {
|
|
28
|
-
static getIndividualRelationshipPathsFromInclude(include) {
|
|
29
|
-
const originalInclude = new Collection(include.split("."));
|
|
30
|
-
return originalInclude.reduce((includes, relationship) => {
|
|
31
|
-
const includesArray = includes ?? new Collection();
|
|
32
|
-
if (includesArray.isEmpty()) {
|
|
33
|
-
return includesArray.push(relationship);
|
|
34
|
-
}
|
|
35
|
-
return includesArray.push(`${includes.last()}.${relationship}`);
|
|
36
|
-
}, new Collection());
|
|
37
|
-
}
|
|
38
|
-
getRequestedFieldsForRelatedTable;
|
|
39
|
-
handle(query, relationship) {
|
|
40
|
-
const relatedTables = relationship.split(".");
|
|
41
|
-
if (relatedTables.length === 0) {
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
44
|
-
const [relation, ...rest] = relatedTables;
|
|
45
|
-
if (!query.model.$hasRelation(relation)) {
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
void query.preload(relation, (subQuery) => {
|
|
49
|
-
if (this.getRequestedFieldsForRelatedTable !== void 0) {
|
|
50
|
-
const fields = this.getRequestedFieldsForRelatedTable(relation);
|
|
51
|
-
if (fields.length > 0) {
|
|
52
|
-
void subQuery.select(fields);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
this.buildNestedQuery(rest, subQuery, relation);
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
buildNestedQuery(relatedTables, subQuery, parent = "") {
|
|
59
|
-
if (relatedTables.length === 0) {
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
const [relation, ...rest] = relatedTables;
|
|
63
|
-
if (!subQuery.model.$hasRelation(relation)) {
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
void subQuery.preload(relation, (nestedQuery) => {
|
|
67
|
-
const fullRelationName = parent === "" ? relation : `${parent}.${relation}`;
|
|
68
|
-
if (this.getRequestedFieldsForRelatedTable !== void 0) {
|
|
69
|
-
const fields = this.getRequestedFieldsForRelatedTable(fullRelationName);
|
|
70
|
-
if (fields.length > 0) {
|
|
71
|
-
void nestedQuery.select(fields);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
this.buildNestedQuery(rest, nestedQuery, fullRelationName);
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
// src/allowed_include.ts
|
|
80
|
-
import app2 from "@adonisjs/core/services/app";
|
|
81
|
-
import { Collection as Collection2 } from "collect.js";
|
|
82
|
-
var AllowedInclude = class _AllowedInclude {
|
|
83
|
-
static relationship(name, internalName) {
|
|
84
|
-
internalName = internalName ?? name;
|
|
85
|
-
return IncludedRelationship.getIndividualRelationshipPathsFromInclude(internalName).zip(IncludedRelationship.getIndividualRelationshipPathsFromInclude(name).toArray()).reduce((includes, args) => {
|
|
86
|
-
const [relationship, alias] = args;
|
|
87
|
-
includes = includes.push(
|
|
88
|
-
new _AllowedInclude(alias, new IncludedRelationship(), relationship)
|
|
89
|
-
);
|
|
90
|
-
if (!relationship.includes(".")) {
|
|
91
|
-
const countSuffix = app2.config.get("apiquery.countSuffix", "Count");
|
|
92
|
-
for (const countAllowedInclude of _AllowedInclude.count(
|
|
93
|
-
`${alias}${countSuffix}`,
|
|
94
|
-
`${relationship}${countSuffix}`
|
|
95
|
-
)) {
|
|
96
|
-
includes = includes.push(countAllowedInclude);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
return includes;
|
|
100
|
-
}, new Collection2());
|
|
101
|
-
}
|
|
102
|
-
static count(name, internalName) {
|
|
103
|
-
return new Collection2([new _AllowedInclude(name, new IncludedCount(), internalName)]);
|
|
104
|
-
}
|
|
105
|
-
static callback(name, callback, internalName) {
|
|
106
|
-
return new Collection2([
|
|
107
|
-
new _AllowedInclude(name, new IncludedCallback(callback), internalName)
|
|
108
|
-
]);
|
|
109
|
-
}
|
|
110
|
-
static custom(name, includeClass, internalName) {
|
|
111
|
-
return new Collection2([new _AllowedInclude(name, includeClass, internalName)]);
|
|
112
|
-
}
|
|
113
|
-
internalName;
|
|
114
|
-
name;
|
|
115
|
-
includeClass;
|
|
116
|
-
constructor(name, includeClass, internalName) {
|
|
117
|
-
this.name = name;
|
|
118
|
-
this.includeClass = includeClass;
|
|
119
|
-
this.internalName = internalName ?? this.name;
|
|
120
|
-
}
|
|
121
|
-
include(query) {
|
|
122
|
-
this.includeClass.handle(query, this.internalName);
|
|
123
|
-
}
|
|
124
|
-
getName() {
|
|
125
|
-
return this.name;
|
|
126
|
-
}
|
|
127
|
-
isForInclude(includeName) {
|
|
128
|
-
return this.name === includeName;
|
|
129
|
-
}
|
|
130
|
-
};
|
|
131
|
-
|
|
132
|
-
// src/exceptions/invalid_include_query.ts
|
|
133
|
-
import { ResponseStatus } from "@adonisjs/core/http";
|
|
134
|
-
var InvalidIncludeQuery = class _InvalidIncludeQuery extends InvalidQuery {
|
|
135
|
-
constructor(unknownIncludes, allowedIncludes) {
|
|
136
|
-
const notAllowed = unknownIncludes.join(", ");
|
|
137
|
-
let message = `Requested include(s) \`${notAllowed}\` are not allowed. `;
|
|
138
|
-
if (allowedIncludes.length > 0) {
|
|
139
|
-
const allowed = allowedIncludes.join(", ");
|
|
140
|
-
message = `${message}Allowed include(s) are \`${allowed}\``;
|
|
141
|
-
} else {
|
|
142
|
-
message = `${message}There are no allowed includes`;
|
|
143
|
-
}
|
|
144
|
-
super(message, { status: ResponseStatus.BadRequest });
|
|
145
|
-
this.unknownIncludes = unknownIncludes;
|
|
146
|
-
this.allowedIncludes = allowedIncludes;
|
|
147
|
-
}
|
|
148
|
-
static includesNotAllowed(unknownIncludes, allowedIncludes) {
|
|
149
|
-
return new _InvalidIncludeQuery(unknownIncludes, allowedIncludes);
|
|
150
|
-
}
|
|
151
|
-
};
|
|
152
|
-
|
|
153
|
-
export {
|
|
154
|
-
IncludedCallback,
|
|
155
|
-
IncludedCount,
|
|
156
|
-
IncludedRelationship,
|
|
157
|
-
AllowedInclude,
|
|
158
|
-
InvalidIncludeQuery
|
|
159
|
-
};
|
|
160
|
-
//# sourceMappingURL=chunk-IV3B5WO7.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/includes/included_callback.ts","../src/includes/included_count.ts","../src/includes/included_relationship.ts","../src/allowed_include.ts","../src/exceptions/invalid_include_query.ts"],"sourcesContent":["import { type LucidModel, type ModelQueryBuilderContract } from '@adonisjs/lucid/types/model';\nimport { type ExtractModelRelations, type ModelRelations } from '@adonisjs/lucid/types/relations';\nimport { type Include } from '../types.js';\n\nexport class IncludedCallback<ParentModel extends LucidModel, RelatedModel extends LucidModel>\n implements Include<ParentModel>\n{\n public constructor(\n public readonly callback: (\n query:\n | ModelRelations<RelatedModel, ParentModel>['builder']\n | ModelRelations<RelatedModel, ParentModel>['subQuery'],\n ) => void,\n ) {}\n\n public handle(query: ModelQueryBuilderContract<ParentModel, InstanceType<ParentModel>>, include: string): void {\n void query.preload(include as ExtractModelRelations<InstanceType<ParentModel>>, this.callback);\n }\n}\n","import app from '@adonisjs/core/services/app';\nimport { type LucidModel, type ModelQueryBuilderContract } from '@adonisjs/lucid/types/model';\nimport { type ExtractModelRelations } from '@adonisjs/lucid/types/relations';\nimport { type Include } from '../types.js';\n\nexport class IncludedCount<ParentModel extends LucidModel> implements Include<ParentModel> {\n public handle(query: ModelQueryBuilderContract<ParentModel, InstanceType<ParentModel>>, count: string): void {\n const suffix = app.config.get<string>('apiquery.countSuffix', 'Count');\n const relation = (count.endsWith(suffix) ? count.slice(0, -suffix.length) : count) as ExtractModelRelations<\n InstanceType<ParentModel>\n >;\n\n void query.withCount(relation);\n }\n}\n","import { type LucidModel, type ModelQueryBuilderContract } from '@adonisjs/lucid/types/model';\nimport { type ExtractModelRelations, type ModelRelations } from '@adonisjs/lucid/types/relations';\nimport { Collection } from 'collect.js';\nimport { type Include } from '../types.js';\n\nexport class IncludedRelationship<ParentModel extends LucidModel> implements Include<ParentModel> {\n public static getIndividualRelationshipPathsFromInclude(include: string): Collection<string> {\n const originalInclude = new Collection(include.split('.'));\n\n return originalInclude.reduce((includes, relationship) => {\n const includesArray = includes ?? new Collection<string>();\n\n if (includesArray.isEmpty()) {\n return includesArray.push(relationship);\n }\n\n return includesArray.push(`${includes!.last()}.${relationship}`);\n }, new Collection<string>()) as Collection<string>;\n }\n\n public getRequestedFieldsForRelatedTable?: (relationship: string) => string[];\n\n public handle(query: ModelQueryBuilderContract<ParentModel, InstanceType<ParentModel>>, relationship: string): void {\n const relatedTables = relationship.split('.');\n\n if (relatedTables.length === 0) {\n return;\n }\n\n const [relation, ...rest] = relatedTables;\n\n if (!query.model.$hasRelation(relation)) {\n return;\n }\n\n void query.preload(relation as ExtractModelRelations<InstanceType<ParentModel>>, (subQuery) => {\n if (this.getRequestedFieldsForRelatedTable !== undefined) {\n const fields = this.getRequestedFieldsForRelatedTable(relation);\n if (fields.length > 0) {\n void subQuery.select(fields);\n }\n }\n\n this.buildNestedQuery(rest, subQuery, relation);\n });\n }\n\n private buildNestedQuery<SubParentModel extends LucidModel, SubRelatedModel extends LucidModel>(\n relatedTables: string[],\n subQuery:\n | ModelRelations<SubRelatedModel, SubParentModel>['builder']\n | ModelRelations<SubRelatedModel, SubParentModel>['subQuery'],\n parent = '',\n ): void {\n if (relatedTables.length === 0) {\n return;\n }\n\n const [relation, ...rest] = relatedTables;\n\n if (!subQuery.model.$hasRelation(relation)) {\n return;\n }\n\n void subQuery.preload(relation as ExtractModelRelations<InstanceType<SubRelatedModel>>, (nestedQuery) => {\n const fullRelationName = parent === '' ? relation : `${parent}.${relation}`;\n if (this.getRequestedFieldsForRelatedTable !== undefined) {\n const fields = this.getRequestedFieldsForRelatedTable(fullRelationName);\n if (fields.length > 0) {\n void nestedQuery.select(fields);\n }\n }\n\n this.buildNestedQuery(rest, nestedQuery, fullRelationName);\n });\n }\n}\n","import app from '@adonisjs/core/services/app';\nimport { type LucidModel, type ModelQueryBuilderContract } from '@adonisjs/lucid/types/model';\nimport { type ModelRelations } from '@adonisjs/lucid/types/relations';\nimport { Collection } from 'collect.js';\nimport { IncludedCallback } from './includes/included_callback.js';\nimport { IncludedCount } from './includes/included_count.js';\nimport { IncludedRelationship } from './includes/included_relationship.js';\nimport { type Include } from './types.js';\n\nexport class AllowedInclude<Model extends LucidModel> {\n public static relationship<ParentModel extends LucidModel>(\n name: string,\n internalName?: string,\n ): Collection<AllowedInclude<ParentModel>> {\n internalName = internalName ?? name;\n\n return IncludedRelationship.getIndividualRelationshipPathsFromInclude(internalName)\n .zip(IncludedRelationship.getIndividualRelationshipPathsFromInclude(name).toArray<string>())\n .reduce((includes, args) => {\n const [relationship, alias] = args;\n\n includes = includes!.push(\n new AllowedInclude<ParentModel>(alias, new IncludedRelationship<ParentModel>(), relationship),\n );\n\n if (!relationship.includes('.')) {\n const countSuffix = app.config.get<string>('apiquery.countSuffix', 'Count');\n for (const countAllowedInclude of AllowedInclude.count(\n `${alias}${countSuffix}`,\n `${relationship}${countSuffix}`,\n )) {\n includes = includes.push(countAllowedInclude);\n }\n }\n\n return includes;\n }, new Collection<AllowedInclude<ParentModel>>()) as Collection<AllowedInclude<ParentModel>>;\n }\n\n public static count<ParentModel extends LucidModel>(\n name: string,\n internalName?: string,\n ): Collection<AllowedInclude<ParentModel>> {\n return new Collection([new AllowedInclude<ParentModel>(name, new IncludedCount<ParentModel>(), internalName)]);\n }\n\n public static callback<ParentModel extends LucidModel, RelatedModel extends LucidModel>(\n name: string,\n callback: (\n query:\n | ModelRelations<RelatedModel, ParentModel>['builder']\n | ModelRelations<RelatedModel, ParentModel>['subQuery'],\n ) => void,\n internalName?: string,\n ): Collection<AllowedInclude<ParentModel>> {\n return new Collection([\n new AllowedInclude<ParentModel>(name, new IncludedCallback<ParentModel, RelatedModel>(callback), internalName),\n ]);\n }\n\n public static custom<ParentModel extends LucidModel>(\n name: string,\n includeClass: Include<ParentModel>,\n internalName?: string,\n ): Collection<AllowedInclude<ParentModel>> {\n return new Collection([new AllowedInclude<ParentModel>(name, includeClass, internalName)]);\n }\n\n protected internalName: string;\n\n protected name: string;\n\n protected includeClass: Include<Model>;\n\n public constructor(name: string, includeClass: Include<Model>, internalName?: string) {\n this.name = name;\n this.includeClass = includeClass;\n this.internalName = internalName ?? this.name;\n }\n\n public include(query: ModelQueryBuilderContract<Model>): void {\n // if ('getRequestedFieldsForRelatedTable' in this.includeClass) {\n // this.includeClass.getRequestedFieldsForRelatedTable = (relationship: string) => {\n // return query.getRequestedFieldsForRelatedTable(relationship);\n // };\n // }\n\n this.includeClass.handle(query, this.internalName);\n }\n\n public getName(): string {\n return this.name;\n }\n\n public isForInclude(includeName: string): boolean {\n return this.name === includeName;\n }\n}\n","import { ResponseStatus } from '@adonisjs/core/http';\nimport { InvalidQuery } from './invalid_query.js';\n\nexport class InvalidIncludeQuery extends InvalidQuery {\n public constructor(\n public readonly unknownIncludes: string[],\n public readonly allowedIncludes: string[],\n ) {\n const notAllowed = unknownIncludes.join(', ');\n let message = `Requested include(s) \\`${notAllowed}\\` are not allowed. `;\n\n if (allowedIncludes.length > 0) {\n const allowed = allowedIncludes.join(', ');\n message = `${message}Allowed include(s) are \\`${allowed}\\``;\n } else {\n message = `${message}There are no allowed includes`;\n }\n\n super(message, { status: ResponseStatus.BadRequest });\n }\n\n public static includesNotAllowed(unknownIncludes: string[], allowedIncludes: string[]): InvalidIncludeQuery {\n return new InvalidIncludeQuery(unknownIncludes, allowedIncludes);\n }\n}\n"],"mappings":"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","names":["app","Collection","app","Collection"]}
|