Merge branch 'master' into pr/6811

pull/6811/head
Conduitry 5 years ago
commit 69017d6530

@ -1,5 +1,13 @@
# Svelte changelog # Svelte changelog
## 3.44.0
* Add `enableSourcemap` compiler option ([#6835](https://github.com/sveltejs/svelte/pull/6835))
## 3.43.2
* Fix regression where user-specified `import`s were not rewritten according to the `sveltePath` option ([#6834](https://github.com/sveltejs/svelte/issues/6834))
## 3.43.1 ## 3.43.1
* Prevent a rejecting promise used in `{#await}` during SSR from appearing as an unhandled rejection ([#6789](https://github.com/sveltejs/svelte/issues/6789)) * Prevent a rejecting promise used in `{#await}` during SSR from appearing as an unhandled rejection ([#6789](https://github.com/sveltejs/svelte/issues/6789))

9
package-lock.json generated

@ -1,11 +1,12 @@
{ {
"name": "svelte", "name": "svelte",
"version": "3.43.1", "version": "3.44.0",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"version": "3.43.1", "name": "svelte",
"version": "3.44.0",
"license": "MIT", "license": "MIT",
"devDependencies": { "devDependencies": {
"@ampproject/remapping": "^0.3.0", "@ampproject/remapping": "^0.3.0",
@ -16,7 +17,7 @@
"@rollup/plugin-sucrase": "^3.1.0", "@rollup/plugin-sucrase": "^3.1.0",
"@rollup/plugin-typescript": "^2.0.1", "@rollup/plugin-typescript": "^2.0.1",
"@rollup/plugin-virtual": "^2.0.0", "@rollup/plugin-virtual": "^2.0.0",
"@sveltejs/eslint-config": "github:sveltejs/eslint-config#v5.7.0", "@sveltejs/eslint-config": "github:sveltejs/eslint-config#v5.8.0",
"@types/mocha": "^7.0.0", "@types/mocha": "^7.0.0",
"@types/node": "^8.10.53", "@types/node": "^8.10.53",
"@typescript-eslint/eslint-plugin": "^4.31.2", "@typescript-eslint/eslint-plugin": "^4.31.2",
@ -5804,7 +5805,7 @@
"@sveltejs/eslint-config": { "@sveltejs/eslint-config": {
"version": "git+ssh://git@github.com/sveltejs/eslint-config.git#31fd4faeea88990069502460b023698b1c9c2d13", "version": "git+ssh://git@github.com/sveltejs/eslint-config.git#31fd4faeea88990069502460b023698b1c9c2d13",
"dev": true, "dev": true,
"from": "@sveltejs/eslint-config@github:sveltejs/eslint-config#v5.7.0" "from": "@sveltejs/eslint-config@github:sveltejs/eslint-config#v5.8.0"
}, },
"@tootallnate/once": { "@tootallnate/once": {
"version": "1.0.0", "version": "1.0.0",

@ -1,6 +1,6 @@
{ {
"name": "svelte", "name": "svelte",
"version": "3.43.1", "version": "3.44.0",
"description": "Cybernetically enhanced web apps", "description": "Cybernetically enhanced web apps",
"module": "index.mjs", "module": "index.mjs",
"main": "index", "main": "index",
@ -111,7 +111,7 @@
"@rollup/plugin-sucrase": "^3.1.0", "@rollup/plugin-sucrase": "^3.1.0",
"@rollup/plugin-typescript": "^2.0.1", "@rollup/plugin-typescript": "^2.0.1",
"@rollup/plugin-virtual": "^2.0.0", "@rollup/plugin-virtual": "^2.0.0",
"@sveltejs/eslint-config": "github:sveltejs/eslint-config#v5.7.0", "@sveltejs/eslint-config": "github:sveltejs/eslint-config#v5.8.0",
"@types/mocha": "^7.0.0", "@types/mocha": "^7.0.0",
"@types/node": "^8.10.53", "@types/node": "^8.10.53",
"@typescript-eslint/eslint-plugin": "^4.31.2", "@typescript-eslint/eslint-plugin": "^4.31.2",

@ -82,6 +82,8 @@ The following options can be passed to the compiler. None are required:
| `loopGuardTimeout` | 0 | A `number` that tells Svelte to break the loop if it blocks the thread for more than `loopGuardTimeout` ms. This is useful to prevent infinite loops. **Only available when `dev: true`** | `loopGuardTimeout` | 0 | A `number` that tells Svelte to break the loop if it blocks the thread for more than `loopGuardTimeout` ms. This is useful to prevent infinite loops. **Only available when `dev: true`**
| `preserveComments` | `false` | If `true`, your HTML comments will be preserved during server-side rendering. By default, they are stripped out. | `preserveComments` | `false` | If `true`, your HTML comments will be preserved during server-side rendering. By default, they are stripped out.
| `preserveWhitespace` | `false` | If `true`, whitespace inside and between elements is kept as you typed it, rather than removed or collapsed to a single space where possible. | `preserveWhitespace` | `false` | If `true`, whitespace inside and between elements is kept as you typed it, rather than removed or collapsed to a single space where possible.
| `sourcemap` | `object \| string` | An initial sourcemap that will be merged into the final output sourcemap. This is usually the preprocessor sourcemap.
| `enableSourcemap` | `boolean \| { js: boolean; css: boolean; }` | If `true`, Svelte generate sourcemaps for components. Use an object with `js` or `css` for more granular control of sourcemap generation. By default, this is `true`.
| `outputFilename` | `null` | A `string` used for your JavaScript sourcemap. | `outputFilename` | `null` | A `string` used for your JavaScript sourcemap.
| `cssOutputFilename` | `null` | A `string` used for your CSS sourcemap. | `cssOutputFilename` | `null` | A `string` used for your CSS sourcemap.
| `sveltePath` | `"svelte"` | The location of the `svelte` package. Any imports from `svelte` or `svelte/[module]` will be modified accordingly. | `sveltePath` | `"svelte"` | The location of the `svelte` package. Any imports from `svelte` or `svelte/[module]` will be modified accordingly.

@ -30,7 +30,7 @@
</label> </label>
{#if visible} {#if visible}
<p in:typewriter out:typewriter> <p transition:typewriter>
The quick brown fox jumps over the lazy dog The quick brown fox jumps over the lazy dog
</p> </p>
{/if} {/if}

@ -14,3 +14,8 @@
</label> </label>
<p>{a} + {b} = {a + b}</p> <p>{a} + {b} = {a + b}</p>
<style>
label { display: flex }
input, p { margin: 6px }
</style>

@ -14,3 +14,8 @@
</label> </label>
<p>{a} + {b} = {a + b}</p> <p>{a} + {b} = {a + b}</p>
<style>
label { display: flex }
input, p { margin: 6px }
</style>

@ -16,7 +16,7 @@
</label> </label>
{#if visible} {#if visible}
<p in:typewriter> <p transition:typewriter>
The quick brown fox jumps over the lazy dog The quick brown fox jumps over the lazy dog
</p> </p>
{/if} {/if}

@ -30,7 +30,7 @@
</label> </label>
{#if visible} {#if visible}
<p in:typewriter out:typewriter> <p transition:typewriter>
The quick brown fox jumps over the lazy dog The quick brown fox jumps over the lazy dog
</p> </p>
{/if} {/if}

@ -36,6 +36,7 @@ import { clone } from '../utils/clone';
import compiler_warnings from './compiler_warnings'; import compiler_warnings from './compiler_warnings';
import compiler_errors from './compiler_errors'; import compiler_errors from './compiler_errors';
import { extract_ignores_above_position, extract_svelte_ignore_from_comments } from '../utils/extract_svelte_ignore'; import { extract_ignores_above_position, extract_svelte_ignore_from_comments } from '../utils/extract_svelte_ignore';
import check_enable_sourcemap from './utils/check_enable_sourcemap';
interface ComponentOptions { interface ComponentOptions {
namespace?: string; namespace?: string;
@ -343,21 +344,28 @@ export default class Component {
? { code: null, map: null } ? { code: null, map: null }
: result.css; : result.css;
const sourcemap_source_filename = get_sourcemap_source_filename(compile_options); const js_sourcemap_enabled = check_enable_sourcemap(compile_options.enableSourcemap, 'js');
js = print(program, { if (!js_sourcemap_enabled) {
sourceMapSource: sourcemap_source_filename js = print(program);
}); js.map = null;
} else {
const sourcemap_source_filename = get_sourcemap_source_filename(compile_options);
js.map.sources = [ js = print(program, {
sourcemap_source_filename sourceMapSource: sourcemap_source_filename
]; });
js.map.sourcesContent = [ js.map.sources = [
this.source sourcemap_source_filename
]; ];
js.map = apply_preprocessor_sourcemap(sourcemap_source_filename, js.map, compile_options.sourcemap as (string | RawSourceMap | DecodedSourceMap)); js.map.sourcesContent = [
this.source
];
js.map = apply_preprocessor_sourcemap(sourcemap_source_filename, js.map, compile_options.sourcemap as (string | RawSourceMap | DecodedSourceMap));
}
} }
return { return {

@ -93,12 +93,15 @@ function esm(
const internal_globals = get_internal_globals(globals, helpers); const internal_globals = get_internal_globals(globals, helpers);
// edit user imports // edit user imports
imports.forEach(node => { function rewrite_import(node) {
node.source.value = edit_source(node.source.value, sveltePath); const value = edit_source(node.source.value, sveltePath);
}); if (node.source.value !== value) {
exports_from.forEach(node => { node.source.value = value;
node.source!.value = edit_source(node.source!.value, sveltePath); node.source.raw = null;
}); }
}
imports.forEach(rewrite_import);
exports_from.forEach(rewrite_import);
const exports = module_exports.length > 0 && { const exports = module_exports.length > 0 && {
type: 'ExportNamedDeclaration', type: 'ExportNamedDeclaration',

@ -13,6 +13,7 @@ const valid_options = [
'name', 'name',
'filename', 'filename',
'sourcemap', 'sourcemap',
'enableSourcemap',
'generate', 'generate',
'errorMode', 'errorMode',
'varsReport', 'varsReport',
@ -82,7 +83,7 @@ function validate_options(options: CompileOptions, warnings: Warning[]) {
} }
export default function compile(source: string, options: CompileOptions = {}) { export default function compile(source: string, options: CompileOptions = {}) {
options = Object.assign({ generate: 'dom', dev: false }, options); options = Object.assign({ generate: 'dom', dev: false, enableSourcemap: true }, options);
const stats = new Stats(); const stats = new Stats();
const warnings = []; const warnings = [];

@ -10,6 +10,7 @@ import { ImportDeclaration, ClassDeclaration, FunctionExpression, Node, Statemen
import { apply_preprocessor_sourcemap } from '../../utils/mapped_code'; import { apply_preprocessor_sourcemap } from '../../utils/mapped_code';
import { RawSourceMap, DecodedSourceMap } from '@ampproject/remapping/dist/types/types'; import { RawSourceMap, DecodedSourceMap } from '@ampproject/remapping/dist/types/types';
import { flatten } from '../../utils/flatten'; import { flatten } from '../../utils/flatten';
import check_enable_sourcemap from '../utils/check_enable_sourcemap';
export default function dom( export default function dom(
component: Component, component: Component,
@ -34,9 +35,15 @@ export default function dom(
const css = component.stylesheet.render(options.filename, !options.customElement); const css = component.stylesheet.render(options.filename, !options.customElement);
css.map = apply_preprocessor_sourcemap(options.filename, css.map, options.sourcemap as string | RawSourceMap | DecodedSourceMap); const css_sourcemap_enabled = check_enable_sourcemap(options.enableSourcemap, 'css');
const styles = component.stylesheet.has_styles && options.dev if (css_sourcemap_enabled) {
css.map = apply_preprocessor_sourcemap(options.filename, css.map, options.sourcemap as string | RawSourceMap | DecodedSourceMap);
} else {
css.map = null;
}
const styles = css_sourcemap_enabled && component.stylesheet.has_styles && options.dev
? `${css.code}\n/*# sourceMappingURL=${css.map.toUrl()} */` ? `${css.code}\n/*# sourceMappingURL=${css.map.toUrl()} */`
: css.code; : css.code;
@ -521,7 +528,7 @@ export default function dom(
constructor(options) { constructor(options) {
super(); super();
${css.code && b`this.shadowRoot.innerHTML = \`<style>${css.code.replace(/\\/g, '\\\\')}${options.dev ? `\n/*# sourceMappingURL=${css.map.toUrl()} */` : ''}</style>\`;`} ${css.code && b`this.shadowRoot.innerHTML = \`<style>${css.code.replace(/\\/g, '\\\\')}${css_sourcemap_enabled && options.dev ? `\n/*# sourceMappingURL=${css.map.toUrl()} */` : ''}</style>\`;`}
@init(this, { target: this.shadowRoot, props: ${init_props}, customElement: true }, ${definition}, ${has_create_fragment ? 'create_fragment' : 'null'}, ${not_equal}, ${prop_indexes}, null, ${dirty}); @init(this, { target: this.shadowRoot, props: ${init_props}, customElement: true }, ${definition}, ${has_create_fragment ? 'create_fragment' : 'null'}, ${not_equal}, ${prop_indexes}, null, ${dirty});

@ -10,6 +10,7 @@ import { extract_names } from 'periscopic';
import { walk } from 'estree-walker'; import { walk } from 'estree-walker';
import { invalidate } from '../render_dom/invalidate'; import { invalidate } from '../render_dom/invalidate';
import check_enable_sourcemap from '../utils/check_enable_sourcemap';
export default function ssr( export default function ssr(
component: Component, component: Component,
@ -200,11 +201,13 @@ export default function ssr(
main main
].filter(Boolean); ].filter(Boolean);
const css_sourcemap_enabled = check_enable_sourcemap(options.enableSourcemap, 'css');
const js = b` const js = b`
${css.code ? b` ${css.code ? b`
const #css = { const #css = {
code: "${css.code}", code: "${css.code}",
map: ${css.map ? string_literal(css.map.toString()) : 'null'} map: ${css_sourcemap_enabled && css.map ? string_literal(css.map.toString()) : 'null'}
};` : null} };` : null}
${component.extract_javascript(component.ast.module)} ${component.extract_javascript(component.ast.module)}

@ -0,0 +1,10 @@
import { EnableSourcemap } from '../../interfaces';
export default function check_enable_sourcemap(
enable_sourcemap: EnableSourcemap,
namespace: keyof Extract<EnableSourcemap, object>
) {
return typeof enable_sourcemap === 'boolean'
? enable_sourcemap
: enable_sourcemap[namespace];
}

@ -131,6 +131,8 @@ export interface Warning {
export type ModuleFormat = 'esm' | 'cjs'; export type ModuleFormat = 'esm' | 'cjs';
export type EnableSourcemap = boolean | { js: boolean; css: boolean };
export type CssHashGetter = (args: { export type CssHashGetter = (args: {
name: string; name: string;
filename: string | undefined; filename: string | undefined;
@ -147,6 +149,7 @@ export interface CompileOptions {
varsReport?: 'full' | 'strict' | false; varsReport?: 'full' | 'strict' | false;
sourcemap?: object | string; sourcemap?: object | string;
enableSourcemap?: EnableSourcemap;
outputFilename?: string; outputFilename?: string;
cssOutputFilename?: string; cssOutputFilename?: string;
sveltePath?: string; sveltePath?: string;

@ -0,0 +1,5 @@
export default {
options: {
sveltePath: 'a/b/svelte'
}
};

@ -0,0 +1,64 @@
/* generated by Svelte vX.Y.Z */
import {
SvelteComponent,
append,
detach,
element,
init,
insert,
noop,
safe_not_equal,
set_data,
text
} from "a/b/svelte/internal";
import { onMount } from "a/b/svelte";
function create_fragment(ctx) {
let h1;
let t0;
let t1;
let t2;
return {
c() {
h1 = element("h1");
t0 = text("Hello ");
t1 = text(/*name*/ ctx[0]);
t2 = text("!");
},
m(target, anchor) {
insert(target, h1, anchor);
append(h1, t0);
append(h1, t1);
append(h1, t2);
},
p(ctx, [dirty]) {
if (dirty & /*name*/ 1) set_data(t1, /*name*/ ctx[0]);
},
i: noop,
o: noop,
d(detaching) {
if (detaching) detach(h1);
}
};
}
function instance($$self, $$props, $$invalidate) {
let name = '';
onMount(() => {
$$invalidate(0, name = 'world');
});
return [name];
}
class Component extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance, create_fragment, safe_not_equal, {});
}
}
export default Component;

@ -0,0 +1,9 @@
<script>
import { onMount } from 'svelte';
let name = '';
onMount(() => {
name = 'world';
})
</script>
<h1>Hello {name}!</h1>

@ -11,7 +11,7 @@ export default {
<div><span slot="b">hello world</span></div> <div><span slot="b">hello world</span></div>
`, `,
async test({ assert, target, component }) { async test({ assert, component }) {
assert.equal(component.getA(), ''); assert.equal(component.getA(), '');
assert.equal(component.getB(), 'foo'); assert.equal(component.getB(), 'foo');
} }

@ -3,7 +3,7 @@ export default {
html: '<button>10</button>', html: '<button>10</button>',
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const event = new window.MouseEvent('click'); const event = new window.MouseEvent('click');
const button = target.querySelector('button'); const button = target.querySelector('button');

@ -1,7 +1,7 @@
export default { export default {
html: '<input>', html: '<input>',
test({ assert, component, target, window }) { test({ assert, target, window }) {
const input = target.querySelector('input'); const input = target.querySelector('input');
const event = new window.KeyboardEvent('keydown', { const event = new window.KeyboardEvent('keydown', {
key: 'Enter' key: 'Enter'

@ -1,7 +1,7 @@
export default { export default {
html: '<button>???</button>', html: '<button>???</button>',
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const event = new window.MouseEvent('click', { const event = new window.MouseEvent('click', {
clientX: 42, clientX: 42,
clientY: 42 clientY: 42

@ -3,7 +3,7 @@ export default {
<button>action</button> <button>action</button>
`, `,
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const button = target.querySelector('button'); const button = target.querySelector('button');
const eventEnter = new window.MouseEvent('mouseenter'); const eventEnter = new window.MouseEvent('mouseenter');
const eventLeave = new window.MouseEvent('mouseleave'); const eventLeave = new window.MouseEvent('mouseleave');

@ -2,7 +2,7 @@ export default {
html: ` html: `
<button>action</button> <button>action</button>
`, `,
async test({ assert, target, window }) { async test({ assert, target }) {
assert.equal(target.querySelector('button').foo, 'bar1337'); assert.equal(target.querySelector('button').foo, 'bar1337');
} }
}; };

@ -2,7 +2,7 @@ export default {
html: ` html: `
<button>action</button> <button>action</button>
`, `,
async test({ assert, target, window }) { async test({ assert, target }) {
assert.equal(target.querySelector('button').foo, 'bar1337'); assert.equal(target.querySelector('button').foo, 'bar1337');
} }
}; };

@ -2,7 +2,7 @@ const result = {};
export default { export default {
props: { result }, props: { result },
async test({ assert, component, target, window }) { async test({ assert }) {
assert.notEqual(result.parentElement, null); assert.notEqual(result.parentElement, null);
} }
}; };

@ -8,7 +8,7 @@ export default {
<h1></h1> <h1></h1>
`, `,
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const header = target.querySelector('h1'); const header = target.querySelector('h1');
const click = new window.MouseEvent('click'); const click = new window.MouseEvent('click');

@ -1,5 +1,5 @@
export default { export default {
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const button = target.querySelector('button'); const button = target.querySelector('button');
const click = new window.MouseEvent('click'); const click = new window.MouseEvent('click');

@ -17,7 +17,7 @@ export default {
<div>e</div> <div>e</div>
`, `,
test({ assert, component, target, window, raf }) { test({ assert, component, window, raf }) {
let divs = window.document.querySelectorAll('div'); let divs = window.document.querySelectorAll('div');
divs.forEach(div => { divs.forEach(div => {
div.getBoundingClientRect = function() { div.getBoundingClientRect = function() {

@ -17,7 +17,7 @@ export default {
<div>e</div> <div>e</div>
`, `,
test({ assert, component, target, window, raf }) { test({ assert, component, raf }) {
let divs = document.querySelectorAll('div'); let divs = document.querySelectorAll('div');
divs.forEach(div => { divs.forEach(div => {
div.getBoundingClientRect = function() { div.getBoundingClientRect = function() {

@ -17,7 +17,7 @@ export default {
<div>e</div> <div>e</div>
`, `,
test({ assert, component, target, window, raf }) { test({ assert, component, raf }) {
let divs = document.querySelectorAll('div'); let divs = document.querySelectorAll('div');
divs.forEach(div => { divs.forEach(div => {
div.getBoundingClientRect = function() { div.getBoundingClientRect = function() {

@ -4,7 +4,7 @@ export default {
value value
}, },
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const inputs = target.querySelectorAll('input'); const inputs = target.querySelectorAll('input');
const event = new window.Event('input'); const event = new window.Event('input');

@ -13,7 +13,7 @@ export default {
<p></p> <p></p>
`, `,
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const input = target.querySelector('input'); const input = target.querySelector('input');
const event = new window.Event('input'); const event = new window.Event('input');

@ -1,6 +1,6 @@
export default { export default {
html: '<textarea></textarea>', html: '<textarea></textarea>',
test({ assert, component, target }) { test({ assert, target }) {
const textarea = target.querySelector('textarea'); const textarea = target.querySelector('textarea');
assert.ok(textarea.readOnly === false); assert.ok(textarea.readOnly === false);
} }

@ -1,6 +1,6 @@
export default { export default {
html: '<textarea readonly></textarea>', html: '<textarea readonly></textarea>',
test({ assert, component, target }) { test({ assert, target }) {
const textarea = target.querySelector('textarea'); const textarea = target.querySelector('textarea');
assert.ok(textarea.readOnly); assert.ok(textarea.readOnly);
} }

@ -7,7 +7,7 @@ export default {
</svg> </svg>
`, `,
test({ assert, component, target }) { test({ assert, target }) {
const use = target.querySelector( 'use' ); const use = target.querySelector( 'use' );
assert.equal( use.getAttributeNS( 'http://www.w3.org/1999/xlink', 'href' ), '#bar' ); assert.equal( use.getAttributeNS( 'http://www.w3.org/1999/xlink', 'href' ), '#bar' );
} }

@ -1,6 +1,6 @@
export default { export default {
html: '<textarea readonly=""></textarea>', html: '<textarea readonly=""></textarea>',
test({ assert, component, target }) { test({ assert, target }) {
const textarea = target.querySelector( 'textarea' ); const textarea = target.querySelector( 'textarea' );
assert.ok( textarea.readOnly ); assert.ok( textarea.readOnly );
} }

@ -5,7 +5,7 @@ export default {
<p>loading...</p> <p>loading...</p>
`, `,
test({ assert, component, target }) { test({ assert, target }) {
return sleep(50).then(() => { return sleep(50).then(() => {
assert.htmlEqual(target.innerHTML, ` assert.htmlEqual(target.innerHTML, `
<p>the answer is 42</p> <p>the answer is 42</p>

@ -18,7 +18,7 @@ export default {
<p>a title: loading...</p> <p>a title: loading...</p>
`, `,
test({ assert, component, target }) { test({ assert, target }) {
fulfil(42); fulfil(42);
return thePromise return thePromise

@ -13,7 +13,7 @@ export default {
<p>loading...</p><p>true!</p> <p>loading...</p><p>true!</p>
`, `,
test({ assert, component, target }) { test({ assert, target }) {
fulfil(42); fulfil(42);
return thePromise return thePromise

@ -22,7 +22,7 @@ export default {
<p>loaded</p> <p>loaded</p>
`); `);
promise = new Promise((f, r) => { promise = new Promise((f, _) => {
fulfil = f; fulfil = f;
}); });

@ -1,6 +1,6 @@
export default { export default {
props: { props: {
thePromise: new Promise(resolve => {}) thePromise: new Promise(_ => {})
}, },
html: ` html: `

@ -1,5 +1,5 @@
export default { export default {
async test({ assert, component, target }) { async test({ assert, target }) {
await Promise.resolve(); await Promise.resolve();
assert.htmlEqual( assert.htmlEqual(

@ -1,6 +1,6 @@
export default { export default {
props: { props: {
thePromise: new Promise(resolve => {}) thePromise: new Promise(_ => {})
}, },
html: ` html: `

@ -1,5 +1,5 @@
export default { export default {
async test({ assert, component, target }) { async test({ assert, target }) {
await Promise.resolve(); await Promise.resolve();
assert.htmlEqual( assert.htmlEqual(

@ -13,7 +13,7 @@ export default {
loading... loading...
`, `,
async test({ assert, component, target }) { async test({ assert, target }) {
fulfil([]); fulfil([]);
await thePromise; await thePromise;

@ -17,7 +17,7 @@ export default {
<input type='checkbox' value='d'>d<br> <input type='checkbox' value='d'>d<br>
`, `,
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const inputs = target.querySelectorAll('input'); const inputs = target.querySelectorAll('input');
const p = target.querySelector('p'); const p = target.querySelector('p');

@ -13,7 +13,7 @@ export default {
<label><input type="checkbox" value="z"> z</label> <label><input type="checkbox" value="z"> z</label>
<p></p> <p></p>
`, `,
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const inputs = target.querySelectorAll('input'); const inputs = target.querySelectorAll('input');
assert.equal(inputs[0].checked, false); assert.equal(inputs[0].checked, false);
assert.equal(inputs[1].checked, false); assert.equal(inputs[1].checked, false);

@ -20,7 +20,7 @@ export default {
<input type="checkbox" value="c" data-index="z-2"> <input type="checkbox" value="c" data-index="z-2">
`, `,
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const inputs = target.querySelectorAll('input'); const inputs = target.querySelectorAll('input');
const checked = new Set(); const checked = new Set();
const checkInbox = async (i) => { const checkInbox = async (i) => {

@ -7,7 +7,7 @@ export default {
<input> <input>
`, `,
async test({ assert, component, target, window }) { async test({ assert, component, target }) {
const input = target.querySelector('input'); const input = target.querySelector('input');
assert.equal(input.value, ''); assert.equal(input.value, '');

@ -15,7 +15,7 @@ export default {
selected: 'b' selected: 'b'
}, },
test({ assert, component, target }) { test({ assert, target }) {
const select = target.querySelector('select'); const select = target.querySelector('select');
const options = [...target.querySelectorAll('option')]; const options = [...target.querySelectorAll('option')];

@ -6,7 +6,7 @@ export default {
<button></button> <button></button>
`, `,
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const button = target.querySelector('button'); const button = target.querySelector('button');
await button.dispatchEvent(new window.MouseEvent('click')); await button.dispatchEvent(new window.MouseEvent('click'));

@ -7,7 +7,7 @@ export default {
<button>Toggle outside</button> <button>Toggle outside</button>
`, `,
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const button = target.querySelectorAll('button')[1]; const button = target.querySelectorAll('button')[1];
const div = target.querySelector('div'); const div = target.querySelector('div');
await div.dispatchEvent(new window.MouseEvent('click')); await div.dispatchEvent(new window.MouseEvent('click'));

@ -7,7 +7,7 @@ export default {
html: '<div class="one two foo bar"></div>', html: '<div class="one two foo bar"></div>',
test({ assert, component, target, window }) { test({ assert, component, target }) {
component.foo = false; component.foo = false;
assert.htmlEqual(target.innerHTML, ` assert.htmlEqual(target.innerHTML, `

@ -6,7 +6,7 @@ export default {
html: '<div class="foo bar"></div>', html: '<div class="foo bar"></div>',
test({ assert, component, target, window }) { test({ assert, component, target }) {
component.foo = false; component.foo = false;
assert.htmlEqual(target.innerHTML, ` assert.htmlEqual(target.innerHTML, `

@ -8,7 +8,7 @@ export default {
html: '<div class="one two three" role="button"></div>', html: '<div class="one two three" role="button"></div>',
test({ assert, component, target, window }) { test({ assert, component, target }) {
component.myClass = 'one'; component.myClass = 'one';
component.attributes = { component.attributes = {
'aria-label': 'Test' 'aria-label': 'Test'

@ -5,7 +5,7 @@ export default {
html: '<div class="one two three"></div>', html: '<div class="one two three"></div>',
test({ assert, component, target, window }) { test({ assert, component, target }) {
component.myClass = 'one'; component.myClass = 'one';
assert.htmlEqual(target.innerHTML, ` assert.htmlEqual(target.innerHTML, `

@ -5,7 +5,7 @@ export default {
html: '<div class="test-class primary" role="button"></div>', html: '<div class="test-class primary" role="button"></div>',
test({ assert, component, target, window }) { test({ assert, component, target }) {
component.primary = true; component.primary = true;
assert.htmlEqual( assert.htmlEqual(

@ -8,7 +8,7 @@ export default {
html: '<div class="one two" role="button"></div>', html: '<div class="one two" role="button"></div>',
test({ assert, component, target, window }) { test({ assert, component, target }) {
component.myClass = 'one'; component.myClass = 'one';
component.attributes = { component.attributes = {
'aria-label': 'Test' 'aria-label': 'Test'

@ -1,5 +1,5 @@
export default { export default {
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const [input1, input2] = target.querySelectorAll('input'); const [input1, input2] = target.querySelectorAll('input');
assert.equal(input1.value, 'something'); assert.equal(input1.value, 'something');
assert.equal(input2.value, 'something'); assert.equal(input2.value, 'something');

@ -14,7 +14,7 @@ export default {
</ol> </ol>
`, `,
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const input = target.querySelector('input'); const input = target.querySelector('input');
input.value = 4; input.value = 4;

@ -4,7 +4,7 @@ export default {
<p>x in parent: yes</p> <p>x in parent: yes</p>
`, `,
async test({ assert, component, target, window }) { async test({ assert, component, target }) {
component.a = false; component.a = false;
assert.htmlEqual(target.innerHTML, ` assert.htmlEqual(target.innerHTML, `

@ -4,7 +4,7 @@ export default {
<p>x in parent: yes</p> <p>x in parent: yes</p>
`, `,
async test({ assert, component, target, window }) { async test({ assert, component, target }) {
component.a = false; component.a = false;
assert.htmlEqual(target.innerHTML, ` assert.htmlEqual(target.innerHTML, `

@ -4,7 +4,7 @@ export default {
<p>x in parent: undefined</p> <p>x in parent: undefined</p>
`, `,
async test({ assert, component, target, window }) { async test({ assert, component, target }) {
component.a = false; component.a = false;
assert.htmlEqual(target.innerHTML, ` assert.htmlEqual(target.innerHTML, `

@ -4,7 +4,7 @@ export default {
<button>button 0</button> <button>button 0</button>
`, `,
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const event = new window.MouseEvent('click'); const event = new window.MouseEvent('click');
const buttons = target.querySelectorAll('button'); const buttons = target.querySelectorAll('button');

@ -3,7 +3,7 @@ export default {
<div contenteditable=""></div> <div contenteditable=""></div>
`, `,
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const div = target.querySelector('div'); const div = target.querySelector('div');
const text = window.document.createTextNode('a'); const text = window.document.createTextNode('a');
div.insertBefore(text, null); div.insertBefore(text, null);

@ -1,7 +1,7 @@
export default { export default {
html: '<button>click me</button>', html: '<button>click me</button>',
test({ assert, component, target }) { test({ assert, target }) {
const button = target.querySelector('button'); const button = target.querySelector('button');
const messages = []; const messages = [];

@ -1,5 +1,5 @@
export default { export default {
test({ assert, component }) { test({ component }) {
component.l1.$destroy(); component.l1.$destroy();
} }
}; };

@ -3,7 +3,7 @@ export default {
values: [1, 2, 3, 4] values: [1, 2, 3, 4]
}, },
test({ assert, component }) { test({ component }) {
component.values = [2, 3]; component.values = [2, 3];
} }
}; };

@ -4,7 +4,7 @@ export default {
<button slot="footer">Button</button> <button slot="footer">Button</button>
<button slot="footer">Button</button> <button slot="footer">Button</button>
`, `,
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const [btn, btn1, btn2] = target.querySelectorAll('button'); const [btn, btn1, btn2] = target.querySelectorAll('button');
await btn.dispatchEvent(new window.MouseEvent('click')); await btn.dispatchEvent(new window.MouseEvent('click'));

@ -3,7 +3,7 @@ export default {
<p>override default slot</p> <p>override default slot</p>
`, `,
test({ assert, component }) { test({ component }) {
component.nested.foo = 'b'; component.nested.foo = 'b';
} }
}; };

@ -13,7 +13,7 @@ export default {
<button>Increment</button> <button>Increment</button>
</div> </div>
`, `,
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const [button1, button2, button3] = target.querySelectorAll('button'); const [button1, button2, button3] = target.querySelectorAll('button');
const event = new window.MouseEvent('click'); const event = new window.MouseEvent('click');

@ -2,7 +2,7 @@ export default {
html: ` html: `
<input> <input>
`, `,
async test({ assert, target, snapshot, component, window }) { async test({ assert, target, window }) {
const input = target.querySelector('input'); const input = target.querySelector('input');
input.value = 'a'; input.value = 'a';

@ -13,7 +13,7 @@ export default {
<button>Increment</button> <button>Increment</button>
</div> </div>
`, `,
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const [button1, button2, button3] = target.querySelectorAll('button'); const [button1, button2, button3] = target.querySelectorAll('button');
const event = new window.MouseEvent('click'); const event = new window.MouseEvent('click');

@ -12,7 +12,7 @@ export default {
</div> </div>
`, `,
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const button = target.querySelector('button'); const button = target.querySelector('button');
const click = new window.MouseEvent('click'); const click = new window.MouseEvent('click');

@ -1,6 +1,6 @@
// JSDOM makes this test pass when it should fail. weird // JSDOM makes this test pass when it should fail. weird
export default { export default {
test({ assert, component, target, window }) { test({ assert, target, window }) {
const p = target.querySelector( 'p' ); const p = target.querySelector( 'p' );
assert.equal( window.getComputedStyle( p ).color, 'red' ); assert.equal( window.getComputedStyle( p ).color, 'red' );
} }

@ -3,7 +3,7 @@ export default {
css: false css: false
}, },
test({ assert, component, target, window }) { test({ assert, target, window }) {
const [ control, test ] = target.querySelectorAll( 'p' ); const [ control, test ] = target.querySelectorAll( 'p' );
assert.equal( window.getComputedStyle( control ).color, '' ); assert.equal( window.getComputedStyle( control ).color, '' );

@ -1,5 +1,5 @@
export default { export default {
test({ assert, component, target, window }) { test({ assert, target, window }) {
const [ control, test ] = target.querySelectorAll( 'p' ); const [ control, test ] = target.querySelectorAll( 'p' );
assert.equal( window.getComputedStyle( control ).color, '' ); assert.equal( window.getComputedStyle( control ).color, '' );

@ -1,5 +1,5 @@
export default { export default {
test({ assert, component, target, window }) { test({ assert, target, window }) {
const [control, test] = target.querySelectorAll('p'); const [control, test] = target.querySelectorAll('p');
assert.equal(window.getComputedStyle(control).color, ''); assert.equal(window.getComputedStyle(control).color, '');

@ -1,5 +1,5 @@
export default { export default {
test({ assert, component }) { test({ component }) {
component.$destroy(); component.$destroy();
component.$destroy(); component.$destroy();
} }

@ -3,7 +3,7 @@ export default {
x: true x: true
}, },
test({ assert, component }) { test({ component }) {
component.x = false; component.x = false;
} }
}; };

@ -1,5 +1,5 @@
export default { export default {
test({ assert, component, raf }) { test({ assert, component }) {
assert.equal(component.count, 0); assert.equal(component.count, 0);
component.arr = ['2']; component.arr = ['2'];

@ -5,7 +5,7 @@ export default {
<ul></ul> <ul></ul>
`, `,
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const button = target.querySelector('button'); const button = target.querySelector('button');
const event = new window.MouseEvent('click'); const event = new window.MouseEvent('click');

@ -3,7 +3,7 @@ export default {
<span class="content">foo</span> <span class="content">foo</span>
<button>Test</button> <button>Test</button>
`, `,
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const button = target.querySelector('button'); const button = target.querySelector('button');
const clickEvent = new window.MouseEvent('click'); const clickEvent = new window.MouseEvent('click');

@ -8,7 +8,7 @@ export default {
<span class="content">3</span> <span class="content">3</span>
<button>Test</button> <button>Test</button>
`, `,
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
let [incrementBtn, ...buttons] = target.querySelectorAll('button'); let [incrementBtn, ...buttons] = target.querySelectorAll('button');
const clickEvent = new window.MouseEvent('click'); const clickEvent = new window.MouseEvent('click');

@ -29,7 +29,7 @@ export default {
] ]
}, },
html: '<p>animals: aardvark</p><p>animals: buffalo</p><p>animals: chinchilla</p><!----><p>countries: albania</p><p>countries: brazil</p><p>countries: china</p><!----><p>people: alice</p><p>people: bob</p><p>people: carol</p><p>people: dave</p><!----><!---->', html: '<p>animals: aardvark</p><p>animals: buffalo</p><p>animals: chinchilla</p><!----><p>countries: albania</p><p>countries: brazil</p><p>countries: china</p><!----><p>people: alice</p><p>people: bob</p><p>people: carol</p><p>people: dave</p><!----><!---->',
test({ assert, component, target }) { test() {
// TODO // TODO
} }
}; };

@ -6,7 +6,6 @@ export default {
html: '<div>a, 1</div><div>a, 2</div><div>a, 3</div><!----><div>b, 1</div><div>b, 2</div><div>b, 3</div><!----><div>c, 1</div><div>c, 2</div><div>c, 3</div><!----><!---->', html: '<div>a, 1</div><div>a, 2</div><div>a, 3</div><!----><div>b, 1</div><div>b, 2</div><div>b, 3</div><!----><div>c, 1</div><div>c, 2</div><div>c, 3</div><!----><!---->',
test({ assert, component, target }) { // TODO
// TODO test() {}
}
}; };

@ -5,7 +5,7 @@ export default {
dev: true dev: true
}, },
test({ assert, component, target }) { test({ assert, target }) {
const h1 = target.querySelector('h1'); const h1 = target.querySelector('h1');
const p = target.querySelector('p'); const p = target.querySelector('p');

@ -7,7 +7,7 @@ export default {
<button>click me</button> <button>click me</button>
`, `,
test({ assert, component, target, window }) { test({ assert, target, window }) {
const button = target.querySelector('button'); const button = target.querySelector('button');
const event = new window.MouseEvent('click'); const event = new window.MouseEvent('click');

@ -3,7 +3,7 @@ export default {
<button>clicked: false</button> <button>clicked: false</button>
`, `,
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const button = target.querySelector('button'); const button = target.querySelector('button');
const event = new window.MouseEvent('click'); const event = new window.MouseEvent('click');

@ -3,7 +3,7 @@ export default {
<button>Click Me</button> <button>Click Me</button>
Hello World Hello World
`, `,
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const button = target.querySelector('button'); const button = target.querySelector('button');
const event = new window.MouseEvent('click'); const event = new window.MouseEvent('click');

@ -1,7 +1,7 @@
export default { export default {
html: '<button>bar</button>', html: '<button>bar</button>',
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const [button] = target.querySelectorAll( const [button] = target.querySelectorAll(
'button' 'button'
); );

@ -8,7 +8,7 @@ export default {
<button>click</button> <button>click</button>
`, `,
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const [updateButton1, updateButton2, button] = target.querySelectorAll( const [updateButton1, updateButton2, button] = target.querySelectorAll(
'button' 'button'
); );

@ -3,7 +3,7 @@ export default {
<button>null</button> <button>null</button>
<button>invalid</button>`, <button>invalid</button>`,
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const [buttonUndef, buttonNull, buttonInvalid] = target.querySelectorAll( const [buttonUndef, buttonNull, buttonInvalid] = target.querySelectorAll(
'button' 'button'
); );

@ -8,7 +8,7 @@ export default {
<button>click</button> <button>click</button>
`, `,
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const [updateButton1, updateButton2, button] = target.querySelectorAll( const [updateButton1, updateButton2, button] = target.querySelectorAll(
'button' 'button'
); );

@ -15,7 +15,7 @@ export default {
<p>selected: foo</p> <p>selected: foo</p>
`, `,
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const buttons = target.querySelectorAll('button'); const buttons = target.querySelectorAll('button');
const event = new window.MouseEvent('click'); const event = new window.MouseEvent('click');

@ -3,7 +3,7 @@ export default {
<div>toggle</div> <div>toggle</div>
`, `,
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const div = target.querySelector('div'); const div = target.querySelector('div');
const event = new window.MouseEvent('some-event'); const event = new window.MouseEvent('some-event');

@ -1,5 +1,5 @@
export default { export default {
test({ assert, component, target, window }) { test({ assert, target, window }) {
// Click events don't focus elements in JSDOM obviously they would // Click events don't focus elements in JSDOM obviously they would
// in real browsers. More realistically, you'd use this for e.g. // in real browsers. More realistically, you'd use this for e.g.
// this.select(), but that's harder to test than this.focus() // this.select(), but that's harder to test than this.focus()

@ -3,7 +3,7 @@ export default {
<button>toggle</button> <button>toggle</button>
`, `,
async test({ assert, component, target, window }) { async test({ assert, target, window }) {
const button = target.querySelector('button'); const button = target.querySelector('button');
const event = new window.MouseEvent('click'); const event = new window.MouseEvent('click');

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save