ai-evaluate 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +5 -0
- package/.turbo/turbo-test.log +51 -0
- package/README.md +420 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/coverage-final.json +4 -0
- package/coverage/evaluate.ts.html +574 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +146 -0
- package/coverage/index.ts.html +145 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/coverage/worker-template.ts.html +1948 -0
- package/dist/evaluate.d.ts +62 -0
- package/dist/evaluate.d.ts.map +1 -0
- package/dist/evaluate.js +188 -0
- package/dist/evaluate.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +165 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/worker-template.d.ts +40 -0
- package/dist/worker-template.d.ts.map +1 -0
- package/dist/worker-template.js +3628 -0
- package/dist/worker-template.js.map +1 -0
- package/package.json +46 -0
- package/src/evaluate.ts +217 -0
- package/src/index.ts +21 -0
- package/src/types.ts +174 -0
- package/src/worker-template.ts +3677 -0
- package/test/evaluate-extended.test.ts +469 -0
- package/test/evaluate.test.ts +253 -0
- package/test/index.test.ts +95 -0
- package/test/worker-template.test.ts +430 -0
- package/tsconfig.json +22 -0
- package/vitest.config.ts +16 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-template.js","sourceRoot":"","sources":["../src/worker-template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,SAAoB,EAAE;IAC7C,oDAAoD;IACpD,IAAI,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAA;IACtC,CAAC;IACD,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAA;AACrC,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,oBAAoB,CAAC,SAAoB,EAAE;IAClD,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,IAAI,SAAS,CAAA;IACjC,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,EAAE,CAAA;IAC9C,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,EAAE,CAAA;IAElD,OAAO;;;;;;SAMA,EAAE;mBACQ,YAAY;qBACV,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ai-evaluate",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Secure code execution in sandboxed environments",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc -p tsconfig.json",
|
|
16
|
+
"dev": "tsc -p tsconfig.json --watch",
|
|
17
|
+
"test": "vitest",
|
|
18
|
+
"typecheck": "tsc --noEmit",
|
|
19
|
+
"lint": "eslint .",
|
|
20
|
+
"clean": "rm -rf dist"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"ai-functions": "workspace:*",
|
|
24
|
+
"ai-tests": "workspace:*",
|
|
25
|
+
"capnweb": "^0.2.0",
|
|
26
|
+
"rpc.do": "^0.1.0"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@vitest/coverage-v8": "^2.1.0",
|
|
30
|
+
"vitest": "^2.1.0"
|
|
31
|
+
},
|
|
32
|
+
"optionalDependencies": {
|
|
33
|
+
"esbuild": "^0.24.0",
|
|
34
|
+
"miniflare": "^3.20241106.0"
|
|
35
|
+
},
|
|
36
|
+
"keywords": [
|
|
37
|
+
"ai",
|
|
38
|
+
"sandbox",
|
|
39
|
+
"evaluate",
|
|
40
|
+
"cloudflare",
|
|
41
|
+
"workers",
|
|
42
|
+
"miniflare",
|
|
43
|
+
"primitives"
|
|
44
|
+
],
|
|
45
|
+
"license": "MIT"
|
|
46
|
+
}
|
package/src/evaluate.ts
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evaluate code in a sandboxed environment
|
|
3
|
+
*
|
|
4
|
+
* Uses Cloudflare worker_loaders in production,
|
|
5
|
+
* Miniflare in development/Node.
|
|
6
|
+
*
|
|
7
|
+
* Requires ai-tests service binding (TEST) for assertions and test running.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type {
|
|
11
|
+
EvaluateOptions,
|
|
12
|
+
EvaluateResult,
|
|
13
|
+
WorkerLoader,
|
|
14
|
+
SandboxEnv
|
|
15
|
+
} from './types.js'
|
|
16
|
+
import { generateWorkerCode, generateDevWorkerCode } from './worker-template.js'
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Check if code contains JSX syntax that needs transformation
|
|
20
|
+
*/
|
|
21
|
+
function containsJSX(code: string): boolean {
|
|
22
|
+
if (!code) return false
|
|
23
|
+
// Look for JSX patterns
|
|
24
|
+
const jsxPattern = /<[A-Z][a-zA-Z0-9]*[\s/>]|<[a-z][a-z0-9-]*[\s/>]|<>|<\/>/
|
|
25
|
+
const jsxReturnPattern = /return\s*\(\s*<|return\s+<[A-Za-z]/
|
|
26
|
+
return jsxPattern.test(code) || jsxReturnPattern.test(code)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Transform JSX in code using esbuild
|
|
31
|
+
*/
|
|
32
|
+
async function transformJSX(code: string): Promise<string> {
|
|
33
|
+
if (!code || !containsJSX(code)) return code
|
|
34
|
+
|
|
35
|
+
try {
|
|
36
|
+
const { transform } = await import('esbuild')
|
|
37
|
+
const result = await transform(code, {
|
|
38
|
+
loader: 'tsx',
|
|
39
|
+
jsxFactory: 'h',
|
|
40
|
+
jsxFragment: 'Fragment',
|
|
41
|
+
target: 'esnext',
|
|
42
|
+
format: 'esm',
|
|
43
|
+
})
|
|
44
|
+
return result.code
|
|
45
|
+
} catch (error) {
|
|
46
|
+
// If transform fails, return original code and let sandbox handle the error
|
|
47
|
+
console.error('JSX transform failed:', error)
|
|
48
|
+
return code
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Evaluate code in a sandboxed worker
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```ts
|
|
57
|
+
* import { evaluate } from 'ai-sandbox'
|
|
58
|
+
*
|
|
59
|
+
* // Run a simple script
|
|
60
|
+
* const result = await evaluate({
|
|
61
|
+
* script: 'return 1 + 1'
|
|
62
|
+
* })
|
|
63
|
+
* // { success: true, value: 2, logs: [], duration: ... }
|
|
64
|
+
*
|
|
65
|
+
* // With a module and tests
|
|
66
|
+
* const result = await evaluate({
|
|
67
|
+
* module: `
|
|
68
|
+
* exports.add = (a, b) => a + b;
|
|
69
|
+
* exports.multiply = (a, b) => a * b;
|
|
70
|
+
* `,
|
|
71
|
+
* tests: `
|
|
72
|
+
* describe('math', () => {
|
|
73
|
+
* it('adds numbers', () => {
|
|
74
|
+
* expect(add(2, 3)).toBe(5);
|
|
75
|
+
* });
|
|
76
|
+
* it('multiplies numbers', () => {
|
|
77
|
+
* expect(multiply(2, 3)).toBe(6);
|
|
78
|
+
* });
|
|
79
|
+
* });
|
|
80
|
+
* `,
|
|
81
|
+
* script: 'return add(10, 20)'
|
|
82
|
+
* })
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
export async function evaluate(
|
|
86
|
+
options: EvaluateOptions,
|
|
87
|
+
env?: SandboxEnv
|
|
88
|
+
): Promise<EvaluateResult> {
|
|
89
|
+
const start = Date.now()
|
|
90
|
+
|
|
91
|
+
try {
|
|
92
|
+
// Transform JSX in module, tests, and script before evaluation
|
|
93
|
+
const transformedOptions: EvaluateOptions = {
|
|
94
|
+
...options,
|
|
95
|
+
module: options.module ? await transformJSX(options.module) : options.module,
|
|
96
|
+
tests: options.tests ? await transformJSX(options.tests) : options.tests,
|
|
97
|
+
script: options.script ? await transformJSX(options.script) : options.script,
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Use worker_loaders if available (Cloudflare Workers)
|
|
101
|
+
if (env?.LOADER && env?.TEST) {
|
|
102
|
+
return await evaluateWithWorkerLoader(transformedOptions, env.LOADER, env.TEST, start)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Fall back to Miniflare with local TestService (Node.js)
|
|
106
|
+
return await evaluateWithMiniflare(transformedOptions, start)
|
|
107
|
+
} catch (error) {
|
|
108
|
+
return {
|
|
109
|
+
success: false,
|
|
110
|
+
logs: [],
|
|
111
|
+
error: error instanceof Error ? error.message : String(error),
|
|
112
|
+
duration: Date.now() - start
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Evaluate using Cloudflare worker_loaders binding
|
|
119
|
+
*/
|
|
120
|
+
async function evaluateWithWorkerLoader(
|
|
121
|
+
options: EvaluateOptions,
|
|
122
|
+
loader: WorkerLoader,
|
|
123
|
+
testService: unknown,
|
|
124
|
+
start: number
|
|
125
|
+
): Promise<EvaluateResult> {
|
|
126
|
+
const workerCode = generateWorkerCode({
|
|
127
|
+
module: options.module,
|
|
128
|
+
tests: options.tests,
|
|
129
|
+
script: options.script,
|
|
130
|
+
sdk: options.sdk,
|
|
131
|
+
imports: options.imports
|
|
132
|
+
})
|
|
133
|
+
const id = `sandbox-${Date.now()}-${Math.random().toString(36).slice(2)}`
|
|
134
|
+
|
|
135
|
+
const worker = loader.get(id, async () => ({
|
|
136
|
+
mainModule: 'worker.js',
|
|
137
|
+
modules: {
|
|
138
|
+
'worker.js': workerCode
|
|
139
|
+
},
|
|
140
|
+
compatibilityDate: '2024-01-01',
|
|
141
|
+
// Block network access only if fetch: null
|
|
142
|
+
globalOutbound: options.fetch === null ? null : undefined,
|
|
143
|
+
bindings: {
|
|
144
|
+
TEST: testService
|
|
145
|
+
}
|
|
146
|
+
}))
|
|
147
|
+
|
|
148
|
+
const response = await worker.fetch(new Request('http://sandbox/execute'))
|
|
149
|
+
const result = await response.json() as EvaluateResult
|
|
150
|
+
|
|
151
|
+
return {
|
|
152
|
+
...result,
|
|
153
|
+
duration: Date.now() - start
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Evaluate using Miniflare (for Node.js/development)
|
|
159
|
+
*
|
|
160
|
+
* For local dev, we use generateDevWorkerCode which bundles the test
|
|
161
|
+
* framework directly. In production, the sandbox worker uses RPC to
|
|
162
|
+
* a deployed ai-tests worker.
|
|
163
|
+
*/
|
|
164
|
+
async function evaluateWithMiniflare(
|
|
165
|
+
options: EvaluateOptions,
|
|
166
|
+
start: number
|
|
167
|
+
): Promise<EvaluateResult> {
|
|
168
|
+
// Dynamic import to avoid bundling in production
|
|
169
|
+
const { Miniflare } = await import('miniflare')
|
|
170
|
+
|
|
171
|
+
const workerCode = generateDevWorkerCode({
|
|
172
|
+
module: options.module,
|
|
173
|
+
tests: options.tests,
|
|
174
|
+
script: options.script,
|
|
175
|
+
sdk: options.sdk,
|
|
176
|
+
imports: options.imports
|
|
177
|
+
})
|
|
178
|
+
|
|
179
|
+
const mf = new Miniflare({
|
|
180
|
+
modules: true,
|
|
181
|
+
script: workerCode,
|
|
182
|
+
compatibilityDate: '2024-01-01'
|
|
183
|
+
})
|
|
184
|
+
|
|
185
|
+
try {
|
|
186
|
+
const response = await mf.dispatchFetch('http://sandbox/execute')
|
|
187
|
+
const result = await response.json() as EvaluateResult
|
|
188
|
+
|
|
189
|
+
return {
|
|
190
|
+
...result,
|
|
191
|
+
duration: Date.now() - start
|
|
192
|
+
}
|
|
193
|
+
} finally {
|
|
194
|
+
await mf.dispose()
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Create an evaluate function bound to a specific environment
|
|
200
|
+
*
|
|
201
|
+
* Useful for Cloudflare Workers where env is passed to fetch handler.
|
|
202
|
+
*
|
|
203
|
+
* @example
|
|
204
|
+
* ```ts
|
|
205
|
+
* // In a Cloudflare Worker
|
|
206
|
+
* export default {
|
|
207
|
+
* async fetch(request, env) {
|
|
208
|
+
* const sandbox = createEvaluator(env)
|
|
209
|
+
* const result = await sandbox({ script: '1 + 1' })
|
|
210
|
+
* return Response.json(result)
|
|
211
|
+
* }
|
|
212
|
+
* }
|
|
213
|
+
* ```
|
|
214
|
+
*/
|
|
215
|
+
export function createEvaluator(env: SandboxEnv) {
|
|
216
|
+
return (options: EvaluateOptions) => evaluate(options, env)
|
|
217
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ai-sandbox - Secure code execution in sandboxed environments
|
|
3
|
+
*
|
|
4
|
+
* Provides evaluate() for running untrusted code safely using:
|
|
5
|
+
* - Cloudflare worker_loaders in production
|
|
6
|
+
* - Miniflare in development/Node.js
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
export { evaluate, createEvaluator } from './evaluate.js'
|
|
12
|
+
|
|
13
|
+
export type {
|
|
14
|
+
EvaluateOptions,
|
|
15
|
+
EvaluateResult,
|
|
16
|
+
LogEntry,
|
|
17
|
+
TestResults,
|
|
18
|
+
TestResult,
|
|
19
|
+
SandboxEnv,
|
|
20
|
+
SDKConfig
|
|
21
|
+
} from './types.js'
|
package/src/types.ts
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for ai-sandbox
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* SDK configuration for the sandbox environment
|
|
7
|
+
*/
|
|
8
|
+
export interface SDKConfig {
|
|
9
|
+
/** Execution context: local (in-memory) or remote (RPC) */
|
|
10
|
+
context?: 'local' | 'remote'
|
|
11
|
+
/** RPC endpoint URL for all services (default: https://rpc.do) */
|
|
12
|
+
rpcUrl?: string
|
|
13
|
+
/** Database RPC URL (default: https://db.do/rpc) */
|
|
14
|
+
dbUrl?: string
|
|
15
|
+
/** AI RPC URL (default: https://ai.do/rpc) */
|
|
16
|
+
aiUrl?: string
|
|
17
|
+
/** Authentication token */
|
|
18
|
+
token?: string
|
|
19
|
+
/** Default namespace for database operations */
|
|
20
|
+
ns?: string
|
|
21
|
+
/** Cloudflare AI Gateway URL (e.g., https://gateway.ai.cloudflare.com/v1/{account}/{gateway}) */
|
|
22
|
+
aiGatewayUrl?: string
|
|
23
|
+
/** Cloudflare AI Gateway authentication token */
|
|
24
|
+
aiGatewayToken?: string
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Options for evaluate()
|
|
29
|
+
*/
|
|
30
|
+
export interface EvaluateOptions {
|
|
31
|
+
/** Module code with exports */
|
|
32
|
+
module?: string
|
|
33
|
+
/** Test code using vitest (describe, expect, it in global scope) */
|
|
34
|
+
tests?: string
|
|
35
|
+
/** Script code to run immediately (module exports in scope) */
|
|
36
|
+
script?: string
|
|
37
|
+
/** Timeout in milliseconds (default: 5000) */
|
|
38
|
+
timeout?: number
|
|
39
|
+
/** Environment variables to pass to the sandbox */
|
|
40
|
+
env?: Record<string, string>
|
|
41
|
+
/** Fetch configuration. Set to null to block network access. Default: allowed */
|
|
42
|
+
fetch?: null
|
|
43
|
+
/** RPC services to expose via capnweb (URL -> handler) */
|
|
44
|
+
rpc?: Record<string, unknown>
|
|
45
|
+
/** Outbound RPC interceptor - intercepts fetch calls to RPC URLs */
|
|
46
|
+
outboundRpc?: (url: string, request: Request) => Promise<Response> | Response | null
|
|
47
|
+
/** SDK configuration - enables $, db, ai, api, on, send globals */
|
|
48
|
+
sdk?: SDKConfig | boolean
|
|
49
|
+
/** Top-level imports to hoist (for MDX test files with external imports) */
|
|
50
|
+
imports?: string[]
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Result from evaluate()
|
|
55
|
+
*/
|
|
56
|
+
export interface EvaluateResult {
|
|
57
|
+
/** Whether execution succeeded */
|
|
58
|
+
success: boolean
|
|
59
|
+
/** Return value from script (if any) */
|
|
60
|
+
value?: unknown
|
|
61
|
+
/** Console output */
|
|
62
|
+
logs: LogEntry[]
|
|
63
|
+
/** Test results (if tests were provided) */
|
|
64
|
+
testResults?: TestResults
|
|
65
|
+
/** Error message if execution failed */
|
|
66
|
+
error?: string
|
|
67
|
+
/** Execution time in milliseconds */
|
|
68
|
+
duration: number
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* A log entry from console.log/warn/error
|
|
73
|
+
*/
|
|
74
|
+
export interface LogEntry {
|
|
75
|
+
level: 'log' | 'warn' | 'error' | 'info' | 'debug'
|
|
76
|
+
message: string
|
|
77
|
+
timestamp: number
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Test results from vitest-style tests
|
|
82
|
+
*/
|
|
83
|
+
export interface TestResults {
|
|
84
|
+
/** Total number of tests */
|
|
85
|
+
total: number
|
|
86
|
+
/** Number of passed tests */
|
|
87
|
+
passed: number
|
|
88
|
+
/** Number of failed tests */
|
|
89
|
+
failed: number
|
|
90
|
+
/** Number of skipped tests */
|
|
91
|
+
skipped: number
|
|
92
|
+
/** Individual test results */
|
|
93
|
+
tests: TestResult[]
|
|
94
|
+
/** Total duration in milliseconds */
|
|
95
|
+
duration: number
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Individual test result
|
|
100
|
+
*/
|
|
101
|
+
export interface TestResult {
|
|
102
|
+
/** Test name (describe > it) */
|
|
103
|
+
name: string
|
|
104
|
+
/** Whether the test passed */
|
|
105
|
+
passed: boolean
|
|
106
|
+
/** Error message if failed */
|
|
107
|
+
error?: string
|
|
108
|
+
/** Test duration in milliseconds */
|
|
109
|
+
duration: number
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Worker loader binding type (Cloudflare)
|
|
114
|
+
*/
|
|
115
|
+
export interface WorkerLoader {
|
|
116
|
+
get(
|
|
117
|
+
id: string,
|
|
118
|
+
loader: () => Promise<WorkerCode>
|
|
119
|
+
): WorkerStub
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Worker code configuration
|
|
124
|
+
*/
|
|
125
|
+
export interface WorkerCode {
|
|
126
|
+
mainModule: string
|
|
127
|
+
modules: Record<string, string | { js?: string; cjs?: string; text?: string; json?: unknown }>
|
|
128
|
+
compatibilityDate?: string
|
|
129
|
+
env?: Record<string, unknown>
|
|
130
|
+
globalOutbound?: null | unknown
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Worker stub returned by loader
|
|
135
|
+
*/
|
|
136
|
+
export interface WorkerStub {
|
|
137
|
+
fetch(request: Request): Promise<Response>
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Test service core - returned by connect() (from ai-tests)
|
|
142
|
+
*/
|
|
143
|
+
export interface TestServiceCore {
|
|
144
|
+
expect(value: unknown, message?: string): unknown
|
|
145
|
+
should(value: unknown): unknown
|
|
146
|
+
assert: unknown
|
|
147
|
+
describe(name: string, fn: () => void): void
|
|
148
|
+
it(name: string, fn: () => void | Promise<void>): void
|
|
149
|
+
test(name: string, fn: () => void | Promise<void>): void
|
|
150
|
+
skip(name: string, fn?: () => void | Promise<void>): void
|
|
151
|
+
only(name: string, fn: () => void | Promise<void>): void
|
|
152
|
+
beforeEach(fn: () => void | Promise<void>): void
|
|
153
|
+
afterEach(fn: () => void | Promise<void>): void
|
|
154
|
+
beforeAll(fn: () => void | Promise<void>): void
|
|
155
|
+
afterAll(fn: () => void | Promise<void>): void
|
|
156
|
+
run(): Promise<TestResults>
|
|
157
|
+
reset(): void
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Test service binding type - WorkerEntrypoint (from ai-tests)
|
|
162
|
+
*/
|
|
163
|
+
export interface TestServiceBinding {
|
|
164
|
+
/** Get a test service instance via RPC */
|
|
165
|
+
connect(): Promise<TestServiceCore>
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Environment with worker loader binding
|
|
170
|
+
*/
|
|
171
|
+
export interface SandboxEnv {
|
|
172
|
+
LOADER?: WorkerLoader
|
|
173
|
+
TEST?: TestServiceBinding
|
|
174
|
+
}
|