intellitester 0.4.5 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/dist/{chunk-E7I5EAST.cjs → chunk-2BIP4BAK.cjs} +4 -4
  2. package/dist/chunk-2BIP4BAK.cjs.map +1 -0
  3. package/dist/{chunk-QHHY44MH.cjs → chunk-2F5ZF34M.cjs} +4 -4
  4. package/dist/{chunk-QHHY44MH.cjs.map → chunk-2F5ZF34M.cjs.map} +1 -1
  5. package/dist/{chunk-XRDD26DA.js → chunk-3LE4HBUY.js} +3 -3
  6. package/dist/{chunk-XRDD26DA.js.map → chunk-3LE4HBUY.js.map} +1 -1
  7. package/dist/{chunk-7KERJPT3.cjs → chunk-4EFOHLZ5.cjs} +89 -36
  8. package/dist/chunk-4EFOHLZ5.cjs.map +1 -0
  9. package/dist/{chunk-QBEAPUBU.cjs → chunk-4TWSU6GG.cjs} +4 -4
  10. package/dist/{chunk-QBEAPUBU.cjs.map → chunk-4TWSU6GG.cjs.map} +1 -1
  11. package/dist/{chunk-GNCJLEBY.cjs → chunk-56DWDCB7.cjs} +776 -796
  12. package/dist/chunk-56DWDCB7.cjs.map +1 -0
  13. package/dist/{chunk-EEJIIJEG.js → chunk-CYBNGNEZ.js} +3 -3
  14. package/dist/{chunk-EEJIIJEG.js.map → chunk-CYBNGNEZ.js.map} +1 -1
  15. package/dist/{chunk-7KTXX6EF.cjs → chunk-D27C3RW6.cjs} +4 -4
  16. package/dist/{chunk-7KTXX6EF.cjs.map → chunk-D27C3RW6.cjs.map} +1 -1
  17. package/dist/{chunk-EHRUD6JS.js → chunk-KONPTCVG.js} +4 -4
  18. package/dist/{chunk-EHRUD6JS.js.map → chunk-KONPTCVG.js.map} +1 -1
  19. package/dist/{chunk-OOQRSVXP.js → chunk-MYNVSGO7.js} +733 -754
  20. package/dist/chunk-MYNVSGO7.js.map +1 -0
  21. package/dist/{chunk-MVFZZF3J.cjs → chunk-NZOA4VT7.cjs} +5 -5
  22. package/dist/{chunk-MVFZZF3J.cjs.map → chunk-NZOA4VT7.cjs.map} +1 -1
  23. package/dist/chunk-P5B2HYYW.cjs +38 -0
  24. package/dist/{chunk-7JUP6HRD.cjs.map → chunk-P5B2HYYW.cjs.map} +1 -1
  25. package/dist/{chunk-DISSZD7X.cjs → chunk-Q42O37U6.cjs} +4 -4
  26. package/dist/{chunk-DISSZD7X.cjs.map → chunk-Q42O37U6.cjs.map} +1 -1
  27. package/dist/{chunk-MPEOMHAW.js → chunk-QTAYEMB2.js} +84 -33
  28. package/dist/chunk-QTAYEMB2.js.map +1 -0
  29. package/dist/{chunk-JN4VROOX.cjs → chunk-R63O6KB7.cjs} +12 -12
  30. package/dist/{chunk-JN4VROOX.cjs.map → chunk-R63O6KB7.cjs.map} +1 -1
  31. package/dist/{chunk-4P2XW7LQ.js → chunk-R6R55OTZ.js} +4 -4
  32. package/dist/{chunk-4P2XW7LQ.js.map → chunk-R6R55OTZ.js.map} +1 -1
  33. package/dist/{chunk-TM6IHTOK.js → chunk-RXXJEYXO.js} +3 -3
  34. package/dist/chunk-RXXJEYXO.js.map +1 -0
  35. package/dist/{chunk-7ALNM3DK.js → chunk-TRSDFFXF.js} +7 -7
  36. package/dist/{chunk-7ALNM3DK.js.map → chunk-TRSDFFXF.js.map} +1 -1
  37. package/dist/{chunk-AZEUOP6U.js → chunk-UVYXW5KC.js} +3 -3
  38. package/dist/{chunk-AZEUOP6U.js.map → chunk-UVYXW5KC.js.map} +1 -1
  39. package/dist/{chunk-XINWSJFM.js → chunk-VZ5S7MN6.js} +3 -3
  40. package/dist/{chunk-XINWSJFM.js.map → chunk-VZ5S7MN6.js.map} +1 -1
  41. package/dist/cli/index.cjs +241 -132
  42. package/dist/cli/index.cjs.map +1 -1
  43. package/dist/cli/index.js +190 -81
  44. package/dist/cli/index.js.map +1 -1
  45. package/dist/core/cleanup/index.cjs +15 -15
  46. package/dist/core/cleanup/index.js +7 -7
  47. package/dist/index.cjs +54 -46
  48. package/dist/index.cjs.map +1 -1
  49. package/dist/index.d.cts +192 -101
  50. package/dist/index.d.ts +192 -101
  51. package/dist/index.js +10 -10
  52. package/dist/index.js.map +1 -1
  53. package/dist/integration/index.cjs +3 -3
  54. package/dist/integration/index.js +2 -2
  55. package/dist/{lib-NRYY4REB.js → lib-B67ADJDZ.js} +5 -5
  56. package/dist/{lib-NRYY4REB.js.map → lib-B67ADJDZ.js.map} +1 -1
  57. package/dist/{lib-KZ7G5BWI.cjs → lib-KK2OS66I.cjs} +45 -45
  58. package/dist/{lib-KZ7G5BWI.cjs.map → lib-KK2OS66I.cjs.map} +1 -1
  59. package/dist/{loader-5F4K7EDA.cjs → loader-GOYI56IV.cjs} +17 -17
  60. package/dist/{loader-5F4K7EDA.cjs.map → loader-GOYI56IV.cjs.map} +1 -1
  61. package/dist/{loader-RUMGQZ5A.js → loader-ZANYYJHU.js} +4 -4
  62. package/dist/{loader-RUMGQZ5A.js.map → loader-ZANYYJHU.js.map} +1 -1
  63. package/dist/providers/appwrite/index.cjs +4 -4
  64. package/dist/providers/appwrite/index.js +2 -2
  65. package/dist/providers/index.cjs +18 -18
  66. package/dist/providers/index.js +6 -6
  67. package/dist/providers/mysql/index.cjs +4 -4
  68. package/dist/providers/mysql/index.js +2 -2
  69. package/dist/providers/postgres/index.cjs +4 -4
  70. package/dist/providers/postgres/index.js +2 -2
  71. package/dist/providers/sqlite/index.cjs +4 -4
  72. package/dist/providers/sqlite/index.js +2 -2
  73. package/package.json +3 -5
  74. package/schemas/intellitester.config.schema.json +176 -68
  75. package/schemas/pipeline.schema.json +159 -45
  76. package/schemas/test.schema.json +8589 -780
  77. package/schemas/workflow.schema.json +167 -43
  78. package/dist/chunk-7JUP6HRD.cjs +0 -38
  79. package/dist/chunk-7KERJPT3.cjs.map +0 -1
  80. package/dist/chunk-E7I5EAST.cjs.map +0 -1
  81. package/dist/chunk-GNCJLEBY.cjs.map +0 -1
  82. package/dist/chunk-MPEOMHAW.js.map +0 -1
  83. package/dist/chunk-OOQRSVXP.js.map +0 -1
  84. 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.6_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js
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.6_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js"() {
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-E7I5EAST.cjs.map
27
- //# sourceMappingURL=chunk-E7I5EAST.cjs.map
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 chunkE7I5EAST_cjs = require('./chunk-E7I5EAST.cjs');
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
- chunkE7I5EAST_cjs.init_cjs_shims();
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-QHHY44MH.cjs.map
464
- //# sourceMappingURL=chunk-QHHY44MH.cjs.map
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-TM6IHTOK.js';
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-XRDD26DA.js.map
461
- //# sourceMappingURL=chunk-XRDD26DA.js.map
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":"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","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"]}