diff --git a/.changeset/gold-readers-sit.md b/.changeset/gold-readers-sit.md new file mode 100644 index 000000000000..9f3e334e225c --- /dev/null +++ b/.changeset/gold-readers-sit.md @@ -0,0 +1,12 @@ +--- +'hn.svelte.dev': patch +'svelte-kit-demo': patch +'@sveltejs/adapter-netlify': patch +'@sveltejs/adapter-node': patch +'@sveltejs/adapter-static': patch +'@sveltejs/app-utils': patch +'@sveltejs/kit': patch +'@sveltejs/snowpack-config': patch +--- + +Overhaul adapter API - fixes #166 diff --git a/examples/hn.svelte.dev/netlify.toml b/examples/hn.svelte.dev/netlify.toml new file mode 100644 index 000000000000..cbd944d3a1e8 --- /dev/null +++ b/examples/hn.svelte.dev/netlify.toml @@ -0,0 +1,4 @@ +[build] + command = "npm run build" + publish = "build/" + functions = "functions/" \ No newline at end of file diff --git a/examples/hn.svelte.dev/package.json b/examples/hn.svelte.dev/package.json index 650d3de2982c..6ad6a3e363ae 100644 --- a/examples/hn.svelte.dev/package.json +++ b/examples/hn.svelte.dev/package.json @@ -6,7 +6,7 @@ "build": "svelte build" }, "devDependencies": { - "@sveltejs/adapter-node": "workspace:*", + "@sveltejs/adapter-netlify": "workspace:*", "@sveltejs/kit": "workspace:*", "@sveltejs/snowpack-config": "workspace:*", "svelte": "^3.29.0" diff --git a/examples/hn.svelte.dev/svelte.config.js b/examples/hn.svelte.dev/svelte.config.js index c63e6d4a27a2..ba01daa31ca9 100644 --- a/examples/hn.svelte.dev/svelte.config.js +++ b/examples/hn.svelte.dev/svelte.config.js @@ -2,5 +2,5 @@ module.exports = { // By default, `npm run build` will create a standard Node app. // You can create optimized builds for different platforms by // specifying a different adapter - adapter: '@sveltejs/adapter-node' + adapter: '@sveltejs/adapter-netlify' }; \ No newline at end of file diff --git a/examples/svelte-kit-demo/src/setup/index.js b/examples/svelte-kit-demo/src/setup/index.js new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/package.json b/package.json index b221e44965c8..4e8865889f59 100644 --- a/package.json +++ b/package.json @@ -24,10 +24,13 @@ "@rollup/plugin-json": "^4.1.0", "@rollup/plugin-node-resolve": "^9.0.0", "@sveltejs/eslint-config": "github:sveltejs/eslint-config#v5.6.0", + "@typescript-eslint/eslint-plugin": "^4.8.2", + "@typescript-eslint/parser": "^4.8.2", "eslint": "^7.11.0", "eslint-plugin-import": "^2.22.1", "eslint-plugin-svelte3": "^2.7.3", "prettier": "2.1.2", - "rollup": "^2.32.0" + "rollup": "^2.32.0", + "typescript": "^4.1.2" } } diff --git a/packages/adapter-netlify/.gitignore b/packages/adapter-netlify/.gitignore index 4fd626439822..91dfed8d4a8b 100644 --- a/packages/adapter-netlify/.gitignore +++ b/packages/adapter-netlify/.gitignore @@ -1,4 +1,2 @@ .DS_Store -node_modules -/index.js -/render.js \ No newline at end of file +node_modules \ No newline at end of file diff --git a/packages/adapter-netlify/files/render.js b/packages/adapter-netlify/files/render.js new file mode 100644 index 000000000000..25f9fc1f4f08 --- /dev/null +++ b/packages/adapter-netlify/files/render.js @@ -0,0 +1,45 @@ +'use strict'; + +const url = require('url'); +const app = require('./app.js'); + +exports.handler = async (event) => { + const { + path, + httpMethod, + headers, + queryStringParameters + // body, // TODO pass this to renderer + // isBase64Encoded // TODO is this useful? + } = event; + + const query = new url.URLSearchParams(); + for (const k in queryStringParameters) { + const value = queryStringParameters[k]; + value.split(', ').forEach((v) => { + query.append(k, v); + }); + } + + const rendered = await app.render({ + host: null, // TODO + method: httpMethod, + headers, + path, + query + }); + + if (rendered) { + return { + isBase64Encoded: false, + statusCode: rendered.status, + headers: rendered.headers, + body: rendered.body + }; + } + + return { + statusCode: 404, + body: 'Not found' + }; +}; \ No newline at end of file diff --git a/packages/adapter-netlify/index.js b/packages/adapter-netlify/index.js new file mode 100644 index 000000000000..97b617cdc320 --- /dev/null +++ b/packages/adapter-netlify/index.js @@ -0,0 +1,48 @@ +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const toml = require('toml'); + +module.exports = async function adapter(builder) { + let netlify_config; + + if (fs.existsSync('netlify.toml')) { + try { + netlify_config = toml.parse(fs.readFileSync('netlify.toml', 'utf-8')); + } catch (err) { + err.message = `Error parsing netlify.toml: ${err.message}`; + throw err; + } + } else { + // TODO offer to create one? + throw new Error( + 'Missing a netlify.toml file. Consult https://github.com/sveltejs/kit/tree/master/packages/adapter-netlify#configuration' + ); + } + + if (!netlify_config.build || !netlify_config.build.publish || !netlify_config.build.functions) { + throw new Error( + 'You must specify build.publish and build.functions in netlify.toml. Consult https://github.com/sveltejs/adapter-netlify#configuration' + ); + } + + const publish = path.resolve(netlify_config.build.publish); + const functions = path.resolve(netlify_config.build.functions); + + builder.copy_static_files(publish); + builder.copy_client_files(`${publish}/_app`); + builder.copy_server_files(`${functions}/render`); + + // copy the renderer + fs.copyFileSync(path.resolve(__dirname, 'files/render.js'), `${functions}/render/index.js`); + + // create _redirects + fs.writeFileSync(`${publish}/_redirects`, '/* /.netlify/functions/render 200'); + + // prerender + builder.log.info('Prerendering static pages...'); + await builder.prerender({ + dest: publish + }); +}; diff --git a/packages/adapter-netlify/package.json b/packages/adapter-netlify/package.json index 8a8610b59822..fffaf9770416 100644 --- a/packages/adapter-netlify/package.json +++ b/packages/adapter-netlify/package.json @@ -1,27 +1,16 @@ { "name": "@sveltejs/adapter-netlify", "version": "0.0.11", - "devDependencies": { - "@sveltejs/app-utils": "workspace:*", - "@types/aws-lambda": "^8.10.64", - "devalue": "^2.0.1", - "rollup": "^2.32.0" - }, "main": "index.js", "files": [ - "render.js" + "files" ], "scripts": { - "dev": "rollup -cw", - "build": "rollup -c", "lint": "eslint --ignore-pattern node_modules/ --ignore-pattern render.js \"**/*.{ts,js,svelte}\" && npm run check-format", "format": "prettier --write . --config ../../.prettierrc --ignore-path .gitignore", - "check-format": "prettier --check . --config ../../.prettierrc --ignore-path .gitignore", - "prepublishOnly": "npm run build" + "check-format": "prettier --check . --config ../../.prettierrc --ignore-path .gitignore" }, "dependencies": { - "kleur": "^4.1.3", - "tiny-glob": "^0.2.8", "toml": "^3.0.0" } } diff --git a/packages/adapter-netlify/rollup.config.js b/packages/adapter-netlify/rollup.config.js deleted file mode 100644 index 4fece9aa4a88..000000000000 --- a/packages/adapter-netlify/rollup.config.js +++ /dev/null @@ -1,23 +0,0 @@ -import { nodeResolve } from '@rollup/plugin-node-resolve'; -import commonjs from '@rollup/plugin-commonjs'; - -export default [ - { - input: 'src/index.js', - output: { - file: 'index.js', - format: 'cjs' - }, - plugins: [nodeResolve(), commonjs()], - external: require('module').builtinModules - }, - { - input: 'src/render.js', - output: { - file: 'render.js', - format: 'cjs' - }, - plugins: [nodeResolve(), commonjs()], - external: require('module').builtinModules - } -]; diff --git a/packages/adapter-netlify/src/index.js b/packages/adapter-netlify/src/index.js deleted file mode 100644 index 9c31ff7303f7..000000000000 --- a/packages/adapter-netlify/src/index.js +++ /dev/null @@ -1,91 +0,0 @@ -import fs from 'fs'; -import path from 'path'; -import toml from 'toml'; -import glob from 'tiny-glob/sync'; -import { mkdirp } from '@sveltejs/app-utils/files'; -import { prerender, generate_manifest_module } from '@sveltejs/app-utils/renderer'; - -module.exports = async function builder({ - dir, - manifest, - log -}) { - let netlify_config; - - if (fs.existsSync('netlify.toml')) { - try { - netlify_config = toml.parse(fs.readFileSync('netlify.toml', 'utf-8')); - } catch (err) { - err.message = `Error parsing netlify.toml: ${err.message}`; - throw err; - } - } else { - throw new Error( - 'Missing a netlify.toml file. Consult https://github.com/sveltejs/kit/tree/master/packages/adapter-netlify#configuration' - ); - } - - if (!netlify_config.build || !netlify_config.build.publish || !netlify_config.build.functions) { - throw new Error( - 'You must specify build.publish and build.functions in netlify.toml. Consult https://github.com/sveltejs/adapter-netlify#configuration' - ); - } - - const publish = path.resolve(netlify_config.build.publish); - const functions = path.resolve(netlify_config.build.functions); - - mkdirp(`${publish}/_app`); - mkdirp(`${functions}/render`); - - // copy everything in `static` - glob('**/*', { cwd: 'static', filesOnly: true }).forEach((file) => { - mkdirp(path.dirname(`${publish}/${file}`)); - fs.copyFileSync(`static/${file}`, `${publish}/${file}`); - }); - - // copy client code - const client_code = path.resolve(dir, 'client'); - glob('**/*', { cwd: client_code, filesOnly: true }).forEach((file) => { - if (file[0] !== '.') { - mkdirp(path.dirname(`${publish}/_app/${file}`)); - fs.copyFileSync(`${client_code}/${file}`, `${publish}/_app/${file}`); - } - }); - - // prerender - log.info('Prerendering static pages...'); - await prerender({ - force: true, - dir, - out: publish, - manifest, - log - }); - - // copy server code - const server_code = path.resolve(dir, 'server'); - glob('**/*', { cwd: server_code, filesOnly: true }).forEach((file) => { - if (file[0] !== '.') { - mkdirp(path.dirname(`${functions}/render/${file}`)); - fs.copyFileSync(`${server_code}/${file}`, `${functions}/render/${file}`); - } - }); - - // copy the renderer - fs.copyFileSync(path.resolve(__dirname, 'render.js'), `${functions}/render/index.js`); - - // write manifest - fs.writeFileSync(`${functions}/render/manifest.js`, generate_manifest_module(manifest)); - - // copy client manifest - fs.copyFileSync(`${dir}/client.json`, `${functions}/render/client.json`); - - // copy template - fs.writeFileSync( - `${functions}/render/template.js`, - `module.exports = ${JSON.stringify(fs.readFileSync('src/app.html', 'utf-8'))};` - ); - - // create _redirects - fs.writeFileSync(`${publish}/_redirects`, '/* /.netlify/functions/render 200'); -}; diff --git a/packages/adapter-netlify/src/render.js b/packages/adapter-netlify/src/render.js deleted file mode 100644 index 015b4d308bf4..000000000000 --- a/packages/adapter-netlify/src/render.js +++ /dev/null @@ -1,66 +0,0 @@ -import { URLSearchParams } from 'url'; -import { render } from '@sveltejs/app-utils/renderer'; - -const manifest = require('./manifest.js'); -const client = require('./client.json'); -const root = require('./root.js'); -const setup = require('./setup.js'); -const template = require('./template.js'); - -// TODO this is a generic AWS lambda handler, and could be -// reused by other adapters - -export const handler = async (event) => { - const { - path, - httpMethod, - headers, - queryStringParameters - // body, // TODO pass this to renderer - // isBase64Encoded // TODO is this useful? - } = event; - - const query = new URLSearchParams(); - for (const k in queryStringParameters) { - const value = queryStringParameters[k]; - value.split(', ').forEach((v) => { - query.append(k, v); - }); - } - - const rendered = await render( - { - host: null, // TODO - method: httpMethod, - headers, - path, - query - }, - { - static_dir: 'static', - template, - manifest, - client, - root, - setup, - load: (route) => - require(`./routes/${route.name}.js`), - dev: false, - only_prerender: false - } - ); - - if (rendered) { - return { - isBase64Encoded: false, - statusCode: rendered.status, - headers: rendered.headers, - body: rendered.body - }; - } - - return { - statusCode: 404, - body: 'Not found' - }; -}; diff --git a/packages/adapter-node/.gitignore b/packages/adapter-node/.gitignore index 7fad62f488a3..1f664acc2b82 100644 --- a/packages/adapter-node/.gitignore +++ b/packages/adapter-node/.gitignore @@ -1,6 +1,3 @@ .DS_Store node_modules -index.js -index.d.ts -server.js -server.d.ts +/files \ No newline at end of file diff --git a/packages/adapter-node/index.js b/packages/adapter-node/index.js new file mode 100644 index 000000000000..ed64938da062 --- /dev/null +++ b/packages/adapter-node/index.js @@ -0,0 +1,17 @@ +'use strict'; + +const fs = require('fs'); + +module.exports = async function adapter(builder) { + const out = 'build'; // TODO implement adapter options + + builder.copy_server_files(out); + builder.copy_client_files(`${out}/assets/_app`); + + fs.copyFileSync(`${__dirname}/files/server.js`, `${out}/index.js`); + + builder.log.info('Prerendering static pages...'); + await builder.prerender({ + dest: `${out}/prerendered` + }); +}; diff --git a/packages/adapter-node/rollup.config.js b/packages/adapter-node/rollup.config.js index c40c1e98ccec..22990ab35d59 100644 --- a/packages/adapter-node/rollup.config.js +++ b/packages/adapter-node/rollup.config.js @@ -1,23 +1,13 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; -export default [ - { - input: 'src/index.js', - output: { - file: 'index.js', - format: 'cjs' - }, - plugins: [nodeResolve(), commonjs()], - external: require('module').builtinModules +export default { + input: 'src/server.js', + output: { + file: 'files/server.js', + format: 'cjs', + sourcemap: true }, - { - input: 'src/server.js', - output: { - file: 'server.js', - format: 'cjs' - }, - plugins: [nodeResolve(), commonjs()], - external: require('module').builtinModules - } -]; + plugins: [nodeResolve(), commonjs()], + external: require('module').builtinModules +}; diff --git a/packages/adapter-node/src/index.js b/packages/adapter-node/src/index.js deleted file mode 100644 index 6029803240ed..000000000000 --- a/packages/adapter-node/src/index.js +++ /dev/null @@ -1,52 +0,0 @@ -import fs from 'fs'; -import { copy } from '@sveltejs/app-utils/files'; -import { prerender } from '@sveltejs/app-utils/renderer'; - -module.exports = async function adapter({ - dir, - manifest, - log -}) { - const out = 'build'; // TODO implement adapter options - - copy(`${dir}/client`, `${out}/assets/_app`, (file) => !!file && file[0] !== '.'); - copy(`${dir}/server`, out); - copy(`${__dirname}/server.js`, `${out}/index.js`); - copy(`${dir}/client.json`, `${out}/client.json`); - copy('src/app.html', `${out}/app.html`); - - log.info('Prerendering static pages...'); - - await prerender({ - force: true, - dir, - out: `${out}/prerendered`, - assets: `${out}/assets`, - manifest, - log - }); - - // generate manifest - const written_manifest = `module.exports = { - layout: ${JSON.stringify(manifest.layout)}, - error: ${JSON.stringify(manifest.error)}, - components: ${JSON.stringify(manifest.components)}, - pages: [ - ${manifest.pages - .map((page) => `{ pattern: ${page.pattern}, parts: ${JSON.stringify(page.parts)} }`) - .join(',\n\t\t\t')} - ], - endpoints: [ - ${manifest.endpoints - .map( - (route) => - `{ name: '${route.name}', pattern: ${route.pattern}, file: '${ - route.file - }', params: ${JSON.stringify(route.params)} }` - ) - .join(',\n\t\t\t')} - ] - };`.replace(/^\t/gm, ''); - - fs.writeFileSync(`${out}/manifest.js`, written_manifest); -}; diff --git a/packages/adapter-node/src/server.js b/packages/adapter-node/src/server.js index 07eac31e58bc..80a7f970383a 100644 --- a/packages/adapter-node/src/server.js +++ b/packages/adapter-node/src/server.js @@ -2,12 +2,8 @@ import * as fs from 'fs'; import * as http from 'http'; import { parse, URLSearchParams } from 'url'; import sirv from 'sirv'; -import { render } from '@sveltejs/app-utils/renderer'; import { get_body } from '@sveltejs/app-utils/http'; -const manifest = require('./manifest.js'); -const client = require('./client.json'); - const { PORT = 3000 } = process.env; const mutable = (dir) => @@ -26,9 +22,7 @@ const assets_handler = sirv('build/assets', { immutable: true }); -const root = require('./root.js'); -const setup = require('./setup.js'); -const template = fs.readFileSync('build/app.html', 'utf-8'); +const app = require('./app.js'); const server = http.createServer((req, res) => { assets_handler(req, res, () => { @@ -36,28 +30,14 @@ const server = http.createServer((req, res) => { prerendered_handler(req, res, async () => { const parsed = parse(req.url || ''); - const rendered = await render( - { - host: null, // TODO - method: req.method, - headers: req.headers, // TODO: what about repeated headers, i.e. string[] - path: parsed.pathname, - body: await get_body(req), - query: new URLSearchParams(parsed.query || '') - }, - { - static_dir: 'static', - template, - manifest, - client, - root, - setup, - load: (route) => - require(`./routes/${route.name}.js`), - dev: false, - only_prerender: false - } - ); + const rendered = await app.render({ + host: null, // TODO + method: req.method, + headers: req.headers, // TODO: what about repeated headers, i.e. string[] + path: parsed.pathname, + body: await get_body(req), + query: new URLSearchParams(parsed.query || '') + }); if (rendered) { res.writeHead(rendered.status, rendered.headers); diff --git a/packages/adapter-static/.gitignore b/packages/adapter-static/.gitignore index 6e2e5caf77b0..9daa8247da45 100644 --- a/packages/adapter-static/.gitignore +++ b/packages/adapter-static/.gitignore @@ -1,3 +1,2 @@ .DS_Store node_modules -/index.js \ No newline at end of file diff --git a/packages/adapter-static/index.js b/packages/adapter-static/index.js new file mode 100644 index 000000000000..a09547ec2bc7 --- /dev/null +++ b/packages/adapter-static/index.js @@ -0,0 +1,13 @@ +'use strict'; + +module.exports = async function adapter(builder) { + // TODO implement adapter options, allow 'build' to be specified + + builder.copy_static_files('build'); + builder.copy_client_files('build/_app'); + + await builder.prerender({ + force: true, + dest: 'build' + }); +}; diff --git a/packages/adapter-static/package.json b/packages/adapter-static/package.json index dc38d0dcdb3b..bf39c1822461 100644 --- a/packages/adapter-static/package.json +++ b/packages/adapter-static/package.json @@ -2,13 +2,9 @@ "name": "@sveltejs/adapter-static", "version": "0.0.14", "scripts": { - "build": "rollup -c", "lint": "eslint --ignore-pattern node_modules/ \"**/*.{ts,js,svelte}\" && npm run check-format", "format": "prettier --write . --config ../../.prettierrc --ignore-path .gitignore", "check-format": "prettier --check . --config ../../.prettierrc --ignore-path .gitignore", "prepublishOnly": "npm run build" - }, - "dependencies": { - "@sveltejs/app-utils": "workspace:*" } } diff --git a/packages/adapter-static/rollup.config.js b/packages/adapter-static/rollup.config.js deleted file mode 100644 index d944379c4d9b..000000000000 --- a/packages/adapter-static/rollup.config.js +++ /dev/null @@ -1,12 +0,0 @@ -import { nodeResolve } from '@rollup/plugin-node-resolve'; -import commonjs from '@rollup/plugin-commonjs'; - -export default { - input: 'src/index.js', - output: { - file: 'index.js', - format: 'cjs' - }, - plugins: [nodeResolve(), commonjs()], - external: require('module').builtinModules -}; diff --git a/packages/adapter-static/src/index.js b/packages/adapter-static/src/index.js deleted file mode 100644 index 945cf8576b77..000000000000 --- a/packages/adapter-static/src/index.js +++ /dev/null @@ -1,22 +0,0 @@ - -import { copy } from '@sveltejs/app-utils/files'; -import { prerender } from '@sveltejs/app-utils/renderer'; - -module.exports = async function adapter({ - dir, - manifest, - log -}) { - const out = 'build'; // TODO implement adapter options - - copy('static', out); - copy(`${dir}/client`, `${out}/_app`); - - prerender({ - force: true, - dir, - out, - manifest, - log - }); -}; diff --git a/packages/app-utils/package.json b/packages/app-utils/package.json index 9eaa9623a33c..4180a3d88cbe 100644 --- a/packages/app-utils/package.json +++ b/packages/app-utils/package.json @@ -33,10 +33,6 @@ "./http": { "require": "./http/index.js", "import": "./http/index.mjs" - }, - "./renderer": { - "require": "./renderer/index.js", - "import": "./renderer/index.mjs" } }, "files": [ diff --git a/packages/app-utils/src/renderer/index.js b/packages/app-utils/src/renderer/index.js deleted file mode 100644 index fae2e3ddbddc..000000000000 --- a/packages/app-utils/src/renderer/index.js +++ /dev/null @@ -1,3 +0,0 @@ -export { render } from './render'; -export { prerender } from './prerender'; -export { generate_manifest_module } from './manifest'; diff --git a/packages/app-utils/src/renderer/manifest/index.js b/packages/app-utils/src/renderer/manifest/index.js deleted file mode 100644 index 4f393d28a1a3..000000000000 --- a/packages/app-utils/src/renderer/manifest/index.js +++ /dev/null @@ -1,37 +0,0 @@ -const array_item_delimiter = ','; - -function map_pages(pages) { - return pages - .map(({ pattern, parts: json_parts }) => { - const parts = JSON.stringify(json_parts); - return `{ pattern: ${pattern}, parts: ${parts} }`; - }) - .join(array_item_delimiter); -} - -function map_endpoints(endpoints) { - return endpoints - .map(({ name, pattern, file, params: json_params }) => { - const params = JSON.stringify(json_params); - return `{ name: '${name}', pattern: ${pattern}, file: '${file}', params: ${params} }`; - }) - .join(array_item_delimiter); -} - -export function generate_manifest_module(manifest) { - const strings = ['layout', 'error', 'components']; - const [layout, error, components] = strings.map((b) => JSON.stringify(manifest[b])); - const pages = map_pages(manifest.pages); - const endpoints = map_endpoints(manifest.endpoints); - - return ` -module.exports = { - layout: ${layout}, - error: ${error}, - components: ${components}, - pages: [${pages}], - endpoints: [${endpoints}] -};` - .replace(/^\t/gm, '') - .trim(); -} diff --git a/packages/app-utils/src/renderer/manifest/index.spec.data.js b/packages/app-utils/src/renderer/manifest/index.spec.data.js deleted file mode 100644 index 6da7b58107d9..000000000000 --- a/packages/app-utils/src/renderer/manifest/index.spec.data.js +++ /dev/null @@ -1,34 +0,0 @@ -const examplePageComponentManifest = { - default: true, - type: 'foo', - name: 'bar', - file: 'baz', - url: 'boo' -}; - -const examplePageManifest = { - pattern: /a/, - path: 'qux', - parts: [ - { - component: examplePageComponentManifest, - params: ['quux', 'corge'] - } - ] -}; - -const exampleEndpointManifest = { - name: 'grault', - pattern: /b/, - file: 'garply', - url: 'bla', - params: ['waldo', 'fred'] -}; - -export const exampleRouteManifest = { - layout: examplePageComponentManifest, - error: examplePageComponentManifest, - components: [examplePageComponentManifest, examplePageComponentManifest], - pages: [examplePageManifest, examplePageManifest], - endpoints: [exampleEndpointManifest, exampleEndpointManifest] -}; diff --git a/packages/app-utils/src/renderer/manifest/index.spec.js b/packages/app-utils/src/renderer/manifest/index.spec.js deleted file mode 100644 index a983bcfc9c62..000000000000 --- a/packages/app-utils/src/renderer/manifest/index.spec.js +++ /dev/null @@ -1,22 +0,0 @@ -import { suite } from 'uvu'; -import * as assert from 'uvu/assert'; -import { exampleRouteManifest } from './index.spec.data'; -import { generate_manifest_module } from '.'; - -const generate_manifest_module_suite = suite('#generate_manifest_module()'); - -generate_manifest_module_suite('writes manifest', () => { - const actual = generate_manifest_module(exampleRouteManifest); - const expected = ` -module.exports = { - layout: {"default":true,"type":"foo","name":"bar","file":"baz","url":"boo"}, - error: {"default":true,"type":"foo","name":"bar","file":"baz","url":"boo"}, - components: [{"default":true,"type":"foo","name":"bar","file":"baz","url":"boo"},{"default":true,"type":"foo","name":"bar","file":"baz","url":"boo"}], - pages: [{ pattern: /a/, parts: [{"component":{"default":true,"type":"foo","name":"bar","file":"baz","url":"boo"},"params":["quux","corge"]}] },{ pattern: /a/, parts: [{"component":{"default":true,"type":"foo","name":"bar","file":"baz","url":"boo"},"params":["quux","corge"]}] }], - endpoints: [{ name: 'grault', pattern: /b/, file: 'garply', params: ["waldo","fred"] },{ name: 'grault', pattern: /b/, file: 'garply', params: ["waldo","fred"] }] -}; - `; - assert.equal(actual, expected.trim()); -}); - -generate_manifest_module_suite.run(); diff --git a/packages/kit/.gitignore b/packages/kit/.gitignore index b8137f2ebe2c..0e2363f3cc19 100644 --- a/packages/kit/.gitignore +++ b/packages/kit/.gitignore @@ -2,4 +2,5 @@ /node_modules /dist /assets/runtime +/assets/renderer /client/**/*.d.ts diff --git a/packages/kit/package.json b/packages/kit/package.json index 73261b067209..550d6c7c8a8a 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -15,7 +15,9 @@ }, "devDependencies": { "@types/node": "^14.11.10", + "@types/rimraf": "^3.0.0", "@types/sade": "^1.7.2", + "esm": "^3.2.25", "estree-walker": "^2.0.1", "kleur": "^4.1.3", "magic-string": "^0.25.7", @@ -24,9 +26,11 @@ "periscopic": "^2.0.2", "port-authority": "^1.1.1", "require-relative": "^0.8.7", + "rimraf": "^3.0.2", "sirv": "^1.0.7", "source-map-support": "^0.5.19", - "svelte": "^3.29.0" + "svelte": "^3.29.0", + "tiny-glob": "^0.2.8" }, "bin": { "svelte": "svelte-kit" @@ -42,6 +46,7 @@ "lint": "eslint --ignore-pattern node_modules/ --ignore-pattern dist/ \"**/*.{ts,mjs,js,svelte}\" && npm run check-format", "format": "prettier --write . --config ../../.prettierrc --ignore-path .gitignore", "check-format": "prettier --check . --config ../../.prettierrc --ignore-path .gitignore", - "prepublishOnly": "npm run build" + "prepublishOnly": "npm run build", + "test": "uvu src \"(spec.js|test/index.js)\" -r esm" } } diff --git a/packages/kit/rollup.config.js b/packages/kit/rollup.config.js index 189cab99c17c..f0bbb810272a 100644 --- a/packages/kit/rollup.config.js +++ b/packages/kit/rollup.config.js @@ -32,6 +32,19 @@ export default [ ] }, + { + input: 'src/renderer/index.js', + output: { + dir: 'assets/renderer', + format: 'cjs', + sourcemap: true + }, + plugins: [ + resolve(), + commonjs() + ] + }, + { input: ['src/cli.js'], output: { diff --git a/packages/kit/src/api/build/Builder.js b/packages/kit/src/api/build/Builder.js new file mode 100644 index 000000000000..7c96c85d3fbe --- /dev/null +++ b/packages/kit/src/api/build/Builder.js @@ -0,0 +1,46 @@ +import { copy } from '@sveltejs/app-utils/files'; +import { prerender } from './prerender'; + +export default class Builder { + #generated_files; + #static_files; + #manifest; + + constructor({ + generated_files, + static_files, + log, + manifest + }) { + this.#generated_files = generated_files; + this.#static_files = static_files; + this.#manifest = manifest; + + this.log = log; + } + + copy_client_files(dest) { + copy(`${this.#generated_files}/client`, dest, (file) => file[0] !== '.'); + } + + copy_server_files(dest) { + copy(`${this.#generated_files}/server`, dest, (file) => file[0] !== '.'); + } + + copy_static_files(dest) { + copy(this.#static_files, dest); + } + + async prerender({ + force = false, + dest + }) { + await prerender({ + out: dest, + force, + dir: this.#generated_files, + manifest: this.#manifest, + log: this.log + }); + } +} diff --git a/packages/kit/src/api/build/index.js b/packages/kit/src/api/build/index.js index 8c80e28bd0ee..3b2c7277499f 100644 --- a/packages/kit/src/api/build/index.js +++ b/packages/kit/src/api/build/index.js @@ -12,12 +12,13 @@ import css_chunks from 'rollup-plugin-css-chunks'; import { copy_assets } from '../utils'; import { create_app } from '../../core/create_app'; import { css_injection } from './css_injection'; +import Builder from './Builder'; const exec = promisify(child_process.exec); const snowpack_main = require.resolve('snowpack'); const snowpack_pkg_file = path.join(snowpack_main, '../../package.json'); -const snowpack_pkg = require(snowpack_pkg_file); +const snowpack_pkg = require(snowpack_pkg_file); // eslint-disable-line const snowpack_bin = path.resolve(path.dirname(snowpack_pkg_file), snowpack_pkg.bin.snowpack); const ignorable_warnings = new Set(['EMPTY_BUNDLE', 'CIRCULAR_DEPENDENCY', 'MISSING_EXPORT']); @@ -77,21 +78,14 @@ export async function build(config) { header('Optimizing...'); await rimraf('.svelte/build/optimized'); - const server_input = { - root: `${unoptimized}/server/_app/main/generated/root.js`, - setup: `${unoptimized}/server/_app/setup/index.js` + const s = JSON.stringify; + + const client = { + entry: null, + deps: {} }; - [ - manifest.layout, // TODO is this necessary? if so why isn't manifest.error? - ...manifest.components, - ...manifest.endpoints - ].forEach((item) => { - server_input[`routes/${item.name}`] = `${unoptimized}/server${item.url.replace( - /\.\w+$/, - '.js' - )}`; - }); + const entry = path.resolve(`${unoptimized}/client/_app/main/runtime/navigation.js`); // https://github.com/snowpackjs/snowpack/discussions/1395 const re = /(\.\.\/)+_app\/main\/runtime\//; @@ -104,41 +98,6 @@ export async function build(config) { } }); - const server_chunks = await rollup({ - input: server_input, - plugins: [ - work_around_alias_bug('server'), - { - name: 'remove-css', - load(id) { - if (/\.css\.proxy\.js$/.test(id)) return ''; - } - }, - // TODO add server manifest generation so we can prune - // imports before zipping for cloud functions - terser() - ], - - onwarn, - - // TODO ensure this works with external node modules (on server) - external: (id) => id[0] !== '.' && !path.isAbsolute(id) - }); - - await server_chunks.write({ - dir: '.svelte/build/optimized/server', - format: 'cjs', // TODO some adapters might want ESM? - exports: 'named', - entryFileNames: '[name].js', - chunkFileNames: 'chunks/[name].js', - assetFileNames: 'assets/[name].js', - sourcemap: true - }); - - log.success('server'); - - const entry = path.resolve(`${unoptimized}/client/_app/main/runtime/navigation.js`); - const client_chunks = await rollup({ input: { entry @@ -166,10 +125,6 @@ export async function build(config) { const reverse_lookup = new Map(); const routes = path.resolve(`${unoptimized}/client/_app/routes`); - const client = { - entry: null, - deps: {} - }; let inject_styles; @@ -237,12 +192,6 @@ export async function build(config) { client.deps[component.name] = get_deps(key); }); - - // not using this.emitFile because the manifest doesn't belong with client code - fs.writeFileSync( - '.svelte/build/optimized/client.json', - JSON.stringify(client, null, ' ') - ); } }, terser() @@ -264,19 +213,115 @@ export async function build(config) { }); log.success('client'); + + fs.writeFileSync(`${unoptimized}/server/app.js`, ` + import * as renderer from '@sveltejs/kit/assets/renderer'; + import root from './_app/main/generated/root.js'; + import * as setup from './_app/setup/index.js'; + + const template = ${s(fs.readFileSync('src/app.html' /* TODO parameterise */, 'utf-8'))}; + + const manifest = { + layout: ${s(manifest.layout)}, + error: ${s(manifest.error)}, + components: ${s(manifest.components)}, + pages: [ + ${manifest.pages + .map(({ pattern, parts: json_parts }) => { + const parts = JSON.stringify(json_parts); + return `{ pattern: ${pattern}, parts: ${parts} }`; + }) + .join(',')} + ], + endpoints: [ + ${manifest.endpoints + .map(({ name, pattern, file, params: json_params }) => { + const params = JSON.stringify(json_params); + return `{ name: '${name}', pattern: ${pattern}, file: '${file}', params: ${params} }`; + }) + .join(',')} + ] + }; + + const client = ${s(client)}; + + export function render(request, { only_prerender = false } = {}) { + return renderer.render(request, { + static_dir: 'static', + template, + manifest, + client, + root, + setup, + load: (route) => require(\`./routes/\${route.name}.js\`), + dev: false, + only_prerender + }); + } + `.replace(/^\t{3}/gm, '').trim()); + + const server_input = { + app: `${unoptimized}/server/app.js` + }; + + [ + manifest.layout, // TODO is this necessary? if so why isn't manifest.error? + ...manifest.components, + ...manifest.endpoints + ].forEach((item) => { + server_input[`routes/${item.name}`] = `${unoptimized}/server${item.url.replace( + /\.\w+$/, + '.js' + )}`; + }); + + const server_chunks = await rollup({ + input: server_input, + plugins: [ + work_around_alias_bug('server'), + { + name: 'remove-css', + load(id) { + if (/\.css\.proxy\.js$/.test(id)) return ''; + } + }, + // TODO add server manifest generation so we can prune + // imports before zipping for cloud functions + terser() + ], + + onwarn, + + // TODO ensure this works with external node modules (on server) + external: (id) => id[0] !== '.' && !path.isAbsolute(id) + }); + + await server_chunks.write({ + dir: '.svelte/build/optimized/server', + format: 'cjs', // TODO some adapters might want ESM? + exports: 'named', + entryFileNames: '[name].js', + chunkFileNames: 'chunks/[name].js', + assetFileNames: 'assets/[name].js', + sourcemap: true + }); + + log.success('server'); } { // phase three — adapter header(`Generating app (${config.adapter})...`); - await rimraf('build'); // TODO customize - const adapter = relative(config.adapter); - await adapter({ - dir: '.svelte/build/optimized', + const builder = new Builder({ + generated_files: '.svelte/build/optimized', + static_files: 'static', manifest, log }); + + const adapter = relative(config.adapter); + await adapter(builder); } log.success('done'); diff --git a/packages/app-utils/src/renderer/prerender/index.js b/packages/kit/src/api/build/prerender.js similarity index 84% rename from packages/app-utils/src/renderer/prerender/index.js rename to packages/kit/src/api/build/prerender.js index 3e86fd2cedd0..9eb851a20fe5 100644 --- a/packages/app-utils/src/renderer/prerender/index.js +++ b/packages/kit/src/api/build/prerender.js @@ -1,8 +1,7 @@ import fs from 'fs'; import { dirname, resolve as resolve_path } from 'path'; import { parse, resolve, URLSearchParams } from 'url'; -import { mkdirp } from '../../files'; -import { render } from '../render'; +import { mkdirp } from '@sveltejs/app-utils/files'; function clean_html(html) { return html @@ -46,45 +45,29 @@ const REDIRECT = 3; export async function prerender({ dir, out, - assets, manifest, - force, - log + log, + force }) { const seen = new Set(); - const template = fs.readFileSync('src/app.html', 'utf-8'); - const client = JSON.parse(fs.readFileSync(`${dir}/client.json`, 'utf-8')); - const server_root = resolve_path(dir); - const root = require(`${server_root}/server/root.js`); - const setup = require(`${server_root}/server/setup.js`); + const app = require(`${server_root}/server/app.js`); async function crawl(path) { if (seen.has(path)) return; seen.add(path); - const rendered = await render( - { - host: null, // TODO ??? - method: 'GET', - headers: {}, - path, - body: null, - query: new URLSearchParams() - }, - { - only_prerender: !force, - template, - manifest, - client, - static_dir: 'static', - root, - setup, - load: (route) => require(`${server_root}/server/routes/${route.name}.js`), - dev: false - } - ); + const rendered = await app.render({ + host: null, // TODO ??? + method: 'GET', + headers: {}, + path, + body: null, + query: new URLSearchParams() + }, { + only_prerender: !force + }); if (rendered) { const response_type = Math.floor(rendered.status / 100); @@ -178,9 +161,8 @@ export async function prerender({ const parts = parsed.pathname.slice(1).split('/').filter(Boolean); if (parts[parts.length - 1] === 'index.html') parts.pop(); - // TODO this feels iffy const file_exists = - (assets && fs.existsSync(`${assets}${parsed.pathname}`)) || + (parsed.pathname.startsWith('/_app/') && fs.existsSync(`${dir}/client/${parsed.pathname.replace('/_app/', '')}`)) || fs.existsSync(`${out}${parsed.pathname}`) || fs.existsSync(`static${parsed.pathname}`) || fs.existsSync(`static${parsed.pathname}/index.html`); diff --git a/packages/kit/src/api/build/test/fixtures/basic/.svelte/build/optimized/client.json b/packages/kit/src/api/build/test/fixtures/basic/.svelte/build/optimized/client.json new file mode 100644 index 000000000000..9e26dfeeb6e6 --- /dev/null +++ b/packages/kit/src/api/build/test/fixtures/basic/.svelte/build/optimized/client.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/packages/kit/src/api/build/test/fixtures/basic/.svelte/build/optimized/client/routes/index.js b/packages/kit/src/api/build/test/fixtures/basic/.svelte/build/optimized/client/routes/index.js new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/kit/src/api/build/test/fixtures/basic/.svelte/build/optimized/server/app.js b/packages/kit/src/api/build/test/fixtures/basic/.svelte/build/optimized/server/app.js new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/kit/src/api/build/test/fixtures/basic/.svelte/build/optimized/server/routes/index.js b/packages/kit/src/api/build/test/fixtures/basic/.svelte/build/optimized/server/routes/index.js new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/kit/src/api/build/test/fixtures/basic/static/answer.md b/packages/kit/src/api/build/test/fixtures/basic/static/answer.md new file mode 100644 index 000000000000..f70d7bba4ae1 --- /dev/null +++ b/packages/kit/src/api/build/test/fixtures/basic/static/answer.md @@ -0,0 +1 @@ +42 \ No newline at end of file diff --git a/packages/kit/src/api/build/test/index.js b/packages/kit/src/api/build/test/index.js new file mode 100644 index 000000000000..e620e0871791 --- /dev/null +++ b/packages/kit/src/api/build/test/index.js @@ -0,0 +1,71 @@ +// import { mkdtempSync, writeFileSync, readdirSync, mkdirSync } from 'fs'; +// import { tmpdir } from 'os'; +import { join } from 'path'; +import * as uvu from 'uvu'; +import * as assert from 'uvu/assert'; +import rimraf from 'rimraf'; +import glob from 'tiny-glob/sync'; +import Builder from '../Builder'; + +const suite = uvu.suite('Builder'); + +suite('builder ', () => { + assert.ok(Builder); +}); + +suite('copy files', () => { + const generated_files = join(__dirname, 'fixtures/basic/.svelte/build/optimized'); + const static_files = join(__dirname, 'fixtures/basic/static'); + + const builder = new Builder({ + generated_files, + static_files, + manifest: { + error: { + name: '$default_error', + url: '/_app/main/components/error.svelte' + }, + layout: { + name: '$default_layout', + url: '/_app/main/components/layout.svelte' + }, + components: [], + pages: [], + endpoints: [] + }, + log: Object.assign((_msg) => {}, { + info: (_msg) => {}, + warn: (_msg) => {}, + error: (_msg) => {}, + success: (_msg) => {} + }) + }); + + const dest = join(__dirname, 'output'); + + rimraf.sync(dest); + builder.copy_static_files(dest); + + assert.equal( + glob('**', { cwd: static_files }), + glob('**', { cwd: dest }) + ); + + rimraf.sync(dest); + builder.copy_client_files(dest); + + assert.equal( + glob('**', { cwd: `${generated_files}/client` }), + glob('**', { cwd: dest }) + ); + + rimraf.sync(dest); + builder.copy_server_files(dest); + + assert.equal( + glob('**', { cwd: `${generated_files}/server` }), + glob('**', { cwd: dest }) + ); +}); + +suite.run(); diff --git a/packages/kit/src/api/build/test/output/app.js b/packages/kit/src/api/build/test/output/app.js new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/kit/src/api/build/test/output/routes/index.js b/packages/kit/src/api/build/test/output/routes/index.js new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/kit/src/api/dev/index.js b/packages/kit/src/api/dev/index.js index 6992d57fb8c2..795bf4437efd 100644 --- a/packages/kit/src/api/dev/index.js +++ b/packages/kit/src/api/dev/index.js @@ -11,7 +11,7 @@ import snowpack from 'snowpack'; import pkg from '../../../package.json'; import loader from './loader'; import { mkdirp } from '@sveltejs/app-utils/files'; -import { render } from '@sveltejs/app-utils/renderer'; +import { render } from '../../renderer'; import { get_body } from '@sveltejs/app-utils/http'; import { copy_assets } from '../utils'; import { readFileSync } from 'fs'; @@ -134,7 +134,7 @@ class Watcher extends EventEmitter { let root; try { - root = await load('/_app/main/generated/root.js'); + root = (await load('/_app/main/generated/root.js')).default; } catch (e) { res.statusCode = 500; res.end(e.toString()); diff --git a/packages/kit/src/api/dev/loader.js b/packages/kit/src/api/dev/loader.js index e65d6a859bd8..d07e2b08fb73 100644 --- a/packages/kit/src/api/dev/loader.js +++ b/packages/kit/src/api/dev/loader.js @@ -67,7 +67,6 @@ export default function loader(snowpack, config) { .then((result) => initialize_module(url, result.contents, url_stack.concat(url))) .catch((e) => { cache.delete(url); - console.error(e); throw e; }); diff --git a/packages/kit/src/core/create_manifest_data.js b/packages/kit/src/core/create_manifest_data.js index 3ff08d0ad121..7cf1417129af 100644 --- a/packages/kit/src/core/create_manifest_data.js +++ b/packages/kit/src/core/create_manifest_data.js @@ -30,13 +30,11 @@ export default function create_manifest_data( const default_layout = { name: '$default_layout', - file: null, url: '/_app/main/components/layout.svelte' }; const default_error = { name: '$default_error', - file: null, url: '/_app/main/components/error.svelte' }; diff --git a/packages/app-utils/src/renderer/render/endpoint.js b/packages/kit/src/renderer/endpoint.js similarity index 100% rename from packages/app-utils/src/renderer/render/endpoint.js rename to packages/kit/src/renderer/endpoint.js diff --git a/packages/app-utils/src/renderer/render/index.js b/packages/kit/src/renderer/index.js similarity index 100% rename from packages/app-utils/src/renderer/render/index.js rename to packages/kit/src/renderer/index.js diff --git a/packages/app-utils/src/renderer/render/page.js b/packages/kit/src/renderer/page.js similarity index 99% rename from packages/app-utils/src/renderer/render/page.js rename to packages/kit/src/renderer/page.js index 3d6c602d8826..6f835c2487ea 100644 --- a/packages/app-utils/src/renderer/render/page.js +++ b/packages/kit/src/renderer/page.js @@ -243,7 +243,7 @@ export default async function render_page( ) .join(',')}]`; - const rendered = options.root.default.render(props); + const rendered = options.root.render(props); const deps = options.client.deps; const js_deps = new Set(deps.__entry__ ? [...deps.__entry__.js] : []); @@ -298,8 +298,6 @@ export default async function render_page( dependencies }; } catch (thrown) { - console.error(thrown.stack); - if (!error) { const status = thrown.status || 500; return render_page(request, context, options, status, thrown); diff --git a/packages/snowpack-config/snowpack.config.js b/packages/snowpack-config/snowpack.config.js index 709b7b9d2d37..0e6603bdd3e0 100644 --- a/packages/snowpack-config/snowpack.config.js +++ b/packages/snowpack-config/snowpack.config.js @@ -28,7 +28,7 @@ module.exports = { 'src/setup': '/_app/setup' }, alias: { - $app: '/_app/main/runtime', + $app: './.svelte/main/runtime', $components: './src/components' } }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e06fa301cc27..014593df9324 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,31 +5,37 @@ importers: '@rollup/plugin-commonjs': 15.1.0_rollup@2.32.0 '@rollup/plugin-json': 4.1.0_rollup@2.32.0 '@rollup/plugin-node-resolve': 9.0.0_rollup@2.32.0 - '@sveltejs/eslint-config': github.com/sveltejs/eslint-config/7224f2bba6ac40407c332b41fa2bede946f4868f_9ee733401bef03657849a7355d21b2a8 + '@sveltejs/eslint-config': github.com/sveltejs/eslint-config/7224f2bba6ac40407c332b41fa2bede946f4868f_1b15e19ea7698126a709280ea6e700d3 + '@typescript-eslint/eslint-plugin': 4.8.2_f9d49e058d7a244a64cfc7d6f997e32c + '@typescript-eslint/parser': 4.8.2_eslint@7.11.0+typescript@4.1.2 eslint: 7.11.0 eslint-plugin-import: 2.22.1_eslint@7.11.0 eslint-plugin-svelte3: 2.7.3_eslint@7.11.0 prettier: 2.1.2 rollup: 2.32.0 + typescript: 4.1.2 specifiers: '@changesets/cli': ^2.11.1 '@rollup/plugin-commonjs': ^15.1.0 '@rollup/plugin-json': ^4.1.0 '@rollup/plugin-node-resolve': ^9.0.0 '@sveltejs/eslint-config': 'github:sveltejs/eslint-config#v5.6.0' + '@typescript-eslint/eslint-plugin': ^4.8.2 + '@typescript-eslint/parser': ^4.8.2 eslint: ^7.11.0 eslint-plugin-import: ^2.22.1 eslint-plugin-svelte3: ^2.7.3 prettier: 2.1.2 rollup: ^2.32.0 + typescript: ^4.1.2 examples/hn.svelte.dev: devDependencies: - '@sveltejs/adapter-node': 'link:../../packages/adapter-node' + '@sveltejs/adapter-netlify': 'link:../../packages/adapter-netlify' '@sveltejs/kit': 'link:../../packages/kit' '@sveltejs/snowpack-config': 'link:../../packages/snowpack-config' svelte: 3.29.0 specifiers: - '@sveltejs/adapter-node': 'workspace:*' + '@sveltejs/adapter-netlify': 'workspace:*' '@sveltejs/kit': 'workspace:*' '@sveltejs/snowpack-config': 'workspace:*' svelte: ^3.29.0 @@ -66,21 +72,8 @@ importers: '@sveltejs/app-utils': 'workspace:*' packages/adapter-netlify: dependencies: - kleur: 4.1.3 - tiny-glob: 0.2.8 toml: 3.0.0 - devDependencies: - '@sveltejs/app-utils': 'link:../app-utils' - '@types/aws-lambda': 8.10.64 - devalue: 2.0.1 - rollup: 2.32.0 specifiers: - '@sveltejs/app-utils': 'workspace:*' - '@types/aws-lambda': ^8.10.64 - devalue: ^2.0.1 - kleur: ^4.1.3 - rollup: ^2.32.0 - tiny-glob: ^0.2.8 toml: ^3.0.0 packages/adapter-node: dependencies: @@ -93,10 +86,7 @@ importers: rollup: ^2.32.0 sirv: ^1.0.7 packages/adapter-static: - dependencies: - '@sveltejs/app-utils': 'link:../app-utils' - specifiers: - '@sveltejs/app-utils': 'workspace:*' + specifiers: {} packages/adapter-vercel: devDependencies: '@sveltejs/app-utils': 'link:../app-utils' @@ -157,7 +147,9 @@ importers: snowpack: 2.17.0 devDependencies: '@types/node': 14.11.10 + '@types/rimraf': 3.0.0 '@types/sade': 1.7.2 + esm: 3.2.25 estree-walker: 2.0.1 kleur: 4.1.3 magic-string: 0.25.7 @@ -166,14 +158,18 @@ importers: periscopic: 2.0.2 port-authority: 1.1.1 require-relative: 0.8.7 + rimraf: 3.0.2 sirv: 1.0.7 source-map-support: 0.5.19 svelte: 3.29.0 + tiny-glob: 0.2.8 specifiers: '@sveltejs/app-utils': 'workspace:*' '@types/node': ^14.11.10 + '@types/rimraf': ^3.0.0 '@types/sade': ^1.7.2 cheap-watch: ^1.0.2 + esm: ^3.2.25 estree-walker: ^2.0.1 http-proxy: ^1.18.1 kleur: ^4.1.3 @@ -183,6 +179,7 @@ importers: periscopic: ^2.0.2 port-authority: ^1.1.1 require-relative: ^0.8.7 + rimraf: ^3.0.2 rollup: ^2.32.0 rollup-dependency-tree: 0.0.14 rollup-plugin-css-chunks: ^1.2.8 @@ -193,6 +190,7 @@ importers: snowpack: ^2.17.0 source-map-support: ^0.5.19 svelte: ^3.29.0 + tiny-glob: ^0.2.8 packages/snowpack-config: dependencies: '@snowpack/plugin-svelte': 3.0.0 @@ -643,6 +641,17 @@ packages: /@types/estree/0.0.45: resolution: integrity: sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g== + /@types/glob/7.1.3: + dependencies: + '@types/minimatch': 3.0.3 + '@types/node': 14.14.5 + dev: true + resolution: + integrity: sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== + /@types/json-schema/7.0.6: + dev: true + resolution: + integrity: sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== /@types/json5/0.0.29: dev: true resolution: @@ -651,6 +660,10 @@ packages: dev: true resolution: integrity: sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q== + /@types/minimatch/3.0.3: + dev: true + resolution: + integrity: sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== /@types/minimist/1.2.0: dev: true resolution: @@ -693,6 +706,13 @@ packages: '@types/node': 14.14.5 resolution: integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== + /@types/rimraf/3.0.0: + dependencies: + '@types/glob': 7.1.3 + '@types/node': 14.14.5 + dev: true + resolution: + integrity: sha512-7WhJ0MdpFgYQPXlF4Dx+DhgvlPCfz/x5mHaeDQAKhcenvQP1KCpLQ18JklAqeGMYSAT2PxLpzd0g2/HE7fj7hQ== /@types/sade/1.7.2: dependencies: '@types/mri': 1.1.0 @@ -703,6 +723,111 @@ packages: dev: true resolution: integrity: sha512-RxAwYt4rGwK5GyoRwuP0jT6ZHAVTdz2EqgsHmX0PYNjGsko+OeT4WFXXTs/lM3teJUJodM+SNtAL5/pXIJ61IQ== + /@typescript-eslint/eslint-plugin/4.8.2_f9d49e058d7a244a64cfc7d6f997e32c: + dependencies: + '@typescript-eslint/experimental-utils': 4.8.2_eslint@7.11.0+typescript@4.1.2 + '@typescript-eslint/parser': 4.8.2_eslint@7.11.0+typescript@4.1.2 + '@typescript-eslint/scope-manager': 4.8.2 + debug: 4.3.1 + eslint: 7.11.0 + functional-red-black-tree: 1.0.1 + regexpp: 3.1.0 + semver: 7.3.2 + tsutils: 3.17.1_typescript@4.1.2 + typescript: 4.1.2 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + peerDependencies: + '@typescript-eslint/parser': ^4.0.0 + eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + resolution: + integrity: sha512-gQ06QLV5l1DtvYtqOyFLXD9PdcILYqlrJj2l+CGDlPtmgLUzc1GpqciJFIRvyfvgLALpnxYINFuw+n9AZhPBKQ== + /@typescript-eslint/experimental-utils/4.8.2_eslint@7.11.0+typescript@4.1.2: + dependencies: + '@types/json-schema': 7.0.6 + '@typescript-eslint/scope-manager': 4.8.2 + '@typescript-eslint/types': 4.8.2 + '@typescript-eslint/typescript-estree': 4.8.2_typescript@4.1.2 + eslint: 7.11.0 + eslint-scope: 5.1.1 + eslint-utils: 2.1.0 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + peerDependencies: + eslint: '*' + typescript: '*' + resolution: + integrity: sha512-hpTw6o6IhBZEsQsjuw/4RWmceRyESfAiEzAEnXHKG1X7S5DXFaZ4IO1JO7CW1aQ604leQBzjZmuMI9QBCAJX8Q== + /@typescript-eslint/parser/4.8.2_eslint@7.11.0+typescript@4.1.2: + dependencies: + '@typescript-eslint/scope-manager': 4.8.2 + '@typescript-eslint/types': 4.8.2 + '@typescript-eslint/typescript-estree': 4.8.2_typescript@4.1.2 + debug: 4.3.1 + eslint: 7.11.0 + typescript: 4.1.2 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + peerDependencies: + eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + resolution: + integrity: sha512-u0leyJqmclYr3KcXOqd2fmx6SDGBO0MUNHHAjr0JS4Crbb3C3d8dwAdlazy133PLCcPn+aOUFiHn72wcuc5wYw== + /@typescript-eslint/scope-manager/4.8.2: + dependencies: + '@typescript-eslint/types': 4.8.2 + '@typescript-eslint/visitor-keys': 4.8.2 + dev: true + engines: + node: ^8.10.0 || ^10.13.0 || >=11.10.1 + resolution: + integrity: sha512-qHQ8ODi7mMin4Sq2eh/6eu03uVzsf5TX+J43xRmiq8ujng7ViQSHNPLOHGw/Wr5dFEoxq/ubKhzClIIdQy5q3g== + /@typescript-eslint/types/4.8.2: + dev: true + engines: + node: ^8.10.0 || ^10.13.0 || >=11.10.1 + resolution: + integrity: sha512-z1/AVcVF8ju5ObaHe2fOpZYEQrwHyZ7PTOlmjd3EoFeX9sv7UekQhfrCmgUO7PruLNfSHrJGQvrW3Q7xQ8EoAw== + /@typescript-eslint/typescript-estree/4.8.2_typescript@4.1.2: + dependencies: + '@typescript-eslint/types': 4.8.2 + '@typescript-eslint/visitor-keys': 4.8.2 + debug: 4.3.1 + globby: 11.0.1 + is-glob: 4.0.1 + lodash: 4.17.20 + semver: 7.3.2 + tsutils: 3.17.1_typescript@4.1.2 + typescript: 4.1.2 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + resolution: + integrity: sha512-HToGNwI6fekH0dOw3XEVESUm71Onfam0AKin6f26S2FtUmO7o3cLlWgrIaT1q3vjB3wCTdww3Dx2iGq5wtUOCg== + /@typescript-eslint/visitor-keys/4.8.2: + dependencies: + '@typescript-eslint/types': 4.8.2 + eslint-visitor-keys: 2.0.0 + dev: true + engines: + node: ^8.10.0 || ^10.13.0 || >=11.10.1 + resolution: + integrity: sha512-Vg+/SJTMZJEKKGHW7YC21QxgKJrSbxoYYd3MEUGtW7zuytHuEcksewq0DUmo4eh/CTNrVJGSdIY9AtRb6riWFw== /acorn-jsx/5.3.1_acorn@7.4.1: dependencies: acorn: 7.4.1 @@ -1225,6 +1350,19 @@ packages: optional: true resolution: integrity: sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== + /debug/4.3.1: + dependencies: + ms: 2.1.2 + dev: true + engines: + node: '>=6.0' + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + resolution: + integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== /decamelize-keys/1.1.0: dependencies: decamelize: 1.2.0 @@ -1897,6 +2035,7 @@ packages: resolution: integrity: sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== /globalyzer/0.1.0: + dev: true resolution: integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q== /globby/11.0.1: @@ -1913,6 +2052,7 @@ packages: resolution: integrity: sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== /globrex/0.1.2: + dev: true resolution: integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== /graceful-fs/4.2.4: @@ -3133,7 +3273,6 @@ packages: /rimraf/3.0.2: dependencies: glob: 7.1.6 - dev: false hasBin: true resolution: integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -3663,6 +3802,7 @@ packages: dependencies: globalyzer: 0.1.0 globrex: 0.1.2 + dev: true resolution: integrity: sha512-vkQP7qOslq63XRX9kMswlby99kyO5OvKptw7AMwBVMjXEI7Tb61eoI5DydyEMOseyGS5anDN1VPoVxEvH01q8w== /tmp/0.0.33: @@ -3711,6 +3851,21 @@ packages: dev: true resolution: integrity: sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== + /tslib/1.14.1: + dev: true + resolution: + integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + /tsutils/3.17.1_typescript@4.1.2: + dependencies: + tslib: 1.14.1 + typescript: 4.1.2 + dev: true + engines: + node: '>= 6' + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + resolution: + integrity: sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== /tty-table/2.8.13: dependencies: chalk: 3.0.0 @@ -3751,6 +3906,13 @@ packages: node: '>=8' resolution: integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + /typescript/4.1.2: + dev: true + engines: + node: '>=4.2.0' + hasBin: true + resolution: + integrity: sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ== /unique-filename/1.1.1: dependencies: unique-slug: 2.0.2 @@ -3939,11 +4101,14 @@ packages: node: '>=8' resolution: integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== - github.com/sveltejs/eslint-config/7224f2bba6ac40407c332b41fa2bede946f4868f_9ee733401bef03657849a7355d21b2a8: + github.com/sveltejs/eslint-config/7224f2bba6ac40407c332b41fa2bede946f4868f_1b15e19ea7698126a709280ea6e700d3: dependencies: + '@typescript-eslint/eslint-plugin': 4.8.2_f9d49e058d7a244a64cfc7d6f997e32c + '@typescript-eslint/parser': 4.8.2_eslint@7.11.0+typescript@4.1.2 eslint: 7.11.0 eslint-plugin-import: 2.22.1_eslint@7.11.0 eslint-plugin-svelte3: 2.7.3_eslint@7.11.0 + typescript: 4.1.2 dev: true id: github.com/sveltejs/eslint-config/7224f2bba6ac40407c332b41fa2bede946f4868f name: '@sveltejs/eslint-config' diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index ed8ea6f137ab..000000000000 --- a/tsconfig.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "compilerOptions": { - "lib": ["es2020"], - // target node v8+ (https://node.green/) - // the only missing feature is Array.prototype.values - "target": "es2020", - - "declaration": true, - "declarationDir": "types", - - "noEmitOnError": true, - "noErrorTruncation": true, - - // rollup takes care of these - "module": "esnext", - "moduleResolution": "node", - "resolveJsonModule": true, - "allowSyntheticDefaultImports": true, - - "strict": true, - "noImplicitThis": true, - "noUnusedLocals": true, - "noUnusedParameters": true - } -}