@opensaas/stack-core 0.39.2 → 0.41.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 +189 -0
- package/CLAUDE.md +103 -0
- package/dist/access/access-filter.d.ts +157 -14
- package/dist/access/access-filter.d.ts.map +1 -1
- package/dist/access/access-filter.js +470 -42
- package/dist/access/access-filter.js.map +1 -1
- package/dist/access/access-filter.test.js +982 -17
- package/dist/access/access-filter.test.js.map +1 -1
- package/dist/access/denied-relation-visibility.test.d.ts +2 -0
- package/dist/access/denied-relation-visibility.test.d.ts.map +1 -0
- package/dist/access/denied-relation-visibility.test.js +114 -0
- package/dist/access/denied-relation-visibility.test.js.map +1 -0
- package/dist/access/engine.d.ts +54 -1
- package/dist/access/engine.d.ts.map +1 -1
- package/dist/access/engine.js +84 -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 +62 -0
- package/dist/access/errors.d.ts.map +1 -1
- package/dist/access/errors.js +85 -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 +107 -15
- package/dist/access/field-visibility.js.map +1 -1
- package/dist/access/index.d.ts +9 -2
- package/dist/access/index.d.ts.map +1 -1
- package/dist/access/index.js +11 -2
- package/dist/access/index.js.map +1 -1
- package/dist/access/multi-column-read-write.test.js.map +1 -1
- package/dist/access/query-validation.d.ts +31 -0
- package/dist/access/query-validation.d.ts.map +1 -1
- package/dist/access/query-validation.js +75 -16
- package/dist/access/query-validation.js.map +1 -1
- package/dist/access/relationship-count.d.ts +41 -3
- package/dist/access/relationship-count.d.ts.map +1 -1
- package/dist/access/relationship-count.js +44 -7
- package/dist/access/relationship-count.js.map +1 -1
- package/dist/access/relationship-count.test.js +62 -0
- package/dist/access/relationship-count.test.js.map +1 -1
- package/dist/access/synthetic-include-read.test.d.ts +2 -0
- package/dist/access/synthetic-include-read.test.d.ts.map +1 -0
- package/dist/access/synthetic-include-read.test.js +121 -0
- package/dist/access/synthetic-include-read.test.js.map +1 -0
- package/dist/config/types.d.ts +98 -32
- package/dist/config/types.d.ts.map +1 -1
- package/dist/context/hook-pipeline.d.ts +2 -2
- package/dist/context/hook-pipeline.d.ts.map +1 -1
- package/dist/context/hook-pipeline.js.map +1 -1
- package/dist/context/index.d.ts +35 -2
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +121 -27
- package/dist/context/index.js.map +1 -1
- package/dist/context/nested-operations.d.ts +2 -2
- package/dist/context/nested-operations.d.ts.map +1 -1
- package/dist/context/nested-operations.js +74 -15
- 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 +31 -34
- 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/hooks/index.d.ts +16 -15
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js.map +1 -1
- 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 +2 -2
- package/src/access/access-filter.test.ts +1528 -18
- package/src/access/access-filter.ts +708 -42
- package/src/access/denied-relation-visibility.test.ts +173 -0
- package/src/access/engine.test.ts +67 -0
- package/src/access/engine.ts +109 -1
- package/src/access/errors.ts +97 -2
- package/src/access/field-access.test.ts +78 -0
- package/src/access/field-access.ts +34 -2
- package/src/access/field-visibility.ts +171 -25
- package/src/access/index.ts +25 -0
- package/src/access/multi-column-read-write.test.ts +3 -2
- package/src/access/query-validation.ts +136 -9
- package/src/access/relationship-count.test.ts +75 -0
- package/src/access/relationship-count.ts +53 -10
- package/src/access/synthetic-include-read.test.ts +179 -0
- package/src/config/types.ts +98 -32
- package/src/context/hook-pipeline.ts +4 -2
- package/src/context/index.ts +203 -42
- package/src/context/nested-operations.ts +96 -27
- package/src/context/write-pipeline.ts +60 -36
- package/src/fields/index.ts +55 -5
- package/src/fields/relationship-foreign-key.test.ts +29 -0
- package/src/hooks/index.ts +22 -15
- 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 +452 -17
- package/tests/field-types.test.ts +113 -0
- package/tests/hook-context-secured.test.ts +424 -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 +389 -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
|
@@ -84,6 +84,35 @@ describe('buildRelationshipCountSelect', () => {
|
|
|
84
84
|
const select = await buildRelationshipCountSelect(config.lists.Post, { session: null, context: makeContext() }, config);
|
|
85
85
|
expect(select).toBeUndefined();
|
|
86
86
|
});
|
|
87
|
+
// Issue #1111: a relationship hidden via field-level `read` access must not
|
|
88
|
+
// leak its true count, even when the related list's rows are otherwise
|
|
89
|
+
// fully readable — the same denial an ordinary `include` of that field
|
|
90
|
+
// already gets from `filterReadableFields`'s `checkFieldAccess` call.
|
|
91
|
+
it('omits a relation whose field-level `read` access denies it, even though the related list is fully readable', async () => {
|
|
92
|
+
const config = {
|
|
93
|
+
db: { provider: 'sqlite', prismaClientConstructor: () => null },
|
|
94
|
+
lists: {
|
|
95
|
+
User: list({
|
|
96
|
+
fields: {
|
|
97
|
+
name: text(),
|
|
98
|
+
posts: relationship({
|
|
99
|
+
ref: 'Post.author',
|
|
100
|
+
many: true,
|
|
101
|
+
access: { read: () => false },
|
|
102
|
+
}),
|
|
103
|
+
},
|
|
104
|
+
access: { operation: { query: () => true } },
|
|
105
|
+
}),
|
|
106
|
+
Post: list({
|
|
107
|
+
fields: { title: text(), author: relationship({ ref: 'User.posts' }) },
|
|
108
|
+
access: { operation: { query: () => true } },
|
|
109
|
+
}),
|
|
110
|
+
},
|
|
111
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- minimal config for unit test
|
|
112
|
+
};
|
|
113
|
+
const select = await buildRelationshipCountSelect(config.lists.User, { session: null, context: makeContext() }, config);
|
|
114
|
+
expect(select).toBeUndefined();
|
|
115
|
+
});
|
|
87
116
|
});
|
|
88
117
|
describe('resolveRelationshipCountFilters', () => {
|
|
89
118
|
const marker = (operator, value) => ({
|
|
@@ -130,6 +159,39 @@ describe('resolveRelationshipCountFilters', () => {
|
|
|
130
159
|
expect(resolved).toEqual({ id: { in: [] } });
|
|
131
160
|
expect(findMany).not.toHaveBeenCalled();
|
|
132
161
|
});
|
|
162
|
+
// Issue #1111: a relationship denied at the FIELD level (as opposed to the
|
|
163
|
+
// related list's operation-level `query` access, covered above) must also
|
|
164
|
+
// resolve to "always 0, no query needed" — the related list here (Post) is
|
|
165
|
+
// otherwise fully readable, so only the field-level check on `posts` itself
|
|
166
|
+
// can be what's denying it.
|
|
167
|
+
it('resolves a field-level-denied relationship without any query: count is always 0', async () => {
|
|
168
|
+
const config = {
|
|
169
|
+
db: { provider: 'sqlite', prismaClientConstructor: () => null },
|
|
170
|
+
lists: {
|
|
171
|
+
User: list({
|
|
172
|
+
fields: {
|
|
173
|
+
name: text(),
|
|
174
|
+
posts: relationship({
|
|
175
|
+
ref: 'Post.author',
|
|
176
|
+
many: true,
|
|
177
|
+
access: { read: () => false },
|
|
178
|
+
}),
|
|
179
|
+
},
|
|
180
|
+
access: { operation: { query: () => true } },
|
|
181
|
+
}),
|
|
182
|
+
Post: list({
|
|
183
|
+
fields: { title: text(), author: relationship({ ref: 'User.posts' }) },
|
|
184
|
+
access: { operation: { query: () => true } },
|
|
185
|
+
}),
|
|
186
|
+
},
|
|
187
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- minimal config for unit test
|
|
188
|
+
};
|
|
189
|
+
const findMany = vi.fn(async () => []);
|
|
190
|
+
const where = { posts: { [RELATIONSHIP_COUNT_FILTER_KEY]: { operator: 'gt', value: 0 } } };
|
|
191
|
+
const resolved = await resolveRelationshipCountFilters(where, config.lists.User, 'User', { session: null, context: makeContext(findMany) }, config);
|
|
192
|
+
expect(resolved).toEqual({ id: { in: [] } });
|
|
193
|
+
expect(findMany).not.toHaveBeenCalled();
|
|
194
|
+
});
|
|
133
195
|
it('preserves sibling conditions, ANDing the resolved id constraint', async () => {
|
|
134
196
|
const config = makeConfig();
|
|
135
197
|
const findMany = vi.fn(async () => [{ id: 'u2', _count: { posts: 7 } }]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relationship-count.test.js","sourceRoot":"","sources":["../../src/access/relationship-count.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"relationship-count.test.js","sourceRoot":"","sources":["../../src/access/relationship-count.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACzC,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAGhE,OAAO,EACL,4BAA4B,EAC5B,+BAA+B,EAC/B,yBAAyB,GAC1B,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,6BAA6B,EAAE,MAAM,oBAAoB,CAAA;AAElE;;;;;;GAMG;AAEH,gFAAgF;AAChF,gEAAgE;AAChE,SAAS,UAAU;IACjB,OAAO;QACL,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,uBAAuB,EAAE,GAAG,EAAE,CAAC,IAAa,EAAE;QACxE,KAAK,EAAE;YACL,IAAI,EAAE,IAAI,CAAC;gBACT,MAAM,EAAE;oBACN,IAAI,EAAE,IAAI,EAAE;oBACZ,KAAK,EAAE,YAAY,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;oBACvD,OAAO,EAAE,YAAY,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;oBACpD,OAAO,EAAE,YAAY,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,yBAAyB;iBAClE;gBACD,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;aAC7C,CAAC;YACF,IAAI,EAAE,IAAI,CAAC;gBACT,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,EAAE;gBACxF,sEAAsE;gBACtE,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;aAC9E,CAAC;YACF,mEAAmE;YACnE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;SAC3C;QACD,8FAA8F;KACxF,CAAA;AACV,CAAC;AAED,SAAS,WAAW,CAClB,QAAqE;IAErE,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,KAAK;QACd,mBAAmB,EAAE,EAAE;QACvB,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE;QAC1C,+FAA+F;KACzF,CAAA;AACV,CAAC;AAED,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAA;IAC3C,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,yBAAyB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9D,MAAM,CAAC,yBAAyB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChE,MAAM,CAAC,yBAAyB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACjE,MAAM,CAAC,yBAAyB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,EAAE,CAAC,uFAAuF,EAAE,KAAK,IAAI,EAAE;QACrG,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;QAC3B,MAAM,MAAM,GAAG,MAAM,4BAA4B,CAC/C,MAAM,CAAC,KAAK,CAAC,IAAI,EACjB,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EACzC,MAAM,CACP,CAAA;QACD,2EAA2E;QAC3E,0BAA0B;QAC1B,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;IACnF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,MAAM,GAAmB;YAC7B,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,uBAAuB,EAAE,GAAG,EAAE,CAAC,IAAa,EAAE;YACxE,KAAK,EAAE;gBACL,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;gBACrF,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;aAC1F;YACD,8FAA8F;SACxF,CAAA;QACR,MAAM,MAAM,GAAG,MAAM,4BAA4B,CAC/C,MAAM,CAAC,KAAK,CAAC,IAAI,EACjB,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EACzC,MAAM,CACP,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,MAAM,GAAmB;YAC7B,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,uBAAuB,EAAE,GAAG,EAAE,CAAC,IAAa,EAAE;YACxE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE;YACpD,8FAA8F;SACxF,CAAA;QACR,MAAM,MAAM,GAAG,MAAM,4BAA4B,CAC/C,MAAM,CAAC,KAAK,CAAC,IAAI,EACjB,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EACzC,MAAM,CACP,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAA;IAChC,CAAC,CAAC,CAAA;IAEF,4EAA4E;IAC5E,uEAAuE;IACvE,uEAAuE;IACvE,sEAAsE;IACtE,EAAE,CAAC,4GAA4G,EAAE,KAAK,IAAI,EAAE;QAC1H,MAAM,MAAM,GAAmB;YAC7B,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,uBAAuB,EAAE,GAAG,EAAE,CAAC,IAAa,EAAE;YACxE,KAAK,EAAE;gBACL,IAAI,EAAE,IAAI,CAAC;oBACT,MAAM,EAAE;wBACN,IAAI,EAAE,IAAI,EAAE;wBACZ,KAAK,EAAE,YAAY,CAAC;4BAClB,GAAG,EAAE,aAAa;4BAClB,IAAI,EAAE,IAAI;4BACV,MAAM,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE;yBAC9B,CAAC;qBACH;oBACD,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;iBAC7C,CAAC;gBACF,IAAI,EAAE,IAAI,CAAC;oBACT,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,EAAE;oBACtE,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;iBAC7C,CAAC;aACH;YACD,8FAA8F;SACxF,CAAA;QAER,MAAM,MAAM,GAAG,MAAM,4BAA4B,CAC/C,MAAM,CAAC,KAAK,CAAC,IAAI,EACjB,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EACzC,MAAM,CACP,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAA;IAChC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,MAAM,MAAM,GAAG,CAAC,QAAgB,EAAE,KAAa,EAAE,EAAE,CAAC,CAAC;QACnD,KAAK,EAAE,EAAE,CAAC,6BAA6B,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;KAChE,CAAC,CAAA;IAEF,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;QAC3B,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAA;QAC3C,MAAM,QAAQ,GAAG,MAAM,+BAA+B,CACpD,KAAK,EACL,MAAM,CAAC,KAAK,CAAC,IAAI,EACjB,MAAM,EACN,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EACzC,MAAM,CACP,CAAA;QACD,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sFAAsF,EAAE,KAAK,IAAI,EAAE;QACpG,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;QAC3B,4EAA4E;QAC5E,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;YACjC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAClC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;SACnC,CAAC,CAAA;QACF,MAAM,QAAQ,GAAG,MAAM,+BAA+B,CACpD,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,EACf,MAAM,CAAC,KAAK,CAAC,IAAI,EACjB,MAAM,EACN,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,EAAE,EACjD,MAAM,CACP,CAAA;QACD,8EAA8E;QAC9E,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;QAChD,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;QACzC,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC;YACpC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;SAC3F,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;QAC5F,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;QAC3B,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;YACjC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAClC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;SACnC,CAAC,CAAA;QACF,MAAM,QAAQ,GAAG,MAAM,+BAA+B,CACpD,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,uCAAuC;QACxD,MAAM,CAAC,KAAK,CAAC,IAAI,EACjB,MAAM,EACN,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,EAAE,EACjD,MAAM,CACP,CAAA;QACD,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;QAC3B,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;QACtC,uEAAuE;QACvE,MAAM,KAAK,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,6BAA6B,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAA;QAC5F,MAAM,QAAQ,GAAG,MAAM,+BAA+B,CACpD,KAAK,EACL,MAAM,CAAC,KAAK,CAAC,IAAI,EACjB,MAAM,EACN,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,EAAE,EACjD,MAAM,CACP,CAAA;QACD,0DAA0D;QAC1D,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QAC5C,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,2EAA2E;IAC3E,0EAA0E;IAC1E,2EAA2E;IAC3E,4EAA4E;IAC5E,4BAA4B;IAC5B,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;QAC/F,MAAM,MAAM,GAAmB;YAC7B,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,uBAAuB,EAAE,GAAG,EAAE,CAAC,IAAa,EAAE;YACxE,KAAK,EAAE;gBACL,IAAI,EAAE,IAAI,CAAC;oBACT,MAAM,EAAE;wBACN,IAAI,EAAE,IAAI,EAAE;wBACZ,KAAK,EAAE,YAAY,CAAC;4BAClB,GAAG,EAAE,aAAa;4BAClB,IAAI,EAAE,IAAI;4BACV,MAAM,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE;yBAC9B,CAAC;qBACH;oBACD,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;iBAC7C,CAAC;gBACF,IAAI,EAAE,IAAI,CAAC;oBACT,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,EAAE;oBACtE,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;iBAC7C,CAAC;aACH;YACD,8FAA8F;SACxF,CAAA;QACR,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;QACtC,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,6BAA6B,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAA;QAC1F,MAAM,QAAQ,GAAG,MAAM,+BAA+B,CACpD,KAAK,EACL,MAAM,CAAC,KAAK,CAAC,IAAI,EACjB,MAAM,EACN,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,EAAE,EACjD,MAAM,CACP,CAAA;QACD,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QAC5C,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;QAC3B,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;QACxE,MAAM,KAAK,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QACxE,MAAM,QAAQ,GAAG,MAAM,+BAA+B,CACpD,KAAK,EACL,MAAM,CAAC,KAAK,CAAC,IAAI,EACjB,MAAM,EACN,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,EAAE,EACjD,MAAM,CACP,CAAA;QACD,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAA;IAC5F,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sFAAsF,EAAE,KAAK,IAAI,EAAE;QACpG,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;QAC3B,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,KAAc,EAAE,EAAE,CACxC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CACtD,CAAA;QACD,MAAM,+BAA+B,CACnC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,EACf,MAAM,CAAC,KAAK,CAAC,IAAI,EACjB,MAAM,EACN,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,EAAE,EACjD,MAAM,CACP,CAAA;QACD,4EAA4E;QAC5E,2EAA2E;QAC3E,8EAA8E;QAC9E,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;QACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACzC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAA;QAC5C,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;YACtB,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;SAC3F,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACzF,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;QAC3B,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;QACxE,6EAA6E;QAC7E,0EAA0E;QAC1E,6EAA6E;QAC7E,+BAA+B;QAC/B,MAAM,KAAK,GAAG;YACZ,GAAG,EAAE;gBACH;oBACE,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;oBACzB,KAAK,EAAE,EAAE,CAAC,6BAA6B,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;iBACzE;aACF;SACF,CAAA;QACD,MAAM,QAAQ,GAAG,MAAM,+BAA+B,CACpD,KAAK,EACL,MAAM,CAAC,KAAK,CAAC,IAAI,EACjB,MAAM,EACN,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,EAAE,EACjD,MAAM,CACP,CAAA;QACD,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IAC7E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yFAAyF,EAAE,KAAK,IAAI,EAAE;QACvG,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;QAC3B,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;QACxE,4EAA4E;QAC5E,4EAA4E;QAC5E,MAAM,KAAK,GAAG;YACZ,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE;YACxB,KAAK,EAAE,EAAE,CAAC,6BAA6B,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;SACzE,CAAA;QACD,MAAM,QAAQ,GAAG,MAAM,+BAA+B,CACpD,KAAK,EACL,MAAM,CAAC,KAAK,CAAC,IAAI,EACjB,MAAM,EACN,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,EAAE,EACjD,MAAM,CACP,CAAA;QACD,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAA;IAC3F,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synthetic-include-read.test.d.ts","sourceRoot":"","sources":["../../src/access/synthetic-include-read.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { filterReadableFields } from './field-visibility.js';
|
|
3
|
+
/**
|
|
4
|
+
* Regression coverage for issue #1082, Field Visibility half.
|
|
5
|
+
*
|
|
6
|
+
* `access-filter.test.ts` covers the pre-query scoping of a synthetic
|
|
7
|
+
* back-relation (`buildAccessScopedInclude`); these tests cover what happens
|
|
8
|
+
* to the rows it fetches. Before this fix, `filterReadableFields` recognised
|
|
9
|
+
* only a DECLARED relationship field (`fieldConfig?.type === 'relationship'`)
|
|
10
|
+
* as something to recurse into — a synthetic key has no declared field on the
|
|
11
|
+
* list it's fetched through, so it fell to the generic non-relationship
|
|
12
|
+
* branch and was copied into the result verbatim: no field-level `read` gate
|
|
13
|
+
* on the related rows, and no virtual field computed on them.
|
|
14
|
+
*/
|
|
15
|
+
// A relationship field pointing at another list.
|
|
16
|
+
function rel(ref, many = false) {
|
|
17
|
+
return { type: 'relationship', ref, many };
|
|
18
|
+
}
|
|
19
|
+
// A virtual field computed via resolveOutput.
|
|
20
|
+
function virtualField(resolveOutput) {
|
|
21
|
+
return {
|
|
22
|
+
type: 'virtual',
|
|
23
|
+
virtual: true,
|
|
24
|
+
hooks: { resolveOutput },
|
|
25
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- minimal field config for unit test
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function makeContext() {
|
|
29
|
+
return {
|
|
30
|
+
session: null,
|
|
31
|
+
_isSudo: false,
|
|
32
|
+
_resolveOutputChain: [],
|
|
33
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- minimal context for unit test
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
// Term ← Bill.term (list-only ref, no field on Term) — schema generation
|
|
37
|
+
// synthesizes `from_Bill_term` on Term, which no list config declares.
|
|
38
|
+
function syntheticConfig() {
|
|
39
|
+
return {
|
|
40
|
+
db: { provider: 'sqlite' },
|
|
41
|
+
lists: {
|
|
42
|
+
Term: {
|
|
43
|
+
fields: { name: { type: 'text' } },
|
|
44
|
+
access: { operation: { query: () => true } },
|
|
45
|
+
},
|
|
46
|
+
Bill: {
|
|
47
|
+
fields: {
|
|
48
|
+
amount: { type: 'integer' },
|
|
49
|
+
term: rel('Term'),
|
|
50
|
+
internalNotes: {
|
|
51
|
+
type: 'text',
|
|
52
|
+
access: { read: () => false },
|
|
53
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- minimal field config for unit test
|
|
54
|
+
},
|
|
55
|
+
label: virtualField(({ item }) => `Bill #${item.amount}`),
|
|
56
|
+
},
|
|
57
|
+
access: { operation: { query: () => true } },
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- minimal config for unit test
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
describe('filterReadableFields — synthetic back-relation (#1082)', () => {
|
|
64
|
+
it('applies the owning list field-level read access to rows fetched through a synthetic key', async () => {
|
|
65
|
+
const config = syntheticConfig();
|
|
66
|
+
const termRow = {
|
|
67
|
+
id: 't1',
|
|
68
|
+
name: 'Term 1',
|
|
69
|
+
from_Bill_term: [{ id: 'b1', amount: 5, internalNotes: 'secret' }],
|
|
70
|
+
};
|
|
71
|
+
const result = await filterReadableFields(termRow, config.lists.Term.fields, { session: null, context: makeContext() }, config, 0, 'Term');
|
|
72
|
+
const bills = result.from_Bill_term;
|
|
73
|
+
expect(bills).toHaveLength(1);
|
|
74
|
+
expect(bills[0].amount).toBe(5);
|
|
75
|
+
expect('internalNotes' in bills[0]).toBe(false);
|
|
76
|
+
});
|
|
77
|
+
it('computes a virtual field on rows fetched through a synthetic key', async () => {
|
|
78
|
+
const config = syntheticConfig();
|
|
79
|
+
const termRow = {
|
|
80
|
+
id: 't1',
|
|
81
|
+
name: 'Term 1',
|
|
82
|
+
from_Bill_term: [{ id: 'b1', amount: 5 }],
|
|
83
|
+
};
|
|
84
|
+
const result = await filterReadableFields(termRow, config.lists.Term.fields, { session: null, context: makeContext() }, config, 0, 'Term');
|
|
85
|
+
const bills = result.from_Bill_term;
|
|
86
|
+
expect(bills[0].label).toBe('Bill #5');
|
|
87
|
+
});
|
|
88
|
+
it('recurses through a to-one value fetched through a synthetic key the same as a to-many', async () => {
|
|
89
|
+
const config = syntheticConfig();
|
|
90
|
+
const termRow = {
|
|
91
|
+
id: 't1',
|
|
92
|
+
name: 'Term 1',
|
|
93
|
+
from_Bill_term: { id: 'b1', amount: 5, internalNotes: 'secret' },
|
|
94
|
+
};
|
|
95
|
+
const result = await filterReadableFields(termRow, config.lists.Term.fields, { session: null, context: makeContext() }, config, 0, 'Term');
|
|
96
|
+
const bill = result.from_Bill_term;
|
|
97
|
+
expect(bill.amount).toBe(5);
|
|
98
|
+
expect(bill.label).toBe('Bill #5');
|
|
99
|
+
expect('internalNotes' in bill).toBe(false);
|
|
100
|
+
});
|
|
101
|
+
it('leaves a declared, non-relationship field on the row untouched by the synthetic path', async () => {
|
|
102
|
+
// `name` is a declared scalar field on Term itself — the synthetic
|
|
103
|
+
// fallback only ever applies to a key ABSENT from `fieldConfigs`, so it
|
|
104
|
+
// must never interfere with the list's own ordinary fields.
|
|
105
|
+
const config = syntheticConfig();
|
|
106
|
+
const termRow = { id: 't1', name: 'Term 1' };
|
|
107
|
+
const result = await filterReadableFields(termRow, config.lists.Term.fields, { session: null, context: makeContext() }, config, 0, 'Term');
|
|
108
|
+
expect(result).toEqual({ id: 't1', name: 'Term 1' });
|
|
109
|
+
});
|
|
110
|
+
it('leaves an undeclared, non-synthetic key untouched (no config supplied)', async () => {
|
|
111
|
+
// Mirrors the pre-#1082 narrow-unit-test contract: without `config`
|
|
112
|
+
// there is nothing to resolve a synthetic key against, so the field
|
|
113
|
+
// passes through as a plain value — the same fallback
|
|
114
|
+
// `filterWritableFields` documents for its own `config`-less callers.
|
|
115
|
+
const config = syntheticConfig();
|
|
116
|
+
const termRow = { id: 't1', name: 'Term 1', from_Bill_term: [{ id: 'b1', amount: 5 }] };
|
|
117
|
+
const result = await filterReadableFields(termRow, config.lists.Term.fields, { session: null, context: makeContext() }, undefined, 0, 'Term');
|
|
118
|
+
expect(result.from_Bill_term).toEqual([{ id: 'b1', amount: 5 }]);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
//# sourceMappingURL=synthetic-include-read.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synthetic-include-read.test.js","sourceRoot":"","sources":["../../src/access/synthetic-include-read.test.ts"],"names":[],"mappings":"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"}
|
package/dist/config/types.d.ts
CHANGED
|
@@ -13,7 +13,7 @@ export type FieldResolveInputHookArgs<TTypeInfo extends TypeInfo, TFieldKey exte
|
|
|
13
13
|
inputData: TTypeInfo['inputs']['create'];
|
|
14
14
|
item: undefined;
|
|
15
15
|
resolvedData: TTypeInfo['inputs']['create'];
|
|
16
|
-
context: import('../
|
|
16
|
+
context: import('../context/index.js').StackContext;
|
|
17
17
|
} | {
|
|
18
18
|
listKey: string;
|
|
19
19
|
fieldKey: TFieldKey;
|
|
@@ -21,7 +21,7 @@ export type FieldResolveInputHookArgs<TTypeInfo extends TypeInfo, TFieldKey exte
|
|
|
21
21
|
inputData: TTypeInfo['inputs']['update'];
|
|
22
22
|
item: TTypeInfo['item'];
|
|
23
23
|
resolvedData: TTypeInfo['inputs']['update'];
|
|
24
|
-
context: import('../
|
|
24
|
+
context: import('../context/index.js').StackContext;
|
|
25
25
|
};
|
|
26
26
|
/** Arguments for {@link FieldHooks.validate} (and its deprecated `validateInput` alias). */
|
|
27
27
|
export type FieldValidateHookArgs<TTypeInfo extends TypeInfo, TFieldKey extends FieldKeys<TTypeInfo['fields']> = FieldKeys<TTypeInfo['fields']>> = {
|
|
@@ -31,7 +31,7 @@ export type FieldValidateHookArgs<TTypeInfo extends TypeInfo, TFieldKey extends
|
|
|
31
31
|
inputData: TTypeInfo['inputs']['create'];
|
|
32
32
|
item: undefined;
|
|
33
33
|
resolvedData: TTypeInfo['inputs']['create'];
|
|
34
|
-
context: import('../
|
|
34
|
+
context: import('../context/index.js').StackContext;
|
|
35
35
|
addValidationError: (msg: string) => void;
|
|
36
36
|
} | {
|
|
37
37
|
listKey: string;
|
|
@@ -40,14 +40,14 @@ export type FieldValidateHookArgs<TTypeInfo extends TypeInfo, TFieldKey extends
|
|
|
40
40
|
inputData: TTypeInfo['inputs']['update'];
|
|
41
41
|
item: TTypeInfo['item'];
|
|
42
42
|
resolvedData: TTypeInfo['inputs']['update'];
|
|
43
|
-
context: import('../
|
|
43
|
+
context: import('../context/index.js').StackContext;
|
|
44
44
|
addValidationError: (msg: string) => void;
|
|
45
45
|
} | {
|
|
46
46
|
listKey: string;
|
|
47
47
|
fieldKey: TFieldKey;
|
|
48
48
|
operation: 'delete';
|
|
49
49
|
item: TTypeInfo['item'];
|
|
50
|
-
context: import('../
|
|
50
|
+
context: import('../context/index.js').StackContext;
|
|
51
51
|
addValidationError: (msg: string) => void;
|
|
52
52
|
};
|
|
53
53
|
/** Arguments for {@link FieldHooks.beforeOperation}. */
|
|
@@ -57,7 +57,7 @@ export type FieldBeforeOperationHookArgs<TTypeInfo extends TypeInfo, TFieldKey e
|
|
|
57
57
|
operation: 'create';
|
|
58
58
|
inputData: TTypeInfo['inputs']['create'];
|
|
59
59
|
resolvedData: TTypeInfo['inputs']['create'];
|
|
60
|
-
context: import('../
|
|
60
|
+
context: import('../context/index.js').StackContext;
|
|
61
61
|
} | {
|
|
62
62
|
listKey: string;
|
|
63
63
|
fieldKey: TFieldKey;
|
|
@@ -65,13 +65,13 @@ export type FieldBeforeOperationHookArgs<TTypeInfo extends TypeInfo, TFieldKey e
|
|
|
65
65
|
inputData: TTypeInfo['inputs']['update'];
|
|
66
66
|
item: TTypeInfo['item'];
|
|
67
67
|
resolvedData: TTypeInfo['inputs']['update'];
|
|
68
|
-
context: import('../
|
|
68
|
+
context: import('../context/index.js').StackContext;
|
|
69
69
|
} | {
|
|
70
70
|
listKey: string;
|
|
71
71
|
fieldKey: TFieldKey;
|
|
72
72
|
operation: 'delete';
|
|
73
73
|
item: TTypeInfo['item'];
|
|
74
|
-
context: import('../
|
|
74
|
+
context: import('../context/index.js').StackContext;
|
|
75
75
|
};
|
|
76
76
|
/** Arguments for {@link FieldHooks.afterOperation}. */
|
|
77
77
|
export type FieldAfterOperationHookArgs<TTypeInfo extends TypeInfo, TFieldKey extends FieldKeys<TTypeInfo['fields']> = FieldKeys<TTypeInfo['fields']>> = {
|
|
@@ -81,7 +81,7 @@ export type FieldAfterOperationHookArgs<TTypeInfo extends TypeInfo, TFieldKey ex
|
|
|
81
81
|
inputData: TTypeInfo['inputs']['create'];
|
|
82
82
|
item: TTypeInfo['item'];
|
|
83
83
|
resolvedData: TTypeInfo['inputs']['create'];
|
|
84
|
-
context: import('../
|
|
84
|
+
context: import('../context/index.js').StackContext;
|
|
85
85
|
} | {
|
|
86
86
|
listKey: string;
|
|
87
87
|
fieldKey: TFieldKey;
|
|
@@ -90,13 +90,13 @@ export type FieldAfterOperationHookArgs<TTypeInfo extends TypeInfo, TFieldKey ex
|
|
|
90
90
|
originalItem: TTypeInfo['item'];
|
|
91
91
|
item: TTypeInfo['item'];
|
|
92
92
|
resolvedData: TTypeInfo['inputs']['update'];
|
|
93
|
-
context: import('../
|
|
93
|
+
context: import('../context/index.js').StackContext;
|
|
94
94
|
} | {
|
|
95
95
|
listKey: string;
|
|
96
96
|
fieldKey: TFieldKey;
|
|
97
97
|
operation: 'delete';
|
|
98
98
|
originalItem: TTypeInfo['item'];
|
|
99
|
-
context: import('../
|
|
99
|
+
context: import('../context/index.js').StackContext;
|
|
100
100
|
};
|
|
101
101
|
/**
|
|
102
102
|
* Arguments for field-level beforeTransaction hook (#590 / ADR-0010).
|
|
@@ -506,6 +506,32 @@ export type BaseFieldConfig<TTypeInfo extends TypeInfo> = {
|
|
|
506
506
|
* ```
|
|
507
507
|
*/
|
|
508
508
|
description?: string;
|
|
509
|
+
/**
|
|
510
|
+
* Whether this field belongs in a list/related-list table's DEFAULT
|
|
511
|
+
* column set (issue #1018) — the columns shown when nothing explicitly
|
|
512
|
+
* names them (`ui.listView.initialColumns` on the list, or a
|
|
513
|
+
* relationship's own `ui.itemView.columns`). Naming the field explicitly
|
|
514
|
+
* in either of those always shows it regardless of this flag; it governs
|
|
515
|
+
* only what appears absent an explicit column list.
|
|
516
|
+
*
|
|
517
|
+
* This is a PRESENTATION default, not an access control — a field can be
|
|
518
|
+
* read-denied and still default to `true` here (it simply renders empty
|
|
519
|
+
* for a viewer who can't read it), and setting this to `false` hides a
|
|
520
|
+
* column without restricting who can read the underlying value. The
|
|
521
|
+
* field-level `access.read` deny remains the only real boundary.
|
|
522
|
+
*
|
|
523
|
+
* @default true
|
|
524
|
+
*
|
|
525
|
+
* @example Hide an internal field from default table views without denying read access
|
|
526
|
+
* ```typescript
|
|
527
|
+
* fields: {
|
|
528
|
+
* internalScore: integer({ ui: { listView: { defaultColumn: false } } }),
|
|
529
|
+
* }
|
|
530
|
+
* ```
|
|
531
|
+
*/
|
|
532
|
+
listView?: {
|
|
533
|
+
defaultColumn?: boolean;
|
|
534
|
+
};
|
|
509
535
|
/**
|
|
510
536
|
* Transform field value before sending to client (browser)
|
|
511
537
|
* Useful for sensitive fields (e.g., passwords) or complex data structures
|
|
@@ -749,6 +775,7 @@ export type IntegerField<TTypeInfo extends TypeInfo = TypeInfo> = BaseFieldConfi
|
|
|
749
775
|
min?: number;
|
|
750
776
|
max?: number;
|
|
751
777
|
};
|
|
778
|
+
isIndexed?: boolean | 'unique';
|
|
752
779
|
};
|
|
753
780
|
export type DecimalField<TTypeInfo extends TypeInfo = TypeInfo> = BaseFieldConfig<TTypeInfo> & {
|
|
754
781
|
type: 'decimal';
|
|
@@ -788,6 +815,7 @@ export type TimestampField<TTypeInfo extends TypeInfo = TypeInfo> = BaseFieldCon
|
|
|
788
815
|
defaultValue?: {
|
|
789
816
|
kind: 'now';
|
|
790
817
|
} | Date;
|
|
818
|
+
isIndexed?: boolean | 'unique';
|
|
791
819
|
};
|
|
792
820
|
export type CalendarDayField<TTypeInfo extends TypeInfo = TypeInfo> = BaseFieldConfig<TTypeInfo> & {
|
|
793
821
|
type: 'calendarDay';
|
|
@@ -886,6 +914,7 @@ export type SelectField<TTypeInfo extends TypeInfo = TypeInfo> = BaseFieldConfig
|
|
|
886
914
|
validation?: {
|
|
887
915
|
isRequired?: boolean;
|
|
888
916
|
};
|
|
917
|
+
isIndexed?: boolean | 'unique';
|
|
889
918
|
ui?: {
|
|
890
919
|
displayMode?: 'select' | 'segmented-control' | 'radio';
|
|
891
920
|
};
|
|
@@ -911,8 +940,10 @@ export type RelationshipItemViewConfig = {
|
|
|
911
940
|
* The related list's fields to show as Relationship-table columns, in order.
|
|
912
941
|
*
|
|
913
942
|
* When omitted, the columns default to the related list's own column
|
|
914
|
-
* curation (`ui.listView.initialColumns`, else
|
|
915
|
-
*
|
|
943
|
+
* curation (`ui.listView.initialColumns`, else every field whose own
|
|
944
|
+
* `ui.listView.defaultColumn` declaration holds — see {@link
|
|
945
|
+
* BaseFieldConfig.ui}) minus the back-reference field that points at the
|
|
946
|
+
* parent record.
|
|
916
947
|
*
|
|
917
948
|
* @example
|
|
918
949
|
* ```typescript
|
|
@@ -1027,13 +1058,20 @@ export type RelationshipField<TTypeInfo extends TypeInfo = TypeInfo> = BaseField
|
|
|
1027
1058
|
*/
|
|
1028
1059
|
isNullable?: boolean;
|
|
1029
1060
|
/**
|
|
1030
|
-
* Controls foreign key placement and column name
|
|
1031
|
-
* Can be a boolean or an object with a map property
|
|
1032
|
-
* Only valid on single (non-many) relationships
|
|
1033
|
-
* Cannot be true on both sides of a one-to-one relationship
|
|
1061
|
+
* Controls foreign key placement and column name.
|
|
1062
|
+
* Can be a boolean or an object with a map property.
|
|
1063
|
+
* Only valid on single (non-many) relationships.
|
|
1064
|
+
* Cannot be true on both sides of a one-to-one relationship.
|
|
1034
1065
|
*
|
|
1035
|
-
*
|
|
1036
|
-
*
|
|
1066
|
+
* The boolean form (the "which side owns the foreign key" sense) is only
|
|
1067
|
+
* meaningful on a bidirectional ref (`ref: 'ListName.fieldName'`) — a
|
|
1068
|
+
* list-only ref (`ref: 'ListName'`) always owns the foreign key, so a
|
|
1069
|
+
* boolean here is rejected. The `{ map }` form (the column-name sense)
|
|
1070
|
+
* works on both: it renames the foreign key column without changing
|
|
1071
|
+
* ownership.
|
|
1072
|
+
*
|
|
1073
|
+
* When a boolean, defaults the foreign key column name to the field name.
|
|
1074
|
+
* When an object with map, uses the provided column name.
|
|
1037
1075
|
*
|
|
1038
1076
|
* @example
|
|
1039
1077
|
* ```typescript
|
|
@@ -1058,6 +1096,14 @@ export type RelationshipField<TTypeInfo extends TypeInfo = TypeInfo> = BaseField
|
|
|
1058
1096
|
* user: relationship({ ref: 'User.account' }) // No foreign key on this side
|
|
1059
1097
|
* }
|
|
1060
1098
|
* })
|
|
1099
|
+
*
|
|
1100
|
+
* // List-only ref: rename the foreign key column (ownership is implicit)
|
|
1101
|
+
* Post: list({
|
|
1102
|
+
* fields: {
|
|
1103
|
+
* category: relationship({ ref: 'Category', db: { foreignKey: { map: 'category_id' } } })
|
|
1104
|
+
* // Generates: categoryId String? @map("category_id")
|
|
1105
|
+
* }
|
|
1106
|
+
* })
|
|
1061
1107
|
* ```
|
|
1062
1108
|
*/
|
|
1063
1109
|
foreignKey?: boolean | {
|
|
@@ -1335,6 +1381,18 @@ export interface TypeInfo<TKey extends string = string, TFields extends Record<s
|
|
|
1335
1381
|
}
|
|
1336
1382
|
export type OperationAccess<T = any> = {
|
|
1337
1383
|
query?: AccessControl<T>;
|
|
1384
|
+
/**
|
|
1385
|
+
* Shares `AccessControl`'s signature (so a filter still type-checks here),
|
|
1386
|
+
* but at runtime `create` accepts a `boolean` result only. There is no
|
|
1387
|
+
* existing row to scope with a filter, and — unlike `update`/`delete`,
|
|
1388
|
+
* which re-check a returned filter against the target row via
|
|
1389
|
+
* `findFirst` — no equivalent re-check exists for a row that doesn't exist
|
|
1390
|
+
* in the database yet. A rule that returns a filter (or any other
|
|
1391
|
+
* non-boolean) throws `InvalidCreateAccessResultError` rather than being
|
|
1392
|
+
* treated as an allow (see #1009, ADR-0022, ADR-0030). To scope create by
|
|
1393
|
+
* ownership, evaluate the condition in a `resolveInput`/`validate` hook,
|
|
1394
|
+
* where the input data is in scope.
|
|
1395
|
+
*/
|
|
1338
1396
|
create?: AccessControl<T>;
|
|
1339
1397
|
update?: AccessControl<T>;
|
|
1340
1398
|
delete?: AccessControl<T>;
|
|
@@ -1388,14 +1446,14 @@ export type ResolveInputHookArgs<TOutput = Record<string, unknown>, TCreateInput
|
|
|
1388
1446
|
inputData: TCreateInput;
|
|
1389
1447
|
resolvedData: TCreateInput;
|
|
1390
1448
|
item: undefined;
|
|
1391
|
-
context: import('../
|
|
1449
|
+
context: import('../context/index.js').StackContext;
|
|
1392
1450
|
} | {
|
|
1393
1451
|
listKey: string;
|
|
1394
1452
|
operation: 'update';
|
|
1395
1453
|
inputData: TUpdateInput;
|
|
1396
1454
|
resolvedData: TUpdateInput;
|
|
1397
1455
|
item: TOutput;
|
|
1398
|
-
context: import('../
|
|
1456
|
+
context: import('../context/index.js').StackContext;
|
|
1399
1457
|
};
|
|
1400
1458
|
/**
|
|
1401
1459
|
* Hook arguments for the list-level `validate` hook (renamed from `validateInput` for Keystone compatibility).
|
|
@@ -1409,7 +1467,7 @@ export type ValidateHookArgs<TOutput = Record<string, unknown>, TCreateInput = R
|
|
|
1409
1467
|
inputData: TCreateInput;
|
|
1410
1468
|
resolvedData: TCreateInput;
|
|
1411
1469
|
item: undefined;
|
|
1412
|
-
context: import('../
|
|
1470
|
+
context: import('../context/index.js').StackContext;
|
|
1413
1471
|
addValidationError: (msg: string) => void;
|
|
1414
1472
|
} | {
|
|
1415
1473
|
listKey: string;
|
|
@@ -1417,13 +1475,13 @@ export type ValidateHookArgs<TOutput = Record<string, unknown>, TCreateInput = R
|
|
|
1417
1475
|
inputData: TUpdateInput;
|
|
1418
1476
|
resolvedData: TUpdateInput;
|
|
1419
1477
|
item: TOutput;
|
|
1420
|
-
context: import('../
|
|
1478
|
+
context: import('../context/index.js').StackContext;
|
|
1421
1479
|
addValidationError: (msg: string) => void;
|
|
1422
1480
|
} | {
|
|
1423
1481
|
listKey: string;
|
|
1424
1482
|
operation: 'delete';
|
|
1425
1483
|
item: TOutput;
|
|
1426
|
-
context: import('../
|
|
1484
|
+
context: import('../context/index.js').StackContext;
|
|
1427
1485
|
addValidationError: (msg: string) => void;
|
|
1428
1486
|
};
|
|
1429
1487
|
/**
|
|
@@ -1437,19 +1495,19 @@ export type BeforeOperationHookArgs<TOutput = Record<string, unknown>, TCreateIn
|
|
|
1437
1495
|
operation: 'create';
|
|
1438
1496
|
inputData: TCreateInput;
|
|
1439
1497
|
resolvedData: TCreateInput;
|
|
1440
|
-
context: import('../
|
|
1498
|
+
context: import('../context/index.js').StackContext;
|
|
1441
1499
|
} | {
|
|
1442
1500
|
listKey: string;
|
|
1443
1501
|
operation: 'update';
|
|
1444
1502
|
inputData: TUpdateInput;
|
|
1445
1503
|
item: TOutput;
|
|
1446
1504
|
resolvedData: TUpdateInput;
|
|
1447
|
-
context: import('../
|
|
1505
|
+
context: import('../context/index.js').StackContext;
|
|
1448
1506
|
} | {
|
|
1449
1507
|
listKey: string;
|
|
1450
1508
|
operation: 'delete';
|
|
1451
1509
|
item: TOutput;
|
|
1452
|
-
context: import('../
|
|
1510
|
+
context: import('../context/index.js').StackContext;
|
|
1453
1511
|
};
|
|
1454
1512
|
/**
|
|
1455
1513
|
* Hook arguments for the list-level `afterOperation` hook.
|
|
@@ -1463,7 +1521,7 @@ export type AfterOperationHookArgs<TOutput = Record<string, unknown>, TCreateInp
|
|
|
1463
1521
|
inputData: TCreateInput;
|
|
1464
1522
|
item: TOutput;
|
|
1465
1523
|
resolvedData: TCreateInput;
|
|
1466
|
-
context: import('../
|
|
1524
|
+
context: import('../context/index.js').StackContext;
|
|
1467
1525
|
} | {
|
|
1468
1526
|
listKey: string;
|
|
1469
1527
|
operation: 'update';
|
|
@@ -1471,12 +1529,12 @@ export type AfterOperationHookArgs<TOutput = Record<string, unknown>, TCreateInp
|
|
|
1471
1529
|
originalItem: TOutput;
|
|
1472
1530
|
item: TOutput;
|
|
1473
1531
|
resolvedData: TUpdateInput;
|
|
1474
|
-
context: import('../
|
|
1532
|
+
context: import('../context/index.js').StackContext;
|
|
1475
1533
|
} | {
|
|
1476
1534
|
listKey: string;
|
|
1477
1535
|
operation: 'delete';
|
|
1478
1536
|
originalItem: TOutput;
|
|
1479
|
-
context: import('../
|
|
1537
|
+
context: import('../context/index.js').StackContext;
|
|
1480
1538
|
};
|
|
1481
1539
|
/**
|
|
1482
1540
|
* Hook arguments for the list-level beforeTransaction hook (#590 / ADR-0010).
|
|
@@ -1744,6 +1802,12 @@ export type ListConfig<TTypeInfo extends TypeInfo> = {
|
|
|
1744
1802
|
* the bad field too — no entry is ever silently dropped or emitted as
|
|
1745
1803
|
* invalid Prisma.
|
|
1746
1804
|
*
|
|
1805
|
+
* `createdAt`/`updatedAt` are a valid entry even when the list has no
|
|
1806
|
+
* matching declared field — an entry may name either as long as the
|
|
1807
|
+
* list's auto-timestamps (`db.timestamps`, global or per-list) are
|
|
1808
|
+
* enabled for that column, since the auto-injected column has no `@map`
|
|
1809
|
+
* of its own and its Prisma field name is exactly `createdAt`/`updatedAt`.
|
|
1810
|
+
*
|
|
1747
1811
|
* @example One audition per student per production (composite unique)
|
|
1748
1812
|
* ```typescript
|
|
1749
1813
|
* Audition: list({
|
|
@@ -2000,14 +2064,16 @@ export interface BulkAction {
|
|
|
2000
2064
|
* `ui.listView`.
|
|
2001
2065
|
*
|
|
2002
2066
|
* When omitted, the admin UI falls back to its existing defaults: every
|
|
2003
|
-
*
|
|
2067
|
+
* field whose own `ui.listView.defaultColumn` declaration holds is shown as
|
|
2068
|
+
* a column (see {@link BaseFieldConfig.ui}) and no default sort is applied.
|
|
2004
2069
|
*/
|
|
2005
2070
|
export type ListViewUIConfig = {
|
|
2006
2071
|
/**
|
|
2007
2072
|
* The fields to show as columns in the list table, in order.
|
|
2008
2073
|
*
|
|
2009
2074
|
* Drives both the column **selection** and their **order**. When omitted,
|
|
2010
|
-
*
|
|
2075
|
+
* every field whose own `ui.listView.defaultColumn` declaration holds is
|
|
2076
|
+
* shown (current default behaviour).
|
|
2011
2077
|
*
|
|
2012
2078
|
* @example
|
|
2013
2079
|
* ```typescript
|