diff --git a/package.json b/package.json index 30410242c1df..2a14efe840c4 100644 --- a/package.json +++ b/package.json @@ -32,10 +32,10 @@ "eslint": "^7.19.0", "eslint-plugin-import": "^2.22.1", "eslint-plugin-svelte3": "^3.0.0", - "esm": "^3.2.25", "playwright": "^1.8.0", "prettier": "2.2.1", "rollup": "^2.38.3", "typescript": "^4.1.3" - } + }, + "type": "module" } diff --git a/packages/app-utils/package.json b/packages/app-utils/package.json index 9b3b8a04747f..4b9ebbc62ffa 100644 --- a/packages/app-utils/package.json +++ b/packages/app-utils/package.json @@ -9,7 +9,7 @@ "format": "prettier --write . --config ../../.prettierrc --ignore-path .gitignore", "check-format": "prettier --check . --config ../../.prettierrc --ignore-path .gitignore", "prepublishOnly": "npm run build", - "test": "uvu -r esm" + "test": "uvu" }, "dependencies": { "mime": "^2.5.0" @@ -19,20 +19,17 @@ "@types/node": "^14.14.22", "@types/node-fetch": "^2.5.8", "devalue": "^2.0.1", - "esm": "^3.2.25", "node-fetch": "^2.6.1", "rollup": "^2.38.3", - "svelte": "^3.32.1", - "uvu": "^0.3.5" + "svelte": "^3.32.1" }, + "type": "module", "exports": { "./files": { - "require": "./files/index.js", - "import": "./files/index.mjs" + "import": "./files/index.js" }, "./http": { - "require": "./http/index.js", - "import": "./http/index.mjs" + "import": "./http/index.js" } }, "files": [ diff --git a/packages/app-utils/rimraf.js b/packages/app-utils/rimraf.js index adf63f1d0bf6..8b222ad15a99 100644 --- a/packages/app-utils/rimraf.js +++ b/packages/app-utils/rimraf.js @@ -1,4 +1,4 @@ -const fs = require('fs'); +import fs from 'fs'; const rm = fs.rm || fs.rmdir; const [, , ...filenames] = process.argv; diff --git a/packages/app-utils/rollup.config.js b/packages/app-utils/rollup.config.js index fc6c1be44b50..b33c73dbbce7 100644 --- a/packages/app-utils/rollup.config.js +++ b/packages/app-utils/rollup.config.js @@ -8,22 +8,13 @@ Object.keys(pkg.exports).forEach((key) => { export default { input, - output: [ - { - dir: '.', - entryFileNames: '[name]/index.js', - chunkFileNames: 'common/[name].js', - format: 'cjs', - sourcemap: true - }, - { - dir: '.', - entryFileNames: '[name]/index.mjs', - chunkFileNames: 'common/[name].js', - format: 'esm', - sourcemap: true - } - ], + output: { + dir: '.', + entryFileNames: '[name]/index.js', + chunkFileNames: 'common/[name].js', + format: 'esm', + sourcemap: true + }, plugins: [nodeResolve()], external: [...require('module').builtinModules, ...Object.keys(pkg.dependencies)] }; diff --git a/packages/app-utils/src/files/index.spec.js b/packages/app-utils/src/files/index.spec.mjs similarity index 98% rename from packages/app-utils/src/files/index.spec.js rename to packages/app-utils/src/files/index.spec.mjs index e0e0d8f4a225..ad08a325ebd9 100644 --- a/packages/app-utils/src/files/index.spec.js +++ b/packages/app-utils/src/files/index.spec.mjs @@ -3,7 +3,7 @@ import { tmpdir } from 'os'; import { join } from 'path'; import { suite } from 'uvu'; import * as assert from 'uvu/assert'; -import { copy } from '.'; +import { copy } from './index.js'; const suite_copy = suite('#copy()'); diff --git a/packages/create-svelte/cli/index.js b/packages/create-svelte/cli/index.js index 2cfe2ab90687..76e66f13d2ca 100644 --- a/packages/create-svelte/cli/index.js +++ b/packages/create-svelte/cli/index.js @@ -4,7 +4,7 @@ import parser from 'gitignore-parser'; import { bold, cyan, gray, green, red } from 'kleur/colors'; import path from 'path'; import prompts from 'prompts/lib/index'; -import glob from 'tiny-glob/sync'; +import glob from 'tiny-glob/sync.js'; import gitignore_contents from '../template/.gitignore'; import add_css from './modifications/add_css'; import add_typescript from './modifications/add_typescript'; diff --git a/packages/create-svelte/scripts/update-versions.js b/packages/create-svelte/scripts/update-versions.js index 73829f1c59b5..af3c40a6fff3 100644 --- a/packages/create-svelte/scripts/update-versions.js +++ b/packages/create-svelte/scripts/update-versions.js @@ -1,6 +1,6 @@ const { writeFileSync } = require('fs'); const { join } = require('path'); -const glob = require('tiny-glob/sync'); +const glob = require('tiny-glob/sync.js'); const template_pkg = require('../template/package.json'); const cwd = join(__dirname, '../../'); diff --git a/packages/kit/package.json b/packages/kit/package.json index 17969ca2031b..8f7da07c90b4 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,7 @@ { "name": "@sveltejs/kit", "version": "1.0.0-next.31", + "type": "module", "dependencies": { "cheap-watch": "^1.0.3", "http-proxy": "^1.18.1", @@ -19,14 +20,13 @@ "@types/sade": "^1.7.2", "amphtml-validator": "^1.0.34", "eslint": "^7.19.0", - "esm": "^3.2.25", "estree-walker": "^2.0.2", "is-reference": "^1.2.1", "kleur": "^4.1.4", "magic-string": "^0.25.7", - "meriyah": "^3.1.6", + "meriyah": "^4.1.1", "node-fetch": "^2.6.1", - "periscopic": "^2.0.3", + "periscopic": "^3.0.0", "port-authority": "^1.1.2", "require-relative": "^0.8.7", "rimraf": "^3.0.2", @@ -36,7 +36,7 @@ "tiny-glob": "^0.2.8" }, "bin": { - "svelte-kit": "svelte-kit" + "svelte-kit": "svelte-kit.js" }, "files": [ "assets", @@ -50,6 +50,14 @@ "format": "prettier --write . --config ../../.prettierrc --ignore-path .gitignore", "check-format": "prettier --check . --config ../../.prettierrc --ignore-path .gitignore", "prepublishOnly": "npm run build", - "test": "uvu src \"(spec.js|test/index.js)\" -r esm" + "test": "uvu src \"(spec.mjs|test/index.mjs)\"" + }, + "exports": { + "./api": { + "import": "./dist/api.js" + }, + "./renderer": { + "import": "./dist/renderer.js" + } } } diff --git a/packages/kit/rollup.config.js b/packages/kit/rollup.config.js index 17334deec4fb..54a20e202f92 100644 --- a/packages/kit/rollup.config.js +++ b/packages/kit/rollup.config.js @@ -45,7 +45,7 @@ export default [ }, output: { dir: 'dist', - format: 'cjs', + format: 'esm', sourcemap: true, chunkFileNames: '[name].js' }, diff --git a/packages/kit/src/api/adapt/Builder.js b/packages/kit/src/api/adapt/Builder.js index 4640ec23d96f..3369995254a9 100644 --- a/packages/kit/src/api/adapt/Builder.js +++ b/packages/kit/src/api/adapt/Builder.js @@ -1,5 +1,5 @@ import { copy } from '@sveltejs/app-utils/files'; -import { prerender } from './prerender'; +import { prerender } from './prerender.js'; export default class Builder { #generated_files; diff --git a/packages/kit/src/api/adapt/index.js b/packages/kit/src/api/adapt/index.js index 201f0f219fc7..2fc4d88f5eab 100644 --- a/packages/kit/src/api/adapt/index.js +++ b/packages/kit/src/api/adapt/index.js @@ -1,5 +1,5 @@ import colors from 'kleur'; -import relative from 'require-relative'; +import { pathToFileURL } from 'url'; import { logger } from '../utils'; import Builder from './Builder'; @@ -20,7 +20,8 @@ export async function adapt(config, { verbose }) { log }); - const fn = relative(adapter); + const resolved = await import.meta.resolve(adapter, pathToFileURL(process.cwd())); + const fn = await import(resolved); await fn(builder, options); log.success('done'); diff --git a/packages/kit/src/api/adapt/prerender.js b/packages/kit/src/api/adapt/prerender.js index 2e6b2bef5647..53747b2efcc7 100644 --- a/packages/kit/src/api/adapt/prerender.js +++ b/packages/kit/src/api/adapt/prerender.js @@ -1,7 +1,7 @@ import fs, { readFileSync } from 'fs'; import { dirname, join, resolve as resolve_path } from 'path'; import { parse, resolve, URLSearchParams } from 'url'; -import glob from 'tiny-glob/sync'; +import glob from 'tiny-glob/sync.js'; import { mkdirp } from '@sveltejs/app-utils/files'; function clean_html(html) { @@ -47,7 +47,7 @@ export async function prerender({ dir, out, log, config, force }) { const seen = new Set(); const server_root = resolve_path(dir); - const app = require(`${server_root}/server/app.cjs`); + const app = await import(`${server_root}/server/app.js`); app.init({ paths: config.paths diff --git a/packages/kit/src/api/adapt/test/index.js b/packages/kit/src/api/adapt/test/index.mjs similarity index 87% rename from packages/kit/src/api/adapt/test/index.js rename to packages/kit/src/api/adapt/test/index.mjs index 32db34cf64eb..e1ecbc6fd68e 100644 --- a/packages/kit/src/api/adapt/test/index.js +++ b/packages/kit/src/api/adapt/test/index.mjs @@ -4,8 +4,12 @@ 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'; +import glob from 'tiny-glob/sync.js'; +import Builder from '../Builder.js'; +import { fileURLToPath } from 'url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = join(__filename, '..'); const suite = uvu.suite('Builder'); diff --git a/packages/kit/src/api/build/index.js b/packages/kit/src/api/build/index.js index 10f218a0a70c..89c1245e6cd5 100644 --- a/packages/kit/src/api/build/index.js +++ b/packages/kit/src/api/build/index.js @@ -1,4 +1,5 @@ -import fs, { readFileSync, writeFileSync } from 'fs'; +import fs, { existsSync, readFileSync, writeFileSync } from 'fs'; +import { fileURLToPath } from 'url'; import path from 'path'; import child_process from 'child_process'; import { promisify } from 'util'; @@ -14,11 +15,15 @@ import { css_injection } from './css_injection'; const execFile = promisify(child_process.execFile); -const snowpack_main = require.resolve('snowpack'); -const snowpack_pkg_file = path.join(snowpack_main, '../../package.json'); -const snowpack_pkg = require(snowpack_pkg_file); // eslint-disable-line -const snowpack_bin = path.resolve(path.dirname(snowpack_pkg_file), snowpack_pkg.bin.snowpack); +let snowpack_pkg_file; +let dir = fileURLToPath(import.meta.url); +while (dir !== (dir = path.join(dir, '..'))) { + snowpack_pkg_file = path.join(dir, 'node_modules/snowpack/package.json'); + if (existsSync(snowpack_pkg_file)) break; +} +const snowpack_pkg = JSON.parse(readFileSync(snowpack_pkg_file, 'utf-8')); // eslint-disable-line +const snowpack_bin = path.resolve(path.dirname(snowpack_pkg_file), snowpack_pkg.bin.snowpack); const ignorable_warnings = new Set(['EMPTY_BUNDLE', 'MISSING_EXPORT']); const onwarn = (warning, handler) => { // TODO would be nice to just eliminate the circular dependencies instead of @@ -112,7 +117,8 @@ export async function build(config) { } } }, - css_chunks({ + // TODO the .default suggests a bug in the css_chunks plugin + css_chunks.default({ sourcemap: true }), css_injection, @@ -247,7 +253,7 @@ export async function build(config) { fs.writeFileSync( app_file, ` - import * as renderer from '@sveltejs/kit/dist/renderer'; + import * as renderer from '@sveltejs/kit/renderer'; import root from './${config.appDir}/assets/generated/root.svelte.js'; import { set_paths } from './${config.appDir}/assets/runtime/internal/singletons.js'; import * as setup from './${config.appDir}/setup/index.js'; @@ -378,11 +384,11 @@ export async function build(config) { await server_chunks.write({ dir: `${OPTIMIZED}/server`, - format: 'cjs', // TODO some adapters might want ESM? + format: 'esm', exports: 'named', - entryFileNames: '[name].cjs', - chunkFileNames: 'chunks/[name].cjs', - assetFileNames: 'assets/[name].cjs', + entryFileNames: '[name].js', + chunkFileNames: 'chunks/[name].js', + assetFileNames: 'assets/[name].js', sourcemap: true }); diff --git a/packages/kit/src/api/dev/index.js b/packages/kit/src/api/dev/index.js index e92fcbb37d44..957772c10172 100644 --- a/packages/kit/src/api/dev/index.js +++ b/packages/kit/src/api/dev/index.js @@ -340,7 +340,7 @@ class Watcher extends EventEmitter { this.server.close(); this.cheapwatch.close(); - this.snowpack.shutdown(); + return this.snowpack.shutdown(); } } diff --git a/packages/kit/src/api/dev/loader.js b/packages/kit/src/api/dev/loader.js index 4175a239b073..371356b81e1d 100644 --- a/packages/kit/src/api/dev/loader.js +++ b/packages/kit/src/api/dev/loader.js @@ -17,7 +17,7 @@ export default function loader(sp) { return load(pathname, url_stack); } - return Promise.resolve(load_node(imported)); + return import(imported); }; const invalidate_all = (path) => { @@ -128,18 +128,3 @@ export default function loader(sp) { return async (url) => load(url, []); } - -function load_node(source) { - // mirror Rollup's interop by allowing both of these: - // import fs from 'fs'; - // import { readFileSync } from 'fs'; - return { - exports: new Proxy(require(source), { - get(mod, prop) { - if (prop === 'default') return mod; - return mod[prop]; - } - }), - css: [] - }; -} diff --git a/packages/kit/src/api/dev/sourcemap_stacktrace.js b/packages/kit/src/api/dev/sourcemap_stacktrace.js index 02934274bc03..2abc45551503 100644 --- a/packages/kit/src/api/dev/sourcemap_stacktrace.js +++ b/packages/kit/src/api/dev/sourcemap_stacktrace.js @@ -1,5 +1,5 @@ import path from 'path'; -import { SourceMapConsumer } from 'source-map'; +import sourcemap from 'source-map'; function get_sourcemap_url(contents) { const reversed = contents.split('\n').reverse().join('\n'); @@ -65,12 +65,12 @@ export async function sourcemap_stacktrace(stack, load_contents) { // TODO: according to typings, this code cannot work; // the constructor returns a promise that needs to be awaited - const consumer = await new SourceMapConsumer(raw_sourcemap); + const consumer = await new sourcemap.SourceMapConsumer(raw_sourcemap); const pos = consumer.originalPositionFor({ line: Number(line), column: Number(column), - bias: SourceMapConsumer.LEAST_UPPER_BOUND + bias: sourcemap.SourceMapConsumer.LEAST_UPPER_BOUND }); if (!pos.source) return input; diff --git a/packages/kit/src/api/dev/transform.js b/packages/kit/src/api/dev/transform.js index e3b3b0e68fca..0c0df535c3f8 100644 --- a/packages/kit/src/api/dev/transform.js +++ b/packages/kit/src/api/dev/transform.js @@ -1,7 +1,7 @@ import * as meriyah from 'meriyah'; import MagicString from 'magic-string'; -import { analyze, extract_names } from 'periscopic'; -import { walk } from 'estree-walker'; +import * as periscopic from 'periscopic'; // eslint-disable-line import/no-unresolved +import * as walker from 'estree-walker'; import is_reference from 'is-reference'; export function transform(data) { @@ -11,11 +11,11 @@ export function transform(data) { next: true }); - const { map, scope } = analyze(ast); + const { map, scope } = periscopic.analyze(ast); const all_identifiers = new Set(); // first, get a list of all the identifiers used in the module... - walk(ast, { + walker.walk(ast, { enter(node, parent) { if (is_reference(node, parent)) { all_identifiers.add(node.name); @@ -109,7 +109,7 @@ export function transform(data) { if (node.declaration.type === 'VariableDeclaration') { const names = []; node.declaration.declarations.forEach((declarator) => { - names.push(...extract_names(declarator.id)); + names.push(...periscopic.extract_names(declarator.id)); }); suffix = names.map((name) => ` ${__export}('${name}', () => ${name});`).join(''); @@ -144,7 +144,7 @@ export function transform(data) { if (replacements.size) { let current_scope = scope; - walk(ast, { + walker.walk(ast, { enter(node, parent) { if (map.has(node)) { current_scope = map.get(node) || current_scope; @@ -176,7 +176,7 @@ export function transform(data) { // replace import.meta and import(dynamic) if (/import\s*\.\s*meta/.test(data) || /import\s*\(/.test(data)) { - walk(ast.body, { + walker.walk(ast.body, { enter(node) { if (node.type === 'MetaProperty' && node.meta.name === 'import') { code.overwrite(node.start, node.end, __import_meta); diff --git a/packages/kit/src/api/dev/transform.spec.js b/packages/kit/src/api/dev/transform.spec.mjs similarity index 98% rename from packages/kit/src/api/dev/transform.spec.js rename to packages/kit/src/api/dev/transform.spec.mjs index 568faf6ee984..855e8dafcaa2 100644 --- a/packages/kit/src/api/dev/transform.spec.js +++ b/packages/kit/src/api/dev/transform.spec.mjs @@ -1,6 +1,6 @@ import { test } from 'uvu'; import * as assert from 'uvu/assert'; -import { transform } from './transform'; +import { transform } from './transform.js'; function compare(a, b) { assert.equal(a.replace(/^\t+/gm, '').trim(), b.replace(/^\t+/gm, '').trim()); diff --git a/packages/kit/src/api/load_config/index.js b/packages/kit/src/api/load_config/index.js index 3935d742cae1..27e189a14961 100644 --- a/packages/kit/src/api/load_config/index.js +++ b/packages/kit/src/api/load_config/index.js @@ -1,7 +1,7 @@ -import relative from 'require-relative'; import { bold, yellow } from 'kleur/colors'; -import options from './options'; +import options from './options.js'; import * as url from 'url'; +import { join } from 'path'; function warn(msg) { console.log(bold(yellow(msg))); @@ -58,9 +58,10 @@ function remove_trailing_slash(str) { const expected = new Set(['compilerOptions', 'kit', 'preprocess']); -export function load_config({ cwd = process.cwd() } = {}) { - const config = relative('./svelte.config.cjs', cwd); - const validated = validate_config(config); +export async function load_config({ cwd = process.cwd() } = {}) { + const config_file = join(cwd, 'svelte.config.cjs'); + const config = await import(config_file); + const validated = validate_config(config.default); // TODO check all the `files` exist when the config is loaded? // TODO check that `target` is present in the provided template diff --git a/packages/kit/src/api/load_config/index.spec.js b/packages/kit/src/api/load_config/index.spec.mjs similarity index 98% rename from packages/kit/src/api/load_config/index.spec.js rename to packages/kit/src/api/load_config/index.spec.mjs index 054664b5c40a..e96616b2be80 100644 --- a/packages/kit/src/api/load_config/index.spec.js +++ b/packages/kit/src/api/load_config/index.spec.mjs @@ -1,6 +1,6 @@ import { test } from 'uvu'; import * as assert from 'uvu/assert'; -import { validate_config } from './index'; +import { validate_config } from './index.js'; test('fills in defaults', () => { const validated = validate_config({}); diff --git a/packages/kit/src/api/start/index.js b/packages/kit/src/api/start/index.js index 4219c258cd43..a3230699930d 100644 --- a/packages/kit/src/api/start/index.js +++ b/packages/kit/src/api/start/index.js @@ -1,10 +1,9 @@ import * as fs from 'fs'; import * as http from 'http'; -import relative from 'require-relative'; import { parse, URLSearchParams } from 'url'; import sirv from 'sirv'; import { get_body } from '@sveltejs/app-utils/http'; -import { join } from 'path'; +import { join, resolve } from 'path'; const mutable = (dir) => sirv(dir, { @@ -12,19 +11,20 @@ const mutable = (dir) => maxAge: 0 }); -export function start({ port, config }) { - return new Promise((fulfil) => { - const app = relative('./.svelte/build/optimized/server/app.cjs'); +export async function start({ port, config }) { + const app_file = resolve('.svelte/build/optimized/server/app.js'); + const app = await import(app_file); - const static_handler = fs.existsSync(config.files.assets) - ? mutable(config.files.assets) - : (_req, _res, next) => next(); + const static_handler = fs.existsSync(config.files.assets) + ? mutable(config.files.assets) + : (_req, _res, next) => next(); - const assets_handler = sirv('.svelte/build/optimized/client', { - maxAge: 31536000, - immutable: true - }); + const assets_handler = sirv('.svelte/build/optimized/client', { + maxAge: 31536000, + immutable: true + }); + return new Promise((fulfil) => { const server = http.createServer((req, res) => { const parsed = parse(req.url || ''); diff --git a/packages/kit/src/api/utils.js b/packages/kit/src/api/utils.js index dc8dc6aed19b..4f06e5f08963 100644 --- a/packages/kit/src/api/utils.js +++ b/packages/kit/src/api/utils.js @@ -1,6 +1,10 @@ -import { resolve } from 'path'; +import { dirname, resolve } from 'path'; import colors from 'kleur'; import { copy } from '@sveltejs/app-utils/files'; +import { fileURLToPath } from 'url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); export function copy_assets() { copy(resolve(__dirname, '../assets'), '.svelte/assets'); diff --git a/packages/kit/src/cli.js b/packages/kit/src/cli.js index 206fbc91ef01..947234b48ea6 100644 --- a/packages/kit/src/cli.js +++ b/packages/kit/src/cli.js @@ -48,7 +48,7 @@ prog .option('-o, --open', 'Open a browser tab', false) .action(async ({ port, open }) => { process.env.NODE_ENV = 'development'; - const config = get_config(); + const config = await get_config(); const { dev } = await import('./api/dev'); @@ -75,7 +75,7 @@ prog .describe('Create a production build of your app') .action(async () => { process.env.NODE_ENV = 'production'; - const config = get_config(); + const config = await get_config(); const { build } = await import('./api/build'); @@ -93,7 +93,7 @@ prog .option('-o, --open', 'Open a browser tab', false) .action(async ({ port, open }) => { process.env.NODE_ENV = 'production'; - const config = get_config(); + const config = await get_config(); const { start } = await import('./api/start'); diff --git a/packages/kit/src/core/create_manifest_data.js b/packages/kit/src/core/create_manifest_data.js index 9d08529d7fbd..0eb07c881567 100644 --- a/packages/kit/src/core/create_manifest_data.js +++ b/packages/kit/src/core/create_manifest_data.js @@ -1,7 +1,7 @@ import * as fs from 'fs'; import * as path from 'path'; -import * as mime from 'mime'; -import { posixify, reserved_words } from '../utils'; +import mime from 'mime'; +import { posixify, reserved_words } from '../utils.js'; export default function create_manifest_data(config, extensions = '.svelte') { // TODO support .svelte.md etc? diff --git a/packages/kit/src/core/test/create_manifest_data.spec.js b/packages/kit/src/core/test/create_manifest_data.spec.mjs similarity index 97% rename from packages/kit/src/core/test/create_manifest_data.spec.js rename to packages/kit/src/core/test/create_manifest_data.spec.mjs index d00bd58ae3fe..ca5fe46faf81 100644 --- a/packages/kit/src/core/test/create_manifest_data.spec.js +++ b/packages/kit/src/core/test/create_manifest_data.spec.mjs @@ -1,7 +1,11 @@ import * as path from 'path'; +import { fileURLToPath } from 'url'; import { test } from 'uvu'; import * as assert from 'uvu/assert'; -import create_manifest_data from '../create_manifest_data'; +import create_manifest_data from '../create_manifest_data.js'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.join(__filename, '..'); const get_config = (dir) => ({ files: { diff --git a/packages/kit/svelte-kit b/packages/kit/svelte-kit deleted file mode 100755 index 12c60b18af94..000000000000 --- a/packages/kit/svelte-kit +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env node -require('source-map-support/register'); -require('./dist/cli.js'); \ No newline at end of file diff --git a/packages/kit/svelte-kit.js b/packages/kit/svelte-kit.js new file mode 100755 index 000000000000..3569fa32943f --- /dev/null +++ b/packages/kit/svelte-kit.js @@ -0,0 +1,3 @@ +#!/usr/bin/env node +import 'source-map-support/register.js'; +import './dist/cli.js'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 99357e0eb949..58b96b291e48 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,7 +11,6 @@ importers: eslint: 7.19.0 eslint-plugin-import: 2.22.1_eslint@7.19.0 eslint-plugin-svelte3: 3.0.0_eslint@7.19.0 - esm: 3.2.25 playwright: 1.8.0 prettier: 2.2.1 rollup: 2.38.3 @@ -27,7 +26,6 @@ importers: eslint: ^7.19.0 eslint-plugin-import: ^2.22.1 eslint-plugin-svelte3: ^3.0.0 - esm: ^3.2.25 playwright: ^1.8.0 prettier: 2.2.1 rollup: ^2.38.3 @@ -124,22 +122,18 @@ importers: '@types/node': 14.14.22 '@types/node-fetch': 2.5.8 devalue: 2.0.1 - esm: 3.2.25 node-fetch: 2.6.1 rollup: 2.38.3 svelte: 3.32.1 - uvu: 0.3.5 specifiers: '@types/mime': ^2.0.3 '@types/node': ^14.14.22 '@types/node-fetch': ^2.5.8 devalue: ^2.0.1 - esm: ^3.2.25 mime: ^2.5.0 node-fetch: ^2.6.1 rollup: ^2.38.3 svelte: ^3.32.1 - uvu: ^0.3.5 packages/create-svelte: devDependencies: '@rollup/plugin-json': 4.1.0_rollup@2.38.3 @@ -181,14 +175,13 @@ importers: '@types/sade': 1.7.2 amphtml-validator: 1.0.34 eslint: 7.19.0 - esm: 3.2.25 estree-walker: 2.0.2 is-reference: 1.2.1 kleur: 4.1.4 magic-string: 0.25.7 - meriyah: 3.1.6 + meriyah: 4.1.1 node-fetch: 2.6.1 - periscopic: 2.0.3 + periscopic: 3.0.0 port-authority: 1.1.2 require-relative: 0.8.7 rimraf: 3.0.2 @@ -204,15 +197,14 @@ importers: amphtml-validator: ^1.0.34 cheap-watch: ^1.0.3 eslint: ^7.19.0 - esm: ^3.2.25 estree-walker: ^2.0.2 http-proxy: ^1.18.1 is-reference: ^1.2.1 kleur: ^4.1.4 magic-string: ^0.25.7 - meriyah: ^3.1.6 + meriyah: ^4.1.1 node-fetch: ^2.6.1 - periscopic: ^2.0.3 + periscopic: ^3.0.0 port-authority: ^1.1.2 require-relative: ^0.8.7 rimraf: ^3.0.2 @@ -237,9 +229,11 @@ importers: '@sveltejs/kit': 'link:../packages/kit' devDependencies: port-authority: 1.1.2 + uvu: 0.6.0-next.1 specifiers: '@sveltejs/kit': 'workspace:*' port-authority: ^1.1.2 + uvu: ^0.6.0-next.1 test/apps/amp: devDependencies: '@sveltejs/adapter-node': 'link:../../../packages/adapter-node' @@ -1285,12 +1279,12 @@ packages: dev: true resolution: integrity: sha512-I2TiqT5iWBEyB8GRfTDP0hiLZ0YeDJZ+upDxjBfOC2lebO5LezQMv7QvIUTzdb64jQyAKLf1AHADtGN+jw6v8Q== - /diff/4.0.2: + /diff/5.0.0: dev: true engines: node: '>=0.3.1' resolution: - integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== /dir-glob/3.0.1: dependencies: path-type: 4.0.0 @@ -1512,12 +1506,6 @@ packages: hasBin: true resolution: integrity: sha512-CGlMgJY56JZ9ZSYhJuhow61lMPPjUzWmChFya71Z/jilVos7mR/jPgaEfVGgMBY5DshbKdG8Ezb8FDCHcoMEMg== - /esm/3.2.25: - dev: true - engines: - node: '>=6' - resolution: - integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== /espree/7.3.1: dependencies: acorn: 7.4.1 @@ -2341,12 +2329,12 @@ packages: node: '>= 8' resolution: integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - /meriyah/3.1.6: + /meriyah/4.1.1: dev: true engines: node: '>=10.4.0' resolution: - integrity: sha512-JDOSi6DIItDc33U5N52UdV6P8v+gn+fqZKfbAfHzdWApRQyQWdcvxPvAr9t01bI2rBxGvSrKRQSCg3SkZC1qeg== + integrity: sha512-Awk9n/HTyIZWhtpZkb8HvlrU7q7fBGl24wm4HXxVFm5IV3ov2PacmR41SL+LZ9EtuhRCudw5MkGaXUcUEcOBZg== /micromatch/4.0.2: dependencies: braces: 3.0.2 @@ -2675,13 +2663,13 @@ packages: dev: true resolution: integrity: sha1-elfrVQpng/kRUzH89GY9XI4AelA= - /periscopic/2.0.3: + /periscopic/3.0.0: dependencies: estree-walker: 2.0.2 is-reference: 1.2.1 dev: true resolution: - integrity: sha512-FuCZe61mWxQOJAQFEfmt9FjzebRlcpFz8sFPbyaCKtdusPkMEbA9ey0eARnRav5zAhmXznhaQkKGFAPn7X9NUw== + integrity: sha512-m/MBWIgwELB00OdTvM+Ei5saKHNKmyFWy0iW2MpbADmIdK/sL+kir3Yvb+Z2vzYeItZVtemA0bgAg5lZXoJmaA== /picomatch/2.2.2: dev: true engines: @@ -3538,10 +3526,10 @@ packages: dev: false resolution: integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== - /uvu/0.3.5: + /uvu/0.6.0-next.1: dependencies: dequal: 2.0.2 - diff: 4.0.2 + diff: 5.0.0 kleur: 4.1.4 sade: 1.7.4 totalist: 2.0.0 @@ -3550,7 +3538,7 @@ packages: node: '>=8' hasBin: true resolution: - integrity: sha512-kcRdf1Lt4MeU70UsyIjqKq1NHau4IMW6VTLpWsSab3Xb3JbDBymCrLrWQmjMfXSG3AEmWW7TRlkIOkI8N8rQ/A== + integrity: sha512-YXBhSHY/tlP/ulBi+JDvLGFgDhmVUALufkFAxF61S6hUnI4IQ/9KT0tEVNTLLdzoPZs+9vpjLUTYJOWxffciPQ== /v8-compile-cache/2.2.0: dev: true resolution: diff --git a/test/apps/amp/package.json b/test/apps/amp/package.json index bf279d291a16..dd70ee596b74 100644 --- a/test/apps/amp/package.json +++ b/test/apps/amp/package.json @@ -6,12 +6,13 @@ "dev": "svelte-kit dev", "build": "svelte-kit build", "start": "svelte-kit start", - "test": "uvu test -r esm" + "test": "node test" }, "devDependencies": { "@sveltejs/adapter-node": "workspace:*", "@sveltejs/kit": "workspace:*", "@sveltejs/snowpack-config": "workspace:*", "svelte": "^3.32.1" - } + }, + "type": "module" } diff --git a/test/apps/amp/src/routes/invalid/__tests__.js b/test/apps/amp/src/routes/invalid/__tests__.js index e8c014d0cd52..8b92f55a48ed 100644 --- a/test/apps/amp/src/routes/invalid/__tests__.js +++ b/test/apps/amp/src/routes/invalid/__tests__.js @@ -6,7 +6,7 @@ export default function (test, is_dev) { if (is_dev) { assert.ok(await contains('AMP validation failed')); - assert.ok(await contains('The tag \'img\' may only appear as a descendant of tag \'noscript\'')); + assert.ok(await contains("The tag 'img' may only appear as a descendant of tag 'noscript'")); assert.ok(await contains('<img src="potato.jpg">')); } else { assert.ok(await contains('')); diff --git a/test/apps/amp/test/index.js b/test/apps/amp/test/index.js index 13f85784db93..61ffde938cf6 100644 --- a/test/apps/amp/test/index.js +++ b/test/apps/amp/test/index.js @@ -1,13 +1,24 @@ import path from 'path'; -import glob from 'tiny-glob/sync'; -import { runner } from '../../../runner'; // TODO make this a package? - -runner((test, is_dev) => { - const cwd = path.join(__dirname, '../src/routes'); - const modules = glob('**/__tests__.js', { cwd }); - for (const module of modules) { - require(`../src/routes/${module}`).default(test, is_dev); +import glob from 'tiny-glob/sync.js'; +import { fileURLToPath } from 'url'; +import { runner } from '../../../runner.js'; // TODO make this a package? + +runner( + async () => { + const __filename = fileURLToPath(import.meta.url); + const cwd = path.join(__filename, '../../src/routes'); + const modules = glob('**/__tests__.js', { cwd }); + + const tests = []; + + for (const file of modules) { + const mod = await import(`${cwd}/${file}`); + tests.push(mod.default); + } + + return tests; + }, + { + amp: true } -}, { - amp: true -}); +); diff --git a/test/apps/basics/package.json b/test/apps/basics/package.json index bf279d291a16..24a9ba83a78f 100644 --- a/test/apps/basics/package.json +++ b/test/apps/basics/package.json @@ -1,12 +1,13 @@ { "name": "test-basics", "private": true, + "type": "module", "version": "0.0.2", "scripts": { "dev": "svelte-kit dev", "build": "svelte-kit build", "start": "svelte-kit start", - "test": "uvu test -r esm" + "test": "node test" }, "devDependencies": { "@sveltejs/adapter-node": "workspace:*", diff --git a/test/apps/basics/test/index.js b/test/apps/basics/test/index.js index 7219cf7f907c..6cdc843a255b 100644 --- a/test/apps/basics/test/index.js +++ b/test/apps/basics/test/index.js @@ -1,20 +1,32 @@ import path from 'path'; -import glob from 'tiny-glob/sync'; +import glob from 'tiny-glob/sync.js'; import * as assert from 'uvu/assert'; -import { runner } from '../../../runner'; // TODO make this a package? +import { fileURLToPath } from 'url'; +import { runner } from '../../../runner.js'; // TODO make this a package? -runner((test, is_dev) => { - const cwd = path.join(__dirname, '../src/routes'); - const modules = glob('**/__tests__.js', { cwd }); - for (const module of modules) { - require(`../src/routes/${module}`).default(test, is_dev); - } +runner( + async () => { + const __filename = fileURLToPath(import.meta.url); + const cwd = path.join(__filename, '../../src/routes'); + const modules = glob('**/__tests__.js', { cwd }); + + const tests = []; + + for (const file of modules) { + const mod = await import(`${cwd}/${file}`); + tests.push(mod.default); + } - test('static files', async ({ fetch }) => { - let res = await fetch('/static.json'); - assert.equal(await res.json(), 'static file'); + tests.push(suite => { + suite('static files', async ({ fetch }) => { + let res = await fetch('/static.json'); + assert.equal(await res.json(), 'static file'); - res = await fetch('/subdirectory/static.json'); - assert.equal(await res.json(), 'subdirectory file'); - }); -}); + res = await fetch('/subdirectory/static.json'); + assert.equal(await res.json(), 'subdirectory file'); + }); + }); + + return tests; + } +); diff --git a/test/apps/options/package.json b/test/apps/options/package.json index 93cd85ce40da..6f61e211ca41 100644 --- a/test/apps/options/package.json +++ b/test/apps/options/package.json @@ -1,12 +1,13 @@ { "name": "test-options", "private": true, + "type": "module", "version": "0.0.1", "scripts": { "dev": "svelte-kit dev", "build": "svelte-kit build", "start": "svelte-kit start", - "test": "uvu -r esm" + "test": "node test" }, "devDependencies": { "@sveltejs/adapter-node": "workspace:*", diff --git a/test/apps/options/test/index.js b/test/apps/options/test/index.js index 4c0609f92c77..23a62fedd72c 100644 --- a/test/apps/options/test/index.js +++ b/test/apps/options/test/index.js @@ -1,19 +1,36 @@ import path from 'path'; -import glob from 'tiny-glob/sync'; +import glob from 'tiny-glob/sync.js'; import * as assert from 'uvu/assert'; -import { runner } from '../../../runner'; // TODO make this a package? +import { fileURLToPath } from 'url'; +import { runner } from '../../../runner.js'; // TODO make this a package? -runner((test, is_dev) => { - const cwd = path.join(__dirname, '../source/pages'); - const modules = glob('**/__tests__.js', { cwd }); - for (const module of modules) { - require(`../source/pages/${module}`).default(test, is_dev); - } +runner( + async () => { + const __filename = fileURLToPath(import.meta.url); + const cwd = path.join(__filename, '../../source/pages'); + const modules = glob('**/__tests__.js', { cwd }); + + const tests = []; + + for (const file of modules) { + const mod = await import(`${cwd}/${file}`); + tests.push(mod.default); + } - test('serves /', async ({ visit, contains, js }) => { - await visit('/'); - assert.ok(await contains('I am in the template'), 'Should show custom template contents'); - assert.ok(await contains('We\'re on index.svelte'), 'Should show page contents'); - assert.ok(await contains(`Hello from the ${js ? 'client' : 'server'} in ${is_dev ? 'dev' : 'prod'} mode!`), 'Should run JavaScript'); - }); -}); + tests.push((suite, is_dev) => { + suite('serves /', async ({ visit, contains, js }) => { + await visit('/'); + assert.ok(await contains('I am in the template'), 'Should show custom template contents'); + assert.ok(await contains("We're on index.svelte"), 'Should show page contents'); + assert.ok( + await contains( + `Hello from the ${js ? 'client' : 'server'} in ${is_dev ? 'dev' : 'prod'} mode!` + ), + 'Should run JavaScript' + ); + }); + }); + + return tests; + } +); diff --git a/test/package.json b/test/package.json index deee74c1f8d9..7478b722b25f 100644 --- a/test/package.json +++ b/test/package.json @@ -6,6 +6,8 @@ "@sveltejs/kit": "workspace:*" }, "devDependencies": { - "port-authority": "^1.1.2" - } + "port-authority": "^1.1.2", + "uvu": "^0.6.0-next.1" + }, + "type": "module" } diff --git a/test/runner.js b/test/runner.js index da3e4fca0cfe..1b103c9e49ef 100644 --- a/test/runner.js +++ b/test/runner.js @@ -1,8 +1,7 @@ -import * as uvu from 'uvu'; -import * as ports from 'port-authority'; +import ports from 'port-authority'; import fetch from 'node-fetch'; import { chromium } from 'playwright'; -import { dev, build, start, load_config } from '@sveltejs/kit/dist/api'; +import { dev, build, start, load_config } from '@sveltejs/kit/api'; import * as assert from 'uvu/assert'; async function setup({ port }) { @@ -78,13 +77,24 @@ async function setup({ port }) { pathname: () => page.url().replace(base, ''), keyboard: page.keyboard, sleep: (ms) => new Promise((f) => setTimeout(f, ms)), + reset: () => browser && browser.close(), $: (selector) => page.$(selector) }; } -export function runner(callback, options = {}) { - function run(is_dev, { before, after }) { - const suite = uvu.suite(is_dev ? 'dev' : 'build'); +export async function runner(prepare_tests, options = {}) { + globalThis.UVU_DEFER = 1; + const uvu = await import('uvu'); + + async function run(is_dev, { before, after }) { + const name = is_dev ? 'dev' : 'build'; + + // manually replicate uvu global state + const count = globalThis.UVU_QUEUE.push([name]); + globalThis.UVU_INDEX = count - 1; + + const suite = uvu.suite(name); + const tests = await prepare_tests(); suite.before(before); suite.after(after); @@ -118,35 +128,37 @@ export function runner(callback, options = {}) { test.skip = duplicate(suite.skip); test.only = duplicate(suite.only); - callback(test, is_dev); + tests.forEach((fn) => fn(test, is_dev)); suite.run(); } - const config = load_config(); + const config_promise = load_config(); - run(true, { + await run(true, { async before(context) { const port = await ports.find(3000); + const config = await config_promise; try { context.watcher = await dev({ port, config }); Object.assign(context, await setup({ port })); } catch (e) { - console.log(e.message); + console.log(e.stack); throw e; } }, async after(context) { await context.watcher.close(); - if (context.browser) await context.browser.close(); + await context.reset(); } }); - run(false, { + await run(false, { async before(context) { try { const port = await ports.find(3000); + const config = await config_promise; // TODO implement `svelte start` so we don't need to use an adapter await build(config); @@ -161,7 +173,10 @@ export function runner(callback, options = {}) { }, async after(context) { context.server.close(); - if (context.browser) await context.browser.close(); + await context.reset(); } }); + + await uvu.exec(); + process.exit(process.exitCode || 0); }