@eienjs/adonisjs-api-query 0.1.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 +21 -0
- package/README.md +43 -0
- package/build/api_query_request-QXOB4BN6.js +18 -0
- package/build/api_query_request-QXOB4BN6.js.map +1 -0
- package/build/chunk-HQN7LHVO.js +106 -0
- package/build/chunk-HQN7LHVO.js.map +1 -0
- package/build/chunk-MKQ3HMMA.js +198 -0
- package/build/chunk-MKQ3HMMA.js.map +1 -0
- package/build/chunk-OS75QJZN.js +159 -0
- package/build/chunk-OS75QJZN.js.map +1 -0
- package/build/chunk-PBQFWYKU.js +349 -0
- package/build/chunk-PBQFWYKU.js.map +1 -0
- package/build/chunk-XIRHVLVQ.js +10 -0
- package/build/chunk-XIRHVLVQ.js.map +1 -0
- package/build/config.stub +82 -0
- package/build/configure.d.ts +2 -0
- package/build/filters_query-ZXNA4X75.js +55 -0
- package/build/filters_query-ZXNA4X75.js.map +1 -0
- package/build/includes_query-2XNHHWJB.js +70 -0
- package/build/includes_query-2XNHHWJB.js.map +1 -0
- package/build/index.d.ts +19 -0
- package/build/index.js +130 -0
- package/build/index.js.map +1 -0
- package/build/metafile-esm.json +1 -0
- package/build/providers/api_query_provider.d.ts +42 -0
- package/build/providers/api_query_provider.js +30 -0
- package/build/providers/api_query_provider.js.map +1 -0
- package/build/sorts_query-LUETK3FD.js +63 -0
- package/build/sorts_query-LUETK3FD.js.map +1 -0
- package/build/src/allowed_filter.d.ts +37 -0
- package/build/src/allowed_include.d.ts +17 -0
- package/build/src/allowed_sort.d.ts +18 -0
- package/build/src/api_query_builder_request.d.ts +31 -0
- package/build/src/bindings/api_query_request.d.ts +2 -0
- package/build/src/bindings/filters_query.d.ts +3 -0
- package/build/src/bindings/includes_query.d.ts +3 -0
- package/build/src/bindings/sorts_query.d.ts +3 -0
- package/build/src/define_config.d.ts +3 -0
- package/build/src/enums/filter_operator.d.ts +10 -0
- package/build/src/enums/sort_direction.d.ts +5 -0
- package/build/src/exceptions/allowed_fields_must_be_called_before_allowed_includes.d.ts +6 -0
- package/build/src/exceptions/invalid_append_query.d.ts +5 -0
- package/build/src/exceptions/invalid_direction.d.ts +4 -0
- package/build/src/exceptions/invalid_field_query.d.ts +5 -0
- package/build/src/exceptions/invalid_filter_query.d.ts +7 -0
- package/build/src/exceptions/invalid_filter_value.d.ts +4 -0
- package/build/src/exceptions/invalid_include_query.d.ts +7 -0
- package/build/src/exceptions/invalid_query.d.ts +4 -0
- package/build/src/exceptions/invalid_sort_query.d.ts +7 -0
- package/build/src/exceptions/unknown_included_fields_query.d.ts +5 -0
- package/build/src/filters/filters_begin_with_strict.d.ts +8 -0
- package/build/src/filters/filters_callback.d.ts +7 -0
- package/build/src/filters/filters_ends_with_strict.d.ts +8 -0
- package/build/src/filters/filters_exact.d.ts +12 -0
- package/build/src/filters/filters_operator.d.ts +14 -0
- package/build/src/filters/filters_partial.d.ts +12 -0
- package/build/src/filters/filters_trashed.d.ts +6 -0
- package/build/src/includes/included_callback.d.ts +8 -0
- package/build/src/includes/included_count.d.ts +5 -0
- package/build/src/includes/included_relationship.d.ts +9 -0
- package/build/src/sorts/sorts_callback.d.ts +7 -0
- package/build/src/sorts/sorts_field.d.ts +5 -0
- package/build/src/types.d.ts +90 -0
- package/build/src/types.js +1 -0
- package/build/src/types.js.map +1 -0
- package/build/src/utils/helpers.d.ts +3 -0
- package/build/stubs/main.d.ts +1 -0
- package/package.json +143 -0
package/LICENSE.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# The MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 - EienJS
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# @eienjs/adonisjs-api-query
|
|
2
|
+
|
|
3
|
+
[![Source Code][badge-source]][source]
|
|
4
|
+
[![Npm Node Version Support][badge-node-version]][node-version]
|
|
5
|
+
[![Latest Version][badge-release]][release]
|
|
6
|
+
[![Software License][badge-license]][license]
|
|
7
|
+
[![Build Status][badge-build]][build]
|
|
8
|
+
[![Total Downloads][badge-downloads]][downloads]
|
|
9
|
+
|
|
10
|
+
<!-- [![Build Status][badge-build]][build] -->
|
|
11
|
+
|
|
12
|
+
> Easily build Lucid queries from API requests
|
|
13
|
+
|
|
14
|
+
## Introduction
|
|
15
|
+
|
|
16
|
+
This package provides a set of macros on `ModelQueryBuilder` to build [Lucid](https://adonisjs.com/docs/lucid) queries from API requests. Inspired by [Spatie's Laravel Query Builder](https://github.com/spatie/laravel-query-builder).
|
|
17
|
+
|
|
18
|
+
## Documentation
|
|
19
|
+
|
|
20
|
+
The documentation is available on [EienJS](https://eienjs.com).
|
|
21
|
+
|
|
22
|
+
## Contributing
|
|
23
|
+
|
|
24
|
+
Contributions are welcome. Please read [CONTRIBUTING][] for more details and remember to check the [CHANGELOG][] file.
|
|
25
|
+
|
|
26
|
+
## Copyright and License
|
|
27
|
+
|
|
28
|
+
The `@eienjs/adonisjs-api-query` library is licensed for use under the MIT License (MIT). Please see [LICENSE][] for more information.
|
|
29
|
+
|
|
30
|
+
[contributing]: https://github.com/eienjs/.github/blob/main/docs/CONTRIBUTING.md
|
|
31
|
+
[changelog]: https://github.com/eienjs/adonisjs-api-query/blob/main/CHANGELOG.md
|
|
32
|
+
[source]: https://github.com/eienjs/adonisjs-api-query
|
|
33
|
+
[node-version]: https://www.npmjs.com/package/@eienjs/adonisjs-api-query
|
|
34
|
+
[release]: https://www.npmjs.com/package/@eienjs/adonisjs-api-query
|
|
35
|
+
[license]: https://github.com/eienjs/adonisjs-api-query/blob/main/LICENSE.md
|
|
36
|
+
[build]: https://github.com/eienjs/adonisjs-api-query/actions/workflows/build.yml?query=branch:main
|
|
37
|
+
[downloads]: https://www.npmjs.com/package/@eienjs/adonisjs-api-query
|
|
38
|
+
[badge-source]: https://img.shields.io/badge/source-eienjs/adonisjs--api--query-blue.svg?logo=github
|
|
39
|
+
[badge-node-version]: https://img.shields.io/node/v/@eienjs/adonisjs-api-query.svg?logo=nodedotjs
|
|
40
|
+
[badge-release]: https://img.shields.io/npm/v/@eienjs/adonisjs-api-query.svg?logo=npm
|
|
41
|
+
[badge-license]: https://img.shields.io/github/license/eienjs/adonisjs-api-query?logo=open-source-initiative
|
|
42
|
+
[badge-build]: https://img.shields.io/github/actions/workflow/status/eienjs/adonisjs-api-query/build.yml?branch=main
|
|
43
|
+
[badge-downloads]: https://img.shields.io/npm/dm/@eienjs/adonisjs-api-query.svg?logo=npm
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ApiQueryBuilderRequest
|
|
3
|
+
} from "./chunk-MKQ3HMMA.js";
|
|
4
|
+
|
|
5
|
+
// src/bindings/api_query_request.ts
|
|
6
|
+
var extendModelQueryBuilderWithRequest = function(builder) {
|
|
7
|
+
builder.macro("withRequest", function(request) {
|
|
8
|
+
this.$queryBuilderRequest = ApiQueryBuilderRequest.fromRequest(request);
|
|
9
|
+
return this;
|
|
10
|
+
});
|
|
11
|
+
builder.getter("$apiQueryBuilderRequest", function() {
|
|
12
|
+
return this.$queryBuilderRequest ?? new ApiQueryBuilderRequest();
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
export {
|
|
16
|
+
extendModelQueryBuilderWithRequest
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=api_query_request-QXOB4BN6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/bindings/api_query_request.ts"],"sourcesContent":["import { type Request } from '@adonisjs/core/http';\nimport { type ModelQueryBuilder } from '@adonisjs/lucid/orm';\nimport { ApiQueryBuilderRequest } from '../api_query_builder_request.js';\n\ntype ModelQueryBuilderWithRequest = ModelQueryBuilder & { $queryBuilderRequest?: ApiQueryBuilderRequest };\n\nexport const extendModelQueryBuilderWithRequest = function (builder: typeof ModelQueryBuilder): void {\n builder.macro('withRequest', function (this: ModelQueryBuilderWithRequest, request: Request) {\n this.$queryBuilderRequest = ApiQueryBuilderRequest.fromRequest(request);\n\n return this;\n });\n\n builder.getter('$apiQueryBuilderRequest', function (this: ModelQueryBuilderWithRequest) {\n return this.$queryBuilderRequest ?? new ApiQueryBuilderRequest();\n });\n};\n"],"mappings":";;;;;AAMO,IAAM,qCAAqC,SAAU,SAAyC;AACnG,UAAQ,MAAM,eAAe,SAA8C,SAAkB;AAC3F,SAAK,uBAAuB,uBAAuB,YAAY,OAAO;AAEtE,WAAO;AAAA,EACT,CAAC;AAED,UAAQ,OAAO,2BAA2B,WAA8C;AACtF,WAAO,KAAK,wBAAwB,IAAI,uBAAuB;AAAA,EACjE,CAAC;AACH;","names":[]}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import {
|
|
2
|
+
InvalidQuery
|
|
3
|
+
} from "./chunk-XIRHVLVQ.js";
|
|
4
|
+
|
|
5
|
+
// src/enums/sort_direction.ts
|
|
6
|
+
var SortDirection = {
|
|
7
|
+
Ascending: "asc",
|
|
8
|
+
Descending: "desc"
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
// src/exceptions/invalid_direction.ts
|
|
12
|
+
import { Exception } from "@adonisjs/core/exceptions";
|
|
13
|
+
var InvalidDirection = class _InvalidDirection extends Exception {
|
|
14
|
+
static make(sort) {
|
|
15
|
+
return new _InvalidDirection(
|
|
16
|
+
`The direction should be either \`${SortDirection.Descending}\` or \`${SortDirection.Ascending}\` ${sort} given`
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
// src/sorts/sorts_callback.ts
|
|
22
|
+
var SortsCallback = class {
|
|
23
|
+
constructor(_callback) {
|
|
24
|
+
this._callback = _callback;
|
|
25
|
+
}
|
|
26
|
+
handle(query, descending, property) {
|
|
27
|
+
this._callback(query, descending, property);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
// src/sorts/sorts_field.ts
|
|
32
|
+
var SortsField = class {
|
|
33
|
+
handle(query, descending, property) {
|
|
34
|
+
void query.orderBy(property, descending ? "desc" : "asc");
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
// src/allowed_sort.ts
|
|
39
|
+
var AllowedSort = class _AllowedSort {
|
|
40
|
+
static parseSortDirection(name) {
|
|
41
|
+
return name.startsWith("-") ? SortDirection.Descending : SortDirection.Ascending;
|
|
42
|
+
}
|
|
43
|
+
static field(name, internalName) {
|
|
44
|
+
return new _AllowedSort(name, new SortsField(), internalName);
|
|
45
|
+
}
|
|
46
|
+
static custom(name, sortClass, internalName) {
|
|
47
|
+
return new _AllowedSort(name, sortClass, internalName);
|
|
48
|
+
}
|
|
49
|
+
static callback(name, callback, internalName) {
|
|
50
|
+
return new _AllowedSort(name, new SortsCallback(callback), internalName);
|
|
51
|
+
}
|
|
52
|
+
defaultDirection;
|
|
53
|
+
internalName;
|
|
54
|
+
name;
|
|
55
|
+
sortClass;
|
|
56
|
+
constructor(name, sortClass, internalName) {
|
|
57
|
+
this.name = name.replace(/^-+/, "");
|
|
58
|
+
this.defaultDirection = _AllowedSort.parseSortDirection(name);
|
|
59
|
+
this.sortClass = sortClass;
|
|
60
|
+
this.internalName = internalName ?? this.name;
|
|
61
|
+
}
|
|
62
|
+
sort(query, descending) {
|
|
63
|
+
descending = descending ?? this.defaultDirection === SortDirection.Descending;
|
|
64
|
+
this.sortClass.handle(query, descending, this.internalName);
|
|
65
|
+
}
|
|
66
|
+
getName() {
|
|
67
|
+
return this.name;
|
|
68
|
+
}
|
|
69
|
+
isSort(sortName) {
|
|
70
|
+
return this.name === sortName;
|
|
71
|
+
}
|
|
72
|
+
getInternalName() {
|
|
73
|
+
return this.internalName;
|
|
74
|
+
}
|
|
75
|
+
setDefaultDirection(defaultDirection) {
|
|
76
|
+
if (![SortDirection.Ascending, SortDirection.Descending].includes(defaultDirection)) {
|
|
77
|
+
throw InvalidDirection.make(defaultDirection);
|
|
78
|
+
}
|
|
79
|
+
this.defaultDirection = defaultDirection;
|
|
80
|
+
return this;
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
// src/exceptions/invalid_sort_query.ts
|
|
85
|
+
import { ResponseStatus } from "@adonisjs/core/http";
|
|
86
|
+
var InvalidSortQuery = class _InvalidSortQuery extends InvalidQuery {
|
|
87
|
+
constructor(unknownSorts, allowedSorts) {
|
|
88
|
+
const notAllowed = unknownSorts.join(", ");
|
|
89
|
+
const allowed = allowedSorts.join(", ");
|
|
90
|
+
const message = `Requested sort(s) \`${notAllowed}\` is not allowed. Allowed sort(s) are \`${allowed}\``;
|
|
91
|
+
super(message, { status: ResponseStatus.BadRequest });
|
|
92
|
+
this.unknownSorts = unknownSorts;
|
|
93
|
+
this.allowedSorts = allowedSorts;
|
|
94
|
+
}
|
|
95
|
+
static sortsNotAllowed(unknownSorts, allowedSorts) {
|
|
96
|
+
return new _InvalidSortQuery(unknownSorts, allowedSorts);
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
export {
|
|
101
|
+
SortDirection,
|
|
102
|
+
InvalidDirection,
|
|
103
|
+
AllowedSort,
|
|
104
|
+
InvalidSortQuery
|
|
105
|
+
};
|
|
106
|
+
//# sourceMappingURL=chunk-HQN7LHVO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/enums/sort_direction.ts","../src/exceptions/invalid_direction.ts","../src/sorts/sorts_callback.ts","../src/sorts/sorts_field.ts","../src/allowed_sort.ts","../src/exceptions/invalid_sort_query.ts"],"sourcesContent":["export const SortDirection = {\n Ascending: 'asc',\n Descending: 'desc',\n} as const;\n\nexport type SortDirection = (typeof SortDirection)[keyof typeof SortDirection];\n","import { Exception } from '@adonisjs/core/exceptions';\nimport { SortDirection } from '../enums/sort_direction.js';\n\nexport class InvalidDirection extends Exception {\n public static make(sort: string): InvalidDirection {\n return new InvalidDirection(\n `The direction should be either \\`${SortDirection.Descending}\\` or \\`${SortDirection.Ascending}\\` ${sort} given`,\n );\n }\n}\n","import { type LucidModel, type ModelQueryBuilderContract } from '@adonisjs/lucid/types/model';\nimport { type Sort } from '../types.js';\n\nexport class SortsCallback<Model extends LucidModel> implements Sort<Model> {\n public constructor(\n private readonly _callback: (\n query: ModelQueryBuilderContract<Model>,\n descending: boolean,\n property: string,\n ) => void,\n ) {}\n\n public handle(query: ModelQueryBuilderContract<Model>, descending: boolean, property: string): void {\n this._callback(query, descending, property);\n }\n}\n","import { type LucidModel, type ModelQueryBuilderContract } from '@adonisjs/lucid/types/model';\nimport { type Sort } from '../types.js';\n\nexport class SortsField<Model extends LucidModel> implements Sort<Model> {\n public handle(query: ModelQueryBuilderContract<Model>, descending: boolean, property: string): void {\n void query.orderBy(property, descending ? 'desc' : 'asc');\n }\n}\n","import { type LucidModel, type ModelAttributes, type ModelQueryBuilderContract } from '@adonisjs/lucid/types/model';\nimport { SortDirection } from './enums/sort_direction.js';\nimport { InvalidDirection } from './exceptions/invalid_direction.js';\nimport { SortsCallback } from './sorts/sorts_callback.js';\nimport { SortsField } from './sorts/sorts_field.js';\nimport { type ExtractKeys, type Sort } from './types.js';\n\nexport class AllowedSort<Model extends LucidModel> {\n public static parseSortDirection(name: string): string {\n return name.startsWith('-') ? SortDirection.Descending : SortDirection.Ascending;\n }\n\n public static field<Model extends LucidModel>(\n name: string,\n internalName?: ExtractKeys<ModelAttributes<InstanceType<Model>>>,\n ): AllowedSort<Model> {\n return new AllowedSort<Model>(name, new SortsField<Model>(), internalName);\n }\n\n public static custom<Model extends LucidModel>(\n name: string,\n sortClass: Sort<Model>,\n internalName?: ExtractKeys<ModelAttributes<InstanceType<Model>>>,\n ): AllowedSort<Model> {\n return new AllowedSort<Model>(name, sortClass, internalName);\n }\n\n public static callback<Model extends LucidModel>(\n name: string,\n callback: (query: ModelQueryBuilderContract<Model>, descending: boolean, property: string) => void,\n internalName?: ExtractKeys<ModelAttributes<InstanceType<Model>>>,\n ): AllowedSort<Model> {\n return new AllowedSort<Model>(name, new SortsCallback<Model>(callback), internalName);\n }\n\n protected defaultDirection: string;\n\n protected internalName: string;\n\n protected name: string;\n\n protected sortClass: Sort<Model>;\n\n public constructor(\n name: string,\n sortClass: Sort<Model>,\n internalName?: ExtractKeys<ModelAttributes<InstanceType<Model>>>,\n ) {\n this.name = name.replace(/^-+/, '');\n this.defaultDirection = AllowedSort.parseSortDirection(name);\n this.sortClass = sortClass;\n this.internalName = internalName ?? this.name;\n }\n\n public sort(query: ModelQueryBuilderContract<Model>, descending?: boolean): void {\n descending = descending ?? this.defaultDirection === SortDirection.Descending;\n\n this.sortClass.handle(query, descending, this.internalName);\n }\n\n public getName(): string {\n return this.name;\n }\n\n public isSort(sortName: string): boolean {\n return this.name === sortName;\n }\n\n public getInternalName(): string {\n return this.internalName;\n }\n\n public setDefaultDirection(defaultDirection: string): this {\n if (!([SortDirection.Ascending, SortDirection.Descending] as string[]).includes(defaultDirection)) {\n throw InvalidDirection.make(defaultDirection);\n }\n\n this.defaultDirection = defaultDirection;\n\n return this;\n }\n}\n","import { ResponseStatus } from '@adonisjs/core/http';\nimport { InvalidQuery } from './invalid_query.js';\n\nexport class InvalidSortQuery extends InvalidQuery {\n public constructor(\n public readonly unknownSorts: string[],\n public readonly allowedSorts: string[],\n ) {\n const notAllowed = unknownSorts.join(', ');\n const allowed = allowedSorts.join(', ');\n const message = `Requested sort(s) \\`${notAllowed}\\` is not allowed. Allowed sort(s) are \\`${allowed}\\``;\n\n super(message, { status: ResponseStatus.BadRequest });\n }\n\n public static sortsNotAllowed(unknownSorts: string[], allowedSorts: string[]): InvalidSortQuery {\n return new InvalidSortQuery(unknownSorts, allowedSorts);\n }\n}\n"],"mappings":";;;;;AAAO,IAAM,gBAAgB;AAAA,EAC3B,WAAW;AAAA,EACX,YAAY;AACd;;;ACHA,SAAS,iBAAiB;AAGnB,IAAM,mBAAN,MAAM,0BAAyB,UAAU;AAAA,EAC9C,OAAc,KAAK,MAAgC;AACjD,WAAO,IAAI;AAAA,MACT,oCAAoC,cAAc,UAAU,WAAW,cAAc,SAAS,MAAM,IAAI;AAAA,IAC1G;AAAA,EACF;AACF;;;ACNO,IAAM,gBAAN,MAAqE;AAAA,EACnE,YACY,WAKjB;AALiB;AAAA,EAKhB;AAAA,EAEI,OAAO,OAAyC,YAAqB,UAAwB;AAClG,SAAK,UAAU,OAAO,YAAY,QAAQ;AAAA,EAC5C;AACF;;;ACZO,IAAM,aAAN,MAAkE;AAAA,EAChE,OAAO,OAAyC,YAAqB,UAAwB;AAClG,SAAK,MAAM,QAAQ,UAAU,aAAa,SAAS,KAAK;AAAA,EAC1D;AACF;;;ACAO,IAAM,cAAN,MAAM,aAAsC;AAAA,EACjD,OAAc,mBAAmB,MAAsB;AACrD,WAAO,KAAK,WAAW,GAAG,IAAI,cAAc,aAAa,cAAc;AAAA,EACzE;AAAA,EAEA,OAAc,MACZ,MACA,cACoB;AACpB,WAAO,IAAI,aAAmB,MAAM,IAAI,WAAkB,GAAG,YAAY;AAAA,EAC3E;AAAA,EAEA,OAAc,OACZ,MACA,WACA,cACoB;AACpB,WAAO,IAAI,aAAmB,MAAM,WAAW,YAAY;AAAA,EAC7D;AAAA,EAEA,OAAc,SACZ,MACA,UACA,cACoB;AACpB,WAAO,IAAI,aAAmB,MAAM,IAAI,cAAqB,QAAQ,GAAG,YAAY;AAAA,EACtF;AAAA,EAEU;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEH,YACL,MACA,WACA,cACA;AACA,SAAK,OAAO,KAAK,QAAQ,OAAO,EAAE;AAClC,SAAK,mBAAmB,aAAY,mBAAmB,IAAI;AAC3D,SAAK,YAAY;AACjB,SAAK,eAAe,gBAAgB,KAAK;AAAA,EAC3C;AAAA,EAEO,KAAK,OAAyC,YAA4B;AAC/E,iBAAa,cAAc,KAAK,qBAAqB,cAAc;AAEnE,SAAK,UAAU,OAAO,OAAO,YAAY,KAAK,YAAY;AAAA,EAC5D;AAAA,EAEO,UAAkB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,OAAO,UAA2B;AACvC,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEO,kBAA0B;AAC/B,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,oBAAoB,kBAAgC;AACzD,QAAI,CAAE,CAAC,cAAc,WAAW,cAAc,UAAU,EAAe,SAAS,gBAAgB,GAAG;AACjG,YAAM,iBAAiB,KAAK,gBAAgB;AAAA,IAC9C;AAEA,SAAK,mBAAmB;AAExB,WAAO;AAAA,EACT;AACF;;;ACjFA,SAAS,sBAAsB;AAGxB,IAAM,mBAAN,MAAM,0BAAyB,aAAa;AAAA,EAC1C,YACW,cACA,cAChB;AACA,UAAM,aAAa,aAAa,KAAK,IAAI;AACzC,UAAM,UAAU,aAAa,KAAK,IAAI;AACtC,UAAM,UAAU,uBAAuB,UAAU,4CAA4C,OAAO;AAEpG,UAAM,SAAS,EAAE,QAAQ,eAAe,WAAW,CAAC;AAPpC;AACA;AAAA,EAOlB;AAAA,EAEA,OAAc,gBAAgB,cAAwB,cAA0C;AAC9F,WAAO,IAAI,kBAAiB,cAAc,YAAY;AAAA,EACxD;AACF;","names":[]}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
// src/api_query_builder_request.ts
|
|
2
|
+
import { HttpContext } from "@adonisjs/core/http";
|
|
3
|
+
import app from "@adonisjs/core/services/app";
|
|
4
|
+
import { Collection } from "collect.js";
|
|
5
|
+
|
|
6
|
+
// src/utils/helpers.ts
|
|
7
|
+
var substrReplace = (str, replace, start, length) => {
|
|
8
|
+
if (start < 0) {
|
|
9
|
+
start += str.length;
|
|
10
|
+
}
|
|
11
|
+
length = length ?? str.length;
|
|
12
|
+
if (length < 0) {
|
|
13
|
+
length = length + str.length - start;
|
|
14
|
+
}
|
|
15
|
+
return [
|
|
16
|
+
str.slice(0, start),
|
|
17
|
+
replace.slice(0, Math.max(0, length)),
|
|
18
|
+
replace.slice(length),
|
|
19
|
+
str.slice(start + length)
|
|
20
|
+
].join("");
|
|
21
|
+
};
|
|
22
|
+
var strBeforeLast = (subject, search) => {
|
|
23
|
+
if (search === "") {
|
|
24
|
+
return subject;
|
|
25
|
+
}
|
|
26
|
+
const pos = subject.lastIndexOf(search);
|
|
27
|
+
if (pos === -1) {
|
|
28
|
+
return subject;
|
|
29
|
+
}
|
|
30
|
+
return subject.slice(0, Math.max(0, pos));
|
|
31
|
+
};
|
|
32
|
+
var strAfterLast = (subject, search) => {
|
|
33
|
+
if (search === "") {
|
|
34
|
+
return subject;
|
|
35
|
+
}
|
|
36
|
+
const pos = subject.lastIndexOf(search);
|
|
37
|
+
if (pos === -1) {
|
|
38
|
+
return subject;
|
|
39
|
+
}
|
|
40
|
+
return subject.slice(pos + search.length);
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
// src/api_query_builder_request.ts
|
|
44
|
+
var ApiQueryBuilderRequest = class _ApiQueryBuilderRequest {
|
|
45
|
+
static includesArrayValueDelimiter = ",";
|
|
46
|
+
static appendsArrayValueDelimiter = ",";
|
|
47
|
+
static fieldsArrayValueDelimiter = ",";
|
|
48
|
+
static sortsArrayValueDelimiter = ",";
|
|
49
|
+
static filterArrayValueDelimiter = ",";
|
|
50
|
+
static setArrayValueDelimiter(delimiter) {
|
|
51
|
+
this.includesArrayValueDelimiter = delimiter;
|
|
52
|
+
this.appendsArrayValueDelimiter = delimiter;
|
|
53
|
+
this.fieldsArrayValueDelimiter = delimiter;
|
|
54
|
+
this.sortsArrayValueDelimiter = delimiter;
|
|
55
|
+
this.filterArrayValueDelimiter = delimiter;
|
|
56
|
+
}
|
|
57
|
+
static setIncludesArrayValueDelimiter(includesArrayValueDelimiter) {
|
|
58
|
+
this.includesArrayValueDelimiter = includesArrayValueDelimiter;
|
|
59
|
+
}
|
|
60
|
+
static setAppendsArrayValueDelimiter(appendsArrayValueDelimiter) {
|
|
61
|
+
this.appendsArrayValueDelimiter = appendsArrayValueDelimiter;
|
|
62
|
+
}
|
|
63
|
+
static setFieldsArrayValueDelimiter(fieldsArrayValueDelimiter) {
|
|
64
|
+
this.fieldsArrayValueDelimiter = fieldsArrayValueDelimiter;
|
|
65
|
+
}
|
|
66
|
+
static setSortsArrayValueDelimiter(sortsArrayValueDelimiter) {
|
|
67
|
+
this.sortsArrayValueDelimiter = sortsArrayValueDelimiter;
|
|
68
|
+
}
|
|
69
|
+
static setFilterArrayValueDelimiter(filterArrayValueDelimiter) {
|
|
70
|
+
this.filterArrayValueDelimiter = filterArrayValueDelimiter;
|
|
71
|
+
}
|
|
72
|
+
static getIncludesArrayValueDelimiter() {
|
|
73
|
+
return this.includesArrayValueDelimiter;
|
|
74
|
+
}
|
|
75
|
+
static getAppendsArrayValueDelimiter() {
|
|
76
|
+
return this.appendsArrayValueDelimiter;
|
|
77
|
+
}
|
|
78
|
+
static getFieldsArrayValueDelimiter() {
|
|
79
|
+
return this.fieldsArrayValueDelimiter;
|
|
80
|
+
}
|
|
81
|
+
static getSortsArrayValueDelimiter() {
|
|
82
|
+
return this.sortsArrayValueDelimiter;
|
|
83
|
+
}
|
|
84
|
+
static getFilterArrayValueDelimiter() {
|
|
85
|
+
return this.filterArrayValueDelimiter;
|
|
86
|
+
}
|
|
87
|
+
static resetDelimiters() {
|
|
88
|
+
this.includesArrayValueDelimiter = ",";
|
|
89
|
+
this.appendsArrayValueDelimiter = ",";
|
|
90
|
+
this.fieldsArrayValueDelimiter = ",";
|
|
91
|
+
this.sortsArrayValueDelimiter = ",";
|
|
92
|
+
this.filterArrayValueDelimiter = ",";
|
|
93
|
+
}
|
|
94
|
+
static fromRequest(request) {
|
|
95
|
+
return new _ApiQueryBuilderRequest(request);
|
|
96
|
+
}
|
|
97
|
+
_request;
|
|
98
|
+
constructor(request) {
|
|
99
|
+
if (!request) {
|
|
100
|
+
const ctx = HttpContext.getOrFail();
|
|
101
|
+
request = ctx.request;
|
|
102
|
+
}
|
|
103
|
+
this._request = request;
|
|
104
|
+
}
|
|
105
|
+
includes() {
|
|
106
|
+
const includeParameterName = app.config.get("apiquery.parameters.include", "include");
|
|
107
|
+
let includeParts = this.getRequestData(includeParameterName, []);
|
|
108
|
+
if (typeof includeParts === "string") {
|
|
109
|
+
includeParts = includeParts.split(_ApiQueryBuilderRequest.getIncludesArrayValueDelimiter());
|
|
110
|
+
}
|
|
111
|
+
return new Collection(includeParts).filter();
|
|
112
|
+
}
|
|
113
|
+
appends() {
|
|
114
|
+
const appendParameterName = app.config.get("apiquery.parameters.append", "append");
|
|
115
|
+
let appendParts = this.getRequestData(appendParameterName, {});
|
|
116
|
+
if (typeof appendParts === "string") {
|
|
117
|
+
appendParts = appendParts.split(_ApiQueryBuilderRequest.getAppendsArrayValueDelimiter());
|
|
118
|
+
}
|
|
119
|
+
return new Collection(appendParts).filter();
|
|
120
|
+
}
|
|
121
|
+
fields() {
|
|
122
|
+
const fieldsParameterName = app.config.get("apiquery.parameters.fields", "fields");
|
|
123
|
+
const fieldsData = this.getRequestData(fieldsParameterName, {});
|
|
124
|
+
const fieldsPerTable = new Collection(
|
|
125
|
+
typeof fieldsData === "string" ? fieldsData.split(_ApiQueryBuilderRequest.getFieldsArrayValueDelimiter()) : fieldsData
|
|
126
|
+
);
|
|
127
|
+
if (fieldsPerTable.isEmpty()) {
|
|
128
|
+
return new Collection();
|
|
129
|
+
}
|
|
130
|
+
const fields = {};
|
|
131
|
+
fieldsPerTable.each((tableFields, model) => {
|
|
132
|
+
if (!model || typeof model === "number") {
|
|
133
|
+
model = typeof tableFields === "string" && tableFields.includes(".") ? strBeforeLast(tableFields, ".") : "_";
|
|
134
|
+
}
|
|
135
|
+
if (!fields[model]) {
|
|
136
|
+
fields[model] = [];
|
|
137
|
+
}
|
|
138
|
+
if (typeof tableFields === "string") {
|
|
139
|
+
tableFields = tableFields.split(_ApiQueryBuilderRequest.getFieldsArrayValueDelimiter()).map((field) => {
|
|
140
|
+
return strAfterLast(field, ".");
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
fields[model] = [...fields[model], ...tableFields];
|
|
144
|
+
});
|
|
145
|
+
return new Collection(fields);
|
|
146
|
+
}
|
|
147
|
+
sorts() {
|
|
148
|
+
const sortParameterName = app.config.get("apiquery.parameters.sort", "sort");
|
|
149
|
+
let sortParts = this.getRequestData(sortParameterName, []);
|
|
150
|
+
if (typeof sortParts === "string") {
|
|
151
|
+
sortParts = sortParts.split(_ApiQueryBuilderRequest.getSortsArrayValueDelimiter());
|
|
152
|
+
}
|
|
153
|
+
return new Collection(sortParts).filter();
|
|
154
|
+
}
|
|
155
|
+
filters() {
|
|
156
|
+
const filterParameterName = app.config.get("apiquery.parameters.filter", "filter");
|
|
157
|
+
const filterParts = this.getRequestData(filterParameterName, []);
|
|
158
|
+
if (typeof filterParts === "string") {
|
|
159
|
+
return new Collection();
|
|
160
|
+
}
|
|
161
|
+
const filters = new Collection(filterParts);
|
|
162
|
+
return filters.map((value) => {
|
|
163
|
+
return this.getFilterValue(value);
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
getFilterValue(value) {
|
|
167
|
+
if (value === void 0 || value === null) {
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
if (value === "" || Array.isArray(value) && value.length === 0 || typeof value === "object" && Object.keys(value).length === 0) {
|
|
171
|
+
return typeof value === "object" ? [] : value;
|
|
172
|
+
}
|
|
173
|
+
if (Array.isArray(value) || typeof value === "object") {
|
|
174
|
+
return new Collection(value).map((valueValue) => {
|
|
175
|
+
return this.getFilterValue(valueValue);
|
|
176
|
+
}).all();
|
|
177
|
+
}
|
|
178
|
+
if (typeof value === "string" && value.includes(_ApiQueryBuilderRequest.getFilterArrayValueDelimiter())) {
|
|
179
|
+
return value.split(_ApiQueryBuilderRequest.getFilterArrayValueDelimiter());
|
|
180
|
+
}
|
|
181
|
+
if (value === "true") {
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
if (value === "false") {
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
return value;
|
|
188
|
+
}
|
|
189
|
+
getRequestData(key, defaultValue) {
|
|
190
|
+
return this._request.input(key, defaultValue);
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
export {
|
|
195
|
+
substrReplace,
|
|
196
|
+
ApiQueryBuilderRequest
|
|
197
|
+
};
|
|
198
|
+
//# sourceMappingURL=chunk-MKQ3HMMA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/api_query_builder_request.ts","../src/utils/helpers.ts"],"sourcesContent":["import { HttpContext, type Request } from '@adonisjs/core/http';\nimport app from '@adonisjs/core/services/app';\nimport { Collection } from 'collect.js';\nimport { strAfterLast, strBeforeLast } from './utils/helpers.js';\n\nexport class ApiQueryBuilderRequest {\n protected static includesArrayValueDelimiter = ',';\n\n protected static appendsArrayValueDelimiter = ',';\n\n protected static fieldsArrayValueDelimiter = ',';\n\n protected static sortsArrayValueDelimiter = ',';\n\n protected static filterArrayValueDelimiter = ',';\n\n public static setArrayValueDelimiter(delimiter: string): void {\n this.includesArrayValueDelimiter = delimiter;\n this.appendsArrayValueDelimiter = delimiter;\n this.fieldsArrayValueDelimiter = delimiter;\n this.sortsArrayValueDelimiter = delimiter;\n this.filterArrayValueDelimiter = delimiter;\n }\n\n public static setIncludesArrayValueDelimiter(includesArrayValueDelimiter: string): void {\n this.includesArrayValueDelimiter = includesArrayValueDelimiter;\n }\n\n public static setAppendsArrayValueDelimiter(appendsArrayValueDelimiter: string): void {\n this.appendsArrayValueDelimiter = appendsArrayValueDelimiter;\n }\n\n public static setFieldsArrayValueDelimiter(fieldsArrayValueDelimiter: string): void {\n this.fieldsArrayValueDelimiter = fieldsArrayValueDelimiter;\n }\n\n public static setSortsArrayValueDelimiter(sortsArrayValueDelimiter: string): void {\n this.sortsArrayValueDelimiter = sortsArrayValueDelimiter;\n }\n\n public static setFilterArrayValueDelimiter(filterArrayValueDelimiter: string): void {\n this.filterArrayValueDelimiter = filterArrayValueDelimiter;\n }\n\n public static getIncludesArrayValueDelimiter(): string {\n return this.includesArrayValueDelimiter;\n }\n\n public static getAppendsArrayValueDelimiter(): string {\n return this.appendsArrayValueDelimiter;\n }\n\n public static getFieldsArrayValueDelimiter(): string {\n return this.fieldsArrayValueDelimiter;\n }\n\n public static getSortsArrayValueDelimiter(): string {\n return this.sortsArrayValueDelimiter;\n }\n\n public static getFilterArrayValueDelimiter(): string {\n return this.filterArrayValueDelimiter;\n }\n\n public static resetDelimiters(): void {\n this.includesArrayValueDelimiter = ',';\n this.appendsArrayValueDelimiter = ',';\n this.fieldsArrayValueDelimiter = ',';\n this.sortsArrayValueDelimiter = ',';\n this.filterArrayValueDelimiter = ',';\n }\n\n public static fromRequest(request: Request): ApiQueryBuilderRequest {\n return new ApiQueryBuilderRequest(request);\n }\n\n private readonly _request: Request;\n\n public constructor(request?: Request) {\n if (!request) {\n const ctx = HttpContext.getOrFail();\n request = ctx.request;\n }\n\n this._request = request;\n }\n\n public includes(): Collection<string> {\n const includeParameterName = app.config.get<string>('apiquery.parameters.include', 'include');\n let includeParts = this.getRequestData<string[] | string>(includeParameterName, []);\n\n if (typeof includeParts === 'string') {\n includeParts = includeParts.split(ApiQueryBuilderRequest.getIncludesArrayValueDelimiter());\n }\n\n return new Collection(includeParts).filter();\n }\n\n public appends(): Collection<unknown> {\n const appendParameterName = app.config.get<string>('apiquery.parameters.append', 'append');\n\n let appendParts = this.getRequestData(appendParameterName, {});\n\n if (typeof appendParts === 'string') {\n appendParts = appendParts.split(ApiQueryBuilderRequest.getAppendsArrayValueDelimiter());\n }\n\n return new Collection(appendParts).filter();\n }\n\n public fields(): Collection<unknown> {\n const fieldsParameterName = app.config.get<string>('apiquery.parameters.fields', 'fields');\n const fieldsData = this.getRequestData(fieldsParameterName, {});\n const fieldsPerTable = new Collection(\n typeof fieldsData === 'string'\n ? fieldsData.split(ApiQueryBuilderRequest.getFieldsArrayValueDelimiter())\n : fieldsData,\n );\n\n if (fieldsPerTable.isEmpty()) {\n return new Collection();\n }\n\n const fields: Record<string, unknown> = {};\n fieldsPerTable.each((tableFields, model) => {\n if (!model || typeof model === 'number') {\n model = typeof tableFields === 'string' && tableFields.includes('.') ? strBeforeLast(tableFields, '.') : '_';\n }\n\n if (!fields[model]) {\n fields[model] = [];\n }\n\n if (typeof tableFields === 'string') {\n tableFields = tableFields.split(ApiQueryBuilderRequest.getFieldsArrayValueDelimiter()).map((field) => {\n return strAfterLast(field, '.');\n });\n }\n\n fields[model] = [...(fields[model] as string[]), ...(tableFields as string[])];\n });\n\n return new Collection(fields);\n }\n\n public sorts(): Collection<string> {\n const sortParameterName = app.config.get<string>('apiquery.parameters.sort', 'sort');\n\n let sortParts = this.getRequestData<string[] | string>(sortParameterName, []);\n\n if (typeof sortParts === 'string') {\n sortParts = sortParts.split(ApiQueryBuilderRequest.getSortsArrayValueDelimiter());\n }\n\n return new Collection<string>(sortParts).filter();\n }\n\n public filters(): Collection<unknown> {\n const filterParameterName = app.config.get<string>('apiquery.parameters.filter', 'filter');\n\n const filterParts = this.getRequestData(filterParameterName, []);\n\n if (typeof filterParts === 'string') {\n return new Collection();\n }\n\n const filters = new Collection(filterParts);\n\n return filters.map((value) => {\n return this.getFilterValue(value);\n });\n }\n\n protected getFilterValue(value: unknown): unknown {\n if (value === undefined || value === null) {\n return null;\n }\n\n if (\n value === '' ||\n (Array.isArray(value) && value.length === 0) ||\n (typeof value === 'object' && Object.keys(value).length === 0)\n ) {\n return typeof value === 'object' ? [] : value;\n }\n\n if (Array.isArray(value) || typeof value === 'object') {\n return new Collection(value)\n .map((valueValue) => {\n return this.getFilterValue(valueValue);\n })\n .all();\n }\n\n if (typeof value === 'string' && value.includes(ApiQueryBuilderRequest.getFilterArrayValueDelimiter())) {\n return value.split(ApiQueryBuilderRequest.getFilterArrayValueDelimiter());\n }\n\n if (value === 'true') {\n return true;\n }\n\n if (value === 'false') {\n return false;\n }\n\n return value;\n }\n\n protected getRequestData<T = unknown>(key: string, defaultValue?: T): T {\n return this._request.input(key, defaultValue) as T;\n }\n}\n","export const substrReplace = (str: string, replace: string, start: number, length?: number): string => {\n if (start < 0) {\n start += str.length;\n }\n\n length = length ?? str.length;\n if (length < 0) {\n length = length + str.length - start;\n }\n\n return [\n str.slice(0, start),\n replace.slice(0, Math.max(0, length)),\n replace.slice(length),\n str.slice(start + length),\n ].join('');\n};\n\nexport const strBeforeLast = (subject: string, search: string): string => {\n if (search === '') {\n return subject;\n }\n\n const pos = subject.lastIndexOf(search);\n\n if (pos === -1) {\n return subject;\n }\n\n return subject.slice(0, Math.max(0, pos));\n};\n\nexport const strAfterLast = (subject: string, search: string): string => {\n if (search === '') {\n return subject;\n }\n\n const pos = subject.lastIndexOf(search);\n\n if (pos === -1) {\n return subject;\n }\n\n return subject.slice(pos + search.length);\n};\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import {
|
|
2
|
+
InvalidQuery
|
|
3
|
+
} from "./chunk-XIRHVLVQ.js";
|
|
4
|
+
|
|
5
|
+
// src/allowed_include.ts
|
|
6
|
+
import app2 from "@adonisjs/core/services/app";
|
|
7
|
+
import { Collection as Collection2 } from "collect.js";
|
|
8
|
+
|
|
9
|
+
// src/includes/included_callback.ts
|
|
10
|
+
var IncludedCallback = class {
|
|
11
|
+
constructor(callback) {
|
|
12
|
+
this.callback = callback;
|
|
13
|
+
}
|
|
14
|
+
handle(query, include) {
|
|
15
|
+
void query.preload(include, this.callback);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
// src/includes/included_count.ts
|
|
20
|
+
import app from "@adonisjs/core/services/app";
|
|
21
|
+
var IncludedCount = class {
|
|
22
|
+
handle(query, count) {
|
|
23
|
+
const suffix = app.config.get("apiquery.countSuffix", "Count");
|
|
24
|
+
const relation = count.endsWith(suffix) ? count.slice(0, -suffix.length) : count;
|
|
25
|
+
void query.withCount(relation);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
// src/includes/included_relationship.ts
|
|
30
|
+
import { Collection } from "collect.js";
|
|
31
|
+
var IncludedRelationship = class {
|
|
32
|
+
static getIndividualRelationshipPathsFromInclude(include) {
|
|
33
|
+
const originalInclude = new Collection(include.split("."));
|
|
34
|
+
return originalInclude.reduce((includes, relationship) => {
|
|
35
|
+
const includesArray = includes ?? new Collection();
|
|
36
|
+
if (includesArray.isEmpty()) {
|
|
37
|
+
return includesArray.push(relationship);
|
|
38
|
+
}
|
|
39
|
+
return includesArray.push(`${includes.last()}.${relationship}`);
|
|
40
|
+
}, new Collection());
|
|
41
|
+
}
|
|
42
|
+
getRequestedFieldsForRelatedTable;
|
|
43
|
+
handle(query, relationship) {
|
|
44
|
+
const relatedTables = relationship.split(".");
|
|
45
|
+
if (relatedTables.length === 0) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const [relation, ...rest] = relatedTables;
|
|
49
|
+
if (!query.model.$hasRelation(relation)) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
void query.preload(relation, (subQuery) => {
|
|
53
|
+
if (this.getRequestedFieldsForRelatedTable !== void 0) {
|
|
54
|
+
const fields = this.getRequestedFieldsForRelatedTable(relation);
|
|
55
|
+
if (fields.length > 0) {
|
|
56
|
+
void subQuery.select(fields);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
this.buildNestedQuery(rest, subQuery, relation);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
buildNestedQuery(relatedTables, subQuery, parent = "") {
|
|
63
|
+
if (relatedTables.length === 0) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const [relation, ...rest] = relatedTables;
|
|
67
|
+
if (!subQuery.model.$hasRelation(relation)) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
void subQuery.preload(relation, (nestedQuery) => {
|
|
71
|
+
const fullRelationName = parent === "" ? relation : `${parent}.${relation}`;
|
|
72
|
+
if (this.getRequestedFieldsForRelatedTable !== void 0) {
|
|
73
|
+
const fields = this.getRequestedFieldsForRelatedTable(fullRelationName);
|
|
74
|
+
if (fields.length > 0) {
|
|
75
|
+
void nestedQuery.select(fields);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
this.buildNestedQuery(rest, nestedQuery, fullRelationName);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
// src/allowed_include.ts
|
|
84
|
+
var AllowedInclude = class _AllowedInclude {
|
|
85
|
+
static relationship(name, internalName) {
|
|
86
|
+
internalName = internalName ?? name;
|
|
87
|
+
return IncludedRelationship.getIndividualRelationshipPathsFromInclude(internalName).zip(IncludedRelationship.getIndividualRelationshipPathsFromInclude(name).toArray()).reduce((includes, args) => {
|
|
88
|
+
const [relationship, alias] = args;
|
|
89
|
+
includes = includes.push(
|
|
90
|
+
new _AllowedInclude(alias, new IncludedRelationship(), relationship)
|
|
91
|
+
);
|
|
92
|
+
if (!relationship.includes(".")) {
|
|
93
|
+
const countSuffix = app2.config.get("apiquery.countSuffix", "Count");
|
|
94
|
+
for (const countAllowedInclude of _AllowedInclude.count(
|
|
95
|
+
`${alias}${countSuffix}`,
|
|
96
|
+
`${relationship}${countSuffix}`
|
|
97
|
+
)) {
|
|
98
|
+
includes = includes.push(countAllowedInclude);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return includes;
|
|
102
|
+
}, new Collection2());
|
|
103
|
+
}
|
|
104
|
+
static count(name, internalName) {
|
|
105
|
+
return new Collection2([new _AllowedInclude(name, new IncludedCount(), internalName)]);
|
|
106
|
+
}
|
|
107
|
+
static callback(name, callback, internalName) {
|
|
108
|
+
return new Collection2([
|
|
109
|
+
new _AllowedInclude(name, new IncludedCallback(callback), internalName)
|
|
110
|
+
]);
|
|
111
|
+
}
|
|
112
|
+
static custom(name, includeClass, internalName) {
|
|
113
|
+
return new Collection2([new _AllowedInclude(name, includeClass, internalName)]);
|
|
114
|
+
}
|
|
115
|
+
internalName;
|
|
116
|
+
name;
|
|
117
|
+
includeClass;
|
|
118
|
+
constructor(name, includeClass, internalName) {
|
|
119
|
+
this.name = name;
|
|
120
|
+
this.includeClass = includeClass;
|
|
121
|
+
this.internalName = internalName ?? this.name;
|
|
122
|
+
}
|
|
123
|
+
include(query) {
|
|
124
|
+
this.includeClass.handle(query, this.internalName);
|
|
125
|
+
}
|
|
126
|
+
getName() {
|
|
127
|
+
return this.name;
|
|
128
|
+
}
|
|
129
|
+
isForInclude(includeName) {
|
|
130
|
+
return this.name === includeName;
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
// src/exceptions/invalid_include_query.ts
|
|
135
|
+
import { ResponseStatus } from "@adonisjs/core/http";
|
|
136
|
+
var InvalidIncludeQuery = class _InvalidIncludeQuery extends InvalidQuery {
|
|
137
|
+
constructor(unknownIncludes, allowedIncludes) {
|
|
138
|
+
const notAllowed = unknownIncludes.join(", ");
|
|
139
|
+
let message = `Requested include(s) \`${notAllowed}\` are not allowed. `;
|
|
140
|
+
if (allowedIncludes.length > 0) {
|
|
141
|
+
const allowed = allowedIncludes.join(", ");
|
|
142
|
+
message = `${message}Allowed include(s) are \`${allowed}\``;
|
|
143
|
+
} else {
|
|
144
|
+
message = `${message}There are no allowed includes`;
|
|
145
|
+
}
|
|
146
|
+
super(message, { status: ResponseStatus.BadRequest });
|
|
147
|
+
this.unknownIncludes = unknownIncludes;
|
|
148
|
+
this.allowedIncludes = allowedIncludes;
|
|
149
|
+
}
|
|
150
|
+
static includesNotAllowed(unknownIncludes, allowedIncludes) {
|
|
151
|
+
return new _InvalidIncludeQuery(unknownIncludes, allowedIncludes);
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
export {
|
|
156
|
+
AllowedInclude,
|
|
157
|
+
InvalidIncludeQuery
|
|
158
|
+
};
|
|
159
|
+
//# sourceMappingURL=chunk-OS75QJZN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/allowed_include.ts","../src/includes/included_callback.ts","../src/includes/included_count.ts","../src/includes/included_relationship.ts","../src/exceptions/invalid_include_query.ts"],"sourcesContent":["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 { 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 { 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"]}
|