Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/tame-loaders-resolve.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@sveltejs/kit': patch
---

fix: externalize linked dependencies when loading explicit environment variables
1 change: 1 addition & 0 deletions packages/kit/src/core/env.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ export async function load_explicit_env(kit, file, root, mode) {

const server = await vite.createServer({
configFile: false,
ssr: { external: true },
logLevel: 'silent',
mode,
define: {
Expand Down
102 changes: 102 additions & 0 deletions packages/kit/src/core/sync/sync.spec.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import { execFileSync } from 'node:child_process';
import fs from 'node:fs';
import os from 'node:os';
import path from 'node:path';
import process from 'node:process';
import { pathToFileURL } from 'node:url';
import { expect, test } from 'vitest';
import { process_config, validate_config } from '../config/index.js';
import { relative_path } from '../../utils/filesystem.js';
Expand Down Expand Up @@ -98,3 +101,102 @@
fs.rmSync(root, { recursive: true, force: true });
}
});

test('externalizes linked dependencies when loading explicit environment variables', () => {
const root = fs.mkdtempSync(path.join(os.tmpdir(), 'svelte-kit-env-'));
const dependency = path.join(root, 'packages/linked-env-dependency');
const loader = path.join(root, 'loader');
const node_modules = path.join(root, 'node_modules');

fs.mkdirSync(path.join(root, 'src'), { recursive: true });
fs.mkdirSync(dependency, { recursive: true });
fs.mkdirSync(loader, { recursive: true });
fs.mkdirSync(node_modules, { recursive: true });

fs.writeFileSync(path.join(root, 'package.json'), '{"type":"module"}');
fs.writeFileSync(
path.join(root, 'src/env.js'),
`import { marker } from 'linked-env-dependency';

export const variables = {
TEST: { description: marker }
};
`
);
fs.writeFileSync(
path.join(dependency, 'package.json'),
'{"name":"linked-env-dependency","type":"module","exports":"./index.js"}'
);
fs.writeFileSync(
path.join(dependency, 'index.js'),
`import { marker } from 'loader-target';

export { marker };
`
);
fs.writeFileSync(path.join(loader, 'target.js'), `export const marker = 'resolved by loader';\n`);
fs.writeFileSync(
path.join(loader, 'hooks.js'),
`export async function resolve(specifier, context, nextResolve) {
if (specifier === 'loader-target') {
return {
url: new URL('./target.js', import.meta.url).href,
shortCircuit: true
};
}

return nextResolve(specifier, context);
}
`
);
fs.writeFileSync(
path.join(loader, 'register.js'),
`import { register } from 'node:module';

register('./hooks.js', import.meta.url);
`
);

const config_url = pathToFileURL(path.resolve(import.meta.dirname, '../config/index.js')).href;
const env_url = pathToFileURL(path.resolve(import.meta.dirname, '../env.js')).href;
fs.writeFileSync(
path.join(root, 'run.js'),
`import { fileURLToPath } from 'node:url';
import { process_config, validate_config } from ${JSON.stringify(config_url)};
import { load_explicit_env } from ${JSON.stringify(env_url)};

const config = process_config(validate_config({}), import.meta.dirname);
const file = fileURLToPath(new URL('./src/env.js', import.meta.url));
const { variables } = await load_explicit_env(config, file, import.meta.dirname, 'development');

if (variables.TEST.description !== 'resolved by loader') {
throw new Error('Node loader was not used');
}
`
);

const link_type = process.platform === 'win32' ? 'junction' : 'dir';
fs.symlinkSync(dependency, path.join(node_modules, 'linked-env-dependency'), link_type);
fs.symlinkSync(
path.resolve(import.meta.dirname, '../../../node_modules/vite'),
path.join(node_modules, 'vite'),
link_type
);

try {
execFileSync(process.execPath, [path.join(root, 'run.js')], {

Check failure on line 187 in packages/kit/src/core/sync/sync.spec.js

View workflow job for this annotation

GitHub Actions / test (test:kit:unit, 24, windows-latest)

[kit-server-dev] src/core/sync/sync.spec.js > externalizes linked dependencies when loading explicit environment variables

Error: Command failed: C:\Users\runneradmin\setup-pnpm\global\v11\b18d9690784fd6811328e505a24831dab2e02f59aafadf8ad2485f14fb73e74f\node_modules\node\node.exe C:\Users\RUNNER~1\AppData\Local\Temp\svelte-kit-env-42wM8I\run.js Assertion failed: !_wcsnicmp(filename, dir, dirlen), file src\win\fs-event.c, line 72 ❯ src/core/sync/sync.spec.js:187:3 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { status: 3221226505, signal: null, output: [ null, '<Buffer(0) ...>', '<Buffer(87) ...>' ], pid: 4192, stdout: '<Buffer(0) ...>', stderr: '<Buffer(87) ...>' }
cwd: root,
env: {
...process.env,
NODE_OPTIONS: [
process.env.NODE_OPTIONS,
`--import=${pathToFileURL(path.join(loader, 'register.js')).href}`
]
.filter(Boolean)
.join(' ')
}
});
} finally {
fs.rmSync(root, { recursive: true, force: true });
}
});
Loading