intellitester 0.3.5 → 0.4.1
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/{chunk-O4H5QO5P.js → chunk-4P2XW7LQ.js} +18 -3
- package/dist/chunk-4P2XW7LQ.js.map +1 -0
- package/dist/{chunk-LIVAF432.js → chunk-7ALNM3DK.js} +8 -6
- package/dist/chunk-7ALNM3DK.js.map +1 -0
- package/dist/chunk-7JUP6HRD.cjs +38 -0
- package/dist/chunk-7JUP6HRD.cjs.map +1 -0
- package/dist/{chunk-YNHXOSMZ.cjs → chunk-7KTXX6EF.cjs} +37 -17
- package/dist/chunk-7KTXX6EF.cjs.map +1 -0
- package/dist/{chunk-SAVY6D3X.js → chunk-AZEUOP6U.js} +5 -2
- package/dist/chunk-AZEUOP6U.js.map +1 -0
- package/dist/{chunk-UUJXCHVT.cjs → chunk-DISSZD7X.cjs} +5 -2
- package/dist/chunk-DISSZD7X.cjs.map +1 -0
- package/dist/chunk-E7I5EAST.cjs +27 -0
- package/dist/chunk-E7I5EAST.cjs.map +1 -0
- package/dist/{chunk-CN6HSJJX.js → chunk-EEJIIJEG.js} +5 -2
- package/dist/chunk-EEJIIJEG.js.map +1 -0
- package/dist/{chunk-6PYKWWH5.js → chunk-EHRUD6JS.js} +6 -3
- package/dist/chunk-EHRUD6JS.js.map +1 -0
- package/dist/{chunk-IY5L57RE.cjs → chunk-ILXQMJBC.cjs} +13 -2
- package/dist/chunk-ILXQMJBC.cjs.map +1 -0
- package/dist/{chunk-2ZSINOCK.cjs → chunk-JN4VROOX.cjs} +21 -6
- package/dist/chunk-JN4VROOX.cjs.map +1 -0
- package/dist/{chunk-PAKODOH4.cjs → chunk-MVFZZF3J.cjs} +6 -3
- package/dist/chunk-MVFZZF3J.cjs.map +1 -0
- package/dist/{chunk-CSNHZKHS.cjs → chunk-O4WJRWEJ.cjs} +125 -29
- package/dist/chunk-O4WJRWEJ.cjs.map +1 -0
- package/dist/{chunk-35WJGNDA.cjs → chunk-QBEAPUBU.cjs} +5 -2
- package/dist/chunk-QBEAPUBU.cjs.map +1 -0
- package/dist/{chunk-B3ZQ425T.cjs → chunk-QHHY44MH.cjs} +4 -2
- package/dist/chunk-QHHY44MH.cjs.map +1 -0
- package/dist/{chunk-DJQQRM3C.js → chunk-STAIJ25F.js} +13 -2
- package/dist/chunk-STAIJ25F.js.map +1 -0
- package/dist/chunk-TM6IHTOK.js +27 -0
- package/dist/chunk-TM6IHTOK.js.map +1 -0
- package/dist/{chunk-IYAZADFI.js → chunk-U6VBIOZG.js} +109 -13
- package/dist/chunk-U6VBIOZG.js.map +1 -0
- package/dist/{chunk-2BFRS6ZZ.js → chunk-XINWSJFM.js} +37 -17
- package/dist/chunk-XINWSJFM.js.map +1 -0
- package/dist/{chunk-ZUOYPCED.js → chunk-XRDD26DA.js} +4 -2
- package/dist/chunk-XRDD26DA.js.map +1 -0
- package/dist/cli/index.cjs +321 -222
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +284 -185
- package/dist/cli/index.js.map +1 -1
- package/dist/core/cleanup/index.cjs +15 -14
- package/dist/core/cleanup/index.js +7 -6
- package/dist/index.cjs +47 -42
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +35 -5
- package/dist/index.d.ts +35 -5
- package/dist/index.js +16 -9
- package/dist/index.js.map +1 -1
- package/dist/integration/index.cjs +3 -2
- package/dist/integration/index.js +2 -1
- package/dist/lib-KZ7G5BWI.cjs +781 -0
- package/dist/lib-KZ7G5BWI.cjs.map +1 -0
- package/dist/lib-NRYY4REB.js +779 -0
- package/dist/lib-NRYY4REB.js.map +1 -0
- package/dist/{loader-UH2VRIAW.cjs → loader-CPY57XXK.cjs} +17 -16
- package/dist/{loader-UH2VRIAW.cjs.map → loader-CPY57XXK.cjs.map} +1 -1
- package/dist/{loader-SZMOBGPT.js → loader-WEAOF3CH.js} +4 -3
- package/dist/{loader-SZMOBGPT.js.map → loader-WEAOF3CH.js.map} +1 -1
- package/dist/providers/appwrite/index.cjs +4 -3
- package/dist/providers/appwrite/index.js +2 -1
- package/dist/providers/index.cjs +18 -17
- package/dist/providers/index.js +6 -5
- package/dist/providers/mysql/index.cjs +4 -3
- package/dist/providers/mysql/index.js +2 -1
- package/dist/providers/postgres/index.cjs +4 -3
- package/dist/providers/postgres/index.js +2 -1
- package/dist/providers/sqlite/index.cjs +4 -3
- package/dist/providers/sqlite/index.js +2 -1
- package/package.json +3 -1
- package/dist/chunk-2BFRS6ZZ.js.map +0 -1
- package/dist/chunk-2IRHLFCW.cjs +0 -36
- package/dist/chunk-2IRHLFCW.cjs.map +0 -1
- package/dist/chunk-2ZSINOCK.cjs.map +0 -1
- package/dist/chunk-35WJGNDA.cjs.map +0 -1
- package/dist/chunk-6PYKWWH5.js.map +0 -1
- package/dist/chunk-B3ZQ425T.cjs.map +0 -1
- package/dist/chunk-CN6HSJJX.js.map +0 -1
- package/dist/chunk-CSNHZKHS.cjs.map +0 -1
- package/dist/chunk-DJQQRM3C.js.map +0 -1
- package/dist/chunk-IY5L57RE.cjs.map +0 -1
- package/dist/chunk-IYAZADFI.js.map +0 -1
- package/dist/chunk-LIVAF432.js.map +0 -1
- package/dist/chunk-O4H5QO5P.js.map +0 -1
- package/dist/chunk-PAKODOH4.cjs.map +0 -1
- package/dist/chunk-SAVY6D3X.js.map +0 -1
- package/dist/chunk-UUJXCHVT.cjs.map +0 -1
- package/dist/chunk-YNHXOSMZ.cjs.map +0 -1
- package/dist/chunk-ZUOYPCED.js.map +0 -1
|
@@ -1,9 +1,21 @@
|
|
|
1
|
-
import { providerFactories, getDefaultTypeMappings } from './chunk-
|
|
1
|
+
import { providerFactories, getDefaultTypeMappings } from './chunk-7ALNM3DK.js';
|
|
2
|
+
import { init_esm_shims } from './chunk-TM6IHTOK.js';
|
|
2
3
|
import { glob } from 'glob';
|
|
3
4
|
import path from 'path';
|
|
4
5
|
import fs from 'fs';
|
|
5
6
|
import fs2 from 'fs/promises';
|
|
6
7
|
|
|
8
|
+
// src/core/cleanup/index.ts
|
|
9
|
+
init_esm_shims();
|
|
10
|
+
|
|
11
|
+
// src/core/cleanup/types.ts
|
|
12
|
+
init_esm_shims();
|
|
13
|
+
|
|
14
|
+
// src/core/cleanup/executor.ts
|
|
15
|
+
init_esm_shims();
|
|
16
|
+
|
|
17
|
+
// src/core/cleanup/loader.ts
|
|
18
|
+
init_esm_shims();
|
|
7
19
|
async function loadCleanupHandlers(config, cwd = process.cwd()) {
|
|
8
20
|
const handlers = /* @__PURE__ */ new Map();
|
|
9
21
|
let typeMappings = {};
|
|
@@ -108,6 +120,9 @@ function resolveHandler(handlers, typeMappings, resourceType) {
|
|
|
108
120
|
}
|
|
109
121
|
return null;
|
|
110
122
|
}
|
|
123
|
+
|
|
124
|
+
// src/core/cleanup/persistence.ts
|
|
125
|
+
init_esm_shims();
|
|
111
126
|
var CLEANUP_DIR = ".intellitester/cleanup/failed";
|
|
112
127
|
async function saveFailedCleanup(cleanup, cwd = process.cwd()) {
|
|
113
128
|
const dir = path.join(cwd, CLEANUP_DIR);
|
|
@@ -286,5 +301,5 @@ function defineCleanupHandlers(handlers) {
|
|
|
286
301
|
}
|
|
287
302
|
|
|
288
303
|
export { createCleanupExecutor, defineCleanupHandlers, executeCleanup, loadCleanupHandlers, loadFailedCleanups, removeFailedCleanup, resolveHandler, saveFailedCleanup };
|
|
289
|
-
//# sourceMappingURL=chunk-
|
|
290
|
-
//# sourceMappingURL=chunk-
|
|
304
|
+
//# sourceMappingURL=chunk-4P2XW7LQ.js.map
|
|
305
|
+
//# sourceMappingURL=chunk-4P2XW7LQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/cleanup/index.ts","../src/core/cleanup/types.ts","../src/core/cleanup/executor.ts","../src/core/cleanup/loader.ts","../src/core/cleanup/persistence.ts"],"names":["path","fs","result"],"mappings":";;;;;;;;AAAA,cAAA,EAAA;;;ACAA,cAAA,EAAA;;;ACAA,cAAA,EAAA;;;ACAA,cAAA,EAAA;AA6CA,eAAsB,mBAAA,CACpB,MAAA,EACA,GAAA,GAAc,OAAA,CAAQ,KAAI,EAKzB;AACD,EAAA,MAAM,QAAA,uBAAe,GAAA,EAA4B;AACjD,EAAA,IAAI,eAAuC,EAAC;AAC5C,EAAA,IAAI,QAAA;AAGJ,EAAA,IAAI,OAAO,QAAA,EAAU;AACnB,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA;AAC7C,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,UAAA,EAAa,MAAA,CAAO,QAAQ,CAAA,sCAAA,CAAwC,CAAA;AAAA,IACtF;AAEA,IAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,MAAA,CAAO,QAAQ,CAAA;AACjD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,MAAA,CAAO,QAAQ,CAAA,aAAA,EAAgB,MAAA,CAAO,IAAA,CAAK,iBAAiB,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACjH;AAEA,IAAA,QAAA,GAAW,QAAQ,cAAc,CAAA;AACjC,IAAA,MAAM,QAAA,CAAS,UAAU,cAAc,CAAA;AAGvC,IAAA,KAAA,MAAW,CAAC,YAAY,OAAO,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,EAAG;AACpE,MAAA,QAAA,CAAS,IAAI,CAAA,EAAG,QAAA,CAAS,IAAI,CAAA,CAAA,EAAI,UAAU,IAAI,OAAO,CAAA;AAAA,IACxD;AAGA,IAAA,YAAA,GAAe,EAAE,GAAG,sBAAA,CAAuB,MAAA,CAAO,QAAQ,CAAA,EAAE;AAAA,EAC9D;AAGA,EAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,0BAA0B,CAAA;AACjE,EAAA,MAAM,YAAA,GAAe,MAAM,kBAAA,CAAmB,eAAe,CAAA;AAC7D,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,aAAA,CAAc,UAAU,YAAY,CAAA;AAAA,EACtC;AAGA,EAAA,IAAI,MAAA,CAAO,QAAA,EAAU,OAAA,KAAY,KAAA,EAAO;AACtC,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,QAAA,EAAU,KAAA,IAAS,CAAC,iBAAiB,CAAA;AACnE,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAA,EAAU,OAAA,IAAW,SAAA;AAE5C,IAAA,KAAA,MAAW,YAAY,cAAA,EAAgB;AACrC,MAAA,MAAM,YAAA,GAAe,KAAK,UAAA,CAAW,QAAQ,IAAI,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,QAAQ,CAAA;AAEnF,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,OAAA,EAAS;AAAA,UAChC,GAAA,EAAK,YAAA;AAAA,UACL,QAAA,EAAU,IAAA;AAAA,UACV,MAAA,EAAQ,CAAC,WAAA,EAAa,oBAAoB;AAAA,SAC3C,CAAA;AAED,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,UAAA,MAAM,YAAA,GAAe,MAAM,kBAAA,CAAmB,IAAI,CAAA;AAClD,UAAA,IAAI,YAAA,EAAc;AAChB,YAAA,aAAA,CAAc,UAAU,YAAY,CAAA;AAAA,UACtC;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,WAAA,IAAe,MAAA,CAAO,QAAA,IAAY,EAAC,EAAG;AAC/C,IAAA,MAAM,YAAA,GAAe,KAAK,UAAA,CAAW,WAAW,IAC5C,WAAA,GACA,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,WAAW,CAAA;AAE9B,IAAA,MAAM,YAAA,GAAe,MAAM,kBAAA,CAAmB,YAAY,CAAA;AAC1D,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,aAAA,CAAc,UAAU,YAAY,CAAA;AAAA,IACtC,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,8CAAA,EAAiD,WAAW,CAAA,CAAE,CAAA;AAAA,IAC7E;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,YAAA,GAAe,EAAE,GAAG,YAAA,EAAc,GAAG,OAAO,KAAA,EAAM;AAAA,EACpD;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,YAAA,EAAc,QAAA,EAAS;AAC5C;AAKA,eAAe,mBAAmB,QAAA,EAAkE;AAClG,EAAA,IAAI;AAEF,IAAA,IAAI,CAAC,EAAA,CAAG,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC5B,MAAA,OAAO,IAAA;AAAA,IACT;AAIA,IAAA,IAAI,QAAA,GAAW,QAAA;AACf,IAAA,IAAI,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA,EAAG;AAG5B,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,OAAA,CAAQ,OAAA,EAAS,KAAK,CAAA;AAC9C,MAAA,IAAI,EAAA,CAAG,UAAA,CAAW,MAAM,CAAA,EAAG;AACzB,QAAA,QAAA,GAAW,MAAA;AAAA,MACb,CAAA,MAAO;AAGL,QAAA,QAAA,GAAW,QAAA;AAAA,MACb;AAAA,IACF;AAGA,IAAA,MAAM,MAAA,GAAS,MAAM,OAAO,CAAA,EAAG,QAAQ,CAAA,GAAA,EAAM,IAAA,CAAK,KAAK,CAAA,CAAA,CAAA;AAGvD,IAAA,IAAI,MAAA,CAAO,OAAA,IAAW,OAAO,MAAA,CAAO,YAAY,QAAA,EAAU;AACxD,MAAA,OAAO,MAAA,CAAO,OAAA;AAAA,IAChB;AAGA,IAAA,MAAM,WAA2C,EAAC;AAClD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,MAAA,IAAI,OAAO,KAAA,KAAU,UAAA,IAAc,GAAA,KAAQ,SAAA,EAAW;AACpD,QAAA,QAAA,CAAS,GAAG,CAAA,GAAI,KAAA;AAAA,MAClB;AAAA,IACF;AAEA,IAAA,OAAO,OAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,MAAA,GAAS,IAAI,QAAA,GAAW,IAAA;AAAA,EACvD,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKA,SAAS,aAAA,CACP,QACA,MAAA,EACM;AACN,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACnD,IAAA,MAAA,CAAO,GAAA,CAAI,KAAK,OAAO,CAAA;AAAA,EACzB;AACF;AAKO,SAAS,cAAA,CACd,QAAA,EACA,YAAA,EACA,YAAA,EACuB;AAEvB,EAAA,MAAM,SAAA,GAAY,aAAa,YAAY,CAAA;AAC3C,EAAA,IAAI,SAAA,IAAa,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA,EAAG;AACxC,IAAA,OAAO,QAAA,CAAS,IAAI,SAAS,CAAA;AAAA,EAC/B;AAGA,EAAA,IAAI,QAAA,CAAS,GAAA,CAAI,YAAY,CAAA,EAAG;AAC9B,IAAA,OAAO,QAAA,CAAS,IAAI,YAAY,CAAA;AAAA,EAClC;AAEA,EAAA,OAAO,IAAA;AACT;;;AC1NA,cAAA,EAAA;AAiBA,IAAM,WAAA,GAAc,+BAAA;AAGpB,eAAsB,iBAAA,CACpB,OAAA,EACA,GAAA,GAAc,OAAA,CAAQ,KAAI,EACX;AACf,EAAA,MAAM,GAAA,GAAMA,IAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,WAAW,CAAA;AACtC,EAAA,MAAMC,IAAG,KAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AACvC,EAAA,MAAM,WAAWD,IAAAA,CAAK,IAAA,CAAK,KAAK,CAAA,EAAG,OAAA,CAAQ,SAAS,CAAA,KAAA,CAAO,CAAA;AAC3D,EAAA,MAAMC,GAAAA,CAAG,UAAU,QAAA,EAAU,IAAA,CAAK,UAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,MAAM,CAAA;AACrE,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wBAAA,EAA2B,QAAQ,CAAA,CAAE,CAAA;AACnD;AAGA,eAAsB,kBAAA,CACpB,GAAA,GAAc,OAAA,CAAQ,GAAA,EAAI,EACA;AAC1B,EAAA,MAAM,GAAA,GAAMD,IAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,WAAW,CAAA;AACtC,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,MAAMC,GAAAA,CAAG,OAAA,CAAQ,GAAG,CAAA;AAClC,IAAA,MAAM,WAA4B,EAAC;AACnC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,EAAG;AAC1B,QAAA,MAAM,OAAA,GAAU,MAAMA,GAAAA,CAAG,QAAA,CAASD,KAAK,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA,EAAG,MAAM,CAAA;AAC9D,QAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,MACnC;AAAA,IACF;AACA,IAAA,OAAO,QAAA;AAAA,EACT,SAAS,KAAA,EAAO;AAEd,IAAA,IAAK,KAAA,CAAgC,SAAS,QAAA,EAAU;AACtD,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAGA,eAAsB,mBAAA,CACpB,SAAA,EACA,GAAA,GAAc,OAAA,CAAQ,KAAI,EACX;AACf,EAAA,MAAM,WAAWA,IAAAA,CAAK,IAAA,CAAK,KAAK,WAAA,EAAa,CAAA,EAAG,SAAS,CAAA,KAAA,CAAO,CAAA;AAChE,EAAA,IAAI;AACF,IAAA,MAAMC,GAAAA,CAAG,OAAO,QAAQ,CAAA;AACxB,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,6BAAA,EAAgC,SAAS,CAAA,KAAA,CAAO,CAAA;AAAA,EAC9D,SAAS,KAAA,EAAO;AACd,IAAA,IAAK,KAAA,CAAgC,SAAS,QAAA,EAAU;AACtD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AACF;;;AFhEA,IAAM,KAAA,GAAQ,CAAC,EAAA,KAAe,IAAI,QAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAkB5E,eAAsB,eACpB,SAAA,EACA,QAAA,EACA,YAAA,EACA,OAAA,GAAkC,EAAC,EACX;AACxB,EAAA,MAAM,EAAE,QAAA,GAAW,KAAA,EAAO,UAAU,CAAA,EAAG,MAAA,EAAQ,UAAS,GAAI,OAAA;AAC5D,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,SAAmB,EAAC;AAG1B,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,SAAS,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AAE3C,IAAA,MAAM,UAAA,GAAa,WAAA,IAAe,CAAA,GAAK,CAAA,CAAE,SAAA,GAAmC,MAAA;AAC5E,IAAA,MAAM,UAAA,GAAa,WAAA,IAAe,CAAA,GAAK,CAAA,CAAE,SAAA,GAAmC,MAAA;AAE5E,IAAA,MAAM,QAAQ,UAAA,GAAa,IAAI,KAAK,UAAU,CAAA,CAAE,SAAQ,GAAI,CAAA;AAC5D,IAAA,MAAM,QAAQ,UAAA,GAAa,IAAI,KAAK,UAAU,CAAA,CAAE,SAAQ,GAAI,CAAA;AAE5D,IAAA,OAAO,KAAA,GAAQ,KAAA;AAAA,EACjB,CAAC,CAAA;AAED,EAAA,MAAM,cAAA,GAAiB,OAAO,QAAA,KAAgD;AAC5E,IAAA,MAAM,gBAAgB,CAAA,EAAG,QAAA,CAAS,IAAI,CAAA,CAAA,EAAI,SAAS,EAAE,CAAA,CAAA;AAGrD,IAAA,MAAM,SAAA,GAAY,SAAA,IAAa,QAAA,GAAY,QAAA,CAAS,OAAA,GAAkC,KAAA;AACtF,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAG,aAAa,CAAA,kBAAA,CAAoB,CAAA;AACjD,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,OAAA,GAAU,cAAA,CAAe,QAAA,EAAU,YAAA,EAAc,SAAS,IAAI,CAAA;AAEpE,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAA,CAAO,KAAK,CAAA,EAAG,aAAa,CAAA,uBAAA,EAA0B,QAAA,CAAS,IAAI,CAAA,EAAA,CAAI,CAAA;AACvE,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,sCAAA,EAAyC,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AACrE,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,OAAA,EAAS,OAAA,EAAA,EAAW;AACnD,MAAA,IAAI;AACF,QAAA,MAAM,QAAQ,QAAQ,CAAA;AACtB,QAAA,OAAA,CAAQ,KAAK,aAAa,CAAA;AAC1B,QAAA,OAAO,IAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAE1E,QAAA,IAAI,YAAY,OAAA,EAAS;AACvB,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,aAAa,CAAA,EAAA,EAAK,YAAY,CAAA,CAAA,CAAG,CAAA;AAChD,UAAA,OAAA,CAAQ,IAAA;AAAA,YACN,CAAA,iBAAA,EAAoB,aAAa,CAAA,OAAA,EAAU,OAAO,CAAA,UAAA,CAAA;AAAA,YAClD;AAAA,WACF;AACA,UAAA,OAAO,KAAA;AAAA,QACT;AAGA,QAAA,MAAM,QAAQ,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,UAAU,CAAC,CAAA;AAC3C,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN,mBAAmB,OAAO,CAAA,CAAA,EAAI,OAAO,CAAA,YAAA,EAAe,aAAa,iBAClD,KAAK,CAAA,KAAA;AAAA,SACtB;AACA,QAAA,MAAM,MAAM,KAAK,CAAA;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAEA,EAAA,IAAI,QAAA,EAAU;AAEZ,IAAA,MAAM,UAAU,MAAM,OAAA,CAAQ,WAAW,MAAA,CAAO,GAAA,CAAI,cAAc,CAAC,CAAA;AAGnE,IAAA,OAAA,CAAQ,OAAA,CAAQ,CAACC,OAAAA,EAAQ,KAAA,KAAU;AACjC,MAAA,IAAIA,OAAAA,CAAO,WAAW,UAAA,EAAY;AAChC,QAAA,MAAM,QAAA,GAAW,OAAO,KAAK,CAAA;AAC7B,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN,CAAA,6BAAA,EAAgC,QAAA,CAAS,IAAI,CAAA,CAAA,EAAI,SAAS,EAAE,CAAA,CAAA,CAAA;AAAA,UAC5DA,OAAAA,CAAO;AAAA,SACT;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA,MAAO;AAEL,IAAA,KAAA,MAAW,YAAY,MAAA,EAAQ;AAC7B,MAAA,MAAM,eAAe,QAAQ,CAAA;AAAA,IAC/B;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,EAAQ,aAAA,IAAiB,QAAA,EAAU,gBAAA,EAAkB;AACvD,IAAA,OAAA,CAAQ,IAAI,iDAAiD,CAAA;AAE7D,IAAA,IAAI;AACF,MAAA,MAAM,eAAA,GAAkB,MAAM,QAAA,CAAS,gBAAA,CAAiB;AAAA,QACtD,eAAe,OAAA,CAAQ,aAAA,IAAA,iBAAiB,IAAI,IAAA,IAAO,WAAA,EAAY;AAAA,QAC/D,qBAAA,EAAuB,QAAQ,aAAA,KAAkB,KAAA,CAAA;AAAA,QACjD,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,WAAW,OAAA,CAAQ;AAAA,OACpB,CAAA;AAED,MAAA,IAAI,eAAA,CAAgB,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACtC,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qBAAA,EAAwB,eAAA,CAAgB,OAAA,CAAQ,MAAM,CAAA,oBAAA,CAAsB,CAAA;AACxF,QAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,eAAA,CAAgB,OAAO,CAAA;AAAA,MACzC;AAEA,MAAA,IAAI,eAAA,CAAgB,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AACrC,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,6BAAA,EAAgC,eAAA,CAAgB,MAAA,CAAO,MAAM,CAAA,oBAAA,CAAsB,CAAA;AAC/F,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,eAAA,CAAgB,MAAM,CAAA;AAAA,MACvC;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,0CAAA,EAA6C,YAAY,CAAA,CAAE,CAAA;AAAA,IAC1E;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAwB;AAAA,IAC5B,OAAA,EAAS,OAAO,MAAA,KAAW,CAAA;AAAA,IAC3B,OAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,IAAK,OAAA,CAAQ,cAAA,EAAgB;AAC/C,IAAA,IAAI;AACF,MAAA,MAAM,gBAAgB,OAAA,CAAQ,SAAA,IACzB,OAAA,CAAQ,MAAA,IACR,QAAQ,SAAA,IACR,CAAA,QAAA,EAAA,iBAAW,IAAI,IAAA,IAAO,WAAA,EAAY,CAAE,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAC,CAAA,CAAA;AAG9D,MAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,MAAA,CAAO,CAAC,QAAA,KAAa;AAClD,QAAA,MAAM,gBAAgB,CAAA,EAAG,QAAA,CAAS,IAAI,CAAA,CAAA,EAAI,SAAS,EAAE,CAAA,CAAA;AACrD,QAAA,OAAO,OAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,UAAA,CAAW,aAAa,CAAC,CAAA;AAAA,MACvD,CAAC,CAAA;AAED,MAAA,MAAM,iBAAA;AAAA,QACJ;AAAA,UACE,SAAA,EAAW,aAAA;AAAA,UACX,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UAClC,SAAA,EAAW,eAAA;AAAA,UACX,gBAAgB,OAAA,CAAQ,cAAA;AAAA,UACxB,MAAA,EAAQ;AAAA,SACV;AAAA,QACA,OAAA,CAAQ;AAAA,OACV;AAAA,IACF,SAAS,KAAA,EAAO;AAEd,MAAA,OAAA,CAAQ,IAAA,CAAK,4CAA4C,KAAK,CAAA;AAAA,IAChE;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,qBAAA,CACd,QAAA,EACA,YAAA,EACA,OAAA,GAA2B,EAAC,EAC5B;AACA,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA,IAIL,SAAS,CAAC,SAAA,KACR,eAAe,SAAA,EAAW,QAAA,EAAU,cAAc,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,IAK3D,UAAA,EAAY,OAAO,QAAA,KAAgD;AACjE,MAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,CAAC,QAAQ,CAAA,EAAG,QAAA,EAAU,cAAc,OAAO,CAAA;AAC/E,MAAA,OAAO,MAAA,CAAO,OAAA;AAAA,IAChB;AAAA,GACF;AACF;;;AFtLO,SAAS,sBAAgE,QAAA,EAAgB;AAC9F,EAAA,OAAO,QAAA;AACT","file":"chunk-4P2XW7LQ.js","sourcesContent":["export * from './types.js';\nimport type { CleanupHandler } from './types.js';\n\nexport { executeCleanup, createCleanupExecutor, type ExtendedCleanupOptions } from './executor.js';\nexport { loadCleanupHandlers, resolveHandler } from './loader.js';\nexport { saveFailedCleanup, loadFailedCleanups, removeFailedCleanup, type FailedCleanup } from './persistence.js';\n\n/**\n * Helper for defining cleanup handlers in user files.\n * Provides type safety for custom cleanup handler definitions.\n *\n * @example\n * // In cleanup.ts\n * import { defineCleanupHandlers } from 'intellitester/cleanup';\n *\n * export default defineCleanupHandlers({\n * async deleteUser(resource) {\n * // cleanup logic\n * },\n * async deleteTeam(resource) {\n * // cleanup logic\n * }\n * });\n */\nexport function defineCleanupHandlers<T extends Record<string, CleanupHandler>>(handlers: T): T {\n return handlers;\n}\n","import type { TrackedResource } from '../../integration/index.js';\n\nexport interface CleanupHandler {\n (resource: TrackedResource): Promise<void>;\n}\n\nexport interface CleanupUntrackedOptions {\n testStartTime: string; // ISO timestamp when test started\n userId?: string; // Test user ID to match\n userEmail?: string; // Test user email to match\n sessionId?: string; // Session ID for logging\n testStartTimeProvided?: boolean; // Indicates if testStartTime was explicitly provided\n}\n\nexport interface CleanupUntrackedResult {\n success: boolean;\n scanned: number; // Number of tables/collections scanned\n deleted: string[]; // Resource IDs deleted\n failed: string[]; // Resource IDs that failed to delete\n}\n\nexport interface CleanupProvider {\n name: string;\n configure(config: Record<string, unknown>): Promise<void>;\n methods: Record<string, CleanupHandler>;\n // Scan and clean up resources created during test that weren't explicitly tracked\n cleanupUntracked?(options: CleanupUntrackedOptions): Promise<CleanupUntrackedResult>;\n}\n\nexport interface CleanupDiscoverConfig {\n enabled?: boolean;\n paths?: string[];\n pattern?: string;\n}\n\nexport interface CleanupConfig {\n provider?: string;\n parallel?: boolean; // default: false\n retries?: number; // default: 3\n types?: Record<string, string>; // type -> 'provider.method'\n handlers?: string[]; // explicit paths\n discover?: CleanupDiscoverConfig;\n scanUntracked?: boolean; // Enable scanning for untracked resources\n [providerName: string]: unknown; // provider-specific configs\n}\n\nexport interface CleanupResult {\n success: boolean;\n deleted: string[];\n failed: string[];\n}\n\nexport interface ExecutorOptions {\n parallel?: boolean;\n retries?: number;\n sessionId?: string;\n testStartTime?: string; // When the test started (ISO timestamp)\n userId?: string; // Test user ID for matching\n userEmail?: string; // Test user email for matching\n providerConfig?: {\n provider: string;\n [key: string]: unknown;\n };\n cwd?: string;\n}\n","import type { TrackedResource } from '../../integration/index.js';\nimport type { CleanupHandler, CleanupResult, ExecutorOptions, CleanupConfig, CleanupProvider } from './types.js';\nimport { resolveHandler } from './loader.js';\nimport { saveFailedCleanup } from './persistence.js';\n\nconst sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));\n\n/**\n * Extended options for cleanup execution including provider and config\n */\nexport interface ExtendedCleanupOptions extends ExecutorOptions {\n config?: CleanupConfig;\n provider?: CleanupProvider;\n}\n\n/**\n * Execute cleanup for all tracked resources\n *\n * @param resources - Array of tracked resources to clean up\n * @param handlers - Map of handler names to cleanup functions\n * @param typeMappings - Map of resource types to handler names\n * @param options - Executor options (parallel, retries, config, provider)\n */\nexport async function executeCleanup(\n resources: TrackedResource[],\n handlers: Map<string, CleanupHandler>,\n typeMappings: Record<string, string>,\n options: ExtendedCleanupOptions = {}\n): Promise<CleanupResult> {\n const { parallel = false, retries = 3, config, provider } = options;\n const deleted: string[] = [];\n const failed: string[] = [];\n\n // Sort by creation time (reverse) - delete newest first (LIFO)\n const sorted = [...resources].sort((a, b) => {\n // Handle optional createdAt field (present at runtime from tracking server)\n const aCreatedAt = 'createdAt' in a ? (a.createdAt as string | undefined) : undefined;\n const bCreatedAt = 'createdAt' in b ? (b.createdAt as string | undefined) : undefined;\n\n const timeA = aCreatedAt ? new Date(aCreatedAt).getTime() : 0;\n const timeB = bCreatedAt ? new Date(bCreatedAt).getTime() : 0;\n\n return timeB - timeA;\n });\n\n const deleteResource = async (resource: TrackedResource): Promise<boolean> => {\n const resourceLabel = `${resource.type}:${resource.id}`;\n\n // Skip already deleted resources (deleted field may be set dynamically)\n const isDeleted = 'deleted' in resource ? (resource.deleted as boolean | undefined) : false;\n if (isDeleted) {\n deleted.push(`${resourceLabel} (already deleted)`);\n return true;\n }\n\n // Resolve the handler\n const handler = resolveHandler(handlers, typeMappings, resource.type);\n\n if (!handler) {\n failed.push(`${resourceLabel} (no handler for type \"${resource.type}\")`);\n console.warn(`No cleanup handler for resource type: ${resource.type}`);\n return false;\n }\n\n // Retry with exponential backoff\n for (let attempt = 1; attempt <= retries; attempt++) {\n try {\n await handler(resource);\n deleted.push(resourceLabel);\n return true;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n if (attempt === retries) {\n failed.push(`${resourceLabel} (${errorMessage})`);\n console.warn(\n `Failed to delete ${resourceLabel} after ${retries} attempts:`,\n errorMessage\n );\n return false;\n }\n\n // Exponential backoff: 100ms, 200ms, 400ms, 800ms...\n const delay = 100 * Math.pow(2, attempt - 1);\n console.debug(\n `Cleanup attempt ${attempt}/${retries} failed for ${resourceLabel}, ` +\n `retrying in ${delay}ms...`\n );\n await sleep(delay);\n }\n }\n\n return false;\n };\n\n if (parallel) {\n // Parallel execution\n const results = await Promise.allSettled(sorted.map(deleteResource));\n\n // Log any unexpected rejections (shouldn't happen since deleteResource handles errors)\n results.forEach((result, index) => {\n if (result.status === 'rejected') {\n const resource = sorted[index];\n console.error(\n `Unexpected error cleaning up ${resource.type}:${resource.id}:`,\n result.reason\n );\n }\n });\n } else {\n // Sequential execution\n for (const resource of sorted) {\n await deleteResource(resource);\n }\n }\n\n // After tracked cleanup, scan for untracked resources if configured\n if (config?.scanUntracked && provider?.cleanupUntracked) {\n console.log('\\n[Cleanup] Scanning for untracked resources...');\n\n try {\n const untrackedResult = await provider.cleanupUntracked({\n testStartTime: options.testStartTime ?? new Date().toISOString(),\n testStartTimeProvided: options.testStartTime !== undefined,\n userId: options.userId,\n userEmail: options.userEmail,\n sessionId: options.sessionId,\n });\n\n if (untrackedResult.deleted.length > 0) {\n console.log(`[Cleanup] Cleaned up ${untrackedResult.deleted.length} untracked resources`);\n deleted.push(...untrackedResult.deleted);\n }\n\n if (untrackedResult.failed.length > 0) {\n console.log(`[Cleanup] Failed to clean up ${untrackedResult.failed.length} untracked resources`);\n failed.push(...untrackedResult.failed);\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.warn(`[Cleanup] Untracked resource scan failed: ${errorMessage}`);\n }\n }\n\n const result: CleanupResult = {\n success: failed.length === 0,\n deleted,\n failed,\n };\n\n // Save failed cleanups for retry if there were failures\n if (failed.length > 0 && options.providerConfig) {\n try {\n const persistenceId = options.sessionId\n ?? options.userId\n ?? options.userEmail\n ?? `cleanup-${new Date().toISOString().replace(/[:.]/g, '-')}`;\n\n // Extract the resources that failed\n const failedResources = sorted.filter((resource) => {\n const resourceLabel = `${resource.type}:${resource.id}`;\n return failed.some((f) => f.startsWith(resourceLabel));\n });\n\n await saveFailedCleanup(\n {\n sessionId: persistenceId,\n timestamp: new Date().toISOString(),\n resources: failedResources,\n providerConfig: options.providerConfig,\n errors: failed,\n },\n options.cwd\n );\n } catch (error) {\n // Don't fail the cleanup if we can't save the failed cleanup file\n console.warn('Failed to save cleanup persistence file:', error);\n }\n }\n\n return result;\n}\n\n/**\n * Create a cleanup executor with pre-configured handlers and options\n */\nexport function createCleanupExecutor(\n handlers: Map<string, CleanupHandler>,\n typeMappings: Record<string, string>,\n options: ExecutorOptions = {}\n) {\n return {\n /**\n * Execute cleanup for resources\n */\n cleanup: (resources: TrackedResource[]) =>\n executeCleanup(resources, handlers, typeMappings, options),\n\n /**\n * Execute cleanup for a single resource\n */\n cleanupOne: async (resource: TrackedResource): Promise<boolean> => {\n const result = await executeCleanup([resource], handlers, typeMappings, options);\n return result.success;\n },\n };\n}\n","import { glob } from 'glob';\nimport path from 'path';\nimport fs from 'fs';\nimport type { CleanupHandler, CleanupConfig, CleanupProvider } from './types.js';\nimport { providerFactories, getDefaultTypeMappings } from '../../providers/index.js';\n\n/**\n * Load all cleanup handlers based on configuration\n *\n * Loading order (later overrides earlier):\n * 1. Built-in provider methods\n * 2. intellitester.cleanup.ts at project root\n * 3. Discovery paths (default: tests/cleanup/**\\/*.ts)\n * 4. Explicit handler files from config\n *\n * @param config - Cleanup configuration object\n * @param cwd - Current working directory (defaults to process.cwd())\n *\n * @example\n * ```typescript\n * // Basic usage with a provider\n * const { handlers, typeMappings } = await loadCleanupHandlers({\n * provider: 'sqlite',\n * sqlite: { database: './test.db' },\n * types: {\n * user: 'sqlite.deleteUser',\n * team: 'sqlite.deleteRow'\n * }\n * });\n *\n * // With custom discovery paths\n * const { handlers, typeMappings } = await loadCleanupHandlers({\n * provider: 'postgres',\n * postgres: { connectionString: 'postgresql://...' },\n * discover: {\n * enabled: true,\n * paths: ['./tests/cleanup', './e2e/cleanup'],\n * pattern: '**\\/*.cleanup.ts'\n * },\n * handlers: ['./custom-cleanup.ts']\n * });\n * ```\n *\n * @returns Object containing loaded handlers map and type mappings\n */\nexport async function loadCleanupHandlers(\n config: CleanupConfig,\n cwd: string = process.cwd()\n): Promise<{\n handlers: Map<string, CleanupHandler>;\n typeMappings: Record<string, string>;\n provider?: CleanupProvider;\n}> {\n const handlers = new Map<string, CleanupHandler>();\n let typeMappings: Record<string, string> = {};\n let provider: CleanupProvider | undefined;\n\n // 1. Load built-in provider methods\n if (config.provider) {\n const providerConfig = config[config.provider] as Record<string, unknown> | undefined;\n if (!providerConfig) {\n throw new Error(`Provider \"${config.provider}\" specified but no configuration found`);\n }\n\n const factory = providerFactories[config.provider];\n if (!factory) {\n throw new Error(`Unknown provider: ${config.provider}. Available: ${Object.keys(providerFactories).join(', ')}`);\n }\n\n provider = factory(providerConfig);\n await provider.configure(providerConfig);\n\n // Register provider methods\n for (const [methodName, handler] of Object.entries(provider.methods)) {\n handlers.set(`${provider.name}.${methodName}`, handler);\n }\n\n // Get default type mappings for this provider\n typeMappings = { ...getDefaultTypeMappings(config.provider) };\n }\n\n // 2. Auto-discover intellitester.cleanup.ts at root\n const rootCleanupPath = path.join(cwd, 'intellitester.cleanup.ts');\n const rootHandlers = await tryLoadHandlerFile(rootCleanupPath);\n if (rootHandlers) {\n mergeHandlers(handlers, rootHandlers);\n }\n\n // 3. Auto-discover from discovery paths\n if (config.discover?.enabled !== false) {\n const discoveryPaths = config.discover?.paths ?? ['./tests/cleanup'];\n const pattern = config.discover?.pattern ?? '**/*.ts';\n\n for (const basePath of discoveryPaths) {\n const absoluteBase = path.isAbsolute(basePath) ? basePath : path.join(cwd, basePath);\n\n try {\n const files = await glob(pattern, {\n cwd: absoluteBase,\n absolute: true,\n ignore: ['**/*.d.ts', '**/node_modules/**']\n });\n\n for (const file of files) {\n const fileHandlers = await tryLoadHandlerFile(file);\n if (fileHandlers) {\n mergeHandlers(handlers, fileHandlers);\n }\n }\n } catch {\n // Directory doesn't exist or no matches - that's fine\n }\n }\n }\n\n // 4. Load explicit handler files\n for (const handlerPath of config.handlers ?? []) {\n const absolutePath = path.isAbsolute(handlerPath)\n ? handlerPath\n : path.join(cwd, handlerPath);\n\n const fileHandlers = await tryLoadHandlerFile(absolutePath);\n if (fileHandlers) {\n mergeHandlers(handlers, fileHandlers);\n } else {\n console.warn(`Warning: Could not load cleanup handler file: ${handlerPath}`);\n }\n }\n\n // Merge config.types over default mappings\n if (config.types) {\n typeMappings = { ...typeMappings, ...config.types };\n }\n\n return { handlers, typeMappings, provider };\n}\n\n/**\n * Try to load a handler file, returning null if it doesn't exist or fails\n */\nasync function tryLoadHandlerFile(filePath: string): Promise<Record<string, CleanupHandler> | null> {\n try {\n // Check if file exists\n if (!fs.existsSync(filePath)) {\n return null;\n }\n\n // For TypeScript files, we need to handle them appropriately\n // In a built environment, look for the .js equivalent\n let loadPath = filePath;\n if (filePath.endsWith('.ts')) {\n // In production, TypeScript files will be compiled to .js\n // Try to load the compiled .js version from dist if running compiled\n const jsPath = filePath.replace(/\\.ts$/, '.js');\n if (fs.existsSync(jsPath)) {\n loadPath = jsPath;\n } else {\n // Running in development with tsx/ts-node\n // Try direct import which works with these tools\n loadPath = filePath;\n }\n }\n\n // Use dynamic import with cache busting for fresh load\n const module = await import(`${loadPath}?t=${Date.now()}`);\n\n // Handle default export or named exports\n if (module.default && typeof module.default === 'object') {\n return module.default as Record<string, CleanupHandler>;\n }\n\n // Filter to only include function exports\n const handlers: Record<string, CleanupHandler> = {};\n for (const [key, value] of Object.entries(module)) {\n if (typeof value === 'function' && key !== 'default') {\n handlers[key] = value as CleanupHandler;\n }\n }\n\n return Object.keys(handlers).length > 0 ? handlers : null;\n } catch {\n // File doesn't exist or failed to load\n return null;\n }\n}\n\n/**\n * Merge handlers from a file into the main handlers map\n */\nfunction mergeHandlers(\n target: Map<string, CleanupHandler>,\n source: Record<string, CleanupHandler>\n): void {\n for (const [key, handler] of Object.entries(source)) {\n target.set(key, handler);\n }\n}\n\n/**\n * Get a handler by key, checking both direct keys and provider.method format\n */\nexport function resolveHandler(\n handlers: Map<string, CleanupHandler>,\n typeMappings: Record<string, string>,\n resourceType: string\n): CleanupHandler | null {\n // First check type mappings\n const mappedKey = typeMappings[resourceType];\n if (mappedKey && handlers.has(mappedKey)) {\n return handlers.get(mappedKey)!;\n }\n\n // Then check for direct handler\n if (handlers.has(resourceType)) {\n return handlers.get(resourceType)!;\n }\n\n return null;\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { TrackedResource } from '../../integration/index.js';\n\n// Types\nexport interface FailedCleanup {\n sessionId: string;\n timestamp: string;\n resources: TrackedResource[];\n // Generic provider config (no secrets!)\n providerConfig: {\n provider: string; // 'appwrite' | 'postgres' | 'mysql' | 'sqlite'\n [key: string]: unknown; // endpoint, projectId, database, etc. - NO passwords/keys\n };\n errors: string[];\n}\n\nconst CLEANUP_DIR = '.intellitester/cleanup/failed';\n\n// Save failed cleanup to disk\nexport async function saveFailedCleanup(\n cleanup: FailedCleanup,\n cwd: string = process.cwd()\n): Promise<void> {\n const dir = path.join(cwd, CLEANUP_DIR);\n await fs.mkdir(dir, { recursive: true });\n const filePath = path.join(dir, `${cleanup.sessionId}.json`);\n await fs.writeFile(filePath, JSON.stringify(cleanup, null, 2), 'utf8');\n console.log(`Saved failed cleanup to ${filePath}`);\n}\n\n// Load all failed cleanups from disk\nexport async function loadFailedCleanups(\n cwd: string = process.cwd()\n): Promise<FailedCleanup[]> {\n const dir = path.join(cwd, CLEANUP_DIR);\n try {\n const files = await fs.readdir(dir);\n const cleanups: FailedCleanup[] = [];\n for (const file of files) {\n if (file.endsWith('.json')) {\n const content = await fs.readFile(path.join(dir, file), 'utf8');\n cleanups.push(JSON.parse(content));\n }\n }\n return cleanups;\n } catch (error) {\n // Directory doesn't exist = no failed cleanups\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return [];\n }\n throw error;\n }\n}\n\n// Remove a failed cleanup file after successful retry\nexport async function removeFailedCleanup(\n sessionId: string,\n cwd: string = process.cwd()\n): Promise<void> {\n const filePath = path.join(cwd, CLEANUP_DIR, `${sessionId}.json`);\n try {\n await fs.unlink(filePath);\n console.log(`Removed failed cleanup file: ${sessionId}.json`);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n}\n"]}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { createSqliteProvider, sqliteTypeMappings } from './chunk-
|
|
2
|
-
import { createAppwriteProvider, appwriteTypeMappings } from './chunk-
|
|
3
|
-
import { createPostgresProvider, postgresTypeMappings } from './chunk-
|
|
4
|
-
import { createMysqlProvider, mysqlTypeMappings } from './chunk-
|
|
1
|
+
import { createSqliteProvider, sqliteTypeMappings } from './chunk-EHRUD6JS.js';
|
|
2
|
+
import { createAppwriteProvider, appwriteTypeMappings } from './chunk-XRDD26DA.js';
|
|
3
|
+
import { createPostgresProvider, postgresTypeMappings } from './chunk-AZEUOP6U.js';
|
|
4
|
+
import { createMysqlProvider, mysqlTypeMappings } from './chunk-EEJIIJEG.js';
|
|
5
|
+
import { init_esm_shims } from './chunk-TM6IHTOK.js';
|
|
5
6
|
|
|
6
7
|
// src/providers/index.ts
|
|
8
|
+
init_esm_shims();
|
|
7
9
|
var providerFactories = {
|
|
8
10
|
appwrite: (config) => createAppwriteProvider(config),
|
|
9
11
|
postgres: (config) => createPostgresProvider(config),
|
|
@@ -27,5 +29,5 @@ function listAvailableProviders() {
|
|
|
27
29
|
}
|
|
28
30
|
|
|
29
31
|
export { getDefaultTypeMappings, isProviderAvailable, listAvailableProviders, providerFactories };
|
|
30
|
-
//# sourceMappingURL=chunk-
|
|
31
|
-
//# sourceMappingURL=chunk-
|
|
32
|
+
//# sourceMappingURL=chunk-7ALNM3DK.js.map
|
|
33
|
+
//# sourceMappingURL=chunk-7ALNM3DK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/index.ts"],"names":[],"mappings":";;;;;;;AAAA,cAAA,EAAA;AAaO,IAAM,iBAAA,GAAsE;AAAA,EACjF,QAAA,EAAU,CAAC,MAAA,KAAW,sBAAA,CAAuB,MAAM,CAAA;AAAA,EACnD,QAAA,EAAU,CAAC,MAAA,KAAW,sBAAA,CAAuB,MAAM,CAAA;AAAA,EACnD,KAAA,EAAO,CAAC,MAAA,KAAW,mBAAA,CAAoB,MAAM,CAAA;AAAA,EAC7C,MAAA,EAAQ,CAAC,MAAA,KAAW,oBAAA,CAAqB,MAAM;AACjD;AAGA,IAAM,oBAAA,GAA+D;AAAA,EACnE,QAAA,EAAU,oBAAA;AAAA,EACV,QAAA,EAAU,oBAAA;AAAA,EACV,KAAA,EAAO,iBAAA;AAAA,EACP,MAAA,EAAQ;AACV,CAAA;AAGO,SAAS,uBAAuB,QAAA,EAA0C;AAC/E,EAAA,OAAO,oBAAA,CAAqB,QAAQ,CAAA,IAAK,EAAC;AAC5C;AAGO,SAAS,oBAAoB,QAAA,EAA2B;AAC7D,EAAA,OAAO,QAAA,IAAY,iBAAA;AACrB;AAGO,SAAS,sBAAA,GAAmC;AACjD,EAAA,OAAO,MAAA,CAAO,KAAK,iBAAiB,CAAA;AACtC","file":"chunk-7ALNM3DK.js","sourcesContent":["import { createAppwriteProvider, appwriteTypeMappings } from './appwrite/index.js';\nimport { createPostgresProvider, postgresTypeMappings } from './postgres/index.js';\nimport { createMysqlProvider, mysqlTypeMappings } from './mysql/index.js';\nimport { createSqliteProvider, sqliteTypeMappings } from './sqlite/index.js';\nimport type { CleanupProvider } from '../core/cleanup/types.js';\n\n// Re-export for convenience\nexport { createAppwriteProvider, appwriteTypeMappings } from './appwrite/index.js';\nexport { createPostgresProvider, postgresTypeMappings } from './postgres/index.js';\nexport { createMysqlProvider, mysqlTypeMappings } from './mysql/index.js';\nexport { createSqliteProvider, sqliteTypeMappings } from './sqlite/index.js';\n\n// Provider factory registry using static imports\nexport const providerFactories: Record<string, (config: any) => CleanupProvider> = {\n appwrite: (config) => createAppwriteProvider(config),\n postgres: (config) => createPostgresProvider(config),\n mysql: (config) => createMysqlProvider(config),\n sqlite: (config) => createSqliteProvider(config),\n};\n\n// Default type mappings for each provider\nconst typeMappingsRegistry: Record<string, Record<string, string>> = {\n appwrite: appwriteTypeMappings,\n postgres: postgresTypeMappings,\n mysql: mysqlTypeMappings,\n sqlite: sqliteTypeMappings,\n};\n\n// Get default type mappings for a provider\nexport function getDefaultTypeMappings(provider: string): Record<string, string> {\n return typeMappingsRegistry[provider] ?? {};\n}\n\n// Helper to check if a provider is available\nexport function isProviderAvailable(provider: string): boolean {\n return provider in providerFactories;\n}\n\n// Helper to list all available providers\nexport function listAvailableProviders(): string[] {\n return Object.keys(providerFactories);\n}\n"]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkMVFZZF3J_cjs = require('./chunk-MVFZZF3J.cjs');
|
|
4
|
+
var chunkQHHY44MH_cjs = require('./chunk-QHHY44MH.cjs');
|
|
5
|
+
var chunkDISSZD7X_cjs = require('./chunk-DISSZD7X.cjs');
|
|
6
|
+
var chunkQBEAPUBU_cjs = require('./chunk-QBEAPUBU.cjs');
|
|
7
|
+
var chunkE7I5EAST_cjs = require('./chunk-E7I5EAST.cjs');
|
|
8
|
+
|
|
9
|
+
// src/providers/index.ts
|
|
10
|
+
chunkE7I5EAST_cjs.init_cjs_shims();
|
|
11
|
+
var providerFactories = {
|
|
12
|
+
appwrite: (config) => chunkQHHY44MH_cjs.createAppwriteProvider(config),
|
|
13
|
+
postgres: (config) => chunkDISSZD7X_cjs.createPostgresProvider(config),
|
|
14
|
+
mysql: (config) => chunkQBEAPUBU_cjs.createMysqlProvider(config),
|
|
15
|
+
sqlite: (config) => chunkMVFZZF3J_cjs.createSqliteProvider(config)
|
|
16
|
+
};
|
|
17
|
+
var typeMappingsRegistry = {
|
|
18
|
+
appwrite: chunkQHHY44MH_cjs.appwriteTypeMappings,
|
|
19
|
+
postgres: chunkDISSZD7X_cjs.postgresTypeMappings,
|
|
20
|
+
mysql: chunkQBEAPUBU_cjs.mysqlTypeMappings,
|
|
21
|
+
sqlite: chunkMVFZZF3J_cjs.sqliteTypeMappings
|
|
22
|
+
};
|
|
23
|
+
function getDefaultTypeMappings(provider) {
|
|
24
|
+
return typeMappingsRegistry[provider] ?? {};
|
|
25
|
+
}
|
|
26
|
+
function isProviderAvailable(provider) {
|
|
27
|
+
return provider in providerFactories;
|
|
28
|
+
}
|
|
29
|
+
function listAvailableProviders() {
|
|
30
|
+
return Object.keys(providerFactories);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
exports.getDefaultTypeMappings = getDefaultTypeMappings;
|
|
34
|
+
exports.isProviderAvailable = isProviderAvailable;
|
|
35
|
+
exports.listAvailableProviders = listAvailableProviders;
|
|
36
|
+
exports.providerFactories = providerFactories;
|
|
37
|
+
//# sourceMappingURL=chunk-7JUP6HRD.cjs.map
|
|
38
|
+
//# sourceMappingURL=chunk-7JUP6HRD.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/index.ts"],"names":["init_cjs_shims","createAppwriteProvider","createPostgresProvider","createMysqlProvider","createSqliteProvider","appwriteTypeMappings","postgresTypeMappings","mysqlTypeMappings","sqliteTypeMappings"],"mappings":";;;;;;;;;AAAAA,gCAAA,EAAA;AAaO,IAAM,iBAAA,GAAsE;AAAA,EACjF,QAAA,EAAU,CAAC,MAAA,KAAWC,wCAAA,CAAuB,MAAM,CAAA;AAAA,EACnD,QAAA,EAAU,CAAC,MAAA,KAAWC,wCAAA,CAAuB,MAAM,CAAA;AAAA,EACnD,KAAA,EAAO,CAAC,MAAA,KAAWC,qCAAA,CAAoB,MAAM,CAAA;AAAA,EAC7C,MAAA,EAAQ,CAAC,MAAA,KAAWC,sCAAA,CAAqB,MAAM;AACjD;AAGA,IAAM,oBAAA,GAA+D;AAAA,EACnE,QAAA,EAAUC,sCAAA;AAAA,EACV,QAAA,EAAUC,sCAAA;AAAA,EACV,KAAA,EAAOC,mCAAA;AAAA,EACP,MAAA,EAAQC;AACV,CAAA;AAGO,SAAS,uBAAuB,QAAA,EAA0C;AAC/E,EAAA,OAAO,oBAAA,CAAqB,QAAQ,CAAA,IAAK,EAAC;AAC5C;AAGO,SAAS,oBAAoB,QAAA,EAA2B;AAC7D,EAAA,OAAO,QAAA,IAAY,iBAAA;AACrB;AAGO,SAAS,sBAAA,GAAmC;AACjD,EAAA,OAAO,MAAA,CAAO,KAAK,iBAAiB,CAAA;AACtC","file":"chunk-7JUP6HRD.cjs","sourcesContent":["import { createAppwriteProvider, appwriteTypeMappings } from './appwrite/index.js';\nimport { createPostgresProvider, postgresTypeMappings } from './postgres/index.js';\nimport { createMysqlProvider, mysqlTypeMappings } from './mysql/index.js';\nimport { createSqliteProvider, sqliteTypeMappings } from './sqlite/index.js';\nimport type { CleanupProvider } from '../core/cleanup/types.js';\n\n// Re-export for convenience\nexport { createAppwriteProvider, appwriteTypeMappings } from './appwrite/index.js';\nexport { createPostgresProvider, postgresTypeMappings } from './postgres/index.js';\nexport { createMysqlProvider, mysqlTypeMappings } from './mysql/index.js';\nexport { createSqliteProvider, sqliteTypeMappings } from './sqlite/index.js';\n\n// Provider factory registry using static imports\nexport const providerFactories: Record<string, (config: any) => CleanupProvider> = {\n appwrite: (config) => createAppwriteProvider(config),\n postgres: (config) => createPostgresProvider(config),\n mysql: (config) => createMysqlProvider(config),\n sqlite: (config) => createSqliteProvider(config),\n};\n\n// Default type mappings for each provider\nconst typeMappingsRegistry: Record<string, Record<string, string>> = {\n appwrite: appwriteTypeMappings,\n postgres: postgresTypeMappings,\n mysql: mysqlTypeMappings,\n sqlite: sqliteTypeMappings,\n};\n\n// Get default type mappings for a provider\nexport function getDefaultTypeMappings(provider: string): Record<string, string> {\n return typeMappingsRegistry[provider] ?? {};\n}\n\n// Helper to check if a provider is available\nexport function isProviderAvailable(provider: string): boolean {\n return provider in providerFactories;\n}\n\n// Helper to list all available providers\nexport function listAvailableProviders(): string[] {\n return Object.keys(providerFactories);\n}\n"]}
|
|
@@ -1,11 +1,30 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var chunkE7I5EAST_cjs = require('./chunk-E7I5EAST.cjs');
|
|
4
|
+
|
|
3
5
|
// src/integration/index.ts
|
|
6
|
+
chunkE7I5EAST_cjs.init_cjs_shims();
|
|
4
7
|
var cachedTracking = null;
|
|
8
|
+
var getEnv = (name) => {
|
|
9
|
+
if (typeof process !== "undefined" && process.env) {
|
|
10
|
+
return process.env[name];
|
|
11
|
+
}
|
|
12
|
+
const g = globalThis;
|
|
13
|
+
if (g.env && typeof g.env === "object") {
|
|
14
|
+
return g.env[name];
|
|
15
|
+
}
|
|
16
|
+
if (typeof Deno !== "undefined" && Deno.env) {
|
|
17
|
+
try {
|
|
18
|
+
return Deno.env.get(name);
|
|
19
|
+
} catch {
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return void 0;
|
|
23
|
+
};
|
|
5
24
|
var resolveTracking = () => {
|
|
6
|
-
const sessionId =
|
|
7
|
-
const trackUrl =
|
|
8
|
-
const trackFile =
|
|
25
|
+
const sessionId = getEnv("INTELLITESTER_SESSION_ID");
|
|
26
|
+
const trackUrl = getEnv("INTELLITESTER_TRACK_URL");
|
|
27
|
+
const trackFile = getEnv("INTELLITESTER_TRACK_FILE");
|
|
9
28
|
if (cachedTracking && cachedTracking.sessionId === sessionId && cachedTracking.trackUrl === trackUrl && cachedTracking.trackFile === trackFile) {
|
|
10
29
|
return cachedTracking;
|
|
11
30
|
}
|
|
@@ -22,7 +41,6 @@ var resolveTracking = () => {
|
|
|
22
41
|
};
|
|
23
42
|
async function track(resource) {
|
|
24
43
|
if (typeof window !== "undefined") return;
|
|
25
|
-
if (typeof process === "undefined") return;
|
|
26
44
|
const { sessionId, trackUrl, trackFile, mode } = resolveTracking();
|
|
27
45
|
if (!sessionId || mode === "none") return;
|
|
28
46
|
if (trackUrl && (mode === "http" || mode === "both")) {
|
|
@@ -40,22 +58,24 @@ async function track(resource) {
|
|
|
40
58
|
}
|
|
41
59
|
}
|
|
42
60
|
if (trackFile && (mode === "file" || mode === "both")) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
61
|
+
if (typeof process !== "undefined" && process.versions?.node) {
|
|
62
|
+
try {
|
|
63
|
+
const { appendFile } = await import('fs/promises');
|
|
64
|
+
const { existsSync } = await import('fs');
|
|
65
|
+
if (!existsSync(trackFile)) return;
|
|
66
|
+
const payload = {
|
|
67
|
+
sessionId,
|
|
68
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
69
|
+
...resource
|
|
70
|
+
};
|
|
71
|
+
await appendFile(trackFile, `${JSON.stringify(payload)}
|
|
53
72
|
`, "utf8");
|
|
54
|
-
|
|
73
|
+
} catch {
|
|
74
|
+
}
|
|
55
75
|
}
|
|
56
76
|
}
|
|
57
77
|
}
|
|
58
78
|
|
|
59
79
|
exports.track = track;
|
|
60
|
-
//# sourceMappingURL=chunk-
|
|
61
|
-
//# sourceMappingURL=chunk-
|
|
80
|
+
//# sourceMappingURL=chunk-7KTXX6EF.cjs.map
|
|
81
|
+
//# sourceMappingURL=chunk-7KTXX6EF.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/integration/index.ts"],"names":["init_cjs_shims"],"mappings":"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","file":"chunk-7KTXX6EF.cjs","sourcesContent":["/**\n * IntelliTester Integration - Track server-side resources for test cleanup\n *\n * Usage in app SSR code:\n * import { track } from 'intellitester/integration';\n *\n * // Track a database row\n * await track({ type: 'row', id: row.$id, database: 'main', table: 'users' });\n *\n * // Track a team\n * await track({ type: 'team', id: team.$id });\n *\n * // Track anything - it's just metadata for your cleanup handler\n * await track({ type: 'stripe_customer', id: customerId });\n */\n\n/**\n * Track a resource for cleanup after tests.\n * Provider-agnostic - just tracks type, id, and metadata.\n * Cleanup logic is handled by the configured provider.\n */\nexport interface TrackedResource {\n type: string; // 'row', 'team', 'file', 'user', or any custom type\n id: string; // Resource ID\n [key: string]: unknown; // Any additional metadata needed for cleanup\n}\n\n/**\n * Track a resource created in server-side code.\n * No-op if not in test mode.\n *\n * @example\n * // Track a database row\n * await track({ type: 'row', id: row.$id, database: 'main', table: 'users' });\n *\n * // Track a team\n * await track({ type: 'team', id: team.$id });\n *\n * // Track anything - it's just metadata for your cleanup handler\n * await track({ type: 'stripe_customer', id: customerId });\n */\ntype TrackingMode = 'none' | 'http' | 'file' | 'both';\n\nlet cachedTracking: {\n sessionId?: string;\n trackUrl?: string;\n trackFile?: string;\n mode: TrackingMode;\n} | null = null;\n\n/**\n * Get environment variable from multiple sources (Node.js, Cloudflare Workers, etc.)\n */\nconst getEnv = (name: string): string | undefined => {\n // Try Node.js process.env first\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n // Try globalThis (some runtimes expose env this way)\n const g = globalThis as Record<string, unknown>;\n if (g.env && typeof g.env === 'object') {\n return (g.env as Record<string, string>)[name];\n }\n // Try Deno-style\n if (typeof Deno !== 'undefined' && Deno.env) {\n try {\n return Deno.env.get(name);\n } catch {\n // Permission denied\n }\n }\n return undefined;\n};\n\n// Declare Deno for TypeScript\ndeclare const Deno: { env: { get: (name: string) => string | undefined } } | undefined;\n\nconst resolveTracking = (): {\n sessionId?: string;\n trackUrl?: string;\n trackFile?: string;\n mode: TrackingMode;\n} => {\n const sessionId = getEnv('INTELLITESTER_SESSION_ID');\n const trackUrl = getEnv('INTELLITESTER_TRACK_URL');\n const trackFile = getEnv('INTELLITESTER_TRACK_FILE');\n\n if (\n cachedTracking &&\n cachedTracking.sessionId === sessionId &&\n cachedTracking.trackUrl === trackUrl &&\n cachedTracking.trackFile === trackFile\n ) {\n return cachedTracking;\n }\n\n let mode: TrackingMode = 'none';\n if (trackUrl && trackFile) {\n mode = 'both';\n } else if (trackUrl) {\n mode = 'http';\n } else if (trackFile) {\n mode = 'file';\n }\n\n cachedTracking = { sessionId, trackUrl, trackFile, mode };\n return cachedTracking;\n};\n\nexport async function track(resource: TrackedResource): Promise<void> {\n // Only run on server (SSR), not in browser\n if (typeof window !== 'undefined') return;\n\n const { sessionId, trackUrl, trackFile, mode } = resolveTracking();\n\n if (!sessionId || mode === 'none') return;\n\n if (trackUrl && (mode === 'http' || mode === 'both')) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 1000);\n await fetch(`${trackUrl}/track`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ sessionId, ...resource }),\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n } catch {\n // Silent fail - don't break app\n }\n }\n\n // File tracking only works in Node.js environments with fs access\n if (trackFile && (mode === 'file' || mode === 'both')) {\n // Check if we're in a Node.js environment with fs access\n if (typeof process !== 'undefined' && process.versions?.node) {\n try {\n const { appendFile } = await import('node:fs/promises');\n const { existsSync } = await import('node:fs');\n if (!existsSync(trackFile)) return;\n const payload = {\n sessionId,\n createdAt: new Date().toISOString(),\n ...resource,\n };\n await appendFile(trackFile, `${JSON.stringify(payload)}\\n`, 'utf8');\n } catch {\n // Silent fail - don't break app\n }\n }\n // In non-Node.js environments (like Cloudflare Workers), file tracking is skipped\n // but HTTP tracking above should still work\n }\n}\n"]}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import { init_esm_shims } from './chunk-TM6IHTOK.js';
|
|
2
|
+
|
|
1
3
|
// src/providers/postgres/index.ts
|
|
4
|
+
init_esm_shims();
|
|
2
5
|
function createPostgresProvider(config) {
|
|
3
6
|
let client = null;
|
|
4
7
|
const methods = {
|
|
@@ -121,5 +124,5 @@ var postgresTypeMappings = {
|
|
|
121
124
|
};
|
|
122
125
|
|
|
123
126
|
export { createPostgresProvider, postgresTypeMappings };
|
|
124
|
-
//# sourceMappingURL=chunk-
|
|
125
|
-
//# sourceMappingURL=chunk-
|
|
127
|
+
//# sourceMappingURL=chunk-AZEUOP6U.js.map
|
|
128
|
+
//# sourceMappingURL=chunk-AZEUOP6U.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/postgres/index.ts"],"names":[],"mappings":"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","file":"chunk-AZEUOP6U.js","sourcesContent":["import type { CleanupProvider, CleanupHandler, CleanupUntrackedOptions, CleanupUntrackedResult } from '../../core/cleanup/types.js';\nimport type { TrackedResource } from '../../integration/index.js';\n\ninterface PostgresConfig {\n connectionString: string;\n}\n\nexport function createPostgresProvider(config: PostgresConfig): CleanupProvider {\n // Client will be lazily initialized in configure()\n let client: any = null;\n\n const methods: Record<string, CleanupHandler> = {\n deleteRow: async (resource: TrackedResource) => {\n if (!client) {\n throw new Error('Postgres client not initialized. Call configure() first.');\n }\n\n const schema = (resource.schema as string) || 'public';\n const table = resource.table as string;\n\n if (!table) {\n throw new Error(`Missing table name for row ${resource.id}`);\n }\n\n // Use parameterized query to prevent SQL injection\n await client.query(\n `DELETE FROM \"${schema}\".\"${table}\" WHERE id = $1`,\n [resource.id]\n );\n },\n\n deleteUser: async (resource: TrackedResource) => {\n if (!client) {\n throw new Error('Postgres client not initialized. Call configure() first.');\n }\n\n const table = (resource.table as string) || 'users';\n const schema = (resource.schema as string) || 'public';\n\n await client.query(\n `DELETE FROM \"${schema}\".\"${table}\" WHERE id = $1`,\n [resource.id]\n );\n },\n\n customDelete: async (resource: TrackedResource) => {\n if (!client) {\n throw new Error('Postgres client not initialized. Call configure() first.');\n }\n\n // Allow custom SQL queries via the query property\n const query = resource.query as string;\n const params = (resource.params as any[]) || [resource.id];\n\n if (!query) {\n throw new Error(`Missing query for custom delete of resource ${resource.id}`);\n }\n\n await client.query(query, params);\n },\n };\n\n async function cleanupUntracked(options: CleanupUntrackedOptions): Promise<CleanupUntrackedResult> {\n if (!client) {\n throw new Error('Postgres client not initialized. Call configure() first.');\n }\n\n const { testStartTime, userId } = options;\n const deleted: string[] = [];\n const failed: string[] = [];\n let scanned = 0;\n\n // 1. Get all tables in public schema\n const tablesResult = await client.query(`\n SELECT table_name\n FROM information_schema.tables\n WHERE table_schema = 'public'\n AND table_type = 'BASE TABLE'\n AND table_name NOT LIKE '_intellitester%'\n `);\n\n for (const row of tablesResult.rows) {\n const tableName = row.table_name;\n scanned++;\n\n // 2. Check if table has created_at and user_id columns\n const columnsResult = await client.query(`\n SELECT column_name\n FROM information_schema.columns\n WHERE table_name = $1\n `, [tableName]);\n\n const columns: string[] = columnsResult.rows.map((r: { column_name: string }) => r.column_name);\n const hasCreatedAt = columns.some(c => ['created_at', 'createdat', 'created'].includes(c.toLowerCase()));\n const userIdColumn = columns.find(c => ['user_id', 'userid', 'owner_id', 'author_id'].includes(c.toLowerCase()));\n\n if (!hasCreatedAt) continue;\n\n // 3. Build and execute delete query\n let deleteQuery = `DELETE FROM \"${tableName}\" WHERE `;\n const conditions: string[] = [];\n const params: (string | undefined)[] = [];\n\n // Add created_at condition\n const createdAtCol = columns.find(c => ['created_at', 'createdat', 'created'].includes(c.toLowerCase()));\n if (createdAtCol) {\n conditions.push(`\"${createdAtCol}\" >= $${params.length + 1}`);\n params.push(testStartTime);\n }\n\n // Add user_id condition if available\n if (userId && userIdColumn) {\n conditions.push(`\"${userIdColumn}\" = $${params.length + 1}`);\n params.push(userId);\n }\n\n if (conditions.length === 0) continue;\n\n deleteQuery += conditions.join(' AND ') + ' RETURNING id';\n\n try {\n const result = await client.query(deleteQuery, params);\n for (const deletedRow of result.rows) {\n deleted.push(`${tableName}:${deletedRow.id}`);\n }\n } catch {\n failed.push(`${tableName}:error`);\n }\n }\n\n return {\n success: failed.length === 0,\n scanned,\n deleted,\n failed,\n };\n }\n\n return {\n name: 'postgres',\n async configure() {\n try {\n // Dynamic import since pg is an optional dependency\n // @ts-expect-error - pg is an optional peer dependency\n const pg = await import('pg');\n const Client = pg.Client || pg.default?.Client;\n client = new Client({ connectionString: config.connectionString });\n await client.connect();\n } catch {\n throw new Error(\n 'Failed to initialize Postgres client. Make sure the \"pg\" package is installed: npm install pg'\n );\n }\n },\n methods,\n cleanupUntracked,\n };\n}\n\n// Default type mappings for Postgres resources\nexport const postgresTypeMappings: Record<string, string> = {\n row: 'postgres.deleteRow',\n user: 'postgres.deleteUser',\n custom: 'postgres.customDelete',\n};\n"]}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var chunkE7I5EAST_cjs = require('./chunk-E7I5EAST.cjs');
|
|
4
|
+
|
|
3
5
|
// src/providers/postgres/index.ts
|
|
6
|
+
chunkE7I5EAST_cjs.init_cjs_shims();
|
|
4
7
|
function createPostgresProvider(config) {
|
|
5
8
|
let client = null;
|
|
6
9
|
const methods = {
|
|
@@ -124,5 +127,5 @@ var postgresTypeMappings = {
|
|
|
124
127
|
|
|
125
128
|
exports.createPostgresProvider = createPostgresProvider;
|
|
126
129
|
exports.postgresTypeMappings = postgresTypeMappings;
|
|
127
|
-
//# sourceMappingURL=chunk-
|
|
128
|
-
//# sourceMappingURL=chunk-
|
|
130
|
+
//# sourceMappingURL=chunk-DISSZD7X.cjs.map
|
|
131
|
+
//# sourceMappingURL=chunk-DISSZD7X.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/postgres/index.ts"],"names":["init_cjs_shims"],"mappings":"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","file":"chunk-DISSZD7X.cjs","sourcesContent":["import type { CleanupProvider, CleanupHandler, CleanupUntrackedOptions, CleanupUntrackedResult } from '../../core/cleanup/types.js';\nimport type { TrackedResource } from '../../integration/index.js';\n\ninterface PostgresConfig {\n connectionString: string;\n}\n\nexport function createPostgresProvider(config: PostgresConfig): CleanupProvider {\n // Client will be lazily initialized in configure()\n let client: any = null;\n\n const methods: Record<string, CleanupHandler> = {\n deleteRow: async (resource: TrackedResource) => {\n if (!client) {\n throw new Error('Postgres client not initialized. Call configure() first.');\n }\n\n const schema = (resource.schema as string) || 'public';\n const table = resource.table as string;\n\n if (!table) {\n throw new Error(`Missing table name for row ${resource.id}`);\n }\n\n // Use parameterized query to prevent SQL injection\n await client.query(\n `DELETE FROM \"${schema}\".\"${table}\" WHERE id = $1`,\n [resource.id]\n );\n },\n\n deleteUser: async (resource: TrackedResource) => {\n if (!client) {\n throw new Error('Postgres client not initialized. Call configure() first.');\n }\n\n const table = (resource.table as string) || 'users';\n const schema = (resource.schema as string) || 'public';\n\n await client.query(\n `DELETE FROM \"${schema}\".\"${table}\" WHERE id = $1`,\n [resource.id]\n );\n },\n\n customDelete: async (resource: TrackedResource) => {\n if (!client) {\n throw new Error('Postgres client not initialized. Call configure() first.');\n }\n\n // Allow custom SQL queries via the query property\n const query = resource.query as string;\n const params = (resource.params as any[]) || [resource.id];\n\n if (!query) {\n throw new Error(`Missing query for custom delete of resource ${resource.id}`);\n }\n\n await client.query(query, params);\n },\n };\n\n async function cleanupUntracked(options: CleanupUntrackedOptions): Promise<CleanupUntrackedResult> {\n if (!client) {\n throw new Error('Postgres client not initialized. Call configure() first.');\n }\n\n const { testStartTime, userId } = options;\n const deleted: string[] = [];\n const failed: string[] = [];\n let scanned = 0;\n\n // 1. Get all tables in public schema\n const tablesResult = await client.query(`\n SELECT table_name\n FROM information_schema.tables\n WHERE table_schema = 'public'\n AND table_type = 'BASE TABLE'\n AND table_name NOT LIKE '_intellitester%'\n `);\n\n for (const row of tablesResult.rows) {\n const tableName = row.table_name;\n scanned++;\n\n // 2. Check if table has created_at and user_id columns\n const columnsResult = await client.query(`\n SELECT column_name\n FROM information_schema.columns\n WHERE table_name = $1\n `, [tableName]);\n\n const columns: string[] = columnsResult.rows.map((r: { column_name: string }) => r.column_name);\n const hasCreatedAt = columns.some(c => ['created_at', 'createdat', 'created'].includes(c.toLowerCase()));\n const userIdColumn = columns.find(c => ['user_id', 'userid', 'owner_id', 'author_id'].includes(c.toLowerCase()));\n\n if (!hasCreatedAt) continue;\n\n // 3. Build and execute delete query\n let deleteQuery = `DELETE FROM \"${tableName}\" WHERE `;\n const conditions: string[] = [];\n const params: (string | undefined)[] = [];\n\n // Add created_at condition\n const createdAtCol = columns.find(c => ['created_at', 'createdat', 'created'].includes(c.toLowerCase()));\n if (createdAtCol) {\n conditions.push(`\"${createdAtCol}\" >= $${params.length + 1}`);\n params.push(testStartTime);\n }\n\n // Add user_id condition if available\n if (userId && userIdColumn) {\n conditions.push(`\"${userIdColumn}\" = $${params.length + 1}`);\n params.push(userId);\n }\n\n if (conditions.length === 0) continue;\n\n deleteQuery += conditions.join(' AND ') + ' RETURNING id';\n\n try {\n const result = await client.query(deleteQuery, params);\n for (const deletedRow of result.rows) {\n deleted.push(`${tableName}:${deletedRow.id}`);\n }\n } catch {\n failed.push(`${tableName}:error`);\n }\n }\n\n return {\n success: failed.length === 0,\n scanned,\n deleted,\n failed,\n };\n }\n\n return {\n name: 'postgres',\n async configure() {\n try {\n // Dynamic import since pg is an optional dependency\n // @ts-expect-error - pg is an optional peer dependency\n const pg = await import('pg');\n const Client = pg.Client || pg.default?.Client;\n client = new Client({ connectionString: config.connectionString });\n await client.connect();\n } catch {\n throw new Error(\n 'Failed to initialize Postgres client. Make sure the \"pg\" package is installed: npm install pg'\n );\n }\n },\n methods,\n cleanupUntracked,\n };\n}\n\n// Default type mappings for Postgres resources\nexport const postgresTypeMappings: Record<string, string> = {\n row: 'postgres.deleteRow',\n user: 'postgres.deleteUser',\n custom: 'postgres.customDelete',\n};\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
5
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
6
|
+
}) : x)(function(x) {
|
|
7
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
8
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
9
|
+
});
|
|
10
|
+
var __esm = (fn, res) => function __init() {
|
|
11
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
12
|
+
};
|
|
13
|
+
var __commonJS = (cb, mod) => function __require2() {
|
|
14
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// node_modules/.pnpm/tsup@8.5.1_postcss@8.5.6_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js
|
|
18
|
+
var init_cjs_shims = __esm({
|
|
19
|
+
"node_modules/.pnpm/tsup@8.5.1_postcss@8.5.6_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js"() {
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
exports.__commonJS = __commonJS;
|
|
24
|
+
exports.__require = __require;
|
|
25
|
+
exports.init_cjs_shims = init_cjs_shims;
|
|
26
|
+
//# sourceMappingURL=chunk-E7I5EAST.cjs.map
|
|
27
|
+
//# sourceMappingURL=chunk-E7I5EAST.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../node_modules/.pnpm/tsup@8.5.1_postcss@8.5.6_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+GAAA,GAAA;AAAA,EAAA;AAAA,CAAA","file":"chunk-E7I5EAST.cjs","sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n"]}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import { init_esm_shims } from './chunk-TM6IHTOK.js';
|
|
2
|
+
|
|
1
3
|
// src/providers/mysql/index.ts
|
|
4
|
+
init_esm_shims();
|
|
2
5
|
function createMysqlProvider(config) {
|
|
3
6
|
let connection = null;
|
|
4
7
|
const methods = {
|
|
@@ -129,5 +132,5 @@ var mysqlTypeMappings = {
|
|
|
129
132
|
};
|
|
130
133
|
|
|
131
134
|
export { createMysqlProvider, mysqlTypeMappings };
|
|
132
|
-
//# sourceMappingURL=chunk-
|
|
133
|
-
//# sourceMappingURL=chunk-
|
|
135
|
+
//# sourceMappingURL=chunk-EEJIIJEG.js.map
|
|
136
|
+
//# sourceMappingURL=chunk-EEJIIJEG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/mysql/index.ts"],"names":[],"mappings":"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","file":"chunk-EEJIIJEG.js","sourcesContent":["import type { CleanupProvider, CleanupHandler, CleanupUntrackedOptions, CleanupUntrackedResult } from '../../core/cleanup/types.js';\nimport type { TrackedResource } from '../../integration/index.js';\n\ninterface MysqlConfig {\n host: string;\n port?: number;\n user: string;\n password: string;\n database: string;\n}\n\nexport function createMysqlProvider(config: MysqlConfig): CleanupProvider {\n // Connection will be lazily initialized in configure()\n let connection: any = null;\n\n const methods: Record<string, CleanupHandler> = {\n deleteRow: async (resource: TrackedResource) => {\n if (!connection) {\n throw new Error('MySQL connection not initialized. Call configure() first.');\n }\n\n const table = resource.table as string;\n const database = (resource.database as string) || config.database;\n\n if (!table) {\n throw new Error(`Missing table name for row ${resource.id}`);\n }\n\n // Use parameterized query to prevent SQL injection\n await connection.execute(\n `DELETE FROM \\`${database}\\`.\\`${table}\\` WHERE id = ?`,\n [resource.id]\n );\n },\n\n deleteUser: async (resource: TrackedResource) => {\n if (!connection) {\n throw new Error('MySQL connection not initialized. Call configure() first.');\n }\n\n const table = (resource.table as string) || 'users';\n const database = (resource.database as string) || config.database;\n\n await connection.execute(\n `DELETE FROM \\`${database}\\`.\\`${table}\\` WHERE id = ?`,\n [resource.id]\n );\n },\n\n customDelete: async (resource: TrackedResource) => {\n if (!connection) {\n throw new Error('MySQL connection not initialized. Call configure() first.');\n }\n\n // Allow custom SQL queries via the query property\n const query = resource.query as string;\n const params = (resource.params as any[]) || [resource.id];\n\n if (!query) {\n throw new Error(`Missing query for custom delete of resource ${resource.id}`);\n }\n\n await connection.execute(query, params);\n },\n };\n\n async function cleanupUntracked(options: CleanupUntrackedOptions): Promise<CleanupUntrackedResult> {\n if (!connection) {\n throw new Error('MySQL connection not initialized. Call configure() first.');\n }\n\n const { testStartTime, userId } = options;\n const deleted: string[] = [];\n const failed: string[] = [];\n let scanned = 0;\n\n // 1. Get all tables in the database\n const [tablesRows] = await connection.execute(`\n SELECT TABLE_NAME as table_name\n FROM INFORMATION_SCHEMA.TABLES\n WHERE TABLE_SCHEMA = ?\n AND TABLE_TYPE = 'BASE TABLE'\n AND TABLE_NAME NOT LIKE '_intellitester%'\n `, [config.database]);\n\n for (const row of tablesRows as { table_name: string }[]) {\n const tableName = row.table_name;\n scanned++;\n\n // 2. Check if table has created_at and user_id columns\n const [columnsRows] = await connection.execute(`\n SELECT COLUMN_NAME as column_name\n FROM INFORMATION_SCHEMA.COLUMNS\n WHERE TABLE_SCHEMA = ?\n AND TABLE_NAME = ?\n `, [config.database, tableName]);\n\n const columns: string[] = (columnsRows as { column_name: string }[]).map(r => r.column_name);\n const hasCreatedAt = columns.some(c => ['created_at', 'createdat', 'created'].includes(c.toLowerCase()));\n const userIdColumn = columns.find(c => ['user_id', 'userid', 'owner_id', 'author_id'].includes(c.toLowerCase()));\n\n if (!hasCreatedAt) continue;\n\n // 3. Find the created_at column name\n const createdAtCol = columns.find(c => ['created_at', 'createdat', 'created'].includes(c.toLowerCase()));\n if (!createdAtCol) continue;\n\n // 4. First, select rows to be deleted (MySQL doesn't have RETURNING)\n let selectQuery = `SELECT id FROM \\`${tableName}\\` WHERE `;\n const conditions: string[] = [];\n const params: (string | undefined)[] = [];\n\n // Add created_at condition\n conditions.push(`\\`${createdAtCol}\\` >= ?`);\n params.push(testStartTime);\n\n // Add user_id condition if available\n if (userId && userIdColumn) {\n conditions.push(`\\`${userIdColumn}\\` = ?`);\n params.push(userId);\n }\n\n selectQuery += conditions.join(' AND ');\n\n try {\n // Get IDs of rows to be deleted\n const [rowsToDelete] = await connection.execute(selectQuery, params);\n const idsToDelete = (rowsToDelete as { id: string | number }[]).map(r => r.id);\n\n if (idsToDelete.length === 0) continue;\n\n // Delete the rows\n const deleteQuery = `DELETE FROM \\`${tableName}\\` WHERE ` + conditions.join(' AND ');\n await connection.execute(deleteQuery, params);\n\n // Record deleted IDs\n for (const id of idsToDelete) {\n deleted.push(`${tableName}:${id}`);\n }\n } catch {\n failed.push(`${tableName}:error`);\n }\n }\n\n return {\n success: failed.length === 0,\n scanned,\n deleted,\n failed,\n };\n }\n\n return {\n name: 'mysql',\n async configure() {\n try {\n // Dynamic import since mysql2 is an optional dependency\n // @ts-expect-error - mysql2 is an optional peer dependency\n const mysql = await import('mysql2/promise');\n const createConnection = mysql.createConnection || mysql.default?.createConnection;\n connection = await createConnection({\n host: config.host,\n port: config.port || 3306,\n user: config.user,\n password: config.password,\n database: config.database,\n });\n } catch {\n throw new Error(\n 'Failed to initialize MySQL connection. Make sure the \"mysql2\" package is installed: npm install mysql2'\n );\n }\n },\n methods,\n cleanupUntracked,\n };\n}\n\n// Default type mappings for MySQL resources\nexport const mysqlTypeMappings: Record<string, string> = {\n row: 'mysql.deleteRow',\n user: 'mysql.deleteUser',\n custom: 'mysql.customDelete',\n};\n"]}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import { init_esm_shims } from './chunk-TM6IHTOK.js';
|
|
2
|
+
|
|
1
3
|
// src/providers/sqlite/index.ts
|
|
4
|
+
init_esm_shims();
|
|
2
5
|
function createSqliteProvider(config) {
|
|
3
6
|
let db = null;
|
|
4
7
|
const methods = {
|
|
@@ -38,7 +41,7 @@ function createSqliteProvider(config) {
|
|
|
38
41
|
name: "sqlite",
|
|
39
42
|
async configure() {
|
|
40
43
|
try {
|
|
41
|
-
const DatabaseModule = await import('
|
|
44
|
+
const DatabaseModule = await import('./lib-NRYY4REB.js');
|
|
42
45
|
const Database = DatabaseModule.default || DatabaseModule;
|
|
43
46
|
db = new Database(config.database, {
|
|
44
47
|
readonly: config.readonly || false
|
|
@@ -59,5 +62,5 @@ var sqliteTypeMappings = {
|
|
|
59
62
|
};
|
|
60
63
|
|
|
61
64
|
export { createSqliteProvider, sqliteTypeMappings };
|
|
62
|
-
//# sourceMappingURL=chunk-
|
|
63
|
-
//# sourceMappingURL=chunk-
|
|
65
|
+
//# sourceMappingURL=chunk-EHRUD6JS.js.map
|
|
66
|
+
//# sourceMappingURL=chunk-EHRUD6JS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/sqlite/index.ts"],"names":[],"mappings":";;;AAAA,cAAA,EAAA;AAQO,SAAS,qBAAqB,MAAA,EAAuC;AAE1E,EAAA,IAAI,EAAA,GAAU,IAAA;AAEd,EAAA,MAAM,OAAA,GAA0C;AAAA,IAC9C,SAAA,EAAW,OAAO,QAAA,KAA8B;AAC9C,MAAA,IAAI,CAAC,EAAA,EAAI;AACP,QAAA,MAAM,IAAI,MAAM,0DAA0D,CAAA;AAAA,MAC5E;AAEA,MAAA,MAAM,QAAQ,QAAA,CAAS,KAAA;AAEvB,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,QAAA,CAAS,EAAE,CAAA,CAAE,CAAA;AAAA,MAC7D;AAGA,MAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,CAAA,YAAA,EAAe,KAAK,CAAA,aAAA,CAAe,CAAA;AAC3D,MAAA,IAAA,CAAK,GAAA,CAAI,SAAS,EAAE,CAAA;AAAA,IACtB,CAAA;AAAA,IAEA,UAAA,EAAY,OAAO,QAAA,KAA8B;AAC/C,MAAA,IAAI,CAAC,EAAA,EAAI;AACP,QAAA,MAAM,IAAI,MAAM,0DAA0D,CAAA;AAAA,MAC5E;AAEA,MAAA,MAAM,KAAA,GAAS,SAAS,KAAA,IAAoB,OAAA;AAE5C,MAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,CAAA,YAAA,EAAe,KAAK,CAAA,aAAA,CAAe,CAAA;AAC3D,MAAA,IAAA,CAAK,GAAA,CAAI,SAAS,EAAE,CAAA;AAAA,IACtB,CAAA;AAAA,IAEA,YAAA,EAAc,OAAO,QAAA,KAA8B;AACjD,MAAA,IAAI,CAAC,EAAA,EAAI;AACP,QAAA,MAAM,IAAI,MAAM,0DAA0D,CAAA;AAAA,MAC5E;AAGA,MAAA,MAAM,QAAQ,QAAA,CAAS,KAAA;AACvB,MAAA,MAAM,MAAA,GAAU,QAAA,CAAS,MAAA,IAAoB,CAAC,SAAS,EAAE,CAAA;AAEzD,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4CAAA,EAA+C,QAAA,CAAS,EAAE,CAAA,CAAE,CAAA;AAAA,MAC9E;AAEA,MAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,KAAK,CAAA;AAC7B,MAAA,IAAA,CAAK,GAAA,CAAI,GAAG,MAAM,CAAA;AAAA,IACpB;AAAA,GACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,MAAM,SAAA,GAAY;AAChB,MAAA,IAAI;AAEF,QAAA,MAAM,cAAA,GAAiB,MAAM,OAAO,mBAAgB,CAAA;AACpD,QAAA,MAAM,QAAA,GAAW,eAAe,OAAA,IAAW,cAAA;AAC3C,QAAA,EAAA,GAAK,IAAI,QAAA,CAAS,MAAA,CAAO,QAAA,EAAU;AAAA,UACjC,QAAA,EAAU,OAAO,QAAA,IAAY;AAAA,SAC9B,CAAA;AAAA,MACH,CAAA,CAAA,MAAQ;AACN,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA;AAAA,GACF;AACF;AAGO,IAAM,kBAAA,GAA6C;AAAA,EACxD,GAAA,EAAK,kBAAA;AAAA,EACL,IAAA,EAAM,mBAAA;AAAA,EACN,MAAA,EAAQ;AACV","file":"chunk-EHRUD6JS.js","sourcesContent":["import type { CleanupProvider, CleanupHandler } from '../../core/cleanup/types.js';\nimport type { TrackedResource } from '../../integration/index.js';\n\ninterface SqliteConfig {\n database: string; // Path to the SQLite database file\n readonly?: boolean;\n}\n\nexport function createSqliteProvider(config: SqliteConfig): CleanupProvider {\n // Database will be lazily initialized in configure()\n let db: any = null;\n\n const methods: Record<string, CleanupHandler> = {\n deleteRow: async (resource: TrackedResource) => {\n if (!db) {\n throw new Error('SQLite database not initialized. Call configure() first.');\n }\n\n const table = resource.table as string;\n\n if (!table) {\n throw new Error(`Missing table name for row ${resource.id}`);\n }\n\n // Use parameterized query to prevent SQL injection\n const stmt = db.prepare(`DELETE FROM ${table} WHERE id = ?`);\n stmt.run(resource.id);\n },\n\n deleteUser: async (resource: TrackedResource) => {\n if (!db) {\n throw new Error('SQLite database not initialized. Call configure() first.');\n }\n\n const table = (resource.table as string) || 'users';\n\n const stmt = db.prepare(`DELETE FROM ${table} WHERE id = ?`);\n stmt.run(resource.id);\n },\n\n customDelete: async (resource: TrackedResource) => {\n if (!db) {\n throw new Error('SQLite database not initialized. Call configure() first.');\n }\n\n // Allow custom SQL queries via the query property\n const query = resource.query as string;\n const params = (resource.params as any[]) || [resource.id];\n\n if (!query) {\n throw new Error(`Missing query for custom delete of resource ${resource.id}`);\n }\n\n const stmt = db.prepare(query);\n stmt.run(...params);\n },\n };\n\n return {\n name: 'sqlite',\n async configure() {\n try {\n // Dynamic import since better-sqlite3 is an optional dependency\n const DatabaseModule = await import('better-sqlite3');\n const Database = DatabaseModule.default || DatabaseModule;\n db = new Database(config.database, {\n readonly: config.readonly || false,\n });\n } catch {\n throw new Error(\n 'Failed to initialize SQLite database. Make sure the \"better-sqlite3\" package is installed: npm install better-sqlite3'\n );\n }\n },\n methods,\n };\n}\n\n// Default type mappings for SQLite resources\nexport const sqliteTypeMappings: Record<string, string> = {\n row: 'sqlite.deleteRow',\n user: 'sqlite.deleteUser',\n custom: 'sqlite.customDelete',\n};\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var chunkE7I5EAST_cjs = require('./chunk-E7I5EAST.cjs');
|
|
3
4
|
var fs = require('fs/promises');
|
|
4
5
|
var yaml = require('yaml');
|
|
5
6
|
var zod = require('zod');
|
|
@@ -9,6 +10,10 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
|
9
10
|
var fs__default = /*#__PURE__*/_interopDefault(fs);
|
|
10
11
|
|
|
11
12
|
// src/core/loader.ts
|
|
13
|
+
chunkE7I5EAST_cjs.init_cjs_shims();
|
|
14
|
+
|
|
15
|
+
// src/core/schema.ts
|
|
16
|
+
chunkE7I5EAST_cjs.init_cjs_shims();
|
|
12
17
|
var nonEmptyString = zod.z.string().trim().min(1, "Value cannot be empty");
|
|
13
18
|
zod.z.preprocess(
|
|
14
19
|
(val) => typeof val === "string" && val.trim() === "" ? void 0 : val,
|
|
@@ -393,6 +398,9 @@ var IntellitesterConfigSchema = zod.z.object({
|
|
|
393
398
|
preview: previewConfigSchema.optional(),
|
|
394
399
|
secrets: zod.z.record(zod.z.string(), zod.z.string().trim()).optional().describe("Secret values that can be referenced in tests")
|
|
395
400
|
}).describe("Global configuration file for IntelliTester");
|
|
401
|
+
|
|
402
|
+
// src/core/workflowSchema.ts
|
|
403
|
+
chunkE7I5EAST_cjs.init_cjs_shims();
|
|
396
404
|
var nonEmptyString2 = zod.z.string().trim().min(1, "Value cannot be empty");
|
|
397
405
|
var testReferenceSchema = zod.z.object({
|
|
398
406
|
file: nonEmptyString2.describe("Path to the test file relative to the workflow file"),
|
|
@@ -449,6 +457,9 @@ var WorkflowDefinitionSchema = zod.z.object({
|
|
|
449
457
|
continueOnFailure: zod.z.boolean().default(false).describe("Continue running subsequent tests even if a test fails"),
|
|
450
458
|
tests: zod.z.array(testReferenceSchema).min(1, "Workflow must contain at least one test").describe("List of test files to execute in this workflow")
|
|
451
459
|
}).describe("Schema for IntelliTester workflow files that orchestrate multiple tests");
|
|
460
|
+
|
|
461
|
+
// src/core/pipelineSchema.ts
|
|
462
|
+
chunkE7I5EAST_cjs.init_cjs_shims();
|
|
452
463
|
var nonEmptyString3 = zod.z.string().trim().min(1, "Value cannot be empty");
|
|
453
464
|
var workflowReferenceSchema = zod.z.object({
|
|
454
465
|
file: nonEmptyString3.describe("Path to the workflow file"),
|
|
@@ -637,5 +648,5 @@ exports.parsePipelineDefinition = parsePipelineDefinition;
|
|
|
637
648
|
exports.parseTestDefinition = parseTestDefinition;
|
|
638
649
|
exports.parseWorkflowDefinition = parseWorkflowDefinition;
|
|
639
650
|
exports.previewConfigSchema = previewConfigSchema;
|
|
640
|
-
//# sourceMappingURL=chunk-
|
|
641
|
-
//# sourceMappingURL=chunk-
|
|
651
|
+
//# sourceMappingURL=chunk-ILXQMJBC.cjs.map
|
|
652
|
+
//# sourceMappingURL=chunk-ILXQMJBC.cjs.map
|