@workflow/cli 4.0.1-beta.6 → 4.0.1-beta.8
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/LICENSE.md +201 -21
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +1 -2
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/inspect.d.ts.map +1 -1
- package/dist/commands/inspect.js +21 -4
- package/dist/commands/inspect.js.map +1 -1
- package/dist/lib/config/types.d.ts +3 -15
- package/dist/lib/config/types.d.ts.map +1 -1
- package/dist/lib/config/types.js +1 -8
- package/dist/lib/config/types.js.map +1 -1
- package/dist/lib/inspect/output.d.ts +1 -0
- package/dist/lib/inspect/output.d.ts.map +1 -1
- package/dist/lib/inspect/output.js +105 -1
- package/dist/lib/inspect/output.js.map +1 -1
- package/package.json +12 -14
- package/dist/lib/builders/apply-swc-transform.d.ts +0 -24
- package/dist/lib/builders/apply-swc-transform.d.ts.map +0 -1
- package/dist/lib/builders/apply-swc-transform.js +0 -38
- package/dist/lib/builders/apply-swc-transform.js.map +0 -1
- package/dist/lib/builders/base-builder.d.ts +0 -45
- package/dist/lib/builders/base-builder.d.ts.map +0 -1
- package/dist/lib/builders/base-builder.js +0 -466
- package/dist/lib/builders/base-builder.js.map +0 -1
- package/dist/lib/builders/discover-entries-esbuild-plugin.d.ts +0 -11
- package/dist/lib/builders/discover-entries-esbuild-plugin.d.ts.map +0 -1
- package/dist/lib/builders/discover-entries-esbuild-plugin.js +0 -84
- package/dist/lib/builders/discover-entries-esbuild-plugin.js.map +0 -1
- package/dist/lib/builders/next-build.d.ts +0 -11
- package/dist/lib/builders/next-build.d.ts.map +0 -1
- package/dist/lib/builders/next-build.js +0 -331
- package/dist/lib/builders/next-build.js.map +0 -1
- package/dist/lib/builders/node-module-esbuild-plugin.d.ts +0 -3
- package/dist/lib/builders/node-module-esbuild-plugin.d.ts.map +0 -1
- package/dist/lib/builders/node-module-esbuild-plugin.js +0 -24
- package/dist/lib/builders/node-module-esbuild-plugin.js.map +0 -1
- package/dist/lib/builders/node-module-esbuild-plugin.test.d.ts +0 -2
- package/dist/lib/builders/node-module-esbuild-plugin.test.d.ts.map +0 -1
- package/dist/lib/builders/node-module-esbuild-plugin.test.js +0 -128
- package/dist/lib/builders/node-module-esbuild-plugin.test.js.map +0 -1
- package/dist/lib/builders/standalone.d.ts +0 -8
- package/dist/lib/builders/standalone.d.ts.map +0 -1
- package/dist/lib/builders/standalone.js +0 -52
- package/dist/lib/builders/standalone.js.map +0 -1
- package/dist/lib/builders/swc-esbuild-plugin.d.ts +0 -12
- package/dist/lib/builders/swc-esbuild-plugin.d.ts.map +0 -1
- package/dist/lib/builders/swc-esbuild-plugin.js +0 -134
- package/dist/lib/builders/swc-esbuild-plugin.js.map +0 -1
- package/dist/lib/builders/vercel-build-output-api.d.ts +0 -9
- package/dist/lib/builders/vercel-build-output-api.d.ts.map +0 -1
- package/dist/lib/builders/vercel-build-output-api.js +0 -138
- package/dist/lib/builders/vercel-build-output-api.js.map +0 -1
- package/dist/lib/builders/webhook-route.test.d.ts +0 -2
- package/dist/lib/builders/webhook-route.test.d.ts.map +0 -1
- package/dist/lib/builders/webhook-route.test.js +0 -206
- package/dist/lib/builders/webhook-route.test.js.map +0 -1
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
import { readFile } from 'node:fs/promises';
|
|
2
|
-
import enhancedResolveOrig from 'enhanced-resolve';
|
|
3
|
-
import { relative } from 'path';
|
|
4
|
-
import { promisify } from 'util';
|
|
5
|
-
import { applySwcTransform, } from './apply-swc-transform.js';
|
|
6
|
-
import { jsTsRegex, parentHasChild, } from './discover-entries-esbuild-plugin.js';
|
|
7
|
-
const NODE_RESOLVE_OPTIONS = {
|
|
8
|
-
dependencyType: 'commonjs',
|
|
9
|
-
modules: ['node_modules'],
|
|
10
|
-
exportsFields: ['exports'],
|
|
11
|
-
importsFields: ['imports'],
|
|
12
|
-
conditionNames: ['node', 'require'],
|
|
13
|
-
descriptionFiles: ['package.json'],
|
|
14
|
-
extensions: ['.ts', '.mts', '.cjs', '.js', '.json', '.node'],
|
|
15
|
-
enforceExtensions: false,
|
|
16
|
-
symlinks: true,
|
|
17
|
-
mainFields: ['main'],
|
|
18
|
-
mainFiles: ['index'],
|
|
19
|
-
roots: [],
|
|
20
|
-
fullySpecified: false,
|
|
21
|
-
preferRelative: false,
|
|
22
|
-
preferAbsolute: false,
|
|
23
|
-
restrictions: [],
|
|
24
|
-
};
|
|
25
|
-
const NODE_ESM_RESOLVE_OPTIONS = {
|
|
26
|
-
...NODE_RESOLVE_OPTIONS,
|
|
27
|
-
dependencyType: 'esm',
|
|
28
|
-
conditionNames: ['node', 'import'],
|
|
29
|
-
};
|
|
30
|
-
export function createSwcPlugin(options) {
|
|
31
|
-
return {
|
|
32
|
-
name: 'swc-workflow-plugin',
|
|
33
|
-
setup(build) {
|
|
34
|
-
// everything is external unless explicitly configured
|
|
35
|
-
// to be bundled
|
|
36
|
-
const cjsResolver = promisify(enhancedResolveOrig.create(NODE_RESOLVE_OPTIONS));
|
|
37
|
-
const esmResolver = promisify(enhancedResolveOrig.create(NODE_ESM_RESOLVE_OPTIONS));
|
|
38
|
-
const enhancedResolve = async (context, path) => {
|
|
39
|
-
try {
|
|
40
|
-
return await esmResolver(context, path);
|
|
41
|
-
}
|
|
42
|
-
catch (_) {
|
|
43
|
-
return cjsResolver(context, path);
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
|
-
build.onResolve({ filter: /.*/ }, async (args) => {
|
|
47
|
-
if (!options.entriesToBundle) {
|
|
48
|
-
return null;
|
|
49
|
-
}
|
|
50
|
-
try {
|
|
51
|
-
let resolvedPath = args.path;
|
|
52
|
-
// handle local imports e.g. ./hello or ../another
|
|
53
|
-
if (args.path.startsWith('.')) {
|
|
54
|
-
resolvedPath = await enhancedResolve(args.resolveDir, args.path);
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
resolvedPath = await enhancedResolve(
|
|
58
|
-
// `args.resolveDir` is not used here to ensure we only
|
|
59
|
-
// externalize packages that can be resolved in the
|
|
60
|
-
// project's working directory e.g. a nested dep can't
|
|
61
|
-
// be externalized as we won't be able to resolve it once
|
|
62
|
-
// it's parent has been bundled
|
|
63
|
-
build.initialOptions.absWorkingDir || process.cwd(), args.path);
|
|
64
|
-
}
|
|
65
|
-
if (!resolvedPath)
|
|
66
|
-
return null;
|
|
67
|
-
for (const entryToBundle of options.entriesToBundle) {
|
|
68
|
-
if (resolvedPath === entryToBundle) {
|
|
69
|
-
return null;
|
|
70
|
-
}
|
|
71
|
-
// if the current entry imports a child that needs
|
|
72
|
-
// to be bundled then it needs to also be bundled so
|
|
73
|
-
// that the child can have our transform applied
|
|
74
|
-
if (parentHasChild(resolvedPath, entryToBundle)) {
|
|
75
|
-
return null;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
const isFilePath = args.path.startsWith('.') || args.path.startsWith('/');
|
|
79
|
-
return {
|
|
80
|
-
external: true,
|
|
81
|
-
path: isFilePath
|
|
82
|
-
? relative(options.outdir || '', resolvedPath)
|
|
83
|
-
: args.path,
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
catch (_) { }
|
|
87
|
-
return null;
|
|
88
|
-
});
|
|
89
|
-
// Handle TypeScript and JavaScript files
|
|
90
|
-
build.onLoad({ filter: jsTsRegex }, async (args) => {
|
|
91
|
-
// Determine if this is a TypeScript file
|
|
92
|
-
const isTypeScript = args.path.endsWith('.ts') || args.path.endsWith('.tsx');
|
|
93
|
-
try {
|
|
94
|
-
// Determine the loader based on the output
|
|
95
|
-
let loader = 'js';
|
|
96
|
-
if (!isTypeScript && args.path.endsWith('.jsx')) {
|
|
97
|
-
loader = 'jsx';
|
|
98
|
-
}
|
|
99
|
-
const source = await readFile(args.path, 'utf8');
|
|
100
|
-
const { code: transformedCode, workflowManifest } = await applySwcTransform(args.path, source, options.mode,
|
|
101
|
-
// we need to provide the tsconfig/jsconfig
|
|
102
|
-
// alias via swc so that we can resolve them
|
|
103
|
-
// with our custom resolve logic
|
|
104
|
-
{
|
|
105
|
-
paths: options.tsPaths,
|
|
106
|
-
baseUrl: options.tsBaseUrl,
|
|
107
|
-
});
|
|
108
|
-
if (!options.workflowManifest) {
|
|
109
|
-
options.workflowManifest = {};
|
|
110
|
-
}
|
|
111
|
-
options.workflowManifest.workflows = Object.assign(options.workflowManifest.workflows || {}, workflowManifest.workflows);
|
|
112
|
-
options.workflowManifest.steps = Object.assign(options.workflowManifest.steps || {}, workflowManifest.steps);
|
|
113
|
-
return {
|
|
114
|
-
contents: transformedCode,
|
|
115
|
-
loader,
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
catch (error) {
|
|
119
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
120
|
-
console.error(`❌ SWC transform error in ${args.path}:`, errorMessage);
|
|
121
|
-
return {
|
|
122
|
-
errors: [
|
|
123
|
-
{
|
|
124
|
-
text: `SWC transform failed: ${errorMessage}`,
|
|
125
|
-
location: { file: args.path, line: 0, column: 0 },
|
|
126
|
-
},
|
|
127
|
-
],
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
});
|
|
131
|
-
},
|
|
132
|
-
};
|
|
133
|
-
}
|
|
134
|
-
//# sourceMappingURL=swc-esbuild-plugin.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"swc-esbuild-plugin.js","sourceRoot":"","sources":["../../../src/lib/builders/swc-esbuild-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { BaseBuilder } from './base-builder.js';
|
|
2
|
-
export declare class VercelBuildOutputAPIBuilder extends BaseBuilder {
|
|
3
|
-
build(): Promise<void>;
|
|
4
|
-
private buildStepsFunction;
|
|
5
|
-
private buildWorkflowsFunction;
|
|
6
|
-
private buildWebhookFunction;
|
|
7
|
-
private createBuildOutputConfig;
|
|
8
|
-
}
|
|
9
|
-
//# sourceMappingURL=vercel-build-output-api.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vercel-build-output-api.d.ts","sourceRoot":"","sources":["../../../src/lib/builders/vercel-build-output-api.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,qBAAa,2BAA4B,SAAQ,WAAW;IACpD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAwBd,kBAAkB;YA0DlB,sBAAsB;YAwDtB,oBAAoB;YA2CpB,uBAAuB;CA0BtC"}
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
import { mkdir, writeFile } from 'node:fs/promises';
|
|
2
|
-
import { join, resolve } from 'node:path';
|
|
3
|
-
import { BaseBuilder } from './base-builder.js';
|
|
4
|
-
export class VercelBuildOutputAPIBuilder extends BaseBuilder {
|
|
5
|
-
async build() {
|
|
6
|
-
const outputDir = resolve(this.config.workingDir, '.vercel/output');
|
|
7
|
-
const functionsDir = join(outputDir, 'functions');
|
|
8
|
-
const workflowGeneratedDir = join(functionsDir, '.well-known/workflow/v1');
|
|
9
|
-
// Ensure output directories exist
|
|
10
|
-
await mkdir(workflowGeneratedDir, { recursive: true });
|
|
11
|
-
const inputFiles = await this.getInputFiles();
|
|
12
|
-
const tsConfig = await this.getTsConfigOptions();
|
|
13
|
-
const options = {
|
|
14
|
-
inputFiles,
|
|
15
|
-
workflowGeneratedDir,
|
|
16
|
-
tsBaseUrl: tsConfig.baseUrl,
|
|
17
|
-
tsPaths: tsConfig.paths,
|
|
18
|
-
};
|
|
19
|
-
await this.buildStepsFunction(options);
|
|
20
|
-
await this.buildWorkflowsFunction(options);
|
|
21
|
-
await this.buildWebhookFunction(options);
|
|
22
|
-
await this.createBuildOutputConfig(outputDir);
|
|
23
|
-
await this.buildClientLibrary();
|
|
24
|
-
}
|
|
25
|
-
async buildStepsFunction({ inputFiles, workflowGeneratedDir, tsPaths, tsBaseUrl, }) {
|
|
26
|
-
console.log('Creating Vercel Build Output API steps function');
|
|
27
|
-
const stepsFuncDir = join(workflowGeneratedDir, 'step.func');
|
|
28
|
-
await mkdir(stepsFuncDir, { recursive: true });
|
|
29
|
-
// Create steps bundle
|
|
30
|
-
await this.createStepsBundle({
|
|
31
|
-
inputFiles,
|
|
32
|
-
outfile: join(stepsFuncDir, 'index.js'),
|
|
33
|
-
tsBaseUrl,
|
|
34
|
-
tsPaths,
|
|
35
|
-
});
|
|
36
|
-
// Create package.json for CommonJS
|
|
37
|
-
const packageJson = {
|
|
38
|
-
type: 'commonjs',
|
|
39
|
-
};
|
|
40
|
-
await writeFile(join(stepsFuncDir, 'package.json'), JSON.stringify(packageJson, null, 2));
|
|
41
|
-
// Create .vc-config.json for steps function
|
|
42
|
-
const stepsConfig = {
|
|
43
|
-
runtime: 'nodejs22.x',
|
|
44
|
-
handler: 'index.js',
|
|
45
|
-
launcherType: 'Nodejs',
|
|
46
|
-
architecture: 'arm64',
|
|
47
|
-
shouldAddHelpers: true,
|
|
48
|
-
shouldAddSourcemapSupport: true,
|
|
49
|
-
experimentalTriggers: [
|
|
50
|
-
{
|
|
51
|
-
type: 'queue/v1beta',
|
|
52
|
-
topic: '__wkf_step_*',
|
|
53
|
-
consumer: 'default',
|
|
54
|
-
maxDeliveries: 64, // Optional: Maximum number of delivery attempts (default: 3)
|
|
55
|
-
retryAfterSeconds: 5, // Optional: Delay between retries (default: 60)
|
|
56
|
-
initialDelaySeconds: 0, // Optional: Initial delay before first delivery (default: 0)
|
|
57
|
-
},
|
|
58
|
-
],
|
|
59
|
-
};
|
|
60
|
-
await writeFile(join(stepsFuncDir, '.vc-config.json'), JSON.stringify(stepsConfig, null, 2));
|
|
61
|
-
}
|
|
62
|
-
async buildWorkflowsFunction({ inputFiles, workflowGeneratedDir, tsPaths, tsBaseUrl, }) {
|
|
63
|
-
console.log('Creating Vercel Build Output API workflows function');
|
|
64
|
-
const workflowsFuncDir = join(workflowGeneratedDir, 'flow.func');
|
|
65
|
-
await mkdir(workflowsFuncDir, { recursive: true });
|
|
66
|
-
await this.createWorkflowsBundle({
|
|
67
|
-
outfile: join(workflowsFuncDir, 'index.js'),
|
|
68
|
-
inputFiles,
|
|
69
|
-
tsBaseUrl,
|
|
70
|
-
tsPaths,
|
|
71
|
-
});
|
|
72
|
-
// Create package.json for ESM support
|
|
73
|
-
const packageJson = {
|
|
74
|
-
type: 'commonjs',
|
|
75
|
-
};
|
|
76
|
-
await writeFile(join(workflowsFuncDir, 'package.json'), JSON.stringify(packageJson, null, 2));
|
|
77
|
-
// Create .vc-config.json for workflows function
|
|
78
|
-
const workflowsConfig = {
|
|
79
|
-
runtime: 'nodejs22.x',
|
|
80
|
-
handler: 'index.js',
|
|
81
|
-
launcherType: 'Nodejs',
|
|
82
|
-
architecture: 'arm64',
|
|
83
|
-
shouldAddHelpers: true,
|
|
84
|
-
experimentalTriggers: [
|
|
85
|
-
{
|
|
86
|
-
type: 'queue/v1beta',
|
|
87
|
-
topic: '__wkf_workflow_*',
|
|
88
|
-
consumer: 'default',
|
|
89
|
-
maxDeliveries: 64, // Optional: Maximum number of delivery attempts (default: 3)
|
|
90
|
-
retryAfterSeconds: 5, // Optional: Delay between retries (default: 60)
|
|
91
|
-
initialDelaySeconds: 0, // Optional: Initial delay before first delivery (default: 0)
|
|
92
|
-
},
|
|
93
|
-
],
|
|
94
|
-
};
|
|
95
|
-
await writeFile(join(workflowsFuncDir, '.vc-config.json'), JSON.stringify(workflowsConfig, null, 2));
|
|
96
|
-
}
|
|
97
|
-
async buildWebhookFunction({ workflowGeneratedDir, bundle = true, }) {
|
|
98
|
-
console.log('Creating Vercel Build Output API webhook function');
|
|
99
|
-
const webhookFuncDir = join(workflowGeneratedDir, 'webhook/[token].func');
|
|
100
|
-
// Bundle the webhook route with dependencies resolved
|
|
101
|
-
await this.createWebhookBundle({
|
|
102
|
-
outfile: join(webhookFuncDir, 'index.js'),
|
|
103
|
-
bundle, // Build Output API needs bundling (except in tests)
|
|
104
|
-
});
|
|
105
|
-
// Create package.json for CommonJS
|
|
106
|
-
const packageJson = {
|
|
107
|
-
type: 'commonjs',
|
|
108
|
-
};
|
|
109
|
-
await writeFile(join(webhookFuncDir, 'package.json'), JSON.stringify(packageJson, null, 2));
|
|
110
|
-
// Create .vc-config.json for webhook function
|
|
111
|
-
const webhookConfig = {
|
|
112
|
-
runtime: 'nodejs22.x',
|
|
113
|
-
handler: 'index.js',
|
|
114
|
-
launcherType: 'Nodejs',
|
|
115
|
-
architecture: 'arm64',
|
|
116
|
-
shouldAddHelpers: false,
|
|
117
|
-
};
|
|
118
|
-
await writeFile(join(webhookFuncDir, '.vc-config.json'), JSON.stringify(webhookConfig, null, 2));
|
|
119
|
-
}
|
|
120
|
-
async createBuildOutputConfig(outputDir) {
|
|
121
|
-
// Create config.json for Build Output API
|
|
122
|
-
const buildOutputConfig = {
|
|
123
|
-
version: 3,
|
|
124
|
-
routes: [
|
|
125
|
-
{
|
|
126
|
-
src: '^\\/\\.well-known\\/workflow\\/v1\\/webhook\\/([^\\/]+)$',
|
|
127
|
-
dest: '/.well-known/workflow/v1/webhook/[token]',
|
|
128
|
-
},
|
|
129
|
-
],
|
|
130
|
-
};
|
|
131
|
-
await writeFile(join(outputDir, 'config.json'), JSON.stringify(buildOutputConfig, null, 2));
|
|
132
|
-
console.log(`Build Output API created at ${outputDir}`);
|
|
133
|
-
console.log('Steps function available at /.well-known/workflow/v1/step');
|
|
134
|
-
console.log('Workflows function available at /.well-known/workflow/v1/flow');
|
|
135
|
-
console.log('Webhook function available at /.well-known/workflow/v1/webhook/[token]');
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
//# sourceMappingURL=vercel-build-output-api.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vercel-build-output-api.js","sourceRoot":"","sources":["../../../src/lib/builders/vercel-build-output-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"webhook-route.test.d.ts","sourceRoot":"","sources":["../../../src/lib/builders/webhook-route.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
import { mkdir, readFile, rm } from 'node:fs/promises';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
4
|
-
import { NextBuilder } from './next-build.js';
|
|
5
|
-
import { VercelBuildOutputAPIBuilder } from './vercel-build-output-api.js';
|
|
6
|
-
describe('Webhook route generation', () => {
|
|
7
|
-
const testDir = join(process.cwd(), '.test-webhook-routes');
|
|
8
|
-
const appDir = join(testDir, 'app');
|
|
9
|
-
beforeEach(async () => {
|
|
10
|
-
await mkdir(appDir, { recursive: true });
|
|
11
|
-
// Create a dummy route file to satisfy NextBuilder's findAppDirectory
|
|
12
|
-
await mkdir(join(appDir, 'test'), { recursive: true });
|
|
13
|
-
await mkdir(join(appDir, 'test'), { recursive: true });
|
|
14
|
-
});
|
|
15
|
-
afterEach(async () => {
|
|
16
|
-
await rm(testDir, { recursive: true, force: true });
|
|
17
|
-
});
|
|
18
|
-
describe('Next.js build target', () => {
|
|
19
|
-
it('should create webhook route at correct location', async () => {
|
|
20
|
-
const config = {
|
|
21
|
-
buildTarget: 'next',
|
|
22
|
-
dirs: ['app'],
|
|
23
|
-
workingDir: testDir,
|
|
24
|
-
stepsBundlePath: '',
|
|
25
|
-
workflowsBundlePath: '',
|
|
26
|
-
webhookBundlePath: '',
|
|
27
|
-
watch: false,
|
|
28
|
-
externalPackages: [],
|
|
29
|
-
};
|
|
30
|
-
const builder = new NextBuilder(config);
|
|
31
|
-
// We'll call the private method indirectly through reflection
|
|
32
|
-
const createWebhookBundle = builder.createWebhookBundle.bind(builder);
|
|
33
|
-
const workflowGeneratedDir = join(appDir, '.well-known/workflow/v1');
|
|
34
|
-
const webhookRouteFile = join(workflowGeneratedDir, 'webhook/[token]/route.js');
|
|
35
|
-
await createWebhookBundle({
|
|
36
|
-
outfile: webhookRouteFile,
|
|
37
|
-
bundle: false,
|
|
38
|
-
});
|
|
39
|
-
const routePath = join(workflowGeneratedDir, 'webhook/[token]/route.js');
|
|
40
|
-
const routeContent = await readFile(routePath, 'utf-8');
|
|
41
|
-
expect(routeContent).toContain('resumeWebhook');
|
|
42
|
-
expect(routeContent).toContain('async function handler(request)');
|
|
43
|
-
expect(routeContent).toContain("url.pathname.split('/')");
|
|
44
|
-
expect(routeContent).toContain('decodeURIComponent(pathParts[pathParts.length - 1])');
|
|
45
|
-
expect(routeContent).toContain('export const GET = handler');
|
|
46
|
-
expect(routeContent).toContain('export const POST = handler');
|
|
47
|
-
expect(routeContent).toContain('export const PUT = handler');
|
|
48
|
-
expect(routeContent).toContain('export const PATCH = handler');
|
|
49
|
-
expect(routeContent).toContain('export const DELETE = handler');
|
|
50
|
-
});
|
|
51
|
-
it('should handle missing token correctly', async () => {
|
|
52
|
-
const config = {
|
|
53
|
-
buildTarget: 'next',
|
|
54
|
-
dirs: ['app'],
|
|
55
|
-
workingDir: testDir,
|
|
56
|
-
stepsBundlePath: '',
|
|
57
|
-
workflowsBundlePath: '',
|
|
58
|
-
webhookBundlePath: '',
|
|
59
|
-
watch: false,
|
|
60
|
-
externalPackages: [],
|
|
61
|
-
};
|
|
62
|
-
const builder = new NextBuilder(config);
|
|
63
|
-
const createWebhookBundle = builder.createWebhookBundle.bind(builder);
|
|
64
|
-
const workflowGeneratedDir = join(appDir, '.well-known/workflow/v1');
|
|
65
|
-
const webhookRouteFile = join(workflowGeneratedDir, 'webhook/[token]/route.js');
|
|
66
|
-
await createWebhookBundle({
|
|
67
|
-
outfile: webhookRouteFile,
|
|
68
|
-
bundle: false,
|
|
69
|
-
});
|
|
70
|
-
const routeContent = await readFile(webhookRouteFile, 'utf-8');
|
|
71
|
-
expect(routeContent).toContain('Missing token');
|
|
72
|
-
expect(routeContent).toContain('status: 400');
|
|
73
|
-
});
|
|
74
|
-
it('should handle webhook not found correctly', async () => {
|
|
75
|
-
const config = {
|
|
76
|
-
buildTarget: 'next',
|
|
77
|
-
dirs: ['app'],
|
|
78
|
-
workingDir: testDir,
|
|
79
|
-
stepsBundlePath: '',
|
|
80
|
-
workflowsBundlePath: '',
|
|
81
|
-
webhookBundlePath: '',
|
|
82
|
-
watch: false,
|
|
83
|
-
externalPackages: [],
|
|
84
|
-
};
|
|
85
|
-
const builder = new NextBuilder(config);
|
|
86
|
-
const createWebhookBundle = builder.createWebhookBundle.bind(builder);
|
|
87
|
-
const workflowGeneratedDir = join(appDir, '.well-known/workflow/v1');
|
|
88
|
-
const webhookRouteFile = join(workflowGeneratedDir, 'webhook/[token]/route.js');
|
|
89
|
-
await createWebhookBundle({
|
|
90
|
-
outfile: webhookRouteFile,
|
|
91
|
-
bundle: false,
|
|
92
|
-
});
|
|
93
|
-
const routeContent = await readFile(webhookRouteFile, 'utf-8');
|
|
94
|
-
expect(routeContent).toContain('new Response(null, { status: 404 })');
|
|
95
|
-
});
|
|
96
|
-
});
|
|
97
|
-
describe('Build Output API build target', () => {
|
|
98
|
-
it('should create webhook function at correct location', async () => {
|
|
99
|
-
const config = {
|
|
100
|
-
buildTarget: 'vercel-build-output-api',
|
|
101
|
-
dirs: ['workflows'],
|
|
102
|
-
workingDir: testDir,
|
|
103
|
-
stepsBundlePath: '',
|
|
104
|
-
workflowsBundlePath: '',
|
|
105
|
-
webhookBundlePath: '',
|
|
106
|
-
watch: false,
|
|
107
|
-
externalPackages: [],
|
|
108
|
-
};
|
|
109
|
-
const builder = new VercelBuildOutputAPIBuilder(config);
|
|
110
|
-
const createWebhookBundle = builder.createWebhookBundle.bind(builder);
|
|
111
|
-
const workflowGeneratedDir = join(testDir, '.vercel/output/functions/.well-known/workflow/v1');
|
|
112
|
-
const webhookFuncFile = join(workflowGeneratedDir, 'webhook/[token].func/index.js');
|
|
113
|
-
// Don't actually bundle in tests since it requires workflow to be installed
|
|
114
|
-
// Just verify the unbundled route generation works
|
|
115
|
-
await createWebhookBundle({
|
|
116
|
-
outfile: webhookFuncFile,
|
|
117
|
-
bundle: false,
|
|
118
|
-
});
|
|
119
|
-
const funcContent = await readFile(webhookFuncFile, 'utf-8');
|
|
120
|
-
// Check that the route content was generated correctly
|
|
121
|
-
expect(funcContent).toContain('workflow/api');
|
|
122
|
-
expect(funcContent).toContain('async function handler');
|
|
123
|
-
expect(funcContent).toContain('export const POST = handler');
|
|
124
|
-
});
|
|
125
|
-
it('should create correct .vc-config.json', async () => {
|
|
126
|
-
const config = {
|
|
127
|
-
buildTarget: 'vercel-build-output-api',
|
|
128
|
-
dirs: ['workflows'],
|
|
129
|
-
workingDir: testDir,
|
|
130
|
-
stepsBundlePath: '',
|
|
131
|
-
workflowsBundlePath: '',
|
|
132
|
-
webhookBundlePath: '',
|
|
133
|
-
watch: false,
|
|
134
|
-
externalPackages: [],
|
|
135
|
-
};
|
|
136
|
-
const builder = new VercelBuildOutputAPIBuilder(config);
|
|
137
|
-
const buildWebhookFunction = builder.buildWebhookFunction.bind(builder);
|
|
138
|
-
const workflowGeneratedDir = join(testDir, '.vercel/output/functions/.well-known/workflow/v1');
|
|
139
|
-
await mkdir(workflowGeneratedDir, { recursive: true });
|
|
140
|
-
await buildWebhookFunction({
|
|
141
|
-
inputFiles: [],
|
|
142
|
-
workflowGeneratedDir,
|
|
143
|
-
bundle: false, // Skip bundling in tests (requires workflow installed)
|
|
144
|
-
});
|
|
145
|
-
const configPath = join(workflowGeneratedDir, 'webhook/[token].func/.vc-config.json');
|
|
146
|
-
const configContent = await readFile(configPath, 'utf-8');
|
|
147
|
-
const config_parsed = JSON.parse(configContent);
|
|
148
|
-
expect(config_parsed.runtime).toBe('nodejs22.x');
|
|
149
|
-
expect(config_parsed.handler).toBe('index.js');
|
|
150
|
-
expect(config_parsed.launcherType).toBe('Nodejs');
|
|
151
|
-
expect(config_parsed.shouldAddHelpers).toBe(false);
|
|
152
|
-
expect(config_parsed.useWebApi).toBeUndefined();
|
|
153
|
-
});
|
|
154
|
-
it('should use CommonJS module format', async () => {
|
|
155
|
-
const config = {
|
|
156
|
-
buildTarget: 'vercel-build-output-api',
|
|
157
|
-
dirs: ['workflows'],
|
|
158
|
-
workingDir: testDir,
|
|
159
|
-
stepsBundlePath: '',
|
|
160
|
-
workflowsBundlePath: '',
|
|
161
|
-
webhookBundlePath: '',
|
|
162
|
-
watch: false,
|
|
163
|
-
externalPackages: [],
|
|
164
|
-
};
|
|
165
|
-
const builder = new VercelBuildOutputAPIBuilder(config);
|
|
166
|
-
const buildWebhookFunction = builder.buildWebhookFunction.bind(builder);
|
|
167
|
-
const workflowGeneratedDir = join(testDir, '.vercel/output/functions/.well-known/workflow/v1');
|
|
168
|
-
await mkdir(workflowGeneratedDir, { recursive: true });
|
|
169
|
-
await buildWebhookFunction({
|
|
170
|
-
inputFiles: [],
|
|
171
|
-
workflowGeneratedDir,
|
|
172
|
-
bundle: false, // Skip bundling in tests (requires workflow installed)
|
|
173
|
-
});
|
|
174
|
-
const packageJsonPath = join(workflowGeneratedDir, 'webhook/[token].func/package.json');
|
|
175
|
-
const packageJsonContent = await readFile(packageJsonPath, 'utf-8');
|
|
176
|
-
const packageJson = JSON.parse(packageJsonContent);
|
|
177
|
-
expect(packageJson.type).toBe('commonjs');
|
|
178
|
-
});
|
|
179
|
-
it('should add route configuration for dynamic segment', async () => {
|
|
180
|
-
const config = {
|
|
181
|
-
buildTarget: 'vercel-build-output-api',
|
|
182
|
-
dirs: ['workflows'],
|
|
183
|
-
workingDir: testDir,
|
|
184
|
-
stepsBundlePath: '',
|
|
185
|
-
workflowsBundlePath: '',
|
|
186
|
-
webhookBundlePath: '',
|
|
187
|
-
watch: false,
|
|
188
|
-
externalPackages: [],
|
|
189
|
-
};
|
|
190
|
-
const builder = new VercelBuildOutputAPIBuilder(config);
|
|
191
|
-
const createBuildOutputConfig = builder.createBuildOutputConfig.bind(builder);
|
|
192
|
-
const outputDir = join(testDir, '.vercel/output');
|
|
193
|
-
await mkdir(outputDir, { recursive: true });
|
|
194
|
-
await createBuildOutputConfig(outputDir);
|
|
195
|
-
const configPath = join(outputDir, 'config.json');
|
|
196
|
-
const configContent = await readFile(configPath, 'utf-8');
|
|
197
|
-
const config_parsed = JSON.parse(configContent);
|
|
198
|
-
expect(config_parsed.version).toBe(3);
|
|
199
|
-
expect(config_parsed.routes).toBeDefined();
|
|
200
|
-
expect(config_parsed.routes).toHaveLength(1);
|
|
201
|
-
expect(config_parsed.routes[0].src).toBe('^\\/\\.well-known\\/workflow\\/v1\\/webhook\\/([^\\/]+)$');
|
|
202
|
-
expect(config_parsed.routes[0].dest).toBe('/.well-known/workflow/v1/webhook/[token]');
|
|
203
|
-
});
|
|
204
|
-
});
|
|
205
|
-
});
|
|
206
|
-
//# sourceMappingURL=webhook-route.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"webhook-route.test.js","sourceRoot":"","sources":["../../../src/lib/builders/webhook-route.test.ts"],"names":[],"mappings":"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"}
|