prisma-next 0.5.0-dev.66 → 0.5.0-dev.68

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.
Files changed (115) hide show
  1. package/dist/{cli-errors-By1iVE3z.mjs → cli-errors-D3_sMh2K.mjs} +2 -3
  2. package/dist/{cli-errors-By1iVE3z.mjs.map → cli-errors-D3_sMh2K.mjs.map} +1 -1
  3. package/dist/{cli-errors-DDeVsP2Y.d.mts → cli-errors-QH8kf-C2.d.mts} +0 -2
  4. package/dist/cli.mjs +12 -76
  5. package/dist/cli.mjs.map +1 -1
  6. package/dist/client-0ZX24FXF.mjs +1398 -0
  7. package/dist/client-0ZX24FXF.mjs.map +1 -0
  8. package/dist/commands/contract-emit.d.mts.map +1 -1
  9. package/dist/commands/contract-emit.mjs +2 -4
  10. package/dist/commands/contract-infer.d.mts.map +1 -1
  11. package/dist/commands/contract-infer.mjs +2 -4
  12. package/dist/commands/db-init.d.mts.map +1 -1
  13. package/dist/commands/db-init.mjs +11 -11
  14. package/dist/commands/db-init.mjs.map +1 -1
  15. package/dist/commands/db-schema.d.mts.map +1 -1
  16. package/dist/commands/db-schema.mjs +5 -7
  17. package/dist/commands/db-schema.mjs.map +1 -1
  18. package/dist/commands/db-sign.d.mts.map +1 -1
  19. package/dist/commands/db-sign.mjs +8 -9
  20. package/dist/commands/db-sign.mjs.map +1 -1
  21. package/dist/commands/db-update.d.mts.map +1 -1
  22. package/dist/commands/db-update.mjs +11 -11
  23. package/dist/commands/db-update.mjs.map +1 -1
  24. package/dist/commands/db-verify.d.mts.map +1 -1
  25. package/dist/commands/db-verify.mjs +1 -321
  26. package/dist/commands/migration-apply.d.mts.map +1 -1
  27. package/dist/commands/migration-apply.mjs +16 -17
  28. package/dist/commands/migration-apply.mjs.map +1 -1
  29. package/dist/commands/migration-new.d.mts +0 -1
  30. package/dist/commands/migration-new.d.mts.map +1 -1
  31. package/dist/commands/migration-new.mjs +10 -11
  32. package/dist/commands/migration-new.mjs.map +1 -1
  33. package/dist/commands/migration-plan.d.mts.map +1 -1
  34. package/dist/commands/migration-plan.mjs +1 -345
  35. package/dist/commands/migration-ref.d.mts +1 -1
  36. package/dist/commands/migration-ref.d.mts.map +1 -1
  37. package/dist/commands/migration-ref.mjs +5 -6
  38. package/dist/commands/migration-ref.mjs.map +1 -1
  39. package/dist/commands/migration-show.d.mts +1 -1
  40. package/dist/commands/migration-show.d.mts.map +1 -1
  41. package/dist/commands/migration-show.mjs +13 -13
  42. package/dist/commands/migration-show.mjs.map +1 -1
  43. package/dist/commands/migration-status.d.mts.map +1 -1
  44. package/dist/commands/migration-status.mjs +2 -4
  45. package/dist/{config-loader-ih8ViDb_.mjs → config-loader-B6sJjXTv.mjs} +2 -4
  46. package/dist/config-loader-B6sJjXTv.mjs.map +1 -0
  47. package/dist/config-loader.d.mts +0 -1
  48. package/dist/config-loader.d.mts.map +1 -1
  49. package/dist/config-loader.mjs +2 -3
  50. package/dist/{contract-emit-CnTXVVbF.mjs → contract-emit-B3ChISB_.mjs} +22 -13
  51. package/dist/contract-emit-B3ChISB_.mjs.map +1 -0
  52. package/dist/{contract-emit-CcZr3HS9.mjs → contract-emit-DkMqO7f2.mjs} +8 -10
  53. package/dist/contract-emit-DkMqO7f2.mjs.map +1 -0
  54. package/dist/{contract-enrichment-xDeJBC-o.mjs → contract-enrichment-CF6ogEJ_.mjs} +2 -2
  55. package/dist/contract-enrichment-CF6ogEJ_.mjs.map +1 -0
  56. package/dist/{contract-infer-sER84Le-.mjs → contract-infer-BDKAE0B0.mjs} +5 -7
  57. package/dist/{contract-infer-sER84Le-.mjs.map → contract-infer-BDKAE0B0.mjs.map} +1 -1
  58. package/dist/db-verify-B4TdDKOI.mjs +403 -0
  59. package/dist/db-verify-B4TdDKOI.mjs.map +1 -0
  60. package/dist/exports/config-types.mjs +1 -2
  61. package/dist/exports/control-api.d.mts +202 -7
  62. package/dist/exports/control-api.d.mts.map +1 -1
  63. package/dist/exports/control-api.mjs +4 -6
  64. package/dist/exports/index.d.mts.map +1 -1
  65. package/dist/exports/index.mjs +28 -30
  66. package/dist/exports/index.mjs.map +1 -1
  67. package/dist/exports/init-output.d.mts +2 -4
  68. package/dist/exports/init-output.d.mts.map +1 -1
  69. package/dist/exports/init-output.mjs +2 -3
  70. package/dist/{framework-components-Bgcre3Z6.mjs → framework-components-gwAHl7ml.mjs} +3 -4
  71. package/dist/{framework-components-Bgcre3Z6.mjs.map → framework-components-gwAHl7ml.mjs.map} +1 -1
  72. package/dist/{init-DC4sL4Rp.mjs → init-Deo7U8_U.mjs} +13 -30
  73. package/dist/init-Deo7U8_U.mjs.map +1 -0
  74. package/dist/{inspect-live-schema-BQN21nNO.mjs → inspect-live-schema-BAgQMYpD.mjs} +7 -8
  75. package/dist/inspect-live-schema-BAgQMYpD.mjs.map +1 -0
  76. package/dist/migration-cli.d.mts +0 -1
  77. package/dist/migration-cli.d.mts.map +1 -1
  78. package/dist/migration-cli.mjs +2 -3
  79. package/dist/migration-cli.mjs.map +1 -1
  80. package/dist/{migration-command-scaffold-DLmYGRug.mjs → migration-command-scaffold-B8J702Uh.mjs} +7 -8
  81. package/dist/migration-command-scaffold-B8J702Uh.mjs.map +1 -0
  82. package/dist/migration-plan-BcKNnTM7.mjs +530 -0
  83. package/dist/migration-plan-BcKNnTM7.mjs.map +1 -0
  84. package/dist/{migration-status-CDW4RDsO.mjs → migration-status-CjwB2of-.mjs} +10 -14
  85. package/dist/migration-status-CjwB2of-.mjs.map +1 -0
  86. package/dist/{migrations-MEoKMiV5.mjs → migrations-CIK94AJf.mjs} +3 -4
  87. package/dist/migrations-CIK94AJf.mjs.map +1 -0
  88. package/dist/{output-BpcQrnnq.mjs → output-DnjfCC_u.mjs} +9 -3
  89. package/dist/output-DnjfCC_u.mjs.map +1 -0
  90. package/dist/{progress-adapter-DgRGldpT.mjs → progress-adapter-xASh41wr.mjs} +2 -2
  91. package/dist/{progress-adapter-DgRGldpT.mjs.map → progress-adapter-xASh41wr.mjs.map} +1 -1
  92. package/dist/{result-handler-Ch6hVnOo.mjs → result-handler-DWb1rFS-.mjs} +20 -10
  93. package/dist/result-handler-DWb1rFS-.mjs.map +1 -0
  94. package/dist/{terminal-ui-u2YgKghu.mjs → terminal-ui-zaRDhJnP.mjs} +2 -6
  95. package/dist/{terminal-ui-u2YgKghu.mjs.map → terminal-ui-zaRDhJnP.mjs.map} +1 -1
  96. package/dist/{verify-BT9tgCOH.mjs → verify-BEIa9638.mjs} +3 -4
  97. package/dist/verify-BEIa9638.mjs.map +1 -0
  98. package/package.json +17 -17
  99. package/dist/client-hUCMXFE_.mjs +0 -1031
  100. package/dist/client-hUCMXFE_.mjs.map +0 -1
  101. package/dist/commands/db-verify.mjs.map +0 -1
  102. package/dist/commands/migration-plan.mjs.map +0 -1
  103. package/dist/config-loader-ih8ViDb_.mjs.map +0 -1
  104. package/dist/contract-emit-BkRH9lGt.mjs +0 -4
  105. package/dist/contract-emit-CcZr3HS9.mjs.map +0 -1
  106. package/dist/contract-emit-CnTXVVbF.mjs.map +0 -1
  107. package/dist/contract-enrichment-xDeJBC-o.mjs.map +0 -1
  108. package/dist/init-DC4sL4Rp.mjs.map +0 -1
  109. package/dist/inspect-live-schema-BQN21nNO.mjs.map +0 -1
  110. package/dist/migration-command-scaffold-DLmYGRug.mjs.map +0 -1
  111. package/dist/migration-status-CDW4RDsO.mjs.map +0 -1
  112. package/dist/migrations-MEoKMiV5.mjs.map +0 -1
  113. package/dist/output-BpcQrnnq.mjs.map +0 -1
  114. package/dist/result-handler-Ch6hVnOo.mjs.map +0 -1
  115. package/dist/verify-BT9tgCOH.mjs.map +0 -1
@@ -1,12 +1,71 @@
1
+ import { t as CliStructuredError } from "../cli-errors-QH8kf-C2.mjs";
1
2
  import { Result } from "@prisma-next/utils/result";
2
3
  import { ContractSourceDiagnostics, ContractSourceProvider } from "@prisma-next/config/config-types";
3
- import { ControlAdapterDescriptor, ControlDriverDescriptor, ControlExtensionDescriptor, ControlFamilyDescriptor, ControlStack, ControlTargetDescriptor, CoreSchemaView, MigrationPlanOperation, MigrationPlannerConflict, OperationPreview, SignDatabaseResult, SignDatabaseResult as SignDatabaseResult$1, VerifyDatabaseResult, VerifyDatabaseResult as VerifyDatabaseResult$1, VerifyDatabaseSchemaResult, VerifyDatabaseSchemaResult as VerifyDatabaseSchemaResult$1 } from "@prisma-next/framework-components/control";
4
+ import { ControlAdapterDescriptor, ControlDriverDescriptor, ControlDriverInstance, ControlExtensionDescriptor, ControlFamilyDescriptor, ControlFamilyInstance, ControlStack, ControlTargetDescriptor, CoreSchemaView, MigrationPlanOperation, MigrationPlannerConflict, OperationPreview, SignDatabaseResult, SignDatabaseResult as SignDatabaseResult$1, TargetMigrationsCapability, VerifyDatabaseResult, VerifyDatabaseResult as VerifyDatabaseResult$1, VerifyDatabaseSchemaResult, VerifyDatabaseSchemaResult as VerifyDatabaseSchemaResult$1 } from "@prisma-next/framework-components/control";
4
5
  import { TargetBoundComponentDescriptor } from "@prisma-next/framework-components/components";
5
6
  import { Contract, ContractMarkerRecord } from "@prisma-next/contract/types";
6
7
  import { PslDocumentAst } from "@prisma-next/framework-components/psl-ast";
7
8
 
9
+ //#region src/control-api/operations/db-verify.d.ts
10
+ /**
11
+ * Inputs for the aggregate `db verify` operation.
12
+ *
13
+ * Loader → verifier pipeline. The loader (sole descriptor-import
14
+ * boundary) builds a {@link import('@prisma-next/migration-tools/aggregate').ContractSpaceAggregate};
15
+ * the aggregate verifier bundles `markerCheck` + per-space pre-projected
16
+ * `schemaCheck`. `mode: 'strict' | 'lenient'` maps directly to the user
17
+ * facing `--strict` flag.
18
+ */
19
+ interface ExecuteDbVerifyOptions<TFamilyId extends string, TTargetId extends string> {
20
+ readonly driver: ControlDriverInstance<TFamilyId, TTargetId>;
21
+ readonly familyInstance: ControlFamilyInstance<TFamilyId, unknown>;
22
+ readonly contract: Contract;
23
+ readonly migrationsDir: string;
24
+ readonly targetId: TTargetId;
25
+ readonly extensionPacks: ReadonlyArray<ControlExtensionDescriptor<TFamilyId, TTargetId>>;
26
+ readonly frameworkComponents: ReadonlyArray<TargetBoundComponentDescriptor<TFamilyId, TTargetId>>;
27
+ readonly mode: 'strict' | 'lenient';
28
+ readonly skipSchema: boolean;
29
+ readonly skipMarker: boolean;
30
+ readonly onProgress?: OnControlProgress;
31
+ }
32
+ /**
33
+ * Result of the aggregate verify operation.
34
+ *
35
+ * Marker-check failures are surfaced as a {@link CliStructuredError}
36
+ * (same envelope code `5002` the legacy `runContractSpaceVerifierMarkerCheck`
37
+ * emitted, so downstream tooling and integration tests assert on the
38
+ * same shape).
39
+ *
40
+ * On success, the per-space schema results are returned for the CLI to
41
+ * render. When `skipSchema` is true (`--marker-only`), the schema map
42
+ * is empty.
43
+ */
44
+ interface ExecuteDbVerifySuccess {
45
+ readonly schemaResults: ReadonlyMap<string, VerifyDatabaseSchemaResult$1>;
46
+ readonly memberOrder: readonly string[];
47
+ readonly appSpaceId: string;
48
+ }
49
+ type ExecuteDbVerifyResult = Result<ExecuteDbVerifySuccess, CliStructuredError>;
50
+ /**
51
+ * Loader → verifier pipeline shared by `db verify` modes (`full`,
52
+ * `marker-only`, `schema-only`).
53
+ *
54
+ * 1. **Load**: build a {@link import('@prisma-next/migration-tools/aggregate').ContractSpaceAggregate}
55
+ * from descriptors + on-disk on-disk artefacts. Layout / drift /
56
+ * integrity / disjointness violations short-circuit with a
57
+ * structured CLI error.
58
+ * 2. **Read DB state**: marker rows + (when `skipSchema` is `false`)
59
+ * schema introspection.
60
+ * 3. **Verify**: {@link verifyAggregate} returns per-space
61
+ * `markerCheck` + per-space pre-projected `schemaCheck` (closes F23).
62
+ * Marker mismatches map to `CliStructuredError` (code `5002`) so
63
+ * callers (CLI command) can render and exit. Schema results are
64
+ * returned to the caller verbatim.
65
+ */
66
+ declare function executeDbVerify<TFamilyId extends string, TTargetId extends string>(options: ExecuteDbVerifyOptions<TFamilyId, TTargetId>): Promise<ExecuteDbVerifyResult>;
67
+ //#endregion
8
68
  //#region src/control-api/types.d.ts
9
-
10
69
  /**
11
70
  * Options for creating a control client.
12
71
  *
@@ -35,7 +94,7 @@ interface ControlClientOptions {
35
94
  /**
36
95
  * Action names for control-api operations that can emit progress events.
37
96
  */
38
- type ControlActionName = 'dbInit' | 'dbUpdate' | 'migrationApply' | 'verify' | 'schemaVerify' | 'sign' | 'introspect' | 'emit';
97
+ type ControlActionName = 'dbInit' | 'dbUpdate' | 'dbVerify' | 'migrationApply' | 'verify' | 'schemaVerify' | 'sign' | 'introspect' | 'emit';
39
98
  /**
40
99
  * Progress event emitted during control-api operation execution.
41
100
  *
@@ -144,6 +203,13 @@ interface DbInitOptions {
144
203
  * The type is driver-specific (e.g., string URL for Postgres).
145
204
  */
146
205
  readonly connection?: unknown;
206
+ /**
207
+ * On-disk migrations directory. Always required — every `db init`
208
+ * routes through the per-space flow, which reads on-disk
209
+ * `refs/head.json` and extension destination contracts from this
210
+ * root.
211
+ */
212
+ readonly migrationsDir: string;
147
213
  /** Optional progress callback for observing operation progress */
148
214
  readonly onProgress?: OnControlProgress;
149
215
  }
@@ -173,9 +239,33 @@ interface DbUpdateOptions {
173
239
  * or re-run with -y/--yes.
174
240
  */
175
241
  readonly acceptDataLoss?: boolean;
242
+ /**
243
+ * On-disk migrations directory. Always required — every `db update`
244
+ * routes through the per-space flow, which reads on-disk
245
+ * `refs/head.json` and extension destination contracts from this
246
+ * root.
247
+ */
248
+ readonly migrationsDir: string;
176
249
  /** Optional progress callback for observing operation progress */
177
250
  readonly onProgress?: OnControlProgress;
178
251
  }
252
+ /**
253
+ * Options for the dbVerify operation.
254
+ *
255
+ * Drives the loader → aggregate-verifier pipeline. `strict` maps to
256
+ * `verifyAggregate({ mode: 'strict' | 'lenient' })`; `skipSchema`
257
+ * mirrors the `--marker-only` CLI flag and short-circuits the schema
258
+ * portion of the verifier.
259
+ */
260
+ interface DbVerifyOptions {
261
+ readonly contract: unknown;
262
+ readonly migrationsDir: string;
263
+ readonly strict: boolean;
264
+ readonly skipSchema: boolean;
265
+ readonly skipMarker: boolean;
266
+ readonly connection?: unknown;
267
+ readonly onProgress?: OnControlProgress;
268
+ }
179
269
  /**
180
270
  * Options for the introspect operation.
181
271
  */
@@ -484,9 +574,7 @@ interface ContractEmitResult {
484
574
  readonly profileHash: string;
485
575
  /** Paths to the emitted files */
486
576
  readonly files: {
487
- /** Path to the emitted contract.json file */
488
- readonly json: string;
489
- /** Path to the emitted contract.d.ts file */
577
+ /** Path to the emitted contract.json file */readonly json: string; /** Path to the emitted contract.d.ts file */
490
578
  readonly dts: string;
491
579
  };
492
580
  /**
@@ -577,6 +665,20 @@ interface ControlClient {
577
665
  * @throws If not connected, target doesn't support migrations, or infrastructure failure
578
666
  */
579
667
  dbUpdate(options: DbUpdateOptions): Promise<DbUpdateResult>;
668
+ /**
669
+ * Verifies the database against every contract space (app + extensions).
670
+ *
671
+ * Loader → aggregate-verifier pipeline:
672
+ * - The loader catches layout / drift / disjointness violations.
673
+ * - The aggregate verifier surfaces marker-vs-on-disk drift and orphan
674
+ * markers, and (unless `skipSchema` is true) per-space schema
675
+ * verification with pre-projection (closes F23).
676
+ *
677
+ * @returns Result pattern: per-space schema results on success;
678
+ * structured CLI error on marker / loader failure.
679
+ * @throws If not connected or infrastructure failure
680
+ */
681
+ dbVerify(options: DbVerifyOptions): Promise<ExecuteDbVerifyResult>;
580
682
  /**
581
683
  * Reads the contract marker from the database.
582
684
  * Returns null if no marker exists (fresh database).
@@ -584,6 +686,12 @@ interface ControlClient {
584
686
  * @throws If not connected or infrastructure failure
585
687
  */
586
688
  readMarker(): Promise<ContractMarkerRecord | null>;
689
+ /**
690
+ * Reads every marker row (one per contract space). Used by the
691
+ * per-space verifier to detect orphan marker rows and marker-vs-on-disk
692
+ * drift after a database connection has been established.
693
+ */
694
+ readAllMarkers(): Promise<ReadonlyMap<string, ContractMarkerRecord>>;
587
695
  /**
588
696
  * Applies pre-planned on-disk migrations to the database.
589
697
  * Each migration runs in its own transaction with full execution checks.
@@ -680,8 +788,95 @@ declare function enrichContract(ir: Contract, components: ReadonlyArray<TargetBo
680
788
  */
681
789
  declare function executeContractEmit(options: ContractEmitOptions): Promise<ContractEmitResult>;
682
790
  //#endregion
791
+ //#region src/control-api/operations/db-init.d.ts
792
+ /**
793
+ * Options for executing the `db init` operation.
794
+ *
795
+ * `db init` runs the loader → planner → runner pipeline:
796
+ *
797
+ * 1. {@link executeAggregateApply} loads a `ContractSpaceAggregate` via
798
+ * {@link import('@prisma-next/migration-tools/aggregate').loadContractSpaceAggregate}
799
+ * from the supplied descriptor set + on-disk on-disk artefacts.
800
+ * 2. The aggregate planner runs with `callerPolicy.ignoreGraphFor`
801
+ * locked to the app member — synth strategy for the app, graph-walk
802
+ * for every extension.
803
+ * 3. The runner's `executeAcrossSpaces` applies the per-space plans
804
+ * inside one outer transaction.
805
+ *
806
+ * `extensionPacks` mirrors `Config.extensionPacks` (descriptor list).
807
+ * The loader (sub-spec § Loader) is the sole descriptor-import boundary.
808
+ */
809
+ interface ExecuteDbInitOptions<TFamilyId extends string, TTargetId extends string> {
810
+ readonly driver: ControlDriverInstance<TFamilyId, TTargetId>;
811
+ readonly familyInstance: ControlFamilyInstance<TFamilyId, unknown>;
812
+ readonly contract: Contract;
813
+ readonly mode: 'plan' | 'apply';
814
+ readonly migrations: TargetMigrationsCapability<TFamilyId, TTargetId, ControlFamilyInstance<TFamilyId, unknown>>;
815
+ readonly frameworkComponents: ReadonlyArray<TargetBoundComponentDescriptor<TFamilyId, TTargetId>>;
816
+ /**
817
+ * On-disk migrations directory the aggregate loader reads on-disk
818
+ * artefacts from. Required.
819
+ */
820
+ readonly migrationsDir: string;
821
+ /**
822
+ * Resolved adapter target id. Threaded through to the loader for
823
+ * target-consistency checks across descriptors and the app contract.
824
+ */
825
+ readonly targetId: TTargetId;
826
+ /**
827
+ * Declared extension descriptors. Defaults to an empty list, which
828
+ * routes through the same loader → planner → runner pipeline with no
829
+ * extension members in the aggregate.
830
+ */
831
+ readonly extensionPacks?: ReadonlyArray<ControlExtensionDescriptor<TFamilyId, TTargetId>>;
832
+ /** Optional progress callback for observing operation progress */
833
+ readonly onProgress?: OnControlProgress;
834
+ }
835
+ /**
836
+ * Execute `db init` against the configured contract.
837
+ *
838
+ * Routes through the loader → planner → runner pipeline (sub-spec
839
+ * "Commit-by-commit § Commit 4"). Always additive-only; destructive
840
+ * changes belong to `db update`.
841
+ */
842
+ declare function executeDbInit<TFamilyId extends string, TTargetId extends string>(options: ExecuteDbInitOptions<TFamilyId, TTargetId>): Promise<DbInitResult>;
843
+ //#endregion
844
+ //#region src/control-api/operations/db-update.d.ts
845
+ /**
846
+ * Options for the `db update` operation.
847
+ *
848
+ * Same loader → planner → runner pipeline as `db init`, but with the
849
+ * widened operation policy (additive + widening + destructive). The
850
+ * destructive-change confirmation gate runs at this layer: when
851
+ * `mode === 'apply'` and `acceptDataLoss` is `false`, the operation
852
+ * pre-plans, surfaces destructive ops to the caller, and aborts.
853
+ */
854
+ interface ExecuteDbUpdateOptions<TFamilyId extends string, TTargetId extends string> {
855
+ readonly driver: ControlDriverInstance<TFamilyId, TTargetId>;
856
+ readonly familyInstance: ControlFamilyInstance<TFamilyId, unknown>;
857
+ readonly contract: Contract;
858
+ readonly mode: 'plan' | 'apply';
859
+ readonly migrations: TargetMigrationsCapability<TFamilyId, TTargetId, ControlFamilyInstance<TFamilyId, unknown>>;
860
+ readonly frameworkComponents: ReadonlyArray<TargetBoundComponentDescriptor<TFamilyId, TTargetId>>;
861
+ readonly acceptDataLoss?: boolean;
862
+ readonly migrationsDir: string;
863
+ readonly targetId: TTargetId;
864
+ readonly extensionPacks?: ReadonlyArray<ControlExtensionDescriptor<TFamilyId, TTargetId>>;
865
+ readonly onProgress?: OnControlProgress;
866
+ }
867
+ /**
868
+ * Execute `db update` against the configured contract.
869
+ *
870
+ * Routes through the loader → planner → runner pipeline. Destructive
871
+ * operations require either `acceptDataLoss: true` or a prior
872
+ * `mode: 'plan'` invocation that surfaces the destructive ops; the
873
+ * confirmation gate is implemented here so the lower-level applier
874
+ * remains policy-agnostic.
875
+ */
876
+ declare function executeDbUpdate<TFamilyId extends string, TTargetId extends string>(options: ExecuteDbUpdateOptions<TFamilyId, TTargetId>): Promise<DbUpdateResult>;
877
+ //#endregion
683
878
  //#region src/utils/emit-queue.d.ts
684
879
  declare function disposeEmitQueue(outputJsonPath: string): void;
685
880
  //#endregion
686
- export { type ContractEmitOptions, type ContractEmitResult, type ControlActionName, type ControlClient, type ControlClientOptions, type ControlProgressEvent, type ControlStack, type DbInitFailure, type DbInitFailureCode, type DbInitOptions, type DbInitResult, type DbInitSuccess, type DbUpdateFailure, type DbUpdateFailureCode, type DbUpdateOptions, type DbUpdateResult, type DbUpdateSuccess, type EmitContractConfig, type EmitFailure, type EmitFailureCode, type EmitOptions, type EmitResult, type EmitSuccess, type IntrospectOptions, type OnControlProgress, type SchemaVerifyOptions, type SignDatabaseResult, type SignOptions, type VerifyDatabaseResult, type VerifyDatabaseSchemaResult, type VerifyOptions, createControlClient, disposeEmitQueue, enrichContract, executeContractEmit };
881
+ export { type ContractEmitOptions, type ContractEmitResult, type ControlActionName, type ControlClient, type ControlClientOptions, type ControlProgressEvent, type ControlStack, type DbInitFailure, type DbInitFailureCode, type DbInitOptions, type DbInitResult, type DbInitSuccess, type DbUpdateFailure, type DbUpdateFailureCode, type DbUpdateOptions, type DbUpdateResult, type DbUpdateSuccess, type EmitContractConfig, type EmitFailure, type EmitFailureCode, type EmitOptions, type EmitResult, type EmitSuccess, type ExecuteDbInitOptions, type ExecuteDbUpdateOptions, type ExecuteDbVerifyOptions, type ExecuteDbVerifyResult, type IntrospectOptions, type OnControlProgress, type SchemaVerifyOptions, type SignDatabaseResult, type SignOptions, type VerifyDatabaseResult, type VerifyDatabaseSchemaResult, type VerifyOptions, createControlClient, disposeEmitQueue, enrichContract, executeContractEmit, executeDbInit, executeDbUpdate, executeDbVerify };
687
882
  //# sourceMappingURL=control-api.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"control-api.d.mts","names":[],"sources":["../../src/control-api/types.ts","../../src/control-api/client.ts","../../src/control-api/contract-enrichment.ts","../../src/control-api/operations/contract-emit.ts","../../src/utils/emit-queue.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"control-api.d.mts","names":[],"sources":["../../src/control-api/operations/db-verify.ts","../../src/control-api/types.ts","../../src/control-api/client.ts","../../src/control-api/contract-enrichment.ts","../../src/control-api/operations/contract-emit.ts","../../src/control-api/operations/db-init.ts","../../src/control-api/operations/db-update.ts","../../src/utils/emit-queue.ts"],"mappings":"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"}
@@ -1,6 +1,4 @@
1
- import "../config-loader-ih8ViDb_.mjs";
2
- import { n as disposeEmitQueue, t as executeContractEmit } from "../contract-emit-CnTXVVbF.mjs";
3
- import { t as enrichContract } from "../contract-enrichment-xDeJBC-o.mjs";
4
- import { t as createControlClient } from "../client-hUCMXFE_.mjs";
5
-
6
- export { createControlClient, disposeEmitQueue, enrichContract, executeContractEmit };
1
+ import { n as executeContractEmit, r as disposeEmitQueue } from "../contract-emit-B3ChISB_.mjs";
2
+ import { t as enrichContract } from "../contract-enrichment-CF6ogEJ_.mjs";
3
+ import { i as executeDbInit, n as executeDbVerify, r as executeDbUpdate, t as createControlClient } from "../client-0ZX24FXF.mjs";
4
+ export { createControlClient, disposeEmitQueue, enrichContract, executeContractEmit, executeDbInit, executeDbUpdate, executeDbVerify };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/load-ts-contract.ts"],"sourcesContent":[],"mappings":";;;;UAQiB,qBAAA;uBACM;;AADvB;AA+GA;;;;;;;;;;;;;;iBAAsB,kBAAA,8BAEV,wBACT,QAAQ"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/load-ts-contract.ts"],"mappings":";;;;UAQiB,qBAAA;EAAA,SACN,SAAA,GAAY,aAAA;AAAA;AADvB;;;;;AA6HA;;;;;;;;;;AA7HA,iBA6HsB,kBAAA,CACpB,SAAA,UACA,OAAA,GAAU,qBAAA,GACT,OAAA,CAAQ,QAAA"}
@@ -1,11 +1,9 @@
1
- import "../config-loader-ih8ViDb_.mjs";
2
- import { t as createContractEmitCommand } from "../contract-emit-CcZr3HS9.mjs";
3
- import { join } from "pathe";
1
+ import { t as createContractEmitCommand } from "../contract-emit-DkMqO7f2.mjs";
2
+ import { join, resolve } from "pathe";
4
3
  import { existsSync, unlinkSync, writeFileSync } from "node:fs";
5
4
  import { tmpdir } from "node:os";
6
5
  import { pathToFileURL } from "node:url";
7
6
  import { build } from "esbuild";
8
-
9
7
  //#region src/load-ts-contract.ts
10
8
  const DEFAULT_ALLOWLIST = ["@prisma-next/*", "node:crypto"];
11
9
  function isAllowedImport(importPath, allowlist) {
@@ -21,19 +19,19 @@ function isAllowedImport(importPath, allowlist) {
21
19
  function validatePurity(value) {
22
20
  if (typeof value !== "object" || value === null) return;
23
21
  const path = /* @__PURE__ */ new WeakSet();
24
- function check(value$1) {
25
- if (value$1 === null || typeof value$1 !== "object") return;
26
- if (path.has(value$1)) throw new Error("Contract export contains circular references");
27
- path.add(value$1);
22
+ function check(value) {
23
+ if (value === null || typeof value !== "object") return;
24
+ if (path.has(value)) throw new Error("Contract export contains circular references");
25
+ path.add(value);
28
26
  try {
29
- for (const key in value$1) {
30
- const descriptor = Object.getOwnPropertyDescriptor(value$1, key);
27
+ for (const key in value) {
28
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
31
29
  if (descriptor && (descriptor.get || descriptor.set)) throw new Error(`Contract export contains getter/setter at key "${key}"`);
32
30
  if (descriptor && typeof descriptor.value === "function") throw new Error(`Contract export contains function at key "${key}"`);
33
- check(value$1[key]);
31
+ check(value[key]);
34
32
  }
35
33
  } finally {
36
- path.delete(value$1);
34
+ path.delete(value);
37
35
  }
38
36
  }
39
37
  try {
@@ -47,17 +45,24 @@ function validatePurity(value) {
47
45
  throw new Error("Contract export is not JSON-serializable");
48
46
  }
49
47
  }
50
- function createImportAllowlistPlugin(allowlist, entryPath) {
48
+ function createImportAllowlistPlugin(allowlist, entryPath, collected) {
49
+ const entryAbs = resolve(entryPath);
50
+ function isFromEntry(importer) {
51
+ return importer === entryAbs || importer === entryPath || importer === "<stdin>";
52
+ }
51
53
  return {
52
54
  name: "import-allowlist",
53
- setup(build$1) {
54
- build$1.onResolve({ filter: /.*/ }, (args) => {
55
+ setup(build) {
56
+ build.onResolve({ filter: /.*/ }, (args) => {
55
57
  if (args.kind === "entry-point") return;
56
58
  if (args.path.startsWith(".") || args.path.startsWith("/")) return;
57
- if ((args.importer === entryPath || args.importer === "<stdin>") && !isAllowedImport(args.path, allowlist)) return {
58
- path: args.path,
59
- external: true
60
- };
59
+ if (isFromEntry(args.importer) && !isAllowedImport(args.path, allowlist)) {
60
+ collected.add(args.path);
61
+ return {
62
+ path: args.path,
63
+ external: true
64
+ };
65
+ }
61
66
  });
62
67
  }
63
68
  };
@@ -81,6 +86,7 @@ async function loadContractFromTs(entryPath, options) {
81
86
  const allowlist = options?.allowlist ?? DEFAULT_ALLOWLIST;
82
87
  if (!existsSync(entryPath)) throw new Error(`Contract file not found: ${entryPath}`);
83
88
  const tempFile = join(tmpdir(), `prisma-next-contract-${Date.now()}-${Math.random().toString(36).slice(2)}.mjs`);
89
+ const disallowedFromEntry = /* @__PURE__ */ new Set();
84
90
  try {
85
91
  const result = await build({
86
92
  entryPoints: [entryPath],
@@ -91,7 +97,7 @@ async function loadContractFromTs(entryPath, options) {
91
97
  outfile: tempFile,
92
98
  write: false,
93
99
  metafile: true,
94
- plugins: [createImportAllowlistPlugin(allowlist, entryPath)],
100
+ plugins: [createImportAllowlistPlugin(allowlist, entryPath, disallowedFromEntry)],
95
101
  logLevel: "error"
96
102
  });
97
103
  if (result.errors.length > 0) {
@@ -99,15 +105,7 @@ async function loadContractFromTs(entryPath, options) {
99
105
  throw new Error(`Failed to bundle contract file: ${errorMessages}`);
100
106
  }
101
107
  if (!result.outputFiles || result.outputFiles.length === 0) throw new Error("No output files generated from bundling");
102
- const disallowedImports = [];
103
- if (result.metafile) {
104
- const inputs = result.metafile.inputs;
105
- for (const [, inputData] of Object.entries(inputs)) {
106
- const imports = inputData.imports || [];
107
- for (const imp of imports) if (imp.external && !imp.path.startsWith(".") && !imp.path.startsWith("/") && !isAllowedImport(imp.path, allowlist)) disallowedImports.push(imp.path);
108
- }
109
- }
110
- if (disallowedImports.length > 0) throw new Error(`Disallowed imports detected. Only imports matching the allowlist are permitted:\n Allowlist: ${allowlist.join(", ")}\n Disallowed imports: ${disallowedImports.join(", ")}\n\nOnly @prisma-next/* packages are allowed in contract files.`);
108
+ if (disallowedFromEntry.size > 0) throw new Error(`Disallowed imports detected. Only imports matching the allowlist are permitted:\n Allowlist: ${allowlist.join(", ")}\n Disallowed imports: ${[...disallowedFromEntry].join(", ")}`);
111
109
  const bundleContent = result.outputFiles[0]?.text;
112
110
  if (bundleContent === void 0) throw new Error("Bundle content is undefined");
113
111
  writeFileSync(tempFile, bundleContent, "utf-8");
@@ -131,7 +129,7 @@ async function loadContractFromTs(entryPath, options) {
131
129
  throw new Error(`Failed to load contract from ${entryPath}: ${String(error)}`);
132
130
  }
133
131
  }
134
-
135
132
  //#endregion
136
133
  export { createContractEmitCommand, loadContractFromTs };
134
+
137
135
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["value","disallowedImports: string[]","contract: unknown"],"sources":["../../src/load-ts-contract.ts"],"sourcesContent":["import { existsSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { pathToFileURL } from 'node:url';\nimport type { Contract } from '@prisma-next/contract/types';\nimport type { Plugin } from 'esbuild';\nimport { build } from 'esbuild';\nimport { join } from 'pathe';\n\nexport interface LoadTsContractOptions {\n readonly allowlist?: ReadonlyArray<string>;\n}\n\nconst DEFAULT_ALLOWLIST = ['@prisma-next/*', 'node:crypto'];\n\nfunction isAllowedImport(importPath: string, allowlist: ReadonlyArray<string>): boolean {\n for (const pattern of allowlist) {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2);\n if (importPath === prefix || importPath.startsWith(`${prefix}/`)) {\n return true;\n }\n } else if (pattern.endsWith('*')) {\n const prefix = pattern.slice(0, -1);\n if (importPath.startsWith(prefix)) {\n return true;\n }\n } else if (importPath === pattern) {\n return true;\n }\n }\n return false;\n}\n\nfunction validatePurity(value: unknown): void {\n if (typeof value !== 'object' || value === null) {\n return;\n }\n\n const path = new WeakSet();\n\n function check(value: unknown): void {\n if (value === null || typeof value !== 'object') {\n return;\n }\n\n if (path.has(value)) {\n throw new Error('Contract export contains circular references');\n }\n path.add(value);\n\n try {\n for (const key in value) {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (descriptor && (descriptor.get || descriptor.set)) {\n throw new Error(`Contract export contains getter/setter at key \"${key}\"`);\n }\n if (descriptor && typeof descriptor.value === 'function') {\n throw new Error(`Contract export contains function at key \"${key}\"`);\n }\n check((value as Record<string, unknown>)[key]);\n }\n } finally {\n path.delete(value);\n }\n }\n\n try {\n check(value);\n JSON.stringify(value);\n } catch (error) {\n if (error instanceof Error) {\n if (error.message.includes('getter') || error.message.includes('circular')) {\n throw error;\n }\n throw new Error(`Contract export is not JSON-serializable: ${error.message}`);\n }\n throw new Error('Contract export is not JSON-serializable');\n }\n}\n\nfunction createImportAllowlistPlugin(allowlist: ReadonlyArray<string>, entryPath: string): Plugin {\n return {\n name: 'import-allowlist',\n setup(build) {\n build.onResolve({ filter: /.*/ }, (args) => {\n if (args.kind === 'entry-point') {\n return undefined;\n }\n if (args.path.startsWith('.') || args.path.startsWith('/')) {\n return undefined;\n }\n const isFromEntryPoint = args.importer === entryPath || args.importer === '<stdin>';\n if (isFromEntryPoint && !isAllowedImport(args.path, allowlist)) {\n return {\n path: args.path,\n external: true,\n };\n }\n return undefined;\n });\n },\n };\n}\n\n/**\n * Loads a contract from a TypeScript file and returns it as Contract.\n *\n * **Responsibility: Parsing Only**\n * This function loads and parses a TypeScript contract file. It does NOT normalize the contract.\n * The contract should already be normalized if it was built using the contract builder.\n *\n * Normalization must happen in the contract builder when the contract is created.\n * This function only validates that the contract is JSON-serializable and returns it as-is.\n *\n * @param entryPath - Path to the TypeScript contract file\n * @param options - Optional configuration (import allowlist)\n * @returns The contract as Contract (should already be normalized)\n * @throws Error if the contract cannot be loaded or is not JSON-serializable\n */\nexport async function loadContractFromTs(\n entryPath: string,\n options?: LoadTsContractOptions,\n): Promise<Contract> {\n const allowlist = options?.allowlist ?? DEFAULT_ALLOWLIST;\n\n if (!existsSync(entryPath)) {\n throw new Error(`Contract file not found: ${entryPath}`);\n }\n\n const tempFile = join(\n tmpdir(),\n `prisma-next-contract-${Date.now()}-${Math.random().toString(36).slice(2)}.mjs`,\n );\n\n try {\n const result = await build({\n entryPoints: [entryPath],\n bundle: true,\n format: 'esm',\n platform: 'node',\n target: 'es2022',\n outfile: tempFile,\n write: false,\n metafile: true,\n plugins: [createImportAllowlistPlugin(allowlist, entryPath)],\n logLevel: 'error',\n });\n\n if (result.errors.length > 0) {\n const errorMessages = result.errors.map((e: { text: string }) => e.text).join('\\n');\n throw new Error(`Failed to bundle contract file: ${errorMessages}`);\n }\n\n if (!result.outputFiles || result.outputFiles.length === 0) {\n throw new Error('No output files generated from bundling');\n }\n\n const disallowedImports: string[] = [];\n if (result.metafile) {\n const inputs = result.metafile.inputs;\n for (const [, inputData] of Object.entries(inputs)) {\n const imports =\n (inputData as { imports?: Array<{ path: string; external?: boolean }> }).imports || [];\n for (const imp of imports) {\n if (\n imp.external &&\n !imp.path.startsWith('.') &&\n !imp.path.startsWith('/') &&\n !isAllowedImport(imp.path, allowlist)\n ) {\n disallowedImports.push(imp.path);\n }\n }\n }\n }\n\n if (disallowedImports.length > 0) {\n throw new Error(\n `Disallowed imports detected. Only imports matching the allowlist are permitted:\\n Allowlist: ${allowlist.join(', ')}\\n Disallowed imports: ${disallowedImports.join(', ')}\\n\\nOnly @prisma-next/* packages are allowed in contract files.`,\n );\n }\n\n const bundleContent = result.outputFiles[0]?.text;\n if (bundleContent === undefined) {\n throw new Error('Bundle content is undefined');\n }\n writeFileSync(tempFile, bundleContent, 'utf-8');\n\n const module = (await import(/* @vite-ignore */ pathToFileURL(tempFile).href)) as {\n default?: unknown;\n contract?: unknown;\n };\n unlinkSync(tempFile);\n\n let contract: unknown;\n\n if (module.default !== undefined) {\n contract = module.default;\n } else if (module.contract !== undefined) {\n contract = module.contract;\n } else {\n throw new Error(\n `Contract file must export a contract as default export or named export 'contract'. Found exports: ${Object.keys(module as Record<string, unknown>).join(', ') || 'none'}`,\n );\n }\n\n if (typeof contract !== 'object' || contract === null) {\n throw new Error(`Contract export must be an object, got ${typeof contract}`);\n }\n\n validatePurity(contract);\n\n return contract as Contract;\n } catch (error) {\n try {\n if (tempFile) {\n unlinkSync(tempFile);\n }\n } catch {\n // Ignore cleanup errors\n }\n\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(`Failed to load contract from ${entryPath}: ${String(error)}`);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["resolvePath"],"sources":["../../src/load-ts-contract.ts"],"sourcesContent":["import { existsSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { pathToFileURL } from 'node:url';\nimport type { Contract } from '@prisma-next/contract/types';\nimport type { Plugin } from 'esbuild';\nimport { build } from 'esbuild';\nimport { join, resolve as resolvePath } from 'pathe';\n\nexport interface LoadTsContractOptions {\n readonly allowlist?: ReadonlyArray<string>;\n}\n\nconst DEFAULT_ALLOWLIST = ['@prisma-next/*', 'node:crypto'];\n\nfunction isAllowedImport(importPath: string, allowlist: ReadonlyArray<string>): boolean {\n for (const pattern of allowlist) {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2);\n if (importPath === prefix || importPath.startsWith(`${prefix}/`)) {\n return true;\n }\n } else if (pattern.endsWith('*')) {\n const prefix = pattern.slice(0, -1);\n if (importPath.startsWith(prefix)) {\n return true;\n }\n } else if (importPath === pattern) {\n return true;\n }\n }\n return false;\n}\n\nfunction validatePurity(value: unknown): void {\n if (typeof value !== 'object' || value === null) {\n return;\n }\n\n const path = new WeakSet();\n\n function check(value: unknown): void {\n if (value === null || typeof value !== 'object') {\n return;\n }\n\n if (path.has(value)) {\n throw new Error('Contract export contains circular references');\n }\n path.add(value);\n\n try {\n for (const key in value) {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (descriptor && (descriptor.get || descriptor.set)) {\n throw new Error(`Contract export contains getter/setter at key \"${key}\"`);\n }\n if (descriptor && typeof descriptor.value === 'function') {\n throw new Error(`Contract export contains function at key \"${key}\"`);\n }\n check((value as Record<string, unknown>)[key]);\n }\n } finally {\n path.delete(value);\n }\n }\n\n try {\n check(value);\n JSON.stringify(value);\n } catch (error) {\n if (error instanceof Error) {\n if (error.message.includes('getter') || error.message.includes('circular')) {\n throw error;\n }\n throw new Error(`Contract export is not JSON-serializable: ${error.message}`);\n }\n throw new Error('Contract export is not JSON-serializable');\n }\n}\n\nfunction createImportAllowlistPlugin(\n allowlist: ReadonlyArray<string>,\n entryPath: string,\n collected: Set<string>,\n): Plugin {\n // Match against several path forms that esbuild may use as the importer:\n // the absolute resolved entry, the value the caller passed (which may be\n // relative), and the conventional `<stdin>` placeholder. This is more\n // forgiving than `===` against a single form, which broke when esbuild\n // resolved the entry to an absolute path while the caller passed a\n // relative one (or vice versa).\n const entryAbs = resolvePath(entryPath);\n function isFromEntry(importer: string): boolean {\n return importer === entryAbs || importer === entryPath || importer === '<stdin>';\n }\n return {\n name: 'import-allowlist',\n setup(build) {\n build.onResolve({ filter: /.*/ }, (args) => {\n if (args.kind === 'entry-point') {\n return undefined;\n }\n if (args.path.startsWith('.') || args.path.startsWith('/')) {\n return undefined;\n }\n if (isFromEntry(args.importer) && !isAllowedImport(args.path, allowlist)) {\n collected.add(args.path);\n return {\n path: args.path,\n external: true,\n };\n }\n return undefined;\n });\n },\n };\n}\n\n/**\n * Loads a contract from a TypeScript file and returns it as Contract.\n *\n * **Responsibility: Parsing Only**\n * This function loads and parses a TypeScript contract file. It does NOT normalize the contract.\n * The contract should already be normalized if it was built using the contract builder.\n *\n * Normalization must happen in the contract builder when the contract is created.\n * This function only validates that the contract is JSON-serializable and returns it as-is.\n *\n * @param entryPath - Path to the TypeScript contract file\n * @param options - Optional configuration (import allowlist)\n * @returns The contract as Contract (should already be normalized)\n * @throws Error if the contract cannot be loaded or is not JSON-serializable\n */\nexport async function loadContractFromTs(\n entryPath: string,\n options?: LoadTsContractOptions,\n): Promise<Contract> {\n const allowlist = options?.allowlist ?? DEFAULT_ALLOWLIST;\n\n if (!existsSync(entryPath)) {\n throw new Error(`Contract file not found: ${entryPath}`);\n }\n\n const tempFile = join(\n tmpdir(),\n `prisma-next-contract-${Date.now()}-${Math.random().toString(36).slice(2)}.mjs`,\n );\n\n // Disallowed imports are collected by the allowlist resolver plugin itself,\n // which has the `importer` context to distinguish entry-direct imports from\n // transitive imports made inside allowlisted (`@prisma-next/*`) dependencies.\n // The metafile is intentionally not re-walked: it would surface internal\n // `node:*` imports inside framework code as false positives.\n const disallowedFromEntry = new Set<string>();\n\n try {\n const result = await build({\n entryPoints: [entryPath],\n bundle: true,\n format: 'esm',\n platform: 'node',\n target: 'es2022',\n outfile: tempFile,\n write: false,\n metafile: true,\n plugins: [createImportAllowlistPlugin(allowlist, entryPath, disallowedFromEntry)],\n logLevel: 'error',\n });\n\n if (result.errors.length > 0) {\n const errorMessages = result.errors.map((e: { text: string }) => e.text).join('\\n');\n throw new Error(`Failed to bundle contract file: ${errorMessages}`);\n }\n\n if (!result.outputFiles || result.outputFiles.length === 0) {\n throw new Error('No output files generated from bundling');\n }\n\n if (disallowedFromEntry.size > 0) {\n throw new Error(\n `Disallowed imports detected. Only imports matching the allowlist are permitted:\\n Allowlist: ${allowlist.join(', ')}\\n Disallowed imports: ${[...disallowedFromEntry].join(', ')}`,\n );\n }\n\n const bundleContent = result.outputFiles[0]?.text;\n if (bundleContent === undefined) {\n throw new Error('Bundle content is undefined');\n }\n writeFileSync(tempFile, bundleContent, 'utf-8');\n\n const module = (await import(/* @vite-ignore */ pathToFileURL(tempFile).href)) as {\n default?: unknown;\n contract?: unknown;\n };\n unlinkSync(tempFile);\n\n let contract: unknown;\n\n if (module.default !== undefined) {\n contract = module.default;\n } else if (module.contract !== undefined) {\n contract = module.contract;\n } else {\n throw new Error(\n `Contract file must export a contract as default export or named export 'contract'. Found exports: ${Object.keys(module as Record<string, unknown>).join(', ') || 'none'}`,\n );\n }\n\n if (typeof contract !== 'object' || contract === null) {\n throw new Error(`Contract export must be an object, got ${typeof contract}`);\n }\n\n validatePurity(contract);\n\n return contract as Contract;\n } catch (error) {\n try {\n if (tempFile) {\n unlinkSync(tempFile);\n }\n } catch {\n // Ignore cleanup errors\n }\n\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(`Failed to load contract from ${entryPath}: ${String(error)}`);\n }\n}\n"],"mappings":"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"}
@@ -1,8 +1,6 @@
1
- import "@clack/prompts";
2
- import * as arktype_internal_variants_object_ts0 from "arktype/internal/variants/object.ts";
1
+ import * as _$arktype_internal_variants_object_ts0 from "arktype/internal/variants/object.ts";
3
2
 
4
3
  //#region src/commands/init/output.d.ts
5
-
6
4
  /**
7
5
  * arktype schema for the structured success document `init --json` writes
8
6
  * to stdout (FR1.5). The same shape backs the human-readable outro
@@ -17,7 +15,7 @@ import * as arktype_internal_variants_object_ts0 from "arktype/internal/variants
17
15
  * Error envelopes (`CliErrorEnvelope`) carry `ok: false` so consumers can
18
16
  * branch with `if (doc.ok)` without inspecting the rest of the structure.
19
17
  */
20
- declare const InitOutputSchema: arktype_internal_variants_object_ts0.ObjectType<{
18
+ declare const InitOutputSchema: _$arktype_internal_variants_object_ts0.ObjectType<{
21
19
  ok: true;
22
20
  target: "postgres" | "mongodb";
23
21
  authoring: "psl" | "typescript";
@@ -1 +1 @@
1
- {"version":3,"file":"init-output.d.mts","names":[],"sources":["../../src/commands/init/output.ts"],"sourcesContent":[],"mappings":";;;;;;;AAkBA;AAwBA;;;;;;;;;;;cAxBa,kBAsBX,oCAAA,CAtB2B;;;;;;;;;;;;;;;;KAwBjB,UAAA,UAAoB,gBAAA,CAAiB"}
1
+ {"version":3,"file":"init-output.d.mts","names":[],"sources":["../../src/commands/init/output.ts"],"mappings":";;;;;AAkBA;;;;;;;;;;;;cAAa,gBAAA,EAsBX,sCAAA,CAtB2B,UAAA;;;;;;;;;;;;;;;;KAwBjB,UAAA,UAAoB,gBAAA,CAAiB,KAAA"}
@@ -1,3 +1,2 @@
1
- import { t as InitOutputSchema } from "../output-BpcQrnnq.mjs";
2
-
3
- export { InitOutputSchema };
1
+ import { t as InitOutputSchema } from "../output-DnjfCC_u.mjs";
2
+ export { InitOutputSchema };
@@ -1,6 +1,5 @@
1
- import { r as errorConfigValidation } from "./cli-errors-By1iVE3z.mjs";
1
+ import { r as errorConfigValidation } from "./cli-errors-D3_sMh2K.mjs";
2
2
  import "@prisma-next/framework-components/components";
3
-
4
3
  //#region src/utils/framework-components.ts
5
4
  /**
6
5
  * Asserts that all framework components are compatible with the expected family and target.
@@ -53,7 +52,7 @@ function assertFrameworkComponentsCompatible(expectedFamilyId, expectedTargetId,
53
52
  }
54
53
  return frameworkComponents;
55
54
  }
56
-
57
55
  //#endregion
58
56
  export { assertFrameworkComponentsCompatible as t };
59
- //# sourceMappingURL=framework-components-Bgcre3Z6.mjs.map
57
+
58
+ //# sourceMappingURL=framework-components-gwAHl7ml.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"framework-components-Bgcre3Z6.mjs","names":[],"sources":["../src/utils/framework-components.ts"],"sourcesContent":["import type { Contract } from '@prisma-next/contract/types';\nimport {\n checkContractComponentRequirements,\n type TargetBoundComponentDescriptor,\n} from '@prisma-next/framework-components/components';\nimport type { ControlStack } from '@prisma-next/framework-components/control';\nimport { errorConfigValidation, errorContractMissingExtensionPacks } from './cli-errors';\n\n/**\n * Asserts that all framework components are compatible with the expected family and target.\n *\n * This function validates that each component in the framework components array:\n * - Has kind 'target', 'adapter', 'extension', or 'driver'\n * - Has familyId matching expectedFamilyId\n * - Has targetId matching expectedTargetId\n *\n * This validation happens at the CLI composition boundary, before passing components\n * to typed planner/runner instances. It fills the gap between runtime validation\n * (via `validateConfig()`) and compile-time type enforcement.\n *\n * @param expectedFamilyId - The expected family ID (e.g., 'sql')\n * @param expectedTargetId - The expected target ID (e.g., 'postgres')\n * @param frameworkComponents - Array of framework components to validate\n * @returns The same array typed as TargetBoundComponentDescriptor\n * @throws CliStructuredError if any component is incompatible\n *\n * @example\n * ```ts\n * const config = await loadConfig();\n * const frameworkComponents = [config.target, config.adapter, ...(config.extensionPacks ?? [])];\n *\n * // Validate and type-narrow components before passing to planner\n * const typedComponents = assertFrameworkComponentsCompatible(\n * config.family.familyId,\n * config.target.targetId,\n * frameworkComponents\n * );\n *\n * const planner = target.migrations.createPlanner(familyInstance);\n * planner.plan({ contract, schema, policy, frameworkComponents: typedComponents });\n * ```\n */\nexport function assertFrameworkComponentsCompatible<\n TFamilyId extends string,\n TTargetId extends string,\n>(\n expectedFamilyId: TFamilyId,\n expectedTargetId: TTargetId,\n frameworkComponents: ReadonlyArray<unknown>,\n): ReadonlyArray<TargetBoundComponentDescriptor<TFamilyId, TTargetId>> {\n for (let i = 0; i < frameworkComponents.length; i++) {\n const component = frameworkComponents[i];\n\n // Check that component is an object\n if (typeof component !== 'object' || component === null) {\n throw errorConfigValidation('frameworkComponents[]', {\n why: `Framework component at index ${i} must be an object`,\n });\n }\n\n const record = component as Record<string, unknown>;\n\n // Check kind\n if (!Object.hasOwn(record, 'kind')) {\n throw errorConfigValidation('frameworkComponents[].kind', {\n why: `Framework component at index ${i} must have 'kind' property`,\n });\n }\n\n const kind = record['kind'];\n if (kind !== 'target' && kind !== 'adapter' && kind !== 'extension' && kind !== 'driver') {\n throw errorConfigValidation('frameworkComponents[].kind', {\n why: `Framework component at index ${i} has invalid kind '${String(kind)}' (must be 'target', 'adapter', 'extension', or 'driver')`,\n });\n }\n\n // Check familyId\n if (!Object.hasOwn(record, 'familyId')) {\n throw errorConfigValidation('frameworkComponents[].familyId', {\n why: `Framework component at index ${i} (kind: ${String(kind)}) must have 'familyId' property`,\n });\n }\n\n const familyId = record['familyId'];\n if (familyId !== expectedFamilyId) {\n throw errorConfigValidation('frameworkComponents[].familyId', {\n why: `Framework component at index ${i} (kind: ${String(kind)}) has familyId '${String(familyId)}' but expected '${expectedFamilyId}'`,\n });\n }\n\n // Check targetId\n if (!Object.hasOwn(record, 'targetId')) {\n throw errorConfigValidation('frameworkComponents[].targetId', {\n why: `Framework component at index ${i} (kind: ${String(kind)}) must have 'targetId' property`,\n });\n }\n\n const targetId = record['targetId'];\n if (targetId !== expectedTargetId) {\n throw errorConfigValidation('frameworkComponents[].targetId', {\n why: `Framework component at index ${i} (kind: ${String(kind)}) has targetId '${String(targetId)}' but expected '${expectedTargetId}'`,\n });\n }\n }\n\n // Type assertion is safe because we've validated all components above\n return frameworkComponents as ReadonlyArray<TargetBoundComponentDescriptor<TFamilyId, TTargetId>>;\n}\n\n/**\n * Validates that a contract is compatible with the configured target, adapter,\n * and extension packs. Throws on family/target mismatches or missing extension packs.\n *\n * This check ensures the emitted contract matches the CLI config before running\n * commands that depend on the contract (e.g., db verify, db sign).\n *\n * @param contract - The contract to validate (must include targetFamily, target, extensionPacks).\n * @param stack - The control plane stack (target, adapter, driver, extensionPacks).\n *\n * @throws {CliStructuredError} errorConfigValidation when contract.targetFamily or contract.target\n * doesn't match the configured family/target.\n * @throws {CliStructuredError} errorContractMissingExtensionPacks when the contract requires\n * extension packs that are not provided in the config (includes all missing packs in error.meta).\n *\n * @example\n * ```ts\n * import { assertContractRequirementsSatisfied } from './framework-components';\n *\n * const config = await loadConfig();\n * const contract = await loadContractJson(config.contract.output);\n * const stack = createControlStack({ family: config.family, target: config.target, adapter: config.adapter, ... });\n *\n * // Throws if contract is incompatible with config\n * assertContractRequirementsSatisfied({ contract, stack });\n * ```\n */\nexport function assertContractRequirementsSatisfied<\n TFamilyId extends string,\n TTargetId extends string,\n>({\n contract,\n stack,\n}: {\n readonly contract: Pick<Contract, 'targetFamily' | 'target' | 'extensionPacks'>;\n readonly stack: ControlStack<TFamilyId, TTargetId>;\n}): void {\n const providedComponentIds = new Set<string>([\n stack.target.id,\n ...(stack.adapter ? [stack.adapter.id] : []),\n ]);\n for (const extension of stack.extensionPacks) {\n providedComponentIds.add(extension.id);\n }\n\n const result = checkContractComponentRequirements({\n contract,\n expectedTargetFamily: stack.target.familyId,\n expectedTargetId: stack.target.targetId,\n providedComponentIds,\n });\n\n if (result.familyMismatch) {\n throw errorConfigValidation('contract.targetFamily', {\n why: `Contract was emitted for family '${result.familyMismatch.actual}' but CLI config is wired to '${result.familyMismatch.expected}'.`,\n });\n }\n\n if (result.targetMismatch) {\n throw errorConfigValidation('contract.target', {\n why: `Contract target '${result.targetMismatch.actual}' does not match CLI target '${result.targetMismatch.expected}'.`,\n });\n }\n\n if (result.missingExtensionPackIds.length > 0) {\n throw errorContractMissingExtensionPacks({\n missingExtensionPacks: result.missingExtensionPackIds,\n providedComponentIds: [...providedComponentIds],\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,SAAgB,oCAId,kBACA,kBACA,qBACqE;AACrE,MAAK,IAAI,IAAI,GAAG,IAAI,oBAAoB,QAAQ,KAAK;EACnD,MAAM,YAAY,oBAAoB;AAGtC,MAAI,OAAO,cAAc,YAAY,cAAc,KACjD,OAAM,sBAAsB,yBAAyB,EACnD,KAAK,gCAAgC,EAAE,qBACxC,CAAC;EAGJ,MAAM,SAAS;AAGf,MAAI,CAAC,OAAO,OAAO,QAAQ,OAAO,CAChC,OAAM,sBAAsB,8BAA8B,EACxD,KAAK,gCAAgC,EAAE,6BACxC,CAAC;EAGJ,MAAM,OAAO,OAAO;AACpB,MAAI,SAAS,YAAY,SAAS,aAAa,SAAS,eAAe,SAAS,SAC9E,OAAM,sBAAsB,8BAA8B,EACxD,KAAK,gCAAgC,EAAE,qBAAqB,OAAO,KAAK,CAAC,4DAC1E,CAAC;AAIJ,MAAI,CAAC,OAAO,OAAO,QAAQ,WAAW,CACpC,OAAM,sBAAsB,kCAAkC,EAC5D,KAAK,gCAAgC,EAAE,UAAU,OAAO,KAAK,CAAC,kCAC/D,CAAC;EAGJ,MAAM,WAAW,OAAO;AACxB,MAAI,aAAa,iBACf,OAAM,sBAAsB,kCAAkC,EAC5D,KAAK,gCAAgC,EAAE,UAAU,OAAO,KAAK,CAAC,kBAAkB,OAAO,SAAS,CAAC,kBAAkB,iBAAiB,IACrI,CAAC;AAIJ,MAAI,CAAC,OAAO,OAAO,QAAQ,WAAW,CACpC,OAAM,sBAAsB,kCAAkC,EAC5D,KAAK,gCAAgC,EAAE,UAAU,OAAO,KAAK,CAAC,kCAC/D,CAAC;EAGJ,MAAM,WAAW,OAAO;AACxB,MAAI,aAAa,iBACf,OAAM,sBAAsB,kCAAkC,EAC5D,KAAK,gCAAgC,EAAE,UAAU,OAAO,KAAK,CAAC,kBAAkB,OAAO,SAAS,CAAC,kBAAkB,iBAAiB,IACrI,CAAC;;AAKN,QAAO"}
1
+ {"version":3,"file":"framework-components-gwAHl7ml.mjs","names":[],"sources":["../src/utils/framework-components.ts"],"sourcesContent":["import type { Contract } from '@prisma-next/contract/types';\nimport {\n checkContractComponentRequirements,\n type TargetBoundComponentDescriptor,\n} from '@prisma-next/framework-components/components';\nimport type { ControlStack } from '@prisma-next/framework-components/control';\nimport { errorConfigValidation, errorContractMissingExtensionPacks } from './cli-errors';\n\n/**\n * Asserts that all framework components are compatible with the expected family and target.\n *\n * This function validates that each component in the framework components array:\n * - Has kind 'target', 'adapter', 'extension', or 'driver'\n * - Has familyId matching expectedFamilyId\n * - Has targetId matching expectedTargetId\n *\n * This validation happens at the CLI composition boundary, before passing components\n * to typed planner/runner instances. It fills the gap between runtime validation\n * (via `validateConfig()`) and compile-time type enforcement.\n *\n * @param expectedFamilyId - The expected family ID (e.g., 'sql')\n * @param expectedTargetId - The expected target ID (e.g., 'postgres')\n * @param frameworkComponents - Array of framework components to validate\n * @returns The same array typed as TargetBoundComponentDescriptor\n * @throws CliStructuredError if any component is incompatible\n *\n * @example\n * ```ts\n * const config = await loadConfig();\n * const frameworkComponents = [config.target, config.adapter, ...(config.extensionPacks ?? [])];\n *\n * // Validate and type-narrow components before passing to planner\n * const typedComponents = assertFrameworkComponentsCompatible(\n * config.family.familyId,\n * config.target.targetId,\n * frameworkComponents\n * );\n *\n * const planner = target.migrations.createPlanner(familyInstance);\n * planner.plan({ contract, schema, policy, frameworkComponents: typedComponents });\n * ```\n */\nexport function assertFrameworkComponentsCompatible<\n TFamilyId extends string,\n TTargetId extends string,\n>(\n expectedFamilyId: TFamilyId,\n expectedTargetId: TTargetId,\n frameworkComponents: ReadonlyArray<unknown>,\n): ReadonlyArray<TargetBoundComponentDescriptor<TFamilyId, TTargetId>> {\n for (let i = 0; i < frameworkComponents.length; i++) {\n const component = frameworkComponents[i];\n\n // Check that component is an object\n if (typeof component !== 'object' || component === null) {\n throw errorConfigValidation('frameworkComponents[]', {\n why: `Framework component at index ${i} must be an object`,\n });\n }\n\n const record = component as Record<string, unknown>;\n\n // Check kind\n if (!Object.hasOwn(record, 'kind')) {\n throw errorConfigValidation('frameworkComponents[].kind', {\n why: `Framework component at index ${i} must have 'kind' property`,\n });\n }\n\n const kind = record['kind'];\n if (kind !== 'target' && kind !== 'adapter' && kind !== 'extension' && kind !== 'driver') {\n throw errorConfigValidation('frameworkComponents[].kind', {\n why: `Framework component at index ${i} has invalid kind '${String(kind)}' (must be 'target', 'adapter', 'extension', or 'driver')`,\n });\n }\n\n // Check familyId\n if (!Object.hasOwn(record, 'familyId')) {\n throw errorConfigValidation('frameworkComponents[].familyId', {\n why: `Framework component at index ${i} (kind: ${String(kind)}) must have 'familyId' property`,\n });\n }\n\n const familyId = record['familyId'];\n if (familyId !== expectedFamilyId) {\n throw errorConfigValidation('frameworkComponents[].familyId', {\n why: `Framework component at index ${i} (kind: ${String(kind)}) has familyId '${String(familyId)}' but expected '${expectedFamilyId}'`,\n });\n }\n\n // Check targetId\n if (!Object.hasOwn(record, 'targetId')) {\n throw errorConfigValidation('frameworkComponents[].targetId', {\n why: `Framework component at index ${i} (kind: ${String(kind)}) must have 'targetId' property`,\n });\n }\n\n const targetId = record['targetId'];\n if (targetId !== expectedTargetId) {\n throw errorConfigValidation('frameworkComponents[].targetId', {\n why: `Framework component at index ${i} (kind: ${String(kind)}) has targetId '${String(targetId)}' but expected '${expectedTargetId}'`,\n });\n }\n }\n\n // Type assertion is safe because we've validated all components above\n return frameworkComponents as ReadonlyArray<TargetBoundComponentDescriptor<TFamilyId, TTargetId>>;\n}\n\n/**\n * Validates that a contract is compatible with the configured target, adapter,\n * and extension packs. Throws on family/target mismatches or missing extension packs.\n *\n * This check ensures the emitted contract matches the CLI config before running\n * commands that depend on the contract (e.g., db verify, db sign).\n *\n * @param contract - The contract to validate (must include targetFamily, target, extensionPacks).\n * @param stack - The control plane stack (target, adapter, driver, extensionPacks).\n *\n * @throws {CliStructuredError} errorConfigValidation when contract.targetFamily or contract.target\n * doesn't match the configured family/target.\n * @throws {CliStructuredError} errorContractMissingExtensionPacks when the contract requires\n * extension packs that are not provided in the config (includes all missing packs in error.meta).\n *\n * @example\n * ```ts\n * import { assertContractRequirementsSatisfied } from './framework-components';\n *\n * const config = await loadConfig();\n * const contract = await loadContractJson(config.contract.output);\n * const stack = createControlStack({ family: config.family, target: config.target, adapter: config.adapter, ... });\n *\n * // Throws if contract is incompatible with config\n * assertContractRequirementsSatisfied({ contract, stack });\n * ```\n */\nexport function assertContractRequirementsSatisfied<\n TFamilyId extends string,\n TTargetId extends string,\n>({\n contract,\n stack,\n}: {\n readonly contract: Pick<Contract, 'targetFamily' | 'target' | 'extensionPacks'>;\n readonly stack: ControlStack<TFamilyId, TTargetId>;\n}): void {\n const providedComponentIds = new Set<string>([\n stack.target.id,\n ...(stack.adapter ? [stack.adapter.id] : []),\n ]);\n for (const extension of stack.extensionPacks) {\n providedComponentIds.add(extension.id);\n }\n\n const result = checkContractComponentRequirements({\n contract,\n expectedTargetFamily: stack.target.familyId,\n expectedTargetId: stack.target.targetId,\n providedComponentIds,\n });\n\n if (result.familyMismatch) {\n throw errorConfigValidation('contract.targetFamily', {\n why: `Contract was emitted for family '${result.familyMismatch.actual}' but CLI config is wired to '${result.familyMismatch.expected}'.`,\n });\n }\n\n if (result.targetMismatch) {\n throw errorConfigValidation('contract.target', {\n why: `Contract target '${result.targetMismatch.actual}' does not match CLI target '${result.targetMismatch.expected}'.`,\n });\n }\n\n if (result.missingExtensionPackIds.length > 0) {\n throw errorContractMissingExtensionPacks({\n missingExtensionPacks: result.missingExtensionPackIds,\n providedComponentIds: [...providedComponentIds],\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,SAAgB,oCAId,kBACA,kBACA,qBACqE;CACrE,KAAK,IAAI,IAAI,GAAG,IAAI,oBAAoB,QAAQ,KAAK;EACnD,MAAM,YAAY,oBAAoB;EAGtC,IAAI,OAAO,cAAc,YAAY,cAAc,MACjD,MAAM,sBAAsB,yBAAyB,EACnD,KAAK,gCAAgC,EAAE,qBACxC,CAAC;EAGJ,MAAM,SAAS;EAGf,IAAI,CAAC,OAAO,OAAO,QAAQ,OAAO,EAChC,MAAM,sBAAsB,8BAA8B,EACxD,KAAK,gCAAgC,EAAE,6BACxC,CAAC;EAGJ,MAAM,OAAO,OAAO;EACpB,IAAI,SAAS,YAAY,SAAS,aAAa,SAAS,eAAe,SAAS,UAC9E,MAAM,sBAAsB,8BAA8B,EACxD,KAAK,gCAAgC,EAAE,qBAAqB,OAAO,KAAK,CAAC,4DAC1E,CAAC;EAIJ,IAAI,CAAC,OAAO,OAAO,QAAQ,WAAW,EACpC,MAAM,sBAAsB,kCAAkC,EAC5D,KAAK,gCAAgC,EAAE,UAAU,OAAO,KAAK,CAAC,kCAC/D,CAAC;EAGJ,MAAM,WAAW,OAAO;EACxB,IAAI,aAAa,kBACf,MAAM,sBAAsB,kCAAkC,EAC5D,KAAK,gCAAgC,EAAE,UAAU,OAAO,KAAK,CAAC,kBAAkB,OAAO,SAAS,CAAC,kBAAkB,iBAAiB,IACrI,CAAC;EAIJ,IAAI,CAAC,OAAO,OAAO,QAAQ,WAAW,EACpC,MAAM,sBAAsB,kCAAkC,EAC5D,KAAK,gCAAgC,EAAE,UAAU,OAAO,KAAK,CAAC,kCAC/D,CAAC;EAGJ,MAAM,WAAW,OAAO;EACxB,IAAI,aAAa,kBACf,MAAM,sBAAsB,kCAAkC,EAC5D,KAAK,gCAAgC,EAAE,UAAU,OAAO,KAAK,CAAC,kBAAkB,OAAO,SAAS,CAAC,kBAAkB,iBAAiB,IACrI,CAAC;;CAKN,OAAO"}