@opensaas/stack-core 0.39.2 → 0.40.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 +150 -0
- package/CLAUDE.md +51 -0
- package/dist/access/access-filter.d.ts +83 -10
- package/dist/access/access-filter.d.ts.map +1 -1
- package/dist/access/access-filter.js +139 -18
- package/dist/access/access-filter.js.map +1 -1
- package/dist/access/access-filter.test.js +224 -12
- package/dist/access/access-filter.test.js.map +1 -1
- package/dist/access/engine.d.ts +43 -1
- package/dist/access/engine.d.ts.map +1 -1
- package/dist/access/engine.js +58 -0
- package/dist/access/engine.js.map +1 -1
- package/dist/access/engine.test.d.ts +2 -0
- package/dist/access/engine.test.d.ts.map +1 -0
- package/dist/access/engine.test.js +56 -0
- package/dist/access/engine.test.js.map +1 -0
- package/dist/access/errors.d.ts +28 -0
- package/dist/access/errors.d.ts.map +1 -1
- package/dist/access/errors.js +38 -2
- package/dist/access/errors.js.map +1 -1
- package/dist/access/field-access.d.ts +12 -0
- package/dist/access/field-access.d.ts.map +1 -1
- package/dist/access/field-access.js +22 -2
- package/dist/access/field-access.js.map +1 -1
- package/dist/access/field-access.test.js +66 -0
- package/dist/access/field-access.test.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 +45 -3
- package/dist/access/field-visibility.js.map +1 -1
- package/dist/access/index.d.ts +5 -2
- package/dist/access/index.d.ts.map +1 -1
- package/dist/access/index.js +4 -2
- package/dist/access/index.js.map +1 -1
- package/dist/config/types.d.ts +76 -10
- package/dist/config/types.d.ts.map +1 -1
- package/dist/context/index.d.ts +19 -1
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +61 -17
- package/dist/context/index.js.map +1 -1
- package/dist/context/nested-operations.d.ts.map +1 -1
- package/dist/context/nested-operations.js +54 -13
- package/dist/context/nested-operations.js.map +1 -1
- package/dist/context/write-pipeline.d.ts +3 -2
- package/dist/context/write-pipeline.d.ts.map +1 -1
- package/dist/context/write-pipeline.js +8 -5
- package/dist/context/write-pipeline.js.map +1 -1
- package/dist/fields/index.d.ts +13 -1
- package/dist/fields/index.d.ts.map +1 -1
- package/dist/fields/index.js +50 -5
- package/dist/fields/index.js.map +1 -1
- package/dist/fields/relationship-foreign-key.test.d.ts +2 -0
- package/dist/fields/relationship-foreign-key.test.d.ts.map +1 -0
- package/dist/fields/relationship-foreign-key.test.js +18 -0
- package/dist/fields/relationship-foreign-key.test.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/case-utils.d.ts +15 -0
- package/dist/lib/case-utils.d.ts.map +1 -1
- package/dist/lib/case-utils.js +21 -0
- package/dist/lib/case-utils.js.map +1 -1
- package/dist/lib/case-utils.test.js +23 -1
- package/dist/lib/case-utils.test.js.map +1 -1
- package/dist/lib/prisma-errors.d.ts +38 -0
- package/dist/lib/prisma-errors.d.ts.map +1 -0
- package/dist/lib/prisma-errors.js +53 -0
- package/dist/lib/prisma-errors.js.map +1 -0
- package/dist/mcp/constants.d.ts +23 -0
- package/dist/mcp/constants.d.ts.map +1 -0
- package/dist/mcp/constants.js +23 -0
- package/dist/mcp/constants.js.map +1 -0
- package/dist/mcp/field-schema.d.ts +8 -0
- package/dist/mcp/field-schema.d.ts.map +1 -0
- package/dist/mcp/field-schema.js +69 -0
- package/dist/mcp/field-schema.js.map +1 -0
- package/dist/mcp/handler.d.ts.map +1 -1
- package/dist/mcp/handler.js +76 -90
- package/dist/mcp/handler.js.map +1 -1
- package/dist/mcp/projection.d.ts +62 -0
- package/dist/mcp/projection.d.ts.map +1 -0
- package/dist/mcp/projection.js +390 -0
- package/dist/mcp/projection.js.map +1 -0
- package/dist/utils/password.d.ts +3 -1
- package/dist/utils/password.d.ts.map +1 -1
- package/dist/utils/password.js +4 -2
- package/dist/utils/password.js.map +1 -1
- package/package.json +1 -1
- package/src/access/access-filter.test.ts +278 -12
- package/src/access/access-filter.ts +207 -19
- package/src/access/engine.test.ts +67 -0
- package/src/access/engine.ts +81 -1
- package/src/access/errors.ts +42 -2
- package/src/access/field-access.test.ts +78 -0
- package/src/access/field-access.ts +34 -2
- package/src/access/field-visibility.ts +75 -10
- package/src/access/index.ts +14 -0
- package/src/config/types.ts +76 -10
- package/src/context/index.ts +95 -15
- package/src/context/nested-operations.ts +61 -16
- package/src/context/write-pipeline.ts +8 -4
- package/src/fields/index.ts +55 -5
- package/src/fields/relationship-foreign-key.test.ts +29 -0
- package/src/index.ts +17 -1
- package/src/lib/case-utils.test.ts +32 -0
- package/src/lib/case-utils.ts +26 -0
- package/src/lib/prisma-errors.ts +86 -0
- package/src/mcp/constants.ts +24 -0
- package/src/mcp/field-schema.ts +84 -0
- package/src/mcp/handler.ts +109 -107
- package/src/mcp/projection.ts +497 -0
- package/src/utils/password.ts +5 -3
- package/tests/access-relationships.test.ts +3 -3
- package/tests/access.test.ts +83 -0
- package/tests/context.test.ts +259 -12
- package/tests/field-types.test.ts +113 -0
- package/tests/mcp-fields-projection-access.test.ts +250 -0
- package/tests/mcp-handler.test.ts +695 -4
- package/tests/nested-access-and-hooks.test.ts +65 -0
- package/tests/nested-write-synthetic-relation.test.ts +437 -0
- package/tests/password-types.test.ts +28 -0
- package/tests/password.test.ts +16 -2
- package/tests/prisma-errors.test.ts +141 -0
- package/tests/singleton.test.ts +9 -1
- package/tests/to-one-include-access-filter.test.ts +172 -0
- package/tests/with-session.test.ts +243 -0
- package/tests/write-pipeline.test.ts +29 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
import { buildAccessScopedInclude } from './access-filter.js';
|
|
2
|
+
import { buildAccessScopedInclude, resolveToOneAccessVisibility } from './access-filter.js';
|
|
3
3
|
import { AccessScopeDepthExceededError } from './errors.js';
|
|
4
4
|
import { READ_INCLUDE_MAX_DEPTH } from './depth-limits.js';
|
|
5
5
|
/**
|
|
@@ -19,6 +19,14 @@ import { READ_INCLUDE_MAX_DEPTH } from './depth-limits.js';
|
|
|
19
19
|
* relation the request doesn't name never has its list's `query` access
|
|
20
20
|
* invoked, and naming a relation fetches its own columns and stops (the "One
|
|
21
21
|
* hop" rule) at every level, not just the root.
|
|
22
|
+
*
|
|
23
|
+
* The scenarios in this file build every chain relation as to-MANY
|
|
24
|
+
* (`rel(ref, true)`), so `where`-in-`include` keeps meaning what it always
|
|
25
|
+
* has here — the walk-depth/caller-directed logic under test is arity-
|
|
26
|
+
* agnostic. The to-one-specific behavior this function grew for issue #974
|
|
27
|
+
* (a `where` on a to-one include is not something Prisma accepts, so it's
|
|
28
|
+
* recorded in `toOneAccessFilters` instead and resolved post-query by
|
|
29
|
+
* `resolveToOneAccessVisibility`) has its own dedicated describe blocks below.
|
|
22
30
|
*/
|
|
23
31
|
// A relationship field pointing at another list.
|
|
24
32
|
function rel(ref, many = false) {
|
|
@@ -65,10 +73,10 @@ function chainConfig(count) {
|
|
|
65
73
|
const listName = `L${i}`;
|
|
66
74
|
const fields = { name: { type: 'text' } };
|
|
67
75
|
if (i < count - 1) {
|
|
68
|
-
fields.next = rel(`L${i + 1}.prev
|
|
76
|
+
fields.next = rel(`L${i + 1}.prev`, true);
|
|
69
77
|
}
|
|
70
78
|
if (i > 0) {
|
|
71
|
-
fields.prev = rel(`L${i - 1}.next
|
|
79
|
+
fields.prev = rel(`L${i - 1}.next`, true);
|
|
72
80
|
}
|
|
73
81
|
const filter = { ownerId: { equals: listName } };
|
|
74
82
|
const queryFn = vi.fn(i === 0 ? () => true : () => filter);
|
|
@@ -131,14 +139,14 @@ describe('buildAccessScopedInclude — caller-directed walk (ADR-0026)', () => {
|
|
|
131
139
|
},
|
|
132
140
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- minimal config for unit test
|
|
133
141
|
};
|
|
134
|
-
const include = await buildAccessScopedInclude({ b: true }, config.lists.A.fields, { session: null, context: makeContext() }, config, 'A');
|
|
142
|
+
const { include } = await buildAccessScopedInclude({ b: true }, config.lists.A.fields, { session: null, context: makeContext() }, config, 'A');
|
|
135
143
|
expect(include).toEqual({ b: true });
|
|
136
144
|
expect(queryB).toHaveBeenCalledTimes(1);
|
|
137
145
|
expect(queryC).not.toHaveBeenCalled();
|
|
138
146
|
});
|
|
139
147
|
it("fetches a named relation's own columns and stops — does not auto-expand its subtree (One hop)", async () => {
|
|
140
148
|
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');
|
|
149
|
+
const { include } = await buildAccessScopedInclude({ next: true }, config.lists.L0.fields, { session: null, context: makeContext() }, config, 'L0');
|
|
142
150
|
// L1 is fetched and where-scoped; L2/L3 are never reached because the
|
|
143
151
|
// request named `next` bare, with no nested `include` beneath it.
|
|
144
152
|
expect(include).toEqual({ next: { where: { ownerId: { equals: 'L1' } } } });
|
|
@@ -149,7 +157,7 @@ describe('buildAccessScopedInclude — caller-directed walk (ADR-0026)', () => {
|
|
|
149
157
|
});
|
|
150
158
|
it('scopes a nested path at every level the request names it', async () => {
|
|
151
159
|
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');
|
|
160
|
+
const { include } = await buildAccessScopedInclude({ next: { include: { next: { include: { next: true } } } } }, config.lists.L0.fields, { session: null, context: makeContext() }, config, 'L0');
|
|
153
161
|
expect(include).toEqual({
|
|
154
162
|
next: {
|
|
155
163
|
where: { ownerId: { equals: 'L1' } },
|
|
@@ -180,7 +188,7 @@ describe('buildAccessScopedInclude — caller-directed walk (ADR-0026)', () => {
|
|
|
180
188
|
},
|
|
181
189
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- minimal config for unit test
|
|
182
190
|
};
|
|
183
|
-
const include = await buildAccessScopedInclude({ b: { include: { c: { include: { a: true } } } } }, config.lists.A.fields, { session: null, context: makeContext() }, config, 'A');
|
|
191
|
+
const { include } = await buildAccessScopedInclude({ b: { include: { c: { include: { a: true } } } } }, config.lists.A.fields, { session: null, context: makeContext() }, config, 'A');
|
|
184
192
|
expect(include).toEqual({ b: { include: { c: { include: { a: true } } } } });
|
|
185
193
|
});
|
|
186
194
|
});
|
|
@@ -208,7 +216,7 @@ describe('buildAccessScopedInclude — caller take on a to-many relation (issue
|
|
|
208
216
|
}
|
|
209
217
|
it('preserves the take and AND-combines it with the access where', async () => {
|
|
210
218
|
const config = scopedConfig();
|
|
211
|
-
const include = await buildAccessScopedInclude({ posts: { take: 10 } }, config.lists.User.fields, { session: null, context: makeContext() }, config, 'User');
|
|
219
|
+
const { include } = await buildAccessScopedInclude({ posts: { take: 10 } }, config.lists.User.fields, { session: null, context: makeContext() }, config, 'User');
|
|
212
220
|
// The bound rides on top of the access filter — neither is dropped. The
|
|
213
221
|
// Post→author back-relation is NOT auto-nested (One hop, ADR-0026) since
|
|
214
222
|
// the request didn't name it.
|
|
@@ -222,7 +230,7 @@ describe('buildAccessScopedInclude — caller take on a to-many relation (issue
|
|
|
222
230
|
it('drops a take for a relation whose query access is denied', async () => {
|
|
223
231
|
const config = scopedConfig();
|
|
224
232
|
config.lists.Post.access = { operation: { query: () => false } };
|
|
225
|
-
const include = await buildAccessScopedInclude({ posts: { take: 10 } }, config.lists.User.fields, { session: null, context: makeContext() }, config, 'User');
|
|
233
|
+
const { include } = await buildAccessScopedInclude({ posts: { take: 10 } }, config.lists.User.fields, { session: null, context: makeContext() }, config, 'User');
|
|
226
234
|
// A denied relation is dropped wholesale — the take cannot resurrect it.
|
|
227
235
|
expect(include).toEqual({});
|
|
228
236
|
});
|
|
@@ -256,7 +264,7 @@ describe('buildAccessScopedInclude — fail-closed at the read-include depth cap
|
|
|
256
264
|
const { config } = chainConfig(chainLength);
|
|
257
265
|
// Outer `next` (hop 1) + nestedInclude(HOPS_AT_CAP - 1) = HOPS_AT_CAP hops total — right at the boundary.
|
|
258
266
|
const requested = { next: nestedInclude(HOPS_AT_CAP - 1) };
|
|
259
|
-
const include = await buildAccessScopedInclude(requested, config.lists.L0.fields, { session: null, context: makeContext() }, config, 'L0');
|
|
267
|
+
const { include } = await buildAccessScopedInclude(requested, config.lists.L0.fields, { session: null, context: makeContext() }, config, 'L0');
|
|
260
268
|
expect(includeDepth(include)).toBe(HOPS_AT_CAP);
|
|
261
269
|
expect(whereAtHop(include, HOPS_AT_CAP)).toEqual({ ownerId: { equals: `L${HOPS_AT_CAP}` } });
|
|
262
270
|
});
|
|
@@ -268,7 +276,7 @@ describe('buildAccessScopedInclude — fail-closed at the read-include depth cap
|
|
|
268
276
|
it('an empty request never throws, even on a deep schema', async () => {
|
|
269
277
|
const chainLength = HOPS_AT_CAP + 3;
|
|
270
278
|
const { config } = chainConfig(chainLength);
|
|
271
|
-
const include = await buildAccessScopedInclude({}, config.lists.L0.fields, { session: null, context: makeContext() }, config, 'L0');
|
|
279
|
+
const { include } = await buildAccessScopedInclude({}, config.lists.L0.fields, { session: null, context: makeContext() }, config, 'L0');
|
|
272
280
|
expect(include).toEqual({});
|
|
273
281
|
});
|
|
274
282
|
it('a list with no relationships passes an unrelated requested key through unchanged', async () => {
|
|
@@ -284,8 +292,212 @@ describe('buildAccessScopedInclude — fail-closed at the read-include depth cap
|
|
|
284
292
|
};
|
|
285
293
|
// An arbitrary (non-declared-relationship) key passed through unchanged —
|
|
286
294
|
// access control does not govern keys it doesn't recognize as relationships.
|
|
287
|
-
const include = await buildAccessScopedInclude({ someUnrelatedKey: true }, config.lists.Leaf.fields, { session: null, context: makeContext() }, config, 'Leaf');
|
|
295
|
+
const { include } = await buildAccessScopedInclude({ someUnrelatedKey: true }, config.lists.Leaf.fields, { session: null, context: makeContext() }, config, 'Leaf');
|
|
288
296
|
expect(include).toEqual({ someUnrelatedKey: true });
|
|
289
297
|
});
|
|
290
298
|
});
|
|
299
|
+
/**
|
|
300
|
+
* Regression coverage for issue #974: Prisma accepts a nested `where` on an
|
|
301
|
+
* `include` entry only for a to-many relation — the same shape on a to-one
|
|
302
|
+
* relation raises `PrismaClientValidationError`. `buildAccessScopedInclude`
|
|
303
|
+
* must never attach one for a to-one relation, whatever its related list's
|
|
304
|
+
* `query` access resolves to; the scoping information goes into
|
|
305
|
+
* `toOneAccessFilters` instead.
|
|
306
|
+
*/
|
|
307
|
+
describe('buildAccessScopedInclude — to-one relations record a post-query filter, not `where` (issue #974)', () => {
|
|
308
|
+
function ownerConfig(queryAccess) {
|
|
309
|
+
return {
|
|
310
|
+
db: { provider: 'sqlite' },
|
|
311
|
+
lists: {
|
|
312
|
+
Child: {
|
|
313
|
+
fields: { name: { type: 'text' }, owner: rel('Owner') },
|
|
314
|
+
access: { operation: { query: () => true } },
|
|
315
|
+
},
|
|
316
|
+
Owner: {
|
|
317
|
+
fields: { name: { type: 'text' } },
|
|
318
|
+
access: { operation: { query: queryAccess } },
|
|
319
|
+
},
|
|
320
|
+
},
|
|
321
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- minimal config for unit test
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
it('records the access filter instead of attaching `where` when the related list scopes by a filter', async () => {
|
|
325
|
+
const config = ownerConfig(() => ({ id: { equals: 'u1' } }));
|
|
326
|
+
const { include, toOneAccessFilters } = await buildAccessScopedInclude({ owner: true }, config.lists.Child.fields, { session: null, context: makeContext() }, config, 'Child');
|
|
327
|
+
// The Prisma-bound include never carries a `where` on this to-one key —
|
|
328
|
+
// Prisma would reject it.
|
|
329
|
+
expect(include).toEqual({ owner: true });
|
|
330
|
+
expect(toOneAccessFilters).toEqual({
|
|
331
|
+
filters: {
|
|
332
|
+
owner: { kind: 'scoped', relatedListName: 'Owner', accessWhere: { id: { equals: 'u1' } } },
|
|
333
|
+
},
|
|
334
|
+
nested: {},
|
|
335
|
+
});
|
|
336
|
+
});
|
|
337
|
+
it('leaves a to-one relation whose related list is fully open untouched — no filter recorded, no extra query later', async () => {
|
|
338
|
+
const config = ownerConfig(() => true);
|
|
339
|
+
const { include, toOneAccessFilters } = await buildAccessScopedInclude({ owner: true }, config.lists.Child.fields, { session: null, context: makeContext() }, config, 'Child');
|
|
340
|
+
expect(include).toEqual({ owner: true });
|
|
341
|
+
expect(toOneAccessFilters).toEqual({ filters: {}, nested: {} });
|
|
342
|
+
});
|
|
343
|
+
it('drops a to-one relation whose related list denies query access outright, and records the denial', async () => {
|
|
344
|
+
const config = ownerConfig(() => false);
|
|
345
|
+
const { include, toOneAccessFilters } = await buildAccessScopedInclude({ owner: true }, config.lists.Child.fields, { session: null, context: makeContext() }, config, 'Child');
|
|
346
|
+
// Never asked of Prisma at all — same as before this fix.
|
|
347
|
+
expect(include).toEqual({});
|
|
348
|
+
expect(toOneAccessFilters).toEqual({ filters: { owner: { kind: 'denied' } }, nested: {} });
|
|
349
|
+
});
|
|
350
|
+
it('records a to-one filter nested inside another relation the caller explicitly included', async () => {
|
|
351
|
+
const config = {
|
|
352
|
+
db: { provider: 'sqlite' },
|
|
353
|
+
lists: {
|
|
354
|
+
GrandChild: {
|
|
355
|
+
fields: { name: { type: 'text' }, child: rel('Child') },
|
|
356
|
+
access: { operation: { query: () => true } },
|
|
357
|
+
},
|
|
358
|
+
Child: {
|
|
359
|
+
fields: { name: { type: 'text' }, owner: rel('Owner') },
|
|
360
|
+
access: { operation: { query: () => true } },
|
|
361
|
+
},
|
|
362
|
+
Owner: {
|
|
363
|
+
fields: { name: { type: 'text' } },
|
|
364
|
+
access: { operation: { query: () => ({ id: { equals: 'u1' } }) } },
|
|
365
|
+
},
|
|
366
|
+
},
|
|
367
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- minimal config for unit test
|
|
368
|
+
};
|
|
369
|
+
const { include, toOneAccessFilters } = await buildAccessScopedInclude({ child: { include: { owner: true } } }, config.lists.GrandChild.fields, { session: null, context: makeContext() }, config, 'GrandChild');
|
|
370
|
+
expect(include).toEqual({ child: { include: { owner: true } } });
|
|
371
|
+
expect(toOneAccessFilters).toEqual({
|
|
372
|
+
filters: {},
|
|
373
|
+
nested: {
|
|
374
|
+
child: {
|
|
375
|
+
filters: {
|
|
376
|
+
owner: {
|
|
377
|
+
kind: 'scoped',
|
|
378
|
+
relatedListName: 'Owner',
|
|
379
|
+
accessWhere: { id: { equals: 'u1' } },
|
|
380
|
+
},
|
|
381
|
+
},
|
|
382
|
+
nested: {},
|
|
383
|
+
},
|
|
384
|
+
},
|
|
385
|
+
});
|
|
386
|
+
});
|
|
387
|
+
});
|
|
388
|
+
describe('resolveToOneAccessVisibility (issue #974)', () => {
|
|
389
|
+
function makeVisibilityContext(findMany) {
|
|
390
|
+
return {
|
|
391
|
+
session: null,
|
|
392
|
+
_isSudo: false,
|
|
393
|
+
_resolveOutputChain: [],
|
|
394
|
+
prisma: { owner: { findMany } },
|
|
395
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- minimal context for unit test
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
it('passes a denied filter straight through with no query', async () => {
|
|
399
|
+
const findMany = vi.fn();
|
|
400
|
+
const context = makeVisibilityContext(findMany);
|
|
401
|
+
const resolved = await resolveToOneAccessVisibility([{ id: 'c1' }], { filters: { owner: { kind: 'denied' } }, nested: {} }, { session: null, context });
|
|
402
|
+
expect(resolved).toEqual({ filters: { owner: { kind: 'denied' } }, nested: {} });
|
|
403
|
+
expect(findMany).not.toHaveBeenCalled();
|
|
404
|
+
});
|
|
405
|
+
it('skips the query when no row carries a value at the scoped key', async () => {
|
|
406
|
+
const findMany = vi.fn();
|
|
407
|
+
const context = makeVisibilityContext(findMany);
|
|
408
|
+
const tree = {
|
|
409
|
+
filters: {
|
|
410
|
+
owner: {
|
|
411
|
+
kind: 'scoped',
|
|
412
|
+
relatedListName: 'Owner',
|
|
413
|
+
accessWhere: { id: { equals: 'u1' } },
|
|
414
|
+
},
|
|
415
|
+
},
|
|
416
|
+
nested: {},
|
|
417
|
+
};
|
|
418
|
+
const resolved = await resolveToOneAccessVisibility([{ id: 'c1', owner: null }], tree, {
|
|
419
|
+
session: null,
|
|
420
|
+
context,
|
|
421
|
+
});
|
|
422
|
+
expect(resolved).toEqual({
|
|
423
|
+
filters: { owner: { kind: 'visible', ids: new Set() } },
|
|
424
|
+
nested: {},
|
|
425
|
+
});
|
|
426
|
+
expect(findMany).not.toHaveBeenCalled();
|
|
427
|
+
});
|
|
428
|
+
it('batches every row into ONE existence check, through the raw Prisma client, using the exact access filter', async () => {
|
|
429
|
+
const findMany = vi.fn().mockResolvedValue([{ id: 'u1' }, { id: 'u2' }]);
|
|
430
|
+
const context = makeVisibilityContext(findMany);
|
|
431
|
+
const tree = {
|
|
432
|
+
filters: {
|
|
433
|
+
owner: {
|
|
434
|
+
kind: 'scoped',
|
|
435
|
+
relatedListName: 'Owner',
|
|
436
|
+
accessWhere: { studioId: { equals: 's1' } },
|
|
437
|
+
},
|
|
438
|
+
},
|
|
439
|
+
nested: {},
|
|
440
|
+
};
|
|
441
|
+
const items = [
|
|
442
|
+
{ id: 'c1', owner: { id: 'u1' } },
|
|
443
|
+
{ id: 'c2', owner: { id: 'u2' } },
|
|
444
|
+
{ id: 'c3', owner: { id: 'u3' } }, // excluded by the mocked response below
|
|
445
|
+
{ id: 'c4', owner: null }, // contributes no id
|
|
446
|
+
];
|
|
447
|
+
const resolved = await resolveToOneAccessVisibility(items, tree, { session: null, context });
|
|
448
|
+
// One call, not one per row.
|
|
449
|
+
expect(findMany).toHaveBeenCalledTimes(1);
|
|
450
|
+
expect(findMany).toHaveBeenCalledWith({
|
|
451
|
+
where: { AND: [{ studioId: { equals: 's1' } }, { id: { in: ['u1', 'u2', 'u3'] } }] },
|
|
452
|
+
select: { id: true },
|
|
453
|
+
});
|
|
454
|
+
expect(resolved.filters.owner).toEqual({ kind: 'visible', ids: new Set(['u1', 'u2']) });
|
|
455
|
+
});
|
|
456
|
+
it('recurses into nested trees, flattening rows reached through a to-many hop into one batch', async () => {
|
|
457
|
+
const ownerFindMany = vi.fn().mockResolvedValue([{ id: 'u1' }]);
|
|
458
|
+
const context = {
|
|
459
|
+
session: null,
|
|
460
|
+
_isSudo: false,
|
|
461
|
+
_resolveOutputChain: [],
|
|
462
|
+
prisma: { owner: { findMany: ownerFindMany } },
|
|
463
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- minimal context for unit test
|
|
464
|
+
};
|
|
465
|
+
const tree = {
|
|
466
|
+
filters: {},
|
|
467
|
+
nested: {
|
|
468
|
+
children: {
|
|
469
|
+
filters: {
|
|
470
|
+
owner: {
|
|
471
|
+
kind: 'scoped',
|
|
472
|
+
relatedListName: 'Owner',
|
|
473
|
+
accessWhere: { id: { equals: 'u1' } },
|
|
474
|
+
},
|
|
475
|
+
},
|
|
476
|
+
nested: {},
|
|
477
|
+
},
|
|
478
|
+
},
|
|
479
|
+
};
|
|
480
|
+
const items = [
|
|
481
|
+
{
|
|
482
|
+
id: 'p1',
|
|
483
|
+
children: [
|
|
484
|
+
{ id: 'c1', owner: { id: 'u1' } },
|
|
485
|
+
{ id: 'c2', owner: { id: 'u9' } },
|
|
486
|
+
],
|
|
487
|
+
},
|
|
488
|
+
{ id: 'p2', children: [{ id: 'c3', owner: { id: 'u1' } }] },
|
|
489
|
+
];
|
|
490
|
+
const resolved = await resolveToOneAccessVisibility(items, tree, { session: null, context });
|
|
491
|
+
// Every child across BOTH parents resolved in one batched call.
|
|
492
|
+
expect(ownerFindMany).toHaveBeenCalledTimes(1);
|
|
493
|
+
expect(ownerFindMany).toHaveBeenCalledWith({
|
|
494
|
+
where: { AND: [{ id: { equals: 'u1' } }, { id: { in: ['u1', 'u9'] } }] },
|
|
495
|
+
select: { id: true },
|
|
496
|
+
});
|
|
497
|
+
expect(resolved.nested.children.filters.owner).toEqual({
|
|
498
|
+
kind: 'visible',
|
|
499
|
+
ids: new Set(['u1']),
|
|
500
|
+
});
|
|
501
|
+
});
|
|
502
|
+
});
|
|
291
503
|
//# 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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"}
|
package/dist/access/engine.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { AccessControl, Session, AccessContext, PrismaFilter } from './types.js';
|
|
2
|
-
import type { OpenSaasConfig, ListConfig } from '../config/types.js';
|
|
2
|
+
import type { OpenSaasConfig, ListConfig, RelationshipField } from '../config/types.js';
|
|
3
3
|
/**
|
|
4
4
|
* Access engine — operation-level access control and shared helpers.
|
|
5
5
|
*
|
|
@@ -20,10 +20,52 @@ export declare function getRelatedListConfig(relationshipRef: string, config: Op
|
|
|
20
20
|
listName: string;
|
|
21
21
|
listConfig: ListConfig<any>;
|
|
22
22
|
} | null;
|
|
23
|
+
/** A synthetic reverse relation, resolved back to the declared field that owns it. */
|
|
24
|
+
export interface SyntheticReverseRelation {
|
|
25
|
+
sourceListName: string;
|
|
26
|
+
sourceFieldName: string;
|
|
27
|
+
sourceFieldConfig: RelationshipField<any>;
|
|
28
|
+
sourceListConfig: ListConfig<any>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Resolve a candidate data key as the synthetic back-relation a list-only
|
|
32
|
+
* `ref` (`ref: 'ListName'`, no target field) generates on its target model —
|
|
33
|
+
* Prisma requires an opposite field there, but the config never declares one,
|
|
34
|
+
* so it never appears in `parentListName`'s own `fields`. Reuses
|
|
35
|
+
* `getSyntheticFieldName` (the same construction `getPrismaRelation` emits the
|
|
36
|
+
* schema with) rather than re-deriving the `from_<List>_<field>` format by
|
|
37
|
+
* string parsing, so the two cannot drift (#978).
|
|
38
|
+
*
|
|
39
|
+
* Returns the declared relationship field that owns the relation — the write
|
|
40
|
+
* pipeline treats a resolved synthetic key exactly like a nested write through
|
|
41
|
+
* that field, so it runs the same hooks/access/recovery machinery a declared
|
|
42
|
+
* relationship field gets. Returns `null` when `fieldName` isn't one of these
|
|
43
|
+
* on `parentListName` (a genuinely unknown key, or a bidirectional relation's
|
|
44
|
+
* ref, which never synthesizes a back-relation).
|
|
45
|
+
*/
|
|
46
|
+
export declare function resolveSyntheticReverseRelation(fieldName: string, parentListName: string, config: OpenSaasConfig): SyntheticReverseRelation | null;
|
|
23
47
|
export declare function checkAccess<T = Record<string, unknown>>(accessControl: AccessControl<T> | undefined, args: {
|
|
24
48
|
session: Session | null;
|
|
25
49
|
item?: T;
|
|
26
50
|
context: AccessContext;
|
|
27
51
|
}): Promise<boolean | PrismaFilter<T>>;
|
|
52
|
+
/**
|
|
53
|
+
* Evaluate operation-level `create` access. The single evaluator shared by the
|
|
54
|
+
* write pipeline's top-level create and the nested-create path — both must
|
|
55
|
+
* reject the same way, or the two drift again (#1009).
|
|
56
|
+
*
|
|
57
|
+
* Unlike `checkAccess` (which `query`/`update`/`delete` call directly and which
|
|
58
|
+
* legitimately returns a filter for them to re-check against a row), create
|
|
59
|
+
* has no existing row and no way to test a filter against input data. A rule
|
|
60
|
+
* that returns anything other than a strict boolean — most notably a filter,
|
|
61
|
+
* which type-checks against the shared `AccessControl` signature and reads as
|
|
62
|
+
* though it scopes the create — throws `InvalidCreateAccessResultError`
|
|
63
|
+
* rather than being silently treated as an allow. See that error's doc,
|
|
64
|
+
* ADR-0022, and ADR-0030.
|
|
65
|
+
*/
|
|
66
|
+
export declare function checkCreateAccess<T = Record<string, unknown>>(listKey: string, accessControl: AccessControl<T> | undefined, args: {
|
|
67
|
+
session: Session | null;
|
|
68
|
+
context: AccessContext;
|
|
69
|
+
}): Promise<boolean>;
|
|
28
70
|
export declare function mergeFilters(userFilter: PrismaFilter | undefined, accessFilter: boolean | PrismaFilter): PrismaFilter | null;
|
|
29
71
|
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/access/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACrF,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/access/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACrF,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAIvF;;;;;;;;;;;;;GAaG;AAEH,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,CAE1D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAEpE;AAED,wBAAgB,oBAAoB,CAClC,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,cAAc,GAErB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,CAAA;CAAE,GAAG,IAAI,CAe1D;AAED,sFAAsF;AACtF,MAAM,WAAW,wBAAwB;IACvC,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IAEvB,iBAAiB,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAA;IAEzC,gBAAgB,EAAE,UAAU,CAAC,GAAG,CAAC,CAAA;CAClC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,+BAA+B,CAC7C,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,cAAc,GACrB,wBAAwB,GAAG,IAAI,CAejC;AAED,wBAAsB,WAAW,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,EAC3C,IAAI,EAAE;IACJ,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;IACvB,IAAI,CAAC,EAAE,CAAC,CAAA;IACR,OAAO,EAAE,aAAa,CAAA;CACvB,GACA,OAAO,CAAC,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CASpC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjE,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,EAC3C,IAAI,EAAE;IACJ,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;IACvB,OAAO,EAAE,aAAa,CAAA;CACvB,GACA,OAAO,CAAC,OAAO,CAAC,CAQlB;AAED,wBAAgB,YAAY,CAC1B,UAAU,EAAE,YAAY,GAAG,SAAS,EACpC,YAAY,EAAE,OAAO,GAAG,YAAY,GACnC,YAAY,GAAG,IAAI,CAgBrB"}
|
package/dist/access/engine.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { getSyntheticFieldName } from '../fields/index.js';
|
|
2
|
+
import { InvalidCreateAccessResultError } from './errors.js';
|
|
1
3
|
/**
|
|
2
4
|
* Access engine — operation-level access control and shared helpers.
|
|
3
5
|
*
|
|
@@ -31,6 +33,41 @@ export function getRelatedListConfig(relationshipRef, config) {
|
|
|
31
33
|
}
|
|
32
34
|
return { listName, listConfig };
|
|
33
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Resolve a candidate data key as the synthetic back-relation a list-only
|
|
38
|
+
* `ref` (`ref: 'ListName'`, no target field) generates on its target model —
|
|
39
|
+
* Prisma requires an opposite field there, but the config never declares one,
|
|
40
|
+
* so it never appears in `parentListName`'s own `fields`. Reuses
|
|
41
|
+
* `getSyntheticFieldName` (the same construction `getPrismaRelation` emits the
|
|
42
|
+
* schema with) rather than re-deriving the `from_<List>_<field>` format by
|
|
43
|
+
* string parsing, so the two cannot drift (#978).
|
|
44
|
+
*
|
|
45
|
+
* Returns the declared relationship field that owns the relation — the write
|
|
46
|
+
* pipeline treats a resolved synthetic key exactly like a nested write through
|
|
47
|
+
* that field, so it runs the same hooks/access/recovery machinery a declared
|
|
48
|
+
* relationship field gets. Returns `null` when `fieldName` isn't one of these
|
|
49
|
+
* on `parentListName` (a genuinely unknown key, or a bidirectional relation's
|
|
50
|
+
* ref, which never synthesizes a back-relation).
|
|
51
|
+
*/
|
|
52
|
+
export function resolveSyntheticReverseRelation(fieldName, parentListName, config) {
|
|
53
|
+
for (const [sourceListName, sourceListConfig] of Object.entries(config.lists)) {
|
|
54
|
+
for (const [sourceFieldName, sourceFieldConfig] of Object.entries(sourceListConfig.fields)) {
|
|
55
|
+
if (sourceFieldConfig.type !== 'relationship')
|
|
56
|
+
continue;
|
|
57
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- RelationshipField must accept any TypeInfo
|
|
58
|
+
const rel = sourceFieldConfig;
|
|
59
|
+
// Only a list-only ref ('ListName', no '.fieldName') synthesizes a
|
|
60
|
+
// back-relation — a bidirectional ref's other side is a real field.
|
|
61
|
+
const refParts = rel.ref.split('.');
|
|
62
|
+
if (refParts.length !== 1 || refParts[0] !== parentListName)
|
|
63
|
+
continue;
|
|
64
|
+
if (getSyntheticFieldName(sourceListName, sourceFieldName) !== fieldName)
|
|
65
|
+
continue;
|
|
66
|
+
return { sourceListName, sourceFieldName, sourceFieldConfig: rel, sourceListConfig };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
34
71
|
export async function checkAccess(accessControl, args) {
|
|
35
72
|
// No access control means deny by default
|
|
36
73
|
if (!accessControl) {
|
|
@@ -39,6 +76,27 @@ export async function checkAccess(accessControl, args) {
|
|
|
39
76
|
const result = await accessControl(args);
|
|
40
77
|
return result;
|
|
41
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* Evaluate operation-level `create` access. The single evaluator shared by the
|
|
81
|
+
* write pipeline's top-level create and the nested-create path — both must
|
|
82
|
+
* reject the same way, or the two drift again (#1009).
|
|
83
|
+
*
|
|
84
|
+
* Unlike `checkAccess` (which `query`/`update`/`delete` call directly and which
|
|
85
|
+
* legitimately returns a filter for them to re-check against a row), create
|
|
86
|
+
* has no existing row and no way to test a filter against input data. A rule
|
|
87
|
+
* that returns anything other than a strict boolean — most notably a filter,
|
|
88
|
+
* which type-checks against the shared `AccessControl` signature and reads as
|
|
89
|
+
* though it scopes the create — throws `InvalidCreateAccessResultError`
|
|
90
|
+
* rather than being silently treated as an allow. See that error's doc,
|
|
91
|
+
* ADR-0022, and ADR-0030.
|
|
92
|
+
*/
|
|
93
|
+
export async function checkCreateAccess(listKey, accessControl, args) {
|
|
94
|
+
const result = await checkAccess(accessControl, args);
|
|
95
|
+
if (isBoolean(result)) {
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
throw new InvalidCreateAccessResultError(listKey, result);
|
|
99
|
+
}
|
|
42
100
|
export function mergeFilters(userFilter, accessFilter) {
|
|
43
101
|
if (accessFilter === false) {
|
|
44
102
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/access/engine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/access/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.test.d.ts","sourceRoot":"","sources":["../../src/access/engine.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { resolveSyntheticReverseRelation } from './engine.js';
|
|
3
|
+
// A relationship field pointing at another list.
|
|
4
|
+
function rel(ref, many = false) {
|
|
5
|
+
return { type: 'relationship', ref, many };
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* #978: a list-only `ref` (`ref: 'ListName'`, no target field) generates a
|
|
9
|
+
* synthetic back-relation on its target — `from_<SourceList>_<sourceField>`
|
|
10
|
+
* (see `getSyntheticFieldName` in fields/index.ts). `resolveSyntheticReverseRelation`
|
|
11
|
+
* is the runtime counterpart that recognises the same name and resolves it
|
|
12
|
+
* back to the declared field that owns it, so a nested write addressed to it
|
|
13
|
+
* gets the same hook pipeline a declared relationship field gets.
|
|
14
|
+
*/
|
|
15
|
+
describe('resolveSyntheticReverseRelation', () => {
|
|
16
|
+
const config = {
|
|
17
|
+
db: { provider: 'sqlite', url: 'file:./dev.db' },
|
|
18
|
+
lists: {
|
|
19
|
+
Account: { fields: { name: { type: 'text' } } },
|
|
20
|
+
ChargeRequest: {
|
|
21
|
+
fields: {
|
|
22
|
+
kind: { type: 'text' },
|
|
23
|
+
// List-only ref — no field named on Account, so a back-relation is
|
|
24
|
+
// synthesized on it as `from_ChargeRequest_account`.
|
|
25
|
+
account: rel('Account'),
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
// A bidirectional relationship — Post.author names User.posts directly,
|
|
29
|
+
// so no back-relation is synthesized anywhere for it.
|
|
30
|
+
User: { fields: { posts: rel('Post.author', true) } },
|
|
31
|
+
Post: { fields: { author: rel('User.posts') } },
|
|
32
|
+
},
|
|
33
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
34
|
+
};
|
|
35
|
+
it('resolves the synthetic back-relation name to its owning field', () => {
|
|
36
|
+
const result = resolveSyntheticReverseRelation('from_ChargeRequest_account', 'Account', config);
|
|
37
|
+
expect(result).not.toBeNull();
|
|
38
|
+
expect(result?.sourceListName).toBe('ChargeRequest');
|
|
39
|
+
expect(result?.sourceFieldName).toBe('account');
|
|
40
|
+
expect(result?.sourceFieldConfig.ref).toBe('Account');
|
|
41
|
+
});
|
|
42
|
+
it('returns null for a name that does not match the synthetic construction', () => {
|
|
43
|
+
expect(resolveSyntheticReverseRelation('from_ChargeRequest_amount', 'Account', config)).toBeNull();
|
|
44
|
+
expect(resolveSyntheticReverseRelation('chargeRequests', 'Account', config)).toBeNull();
|
|
45
|
+
});
|
|
46
|
+
it('returns null on the wrong parent list', () => {
|
|
47
|
+
expect(resolveSyntheticReverseRelation('from_ChargeRequest_account', 'ChargeRequest', config)).toBeNull();
|
|
48
|
+
});
|
|
49
|
+
it('returns null for a bidirectional ref — its other side is a real declared field, not a synthetic one', () => {
|
|
50
|
+
expect(resolveSyntheticReverseRelation('from_Post_author', 'User', config)).toBeNull();
|
|
51
|
+
});
|
|
52
|
+
it('returns null for a genuinely unknown key', () => {
|
|
53
|
+
expect(resolveSyntheticReverseRelation('totallyBogusKey', 'Account', config)).toBeNull();
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
//# sourceMappingURL=engine.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.test.js","sourceRoot":"","sources":["../../src/access/engine.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,+BAA+B,EAAE,MAAM,aAAa,CAAA;AAG7D,iDAAiD;AACjD,SAAS,GAAG,CAAC,GAAW,EAAE,IAAI,GAAG,KAAK;IACpC,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAA4B,CAAA;AACtE,CAAC;AAED;;;;;;;GAOG;AACH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,MAAM,MAAM,GAAmB;QAC7B,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,eAAe,EAAE;QAChD,KAAK,EAAE;YACL,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAA4B,EAAE,EAAE;YACzE,aAAa,EAAE;gBACb,MAAM,EAAE;oBACN,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAA4B;oBAChD,mEAAmE;oBACnE,qDAAqD;oBACrD,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC;iBACxB;aACF;YACD,wEAAwE;YACxE,sDAAsD;YACtD,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,EAAE;YACrD,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,YAAY,CAAC,EAAE,EAAE;SAChD;QACD,8DAA8D;KACxD,CAAA;IAER,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,MAAM,GAAG,+BAA+B,CAAC,4BAA4B,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;QAC/F,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;QAC7B,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QACpD,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC/C,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACvD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,CACJ,+BAA+B,CAAC,2BAA2B,EAAE,SAAS,EAAE,MAAM,CAAC,CAChF,CAAC,QAAQ,EAAE,CAAA;QACZ,MAAM,CAAC,+BAA+B,CAAC,gBAAgB,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IACzF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CACJ,+BAA+B,CAAC,4BAA4B,EAAE,eAAe,EAAE,MAAM,CAAC,CACvF,CAAC,QAAQ,EAAE,CAAA;IACd,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qGAAqG,EAAE,GAAG,EAAE;QAC7G,MAAM,CAAC,+BAA+B,CAAC,kBAAkB,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IACxF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,+BAA+B,CAAC,iBAAiB,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IAC1F,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|