@adonis-agora/filter 0.3.0 → 0.4.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/CHANGELOG.md +61 -0
- package/README.md +27 -0
- package/dist/providers/filter_provider.d.ts +28 -0
- package/dist/providers/filter_provider.d.ts.map +1 -0
- package/dist/providers/filter_provider.js +33 -0
- package/dist/providers/filter_provider.js.map +1 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/lucid_adapter.d.ts +14 -3
- package/dist/src/lucid_adapter.d.ts.map +1 -1
- package/dist/src/lucid_adapter.js.map +1 -1
- package/dist/src/lucid_macros.d.ts +52 -0
- package/dist/src/lucid_macros.d.ts.map +1 -0
- package/dist/src/lucid_macros.js +32 -0
- package/dist/src/lucid_macros.js.map +1 -0
- package/package.json +13 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,66 @@
|
|
|
1
1
|
# @adonis-agora/filter
|
|
2
2
|
|
|
3
|
+
## 0.4.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#4](https://github.com/DavideCarvalho/adonis-filter/pull/4) [`76b2ca8`](https://github.com/DavideCarvalho/adonis-filter/commit/76b2ca82d27811b09dbd98629be6964e9aee6167) Thanks [@DavideCarvalho](https://github.com/DavideCarvalho)! - Add chainable Lucid query-builder macros via an optional `FilterProvider`
|
|
8
|
+
|
|
9
|
+
Register `@adonis-agora/filter/filter_provider` to get the method-call form of
|
|
10
|
+
`applyFilterFromRequest` on any Lucid query builder:
|
|
11
|
+
|
|
12
|
+
```ts
|
|
13
|
+
// filter + sort + search, then keep chaining:
|
|
14
|
+
const rows = await User.query()
|
|
15
|
+
.where("tenantId", tenant.id)
|
|
16
|
+
.applyFilterFromRequest(userFilter, ctx)
|
|
17
|
+
.orderBy("createdAt", "desc");
|
|
18
|
+
|
|
19
|
+
// filter + paginate in one terminal call (returns Lucid's paginator):
|
|
20
|
+
const page = await User.query().filterPaginate(userFilter, ctx);
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
`applyFilterFromRequest` applies the spec's server scope + allow-listed
|
|
24
|
+
filter/sort/search and returns the query for chaining (pagination resolved but
|
|
25
|
+
not applied); `filterPaginate` additionally calls `paginate(page, size)`. The
|
|
26
|
+
free functions are unchanged and work without the provider — the macros only add
|
|
27
|
+
the chainable sugar, so `@adonisjs/lucid` is an optional peer. `registerFilterMacros`
|
|
28
|
+
is also exported for manual registration.
|
|
29
|
+
|
|
30
|
+
## 0.3.1
|
|
31
|
+
|
|
32
|
+
### Patch Changes
|
|
33
|
+
|
|
34
|
+
- [`e6fb05c`](https://github.com/DavideCarvalho/adonis-filter/commit/e6fb05c0e137cd4ab3bad1f9ce5626216e670a8f) - Fix `QueryBuilderLike` rejecting every real Lucid query builder
|
|
35
|
+
|
|
36
|
+
Passing a Lucid builder to `applyFilterFromRequest` (or any adapter entry
|
|
37
|
+
point) failed to typecheck in consuming apps:
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
Argument of type 'ModelQueryBuilderContract<typeof Post, Post>' is not
|
|
41
|
+
assignable to parameter of type 'QueryBuilderLike'.
|
|
42
|
+
Types of property 'where' are incompatible.
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
The message blames `where`, but `where` was fine — TS reports the first member
|
|
46
|
+
it tries. The real culprit was `whereHas`, declared here as
|
|
47
|
+
`whereHas(relation: string, ...)`. Lucid types its own as
|
|
48
|
+
`<Name extends ExtractModelRelations<Model>>(relation: Name, ...)`, a union of
|
|
49
|
+
the model's literal relation names, and `string` is not assignable to that
|
|
50
|
+
union under the contravariant parameter check — so no real builder ever
|
|
51
|
+
satisfied the interface. Runtime was always fine; this was types-only.
|
|
52
|
+
|
|
53
|
+
`relation` is now `any`, which is the only type that both accepts the `string`
|
|
54
|
+
the adapter passes and is assignable to each model's relation-name union.
|
|
55
|
+
Marking the member optional does not help: an optional member that is present
|
|
56
|
+
is still checked.
|
|
57
|
+
|
|
58
|
+
A compile-time guard against real `@adonisjs/lucid` types now covers this
|
|
59
|
+
(`test/types/lucid_compat.types.ts`, run by `pnpm typecheck`). Lucid is a
|
|
60
|
+
devDependency only — nothing under `src/` imports it, so the package stays
|
|
61
|
+
framework-free. A hand-transcribed stub of Lucid's types was tried first and
|
|
62
|
+
compiled clean while real Lucid did not, so the guard uses Lucid's own `.d.ts`.
|
|
63
|
+
|
|
3
64
|
## 0.3.0
|
|
4
65
|
|
|
5
66
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -17,6 +17,33 @@ const { page, size } = applyFilter(query, input, {
|
|
|
17
17
|
return query.paginate(page, size)
|
|
18
18
|
```
|
|
19
19
|
|
|
20
|
+
### Chainable macros (optional)
|
|
21
|
+
|
|
22
|
+
Register the `FilterProvider` to get the method-call form of
|
|
23
|
+
`applyFilterFromRequest` on any Lucid query builder — the same operation, but
|
|
24
|
+
chainable:
|
|
25
|
+
|
|
26
|
+
```ts
|
|
27
|
+
// adonisrc.ts → providers
|
|
28
|
+
() => import('@adonis-agora/filter/filter_provider')
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
// filter + sort + search, then keep chaining:
|
|
33
|
+
const rows = await User.query()
|
|
34
|
+
.where('tenantId', tenant.id)
|
|
35
|
+
.applyFilterFromRequest(userFilter, ctx)
|
|
36
|
+
.orderBy('createdAt', 'desc')
|
|
37
|
+
|
|
38
|
+
// filter + paginate in one terminal call (returns Lucid's paginator):
|
|
39
|
+
const page = await User.query().filterPaginate(userFilter, ctx)
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
`applyFilterFromRequest` returns the query (pagination resolved but not applied);
|
|
43
|
+
`filterPaginate` applies `paginate(page, size)` with the resolved values. The free
|
|
44
|
+
functions work without the provider — the macros only add the chainable sugar, so
|
|
45
|
+
`@adonisjs/lucid` stays an optional peer.
|
|
46
|
+
|
|
20
47
|
Operators: equals/notEquals, contains/iContains/startsWith/endsWith, gt/gte/lt/lte,
|
|
21
48
|
between/notBetween, in/notIn/isAnyOf, isNull/isNotNull/isEmpty/isNotEmpty, plus
|
|
22
49
|
AND/OR composition. The `allowed`/`sortable`/`searchable` lists are the security
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ApplicationService } from '@adonisjs/core/types';
|
|
2
|
+
/**
|
|
3
|
+
* Wires `@adonis-agora/filter`'s chainable Lucid macros into the application.
|
|
4
|
+
*
|
|
5
|
+
* On boot it registers the `applyFilterFromRequest` and `filterPaginate` macros
|
|
6
|
+
* onto Lucid's `ModelQueryBuilder`, so any model query gains the method-call form
|
|
7
|
+
* of the free `applyFilterFromRequest` helper:
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* const rows = await User.query()
|
|
11
|
+
* .where('tenantId', tenant.id)
|
|
12
|
+
* .applyFilterFromRequest(userFilter, ctx)
|
|
13
|
+
* .orderBy('createdAt', 'desc')
|
|
14
|
+
*
|
|
15
|
+
* const page = await User.query().filterPaginate(userFilter, ctx)
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* Register it in `adonisrc.ts` (`providers`). The free functions
|
|
19
|
+
* (`applyFilterFromRequest`, `applyCursorFromRequest`) work without it — this
|
|
20
|
+
* provider only adds the chainable sugar, so `@adonisjs/lucid` is loaded lazily
|
|
21
|
+
* here (not a hard dependency of the package).
|
|
22
|
+
*/
|
|
23
|
+
export default class FilterProvider {
|
|
24
|
+
protected app: ApplicationService;
|
|
25
|
+
constructor(app: ApplicationService);
|
|
26
|
+
boot(): Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=filter_provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter_provider.d.ts","sourceRoot":"","sources":["../../providers/filter_provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG/D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,OAAO,OAAO,cAAc;IACrB,SAAS,CAAC,GAAG,EAAE,kBAAkB;gBAAvB,GAAG,EAAE,kBAAkB;IAEvC,IAAI;CAIX"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { registerFilterMacros } from '../src/lucid_macros.js';
|
|
2
|
+
/**
|
|
3
|
+
* Wires `@adonis-agora/filter`'s chainable Lucid macros into the application.
|
|
4
|
+
*
|
|
5
|
+
* On boot it registers the `applyFilterFromRequest` and `filterPaginate` macros
|
|
6
|
+
* onto Lucid's `ModelQueryBuilder`, so any model query gains the method-call form
|
|
7
|
+
* of the free `applyFilterFromRequest` helper:
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* const rows = await User.query()
|
|
11
|
+
* .where('tenantId', tenant.id)
|
|
12
|
+
* .applyFilterFromRequest(userFilter, ctx)
|
|
13
|
+
* .orderBy('createdAt', 'desc')
|
|
14
|
+
*
|
|
15
|
+
* const page = await User.query().filterPaginate(userFilter, ctx)
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* Register it in `adonisrc.ts` (`providers`). The free functions
|
|
19
|
+
* (`applyFilterFromRequest`, `applyCursorFromRequest`) work without it — this
|
|
20
|
+
* provider only adds the chainable sugar, so `@adonisjs/lucid` is loaded lazily
|
|
21
|
+
* here (not a hard dependency of the package).
|
|
22
|
+
*/
|
|
23
|
+
export default class FilterProvider {
|
|
24
|
+
app;
|
|
25
|
+
constructor(app) {
|
|
26
|
+
this.app = app;
|
|
27
|
+
}
|
|
28
|
+
async boot() {
|
|
29
|
+
const { ModelQueryBuilder } = await import('@adonisjs/lucid/orm');
|
|
30
|
+
registerFilterMacros(ModelQueryBuilder);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=filter_provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter_provider.js","sourceRoot":"","sources":["../../providers/filter_provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,OAAO,OAAO,cAAc;IACX;IAAtB,YAAsB,GAAuB;QAAvB,QAAG,GAAH,GAAG,CAAoB;IAAG,CAAC;IAEjD,KAAK,CAAC,IAAI;QACR,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAClE,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;IAC1C,CAAC;CACF"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -12,6 +12,8 @@ export type { FilterClientEntry, FilterClientManifest, FilterFieldKind, FilterFi
|
|
|
12
12
|
export type { DefineFilterOptions, FilterSpec, RelationColumns, RelationSpec, TenantResolver, TenantScopeSpec, } from './filter_spec.js';
|
|
13
13
|
export { applyCursorFromRequest, applyFilterFromRequest } from './apply_from_request.js';
|
|
14
14
|
export type { ApplyCursorFromRequestOptions, ApplyFromRequestOptions, FilterRequestContext, } from './apply_from_request.js';
|
|
15
|
+
export { registerFilterMacros } from './lucid_macros.js';
|
|
16
|
+
export type { MacroableQueryBuilder } from './lucid_macros.js';
|
|
15
17
|
export { parseFilterRequest, parseSort, toColumnFilters } from './parse_request.js';
|
|
16
18
|
export { parseSpatieRequest } from './spatie_parser.js';
|
|
17
19
|
export type { SpatieInput } from './spatie_parser.js';
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,eAAO,MAAM,OAAO,UAAU,CAAC;AAE/B,YAAY,EACV,YAAY,EACZ,cAAc,EACd,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EACV,SAAS,EACT,YAAY,EACZ,WAAW,EACX,oBAAoB,EACpB,eAAe,EACf,WAAW,EACX,QAAQ,EACR,sBAAsB,GACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,2BAA2B,GAC5B,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,mBAAmB,EACnB,UAAU,EACV,eAAe,EACf,YAAY,EACZ,cAAc,EACd,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACzF,YAAY,EACV,6BAA6B,EAC7B,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACvD,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EACX,WAAW,EACX,SAAS,EACT,qBAAqB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,GAC7B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,eAAe,EACf,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC1F,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC7F,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,eAAO,MAAM,OAAO,UAAU,CAAC;AAE/B,YAAY,EACV,YAAY,EACZ,cAAc,EACd,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EACV,SAAS,EACT,YAAY,EACZ,WAAW,EACX,oBAAoB,EACpB,eAAe,EACf,WAAW,EACX,QAAQ,EACR,sBAAsB,GACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,2BAA2B,GAC5B,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,mBAAmB,EACnB,UAAU,EACV,eAAe,EACf,YAAY,EACZ,cAAc,EACd,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACzF,YAAY,EACV,6BAA6B,EAC7B,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,YAAY,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACvD,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EACX,WAAW,EACX,SAAS,EACT,qBAAqB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,GAC7B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,eAAe,EACf,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC1F,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC7F,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/src/index.js
CHANGED
|
@@ -7,6 +7,7 @@ export { escapeLike } from './escape-like.js';
|
|
|
7
7
|
export { defineFilter, FilterDefinitionError, specToFilterConfig, } from './filter_spec.js';
|
|
8
8
|
export { filterableFieldPaths, generateFilterClient, generateFilterClients, sortableFieldPaths, } from './generate_client.js';
|
|
9
9
|
export { applyCursorFromRequest, applyFilterFromRequest } from './apply_from_request.js';
|
|
10
|
+
export { registerFilterMacros } from './lucid_macros.js';
|
|
10
11
|
export { parseFilterRequest, parseSort, toColumnFilters } from './parse_request.js';
|
|
11
12
|
export { parseSpatieRequest } from './spatie_parser.js';
|
|
12
13
|
export { applyCursor, applyFilter } from './runner.js';
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAQ/B,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAW9C,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAiB9B,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAMzF,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEvD,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EACX,WAAW,EACX,SAAS,EACT,qBAAqB,GAKtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,eAAe,EACf,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,aAAa,GACd,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE7F,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAQ/B,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAW9C,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAiB9B,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAMzF,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEvD,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EACX,WAAW,EACX,SAAS,EACT,qBAAqB,GAKtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,eAAe,EACf,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,aAAa,GACd,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE7F,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -17,10 +17,21 @@ export interface QueryBuilderLike {
|
|
|
17
17
|
* matching the nested conditions — Lucid's `whereHas`. Used to translate a
|
|
18
18
|
* dotted relation-path filter (`posts.title = x`) into a real subquery
|
|
19
19
|
* (`whereHas('posts', (q) => q.where('title', x))`) instead of a dotted
|
|
20
|
-
* column reference.
|
|
21
|
-
*
|
|
20
|
+
* column reference. The recording mock implements it so relation translation
|
|
21
|
+
* stays unit-testable.
|
|
22
|
+
*
|
|
23
|
+
* `relation` is `any`, not `string`, and that is load-bearing: Lucid types its
|
|
24
|
+
* own `whereHas` as `<Name extends ExtractModelRelations<Model>>(relation: Name, ...)`
|
|
25
|
+
* — a union of the model's *literal* relation names. `string` is not assignable
|
|
26
|
+
* to that union, so declaring `relation: string` here makes every real Lucid
|
|
27
|
+
* builder fail to satisfy this interface, and TS reports the failure against
|
|
28
|
+
* `where` (the first member it tries), which sends you hunting in the wrong
|
|
29
|
+
* place. Widening the member to optional does NOT help: an optional member
|
|
30
|
+
* that is present is still checked. Since the parameter must accept the
|
|
31
|
+
* `string` the adapter passes AND be assignable to each model's relation-name
|
|
32
|
+
* union, `any` is the only type that works.
|
|
22
33
|
*/
|
|
23
|
-
whereHas(relation:
|
|
34
|
+
whereHas(relation: any, callback: (qb: QueryBuilderLike) => void): QueryBuilderLike;
|
|
24
35
|
whereNot(column: string, value: unknown): QueryBuilderLike;
|
|
25
36
|
whereIn(column: string, values: unknown[]): QueryBuilderLike;
|
|
26
37
|
whereNotIn(column: string, values: unknown[]): QueryBuilderLike;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lucid_adapter.d.ts","sourceRoot":"","sources":["../../src/lucid_adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AACnE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG3C;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,gBAAgB,KAAK,IAAI,GAAG,gBAAgB,CAAC;IAClE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAAC;IACxD,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAAC;IAC1E,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,gBAAgB,KAAK,IAAI,GAAG,gBAAgB,CAAC;IACpE
|
|
1
|
+
{"version":3,"file":"lucid_adapter.d.ts","sourceRoot":"","sources":["../../src/lucid_adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lucid_adapter.js","sourceRoot":"","sources":["../../src/lucid_adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"lucid_adapter.js","sourceRoot":"","sources":["../../src/lucid_adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { type ApplyFromRequestOptions, type FilterRequestContext } from './apply_from_request.js';
|
|
2
|
+
import type { FilterSpec } from './filter_spec.js';
|
|
3
|
+
/**
|
|
4
|
+
* The static slice of a Lucid query-builder class we register onto: Adonis'
|
|
5
|
+
* `Macroable.macro(name, fn)` adds `fn` to the builder prototype so every query
|
|
6
|
+
* instance gains the method. Declared structurally so this module never
|
|
7
|
+
* hard-imports `@adonisjs/lucid` at runtime (the provider passes the real
|
|
8
|
+
* `ModelQueryBuilder` in) — matching how the rest of the package stays
|
|
9
|
+
* framework-free.
|
|
10
|
+
*/
|
|
11
|
+
export interface MacroableQueryBuilder {
|
|
12
|
+
macro(name: string, fn: (this: unknown, ...args: never[]) => unknown): void;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Register the chainable filter macros onto a Lucid query-builder class (the
|
|
16
|
+
* method-call form of {@link applyFilterFromRequest}). Call this from a provider's
|
|
17
|
+
* `boot()` with `ModelQueryBuilder` (from `@adonisjs/lucid/orm`); the
|
|
18
|
+
* `@adonis-agora/filter` provider does exactly that.
|
|
19
|
+
*
|
|
20
|
+
* Two macros are added:
|
|
21
|
+
*
|
|
22
|
+
* - `query.applyFilterFromRequest(spec, ctx, options?)` — applies the spec's
|
|
23
|
+
* server scope + allow-listed filter/sort/search and returns the query so it
|
|
24
|
+
* chains (`User.query().applyFilterFromRequest(spec, ctx).orderBy(...)`). The
|
|
25
|
+
* resolved pagination is dropped; use `filterPaginate` (or the free function)
|
|
26
|
+
* when you need it.
|
|
27
|
+
* - `query.filterPaginate(spec, ctx, options?)` — applies the same and then
|
|
28
|
+
* `paginate(page, size)` with the resolved pagination, returning Lucid's
|
|
29
|
+
* paginator (`await User.query().filterPaginate(spec, ctx)`).
|
|
30
|
+
*
|
|
31
|
+
* Idempotent enough to call once at boot; calling twice re-defines the macros to
|
|
32
|
+
* the same implementations.
|
|
33
|
+
*/
|
|
34
|
+
export declare function registerFilterMacros(ModelQueryBuilder: MacroableQueryBuilder): void;
|
|
35
|
+
declare module '@adonisjs/lucid/types/model' {
|
|
36
|
+
interface ModelQueryBuilderContract<Model extends LucidModel, Result = InstanceType<Model>> {
|
|
37
|
+
/**
|
|
38
|
+
* Apply a {@link FilterSpec} from the request context (server scope +
|
|
39
|
+
* allow-listed filter/sort/search) and return the query for chaining — the
|
|
40
|
+
* method form of the free `applyFilterFromRequest`. Pagination is resolved
|
|
41
|
+
* but not returned here; use {@link filterPaginate} when you need it.
|
|
42
|
+
*/
|
|
43
|
+
applyFilterFromRequest(spec: FilterSpec, ctx: FilterRequestContext | undefined, options?: ApplyFromRequestOptions): this;
|
|
44
|
+
/**
|
|
45
|
+
* Apply a {@link FilterSpec} from the request context and paginate with the
|
|
46
|
+
* resolved `{ page, size }`, returning Lucid's paginator — filter + paginate
|
|
47
|
+
* in one terminal call.
|
|
48
|
+
*/
|
|
49
|
+
filterPaginate(spec: FilterSpec, ctx: FilterRequestContext | undefined, options?: ApplyFromRequestOptions): ReturnType<this['paginate']>;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=lucid_macros.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lucid_macros.d.ts","sourceRoot":"","sources":["../../src/lucid_macros.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EAE1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD;;;;;;;GAOG;AACH,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,GAAG,IAAI,CAAC;CAC7E;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,oBAAoB,CAAC,iBAAiB,EAAE,qBAAqB,GAAG,IAAI,CAoBnF;AAED,OAAO,QAAQ,6BAA6B,CAAC;IAC3C,UAAU,yBAAyB,CAAC,KAAK,SAAS,UAAU,EAAE,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC;QACxF;;;;;WAKG;QACH,sBAAsB,CACpB,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,oBAAoB,GAAG,SAAS,EACrC,OAAO,CAAC,EAAE,uBAAuB,GAChC,IAAI,CAAC;QACR;;;;WAIG;QACH,cAAc,CACZ,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,oBAAoB,GAAG,SAAS,EACrC,OAAO,CAAC,EAAE,uBAAuB,GAChC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;KACjC;CACF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { applyFilterFromRequest, } from './apply_from_request.js';
|
|
2
|
+
/**
|
|
3
|
+
* Register the chainable filter macros onto a Lucid query-builder class (the
|
|
4
|
+
* method-call form of {@link applyFilterFromRequest}). Call this from a provider's
|
|
5
|
+
* `boot()` with `ModelQueryBuilder` (from `@adonisjs/lucid/orm`); the
|
|
6
|
+
* `@adonis-agora/filter` provider does exactly that.
|
|
7
|
+
*
|
|
8
|
+
* Two macros are added:
|
|
9
|
+
*
|
|
10
|
+
* - `query.applyFilterFromRequest(spec, ctx, options?)` — applies the spec's
|
|
11
|
+
* server scope + allow-listed filter/sort/search and returns the query so it
|
|
12
|
+
* chains (`User.query().applyFilterFromRequest(spec, ctx).orderBy(...)`). The
|
|
13
|
+
* resolved pagination is dropped; use `filterPaginate` (or the free function)
|
|
14
|
+
* when you need it.
|
|
15
|
+
* - `query.filterPaginate(spec, ctx, options?)` — applies the same and then
|
|
16
|
+
* `paginate(page, size)` with the resolved pagination, returning Lucid's
|
|
17
|
+
* paginator (`await User.query().filterPaginate(spec, ctx)`).
|
|
18
|
+
*
|
|
19
|
+
* Idempotent enough to call once at boot; calling twice re-defines the macros to
|
|
20
|
+
* the same implementations.
|
|
21
|
+
*/
|
|
22
|
+
export function registerFilterMacros(ModelQueryBuilder) {
|
|
23
|
+
ModelQueryBuilder.macro('applyFilterFromRequest', function (spec, ctx, options) {
|
|
24
|
+
applyFilterFromRequest(this, spec, ctx, options);
|
|
25
|
+
return this;
|
|
26
|
+
});
|
|
27
|
+
ModelQueryBuilder.macro('filterPaginate', function (spec, ctx, options) {
|
|
28
|
+
const { page, size } = applyFilterFromRequest(this, spec, ctx, options);
|
|
29
|
+
return this.paginate(page, size);
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=lucid_macros.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lucid_macros.js","sourceRoot":"","sources":["../../src/lucid_macros.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,sBAAsB,GACvB,MAAM,yBAAyB,CAAC;AAgBjC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,oBAAoB,CAAC,iBAAwC;IAC3E,iBAAiB,CAAC,KAAK,CAAC,wBAAwB,EAAE,UAEhD,IAAgB,EAChB,GAAqC,EACrC,OAAiC;QAEjC,sBAAsB,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAiD,CAAC,CAAC;IAEnD,iBAAiB,CAAC,KAAK,CAAC,gBAAgB,EAAE,UAExC,IAAgB,EAChB,GAAqC,EACrC,OAAiC;QAEjC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,sBAAsB,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnC,CAAiD,CAAC,CAAC;AACrD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adonis-agora/filter",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Server-side query filtering/sorting/pagination for AdonisJS — Spatie-style input, a Lucid adapter, and field allow-listing. Part of the Agora ecosystem.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -27,6 +27,11 @@
|
|
|
27
27
|
"types": "./dist/commands/main.d.ts",
|
|
28
28
|
"import": "./dist/commands/main.js",
|
|
29
29
|
"default": "./dist/commands/main.js"
|
|
30
|
+
},
|
|
31
|
+
"./filter_provider": {
|
|
32
|
+
"types": "./dist/providers/filter_provider.d.ts",
|
|
33
|
+
"import": "./dist/providers/filter_provider.js",
|
|
34
|
+
"default": "./dist/providers/filter_provider.js"
|
|
30
35
|
}
|
|
31
36
|
},
|
|
32
37
|
"files": [
|
|
@@ -36,15 +41,20 @@
|
|
|
36
41
|
],
|
|
37
42
|
"sideEffects": false,
|
|
38
43
|
"peerDependencies": {
|
|
39
|
-
"@adonisjs/core": "^7.3.0"
|
|
44
|
+
"@adonisjs/core": "^7.3.0",
|
|
45
|
+
"@adonisjs/lucid": "^22.0.0"
|
|
40
46
|
},
|
|
41
47
|
"peerDependenciesMeta": {
|
|
42
48
|
"@adonisjs/core": {
|
|
43
49
|
"optional": true
|
|
50
|
+
},
|
|
51
|
+
"@adonisjs/lucid": {
|
|
52
|
+
"optional": true
|
|
44
53
|
}
|
|
45
54
|
},
|
|
46
55
|
"devDependencies": {
|
|
47
56
|
"@adonisjs/core": "^7.3.0",
|
|
57
|
+
"@adonisjs/lucid": "22.4.2",
|
|
48
58
|
"@types/node": "^20.0.0",
|
|
49
59
|
"typescript": "^5.4.0",
|
|
50
60
|
"vitest": "^3.0.0"
|
|
@@ -66,6 +76,6 @@
|
|
|
66
76
|
"build": "tsc -p tsconfig.json",
|
|
67
77
|
"test": "vitest run --passWithNoTests",
|
|
68
78
|
"test:watch": "vitest",
|
|
69
|
-
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
79
|
+
"typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.typetest.json"
|
|
70
80
|
}
|
|
71
81
|
}
|