@prisma-next/framework-components 0.12.0-dev.6 → 0.12.0-dev.61
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/dist/authoring.d.mts +1 -1
- package/dist/authoring.mjs +1 -1
- package/dist/{codec-BFOsuHKK.d.mts → codec-DCQAerzB.d.mts} +1 -1
- package/dist/{codec-BFOsuHKK.d.mts.map → codec-DCQAerzB.d.mts.map} +1 -1
- package/dist/codec.d.mts +1 -1
- package/dist/codec.d.mts.map +1 -1
- package/dist/components.d.mts +1 -1
- package/dist/components.mjs +1 -1
- package/dist/components.mjs.map +1 -1
- package/dist/control.d.mts +82 -11
- package/dist/control.d.mts.map +1 -1
- package/dist/control.mjs +82 -5
- package/dist/control.mjs.map +1 -1
- package/dist/{emission-types-CMv_053d.d.mts → emission-types-vfpSTe63.d.mts} +2 -2
- package/dist/{emission-types-CMv_053d.d.mts.map → emission-types-vfpSTe63.d.mts.map} +1 -1
- package/dist/emission.d.mts +3 -3
- package/dist/execution.d.mts +1 -1
- package/dist/execution.d.mts.map +1 -1
- package/dist/execution.mjs +1 -1
- package/dist/{framework-authoring-BPPe9C9D.d.mts → framework-authoring-Cv04iZjB.d.mts} +1 -1
- package/dist/{framework-authoring-BPPe9C9D.d.mts.map → framework-authoring-Cv04iZjB.d.mts.map} +1 -1
- package/dist/{framework-authoring-DcEZ5Lin.mjs → framework-authoring-Szvddbl3.mjs} +1 -1
- package/dist/{framework-authoring-DcEZ5Lin.mjs.map → framework-authoring-Szvddbl3.mjs.map} +1 -1
- package/dist/{framework-components-CuoUhyB5.d.mts → framework-components-Ce_Cdw76.d.mts} +6 -5
- package/dist/{framework-components-CuoUhyB5.d.mts.map → framework-components-Ce_Cdw76.d.mts.map} +1 -1
- package/dist/{framework-components-FdqmlGUj.mjs → framework-components-DbCS57go.mjs} +1 -1
- package/dist/{framework-components-FdqmlGUj.mjs.map → framework-components-DbCS57go.mjs.map} +1 -1
- package/dist/ir.d.mts +20 -18
- package/dist/ir.d.mts.map +1 -1
- package/dist/ir.mjs +17 -14
- package/dist/ir.mjs.map +1 -1
- package/dist/{psl-ast-BDXL7iCg.d.mts → psl-ast-CTuBYLYj.d.mts} +12 -3
- package/dist/psl-ast-CTuBYLYj.d.mts.map +1 -0
- package/dist/psl-ast.d.mts +1 -1
- package/dist/psl-ast.mjs.map +1 -1
- package/dist/runtime.d.mts +1 -1
- package/dist/runtime.d.mts.map +1 -1
- package/dist/runtime.mjs.map +1 -1
- package/dist/{types-import-spec-BxI5cSQy.d.mts → types-import-spec-DRKzrJ20.d.mts} +1 -1
- package/dist/{types-import-spec-BxI5cSQy.d.mts.map → types-import-spec-DRKzrJ20.d.mts.map} +1 -1
- package/dist/utils.mjs.map +1 -1
- package/package.json +9 -9
- package/src/control/control-instances.ts +15 -5
- package/src/control/control-migration-types.ts +12 -0
- package/src/control/control-stack.ts +98 -3
- package/src/control/psl-ast.ts +11 -2
- package/src/control/verifier-disposition.ts +62 -0
- package/src/exports/control.ts +7 -0
- package/src/ir/namespace.ts +15 -13
- package/src/ir/storage.ts +8 -7
- package/src/shared/framework-components.ts +2 -0
- package/dist/psl-ast-BDXL7iCg.d.mts.map +0 -1
|
@@ -345,12 +345,107 @@ export function validateScalarTypeCodecIds(
|
|
|
345
345
|
return errors;
|
|
346
346
|
}
|
|
347
347
|
|
|
348
|
+
interface DependencyDeclaringDescriptor {
|
|
349
|
+
readonly id: string;
|
|
350
|
+
readonly contractSpace?: {
|
|
351
|
+
readonly contractJson?: {
|
|
352
|
+
readonly extensionPacks?: Readonly<Record<string, unknown>>;
|
|
353
|
+
};
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
function readDeclaredDependencyIds(descriptor: DependencyDeclaringDescriptor): readonly string[] {
|
|
358
|
+
const packs = descriptor.contractSpace?.contractJson?.extensionPacks;
|
|
359
|
+
if (packs === null || typeof packs !== 'object') return [];
|
|
360
|
+
return Object.keys(packs);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* Builds a dependency-respecting load order for the given extension descriptors
|
|
365
|
+
* using Kahn's topological sort algorithm. Dependencies (packs declared in
|
|
366
|
+
* `contractSpace.contractJson.extensionPacks`) are placed before the extensions
|
|
367
|
+
* that depend on them.
|
|
368
|
+
*
|
|
369
|
+
* Throws if the dependency graph contains a cycle, with an error message that
|
|
370
|
+
* names every extension involved in the cycle.
|
|
371
|
+
*
|
|
372
|
+
* Throws if any extension declares a dependency on a pack ID that is not present
|
|
373
|
+
* in the provided list — add the missing pack to the `extensionPacks` list to
|
|
374
|
+
* resolve the error.
|
|
375
|
+
*/
|
|
376
|
+
|
|
377
|
+
export function buildExtensionLoadOrder(
|
|
378
|
+
extensions: ReadonlyArray<DependencyDeclaringDescriptor>,
|
|
379
|
+
): readonly string[] {
|
|
380
|
+
if (extensions.length === 0) return [];
|
|
381
|
+
|
|
382
|
+
const idSet = new Set(extensions.map((e) => e.id));
|
|
383
|
+
const inDegree = new Map<string, number>();
|
|
384
|
+
const dependents = new Map<string, string[]>();
|
|
385
|
+
|
|
386
|
+
for (const ext of extensions) {
|
|
387
|
+
if (!inDegree.has(ext.id)) inDegree.set(ext.id, 0);
|
|
388
|
+
if (!dependents.has(ext.id)) dependents.set(ext.id, []);
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
for (const ext of extensions) {
|
|
392
|
+
for (const depId of readDeclaredDependencyIds(ext)) {
|
|
393
|
+
if (!idSet.has(depId)) {
|
|
394
|
+
throw new Error(
|
|
395
|
+
`Extension "${ext.id}" declares a dependency on "${depId}", but "${depId}" is not in the provided extension set. Add the missing space to extensionPacks.`,
|
|
396
|
+
);
|
|
397
|
+
}
|
|
398
|
+
inDegree.set(ext.id, (inDegree.get(ext.id) ?? 0) + 1);
|
|
399
|
+
const list = dependents.get(depId);
|
|
400
|
+
if (list !== undefined) list.push(ext.id);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
const queue: string[] = [];
|
|
405
|
+
for (const [id, deg] of inDegree) {
|
|
406
|
+
if (deg === 0) queue.push(id);
|
|
407
|
+
}
|
|
408
|
+
queue.sort();
|
|
409
|
+
|
|
410
|
+
const result: string[] = [];
|
|
411
|
+
while (queue.length > 0) {
|
|
412
|
+
const id = queue.shift();
|
|
413
|
+
if (id === undefined) break;
|
|
414
|
+
result.push(id);
|
|
415
|
+
const children = dependents.get(id) ?? [];
|
|
416
|
+
children.sort();
|
|
417
|
+
for (const childId of children) {
|
|
418
|
+
const newDeg = (inDegree.get(childId) ?? 1) - 1;
|
|
419
|
+
inDegree.set(childId, newDeg);
|
|
420
|
+
if (newDeg === 0) queue.push(childId);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
if (result.length < extensions.length) {
|
|
425
|
+
const cycleMembers = extensions
|
|
426
|
+
.map((e) => e.id)
|
|
427
|
+
.filter((id) => !result.includes(id))
|
|
428
|
+
.sort();
|
|
429
|
+
throw new Error(
|
|
430
|
+
`Extension dependency cycle detected. Cycle members: ${cycleMembers.map((id) => `"${id}"`).join(', ')}.`,
|
|
431
|
+
);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
return result;
|
|
435
|
+
}
|
|
436
|
+
|
|
348
437
|
export function createControlStack<TFamilyId extends string, TTargetId extends string>(
|
|
349
438
|
input: CreateControlStackInput<TFamilyId, TTargetId>,
|
|
350
439
|
): ControlStack<TFamilyId, TTargetId> {
|
|
351
440
|
const { family, target, adapter, driver, extensionPacks = [] } = input;
|
|
352
441
|
|
|
353
|
-
const
|
|
442
|
+
const orderedIds = buildExtensionLoadOrder(extensionPacks);
|
|
443
|
+
const extensionById = new Map(extensionPacks.map((ext) => [ext.id, ext]));
|
|
444
|
+
const orderedExtensionPacks = orderedIds
|
|
445
|
+
.map((id) => extensionById.get(id))
|
|
446
|
+
.filter((ext): ext is ControlExtensionDescriptor<TFamilyId, TTargetId> => ext !== undefined);
|
|
447
|
+
|
|
448
|
+
const allDescriptors = [family, target, ...(adapter ? [adapter] : []), ...orderedExtensionPacks];
|
|
354
449
|
|
|
355
450
|
const codecLookup = extractCodecLookup(allDescriptors);
|
|
356
451
|
const scalarTypeDescriptors = assembleScalarTypeDescriptors(allDescriptors);
|
|
@@ -360,11 +455,11 @@ export function createControlStack<TFamilyId extends string, TTargetId extends s
|
|
|
360
455
|
target,
|
|
361
456
|
adapter,
|
|
362
457
|
driver,
|
|
363
|
-
extensionPacks:
|
|
458
|
+
extensionPacks: orderedExtensionPacks,
|
|
364
459
|
|
|
365
460
|
codecTypeImports: extractCodecTypeImports(allDescriptors),
|
|
366
461
|
queryOperationTypeImports: extractQueryOperationTypeImports(allDescriptors),
|
|
367
|
-
extensionIds: extractComponentIds(family, target, adapter,
|
|
462
|
+
extensionIds: extractComponentIds(family, target, adapter, orderedExtensionPacks),
|
|
368
463
|
codecLookup,
|
|
369
464
|
authoringContributions: assembleAuthoringContributions(allDescriptors),
|
|
370
465
|
scalarTypeDescriptors,
|
package/src/control/psl-ast.ts
CHANGED
|
@@ -82,10 +82,19 @@ export type PslFieldAttribute = PslAttribute;
|
|
|
82
82
|
export interface PslField {
|
|
83
83
|
readonly kind: 'field';
|
|
84
84
|
readonly name: string;
|
|
85
|
-
/** Unqualified type name, e.g. `"User"` for both `User` and `auth.User`. */
|
|
85
|
+
/** Unqualified type name, e.g. `"User"` for both `User`, `auth.User`, and `supabase:auth.User`. */
|
|
86
86
|
readonly typeName: string;
|
|
87
|
-
/** Namespace qualifier from a dot-qualified type reference, e.g. `"auth"` for `auth.User`. Absent for unqualified types. */
|
|
87
|
+
/** Namespace qualifier from a dot-qualified type reference, e.g. `"auth"` for `auth.User` or `supabase:auth.User`. Absent for unqualified types. */
|
|
88
88
|
readonly typeNamespaceId?: string;
|
|
89
|
+
/**
|
|
90
|
+
* Contract-space qualifier from a colon-prefix type reference, e.g. `"supabase"` for
|
|
91
|
+
* `supabase:auth.User` or `supabase:User`. Absent for local (same-space) type references.
|
|
92
|
+
*
|
|
93
|
+
* When present, the field references a model from a different contract space. The namespace
|
|
94
|
+
* (`typeNamespaceId`) and model name (`typeName`) identify the target within that space.
|
|
95
|
+
* Physical table resolution against the extension contract is deferred to the aggregate stage (M3).
|
|
96
|
+
*/
|
|
97
|
+
readonly typeContractSpaceId?: string;
|
|
89
98
|
readonly typeConstructor?: PslTypeConstructorCall;
|
|
90
99
|
readonly optional: boolean;
|
|
91
100
|
readonly list: boolean;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { ControlPolicy } from '@prisma-next/contract/types';
|
|
2
|
+
import type { SchemaVerificationNode } from './control-result-types';
|
|
3
|
+
|
|
4
|
+
export type VerificationStatus = SchemaVerificationNode['status'];
|
|
5
|
+
|
|
6
|
+
export type VerifierOutcome = VerificationStatus | 'suppress';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Target-neutral classification of a verifier finding, abstracted away from any
|
|
10
|
+
* one storage model's vocabulary. Each family classifies its own concrete issue
|
|
11
|
+
* kinds into these categories; the framework only grades the category against a
|
|
12
|
+
* control policy.
|
|
13
|
+
*
|
|
14
|
+
* - `declaredMissing` — a declared object/element is absent from the database.
|
|
15
|
+
* - `declaredIncompatible` — a declared object/element exists but its shape diverges.
|
|
16
|
+
* - `valueDrift` — the value set of an existing type drifted (e.g. enum values).
|
|
17
|
+
* - `extraNestedElement` — an undeclared element nested inside a declared object
|
|
18
|
+
* (a SQL column, a document field).
|
|
19
|
+
* - `extraAuxiliary` — an undeclared auxiliary attached to a declared object
|
|
20
|
+
* (a SQL constraint/index, a Mongo index/validator).
|
|
21
|
+
* - `extraTopLevelObject` — an undeclared top-level object (a SQL table, a
|
|
22
|
+
* Mongo collection).
|
|
23
|
+
*/
|
|
24
|
+
export type VerifierIssueCategory =
|
|
25
|
+
| 'declaredMissing'
|
|
26
|
+
| 'declaredIncompatible'
|
|
27
|
+
| 'valueDrift'
|
|
28
|
+
| 'extraNestedElement'
|
|
29
|
+
| 'extraAuxiliary'
|
|
30
|
+
| 'extraTopLevelObject';
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Grades a target-neutral issue category against a control policy.
|
|
34
|
+
*
|
|
35
|
+
* - `observed` warns on everything.
|
|
36
|
+
* - `tolerated` suppresses only an extra nested element (everything else fails).
|
|
37
|
+
* - `external` suppresses every extra category and value drift (existence and
|
|
38
|
+
* declared-shape divergences still fail).
|
|
39
|
+
* - `managed` (and any other) fails.
|
|
40
|
+
*/
|
|
41
|
+
export function dispositionForCategory(
|
|
42
|
+
controlPolicy: ControlPolicy,
|
|
43
|
+
category: VerifierIssueCategory,
|
|
44
|
+
): VerifierOutcome {
|
|
45
|
+
if (controlPolicy === 'observed') {
|
|
46
|
+
return 'warn';
|
|
47
|
+
}
|
|
48
|
+
if (controlPolicy === 'tolerated' && category === 'extraNestedElement') {
|
|
49
|
+
return 'suppress';
|
|
50
|
+
}
|
|
51
|
+
if (controlPolicy === 'external') {
|
|
52
|
+
if (
|
|
53
|
+
category === 'extraNestedElement' ||
|
|
54
|
+
category === 'extraAuxiliary' ||
|
|
55
|
+
category === 'extraTopLevelObject' ||
|
|
56
|
+
category === 'valueDrift'
|
|
57
|
+
) {
|
|
58
|
+
return 'suppress';
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return 'fail';
|
|
62
|
+
}
|
package/src/exports/control.ts
CHANGED
|
@@ -95,6 +95,7 @@ export {
|
|
|
95
95
|
assembleControlMutationDefaults,
|
|
96
96
|
assembleScalarTypeDescriptors,
|
|
97
97
|
assertUniqueCodecOwner,
|
|
98
|
+
buildExtensionLoadOrder,
|
|
98
99
|
createControlStack,
|
|
99
100
|
extractCodecLookup,
|
|
100
101
|
extractCodecTypeImports,
|
|
@@ -106,6 +107,12 @@ export type {
|
|
|
106
107
|
SchemaVerifyOptions,
|
|
107
108
|
SchemaVerifyResult,
|
|
108
109
|
} from '../control/schema-verifier';
|
|
110
|
+
export type {
|
|
111
|
+
VerificationStatus,
|
|
112
|
+
VerifierIssueCategory,
|
|
113
|
+
VerifierOutcome,
|
|
114
|
+
} from '../control/verifier-disposition';
|
|
115
|
+
export { dispositionForCategory } from '../control/verifier-disposition';
|
|
109
116
|
export type {
|
|
110
117
|
ControlMutationDefaultEntry,
|
|
111
118
|
ControlMutationDefaultRegistry,
|
package/src/ir/namespace.ts
CHANGED
|
@@ -41,28 +41,30 @@ export const UNBOUND_NAMESPACE_ID = '__unbound__' as const;
|
|
|
41
41
|
*
|
|
42
42
|
* The framework promises only the coordinate (`id`) — the named storage
|
|
43
43
|
* entities a namespace contains are family-typed (SQL contributes
|
|
44
|
-
* `
|
|
45
|
-
* own native idiom). Generic consumers walking "all
|
|
46
|
-
* through a family-typed namespace, not the framework
|
|
44
|
+
* `table` / `type`, Mongo contributes `collection`, future families pick
|
|
45
|
+
* their own native idiom under `entries`). Generic consumers walking "all
|
|
46
|
+
* named entries" go through a family-typed namespace, not the framework
|
|
47
|
+
* `Namespace`.
|
|
47
48
|
*
|
|
48
49
|
* Every namespace concretion (e.g. family-built SQL namespaces,
|
|
49
50
|
* `MongoUnboundNamespace`, target-promoted namespaces like
|
|
50
|
-
* `PostgresSchema`) carries exactly: `id` (enumerable string),
|
|
51
|
-
* (
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
* on
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
* family-specific knowledge.
|
|
51
|
+
* `PostgresSchema`) carries exactly: `id` (enumerable string),
|
|
52
|
+
* `entries` (frozen object holding entity-kind slot maps), and `kind`
|
|
53
|
+
* (non-enumerable string discriminator set via `Object.defineProperty`).
|
|
54
|
+
* Each slot map under `entries` uses a singular essence key (`table`,
|
|
55
|
+
* `type`, `collection`, …) mapping entity names to IR classes. No other
|
|
56
|
+
* own-enumerable data lives on a namespace; non-entity computed data lives
|
|
57
|
+
* on the surrounding storage or contract IR. The framework's
|
|
58
|
+
* `elementCoordinates(storage)` walk relies on this invariant to enumerate
|
|
59
|
+
* entities structurally without family-specific knowledge.
|
|
60
60
|
*/
|
|
61
61
|
export interface Namespace extends IRNode, StorageNamespace {
|
|
62
62
|
readonly kind: string;
|
|
63
|
+
readonly entries: Readonly<Record<string, Readonly<Record<string, unknown>>>>;
|
|
63
64
|
}
|
|
64
65
|
|
|
65
66
|
export abstract class NamespaceBase extends IRNodeBase implements Namespace {
|
|
66
67
|
abstract readonly id: string;
|
|
68
|
+
abstract readonly entries: Readonly<Record<string, Readonly<Record<string, unknown>>>>;
|
|
67
69
|
abstract override readonly kind: string;
|
|
68
70
|
}
|
package/src/ir/storage.ts
CHANGED
|
@@ -30,18 +30,19 @@ export interface EntityCoordinate {
|
|
|
30
30
|
* value, yielded as {@link EntityCoordinate} tuples with
|
|
31
31
|
* `plane: 'storage'` (the parameter type binds the plane).
|
|
32
32
|
*
|
|
33
|
-
* Iterates each namespace's
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
33
|
+
* Iterates each namespace's `entries` slot maps structurally. Skips
|
|
34
|
+
* non-object `entries`; `id` and `kind` are not walked (`kind` is
|
|
35
|
+
* non-enumerable on concretions). For every entity-kind key under
|
|
36
|
+
* `entries` whose value is a non-null object, yields one coordinate per
|
|
37
|
+
* entity name in that map. No family-specific slot vocabulary is required.
|
|
38
38
|
*/
|
|
39
39
|
export function* elementCoordinates(
|
|
40
40
|
storage: Pick<StorageBase, 'namespaces'>,
|
|
41
41
|
): Generator<EntityCoordinate> {
|
|
42
42
|
for (const [namespaceId, ns] of Object.entries(storage.namespaces)) {
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
const entries = ns.entries;
|
|
44
|
+
if (entries === null || typeof entries !== 'object') continue;
|
|
45
|
+
for (const [entityKind, slot] of Object.entries(entries)) {
|
|
45
46
|
if (slot === null || typeof slot !== 'object') continue;
|
|
46
47
|
for (const entityName of Object.keys(slot)) {
|
|
47
48
|
yield { plane: 'storage', namespaceId, entityKind, entityName };
|
|
@@ -227,6 +227,8 @@ export type TargetPackRef<
|
|
|
227
227
|
TTargetId extends string = string,
|
|
228
228
|
> = PackRefBase<'target', TFamilyId> & {
|
|
229
229
|
readonly targetId: TTargetId;
|
|
230
|
+
/** The namespace a bare (un-namespaced) entity name resolves to for this target (e.g. Postgres `'public'`). */
|
|
231
|
+
readonly defaultNamespaceId: string;
|
|
230
232
|
};
|
|
231
233
|
|
|
232
234
|
export type AdapterPackRef<
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"psl-ast-BDXL7iCg.d.mts","names":[],"sources":["../src/control/psl-ast.ts"],"mappings":"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"}
|