merge master -> gh-23

pull/7738/head
Rich Harris 8 years ago
commit d100014327

@ -8,8 +8,7 @@ import globalWhitelist from '../utils/globalWhitelist';
import reservedNames from '../utils/reservedNames';
import namespaces from '../utils/namespaces';
import { removeNode, removeObjectKey } from '../utils/removeNode';
import getIntro from './shared/utils/getIntro';
import getOutro from './shared/utils/getOutro';
import wrapModule from './shared/utils/wrapModule';
import annotateWithScopes from '../utils/annotateWithScopes';
import clone from '../utils/clone';
import DomBlock from './dom/Block';
@ -303,55 +302,12 @@ export default class Generator {
return (expression._dependencies = dependencies);
}
generate(result: string, options: CompileOptions, { name, format }: GenerateOptions ) {
if (this.imports.length) {
const statements: string[] = [];
this.imports.forEach((declaration, i) => {
if (format === 'es') {
statements.push(
this.source.slice(declaration.start, declaration.end)
);
return;
}
const defaultImport = declaration.specifiers.find(
(x: Node) =>
x.type === 'ImportDefaultSpecifier' ||
(x.type === 'ImportSpecifier' && x.imported.name === 'default')
);
const namespaceImport = declaration.specifiers.find(
(x: Node) => x.type === 'ImportNamespaceSpecifier'
);
const namedImports = declaration.specifiers.filter(
(x: Node) =>
x.type === 'ImportSpecifier' && x.imported.name !== 'default'
);
const name = defaultImport || namespaceImport
? (defaultImport || namespaceImport).local.name
: `__import${i}`;
declaration.name = name; // hacky but makes life a bit easier later
namedImports.forEach((specifier: Node) => {
statements.push(
`var ${specifier.local.name} = ${name}.${specifier.imported.name}`
);
});
if (defaultImport) {
statements.push(
`${name} = (${name} && ${name}.__esModule) ? ${name}['default'] : ${name};`
);
}
});
result = `${statements.join('\n')}\n\n${result}`;
}
generate(result: string, options: CompileOptions, { banner = '', sharedPath, helpers, name, format }: GenerateOptions ) {
const pattern = /\[✂(\d+)-(\d+)$/;
const parts = result.split('✂]');
const module = wrapModule(result, format, name, options, banner, sharedPath, helpers, this.imports, this.source);
const parts = module.split('✂]');
const finalChunk = parts.pop();
const compiled = new Bundle({ separator: '' });
@ -362,9 +318,6 @@ export default class Generator {
});
}
const intro = getIntro(format, options, this.imports);
if (intro) addString(intro);
const { filename } = options;
// special case — the source file doesn't actually get used anywhere. we need
@ -391,7 +344,6 @@ export default class Generator {
});
addString(finalChunk);
addString('\n\n' + getOutro(format, name, options, this.imports));
const { css, cssMap } = this.customElement ?
{ css: null, cssMap: null } :

@ -356,34 +356,20 @@ export default function dom(
return generator.alias(name);
});
if (sharedPath) {
const used = Array.from(usedHelpers).sort();
if (format === 'es') {
const names = used.map(name => {
const alias = generator.alias(name);
return name !== alias ? `${name} as ${alias}` : name;
});
result =
`import { ${names.join(', ')} } from ${JSON.stringify(sharedPath)};\n\n` +
result;
}
else if (format === 'cjs') {
const SHARED = '__shared';
let requires = `var ${SHARED} = require(${JSON.stringify(sharedPath)});`;
used.forEach(name => {
const alias = generator.alias(name);
requires += `\nvar ${alias} = ${SHARED}.${name};`;
});
let helpers;
result = `${requires}\n\n${result}`;
}
else {
if (sharedPath) {
if (format !== 'es' && format !== 'cjs') {
throw new Error(`Components with shared helpers must be compiled with \`format: 'es'\` or \`format: 'cjs'\``);
}
const used = Array.from(usedHelpers).sort();
helpers = used.map(name => {
const alias = generator.alias(name);
return { name, alias };
});
} else {
let inlineHelpers = '';
usedHelpers.forEach(key => {
const str = shared[key];
const code = new MagicString(str);
@ -421,20 +407,27 @@ export default function dom(
// special case
const global = `_svelteTransitionManager`;
result += `\n\nvar ${generator.alias('transitionManager')} = window.${global} || (window.${global} = ${code});`;
inlineHelpers += `\n\nvar ${generator.alias('transitionManager')} = window.${global} || (window.${global} = ${code});\n\n`;
} else {
const alias = generator.alias(expression.id.name);
if (alias !== expression.id.name)
code.overwrite(expression.id.start, expression.id.end, alias);
result += `\n\n${code}`;
inlineHelpers += `\n\n${code}`;
}
});
result += inlineHelpers;
}
result = `/* ${options.filename ? `${options.filename} ` : ``}generated by Svelte v${version} */\n\n${result}`;
const filename = options.filename && (
typeof process !== 'undefined' ? options.filename.replace(process.cwd(), '').replace(/^[\/\\]/, '') : options.filename
);
return generator.generate(result, options, {
banner: `/* ${filename ? `${filename} ` : ``}generated by Svelte v${version} */`,
sharedPath,
helpers,
name,
format,
});

@ -122,7 +122,7 @@ export default function visitEachBlock(
);
block.builders.destroy.addBlock(deindent`
if (${each_block_else}) ${each_block_else}.destroy(false);
if (${each_block_else}) ${each_block_else}.destroy();
`);
}
@ -351,7 +351,7 @@ function keyed(
block.builders.destroy.addBlock(deindent`
var ${iteration} = ${head};
while (${iteration}) {
${iteration}.destroy(false);
${iteration}.destroy();
${iteration} = ${iteration}.next;
}
`);
@ -486,5 +486,5 @@ function unkeyed(
}
`);
block.builders.destroy.addBlock(`@destroyEach(${iterations}, false, 0);`);
block.builders.destroy.addBlock(`@destroyEach(${iterations});`);
}

@ -1,5 +1,6 @@
import deindent from '../../../../utils/deindent';
import flattenReference from '../../../../utils/flattenReference';
import validCalleeObjects from '../../../../utils/validCalleeObjects';
import { DomGenerator } from '../../index';
import Block from '../../Block';
import { Node } from '../../../../interfaces';
@ -23,7 +24,7 @@ export default function visitEventHandler(
generator.addSourcemapLocations(attribute.expression);
const flattened = flattenReference(attribute.expression.callee);
if (flattened.name !== 'event' && flattened.name !== 'this') {
if (!validCalleeObjects.has(flattened.name)) {
// allow event.stopPropagation(), this.select() etc
// TODO verify that it's a valid callee (i.e. built-in or declared method)
generator.code.prependRight(

@ -1,47 +0,0 @@
import { CompileOptions, Node } from '../../../interfaces';
export default function getGlobals(imports: Node[], options: CompileOptions) {
const { globals, onerror, onwarn } = options;
const globalFn = getGlobalFn(globals);
return imports.map(x => {
let name = globalFn(x.source.value);
if (!name) {
if (x.name.startsWith('__import')) {
const error = new Error(
`Could not determine name for imported module '${x.source.value}' use options.globals`
);
if (onerror) {
onerror(error);
} else {
throw error;
}
} else {
const warning = {
message: `No name was supplied for imported module '${x.source.value}'. Guessing '${x.name}', but you should use options.globals`,
};
if (onwarn) {
onwarn(warning);
} else {
console.warn(warning); // eslint-disable-line no-console
}
}
name = x.name;
}
return name;
});
}
function getGlobalFn(globals: any): (id: string) => string {
if (typeof globals === 'function') return globals;
if (typeof globals === 'object') {
return id => globals[id];
}
return () => undefined;
}

@ -1,95 +0,0 @@
import deindent from '../../../utils/deindent';
import getGlobals from './getGlobals';
import { CompileOptions, ModuleFormat, Node } from '../../../interfaces';
export default function getIntro(
format: ModuleFormat,
options: CompileOptions,
imports: Node[]
) {
if (format === 'es') return '';
if (format === 'amd') return getAmdIntro(options, imports);
if (format === 'cjs') return getCjsIntro(options, imports);
if (format === 'iife') return getIifeIntro(options, imports);
if (format === 'umd') return getUmdIntro(options, imports);
if (format === 'eval') return getEvalIntro(options, imports);
throw new Error(`Not implemented: ${format}`);
}
function getAmdIntro(options: CompileOptions, imports: Node[]) {
const sourceString = imports.length
? `[${imports
.map(declaration => `'${removeExtension(declaration.source.value)}'`)
.join(', ')}], `
: '';
const id = options.amd && options.amd.id;
return `define(${id
? `"${id}", `
: ''}${sourceString}function(${paramString(imports)}) { 'use strict';\n\n`;
}
function getCjsIntro(options: CompileOptions, imports: Node[]) {
const requireBlock = imports
.map(
declaration =>
`var ${declaration.name} = require('${declaration.source.value}');`
)
.join('\n\n');
if (requireBlock) {
return `'use strict';\n\n${requireBlock}\n\n`;
}
return `'use strict';\n\n`;
}
function getIifeIntro(options: CompileOptions, imports: Node[]) {
if (!options.name) {
throw new Error(`Missing required 'name' option for IIFE export`);
}
return `var ${options.name} = (function(${paramString(imports)}) { 'use strict';\n\n`;
}
function getUmdIntro(options: CompileOptions, imports: Node[]) {
if (!options.name) {
throw new Error(`Missing required 'name' option for UMD export`);
}
const amdId = options.amd && options.amd.id ? `'${options.amd.id}', ` : '';
const amdDeps = imports.length
? `[${imports
.map(declaration => `'${removeExtension(declaration.source.value)}'`)
.join(', ')}], `
: '';
const cjsDeps = imports
.map(declaration => `require('${declaration.source.value}')`)
.join(', ');
const globalDeps = getGlobals(imports, options);
return (
deindent`
(function(global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(${cjsDeps}) :
typeof define === 'function' && define.amd ? define(${amdId}${amdDeps}factory) :
(global.${options.name} = factory(${globalDeps}));
}(this, (function (${paramString(imports)}) { 'use strict';` + '\n\n'
);
}
function getEvalIntro(options: CompileOptions, imports: Node[]) {
return `(function (${paramString(imports)}) { 'use strict';\n\n`;
}
function paramString(imports: Node[]) {
return imports.map(dep => dep.name).join(', ');
}
function removeExtension(file: string) {
const index = file.lastIndexOf('.');
return ~index ? file.slice(0, index) : file;
}

@ -1,37 +0,0 @@
import getGlobals from './getGlobals';
import { CompileOptions, Node } from '../../../interfaces';
export default function getOutro(
format: string,
name: string,
options: CompileOptions,
imports: Node[]
) {
if (format === 'es') {
return `export default ${name};`;
}
if (format === 'amd') {
return `return ${name};\n\n});`;
}
if (format === 'cjs') {
return `module.exports = ${name};`;
}
if (format === 'iife') {
const globals = getGlobals(imports, options);
return `return ${name};\n\n}(${globals.join(', ')}));`;
}
if (format === 'eval') {
const globals = getGlobals(imports, options);
return `return ${name};\n\n}(${globals.join(', ')}));`;
}
if (format === 'umd') {
return `return ${name};\n\n})));`;
}
throw new Error(`Not implemented: ${format}`);
}

@ -0,0 +1,306 @@
import deindent from '../../../utils/deindent';
import { CompileOptions, ModuleFormat, Node } from '../../../interfaces';
interface Dependency {
name: string;
statements: string[];
source: string;
}
const wrappers = { es, amd, cjs, iife, umd, eval: expr };
export default function wrapModule(
code: string,
format: ModuleFormat,
name: string,
options: CompileOptions,
banner: string,
sharedPath: string,
helpers: { name: string, alias: string }[],
imports: Node[],
source: string
): string {
if (format === 'es') return es(code, name, options, banner, sharedPath, helpers, imports, source);
const dependencies = imports.map((declaration, i) => {
const defaultImport = declaration.specifiers.find(
(x: Node) =>
x.type === 'ImportDefaultSpecifier' ||
(x.type === 'ImportSpecifier' && x.imported.name === 'default')
);
const namespaceImport = declaration.specifiers.find(
(x: Node) => x.type === 'ImportNamespaceSpecifier'
);
const namedImports = declaration.specifiers.filter(
(x: Node) =>
x.type === 'ImportSpecifier' && x.imported.name !== 'default'
);
const name = defaultImport || namespaceImport
? (defaultImport || namespaceImport).local.name
: `__import${i}`;
const statements: string[] = [];
namedImports.forEach((specifier: Node) => {
statements.push(
`var ${specifier.local.name} = ${name}.${specifier.imported.name};`
);
});
if (defaultImport) {
statements.push(
`${name} = (${name} && ${name}.__esModule) ? ${name}["default"] : ${name};`
);
}
return { name, statements, source: declaration.source.value };
});
if (format === 'amd') return amd(code, name, options, banner, dependencies);
if (format === 'cjs') return cjs(code, name, options, banner, sharedPath, helpers, dependencies);
if (format === 'iife') return iife(code, name, options, banner, dependencies);
if (format === 'umd') return umd(code, name, options, banner, dependencies);
if (format === 'eval') return expr(code, name, options, banner, dependencies);
throw new Error(`Not implemented: ${format}`);
}
function es(
code: string,
name: string,
options: CompileOptions,
banner: string,
sharedPath: string,
helpers: { name: string, alias: string }[],
imports: Node[],
source: string
) {
const importHelpers = helpers && (
`import { ${helpers.map(h => h.name === h.alias ? h.name : `${h.name} as ${h.alias}`).join(', ')} } from ${JSON.stringify(sharedPath)};`
);
const importBlock = imports.length > 0 && (
imports
.map((declaration: Node) => source.slice(declaration.start, declaration.end))
.join('\n')
);
return deindent`
${banner}
${importHelpers}
${importBlock}
${code}
export default ${name};`;
}
function amd(
code: string,
name: string,
options: CompileOptions,
banner: string,
dependencies: Dependency[]
) {
const sourceString = dependencies.length
? `[${dependencies.map(d => `"${removeExtension(d.source)}"`).join(', ')}], `
: '';
const id = options.amd && options.amd.id;
return deindent`
define(${id ? `"${id}", ` : ''}${sourceString}function(${paramString(dependencies)}) { "use strict";
${getCompatibilityStatements(dependencies)}
${code}
return ${name};
});`;
}
function cjs(
code: string,
name: string,
options: CompileOptions,
banner: string,
sharedPath: string,
helpers: { name: string, alias: string }[],
dependencies: Dependency[]
) {
const SHARED = '__shared';
const helperBlock = helpers && (
`var ${SHARED} = require(${JSON.stringify(sharedPath)});\n` +
helpers.map(helper => {
return `var ${helper.alias} = ${SHARED}.${helper.name};`;
}).join('\n')
);
const requireBlock = dependencies.length > 0 && (
dependencies
.map(d => `var ${d.name} = require("${d.source}");`)
.join('\n\n')
);
return deindent`
${banner}
"use strict";
${helperBlock}
${requireBlock}
${getCompatibilityStatements(dependencies)}
${code}
module.exports = ${name};`
}
function iife(
code: string,
name: string,
options: CompileOptions,
banner: string,
dependencies: Dependency[]
) {
if (!options.name) {
throw new Error(`Missing required 'name' option for IIFE export`);
}
const globals = getGlobals(dependencies, options);
return deindent`
${banner}
var ${options.name} = (function(${paramString(dependencies)}) { "use strict";
${getCompatibilityStatements(dependencies)}
${code}
return ${name};
}(${globals.join(', ')}));`;
}
function umd(
code: string,
name: string,
options: CompileOptions,
banner: string,
dependencies: Dependency[]
) {
if (!options.name) {
throw new Error(`Missing required 'name' option for UMD export`);
}
const amdId = options.amd && options.amd.id ? `'${options.amd.id}', ` : '';
const amdDeps = dependencies.length
? `[${dependencies.map(d => `"${removeExtension(d.source)}"`).join(', ')}], `
: '';
const cjsDeps = dependencies
.map(d => `require("${d.source}")`)
.join(', ');
const globals = getGlobals(dependencies, options);
return deindent`
${banner}
(function(global, factory) {
typeof exports === "object" && typeof module !== "undefined" ? module.exports = factory(${cjsDeps}) :
typeof define === "function" && define.amd ? define(${amdId}${amdDeps}factory) :
(global.${options.name} = factory(${globals}));
}(this, (function (${paramString(dependencies)}) { "use strict";
${getCompatibilityStatements(dependencies)}
${code}
return ${name};
})));`;
}
function expr(
code: string,
name: string,
options: CompileOptions,
banner: string,
dependencies: Dependency[]
) {
const globals = getGlobals(dependencies, options);
return deindent`
(function (${paramString(dependencies)}) { "use strict";
${banner}
${getCompatibilityStatements(dependencies)}
${code}
return ${name};
}(${globals.join(', ')}))`;
}
function paramString(dependencies: Dependency[]) {
return dependencies.map(dep => dep.name).join(', ');
}
function removeExtension(file: string) {
const index = file.lastIndexOf('.');
return ~index ? file.slice(0, index) : file;
}
function getCompatibilityStatements(dependencies: Dependency[]) {
if (!dependencies.length) return null;
const statements: string[] = [];
dependencies.forEach(dependency => {
statements.push(...dependency.statements);
});
return statements.join('\n');
}
function getGlobals(dependencies: Dependency[], options: CompileOptions) {
const { globals, onerror, onwarn } = options;
const globalFn = getGlobalFn(globals);
return dependencies.map(d => {
let name = globalFn(d.source);
if (!name) {
if (d.name.startsWith('__import')) {
const error = new Error(
`Could not determine name for imported module '${d.source}' use options.globals`
);
if (onerror) {
onerror(error);
} else {
throw error;
}
} else {
const warning = {
message: `No name was supplied for imported module '${d.source}'. Guessing '${d.name}', but you should use options.globals`,
};
if (onwarn) {
onwarn(warning);
} else {
console.warn(warning); // eslint-disable-line no-console
}
}
name = d.name;
}
return name;
});
}
function getGlobalFn(globals: any): (id: string) => string {
if (typeof globals === 'function') return globals;
if (typeof globals === 'object') {
return id => globals[id];
}
return () => undefined;
}

@ -61,7 +61,7 @@ export function create(source: string, _options: CompileOptions = {}) {
}
try {
return new Function('return ' + compiled.code)();
return (0,eval)(compiled.code);
} catch (err) {
if (_options.onerror) {
_options.onerror(err);

@ -64,6 +64,9 @@ export interface CompileOptions {
export interface GenerateOptions {
name: string;
format: ModuleFormat;
banner?: string;
sharedPath?: string | boolean;
helpers?: { name: string, alias: string }[];
}
export interface Visitor {

@ -47,10 +47,9 @@ export function reinsertBefore(after, target) {
while (parent.firstChild !== after) target.appendChild(parent.firstChild);
}
// TODO this is out of date
export function destroyEach(iterations, detach, start) {
for (var i = start; i < iterations.length; i += 1) {
if (iterations[i]) iterations[i].destroy(detach);
export function destroyEach(iterations) {
for (var i = 0; i < iterations.length; i += 1) {
if (iterations[i]) iterations[i].destroy();
}
}

@ -0,0 +1,3 @@
const validCalleeObjects = new Set(['this', 'event', 'console']);
export default validCalleeObjects;

@ -1,6 +1,7 @@
import flattenReference from '../../utils/flattenReference';
import list from '../utils/list';
import { Validator } from '../index';
import validCalleeObjects from '../../utils/validCalleeObjects';
import { Node } from '../../interfaces';
const validBuiltins = new Set(['set', 'fire', 'destroy']);
@ -20,7 +21,7 @@ export default function validateEventHandlerCallee(
const { name } = flattenReference(callee);
if (name === 'this' || name === 'event') return;
if (validCalleeObjects.has(name)) return;
if (name === 'refs') {
refCallees.push(callee);
@ -33,7 +34,7 @@ export default function validateEventHandlerCallee(
)
return;
const validCallees = ['this.*', 'event.*'].concat(
const validCallees = ['this.*', 'event.*', 'console.*'].concat(
Array.from(validBuiltins),
Array.from(validator.methods.keys())
);

@ -190,7 +190,6 @@ var proto = {
};
/* generated by Svelte vX.Y.Z */
var template = (function() {
return {
data: function () {

@ -1,5 +1,4 @@
/* generated by Svelte vX.Y.Z */
import { appendNode, assign, createElement, createText, detachNode, init, insertNode, noop, proto, setAttribute } from "svelte/shared.js";
var template = (function() {
@ -69,5 +68,4 @@ function SvelteComponent(options) {
}
assign(SvelteComponent.prototype, proto);
export default SvelteComponent;

@ -166,7 +166,6 @@ var proto = {
};
/* generated by Svelte vX.Y.Z */
var template = (function() {
return {
components: {

@ -1,5 +1,4 @@
/* generated by Svelte vX.Y.Z */
import { assign, callAll, init, noop, proto } from "svelte/shared.js";
var template = (function() {
@ -63,5 +62,4 @@ function SvelteComponent(options) {
}
assign(SvelteComponent.prototype, proto);
export default SvelteComponent;

@ -166,7 +166,6 @@ var proto = {
};
/* generated by Svelte vX.Y.Z */
var template = (function() {
return {
computed: {

@ -1,5 +1,4 @@
/* generated by Svelte vX.Y.Z */
import { assign, differs, init, noop, proto } from "svelte/shared.js";
var template = (function() {
@ -47,5 +46,4 @@ SvelteComponent.prototype._recompute = function _recompute(changed, state) {
if (differs(state.b, (state.b = template.computed.b(state.x)))) changed.b = true;
}
}
export default SvelteComponent;

@ -186,7 +186,6 @@ var proto = {
};
/* generated by Svelte vX.Y.Z */
function encapsulateStyles(node) {
setAttribute(node, "svelte-2363328337", "");
}

@ -1,5 +1,4 @@
/* generated by Svelte vX.Y.Z */
import { appendNode, assign, createElement, detachNode, init, insertNode, noop, proto, setAttribute } from "svelte/shared.js";
function encapsulateStyles(node) {
@ -55,5 +54,4 @@ function SvelteComponent(options) {
}
assign(SvelteComponent.prototype, proto);
export default SvelteComponent;

@ -178,7 +178,6 @@ var proto = {
};
/* generated by Svelte vX.Y.Z */
function create_main_fragment(state, component) {
var div;

@ -1,5 +1,4 @@
/* generated by Svelte vX.Y.Z */
import { assign, createElement, detachNode, init, insertNode, noop, proto } from "svelte/shared.js";
function create_main_fragment(state, component) {
@ -61,5 +60,4 @@ assign(SvelteComponent.prototype, proto, {
this.parentNode.removeChild(this);
}
});
export default SvelteComponent;

@ -31,10 +31,9 @@ function detachAfter(before) {
}
}
// TODO this is out of date
function destroyEach(iterations, detach, start) {
for (var i = start; i < iterations.length; i += 1) {
if (iterations[i]) iterations[i].destroy(detach);
function destroyEach(iterations) {
for (var i = 0; i < iterations.length; i += 1) {
if (iterations[i]) iterations[i].destroy();
}
}
@ -199,7 +198,6 @@ var proto = {
};
/* generated by Svelte vX.Y.Z */
function create_main_fragment(state, component) {
var text, p, text_1;
@ -268,7 +266,7 @@ function create_main_fragment(state, component) {
},
destroy: function() {
destroyEach(each_blocks, false, 0);
destroyEach(each_blocks);
}
};
}

@ -1,5 +1,4 @@
/* generated by Svelte vX.Y.Z */
import { appendNode, assign, createElement, createText, destroyEach, detachAfter, detachNode, init, insertNode, noop, proto } from "svelte/shared.js";
function create_main_fragment(state, component) {
@ -70,7 +69,7 @@ function create_main_fragment(state, component) {
},
destroy: function() {
destroyEach(each_blocks, false, 0);
destroyEach(each_blocks);
}
};
}
@ -153,5 +152,4 @@ function SvelteComponent(options) {
}
assign(SvelteComponent.prototype, proto);
export default SvelteComponent;

@ -178,7 +178,6 @@ var proto = {
};
/* generated by Svelte vX.Y.Z */
var template = (function() {
return {
methods: {

@ -1,5 +1,4 @@
/* generated by Svelte vX.Y.Z */
import { assign, createElement, detachNode, init, insertNode, noop, proto } from "svelte/shared.js";
var template = (function() {
@ -63,5 +62,4 @@ function SvelteComponent(options) {
}
assign(SvelteComponent.prototype, template.methods, proto);
export default SvelteComponent;

@ -182,7 +182,6 @@ var proto = {
};
/* generated by Svelte vX.Y.Z */
function create_main_fragment(state, component) {
var if_block_anchor;

@ -1,5 +1,4 @@
/* generated by Svelte vX.Y.Z */
import { assign, createComment, createElement, detachNode, init, insertNode, noop, proto } from "svelte/shared.js";
function create_main_fragment(state, component) {
@ -102,5 +101,4 @@ function SvelteComponent(options) {
}
assign(SvelteComponent.prototype, proto);
export default SvelteComponent;

@ -182,7 +182,6 @@ var proto = {
};
/* generated by Svelte vX.Y.Z */
function create_main_fragment(state, component) {
var if_block_anchor;

@ -1,5 +1,4 @@
/* generated by Svelte vX.Y.Z */
import { assign, createComment, createElement, detachNode, init, insertNode, noop, proto } from "svelte/shared.js";
function create_main_fragment(state, component) {
@ -78,5 +77,4 @@ function SvelteComponent(options) {
}
assign(SvelteComponent.prototype, proto);
export default SvelteComponent;

@ -182,7 +182,6 @@ var proto = {
};
/* generated by Svelte vX.Y.Z */
function create_main_fragment(state, component) {
var div;

@ -1,5 +1,4 @@
/* generated by Svelte vX.Y.Z */
import { assign, createElement, detachNode, init, insertNode, noop, proto, setStyle } from "svelte/shared.js";
function create_main_fragment(state, component) {
@ -51,5 +50,4 @@ function SvelteComponent(options) {
}
assign(SvelteComponent.prototype, proto);
export default SvelteComponent;

@ -182,7 +182,6 @@ var proto = {
};
/* generated by Svelte vX.Y.Z */
function create_main_fragment(state, component) {
var div;

@ -1,5 +1,4 @@
/* generated by Svelte vX.Y.Z */
import { assign, createElement, detachNode, init, insertNode, noop, proto, setStyle } from "svelte/shared.js";
function create_main_fragment(state, component) {
@ -46,5 +45,4 @@ function SvelteComponent(options) {
}
assign(SvelteComponent.prototype, proto);
export default SvelteComponent;

@ -182,7 +182,6 @@ var proto = {
};
/* generated by Svelte vX.Y.Z */
function create_main_fragment(state, component) {
var div;

@ -1,5 +1,4 @@
/* generated by Svelte vX.Y.Z */
import { assign, createElement, detachNode, init, insertNode, noop, proto, setStyle } from "svelte/shared.js";
function create_main_fragment(state, component) {
@ -46,5 +45,4 @@ function SvelteComponent(options) {
}
assign(SvelteComponent.prototype, proto);
export default SvelteComponent;

@ -182,7 +182,6 @@ var proto = {
};
/* generated by Svelte vX.Y.Z */
function create_main_fragment(state, component) {
var div, text, div_1, div_1_style_value;

@ -1,5 +1,4 @@
/* generated by Svelte vX.Y.Z */
import { assign, createElement, createText, detachNode, init, insertNode, noop, proto } from "svelte/shared.js";
function create_main_fragment(state, component) {
@ -57,5 +56,4 @@ function SvelteComponent(options) {
}
assign(SvelteComponent.prototype, proto);
export default SvelteComponent;

@ -186,7 +186,6 @@ var proto = {
};
/* generated by Svelte vX.Y.Z */
function create_main_fragment(state, component) {
var input;

@ -1,5 +1,4 @@
/* generated by Svelte vX.Y.Z */
import { addListener, assign, createElement, detachNode, init, insertNode, proto, removeListener } from "svelte/shared.js";
function create_main_fragment(state, component) {
@ -53,5 +52,4 @@ function SvelteComponent(options) {
}
assign(SvelteComponent.prototype, proto);
export default SvelteComponent;

@ -184,7 +184,6 @@ var proto = {
};
/* generated by Svelte vX.Y.Z */
function create_main_fragment(state, component) {
var input;

@ -1,5 +1,4 @@
/* generated by Svelte vX.Y.Z */
import { assign, createElement, detachNode, init, insertNode, noop, proto, setInputType } from "svelte/shared.js";
function create_main_fragment(state, component) {
@ -42,5 +41,4 @@ function SvelteComponent(options) {
}
assign(SvelteComponent.prototype, proto);
export default SvelteComponent;

@ -201,7 +201,6 @@ var proto = {
};
/* generated by Svelte vX.Y.Z */
function create_main_fragment(state, component) {
var div;

@ -1,5 +1,4 @@
/* generated by Svelte vX.Y.Z */
import { assign, children, claimElement, createElement, detachNode, init, insertNode, noop, proto } from "svelte/shared.js";
function create_main_fragment(state, component) {
@ -52,5 +51,4 @@ function SvelteComponent(options) {
}
assign(SvelteComponent.prototype, proto);
export default SvelteComponent;

@ -194,7 +194,6 @@ var proto = {
};
/* generated by Svelte vX.Y.Z */
function create_main_fragment(state, component) {
var audio, audio_updating = false, audio_animationframe, audio_paused_value = true;

@ -1,5 +1,4 @@
/* generated by Svelte vX.Y.Z */
import { addListener, assign, callAll, createElement, detachNode, init, insertNode, proto, removeListener, timeRangesToArray } from "svelte/shared.js";
function create_main_fragment(state, component) {
@ -128,5 +127,4 @@ function SvelteComponent(options) {
}
assign(SvelteComponent.prototype, proto);
export default SvelteComponent;

@ -180,7 +180,6 @@ var proto = {
};
/* generated by Svelte vX.Y.Z */
var template = (function() {
return {
components: {

@ -1,8 +1,6 @@
import Imported from 'Imported.html';
/* generated by Svelte vX.Y.Z */
import { assign, callAll, createText, detachNode, init, insertNode, noop, proto } from "svelte/shared.js";
import Imported from 'Imported.html';
var template = (function() {
return {
@ -76,5 +74,4 @@ function SvelteComponent(options) {
}
assign(SvelteComponent.prototype, proto);
export default SvelteComponent;

@ -166,7 +166,6 @@ var proto = {
};
/* generated by Svelte vX.Y.Z */
var template = (function() {
return {
// this test should be removed in v2

@ -1,5 +1,4 @@
/* generated by Svelte vX.Y.Z */
import { assign, callAll, init, noop, proto } from "svelte/shared.js";
var template = (function() {
@ -50,5 +49,4 @@ function SvelteComponent(options) {
}
assign(SvelteComponent.prototype, proto);
export default SvelteComponent;

@ -166,7 +166,6 @@ var proto = {
};
/* generated by Svelte vX.Y.Z */
var template = (function() {
return {
methods: {

@ -1,5 +1,4 @@
/* generated by Svelte vX.Y.Z */
import { assign, init, noop, proto } from "svelte/shared.js";
var template = (function() {
@ -51,5 +50,4 @@ function SvelteComponent(options) {
assign(SvelteComponent.prototype, template.methods, proto);
template.setup(SvelteComponent);
export default SvelteComponent;

@ -190,7 +190,6 @@ var proto = {
};
/* generated by Svelte vX.Y.Z */
function create_main_fragment(state, component) {
var div, text, p, text_2, text_3, text_4, p_1, text_6, text_8, if_block_4_anchor;

@ -1,5 +1,4 @@
/* generated by Svelte vX.Y.Z */
import { appendNode, assign, createComment, createElement, createText, detachNode, init, insertNode, noop, proto } from "svelte/shared.js";
function create_main_fragment(state, component) {
@ -260,5 +259,4 @@ function SvelteComponent(options) {
}
assign(SvelteComponent.prototype, proto);
export default SvelteComponent;

@ -73,11 +73,12 @@ describe("runtime", () => {
);
const { code } = svelte.compile(source, compileOptions);
const startIndex = code.indexOf("function create_main_fragment"); // may change!
if (startIndex === -1)
throw new Error("missing create_main_fragment");
if (startIndex === -1) throw new Error("missing create_main_fragment");
const endIndex = code.lastIndexOf("export default");
const es5 =
code.slice(0, startIndex).split('\n').map(x => spaces(x.length)).join('\n') +
code.slice(startIndex).replace(/export default .+/, "");
code.slice(startIndex, endIndex);
acorn.parse(es5, { ecmaVersion: 5 });
if (/Object\.assign/.test(es5)) {

@ -0,0 +1,23 @@
export default {
data: {
foo: 42
},
html: `
<button>click me</button>
`,
test (assert, component, target, window) {
const button = target.querySelector('button');
const event = new window.MouseEvent('click');
const messages = [];
const log = console.log;
console.log = msg => messages.push(msg);
button.dispatchEvent(event);
console.log = log;
assert.deepEqual(messages, [42]);
}
};

@ -0,0 +1 @@
<button on:click='console.log(foo)'>click me</button>

@ -1,7 +1,8 @@
export function test ({ assert, smc, locateInSource, locateInGenerated }) {
const expected = locateInSource( 'each' );
export function test({ assert, code, smc, locateInSource, locateInGenerated }) {
const startIndex = code.indexOf('create_main_fragment');
const loc = locateInGenerated( 'length' );
const expected = locateInSource('each');
const loc = locateInGenerated('length', startIndex );
const actual = smc.originalPositionFor({
line: loc.line + 1,

@ -1,5 +1,5 @@
[{
"message": "'foo' is an invalid callee (should be one of this.*, event.*, set, fire, destroy or bar). 'foo' exists on 'helpers', did you put it in the wrong place?",
"message": "'foo' is an invalid callee (should be one of this.*, event.*, console.*, set, fire, destroy or bar). 'foo' exists on 'helpers', did you put it in the wrong place?",
"pos": 18,
"loc": {
"line": 1,

@ -1,5 +1,5 @@
[{
"message": "'foo' is an invalid callee (should be one of this.*, event.*, set, fire, destroy or bar)",
"message": "'foo' is an invalid callee (should be one of this.*, event.*, console.*, set, fire, destroy or bar)",
"pos": 18,
"loc": {
"line": 1,

@ -1,5 +1,5 @@
[{
"message": "'resize' is an invalid callee (should be one of this.*, event.*, set, fire or destroy)",
"message": "'resize' is an invalid callee (should be one of this.*, event.*, console.*, set, fire or destroy)",
"loc": {
"line": 1,
"column": 20

Loading…
Cancel
Save