@workflow/builders 4.0.1-beta.10

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.
Files changed (51) hide show
  1. package/LICENSE.md +201 -0
  2. package/README.md +43 -0
  3. package/dist/apply-swc-transform.d.ts +24 -0
  4. package/dist/apply-swc-transform.d.ts.map +1 -0
  5. package/dist/apply-swc-transform.js +38 -0
  6. package/dist/apply-swc-transform.js.map +1 -0
  7. package/dist/base-builder.d.ts +135 -0
  8. package/dist/base-builder.d.ts.map +1 -0
  9. package/dist/base-builder.js +598 -0
  10. package/dist/base-builder.js.map +1 -0
  11. package/dist/config-helpers.d.ts +12 -0
  12. package/dist/config-helpers.d.ts.map +1 -0
  13. package/dist/config-helpers.js +16 -0
  14. package/dist/config-helpers.js.map +1 -0
  15. package/dist/constants.d.ts +25 -0
  16. package/dist/constants.d.ts.map +1 -0
  17. package/dist/constants.js +25 -0
  18. package/dist/constants.js.map +1 -0
  19. package/dist/discover-entries-esbuild-plugin.d.ts +11 -0
  20. package/dist/discover-entries-esbuild-plugin.d.ts.map +1 -0
  21. package/dist/discover-entries-esbuild-plugin.js +87 -0
  22. package/dist/discover-entries-esbuild-plugin.js.map +1 -0
  23. package/dist/index.d.ts +13 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +11 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/node-module-esbuild-plugin.d.ts +3 -0
  28. package/dist/node-module-esbuild-plugin.d.ts.map +1 -0
  29. package/dist/node-module-esbuild-plugin.js +25 -0
  30. package/dist/node-module-esbuild-plugin.js.map +1 -0
  31. package/dist/node-module-esbuild-plugin.test.d.ts +2 -0
  32. package/dist/node-module-esbuild-plugin.test.d.ts.map +1 -0
  33. package/dist/node-module-esbuild-plugin.test.js +198 -0
  34. package/dist/node-module-esbuild-plugin.test.js.map +1 -0
  35. package/dist/standalone.d.ts +8 -0
  36. package/dist/standalone.d.ts.map +1 -0
  37. package/dist/standalone.js +47 -0
  38. package/dist/standalone.js.map +1 -0
  39. package/dist/swc-esbuild-plugin.d.ts +12 -0
  40. package/dist/swc-esbuild-plugin.d.ts.map +1 -0
  41. package/dist/swc-esbuild-plugin.js +179 -0
  42. package/dist/swc-esbuild-plugin.js.map +1 -0
  43. package/dist/types.d.ts +56 -0
  44. package/dist/types.d.ts.map +1 -0
  45. package/dist/types.js +10 -0
  46. package/dist/types.js.map +1 -0
  47. package/dist/vercel-build-output-api.d.ts +9 -0
  48. package/dist/vercel-build-output-api.d.ts.map +1 -0
  49. package/dist/vercel-build-output-api.js +92 -0
  50. package/dist/vercel-build-output-api.js.map +1 -0
  51. package/package.json +54 -0
@@ -0,0 +1,179 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { relative } from 'node:path';
3
+ import { promisify } from 'node:util';
4
+ import enhancedResolveOrig from 'enhanced-resolve';
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
+ // Normalize to forward slashes for cross-platform comparison
68
+ const normalizedResolvedPath = resolvedPath.replace(/\\/g, '/');
69
+ for (const entryToBundle of options.entriesToBundle) {
70
+ const normalizedEntry = entryToBundle.replace(/\\/g, '/');
71
+ if (normalizedResolvedPath === normalizedEntry) {
72
+ return null;
73
+ }
74
+ // if the current entry imports a child that needs
75
+ // to be bundled then it needs to also be bundled so
76
+ // that the child can have our transform applied
77
+ if (parentHasChild(normalizedResolvedPath, normalizedEntry)) {
78
+ return null;
79
+ }
80
+ }
81
+ const isFilePath = args.path.startsWith('.') || args.path.startsWith('/');
82
+ return {
83
+ external: true,
84
+ path: isFilePath
85
+ ? relative(options.outdir || process.cwd(), resolvedPath).replace(/\\/g, '/')
86
+ : args.path,
87
+ };
88
+ }
89
+ catch (_) { }
90
+ return null;
91
+ });
92
+ // Handle TypeScript and JavaScript files
93
+ build.onLoad({ filter: jsTsRegex }, async (args) => {
94
+ // Determine if this is a TypeScript file
95
+ const isTypeScript = args.path.endsWith('.ts') || args.path.endsWith('.tsx');
96
+ try {
97
+ // Determine the loader based on the output
98
+ let loader = 'js';
99
+ if (!isTypeScript && args.path.endsWith('.jsx')) {
100
+ loader = 'jsx';
101
+ }
102
+ const source = await readFile(args.path, 'utf8');
103
+ // Calculate relative path for SWC plugin
104
+ // The filename parameter is used to generate workflowId/stepId, so it must be relative
105
+ const workingDir = build.initialOptions.absWorkingDir || process.cwd();
106
+ // Normalize paths: convert backslashes to forward slashes and remove trailing slashes
107
+ const normalizedWorkingDir = workingDir
108
+ .replace(/\\/g, '/')
109
+ .replace(/\/$/, '');
110
+ const normalizedPath = args.path.replace(/\\/g, '/');
111
+ // Windows fix: Always do case-insensitive path comparison as the PRIMARY logic
112
+ // to work around node:path.relative() not recognizing paths with different drive
113
+ // letter casing (e.g., D: vs d:) as being in the same tree
114
+ const lowerWd = normalizedWorkingDir.toLowerCase();
115
+ const lowerPath = normalizedPath.toLowerCase();
116
+ let relativeFilepath;
117
+ if (lowerPath.startsWith(lowerWd + '/')) {
118
+ // File is under working directory - manually calculate relative path
119
+ // This ensures we get a relative path even with drive letter casing issues
120
+ relativeFilepath = normalizedPath.substring(normalizedWorkingDir.length + 1);
121
+ }
122
+ else if (lowerPath === lowerWd) {
123
+ // File IS the working directory
124
+ relativeFilepath = '.';
125
+ }
126
+ else {
127
+ // File is outside working directory - use relative() and strip ../ prefixes if needed
128
+ relativeFilepath = relative(normalizedWorkingDir, normalizedPath).replace(/\\/g, '/');
129
+ // Handle files discovered outside the working directory
130
+ // These come back as ../path/to/file, but we want just path/to/file
131
+ if (relativeFilepath.startsWith('../')) {
132
+ relativeFilepath = relativeFilepath
133
+ .split('/')
134
+ .filter((part) => part !== '..')
135
+ .join('/');
136
+ }
137
+ }
138
+ // Final safety check - ensure we never pass an absolute path to SWC
139
+ if (relativeFilepath.includes(':') ||
140
+ relativeFilepath.startsWith('/')) {
141
+ // This should never happen, but if it does, use just the filename as last resort
142
+ console.error(`[ERROR] relativeFilepath is still absolute: ${relativeFilepath}`);
143
+ relativeFilepath = normalizedPath.split('/').pop() || 'unknown.ts';
144
+ }
145
+ const { code: transformedCode, workflowManifest } = await applySwcTransform(relativeFilepath, source, options.mode,
146
+ // we need to provide the tsconfig/jsconfig
147
+ // alias via swc so that we can resolve them
148
+ // with our custom resolve logic
149
+ {
150
+ paths: options.tsPaths,
151
+ baseUrl: options.tsBaseUrl,
152
+ });
153
+ if (!options.workflowManifest) {
154
+ options.workflowManifest = {};
155
+ }
156
+ options.workflowManifest.workflows = Object.assign(options.workflowManifest.workflows || {}, workflowManifest.workflows);
157
+ options.workflowManifest.steps = Object.assign(options.workflowManifest.steps || {}, workflowManifest.steps);
158
+ return {
159
+ contents: transformedCode,
160
+ loader,
161
+ };
162
+ }
163
+ catch (error) {
164
+ const errorMessage = error instanceof Error ? error.message : String(error);
165
+ console.error(`❌ SWC transform error in ${args.path}:`, errorMessage);
166
+ return {
167
+ errors: [
168
+ {
169
+ text: `SWC transform failed: ${errorMessage}`,
170
+ location: { file: args.path, line: 0, column: 0 },
171
+ },
172
+ ],
173
+ };
174
+ }
175
+ });
176
+ },
177
+ };
178
+ }
179
+ //# sourceMappingURL=swc-esbuild-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swc-esbuild-plugin.js","sourceRoot":"","sources":["../src/swc-esbuild-plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ export declare const validBuildTargets: readonly ["standalone", "vercel-build-output-api", "next", "sveltekit"];
2
+ export type BuildTarget = (typeof validBuildTargets)[number];
3
+ /**
4
+ * Common configuration options shared across all builder types.
5
+ */
6
+ interface BaseWorkflowConfig {
7
+ watch?: boolean;
8
+ dirs: string[];
9
+ workingDir: string;
10
+ clientBundlePath?: string;
11
+ externalPackages?: string[];
12
+ workflowManifestPath?: string;
13
+ }
14
+ /**
15
+ * Configuration for standalone (CLI-based) builds.
16
+ */
17
+ export interface StandaloneConfig extends BaseWorkflowConfig {
18
+ buildTarget: 'standalone';
19
+ stepsBundlePath: string;
20
+ workflowsBundlePath: string;
21
+ webhookBundlePath: string;
22
+ }
23
+ /**
24
+ * Configuration for Vercel Build Output API builds.
25
+ */
26
+ export interface VercelBuildOutputConfig extends BaseWorkflowConfig {
27
+ buildTarget: 'vercel-build-output-api';
28
+ stepsBundlePath: string;
29
+ workflowsBundlePath: string;
30
+ webhookBundlePath: string;
31
+ }
32
+ /**
33
+ * Configuration for Next.js builds.
34
+ */
35
+ export interface NextConfig extends BaseWorkflowConfig {
36
+ buildTarget: 'next';
37
+ stepsBundlePath: string;
38
+ workflowsBundlePath: string;
39
+ webhookBundlePath: string;
40
+ }
41
+ /**
42
+ * Configuration for SvelteKit builds.
43
+ */
44
+ export interface SvelteKitConfig extends BaseWorkflowConfig {
45
+ buildTarget: 'sveltekit';
46
+ stepsBundlePath: string;
47
+ workflowsBundlePath: string;
48
+ webhookBundlePath: string;
49
+ }
50
+ /**
51
+ * Discriminated union of all builder configuration types.
52
+ */
53
+ export type WorkflowConfig = StandaloneConfig | VercelBuildOutputConfig | NextConfig | SvelteKitConfig;
54
+ export declare function isValidBuildTarget(target: string | undefined): target is BuildTarget;
55
+ export {};
56
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,yEAKpB,CAAC;AACX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D;;GAEG;AACH,UAAU,kBAAkB;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IAKnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAiB,SAAQ,kBAAkB;IAC1D,WAAW,EAAE,YAAY,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,uBAAwB,SAAQ,kBAAkB;IACjE,WAAW,EAAE,yBAAyB,CAAC;IACvC,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,UAAW,SAAQ,kBAAkB;IACpD,WAAW,EAAE,MAAM,CAAC;IAEpB,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,eAAgB,SAAQ,kBAAkB;IACzD,WAAW,EAAE,WAAW,CAAC;IAEzB,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,gBAAgB,GAChB,uBAAuB,GACvB,UAAU,GACV,eAAe,CAAC;AAEpB,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,MAAM,IAAI,WAAW,CAEvB"}
package/dist/types.js ADDED
@@ -0,0 +1,10 @@
1
+ export const validBuildTargets = [
2
+ 'standalone',
3
+ 'vercel-build-output-api',
4
+ 'next',
5
+ 'sveltekit',
6
+ ];
7
+ export function isValidBuildTarget(target) {
8
+ return !!target && validBuildTargets.includes(target);
9
+ }
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,YAAY;IACZ,yBAAyB;IACzB,MAAM;IACN,WAAW;CACH,CAAC;AAwEX,MAAM,UAAU,kBAAkB,CAChC,MAA0B;IAE1B,OAAO,CAAC,CAAC,MAAM,IAAI,iBAAiB,CAAC,QAAQ,CAAC,MAAqB,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,9 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vercel-build-output-api.d.ts","sourceRoot":"","sources":["../src/vercel-build-output-api.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,qBAAa,2BAA4B,SAAQ,WAAW;IACpD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAwBd,kBAAkB;YA+BlB,sBAAsB;YA6BtB,oBAAoB;YA0BpB,uBAAuB;CA0BtC"}
@@ -0,0 +1,92 @@
1
+ import { mkdir, writeFile } from 'node:fs/promises';
2
+ import { join, resolve } from 'node:path';
3
+ import { BaseBuilder } from './base-builder.js';
4
+ import { STEP_QUEUE_TRIGGER, WORKFLOW_QUEUE_TRIGGER } from './constants.js';
5
+ export class VercelBuildOutputAPIBuilder extends BaseBuilder {
6
+ async build() {
7
+ const outputDir = resolve(this.config.workingDir, '.vercel/output');
8
+ const functionsDir = join(outputDir, 'functions');
9
+ const workflowGeneratedDir = join(functionsDir, '.well-known/workflow/v1');
10
+ // Ensure output directories exist
11
+ await mkdir(workflowGeneratedDir, { recursive: true });
12
+ const inputFiles = await this.getInputFiles();
13
+ const tsConfig = await this.getTsConfigOptions();
14
+ const options = {
15
+ inputFiles,
16
+ workflowGeneratedDir,
17
+ tsBaseUrl: tsConfig.baseUrl,
18
+ tsPaths: tsConfig.paths,
19
+ };
20
+ await this.buildStepsFunction(options);
21
+ await this.buildWorkflowsFunction(options);
22
+ await this.buildWebhookFunction(options);
23
+ await this.createBuildOutputConfig(outputDir);
24
+ await this.createClientLibrary();
25
+ }
26
+ async buildStepsFunction({ inputFiles, workflowGeneratedDir, tsPaths, tsBaseUrl, }) {
27
+ console.log('Creating Vercel Build Output API steps function');
28
+ const stepsFuncDir = join(workflowGeneratedDir, 'step.func');
29
+ await mkdir(stepsFuncDir, { recursive: true });
30
+ // Create steps bundle
31
+ await this.createStepsBundle({
32
+ inputFiles,
33
+ outfile: join(stepsFuncDir, 'index.js'),
34
+ tsBaseUrl,
35
+ tsPaths,
36
+ });
37
+ // Create package.json and .vc-config.json for steps function
38
+ await this.createPackageJson(stepsFuncDir, 'commonjs');
39
+ await this.createVcConfig(stepsFuncDir, {
40
+ shouldAddSourcemapSupport: true,
41
+ experimentalTriggers: [STEP_QUEUE_TRIGGER],
42
+ });
43
+ }
44
+ async buildWorkflowsFunction({ inputFiles, workflowGeneratedDir, tsPaths, tsBaseUrl, }) {
45
+ console.log('Creating Vercel Build Output API workflows function');
46
+ const workflowsFuncDir = join(workflowGeneratedDir, 'flow.func');
47
+ await mkdir(workflowsFuncDir, { recursive: true });
48
+ await this.createWorkflowsBundle({
49
+ outfile: join(workflowsFuncDir, 'index.js'),
50
+ inputFiles,
51
+ tsBaseUrl,
52
+ tsPaths,
53
+ });
54
+ // Create package.json and .vc-config.json for workflows function
55
+ await this.createPackageJson(workflowsFuncDir, 'commonjs');
56
+ await this.createVcConfig(workflowsFuncDir, {
57
+ experimentalTriggers: [WORKFLOW_QUEUE_TRIGGER],
58
+ });
59
+ }
60
+ async buildWebhookFunction({ workflowGeneratedDir, bundle = true, }) {
61
+ console.log('Creating Vercel Build Output API webhook function');
62
+ const webhookFuncDir = join(workflowGeneratedDir, 'webhook/[token].func');
63
+ // Bundle the webhook route with dependencies resolved
64
+ await this.createWebhookBundle({
65
+ outfile: join(webhookFuncDir, 'index.js'),
66
+ bundle, // Build Output API needs bundling (except in tests)
67
+ });
68
+ // Create package.json and .vc-config.json for webhook function
69
+ await this.createPackageJson(webhookFuncDir, 'commonjs');
70
+ await this.createVcConfig(webhookFuncDir, {
71
+ shouldAddHelpers: false,
72
+ });
73
+ }
74
+ async createBuildOutputConfig(outputDir) {
75
+ // Create config.json for Build Output API
76
+ const buildOutputConfig = {
77
+ version: 3,
78
+ routes: [
79
+ {
80
+ src: '^\\/\\.well-known\\/workflow\\/v1\\/webhook\\/([^\\/]+)$',
81
+ dest: '/.well-known/workflow/v1/webhook/[token]',
82
+ },
83
+ ],
84
+ };
85
+ await writeFile(join(outputDir, 'config.json'), JSON.stringify(buildOutputConfig, null, 2));
86
+ console.log(`Build Output API created at ${outputDir}`);
87
+ console.log('Steps function available at /.well-known/workflow/v1/step');
88
+ console.log('Workflows function available at /.well-known/workflow/v1/flow');
89
+ console.log('Webhook function available at /.well-known/workflow/v1/webhook/[token]');
90
+ }
91
+ }
92
+ //# sourceMappingURL=vercel-build-output-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vercel-build-output-api.js","sourceRoot":"","sources":["../src/vercel-build-output-api.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@workflow/builders",
3
+ "version": "4.0.1-beta.10",
4
+ "description": "Shared builder infrastructure for Workflow DevKit",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ },
13
+ "./base-builder": {
14
+ "types": "./dist/base-builder.d.ts",
15
+ "default": "./dist/base-builder.js"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist"
20
+ ],
21
+ "publishConfig": {
22
+ "access": "public"
23
+ },
24
+ "license": "Apache-2.0",
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "https://github.com/vercel/workflow.git",
28
+ "directory": "packages/builders"
29
+ },
30
+ "devDependencies": {
31
+ "@types/node": "22.19.0",
32
+ "@workflow/tsconfig": "4.0.1-beta.0"
33
+ },
34
+ "dependencies": {
35
+ "@swc/core": "1.11.24",
36
+ "builtin-modules": "5.0.0",
37
+ "chalk": "5.6.2",
38
+ "comment-json": "4.2.5",
39
+ "enhanced-resolve": "5.18.2",
40
+ "esbuild": "^0.25.11",
41
+ "find-up": "7.0.0",
42
+ "tinyglobby": "0.2.14",
43
+ "@workflow/errors": "4.0.1-beta.5",
44
+ "@workflow/core": "4.0.1-beta.12",
45
+ "@workflow/swc-plugin": "4.0.1-beta.6"
46
+ },
47
+ "scripts": {
48
+ "build": "tsc",
49
+ "clean": "tsc --build --clean && rm -r dist ||:",
50
+ "dev": "tsc --watch",
51
+ "test": "vitest run src",
52
+ "typecheck": "tsc --noEmit"
53
+ }
54
+ }