intellitester 0.4.5 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-E7I5EAST.cjs → chunk-2BIP4BAK.cjs} +4 -4
- package/dist/chunk-2BIP4BAK.cjs.map +1 -0
- package/dist/{chunk-QHHY44MH.cjs → chunk-2F5ZF34M.cjs} +4 -4
- package/dist/{chunk-QHHY44MH.cjs.map → chunk-2F5ZF34M.cjs.map} +1 -1
- package/dist/{chunk-XRDD26DA.js → chunk-3LE4HBUY.js} +3 -3
- package/dist/{chunk-XRDD26DA.js.map → chunk-3LE4HBUY.js.map} +1 -1
- package/dist/{chunk-QBEAPUBU.cjs → chunk-4TWSU6GG.cjs} +4 -4
- package/dist/{chunk-QBEAPUBU.cjs.map → chunk-4TWSU6GG.cjs.map} +1 -1
- package/dist/{chunk-OOQRSVXP.js → chunk-5UXMYHBP.js} +372 -490
- package/dist/chunk-5UXMYHBP.js.map +1 -0
- package/dist/{chunk-EEJIIJEG.js → chunk-CYBNGNEZ.js} +3 -3
- package/dist/{chunk-EEJIIJEG.js.map → chunk-CYBNGNEZ.js.map} +1 -1
- package/dist/{chunk-7KTXX6EF.cjs → chunk-D27C3RW6.cjs} +4 -4
- package/dist/{chunk-7KTXX6EF.cjs.map → chunk-D27C3RW6.cjs.map} +1 -1
- package/dist/{chunk-MPEOMHAW.js → chunk-HQCDQM5J.js} +67 -11
- package/dist/chunk-HQCDQM5J.js.map +1 -0
- package/dist/{chunk-EHRUD6JS.js → chunk-KONPTCVG.js} +4 -4
- package/dist/{chunk-EHRUD6JS.js.map → chunk-KONPTCVG.js.map} +1 -1
- package/dist/{chunk-MVFZZF3J.cjs → chunk-NZOA4VT7.cjs} +5 -5
- package/dist/{chunk-MVFZZF3J.cjs.map → chunk-NZOA4VT7.cjs.map} +1 -1
- package/dist/chunk-P5B2HYYW.cjs +38 -0
- package/dist/{chunk-7JUP6HRD.cjs.map → chunk-P5B2HYYW.cjs.map} +1 -1
- package/dist/{chunk-DISSZD7X.cjs → chunk-Q42O37U6.cjs} +4 -4
- package/dist/{chunk-DISSZD7X.cjs.map → chunk-Q42O37U6.cjs.map} +1 -1
- package/dist/{chunk-JN4VROOX.cjs → chunk-R63O6KB7.cjs} +12 -12
- package/dist/{chunk-JN4VROOX.cjs.map → chunk-R63O6KB7.cjs.map} +1 -1
- package/dist/{chunk-4P2XW7LQ.js → chunk-R6R55OTZ.js} +4 -4
- package/dist/{chunk-4P2XW7LQ.js.map → chunk-R6R55OTZ.js.map} +1 -1
- package/dist/{chunk-TM6IHTOK.js → chunk-RXXJEYXO.js} +3 -3
- package/dist/chunk-RXXJEYXO.js.map +1 -0
- package/dist/{chunk-7ALNM3DK.js → chunk-TRSDFFXF.js} +7 -7
- package/dist/{chunk-7ALNM3DK.js.map → chunk-TRSDFFXF.js.map} +1 -1
- package/dist/{chunk-AZEUOP6U.js → chunk-UVYXW5KC.js} +3 -3
- package/dist/{chunk-AZEUOP6U.js.map → chunk-UVYXW5KC.js.map} +1 -1
- package/dist/{chunk-XINWSJFM.js → chunk-VZ5S7MN6.js} +3 -3
- package/dist/{chunk-XINWSJFM.js.map → chunk-VZ5S7MN6.js.map} +1 -1
- package/dist/{chunk-7KERJPT3.cjs → chunk-XTKHWRRW.cjs} +71 -14
- package/dist/chunk-XTKHWRRW.cjs.map +1 -0
- package/dist/{chunk-GNCJLEBY.cjs → chunk-YRMXHDRW.cjs} +415 -532
- package/dist/chunk-YRMXHDRW.cjs.map +1 -0
- package/dist/cli/index.cjs +191 -120
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +139 -68
- package/dist/cli/index.js.map +1 -1
- package/dist/core/cleanup/index.cjs +15 -15
- package/dist/core/cleanup/index.js +7 -7
- package/dist/index.cjs +50 -46
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +75 -89
- package/dist/index.d.ts +75 -89
- package/dist/index.js +10 -10
- package/dist/index.js.map +1 -1
- package/dist/integration/index.cjs +3 -3
- package/dist/integration/index.js +2 -2
- package/dist/{lib-NRYY4REB.js → lib-B67ADJDZ.js} +5 -5
- package/dist/{lib-NRYY4REB.js.map → lib-B67ADJDZ.js.map} +1 -1
- package/dist/{lib-KZ7G5BWI.cjs → lib-KK2OS66I.cjs} +45 -45
- package/dist/{lib-KZ7G5BWI.cjs.map → lib-KK2OS66I.cjs.map} +1 -1
- package/dist/{loader-5F4K7EDA.cjs → loader-255ANISS.cjs} +17 -17
- package/dist/{loader-5F4K7EDA.cjs.map → loader-255ANISS.cjs.map} +1 -1
- package/dist/{loader-RUMGQZ5A.js → loader-QSZ5TJOI.js} +4 -4
- package/dist/{loader-RUMGQZ5A.js.map → loader-QSZ5TJOI.js.map} +1 -1
- package/dist/providers/appwrite/index.cjs +4 -4
- package/dist/providers/appwrite/index.js +2 -2
- package/dist/providers/index.cjs +18 -18
- package/dist/providers/index.js +6 -6
- package/dist/providers/mysql/index.cjs +4 -4
- package/dist/providers/mysql/index.js +2 -2
- package/dist/providers/postgres/index.cjs +4 -4
- package/dist/providers/postgres/index.js +2 -2
- package/dist/providers/sqlite/index.cjs +4 -4
- package/dist/providers/sqlite/index.js +2 -2
- package/package.json +3 -5
- package/schemas/intellitester.config.schema.json +54 -21
- package/schemas/pipeline.schema.json +43 -10
- package/schemas/test.schema.json +8589 -780
- package/schemas/workflow.schema.json +51 -8
- package/dist/chunk-7JUP6HRD.cjs +0 -38
- package/dist/chunk-7KERJPT3.cjs.map +0 -1
- package/dist/chunk-E7I5EAST.cjs.map +0 -1
- package/dist/chunk-GNCJLEBY.cjs.map +0 -1
- package/dist/chunk-MPEOMHAW.js.map +0 -1
- package/dist/chunk-OOQRSVXP.js.map +0 -1
- package/dist/chunk-TM6IHTOK.js.map +0 -1
|
@@ -14,14 +14,14 @@ var __commonJS = (cb, mod) => function __require2() {
|
|
|
14
14
|
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
15
15
|
};
|
|
16
16
|
|
|
17
|
-
// node_modules/.pnpm/tsup@8.5.1_postcss@8.5.
|
|
17
|
+
// node_modules/.pnpm/tsup@8.5.1_postcss@8.5.6_tsx@4.22.1_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js
|
|
18
18
|
var init_cjs_shims = __esm({
|
|
19
|
-
"node_modules/.pnpm/tsup@8.5.1_postcss@8.5.
|
|
19
|
+
"node_modules/.pnpm/tsup@8.5.1_postcss@8.5.6_tsx@4.22.1_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js"() {
|
|
20
20
|
}
|
|
21
21
|
});
|
|
22
22
|
|
|
23
23
|
exports.__commonJS = __commonJS;
|
|
24
24
|
exports.__require = __require;
|
|
25
25
|
exports.init_cjs_shims = init_cjs_shims;
|
|
26
|
-
//# sourceMappingURL=chunk-
|
|
27
|
-
//# sourceMappingURL=chunk-
|
|
26
|
+
//# sourceMappingURL=chunk-2BIP4BAK.cjs.map
|
|
27
|
+
//# sourceMappingURL=chunk-2BIP4BAK.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../node_modules/.pnpm/tsup@8.5.1_postcss@8.5.6_tsx@4.22.1_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,0HAAA,GAAA;AAAA,EAAA;AAAA,CAAA","file":"chunk-2BIP4BAK.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,10 +1,10 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunk2BIP4BAK_cjs = require('./chunk-2BIP4BAK.cjs');
|
|
4
4
|
var nodeAppwrite = require('node-appwrite');
|
|
5
5
|
|
|
6
6
|
// src/providers/appwrite/index.ts
|
|
7
|
-
|
|
7
|
+
chunk2BIP4BAK_cjs.init_cjs_shims();
|
|
8
8
|
function createAppwriteProvider(config) {
|
|
9
9
|
const client = new nodeAppwrite.Client().setEndpoint(config.endpoint).setProject(config.projectId).setKey(config.apiKey);
|
|
10
10
|
const tablesDB = new nodeAppwrite.TablesDB(client);
|
|
@@ -460,5 +460,5 @@ var appwriteTypeMappings = {
|
|
|
460
460
|
|
|
461
461
|
exports.appwriteTypeMappings = appwriteTypeMappings;
|
|
462
462
|
exports.createAppwriteProvider = createAppwriteProvider;
|
|
463
|
-
//# sourceMappingURL=chunk-
|
|
464
|
-
//# sourceMappingURL=chunk-
|
|
463
|
+
//# sourceMappingURL=chunk-2F5ZF34M.cjs.map
|
|
464
|
+
//# sourceMappingURL=chunk-2F5ZF34M.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/providers/appwrite/index.ts"],"names":["init_cjs_shims","Client","TablesDB","Storage","Teams","Users","Query"],"mappings":"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","file":"chunk-QHHY44MH.cjs","sourcesContent":["import { Client, Users, TablesDB, Storage, Teams, Query } from 'node-appwrite';\nimport type {\n CleanupProvider,\n CleanupHandler,\n CleanupUntrackedOptions,\n CleanupUntrackedResult,\n} from '../../core/cleanup/types.js';\nimport type { TrackedResource } from '../../integration/index.js';\n\ninterface AppwriteConfig {\n endpoint: string;\n projectId: string;\n apiKey: string;\n}\n\nexport function createAppwriteProvider(config: AppwriteConfig): CleanupProvider {\n const client = new Client()\n .setEndpoint(config.endpoint)\n .setProject(config.projectId)\n .setKey(config.apiKey);\n\n const tablesDB = new TablesDB(client);\n const storage = new Storage(client);\n const teams = new Teams(client);\n const users = new Users(client);\n\n const methods: Record<string, CleanupHandler> = {\n deleteRow: async (resource: TrackedResource) => {\n const databaseId = resource.databaseId as string;\n const tableId = resource.tableId as string;\n\n if (!databaseId || !tableId) {\n throw new Error(`Missing databaseId or tableId for row ${resource.id}`);\n }\n\n await tablesDB.deleteRow({\n databaseId,\n tableId,\n rowId: resource.id,\n });\n },\n\n deleteFile: async (resource: TrackedResource) => {\n const bucketId = resource.bucketId as string;\n\n if (!bucketId) {\n throw new Error(`Missing bucketId for file ${resource.id}`);\n }\n\n await storage.deleteFile(bucketId, resource.id);\n },\n\n deleteTeam: async (resource: TrackedResource) => {\n await teams.delete(resource.id);\n },\n\n deleteUser: async (resource: TrackedResource) => {\n await users.delete(resource.id);\n },\n\n deleteMembership: async (resource: TrackedResource) => {\n const teamId = resource.teamId as string;\n\n if (!teamId) {\n throw new Error(`Missing teamId for membership ${resource.id}`);\n }\n\n await teams.deleteMembership(teamId, resource.id);\n },\n };\n\n /**\n * Scan all Appwrite tables for resources created after testStartTime\n * that contain the userId in any field, and delete them.\n */\n async function cleanupUntracked(\n options: CleanupUntrackedOptions\n ): Promise<CleanupUntrackedResult> {\n const {\n testStartTime,\n testStartTimeProvided,\n userId: providedUserId,\n userEmail,\n sessionId,\n } = options;\n const deleted: string[] = [];\n const failed: string[] = [];\n let scanned = 0;\n let userId = providedUserId;\n let effectiveTestStartTime = testStartTime;\n let resolvedUserCreatedAt: string | undefined;\n\n const normalizePermissions = (permissions: unknown): string[] => {\n if (!Array.isArray(permissions)) return [];\n return permissions.filter((entry): entry is string => typeof entry === 'string');\n };\n\n const permissionHasPrincipal = (permission: string, principal: string): boolean => {\n if (permission.includes(`\"${principal}\"`)) return true;\n return permission.includes(principal);\n };\n\n const permissionBelongsToPrincipals = (permission: string, principals: Set<string>): boolean => {\n for (const principal of principals) {\n if (permissionHasPrincipal(permission, principal)) {\n return true;\n }\n }\n return false;\n };\n\n const onlyPermissionsFor = (permissions: string[], principals: Set<string>): boolean => {\n if (permissions.length === 0) return false;\n return permissions.every((permission) => permissionBelongsToPrincipals(permission, principals));\n };\n\n const valueContainsMatch = (value: unknown, needles: string[]): boolean => {\n if (value == null) return false;\n if (typeof value === 'string') {\n return needles.some((needle) => value.includes(needle));\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n const strValue = String(value);\n return needles.some((needle) => strValue.includes(needle));\n }\n if (Array.isArray(value)) {\n return value.some((entry) => valueContainsMatch(entry, needles));\n }\n if (typeof value === 'object') {\n for (const entry of Object.values(value as Record<string, unknown>)) {\n if (valueContainsMatch(entry, needles)) {\n return true;\n }\n }\n }\n return false;\n };\n\n console.log(\n `[Appwrite Cleanup] Starting untracked cleanup for session ${sessionId || 'unknown'}`\n );\n console.log(`[Appwrite Cleanup] Test start time: ${testStartTime}`);\n console.log(`[Appwrite Cleanup] User ID to match: ${userId || 'none'}`);\n console.log(`[Appwrite Cleanup] User email to match: ${userEmail || 'none'}`);\n\n try {\n if (!userId && userEmail) {\n try {\n const usersResult = await users.list([\n Query.equal('email', userEmail),\n Query.limit(1),\n ]);\n const matchedUser = usersResult.users?.[0];\n if (matchedUser?.$id) {\n userId = matchedUser.$id;\n if (typeof matchedUser.$createdAt === 'string') {\n resolvedUserCreatedAt = matchedUser.$createdAt;\n }\n console.log(`[Appwrite Cleanup] Resolved userId from email: ${userId}`);\n }\n } catch (error) {\n console.warn('[Appwrite Cleanup] Failed to resolve userId from email:', error);\n }\n }\n\n if (!testStartTimeProvided && userId && !resolvedUserCreatedAt) {\n try {\n const userRecord = await users.get(userId);\n if (typeof userRecord.$createdAt === 'string') {\n resolvedUserCreatedAt = userRecord.$createdAt;\n }\n } catch (error) {\n console.warn('[Appwrite Cleanup] Failed to resolve user creation time:', error);\n }\n }\n\n if (!testStartTimeProvided && resolvedUserCreatedAt) {\n effectiveTestStartTime = resolvedUserCreatedAt;\n console.log(\n `[Appwrite Cleanup] Using user createdAt as test start time: ${effectiveTestStartTime}`\n );\n }\n\n console.log(`[Appwrite Cleanup] Effective start time: ${effectiveTestStartTime}`);\n\n const ownedTeamIds = new Set<string>();\n if (userId) {\n try {\n console.log('[Appwrite Cleanup] Listing teams for ownership checks...');\n let hasMoreTeams = true;\n let teamCursor: string | undefined;\n\n while (hasMoreTeams) {\n const teamQueries = [\n Query.greaterThanEqual('$createdAt', effectiveTestStartTime),\n Query.limit(100),\n ];\n if (teamCursor) {\n teamQueries.push(Query.cursorAfter(teamCursor));\n }\n\n const teamsList = await teams.list(teamQueries);\n for (const team of teamsList.teams) {\n let membershipCursor: string | undefined;\n let hasMoreMembers = true;\n const memberUserIds: string[] = [];\n\n while (hasMoreMembers) {\n const memberQueries = [Query.limit(100)];\n if (membershipCursor) {\n memberQueries.push(Query.cursorAfter(membershipCursor));\n }\n\n const memberships = await teams.listMemberships(team.$id, memberQueries);\n for (const membership of memberships.memberships) {\n if (membership.userId) {\n memberUserIds.push(membership.userId);\n }\n }\n\n if (memberships.memberships.length < 100) {\n hasMoreMembers = false;\n } else {\n membershipCursor = memberships.memberships[memberships.memberships.length - 1].$id;\n }\n }\n\n const uniqueMembers = new Set(memberUserIds);\n if (uniqueMembers.size === 1 && uniqueMembers.has(userId)) {\n ownedTeamIds.add(team.$id);\n }\n }\n\n if (teamsList.teams.length < 100) {\n hasMoreTeams = false;\n } else {\n teamCursor = teamsList.teams[teamsList.teams.length - 1].$id;\n }\n }\n\n if (ownedTeamIds.size > 0) {\n console.log(`[Appwrite Cleanup] Found ${ownedTeamIds.size} user-owned teams`);\n }\n } catch (error) {\n console.warn('[Appwrite Cleanup] Failed to list teams for ownership checks:', error);\n }\n }\n\n const userPrincipals = new Set<string>();\n if (userId) {\n userPrincipals.add(`user:${userId}`);\n }\n for (const teamId of ownedTeamIds) {\n userPrincipals.add(`team:${teamId}`);\n }\n\n // 1. List all databases\n console.log('[Appwrite Cleanup] Listing databases...');\n const databases = await tablesDB.list();\n console.log(\n `[Appwrite Cleanup] Found ${databases.databases.length} databases to scan`\n );\n\n for (const db of databases.databases) {\n // 2. List all tables in each database\n console.log(`[Appwrite Cleanup] Listing tables for database ${db.$id}...`);\n const tables = await tablesDB.listTables({ databaseId: db.$id });\n console.log(\n `[Appwrite Cleanup] Database \"${db.name}\" (${db.$id}): ${tables.tables.length} tables`\n );\n\n for (const table of tables.tables) {\n // Skip tracking tables (tables starting with _intellitester)\n if (table.name.startsWith('_intellitester')) {\n console.log(\n `[Appwrite Cleanup] Skipping tracking table: ${table.name}`\n );\n continue;\n }\n\n scanned++;\n\n try {\n // 3. Query for rows created after testStartTime with pagination\n let hasMore = true;\n let cursor: string | undefined;\n\n let tableMatchesFound = 0;\n while (hasMore) {\n const queries = [\n Query.greaterThanEqual('$createdAt', effectiveTestStartTime),\n Query.orderAsc('$createdAt'),\n Query.orderAsc('$id'),\n Query.limit(100),\n ];\n\n if (cursor) {\n queries.push(Query.cursorAfter(cursor));\n }\n\n const rows = await tablesDB.listRows({\n databaseId: db.$id,\n tableId: table.$id,\n queries,\n });\n\n for (const row of rows.rows) {\n const matchNeedles = [userId, userEmail].filter(\n (needle): needle is string => Boolean(needle)\n );\n const rowPermissions = normalizePermissions(\n (row as Record<string, unknown>).$permissions ??\n (row as Record<string, unknown>).permissions\n );\n const hasOnlyUserPermissions = onlyPermissionsFor(rowPermissions, userPrincipals);\n const matchesValues = matchNeedles.length > 0\n ? valueContainsMatch(row, matchNeedles)\n : false;\n const matchesRowId = Boolean(userId && row.$id === userId);\n\n const shouldDelete = matchesRowId || matchesValues || hasOnlyUserPermissions;\n\n if (shouldDelete) {\n tableMatchesFound++;\n try {\n await tablesDB.deleteRow({\n databaseId: db.$id,\n tableId: table.$id,\n rowId: row.$id,\n });\n deleted.push(`row:${db.$id}/${table.$id}/${row.$id}`);\n console.log(\n `[Appwrite Cleanup] Deleted row ${row.$id} from ${table.name}`\n );\n } catch (error) {\n failed.push(`row:${db.$id}/${table.$id}/${row.$id}`);\n console.warn(\n `[Appwrite Cleanup] Failed to delete row ${row.$id}:`,\n error\n );\n }\n }\n }\n\n // Check if we need to paginate\n if (rows.rows.length < 100) {\n hasMore = false;\n } else {\n cursor = rows.rows[rows.rows.length - 1].$id;\n }\n }\n\n if (tableMatchesFound > 0) {\n console.log(\n `[Appwrite Cleanup] Table \"${table.name}\": matched ${tableMatchesFound} rows for cleanup`\n );\n }\n } catch (error) {\n console.warn(\n `[Appwrite Cleanup] Error scanning table ${table.name}:`,\n error\n );\n }\n }\n }\n\n // 5. Scan storage buckets for files\n console.log('[Appwrite Cleanup] Listing storage buckets...');\n const buckets = await storage.listBuckets([\n Query.greaterThanEqual('$createdAt', effectiveTestStartTime),\n Query.limit(100),\n ]);\n console.log(\n `[Appwrite Cleanup] Found ${buckets.buckets.length} buckets to scan`\n );\n\n for (const bucket of buckets.buckets) {\n scanned++;\n const bucketPermissions = normalizePermissions(\n (bucket as Record<string, unknown>).$permissions ??\n (bucket as Record<string, unknown>).permissions\n );\n const bucketMatchesId = Boolean(userId && bucket.$id === userId);\n const bucketMatchesOwnedTeam = Boolean(\n ownedTeamIds.size > 0 && ownedTeamIds.has(bucket.$id)\n );\n const bucketMatchesName = Boolean(\n (userId && bucket.name.includes(userId)) ||\n (userEmail && bucket.name.includes(userEmail))\n );\n const bucketHasOnlyUserPermissions = onlyPermissionsFor(bucketPermissions, userPrincipals);\n const bucketNeedles = [userId, userEmail].filter(\n (needle): needle is string => Boolean(needle)\n );\n const bucketMatchesValues = bucketNeedles.length > 0\n ? valueContainsMatch(bucket, bucketNeedles)\n : false;\n const bucketShouldDelete =\n bucketMatchesId ||\n bucketMatchesOwnedTeam ||\n bucketMatchesName ||\n bucketHasOnlyUserPermissions ||\n bucketMatchesValues;\n\n try {\n let hasMore = true;\n let cursor: string | undefined;\n\n let bucketMatchesFound = 0;\n while (hasMore) {\n const queries = bucketShouldDelete\n ? [Query.orderAsc('$id'), Query.limit(100)]\n : [\n Query.greaterThanEqual('$createdAt', effectiveTestStartTime),\n Query.orderAsc('$createdAt'),\n Query.orderAsc('$id'),\n Query.limit(100),\n ];\n\n if (cursor) {\n queries.push(Query.cursorAfter(cursor));\n }\n\n const files = await storage.listFiles({\n bucketId: bucket.$id,\n queries,\n });\n\n for (const file of files.files) {\n // Files don't have custom fields, but check name patterns\n // Note: $createdBy might not exist on all file objects\n const fileRecord = file as Record<string, unknown>;\n const createdBy = fileRecord.$createdBy as string | undefined;\n const filePermissions = normalizePermissions(\n fileRecord.$permissions ?? fileRecord.permissions\n );\n const fileHasOnlyUserPermissions = onlyPermissionsFor(filePermissions, userPrincipals);\n const fileNeedles = [userId, userEmail].filter(\n (needle): needle is string => Boolean(needle)\n );\n const fileMatchesValues = fileNeedles.length > 0\n ? valueContainsMatch(fileRecord, fileNeedles)\n : false;\n const shouldDelete =\n bucketShouldDelete ||\n fileHasOnlyUserPermissions ||\n fileMatchesValues ||\n (userId && createdBy === userId);\n\n if (shouldDelete) {\n bucketMatchesFound++;\n try {\n await storage.deleteFile({\n bucketId: bucket.$id,\n fileId: file.$id,\n });\n deleted.push(`file:${bucket.$id}/${file.$id}`);\n console.log(\n `[Appwrite Cleanup] Deleted file ${file.$id} from bucket ${bucket.name}`\n );\n } catch (error) {\n failed.push(`file:${bucket.$id}/${file.$id}`);\n console.warn(\n `[Appwrite Cleanup] Failed to delete file ${file.$id}:`,\n error\n );\n }\n }\n }\n\n // Check if we need to paginate\n if (files.files.length < 100) {\n hasMore = false;\n } else {\n cursor = files.files[files.files.length - 1].$id;\n }\n }\n\n if (bucketMatchesFound > 0) {\n console.log(\n `[Appwrite Cleanup] Bucket \"${bucket.name}\": matched ${bucketMatchesFound} files for cleanup`\n );\n }\n } catch (error) {\n console.warn(\n `[Appwrite Cleanup] Error scanning bucket ${bucket.name}:`,\n error\n );\n }\n\n if (bucketShouldDelete) {\n try {\n await storage.deleteBucket(bucket.$id);\n deleted.push(`bucket:${bucket.$id}`);\n console.log(`[Appwrite Cleanup] Deleted bucket ${bucket.name} (${bucket.$id})`);\n } catch (error) {\n failed.push(`bucket:${bucket.$id}`);\n console.warn(`[Appwrite Cleanup] Failed to delete bucket ${bucket.$id}:`, error);\n }\n }\n }\n\n // 6. Delete the test user last\n if (userId) {\n console.log(`[Appwrite Cleanup] Deleting test user: ${userId}`);\n try {\n await users.delete(userId);\n deleted.push(`user:${userId}`);\n console.log(`[Appwrite Cleanup] Deleted user ${userId}`);\n } catch (error) {\n failed.push(`user:${userId}`);\n console.warn(\n `[Appwrite Cleanup] Failed to delete user ${userId}:`,\n error\n );\n }\n } else if (userEmail) {\n try {\n const usersResult = await users.list([\n Query.equal('email', userEmail),\n Query.limit(10),\n ]);\n for (const user of usersResult.users ?? []) {\n try {\n await users.delete(user.$id);\n deleted.push(`user:${user.$id}`);\n console.log(`[Appwrite Cleanup] Deleted user ${user.$id} (matched by email)`);\n } catch (error) {\n failed.push(`user:${user.$id}`);\n console.warn(`[Appwrite Cleanup] Failed to delete user ${user.$id}:`, error);\n }\n }\n } catch (error) {\n console.warn('[Appwrite Cleanup] Failed to delete users by email:', error);\n }\n }\n } catch (error) {\n console.error('[Appwrite Cleanup] Error during cleanup scan:', error);\n }\n\n console.log(\n `[Appwrite Cleanup] Cleanup complete. Scanned: ${scanned}, Deleted: ${deleted.length}, Failed: ${failed.length}`\n );\n\n return {\n success: failed.length === 0,\n scanned,\n deleted,\n failed,\n };\n }\n\n return {\n name: 'appwrite',\n async configure() {\n // Client is already configured in the factory function\n // This is called by the cleanup executor but we don't need to do anything\n },\n methods,\n cleanupUntracked,\n };\n}\n\n// Default type mappings for Appwrite resources\nexport const appwriteTypeMappings: Record<string, string> = {\n row: 'appwrite.deleteRow',\n file: 'appwrite.deleteFile',\n team: 'appwrite.deleteTeam',\n user: 'appwrite.deleteUser',\n membership: 'appwrite.deleteMembership',\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/providers/appwrite/index.ts"],"names":["init_cjs_shims","Client","TablesDB","Storage","Teams","Users","Query"],"mappings":"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","file":"chunk-2F5ZF34M.cjs","sourcesContent":["import { Client, Users, TablesDB, Storage, Teams, Query } from 'node-appwrite';\nimport type {\n CleanupProvider,\n CleanupHandler,\n CleanupUntrackedOptions,\n CleanupUntrackedResult,\n} from '../../core/cleanup/types.js';\nimport type { TrackedResource } from '../../integration/index.js';\n\ninterface AppwriteConfig {\n endpoint: string;\n projectId: string;\n apiKey: string;\n}\n\nexport function createAppwriteProvider(config: AppwriteConfig): CleanupProvider {\n const client = new Client()\n .setEndpoint(config.endpoint)\n .setProject(config.projectId)\n .setKey(config.apiKey);\n\n const tablesDB = new TablesDB(client);\n const storage = new Storage(client);\n const teams = new Teams(client);\n const users = new Users(client);\n\n const methods: Record<string, CleanupHandler> = {\n deleteRow: async (resource: TrackedResource) => {\n const databaseId = resource.databaseId as string;\n const tableId = resource.tableId as string;\n\n if (!databaseId || !tableId) {\n throw new Error(`Missing databaseId or tableId for row ${resource.id}`);\n }\n\n await tablesDB.deleteRow({\n databaseId,\n tableId,\n rowId: resource.id,\n });\n },\n\n deleteFile: async (resource: TrackedResource) => {\n const bucketId = resource.bucketId as string;\n\n if (!bucketId) {\n throw new Error(`Missing bucketId for file ${resource.id}`);\n }\n\n await storage.deleteFile(bucketId, resource.id);\n },\n\n deleteTeam: async (resource: TrackedResource) => {\n await teams.delete(resource.id);\n },\n\n deleteUser: async (resource: TrackedResource) => {\n await users.delete(resource.id);\n },\n\n deleteMembership: async (resource: TrackedResource) => {\n const teamId = resource.teamId as string;\n\n if (!teamId) {\n throw new Error(`Missing teamId for membership ${resource.id}`);\n }\n\n await teams.deleteMembership(teamId, resource.id);\n },\n };\n\n /**\n * Scan all Appwrite tables for resources created after testStartTime\n * that contain the userId in any field, and delete them.\n */\n async function cleanupUntracked(\n options: CleanupUntrackedOptions\n ): Promise<CleanupUntrackedResult> {\n const {\n testStartTime,\n testStartTimeProvided,\n userId: providedUserId,\n userEmail,\n sessionId,\n } = options;\n const deleted: string[] = [];\n const failed: string[] = [];\n let scanned = 0;\n let userId = providedUserId;\n let effectiveTestStartTime = testStartTime;\n let resolvedUserCreatedAt: string | undefined;\n\n const normalizePermissions = (permissions: unknown): string[] => {\n if (!Array.isArray(permissions)) return [];\n return permissions.filter((entry): entry is string => typeof entry === 'string');\n };\n\n const permissionHasPrincipal = (permission: string, principal: string): boolean => {\n if (permission.includes(`\"${principal}\"`)) return true;\n return permission.includes(principal);\n };\n\n const permissionBelongsToPrincipals = (permission: string, principals: Set<string>): boolean => {\n for (const principal of principals) {\n if (permissionHasPrincipal(permission, principal)) {\n return true;\n }\n }\n return false;\n };\n\n const onlyPermissionsFor = (permissions: string[], principals: Set<string>): boolean => {\n if (permissions.length === 0) return false;\n return permissions.every((permission) => permissionBelongsToPrincipals(permission, principals));\n };\n\n const valueContainsMatch = (value: unknown, needles: string[]): boolean => {\n if (value == null) return false;\n if (typeof value === 'string') {\n return needles.some((needle) => value.includes(needle));\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n const strValue = String(value);\n return needles.some((needle) => strValue.includes(needle));\n }\n if (Array.isArray(value)) {\n return value.some((entry) => valueContainsMatch(entry, needles));\n }\n if (typeof value === 'object') {\n for (const entry of Object.values(value as Record<string, unknown>)) {\n if (valueContainsMatch(entry, needles)) {\n return true;\n }\n }\n }\n return false;\n };\n\n console.log(\n `[Appwrite Cleanup] Starting untracked cleanup for session ${sessionId || 'unknown'}`\n );\n console.log(`[Appwrite Cleanup] Test start time: ${testStartTime}`);\n console.log(`[Appwrite Cleanup] User ID to match: ${userId || 'none'}`);\n console.log(`[Appwrite Cleanup] User email to match: ${userEmail || 'none'}`);\n\n try {\n if (!userId && userEmail) {\n try {\n const usersResult = await users.list([\n Query.equal('email', userEmail),\n Query.limit(1),\n ]);\n const matchedUser = usersResult.users?.[0];\n if (matchedUser?.$id) {\n userId = matchedUser.$id;\n if (typeof matchedUser.$createdAt === 'string') {\n resolvedUserCreatedAt = matchedUser.$createdAt;\n }\n console.log(`[Appwrite Cleanup] Resolved userId from email: ${userId}`);\n }\n } catch (error) {\n console.warn('[Appwrite Cleanup] Failed to resolve userId from email:', error);\n }\n }\n\n if (!testStartTimeProvided && userId && !resolvedUserCreatedAt) {\n try {\n const userRecord = await users.get(userId);\n if (typeof userRecord.$createdAt === 'string') {\n resolvedUserCreatedAt = userRecord.$createdAt;\n }\n } catch (error) {\n console.warn('[Appwrite Cleanup] Failed to resolve user creation time:', error);\n }\n }\n\n if (!testStartTimeProvided && resolvedUserCreatedAt) {\n effectiveTestStartTime = resolvedUserCreatedAt;\n console.log(\n `[Appwrite Cleanup] Using user createdAt as test start time: ${effectiveTestStartTime}`\n );\n }\n\n console.log(`[Appwrite Cleanup] Effective start time: ${effectiveTestStartTime}`);\n\n const ownedTeamIds = new Set<string>();\n if (userId) {\n try {\n console.log('[Appwrite Cleanup] Listing teams for ownership checks...');\n let hasMoreTeams = true;\n let teamCursor: string | undefined;\n\n while (hasMoreTeams) {\n const teamQueries = [\n Query.greaterThanEqual('$createdAt', effectiveTestStartTime),\n Query.limit(100),\n ];\n if (teamCursor) {\n teamQueries.push(Query.cursorAfter(teamCursor));\n }\n\n const teamsList = await teams.list(teamQueries);\n for (const team of teamsList.teams) {\n let membershipCursor: string | undefined;\n let hasMoreMembers = true;\n const memberUserIds: string[] = [];\n\n while (hasMoreMembers) {\n const memberQueries = [Query.limit(100)];\n if (membershipCursor) {\n memberQueries.push(Query.cursorAfter(membershipCursor));\n }\n\n const memberships = await teams.listMemberships(team.$id, memberQueries);\n for (const membership of memberships.memberships) {\n if (membership.userId) {\n memberUserIds.push(membership.userId);\n }\n }\n\n if (memberships.memberships.length < 100) {\n hasMoreMembers = false;\n } else {\n membershipCursor = memberships.memberships[memberships.memberships.length - 1].$id;\n }\n }\n\n const uniqueMembers = new Set(memberUserIds);\n if (uniqueMembers.size === 1 && uniqueMembers.has(userId)) {\n ownedTeamIds.add(team.$id);\n }\n }\n\n if (teamsList.teams.length < 100) {\n hasMoreTeams = false;\n } else {\n teamCursor = teamsList.teams[teamsList.teams.length - 1].$id;\n }\n }\n\n if (ownedTeamIds.size > 0) {\n console.log(`[Appwrite Cleanup] Found ${ownedTeamIds.size} user-owned teams`);\n }\n } catch (error) {\n console.warn('[Appwrite Cleanup] Failed to list teams for ownership checks:', error);\n }\n }\n\n const userPrincipals = new Set<string>();\n if (userId) {\n userPrincipals.add(`user:${userId}`);\n }\n for (const teamId of ownedTeamIds) {\n userPrincipals.add(`team:${teamId}`);\n }\n\n // 1. List all databases\n console.log('[Appwrite Cleanup] Listing databases...');\n const databases = await tablesDB.list();\n console.log(\n `[Appwrite Cleanup] Found ${databases.databases.length} databases to scan`\n );\n\n for (const db of databases.databases) {\n // 2. List all tables in each database\n console.log(`[Appwrite Cleanup] Listing tables for database ${db.$id}...`);\n const tables = await tablesDB.listTables({ databaseId: db.$id });\n console.log(\n `[Appwrite Cleanup] Database \"${db.name}\" (${db.$id}): ${tables.tables.length} tables`\n );\n\n for (const table of tables.tables) {\n // Skip tracking tables (tables starting with _intellitester)\n if (table.name.startsWith('_intellitester')) {\n console.log(\n `[Appwrite Cleanup] Skipping tracking table: ${table.name}`\n );\n continue;\n }\n\n scanned++;\n\n try {\n // 3. Query for rows created after testStartTime with pagination\n let hasMore = true;\n let cursor: string | undefined;\n\n let tableMatchesFound = 0;\n while (hasMore) {\n const queries = [\n Query.greaterThanEqual('$createdAt', effectiveTestStartTime),\n Query.orderAsc('$createdAt'),\n Query.orderAsc('$id'),\n Query.limit(100),\n ];\n\n if (cursor) {\n queries.push(Query.cursorAfter(cursor));\n }\n\n const rows = await tablesDB.listRows({\n databaseId: db.$id,\n tableId: table.$id,\n queries,\n });\n\n for (const row of rows.rows) {\n const matchNeedles = [userId, userEmail].filter(\n (needle): needle is string => Boolean(needle)\n );\n const rowPermissions = normalizePermissions(\n (row as Record<string, unknown>).$permissions ??\n (row as Record<string, unknown>).permissions\n );\n const hasOnlyUserPermissions = onlyPermissionsFor(rowPermissions, userPrincipals);\n const matchesValues = matchNeedles.length > 0\n ? valueContainsMatch(row, matchNeedles)\n : false;\n const matchesRowId = Boolean(userId && row.$id === userId);\n\n const shouldDelete = matchesRowId || matchesValues || hasOnlyUserPermissions;\n\n if (shouldDelete) {\n tableMatchesFound++;\n try {\n await tablesDB.deleteRow({\n databaseId: db.$id,\n tableId: table.$id,\n rowId: row.$id,\n });\n deleted.push(`row:${db.$id}/${table.$id}/${row.$id}`);\n console.log(\n `[Appwrite Cleanup] Deleted row ${row.$id} from ${table.name}`\n );\n } catch (error) {\n failed.push(`row:${db.$id}/${table.$id}/${row.$id}`);\n console.warn(\n `[Appwrite Cleanup] Failed to delete row ${row.$id}:`,\n error\n );\n }\n }\n }\n\n // Check if we need to paginate\n if (rows.rows.length < 100) {\n hasMore = false;\n } else {\n cursor = rows.rows[rows.rows.length - 1].$id;\n }\n }\n\n if (tableMatchesFound > 0) {\n console.log(\n `[Appwrite Cleanup] Table \"${table.name}\": matched ${tableMatchesFound} rows for cleanup`\n );\n }\n } catch (error) {\n console.warn(\n `[Appwrite Cleanup] Error scanning table ${table.name}:`,\n error\n );\n }\n }\n }\n\n // 5. Scan storage buckets for files\n console.log('[Appwrite Cleanup] Listing storage buckets...');\n const buckets = await storage.listBuckets([\n Query.greaterThanEqual('$createdAt', effectiveTestStartTime),\n Query.limit(100),\n ]);\n console.log(\n `[Appwrite Cleanup] Found ${buckets.buckets.length} buckets to scan`\n );\n\n for (const bucket of buckets.buckets) {\n scanned++;\n const bucketPermissions = normalizePermissions(\n (bucket as Record<string, unknown>).$permissions ??\n (bucket as Record<string, unknown>).permissions\n );\n const bucketMatchesId = Boolean(userId && bucket.$id === userId);\n const bucketMatchesOwnedTeam = Boolean(\n ownedTeamIds.size > 0 && ownedTeamIds.has(bucket.$id)\n );\n const bucketMatchesName = Boolean(\n (userId && bucket.name.includes(userId)) ||\n (userEmail && bucket.name.includes(userEmail))\n );\n const bucketHasOnlyUserPermissions = onlyPermissionsFor(bucketPermissions, userPrincipals);\n const bucketNeedles = [userId, userEmail].filter(\n (needle): needle is string => Boolean(needle)\n );\n const bucketMatchesValues = bucketNeedles.length > 0\n ? valueContainsMatch(bucket, bucketNeedles)\n : false;\n const bucketShouldDelete =\n bucketMatchesId ||\n bucketMatchesOwnedTeam ||\n bucketMatchesName ||\n bucketHasOnlyUserPermissions ||\n bucketMatchesValues;\n\n try {\n let hasMore = true;\n let cursor: string | undefined;\n\n let bucketMatchesFound = 0;\n while (hasMore) {\n const queries = bucketShouldDelete\n ? [Query.orderAsc('$id'), Query.limit(100)]\n : [\n Query.greaterThanEqual('$createdAt', effectiveTestStartTime),\n Query.orderAsc('$createdAt'),\n Query.orderAsc('$id'),\n Query.limit(100),\n ];\n\n if (cursor) {\n queries.push(Query.cursorAfter(cursor));\n }\n\n const files = await storage.listFiles({\n bucketId: bucket.$id,\n queries,\n });\n\n for (const file of files.files) {\n // Files don't have custom fields, but check name patterns\n // Note: $createdBy might not exist on all file objects\n const fileRecord = file as Record<string, unknown>;\n const createdBy = fileRecord.$createdBy as string | undefined;\n const filePermissions = normalizePermissions(\n fileRecord.$permissions ?? fileRecord.permissions\n );\n const fileHasOnlyUserPermissions = onlyPermissionsFor(filePermissions, userPrincipals);\n const fileNeedles = [userId, userEmail].filter(\n (needle): needle is string => Boolean(needle)\n );\n const fileMatchesValues = fileNeedles.length > 0\n ? valueContainsMatch(fileRecord, fileNeedles)\n : false;\n const shouldDelete =\n bucketShouldDelete ||\n fileHasOnlyUserPermissions ||\n fileMatchesValues ||\n (userId && createdBy === userId);\n\n if (shouldDelete) {\n bucketMatchesFound++;\n try {\n await storage.deleteFile({\n bucketId: bucket.$id,\n fileId: file.$id,\n });\n deleted.push(`file:${bucket.$id}/${file.$id}`);\n console.log(\n `[Appwrite Cleanup] Deleted file ${file.$id} from bucket ${bucket.name}`\n );\n } catch (error) {\n failed.push(`file:${bucket.$id}/${file.$id}`);\n console.warn(\n `[Appwrite Cleanup] Failed to delete file ${file.$id}:`,\n error\n );\n }\n }\n }\n\n // Check if we need to paginate\n if (files.files.length < 100) {\n hasMore = false;\n } else {\n cursor = files.files[files.files.length - 1].$id;\n }\n }\n\n if (bucketMatchesFound > 0) {\n console.log(\n `[Appwrite Cleanup] Bucket \"${bucket.name}\": matched ${bucketMatchesFound} files for cleanup`\n );\n }\n } catch (error) {\n console.warn(\n `[Appwrite Cleanup] Error scanning bucket ${bucket.name}:`,\n error\n );\n }\n\n if (bucketShouldDelete) {\n try {\n await storage.deleteBucket(bucket.$id);\n deleted.push(`bucket:${bucket.$id}`);\n console.log(`[Appwrite Cleanup] Deleted bucket ${bucket.name} (${bucket.$id})`);\n } catch (error) {\n failed.push(`bucket:${bucket.$id}`);\n console.warn(`[Appwrite Cleanup] Failed to delete bucket ${bucket.$id}:`, error);\n }\n }\n }\n\n // 6. Delete the test user last\n if (userId) {\n console.log(`[Appwrite Cleanup] Deleting test user: ${userId}`);\n try {\n await users.delete(userId);\n deleted.push(`user:${userId}`);\n console.log(`[Appwrite Cleanup] Deleted user ${userId}`);\n } catch (error) {\n failed.push(`user:${userId}`);\n console.warn(\n `[Appwrite Cleanup] Failed to delete user ${userId}:`,\n error\n );\n }\n } else if (userEmail) {\n try {\n const usersResult = await users.list([\n Query.equal('email', userEmail),\n Query.limit(10),\n ]);\n for (const user of usersResult.users ?? []) {\n try {\n await users.delete(user.$id);\n deleted.push(`user:${user.$id}`);\n console.log(`[Appwrite Cleanup] Deleted user ${user.$id} (matched by email)`);\n } catch (error) {\n failed.push(`user:${user.$id}`);\n console.warn(`[Appwrite Cleanup] Failed to delete user ${user.$id}:`, error);\n }\n }\n } catch (error) {\n console.warn('[Appwrite Cleanup] Failed to delete users by email:', error);\n }\n }\n } catch (error) {\n console.error('[Appwrite Cleanup] Error during cleanup scan:', error);\n }\n\n console.log(\n `[Appwrite Cleanup] Cleanup complete. Scanned: ${scanned}, Deleted: ${deleted.length}, Failed: ${failed.length}`\n );\n\n return {\n success: failed.length === 0,\n scanned,\n deleted,\n failed,\n };\n }\n\n return {\n name: 'appwrite',\n async configure() {\n // Client is already configured in the factory function\n // This is called by the cleanup executor but we don't need to do anything\n },\n methods,\n cleanupUntracked,\n };\n}\n\n// Default type mappings for Appwrite resources\nexport const appwriteTypeMappings: Record<string, string> = {\n row: 'appwrite.deleteRow',\n file: 'appwrite.deleteFile',\n team: 'appwrite.deleteTeam',\n user: 'appwrite.deleteUser',\n membership: 'appwrite.deleteMembership',\n};\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { init_esm_shims } from './chunk-
|
|
1
|
+
import { init_esm_shims } from './chunk-RXXJEYXO.js';
|
|
2
2
|
import { Client, TablesDB, Storage, Teams, Users, Query } from 'node-appwrite';
|
|
3
3
|
|
|
4
4
|
// src/providers/appwrite/index.ts
|
|
@@ -457,5 +457,5 @@ var appwriteTypeMappings = {
|
|
|
457
457
|
};
|
|
458
458
|
|
|
459
459
|
export { appwriteTypeMappings, createAppwriteProvider };
|
|
460
|
-
//# sourceMappingURL=chunk-
|
|
461
|
-
//# sourceMappingURL=chunk-
|
|
460
|
+
//# sourceMappingURL=chunk-3LE4HBUY.js.map
|
|
461
|
+
//# sourceMappingURL=chunk-3LE4HBUY.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/providers/appwrite/index.ts"],"names":[],"mappings":"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","file":"chunk-XRDD26DA.js","sourcesContent":["import { Client, Users, TablesDB, Storage, Teams, Query } from 'node-appwrite';\nimport type {\n CleanupProvider,\n CleanupHandler,\n CleanupUntrackedOptions,\n CleanupUntrackedResult,\n} from '../../core/cleanup/types.js';\nimport type { TrackedResource } from '../../integration/index.js';\n\ninterface AppwriteConfig {\n endpoint: string;\n projectId: string;\n apiKey: string;\n}\n\nexport function createAppwriteProvider(config: AppwriteConfig): CleanupProvider {\n const client = new Client()\n .setEndpoint(config.endpoint)\n .setProject(config.projectId)\n .setKey(config.apiKey);\n\n const tablesDB = new TablesDB(client);\n const storage = new Storage(client);\n const teams = new Teams(client);\n const users = new Users(client);\n\n const methods: Record<string, CleanupHandler> = {\n deleteRow: async (resource: TrackedResource) => {\n const databaseId = resource.databaseId as string;\n const tableId = resource.tableId as string;\n\n if (!databaseId || !tableId) {\n throw new Error(`Missing databaseId or tableId for row ${resource.id}`);\n }\n\n await tablesDB.deleteRow({\n databaseId,\n tableId,\n rowId: resource.id,\n });\n },\n\n deleteFile: async (resource: TrackedResource) => {\n const bucketId = resource.bucketId as string;\n\n if (!bucketId) {\n throw new Error(`Missing bucketId for file ${resource.id}`);\n }\n\n await storage.deleteFile(bucketId, resource.id);\n },\n\n deleteTeam: async (resource: TrackedResource) => {\n await teams.delete(resource.id);\n },\n\n deleteUser: async (resource: TrackedResource) => {\n await users.delete(resource.id);\n },\n\n deleteMembership: async (resource: TrackedResource) => {\n const teamId = resource.teamId as string;\n\n if (!teamId) {\n throw new Error(`Missing teamId for membership ${resource.id}`);\n }\n\n await teams.deleteMembership(teamId, resource.id);\n },\n };\n\n /**\n * Scan all Appwrite tables for resources created after testStartTime\n * that contain the userId in any field, and delete them.\n */\n async function cleanupUntracked(\n options: CleanupUntrackedOptions\n ): Promise<CleanupUntrackedResult> {\n const {\n testStartTime,\n testStartTimeProvided,\n userId: providedUserId,\n userEmail,\n sessionId,\n } = options;\n const deleted: string[] = [];\n const failed: string[] = [];\n let scanned = 0;\n let userId = providedUserId;\n let effectiveTestStartTime = testStartTime;\n let resolvedUserCreatedAt: string | undefined;\n\n const normalizePermissions = (permissions: unknown): string[] => {\n if (!Array.isArray(permissions)) return [];\n return permissions.filter((entry): entry is string => typeof entry === 'string');\n };\n\n const permissionHasPrincipal = (permission: string, principal: string): boolean => {\n if (permission.includes(`\"${principal}\"`)) return true;\n return permission.includes(principal);\n };\n\n const permissionBelongsToPrincipals = (permission: string, principals: Set<string>): boolean => {\n for (const principal of principals) {\n if (permissionHasPrincipal(permission, principal)) {\n return true;\n }\n }\n return false;\n };\n\n const onlyPermissionsFor = (permissions: string[], principals: Set<string>): boolean => {\n if (permissions.length === 0) return false;\n return permissions.every((permission) => permissionBelongsToPrincipals(permission, principals));\n };\n\n const valueContainsMatch = (value: unknown, needles: string[]): boolean => {\n if (value == null) return false;\n if (typeof value === 'string') {\n return needles.some((needle) => value.includes(needle));\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n const strValue = String(value);\n return needles.some((needle) => strValue.includes(needle));\n }\n if (Array.isArray(value)) {\n return value.some((entry) => valueContainsMatch(entry, needles));\n }\n if (typeof value === 'object') {\n for (const entry of Object.values(value as Record<string, unknown>)) {\n if (valueContainsMatch(entry, needles)) {\n return true;\n }\n }\n }\n return false;\n };\n\n console.log(\n `[Appwrite Cleanup] Starting untracked cleanup for session ${sessionId || 'unknown'}`\n );\n console.log(`[Appwrite Cleanup] Test start time: ${testStartTime}`);\n console.log(`[Appwrite Cleanup] User ID to match: ${userId || 'none'}`);\n console.log(`[Appwrite Cleanup] User email to match: ${userEmail || 'none'}`);\n\n try {\n if (!userId && userEmail) {\n try {\n const usersResult = await users.list([\n Query.equal('email', userEmail),\n Query.limit(1),\n ]);\n const matchedUser = usersResult.users?.[0];\n if (matchedUser?.$id) {\n userId = matchedUser.$id;\n if (typeof matchedUser.$createdAt === 'string') {\n resolvedUserCreatedAt = matchedUser.$createdAt;\n }\n console.log(`[Appwrite Cleanup] Resolved userId from email: ${userId}`);\n }\n } catch (error) {\n console.warn('[Appwrite Cleanup] Failed to resolve userId from email:', error);\n }\n }\n\n if (!testStartTimeProvided && userId && !resolvedUserCreatedAt) {\n try {\n const userRecord = await users.get(userId);\n if (typeof userRecord.$createdAt === 'string') {\n resolvedUserCreatedAt = userRecord.$createdAt;\n }\n } catch (error) {\n console.warn('[Appwrite Cleanup] Failed to resolve user creation time:', error);\n }\n }\n\n if (!testStartTimeProvided && resolvedUserCreatedAt) {\n effectiveTestStartTime = resolvedUserCreatedAt;\n console.log(\n `[Appwrite Cleanup] Using user createdAt as test start time: ${effectiveTestStartTime}`\n );\n }\n\n console.log(`[Appwrite Cleanup] Effective start time: ${effectiveTestStartTime}`);\n\n const ownedTeamIds = new Set<string>();\n if (userId) {\n try {\n console.log('[Appwrite Cleanup] Listing teams for ownership checks...');\n let hasMoreTeams = true;\n let teamCursor: string | undefined;\n\n while (hasMoreTeams) {\n const teamQueries = [\n Query.greaterThanEqual('$createdAt', effectiveTestStartTime),\n Query.limit(100),\n ];\n if (teamCursor) {\n teamQueries.push(Query.cursorAfter(teamCursor));\n }\n\n const teamsList = await teams.list(teamQueries);\n for (const team of teamsList.teams) {\n let membershipCursor: string | undefined;\n let hasMoreMembers = true;\n const memberUserIds: string[] = [];\n\n while (hasMoreMembers) {\n const memberQueries = [Query.limit(100)];\n if (membershipCursor) {\n memberQueries.push(Query.cursorAfter(membershipCursor));\n }\n\n const memberships = await teams.listMemberships(team.$id, memberQueries);\n for (const membership of memberships.memberships) {\n if (membership.userId) {\n memberUserIds.push(membership.userId);\n }\n }\n\n if (memberships.memberships.length < 100) {\n hasMoreMembers = false;\n } else {\n membershipCursor = memberships.memberships[memberships.memberships.length - 1].$id;\n }\n }\n\n const uniqueMembers = new Set(memberUserIds);\n if (uniqueMembers.size === 1 && uniqueMembers.has(userId)) {\n ownedTeamIds.add(team.$id);\n }\n }\n\n if (teamsList.teams.length < 100) {\n hasMoreTeams = false;\n } else {\n teamCursor = teamsList.teams[teamsList.teams.length - 1].$id;\n }\n }\n\n if (ownedTeamIds.size > 0) {\n console.log(`[Appwrite Cleanup] Found ${ownedTeamIds.size} user-owned teams`);\n }\n } catch (error) {\n console.warn('[Appwrite Cleanup] Failed to list teams for ownership checks:', error);\n }\n }\n\n const userPrincipals = new Set<string>();\n if (userId) {\n userPrincipals.add(`user:${userId}`);\n }\n for (const teamId of ownedTeamIds) {\n userPrincipals.add(`team:${teamId}`);\n }\n\n // 1. List all databases\n console.log('[Appwrite Cleanup] Listing databases...');\n const databases = await tablesDB.list();\n console.log(\n `[Appwrite Cleanup] Found ${databases.databases.length} databases to scan`\n );\n\n for (const db of databases.databases) {\n // 2. List all tables in each database\n console.log(`[Appwrite Cleanup] Listing tables for database ${db.$id}...`);\n const tables = await tablesDB.listTables({ databaseId: db.$id });\n console.log(\n `[Appwrite Cleanup] Database \"${db.name}\" (${db.$id}): ${tables.tables.length} tables`\n );\n\n for (const table of tables.tables) {\n // Skip tracking tables (tables starting with _intellitester)\n if (table.name.startsWith('_intellitester')) {\n console.log(\n `[Appwrite Cleanup] Skipping tracking table: ${table.name}`\n );\n continue;\n }\n\n scanned++;\n\n try {\n // 3. Query for rows created after testStartTime with pagination\n let hasMore = true;\n let cursor: string | undefined;\n\n let tableMatchesFound = 0;\n while (hasMore) {\n const queries = [\n Query.greaterThanEqual('$createdAt', effectiveTestStartTime),\n Query.orderAsc('$createdAt'),\n Query.orderAsc('$id'),\n Query.limit(100),\n ];\n\n if (cursor) {\n queries.push(Query.cursorAfter(cursor));\n }\n\n const rows = await tablesDB.listRows({\n databaseId: db.$id,\n tableId: table.$id,\n queries,\n });\n\n for (const row of rows.rows) {\n const matchNeedles = [userId, userEmail].filter(\n (needle): needle is string => Boolean(needle)\n );\n const rowPermissions = normalizePermissions(\n (row as Record<string, unknown>).$permissions ??\n (row as Record<string, unknown>).permissions\n );\n const hasOnlyUserPermissions = onlyPermissionsFor(rowPermissions, userPrincipals);\n const matchesValues = matchNeedles.length > 0\n ? valueContainsMatch(row, matchNeedles)\n : false;\n const matchesRowId = Boolean(userId && row.$id === userId);\n\n const shouldDelete = matchesRowId || matchesValues || hasOnlyUserPermissions;\n\n if (shouldDelete) {\n tableMatchesFound++;\n try {\n await tablesDB.deleteRow({\n databaseId: db.$id,\n tableId: table.$id,\n rowId: row.$id,\n });\n deleted.push(`row:${db.$id}/${table.$id}/${row.$id}`);\n console.log(\n `[Appwrite Cleanup] Deleted row ${row.$id} from ${table.name}`\n );\n } catch (error) {\n failed.push(`row:${db.$id}/${table.$id}/${row.$id}`);\n console.warn(\n `[Appwrite Cleanup] Failed to delete row ${row.$id}:`,\n error\n );\n }\n }\n }\n\n // Check if we need to paginate\n if (rows.rows.length < 100) {\n hasMore = false;\n } else {\n cursor = rows.rows[rows.rows.length - 1].$id;\n }\n }\n\n if (tableMatchesFound > 0) {\n console.log(\n `[Appwrite Cleanup] Table \"${table.name}\": matched ${tableMatchesFound} rows for cleanup`\n );\n }\n } catch (error) {\n console.warn(\n `[Appwrite Cleanup] Error scanning table ${table.name}:`,\n error\n );\n }\n }\n }\n\n // 5. Scan storage buckets for files\n console.log('[Appwrite Cleanup] Listing storage buckets...');\n const buckets = await storage.listBuckets([\n Query.greaterThanEqual('$createdAt', effectiveTestStartTime),\n Query.limit(100),\n ]);\n console.log(\n `[Appwrite Cleanup] Found ${buckets.buckets.length} buckets to scan`\n );\n\n for (const bucket of buckets.buckets) {\n scanned++;\n const bucketPermissions = normalizePermissions(\n (bucket as Record<string, unknown>).$permissions ??\n (bucket as Record<string, unknown>).permissions\n );\n const bucketMatchesId = Boolean(userId && bucket.$id === userId);\n const bucketMatchesOwnedTeam = Boolean(\n ownedTeamIds.size > 0 && ownedTeamIds.has(bucket.$id)\n );\n const bucketMatchesName = Boolean(\n (userId && bucket.name.includes(userId)) ||\n (userEmail && bucket.name.includes(userEmail))\n );\n const bucketHasOnlyUserPermissions = onlyPermissionsFor(bucketPermissions, userPrincipals);\n const bucketNeedles = [userId, userEmail].filter(\n (needle): needle is string => Boolean(needle)\n );\n const bucketMatchesValues = bucketNeedles.length > 0\n ? valueContainsMatch(bucket, bucketNeedles)\n : false;\n const bucketShouldDelete =\n bucketMatchesId ||\n bucketMatchesOwnedTeam ||\n bucketMatchesName ||\n bucketHasOnlyUserPermissions ||\n bucketMatchesValues;\n\n try {\n let hasMore = true;\n let cursor: string | undefined;\n\n let bucketMatchesFound = 0;\n while (hasMore) {\n const queries = bucketShouldDelete\n ? [Query.orderAsc('$id'), Query.limit(100)]\n : [\n Query.greaterThanEqual('$createdAt', effectiveTestStartTime),\n Query.orderAsc('$createdAt'),\n Query.orderAsc('$id'),\n Query.limit(100),\n ];\n\n if (cursor) {\n queries.push(Query.cursorAfter(cursor));\n }\n\n const files = await storage.listFiles({\n bucketId: bucket.$id,\n queries,\n });\n\n for (const file of files.files) {\n // Files don't have custom fields, but check name patterns\n // Note: $createdBy might not exist on all file objects\n const fileRecord = file as Record<string, unknown>;\n const createdBy = fileRecord.$createdBy as string | undefined;\n const filePermissions = normalizePermissions(\n fileRecord.$permissions ?? fileRecord.permissions\n );\n const fileHasOnlyUserPermissions = onlyPermissionsFor(filePermissions, userPrincipals);\n const fileNeedles = [userId, userEmail].filter(\n (needle): needle is string => Boolean(needle)\n );\n const fileMatchesValues = fileNeedles.length > 0\n ? valueContainsMatch(fileRecord, fileNeedles)\n : false;\n const shouldDelete =\n bucketShouldDelete ||\n fileHasOnlyUserPermissions ||\n fileMatchesValues ||\n (userId && createdBy === userId);\n\n if (shouldDelete) {\n bucketMatchesFound++;\n try {\n await storage.deleteFile({\n bucketId: bucket.$id,\n fileId: file.$id,\n });\n deleted.push(`file:${bucket.$id}/${file.$id}`);\n console.log(\n `[Appwrite Cleanup] Deleted file ${file.$id} from bucket ${bucket.name}`\n );\n } catch (error) {\n failed.push(`file:${bucket.$id}/${file.$id}`);\n console.warn(\n `[Appwrite Cleanup] Failed to delete file ${file.$id}:`,\n error\n );\n }\n }\n }\n\n // Check if we need to paginate\n if (files.files.length < 100) {\n hasMore = false;\n } else {\n cursor = files.files[files.files.length - 1].$id;\n }\n }\n\n if (bucketMatchesFound > 0) {\n console.log(\n `[Appwrite Cleanup] Bucket \"${bucket.name}\": matched ${bucketMatchesFound} files for cleanup`\n );\n }\n } catch (error) {\n console.warn(\n `[Appwrite Cleanup] Error scanning bucket ${bucket.name}:`,\n error\n );\n }\n\n if (bucketShouldDelete) {\n try {\n await storage.deleteBucket(bucket.$id);\n deleted.push(`bucket:${bucket.$id}`);\n console.log(`[Appwrite Cleanup] Deleted bucket ${bucket.name} (${bucket.$id})`);\n } catch (error) {\n failed.push(`bucket:${bucket.$id}`);\n console.warn(`[Appwrite Cleanup] Failed to delete bucket ${bucket.$id}:`, error);\n }\n }\n }\n\n // 6. Delete the test user last\n if (userId) {\n console.log(`[Appwrite Cleanup] Deleting test user: ${userId}`);\n try {\n await users.delete(userId);\n deleted.push(`user:${userId}`);\n console.log(`[Appwrite Cleanup] Deleted user ${userId}`);\n } catch (error) {\n failed.push(`user:${userId}`);\n console.warn(\n `[Appwrite Cleanup] Failed to delete user ${userId}:`,\n error\n );\n }\n } else if (userEmail) {\n try {\n const usersResult = await users.list([\n Query.equal('email', userEmail),\n Query.limit(10),\n ]);\n for (const user of usersResult.users ?? []) {\n try {\n await users.delete(user.$id);\n deleted.push(`user:${user.$id}`);\n console.log(`[Appwrite Cleanup] Deleted user ${user.$id} (matched by email)`);\n } catch (error) {\n failed.push(`user:${user.$id}`);\n console.warn(`[Appwrite Cleanup] Failed to delete user ${user.$id}:`, error);\n }\n }\n } catch (error) {\n console.warn('[Appwrite Cleanup] Failed to delete users by email:', error);\n }\n }\n } catch (error) {\n console.error('[Appwrite Cleanup] Error during cleanup scan:', error);\n }\n\n console.log(\n `[Appwrite Cleanup] Cleanup complete. Scanned: ${scanned}, Deleted: ${deleted.length}, Failed: ${failed.length}`\n );\n\n return {\n success: failed.length === 0,\n scanned,\n deleted,\n failed,\n };\n }\n\n return {\n name: 'appwrite',\n async configure() {\n // Client is already configured in the factory function\n // This is called by the cleanup executor but we don't need to do anything\n },\n methods,\n cleanupUntracked,\n };\n}\n\n// Default type mappings for Appwrite resources\nexport const appwriteTypeMappings: Record<string, string> = {\n row: 'appwrite.deleteRow',\n file: 'appwrite.deleteFile',\n team: 'appwrite.deleteTeam',\n user: 'appwrite.deleteUser',\n membership: 'appwrite.deleteMembership',\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/providers/appwrite/index.ts"],"names":[],"mappings":";;;;AAAA,cAAA,EAAA;AAeO,SAAS,uBAAuB,MAAA,EAAyC;AAC9E,EAAA,MAAM,MAAA,GAAS,IAAI,MAAA,EAAO,CACvB,YAAY,MAAA,CAAO,QAAQ,CAAA,CAC3B,UAAA,CAAW,MAAA,CAAO,SAAS,CAAA,CAC3B,MAAA,CAAO,OAAO,MAAM,CAAA;AAEvB,EAAA,MAAM,QAAA,GAAW,IAAI,QAAA,CAAS,MAAM,CAAA;AACpC,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,MAAM,CAAA;AAClC,EAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAM,CAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAM,CAAA;AAE9B,EAAA,MAAM,OAAA,GAA0C;AAAA,IAC9C,SAAA,EAAW,OAAO,QAAA,KAA8B;AAC9C,MAAA,MAAM,aAAa,QAAA,CAAS,UAAA;AAC5B,MAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AAEzB,MAAA,IAAI,CAAC,UAAA,IAAc,CAAC,OAAA,EAAS;AAC3B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sCAAA,EAAyC,QAAA,CAAS,EAAE,CAAA,CAAE,CAAA;AAAA,MACxE;AAEA,MAAA,MAAM,SAAS,SAAA,CAAU;AAAA,QACvB,UAAA;AAAA,QACA,OAAA;AAAA,QACA,OAAO,QAAA,CAAS;AAAA,OACjB,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,UAAA,EAAY,OAAO,QAAA,KAA8B;AAC/C,MAAA,MAAM,WAAW,QAAA,CAAS,QAAA;AAE1B,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,QAAA,CAAS,EAAE,CAAA,CAAE,CAAA;AAAA,MAC5D;AAEA,MAAA,MAAM,OAAA,CAAQ,UAAA,CAAW,QAAA,EAAU,QAAA,CAAS,EAAE,CAAA;AAAA,IAChD,CAAA;AAAA,IAEA,UAAA,EAAY,OAAO,QAAA,KAA8B;AAC/C,MAAA,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAAA,IAChC,CAAA;AAAA,IAEA,UAAA,EAAY,OAAO,QAAA,KAA8B;AAC/C,MAAA,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAAA,IAChC,CAAA;AAAA,IAEA,gBAAA,EAAkB,OAAO,QAAA,KAA8B;AACrD,MAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AAExB,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,QAAA,CAAS,EAAE,CAAA,CAAE,CAAA;AAAA,MAChE;AAEA,MAAA,MAAM,KAAA,CAAM,gBAAA,CAAiB,MAAA,EAAQ,QAAA,CAAS,EAAE,CAAA;AAAA,IAClD;AAAA,GACF;AAMA,EAAA,eAAe,iBACb,OAAA,EACiC;AACjC,IAAA,MAAM;AAAA,MACJ,aAAA;AAAA,MACA,qBAAA;AAAA,MACA,MAAA,EAAQ,cAAA;AAAA,MACR,SAAA;AAAA,MACA;AAAA,KACF,GAAI,OAAA;AACJ,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAI,MAAA,GAAS,cAAA;AACb,IAAA,IAAI,sBAAA,GAAyB,aAAA;AAC7B,IAAA,IAAI,qBAAA;AAEJ,IAAA,MAAM,oBAAA,GAAuB,CAAC,WAAA,KAAmC;AAC/D,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,SAAU,EAAC;AACzC,MAAA,OAAO,YAAY,MAAA,CAAO,CAAC,KAAA,KAA2B,OAAO,UAAU,QAAQ,CAAA;AAAA,IACjF,CAAA;AAEA,IAAA,MAAM,sBAAA,GAAyB,CAAC,UAAA,EAAoB,SAAA,KAA+B;AACjF,MAAA,IAAI,WAAW,QAAA,CAAS,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,CAAG,GAAG,OAAO,IAAA;AAClD,MAAA,OAAO,UAAA,CAAW,SAAS,SAAS,CAAA;AAAA,IACtC,CAAA;AAEA,IAAA,MAAM,6BAAA,GAAgC,CAAC,UAAA,EAAoB,UAAA,KAAqC;AAC9F,MAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,QAAA,IAAI,sBAAA,CAAuB,UAAA,EAAY,SAAS,CAAA,EAAG;AACjD,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAEA,IAAA,MAAM,kBAAA,GAAqB,CAAC,WAAA,EAAuB,UAAA,KAAqC;AACtF,MAAA,IAAI,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AACrC,MAAA,OAAO,YAAY,KAAA,CAAM,CAAC,eAAe,6BAAA,CAA8B,UAAA,EAAY,UAAU,CAAC,CAAA;AAAA,IAChG,CAAA;AAEA,IAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,EAAgB,OAAA,KAA+B;AACzE,MAAA,IAAI,KAAA,IAAS,MAAM,OAAO,KAAA;AAC1B,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,OAAO,QAAQ,IAAA,CAAK,CAAC,WAAW,KAAA,CAAM,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,MACxD;AACA,MAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,UAAU,SAAA,EAAW;AAC3D,QAAA,MAAM,QAAA,GAAW,OAAO,KAAK,CAAA;AAC7B,QAAA,OAAO,QAAQ,IAAA,CAAK,CAAC,WAAW,QAAA,CAAS,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,MAC3D;AACA,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,QAAA,OAAO,MAAM,IAAA,CAAK,CAAC,UAAU,kBAAA,CAAmB,KAAA,EAAO,OAAO,CAAC,CAAA;AAAA,MACjE;AACA,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,MAAA,CAAO,KAAgC,CAAA,EAAG;AACnE,UAAA,IAAI,kBAAA,CAAmB,KAAA,EAAO,OAAO,CAAA,EAAG;AACtC,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,QACF;AAAA,MACF;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAEA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,0DAAA,EAA6D,aAAa,SAAS,CAAA;AAAA,KACrF;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oCAAA,EAAuC,aAAa,CAAA,CAAE,CAAA;AAClE,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qCAAA,EAAwC,MAAA,IAAU,MAAM,CAAA,CAAE,CAAA;AACtE,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wCAAA,EAA2C,SAAA,IAAa,MAAM,CAAA,CAAE,CAAA;AAE5E,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,UAAU,SAAA,EAAW;AACxB,QAAA,IAAI;AACF,UAAA,MAAM,WAAA,GAAc,MAAM,KAAA,CAAM,IAAA,CAAK;AAAA,YACnC,KAAA,CAAM,KAAA,CAAM,OAAA,EAAS,SAAS,CAAA;AAAA,YAC9B,KAAA,CAAM,MAAM,CAAC;AAAA,WACd,CAAA;AACD,UAAA,MAAM,WAAA,GAAc,WAAA,CAAY,KAAA,GAAQ,CAAC,CAAA;AACzC,UAAA,IAAI,aAAa,GAAA,EAAK;AACpB,YAAA,MAAA,GAAS,WAAA,CAAY,GAAA;AACrB,YAAA,IAAI,OAAO,WAAA,CAAY,UAAA,KAAe,QAAA,EAAU;AAC9C,cAAA,qBAAA,GAAwB,WAAA,CAAY,UAAA;AAAA,YACtC;AACA,YAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,+CAAA,EAAkD,MAAM,CAAA,CAAE,CAAA;AAAA,UACxE;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,IAAA,CAAK,2DAA2D,KAAK,CAAA;AAAA,QAC/E;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,qBAAA,IAAyB,MAAA,IAAU,CAAC,qBAAA,EAAuB;AAC9D,QAAA,IAAI;AACF,UAAA,MAAM,UAAA,GAAa,MAAM,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA;AACzC,UAAA,IAAI,OAAO,UAAA,CAAW,UAAA,KAAe,QAAA,EAAU;AAC7C,YAAA,qBAAA,GAAwB,UAAA,CAAW,UAAA;AAAA,UACrC;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,IAAA,CAAK,4DAA4D,KAAK,CAAA;AAAA,QAChF;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,yBAAyB,qBAAA,EAAuB;AACnD,QAAA,sBAAA,GAAyB,qBAAA;AACzB,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,+DAA+D,sBAAsB,CAAA;AAAA,SACvF;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,yCAAA,EAA4C,sBAAsB,CAAA,CAAE,CAAA;AAEhF,MAAA,MAAM,YAAA,uBAAmB,GAAA,EAAY;AACrC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,IAAI;AACF,UAAA,OAAA,CAAQ,IAAI,0DAA0D,CAAA;AACtE,UAAA,IAAI,YAAA,GAAe,IAAA;AACnB,UAAA,IAAI,UAAA;AAEJ,UAAA,OAAO,YAAA,EAAc;AACnB,YAAA,MAAM,WAAA,GAAc;AAAA,cAClB,KAAA,CAAM,gBAAA,CAAiB,YAAA,EAAc,sBAAsB,CAAA;AAAA,cAC3D,KAAA,CAAM,MAAM,GAAG;AAAA,aACjB;AACA,YAAA,IAAI,UAAA,EAAY;AACd,cAAA,WAAA,CAAY,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,UAAU,CAAC,CAAA;AAAA,YAChD;AAEA,YAAA,MAAM,SAAA,GAAY,MAAM,KAAA,CAAM,IAAA,CAAK,WAAW,CAAA;AAC9C,YAAA,KAAA,MAAW,IAAA,IAAQ,UAAU,KAAA,EAAO;AAClC,cAAA,IAAI,gBAAA;AACJ,cAAA,IAAI,cAAA,GAAiB,IAAA;AACrB,cAAA,MAAM,gBAA0B,EAAC;AAEjC,cAAA,OAAO,cAAA,EAAgB;AACrB,gBAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,CAAM,KAAA,CAAM,GAAG,CAAC,CAAA;AACvC,gBAAA,IAAI,gBAAA,EAAkB;AACpB,kBAAA,aAAA,CAAc,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,gBAAgB,CAAC,CAAA;AAAA,gBACxD;AAEA,gBAAA,MAAM,cAAc,MAAM,KAAA,CAAM,eAAA,CAAgB,IAAA,CAAK,KAAK,aAAa,CAAA;AACvE,gBAAA,KAAA,MAAW,UAAA,IAAc,YAAY,WAAA,EAAa;AAChD,kBAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,oBAAA,aAAA,CAAc,IAAA,CAAK,WAAW,MAAM,CAAA;AAAA,kBACtC;AAAA,gBACF;AAEA,gBAAA,IAAI,WAAA,CAAY,WAAA,CAAY,MAAA,GAAS,GAAA,EAAK;AACxC,kBAAA,cAAA,GAAiB,KAAA;AAAA,gBACnB,CAAA,MAAO;AACL,kBAAA,gBAAA,GAAmB,YAAY,WAAA,CAAY,WAAA,CAAY,WAAA,CAAY,MAAA,GAAS,CAAC,CAAA,CAAE,GAAA;AAAA,gBACjF;AAAA,cACF;AAEA,cAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,aAAa,CAAA;AAC3C,cAAA,IAAI,cAAc,IAAA,KAAS,CAAA,IAAK,aAAA,CAAc,GAAA,CAAI,MAAM,CAAA,EAAG;AACzD,gBAAA,YAAA,CAAa,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,cAC3B;AAAA,YACF;AAEA,YAAA,IAAI,SAAA,CAAU,KAAA,CAAM,MAAA,GAAS,GAAA,EAAK;AAChC,cAAA,YAAA,GAAe,KAAA;AAAA,YACjB,CAAA,MAAO;AACL,cAAA,UAAA,GAAa,UAAU,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAE,GAAA;AAAA,YAC3D;AAAA,UACF;AAEA,UAAA,IAAI,YAAA,CAAa,OAAO,CAAA,EAAG;AACzB,YAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,yBAAA,EAA4B,YAAA,CAAa,IAAI,CAAA,iBAAA,CAAmB,CAAA;AAAA,UAC9E;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,IAAA,CAAK,iEAAiE,KAAK,CAAA;AAAA,QACrF;AAAA,MACF;AAEA,MAAA,MAAM,cAAA,uBAAqB,GAAA,EAAY;AACvC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,cAAA,CAAe,GAAA,CAAI,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAE,CAAA;AAAA,MACrC;AACA,MAAA,KAAA,MAAW,UAAU,YAAA,EAAc;AACjC,QAAA,cAAA,CAAe,GAAA,CAAI,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAE,CAAA;AAAA,MACrC;AAGA,MAAA,OAAA,CAAQ,IAAI,yCAAyC,CAAA;AACrD,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,yBAAA,EAA4B,SAAA,CAAU,SAAA,CAAU,MAAM,CAAA,kBAAA;AAAA,OACxD;AAEA,MAAA,KAAA,MAAW,EAAA,IAAM,UAAU,SAAA,EAAW;AAEpC,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,+CAAA,EAAkD,EAAA,CAAG,GAAG,CAAA,GAAA,CAAK,CAAA;AACzE,QAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,UAAA,CAAW,EAAE,UAAA,EAAY,EAAA,CAAG,KAAK,CAAA;AAC/D,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,CAAA,6BAAA,EAAgC,GAAG,IAAI,CAAA,GAAA,EAAM,GAAG,GAAG,CAAA,GAAA,EAAM,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,OAAA;AAAA,SAC/E;AAEA,QAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AAEjC,UAAA,IAAI,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,gBAAgB,CAAA,EAAG;AAC3C,YAAA,OAAA,CAAQ,GAAA;AAAA,cACN,CAAA,4CAAA,EAA+C,MAAM,IAAI,CAAA;AAAA,aAC3D;AACA,YAAA;AAAA,UACF;AAEA,UAAA,OAAA,EAAA;AAEA,UAAA,IAAI;AAEF,YAAA,IAAI,OAAA,GAAU,IAAA;AACd,YAAA,IAAI,MAAA;AAEJ,YAAA,IAAI,iBAAA,GAAoB,CAAA;AACxB,YAAA,OAAO,OAAA,EAAS;AACd,cAAA,MAAM,OAAA,GAAU;AAAA,gBACd,KAAA,CAAM,gBAAA,CAAiB,YAAA,EAAc,sBAAsB,CAAA;AAAA,gBAC3D,KAAA,CAAM,SAAS,YAAY,CAAA;AAAA,gBAC3B,KAAA,CAAM,SAAS,KAAK,CAAA;AAAA,gBACpB,KAAA,CAAM,MAAM,GAAG;AAAA,eACjB;AAEA,cAAA,IAAI,MAAA,EAAQ;AACV,gBAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,MAAM,CAAC,CAAA;AAAA,cACxC;AAEA,cAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,QAAA,CAAS;AAAA,gBACnC,YAAY,EAAA,CAAG,GAAA;AAAA,gBACf,SAAS,KAAA,CAAM,GAAA;AAAA,gBACf;AAAA,eACD,CAAA;AAED,cAAA,KAAA,MAAW,GAAA,IAAO,KAAK,IAAA,EAAM;AAC3B,gBAAA,MAAM,YAAA,GAAe,CAAC,MAAA,EAAQ,SAAS,CAAA,CAAE,MAAA;AAAA,kBACvC,CAAC,MAAA,KAA6B,OAAA,CAAQ,MAAM;AAAA,iBAC9C;AACA,gBAAA,MAAM,cAAA,GAAiB,oBAAA;AAAA,kBACpB,GAAA,CAAgC,gBAChC,GAAA,CAAgC;AAAA,iBACnC;AACA,gBAAA,MAAM,sBAAA,GAAyB,kBAAA,CAAmB,cAAA,EAAgB,cAAc,CAAA;AAChF,gBAAA,MAAM,gBAAgB,YAAA,CAAa,MAAA,GAAS,IACxC,kBAAA,CAAmB,GAAA,EAAK,YAAY,CAAA,GACpC,KAAA;AACJ,gBAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,MAAA,IAAU,GAAA,CAAI,QAAQ,MAAM,CAAA;AAEzD,gBAAA,MAAM,YAAA,GAAe,gBAAgB,aAAA,IAAiB,sBAAA;AAEtD,gBAAA,IAAI,YAAA,EAAc;AAChB,kBAAA,iBAAA,EAAA;AACA,kBAAA,IAAI;AACF,oBAAA,MAAM,SAAS,SAAA,CAAU;AAAA,sBACvB,YAAY,EAAA,CAAG,GAAA;AAAA,sBACf,SAAS,KAAA,CAAM,GAAA;AAAA,sBACf,OAAO,GAAA,CAAI;AAAA,qBACZ,CAAA;AACD,oBAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,IAAA,EAAO,EAAA,CAAG,GAAG,CAAA,CAAA,EAAI,MAAM,GAAG,CAAA,CAAA,EAAI,GAAA,CAAI,GAAG,CAAA,CAAE,CAAA;AACpD,oBAAA,OAAA,CAAQ,GAAA;AAAA,sBACN,CAAA,+BAAA,EAAkC,GAAA,CAAI,GAAG,CAAA,MAAA,EAAS,MAAM,IAAI,CAAA;AAAA,qBAC9D;AAAA,kBACF,SAAS,KAAA,EAAO;AACd,oBAAA,MAAA,CAAO,IAAA,CAAK,CAAA,IAAA,EAAO,EAAA,CAAG,GAAG,CAAA,CAAA,EAAI,MAAM,GAAG,CAAA,CAAA,EAAI,GAAA,CAAI,GAAG,CAAA,CAAE,CAAA;AACnD,oBAAA,OAAA,CAAQ,IAAA;AAAA,sBACN,CAAA,wCAAA,EAA2C,IAAI,GAAG,CAAA,CAAA,CAAA;AAAA,sBAClD;AAAA,qBACF;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAGA,cAAA,IAAI,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,GAAA,EAAK;AAC1B,gBAAA,OAAA,GAAU,KAAA;AAAA,cACZ,CAAA,MAAO;AACL,gBAAA,MAAA,GAAS,KAAK,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,CAAE,GAAA;AAAA,cAC3C;AAAA,YACF;AAEA,YAAA,IAAI,oBAAoB,CAAA,EAAG;AACzB,cAAA,OAAA,CAAQ,GAAA;AAAA,gBACN,CAAA,0BAAA,EAA6B,KAAA,CAAM,IAAI,CAAA,WAAA,EAAc,iBAAiB,CAAA,iBAAA;AAAA,eACxE;AAAA,YACF;AAAA,UACF,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,IAAA;AAAA,cACN,CAAA,wCAAA,EAA2C,MAAM,IAAI,CAAA,CAAA,CAAA;AAAA,cACrD;AAAA,aACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,MAAA,OAAA,CAAQ,IAAI,+CAA+C,CAAA;AAC3D,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,WAAA,CAAY;AAAA,QACxC,KAAA,CAAM,gBAAA,CAAiB,YAAA,EAAc,sBAAsB,CAAA;AAAA,QAC3D,KAAA,CAAM,MAAM,GAAG;AAAA,OAChB,CAAA;AACD,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,yBAAA,EAA4B,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,gBAAA;AAAA,OACpD;AAEA,MAAA,KAAA,MAAW,MAAA,IAAU,QAAQ,OAAA,EAAS;AACpC,QAAA,OAAA,EAAA;AACA,QAAA,MAAM,iBAAA,GAAoB,oBAAA;AAAA,UACvB,MAAA,CAAmC,gBACnC,MAAA,CAAmC;AAAA,SACtC;AACA,QAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,MAAA,IAAU,MAAA,CAAO,QAAQ,MAAM,CAAA;AAC/D,QAAA,MAAM,sBAAA,GAAyB,OAAA;AAAA,UAC7B,aAAa,IAAA,GAAO,CAAA,IAAK,YAAA,CAAa,GAAA,CAAI,OAAO,GAAG;AAAA,SACtD;AACA,QAAA,MAAM,iBAAA,GAAoB,OAAA;AAAA,UACvB,MAAA,IAAU,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,MAAM,KACrC,SAAA,IAAa,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,SAAS;AAAA,SAC9C;AACA,QAAA,MAAM,4BAAA,GAA+B,kBAAA,CAAmB,iBAAA,EAAmB,cAAc,CAAA;AACzF,QAAA,MAAM,aAAA,GAAgB,CAAC,MAAA,EAAQ,SAAS,CAAA,CAAE,MAAA;AAAA,UACxC,CAAC,MAAA,KAA6B,OAAA,CAAQ,MAAM;AAAA,SAC9C;AACA,QAAA,MAAM,sBAAsB,aAAA,CAAc,MAAA,GAAS,IAC/C,kBAAA,CAAmB,MAAA,EAAQ,aAAa,CAAA,GACxC,KAAA;AACJ,QAAA,MAAM,kBAAA,GACJ,eAAA,IACA,sBAAA,IACA,iBAAA,IACA,4BAAA,IACA,mBAAA;AAEF,QAAA,IAAI;AACF,UAAA,IAAI,OAAA,GAAU,IAAA;AACd,UAAA,IAAI,MAAA;AAEJ,UAAA,IAAI,kBAAA,GAAqB,CAAA;AACzB,UAAA,OAAO,OAAA,EAAS;AACd,YAAA,MAAM,OAAA,GAAU,kBAAA,GACZ,CAAC,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,EAAG,KAAA,CAAM,KAAA,CAAM,GAAG,CAAC,CAAA,GACxC;AAAA,cACA,KAAA,CAAM,gBAAA,CAAiB,YAAA,EAAc,sBAAsB,CAAA;AAAA,cAC3D,KAAA,CAAM,SAAS,YAAY,CAAA;AAAA,cAC3B,KAAA,CAAM,SAAS,KAAK,CAAA;AAAA,cACpB,KAAA,CAAM,MAAM,GAAG;AAAA,aACjB;AAEF,YAAA,IAAI,MAAA,EAAQ;AACV,cAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,MAAM,CAAC,CAAA;AAAA,YACxC;AAEA,YAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,SAAA,CAAU;AAAA,cACpC,UAAU,MAAA,CAAO,GAAA;AAAA,cACjB;AAAA,aACD,CAAA;AAED,YAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAG9B,cAAA,MAAM,UAAA,GAAa,IAAA;AACnB,cAAA,MAAM,YAAY,UAAA,CAAW,UAAA;AAC7B,cAAA,MAAM,eAAA,GAAkB,oBAAA;AAAA,gBACtB,UAAA,CAAW,gBAAgB,UAAA,CAAW;AAAA,eACxC;AACA,cAAA,MAAM,0BAAA,GAA6B,kBAAA,CAAmB,eAAA,EAAiB,cAAc,CAAA;AACrF,cAAA,MAAM,WAAA,GAAc,CAAC,MAAA,EAAQ,SAAS,CAAA,CAAE,MAAA;AAAA,gBACtC,CAAC,MAAA,KAA6B,OAAA,CAAQ,MAAM;AAAA,eAC9C;AACA,cAAA,MAAM,oBAAoB,WAAA,CAAY,MAAA,GAAS,IAC3C,kBAAA,CAAmB,UAAA,EAAY,WAAW,CAAA,GAC1C,KAAA;AACJ,cAAA,MAAM,YAAA,GACJ,kBAAA,IACA,0BAAA,IACA,iBAAA,IACC,UAAU,SAAA,KAAc,MAAA;AAE3B,cAAA,IAAI,YAAA,EAAc;AAChB,gBAAA,kBAAA,EAAA;AACA,gBAAA,IAAI;AACF,kBAAA,MAAM,QAAQ,UAAA,CAAW;AAAA,oBACvB,UAAU,MAAA,CAAO,GAAA;AAAA,oBACjB,QAAQ,IAAA,CAAK;AAAA,mBACd,CAAA;AACD,kBAAA,OAAA,CAAQ,KAAK,CAAA,KAAA,EAAQ,MAAA,CAAO,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,GAAG,CAAA,CAAE,CAAA;AAC7C,kBAAA,OAAA,CAAQ,GAAA;AAAA,oBACN,CAAA,gCAAA,EAAmC,IAAA,CAAK,GAAG,CAAA,aAAA,EAAgB,OAAO,IAAI,CAAA;AAAA,mBACxE;AAAA,gBACF,SAAS,KAAA,EAAO;AACd,kBAAA,MAAA,CAAO,KAAK,CAAA,KAAA,EAAQ,MAAA,CAAO,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,GAAG,CAAA,CAAE,CAAA;AAC5C,kBAAA,OAAA,CAAQ,IAAA;AAAA,oBACN,CAAA,yCAAA,EAA4C,KAAK,GAAG,CAAA,CAAA,CAAA;AAAA,oBACpD;AAAA,mBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAGA,YAAA,IAAI,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,GAAA,EAAK;AAC5B,cAAA,OAAA,GAAU,KAAA;AAAA,YACZ,CAAA,MAAO;AACL,cAAA,MAAA,GAAS,MAAM,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAE,GAAA;AAAA,YAC/C;AAAA,UACF;AAEA,UAAA,IAAI,qBAAqB,CAAA,EAAG;AAC1B,YAAA,OAAA,CAAQ,GAAA;AAAA,cACN,CAAA,2BAAA,EAA8B,MAAA,CAAO,IAAI,CAAA,WAAA,EAAc,kBAAkB,CAAA,kBAAA;AAAA,aAC3E;AAAA,UACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,IAAA;AAAA,YACN,CAAA,yCAAA,EAA4C,OAAO,IAAI,CAAA,CAAA,CAAA;AAAA,YACvD;AAAA,WACF;AAAA,QACF;AAEA,QAAA,IAAI,kBAAA,EAAoB;AACtB,UAAA,IAAI;AACF,YAAA,MAAM,OAAA,CAAQ,YAAA,CAAa,MAAA,CAAO,GAAG,CAAA;AACrC,YAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,OAAA,EAAU,MAAA,CAAO,GAAG,CAAA,CAAE,CAAA;AACnC,YAAA,OAAA,CAAQ,IAAI,CAAA,kCAAA,EAAqC,MAAA,CAAO,IAAI,CAAA,EAAA,EAAK,MAAA,CAAO,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,UAChF,SAAS,KAAA,EAAO;AACd,YAAA,MAAA,CAAO,IAAA,CAAK,CAAA,OAAA,EAAU,MAAA,CAAO,GAAG,CAAA,CAAE,CAAA;AAClC,YAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,2CAAA,EAA8C,MAAA,CAAO,GAAG,KAAK,KAAK,CAAA;AAAA,UACjF;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,uCAAA,EAA0C,MAAM,CAAA,CAAE,CAAA;AAC9D,QAAA,IAAI;AACF,UAAA,MAAM,KAAA,CAAM,OAAO,MAAM,CAAA;AACzB,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAE,CAAA;AAC7B,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gCAAA,EAAmC,MAAM,CAAA,CAAE,CAAA;AAAA,QACzD,SAAS,KAAA,EAAO;AACd,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAE,CAAA;AAC5B,UAAA,OAAA,CAAQ,IAAA;AAAA,YACN,4CAA4C,MAAM,CAAA,CAAA,CAAA;AAAA,YAClD;AAAA,WACF;AAAA,QACF;AAAA,MACF,WAAW,SAAA,EAAW;AACpB,QAAA,IAAI;AACF,UAAA,MAAM,WAAA,GAAc,MAAM,KAAA,CAAM,IAAA,CAAK;AAAA,YACnC,KAAA,CAAM,KAAA,CAAM,OAAA,EAAS,SAAS,CAAA;AAAA,YAC9B,KAAA,CAAM,MAAM,EAAE;AAAA,WACf,CAAA;AACD,UAAA,KAAA,MAAW,IAAA,IAAQ,WAAA,CAAY,KAAA,IAAS,EAAC,EAAG;AAC1C,YAAA,IAAI;AACF,cAAA,MAAM,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAC3B,cAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAG,CAAA,CAAE,CAAA;AAC/B,cAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gCAAA,EAAmC,IAAA,CAAK,GAAG,CAAA,mBAAA,CAAqB,CAAA;AAAA,YAC9E,SAAS,KAAA,EAAO;AACd,cAAA,MAAA,CAAO,IAAA,CAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAG,CAAA,CAAE,CAAA;AAC9B,cAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,yCAAA,EAA4C,IAAA,CAAK,GAAG,KAAK,KAAK,CAAA;AAAA,YAC7E;AAAA,UACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,IAAA,CAAK,uDAAuD,KAAK,CAAA;AAAA,QAC3E;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,iDAAiD,KAAK,CAAA;AAAA,IACtE;AAEA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,iDAAiD,OAAO,CAAA,WAAA,EAAc,QAAQ,MAAM,CAAA,UAAA,EAAa,OAAO,MAAM,CAAA;AAAA,KAChH;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,OAAO,MAAA,KAAW,CAAA;AAAA,MAC3B,OAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,MAAM,SAAA,GAAY;AAAA,IAGlB,CAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;AAGO,IAAM,oBAAA,GAA+C;AAAA,EAC1D,GAAA,EAAK,oBAAA;AAAA,EACL,IAAA,EAAM,qBAAA;AAAA,EACN,IAAA,EAAM,qBAAA;AAAA,EACN,IAAA,EAAM,qBAAA;AAAA,EACN,UAAA,EAAY;AACd","file":"chunk-3LE4HBUY.js","sourcesContent":["import { Client, Users, TablesDB, Storage, Teams, Query } from 'node-appwrite';\nimport type {\n CleanupProvider,\n CleanupHandler,\n CleanupUntrackedOptions,\n CleanupUntrackedResult,\n} from '../../core/cleanup/types.js';\nimport type { TrackedResource } from '../../integration/index.js';\n\ninterface AppwriteConfig {\n endpoint: string;\n projectId: string;\n apiKey: string;\n}\n\nexport function createAppwriteProvider(config: AppwriteConfig): CleanupProvider {\n const client = new Client()\n .setEndpoint(config.endpoint)\n .setProject(config.projectId)\n .setKey(config.apiKey);\n\n const tablesDB = new TablesDB(client);\n const storage = new Storage(client);\n const teams = new Teams(client);\n const users = new Users(client);\n\n const methods: Record<string, CleanupHandler> = {\n deleteRow: async (resource: TrackedResource) => {\n const databaseId = resource.databaseId as string;\n const tableId = resource.tableId as string;\n\n if (!databaseId || !tableId) {\n throw new Error(`Missing databaseId or tableId for row ${resource.id}`);\n }\n\n await tablesDB.deleteRow({\n databaseId,\n tableId,\n rowId: resource.id,\n });\n },\n\n deleteFile: async (resource: TrackedResource) => {\n const bucketId = resource.bucketId as string;\n\n if (!bucketId) {\n throw new Error(`Missing bucketId for file ${resource.id}`);\n }\n\n await storage.deleteFile(bucketId, resource.id);\n },\n\n deleteTeam: async (resource: TrackedResource) => {\n await teams.delete(resource.id);\n },\n\n deleteUser: async (resource: TrackedResource) => {\n await users.delete(resource.id);\n },\n\n deleteMembership: async (resource: TrackedResource) => {\n const teamId = resource.teamId as string;\n\n if (!teamId) {\n throw new Error(`Missing teamId for membership ${resource.id}`);\n }\n\n await teams.deleteMembership(teamId, resource.id);\n },\n };\n\n /**\n * Scan all Appwrite tables for resources created after testStartTime\n * that contain the userId in any field, and delete them.\n */\n async function cleanupUntracked(\n options: CleanupUntrackedOptions\n ): Promise<CleanupUntrackedResult> {\n const {\n testStartTime,\n testStartTimeProvided,\n userId: providedUserId,\n userEmail,\n sessionId,\n } = options;\n const deleted: string[] = [];\n const failed: string[] = [];\n let scanned = 0;\n let userId = providedUserId;\n let effectiveTestStartTime = testStartTime;\n let resolvedUserCreatedAt: string | undefined;\n\n const normalizePermissions = (permissions: unknown): string[] => {\n if (!Array.isArray(permissions)) return [];\n return permissions.filter((entry): entry is string => typeof entry === 'string');\n };\n\n const permissionHasPrincipal = (permission: string, principal: string): boolean => {\n if (permission.includes(`\"${principal}\"`)) return true;\n return permission.includes(principal);\n };\n\n const permissionBelongsToPrincipals = (permission: string, principals: Set<string>): boolean => {\n for (const principal of principals) {\n if (permissionHasPrincipal(permission, principal)) {\n return true;\n }\n }\n return false;\n };\n\n const onlyPermissionsFor = (permissions: string[], principals: Set<string>): boolean => {\n if (permissions.length === 0) return false;\n return permissions.every((permission) => permissionBelongsToPrincipals(permission, principals));\n };\n\n const valueContainsMatch = (value: unknown, needles: string[]): boolean => {\n if (value == null) return false;\n if (typeof value === 'string') {\n return needles.some((needle) => value.includes(needle));\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n const strValue = String(value);\n return needles.some((needle) => strValue.includes(needle));\n }\n if (Array.isArray(value)) {\n return value.some((entry) => valueContainsMatch(entry, needles));\n }\n if (typeof value === 'object') {\n for (const entry of Object.values(value as Record<string, unknown>)) {\n if (valueContainsMatch(entry, needles)) {\n return true;\n }\n }\n }\n return false;\n };\n\n console.log(\n `[Appwrite Cleanup] Starting untracked cleanup for session ${sessionId || 'unknown'}`\n );\n console.log(`[Appwrite Cleanup] Test start time: ${testStartTime}`);\n console.log(`[Appwrite Cleanup] User ID to match: ${userId || 'none'}`);\n console.log(`[Appwrite Cleanup] User email to match: ${userEmail || 'none'}`);\n\n try {\n if (!userId && userEmail) {\n try {\n const usersResult = await users.list([\n Query.equal('email', userEmail),\n Query.limit(1),\n ]);\n const matchedUser = usersResult.users?.[0];\n if (matchedUser?.$id) {\n userId = matchedUser.$id;\n if (typeof matchedUser.$createdAt === 'string') {\n resolvedUserCreatedAt = matchedUser.$createdAt;\n }\n console.log(`[Appwrite Cleanup] Resolved userId from email: ${userId}`);\n }\n } catch (error) {\n console.warn('[Appwrite Cleanup] Failed to resolve userId from email:', error);\n }\n }\n\n if (!testStartTimeProvided && userId && !resolvedUserCreatedAt) {\n try {\n const userRecord = await users.get(userId);\n if (typeof userRecord.$createdAt === 'string') {\n resolvedUserCreatedAt = userRecord.$createdAt;\n }\n } catch (error) {\n console.warn('[Appwrite Cleanup] Failed to resolve user creation time:', error);\n }\n }\n\n if (!testStartTimeProvided && resolvedUserCreatedAt) {\n effectiveTestStartTime = resolvedUserCreatedAt;\n console.log(\n `[Appwrite Cleanup] Using user createdAt as test start time: ${effectiveTestStartTime}`\n );\n }\n\n console.log(`[Appwrite Cleanup] Effective start time: ${effectiveTestStartTime}`);\n\n const ownedTeamIds = new Set<string>();\n if (userId) {\n try {\n console.log('[Appwrite Cleanup] Listing teams for ownership checks...');\n let hasMoreTeams = true;\n let teamCursor: string | undefined;\n\n while (hasMoreTeams) {\n const teamQueries = [\n Query.greaterThanEqual('$createdAt', effectiveTestStartTime),\n Query.limit(100),\n ];\n if (teamCursor) {\n teamQueries.push(Query.cursorAfter(teamCursor));\n }\n\n const teamsList = await teams.list(teamQueries);\n for (const team of teamsList.teams) {\n let membershipCursor: string | undefined;\n let hasMoreMembers = true;\n const memberUserIds: string[] = [];\n\n while (hasMoreMembers) {\n const memberQueries = [Query.limit(100)];\n if (membershipCursor) {\n memberQueries.push(Query.cursorAfter(membershipCursor));\n }\n\n const memberships = await teams.listMemberships(team.$id, memberQueries);\n for (const membership of memberships.memberships) {\n if (membership.userId) {\n memberUserIds.push(membership.userId);\n }\n }\n\n if (memberships.memberships.length < 100) {\n hasMoreMembers = false;\n } else {\n membershipCursor = memberships.memberships[memberships.memberships.length - 1].$id;\n }\n }\n\n const uniqueMembers = new Set(memberUserIds);\n if (uniqueMembers.size === 1 && uniqueMembers.has(userId)) {\n ownedTeamIds.add(team.$id);\n }\n }\n\n if (teamsList.teams.length < 100) {\n hasMoreTeams = false;\n } else {\n teamCursor = teamsList.teams[teamsList.teams.length - 1].$id;\n }\n }\n\n if (ownedTeamIds.size > 0) {\n console.log(`[Appwrite Cleanup] Found ${ownedTeamIds.size} user-owned teams`);\n }\n } catch (error) {\n console.warn('[Appwrite Cleanup] Failed to list teams for ownership checks:', error);\n }\n }\n\n const userPrincipals = new Set<string>();\n if (userId) {\n userPrincipals.add(`user:${userId}`);\n }\n for (const teamId of ownedTeamIds) {\n userPrincipals.add(`team:${teamId}`);\n }\n\n // 1. List all databases\n console.log('[Appwrite Cleanup] Listing databases...');\n const databases = await tablesDB.list();\n console.log(\n `[Appwrite Cleanup] Found ${databases.databases.length} databases to scan`\n );\n\n for (const db of databases.databases) {\n // 2. List all tables in each database\n console.log(`[Appwrite Cleanup] Listing tables for database ${db.$id}...`);\n const tables = await tablesDB.listTables({ databaseId: db.$id });\n console.log(\n `[Appwrite Cleanup] Database \"${db.name}\" (${db.$id}): ${tables.tables.length} tables`\n );\n\n for (const table of tables.tables) {\n // Skip tracking tables (tables starting with _intellitester)\n if (table.name.startsWith('_intellitester')) {\n console.log(\n `[Appwrite Cleanup] Skipping tracking table: ${table.name}`\n );\n continue;\n }\n\n scanned++;\n\n try {\n // 3. Query for rows created after testStartTime with pagination\n let hasMore = true;\n let cursor: string | undefined;\n\n let tableMatchesFound = 0;\n while (hasMore) {\n const queries = [\n Query.greaterThanEqual('$createdAt', effectiveTestStartTime),\n Query.orderAsc('$createdAt'),\n Query.orderAsc('$id'),\n Query.limit(100),\n ];\n\n if (cursor) {\n queries.push(Query.cursorAfter(cursor));\n }\n\n const rows = await tablesDB.listRows({\n databaseId: db.$id,\n tableId: table.$id,\n queries,\n });\n\n for (const row of rows.rows) {\n const matchNeedles = [userId, userEmail].filter(\n (needle): needle is string => Boolean(needle)\n );\n const rowPermissions = normalizePermissions(\n (row as Record<string, unknown>).$permissions ??\n (row as Record<string, unknown>).permissions\n );\n const hasOnlyUserPermissions = onlyPermissionsFor(rowPermissions, userPrincipals);\n const matchesValues = matchNeedles.length > 0\n ? valueContainsMatch(row, matchNeedles)\n : false;\n const matchesRowId = Boolean(userId && row.$id === userId);\n\n const shouldDelete = matchesRowId || matchesValues || hasOnlyUserPermissions;\n\n if (shouldDelete) {\n tableMatchesFound++;\n try {\n await tablesDB.deleteRow({\n databaseId: db.$id,\n tableId: table.$id,\n rowId: row.$id,\n });\n deleted.push(`row:${db.$id}/${table.$id}/${row.$id}`);\n console.log(\n `[Appwrite Cleanup] Deleted row ${row.$id} from ${table.name}`\n );\n } catch (error) {\n failed.push(`row:${db.$id}/${table.$id}/${row.$id}`);\n console.warn(\n `[Appwrite Cleanup] Failed to delete row ${row.$id}:`,\n error\n );\n }\n }\n }\n\n // Check if we need to paginate\n if (rows.rows.length < 100) {\n hasMore = false;\n } else {\n cursor = rows.rows[rows.rows.length - 1].$id;\n }\n }\n\n if (tableMatchesFound > 0) {\n console.log(\n `[Appwrite Cleanup] Table \"${table.name}\": matched ${tableMatchesFound} rows for cleanup`\n );\n }\n } catch (error) {\n console.warn(\n `[Appwrite Cleanup] Error scanning table ${table.name}:`,\n error\n );\n }\n }\n }\n\n // 5. Scan storage buckets for files\n console.log('[Appwrite Cleanup] Listing storage buckets...');\n const buckets = await storage.listBuckets([\n Query.greaterThanEqual('$createdAt', effectiveTestStartTime),\n Query.limit(100),\n ]);\n console.log(\n `[Appwrite Cleanup] Found ${buckets.buckets.length} buckets to scan`\n );\n\n for (const bucket of buckets.buckets) {\n scanned++;\n const bucketPermissions = normalizePermissions(\n (bucket as Record<string, unknown>).$permissions ??\n (bucket as Record<string, unknown>).permissions\n );\n const bucketMatchesId = Boolean(userId && bucket.$id === userId);\n const bucketMatchesOwnedTeam = Boolean(\n ownedTeamIds.size > 0 && ownedTeamIds.has(bucket.$id)\n );\n const bucketMatchesName = Boolean(\n (userId && bucket.name.includes(userId)) ||\n (userEmail && bucket.name.includes(userEmail))\n );\n const bucketHasOnlyUserPermissions = onlyPermissionsFor(bucketPermissions, userPrincipals);\n const bucketNeedles = [userId, userEmail].filter(\n (needle): needle is string => Boolean(needle)\n );\n const bucketMatchesValues = bucketNeedles.length > 0\n ? valueContainsMatch(bucket, bucketNeedles)\n : false;\n const bucketShouldDelete =\n bucketMatchesId ||\n bucketMatchesOwnedTeam ||\n bucketMatchesName ||\n bucketHasOnlyUserPermissions ||\n bucketMatchesValues;\n\n try {\n let hasMore = true;\n let cursor: string | undefined;\n\n let bucketMatchesFound = 0;\n while (hasMore) {\n const queries = bucketShouldDelete\n ? [Query.orderAsc('$id'), Query.limit(100)]\n : [\n Query.greaterThanEqual('$createdAt', effectiveTestStartTime),\n Query.orderAsc('$createdAt'),\n Query.orderAsc('$id'),\n Query.limit(100),\n ];\n\n if (cursor) {\n queries.push(Query.cursorAfter(cursor));\n }\n\n const files = await storage.listFiles({\n bucketId: bucket.$id,\n queries,\n });\n\n for (const file of files.files) {\n // Files don't have custom fields, but check name patterns\n // Note: $createdBy might not exist on all file objects\n const fileRecord = file as Record<string, unknown>;\n const createdBy = fileRecord.$createdBy as string | undefined;\n const filePermissions = normalizePermissions(\n fileRecord.$permissions ?? fileRecord.permissions\n );\n const fileHasOnlyUserPermissions = onlyPermissionsFor(filePermissions, userPrincipals);\n const fileNeedles = [userId, userEmail].filter(\n (needle): needle is string => Boolean(needle)\n );\n const fileMatchesValues = fileNeedles.length > 0\n ? valueContainsMatch(fileRecord, fileNeedles)\n : false;\n const shouldDelete =\n bucketShouldDelete ||\n fileHasOnlyUserPermissions ||\n fileMatchesValues ||\n (userId && createdBy === userId);\n\n if (shouldDelete) {\n bucketMatchesFound++;\n try {\n await storage.deleteFile({\n bucketId: bucket.$id,\n fileId: file.$id,\n });\n deleted.push(`file:${bucket.$id}/${file.$id}`);\n console.log(\n `[Appwrite Cleanup] Deleted file ${file.$id} from bucket ${bucket.name}`\n );\n } catch (error) {\n failed.push(`file:${bucket.$id}/${file.$id}`);\n console.warn(\n `[Appwrite Cleanup] Failed to delete file ${file.$id}:`,\n error\n );\n }\n }\n }\n\n // Check if we need to paginate\n if (files.files.length < 100) {\n hasMore = false;\n } else {\n cursor = files.files[files.files.length - 1].$id;\n }\n }\n\n if (bucketMatchesFound > 0) {\n console.log(\n `[Appwrite Cleanup] Bucket \"${bucket.name}\": matched ${bucketMatchesFound} files for cleanup`\n );\n }\n } catch (error) {\n console.warn(\n `[Appwrite Cleanup] Error scanning bucket ${bucket.name}:`,\n error\n );\n }\n\n if (bucketShouldDelete) {\n try {\n await storage.deleteBucket(bucket.$id);\n deleted.push(`bucket:${bucket.$id}`);\n console.log(`[Appwrite Cleanup] Deleted bucket ${bucket.name} (${bucket.$id})`);\n } catch (error) {\n failed.push(`bucket:${bucket.$id}`);\n console.warn(`[Appwrite Cleanup] Failed to delete bucket ${bucket.$id}:`, error);\n }\n }\n }\n\n // 6. Delete the test user last\n if (userId) {\n console.log(`[Appwrite Cleanup] Deleting test user: ${userId}`);\n try {\n await users.delete(userId);\n deleted.push(`user:${userId}`);\n console.log(`[Appwrite Cleanup] Deleted user ${userId}`);\n } catch (error) {\n failed.push(`user:${userId}`);\n console.warn(\n `[Appwrite Cleanup] Failed to delete user ${userId}:`,\n error\n );\n }\n } else if (userEmail) {\n try {\n const usersResult = await users.list([\n Query.equal('email', userEmail),\n Query.limit(10),\n ]);\n for (const user of usersResult.users ?? []) {\n try {\n await users.delete(user.$id);\n deleted.push(`user:${user.$id}`);\n console.log(`[Appwrite Cleanup] Deleted user ${user.$id} (matched by email)`);\n } catch (error) {\n failed.push(`user:${user.$id}`);\n console.warn(`[Appwrite Cleanup] Failed to delete user ${user.$id}:`, error);\n }\n }\n } catch (error) {\n console.warn('[Appwrite Cleanup] Failed to delete users by email:', error);\n }\n }\n } catch (error) {\n console.error('[Appwrite Cleanup] Error during cleanup scan:', error);\n }\n\n console.log(\n `[Appwrite Cleanup] Cleanup complete. Scanned: ${scanned}, Deleted: ${deleted.length}, Failed: ${failed.length}`\n );\n\n return {\n success: failed.length === 0,\n scanned,\n deleted,\n failed,\n };\n }\n\n return {\n name: 'appwrite',\n async configure() {\n // Client is already configured in the factory function\n // This is called by the cleanup executor but we don't need to do anything\n },\n methods,\n cleanupUntracked,\n };\n}\n\n// Default type mappings for Appwrite resources\nexport const appwriteTypeMappings: Record<string, string> = {\n row: 'appwrite.deleteRow',\n file: 'appwrite.deleteFile',\n team: 'appwrite.deleteTeam',\n user: 'appwrite.deleteUser',\n membership: 'appwrite.deleteMembership',\n};\n"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunk2BIP4BAK_cjs = require('./chunk-2BIP4BAK.cjs');
|
|
4
4
|
|
|
5
5
|
// src/providers/mysql/index.ts
|
|
6
|
-
|
|
6
|
+
chunk2BIP4BAK_cjs.init_cjs_shims();
|
|
7
7
|
function createMysqlProvider(config) {
|
|
8
8
|
let connection = null;
|
|
9
9
|
const methods = {
|
|
@@ -135,5 +135,5 @@ var mysqlTypeMappings = {
|
|
|
135
135
|
|
|
136
136
|
exports.createMysqlProvider = createMysqlProvider;
|
|
137
137
|
exports.mysqlTypeMappings = mysqlTypeMappings;
|
|
138
|
-
//# sourceMappingURL=chunk-
|
|
139
|
-
//# sourceMappingURL=chunk-
|
|
138
|
+
//# sourceMappingURL=chunk-4TWSU6GG.cjs.map
|
|
139
|
+
//# sourceMappingURL=chunk-4TWSU6GG.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/providers/mysql/index.ts"],"names":["init_cjs_shims"],"mappings":"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","file":"chunk-QBEAPUBU.cjs","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
|
+
{"version":3,"sources":["../src/providers/mysql/index.ts"],"names":["init_cjs_shims"],"mappings":"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","file":"chunk-4TWSU6GG.cjs","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"]}
|