@opensaas/stack-core 0.23.0 → 0.25.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 +256 -0
- package/dist/access/access-filter.d.ts +39 -0
- package/dist/access/access-filter.d.ts.map +1 -1
- package/dist/access/access-filter.js +121 -0
- package/dist/access/access-filter.js.map +1 -1
- package/dist/access/field-access.d.ts +1 -0
- package/dist/access/field-access.d.ts.map +1 -1
- package/dist/access/field-access.js +79 -4
- package/dist/access/field-access.js.map +1 -1
- package/dist/access/field-access.test.js +213 -0
- package/dist/access/field-access.test.js.map +1 -1
- package/dist/access/index.d.ts +1 -1
- package/dist/access/index.d.ts.map +1 -1
- package/dist/access/index.js +1 -1
- package/dist/access/index.js.map +1 -1
- package/dist/access/types.d.ts +39 -0
- package/dist/access/types.d.ts.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/types.d.ts +378 -0
- 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 +153 -26
- package/dist/context/index.js.map +1 -1
- package/dist/context/nested-operations.d.ts +59 -3
- package/dist/context/nested-operations.d.ts.map +1 -1
- package/dist/context/nested-operations.js +552 -129
- package/dist/context/nested-operations.js.map +1 -1
- package/dist/context/transaction-boundary.d.ts +91 -0
- package/dist/context/transaction-boundary.d.ts.map +1 -0
- package/dist/context/transaction-boundary.js +329 -0
- package/dist/context/transaction-boundary.js.map +1 -0
- package/dist/context/write-pipeline.d.ts +15 -1
- package/dist/context/write-pipeline.d.ts.map +1 -1
- package/dist/context/write-pipeline.js +173 -10
- package/dist/context/write-pipeline.js.map +1 -1
- package/dist/fields/calendar-day.test.d.ts +2 -0
- package/dist/fields/calendar-day.test.d.ts.map +1 -0
- package/dist/fields/calendar-day.test.js +120 -0
- package/dist/fields/calendar-day.test.js.map +1 -0
- package/dist/fields/index.d.ts +18 -2
- package/dist/fields/index.d.ts.map +1 -1
- package/dist/fields/index.js +93 -17
- package/dist/fields/index.js.map +1 -1
- package/dist/hooks/index.d.ts +116 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +154 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/validation/schema.test.js +222 -1
- package/dist/validation/schema.test.js.map +1 -1
- package/package.json +1 -1
- package/src/access/access-filter.ts +156 -0
- package/src/access/field-access.test.ts +255 -0
- package/src/access/field-access.ts +91 -5
- package/src/access/index.ts +1 -1
- package/src/access/types.ts +45 -0
- package/src/config/index.ts +2 -0
- package/src/config/types.ts +426 -0
- package/src/context/index.ts +207 -37
- package/src/context/nested-operations.ts +969 -143
- package/src/context/transaction-boundary.ts +440 -0
- package/src/context/write-pipeline.ts +234 -13
- package/src/fields/calendar-day.test.ts +140 -0
- package/src/fields/index.ts +96 -16
- package/src/hooks/index.ts +265 -0
- package/src/validation/schema.test.ts +266 -1
- package/tests/access.test.ts +24 -16
- package/tests/config.test.ts +30 -0
- package/tests/context.test.ts +481 -0
- package/tests/field-types.test.ts +17 -3
- package/tests/nested-access-and-hooks.test.ts +1130 -54
- package/tests/nested-operation-registry.test.ts +28 -3
- package/tests/nested-write-hooks.test.ts +864 -0
- package/tests/transaction-boundary-hooks.test.ts +465 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
import { checkAccess, mergeFilters, filterReadableFields, filterWritableFields, } from '../access/index.js';
|
|
2
2
|
import { executeValidate, executeBeforeOperation, executeAfterOperation, executeFieldValidateHooks, executeFieldBeforeOperationHooks, executeFieldAfterOperationHooks, ValidationError, } from '../hooks/index.js';
|
|
3
3
|
import { hookPipeline } from './hook-pipeline.js';
|
|
4
|
-
import { processNestedOperations } from './nested-operations.js';
|
|
4
|
+
import { processNestedOperations, runAfterTasks } from './nested-operations.js';
|
|
5
|
+
import { enumerateInvolvedLists, runWithTransactionBoundary } from './transaction-boundary.js';
|
|
5
6
|
import { getDbKey } from '../lib/case-utils.js';
|
|
7
|
+
// NOTE: `index.ts` imports from this module too — this is an intentional cyclic
|
|
8
|
+
// dependency. It is safe because `buildDbDelegate` is only INVOKED at write
|
|
9
|
+
// time (never during module evaluation), so by the time it runs the export is
|
|
10
|
+
// fully initialised.
|
|
11
|
+
import { buildDbDelegate } from './index.js';
|
|
6
12
|
/**
|
|
7
13
|
* Resolve the dynamic Prisma model for a list. Model names are generated at
|
|
8
14
|
* runtime from list keys, which is the one place a cast is unavoidable — it is
|
|
@@ -12,6 +18,24 @@ function getModel(prisma, listName) {
|
|
|
12
18
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- model names are generated at runtime
|
|
13
19
|
return prisma[getDbKey(listName)];
|
|
14
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Run `fn` inside ONE interactive transaction (ADR-0010: every write is
|
|
23
|
+
* transactional, so the hook contract does not depend on whether a write
|
|
24
|
+
* happened to be nested). The transaction client `tx` is passed to `fn` and
|
|
25
|
+
* used as the persistence target for the parent + all nested writes, so they
|
|
26
|
+
* are atomic and a throwing hook rolls the whole write back.
|
|
27
|
+
*
|
|
28
|
+
* If the client does not expose `$transaction` (e.g. a test mock), `fn` runs
|
|
29
|
+
* directly against the client — the hook ordering and arguments are identical;
|
|
30
|
+
* only the rollback guarantee is provided by the real transaction.
|
|
31
|
+
*/
|
|
32
|
+
async function runInTransaction(prisma, fn) {
|
|
33
|
+
const client = prisma;
|
|
34
|
+
if (typeof client.$transaction === 'function') {
|
|
35
|
+
return (await client.$transaction(async (tx) => fn(tx)));
|
|
36
|
+
}
|
|
37
|
+
return fn(prisma);
|
|
38
|
+
}
|
|
15
39
|
/**
|
|
16
40
|
* Check if a list is configured as a singleton.
|
|
17
41
|
*/
|
|
@@ -46,13 +70,107 @@ function isSingletonList(listConfig) {
|
|
|
46
70
|
* current behaviour.
|
|
47
71
|
*/
|
|
48
72
|
export async function runWritePipeline(args) {
|
|
49
|
-
const { listName, listConfig,
|
|
73
|
+
const { prisma, listName, listConfig, context, config, inputData, strategy } = args;
|
|
74
|
+
// ── Pre-transaction access gate (#590) ──────────────────────────────────────
|
|
75
|
+
// Resolve the TOP-LEVEL target + operation-level access OUTSIDE the
|
|
76
|
+
// transaction first, using the NON-transactional client. A
|
|
77
|
+
// denied/missing/filter-non-match target short-circuits to `null` (silent
|
|
78
|
+
// failure) WITHOUT firing any transaction-boundary hooks — a denied write
|
|
79
|
+
// opens no transaction and takes no external action, so it must not run
|
|
80
|
+
// beforeTransaction/afterTransaction. This resolution also yields the
|
|
81
|
+
// top-level `originalItem` the boundary hooks receive for update/delete.
|
|
82
|
+
// The result is passed into the transaction as `preResolvedTarget` and REUSED
|
|
83
|
+
// there (the in-transaction resolveTarget does NOT re-run), so the target is
|
|
84
|
+
// read exactly once — #569's resolveTarget call-count semantics are preserved.
|
|
85
|
+
const gate = await strategy.resolveTarget(getModel(prisma, listName));
|
|
86
|
+
if (gate.status === 'denied') {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
// ── Enumerate involved lists from the input tree (no DB reads) ──────────────
|
|
90
|
+
const involvedLists = enumerateInvolvedLists({
|
|
91
|
+
listName,
|
|
92
|
+
listConfig,
|
|
93
|
+
operation: strategy.operation,
|
|
94
|
+
inputData,
|
|
95
|
+
topLevelOriginalItem: gate.originalItem,
|
|
96
|
+
config,
|
|
97
|
+
});
|
|
98
|
+
// ── Bracket the transaction with beforeTransaction/afterTransaction (#590) ──
|
|
99
|
+
// beforeTransaction runs before the transaction opens; afterTransaction runs
|
|
100
|
+
// after it settles (commit or rollback), per the symmetric-bracket rule.
|
|
101
|
+
return runWithTransactionBoundary({
|
|
102
|
+
involvedLists,
|
|
103
|
+
context,
|
|
104
|
+
runTransaction: () =>
|
|
105
|
+
// ADR-0010: every write runs inside ONE interactive transaction. The
|
|
106
|
+
// parent and ALL nested writes share this transaction's client `tx` as
|
|
107
|
+
// their persistence target, so they are atomic and a throwing
|
|
108
|
+
// `beforeOperation`/`afterOperation` (or validation) rolls the whole write
|
|
109
|
+
// back. `runWriteInTransaction` resolves the target row, runs the full
|
|
110
|
+
// hook pipeline, persists, and runs nested + own `afterOperation` — all
|
|
111
|
+
// against `tx`.
|
|
112
|
+
runInTransaction(prisma, (tx) => runWriteInTransaction({
|
|
113
|
+
...args,
|
|
114
|
+
prisma: tx,
|
|
115
|
+
// Reuse the pre-transaction target resolution (computed above) so the
|
|
116
|
+
// target is read exactly once (#569 call-count semantics preserved).
|
|
117
|
+
preResolvedTarget: gate,
|
|
118
|
+
// ADR-0010 atomicity: hooks that write via `context.db` must hit the
|
|
119
|
+
// SAME transaction, or those writes would commit independently and
|
|
120
|
+
// survive a rollback. Rebind the context's `db` (and `prisma`) to the
|
|
121
|
+
// transaction client `tx` so before/afterOperation `context.db` writes
|
|
122
|
+
// participate in — and roll back with — this write's transaction.
|
|
123
|
+
context: bindContextToTransaction(args, tx),
|
|
124
|
+
})),
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Build an {@link AccessContext} whose `db`/`prisma` target the transaction
|
|
129
|
+
* client `tx`, so any `context.db` write a hook performs runs inside this
|
|
130
|
+
* write's transaction and rolls back with it (ADR-0010).
|
|
131
|
+
*
|
|
132
|
+
* The access-controlled `db` delegates capture their Prisma client at
|
|
133
|
+
* construction, so the request-time `context.db` is bound to the ORIGINAL
|
|
134
|
+
* client. We rebuild the delegates against `tx` via {@link buildDbDelegate},
|
|
135
|
+
* reusing the request context's `session`, `storage`, `plugins`, `_isSudo`, and
|
|
136
|
+
* the shared `_resolveOutputCounter` reference (so resolveOutput depth tracking
|
|
137
|
+
* is preserved). Plugin runtimes are NOT re-executed; the existing
|
|
138
|
+
* `plugins` object is reused as-is.
|
|
139
|
+
*/
|
|
140
|
+
function bindContextToTransaction(args, tx) {
|
|
141
|
+
const { context, config } = args;
|
|
142
|
+
const txContext = {
|
|
143
|
+
session: context.session,
|
|
144
|
+
prisma: tx,
|
|
145
|
+
db: context.db,
|
|
146
|
+
storage: context.storage,
|
|
147
|
+
plugins: context.plugins,
|
|
148
|
+
_isSudo: context._isSudo,
|
|
149
|
+
_resolveOutputCounter: context._resolveOutputCounter,
|
|
150
|
+
};
|
|
151
|
+
// Rebuild the db delegate against `tx`, pointing back at `txContext` so hooks
|
|
152
|
+
// reached through it also see the transactional context.
|
|
153
|
+
txContext.db = buildDbDelegate(config, tx, txContext);
|
|
154
|
+
return txContext;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* The body of one secured write, executed against the transaction client `tx`
|
|
158
|
+
* (passed in as `args.prisma`). Returns `null` for the silent-failure cases and
|
|
159
|
+
* the Field-Visibility-filtered row otherwise. Any throw here propagates out of
|
|
160
|
+
* `runInTransaction` and rolls the transaction back.
|
|
161
|
+
*/
|
|
162
|
+
async function runWriteInTransaction(args) {
|
|
163
|
+
const { listName, listConfig, prisma: tx, context, config, inputData, strategy } = args;
|
|
50
164
|
const { operation } = strategy;
|
|
51
|
-
const model = getModel(
|
|
165
|
+
const model = getModel(tx, listName);
|
|
52
166
|
// ── Phase 1: resolve target + operation-level access ──────────────────────
|
|
53
167
|
// Short-circuits to `null` (silent failure) for missing target, denied
|
|
54
168
|
// access, or filter non-match — before any hook side effects or the DB call.
|
|
55
|
-
|
|
169
|
+
// The transaction-boundary bracket (#590) already resolved this once before
|
|
170
|
+
// opening the transaction; reuse that result rather than reading the target
|
|
171
|
+
// twice. (When invoked without the bracket — e.g. a direct unit test — fall
|
|
172
|
+
// back to resolving here against the tx model.)
|
|
173
|
+
const resolution = args.preResolvedTarget ?? (await strategy.resolveTarget(model));
|
|
56
174
|
if (resolution.status === 'denied') {
|
|
57
175
|
return null;
|
|
58
176
|
}
|
|
@@ -88,7 +206,17 @@ export async function runWritePipeline(args) {
|
|
|
88
206
|
inputData: input,
|
|
89
207
|
});
|
|
90
208
|
// ── Phase 5.5: process nested relationship operations ───────────────────────
|
|
91
|
-
|
|
209
|
+
// This runs each nested record's resolveInput/validate/field-rules AND its
|
|
210
|
+
// `beforeOperation` (inside this transaction), returning the transformed
|
|
211
|
+
// payload plus deferred `afterOperation` tasks and the relation fields to
|
|
212
|
+
// `include` so those tasks can recover their persisted `item`. All nested DB
|
|
213
|
+
// reads/persistence go through `tx`.
|
|
214
|
+
const { data, afterTasks, includeFields } = await processNestedOperations(filteredData, listConfig.fields, config, { ...context, prisma: tx }, writeOp, listName, originalItem,
|
|
215
|
+
// Pass the enclosing write's `inputData` (the SAME value the Phase-5
|
|
216
|
+
// `filterWritableFields` call above uses) so the connect-site owning-field
|
|
217
|
+
// gate evaluates item-/inputData-dependent field rules identically to Phase 5
|
|
218
|
+
// and the two cannot diverge into a spurious connect denial (#588 finding).
|
|
219
|
+
input);
|
|
92
220
|
// ── Phase 6: field-level beforeOperation (side effects only) ────────────────
|
|
93
221
|
await executeFieldBeforeOperationHooks(input, resolvedData, listConfig.fields, writeOp, context, listName, originalItem);
|
|
94
222
|
// ── Phase 7: list-level beforeOperation ─────────────────────────────────────
|
|
@@ -109,7 +237,10 @@ export async function runWritePipeline(args) {
|
|
|
109
237
|
context,
|
|
110
238
|
});
|
|
111
239
|
// ── Phase 8: DB write ───────────────────────────────────────────────────────
|
|
112
|
-
|
|
240
|
+
// Ask the DB to return the nested relations that have deferred
|
|
241
|
+
// `afterOperation` tasks so they can recover their persisted `item`.
|
|
242
|
+
const include = buildIncludeFromFields(includeFields);
|
|
243
|
+
const item = await strategy.persist(model, data, include);
|
|
113
244
|
// ── Phase 9: list-level afterOperation ──────────────────────────────────────
|
|
114
245
|
await executeAfterOperation(listConfig.hooks, operation === 'create'
|
|
115
246
|
? {
|
|
@@ -132,12 +263,44 @@ export async function runWritePipeline(args) {
|
|
|
132
263
|
});
|
|
133
264
|
// ── Phase 10: field-level afterOperation (side effects only) ────────────────
|
|
134
265
|
await executeFieldAfterOperationHooks(item, input, resolvedData, listConfig.fields, writeOp, context, listName, originalItem);
|
|
266
|
+
// ── Phase 10.5: nested afterOperation (deferred, in this transaction) ────────
|
|
267
|
+
// Each nested create/update/delete's `afterOperation` fires now, with the
|
|
268
|
+
// persisted nested row recovered from the parent's included relations. A throw
|
|
269
|
+
// here rolls the whole transaction back (parent write included).
|
|
270
|
+
await runNestedAfterTasks(afterTasks, item);
|
|
135
271
|
// ── Phase 11: Field Visibility (filter readable fields + resolveOutput) ─────
|
|
136
272
|
return filterReadableFields(item, listConfig.fields, {
|
|
137
273
|
session: context.session,
|
|
138
274
|
context: { ...context, _isSudo: context._isSudo },
|
|
139
275
|
}, config, 0, listName);
|
|
140
276
|
}
|
|
277
|
+
/**
|
|
278
|
+
* Build a Prisma `include` from the set of relation field names that have
|
|
279
|
+
* deferred nested `afterOperation` tasks, so the parent write returns those
|
|
280
|
+
* relations and the tasks can recover their persisted `item`.
|
|
281
|
+
*/
|
|
282
|
+
function buildIncludeFromFields(includeFields) {
|
|
283
|
+
if (includeFields.size === 0)
|
|
284
|
+
return undefined;
|
|
285
|
+
const include = {};
|
|
286
|
+
for (const field of includeFields) {
|
|
287
|
+
include[field] = true;
|
|
288
|
+
}
|
|
289
|
+
return include;
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Run the deferred nested `afterOperation` tasks against the persisted parent
|
|
293
|
+
* row. The persisted parent is always a record here; the `?? {}` is only a
|
|
294
|
+
* type-narrowing guard. Each task recovers its OWN nested row from `item` by
|
|
295
|
+
* id-diff (create) or known id (update); if a created row cannot be recovered
|
|
296
|
+
* the task THROWS rather than firing `afterOperation` with a fabricated item
|
|
297
|
+
* (see `recoverCreatedRows`/the create task in `nested-operations.ts`).
|
|
298
|
+
*/
|
|
299
|
+
async function runNestedAfterTasks(afterTasks, item) {
|
|
300
|
+
if (afterTasks.length === 0)
|
|
301
|
+
return;
|
|
302
|
+
await runAfterTasks(afterTasks, item ?? {});
|
|
303
|
+
}
|
|
141
304
|
/**
|
|
142
305
|
* The delete tail of the pipeline: skips the input-shaping phases and runs only
|
|
143
306
|
* validate/field-validate before the DB delete, then the after-hooks. Returns
|
|
@@ -214,10 +377,10 @@ listConfig, context) {
|
|
|
214
377
|
}
|
|
215
378
|
return { status: 'ok', originalItem: undefined };
|
|
216
379
|
},
|
|
217
|
-
async persist(model, data) {
|
|
380
|
+
async persist(model, data, include) {
|
|
218
381
|
// Singleton lists use Int @id with value always 1 (matching Keystone 6).
|
|
219
382
|
const createData = singleton ? { id: 1, ...data } : data;
|
|
220
|
-
return model.create({ data: createData });
|
|
383
|
+
return model.create(include ? { data: createData, include } : { data: createData });
|
|
221
384
|
},
|
|
222
385
|
};
|
|
223
386
|
}
|
|
@@ -271,8 +434,8 @@ listConfig, context, where) {
|
|
|
271
434
|
operation: 'update',
|
|
272
435
|
runInputPhases: true,
|
|
273
436
|
resolveTarget: resolveExistingTarget(listConfig, context, where, 'update'),
|
|
274
|
-
async persist(model, data) {
|
|
275
|
-
return model.update({ where, data });
|
|
437
|
+
async persist(model, data, include) {
|
|
438
|
+
return model.update(include ? { where, data, include } : { where, data });
|
|
276
439
|
},
|
|
277
440
|
};
|
|
278
441
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-pipeline.js","sourceRoot":"","sources":["../../src/context/write-pipeline.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"write-pipeline.js","sourceRoot":"","sources":["../../src/context/write-pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar-day.test.d.ts","sourceRoot":"","sources":["../../src/fields/calendar-day.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { describe, it, expect, expectTypeOf } from 'vitest';
|
|
2
|
+
import { calendarDay } from './index.js';
|
|
3
|
+
import { generateZodSchema, validateWithZod } from '../validation/schema.js';
|
|
4
|
+
/**
|
|
5
|
+
* calendarDay is a YYYY-MM-DD string end-to-end (Keystone's CalendarDay
|
|
6
|
+
* scalar). Type, validation, and runtime read value must all agree on `string`.
|
|
7
|
+
* See issue #571.
|
|
8
|
+
*/
|
|
9
|
+
describe('calendarDay field (YYYY-MM-DD string end-to-end)', () => {
|
|
10
|
+
describe('getTypeScriptType', () => {
|
|
11
|
+
it('returns string (not Date), driving the entity + input types', () => {
|
|
12
|
+
const field = calendarDay();
|
|
13
|
+
expect(field.getTypeScriptType?.()).toEqual({ type: 'string', optional: true });
|
|
14
|
+
});
|
|
15
|
+
it('is non-optional when required and not nullable', () => {
|
|
16
|
+
const field = calendarDay({ validation: { isRequired: true } });
|
|
17
|
+
expect(field.getTypeScriptType?.()).toEqual({ type: 'string', optional: false });
|
|
18
|
+
});
|
|
19
|
+
it('type-level: the declared type is the literal "string"', () => {
|
|
20
|
+
const field = calendarDay();
|
|
21
|
+
const tsType = field.getTypeScriptType?.();
|
|
22
|
+
// The entity/read type and the standalone generated CreateInput/UpdateInput
|
|
23
|
+
// types are emitted from this literal, so asserting it is exactly 'string'
|
|
24
|
+
// pins those types to `string`. (At the context.db write path a Date is
|
|
25
|
+
// rejected at runtime by validation, not at compile time — tracked in #599.)
|
|
26
|
+
expectTypeOf(tsType).toEqualTypeOf();
|
|
27
|
+
if (tsType) {
|
|
28
|
+
expectTypeOf(tsType.type).toEqualTypeOf();
|
|
29
|
+
expect(tsType.type).toBe('string');
|
|
30
|
+
// @ts-expect-error - the runtime type is 'string', never 'Date'
|
|
31
|
+
const _notDate = tsType.type;
|
|
32
|
+
void _notDate;
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe('getPrismaType (unchanged — stays DateTime @db.Date)', () => {
|
|
37
|
+
it('keeps DateTime storage with @db.Date on non-sqlite providers', () => {
|
|
38
|
+
const field = calendarDay({ validation: { isRequired: true } });
|
|
39
|
+
const prisma = field.getPrismaType?.('startsOn', 'postgresql');
|
|
40
|
+
expect(prisma?.type).toBe('DateTime');
|
|
41
|
+
expect(prisma?.modifiers).toContain('@db.Date');
|
|
42
|
+
});
|
|
43
|
+
it('omits @db.Date on sqlite (TEXT fallback)', () => {
|
|
44
|
+
const field = calendarDay({ validation: { isRequired: true } });
|
|
45
|
+
const prisma = field.getPrismaType?.('startsOn', 'sqlite');
|
|
46
|
+
expect(prisma?.type).toBe('DateTime');
|
|
47
|
+
expect(prisma?.modifiers ?? '').not.toContain('@db.Date');
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
describe('write validation (string-only)', () => {
|
|
51
|
+
const fields = {
|
|
52
|
+
startsOn: calendarDay({ validation: { isRequired: true } }),
|
|
53
|
+
};
|
|
54
|
+
it('accepts a valid YYYY-MM-DD string on create', () => {
|
|
55
|
+
const result = validateWithZod({ startsOn: '2025-01-15' }, fields, 'create');
|
|
56
|
+
expect(result.success).toBe(true);
|
|
57
|
+
});
|
|
58
|
+
it('rejects a malformed string with a clear message', () => {
|
|
59
|
+
const result = validateWithZod({ startsOn: '15/01/2025' }, fields, 'create');
|
|
60
|
+
expect(result.success).toBe(false);
|
|
61
|
+
if (!result.success) {
|
|
62
|
+
expect(result.errors).toHaveProperty('startsOn');
|
|
63
|
+
expect(result.errors.startsOn).toMatch(/YYYY-MM-DD/);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
it('rejects a Date instance at runtime (not a string)', () => {
|
|
67
|
+
// A typed caller cannot reach here (input type is `string`), but the
|
|
68
|
+
// validator is string-only as a runtime backstop.
|
|
69
|
+
const result = validateWithZod({ startsOn: new Date('2025-01-15') }, fields, 'create');
|
|
70
|
+
expect(result.success).toBe(false);
|
|
71
|
+
});
|
|
72
|
+
it('zod schema for the field validates the YYYY-MM-DD shape', () => {
|
|
73
|
+
const schema = generateZodSchema(fields, 'create');
|
|
74
|
+
expect(schema.safeParse({ startsOn: '2025-12-31' }).success).toBe(true);
|
|
75
|
+
expect(schema.safeParse({ startsOn: 'nope' }).success).toBe(false);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
describe('read transform (resolveOutput returns a YYYY-MM-DD string)', () => {
|
|
79
|
+
// The read pipeline calls fieldConfig.hooks.resolveOutput({ value, ... }).
|
|
80
|
+
// We exercise that hook directly with the value shapes Prisma can return.
|
|
81
|
+
function readValue(value) {
|
|
82
|
+
const field = calendarDay();
|
|
83
|
+
const hook = field.hooks?.resolveOutput;
|
|
84
|
+
if (!hook)
|
|
85
|
+
throw new Error('calendarDay must define a resolveOutput hook');
|
|
86
|
+
// Cast to the runtime call shape used by field-visibility.ts.
|
|
87
|
+
return hook({ value });
|
|
88
|
+
}
|
|
89
|
+
it('formats a Date (Postgres/MySQL @db.Date) to YYYY-MM-DD', () => {
|
|
90
|
+
expect(readValue(new Date('2025-01-15T00:00:00.000Z'))).toBe('2025-01-15');
|
|
91
|
+
});
|
|
92
|
+
it('is timezone-safe — a late-UTC Date does not drift a day', () => {
|
|
93
|
+
// 23:59:59Z is the same UTC calendar day; UTC-based formatting keeps it.
|
|
94
|
+
expect(readValue(new Date('2025-01-15T23:59:59.999Z'))).toBe('2025-01-15');
|
|
95
|
+
});
|
|
96
|
+
it('passes through an already-formatted string (SQLite TEXT)', () => {
|
|
97
|
+
expect(readValue('2025-01-15')).toBe('2025-01-15');
|
|
98
|
+
});
|
|
99
|
+
it('takes the date-only prefix of a full ISO string (SQLite TEXT)', () => {
|
|
100
|
+
expect(readValue('2025-01-15T00:00:00.000Z')).toBe('2025-01-15');
|
|
101
|
+
});
|
|
102
|
+
it('passes null/undefined through unchanged', () => {
|
|
103
|
+
expect(readValue(null)).toBeNull();
|
|
104
|
+
expect(readValue(undefined)).toBeUndefined();
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
describe('user-provided hooks are preserved', () => {
|
|
108
|
+
it('merges a user resolveOutput over the default (last wins)', () => {
|
|
109
|
+
const field = calendarDay({
|
|
110
|
+
hooks: {
|
|
111
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- test hook
|
|
112
|
+
resolveOutput: ({ value }) => `custom:${value}`,
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
const hook = field.hooks?.resolveOutput;
|
|
116
|
+
expect(hook({ value: '2025-01-15' })).toBe('custom:2025-01-15');
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
//# sourceMappingURL=calendar-day.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar-day.test.js","sourceRoot":"","sources":["../../src/fields/calendar-day.test.ts"],"names":[],"mappings":"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"}
|
package/dist/fields/index.d.ts
CHANGED
|
@@ -63,11 +63,23 @@ export declare function timestamp<TTypeInfo extends import('../config/types.js')
|
|
|
63
63
|
/**
|
|
64
64
|
* Calendar Day field - date only (no time) in ISO8601 format
|
|
65
65
|
*
|
|
66
|
+
* Mirrors Keystone's `CalendarDay` scalar: the wire format through
|
|
67
|
+
* `context.db.*` is a `YYYY-MM-DD` **string** in both directions (read and
|
|
68
|
+
* write). The field's TypeScript type — entity, `CreateInput`, and
|
|
69
|
+
* `UpdateInput` — is `string`, so passing a `Date` is a compile-time error.
|
|
70
|
+
*
|
|
66
71
|
* **Features:**
|
|
67
72
|
* - Stores date values only (no time component)
|
|
68
73
|
* - PostgreSQL/MySQL: Uses native DATE type via @db.Date
|
|
69
74
|
* - SQLite: Uses String representation
|
|
70
|
-
* -
|
|
75
|
+
* - **Writes:** accept only a `YYYY-MM-DD` string; a malformed string or a
|
|
76
|
+
* `Date` is rejected at runtime by validation (a `ValidationError`). Genuine
|
|
77
|
+
* compile-time rejection at the `context.db` call site is tracked in #599.
|
|
78
|
+
* - **Reads:** always return a `YYYY-MM-DD` string. Even though the underlying
|
|
79
|
+
* `@db.Date` column hands Prisma a `Date`, a `resolveOutput` transform
|
|
80
|
+
* normalises it back to a `YYYY-MM-DD` string so the runtime value matches
|
|
81
|
+
* the declared `string` type. UTC components are used to avoid timezone
|
|
82
|
+
* off-by-one errors.
|
|
71
83
|
* - Optional validation for required fields
|
|
72
84
|
* - Database column mapping and nullability control
|
|
73
85
|
* - Index support (boolean or 'unique')
|
|
@@ -88,13 +100,17 @@ export declare function timestamp<TTypeInfo extends import('../config/types.js')
|
|
|
88
100
|
* })
|
|
89
101
|
* }
|
|
90
102
|
*
|
|
91
|
-
* // Creating with date values
|
|
103
|
+
* // Creating with date values — pass YYYY-MM-DD strings (NOT Date objects)
|
|
92
104
|
* const event = await context.db.event.create({
|
|
93
105
|
* data: {
|
|
94
106
|
* startDate: '2025-01-15',
|
|
95
107
|
* endDate: '2025-01-20'
|
|
96
108
|
* }
|
|
97
109
|
* })
|
|
110
|
+
*
|
|
111
|
+
* // Reading — values come back as YYYY-MM-DD strings
|
|
112
|
+
* const e = await context.db.event.findUnique({ where: { id } })
|
|
113
|
+
* e?.startDate // => '2025-01-15' (a string, not a Date)
|
|
98
114
|
* ```
|
|
99
115
|
*
|
|
100
116
|
* @param options - Field configuration options
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fields/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,SAAS,EACT,YAAY,EAIb,MAAM,oBAAoB,CAAA;AAO3B,YAAY,EACV,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,SAAS,EACT,YAAY,EACZ,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,oBAAoB,CAAA;AAY3B;;GAEG;AACH,wBAAgB,IAAI,CAClB,SAAS,SAAS,OAAO,oBAAoB,EAAE,QAAQ,GAAG,OAAO,oBAAoB,EAAE,QAAQ,EAC/F,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,CAuGpE;AAED;;GAEG;AACH,wBAAgB,OAAO,CACrB,SAAS,SAAS,OAAO,oBAAoB,EAAE,QAAQ,GAAG,OAAO,oBAAoB,EAAE,QAAQ,EAC/F,OAAO,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,GAAG,YAAY,CAAC,SAAS,CAAC,CAsE1E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,wBAAgB,OAAO,CACrB,SAAS,SAAS,OAAO,oBAAoB,EAAE,QAAQ,GAAG,OAAO,oBAAoB,EAAE,QAAQ,EAC/F,OAAO,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,GAAG,YAAY,CAAC,SAAS,CAAC,CAuH1E;AAED;;GAEG;AACH,wBAAgB,QAAQ,CACtB,SAAS,SAAS,OAAO,oBAAoB,EAAE,QAAQ,GAAG,OAAO,oBAAoB,EAAE,QAAQ,EAC/F,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,GAAG,aAAa,CAAC,SAAS,CAAC,CAuC5E;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,SAAS,SAAS,OAAO,oBAAoB,EAAE,QAAQ,GAAG,OAAO,oBAAoB,EAAE,QAAQ,EAC/F,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,GAAG,cAAc,CAAC,SAAS,CAAC,CA0D9E;AAED
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fields/index.ts"],"names":[],"mappings":"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"}
|