@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.
- package/dist/cost-regression-evaluator.d.ts +48 -0
- package/dist/cost-regression-evaluator.d.ts.map +1 -0
- package/dist/cost-regression-evaluator.js +114 -0
- package/dist/cost-regression-evaluator.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
|
@@ -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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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;
|
|
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.
|
|
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.
|
|
37
|
-
"@derwinjs/sdk": "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",
|