@derwinjs/db 0.1.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/LICENSE +25 -0
- package/README.md +79 -0
- package/dist/agent-findings-ingestor.d.ts +40 -0
- package/dist/agent-findings-ingestor.d.ts.map +1 -0
- package/dist/agent-findings-ingestor.js +154 -0
- package/dist/agent-findings-ingestor.js.map +1 -0
- package/dist/classification-trust-store.d.ts +31 -0
- package/dist/classification-trust-store.d.ts.map +1 -0
- package/dist/classification-trust-store.js +154 -0
- package/dist/classification-trust-store.js.map +1 -0
- package/dist/coverage-gap-reporter.d.ts +35 -0
- package/dist/coverage-gap-reporter.d.ts.map +1 -0
- package/dist/coverage-gap-reporter.js +84 -0
- package/dist/coverage-gap-reporter.js.map +1 -0
- package/dist/fix-policy.d.ts +46 -0
- package/dist/fix-policy.d.ts.map +1 -0
- package/dist/fix-policy.js +162 -0
- package/dist/fix-policy.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/learning-health-reporter.d.ts +37 -0
- package/dist/learning-health-reporter.d.ts.map +1 -0
- package/dist/learning-health-reporter.js +141 -0
- package/dist/learning-health-reporter.js.map +1 -0
- package/dist/prisma.d.ts +31 -0
- package/dist/prisma.d.ts.map +1 -0
- package/dist/prisma.js +31 -0
- package/dist/prisma.js.map +1 -0
- package/dist/qa-fix-attempt-store.d.ts +28 -0
- package/dist/qa-fix-attempt-store.d.ts.map +1 -0
- package/dist/qa-fix-attempt-store.js +258 -0
- package/dist/qa-fix-attempt-store.js.map +1 -0
- package/dist/qa-pattern-store.d.ts +32 -0
- package/dist/qa-pattern-store.d.ts.map +1 -0
- package/dist/qa-pattern-store.js +123 -0
- package/dist/qa-pattern-store.js.map +1 -0
- package/dist/qa-revert-store.d.ts +24 -0
- package/dist/qa-revert-store.d.ts.map +1 -0
- package/dist/qa-revert-store.js +139 -0
- package/dist/qa-revert-store.js.map +1 -0
- package/dist/qa-run-store.d.ts +46 -0
- package/dist/qa-run-store.d.ts.map +1 -0
- package/dist/qa-run-store.js +201 -0
- package/dist/qa-run-store.js.map +1 -0
- package/dist/qa-ticket-store.d.ts +35 -0
- package/dist/qa-ticket-store.d.ts.map +1 -0
- package/dist/qa-ticket-store.js +293 -0
- package/dist/qa-ticket-store.js.map +1 -0
- package/dist/qa-uniformity-store.d.ts +41 -0
- package/dist/qa-uniformity-store.d.ts.map +1 -0
- package/dist/qa-uniformity-store.js +288 -0
- package/dist/qa-uniformity-store.js.map +1 -0
- package/dist/scripts/smoke-auto-fix.d.ts +37 -0
- package/dist/scripts/smoke-auto-fix.d.ts.map +1 -0
- package/dist/scripts/smoke-auto-fix.js +270 -0
- package/dist/scripts/smoke-auto-fix.js.map +1 -0
- package/dist/scripts/smoke-learning-loop.d.ts +21 -0
- package/dist/scripts/smoke-learning-loop.d.ts.map +1 -0
- package/dist/scripts/smoke-learning-loop.js +375 -0
- package/dist/scripts/smoke-learning-loop.js.map +1 -0
- package/dist/scripts/smoke-orchestration.d.ts +35 -0
- package/dist/scripts/smoke-orchestration.d.ts.map +1 -0
- package/dist/scripts/smoke-orchestration.js +215 -0
- package/dist/scripts/smoke-orchestration.js.map +1 -0
- package/dist/scripts/smoke-qa-ticket-store.d.ts +18 -0
- package/dist/scripts/smoke-qa-ticket-store.d.ts.map +1 -0
- package/dist/scripts/smoke-qa-ticket-store.js +233 -0
- package/dist/scripts/smoke-qa-ticket-store.js.map +1 -0
- package/package.json +69 -0
- package/prisma/migrations/20260501165631_init/migration.sql +407 -0
- package/prisma/migrations/20260503051425_0002_qap018b_qaticket_crosslink_fields/migration.sql +6 -0
- package/prisma/migrations/20260504231316_add_project_repofullname_and_webhooksecret/migration.sql +12 -0
- package/prisma/migrations/20260504232851_add_qaticket_resolvedby/migration.sql +2 -0
- package/prisma/migrations/20260505042646_add_qapattern_qarevert/migration.sql +77 -0
- package/prisma/migrations/20260505055826_add_qauniformity_and_agent_trigger/migration.sql +35 -0
- package/prisma/migrations/migration_lock.toml +3 -0
- package/prisma/schema.prisma +748 -0
- package/prisma/seed.ts +181 -0
- package/prisma-client/default.d.ts +1 -0
- package/prisma-client/default.js +1 -0
- package/prisma-client/edge.d.ts +1 -0
- package/prisma-client/edge.js +631 -0
- package/prisma-client/index-browser.js +615 -0
- package/prisma-client/index.d.ts +34509 -0
- package/prisma-client/index.js +660 -0
- package/prisma-client/libquery_engine-darwin-arm64.dylib.node +0 -0
- package/prisma-client/libquery_engine-linux-arm64-openssl-3.0.x.so.node +0 -0
- package/prisma-client/libquery_engine-rhel-openssl-3.0.x.so.node +0 -0
- package/prisma-client/package.json +97 -0
- package/prisma-client/runtime/edge-esm.js +31 -0
- package/prisma-client/runtime/edge.js +31 -0
- package/prisma-client/runtime/index-browser.d.ts +365 -0
- package/prisma-client/runtime/index-browser.js +13 -0
- package/prisma-client/runtime/library.d.ts +3403 -0
- package/prisma-client/runtime/library.js +143 -0
- package/prisma-client/runtime/react-native.js +80 -0
- package/prisma-client/runtime/wasm.js +32 -0
- package/prisma-client/schema.prisma +748 -0
- package/prisma-client/wasm.d.ts +1 -0
- package/prisma-client/wasm.js +615 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QAP-018B smoke — exercises the QATicketStore against the real local Postgres.
|
|
3
|
+
*
|
|
4
|
+
* Run: pnpm --filter @derwinjs/db smoke:qa-ticket-store
|
|
5
|
+
*
|
|
6
|
+
* Prereqs:
|
|
7
|
+
* - Local Postgres running on port 5433 (per Sprint 1 docker setup)
|
|
8
|
+
* - DATABASE_URL set in packages/db/.env
|
|
9
|
+
* - Migrations applied (migration 20260503051425_0002_qap018b_qaticket_crosslink_fields or later)
|
|
10
|
+
* - Seed run (Lifeline project exists)
|
|
11
|
+
*
|
|
12
|
+
* Self-cleaning: deletes its own test rows in a finally block whether the
|
|
13
|
+
* script succeeds or fails. Re-runs idempotently.
|
|
14
|
+
*
|
|
15
|
+
* Prints "QAP-018B READY ✓" on success. Exits 1 on any failure.
|
|
16
|
+
*/
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=smoke-qa-ticket-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smoke-qa-ticket-store.d.ts","sourceRoot":"","sources":["../../src/scripts/smoke-qa-ticket-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QAP-018B smoke — exercises the QATicketStore against the real local Postgres.
|
|
3
|
+
*
|
|
4
|
+
* Run: pnpm --filter @derwinjs/db smoke:qa-ticket-store
|
|
5
|
+
*
|
|
6
|
+
* Prereqs:
|
|
7
|
+
* - Local Postgres running on port 5433 (per Sprint 1 docker setup)
|
|
8
|
+
* - DATABASE_URL set in packages/db/.env
|
|
9
|
+
* - Migrations applied (migration 20260503051425_0002_qap018b_qaticket_crosslink_fields or later)
|
|
10
|
+
* - Seed run (Lifeline project exists)
|
|
11
|
+
*
|
|
12
|
+
* Self-cleaning: deletes its own test rows in a finally block whether the
|
|
13
|
+
* script succeeds or fails. Re-runs idempotently.
|
|
14
|
+
*
|
|
15
|
+
* Prints "QAP-018B READY ✓" on success. Exits 1 on any failure.
|
|
16
|
+
*/
|
|
17
|
+
import { PrismaClient } from '../prisma.js';
|
|
18
|
+
import { QATicketStoreError } from '@derwinjs/sdk';
|
|
19
|
+
import { createPrismaQATicketStore } from '../qa-ticket-store.js';
|
|
20
|
+
const SMOKE_MARKER = '[SMOKE-QAP-018B]';
|
|
21
|
+
const DASHBOARD_BASE_URL = 'http://localhost:3000';
|
|
22
|
+
const prisma = new PrismaClient();
|
|
23
|
+
const store = createPrismaQATicketStore({ prisma, dashboardBaseUrl: DASHBOARD_BASE_URL });
|
|
24
|
+
let createdRunId;
|
|
25
|
+
const createdTicketIds = [];
|
|
26
|
+
async function main() {
|
|
27
|
+
// ─── Setup: find Lifeline + create a synthetic QARun for FK ─────────
|
|
28
|
+
const lifeline = await prisma.project.findUnique({ where: { slug: 'lifeline' } });
|
|
29
|
+
if (!lifeline) {
|
|
30
|
+
throw new Error('Lifeline project not found. Run `pnpm db:seed` first.');
|
|
31
|
+
}
|
|
32
|
+
console.log(`✓ Found Lifeline (id=${lifeline.id})`);
|
|
33
|
+
const run = await prisma.qARun.create({
|
|
34
|
+
data: {
|
|
35
|
+
projectId: lifeline.id,
|
|
36
|
+
triggeredBy: SMOKE_MARKER,
|
|
37
|
+
triggerType: 'OPERATOR_ON_DEMAND',
|
|
38
|
+
scope: { specs: ['smoke/booking-confirm.spec.ts'], note: SMOKE_MARKER },
|
|
39
|
+
signalsRaised: 1,
|
|
40
|
+
ticketsCreated: 1,
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
createdRunId = run.id;
|
|
44
|
+
console.log(`✓ Created synthetic QARun (id=${run.id})`);
|
|
45
|
+
// ─── Step 1: createQATicket ─────────────────────────────────────────
|
|
46
|
+
const createInput = {
|
|
47
|
+
projectId: lifeline.id,
|
|
48
|
+
qaRunId: run.id,
|
|
49
|
+
title: `${SMOKE_MARKER} Booking confirmation modal closes too quickly on slow 3G`,
|
|
50
|
+
surface: 'UI_UX_INTEGRITY',
|
|
51
|
+
classification: 'TIMING',
|
|
52
|
+
severity: 'HIGH',
|
|
53
|
+
riskTier: 'HIGH',
|
|
54
|
+
reproSteps: [
|
|
55
|
+
{ step: 1, action: 'Throttle network to 3G-slow' },
|
|
56
|
+
{ step: 2, action: 'Submit booking form' },
|
|
57
|
+
{
|
|
58
|
+
step: 3,
|
|
59
|
+
action: 'Confirmation modal appears',
|
|
60
|
+
expected: 'modal stays open until user dismisses',
|
|
61
|
+
actual: 'modal auto-dismisses after 2.4s',
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
suspectedRootCause: 'Modal dismissTimeout fires before user can read confirmation reference number on slow networks',
|
|
65
|
+
blastRadius: {
|
|
66
|
+
affectedFiles: ['src/components/booking/ConfirmModal.tsx'],
|
|
67
|
+
affectedTests: ['tests/e2e/booking-confirm.spec.ts'],
|
|
68
|
+
affectedPages: ['/booking/confirm'],
|
|
69
|
+
estimatedRiskScore: 0.55,
|
|
70
|
+
},
|
|
71
|
+
proposedFixApproach: 'Increase dismissTimeout to 8000ms and add explicit "Stay open" button',
|
|
72
|
+
};
|
|
73
|
+
const created = await store.createQATicket(createInput);
|
|
74
|
+
createdTicketIds.push(created.ticket.id);
|
|
75
|
+
console.log(`✓ createQATicket → id=${created.ticket.id}`);
|
|
76
|
+
console.log(` dashboardUrl=${created.dashboardUrl}`);
|
|
77
|
+
if (!created.dashboardUrl.startsWith(DASHBOARD_BASE_URL)) {
|
|
78
|
+
throw new Error(`dashboardUrl prefix wrong: got ${created.dashboardUrl}`);
|
|
79
|
+
}
|
|
80
|
+
if (!created.dashboardUrl.endsWith(created.ticket.id)) {
|
|
81
|
+
throw new Error(`dashboardUrl should end with ticket id: got ${created.dashboardUrl}`);
|
|
82
|
+
}
|
|
83
|
+
if (created.ticket.dashboardUrl !== created.dashboardUrl) {
|
|
84
|
+
throw new Error('dashboardUrl on ticket row should match returned URL');
|
|
85
|
+
}
|
|
86
|
+
if (!Array.isArray(created.ticket.crossLinkRefs) || created.ticket.crossLinkRefs.length !== 0) {
|
|
87
|
+
throw new Error('crossLinkRefs should default to empty array on create');
|
|
88
|
+
}
|
|
89
|
+
if (created.ticket.status !== 'OPEN') {
|
|
90
|
+
throw new Error(`status should default to OPEN, got ${created.ticket.status}`);
|
|
91
|
+
}
|
|
92
|
+
console.log(' invariants verified (dashboardUrl shape, crossLinkRefs empty, status OPEN)');
|
|
93
|
+
// ─── Step 2: getQATicket (correct projectId) ────────────────────────
|
|
94
|
+
const fetched = await store.getQATicket({ id: created.ticket.id, projectId: lifeline.id });
|
|
95
|
+
if (!fetched) {
|
|
96
|
+
throw new Error(`getQATicket returned null for known ticket ${created.ticket.id}`);
|
|
97
|
+
}
|
|
98
|
+
if (fetched.id !== created.ticket.id) {
|
|
99
|
+
throw new Error('getQATicket returned wrong ticket');
|
|
100
|
+
}
|
|
101
|
+
console.log(`✓ getQATicket (correct projectId) → ticket returned`);
|
|
102
|
+
// ─── Step 3: getQATicket (wrong projectId, defense-in-depth) ────────
|
|
103
|
+
const wrongProjectFetch = await store.getQATicket({
|
|
104
|
+
id: created.ticket.id,
|
|
105
|
+
projectId: 'wrong-project-id-99999',
|
|
106
|
+
});
|
|
107
|
+
if (wrongProjectFetch !== null) {
|
|
108
|
+
throw new Error(`Tenant isolation broken: getQATicket with wrong projectId returned a ticket. This is a TENANT_LEAKAGE class regression.`);
|
|
109
|
+
}
|
|
110
|
+
console.log('✓ getQATicket (wrong projectId) → null (tenant isolation OK)');
|
|
111
|
+
// ─── Step 4: listQATickets (filtered to our smoke ticket) ───────────
|
|
112
|
+
const listed = await store.listQATickets({
|
|
113
|
+
projectId: lifeline.id,
|
|
114
|
+
classification: 'TIMING',
|
|
115
|
+
limit: 50,
|
|
116
|
+
});
|
|
117
|
+
const inList = listed.tickets.find((t) => t.id === created.ticket.id);
|
|
118
|
+
if (!inList) {
|
|
119
|
+
throw new Error('listQATickets did not return the freshly-created ticket');
|
|
120
|
+
}
|
|
121
|
+
console.log(`✓ listQATickets (TIMING) → ${String(listed.tickets.length)} ticket(s), includes ours`);
|
|
122
|
+
// ─── Step 5: listQATickets cross-tenant negative ────────────────────
|
|
123
|
+
const wrongProjectList = await store.listQATickets({
|
|
124
|
+
projectId: 'wrong-project-id-99999',
|
|
125
|
+
classification: 'TIMING',
|
|
126
|
+
});
|
|
127
|
+
if (wrongProjectList.tickets.some((t) => t.id === created.ticket.id)) {
|
|
128
|
+
throw new Error('Tenant isolation broken: listQATickets with wrong projectId surfaced a ticket from another tenant.');
|
|
129
|
+
}
|
|
130
|
+
console.log('✓ listQATickets (wrong projectId) → no leak');
|
|
131
|
+
// ─── Step 6: updateQATicket — append crossLinkRefs (simulates QAP-018) ──
|
|
132
|
+
const stubRef = {
|
|
133
|
+
system: 'github',
|
|
134
|
+
repo: 'RoryLYN/lifeline_app',
|
|
135
|
+
issueNumber: 99999, // synthetic for smoke; not a real issue
|
|
136
|
+
url: 'https://github.com/RoryLYN/lifeline_app/issues/99999',
|
|
137
|
+
state: 'open',
|
|
138
|
+
};
|
|
139
|
+
const afterStub = await store.updateQATicket({ id: created.ticket.id, projectId: lifeline.id }, { crossLinkRefs: [stubRef] });
|
|
140
|
+
if (afterStub.crossLinkRefs.length !== 1) {
|
|
141
|
+
throw new Error('crossLinkRefs not persisted on update');
|
|
142
|
+
}
|
|
143
|
+
if (afterStub.crossLinkRefs[0]?.url !== stubRef.url) {
|
|
144
|
+
throw new Error('crossLinkRef url mismatch after persistence');
|
|
145
|
+
}
|
|
146
|
+
console.log('✓ updateQATicket (append crossLinkRef) → persisted, ready for adapter');
|
|
147
|
+
// ─── Step 7: updateQATicket — finalBucket PASS triggers auto-close ──
|
|
148
|
+
const beforeClose = afterStub.closedAt;
|
|
149
|
+
if (beforeClose !== null) {
|
|
150
|
+
throw new Error('Ticket should not be closed yet');
|
|
151
|
+
}
|
|
152
|
+
const closed = await store.updateQATicket({ id: created.ticket.id, projectId: lifeline.id }, { finalBucket: 'PASS', bucketReason: 'smoke test PASS path' });
|
|
153
|
+
if (closed.finalBucket !== 'PASS') {
|
|
154
|
+
throw new Error(`finalBucket should be PASS, got ${String(closed.finalBucket)}`);
|
|
155
|
+
}
|
|
156
|
+
if (closed.closedAt === null) {
|
|
157
|
+
throw new Error('closedAt should auto-populate when finalBucket is set');
|
|
158
|
+
}
|
|
159
|
+
console.log(`✓ updateQATicket (finalBucket=PASS) → auto-closed at ${closed.closedAt.toISOString()}`);
|
|
160
|
+
// ─── Step 8: updateQATicket on wrong projectId ─────────────────────
|
|
161
|
+
let tenantGuardFired = false;
|
|
162
|
+
try {
|
|
163
|
+
await store.updateQATicket({ id: created.ticket.id, projectId: 'wrong-project-id-99999' }, { bucketReason: 'should never apply' });
|
|
164
|
+
}
|
|
165
|
+
catch (e) {
|
|
166
|
+
if (e instanceof QATicketStoreError && e.code === 'not_found') {
|
|
167
|
+
tenantGuardFired = true;
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
throw e;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (!tenantGuardFired) {
|
|
174
|
+
throw new Error('Tenant isolation broken: updateQATicket with wrong projectId did not throw not_found.');
|
|
175
|
+
}
|
|
176
|
+
console.log('✓ updateQATicket (wrong projectId) → not_found (tenant isolation OK)');
|
|
177
|
+
// ─── Step 9: listQATickets with finalBucket filter ─────────────────
|
|
178
|
+
const passList = await store.listQATickets({
|
|
179
|
+
projectId: lifeline.id,
|
|
180
|
+
finalBucket: 'PASS',
|
|
181
|
+
limit: 10,
|
|
182
|
+
});
|
|
183
|
+
if (!passList.tickets.some((t) => t.id === created.ticket.id)) {
|
|
184
|
+
throw new Error('listQATickets(finalBucket=PASS) should include our closed ticket');
|
|
185
|
+
}
|
|
186
|
+
console.log(`✓ listQATickets (finalBucket=PASS) → ${String(passList.tickets.length)} ticket(s)`);
|
|
187
|
+
// ─── Step 10: createQATicket validation negative ────────────────────
|
|
188
|
+
let validationFired = false;
|
|
189
|
+
try {
|
|
190
|
+
await store.createQATicket({
|
|
191
|
+
...createInput,
|
|
192
|
+
title: ' ', // empty title after trim
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
catch (e) {
|
|
196
|
+
if (e instanceof QATicketStoreError && e.code === 'invalid_input') {
|
|
197
|
+
validationFired = true;
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
throw e;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
if (!validationFired) {
|
|
204
|
+
throw new Error('Validation should reject empty title with invalid_input code');
|
|
205
|
+
}
|
|
206
|
+
console.log('✓ createQATicket (empty title) → invalid_input (validation OK)');
|
|
207
|
+
console.log('\nQAP-018B READY ✓');
|
|
208
|
+
}
|
|
209
|
+
async function cleanup() {
|
|
210
|
+
if (createdTicketIds.length > 0) {
|
|
211
|
+
await prisma.qATicket.deleteMany({
|
|
212
|
+
where: { id: { in: createdTicketIds } },
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
if (createdRunId) {
|
|
216
|
+
await prisma.qARun.delete({ where: { id: createdRunId } });
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
main()
|
|
220
|
+
.catch((err) => {
|
|
221
|
+
console.error('\n✗ Smoke failed:', err);
|
|
222
|
+
process.exitCode = 1;
|
|
223
|
+
})
|
|
224
|
+
.finally(async () => {
|
|
225
|
+
try {
|
|
226
|
+
await cleanup();
|
|
227
|
+
}
|
|
228
|
+
catch (cleanupErr) {
|
|
229
|
+
console.error(' (cleanup error, may need manual rows pruning):', cleanupErr);
|
|
230
|
+
}
|
|
231
|
+
await prisma.$disconnect();
|
|
232
|
+
});
|
|
233
|
+
//# sourceMappingURL=smoke-qa-ticket-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smoke-qa-ticket-store.js","sourceRoot":"","sources":["../../src/scripts/smoke-qa-ticket-store.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@derwinjs/db",
|
|
3
|
+
"version": "0.1.0",
|
|
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
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./client": {
|
|
15
|
+
"types": "./prisma-client/index.d.ts",
|
|
16
|
+
"import": "./prisma-client/index.js"
|
|
17
|
+
},
|
|
18
|
+
"./prisma/schema.prisma": "./prisma/schema.prisma"
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist",
|
|
22
|
+
"prisma",
|
|
23
|
+
"prisma-client"
|
|
24
|
+
],
|
|
25
|
+
"publishConfig": {
|
|
26
|
+
"registry": "https://registry.npmjs.org/",
|
|
27
|
+
"access": "public"
|
|
28
|
+
},
|
|
29
|
+
"repository": {
|
|
30
|
+
"type": "git",
|
|
31
|
+
"url": "https://github.com/RoryLYN/derwin.git",
|
|
32
|
+
"directory": "packages/db"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@prisma/client": "^5.22.0",
|
|
36
|
+
"@derwinjs/core": "0.1.0",
|
|
37
|
+
"@derwinjs/sdk": "0.1.0"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@vitest/coverage-v8": "^2.1.9",
|
|
41
|
+
"prisma": "^5.22.0",
|
|
42
|
+
"tsx": "^4.19.2",
|
|
43
|
+
"typescript": "^5.6.3",
|
|
44
|
+
"vitest": "^2.1.9",
|
|
45
|
+
"vitest-mock-extended": "^2.0.2",
|
|
46
|
+
"@derwinjs/adapters": "0.0.0"
|
|
47
|
+
},
|
|
48
|
+
"prisma": {
|
|
49
|
+
"schema": "prisma/schema.prisma",
|
|
50
|
+
"seed": "tsx prisma/seed.ts"
|
|
51
|
+
},
|
|
52
|
+
"scripts": {
|
|
53
|
+
"build": "tsc -b",
|
|
54
|
+
"test": "vitest run",
|
|
55
|
+
"test:watch": "vitest",
|
|
56
|
+
"test:coverage": "vitest run --coverage",
|
|
57
|
+
"lint": "eslint src tests --max-warnings 0",
|
|
58
|
+
"typecheck": "tsc -b --noEmit",
|
|
59
|
+
"clean": "rm -rf dist .tsbuildinfo",
|
|
60
|
+
"prisma:generate": "prisma generate",
|
|
61
|
+
"prisma:migrate": "prisma migrate dev",
|
|
62
|
+
"prisma:studio": "prisma studio",
|
|
63
|
+
"db:seed": "prisma db seed",
|
|
64
|
+
"smoke:qa-ticket-store": "tsx src/scripts/smoke-qa-ticket-store.ts",
|
|
65
|
+
"smoke:auto-fix": "tsx src/scripts/smoke-auto-fix.ts",
|
|
66
|
+
"smoke:learning-loop": "tsx src/scripts/smoke-learning-loop.ts",
|
|
67
|
+
"smoke:orchestration": "tsx src/scripts/smoke-orchestration.ts"
|
|
68
|
+
}
|
|
69
|
+
}
|