Merge pull request #1059 from sveltejs/gh-54

add option to disable two-way binding
pull/1064/head
Rich Harris 8 years ago committed by GitHub
commit 3a9b3ea31e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -81,6 +81,7 @@ The Svelte compiler optionally takes a second argument, an object of configurati
| `hydratable` | `true`, `false` | Whether to support hydration on the compiled component. | `false` |
| `customElement` | `true`, `false`, `{ tag, props }` | Whether to compile this component to a custom element. If `tag`/`props` are passed, compiles to a custom element and overrides the values exported by the component. | `false` |
| `cascade` | `true`, `false` | Whether to cascade all of the component's styles to child components. If `false`, only selectors wrapped in `:global(...)` and keyframe IDs beginning with `-global-` are cascaded. | `true` |
| `bind` | `boolean` | If `false`, disallows `bind:` directives | `true` |
| | | |
| `shared` | `true`, `false`, `string` | Whether to import various helpers from a shared external library. When you have a project with multiple components, this reduces the overall size of your JavaScript bundle, at the expense of having immediately-usable component. You can pass a string of the module path to use, or `true` will import from `'svelte/shared.js'`. | `false` |
| `legacy` | `true`, `false` | Ensures compatibility with very old browsers, at the cost of some extra code. | `false` |

@ -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 = {};

@ -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();
}

@ -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')

@ -0,0 +1,8 @@
{
"message": "Two-way binding is disabled",
"loc": {
"line": 1,
"column": 7
},
"pos": 7
}
Loading…
Cancel
Save