@workflow/world-testing 4.0.1-beta.2 → 4.0.1-beta.4

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.
@@ -0,0 +1,15 @@
1
+
2
+ > @workflow/world-testing@4.0.1-beta.4 build /home/runner/work/workflow/workflow/packages/world-testing
3
+ > wf build && tsc
4
+
5
+ Using target: standalone
6
+ Building with StandaloneBuilder
7
+ Creating Vercel API steps bundle at ./.well-known/workflow/v1/step.js
8
+ Discovering workflow directives 193ms
9
+ Created steps bundle 628ms
10
+ Creating vercel API workflows bundle at ./.well-known/workflow/v1/flow.js
11
+ Created intermediate workflow bundle 6ms
12
+ Created final workflow bundle 61ms
13
+ Creating vercel API webhook bundle at ./.well-known/workflow/v1/webhook.js
14
+ Creating webhook route
15
+ Build completed successfully!
package/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # @workflow/world-testing
2
2
 
3
+ ## 4.0.1-beta.4
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [66332f2]
8
+ - Updated dependencies [dbf2207]
9
+ - @workflow/cli@4.0.1-beta.4
10
+ - workflow@4.0.1-beta.4
11
+
12
+ ## 4.0.1-beta.3
13
+
14
+ ### Patch Changes
15
+
16
+ - Updated dependencies [d3a4ed3]
17
+ - Updated dependencies [d3a4ed3]
18
+ - Updated dependencies [dfdb280]
19
+ - Updated dependencies [7dad974]
20
+ - Updated dependencies [7868434]
21
+ - Updated dependencies [d3a4ed3]
22
+ - @workflow/world@4.0.1-beta.2
23
+ - @workflow/cli@4.0.1-beta.3
24
+ - workflow@4.0.1-beta.3
25
+
3
26
  ## 4.0.1-beta.2
4
27
 
5
28
  ### Patch Changes
@@ -0,0 +1,2 @@
1
+ export declare function addition(world: string): void;
2
+ //# sourceMappingURL=addition.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addition.d.mts","sourceRoot":"","sources":["../../src/addition.mts"],"names":[],"mappings":"AAGA,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,QAuBrC"}
@@ -0,0 +1,20 @@
1
+ import { expect, test, vi } from 'vitest';
2
+ import { createFetcher, startServer } from './util.mjs';
3
+ export function addition(world) {
4
+ test('runs an addition', { timeout: 12_000 }, async () => {
5
+ const server = await startServer({ world }).then(createFetcher);
6
+ const result = await server.invoke('workflows/addition.ts', 'addition', [1, 2]);
7
+ expect(result.runId).toMatch(/^wrun_.+/);
8
+ await vi.waitFor(async () => {
9
+ const run = await server.getRun(result.runId);
10
+ expect(run).toMatchObject({
11
+ status: 'completed',
12
+ output: [3],
13
+ });
14
+ }, {
15
+ interval: 200,
16
+ timeout: 10_000,
17
+ });
18
+ });
19
+ }
20
+ //# sourceMappingURL=addition.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addition.mjs","sourceRoot":"","sources":["../../src/addition.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,IAAI,CAAC,kBAAkB,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAChC,uBAAuB,EACvB,UAAU,EACV,CAAC,CAAC,EAAE,CAAC,CAAC,CACP,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,EAAE,CAAC,OAAO,CACd,KAAK,IAAI,EAAE;YACT,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,aAAa,CAAsB;gBAC7C,MAAM,EAAE,WAAW;gBACnB,MAAM,EAAE,CAAC,CAAC,CAAC;aACZ,CAAC,CAAC;QACL,CAAC,EACD;YACE,QAAQ,EAAE,GAAG;YACb,OAAO,EAAE,MAAM;SAChB,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function idempotency(world: string): void;
2
+ //# sourceMappingURL=idempotency.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idempotency.d.mts","sourceRoot":"","sources":["../../src/idempotency.mts"],"names":[],"mappings":"AAIA,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,QAyBxC"}
@@ -0,0 +1,25 @@
1
+ import { expect, test, vi } from 'vitest';
2
+ import { hydrateWorkflowReturnValue } from 'workflow/internal/serialization';
3
+ import { createFetcher, startServer } from './util.mjs';
4
+ export function idempotency(world) {
5
+ test('idempotency', { timeout: 60_000 }, async () => {
6
+ const server = await startServer({ world }).then(createFetcher);
7
+ const result = await server.invoke('workflows/noop.ts', 'brokenWf', [1, 2]);
8
+ expect(result.runId).toMatch(/^wrun_.+/);
9
+ const run = await vi.waitFor(async () => {
10
+ const run = await server.getRun(result.runId);
11
+ expect(run).toMatchObject({
12
+ status: 'completed',
13
+ });
14
+ return run;
15
+ }, {
16
+ interval: 200,
17
+ timeout: 59_000,
18
+ });
19
+ const output = await hydrateWorkflowReturnValue(run.output, [], globalThis);
20
+ expect(output).toEqual({
21
+ numbers: Array.from({ length: 110 }, () => expect.any(Number)),
22
+ });
23
+ });
24
+ }
25
+ //# sourceMappingURL=idempotency.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idempotency.mjs","sourceRoot":"","sources":["../../src/idempotency.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAI,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5E,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CAC1B,KAAK,IAAI,EAAE;YACT,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,aAAa,CAAsB;gBAC7C,MAAM,EAAE,WAAW;aACpB,CAAC,CAAC;YACH,OAAO,GAAG,CAAC;QACb,CAAC,EACD;YACE,QAAQ,EAAE,GAAG;YACb,OAAO,EAAE,MAAM;SAChB,CACF,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;QAE5E,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;SAC/D,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function createTestSuite(pkgName: string): void;
2
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/index.mts"],"names":[],"mappings":"AAGA,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,QAG9C"}
@@ -0,0 +1,7 @@
1
+ import { addition } from './addition.mjs';
2
+ import { idempotency } from './idempotency.mjs';
3
+ export function createTestSuite(pkgName) {
4
+ addition(pkgName);
5
+ idempotency(pkgName);
6
+ }
7
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/index.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClB,WAAW,CAAC,OAAO,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=server.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.mts","sourceRoot":"","sources":["../../src/server.mts"],"names":[],"mappings":""}
@@ -0,0 +1,79 @@
1
+ import fs from 'node:fs';
2
+ import { serve } from '@hono/node-server';
3
+ import { Hono } from 'hono';
4
+ import { getRun, start } from 'workflow/api';
5
+ import { getWorld } from 'workflow/runtime';
6
+ import * as z from 'zod';
7
+ import flow from '../.well-known/workflow/v1/flow.js';
8
+ import manifest from '../.well-known/workflow/v1/manifest.debug.json' with {
9
+ type: 'json'
10
+ };
11
+ import step from '../.well-known/workflow/v1/step.js';
12
+ if (!process.env.WORKFLOW_TARGET_WORLD) {
13
+ console.error('Error: WORKFLOW_TARGET_WORLD environment variable is not set.');
14
+ process.exit(1);
15
+ }
16
+ const Invoke = z
17
+ .object({
18
+ file: z.literal(Object.keys(manifest.workflows)),
19
+ workflow: z.string(),
20
+ args: z.unknown().array().default([]),
21
+ })
22
+ .transform((obj) => {
23
+ const file = obj.file;
24
+ const workflow = z
25
+ .literal(Object.keys(manifest.workflows[file]))
26
+ .parse(obj.workflow);
27
+ return {
28
+ args: obj.args,
29
+ workflow: manifest.workflows[file][workflow],
30
+ };
31
+ });
32
+ const app = new Hono()
33
+ .post('/.well-known/workflow/v1/flow', (ctx) => {
34
+ return flow.POST(ctx.req.raw);
35
+ })
36
+ .post('/.well-known/workflow/v1/step', (ctx) => {
37
+ return step.POST(ctx.req.raw);
38
+ })
39
+ .get('/_manifest', (ctx) => ctx.json(manifest))
40
+ .post('/invoke', async (ctx) => {
41
+ const json = await ctx.req.json().then(Invoke.parse);
42
+ const handler = await start(json.workflow, json.args);
43
+ return ctx.json({ runId: handler.runId });
44
+ })
45
+ .get('/runs/:runId', async (ctx) => {
46
+ return ctx.json(await getWorld().runs.get(ctx.req.param('runId')));
47
+ })
48
+ .get('/runs/:runId/readable', async (ctx) => {
49
+ const runId = ctx.req.param('runId');
50
+ const run = getRun(runId);
51
+ return new Response(run.getReadable());
52
+ });
53
+ serve({
54
+ fetch: app.fetch,
55
+ port: Number(process.env.PORT) || 0,
56
+ }, async (info) => {
57
+ console.log(`👂 listening on http://${info.address}:${info.port}`);
58
+ console.log('');
59
+ process.env.PORT = info.port.toString();
60
+ for (const [filename, workflows] of Object.entries(manifest.workflows)) {
61
+ for (const workflowName of Object.keys(workflows)) {
62
+ console.log(`$ curl -X POST http://localhost:${info.port}/invoke -d '${JSON.stringify({
63
+ file: filename,
64
+ workflow: workflowName,
65
+ })}'`);
66
+ }
67
+ }
68
+ const world = getWorld();
69
+ if (world.start) {
70
+ console.log(`starting background tasks...`);
71
+ await world.start().then(() => console.log('background tasks started.'), (err) => console.error('❗ error starting background tasks:', err));
72
+ }
73
+ if (process.env.CONTROL_FD === '3') {
74
+ const control = fs.createWriteStream('', { fd: 3 });
75
+ control.write(`${JSON.stringify({ state: 'listening', info })}\n`);
76
+ control.end();
77
+ }
78
+ });
79
+ //# sourceMappingURL=server.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.mjs","sourceRoot":"","sources":["../../src/server.mts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import * as z from 'zod';
2
+ import type manifest from '../.well-known/workflow/v1/manifest.debug.json';
3
+ export declare const Control: z.ZodObject<{
4
+ state: z.ZodLiteral<"listening">;
5
+ info: z.ZodObject<{
6
+ port: z.ZodNumber;
7
+ }, z.core.$strip>;
8
+ }, z.core.$strip>;
9
+ type Control = z.infer<typeof Control>;
10
+ type Files = keyof typeof manifest.workflows;
11
+ type Workflows<F extends Files> = keyof (typeof manifest.workflows)[F];
12
+ export declare const Worlds: {
13
+ embedded: string;
14
+ postgres: string;
15
+ };
16
+ export declare function startServer(opts: {
17
+ world: string;
18
+ }): Promise<{
19
+ state: "listening";
20
+ info: {
21
+ port: number;
22
+ };
23
+ }>;
24
+ export declare function createFetcher(control: Control): {
25
+ invoke<F extends Files, W extends Workflows<F>>(file: F, workflow: W, args: unknown[]): Promise<{
26
+ runId: string;
27
+ }>;
28
+ getRun(id: string): Promise<{
29
+ runId: string;
30
+ deploymentId: string;
31
+ status: "pending" | "running" | "completed" | "failed" | "paused" | "cancelled";
32
+ workflowName: string;
33
+ input: any[];
34
+ createdAt: Date;
35
+ updatedAt: Date;
36
+ executionContext?: Record<string, any> | undefined;
37
+ output?: any;
38
+ error?: string | undefined;
39
+ errorCode?: string | undefined;
40
+ startedAt?: Date | undefined;
41
+ completedAt?: Date | undefined;
42
+ }>;
43
+ };
44
+ export {};
45
+ //# sourceMappingURL=util.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.mts","sourceRoot":"","sources":["../../src/util.mts"],"names":[],"mappings":"AAMA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,KAAK,QAAQ,MAAM,gDAAgD,CAAC;AAE3E,eAAO,MAAM,OAAO;;;;;iBAKlB,CAAC;AACH,KAAK,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;AAEvC,KAAK,KAAK,GAAG,MAAM,OAAO,QAAQ,CAAC,SAAS,CAAC;AAC7C,KAAK,SAAS,CAAC,CAAC,SAAS,KAAK,IAAI,MAAM,CAAC,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAEvE,eAAO,MAAM,MAAM;;;CAGlB,CAAC;AAEF,wBAAsB,WAAW,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE;;;;;GA4CxD;AAID,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO;WAE7B,CAAC,SAAS,KAAK,EAAE,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,QAC5C,CAAC,YACG,CAAC,QACL,OAAO,EAAE;;;eAYA,MAAM;;;;;;;;;;;;;;;EAQ1B"}
@@ -0,0 +1,77 @@
1
+ import cp from 'node:child_process';
2
+ import { existsSync } from 'node:fs';
3
+ import { WorkflowRunSchema } from '@workflow/world';
4
+ import chalk from 'chalk';
5
+ import jsonlines from 'jsonlines';
6
+ import { assert, onTestFailed, onTestFinished } from 'vitest';
7
+ import * as z from 'zod';
8
+ export const Control = z.object({
9
+ state: z.literal('listening'),
10
+ info: z.object({
11
+ port: z.number(),
12
+ }),
13
+ });
14
+ export const Worlds = {
15
+ embedded: 'embedded',
16
+ postgres: '@workflow/world-postgres',
17
+ };
18
+ export async function startServer(opts) {
19
+ let serverPath = new URL('./server.mts', import.meta.url).pathname;
20
+ if (!existsSync(serverPath)) {
21
+ serverPath = new URL('./server.mjs', import.meta.url).pathname;
22
+ }
23
+ const proc = cp.spawn('node', [serverPath], {
24
+ stdio: ['ignore', 'pipe', 'pipe', 'pipe'],
25
+ env: {
26
+ ...process.env,
27
+ WORKFLOW_TARGET_WORLD: opts.world,
28
+ CONTROL_FD: '3',
29
+ },
30
+ });
31
+ onTestFinished(() => {
32
+ proc.kill();
33
+ });
34
+ const stdio = [];
35
+ proc.stdout?.on('data', (chunk) => {
36
+ stdio.push({ stream: chalk.white, chunk: chunk.toString() });
37
+ });
38
+ proc.stderr?.on('data', (chunk) => {
39
+ stdio.push({ stream: chalk.red, chunk: chunk.toString() });
40
+ });
41
+ onTestFailed(() => {
42
+ console.log('=== SERVER STDIO ===');
43
+ let buffer = '';
44
+ for (const { stream, chunk } of stdio) {
45
+ buffer += stream.inverse(chunk);
46
+ }
47
+ console.log(buffer);
48
+ });
49
+ const fd3 = proc.stdio[3];
50
+ assert(fd3, 'fd3 should be defined');
51
+ for await (const chunk of fd3.pipe(jsonlines.parse())) {
52
+ return Control.parse(chunk);
53
+ }
54
+ throw new Error('Server did not start correctly');
55
+ }
56
+ const Invoke = z.object({ runId: z.coerce.string() });
57
+ export function createFetcher(control) {
58
+ return {
59
+ async invoke(file, workflow, args) {
60
+ const x = await fetch(`http://localhost:${control.info.port}/invoke`, {
61
+ method: 'POST',
62
+ headers: {
63
+ 'content-type': 'application/json',
64
+ },
65
+ body: JSON.stringify({ file, workflow, args }),
66
+ });
67
+ const data = await x.json().then(Invoke.parse);
68
+ return data;
69
+ },
70
+ async getRun(id) {
71
+ const x = await fetch(`http://localhost:${control.info.port}/runs/${encodeURIComponent(id)}`);
72
+ const data = await x.json();
73
+ return WorkflowRunSchema.parseAsync(data);
74
+ },
75
+ };
76
+ }
77
+ //# sourceMappingURL=util.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.mjs","sourceRoot":"","sources":["../../src/util.mts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@workflow/world-testing",
3
- "version": "4.0.1-beta.2",
3
+ "version": "4.0.1-beta.4",
4
4
  "description": "Testing utilities and World implementation for Workflow DevKit",
5
5
  "main": "dist/src/index.mjs",
6
6
  "publishConfig": {
@@ -18,9 +18,9 @@
18
18
  "hono": "^4.9.10",
19
19
  "jsonlines": "^0.1.1",
20
20
  "zod": "4.1.11",
21
- "@workflow/cli": "4.0.1-beta.2",
22
- "workflow": "4.0.1-beta.2",
23
- "@workflow/world": "4.0.1-beta.1"
21
+ "@workflow/cli": "4.0.1-beta.4",
22
+ "@workflow/world": "4.0.1-beta.2",
23
+ "workflow": "4.0.1-beta.4"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@types/node": "24.6.2",
@@ -35,6 +35,7 @@
35
35
  "author": "",
36
36
  "scripts": {
37
37
  "build": "wf build && tsc",
38
+ "clean": "tsc --build --clean && rm -rf dist .well-known* .workflow-data",
38
39
  "start": "node --watch src/server.mts",
39
40
  "test": "vitest"
40
41
  }