intellitester 0.3.5 → 0.4.2
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/README.md +62 -0
- package/dist/{chunk-O4H5QO5P.js → chunk-4P2XW7LQ.js} +18 -3
- package/dist/chunk-4P2XW7LQ.js.map +1 -0
- package/dist/{chunk-LIVAF432.js → chunk-7ALNM3DK.js} +8 -6
- package/dist/chunk-7ALNM3DK.js.map +1 -0
- package/dist/chunk-7JUP6HRD.cjs +38 -0
- package/dist/chunk-7JUP6HRD.cjs.map +1 -0
- package/dist/{chunk-YNHXOSMZ.cjs → chunk-7KTXX6EF.cjs} +37 -17
- package/dist/chunk-7KTXX6EF.cjs.map +1 -0
- package/dist/{chunk-DJQQRM3C.js → chunk-A3UKMKXR.js} +28 -3
- package/dist/chunk-A3UKMKXR.js.map +1 -0
- package/dist/{chunk-SAVY6D3X.js → chunk-AZEUOP6U.js} +5 -2
- package/dist/chunk-AZEUOP6U.js.map +1 -0
- package/dist/{chunk-CSNHZKHS.cjs → chunk-CGGEE467.cjs} +567 -29
- package/dist/chunk-CGGEE467.cjs.map +1 -0
- package/dist/{chunk-UUJXCHVT.cjs → chunk-DISSZD7X.cjs} +5 -2
- package/dist/chunk-DISSZD7X.cjs.map +1 -0
- package/dist/chunk-E7I5EAST.cjs +27 -0
- package/dist/chunk-E7I5EAST.cjs.map +1 -0
- package/dist/{chunk-CN6HSJJX.js → chunk-EEJIIJEG.js} +5 -2
- package/dist/chunk-EEJIIJEG.js.map +1 -0
- package/dist/{chunk-6PYKWWH5.js → chunk-EHRUD6JS.js} +6 -3
- package/dist/chunk-EHRUD6JS.js.map +1 -0
- package/dist/{chunk-IYAZADFI.js → chunk-J7357E4Q.js} +551 -13
- package/dist/chunk-J7357E4Q.js.map +1 -0
- package/dist/{chunk-2ZSINOCK.cjs → chunk-JN4VROOX.cjs} +21 -6
- package/dist/chunk-JN4VROOX.cjs.map +1 -0
- package/dist/{chunk-PAKODOH4.cjs → chunk-MVFZZF3J.cjs} +6 -3
- package/dist/chunk-MVFZZF3J.cjs.map +1 -0
- package/dist/{chunk-35WJGNDA.cjs → chunk-QBEAPUBU.cjs} +5 -2
- package/dist/chunk-QBEAPUBU.cjs.map +1 -0
- package/dist/{chunk-B3ZQ425T.cjs → chunk-QHHY44MH.cjs} +4 -2
- package/dist/chunk-QHHY44MH.cjs.map +1 -0
- package/dist/chunk-TM6IHTOK.js +27 -0
- package/dist/chunk-TM6IHTOK.js.map +1 -0
- package/dist/{chunk-IY5L57RE.cjs → chunk-UYI7XVUE.cjs} +28 -3
- package/dist/chunk-UYI7XVUE.cjs.map +1 -0
- package/dist/{chunk-2BFRS6ZZ.js → chunk-XINWSJFM.js} +37 -17
- package/dist/chunk-XINWSJFM.js.map +1 -0
- package/dist/{chunk-ZUOYPCED.js → chunk-XRDD26DA.js} +4 -2
- package/dist/chunk-XRDD26DA.js.map +1 -0
- package/dist/cli/index.cjs +381 -228
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +344 -191
- package/dist/cli/index.js.map +1 -1
- package/dist/core/cleanup/index.cjs +15 -14
- package/dist/core/cleanup/index.js +7 -6
- package/dist/index.cjs +47 -42
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +165 -5
- package/dist/index.d.ts +165 -5
- package/dist/index.js +16 -9
- package/dist/index.js.map +1 -1
- package/dist/integration/index.cjs +3 -2
- package/dist/integration/index.js +2 -1
- package/dist/lib-KZ7G5BWI.cjs +781 -0
- package/dist/lib-KZ7G5BWI.cjs.map +1 -0
- package/dist/lib-NRYY4REB.js +779 -0
- package/dist/lib-NRYY4REB.js.map +1 -0
- package/dist/{loader-UH2VRIAW.cjs → loader-4HFRIWQQ.cjs} +17 -16
- package/dist/{loader-UH2VRIAW.cjs.map → loader-4HFRIWQQ.cjs.map} +1 -1
- package/dist/{loader-SZMOBGPT.js → loader-GDI65KW7.js} +4 -3
- package/dist/{loader-SZMOBGPT.js.map → loader-GDI65KW7.js.map} +1 -1
- package/dist/providers/appwrite/index.cjs +4 -3
- package/dist/providers/appwrite/index.js +2 -1
- package/dist/providers/index.cjs +18 -17
- package/dist/providers/index.js +6 -5
- package/dist/providers/mysql/index.cjs +4 -3
- package/dist/providers/mysql/index.js +2 -1
- package/dist/providers/postgres/index.cjs +4 -3
- package/dist/providers/postgres/index.js +2 -1
- package/dist/providers/sqlite/index.cjs +4 -3
- package/dist/providers/sqlite/index.js +2 -1
- package/package.json +4 -1
- package/dist/chunk-2BFRS6ZZ.js.map +0 -1
- package/dist/chunk-2IRHLFCW.cjs +0 -36
- package/dist/chunk-2IRHLFCW.cjs.map +0 -1
- package/dist/chunk-2ZSINOCK.cjs.map +0 -1
- package/dist/chunk-35WJGNDA.cjs.map +0 -1
- package/dist/chunk-6PYKWWH5.js.map +0 -1
- package/dist/chunk-B3ZQ425T.cjs.map +0 -1
- package/dist/chunk-CN6HSJJX.js.map +0 -1
- package/dist/chunk-CSNHZKHS.cjs.map +0 -1
- package/dist/chunk-DJQQRM3C.js.map +0 -1
- package/dist/chunk-IY5L57RE.cjs.map +0 -1
- package/dist/chunk-IYAZADFI.js.map +0 -1
- package/dist/chunk-LIVAF432.js.map +0 -1
- package/dist/chunk-O4H5QO5P.js.map +0 -1
- package/dist/chunk-PAKODOH4.cjs.map +0 -1
- package/dist/chunk-SAVY6D3X.js.map +0 -1
- package/dist/chunk-UUJXCHVT.cjs.map +0 -1
- package/dist/chunk-YNHXOSMZ.cjs.map +0 -1
- package/dist/chunk-ZUOYPCED.js.map +0 -1
package/README.md
CHANGED
|
@@ -186,6 +186,68 @@ When an action fails:
|
|
|
186
186
|
[OK] tap
|
|
187
187
|
```
|
|
188
188
|
|
|
189
|
+
## Screenshot Evaluation (evaluate)
|
|
190
|
+
|
|
191
|
+
The `evaluate` action analyzes screenshots to verify page state — no DOM selectors needed. It uses OCR (via tesseract.js WASM) to extract text from the page, with optional AI vision fallback for complex evaluations.
|
|
192
|
+
|
|
193
|
+
### Basic Usage
|
|
194
|
+
|
|
195
|
+
```yaml
|
|
196
|
+
steps:
|
|
197
|
+
# Simple text check (OCR, no API key needed)
|
|
198
|
+
- type: evaluate
|
|
199
|
+
expected: "Payment successful"
|
|
200
|
+
|
|
201
|
+
# Multiple expected strings (ALL must match)
|
|
202
|
+
- type: evaluate
|
|
203
|
+
expected:
|
|
204
|
+
- "Payment successful"
|
|
205
|
+
- "Order #"
|
|
206
|
+
|
|
207
|
+
# Regex patterns
|
|
208
|
+
- type: evaluate
|
|
209
|
+
expected: "Order #\\d{5,}"
|
|
210
|
+
regex: true
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### Evaluation Modes
|
|
214
|
+
|
|
215
|
+
| Mode | Description | API Key Required |
|
|
216
|
+
|------|-------------|-----------------|
|
|
217
|
+
| `auto` (default) | OCR first, falls back to AI vision if OCR fails | Only if OCR fails |
|
|
218
|
+
| `ocr` | OCR only, deterministic, fast | No |
|
|
219
|
+
| `ai` | AI vision only, handles complex visual states | Yes |
|
|
220
|
+
|
|
221
|
+
```yaml
|
|
222
|
+
# OCR-only (no API calls)
|
|
223
|
+
- type: evaluate
|
|
224
|
+
mode: ocr
|
|
225
|
+
expected: "Success"
|
|
226
|
+
|
|
227
|
+
# AI vision with custom prompt
|
|
228
|
+
- type: evaluate
|
|
229
|
+
mode: ai
|
|
230
|
+
prompt: "Does this page show a green checkmark with a confirmation message?"
|
|
231
|
+
expected: "Payment successful"
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### Properties
|
|
235
|
+
|
|
236
|
+
| Property | Type | Default | Description |
|
|
237
|
+
|----------|------|---------|-------------|
|
|
238
|
+
| `expected` | string or string[] | (required) | Text to find in the screenshot |
|
|
239
|
+
| `mode` | `ocr` \| `ai` \| `auto` | `auto` | Evaluation strategy |
|
|
240
|
+
| `regex` | boolean | `false` | Treat expected strings as regex patterns |
|
|
241
|
+
| `prompt` | string | (auto) | Custom prompt for AI mode |
|
|
242
|
+
| `waitBefore` | number | `500` | ms to wait before screenshot |
|
|
243
|
+
| `fullPage` | boolean | `true` | Full page or viewport only |
|
|
244
|
+
| `confidence` | number (0-100) | `60` | Min OCR confidence threshold |
|
|
245
|
+
|
|
246
|
+
### When to Use `evaluate` vs `assert`
|
|
247
|
+
|
|
248
|
+
- **`assert`** — You can target a specific DOM element with a selector
|
|
249
|
+
- **`evaluate`** — DOM selectors are unreliable: iframes, dynamic content, animations, third-party widgets (Stripe, PayPal), or when you just want to check "does the page say X?"
|
|
250
|
+
|
|
189
251
|
## Iframe Targeting (frame)
|
|
190
252
|
|
|
191
253
|
Target elements inside iframes using the `frame` property. Essential for payment forms (Stripe, PayPal), embedded widgets, and third-party integrations.
|
|
@@ -1,9 +1,21 @@
|
|
|
1
|
-
import { providerFactories, getDefaultTypeMappings } from './chunk-
|
|
1
|
+
import { providerFactories, getDefaultTypeMappings } from './chunk-7ALNM3DK.js';
|
|
2
|
+
import { init_esm_shims } from './chunk-TM6IHTOK.js';
|
|
2
3
|
import { glob } from 'glob';
|
|
3
4
|
import path from 'path';
|
|
4
5
|
import fs from 'fs';
|
|
5
6
|
import fs2 from 'fs/promises';
|
|
6
7
|
|
|
8
|
+
// src/core/cleanup/index.ts
|
|
9
|
+
init_esm_shims();
|
|
10
|
+
|
|
11
|
+
// src/core/cleanup/types.ts
|
|
12
|
+
init_esm_shims();
|
|
13
|
+
|
|
14
|
+
// src/core/cleanup/executor.ts
|
|
15
|
+
init_esm_shims();
|
|
16
|
+
|
|
17
|
+
// src/core/cleanup/loader.ts
|
|
18
|
+
init_esm_shims();
|
|
7
19
|
async function loadCleanupHandlers(config, cwd = process.cwd()) {
|
|
8
20
|
const handlers = /* @__PURE__ */ new Map();
|
|
9
21
|
let typeMappings = {};
|
|
@@ -108,6 +120,9 @@ function resolveHandler(handlers, typeMappings, resourceType) {
|
|
|
108
120
|
}
|
|
109
121
|
return null;
|
|
110
122
|
}
|
|
123
|
+
|
|
124
|
+
// src/core/cleanup/persistence.ts
|
|
125
|
+
init_esm_shims();
|
|
111
126
|
var CLEANUP_DIR = ".intellitester/cleanup/failed";
|
|
112
127
|
async function saveFailedCleanup(cleanup, cwd = process.cwd()) {
|
|
113
128
|
const dir = path.join(cwd, CLEANUP_DIR);
|
|
@@ -286,5 +301,5 @@ function defineCleanupHandlers(handlers) {
|
|
|
286
301
|
}
|
|
287
302
|
|
|
288
303
|
export { createCleanupExecutor, defineCleanupHandlers, executeCleanup, loadCleanupHandlers, loadFailedCleanups, removeFailedCleanup, resolveHandler, saveFailedCleanup };
|
|
289
|
-
//# sourceMappingURL=chunk-
|
|
290
|
-
//# sourceMappingURL=chunk-
|
|
304
|
+
//# sourceMappingURL=chunk-4P2XW7LQ.js.map
|
|
305
|
+
//# sourceMappingURL=chunk-4P2XW7LQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/cleanup/index.ts","../src/core/cleanup/types.ts","../src/core/cleanup/executor.ts","../src/core/cleanup/loader.ts","../src/core/cleanup/persistence.ts"],"names":["path","fs","result"],"mappings":"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","file":"chunk-4P2XW7LQ.js","sourcesContent":["export * from './types.js';\nimport type { CleanupHandler } from './types.js';\n\nexport { executeCleanup, createCleanupExecutor, type ExtendedCleanupOptions } from './executor.js';\nexport { loadCleanupHandlers, resolveHandler } from './loader.js';\nexport { saveFailedCleanup, loadFailedCleanups, removeFailedCleanup, type FailedCleanup } from './persistence.js';\n\n/**\n * Helper for defining cleanup handlers in user files.\n * Provides type safety for custom cleanup handler definitions.\n *\n * @example\n * // In cleanup.ts\n * import { defineCleanupHandlers } from 'intellitester/cleanup';\n *\n * export default defineCleanupHandlers({\n * async deleteUser(resource) {\n * // cleanup logic\n * },\n * async deleteTeam(resource) {\n * // cleanup logic\n * }\n * });\n */\nexport function defineCleanupHandlers<T extends Record<string, CleanupHandler>>(handlers: T): T {\n return handlers;\n}\n","import type { TrackedResource } from '../../integration/index.js';\n\nexport interface CleanupHandler {\n (resource: TrackedResource): Promise<void>;\n}\n\nexport interface CleanupUntrackedOptions {\n testStartTime: string; // ISO timestamp when test started\n userId?: string; // Test user ID to match\n userEmail?: string; // Test user email to match\n sessionId?: string; // Session ID for logging\n testStartTimeProvided?: boolean; // Indicates if testStartTime was explicitly provided\n}\n\nexport interface CleanupUntrackedResult {\n success: boolean;\n scanned: number; // Number of tables/collections scanned\n deleted: string[]; // Resource IDs deleted\n failed: string[]; // Resource IDs that failed to delete\n}\n\nexport interface CleanupProvider {\n name: string;\n configure(config: Record<string, unknown>): Promise<void>;\n methods: Record<string, CleanupHandler>;\n // Scan and clean up resources created during test that weren't explicitly tracked\n cleanupUntracked?(options: CleanupUntrackedOptions): Promise<CleanupUntrackedResult>;\n}\n\nexport interface CleanupDiscoverConfig {\n enabled?: boolean;\n paths?: string[];\n pattern?: string;\n}\n\nexport interface CleanupConfig {\n provider?: string;\n parallel?: boolean; // default: false\n retries?: number; // default: 3\n types?: Record<string, string>; // type -> 'provider.method'\n handlers?: string[]; // explicit paths\n discover?: CleanupDiscoverConfig;\n scanUntracked?: boolean; // Enable scanning for untracked resources\n [providerName: string]: unknown; // provider-specific configs\n}\n\nexport interface CleanupResult {\n success: boolean;\n deleted: string[];\n failed: string[];\n}\n\nexport interface ExecutorOptions {\n parallel?: boolean;\n retries?: number;\n sessionId?: string;\n testStartTime?: string; // When the test started (ISO timestamp)\n userId?: string; // Test user ID for matching\n userEmail?: string; // Test user email for matching\n providerConfig?: {\n provider: string;\n [key: string]: unknown;\n };\n cwd?: string;\n}\n","import type { TrackedResource } from '../../integration/index.js';\nimport type { CleanupHandler, CleanupResult, ExecutorOptions, CleanupConfig, CleanupProvider } from './types.js';\nimport { resolveHandler } from './loader.js';\nimport { saveFailedCleanup } from './persistence.js';\n\nconst sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));\n\n/**\n * Extended options for cleanup execution including provider and config\n */\nexport interface ExtendedCleanupOptions extends ExecutorOptions {\n config?: CleanupConfig;\n provider?: CleanupProvider;\n}\n\n/**\n * Execute cleanup for all tracked resources\n *\n * @param resources - Array of tracked resources to clean up\n * @param handlers - Map of handler names to cleanup functions\n * @param typeMappings - Map of resource types to handler names\n * @param options - Executor options (parallel, retries, config, provider)\n */\nexport async function executeCleanup(\n resources: TrackedResource[],\n handlers: Map<string, CleanupHandler>,\n typeMappings: Record<string, string>,\n options: ExtendedCleanupOptions = {}\n): Promise<CleanupResult> {\n const { parallel = false, retries = 3, config, provider } = options;\n const deleted: string[] = [];\n const failed: string[] = [];\n\n // Sort by creation time (reverse) - delete newest first (LIFO)\n const sorted = [...resources].sort((a, b) => {\n // Handle optional createdAt field (present at runtime from tracking server)\n const aCreatedAt = 'createdAt' in a ? (a.createdAt as string | undefined) : undefined;\n const bCreatedAt = 'createdAt' in b ? (b.createdAt as string | undefined) : undefined;\n\n const timeA = aCreatedAt ? new Date(aCreatedAt).getTime() : 0;\n const timeB = bCreatedAt ? new Date(bCreatedAt).getTime() : 0;\n\n return timeB - timeA;\n });\n\n const deleteResource = async (resource: TrackedResource): Promise<boolean> => {\n const resourceLabel = `${resource.type}:${resource.id}`;\n\n // Skip already deleted resources (deleted field may be set dynamically)\n const isDeleted = 'deleted' in resource ? (resource.deleted as boolean | undefined) : false;\n if (isDeleted) {\n deleted.push(`${resourceLabel} (already deleted)`);\n return true;\n }\n\n // Resolve the handler\n const handler = resolveHandler(handlers, typeMappings, resource.type);\n\n if (!handler) {\n failed.push(`${resourceLabel} (no handler for type \"${resource.type}\")`);\n console.warn(`No cleanup handler for resource type: ${resource.type}`);\n return false;\n }\n\n // Retry with exponential backoff\n for (let attempt = 1; attempt <= retries; attempt++) {\n try {\n await handler(resource);\n deleted.push(resourceLabel);\n return true;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n if (attempt === retries) {\n failed.push(`${resourceLabel} (${errorMessage})`);\n console.warn(\n `Failed to delete ${resourceLabel} after ${retries} attempts:`,\n errorMessage\n );\n return false;\n }\n\n // Exponential backoff: 100ms, 200ms, 400ms, 800ms...\n const delay = 100 * Math.pow(2, attempt - 1);\n console.debug(\n `Cleanup attempt ${attempt}/${retries} failed for ${resourceLabel}, ` +\n `retrying in ${delay}ms...`\n );\n await sleep(delay);\n }\n }\n\n return false;\n };\n\n if (parallel) {\n // Parallel execution\n const results = await Promise.allSettled(sorted.map(deleteResource));\n\n // Log any unexpected rejections (shouldn't happen since deleteResource handles errors)\n results.forEach((result, index) => {\n if (result.status === 'rejected') {\n const resource = sorted[index];\n console.error(\n `Unexpected error cleaning up ${resource.type}:${resource.id}:`,\n result.reason\n );\n }\n });\n } else {\n // Sequential execution\n for (const resource of sorted) {\n await deleteResource(resource);\n }\n }\n\n // After tracked cleanup, scan for untracked resources if configured\n if (config?.scanUntracked && provider?.cleanupUntracked) {\n console.log('\\n[Cleanup] Scanning for untracked resources...');\n\n try {\n const untrackedResult = await provider.cleanupUntracked({\n testStartTime: options.testStartTime ?? new Date().toISOString(),\n testStartTimeProvided: options.testStartTime !== undefined,\n userId: options.userId,\n userEmail: options.userEmail,\n sessionId: options.sessionId,\n });\n\n if (untrackedResult.deleted.length > 0) {\n console.log(`[Cleanup] Cleaned up ${untrackedResult.deleted.length} untracked resources`);\n deleted.push(...untrackedResult.deleted);\n }\n\n if (untrackedResult.failed.length > 0) {\n console.log(`[Cleanup] Failed to clean up ${untrackedResult.failed.length} untracked resources`);\n failed.push(...untrackedResult.failed);\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.warn(`[Cleanup] Untracked resource scan failed: ${errorMessage}`);\n }\n }\n\n const result: CleanupResult = {\n success: failed.length === 0,\n deleted,\n failed,\n };\n\n // Save failed cleanups for retry if there were failures\n if (failed.length > 0 && options.providerConfig) {\n try {\n const persistenceId = options.sessionId\n ?? options.userId\n ?? options.userEmail\n ?? `cleanup-${new Date().toISOString().replace(/[:.]/g, '-')}`;\n\n // Extract the resources that failed\n const failedResources = sorted.filter((resource) => {\n const resourceLabel = `${resource.type}:${resource.id}`;\n return failed.some((f) => f.startsWith(resourceLabel));\n });\n\n await saveFailedCleanup(\n {\n sessionId: persistenceId,\n timestamp: new Date().toISOString(),\n resources: failedResources,\n providerConfig: options.providerConfig,\n errors: failed,\n },\n options.cwd\n );\n } catch (error) {\n // Don't fail the cleanup if we can't save the failed cleanup file\n console.warn('Failed to save cleanup persistence file:', error);\n }\n }\n\n return result;\n}\n\n/**\n * Create a cleanup executor with pre-configured handlers and options\n */\nexport function createCleanupExecutor(\n handlers: Map<string, CleanupHandler>,\n typeMappings: Record<string, string>,\n options: ExecutorOptions = {}\n) {\n return {\n /**\n * Execute cleanup for resources\n */\n cleanup: (resources: TrackedResource[]) =>\n executeCleanup(resources, handlers, typeMappings, options),\n\n /**\n * Execute cleanup for a single resource\n */\n cleanupOne: async (resource: TrackedResource): Promise<boolean> => {\n const result = await executeCleanup([resource], handlers, typeMappings, options);\n return result.success;\n },\n };\n}\n","import { glob } from 'glob';\nimport path from 'path';\nimport fs from 'fs';\nimport type { CleanupHandler, CleanupConfig, CleanupProvider } from './types.js';\nimport { providerFactories, getDefaultTypeMappings } from '../../providers/index.js';\n\n/**\n * Load all cleanup handlers based on configuration\n *\n * Loading order (later overrides earlier):\n * 1. Built-in provider methods\n * 2. intellitester.cleanup.ts at project root\n * 3. Discovery paths (default: tests/cleanup/**\\/*.ts)\n * 4. Explicit handler files from config\n *\n * @param config - Cleanup configuration object\n * @param cwd - Current working directory (defaults to process.cwd())\n *\n * @example\n * ```typescript\n * // Basic usage with a provider\n * const { handlers, typeMappings } = await loadCleanupHandlers({\n * provider: 'sqlite',\n * sqlite: { database: './test.db' },\n * types: {\n * user: 'sqlite.deleteUser',\n * team: 'sqlite.deleteRow'\n * }\n * });\n *\n * // With custom discovery paths\n * const { handlers, typeMappings } = await loadCleanupHandlers({\n * provider: 'postgres',\n * postgres: { connectionString: 'postgresql://...' },\n * discover: {\n * enabled: true,\n * paths: ['./tests/cleanup', './e2e/cleanup'],\n * pattern: '**\\/*.cleanup.ts'\n * },\n * handlers: ['./custom-cleanup.ts']\n * });\n * ```\n *\n * @returns Object containing loaded handlers map and type mappings\n */\nexport async function loadCleanupHandlers(\n config: CleanupConfig,\n cwd: string = process.cwd()\n): Promise<{\n handlers: Map<string, CleanupHandler>;\n typeMappings: Record<string, string>;\n provider?: CleanupProvider;\n}> {\n const handlers = new Map<string, CleanupHandler>();\n let typeMappings: Record<string, string> = {};\n let provider: CleanupProvider | undefined;\n\n // 1. Load built-in provider methods\n if (config.provider) {\n const providerConfig = config[config.provider] as Record<string, unknown> | undefined;\n if (!providerConfig) {\n throw new Error(`Provider \"${config.provider}\" specified but no configuration found`);\n }\n\n const factory = providerFactories[config.provider];\n if (!factory) {\n throw new Error(`Unknown provider: ${config.provider}. Available: ${Object.keys(providerFactories).join(', ')}`);\n }\n\n provider = factory(providerConfig);\n await provider.configure(providerConfig);\n\n // Register provider methods\n for (const [methodName, handler] of Object.entries(provider.methods)) {\n handlers.set(`${provider.name}.${methodName}`, handler);\n }\n\n // Get default type mappings for this provider\n typeMappings = { ...getDefaultTypeMappings(config.provider) };\n }\n\n // 2. Auto-discover intellitester.cleanup.ts at root\n const rootCleanupPath = path.join(cwd, 'intellitester.cleanup.ts');\n const rootHandlers = await tryLoadHandlerFile(rootCleanupPath);\n if (rootHandlers) {\n mergeHandlers(handlers, rootHandlers);\n }\n\n // 3. Auto-discover from discovery paths\n if (config.discover?.enabled !== false) {\n const discoveryPaths = config.discover?.paths ?? ['./tests/cleanup'];\n const pattern = config.discover?.pattern ?? '**/*.ts';\n\n for (const basePath of discoveryPaths) {\n const absoluteBase = path.isAbsolute(basePath) ? basePath : path.join(cwd, basePath);\n\n try {\n const files = await glob(pattern, {\n cwd: absoluteBase,\n absolute: true,\n ignore: ['**/*.d.ts', '**/node_modules/**']\n });\n\n for (const file of files) {\n const fileHandlers = await tryLoadHandlerFile(file);\n if (fileHandlers) {\n mergeHandlers(handlers, fileHandlers);\n }\n }\n } catch {\n // Directory doesn't exist or no matches - that's fine\n }\n }\n }\n\n // 4. Load explicit handler files\n for (const handlerPath of config.handlers ?? []) {\n const absolutePath = path.isAbsolute(handlerPath)\n ? handlerPath\n : path.join(cwd, handlerPath);\n\n const fileHandlers = await tryLoadHandlerFile(absolutePath);\n if (fileHandlers) {\n mergeHandlers(handlers, fileHandlers);\n } else {\n console.warn(`Warning: Could not load cleanup handler file: ${handlerPath}`);\n }\n }\n\n // Merge config.types over default mappings\n if (config.types) {\n typeMappings = { ...typeMappings, ...config.types };\n }\n\n return { handlers, typeMappings, provider };\n}\n\n/**\n * Try to load a handler file, returning null if it doesn't exist or fails\n */\nasync function tryLoadHandlerFile(filePath: string): Promise<Record<string, CleanupHandler> | null> {\n try {\n // Check if file exists\n if (!fs.existsSync(filePath)) {\n return null;\n }\n\n // For TypeScript files, we need to handle them appropriately\n // In a built environment, look for the .js equivalent\n let loadPath = filePath;\n if (filePath.endsWith('.ts')) {\n // In production, TypeScript files will be compiled to .js\n // Try to load the compiled .js version from dist if running compiled\n const jsPath = filePath.replace(/\\.ts$/, '.js');\n if (fs.existsSync(jsPath)) {\n loadPath = jsPath;\n } else {\n // Running in development with tsx/ts-node\n // Try direct import which works with these tools\n loadPath = filePath;\n }\n }\n\n // Use dynamic import with cache busting for fresh load\n const module = await import(`${loadPath}?t=${Date.now()}`);\n\n // Handle default export or named exports\n if (module.default && typeof module.default === 'object') {\n return module.default as Record<string, CleanupHandler>;\n }\n\n // Filter to only include function exports\n const handlers: Record<string, CleanupHandler> = {};\n for (const [key, value] of Object.entries(module)) {\n if (typeof value === 'function' && key !== 'default') {\n handlers[key] = value as CleanupHandler;\n }\n }\n\n return Object.keys(handlers).length > 0 ? handlers : null;\n } catch {\n // File doesn't exist or failed to load\n return null;\n }\n}\n\n/**\n * Merge handlers from a file into the main handlers map\n */\nfunction mergeHandlers(\n target: Map<string, CleanupHandler>,\n source: Record<string, CleanupHandler>\n): void {\n for (const [key, handler] of Object.entries(source)) {\n target.set(key, handler);\n }\n}\n\n/**\n * Get a handler by key, checking both direct keys and provider.method format\n */\nexport function resolveHandler(\n handlers: Map<string, CleanupHandler>,\n typeMappings: Record<string, string>,\n resourceType: string\n): CleanupHandler | null {\n // First check type mappings\n const mappedKey = typeMappings[resourceType];\n if (mappedKey && handlers.has(mappedKey)) {\n return handlers.get(mappedKey)!;\n }\n\n // Then check for direct handler\n if (handlers.has(resourceType)) {\n return handlers.get(resourceType)!;\n }\n\n return null;\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { TrackedResource } from '../../integration/index.js';\n\n// Types\nexport interface FailedCleanup {\n sessionId: string;\n timestamp: string;\n resources: TrackedResource[];\n // Generic provider config (no secrets!)\n providerConfig: {\n provider: string; // 'appwrite' | 'postgres' | 'mysql' | 'sqlite'\n [key: string]: unknown; // endpoint, projectId, database, etc. - NO passwords/keys\n };\n errors: string[];\n}\n\nconst CLEANUP_DIR = '.intellitester/cleanup/failed';\n\n// Save failed cleanup to disk\nexport async function saveFailedCleanup(\n cleanup: FailedCleanup,\n cwd: string = process.cwd()\n): Promise<void> {\n const dir = path.join(cwd, CLEANUP_DIR);\n await fs.mkdir(dir, { recursive: true });\n const filePath = path.join(dir, `${cleanup.sessionId}.json`);\n await fs.writeFile(filePath, JSON.stringify(cleanup, null, 2), 'utf8');\n console.log(`Saved failed cleanup to ${filePath}`);\n}\n\n// Load all failed cleanups from disk\nexport async function loadFailedCleanups(\n cwd: string = process.cwd()\n): Promise<FailedCleanup[]> {\n const dir = path.join(cwd, CLEANUP_DIR);\n try {\n const files = await fs.readdir(dir);\n const cleanups: FailedCleanup[] = [];\n for (const file of files) {\n if (file.endsWith('.json')) {\n const content = await fs.readFile(path.join(dir, file), 'utf8');\n cleanups.push(JSON.parse(content));\n }\n }\n return cleanups;\n } catch (error) {\n // Directory doesn't exist = no failed cleanups\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return [];\n }\n throw error;\n }\n}\n\n// Remove a failed cleanup file after successful retry\nexport async function removeFailedCleanup(\n sessionId: string,\n cwd: string = process.cwd()\n): Promise<void> {\n const filePath = path.join(cwd, CLEANUP_DIR, `${sessionId}.json`);\n try {\n await fs.unlink(filePath);\n console.log(`Removed failed cleanup file: ${sessionId}.json`);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n}\n"]}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { createSqliteProvider, sqliteTypeMappings } from './chunk-
|
|
2
|
-
import { createAppwriteProvider, appwriteTypeMappings } from './chunk-
|
|
3
|
-
import { createPostgresProvider, postgresTypeMappings } from './chunk-
|
|
4
|
-
import { createMysqlProvider, mysqlTypeMappings } from './chunk-
|
|
1
|
+
import { createSqliteProvider, sqliteTypeMappings } from './chunk-EHRUD6JS.js';
|
|
2
|
+
import { createAppwriteProvider, appwriteTypeMappings } from './chunk-XRDD26DA.js';
|
|
3
|
+
import { createPostgresProvider, postgresTypeMappings } from './chunk-AZEUOP6U.js';
|
|
4
|
+
import { createMysqlProvider, mysqlTypeMappings } from './chunk-EEJIIJEG.js';
|
|
5
|
+
import { init_esm_shims } from './chunk-TM6IHTOK.js';
|
|
5
6
|
|
|
6
7
|
// src/providers/index.ts
|
|
8
|
+
init_esm_shims();
|
|
7
9
|
var providerFactories = {
|
|
8
10
|
appwrite: (config) => createAppwriteProvider(config),
|
|
9
11
|
postgres: (config) => createPostgresProvider(config),
|
|
@@ -27,5 +29,5 @@ function listAvailableProviders() {
|
|
|
27
29
|
}
|
|
28
30
|
|
|
29
31
|
export { getDefaultTypeMappings, isProviderAvailable, listAvailableProviders, providerFactories };
|
|
30
|
-
//# sourceMappingURL=chunk-
|
|
31
|
-
//# sourceMappingURL=chunk-
|
|
32
|
+
//# sourceMappingURL=chunk-7ALNM3DK.js.map
|
|
33
|
+
//# sourceMappingURL=chunk-7ALNM3DK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/index.ts"],"names":[],"mappings":";;;;;;;AAAA,cAAA,EAAA;AAaO,IAAM,iBAAA,GAAsE;AAAA,EACjF,QAAA,EAAU,CAAC,MAAA,KAAW,sBAAA,CAAuB,MAAM,CAAA;AAAA,EACnD,QAAA,EAAU,CAAC,MAAA,KAAW,sBAAA,CAAuB,MAAM,CAAA;AAAA,EACnD,KAAA,EAAO,CAAC,MAAA,KAAW,mBAAA,CAAoB,MAAM,CAAA;AAAA,EAC7C,MAAA,EAAQ,CAAC,MAAA,KAAW,oBAAA,CAAqB,MAAM;AACjD;AAGA,IAAM,oBAAA,GAA+D;AAAA,EACnE,QAAA,EAAU,oBAAA;AAAA,EACV,QAAA,EAAU,oBAAA;AAAA,EACV,KAAA,EAAO,iBAAA;AAAA,EACP,MAAA,EAAQ;AACV,CAAA;AAGO,SAAS,uBAAuB,QAAA,EAA0C;AAC/E,EAAA,OAAO,oBAAA,CAAqB,QAAQ,CAAA,IAAK,EAAC;AAC5C;AAGO,SAAS,oBAAoB,QAAA,EAA2B;AAC7D,EAAA,OAAO,QAAA,IAAY,iBAAA;AACrB;AAGO,SAAS,sBAAA,GAAmC;AACjD,EAAA,OAAO,MAAA,CAAO,KAAK,iBAAiB,CAAA;AACtC","file":"chunk-7ALNM3DK.js","sourcesContent":["import { createAppwriteProvider, appwriteTypeMappings } from './appwrite/index.js';\nimport { createPostgresProvider, postgresTypeMappings } from './postgres/index.js';\nimport { createMysqlProvider, mysqlTypeMappings } from './mysql/index.js';\nimport { createSqliteProvider, sqliteTypeMappings } from './sqlite/index.js';\nimport type { CleanupProvider } from '../core/cleanup/types.js';\n\n// Re-export for convenience\nexport { createAppwriteProvider, appwriteTypeMappings } from './appwrite/index.js';\nexport { createPostgresProvider, postgresTypeMappings } from './postgres/index.js';\nexport { createMysqlProvider, mysqlTypeMappings } from './mysql/index.js';\nexport { createSqliteProvider, sqliteTypeMappings } from './sqlite/index.js';\n\n// Provider factory registry using static imports\nexport const providerFactories: Record<string, (config: any) => CleanupProvider> = {\n appwrite: (config) => createAppwriteProvider(config),\n postgres: (config) => createPostgresProvider(config),\n mysql: (config) => createMysqlProvider(config),\n sqlite: (config) => createSqliteProvider(config),\n};\n\n// Default type mappings for each provider\nconst typeMappingsRegistry: Record<string, Record<string, string>> = {\n appwrite: appwriteTypeMappings,\n postgres: postgresTypeMappings,\n mysql: mysqlTypeMappings,\n sqlite: sqliteTypeMappings,\n};\n\n// Get default type mappings for a provider\nexport function getDefaultTypeMappings(provider: string): Record<string, string> {\n return typeMappingsRegistry[provider] ?? {};\n}\n\n// Helper to check if a provider is available\nexport function isProviderAvailable(provider: string): boolean {\n return provider in providerFactories;\n}\n\n// Helper to list all available providers\nexport function listAvailableProviders(): string[] {\n return Object.keys(providerFactories);\n}\n"]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkMVFZZF3J_cjs = require('./chunk-MVFZZF3J.cjs');
|
|
4
|
+
var chunkQHHY44MH_cjs = require('./chunk-QHHY44MH.cjs');
|
|
5
|
+
var chunkDISSZD7X_cjs = require('./chunk-DISSZD7X.cjs');
|
|
6
|
+
var chunkQBEAPUBU_cjs = require('./chunk-QBEAPUBU.cjs');
|
|
7
|
+
var chunkE7I5EAST_cjs = require('./chunk-E7I5EAST.cjs');
|
|
8
|
+
|
|
9
|
+
// src/providers/index.ts
|
|
10
|
+
chunkE7I5EAST_cjs.init_cjs_shims();
|
|
11
|
+
var providerFactories = {
|
|
12
|
+
appwrite: (config) => chunkQHHY44MH_cjs.createAppwriteProvider(config),
|
|
13
|
+
postgres: (config) => chunkDISSZD7X_cjs.createPostgresProvider(config),
|
|
14
|
+
mysql: (config) => chunkQBEAPUBU_cjs.createMysqlProvider(config),
|
|
15
|
+
sqlite: (config) => chunkMVFZZF3J_cjs.createSqliteProvider(config)
|
|
16
|
+
};
|
|
17
|
+
var typeMappingsRegistry = {
|
|
18
|
+
appwrite: chunkQHHY44MH_cjs.appwriteTypeMappings,
|
|
19
|
+
postgres: chunkDISSZD7X_cjs.postgresTypeMappings,
|
|
20
|
+
mysql: chunkQBEAPUBU_cjs.mysqlTypeMappings,
|
|
21
|
+
sqlite: chunkMVFZZF3J_cjs.sqliteTypeMappings
|
|
22
|
+
};
|
|
23
|
+
function getDefaultTypeMappings(provider) {
|
|
24
|
+
return typeMappingsRegistry[provider] ?? {};
|
|
25
|
+
}
|
|
26
|
+
function isProviderAvailable(provider) {
|
|
27
|
+
return provider in providerFactories;
|
|
28
|
+
}
|
|
29
|
+
function listAvailableProviders() {
|
|
30
|
+
return Object.keys(providerFactories);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
exports.getDefaultTypeMappings = getDefaultTypeMappings;
|
|
34
|
+
exports.isProviderAvailable = isProviderAvailable;
|
|
35
|
+
exports.listAvailableProviders = listAvailableProviders;
|
|
36
|
+
exports.providerFactories = providerFactories;
|
|
37
|
+
//# sourceMappingURL=chunk-7JUP6HRD.cjs.map
|
|
38
|
+
//# sourceMappingURL=chunk-7JUP6HRD.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/index.ts"],"names":["init_cjs_shims","createAppwriteProvider","createPostgresProvider","createMysqlProvider","createSqliteProvider","appwriteTypeMappings","postgresTypeMappings","mysqlTypeMappings","sqliteTypeMappings"],"mappings":";;;;;;;;;AAAAA,gCAAA,EAAA;AAaO,IAAM,iBAAA,GAAsE;AAAA,EACjF,QAAA,EAAU,CAAC,MAAA,KAAWC,wCAAA,CAAuB,MAAM,CAAA;AAAA,EACnD,QAAA,EAAU,CAAC,MAAA,KAAWC,wCAAA,CAAuB,MAAM,CAAA;AAAA,EACnD,KAAA,EAAO,CAAC,MAAA,KAAWC,qCAAA,CAAoB,MAAM,CAAA;AAAA,EAC7C,MAAA,EAAQ,CAAC,MAAA,KAAWC,sCAAA,CAAqB,MAAM;AACjD;AAGA,IAAM,oBAAA,GAA+D;AAAA,EACnE,QAAA,EAAUC,sCAAA;AAAA,EACV,QAAA,EAAUC,sCAAA;AAAA,EACV,KAAA,EAAOC,mCAAA;AAAA,EACP,MAAA,EAAQC;AACV,CAAA;AAGO,SAAS,uBAAuB,QAAA,EAA0C;AAC/E,EAAA,OAAO,oBAAA,CAAqB,QAAQ,CAAA,IAAK,EAAC;AAC5C;AAGO,SAAS,oBAAoB,QAAA,EAA2B;AAC7D,EAAA,OAAO,QAAA,IAAY,iBAAA;AACrB;AAGO,SAAS,sBAAA,GAAmC;AACjD,EAAA,OAAO,MAAA,CAAO,KAAK,iBAAiB,CAAA;AACtC","file":"chunk-7JUP6HRD.cjs","sourcesContent":["import { createAppwriteProvider, appwriteTypeMappings } from './appwrite/index.js';\nimport { createPostgresProvider, postgresTypeMappings } from './postgres/index.js';\nimport { createMysqlProvider, mysqlTypeMappings } from './mysql/index.js';\nimport { createSqliteProvider, sqliteTypeMappings } from './sqlite/index.js';\nimport type { CleanupProvider } from '../core/cleanup/types.js';\n\n// Re-export for convenience\nexport { createAppwriteProvider, appwriteTypeMappings } from './appwrite/index.js';\nexport { createPostgresProvider, postgresTypeMappings } from './postgres/index.js';\nexport { createMysqlProvider, mysqlTypeMappings } from './mysql/index.js';\nexport { createSqliteProvider, sqliteTypeMappings } from './sqlite/index.js';\n\n// Provider factory registry using static imports\nexport const providerFactories: Record<string, (config: any) => CleanupProvider> = {\n appwrite: (config) => createAppwriteProvider(config),\n postgres: (config) => createPostgresProvider(config),\n mysql: (config) => createMysqlProvider(config),\n sqlite: (config) => createSqliteProvider(config),\n};\n\n// Default type mappings for each provider\nconst typeMappingsRegistry: Record<string, Record<string, string>> = {\n appwrite: appwriteTypeMappings,\n postgres: postgresTypeMappings,\n mysql: mysqlTypeMappings,\n sqlite: sqliteTypeMappings,\n};\n\n// Get default type mappings for a provider\nexport function getDefaultTypeMappings(provider: string): Record<string, string> {\n return typeMappingsRegistry[provider] ?? {};\n}\n\n// Helper to check if a provider is available\nexport function isProviderAvailable(provider: string): boolean {\n return provider in providerFactories;\n}\n\n// Helper to list all available providers\nexport function listAvailableProviders(): string[] {\n return Object.keys(providerFactories);\n}\n"]}
|
|
@@ -1,11 +1,30 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var chunkE7I5EAST_cjs = require('./chunk-E7I5EAST.cjs');
|
|
4
|
+
|
|
3
5
|
// src/integration/index.ts
|
|
6
|
+
chunkE7I5EAST_cjs.init_cjs_shims();
|
|
4
7
|
var cachedTracking = null;
|
|
8
|
+
var getEnv = (name) => {
|
|
9
|
+
if (typeof process !== "undefined" && process.env) {
|
|
10
|
+
return process.env[name];
|
|
11
|
+
}
|
|
12
|
+
const g = globalThis;
|
|
13
|
+
if (g.env && typeof g.env === "object") {
|
|
14
|
+
return g.env[name];
|
|
15
|
+
}
|
|
16
|
+
if (typeof Deno !== "undefined" && Deno.env) {
|
|
17
|
+
try {
|
|
18
|
+
return Deno.env.get(name);
|
|
19
|
+
} catch {
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return void 0;
|
|
23
|
+
};
|
|
5
24
|
var resolveTracking = () => {
|
|
6
|
-
const sessionId =
|
|
7
|
-
const trackUrl =
|
|
8
|
-
const trackFile =
|
|
25
|
+
const sessionId = getEnv("INTELLITESTER_SESSION_ID");
|
|
26
|
+
const trackUrl = getEnv("INTELLITESTER_TRACK_URL");
|
|
27
|
+
const trackFile = getEnv("INTELLITESTER_TRACK_FILE");
|
|
9
28
|
if (cachedTracking && cachedTracking.sessionId === sessionId && cachedTracking.trackUrl === trackUrl && cachedTracking.trackFile === trackFile) {
|
|
10
29
|
return cachedTracking;
|
|
11
30
|
}
|
|
@@ -22,7 +41,6 @@ var resolveTracking = () => {
|
|
|
22
41
|
};
|
|
23
42
|
async function track(resource) {
|
|
24
43
|
if (typeof window !== "undefined") return;
|
|
25
|
-
if (typeof process === "undefined") return;
|
|
26
44
|
const { sessionId, trackUrl, trackFile, mode } = resolveTracking();
|
|
27
45
|
if (!sessionId || mode === "none") return;
|
|
28
46
|
if (trackUrl && (mode === "http" || mode === "both")) {
|
|
@@ -40,22 +58,24 @@ async function track(resource) {
|
|
|
40
58
|
}
|
|
41
59
|
}
|
|
42
60
|
if (trackFile && (mode === "file" || mode === "both")) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
61
|
+
if (typeof process !== "undefined" && process.versions?.node) {
|
|
62
|
+
try {
|
|
63
|
+
const { appendFile } = await import('fs/promises');
|
|
64
|
+
const { existsSync } = await import('fs');
|
|
65
|
+
if (!existsSync(trackFile)) return;
|
|
66
|
+
const payload = {
|
|
67
|
+
sessionId,
|
|
68
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
69
|
+
...resource
|
|
70
|
+
};
|
|
71
|
+
await appendFile(trackFile, `${JSON.stringify(payload)}
|
|
53
72
|
`, "utf8");
|
|
54
|
-
|
|
73
|
+
} catch {
|
|
74
|
+
}
|
|
55
75
|
}
|
|
56
76
|
}
|
|
57
77
|
}
|
|
58
78
|
|
|
59
79
|
exports.track = track;
|
|
60
|
-
//# sourceMappingURL=chunk-
|
|
61
|
-
//# sourceMappingURL=chunk-
|
|
80
|
+
//# sourceMappingURL=chunk-7KTXX6EF.cjs.map
|
|
81
|
+
//# sourceMappingURL=chunk-7KTXX6EF.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/integration/index.ts"],"names":["init_cjs_shims"],"mappings":"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","file":"chunk-7KTXX6EF.cjs","sourcesContent":["/**\n * IntelliTester Integration - Track server-side resources for test cleanup\n *\n * Usage in app SSR code:\n * import { track } from 'intellitester/integration';\n *\n * // Track a database row\n * await track({ type: 'row', id: row.$id, database: 'main', table: 'users' });\n *\n * // Track a team\n * await track({ type: 'team', id: team.$id });\n *\n * // Track anything - it's just metadata for your cleanup handler\n * await track({ type: 'stripe_customer', id: customerId });\n */\n\n/**\n * Track a resource for cleanup after tests.\n * Provider-agnostic - just tracks type, id, and metadata.\n * Cleanup logic is handled by the configured provider.\n */\nexport interface TrackedResource {\n type: string; // 'row', 'team', 'file', 'user', or any custom type\n id: string; // Resource ID\n [key: string]: unknown; // Any additional metadata needed for cleanup\n}\n\n/**\n * Track a resource created in server-side code.\n * No-op if not in test mode.\n *\n * @example\n * // Track a database row\n * await track({ type: 'row', id: row.$id, database: 'main', table: 'users' });\n *\n * // Track a team\n * await track({ type: 'team', id: team.$id });\n *\n * // Track anything - it's just metadata for your cleanup handler\n * await track({ type: 'stripe_customer', id: customerId });\n */\ntype TrackingMode = 'none' | 'http' | 'file' | 'both';\n\nlet cachedTracking: {\n sessionId?: string;\n trackUrl?: string;\n trackFile?: string;\n mode: TrackingMode;\n} | null = null;\n\n/**\n * Get environment variable from multiple sources (Node.js, Cloudflare Workers, etc.)\n */\nconst getEnv = (name: string): string | undefined => {\n // Try Node.js process.env first\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n // Try globalThis (some runtimes expose env this way)\n const g = globalThis as Record<string, unknown>;\n if (g.env && typeof g.env === 'object') {\n return (g.env as Record<string, string>)[name];\n }\n // Try Deno-style\n if (typeof Deno !== 'undefined' && Deno.env) {\n try {\n return Deno.env.get(name);\n } catch {\n // Permission denied\n }\n }\n return undefined;\n};\n\n// Declare Deno for TypeScript\ndeclare const Deno: { env: { get: (name: string) => string | undefined } } | undefined;\n\nconst resolveTracking = (): {\n sessionId?: string;\n trackUrl?: string;\n trackFile?: string;\n mode: TrackingMode;\n} => {\n const sessionId = getEnv('INTELLITESTER_SESSION_ID');\n const trackUrl = getEnv('INTELLITESTER_TRACK_URL');\n const trackFile = getEnv('INTELLITESTER_TRACK_FILE');\n\n if (\n cachedTracking &&\n cachedTracking.sessionId === sessionId &&\n cachedTracking.trackUrl === trackUrl &&\n cachedTracking.trackFile === trackFile\n ) {\n return cachedTracking;\n }\n\n let mode: TrackingMode = 'none';\n if (trackUrl && trackFile) {\n mode = 'both';\n } else if (trackUrl) {\n mode = 'http';\n } else if (trackFile) {\n mode = 'file';\n }\n\n cachedTracking = { sessionId, trackUrl, trackFile, mode };\n return cachedTracking;\n};\n\nexport async function track(resource: TrackedResource): Promise<void> {\n // Only run on server (SSR), not in browser\n if (typeof window !== 'undefined') return;\n\n const { sessionId, trackUrl, trackFile, mode } = resolveTracking();\n\n if (!sessionId || mode === 'none') return;\n\n if (trackUrl && (mode === 'http' || mode === 'both')) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 1000);\n await fetch(`${trackUrl}/track`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ sessionId, ...resource }),\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n } catch {\n // Silent fail - don't break app\n }\n }\n\n // File tracking only works in Node.js environments with fs access\n if (trackFile && (mode === 'file' || mode === 'both')) {\n // Check if we're in a Node.js environment with fs access\n if (typeof process !== 'undefined' && process.versions?.node) {\n try {\n const { appendFile } = await import('node:fs/promises');\n const { existsSync } = await import('node:fs');\n if (!existsSync(trackFile)) return;\n const payload = {\n sessionId,\n createdAt: new Date().toISOString(),\n ...resource,\n };\n await appendFile(trackFile, `${JSON.stringify(payload)}\\n`, 'utf8');\n } catch {\n // Silent fail - don't break app\n }\n }\n // In non-Node.js environments (like Cloudflare Workers), file tracking is skipped\n // but HTTP tracking above should still work\n }\n}\n"]}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
|
+
import { init_esm_shims } from './chunk-TM6IHTOK.js';
|
|
1
2
|
import fs from 'fs/promises';
|
|
2
3
|
import { parse } from 'yaml';
|
|
3
4
|
import { z } from 'zod';
|
|
4
5
|
|
|
5
6
|
// src/core/loader.ts
|
|
7
|
+
init_esm_shims();
|
|
8
|
+
|
|
9
|
+
// src/core/schema.ts
|
|
10
|
+
init_esm_shims();
|
|
6
11
|
var nonEmptyString = z.string().trim().min(1, "Value cannot be empty");
|
|
7
12
|
z.preprocess(
|
|
8
13
|
(val) => typeof val === "string" && val.trim() === "" ? void 0 : val,
|
|
@@ -194,6 +199,19 @@ var failActionSchema = z.object({
|
|
|
194
199
|
type: z.literal("fail"),
|
|
195
200
|
message: nonEmptyString.describe("Error message to display when test fails")
|
|
196
201
|
}).describe("Explicitly fail the test with a custom message");
|
|
202
|
+
var evaluateActionSchema = z.object({
|
|
203
|
+
type: z.literal("evaluate"),
|
|
204
|
+
expected: z.union([
|
|
205
|
+
z.string(),
|
|
206
|
+
z.array(z.string())
|
|
207
|
+
]).describe("Text to find in screenshot (substring or regex)"),
|
|
208
|
+
mode: z.enum(["ocr", "ai", "auto"]).optional().describe("ocr=OCR only, ai=LLM vision only, auto=OCR first then AI fallback (default: auto)"),
|
|
209
|
+
regex: z.boolean().optional().describe("Treat expected as regex patterns (default: false)"),
|
|
210
|
+
prompt: z.string().optional().describe("Custom prompt for AI mode"),
|
|
211
|
+
waitBefore: z.number().int().nonnegative().optional().describe("ms to wait before screenshot for visual stability (default: 500)"),
|
|
212
|
+
fullPage: z.boolean().optional().describe("Full page or viewport only (default: true)"),
|
|
213
|
+
confidence: z.number().min(0).max(100).optional().describe("Min OCR confidence threshold, below falls back to AI in auto mode (default: 60)")
|
|
214
|
+
}).describe("Evaluate page state via screenshot analysis (OCR and/or AI vision)");
|
|
197
215
|
var BaseActionSchema = z.discriminatedUnion("type", [
|
|
198
216
|
navigateActionSchema,
|
|
199
217
|
tapActionSchema,
|
|
@@ -219,7 +237,8 @@ var BaseActionSchema = z.discriminatedUnion("type", [
|
|
|
219
237
|
debugActionSchema,
|
|
220
238
|
waitForSelectorActionSchema,
|
|
221
239
|
logActionSchema,
|
|
222
|
-
failActionSchema
|
|
240
|
+
failActionSchema,
|
|
241
|
+
evaluateActionSchema
|
|
223
242
|
]);
|
|
224
243
|
var TrackableBaseActionSchema = z.intersection(BaseActionSchema, trackableSchema);
|
|
225
244
|
var conditionalActionSchema = z.intersection(z.object({
|
|
@@ -387,6 +406,9 @@ var IntellitesterConfigSchema = z.object({
|
|
|
387
406
|
preview: previewConfigSchema.optional(),
|
|
388
407
|
secrets: z.record(z.string(), z.string().trim()).optional().describe("Secret values that can be referenced in tests")
|
|
389
408
|
}).describe("Global configuration file for IntelliTester");
|
|
409
|
+
|
|
410
|
+
// src/core/workflowSchema.ts
|
|
411
|
+
init_esm_shims();
|
|
390
412
|
var nonEmptyString2 = z.string().trim().min(1, "Value cannot be empty");
|
|
391
413
|
var testReferenceSchema = z.object({
|
|
392
414
|
file: nonEmptyString2.describe("Path to the test file relative to the workflow file"),
|
|
@@ -443,6 +465,9 @@ var WorkflowDefinitionSchema = z.object({
|
|
|
443
465
|
continueOnFailure: z.boolean().default(false).describe("Continue running subsequent tests even if a test fails"),
|
|
444
466
|
tests: z.array(testReferenceSchema).min(1, "Workflow must contain at least one test").describe("List of test files to execute in this workflow")
|
|
445
467
|
}).describe("Schema for IntelliTester workflow files that orchestrate multiple tests");
|
|
468
|
+
|
|
469
|
+
// src/core/pipelineSchema.ts
|
|
470
|
+
init_esm_shims();
|
|
446
471
|
var nonEmptyString3 = z.string().trim().min(1, "Value cannot be empty");
|
|
447
472
|
var workflowReferenceSchema = z.object({
|
|
448
473
|
file: nonEmptyString3.describe("Path to the workflow file"),
|
|
@@ -609,5 +634,5 @@ var isPipelineContent = (content) => {
|
|
|
609
634
|
};
|
|
610
635
|
|
|
611
636
|
export { ActionSchema, FrameLocatorSchema, IntellitesterConfigSchema, LocatorSchema, TestConfigSchema, TestDefinitionSchema, cleanupConfigSchema, cleanupDiscoverSchema, collectMissingEnvVars, errorIfSchema, isPipelineContent, isPipelineFile, isWorkflowContent, isWorkflowFile, loadIntellitesterConfig, loadPipelineDefinition, loadTestDefinition, loadWorkflowDefinition, parseIntellitesterConfig, parsePipelineDefinition, parseTestDefinition, parseWorkflowDefinition, previewConfigSchema };
|
|
612
|
-
//# sourceMappingURL=chunk-
|
|
613
|
-
//# sourceMappingURL=chunk-
|
|
637
|
+
//# sourceMappingURL=chunk-A3UKMKXR.js.map
|
|
638
|
+
//# sourceMappingURL=chunk-A3UKMKXR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/loader.ts","../src/core/schema.ts","../src/core/workflowSchema.ts","../src/core/pipelineSchema.ts"],"names":["nonEmptyString","z"],"mappings":"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","file":"chunk-A3UKMKXR.js","sourcesContent":["import fs from 'node:fs/promises';\n\nimport type { ZodIssue, ZodType } from 'zod';\nimport { parse } from 'yaml';\n\nimport { IntellitesterConfigSchema, TestDefinitionSchema } from './schema';\nimport type { IntellitesterConfig, TestDefinition } from './types';\nimport { WorkflowDefinitionSchema, type WorkflowDefinition } from './workflowSchema';\nimport { PipelineDefinitionSchema, type PipelineDefinition } from './pipelineSchema';\n\nconst formatIssues = (issues: ZodIssue[]): string =>\n issues\n .map((issue) => {\n const path = issue.path.join('.') || '<root>';\n return `${path}: ${issue.message}`;\n })\n .join('; ');\n\n/**\n * Interpolates environment variables in a parsed YAML object.\n * Recursively replaces ${VAR_NAME} patterns with environment variable values.\n */\nconst interpolateEnvVars = (obj: unknown): unknown => {\n if (typeof obj === 'string') {\n // Replace ${VAR_NAME} with environment variable value\n return obj.replace(/\\$\\{([^}]+)\\}/g, (_, varName) => {\n const value = process.env[varName];\n if (value === undefined) {\n throw new Error(`Environment variable ${varName} is not defined`);\n }\n return value;\n });\n }\n\n if (Array.isArray(obj)) {\n return obj.map(interpolateEnvVars);\n }\n\n if (obj !== null && typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = interpolateEnvVars(value);\n }\n return result;\n }\n\n return obj;\n};\n\nconst parseWithSchema = <T>(content: string, schema: ZodType<T>, subject: string): T => {\n let parsed: unknown;\n try {\n parsed = parse(content);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Invalid YAML for ${subject}: ${message}`);\n }\n\n // Interpolate environment variables in the parsed content\n const interpolated = interpolateEnvVars(parsed);\n\n const result = schema.safeParse(interpolated);\n if (!result.success) {\n throw new Error(`Invalid ${subject}: ${formatIssues(result.error.issues)}`);\n }\n\n return result.data;\n};\n\nexport const parseTestDefinition = (content: string): TestDefinition =>\n parseWithSchema(content, TestDefinitionSchema, 'test definition');\n\nexport const loadTestDefinition = async (filePath: string): Promise<TestDefinition> => {\n const fileContent = await fs.readFile(filePath, 'utf8');\n return parseTestDefinition(fileContent);\n};\n\nexport const parseIntellitesterConfig = (content: string): IntellitesterConfig =>\n parseWithSchema(content, IntellitesterConfigSchema, 'config');\n\nexport const loadIntellitesterConfig = async (filePath: string): Promise<IntellitesterConfig> => {\n const fileContent = await fs.readFile(filePath, 'utf8');\n return parseIntellitesterConfig(fileContent);\n};\n\nexport const parseWorkflowDefinition = (content: string): WorkflowDefinition =>\n parseWithSchema(content, WorkflowDefinitionSchema, 'workflow definition');\n\nexport const loadWorkflowDefinition = async (filePath: string): Promise<WorkflowDefinition> => {\n const fileContent = await fs.readFile(filePath, 'utf8');\n return parseWorkflowDefinition(fileContent);\n};\n\nexport const isWorkflowFile = (filePath: string): boolean => {\n return filePath.endsWith('.workflow.yaml') || filePath.endsWith('.workflow.yml');\n};\n\n/**\n * Check if a file is a pipeline file based on naming convention.\n * Pipeline files end with .pipeline.yaml or .pipeline.yml\n */\nexport const isPipelineFile = (filePath: string): boolean => {\n return filePath.endsWith('.pipeline.yaml') || filePath.endsWith('.pipeline.yml');\n};\n\n/**\n * Parse pipeline definition from string content.\n */\nexport const parsePipelineDefinition = (content: string): PipelineDefinition =>\n parseWithSchema(content, PipelineDefinitionSchema, 'pipeline definition');\n\n/**\n * Load and validate a pipeline definition from a YAML file.\n */\nexport const loadPipelineDefinition = async (filePath: string): Promise<PipelineDefinition> => {\n const fileContent = await fs.readFile(filePath, 'utf8');\n return parsePipelineDefinition(fileContent);\n};\n\n/**\n * Recursively collects all environment variable names that are referenced\n * but not defined in the process environment.\n */\nexport const collectMissingEnvVars = (obj: unknown): string[] => {\n const missing: string[] = [];\n\n const collect = (value: unknown): void => {\n if (typeof value === 'string') {\n const matches = value.matchAll(/\\$\\{([^}]+)\\}/g);\n for (const match of matches) {\n const varName = match[1];\n if (process.env[varName] === undefined && !missing.includes(varName)) {\n missing.push(varName);\n }\n }\n } else if (Array.isArray(value)) {\n value.forEach(collect);\n } else if (value !== null && typeof value === 'object') {\n Object.values(value).forEach(collect);\n }\n };\n\n collect(obj);\n return missing;\n};\n\n/**\n * Detect if YAML content is a workflow by checking for 'tests' array.\n */\nexport const isWorkflowContent = (content: string): boolean => {\n try {\n const parsed = parse(content);\n return parsed && Array.isArray(parsed.tests) && !parsed.steps && !parsed.workflows;\n } catch {\n return false;\n }\n};\n\n/**\n * Detect if YAML content is a pipeline by checking for 'workflows' array.\n */\nexport const isPipelineContent = (content: string): boolean => {\n try {\n const parsed = parse(content);\n return parsed && Array.isArray(parsed.workflows) && !parsed.steps;\n } catch {\n return false;\n }\n};\n","import { z } from 'zod';\n\nconst nonEmptyString = z.string().trim().min(1, 'Value cannot be empty');\n\n// Transform empty strings to undefined for optional fields\nconst _optionalString = z.preprocess(\n (val) => (typeof val === 'string' && val.trim() === '' ? undefined : val),\n z.string().trim().optional()\n);\n\n// Transform empty strings to undefined for optional URL fields\nconst optionalUrl = z.preprocess(\n (val) => (typeof val === 'string' && val.trim() === '' ? undefined : val),\n z.string().trim().url().optional()\n);\n\nconst trackSchema = z.object({\n type: nonEmptyString.describe('Tracked resource type (e.g., row, user, file)'),\n id: nonEmptyString.describe('Tracked resource ID'),\n includeStepContext: z.boolean().optional().describe('Include step context with tracked resource'),\n}).passthrough().describe('Optional tracking metadata for cleanup');\n\nconst trackableSchema = z.object({\n track: trackSchema.optional(),\n});\n\n// Error condition for immediate failure (no waiting)\nexport const errorIfSchema = z.enum(['not-found', 'not-visible', 'disabled', 'empty'])\n .describe('Fail immediately if this condition is met (no waiting)');\n\nexport const LocatorSchema = z\n .object({\n description: z.string().trim().optional().describe('AI-friendly description of the element to find'),\n testId: z.string().trim().optional().describe('data-testid attribute value'),\n text: z.string().trim().optional().describe('Visible text content'),\n css: z.string().trim().optional().describe('CSS selector'),\n xpath: z.string().trim().optional().describe('XPath selector'),\n role: z.string().trim().optional().describe('ARIA role'),\n name: z.string().trim().optional().describe('Accessible name'),\n })\n .describe('Defines how to locate an element on the page. At least one selector must be provided.')\n .refine(\n (locator) =>\n Boolean(\n locator.description ||\n locator.testId ||\n locator.text ||\n locator.css ||\n locator.xpath ||\n locator.role ||\n locator.name,\n ),\n { message: 'Locator requires at least one selector or description' },\n );\n\nexport const FrameLocatorSchema = z\n .object({\n css: z.string().trim().optional().describe('CSS selector for the iframe element'),\n name: z.string().trim().optional().describe('Name or id attribute of the iframe'),\n index: z.number().int().nonnegative().optional().describe('Zero-based index when multiple iframes match (default: 0)'),\n })\n .describe('Defines how to locate an iframe on the page. Either css or name must be provided.')\n .refine(\n (locator) => Boolean(locator.css || locator.name),\n { message: 'FrameLocator requires css or name' },\n );\n\nconst navigateActionSchema = z.object({\n type: z.literal('navigate'),\n value: nonEmptyString.describe('URL or path to navigate to'),\n}).describe('Navigate to a URL');\n\nconst tapActionSchema = z.object({\n type: z.literal('tap'),\n target: LocatorSchema,\n frame: FrameLocatorSchema.optional().describe('Iframe context for the target element'),\n errorIf: errorIfSchema.optional(),\n}).describe('Click or tap on an element');\n\nconst inputActionSchema = z.object({\n type: z.literal('input'),\n target: LocatorSchema,\n value: z.string().describe('Text to input (can reference variables with ${VAR_NAME})'),\n frame: FrameLocatorSchema.optional().describe('Iframe context for the target element'),\n errorIf: errorIfSchema.optional(),\n}).describe('Input text into a field (clears field first)');\n\nconst typeActionSchema = z.object({\n type: z.literal('type'),\n target: LocatorSchema.optional().describe('Element to type into (if omitted, types into the currently focused element)'),\n value: z.string().describe('Text to type character-by-character (appends to existing content)'),\n frame: FrameLocatorSchema.optional().describe('Iframe context for the target element'),\n delay: z.number().int().nonnegative().optional().describe('Delay between keystrokes in milliseconds (default: 50)'),\n errorIf: errorIfSchema.optional(),\n}).describe('Type text character-by-character without clearing (for Stripe, special inputs)');\n\nconst clearActionSchema = z.object({\n type: z.literal('clear'),\n target: LocatorSchema,\n frame: FrameLocatorSchema.optional().describe('Iframe context for the target element'),\n errorIf: errorIfSchema.optional(),\n}).describe('Clear the contents of an input field');\n\nconst hoverActionSchema = z.object({\n type: z.literal('hover'),\n target: LocatorSchema,\n frame: FrameLocatorSchema.optional().describe('Iframe context for the target element'),\n errorIf: errorIfSchema.optional(),\n}).describe('Hover over an element');\n\nconst selectActionSchema = z.object({\n type: z.literal('select'),\n target: LocatorSchema,\n value: z.string().describe('Option value, label, or index to select'),\n errorIf: errorIfSchema.optional(),\n}).describe('Select an option from a dropdown');\n\nconst checkActionSchema = z.object({\n type: z.literal('check'),\n target: LocatorSchema,\n errorIf: errorIfSchema.optional(),\n}).describe('Check a checkbox');\n\nconst uncheckActionSchema = z.object({\n type: z.literal('uncheck'),\n target: LocatorSchema,\n errorIf: errorIfSchema.optional(),\n}).describe('Uncheck a checkbox');\n\nconst pressActionSchema = z.object({\n type: z.literal('press'),\n key: nonEmptyString.describe('Key to press (e.g., Enter, Tab, Escape, ArrowDown)'),\n target: LocatorSchema.optional().describe('Element to focus before pressing key'),\n frame: FrameLocatorSchema.optional().describe('Iframe context for the target element or keyboard action'),\n errorIf: errorIfSchema.optional(),\n}).describe('Press a keyboard key');\n\nconst focusActionSchema = z.object({\n type: z.literal('focus'),\n target: LocatorSchema,\n frame: FrameLocatorSchema.optional().describe('Iframe context for the target element'),\n errorIf: errorIfSchema.optional(),\n}).describe('Focus an element');\n\nconst assertActionSchema = z.object({\n type: z.literal('assert'),\n target: LocatorSchema,\n value: z.string().optional().describe('Expected text content'),\n frame: FrameLocatorSchema.optional().describe('Iframe context for the target element'),\n errorIf: errorIfSchema.optional(),\n}).describe('Assert that an element exists or contains expected text');\n\nconst waitActionSchema = z\n .object({\n type: z.literal('wait'),\n target: LocatorSchema.optional().describe('Element to wait for'),\n timeout: z.number().int().positive().optional().describe('Time to wait in milliseconds'),\n frame: FrameLocatorSchema.optional().describe('Iframe context for the target element'),\n errorIf: errorIfSchema.optional(),\n })\n .describe('Wait for an element or timeout')\n .refine((action) => action.target || action.timeout, {\n message: 'wait requires a target or timeout',\n });\n\nconst scrollActionSchema = z.object({\n type: z.literal('scroll'),\n target: LocatorSchema.optional().describe('Element to scroll'),\n direction: z.enum(['up', 'down']).optional().describe('Direction to scroll'),\n amount: z.number().int().positive().optional().describe('Amount to scroll in pixels'),\n errorIf: errorIfSchema.optional(),\n}).describe('Scroll the page or an element');\n\nconst screenshotActionSchema = z.object({\n type: z.literal('screenshot'),\n name: z.string().optional().describe('Name for the screenshot file'),\n waitBefore: z.number().int().nonnegative().optional().describe('Milliseconds to wait before capturing for visual stability (default: 500)'),\n}).describe('Take a screenshot');\n\nconst setVarActionSchema = z.object({\n type: z.literal('setVar'),\n name: nonEmptyString.describe('Variable name to set'),\n value: z.string().optional().describe('Static value to set'),\n from: z.enum(['response', 'element', 'email']).optional().describe('Extract value from a source'),\n path: z.string().optional().describe('JSON path or selector for extraction'),\n pattern: z.string().optional().describe('Regular expression pattern for extraction'),\n}).describe('Set a variable for use in later steps');\n\nconst emailWaitForActionSchema = z.object({\n type: z.literal('email.waitFor'),\n mailbox: nonEmptyString.describe('Email address or mailbox to check'),\n timeout: z.number().int().positive().optional().describe('How long to wait for email in milliseconds'),\n subjectContains: z.string().optional().describe('Filter by email subject'),\n}).describe('Wait for an email to arrive');\n\nconst emailExtractCodeActionSchema = z.object({\n type: z.literal('email.extractCode'),\n saveTo: nonEmptyString.describe('Variable name to save the extracted code'),\n pattern: z.string().optional().describe('Regular expression to extract code'),\n}).describe('Extract a verification code from email');\n\nconst emailExtractLinkActionSchema = z.object({\n type: z.literal('email.extractLink'),\n saveTo: nonEmptyString.describe('Variable name to save the extracted link'),\n pattern: z.string().optional().describe('Regular expression to match specific links'),\n}).describe('Extract a link from email');\n\nconst emailClearActionSchema = z.object({\n type: z.literal('email.clear'),\n mailbox: nonEmptyString.describe('Email address or mailbox to clear'),\n}).describe('Clear emails from a mailbox');\n\nconst appwriteVerifyEmailActionSchema = z.object({\n type: z.literal('appwrite.verifyEmail'),\n}).describe('Verify email using Appwrite');\n\nconst debugActionSchema = z.object({\n type: z.literal('debug'),\n}).describe('Pause execution and open Playwright Inspector for debugging');\n\nconst waitForSelectorActionSchema = z.object({\n type: z.literal('waitForSelector'),\n target: LocatorSchema,\n state: z.enum(['enabled', 'disabled', 'visible', 'hidden', 'attached', 'detached'])\n .describe('Element state to wait for'),\n timeout: z.number().int().positive().optional()\n .describe('Time to wait in milliseconds'),\n frame: FrameLocatorSchema.optional().describe('Iframe context for the target element'),\n errorIf: errorIfSchema.optional(),\n}).describe('Wait for an element to reach a specific state');\n\nconst logActionSchema = z.object({\n type: z.literal('log'),\n message: z.string().optional().describe('Static message to log (supports ${VAR_NAME} interpolation)'),\n eval: z.string().optional().describe('JavaScript expression to evaluate in page context'),\n target: LocatorSchema.optional().describe('Element to extract content from'),\n frame: FrameLocatorSchema.optional().describe('Iframe context for the target element'),\n format: z.enum(['text', 'html', 'json']).optional().describe('Output format for element content (default: text)'),\n}).describe('Log a message, evaluate JS, or extract element content for debugging')\n .refine(\n (action) => action.message || action.eval || action.target,\n { message: 'log requires message, eval, or target' },\n );\n\nconst failActionSchema = z.object({\n type: z.literal('fail'),\n message: nonEmptyString.describe('Error message to display when test fails'),\n}).describe('Explicitly fail the test with a custom message');\n\nconst evaluateActionSchema = z.object({\n type: z.literal('evaluate'),\n expected: z.union([\n z.string(),\n z.array(z.string()),\n ]).describe('Text to find in screenshot (substring or regex)'),\n mode: z.enum(['ocr', 'ai', 'auto']).optional()\n .describe('ocr=OCR only, ai=LLM vision only, auto=OCR first then AI fallback (default: auto)'),\n regex: z.boolean().optional()\n .describe('Treat expected as regex patterns (default: false)'),\n prompt: z.string().optional()\n .describe('Custom prompt for AI mode'),\n waitBefore: z.number().int().nonnegative().optional()\n .describe('ms to wait before screenshot for visual stability (default: 500)'),\n fullPage: z.boolean().optional()\n .describe('Full page or viewport only (default: true)'),\n confidence: z.number().min(0).max(100).optional()\n .describe('Min OCR confidence threshold, below falls back to AI in auto mode (default: 60)'),\n}).describe('Evaluate page state via screenshot analysis (OCR and/or AI vision)');\n\n// Base action schema without conditional (used for nested steps in conditional)\nconst BaseActionSchema = z.discriminatedUnion('type', [\n navigateActionSchema,\n tapActionSchema,\n inputActionSchema,\n typeActionSchema,\n clearActionSchema,\n hoverActionSchema,\n selectActionSchema,\n checkActionSchema,\n uncheckActionSchema,\n pressActionSchema,\n focusActionSchema,\n assertActionSchema,\n waitActionSchema,\n scrollActionSchema,\n screenshotActionSchema,\n setVarActionSchema,\n emailWaitForActionSchema,\n emailExtractCodeActionSchema,\n emailExtractLinkActionSchema,\n emailClearActionSchema,\n appwriteVerifyEmailActionSchema,\n debugActionSchema,\n waitForSelectorActionSchema,\n logActionSchema,\n failActionSchema,\n evaluateActionSchema,\n]);\n\nconst TrackableBaseActionSchema = z.intersection(BaseActionSchema, trackableSchema);\n\nconst conditionalActionSchema = z.intersection(z.object({\n type: z.literal('conditional'),\n condition: z.object({\n type: z.enum(['exists', 'notExists', 'visible', 'hidden']),\n target: LocatorSchema,\n }).describe('Condition to check'),\n then: z.array(TrackableBaseActionSchema).describe('Steps to execute if condition is true'),\n else: z.array(TrackableBaseActionSchema).optional().describe('Steps to execute if condition is false'),\n}).describe('Execute steps conditionally based on element state'), trackableSchema);\n\n// Branch definition - can be inline actions OR a workflow file reference\nconst branchSchema = z.union([\n z.array(TrackableBaseActionSchema), // Inline actions\n z.object({\n workflow: z.string().trim().min(1).describe('Path to workflow file relative to current file'),\n variables: z.record(z.string(), z.string()).optional().describe('Variables to pass to the workflow'),\n }),\n]).describe('Actions to execute - either inline steps or a workflow file reference');\n\nconst waitForBranchActionSchema = z.intersection(z.object({\n type: z.literal('waitForBranch'),\n target: LocatorSchema.describe('Element to wait for'),\n timeout: z.number().int().positive().optional().describe('Maximum time to wait for element in milliseconds (default: 30000)'),\n state: z.enum(['visible', 'attached', 'enabled']).optional().describe('Element state to wait for (default: visible)'),\n onAppear: branchSchema.describe('Actions to execute when element appears within timeout'),\n onTimeout: branchSchema.optional().describe('Actions to execute if timeout occurs (silent continue if omitted)'),\n pollInterval: z.number().int().positive().optional().describe('How often to check for element in milliseconds (default: 100)'),\n}).describe('Wait for an element and branch based on whether it appears or times out'), trackableSchema);\n\nexport const ActionSchema = z.union([TrackableBaseActionSchema, conditionalActionSchema, waitForBranchActionSchema]);\n\nconst defaultsSchema = z.object({\n timeout: z.number().int().positive().optional().describe('Default timeout in milliseconds for all actions'),\n screenshots: z.enum(['on-failure', 'always', 'never']).optional().describe('When to capture screenshots during test execution'),\n}).describe('Default settings that apply to all tests unless overridden');\n\nconst webConfigSchema = z.object({\n baseUrl: optionalUrl.describe('Base URL for the web application'),\n browser: z.string().trim().optional().describe('Browser to use for testing'),\n headless: z.boolean().optional().describe('Run browser in headless mode'),\n timeout: z.number().int().positive().optional().describe('Timeout in milliseconds for web actions'),\n}).describe('Web platform configuration');\n\nconst androidConfigSchema = z.object({\n appId: z.string().trim().optional().describe('Android application ID'),\n device: z.string().trim().optional().describe('Device name or ID to run tests on'),\n}).describe('Android platform configuration');\n\nconst iosConfigSchema = z.object({\n bundleId: z.string().trim().optional().describe('iOS bundle identifier'),\n simulator: z.string().trim().optional().describe('Simulator name to run tests on'),\n}).describe('iOS platform configuration');\n\nconst emailConfigSchema = z.object({\n provider: z.literal('inbucket').describe('Email testing provider'),\n endpoint: optionalUrl.describe('Email service endpoint URL'),\n}).describe('Email testing configuration');\n\nconst appwriteConfigSchema = z.object({\n endpoint: nonEmptyString.url().describe('Appwrite API endpoint'),\n projectId: nonEmptyString.describe('Appwrite project ID'),\n apiKey: nonEmptyString.describe('Appwrite API key with appropriate permissions'),\n cleanup: z.boolean().optional().describe('Enable automatic cleanup of created resources'),\n cleanupOnFailure: z.boolean().optional().describe('Clean up resources even when test fails'),\n}).describe('Appwrite backend configuration');\n\nconst healingSchema = z.object({\n enabled: z.boolean().optional().describe('Enable AI-assisted test healing on failures'),\n maxAttempts: z.number().int().min(1).max(10).default(3).describe('Maximum AI healing attempts per failure (default: 3)'),\n strategies: z.array(z.string().trim()).optional().describe('Healing strategies to use'),\n}).describe('AI-assisted test healing configuration');\n\nconst webServerSchema = z\n .object({\n command: nonEmptyString.optional().describe('Command to start the web server'),\n auto: z.boolean().optional().describe('Automatically detect and run the dev server from package.json'),\n static: z.string().optional().describe('Serve a static directory instead of running a command'),\n url: nonEmptyString.url().describe('URL to wait for before starting tests'),\n port: z.number().int().positive().optional().describe('Port number for the web server'),\n reuseExistingServer: z.boolean().default(true).describe('Use existing server if already running at the specified URL'),\n timeout: z.number().int().positive().default(30000).describe('Timeout in milliseconds to wait for server to become available'),\n workdir: z.string().optional().describe('Working directory for the server command'),\n cwd: z.string().optional().describe('Deprecated: use workdir instead'),\n })\n .describe('Configuration for starting a web server before running tests')\n .refine((config) => config.command || config.auto || config.static, {\n message: 'WebServerConfig requires command, auto: true, or static directory',\n });\n\nconst aiSourceSchema = z.object({\n pagesDir: z.string().optional().describe('Directory containing page components'),\n componentsDir: z.string().optional().describe('Directory containing reusable components'),\n extensions: z.array(z.string()).default(['.vue', '.astro', '.tsx', '.jsx', '.svelte']).describe('File extensions to include in source code analysis'),\n}).optional().describe('Source code directories for AI to analyze when generating tests');\n\nconst defaultModelForProvider = (provider: string): string => {\n switch (provider) {\n case 'anthropic': return 'claude-haiku-4-5-20251001';\n case 'openrouter': return 'anthropic/claude-haiku-4.5';\n case 'openai': return 'gpt-4o-mini';\n case 'groq': return 'llama-3.1-8b-instant';\n case 'ollama': return 'llama3.2:3b';\n default: return 'claude-haiku-4-5-20251001';\n }\n};\n\nconst aiConfigSchema = z.object({\n provider: z.enum(['anthropic', 'openai', 'ollama', 'groq', 'openrouter']).describe('AI provider to use for test generation'),\n model: z.string().trim().optional().describe('Model name to use (defaults based on provider if omitted)'),\n apiKey: z.string().trim().optional().describe('API key for the AI provider (supports ${ENV_VAR} syntax)'),\n baseUrl: optionalUrl.describe('Base URL for the AI API (required for Ollama, auto-set for groq/openrouter)'),\n temperature: z.number().min(0).max(2).default(0.2).describe('Temperature for AI generation (0 = deterministic, 2 = very creative)'),\n maxTokens: z.number().int().positive().default(4096).describe('Maximum tokens for AI responses'),\n source: aiSourceSchema,\n}).transform((val) => ({\n ...val,\n model: val.model || defaultModelForProvider(val.provider),\n})).describe('AI configuration for test generation and healing');\n\n// Cleanup discovery configuration\nexport const cleanupDiscoverSchema = z.object({\n enabled: z.boolean().default(true).describe('Enable auto-discovery of cleanup handlers in specified paths'),\n paths: z.array(z.string()).default(['./tests/cleanup']).describe('Directories to search for cleanup handler files'),\n pattern: z.string().default('**/*.ts').describe('Glob pattern to match handler files'),\n}).optional().describe('Auto-discovery configuration for cleanup handlers');\n\n// Main cleanup configuration\nexport const cleanupConfigSchema = z.object({\n provider: z.string().optional().describe('Primary cleanup provider to use'),\n parallel: z.boolean().default(false).describe('Execute cleanup operations in parallel'),\n retries: z.number().min(1).max(10).default(3).describe('Number of retry attempts for failed cleanup operations'),\n types: z.record(z.string(), z.string()).optional().describe('Map resource types to cleanup handler methods'),\n handlers: z.array(z.string()).optional().describe('Explicit paths to custom cleanup handler files'),\n discover: cleanupDiscoverSchema,\n scanUntracked: z.boolean().optional().describe('Scan for untracked resources using provider heuristics'),\n}).passthrough().describe('Comprehensive resource cleanup configuration'); // Allow provider-specific configs like appwrite: {...}\n\n// Export the inferred type\nexport type CleanupConfig = z.infer<typeof cleanupConfigSchema>;\n\nconst platformsSchema = z.object({\n web: webConfigSchema.optional(),\n android: androidConfigSchema.optional(),\n ios: iosConfigSchema.optional(),\n}).describe('Platform-specific configurations');\n\n// Preview configuration for --preview flag\nexport const previewConfigSchema = z.object({\n build: z.object({\n command: z.string().optional().describe('Command to build the project'),\n }).optional().describe('Build configuration'),\n preview: z.object({\n command: z.string().optional().describe('Command to start the preview server after build'),\n }).optional().describe('Preview server configuration'),\n url: optionalUrl.describe('URL to wait for before starting tests'),\n timeout: z.number().int().positive().optional().describe('Timeout in milliseconds to wait for preview server'),\n}).describe('Configuration for the --preview flag (build and serve production build)');\n\nexport const TestConfigSchema = z.object({\n defaults: defaultsSchema.optional(),\n web: webConfigSchema.optional(),\n android: androidConfigSchema.optional(),\n ios: iosConfigSchema.optional(),\n email: emailConfigSchema.optional(),\n appwrite: appwriteConfigSchema.optional(),\n healing: healingSchema.optional(),\n ai: aiConfigSchema.optional(),\n}).describe('Test-specific configuration that overrides global settings');\n\nexport const TestDefinitionSchema = z.object({\n name: nonEmptyString.describe('The name of the test'),\n platform: z.enum(['web', 'android', 'ios']).describe('The platform to run the test on'),\n variables: z.record(z.string(), z.string()).optional().describe('Variables that can be referenced in test steps using ${VARIABLE_NAME} syntax'),\n config: TestConfigSchema.optional(),\n steps: z.array(ActionSchema).min(1).describe('The sequence of actions to execute in this test'),\n}).describe('Schema for IntelliTester test definition files');\n\nexport const IntellitesterConfigSchema = z.object({\n defaults: defaultsSchema.optional(),\n ai: aiConfigSchema.optional(),\n platforms: platformsSchema.optional(),\n healing: healingSchema.optional(),\n email: emailConfigSchema.optional(),\n appwrite: appwriteConfigSchema.optional(),\n cleanup: cleanupConfigSchema.optional(),\n webServer: webServerSchema.optional(),\n preview: previewConfigSchema.optional(),\n secrets: z.record(z.string(), z.string().trim()).optional().describe('Secret values that can be referenced in tests'),\n}).describe('Global configuration file for IntelliTester');\n","import { z } from 'zod';\n\nconst nonEmptyString = z.string().trim().min(1, 'Value cannot be empty');\n\n// Reference to a test file in the workflow\nconst testReferenceSchema = z.object({\n file: nonEmptyString.describe('Path to the test file relative to the workflow file'),\n id: nonEmptyString.optional().describe('Optional ID for referencing this test in variables or dependencies'),\n variables: z.record(z.string(), z.string()).optional().describe('Variables to inject or override for this specific test'),\n}).describe('Reference to a test file');\n\n// Workflow-specific web config\nconst workflowWebConfigSchema = z.object({\n baseUrl: nonEmptyString.url().optional().describe('Base URL for all tests in this workflow'),\n browser: z.enum(['chromium', 'firefox', 'webkit']).optional().describe('Browser to use for all web tests'),\n headless: z.boolean().optional().describe('Run browser in headless mode'),\n testSizes: z.array(z.enum(['xs', 'sm', 'md', 'lg', 'xl'])).optional()\n .describe('Viewport sizes to test (Tailwind breakpoints). Tests run once per size.'),\n}).describe('Web platform configuration for the workflow');\n\n// Workflow-specific Appwrite config\nconst workflowAppwriteConfigSchema = z.object({\n endpoint: nonEmptyString.url().describe('Appwrite API endpoint'),\n projectId: nonEmptyString.describe('Appwrite project ID'),\n apiKey: nonEmptyString.describe('Appwrite API key'),\n cleanup: z.boolean().default(true).describe('Enable automatic cleanup of created resources'),\n cleanupOnFailure: z.boolean().default(true).describe('Clean up resources even when tests fail'),\n}).describe('Appwrite backend configuration for the workflow');\n\n// Cleanup discovery configuration for workflows\nconst workflowCleanupDiscoverSchema = z.object({\n enabled: z.boolean().default(true).describe('Enable auto-discovery of cleanup handlers'),\n paths: z.array(z.string()).default(['./tests/cleanup']).describe('Directories to search for cleanup handlers'),\n pattern: z.string().default('**/*.ts').describe('Glob pattern for handler files'),\n}).optional().describe('Auto-discovery configuration for cleanup handlers');\n\n// Workflow cleanup configuration\nconst workflowCleanupConfigSchema = z.object({\n provider: z.string().optional().describe('Cleanup provider to use'),\n parallel: z.boolean().default(false).describe('Run cleanup tasks in parallel'),\n retries: z.number().min(1).max(10).default(3).describe('Number of retry attempts for failed cleanup operations'),\n types: z.record(z.string(), z.string()).optional().describe('Map resource types to cleanup handler methods'),\n handlers: z.array(z.string()).optional().describe('Explicit paths to custom cleanup handler files'),\n discover: workflowCleanupDiscoverSchema,\n scanUntracked: z.boolean().optional().describe('Scan for untracked resources using provider heuristics'),\n}).passthrough().describe('Resource cleanup configuration'); // Allow provider-specific configs like appwrite: {...}\n\n// Workflow-specific web server config\nconst workflowWebServerSchema = z.object({\n command: nonEmptyString.optional().describe('Command to start the web server'),\n auto: z.boolean().optional().describe('Auto-detect server start command from package.json'),\n url: nonEmptyString.url().describe('URL to wait for before starting tests'),\n reuseExistingServer: z.boolean().default(true).describe('Use existing server if already running at the URL'),\n timeout: z.number().int().positive().default(30000).describe('Timeout in milliseconds to wait for server to start'),\n workdir: nonEmptyString.optional().describe('Working directory for the web server command'),\n cwd: nonEmptyString.optional().describe('Deprecated: use workdir instead'),\n}).describe('Configuration for starting a web server before tests');\n\n// Workflow configuration\nconst workflowConfigSchema = z.object({\n web: workflowWebConfigSchema.optional(),\n appwrite: workflowAppwriteConfigSchema.optional(),\n cleanup: workflowCleanupConfigSchema.optional(),\n webServer: workflowWebServerSchema.optional(),\n}).describe('Workflow-level configuration that applies to all tests');\n\n// Main workflow definition schema\nexport const WorkflowDefinitionSchema = z.object({\n name: nonEmptyString.describe('The name of the workflow'),\n platform: z.enum(['web', 'android', 'ios']).default('web').describe('The platform to run the workflow on'),\n variables: z.record(z.string(), z.string()).optional().describe('Workflow-level variables available to all tests'),\n config: workflowConfigSchema.optional(),\n continueOnFailure: z.boolean().default(false).describe('Continue running subsequent tests even if a test fails'),\n tests: z.array(testReferenceSchema).min(1, 'Workflow must contain at least one test').describe('List of test files to execute in this workflow'),\n}).describe('Schema for IntelliTester workflow files that orchestrate multiple tests');\n\n// Export inferred types\nexport type WorkflowDefinition = z.infer<typeof WorkflowDefinitionSchema>;\nexport type TestReference = z.infer<typeof testReferenceSchema>;\nexport type WorkflowConfig = z.infer<typeof workflowConfigSchema>;\nexport type WorkflowWebConfig = z.infer<typeof workflowWebConfigSchema>;\nexport type WorkflowAppwriteConfig = z.infer<typeof workflowAppwriteConfigSchema>;\nexport type WorkflowCleanupConfig = z.infer<typeof workflowCleanupConfigSchema>;\nexport type WorkflowWebServerConfig = z.infer<typeof workflowWebServerSchema>;\n","import { z } from 'zod';\n\nconst nonEmptyString = z.string().trim().min(1, 'Value cannot be empty');\n\n// Workflow reference within a pipeline\nconst workflowReferenceSchema = z.object({\n file: nonEmptyString.describe('Path to the workflow file'),\n id: nonEmptyString.optional().describe('Optional ID for referencing this workflow in dependencies'),\n depends_on: z.array(nonEmptyString).optional().describe('IDs of workflows that must complete before this one'),\n on_failure: z.enum(['skip', 'fail', 'ignore']).optional().describe('How to handle failure of this workflow'),\n variables: z.record(z.string(), z.string()).optional().describe('Variables to inject or override for this workflow'),\n}).describe('Reference to a workflow file');\n\n// Pipeline-specific web config (matches workflow web config pattern)\nconst pipelineWebConfigSchema = z.object({\n baseUrl: nonEmptyString.url().optional().describe('Base URL for all workflows in this pipeline'),\n browser: z.enum(['chromium', 'firefox', 'webkit']).optional().describe('Browser to use for all web tests'),\n headless: z.boolean().optional().describe('Run browser in headless mode'),\n testSizes: z.array(z.enum(['xs', 'sm', 'md', 'lg', 'xl'])).optional()\n .describe('Viewport sizes to test (Tailwind breakpoints). Tests run once per size.'),\n}).describe('Web platform configuration for the pipeline');\n\n// Pipeline-specific Appwrite config\nconst pipelineAppwriteConfigSchema = z.object({\n endpoint: nonEmptyString.url().describe('Appwrite API endpoint'),\n projectId: nonEmptyString.describe('Appwrite project ID'),\n apiKey: nonEmptyString.describe('Appwrite API key'),\n cleanup: z.boolean().default(true).describe('Enable automatic cleanup of created resources'),\n cleanupOnFailure: z.boolean().default(true).describe('Clean up resources even when workflows fail'),\n}).describe('Appwrite backend configuration for the pipeline');\n\n// Pipeline cleanup discovery configuration\nconst pipelineCleanupDiscoverSchema = z.object({\n enabled: z.boolean().default(true).describe('Enable auto-discovery of cleanup handlers'),\n paths: z.array(z.string()).default(['./tests/cleanup']).describe('Directories to search for cleanup handlers'),\n pattern: z.string().default('**/*.ts').describe('Glob pattern for handler files'),\n}).optional().describe('Auto-discovery configuration for cleanup handlers');\n\n// Pipeline cleanup configuration\nconst pipelineCleanupConfigSchema = z.object({\n provider: z.string().optional().describe('Cleanup provider to use'),\n parallel: z.boolean().default(false).describe('Run cleanup tasks in parallel'),\n retries: z.number().min(1).max(10).default(3).describe('Number of retry attempts for failed cleanup operations'),\n types: z.record(z.string(), z.string()).optional().describe('Map resource types to cleanup handler methods'),\n handlers: z.array(z.string()).optional().describe('Explicit paths to custom cleanup handler files'),\n discover: pipelineCleanupDiscoverSchema,\n scanUntracked: z.boolean().optional().describe('Scan for untracked resources using provider heuristics'),\n on_failure: z.boolean().default(true).describe('Run cleanup even if pipeline fails'),\n}).passthrough().describe('Resource cleanup configuration'); // Allow provider-specific configs like appwrite: {...}\n\n// Pipeline-specific web server config\nconst pipelineWebServerSchema = z.object({\n command: nonEmptyString.optional().describe('Command to start the web server'),\n auto: z.boolean().optional().describe('Auto-detect server start command from package.json'),\n url: nonEmptyString.url().describe('URL to wait for before starting workflows'),\n reuseExistingServer: z.boolean().default(true).describe('Use existing server if already running at the URL'),\n timeout: z.number().int().positive().default(30000).describe('Timeout in milliseconds to wait for server to start'),\n workdir: nonEmptyString.optional().describe('Working directory for the web server command'),\n cwd: nonEmptyString.optional().describe('Deprecated: use workdir instead'),\n}).describe('Configuration for starting a web server before workflows');\n\n// Pipeline configuration (similar to workflow config)\nconst pipelineConfigSchema = z.object({\n web: pipelineWebConfigSchema.optional(),\n appwrite: pipelineAppwriteConfigSchema.optional(),\n cleanup: pipelineCleanupConfigSchema.optional(),\n webServer: pipelineWebServerSchema.optional(),\n}).describe('Pipeline-level configuration that applies to all workflows');\n\n// Main pipeline definition schema\nexport const PipelineDefinitionSchema = z.object({\n name: nonEmptyString.describe('The name of the pipeline'),\n platform: z.enum(['web', 'android', 'ios']).default('web').describe('The platform to run the pipeline on'),\n config: pipelineConfigSchema.optional(),\n on_failure: z.enum(['skip', 'fail', 'ignore']).default('skip').describe('Default failure handling for workflows'),\n cleanup_on_failure: z.boolean().default(true).describe('Run cleanup even when pipeline fails'),\n workflows: z.array(workflowReferenceSchema).min(1, 'Pipeline must contain at least one workflow').describe('List of workflow files to execute in this pipeline'),\n}).describe('Schema for IntelliTester pipeline files that orchestrate multiple workflows');\n\n// Export inferred types\nexport type PipelineDefinition = z.infer<typeof PipelineDefinitionSchema>;\nexport type WorkflowReference = z.infer<typeof workflowReferenceSchema>;\nexport type PipelineConfig = z.infer<typeof pipelineConfigSchema>;\nexport type PipelineWebConfig = z.infer<typeof pipelineWebConfigSchema>;\nexport type PipelineAppwriteConfig = z.infer<typeof pipelineAppwriteConfigSchema>;\nexport type PipelineCleanupConfig = z.infer<typeof pipelineCleanupConfigSchema>;\nexport type PipelineWebServerConfig = z.infer<typeof pipelineWebServerSchema>;\n"]}
|