@eienjs/adonisjs-api-query 1.1.1 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/{LICENSE.md → LICENSE} +1 -1
  2. package/README.md +166 -2
  3. package/build/configure.d.ts +2 -2
  4. package/build/configure.js +10 -0
  5. package/build/index.d.ts +38 -31
  6. package/build/index.js +38 -154
  7. package/build/providers/api_query_provider.d.ts +48 -37
  8. package/build/providers/api_query_provider.js +26 -27
  9. package/build/src/allowed_filter.d.ts +44 -36
  10. package/build/src/allowed_filter.js +135 -0
  11. package/build/src/allowed_include.d.ts +15 -16
  12. package/build/src/allowed_include.js +47 -0
  13. package/build/src/allowed_sort.d.ts +17 -17
  14. package/build/src/allowed_sort.js +49 -0
  15. package/build/src/api_query_builder_request.d.ts +55 -30
  16. package/build/src/api_query_builder_request.js +200 -0
  17. package/build/src/base_filterable.d.ts +45 -0
  18. package/build/src/base_filterable.js +172 -0
  19. package/build/src/bindings/api_query_request.js +13 -0
  20. package/build/src/bindings/filterable_query.js +51 -0
  21. package/build/src/bindings/filters_query.js +38 -0
  22. package/build/src/bindings/includes_query.js +50 -0
  23. package/build/src/bindings/sorts_query.js +42 -0
  24. package/build/src/bindings/validation_query.js +27 -0
  25. package/build/src/decorators/filterable.d.ts +20 -0
  26. package/build/src/decorators/filterable.js +24 -0
  27. package/build/src/define_config.d.ts +3 -3
  28. package/build/src/define_config.js +25 -0
  29. package/build/src/enums/filter_operator.d.ts +8 -9
  30. package/build/src/enums/filter_operator.js +11 -0
  31. package/build/src/enums/sort_direction.d.ts +3 -4
  32. package/build/src/enums/sort_direction.js +6 -0
  33. package/build/src/exceptions/allowed_fields_must_be_called_before_allowed_includes.d.ts +5 -5
  34. package/build/src/exceptions/allowed_fields_must_be_called_before_allowed_includes.js +10 -0
  35. package/build/src/exceptions/filterable_not_configured.d.ts +5 -0
  36. package/build/src/exceptions/filterable_not_configured.js +12 -0
  37. package/build/src/exceptions/invalid_append_query.d.ts +6 -4
  38. package/build/src/exceptions/invalid_append_query.js +17 -0
  39. package/build/src/exceptions/invalid_direction.d.ts +3 -3
  40. package/build/src/exceptions/invalid_direction.js +9 -0
  41. package/build/src/exceptions/invalid_field_query.d.ts +6 -4
  42. package/build/src/exceptions/invalid_field_query.js +17 -0
  43. package/build/src/exceptions/invalid_filter_query.d.ts +6 -6
  44. package/build/src/exceptions/invalid_filter_query.js +17 -0
  45. package/build/src/exceptions/invalid_filter_value.d.ts +3 -3
  46. package/build/src/exceptions/invalid_filter_value.js +8 -0
  47. package/build/src/exceptions/invalid_include_query.d.ts +6 -6
  48. package/build/src/exceptions/invalid_include_query.js +21 -0
  49. package/build/src/exceptions/invalid_query.d.ts +3 -3
  50. package/build/{chunk-XIRHVLVQ.js → src/exceptions/invalid_query.js} +3 -7
  51. package/build/src/exceptions/invalid_sort_query.d.ts +6 -6
  52. package/build/src/exceptions/invalid_sort_query.js +17 -0
  53. package/build/src/exceptions/unknown_included_fields_query.d.ts +4 -4
  54. package/build/src/exceptions/unknown_included_fields_query.js +12 -0
  55. package/build/src/exceptions/vine_not_installed.d.ts +5 -0
  56. package/build/src/exceptions/vine_not_installed.js +12 -0
  57. package/build/src/filters/filters_begin_with_strict.d.ts +6 -6
  58. package/build/src/filters/filters_begin_with_strict.js +8 -0
  59. package/build/src/filters/filters_callback.d.ts +6 -6
  60. package/build/src/filters/filters_callback.js +11 -0
  61. package/build/src/filters/filters_ends_with_strict.d.ts +6 -6
  62. package/build/src/filters/filters_ends_with_strict.js +8 -0
  63. package/build/src/filters/filters_exact.d.ts +11 -11
  64. package/build/src/filters/filters_exact.js +50 -0
  65. package/build/src/filters/filters_operator.d.ts +13 -13
  66. package/build/src/filters/filters_operator.js +52 -0
  67. package/build/src/filters/filters_partial.d.ts +9 -11
  68. package/build/src/filters/filters_partial.js +37 -0
  69. package/build/src/filters/filters_scope.d.ts +12 -0
  70. package/build/src/filters/filters_scope.js +98 -0
  71. package/build/src/filters/filters_trashed.d.ts +5 -5
  72. package/build/src/filters/filters_trashed.js +13 -0
  73. package/build/src/includes/included_callback.d.ts +7 -7
  74. package/build/src/includes/included_callback.js +11 -0
  75. package/build/src/includes/included_count.d.ts +4 -4
  76. package/build/src/includes/included_count.js +11 -0
  77. package/build/src/includes/included_relationship.d.ts +8 -8
  78. package/build/src/includes/included_relationship.js +37 -0
  79. package/build/src/sorts/sorts_callback.d.ts +6 -6
  80. package/build/src/sorts/sorts_callback.js +11 -0
  81. package/build/src/sorts/sorts_field.d.ts +4 -4
  82. package/build/src/sorts/sorts_field.js +7 -0
  83. package/build/src/utils/helpers.js +14 -0
  84. package/build/src/validation/schema_builder.d.ts +3 -0
  85. package/build/src/validation/schema_builder.js +38 -0
  86. package/build/src/validation/vine_resolver.js +13 -0
  87. package/build/stubs/main.d.ts +1 -1
  88. package/build/stubs/main.js +3 -0
  89. package/build/types.d.ts +116 -0
  90. package/build/types.js +1 -0
  91. package/package.json +101 -88
  92. package/build/api_query_request-QXOB4BN6.js +0 -18
  93. package/build/api_query_request-QXOB4BN6.js.map +0 -1
  94. package/build/chunk-3ITWUZL5.js +0 -108
  95. package/build/chunk-3ITWUZL5.js.map +0 -1
  96. package/build/chunk-54HNQTDY.js +0 -348
  97. package/build/chunk-54HNQTDY.js.map +0 -1
  98. package/build/chunk-IV3B5WO7.js +0 -160
  99. package/build/chunk-IV3B5WO7.js.map +0 -1
  100. package/build/chunk-MKQ3HMMA.js +0 -198
  101. package/build/chunk-MKQ3HMMA.js.map +0 -1
  102. package/build/chunk-XIRHVLVQ.js.map +0 -1
  103. package/build/filters_query-LCFH2F2X.js +0 -55
  104. package/build/filters_query-LCFH2F2X.js.map +0 -1
  105. package/build/includes_query-PVONWQMC.js +0 -70
  106. package/build/includes_query-PVONWQMC.js.map +0 -1
  107. package/build/index.js.map +0 -1
  108. package/build/metafile-esm.json +0 -1
  109. package/build/providers/api_query_provider.js.map +0 -1
  110. package/build/sorts_query-NJTC5UXX.js +0 -63
  111. package/build/sorts_query-NJTC5UXX.js.map +0 -1
  112. package/build/src/bindings/api_query_request.d.ts +0 -2
  113. package/build/src/bindings/filters_query.d.ts +0 -3
  114. package/build/src/bindings/includes_query.d.ts +0 -3
  115. package/build/src/bindings/sorts_query.d.ts +0 -3
  116. package/build/src/types.d.ts +0 -90
  117. package/build/src/types.js +0 -1
  118. package/build/src/types.js.map +0 -1
  119. package/build/src/utils/helpers.d.ts +0 -3
  120. /package/build/{config.stub → stubs/config.stub} +0 -0
@@ -0,0 +1,24 @@
1
+ // src/decorators/filterable.ts
2
+ /**
3
+ * Decorator to assign a filterable class to a Lucid Model
4
+ */
5
+ function filterable(target) {
6
+ return function(model) {
7
+ model.$filterable = target;
8
+ };
9
+ }
10
+ /**
11
+ * Mixin that adds filterable capabilities to a Lucid Model
12
+ */
13
+ function Filterable(filterableTarget) {
14
+ return function(superclass) {
15
+ class ModelWithFilterable extends superclass {
16
+ static $filterable = filterableTarget ?? superclass.$filterable;
17
+ static $filter(filterableOrRequest, maybeRequest) {
18
+ return this.query().filter(filterableOrRequest, maybeRequest);
19
+ }
20
+ }
21
+ return ModelWithFilterable;
22
+ };
23
+ }
24
+ export { Filterable, filterable };
@@ -1,3 +1,3 @@
1
- import { type ConfigProvider } from '@adonisjs/core/types';
2
- import { type ApiQueryConfig, type ResolvedApiQueryConfig } from './types.js';
3
- export declare const defineConfig: (config: ApiQueryConfig) => ConfigProvider<ResolvedApiQueryConfig>;
1
+ import { ApiQueryConfig, ResolvedApiQueryConfig } from "../types.js";
2
+ import { ConfigProvider } from "@adonisjs/core/types";
3
+ export declare const defineConfig: (config: ApiQueryConfig) => ConfigProvider<ResolvedApiQueryConfig>;
@@ -0,0 +1,25 @@
1
+ import { configProvider } from "@adonisjs/core";
2
+ // src/define_config.ts
3
+ const defineConfig = function(config) {
4
+ return configProvider.create(async (_) => {
5
+ return {
6
+ parameters: {
7
+ include: config.parameters?.include ?? "include",
8
+ filter: config.parameters?.filter ?? "filter",
9
+ sort: config.parameters?.sort ?? "sort",
10
+ fields: config.parameters?.fields ?? "fields",
11
+ append: config.parameters?.append ?? "append"
12
+ },
13
+ countSuffix: config.countSuffix ?? "Count",
14
+ existsSuffix: config.existsSuffix ?? "Exists",
15
+ disableInvalidFilterQueryException: config.disableInvalidFilterQueryException ?? false,
16
+ disableInvalidSortQueryException: config.disableInvalidSortQueryException ?? false,
17
+ disableInvalidIncludesQueryException: config.disableInvalidIncludesQueryException ?? false,
18
+ convertRelationNamesToSnakeCasePlural: config.convertRelationNamesToSnakeCasePlural ?? false,
19
+ convertRelationTableNameStrategy: config.convertRelationTableNameStrategy ?? false,
20
+ convertFieldNamesToSnakeCase: config.convertFieldNamesToSnakeCase ?? false,
21
+ autoValidate: config.autoValidate ?? true
22
+ };
23
+ });
24
+ };
25
+ export { defineConfig };
@@ -1,10 +1,9 @@
1
1
  export declare const FilterOperator: {
2
- readonly Dynamic: "";
3
- readonly Equal: "=";
4
- readonly LessThan: "<";
5
- readonly GreaterThan: ">";
6
- readonly LessThanOrEqual: "<=";
7
- readonly GreaterThanOrEqual: ">=";
8
- readonly NotEqual: "<>";
9
- };
10
- export type FilterOperator = (typeof FilterOperator)[keyof typeof FilterOperator];
2
+ readonly Dynamic: "";
3
+ readonly Equal: "=";
4
+ readonly LessThan: "<";
5
+ readonly GreaterThan: ">";
6
+ readonly LessThanOrEqual: "<=";
7
+ readonly GreaterThanOrEqual: ">=";
8
+ readonly NotEqual: "<>";
9
+ };
@@ -0,0 +1,11 @@
1
+ // src/enums/filter_operator.ts
2
+ const FilterOperator = {
3
+ Dynamic: "",
4
+ Equal: "=",
5
+ LessThan: "<",
6
+ GreaterThan: ">",
7
+ LessThanOrEqual: "<=",
8
+ GreaterThanOrEqual: ">=",
9
+ NotEqual: "<>"
10
+ };
11
+ export { FilterOperator };
@@ -1,5 +1,4 @@
1
1
  export declare const SortDirection: {
2
- readonly Ascending: "asc";
3
- readonly Descending: "desc";
4
- };
5
- export type SortDirection = (typeof SortDirection)[keyof typeof SortDirection];
2
+ readonly Ascending: "asc";
3
+ readonly Descending: "desc";
4
+ };
@@ -0,0 +1,6 @@
1
+ // src/enums/sort_direction.ts
2
+ const SortDirection = {
3
+ Ascending: "asc",
4
+ Descending: "desc"
5
+ };
6
+ export { SortDirection };
@@ -1,6 +1,6 @@
1
- import { Exception } from '@adonisjs/core/exceptions';
1
+ import { Exception } from "@adonisjs/core/exceptions";
2
2
  export declare class AllowedFieldsMustBeCalledBeforeAllowedIncludes extends Exception {
3
- static readonly code: 'E_BAD_METHOD_CALL_EXCEPTION';
4
- static readonly status: 500;
5
- constructor();
6
- }
3
+ static readonly code = "E_BAD_METHOD_CALL_EXCEPTION";
4
+ static readonly status = 500;
5
+ constructor();
6
+ }
@@ -0,0 +1,10 @@
1
+ import { Exception } from "@adonisjs/core/exceptions";
2
+ // src/exceptions/allowed_fields_must_be_called_before_allowed_includes.ts
3
+ var AllowedFieldsMustBeCalledBeforeAllowedIncludes = class extends Exception {
4
+ static code = "E_BAD_METHOD_CALL_EXCEPTION";
5
+ static status = 500;
6
+ constructor() {
7
+ super("The QueryBuilder's `allowedFields` method must be called before the `allowedIncludes` method");
8
+ }
9
+ };
10
+ export { AllowedFieldsMustBeCalledBeforeAllowedIncludes };
@@ -0,0 +1,5 @@
1
+ import { Exception } from "@adonisjs/core/exceptions";
2
+ export declare class FilterableNotConfigured extends Exception {
3
+ static readonly code = "E_FILTERABLE_NOT_CONFIGURED";
4
+ constructor(modelName: string);
5
+ }
@@ -0,0 +1,12 @@
1
+ import { Exception } from "@adonisjs/core/exceptions";
2
+ // src/exceptions/filterable_not_configured.ts
3
+ var FilterableNotConfigured = class FilterableNotConfigured extends Exception {
4
+ static code = "E_FILTERABLE_NOT_CONFIGURED";
5
+ constructor(modelName) {
6
+ super(`No filterable class is configured for model "${modelName}". Define "static \$filterable = UserFilterable" or use "@filterable(UserFilterable)", or pass a filterable class directly to "\$filter()".`, {
7
+ status: 500,
8
+ code: FilterableNotConfigured.code
9
+ });
10
+ }
11
+ };
12
+ export { FilterableNotConfigured };
@@ -1,5 +1,7 @@
1
- import { InvalidQuery } from './invalid_query.js';
1
+ import { InvalidQuery } from "./invalid_query.js";
2
2
  export declare class InvalidAppendQuery extends InvalidQuery {
3
- constructor(appendsNotAllowed: string[], allowedAppends: string[]);
4
- static appendsNotAllowed(appendsNotAllowed: string[], allowedAppends: string[]): InvalidAppendQuery;
5
- }
3
+ readonly appendsNotAllowed: string[];
4
+ readonly allowedAppends: string[];
5
+ constructor(appendsNotAllowed: string[], allowedAppends: string[]);
6
+ static appendsNotAllowed(appendsNotAllowed: string[], allowedAppends: string[]): InvalidAppendQuery;
7
+ }
@@ -0,0 +1,17 @@
1
+ import { InvalidQuery } from "./invalid_query.js";
2
+ import { ResponseStatus } from "@adonisjs/core/http";
3
+ // src/exceptions/invalid_append_query.ts
4
+ var InvalidAppendQuery = class InvalidAppendQuery extends InvalidQuery {
5
+ appendsNotAllowed;
6
+ allowedAppends;
7
+ constructor(appendsNotAllowed, allowedAppends) {
8
+ const message = `Requested append(s) \`${appendsNotAllowed.join(", ")}\` are not allowed. Allowed append(s) are \`${allowedAppends.join(", ")}\``;
9
+ super(message, { status: ResponseStatus.BadRequest });
10
+ this.appendsNotAllowed = appendsNotAllowed;
11
+ this.allowedAppends = allowedAppends;
12
+ }
13
+ static appendsNotAllowed(appendsNotAllowed, allowedAppends) {
14
+ return new InvalidAppendQuery(appendsNotAllowed, allowedAppends);
15
+ }
16
+ };
17
+ export { InvalidAppendQuery };
@@ -1,4 +1,4 @@
1
- import { Exception } from '@adonisjs/core/exceptions';
1
+ import { Exception } from "@adonisjs/core/exceptions";
2
2
  export declare class InvalidDirection extends Exception {
3
- static make(sort: string): InvalidDirection;
4
- }
3
+ static make(sort: string): InvalidDirection;
4
+ }
@@ -0,0 +1,9 @@
1
+ import { SortDirection } from "../enums/sort_direction.js";
2
+ import { Exception } from "@adonisjs/core/exceptions";
3
+ // src/exceptions/invalid_direction.ts
4
+ var InvalidDirection = class InvalidDirection extends Exception {
5
+ static make(sort) {
6
+ return new InvalidDirection(`The direction should be either \`${SortDirection.Descending}\` or \`${SortDirection.Ascending}\` ${sort} given`);
7
+ }
8
+ };
9
+ export { InvalidDirection };
@@ -1,5 +1,7 @@
1
- import { InvalidQuery } from './invalid_query.js';
1
+ import { InvalidQuery } from "./invalid_query.js";
2
2
  export declare class InvalidFieldQuery extends InvalidQuery {
3
- constructor(unknownFields: string[], allowedFields: string[]);
4
- static fieldsNotAllowed(unknownFields: string[], allowedFields: string[]): InvalidFieldQuery;
5
- }
3
+ readonly unknownFields: string[];
4
+ readonly allowedFields: string[];
5
+ constructor(unknownFields: string[], allowedFields: string[]);
6
+ static fieldsNotAllowed(unknownFields: string[], allowedFields: string[]): InvalidFieldQuery;
7
+ }
@@ -0,0 +1,17 @@
1
+ import { InvalidQuery } from "./invalid_query.js";
2
+ import { ResponseStatus } from "@adonisjs/core/http";
3
+ // src/exceptions/invalid_field_query.ts
4
+ var InvalidFieldQuery = class InvalidFieldQuery extends InvalidQuery {
5
+ unknownFields;
6
+ allowedFields;
7
+ constructor(unknownFields, allowedFields) {
8
+ const message = `Requested field(s) \`${unknownFields.join(", ")}\` are not allowed. Allowed field(s) are \`${allowedFields.join(", ")}\``;
9
+ super(message, { status: ResponseStatus.BadRequest });
10
+ this.unknownFields = unknownFields;
11
+ this.allowedFields = allowedFields;
12
+ }
13
+ static fieldsNotAllowed(unknownFields, allowedFields) {
14
+ return new InvalidFieldQuery(unknownFields, allowedFields);
15
+ }
16
+ };
17
+ export { InvalidFieldQuery };
@@ -1,7 +1,7 @@
1
- import { InvalidQuery } from './invalid_query.js';
1
+ import { InvalidQuery } from "./invalid_query.js";
2
2
  export declare class InvalidFilterQuery extends InvalidQuery {
3
- readonly unknownFilters: string[];
4
- readonly allowedFilters: string[];
5
- constructor(unknownFilters: string[], allowedFilters: string[]);
6
- static filtersNotAllowed(unknownFilters: string[], allowedFilters: string[]): InvalidFilterQuery;
7
- }
3
+ readonly unknownFilters: string[];
4
+ readonly allowedFilters: string[];
5
+ constructor(unknownFilters: string[], allowedFilters: string[]);
6
+ static filtersNotAllowed(unknownFilters: string[], allowedFilters: string[]): InvalidFilterQuery;
7
+ }
@@ -0,0 +1,17 @@
1
+ import { InvalidQuery } from "./invalid_query.js";
2
+ import { ResponseStatus } from "@adonisjs/core/http";
3
+ // src/exceptions/invalid_filter_query.ts
4
+ var InvalidFilterQuery = class InvalidFilterQuery extends InvalidQuery {
5
+ unknownFilters;
6
+ allowedFilters;
7
+ constructor(unknownFilters, allowedFilters) {
8
+ const message = `Requested filter(s) \`${unknownFilters.join(", ")}\` are not allowed. Allowed filter(s) are \`${allowedFilters.join(", ")}\``;
9
+ super(message, { status: ResponseStatus.BadRequest });
10
+ this.unknownFilters = unknownFilters;
11
+ this.allowedFilters = allowedFilters;
12
+ }
13
+ static filtersNotAllowed(unknownFilters, allowedFilters) {
14
+ return new InvalidFilterQuery(unknownFilters, allowedFilters);
15
+ }
16
+ };
17
+ export { InvalidFilterQuery };
@@ -1,4 +1,4 @@
1
- import { Exception } from '@adonisjs/core/exceptions';
1
+ import { Exception } from "@adonisjs/core/exceptions";
2
2
  export declare class InvalidFilterValue extends Exception {
3
- static make(value: unknown): InvalidFilterValue;
4
- }
3
+ static make(value: unknown): InvalidFilterValue;
4
+ }
@@ -0,0 +1,8 @@
1
+ import { Exception } from "@adonisjs/core/exceptions";
2
+ // src/exceptions/invalid_filter_value.ts
3
+ var InvalidFilterValue = class InvalidFilterValue extends Exception {
4
+ static make(value) {
5
+ return new InvalidFilterValue(`Filter value \`${value}\` is invalid`);
6
+ }
7
+ };
8
+ export { InvalidFilterValue };
@@ -1,7 +1,7 @@
1
- import { InvalidQuery } from './invalid_query.js';
1
+ import { InvalidQuery } from "./invalid_query.js";
2
2
  export declare class InvalidIncludeQuery extends InvalidQuery {
3
- readonly unknownIncludes: string[];
4
- readonly allowedIncludes: string[];
5
- constructor(unknownIncludes: string[], allowedIncludes: string[]);
6
- static includesNotAllowed(unknownIncludes: string[], allowedIncludes: string[]): InvalidIncludeQuery;
7
- }
3
+ readonly unknownIncludes: string[];
4
+ readonly allowedIncludes: string[];
5
+ constructor(unknownIncludes: string[], allowedIncludes: string[]);
6
+ static includesNotAllowed(unknownIncludes: string[], allowedIncludes: string[]): InvalidIncludeQuery;
7
+ }
@@ -0,0 +1,21 @@
1
+ import { InvalidQuery } from "./invalid_query.js";
2
+ import { ResponseStatus } from "@adonisjs/core/http";
3
+ // src/exceptions/invalid_include_query.ts
4
+ var InvalidIncludeQuery = class InvalidIncludeQuery extends InvalidQuery {
5
+ unknownIncludes;
6
+ allowedIncludes;
7
+ constructor(unknownIncludes, allowedIncludes) {
8
+ let message = `Requested include(s) \`${unknownIncludes.join(", ")}\` are not allowed. `;
9
+ if (allowedIncludes.length > 0) {
10
+ const allowed = allowedIncludes.join(", ");
11
+ message += `Allowed include(s) are \`${allowed}\``;
12
+ } else message += "There are no allowed includes";
13
+ super(message, { status: ResponseStatus.BadRequest });
14
+ this.unknownIncludes = unknownIncludes;
15
+ this.allowedIncludes = allowedIncludes;
16
+ }
17
+ static includesNotAllowed(unknownIncludes, allowedIncludes) {
18
+ return new InvalidIncludeQuery(unknownIncludes, allowedIncludes);
19
+ }
20
+ };
21
+ export { InvalidIncludeQuery };
@@ -1,4 +1,4 @@
1
- import { Exception } from '@adonisjs/core/exceptions';
1
+ import { Exception } from "@adonisjs/core/exceptions";
2
2
  export declare abstract class InvalidQuery extends Exception {
3
- static readonly code = "E_INVALID_QUERY_EXCEPTION";
4
- }
3
+ static readonly code = "E_INVALID_QUERY_EXCEPTION";
4
+ }
@@ -1,10 +1,6 @@
1
- // src/exceptions/invalid_query.ts
2
1
  import { Exception } from "@adonisjs/core/exceptions";
2
+ // src/exceptions/invalid_query.ts
3
3
  var InvalidQuery = class extends Exception {
4
- static code = "E_INVALID_QUERY_EXCEPTION";
5
- };
6
-
7
- export {
8
- InvalidQuery
4
+ static code = "E_INVALID_QUERY_EXCEPTION";
9
5
  };
10
- //# sourceMappingURL=chunk-XIRHVLVQ.js.map
6
+ export { InvalidQuery };
@@ -1,7 +1,7 @@
1
- import { InvalidQuery } from './invalid_query.js';
1
+ import { InvalidQuery } from "./invalid_query.js";
2
2
  export declare class InvalidSortQuery extends InvalidQuery {
3
- readonly unknownSorts: string[];
4
- readonly allowedSorts: string[];
5
- constructor(unknownSorts: string[], allowedSorts: string[]);
6
- static sortsNotAllowed(unknownSorts: string[], allowedSorts: string[]): InvalidSortQuery;
7
- }
3
+ readonly unknownSorts: string[];
4
+ readonly allowedSorts: string[];
5
+ constructor(unknownSorts: string[], allowedSorts: string[]);
6
+ static sortsNotAllowed(unknownSorts: string[], allowedSorts: string[]): InvalidSortQuery;
7
+ }
@@ -0,0 +1,17 @@
1
+ import { InvalidQuery } from "./invalid_query.js";
2
+ import { ResponseStatus } from "@adonisjs/core/http";
3
+ // src/exceptions/invalid_sort_query.ts
4
+ var InvalidSortQuery = class InvalidSortQuery extends InvalidQuery {
5
+ unknownSorts;
6
+ allowedSorts;
7
+ constructor(unknownSorts, allowedSorts) {
8
+ const message = `Requested sort(s) \`${unknownSorts.join(", ")}\` is not allowed. Allowed sort(s) are \`${allowedSorts.join(", ")}\``;
9
+ super(message, { status: ResponseStatus.BadRequest });
10
+ this.unknownSorts = unknownSorts;
11
+ this.allowedSorts = allowedSorts;
12
+ }
13
+ static sortsNotAllowed(unknownSorts, allowedSorts) {
14
+ return new InvalidSortQuery(unknownSorts, allowedSorts);
15
+ }
16
+ };
17
+ export { InvalidSortQuery };
@@ -1,5 +1,5 @@
1
- import { InvalidQuery } from './invalid_query.js';
1
+ import { InvalidQuery } from "./invalid_query.js";
2
2
  export declare class UnknownIncludedFieldsQuery extends InvalidQuery {
3
- readonly unknownFields: string[];
4
- constructor(unknownFields: string[]);
5
- }
3
+ readonly unknownFields: string[];
4
+ constructor(unknownFields: string[]);
5
+ }
@@ -0,0 +1,12 @@
1
+ import { InvalidQuery } from "./invalid_query.js";
2
+ import { ResponseStatus } from "@adonisjs/core/http";
3
+ // src/exceptions/unknown_included_fields_query.ts
4
+ var UnknownIncludedFieldsQuery = class extends InvalidQuery {
5
+ unknownFields;
6
+ constructor(unknownFields) {
7
+ const message = [`Requested field(s) \`${unknownFields.join(", ")}\` are not allowed (yet). `, "If you want to allow these fields, please make sure to call the QueryBuilder's `allowedFields` method before the `allowedIncludes` method"].join("");
8
+ super(message, { status: ResponseStatus.BadRequest });
9
+ this.unknownFields = unknownFields;
10
+ }
11
+ };
12
+ export { UnknownIncludedFieldsQuery };
@@ -0,0 +1,5 @@
1
+ import { Exception } from "@adonisjs/core/exceptions";
2
+ export declare class VineNotInstalledException extends Exception {
3
+ static readonly code = "E_VINE_NOT_INSTALLED";
4
+ constructor();
5
+ }
@@ -0,0 +1,12 @@
1
+ import { Exception } from "@adonisjs/core/exceptions";
2
+ // src/exceptions/vine_not_installed.ts
3
+ var VineNotInstalledException = class VineNotInstalledException extends Exception {
4
+ static code = "E_VINE_NOT_INSTALLED";
5
+ constructor() {
6
+ super("To use validation in \"@eienjs/adonisjs-api-query\", you must install \"@vinejs/vine\". Run: \"pnpm add @vinejs/vine\" or \"npm install @vinejs/vine\".", {
7
+ status: 500,
8
+ code: VineNotInstalledException.code
9
+ });
10
+ }
11
+ };
12
+ export { VineNotInstalledException };
@@ -1,7 +1,7 @@
1
- import { type LucidModel } from '@adonisjs/lucid/types/model';
2
- import { type StrictValuesWithoutRaw } from '@adonisjs/lucid/types/querybuilder';
3
- import { type Filter } from '../types.js';
4
- import { FiltersPartial } from './filters_partial.js';
1
+ import { Filter } from "../../types.js";
2
+ import { FiltersPartial } from "./filters_partial.js";
3
+ import { LucidModel } from "@adonisjs/lucid/types/model";
4
+ import { StrictValuesWithoutRaw } from "@adonisjs/lucid/types/querybuilder";
5
5
  export declare class FiltersBeginWithStrict<Model extends LucidModel> extends FiltersPartial<Model> implements Filter<Model> {
6
- protected getWhereRawParameters(value: StrictValuesWithoutRaw, property: string): [string, string[]];
7
- }
6
+ protected getWhereRawParameters(value: StrictValuesWithoutRaw, property: string): [string, string[]];
7
+ }
@@ -0,0 +1,8 @@
1
+ import { FiltersPartial } from "./filters_partial.js";
2
+ // src/filters/filters_begin_with_strict.ts
3
+ var FiltersBeginWithStrict = class FiltersBeginWithStrict extends FiltersPartial {
4
+ getWhereRawParameters(value, property) {
5
+ return ["?? LIKE ?", [property, `${FiltersBeginWithStrict.escapeLike(value.toString())}%`]];
6
+ }
7
+ };
8
+ export { FiltersBeginWithStrict };
@@ -1,7 +1,7 @@
1
- import { type LucidModel, type ModelQueryBuilderContract } from '@adonisjs/lucid/types/model';
2
- import { type Filter } from '../types.js';
1
+ import { Filter } from "../../types.js";
2
+ import { LucidModel, ModelQueryBuilderContract } from "@adonisjs/lucid/types/model";
3
3
  export declare class FiltersCallback<Model extends LucidModel> implements Filter<Model> {
4
- private callback;
5
- constructor(callback: (query: ModelQueryBuilderContract<Model>, value: unknown, property: string) => void);
6
- handle(query: ModelQueryBuilderContract<Model, InstanceType<Model>>, value: unknown, property: string): void;
7
- }
4
+ private callback;
5
+ constructor(callback: (query: ModelQueryBuilderContract<Model>, value: unknown, property: string) => void);
6
+ handle(query: ModelQueryBuilderContract<Model, InstanceType<Model>>, value: unknown, property: string): void;
7
+ }
@@ -0,0 +1,11 @@
1
+ // src/filters/filters_callback.ts
2
+ var FiltersCallback = class {
3
+ callback;
4
+ constructor(callback) {
5
+ this.callback = callback;
6
+ }
7
+ handle(query, value, property) {
8
+ this.callback(query, value, property);
9
+ }
10
+ };
11
+ export { FiltersCallback };
@@ -1,7 +1,7 @@
1
- import { type LucidModel } from '@adonisjs/lucid/types/model';
2
- import { type StrictValuesWithoutRaw } from '@adonisjs/lucid/types/querybuilder';
3
- import { type Filter } from '../types.js';
4
- import { FiltersPartial } from './filters_partial.js';
1
+ import { Filter } from "../../types.js";
2
+ import { FiltersPartial } from "./filters_partial.js";
3
+ import { LucidModel } from "@adonisjs/lucid/types/model";
4
+ import { StrictValuesWithoutRaw } from "@adonisjs/lucid/types/querybuilder";
5
5
  export declare class FiltersEndsWithStrict<Model extends LucidModel> extends FiltersPartial<Model> implements Filter<Model> {
6
- protected getWhereRawParameters(value: StrictValuesWithoutRaw, property: string): [string, string[]];
7
- }
6
+ protected getWhereRawParameters(value: StrictValuesWithoutRaw, property: string): [string, string[]];
7
+ }
@@ -0,0 +1,8 @@
1
+ import { FiltersPartial } from "./filters_partial.js";
2
+ // src/filters/filters_ends_with_strict.ts
3
+ var FiltersEndsWithStrict = class FiltersEndsWithStrict extends FiltersPartial {
4
+ getWhereRawParameters(value, property) {
5
+ return ["?? LIKE ?", [property, `%${FiltersEndsWithStrict.escapeLike(value.toString())}`]];
6
+ }
7
+ };
8
+ export { FiltersEndsWithStrict };
@@ -1,12 +1,12 @@
1
- import { type LucidModel, type ModelQueryBuilderContract } from '@adonisjs/lucid/types/model';
2
- import { type StrictValuesWithoutRaw } from '@adonisjs/lucid/types/querybuilder';
3
- import { type Filter } from '../types.js';
1
+ import { Filter } from "../../types.js";
2
+ import { LucidModel, ModelQueryBuilderContract } from "@adonisjs/lucid/types/model";
3
+ import { StrictValuesWithoutRaw } from "@adonisjs/lucid/types/querybuilder";
4
4
  export declare class FiltersExact<Model extends LucidModel> implements Filter<Model> {
5
- protected addRelationConstraint: boolean;
6
- protected relationConstraints: string[];
7
- constructor(addRelationConstraint?: boolean);
8
- handle(query: ModelQueryBuilderContract<Model, InstanceType<Model>>, value: StrictValuesWithoutRaw | null, property: string): void;
9
- protected qualifyColumn(query: ModelQueryBuilderContract<Model, InstanceType<Model>>, column: string): string;
10
- protected isRelationProperty(query: ModelQueryBuilderContract<Model, InstanceType<Model>>, property: string): boolean;
11
- protected withRelationConstraint(query: ModelQueryBuilderContract<Model, InstanceType<Model>>, value: StrictValuesWithoutRaw | null, property: string): void;
12
- }
5
+ protected shouldAddRelationConstraint: boolean;
6
+ protected relationConstraints: string[];
7
+ constructor(shouldAddRelationConstraint?: boolean);
8
+ handle(query: ModelQueryBuilderContract<Model, InstanceType<Model>>, value: StrictValuesWithoutRaw | null, property: string): void;
9
+ protected qualifyColumn(query: ModelQueryBuilderContract<Model, InstanceType<Model>>, column: string): string;
10
+ protected isRelationProperty(query: ModelQueryBuilderContract<Model, InstanceType<Model>>, property: string): boolean;
11
+ protected withRelationConstraint(query: ModelQueryBuilderContract<Model, InstanceType<Model>>, value: StrictValuesWithoutRaw | null, property: string): void;
12
+ }
@@ -0,0 +1,50 @@
1
+ // src/filters/filters_exact.ts
2
+ var FiltersExact = class {
3
+ shouldAddRelationConstraint;
4
+ relationConstraints = [];
5
+ constructor(shouldAddRelationConstraint = true) {
6
+ this.shouldAddRelationConstraint = shouldAddRelationConstraint;
7
+ }
8
+ handle(query, value, property) {
9
+ if (this.shouldAddRelationConstraint && this.isRelationProperty(query, property)) {
10
+ this.withRelationConstraint(query, value, property);
11
+ return;
12
+ }
13
+ if (Array.isArray(value)) {
14
+ const flatValues = value.flat(Infinity).filter((item) => typeof item !== "object" || item === null);
15
+ if (flatValues.length === 0) return;
16
+ query.whereIn(this.qualifyColumn(query, property), flatValues);
17
+ return;
18
+ }
19
+ if (value === null) {
20
+ query.whereNull(this.qualifyColumn(query, property));
21
+ return;
22
+ }
23
+ if (typeof value === "object") return;
24
+ query.where(this.qualifyColumn(query, property), "=", value);
25
+ }
26
+ qualifyColumn(query, column) {
27
+ if (column.includes(".")) return column;
28
+ return `${query.model.table}.${query.model.$getColumn(column)?.columnName ?? column}`;
29
+ }
30
+ isRelationProperty(query, property) {
31
+ if (!property.includes(".") || this.relationConstraints.includes(property)) return false;
32
+ const firstRelationShip = property.split(".", 1)[0];
33
+ return query.model.$relationsDefinitions.has(firstRelationShip);
34
+ }
35
+ withRelationConstraint(query, value, property) {
36
+ const parts = property.split(".");
37
+ const relationProperty = parts.pop();
38
+ const relation = parts.join(".");
39
+ query.whereHas(relation, (subQuery) => {
40
+ const columnName = this.qualifyColumn(subQuery, relationProperty);
41
+ this.relationConstraints.push(columnName);
42
+ try {
43
+ this.handle(subQuery, value, columnName);
44
+ } finally {
45
+ this.relationConstraints.pop();
46
+ }
47
+ });
48
+ }
49
+ };
50
+ export { FiltersExact };
@@ -1,14 +1,14 @@
1
- import { type LucidModel, type ModelQueryBuilderContract } from '@adonisjs/lucid/types/model';
2
- import { type StrictValuesWithoutRaw } from '@adonisjs/lucid/types/querybuilder';
3
- import { FilterOperator } from '../enums/filter_operator.js';
4
- import { type Filter } from '../types.js';
5
- import { FiltersExact } from './filters_exact.js';
1
+ import { FilterOperator } from "../enums/filter_operator.js";
2
+ import { EnumType, Filter } from "../../types.js";
3
+ import { FiltersExact } from "./filters_exact.js";
4
+ import { LucidModel, ModelQueryBuilderContract } from "@adonisjs/lucid/types/model";
5
+ import { StrictValuesWithoutRaw } from "@adonisjs/lucid/types/querybuilder";
6
6
  export declare class FiltersOperator<Model extends LucidModel> extends FiltersExact<Model> implements Filter<Model> {
7
- protected $addRelationConstraint: boolean;
8
- protected $filterOperator: FilterOperator;
9
- protected $boolean: 'and' | 'or';
10
- constructor($addRelationConstraint: boolean, $filterOperator: FilterOperator, $boolean: 'and' | 'or');
11
- handle(query: ModelQueryBuilderContract<Model, InstanceType<Model>>, value: StrictValuesWithoutRaw, property: string): void;
12
- protected getDynamicFilterOperator(value: string): FilterOperator;
13
- protected removeDynamicFilterOperatorFromValue(value: string, filterOperator: FilterOperator): string;
14
- }
7
+ protected shouldAddRelationConstraint: boolean;
8
+ protected filterOperator: EnumType<typeof FilterOperator>;
9
+ protected boolean: 'and' | 'or';
10
+ constructor(shouldAddRelationConstraint: boolean, filterOperator: EnumType<typeof FilterOperator>, boolean: 'and' | 'or');
11
+ handle(query: ModelQueryBuilderContract<Model, InstanceType<Model>>, value: StrictValuesWithoutRaw | null, property: string): void;
12
+ protected getDynamicFilterOperator(value: string): EnumType<typeof FilterOperator>;
13
+ protected removeDynamicFilterOperatorFromValue(value: string, filterOperator: EnumType<typeof FilterOperator>): string;
14
+ }