@derwinjs/db 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,48 @@
1
+ /**
2
+ * createPrismaCostRegressionEvaluator — Sprint 12 Phase 4 (QAP-135).
3
+ *
4
+ * PR-time gate that compares a proposed fix-attempt's projected cost against
5
+ * the historical median for similar fixes scoped by
6
+ * (projectId, classification, surface) within a trailing window. Composes with
7
+ * the pure helper from @derwinjs/core to compute the verdict.
8
+ *
9
+ * # No new migration
10
+ *
11
+ * Reads the existing `QAFixAttempt.costCents` field (Int?, INTEGER cents —
12
+ * legacy schema, same column BudgetGate aggregates over since Sprint 8
13
+ * Phase 3 / QAP-084). The factory divides by 100 to surface USD floats so
14
+ * the SDK contract surface stays in dollars; no schema migration is needed
15
+ * for QAP-135.
16
+ *
17
+ * # Cohort scoping
18
+ *
19
+ * The QAFixAttempt rows do NOT carry classification or surface directly —
20
+ * those live on the joined QATicket model. Cohort filter is therefore
21
+ * expressed as `where.ticket: { classification, surface }` (the relation
22
+ * field on QAFixAttempt is `ticket`, joined via `qaTicketId`).
23
+ *
24
+ * # Window field
25
+ *
26
+ * QAFixAttempt has `attemptedAt` (not `createdAt`); the trailing-window
27
+ * filter uses that column.
28
+ *
29
+ * # Tenant isolation
30
+ *
31
+ * Every read scopes by `projectId`. Cross-tenant probes naturally surface
32
+ * as `no_baseline_yet` (the cohort findMany returns no rows for the wrong
33
+ * tenant), which is indistinguishable from a real cohort with insufficient
34
+ * samples — Pattern D defense-in-depth.
35
+ */
36
+ import type { PrismaClient } from './prisma.js';
37
+ import { type CostRegressionEvaluator } from '@derwinjs/sdk';
38
+ export interface PrismaCostRegressionEvaluatorConfig {
39
+ /** Generated Prisma client. Pass an instance per process. */
40
+ prisma: PrismaClient;
41
+ /**
42
+ * Optional clock injection for deterministic window-boundary tests. Tests
43
+ * pass a fixed Date; production callers omit (defaults to `new Date()`).
44
+ */
45
+ now?: () => Date;
46
+ }
47
+ export declare function createPrismaCostRegressionEvaluator(config: PrismaCostRegressionEvaluatorConfig): CostRegressionEvaluator;
48
+ //# sourceMappingURL=cost-regression-evaluator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-regression-evaluator.d.ts","sourceRoot":"","sources":["../src/cost-regression-evaluator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAEL,KAAK,uBAAuB,EAG7B,MAAM,eAAe,CAAC;AAKvB,MAAM,WAAW,mCAAmC;IAClD,6DAA6D;IAC7D,MAAM,EAAE,YAAY,CAAC;IACrB;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AA6DD,wBAAgB,mCAAmC,CACjD,MAAM,EAAE,mCAAmC,GAC1C,uBAAuB,CAkDzB"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * createPrismaCostRegressionEvaluator — Sprint 12 Phase 4 (QAP-135).
3
+ *
4
+ * PR-time gate that compares a proposed fix-attempt's projected cost against
5
+ * the historical median for similar fixes scoped by
6
+ * (projectId, classification, surface) within a trailing window. Composes with
7
+ * the pure helper from @derwinjs/core to compute the verdict.
8
+ *
9
+ * # No new migration
10
+ *
11
+ * Reads the existing `QAFixAttempt.costCents` field (Int?, INTEGER cents —
12
+ * legacy schema, same column BudgetGate aggregates over since Sprint 8
13
+ * Phase 3 / QAP-084). The factory divides by 100 to surface USD floats so
14
+ * the SDK contract surface stays in dollars; no schema migration is needed
15
+ * for QAP-135.
16
+ *
17
+ * # Cohort scoping
18
+ *
19
+ * The QAFixAttempt rows do NOT carry classification or surface directly —
20
+ * those live on the joined QATicket model. Cohort filter is therefore
21
+ * expressed as `where.ticket: { classification, surface }` (the relation
22
+ * field on QAFixAttempt is `ticket`, joined via `qaTicketId`).
23
+ *
24
+ * # Window field
25
+ *
26
+ * QAFixAttempt has `attemptedAt` (not `createdAt`); the trailing-window
27
+ * filter uses that column.
28
+ *
29
+ * # Tenant isolation
30
+ *
31
+ * Every read scopes by `projectId`. Cross-tenant probes naturally surface
32
+ * as `no_baseline_yet` (the cohort findMany returns no rows for the wrong
33
+ * tenant), which is indistinguishable from a real cohort with insufficient
34
+ * samples — Pattern D defense-in-depth.
35
+ */
36
+ import { CostRegressionEvaluatorError, } from '@derwinjs/sdk';
37
+ import { DEFAULT_WINDOW_MS, evaluateCostRegression } from '@derwinjs/core';
38
+ // ─── Validation ──────────────────────────────────────────────────────────
39
+ function validateInput(input) {
40
+ if (typeof input.projectId !== 'string' || input.projectId.length === 0) {
41
+ throw new CostRegressionEvaluatorError('invalid_input', 'CostRegressionEvaluator: projectId is required');
42
+ }
43
+ if (typeof input.classification !== 'string' || input.classification.length === 0) {
44
+ throw new CostRegressionEvaluatorError('invalid_input', 'CostRegressionEvaluator: classification is required');
45
+ }
46
+ if (typeof input.surface !== 'string' || input.surface.length === 0) {
47
+ throw new CostRegressionEvaluatorError('invalid_input', 'CostRegressionEvaluator: surface is required');
48
+ }
49
+ if (typeof input.attemptedFixCostUsd !== 'number' ||
50
+ !Number.isFinite(input.attemptedFixCostUsd) ||
51
+ input.attemptedFixCostUsd < 0) {
52
+ throw new CostRegressionEvaluatorError('invalid_input', 'CostRegressionEvaluator: attemptedFixCostUsd must be a non-negative finite number');
53
+ }
54
+ if (input.thresholdMultiplier !== undefined) {
55
+ if (!Number.isFinite(input.thresholdMultiplier) || input.thresholdMultiplier <= 0) {
56
+ throw new CostRegressionEvaluatorError('invalid_input', 'CostRegressionEvaluator: thresholdMultiplier must be a positive finite number');
57
+ }
58
+ }
59
+ if (input.minSamples !== undefined) {
60
+ if (!Number.isInteger(input.minSamples) || input.minSamples < 1) {
61
+ throw new CostRegressionEvaluatorError('invalid_input', 'CostRegressionEvaluator: minSamples must be a positive integer');
62
+ }
63
+ }
64
+ if (input.windowMs !== undefined) {
65
+ if (!Number.isFinite(input.windowMs) || input.windowMs <= 0) {
66
+ throw new CostRegressionEvaluatorError('invalid_input', 'CostRegressionEvaluator: windowMs must be a positive finite number');
67
+ }
68
+ }
69
+ }
70
+ // ─── Factory ─────────────────────────────────────────────────────────────
71
+ export function createPrismaCostRegressionEvaluator(config) {
72
+ const { prisma } = config;
73
+ const now = config.now ?? (() => new Date());
74
+ return {
75
+ async evaluate(input) {
76
+ validateInput(input);
77
+ const windowMs = input.windowMs ?? DEFAULT_WINDOW_MS;
78
+ const since = new Date(now().getTime() - windowMs);
79
+ let attempts;
80
+ try {
81
+ attempts = await prisma.qAFixAttempt.findMany({
82
+ where: {
83
+ projectId: input.projectId,
84
+ attemptedAt: { gte: since },
85
+ costCents: { not: null },
86
+ ticket: {
87
+ classification: input.classification,
88
+ // SurfaceCategory enum — SDK input mirrors QATicket.surface, so
89
+ // Prisma accepts it directly without a cast.
90
+ surface: input.surface,
91
+ },
92
+ },
93
+ select: { costCents: true },
94
+ });
95
+ }
96
+ catch (err) {
97
+ const message = err instanceof Error ? err.message : String(err);
98
+ throw new CostRegressionEvaluatorError('storage_failed', `cost-regression query failed: ${message}`, err);
99
+ }
100
+ // QAFixAttempt.costCents is INT cents (legacy schema, preserved for
101
+ // back-compat with the audit trail). Divide by 100 to surface USD
102
+ // floats so the contract surface stays in dollars. Same conversion
103
+ // BudgetGate applies (see packages/db/src/budget-gate.ts).
104
+ const costsUsd = [];
105
+ for (const a of attempts) {
106
+ if (typeof a.costCents === 'number') {
107
+ costsUsd.push(a.costCents / 100);
108
+ }
109
+ }
110
+ return evaluateCostRegression(input, costsUsd);
111
+ },
112
+ };
113
+ }
114
+ //# sourceMappingURL=cost-regression-evaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-regression-evaluator.js","sourceRoot":"","sources":["../src/cost-regression-evaluator.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -38,5 +38,6 @@ export { createPrismaContractBaselineStore, type PrismaContractBaselineStoreConf
38
38
  export { createPrismaTenantFuzzConfigStore, type PrismaTenantFuzzConfigStoreConfig, } from './tenant-fuzz-config-store.js';
39
39
  export { createPrismaRumSampleStore, RumSampleStoreError, type PrismaRumSampleStoreConfig, } from './rum-sample-store.js';
40
40
  export { createPrismaMilestoneEventStore, type PrismaMilestoneEventStoreConfig, } from './milestone-event-store.js';
41
+ export { createPrismaCostRegressionEvaluator, type PrismaCostRegressionEvaluatorConfig, } from './cost-regression-evaluator.js';
41
42
  export * from './prisma.js';
42
43
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,eAAO,MAAM,YAAY,EAAG,cAAuB,CAAC;AAIpD,OAAO,EAAE,yBAAyB,EAAE,KAAK,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjG,OAAO,EACL,6BAA6B,EAC7B,KAAK,6BAA6B,GACnC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,sBAAsB,EAAE,KAAK,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAE,0BAA0B,EAAE,KAAK,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACpG,OAAO,EAAE,yBAAyB,EAAE,KAAK,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjG,OAAO,EACL,6BAA6B,EAC7B,KAAK,6BAA6B,GACnC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,iCAAiC,EACjC,KAAK,iCAAiC,GACvC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,kCAAkC,EAClC,KAAK,kCAAkC,GACxC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,+BAA+B,EAC/B,KAAK,+BAA+B,GACrC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,8BAA8B,EAC9B,KAAK,8BAA8B,GACpC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,yBAAyB,EAAE,KAAK,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChG,OAAO,EACL,4BAA4B,EAC5B,SAAS,EACT,KAAK,4BAA4B,GAClC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,uCAAuC,EACvC,KAAK,uCAAuC,GAC7C,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,qCAAqC,EACrC,KAAK,qCAAqC,GAC3C,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,iCAAiC,EACjC,SAAS,EACT,cAAc,EACd,KAAK,iCAAiC,GACvC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,sBAAsB,EAAE,KAAK,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AACvF,OAAO,EACL,+BAA+B,EAC/B,8BAA8B,EAC9B,KAAK,+BAA+B,GACrC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,4BAA4B,EAC5B,KAAK,4BAA4B,GAClC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,kCAAkC,EAClC,4BAA4B,EAC5B,KAAK,kCAAkC,GACxC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,+BAA+B,EAC/B,KAAK,+BAA+B,GACrC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,iCAAiC,EACjC,KAAK,iCAAiC,GACvC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,iCAAiC,EACjC,KAAK,iCAAiC,GACvC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,KAAK,0BAA0B,GAChC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,+BAA+B,EAC/B,KAAK,+BAA+B,GACrC,MAAM,4BAA4B,CAAC;AA4BpC,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,eAAO,MAAM,YAAY,EAAG,cAAuB,CAAC;AAIpD,OAAO,EAAE,yBAAyB,EAAE,KAAK,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjG,OAAO,EACL,6BAA6B,EAC7B,KAAK,6BAA6B,GACnC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,sBAAsB,EAAE,KAAK,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAE,0BAA0B,EAAE,KAAK,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACpG,OAAO,EAAE,yBAAyB,EAAE,KAAK,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjG,OAAO,EACL,6BAA6B,EAC7B,KAAK,6BAA6B,GACnC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,iCAAiC,EACjC,KAAK,iCAAiC,GACvC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,kCAAkC,EAClC,KAAK,kCAAkC,GACxC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,+BAA+B,EAC/B,KAAK,+BAA+B,GACrC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,8BAA8B,EAC9B,KAAK,8BAA8B,GACpC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,yBAAyB,EAAE,KAAK,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChG,OAAO,EACL,4BAA4B,EAC5B,SAAS,EACT,KAAK,4BAA4B,GAClC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,uCAAuC,EACvC,KAAK,uCAAuC,GAC7C,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,qCAAqC,EACrC,KAAK,qCAAqC,GAC3C,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,iCAAiC,EACjC,SAAS,EACT,cAAc,EACd,KAAK,iCAAiC,GACvC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,sBAAsB,EAAE,KAAK,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AACvF,OAAO,EACL,+BAA+B,EAC/B,8BAA8B,EAC9B,KAAK,+BAA+B,GACrC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,4BAA4B,EAC5B,KAAK,4BAA4B,GAClC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,kCAAkC,EAClC,4BAA4B,EAC5B,KAAK,kCAAkC,GACxC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,+BAA+B,EAC/B,KAAK,+BAA+B,GACrC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,iCAAiC,EACjC,KAAK,iCAAiC,GACvC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,iCAAiC,EACjC,KAAK,iCAAiC,GACvC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,KAAK,0BAA0B,GAChC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,+BAA+B,EAC/B,KAAK,+BAA+B,GACrC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,mCAAmC,EACnC,KAAK,mCAAmC,GACzC,MAAM,gCAAgC,CAAC;AA4BxC,cAAc,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -39,6 +39,7 @@ export { createPrismaContractBaselineStore, } from './contract-baseline-store.js
39
39
  export { createPrismaTenantFuzzConfigStore, } from './tenant-fuzz-config-store.js';
40
40
  export { createPrismaRumSampleStore, RumSampleStoreError, } from './rum-sample-store.js';
41
41
  export { createPrismaMilestoneEventStore, } from './milestone-event-store.js';
42
+ export { createPrismaCostRegressionEvaluator, } from './cost-regression-evaluator.js';
42
43
  // ─── Prisma client re-export ─────────────────────────────────────────────
43
44
  //
44
45
  // @derwinjs/db ships its OWN generated Prisma client (output: prisma-client/
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,cAAuB,CAAC;AAEpD,4EAA4E;AAE5E,OAAO,EAAE,yBAAyB,EAAkC,MAAM,sBAAsB,CAAC;AACjG,OAAO,EACL,6BAA6B,GAE9B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,sBAAsB,EAA+B,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAE,0BAA0B,EAAmC,MAAM,uBAAuB,CAAC;AACpG,OAAO,EAAE,yBAAyB,EAAkC,MAAM,sBAAsB,CAAC;AACjG,OAAO,EACL,6BAA6B,GAE9B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,iCAAiC,GAElC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,kCAAkC,GAEnC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,+BAA+B,GAEhC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,8BAA8B,GAE/B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,yBAAyB,EAAkC,MAAM,qBAAqB,CAAC;AAChG,OAAO,EACL,4BAA4B,EAC5B,SAAS,GAEV,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,uCAAuC,GAExC,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,qCAAqC,GAEtC,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,iCAAiC,EACjC,SAAS,EACT,cAAc,GAEf,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,sBAAsB,EAA+B,MAAM,kBAAkB,CAAC;AACvF,OAAO,EACL,+BAA+B,EAC/B,8BAA8B,GAE/B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,4BAA4B,GAE7B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,kCAAkC,EAClC,4BAA4B,GAE7B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,+BAA+B,GAEhC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,iCAAiC,GAElC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,iCAAiC,GAElC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,GAEpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,+BAA+B,GAEhC,MAAM,4BAA4B,CAAC;AAEpC,4EAA4E;AAC5E,EAAE;AACF,6EAA6E;AAC7E,wEAAwE;AACxE,sEAAsE;AACtE,wEAAwE;AACxE,wEAAwE;AACxE,gDAAgD;AAChD,EAAE;AACF,+DAA+D;AAC/D,0EAA0E;AAC1E,yCAAyC;AACzC,+EAA+E;AAC/E,yCAAyC;AACzC,uEAAuE;AACvE,sEAAsE;AACtE,kEAAkE;AAClE,+BAA+B;AAC/B,EAAE;AACF,oBAAoB;AACpB,8DAA8D;AAC9D,4CAA4C;AAC5C,qEAAqE;AACrE,QAAQ;AACR,gDAAgD;AAEhD,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,cAAuB,CAAC;AAEpD,4EAA4E;AAE5E,OAAO,EAAE,yBAAyB,EAAkC,MAAM,sBAAsB,CAAC;AACjG,OAAO,EACL,6BAA6B,GAE9B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,sBAAsB,EAA+B,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAE,0BAA0B,EAAmC,MAAM,uBAAuB,CAAC;AACpG,OAAO,EAAE,yBAAyB,EAAkC,MAAM,sBAAsB,CAAC;AACjG,OAAO,EACL,6BAA6B,GAE9B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,iCAAiC,GAElC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,kCAAkC,GAEnC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,+BAA+B,GAEhC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,8BAA8B,GAE/B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,yBAAyB,EAAkC,MAAM,qBAAqB,CAAC;AAChG,OAAO,EACL,4BAA4B,EAC5B,SAAS,GAEV,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,uCAAuC,GAExC,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,qCAAqC,GAEtC,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,iCAAiC,EACjC,SAAS,EACT,cAAc,GAEf,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,sBAAsB,EAA+B,MAAM,kBAAkB,CAAC;AACvF,OAAO,EACL,+BAA+B,EAC/B,8BAA8B,GAE/B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,4BAA4B,GAE7B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,kCAAkC,EAClC,4BAA4B,GAE7B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,+BAA+B,GAEhC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,iCAAiC,GAElC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,iCAAiC,GAElC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,GAEpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,+BAA+B,GAEhC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,mCAAmC,GAEpC,MAAM,gCAAgC,CAAC;AAExC,4EAA4E;AAC5E,EAAE;AACF,6EAA6E;AAC7E,wEAAwE;AACxE,sEAAsE;AACtE,wEAAwE;AACxE,wEAAwE;AACxE,gDAAgD;AAChD,EAAE;AACF,+DAA+D;AAC/D,0EAA0E;AAC1E,yCAAyC;AACzC,+EAA+E;AAC/E,yCAAyC;AACzC,uEAAuE;AACvE,sEAAsE;AACtE,kEAAkE;AAClE,+BAA+B;AAC/B,EAAE;AACF,oBAAoB;AACpB,8DAA8D;AAC9D,4CAA4C;AAC5C,qEAAqE;AACrE,QAAQ;AACR,gDAAgD;AAEhD,cAAc,aAAa,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@derwinjs/db",
3
- "version": "0.11.0",
3
+ "version": "0.12.0",
4
4
  "description": "Prisma schema + migrations for Derwin's own Postgres. 14 models, project-namespaced. Per ADR-0005. Ships its own generated Prisma client (multi-platform binaries) for cross-consumer compatibility.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "type": "module",
@@ -33,8 +33,8 @@
33
33
  },
34
34
  "dependencies": {
35
35
  "@prisma/client": "^5.22.0",
36
- "@derwinjs/core": "0.11.0",
37
- "@derwinjs/sdk": "0.11.0"
36
+ "@derwinjs/core": "0.12.0",
37
+ "@derwinjs/sdk": "0.12.0"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@vitest/coverage-v8": "^2.1.9",