8000 fix: narrow filter subjects to return type · falcondev-oss/caps@5620a69 · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
8000

Commit 5620a69

Browse files
committed
fix: narrow filter subjects to return type
1 parent ca3b793 commit 5620a69

File tree

2 files changed

+28
-5
lines changed

2 files changed

+28
-5
lines changed

src/capabilties.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export interface ContextOptions {
1818
createError?: (args: { capability: string }) => unknown
1919
}
2020

21-
export function createActor<Actor>() {
21+
export function createActor<Actor extends object>() {
2222
return {
2323
build<D>(builder: (cap: ReturnType<typeof createCapability<Actor>>) => D) {
2424
return (actor: Actor, opts?: ContextOptions) => {
@@ -120,7 +120,7 @@ function createQuery<Actor, Subject, Capabilities extends string, Args>({
120120
})
121121
},
122122
}),
123-
subjects: (subjects: Subject[]) => ({
123+
subjects: <const S extends Subject>(subjects: S[]) => ({
124124
canSome: <Capability extends Capabilities>(
125125
capability: Capability,
126126
...args: HasArgs<Capability>
@@ -146,7 +146,7 @@ function createQuery<Actor, Subject, Capabilities extends string, Args>({
146146
},
147147
}
148148
},
149-
filter: <FilterCaps extends Capabilities>(
149+
filter: <const FilterCaps extends Capabilities>(
150150
capabilities: FilterCaps[],
151151
args: IfEmptyObject<Args, void, Partial<Args>>,
152152
) => {

tests/capabilities.test.ts

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import { describe, expect, expectTypeOf, test } from 'vitest'
1+
import { range } from 'remeda'
22

3-
import { arg, createActor } from '../src/'
3+
import { describe, expect, expectTypeOf, test } from 'vitest'
4+
import { arg, createActor, mode, type Modes } from '../src/'
45

56
test('minimal example', () => {
67
let i = 0
@@ -28,6 +29,28 @@ test('minimal example', () => {
2829
expect(caps.a.list()).toEqual(['yield', 'return'])
2930
})
3031

32+
test('modes', () => {
33+
const useActor = createActor().build((cap) => ({
34+
a: cap
35+
.subject<
36+
Modes<{
37+
a: { a: number }
38+
b: { b: number }
39+
}>
40+
>()
41+
.define(function* () {
42+
yield ['read']
43+
return []
44+
}),
45+
}))
46+
47+
const caps = useActor({})
48+
49+
const filtered = caps.a.subjects(range(1, 5).map((i) => mode('b', { b: i }))).filter(['read'])
50+
51+
expectTypeOf(filtered).toMatchTypeOf<{ b: number }[]>()
52+
})
53+
3154
describe('user management demo', () => {
3255
type Role = 'user' | 'moderator' | 'admin'
3356

0 commit comments

Comments
 (0)
0