@prisma-next/family-sql 0.3.0-pr.99.6 → 0.4.0-dev.1
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/LICENSE +201 -0
- package/README.md +58 -22
- package/dist/authoring-type-constructors-DgU-RFaP.mjs +203 -0
- package/dist/authoring-type-constructors-DgU-RFaP.mjs.map +1 -0
- package/dist/control-adapter.d.mts +54 -0
- package/dist/control-adapter.d.mts.map +1 -0
- package/dist/control-adapter.mjs +1 -0
- package/dist/control.d.mts +386 -0
- package/dist/control.d.mts.map +1 -0
- package/dist/control.mjs +643 -0
- package/dist/control.mjs.map +1 -0
- package/dist/operation-descriptors.d.mts +380 -0
- package/dist/operation-descriptors.d.mts.map +1 -0
- package/dist/operation-descriptors.mjs +294 -0
- package/dist/operation-descriptors.mjs.map +1 -0
- package/dist/pack.d.mts +248 -0
- package/dist/pack.d.mts.map +1 -0
- package/dist/pack.mjs +18 -0
- package/dist/pack.mjs.map +1 -0
- package/dist/runtime.d.mts +27 -0
- package/dist/runtime.d.mts.map +1 -0
- package/dist/runtime.mjs +38 -0
- package/dist/runtime.mjs.map +1 -0
- package/dist/schema-verify.d.mts +48 -0
- package/dist/schema-verify.d.mts.map +1 -0
- package/dist/schema-verify.mjs +3 -0
- package/dist/test-utils.d.mts +2 -0
- package/dist/test-utils.mjs +3 -0
- package/dist/types-BaUzKt6Q.d.mts +353 -0
- package/dist/types-BaUzKt6Q.d.mts.map +1 -0
- package/dist/verify-DZHtfcmj.mjs +108 -0
- package/dist/verify-DZHtfcmj.mjs.map +1 -0
- package/dist/verify-sql-schema-BBhkqEDo.d.mts +67 -0
- package/dist/verify-sql-schema-BBhkqEDo.d.mts.map +1 -0
- package/dist/verify-sql-schema-lR-tlboL.mjs +1174 -0
- package/dist/verify-sql-schema-lR-tlboL.mjs.map +1 -0
- package/dist/verify.d.mts +31 -0
- package/dist/verify.d.mts.map +1 -0
- package/dist/verify.mjs +3 -0
- package/package.json +35 -43
- package/src/core/assembly.ts +123 -155
- package/src/core/authoring-field-presets.ts +207 -0
- package/src/core/authoring-type-constructors.ts +17 -0
- package/src/core/control-adapter.ts +18 -10
- package/src/core/control-descriptor.ts +28 -0
- package/src/core/control-instance.ts +700 -0
- package/src/core/migrations/contract-to-schema-ir.ts +269 -0
- package/src/core/migrations/descriptor-schemas.ts +172 -0
- package/src/core/migrations/operation-descriptors.ts +213 -0
- package/src/core/migrations/policies.ts +1 -1
- package/src/core/migrations/types.ts +199 -175
- package/src/core/runtime-descriptor.ts +19 -41
- package/src/core/runtime-instance.ts +11 -133
- package/src/core/schema-verify/verify-helpers.ts +104 -22
- package/src/core/schema-verify/verify-sql-schema.ts +964 -418
- package/src/core/verify.ts +4 -13
- package/src/exports/control.ts +31 -8
- package/src/exports/operation-descriptors.ts +52 -0
- package/src/exports/pack.ts +16 -0
- package/src/exports/runtime.ts +2 -6
- package/src/exports/schema-verify.ts +4 -1
- package/src/exports/test-utils.ts +3 -4
- package/dist/chunk-GYEG3I7U.js +0 -624
- package/dist/chunk-GYEG3I7U.js.map +0 -1
- package/dist/chunk-SU7LN2UH.js +0 -96
- package/dist/chunk-SU7LN2UH.js.map +0 -1
- package/dist/chunk-XH2Y5NTD.js +0 -715
- package/dist/chunk-XH2Y5NTD.js.map +0 -1
- package/dist/core/assembly.d.ts +0 -43
- package/dist/core/assembly.d.ts.map +0 -1
- package/dist/core/control-adapter.d.ts +0 -42
- package/dist/core/control-adapter.d.ts.map +0 -1
- package/dist/core/descriptor.d.ts +0 -28
- package/dist/core/descriptor.d.ts.map +0 -1
- package/dist/core/instance.d.ts +0 -140
- package/dist/core/instance.d.ts.map +0 -1
- package/dist/core/migrations/plan-helpers.d.ts +0 -20
- package/dist/core/migrations/plan-helpers.d.ts.map +0 -1
- package/dist/core/migrations/policies.d.ts +0 -6
- package/dist/core/migrations/policies.d.ts.map +0 -1
- package/dist/core/migrations/types.d.ts +0 -280
- package/dist/core/migrations/types.d.ts.map +0 -1
- package/dist/core/runtime-descriptor.d.ts +0 -19
- package/dist/core/runtime-descriptor.d.ts.map +0 -1
- package/dist/core/runtime-instance.d.ts +0 -54
- package/dist/core/runtime-instance.d.ts.map +0 -1
- package/dist/core/schema-verify/verify-helpers.d.ts +0 -96
- package/dist/core/schema-verify/verify-helpers.d.ts.map +0 -1
- package/dist/core/schema-verify/verify-sql-schema.d.ts +0 -45
- package/dist/core/schema-verify/verify-sql-schema.d.ts.map +0 -1
- package/dist/core/verify.d.ts +0 -39
- package/dist/core/verify.d.ts.map +0 -1
- package/dist/exports/control-adapter.d.ts +0 -2
- package/dist/exports/control-adapter.d.ts.map +0 -1
- package/dist/exports/control-adapter.js +0 -1
- package/dist/exports/control-adapter.js.map +0 -1
- package/dist/exports/control.d.ts +0 -13
- package/dist/exports/control.d.ts.map +0 -1
- package/dist/exports/control.js +0 -149
- package/dist/exports/control.js.map +0 -1
- package/dist/exports/runtime.d.ts +0 -8
- package/dist/exports/runtime.d.ts.map +0 -1
- package/dist/exports/runtime.js +0 -64
- package/dist/exports/runtime.js.map +0 -1
- package/dist/exports/schema-verify.d.ts +0 -11
- package/dist/exports/schema-verify.d.ts.map +0 -1
- package/dist/exports/schema-verify.js +0 -15
- package/dist/exports/schema-verify.js.map +0 -1
- package/dist/exports/test-utils.d.ts +0 -7
- package/dist/exports/test-utils.d.ts.map +0 -1
- package/dist/exports/test-utils.js +0 -17
- package/dist/exports/test-utils.js.map +0 -1
- package/dist/exports/verify.d.ts +0 -2
- package/dist/exports/verify.d.ts.map +0 -1
- package/dist/exports/verify.js +0 -11
- package/dist/exports/verify.js.map +0 -1
- package/src/core/descriptor.ts +0 -33
- package/src/core/instance.ts +0 -909
|
@@ -1,144 +1,22 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type {
|
|
3
|
-
RuntimeAdapterDescriptor,
|
|
4
|
-
RuntimeDriverDescriptor,
|
|
5
|
-
RuntimeDriverInstance,
|
|
6
|
-
RuntimeFamilyDescriptor,
|
|
7
|
-
RuntimeFamilyInstance,
|
|
8
|
-
RuntimeTargetDescriptor,
|
|
9
|
-
} from '@prisma-next/core-execution-plane/types';
|
|
10
|
-
import type { Log, Plugin, RuntimeVerifyOptions } from '@prisma-next/runtime-executor';
|
|
11
|
-
import type { SqlContract, SqlStorage } from '@prisma-next/sql-contract/types';
|
|
12
|
-
import type {
|
|
13
|
-
Adapter,
|
|
14
|
-
LoweredStatement,
|
|
15
|
-
SelectAst,
|
|
16
|
-
SqlDriver,
|
|
17
|
-
} from '@prisma-next/sql-relational-core/ast';
|
|
18
|
-
import type {
|
|
19
|
-
Runtime,
|
|
20
|
-
RuntimeOptions,
|
|
21
|
-
SqlRuntimeAdapterInstance,
|
|
22
|
-
SqlRuntimeExtensionDescriptor,
|
|
23
|
-
} from '@prisma-next/sql-runtime';
|
|
24
|
-
import { createRuntime, createRuntimeContext } from '@prisma-next/sql-runtime';
|
|
1
|
+
import type { RuntimeFamilyInstance } from '@prisma-next/framework-components/execution';
|
|
25
2
|
|
|
26
3
|
/**
|
|
27
|
-
* SQL
|
|
28
|
-
*
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
> &
|
|
34
|
-
SqlDriver;
|
|
35
|
-
|
|
36
|
-
// Re-export SqlRuntimeAdapterInstance from sql-runtime for consumers
|
|
37
|
-
export type { SqlRuntimeAdapterInstance } from '@prisma-next/sql-runtime';
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* SQL runtime family instance interface.
|
|
41
|
-
* Extends base RuntimeFamilyInstance with SQL-specific runtime creation method.
|
|
4
|
+
* SQL execution-plane family instance interface.
|
|
5
|
+
*
|
|
6
|
+
* Note: this is currently named `SqlRuntimeFamilyInstance` because the execution plane
|
|
7
|
+
* framework types are still using the `Runtime*` naming (`RuntimeFamilyInstance`, etc.).
|
|
8
|
+
*
|
|
9
|
+
* This will be renamed to `SqlExecutionFamilyInstance` as part of `TML-1842`.
|
|
42
10
|
*/
|
|
43
|
-
export interface SqlRuntimeFamilyInstance extends RuntimeFamilyInstance<'sql'> {
|
|
44
|
-
/**
|
|
45
|
-
* Creates a SQL runtime from contract, driver options, and verification settings.
|
|
46
|
-
*
|
|
47
|
-
* Extension packs are routed through composition (at instance creation time),
|
|
48
|
-
* not through this method. This aligns with control-plane composition patterns.
|
|
49
|
-
*
|
|
50
|
-
* @param options - Runtime creation options
|
|
51
|
-
* @param options.contract - SQL contract
|
|
52
|
-
* @param options.driverOptions - Driver options (e.g., PostgresDriverOptions)
|
|
53
|
-
* @param options.verify - Runtime verification options
|
|
54
|
-
* @param options.plugins - Optional plugins
|
|
55
|
-
* @param options.mode - Optional runtime mode
|
|
56
|
-
* @param options.log - Optional log instance
|
|
57
|
-
* @returns Runtime instance
|
|
58
|
-
*/
|
|
59
|
-
createRuntime<TContract extends SqlContract<SqlStorage>>(options: {
|
|
60
|
-
readonly contract: TContract;
|
|
61
|
-
readonly driverOptions: unknown;
|
|
62
|
-
readonly verify: RuntimeVerifyOptions;
|
|
63
|
-
readonly plugins?: readonly Plugin<
|
|
64
|
-
TContract,
|
|
65
|
-
Adapter<SelectAst, SqlContract<SqlStorage>, LoweredStatement>,
|
|
66
|
-
SqlDriver
|
|
67
|
-
>[];
|
|
68
|
-
readonly mode?: 'strict' | 'permissive';
|
|
69
|
-
readonly log?: Log;
|
|
70
|
-
}): Runtime;
|
|
71
|
-
}
|
|
11
|
+
export interface SqlRuntimeFamilyInstance extends RuntimeFamilyInstance<'sql'> {}
|
|
72
12
|
|
|
73
13
|
/**
|
|
74
|
-
* Creates a SQL
|
|
14
|
+
* Creates a SQL execution-plane family instance.
|
|
75
15
|
*
|
|
76
|
-
*
|
|
77
|
-
* family, target, adapter, driver, extensionPacks (all as descriptors with IDs).
|
|
16
|
+
* This will be renamed to `createSqlExecutionFamilyInstance()` as part of `TML-1842`.
|
|
78
17
|
*/
|
|
79
|
-
export function createSqlRuntimeFamilyInstance
|
|
80
|
-
readonly family: RuntimeFamilyDescriptor<'sql'>;
|
|
81
|
-
readonly target: RuntimeTargetDescriptor<'sql', TTargetId>;
|
|
82
|
-
readonly adapter: RuntimeAdapterDescriptor<
|
|
83
|
-
'sql',
|
|
84
|
-
TTargetId,
|
|
85
|
-
SqlRuntimeAdapterInstance<TTargetId>
|
|
86
|
-
>;
|
|
87
|
-
readonly driver: RuntimeDriverDescriptor<'sql', TTargetId, SqlRuntimeDriverInstance<TTargetId>>;
|
|
88
|
-
readonly extensionPacks?: readonly SqlRuntimeExtensionDescriptor<TTargetId>[];
|
|
89
|
-
}): SqlRuntimeFamilyInstance {
|
|
90
|
-
const {
|
|
91
|
-
family: familyDescriptor,
|
|
92
|
-
target: targetDescriptor,
|
|
93
|
-
adapter: adapterDescriptor,
|
|
94
|
-
driver: driverDescriptor,
|
|
95
|
-
extensionPacks: extensionDescriptors = [],
|
|
96
|
-
} = options;
|
|
97
|
-
|
|
18
|
+
export function createSqlRuntimeFamilyInstance(): SqlRuntimeFamilyInstance {
|
|
98
19
|
return {
|
|
99
20
|
familyId: 'sql' as const,
|
|
100
|
-
createRuntime<TContract extends SqlContract<SqlStorage>>(runtimeOptions: {
|
|
101
|
-
readonly contract: TContract;
|
|
102
|
-
readonly driverOptions: unknown;
|
|
103
|
-
readonly verify: RuntimeVerifyOptions;
|
|
104
|
-
readonly plugins?: readonly Plugin<
|
|
105
|
-
TContract,
|
|
106
|
-
Adapter<SelectAst, SqlContract<SqlStorage>, LoweredStatement>,
|
|
107
|
-
SqlDriver
|
|
108
|
-
>[];
|
|
109
|
-
readonly mode?: 'strict' | 'permissive';
|
|
110
|
-
readonly log?: Log;
|
|
111
|
-
}): Runtime {
|
|
112
|
-
// Validate contract requirements against provided descriptors
|
|
113
|
-
assertRuntimeContractRequirementsSatisfied({
|
|
114
|
-
contract: runtimeOptions.contract,
|
|
115
|
-
family: familyDescriptor,
|
|
116
|
-
target: targetDescriptor,
|
|
117
|
-
adapter: adapterDescriptor,
|
|
118
|
-
extensionPacks: extensionDescriptors,
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
// Create driver instance
|
|
122
|
-
const driverInstance = driverDescriptor.create(runtimeOptions.driverOptions);
|
|
123
|
-
|
|
124
|
-
// Create context via descriptor-first API
|
|
125
|
-
const context = createRuntimeContext<TContract, TTargetId>({
|
|
126
|
-
contract: runtimeOptions.contract,
|
|
127
|
-
target: targetDescriptor,
|
|
128
|
-
adapter: adapterDescriptor,
|
|
129
|
-
extensionPacks: extensionDescriptors,
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
const runtimeOptions_: RuntimeOptions<TContract> = {
|
|
133
|
-
driver: driverInstance,
|
|
134
|
-
verify: runtimeOptions.verify,
|
|
135
|
-
context,
|
|
136
|
-
...(runtimeOptions.plugins ? { plugins: runtimeOptions.plugins } : {}),
|
|
137
|
-
...(runtimeOptions.mode ? { mode: runtimeOptions.mode } : {}),
|
|
138
|
-
...(runtimeOptions.log ? { log: runtimeOptions.log } : {}),
|
|
139
|
-
};
|
|
140
|
-
|
|
141
|
-
return createRuntime(runtimeOptions_);
|
|
142
|
-
},
|
|
143
21
|
};
|
|
144
22
|
}
|
|
@@ -3,7 +3,10 @@
|
|
|
3
3
|
* These functions verify schema IR against contract requirements.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import type {
|
|
6
|
+
import type {
|
|
7
|
+
SchemaIssue,
|
|
8
|
+
SchemaVerificationNode,
|
|
9
|
+
} from '@prisma-next/framework-components/control';
|
|
7
10
|
import type {
|
|
8
11
|
ForeignKey,
|
|
9
12
|
Index,
|
|
@@ -179,19 +182,45 @@ export function verifyForeignKeys(
|
|
|
179
182
|
children: [],
|
|
180
183
|
});
|
|
181
184
|
} else {
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
185
|
+
const actionMismatches = getReferentialActionMismatches(contractFK, matchingFK);
|
|
186
|
+
if (actionMismatches.length > 0) {
|
|
187
|
+
const combinedMessage = actionMismatches.map((m) => m.message).join('; ');
|
|
188
|
+
const combinedExpected = actionMismatches.map((m) => m.expected).join(', ');
|
|
189
|
+
const combinedActual = actionMismatches.map((m) => m.actual).join(', ');
|
|
190
|
+
issues.push({
|
|
191
|
+
kind: 'foreign_key_mismatch',
|
|
192
|
+
table: tableName,
|
|
193
|
+
// Set indexOrConstraint so the planner classifies this as a non-additive
|
|
194
|
+
// conflict (existing FK with wrong actions cannot be fixed additively).
|
|
195
|
+
indexOrConstraint: matchingFK.name ?? `fk(${contractFK.columns.join(',')})`,
|
|
196
|
+
expected: combinedExpected,
|
|
197
|
+
actual: combinedActual,
|
|
198
|
+
message: `Table "${tableName}" foreign key ${contractFK.columns.join(', ')} -> ${contractFK.references.table}: ${combinedMessage}`,
|
|
199
|
+
});
|
|
200
|
+
nodes.push({
|
|
201
|
+
status: 'fail',
|
|
202
|
+
kind: 'foreignKey',
|
|
203
|
+
name: `foreignKey(${contractFK.columns.join(', ')})`,
|
|
204
|
+
contractPath: fkPath,
|
|
205
|
+
code: 'foreign_key_mismatch',
|
|
206
|
+
message: combinedMessage,
|
|
207
|
+
expected: contractFK,
|
|
208
|
+
actual: matchingFK,
|
|
209
|
+
children: [],
|
|
210
|
+
});
|
|
211
|
+
} else {
|
|
212
|
+
nodes.push({
|
|
213
|
+
status: 'pass',
|
|
214
|
+
kind: 'foreignKey',
|
|
215
|
+
name: `foreignKey(${contractFK.columns.join(', ')})`,
|
|
216
|
+
contractPath: fkPath,
|
|
217
|
+
code: '',
|
|
218
|
+
message: '',
|
|
219
|
+
expected: undefined,
|
|
220
|
+
actual: undefined,
|
|
221
|
+
children: [],
|
|
222
|
+
});
|
|
223
|
+
}
|
|
195
224
|
}
|
|
196
225
|
}
|
|
197
226
|
|
|
@@ -210,6 +239,7 @@ export function verifyForeignKeys(
|
|
|
210
239
|
issues.push({
|
|
211
240
|
kind: 'extra_foreign_key',
|
|
212
241
|
table: tableName,
|
|
242
|
+
indexOrConstraint: schemaFK.name ?? `fk(${schemaFK.columns.join(',')})`,
|
|
213
243
|
message: `Extra foreign key found in database (not in contract): ${schemaFK.columns.join(', ')} -> ${schemaFK.referencedTable}(${schemaFK.referencedColumns.join(', ')})`,
|
|
214
244
|
});
|
|
215
245
|
nodes.push({
|
|
@@ -312,6 +342,7 @@ export function verifyUniqueConstraints(
|
|
|
312
342
|
issues.push({
|
|
313
343
|
kind: 'extra_unique_constraint',
|
|
314
344
|
table: tableName,
|
|
345
|
+
indexOrConstraint: schemaUnique.name ?? `unique(${schemaUnique.columns.join(',')})`,
|
|
315
346
|
message: `Extra unique constraint found in database (not in contract): ${schemaUnique.columns.join(', ')}`,
|
|
316
347
|
});
|
|
317
348
|
nodes.push({
|
|
@@ -419,6 +450,7 @@ export function verifyIndexes(
|
|
|
419
450
|
issues.push({
|
|
420
451
|
kind: 'extra_index',
|
|
421
452
|
table: tableName,
|
|
453
|
+
indexOrConstraint: schemaIndex.name ?? `idx(${schemaIndex.columns.join(',')})`,
|
|
422
454
|
message: `Extra index found in database (not in contract): ${schemaIndex.columns.join(', ')}`,
|
|
423
455
|
});
|
|
424
456
|
nodes.push({
|
|
@@ -441,8 +473,8 @@ export function verifyIndexes(
|
|
|
441
473
|
|
|
442
474
|
/**
|
|
443
475
|
* Verifies database dependencies are installed using component-owned verification hooks.
|
|
444
|
-
*
|
|
445
|
-
*
|
|
476
|
+
* Checks whether each dependency is satisfied by verifying its id is present in
|
|
477
|
+
* schema.dependencies (populated from introspection).
|
|
446
478
|
*
|
|
447
479
|
* Returns verification nodes for the tree.
|
|
448
480
|
*/
|
|
@@ -452,16 +484,20 @@ export function verifyDatabaseDependencies(
|
|
|
452
484
|
issues: SchemaIssue[],
|
|
453
485
|
): SchemaVerificationNode[] {
|
|
454
486
|
const nodes: SchemaVerificationNode[] = [];
|
|
487
|
+
const installedIds = new Set(schema.dependencies.map((d) => d.id));
|
|
455
488
|
|
|
456
489
|
for (const dependency of dependencies) {
|
|
457
|
-
const
|
|
490
|
+
const isSatisfied = installedIds.has(dependency.id);
|
|
458
491
|
const depPath = `dependencies.${dependency.id}`;
|
|
459
492
|
|
|
460
|
-
if (
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
493
|
+
if (!isSatisfied) {
|
|
494
|
+
const depIssue: SchemaIssue = {
|
|
495
|
+
kind: 'dependency_missing',
|
|
496
|
+
dependencyId: dependency.id,
|
|
497
|
+
message: `Dependency "${dependency.id}" is missing from database`,
|
|
498
|
+
};
|
|
499
|
+
issues.push(depIssue);
|
|
500
|
+
const nodeMessage = depIssue.message;
|
|
465
501
|
nodes.push({
|
|
466
502
|
status: 'fail',
|
|
467
503
|
kind: 'databaseDependency',
|
|
@@ -530,3 +566,49 @@ export function computeCounts(node: SchemaVerificationNode): {
|
|
|
530
566
|
totalNodes: pass + warn + fail,
|
|
531
567
|
};
|
|
532
568
|
}
|
|
569
|
+
|
|
570
|
+
/**
|
|
571
|
+
* Compares referential actions between a contract FK and a schema FK.
|
|
572
|
+
* Only compares when the contract FK explicitly specifies onDelete or onUpdate.
|
|
573
|
+
* Returns all mismatches (both onDelete and onUpdate) so both are reported at once.
|
|
574
|
+
*
|
|
575
|
+
* Note: 'noAction' in the contract is semantically equivalent to undefined in the
|
|
576
|
+
* schema IR, because the introspection adapter omits 'NO ACTION' (the database default)
|
|
577
|
+
* to keep the IR sparse. We normalize both sides before comparing.
|
|
578
|
+
*/
|
|
579
|
+
function getReferentialActionMismatches(
|
|
580
|
+
contractFK: ForeignKey,
|
|
581
|
+
schemaFK: SqlForeignKeyIR,
|
|
582
|
+
): ReadonlyArray<{ expected: string; actual: string; message: string }> {
|
|
583
|
+
const mismatches: Array<{ expected: string; actual: string; message: string }> = [];
|
|
584
|
+
|
|
585
|
+
const contractOnDelete = normalizeReferentialAction(contractFK.onDelete);
|
|
586
|
+
const schemaOnDelete = normalizeReferentialAction(schemaFK.onDelete);
|
|
587
|
+
if (contractOnDelete !== undefined && contractOnDelete !== schemaOnDelete) {
|
|
588
|
+
mismatches.push({
|
|
589
|
+
expected: `onDelete: ${contractFK.onDelete}`,
|
|
590
|
+
actual: `onDelete: ${schemaFK.onDelete ?? 'noAction (default)'}`,
|
|
591
|
+
message: `onDelete mismatch: expected ${contractFK.onDelete}, got ${schemaFK.onDelete ?? 'noAction (default)'}`,
|
|
592
|
+
});
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
const contractOnUpdate = normalizeReferentialAction(contractFK.onUpdate);
|
|
596
|
+
const schemaOnUpdate = normalizeReferentialAction(schemaFK.onUpdate);
|
|
597
|
+
if (contractOnUpdate !== undefined && contractOnUpdate !== schemaOnUpdate) {
|
|
598
|
+
mismatches.push({
|
|
599
|
+
expected: `onUpdate: ${contractFK.onUpdate}`,
|
|
600
|
+
actual: `onUpdate: ${schemaFK.onUpdate ?? 'noAction (default)'}`,
|
|
601
|
+
message: `onUpdate mismatch: expected ${contractFK.onUpdate}, got ${schemaFK.onUpdate ?? 'noAction (default)'}`,
|
|
602
|
+
});
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
return mismatches;
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
/**
|
|
609
|
+
* Normalizes a referential action value for comparison.
|
|
610
|
+
* 'noAction' is the database default and equivalent to undefined (omitted) in the sparse IR.
|
|
611
|
+
*/
|
|
612
|
+
function normalizeReferentialAction(action: string | undefined): string | undefined {
|
|
613
|
+
return action === 'noAction' ? undefined : action;
|
|
614
|
+
}
|