From d26079ac933a2ba2a6eaa033047b8570f07f85a3 Mon Sep 17 00:00:00 2001 From: Remi Marche Date: Thu, 24 Feb 2022 04:06:13 +0000 Subject: [PATCH 1/4] use unconfig to support ts configuration files --- packages/kit/package.json | 1 + packages/kit/src/core/config/index.js | 16 ++- packages/kit/src/core/config/index.spec.js | 22 ++-- pnpm-lock.yaml | 136 +++++++++++++++++++++ 4 files changed, 156 insertions(+), 19 deletions(-) diff --git a/packages/kit/package.json b/packages/kit/package.json index 9d1d403be76c..917b5793eadc 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -42,6 +42,7 @@ "svelte-preprocess": "^4.9.8", "svelte2tsx": "~0.5.0", "tiny-glob": "^0.2.9", + "unconfig": "^0.3.1", "uvu": "^0.5.2" }, "peerDependencies": { diff --git a/packages/kit/src/core/config/index.js b/packages/kit/src/core/config/index.js index 972248c36bb8..fad577cdf081 100644 --- a/packages/kit/src/core/config/index.js +++ b/packages/kit/src/core/config/index.js @@ -1,8 +1,8 @@ import fs from 'fs'; import path from 'path'; -import * as url from 'url'; import { logger } from '../utils.js'; import options from './options.js'; +import { loadConfig } from 'unconfig'; /** * @param {string} cwd @@ -28,17 +28,19 @@ export function load_template(cwd, config) { } export async function load_config({ cwd = process.cwd() } = {}) { - const config_file = path.join(cwd, 'svelte.config.js'); + // load from `svelte.config.xx` where xx is one of ts, mjs, js, json + const { config, sources } = await loadConfig({ + sources: [{ files: 'svelte.config' }], + cwd + }); - if (!fs.existsSync(config_file)) { + if (!sources.length) { throw new Error( 'You need to create a svelte.config.js file. See https://kit.svelte.dev/docs/configuration' ); } - const config = await import(url.pathToFileURL(config_file).href); - - const validated = validate_config(config.default); + const validated = validate_config(config); validated.kit.files.assets = path.resolve(cwd, validated.kit.files.assets); validated.kit.files.hooks = path.resolve(cwd, validated.kit.files.hooks); @@ -55,6 +57,8 @@ export async function load_config({ cwd = process.cwd() } = {}) { * @returns {import('types').ValidatedConfig} */ export function validate_config(config) { + // unconfig returns an empty object if the config file does not return an object, + // so this should never happen. Leaving it here for safety. if (typeof config !== 'object') { throw new Error( 'svelte.config.js must have a configuration object as its default export. See https://kit.svelte.dev/docs/configuration' diff --git a/packages/kit/src/core/config/index.spec.js b/packages/kit/src/core/config/index.spec.js index 9258bdaa0ee0..49f72bdaf2d9 100644 --- a/packages/kit/src/core/config/index.spec.js +++ b/packages/kit/src/core/config/index.spec.js @@ -351,20 +351,16 @@ test('load default config (esm)', async () => { assert.equal(config, defaults); }); -test('errors on loading config with incorrect default export', async () => { - let message = null; - - try { - const cwd = join(__dirname, 'fixtures', 'export-string'); - await load_config({ cwd }); - } catch (/** @type {any} */ e) { - message = e.message; - } +test('defaults used when using loading config with incorrect default export', async () => { + const cwd = join(__dirname, 'fixtures/export-string'); + + const config = await load_config({ cwd }); + remove_keys(config, ([, v]) => typeof v === 'function'); - assert.equal( - message, - 'svelte.config.js must have a configuration object as its default export. See https://kit.svelte.dev/docs/configuration' - ); + const defaults = get_defaults(cwd + '/'); + defaults.kit.version.name = config.kit.version.name; + + assert.equal(config, defaults); }); test.run(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 185609670d25..bfb17ecbbe6c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -253,6 +253,7 @@ importers: svelte-preprocess: ^4.9.8 svelte2tsx: ~0.5.0 tiny-glob: ^0.2.9 + unconfig: ^0.3.1 uvu: ^0.5.2 vite: ^2.8.0 dependencies: @@ -287,6 +288,7 @@ importers: svelte-preprocess: 4.9.8_svelte@3.44.2+typescript@4.5.5 svelte2tsx: 0.5.0_svelte@3.44.2+typescript@4.5.5 tiny-glob: 0.2.9 + unconfig: 0.3.1 uvu: 0.5.2 packages/kit/test/prerendering/basics: @@ -366,6 +368,10 @@ packages: tunnel: 0.0.6 dev: true + /@antfu/utils/0.5.0: + resolution: {integrity: sha512-MrAQ/MrPSxbh1bBrmwJjORfJymw4IqSHFBXqvxaga3ZdDM+/zokYF8DjyJpSjY2QmpmgQrajDUBJOWrYeARfzA==} + dev: true + /@babel/code-frame/7.16.0: resolution: {integrity: sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==} engines: {node: '>=6.9.0'} @@ -1492,6 +1498,16 @@ packages: '@types/node': 16.11.11 dev: true + /@types/chai-subset/1.3.3: + resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + dependencies: + '@types/chai': 4.3.0 + dev: true + + /@types/chai/4.3.0: + resolution: {integrity: sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw==} + dev: true + /@types/compression/1.7.2: resolution: {integrity: sha512-lwEL4M/uAGWngWFLSG87ZDr2kLrbuR8p7X+QZB1OQlT+qkHsCPDVFnHPyXf4Vyl4yDDorNY+mAhosxkCvppatg==} dependencies: @@ -1963,6 +1979,10 @@ packages: resolution: {integrity: sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=} dev: true + /assertion-error/1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + /babel-plugin-dynamic-import-node/2.3.3: resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==} dependencies: @@ -2125,6 +2145,19 @@ packages: resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} dev: true + /chai/4.3.6: + resolution: {integrity: sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 3.0.1 + get-func-name: 2.0.0 + loupe: 2.3.4 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + /chalk/2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -2166,6 +2199,10 @@ packages: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true + /check-error/1.0.2: + resolution: {integrity: sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=} + dev: true + /chokidar/3.5.2: resolution: {integrity: sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==} engines: {node: '>= 8.10.0'} @@ -2424,6 +2461,13 @@ packages: resolution: {integrity: sha1-vuX7fJ5yfYXf+iRZDRDsGrElUwU=} dev: true + /deep-eql/3.0.1: + resolution: {integrity: sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==} + engines: {node: '>=0.12'} + dependencies: + type-detect: 4.0.8 + dev: true + /deep-extend/0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -2456,6 +2500,10 @@ packages: object-keys: 1.1.1 dev: true + /defu/5.0.1: + resolution: {integrity: sha512-EPS1carKg+dkEVy3qNTqIdp2qV7mUP08nIsupfwQpz++slCVRw7qbQyWvSTig+kFPwz2XXp5/kIIkH+CwrJKkQ==} + dev: true + /delegates/1.0.0: resolution: {integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=} dev: true @@ -3208,6 +3256,10 @@ packages: engines: {node: 6.* || 8.* || >= 10.*} dev: true + /get-func-name/2.0.0: + resolution: {integrity: sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=} + dev: true + /get-intrinsic/1.1.1: resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==} dependencies: @@ -3750,6 +3802,11 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dev: true + /jiti/1.13.0: + resolution: {integrity: sha512-/n9mNxZj/HDSrincJ6RP+L+yXbpnB8FybySBa+IjIaoH9FIxBbrbRT5XUbe8R7zuVM2AQqNMNDDqz0bzx3znOQ==} + hasBin: true + dev: true + /jpeg-js/0.4.3: resolution: {integrity: sha512-ru1HWKek8octvUHFHvE5ZzQ1yAsJmIvRdGWvSoKV52XKyuyYA437QWDttXT8eZXDSbuMpHlLzPDZUPd6idIz+Q==} dev: true @@ -3852,6 +3909,11 @@ packages: strip-bom: 3.0.0 dev: true + /local-pkg/0.4.1: + resolution: {integrity: sha512-lL87ytIGP2FU5PWwNDo0w3WhIo2gopIAxPg9RxDYF7m4rr5ahuZxP22xnJHIvaLTe4Z9P6uKKY2UHiwyB4pcrw==} + engines: {node: '>=14'} + dev: true + /locate-character/2.0.5: resolution: {integrity: sha512-n2GmejDXtOPBAZdIiEFy5dJ5N38xBCXLNOtw2WpB9kGh6pnrEuKlwYI+Tkpofc4wDtVXHtoAOJaMRlYG/oYaxg==} dev: true @@ -3890,6 +3952,12 @@ packages: resolution: {integrity: sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==} dev: true + /loupe/2.3.4: + resolution: {integrity: sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==} + dependencies: + get-func-name: 2.0.0 + dev: true + /lower-case/2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} dependencies: @@ -4527,6 +4595,10 @@ packages: engines: {node: '>=8'} dev: true + /pathval/1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + /pend/1.2.0: resolution: {integrity: sha1-elfrVQpng/kRUzH89GY9XI4AelA=} dev: true @@ -5614,6 +5686,16 @@ packages: globalyzer: 0.1.0 globrex: 0.1.2 + /tinypool/0.1.2: + resolution: {integrity: sha512-fvtYGXoui2RpeMILfkvGIgOVkzJEGediv8UJt7TxdAOY8pnvUkFg/fkvqTfXG9Acc9S17Cnn1S4osDc2164guA==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy/0.2.10: + resolution: {integrity: sha512-Qij6rGWCDjWIejxCXXVi6bNgvrYBp3PbqC4cBP/0fD6WHDOHCw09Zd13CsxrDqSR5PFq01WeqDws8t5lz5sH0A==} + engines: {node: '>=14.0.0'} + dev: true + /tmp/0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -5716,6 +5798,11 @@ packages: prelude-ls: 1.2.1 dev: true + /type-detect/4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + /type-fest/0.13.1: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} @@ -5757,6 +5844,23 @@ packages: which-boxed-primitive: 1.0.2 dev: true + /unconfig/0.3.1: + resolution: {integrity: sha512-aXy9NkXWcwMgzkiLBoKJP1frd1/h0z/uPgwpISre2RYG5pN4yaRFNGhcbpT6/RYziXOYVT+SeJt2tggm/eLhOg==} + dependencies: + '@antfu/utils': 0.5.0 + defu: 5.0.1 + jiti: 1.13.0 + vitest: 0.2.8 + transitivePeerDependencies: + - '@vitest/ui' + - c8 + - happy-dom + - jsdom + - less + - sass + - stylus + dev: true + /unist-util-is/4.1.0: resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} dev: true @@ -5856,6 +5960,38 @@ packages: optionalDependencies: fsevents: 2.3.2 + /vitest/0.2.8: + resolution: {integrity: sha512-shzN00EkvUNzP8cSykhrOCwB7MlGxcwJNjOtHhbayvexGnqX6oLOfEp3OQixWdDJpEaqNiE3Lcie0WsOnoQ3Og==} + engines: {node: '>=14.14.0'} + hasBin: true + peerDependencies: + '@vitest/ui': '*' + c8: '*' + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@vitest/ui': + optional: true + c8: + optional: true + happy-dom: + optional: true + jsdom: + optional: true + dependencies: + '@types/chai': 4.3.0 + '@types/chai-subset': 1.3.3 + chai: 4.3.6 + local-pkg: 0.4.1 + tinypool: 0.1.2 + tinyspy: 0.2.10 + vite: 2.8.0 + transitivePeerDependencies: + - less + - sass + - stylus + dev: true + /vscode-textmate/5.2.0: resolution: {integrity: sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==} dev: true From 3d07c893743430da6847fb60ff7d87af63963476 Mon Sep 17 00:00:00 2001 From: Remi Marche Date: Thu, 24 Feb 2022 06:11:41 +0000 Subject: [PATCH 2/4] update docs about ts config files --- documentation/docs/13-configuration.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/documentation/docs/13-configuration.md b/documentation/docs/13-configuration.md index e1d7316c7d8f..a50f35d5d868 100644 --- a/documentation/docs/13-configuration.md +++ b/documentation/docs/13-configuration.md @@ -84,6 +84,18 @@ const config = { export default config; ``` +### typescript config file + +Thanks to [unconfig](https://www.github.com/antfu/unconfig), you can also use a typescript configuration file. Simply rename `svelte.config.js` to `svelte.config.ts` and replace the beginning of the file with: + +```ts +/// file: svelte.config.ts +import type { Config } from 'sveltejs/kit'; +const config: Config = { + // Contents +} +``` + ### adapter Required when running `svelte-kit build` and determines how the output is converted for different platforms. See [Adapters](/docs/adapters). From e14664490039e1df3504e1637d29b3839b536408 Mon Sep 17 00:00:00 2001 From: Remi Marche Date: Thu, 24 Feb 2022 05:32:19 +0000 Subject: [PATCH 3/4] use ts config file in sites/kit.svelte.dev --- sites/kit.svelte.dev/{svelte.config.js => svelte.config.ts} | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) rename sites/kit.svelte.dev/{svelte.config.js => svelte.config.ts} (85%) diff --git a/sites/kit.svelte.dev/svelte.config.js b/sites/kit.svelte.dev/svelte.config.ts similarity index 85% rename from sites/kit.svelte.dev/svelte.config.js rename to sites/kit.svelte.dev/svelte.config.ts index 80a205a59644..f94a67297c75 100644 --- a/sites/kit.svelte.dev/svelte.config.js +++ b/sites/kit.svelte.dev/svelte.config.ts @@ -2,8 +2,9 @@ import * as path from 'path'; import adapter from '@sveltejs/adapter-auto'; import { imagetools } from 'vite-imagetools'; -/** @type {import('@sveltejs/kit').Config} */ -const config = { +import type { Config } from '@sveltejs/kit'; + +const config: Config = { kit: { adapter: adapter(), From 537c2a731e514faea96d060747872a2e79f4c0b6 Mon Sep 17 00:00:00 2001 From: Remi Marche Date: Thu, 24 Feb 2022 06:09:56 +0000 Subject: [PATCH 4/4] add changeset about typescript config files --- .changeset/twelve-zebras-tease.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/twelve-zebras-tease.md diff --git a/.changeset/twelve-zebras-tease.md b/.changeset/twelve-zebras-tease.md new file mode 100644 index 000000000000..b5e02cabeb2b --- /dev/null +++ b/.changeset/twelve-zebras-tease.md @@ -0,0 +1,6 @@ +--- +'@sveltejs/kit': patch +'kit.svelte.dev': patch +--- + +Add the ability to use a typescript configuration file. Move the docs site to this `svelte.config.ts`