@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.
Files changed (62) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +68 -0
  3. package/CLAUDE.md +21 -3
  4. package/dist/access/access-filter.d.ts +30 -118
  5. package/dist/access/access-filter.d.ts.map +1 -1
  6. package/dist/access/access-filter.js +70 -206
  7. package/dist/access/access-filter.js.map +1 -1
  8. package/dist/access/access-filter.test.js +148 -188
  9. package/dist/access/access-filter.test.js.map +1 -1
  10. package/dist/access/declared-dependencies.d.ts +66 -26
  11. package/dist/access/declared-dependencies.d.ts.map +1 -1
  12. package/dist/access/declared-dependencies.js +67 -17
  13. package/dist/access/declared-dependencies.js.map +1 -1
  14. package/dist/access/declared-dependencies.test.d.ts +2 -0
  15. package/dist/access/declared-dependencies.test.d.ts.map +1 -0
  16. package/dist/access/declared-dependencies.test.js +226 -0
  17. package/dist/access/declared-dependencies.test.js.map +1 -0
  18. package/dist/access/depth-limits.d.ts +8 -7
  19. package/dist/access/depth-limits.d.ts.map +1 -1
  20. package/dist/access/depth-limits.js +8 -7
  21. package/dist/access/depth-limits.js.map +1 -1
  22. package/dist/access/errors.d.ts +12 -8
  23. package/dist/access/errors.d.ts.map +1 -1
  24. package/dist/access/errors.js +16 -12
  25. package/dist/access/errors.js.map +1 -1
  26. package/dist/access/field-visibility.d.ts +2 -1
  27. package/dist/access/field-visibility.d.ts.map +1 -1
  28. package/dist/access/field-visibility.js +91 -17
  29. package/dist/access/field-visibility.js.map +1 -1
  30. package/dist/access/index.d.ts +1 -2
  31. package/dist/access/index.d.ts.map +1 -1
  32. package/dist/access/index.js +1 -1
  33. package/dist/access/index.js.map +1 -1
  34. package/dist/access/relationship-count.d.ts +1 -1
  35. package/dist/context/index.d.ts.map +1 -1
  36. package/dist/context/index.js +38 -27
  37. package/dist/context/index.js.map +1 -1
  38. package/dist/query/index.d.ts +29 -0
  39. package/dist/query/index.d.ts.map +1 -1
  40. package/dist/query/index.js +27 -0
  41. package/dist/query/index.js.map +1 -1
  42. package/dist/query/relationship-options.d.ts +1 -1
  43. package/dist/query/relationship-options.js +1 -1
  44. package/package.json +1 -1
  45. package/src/access/access-filter.test.ts +205 -275
  46. package/src/access/access-filter.ts +84 -267
  47. package/src/access/declared-dependencies.test.ts +277 -0
  48. package/src/access/declared-dependencies.ts +122 -37
  49. package/src/access/depth-limits.ts +8 -7
  50. package/src/access/errors.ts +16 -12
  51. package/src/access/field-visibility.ts +99 -14
  52. package/src/access/index.ts +1 -7
  53. package/src/access/relationship-count.ts +1 -1
  54. package/src/context/index.ts +52 -33
  55. package/src/query/index.ts +53 -0
  56. package/src/query/relationship-options.ts +1 -1
  57. package/tests/access-relationships.test.ts +18 -16
  58. package/tests/computed-field-selective-evaluation.test.ts +418 -0
  59. package/tests/context.test.ts +27 -0
  60. package/tests/needs-declared-dependencies.test.ts +7 -4
  61. package/tests/resolve-chain.test.ts +11 -11
  62. package/tsconfig.tsbuildinfo +1 -1
@@ -1,53 +1,34 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { buildIncludeWithAccessControl, mergeIncludeWithAccessControl, toPrismaInclude, } from './access-filter.js';
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 cyclic readable-relationship auto-include.
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
- * On a relationship graph that contains a cycle (A → B → C → A) the depth-first
9
- * auto-include used to descend the cycle on every branch to `MAX_DEPTH`, and
10
- * `mergeIncludeWithAccessControl` re-expanded any bare-`true` leaf back into that
11
- * same auto-include. The resulting include tree was deep/large enough to
12
- * stack-overflow downstream processing (the RSC serializer). The fix seeds a
13
- * cycle guard with the root list and stops the walk at cycle back-edges, so a
14
- * relation that closes a cycle comes back FLAT (own columns only).
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
- // A cyclic config: A → B → C → A (plus a scalar on each list).
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: chain,
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 merged tree actually carries the right `where` at a given hop
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
- lists[listName] = {
91
- fields,
92
- access: { operation: { query: i === 0 ? () => true : () => filter } },
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
- db: { provider: 'sqlite', url: 'file:./dev.db' },
97
- lists,
98
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- minimal config for unit test
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 caller `include` value selecting `next` `hops` more times beyond the
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) }` at the
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(merged, hops) {
113
- let current = merged;
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('buildIncludeWithAccessControlcyclic graph', () => {
123
- it('stops re-descending a relationship cycle instead of walking to MAX_DEPTH', async () => {
124
- const config = cyclicConfig();
125
- const result = await buildIncludeWithAccessControl(config.lists.A.fields, { session: null, context: makeContext() }, config, 0, ['A']);
126
- const include = toPrismaInclude(result);
127
- // A B → C, then C.a closes the cycle back to A → flat (no further nesting).
128
- expect(include).toEqual({
129
- b: { include: { c: { include: { a: true } } } },
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('buildAccessScopedIncludecaller-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
- Category: {
141
- fields: {
142
- name: { type: 'text' },
143
- parent: rel('Category.children'),
144
- children: rel('Category.parent', true),
145
- },
146
- access: { operation: { query: allowQuery } },
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 result = await buildIncludeWithAccessControl(config.lists.Category.fields, { session: null, context: makeContext() }, config, 0, ['Category']);
152
- const include = toPrismaInclude(result);
153
- // Both self-references come back flat — no infinite parent/children descent.
154
- expect(include).toEqual({ parent: true, children: true });
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
- describe('mergeIncludeWithAccessControl bare-true leaf on a cyclic graph', () => {
159
- it('does not re-expand a bare-true leaf beyond the cycle-bounded auto-include', async () => {
160
- const config = cyclicConfig();
161
- const accessControlledInclude = await buildIncludeWithAccessControl(config.lists.A.fields, { session: null, context: makeContext() }, config, 0, ['A']);
162
- // Caller asks for A b with a bare-`true` leaf. The merge must keep the
163
- // access-controlled (cycle-bounded) nested include rather than re-expanding
164
- // the leaf into an unbounded auto-include.
165
- const merged = mergeIncludeWithAccessControl({ b: true }, accessControlledInclude, config.lists.A.fields, config, 'A');
166
- expect(merged).toEqual({
167
- b: { include: { c: { include: { a: true } } } },
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
- // Still bounded to the acyclic path length.
170
- expect(includeDepth(merged)).toBeLessThanOrEqual(3);
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 the
175
- * access-controlled merge (issue #752). It only narrows the fetched rows and can
176
- * never widen past the access `where`, so the merge re-attaches it on top of the
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('mergeIncludeWithAccessControl — caller take on a to-many relation (issue #752)', () => {
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 accessControlledInclude = await buildIncludeWithAccessControl(config.lists.User.fields, { session: null, context: makeContext() }, config, 0, ['User']);
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
- // access-controlled include also auto-nests Post's `author` back-relation.
205
- expect(merged).toEqual({
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 accessControlledInclude = await buildIncludeWithAccessControl(config.lists.User.fields, { session: null, context: makeContext() }, config, 0, ['User']);
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(merged).toEqual({});
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 the fix introduces (ADR-0022): a caller include
228
- * one level past the cap throws, the same include one level shallower still
229
- * works, and an unrequested auto-include past the cap stays silent.
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('mergeIncludeWithAccessControl — fail-closed at the read-include depth cap (#830)', () => {
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 caller include reaches past the cap', async () => {
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 callerInclude = { next: nestedInclude(HOPS_AT_CAP) };
245
- expect(() => mergeIncludeWithAccessControl(callerInclude, accessControlledInclude, config.lists.L0.fields, config, 'L0')).toThrow(AccessScopeDepthExceededError);
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 caller include one level shallower than the cap', async () => {
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 callerInclude = { next: nestedInclude(HOPS_AT_CAP - 1) };
253
- // Must NOT throw this depth is within what the engine can scope.
254
- const merged = mergeIncludeWithAccessControl(callerInclude, accessControlledInclude, config.lists.L0.fields, config, 'L0');
255
- expect(includeDepth(merged)).toBe(HOPS_AT_CAP);
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 an ordinary read with no caller include, even on a deep schema', async () => {
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
- const result = await buildIncludeWithAccessControl(config.lists.L0.fields, { session: null, context: makeContext() }, config, 0, ['L0']);
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('a list with no relationships still passes the caller include through unchanged', async () => {
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 merged = mergeIncludeWithAccessControl({ someUnrelatedKey: true }, accessControlledInclude, config.lists.Leaf.fields, config, 'Leaf');
287
- expect(merged).toEqual({ someUnrelatedKey: true });
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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"}