From 0b2910313373333cff65e48db3c7f5e8384bd61f Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Fri, 9 Apr 2021 17:25:36 +0200 Subject: [PATCH 1/4] Support esm config files This adds support for loading `svelte.config.js` - config files in ESM format, which is now supported by language-tools. It tries to load the `.js` format first and falls back to `.cjs` to ensure backwards compatibility; some people may also want to keep using cjs config files due to things like easier imports of JSON files. This is also the reason why there's no change in the starter template: its config contains an import of `package.json`, and JSON imports are hidden behind an experimental node flag for now. --- packages/kit/src/cli.js | 11 +++-------- packages/kit/src/core/load_config/index.js | 6 +++++- .../fixtures/{ => default-cjs}/svelte.config.cjs | 0 .../test/fixtures/default-esm/svelte.config.js | 1 + packages/kit/src/core/load_config/test/index.js | 15 +++++++++++++-- 5 files changed, 22 insertions(+), 11 deletions(-) rename packages/kit/src/core/load_config/test/fixtures/{ => default-cjs}/svelte.config.cjs (100%) create mode 100644 packages/kit/src/core/load_config/test/fixtures/default-esm/svelte.config.js diff --git a/packages/kit/src/cli.js b/packages/kit/src/cli.js index 86338e430f9a..41153fc16088 100644 --- a/packages/kit/src/cli.js +++ b/packages/kit/src/cli.js @@ -26,16 +26,11 @@ async function get_config() { if ( error.code === 'MODULE_NOT_FOUND' && - /Cannot find module svelte\.config\.cjs/.test(error.message) + /Cannot find module svelte\.config\./.test(error.message) ) { - if (existsSync('svelte.config.js')) { - // TODO this is temporary, for the benefit of early adopters - message = 'You must rename svelte.config.js to svelte.config.cjs'; - } else { - message = 'Missing svelte.config.cjs'; - } + message = 'Missing svelte.config.js'; } else if (error.name === 'SyntaxError') { - message = 'Malformed svelte.config.cjs'; + message = 'Malformed svelte.config.js'; } console.error(colors.bold().red(message)); diff --git a/packages/kit/src/core/load_config/index.js b/packages/kit/src/core/load_config/index.js index bff9a16aacca..11b1cb5f5bef 100644 --- a/packages/kit/src/core/load_config/index.js +++ b/packages/kit/src/core/load_config/index.js @@ -1,6 +1,7 @@ import options from './options.js'; import * as url from 'url'; import path from 'path'; +import fs from 'fs'; import { resolve_entry } from '../utils.js'; /** @typedef {import('./types').ConfigDefinition} ConfigDefinition */ @@ -81,7 +82,10 @@ function remove_trailing_slash(str) { } export async function load_config({ cwd = process.cwd() } = {}) { - const config_file = path.join(cwd, 'svelte.config.cjs'); + const config_file_esm = path.join(cwd, 'svelte.config.js'); + const config_file = fs.existsSync(config_file_esm) + ? config_file_esm + : path.join(cwd, 'svelte.config.cjs'); const config = await import(url.pathToFileURL(config_file).href); const validated = validate_config(config.default); diff --git a/packages/kit/src/core/load_config/test/fixtures/svelte.config.cjs b/packages/kit/src/core/load_config/test/fixtures/default-cjs/svelte.config.cjs similarity index 100% rename from packages/kit/src/core/load_config/test/fixtures/svelte.config.cjs rename to packages/kit/src/core/load_config/test/fixtures/default-cjs/svelte.config.cjs diff --git a/packages/kit/src/core/load_config/test/fixtures/default-esm/svelte.config.js b/packages/kit/src/core/load_config/test/fixtures/default-esm/svelte.config.js new file mode 100644 index 000000000000..ff8b4c56321a --- /dev/null +++ b/packages/kit/src/core/load_config/test/fixtures/default-esm/svelte.config.js @@ -0,0 +1 @@ +export default {}; diff --git a/packages/kit/src/core/load_config/test/index.js b/packages/kit/src/core/load_config/test/index.js index 9a1437c1d095..ae9c1065b9e6 100644 --- a/packages/kit/src/core/load_config/test/index.js +++ b/packages/kit/src/core/load_config/test/index.js @@ -7,8 +7,11 @@ import { load_config } from '../index.js'; const __filename = fileURLToPath(import.meta.url); const __dirname = join(__filename, '..'); -test('load default config', async () => { - const cwd = join(__dirname, 'fixtures'); +/** + * @param {string} path + */ +async function testLoadDefaultConfig(path) { + const cwd = join(__dirname, 'fixtures', path); const config = await load_config({ cwd }); @@ -41,6 +44,14 @@ test('load default config', async () => { }, preprocess: null }); +} + +test('load default config (cjs)', async () => { + await testLoadDefaultConfig('default-cjs'); +}); + +test('load default config (esm)', async () => { + await testLoadDefaultConfig('default-esm'); }); test.run(); From 670429326f20d61afb7c535802c4bdd056b70fc6 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Fri, 9 Apr 2021 17:27:10 +0200 Subject: [PATCH 2/4] changeset --- .changeset/violet-spies-play.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/violet-spies-play.md diff --git a/.changeset/violet-spies-play.md b/.changeset/violet-spies-play.md new file mode 100644 index 000000000000..1b9463894975 --- /dev/null +++ b/.changeset/violet-spies-play.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +Add esm config support From d495cc24d359a39f99356c8ca487c46dce241392 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Fri, 30 Apr 2021 07:51:35 +0200 Subject: [PATCH 3/4] bump vite-plugin-svelte version and peer dep --- packages/kit/package.json | 4 +- pnpm-lock.yaml | 98 ++++++++++++++++++++++++++++++++------- 2 files changed, 84 insertions(+), 18 deletions(-) diff --git a/packages/kit/package.json b/packages/kit/package.json index d36521e6cf75..4a94185c46ab 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -3,7 +3,7 @@ "version": "1.0.0-next.91", "type": "module", "dependencies": { - "@sveltejs/vite-plugin-svelte": "^1.0.0-next.7", + "@sveltejs/vite-plugin-svelte": "^1.0.0-next.9", "cheap-watch": "^1.0.3", "sade": "^1.7.4" }, @@ -35,7 +35,7 @@ "vite": "^2.2.3" }, "peerDependencies": { - "svelte": "^3.32.1", + "svelte": "^3.34.0", "vite": "^2.2.3" }, "bin": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6f755b8dd7bf..b59cf72a0e59 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -190,7 +190,7 @@ importers: '@sveltejs/adapter-cloudflare-workers': link:../../../adapter-cloudflare-workers '@sveltejs/adapter-netlify': link:../../../adapter-netlify '@sveltejs/adapter-vercel': link:../../../adapter-vercel - '@sveltejs/kit': link:../../../kit + '@sveltejs/kit': 1.0.0-next.93_svelte@3.37.0+vite@2.2.3 svelte: 3.37.0 svelte-preprocess: 4.7.1_svelte@3.37.0+typescript@4.2.4 typescript: 4.2.4 @@ -200,7 +200,7 @@ importers: specifiers: '@rollup/plugin-replace': ^2.4.1 '@sveltejs/kit': workspace:* - '@sveltejs/vite-plugin-svelte': ^1.0.0-next.7 + '@sveltejs/vite-plugin-svelte': ^1.0.0-next.9 '@types/amphtml-validator': ^1.0.1 '@types/cookie': ^0.4.0 '@types/mime': ^2.0.3 @@ -227,7 +227,7 @@ importers: uvu: ^0.5.1 vite: ^2.2.3 dependencies: - '@sveltejs/vite-plugin-svelte': 1.0.0-next.7_6c43afb327f3ef976774a1a1e8559c8a + '@sveltejs/vite-plugin-svelte': 1.0.0-next.9_6c43afb327f3ef976774a1a1e8559c8a cheap-watch: 1.0.3 sade: 1.7.4 devDependencies: @@ -637,6 +637,16 @@ packages: rollup: 2.42.3 dev: true + /@rollup/pluginutils/4.1.0: + resolution: {integrity: sha512-TrBhfJkFxA+ER+ew2U2/fHbebhLT/l/2pRk0hfj9KusXUuRXd2v0R58AfaZK9VXDQ4TogOSEmICVrQAA3zFnHQ==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + estree-walker: 2.0.2 + picomatch: 2.2.3 + dev: true + /@rollup/pluginutils/4.1.0_rollup@2.41.1: resolution: {integrity: sha512-TrBhfJkFxA+ER+ew2U2/fHbebhLT/l/2pRk0hfj9KusXUuRXd2v0R58AfaZK9VXDQ4TogOSEmICVrQAA3zFnHQ==} engines: {node: '>= 8.0.0'} @@ -648,28 +658,68 @@ packages: rollup: 2.41.1 dev: false - /@sveltejs/vite-plugin-svelte/1.0.0-next.7_6c43afb327f3ef976774a1a1e8559c8a: - resolution: {integrity: sha512-ENvKYY36jrvFP7h1G87k5uOoEh5UM1m8n40J2duqV/R3wHnxfW81SCR1aXo+5CVU8Prm3/jtS4TWs8CUTqO1fw==} + /@sveltejs/kit/1.0.0-next.93_svelte@3.37.0+vite@2.2.3: + resolution: {integrity: sha512-WvmRj1Zk+SCbKYZGXCPlocOvGXRYGFOeZQC/k3C6KWAF11cM3H0i0mGzL0GmwrPmv35AjFtmH2iJ/J100ftUZw==} + engines: {node: '>= 12.17.0'} + hasBin: true + peerDependencies: + svelte: ^3.32.1 + vite: ^2.2.3 + dependencies: + '@sveltejs/vite-plugin-svelte': 1.0.0-next.9_svelte@3.37.0+vite@2.2.3 + cheap-watch: 1.0.3 + sade: 1.7.4 + svelte: 3.37.0 + vite: 2.2.3 + transitivePeerDependencies: + - rollup + - supports-color + dev: true + + /@sveltejs/vite-plugin-svelte/1.0.0-next.9_6c43afb327f3ef976774a1a1e8559c8a: + resolution: {integrity: sha512-ySB/GJsZV3h3jqjq5WIiaxVFkJK6vqtG9gS7Iw6SfUH9ZiFNw5JjQF69g68j9cNep3q4yRIYiG5/pI3YIdXEuA==} engines: {node: '>=12.0.0'} peerDependencies: svelte: ^3.37.0 - vite: ^2.1.5 + vite: ^2.2.3 dependencies: '@rollup/pluginutils': 4.1.0_rollup@2.41.1 - chalk: 4.1.0 + chalk: 4.1.1 debug: 4.3.2 hash-sum: 2.0.0 require-relative: 0.8.7 - slash: 3.0.0 + slash: 4.0.0 source-map: 0.7.3 svelte: 3.35.0 - svelte-hmr: 0.14.0_svelte@3.35.0 + svelte-hmr: 0.14.3_svelte@3.35.0 vite: 2.2.3 transitivePeerDependencies: - rollup - supports-color dev: false + /@sveltejs/vite-plugin-svelte/1.0.0-next.9_svelte@3.37.0+vite@2.2.3: + resolution: {integrity: sha512-ySB/GJsZV3h3jqjq5WIiaxVFkJK6vqtG9gS7Iw6SfUH9ZiFNw5JjQF69g68j9cNep3q4yRIYiG5/pI3YIdXEuA==} + engines: {node: '>=12.0.0'} + peerDependencies: + svelte: ^3.37.0 + vite: ^2.2.3 + dependencies: + '@rollup/pluginutils': 4.1.0 + chalk: 4.1.1 + debug: 4.3.2 + hash-sum: 2.0.0 + require-relative: 0.8.7 + slash: 4.0.0 + source-map: 0.7.3 + svelte: 3.37.0 + svelte-hmr: 0.14.3_svelte@3.37.0 + vite: 2.2.3 + transitivePeerDependencies: + - rollup + - supports-color + dev: true + /@types/amphtml-validator/1.0.1: resolution: {integrity: sha512-DWE7fy6KtC+Uw0KV/HAmjuH2GB/o8yskXlvmVWR7mOVsLDybp+XrwkzEeRFU9wGjWKeRMBNGsx+5DRq7sUsAwA==} dependencies: @@ -1180,6 +1230,14 @@ packages: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 + dev: true + + /chalk/4.1.1: + resolution: {integrity: sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 /chardet/0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} @@ -1188,7 +1246,6 @@ packages: /cheap-watch/1.0.3: resolution: {integrity: sha512-xC5CruMhLzjPwJ5ecUxGu1uGmwJQykUhqd2QrCrYbwvsFYdRyviu6jG9+pccwDXJR/OpmOTOJ9yLFunVgQu9wg==} engines: {node: '>=8'} - dev: false /ci-info/2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} @@ -1377,7 +1434,6 @@ packages: optional: true dependencies: ms: 2.1.2 - dev: false /decamelize-keys/1.1.0: resolution: {integrity: sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=} @@ -2064,7 +2120,6 @@ packages: /hash-sum/2.0.0: resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} - dev: false /hosted-git-info/2.8.8: resolution: {integrity: sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==} @@ -2819,7 +2874,6 @@ packages: /picomatch/2.2.3: resolution: {integrity: sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==} engines: {node: '>=8.6'} - dev: false /pify/2.3.0: resolution: {integrity: sha1-7RQaasBDqEnqWISY59yosVMw6Qw=} @@ -3079,7 +3133,6 @@ packages: /require-relative/0.8.7: resolution: {integrity: sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=} - dev: false /resolve-from/4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} @@ -3239,6 +3292,11 @@ packages: /slash/3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} + dev: true + + /slash/4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} /slice-ansi/4.0.0: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} @@ -3413,14 +3471,22 @@ packages: dependencies: has-flag: 4.0.0 - /svelte-hmr/0.14.0_svelte@3.35.0: - resolution: {integrity: sha512-Rc4w11U+U30m/cHqOJ/xioFSEAY5fd5muiQC7FL6XJuJAuB2OIJoEZl3KEJR2uO1/f4Bw0PdrugtbxcngSsOtQ==} + /svelte-hmr/0.14.3_svelte@3.35.0: + resolution: {integrity: sha512-N56xX405zLMw2tpGHKRx5h+kmdeZwxI21pvyC6OyBHJDCF6DlwWBm9TifdQmSD4dloWSmpDPzHWYa3CSjfopUg==} peerDependencies: svelte: '>=3.19.0' dependencies: svelte: 3.35.0 dev: false + /svelte-hmr/0.14.3_svelte@3.37.0: + resolution: {integrity: sha512-N56xX405zLMw2tpGHKRx5h+kmdeZwxI21pvyC6OyBHJDCF6DlwWBm9TifdQmSD4dloWSmpDPzHWYa3CSjfopUg==} + peerDependencies: + svelte: '>=3.19.0' + dependencies: + svelte: 3.37.0 + dev: true + /svelte-preprocess/4.7.0_typescript@4.2.4: resolution: {integrity: sha512-iNrY4YGqi0LD2e6oT9YbdSzOKntxk8gmzfqso1z/lUJOZh4o6fyIqkirmiZ8/dDJFqtIE1spVgDFWgkfhLEYlw==} engines: {node: '>= 9.11.2'} From 1f370f5d6b1169a883e89e298679e4f588e5af66 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Fri, 30 Apr 2021 08:58:19 +0200 Subject: [PATCH 4/4] cleanup lockfile --- pnpm-lock.yaml | 47 ++++++----------------------------------------- 1 file changed, 6 insertions(+), 41 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8ca8a3cfd6c2..70a91307dce7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -190,7 +190,7 @@ importers: '@sveltejs/adapter-cloudflare-workers': link:../../../adapter-cloudflare-workers '@sveltejs/adapter-netlify': link:../../../adapter-netlify '@sveltejs/adapter-vercel': link:../../../adapter-vercel - '@sveltejs/kit': 1.0.0-next.93_svelte@3.37.0+vite@2.2.3 + '@sveltejs/kit': link:../../../kit svelte: 3.37.0 svelte-preprocess: 4.7.1_svelte@3.37.0+typescript@4.2.4 typescript: 4.2.4 @@ -637,16 +637,6 @@ packages: rollup: 2.42.3 dev: true - /@rollup/pluginutils/4.1.0: - resolution: {integrity: sha512-TrBhfJkFxA+ER+ew2U2/fHbebhLT/l/2pRk0hfj9KusXUuRXd2v0R58AfaZK9VXDQ4TogOSEmICVrQAA3zFnHQ==} - engines: {node: '>= 8.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0 - dependencies: - estree-walker: 2.0.2 - picomatch: 2.2.3 - dev: true - /@rollup/pluginutils/4.1.0_rollup@2.41.1: resolution: {integrity: sha512-TrBhfJkFxA+ER+ew2U2/fHbebhLT/l/2pRk0hfj9KusXUuRXd2v0R58AfaZK9VXDQ4TogOSEmICVrQAA3zFnHQ==} engines: {node: '>= 8.0.0'} @@ -680,28 +670,6 @@ packages: - supports-color dev: false - /@sveltejs/vite-plugin-svelte/1.0.0-next.9_svelte@3.37.0+vite@2.2.3: - resolution: {integrity: sha512-ySB/GJsZV3h3jqjq5WIiaxVFkJK6vqtG9gS7Iw6SfUH9ZiFNw5JjQF69g68j9cNep3q4yRIYiG5/pI3YIdXEuA==} - engines: {node: '>=12.0.0'} - peerDependencies: - svelte: ^3.37.0 - vite: ^2.2.3 - dependencies: - '@rollup/pluginutils': 4.1.0 - chalk: 4.1.1 - debug: 4.3.2 - hash-sum: 2.0.0 - require-relative: 0.8.7 - slash: 4.0.0 - source-map: 0.7.3 - svelte: 3.37.0 - svelte-hmr: 0.14.3_svelte@3.37.0 - vite: 2.2.3 - transitivePeerDependencies: - - rollup - - supports-color - dev: true - /@types/amphtml-validator/1.0.1: resolution: {integrity: sha512-DWE7fy6KtC+Uw0KV/HAmjuH2GB/o8yskXlvmVWR7mOVsLDybp+XrwkzEeRFU9wGjWKeRMBNGsx+5DRq7sUsAwA==} dependencies: @@ -1229,6 +1197,7 @@ packages: /cheap-watch/1.0.3: resolution: {integrity: sha512-xC5CruMhLzjPwJ5ecUxGu1uGmwJQykUhqd2QrCrYbwvsFYdRyviu6jG9+pccwDXJR/OpmOTOJ9yLFunVgQu9wg==} engines: {node: '>=8'} + dev: false /ci-info/2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} @@ -1417,6 +1386,7 @@ packages: optional: true dependencies: ms: 2.1.2 + dev: false /decamelize-keys/1.1.0: resolution: {integrity: sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=} @@ -2103,6 +2073,7 @@ packages: /hash-sum/2.0.0: resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} + dev: false /hosted-git-info/2.8.8: resolution: {integrity: sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==} @@ -2857,6 +2828,7 @@ packages: /picomatch/2.2.3: resolution: {integrity: sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==} engines: {node: '>=8.6'} + dev: false /pify/2.3.0: resolution: {integrity: sha1-7RQaasBDqEnqWISY59yosVMw6Qw=} @@ -3116,6 +3088,7 @@ packages: /require-relative/0.8.7: resolution: {integrity: sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=} + dev: false /resolve-from/4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} @@ -3463,14 +3436,6 @@ packages: svelte: 3.35.0 dev: false - /svelte-hmr/0.14.3_svelte@3.37.0: - resolution: {integrity: sha512-N56xX405zLMw2tpGHKRx5h+kmdeZwxI21pvyC6OyBHJDCF6DlwWBm9TifdQmSD4dloWSmpDPzHWYa3CSjfopUg==} - peerDependencies: - svelte: '>=3.19.0' - dependencies: - svelte: 3.37.0 - dev: true - /svelte-preprocess/4.7.0_typescript@4.2.4: resolution: {integrity: sha512-iNrY4YGqi0LD2e6oT9YbdSzOKntxk8gmzfqso1z/lUJOZh4o6fyIqkirmiZ8/dDJFqtIE1spVgDFWgkfhLEYlw==} engines: {node: '>= 9.11.2'}