@eienjs/adonisjs-api-query 1.1.0 → 2.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.
Files changed (105) hide show
  1. package/{LICENSE.md → LICENSE} +1 -1
  2. package/README.md +28 -2
  3. package/build/configure.d.ts +6 -2
  4. package/build/configure.js +11 -0
  5. package/build/index.d.ts +32 -31
  6. package/build/index.js +31 -153
  7. package/build/providers/api_query_provider.d.ts +41 -37
  8. package/build/providers/api_query_provider.js +21 -26
  9. package/build/src/allowed_filter.d.ts +40 -36
  10. package/build/src/allowed_filter.js +113 -0
  11. package/build/src/allowed_include.d.ts +20 -16
  12. package/build/src/allowed_include.js +48 -0
  13. package/build/src/allowed_sort.d.ts +21 -17
  14. package/build/src/allowed_sort.js +50 -0
  15. package/build/src/api_query_builder_request.d.ts +34 -30
  16. package/build/src/api_query_builder_request.js +122 -0
  17. package/build/src/bindings/api_query_request.js +13 -0
  18. package/build/src/bindings/filters_query.js +40 -0
  19. package/build/src/bindings/includes_query.js +51 -0
  20. package/build/src/bindings/sorts_query.js +45 -0
  21. package/build/src/define_config.d.ts +7 -3
  22. package/build/src/define_config.js +25 -0
  23. package/build/src/enums/filter_operator.d.ts +11 -9
  24. package/build/src/enums/filter_operator.js +12 -0
  25. package/build/src/enums/sort_direction.d.ts +6 -4
  26. package/build/src/enums/sort_direction.js +7 -0
  27. package/build/src/exceptions/allowed_fields_must_be_called_before_allowed_includes.d.ts +9 -5
  28. package/build/src/exceptions/allowed_fields_must_be_called_before_allowed_includes.js +11 -0
  29. package/build/src/exceptions/invalid_append_query.d.ts +8 -4
  30. package/build/src/exceptions/invalid_append_query.js +14 -0
  31. package/build/src/exceptions/invalid_direction.d.ts +7 -3
  32. package/build/src/exceptions/invalid_direction.js +10 -0
  33. package/build/src/exceptions/invalid_filter_query.d.ts +10 -6
  34. package/build/src/exceptions/invalid_filter_query.js +18 -0
  35. package/build/src/exceptions/invalid_filter_value.d.ts +7 -3
  36. package/build/src/exceptions/invalid_filter_value.js +9 -0
  37. package/build/src/exceptions/invalid_include_query.d.ts +10 -6
  38. package/build/src/exceptions/invalid_include_query.js +22 -0
  39. package/build/src/exceptions/invalid_query.d.ts +7 -3
  40. package/build/src/exceptions/invalid_query.js +7 -0
  41. package/build/src/exceptions/invalid_sort_query.d.ts +10 -6
  42. package/build/src/exceptions/invalid_sort_query.js +18 -0
  43. package/build/src/exceptions/unknown_included_fields_query.d.ts +8 -4
  44. package/build/src/exceptions/unknown_included_fields_query.js +13 -0
  45. package/build/src/filters/filters_begin_with_strict.d.ts +10 -6
  46. package/build/src/filters/filters_begin_with_strict.js +9 -0
  47. package/build/src/filters/filters_callback.d.ts +10 -6
  48. package/build/src/filters/filters_callback.js +12 -0
  49. package/build/src/filters/filters_ends_with_strict.d.ts +10 -6
  50. package/build/src/filters/filters_ends_with_strict.js +9 -0
  51. package/build/src/filters/filters_exact.d.ts +15 -11
  52. package/build/src/filters/filters_exact.js +47 -0
  53. package/build/src/filters/filters_operator.d.ts +17 -13
  54. package/build/src/filters/filters_operator.js +53 -0
  55. package/build/src/filters/filters_partial.d.ts +15 -11
  56. package/build/src/filters/filters_partial.js +39 -0
  57. package/build/src/filters/filters_trashed.d.ts +9 -5
  58. package/build/src/filters/filters_trashed.js +14 -0
  59. package/build/src/includes/included_callback.d.ts +11 -7
  60. package/build/src/includes/included_callback.js +12 -0
  61. package/build/src/includes/included_count.d.ts +8 -4
  62. package/build/src/includes/included_count.js +11 -0
  63. package/build/src/includes/included_relationship.d.ts +12 -8
  64. package/build/src/includes/included_relationship.js +40 -0
  65. package/build/src/sorts/sorts_callback.d.ts +10 -6
  66. package/build/src/sorts/sorts_callback.js +12 -0
  67. package/build/src/sorts/sorts_field.d.ts +8 -4
  68. package/build/src/sorts/sorts_field.js +8 -0
  69. package/build/src/utils/helpers.js +26 -0
  70. package/build/stubs/main.d.ts +4 -1
  71. package/build/stubs/main.js +4 -0
  72. package/build/types.d.ts +91 -0
  73. package/build/types.js +1 -0
  74. package/package.json +99 -88
  75. package/build/api_query_request-QXOB4BN6.js +0 -18
  76. package/build/api_query_request-QXOB4BN6.js.map +0 -1
  77. package/build/chunk-3ITWUZL5.js +0 -108
  78. package/build/chunk-3ITWUZL5.js.map +0 -1
  79. package/build/chunk-54HNQTDY.js +0 -348
  80. package/build/chunk-54HNQTDY.js.map +0 -1
  81. package/build/chunk-IV3B5WO7.js +0 -160
  82. package/build/chunk-IV3B5WO7.js.map +0 -1
  83. package/build/chunk-MKQ3HMMA.js +0 -198
  84. package/build/chunk-MKQ3HMMA.js.map +0 -1
  85. package/build/chunk-XIRHVLVQ.js +0 -10
  86. package/build/chunk-XIRHVLVQ.js.map +0 -1
  87. package/build/filters_query-LCFH2F2X.js +0 -55
  88. package/build/filters_query-LCFH2F2X.js.map +0 -1
  89. package/build/includes_query-PVONWQMC.js +0 -70
  90. package/build/includes_query-PVONWQMC.js.map +0 -1
  91. package/build/index.js.map +0 -1
  92. package/build/metafile-esm.json +0 -1
  93. package/build/providers/api_query_provider.js.map +0 -1
  94. package/build/sorts_query-NJTC5UXX.js +0 -63
  95. package/build/sorts_query-NJTC5UXX.js.map +0 -1
  96. package/build/src/bindings/api_query_request.d.ts +0 -2
  97. package/build/src/bindings/filters_query.d.ts +0 -3
  98. package/build/src/bindings/includes_query.d.ts +0 -3
  99. package/build/src/bindings/sorts_query.d.ts +0 -3
  100. package/build/src/exceptions/invalid_field_query.d.ts +0 -5
  101. package/build/src/types.d.ts +0 -90
  102. package/build/src/types.js +0 -1
  103. package/build/src/types.js.map +0 -1
  104. package/build/src/utils/helpers.d.ts +0 -3
  105. /package/build/{config.stub → stubs/config.stub} +0 -0
@@ -1,18 +0,0 @@
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
@@ -1 +0,0 @@
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":[]}
@@ -1,108 +0,0 @@
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
- SortsCallback,
104
- SortsField,
105
- AllowedSort,
106
- InvalidSortQuery
107
- };
108
- //# sourceMappingURL=chunk-3ITWUZL5.js.map
@@ -1 +0,0 @@
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":[]}
@@ -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":[]}