diff --git a/src/compiler/compile/Component.ts b/src/compiler/compile/Component.ts index 89c1e6b4f6..2ad2e2e428 100644 --- a/src/compiler/compile/Component.ts +++ b/src/compiler/compile/Component.ts @@ -101,7 +101,7 @@ export default class Component { reactive_declaration_nodes: Set = new Set(); has_reactive_assignments = false; injected_reactive_declaration_vars: Set = new Set(); - helpers: Set = new Set(); + helpers: Map = new Map(); indirect_dependencies: Map> = new Map(); @@ -233,8 +233,9 @@ export default class Component { } helper(name: string) { - this.helpers.add(name); - return this.alias(name); + const alias = this.alias(name) + this.helpers.set(name, alias); + return alias; } generate(result: string) { @@ -251,23 +252,21 @@ export default class Component { .replace(/__svelte:self__/g, this.name) .replace(compile_options.generate === 'ssr' ? /(@+|#+)(\w*(?:-\w*)?)/g : /(@+)(\w*(?:-\w*)?)/g, (_match: string, sigil: string, name: string) => { if (sigil === '@') { - if (internal_exports.has(name)) { - if (compile_options.dev && internal_exports.has(`${name}Dev`)) name = `${name}Dev`; - this.helpers.add(name); + if (!internal_exports.has(name)) { + throw new Error(`compiler error: this shouldn't happen! generated code is trying to use inexistent internal '${name}'`); + } + + if (compile_options.dev && internal_exports.has(`${name}Dev`)) { + name = `${name}Dev`; } - return this.alias(name); + return this.helper(name); } return sigil.slice(1) + name; }); - const imported_helpers = Array.from(this.helpers) - .sort() - .map(name => { - const alias = this.alias(name); - return { name, alias }; - }); + const imported_helpers = Array.from(this.helpers, ([name, alias]) => ({ name, alias })); const module = create_module( result, diff --git a/src/compiler/compile/render-dom/Block.ts b/src/compiler/compile/render-dom/Block.ts index 0c585c5bf0..15e079ceb9 100644 --- a/src/compiler/compile/render-dom/Block.ts +++ b/src/compiler/compile/render-dom/Block.ts @@ -164,7 +164,7 @@ export default class Block { if (parent_node) { this.builders.mount.add_line(`@append(${parent_node}, ${name});`); - if (parent_node === 'document.head' && !no_detach) this.builders.destroy.add_line(`@detach(${name});`); + if (parent_node === '@document.head' && !no_detach) this.builders.destroy.add_line(`@detach(${name});`); } else { this.builders.mount.add_line(`@insert(#target, ${name}, anchor);`); if (!no_detach) this.builders.destroy.add_conditional('detaching', `@detach(${name});`); diff --git a/src/compiler/compile/render-dom/index.ts b/src/compiler/compile/render-dom/index.ts index a9941b838f..1ba53e7691 100644 --- a/src/compiler/compile/render-dom/index.ts +++ b/src/compiler/compile/render-dom/index.ts @@ -36,13 +36,15 @@ export default function dom( `${css.code}\n/*# sourceMappingURL=${css.map.toUrl()} */` : css.code, { only_escape_at_symbol: true }); + const add_css = component.get_unique_name('add_css'); + if (styles && component.compile_options.css !== false && !options.customElement) { builder.add_block(deindent` - function @add_css() { + function ${add_css}() { var style = @element("style"); style.id = '${component.stylesheet.id}-style'; style.textContent = ${styles}; - @append(document.head, style); + @append(@document.head, style); } `); } @@ -481,7 +483,7 @@ export default function dom( if (component.tag != null) { builder.add_block(deindent` - customElements.define("${component.tag}", ${name}); + @customElements.define("${component.tag}", ${name}); `); } } else { @@ -491,7 +493,7 @@ export default function dom( class ${name} extends @${superclass} { constructor(options) { super(${options.dev && `options`}); - ${should_add_css && `if (!document.getElementById("${component.stylesheet.id}-style")) @add_css();`} + ${should_add_css && `if (!@document.getElementById("${component.stylesheet.id}-style")) ${add_css}();`} @init(this, options, ${definition}, create_fragment, ${not_equal}, ${prop_names}); ${dev_props_check} diff --git a/src/compiler/compile/render-dom/wrappers/Body.ts b/src/compiler/compile/render-dom/wrappers/Body.ts index 04e677a090..feb28ef8f6 100644 --- a/src/compiler/compile/render-dom/wrappers/Body.ts +++ b/src/compiler/compile/render-dom/wrappers/Body.ts @@ -11,11 +11,11 @@ export default class BodyWrapper extends Wrapper { const snippet = handler.render(block); block.builders.init.add_block(deindent` - document.body.addEventListener("${handler.name}", ${snippet}); + @document.body.addEventListener("${handler.name}", ${snippet}); `); block.builders.destroy.add_block(deindent` - document.body.removeEventListener("${handler.name}", ${snippet}); + @document.body.removeEventListener("${handler.name}", ${snippet}); `); }); } diff --git a/src/compiler/compile/render-dom/wrappers/DebugTag.ts b/src/compiler/compile/render-dom/wrappers/DebugTag.ts index 713113921d..a600e26297 100644 --- a/src/compiler/compile/render-dom/wrappers/DebugTag.ts +++ b/src/compiler/compile/render-dom/wrappers/DebugTag.ts @@ -62,7 +62,7 @@ export default class DebugTagWrapper extends Wrapper { block.builders.update.add_block(deindent` if (${condition}) { const { ${ctx_identifiers} } = ctx; - console.${log}({ ${logged_identifiers} }); + @console.${log}({ ${logged_identifiers} }); debugger; } `); @@ -70,7 +70,7 @@ export default class DebugTagWrapper extends Wrapper { block.builders.create.add_block(deindent` { const { ${ctx_identifiers} } = ctx; - console.${log}({ ${logged_identifiers} }); + @console.${log}({ ${logged_identifiers} }); debugger; } `); diff --git a/src/compiler/compile/render-dom/wrappers/Element/Binding.ts b/src/compiler/compile/render-dom/wrappers/Element/Binding.ts index 15ceabb356..dd31278774 100644 --- a/src/compiler/compile/render-dom/wrappers/Element/Binding.ts +++ b/src/compiler/compile/render-dom/wrappers/Element/Binding.ts @@ -136,7 +136,7 @@ export default class BindingWrapper { case 'currentTime': case 'playbackRate': case 'volume': - update_conditions.push(`!isNaN(${this.snippet})`); + update_conditions.push(`!@isNaN(${this.snippet})`); break; case 'paused': diff --git a/src/compiler/compile/render-dom/wrappers/Element/index.ts b/src/compiler/compile/render-dom/wrappers/Element/index.ts index 2f7452e8c6..3602ad301d 100644 --- a/src/compiler/compile/render-dom/wrappers/Element/index.ts +++ b/src/compiler/compile/render-dom/wrappers/Element/index.ts @@ -270,7 +270,7 @@ export default class ElementWrapper extends Wrapper { `@append(${parent_node}, ${node});` ); - if (parent_node === 'document.head') { + if (parent_node === '@document.head') { block.builders.destroy.add_line(`@detach(${node});`); } } else { @@ -379,7 +379,7 @@ export default class ElementWrapper extends Wrapper { } if (namespace) { - return `document.createElementNS("${namespace}", "${name}")`; + return `@document.createElementNS("${namespace}", "${name}")`; } return `@element("${name}")`; @@ -465,7 +465,7 @@ export default class ElementWrapper extends Wrapper { block.builders.init.add_block(deindent` function ${handler}() { ${animation_frame && deindent` - cancelAnimationFrame(${animation_frame}); + @cancelAnimationFrame(${animation_frame}); if (!${this.var}.paused) ${animation_frame} = @raf(${handler});`} ${needs_lock && `${lock} = true;`} ctx.${handler}.call(${this.var}${contextual_dependencies.size > 0 ? ', ctx' : ''}); diff --git a/src/compiler/compile/render-dom/wrappers/Head.ts b/src/compiler/compile/render-dom/wrappers/Head.ts index d942a69dc2..794506f1be 100644 --- a/src/compiler/compile/render-dom/wrappers/Head.ts +++ b/src/compiler/compile/render-dom/wrappers/Head.ts @@ -30,6 +30,6 @@ export default class HeadWrapper extends Wrapper { } render(block: Block, _parent_node: string, _parent_nodes: string) { - this.fragment.render(block, 'document.head', 'nodes'); + this.fragment.render(block, '@document.head', 'nodes'); } } diff --git a/src/compiler/compile/render-dom/wrappers/IfBlock.ts b/src/compiler/compile/render-dom/wrappers/IfBlock.ts index 46f17653a1..3634091b99 100644 --- a/src/compiler/compile/render-dom/wrappers/IfBlock.ts +++ b/src/compiler/compile/render-dom/wrappers/IfBlock.ts @@ -154,7 +154,7 @@ export default class IfBlockWrapper extends Wrapper { const vars = { name, anchor, if_name, has_else, has_transitions }; - const detaching = (parent_node && parent_node !== 'document.head') ? '' : 'detaching'; + const detaching = (parent_node && parent_node !== '@document.head') ? '' : 'detaching'; if (this.node.else) { if (has_outros) { diff --git a/src/compiler/compile/render-dom/wrappers/RawMustacheTag.ts b/src/compiler/compile/render-dom/wrappers/RawMustacheTag.ts index 15a7d41861..3f09b134f8 100644 --- a/src/compiler/compile/render-dom/wrappers/RawMustacheTag.ts +++ b/src/compiler/compile/render-dom/wrappers/RawMustacheTag.ts @@ -22,7 +22,7 @@ export default class RawMustacheTagWrapper extends Tag { render(block: Block, parent_node: string, parent_nodes: string) { const name = this.var; - const in_head = parent_node === 'document.head'; + const in_head = parent_node === '@document.head'; const needs_anchors = !parent_node || in_head; // if in head always needs anchors diff --git a/src/compiler/compile/render-dom/wrappers/Title.ts b/src/compiler/compile/render-dom/wrappers/Title.ts index 456a833a8f..c7f702916c 100644 --- a/src/compiler/compile/render-dom/wrappers/Title.ts +++ b/src/compiler/compile/render-dom/wrappers/Title.ts @@ -68,9 +68,9 @@ export default class TitleWrapper extends Wrapper { const init = this.node.should_cache ? `${last} = ${value}` : value; block.builders.init.add_line( - `document.title = ${init};` + `@document.title = ${init};` ); - const updater = `document.title = ${this.node.should_cache ? last : value};`; + const updater = `@document.title = ${this.node.should_cache ? last : value};`; if (all_dependencies.size) { const dependencies = Array.from(all_dependencies); @@ -95,7 +95,7 @@ export default class TitleWrapper extends Wrapper { ? stringify((this.node.children[0] as Text).data) : '""'; - block.builders.hydrate.add_line(`document.title = ${value};`); + block.builders.hydrate.add_line(`@document.title = ${value};`); } } } diff --git a/src/compiler/compile/render-dom/wrappers/Window.ts b/src/compiler/compile/render-dom/wrappers/Window.ts index 585864664a..c267b806c9 100644 --- a/src/compiler/compile/render-dom/wrappers/Window.ts +++ b/src/compiler/compile/render-dom/wrappers/Window.ts @@ -44,8 +44,8 @@ export default class WindowWrapper extends Wrapper { const events = {}; const bindings: Record = {}; - add_actions(component, block, 'window', this.node.actions); - add_event_handlers(block, 'window', this.node.handlers); + add_actions(component, block, '@window', this.node.actions); + add_event_handlers(block, '@window', this.node.handlers); this.node.bindings.forEach(binding => { // in dev mode, throw if read-only values are written to @@ -92,29 +92,29 @@ export default class WindowWrapper extends Wrapper { renderer.meta_bindings.add_block(deindent` if (${condition}) { - window.scrollTo(${x || 'window.pageXOffset'}, ${y || 'window.pageYOffset'}); + @window.scrollTo(${x || 'window.pageXOffset'}, ${y || 'window.pageYOffset'}); } - ${x && `${x} = window.pageXOffset;`} - ${y && `${y} = window.pageYOffset;`} + ${x && `${x} = @window.pageXOffset;`} + ${y && `${y} = @window.pageYOffset;`} `); block.event_listeners.push(deindent` - @listen(window, "${event}", () => { + @listen(@window, "${event}", () => { ${scrolling} = true; - clearTimeout(${scrolling_timeout}); - ${scrolling_timeout} = setTimeout(${clear_scrolling}, 100); + @clearTimeout(${scrolling_timeout}); + ${scrolling_timeout} = @setTimeout(${clear_scrolling}, 100); ctx.${handler_name}(); }) `); } else { props.forEach(prop => { renderer.meta_bindings.add_line( - `this._state.${prop.name} = window.${prop.value};` + `this._state.${prop.name} = @window.${prop.value};` ); }); block.event_listeners.push(deindent` - @listen(window, "${event}", ctx.${handler_name}) + @listen(@window, "${event}", ctx.${handler_name}) `); } @@ -126,7 +126,7 @@ export default class WindowWrapper extends Wrapper { component.partly_hoisted.push(deindent` function ${handler_name}() { - ${props.map(prop => `${prop.name} = window.${prop.value}; $$invalidate('${prop.name}', ${prop.name});`)} + ${props.map(prop => `${prop.name} = @window.${prop.value}; $$invalidate('${prop.name}', ${prop.name});`)} } `); @@ -146,13 +146,13 @@ export default class WindowWrapper extends Wrapper { ).join(' || ') } && !${scrolling}) { ${scrolling} = true; - clearTimeout(${scrolling_timeout}); - window.scrollTo(${ - bindings.scrollX ? `ctx.${bindings.scrollX}` : `window.pageXOffset` + @clearTimeout(${scrolling_timeout}); + @window.scrollTo(${ + bindings.scrollX ? `ctx.${bindings.scrollX}` : `@window.pageXOffset` }, ${ - bindings.scrollY ? `ctx.${bindings.scrollY}` : `window.pageYOffset` + bindings.scrollY ? `ctx.${bindings.scrollY}` : `@window.pageYOffset` }); - ${scrolling_timeout} = setTimeout(${clear_scrolling}, 100); + ${scrolling_timeout} = @setTimeout(${clear_scrolling}, 100); } `); } @@ -170,7 +170,7 @@ export default class WindowWrapper extends Wrapper { component.partly_hoisted.push(deindent` function ${handler_name}() { - ${name} = navigator.onLine; $$invalidate('${name}', ${name}); + ${name} = @navigator.onLine; $$invalidate('${name}', ${name}); } `); @@ -179,8 +179,8 @@ export default class WindowWrapper extends Wrapper { `); block.event_listeners.push( - `@listen(window, "online", ctx.${handler_name})`, - `@listen(window, "offline", ctx.${handler_name})` + `@listen(@window, "online", ctx.${handler_name})`, + `@listen(@window, "offline", ctx.${handler_name})` ); component.has_reactive_assignments = true; diff --git a/src/compiler/compile/render-ssr/handlers/Element.ts b/src/compiler/compile/render-ssr/handlers/Element.ts index 681e0d4c7b..637b76aad5 100644 --- a/src/compiler/compile/render-ssr/handlers/Element.ts +++ b/src/compiler/compile/render-ssr/handlers/Element.ts @@ -163,7 +163,7 @@ export default function(node: Element, renderer: Renderer, options: RenderOption node_contents='${(' + snippet + ') || ""}'; } else { const snippet = snip(expression); - opening_tag += ' ${(v => v ? ("' + name + '" + (v === true ? "" : "=" + JSON.stringify(v))) : "")(' + snippet + ')}'; + opening_tag += ' ${(v => v ? ("' + name + '" + (v === true ? "" : "=" + @JSON.stringify(v))) : "")(' + snippet + ')}'; } }); diff --git a/src/runtime/internal/animations.ts b/src/runtime/internal/animations.ts index 77c86aff0e..0997e9ae23 100644 --- a/src/runtime/internal/animations.ts +++ b/src/runtime/internal/animations.ts @@ -2,7 +2,7 @@ import { identity as linear, noop, now } from './utils'; import { loop } from './loop'; import { create_rule, delete_rule } from './style_manager'; import { AnimationConfig } from '../animate'; - +import { getComputedStyle } from './globals'; //todo: documentation says it is DOMRect, but in IE it would be ClientRect type PositionRect = DOMRect|ClientRect; diff --git a/src/runtime/internal/dom.ts b/src/runtime/internal/dom.ts index f65d07117c..c1e16de447 100644 --- a/src/runtime/internal/dom.ts +++ b/src/runtime/internal/dom.ts @@ -1,3 +1,5 @@ +import { document, getComputedStyle, navigator } from './globals'; + export function append(target: Node, node: Node) { target.appendChild(node); } diff --git a/src/runtime/internal/globals.ts b/src/runtime/internal/globals.ts index 91a8e4a16d..789290388e 100644 --- a/src/runtime/internal/globals.ts +++ b/src/runtime/internal/globals.ts @@ -1,5 +1,41 @@ -import { is_client } from './utils'; +const { + // ecmascript + Error, + JSON, + Map, + Object, + console, + isNaN, -const { console, Error, Map, Object } = (is_client ? window : global) as { console, Error, Map, Object }; + // dom + cancelAnimationFrame, + clearTimeout, + customElements, + document, + getComputedStyle, + navigator, + requestAnimationFrame, + setTimeout: export_setTimeout, // TODO: remove when upgrading typescript, bug + window: export_window, +} = (window || global) as unknown as typeof globalThis; -export { console, Error, Map, Object }; +export { + // ecmascript + Error, + JSON, + Map, + Object, + console, + isNaN, + + // dom + cancelAnimationFrame, + clearTimeout, + customElements, + document, + getComputedStyle, + navigator, + requestAnimationFrame, + export_setTimeout as setTimeout, + export_window as window, +}; diff --git a/src/runtime/internal/style_manager.ts b/src/runtime/internal/style_manager.ts index 2721200627..db8c0e9d17 100644 --- a/src/runtime/internal/style_manager.ts +++ b/src/runtime/internal/style_manager.ts @@ -1,5 +1,6 @@ import { element } from './dom'; import { raf } from './utils'; +import { document } from './globals'; let stylesheet; let active = 0; diff --git a/src/runtime/internal/utils.ts b/src/runtime/internal/utils.ts index 5766ac26a5..8624c2246a 100644 --- a/src/runtime/internal/utils.ts +++ b/src/runtime/internal/utils.ts @@ -1,3 +1,5 @@ +import { requestAnimationFrame } from './globals'; + export function noop() {} export const identity = x => x; diff --git a/test/helpers.js b/test/helpers.js index e07d7c9b06..2e6878f8a5 100644 --- a/test/helpers.js +++ b/test/helpers.js @@ -28,7 +28,7 @@ export function exists(path) { export function tryToLoadJson(file) { try { - return JSON.parse(fs.readFileSync(file)); + return JSON.parse(fs.readFileSync(file, 'utf-8')); } catch (err) { if (err.code !== 'ENOENT') throw err; return null; @@ -44,14 +44,20 @@ export function tryToReadFile(file) { } } -export const virtualConsole = new jsdom.VirtualConsole(); -const { window } = new jsdom.JSDOM('
', {virtualConsole}); +const virtualConsole = new jsdom.VirtualConsole(); +virtualConsole.sendTo(console); + +global.window = new jsdom.JSDOM('
', {virtualConsole}).window; global.document = window.document; -global.getComputedStyle = window.getComputedStyle; -global.navigator = {userAgent: 'fake'}; + +// add missing ecmascript globals to window +for (const key of Object.getOwnPropertyNames(global)) { + window[key] = window[key] || global[key]; +} export function env() { window._svelteTransitionManager = null; + window.document.title = ''; window.document.body.innerHTML = '
'; return window; @@ -120,7 +126,7 @@ export function normalizeHtml(window, html) { .replace(//g, '') .replace(/>[\s\r\n]+<') .trim(); - cleanChildren(node, ''); + cleanChildren(node); return node.innerHTML.replace(/<\/?noscript\/?>/g, ''); } catch (err) { throw new Error(`Failed to normalize HTML:\n${html}`); diff --git a/test/js/samples/bind-online/expected.js b/test/js/samples/bind-online/expected.js index 0c9faa3ef6..9c3fdb7385 100644 --- a/test/js/samples/bind-online/expected.js +++ b/test/js/samples/bind-online/expected.js @@ -4,9 +4,11 @@ import { add_render_callback, init, listen, + navigator, noop, run_all, - safe_not_equal + safe_not_equal, + window } from "svelte/internal"; function create_fragment(ctx) { diff --git a/test/js/samples/collapses-text-around-comments/expected.js b/test/js/samples/collapses-text-around-comments/expected.js index 12164d0579..ed01b6430f 100644 --- a/test/js/samples/collapses-text-around-comments/expected.js +++ b/test/js/samples/collapses-text-around-comments/expected.js @@ -3,6 +3,7 @@ import { SvelteComponent, append, detach, + document, element, init, insert, diff --git a/test/js/samples/css-media-query/expected.js b/test/js/samples/css-media-query/expected.js index d4be134376..8a99d70e8e 100644 --- a/test/js/samples/css-media-query/expected.js +++ b/test/js/samples/css-media-query/expected.js @@ -3,6 +3,7 @@ import { SvelteComponent, append, detach, + document, element, init, insert, diff --git a/test/js/samples/css-shadow-dom-keyframes/expected.js b/test/js/samples/css-shadow-dom-keyframes/expected.js index 9f70b8ec66..3be52803d7 100644 --- a/test/js/samples/css-shadow-dom-keyframes/expected.js +++ b/test/js/samples/css-shadow-dom-keyframes/expected.js @@ -1,6 +1,7 @@ /* generated by Svelte vX.Y.Z */ import { SvelteElement, + customElements, detach, element, init, diff --git a/test/js/samples/debug-hoisted/expected.js b/test/js/samples/debug-hoisted/expected.js index 7f1b7535f3..799f0d4b32 100644 --- a/test/js/samples/debug-hoisted/expected.js +++ b/test/js/samples/debug-hoisted/expected.js @@ -2,6 +2,7 @@ import { Error, SvelteComponentDev, + console, init, noop, safe_not_equal diff --git a/test/js/samples/head-no-whitespace/expected.js b/test/js/samples/head-no-whitespace/expected.js index b95177bba7..859891e689 100644 --- a/test/js/samples/head-no-whitespace/expected.js +++ b/test/js/samples/head-no-whitespace/expected.js @@ -3,6 +3,7 @@ import { SvelteComponent, append, detach, + document, element, init, noop, diff --git a/test/js/samples/media-bindings/expected.js b/test/js/samples/media-bindings/expected.js index f45f9ce8db..ec30a98161 100644 --- a/test/js/samples/media-bindings/expected.js +++ b/test/js/samples/media-bindings/expected.js @@ -2,10 +2,12 @@ import { SvelteComponent, add_render_callback, + cancelAnimationFrame, detach, element, init, insert, + isNaN, listen, noop, raf, diff --git a/test/js/samples/title/expected.js b/test/js/samples/title/expected.js index 884f39e246..2e551ae426 100644 --- a/test/js/samples/title/expected.js +++ b/test/js/samples/title/expected.js @@ -1,6 +1,7 @@ /* generated by Svelte vX.Y.Z */ import { SvelteComponent, + document, init, noop, safe_not_equal diff --git a/test/js/samples/window-binding-scroll/expected.js b/test/js/samples/window-binding-scroll/expected.js index 18f5210bea..1e63973518 100644 --- a/test/js/samples/window-binding-scroll/expected.js +++ b/test/js/samples/window-binding-scroll/expected.js @@ -3,6 +3,7 @@ import { SvelteComponent, add_render_callback, append, + clearTimeout, detach, element, init, @@ -10,8 +11,10 @@ import { listen, noop, safe_not_equal, + setTimeout, set_data, - text + text, + window } from "svelte/internal"; function create_fragment(ctx) { diff --git a/test/runtime/index.js b/test/runtime/index.js index 900f3087fc..87be528a61 100644 --- a/test/runtime/index.js +++ b/test/runtime/index.js @@ -3,7 +3,7 @@ import * as path from "path"; import * as fs from "fs"; import { rollup } from 'rollup'; import * as virtual from 'rollup-plugin-virtual'; -import { clear_loops, set_now, set_raf } from "../../internal"; +import { clear_loops, flush, set_now, set_raf } from "../../internal"; import { showOutput, @@ -20,7 +20,6 @@ let compileOptions = null; let compile = null; const sveltePath = process.cwd().split('\\').join('/'); -const internal = `${sveltePath}/internal`; describe("runtime", () => { before(() => { @@ -47,8 +46,6 @@ describe("runtime", () => { function runTest(dir, hydrate) { if (dir[0] === ".") return; - const { flush } = require(internal); - const config = loadConfig(`./runtime/samples/${dir}/_config.js`); if (hydrate && config.skip_if_hydrate) return; @@ -66,7 +63,6 @@ describe("runtime", () => { compile = (config.preserveIdentifiers ? svelte : svelte$).compile; const cwd = path.resolve(`test/runtime/samples/${dir}`); - global.document.title = ''; compileOptions = config.compileOptions || {}; compileOptions.sveltePath = sveltePath; @@ -119,13 +115,10 @@ describe("runtime", () => { throw err; } - global.window = window; - if (config.before_test) config.before_test(); // Put things we need on window for testing window.SvelteComponent = SvelteComponent; - window.Error = global.Error; const target = window.document.querySelector("main"); @@ -222,6 +215,7 @@ describe("runtime", () => { 'main.js': js.code }), { + name: 'svelte-packages', resolveId: (importee, importer) => { if (importee.startsWith('svelte/')) { return importee.replace('svelte', process.cwd()) + '/index.mjs'; diff --git a/test/runtime/samples/deconflict-globals/_config.js b/test/runtime/samples/deconflict-globals/_config.js new file mode 100644 index 0000000000..c29f022a37 --- /dev/null +++ b/test/runtime/samples/deconflict-globals/_config.js @@ -0,0 +1,14 @@ +export default { + preserveIdentifiers: true, + compileOptions: { + name: 'window' + }, + + html: ` +

I hereby declare Svelte the bestest framework.

+

nintendo sixty four

+

Woops.

+

42

+

false

+ ` +}; diff --git a/test/runtime/samples/deconflict-globals/main.svelte b/test/runtime/samples/deconflict-globals/main.svelte new file mode 100644 index 0000000000..d1928ea533 --- /dev/null +++ b/test/runtime/samples/deconflict-globals/main.svelte @@ -0,0 +1,20 @@ + + + + Cute test + + + + + +{#each everyone as someone (someone)} +

{someone}

+{/each} diff --git a/test/test.js b/test/test.js index 7759941dbb..cb89b3e9d1 100644 --- a/test/test.js +++ b/test/test.js @@ -2,6 +2,10 @@ const glob = require("tiny-glob/sync.js"); require("./setup"); +// bind internal to jsdom +require("./helpers"); +require("../internal"); + glob("*/index.{js,ts}", { cwd: "test" }).forEach((file) => { require("./" + file); });