From ae5c4b1d81f159a3a815041b909dd55bf442ac21 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Sun, 10 Oct 2021 11:35:53 -0700 Subject: [PATCH] [breaking] do a single bundling with Vite removing esbuild --- .changeset/tidy-pets-tan.md | 9 ++++++ examples/hn.svelte.dev/package.json | 1 + examples/hn.svelte.dev/svelte.config.js | 4 +-- .../adapter-cloudflare-workers/files/entry.js | 5 ++-- packages/adapter-netlify/files/entry.js | 5 ++-- packages/adapter-node/package.json | 13 +-------- packages/adapter-node/rollup.config.js | 4 +-- packages/adapter-node/src/env.js | 3 ++ packages/adapter-node/src/index.js | 5 ++-- packages/adapter-node/src/middlewares.js | 6 ++-- packages/adapter-vercel/files/entry.js | 6 ++-- packages/kit/src/cli.js | 23 +++++++-------- packages/kit/src/core/adapt/index.js | 20 ------------- packages/kit/src/core/build/index.js | 29 ++++++++++++------- packages/kit/src/core/config/options.js | 18 ++++++------ packages/kit/src/runtime/app/navigation.js | 18 +++++++----- packages/kit/test/test.js | 2 +- pnpm-lock.yaml | 2 ++ 18 files changed, 82 insertions(+), 91 deletions(-) create mode 100644 .changeset/tidy-pets-tan.md create mode 100644 packages/adapter-node/src/env.js delete mode 100644 packages/kit/src/core/adapt/index.js diff --git a/.changeset/tidy-pets-tan.md b/.changeset/tidy-pets-tan.md new file mode 100644 index 000000000000..040b4aabf6a3 --- /dev/null +++ b/.changeset/tidy-pets-tan.md @@ -0,0 +1,9 @@ +--- +'@sveltejs/adapter-cloudflare-workers': patch +'@sveltejs/adapter-netlify': patch +'@sveltejs/adapter-node': patch +'@sveltejs/adapter-vercel': patch +'@sveltejs/kit': patch +--- + +[breaking] do a single bundling with Vite removing esbuild diff --git a/examples/hn.svelte.dev/package.json b/examples/hn.svelte.dev/package.json index c5aad6e5c5f1..e3d747f859b1 100644 --- a/examples/hn.svelte.dev/package.json +++ b/examples/hn.svelte.dev/package.json @@ -10,6 +10,7 @@ }, "devDependencies": { "@sveltejs/adapter-netlify": "workspace:*", + "@sveltejs/adapter-node": "workspace:*", "@sveltejs/kit": "workspace:*", "svelte": "^3.43.1" } diff --git a/examples/hn.svelte.dev/svelte.config.js b/examples/hn.svelte.dev/svelte.config.js index 35c263652b6d..f5c543e02b43 100644 --- a/examples/hn.svelte.dev/svelte.config.js +++ b/examples/hn.svelte.dev/svelte.config.js @@ -1,8 +1,6 @@ -import netlify from '@sveltejs/adapter-netlify'; - export default { kit: { - adapter: netlify(), + adapter: '@sveltejs/adapter-node', target: '#svelte' } }; diff --git a/packages/adapter-cloudflare-workers/files/entry.js b/packages/adapter-cloudflare-workers/files/entry.js index f7a7e397a620..1756a80c0312 100644 --- a/packages/adapter-cloudflare-workers/files/entry.js +++ b/packages/adapter-cloudflare-workers/files/entry.js @@ -1,5 +1,6 @@ -// TODO hardcoding the relative location makes this brittle -import { init, render } from '../output/server/app.js'; +// @sveltejs/kit-app doesn't exist until the app is built +// @ts-ignore +import { init, render } from '@sveltejs/kit-app'; import { getAssetFromKV, NotFoundError } from '@cloudflare/kv-asset-handler'; init(); diff --git a/packages/adapter-netlify/files/entry.js b/packages/adapter-netlify/files/entry.js index e5e7fd718c77..94137568a035 100644 --- a/packages/adapter-netlify/files/entry.js +++ b/packages/adapter-netlify/files/entry.js @@ -1,5 +1,6 @@ -// TODO hardcoding the relative location makes this brittle -import { init, render } from '../output/server/app.js'; +// @sveltejs/kit-app doesn't exist until the app is built +// @ts-ignore +import { init, render } from '@sveltejs/kit-app'; init(); diff --git a/packages/adapter-node/package.json b/packages/adapter-node/package.json index 1ce784c8265f..9b259df5e1e5 100644 --- a/packages/adapter-node/package.json +++ b/packages/adapter-node/package.json @@ -8,18 +8,7 @@ }, "homepage": "https://kit.svelte.dev", "type": "module", - "exports": { - ".": { - "import": "./index.js" - }, - "./package.json": "./package.json" - }, - "main": "index.js", - "types": "index.d.ts", - "files": [ - "files", - "index.d.ts" - ], + "main": "files/index.js", "scripts": { "dev": "rollup -cw", "build": "rollup -c", diff --git a/packages/adapter-node/rollup.config.js b/packages/adapter-node/rollup.config.js index 619756ee6c1e..88d2ca521897 100644 --- a/packages/adapter-node/rollup.config.js +++ b/packages/adapter-node/rollup.config.js @@ -11,7 +11,7 @@ export default [ sourcemap: true }, plugins: [nodeResolve(), commonjs(), json()], - external: ['../output/server/app.js', ...require('module').builtinModules] + external: ['@sveltejs/kit-app', ...require('module').builtinModules] }, { input: 'src/index.js', @@ -21,7 +21,7 @@ export default [ sourcemap: true }, plugins: [nodeResolve(), commonjs(), json()], - external: ['./middlewares.js', './env.js', ...require('module').builtinModules] + external: ['./middlewares.js', '@sveltejs/kit-app', ...require('module').builtinModules] }, { input: 'src/shims.js', diff --git a/packages/adapter-node/src/env.js b/packages/adapter-node/src/env.js new file mode 100644 index 000000000000..d353f7a70a95 --- /dev/null +++ b/packages/adapter-node/src/env.js @@ -0,0 +1,3 @@ +export const path = process.env['PATH'] || false; +export const host = process.env['HOST'] || '0.0.0.0'; +export const port = process.env['PORT'] || (!path && 3000); diff --git a/packages/adapter-node/src/index.js b/packages/adapter-node/src/index.js index b8e807ea8450..20b8285c6e22 100644 --- a/packages/adapter-node/src/index.js +++ b/packages/adapter-node/src/index.js @@ -1,6 +1,5 @@ -// @ts-ignore -import { path, host, port } from './env.js'; -import { assetsMiddleware, kitMiddleware, prerenderedMiddleware } from './middlewares.js'; +import { path, host, port } from './env'; +import { assetsMiddleware, kitMiddleware, prerenderedMiddleware } from './middlewares'; import compression from 'compression'; import polka from 'polka'; diff --git a/packages/adapter-node/src/middlewares.js b/packages/adapter-node/src/middlewares.js index ba4ee030244d..991cd3cea1f6 100644 --- a/packages/adapter-node/src/middlewares.js +++ b/packages/adapter-node/src/middlewares.js @@ -1,8 +1,6 @@ -// TODO hardcoding the relative location makes this brittle -// Also, we need most of the logic in another file for testing because -// ../output/server/app.js doesn't exist when we run the tests +// @sveltejs/kit-app doesn't exist until the app is built // @ts-ignore -import { init, render } from '../output/server/app.js'; +import { init, render } from '@sveltejs/kit-app'; import { create_kit_middleware } from './kit-middleware.js'; import fs from 'fs'; diff --git a/packages/adapter-vercel/files/entry.js b/packages/adapter-vercel/files/entry.js index 35d6e3170a7c..fc9f268d0980 100644 --- a/packages/adapter-vercel/files/entry.js +++ b/packages/adapter-vercel/files/entry.js @@ -1,8 +1,8 @@ +// @sveltejs/kit-app doesn't exist until the app is built +// @ts-ignore +import { init, render } from '@sveltejs/kit-app'; import { getRawBody } from '@sveltejs/kit/node'; -// TODO hardcoding the relative location makes this brittle -import { init, render } from '../output/server/app.js'; - init(); export default async (req, res) => { diff --git a/packages/kit/src/cli.js b/packages/kit/src/cli.js index 83305ecfe9a1..fa770da63621 100644 --- a/packages/kit/src/cli.js +++ b/packages/kit/src/cli.js @@ -118,32 +118,29 @@ prog .command('build') .describe('Create a production build of your app') .option('--verbose', 'Log more stuff', false) - .action(async ({ verbose }) => { + .action(async () => { process.env.NODE_ENV = process.env.NODE_ENV || 'production'; const config = await get_config(); try { const { build } = await import('./core/build/index.js'); - const build_data = await build(config); + await build(config); console.log( `\nRun ${colors.bold().cyan('npm run preview')} to preview your production build locally.` ); - if (config.kit.adapter) { - const { adapt } = await import('./core/adapt/index.js'); - await adapt(config, build_data, { verbose }); + if (!config.kit.adapter) { + console.log(colors.bold().yellow('\nNo adapter specified')); - // this is necessary to close any open db connections, etc - process.exit(0); + // prettier-ignore + console.log( + `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` + ); } - console.log(colors.bold().yellow('\nNo adapter specified')); - - // prettier-ignore - console.log( - `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` - ); + // this is necessary to close any open db connections, etc + process.exit(0); } catch (error) { handle_error(error); } diff --git a/packages/kit/src/core/adapt/index.js b/packages/kit/src/core/adapt/index.js deleted file mode 100644 index 475a9578a9da..000000000000 --- a/packages/kit/src/core/adapt/index.js +++ /dev/null @@ -1,20 +0,0 @@ -import colors from 'kleur'; -import { logger } from '../utils.js'; -import { get_utils } from './utils.js'; - -/** - * @param {import('types/config').ValidatedConfig} config - * @param {import('types/internal').BuildData} build_data - * @param {{ cwd?: string, verbose: boolean }} opts - */ -export async function adapt(config, build_data, { cwd = process.cwd(), verbose }) { - const { name, adapt } = config.kit.adapter; - - console.log(colors.bold().cyan(`\n> Using ${name}`)); - - const log = logger({ verbose }); - const utils = get_utils({ cwd, config, build_data, log }); - await adapt({ utils, config }); - - log.success('done'); -} diff --git a/packages/kit/src/core/build/index.js b/packages/kit/src/core/build/index.js index 0921e1a809a0..ebf94dbe1961 100644 --- a/packages/kit/src/core/build/index.js +++ b/packages/kit/src/core/build/index.js @@ -1,27 +1,28 @@ import fs from 'fs'; import path from 'path'; - import { svelte } from '@sveltejs/vite-plugin-svelte'; import glob from 'tiny-glob/sync.js'; import vite from 'vite'; import { rimraf } from '../../utils/filesystem.js'; import { deep_merge } from '../../utils/object.js'; - import { print_config_conflicts } from '../config/index.js'; import { create_app } from '../create_app/index.js'; import create_manifest_data from '../create_manifest_data/index.js'; import { SVELTE_KIT } from '../constants.js'; import { copy_assets, posixify, resolve_entry } from '../utils.js'; +import { createRequire } from 'module'; /** @param {any} value */ const s = (value) => JSON.stringify(value); -/** @typedef {Record} ClientManifest */ + * }>} ClientManifest + */ /** * @param {import('types/config').ValidatedConfig} config @@ -32,7 +33,8 @@ const s = (value) => JSON.stringify(value); * @returns {Promise} */ export async function build(config, { cwd = process.cwd(), runtime = '@sveltejs/kit/ssr' } = {}) { - const build_dir = path.resolve(cwd, `${SVELTE_KIT}/build`); + const raw_build_dir = `${SVELTE_KIT}/node_modules/@sveltejs/kit-app`; + const build_dir = path.resolve(cwd, raw_build_dir); rimraf(build_dir); @@ -53,7 +55,7 @@ export async function build(config, { cwd = process.cwd(), runtime = '@sveltejs/ cwd }), output_dir, - client_entry_file: `${SVELTE_KIT}/build/runtime/internal/start.js`, + client_entry_file: `${raw_build_dir}/runtime/internal/start.js`, service_worker_entry_file: resolve_entry(config.kit.files.serviceWorker) }; @@ -225,12 +227,10 @@ async function build_server( ) { let hooks_file = resolve_entry(config.kit.files.hooks); if (!hooks_file || !fs.existsSync(hooks_file)) { - hooks_file = path.resolve(cwd, `${SVELTE_KIT}/build/hooks.js`); + hooks_file = path.resolve(build_dir, 'hooks.js'); fs.writeFileSync(hooks_file, ''); } - const app_file = `${build_dir}/app.js`; - /** @type {(file: string) => string} */ const app_relative = (file) => { const relative_file = path.relative(build_dir, path.resolve(cwd, file)); @@ -293,6 +293,14 @@ async function build_server( find_deps(client_entry_file, entry_js, entry_css); + const adapter = config.kit.adapter; + const require = createRequire(import.meta.url); + const pkg_path = require.resolve(`${adapter}/package.json`); + const pkg = JSON.parse(fs.readFileSync(pkg_path, 'utf8')); + const main = path.resolve(pkg_path.substring(0, pkg_path.lastIndexOf('/')), pkg.main); + + const app_file = `${build_dir}/app.js`; + // prettier-ignore fs.writeFileSync( app_file, @@ -466,7 +474,7 @@ async function build_server( polyfillDynamicImport: false, rollupOptions: { input: { - app: app_file + app: main }, output: { format: 'esm', @@ -488,6 +496,7 @@ async function build_server( ], resolve: { alias: { + '@sveltejs/kit-app': path.resolve(`${build_dir}/app.js`), $app: path.resolve(`${build_dir}/runtime/app`), $lib: config.kit.files.lib } diff --git a/packages/kit/src/core/config/options.js b/packages/kit/src/core/config/options.js index 1a76bb14e113..4a898704e4bc 100644 --- a/packages/kit/src/core/config/options.js +++ b/packages/kit/src/core/config/options.js @@ -23,17 +23,17 @@ const options = object( }), kit: object({ - adapter: validate(null, (input, keypath) => { - if (typeof input !== 'object' || !input.adapt) { - let message = `${keypath} should be an object with an "adapt" method`; + adapter: validate(null, (input, _keypath) => { + // if (typeof input !== 'object' || !input.adapt) { + // let message = `${keypath} should be an object with an "adapt" method`; - if (Array.isArray(input) || typeof input === 'string') { - // for the early adapter adopters - message += ', rather than the name of an adapter'; - } + // if (Array.isArray(input) || typeof input === 'string') { + // // for the early adapter adopters + // message += ', rather than the name of an adapter'; + // } - throw new Error(`${message}. See https://kit.svelte.dev/docs#adapters`); - } + // throw new Error(`${message}. See https://kit.svelte.dev/docs#adapters`); + // } return input; }), diff --git a/packages/kit/src/runtime/app/navigation.js b/packages/kit/src/runtime/app/navigation.js index bdf86d229380..415436cc33f3 100644 --- a/packages/kit/src/runtime/app/navigation.js +++ b/packages/kit/src/runtime/app/navigation.js @@ -1,8 +1,5 @@ -import { router as router_ } from '../client/singletons.js'; import { get_base_uri } from '../client/utils.js'; -const router = /** @type {import('../client/router').Router} */ (router_); - /** * @param {string} name */ @@ -17,11 +14,17 @@ export const invalidate = import.meta.env.SSR ? guard('invalidate') : invalidate export const prefetch = import.meta.env.SSR ? guard('prefetch') : prefetch_; export const prefetchRoutes = import.meta.env.SSR ? guard('prefetchRoutes') : prefetchRoutes_; +async function get_router() { + return /** @type {import('../client/router').Router} */ ( + (await import('../client/singletons.js')).router + ); +} + /** * @type {import('$app/navigation').goto} */ async function goto_(href, opts) { - return router.goto(href, opts, []); + return (await get_router()).goto(href, opts, []); } /** @@ -29,20 +32,21 @@ async function goto_(href, opts) { */ async function invalidate_(resource) { const { href } = new URL(resource, location.href); - return router.renderer.invalidate(href); + return (await get_router()).renderer.invalidate(href); } /** * @type {import('$app/navigation').prefetch} */ -function prefetch_(href) { - return router.prefetch(new URL(href, get_base_uri(document))); +async function prefetch_(href) { + return (await get_router()).prefetch(new URL(href, get_base_uri(document))); } /** * @type {import('$app/navigation').prefetchRoutes} */ async function prefetchRoutes_(pathnames) { + const router = await get_router(); const matching = pathnames ? router.routes.filter((route) => pathnames.some((pathname) => route[0].test(pathname))) : router.routes; diff --git a/packages/kit/test/test.js b/packages/kit/test/test.js index 2549c4023020..f6f559a0a3ab 100644 --- a/packages/kit/test/test.js +++ b/packages/kit/test/test.js @@ -344,7 +344,7 @@ async function main() { await build(config, { cwd, - runtime: '../../../../../src/runtime/server/index.js' + runtime: '../../../../../../../src/runtime/server/index.js' }); context.server = await preview({ port, config, cwd, host: undefined, https: false }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6f34ef6a975b..9c663af6a5f7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -49,10 +49,12 @@ importers: examples/hn.svelte.dev: specifiers: '@sveltejs/adapter-netlify': workspace:* + '@sveltejs/adapter-node': workspace:* '@sveltejs/kit': workspace:* svelte: ^3.43.1 devDependencies: '@sveltejs/adapter-netlify': link:../../packages/adapter-netlify + '@sveltejs/adapter-node': link:../../packages/adapter-node '@sveltejs/kit': link:../../packages/kit svelte: 3.43.1