@workflow/sveltekit 5.0.0-beta.5 → 5.0.0-beta.50

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/dist/builder.d.ts CHANGED
@@ -1,8 +1,11 @@
1
1
  import { BaseBuilder, type SvelteKitConfig } from '@workflow/builders';
2
2
  export declare class SvelteKitBuilder extends BaseBuilder {
3
- constructor(config?: Partial<SvelteKitConfig>);
3
+ #private;
4
+ constructor(config?: Partial<SvelteKitConfig> & {
5
+ routesDir?: string;
6
+ });
4
7
  build(): Promise<void>;
5
8
  private buildWebhookRoute;
6
- private findRoutesDirectory;
9
+ private loadRoutesDirectory;
7
10
  }
8
11
  //# sourceMappingURL=builder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAWA,OAAO,EACL,WAAW,EAEX,KAAK,eAAe,EACrB,MAAM,oBAAoB,CAAC;AAS5B,qBAAa,gBAAiB,SAAQ,WAAW;gBACnC,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC;IAgB9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YA6EvB,iBAAiB;YAqDjB,mBAAmB;CA8BlC"}
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,WAAW,EAIX,KAAK,eAAe,EAErB,MAAM,oBAAoB,CAAC;AAS5B,qBAAa,gBAAiB,SAAQ,WAAW;;gBAGnC,MAAM,GAAE,OAAO,CAAC,eAAe,CAAC,GAAG;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO;IA8B3D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAoFvB,iBAAiB;YAwDjB,mBAAmB;CAIlC"}
package/dist/builder.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { constants } from 'node:fs';
2
- import { access, copyFile, mkdir, readFile, rm, stat, writeFile, } from 'node:fs/promises';
2
+ import { access, mkdir, readFile, rm, stat } from 'node:fs/promises';
3
3
  import { join, resolve } from 'node:path';
4
- import { BaseBuilder, NORMALIZE_REQUEST_CODE, } from '@workflow/builders';
4
+ import { BaseBuilder, createBaseBuilderConfig, NORMALIZE_REQUEST_CODE, resolveProjectRoot, writeFileIfChanged, } from '@workflow/builders';
5
5
  const SVELTEKIT_VIRTUAL_MODULES = [
6
6
  '$env/*', // All $env subpaths
7
7
  '$lib', // Exact $lib import
@@ -9,29 +9,44 @@ const SVELTEKIT_VIRTUAL_MODULES = [
9
9
  '$app/*', // All $app subpaths
10
10
  ];
11
11
  export class SvelteKitBuilder extends BaseBuilder {
12
- constructor(config) {
13
- const workingDir = config?.workingDir || process.cwd();
12
+ #routesDir;
13
+ constructor(config = {}) {
14
+ const workingDir = resolve(config.workingDir || process.cwd());
15
+ const dirs = config.dirs ?? [
16
+ 'workflows',
17
+ 'src/workflows',
18
+ 'routes',
19
+ 'src/routes',
20
+ ];
21
+ const projectRoot = config.projectRoot ?? resolveProjectRoot(workingDir);
22
+ const routesDir = resolve(workingDir, config.routesDir ?? 'src/routes');
14
23
  super({
24
+ ...createBaseBuilderConfig({
25
+ workingDir,
26
+ projectRoot,
27
+ dirs,
28
+ watch: config.watch,
29
+ externalPackages: [...SVELTEKIT_VIRTUAL_MODULES],
30
+ sourcemap: config.sourcemap,
31
+ }),
15
32
  ...config,
16
- dirs: ['workflows', 'src/workflows', 'routes', 'src/routes'],
33
+ dirs,
17
34
  buildTarget: 'sveltekit',
18
- stepsBundlePath: '', // unused in base
19
- workflowsBundlePath: '', // unused in base
20
- webhookBundlePath: '', // unused in base
21
35
  workingDir,
36
+ projectRoot,
37
+ moduleSpecifierRoot: config.moduleSpecifierRoot ?? workingDir,
22
38
  externalPackages: [...SVELTEKIT_VIRTUAL_MODULES],
23
- sourcemap: config?.sourcemap,
24
39
  });
40
+ this.#routesDir = routesDir;
25
41
  }
26
42
  async build() {
27
- // Find SvelteKit routes directory (src/routes or routes)
28
- const routesDir = await this.findRoutesDirectory();
43
+ const routesDir = await this.loadRoutesDirectory();
29
44
  const workflowGeneratedDir = join(routesDir, '.well-known/workflow/v1');
30
45
  // Ensure output directories exist
31
46
  await mkdir(workflowGeneratedDir, { recursive: true });
32
47
  // Add .gitignore to exclude generated files from version control
33
48
  if (process.env.VERCEL_DEPLOYMENT_ID === undefined) {
34
- await writeFile(join(workflowGeneratedDir, '.gitignore'), '*');
49
+ await writeFileIfChanged(join(workflowGeneratedDir, '.gitignore'), '*');
35
50
  }
36
51
  // Clean up stale V1 step route directory (may persist via Vercel build cache)
37
52
  await rm(join(workflowGeneratedDir, 'step'), {
@@ -57,12 +72,15 @@ export class SvelteKitBuilder extends BaseBuilder {
57
72
  const workflowsRouteFile = join(flowRouteDir, '+server.js');
58
73
  let workflowsRouteContent = await readFile(workflowsRouteFile, 'utf-8');
59
74
  // Replace the default export with SvelteKit-compatible handler
60
- workflowsRouteContent = workflowsRouteContent.replace(/export const POST = workflowEntrypoint\(workflowCode\);?$/m, `${NORMALIZE_REQUEST_CODE}
75
+ workflowsRouteContent = workflowsRouteContent.replace(/export const POST = workflowEntrypoint\(workflowCode(?<options>[^)]*)\);?$/m, (_match, options = '') => `${NORMALIZE_REQUEST_CODE}
61
76
  export const POST = async ({request}) => {
62
77
  const normalRequest = await normalizeRequest(request);
63
- return workflowEntrypoint(workflowCode)(normalRequest);
78
+ return workflowEntrypoint(workflowCode${options})(normalRequest);
64
79
  }`);
65
- await writeFile(workflowsRouteFile, workflowsRouteContent);
80
+ // These files are generated into the SvelteKit routes directory, which
81
+ // Vite watches in dev, so an identical rewrite would still invalidate the
82
+ // module and force a redundant recompile.
83
+ await writeFileIfChanged(workflowsRouteFile, workflowsRouteContent);
66
84
  await this.buildWebhookRoute({ workflowGeneratedDir });
67
85
  // Generate unified manifest
68
86
  const workflowBundlePath = join(workflowGeneratedDir, 'flow/+server.js');
@@ -76,7 +94,12 @@ export const POST = async ({request}) => {
76
94
  if (this.shouldExposePublicManifest && manifestJson) {
77
95
  const staticManifestDir = join(this.config.workingDir, 'static/.well-known/workflow/v1');
78
96
  await mkdir(staticManifestDir, { recursive: true });
79
- await copyFile(join(workflowGeneratedDir, 'manifest.json'), join(staticManifestDir, 'manifest.json'));
97
+ if (process.env.VERCEL_DEPLOYMENT_ID === undefined) {
98
+ await writeFileIfChanged(join(staticManifestDir, '.gitignore'), '*');
99
+ }
100
+ // Written from the same string rather than copied, so an unchanged
101
+ // manifest leaves the static copy untouched too.
102
+ await writeFileIfChanged(join(staticManifestDir, 'manifest.json'), manifestJson);
80
103
  }
81
104
  }
82
105
  async buildWebhookRoute({ workflowGeneratedDir, }) {
@@ -92,11 +115,14 @@ export const POST = async ({request}) => {
92
115
  webhookRouteContent = webhookRouteContent.replace(/async function handler\(request\) \{[\s\S]*?const token = decodeURIComponent\(pathParts\[pathParts\.length - 1\]\);/, `async function handler(request, token) {`);
93
116
  // Remove the URL parsing code since we get token from params
94
117
  webhookRouteContent = webhookRouteContent.replace(/const url = new URL\(request\.url\);[\s\S]*?const pathParts = url\.pathname\.split\('\/'\);[\s\S]*?\n/, '');
95
- // Replace all HTTP method exports with SvelteKit-compatible handlers
96
- webhookRouteContent = webhookRouteContent.replace(/export const GET = handler;\nexport const POST = handler;\nexport const PUT = handler;\nexport const PATCH = handler;\nexport const DELETE = handler;\nexport const HEAD = handler;\nexport const OPTIONS = handler;/, `${NORMALIZE_REQUEST_CODE}
97
- const createSvelteKitHandler = (method) => async ({ request, params, platform }) => {
98
- const normalRequest = await normalizeRequest(request);
99
- const response = await handler(normalRequest, params.token);
118
+ // Replace all HTTP method exports with SvelteKit-compatible handlers.
119
+ // The `request` from SvelteKit is already a standard `Request`, so it is
120
+ // handed to the webhook handler as-is. Notably it must NOT be copied via
121
+ // a normalizer that buffers the body: this is a public route where the
122
+ // token is checked inside `handler`, so the body must stay unread until
123
+ // the token has been accepted.
124
+ webhookRouteContent = webhookRouteContent.replace(/export const GET = handler;\nexport const POST = handler;\nexport const PUT = handler;\nexport const PATCH = handler;\nexport const DELETE = handler;\nexport const HEAD = handler;\nexport const OPTIONS = handler;/, `const createSvelteKitHandler = (method) => async ({ request, params, platform }) => {
125
+ const response = await handler(request, params.token);
100
126
  return response;
101
127
  };
102
128
 
@@ -107,34 +133,18 @@ export const PATCH = createSvelteKitHandler('PATCH');
107
133
  export const DELETE = createSvelteKitHandler('DELETE');
108
134
  export const HEAD = createSvelteKitHandler('HEAD');
109
135
  export const OPTIONS = createSvelteKitHandler('OPTIONS');`);
110
- await writeFile(webhookRouteFile, webhookRouteContent);
136
+ await writeFileIfChanged(webhookRouteFile, webhookRouteContent);
111
137
  }
112
- async findRoutesDirectory() {
113
- const routesDir = resolve(this.config.workingDir, 'src/routes');
114
- const rootRoutesDir = resolve(this.config.workingDir, 'routes');
115
- // Try src/routes first (standard SvelteKit convention)
116
- try {
117
- await access(routesDir, constants.F_OK);
118
- const routesStats = await stat(routesDir);
119
- if (!routesStats.isDirectory()) {
120
- throw new Error(`Path exists but is not a directory: ${routesDir}`);
121
- }
122
- return routesDir;
123
- }
124
- catch {
125
- // Try routes as fallback
126
- try {
127
- await access(rootRoutesDir, constants.F_OK);
128
- const rootRoutesStats = await stat(rootRoutesDir);
129
- if (!rootRoutesStats.isDirectory()) {
130
- throw new Error(`Path exists but is not a directory: ${rootRoutesDir}`);
131
- }
132
- return rootRoutesDir;
133
- }
134
- catch {
135
- throw new Error('Could not find SvelteKit routes directory. Expected either "src/routes" or "routes" to exist.');
136
- }
137
- }
138
+ async loadRoutesDirectory() {
139
+ await assertDirectory(this.#routesDir);
140
+ return this.#routesDir;
141
+ }
142
+ }
143
+ async function assertDirectory(path) {
144
+ await access(path, constants.F_OK);
145
+ const stats = await stat(path);
146
+ if (!stats.isDirectory()) {
147
+ throw new Error(`Path exists but is not a directory: ${path}`);
138
148
  }
139
149
  }
140
- //# sourceMappingURL=builder.js.map
150
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDcEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMxQyxPQUFPLEVBQ0wsV0FBVyxFQUNYLHVCQUF1QixFQUN2QixzQkFBc0IsRUFDdEIsa0JBQWtCLEVBRWxCLGtCQUFrQixHQUNuQixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE1BQU0seUJBQXlCLEdBQUc7SUFDaEMsUUFBUSxFQUFFLG9CQUFvQjtJQUM5QixNQUFNLEVBQUUsb0JBQW9CO0lBQzVCLFFBQVEsRUFBRSxvQkFBb0I7SUFDOUIsUUFBUSxFQUFFLG9CQUFvQjtDQUMvQixDQUFDO0FBRUYsTUFBTSxPQUFPLGdCQUFpQixTQUFRLFdBQVc7SUFDL0MsVUFBVSxDQUFTO0lBRW5CLFlBQVksU0FBNEQsRUFBRTtRQUN4RSxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUMvRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJO1lBQzFCLFdBQVc7WUFDWCxlQUFlO1lBQ2YsUUFBUTtZQUNSLFlBQVk7U0FDYixDQUFDO1FBQ0YsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsSUFBSSxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN6RSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxTQUFTLElBQUksWUFBWSxDQUFDLENBQUM7UUFDeEUsS0FBSyxDQUFD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cyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgYWNjZXNzLCBta2RpciwgcmVhZEZpbGUsIHJtLCBzdGF0IH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBqb2luLCByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7XG4gIEJhc2VCdWlsZGVyLFxuICBjcmVhdGVCYXNlQnVpbGRlckNvbmZpZyxcbiAgTk9STUFMSVpFX1JFUVVFU1RfQ09ERSxcbiAgcmVzb2x2ZVByb2plY3RSb290LFxuICB0eXBlIFN2ZWx0ZUtpdENvbmZpZyxcbiAgd3JpdGVGaWxlSWZDaGFuZ2VkLFxufSBmcm9tICdAd29ya2Zsb3cvYnVpbGRlcnMnO1xuXG5jb25zdCBTVkVMVEVLSVRfVklSVFVBTF9NT0RVTEVTID0gW1xuICAnJGVudi8qJywgLy8gQWxsICRlbnYgc3VicGF0aHNcbiAgJyRsaWInLCAvLyBFeGFjdCAkbGliIGltcG9ydFxuICAnJGxpYi8qJywgLy8gQWxsICRsaWIgc3VicGF0aHNcbiAgJyRhcHAvKicsIC8vIEFsbCAkYXBwIHN1YnBhdGhzXG5dO1xuXG5leHBvcnQgY2xhc3MgU3ZlbHRlS2l0QnVpbGRlciBleHRlbmRzIEJhc2VCdWlsZGVyIHtcbiAgI3JvdXRlc0Rpcjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogUGFydGlhbDxTdmVsdGVLaXRDb25maWc+ICYgeyByb3V0ZXNEaXI/OiBzdHJpbmcgfSA9IHt9KSB7XG4gICAgY29uc3Qgd29ya2luZ0RpciA9IHJlc29sdmUoY29uZmlnLndvcmtpbmdEaXIgfHwgcHJvY2Vzcy5jd2QoKSk7XG4gICAgY29uc3QgZGlycyA9IGNvbmZpZy5kaXJzID8/IFtcbiAgICAgICd3b3JrZmxvd3MnLFxuICAgICAgJ3NyYy93b3JrZmxvd3MnLFxuICAgICAgJ3JvdXRlcycsXG4gICAgICAnc3JjL3JvdXRlcycsXG4gICAgXTtcbiAgICBjb25zdCBwcm9qZWN0Um9vdCA9IGNvbmZpZy5wcm9qZWN0Um9vdCA/PyByZXNvbHZlUHJvamVjdFJvb3Qod29ya2luZ0Rpcik7XG4gICAgY29uc3Qgcm91dGVzRGlyID0gcmVzb2x2ZSh3b3JraW5nRGlyLCBjb25maWcucm91dGVzRGlyID8/ICdzcmMvcm91dGVzJyk7XG4gICAgc3VwZXIoe1xuICAgICAgLi4uY3JlYXRlQmFzZUJ1aWxkZXJDb25maWcoe1xuICAgICAgICB3b3JraW5nRGlyLFxuICAgICAgICBwcm9qZWN0Um9vdCxcbiAgICAgICAgZGlycyxcbiAgICAgICAgd2F0Y2g6IGNvbmZpZy53YXRjaCxcbiAgICAgICAgZXh0ZXJuYWxQYWNrYWdlczogWy4uLlNWRUxURUtJVF9WSVJUVUFMX01PRFVMRVNdLFxuICAgICAgICBzb3VyY2VtYXA6IGNvbmZpZy5zb3VyY2VtYXAsXG4gICAgICB9KSxcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIGRpcnMsXG4gICAgICBidWlsZFRhcmdldDogJ3N2ZWx0ZWtpdCcgYXMgY29uc3QsXG4gICAgICB3b3JraW5nRGlyLFxuICAgICAgcHJvamVjdFJvb3QsXG4gICAgICBtb2R1bGVTcGVjaWZpZXJSb290OiBjb25maWcubW9kdWxlU3BlY2lmaWVyUm9vdCA/PyB3b3JraW5nRGlyLFxuICAgICAgZXh0ZXJuYWxQYWNrYWdlczogWy4uLlNWRUxURUtJVF9WSVJUVUFMX01PRFVMRVNdLFxuICAgIH0pO1xuICAgIHRoaXMuI3JvdXRlc0RpciA9IHJvdXRlc0RpcjtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGJ1aWxkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJvdXRlc0RpciA9IGF3YWl0IHRoaXMubG9hZFJvdXRlc0RpcmVjdG9yeSgpO1xuICAgIGNvbnN0IHdvcmtmbG93R2VuZXJhdGVkRGlyID0gam9pbihyb3V0ZXNEaXIsICcud2VsbC1rbm93bi93b3JrZmxvdy92MScpO1xuXG4gICAgLy8gRW5zdXJlIG91dHB1dCBkaXJlY3RvcmllcyBleGlzdFxuICAgIGF3YWl0IG1rZGlyKHdvcmtmbG93R2VuZXJhdGVkRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIEFkZCAuZ2l0aWdub3JlIHRvIGV4Y2x1ZGUgZ2VuZXJhdGVkIGZpbGVzIGZyb20gdmVyc2lvbiBjb250cm9sXG4gICAgaWYgKHByb2Nlc3MuZW52LlZFUkNFTF9ERVBMT1lNRU5UX0lEID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZUlmQ2hhbmdlZChqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCAnLmdpdGlnbm9yZScpLCAnKicpO1xuICAgIH1cblxuICAgIC8vIENsZWFuIHVwIHN0YWxlIFYxIHN0ZXAgcm91dGUgZGlyZWN0b3J5IChtYXkgcGVyc2lzdCB2aWEgVmVyY2VsIGJ1aWxkIGNhY2hlKVxuICAgIGF3YWl0IHJtKGpvaW4od29ya2Zsb3dHZW5lcmF0ZWREaXIsICdzdGVwJyksIHtcbiAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgIGZvcmNlOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gR2V0IHdvcmtmbG93IGFuZCBzdGVwIGZpbGVzIHRvIGJ1bmRsZVxuICAgIGNvbnN0IGlucHV0RmlsZXMgPSBhd2FpdCB0aGlzLmdldElucHV0RmlsZXMoKTtcbiAgICBjb25zdCB0c2NvbmZpZ1BhdGggPSBhd2FpdCB0aGlzLmZpbmRUc0NvbmZpZ1BhdGgoKTtcblxuICAgIC8vIENyZWF0ZSBjb21iaW5lZCBidW5kbGUgZm9yIGZsb3cgcm91dGVcbiAgICBjb25zdCBmbG93Um91dGVEaXIgPSBqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCAnZmxvdycpO1xuICAgIGF3YWl0IG1rZGlyKGZsb3dSb3V0ZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBjb25zdCB7IG1hbmlmZXN0IH0gPSBhd2FpdCB0aGlzLmNyZWF0ZUNvbWJpbmVkQnVuZGxlKHtcbiAgICAgIGlucHV0RmlsZXMsXG4gICAgICBzdGVwc091dGZpbGU6IGpvaW4oZmxvd1JvdXRlRGlyLCAnX19zdGVwX3JlZ2lzdHJhdGlvbnMuanMnKSxcbiAgICAgIGZsb3dPdXRmaWxlOiBqb2luKGZsb3dSb3V0ZURpciwgJytzZXJ2ZXIuanMnKSxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBidW5kbGVGaW5hbE91dHB1dDogZmFsc2UsXG4gICAgICBleHRlcm5hbGl6ZU5vblN0ZXBzOiB0cnVlLFxuICAgICAgdHNjb25maWdQYXRoLFxuICAgIH0pO1xuXG4gICAgLy8gUG9zdC1wcm9jZXNzIHRoZSBnZW5lcmF0ZWQgZmlsZSB0byB3cmFwIHdpdGggU3ZlbHRlS2l0IHJlcXVlc3QgY29udmVydGVyXG4gICAgY29uc3Qgd29ya2Zsb3dzUm91dGVGaWxlID0gam9pbihmbG93Um91dGVEaXIsICcrc2VydmVyLmpzJyk7XG4gICAgbGV0IHdvcmtmbG93c1JvdXRlQ29udGVudCA9IGF3YWl0IHJlYWRGaWxlKHdvcmtmbG93c1JvdXRlRmlsZSwgJ3V0Zi04Jyk7XG5cbiAgICAvLyBSZXBsYWNlIHRoZSBkZWZhdWx0IGV4cG9ydCB3aXRoIFN2ZWx0ZUtpdC1jb21wYXRpYmxlIGhhbmRsZXJcbiAgICB3b3JrZmxvd3NSb3V0ZUNvbnRlbnQgPSB3b3JrZmxvd3NSb3V0ZUNvbnRlbnQucmVwbGFjZShcbiAgICAgIC9leHBvcnQgY29uc3QgUE9TVCA9IHdvcmtmbG93RW50cnlwb2ludFxcKHdvcmtmbG93Q29kZSg/PG9wdGlvbnM+W14pXSopXFwpOz8kL20sXG4gICAgICAoX21hdGNoLCBvcHRpb25zID0gJycpID0+IGAke05PUk1BTElaRV9SRVFVRVNUX0NPREV9XG5leHBvcnQgY29uc3QgUE9TVCA9IGFzeW5jICh7cmVxdWVzdH0pID0+IHtcbiAgY29uc3Qgbm9ybWFsUmVxdWVzdCA9IGF3YWl0IG5vcm1hbGl6ZVJlcXVlc3QocmVxdWVzdCk7XG4gIHJldHVybiB3b3JrZmxvd0VudHJ5cG9pbnQod29ya2Zsb3dDb2RlJHtvcHRpb25zfSkobm9ybWFsUmVxdWVzdCk7XG59YFxuICAgICk7XG4gICAgLy8gVGhlc2UgZmlsZXMgYXJlIGdlbmVyYXRlZCBpbnRvIHRoZSBTdmVsdGVLaXQgcm91dGVzIGRpcmVjdG9yeSwgd2hpY2hcbiAgICAvLyBWaXRlIHdhdGNoZXMgaW4gZGV2LCBzbyBhbiBpZGVudGljYWwgcmV3cml0ZSB3b3VsZCBzdGlsbCBpbnZhbGlkYXRlIHRoZVxuICAgIC8vIG1vZHVsZSBhbmQgZm9yY2UgYSByZWR1bmRhbnQgcmVjb21waWxlLlxuICAgIGF3YWl0IHdyaXRlRmlsZUlmQ2hhbmdlZCh3b3JrZmxvd3NSb3V0ZUZpbGUsIHdvcmtmbG93c1JvdXRlQ29udGVudCk7XG5cbiAgICBhd2FpdCB0aGlzLmJ1aWxkV2ViaG9va1JvdXRlKHsgd29ya2Zsb3dHZW5lcmF0ZWREaXIgfSk7XG5cbiAgICAvLyBHZW5lcmF0ZSB1bmlmaWVkIG1hbmlmZXN0XG4gICAgY29uc3Qgd29ya2Zsb3dCdW5kbGVQYXRoID0gam9pbih3b3JrZmxvd0dlbmVyYXRlZERpciwgJ2Zsb3cvK3NlcnZlci5qcycpO1xuICAgIGNvbnN0IG1hbmlmZXN0SnNvbiA9IGF3YWl0IHRoaXMuY3JlYXRlTWFuaWZlc3Qoe1xuICAgICAgd29ya2Zsb3dCdW5kbGVQYXRoLFxuICAgICAgbWFuaWZlc3REaXI6IHdvcmtmbG93R2VuZXJhdGVkRGlyLFxuICAgICAgbWFuaWZlc3QsXG4gICAgfSk7XG5cbiAgICAvLyBFeHBvc2UgbWFuaWZlc3QgYXMgYSBzdGF0aWMgZmlsZSB3aGVuIFdPUktGTE9XX1BVQkxJQ19NQU5JRkVTVD0xLlxuICAgIC8vIFN2ZWx0ZUtpdCBzZXJ2ZXMgZmlsZXMgZnJvbSBzdGF0aWMvIGF0IHRoZSByb290IFVSTC5cbiAgICBpZiAodGhpcy5zaG91bGRFeHBvc2VQdWJsaWNNYW5pZmVzdCAmJiBtYW5pZmVzdEpzb24pIHtcbiAgICAgIGNvbnN0IHN0YXRpY01hbmlmZXN0RGlyID0gam9pbihcbiAgICAgICAgdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgICAgJ3N0YXRpYy8ud2VsbC1rbm93bi93b3JrZmxvdy92MSdcbiAgICAgICk7XG4gICAgICBhd2FpdCBta2RpcihzdGF0aWNNYW5pZmVzdERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuVkVSQ0VMX0RFUExPWU1FTlRfSUQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGVJZkNoYW5nZWQoam9pbihzdGF0aWNNYW5pZmVzdERpciwgJy5naXRpZ25vcmUnKSwgJyonKTtcbiAgICAgIH1cbiAgICAgIC8vIFdyaXR0ZW4gZnJvbSB0aGUgc2FtZSBzdHJpbmcgcmF0aGVyIHRoYW4gY29waWVkLCBzbyBhbiB1bmNoYW5nZWRcbiAgICAgIC8vIG1hbmlmZXN0IGxlYXZlcyB0aGUgc3RhdGljIGNvcHkgdW50b3VjaGVkIHRvby5cbiAgICAgIGF3YWl0IHdyaXRlRmlsZUlmQ2hhbmdlZChcbiAgICAgICAgam9pbihzdGF0aWNNYW5pZmVzdERpciwgJ21hbmlmZXN0Lmpzb24nKSxcbiAgICAgICAgbWFuaWZlc3RKc29uXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRXZWJob29rUm91dGUoe1xuICAgIHdvcmtmbG93R2VuZXJhdGVkRGlyLFxuICB9OiB7XG4gICAgd29ya2Zsb3dHZW5lcmF0ZWREaXI6IHN0cmluZztcbiAgfSkge1xuICAgIC8vIENyZWF0ZSB3ZWJob29rIHJvdXRlOiAud2VsbC1rbm93bi93b3JrZmxvdy92MS93ZWJob29rL1t0b2tlbl0vK3NlcnZlci5qc1xuICAgIGNvbnN0IHdlYmhvb2tSb3V0ZUZpbGUgPSBqb2luKFxuICAgICAgd29ya2Zsb3dHZW5lcmF0ZWREaXIsXG4gICAgICAnd2ViaG9vay9bdG9rZW5dLytzZXJ2ZXIuanMnXG4gICAgKTtcblxuICAgIGF3YWl0IHRoaXMuY3JlYXRlV2ViaG9va0J1bmRsZSh7XG4gICAgICBvdXRmaWxlOiB3ZWJob29rUm91dGVGaWxlLFxuICAgICAgYnVuZGxlOiBmYWxzZSwgLy8gU3ZlbHRlS2l0IHdpbGwgaGFuZGxlIGJ1bmRsaW5nXG4gICAgfSk7XG5cbiAgICAvLyBQb3N0LXByb2Nlc3MgdGhlIGdlbmVyYXRlZCBmaWxlIHRvIHdyYXAgd2l0aCBTdmVsdGVLaXQgcmVxdWVzdCBjb252ZXJ0ZXJcbiAgICBsZXQgd2ViaG9va1JvdXRlQ29udGVudCA9IGF3YWl0IHJlYWRGaWxlKHdlYmhvb2tSb3V0ZUZpbGUsICd1dGYtOCcpO1xuXG4gICAgLy8gVXBkYXRlIGhhbmRsZXIgc2lnbmF0dXJlIHRvIGFjY2VwdCB0b2tlbiBhcyBwYXJhbWV0ZXJcbiAgICB3ZWJob29rUm91dGVDb250ZW50ID0gd2ViaG9va1JvdXRlQ29udGVudC5yZXBsYWNlKFxuICAgICAgL2FzeW5jIGZ1bmN0aW9uIGhhbmRsZXJcXChyZXF1ZXN0XFwpIFxce1tcXHNcXFNdKj9jb25zdCB0b2tlbiA9IGRlY29kZVVSSUNvbXBvbmVudFxcKHBhdGhQYXJ0c1xcW3BhdGhQYXJ0c1xcLmxlbmd0aCAtIDFcXF1cXCk7LyxcbiAgICAgIGBhc3luYyBmdW5jdGlvbiBoYW5kbGVyKHJlcXVlc3QsIHRva2VuKSB7YFxuICAgICk7XG5cbiAgICAvLyBSZW1vdmUgdGhlIFVSTCBwYXJzaW5nIGNvZGUgc2luY2Ugd2UgZ2V0IHRva2VuIGZyb20gcGFyYW1zXG4gICAgd2ViaG9va1JvdXRlQ29udGVudCA9IHdlYmhvb2tSb3V0ZUNvbnRlbnQucmVwbGFjZShcbiAgICAgIC9jb25zdCB1cmwgPSBuZXcgVVJMXFwocmVxdWVzdFxcLnVybFxcKTtbXFxzXFxTXSo/Y29uc3QgcGF0aFBhcnRzID0gdXJsXFwucGF0aG5hbWVcXC5zcGxpdFxcKCdcXC8nXFwpO1tcXHNcXFNdKj9cXG4vLFxuICAgICAgJydcbiAgICApO1xuXG4gICAgLy8gUmVwbGFjZSBhbGwgSFRUUCBtZXRob2QgZXhwb3J0cyB3aXRoIFN2ZWx0ZUtpdC1jb21wYXRpYmxlIGhhbmRsZXJzLlxuICAgIC8vIFRoZSBgcmVxdWVzdGAgZnJvbSBTdmVsdGVLaXQgaXMgYWxyZWFkeSBhIHN0YW5kYXJkIGBSZXF1ZXN0YCwgc28gaXQgaXNcbiAgICAvLyBoYW5kZWQgdG8gdGhlIHdlYmhvb2sgaGFuZGxlciBhcy1pcy4gTm90YWJseSBpdCBtdXN0IE5PVCBiZSBjb3BpZWQgdmlhXG4gICAgLy8gYSBub3JtYWxpemVyIHRoYXQgYnVmZmVycyB0aGUgYm9keTogdGhpcyBpcyBhIHB1YmxpYyByb3V0ZSB3aGVyZSB0aGVcbiAgICAvLyB0b2tlbiBpcyBjaGVja2VkIGluc2lkZSBgaGFuZGxlcmAsIHNvIHRoZSBib2R5IG11c3Qgc3RheSB1bnJlYWQgdW50aWxcbiAgICAvLyB0aGUgdG9rZW4gaGFzIGJlZW4gYWNjZXB0ZWQuXG4gICAgd2ViaG9va1JvdXRlQ29udGVudCA9IHdlYmhvb2tSb3V0ZUNvbnRlbnQucmVwbGFjZShcbiAgICAgIC9leHBvcnQgY29uc3QgR0VUID0gaGFuZGxlcjtcXG5leHBvcnQgY29uc3QgUE9TVCA9IGhhbmRsZXI7XFxuZXhwb3J0IGNvbnN0IFBVVCA9IGhhbmRsZXI7XFxuZXhwb3J0IGNvbnN0IFBBVENIID0gaGFuZGxlcjtcXG5leHBvcnQgY29uc3QgREVMRVRFID0gaGFuZGxlcjtcXG5leHBvcnQgY29uc3QgSEVBRCA9IGhhbmRsZXI7XFxuZXhwb3J0IGNvbnN0IE9QVElPTlMgPSBoYW5kbGVyOy8sXG4gICAgICBgY29uc3QgY3JlYXRlU3ZlbHRlS2l0SGFuZGxlciA9IChtZXRob2QpID0+IGFzeW5jICh7IHJlcXVlc3QsIHBhcmFtcywgcGxhdGZvcm0gfSkgPT4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGhhbmRsZXIocmVxdWVzdCwgcGFyYW1zLnRva2VuKTtcbiAgcmV0dXJuIHJlc3BvbnNlO1xufTtcblxuZXhwb3J0IGNvbnN0IEdFVCA9IGNyZWF0ZVN2ZWx0ZUtpdEhhbmRsZXIoJ0dFVCcpO1xuZXhwb3J0IGNvbnN0IFBPU1QgPSBjcmVhdGVTdmVsdGVLaXRIYW5kbGVyKCdQT1NUJyk7XG5leHBvcnQgY29uc3QgUFVUID0gY3JlYXRlU3ZlbHRlS2l0SGFuZGxlcignUFVUJyk7XG5leHBvcnQgY29uc3QgUEFUQ0ggPSBjcmVhdGVTdmVsdGVLaXRIYW5kbGVyKCdQQVRDSCcpO1xuZXhwb3J0IGNvbnN0IERFTEVURSA9IGNyZWF0ZVN2ZWx0ZUtpdEhhbmRsZXIoJ0RFTEVURScpO1xuZXhwb3J0IGNvbnN0IEhFQUQgPSBjcmVhdGVTdmVsdGVLaXRIYW5kbGVyKCdIRUFEJyk7XG5leHBvcnQgY29uc3QgT1BUSU9OUyA9IGNyZWF0ZVN2ZWx0ZUtpdEhhbmRsZXIoJ09QVElPTlMnKTtgXG4gICAgKTtcblxuICAgIGF3YWl0IHdyaXRlRmlsZUlmQ2hhbmdlZCh3ZWJob29rUm91dGVGaWxlLCB3ZWJob29rUm91dGVDb250ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZFJvdXRlc0RpcmVjdG9yeSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGFzc2VydERpcmVjdG9yeSh0aGlzLiNyb3V0ZXNEaXIpO1xuICAgIHJldHVybiB0aGlzLiNyb3V0ZXNEaXI7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gYXNzZXJ0RGlyZWN0b3J5KHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBhY2Nlc3MocGF0aCwgY29uc3RhbnRzLkZfT0spO1xuICBjb25zdCBzdGF0cyA9IGF3YWl0IHN0YXQocGF0aCk7XG4gIGlmICghc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCBleGlzdHMgYnV0IGlzIG5vdCBhIGRpcmVjdG9yeTogJHtwYXRofWApO1xuICB9XG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAiEA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAwDA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -1,11 +1,7 @@
1
1
  import path from 'node:path';
2
+ import { getWorkflowQueueTrigger } from '@workflow/builders';
2
3
  import fs from 'fs-extra';
3
- import { SvelteKitBuilder } from './builder.js';
4
- const builder = new SvelteKitBuilder();
5
- // This needs to be in the top-level as we need to create these
6
- // entries before svelte plugin is started or the entries are
7
- // a race to be created before svelte discovers entries
8
- await builder.build();
4
+ import { stripWorkflowQueueTriggers } from './vc-config.js';
9
5
  process.on('beforeExit', () => {
10
6
  // Don't patch functions output if not in Vercel adapter
11
7
  if (!process.env.VERCEL_DEPLOYMENT_ID) {
@@ -18,15 +14,7 @@ process.on('beforeExit', () => {
18
14
  file: '.vercel/output/functions/.well-known/workflow/v1/flow.func/.vc-config.json',
19
15
  config: {
20
16
  maxDuration: 'max',
21
- experimentalTriggers: [
22
- {
23
- type: 'queue/v2beta',
24
- topic: '__wkf_workflow_*',
25
- consumer: 'default',
26
- retryAfterSeconds: 5,
27
- initialDelaySeconds: 0,
28
- },
29
- ],
17
+ experimentalTriggers: [getWorkflowQueueTrigger()],
30
18
  },
31
19
  },
32
20
  ]) {
@@ -36,11 +24,12 @@ process.on('beforeExit', () => {
36
24
  }
37
25
  // Un-symlink these as they can't be shared due to different
38
26
  // experimental triggers config
27
+ const sourceFuncDir = path.join(funcDir.replace(/\.func$/, ''), '__data.json.func');
39
28
  const toCopy = fs.readdirSync(funcDir);
40
29
  fs.removeSync(funcDir);
41
30
  fs.mkdirSync(funcDir, { recursive: true });
42
31
  for (const item of toCopy) {
43
- fs.copySync(path.join(funcDir.replace(/\.func$/, ''), '__data.json.func', item), path.join(funcDir, item));
32
+ fs.copySync(path.join(sourceFuncDir, item), path.join(funcDir, item));
44
33
  }
45
34
  // Update .vc-config.json with the new experimental triggers config
46
35
  const existingConfig = JSON.parse(fs.readFileSync(file, 'utf8'));
@@ -48,7 +37,10 @@ process.on('beforeExit', () => {
48
37
  ...existingConfig,
49
38
  ...config,
50
39
  }));
40
+ // The source function may be a shared catchall. It must not keep stale
41
+ // workflow queue triggers after the dedicated function is copied out.
42
+ stripWorkflowQueueTriggers(path.join(sourceFuncDir, '.vc-config.json'));
51
43
  }
52
44
  });
53
45
  export { workflowPlugin } from './plugin.js';
54
- //# sourceMappingURL=index.js.map
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzdELE9BQU8sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUUxQixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU1RCxPQUFPLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUU7SUFDNUIsd0RBQXdEO0lBQ3hELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDdEMsT0FBTztJQUNULENBQUM7SUFDRCwyREFBMkQ7SUFDM0QsdUNBQXVDO0lBQ3ZDLEtBQUssTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSTtRQUM3QjtZQUNFLElBQUksRUFBRSw0RUFBNEU7WUFDbEYsTUFBTSxFQUFFO2dCQUNOLFdBQVcsRUFBRSxLQUFLO2dCQUNsQixvQkFBb0IsRUFBRSxDQUFDLHVCQUF1QixFQUFFLENBQUM7YUFDbEQ7U0FDRjtLQUNGLEVBQUUsQ0FBQztRQUNGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUM1QixTQUFTO1FBQ1gsQ0FBQztRQUNELDREQUE0RDtRQUM1RCwrQkFBK0I7UUFDL0IsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FDN0IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLEVBQzlCLGtCQUFrQixDQUNuQixDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2QyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZCLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFM0MsS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMxQixFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUVELG1FQUFtRTtRQUNuRSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDakUsRUFBRSxDQUFDLGFBQWEsQ0FDZCxJQUFJLEVBQ0osSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNiLEdBQUcsY0FBYztZQUNqQixHQUFHLE1BQU07U0FDVixDQUFDLENBQ0gsQ0FBQztRQUVGLHVFQUF1RTtRQUN2RSxzRUFBc0U7UUFDdEUsMEJBQTBCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0lBQzFFLENBQUM7QUFDSCxDQUFDLENBQUMsQ0FBQztBQUVILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZ2V0V29ya2Zsb3dRdWV1ZVRyaWdnZXIgfSBmcm9tICdAd29ya2Zsb3cvYnVpbGRlcnMnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcblxuaW1wb3J0IHsgc3RyaXBXb3JrZmxvd1F1ZXVlVHJpZ2dlcnMgfSBmcm9tICcuL3ZjLWNvbmZpZy5qcyc7XG5cbnByb2Nlc3Mub24oJ2JlZm9yZUV4aXQnLCAoKSA9PiB7XG4gIC8vIERvbid0IHBhdGNoIGZ1bmN0aW9ucyBvdXRwdXQgaWYgbm90IGluIFZlcmNlbCBhZGFwdGVyXG4gIGlmICghcHJvY2Vzcy5lbnYuVkVSQ0VMX0RFUExPWU1FTlRfSUQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gVjI6IE9ubHkgdGhlIGNvbWJpbmVkIGZsb3cgaGFuZGxlciBuZWVkcyBxdWV1ZSB0cmlnZ2Vycy5cbiAgLy8gVGhlIHNlcGFyYXRlIHN0ZXAgcm91dGUgd2FzIHJlbW92ZWQuXG4gIGZvciAoY29uc3QgeyBmaWxlLCBjb25maWcgfSBvZiBbXG4gICAge1xuICAgICAgZmlsZTogJy52ZXJjZWwvb3V0cHV0L2Z1bmN0aW9ucy8ud2VsbC1rbm93bi93b3JrZmxvdy92MS9mbG93LmZ1bmMvLnZjLWNvbmZpZy5qc29uJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBtYXhEdXJhdGlvbjogJ21heCcsXG4gICAgICAgIGV4cGVyaW1lbnRhbFRyaWdnZXJzOiBbZ2V0V29ya2Zsb3dRdWV1ZVRyaWdnZXIoKV0sXG4gICAgICB9LFxuICAgIH0sXG4gIF0pIHtcbiAgICBjb25zdCBmdW5jRGlyID0gcGF0aC5kaXJuYW1lKGZpbGUpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmdW5jRGlyKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIFVuLXN5bWxpbmsgdGhlc2UgYXMgdGhleSBjYW4ndCBiZSBzaGFyZWQgZHVlIHRvIGRpZmZlcmVudFxuICAgIC8vIGV4cGVyaW1lbnRhbCB0cmlnZ2VycyBjb25maWdcbiAgICBjb25zdCBzb3VyY2VGdW5jRGlyID0gcGF0aC5qb2luKFxuICAgICAgZnVuY0Rpci5yZXBsYWNlKC9cXC5mdW5jJC8sICcnKSxcbiAgICAgICdfX2RhdGEuanNvbi5mdW5jJ1xuICAgICk7XG4gICAgY29uc3QgdG9Db3B5ID0gZnMucmVhZGRpclN5bmMoZnVuY0Rpcik7XG4gICAgZnMucmVtb3ZlU3luYyhmdW5jRGlyKTtcbiAgICBmcy5ta2RpclN5bmMoZnVuY0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdG9Db3B5KSB7XG4gICAgICBmcy5jb3B5U3luYyhwYXRoLmpvaW4oc291cmNlRnVuY0RpciwgaXRlbSksIHBhdGguam9pbihmdW5jRGlyLCBpdGVtKSk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIC52Yy1jb25maWcuanNvbiB3aXRoIHRoZSBuZXcgZXhwZXJpbWVudGFsIHRyaWdnZXJzIGNvbmZpZ1xuICAgIGNvbnN0IGV4aXN0aW5nQ29uZmlnID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoZmlsZSwgJ3V0ZjgnKSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgIGZpbGUsXG4gICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIC4uLmV4aXN0aW5nQ29uZmlnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBUaGUgc291cmNlIGZ1bmN0aW9uIG1heSBiZSBhIHNoYXJlZCBjYXRjaGFsbC4gSXQgbXVzdCBub3Qga2VlcCBzdGFsZVxuICAgIC8vIHdvcmtmbG93IHF1ZXVlIHRyaWdnZXJzIGFmdGVyIHRoZSBkZWRpY2F0ZWQgZnVuY3Rpb24gaXMgY29waWVkIG91dC5cbiAgICBzdHJpcFdvcmtmbG93UXVldWVUcmlnZ2VycyhwYXRoLmpvaW4oc291cmNlRnVuY0RpciwgJy52Yy1jb25maWcuanNvbicpKTtcbiAgfVxufSk7XG5cbmV4cG9ydCB7IHdvcmtmbG93UGx1Z2luIH0gZnJvbSAnLi9wbHVnaW4uanMnO1xuIl19
package/dist/plugin.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { Plugin } from 'vite';
1
+ import type { PluginOption } from 'vite';
2
2
  export interface WorkflowPluginOptions {
3
3
  /**
4
4
  * Controls how source maps are emitted for workflow bundles. Accepts the
@@ -8,5 +8,5 @@ export interface WorkflowPluginOptions {
8
8
  */
9
9
  sourcemap?: boolean | 'inline' | 'linked' | 'external' | 'both';
10
10
  }
11
- export declare function workflowPlugin(options?: WorkflowPluginOptions): Plugin[];
11
+ export declare function workflowPlugin(options?: WorkflowPluginOptions): PluginOption[];
12
12
  //# sourceMappingURL=plugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAGnC,MAAM,WAAW,qBAAqB;IACpC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;CACjE;AAED,wBAAgB,cAAc,CAAC,OAAO,GAAE,qBAA0B,GAAG,MAAM,EAAE,CAc5E"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAU,YAAY,EAAE,MAAM,MAAM,CAAC;AAGjD,MAAM,WAAW,qBAAqB;IACpC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;CACjE;AAUD,wBAAgB,cAAc,CAC5B,OAAO,GAAE,qBAA0B,GAClC,YAAY,EAAE,CAUhB"}
package/dist/plugin.js CHANGED
@@ -1,14 +1,80 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { access, mkdir, readFile, writeFile } from 'node:fs/promises';
3
+ import { join, resolve } from 'node:path';
4
+ import { loadConfig } from '@sveltejs/load-config';
1
5
  import { createBuildQueue } from '@workflow/builders';
2
6
  import { workflowTransformPlugin } from '@workflow/rollup';
3
7
  import { workflowHotUpdatePlugin } from '@workflow/vite';
4
8
  import { SvelteKitBuilder } from './builder.js';
9
+ const resolvingConfig = new Set();
10
+ const builders = new Map();
11
+ // SvelteKit starts secondary Vite builds in worker threads. Those workers
12
+ // reevaluate vite.config with a fresh module cache, so they cannot see the
13
+ // builder above. Persist the resolved routes directory in the dependency cache
14
+ // to avoid loading the config and rebuilding routes again.
15
+ const BUILD_CACHE_PATH = 'node_modules/.cache/workflow/sveltekit-build.json';
5
16
  export function workflowPlugin(options = {}) {
6
- const builder = new SvelteKitBuilder({ sourcemap: options.sourcemap });
17
+ const workingDir = process.cwd();
18
+ // loadConfig() resolves vite.config when SvelteKit options live there. That
19
+ // recursively evaluates this plugin, which must not wait on its own setup.
20
+ if (resolvingConfig.has(workingDir)) {
21
+ return [];
22
+ }
23
+ return [getBuilder(workingDir, options).then(createWorkflowPlugins)];
24
+ }
25
+ function createWorkflowPlugins(builder) {
7
26
  const enqueue = createBuildQueue();
8
27
  return [
9
28
  workflowTransformPlugin(),
10
29
  {
11
30
  name: 'workflow:sveltekit',
31
+ // SvelteKit bundles the server (including undici, via the world adapter)
32
+ // into ESM output. undici loads most node: builtins as ESM imports, but
33
+ // pulls in `node:http2` lazily via a bare `require('node:http2')` inside a
34
+ // try/catch, which the bundler leaves un-wired, so in the ESM bundle the
35
+ // require throws and undici silently falls back to a stub whose
36
+ // `http2.connect` is undefined. That breaks any HTTP/2 request (observed
37
+ // as the workflow flow-route callback failing with "fetch failed" ->
38
+ // runs never start). Provide a working CJS `require` for the *server*
39
+ // build so the real `node:http2` resolves.
40
+ //
41
+ // Detection runs in `configResolved` (not the `config` hook): SvelteKit
42
+ // does not set `env.isSsrBuild` for its server pass, but `build.ssr` is
43
+ // set on the resolved config. We gate to the SSR build because a
44
+ // `node:module` import in the client/browser bundle would break it.
45
+ //
46
+ // This is a Node-server-runtime-only shim. Note the deliberate global
47
+ // side effect: defining `globalThis.require` makes `typeof require` truthy
48
+ // for *every* bundled dependency in this ESM server output, so any library
49
+ // that feature-detects `require` will take its CJS path here. That is safe
50
+ // because (a) it never touches the client bundle, (b) the `typeof require
51
+ // === 'undefined'` guard makes it a no-op in CJS chunks where a real
52
+ // `require` already exists, and (c) the `require` we install is a working
53
+ // `createRequire`, so a library that switches to the require path gets a
54
+ // functional `require`, not a broken stub. The behavior to watch for is a
55
+ // bundled lib that, on seeing `require`, does `require()` of an ESM-only
56
+ // dependency on a Node version without `require(ESM)` support.
57
+ configResolved(config) {
58
+ if (!config.build?.ssr) {
59
+ return;
60
+ }
61
+ const banner = "import { createRequire as __wkfCreateRequire } from 'node:module'; if (typeof require === 'undefined') { globalThis.require = __wkfCreateRequire(import.meta.url); }";
62
+ const rollupOptions = config.build.rollupOptions;
63
+ rollupOptions.output ??= {};
64
+ const output = rollupOptions.output;
65
+ const outputs = Array.isArray(output) ? output : [output];
66
+ for (const output of outputs) {
67
+ const existing = output.banner;
68
+ if (existing == null) {
69
+ output.banner = banner;
70
+ continue;
71
+ }
72
+ output.banner =
73
+ typeof existing === 'function'
74
+ ? async (chunk) => `${banner}\n${await existing(chunk)}`
75
+ : `${banner}\n${existing}`;
76
+ }
77
+ },
12
78
  },
13
79
  workflowHotUpdatePlugin({
14
80
  builder,
@@ -16,4 +82,79 @@ export function workflowPlugin(options = {}) {
16
82
  }),
17
83
  ];
18
84
  }
19
- //# sourceMappingURL=plugin.js.map
85
+ function getBuilder(workingDir, options) {
86
+ const existing = builders.get(workingDir);
87
+ if (existing) {
88
+ return existing;
89
+ }
90
+ const builder = loadBuilder(workingDir, options).catch((error) => {
91
+ builders.delete(workingDir);
92
+ throw error;
93
+ });
94
+ builders.set(workingDir, builder);
95
+ return builder;
96
+ }
97
+ async function loadBuilder(workingDir, options) {
98
+ const cachedRoutesDir = await readCachedRoutesDir(workingDir);
99
+ if (cachedRoutesDir) {
100
+ return new SvelteKitBuilder({
101
+ routesDir: cachedRoutesDir,
102
+ workingDir,
103
+ ...options,
104
+ });
105
+ }
106
+ const svelteConfigPath = join(workingDir, 'svelte.config.js');
107
+ resolvingConfig.add(workingDir);
108
+ let result;
109
+ try {
110
+ result = await loadConfig(existsSync(svelteConfigPath) ? svelteConfigPath : workingDir, { traverse: false });
111
+ }
112
+ finally {
113
+ resolvingConfig.delete(workingDir);
114
+ }
115
+ if (result == null) {
116
+ throw new Error(`Could not find a Svelte config in ${workingDir}.`);
117
+ }
118
+ if ('error' in result) {
119
+ throw new Error(`Failed to load Svelte config from ${result.configFilePath}.`, {
120
+ cause: result.error,
121
+ });
122
+ }
123
+ const routesDir = result.config.kit?.files?.routes;
124
+ if (routesDir !== undefined && typeof routesDir !== 'string') {
125
+ throw new Error('Expected kit.files.routes to be a string.');
126
+ }
127
+ const resolvedRoutesDir = resolve(workingDir, routesDir ?? 'src/routes');
128
+ const builder = new SvelteKitBuilder({
129
+ routesDir: resolvedRoutesDir,
130
+ workingDir,
131
+ ...options,
132
+ });
133
+ await builder.build();
134
+ await writeBuildCache(workingDir, resolvedRoutesDir);
135
+ return builder;
136
+ }
137
+ async function readCachedRoutesDir(workingDir) {
138
+ try {
139
+ const cache = JSON.parse(await readFile(join(workingDir, BUILD_CACHE_PATH), 'utf8'));
140
+ // Worker threads have isolated module state but share the parent process's
141
+ // PID. A later Vite command has a new PID and must perform a fresh build.
142
+ if (cache.pid !== process.pid || typeof cache.routesDir !== 'string') {
143
+ return;
144
+ }
145
+ await access(join(cache.routesDir, '.well-known/workflow/v1/flow/+server.js'));
146
+ return cache.routesDir;
147
+ }
148
+ catch {
149
+ return;
150
+ }
151
+ }
152
+ async function writeBuildCache(workingDir, routesDir) {
153
+ // Bail if node_modules not available; it's fine since this is more of a perf/correctness optimization
154
+ if (!existsSync(join(workingDir, 'node_modules')))
155
+ return;
156
+ const cacheDir = join(workingDir, 'node_modules/.cache/workflow');
157
+ await mkdir(cacheDir, { recursive: true });
158
+ await writeFile(join(workingDir, BUILD_CACHE_PATH), JSON.stringify({ pid: process.pid, routesDir }));
159
+ }
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMxQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBWWhELE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7QUFDMUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQXFDLENBQUM7QUFDOUQsMEVBQTBFO0FBQzFFLDJFQUEyRTtBQUMzRSwrRUFBK0U7QUFDL0UsMkRBQTJEO0FBQzNELE1BQU0sZ0JBQWdCLEdBQUcsbURBQW1ELENBQUM7QUFFN0UsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsVUFBaUMsRUFBRTtJQUVuQyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFFakMsNEVBQTRFO0lBQzVFLDJFQUEyRTtJQUMzRSxJQUFJLGVBQWUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUNwQyxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxJ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TztJQUUxRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLDhCQUE4QixDQUFDLENBQUM7SUFDbEUsTUFBTSxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDM0MsTUFBTSxTQUFTLENBQ2IsSUFBSSxDQUFDLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxFQUNsQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FDaEQsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBhY2Nlc3MsIG1rZGlyLCByZWFkRmlsZSwgd3JpdGVGaWxlIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBqb2luLCByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGxvYWRDb25maWcgfSBmcm9tICdAc3ZlbHRlanMvbG9hZC1jb25maWcnO1xuaW1wb3J0IHsgY3JlYXRlQnVpbGRRdWV1ZSB9IGZyb20gJ0B3b3JrZmxvdy9idWlsZGVycyc7XG5pbXBvcnQgeyB3b3JrZmxvd1RyYW5zZm9ybVBsdWdpbiB9IGZyb20gJ0B3b3JrZmxvdy9yb2xsdXAnO1xuaW1wb3J0IHsgd29ya2Zsb3dIb3RVcGRhdGVQbHVnaW4gfSBmcm9tICdAd29ya2Zsb3cvdml0ZSc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpbiwgUGx1Z2luT3B0aW9uIH0gZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBTdmVsdGVLaXRCdWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd1BsdWdpbk9wdGlvbnMge1xuICAvKipcbiAgICogQ29udHJvbHMgaG93IHNvdXJjZSBtYXBzIGFyZSBlbWl0dGVkIGZvciB3b3JrZmxvdyBidW5kbGVzLiBBY2NlcHRzIHRoZVxuICAgKiBzYW1lIHZhbHVlcyBhcyBlc2J1aWxkJ3MgYHNvdXJjZW1hcGAgb3B0aW9uOiBgdHJ1ZWAvYCdpbmxpbmUnYCAoZGVmYXVsdCksXG4gICAqIGAnbGlua2VkJ2AsIGAnZXh0ZXJuYWwnYCwgYCdib3RoJ2AsIG9yIGBmYWxzZWAgdG8gb21pdCBzb3VyY2UgbWFwcy4gQ2FuXG4gICAqIGFsc28gYmUgc2V0IHZpYSB0aGUgYFdPUktGTE9XX1NPVVJDRU1BUGAgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gICAqL1xuICBzb3VyY2VtYXA/OiBib29sZWFuIHwgJ2lubGluZScgfCAnbGlua2VkJyB8ICdleHRlcm5hbCcgfCAnYm90aCc7XG59XG5cbmNvbnN0IHJlc29sdmluZ0NvbmZpZyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuY29uc3QgYnVpbGRlcnMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxTdmVsdGVLaXRCdWlsZGVyPj4oKTtcbi8vIFN2ZWx0ZUtpdCBzdGFydHMgc2Vjb25kYXJ5IFZpdGUgYnVpbGRzIGluIHdvcmtlciB0aHJlYWRzLiBUaG9zZSB3b3JrZXJzXG4vLyByZWV2YWx1YXRlIHZpdGUuY29uZmlnIHdpdGggYSBmcmVzaCBtb2R1bGUgY2FjaGUsIHNvIHRoZXkgY2Fubm90IHNlZSB0aGVcbi8vIGJ1aWxkZXIgYWJvdmUuIFBlcnNpc3QgdGhlIHJlc29sdmVkIHJvdXRlcyBkaXJlY3RvcnkgaW4gdGhlIGRlcGVuZGVuY3kgY2FjaGVcbi8vIHRvIGF2b2lkIGxvYWRpbmcgdGhlIGNvbmZpZyBhbmQgcmVidWlsZGluZyByb3V0ZXMgYWdhaW4uXG5jb25zdCBCVUlMRF9DQUNIRV9QQVRIID0gJ25vZGVfbW9kdWxlcy8uY2FjaGUvd29ya2Zsb3cvc3ZlbHRla2l0LWJ1aWxkLmpzb24nO1xuXG5leHBvcnQgZnVuY3Rpb24gd29ya2Zsb3dQbHVnaW4oXG4gIG9wdGlvbnM6IFdvcmtmbG93UGx1Z2luT3B0aW9ucyA9IHt9XG4pOiBQbHVnaW5PcHRpb25bXSB7XG4gIGNvbnN0IHdvcmtpbmdEaXIgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gIC8vIGxvYWRDb25maWcoKSByZXNvbHZlcyB2aXRlLmNvbmZpZyB3aGVuIFN2ZWx0ZUtpdCBvcHRpb25zIGxpdmUgdGhlcmUuIFRoYXRcbiAgLy8gcmVjdXJzaXZlbHkgZXZhbHVhdGVzIHRoaXMgcGx1Z2luLCB3aGljaCBtdXN0IG5vdCB3YWl0IG9uIGl0cyBvd24gc2V0dXAuXG4gIGlmIChyZXNvbHZpbmdDb25maWcuaGFzKHdvcmtpbmdEaXIpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIFtnZXRCdWlsZGVyKHdvcmtpbmdEaXIsIG9wdGlvbnMpLnRoZW4oY3JlYXRlV29ya2Zsb3dQbHVnaW5zKV07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVdvcmtmbG93UGx1Z2lucyhidWlsZGVyOiBTdmVsdGVLaXRCdWlsZGVyKTogUGx1Z2luW10ge1xuICBjb25zdCBlbnF1ZXVlID0gY3JlYXRlQnVpbGRRdWV1ZSgpO1xuXG4gIHJldHVybiBbXG4gICAgd29ya2Zsb3dUcmFuc2Zvcm1QbHVnaW4oKSBhcyBQbHVnaW4sXG4gICAge1xuICAgICAgbmFtZTogJ3dvcmtmbG93OnN2ZWx0ZWtpdCcsXG4gICAgICAvLyBTdmVsdGVLaXQgYnVuZGxlcyB0aGUgc2VydmVyIChpbmNsdWRpbmcgdW5kaWNpLCB2aWEgdGhlIHdvcmxkIGFkYXB0ZXIpXG4gICAgICAvLyBpbnRvIEVTTSBvdXRwdXQuIHVuZGljaSBsb2FkcyBtb3N0IG5vZGU6IGJ1aWx0aW5zIGFzIEVTTSBpbXBvcnRzLCBidXRcbiAgICAgIC8vIHB1bGxzIGluIGBub2RlOmh0dHAyYCBsYXppbHkgdmlhIGEgYmFyZSBgcmVxdWlyZSgnbm9kZTpodHRwMicpYCBpbnNpZGUgYVxuICAgICAgLy8gdHJ5L2NhdGNoLCB3aGljaCB0aGUgYnVuZGxlciBsZWF2ZXMgdW4td2lyZWQsIHNvIGluIHRoZSBFU00gYnVuZGxlIHRoZVxuICAgICAgLy8gcmVxdWlyZSB0aHJvd3MgYW5kIHVuZGljaSBzaWxlbnRseSBmYWxscyBiYWNrIHRvIGEgc3R1YiB3aG9zZVxuICAgICAgLy8gYGh0dHAyLmNvbm5lY3RgIGlzIHVuZGVmaW5lZC4gVGhhdCBicmVha3MgYW55IEhUVFAvMiByZXF1ZXN0IChvYnNlcnZlZFxuICAgICAgLy8gYXMgdGhlIHdvcmtmbG93IGZsb3ctcm91dGUgY2FsbGJhY2sgZmFpbGluZyB3aXRoIFwiZmV0Y2ggZmFpbGVkXCIgLT5cbiAgICAgIC8vIHJ1bnMgbmV2ZXIgc3RhcnQpLiBQcm92aWRlIGEgd29ya2luZyBDSlMgYHJlcXVpcmVgIGZvciB0aGUgKnNlcnZlcipcbiAgICAgIC8vIGJ1aWxkIHNvIHRoZSByZWFsIGBub2RlOmh0dHAyYCByZXNvbHZlcy5cbiAgICAgIC8vXG4gICAgICAvLyBEZXRlY3Rpb24gcnVucyBpbiBgY29uZmlnUmVzb2x2ZWRgIChub3QgdGhlIGBjb25maWdgIGhvb2spOiBTdmVsdGVLaXRcbiAgICAgIC8vIGRvZXMgbm90IHNldCBgZW52LmlzU3NyQnVpbGRgIGZvciBpdHMgc2VydmVyIHBhc3MsIGJ1dCBgYnVpbGQuc3NyYCBpc1xuICAgICAgLy8gc2V0IG9uIHRoZSByZXNvbHZlZCBjb25maWcuIFdlIGdhdGUgdG8gdGhlIFNTUiBidWlsZCBiZWNhdXNlIGFcbiAgICAgIC8vIGBub2RlOm1vZHVsZWAgaW1wb3J0IGluIHRoZSBjbGllbnQvYnJvd3NlciBidW5kbGUgd291bGQgYnJlYWsgaXQuXG4gICAgICAvL1xuICAgICAgLy8gVGhpcyBpcyBhIE5vZGUtc2VydmVyLXJ1bnRpbWUtb25seSBzaGltLiBOb3RlIHRoZSBkZWxpYmVyYXRlIGdsb2JhbFxuICAgICAgLy8gc2lkZSBlZmZlY3Q6IGRlZmluaW5nIGBnbG9iYWxUaGlzLnJlcXVpcmVgIG1ha2VzIGB0eXBlb2YgcmVxdWlyZWAgdHJ1dGh5XG4gICAgICAvLyBmb3IgKmV2ZXJ5KiBidW5kbGVkIGRlcGVuZGVuY3kgaW4gdGhpcyBFU00gc2VydmVyIG91dHB1dCwgc28gYW55IGxpYnJhcnlcbiAgICAgIC8vIHRoYXQgZmVhdHVyZS1kZXRlY3RzIGByZXF1aXJlYCB3aWxsIHRha2UgaXRzIENKUyBwYXRoIGhlcmUuIFRoYXQgaXMgc2FmZVxuICAgICAgLy8gYmVjYXVzZSAoYSkgaXQgbmV2ZXIgdG91Y2hlcyB0aGUgY2xpZW50IGJ1bmRsZSwgKGIpIHRoZSBgdHlwZW9mIHJlcXVpcmVcbiAgICAgIC8vID09PSAndW5kZWZpbmVkJ2AgZ3VhcmQgbWFrZXMgaXQgYSBuby1vcCBpbiBDSlMgY2h1bmtzIHdoZXJlIGEgcmVhbFxuICAgICAgLy8gYHJlcXVpcmVgIGFscmVhZHkgZXhpc3RzLCBhbmQgKGMpIHRoZSBgcmVxdWlyZWAgd2UgaW5zdGFsbCBpcyBhIHdvcmtpbmdcbiAgICAgIC8vIGBjcmVhdGVSZXF1aXJlYCwgc28gYSBsaWJyYXJ5IHRoYXQgc3dpdGNoZXMgdG8gdGhlIHJlcXVpcmUgcGF0aCBnZXRzIGFcbiAgICAgIC8vIGZ1bmN0aW9uYWwgYHJlcXVpcmVgLCBub3QgYSBicm9rZW4gc3R1Yi4gVGhlIGJlaGF2aW9yIHRvIHdhdGNoIGZvciBpcyBhXG4gICAgICAvLyBidW5kbGVkIGxpYiB0aGF0LCBvbiBzZWVpbmcgYHJlcXVpcmVgLCBkb2VzIGByZXF1aXJlKClgIG9mIGFuIEVTTS1vbmx5XG4gICAgICAvLyBkZXBlbmRlbmN5IG9uIGEgTm9kZSB2ZXJzaW9uIHdpdGhvdXQgYHJlcXVpcmUoRVNNKWAgc3VwcG9ydC5cbiAgICAgIGNvbmZpZ1Jlc29sdmVkKGNvbmZpZykge1xuICAgICAgICBpZiAoIWNvbmZpZy5idWlsZD8uc3NyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmFubmVyID1cbiAgICAgICAgICBcImltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgYXMgX193a2ZDcmVhdGVSZXF1aXJlIH0gZnJvbSAnbm9kZTptb2R1bGUnOyBpZiAodHlwZW9mIHJlcXVpcmUgPT09ICd1bmRlZmluZWQnKSB7IGdsb2JhbFRoaXMucmVxdWlyZSA9IF9fd2tmQ3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpOyB9XCI7XG4gICAgICAgIGNvbnN0IHJvbGx1cE9wdGlvbnMgPSBjb25maWcuYnVpbGQucm9sbHVwT3B0aW9ucztcbiAgICAgICAgcm9sbHVwT3B0aW9ucy5vdXRwdXQgPz89IHt9O1xuICAgICAgICBjb25zdCBvdXRwdXQgPSByb2xsdXBPcHRpb25zLm91dHB1dDtcbiAgICAgICAgY29uc3Qgb3V0cHV0cyA9IEFycmF5LmlzQXJyYXkob3V0cHV0KSA/IG91dHB1dCA6IFtvdXRwdXRdO1xuICAgICAgICBmb3IgKGNvbnN0IG91dHB1dCBvZiBvdXRwdXRzKSB7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBvdXRwdXQuYmFubmVyO1xuICAgICAgICAgIGlmIChleGlzdGluZyA9PSBudWxsKSB7XG4gICAgICAgICAgICBvdXRwdXQuYmFubmVyID0gYmFubmVyO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG91dHB1dC5iYW5uZXIgPVxuICAgICAgICAgICAgdHlwZW9mIGV4aXN0aW5nID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICAgID8gYXN5bmMgKGNodW5rKSA9PiBgJHtiYW5uZXJ9XFxuJHthd2FpdCBleGlzdGluZyhjaHVuayl9YFxuICAgICAgICAgICAgICA6IGAke2Jhbm5lcn1cXG4ke2V4aXN0aW5nfWA7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgICB3b3JrZmxvd0hvdFVwZGF0ZVBsdWdpbih7XG4gICAgICBidWlsZGVyLFxuICAgICAgZW5xdWV1ZSxcbiAgICB9KSxcbiAgXTtcbn1cblxuZnVuY3Rpb24gZ2V0QnVpbGRlcihcbiAgd29ya2luZ0Rpcjogc3RyaW5nLFxuICBvcHRpb25zOiBXb3JrZmxvd1BsdWdpbk9wdGlvbnNcbik6IFByb21pc2U8U3ZlbHRlS2l0QnVpbGRlcj4ge1xuICBjb25zdCBleGlzdGluZyA9IGJ1aWxkZXJzLmdldCh3b3JraW5nRGlyKTtcbiAgaWYgKGV4aXN0aW5nKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nO1xuICB9XG5cbiAgY29uc3QgYnVpbGRlciA9IGxvYWRCdWlsZGVyKHdvcmtpbmdEaXIsIG9wdGlvbnMpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgIGJ1aWxkZXJzLmRlbGV0ZSh3b3JraW5nRGlyKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfSk7XG4gIGJ1aWxkZXJzLnNldCh3b3JraW5nRGlyLCBidWlsZGVyKTtcbiAgcmV0dXJuIGJ1aWxkZXI7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxvYWRCdWlsZGVyKFxuICB3b3JraW5nRGlyOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFdvcmtmbG93UGx1Z2luT3B0aW9uc1xuKTogUHJvbWlzZTxTdmVsdGVLaXRCdWlsZGVyPiB7XG4gIGNvbnN0IGNhY2hlZFJvdXRlc0RpciA9IGF3YWl0IHJlYWRDYWNoZWRSb3V0ZXNEaXIod29ya2luZ0Rpcik7XG4gIGlmIChjYWNoZWRSb3V0ZXNEaXIpIHtcbiAgICByZXR1cm4gbmV3IFN2ZWx0ZUtpdEJ1aWxkZXIoe1xuICAgICAgcm91dGVzRGlyOiBjYWNoZWRSb3V0ZXNEaXIsXG4gICAgICB3b3JraW5nRGlyLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHN2ZWx0ZUNvbmZpZ1BhdGggPSBqb2luKHdvcmtpbmdEaXIsICdzdmVsdGUuY29uZmlnLmpzJyk7XG4gIHJlc29sdmluZ0NvbmZpZy5hZGQod29ya2luZ0Rpcik7XG5cbiAgbGV0IHJlc3VsdDogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBsb2FkQ29uZmlnPj47XG4gIHRyeSB7XG4gICAgcmVzdWx0ID0gYXdhaXQgbG9hZENvbmZpZyhcbiAgICAgIGV4aXN0c1N5bmMoc3ZlbHRlQ29uZmlnUGF0aCkgPyBzdmVsdGVDb25maWdQYXRoIDogd29ya2luZ0RpcixcbiAgICAgIHsgdHJhdmVyc2U6IGZhbHNlIH1cbiAgICApO1xuICB9IGZpbmFsbHkge1xuICAgIHJlc29sdmluZ0NvbmZpZy5kZWxldGUod29ya2luZ0Rpcik7XG4gIH1cblxuICBpZiAocmVzdWx0ID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGEgU3ZlbHRlIGNvbmZpZyBpbiAke3dvcmtpbmdEaXJ9LmApO1xuICB9XG4gIGlmICgnZXJyb3InIGluIHJlc3VsdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gbG9hZCBTdmVsdGUgY29uZmlnIGZyb20gJHtyZXN1bHQuY29uZmlnRmlsZVBhdGh9LmAsXG4gICAgICB7XG4gICAgICAgIGNhdXNlOiByZXN1bHQuZXJyb3IsXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHJvdXRlc0RpciA9IChcbiAgICByZXN1bHQuY29uZmlnIGFzIHsga2l0PzogeyBmaWxlcz86IHsgcm91dGVzPzogdW5rbm93biB9IH0gfVxuICApLmtpdD8uZmlsZXM/LnJvdXRlcztcbiAgaWYgKHJvdXRlc0RpciAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiByb3V0ZXNEaXIgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBraXQuZmlsZXMucm91dGVzIHRvIGJlIGEgc3RyaW5nLicpO1xuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWRSb3V0ZXNEaXIgPSByZXNvbHZlKHdvcmtpbmdEaXIsIHJvdXRlc0RpciA/PyAnc3JjL3JvdXRlcycpO1xuICBjb25zdCBidWlsZGVyID0gbmV3IFN2ZWx0ZUtpdEJ1aWxkZXIoe1xuICAgIHJvdXRlc0RpcjogcmVzb2x2ZWRSb3V0ZXNEaXIsXG4gICAgd29ya2luZ0RpcixcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbiAgYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICBhd2FpdCB3cml0ZUJ1aWxkQ2FjaGUod29ya2luZ0RpciwgcmVzb2x2ZWRSb3V0ZXNEaXIpO1xuICByZXR1cm4gYnVpbGRlcjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZENhY2hlZFJvdXRlc0RpcihcbiAgd29ya2luZ0Rpcjogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGNhY2hlID0gSlNPTi5wYXJzZShcbiAgICAgIGF3YWl0IHJlYWRGaWxlKGpvaW4od29ya2luZ0RpciwgQlVJTERfQ0FDSEVfUEFUSCksICd1dGY4JylcbiAgICApIGFzIHsgcGlkPzogdW5rbm93bjsgcm91dGVzRGlyPzogdW5rbm93biB9O1xuICAgIC8vIFdvcmtlciB0aHJlYWRzIGhhdmUgaXNvbGF0ZWQgbW9kdWxlIHN0YXRlIGJ1dCBzaGFyZSB0aGUgcGFyZW50IHByb2Nlc3Mnc1xuICAgIC8vIFBJRC4gQSBsYXRlciBWaXRlIGNvbW1hbmQgaGFzIGEgbmV3IFBJRCBhbmQgbXVzdCBwZXJmb3JtIGEgZnJlc2ggYnVpbGQuXG4gICAgaWYgKGNhY2hlLnBpZCAhPT0gcHJvY2Vzcy5waWQgfHwgdHlwZW9mIGNhY2hlLnJvdXRlc0RpciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBhY2Nlc3MoXG4gICAgICBqb2luKGNhY2hlLnJvdXRlc0RpciwgJy53ZWxsLWtub3duL3dvcmtmbG93L3YxL2Zsb3cvK3NlcnZlci5qcycpXG4gICAgKTtcbiAgICByZXR1cm4gY2FjaGUucm91dGVzRGlyO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVCdWlsZENhY2hlKFxuICB3b3JraW5nRGlyOiBzdHJpbmcsXG4gIHJvdXRlc0Rpcjogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gQmFpbCBpZiBub2RlX21vZHVsZXMgbm90IGF2YWlsYWJsZTsgaXQncyBmaW5lIHNpbmNlIHRoaXMgaXMgbW9yZSBvZiBhIHBlcmYvY29ycmVjdG5lc3Mgb3B0aW1pemF0aW9uXG4gIGlmICghZXhpc3RzU3luYyhqb2luKHdvcmtpbmdEaXIsICdub2RlX21vZHVsZXMnKSkpIHJldHVybjtcblxuICBjb25zdCBjYWNoZURpciA9IGpvaW4od29ya2luZ0RpciwgJ25vZGVfbW9kdWxlcy8uY2FjaGUvd29ya2Zsb3cnKTtcbiAgYXdhaXQgbWtkaXIoY2FjaGVEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCB3cml0ZUZpbGUoXG4gICAgam9pbih3b3JraW5nRGlyLCBCVUlMRF9DQUNIRV9QQVRIKSxcbiAgICBKU09OLnN0cmluZ2lmeSh7IHBpZDogcHJvY2Vzcy5waWQsIHJvdXRlc0RpciB9KVxuICApO1xufVxuIl19
@@ -0,0 +1,3 @@
1
+ export declare function stripWorkflowQueueTriggersFromConfig<TConfig extends Record<string, unknown>>(existingConfig: TConfig): TConfig;
2
+ export declare function stripWorkflowQueueTriggers(file: string): void;
3
+ //# sourceMappingURL=vc-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vc-config.d.ts","sourceRoot":"","sources":["../src/vc-config.ts"],"names":[],"mappings":"AAcA,wBAAgB,oCAAoC,CAClD,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,cAAc,EAAE,OAAO,GAAG,OAAO,CAqBlC;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,QAYtD"}
@@ -0,0 +1,40 @@
1
+ import { WORKFLOW_QUEUE_TRIGGER } from '@workflow/builders';
2
+ import fs from 'fs-extra';
3
+ const WORKFLOW_QUEUE_TOPICS = new Set([WORKFLOW_QUEUE_TRIGGER.topic]);
4
+ function isWorkflowQueueTrigger(trigger) {
5
+ if (typeof trigger !== 'object' || trigger === null) {
6
+ return false;
7
+ }
8
+ const topic = trigger.topic;
9
+ return typeof topic === 'string' && WORKFLOW_QUEUE_TOPICS.has(topic);
10
+ }
11
+ export function stripWorkflowQueueTriggersFromConfig(existingConfig) {
12
+ const experimentalTriggers = existingConfig.experimentalTriggers;
13
+ if (!Array.isArray(experimentalTriggers)) {
14
+ return existingConfig;
15
+ }
16
+ const filteredTriggers = experimentalTriggers.filter((trigger) => !isWorkflowQueueTrigger(trigger));
17
+ if (filteredTriggers.length === experimentalTriggers.length) {
18
+ return existingConfig;
19
+ }
20
+ const nextConfig = { ...existingConfig };
21
+ if (filteredTriggers.length > 0) {
22
+ nextConfig.experimentalTriggers = filteredTriggers;
23
+ }
24
+ else {
25
+ delete nextConfig.experimentalTriggers;
26
+ }
27
+ return nextConfig;
28
+ }
29
+ export function stripWorkflowQueueTriggers(file) {
30
+ if (!fs.existsSync(file)) {
31
+ return;
32
+ }
33
+ const existingConfig = JSON.parse(fs.readFileSync(file, 'utf8'));
34
+ const nextConfig = stripWorkflowQueueTriggersFromConfig(existingConfig);
35
+ if (nextConfig === existingConfig) {
36
+ return;
37
+ }
38
+ fs.writeFileSync(file, JSON.stringify(nextConfig));
39
+ }
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmMtY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3ZjLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFMUIsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFFdEUsU0FBUyxzQkFBc0IsQ0FBQyxPQUFnQjtJQUM5QyxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsSUFBSSxPQUFPLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDcEQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUksT0FBK0IsQ0FBQyxLQUFLLENBQUM7SUFDckQsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUkscUJBQXFCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3ZFLENBQUM7QUFFRCxNQUFNLFVBQVUsb0NBQW9DLENBRWxELGNBQXVCO0lBQ3ZCLE1BQU0sb0JBQW9CLEdBQUcsY0FBYyxDQUFDLG9CQUFvQixDQUFDO0lBQ2pFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQztRQUN6QyxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBRUQsTUFBTSxnQkFBZ0IsR0FBRyxvQkFBb0IsQ0FBQyxNQUFNLENBQ2xELENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxDQUM5QyxDQUFDO0lBQ0YsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssb0JBQW9CLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDNUQsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztJQUVELE1BQU0sVUFBVSxHQUE0QixFQUFFLEdBQUcsY0FBYyxFQUFFLENBQUM7SUFDbEUsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDaEMsVUFBVSxDQUFDLG9CQUFvQixHQUFHLGdCQUFnQixDQUFDO0lBQ3JELENBQUM7U0FBTSxDQUFDO1FBQ04sT0FBTyxVQUFVLENBQUMsb0JBQW9CLENBQUM7SUFDekMsQ0FBQztJQUVELE9BQU8sVUFBcUIsQ0FBQztBQUMvQixDQUFDO0FBRUQsTUFBTSxVQUFVLDBCQUEwQixDQUFDLElBQVk7SUFDckQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPO0lBQ1QsQ0FBQztJQUVELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNqRSxNQUFNLFVBQVUsR0FBRyxvQ0FBb0MsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN4RSxJQUFJLFVBQVUsS0FBSyxjQUFjLEVBQUUsQ0FBQztRQUNsQyxPQUFPO0lBQ1QsQ0FBQztJQUVELEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUNyRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV09SS0ZMT1dfUVVFVUVfVFJJR0dFUiB9IGZyb20gJ0B3b3JrZmxvdy9idWlsZGVycyc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuXG5jb25zdCBXT1JLRkxPV19RVUVVRV9UT1BJQ1MgPSBuZXcgU2V0KFtXT1JLRkxPV19RVUVVRV9UUklHR0VSLnRvcGljXSk7XG5cbmZ1bmN0aW9uIGlzV29ya2Zsb3dRdWV1ZVRyaWdnZXIodHJpZ2dlcjogdW5rbm93bikge1xuICBpZiAodHlwZW9mIHRyaWdnZXIgIT09ICdvYmplY3QnIHx8IHRyaWdnZXIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCB0b3BpYyA9ICh0cmlnZ2VyIGFzIHsgdG9waWM/OiB1bmtub3duIH0pLnRvcGljO1xuICByZXR1cm4gdHlwZW9mIHRvcGljID09PSAnc3RyaW5nJyAmJiBXT1JLRkxPV19RVUVVRV9UT1BJQ1MuaGFzKHRvcGljKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmlwV29ya2Zsb3dRdWV1ZVRyaWdnZXJzRnJvbUNvbmZpZzxcbiAgVENvbmZpZyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuPihleGlzdGluZ0NvbmZpZzogVENvbmZpZyk6IFRDb25maWcge1xuICBjb25zdCBleHBlcmltZW50YWxUcmlnZ2VycyA9IGV4aXN0aW5nQ29uZmlnLmV4cGVyaW1lbnRhbFRyaWdnZXJzO1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZXhwZXJpbWVudGFsVHJpZ2dlcnMpKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nQ29uZmlnO1xuICB9XG5cbiAgY29uc3QgZmlsdGVyZWRUcmlnZ2VycyA9IGV4cGVyaW1lbnRhbFRyaWdnZXJzLmZpbHRlcihcbiAgICAodHJpZ2dlcikgPT4gIWlzV29ya2Zsb3dRdWV1ZVRyaWdnZXIodHJpZ2dlcilcbiAgKTtcbiAgaWYgKGZpbHRlcmVkVHJpZ2dlcnMubGVuZ3RoID09PSBleHBlcmltZW50YWxUcmlnZ2Vycy5sZW5ndGgpIHtcbiAgICByZXR1cm4gZXhpc3RpbmdDb25maWc7XG4gIH1cblxuICBjb25zdCBuZXh0Q29uZmlnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgLi4uZXhpc3RpbmdDb25maWcgfTtcbiAgaWYgKGZpbHRlcmVkVHJpZ2dlcnMubGVuZ3RoID4gMCkge1xuICAgIG5leHRDb25maWcuZXhwZXJpbWVudGFsVHJpZ2dlcnMgPSBmaWx0ZXJlZFRyaWdnZXJzO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBuZXh0Q29uZmlnLmV4cGVyaW1lbnRhbFRyaWdnZXJzO1xuICB9XG5cbiAgcmV0dXJuIG5leHRDb25maWcgYXMgVENvbmZpZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmlwV29ya2Zsb3dRdWV1ZVRyaWdnZXJzKGZpbGU6IHN0cmluZykge1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBleGlzdGluZ0NvbmZpZyA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGZpbGUsICd1dGY4JykpO1xuICBjb25zdCBuZXh0Q29uZmlnID0gc3RyaXBXb3JrZmxvd1F1ZXVlVHJpZ2dlcnNGcm9tQ29uZmlnKGV4aXN0aW5nQ29uZmlnKTtcbiAgaWYgKG5leHRDb25maWcgPT09IGV4aXN0aW5nQ29uZmlnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZnMud3JpdGVGaWxlU3luYyhmaWxlLCBKU09OLnN0cmluZ2lmeShuZXh0Q29uZmlnKSk7XG59XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@workflow/sveltekit",
3
- "version": "5.0.0-beta.5",
3
+ "version": "5.0.0-beta.50",
4
4
  "description": "SvelteKit integration for Workflow SDK",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -20,24 +20,28 @@
20
20
  ".": "./dist/index.js"
21
21
  },
22
22
  "dependencies": {
23
+ "@sveltejs/load-config": "^0.2.3",
23
24
  "@swc/core": "1.15.3",
25
+ "@workflow/builders": "5.0.0-beta.50",
26
+ "@workflow/rollup": "5.0.0-beta.50",
27
+ "@workflow/swc-plugin": "5.0.0-beta.6",
28
+ "@workflow/vite": "5.0.0-beta.50",
24
29
  "exsolve": "^1.0.8",
25
30
  "fs-extra": "^11.3.2",
26
- "pathe": "^2.0.3",
27
- "@workflow/swc-plugin": "5.0.0-beta.4",
28
- "@workflow/builders": "5.0.0-beta.5",
29
- "@workflow/vite": "5.0.0-beta.5",
30
- "@workflow/rollup": "5.0.0-beta.5"
31
+ "pathe": "^2.0.3"
31
32
  },
32
33
  "devDependencies": {
33
34
  "@types/fs-extra": "11.0.4",
34
35
  "@types/node": "22.19.0",
35
- "vite": "7.3.2",
36
- "@workflow/tsconfig": "5.0.0-beta.0"
36
+ "@workflow/tsconfig": "5.0.0-beta.0",
37
+ "typescript": "^6.0.3",
38
+ "vite": "7.3.6",
39
+ "vitest": "^4.1.10"
37
40
  },
38
41
  "scripts": {
39
42
  "build": "tsc",
40
43
  "dev": "tsc --watch",
44
+ "test": "vitest run src",
41
45
  "clean": "tsc --build --clean && rm -rf dist"
42
46
  }
43
47
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"builder.js","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"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","sourcesContent":["import { constants } from 'node:fs';\nimport {\n access,\n copyFile,\n mkdir,\n readFile,\n rm,\n stat,\n writeFile,\n} from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport {\n BaseBuilder,\n NORMALIZE_REQUEST_CODE,\n type SvelteKitConfig,\n} from '@workflow/builders';\n\nconst SVELTEKIT_VIRTUAL_MODULES = [\n '$env/*', // All $env subpaths\n '$lib', // Exact $lib import\n '$lib/*', // All $lib subpaths\n '$app/*', // All $app subpaths\n];\n\nexport class SvelteKitBuilder extends BaseBuilder {\n constructor(config?: Partial<SvelteKitConfig>) {\n const workingDir = config?.workingDir || process.cwd();\n\n super({\n ...config,\n dirs: ['workflows', 'src/workflows', 'routes', 'src/routes'],\n buildTarget: 'sveltekit' as const,\n stepsBundlePath: '', // unused in base\n workflowsBundlePath: '', // unused in base\n webhookBundlePath: '', // unused in base\n workingDir,\n externalPackages: [...SVELTEKIT_VIRTUAL_MODULES],\n sourcemap: config?.sourcemap,\n });\n }\n\n override async build(): Promise<void> {\n // Find SvelteKit routes directory (src/routes or routes)\n const routesDir = await this.findRoutesDirectory();\n const workflowGeneratedDir = join(routesDir, '.well-known/workflow/v1');\n\n // Ensure output directories exist\n await mkdir(workflowGeneratedDir, { recursive: true });\n\n // Add .gitignore to exclude generated files from version control\n if (process.env.VERCEL_DEPLOYMENT_ID === undefined) {\n await writeFile(join(workflowGeneratedDir, '.gitignore'), '*');\n }\n\n // Clean up stale V1 step route directory (may persist via Vercel build cache)\n await rm(join(workflowGeneratedDir, 'step'), {\n recursive: true,\n force: true,\n });\n\n // Get workflow and step files to bundle\n const inputFiles = await this.getInputFiles();\n const tsconfigPath = await this.findTsConfigPath();\n\n // Create combined bundle for flow route\n const flowRouteDir = join(workflowGeneratedDir, 'flow');\n await mkdir(flowRouteDir, { recursive: true });\n\n const { manifest } = await this.createCombinedBundle({\n inputFiles,\n stepsOutfile: join(flowRouteDir, '__step_registrations.js'),\n flowOutfile: join(flowRouteDir, '+server.js'),\n format: 'esm',\n bundleFinalOutput: false,\n externalizeNonSteps: true,\n tsconfigPath,\n });\n\n // Post-process the generated file to wrap with SvelteKit request converter\n const workflowsRouteFile = join(flowRouteDir, '+server.js');\n let workflowsRouteContent = await readFile(workflowsRouteFile, 'utf-8');\n\n // Replace the default export with SvelteKit-compatible handler\n workflowsRouteContent = workflowsRouteContent.replace(\n /export const POST = workflowEntrypoint\\(workflowCode\\);?$/m,\n `${NORMALIZE_REQUEST_CODE}\nexport const POST = async ({request}) => {\n const normalRequest = await normalizeRequest(request);\n return workflowEntrypoint(workflowCode)(normalRequest);\n}`\n );\n await writeFile(workflowsRouteFile, workflowsRouteContent);\n\n await this.buildWebhookRoute({ workflowGeneratedDir });\n\n // Generate unified manifest\n const workflowBundlePath = join(workflowGeneratedDir, 'flow/+server.js');\n const manifestJson = await this.createManifest({\n workflowBundlePath,\n manifestDir: workflowGeneratedDir,\n manifest,\n });\n\n // Expose manifest as a static file when WORKFLOW_PUBLIC_MANIFEST=1.\n // SvelteKit serves files from static/ at the root URL.\n if (this.shouldExposePublicManifest && manifestJson) {\n const staticManifestDir = join(\n this.config.workingDir,\n 'static/.well-known/workflow/v1'\n );\n await mkdir(staticManifestDir, { recursive: true });\n await copyFile(\n join(workflowGeneratedDir, 'manifest.json'),\n join(staticManifestDir, 'manifest.json')\n );\n }\n }\n\n private async buildWebhookRoute({\n workflowGeneratedDir,\n }: {\n workflowGeneratedDir: string;\n }) {\n // Create webhook route: .well-known/workflow/v1/webhook/[token]/+server.js\n const webhookRouteFile = join(\n workflowGeneratedDir,\n 'webhook/[token]/+server.js'\n );\n\n await this.createWebhookBundle({\n outfile: webhookRouteFile,\n bundle: false, // SvelteKit will handle bundling\n });\n\n // Post-process the generated file to wrap with SvelteKit request converter\n let webhookRouteContent = await readFile(webhookRouteFile, 'utf-8');\n\n // Update handler signature to accept token as parameter\n webhookRouteContent = webhookRouteContent.replace(\n /async function handler\\(request\\) \\{[\\s\\S]*?const token = decodeURIComponent\\(pathParts\\[pathParts\\.length - 1\\]\\);/,\n `async function handler(request, token) {`\n );\n\n // Remove the URL parsing code since we get token from params\n webhookRouteContent = webhookRouteContent.replace(\n /const url = new URL\\(request\\.url\\);[\\s\\S]*?const pathParts = url\\.pathname\\.split\\('\\/'\\);[\\s\\S]*?\\n/,\n ''\n );\n\n // Replace all HTTP method exports with SvelteKit-compatible handlers\n webhookRouteContent = webhookRouteContent.replace(\n /export const GET = handler;\\nexport const POST = handler;\\nexport const PUT = handler;\\nexport const PATCH = handler;\\nexport const DELETE = handler;\\nexport const HEAD = handler;\\nexport const OPTIONS = handler;/,\n `${NORMALIZE_REQUEST_CODE}\nconst createSvelteKitHandler = (method) => async ({ request, params, platform }) => {\n const normalRequest = await normalizeRequest(request);\n const response = await handler(normalRequest, params.token);\n return response;\n};\n\nexport const GET = createSvelteKitHandler('GET');\nexport const POST = createSvelteKitHandler('POST');\nexport const PUT = createSvelteKitHandler('PUT');\nexport const PATCH = createSvelteKitHandler('PATCH');\nexport const DELETE = createSvelteKitHandler('DELETE');\nexport const HEAD = createSvelteKitHandler('HEAD');\nexport const OPTIONS = createSvelteKitHandler('OPTIONS');`\n );\n\n await writeFile(webhookRouteFile, webhookRouteContent);\n }\n\n private async findRoutesDirectory(): Promise<string> {\n const routesDir = resolve(this.config.workingDir, 'src/routes');\n const rootRoutesDir = resolve(this.config.workingDir, 'routes');\n\n // Try src/routes first (standard SvelteKit convention)\n try {\n await access(routesDir, constants.F_OK);\n const routesStats = await stat(routesDir);\n if (!routesStats.isDirectory()) {\n throw new Error(`Path exists but is not a directory: ${routesDir}`);\n }\n return routesDir;\n } catch {\n // Try routes as fallback\n try {\n await access(rootRoutesDir, constants.F_OK);\n const rootRoutesStats = await stat(rootRoutesDir);\n if (!rootRoutesStats.isDirectory()) {\n throw new Error(\n `Path exists but is not a directory: ${rootRoutesDir}`\n );\n }\n return rootRoutesDir;\n } catch {\n throw new Error(\n 'Could not find SvelteKit routes directory. Expected either \"src/routes\" or \"routes\" to exist.'\n );\n }\n }\n }\n}\n"]}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,UAAU,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,OAAO,GAAG,IAAI,gBAAgB,EAAE,CAAC;AAEvC,+DAA+D;AAC/D,6DAA6D;AAC7D,uDAAuD;AACvD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;AAEtB,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE;IAC5B,wDAAwD;IACxD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,CAAC;QACtC,OAAO;IACT,CAAC;IACD,2DAA2D;IAC3D,uCAAuC;IACvC,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI;QAC7B;YACE,IAAI,EAAE,4EAA4E;YAClF,MAAM,EAAE;gBACN,WAAW,EAAE,KAAK;gBAClB,oBAAoB,EAAE;oBACpB;wBACE,IAAI,EAAE,cAAc;wBACpB,KAAK,EAAE,kBAAkB;wBACzB,QAAQ,EAAE,SAAS;wBACnB,iBAAiB,EAAE,CAAC;wBACpB,mBAAmB,EAAE,CAAC;qBACvB;iBACF;aACF;SACF;KACF,EAAE,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,SAAS;QACX,CAAC;QACD,4DAA4D;QAC5D,+BAA+B;QAC/B,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACvC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACvB,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE3C,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,EAAE,CAAC,QAAQ,CACT,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,EACnE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CACzB,CAAC;QACJ,CAAC;QAED,mEAAmE;QACnE,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACjE,EAAE,CAAC,aAAa,CACd,IAAI,EACJ,IAAI,CAAC,SAAS,CAAC;YACb,GAAG,cAAc;YACjB,GAAG,MAAM;SACV,CAAC,CACH,CAAC;IACJ,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC","sourcesContent":["import path from 'node:path';\nimport fs from 'fs-extra';\n\nimport { SvelteKitBuilder } from './builder.js';\n\nconst builder = new SvelteKitBuilder();\n\n// This needs to be in the top-level as we need to create these\n// entries before svelte plugin is started or the entries are\n// a race to be created before svelte discovers entries\nawait builder.build();\n\nprocess.on('beforeExit', () => {\n // Don't patch functions output if not in Vercel adapter\n if (!process.env.VERCEL_DEPLOYMENT_ID) {\n return;\n }\n // V2: Only the combined flow handler needs queue triggers.\n // The separate step route was removed.\n for (const { file, config } of [\n {\n file: '.vercel/output/functions/.well-known/workflow/v1/flow.func/.vc-config.json',\n config: {\n maxDuration: 'max',\n experimentalTriggers: [\n {\n type: 'queue/v2beta',\n topic: '__wkf_workflow_*',\n consumer: 'default',\n retryAfterSeconds: 5,\n initialDelaySeconds: 0,\n },\n ],\n },\n },\n ]) {\n const funcDir = path.dirname(file);\n if (!fs.existsSync(funcDir)) {\n continue;\n }\n // Un-symlink these as they can't be shared due to different\n // experimental triggers config\n const toCopy = fs.readdirSync(funcDir);\n fs.removeSync(funcDir);\n fs.mkdirSync(funcDir, { recursive: true });\n\n for (const item of toCopy) {\n fs.copySync(\n path.join(funcDir.replace(/\\.func$/, ''), '__data.json.func', item),\n path.join(funcDir, item)\n );\n }\n\n // Update .vc-config.json with the new experimental triggers config\n const existingConfig = JSON.parse(fs.readFileSync(file, 'utf8'));\n fs.writeFileSync(\n file,\n JSON.stringify({\n ...existingConfig,\n ...config,\n })\n );\n }\n});\n\nexport { workflowPlugin } from './plugin.js';\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAYhD,MAAM,UAAU,cAAc,CAAC,UAAiC,EAAE;IAChE,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IAEnC,OAAO;QACL,uBAAuB,EAAY;QACnC;YACE,IAAI,EAAE,oBAAoB;SAC3B;QACD,uBAAuB,CAAC;YACtB,OAAO;YACP,OAAO;SACR,CAAC;KACH,CAAC;AACJ,CAAC","sourcesContent":["import { createBuildQueue } from '@workflow/builders';\nimport { workflowTransformPlugin } from '@workflow/rollup';\nimport { workflowHotUpdatePlugin } from '@workflow/vite';\nimport type { Plugin } from 'vite';\nimport { SvelteKitBuilder } from './builder.js';\n\nexport interface WorkflowPluginOptions {\n /**\n * Controls how source maps are emitted for workflow bundles. Accepts the\n * same values as esbuild's `sourcemap` option: `true`/`'inline'` (default),\n * `'linked'`, `'external'`, `'both'`, or `false` to omit source maps. Can\n * also be set via the `WORKFLOW_SOURCEMAP` environment variable.\n */\n sourcemap?: boolean | 'inline' | 'linked' | 'external' | 'both';\n}\n\nexport function workflowPlugin(options: WorkflowPluginOptions = {}): Plugin[] {\n const builder = new SvelteKitBuilder({ sourcemap: options.sourcemap });\n const enqueue = createBuildQueue();\n\n return [\n workflowTransformPlugin() as Plugin,\n {\n name: 'workflow:sveltekit',\n },\n workflowHotUpdatePlugin({\n builder,\n enqueue,\n }),\n ];\n}\n"]}