Skip to content

Commit c556511

Browse files
Convert build to Vite plugin and expose as @sveltejs/kit/experimental/vite (#5094)
* Expose Vite plugin as @sveltejs/kit/vite * make svelte config optional * Implement build * export as experimental/vite for now * add plugin correct number of times with or without vite.config.js * add TODO * don't rename dev file for now * update API * cleanup * Update packages/kit/src/vite/plugin.js Co-authored-by: Rich Harris <[email protected]> * Revert "Update packages/kit/src/vite/plugin.js" This reverts commit 4d60028. * enable validation plugin * enable validation for real this time * add validation plugin to all builds * format * fix plugin handling * format * cleanup API * remove configFile: false * fix validation plugin * fix preview * Update healthy-carrots-cross.md * move dev/build/preview inside vite plugin * move adapt inside build * move all vite-related code into src/vite * move some more stuff around * fix some stuff * simplify stuff * remove unused plugins_internal * we can now simplify stuff a bunch * simplify * lint * update path in .prettierrc * revert accidental change * try fixing CI * try fixing CI * lint * lint * fix * appease typescript. not sure why this started happening * whyyy * simplify * simplify * simplify * respect user config in build * update turbo cache * format * resolveJsonModule * remove unnecessary configResolved hook * remove unused option * minor simplification * simplify * move some stuff closer to where its used * dry some stuff out, move some stuff to buildStart * do all config checking up-front * remove unused print_config_conflicts * remove unused import * simplify merging * remove unused import * remove blank line * i think these files were committed by mistake * set env vars earlier Co-authored-by: Rich Harris <[email protected]> Co-authored-by: Rich Harris <[email protected]>
1 parent ddb43dc commit c556511

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+1214
-1171
lines changed

.changeset/healthy-carrots-cross.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@sveltejs/kit': patch
3+
---
4+
5+
Expose Vite plugin as @sveltejs/kit/experimental/vite

.prettierrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
"packages/kit/src/packaging/test/fixtures/**/expected/**/*",
2525
"packages/kit/src/packaging/test/watch/expected/**/*",
2626
"packages/kit/src/packaging/test/watch/package/**/*",
27-
"packages/kit/src/core/build/prerender/fixtures/**/*"
27+
"packages/kit/src/vite/build/prerender/fixtures/**/*"
2828
],
2929
"options": {
3030
"requirePragma": true

packages/kit/.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
/docs
66
/test/**/.svelte-kit
77
/test/**/build
8-
!/src/core/adapt/fixtures/*/.svelte-kit
8+
!/src/vite/build/adapt/fixtures/*/.svelte-kit
99
!/test/node_modules
1010
/test/apps/basics/test/errors.json
1111
.custom-out-dir

packages/kit/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@
8888
},
8989
"./hooks": {
9090
"import": "./dist/hooks.js"
91+
},
92+
"./experimental/vite": {
93+
"import": "./dist/vite.js"
9194
}
9295
},
9396
"types": "types/index.d.ts",

packages/kit/rollup.config.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ export default [
6363
cli: 'src/cli.js',
6464
node: 'src/node/index.js',
6565
'node/polyfills': 'src/node/polyfills.js',
66-
hooks: 'src/hooks.js'
66+
hooks: 'src/hooks.js',
67+
vite: 'src/vite/index.js'
6768
},
6869
output: {
6970
dir: 'dist',

packages/kit/src/cli.js

Lines changed: 38 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
import chokidar from 'chokidar';
22
import fs from 'fs';
3+
import path from 'path';
34
import colors from 'kleur';
4-
import { relative } from 'path';
55
import sade from 'sade';
66
import * as vite from 'vite';
77
import { load_config } from './core/config/index.js';
88
import { networkInterfaces, release } from 'os';
99
import { coalesce_to_error } from './utils/error.js';
10-
import { logger } from './core/utils.js';
1110

1211
/** @param {unknown} e */
1312
function handle_error(e) {
@@ -62,15 +61,8 @@ prog
6261
let close;
6362

6463
async function start() {
65-
const { plugins } = await import('./core/dev/plugin.js');
6664
const svelte_config = await load_config();
67-
const vite_config = await svelte_config.kit.vite();
68-
69-
/** @type {import('vite').UserConfig} */
70-
const config = {
71-
...vite_config,
72-
plugins: [...(vite_config.plugins || []), plugins(svelte_config)]
73-
};
65+
const config = await get_vite_config(svelte_config);
7466
config.server = config.server || {};
7567

7668
// optional config from command-line flags
@@ -81,7 +73,7 @@ prog
8173

8274
// if https is already enabled then do nothing. it could be an object and we
8375
// don't want to overwrite with a boolean
84-
if (https && !vite_config?.server?.https) {
76+
if (https && !config?.server?.https) {
8577
config.server.https = https;
8678
}
8779

@@ -158,31 +150,11 @@ prog
158150
.action(async ({ verbose }) => {
159151
try {
160152
process.env.NODE_ENV = process.env.NODE_ENV || 'production';
161-
const config = await load_config();
162-
163-
const log = logger({ verbose });
164-
165-
const { build } = await import('./core/build/index.js');
166-
const { build_data, prerendered } = await build(config, { log });
167-
168-
console.log(
169-
`\nRun ${colors.bold().cyan('npm run preview')} to preview your production build locally.`
170-
);
171-
172-
if (config.kit.adapter) {
173-
const { adapt } = await import('./core/adapt/index.js');
174-
await adapt(config, build_data, prerendered, { log });
153+
process.env.VERBOSE = verbose;
175154

176-
// this is necessary to close any open db connections, etc
177-
process.exit(0);
178-
}
179-
180-
console.log(colors.bold().yellow('\nNo adapter specified'));
181-
182-
// prettier-ignore
183-
console.log(
184-
`See ${colors.bold().cyan('https://kit.svelte.dev/docs/adapters')} to learn how to configure your app to run on the platform of your choosing`
185-
);
155+
const svelte_config = await load_config();
156+
const vite_config = await get_vite_config(svelte_config);
157+
await vite.build(vite_config); // TODO when we get rid of config.kit.vite, this can just be vite.build()
186158
} catch (error) {
187159
handle_error(error);
188160
}
@@ -202,30 +174,18 @@ prog
202174

203175
process.env.NODE_ENV = process.env.NODE_ENV || 'production';
204176

205-
const { sveltekit_plugin } = await import('./core/preview/index.js');
206177
const svelte_config = await load_config();
207-
const vite_config = await svelte_config.kit.vite();
178+
const vite_config = await get_vite_config(svelte_config);
208179

209-
/** @type {import('vite').UserConfig} */
210-
const config = {
211-
...vite_config,
212-
plugins: [...(vite_config.plugins || []), sveltekit_plugin]
213-
};
214-
config.preview = config.preview || {};
180+
vite_config.preview = vite_config.preview || {};
215181

216182
// optional config from command-line flags
217183
// these should take precedence, but not print conflict warnings
218-
if (host) {
219-
config.preview.host = host;
220-
}
221-
if (https) {
222-
config.preview.https = https;
223-
}
224-
if (port) {
225-
config.preview.port = port;
226-
}
184+
if (host) vite_config.preview.host = host;
185+
if (https) vite_config.preview.https = https;
186+
if (port) vite_config.preview.port = port;
227187

228-
const preview_server = await vite.preview(config);
188+
const preview_server = await vite.preview(vite_config);
229189

230190
welcome({ port, host, https, open, base: preview_server.config.base });
231191
} catch (error) {
@@ -305,7 +265,7 @@ function welcome({ port, host, https, open, base, loose, allow, cwd }) {
305265
if (loose) {
306266
console.log(`\n ${colors.yellow('Serving with vite.server.fs.strict: false. Note that all files on your machine will be accessible to anyone on your network.')}`);
307267
} else if (allow?.length && cwd) {
308-
console.log(`\n ${colors.yellow('Note that all files in the following directories will be accessible to anyone on your network: ' + allow.map(a => relative(cwd, a)).join(', '))}`);
268+
console.log(`\n ${colors.yellow('Note that all files in the following directories will be accessible to anyone on your network: ' + allow.map(a => path.relative(cwd, a)).join(', '))}`);
309269
}
310270
} else {
311271
console.log(` ${colors.gray('network: not exposed')}`);
@@ -320,3 +280,27 @@ function welcome({ port, host, https, open, base, loose, allow, cwd }) {
320280

321281
console.log('\n');
322282
}
283+
284+
/**
285+
* @param {import('types').ValidatedConfig} svelte_config
286+
* @return {Promise<import('vite').UserConfig>}
287+
*/
288+
export async function get_vite_config(svelte_config) {
289+
for (const file of ['vite.config.js', 'vite.config.mjs', 'vite.config.cjs']) {
290+
if (fs.existsSync(file)) {
291+
// TODO warn here if config.kit.vite was specified
292+
const module = await import(path.resolve(file));
293+
return {
294+
...module.default,
295+
configFile: false
296+
};
297+
}
298+
}
299+
300+
const { sveltekit } = await import('./vite/index.js');
301+
302+
// TODO: stop reading Vite config from SvelteKit config or move to CLI
303+
const vite_config = await svelte_config.kit.vite();
304+
vite_config.plugins = [...(vite_config.plugins || []), ...sveltekit()];
305+
return vite_config;
306+
}

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

Lines changed: 0 additions & 79 deletions
This file was deleted.

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

Lines changed: 0 additions & 91 deletions
This file was deleted.

0 commit comments

Comments
 (0)