From cfe545dc71aaf18ba74c62196340b6c3fc913519 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 2 Mar 2022 09:59:50 -0500 Subject: [PATCH 1/9] add outDir config option --- packages/kit/src/core/config/index.js | 2 ++ packages/kit/src/core/config/index.spec.js | 1 + packages/kit/src/core/config/options.js | 2 ++ packages/kit/types/index.d.ts | 1 + 4 files changed, 6 insertions(+) diff --git a/packages/kit/src/core/config/index.js b/packages/kit/src/core/config/index.js index 972248c36bb8..d2d00ebd57f4 100644 --- a/packages/kit/src/core/config/index.js +++ b/packages/kit/src/core/config/index.js @@ -40,6 +40,8 @@ export async function load_config({ cwd = process.cwd() } = {}) { const validated = validate_config(config.default); + validated.kit.outDir = path.resolve(cwd, validated.kit.outDir); + validated.kit.files.assets = path.resolve(cwd, validated.kit.files.assets); validated.kit.files.hooks = path.resolve(cwd, validated.kit.files.hooks); validated.kit.files.lib = path.resolve(cwd, validated.kit.files.lib); diff --git a/packages/kit/src/core/config/index.spec.js b/packages/kit/src/core/config/index.spec.js index 9258bdaa0ee0..b2c0f71a8918 100644 --- a/packages/kit/src/core/config/index.spec.js +++ b/packages/kit/src/core/config/index.spec.js @@ -71,6 +71,7 @@ const get_defaults = (prefix = '') => ({ parameter: '_method', allowed: [] }, + outDir: join(prefix, '.svelte-kit'), package: { dir: 'package', emitTypes: true diff --git a/packages/kit/src/core/config/options.js b/packages/kit/src/core/config/options.js index 03c7473fa3e2..b6047884a2d5 100644 --- a/packages/kit/src/core/config/options.js +++ b/packages/kit/src/core/config/options.js @@ -142,6 +142,8 @@ const options = object( }) }), + outDir: string('.svelte-kit'), + package: object({ dir: string('package'), // excludes all .d.ts and filename starting with _ diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index ff1a343b6e8e..48218a3e0adf 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -55,6 +55,7 @@ export interface Config { parameter?: string; allowed?: string[]; }; + outDir?: string; package?: { dir?: string; emitTypes?: boolean; From f664b8b24d7b97f42a960efa04f09d4000d5f949 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 2 Mar 2022 12:13:57 -0500 Subject: [PATCH 2/9] make outDir configurable - closes #4052 --- packages/kit/src/core/adapt/builder.js | 11 +++++------ packages/kit/src/core/adapt/builder.spec.js | 15 +++++---------- .../kit/src/core/adapt/prerender/prerender.js | 3 +-- packages/kit/src/core/build/build_client.js | 3 +-- packages/kit/src/core/build/build_server.js | 9 +++++---- .../src/core/build/build_service_worker.js | 3 +-- packages/kit/src/core/build/index.js | 9 ++++----- packages/kit/src/core/constants.js | 2 -- packages/kit/src/core/create_app/index.js | 5 ++--- .../src/core/create_manifest_data/index.js | 4 ++-- packages/kit/src/core/dev/index.js | 9 ++++----- packages/kit/src/core/dev/plugin.js | 19 +++++++++++++++---- packages/kit/src/core/preview/index.js | 10 +++++----- packages/kit/src/core/tsconfig.js | 11 +++++------ packages/kit/src/core/utils.js | 12 ++++++------ 15 files changed, 61 insertions(+), 64 deletions(-) diff --git a/packages/kit/src/core/adapt/builder.js b/packages/kit/src/core/adapt/builder.js index 1a245e142fd8..2df8e8af12ea 100644 --- a/packages/kit/src/core/adapt/builder.js +++ b/packages/kit/src/core/adapt/builder.js @@ -1,4 +1,3 @@ -import { SVELTE_KIT } from '../constants.js'; import { copy, rimraf, mkdirp } from '../../utils/filesystem.js'; import { prerender } from './prerender/prerender.js'; import { generate_manifest } from '../generate_manifest/index.js'; @@ -118,15 +117,15 @@ export function create_builder({ cwd, config, build_data, log }) { }, getBuildDirectory(name) { - return `${cwd}/${SVELTE_KIT}/${name}`; + return `${config.kit.outDir}/${name}`; }, getClientDirectory() { - return `${cwd}/${SVELTE_KIT}/output/client`; + return `${config.kit.outDir}/output/client`; }, getServerDirectory() { - return `${cwd}/${SVELTE_KIT}/output/server`; + return `${config.kit.outDir}/output/server`; }, getStaticDirectory() { @@ -134,13 +133,13 @@ export function create_builder({ cwd, config, build_data, log }) { }, writeClient(dest) { - return copy(`${cwd}/${SVELTE_KIT}/output/client`, dest, { + return copy(`${config.kit.outDir}/output/client`, dest, { filter: (file) => file[0] !== '.' }); }, writeServer(dest) { - return copy(`${cwd}/${SVELTE_KIT}/output/server`, dest, { + return copy(`${config.kit.outDir}/output/server`, dest, { filter: (file) => file[0] !== '.' }); }, diff --git a/packages/kit/src/core/adapt/builder.spec.js b/packages/kit/src/core/adapt/builder.spec.js index abf07e037b66..9cc100af4cf1 100644 --- a/packages/kit/src/core/adapt/builder.spec.js +++ b/packages/kit/src/core/adapt/builder.spec.js @@ -5,13 +5,13 @@ import * as assert from 'uvu/assert'; import glob from 'tiny-glob/sync.js'; import { create_builder } from './builder.js'; import { fileURLToPath } from 'url'; -import { SVELTE_KIT } from '../constants.js'; const __filename = fileURLToPath(import.meta.url); const __dirname = join(__filename, '..'); test('copy files', () => { const cwd = join(__dirname, 'fixtures/basic'); + const outDir = join(cwd, '.svelte-kit'); /** @type {import('types').Config} */ const mocked = { @@ -20,7 +20,8 @@ test('copy files', () => { appDir: '_app', files: { assets: join(__dirname, 'fixtures/basic/static') - } + }, + outDir } }; @@ -48,18 +49,12 @@ test('copy files', () => { rmSync(dest, { recursive: true, force: true }); builder.writeClient(dest); - assert.equal( - glob('**', { cwd: `${cwd}/${SVELTE_KIT}/output/client` }), - glob('**', { cwd: dest }) - ); + assert.equal(glob('**', { cwd: `${outDir}/output/client` }), glob('**', { cwd: dest })); rmSync(dest, { recursive: true, force: true }); builder.writeServer(dest); - assert.equal( - glob('**', { cwd: `${cwd}/${SVELTE_KIT}/output/server` }), - glob('**', { cwd: dest }) - ); + assert.equal(glob('**', { cwd: `${outDir}/output/server` }), glob('**', { cwd: dest })); rmSync(dest, { force: true, recursive: true }); }); diff --git a/packages/kit/src/core/adapt/prerender/prerender.js b/packages/kit/src/core/adapt/prerender/prerender.js index 74ea0e1f4178..f4d7fa5d1dd0 100644 --- a/packages/kit/src/core/adapt/prerender/prerender.js +++ b/packages/kit/src/core/adapt/prerender/prerender.js @@ -3,7 +3,6 @@ import { dirname, join, resolve as resolve_path } from 'path'; import { pathToFileURL, URL } from 'url'; import { mkdirp } from '../../../utils/filesystem.js'; import { installFetch } from '../../../install-fetch.js'; -import { SVELTE_KIT } from '../../constants.js'; import { is_root_relative, normalize_path, resolve } from '../../../utils/url.js'; import { queue } from './queue.js'; import { crawl } from './crawl.js'; @@ -65,7 +64,7 @@ export async function prerender({ cwd, out, log, config, build_data, fallback, a installFetch(); - const server_root = resolve_path(cwd, `${SVELTE_KIT}/output`); + const server_root = join(config.kit.outDir, 'output'); /** @type {import('types').ServerModule} */ const { Server, override } = await import(pathToFileURL(`${server_root}/server/index.js`).href); diff --git a/packages/kit/src/core/build/build_client.js b/packages/kit/src/core/build/build_client.js index 3ac04585c50b..2678ce98b33d 100644 --- a/packages/kit/src/core/build/build_client.js +++ b/packages/kit/src/core/build/build_client.js @@ -6,7 +6,6 @@ import { print_config_conflicts } from '../config/index.js'; import { create_app } from '../create_app/index.js'; import { copy_assets, get_aliases } from '../utils.js'; import { create_build, find_deps } from './utils.js'; -import { SVELTE_KIT } from '../constants.js'; import { posixify } from '../../utils/filesystem.js'; /** @@ -39,7 +38,7 @@ export async function build_client({ cwd }); - copy_assets(`${SVELTE_KIT}/runtime`); + copy_assets(path.join(config.kit.outDir, 'runtime')); process.env.VITE_SVELTEKIT_AMP = config.kit.amp ? 'true' : ''; diff --git a/packages/kit/src/core/build/build_server.js b/packages/kit/src/core/build/build_server.js index dfc2cce9acf1..1d9e69020520 100644 --- a/packages/kit/src/core/build/build_server.js +++ b/packages/kit/src/core/build/build_server.js @@ -4,9 +4,8 @@ import { svelte } from '@sveltejs/vite-plugin-svelte'; import { mkdirp, posixify } from '../../utils/filesystem.js'; import { deep_merge } from '../../utils/object.js'; import { load_template, print_config_conflicts } from '../config/index.js'; -import { get_aliases, resolve_entry, runtime } from '../utils.js'; +import { get_aliases, get_runtime_path, resolve_entry } from '../utils.js'; import { create_build, find_deps } from './utils.js'; -import { SVELTE_KIT } from '../constants.js'; import { s } from '../../utils/misc.js'; /** @@ -14,11 +13,12 @@ import { s } from '../../utils/misc.js'; * hooks: string; * config: import('types').ValidatedConfig; * has_service_worker: boolean; + * runtime: string; * template: string; * }} opts * @returns */ -const server_template = ({ config, hooks, has_service_worker, template }) => ` +const server_template = ({ config, hooks, has_service_worker, runtime, template }) => ` import root from '__GENERATED__/root.svelte'; import { respond } from '${runtime}/server/index.js'; import { set_paths, assets, base } from '${runtime}/paths.js'; @@ -133,7 +133,7 @@ export 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.join(config.kit.outDir, 'build/hooks.js'); fs.writeFileSync(hooks_file, ''); } @@ -177,6 +177,7 @@ export async function build_server( config, hooks: app_relative(hooks_file), has_service_worker: service_worker_register && !!service_worker_entry_file, + runtime: get_runtime_path(config), template: load_template(cwd, config) }) ); diff --git a/packages/kit/src/core/build/build_service_worker.js b/packages/kit/src/core/build/build_service_worker.js index 86a223e9d5ae..965e91459073 100644 --- a/packages/kit/src/core/build/build_service_worker.js +++ b/packages/kit/src/core/build/build_service_worker.js @@ -3,7 +3,6 @@ import vite from 'vite'; import { s } from '../../utils/misc.js'; import { deep_merge } from '../../utils/object.js'; import { print_config_conflicts } from '../config/index.js'; -import { SVELTE_KIT } from '../constants.js'; /** * @param {{ @@ -32,7 +31,7 @@ export async function build_service_worker( } } - const service_worker = `${cwd}/${SVELTE_KIT}/generated/service-worker.js`; + const service_worker = `${config.kit.outDir}/generated/service-worker.js`; fs.writeFileSync( service_worker, diff --git a/packages/kit/src/core/build/index.js b/packages/kit/src/core/build/index.js index 3fb90bc51f70..5515f727b6fa 100644 --- a/packages/kit/src/core/build/index.js +++ b/packages/kit/src/core/build/index.js @@ -2,8 +2,7 @@ import fs from 'fs'; import path from 'path'; import { mkdirp, rimraf, posixify } from '../../utils/filesystem.js'; import create_manifest_data from '../create_manifest_data/index.js'; -import { SVELTE_KIT } from '../constants.js'; -import { runtime, resolve_entry } from '../utils.js'; +import { get_runtime_path, resolve_entry } from '../utils.js'; import { generate_manifest } from '../generate_manifest/index.js'; import { build_service_worker } from './build_service_worker.js'; import { build_client } from './build_client.js'; @@ -17,11 +16,11 @@ import { generate_tsconfig } from '../tsconfig.js'; export async function build(config) { const cwd = process.cwd(); // TODO is this necessary? - const build_dir = path.resolve(`${SVELTE_KIT}/build`); + const build_dir = path.join(config.kit.outDir, 'build'); rimraf(build_dir); mkdirp(build_dir); - const output_dir = path.resolve(`${SVELTE_KIT}/output`); + const output_dir = path.join(config.kit.outDir, 'output'); rimraf(output_dir); mkdirp(output_dir); @@ -41,7 +40,7 @@ export async function build(config) { cwd }), output_dir, - client_entry_file: path.relative(cwd, `${runtime}/client/start.js`), + client_entry_file: path.relative(cwd, `${get_runtime_path(config)}/client/start.js`), service_worker_entry_file: resolve_entry(config.kit.files.serviceWorker), service_worker_register: config.kit.serviceWorker.register }; diff --git a/packages/kit/src/core/constants.js b/packages/kit/src/core/constants.js index 565b216bfa66..630bc3e90f89 100644 --- a/packages/kit/src/core/constants.js +++ b/packages/kit/src/core/constants.js @@ -1,5 +1,3 @@ -export const SVELTE_KIT = '.svelte-kit'; - // in `svelte-kit dev` and `svelte-kit preview`, we use a fake // asset path so that we can serve local assets while still // verifying that requests are correctly prefixed diff --git a/packages/kit/src/core/create_app/index.js b/packages/kit/src/core/create_app/index.js index ff49961686d1..0ee3ee10c0ef 100644 --- a/packages/kit/src/core/create_app/index.js +++ b/packages/kit/src/core/create_app/index.js @@ -2,7 +2,6 @@ import fs from 'fs'; import path from 'path'; import { s } from '../../utils/misc.js'; import { mkdirp } from '../../utils/filesystem.js'; -import { SVELTE_KIT } from '../constants.js'; /** @type {Map} */ const previous_contents = new Map(); @@ -29,7 +28,7 @@ export function write_if_changed(file, code) { * }} options */ export function create_app({ config, manifest_data, cwd = process.cwd() }) { - const output = `${SVELTE_KIT}/generated`; + const output = path.join(config.kit.outDir, 'generated'); const base = path.relative(cwd, output); write_if_changed(`${output}/manifest.js`, generate_client_manifest(manifest_data, base)); @@ -248,7 +247,7 @@ function create_types(config, manifest_data) { .filter(Boolean) .join(', '); - const file = `${SVELTE_KIT}/types/${key || 'index'}.d.ts`; + const file = `${config.kit.outDir}/types/${key || 'index'}.d.ts`; const content = [ '// this file is auto-generated', `import type { ${imports} } from '@sveltejs/kit';`, diff --git a/packages/kit/src/core/create_manifest_data/index.js b/packages/kit/src/core/create_manifest_data/index.js index de72e262c05b..3c83f4d39559 100644 --- a/packages/kit/src/core/create_manifest_data/index.js +++ b/packages/kit/src/core/create_manifest_data/index.js @@ -1,7 +1,7 @@ import fs from 'fs'; import path from 'path'; import mime from 'mime'; -import { runtime } from '../utils.js'; +import { get_runtime_path } from '../utils.js'; import { posixify } from '../../utils/filesystem.js'; /** @@ -37,7 +37,7 @@ const specials = new Set(['__layout', '__layout.reset', '__error']); */ export default function create_manifest_data({ config, - fallback = `${runtime}/components`, + fallback = `${get_runtime_path(config)}/components`, cwd = process.cwd() }) { /** diff --git a/packages/kit/src/core/dev/index.js b/packages/kit/src/core/dev/index.js index f411b90a992e..59f2c244275b 100644 --- a/packages/kit/src/core/dev/index.js +++ b/packages/kit/src/core/dev/index.js @@ -3,8 +3,7 @@ import { svelte } from '@sveltejs/vite-plugin-svelte'; import vite from 'vite'; import { deep_merge } from '../../utils/object.js'; import { print_config_conflicts } from '../config/index.js'; -import { SVELTE_KIT } from '../constants.js'; -import { copy_assets, get_aliases, runtime } from '../utils.js'; +import { copy_assets, get_aliases, get_runtime_path } from '../utils.js'; import { create_plugin } from './plugin.js'; import { generate_tsconfig } from '../tsconfig.js'; @@ -21,7 +20,7 @@ import { generate_tsconfig } from '../tsconfig.js'; /** @param {Options} opts */ export async function dev({ cwd, port, host, https, config }) { - copy_assets(`${SVELTE_KIT}/runtime`); + copy_assets(path.join(config.kit.outDir, 'runtime')); generate_tsconfig(config); @@ -34,8 +33,8 @@ export async function dev({ cwd, port, host, https, config }) { config.kit.files.assets, config.kit.files.lib, config.kit.files.routes, + config.kit.outDir, path.resolve(cwd, 'src'), - path.resolve(cwd, SVELTE_KIT), path.resolve(cwd, 'node_modules'), path.resolve(vite.searchForWorkspaceRoot(cwd), 'node_modules') ]) @@ -58,7 +57,7 @@ export async function dev({ cwd, port, host, https, config }) { rollupOptions: { // Vite dependency crawler needs an explicit JS entry point // eventhough server otherwise works without it - input: `${runtime}/client/start.js` + input: `${get_runtime_path(config)}/client/start.js` } }, plugins: [ diff --git a/packages/kit/src/core/dev/plugin.js b/packages/kit/src/core/dev/plugin.js index 5b3e8ffd3ade..19d915c2accb 100644 --- a/packages/kit/src/core/dev/plugin.js +++ b/packages/kit/src/core/dev/plugin.js @@ -7,8 +7,8 @@ import { installFetch } from '../../install-fetch.js'; import { create_app } from '../create_app/index.js'; import create_manifest_data from '../create_manifest_data/index.js'; import { getRequest, setResponse } from '../../node.js'; -import { SVELTE_KIT, SVELTE_KIT_ASSETS } from '../constants.js'; -import { get_mime_lookup, resolve_entry, runtime } from '../utils.js'; +import { SVELTE_KIT_ASSETS } from '../constants.js'; +import { get_mime_lookup, get_runtime_path, resolve_entry } from '../utils.js'; import { coalesce_to_error } from '../../utils/error.js'; import { load_template } from '../config/index.js'; import { sequence } from '../../hooks.js'; @@ -19,6 +19,8 @@ import { sequence } from '../../hooks.js'; * @returns {Promise} */ export async function create_plugin(config, cwd) { + const runtime = get_runtime_path(config); + /** @type {import('types').Handle} */ let amp; @@ -228,9 +230,18 @@ export async function create_plugin(config, cwd) { throw new Error('The serverFetch hook has been renamed to externalFetch.'); } - const root = (await vite.ssrLoadModule(`/${SVELTE_KIT}/generated/root.svelte`)).default; + // TODO the / prefix will probably fail if outDir is outside the cwd (which + // could be the case in a monorepo setup), but without it these modules + // can get loaded twice via different URLs, which causes failures. Might + // require changes to Vite to fix + const { default: root } = await vite.ssrLoadModule( + '/' + path.relative(cwd, `${config.kit.outDir}/generated/root.svelte`) + ); + const paths = await vite.ssrLoadModule( - process.env.BUNDLED ? `/${SVELTE_KIT}/runtime/paths.js` : `/@fs${runtime}/paths.js` + process.env.BUNDLED + ? '/' + path.relative(cwd, `${config.kit.outDir}/runtime/paths.js`) + : `/@fs${runtime}/paths.js` ); paths.set_paths({ diff --git a/packages/kit/src/core/preview/index.js b/packages/kit/src/core/preview/index.js index 11ec3dd66828..a51524484c49 100644 --- a/packages/kit/src/core/preview/index.js +++ b/packages/kit/src/core/preview/index.js @@ -1,12 +1,12 @@ import fs from 'fs'; import http from 'http'; import https from 'https'; -import { join, resolve } from 'path'; +import { join } from 'path'; import sirv from 'sirv'; import { pathToFileURL } from 'url'; import { getRequest, setResponse } from '../../node.js'; import { installFetch } from '../../install-fetch.js'; -import { SVELTE_KIT, SVELTE_KIT_ASSETS } from '../constants.js'; +import { SVELTE_KIT_ASSETS } from '../constants.js'; /** @param {string} dir */ const mutable = (dir) => @@ -33,8 +33,8 @@ export async function preview({ }) { installFetch(); - const index_file = resolve(cwd, `${SVELTE_KIT}/output/server/index.js`); - const manifest_file = resolve(cwd, `${SVELTE_KIT}/output/server/manifest.js`); + const index_file = join(config.kit.outDir, 'output/server/index.js'); + const manifest_file = join(config.kit.outDir, 'output/server/manifest.js'); /** @type {import('types').ServerModule} */ const { Server, override } = await import(pathToFileURL(index_file).href); @@ -49,7 +49,7 @@ export async function preview({ return next(); }; - const assets_handler = sirv(resolve(cwd, `${SVELTE_KIT}/output/client`), { + const assets_handler = sirv(join(config.kit.outDir, 'output/client'), { maxAge: 31536000, immutable: true }); diff --git a/packages/kit/src/core/tsconfig.js b/packages/kit/src/core/tsconfig.js index 0767a87d5f34..a08392a23508 100644 --- a/packages/kit/src/core/tsconfig.js +++ b/packages/kit/src/core/tsconfig.js @@ -2,25 +2,24 @@ import fs from 'fs'; import path from 'path'; import colors from 'kleur'; import { mkdirp, posixify } from '../utils/filesystem.js'; -import { SVELTE_KIT } from './constants.js'; /** @param {string} file */ const exists = (file) => fs.existsSync(file) && file; /** @param {import('types').ValidatedConfig} config */ export function generate_tsconfig(config) { - const out = path.resolve(SVELTE_KIT, 'tsconfig.json'); + const out = path.join(config.kit.outDir, 'tsconfig.json'); const user_file = exists('tsconfig.json') || exists('jsconfig.json'); if (user_file) validate(config, out, user_file); - mkdirp(SVELTE_KIT); + mkdirp(config.kit.outDir); /** @param {string} file */ const project_relative = (file) => posixify(path.relative('.', file)); /** @param {string} file */ - const config_relative = (file) => posixify(path.relative(SVELTE_KIT, file)); + const config_relative = (file) => posixify(path.join(config.kit.outDir, file)); const dirs = new Set([ project_relative(path.dirname(config.kit.files.routes)), @@ -36,7 +35,7 @@ export function generate_tsconfig(config) { }); fs.writeFileSync( - `${SVELTE_KIT}/tsconfig.json`, + out, JSON.stringify( { compilerOptions: { @@ -117,7 +116,7 @@ function validate(config, out, user_file) { } } else { let relative = posixify(path.relative('.', out)); - if (relative.startsWith(SVELTE_KIT)) relative = './' + relative; + if (!relative.startsWith('./')) relative = './' + relative; console.warn( colors diff --git a/packages/kit/src/core/utils.js b/packages/kit/src/core/utils.js index bb778fea9e22..380f6bfaaeb0 100644 --- a/packages/kit/src/core/utils.js +++ b/packages/kit/src/core/utils.js @@ -3,14 +3,14 @@ import path from 'path'; import colors from 'kleur'; import { copy } from '../utils/filesystem.js'; import { fileURLToPath } from 'url'; -import { SVELTE_KIT } from './constants.js'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); -export const runtime = process.env.BUNDLED - ? posixify_path(path.resolve(`${SVELTE_KIT}/runtime`)) - : posixify_path(fileURLToPath(new URL('../runtime', import.meta.url))); +export const get_runtime_path = process.env.BUNDLED + ? /** @param {import('types').ValidatedConfig} config */ (config) => + posixify_path(path.join(config.kit.outDir, 'runtime')) + : () => posixify_path(fileURLToPath(new URL('../runtime', import.meta.url))); /** @param {string} str */ function posixify_path(str) { @@ -104,8 +104,8 @@ export function get_mime_lookup(manifest_data) { /** @param {import('types').ValidatedConfig} config */ export function get_aliases(config) { const alias = { - __GENERATED__: path.posix.resolve(`${SVELTE_KIT}/generated`), - $app: `${runtime}/app`, + __GENERATED__: path.posix.join(config.kit.outDir, 'generated'), + $app: `${get_runtime_path(config)}/app`, $lib: config.kit.files.lib }; From c54ab1f16d25e7bd2a73c4f68590cd69983ee0c4 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 2 Mar 2022 12:14:27 -0500 Subject: [PATCH 3/9] changeset --- .changeset/forty-terms-peel.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/forty-terms-peel.md diff --git a/.changeset/forty-terms-peel.md b/.changeset/forty-terms-peel.md new file mode 100644 index 000000000000..f7fe0c466849 --- /dev/null +++ b/.changeset/forty-terms-peel.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +Add config.kit.outDir From adb1154b2de193ff71370dd6197edee9f234e51d Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 2 Mar 2022 12:41:58 -0500 Subject: [PATCH 4/9] docs --- documentation/docs/01-routing.md | 2 +- documentation/docs/13-configuration.md | 5 +++++ documentation/docs/14-types.md | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/documentation/docs/01-routing.md b/documentation/docs/01-routing.md index 211f6f7bb005..28c1c90a3fcd 100644 --- a/documentation/docs/01-routing.md +++ b/documentation/docs/01-routing.md @@ -83,7 +83,7 @@ export async function get({ params }) { > All server-side code, including endpoints, has access to `fetch` in case you need to request data from external APIs. Don't worry about the `$lib` import, we'll get to that [later](/docs/modules#$lib). -The type of the `get` function above comes from `./[id].d.ts`, which is a file generated by SvelteKit (in a hidden directory, using the [`rootDirs`](https://www.typescriptlang.org/tsconfig#rootDirs) option) that provides type safety when accessing `params`. See the section on [generated types](/docs/types#generated-types) for more detail. +The type of the `get` function above comes from `./[id].d.ts`, which is a file generated by SvelteKit (inside your [`outDir`](/docs/configuration#outdir), using the [`rootDirs`](https://www.typescriptlang.org/tsconfig#rootDirs) option) that provides type safety when accessing `params`. See the section on [generated types](/docs/types#generated-types) for more detail. The job of a [request handler](/docs/types#sveltejs-kit-requesthandler) is to return a `{ status, headers, body }` object representing the response, where `status` is an [HTTP status code](https://httpstatusdogs.com): diff --git a/documentation/docs/13-configuration.md b/documentation/docs/13-configuration.md index 0bc7ff71b8c9..154a6e15060f 100644 --- a/documentation/docs/13-configuration.md +++ b/documentation/docs/13-configuration.md @@ -43,6 +43,7 @@ const config = { parameter: '_method', allowed: [] }, + outDir: '.svelte-kit', package: { dir: 'package', emitTypes: true, @@ -170,6 +171,10 @@ See [HTTP Method Overrides](/docs/routing#endpoints-http-method-overrides). An o - `parameter` — query parameter name to use for passing the intended method value - `allowed` - array of HTTP methods that can be used when overriding the original request method +### outDir + +The directory that SvelteKit writes files to during `dev` and `build`. You should exclude this directory from version control. + ### package Options related to [creating a package](/docs/packaging). diff --git a/documentation/docs/14-types.md b/documentation/docs/14-types.md index f7719dd6307b..661c6bf07cf8 100644 --- a/documentation/docs/14-types.md +++ b/documentation/docs/14-types.md @@ -71,6 +71,6 @@ export async function get({ params }) { ``` -> For this to work, your own `tsconfig.json` or `jsconfig.json` should extend from the generated `.svelte-kit/tsconfig.json`: +> For this to work, your own `tsconfig.json` or `jsconfig.json` should extend from the generated `.svelte-kit/tsconfig.json` (where `.svelte-kit` is your [`outDir`](/docs/configuration#outdir)): > > { "extends": ".svelte-kit/tsconfig.json" } From 942c4a64c9ba0c477d4ca4ca54639775dea7c54b Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 2 Mar 2022 12:43:10 -0500 Subject: [PATCH 5/9] add test for outDir --- packages/kit/test/apps/options/.gitignore | 1 + packages/kit/test/apps/options/svelte.config.js | 1 + 2 files changed, 2 insertions(+) create mode 100644 packages/kit/test/apps/options/.gitignore diff --git a/packages/kit/test/apps/options/.gitignore b/packages/kit/test/apps/options/.gitignore new file mode 100644 index 000000000000..0eb299a59aae --- /dev/null +++ b/packages/kit/test/apps/options/.gitignore @@ -0,0 +1 @@ +.custom-out-dir \ No newline at end of file diff --git a/packages/kit/test/apps/options/svelte.config.js b/packages/kit/test/apps/options/svelte.config.js index 4d61d05033d1..a882a9b5664c 100644 --- a/packages/kit/test/apps/options/svelte.config.js +++ b/packages/kit/test/apps/options/svelte.config.js @@ -20,6 +20,7 @@ const config = { appDir: '_wheee', floc: true, inlineStyleThreshold: 1024, + outDir: '.custom-out-dir', trailingSlash: 'always', vite: { build: { From 5e80fcdcc2ae75a9aecdb4fce57380690d824af5 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 2 Mar 2022 12:53:56 -0500 Subject: [PATCH 6/9] lint --- packages/kit/src/core/adapt/builder.js | 1 - packages/kit/src/core/adapt/prerender/prerender.js | 5 ++--- packages/kit/src/core/preview/index.js | 8 +------- 3 files changed, 3 insertions(+), 11 deletions(-) diff --git a/packages/kit/src/core/adapt/builder.js b/packages/kit/src/core/adapt/builder.js index 2df8e8af12ea..866aa31cc516 100644 --- a/packages/kit/src/core/adapt/builder.js +++ b/packages/kit/src/core/adapt/builder.js @@ -158,7 +158,6 @@ export function create_builder({ cwd, config, build_data, log }) { const prerendered = await prerender({ out: dest, all, - cwd, config, build_data, fallback, diff --git a/packages/kit/src/core/adapt/prerender/prerender.js b/packages/kit/src/core/adapt/prerender/prerender.js index f4d7fa5d1dd0..9cdab9b9094d 100644 --- a/packages/kit/src/core/adapt/prerender/prerender.js +++ b/packages/kit/src/core/adapt/prerender/prerender.js @@ -1,5 +1,5 @@ import { readFileSync, writeFileSync } from 'fs'; -import { dirname, join, resolve as resolve_path } from 'path'; +import { dirname, join } from 'path'; import { pathToFileURL, URL } from 'url'; import { mkdirp } from '../../../utils/filesystem.js'; import { installFetch } from '../../../install-fetch.js'; @@ -40,7 +40,6 @@ const REDIRECT = 3; /** * @param {{ - * cwd: string; * out: string; * log: Logger; * config: import('types').ValidatedConfig; @@ -49,7 +48,7 @@ const REDIRECT = 3; * all: boolean; // disregard `export const prerender = true` * }} opts */ -export async function prerender({ cwd, out, log, config, build_data, fallback, all }) { +export async function prerender({ out, log, config, build_data, fallback, all }) { /** @type {import('types').Prerendered} */ const prerendered = { pages: new Map(), diff --git a/packages/kit/src/core/preview/index.js b/packages/kit/src/core/preview/index.js index a51524484c49..59c5d1329f09 100644 --- a/packages/kit/src/core/preview/index.js +++ b/packages/kit/src/core/preview/index.js @@ -24,13 +24,7 @@ const mutable = (dir) => * cwd?: string; * }} opts */ -export async function preview({ - port, - host, - config, - https: use_https = false, - cwd = process.cwd() -}) { +export async function preview({ port, host, config, https: use_https = false }) { installFetch(); const index_file = join(config.kit.outDir, 'output/server/index.js'); From 9edabe5a9ae0eac0ebaf811ba99646c9439d084c Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 2 Mar 2022 13:05:50 -0500 Subject: [PATCH 7/9] lint --- packages/kit/.gitignore | 3 ++- packages/kit/src/core/adapt/builder.js | 3 +-- packages/kit/src/core/adapt/builder.spec.js | 1 - packages/kit/src/core/adapt/index.js | 6 +++--- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/kit/.gitignore b/packages/kit/.gitignore index 8aceed42c680..4d7a1dc19bd4 100644 --- a/packages/kit/.gitignore +++ b/packages/kit/.gitignore @@ -7,4 +7,5 @@ /test/**/build !/src/core/adapt/fixtures/*/.svelte-kit !/test/node_modules -/test/apps/basics/test/errors.json \ No newline at end of file +/test/apps/basics/test/errors.json +.custom-out-dir \ No newline at end of file diff --git a/packages/kit/src/core/adapt/builder.js b/packages/kit/src/core/adapt/builder.js index 866aa31cc516..2a21be674947 100644 --- a/packages/kit/src/core/adapt/builder.js +++ b/packages/kit/src/core/adapt/builder.js @@ -4,14 +4,13 @@ import { generate_manifest } from '../generate_manifest/index.js'; /** * @param {{ - * cwd: string; * config: import('types').ValidatedConfig; * build_data: import('types').BuildData; * log: import('types').Logger; * }} opts * @returns {import('types').Builder} */ -export function create_builder({ cwd, config, build_data, log }) { +export function create_builder({ config, build_data, log }) { /** @type {Set} */ let prerendered_paths; diff --git a/packages/kit/src/core/adapt/builder.spec.js b/packages/kit/src/core/adapt/builder.spec.js index 9cc100af4cf1..24370092cbca 100644 --- a/packages/kit/src/core/adapt/builder.spec.js +++ b/packages/kit/src/core/adapt/builder.spec.js @@ -26,7 +26,6 @@ test('copy files', () => { }; const builder = create_builder({ - cwd, config: /** @type {import('types').ValidatedConfig} */ (mocked), // @ts-expect-error build_data: {}, diff --git a/packages/kit/src/core/adapt/index.js b/packages/kit/src/core/adapt/index.js index e0187bc714ab..645b55df7212 100644 --- a/packages/kit/src/core/adapt/index.js +++ b/packages/kit/src/core/adapt/index.js @@ -5,15 +5,15 @@ import { create_builder } from './builder.js'; /** * @param {import('types').ValidatedConfig} config * @param {import('types').BuildData} build_data - * @param {{ cwd?: string, verbose: boolean }} opts + * @param {{ verbose: boolean }} opts */ -export async function adapt(config, build_data, { cwd = process.cwd(), verbose }) { +export async function adapt(config, build_data, { verbose }) { const { name, adapt } = config.kit.adapter; console.log(colors.bold().cyan(`\n> Using ${name}`)); const log = logger({ verbose }); - const builder = create_builder({ cwd, config, build_data, log }); + const builder = create_builder({ config, build_data, log }); await adapt(builder); log.success('done'); From 7694a1567861a5c694c6c849b504b3ab6cb196e2 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 2 Mar 2022 13:21:55 -0500 Subject: [PATCH 8/9] fix --- packages/kit/src/core/tsconfig.js | 2 +- packages/kit/test/apps/options/tsconfig.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/kit/src/core/tsconfig.js b/packages/kit/src/core/tsconfig.js index a08392a23508..5ecd6ee9f265 100644 --- a/packages/kit/src/core/tsconfig.js +++ b/packages/kit/src/core/tsconfig.js @@ -19,7 +19,7 @@ export function generate_tsconfig(config) { const project_relative = (file) => posixify(path.relative('.', file)); /** @param {string} file */ - const config_relative = (file) => posixify(path.join(config.kit.outDir, file)); + const config_relative = (file) => posixify(path.relative(config.kit.outDir, file)); const dirs = new Set([ project_relative(path.dirname(config.kit.files.routes)), diff --git a/packages/kit/test/apps/options/tsconfig.json b/packages/kit/test/apps/options/tsconfig.json index f8208f24851b..ea08cd531d86 100644 --- a/packages/kit/test/apps/options/tsconfig.json +++ b/packages/kit/test/apps/options/tsconfig.json @@ -7,5 +7,5 @@ "types": ["../../../types/internal"] } }, - "extends": "./.svelte-kit/tsconfig.json" + "extends": "./.custom-out-dir/tsconfig.json" } From c60ea891b187346ea734ab74c8c550b0b6f6232c Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 2 Mar 2022 14:13:00 -0500 Subject: [PATCH 9/9] ugh windows --- packages/kit/src/core/dev/plugin.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/kit/src/core/dev/plugin.js b/packages/kit/src/core/dev/plugin.js index 19d915c2accb..f53877ea397d 100644 --- a/packages/kit/src/core/dev/plugin.js +++ b/packages/kit/src/core/dev/plugin.js @@ -12,6 +12,7 @@ import { get_mime_lookup, get_runtime_path, resolve_entry } from '../utils.js'; import { coalesce_to_error } from '../../utils/error.js'; import { load_template } from '../config/index.js'; import { sequence } from '../../hooks.js'; +import { posixify } from '../../utils/filesystem.js'; /** * @param {import('types').ValidatedConfig} config @@ -235,12 +236,12 @@ export async function create_plugin(config, cwd) { // can get loaded twice via different URLs, which causes failures. Might // require changes to Vite to fix const { default: root } = await vite.ssrLoadModule( - '/' + path.relative(cwd, `${config.kit.outDir}/generated/root.svelte`) + `/${posixify(path.relative(cwd, `${config.kit.outDir}/generated/root.svelte`))}` ); const paths = await vite.ssrLoadModule( process.env.BUNDLED - ? '/' + path.relative(cwd, `${config.kit.outDir}/runtime/paths.js`) + ? `/${posixify(path.relative(cwd, `${config.kit.outDir}/runtime/paths.js`))}` : `/@fs${runtime}/paths.js` );