Skip to content

Commit f664b8b

Browse files
committed
make outDir configurable - closes #4052
1 parent cfe545d commit f664b8b

File tree

15 files changed

+61
-64
lines changed

15 files changed

+61
-64
lines changed

packages/kit/src/core/adapt/builder.js

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { SVELTE_KIT } from '../constants.js';
21
import { copy, rimraf, mkdirp } from '../../utils/filesystem.js';
32
import { prerender } from './prerender/prerender.js';
43
import { generate_manifest } from '../generate_manifest/index.js';
@@ -118,29 +117,29 @@ export function create_builder({ cwd, config, build_data, log }) {
118117
},
119118

120119
getBuildDirectory(name) {
121-
return `${cwd}/${SVELTE_KIT}/${name}`;
120+
return `${config.kit.outDir}/${name}`;
122121
},
123122

124123
getClientDirectory() {
125-
return `${cwd}/${SVELTE_KIT}/output/client`;
124+
return `${config.kit.outDir}/output/client`;
126125
},
127126

128127
getServerDirectory() {
129-
return `${cwd}/${SVELTE_KIT}/output/server`;
128+
return `${config.kit.outDir}/output/server`;
130129
},
131130

132131
getStaticDirectory() {
133132
return config.kit.files.assets;
134133
},
135134

136135
writeClient(dest) {
137-
return copy(`${cwd}/${SVELTE_KIT}/output/client`, dest, {
136+
return copy(`${config.kit.outDir}/output/client`, dest, {
138137
filter: (file) => file[0] !== '.'
139138
});
140139
},
141140

142141
writeServer(dest) {
143-
return copy(`${cwd}/${SVELTE_KIT}/output/server`, dest, {
142+
return copy(`${config.kit.outDir}/output/server`, dest, {
144143
filter: (file) => file[0] !== '.'
145144
});
146145
},

packages/kit/src/core/adapt/builder.spec.js

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ import * as assert from 'uvu/assert';
55
import glob from 'tiny-glob/sync.js';
66
import { create_builder } from './builder.js';
77
import { fileURLToPath } from 'url';
8-
import { SVELTE_KIT } from '../constants.js';
98

109
const __filename = fileURLToPath(import.meta.url);
1110
const __dirname = join(__filename, '..');
1211

1312
test('copy files', () => {
1413
const cwd = join(__dirname, 'fixtures/basic');
14+
const outDir = join(cwd, '.svelte-kit');
1515

1616
/** @type {import('types').Config} */
1717
const mocked = {
@@ -20,7 +20,8 @@ test('copy files', () => {
2020
appDir: '_app',
2121
files: {
2222
assets: join(__dirname, 'fixtures/basic/static')
23-
}
23+
},
24+
outDir
2425
}
2526
};
2627

@@ -48,18 +49,12 @@ test('copy files', () => {
4849
rmSync(dest, { recursive: true, force: true });
4950
builder.writeClient(dest);
5051

51-
assert.equal(
52-
glob('**', { cwd: `${cwd}/${SVELTE_KIT}/output/client` }),
53-
glob('**', { cwd: dest })
54-
);
52+
assert.equal(glob('**', { cwd: `${outDir}/output/client` }), glob('**', { cwd: dest }));
5553

5654
rmSync(dest, { recursive: true, force: true });
5755
builder.writeServer(dest);
5856

59-
assert.equal(
60-
glob('**', { cwd: `${cwd}/${SVELTE_KIT}/output/server` }),
61-
glob('**', { cwd: dest })
62-
);
57+
assert.equal(glob('**', { cwd: `${outDir}/output/server` }), glob('**', { cwd: dest }));
6358

6459
rmSync(dest, { force: true, recursive: true });
6560
});

packages/kit/src/core/adapt/prerender/prerender.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { dirname, join, resolve as resolve_path } from 'path';
33
import { pathToFileURL, URL } from 'url';
44
import { mkdirp } from '../../../utils/filesystem.js';
55
import { installFetch } from '../../../install-fetch.js';
6-
import { SVELTE_KIT } from '../../constants.js';
76
import { is_root_relative, normalize_path, resolve } from '../../../utils/url.js';
87
import { queue } from './queue.js';
98
import { crawl } from './crawl.js';
@@ -65,7 +64,7 @@ export async function prerender({ cwd, out, log, config, build_data, fallback, a
6564

6665
installFetch();
6766

68-
const server_root = resolve_path(cwd, `${SVELTE_KIT}/output`);
67+
const server_root = join(config.kit.outDir, 'output');
6968

7069
/** @type {import('types').ServerModule} */
7170
const { Server, override } = await import(pathToFileURL(`${server_root}/server/index.js`).href);

packages/kit/src/core/build/build_client.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import { print_config_conflicts } from '../config/index.js';
66
import { create_app } from '../create_app/index.js';
77
import { copy_assets, get_aliases } from '../utils.js';
88
import { create_build, find_deps } from './utils.js';
9-
import { SVELTE_KIT } from '../constants.js';
109
import { posixify } from '../../utils/filesystem.js';
1110

1211
/**
@@ -39,7 +38,7 @@ export async function build_client({
3938
cwd
4039
});
4140

42-
copy_assets(`${SVELTE_KIT}/runtime`);
41+
copy_assets(path.join(config.kit.outDir, 'runtime'));
4342

4443
process.env.VITE_SVELTEKIT_AMP = config.kit.amp ? 'true' : '';
4544

packages/kit/src/core/build/build_server.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,21 @@ import { svelte } from '@sveltejs/vite-plugin-svelte';
44
import { mkdirp, posixify } from '../../utils/filesystem.js';
55
import { deep_merge } from '../../utils/object.js';
66
import { load_template, print_config_conflicts } from '../config/index.js';
7-
import { get_aliases, resolve_entry, runtime } from '../utils.js';
7+
import { get_aliases, get_runtime_path, resolve_entry } from '../utils.js';
88
import { create_build, find_deps } from './utils.js';
9-
import { SVELTE_KIT } from '../constants.js';
109
import { s } from '../../utils/misc.js';
1110

1211
/**
1312
* @param {{
1413
* hooks: string;
1514
* config: import('types').ValidatedConfig;
1615
* has_service_worker: boolean;
16+
* runtime: string;
1717
* template: string;
1818
* }} opts
1919
* @returns
2020
*/
21-
const server_template = ({ config, hooks, has_service_worker, template }) => `
21+
const server_template = ({ config, hooks, has_service_worker, runtime, template }) => `
2222
import root from '__GENERATED__/root.svelte';
2323
import { respond } from '${runtime}/server/index.js';
2424
import { set_paths, assets, base } from '${runtime}/paths.js';
@@ -133,7 +133,7 @@ export async function build_server(
133133
) {
134134
let hooks_file = resolve_entry(config.kit.files.hooks);
135135
if (!hooks_file || !fs.existsSync(hooks_file)) {
136-
hooks_file = path.resolve(cwd, `${SVELTE_KIT}/build/hooks.js`);
136+
hooks_file = path.join(config.kit.outDir, 'build/hooks.js');
137137
fs.writeFileSync(hooks_file, '');
138138
}
139139

@@ -177,6 +177,7 @@ export async function build_server(
177177
config,
178178
hooks: app_relative(hooks_file),
179179
has_service_worker: service_worker_register && !!service_worker_entry_file,
180+
runtime: get_runtime_path(config),
180181
template: load_template(cwd, config)
181182
})
182183
);

packages/kit/src/core/build/build_service_worker.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import vite from 'vite';
33
import { s } from '../../utils/misc.js';
44
import { deep_merge } from '../../utils/object.js';
55
import { print_config_conflicts } from '../config/index.js';
6-
import { SVELTE_KIT } from '../constants.js';
76

87
/**
98
* @param {{
@@ -32,7 +31,7 @@ export async function build_service_worker(
3231
}
3332
}
3433

35-
const service_worker = `${cwd}/${SVELTE_KIT}/generated/service-worker.js`;
34+
const service_worker = `${config.kit.outDir}/generated/service-worker.js`;
3635

3736
fs.writeFileSync(
3837
service_worker,

packages/kit/src/core/build/index.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ import fs from 'fs';
22
import path from 'path';
33
import { mkdirp, rimraf, posixify } from '../../utils/filesystem.js';
44
import create_manifest_data from '../create_manifest_data/index.js';
5-
import { SVELTE_KIT } from '../constants.js';
6-
import { runtime, resolve_entry } from '../utils.js';
5+
import { get_runtime_path, resolve_entry } from '../utils.js';
76
import { generate_manifest } from '../generate_manifest/index.js';
87
import { build_service_worker } from './build_service_worker.js';
98
import { build_client } from './build_client.js';
@@ -17,11 +16,11 @@ import { generate_tsconfig } from '../tsconfig.js';
1716
export async function build(config) {
1817
const cwd = process.cwd(); // TODO is this necessary?
1918

20-
const build_dir = path.resolve(`${SVELTE_KIT}/build`);
19+
const build_dir = path.join(config.kit.outDir, 'build');
2120
rimraf(build_dir);
2221
mkdirp(build_dir);
2322

24-
const output_dir = path.resolve(`${SVELTE_KIT}/output`);
23+
const output_dir = path.join(config.kit.outDir, 'output');
2524
rimraf(output_dir);
2625
mkdirp(output_dir);
2726

@@ -41,7 +40,7 @@ export async function build(config) {
4140
cwd
4241
}),
4342
output_dir,
44-
client_entry_file: path.relative(cwd, `${runtime}/client/start.js`),
43+
client_entry_file: path.relative(cwd, `${get_runtime_path(config)}/client/start.js`),
4544
service_worker_entry_file: resolve_entry(config.kit.files.serviceWorker),
4645
service_worker_register: config.kit.serviceWorker.register
4746
};

packages/kit/src/core/constants.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
export const SVELTE_KIT = '.svelte-kit';
2-
31
// in `svelte-kit dev` and `svelte-kit preview`, we use a fake
42
// asset path so that we can serve local assets while still
53
// verifying that requests are correctly prefixed

packages/kit/src/core/create_app/index.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import fs from 'fs';
22
import path from 'path';
33
import { s } from '../../utils/misc.js';
44
import { mkdirp } from '../../utils/filesystem.js';
5-
import { SVELTE_KIT } from '../constants.js';
65

76
/** @type {Map<string, string>} */
87
const previous_contents = new Map();
@@ -29,7 +28,7 @@ export function write_if_changed(file, code) {
2928
* }} options
3029
*/
3130
export function create_app({ config, manifest_data, cwd = process.cwd() }) {
32-
const output = `${SVELTE_KIT}/generated`;
31+
const output = path.join(config.kit.outDir, 'generated');
3332
const base = path.relative(cwd, output);
3433

3534
write_if_changed(`${output}/manifest.js`, generate_client_manifest(manifest_data, base));
@@ -248,7 +247,7 @@ function create_types(config, manifest_data) {
248247
.filter(Boolean)
249248
.join(', ');
250249

251-
const file = `${SVELTE_KIT}/types/${key || 'index'}.d.ts`;
250+
const file = `${config.kit.outDir}/types/${key || 'index'}.d.ts`;
252251
const content = [
253252
'// this file is auto-generated',
254253
`import type { ${imports} } from '@sveltejs/kit';`,

packages/kit/src/core/create_manifest_data/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import fs from 'fs';
22
import path from 'path';
33
import mime from 'mime';
4-
import { runtime } from '../utils.js';
4+
import { get_runtime_path } from '../utils.js';
55
import { posixify } from '../../utils/filesystem.js';
66

77
/**
@@ -37,7 +37,7 @@ const specials = new Set(['__layout', '__layout.reset', '__error']);
3737
*/
3838
export default function create_manifest_data({
3939
config,
40-
fallback = `${runtime}/components`,
40+
fallback = `${get_runtime_path(config)}/components`,
4141
cwd = process.cwd()
4242
}) {
4343
/**

packages/kit/src/core/dev/index.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@ import { svelte } from '@sveltejs/vite-plugin-svelte';
33
import vite from 'vite';
44
import { deep_merge } from '../../utils/object.js';
55
import { print_config_conflicts } from '../config/index.js';
6-
import { SVELTE_KIT } from '../constants.js';
7-
import { copy_assets, get_aliases, runtime } from '../utils.js';
6+
import { copy_assets, get_aliases, get_runtime_path } from '../utils.js';
87
import { create_plugin } from './plugin.js';
98
import { generate_tsconfig } from '../tsconfig.js';
109

@@ -21,7 +20,7 @@ import { generate_tsconfig } from '../tsconfig.js';
2120

2221
/** @param {Options} opts */
2322
export async function dev({ cwd, port, host, https, config }) {
24-
copy_assets(`${SVELTE_KIT}/runtime`);
23+
copy_assets(path.join(config.kit.outDir, 'runtime'));
2524

2625
generate_tsconfig(config);
2726

@@ -34,8 +33,8 @@ export async function dev({ cwd, port, host, https, config }) {
3433
config.kit.files.assets,
3534
config.kit.files.lib,
3635
config.kit.files.routes,
36+
config.kit.outDir,
3737
path.resolve(cwd, 'src'),
38-
path.resolve(cwd, SVELTE_KIT),
3938
path.resolve(cwd, 'node_modules'),
4039
path.resolve(vite.searchForWorkspaceRoot(cwd), 'node_modules')
4140
])
@@ -58,7 +57,7 @@ export async function dev({ cwd, port, host, https, config }) {
5857
rollupOptions: {
5958
// Vite dependency crawler needs an explicit JS entry point
6059
// eventhough server otherwise works without it
61-
input: `${runtime}/client/start.js`
60+
input: `${get_runtime_path(config)}/client/start.js`
6261
}
6362
},
6463
plugins: [

packages/kit/src/core/dev/plugin.js

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import { installFetch } from '../../install-fetch.js';
77
import { create_app } from '../create_app/index.js';
88
import create_manifest_data from '../create_manifest_data/index.js';
99
import { getRequest, setResponse } from '../../node.js';
10-
import { SVELTE_KIT, SVELTE_KIT_ASSETS } from '../constants.js';
11-
import { get_mime_lookup, resolve_entry, runtime } from '../utils.js';
10+
import { SVELTE_KIT_ASSETS } from '../constants.js';
11+
import { get_mime_lookup, get_runtime_path, resolve_entry } from '../utils.js';
1212
import { coalesce_to_error } from '../../utils/error.js';
1313
import { load_template } from '../config/index.js';
1414
import { sequence } from '../../hooks.js';
@@ -19,6 +19,8 @@ import { sequence } from '../../hooks.js';
1919
* @returns {Promise<import('vite').Plugin>}
2020
*/
2121
export async function create_plugin(config, cwd) {
22+
const runtime = get_runtime_path(config);
23+
2224
/** @type {import('types').Handle} */
2325
let amp;
2426

@@ -228,9 +230,18 @@ export async function create_plugin(config, cwd) {
228230
throw new Error('The serverFetch hook has been renamed to externalFetch.');
229231
}
230232

231-
const root = (await vite.ssrLoadModule(`/${SVELTE_KIT}/generated/root.svelte`)).default;
233+
// TODO the / prefix will probably fail if outDir is outside the cwd (which
234+
// could be the case in a monorepo setup), but without it these modules
235+
// can get loaded twice via different URLs, which causes failures. Might
236+
// require changes to Vite to fix
237+
const { default: root } = await vite.ssrLoadModule(
238+
'/' + path.relative(cwd, `${config.kit.outDir}/generated/root.svelte`)
239+
);
240+
232241
const paths = await vite.ssrLoadModule(
233-
process.env.BUNDLED ? `/${SVELTE_KIT}/runtime/paths.js` : `/@fs${runtime}/paths.js`
242+
process.env.BUNDLED
243+
? '/' + path.relative(cwd, `${config.kit.outDir}/runtime/paths.js`)
244+
: `/@fs${runtime}/paths.js`
234245
);
235246

236247
paths.set_paths({

packages/kit/src/core/preview/index.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import fs from 'fs';
22
import http from 'http';
33
import https from 'https';
4-
import { join, resolve } from 'path';
4+
import { join } from 'path';
55
import sirv from 'sirv';
66
import { pathToFileURL } from 'url';
77
import { getRequest, setResponse } from '../../node.js';
88
import { installFetch } from '../../install-fetch.js';
9-
import { SVELTE_KIT, SVELTE_KIT_ASSETS } from '../constants.js';
9+
import { SVELTE_KIT_ASSETS } from '../constants.js';
1010

1111
/** @param {string} dir */
1212
const mutable = (dir) =>
@@ -33,8 +33,8 @@ export async function preview({
3333
}) {
3434
installFetch();
3535

36-
const index_file = resolve(cwd, `${SVELTE_KIT}/output/server/index.js`);
37-
const manifest_file = resolve(cwd, `${SVELTE_KIT}/output/server/manifest.js`);
36+
const index_file = join(config.kit.outDir, 'output/server/index.js');
37+
const manifest_file = join(config.kit.outDir, 'output/server/manifest.js');
3838

3939
/** @type {import('types').ServerModule} */
4040
const { Server, override } = await import(pathToFileURL(index_file).href);
@@ -49,7 +49,7 @@ export async function preview({
4949
return next();
5050
};
5151

52-
const assets_handler = sirv(resolve(cwd, `${SVELTE_KIT}/output/client`), {
52+
const assets_handler = sirv(join(config.kit.outDir, 'output/client'), {
5353
maxAge: 31536000,
5454
immutable: true
5555
});

0 commit comments

Comments
 (0)