@upbeat-works/fisgon 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +135 -4
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +2 -44
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +8 -45
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/wrangler.d.ts +19 -0
- package/dist/cli/wrangler.d.ts.map +1 -0
- package/dist/cli/wrangler.js +88 -0
- package/dist/cli/wrangler.js.map +1 -0
- package/dist/core/types.d.ts +1 -0
- package/dist/core/types.d.ts.map +1 -1
- package/package.json +4 -9
- package/dist/adapters/drizzle.d.ts +0 -17
- package/dist/adapters/drizzle.d.ts.map +0 -1
- package/dist/adapters/drizzle.js +0 -83
- package/dist/adapters/drizzle.js.map +0 -1
- package/dist/adapters/prisma.d.ts +0 -16
- package/dist/adapters/prisma.d.ts.map +0 -1
- package/dist/adapters/prisma.js +0 -69
- package/dist/adapters/prisma.js.map +0 -1
package/README.md
CHANGED
|
@@ -40,9 +40,54 @@ fisgon run signup # replay without LLM
|
|
|
40
40
|
## Install
|
|
41
41
|
|
|
42
42
|
```bash
|
|
43
|
-
npm install fisgon
|
|
43
|
+
npm install @upbeat-works/fisgon
|
|
44
44
|
```
|
|
45
45
|
|
|
46
|
+
### Wrangler config
|
|
47
|
+
|
|
48
|
+
Fisgon's agent runs locally via `wrangler dev`. Create a `wrangler.jsonc` in your project root:
|
|
49
|
+
|
|
50
|
+
```jsonc
|
|
51
|
+
{
|
|
52
|
+
"name": "fisgon-agent",
|
|
53
|
+
"main": "node_modules/@upbeat-works/fisgon/dist/agent/worker.js",
|
|
54
|
+
"compatibility_date": "2025-01-01",
|
|
55
|
+
"durable_objects": {
|
|
56
|
+
"bindings": [{ "name": "AGENT", "class_name": "Agent" }]
|
|
57
|
+
},
|
|
58
|
+
"migrations": [
|
|
59
|
+
{ "tag": "v1", "new_sqlite_classes": ["Agent"] }
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Then add a `.dev.vars` file next to it with your API keys. The agent routes LLM calls through Cloudflare AI Gateway, so you'll need:
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
ACCOUNT_ID=your-cloudflare-account-id
|
|
68
|
+
AI_GATEWAY=your-ai-gateway-name
|
|
69
|
+
AI_GATEWAY_TOKEN=your-api-token
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
> If your wrangler config lives somewhere other than the project root (e.g. in a monorepo), set `wrangler` in your fisgon config to the relative path.
|
|
73
|
+
|
|
74
|
+
### Remote agent
|
|
75
|
+
|
|
76
|
+
Instead of running the agent locally, you can deploy it to Cloudflare Workers and connect to it remotely. This skips the local wrangler setup entirely — no `wrangler.jsonc` or `.dev.vars` needed in your project.
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
# via CLI flag
|
|
80
|
+
fisgon start --agent wss://fisgon.example.workers.dev
|
|
81
|
+
|
|
82
|
+
# or in fisgon.config.ts
|
|
83
|
+
export default defineConfig({
|
|
84
|
+
url: 'http://localhost:3000',
|
|
85
|
+
agent: 'wss://fisgon.example.workers.dev',
|
|
86
|
+
})
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
When `agent` is set, `fisgon start` and `fisgon run` connect directly to the remote Durable Object over WebSocket. Use the `--env` flag to target a specific instance (e.g. `--env staging`, `--env pr-123`).
|
|
90
|
+
|
|
46
91
|
## CLI
|
|
47
92
|
|
|
48
93
|
```bash
|
|
@@ -58,12 +103,42 @@ fisgon open <actionId> # Inspect an action's HTML
|
|
|
58
103
|
fisgon stop # Stop the session
|
|
59
104
|
```
|
|
60
105
|
|
|
106
|
+
### `fisgon start`
|
|
107
|
+
|
|
108
|
+
| Flag | Description |
|
|
109
|
+
|------|-------------|
|
|
110
|
+
| `-p, --port <port>` | Agent port (default: `9876`) |
|
|
111
|
+
| `--agent <url>` | Remote agent URL (skips local wrangler) |
|
|
112
|
+
| `--env <name>` | Durable Object instance name (default: `default`) |
|
|
113
|
+
| `--remote` | Use remote Browser Rendering instead of local Playwright |
|
|
114
|
+
| `--no-browser` | Skip launching browser |
|
|
115
|
+
| `--identity <entries...>` | Session identities as `name:email:password` (can specify multiple) |
|
|
116
|
+
|
|
117
|
+
### `fisgon do`
|
|
118
|
+
|
|
119
|
+
The `do` command first checks your saved tasks — if any match the instruction, they're replayed automatically. Any remaining instruction is passed to the LLM.
|
|
120
|
+
|
|
121
|
+
### `fisgon run`
|
|
122
|
+
|
|
123
|
+
| Flag | Description |
|
|
124
|
+
|------|-------------|
|
|
125
|
+
| `--fallback` | Fall back to LLM if a step fails or validation doesn't pass |
|
|
126
|
+
| `--verbose` | Print each step as it executes |
|
|
127
|
+
| `--headless` | Run browser without visible window |
|
|
128
|
+
| `--list` | List all saved tasks and cases |
|
|
129
|
+
|
|
130
|
+
### `fisgon navigate`
|
|
131
|
+
|
|
132
|
+
| Flag | Description |
|
|
133
|
+
|------|-------------|
|
|
134
|
+
| `--as <identity>` | Log in as a named identity before navigating |
|
|
135
|
+
|
|
61
136
|
## Configuration
|
|
62
137
|
|
|
63
138
|
Create a `fisgon.config.ts` (or `.js` / `.mjs`) in your project root:
|
|
64
139
|
|
|
65
140
|
```typescript
|
|
66
|
-
import { defineConfig } from 'fisgon'
|
|
141
|
+
import { defineConfig } from '@upbeat-works/fisgon'
|
|
67
142
|
|
|
68
143
|
export default defineConfig({
|
|
69
144
|
url: 'http://localhost:3000',
|
|
@@ -79,6 +154,7 @@ export default defineConfig({
|
|
|
79
154
|
silenceMs: 500, // wait 500ms of silence to close a tick
|
|
80
155
|
maxMs: 30000, // max tick duration
|
|
81
156
|
},
|
|
157
|
+
// wrangler: 'packages/app/wrangler.jsonc', // custom wrangler config path
|
|
82
158
|
})
|
|
83
159
|
```
|
|
84
160
|
|
|
@@ -87,7 +163,7 @@ export default defineConfig({
|
|
|
87
163
|
Fisgon can observe your server too. Add a probe to capture SQL queries and custom events:
|
|
88
164
|
|
|
89
165
|
```typescript
|
|
90
|
-
import { createProbe } from 'fisgon/server'
|
|
166
|
+
import { createProbe } from '@upbeat-works/fisgon/server'
|
|
91
167
|
|
|
92
168
|
const probe = createProbe({ url: 'http://localhost:9876' })
|
|
93
169
|
|
|
@@ -129,7 +205,62 @@ validate:
|
|
|
129
205
|
url_contains: /dashboard
|
|
130
206
|
```
|
|
131
207
|
|
|
132
|
-
|
|
208
|
+
### Parameters
|
|
209
|
+
|
|
210
|
+
All string values in `args` support `{{param}}` placeholders. Default values are defined in `params` and can be overridden at runtime.
|
|
211
|
+
|
|
212
|
+
### Extract
|
|
213
|
+
|
|
214
|
+
Steps can extract dynamic values from tick events for use in later steps:
|
|
215
|
+
|
|
216
|
+
```yaml
|
|
217
|
+
steps:
|
|
218
|
+
- tool: interact
|
|
219
|
+
args:
|
|
220
|
+
action: click
|
|
221
|
+
selector: button[type="submit"]
|
|
222
|
+
- tool: wait_for_tick
|
|
223
|
+
extract:
|
|
224
|
+
callbackUrl: "events[source=email].data.text | match(/http\\S+callback\\S+/)"
|
|
225
|
+
- tool: navigate
|
|
226
|
+
args:
|
|
227
|
+
url: "{{callbackUrl}}"
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
Supported expression formats:
|
|
231
|
+
- `events[source=X].data.field` — find event by source, traverse path
|
|
232
|
+
- `events[source=X].data.text | match(/regex/)` — find event, extract regex match
|
|
233
|
+
- `data.field.subfield` — simple dot-path traversal
|
|
234
|
+
|
|
235
|
+
### Validation
|
|
236
|
+
|
|
237
|
+
Tasks can validate the result after all steps complete:
|
|
238
|
+
|
|
239
|
+
```yaml
|
|
240
|
+
validate:
|
|
241
|
+
url_contains: /dashboard # final URL contains substring
|
|
242
|
+
url_matches: "/users/\\d+" # final URL matches regex
|
|
243
|
+
event_exists: # a matching event was emitted
|
|
244
|
+
source: email
|
|
245
|
+
type: sent
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
When using `--fallback`, a failed validation causes the LLM to re-attempt the entire task.
|
|
249
|
+
|
|
250
|
+
## Test cases
|
|
251
|
+
|
|
252
|
+
Cases live in `.fisgon/cases/` and compose multiple tasks into a sequence:
|
|
253
|
+
|
|
254
|
+
```yaml
|
|
255
|
+
name: full_signup
|
|
256
|
+
description: Complete user signup and email verification
|
|
257
|
+
tasks:
|
|
258
|
+
- signup
|
|
259
|
+
- verify_email
|
|
260
|
+
- complete_profile
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
Run with `fisgon run full_signup` — tasks execute in order, stopping on the first failure. Use `fisgon run --list` to see all available tasks and cases.
|
|
133
264
|
|
|
134
265
|
## Architecture
|
|
135
266
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAUnC,eAAO,MAAM,UAAU,SAuLpB,CAAA"}
|
package/dist/cli/commands/run.js
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
import { spawn } from 'node:child_process';
|
|
2
|
-
import { existsSync } from 'node:fs';
|
|
3
|
-
import { resolve } from 'node:path';
|
|
4
1
|
import { Command } from 'commander';
|
|
5
2
|
import { readTaskFile, readCaseFile, listTasks, listCases } from '../../core/task-file.js';
|
|
6
3
|
import { launchBrowser } from '../browser-setup.js';
|
|
@@ -8,46 +5,7 @@ import { loadConfig } from '../config.js';
|
|
|
8
5
|
import { connectToAgent } from '../connection.js';
|
|
9
6
|
import { getRunningSession } from '../session-file.js';
|
|
10
7
|
import { replayTask } from '../task-runner.js';
|
|
11
|
-
|
|
12
|
-
return new Promise((resolve_, reject) => {
|
|
13
|
-
const fisgonRoot = resolve(import.meta.dirname, '../../..');
|
|
14
|
-
const wranglerConfigPath = resolve(fisgonRoot, 'wrangler.jsonc');
|
|
15
|
-
const devVarsPath = resolve(fisgonRoot, '.dev.vars');
|
|
16
|
-
const wranglerArgs = [
|
|
17
|
-
'wrangler',
|
|
18
|
-
'dev',
|
|
19
|
-
'--config',
|
|
20
|
-
wranglerConfigPath,
|
|
21
|
-
'--port',
|
|
22
|
-
String(port),
|
|
23
|
-
];
|
|
24
|
-
if (existsSync(devVarsPath)) {
|
|
25
|
-
wranglerArgs.push('--env-file', devVarsPath);
|
|
26
|
-
}
|
|
27
|
-
const wrangler = spawn('npx', wranglerArgs, {
|
|
28
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
29
|
-
env: { ...process.env },
|
|
30
|
-
});
|
|
31
|
-
const timeout = setTimeout(() => reject(new Error('Wrangler startup timed out')), 30000);
|
|
32
|
-
const onReady = (data) => {
|
|
33
|
-
if (data.toString().includes('Ready on')) {
|
|
34
|
-
clearTimeout(timeout);
|
|
35
|
-
resolve_(wrangler);
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
wrangler.stderr?.on('data', onReady);
|
|
39
|
-
wrangler.stdout?.on('data', onReady);
|
|
40
|
-
wrangler.on('error', (err) => {
|
|
41
|
-
clearTimeout(timeout);
|
|
42
|
-
reject(err);
|
|
43
|
-
});
|
|
44
|
-
wrangler.on('exit', (code) => {
|
|
45
|
-
clearTimeout(timeout);
|
|
46
|
-
if (code !== 0)
|
|
47
|
-
reject(new Error(`Wrangler exited with code ${code}`));
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
}
|
|
8
|
+
import { startWrangler } from '../wrangler.js';
|
|
51
9
|
export const runCommand = new Command('run')
|
|
52
10
|
.description('Replay a saved task or test case')
|
|
53
11
|
.argument('<name>', 'Task or test case name')
|
|
@@ -114,7 +72,7 @@ export const runCommand = new Command('run')
|
|
|
114
72
|
if (!isRemote) {
|
|
115
73
|
if (opts.verbose)
|
|
116
74
|
console.log('Starting Fisgon agent...');
|
|
117
|
-
wrangler = await startWrangler(port);
|
|
75
|
+
wrangler = await startWrangler({ port, wrangler: config.wrangler });
|
|
118
76
|
if (opts.verbose)
|
|
119
77
|
console.log(`Agent running on port ${port}`);
|
|
120
78
|
// Give wrangler a moment to be fully ready
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AASnC,eAAO,MAAM,YAAY,SA6ItB,CAAA"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { existsSync, writeFileSync } from 'node:fs';
|
|
1
|
+
import { writeFileSync } from 'node:fs';
|
|
3
2
|
import { tmpdir } from 'node:os';
|
|
4
|
-
import {
|
|
3
|
+
import { join } from 'node:path';
|
|
5
4
|
import { Command } from 'commander';
|
|
6
5
|
import { createBrowserHandler } from '../browser-handler.js';
|
|
7
6
|
import { launchBrowser } from '../browser-setup.js';
|
|
8
7
|
import { loadConfig } from '../config.js';
|
|
9
8
|
import { connectToAgent } from '../connection.js';
|
|
9
|
+
import { startWrangler } from '../wrangler.js';
|
|
10
10
|
export const startCommand = new Command('start')
|
|
11
11
|
.description('Start a Fisgon test session')
|
|
12
12
|
.option('-p, --port <port>', 'Agent port (local mode)', '9876')
|
|
@@ -45,55 +45,18 @@ export const startCommand = new Command('start')
|
|
|
45
45
|
// 1. In local mode, spawn wrangler dev for the agent
|
|
46
46
|
if (!isRemote) {
|
|
47
47
|
console.log('Starting Fisgon agent...');
|
|
48
|
-
|
|
49
|
-
const wranglerConfigPath = resolve(fisgonRoot, 'wrangler.jsonc');
|
|
50
|
-
const devVarsPath = resolve(fisgonRoot, '.dev.vars');
|
|
51
|
-
const wranglerArgs = [
|
|
52
|
-
'wrangler',
|
|
53
|
-
'dev',
|
|
54
|
-
'--config',
|
|
55
|
-
wranglerConfigPath,
|
|
56
|
-
'--port',
|
|
57
|
-
String(effectivePort),
|
|
58
|
-
];
|
|
59
|
-
if (existsSync(devVarsPath)) {
|
|
60
|
-
wranglerArgs.push('--env-file', devVarsPath);
|
|
61
|
-
}
|
|
62
|
-
const wrangler = spawn('npx', wranglerArgs, {
|
|
63
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
64
|
-
env: { ...process.env },
|
|
65
|
-
});
|
|
66
|
-
wranglerPid = wrangler.pid;
|
|
48
|
+
let wrangler;
|
|
67
49
|
try {
|
|
68
|
-
await
|
|
69
|
-
|
|
70
|
-
wrangler.
|
|
71
|
-
if (data.toString().includes('Ready on')) {
|
|
72
|
-
clearTimeout(timeout);
|
|
73
|
-
waitResolve();
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
wrangler.stdout?.on('data', (data) => {
|
|
77
|
-
if (data.toString().includes('Ready on')) {
|
|
78
|
-
clearTimeout(timeout);
|
|
79
|
-
waitResolve();
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
wrangler.on('error', (err) => {
|
|
83
|
-
clearTimeout(timeout);
|
|
84
|
-
reject(err);
|
|
85
|
-
});
|
|
86
|
-
wrangler.on('exit', (code) => {
|
|
87
|
-
clearTimeout(timeout);
|
|
88
|
-
if (code !== 0)
|
|
89
|
-
reject(new Error(`Wrangler exited with code ${code}`));
|
|
90
|
-
});
|
|
50
|
+
wrangler = await startWrangler({
|
|
51
|
+
port: effectivePort,
|
|
52
|
+
wrangler: config.wrangler,
|
|
91
53
|
});
|
|
92
54
|
}
|
|
93
55
|
catch (err) {
|
|
94
56
|
console.error('Failed to start wrangler:', err);
|
|
95
57
|
process.exit(1);
|
|
96
58
|
}
|
|
59
|
+
wranglerPid = wrangler.pid;
|
|
97
60
|
console.log(`Agent running on port ${effectivePort}`);
|
|
98
61
|
// Cleanup on exit
|
|
99
62
|
const cleanup = () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type ChildProcess } from 'node:child_process';
|
|
2
|
+
/**
|
|
3
|
+
* Resolve the wrangler config file path.
|
|
4
|
+
*
|
|
5
|
+
* 1. Explicit path from config.wrangler (resolved relative to cwd)
|
|
6
|
+
* 2. wrangler.jsonc or wrangler.json in cwd
|
|
7
|
+
* 3. Throws with setup instructions
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveWranglerConfig(cwd: string, configPath?: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Spawn `npx wrangler dev` and wait for "Ready on" output.
|
|
12
|
+
* Returns the child process.
|
|
13
|
+
*/
|
|
14
|
+
export declare function startWrangler(opts: {
|
|
15
|
+
port: number;
|
|
16
|
+
cwd?: string;
|
|
17
|
+
wrangler?: string;
|
|
18
|
+
}): Promise<ChildProcess>;
|
|
19
|
+
//# sourceMappingURL=wrangler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrangler.d.ts","sourceRoot":"","sources":["../../src/cli/wrangler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAI7D;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAuC9E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;CACjB,GAAG,OAAO,CAAC,YAAY,CAAC,CA4CxB"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { resolve } from 'node:path';
|
|
4
|
+
/**
|
|
5
|
+
* Resolve the wrangler config file path.
|
|
6
|
+
*
|
|
7
|
+
* 1. Explicit path from config.wrangler (resolved relative to cwd)
|
|
8
|
+
* 2. wrangler.jsonc or wrangler.json in cwd
|
|
9
|
+
* 3. Throws with setup instructions
|
|
10
|
+
*/
|
|
11
|
+
export function resolveWranglerConfig(cwd, configPath) {
|
|
12
|
+
if (configPath) {
|
|
13
|
+
const resolved = resolve(cwd, configPath);
|
|
14
|
+
if (!existsSync(resolved)) {
|
|
15
|
+
throw new Error(`Wrangler config not found at ${resolved}`);
|
|
16
|
+
}
|
|
17
|
+
return resolved;
|
|
18
|
+
}
|
|
19
|
+
const jsonc = resolve(cwd, 'wrangler.jsonc');
|
|
20
|
+
if (existsSync(jsonc))
|
|
21
|
+
return jsonc;
|
|
22
|
+
const json = resolve(cwd, 'wrangler.json');
|
|
23
|
+
if (existsSync(json))
|
|
24
|
+
return json;
|
|
25
|
+
throw new Error([
|
|
26
|
+
'No wrangler config found.',
|
|
27
|
+
'',
|
|
28
|
+
'Fisgon needs a wrangler.jsonc (or wrangler.json) in your project root',
|
|
29
|
+
'with a Durable Object binding for the Fisgon agent.',
|
|
30
|
+
'',
|
|
31
|
+
'Create one with at minimum:',
|
|
32
|
+
'',
|
|
33
|
+
' {',
|
|
34
|
+
' "name": "fisgon-agent",',
|
|
35
|
+
' "main": "node_modules/@upbeat-works/fisgon/dist/agent/worker.js",',
|
|
36
|
+
' "compatibility_date": "2025-01-01",',
|
|
37
|
+
' "durable_objects": {',
|
|
38
|
+
' "bindings": [{ "name": "AGENT", "class_name": "Agent" }]',
|
|
39
|
+
' },',
|
|
40
|
+
' "migrations": [',
|
|
41
|
+
' { "tag": "v1", "new_sqlite_classes": ["Agent"] }',
|
|
42
|
+
' ]',
|
|
43
|
+
' }',
|
|
44
|
+
'',
|
|
45
|
+
'Place your API keys in a .dev.vars file next to the wrangler config.',
|
|
46
|
+
].join('\n'));
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Spawn `npx wrangler dev` and wait for "Ready on" output.
|
|
50
|
+
* Returns the child process.
|
|
51
|
+
*/
|
|
52
|
+
export function startWrangler(opts) {
|
|
53
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
54
|
+
const configPath = resolveWranglerConfig(cwd, opts.wrangler);
|
|
55
|
+
return new Promise((resolve_, reject) => {
|
|
56
|
+
const wranglerArgs = [
|
|
57
|
+
'wrangler',
|
|
58
|
+
'dev',
|
|
59
|
+
'--config',
|
|
60
|
+
configPath,
|
|
61
|
+
'--port',
|
|
62
|
+
String(opts.port),
|
|
63
|
+
];
|
|
64
|
+
const wrangler = spawn('npx', wranglerArgs, {
|
|
65
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
66
|
+
env: { ...process.env },
|
|
67
|
+
});
|
|
68
|
+
const timeout = setTimeout(() => reject(new Error('Wrangler startup timed out')), 30000);
|
|
69
|
+
const onReady = (data) => {
|
|
70
|
+
if (data.toString().includes('Ready on')) {
|
|
71
|
+
clearTimeout(timeout);
|
|
72
|
+
resolve_(wrangler);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
wrangler.stderr?.on('data', onReady);
|
|
76
|
+
wrangler.stdout?.on('data', onReady);
|
|
77
|
+
wrangler.on('error', (err) => {
|
|
78
|
+
clearTimeout(timeout);
|
|
79
|
+
reject(err);
|
|
80
|
+
});
|
|
81
|
+
wrangler.on('exit', (code) => {
|
|
82
|
+
clearTimeout(timeout);
|
|
83
|
+
if (code !== 0)
|
|
84
|
+
reject(new Error(`Wrangler exited with code ${code}`));
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=wrangler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrangler.js","sourceRoot":"","sources":["../../src/cli/wrangler.ts"],"names":[],"mappings":"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"}
|
package/dist/core/types.d.ts
CHANGED
package/dist/core/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,OAAO,CAAA;CACd,CAAA;AAKD,MAAM,MAAM,IAAI,GAAG;IACjB,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,UAAU,EAAE,CAAA;CACrB,CAAA;AAID,MAAM,MAAM,MAAM,GAAG;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAID,MAAM,MAAM,eAAe,GACvB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAIzD,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,OAAO,CAAA;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,GAAG,IAAI,CAAA;IAChD,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;CACjD,CAAA;AAED,MAAM,MAAM,KAAK,GAAG;IAClB,MAAM,EAAE,OAAO,CAAA;IACf,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG;QAAE,OAAO,EAAE;YAAE,MAAM,CAAC,EAAE,MAAM,CAAC;YAAC,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;SAAE,CAAA;KAAE,GAAG,WAAW,CAAA;IAChH,UAAU,IAAI,IAAI,CAAA;CACnB,CAAA;AAID,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,CAAC,EAAE,gBAAgB,CAAA;IACxB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAEhF,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,CAAA;AAE5C,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,OAAO,CAAA;CACd,CAAA;AAKD,MAAM,MAAM,IAAI,GAAG;IACjB,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,UAAU,EAAE,CAAA;CACrB,CAAA;AAID,MAAM,MAAM,MAAM,GAAG;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAID,MAAM,MAAM,eAAe,GACvB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAIzD,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,OAAO,CAAA;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,GAAG,IAAI,CAAA;IAChD,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;CACjD,CAAA;AAED,MAAM,MAAM,KAAK,GAAG;IAClB,MAAM,EAAE,OAAO,CAAA;IACf,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG;QAAE,OAAO,EAAE;YAAE,MAAM,CAAC,EAAE,MAAM,CAAC;YAAC,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;SAAE,CAAA;KAAE,GAAG,WAAW,CAAA;IAChH,UAAU,IAAI,IAAI,CAAA;CACnB,CAAA;AAID,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,CAAC,EAAE,gBAAgB,CAAA;IACxB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAEhF,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,CAAA;AAE5C,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@upbeat-works/fisgon",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Low-level primitives for LLM-driven application testing",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
7
7
|
".": "./dist/index.js",
|
|
8
8
|
"./server": "./dist/server.js",
|
|
9
|
-
"./
|
|
10
|
-
"./adapters/prisma": "./dist/adapters/prisma.js"
|
|
9
|
+
"./agent": "./dist/agent/worker.js"
|
|
11
10
|
},
|
|
12
11
|
"bin": {
|
|
13
12
|
"fisgon": "dist/cli/index.js"
|
|
@@ -46,14 +45,10 @@
|
|
|
46
45
|
"wrangler": "^4.4.0"
|
|
47
46
|
},
|
|
48
47
|
"peerDependencies": {
|
|
49
|
-
"
|
|
50
|
-
"drizzle-orm": ">=0.30.0"
|
|
48
|
+
"wrangler": ">=4.0.0"
|
|
51
49
|
},
|
|
52
50
|
"peerDependenciesMeta": {
|
|
53
|
-
"
|
|
54
|
-
"optional": true
|
|
55
|
-
},
|
|
56
|
-
"@prisma/client": {
|
|
51
|
+
"wrangler": {
|
|
57
52
|
"optional": true
|
|
58
53
|
}
|
|
59
54
|
},
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { type ScopedProbe } from '../core/types.js';
|
|
2
|
-
type DrizzleDb = {
|
|
3
|
-
insert(table: unknown): {
|
|
4
|
-
values(...args: unknown[]): unknown;
|
|
5
|
-
};
|
|
6
|
-
update(table: unknown): {
|
|
7
|
-
set(...args: unknown[]): unknown;
|
|
8
|
-
};
|
|
9
|
-
delete(table: unknown): {
|
|
10
|
-
where(...args: unknown[]): unknown;
|
|
11
|
-
};
|
|
12
|
-
select(...args: unknown[]): unknown;
|
|
13
|
-
[key: string]: unknown;
|
|
14
|
-
};
|
|
15
|
-
export declare function drizzleAdapter<T extends DrizzleDb>(db: T, scoped: ScopedProbe): T;
|
|
16
|
-
export {};
|
|
17
|
-
//# sourceMappingURL=drizzle.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"drizzle.d.ts","sourceRoot":"","sources":["../../src/adapters/drizzle.ts"],"names":[],"mappings":"AAAA,OAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAEpD,KAAK,SAAS,GAAG;IACf,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG;QAAE,MAAM,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;KAAE,CAAA;IAC/D,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG;QAAE,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;KAAE,CAAA;IAC5D,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG;QAAE,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;KAAE,CAAA;IAC9D,MAAM,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;IACnC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,CAAA;AAkBD,wBAAgB,cAAc,CAAC,CAAC,SAAS,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,CAAC,CAyCjF"}
|
package/dist/adapters/drizzle.js
DELETED
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
// Extracts a table name from a Drizzle table object.
|
|
2
|
-
// Drizzle tables have a Symbol-keyed property or a `_.name` property.
|
|
3
|
-
function getTableName(table) {
|
|
4
|
-
if (table && typeof table === 'object') {
|
|
5
|
-
const t = table;
|
|
6
|
-
// Drizzle v0.30+ uses _.name
|
|
7
|
-
if (t._ && typeof t._ === 'object' && 'name' in t._) {
|
|
8
|
-
return String(t._.name);
|
|
9
|
-
}
|
|
10
|
-
// Fallback: try Symbol.for('drizzle:Name')
|
|
11
|
-
const sym = Symbol.for('drizzle:Name');
|
|
12
|
-
if (sym in t)
|
|
13
|
-
return String(t[sym]);
|
|
14
|
-
}
|
|
15
|
-
return 'unknown';
|
|
16
|
-
}
|
|
17
|
-
export function drizzleAdapter(db, scoped) {
|
|
18
|
-
if (!scoped.active)
|
|
19
|
-
return db;
|
|
20
|
-
return new Proxy(db, {
|
|
21
|
-
get(target, prop, receiver) {
|
|
22
|
-
const value = Reflect.get(target, prop, receiver);
|
|
23
|
-
if (prop === 'insert' && typeof value === 'function') {
|
|
24
|
-
return (table) => {
|
|
25
|
-
const tableName = getTableName(table);
|
|
26
|
-
const result = value.call(target, table);
|
|
27
|
-
return wrapChain(result, 'insert', tableName, scoped);
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
if (prop === 'update' && typeof value === 'function') {
|
|
31
|
-
return (table) => {
|
|
32
|
-
const tableName = getTableName(table);
|
|
33
|
-
const result = value.call(target, table);
|
|
34
|
-
return wrapChain(result, 'update', tableName, scoped);
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
if (prop === 'delete' && typeof value === 'function') {
|
|
38
|
-
return (table) => {
|
|
39
|
-
const tableName = getTableName(table);
|
|
40
|
-
const result = value.call(target, table);
|
|
41
|
-
return wrapChain(result, 'delete', tableName, scoped);
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
if (prop === 'select' && typeof value === 'function') {
|
|
45
|
-
return (...args) => {
|
|
46
|
-
const result = value.apply(target, args);
|
|
47
|
-
return wrapChain(result, 'select', 'query', scoped);
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
return value;
|
|
51
|
-
},
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
function wrapChain(obj, operation, tableName, scoped) {
|
|
55
|
-
if (!obj || typeof obj !== 'object')
|
|
56
|
-
return obj;
|
|
57
|
-
return new Proxy(obj, {
|
|
58
|
-
get(target, prop, receiver) {
|
|
59
|
-
const value = Reflect.get(target, prop, receiver);
|
|
60
|
-
if (typeof value === 'function') {
|
|
61
|
-
return (...args) => {
|
|
62
|
-
const result = value.apply(target, args);
|
|
63
|
-
// If the result is a thenable (query execution), emit the event
|
|
64
|
-
if (result && typeof result === 'object' && 'then' in result) {
|
|
65
|
-
scoped.emit({
|
|
66
|
-
source: 'sql',
|
|
67
|
-
type: operation,
|
|
68
|
-
timestamp: Date.now(),
|
|
69
|
-
data: { table: tableName },
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
// Continue wrapping for chaining
|
|
73
|
-
if (result && typeof result === 'object') {
|
|
74
|
-
return wrapChain(result, operation, tableName, scoped);
|
|
75
|
-
}
|
|
76
|
-
return result;
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
return value;
|
|
80
|
-
},
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
//# sourceMappingURL=drizzle.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"drizzle.js","sourceRoot":"","sources":["../../src/adapters/drizzle.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { type ScopedProbe } from '../core/types.js';
|
|
2
|
-
type PrismaClient = {
|
|
3
|
-
$use?(middleware: (params: PrismaMiddlewareParams, next: (params: PrismaMiddlewareParams) => Promise<unknown>) => Promise<unknown>): void;
|
|
4
|
-
$extends?(extension: unknown): unknown;
|
|
5
|
-
[key: string]: unknown;
|
|
6
|
-
};
|
|
7
|
-
type PrismaMiddlewareParams = {
|
|
8
|
-
model?: string;
|
|
9
|
-
action: string;
|
|
10
|
-
args: unknown;
|
|
11
|
-
dataPath: string[];
|
|
12
|
-
runInTransaction: boolean;
|
|
13
|
-
};
|
|
14
|
-
export declare function prismaAdapter<T extends PrismaClient>(client: T, scoped: ScopedProbe): T;
|
|
15
|
-
export {};
|
|
16
|
-
//# sourceMappingURL=prisma.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prisma.d.ts","sourceRoot":"","sources":["../../src/adapters/prisma.ts"],"names":[],"mappings":"AAAA,OAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAEpD,KAAK,YAAY,GAAG;IAClB,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,sBAAsB,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,sBAAsB,KAAK,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;IACzI,QAAQ,CAAC,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAA;IACtC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,CAAA;AAED,KAAK,sBAAsB,GAAG;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,OAAO,CAAA;IACb,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,gBAAgB,EAAE,OAAO,CAAA;CAC1B,CAAA;AAED,wBAAgB,aAAa,CAAC,CAAC,SAAS,YAAY,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,CAAC,CAqDvF"}
|
package/dist/adapters/prisma.js
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
export function prismaAdapter(client, scoped) {
|
|
2
|
-
if (!scoped.active)
|
|
3
|
-
return client;
|
|
4
|
-
// Use Prisma middleware ($use) if available
|
|
5
|
-
if (typeof client.$use === 'function') {
|
|
6
|
-
client.$use(async (params, next) => {
|
|
7
|
-
const timestamp = Date.now();
|
|
8
|
-
scoped.emit({
|
|
9
|
-
source: 'sql',
|
|
10
|
-
type: mapPrismaAction(params.action),
|
|
11
|
-
timestamp,
|
|
12
|
-
data: {
|
|
13
|
-
table: params.model ?? 'unknown',
|
|
14
|
-
action: params.action,
|
|
15
|
-
},
|
|
16
|
-
});
|
|
17
|
-
return next(params);
|
|
18
|
-
});
|
|
19
|
-
return client;
|
|
20
|
-
}
|
|
21
|
-
// Fallback: use $extends (Prisma 5+)
|
|
22
|
-
if (typeof client.$extends === 'function') {
|
|
23
|
-
return client.$extends({
|
|
24
|
-
query: {
|
|
25
|
-
$allModels: {
|
|
26
|
-
async $allOperations({ model, operation, args, query }) {
|
|
27
|
-
scoped.emit({
|
|
28
|
-
source: 'sql',
|
|
29
|
-
type: mapPrismaAction(operation),
|
|
30
|
-
timestamp: Date.now(),
|
|
31
|
-
data: {
|
|
32
|
-
table: model,
|
|
33
|
-
action: operation,
|
|
34
|
-
},
|
|
35
|
-
});
|
|
36
|
-
return query(args);
|
|
37
|
-
},
|
|
38
|
-
},
|
|
39
|
-
},
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
return client;
|
|
43
|
-
}
|
|
44
|
-
function mapPrismaAction(action) {
|
|
45
|
-
switch (action) {
|
|
46
|
-
case 'create':
|
|
47
|
-
case 'createMany':
|
|
48
|
-
return 'insert';
|
|
49
|
-
case 'update':
|
|
50
|
-
case 'updateMany':
|
|
51
|
-
case 'upsert':
|
|
52
|
-
return 'update';
|
|
53
|
-
case 'delete':
|
|
54
|
-
case 'deleteMany':
|
|
55
|
-
return 'delete';
|
|
56
|
-
case 'findFirst':
|
|
57
|
-
case 'findMany':
|
|
58
|
-
case 'findUnique':
|
|
59
|
-
case 'findFirstOrThrow':
|
|
60
|
-
case 'findUniqueOrThrow':
|
|
61
|
-
case 'count':
|
|
62
|
-
case 'aggregate':
|
|
63
|
-
case 'groupBy':
|
|
64
|
-
return 'select';
|
|
65
|
-
default:
|
|
66
|
-
return action;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
//# sourceMappingURL=prisma.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prisma.js","sourceRoot":"","sources":["../../src/adapters/prisma.ts"],"names":[],"mappings":"AAgBA,MAAM,UAAU,aAAa,CAAyB,MAAS,EAAE,MAAmB;IAClF,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,MAAM,CAAA;IAEjC,4CAA4C;IAC5C,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YACjC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YAE5B,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC;gBACpC,SAAS;gBACT,IAAI,EAAE;oBACJ,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,SAAS;oBAChC,MAAM,EAAE,MAAM,CAAC,MAAM;iBACtB;aACF,CAAC,CAAA;YAEF,OAAO,IAAI,CAAC,MAAM,CAAC,CAAA;QACrB,CAAC,CAAC,CAAA;QAEF,OAAO,MAAM,CAAA;IACf,CAAC;IAED,qCAAqC;IACrC,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC1C,OAAO,MAAM,CAAC,QAAQ,CAAC;YACrB,KAAK,EAAE;gBACL,UAAU,EAAE;oBACV,KAAK,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAKnD;wBACC,MAAM,CAAC,IAAI,CAAC;4BACV,MAAM,EAAE,KAAK;4BACb,IAAI,EAAE,eAAe,CAAC,SAAS,CAAC;4BAChC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;4BACrB,IAAI,EAAE;gCACJ,KAAK,EAAE,KAAK;gCACZ,MAAM,EAAE,SAAS;6BAClB;yBACF,CAAC,CAAA;wBAEF,OAAO,KAAK,CAAC,IAAI,CAAC,CAAA;oBACpB,CAAC;iBACF;aACF;SACF,CAAM,CAAA;IACT,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,eAAe,CAAC,MAAc;IACrC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ,CAAC;QACd,KAAK,YAAY;YACf,OAAO,QAAQ,CAAA;QACjB,KAAK,QAAQ,CAAC;QACd,KAAK,YAAY,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAA;QACjB,KAAK,QAAQ,CAAC;QACd,KAAK,YAAY;YACf,OAAO,QAAQ,CAAA;QACjB,KAAK,WAAW,CAAC;QACjB,KAAK,UAAU,CAAC;QAChB,KAAK,YAAY,CAAC;QAClB,KAAK,kBAAkB,CAAC;QACxB,KAAK,mBAAmB,CAAC;QACzB,KAAK,OAAO,CAAC;QACb,KAAK,WAAW,CAAC;QACjB,KAAK,SAAS;YACZ,OAAO,QAAQ,CAAA;QACjB;YACE,OAAO,MAAM,CAAA;IACjB,CAAC;AACH,CAAC"}
|