From 2d92ed7b31ab602b83ef547ae2640e8fd9bafdd7 Mon Sep 17 00:00:00 2001 From: gunggmee Date: Sun, 17 Oct 2021 10:42:41 +0900 Subject: [PATCH 1/6] [fix] allow users to override build target - set `es2020` as default build target - allow users to override build target - let esbuild to check overriden build target satisfies the contraints of `es2020` --- packages/kit/src/core/build/index.js | 38 ++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/packages/kit/src/core/build/index.js b/packages/kit/src/core/build/index.js index c1bcd493b248..ffffc5fcb010 100644 --- a/packages/kit/src/core/build/index.js +++ b/packages/kit/src/core/build/index.js @@ -445,6 +445,11 @@ async function build_server( const default_config = { server: { + build: { + // set minimum target as es2020, yet allow users to override it with + // any target satisfying the constraints of the es2020 + target: 'es2020' + }, fs: { strict: true } @@ -454,13 +459,14 @@ async function build_server( // don't warn on overriding defaults const [modified_vite_config] = deep_merge(default_config, vite_config); + const adjusted_vite_config = ensure_minimum_target(modified_vite_config, default_config.server.build.target); + /** @type {[any, string[]]} */ - const [merged_config, conflicts] = deep_merge(modified_vite_config, { + const [merged_config, conflicts] = deep_merge(adjusted_vite_config, { configFile: false, root: cwd, base: assets_base, build: { - target: 'es2020', ssr: true, outDir: `${output_dir}/server`, polyfillDynamicImport: false, @@ -612,3 +618,31 @@ function get_params(array) { '})' : 'empty'; } + +/** + * @param {Record} config + * @param {string} minimum + */ +function ensure_minimum_target(config, minimum) { + const target = config.server.build.target; + const targets = Array.isArray(target) ? target : [target]; + const hasMinimum = targets.filter(t => { + // esnext is always supported + if (t === 'esnext') return true; + + // check if the target matches with the pattern "es\d\d\d\d" + const p = /^es(\d{4})$/; + const m = t.match(p); + if (!m) return false; + + // check if the target version is greater than or equal to the minimum version + const version = +m[1]; + const minimumVersion = +(minimum.match(p) || [])[1]; + return version >= minimumVersion; + }).length > 0; + + // inject minimum target if the current value doesn't contain the minimum + // so that esbuild can check the constraints + const ensuredTargets = hasMinimum ? targets : [...targets, minimum]; + return { ...config, server: { ...config.server, build: { ...config.server.build, target: ensuredTargets } } }; +} From 029fb051477b4dece2274c28d8af6fcc4fa5c74e Mon Sep 17 00:00:00 2001 From: gunggmee Date: Sun, 17 Oct 2021 12:07:34 +0900 Subject: [PATCH 2/6] add a unit test --- packages/kit/src/core/build/index.js | 17 +++++++++----- packages/kit/src/core/build/index.spec.js | 27 +++++++++++++++++++++++ 2 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 packages/kit/src/core/build/index.spec.js diff --git a/packages/kit/src/core/build/index.js b/packages/kit/src/core/build/index.js index ffffc5fcb010..2197ec7b40d9 100644 --- a/packages/kit/src/core/build/index.js +++ b/packages/kit/src/core/build/index.js @@ -623,26 +623,31 @@ function get_params(array) { * @param {Record} config * @param {string} minimum */ -function ensure_minimum_target(config, minimum) { +export function ensure_minimum_target(config, minimum) { + const esVersionPattern = /^es(\d{4})$/; const target = config.server.build.target; const targets = Array.isArray(target) ? target : [target]; - const hasMinimum = targets.filter(t => { + + // remove old ES versions + const targetsWithoutOldEs = targets.filter(t => t === 'esnext' || t === minimum || !t.match(esVersionPattern)); + + // check if we need to add the minimum target + const hasMinimum = targetsWithoutOldEs.filter(t => { // esnext is always supported if (t === 'esnext') return true; // check if the target matches with the pattern "es\d\d\d\d" - const p = /^es(\d{4})$/; - const m = t.match(p); + const m = t.match(esVersionPattern); if (!m) return false; // check if the target version is greater than or equal to the minimum version const version = +m[1]; - const minimumVersion = +(minimum.match(p) || [])[1]; + const minimumVersion = +(minimum.match(esVersionPattern) || [])[1]; return version >= minimumVersion; }).length > 0; // inject minimum target if the current value doesn't contain the minimum // so that esbuild can check the constraints - const ensuredTargets = hasMinimum ? targets : [...targets, minimum]; + const ensuredTargets = hasMinimum ? targetsWithoutOldEs : [...targetsWithoutOldEs, minimum]; return { ...config, server: { ...config.server, build: { ...config.server.build, target: ensuredTargets } } }; } diff --git a/packages/kit/src/core/build/index.spec.js b/packages/kit/src/core/build/index.spec.js new file mode 100644 index 000000000000..6baf3a112c88 --- /dev/null +++ b/packages/kit/src/core/build/index.spec.js @@ -0,0 +1,27 @@ +import { test } from 'uvu'; +import * as assert from 'uvu/assert'; +import { ensure_minimum_target } from './index.js'; + +test('ensure minimum target', () => { + const minimum = 'es2020'; + + const cases = [ + // same with the minimum + {overridden: 'es2020', expected: ['es2020']}, + // esnext is always okay + {overridden: 'esnext', expected: ['esnext']}, + // should replace es2018 with es2020 + {overridden: ['es2018', 'safari14'], expected: ['safari14', 'es2020']}, + // should add es2020 in order to delegate constraint checking to esbuild + {overridden: 'safari14', expected: ['safari14', 'es2020']}, + {overridden: ['safari14'], expected: ['safari14', 'es2020']} + ]; + + cases.forEach(({overridden, expected}) => { + const config = {server: {build: {target: overridden}}}; + const actual = ensure_minimum_target(config, minimum).server.build.target; + assert.equal(actual, expected); + }); +}); + +test.run(); From b13a0e967abf418243f164bea4833afb2ec21ad2 Mon Sep 17 00:00:00 2001 From: gunggmee Date: Sun, 17 Oct 2021 13:58:24 +0900 Subject: [PATCH 3/6] do not enforce minimum target --- packages/kit/src/core/build/index.js | 40 ++--------------------- packages/kit/src/core/build/index.spec.js | 27 --------------- 2 files changed, 2 insertions(+), 65 deletions(-) delete mode 100644 packages/kit/src/core/build/index.spec.js diff --git a/packages/kit/src/core/build/index.js b/packages/kit/src/core/build/index.js index 2197ec7b40d9..fb668ed0c9f9 100644 --- a/packages/kit/src/core/build/index.js +++ b/packages/kit/src/core/build/index.js @@ -446,8 +446,7 @@ async function build_server( const default_config = { server: { build: { - // set minimum target as es2020, yet allow users to override it with - // any target satisfying the constraints of the es2020 + // set minimum target as es2020, yet allow users to override target: 'es2020' }, fs: { @@ -459,10 +458,8 @@ async function build_server( // don't warn on overriding defaults const [modified_vite_config] = deep_merge(default_config, vite_config); - const adjusted_vite_config = ensure_minimum_target(modified_vite_config, default_config.server.build.target); - /** @type {[any, string[]]} */ - const [merged_config, conflicts] = deep_merge(adjusted_vite_config, { + const [merged_config, conflicts] = deep_merge(modified_vite_config, { configFile: false, root: cwd, base: assets_base, @@ -618,36 +615,3 @@ function get_params(array) { '})' : 'empty'; } - -/** - * @param {Record} config - * @param {string} minimum - */ -export function ensure_minimum_target(config, minimum) { - const esVersionPattern = /^es(\d{4})$/; - const target = config.server.build.target; - const targets = Array.isArray(target) ? target : [target]; - - // remove old ES versions - const targetsWithoutOldEs = targets.filter(t => t === 'esnext' || t === minimum || !t.match(esVersionPattern)); - - // check if we need to add the minimum target - const hasMinimum = targetsWithoutOldEs.filter(t => { - // esnext is always supported - if (t === 'esnext') return true; - - // check if the target matches with the pattern "es\d\d\d\d" - const m = t.match(esVersionPattern); - if (!m) return false; - - // check if the target version is greater than or equal to the minimum version - const version = +m[1]; - const minimumVersion = +(minimum.match(esVersionPattern) || [])[1]; - return version >= minimumVersion; - }).length > 0; - - // inject minimum target if the current value doesn't contain the minimum - // so that esbuild can check the constraints - const ensuredTargets = hasMinimum ? targetsWithoutOldEs : [...targetsWithoutOldEs, minimum]; - return { ...config, server: { ...config.server, build: { ...config.server.build, target: ensuredTargets } } }; -} diff --git a/packages/kit/src/core/build/index.spec.js b/packages/kit/src/core/build/index.spec.js deleted file mode 100644 index 6baf3a112c88..000000000000 --- a/packages/kit/src/core/build/index.spec.js +++ /dev/null @@ -1,27 +0,0 @@ -import { test } from 'uvu'; -import * as assert from 'uvu/assert'; -import { ensure_minimum_target } from './index.js'; - -test('ensure minimum target', () => { - const minimum = 'es2020'; - - const cases = [ - // same with the minimum - {overridden: 'es2020', expected: ['es2020']}, - // esnext is always okay - {overridden: 'esnext', expected: ['esnext']}, - // should replace es2018 with es2020 - {overridden: ['es2018', 'safari14'], expected: ['safari14', 'es2020']}, - // should add es2020 in order to delegate constraint checking to esbuild - {overridden: 'safari14', expected: ['safari14', 'es2020']}, - {overridden: ['safari14'], expected: ['safari14', 'es2020']} - ]; - - cases.forEach(({overridden, expected}) => { - const config = {server: {build: {target: overridden}}}; - const actual = ensure_minimum_target(config, minimum).server.build.target; - assert.equal(actual, expected); - }); -}); - -test.run(); From 2c13ebd73032c2757c7b26c81ea152d593d650ff Mon Sep 17 00:00:00 2001 From: gunggmee Date: Sun, 17 Oct 2021 14:05:25 +0900 Subject: [PATCH 4/6] generate changeset --- .changeset/unlucky-mugs-dress.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/unlucky-mugs-dress.md diff --git a/.changeset/unlucky-mugs-dress.md b/.changeset/unlucky-mugs-dress.md new file mode 100644 index 000000000000..ad2e52ef3439 --- /dev/null +++ b/.changeset/unlucky-mugs-dress.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +[fix] allow users to override build target From a0ebb6690ebba8f6c7235cac2649bbf9d784835e Mon Sep 17 00:00:00 2001 From: gunggmee Date: Mon, 18 Oct 2021 01:32:23 +0900 Subject: [PATCH 5/6] fix: move `build` config to proper level --- packages/kit/src/core/build/index.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/kit/src/core/build/index.js b/packages/kit/src/core/build/index.js index fb668ed0c9f9..423d6e1b59d1 100644 --- a/packages/kit/src/core/build/index.js +++ b/packages/kit/src/core/build/index.js @@ -444,11 +444,11 @@ async function build_server( const vite_config = config.kit.vite(); const default_config = { + build: { + // set default target as es2020, yet allow users to override + target: 'es2020' + }, server: { - build: { - // set minimum target as es2020, yet allow users to override - target: 'es2020' - }, fs: { strict: true } From 0a19bfbc11a429c86fe39f637c707612bf4a3df3 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Sun, 17 Oct 2021 19:55:23 -0700 Subject: [PATCH 6/6] Update packages/kit/src/core/build/index.js --- packages/kit/src/core/build/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/kit/src/core/build/index.js b/packages/kit/src/core/build/index.js index 423d6e1b59d1..da74f5f33ce8 100644 --- a/packages/kit/src/core/build/index.js +++ b/packages/kit/src/core/build/index.js @@ -445,7 +445,6 @@ async function build_server( const default_config = { build: { - // set default target as es2020, yet allow users to override target: 'es2020' }, server: {