aboutsummaryrefslogtreecommitdiff
path: root/node_modules/vue/src/compiler/directives
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/vue/src/compiler/directives')
-rw-r--r--node_modules/vue/src/compiler/directives/bind.js11
-rw-r--r--node_modules/vue/src/compiler/directives/index.js11
-rw-r--r--node_modules/vue/src/compiler/directives/model.js148
-rw-r--r--node_modules/vue/src/compiler/directives/on.js10
4 files changed, 180 insertions, 0 deletions
diff --git a/node_modules/vue/src/compiler/directives/bind.js b/node_modules/vue/src/compiler/directives/bind.js
new file mode 100644
index 00000000..e1035727
--- /dev/null
+++ b/node_modules/vue/src/compiler/directives/bind.js
@@ -0,0 +1,11 @@
+/* @flow */
+
+export default function bind (el: ASTElement, dir: ASTDirective) {
+ el.wrapData = (code: string) => {
+ return `_b(${code},'${el.tag}',${dir.value},${
+ dir.modifiers && dir.modifiers.prop ? 'true' : 'false'
+ }${
+ dir.modifiers && dir.modifiers.sync ? ',true' : ''
+ })`
+ }
+}
diff --git a/node_modules/vue/src/compiler/directives/index.js b/node_modules/vue/src/compiler/directives/index.js
new file mode 100644
index 00000000..8f4342c0
--- /dev/null
+++ b/node_modules/vue/src/compiler/directives/index.js
@@ -0,0 +1,11 @@
+/* @flow */
+
+import on from './on'
+import bind from './bind'
+import { noop } from 'shared/util'
+
+export default {
+ on,
+ bind,
+ cloak: noop
+}
diff --git a/node_modules/vue/src/compiler/directives/model.js b/node_modules/vue/src/compiler/directives/model.js
new file mode 100644
index 00000000..39bdbfda
--- /dev/null
+++ b/node_modules/vue/src/compiler/directives/model.js
@@ -0,0 +1,148 @@
+/* @flow */
+
+/**
+ * Cross-platform code generation for component v-model
+ */
+export function genComponentModel (
+ el: ASTElement,
+ value: string,
+ modifiers: ?ASTModifiers
+): ?boolean {
+ const { number, trim } = modifiers || {}
+
+ const baseValueExpression = '$$v'
+ let valueExpression = baseValueExpression
+ if (trim) {
+ valueExpression =
+ `(typeof ${baseValueExpression} === 'string'` +
+ `? ${baseValueExpression}.trim()` +
+ `: ${baseValueExpression})`
+ }
+ if (number) {
+ valueExpression = `_n(${valueExpression})`
+ }
+ const assignment = genAssignmentCode(value, valueExpression)
+
+ el.model = {
+ value: `(${value})`,
+ expression: `"${value}"`,
+ callback: `function (${baseValueExpression}) {${assignment}}`
+ }
+}
+
+/**
+ * Cross-platform codegen helper for generating v-model value assignment code.
+ */
+export function genAssignmentCode (
+ value: string,
+ assignment: string
+): string {
+ const res = parseModel(value)
+ if (res.key === null) {
+ return `${value}=${assignment}`
+ } else {
+ return `$set(${res.exp}, ${res.key}, ${assignment})`
+ }
+}
+
+/**
+ * Parse a v-model expression into a base path and a final key segment.
+ * Handles both dot-path and possible square brackets.
+ *
+ * Possible cases:
+ *
+ * - test
+ * - test[key]
+ * - test[test1[key]]
+ * - test["a"][key]
+ * - xxx.test[a[a].test1[key]]
+ * - test.xxx.a["asa"][test1[key]]
+ *
+ */
+
+let len, str, chr, index, expressionPos, expressionEndPos
+
+type ModelParseResult = {
+ exp: string,
+ key: string | null
+}
+
+export function parseModel (val: string): ModelParseResult {
+ // Fix https://github.com/vuejs/vue/pull/7730
+ // allow v-model="obj.val " (trailing whitespace)
+ val = val.trim()
+ len = val.length
+
+ if (val.indexOf('[') < 0 || val.lastIndexOf(']') < len - 1) {
+ index = val.lastIndexOf('.')
+ if (index > -1) {
+ return {
+ exp: val.slice(0, index),
+ key: '"' + val.slice(index + 1) + '"'
+ }
+ } else {
+ return {
+ exp: val,
+ key: null
+ }
+ }
+ }
+
+ str = val
+ index = expressionPos = expressionEndPos = 0
+
+ while (!eof()) {
+ chr = next()
+ /* istanbul ignore if */
+ if (isStringStart(chr)) {
+ parseString(chr)
+ } else if (chr === 0x5B) {
+ parseBracket(chr)
+ }
+ }
+
+ return {
+ exp: val.slice(0, expressionPos),
+ key: val.slice(expressionPos + 1, expressionEndPos)
+ }
+}
+
+function next (): number {
+ return str.charCodeAt(++index)
+}
+
+function eof (): boolean {
+ return index >= len
+}
+
+function isStringStart (chr: number): boolean {
+ return chr === 0x22 || chr === 0x27
+}
+
+function parseBracket (chr: number): void {
+ let inBracket = 1
+ expressionPos = index
+ while (!eof()) {
+ chr = next()
+ if (isStringStart(chr)) {
+ parseString(chr)
+ continue
+ }
+ if (chr === 0x5B) inBracket++
+ if (chr === 0x5D) inBracket--
+ if (inBracket === 0) {
+ expressionEndPos = index
+ break
+ }
+ }
+}
+
+function parseString (chr: number): void {
+ const stringQuote = chr
+ while (!eof()) {
+ chr = next()
+ if (chr === stringQuote) {
+ break
+ }
+ }
+}
diff --git a/node_modules/vue/src/compiler/directives/on.js b/node_modules/vue/src/compiler/directives/on.js
new file mode 100644
index 00000000..893a678e
--- /dev/null
+++ b/node_modules/vue/src/compiler/directives/on.js
@@ -0,0 +1,10 @@
+/* @flow */
+
+import { warn } from 'core/util/index'
+
+export default function on (el: ASTElement, dir: ASTDirective) {
+ if (process.env.NODE_ENV !== 'production' && dir.modifiers) {
+ warn(`v-on without argument does not support modifiers.`)
+ }
+ el.wrapListeners = (code: string) => `_g(${code},${dir.value})`
+}