diff --git a/src/parse/index.ts b/src/parse/index.ts index 995a38f675..6711e9929f 100644 --- a/src/parse/index.ts +++ b/src/parse/index.ts @@ -22,6 +22,7 @@ class ParseError extends CompileError { interface ParserOptions { filename?: string; + bind?: boolean; } type ParserState = (parser: Parser) => (ParserState | void); @@ -38,6 +39,8 @@ export class Parser { js: Node; metaTags: {}; + allowBindings: boolean; + constructor(template: string, options: ParserOptions) { if (typeof template !== 'string') { throw new TypeError('Template must be a string'); @@ -46,6 +49,8 @@ export class Parser { this.template = template.replace(/\s+$/, ''); this.filename = options.filename; + this.allowBindings = options.bind !== false; + this.index = 0; this.stack = []; this.metaTags = {}; diff --git a/src/parse/state/tag.ts b/src/parse/state/tag.ts index 1e39a51059..dae32bc3df 100644 --- a/src/parse/state/tag.ts +++ b/src/parse/state/tag.ts @@ -182,6 +182,10 @@ export default function tag(parser: Parser) { let attribute; while ((attribute = readAttribute(parser, uniqueNames))) { + if (attribute.type === 'Binding' && !parser.allowBindings) { + parser.error(`Two-way binding is disabled`, attribute.start); + } + element.attributes.push(attribute); parser.allowWhitespace(); } diff --git a/test/parser/index.js b/test/parser/index.js index 1ce8165009..93060ef1ff 100644 --- a/test/parser/index.js +++ b/test/parser/index.js @@ -1,6 +1,6 @@ import assert from 'assert'; import fs from 'fs'; -import { svelte } from '../helpers.js'; +import { svelte, tryToLoadJson } from '../helpers.js'; describe('parse', () => { fs.readdirSync('test/parser/samples').forEach(dir => { @@ -20,8 +20,10 @@ describe('parse', () => { .readFileSync(`test/parser/samples/${dir}/input.html`, 'utf-8') .replace(/\s+$/, ''); + const options = tryToLoadJson(`test/parser/samples/${dir}/options.json`) || {}; + try { - const actual = svelte.parse(input); + const actual = svelte.parse(input, options); fs.writeFileSync( `test/parser/samples/${dir}/_actual.json`, JSON.stringify(actual, null, '\t') diff --git a/test/parser/samples/error-binding-disabled/error.json b/test/parser/samples/error-binding-disabled/error.json new file mode 100644 index 0000000000..36ad59d26f --- /dev/null +++ b/test/parser/samples/error-binding-disabled/error.json @@ -0,0 +1,8 @@ +{ + "message": "Two-way binding is disabled", + "loc": { + "line": 1, + "column": 7 + }, + "pos": 7 +} \ No newline at end of file diff --git a/test/parser/samples/error-binding-disabled/input.html b/test/parser/samples/error-binding-disabled/input.html new file mode 100644 index 0000000000..6a7bf8566c --- /dev/null +++ b/test/parser/samples/error-binding-disabled/input.html @@ -0,0 +1 @@ + diff --git a/test/parser/samples/error-binding-disabled/options.json b/test/parser/samples/error-binding-disabled/options.json new file mode 100644 index 0000000000..02fc50c2f2 --- /dev/null +++ b/test/parser/samples/error-binding-disabled/options.json @@ -0,0 +1,3 @@ +{ + "bind": false +} \ No newline at end of file