Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
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/nasty-impalas-wear.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@sveltejs/kit': minor
---

feat: resolve paths using the Vite config `root` option instead of `process.cwd()` to better support monorepo configurations such as Vitest workspaces
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@
"@svitejs/changesets-changelog-github-compact": "catalog:",
"eslint": "catalog:",
"prettier": "catalog:",
"prettier-plugin-svelte": "catalog:"
"prettier-plugin-svelte": "catalog:",
"vitest": "catalog:"
},
"packageManager": "pnpm@10.30.3+sha512.c961d1e0a2d8e354ecaa5166b822516668b7f44cb5bd95122d590dd81922f606f5473b6d23ec4a5be05e7fcd18e8488d47d978bbe981872f1145d06e9a740017",
"engines": {
Expand Down
5 changes: 5 additions & 0 deletions packages/adapter-auto/vitest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// we need this file to prevent Vitest from resolving a Vitest config from another directory

import { defineConfig } from 'vitest/config';

export default defineConfig({});
1 change: 1 addition & 0 deletions packages/adapter-cloudflare/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
"utils.js",
"utils.spec.js",
"rolldown.config.js",
"vitest.config.js",
"test/utils.js",
"internal.d.ts",
"src/worker.js"
Expand Down
5 changes: 5 additions & 0 deletions packages/adapter-cloudflare/vitest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// we need this file to prevent Vitest from resolving a Vitest config from another directory

import { defineConfig } from 'vitest/config';

export default defineConfig({});
5 changes: 5 additions & 0 deletions packages/adapter-netlify/vitest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// we need this file to prevent Vitest from resolving a Vitest config from another directory

import { defineConfig } from 'vitest/config';

export default defineConfig({});
1 change: 1 addition & 0 deletions packages/adapter-node/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
"include": [
"index.js",
"rolldown.config.js",
"vitest.config.js",
"src/**/*.js",
"tests/**/*.js",
"tests/**/*.ts",
Expand Down
5 changes: 5 additions & 0 deletions packages/adapter-node/vitest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// we need this file to prevent Vitest from resolving a Vitest config from another directory

import { defineConfig } from 'vitest/config';

export default defineConfig({});
5 changes: 5 additions & 0 deletions packages/adapter-vercel/vitest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// we need this file to prevent Vitest from resolving a Vitest config from another directory

import { defineConfig } from 'vitest/config';

export default defineConfig({});
2 changes: 1 addition & 1 deletion packages/enhanced-img/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,5 @@
"noUnusedLocals": true,
"noUnusedParameters": true
},
"include": ["src/**/*", "types/**/*", "test/**/*"]
"include": ["src/**/*", "types/**/*", "test/**/*", "vitest.config.js"]
}
5 changes: 5 additions & 0 deletions packages/enhanced-img/vitest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// we need this file to prevent Vitest from resolving a Vitest config from another directory

import { defineConfig } from 'vitest/config';

export default defineConfig({});
7 changes: 5 additions & 2 deletions packages/kit/scripts/generate-version.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
import fs from 'node:fs';
import path from 'node:path';

const pkg = JSON.parse(fs.readFileSync('package.json', 'utf-8'));
const pkg = JSON.parse(
fs.readFileSync(path.join(import.meta.dirname, '..', 'package.json'), 'utf-8')
);

fs.writeFileSync(
'./src/version.js',
path.join(import.meta.dirname, '..', 'src', 'version.js'),
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Helps the version generation test run from the Vitest extension by avoiding resolving to the wrong path

`// generated during release, do not modify\n\n/** @type {string} */\nexport const VERSION = '${pkg.version}';\n`
);
2 changes: 1 addition & 1 deletion packages/kit/src/cli.js
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ if (command === 'sync') {
}

try {
const config = await load_config();
const config = await load_config({ cwd: process.cwd() });
const sync = await import('./core/sync/sync.js');
sync.all_types(config, values.mode);
} catch (error) {
Expand Down
12 changes: 8 additions & 4 deletions packages/kit/src/core/adapt/builder.js
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,8 @@ export function create_builder({
prerendered: [],
relative_path: relativePath,
routes: Array.from(filtered),
remotes
remotes,
root: vite_config.root
})
});
}
Expand All @@ -157,7 +158,8 @@ export function create_builder({
findServerAssets(route_data) {
return find_server_assets(
build_data,
route_data.map((route) => /** @type {import('types').RouteData} */ (lookup.get(route)))
route_data.map((route) => /** @type {import('types').RouteData} */ (lookup.get(route))),
vite_config.root
);
},

Expand All @@ -167,7 +169,8 @@ export function create_builder({

const fallback = await generate_fallback({
manifest_path,
env: { ...env.private, ...env.public }
env: { ...env.private, ...env.public },
root: vite_config.root
});

if (existsSync(dest)) {
Expand Down Expand Up @@ -197,7 +200,8 @@ export function create_builder({
routes: subset
? subset.map((route) => /** @type {import('types').RouteData} */ (lookup.get(route)))
: route_data.filter((route) => prerender_map.get(route.id) !== true),
remotes
remotes,
root: vite_config.root
});
},

Expand Down
9 changes: 5 additions & 4 deletions packages/kit/src/core/config/index.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import fs from 'node:fs';
import path from 'node:path';
import process from 'node:process';
import * as url from 'node:url';
import options from './options.js';

Expand Down Expand Up @@ -58,10 +57,10 @@ export function load_error_page(config) {

/**
* Loads and validates Svelte config file
* @param {{ cwd?: string }} options
* @param {{ cwd: string }} options
* @returns {Promise<import('types').ValidatedConfig>}
*/
export async function load_config({ cwd = process.cwd() } = {}) {
export async function load_config({ cwd }) {
const config_files = ['js', 'ts']
.map((ext) => path.join(cwd, `svelte.config.${ext}`))
.filter((f) => fs.existsSync(f));
Expand Down Expand Up @@ -93,11 +92,13 @@ export async function load_config({ cwd = process.cwd() } = {}) {

/**
* @param {import('@sveltejs/kit').Config} config
* @param {{ cwd: string }} options
* @returns {import('types').ValidatedConfig}
*/
function process_config(config, { cwd = process.cwd() } = {}) {
export function process_config(config, { cwd }) {
const validated = validate_config(config);

validated.kit.env.dir = path.resolve(cwd, validated.kit.env.dir);
validated.kit.outDir = path.resolve(cwd, validated.kit.outDir);

for (const key in validated.kit.files) {
Expand Down
7 changes: 4 additions & 3 deletions packages/kit/src/core/env.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { GENERATED_COMMENT } from '../constants.js';
import { dedent } from './sync/utils.js';
import { runtime_base } from './utils.js';
import { get_runtime_base } from './utils.js';

/**
* @typedef {'public' | 'private'} EnvType
Expand Down Expand Up @@ -32,15 +32,16 @@ export function create_static_module(id, env) {
/**
* @param {EnvType} type
* @param {Record<string, string> | undefined} dev_values If in a development mode, values to pre-populate the module with.
* @param {string} root
*/
export function create_dynamic_module(type, dev_values) {
export function create_dynamic_module(type, dev_values, root) {
if (dev_values) {
const keys = Object.entries(dev_values).map(
([k, v]) => `${JSON.stringify(k)}: ${JSON.stringify(v)}`
);
return `export const env = {\n${keys.join(',\n')}\n}`;
}
return `export { ${type}_env as env } from '${runtime_base}/shared-server.js';`;
return `export { ${type}_env as env } from '${get_runtime_base(root)}/shared-server.js';`;
}

/**
Expand Down
5 changes: 3 additions & 2 deletions packages/kit/src/core/generate_manifest/find_server_assets.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@ import { find_deps } from '../../exports/vite/build/utils.js';
* Finds all the assets that are imported by server files associated with `routes`
* @param {import('types').BuildData} build_data
* @param {import('types').RouteData[]} routes
* @param {string} root
*/
export function find_server_assets(build_data, routes) {
export function find_server_assets(build_data, routes, root) {
/**
* All nodes actually used in the routes definition (prerendered routes are omitted).
* Root layout/error is always included as they are needed for 404 and root errors.
Expand All @@ -19,7 +20,7 @@ export function find_server_assets(build_data, routes) {
/** @param {string} id */
function add_assets(id) {
if (id in build_data.server_manifest) {
const deps = find_deps(build_data.server_manifest, id, false);
const deps = find_deps(build_data.server_manifest, id, false, root);
for (const asset of deps.assets) {
server_assets.add(asset);
}
Expand Down
14 changes: 11 additions & 3 deletions packages/kit/src/core/generate_manifest/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,17 @@ import { uneval } from 'devalue';
* relative_path: string;
* routes: import('types').RouteData[];
* remotes: RemoteChunk[];
* root: string;
* }} opts
*/
export function generate_manifest({ build_data, prerendered, relative_path, routes, remotes }) {
export function generate_manifest({
build_data,
prerendered,
relative_path,
routes,
remotes,
root
}) {
/**
* @type {Map<any, number>} The new index of each node in the filtered nodes array
*/
Expand All @@ -34,7 +42,7 @@ export function generate_manifest({ build_data, prerendered, relative_path, rout
*/
const used_nodes = new Set([0, 1]);

const server_assets = find_server_assets(build_data, routes);
const server_assets = find_server_assets(build_data, routes, root);

for (const route of routes) {
if (route.page) {
Expand Down Expand Up @@ -119,7 +127,7 @@ export function generate_manifest({ build_data, prerendered, relative_path, rout
pattern: ${route.pattern},
params: ${s(route.params)},
page: ${route.page ? `{ layouts: ${get_nodes(route.page.layouts)}, errors: ${get_nodes(route.page.errors)}, leaf: ${reindexed.get(route.page.leaf)} }` : 'null'},
endpoint: ${route.endpoint ? loader(join_relative(relative_path, resolve_symlinks(build_data.server_manifest, route.endpoint.file).chunk.file)) : 'null'}
endpoint: ${route.endpoint ? loader(join_relative(relative_path, resolve_symlinks(build_data.server_manifest, route.endpoint.file, root).chunk.file)) : 'null'}
}
`;
}).filter(Boolean).join(',\n')}
Expand Down
18 changes: 15 additions & 3 deletions packages/kit/src/core/postbuild/analyse.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ export default forked(import.meta.url, analyse);
* out: string;
* output_config: import('types').RecursiveRequired<import('types').ValidatedConfig['kit']['output']>;
* remotes: RemoteChunk[];
* root: string;
* }} opts
*/
async function analyse({
Expand All @@ -36,13 +37,14 @@ async function analyse({
env,
out,
output_config,
remotes
remotes,
root
}) {
/** @type {import('@sveltejs/kit').SSRManifest} */
const manifest = (await import(pathToFileURL(manifest_path).href)).manifest;

/** @type {import('types').ValidatedKitConfig} */
const config = (await load_config()).kit;
const config = (await load_config({ cwd: root })).kit;

const server_root = join(config.outDir, 'output');

Expand All @@ -63,7 +65,17 @@ async function analyse({
internal.set_read_implementation((file) => createReadableStream(`${server_root}/server/${file}`));

// first, build server nodes without the client manifest so we can analyse it
build_server_nodes(out, config, manifest_data, server_manifest, null, null, null, output_config);
build_server_nodes(
out,
config,
manifest_data,
server_manifest,
null,
null,
null,
output_config,
root
);

/** @type {import('types').ServerMetadata} */
const metadata = {
Expand Down
7 changes: 4 additions & 3 deletions packages/kit/src/core/postbuild/fallback.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,13 @@ export default forked(import.meta.url, generate_fallback);
/**
* @param {{
* manifest_path: string;
* env: Record<string, string>
* env: Record<string, string>;
* root: string;
* }} opts
*/
async function generate_fallback({ manifest_path, env }) {
async function generate_fallback({ manifest_path, env, root }) {
/** @type {import('types').ValidatedKitConfig} */
const config = (await load_config()).kit;
const config = (await load_config({ cwd: root })).kit;

const server_root = join(config.outDir, 'output');

Expand Down
10 changes: 6 additions & 4 deletions packages/kit/src/core/postbuild/prerender.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,11 @@ const SPECIAL_HASHLINKS = new Set(['', 'top']);
* manifest_path: string;
* metadata: import('types').ServerMetadata;
* verbose: boolean;
* env: Record<string, string>
* env: Record<string, string>;
* root: string;
* }} opts
*/
async function prerender({ hash, out, manifest_path, metadata, verbose, env }) {
async function prerender({ hash, out, manifest_path, metadata, verbose, env, root }) {
/** @type {import('@sveltejs/kit').SSRManifest} */
const manifest = (await import(pathToFileURL(manifest_path).href)).manifest;

Expand Down Expand Up @@ -99,12 +100,13 @@ async function prerender({ hash, out, manifest_path, metadata, verbose, env }) {
const prerendered_routes = new Set();

/** @type {import('types').ValidatedKitConfig} */
const config = (await load_config()).kit;
const config = (await load_config({ cwd: root })).kit;

if (hash) {
const fallback = await generate_fallback({
manifest_path,
env
env,
root
});

const file = output_filename('/', true);
Expand Down
Loading
Loading