| 
							
								 | 
							
							import assert from "assert";
 | 
						
						
						
						
							 | 
							
								 | 
							
							import { svelte, deindent, env, setupHtmlEqual } from "../helpers.js";
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							function testAmd(code, expectedId, dependencies, html) {
 | 
						
						
						
						
							 | 
							
								 | 
							
								const fn = new Function("define", code);
 | 
						
						
						
						
							 | 
							
								 | 
							
								const window = env();
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
								function define(id, deps, factory) {
 | 
						
						
						
						
							 | 
							
								 | 
							
									assert.equal(id, expectedId);
 | 
						
						
						
						
							 | 
							
								 | 
							
									assert.deepEqual(deps, Object.keys(dependencies));
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
									const SvelteComponent = factory(
 | 
						
						
						
						
							 | 
							
								 | 
							
										...Object.keys(dependencies).map(key => dependencies[key])
 | 
						
						
						
						
							 | 
							
								 | 
							
									);
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
									const main = window.document.body.querySelector("main");
 | 
						
						
						
						
							 | 
							
								 | 
							
									const component = new SvelteComponent({ target: main });
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
									assert.htmlEqual(main.innerHTML, html);
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
									component.destroy();
 | 
						
						
						
						
							 | 
							
								 | 
							
								}
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
								define.amd = true;
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
								fn(define);
 | 
						
						
						
						
							 | 
							
								 | 
							
							}
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							function testCjs(code, dependencyById, html) {
 | 
						
						
						
						
							 | 
							
								 | 
							
								const fn = new Function("module", "exports", "require", code);
 | 
						
						
						
						
							 | 
							
								 | 
							
								const window = env();
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
								const module = { exports: {} };
 | 
						
						
						
						
							 | 
							
								 | 
							
								const require = id => {
 | 
						
						
						
						
							 | 
							
								 | 
							
									return dependencyById[id];
 | 
						
						
						
						
							 | 
							
								 | 
							
								};
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
								fn(module, module.exports, require);
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
								const SvelteComponent = module.exports;
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
								const main = window.document.body.querySelector("main");
 | 
						
						
						
						
							 | 
							
								 | 
							
								const component = new SvelteComponent({ target: main });
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
								assert.htmlEqual(main.innerHTML, html);
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
								component.destroy();
 | 
						
						
						
						
							 | 
							
								 | 
							
							}
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							function testIife(code, name, globals, html) {
 | 
						
						
						
						
							 | 
							
								 | 
							
								const fn = new Function(Object.keys(globals), `${code}\n\nreturn ${name};`);
 | 
						
						
						
						
							 | 
							
								 | 
							
								const window = env();
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
								const SvelteComponent = fn(
 | 
						
						
						
						
							 | 
							
								 | 
							
									...Object.keys(globals).map(key => globals[key])
 | 
						
						
						
						
							 | 
							
								 | 
							
								);
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
								const main = window.document.body.querySelector("main");
 | 
						
						
						
						
							 | 
							
								 | 
							
								const component = new SvelteComponent({ target: main });
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
								assert.htmlEqual(main.innerHTML, html);
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
								component.destroy();
 | 
						
						
						
						
							 | 
							
								 | 
							
							}
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							function testEval(code, name, globals, html) {
 | 
						
						
						
						
							 | 
							
								 | 
							
								const fn = new Function(Object.keys(globals), `return ${code};`);
 | 
						
						
						
						
							 | 
							
								 | 
							
								const window = env();
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
								const SvelteComponent = fn(
 | 
						
						
						
						
							 | 
							
								 | 
							
									...Object.keys(globals).map(key => globals[key])
 | 
						
						
						
						
							 | 
							
								 | 
							
								);
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
								const main = window.document.body.querySelector("main");
 | 
						
						
						
						
							 | 
							
								 | 
							
								const component = new SvelteComponent({ target: main });
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
								assert.htmlEqual(main.innerHTML, html);
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
								component.destroy();
 | 
						
						
						
						
							 | 
							
								 | 
							
							}
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							describe("formats", () => {
 | 
						
						
						
						
							 | 
							
								 | 
							
								before(setupHtmlEqual);
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
								describe("amd", () => {
 | 
						
						
						
						
							 | 
							
								 | 
							
									it("generates an AMD module", () => {
 | 
						
						
						
						
							 | 
							
								 | 
							
										const source = deindent`
 | 
						
						
						
						
							 | 
							
								 | 
							
											<div>{answer}</div>
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
											<script>
 | 
						
						
						
						
							 | 
							
								 | 
							
												import answer from 'answer';
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
												export default {
 | 
						
						
						
						
							 | 
							
								 | 
							
													data () {
 | 
						
						
						
						
							 | 
							
								 | 
							
														return { answer };
 | 
						
						
						
						
							 | 
							
								 | 
							
													}
 | 
						
						
						
						
							 | 
							
								 | 
							
												};
 | 
						
						
						
						
							 | 
							
								 | 
							
											</script>
 | 
						
						
						
						
							 | 
							
								 | 
							
										`;
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
										const { js } = svelte.compile(source, {
 | 
						
						
						
						
							 | 
							
								 | 
							
											format: "amd",
 | 
						
						
						
						
							 | 
							
								 | 
							
											amd: { id: "foo" }
 | 
						
						
						
						
							 | 
							
								 | 
							
										});
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
										return testAmd(js.code, "foo", { answer: 42 }, `<div>42</div>`);
 | 
						
						
						
						
							 | 
							
								 | 
							
									});
 | 
						
						
						
						
							 | 
							
								 | 
							
								});
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
								describe("cjs", () => {
 | 
						
						
						
						
							 | 
							
								 | 
							
									it("generates a CommonJS module", () => {
 | 
						
						
						
						
							 | 
							
								 | 
							
										const source = deindent`
 | 
						
						
						
						
							 | 
							
								 | 
							
											<div>{answer}</div>
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
											<script>
 | 
						
						
						
						
							 | 
							
								 | 
							
												import answer from 'answer';
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
												export default {
 | 
						
						
						
						
							 | 
							
								 | 
							
													data () {
 | 
						
						
						
						
							 | 
							
								 | 
							
														return { answer };
 | 
						
						
						
						
							 | 
							
								 | 
							
													}
 | 
						
						
						
						
							 | 
							
								 | 
							
												};
 | 
						
						
						
						
							 | 
							
								 | 
							
											</script>
 | 
						
						
						
						
							 | 
							
								 | 
							
										`;
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
										const { js } = svelte.compile(source, {
 | 
						
						
						
						
							 | 
							
								 | 
							
											format: "cjs"
 | 
						
						
						
						
							 | 
							
								 | 
							
										});
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
										return testCjs(js.code, { answer: 42 }, `<div>42</div>`);
 | 
						
						
						
						
							 | 
							
								 | 
							
									});
 | 
						
						
						
						
							 | 
							
								 | 
							
								});
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
								describe("iife", () => {
 | 
						
						
						
						
							 | 
							
								 | 
							
									it("generates a self-executing script", () => {
 | 
						
						
						
						
							 | 
							
								 | 
							
										const source = deindent`
 | 
						
						
						
						
							 | 
							
								 | 
							
											<div>{answer}</div>
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
											<script>
 | 
						
						
						
						
							 | 
							
								 | 
							
												import answer from 'answer';
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
												export default {
 | 
						
						
						
						
							 | 
							
								 | 
							
													data () {
 | 
						
						
						
						
							 | 
							
								 | 
							
														return { answer };
 | 
						
						
						
						
							 | 
							
								 | 
							
													}
 | 
						
						
						
						
							 | 
							
								 | 
							
												};
 | 
						
						
						
						
							 | 
							
								 | 
							
											</script>
 | 
						
						
						
						
							 | 
							
								 | 
							
										`;
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
										const { js } = svelte.compile(source, {
 | 
						
						
						
						
							 | 
							
								 | 
							
											format: "iife",
 | 
						
						
						
						
							 | 
							
								 | 
							
											name: "Foo",
 | 
						
						
						
						
							 | 
							
								 | 
							
											globals: {
 | 
						
						
						
						
							 | 
							
								 | 
							
												answer: "answer"
 | 
						
						
						
						
							 | 
							
								 | 
							
											}
 | 
						
						
						
						
							 | 
							
								 | 
							
										});
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
										return testIife(js.code, "Foo", { answer: 42 }, `<div>42</div>`);
 | 
						
						
						
						
							 | 
							
								 | 
							
									});
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
									it('requires options.name', () => {
 | 
						
						
						
						
							 | 
							
								 | 
							
										assert.throws(() => {
 | 
						
						
						
						
							 | 
							
								 | 
							
											svelte.compile('', {
 | 
						
						
						
						
							 | 
							
								 | 
							
												format: 'iife'
 | 
						
						
						
						
							 | 
							
								 | 
							
											});
 | 
						
						
						
						
							 | 
							
								 | 
							
										}, /Missing required 'name' option for IIFE export/);
 | 
						
						
						
						
							 | 
							
								 | 
							
									});
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
									it('suggests using options.globals for default imports', () => {
 | 
						
						
						
						
							 | 
							
								 | 
							
										const warnings = [];
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
										svelte.compile(`
 | 
						
						
						
						
							 | 
							
								 | 
							
											<script>
 | 
						
						
						
						
							 | 
							
								 | 
							
												import _ from 'lodash';
 | 
						
						
						
						
							 | 
							
								 | 
							
											</script>
 | 
						
						
						
						
							 | 
							
								 | 
							
										`,
 | 
						
						
						
						
							 | 
							
								 | 
							
											{
 | 
						
						
						
						
							 | 
							
								 | 
							
												format: 'iife',
 | 
						
						
						
						
							 | 
							
								 | 
							
												name: 'App',
 | 
						
						
						
						
							 | 
							
								 | 
							
												onwarn: warning => {
 | 
						
						
						
						
							 | 
							
								 | 
							
													warnings.push(warning);
 | 
						
						
						
						
							 | 
							
								 | 
							
												}
 | 
						
						
						
						
							 | 
							
								 | 
							
											}
 | 
						
						
						
						
							 | 
							
								 | 
							
										);
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
										assert.deepEqual(warnings, [{
 | 
						
						
						
						
							 | 
							
								 | 
							
											code: `options-missing-globals`,
 | 
						
						
						
						
							 | 
							
								 | 
							
											message: `No name was supplied for imported module 'lodash'. Guessing '_', but you should use options.globals`
 | 
						
						
						
						
							 | 
							
								 | 
							
										}]);
 | 
						
						
						
						
							 | 
							
								 | 
							
									});
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
									it('insists on options.globals for named imports', () => {
 | 
						
						
						
						
							 | 
							
								 | 
							
										assert.throws(() => {
 | 
						
						
						
						
							 | 
							
								 | 
							
											svelte.compile(`
 | 
						
						
						
						
							 | 
							
								 | 
							
												<script>
 | 
						
						
						
						
							 | 
							
								 | 
							
													import { fade } from 'svelte-transitions';
 | 
						
						
						
						
							 | 
							
								 | 
							
												</script>
 | 
						
						
						
						
							 | 
							
								 | 
							
											`,
 | 
						
						
						
						
							 | 
							
								 | 
							
												{
 | 
						
						
						
						
							 | 
							
								 | 
							
													format: 'iife',
 | 
						
						
						
						
							 | 
							
								 | 
							
													name: 'App'
 | 
						
						
						
						
							 | 
							
								 | 
							
												}
 | 
						
						
						
						
							 | 
							
								 | 
							
											);
 | 
						
						
						
						
							 | 
							
								 | 
							
										}, /Could not determine name for imported module 'svelte-transitions' – use options.globals/);
 | 
						
						
						
						
							 | 
							
								 | 
							
									});
 | 
						
						
						
						
							 | 
							
								 | 
							
								});
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
								describe("umd", () => {
 | 
						
						
						
						
							 | 
							
								 | 
							
									it("generates a UMD build", () => {
 | 
						
						
						
						
							 | 
							
								 | 
							
										const source = deindent`
 | 
						
						
						
						
							 | 
							
								 | 
							
											<div>{answer}</div>
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
											<script>
 | 
						
						
						
						
							 | 
							
								 | 
							
												import answer from 'answer';
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
												export default {
 | 
						
						
						
						
							 | 
							
								 | 
							
													data () {
 | 
						
						
						
						
							 | 
							
								 | 
							
														return { answer };
 | 
						
						
						
						
							 | 
							
								 | 
							
													}
 | 
						
						
						
						
							 | 
							
								 | 
							
												};
 | 
						
						
						
						
							 | 
							
								 | 
							
											</script>
 | 
						
						
						
						
							 | 
							
								 | 
							
										`;
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
										const { js } = svelte.compile(source, {
 | 
						
						
						
						
							 | 
							
								 | 
							
											format: "umd",
 | 
						
						
						
						
							 | 
							
								 | 
							
											name: "Foo",
 | 
						
						
						
						
							 | 
							
								 | 
							
											globals: {
 | 
						
						
						
						
							 | 
							
								 | 
							
												answer: "answer"
 | 
						
						
						
						
							 | 
							
								 | 
							
											},
 | 
						
						
						
						
							 | 
							
								 | 
							
											amd: {
 | 
						
						
						
						
							 | 
							
								 | 
							
												id: "foo"
 | 
						
						
						
						
							 | 
							
								 | 
							
											}
 | 
						
						
						
						
							 | 
							
								 | 
							
										});
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
										testAmd(js.code, "foo", { answer: 42 }, `<div>42</div>`);
 | 
						
						
						
						
							 | 
							
								 | 
							
										testCjs(js.code, { answer: 42 }, `<div>42</div>`);
 | 
						
						
						
						
							 | 
							
								 | 
							
										testIife(js.code, "Foo", { answer: 42 }, `<div>42</div>`);
 | 
						
						
						
						
							 | 
							
								 | 
							
									});
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
									it('requires options.name', () => {
 | 
						
						
						
						
							 | 
							
								 | 
							
										assert.throws(() => {
 | 
						
						
						
						
							 | 
							
								 | 
							
											svelte.compile('', {
 | 
						
						
						
						
							 | 
							
								 | 
							
												format: 'umd'
 | 
						
						
						
						
							 | 
							
								 | 
							
											});
 | 
						
						
						
						
							 | 
							
								 | 
							
										}, /Missing required 'name' option for UMD export/);
 | 
						
						
						
						
							 | 
							
								 | 
							
									});
 | 
						
						
						
						
							 | 
							
								 | 
							
								});
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
								describe("eval", () => {
 | 
						
						
						
						
							 | 
							
								 | 
							
									it("generates a self-executing script that returns the component on eval", () => {
 | 
						
						
						
						
							 | 
							
								 | 
							
										const source = deindent`
 | 
						
						
						
						
							 | 
							
								 | 
							
											<div>{answer}</div>
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
											<script>
 | 
						
						
						
						
							 | 
							
								 | 
							
												import answer from 'answer';
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
												export default {
 | 
						
						
						
						
							 | 
							
								 | 
							
													data () {
 | 
						
						
						
						
							 | 
							
								 | 
							
														return { answer };
 | 
						
						
						
						
							 | 
							
								 | 
							
													}
 | 
						
						
						
						
							 | 
							
								 | 
							
												};
 | 
						
						
						
						
							 | 
							
								 | 
							
											</script>
 | 
						
						
						
						
							 | 
							
								 | 
							
										`;
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
										const { js } = svelte.compile(source, {
 | 
						
						
						
						
							 | 
							
								 | 
							
											format: "eval",
 | 
						
						
						
						
							 | 
							
								 | 
							
											globals: {
 | 
						
						
						
						
							 | 
							
								 | 
							
												answer: "answer"
 | 
						
						
						
						
							 | 
							
								 | 
							
											}
 | 
						
						
						
						
							 | 
							
								 | 
							
										});
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
										return testEval(js.code, "Foo", { answer: 42 }, `<div>42</div>`);
 | 
						
						
						
						
							 | 
							
								 | 
							
									});
 | 
						
						
						
						
							 | 
							
								 | 
							
								});
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
								describe('unknown format', () => {
 | 
						
						
						
						
							 | 
							
								 | 
							
									it('throws an error', () => {
 | 
						
						
						
						
							 | 
							
								 | 
							
										assert.throws(() => {
 | 
						
						
						
						
							 | 
							
								 | 
							
											svelte.compile('', {
 | 
						
						
						
						
							 | 
							
								 | 
							
												format: 'nope'
 | 
						
						
						
						
							 | 
							
								 | 
							
											});
 | 
						
						
						
						
							 | 
							
								 | 
							
										}, /options.format is invalid \(must be es, amd, cjs, iife, umd or eval\)/);
 | 
						
						
						
						
							 | 
							
								 | 
							
									});
 | 
						
						
						
						
							 | 
							
								 | 
							
								});
 | 
						
						
						
						
							 | 
							
								 | 
							
							});
 |