@opensaas/stack-core 0.37.0 → 0.38.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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +68 -0
- package/CLAUDE.md +21 -3
- package/dist/access/access-filter.d.ts +30 -118
- package/dist/access/access-filter.d.ts.map +1 -1
- package/dist/access/access-filter.js +70 -206
- package/dist/access/access-filter.js.map +1 -1
- package/dist/access/access-filter.test.js +148 -188
- package/dist/access/access-filter.test.js.map +1 -1
- package/dist/access/declared-dependencies.d.ts +66 -26
- package/dist/access/declared-dependencies.d.ts.map +1 -1
- package/dist/access/declared-dependencies.js +67 -17
- package/dist/access/declared-dependencies.js.map +1 -1
- package/dist/access/declared-dependencies.test.d.ts +2 -0
- package/dist/access/declared-dependencies.test.d.ts.map +1 -0
- package/dist/access/declared-dependencies.test.js +226 -0
- package/dist/access/declared-dependencies.test.js.map +1 -0
- package/dist/access/depth-limits.d.ts +8 -7
- package/dist/access/depth-limits.d.ts.map +1 -1
- package/dist/access/depth-limits.js +8 -7
- package/dist/access/depth-limits.js.map +1 -1
- package/dist/access/errors.d.ts +12 -8
- package/dist/access/errors.d.ts.map +1 -1
- package/dist/access/errors.js +16 -12
- package/dist/access/errors.js.map +1 -1
- package/dist/access/field-visibility.d.ts +2 -1
- package/dist/access/field-visibility.d.ts.map +1 -1
- package/dist/access/field-visibility.js +91 -17
- package/dist/access/field-visibility.js.map +1 -1
- package/dist/access/index.d.ts +1 -2
- package/dist/access/index.d.ts.map +1 -1
- package/dist/access/index.js +1 -1
- package/dist/access/index.js.map +1 -1
- package/dist/access/relationship-count.d.ts +1 -1
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +38 -27
- package/dist/context/index.js.map +1 -1
- package/dist/query/index.d.ts +29 -0
- package/dist/query/index.d.ts.map +1 -1
- package/dist/query/index.js +27 -0
- package/dist/query/index.js.map +1 -1
- package/dist/query/relationship-options.d.ts +1 -1
- package/dist/query/relationship-options.js +1 -1
- package/package.json +1 -1
- package/src/access/access-filter.test.ts +205 -275
- package/src/access/access-filter.ts +84 -267
- package/src/access/declared-dependencies.test.ts +277 -0
- package/src/access/declared-dependencies.ts +122 -37
- package/src/access/depth-limits.ts +8 -7
- package/src/access/errors.ts +16 -12
- package/src/access/field-visibility.ts +99 -14
- package/src/access/index.ts +1 -7
- package/src/access/relationship-count.ts +1 -1
- package/src/context/index.ts +52 -33
- package/src/query/index.ts +53 -0
- package/src/query/relationship-options.ts +1 -1
- package/tests/access-relationships.test.ts +18 -16
- package/tests/computed-field-selective-evaluation.test.ts +418 -0
- package/tests/context.test.ts +27 -0
- package/tests/needs-declared-dependencies.test.ts +7 -4
- package/tests/resolve-chain.test.ts +11 -11
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1,53 +1,34 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import {
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { buildAccessScopedInclude } from './access-filter.js';
|
|
3
3
|
import { AccessScopeDepthExceededError } from './errors.js';
|
|
4
4
|
import { READ_INCLUDE_MAX_DEPTH } from './depth-limits.js';
|
|
5
5
|
/**
|
|
6
|
-
* Regression coverage for the
|
|
6
|
+
* Regression coverage for `buildAccessScopedInclude`, the caller-directed
|
|
7
|
+
* access-scoping walk introduced by ADR-0026. It replaces the old two-step
|
|
8
|
+
* "auto-walk every relationship of the list, then reconcile against whatever
|
|
9
|
+
* the caller asked for" pipeline (`buildIncludeWithAccessControl` +
|
|
10
|
+
* `mergeIncludeWithAccessControl`): the walk now recurses ONLY into the
|
|
11
|
+
* branches a request (`requestedInclude`) itself names, and never evaluates
|
|
12
|
+
* `query` access on a relation nobody asked for.
|
|
7
13
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
14
|
+
* The scenarios below carry forward the guarantees the old two-function
|
|
15
|
+
* pipeline encoded — #566 (caller include augments, never replaces, the
|
|
16
|
+
* access-controlled scope), #752 (a caller `take` survives the merge), #830
|
|
17
|
+
* (fail-closed past the read-include depth cap) — expressed against the new,
|
|
18
|
+
* single-function API. New coverage (the point of ADR-0026 itself): a
|
|
19
|
+
* relation the request doesn't name never has its list's `query` access
|
|
20
|
+
* invoked, and naming a relation fetches its own columns and stops (the "One
|
|
21
|
+
* hop" rule) at every level, not just the root.
|
|
15
22
|
*/
|
|
16
23
|
// A relationship field pointing at another list.
|
|
17
24
|
function rel(ref, many = false) {
|
|
18
25
|
return { type: 'relationship', ref, many };
|
|
19
26
|
}
|
|
20
|
-
|
|
21
|
-
function cyclicConfig() {
|
|
22
|
-
const allowQuery = () => true;
|
|
23
|
-
return {
|
|
24
|
-
db: { provider: 'sqlite', url: 'file:./dev.db' },
|
|
25
|
-
lists: {
|
|
26
|
-
A: {
|
|
27
|
-
fields: { name: { type: 'text' }, b: rel('B.a') },
|
|
28
|
-
access: { operation: { query: allowQuery } },
|
|
29
|
-
},
|
|
30
|
-
B: {
|
|
31
|
-
fields: { name: { type: 'text' }, c: rel('C.b') },
|
|
32
|
-
access: { operation: { query: allowQuery } },
|
|
33
|
-
},
|
|
34
|
-
C: {
|
|
35
|
-
fields: { name: { type: 'text' }, a: rel('A.c') },
|
|
36
|
-
access: { operation: { query: allowQuery } },
|
|
37
|
-
},
|
|
38
|
-
},
|
|
39
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- minimal config for unit test
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
function makeContext(resolveOutputDepth = 0) {
|
|
43
|
-
const chain = Array.from({ length: resolveOutputDepth }, (_, i) => ({
|
|
44
|
-
listKey: 'TestHook',
|
|
45
|
-
fieldKey: `hook${i}`,
|
|
46
|
-
}));
|
|
27
|
+
function makeContext() {
|
|
47
28
|
return {
|
|
48
29
|
session: null,
|
|
49
30
|
_isSudo: false,
|
|
50
|
-
_resolveOutputChain:
|
|
31
|
+
_resolveOutputChain: [],
|
|
51
32
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- minimal context for unit test
|
|
52
33
|
};
|
|
53
34
|
}
|
|
@@ -73,10 +54,13 @@ function includeDepth(include) {
|
|
|
73
54
|
// A straight-line chain of `count` lists, each with a scalar field and a
|
|
74
55
|
// single relationship to the next list: L0 → L1 → … → L(count-1). Every list
|
|
75
56
|
// past the root is query-scoped with a filter unique to it, so a test can
|
|
76
|
-
// assert the
|
|
77
|
-
// (not just that it happens not to throw).
|
|
57
|
+
// assert the scoped tree actually carries the right `where` at a given hop
|
|
58
|
+
// (not just that it happens not to throw). `access.operation.query` is a
|
|
59
|
+
// `vi.fn()` on every list so tests can additionally assert which lists' access
|
|
60
|
+
// functions were (or were not) invoked.
|
|
78
61
|
function chainConfig(count) {
|
|
79
62
|
const lists = {};
|
|
63
|
+
const queryFns = {};
|
|
80
64
|
for (let i = 0; i < count; i++) {
|
|
81
65
|
const listName = `L${i}`;
|
|
82
66
|
const fields = { name: { type: 'text' } };
|
|
@@ -87,21 +71,23 @@ function chainConfig(count) {
|
|
|
87
71
|
fields.prev = rel(`L${i - 1}.next`);
|
|
88
72
|
}
|
|
89
73
|
const filter = { ownerId: { equals: listName } };
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
};
|
|
74
|
+
const queryFn = vi.fn(i === 0 ? () => true : () => filter);
|
|
75
|
+
queryFns[listName] = queryFn;
|
|
76
|
+
lists[listName] = { fields, access: { operation: { query: queryFn } } };
|
|
94
77
|
}
|
|
95
78
|
return {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
79
|
+
config: {
|
|
80
|
+
db: { provider: 'sqlite', url: 'file:./dev.db' },
|
|
81
|
+
lists,
|
|
82
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- minimal config for unit test
|
|
83
|
+
},
|
|
84
|
+
queryFns,
|
|
99
85
|
};
|
|
100
86
|
}
|
|
101
|
-
// A
|
|
87
|
+
// A requested `include` value selecting `next` `hops` more times beyond the
|
|
102
88
|
// point at which this value is attached, ending in a bare `true` leaf. E.g.
|
|
103
|
-
// `nestedInclude(0) === true` (stop here); `{ next: nestedInclude(2) }`
|
|
104
|
-
// top level names 3 hops total (the outer `next` plus 2 more).
|
|
89
|
+
// `nestedInclude(0) === true` (stop here); `{ include: { next: nestedInclude(2) } }`
|
|
90
|
+
// at the top level names 3 hops total (the outer `next` plus 2 more).
|
|
105
91
|
function nestedInclude(hops) {
|
|
106
92
|
if (hops <= 0)
|
|
107
93
|
return true;
|
|
@@ -109,8 +95,8 @@ function nestedInclude(hops) {
|
|
|
109
95
|
}
|
|
110
96
|
// Read the `where` at the end of a chain of nested `next` includes (used to
|
|
111
97
|
// assert row-scoping survived down to a specific hop).
|
|
112
|
-
function whereAtHop(
|
|
113
|
-
let current =
|
|
98
|
+
function whereAtHop(scoped, hops) {
|
|
99
|
+
let current = scoped;
|
|
114
100
|
for (let i = 0; i < hops; i++) {
|
|
115
101
|
const entry = current?.next;
|
|
116
102
|
if (i === hops - 1)
|
|
@@ -119,66 +105,91 @@ function whereAtHop(merged, hops) {
|
|
|
119
105
|
}
|
|
120
106
|
return undefined;
|
|
121
107
|
}
|
|
122
|
-
describe('
|
|
123
|
-
it('
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
//
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
});
|
|
131
|
-
// Three distinct lists → depth 3, not the old MAX_DEPTH=5 (which on a cycle
|
|
132
|
-
// could recurse A→B→C→A→B).
|
|
133
|
-
expect(includeDepth(include)).toBe(3);
|
|
134
|
-
});
|
|
135
|
-
it('flattens a self-referential relationship to a single level', async () => {
|
|
136
|
-
const allowQuery = () => true;
|
|
108
|
+
describe('buildAccessScopedInclude — caller-directed walk (ADR-0026)', () => {
|
|
109
|
+
it('does not invoke query access on a relation the request never named', async () => {
|
|
110
|
+
// A → B, A → C (siblings). Requesting only `b` must never touch C's
|
|
111
|
+
// access function — the core guarantee #852 introduces: a request
|
|
112
|
+
// naming one relation no longer walks (and access-checks) every other
|
|
113
|
+
// relationship of the list.
|
|
114
|
+
const queryB = vi.fn(() => true);
|
|
115
|
+
const queryC = vi.fn(() => true);
|
|
137
116
|
const config = {
|
|
138
117
|
db: { provider: 'sqlite' },
|
|
139
118
|
lists: {
|
|
140
|
-
|
|
141
|
-
fields: {
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
},
|
|
146
|
-
access: { operation: { query:
|
|
119
|
+
A: {
|
|
120
|
+
fields: { b: rel('B.a'), c: rel('C.a') },
|
|
121
|
+
access: { operation: { query: () => true } },
|
|
122
|
+
},
|
|
123
|
+
B: {
|
|
124
|
+
fields: { name: { type: 'text' } },
|
|
125
|
+
access: { operation: { query: queryB } },
|
|
126
|
+
},
|
|
127
|
+
C: {
|
|
128
|
+
fields: { name: { type: 'text' } },
|
|
129
|
+
access: { operation: { query: queryC } },
|
|
147
130
|
},
|
|
148
131
|
},
|
|
149
132
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- minimal config for unit test
|
|
150
133
|
};
|
|
151
|
-
const
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
expect(
|
|
134
|
+
const include = await buildAccessScopedInclude({ b: true }, config.lists.A.fields, { session: null, context: makeContext() }, config, 'A');
|
|
135
|
+
expect(include).toEqual({ b: true });
|
|
136
|
+
expect(queryB).toHaveBeenCalledTimes(1);
|
|
137
|
+
expect(queryC).not.toHaveBeenCalled();
|
|
138
|
+
});
|
|
139
|
+
it("fetches a named relation's own columns and stops — does not auto-expand its subtree (One hop)", async () => {
|
|
140
|
+
const { config, queryFns } = chainConfig(4); // L0 → L1 → L2 → L3
|
|
141
|
+
const include = await buildAccessScopedInclude({ next: true }, config.lists.L0.fields, { session: null, context: makeContext() }, config, 'L0');
|
|
142
|
+
// L1 is fetched and where-scoped; L2/L3 are never reached because the
|
|
143
|
+
// request named `next` bare, with no nested `include` beneath it.
|
|
144
|
+
expect(include).toEqual({ next: { where: { ownerId: { equals: 'L1' } } } });
|
|
155
145
|
expect(includeDepth(include)).toBe(1);
|
|
146
|
+
expect(queryFns.L1).toHaveBeenCalledTimes(1);
|
|
147
|
+
expect(queryFns.L2).not.toHaveBeenCalled();
|
|
148
|
+
expect(queryFns.L3).not.toHaveBeenCalled();
|
|
156
149
|
});
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
150
|
+
it('scopes a nested path at every level the request names it', async () => {
|
|
151
|
+
const { config, queryFns } = chainConfig(4); // L0 → L1 → L2 → L3
|
|
152
|
+
const include = await buildAccessScopedInclude({ next: { include: { next: { include: { next: true } } } } }, config.lists.L0.fields, { session: null, context: makeContext() }, config, 'L0');
|
|
153
|
+
expect(include).toEqual({
|
|
154
|
+
next: {
|
|
155
|
+
where: { ownerId: { equals: 'L1' } },
|
|
156
|
+
include: {
|
|
157
|
+
next: {
|
|
158
|
+
where: { ownerId: { equals: 'L2' } },
|
|
159
|
+
include: { next: { where: { ownerId: { equals: 'L3' } } } },
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
},
|
|
168
163
|
});
|
|
169
|
-
|
|
170
|
-
expect(
|
|
164
|
+
expect(queryFns.L1).toHaveBeenCalledTimes(1);
|
|
165
|
+
expect(queryFns.L2).toHaveBeenCalledTimes(1);
|
|
166
|
+
expect(queryFns.L3).toHaveBeenCalledTimes(1);
|
|
167
|
+
});
|
|
168
|
+
it('scopes a full cyclic path exactly as requested, one hop stopping the cycle', async () => {
|
|
169
|
+
// A → B → C → A. The caller explicitly names the whole cyclic path; the
|
|
170
|
+
// walk simply follows the finite literal it was given (no cycle guard
|
|
171
|
+
// needed here — that only matters for the declared-dependency fold, see
|
|
172
|
+
// declared-dependencies.ts).
|
|
173
|
+
const allowQuery = () => true;
|
|
174
|
+
const config = {
|
|
175
|
+
db: { provider: 'sqlite' },
|
|
176
|
+
lists: {
|
|
177
|
+
A: { fields: { b: rel('B.a') }, access: { operation: { query: allowQuery } } },
|
|
178
|
+
B: { fields: { c: rel('C.b') }, access: { operation: { query: allowQuery } } },
|
|
179
|
+
C: { fields: { a: rel('A.c') }, access: { operation: { query: allowQuery } } },
|
|
180
|
+
},
|
|
181
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- minimal config for unit test
|
|
182
|
+
};
|
|
183
|
+
const include = await buildAccessScopedInclude({ b: { include: { c: { include: { a: true } } } } }, config.lists.A.fields, { session: null, context: makeContext() }, config, 'A');
|
|
184
|
+
expect(include).toEqual({ b: { include: { c: { include: { a: true } } } } });
|
|
171
185
|
});
|
|
172
186
|
});
|
|
173
187
|
/**
|
|
174
|
-
* A caller-supplied `take` on a to-many relation include must survive
|
|
175
|
-
*
|
|
176
|
-
*
|
|
177
|
-
* per-relation access filter — powering the item view's bounded relationship
|
|
178
|
-
* tables without dropping row-level access.
|
|
188
|
+
* A caller-supplied `take` on a to-many relation include must survive
|
|
189
|
+
* scoping (issue #752). It only narrows the fetched rows and can never widen
|
|
190
|
+
* past the access `where`, so it rides on top of the access filter unchanged.
|
|
179
191
|
*/
|
|
180
|
-
describe('
|
|
181
|
-
// A one-list config whose `posts` to-many is query-scoped by an access filter.
|
|
192
|
+
describe('buildAccessScopedInclude — caller take on a to-many relation (issue #752)', () => {
|
|
182
193
|
function scopedConfig() {
|
|
183
194
|
return {
|
|
184
195
|
db: { provider: 'sqlite' },
|
|
@@ -189,7 +200,6 @@ describe('mergeIncludeWithAccessControl — caller take on a to-many relation (i
|
|
|
189
200
|
},
|
|
190
201
|
Post: {
|
|
191
202
|
fields: { title: { type: 'text' }, author: rel('User.posts') },
|
|
192
|
-
// Scoped read access → the merge must fold this into the relation include.
|
|
193
203
|
access: { operation: { query: () => ({ published: { equals: true } }) } },
|
|
194
204
|
},
|
|
195
205
|
},
|
|
@@ -198,77 +208,70 @@ describe('mergeIncludeWithAccessControl — caller take on a to-many relation (i
|
|
|
198
208
|
}
|
|
199
209
|
it('preserves the take and AND-combines it with the access where', async () => {
|
|
200
210
|
const config = scopedConfig();
|
|
201
|
-
const
|
|
202
|
-
const merged = mergeIncludeWithAccessControl({ posts: { take: 10 } }, accessControlledInclude, config.lists.User.fields, config, 'User');
|
|
211
|
+
const include = await buildAccessScopedInclude({ posts: { take: 10 } }, config.lists.User.fields, { session: null, context: makeContext() }, config, 'User');
|
|
203
212
|
// The bound rides on top of the access filter — neither is dropped. The
|
|
204
|
-
//
|
|
205
|
-
|
|
213
|
+
// Post→author back-relation is NOT auto-nested (One hop, ADR-0026) since
|
|
214
|
+
// the request didn't name it.
|
|
215
|
+
expect(include).toEqual({
|
|
206
216
|
posts: {
|
|
207
217
|
where: { published: { equals: true } },
|
|
208
|
-
include: { author: true },
|
|
209
218
|
take: 10,
|
|
210
219
|
},
|
|
211
220
|
});
|
|
212
221
|
});
|
|
213
222
|
it('drops a take for a relation whose query access is denied', async () => {
|
|
214
223
|
const config = scopedConfig();
|
|
215
|
-
// Deny Post reads entirely.
|
|
216
224
|
config.lists.Post.access = { operation: { query: () => false } };
|
|
217
|
-
const
|
|
218
|
-
const merged = mergeIncludeWithAccessControl({ posts: { take: 10 } }, accessControlledInclude, config.lists.User.fields, config, 'User');
|
|
225
|
+
const include = await buildAccessScopedInclude({ posts: { take: 10 } }, config.lists.User.fields, { session: null, context: makeContext() }, config, 'User');
|
|
219
226
|
// A denied relation is dropped wholesale — the take cannot resurrect it.
|
|
220
|
-
expect(
|
|
227
|
+
expect(include).toEqual({});
|
|
221
228
|
});
|
|
222
229
|
});
|
|
223
230
|
/**
|
|
224
231
|
* Regression coverage for issue #830: the read pipeline used to FAIL OPEN past
|
|
225
232
|
* `READ_INCLUDE_MAX_DEPTH` — a caller-supplied `include` nested deeper than the
|
|
226
233
|
* engine could scope was passed through unscoped rather than denied. These
|
|
227
|
-
* tests pin the exact boundary
|
|
228
|
-
* one level past the cap throws, the same
|
|
229
|
-
* works, and
|
|
234
|
+
* tests pin the exact boundary ADR-0022 introduced and ADR-0026 preserves: a
|
|
235
|
+
* request one level past the cap throws, the same request one level
|
|
236
|
+
* shallower still works, and a request that never reaches the cap is
|
|
237
|
+
* unaffected.
|
|
230
238
|
*/
|
|
231
|
-
describe('
|
|
232
|
-
// A relation `hops` hops from the root sits AT the cap boundary (correctly
|
|
233
|
-
// where-scoped, matching the triage report's "F" list); one hop further is
|
|
234
|
-
// the first one the engine cannot scope ("G"). With
|
|
235
|
-
// READ_INCLUDE_MAX_DEPTH = 5 that boundary is hop 5 / hop 6.
|
|
239
|
+
describe('buildAccessScopedInclude — fail-closed at the read-include depth cap (#830)', () => {
|
|
236
240
|
const HOPS_AT_CAP = READ_INCLUDE_MAX_DEPTH;
|
|
237
|
-
it('throws AccessScopeDepthExceededError when the
|
|
238
|
-
// L0 → L1 → … → L6 (one more list than HOPS_AT_CAP + 1) so a caller
|
|
239
|
-
// include can walk `next` one hop past the boundary.
|
|
241
|
+
it('throws AccessScopeDepthExceededError when the request reaches past the cap', async () => {
|
|
240
242
|
const chainLength = HOPS_AT_CAP + 2;
|
|
241
|
-
const config = chainConfig(chainLength);
|
|
242
|
-
const accessControlledInclude = await buildIncludeWithAccessControl(config.lists.L0.fields, { session: null, context: makeContext() }, config, 0, ['L0']);
|
|
243
|
+
const { config } = chainConfig(chainLength);
|
|
243
244
|
// Outer `next` (hop 1) + nestedInclude(HOPS_AT_CAP) (HOPS_AT_CAP more) = HOPS_AT_CAP + 1 hops.
|
|
244
|
-
const
|
|
245
|
-
expect((
|
|
245
|
+
const requested = { next: nestedInclude(HOPS_AT_CAP) };
|
|
246
|
+
await expect(buildAccessScopedInclude(requested, config.lists.L0.fields, { session: null, context: makeContext() }, config, 'L0')).rejects.toThrow(AccessScopeDepthExceededError);
|
|
247
|
+
});
|
|
248
|
+
it('describes a cost refusal, not an inability to scope', async () => {
|
|
249
|
+
const chainLength = HOPS_AT_CAP + 2;
|
|
250
|
+
const { config } = chainConfig(chainLength);
|
|
251
|
+
const requested = { next: nestedInclude(HOPS_AT_CAP) };
|
|
252
|
+
await expect(buildAccessScopedInclude(requested, config.lists.L0.fields, { session: null, context: makeContext() }, config, 'L0')).rejects.toThrow(/cost limit/);
|
|
246
253
|
});
|
|
247
|
-
it('still row-scopes a
|
|
254
|
+
it('still row-scopes a request one level shallower than the cap', async () => {
|
|
248
255
|
const chainLength = HOPS_AT_CAP + 1;
|
|
249
|
-
const config = chainConfig(chainLength);
|
|
250
|
-
const accessControlledInclude = await buildIncludeWithAccessControl(config.lists.L0.fields, { session: null, context: makeContext() }, config, 0, ['L0']);
|
|
256
|
+
const { config } = chainConfig(chainLength);
|
|
251
257
|
// Outer `next` (hop 1) + nestedInclude(HOPS_AT_CAP - 1) = HOPS_AT_CAP hops total — right at the boundary.
|
|
252
|
-
const
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
expect(
|
|
256
|
-
// The last list in the chain (at the boundary) is genuinely row-scoped —
|
|
257
|
-
// not just present without a throw.
|
|
258
|
-
expect(whereAtHop(merged, HOPS_AT_CAP)).toEqual({ ownerId: { equals: `L${HOPS_AT_CAP}` } });
|
|
258
|
+
const requested = { next: nestedInclude(HOPS_AT_CAP - 1) };
|
|
259
|
+
const include = await buildAccessScopedInclude(requested, config.lists.L0.fields, { session: null, context: makeContext() }, config, 'L0');
|
|
260
|
+
expect(includeDepth(include)).toBe(HOPS_AT_CAP);
|
|
261
|
+
expect(whereAtHop(include, HOPS_AT_CAP)).toEqual({ ownerId: { equals: `L${HOPS_AT_CAP}` } });
|
|
259
262
|
});
|
|
260
|
-
it('does not throw for
|
|
261
|
-
// No caller include at all — the auto-include just stops at the cap
|
|
262
|
-
// silently. This must never throw; only an EXPLICIT caller selection past
|
|
263
|
-
// the cap is a denial.
|
|
263
|
+
it('does not throw for a request that never reaches the cap', async () => {
|
|
264
264
|
const chainLength = HOPS_AT_CAP + 3;
|
|
265
|
-
const config = chainConfig(chainLength);
|
|
266
|
-
|
|
267
|
-
expect(() => toPrismaInclude(result)).not.toThrow();
|
|
268
|
-
const include = toPrismaInclude(result);
|
|
269
|
-
expect(includeDepth(include)).toBeLessThanOrEqual(HOPS_AT_CAP);
|
|
265
|
+
const { config } = chainConfig(chainLength);
|
|
266
|
+
await expect(buildAccessScopedInclude({ next: true }, config.lists.L0.fields, { session: null, context: makeContext() }, config, 'L0')).resolves.not.toThrow();
|
|
270
267
|
});
|
|
271
|
-
it('
|
|
268
|
+
it('an empty request never throws, even on a deep schema', async () => {
|
|
269
|
+
const chainLength = HOPS_AT_CAP + 3;
|
|
270
|
+
const { config } = chainConfig(chainLength);
|
|
271
|
+
const include = await buildAccessScopedInclude({}, config.lists.L0.fields, { session: null, context: makeContext() }, config, 'L0');
|
|
272
|
+
expect(include).toEqual({});
|
|
273
|
+
});
|
|
274
|
+
it('a list with no relationships passes an unrelated requested key through unchanged', async () => {
|
|
272
275
|
const config = {
|
|
273
276
|
db: { provider: 'sqlite' },
|
|
274
277
|
lists: {
|
|
@@ -279,53 +282,10 @@ describe('mergeIncludeWithAccessControl — fail-closed at the read-include dept
|
|
|
279
282
|
},
|
|
280
283
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- minimal config for unit test
|
|
281
284
|
};
|
|
282
|
-
const accessControlledInclude = await buildIncludeWithAccessControl(config.lists.Leaf.fields, { session: null, context: makeContext() }, config, 0, ['Leaf']);
|
|
283
|
-
expect(accessControlledInclude).toEqual({ kind: 'nothing-to-scope' });
|
|
284
285
|
// An arbitrary (non-declared-relationship) key passed through unchanged —
|
|
285
286
|
// access control does not govern keys it doesn't recognize as relationships.
|
|
286
|
-
const
|
|
287
|
-
expect(
|
|
288
|
-
});
|
|
289
|
-
});
|
|
290
|
-
/**
|
|
291
|
-
* Regression coverage for the resolveOutput/virtual-field trigger of #830: a
|
|
292
|
-
* read issued from inside a resolveOutput hook used to lose relation row
|
|
293
|
-
* scoping ENTIRELY (whole-object passthrough) rather than scoping the
|
|
294
|
-
* immediate relation and simply not auto-expanding further. The loop guard
|
|
295
|
-
* that motivated the original passthrough (hooks making DB queries that
|
|
296
|
-
* include relationships back to the same entity) must still hold.
|
|
297
|
-
*/
|
|
298
|
-
describe('buildIncludeWithAccessControl — inside a resolveOutput context', () => {
|
|
299
|
-
it('scopes the immediate relation with its access where but does not auto-expand nested relations', async () => {
|
|
300
|
-
const config = chainConfig(4); // L0 → L1 → L2 → L3
|
|
301
|
-
config.lists.L1.access = { operation: { query: () => ({ tenantId: { equals: 'mine' } }) } };
|
|
302
|
-
const result = await buildIncludeWithAccessControl(config.lists.L0.fields, { session: null, context: makeContext(1) }, // depth > 0 → inside resolveOutput
|
|
303
|
-
config, 0, ['L0']);
|
|
304
|
-
expect(result.kind).toBe('scoped');
|
|
305
|
-
const include = toPrismaInclude(result);
|
|
306
|
-
// L1's own access `where` is applied...
|
|
307
|
-
expect(include).toEqual({ next: { where: { tenantId: { equals: 'mine' } } } });
|
|
308
|
-
// ...but L1's own nested relations (`next` → L2) are NOT auto-included.
|
|
309
|
-
expect(includeDepth(include)).toBe(1);
|
|
310
|
-
});
|
|
311
|
-
it('terminates on a self-referential relationship instead of looping', async () => {
|
|
312
|
-
const config = {
|
|
313
|
-
db: { provider: 'sqlite' },
|
|
314
|
-
lists: {
|
|
315
|
-
Category: {
|
|
316
|
-
fields: {
|
|
317
|
-
name: { type: 'text' },
|
|
318
|
-
parent: rel('Category.children'),
|
|
319
|
-
children: rel('Category.parent', true),
|
|
320
|
-
},
|
|
321
|
-
access: { operation: { query: () => true } },
|
|
322
|
-
},
|
|
323
|
-
},
|
|
324
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- minimal config for unit test
|
|
325
|
-
};
|
|
326
|
-
const result = await buildIncludeWithAccessControl(config.lists.Category.fields, { session: null, context: makeContext(1) }, config, 0, ['Category']);
|
|
327
|
-
const include = toPrismaInclude(result);
|
|
328
|
-
expect(include).toEqual({ parent: true, children: true });
|
|
287
|
+
const include = await buildAccessScopedInclude({ someUnrelatedKey: true }, config.lists.Leaf.fields, { session: null, context: makeContext() }, config, 'Leaf');
|
|
288
|
+
expect(include).toEqual({ someUnrelatedKey: true });
|
|
329
289
|
});
|
|
330
290
|
});
|
|
331
291
|
//# sourceMappingURL=access-filter.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"access-filter.test.js","sourceRoot":"","sources":["../../src/access/access-filter.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"access-filter.test.js","sourceRoot":"","sources":["../../src/access/access-filter.test.ts"],"names":[],"mappings":"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"}
|