Skip to content

Commit c4071b2

Browse files
committed
fix: Bundle the SQL migration handler into a self-contained worker
module.
1 parent 6a14a4c commit c4071b2

2 files changed

Lines changed: 55 additions & 20 deletions

File tree

‎packages/void/src/cli/wrapper.ts‎

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -139,11 +139,12 @@ export async function generateWrapper(
139139
`Migration handler not found: ${handlerFilename_}. Run "pnpm -C packages/void build" first.`,
140140
);
141141
}
142-
if (features.migrationDialect === 'postgresql') {
143-
await bundlePgMigrationHandler(root, workerDir, handlerPath);
144-
} else {
145-
copyFileSync(handlerPath, join(workerDir, '__void_migration_handler.mjs'));
146-
}
142+
await bundleMigrationHandler(
143+
root,
144+
workerDir,
145+
handlerPath,
146+
features.migrationDialect ?? 'sqlite',
147+
);
147148
}
148149

149150
// Write wrapper in place of original entry
@@ -157,30 +158,36 @@ export async function generateWrapper(
157158
writeFileSync(join(workerDir, workerMain), wrapperSource);
158159
}
159160

160-
async function bundlePgMigrationHandler(
161+
async function bundleMigrationHandler(
161162
root: string,
162163
workerDir: string,
163164
handlerPath: string,
165+
dialect: 'sqlite' | 'postgresql',
164166
): Promise<void> {
165167
const tmpDir = join(root, '.void', 'migration-handler');
166168
mkdirSync(tmpDir, { recursive: true });
167169
const outDir = join(tmpDir, 'out');
170+
const isPostgresql = dialect === 'postgresql';
168171
await build({
169172
root: tmpDir,
170173
logLevel: 'silent',
171-
resolve: {
172-
alias: {
173-
'pg-cloudflare': resolvePgCloudflareWorkerdEntry(handlerPath),
174-
'pg-pool': resolvePgCjsDependency(handlerPath, 'pg-pool'),
175-
},
176-
conditions: ['workerd', 'worker', 'browser', 'module', 'import', 'default'],
177-
},
178-
ssr: {
179-
noExternal: ['pg', 'pg-cloudflare'],
180-
resolve: {
181-
conditions: ['workerd', 'worker', 'browser', 'module', 'import', 'default'],
182-
},
183-
},
174+
resolve: isPostgresql
175+
? {
176+
alias: {
177+
'pg-cloudflare': resolvePgCloudflareWorkerdEntry(handlerPath),
178+
'pg-pool': resolvePgCjsDependency(handlerPath, 'pg-pool'),
179+
},
180+
conditions: ['workerd', 'worker', 'browser', 'module', 'import', 'default'],
181+
}
182+
: undefined,
183+
ssr: isPostgresql
184+
? {
185+
noExternal: ['pg', 'pg-cloudflare'],
186+
resolve: {
187+
conditions: ['workerd', 'worker', 'browser', 'module', 'import', 'default'],
188+
},
189+
}
190+
: undefined,
184191
build: {
185192
outDir,
186193
emptyOutDir: true,
@@ -198,7 +205,9 @@ async function bundlePgMigrationHandler(
198205
},
199206
});
200207

201-
patchPgWorkerBundle(outDir);
208+
if (isPostgresql) {
209+
patchPgWorkerBundle(outDir);
210+
}
202211
for (const file of readdirSync(outDir)) {
203212
copyFileSync(join(outDir, file), join(workerDir, file));
204213
}

‎packages/void/test/unit/wrapper.test.ts‎

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,32 @@ describe('generateWrapper with migrations', () => {
101101
expect(existsSync(join(workerDir, '__void_migration_handler.mjs'))).toBe(true);
102102
});
103103

104+
it('bundles the SQLite migration handler into a self-contained worker module', async () => {
105+
mkdirSync(workerDir, { recursive: true });
106+
writeFileSync(
107+
join(workerDir, 'index.mjs'),
108+
'export default { fetch() { return new Response("ok"); } };',
109+
);
110+
111+
mkdirSync(join(projectRoot, 'db', 'migrations'), { recursive: true });
112+
writeFileSync(
113+
join(projectRoot, 'db', 'migrations', '001_test.sql'),
114+
'CREATE TABLE test (id INTEGER PRIMARY KEY);',
115+
);
116+
117+
await generateWrapper(workerDir, 'index.mjs', projectRoot, {
118+
...base,
119+
hasMigrations: true,
120+
migrationDialect: 'sqlite',
121+
});
122+
123+
const handler = readFileSync(join(workerDir, '__void_migration_handler.mjs'), 'utf-8');
124+
expect(handler).not.toMatch(/from\s+["']\.\.\//);
125+
expect(handler).not.toContain('../migrations/canonical-json');
126+
expect(handler).not.toContain('../canonical-json-');
127+
expect(handler).toContain('function canonicalJson');
128+
});
129+
104130
it('includes migrations JSON in wrapper source', async () => {
105131
mkdirSync(workerDir, { recursive: true });
106132
writeFileSync(

0 commit comments

Comments
 (0)