mirror of https://github.com/sveltejs/svelte
				
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							226 lines
						
					
					
						
							4.5 KiB
						
					
					
				
			
		
		
	
	
							226 lines
						
					
					
						
							4.5 KiB
						
					
					
				| import assert from "assert";
 | |
| import { svelte, deindent, env, setupHtmlEqual } from "../helpers.js";
 | |
| 
 | |
| function testAmd(code, expectedId, dependencies, html) {
 | |
| 	const fn = new Function("define", code);
 | |
| 
 | |
| 	return env().then(window => {
 | |
| 		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);
 | |
| 
 | |
| 	return env().then(window => {
 | |
| 		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};`);
 | |
| 
 | |
| 	return env().then(window => {
 | |
| 		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};`);
 | |
| 
 | |
| 	return env().then(window => {
 | |
| 		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 { code } = svelte.compile(source, {
 | |
| 				format: "amd",
 | |
| 				amd: { id: "foo" }
 | |
| 			});
 | |
| 
 | |
| 			return testAmd(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 { code } = svelte.compile(source, {
 | |
| 				format: "cjs"
 | |
| 			});
 | |
| 
 | |
| 			return testCjs(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 { code } = svelte.compile(source, {
 | |
| 				format: "iife",
 | |
| 				name: "Foo",
 | |
| 				globals: {
 | |
| 					answer: "answer"
 | |
| 				}
 | |
| 			});
 | |
| 
 | |
| 			return testIife(code, "Foo", { answer: 42 }, `<div>42</div>`);
 | |
| 		});
 | |
| 	});
 | |
| 
 | |
| 	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 { code } = svelte.compile(source, {
 | |
| 				format: "umd",
 | |
| 				name: "Foo",
 | |
| 				globals: {
 | |
| 					answer: "answer"
 | |
| 				},
 | |
| 				amd: {
 | |
| 					id: "foo"
 | |
| 				}
 | |
| 			});
 | |
| 
 | |
| 			return testAmd(code, "foo", { answer: 42 }, `<div>42</div>`)
 | |
| 				.then(() => testCjs(code, { answer: 42 }, `<div>42</div>`))
 | |
| 				.then(() => testIife(code, "Foo", { answer: 42 }, `<div>42</div>`));
 | |
| 		});
 | |
| 	});
 | |
| 
 | |
| 	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 { code } = svelte.compile(source, {
 | |
| 				format: "eval",
 | |
| 				globals: {
 | |
| 					answer: "answer"
 | |
| 				}
 | |
| 			});
 | |
| 
 | |
| 			return testEval(code, "Foo", { answer: 42 }, `<div>42</div>`);
 | |
| 		});
 | |
| 	});
 | |
| });
 |