From f19fba5bebbb11466146a44fe10052ac36a0bd8a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Teemu=20Po=CC=88ntelin?= Date: Thu, 29 Sep 2016 15:17:38 +0300 Subject: [PATCH] Replace React integration demo with proper documentation --- demo/common.html | 32 - demo/index.html | 56 - demo/js_dependencies/JSXTransformer.js | 15924 ------------------ demo/js_dependencies/react.min.js | 15 - demo/react-demo-embed.html | 64 - demo/react.html | 148 - docs/integrations/img/react-integration.png | Bin 0 -> 225915 bytes docs/integrations/integrations-react.adoc | 121 + tasks/docsite.js | 57 +- 9 files changed, 123 insertions(+), 16294 deletions(-) delete mode 100644 demo/common.html delete mode 100644 demo/index.html delete mode 100644 demo/js_dependencies/JSXTransformer.js delete mode 100644 demo/js_dependencies/react.min.js delete mode 100644 demo/react-demo-embed.html delete mode 100644 demo/react.html create mode 100644 docs/integrations/img/react-integration.png create mode 100644 docs/integrations/integrations-react.adoc diff --git a/demo/common.html b/demo/common.html deleted file mode 100644 index 1bdf32f..0000000 --- a/demo/common.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - diff --git a/demo/index.html b/demo/index.html deleted file mode 100644 index dc16077..0000000 --- a/demo/index.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - Vaadin Core Elements Code Examples - - - - - - - - - - - - -
-
- - - - diff --git a/demo/js_dependencies/JSXTransformer.js b/demo/js_dependencies/JSXTransformer.js deleted file mode 100644 index 63608d4..0000000 --- a/demo/js_dependencies/JSXTransformer.js +++ /dev/null @@ -1,15924 +0,0 @@ -/** - * JSXTransformer v0.13.0 - */ -(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.JSXTransformer = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o - * @license MIT - */ - -var base64 = _dereq_('base64-js') -var ieee754 = _dereq_('ieee754') -var isArray = _dereq_('is-array') - -exports.Buffer = Buffer -exports.SlowBuffer = SlowBuffer -exports.INSPECT_MAX_BYTES = 50 -Buffer.poolSize = 8192 // not used by this implementation - -var kMaxLength = 0x3fffffff -var rootParent = {} - -/** - * If `Buffer.TYPED_ARRAY_SUPPORT`: - * === true Use Uint8Array implementation (fastest) - * === false Use Object implementation (most compatible, even IE6) - * - * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, - * Opera 11.6+, iOS 4.2+. - * - * Note: - * - * - Implementation must support adding new properties to `Uint8Array` instances. - * Firefox 4-29 lacked support, fixed in Firefox 30+. - * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. - * - * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. - * - * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of - * incorrect length in some situations. - * - * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they will - * get the Object implementation, which is slower but will work correctly. - */ -Buffer.TYPED_ARRAY_SUPPORT = (function () { - try { - var buf = new ArrayBuffer(0) - var arr = new Uint8Array(buf) - arr.foo = function () { return 42 } - return arr.foo() === 42 && // typed array instances can be augmented - typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` - new Uint8Array(1).subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` - } catch (e) { - return false - } -})() - -/** - * Class: Buffer - * ============= - * - * The Buffer constructor returns instances of `Uint8Array` that are augmented - * with function properties for all the node `Buffer` API functions. We use - * `Uint8Array` so that square bracket notation works as expected -- it returns - * a single octet. - * - * By augmenting the instances, we can avoid modifying the `Uint8Array` - * prototype. - */ -function Buffer (subject, encoding, noZero) { - if (!(this instanceof Buffer)) return new Buffer(subject, encoding, noZero) - - var type = typeof subject - var length - - if (type === 'number') { - length = +subject - } else if (type === 'string') { - length = Buffer.byteLength(subject, encoding) - } else if (type === 'object' && subject !== null) { - // assume object is array-like - if (subject.type === 'Buffer' && isArray(subject.data)) subject = subject.data - length = +subject.length - } else { - throw new TypeError('must start with number, buffer, array or string') - } - - if (length > kMaxLength) { - throw new RangeError('Attempt to allocate Buffer larger than maximum size: 0x' + - kMaxLength.toString(16) + ' bytes') - } - - if (length < 0) length = 0 - else length >>>= 0 // coerce to uint32 - - var self = this - if (Buffer.TYPED_ARRAY_SUPPORT) { - // Preferred: Return an augmented `Uint8Array` instance for best performance - /*eslint-disable consistent-this */ - self = Buffer._augment(new Uint8Array(length)) - /*eslint-enable consistent-this */ - } else { - // Fallback: Return THIS instance of Buffer (created by `new`) - self.length = length - self._isBuffer = true - } - - var i - if (Buffer.TYPED_ARRAY_SUPPORT && typeof subject.byteLength === 'number') { - // Speed optimization -- use set if we're copying from a typed array - self._set(subject) - } else if (isArrayish(subject)) { - // Treat array-ish objects as a byte array - if (Buffer.isBuffer(subject)) { - for (i = 0; i < length; i++) { - self[i] = subject.readUInt8(i) - } - } else { - for (i = 0; i < length; i++) { - self[i] = ((subject[i] % 256) + 256) % 256 - } - } - } else if (type === 'string') { - self.write(subject, 0, encoding) - } else if (type === 'number' && !Buffer.TYPED_ARRAY_SUPPORT && !noZero) { - for (i = 0; i < length; i++) { - self[i] = 0 - } - } - - if (length > 0 && length <= Buffer.poolSize) self.parent = rootParent - - return self -} - -function SlowBuffer (subject, encoding, noZero) { - if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding, noZero) - - var buf = new Buffer(subject, encoding, noZero) - delete buf.parent - return buf -} - -Buffer.isBuffer = function isBuffer (b) { - return !!(b != null && b._isBuffer) -} - -Buffer.compare = function compare (a, b) { - if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { - throw new TypeError('Arguments must be Buffers') - } - - if (a === b) return 0 - - var x = a.length - var y = b.length - for (var i = 0, len = Math.min(x, y); i < len && a[i] === b[i]; i++) {} - if (i !== len) { - x = a[i] - y = b[i] - } - if (x < y) return -1 - if (y < x) return 1 - return 0 -} - -Buffer.isEncoding = function isEncoding (encoding) { - switch (String(encoding).toLowerCase()) { - case 'hex': - case 'utf8': - case 'utf-8': - case 'ascii': - case 'binary': - case 'base64': - case 'raw': - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return true - default: - return false - } -} - -Buffer.concat = function concat (list, totalLength) { - if (!isArray(list)) throw new TypeError('Usage: Buffer.concat(list[, length])') - - if (list.length === 0) { - return new Buffer(0) - } else if (list.length === 1) { - return list[0] - } - - var i - if (totalLength === undefined) { - totalLength = 0 - for (i = 0; i < list.length; i++) { - totalLength += list[i].length - } - } - - var buf = new Buffer(totalLength) - var pos = 0 - for (i = 0; i < list.length; i++) { - var item = list[i] - item.copy(buf, pos) - pos += item.length - } - return buf -} - -Buffer.byteLength = function byteLength (str, encoding) { - var ret - str = str + '' - switch (encoding || 'utf8') { - case 'ascii': - case 'binary': - case 'raw': - ret = str.length - break - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - ret = str.length * 2 - break - case 'hex': - ret = str.length >>> 1 - break - case 'utf8': - case 'utf-8': - ret = utf8ToBytes(str).length - break - case 'base64': - ret = base64ToBytes(str).length - break - default: - ret = str.length - } - return ret -} - -// pre-set for values that may exist in the future -Buffer.prototype.length = undefined -Buffer.prototype.parent = undefined - -// toString(encoding, start=0, end=buffer.length) -Buffer.prototype.toString = function toString (encoding, start, end) { - var loweredCase = false - - start = start >>> 0 - end = end === undefined || end === Infinity ? this.length : end >>> 0 - - if (!encoding) encoding = 'utf8' - if (start < 0) start = 0 - if (end > this.length) end = this.length - if (end <= start) return '' - - while (true) { - switch (encoding) { - case 'hex': - return hexSlice(this, start, end) - - case 'utf8': - case 'utf-8': - return utf8Slice(this, start, end) - - case 'ascii': - return asciiSlice(this, start, end) - - case 'binary': - return binarySlice(this, start, end) - - case 'base64': - return base64Slice(this, start, end) - - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return utf16leSlice(this, start, end) - - default: - if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) - encoding = (encoding + '').toLowerCase() - loweredCase = true - } - } -} - -Buffer.prototype.equals = function equals (b) { - if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') - if (this === b) return true - return Buffer.compare(this, b) === 0 -} - -Buffer.prototype.inspect = function inspect () { - var str = '' - var max = exports.INSPECT_MAX_BYTES - if (this.length > 0) { - str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') - if (this.length > max) str += ' ... ' - } - return '' -} - -Buffer.prototype.compare = function compare (b) { - if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') - if (this === b) return 0 - return Buffer.compare(this, b) -} - -Buffer.prototype.indexOf = function indexOf (val, byteOffset) { - if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff - else if (byteOffset < -0x80000000) byteOffset = -0x80000000 - byteOffset >>= 0 - - if (this.length === 0) return -1 - if (byteOffset >= this.length) return -1 - - // Negative offsets start from the end of the buffer - if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0) - - if (typeof val === 'string') { - if (val.length === 0) return -1 // special case: looking for empty string always fails - return String.prototype.indexOf.call(this, val, byteOffset) - } - if (Buffer.isBuffer(val)) { - return arrayIndexOf(this, val, byteOffset) - } - if (typeof val === 'number') { - if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') { - return Uint8Array.prototype.indexOf.call(this, val, byteOffset) - } - return arrayIndexOf(this, [ val ], byteOffset) - } - - function arrayIndexOf (arr, val, byteOffset) { - var foundIndex = -1 - for (var i = 0; byteOffset + i < arr.length; i++) { - if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) { - if (foundIndex === -1) foundIndex = i - if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex - } else { - foundIndex = -1 - } - } - return -1 - } - - throw new TypeError('val must be string, number or Buffer') -} - -// `get` will be removed in Node 0.13+ -Buffer.prototype.get = function get (offset) { - console.log('.get() is deprecated. Access using array indexes instead.') - return this.readUInt8(offset) -} - -// `set` will be removed in Node 0.13+ -Buffer.prototype.set = function set (v, offset) { - console.log('.set() is deprecated. Access using array indexes instead.') - return this.writeUInt8(v, offset) -} - -function hexWrite (buf, string, offset, length) { - offset = Number(offset) || 0 - var remaining = buf.length - offset - if (!length) { - length = remaining - } else { - length = Number(length) - if (length > remaining) { - length = remaining - } - } - - // must be an even number of digits - var strLen = string.length - if (strLen % 2 !== 0) throw new Error('Invalid hex string') - - if (length > strLen / 2) { - length = strLen / 2 - } - for (var i = 0; i < length; i++) { - var parsed = parseInt(string.substr(i * 2, 2), 16) - if (isNaN(parsed)) throw new Error('Invalid hex string') - buf[offset + i] = parsed - } - return i -} - -function utf8Write (buf, string, offset, length) { - var charsWritten = blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) - return charsWritten -} - -function asciiWrite (buf, string, offset, length) { - var charsWritten = blitBuffer(asciiToBytes(string), buf, offset, length) - return charsWritten -} - -function binaryWrite (buf, string, offset, length) { - return asciiWrite(buf, string, offset, length) -} - -function base64Write (buf, string, offset, length) { - var charsWritten = blitBuffer(base64ToBytes(string), buf, offset, length) - return charsWritten -} - -function utf16leWrite (buf, string, offset, length) { - var charsWritten = blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) - return charsWritten -} - -Buffer.prototype.write = function write (string, offset, length, encoding) { - // Support both (string, offset, length, encoding) - // and the legacy (string, encoding, offset, length) - if (isFinite(offset)) { - if (!isFinite(length)) { - encoding = length - length = undefined - } - } else { // legacy - var swap = encoding - encoding = offset - offset = length - length = swap - } - - offset = Number(offset) || 0 - - if (length < 0 || offset < 0 || offset > this.length) { - throw new RangeError('attempt to write outside buffer bounds') - } - - var remaining = this.length - offset - if (!length) { - length = remaining - } else { - length = Number(length) - if (length > remaining) { - length = remaining - } - } - encoding = String(encoding || 'utf8').toLowerCase() - - var ret - switch (encoding) { - case 'hex': - ret = hexWrite(this, string, offset, length) - break - case 'utf8': - case 'utf-8': - ret = utf8Write(this, string, offset, length) - break - case 'ascii': - ret = asciiWrite(this, string, offset, length) - break - case 'binary': - ret = binaryWrite(this, string, offset, length) - break - case 'base64': - ret = base64Write(this, string, offset, length) - break - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - ret = utf16leWrite(this, string, offset, length) - break - default: - throw new TypeError('Unknown encoding: ' + encoding) - } - return ret -} - -Buffer.prototype.toJSON = function toJSON () { - return { - type: 'Buffer', - data: Array.prototype.slice.call(this._arr || this, 0) - } -} - -function base64Slice (buf, start, end) { - if (start === 0 && end === buf.length) { - return base64.fromByteArray(buf) - } else { - return base64.fromByteArray(buf.slice(start, end)) - } -} - -function utf8Slice (buf, start, end) { - var res = '' - var tmp = '' - end = Math.min(buf.length, end) - - for (var i = start; i < end; i++) { - if (buf[i] <= 0x7F) { - res += decodeUtf8Char(tmp) + String.fromCharCode(buf[i]) - tmp = '' - } else { - tmp += '%' + buf[i].toString(16) - } - } - - return res + decodeUtf8Char(tmp) -} - -function asciiSlice (buf, start, end) { - var ret = '' - end = Math.min(buf.length, end) - - for (var i = start; i < end; i++) { - ret += String.fromCharCode(buf[i] & 0x7F) - } - return ret -} - -function binarySlice (buf, start, end) { - var ret = '' - end = Math.min(buf.length, end) - - for (var i = start; i < end; i++) { - ret += String.fromCharCode(buf[i]) - } - return ret -} - -function hexSlice (buf, start, end) { - var len = buf.length - - if (!start || start < 0) start = 0 - if (!end || end < 0 || end > len) end = len - - var out = '' - for (var i = start; i < end; i++) { - out += toHex(buf[i]) - } - return out -} - -function utf16leSlice (buf, start, end) { - var bytes = buf.slice(start, end) - var res = '' - for (var i = 0; i < bytes.length; i += 2) { - res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256) - } - return res -} - -Buffer.prototype.slice = function slice (start, end) { - var len = this.length - start = ~~start - end = end === undefined ? len : ~~end - - if (start < 0) { - start += len - if (start < 0) start = 0 - } else if (start > len) { - start = len - } - - if (end < 0) { - end += len - if (end < 0) end = 0 - } else if (end > len) { - end = len - } - - if (end < start) end = start - - var newBuf - if (Buffer.TYPED_ARRAY_SUPPORT) { - newBuf = Buffer._augment(this.subarray(start, end)) - } else { - var sliceLen = end - start - newBuf = new Buffer(sliceLen, undefined, true) - for (var i = 0; i < sliceLen; i++) { - newBuf[i] = this[i + start] - } - } - - if (newBuf.length) newBuf.parent = this.parent || this - - return newBuf -} - -/* - * Need to make sure that buffer isn't trying to write out of bounds. - */ -function checkOffset (offset, ext, length) { - if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') - if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') -} - -Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) checkOffset(offset, byteLength, this.length) - - var val = this[offset] - var mul = 1 - var i = 0 - while (++i < byteLength && (mul *= 0x100)) { - val += this[offset + i] * mul - } - - return val -} - -Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) { - checkOffset(offset, byteLength, this.length) - } - - var val = this[offset + --byteLength] - var mul = 1 - while (byteLength > 0 && (mul *= 0x100)) { - val += this[offset + --byteLength] * mul - } - - return val -} - -Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { - if (!noAssert) checkOffset(offset, 1, this.length) - return this[offset] -} - -Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length) - return this[offset] | (this[offset + 1] << 8) -} - -Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length) - return (this[offset] << 8) | this[offset + 1] -} - -Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - - return ((this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16)) + - (this[offset + 3] * 0x1000000) -} - -Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - - return (this[offset] * 0x1000000) + - ((this[offset + 1] << 16) | - (this[offset + 2] << 8) | - this[offset + 3]) -} - -Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) checkOffset(offset, byteLength, this.length) - - var val = this[offset] - var mul = 1 - var i = 0 - while (++i < byteLength && (mul *= 0x100)) { - val += this[offset + i] * mul - } - mul *= 0x80 - - if (val >= mul) val -= Math.pow(2, 8 * byteLength) - - return val -} - -Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) checkOffset(offset, byteLength, this.length) - - var i = byteLength - var mul = 1 - var val = this[offset + --i] - while (i > 0 && (mul *= 0x100)) { - val += this[offset + --i] * mul - } - mul *= 0x80 - - if (val >= mul) val -= Math.pow(2, 8 * byteLength) - - return val -} - -Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { - if (!noAssert) checkOffset(offset, 1, this.length) - if (!(this[offset] & 0x80)) return (this[offset]) - return ((0xff - this[offset] + 1) * -1) -} - -Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length) - var val = this[offset] | (this[offset + 1] << 8) - return (val & 0x8000) ? val | 0xFFFF0000 : val -} - -Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length) - var val = this[offset + 1] | (this[offset] << 8) - return (val & 0x8000) ? val | 0xFFFF0000 : val -} - -Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - - return (this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16) | - (this[offset + 3] << 24) -} - -Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - - return (this[offset] << 24) | - (this[offset + 1] << 16) | - (this[offset + 2] << 8) | - (this[offset + 3]) -} - -Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - return ieee754.read(this, offset, true, 23, 4) -} - -Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - return ieee754.read(this, offset, false, 23, 4) -} - -Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 8, this.length) - return ieee754.read(this, offset, true, 52, 8) -} - -Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 8, this.length) - return ieee754.read(this, offset, false, 52, 8) -} - -function checkInt (buf, value, offset, ext, max, min) { - if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance') - if (value > max || value < min) throw new RangeError('value is out of bounds') - if (offset + ext > buf.length) throw new RangeError('index out of range') -} - -Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { - value = +value - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) - - var mul = 1 - var i = 0 - this[offset] = value & 0xFF - while (++i < byteLength && (mul *= 0x100)) { - this[offset + i] = (value / mul) >>> 0 & 0xFF - } - - return offset + byteLength -} - -Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { - value = +value - offset = offset >>> 0 - byteLength = byteLength >>> 0 - if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) - - var i = byteLength - 1 - var mul = 1 - this[offset + i] = value & 0xFF - while (--i >= 0 && (mul *= 0x100)) { - this[offset + i] = (value / mul) >>> 0 & 0xFF - } - - return offset + byteLength -} - -Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) - if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) - this[offset] = value - return offset + 1 -} - -function objectWriteUInt16 (buf, value, offset, littleEndian) { - if (value < 0) value = 0xffff + value + 1 - for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) { - buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> - (littleEndian ? i : 1 - i) * 8 - } -} - -Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = value - this[offset + 1] = (value >>> 8) - } else { - objectWriteUInt16(this, value, offset, true) - } - return offset + 2 -} - -Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 8) - this[offset + 1] = value - } else { - objectWriteUInt16(this, value, offset, false) - } - return offset + 2 -} - -function objectWriteUInt32 (buf, value, offset, littleEndian) { - if (value < 0) value = 0xffffffff + value + 1 - for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) { - buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff - } -} - -Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset + 3] = (value >>> 24) - this[offset + 2] = (value >>> 16) - this[offset + 1] = (value >>> 8) - this[offset] = value - } else { - objectWriteUInt32(this, value, offset, true) - } - return offset + 4 -} - -Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 24) - this[offset + 1] = (value >>> 16) - this[offset + 2] = (value >>> 8) - this[offset + 3] = value - } else { - objectWriteUInt32(this, value, offset, false) - } - return offset + 4 -} - -Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) { - checkInt( - this, value, offset, byteLength, - Math.pow(2, 8 * byteLength - 1) - 1, - -Math.pow(2, 8 * byteLength - 1) - ) - } - - var i = 0 - var mul = 1 - var sub = value < 0 ? 1 : 0 - this[offset] = value & 0xFF - while (++i < byteLength && (mul *= 0x100)) { - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF - } - - return offset + byteLength -} - -Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) { - checkInt( - this, value, offset, byteLength, - Math.pow(2, 8 * byteLength - 1) - 1, - -Math.pow(2, 8 * byteLength - 1) - ) - } - - var i = byteLength - 1 - var mul = 1 - var sub = value < 0 ? 1 : 0 - this[offset + i] = value & 0xFF - while (--i >= 0 && (mul *= 0x100)) { - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF - } - - return offset + byteLength -} - -Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) - if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) - if (value < 0) value = 0xff + value + 1 - this[offset] = value - return offset + 1 -} - -Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = value - this[offset + 1] = (value >>> 8) - } else { - objectWriteUInt16(this, value, offset, true) - } - return offset + 2 -} - -Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 8) - this[offset + 1] = value - } else { - objectWriteUInt16(this, value, offset, false) - } - return offset + 2 -} - -Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = value - this[offset + 1] = (value >>> 8) - this[offset + 2] = (value >>> 16) - this[offset + 3] = (value >>> 24) - } else { - objectWriteUInt32(this, value, offset, true) - } - return offset + 4 -} - -Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { - value = +value - offset = offset >>> 0 - if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) - if (value < 0) value = 0xffffffff + value + 1 - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 24) - this[offset + 1] = (value >>> 16) - this[offset + 2] = (value >>> 8) - this[offset + 3] = value - } else { - objectWriteUInt32(this, value, offset, false) - } - return offset + 4 -} - -function checkIEEE754 (buf, value, offset, ext, max, min) { - if (value > max || value < min) throw new RangeError('value is out of bounds') - if (offset + ext > buf.length) throw new RangeError('index out of range') - if (offset < 0) throw new RangeError('index out of range') -} - -function writeFloat (buf, value, offset, littleEndian, noAssert) { - if (!noAssert) { - checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) - } - ieee754.write(buf, value, offset, littleEndian, 23, 4) - return offset + 4 -} - -Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { - return writeFloat(this, value, offset, true, noAssert) -} - -Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { - return writeFloat(this, value, offset, false, noAssert) -} - -function writeDouble (buf, value, offset, littleEndian, noAssert) { - if (!noAssert) { - checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) - } - ieee754.write(buf, value, offset, littleEndian, 52, 8) - return offset + 8 -} - -Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { - return writeDouble(this, value, offset, true, noAssert) -} - -Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { - return writeDouble(this, value, offset, false, noAssert) -} - -// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) -Buffer.prototype.copy = function copy (target, target_start, start, end) { - var self = this // source - - if (!start) start = 0 - if (!end && end !== 0) end = this.length - if (target_start >= target.length) target_start = target.length - if (!target_start) target_start = 0 - if (end > 0 && end < start) end = start - - // Copy 0 bytes; we're done - if (end === start) return 0 - if (target.length === 0 || self.length === 0) return 0 - - // Fatal error conditions - if (target_start < 0) { - throw new RangeError('targetStart out of bounds') - } - if (start < 0 || start >= self.length) throw new RangeError('sourceStart out of bounds') - if (end < 0) throw new RangeError('sourceEnd out of bounds') - - // Are we oob? - if (end > this.length) end = this.length - if (target.length - target_start < end - start) { - end = target.length - target_start + start - } - - var len = end - start - - if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { - for (var i = 0; i < len; i++) { - target[i + target_start] = this[i + start] - } - } else { - target._set(this.subarray(start, start + len), target_start) - } - - return len -} - -// fill(value, start=0, end=buffer.length) -Buffer.prototype.fill = function fill (value, start, end) { - if (!value) value = 0 - if (!start) start = 0 - if (!end) end = this.length - - if (end < start) throw new RangeError('end < start') - - // Fill 0 bytes; we're done - if (end === start) return - if (this.length === 0) return - - if (start < 0 || start >= this.length) throw new RangeError('start out of bounds') - if (end < 0 || end > this.length) throw new RangeError('end out of bounds') - - var i - if (typeof value === 'number') { - for (i = start; i < end; i++) { - this[i] = value - } - } else { - var bytes = utf8ToBytes(value.toString()) - var len = bytes.length - for (i = start; i < end; i++) { - this[i] = bytes[i % len] - } - } - - return this -} - -/** - * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance. - * Added in Node 0.12. Only available in browsers that support ArrayBuffer. - */ -Buffer.prototype.toArrayBuffer = function toArrayBuffer () { - if (typeof Uint8Array !== 'undefined') { - if (Buffer.TYPED_ARRAY_SUPPORT) { - return (new Buffer(this)).buffer - } else { - var buf = new Uint8Array(this.length) - for (var i = 0, len = buf.length; i < len; i += 1) { - buf[i] = this[i] - } - return buf.buffer - } - } else { - throw new TypeError('Buffer.toArrayBuffer not supported in this browser') - } -} - -// HELPER FUNCTIONS -// ================ - -var BP = Buffer.prototype - -/** - * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods - */ -Buffer._augment = function _augment (arr) { - arr.constructor = Buffer - arr._isBuffer = true - - // save reference to original Uint8Array get/set methods before overwriting - arr._get = arr.get - arr._set = arr.set - - // deprecated, will be removed in node 0.13+ - arr.get = BP.get - arr.set = BP.set - - arr.write = BP.write - arr.toString = BP.toString - arr.toLocaleString = BP.toString - arr.toJSON = BP.toJSON - arr.equals = BP.equals - arr.compare = BP.compare - arr.indexOf = BP.indexOf - arr.copy = BP.copy - arr.slice = BP.slice - arr.readUIntLE = BP.readUIntLE - arr.readUIntBE = BP.readUIntBE - arr.readUInt8 = BP.readUInt8 - arr.readUInt16LE = BP.readUInt16LE - arr.readUInt16BE = BP.readUInt16BE - arr.readUInt32LE = BP.readUInt32LE - arr.readUInt32BE = BP.readUInt32BE - arr.readIntLE = BP.readIntLE - arr.readIntBE = BP.readIntBE - arr.readInt8 = BP.readInt8 - arr.readInt16LE = BP.readInt16LE - arr.readInt16BE = BP.readInt16BE - arr.readInt32LE = BP.readInt32LE - arr.readInt32BE = BP.readInt32BE - arr.readFloatLE = BP.readFloatLE - arr.readFloatBE = BP.readFloatBE - arr.readDoubleLE = BP.readDoubleLE - arr.readDoubleBE = BP.readDoubleBE - arr.writeUInt8 = BP.writeUInt8 - arr.writeUIntLE = BP.writeUIntLE - arr.writeUIntBE = BP.writeUIntBE - arr.writeUInt16LE = BP.writeUInt16LE - arr.writeUInt16BE = BP.writeUInt16BE - arr.writeUInt32LE = BP.writeUInt32LE - arr.writeUInt32BE = BP.writeUInt32BE - arr.writeIntLE = BP.writeIntLE - arr.writeIntBE = BP.writeIntBE - arr.writeInt8 = BP.writeInt8 - arr.writeInt16LE = BP.writeInt16LE - arr.writeInt16BE = BP.writeInt16BE - arr.writeInt32LE = BP.writeInt32LE - arr.writeInt32BE = BP.writeInt32BE - arr.writeFloatLE = BP.writeFloatLE - arr.writeFloatBE = BP.writeFloatBE - arr.writeDoubleLE = BP.writeDoubleLE - arr.writeDoubleBE = BP.writeDoubleBE - arr.fill = BP.fill - arr.inspect = BP.inspect - arr.toArrayBuffer = BP.toArrayBuffer - - return arr -} - -var INVALID_BASE64_RE = /[^+\/0-9A-z\-]/g - -function base64clean (str) { - // Node strips out invalid characters like \n and \t from the string, base64-js does not - str = stringtrim(str).replace(INVALID_BASE64_RE, '') - // Node converts strings with length < 2 to '' - if (str.length < 2) return '' - // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not - while (str.length % 4 !== 0) { - str = str + '=' - } - return str -} - -function stringtrim (str) { - if (str.trim) return str.trim() - return str.replace(/^\s+|\s+$/g, '') -} - -function isArrayish (subject) { - return isArray(subject) || Buffer.isBuffer(subject) || - subject && typeof subject === 'object' && - typeof subject.length === 'number' -} - -function toHex (n) { - if (n < 16) return '0' + n.toString(16) - return n.toString(16) -} - -function utf8ToBytes (string, units) { - units = units || Infinity - var codePoint - var length = string.length - var leadSurrogate = null - var bytes = [] - var i = 0 - - for (; i < length; i++) { - codePoint = string.charCodeAt(i) - - // is surrogate component - if (codePoint > 0xD7FF && codePoint < 0xE000) { - // last char was a lead - if (leadSurrogate) { - // 2 leads in a row - if (codePoint < 0xDC00) { - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - leadSurrogate = codePoint - continue - } else { - // valid surrogate pair - codePoint = leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00 | 0x10000 - leadSurrogate = null - } - } else { - // no lead yet - - if (codePoint > 0xDBFF) { - // unexpected trail - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - continue - } else if (i + 1 === length) { - // unpaired lead - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - continue - } else { - // valid lead - leadSurrogate = codePoint - continue - } - } - } else if (leadSurrogate) { - // valid bmp char, but last char was a lead - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - leadSurrogate = null - } - - // encode utf8 - if (codePoint < 0x80) { - if ((units -= 1) < 0) break - bytes.push(codePoint) - } else if (codePoint < 0x800) { - if ((units -= 2) < 0) break - bytes.push( - codePoint >> 0x6 | 0xC0, - codePoint & 0x3F | 0x80 - ) - } else if (codePoint < 0x10000) { - if ((units -= 3) < 0) break - bytes.push( - codePoint >> 0xC | 0xE0, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ) - } else if (codePoint < 0x200000) { - if ((units -= 4) < 0) break - bytes.push( - codePoint >> 0x12 | 0xF0, - codePoint >> 0xC & 0x3F | 0x80, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ) - } else { - throw new Error('Invalid code point') - } - } - - return bytes -} - -function asciiToBytes (str) { - var byteArray = [] - for (var i = 0; i < str.length; i++) { - // Node's code seems to be doing this and not & 0x7F.. - byteArray.push(str.charCodeAt(i) & 0xFF) - } - return byteArray -} - -function utf16leToBytes (str, units) { - var c, hi, lo - var byteArray = [] - for (var i = 0; i < str.length; i++) { - if ((units -= 2) < 0) break - - c = str.charCodeAt(i) - hi = c >> 8 - lo = c % 256 - byteArray.push(lo) - byteArray.push(hi) - } - - return byteArray -} - -function base64ToBytes (str) { - return base64.toByteArray(base64clean(str)) -} - -function blitBuffer (src, dst, offset, length) { - for (var i = 0; i < length; i++) { - if ((i + offset >= dst.length) || (i >= src.length)) break - dst[i + offset] = src[i] - } - return i -} - -function decodeUtf8Char (str) { - try { - return decodeURIComponent(str) - } catch (err) { - return String.fromCharCode(0xFFFD) // UTF 8 invalid char - } -} - -},{"base64-js":4,"ieee754":5,"is-array":6}],4:[function(_dereq_,module,exports){ -var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; - -;(function (exports) { - 'use strict'; - - var Arr = (typeof Uint8Array !== 'undefined') - ? Uint8Array - : Array - - var PLUS = '+'.charCodeAt(0) - var SLASH = '/'.charCodeAt(0) - var NUMBER = '0'.charCodeAt(0) - var LOWER = 'a'.charCodeAt(0) - var UPPER = 'A'.charCodeAt(0) - var PLUS_URL_SAFE = '-'.charCodeAt(0) - var SLASH_URL_SAFE = '_'.charCodeAt(0) - - function decode (elt) { - var code = elt.charCodeAt(0) - if (code === PLUS || - code === PLUS_URL_SAFE) - return 62 // '+' - if (code === SLASH || - code === SLASH_URL_SAFE) - return 63 // '/' - if (code < NUMBER) - return -1 //no match - if (code < NUMBER + 10) - return code - NUMBER + 26 + 26 - if (code < UPPER + 26) - return code - UPPER - if (code < LOWER + 26) - return code - LOWER + 26 - } - - function b64ToByteArray (b64) { - var i, j, l, tmp, placeHolders, arr - - if (b64.length % 4 > 0) { - throw new Error('Invalid string. Length must be a multiple of 4') - } - - // the number of equal signs (place holders) - // if there are two placeholders, than the two characters before it - // represent one byte - // if there is only one, then the three characters before it represent 2 bytes - // this is just a cheap hack to not do indexOf twice - var len = b64.length - placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0 - - // base64 is 4/3 + up to two characters of the original data - arr = new Arr(b64.length * 3 / 4 - placeHolders) - - // if there are placeholders, only get up to the last complete 4 chars - l = placeHolders > 0 ? b64.length - 4 : b64.length - - var L = 0 - - function push (v) { - arr[L++] = v - } - - for (i = 0, j = 0; i < l; i += 4, j += 3) { - tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3)) - push((tmp & 0xFF0000) >> 16) - push((tmp & 0xFF00) >> 8) - push(tmp & 0xFF) - } - - if (placeHolders === 2) { - tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4) - push(tmp & 0xFF) - } else if (placeHolders === 1) { - tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2) - push((tmp >> 8) & 0xFF) - push(tmp & 0xFF) - } - - return arr - } - - function uint8ToBase64 (uint8) { - var i, - extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes - output = "", - temp, length - - function encode (num) { - return lookup.charAt(num) - } - - function tripletToBase64 (num) { - return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F) - } - - // go through the array every three bytes, we'll deal with trailing stuff later - for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) { - temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) - output += tripletToBase64(temp) - } - - // pad the end with zeros, but make sure to not forget the extra bytes - switch (extraBytes) { - case 1: - temp = uint8[uint8.length - 1] - output += encode(temp >> 2) - output += encode((temp << 4) & 0x3F) - output += '==' - break - case 2: - temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1]) - output += encode(temp >> 10) - output += encode((temp >> 4) & 0x3F) - output += encode((temp << 2) & 0x3F) - output += '=' - break - } - - return output - } - - exports.toByteArray = b64ToByteArray - exports.fromByteArray = uint8ToBase64 -}(typeof exports === 'undefined' ? (this.base64js = {}) : exports)) - -},{}],5:[function(_dereq_,module,exports){ -exports.read = function(buffer, offset, isLE, mLen, nBytes) { - var e, m, - eLen = nBytes * 8 - mLen - 1, - eMax = (1 << eLen) - 1, - eBias = eMax >> 1, - nBits = -7, - i = isLE ? (nBytes - 1) : 0, - d = isLE ? -1 : 1, - s = buffer[offset + i]; - - i += d; - - e = s & ((1 << (-nBits)) - 1); - s >>= (-nBits); - nBits += eLen; - for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8); - - m = e & ((1 << (-nBits)) - 1); - e >>= (-nBits); - nBits += mLen; - for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8); - - if (e === 0) { - e = 1 - eBias; - } else if (e === eMax) { - return m ? NaN : ((s ? -1 : 1) * Infinity); - } else { - m = m + Math.pow(2, mLen); - e = e - eBias; - } - return (s ? -1 : 1) * m * Math.pow(2, e - mLen); -}; - -exports.write = function(buffer, value, offset, isLE, mLen, nBytes) { - var e, m, c, - eLen = nBytes * 8 - mLen - 1, - eMax = (1 << eLen) - 1, - eBias = eMax >> 1, - rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0), - i = isLE ? 0 : (nBytes - 1), - d = isLE ? 1 : -1, - s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0; - - value = Math.abs(value); - - if (isNaN(value) || value === Infinity) { - m = isNaN(value) ? 1 : 0; - e = eMax; - } else { - e = Math.floor(Math.log(value) / Math.LN2); - if (value * (c = Math.pow(2, -e)) < 1) { - e--; - c *= 2; - } - if (e + eBias >= 1) { - value += rt / c; - } else { - value += rt * Math.pow(2, 1 - eBias); - } - if (value * c >= 2) { - e++; - c /= 2; - } - - if (e + eBias >= eMax) { - m = 0; - e = eMax; - } else if (e + eBias >= 1) { - m = (value * c - 1) * Math.pow(2, mLen); - e = e + eBias; - } else { - m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); - e = 0; - } - } - - for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8); - - e = (e << mLen) | m; - eLen += mLen; - for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8); - - buffer[offset + i - d] |= s * 128; -}; - -},{}],6:[function(_dereq_,module,exports){ - -/** - * isArray - */ - -var isArray = Array.isArray; - -/** - * toString - */ - -var str = Object.prototype.toString; - -/** - * Whether or not the given `val` - * is an array. - * - * example: - * - * isArray([]); - * // > true - * isArray(arguments); - * // > false - * isArray(''); - * // > false - * - * @param {mixed} val - * @return {bool} - */ - -module.exports = isArray || function (val) { - return !! val && '[object Array]' == str.call(val); -}; - -},{}],7:[function(_dereq_,module,exports){ -(function (process){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// resolves . and .. elements in a path array with directory names there -// must be no slashes, empty elements, or device names (c:\) in the array -// (so also no leading and trailing slashes - it does not distinguish -// relative and absolute paths) -function normalizeArray(parts, allowAboveRoot) { - // if the path tries to go above the root, `up` ends up > 0 - var up = 0; - for (var i = parts.length - 1; i >= 0; i--) { - var last = parts[i]; - if (last === '.') { - parts.splice(i, 1); - } else if (last === '..') { - parts.splice(i, 1); - up++; - } else if (up) { - parts.splice(i, 1); - up--; - } - } - - // if the path is allowed to go above the root, restore leading ..s - if (allowAboveRoot) { - for (; up--; up) { - parts.unshift('..'); - } - } - - return parts; -} - -// Split a filename into [root, dir, basename, ext], unix version -// 'root' is just a slash, or nothing. -var splitPathRe = - /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; -var splitPath = function(filename) { - return splitPathRe.exec(filename).slice(1); -}; - -// path.resolve([from ...], to) -// posix version -exports.resolve = function() { - var resolvedPath = '', - resolvedAbsolute = false; - - for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { - var path = (i >= 0) ? arguments[i] : process.cwd(); - - // Skip empty and invalid entries - if (typeof path !== 'string') { - throw new TypeError('Arguments to path.resolve must be strings'); - } else if (!path) { - continue; - } - - resolvedPath = path + '/' + resolvedPath; - resolvedAbsolute = path.charAt(0) === '/'; - } - - // At this point the path should be resolved to a full absolute path, but - // handle relative paths to be safe (might happen when process.cwd() fails) - - // Normalize the path - resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { - return !!p; - }), !resolvedAbsolute).join('/'); - - return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; -}; - -// path.normalize(path) -// posix version -exports.normalize = function(path) { - var isAbsolute = exports.isAbsolute(path), - trailingSlash = substr(path, -1) === '/'; - - // Normalize the path - path = normalizeArray(filter(path.split('/'), function(p) { - return !!p; - }), !isAbsolute).join('/'); - - if (!path && !isAbsolute) { - path = '.'; - } - if (path && trailingSlash) { - path += '/'; - } - - return (isAbsolute ? '/' : '') + path; -}; - -// posix version -exports.isAbsolute = function(path) { - return path.charAt(0) === '/'; -}; - -// posix version -exports.join = function() { - var paths = Array.prototype.slice.call(arguments, 0); - return exports.normalize(filter(paths, function(p, index) { - if (typeof p !== 'string') { - throw new TypeError('Arguments to path.join must be strings'); - } - return p; - }).join('/')); -}; - - -// path.relative(from, to) -// posix version -exports.relative = function(from, to) { - from = exports.resolve(from).substr(1); - to = exports.resolve(to).substr(1); - - function trim(arr) { - var start = 0; - for (; start < arr.length; start++) { - if (arr[start] !== '') break; - } - - var end = arr.length - 1; - for (; end >= 0; end--) { - if (arr[end] !== '') break; - } - - if (start > end) return []; - return arr.slice(start, end - start + 1); - } - - var fromParts = trim(from.split('/')); - var toParts = trim(to.split('/')); - - var length = Math.min(fromParts.length, toParts.length); - var samePartsLength = length; - for (var i = 0; i < length; i++) { - if (fromParts[i] !== toParts[i]) { - samePartsLength = i; - break; - } - } - - var outputParts = []; - for (var i = samePartsLength; i < fromParts.length; i++) { - outputParts.push('..'); - } - - outputParts = outputParts.concat(toParts.slice(samePartsLength)); - - return outputParts.join('/'); -}; - -exports.sep = '/'; -exports.delimiter = ':'; - -exports.dirname = function(path) { - var result = splitPath(path), - root = result[0], - dir = result[1]; - - if (!root && !dir) { - // No dirname whatsoever - return '.'; - } - - if (dir) { - // It has a dirname, strip trailing slash - dir = dir.substr(0, dir.length - 1); - } - - return root + dir; -}; - - -exports.basename = function(path, ext) { - var f = splitPath(path)[2]; - // TODO: make this comparison case-insensitive on windows? - if (ext && f.substr(-1 * ext.length) === ext) { - f = f.substr(0, f.length - ext.length); - } - return f; -}; - - -exports.extname = function(path) { - return splitPath(path)[3]; -}; - -function filter (xs, f) { - if (xs.filter) return xs.filter(f); - var res = []; - for (var i = 0; i < xs.length; i++) { - if (f(xs[i], i, xs)) res.push(xs[i]); - } - return res; -} - -// String.prototype.substr - negative index don't work in IE8 -var substr = 'ab'.substr(-1) === 'b' - ? function (str, start, len) { return str.substr(start, len) } - : function (str, start, len) { - if (start < 0) start = str.length + start; - return str.substr(start, len); - } -; - -}).call(this,_dereq_('_process')) -},{"_process":8}],8:[function(_dereq_,module,exports){ -// shim for using process in browser - -var process = module.exports = {}; -var queue = []; -var draining = false; - -function drainQueue() { - if (draining) { - return; - } - draining = true; - var currentQueue; - var len = queue.length; - while(len) { - currentQueue = queue; - queue = []; - var i = -1; - while (++i < len) { - currentQueue[i](); - } - len = queue.length; - } - draining = false; -} -process.nextTick = function (fun) { - queue.push(fun); - if (!draining) { - setTimeout(drainQueue, 0); - } -}; - -process.title = 'browser'; -process.browser = true; -process.env = {}; -process.argv = []; -process.version = ''; // empty string to avoid regexp issues -process.versions = {}; - -function noop() {} - -process.on = noop; -process.addListener = noop; -process.once = noop; -process.off = noop; -process.removeListener = noop; -process.removeAllListeners = noop; -process.emit = noop; - -process.binding = function (name) { - throw new Error('process.binding is not supported'); -}; - -// TODO(shtylman) -process.cwd = function () { return '/' }; -process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); -}; -process.umask = function() { return 0; }; - -},{}],9:[function(_dereq_,module,exports){ -/* - Copyright (C) 2013 Ariya Hidayat - Copyright (C) 2013 Thaddee Tyl - Copyright (C) 2012 Ariya Hidayat - Copyright (C) 2012 Mathias Bynens - Copyright (C) 2012 Joost-Wim Boekesteijn - Copyright (C) 2012 Kris Kowal - Copyright (C) 2012 Yusuke Suzuki - Copyright (C) 2012 Arpad Borsos - Copyright (C) 2011 Ariya Hidayat - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -(function (root, factory) { - 'use strict'; - - // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js, - // Rhino, and plain browser loading. - - /* istanbul ignore next */ - if (typeof define === 'function' && define.amd) { - define(['exports'], factory); - } else if (typeof exports !== 'undefined') { - factory(exports); - } else { - factory((root.esprima = {})); - } -}(this, function (exports) { - 'use strict'; - - var Token, - TokenName, - FnExprTokens, - Syntax, - PropertyKind, - Messages, - Regex, - SyntaxTreeDelegate, - XHTMLEntities, - ClassPropertyType, - source, - strict, - index, - lineNumber, - lineStart, - length, - delegate, - lookahead, - state, - extra; - - Token = { - BooleanLiteral: 1, - EOF: 2, - Identifier: 3, - Keyword: 4, - NullLiteral: 5, - NumericLiteral: 6, - Punctuator: 7, - StringLiteral: 8, - RegularExpression: 9, - Template: 10, - JSXIdentifier: 11, - JSXText: 12 - }; - - TokenName = {}; - TokenName[Token.BooleanLiteral] = 'Boolean'; - TokenName[Token.EOF] = ''; - TokenName[Token.Identifier] = 'Identifier'; - TokenName[Token.Keyword] = 'Keyword'; - TokenName[Token.NullLiteral] = 'Null'; - TokenName[Token.NumericLiteral] = 'Numeric'; - TokenName[Token.Punctuator] = 'Punctuator'; - TokenName[Token.StringLiteral] = 'String'; - TokenName[Token.JSXIdentifier] = 'JSXIdentifier'; - TokenName[Token.JSXText] = 'JSXText'; - TokenName[Token.RegularExpression] = 'RegularExpression'; - - // A function following one of those tokens is an expression. - FnExprTokens = ['(', '{', '[', 'in', 'typeof', 'instanceof', 'new', - 'return', 'case', 'delete', 'throw', 'void', - // assignment operators - '=', '+=', '-=', '*=', '/=', '%=', '<<=', '>>=', '>>>=', - '&=', '|=', '^=', ',', - // binary/unary operators - '+', '-', '*', '/', '%', '++', '--', '<<', '>>', '>>>', '&', - '|', '^', '!', '~', '&&', '||', '?', ':', '===', '==', '>=', - '<=', '<', '>', '!=', '!==']; - - Syntax = { - AnyTypeAnnotation: 'AnyTypeAnnotation', - ArrayExpression: 'ArrayExpression', - ArrayPattern: 'ArrayPattern', - ArrayTypeAnnotation: 'ArrayTypeAnnotation', - ArrowFunctionExpression: 'ArrowFunctionExpression', - AssignmentExpression: 'AssignmentExpression', - BinaryExpression: 'BinaryExpression', - BlockStatement: 'BlockStatement', - BooleanTypeAnnotation: 'BooleanTypeAnnotation', - BreakStatement: 'BreakStatement', - CallExpression: 'CallExpression', - CatchClause: 'CatchClause', - ClassBody: 'ClassBody', - ClassDeclaration: 'ClassDeclaration', - ClassExpression: 'ClassExpression', - ClassImplements: 'ClassImplements', - ClassProperty: 'ClassProperty', - ComprehensionBlock: 'ComprehensionBlock', - ComprehensionExpression: 'ComprehensionExpression', - ConditionalExpression: 'ConditionalExpression', - ContinueStatement: 'ContinueStatement', - DebuggerStatement: 'DebuggerStatement', - DeclareClass: 'DeclareClass', - DeclareFunction: 'DeclareFunction', - DeclareModule: 'DeclareModule', - DeclareVariable: 'DeclareVariable', - DoWhileStatement: 'DoWhileStatement', - EmptyStatement: 'EmptyStatement', - ExportDeclaration: 'ExportDeclaration', - ExportBatchSpecifier: 'ExportBatchSpecifier', - ExportSpecifier: 'ExportSpecifier', - ExpressionStatement: 'ExpressionStatement', - ForInStatement: 'ForInStatement', - ForOfStatement: 'ForOfStatement', - ForStatement: 'ForStatement', - FunctionDeclaration: 'FunctionDeclaration', - FunctionExpression: 'FunctionExpression', - FunctionTypeAnnotation: 'FunctionTypeAnnotation', - FunctionTypeParam: 'FunctionTypeParam', - GenericTypeAnnotation: 'GenericTypeAnnotation', - Identifier: 'Identifier', - IfStatement: 'IfStatement', - ImportDeclaration: 'ImportDeclaration', - ImportDefaultSpecifier: 'ImportDefaultSpecifier', - ImportNamespaceSpecifier: 'ImportNamespaceSpecifier', - ImportSpecifier: 'ImportSpecifier', - InterfaceDeclaration: 'InterfaceDeclaration', - InterfaceExtends: 'InterfaceExtends', - IntersectionTypeAnnotation: 'IntersectionTypeAnnotation', - LabeledStatement: 'LabeledStatement', - Literal: 'Literal', - LogicalExpression: 'LogicalExpression', - MemberExpression: 'MemberExpression', - MethodDefinition: 'MethodDefinition', - ModuleSpecifier: 'ModuleSpecifier', - NewExpression: 'NewExpression', - NullableTypeAnnotation: 'NullableTypeAnnotation', - NumberTypeAnnotation: 'NumberTypeAnnotation', - ObjectExpression: 'ObjectExpression', - ObjectPattern: 'ObjectPattern', - ObjectTypeAnnotation: 'ObjectTypeAnnotation', - ObjectTypeCallProperty: 'ObjectTypeCallProperty', - ObjectTypeIndexer: 'ObjectTypeIndexer', - ObjectTypeProperty: 'ObjectTypeProperty', - Program: 'Program', - Property: 'Property', - QualifiedTypeIdentifier: 'QualifiedTypeIdentifier', - ReturnStatement: 'ReturnStatement', - SequenceExpression: 'SequenceExpression', - SpreadElement: 'SpreadElement', - SpreadProperty: 'SpreadProperty', - StringLiteralTypeAnnotation: 'StringLiteralTypeAnnotation', - StringTypeAnnotation: 'StringTypeAnnotation', - SwitchCase: 'SwitchCase', - SwitchStatement: 'SwitchStatement', - TaggedTemplateExpression: 'TaggedTemplateExpression', - TemplateElement: 'TemplateElement', - TemplateLiteral: 'TemplateLiteral', - ThisExpression: 'ThisExpression', - ThrowStatement: 'ThrowStatement', - TupleTypeAnnotation: 'TupleTypeAnnotation', - TryStatement: 'TryStatement', - TypeAlias: 'TypeAlias', - TypeAnnotation: 'TypeAnnotation', - TypeCastExpression: 'TypeCastExpression', - TypeofTypeAnnotation: 'TypeofTypeAnnotation', - TypeParameterDeclaration: 'TypeParameterDeclaration', - TypeParameterInstantiation: 'TypeParameterInstantiation', - UnaryExpression: 'UnaryExpression', - UnionTypeAnnotation: 'UnionTypeAnnotation', - UpdateExpression: 'UpdateExpression', - VariableDeclaration: 'VariableDeclaration', - VariableDeclarator: 'VariableDeclarator', - VoidTypeAnnotation: 'VoidTypeAnnotation', - WhileStatement: 'WhileStatement', - WithStatement: 'WithStatement', - JSXIdentifier: 'JSXIdentifier', - JSXNamespacedName: 'JSXNamespacedName', - JSXMemberExpression: 'JSXMemberExpression', - JSXEmptyExpression: 'JSXEmptyExpression', - JSXExpressionContainer: 'JSXExpressionContainer', - JSXElement: 'JSXElement', - JSXClosingElement: 'JSXClosingElement', - JSXOpeningElement: 'JSXOpeningElement', - JSXAttribute: 'JSXAttribute', - JSXSpreadAttribute: 'JSXSpreadAttribute', - JSXText: 'JSXText', - YieldExpression: 'YieldExpression', - AwaitExpression: 'AwaitExpression' - }; - - PropertyKind = { - Data: 1, - Get: 2, - Set: 4 - }; - - ClassPropertyType = { - 'static': 'static', - prototype: 'prototype' - }; - - // Error messages should be identical to V8. - Messages = { - UnexpectedToken: 'Unexpected token %0', - UnexpectedNumber: 'Unexpected number', - UnexpectedString: 'Unexpected string', - UnexpectedIdentifier: 'Unexpected identifier', - UnexpectedReserved: 'Unexpected reserved word', - UnexpectedTemplate: 'Unexpected quasi %0', - UnexpectedEOS: 'Unexpected end of input', - NewlineAfterThrow: 'Illegal newline after throw', - InvalidRegExp: 'Invalid regular expression', - UnterminatedRegExp: 'Invalid regular expression: missing /', - InvalidLHSInAssignment: 'Invalid left-hand side in assignment', - InvalidLHSInFormalsList: 'Invalid left-hand side in formals list', - InvalidLHSInForIn: 'Invalid left-hand side in for-in', - MultipleDefaultsInSwitch: 'More than one default clause in switch statement', - NoCatchOrFinally: 'Missing catch or finally after try', - UnknownLabel: 'Undefined label \'%0\'', - Redeclaration: '%0 \'%1\' has already been declared', - IllegalContinue: 'Illegal continue statement', - IllegalBreak: 'Illegal break statement', - IllegalDuplicateClassProperty: 'Illegal duplicate property in class definition', - IllegalClassConstructorProperty: 'Illegal constructor property in class definition', - IllegalReturn: 'Illegal return statement', - IllegalSpread: 'Illegal spread element', - StrictModeWith: 'Strict mode code may not include a with statement', - StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode', - StrictVarName: 'Variable name may not be eval or arguments in strict mode', - StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode', - StrictParamDupe: 'Strict mode function may not have duplicate parameter names', - ParameterAfterRestParameter: 'Rest parameter must be final parameter of an argument list', - DefaultRestParameter: 'Rest parameter can not have a default value', - ElementAfterSpreadElement: 'Spread must be the final element of an element list', - PropertyAfterSpreadProperty: 'A rest property must be the final property of an object literal', - ObjectPatternAsRestParameter: 'Invalid rest parameter', - ObjectPatternAsSpread: 'Invalid spread argument', - StrictFunctionName: 'Function name may not be eval or arguments in strict mode', - StrictOctalLiteral: 'Octal literals are not allowed in strict mode.', - StrictDelete: 'Delete of an unqualified identifier in strict mode.', - StrictDuplicateProperty: 'Duplicate data property in object literal not allowed in strict mode', - AccessorDataProperty: 'Object literal may not have data and accessor property with the same name', - AccessorGetSet: 'Object literal may not have multiple get/set accessors with the same name', - StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode', - StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode', - StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode', - StrictReservedWord: 'Use of future reserved word in strict mode', - MissingFromClause: 'Missing from clause', - NoAsAfterImportNamespace: 'Missing as after import *', - InvalidModuleSpecifier: 'Invalid module specifier', - IllegalImportDeclaration: 'Illegal import declaration', - IllegalExportDeclaration: 'Illegal export declaration', - NoUninitializedConst: 'Const must be initialized', - ComprehensionRequiresBlock: 'Comprehension must have at least one block', - ComprehensionError: 'Comprehension Error', - EachNotAllowed: 'Each is not supported', - InvalidJSXAttributeValue: 'JSX value should be either an expression or a quoted JSX text', - ExpectedJSXClosingTag: 'Expected corresponding JSX closing tag for %0', - AdjacentJSXElements: 'Adjacent JSX elements must be wrapped in an enclosing tag', - ConfusedAboutFunctionType: 'Unexpected token =>. It looks like ' + - 'you are trying to write a function type, but you ended up ' + - 'writing a grouped type followed by an =>, which is a syntax ' + - 'error. Remember, function type parameters are named so function ' + - 'types look like (name1: type1, name2: type2) => returnType. You ' + - 'probably wrote (type1) => returnType' - }; - - // See also tools/generate-unicode-regex.py. - Regex = { - NonAsciiIdentifierStart: new RegExp('[\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]'), - NonAsciiIdentifierPart: new RegExp('[\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0300-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u0483-\u0487\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u0669\u066e-\u06d3\u06d5-\u06dc\u06df-\u06e8\u06ea-\u06fc\u06ff\u0710-\u074a\u074d-\u07b1\u07c0-\u07f5\u07fa\u0800-\u082d\u0840-\u085b\u08a0\u08a2-\u08ac\u08e4-\u08fe\u0900-\u0963\u0966-\u096f\u0971-\u0977\u0979-\u097f\u0981-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7\u09c8\u09cb-\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09e6-\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b66-\u0b6f\u0b71\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bef\u0c01-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c58\u0c59\u0c60-\u0c63\u0c66-\u0c6f\u0c82\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1\u0cf2\u0d02\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4e\u0d57\u0d60-\u0d63\u0d66-\u0d6f\u0d7a-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf\u0f00\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e-\u0f47\u0f49-\u0f6c\u0f71-\u0f84\u0f86-\u0f97\u0f99-\u0fbc\u0fc6\u1000-\u1049\u1050-\u109d\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135d-\u135f\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772\u1773\u1780-\u17d3\u17d7\u17dc\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191c\u1920-\u192b\u1930-\u193b\u1946-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19d9\u1a00-\u1a1b\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa7\u1b00-\u1b4b\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1bf3\u1c00-\u1c37\u1c40-\u1c49\u1c4d-\u1c7d\u1cd0-\u1cd2\u1cd4-\u1cf6\u1d00-\u1de6\u1dfc-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u200c\u200d\u203f\u2040\u2054\u2071\u207f\u2090-\u209c\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d7f-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2de0-\u2dff\u2e2f\u3005-\u3007\u3021-\u302f\u3031-\u3035\u3038-\u303c\u3041-\u3096\u3099\u309a\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua62b\ua640-\ua66f\ua674-\ua67d\ua67f-\ua697\ua69f-\ua6f1\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua827\ua840-\ua873\ua880-\ua8c4\ua8d0-\ua8d9\ua8e0-\ua8f7\ua8fb\ua900-\ua92d\ua930-\ua953\ua960-\ua97c\ua980-\ua9c0\ua9cf-\ua9d9\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa60-\uaa76\uaa7a\uaa7b\uaa80-\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf6\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabea\uabec\uabed\uabf0-\uabf9\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe00-\ufe0f\ufe20-\ufe26\ufe33\ufe34\ufe4d-\ufe4f\ufe70-\ufe74\ufe76-\ufefc\uff10-\uff19\uff21-\uff3a\uff3f\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]'), - LeadingZeros: new RegExp('^0+(?!$)') - }; - - // Ensure the condition is true, otherwise throw an error. - // This is only to have a better contract semantic, i.e. another safety net - // to catch a logic error. The condition shall be fulfilled in normal case. - // Do NOT use this to enforce a certain condition on any user input. - - function assert(condition, message) { - /* istanbul ignore if */ - if (!condition) { - throw new Error('ASSERT: ' + message); - } - } - - function StringMap() { - this.$data = {}; - } - - StringMap.prototype.get = function (key) { - key = '$' + key; - return this.$data[key]; - }; - - StringMap.prototype.set = function (key, value) { - key = '$' + key; - this.$data[key] = value; - return this; - }; - - StringMap.prototype.has = function (key) { - key = '$' + key; - return Object.prototype.hasOwnProperty.call(this.$data, key); - }; - - StringMap.prototype["delete"] = function (key) { - key = '$' + key; - return delete this.$data[key]; - }; - - function isDecimalDigit(ch) { - return (ch >= 48 && ch <= 57); // 0..9 - } - - function isHexDigit(ch) { - return '0123456789abcdefABCDEF'.indexOf(ch) >= 0; - } - - function isOctalDigit(ch) { - return '01234567'.indexOf(ch) >= 0; - } - - - // 7.2 White Space - - function isWhiteSpace(ch) { - return (ch === 32) || // space - (ch === 9) || // tab - (ch === 0xB) || - (ch === 0xC) || - (ch === 0xA0) || - (ch >= 0x1680 && '\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\uFEFF'.indexOf(String.fromCharCode(ch)) > 0); - } - - // 7.3 Line Terminators - - function isLineTerminator(ch) { - return (ch === 10) || (ch === 13) || (ch === 0x2028) || (ch === 0x2029); - } - - // 7.6 Identifier Names and Identifiers - - function isIdentifierStart(ch) { - return (ch === 36) || (ch === 95) || // $ (dollar) and _ (underscore) - (ch >= 65 && ch <= 90) || // A..Z - (ch >= 97 && ch <= 122) || // a..z - (ch === 92) || // \ (backslash) - ((ch >= 0x80) && Regex.NonAsciiIdentifierStart.test(String.fromCharCode(ch))); - } - - function isIdentifierPart(ch) { - return (ch === 36) || (ch === 95) || // $ (dollar) and _ (underscore) - (ch >= 65 && ch <= 90) || // A..Z - (ch >= 97 && ch <= 122) || // a..z - (ch >= 48 && ch <= 57) || // 0..9 - (ch === 92) || // \ (backslash) - ((ch >= 0x80) && Regex.NonAsciiIdentifierPart.test(String.fromCharCode(ch))); - } - - // 7.6.1.2 Future Reserved Words - - function isFutureReservedWord(id) { - switch (id) { - case 'class': - case 'enum': - case 'export': - case 'extends': - case 'import': - case 'super': - return true; - default: - return false; - } - } - - function isStrictModeReservedWord(id) { - switch (id) { - case 'implements': - case 'interface': - case 'package': - case 'private': - case 'protected': - case 'public': - case 'static': - case 'yield': - case 'let': - return true; - default: - return false; - } - } - - function isRestrictedWord(id) { - return id === 'eval' || id === 'arguments'; - } - - // 7.6.1.1 Keywords - - function isKeyword(id) { - if (strict && isStrictModeReservedWord(id)) { - return true; - } - - // 'const' is specialized as Keyword in V8. - // 'yield' is only treated as a keyword in strict mode. - // 'let' is for compatiblity with SpiderMonkey and ES.next. - // Some others are from future reserved words. - - switch (id.length) { - case 2: - return (id === 'if') || (id === 'in') || (id === 'do'); - case 3: - return (id === 'var') || (id === 'for') || (id === 'new') || - (id === 'try') || (id === 'let'); - case 4: - return (id === 'this') || (id === 'else') || (id === 'case') || - (id === 'void') || (id === 'with') || (id === 'enum'); - case 5: - return (id === 'while') || (id === 'break') || (id === 'catch') || - (id === 'throw') || (id === 'const') || - (id === 'class') || (id === 'super'); - case 6: - return (id === 'return') || (id === 'typeof') || (id === 'delete') || - (id === 'switch') || (id === 'export') || (id === 'import'); - case 7: - return (id === 'default') || (id === 'finally') || (id === 'extends'); - case 8: - return (id === 'function') || (id === 'continue') || (id === 'debugger'); - case 10: - return (id === 'instanceof'); - default: - return false; - } - } - - // 7.4 Comments - - function addComment(type, value, start, end, loc) { - var comment; - assert(typeof start === 'number', 'Comment must have valid position'); - - // Because the way the actual token is scanned, often the comments - // (if any) are skipped twice during the lexical analysis. - // Thus, we need to skip adding a comment if the comment array already - // handled it. - if (state.lastCommentStart >= start) { - return; - } - state.lastCommentStart = start; - - comment = { - type: type, - value: value - }; - if (extra.range) { - comment.range = [start, end]; - } - if (extra.loc) { - comment.loc = loc; - } - extra.comments.push(comment); - if (extra.attachComment) { - extra.leadingComments.push(comment); - extra.trailingComments.push(comment); - } - } - - function skipSingleLineComment() { - var start, loc, ch, comment; - - start = index - 2; - loc = { - start: { - line: lineNumber, - column: index - lineStart - 2 - } - }; - - while (index < length) { - ch = source.charCodeAt(index); - ++index; - if (isLineTerminator(ch)) { - if (extra.comments) { - comment = source.slice(start + 2, index - 1); - loc.end = { - line: lineNumber, - column: index - lineStart - 1 - }; - addComment('Line', comment, start, index - 1, loc); - } - if (ch === 13 && source.charCodeAt(index) === 10) { - ++index; - } - ++lineNumber; - lineStart = index; - return; - } - } - - if (extra.comments) { - comment = source.slice(start + 2, index); - loc.end = { - line: lineNumber, - column: index - lineStart - }; - addComment('Line', comment, start, index, loc); - } - } - - function skipMultiLineComment() { - var start, loc, ch, comment; - - if (extra.comments) { - start = index - 2; - loc = { - start: { - line: lineNumber, - column: index - lineStart - 2 - } - }; - } - - while (index < length) { - ch = source.charCodeAt(index); - if (isLineTerminator(ch)) { - if (ch === 13 && source.charCodeAt(index + 1) === 10) { - ++index; - } - ++lineNumber; - ++index; - lineStart = index; - if (index >= length) { - throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); - } - } else if (ch === 42) { - // Block comment ends with '*/' (char #42, char #47). - if (source.charCodeAt(index + 1) === 47) { - ++index; - ++index; - if (extra.comments) { - comment = source.slice(start + 2, index - 2); - loc.end = { - line: lineNumber, - column: index - lineStart - }; - addComment('Block', comment, start, index, loc); - } - return; - } - ++index; - } else { - ++index; - } - } - - throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); - } - - function skipComment() { - var ch; - - while (index < length) { - ch = source.charCodeAt(index); - - if (isWhiteSpace(ch)) { - ++index; - } else if (isLineTerminator(ch)) { - ++index; - if (ch === 13 && source.charCodeAt(index) === 10) { - ++index; - } - ++lineNumber; - lineStart = index; - } else if (ch === 47) { // 47 is '/' - ch = source.charCodeAt(index + 1); - if (ch === 47) { - ++index; - ++index; - skipSingleLineComment(); - } else if (ch === 42) { // 42 is '*' - ++index; - ++index; - skipMultiLineComment(); - } else { - break; - } - } else { - break; - } - } - } - - function scanHexEscape(prefix) { - var i, len, ch, code = 0; - - len = (prefix === 'u') ? 4 : 2; - for (i = 0; i < len; ++i) { - if (index < length && isHexDigit(source[index])) { - ch = source[index++]; - code = code * 16 + '0123456789abcdef'.indexOf(ch.toLowerCase()); - } else { - return ''; - } - } - return String.fromCharCode(code); - } - - function scanUnicodeCodePointEscape() { - var ch, code, cu1, cu2; - - ch = source[index]; - code = 0; - - // At least, one hex digit is required. - if (ch === '}') { - throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); - } - - while (index < length) { - ch = source[index++]; - if (!isHexDigit(ch)) { - break; - } - code = code * 16 + '0123456789abcdef'.indexOf(ch.toLowerCase()); - } - - if (code > 0x10FFFF || ch !== '}') { - throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); - } - - // UTF-16 Encoding - if (code <= 0xFFFF) { - return String.fromCharCode(code); - } - cu1 = ((code - 0x10000) >> 10) + 0xD800; - cu2 = ((code - 0x10000) & 1023) + 0xDC00; - return String.fromCharCode(cu1, cu2); - } - - function getEscapedIdentifier() { - var ch, id; - - ch = source.charCodeAt(index++); - id = String.fromCharCode(ch); - - // '\u' (char #92, char #117) denotes an escaped character. - if (ch === 92) { - if (source.charCodeAt(index) !== 117) { - throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); - } - ++index; - ch = scanHexEscape('u'); - if (!ch || ch === '\\' || !isIdentifierStart(ch.charCodeAt(0))) { - throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); - } - id = ch; - } - - while (index < length) { - ch = source.charCodeAt(index); - if (!isIdentifierPart(ch)) { - break; - } - ++index; - id += String.fromCharCode(ch); - - // '\u' (char #92, char #117) denotes an escaped character. - if (ch === 92) { - id = id.substr(0, id.length - 1); - if (source.charCodeAt(index) !== 117) { - throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); - } - ++index; - ch = scanHexEscape('u'); - if (!ch || ch === '\\' || !isIdentifierPart(ch.charCodeAt(0))) { - throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); - } - id += ch; - } - } - - return id; - } - - function getIdentifier() { - var start, ch; - - start = index++; - while (index < length) { - ch = source.charCodeAt(index); - if (ch === 92) { - // Blackslash (char #92) marks Unicode escape sequence. - index = start; - return getEscapedIdentifier(); - } - if (isIdentifierPart(ch)) { - ++index; - } else { - break; - } - } - - return source.slice(start, index); - } - - function scanIdentifier() { - var start, id, type; - - start = index; - - // Backslash (char #92) starts an escaped character. - id = (source.charCodeAt(index) === 92) ? getEscapedIdentifier() : getIdentifier(); - - // There is no keyword or literal with only one character. - // Thus, it must be an identifier. - if (id.length === 1) { - type = Token.Identifier; - } else if (isKeyword(id)) { - type = Token.Keyword; - } else if (id === 'null') { - type = Token.NullLiteral; - } else if (id === 'true' || id === 'false') { - type = Token.BooleanLiteral; - } else { - type = Token.Identifier; - } - - return { - type: type, - value: id, - lineNumber: lineNumber, - lineStart: lineStart, - range: [start, index] - }; - } - - - // 7.7 Punctuators - - function scanPunctuator() { - var start = index, - code = source.charCodeAt(index), - code2, - ch1 = source[index], - ch2, - ch3, - ch4; - - if (state.inJSXTag || state.inJSXChild) { - // Don't need to check for '{' and '}' as it's already handled - // correctly by default. - switch (code) { - case 60: // < - case 62: // > - ++index; - return { - type: Token.Punctuator, - value: String.fromCharCode(code), - lineNumber: lineNumber, - lineStart: lineStart, - range: [start, index] - }; - } - } - - switch (code) { - // Check for most common single-character punctuators. - case 40: // ( open bracket - case 41: // ) close bracket - case 59: // ; semicolon - case 44: // , comma - case 123: // { open curly brace - case 125: // } close curly brace - case 91: // [ - case 93: // ] - case 58: // : - case 63: // ? - case 126: // ~ - ++index; - if (extra.tokenize) { - if (code === 40) { - extra.openParenToken = extra.tokens.length; - } else if (code === 123) { - extra.openCurlyToken = extra.tokens.length; - } - } - return { - type: Token.Punctuator, - value: String.fromCharCode(code), - lineNumber: lineNumber, - lineStart: lineStart, - range: [start, index] - }; - - default: - code2 = source.charCodeAt(index + 1); - - // '=' (char #61) marks an assignment or comparison operator. - if (code2 === 61) { - switch (code) { - case 37: // % - case 38: // & - case 42: // *: - case 43: // + - case 45: // - - case 47: // / - case 60: // < - case 62: // > - case 94: // ^ - case 124: // | - index += 2; - return { - type: Token.Punctuator, - value: String.fromCharCode(code) + String.fromCharCode(code2), - lineNumber: lineNumber, - lineStart: lineStart, - range: [start, index] - }; - - case 33: // ! - case 61: // = - index += 2; - - // !== and === - if (source.charCodeAt(index) === 61) { - ++index; - } - return { - type: Token.Punctuator, - value: source.slice(start, index), - lineNumber: lineNumber, - lineStart: lineStart, - range: [start, index] - }; - default: - break; - } - } - break; - } - - // Peek more characters. - - ch2 = source[index + 1]; - ch3 = source[index + 2]; - ch4 = source[index + 3]; - - // 4-character punctuator: >>>= - - if (ch1 === '>' && ch2 === '>' && ch3 === '>') { - if (ch4 === '=') { - index += 4; - return { - type: Token.Punctuator, - value: '>>>=', - lineNumber: lineNumber, - lineStart: lineStart, - range: [start, index] - }; - } - } - - // 3-character punctuators: === !== >>> <<= >>= - - if (ch1 === '>' && ch2 === '>' && ch3 === '>' && !state.inType) { - index += 3; - return { - type: Token.Punctuator, - value: '>>>', - lineNumber: lineNumber, - lineStart: lineStart, - range: [start, index] - }; - } - - if (ch1 === '<' && ch2 === '<' && ch3 === '=') { - index += 3; - return { - type: Token.Punctuator, - value: '<<=', - lineNumber: lineNumber, - lineStart: lineStart, - range: [start, index] - }; - } - - if (ch1 === '>' && ch2 === '>' && ch3 === '=') { - index += 3; - return { - type: Token.Punctuator, - value: '>>=', - lineNumber: lineNumber, - lineStart: lineStart, - range: [start, index] - }; - } - - if (ch1 === '.' && ch2 === '.' && ch3 === '.') { - index += 3; - return { - type: Token.Punctuator, - value: '...', - lineNumber: lineNumber, - lineStart: lineStart, - range: [start, index] - }; - } - - // Other 2-character punctuators: ++ -- << >> && || - - // Don't match these tokens if we're in a type, since they never can - // occur and can mess up types like Map> - if (ch1 === ch2 && ('+-<>&|'.indexOf(ch1) >= 0) && !state.inType) { - index += 2; - return { - type: Token.Punctuator, - value: ch1 + ch2, - lineNumber: lineNumber, - lineStart: lineStart, - range: [start, index] - }; - } - - if (ch1 === '=' && ch2 === '>') { - index += 2; - return { - type: Token.Punctuator, - value: '=>', - lineNumber: lineNumber, - lineStart: lineStart, - range: [start, index] - }; - } - - if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) { - ++index; - return { - type: Token.Punctuator, - value: ch1, - lineNumber: lineNumber, - lineStart: lineStart, - range: [start, index] - }; - } - - if (ch1 === '.') { - ++index; - return { - type: Token.Punctuator, - value: ch1, - lineNumber: lineNumber, - lineStart: lineStart, - range: [start, index] - }; - } - - throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); - } - - // 7.8.3 Numeric Literals - - function scanHexLiteral(start) { - var number = ''; - - while (index < length) { - if (!isHexDigit(source[index])) { - break; - } - number += source[index++]; - } - - if (number.length === 0) { - throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); - } - - if (isIdentifierStart(source.charCodeAt(index))) { - throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); - } - - return { - type: Token.NumericLiteral, - value: parseInt('0x' + number, 16), - lineNumber: lineNumber, - lineStart: lineStart, - range: [start, index] - }; - } - - function scanBinaryLiteral(start) { - var ch, number; - - number = ''; - - while (index < length) { - ch = source[index]; - if (ch !== '0' && ch !== '1') { - break; - } - number += source[index++]; - } - - if (number.length === 0) { - // only 0b or 0B - throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); - } - - if (index < length) { - ch = source.charCodeAt(index); - /* istanbul ignore else */ - if (isIdentifierStart(ch) || isDecimalDigit(ch)) { - throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); - } - } - - return { - type: Token.NumericLiteral, - value: parseInt(number, 2), - lineNumber: lineNumber, - lineStart: lineStart, - range: [start, index] - }; - } - - function scanOctalLiteral(prefix, start) { - var number, octal; - - if (isOctalDigit(prefix)) { - octal = true; - number = '0' + source[index++]; - } else { - octal = false; - ++index; - number = ''; - } - - while (index < length) { - if (!isOctalDigit(source[index])) { - break; - } - number += source[index++]; - } - - if (!octal && number.length === 0) { - // only 0o or 0O - throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); - } - - if (isIdentifierStart(source.charCodeAt(index)) || isDecimalDigit(source.charCodeAt(index))) { - throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); - } - - return { - type: Token.NumericLiteral, - value: parseInt(number, 8), - octal: octal, - lineNumber: lineNumber, - lineStart: lineStart, - range: [start, index] - }; - } - - function scanNumericLiteral() { - var number, start, ch; - - ch = source[index]; - assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'), - 'Numeric literal must start with a decimal digit or a decimal point'); - - start = index; - number = ''; - if (ch !== '.') { - number = source[index++]; - ch = source[index]; - - // Hex number starts with '0x'. - // Octal number starts with '0'. - // Octal number in ES6 starts with '0o'. - // Binary number in ES6 starts with '0b'. - if (number === '0') { - if (ch === 'x' || ch === 'X') { - ++index; - return scanHexLiteral(start); - } - if (ch === 'b' || ch === 'B') { - ++index; - return scanBinaryLiteral(start); - } - if (ch === 'o' || ch === 'O' || isOctalDigit(ch)) { - return scanOctalLiteral(ch, start); - } - // decimal number starts with '0' such as '09' is illegal. - if (ch && isDecimalDigit(ch.charCodeAt(0))) { - throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); - } - } - - while (isDecimalDigit(source.charCodeAt(index))) { - number += source[index++]; - } - ch = source[index]; - } - - if (ch === '.') { - number += source[index++]; - while (isDecimalDigit(source.charCodeAt(index))) { - number += source[index++]; - } - ch = source[index]; - } - - if (ch === 'e' || ch === 'E') { - number += source[index++]; - - ch = source[index]; - if (ch === '+' || ch === '-') { - number += source[index++]; - } - if (isDecimalDigit(source.charCodeAt(index))) { - while (isDecimalDigit(source.charCodeAt(index))) { - number += source[index++]; - } - } else { - throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); - } - } - - if (isIdentifierStart(source.charCodeAt(index))) { - throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); - } - - return { - type: Token.NumericLiteral, - value: parseFloat(number), - lineNumber: lineNumber, - lineStart: lineStart, - range: [start, index] - }; - } - - // 7.8.4 String Literals - - function scanStringLiteral() { - var str = '', quote, start, ch, code, unescaped, restore, octal = false; - - quote = source[index]; - assert((quote === '\'' || quote === '"'), - 'String literal must starts with a quote'); - - start = index; - ++index; - - while (index < length) { - ch = source[index++]; - - if (ch === quote) { - quote = ''; - break; - } else if (ch === '\\') { - ch = source[index++]; - if (!ch || !isLineTerminator(ch.charCodeAt(0))) { - switch (ch) { - case 'n': - str += '\n'; - break; - case 'r': - str += '\r'; - break; - case 't': - str += '\t'; - break; - case 'u': - case 'x': - if (source[index] === '{') { - ++index; - str += scanUnicodeCodePointEscape(); - } else { - restore = index; - unescaped = scanHexEscape(ch); - if (unescaped) { - str += unescaped; - } else { - index = restore; - str += ch; - } - } - break; - case 'b': - str += '\b'; - break; - case 'f': - str += '\f'; - break; - case 'v': - str += '\x0B'; - break; - - default: - if (isOctalDigit(ch)) { - code = '01234567'.indexOf(ch); - - // \0 is not octal escape sequence - if (code !== 0) { - octal = true; - } - - /* istanbul ignore else */ - if (index < length && isOctalDigit(source[index])) { - octal = true; - code = code * 8 + '01234567'.indexOf(source[index++]); - - // 3 digits are only allowed when string starts - // with 0, 1, 2, 3 - if ('0123'.indexOf(ch) >= 0 && - index < length && - isOctalDigit(source[index])) { - code = code * 8 + '01234567'.indexOf(source[index++]); - } - } - str += String.fromCharCode(code); - } else { - str += ch; - } - break; - } - } else { - ++lineNumber; - if (ch === '\r' && source[index] === '\n') { - ++index; - } - lineStart = index; - } - } else if (isLineTerminator(ch.charCodeAt(0))) { - break; - } else { - str += ch; - } - } - - if (quote !== '') { - throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); - } - - return { - type: Token.StringLiteral, - value: str, - octal: octal, - lineNumber: lineNumber, - lineStart: lineStart, - range: [start, index] - }; - } - - function scanTemplate() { - var cooked = '', ch, start, terminated, tail, restore, unescaped, code, octal; - - terminated = false; - tail = false; - start = index; - - ++index; - - while (index < length) { - ch = source[index++]; - if (ch === '`') { - tail = true; - terminated = true; - break; - } else if (ch === '$') { - if (source[index] === '{') { - ++index; - terminated = true; - break; - } - cooked += ch; - } else if (ch === '\\') { - ch = source[index++]; - if (!isLineTerminator(ch.charCodeAt(0))) { - switch (ch) { - case 'n': - cooked += '\n'; - break; - case 'r': - cooked += '\r'; - break; - case 't': - cooked += '\t'; - break; - case 'u': - case 'x': - if (source[index] === '{') { - ++index; - cooked += scanUnicodeCodePointEscape(); - } else { - restore = index; - unescaped = scanHexEscape(ch); - if (unescaped) { - cooked += unescaped; - } else { - index = restore; - cooked += ch; - } - } - break; - case 'b': - cooked += '\b'; - break; - case 'f': - cooked += '\f'; - break; - case 'v': - cooked += '\v'; - break; - - default: - if (isOctalDigit(ch)) { - code = '01234567'.indexOf(ch); - - // \0 is not octal escape sequence - if (code !== 0) { - octal = true; - } - - /* istanbul ignore else */ - if (index < length && isOctalDigit(source[index])) { - octal = true; - code = code * 8 + '01234567'.indexOf(source[index++]); - - // 3 digits are only allowed when string starts - // with 0, 1, 2, 3 - if ('0123'.indexOf(ch) >= 0 && - index < length && - isOctalDigit(source[index])) { - code = code * 8 + '01234567'.indexOf(source[index++]); - } - } - cooked += String.fromCharCode(code); - } else { - cooked += ch; - } - break; - } - } else { - ++lineNumber; - if (ch === '\r' && source[index] === '\n') { - ++index; - } - lineStart = index; - } - } else if (isLineTerminator(ch.charCodeAt(0))) { - ++lineNumber; - if (ch === '\r' && source[index] === '\n') { - ++index; - } - lineStart = index; - cooked += '\n'; - } else { - cooked += ch; - } - } - - if (!terminated) { - throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); - } - - return { - type: Token.Template, - value: { - cooked: cooked, - raw: source.slice(start + 1, index - ((tail) ? 1 : 2)) - }, - tail: tail, - octal: octal, - lineNumber: lineNumber, - lineStart: lineStart, - range: [start, index] - }; - } - - function scanTemplateElement(option) { - var startsWith, template; - - lookahead = null; - skipComment(); - - startsWith = (option.head) ? '`' : '}'; - - if (source[index] !== startsWith) { - throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); - } - - template = scanTemplate(); - - peek(); - - return template; - } - - function testRegExp(pattern, flags) { - var tmp = pattern, - value; - - if (flags.indexOf('u') >= 0) { - // Replace each astral symbol and every Unicode code point - // escape sequence with a single ASCII symbol to avoid throwing on - // regular expressions that are only valid in combination with the - // `/u` flag. - // Note: replacing with the ASCII symbol `x` might cause false - // negatives in unlikely scenarios. For example, `[\u{61}-b]` is a - // perfectly valid pattern that is equivalent to `[a-b]`, but it - // would be replaced by `[x-b]` which throws an error. - tmp = tmp - .replace(/\\u\{([0-9a-fA-F]+)\}/g, function ($0, $1) { - if (parseInt($1, 16) <= 0x10FFFF) { - return 'x'; - } - throwError({}, Messages.InvalidRegExp); - }) - .replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, 'x'); - } - - // First, detect invalid regular expressions. - try { - value = new RegExp(tmp); - } catch (e) { - throwError({}, Messages.InvalidRegExp); - } - - // Return a regular expression object for this pattern-flag pair, or - // `null` in case the current environment doesn't support the flags it - // uses. - try { - return new RegExp(pattern, flags); - } catch (exception) { - return null; - } - } - - function scanRegExpBody() { - var ch, str, classMarker, terminated, body; - - ch = source[index]; - assert(ch === '/', 'Regular expression literal must start with a slash'); - str = source[index++]; - - classMarker = false; - terminated = false; - while (index < length) { - ch = source[index++]; - str += ch; - if (ch === '\\') { - ch = source[index++]; - // ECMA-262 7.8.5 - if (isLineTerminator(ch.charCodeAt(0))) { - throwError({}, Messages.UnterminatedRegExp); - } - str += ch; - } else if (isLineTerminator(ch.charCodeAt(0))) { - throwError({}, Messages.UnterminatedRegExp); - } else if (classMarker) { - if (ch === ']') { - classMarker = false; - } - } else { - if (ch === '/') { - terminated = true; - break; - } else if (ch === '[') { - classMarker = true; - } - } - } - - if (!terminated) { - throwError({}, Messages.UnterminatedRegExp); - } - - // Exclude leading and trailing slash. - body = str.substr(1, str.length - 2); - return { - value: body, - literal: str - }; - } - - function scanRegExpFlags() { - var ch, str, flags, restore; - - str = ''; - flags = ''; - while (index < length) { - ch = source[index]; - if (!isIdentifierPart(ch.charCodeAt(0))) { - break; - } - - ++index; - if (ch === '\\' && index < length) { - ch = source[index]; - if (ch === 'u') { - ++index; - restore = index; - ch = scanHexEscape('u'); - if (ch) { - flags += ch; - for (str += '\\u'; restore < index; ++restore) { - str += source[restore]; - } - } else { - index = restore; - flags += 'u'; - str += '\\u'; - } - throwErrorTolerant({}, Messages.UnexpectedToken, 'ILLEGAL'); - } else { - str += '\\'; - throwErrorTolerant({}, Messages.UnexpectedToken, 'ILLEGAL'); - } - } else { - flags += ch; - str += ch; - } - } - - return { - value: flags, - literal: str - }; - } - - function scanRegExp() { - var start, body, flags, value; - - lookahead = null; - skipComment(); - start = index; - - body = scanRegExpBody(); - flags = scanRegExpFlags(); - value = testRegExp(body.value, flags.value); - - if (extra.tokenize) { - return { - type: Token.RegularExpression, - value: value, - regex: { - pattern: body.value, - flags: flags.value - }, - lineNumber: lineNumber, - lineStart: lineStart, - range: [start, index] - }; - } - - return { - literal: body.literal + flags.literal, - value: value, - regex: { - pattern: body.value, - flags: flags.value - }, - range: [start, index] - }; - } - - function isIdentifierName(token) { - return token.type === Token.Identifier || - token.type === Token.Keyword || - token.type === Token.BooleanLiteral || - token.type === Token.NullLiteral; - } - - function advanceSlash() { - var prevToken, - checkToken; - // Using the following algorithm: - // https://github.com/mozilla/sweet.js/wiki/design - prevToken = extra.tokens[extra.tokens.length - 1]; - if (!prevToken) { - // Nothing before that: it cannot be a division. - return scanRegExp(); - } - if (prevToken.type === 'Punctuator') { - if (prevToken.value === ')') { - checkToken = extra.tokens[extra.openParenToken - 1]; - if (checkToken && - checkToken.type === 'Keyword' && - (checkToken.value === 'if' || - checkToken.value === 'while' || - checkToken.value === 'for' || - checkToken.value === 'with')) { - return scanRegExp(); - } - return scanPunctuator(); - } - if (prevToken.value === '}') { - // Dividing a function by anything makes little sense, - // but we have to check for that. - if (extra.tokens[extra.openCurlyToken - 3] && - extra.tokens[extra.openCurlyToken - 3].type === 'Keyword') { - // Anonymous function. - checkToken = extra.tokens[extra.openCurlyToken - 4]; - if (!checkToken) { - return scanPunctuator(); - } - } else if (extra.tokens[extra.openCurlyToken - 4] && - extra.tokens[extra.openCurlyToken - 4].type === 'Keyword') { - // Named function. - checkToken = extra.tokens[extra.openCurlyToken - 5]; - if (!checkToken) { - return scanRegExp(); - } - } else { - return scanPunctuator(); - } - // checkToken determines whether the function is - // a declaration or an expression. - if (FnExprTokens.indexOf(checkToken.value) >= 0) { - // It is an expression. - return scanPunctuator(); - } - // It is a declaration. - return scanRegExp(); - } - return scanRegExp(); - } - if (prevToken.type === 'Keyword' && prevToken.value !== 'this') { - return scanRegExp(); - } - return scanPunctuator(); - } - - function advance() { - var ch; - - if (!state.inJSXChild) { - skipComment(); - } - - if (index >= length) { - return { - type: Token.EOF, - lineNumber: lineNumber, - lineStart: lineStart, - range: [index, index] - }; - } - - if (state.inJSXChild) { - return advanceJSXChild(); - } - - ch = source.charCodeAt(index); - - // Very common: ( and ) and ; - if (ch === 40 || ch === 41 || ch === 58) { - return scanPunctuator(); - } - - // String literal starts with single quote (#39) or double quote (#34). - if (ch === 39 || ch === 34) { - if (state.inJSXTag) { - return scanJSXStringLiteral(); - } - return scanStringLiteral(); - } - - if (state.inJSXTag && isJSXIdentifierStart(ch)) { - return scanJSXIdentifier(); - } - - if (ch === 96) { - return scanTemplate(); - } - if (isIdentifierStart(ch)) { - return scanIdentifier(); - } - - // Dot (.) char #46 can also start a floating-point number, hence the need - // to check the next character. - if (ch === 46) { - if (isDecimalDigit(source.charCodeAt(index + 1))) { - return scanNumericLiteral(); - } - return scanPunctuator(); - } - - if (isDecimalDigit(ch)) { - return scanNumericLiteral(); - } - - // Slash (/) char #47 can also start a regex. - if (extra.tokenize && ch === 47) { - return advanceSlash(); - } - - return scanPunctuator(); - } - - function lex() { - var token; - - token = lookahead; - index = token.range[1]; - lineNumber = token.lineNumber; - lineStart = token.lineStart; - - lookahead = advance(); - - index = token.range[1]; - lineNumber = token.lineNumber; - lineStart = token.lineStart; - - return token; - } - - function peek() { - var pos, line, start; - - pos = index; - line = lineNumber; - start = lineStart; - lookahead = advance(); - index = pos; - lineNumber = line; - lineStart = start; - } - - function lookahead2() { - var adv, pos, line, start, result; - - // If we are collecting the tokens, don't grab the next one yet. - /* istanbul ignore next */ - adv = (typeof extra.advance === 'function') ? extra.advance : advance; - - pos = index; - line = lineNumber; - start = lineStart; - - // Scan for the next immediate token. - /* istanbul ignore if */ - if (lookahead === null) { - lookahead = adv(); - } - index = lookahead.range[1]; - lineNumber = lookahead.lineNumber; - lineStart = lookahead.lineStart; - - // Grab the token right after. - result = adv(); - index = pos; - lineNumber = line; - lineStart = start; - - return result; - } - - function rewind(token) { - index = token.range[0]; - lineNumber = token.lineNumber; - lineStart = token.lineStart; - lookahead = token; - } - - function markerCreate() { - if (!extra.loc && !extra.range) { - return undefined; - } - skipComment(); - return {offset: index, line: lineNumber, col: index - lineStart}; - } - - function markerCreatePreserveWhitespace() { - if (!extra.loc && !extra.range) { - return undefined; - } - return {offset: index, line: lineNumber, col: index - lineStart}; - } - - function processComment(node) { - var lastChild, - trailingComments, - bottomRight = extra.bottomRightStack, - last = bottomRight[bottomRight.length - 1]; - - if (node.type === Syntax.Program) { - /* istanbul ignore else */ - if (node.body.length > 0) { - return; - } - } - - if (extra.trailingComments.length > 0) { - if (extra.trailingComments[0].range[0] >= node.range[1]) { - trailingComments = extra.trailingComments; - extra.trailingComments = []; - } else { - extra.trailingComments.length = 0; - } - } else { - if (last && last.trailingComments && last.trailingComments[0].range[0] >= node.range[1]) { - trailingComments = last.trailingComments; - delete last.trailingComments; - } - } - - // Eating the stack. - if (last) { - while (last && last.range[0] >= node.range[0]) { - lastChild = last; - last = bottomRight.pop(); - } - } - - if (lastChild) { - if (lastChild.leadingComments && lastChild.leadingComments[lastChild.leadingComments.length - 1].range[1] <= node.range[0]) { - node.leadingComments = lastChild.leadingComments; - delete lastChild.leadingComments; - } - } else if (extra.leadingComments.length > 0 && extra.leadingComments[extra.leadingComments.length - 1].range[1] <= node.range[0]) { - node.leadingComments = extra.leadingComments; - extra.leadingComments = []; - } - - if (trailingComments) { - node.trailingComments = trailingComments; - } - - bottomRight.push(node); - } - - function markerApply(marker, node) { - if (extra.range) { - node.range = [marker.offset, index]; - } - if (extra.loc) { - node.loc = { - start: { - line: marker.line, - column: marker.col - }, - end: { - line: lineNumber, - column: index - lineStart - } - }; - node = delegate.postProcess(node); - } - if (extra.attachComment) { - processComment(node); - } - return node; - } - - SyntaxTreeDelegate = { - - name: 'SyntaxTree', - - postProcess: function (node) { - return node; - }, - - createArrayExpression: function (elements) { - return { - type: Syntax.ArrayExpression, - elements: elements - }; - }, - - createAssignmentExpression: function (operator, left, right) { - return { - type: Syntax.AssignmentExpression, - operator: operator, - left: left, - right: right - }; - }, - - createBinaryExpression: function (operator, left, right) { - var type = (operator === '||' || operator === '&&') ? Syntax.LogicalExpression : - Syntax.BinaryExpression; - return { - type: type, - operator: operator, - left: left, - right: right - }; - }, - - createBlockStatement: function (body) { - return { - type: Syntax.BlockStatement, - body: body - }; - }, - - createBreakStatement: function (label) { - return { - type: Syntax.BreakStatement, - label: label - }; - }, - - createCallExpression: function (callee, args) { - return { - type: Syntax.CallExpression, - callee: callee, - 'arguments': args - }; - }, - - createCatchClause: function (param, body) { - return { - type: Syntax.CatchClause, - param: param, - body: body - }; - }, - - createConditionalExpression: function (test, consequent, alternate) { - return { - type: Syntax.ConditionalExpression, - test: test, - consequent: consequent, - alternate: alternate - }; - }, - - createContinueStatement: function (label) { - return { - type: Syntax.ContinueStatement, - label: label - }; - }, - - createDebuggerStatement: function () { - return { - type: Syntax.DebuggerStatement - }; - }, - - createDoWhileStatement: function (body, test) { - return { - type: Syntax.DoWhileStatement, - body: body, - test: test - }; - }, - - createEmptyStatement: function () { - return { - type: Syntax.EmptyStatement - }; - }, - - createExpressionStatement: function (expression) { - return { - type: Syntax.ExpressionStatement, - expression: expression - }; - }, - - createForStatement: function (init, test, update, body) { - return { - type: Syntax.ForStatement, - init: init, - test: test, - update: update, - body: body - }; - }, - - createForInStatement: function (left, right, body) { - return { - type: Syntax.ForInStatement, - left: left, - right: right, - body: body, - each: false - }; - }, - - createForOfStatement: function (left, right, body) { - return { - type: Syntax.ForOfStatement, - left: left, - right: right, - body: body - }; - }, - - createFunctionDeclaration: function (id, params, defaults, body, rest, generator, expression, - isAsync, returnType, typeParameters) { - var funDecl = { - type: Syntax.FunctionDeclaration, - id: id, - params: params, - defaults: defaults, - body: body, - rest: rest, - generator: generator, - expression: expression, - returnType: returnType, - typeParameters: typeParameters - }; - - if (isAsync) { - funDecl.async = true; - } - - return funDecl; - }, - - createFunctionExpression: function (id, params, defaults, body, rest, generator, expression, - isAsync, returnType, typeParameters) { - var funExpr = { - type: Syntax.FunctionExpression, - id: id, - params: params, - defaults: defaults, - body: body, - rest: rest, - generator: generator, - expression: expression, - returnType: returnType, - typeParameters: typeParameters - }; - - if (isAsync) { - funExpr.async = true; - } - - return funExpr; - }, - - createIdentifier: function (name) { - return { - type: Syntax.Identifier, - name: name, - // Only here to initialize the shape of the object to ensure - // that the 'typeAnnotation' key is ordered before others that - // are added later (like 'loc' and 'range'). This just helps - // keep the shape of Identifier nodes consistent with everything - // else. - typeAnnotation: undefined, - optional: undefined - }; - }, - - createTypeAnnotation: function (typeAnnotation) { - return { - type: Syntax.TypeAnnotation, - typeAnnotation: typeAnnotation - }; - }, - - createTypeCast: function (expression, typeAnnotation) { - return { - type: Syntax.TypeCastExpression, - expression: expression, - typeAnnotation: typeAnnotation - }; - }, - - createFunctionTypeAnnotation: function (params, returnType, rest, typeParameters) { - return { - type: Syntax.FunctionTypeAnnotation, - params: params, - returnType: returnType, - rest: rest, - typeParameters: typeParameters - }; - }, - - createFunctionTypeParam: function (name, typeAnnotation, optional) { - return { - type: Syntax.FunctionTypeParam, - name: name, - typeAnnotation: typeAnnotation, - optional: optional - }; - }, - - createNullableTypeAnnotation: function (typeAnnotation) { - return { - type: Syntax.NullableTypeAnnotation, - typeAnnotation: typeAnnotation - }; - }, - - createArrayTypeAnnotation: function (elementType) { - return { - type: Syntax.ArrayTypeAnnotation, - elementType: elementType - }; - }, - - createGenericTypeAnnotation: function (id, typeParameters) { - return { - type: Syntax.GenericTypeAnnotation, - id: id, - typeParameters: typeParameters - }; - }, - - createQualifiedTypeIdentifier: function (qualification, id) { - return { - type: Syntax.QualifiedTypeIdentifier, - qualification: qualification, - id: id - }; - }, - - createTypeParameterDeclaration: function (params) { - return { - type: Syntax.TypeParameterDeclaration, - params: params - }; - }, - - createTypeParameterInstantiation: function (params) { - return { - type: Syntax.TypeParameterInstantiation, - params: params - }; - }, - - createAnyTypeAnnotation: function () { - return { - type: Syntax.AnyTypeAnnotation - }; - }, - - createBooleanTypeAnnotation: function () { - return { - type: Syntax.BooleanTypeAnnotation - }; - }, - - createNumberTypeAnnotation: function () { - return { - type: Syntax.NumberTypeAnnotation - }; - }, - - createStringTypeAnnotation: function () { - return { - type: Syntax.StringTypeAnnotation - }; - }, - - createStringLiteralTypeAnnotation: function (token) { - return { - type: Syntax.StringLiteralTypeAnnotation, - value: token.value, - raw: source.slice(token.range[0], token.range[1]) - }; - }, - - createVoidTypeAnnotation: function () { - return { - type: Syntax.VoidTypeAnnotation - }; - }, - - createTypeofTypeAnnotation: function (argument) { - return { - type: Syntax.TypeofTypeAnnotation, - argument: argument - }; - }, - - createTupleTypeAnnotation: function (types) { - return { - type: Syntax.TupleTypeAnnotation, - types: types - }; - }, - - createObjectTypeAnnotation: function (properties, indexers, callProperties) { - return { - type: Syntax.ObjectTypeAnnotation, - properties: properties, - indexers: indexers, - callProperties: callProperties - }; - }, - - createObjectTypeIndexer: function (id, key, value, isStatic) { - return { - type: Syntax.ObjectTypeIndexer, - id: id, - key: key, - value: value, - "static": isStatic - }; - }, - - createObjectTypeCallProperty: function (value, isStatic) { - return { - type: Syntax.ObjectTypeCallProperty, - value: value, - "static": isStatic - }; - }, - - createObjectTypeProperty: function (key, value, optional, isStatic) { - return { - type: Syntax.ObjectTypeProperty, - key: key, - value: value, - optional: optional, - "static": isStatic - }; - }, - - createUnionTypeAnnotation: function (types) { - return { - type: Syntax.UnionTypeAnnotation, - types: types - }; - }, - - createIntersectionTypeAnnotation: function (types) { - return { - type: Syntax.IntersectionTypeAnnotation, - types: types - }; - }, - - createTypeAlias: function (id, typeParameters, right) { - return { - type: Syntax.TypeAlias, - id: id, - typeParameters: typeParameters, - right: right - }; - }, - - createInterface: function (id, typeParameters, body, extended) { - return { - type: Syntax.InterfaceDeclaration, - id: id, - typeParameters: typeParameters, - body: body, - "extends": extended - }; - }, - - createInterfaceExtends: function (id, typeParameters) { - return { - type: Syntax.InterfaceExtends, - id: id, - typeParameters: typeParameters - }; - }, - - createDeclareFunction: function (id) { - return { - type: Syntax.DeclareFunction, - id: id - }; - }, - - createDeclareVariable: function (id) { - return { - type: Syntax.DeclareVariable, - id: id - }; - }, - - createDeclareModule: function (id, body) { - return { - type: Syntax.DeclareModule, - id: id, - body: body - }; - }, - - createJSXAttribute: function (name, value) { - return { - type: Syntax.JSXAttribute, - name: name, - value: value || null - }; - }, - - createJSXSpreadAttribute: function (argument) { - return { - type: Syntax.JSXSpreadAttribute, - argument: argument - }; - }, - - createJSXIdentifier: function (name) { - return { - type: Syntax.JSXIdentifier, - name: name - }; - }, - - createJSXNamespacedName: function (namespace, name) { - return { - type: Syntax.JSXNamespacedName, - namespace: namespace, - name: name - }; - }, - - createJSXMemberExpression: function (object, property) { - return { - type: Syntax.JSXMemberExpression, - object: object, - property: property - }; - }, - - createJSXElement: function (openingElement, closingElement, children) { - return { - type: Syntax.JSXElement, - openingElement: openingElement, - closingElement: closingElement, - children: children - }; - }, - - createJSXEmptyExpression: function () { - return { - type: Syntax.JSXEmptyExpression - }; - }, - - createJSXExpressionContainer: function (expression) { - return { - type: Syntax.JSXExpressionContainer, - expression: expression - }; - }, - - createJSXOpeningElement: function (name, attributes, selfClosing) { - return { - type: Syntax.JSXOpeningElement, - name: name, - selfClosing: selfClosing, - attributes: attributes - }; - }, - - createJSXClosingElement: function (name) { - return { - type: Syntax.JSXClosingElement, - name: name - }; - }, - - createIfStatement: function (test, consequent, alternate) { - return { - type: Syntax.IfStatement, - test: test, - consequent: consequent, - alternate: alternate - }; - }, - - createLabeledStatement: function (label, body) { - return { - type: Syntax.LabeledStatement, - label: label, - body: body - }; - }, - - createLiteral: function (token) { - var object = { - type: Syntax.Literal, - value: token.value, - raw: source.slice(token.range[0], token.range[1]) - }; - if (token.regex) { - object.regex = token.regex; - } - return object; - }, - - createMemberExpression: function (accessor, object, property) { - return { - type: Syntax.MemberExpression, - computed: accessor === '[', - object: object, - property: property - }; - }, - - createNewExpression: function (callee, args) { - return { - type: Syntax.NewExpression, - callee: callee, - 'arguments': args - }; - }, - - createObjectExpression: function (properties) { - return { - type: Syntax.ObjectExpression, - properties: properties - }; - }, - - createPostfixExpression: function (operator, argument) { - return { - type: Syntax.UpdateExpression, - operator: operator, - argument: argument, - prefix: false - }; - }, - - createProgram: function (body) { - return { - type: Syntax.Program, - body: body - }; - }, - - createProperty: function (kind, key, value, method, shorthand, computed) { - return { - type: Syntax.Property, - key: key, - value: value, - kind: kind, - method: method, - shorthand: shorthand, - computed: computed - }; - }, - - createReturnStatement: function (argument) { - return { - type: Syntax.ReturnStatement, - argument: argument - }; - }, - - createSequenceExpression: function (expressions) { - return { - type: Syntax.SequenceExpression, - expressions: expressions - }; - }, - - createSwitchCase: function (test, consequent) { - return { - type: Syntax.SwitchCase, - test: test, - consequent: consequent - }; - }, - - createSwitchStatement: function (discriminant, cases) { - return { - type: Syntax.SwitchStatement, - discriminant: discriminant, - cases: cases - }; - }, - - createThisExpression: function () { - return { - type: Syntax.ThisExpression - }; - }, - - createThrowStatement: function (argument) { - return { - type: Syntax.ThrowStatement, - argument: argument - }; - }, - - createTryStatement: function (block, guardedHandlers, handlers, finalizer) { - return { - type: Syntax.TryStatement, - block: block, - guardedHandlers: guardedHandlers, - handlers: handlers, - finalizer: finalizer - }; - }, - - createUnaryExpression: function (operator, argument) { - if (operator === '++' || operator === '--') { - return { - type: Syntax.UpdateExpression, - operator: operator, - argument: argument, - prefix: true - }; - } - return { - type: Syntax.UnaryExpression, - operator: operator, - argument: argument, - prefix: true - }; - }, - - createVariableDeclaration: function (declarations, kind) { - return { - type: Syntax.VariableDeclaration, - declarations: declarations, - kind: kind - }; - }, - - createVariableDeclarator: function (id, init) { - return { - type: Syntax.VariableDeclarator, - id: id, - init: init - }; - }, - - createWhileStatement: function (test, body) { - return { - type: Syntax.WhileStatement, - test: test, - body: body - }; - }, - - createWithStatement: function (object, body) { - return { - type: Syntax.WithStatement, - object: object, - body: body - }; - }, - - createTemplateElement: function (value, tail) { - return { - type: Syntax.TemplateElement, - value: value, - tail: tail - }; - }, - - createTemplateLiteral: function (quasis, expressions) { - return { - type: Syntax.TemplateLiteral, - quasis: quasis, - expressions: expressions - }; - }, - - createSpreadElement: function (argument) { - return { - type: Syntax.SpreadElement, - argument: argument - }; - }, - - createSpreadProperty: function (argument) { - return { - type: Syntax.SpreadProperty, - argument: argument - }; - }, - - createTaggedTemplateExpression: function (tag, quasi) { - return { - type: Syntax.TaggedTemplateExpression, - tag: tag, - quasi: quasi - }; - }, - - createArrowFunctionExpression: function (params, defaults, body, rest, expression, isAsync) { - var arrowExpr = { - type: Syntax.ArrowFunctionExpression, - id: null, - params: params, - defaults: defaults, - body: body, - rest: rest, - generator: false, - expression: expression - }; - - if (isAsync) { - arrowExpr.async = true; - } - - return arrowExpr; - }, - - createMethodDefinition: function (propertyType, kind, key, value, computed) { - return { - type: Syntax.MethodDefinition, - key: key, - value: value, - kind: kind, - 'static': propertyType === ClassPropertyType["static"], - computed: computed - }; - }, - - createClassProperty: function (key, typeAnnotation, computed, isStatic) { - return { - type: Syntax.ClassProperty, - key: key, - typeAnnotation: typeAnnotation, - computed: computed, - "static": isStatic - }; - }, - - createClassBody: function (body) { - return { - type: Syntax.ClassBody, - body: body - }; - }, - - createClassImplements: function (id, typeParameters) { - return { - type: Syntax.ClassImplements, - id: id, - typeParameters: typeParameters - }; - }, - - createClassExpression: function (id, superClass, body, typeParameters, superTypeParameters, implemented) { - return { - type: Syntax.ClassExpression, - id: id, - superClass: superClass, - body: body, - typeParameters: typeParameters, - superTypeParameters: superTypeParameters, - "implements": implemented - }; - }, - - createClassDeclaration: function (id, superClass, body, typeParameters, superTypeParameters, implemented) { - return { - type: Syntax.ClassDeclaration, - id: id, - superClass: superClass, - body: body, - typeParameters: typeParameters, - superTypeParameters: superTypeParameters, - "implements": implemented - }; - }, - - createModuleSpecifier: function (token) { - return { - type: Syntax.ModuleSpecifier, - value: token.value, - raw: source.slice(token.range[0], token.range[1]) - }; - }, - - createExportSpecifier: function (id, name) { - return { - type: Syntax.ExportSpecifier, - id: id, - name: name - }; - }, - - createExportBatchSpecifier: function () { - return { - type: Syntax.ExportBatchSpecifier - }; - }, - - createImportDefaultSpecifier: function (id) { - return { - type: Syntax.ImportDefaultSpecifier, - id: id - }; - }, - - createImportNamespaceSpecifier: function (id) { - return { - type: Syntax.ImportNamespaceSpecifier, - id: id - }; - }, - - createExportDeclaration: function (isDefault, declaration, specifiers, src) { - return { - type: Syntax.ExportDeclaration, - 'default': !!isDefault, - declaration: declaration, - specifiers: specifiers, - source: src - }; - }, - - createImportSpecifier: function (id, name) { - return { - type: Syntax.ImportSpecifier, - id: id, - name: name - }; - }, - - createImportDeclaration: function (specifiers, src, isType) { - return { - type: Syntax.ImportDeclaration, - specifiers: specifiers, - source: src, - isType: isType - }; - }, - - createYieldExpression: function (argument, dlg) { - return { - type: Syntax.YieldExpression, - argument: argument, - delegate: dlg - }; - }, - - createAwaitExpression: function (argument) { - return { - type: Syntax.AwaitExpression, - argument: argument - }; - }, - - createComprehensionExpression: function (filter, blocks, body) { - return { - type: Syntax.ComprehensionExpression, - filter: filter, - blocks: blocks, - body: body - }; - } - - }; - - // Return true if there is a line terminator before the next token. - - function peekLineTerminator() { - var pos, line, start, found; - - pos = index; - line = lineNumber; - start = lineStart; - skipComment(); - found = lineNumber !== line; - index = pos; - lineNumber = line; - lineStart = start; - - return found; - } - - // Throw an exception - - function throwError(token, messageFormat) { - var error, - args = Array.prototype.slice.call(arguments, 2), - msg = messageFormat.replace( - /%(\d)/g, - function (whole, idx) { - assert(idx < args.length, 'Message reference must be in range'); - return args[idx]; - } - ); - - if (typeof token.lineNumber === 'number') { - error = new Error('Line ' + token.lineNumber + ': ' + msg); - error.index = token.range[0]; - error.lineNumber = token.lineNumber; - error.column = token.range[0] - lineStart + 1; - } else { - error = new Error('Line ' + lineNumber + ': ' + msg); - error.index = index; - error.lineNumber = lineNumber; - error.column = index - lineStart + 1; - } - - error.description = msg; - throw error; - } - - function throwErrorTolerant() { - try { - throwError.apply(null, arguments); - } catch (e) { - if (extra.errors) { - extra.errors.push(e); - } else { - throw e; - } - } - } - - - // Throw an exception because of the token. - - function throwUnexpected(token) { - if (token.type === Token.EOF) { - throwError(token, Messages.UnexpectedEOS); - } - - if (token.type === Token.NumericLiteral) { - throwError(token, Messages.UnexpectedNumber); - } - - if (token.type === Token.StringLiteral || token.type === Token.JSXText) { - throwError(token, Messages.UnexpectedString); - } - - if (token.type === Token.Identifier) { - throwError(token, Messages.UnexpectedIdentifier); - } - - if (token.type === Token.Keyword) { - if (isFutureReservedWord(token.value)) { - throwError(token, Messages.UnexpectedReserved); - } else if (strict && isStrictModeReservedWord(token.value)) { - throwErrorTolerant(token, Messages.StrictReservedWord); - return; - } - throwError(token, Messages.UnexpectedToken, token.value); - } - - if (token.type === Token.Template) { - throwError(token, Messages.UnexpectedTemplate, token.value.raw); - } - - // BooleanLiteral, NullLiteral, or Punctuator. - throwError(token, Messages.UnexpectedToken, token.value); - } - - // Expect the next token to match the specified punctuator. - // If not, an exception will be thrown. - - function expect(value) { - var token = lex(); - if (token.type !== Token.Punctuator || token.value !== value) { - throwUnexpected(token); - } - } - - // Expect the next token to match the specified keyword. - // If not, an exception will be thrown. - - function expectKeyword(keyword, contextual) { - var token = lex(); - if (token.type !== (contextual ? Token.Identifier : Token.Keyword) || - token.value !== keyword) { - throwUnexpected(token); - } - } - - // Expect the next token to match the specified contextual keyword. - // If not, an exception will be thrown. - - function expectContextualKeyword(keyword) { - return expectKeyword(keyword, true); - } - - // Return true if the next token matches the specified punctuator. - - function match(value) { - return lookahead.type === Token.Punctuator && lookahead.value === value; - } - - // Return true if the next token matches the specified keyword - - function matchKeyword(keyword, contextual) { - var expectedType = contextual ? Token.Identifier : Token.Keyword; - return lookahead.type === expectedType && lookahead.value === keyword; - } - - // Return true if the next token matches the specified contextual keyword - - function matchContextualKeyword(keyword) { - return matchKeyword(keyword, true); - } - - // Return true if the next token is an assignment operator - - function matchAssign() { - var op; - - if (lookahead.type !== Token.Punctuator) { - return false; - } - op = lookahead.value; - return op === '=' || - op === '*=' || - op === '/=' || - op === '%=' || - op === '+=' || - op === '-=' || - op === '<<=' || - op === '>>=' || - op === '>>>=' || - op === '&=' || - op === '^=' || - op === '|='; - } - - // Note that 'yield' is treated as a keyword in strict mode, but a - // contextual keyword (identifier) in non-strict mode, so we need to - // use matchKeyword('yield', false) and matchKeyword('yield', true) - // (i.e. matchContextualKeyword) appropriately. - function matchYield() { - return state.yieldAllowed && matchKeyword('yield', !strict); - } - - function matchAsync() { - var backtrackToken = lookahead, matches = false; - - if (matchContextualKeyword('async')) { - lex(); // Make sure peekLineTerminator() starts after 'async'. - matches = !peekLineTerminator(); - rewind(backtrackToken); // Revert the lex(). - } - - return matches; - } - - function matchAwait() { - return state.awaitAllowed && matchContextualKeyword('await'); - } - - function consumeSemicolon() { - var line, oldIndex = index, oldLineNumber = lineNumber, - oldLineStart = lineStart, oldLookahead = lookahead; - - // Catch the very common case first: immediately a semicolon (char #59). - if (source.charCodeAt(index) === 59) { - lex(); - return; - } - - line = lineNumber; - skipComment(); - if (lineNumber !== line) { - index = oldIndex; - lineNumber = oldLineNumber; - lineStart = oldLineStart; - lookahead = oldLookahead; - return; - } - - if (match(';')) { - lex(); - return; - } - - if (lookahead.type !== Token.EOF && !match('}')) { - throwUnexpected(lookahead); - } - } - - // Return true if provided expression is LeftHandSideExpression - - function isLeftHandSide(expr) { - return expr.type === Syntax.Identifier || expr.type === Syntax.MemberExpression; - } - - function isAssignableLeftHandSide(expr) { - return isLeftHandSide(expr) || expr.type === Syntax.ObjectPattern || expr.type === Syntax.ArrayPattern; - } - - // 11.1.4 Array Initialiser - - function parseArrayInitialiser() { - var elements = [], blocks = [], filter = null, tmp, possiblecomprehension = true, - marker = markerCreate(); - - expect('['); - while (!match(']')) { - if (lookahead.value === 'for' && - lookahead.type === Token.Keyword) { - if (!possiblecomprehension) { - throwError({}, Messages.ComprehensionError); - } - matchKeyword('for'); - tmp = parseForStatement({ignoreBody: true}); - tmp.of = tmp.type === Syntax.ForOfStatement; - tmp.type = Syntax.ComprehensionBlock; - if (tmp.left.kind) { // can't be let or const - throwError({}, Messages.ComprehensionError); - } - blocks.push(tmp); - } else if (lookahead.value === 'if' && - lookahead.type === Token.Keyword) { - if (!possiblecomprehension) { - throwError({}, Messages.ComprehensionError); - } - expectKeyword('if'); - expect('('); - filter = parseExpression(); - expect(')'); - } else if (lookahead.value === ',' && - lookahead.type === Token.Punctuator) { - possiblecomprehension = false; // no longer allowed. - lex(); - elements.push(null); - } else { - tmp = parseSpreadOrAssignmentExpression(); - elements.push(tmp); - if (tmp && tmp.type === Syntax.SpreadElement) { - if (!match(']')) { - throwError({}, Messages.ElementAfterSpreadElement); - } - } else if (!(match(']') || matchKeyword('for') || matchKeyword('if'))) { - expect(','); // this lexes. - possiblecomprehension = false; - } - } - } - - expect(']'); - - if (filter && !blocks.length) { - throwError({}, Messages.ComprehensionRequiresBlock); - } - - if (blocks.length) { - if (elements.length !== 1) { - throwError({}, Messages.ComprehensionError); - } - return markerApply(marker, delegate.createComprehensionExpression(filter, blocks, elements[0])); - } - return markerApply(marker, delegate.createArrayExpression(elements)); - } - - // 11.1.5 Object Initialiser - - function parsePropertyFunction(options) { - var previousStrict, previousYieldAllowed, previousAwaitAllowed, - params, defaults, body, marker = markerCreate(); - - previousStrict = strict; - previousYieldAllowed = state.yieldAllowed; - state.yieldAllowed = options.generator; - previousAwaitAllowed = state.awaitAllowed; - state.awaitAllowed = options.async; - params = options.params || []; - defaults = options.defaults || []; - - body = parseConciseBody(); - if (options.name && strict && isRestrictedWord(params[0].name)) { - throwErrorTolerant(options.name, Messages.StrictParamName); - } - strict = previousStrict; - state.yieldAllowed = previousYieldAllowed; - state.awaitAllowed = previousAwaitAllowed; - - return markerApply(marker, delegate.createFunctionExpression( - null, - params, - defaults, - body, - options.rest || null, - options.generator, - body.type !== Syntax.BlockStatement, - options.async, - options.returnType, - options.typeParameters - )); - } - - - function parsePropertyMethodFunction(options) { - var previousStrict, tmp, method; - - previousStrict = strict; - strict = true; - - tmp = parseParams(); - - if (tmp.stricted) { - throwErrorTolerant(tmp.stricted, tmp.message); - } - - method = parsePropertyFunction({ - params: tmp.params, - defaults: tmp.defaults, - rest: tmp.rest, - generator: options.generator, - async: options.async, - returnType: tmp.returnType, - typeParameters: options.typeParameters - }); - - strict = previousStrict; - - return method; - } - - - function parseObjectPropertyKey() { - var marker = markerCreate(), - token = lex(), - propertyKey, - result; - - // Note: This function is called only from parseObjectProperty(), where - // EOF and Punctuator tokens are already filtered out. - - if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) { - if (strict && token.octal) { - throwErrorTolerant(token, Messages.StrictOctalLiteral); - } - return markerApply(marker, delegate.createLiteral(token)); - } - - if (token.type === Token.Punctuator && token.value === '[') { - // For computed properties we should skip the [ and ], and - // capture in marker only the assignment expression itself. - marker = markerCreate(); - propertyKey = parseAssignmentExpression(); - result = markerApply(marker, propertyKey); - expect(']'); - return result; - } - - return markerApply(marker, delegate.createIdentifier(token.value)); - } - - function parseObjectProperty() { - var token, key, id, param, computed, - marker = markerCreate(), returnType, typeParameters; - - token = lookahead; - computed = (token.value === '[' && token.type === Token.Punctuator); - - if (token.type === Token.Identifier || computed || matchAsync()) { - id = parseObjectPropertyKey(); - - if (match(':')) { - lex(); - - return markerApply( - marker, - delegate.createProperty( - 'init', - id, - parseAssignmentExpression(), - false, - false, - computed - ) - ); - } - - if (match('(') || match('<')) { - if (match('<')) { - typeParameters = parseTypeParameterDeclaration(); - } - return markerApply( - marker, - delegate.createProperty( - 'init', - id, - parsePropertyMethodFunction({ - generator: false, - async: false, - typeParameters: typeParameters - }), - true, - false, - computed - ) - ); - } - - // Property Assignment: Getter and Setter. - - if (token.value === 'get') { - computed = (lookahead.value === '['); - key = parseObjectPropertyKey(); - - expect('('); - expect(')'); - if (match(':')) { - returnType = parseTypeAnnotation(); - } - - return markerApply( - marker, - delegate.createProperty( - 'get', - key, - parsePropertyFunction({ - generator: false, - async: false, - returnType: returnType - }), - false, - false, - computed - ) - ); - } - - if (token.value === 'set') { - computed = (lookahead.value === '['); - key = parseObjectPropertyKey(); - - expect('('); - token = lookahead; - param = [ parseTypeAnnotatableIdentifier() ]; - expect(')'); - if (match(':')) { - returnType = parseTypeAnnotation(); - } - - return markerApply( - marker, - delegate.createProperty( - 'set', - key, - parsePropertyFunction({ - params: param, - generator: false, - async: false, - name: token, - returnType: returnType - }), - false, - false, - computed - ) - ); - } - - if (token.value === 'async') { - computed = (lookahead.value === '['); - key = parseObjectPropertyKey(); - - if (match('<')) { - typeParameters = parseTypeParameterDeclaration(); - } - - return markerApply( - marker, - delegate.createProperty( - 'init', - key, - parsePropertyMethodFunction({ - generator: false, - async: true, - typeParameters: typeParameters - }), - true, - false, - computed - ) - ); - } - - if (computed) { - // Computed properties can only be used with full notation. - throwUnexpected(lookahead); - } - - return markerApply( - marker, - delegate.createProperty('init', id, id, false, true, false) - ); - } - - if (token.type === Token.EOF || token.type === Token.Punctuator) { - if (!match('*')) { - throwUnexpected(token); - } - lex(); - - computed = (lookahead.type === Token.Punctuator && lookahead.value === '['); - - id = parseObjectPropertyKey(); - - if (match('<')) { - typeParameters = parseTypeParameterDeclaration(); - } - - if (!match('(')) { - throwUnexpected(lex()); - } - - return markerApply(marker, delegate.createProperty( - 'init', - id, - parsePropertyMethodFunction({ - generator: true, - typeParameters: typeParameters - }), - true, - false, - computed - )); - } - key = parseObjectPropertyKey(); - if (match(':')) { - lex(); - return markerApply(marker, delegate.createProperty('init', key, parseAssignmentExpression(), false, false, false)); - } - if (match('(') || match('<')) { - if (match('<')) { - typeParameters = parseTypeParameterDeclaration(); - } - return markerApply(marker, delegate.createProperty( - 'init', - key, - parsePropertyMethodFunction({ - generator: false, - typeParameters: typeParameters - }), - true, - false, - false - )); - } - throwUnexpected(lex()); - } - - function parseObjectSpreadProperty() { - var marker = markerCreate(); - expect('...'); - return markerApply(marker, delegate.createSpreadProperty(parseAssignmentExpression())); - } - - function getFieldName(key) { - var toString = String; - if (key.type === Syntax.Identifier) { - return key.name; - } - return toString(key.value); - } - - function parseObjectInitialiser() { - var properties = [], property, name, kind, storedKind, map = new StringMap(), - marker = markerCreate(), toString = String; - - expect('{'); - - while (!match('}')) { - if (match('...')) { - property = parseObjectSpreadProperty(); - } else { - property = parseObjectProperty(); - - if (property.key.type === Syntax.Identifier) { - name = property.key.name; - } else { - name = toString(property.key.value); - } - kind = (property.kind === 'init') ? PropertyKind.Data : (property.kind === 'get') ? PropertyKind.Get : PropertyKind.Set; - - if (map.has(name)) { - storedKind = map.get(name); - if (storedKind === PropertyKind.Data) { - if (strict && kind === PropertyKind.Data) { - throwErrorTolerant({}, Messages.StrictDuplicateProperty); - } else if (kind !== PropertyKind.Data) { - throwErrorTolerant({}, Messages.AccessorDataProperty); - } - } else { - if (kind === PropertyKind.Data) { - throwErrorTolerant({}, Messages.AccessorDataProperty); - } else if (storedKind & kind) { - throwErrorTolerant({}, Messages.AccessorGetSet); - } - } - map.set(name, storedKind | kind); - } else { - map.set(name, kind); - } - } - - properties.push(property); - - if (!match('}')) { - expect(','); - } - } - - expect('}'); - - return markerApply(marker, delegate.createObjectExpression(properties)); - } - - function parseTemplateElement(option) { - var marker = markerCreate(), - token = scanTemplateElement(option); - if (strict && token.octal) { - throwError(token, Messages.StrictOctalLiteral); - } - return markerApply(marker, delegate.createTemplateElement({ raw: token.value.raw, cooked: token.value.cooked }, token.tail)); - } - - function parseTemplateLiteral() { - var quasi, quasis, expressions, marker = markerCreate(); - - quasi = parseTemplateElement({ head: true }); - quasis = [ quasi ]; - expressions = []; - - while (!quasi.tail) { - expressions.push(parseExpression()); - quasi = parseTemplateElement({ head: false }); - quasis.push(quasi); - } - - return markerApply(marker, delegate.createTemplateLiteral(quasis, expressions)); - } - - // 11.1.6 The Grouping Operator - - function parseGroupExpression() { - var expr, marker, typeAnnotation; - - expect('('); - - ++state.parenthesizedCount; - - marker = markerCreate(); - - expr = parseExpression(); - - if (match(':')) { - typeAnnotation = parseTypeAnnotation(); - expr = markerApply(marker, delegate.createTypeCast( - expr, - typeAnnotation - )); - } - - expect(')'); - - return expr; - } - - function matchAsyncFuncExprOrDecl() { - var token; - - if (matchAsync()) { - token = lookahead2(); - if (token.type === Token.Keyword && token.value === 'function') { - return true; - } - } - - return false; - } - - // 11.1 Primary Expressions - - function parsePrimaryExpression() { - var marker, type, token, expr; - - type = lookahead.type; - - if (type === Token.Identifier) { - marker = markerCreate(); - return markerApply(marker, delegate.createIdentifier(lex().value)); - } - - if (type === Token.StringLiteral || type === Token.NumericLiteral) { - if (strict && lookahead.octal) { - throwErrorTolerant(lookahead, Messages.StrictOctalLiteral); - } - marker = markerCreate(); - return markerApply(marker, delegate.createLiteral(lex())); - } - - if (type === Token.Keyword) { - if (matchKeyword('this')) { - marker = markerCreate(); - lex(); - return markerApply(marker, delegate.createThisExpression()); - } - - if (matchKeyword('function')) { - return parseFunctionExpression(); - } - - if (matchKeyword('class')) { - return parseClassExpression(); - } - - if (matchKeyword('super')) { - marker = markerCreate(); - lex(); - return markerApply(marker, delegate.createIdentifier('super')); - } - } - - if (type === Token.BooleanLiteral) { - marker = markerCreate(); - token = lex(); - token.value = (token.value === 'true'); - return markerApply(marker, delegate.createLiteral(token)); - } - - if (type === Token.NullLiteral) { - marker = markerCreate(); - token = lex(); - token.value = null; - return markerApply(marker, delegate.createLiteral(token)); - } - - if (match('[')) { - return parseArrayInitialiser(); - } - - if (match('{')) { - return parseObjectInitialiser(); - } - - if (match('(')) { - return parseGroupExpression(); - } - - if (match('/') || match('/=')) { - marker = markerCreate(); - expr = delegate.createLiteral(scanRegExp()); - peek(); - return markerApply(marker, expr); - } - - if (type === Token.Template) { - return parseTemplateLiteral(); - } - - if (match('<')) { - return parseJSXElement(); - } - - throwUnexpected(lex()); - } - - // 11.2 Left-Hand-Side Expressions - - function parseArguments() { - var args = [], arg; - - expect('('); - - if (!match(')')) { - while (index < length) { - arg = parseSpreadOrAssignmentExpression(); - args.push(arg); - - if (match(')')) { - break; - } else if (arg.type === Syntax.SpreadElement) { - throwError({}, Messages.ElementAfterSpreadElement); - } - - expect(','); - } - } - - expect(')'); - - return args; - } - - function parseSpreadOrAssignmentExpression() { - if (match('...')) { - var marker = markerCreate(); - lex(); - return markerApply(marker, delegate.createSpreadElement(parseAssignmentExpression())); - } - return parseAssignmentExpression(); - } - - function parseNonComputedProperty() { - var marker = markerCreate(), - token = lex(); - - if (!isIdentifierName(token)) { - throwUnexpected(token); - } - - return markerApply(marker, delegate.createIdentifier(token.value)); - } - - function parseNonComputedMember() { - expect('.'); - - return parseNonComputedProperty(); - } - - function parseComputedMember() { - var expr; - - expect('['); - - expr = parseExpression(); - - expect(']'); - - return expr; - } - - function parseNewExpression() { - var callee, args, marker = markerCreate(); - - expectKeyword('new'); - callee = parseLeftHandSideExpression(); - args = match('(') ? parseArguments() : []; - - return markerApply(marker, delegate.createNewExpression(callee, args)); - } - - function parseLeftHandSideExpressionAllowCall() { - var expr, args, marker = markerCreate(); - - expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression(); - - while (match('.') || match('[') || match('(') || lookahead.type === Token.Template) { - if (match('(')) { - args = parseArguments(); - expr = markerApply(marker, delegate.createCallExpression(expr, args)); - } else if (match('[')) { - expr = markerApply(marker, delegate.createMemberExpression('[', expr, parseComputedMember())); - } else if (match('.')) { - expr = markerApply(marker, delegate.createMemberExpression('.', expr, parseNonComputedMember())); - } else { - expr = markerApply(marker, delegate.createTaggedTemplateExpression(expr, parseTemplateLiteral())); - } - } - - return expr; - } - - function parseLeftHandSideExpression() { - var expr, marker = markerCreate(); - - expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression(); - - while (match('.') || match('[') || lookahead.type === Token.Template) { - if (match('[')) { - expr = markerApply(marker, delegate.createMemberExpression('[', expr, parseComputedMember())); - } else if (match('.')) { - expr = markerApply(marker, delegate.createMemberExpression('.', expr, parseNonComputedMember())); - } else { - expr = markerApply(marker, delegate.createTaggedTemplateExpression(expr, parseTemplateLiteral())); - } - } - - return expr; - } - - // 11.3 Postfix Expressions - - function parsePostfixExpression() { - var marker = markerCreate(), - expr = parseLeftHandSideExpressionAllowCall(), - token; - - if (lookahead.type !== Token.Punctuator) { - return expr; - } - - if ((match('++') || match('--')) && !peekLineTerminator()) { - // 11.3.1, 11.3.2 - if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) { - throwErrorTolerant({}, Messages.StrictLHSPostfix); - } - - if (!isLeftHandSide(expr)) { - throwError({}, Messages.InvalidLHSInAssignment); - } - - token = lex(); - expr = markerApply(marker, delegate.createPostfixExpression(token.value, expr)); - } - - return expr; - } - - // 11.4 Unary Operators - - function parseUnaryExpression() { - var marker, token, expr; - - if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) { - return parsePostfixExpression(); - } - - if (match('++') || match('--')) { - marker = markerCreate(); - token = lex(); - expr = parseUnaryExpression(); - // 11.4.4, 11.4.5 - if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) { - throwErrorTolerant({}, Messages.StrictLHSPrefix); - } - - if (!isLeftHandSide(expr)) { - throwError({}, Messages.InvalidLHSInAssignment); - } - - return markerApply(marker, delegate.createUnaryExpression(token.value, expr)); - } - - if (match('+') || match('-') || match('~') || match('!')) { - marker = markerCreate(); - token = lex(); - expr = parseUnaryExpression(); - return markerApply(marker, delegate.createUnaryExpression(token.value, expr)); - } - - if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) { - marker = markerCreate(); - token = lex(); - expr = parseUnaryExpression(); - expr = markerApply(marker, delegate.createUnaryExpression(token.value, expr)); - if (strict && expr.operator === 'delete' && expr.argument.type === Syntax.Identifier) { - throwErrorTolerant({}, Messages.StrictDelete); - } - return expr; - } - - return parsePostfixExpression(); - } - - function binaryPrecedence(token, allowIn) { - var prec = 0; - - if (token.type !== Token.Punctuator && token.type !== Token.Keyword) { - return 0; - } - - switch (token.value) { - case '||': - prec = 1; - break; - - case '&&': - prec = 2; - break; - - case '|': - prec = 3; - break; - - case '^': - prec = 4; - break; - - case '&': - prec = 5; - break; - - case '==': - case '!=': - case '===': - case '!==': - prec = 6; - break; - - case '<': - case '>': - case '<=': - case '>=': - case 'instanceof': - prec = 7; - break; - - case 'in': - prec = allowIn ? 7 : 0; - break; - - case '<<': - case '>>': - case '>>>': - prec = 8; - break; - - case '+': - case '-': - prec = 9; - break; - - case '*': - case '/': - case '%': - prec = 11; - break; - - default: - break; - } - - return prec; - } - - // 11.5 Multiplicative Operators - // 11.6 Additive Operators - // 11.7 Bitwise Shift Operators - // 11.8 Relational Operators - // 11.9 Equality Operators - // 11.10 Binary Bitwise Operators - // 11.11 Binary Logical Operators - - function parseBinaryExpression() { - var expr, token, prec, previousAllowIn, stack, right, operator, left, i, - marker, markers; - - previousAllowIn = state.allowIn; - state.allowIn = true; - - marker = markerCreate(); - left = parseUnaryExpression(); - - token = lookahead; - prec = binaryPrecedence(token, previousAllowIn); - if (prec === 0) { - return left; - } - token.prec = prec; - lex(); - - markers = [marker, markerCreate()]; - right = parseUnaryExpression(); - - stack = [left, token, right]; - - while ((prec = binaryPrecedence(lookahead, previousAllowIn)) > 0) { - - // Reduce: make a binary expression from the three topmost entries. - while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) { - right = stack.pop(); - operator = stack.pop().value; - left = stack.pop(); - expr = delegate.createBinaryExpression(operator, left, right); - markers.pop(); - marker = markers.pop(); - markerApply(marker, expr); - stack.push(expr); - markers.push(marker); - } - - // Shift. - token = lex(); - token.prec = prec; - stack.push(token); - markers.push(markerCreate()); - expr = parseUnaryExpression(); - stack.push(expr); - } - - state.allowIn = previousAllowIn; - - // Final reduce to clean-up the stack. - i = stack.length - 1; - expr = stack[i]; - markers.pop(); - while (i > 1) { - expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr); - i -= 2; - marker = markers.pop(); - markerApply(marker, expr); - } - - return expr; - } - - - // 11.12 Conditional Operator - - function parseConditionalExpression() { - var expr, previousAllowIn, consequent, alternate, marker = markerCreate(); - expr = parseBinaryExpression(); - - if (match('?')) { - lex(); - previousAllowIn = state.allowIn; - state.allowIn = true; - consequent = parseAssignmentExpression(); - state.allowIn = previousAllowIn; - expect(':'); - alternate = parseAssignmentExpression(); - - expr = markerApply(marker, delegate.createConditionalExpression(expr, consequent, alternate)); - } - - return expr; - } - - // 11.13 Assignment Operators - - // 12.14.5 AssignmentPattern - - function reinterpretAsAssignmentBindingPattern(expr) { - var i, len, property, element; - - if (expr.type === Syntax.ObjectExpression) { - expr.type = Syntax.ObjectPattern; - for (i = 0, len = expr.properties.length; i < len; i += 1) { - property = expr.properties[i]; - if (property.type === Syntax.SpreadProperty) { - if (i < len - 1) { - throwError({}, Messages.PropertyAfterSpreadProperty); - } - reinterpretAsAssignmentBindingPattern(property.argument); - } else { - if (property.kind !== 'init') { - throwError({}, Messages.InvalidLHSInAssignment); - } - reinterpretAsAssignmentBindingPattern(property.value); - } - } - } else if (expr.type === Syntax.ArrayExpression) { - expr.type = Syntax.ArrayPattern; - for (i = 0, len = expr.elements.length; i < len; i += 1) { - element = expr.elements[i]; - /* istanbul ignore else */ - if (element) { - reinterpretAsAssignmentBindingPattern(element); - } - } - } else if (expr.type === Syntax.Identifier) { - if (isRestrictedWord(expr.name)) { - throwError({}, Messages.InvalidLHSInAssignment); - } - } else if (expr.type === Syntax.SpreadElement) { - reinterpretAsAssignmentBindingPattern(expr.argument); - if (expr.argument.type === Syntax.ObjectPattern) { - throwError({}, Messages.ObjectPatternAsSpread); - } - } else { - /* istanbul ignore else */ - if (expr.type !== Syntax.MemberExpression && expr.type !== Syntax.CallExpression && expr.type !== Syntax.NewExpression) { - throwError({}, Messages.InvalidLHSInAssignment); - } - } - } - - // 13.2.3 BindingPattern - - function reinterpretAsDestructuredParameter(options, expr) { - var i, len, property, element; - - if (expr.type === Syntax.ObjectExpression) { - expr.type = Syntax.ObjectPattern; - for (i = 0, len = expr.properties.length; i < len; i += 1) { - property = expr.properties[i]; - if (property.type === Syntax.SpreadProperty) { - if (i < len - 1) { - throwError({}, Messages.PropertyAfterSpreadProperty); - } - reinterpretAsDestructuredParameter(options, property.argument); - } else { - if (property.kind !== 'init') { - throwError({}, Messages.InvalidLHSInFormalsList); - } - reinterpretAsDestructuredParameter(options, property.value); - } - } - } else if (expr.type === Syntax.ArrayExpression) { - expr.type = Syntax.ArrayPattern; - for (i = 0, len = expr.elements.length; i < len; i += 1) { - element = expr.elements[i]; - if (element) { - reinterpretAsDestructuredParameter(options, element); - } - } - } else if (expr.type === Syntax.Identifier) { - validateParam(options, expr, expr.name); - } else if (expr.type === Syntax.SpreadElement) { - // BindingRestElement only allows BindingIdentifier - if (expr.argument.type !== Syntax.Identifier) { - throwError({}, Messages.InvalidLHSInFormalsList); - } - validateParam(options, expr.argument, expr.argument.name); - } else { - throwError({}, Messages.InvalidLHSInFormalsList); - } - } - - function reinterpretAsCoverFormalsList(expressions) { - var i, len, param, params, defaults, defaultCount, options, rest; - - params = []; - defaults = []; - defaultCount = 0; - rest = null; - options = { - paramSet: new StringMap() - }; - - for (i = 0, len = expressions.length; i < len; i += 1) { - param = expressions[i]; - if (param.type === Syntax.Identifier) { - params.push(param); - defaults.push(null); - validateParam(options, param, param.name); - } else if (param.type === Syntax.ObjectExpression || param.type === Syntax.ArrayExpression) { - reinterpretAsDestructuredParameter(options, param); - params.push(param); - defaults.push(null); - } else if (param.type === Syntax.SpreadElement) { - assert(i === len - 1, 'It is guaranteed that SpreadElement is last element by parseExpression'); - if (param.argument.type !== Syntax.Identifier) { - throwError({}, Messages.InvalidLHSInFormalsList); - } - reinterpretAsDestructuredParameter(options, param.argument); - rest = param.argument; - } else if (param.type === Syntax.AssignmentExpression) { - params.push(param.left); - defaults.push(param.right); - ++defaultCount; - validateParam(options, param.left, param.left.name); - } else { - return null; - } - } - - if (options.message === Messages.StrictParamDupe) { - throwError( - strict ? options.stricted : options.firstRestricted, - options.message - ); - } - - if (defaultCount === 0) { - defaults = []; - } - - return { - params: params, - defaults: defaults, - rest: rest, - stricted: options.stricted, - firstRestricted: options.firstRestricted, - message: options.message - }; - } - - function parseArrowFunctionExpression(options, marker) { - var previousStrict, previousYieldAllowed, previousAwaitAllowed, body; - - expect('=>'); - - previousStrict = strict; - previousYieldAllowed = state.yieldAllowed; - state.yieldAllowed = false; - previousAwaitAllowed = state.awaitAllowed; - state.awaitAllowed = !!options.async; - body = parseConciseBody(); - - if (strict && options.firstRestricted) { - throwError(options.firstRestricted, options.message); - } - if (strict && options.stricted) { - throwErrorTolerant(options.stricted, options.message); - } - - strict = previousStrict; - state.yieldAllowed = previousYieldAllowed; - state.awaitAllowed = previousAwaitAllowed; - - return markerApply(marker, delegate.createArrowFunctionExpression( - options.params, - options.defaults, - body, - options.rest, - body.type !== Syntax.BlockStatement, - !!options.async - )); - } - - function parseAssignmentExpression() { - var marker, expr, token, params, oldParenthesizedCount, - startsWithParen = false, backtrackToken = lookahead, - possiblyAsync = false; - - if (matchYield()) { - return parseYieldExpression(); - } - - if (matchAwait()) { - return parseAwaitExpression(); - } - - oldParenthesizedCount = state.parenthesizedCount; - - marker = markerCreate(); - - if (matchAsyncFuncExprOrDecl()) { - return parseFunctionExpression(); - } - - if (matchAsync()) { - // We can't be completely sure that this 'async' token is - // actually a contextual keyword modifying a function - // expression, so we might have to un-lex() it later by - // calling rewind(backtrackToken). - possiblyAsync = true; - lex(); - } - - if (match('(')) { - token = lookahead2(); - if ((token.type === Token.Punctuator && token.value === ')') || token.value === '...') { - params = parseParams(); - if (!match('=>')) { - throwUnexpected(lex()); - } - params.async = possiblyAsync; - return parseArrowFunctionExpression(params, marker); - } - startsWithParen = true; - } - - token = lookahead; - - // If the 'async' keyword is not followed by a '(' character or an - // identifier, then it can't be an arrow function modifier, and we - // should interpret it as a normal identifer. - if (possiblyAsync && !match('(') && token.type !== Token.Identifier) { - possiblyAsync = false; - rewind(backtrackToken); - } - - expr = parseConditionalExpression(); - - if (match('=>') && - (state.parenthesizedCount === oldParenthesizedCount || - state.parenthesizedCount === (oldParenthesizedCount + 1))) { - if (expr.type === Syntax.Identifier) { - params = reinterpretAsCoverFormalsList([ expr ]); - } else if (expr.type === Syntax.AssignmentExpression || - expr.type === Syntax.ArrayExpression || - expr.type === Syntax.ObjectExpression) { - if (!startsWithParen) { - throwUnexpected(lex()); - } - params = reinterpretAsCoverFormalsList([ expr ]); - } else if (expr.type === Syntax.SequenceExpression) { - params = reinterpretAsCoverFormalsList(expr.expressions); - } - if (params) { - params.async = possiblyAsync; - return parseArrowFunctionExpression(params, marker); - } - } - - // If we haven't returned by now, then the 'async' keyword was not - // a function modifier, and we should rewind and interpret it as a - // normal identifier. - if (possiblyAsync) { - possiblyAsync = false; - rewind(backtrackToken); - expr = parseConditionalExpression(); - } - - if (matchAssign()) { - // 11.13.1 - if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) { - throwErrorTolerant(token, Messages.StrictLHSAssignment); - } - - // ES.next draf 11.13 Runtime Semantics step 1 - if (match('=') && (expr.type === Syntax.ObjectExpression || expr.type === Syntax.ArrayExpression)) { - reinterpretAsAssignmentBindingPattern(expr); - } else if (!isLeftHandSide(expr)) { - throwError({}, Messages.InvalidLHSInAssignment); - } - - expr = markerApply(marker, delegate.createAssignmentExpression(lex().value, expr, parseAssignmentExpression())); - } - - return expr; - } - - // 11.14 Comma Operator - - function parseExpression() { - var marker, expr, expressions, sequence, spreadFound; - - marker = markerCreate(); - expr = parseAssignmentExpression(); - expressions = [ expr ]; - - if (match(',')) { - while (index < length) { - if (!match(',')) { - break; - } - - lex(); - expr = parseSpreadOrAssignmentExpression(); - expressions.push(expr); - - if (expr.type === Syntax.SpreadElement) { - spreadFound = true; - if (!match(')')) { - throwError({}, Messages.ElementAfterSpreadElement); - } - break; - } - } - - sequence = markerApply(marker, delegate.createSequenceExpression(expressions)); - } - - if (spreadFound && lookahead2().value !== '=>') { - throwError({}, Messages.IllegalSpread); - } - - return sequence || expr; - } - - // 12.1 Block - - function parseStatementList() { - var list = [], - statement; - - while (index < length) { - if (match('}')) { - break; - } - statement = parseSourceElement(); - if (typeof statement === 'undefined') { - break; - } - list.push(statement); - } - - return list; - } - - function parseBlock() { - var block, marker = markerCreate(); - - expect('{'); - - block = parseStatementList(); - - expect('}'); - - return markerApply(marker, delegate.createBlockStatement(block)); - } - - // 12.2 Variable Statement - - function parseTypeParameterDeclaration() { - var marker = markerCreate(), paramTypes = []; - - expect('<'); - while (!match('>')) { - paramTypes.push(parseTypeAnnotatableIdentifier()); - if (!match('>')) { - expect(','); - } - } - expect('>'); - - return markerApply(marker, delegate.createTypeParameterDeclaration( - paramTypes - )); - } - - function parseTypeParameterInstantiation() { - var marker = markerCreate(), oldInType = state.inType, paramTypes = []; - - state.inType = true; - - expect('<'); - while (!match('>')) { - paramTypes.push(parseType()); - if (!match('>')) { - expect(','); - } - } - expect('>'); - - state.inType = oldInType; - - return markerApply(marker, delegate.createTypeParameterInstantiation( - paramTypes - )); - } - - function parseObjectTypeIndexer(marker, isStatic) { - var id, key, value; - - expect('['); - id = parseObjectPropertyKey(); - expect(':'); - key = parseType(); - expect(']'); - expect(':'); - value = parseType(); - - return markerApply(marker, delegate.createObjectTypeIndexer( - id, - key, - value, - isStatic - )); - } - - function parseObjectTypeMethodish(marker) { - var params = [], rest = null, returnType, typeParameters = null; - if (match('<')) { - typeParameters = parseTypeParameterDeclaration(); - } - - expect('('); - while (lookahead.type === Token.Identifier) { - params.push(parseFunctionTypeParam()); - if (!match(')')) { - expect(','); - } - } - - if (match('...')) { - lex(); - rest = parseFunctionTypeParam(); - } - expect(')'); - expect(':'); - returnType = parseType(); - - return markerApply(marker, delegate.createFunctionTypeAnnotation( - params, - returnType, - rest, - typeParameters - )); - } - - function parseObjectTypeMethod(marker, isStatic, key) { - var optional = false, value; - value = parseObjectTypeMethodish(marker); - - return markerApply(marker, delegate.createObjectTypeProperty( - key, - value, - optional, - isStatic - )); - } - - function parseObjectTypeCallProperty(marker, isStatic) { - var valueMarker = markerCreate(); - return markerApply(marker, delegate.createObjectTypeCallProperty( - parseObjectTypeMethodish(valueMarker), - isStatic - )); - } - - function parseObjectType(allowStatic) { - var callProperties = [], indexers = [], marker, optional = false, - properties = [], propertyKey, propertyTypeAnnotation, - token, isStatic, matchStatic; - - expect('{'); - - while (!match('}')) { - marker = markerCreate(); - matchStatic = - strict - ? matchKeyword('static') - : matchContextualKeyword('static'); - - if (allowStatic && matchStatic) { - token = lex(); - isStatic = true; - } - - if (match('[')) { - indexers.push(parseObjectTypeIndexer(marker, isStatic)); - } else if (match('(') || match('<')) { - callProperties.push(parseObjectTypeCallProperty(marker, allowStatic)); - } else { - if (isStatic && match(':')) { - propertyKey = markerApply(marker, delegate.createIdentifier(token)); - throwErrorTolerant(token, Messages.StrictReservedWord); - } else { - propertyKey = parseObjectPropertyKey(); - } - if (match('<') || match('(')) { - // This is a method property - properties.push(parseObjectTypeMethod(marker, isStatic, propertyKey)); - } else { - if (match('?')) { - lex(); - optional = true; - } - expect(':'); - propertyTypeAnnotation = parseType(); - properties.push(markerApply(marker, delegate.createObjectTypeProperty( - propertyKey, - propertyTypeAnnotation, - optional, - isStatic - ))); - } - } - - if (match(';')) { - lex(); - } else if (!match('}')) { - throwUnexpected(lookahead); - } - } - - expect('}'); - - return delegate.createObjectTypeAnnotation( - properties, - indexers, - callProperties - ); - } - - function parseGenericType() { - var marker = markerCreate(), - typeParameters = null, typeIdentifier; - - typeIdentifier = parseVariableIdentifier(); - - while (match('.')) { - expect('.'); - typeIdentifier = markerApply(marker, delegate.createQualifiedTypeIdentifier( - typeIdentifier, - parseVariableIdentifier() - )); - } - - if (match('<')) { - typeParameters = parseTypeParameterInstantiation(); - } - - return markerApply(marker, delegate.createGenericTypeAnnotation( - typeIdentifier, - typeParameters - )); - } - - function parseVoidType() { - var marker = markerCreate(); - expectKeyword('void'); - return markerApply(marker, delegate.createVoidTypeAnnotation()); - } - - function parseTypeofType() { - var argument, marker = markerCreate(); - expectKeyword('typeof'); - argument = parsePrimaryType(); - return markerApply(marker, delegate.createTypeofTypeAnnotation( - argument - )); - } - - function parseTupleType() { - var marker = markerCreate(), types = []; - expect('['); - // We allow trailing commas - while (index < length && !match(']')) { - types.push(parseType()); - if (match(']')) { - break; - } - expect(','); - } - expect(']'); - return markerApply(marker, delegate.createTupleTypeAnnotation( - types - )); - } - - function parseFunctionTypeParam() { - var marker = markerCreate(), name, optional = false, typeAnnotation; - name = parseVariableIdentifier(); - if (match('?')) { - lex(); - optional = true; - } - expect(':'); - typeAnnotation = parseType(); - return markerApply(marker, delegate.createFunctionTypeParam( - name, - typeAnnotation, - optional - )); - } - - function parseFunctionTypeParams() { - var ret = { params: [], rest: null }; - while (lookahead.type === Token.Identifier) { - ret.params.push(parseFunctionTypeParam()); - if (!match(')')) { - expect(','); - } - } - - if (match('...')) { - lex(); - ret.rest = parseFunctionTypeParam(); - } - return ret; - } - - // The parsing of types roughly parallels the parsing of expressions, and - // primary types are kind of like primary expressions...they're the - // primitives with which other types are constructed. - function parsePrimaryType() { - var params = null, returnType = null, - marker = markerCreate(), rest = null, tmp, - typeParameters, token, type, isGroupedType = false; - - switch (lookahead.type) { - case Token.Identifier: - switch (lookahead.value) { - case 'any': - lex(); - return markerApply(marker, delegate.createAnyTypeAnnotation()); - case 'bool': // fallthrough - case 'boolean': - lex(); - return markerApply(marker, delegate.createBooleanTypeAnnotation()); - case 'number': - lex(); - return markerApply(marker, delegate.createNumberTypeAnnotation()); - case 'string': - lex(); - return markerApply(marker, delegate.createStringTypeAnnotation()); - } - return markerApply(marker, parseGenericType()); - case Token.Punctuator: - switch (lookahead.value) { - case '{': - return markerApply(marker, parseObjectType()); - case '[': - return parseTupleType(); - case '<': - typeParameters = parseTypeParameterDeclaration(); - expect('('); - tmp = parseFunctionTypeParams(); - params = tmp.params; - rest = tmp.rest; - expect(')'); - - expect('=>'); - - returnType = parseType(); - - return markerApply(marker, delegate.createFunctionTypeAnnotation( - params, - returnType, - rest, - typeParameters - )); - case '(': - lex(); - // Check to see if this is actually a grouped type - if (!match(')') && !match('...')) { - if (lookahead.type === Token.Identifier) { - token = lookahead2(); - isGroupedType = token.value !== '?' && token.value !== ':'; - } else { - isGroupedType = true; - } - } - - if (isGroupedType) { - type = parseType(); - expect(')'); - - // If we see a => next then someone was probably confused about - // function types, so we can provide a better error message - if (match('=>')) { - throwError({}, Messages.ConfusedAboutFunctionType); - } - - return type; - } - - tmp = parseFunctionTypeParams(); - params = tmp.params; - rest = tmp.rest; - - expect(')'); - - expect('=>'); - - returnType = parseType(); - - return markerApply(marker, delegate.createFunctionTypeAnnotation( - params, - returnType, - rest, - null /* typeParameters */ - )); - } - break; - case Token.Keyword: - switch (lookahead.value) { - case 'void': - return markerApply(marker, parseVoidType()); - case 'typeof': - return markerApply(marker, parseTypeofType()); - } - break; - case Token.StringLiteral: - token = lex(); - if (token.octal) { - throwError(token, Messages.StrictOctalLiteral); - } - return markerApply(marker, delegate.createStringLiteralTypeAnnotation( - token - )); - } - - throwUnexpected(lookahead); - } - - function parsePostfixType() { - var marker = markerCreate(), t = parsePrimaryType(); - if (match('[')) { - expect('['); - expect(']'); - return markerApply(marker, delegate.createArrayTypeAnnotation(t)); - } - return t; - } - - function parsePrefixType() { - var marker = markerCreate(); - if (match('?')) { - lex(); - return markerApply(marker, delegate.createNullableTypeAnnotation( - parsePrefixType() - )); - } - return parsePostfixType(); - } - - - function parseIntersectionType() { - var marker = markerCreate(), type, types; - type = parsePrefixType(); - types = [type]; - while (match('&')) { - lex(); - types.push(parsePrefixType()); - } - - return types.length === 1 ? - type : - markerApply(marker, delegate.createIntersectionTypeAnnotation( - types - )); - } - - function parseUnionType() { - var marker = markerCreate(), type, types; - type = parseIntersectionType(); - types = [type]; - while (match('|')) { - lex(); - types.push(parseIntersectionType()); - } - return types.length === 1 ? - type : - markerApply(marker, delegate.createUnionTypeAnnotation( - types - )); - } - - function parseType() { - var oldInType = state.inType, type; - state.inType = true; - - type = parseUnionType(); - - state.inType = oldInType; - return type; - } - - function parseTypeAnnotation() { - var marker = markerCreate(), type; - - expect(':'); - type = parseType(); - - return markerApply(marker, delegate.createTypeAnnotation(type)); - } - - function parseVariableIdentifier() { - var marker = markerCreate(), - token = lex(); - - if (token.type !== Token.Identifier) { - throwUnexpected(token); - } - - return markerApply(marker, delegate.createIdentifier(token.value)); - } - - function parseTypeAnnotatableIdentifier(requireTypeAnnotation, canBeOptionalParam) { - var marker = markerCreate(), - ident = parseVariableIdentifier(), - isOptionalParam = false; - - if (canBeOptionalParam && match('?')) { - expect('?'); - isOptionalParam = true; - } - - if (requireTypeAnnotation || match(':')) { - ident.typeAnnotation = parseTypeAnnotation(); - ident = markerApply(marker, ident); - } - - if (isOptionalParam) { - ident.optional = true; - ident = markerApply(marker, ident); - } - - return ident; - } - - function parseVariableDeclaration(kind) { - var id, - marker = markerCreate(), - init = null, - typeAnnotationMarker = markerCreate(); - if (match('{')) { - id = parseObjectInitialiser(); - reinterpretAsAssignmentBindingPattern(id); - if (match(':')) { - id.typeAnnotation = parseTypeAnnotation(); - markerApply(typeAnnotationMarker, id); - } - } else if (match('[')) { - id = parseArrayInitialiser(); - reinterpretAsAssignmentBindingPattern(id); - if (match(':')) { - id.typeAnnotation = parseTypeAnnotation(); - markerApply(typeAnnotationMarker, id); - } - } else { - /* istanbul ignore next */ - id = state.allowKeyword ? parseNonComputedProperty() : parseTypeAnnotatableIdentifier(); - // 12.2.1 - if (strict && isRestrictedWord(id.name)) { - throwErrorTolerant({}, Messages.StrictVarName); - } - } - - if (kind === 'const') { - if (!match('=')) { - throwError({}, Messages.NoUninitializedConst); - } - expect('='); - init = parseAssignmentExpression(); - } else if (match('=')) { - lex(); - init = parseAssignmentExpression(); - } - - return markerApply(marker, delegate.createVariableDeclarator(id, init)); - } - - function parseVariableDeclarationList(kind) { - var list = []; - - do { - list.push(parseVariableDeclaration(kind)); - if (!match(',')) { - break; - } - lex(); - } while (index < length); - - return list; - } - - function parseVariableStatement() { - var declarations, marker = markerCreate(); - - expectKeyword('var'); - - declarations = parseVariableDeclarationList(); - - consumeSemicolon(); - - return markerApply(marker, delegate.createVariableDeclaration(declarations, 'var')); - } - - // kind may be `const` or `let` - // Both are experimental and not in the specification yet. - // see http://wiki.ecmascript.org/doku.php?id=harmony:const - // and http://wiki.ecmascript.org/doku.php?id=harmony:let - function parseConstLetDeclaration(kind) { - var declarations, marker = markerCreate(); - - expectKeyword(kind); - - declarations = parseVariableDeclarationList(kind); - - consumeSemicolon(); - - return markerApply(marker, delegate.createVariableDeclaration(declarations, kind)); - } - - // people.mozilla.org/~jorendorff/es6-draft.html - - function parseModuleSpecifier() { - var marker = markerCreate(), - specifier; - - if (lookahead.type !== Token.StringLiteral) { - throwError({}, Messages.InvalidModuleSpecifier); - } - specifier = delegate.createModuleSpecifier(lookahead); - lex(); - return markerApply(marker, specifier); - } - - function parseExportBatchSpecifier() { - var marker = markerCreate(); - expect('*'); - return markerApply(marker, delegate.createExportBatchSpecifier()); - } - - function parseExportSpecifier() { - var id, name = null, marker = markerCreate(), from; - if (matchKeyword('default')) { - lex(); - id = markerApply(marker, delegate.createIdentifier('default')); - // export {default} from "something"; - } else { - id = parseVariableIdentifier(); - } - if (matchContextualKeyword('as')) { - lex(); - name = parseNonComputedProperty(); - } - - return markerApply(marker, delegate.createExportSpecifier(id, name)); - } - - function parseExportDeclaration() { - var declaration = null, - possibleIdentifierToken, sourceElement, - isExportFromIdentifier, - src = null, specifiers = [], - marker = markerCreate(); - - expectKeyword('export'); - - if (matchKeyword('default')) { - // covers: - // export default ... - lex(); - if (matchKeyword('function') || matchKeyword('class')) { - possibleIdentifierToken = lookahead2(); - if (isIdentifierName(possibleIdentifierToken)) { - // covers: - // export default function foo () {} - // export default class foo {} - sourceElement = parseSourceElement(); - return markerApply(marker, delegate.createExportDeclaration(true, sourceElement, [sourceElement.id], null)); - } - // covers: - // export default function () {} - // export default class {} - switch (lookahead.value) { - case 'class': - return markerApply(marker, delegate.createExportDeclaration(true, parseClassExpression(), [], null)); - case 'function': - return markerApply(marker, delegate.createExportDeclaration(true, parseFunctionExpression(), [], null)); - } - } - - if (matchContextualKeyword('from')) { - throwError({}, Messages.UnexpectedToken, lookahead.value); - } - - // covers: - // export default {}; - // export default []; - if (match('{')) { - declaration = parseObjectInitialiser(); - } else if (match('[')) { - declaration = parseArrayInitialiser(); - } else { - declaration = parseAssignmentExpression(); - } - consumeSemicolon(); - return markerApply(marker, delegate.createExportDeclaration(true, declaration, [], null)); - } - - // non-default export - if (lookahead.type === Token.Keyword || matchContextualKeyword('type')) { - // covers: - // export var f = 1; - switch (lookahead.value) { - case 'type': - case 'let': - case 'const': - case 'var': - case 'class': - case 'function': - return markerApply(marker, delegate.createExportDeclaration(false, parseSourceElement(), specifiers, null)); - } - } - - if (match('*')) { - // covers: - // export * from "foo"; - specifiers.push(parseExportBatchSpecifier()); - - if (!matchContextualKeyword('from')) { - throwError({}, lookahead.value ? - Messages.UnexpectedToken : Messages.MissingFromClause, lookahead.value); - } - lex(); - src = parseModuleSpecifier(); - consumeSemicolon(); - - return markerApply(marker, delegate.createExportDeclaration(false, null, specifiers, src)); - } - - expect('{'); - if (!match('}')) { - do { - isExportFromIdentifier = isExportFromIdentifier || matchKeyword('default'); - specifiers.push(parseExportSpecifier()); - } while (match(',') && lex()); - } - expect('}'); - - if (matchContextualKeyword('from')) { - // covering: - // export {default} from "foo"; - // export {foo} from "foo"; - lex(); - src = parseModuleSpecifier(); - consumeSemicolon(); - } else if (isExportFromIdentifier) { - // covering: - // export {default}; // missing fromClause - throwError({}, lookahead.value ? - Messages.UnexpectedToken : Messages.MissingFromClause, lookahead.value); - } else { - // cover - // export {foo}; - consumeSemicolon(); - } - return markerApply(marker, delegate.createExportDeclaration(false, declaration, specifiers, src)); - } - - - function parseImportSpecifier() { - // import {} ...; - var id, name = null, marker = markerCreate(); - - id = parseNonComputedProperty(); - if (matchContextualKeyword('as')) { - lex(); - name = parseVariableIdentifier(); - } - - return markerApply(marker, delegate.createImportSpecifier(id, name)); - } - - function parseNamedImports() { - var specifiers = []; - // {foo, bar as bas} - expect('{'); - if (!match('}')) { - do { - specifiers.push(parseImportSpecifier()); - } while (match(',') && lex()); - } - expect('}'); - return specifiers; - } - - function parseImportDefaultSpecifier() { - // import ...; - var id, marker = markerCreate(); - - id = parseNonComputedProperty(); - - return markerApply(marker, delegate.createImportDefaultSpecifier(id)); - } - - function parseImportNamespaceSpecifier() { - // import <* as foo> ...; - var id, marker = markerCreate(); - - expect('*'); - if (!matchContextualKeyword('as')) { - throwError({}, Messages.NoAsAfterImportNamespace); - } - lex(); - id = parseNonComputedProperty(); - - return markerApply(marker, delegate.createImportNamespaceSpecifier(id)); - } - - function parseImportDeclaration() { - var specifiers, src, marker = markerCreate(), isType = false, token2; - - expectKeyword('import'); - - if (matchContextualKeyword('type')) { - token2 = lookahead2(); - if ((token2.type === Token.Identifier && token2.value !== 'from') || - (token2.type === Token.Punctuator && - (token2.value === '{' || token2.value === '*'))) { - isType = true; - lex(); - } - } - - specifiers = []; - - if (lookahead.type === Token.StringLiteral) { - // covers: - // import "foo"; - src = parseModuleSpecifier(); - consumeSemicolon(); - return markerApply(marker, delegate.createImportDeclaration(specifiers, src, isType)); - } - - if (!matchKeyword('default') && isIdentifierName(lookahead)) { - // covers: - // import foo - // import foo, ... - specifiers.push(parseImportDefaultSpecifier()); - if (match(',')) { - lex(); - } - } - if (match('*')) { - // covers: - // import foo, * as foo - // import * as foo - specifiers.push(parseImportNamespaceSpecifier()); - } else if (match('{')) { - // covers: - // import foo, {bar} - // import {bar} - specifiers = specifiers.concat(parseNamedImports()); - } - - if (!matchContextualKeyword('from')) { - throwError({}, lookahead.value ? - Messages.UnexpectedToken : Messages.MissingFromClause, lookahead.value); - } - lex(); - src = parseModuleSpecifier(); - consumeSemicolon(); - - return markerApply(marker, delegate.createImportDeclaration(specifiers, src, isType)); - } - - // 12.3 Empty Statement - - function parseEmptyStatement() { - var marker = markerCreate(); - expect(';'); - return markerApply(marker, delegate.createEmptyStatement()); - } - - // 12.4 Expression Statement - - function parseExpressionStatement() { - var marker = markerCreate(), expr = parseExpression(); - consumeSemicolon(); - return markerApply(marker, delegate.createExpressionStatement(expr)); - } - - // 12.5 If statement - - function parseIfStatement() { - var test, consequent, alternate, marker = markerCreate(); - - expectKeyword('if'); - - expect('('); - - test = parseExpression(); - - expect(')'); - - consequent = parseStatement(); - - if (matchKeyword('else')) { - lex(); - alternate = parseStatement(); - } else { - alternate = null; - } - - return markerApply(marker, delegate.createIfStatement(test, consequent, alternate)); - } - - // 12.6 Iteration Statements - - function parseDoWhileStatement() { - var body, test, oldInIteration, marker = markerCreate(); - - expectKeyword('do'); - - oldInIteration = state.inIteration; - state.inIteration = true; - - body = parseStatement(); - - state.inIteration = oldInIteration; - - expectKeyword('while'); - - expect('('); - - test = parseExpression(); - - expect(')'); - - if (match(';')) { - lex(); - } - - return markerApply(marker, delegate.createDoWhileStatement(body, test)); - } - - function parseWhileStatement() { - var test, body, oldInIteration, marker = markerCreate(); - - expectKeyword('while'); - - expect('('); - - test = parseExpression(); - - expect(')'); - - oldInIteration = state.inIteration; - state.inIteration = true; - - body = parseStatement(); - - state.inIteration = oldInIteration; - - return markerApply(marker, delegate.createWhileStatement(test, body)); - } - - function parseForVariableDeclaration() { - var marker = markerCreate(), - token = lex(), - declarations = parseVariableDeclarationList(); - - return markerApply(marker, delegate.createVariableDeclaration(declarations, token.value)); - } - - function parseForStatement(opts) { - var init, test, update, left, right, body, operator, oldInIteration, - marker = markerCreate(); - init = test = update = null; - expectKeyword('for'); - - // http://wiki.ecmascript.org/doku.php?id=proposals:iterators_and_generators&s=each - if (matchContextualKeyword('each')) { - throwError({}, Messages.EachNotAllowed); - } - - expect('('); - - if (match(';')) { - lex(); - } else { - if (matchKeyword('var') || matchKeyword('let') || matchKeyword('const')) { - state.allowIn = false; - init = parseForVariableDeclaration(); - state.allowIn = true; - - if (init.declarations.length === 1) { - if (matchKeyword('in') || matchContextualKeyword('of')) { - operator = lookahead; - if (!((operator.value === 'in' || init.kind !== 'var') && init.declarations[0].init)) { - lex(); - left = init; - right = parseExpression(); - init = null; - } - } - } - } else { - state.allowIn = false; - init = parseExpression(); - state.allowIn = true; - - if (matchContextualKeyword('of')) { - operator = lex(); - left = init; - right = parseExpression(); - init = null; - } else if (matchKeyword('in')) { - // LeftHandSideExpression - if (!isAssignableLeftHandSide(init)) { - throwError({}, Messages.InvalidLHSInForIn); - } - operator = lex(); - left = init; - right = parseExpression(); - init = null; - } - } - - if (typeof left === 'undefined') { - expect(';'); - } - } - - if (typeof left === 'undefined') { - - if (!match(';')) { - test = parseExpression(); - } - expect(';'); - - if (!match(')')) { - update = parseExpression(); - } - } - - expect(')'); - - oldInIteration = state.inIteration; - state.inIteration = true; - - if (!(opts !== undefined && opts.ignoreBody)) { - body = parseStatement(); - } - - state.inIteration = oldInIteration; - - if (typeof left === 'undefined') { - return markerApply(marker, delegate.createForStatement(init, test, update, body)); - } - - if (operator.value === 'in') { - return markerApply(marker, delegate.createForInStatement(left, right, body)); - } - return markerApply(marker, delegate.createForOfStatement(left, right, body)); - } - - // 12.7 The continue statement - - function parseContinueStatement() { - var label = null, marker = markerCreate(); - - expectKeyword('continue'); - - // Optimize the most common form: 'continue;'. - if (source.charCodeAt(index) === 59) { - lex(); - - if (!state.inIteration) { - throwError({}, Messages.IllegalContinue); - } - - return markerApply(marker, delegate.createContinueStatement(null)); - } - - if (peekLineTerminator()) { - if (!state.inIteration) { - throwError({}, Messages.IllegalContinue); - } - - return markerApply(marker, delegate.createContinueStatement(null)); - } - - if (lookahead.type === Token.Identifier) { - label = parseVariableIdentifier(); - - if (!state.labelSet.has(label.name)) { - throwError({}, Messages.UnknownLabel, label.name); - } - } - - consumeSemicolon(); - - if (label === null && !state.inIteration) { - throwError({}, Messages.IllegalContinue); - } - - return markerApply(marker, delegate.createContinueStatement(label)); - } - - // 12.8 The break statement - - function parseBreakStatement() { - var label = null, marker = markerCreate(); - - expectKeyword('break'); - - // Catch the very common case first: immediately a semicolon (char #59). - if (source.charCodeAt(index) === 59) { - lex(); - - if (!(state.inIteration || state.inSwitch)) { - throwError({}, Messages.IllegalBreak); - } - - return markerApply(marker, delegate.createBreakStatement(null)); - } - - if (peekLineTerminator()) { - if (!(state.inIteration || state.inSwitch)) { - throwError({}, Messages.IllegalBreak); - } - - return markerApply(marker, delegate.createBreakStatement(null)); - } - - if (lookahead.type === Token.Identifier) { - label = parseVariableIdentifier(); - - if (!state.labelSet.has(label.name)) { - throwError({}, Messages.UnknownLabel, label.name); - } - } - - consumeSemicolon(); - - if (label === null && !(state.inIteration || state.inSwitch)) { - throwError({}, Messages.IllegalBreak); - } - - return markerApply(marker, delegate.createBreakStatement(label)); - } - - // 12.9 The return statement - - function parseReturnStatement() { - var argument = null, marker = markerCreate(); - - expectKeyword('return'); - - if (!state.inFunctionBody) { - throwErrorTolerant({}, Messages.IllegalReturn); - } - - // 'return' followed by a space and an identifier is very common. - if (source.charCodeAt(index) === 32) { - if (isIdentifierStart(source.charCodeAt(index + 1))) { - argument = parseExpression(); - consumeSemicolon(); - return markerApply(marker, delegate.createReturnStatement(argument)); - } - } - - if (peekLineTerminator()) { - return markerApply(marker, delegate.createReturnStatement(null)); - } - - if (!match(';')) { - if (!match('}') && lookahead.type !== Token.EOF) { - argument = parseExpression(); - } - } - - consumeSemicolon(); - - return markerApply(marker, delegate.createReturnStatement(argument)); - } - - // 12.10 The with statement - - function parseWithStatement() { - var object, body, marker = markerCreate(); - - if (strict) { - throwErrorTolerant({}, Messages.StrictModeWith); - } - - expectKeyword('with'); - - expect('('); - - object = parseExpression(); - - expect(')'); - - body = parseStatement(); - - return markerApply(marker, delegate.createWithStatement(object, body)); - } - - // 12.10 The swith statement - - function parseSwitchCase() { - var test, - consequent = [], - sourceElement, - marker = markerCreate(); - - if (matchKeyword('default')) { - lex(); - test = null; - } else { - expectKeyword('case'); - test = parseExpression(); - } - expect(':'); - - while (index < length) { - if (match('}') || matchKeyword('default') || matchKeyword('case')) { - break; - } - sourceElement = parseSourceElement(); - if (typeof sourceElement === 'undefined') { - break; - } - consequent.push(sourceElement); - } - - return markerApply(marker, delegate.createSwitchCase(test, consequent)); - } - - function parseSwitchStatement() { - var discriminant, cases, clause, oldInSwitch, defaultFound, marker = markerCreate(); - - expectKeyword('switch'); - - expect('('); - - discriminant = parseExpression(); - - expect(')'); - - expect('{'); - - cases = []; - - if (match('}')) { - lex(); - return markerApply(marker, delegate.createSwitchStatement(discriminant, cases)); - } - - oldInSwitch = state.inSwitch; - state.inSwitch = true; - defaultFound = false; - - while (index < length) { - if (match('}')) { - break; - } - clause = parseSwitchCase(); - if (clause.test === null) { - if (defaultFound) { - throwError({}, Messages.MultipleDefaultsInSwitch); - } - defaultFound = true; - } - cases.push(clause); - } - - state.inSwitch = oldInSwitch; - - expect('}'); - - return markerApply(marker, delegate.createSwitchStatement(discriminant, cases)); - } - - // 12.13 The throw statement - - function parseThrowStatement() { - var argument, marker = markerCreate(); - - expectKeyword('throw'); - - if (peekLineTerminator()) { - throwError({}, Messages.NewlineAfterThrow); - } - - argument = parseExpression(); - - consumeSemicolon(); - - return markerApply(marker, delegate.createThrowStatement(argument)); - } - - // 12.14 The try statement - - function parseCatchClause() { - var param, body, marker = markerCreate(); - - expectKeyword('catch'); - - expect('('); - if (match(')')) { - throwUnexpected(lookahead); - } - - param = parseExpression(); - // 12.14.1 - if (strict && param.type === Syntax.Identifier && isRestrictedWord(param.name)) { - throwErrorTolerant({}, Messages.StrictCatchVariable); - } - - expect(')'); - body = parseBlock(); - return markerApply(marker, delegate.createCatchClause(param, body)); - } - - function parseTryStatement() { - var block, handlers = [], finalizer = null, marker = markerCreate(); - - expectKeyword('try'); - - block = parseBlock(); - - if (matchKeyword('catch')) { - handlers.push(parseCatchClause()); - } - - if (matchKeyword('finally')) { - lex(); - finalizer = parseBlock(); - } - - if (handlers.length === 0 && !finalizer) { - throwError({}, Messages.NoCatchOrFinally); - } - - return markerApply(marker, delegate.createTryStatement(block, [], handlers, finalizer)); - } - - // 12.15 The debugger statement - - function parseDebuggerStatement() { - var marker = markerCreate(); - expectKeyword('debugger'); - - consumeSemicolon(); - - return markerApply(marker, delegate.createDebuggerStatement()); - } - - // 12 Statements - - function parseStatement() { - var type = lookahead.type, - marker, - expr, - labeledBody; - - if (type === Token.EOF) { - throwUnexpected(lookahead); - } - - if (type === Token.Punctuator) { - switch (lookahead.value) { - case ';': - return parseEmptyStatement(); - case '{': - return parseBlock(); - case '(': - return parseExpressionStatement(); - default: - break; - } - } - - if (type === Token.Keyword) { - switch (lookahead.value) { - case 'break': - return parseBreakStatement(); - case 'continue': - return parseContinueStatement(); - case 'debugger': - return parseDebuggerStatement(); - case 'do': - return parseDoWhileStatement(); - case 'for': - return parseForStatement(); - case 'function': - return parseFunctionDeclaration(); - case 'class': - return parseClassDeclaration(); - case 'if': - return parseIfStatement(); - case 'return': - return parseReturnStatement(); - case 'switch': - return parseSwitchStatement(); - case 'throw': - return parseThrowStatement(); - case 'try': - return parseTryStatement(); - case 'var': - return parseVariableStatement(); - case 'while': - return parseWhileStatement(); - case 'with': - return parseWithStatement(); - default: - break; - } - } - - if (matchAsyncFuncExprOrDecl()) { - return parseFunctionDeclaration(); - } - - marker = markerCreate(); - expr = parseExpression(); - - // 12.12 Labelled Statements - if ((expr.type === Syntax.Identifier) && match(':')) { - lex(); - - if (state.labelSet.has(expr.name)) { - throwError({}, Messages.Redeclaration, 'Label', expr.name); - } - - state.labelSet.set(expr.name, true); - labeledBody = parseStatement(); - state.labelSet["delete"](expr.name); - return markerApply(marker, delegate.createLabeledStatement(expr, labeledBody)); - } - - consumeSemicolon(); - - return markerApply(marker, delegate.createExpressionStatement(expr)); - } - - // 13 Function Definition - - function parseConciseBody() { - if (match('{')) { - return parseFunctionSourceElements(); - } - return parseAssignmentExpression(); - } - - function parseFunctionSourceElements() { - var sourceElement, sourceElements = [], token, directive, firstRestricted, - oldLabelSet, oldInIteration, oldInSwitch, oldInFunctionBody, oldParenthesizedCount, - marker = markerCreate(); - - expect('{'); - - while (index < length) { - if (lookahead.type !== Token.StringLiteral) { - break; - } - token = lookahead; - - sourceElement = parseSourceElement(); - sourceElements.push(sourceElement); - if (sourceElement.expression.type !== Syntax.Literal) { - // this is not directive - break; - } - directive = source.slice(token.range[0] + 1, token.range[1] - 1); - if (directive === 'use strict') { - strict = true; - if (firstRestricted) { - throwErrorTolerant(firstRestricted, Messages.StrictOctalLiteral); - } - } else { - if (!firstRestricted && token.octal) { - firstRestricted = token; - } - } - } - - oldLabelSet = state.labelSet; - oldInIteration = state.inIteration; - oldInSwitch = state.inSwitch; - oldInFunctionBody = state.inFunctionBody; - oldParenthesizedCount = state.parenthesizedCount; - - state.labelSet = new StringMap(); - state.inIteration = false; - state.inSwitch = false; - state.inFunctionBody = true; - state.parenthesizedCount = 0; - - while (index < length) { - if (match('}')) { - break; - } - sourceElement = parseSourceElement(); - if (typeof sourceElement === 'undefined') { - break; - } - sourceElements.push(sourceElement); - } - - expect('}'); - - state.labelSet = oldLabelSet; - state.inIteration = oldInIteration; - state.inSwitch = oldInSwitch; - state.inFunctionBody = oldInFunctionBody; - state.parenthesizedCount = oldParenthesizedCount; - - return markerApply(marker, delegate.createBlockStatement(sourceElements)); - } - - function validateParam(options, param, name) { - if (strict) { - if (isRestrictedWord(name)) { - options.stricted = param; - options.message = Messages.StrictParamName; - } - if (options.paramSet.has(name)) { - options.stricted = param; - options.message = Messages.StrictParamDupe; - } - } else if (!options.firstRestricted) { - if (isRestrictedWord(name)) { - options.firstRestricted = param; - options.message = Messages.StrictParamName; - } else if (isStrictModeReservedWord(name)) { - options.firstRestricted = param; - options.message = Messages.StrictReservedWord; - } else if (options.paramSet.has(name)) { - options.firstRestricted = param; - options.message = Messages.StrictParamDupe; - } - } - options.paramSet.set(name, true); - } - - function parseParam(options) { - var marker, token, rest, param, def; - - token = lookahead; - if (token.value === '...') { - token = lex(); - rest = true; - } - - if (match('[')) { - marker = markerCreate(); - param = parseArrayInitialiser(); - reinterpretAsDestructuredParameter(options, param); - if (match(':')) { - param.typeAnnotation = parseTypeAnnotation(); - markerApply(marker, param); - } - } else if (match('{')) { - marker = markerCreate(); - if (rest) { - throwError({}, Messages.ObjectPatternAsRestParameter); - } - param = parseObjectInitialiser(); - reinterpretAsDestructuredParameter(options, param); - if (match(':')) { - param.typeAnnotation = parseTypeAnnotation(); - markerApply(marker, param); - } - } else { - param = - rest - ? parseTypeAnnotatableIdentifier( - false, /* requireTypeAnnotation */ - false /* canBeOptionalParam */ - ) - : parseTypeAnnotatableIdentifier( - false, /* requireTypeAnnotation */ - true /* canBeOptionalParam */ - ); - - validateParam(options, token, token.value); - } - - if (match('=')) { - if (rest) { - throwErrorTolerant(lookahead, Messages.DefaultRestParameter); - } - lex(); - def = parseAssignmentExpression(); - ++options.defaultCount; - } - - if (rest) { - if (!match(')')) { - throwError({}, Messages.ParameterAfterRestParameter); - } - options.rest = param; - return false; - } - - options.params.push(param); - options.defaults.push(def); - return !match(')'); - } - - function parseParams(firstRestricted) { - var options, marker = markerCreate(); - - options = { - params: [], - defaultCount: 0, - defaults: [], - rest: null, - firstRestricted: firstRestricted - }; - - expect('('); - - if (!match(')')) { - options.paramSet = new StringMap(); - while (index < length) { - if (!parseParam(options)) { - break; - } - expect(','); - } - } - - expect(')'); - - if (options.defaultCount === 0) { - options.defaults = []; - } - - if (match(':')) { - options.returnType = parseTypeAnnotation(); - } - - return markerApply(marker, options); - } - - function parseFunctionDeclaration() { - var id, body, token, tmp, firstRestricted, message, generator, isAsync, - previousStrict, previousYieldAllowed, previousAwaitAllowed, - marker = markerCreate(), typeParameters; - - isAsync = false; - if (matchAsync()) { - lex(); - isAsync = true; - } - - expectKeyword('function'); - - generator = false; - if (match('*')) { - lex(); - generator = true; - } - - token = lookahead; - - id = parseVariableIdentifier(); - - if (match('<')) { - typeParameters = parseTypeParameterDeclaration(); - } - - if (strict) { - if (isRestrictedWord(token.value)) { - throwErrorTolerant(token, Messages.StrictFunctionName); - } - } else { - if (isRestrictedWord(token.value)) { - firstRestricted = token; - message = Messages.StrictFunctionName; - } else if (isStrictModeReservedWord(token.value)) { - firstRestricted = token; - message = Messages.StrictReservedWord; - } - } - - tmp = parseParams(firstRestricted); - firstRestricted = tmp.firstRestricted; - if (tmp.message) { - message = tmp.message; - } - - previousStrict = strict; - previousYieldAllowed = state.yieldAllowed; - state.yieldAllowed = generator; - previousAwaitAllowed = state.awaitAllowed; - state.awaitAllowed = isAsync; - - body = parseFunctionSourceElements(); - - if (strict && firstRestricted) { - throwError(firstRestricted, message); - } - if (strict && tmp.stricted) { - throwErrorTolerant(tmp.stricted, message); - } - strict = previousStrict; - state.yieldAllowed = previousYieldAllowed; - state.awaitAllowed = previousAwaitAllowed; - - return markerApply( - marker, - delegate.createFunctionDeclaration( - id, - tmp.params, - tmp.defaults, - body, - tmp.rest, - generator, - false, - isAsync, - tmp.returnType, - typeParameters - ) - ); - } - - function parseFunctionExpression() { - var token, id = null, firstRestricted, message, tmp, body, generator, isAsync, - previousStrict, previousYieldAllowed, previousAwaitAllowed, - marker = markerCreate(), typeParameters; - - isAsync = false; - if (matchAsync()) { - lex(); - isAsync = true; - } - - expectKeyword('function'); - - generator = false; - - if (match('*')) { - lex(); - generator = true; - } - - if (!match('(')) { - if (!match('<')) { - token = lookahead; - id = parseVariableIdentifier(); - - if (strict) { - if (isRestrictedWord(token.value)) { - throwErrorTolerant(token, Messages.StrictFunctionName); - } - } else { - if (isRestrictedWord(token.value)) { - firstRestricted = token; - message = Messages.StrictFunctionName; - } else if (isStrictModeReservedWord(token.value)) { - firstRestricted = token; - message = Messages.StrictReservedWord; - } - } - } - - if (match('<')) { - typeParameters = parseTypeParameterDeclaration(); - } - } - - tmp = parseParams(firstRestricted); - firstRestricted = tmp.firstRestricted; - if (tmp.message) { - message = tmp.message; - } - - previousStrict = strict; - previousYieldAllowed = state.yieldAllowed; - state.yieldAllowed = generator; - previousAwaitAllowed = state.awaitAllowed; - state.awaitAllowed = isAsync; - - body = parseFunctionSourceElements(); - - if (strict && firstRestricted) { - throwError(firstRestricted, message); - } - if (strict && tmp.stricted) { - throwErrorTolerant(tmp.stricted, message); - } - strict = previousStrict; - state.yieldAllowed = previousYieldAllowed; - state.awaitAllowed = previousAwaitAllowed; - - return markerApply( - marker, - delegate.createFunctionExpression( - id, - tmp.params, - tmp.defaults, - body, - tmp.rest, - generator, - false, - isAsync, - tmp.returnType, - typeParameters - ) - ); - } - - function parseYieldExpression() { - var delegateFlag, expr, marker = markerCreate(); - - expectKeyword('yield', !strict); - - delegateFlag = false; - if (match('*')) { - lex(); - delegateFlag = true; - } - - expr = parseAssignmentExpression(); - - return markerApply(marker, delegate.createYieldExpression(expr, delegateFlag)); - } - - function parseAwaitExpression() { - var expr, marker = markerCreate(); - expectContextualKeyword('await'); - expr = parseAssignmentExpression(); - return markerApply(marker, delegate.createAwaitExpression(expr)); - } - - // 14 Functions and classes - - // 14.1 Functions is defined above (13 in ES5) - // 14.2 Arrow Functions Definitions is defined in (7.3 assignments) - - // 14.3 Method Definitions - // 14.3.7 - function specialMethod(methodDefinition) { - return methodDefinition.kind === 'get' || - methodDefinition.kind === 'set' || - methodDefinition.value.generator; - } - - function parseMethodDefinition(key, isStatic, generator, computed) { - var token, param, propType, - isAsync, typeParameters, tokenValue, returnType; - - propType = isStatic ? ClassPropertyType["static"] : ClassPropertyType.prototype; - - if (generator) { - return delegate.createMethodDefinition( - propType, - '', - key, - parsePropertyMethodFunction({ generator: true }), - computed - ); - } - - tokenValue = key.type === 'Identifier' && key.name; - - if (tokenValue === 'get' && !match('(')) { - key = parseObjectPropertyKey(); - - expect('('); - expect(')'); - if (match(':')) { - returnType = parseTypeAnnotation(); - } - return delegate.createMethodDefinition( - propType, - 'get', - key, - parsePropertyFunction({ generator: false, returnType: returnType }), - computed - ); - } - if (tokenValue === 'set' && !match('(')) { - key = parseObjectPropertyKey(); - - expect('('); - token = lookahead; - param = [ parseTypeAnnotatableIdentifier() ]; - expect(')'); - if (match(':')) { - returnType = parseTypeAnnotation(); - } - return delegate.createMethodDefinition( - propType, - 'set', - key, - parsePropertyFunction({ - params: param, - generator: false, - name: token, - returnType: returnType - }), - computed - ); - } - - if (match('<')) { - typeParameters = parseTypeParameterDeclaration(); - } - - isAsync = tokenValue === 'async' && !match('('); - if (isAsync) { - key = parseObjectPropertyKey(); - } - - return delegate.createMethodDefinition( - propType, - '', - key, - parsePropertyMethodFunction({ - generator: false, - async: isAsync, - typeParameters: typeParameters - }), - computed - ); - } - - function parseClassProperty(key, computed, isStatic) { - var typeAnnotation; - - typeAnnotation = parseTypeAnnotation(); - expect(';'); - - return delegate.createClassProperty( - key, - typeAnnotation, - computed, - isStatic - ); - } - - function parseClassElement() { - var computed = false, generator = false, key, marker = markerCreate(), - isStatic = false, possiblyOpenBracketToken; - if (match(';')) { - lex(); - return undefined; - } - - if (lookahead.value === 'static') { - lex(); - isStatic = true; - } - - if (match('*')) { - lex(); - generator = true; - } - - possiblyOpenBracketToken = lookahead; - if (matchContextualKeyword('get') || matchContextualKeyword('set')) { - possiblyOpenBracketToken = lookahead2(); - } - - if (possiblyOpenBracketToken.type === Token.Punctuator - && possiblyOpenBracketToken.value === '[') { - computed = true; - } - - key = parseObjectPropertyKey(); - - if (!generator && lookahead.value === ':') { - return markerApply(marker, parseClassProperty(key, computed, isStatic)); - } - - return markerApply(marker, parseMethodDefinition( - key, - isStatic, - generator, - computed - )); - } - - function parseClassBody() { - var classElement, classElements = [], existingProps = {}, - marker = markerCreate(), propName, propType; - - existingProps[ClassPropertyType["static"]] = new StringMap(); - existingProps[ClassPropertyType.prototype] = new StringMap(); - - expect('{'); - - while (index < length) { - if (match('}')) { - break; - } - classElement = parseClassElement(existingProps); - - if (typeof classElement !== 'undefined') { - classElements.push(classElement); - - propName = !classElement.computed && getFieldName(classElement.key); - if (propName !== false) { - propType = classElement["static"] ? - ClassPropertyType["static"] : - ClassPropertyType.prototype; - - if (classElement.type === Syntax.MethodDefinition) { - if (propName === 'constructor' && !classElement["static"]) { - if (specialMethod(classElement)) { - throwError(classElement, Messages.IllegalClassConstructorProperty); - } - if (existingProps[ClassPropertyType.prototype].has('constructor')) { - throwError(classElement.key, Messages.IllegalDuplicateClassProperty); - } - } - existingProps[propType].set(propName, true); - } - } - } - } - - expect('}'); - - return markerApply(marker, delegate.createClassBody(classElements)); - } - - function parseClassImplements() { - var id, implemented = [], marker, typeParameters; - if (strict) { - expectKeyword('implements'); - } else { - expectContextualKeyword('implements'); - } - while (index < length) { - marker = markerCreate(); - id = parseVariableIdentifier(); - if (match('<')) { - typeParameters = parseTypeParameterInstantiation(); - } else { - typeParameters = null; - } - implemented.push(markerApply(marker, delegate.createClassImplements( - id, - typeParameters - ))); - if (!match(',')) { - break; - } - expect(','); - } - return implemented; - } - - function parseClassExpression() { - var id, implemented, previousYieldAllowed, superClass = null, - superTypeParameters, marker = markerCreate(), typeParameters, - matchImplements; - - expectKeyword('class'); - - matchImplements = - strict - ? matchKeyword('implements') - : matchContextualKeyword('implements'); - - if (!matchKeyword('extends') && !matchImplements && !match('{')) { - id = parseVariableIdentifier(); - } - - if (match('<')) { - typeParameters = parseTypeParameterDeclaration(); - } - - if (matchKeyword('extends')) { - expectKeyword('extends'); - previousYieldAllowed = state.yieldAllowed; - state.yieldAllowed = false; - superClass = parseLeftHandSideExpressionAllowCall(); - if (match('<')) { - superTypeParameters = parseTypeParameterInstantiation(); - } - state.yieldAllowed = previousYieldAllowed; - } - - if (strict ? matchKeyword('implements') : matchContextualKeyword('implements')) { - implemented = parseClassImplements(); - } - - return markerApply(marker, delegate.createClassExpression( - id, - superClass, - parseClassBody(), - typeParameters, - superTypeParameters, - implemented - )); - } - - function parseClassDeclaration() { - var id, implemented, previousYieldAllowed, superClass = null, - superTypeParameters, marker = markerCreate(), typeParameters; - - expectKeyword('class'); - - id = parseVariableIdentifier(); - - if (match('<')) { - typeParameters = parseTypeParameterDeclaration(); - } - - if (matchKeyword('extends')) { - expectKeyword('extends'); - previousYieldAllowed = state.yieldAllowed; - state.yieldAllowed = false; - superClass = parseLeftHandSideExpressionAllowCall(); - if (match('<')) { - superTypeParameters = parseTypeParameterInstantiation(); - } - state.yieldAllowed = previousYieldAllowed; - } - - if (strict ? matchKeyword('implements') : matchContextualKeyword('implements')) { - implemented = parseClassImplements(); - } - - return markerApply(marker, delegate.createClassDeclaration( - id, - superClass, - parseClassBody(), - typeParameters, - superTypeParameters, - implemented - )); - } - - // 15 Program - - function parseSourceElement() { - var token; - if (lookahead.type === Token.Keyword) { - switch (lookahead.value) { - case 'const': - case 'let': - return parseConstLetDeclaration(lookahead.value); - case 'function': - return parseFunctionDeclaration(); - case 'export': - throwErrorTolerant({}, Messages.IllegalExportDeclaration); - return parseExportDeclaration(); - case 'import': - throwErrorTolerant({}, Messages.IllegalImportDeclaration); - return parseImportDeclaration(); - case 'interface': - if (lookahead2().type === Token.Identifier) { - return parseInterface(); - } - return parseStatement(); - default: - return parseStatement(); - } - } - - if (matchContextualKeyword('type') - && lookahead2().type === Token.Identifier) { - return parseTypeAlias(); - } - - if (matchContextualKeyword('interface') - && lookahead2().type === Token.Identifier) { - return parseInterface(); - } - - if (matchContextualKeyword('declare')) { - token = lookahead2(); - if (token.type === Token.Keyword) { - switch (token.value) { - case 'class': - return parseDeclareClass(); - case 'function': - return parseDeclareFunction(); - case 'var': - return parseDeclareVariable(); - } - } else if (token.type === Token.Identifier - && token.value === 'module') { - return parseDeclareModule(); - } - } - - if (lookahead.type !== Token.EOF) { - return parseStatement(); - } - } - - function parseProgramElement() { - var isModule = extra.sourceType === 'module' || extra.sourceType === 'nonStrictModule'; - - if (isModule && lookahead.type === Token.Keyword) { - switch (lookahead.value) { - case 'export': - return parseExportDeclaration(); - case 'import': - return parseImportDeclaration(); - } - } - - return parseSourceElement(); - } - - function parseProgramElements() { - var sourceElement, sourceElements = [], token, directive, firstRestricted; - - while (index < length) { - token = lookahead; - if (token.type !== Token.StringLiteral) { - break; - } - - sourceElement = parseProgramElement(); - sourceElements.push(sourceElement); - if (sourceElement.expression.type !== Syntax.Literal) { - // this is not directive - break; - } - directive = source.slice(token.range[0] + 1, token.range[1] - 1); - if (directive === 'use strict') { - strict = true; - if (firstRestricted) { - throwErrorTolerant(firstRestricted, Messages.StrictOctalLiteral); - } - } else { - if (!firstRestricted && token.octal) { - firstRestricted = token; - } - } - } - - while (index < length) { - sourceElement = parseProgramElement(); - if (typeof sourceElement === 'undefined') { - break; - } - sourceElements.push(sourceElement); - } - return sourceElements; - } - - function parseProgram() { - var body, marker = markerCreate(); - strict = extra.sourceType === 'module'; - peek(); - body = parseProgramElements(); - return markerApply(marker, delegate.createProgram(body)); - } - - // 16 JSX - - XHTMLEntities = { - quot: '\u0022', - amp: '&', - apos: '\u0027', - lt: '<', - gt: '>', - nbsp: '\u00A0', - iexcl: '\u00A1', - cent: '\u00A2', - pound: '\u00A3', - curren: '\u00A4', - yen: '\u00A5', - brvbar: '\u00A6', - sect: '\u00A7', - uml: '\u00A8', - copy: '\u00A9', - ordf: '\u00AA', - laquo: '\u00AB', - not: '\u00AC', - shy: '\u00AD', - reg: '\u00AE', - macr: '\u00AF', - deg: '\u00B0', - plusmn: '\u00B1', - sup2: '\u00B2', - sup3: '\u00B3', - acute: '\u00B4', - micro: '\u00B5', - para: '\u00B6', - middot: '\u00B7', - cedil: '\u00B8', - sup1: '\u00B9', - ordm: '\u00BA', - raquo: '\u00BB', - frac14: '\u00BC', - frac12: '\u00BD', - frac34: '\u00BE', - iquest: '\u00BF', - Agrave: '\u00C0', - Aacute: '\u00C1', - Acirc: '\u00C2', - Atilde: '\u00C3', - Auml: '\u00C4', - Aring: '\u00C5', - AElig: '\u00C6', - Ccedil: '\u00C7', - Egrave: '\u00C8', - Eacute: '\u00C9', - Ecirc: '\u00CA', - Euml: '\u00CB', - Igrave: '\u00CC', - Iacute: '\u00CD', - Icirc: '\u00CE', - Iuml: '\u00CF', - ETH: '\u00D0', - Ntilde: '\u00D1', - Ograve: '\u00D2', - Oacute: '\u00D3', - Ocirc: '\u00D4', - Otilde: '\u00D5', - Ouml: '\u00D6', - times: '\u00D7', - Oslash: '\u00D8', - Ugrave: '\u00D9', - Uacute: '\u00DA', - Ucirc: '\u00DB', - Uuml: '\u00DC', - Yacute: '\u00DD', - THORN: '\u00DE', - szlig: '\u00DF', - agrave: '\u00E0', - aacute: '\u00E1', - acirc: '\u00E2', - atilde: '\u00E3', - auml: '\u00E4', - aring: '\u00E5', - aelig: '\u00E6', - ccedil: '\u00E7', - egrave: '\u00E8', - eacute: '\u00E9', - ecirc: '\u00EA', - euml: '\u00EB', - igrave: '\u00EC', - iacute: '\u00ED', - icirc: '\u00EE', - iuml: '\u00EF', - eth: '\u00F0', - ntilde: '\u00F1', - ograve: '\u00F2', - oacute: '\u00F3', - ocirc: '\u00F4', - otilde: '\u00F5', - ouml: '\u00F6', - divide: '\u00F7', - oslash: '\u00F8', - ugrave: '\u00F9', - uacute: '\u00FA', - ucirc: '\u00FB', - uuml: '\u00FC', - yacute: '\u00FD', - thorn: '\u00FE', - yuml: '\u00FF', - OElig: '\u0152', - oelig: '\u0153', - Scaron: '\u0160', - scaron: '\u0161', - Yuml: '\u0178', - fnof: '\u0192', - circ: '\u02C6', - tilde: '\u02DC', - Alpha: '\u0391', - Beta: '\u0392', - Gamma: '\u0393', - Delta: '\u0394', - Epsilon: '\u0395', - Zeta: '\u0396', - Eta: '\u0397', - Theta: '\u0398', - Iota: '\u0399', - Kappa: '\u039A', - Lambda: '\u039B', - Mu: '\u039C', - Nu: '\u039D', - Xi: '\u039E', - Omicron: '\u039F', - Pi: '\u03A0', - Rho: '\u03A1', - Sigma: '\u03A3', - Tau: '\u03A4', - Upsilon: '\u03A5', - Phi: '\u03A6', - Chi: '\u03A7', - Psi: '\u03A8', - Omega: '\u03A9', - alpha: '\u03B1', - beta: '\u03B2', - gamma: '\u03B3', - delta: '\u03B4', - epsilon: '\u03B5', - zeta: '\u03B6', - eta: '\u03B7', - theta: '\u03B8', - iota: '\u03B9', - kappa: '\u03BA', - lambda: '\u03BB', - mu: '\u03BC', - nu: '\u03BD', - xi: '\u03BE', - omicron: '\u03BF', - pi: '\u03C0', - rho: '\u03C1', - sigmaf: '\u03C2', - sigma: '\u03C3', - tau: '\u03C4', - upsilon: '\u03C5', - phi: '\u03C6', - chi: '\u03C7', - psi: '\u03C8', - omega: '\u03C9', - thetasym: '\u03D1', - upsih: '\u03D2', - piv: '\u03D6', - ensp: '\u2002', - emsp: '\u2003', - thinsp: '\u2009', - zwnj: '\u200C', - zwj: '\u200D', - lrm: '\u200E', - rlm: '\u200F', - ndash: '\u2013', - mdash: '\u2014', - lsquo: '\u2018', - rsquo: '\u2019', - sbquo: '\u201A', - ldquo: '\u201C', - rdquo: '\u201D', - bdquo: '\u201E', - dagger: '\u2020', - Dagger: '\u2021', - bull: '\u2022', - hellip: '\u2026', - permil: '\u2030', - prime: '\u2032', - Prime: '\u2033', - lsaquo: '\u2039', - rsaquo: '\u203A', - oline: '\u203E', - frasl: '\u2044', - euro: '\u20AC', - image: '\u2111', - weierp: '\u2118', - real: '\u211C', - trade: '\u2122', - alefsym: '\u2135', - larr: '\u2190', - uarr: '\u2191', - rarr: '\u2192', - darr: '\u2193', - harr: '\u2194', - crarr: '\u21B5', - lArr: '\u21D0', - uArr: '\u21D1', - rArr: '\u21D2', - dArr: '\u21D3', - hArr: '\u21D4', - forall: '\u2200', - part: '\u2202', - exist: '\u2203', - empty: '\u2205', - nabla: '\u2207', - isin: '\u2208', - notin: '\u2209', - ni: '\u220B', - prod: '\u220F', - sum: '\u2211', - minus: '\u2212', - lowast: '\u2217', - radic: '\u221A', - prop: '\u221D', - infin: '\u221E', - ang: '\u2220', - and: '\u2227', - or: '\u2228', - cap: '\u2229', - cup: '\u222A', - 'int': '\u222B', - there4: '\u2234', - sim: '\u223C', - cong: '\u2245', - asymp: '\u2248', - ne: '\u2260', - equiv: '\u2261', - le: '\u2264', - ge: '\u2265', - sub: '\u2282', - sup: '\u2283', - nsub: '\u2284', - sube: '\u2286', - supe: '\u2287', - oplus: '\u2295', - otimes: '\u2297', - perp: '\u22A5', - sdot: '\u22C5', - lceil: '\u2308', - rceil: '\u2309', - lfloor: '\u230A', - rfloor: '\u230B', - lang: '\u2329', - rang: '\u232A', - loz: '\u25CA', - spades: '\u2660', - clubs: '\u2663', - hearts: '\u2665', - diams: '\u2666' - }; - - function getQualifiedJSXName(object) { - if (object.type === Syntax.JSXIdentifier) { - return object.name; - } - if (object.type === Syntax.JSXNamespacedName) { - return object.namespace.name + ':' + object.name.name; - } - /* istanbul ignore else */ - if (object.type === Syntax.JSXMemberExpression) { - return ( - getQualifiedJSXName(object.object) + '.' + - getQualifiedJSXName(object.property) - ); - } - /* istanbul ignore next */ - throwUnexpected(object); - } - - function isJSXIdentifierStart(ch) { - // exclude backslash (\) - return (ch !== 92) && isIdentifierStart(ch); - } - - function isJSXIdentifierPart(ch) { - // exclude backslash (\) and add hyphen (-) - return (ch !== 92) && (ch === 45 || isIdentifierPart(ch)); - } - - function scanJSXIdentifier() { - var ch, start, value = ''; - - start = index; - while (index < length) { - ch = source.charCodeAt(index); - if (!isJSXIdentifierPart(ch)) { - break; - } - value += source[index++]; - } - - return { - type: Token.JSXIdentifier, - value: value, - lineNumber: lineNumber, - lineStart: lineStart, - range: [start, index] - }; - } - - function scanJSXEntity() { - var ch, str = '', start = index, count = 0, code; - ch = source[index]; - assert(ch === '&', 'Entity must start with an ampersand'); - index++; - while (index < length && count++ < 10) { - ch = source[index++]; - if (ch === ';') { - break; - } - str += ch; - } - - // Well-formed entity (ending was found). - if (ch === ';') { - // Numeric entity. - if (str[0] === '#') { - if (str[1] === 'x') { - code = +('0' + str.substr(1)); - } else { - // Removing leading zeros in order to avoid treating as octal in old browsers. - code = +str.substr(1).replace(Regex.LeadingZeros, ''); - } - - if (!isNaN(code)) { - return String.fromCharCode(code); - } - /* istanbul ignore else */ - } else if (XHTMLEntities[str]) { - return XHTMLEntities[str]; - } - } - - // Treat non-entity sequences as regular text. - index = start + 1; - return '&'; - } - - function scanJSXText(stopChars) { - var ch, str = '', start; - start = index; - while (index < length) { - ch = source[index]; - if (stopChars.indexOf(ch) !== -1) { - break; - } - if (ch === '&') { - str += scanJSXEntity(); - } else { - index++; - if (ch === '\r' && source[index] === '\n') { - str += ch; - ch = source[index]; - index++; - } - if (isLineTerminator(ch.charCodeAt(0))) { - ++lineNumber; - lineStart = index; - } - str += ch; - } - } - return { - type: Token.JSXText, - value: str, - lineNumber: lineNumber, - lineStart: lineStart, - range: [start, index] - }; - } - - function scanJSXStringLiteral() { - var innerToken, quote, start; - - quote = source[index]; - assert((quote === '\'' || quote === '"'), - 'String literal must starts with a quote'); - - start = index; - ++index; - - innerToken = scanJSXText([quote]); - - if (quote !== source[index]) { - throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); - } - - ++index; - - innerToken.range = [start, index]; - - return innerToken; - } - - /** - * Between JSX opening and closing tags (e.g. HERE), anything that - * is not another JSX tag and is not an expression wrapped by {} is text. - */ - function advanceJSXChild() { - var ch = source.charCodeAt(index); - - // '<' 60, '>' 62, '{' 123, '}' 125 - if (ch !== 60 && ch !== 62 && ch !== 123 && ch !== 125) { - return scanJSXText(['<', '>', '{', '}']); - } - - return scanPunctuator(); - } - - function parseJSXIdentifier() { - var token, marker = markerCreate(); - - if (lookahead.type !== Token.JSXIdentifier) { - throwUnexpected(lookahead); - } - - token = lex(); - return markerApply(marker, delegate.createJSXIdentifier(token.value)); - } - - function parseJSXNamespacedName() { - var namespace, name, marker = markerCreate(); - - namespace = parseJSXIdentifier(); - expect(':'); - name = parseJSXIdentifier(); - - return markerApply(marker, delegate.createJSXNamespacedName(namespace, name)); - } - - function parseJSXMemberExpression() { - var marker = markerCreate(), - expr = parseJSXIdentifier(); - - while (match('.')) { - lex(); - expr = markerApply(marker, delegate.createJSXMemberExpression(expr, parseJSXIdentifier())); - } - - return expr; - } - - function parseJSXElementName() { - if (lookahead2().value === ':') { - return parseJSXNamespacedName(); - } - if (lookahead2().value === '.') { - return parseJSXMemberExpression(); - } - - return parseJSXIdentifier(); - } - - function parseJSXAttributeName() { - if (lookahead2().value === ':') { - return parseJSXNamespacedName(); - } - - return parseJSXIdentifier(); - } - - function parseJSXAttributeValue() { - var value, marker; - if (match('{')) { - value = parseJSXExpressionContainer(); - if (value.expression.type === Syntax.JSXEmptyExpression) { - throwError( - value, - 'JSX attributes must only be assigned a non-empty ' + - 'expression' - ); - } - } else if (match('<')) { - value = parseJSXElement(); - } else if (lookahead.type === Token.JSXText) { - marker = markerCreate(); - value = markerApply(marker, delegate.createLiteral(lex())); - } else { - throwError({}, Messages.InvalidJSXAttributeValue); - } - return value; - } - - function parseJSXEmptyExpression() { - var marker = markerCreatePreserveWhitespace(); - while (source.charAt(index) !== '}') { - index++; - } - return markerApply(marker, delegate.createJSXEmptyExpression()); - } - - function parseJSXExpressionContainer() { - var expression, origInJSXChild, origInJSXTag, marker = markerCreate(); - - origInJSXChild = state.inJSXChild; - origInJSXTag = state.inJSXTag; - state.inJSXChild = false; - state.inJSXTag = false; - - expect('{'); - - if (match('}')) { - expression = parseJSXEmptyExpression(); - } else { - expression = parseExpression(); - } - - state.inJSXChild = origInJSXChild; - state.inJSXTag = origInJSXTag; - - expect('}'); - - return markerApply(marker, delegate.createJSXExpressionContainer(expression)); - } - - function parseJSXSpreadAttribute() { - var expression, origInJSXChild, origInJSXTag, marker = markerCreate(); - - origInJSXChild = state.inJSXChild; - origInJSXTag = state.inJSXTag; - state.inJSXChild = false; - state.inJSXTag = false; - - expect('{'); - expect('...'); - - expression = parseAssignmentExpression(); - - state.inJSXChild = origInJSXChild; - state.inJSXTag = origInJSXTag; - - expect('}'); - - return markerApply(marker, delegate.createJSXSpreadAttribute(expression)); - } - - function parseJSXAttribute() { - var name, marker; - - if (match('{')) { - return parseJSXSpreadAttribute(); - } - - marker = markerCreate(); - - name = parseJSXAttributeName(); - - // HTML empty attribute - if (match('=')) { - lex(); - return markerApply(marker, delegate.createJSXAttribute(name, parseJSXAttributeValue())); - } - - return markerApply(marker, delegate.createJSXAttribute(name)); - } - - function parseJSXChild() { - var token, marker; - if (match('{')) { - token = parseJSXExpressionContainer(); - } else if (lookahead.type === Token.JSXText) { - marker = markerCreatePreserveWhitespace(); - token = markerApply(marker, delegate.createLiteral(lex())); - } else if (match('<')) { - token = parseJSXElement(); - } else { - throwUnexpected(lookahead); - } - return token; - } - - function parseJSXClosingElement() { - var name, origInJSXChild, origInJSXTag, marker = markerCreate(); - origInJSXChild = state.inJSXChild; - origInJSXTag = state.inJSXTag; - state.inJSXChild = false; - state.inJSXTag = true; - expect('<'); - expect('/'); - name = parseJSXElementName(); - // Because advance() (called by lex() called by expect()) expects there - // to be a valid token after >, it needs to know whether to look for a - // standard JS token or an JSX text node - state.inJSXChild = origInJSXChild; - state.inJSXTag = origInJSXTag; - expect('>'); - return markerApply(marker, delegate.createJSXClosingElement(name)); - } - - function parseJSXOpeningElement() { - var name, attributes = [], selfClosing = false, origInJSXChild, origInJSXTag, marker = markerCreate(); - - origInJSXChild = state.inJSXChild; - origInJSXTag = state.inJSXTag; - state.inJSXChild = false; - state.inJSXTag = true; - - expect('<'); - - name = parseJSXElementName(); - - while (index < length && - lookahead.value !== '/' && - lookahead.value !== '>') { - attributes.push(parseJSXAttribute()); - } - - state.inJSXTag = origInJSXTag; - - if (lookahead.value === '/') { - expect('/'); - // Because advance() (called by lex() called by expect()) expects - // there to be a valid token after >, it needs to know whether to - // look for a standard JS token or an JSX text node - state.inJSXChild = origInJSXChild; - expect('>'); - selfClosing = true; - } else { - state.inJSXChild = true; - expect('>'); - } - return markerApply(marker, delegate.createJSXOpeningElement(name, attributes, selfClosing)); - } - - function parseJSXElement() { - var openingElement, closingElement = null, children = [], origInJSXChild, origInJSXTag, marker = markerCreate(); - - origInJSXChild = state.inJSXChild; - origInJSXTag = state.inJSXTag; - openingElement = parseJSXOpeningElement(); - - if (!openingElement.selfClosing) { - while (index < length) { - state.inJSXChild = false; // Call lookahead2() with inJSXChild = false because one
two
; - // - // the default error message is a bit incomprehensible. Since it's - // rarely (never?) useful to write a less-than sign after an JSX - // element, we disallow it here in the parser in order to provide a - // better error message. (In the rare case that the less-than operator - // was intended, the left tag can be wrapped in parentheses.) - if (!origInJSXChild && match('<')) { - throwError(lookahead, Messages.AdjacentJSXElements); - } - - return markerApply(marker, delegate.createJSXElement(openingElement, closingElement, children)); - } - - function parseTypeAlias() { - var id, marker = markerCreate(), typeParameters = null, right; - expectContextualKeyword('type'); - id = parseVariableIdentifier(); - if (match('<')) { - typeParameters = parseTypeParameterDeclaration(); - } - expect('='); - right = parseType(); - consumeSemicolon(); - return markerApply(marker, delegate.createTypeAlias(id, typeParameters, right)); - } - - function parseInterfaceExtends() { - var marker = markerCreate(), id, typeParameters = null; - - id = parseVariableIdentifier(); - if (match('<')) { - typeParameters = parseTypeParameterInstantiation(); - } - - return markerApply(marker, delegate.createInterfaceExtends( - id, - typeParameters - )); - } - - function parseInterfaceish(marker, allowStatic) { - var body, bodyMarker, extended = [], id, - typeParameters = null; - - id = parseVariableIdentifier(); - if (match('<')) { - typeParameters = parseTypeParameterDeclaration(); - } - - if (matchKeyword('extends')) { - expectKeyword('extends'); - - while (index < length) { - extended.push(parseInterfaceExtends()); - if (!match(',')) { - break; - } - expect(','); - } - } - - bodyMarker = markerCreate(); - body = markerApply(bodyMarker, parseObjectType(allowStatic)); - - return markerApply(marker, delegate.createInterface( - id, - typeParameters, - body, - extended - )); - } - - function parseInterface() { - var marker = markerCreate(); - - if (strict) { - expectKeyword('interface'); - } else { - expectContextualKeyword('interface'); - } - - return parseInterfaceish(marker, /* allowStatic */false); - } - - function parseDeclareClass() { - var marker = markerCreate(), ret; - expectContextualKeyword('declare'); - expectKeyword('class'); - - ret = parseInterfaceish(marker, /* allowStatic */true); - ret.type = Syntax.DeclareClass; - return ret; - } - - function parseDeclareFunction() { - var id, idMarker, - marker = markerCreate(), params, returnType, rest, tmp, - typeParameters = null, value, valueMarker; - - expectContextualKeyword('declare'); - expectKeyword('function'); - idMarker = markerCreate(); - id = parseVariableIdentifier(); - - valueMarker = markerCreate(); - if (match('<')) { - typeParameters = parseTypeParameterDeclaration(); - } - expect('('); - tmp = parseFunctionTypeParams(); - params = tmp.params; - rest = tmp.rest; - expect(')'); - - expect(':'); - returnType = parseType(); - - value = markerApply(valueMarker, delegate.createFunctionTypeAnnotation( - params, - returnType, - rest, - typeParameters - )); - - id.typeAnnotation = markerApply(valueMarker, delegate.createTypeAnnotation( - value - )); - markerApply(idMarker, id); - - consumeSemicolon(); - - return markerApply(marker, delegate.createDeclareFunction( - id - )); - } - - function parseDeclareVariable() { - var id, marker = markerCreate(); - expectContextualKeyword('declare'); - expectKeyword('var'); - id = parseTypeAnnotatableIdentifier(); - - consumeSemicolon(); - - return markerApply(marker, delegate.createDeclareVariable( - id - )); - } - - function parseDeclareModule() { - var body = [], bodyMarker, id, idMarker, marker = markerCreate(), token; - expectContextualKeyword('declare'); - expectContextualKeyword('module'); - - if (lookahead.type === Token.StringLiteral) { - if (strict && lookahead.octal) { - throwErrorTolerant(lookahead, Messages.StrictOctalLiteral); - } - idMarker = markerCreate(); - id = markerApply(idMarker, delegate.createLiteral(lex())); - } else { - id = parseVariableIdentifier(); - } - - bodyMarker = markerCreate(); - expect('{'); - while (index < length && !match('}')) { - token = lookahead2(); - switch (token.value) { - case 'class': - body.push(parseDeclareClass()); - break; - case 'function': - body.push(parseDeclareFunction()); - break; - case 'var': - body.push(parseDeclareVariable()); - break; - default: - throwUnexpected(lookahead); - } - } - expect('}'); - - return markerApply(marker, delegate.createDeclareModule( - id, - markerApply(bodyMarker, delegate.createBlockStatement(body)) - )); - } - - function collectToken() { - var loc, token, range, value, entry; - - /* istanbul ignore else */ - if (!state.inJSXChild) { - skipComment(); - } - - loc = { - start: { - line: lineNumber, - column: index - lineStart - } - }; - - token = extra.advance(); - loc.end = { - line: lineNumber, - column: index - lineStart - }; - - if (token.type !== Token.EOF) { - range = [token.range[0], token.range[1]]; - value = source.slice(token.range[0], token.range[1]); - entry = { - type: TokenName[token.type], - value: value, - range: range, - loc: loc - }; - if (token.regex) { - entry.regex = { - pattern: token.regex.pattern, - flags: token.regex.flags - }; - } - extra.tokens.push(entry); - } - - return token; - } - - function collectRegex() { - var pos, loc, regex, token; - - skipComment(); - - pos = index; - loc = { - start: { - line: lineNumber, - column: index - lineStart - } - }; - - regex = extra.scanRegExp(); - loc.end = { - line: lineNumber, - column: index - lineStart - }; - - if (!extra.tokenize) { - /* istanbul ignore next */ - // Pop the previous token, which is likely '/' or '/=' - if (extra.tokens.length > 0) { - token = extra.tokens[extra.tokens.length - 1]; - if (token.range[0] === pos && token.type === 'Punctuator') { - if (token.value === '/' || token.value === '/=') { - extra.tokens.pop(); - } - } - } - - extra.tokens.push({ - type: 'RegularExpression', - value: regex.literal, - regex: regex.regex, - range: [pos, index], - loc: loc - }); - } - - return regex; - } - - function filterTokenLocation() { - var i, entry, token, tokens = []; - - for (i = 0; i < extra.tokens.length; ++i) { - entry = extra.tokens[i]; - token = { - type: entry.type, - value: entry.value - }; - if (entry.regex) { - token.regex = { - pattern: entry.regex.pattern, - flags: entry.regex.flags - }; - } - if (extra.range) { - token.range = entry.range; - } - if (extra.loc) { - token.loc = entry.loc; - } - tokens.push(token); - } - - extra.tokens = tokens; - } - - function patch() { - if (typeof extra.tokens !== 'undefined') { - extra.advance = advance; - extra.scanRegExp = scanRegExp; - - advance = collectToken; - scanRegExp = collectRegex; - } - } - - function unpatch() { - if (typeof extra.scanRegExp === 'function') { - advance = extra.advance; - scanRegExp = extra.scanRegExp; - } - } - - // This is used to modify the delegate. - - function extend(object, properties) { - var entry, result = {}; - - for (entry in object) { - /* istanbul ignore else */ - if (object.hasOwnProperty(entry)) { - result[entry] = object[entry]; - } - } - - for (entry in properties) { - /* istanbul ignore else */ - if (properties.hasOwnProperty(entry)) { - result[entry] = properties[entry]; - } - } - - return result; - } - - function tokenize(code, options) { - var toString, - token, - tokens; - - toString = String; - if (typeof code !== 'string' && !(code instanceof String)) { - code = toString(code); - } - - delegate = SyntaxTreeDelegate; - source = code; - index = 0; - lineNumber = (source.length > 0) ? 1 : 0; - lineStart = 0; - length = source.length; - lookahead = null; - state = { - allowKeyword: true, - allowIn: true, - labelSet: new StringMap(), - inFunctionBody: false, - inIteration: false, - inSwitch: false, - lastCommentStart: -1 - }; - - extra = {}; - - // Options matching. - options = options || {}; - - // Of course we collect tokens here. - options.tokens = true; - extra.tokens = []; - extra.tokenize = true; - // The following two fields are necessary to compute the Regex tokens. - extra.openParenToken = -1; - extra.openCurlyToken = -1; - - extra.range = (typeof options.range === 'boolean') && options.range; - extra.loc = (typeof options.loc === 'boolean') && options.loc; - - if (typeof options.comment === 'boolean' && options.comment) { - extra.comments = []; - } - if (typeof options.tolerant === 'boolean' && options.tolerant) { - extra.errors = []; - } - - patch(); - - try { - peek(); - if (lookahead.type === Token.EOF) { - return extra.tokens; - } - - token = lex(); - while (lookahead.type !== Token.EOF) { - try { - token = lex(); - } catch (lexError) { - token = lookahead; - if (extra.errors) { - extra.errors.push(lexError); - // We have to break on the first error - // to avoid infinite loops. - break; - } else { - throw lexError; - } - } - } - - filterTokenLocation(); - tokens = extra.tokens; - if (typeof extra.comments !== 'undefined') { - tokens.comments = extra.comments; - } - if (typeof extra.errors !== 'undefined') { - tokens.errors = extra.errors; - } - } catch (e) { - throw e; - } finally { - unpatch(); - extra = {}; - } - return tokens; - } - - function parse(code, options) { - var program, toString; - - toString = String; - if (typeof code !== 'string' && !(code instanceof String)) { - code = toString(code); - } - - delegate = SyntaxTreeDelegate; - source = code; - index = 0; - lineNumber = (source.length > 0) ? 1 : 0; - lineStart = 0; - length = source.length; - lookahead = null; - state = { - allowKeyword: false, - allowIn: true, - labelSet: new StringMap(), - parenthesizedCount: 0, - inFunctionBody: false, - inIteration: false, - inSwitch: false, - inJSXChild: false, - inJSXTag: false, - inType: false, - lastCommentStart: -1, - yieldAllowed: false, - awaitAllowed: false - }; - - extra = {}; - if (typeof options !== 'undefined') { - extra.range = (typeof options.range === 'boolean') && options.range; - extra.loc = (typeof options.loc === 'boolean') && options.loc; - extra.attachComment = (typeof options.attachComment === 'boolean') && options.attachComment; - - if (extra.loc && options.source !== null && options.source !== undefined) { - delegate = extend(delegate, { - 'postProcess': function (node) { - node.loc.source = toString(options.source); - return node; - } - }); - } - - extra.sourceType = options.sourceType; - if (typeof options.tokens === 'boolean' && options.tokens) { - extra.tokens = []; - } - if (typeof options.comment === 'boolean' && options.comment) { - extra.comments = []; - } - if (typeof options.tolerant === 'boolean' && options.tolerant) { - extra.errors = []; - } - if (extra.attachComment) { - extra.range = true; - extra.comments = []; - extra.bottomRightStack = []; - extra.trailingComments = []; - extra.leadingComments = []; - } - } - - patch(); - try { - program = parseProgram(); - if (typeof extra.comments !== 'undefined') { - program.comments = extra.comments; - } - if (typeof extra.tokens !== 'undefined') { - filterTokenLocation(); - program.tokens = extra.tokens; - } - if (typeof extra.errors !== 'undefined') { - program.errors = extra.errors; - } - } catch (e) { - throw e; - } finally { - unpatch(); - extra = {}; - } - - return program; - } - - // Sync with *.json manifests. - exports.version = '13001.1001.0-dev-harmony-fb'; - - exports.tokenize = tokenize; - - exports.parse = parse; - - // Deep copy. - /* istanbul ignore next */ - exports.Syntax = (function () { - var name, types = {}; - - if (typeof Object.create === 'function') { - types = Object.create(null); - } - - for (name in Syntax) { - if (Syntax.hasOwnProperty(name)) { - types[name] = Syntax[name]; - } - } - - if (typeof Object.freeze === 'function') { - Object.freeze(types); - } - - return types; - }()); - -})); -/* vim: set sw=4 ts=4 et tw=80 : */ - -},{}],10:[function(_dereq_,module,exports){ -var Base62 = (function (my) { - my.chars = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"] - - my.encode = function(i){ - if (i === 0) {return '0'} - var s = '' - while (i > 0) { - s = this.chars[i % 62] + s - i = Math.floor(i/62) - } - return s - }; - my.decode = function(a,b,c,d){ - for ( - b = c = ( - a === (/\W|_|^$/.test(a += "") || a) - ) - 1; - d = a.charCodeAt(c++); - ) - b = b * 62 + d - [, 48, 29, 87][d >> 5]; - return b - }; - - return my; -}({})); - -module.exports = Base62 -},{}],11:[function(_dereq_,module,exports){ -/* - * Copyright 2009-2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE.txt or: - * http://opensource.org/licenses/BSD-3-Clause - */ -exports.SourceMapGenerator = _dereq_('./source-map/source-map-generator').SourceMapGenerator; -exports.SourceMapConsumer = _dereq_('./source-map/source-map-consumer').SourceMapConsumer; -exports.SourceNode = _dereq_('./source-map/source-node').SourceNode; - -},{"./source-map/source-map-consumer":16,"./source-map/source-map-generator":17,"./source-map/source-node":18}],12:[function(_dereq_,module,exports){ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = _dereq_('amdefine')(module, _dereq_); -} -define(function (_dereq_, exports, module) { - - var util = _dereq_('./util'); - - /** - * A data structure which is a combination of an array and a set. Adding a new - * member is O(1), testing for membership is O(1), and finding the index of an - * element is O(1). Removing elements from the set is not supported. Only - * strings are supported for membership. - */ - function ArraySet() { - this._array = []; - this._set = {}; - } - - /** - * Static method for creating ArraySet instances from an existing array. - */ - ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { - var set = new ArraySet(); - for (var i = 0, len = aArray.length; i < len; i++) { - set.add(aArray[i], aAllowDuplicates); - } - return set; - }; - - /** - * Add the given string to this set. - * - * @param String aStr - */ - ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { - var isDuplicate = this.has(aStr); - var idx = this._array.length; - if (!isDuplicate || aAllowDuplicates) { - this._array.push(aStr); - } - if (!isDuplicate) { - this._set[util.toSetString(aStr)] = idx; - } - }; - - /** - * Is the given string a member of this set? - * - * @param String aStr - */ - ArraySet.prototype.has = function ArraySet_has(aStr) { - return Object.prototype.hasOwnProperty.call(this._set, - util.toSetString(aStr)); - }; - - /** - * What is the index of the given string in the array? - * - * @param String aStr - */ - ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { - if (this.has(aStr)) { - return this._set[util.toSetString(aStr)]; - } - throw new Error('"' + aStr + '" is not in the set.'); - }; - - /** - * What is the element at the given index? - * - * @param Number aIdx - */ - ArraySet.prototype.at = function ArraySet_at(aIdx) { - if (aIdx >= 0 && aIdx < this._array.length) { - return this._array[aIdx]; - } - throw new Error('No element indexed by ' + aIdx); - }; - - /** - * Returns the array representation of this set (which has the proper indices - * indicated by indexOf). Note that this is a copy of the internal array used - * for storing the members so that no one can mess with internal state. - */ - ArraySet.prototype.toArray = function ArraySet_toArray() { - return this._array.slice(); - }; - - exports.ArraySet = ArraySet; - -}); - -},{"./util":19,"amdefine":20}],13:[function(_dereq_,module,exports){ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - * - * Based on the Base 64 VLQ implementation in Closure Compiler: - * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java - * - * Copyright 2011 The Closure Compiler Authors. All rights reserved. - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -if (typeof define !== 'function') { - var define = _dereq_('amdefine')(module, _dereq_); -} -define(function (_dereq_, exports, module) { - - var base64 = _dereq_('./base64'); - - // A single base 64 digit can contain 6 bits of data. For the base 64 variable - // length quantities we use in the source map spec, the first bit is the sign, - // the next four bits are the actual value, and the 6th bit is the - // continuation bit. The continuation bit tells us whether there are more - // digits in this value following this digit. - // - // Continuation - // | Sign - // | | - // V V - // 101011 - - var VLQ_BASE_SHIFT = 5; - - // binary: 100000 - var VLQ_BASE = 1 << VLQ_BASE_SHIFT; - - // binary: 011111 - var VLQ_BASE_MASK = VLQ_BASE - 1; - - // binary: 100000 - var VLQ_CONTINUATION_BIT = VLQ_BASE; - - /** - * Converts from a two-complement value to a value where the sign bit is - * is placed in the least significant bit. For example, as decimals: - * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) - * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) - */ - function toVLQSigned(aValue) { - return aValue < 0 - ? ((-aValue) << 1) + 1 - : (aValue << 1) + 0; - } - - /** - * Converts to a two-complement value from a value where the sign bit is - * is placed in the least significant bit. For example, as decimals: - * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 - * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 - */ - function fromVLQSigned(aValue) { - var isNegative = (aValue & 1) === 1; - var shifted = aValue >> 1; - return isNegative - ? -shifted - : shifted; - } - - /** - * Returns the base 64 VLQ encoded value. - */ - exports.encode = function base64VLQ_encode(aValue) { - var encoded = ""; - var digit; - - var vlq = toVLQSigned(aValue); - - do { - digit = vlq & VLQ_BASE_MASK; - vlq >>>= VLQ_BASE_SHIFT; - if (vlq > 0) { - // There are still more digits in this value, so we must make sure the - // continuation bit is marked. - digit |= VLQ_CONTINUATION_BIT; - } - encoded += base64.encode(digit); - } while (vlq > 0); - - return encoded; - }; - - /** - * Decodes the next base 64 VLQ value from the given string and returns the - * value and the rest of the string. - */ - exports.decode = function base64VLQ_decode(aStr) { - var i = 0; - var strLen = aStr.length; - var result = 0; - var shift = 0; - var continuation, digit; - - do { - if (i >= strLen) { - throw new Error("Expected more digits in base 64 VLQ value."); - } - digit = base64.decode(aStr.charAt(i++)); - continuation = !!(digit & VLQ_CONTINUATION_BIT); - digit &= VLQ_BASE_MASK; - result = result + (digit << shift); - shift += VLQ_BASE_SHIFT; - } while (continuation); - - return { - value: fromVLQSigned(result), - rest: aStr.slice(i) - }; - }; - -}); - -},{"./base64":14,"amdefine":20}],14:[function(_dereq_,module,exports){ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = _dereq_('amdefine')(module, _dereq_); -} -define(function (_dereq_, exports, module) { - - var charToIntMap = {}; - var intToCharMap = {}; - - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' - .split('') - .forEach(function (ch, index) { - charToIntMap[ch] = index; - intToCharMap[index] = ch; - }); - - /** - * Encode an integer in the range of 0 to 63 to a single base 64 digit. - */ - exports.encode = function base64_encode(aNumber) { - if (aNumber in intToCharMap) { - return intToCharMap[aNumber]; - } - throw new TypeError("Must be between 0 and 63: " + aNumber); - }; - - /** - * Decode a single base 64 digit to an integer. - */ - exports.decode = function base64_decode(aChar) { - if (aChar in charToIntMap) { - return charToIntMap[aChar]; - } - throw new TypeError("Not a valid base 64 digit: " + aChar); - }; - -}); - -},{"amdefine":20}],15:[function(_dereq_,module,exports){ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = _dereq_('amdefine')(module, _dereq_); -} -define(function (_dereq_, exports, module) { - - /** - * Recursive implementation of binary search. - * - * @param aLow Indices here and lower do not contain the needle. - * @param aHigh Indices here and higher do not contain the needle. - * @param aNeedle The element being searched for. - * @param aHaystack The non-empty array being searched. - * @param aCompare Function which takes two elements and returns -1, 0, or 1. - */ - function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare) { - // This function terminates when one of the following is true: - // - // 1. We find the exact element we are looking for. - // - // 2. We did not find the exact element, but we can return the next - // closest element that is less than that element. - // - // 3. We did not find the exact element, and there is no next-closest - // element which is less than the one we are searching for, so we - // return null. - var mid = Math.floor((aHigh - aLow) / 2) + aLow; - var cmp = aCompare(aNeedle, aHaystack[mid], true); - if (cmp === 0) { - // Found the element we are looking for. - return aHaystack[mid]; - } - else if (cmp > 0) { - // aHaystack[mid] is greater than our needle. - if (aHigh - mid > 1) { - // The element is in the upper half. - return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare); - } - // We did not find an exact match, return the next closest one - // (termination case 2). - return aHaystack[mid]; - } - else { - // aHaystack[mid] is less than our needle. - if (mid - aLow > 1) { - // The element is in the lower half. - return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare); - } - // The exact needle element was not found in this haystack. Determine if - // we are in termination case (2) or (3) and return the appropriate thing. - return aLow < 0 - ? null - : aHaystack[aLow]; - } - } - - /** - * This is an implementation of binary search which will always try and return - * the next lowest value checked if there is no exact hit. This is because - * mappings between original and generated line/col pairs are single points, - * and there is an implicit region between each of them, so a miss just means - * that you aren't on the very start of a region. - * - * @param aNeedle The element you are looking for. - * @param aHaystack The array that is being searched. - * @param aCompare A function which takes the needle and an element in the - * array and returns -1, 0, or 1 depending on whether the needle is less - * than, equal to, or greater than the element, respectively. - */ - exports.search = function search(aNeedle, aHaystack, aCompare) { - return aHaystack.length > 0 - ? recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, aCompare) - : null; - }; - -}); - -},{"amdefine":20}],16:[function(_dereq_,module,exports){ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = _dereq_('amdefine')(module, _dereq_); -} -define(function (_dereq_, exports, module) { - - var util = _dereq_('./util'); - var binarySearch = _dereq_('./binary-search'); - var ArraySet = _dereq_('./array-set').ArraySet; - var base64VLQ = _dereq_('./base64-vlq'); - - /** - * A SourceMapConsumer instance represents a parsed source map which we can - * query for information about the original file positions by giving it a file - * position in the generated source. - * - * The only parameter is the raw source map (either as a JSON string, or - * already parsed to an object). According to the spec, source maps have the - * following attributes: - * - * - version: Which version of the source map spec this map is following. - * - sources: An array of URLs to the original source files. - * - names: An array of identifiers which can be referrenced by individual mappings. - * - sourceRoot: Optional. The URL root from which all sources are relative. - * - sourcesContent: Optional. An array of contents of the original source files. - * - mappings: A string of base64 VLQs which contain the actual mappings. - * - file: The generated file this source map is associated with. - * - * Here is an example source map, taken from the source map spec[0]: - * - * { - * version : 3, - * file: "out.js", - * sourceRoot : "", - * sources: ["foo.js", "bar.js"], - * names: ["src", "maps", "are", "fun"], - * mappings: "AA,AB;;ABCDE;" - * } - * - * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1# - */ - function SourceMapConsumer(aSourceMap) { - var sourceMap = aSourceMap; - if (typeof aSourceMap === 'string') { - sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); - } - - var version = util.getArg(sourceMap, 'version'); - var sources = util.getArg(sourceMap, 'sources'); - // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which - // requires the array) to play nice here. - var names = util.getArg(sourceMap, 'names', []); - var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null); - var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null); - var mappings = util.getArg(sourceMap, 'mappings'); - var file = util.getArg(sourceMap, 'file', null); - - // Once again, Sass deviates from the spec and supplies the version as a - // string rather than a number, so we use loose equality checking here. - if (version != this._version) { - throw new Error('Unsupported version: ' + version); - } - - // Pass `true` below to allow duplicate names and sources. While source maps - // are intended to be compressed and deduplicated, the TypeScript compiler - // sometimes generates source maps with duplicates in them. See Github issue - // #72 and bugzil.la/889492. - this._names = ArraySet.fromArray(names, true); - this._sources = ArraySet.fromArray(sources, true); - - this.sourceRoot = sourceRoot; - this.sourcesContent = sourcesContent; - this._mappings = mappings; - this.file = file; - } - - /** - * Create a SourceMapConsumer from a SourceMapGenerator. - * - * @param SourceMapGenerator aSourceMap - * The source map that will be consumed. - * @returns SourceMapConsumer - */ - SourceMapConsumer.fromSourceMap = - function SourceMapConsumer_fromSourceMap(aSourceMap) { - var smc = Object.create(SourceMapConsumer.prototype); - - smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true); - smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true); - smc.sourceRoot = aSourceMap._sourceRoot; - smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(), - smc.sourceRoot); - smc.file = aSourceMap._file; - - smc.__generatedMappings = aSourceMap._mappings.slice() - .sort(util.compareByGeneratedPositions); - smc.__originalMappings = aSourceMap._mappings.slice() - .sort(util.compareByOriginalPositions); - - return smc; - }; - - /** - * The version of the source mapping spec that we are consuming. - */ - SourceMapConsumer.prototype._version = 3; - - /** - * The list of original sources. - */ - Object.defineProperty(SourceMapConsumer.prototype, 'sources', { - get: function () { - return this._sources.toArray().map(function (s) { - return this.sourceRoot ? util.join(this.sourceRoot, s) : s; - }, this); - } - }); - - // `__generatedMappings` and `__originalMappings` are arrays that hold the - // parsed mapping coordinates from the source map's "mappings" attribute. They - // are lazily instantiated, accessed via the `_generatedMappings` and - // `_originalMappings` getters respectively, and we only parse the mappings - // and create these arrays once queried for a source location. We jump through - // these hoops because there can be many thousands of mappings, and parsing - // them is expensive, so we only want to do it if we must. - // - // Each object in the arrays is of the form: - // - // { - // generatedLine: The line number in the generated code, - // generatedColumn: The column number in the generated code, - // source: The path to the original source file that generated this - // chunk of code, - // originalLine: The line number in the original source that - // corresponds to this chunk of generated code, - // originalColumn: The column number in the original source that - // corresponds to this chunk of generated code, - // name: The name of the original symbol which generated this chunk of - // code. - // } - // - // All properties except for `generatedLine` and `generatedColumn` can be - // `null`. - // - // `_generatedMappings` is ordered by the generated positions. - // - // `_originalMappings` is ordered by the original positions. - - SourceMapConsumer.prototype.__generatedMappings = null; - Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', { - get: function () { - if (!this.__generatedMappings) { - this.__generatedMappings = []; - this.__originalMappings = []; - this._parseMappings(this._mappings, this.sourceRoot); - } - - return this.__generatedMappings; - } - }); - - SourceMapConsumer.prototype.__originalMappings = null; - Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', { - get: function () { - if (!this.__originalMappings) { - this.__generatedMappings = []; - this.__originalMappings = []; - this._parseMappings(this._mappings, this.sourceRoot); - } - - return this.__originalMappings; - } - }); - - /** - * Parse the mappings in a string in to a data structure which we can easily - * query (the ordered arrays in the `this.__generatedMappings` and - * `this.__originalMappings` properties). - */ - SourceMapConsumer.prototype._parseMappings = - function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { - var generatedLine = 1; - var previousGeneratedColumn = 0; - var previousOriginalLine = 0; - var previousOriginalColumn = 0; - var previousSource = 0; - var previousName = 0; - var mappingSeparator = /^[,;]/; - var str = aStr; - var mapping; - var temp; - - while (str.length > 0) { - if (str.charAt(0) === ';') { - generatedLine++; - str = str.slice(1); - previousGeneratedColumn = 0; - } - else if (str.charAt(0) === ',') { - str = str.slice(1); - } - else { - mapping = {}; - mapping.generatedLine = generatedLine; - - // Generated column. - temp = base64VLQ.decode(str); - mapping.generatedColumn = previousGeneratedColumn + temp.value; - previousGeneratedColumn = mapping.generatedColumn; - str = temp.rest; - - if (str.length > 0 && !mappingSeparator.test(str.charAt(0))) { - // Original source. - temp = base64VLQ.decode(str); - mapping.source = this._sources.at(previousSource + temp.value); - previousSource += temp.value; - str = temp.rest; - if (str.length === 0 || mappingSeparator.test(str.charAt(0))) { - throw new Error('Found a source, but no line and column'); - } - - // Original line. - temp = base64VLQ.decode(str); - mapping.originalLine = previousOriginalLine + temp.value; - previousOriginalLine = mapping.originalLine; - // Lines are stored 0-based - mapping.originalLine += 1; - str = temp.rest; - if (str.length === 0 || mappingSeparator.test(str.charAt(0))) { - throw new Error('Found a source and line, but no column'); - } - - // Original column. - temp = base64VLQ.decode(str); - mapping.originalColumn = previousOriginalColumn + temp.value; - previousOriginalColumn = mapping.originalColumn; - str = temp.rest; - - if (str.length > 0 && !mappingSeparator.test(str.charAt(0))) { - // Original name. - temp = base64VLQ.decode(str); - mapping.name = this._names.at(previousName + temp.value); - previousName += temp.value; - str = temp.rest; - } - } - - this.__generatedMappings.push(mapping); - if (typeof mapping.originalLine === 'number') { - this.__originalMappings.push(mapping); - } - } - } - - this.__originalMappings.sort(util.compareByOriginalPositions); - }; - - /** - * Find the mapping that best matches the hypothetical "needle" mapping that - * we are searching for in the given "haystack" of mappings. - */ - SourceMapConsumer.prototype._findMapping = - function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName, - aColumnName, aComparator) { - // To return the position we are searching for, we must first find the - // mapping for the given position and then return the opposite position it - // points to. Because the mappings are sorted, we can use binary search to - // find the best mapping. - - if (aNeedle[aLineName] <= 0) { - throw new TypeError('Line must be greater than or equal to 1, got ' - + aNeedle[aLineName]); - } - if (aNeedle[aColumnName] < 0) { - throw new TypeError('Column must be greater than or equal to 0, got ' - + aNeedle[aColumnName]); - } - - return binarySearch.search(aNeedle, aMappings, aComparator); - }; - - /** - * Returns the original source, line, and column information for the generated - * source's line and column positions provided. The only argument is an object - * with the following properties: - * - * - line: The line number in the generated source. - * - column: The column number in the generated source. - * - * and an object is returned with the following properties: - * - * - source: The original source file, or null. - * - line: The line number in the original source, or null. - * - column: The column number in the original source, or null. - * - name: The original identifier, or null. - */ - SourceMapConsumer.prototype.originalPositionFor = - function SourceMapConsumer_originalPositionFor(aArgs) { - var needle = { - generatedLine: util.getArg(aArgs, 'line'), - generatedColumn: util.getArg(aArgs, 'column') - }; - - var mapping = this._findMapping(needle, - this._generatedMappings, - "generatedLine", - "generatedColumn", - util.compareByGeneratedPositions); - - if (mapping) { - var source = util.getArg(mapping, 'source', null); - if (source && this.sourceRoot) { - source = util.join(this.sourceRoot, source); - } - return { - source: source, - line: util.getArg(mapping, 'originalLine', null), - column: util.getArg(mapping, 'originalColumn', null), - name: util.getArg(mapping, 'name', null) - }; - } - - return { - source: null, - line: null, - column: null, - name: null - }; - }; - - /** - * Returns the original source content. The only argument is the url of the - * original source file. Returns null if no original source content is - * availible. - */ - SourceMapConsumer.prototype.sourceContentFor = - function SourceMapConsumer_sourceContentFor(aSource) { - if (!this.sourcesContent) { - return null; - } - - if (this.sourceRoot) { - aSource = util.relative(this.sourceRoot, aSource); - } - - if (this._sources.has(aSource)) { - return this.sourcesContent[this._sources.indexOf(aSource)]; - } - - var url; - if (this.sourceRoot - && (url = util.urlParse(this.sourceRoot))) { - // XXX: file:// URIs and absolute paths lead to unexpected behavior for - // many users. We can help them out when they expect file:// URIs to - // behave like it would if they were running a local HTTP server. See - // https://bugzilla.mozilla.org/show_bug.cgi?id=885597. - var fileUriAbsPath = aSource.replace(/^file:\/\//, ""); - if (url.scheme == "file" - && this._sources.has(fileUriAbsPath)) { - return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)] - } - - if ((!url.path || url.path == "/") - && this._sources.has("/" + aSource)) { - return this.sourcesContent[this._sources.indexOf("/" + aSource)]; - } - } - - throw new Error('"' + aSource + '" is not in the SourceMap.'); - }; - - /** - * Returns the generated line and column information for the original source, - * line, and column positions provided. The only argument is an object with - * the following properties: - * - * - source: The filename of the original source. - * - line: The line number in the original source. - * - column: The column number in the original source. - * - * and an object is returned with the following properties: - * - * - line: The line number in the generated source, or null. - * - column: The column number in the generated source, or null. - */ - SourceMapConsumer.prototype.generatedPositionFor = - function SourceMapConsumer_generatedPositionFor(aArgs) { - var needle = { - source: util.getArg(aArgs, 'source'), - originalLine: util.getArg(aArgs, 'line'), - originalColumn: util.getArg(aArgs, 'column') - }; - - if (this.sourceRoot) { - needle.source = util.relative(this.sourceRoot, needle.source); - } - - var mapping = this._findMapping(needle, - this._originalMappings, - "originalLine", - "originalColumn", - util.compareByOriginalPositions); - - if (mapping) { - return { - line: util.getArg(mapping, 'generatedLine', null), - column: util.getArg(mapping, 'generatedColumn', null) - }; - } - - return { - line: null, - column: null - }; - }; - - SourceMapConsumer.GENERATED_ORDER = 1; - SourceMapConsumer.ORIGINAL_ORDER = 2; - - /** - * Iterate over each mapping between an original source/line/column and a - * generated line/column in this source map. - * - * @param Function aCallback - * The function that is called with each mapping. - * @param Object aContext - * Optional. If specified, this object will be the value of `this` every - * time that `aCallback` is called. - * @param aOrder - * Either `SourceMapConsumer.GENERATED_ORDER` or - * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to - * iterate over the mappings sorted by the generated file's line/column - * order or the original's source/line/column order, respectively. Defaults to - * `SourceMapConsumer.GENERATED_ORDER`. - */ - SourceMapConsumer.prototype.eachMapping = - function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) { - var context = aContext || null; - var order = aOrder || SourceMapConsumer.GENERATED_ORDER; - - var mappings; - switch (order) { - case SourceMapConsumer.GENERATED_ORDER: - mappings = this._generatedMappings; - break; - case SourceMapConsumer.ORIGINAL_ORDER: - mappings = this._originalMappings; - break; - default: - throw new Error("Unknown order of iteration."); - } - - var sourceRoot = this.sourceRoot; - mappings.map(function (mapping) { - var source = mapping.source; - if (source && sourceRoot) { - source = util.join(sourceRoot, source); - } - return { - source: source, - generatedLine: mapping.generatedLine, - generatedColumn: mapping.generatedColumn, - originalLine: mapping.originalLine, - originalColumn: mapping.originalColumn, - name: mapping.name - }; - }).forEach(aCallback, context); - }; - - exports.SourceMapConsumer = SourceMapConsumer; - -}); - -},{"./array-set":12,"./base64-vlq":13,"./binary-search":15,"./util":19,"amdefine":20}],17:[function(_dereq_,module,exports){ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = _dereq_('amdefine')(module, _dereq_); -} -define(function (_dereq_, exports, module) { - - var base64VLQ = _dereq_('./base64-vlq'); - var util = _dereq_('./util'); - var ArraySet = _dereq_('./array-set').ArraySet; - - /** - * An instance of the SourceMapGenerator represents a source map which is - * being built incrementally. To create a new one, you must pass an object - * with the following properties: - * - * - file: The filename of the generated source. - * - sourceRoot: An optional root for all URLs in this source map. - */ - function SourceMapGenerator(aArgs) { - this._file = util.getArg(aArgs, 'file'); - this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null); - this._sources = new ArraySet(); - this._names = new ArraySet(); - this._mappings = []; - this._sourcesContents = null; - } - - SourceMapGenerator.prototype._version = 3; - - /** - * Creates a new SourceMapGenerator based on a SourceMapConsumer - * - * @param aSourceMapConsumer The SourceMap. - */ - SourceMapGenerator.fromSourceMap = - function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) { - var sourceRoot = aSourceMapConsumer.sourceRoot; - var generator = new SourceMapGenerator({ - file: aSourceMapConsumer.file, - sourceRoot: sourceRoot - }); - aSourceMapConsumer.eachMapping(function (mapping) { - var newMapping = { - generated: { - line: mapping.generatedLine, - column: mapping.generatedColumn - } - }; - - if (mapping.source) { - newMapping.source = mapping.source; - if (sourceRoot) { - newMapping.source = util.relative(sourceRoot, newMapping.source); - } - - newMapping.original = { - line: mapping.originalLine, - column: mapping.originalColumn - }; - - if (mapping.name) { - newMapping.name = mapping.name; - } - } - - generator.addMapping(newMapping); - }); - aSourceMapConsumer.sources.forEach(function (sourceFile) { - var content = aSourceMapConsumer.sourceContentFor(sourceFile); - if (content) { - generator.setSourceContent(sourceFile, content); - } - }); - return generator; - }; - - /** - * Add a single mapping from original source line and column to the generated - * source's line and column for this source map being created. The mapping - * object should have the following properties: - * - * - generated: An object with the generated line and column positions. - * - original: An object with the original line and column positions. - * - source: The original source file (relative to the sourceRoot). - * - name: An optional original token name for this mapping. - */ - SourceMapGenerator.prototype.addMapping = - function SourceMapGenerator_addMapping(aArgs) { - var generated = util.getArg(aArgs, 'generated'); - var original = util.getArg(aArgs, 'original', null); - var source = util.getArg(aArgs, 'source', null); - var name = util.getArg(aArgs, 'name', null); - - this._validateMapping(generated, original, source, name); - - if (source && !this._sources.has(source)) { - this._sources.add(source); - } - - if (name && !this._names.has(name)) { - this._names.add(name); - } - - this._mappings.push({ - generatedLine: generated.line, - generatedColumn: generated.column, - originalLine: original != null && original.line, - originalColumn: original != null && original.column, - source: source, - name: name - }); - }; - - /** - * Set the source content for a source file. - */ - SourceMapGenerator.prototype.setSourceContent = - function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) { - var source = aSourceFile; - if (this._sourceRoot) { - source = util.relative(this._sourceRoot, source); - } - - if (aSourceContent !== null) { - // Add the source content to the _sourcesContents map. - // Create a new _sourcesContents map if the property is null. - if (!this._sourcesContents) { - this._sourcesContents = {}; - } - this._sourcesContents[util.toSetString(source)] = aSourceContent; - } else { - // Remove the source file from the _sourcesContents map. - // If the _sourcesContents map is empty, set the property to null. - delete this._sourcesContents[util.toSetString(source)]; - if (Object.keys(this._sourcesContents).length === 0) { - this._sourcesContents = null; - } - } - }; - - /** - * Applies the mappings of a sub-source-map for a specific source file to the - * source map being generated. Each mapping to the supplied source file is - * rewritten using the supplied source map. Note: The resolution for the - * resulting mappings is the minimium of this map and the supplied map. - * - * @param aSourceMapConsumer The source map to be applied. - * @param aSourceFile Optional. The filename of the source file. - * If omitted, SourceMapConsumer's file property will be used. - */ - SourceMapGenerator.prototype.applySourceMap = - function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile) { - // If aSourceFile is omitted, we will use the file property of the SourceMap - if (!aSourceFile) { - aSourceFile = aSourceMapConsumer.file; - } - var sourceRoot = this._sourceRoot; - // Make "aSourceFile" relative if an absolute Url is passed. - if (sourceRoot) { - aSourceFile = util.relative(sourceRoot, aSourceFile); - } - // Applying the SourceMap can add and remove items from the sources and - // the names array. - var newSources = new ArraySet(); - var newNames = new ArraySet(); - - // Find mappings for the "aSourceFile" - this._mappings.forEach(function (mapping) { - if (mapping.source === aSourceFile && mapping.originalLine) { - // Check if it can be mapped by the source map, then update the mapping. - var original = aSourceMapConsumer.originalPositionFor({ - line: mapping.originalLine, - column: mapping.originalColumn - }); - if (original.source !== null) { - // Copy mapping - if (sourceRoot) { - mapping.source = util.relative(sourceRoot, original.source); - } else { - mapping.source = original.source; - } - mapping.originalLine = original.line; - mapping.originalColumn = original.column; - if (original.name !== null && mapping.name !== null) { - // Only use the identifier name if it's an identifier - // in both SourceMaps - mapping.name = original.name; - } - } - } - - var source = mapping.source; - if (source && !newSources.has(source)) { - newSources.add(source); - } - - var name = mapping.name; - if (name && !newNames.has(name)) { - newNames.add(name); - } - - }, this); - this._sources = newSources; - this._names = newNames; - - // Copy sourcesContents of applied map. - aSourceMapConsumer.sources.forEach(function (sourceFile) { - var content = aSourceMapConsumer.sourceContentFor(sourceFile); - if (content) { - if (sourceRoot) { - sourceFile = util.relative(sourceRoot, sourceFile); - } - this.setSourceContent(sourceFile, content); - } - }, this); - }; - - /** - * A mapping can have one of the three levels of data: - * - * 1. Just the generated position. - * 2. The Generated position, original position, and original source. - * 3. Generated and original position, original source, as well as a name - * token. - * - * To maintain consistency, we validate that any new mapping being added falls - * in to one of these categories. - */ - SourceMapGenerator.prototype._validateMapping = - function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, - aName) { - if (aGenerated && 'line' in aGenerated && 'column' in aGenerated - && aGenerated.line > 0 && aGenerated.column >= 0 - && !aOriginal && !aSource && !aName) { - // Case 1. - return; - } - else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated - && aOriginal && 'line' in aOriginal && 'column' in aOriginal - && aGenerated.line > 0 && aGenerated.column >= 0 - && aOriginal.line > 0 && aOriginal.column >= 0 - && aSource) { - // Cases 2 and 3. - return; - } - else { - throw new Error('Invalid mapping: ' + JSON.stringify({ - generated: aGenerated, - source: aSource, - orginal: aOriginal, - name: aName - })); - } - }; - - /** - * Serialize the accumulated mappings in to the stream of base 64 VLQs - * specified by the source map format. - */ - SourceMapGenerator.prototype._serializeMappings = - function SourceMapGenerator_serializeMappings() { - var previousGeneratedColumn = 0; - var previousGeneratedLine = 1; - var previousOriginalColumn = 0; - var previousOriginalLine = 0; - var previousName = 0; - var previousSource = 0; - var result = ''; - var mapping; - - // The mappings must be guaranteed to be in sorted order before we start - // serializing them or else the generated line numbers (which are defined - // via the ';' separators) will be all messed up. Note: it might be more - // performant to maintain the sorting as we insert them, rather than as we - // serialize them, but the big O is the same either way. - this._mappings.sort(util.compareByGeneratedPositions); - - for (var i = 0, len = this._mappings.length; i < len; i++) { - mapping = this._mappings[i]; - - if (mapping.generatedLine !== previousGeneratedLine) { - previousGeneratedColumn = 0; - while (mapping.generatedLine !== previousGeneratedLine) { - result += ';'; - previousGeneratedLine++; - } - } - else { - if (i > 0) { - if (!util.compareByGeneratedPositions(mapping, this._mappings[i - 1])) { - continue; - } - result += ','; - } - } - - result += base64VLQ.encode(mapping.generatedColumn - - previousGeneratedColumn); - previousGeneratedColumn = mapping.generatedColumn; - - if (mapping.source) { - result += base64VLQ.encode(this._sources.indexOf(mapping.source) - - previousSource); - previousSource = this._sources.indexOf(mapping.source); - - // lines are stored 0-based in SourceMap spec version 3 - result += base64VLQ.encode(mapping.originalLine - 1 - - previousOriginalLine); - previousOriginalLine = mapping.originalLine - 1; - - result += base64VLQ.encode(mapping.originalColumn - - previousOriginalColumn); - previousOriginalColumn = mapping.originalColumn; - - if (mapping.name) { - result += base64VLQ.encode(this._names.indexOf(mapping.name) - - previousName); - previousName = this._names.indexOf(mapping.name); - } - } - } - - return result; - }; - - SourceMapGenerator.prototype._generateSourcesContent = - function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) { - return aSources.map(function (source) { - if (!this._sourcesContents) { - return null; - } - if (aSourceRoot) { - source = util.relative(aSourceRoot, source); - } - var key = util.toSetString(source); - return Object.prototype.hasOwnProperty.call(this._sourcesContents, - key) - ? this._sourcesContents[key] - : null; - }, this); - }; - - /** - * Externalize the source map. - */ - SourceMapGenerator.prototype.toJSON = - function SourceMapGenerator_toJSON() { - var map = { - version: this._version, - file: this._file, - sources: this._sources.toArray(), - names: this._names.toArray(), - mappings: this._serializeMappings() - }; - if (this._sourceRoot) { - map.sourceRoot = this._sourceRoot; - } - if (this._sourcesContents) { - map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot); - } - - return map; - }; - - /** - * Render the source map being generated to a string. - */ - SourceMapGenerator.prototype.toString = - function SourceMapGenerator_toString() { - return JSON.stringify(this); - }; - - exports.SourceMapGenerator = SourceMapGenerator; - -}); - -},{"./array-set":12,"./base64-vlq":13,"./util":19,"amdefine":20}],18:[function(_dereq_,module,exports){ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = _dereq_('amdefine')(module, _dereq_); -} -define(function (_dereq_, exports, module) { - - var SourceMapGenerator = _dereq_('./source-map-generator').SourceMapGenerator; - var util = _dereq_('./util'); - - /** - * SourceNodes provide a way to abstract over interpolating/concatenating - * snippets of generated JavaScript source code while maintaining the line and - * column information associated with the original source code. - * - * @param aLine The original line number. - * @param aColumn The original column number. - * @param aSource The original source's filename. - * @param aChunks Optional. An array of strings which are snippets of - * generated JS, or other SourceNodes. - * @param aName The original identifier. - */ - function SourceNode(aLine, aColumn, aSource, aChunks, aName) { - this.children = []; - this.sourceContents = {}; - this.line = aLine === undefined ? null : aLine; - this.column = aColumn === undefined ? null : aColumn; - this.source = aSource === undefined ? null : aSource; - this.name = aName === undefined ? null : aName; - if (aChunks != null) this.add(aChunks); - } - - /** - * Creates a SourceNode from generated code and a SourceMapConsumer. - * - * @param aGeneratedCode The generated code - * @param aSourceMapConsumer The SourceMap for the generated code - */ - SourceNode.fromStringWithSourceMap = - function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer) { - // The SourceNode we want to fill with the generated code - // and the SourceMap - var node = new SourceNode(); - - // The generated code - // Processed fragments are removed from this array. - var remainingLines = aGeneratedCode.split('\n'); - - // We need to remember the position of "remainingLines" - var lastGeneratedLine = 1, lastGeneratedColumn = 0; - - // The generate SourceNodes we need a code range. - // To extract it current and last mapping is used. - // Here we store the last mapping. - var lastMapping = null; - - aSourceMapConsumer.eachMapping(function (mapping) { - if (lastMapping === null) { - // We add the generated code until the first mapping - // to the SourceNode without any mapping. - // Each line is added as separate string. - while (lastGeneratedLine < mapping.generatedLine) { - node.add(remainingLines.shift() + "\n"); - lastGeneratedLine++; - } - if (lastGeneratedColumn < mapping.generatedColumn) { - var nextLine = remainingLines[0]; - node.add(nextLine.substr(0, mapping.generatedColumn)); - remainingLines[0] = nextLine.substr(mapping.generatedColumn); - lastGeneratedColumn = mapping.generatedColumn; - } - } else { - // We add the code from "lastMapping" to "mapping": - // First check if there is a new line in between. - if (lastGeneratedLine < mapping.generatedLine) { - var code = ""; - // Associate full lines with "lastMapping" - do { - code += remainingLines.shift() + "\n"; - lastGeneratedLine++; - lastGeneratedColumn = 0; - } while (lastGeneratedLine < mapping.generatedLine); - // When we reached the correct line, we add code until we - // reach the correct column too. - if (lastGeneratedColumn < mapping.generatedColumn) { - var nextLine = remainingLines[0]; - code += nextLine.substr(0, mapping.generatedColumn); - remainingLines[0] = nextLine.substr(mapping.generatedColumn); - lastGeneratedColumn = mapping.generatedColumn; - } - // Create the SourceNode. - addMappingWithCode(lastMapping, code); - } else { - // There is no new line in between. - // Associate the code between "lastGeneratedColumn" and - // "mapping.generatedColumn" with "lastMapping" - var nextLine = remainingLines[0]; - var code = nextLine.substr(0, mapping.generatedColumn - - lastGeneratedColumn); - remainingLines[0] = nextLine.substr(mapping.generatedColumn - - lastGeneratedColumn); - lastGeneratedColumn = mapping.generatedColumn; - addMappingWithCode(lastMapping, code); - } - } - lastMapping = mapping; - }, this); - // We have processed all mappings. - // Associate the remaining code in the current line with "lastMapping" - // and add the remaining lines without any mapping - addMappingWithCode(lastMapping, remainingLines.join("\n")); - - // Copy sourcesContent into SourceNode - aSourceMapConsumer.sources.forEach(function (sourceFile) { - var content = aSourceMapConsumer.sourceContentFor(sourceFile); - if (content) { - node.setSourceContent(sourceFile, content); - } - }); - - return node; - - function addMappingWithCode(mapping, code) { - if (mapping === null || mapping.source === undefined) { - node.add(code); - } else { - node.add(new SourceNode(mapping.originalLine, - mapping.originalColumn, - mapping.source, - code, - mapping.name)); - } - } - }; - - /** - * Add a chunk of generated JS to this source node. - * - * @param aChunk A string snippet of generated JS code, another instance of - * SourceNode, or an array where each member is one of those things. - */ - SourceNode.prototype.add = function SourceNode_add(aChunk) { - if (Array.isArray(aChunk)) { - aChunk.forEach(function (chunk) { - this.add(chunk); - }, this); - } - else if (aChunk instanceof SourceNode || typeof aChunk === "string") { - if (aChunk) { - this.children.push(aChunk); - } - } - else { - throw new TypeError( - "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk - ); - } - return this; - }; - - /** - * Add a chunk of generated JS to the beginning of this source node. - * - * @param aChunk A string snippet of generated JS code, another instance of - * SourceNode, or an array where each member is one of those things. - */ - SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) { - if (Array.isArray(aChunk)) { - for (var i = aChunk.length-1; i >= 0; i--) { - this.prepend(aChunk[i]); - } - } - else if (aChunk instanceof SourceNode || typeof aChunk === "string") { - this.children.unshift(aChunk); - } - else { - throw new TypeError( - "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk - ); - } - return this; - }; - - /** - * Walk over the tree of JS snippets in this node and its children. The - * walking function is called once for each snippet of JS and is passed that - * snippet and the its original associated source's line/column location. - * - * @param aFn The traversal function. - */ - SourceNode.prototype.walk = function SourceNode_walk(aFn) { - var chunk; - for (var i = 0, len = this.children.length; i < len; i++) { - chunk = this.children[i]; - if (chunk instanceof SourceNode) { - chunk.walk(aFn); - } - else { - if (chunk !== '') { - aFn(chunk, { source: this.source, - line: this.line, - column: this.column, - name: this.name }); - } - } - } - }; - - /** - * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between - * each of `this.children`. - * - * @param aSep The separator. - */ - SourceNode.prototype.join = function SourceNode_join(aSep) { - var newChildren; - var i; - var len = this.children.length; - if (len > 0) { - newChildren = []; - for (i = 0; i < len-1; i++) { - newChildren.push(this.children[i]); - newChildren.push(aSep); - } - newChildren.push(this.children[i]); - this.children = newChildren; - } - return this; - }; - - /** - * Call String.prototype.replace on the very right-most source snippet. Useful - * for trimming whitespace from the end of a source node, etc. - * - * @param aPattern The pattern to replace. - * @param aReplacement The thing to replace the pattern with. - */ - SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) { - var lastChild = this.children[this.children.length - 1]; - if (lastChild instanceof SourceNode) { - lastChild.replaceRight(aPattern, aReplacement); - } - else if (typeof lastChild === 'string') { - this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement); - } - else { - this.children.push(''.replace(aPattern, aReplacement)); - } - return this; - }; - - /** - * Set the source content for a source file. This will be added to the SourceMapGenerator - * in the sourcesContent field. - * - * @param aSourceFile The filename of the source file - * @param aSourceContent The content of the source file - */ - SourceNode.prototype.setSourceContent = - function SourceNode_setSourceContent(aSourceFile, aSourceContent) { - this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent; - }; - - /** - * Walk over the tree of SourceNodes. The walking function is called for each - * source file content and is passed the filename and source content. - * - * @param aFn The traversal function. - */ - SourceNode.prototype.walkSourceContents = - function SourceNode_walkSourceContents(aFn) { - for (var i = 0, len = this.children.length; i < len; i++) { - if (this.children[i] instanceof SourceNode) { - this.children[i].walkSourceContents(aFn); - } - } - - var sources = Object.keys(this.sourceContents); - for (var i = 0, len = sources.length; i < len; i++) { - aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]); - } - }; - - /** - * Return the string representation of this source node. Walks over the tree - * and concatenates all the various snippets together to one string. - */ - SourceNode.prototype.toString = function SourceNode_toString() { - var str = ""; - this.walk(function (chunk) { - str += chunk; - }); - return str; - }; - - /** - * Returns the string representation of this source node along with a source - * map. - */ - SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) { - var generated = { - code: "", - line: 1, - column: 0 - }; - var map = new SourceMapGenerator(aArgs); - var sourceMappingActive = false; - var lastOriginalSource = null; - var lastOriginalLine = null; - var lastOriginalColumn = null; - var lastOriginalName = null; - this.walk(function (chunk, original) { - generated.code += chunk; - if (original.source !== null - && original.line !== null - && original.column !== null) { - if(lastOriginalSource !== original.source - || lastOriginalLine !== original.line - || lastOriginalColumn !== original.column - || lastOriginalName !== original.name) { - map.addMapping({ - source: original.source, - original: { - line: original.line, - column: original.column - }, - generated: { - line: generated.line, - column: generated.column - }, - name: original.name - }); - } - lastOriginalSource = original.source; - lastOriginalLine = original.line; - lastOriginalColumn = original.column; - lastOriginalName = original.name; - sourceMappingActive = true; - } else if (sourceMappingActive) { - map.addMapping({ - generated: { - line: generated.line, - column: generated.column - } - }); - lastOriginalSource = null; - sourceMappingActive = false; - } - chunk.split('').forEach(function (ch) { - if (ch === '\n') { - generated.line++; - generated.column = 0; - } else { - generated.column++; - } - }); - }); - this.walkSourceContents(function (sourceFile, sourceContent) { - map.setSourceContent(sourceFile, sourceContent); - }); - - return { code: generated.code, map: map }; - }; - - exports.SourceNode = SourceNode; - -}); - -},{"./source-map-generator":17,"./util":19,"amdefine":20}],19:[function(_dereq_,module,exports){ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = _dereq_('amdefine')(module, _dereq_); -} -define(function (_dereq_, exports, module) { - - /** - * This is a helper function for getting values from parameter/options - * objects. - * - * @param args The object we are extracting values from - * @param name The name of the property we are getting. - * @param defaultValue An optional value to return if the property is missing - * from the object. If this is not specified and the property is missing, an - * error will be thrown. - */ - function getArg(aArgs, aName, aDefaultValue) { - if (aName in aArgs) { - return aArgs[aName]; - } else if (arguments.length === 3) { - return aDefaultValue; - } else { - throw new Error('"' + aName + '" is a required argument.'); - } - } - exports.getArg = getArg; - - var urlRegexp = /([\w+\-.]+):\/\/((\w+:\w+)@)?([\w.]+)?(:(\d+))?(\S+)?/; - var dataUrlRegexp = /^data:.+\,.+/; - - function urlParse(aUrl) { - var match = aUrl.match(urlRegexp); - if (!match) { - return null; - } - return { - scheme: match[1], - auth: match[3], - host: match[4], - port: match[6], - path: match[7] - }; - } - exports.urlParse = urlParse; - - function urlGenerate(aParsedUrl) { - var url = aParsedUrl.scheme + "://"; - if (aParsedUrl.auth) { - url += aParsedUrl.auth + "@" - } - if (aParsedUrl.host) { - url += aParsedUrl.host; - } - if (aParsedUrl.port) { - url += ":" + aParsedUrl.port - } - if (aParsedUrl.path) { - url += aParsedUrl.path; - } - return url; - } - exports.urlGenerate = urlGenerate; - - function join(aRoot, aPath) { - var url; - - if (aPath.match(urlRegexp) || aPath.match(dataUrlRegexp)) { - return aPath; - } - - if (aPath.charAt(0) === '/' && (url = urlParse(aRoot))) { - url.path = aPath; - return urlGenerate(url); - } - - return aRoot.replace(/\/$/, '') + '/' + aPath; - } - exports.join = join; - - /** - * Because behavior goes wacky when you set `__proto__` on objects, we - * have to prefix all the strings in our set with an arbitrary character. - * - * See https://github.com/mozilla/source-map/pull/31 and - * https://github.com/mozilla/source-map/issues/30 - * - * @param String aStr - */ - function toSetString(aStr) { - return '$' + aStr; - } - exports.toSetString = toSetString; - - function fromSetString(aStr) { - return aStr.substr(1); - } - exports.fromSetString = fromSetString; - - function relative(aRoot, aPath) { - aRoot = aRoot.replace(/\/$/, ''); - - var url = urlParse(aRoot); - if (aPath.charAt(0) == "/" && url && url.path == "/") { - return aPath.slice(1); - } - - return aPath.indexOf(aRoot + '/') === 0 - ? aPath.substr(aRoot.length + 1) - : aPath; - } - exports.relative = relative; - - function strcmp(aStr1, aStr2) { - var s1 = aStr1 || ""; - var s2 = aStr2 || ""; - return (s1 > s2) - (s1 < s2); - } - - /** - * Comparator between two mappings where the original positions are compared. - * - * Optionally pass in `true` as `onlyCompareGenerated` to consider two - * mappings with the same original source/line/column, but different generated - * line and column the same. Useful when searching for a mapping with a - * stubbed out mapping. - */ - function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { - var cmp; - - cmp = strcmp(mappingA.source, mappingB.source); - if (cmp) { - return cmp; - } - - cmp = mappingA.originalLine - mappingB.originalLine; - if (cmp) { - return cmp; - } - - cmp = mappingA.originalColumn - mappingB.originalColumn; - if (cmp || onlyCompareOriginal) { - return cmp; - } - - cmp = strcmp(mappingA.name, mappingB.name); - if (cmp) { - return cmp; - } - - cmp = mappingA.generatedLine - mappingB.generatedLine; - if (cmp) { - return cmp; - } - - return mappingA.generatedColumn - mappingB.generatedColumn; - }; - exports.compareByOriginalPositions = compareByOriginalPositions; - - /** - * Comparator between two mappings where the generated positions are - * compared. - * - * Optionally pass in `true` as `onlyCompareGenerated` to consider two - * mappings with the same generated line and column, but different - * source/name/original line and column the same. Useful when searching for a - * mapping with a stubbed out mapping. - */ - function compareByGeneratedPositions(mappingA, mappingB, onlyCompareGenerated) { - var cmp; - - cmp = mappingA.generatedLine - mappingB.generatedLine; - if (cmp) { - return cmp; - } - - cmp = mappingA.generatedColumn - mappingB.generatedColumn; - if (cmp || onlyCompareGenerated) { - return cmp; - } - - cmp = strcmp(mappingA.source, mappingB.source); - if (cmp) { - return cmp; - } - - cmp = mappingA.originalLine - mappingB.originalLine; - if (cmp) { - return cmp; - } - - cmp = mappingA.originalColumn - mappingB.originalColumn; - if (cmp) { - return cmp; - } - - return strcmp(mappingA.name, mappingB.name); - }; - exports.compareByGeneratedPositions = compareByGeneratedPositions; - -}); - -},{"amdefine":20}],20:[function(_dereq_,module,exports){ -(function (process,__filename){ -/** vim: et:ts=4:sw=4:sts=4 - * @license amdefine 0.1.0 Copyright (c) 2011, The Dojo Foundation All Rights Reserved. - * Available via the MIT or new BSD license. - * see: http://github.com/jrburke/amdefine for details - */ - -/*jslint node: true */ -/*global module, process */ -'use strict'; - -/** - * Creates a define for node. - * @param {Object} module the "module" object that is defined by Node for the - * current module. - * @param {Function} [requireFn]. Node's require function for the current module. - * It only needs to be passed in Node versions before 0.5, when module.require - * did not exist. - * @returns {Function} a define function that is usable for the current node - * module. - */ -function amdefine(module, requireFn) { - 'use strict'; - var defineCache = {}, - loaderCache = {}, - alreadyCalled = false, - path = _dereq_('path'), - makeRequire, stringRequire; - - /** - * Trims the . and .. from an array of path segments. - * It will keep a leading path segment if a .. will become - * the first path segment, to help with module name lookups, - * which act like paths, but can be remapped. But the end result, - * all paths that use this function should look normalized. - * NOTE: this method MODIFIES the input array. - * @param {Array} ary the array of path segments. - */ - function trimDots(ary) { - var i, part; - for (i = 0; ary[i]; i+= 1) { - part = ary[i]; - if (part === '.') { - ary.splice(i, 1); - i -= 1; - } else if (part === '..') { - if (i === 1 && (ary[2] === '..' || ary[0] === '..')) { - //End of the line. Keep at least one non-dot - //path segment at the front so it can be mapped - //correctly to disk. Otherwise, there is likely - //no path mapping for a path starting with '..'. - //This can still fail, but catches the most reasonable - //uses of .. - break; - } else if (i > 0) { - ary.splice(i - 1, 2); - i -= 2; - } - } - } - } - - function normalize(name, baseName) { - var baseParts; - - //Adjust any relative paths. - if (name && name.charAt(0) === '.') { - //If have a base name, try to normalize against it, - //otherwise, assume it is a top-level require that will - //be relative to baseUrl in the end. - if (baseName) { - baseParts = baseName.split('/'); - baseParts = baseParts.slice(0, baseParts.length - 1); - baseParts = baseParts.concat(name.split('/')); - trimDots(baseParts); - name = baseParts.join('/'); - } - } - - return name; - } - - /** - * Create the normalize() function passed to a loader plugin's - * normalize method. - */ - function makeNormalize(relName) { - return function (name) { - return normalize(name, relName); - }; - } - - function makeLoad(id) { - function load(value) { - loaderCache[id] = value; - } - - load.fromText = function (id, text) { - //This one is difficult because the text can/probably uses - //define, and any relative paths and requires should be relative - //to that id was it would be found on disk. But this would require - //bootstrapping a module/require fairly deeply from node core. - //Not sure how best to go about that yet. - throw new Error('amdefine does not implement load.fromText'); - }; - - return load; - } - - makeRequire = function (systemRequire, exports, module, relId) { - function amdRequire(deps, callback) { - if (typeof deps === 'string') { - //Synchronous, single module require('') - return stringRequire(systemRequire, exports, module, deps, relId); - } else { - //Array of dependencies with a callback. - - //Convert the dependencies to modules. - deps = deps.map(function (depName) { - return stringRequire(systemRequire, exports, module, depName, relId); - }); - - //Wait for next tick to call back the require call. - process.nextTick(function () { - callback.apply(null, deps); - }); - } - } - - amdRequire.toUrl = function (filePath) { - if (filePath.indexOf('.') === 0) { - return normalize(filePath, path.dirname(module.filename)); - } else { - return filePath; - } - }; - - return amdRequire; - }; - - //Favor explicit value, passed in if the module wants to support Node 0.4. - requireFn = requireFn || function req() { - return module.require.apply(module, arguments); - }; - - function runFactory(id, deps, factory) { - var r, e, m, result; - - if (id) { - e = loaderCache[id] = {}; - m = { - id: id, - uri: __filename, - exports: e - }; - r = makeRequire(requireFn, e, m, id); - } else { - //Only support one define call per file - if (alreadyCalled) { - throw new Error('amdefine with no module ID cannot be called more than once per file.'); - } - alreadyCalled = true; - - //Use the real variables from node - //Use module.exports for exports, since - //the exports in here is amdefine exports. - e = module.exports; - m = module; - r = makeRequire(requireFn, e, m, module.id); - } - - //If there are dependencies, they are strings, so need - //to convert them to dependency values. - if (deps) { - deps = deps.map(function (depName) { - return r(depName); - }); - } - - //Call the factory with the right dependencies. - if (typeof factory === 'function') { - result = factory.apply(m.exports, deps); - } else { - result = factory; - } - - if (result !== undefined) { - m.exports = result; - if (id) { - loaderCache[id] = m.exports; - } - } - } - - stringRequire = function (systemRequire, exports, module, id, relId) { - //Split the ID by a ! so that - var index = id.indexOf('!'), - originalId = id, - prefix, plugin; - - if (index === -1) { - id = normalize(id, relId); - - //Straight module lookup. If it is one of the special dependencies, - //deal with it, otherwise, delegate to node. - if (id === 'require') { - return makeRequire(systemRequire, exports, module, relId); - } else if (id === 'exports') { - return exports; - } else if (id === 'module') { - return module; - } else if (loaderCache.hasOwnProperty(id)) { - return loaderCache[id]; - } else if (defineCache[id]) { - runFactory.apply(null, defineCache[id]); - return loaderCache[id]; - } else { - if(systemRequire) { - return systemRequire(originalId); - } else { - throw new Error('No module with ID: ' + id); - } - } - } else { - //There is a plugin in play. - prefix = id.substring(0, index); - id = id.substring(index + 1, id.length); - - plugin = stringRequire(systemRequire, exports, module, prefix, relId); - - if (plugin.normalize) { - id = plugin.normalize(id, makeNormalize(relId)); - } else { - //Normalize the ID normally. - id = normalize(id, relId); - } - - if (loaderCache[id]) { - return loaderCache[id]; - } else { - plugin.load(id, makeRequire(systemRequire, exports, module, relId), makeLoad(id), {}); - - return loaderCache[id]; - } - } - }; - - //Create a define function specific to the module asking for amdefine. - function define(id, deps, factory) { - if (Array.isArray(id)) { - factory = deps; - deps = id; - id = undefined; - } else if (typeof id !== 'string') { - factory = id; - id = deps = undefined; - } - - if (deps && !Array.isArray(deps)) { - factory = deps; - deps = undefined; - } - - if (!deps) { - deps = ['require', 'exports', 'module']; - } - - //Set up properties for this module. If an ID, then use - //internal cache. If no ID, then use the external variables - //for this node module. - if (id) { - //Put the module in deep freeze until there is a - //require call for it. - defineCache[id] = [id, deps, factory]; - } else { - runFactory(id, deps, factory); - } - } - - //define.require, which has access to all the values in the - //cache. Useful for AMD modules that all have IDs in the file, - //but need to finally export a value to node based on one of those - //IDs. - define.require = function (id) { - if (loaderCache[id]) { - return loaderCache[id]; - } - - if (defineCache[id]) { - runFactory.apply(null, defineCache[id]); - return loaderCache[id]; - } - }; - - define.amd = {}; - - return define; -} - -module.exports = amdefine; - -}).call(this,_dereq_('_process'),"/node_modules/jstransform/node_modules/source-map/node_modules/amdefine/amdefine.js") -},{"_process":8,"path":7}],21:[function(_dereq_,module,exports){ -/** - * Copyright 2013 Facebook, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var docblockRe = /^\s*(\/\*\*(.|\r?\n)*?\*\/)/; -var ltrimRe = /^\s*/; -/** - * @param {String} contents - * @return {String} - */ -function extract(contents) { - var match = contents.match(docblockRe); - if (match) { - return match[0].replace(ltrimRe, '') || ''; - } - return ''; -} - - -var commentStartRe = /^\/\*\*?/; -var commentEndRe = /\*+\/$/; -var wsRe = /[\t ]+/g; -var stringStartRe = /(\r?\n|^) *\*/g; -var multilineRe = /(?:^|\r?\n) *(@[^\r\n]*?) *\r?\n *([^@\r\n\s][^@\r\n]+?) *\r?\n/g; -var propertyRe = /(?:^|\r?\n) *@(\S+) *([^\r\n]*)/g; - -/** - * @param {String} contents - * @return {Array} - */ -function parse(docblock) { - docblock = docblock - .replace(commentStartRe, '') - .replace(commentEndRe, '') - .replace(wsRe, ' ') - .replace(stringStartRe, '$1'); - - // Normalize multi-line directives - var prev = ''; - while (prev != docblock) { - prev = docblock; - docblock = docblock.replace(multilineRe, "\n$1 $2\n"); - } - docblock = docblock.trim(); - - var result = []; - var match; - while (match = propertyRe.exec(docblock)) { - result.push([match[1], match[2]]); - } - - return result; -} - -/** - * Same as parse but returns an object of prop: value instead of array of paris - * If a property appers more than once the last one will be returned - * - * @param {String} contents - * @return {Object} - */ -function parseAsObject(docblock) { - var pairs = parse(docblock); - var result = {}; - for (var i = 0; i < pairs.length; i++) { - result[pairs[i][0]] = pairs[i][1]; - } - return result; -} - - -exports.extract = extract; -exports.parse = parse; -exports.parseAsObject = parseAsObject; - -},{}],22:[function(_dereq_,module,exports){ -/** - * Copyright 2013 Facebook, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -/*jslint node: true*/ -"use strict"; - -var esprima = _dereq_('esprima-fb'); -var utils = _dereq_('./utils'); - -var getBoundaryNode = utils.getBoundaryNode; -var declareIdentInScope = utils.declareIdentInLocalScope; -var initScopeMetadata = utils.initScopeMetadata; -var Syntax = esprima.Syntax; - -/** - * @param {object} node - * @param {object} parentNode - * @return {boolean} - */ -function _nodeIsClosureScopeBoundary(node, parentNode) { - if (node.type === Syntax.Program) { - return true; - } - - var parentIsFunction = - parentNode.type === Syntax.FunctionDeclaration - || parentNode.type === Syntax.FunctionExpression - || parentNode.type === Syntax.ArrowFunctionExpression; - - var parentIsCurlylessArrowFunc = - parentNode.type === Syntax.ArrowFunctionExpression - && node === parentNode.body; - - return parentIsFunction - && (node.type === Syntax.BlockStatement || parentIsCurlylessArrowFunc); -} - -function _nodeIsBlockScopeBoundary(node, parentNode) { - if (node.type === Syntax.Program) { - return false; - } - - return node.type === Syntax.BlockStatement - && parentNode.type === Syntax.CatchClause; -} - -/** - * @param {object} node - * @param {array} path - * @param {object} state - */ -function traverse(node, path, state) { - /*jshint -W004*/ - // Create a scope stack entry if this is the first node we've encountered in - // its local scope - var startIndex = null; - var parentNode = path[0]; - if (!Array.isArray(node) && state.localScope.parentNode !== parentNode) { - if (_nodeIsClosureScopeBoundary(node, parentNode)) { - var scopeIsStrict = state.scopeIsStrict; - if (!scopeIsStrict - && (node.type === Syntax.BlockStatement - || node.type === Syntax.Program)) { - scopeIsStrict = - node.body.length > 0 - && node.body[0].type === Syntax.ExpressionStatement - && node.body[0].expression.type === Syntax.Literal - && node.body[0].expression.value === 'use strict'; - } - - if (node.type === Syntax.Program) { - startIndex = state.g.buffer.length; - state = utils.updateState(state, { - scopeIsStrict: scopeIsStrict - }); - } else { - startIndex = state.g.buffer.length + 1; - state = utils.updateState(state, { - localScope: { - parentNode: parentNode, - parentScope: state.localScope, - identifiers: {}, - tempVarIndex: 0, - tempVars: [] - }, - scopeIsStrict: scopeIsStrict - }); - - // All functions have an implicit 'arguments' object in scope - declareIdentInScope('arguments', initScopeMetadata(node), state); - - // Include function arg identifiers in the scope boundaries of the - // function - if (parentNode.params.length > 0) { - var param; - var metadata = initScopeMetadata(parentNode, path.slice(1), path[0]); - for (var i = 0; i < parentNode.params.length; i++) { - param = parentNode.params[i]; - if (param.type === Syntax.Identifier) { - declareIdentInScope(param.name, metadata, state); - } - } - } - - // Include rest arg identifiers in the scope boundaries of their - // functions - if (parentNode.rest) { - var metadata = initScopeMetadata( - parentNode, - path.slice(1), - path[0] - ); - declareIdentInScope(parentNode.rest.name, metadata, state); - } - - // Named FunctionExpressions scope their name within the body block of - // themselves only - if (parentNode.type === Syntax.FunctionExpression && parentNode.id) { - var metaData = - initScopeMetadata(parentNode, path.parentNodeslice, parentNode); - declareIdentInScope(parentNode.id.name, metaData, state); - } - } - - // Traverse and find all local identifiers in this closure first to - // account for function/variable declaration hoisting - collectClosureIdentsAndTraverse(node, path, state); - } - - if (_nodeIsBlockScopeBoundary(node, parentNode)) { - startIndex = state.g.buffer.length; - state = utils.updateState(state, { - localScope: { - parentNode: parentNode, - parentScope: state.localScope, - identifiers: {}, - tempVarIndex: 0, - tempVars: [] - } - }); - - if (parentNode.type === Syntax.CatchClause) { - var metadata = initScopeMetadata( - parentNode, - path.slice(1), - parentNode - ); - declareIdentInScope(parentNode.param.name, metadata, state); - } - collectBlockIdentsAndTraverse(node, path, state); - } - } - - // Only catchup() before and after traversing a child node - function traverser(node, path, state) { - node.range && utils.catchup(node.range[0], state); - traverse(node, path, state); - node.range && utils.catchup(node.range[1], state); - } - - utils.analyzeAndTraverse(walker, traverser, node, path, state); - - // Inject temp variables into the scope. - if (startIndex !== null) { - utils.injectTempVarDeclarations(state, startIndex); - } -} - -function collectClosureIdentsAndTraverse(node, path, state) { - utils.analyzeAndTraverse( - visitLocalClosureIdentifiers, - collectClosureIdentsAndTraverse, - node, - path, - state - ); -} - -function collectBlockIdentsAndTraverse(node, path, state) { - utils.analyzeAndTraverse( - visitLocalBlockIdentifiers, - collectBlockIdentsAndTraverse, - node, - path, - state - ); -} - -function visitLocalClosureIdentifiers(node, path, state) { - var metaData; - switch (node.type) { - case Syntax.ArrowFunctionExpression: - case Syntax.FunctionExpression: - // Function expressions don't get their names (if there is one) added to - // the closure scope they're defined in - return false; - case Syntax.ClassDeclaration: - case Syntax.ClassExpression: - case Syntax.FunctionDeclaration: - if (node.id) { - metaData = initScopeMetadata(getBoundaryNode(path), path.slice(), node); - declareIdentInScope(node.id.name, metaData, state); - } - return false; - case Syntax.VariableDeclarator: - // Variables have function-local scope - if (path[0].kind === 'var') { - metaData = initScopeMetadata(getBoundaryNode(path), path.slice(), node); - declareIdentInScope(node.id.name, metaData, state); - } - break; - } -} - -function visitLocalBlockIdentifiers(node, path, state) { - // TODO: Support 'let' here...maybe...one day...or something... - if (node.type === Syntax.CatchClause) { - return false; - } -} - -function walker(node, path, state) { - var visitors = state.g.visitors; - for (var i = 0; i < visitors.length; i++) { - if (visitors[i].test(node, path, state)) { - return visitors[i](traverse, node, path, state); - } - } -} - -var _astCache = {}; - -function getAstForSource(source, options) { - if (_astCache[source] && !options.disableAstCache) { - return _astCache[source]; - } - var ast = esprima.parse(source, { - comment: true, - loc: true, - range: true, - sourceType: options.sourceType - }); - if (!options.disableAstCache) { - _astCache[source] = ast; - } - return ast; -} - -/** - * Applies all available transformations to the source - * @param {array} visitors - * @param {string} source - * @param {?object} options - * @return {object} - */ -function transform(visitors, source, options) { - options = options || {}; - var ast; - try { - ast = getAstForSource(source, options); - } catch (e) { - e.message = 'Parse Error: ' + e.message; - throw e; - } - var state = utils.createState(source, ast, options); - state.g.visitors = visitors; - - if (options.sourceMap) { - var SourceMapGenerator = _dereq_('source-map').SourceMapGenerator; - state.g.sourceMap = new SourceMapGenerator({file: options.filename || 'transformed.js'}); - } - - traverse(ast, [], state); - utils.catchup(source.length, state); - - var ret = {code: state.g.buffer, extra: state.g.extra}; - if (options.sourceMap) { - ret.sourceMap = state.g.sourceMap; - ret.sourceMapFilename = options.filename || 'source.js'; - } - return ret; -} - -exports.transform = transform; -exports.Syntax = Syntax; - -},{"./utils":23,"esprima-fb":9,"source-map":11}],23:[function(_dereq_,module,exports){ -/** - * Copyright 2013 Facebook, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -/*jslint node: true*/ -var Syntax = _dereq_('esprima-fb').Syntax; -var leadingIndentRegexp = /(^|\n)( {2}|\t)/g; -var nonWhiteRegexp = /(\S)/g; - -/** - * A `state` object represents the state of the parser. It has "local" and - * "global" parts. Global contains parser position, source, etc. Local contains - * scope based properties like current class name. State should contain all the - * info required for transformation. It's the only mandatory object that is - * being passed to every function in transform chain. - * - * @param {string} source - * @param {object} transformOptions - * @return {object} - */ -function createState(source, rootNode, transformOptions) { - return { - /** - * A tree representing the current local scope (and its lexical scope chain) - * Useful for tracking identifiers from parent scopes, etc. - * @type {Object} - */ - localScope: { - parentNode: rootNode, - parentScope: null, - identifiers: {}, - tempVarIndex: 0, - tempVars: [] - }, - /** - * The name (and, if applicable, expression) of the super class - * @type {Object} - */ - superClass: null, - /** - * The namespace to use when munging identifiers - * @type {String} - */ - mungeNamespace: '', - /** - * Ref to the node for the current MethodDefinition - * @type {Object} - */ - methodNode: null, - /** - * Ref to the node for the FunctionExpression of the enclosing - * MethodDefinition - * @type {Object} - */ - methodFuncNode: null, - /** - * Name of the enclosing class - * @type {String} - */ - className: null, - /** - * Whether we're currently within a `strict` scope - * @type {Bool} - */ - scopeIsStrict: null, - /** - * Indentation offset - * @type {Number} - */ - indentBy: 0, - /** - * Global state (not affected by updateState) - * @type {Object} - */ - g: { - /** - * A set of general options that transformations can consider while doing - * a transformation: - * - * - minify - * Specifies that transformation steps should do their best to minify - * the output source when possible. This is useful for places where - * minification optimizations are possible with higher-level context - * info than what jsxmin can provide. - * - * For example, the ES6 class transform will minify munged private - * variables if this flag is set. - */ - opts: transformOptions, - /** - * Current position in the source code - * @type {Number} - */ - position: 0, - /** - * Auxiliary data to be returned by transforms - * @type {Object} - */ - extra: {}, - /** - * Buffer containing the result - * @type {String} - */ - buffer: '', - /** - * Source that is being transformed - * @type {String} - */ - source: source, - - /** - * Cached parsed docblock (see getDocblock) - * @type {object} - */ - docblock: null, - - /** - * Whether the thing was used - * @type {Boolean} - */ - tagNamespaceUsed: false, - - /** - * If using bolt xjs transformation - * @type {Boolean} - */ - isBolt: undefined, - - /** - * Whether to record source map (expensive) or not - * @type {SourceMapGenerator|null} - */ - sourceMap: null, - - /** - * Filename of the file being processed. Will be returned as a source - * attribute in the source map - */ - sourceMapFilename: 'source.js', - - /** - * Only when source map is used: last line in the source for which - * source map was generated - * @type {Number} - */ - sourceLine: 1, - - /** - * Only when source map is used: last line in the buffer for which - * source map was generated - * @type {Number} - */ - bufferLine: 1, - - /** - * The top-level Program AST for the original file. - */ - originalProgramAST: null, - - sourceColumn: 0, - bufferColumn: 0 - } - }; -} - -/** - * Updates a copy of a given state with "update" and returns an updated state. - * - * @param {object} state - * @param {object} update - * @return {object} - */ -function updateState(state, update) { - var ret = Object.create(state); - Object.keys(update).forEach(function(updatedKey) { - ret[updatedKey] = update[updatedKey]; - }); - return ret; -} - -/** - * Given a state fill the resulting buffer from the original source up to - * the end - * - * @param {number} end - * @param {object} state - * @param {?function} contentTransformer Optional callback to transform newly - * added content. - */ -function catchup(end, state, contentTransformer) { - if (end < state.g.position) { - // cannot move backwards - return; - } - var source = state.g.source.substring(state.g.position, end); - var transformed = updateIndent(source, state); - if (state.g.sourceMap && transformed) { - // record where we are - state.g.sourceMap.addMapping({ - generated: { line: state.g.bufferLine, column: state.g.bufferColumn }, - original: { line: state.g.sourceLine, column: state.g.sourceColumn }, - source: state.g.sourceMapFilename - }); - - // record line breaks in transformed source - var sourceLines = source.split('\n'); - var transformedLines = transformed.split('\n'); - // Add line break mappings between last known mapping and the end of the - // added piece. So for the code piece - // (foo, bar); - // > var x = 2; - // > var b = 3; - // var c = - // only add lines marked with ">": 2, 3. - for (var i = 1; i < sourceLines.length - 1; i++) { - state.g.sourceMap.addMapping({ - generated: { line: state.g.bufferLine, column: 0 }, - original: { line: state.g.sourceLine, column: 0 }, - source: state.g.sourceMapFilename - }); - state.g.sourceLine++; - state.g.bufferLine++; - } - // offset for the last piece - if (sourceLines.length > 1) { - state.g.sourceLine++; - state.g.bufferLine++; - state.g.sourceColumn = 0; - state.g.bufferColumn = 0; - } - state.g.sourceColumn += sourceLines[sourceLines.length - 1].length; - state.g.bufferColumn += - transformedLines[transformedLines.length - 1].length; - } - state.g.buffer += - contentTransformer ? contentTransformer(transformed) : transformed; - state.g.position = end; -} - -/** - * Returns original source for an AST node. - * @param {object} node - * @param {object} state - * @return {string} - */ -function getNodeSourceText(node, state) { - return state.g.source.substring(node.range[0], node.range[1]); -} - -function _replaceNonWhite(value) { - return value.replace(nonWhiteRegexp, ' '); -} - -/** - * Removes all non-whitespace characters - */ -function _stripNonWhite(value) { - return value.replace(nonWhiteRegexp, ''); -} - -/** - * Finds the position of the next instance of the specified syntactic char in - * the pending source. - * - * NOTE: This will skip instances of the specified char if they sit inside a - * comment body. - * - * NOTE: This function also assumes that the buffer's current position is not - * already within a comment or a string. This is rarely the case since all - * of the buffer-advancement utility methods tend to be used on syntactic - * nodes' range values -- but it's a small gotcha that's worth mentioning. - */ -function getNextSyntacticCharOffset(char, state) { - var pendingSource = state.g.source.substring(state.g.position); - var pendingSourceLines = pendingSource.split('\n'); - - var charOffset = 0; - var line; - var withinBlockComment = false; - var withinString = false; - lineLoop: while ((line = pendingSourceLines.shift()) !== undefined) { - var lineEndPos = charOffset + line.length; - charLoop: for (; charOffset < lineEndPos; charOffset++) { - var currChar = pendingSource[charOffset]; - if (currChar === '"' || currChar === '\'') { - withinString = !withinString; - continue charLoop; - } else if (withinString) { - continue charLoop; - } else if (charOffset + 1 < lineEndPos) { - var nextTwoChars = currChar + line[charOffset + 1]; - if (nextTwoChars === '//') { - charOffset = lineEndPos + 1; - continue lineLoop; - } else if (nextTwoChars === '/*') { - withinBlockComment = true; - charOffset += 1; - continue charLoop; - } else if (nextTwoChars === '*/') { - withinBlockComment = false; - charOffset += 1; - continue charLoop; - } - } - - if (!withinBlockComment && currChar === char) { - return charOffset + state.g.position; - } - } - - // Account for '\n' - charOffset++; - withinString = false; - } - - throw new Error('`' + char + '` not found!'); -} - -/** - * Catches up as `catchup` but replaces non-whitespace chars with spaces. - */ -function catchupWhiteOut(end, state) { - catchup(end, state, _replaceNonWhite); -} - -/** - * Catches up as `catchup` but removes all non-whitespace characters. - */ -function catchupWhiteSpace(end, state) { - catchup(end, state, _stripNonWhite); -} - -/** - * Removes all non-newline characters - */ -var reNonNewline = /[^\n]/g; -function stripNonNewline(value) { - return value.replace(reNonNewline, function() { - return ''; - }); -} - -/** - * Catches up as `catchup` but removes all non-newline characters. - * - * Equivalent to appending as many newlines as there are in the original source - * between the current position and `end`. - */ -function catchupNewlines(end, state) { - catchup(end, state, stripNonNewline); -} - - -/** - * Same as catchup but does not touch the buffer - * - * @param {number} end - * @param {object} state - */ -function move(end, state) { - // move the internal cursors - if (state.g.sourceMap) { - if (end < state.g.position) { - state.g.position = 0; - state.g.sourceLine = 1; - state.g.sourceColumn = 0; - } - - var source = state.g.source.substring(state.g.position, end); - var sourceLines = source.split('\n'); - if (sourceLines.length > 1) { - state.g.sourceLine += sourceLines.length - 1; - state.g.sourceColumn = 0; - } - state.g.sourceColumn += sourceLines[sourceLines.length - 1].length; - } - state.g.position = end; -} - -/** - * Appends a string of text to the buffer - * - * @param {string} str - * @param {object} state - */ -function append(str, state) { - if (state.g.sourceMap && str) { - state.g.sourceMap.addMapping({ - generated: { line: state.g.bufferLine, column: state.g.bufferColumn }, - original: { line: state.g.sourceLine, column: state.g.sourceColumn }, - source: state.g.sourceMapFilename - }); - var transformedLines = str.split('\n'); - if (transformedLines.length > 1) { - state.g.bufferLine += transformedLines.length - 1; - state.g.bufferColumn = 0; - } - state.g.bufferColumn += - transformedLines[transformedLines.length - 1].length; - } - state.g.buffer += str; -} - -/** - * Update indent using state.indentBy property. Indent is measured in - * double spaces. Updates a single line only. - * - * @param {string} str - * @param {object} state - * @return {string} - */ -function updateIndent(str, state) { - /*jshint -W004*/ - var indentBy = state.indentBy; - if (indentBy < 0) { - for (var i = 0; i < -indentBy; i++) { - str = str.replace(leadingIndentRegexp, '$1'); - } - } else { - for (var i = 0; i < indentBy; i++) { - str = str.replace(leadingIndentRegexp, '$1$2$2'); - } - } - return str; -} - -/** - * Calculates indent from the beginning of the line until "start" or the first - * character before start. - * @example - * " foo.bar()" - * ^ - * start - * indent will be " " - * - * @param {number} start - * @param {object} state - * @return {string} - */ -function indentBefore(start, state) { - var end = start; - start = start - 1; - - while (start > 0 && state.g.source[start] != '\n') { - if (!state.g.source[start].match(/[ \t]/)) { - end = start; - } - start--; - } - return state.g.source.substring(start + 1, end); -} - -function getDocblock(state) { - if (!state.g.docblock) { - var docblock = _dereq_('./docblock'); - state.g.docblock = - docblock.parseAsObject(docblock.extract(state.g.source)); - } - return state.g.docblock; -} - -function identWithinLexicalScope(identName, state, stopBeforeNode) { - var currScope = state.localScope; - while (currScope) { - if (currScope.identifiers[identName] !== undefined) { - return true; - } - - if (stopBeforeNode && currScope.parentNode === stopBeforeNode) { - break; - } - - currScope = currScope.parentScope; - } - return false; -} - -function identInLocalScope(identName, state) { - return state.localScope.identifiers[identName] !== undefined; -} - -/** - * @param {object} boundaryNode - * @param {?array} path - * @return {?object} node - */ -function initScopeMetadata(boundaryNode, path, node) { - return { - boundaryNode: boundaryNode, - bindingPath: path, - bindingNode: node - }; -} - -function declareIdentInLocalScope(identName, metaData, state) { - state.localScope.identifiers[identName] = { - boundaryNode: metaData.boundaryNode, - path: metaData.bindingPath, - node: metaData.bindingNode, - state: Object.create(state) - }; -} - -function getLexicalBindingMetadata(identName, state) { - var currScope = state.localScope; - while (currScope) { - if (currScope.identifiers[identName] !== undefined) { - return currScope.identifiers[identName]; - } - - currScope = currScope.parentScope; - } -} - -function getLocalBindingMetadata(identName, state) { - return state.localScope.identifiers[identName]; -} - -/** - * Apply the given analyzer function to the current node. If the analyzer - * doesn't return false, traverse each child of the current node using the given - * traverser function. - * - * @param {function} analyzer - * @param {function} traverser - * @param {object} node - * @param {array} path - * @param {object} state - */ -function analyzeAndTraverse(analyzer, traverser, node, path, state) { - if (node.type) { - if (analyzer(node, path, state) === false) { - return; - } - path.unshift(node); - } - - getOrderedChildren(node).forEach(function(child) { - traverser(child, path, state); - }); - - node.type && path.shift(); -} - -/** - * It is crucial that we traverse in order, or else catchup() on a later - * node that is processed out of order can move the buffer past a node - * that we haven't handled yet, preventing us from modifying that node. - * - * This can happen when a node has multiple properties containing children. - * For example, XJSElement nodes have `openingElement`, `closingElement` and - * `children`. If we traverse `openingElement`, then `closingElement`, then - * when we get to `children`, the buffer has already caught up to the end of - * the closing element, after the children. - * - * This is basically a Schwartzian transform. Collects an array of children, - * each one represented as [child, startIndex]; sorts the array by start - * index; then traverses the children in that order. - */ -function getOrderedChildren(node) { - var queue = []; - for (var key in node) { - if (node.hasOwnProperty(key)) { - enqueueNodeWithStartIndex(queue, node[key]); - } - } - queue.sort(function(a, b) { return a[1] - b[1]; }); - return queue.map(function(pair) { return pair[0]; }); -} - -/** - * Helper function for analyzeAndTraverse which queues up all of the children - * of the given node. - * - * Children can also be found in arrays, so we basically want to merge all of - * those arrays together so we can sort them and then traverse the children - * in order. - * - * One example is the Program node. It contains `body` and `comments`, both - * arrays. Lexographically, comments are interspersed throughout the body - * nodes, but esprima's AST groups them together. - */ -function enqueueNodeWithStartIndex(queue, node) { - if (typeof node !== 'object' || node === null) { - return; - } - if (node.range) { - queue.push([node, node.range[0]]); - } else if (Array.isArray(node)) { - for (var ii = 0; ii < node.length; ii++) { - enqueueNodeWithStartIndex(queue, node[ii]); - } - } -} - -/** - * Checks whether a node or any of its sub-nodes contains - * a syntactic construct of the passed type. - * @param {object} node - AST node to test. - * @param {string} type - node type to lookup. - */ -function containsChildOfType(node, type) { - return containsChildMatching(node, function(node) { - return node.type === type; - }); -} - -function containsChildMatching(node, matcher) { - var foundMatchingChild = false; - function nodeTypeAnalyzer(node) { - if (matcher(node) === true) { - foundMatchingChild = true; - return false; - } - } - function nodeTypeTraverser(child, path, state) { - if (!foundMatchingChild) { - foundMatchingChild = containsChildMatching(child, matcher); - } - } - analyzeAndTraverse( - nodeTypeAnalyzer, - nodeTypeTraverser, - node, - [] - ); - return foundMatchingChild; -} - -var scopeTypes = {}; -scopeTypes[Syntax.ArrowFunctionExpression] = true; -scopeTypes[Syntax.FunctionExpression] = true; -scopeTypes[Syntax.FunctionDeclaration] = true; -scopeTypes[Syntax.Program] = true; - -function getBoundaryNode(path) { - for (var ii = 0; ii < path.length; ++ii) { - if (scopeTypes[path[ii].type]) { - return path[ii]; - } - } - throw new Error( - 'Expected to find a node with one of the following types in path:\n' + - JSON.stringify(Object.keys(scopeTypes)) - ); -} - -function getTempVar(tempVarIndex) { - return '$__' + tempVarIndex; -} - -function injectTempVar(state) { - var tempVar = '$__' + (state.localScope.tempVarIndex++); - state.localScope.tempVars.push(tempVar); - return tempVar; -} - -function injectTempVarDeclarations(state, index) { - if (state.localScope.tempVars.length) { - state.g.buffer = - state.g.buffer.slice(0, index) + - 'var ' + state.localScope.tempVars.join(', ') + ';' + - state.g.buffer.slice(index); - state.localScope.tempVars = []; - } -} - -exports.analyzeAndTraverse = analyzeAndTraverse; -exports.append = append; -exports.catchup = catchup; -exports.catchupNewlines = catchupNewlines; -exports.catchupWhiteOut = catchupWhiteOut; -exports.catchupWhiteSpace = catchupWhiteSpace; -exports.containsChildMatching = containsChildMatching; -exports.containsChildOfType = containsChildOfType; -exports.createState = createState; -exports.declareIdentInLocalScope = declareIdentInLocalScope; -exports.getBoundaryNode = getBoundaryNode; -exports.getDocblock = getDocblock; -exports.getLexicalBindingMetadata = getLexicalBindingMetadata; -exports.getLocalBindingMetadata = getLocalBindingMetadata; -exports.getNextSyntacticCharOffset = getNextSyntacticCharOffset; -exports.getNodeSourceText = getNodeSourceText; -exports.getOrderedChildren = getOrderedChildren; -exports.getTempVar = getTempVar; -exports.identInLocalScope = identInLocalScope; -exports.identWithinLexicalScope = identWithinLexicalScope; -exports.indentBefore = indentBefore; -exports.initScopeMetadata = initScopeMetadata; -exports.injectTempVar = injectTempVar; -exports.injectTempVarDeclarations = injectTempVarDeclarations; -exports.move = move; -exports.scopeTypes = scopeTypes; -exports.updateIndent = updateIndent; -exports.updateState = updateState; - -},{"./docblock":21,"esprima-fb":9}],24:[function(_dereq_,module,exports){ -/** - * Copyright 2013 Facebook, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*global exports:true*/ - -/** - * Desugars ES6 Arrow functions to ES3 function expressions. - * If the function contains `this` expression -- automatically - * binds the function to current value of `this`. - * - * Single parameter, simple expression: - * - * [1, 2, 3].map(x => x * x); - * - * [1, 2, 3].map(function(x) { return x * x; }); - * - * Several parameters, complex block: - * - * this.users.forEach((user, idx) => { - * return this.isActive(idx) && this.send(user); - * }); - * - * this.users.forEach(function(user, idx) { - * return this.isActive(idx) && this.send(user); - * }.bind(this)); - * - */ -var restParamVisitors = _dereq_('./es6-rest-param-visitors'); -var destructuringVisitors = _dereq_('./es6-destructuring-visitors'); - -var Syntax = _dereq_('esprima-fb').Syntax; -var utils = _dereq_('../src/utils'); - -/** - * @public - */ -function visitArrowFunction(traverse, node, path, state) { - var notInExpression = (path[0].type === Syntax.ExpressionStatement); - - // Wrap a function into a grouping operator, if it's not - // in the expression position. - if (notInExpression) { - utils.append('(', state); - } - - utils.append('function', state); - renderParams(traverse, node, path, state); - - // Skip arrow. - utils.catchupWhiteSpace(node.body.range[0], state); - - var renderBody = node.body.type == Syntax.BlockStatement - ? renderStatementBody - : renderExpressionBody; - - path.unshift(node); - renderBody(traverse, node, path, state); - path.shift(); - - // Bind the function only if `this` value is used - // inside it or inside any sub-expression. - var containsBindingSyntax = - utils.containsChildMatching(node.body, function(node) { - return node.type === Syntax.ThisExpression - || (node.type === Syntax.Identifier - && node.name === "super"); - }); - - if (containsBindingSyntax) { - utils.append('.bind(this)', state); - } - - utils.catchupWhiteSpace(node.range[1], state); - - // Close wrapper if not in the expression. - if (notInExpression) { - utils.append(')', state); - } - - return false; -} - -function renderParams(traverse, node, path, state) { - // To preserve inline typechecking directives, we - // distinguish between parens-free and paranthesized single param. - if (isParensFreeSingleParam(node, state) || !node.params.length) { - utils.append('(', state); - } - if (node.params.length !== 0) { - path.unshift(node); - traverse(node.params, path, state); - path.unshift(); - } - utils.append(')', state); -} - -function isParensFreeSingleParam(node, state) { - return node.params.length === 1 && - state.g.source[state.g.position] !== '('; -} - -function renderExpressionBody(traverse, node, path, state) { - // Wrap simple expression bodies into a block - // with explicit return statement. - utils.append('{', state); - - // Special handling of rest param. - if (node.rest) { - utils.append( - restParamVisitors.renderRestParamSetup(node, state), - state - ); - } - - // Special handling of destructured params. - destructuringVisitors.renderDestructuredComponents( - node, - utils.updateState(state, { - localScope: { - parentNode: state.parentNode, - parentScope: state.parentScope, - identifiers: state.identifiers, - tempVarIndex: 0 - } - }) - ); - - utils.append('return ', state); - renderStatementBody(traverse, node, path, state); - utils.append(';}', state); -} - -function renderStatementBody(traverse, node, path, state) { - traverse(node.body, path, state); - utils.catchup(node.body.range[1], state); -} - -visitArrowFunction.test = function(node, path, state) { - return node.type === Syntax.ArrowFunctionExpression; -}; - -exports.visitorList = [ - visitArrowFunction -]; - - -},{"../src/utils":23,"./es6-destructuring-visitors":27,"./es6-rest-param-visitors":30,"esprima-fb":9}],25:[function(_dereq_,module,exports){ -/** - * Copyright 2004-present Facebook. All Rights Reserved. - */ -/*global exports:true*/ - -/** - * Implements ES6 call spread. - * - * instance.method(a, b, c, ...d) - * - * instance.method.apply(instance, [a, b, c].concat(d)) - * - */ - -var Syntax = _dereq_('esprima-fb').Syntax; -var utils = _dereq_('../src/utils'); - -function process(traverse, node, path, state) { - utils.move(node.range[0], state); - traverse(node, path, state); - utils.catchup(node.range[1], state); -} - -function visitCallSpread(traverse, node, path, state) { - utils.catchup(node.range[0], state); - - if (node.type === Syntax.NewExpression) { - // Input = new Set(1, 2, ...list) - // Output = new (Function.prototype.bind.apply(Set, [null, 1, 2].concat(list))) - utils.append('new (Function.prototype.bind.apply(', state); - process(traverse, node.callee, path, state); - } else if (node.callee.type === Syntax.MemberExpression) { - // Input = get().fn(1, 2, ...more) - // Output = (_ = get()).fn.apply(_, [1, 2].apply(more)) - var tempVar = utils.injectTempVar(state); - utils.append('(' + tempVar + ' = ', state); - process(traverse, node.callee.object, path, state); - utils.append(')', state); - if (node.callee.property.type === Syntax.Identifier) { - utils.append('.', state); - process(traverse, node.callee.property, path, state); - } else { - utils.append('[', state); - process(traverse, node.callee.property, path, state); - utils.append(']', state); - } - utils.append('.apply(' + tempVar, state); - } else { - // Input = max(1, 2, ...list) - // Output = max.apply(null, [1, 2].concat(list)) - var needsToBeWrappedInParenthesis = - node.callee.type === Syntax.FunctionDeclaration || - node.callee.type === Syntax.FunctionExpression; - if (needsToBeWrappedInParenthesis) { - utils.append('(', state); - } - process(traverse, node.callee, path, state); - if (needsToBeWrappedInParenthesis) { - utils.append(')', state); - } - utils.append('.apply(null', state); - } - utils.append(', ', state); - - var args = node.arguments.slice(); - var spread = args.pop(); - if (args.length || node.type === Syntax.NewExpression) { - utils.append('[', state); - if (node.type === Syntax.NewExpression) { - utils.append('null' + (args.length ? ', ' : ''), state); - } - while (args.length) { - var arg = args.shift(); - utils.move(arg.range[0], state); - traverse(arg, path, state); - if (args.length) { - utils.catchup(args[0].range[0], state); - } else { - utils.catchup(arg.range[1], state); - } - } - utils.append('].concat(', state); - process(traverse, spread.argument, path, state); - utils.append(')', state); - } else { - process(traverse, spread.argument, path, state); - } - utils.append(node.type === Syntax.NewExpression ? '))' : ')', state); - - utils.move(node.range[1], state); - return false; -} - -visitCallSpread.test = function(node, path, state) { - return ( - ( - node.type === Syntax.CallExpression || - node.type === Syntax.NewExpression - ) && - node.arguments.length > 0 && - node.arguments[node.arguments.length - 1].type === Syntax.SpreadElement - ); -}; - -exports.visitorList = [ - visitCallSpread -]; - -},{"../src/utils":23,"esprima-fb":9}],26:[function(_dereq_,module,exports){ -/** - * Copyright 2013 Facebook, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*jslint node:true*/ - -/** - * @typechecks - */ -'use strict'; - -var base62 = _dereq_('base62'); -var Syntax = _dereq_('esprima-fb').Syntax; -var utils = _dereq_('../src/utils'); -var reservedWordsHelper = _dereq_('./reserved-words-helper'); - -var declareIdentInLocalScope = utils.declareIdentInLocalScope; -var initScopeMetadata = utils.initScopeMetadata; - -var SUPER_PROTO_IDENT_PREFIX = '____SuperProtoOf'; - -var _anonClassUUIDCounter = 0; -var _mungedSymbolMaps = {}; - -function resetSymbols() { - _anonClassUUIDCounter = 0; - _mungedSymbolMaps = {}; -} - -/** - * Used to generate a unique class for use with code-gens for anonymous class - * expressions. - * - * @param {object} state - * @return {string} - */ -function _generateAnonymousClassName(state) { - var mungeNamespace = state.mungeNamespace || ''; - return '____Class' + mungeNamespace + base62.encode(_anonClassUUIDCounter++); -} - -/** - * Given an identifier name, munge it using the current state's mungeNamespace. - * - * @param {string} identName - * @param {object} state - * @return {string} - */ -function _getMungedName(identName, state) { - var mungeNamespace = state.mungeNamespace; - var shouldMinify = state.g.opts.minify; - - if (shouldMinify) { - if (!_mungedSymbolMaps[mungeNamespace]) { - _mungedSymbolMaps[mungeNamespace] = { - symbolMap: {}, - identUUIDCounter: 0 - }; - } - - var symbolMap = _mungedSymbolMaps[mungeNamespace].symbolMap; - if (!symbolMap[identName]) { - symbolMap[identName] = - base62.encode(_mungedSymbolMaps[mungeNamespace].identUUIDCounter++); - } - identName = symbolMap[identName]; - } - return '$' + mungeNamespace + identName; -} - -/** - * Extracts super class information from a class node. - * - * Information includes name of the super class and/or the expression string - * (if extending from an expression) - * - * @param {object} node - * @param {object} state - * @return {object} - */ -function _getSuperClassInfo(node, state) { - var ret = { - name: null, - expression: null - }; - if (node.superClass) { - if (node.superClass.type === Syntax.Identifier) { - ret.name = node.superClass.name; - } else { - // Extension from an expression - ret.name = _generateAnonymousClassName(state); - ret.expression = state.g.source.substring( - node.superClass.range[0], - node.superClass.range[1] - ); - } - } - return ret; -} - -/** - * Used with .filter() to find the constructor method in a list of - * MethodDefinition nodes. - * - * @param {object} classElement - * @return {boolean} - */ -function _isConstructorMethod(classElement) { - return classElement.type === Syntax.MethodDefinition && - classElement.key.type === Syntax.Identifier && - classElement.key.name === 'constructor'; -} - -/** - * @param {object} node - * @param {object} state - * @return {boolean} - */ -function _shouldMungeIdentifier(node, state) { - return ( - !!state.methodFuncNode && - !utils.getDocblock(state).hasOwnProperty('preventMunge') && - /^_(?!_)/.test(node.name) - ); -} - -/** - * @param {function} traverse - * @param {object} node - * @param {array} path - * @param {object} state - */ -function visitClassMethod(traverse, node, path, state) { - if (!state.g.opts.es5 && (node.kind === 'get' || node.kind === 'set')) { - throw new Error( - 'This transform does not support ' + node.kind + 'ter methods for ES6 ' + - 'classes. (line: ' + node.loc.start.line + ', col: ' + - node.loc.start.column + ')' - ); - } - state = utils.updateState(state, { - methodNode: node - }); - utils.catchup(node.range[0], state); - path.unshift(node); - traverse(node.value, path, state); - path.shift(); - return false; -} -visitClassMethod.test = function(node, path, state) { - return node.type === Syntax.MethodDefinition; -}; - -/** - * @param {function} traverse - * @param {object} node - * @param {array} path - * @param {object} state - */ -function visitClassFunctionExpression(traverse, node, path, state) { - var methodNode = path[0]; - var isGetter = methodNode.kind === 'get'; - var isSetter = methodNode.kind === 'set'; - - state = utils.updateState(state, { - methodFuncNode: node - }); - - if (methodNode.key.name === 'constructor') { - utils.append('function ' + state.className, state); - } else { - var methodAccessorComputed = false; - var methodAccessor; - var prototypeOrStatic = methodNode["static"] ? '' : '.prototype'; - var objectAccessor = state.className + prototypeOrStatic; - - if (methodNode.key.type === Syntax.Identifier) { - // foo() {} - methodAccessor = methodNode.key.name; - if (_shouldMungeIdentifier(methodNode.key, state)) { - methodAccessor = _getMungedName(methodAccessor, state); - } - if (isGetter || isSetter) { - methodAccessor = JSON.stringify(methodAccessor); - } else if (reservedWordsHelper.isReservedWord(methodAccessor)) { - methodAccessorComputed = true; - methodAccessor = JSON.stringify(methodAccessor); - } - } else if (methodNode.key.type === Syntax.Literal) { - // 'foo bar'() {} | get 'foo bar'() {} | set 'foo bar'() {} - methodAccessor = JSON.stringify(methodNode.key.value); - methodAccessorComputed = true; - } - - if (isSetter || isGetter) { - utils.append( - 'Object.defineProperty(' + - objectAccessor + ',' + - methodAccessor + ',' + - '{configurable:true,' + - methodNode.kind + ':function', - state - ); - } else { - if (state.g.opts.es3) { - if (methodAccessorComputed) { - methodAccessor = '[' + methodAccessor + ']'; - } else { - methodAccessor = '.' + methodAccessor; - } - utils.append( - objectAccessor + - methodAccessor + '=function' + (node.generator ? '*' : ''), - state - ); - } else { - if (!methodAccessorComputed) { - methodAccessor = JSON.stringify(methodAccessor); - } - utils.append( - 'Object.defineProperty(' + - objectAccessor + ',' + - methodAccessor + ',' + - '{writable:true,configurable:true,' + - 'value:function' + (node.generator ? '*' : ''), - state - ); - } - } - } - utils.move(methodNode.key.range[1], state); - utils.append('(', state); - - var params = node.params; - if (params.length > 0) { - utils.catchupNewlines(params[0].range[0], state); - for (var i = 0; i < params.length; i++) { - utils.catchup(node.params[i].range[0], state); - path.unshift(node); - traverse(params[i], path, state); - path.shift(); - } - } - - var closingParenPosition = utils.getNextSyntacticCharOffset(')', state); - utils.catchupWhiteSpace(closingParenPosition, state); - - var openingBracketPosition = utils.getNextSyntacticCharOffset('{', state); - utils.catchup(openingBracketPosition + 1, state); - - if (!state.scopeIsStrict) { - utils.append('"use strict";', state); - state = utils.updateState(state, { - scopeIsStrict: true - }); - } - utils.move(node.body.range[0] + '{'.length, state); - - path.unshift(node); - traverse(node.body, path, state); - path.shift(); - utils.catchup(node.body.range[1], state); - - if (methodNode.key.name !== 'constructor') { - if (isGetter || isSetter || !state.g.opts.es3) { - utils.append('})', state); - } - utils.append(';', state); - } - return false; -} -visitClassFunctionExpression.test = function(node, path, state) { - return node.type === Syntax.FunctionExpression - && path[0].type === Syntax.MethodDefinition; -}; - -function visitClassMethodParam(traverse, node, path, state) { - var paramName = node.name; - if (_shouldMungeIdentifier(node, state)) { - paramName = _getMungedName(node.name, state); - } - utils.append(paramName, state); - utils.move(node.range[1], state); -} -visitClassMethodParam.test = function(node, path, state) { - if (!path[0] || !path[1]) { - return; - } - - var parentFuncExpr = path[0]; - var parentClassMethod = path[1]; - - return parentFuncExpr.type === Syntax.FunctionExpression - && parentClassMethod.type === Syntax.MethodDefinition - && node.type === Syntax.Identifier; -}; - -/** - * @param {function} traverse - * @param {object} node - * @param {array} path - * @param {object} state - */ -function _renderClassBody(traverse, node, path, state) { - var className = state.className; - var superClass = state.superClass; - - // Set up prototype of constructor on same line as `extends` for line-number - // preservation. This relies on function-hoisting if a constructor function is - // defined in the class body. - if (superClass.name) { - // If the super class is an expression, we need to memoize the output of the - // expression into the generated class name variable and use that to refer - // to the super class going forward. Example: - // - // class Foo extends mixin(Bar, Baz) {} - // --transforms to-- - // function Foo() {} var ____Class0Blah = mixin(Bar, Baz); - if (superClass.expression !== null) { - utils.append( - 'var ' + superClass.name + '=' + superClass.expression + ';', - state - ); - } - - var keyName = superClass.name + '____Key'; - var keyNameDeclarator = ''; - if (!utils.identWithinLexicalScope(keyName, state)) { - keyNameDeclarator = 'var '; - declareIdentInLocalScope(keyName, initScopeMetadata(node), state); - } - utils.append( - 'for(' + keyNameDeclarator + keyName + ' in ' + superClass.name + '){' + - 'if(' + superClass.name + '.hasOwnProperty(' + keyName + ')){' + - className + '[' + keyName + ']=' + - superClass.name + '[' + keyName + '];' + - '}' + - '}', - state - ); - - var superProtoIdentStr = SUPER_PROTO_IDENT_PREFIX + superClass.name; - if (!utils.identWithinLexicalScope(superProtoIdentStr, state)) { - utils.append( - 'var ' + superProtoIdentStr + '=' + superClass.name + '===null?' + - 'null:' + superClass.name + '.prototype;', - state - ); - declareIdentInLocalScope(superProtoIdentStr, initScopeMetadata(node), state); - } - - utils.append( - className + '.prototype=Object.create(' + superProtoIdentStr + ');', - state - ); - utils.append( - className + '.prototype.constructor=' + className + ';', - state - ); - utils.append( - className + '.__superConstructor__=' + superClass.name + ';', - state - ); - } - - // If there's no constructor method specified in the class body, create an - // empty constructor function at the top (same line as the class keyword) - if (!node.body.body.filter(_isConstructorMethod).pop()) { - utils.append('function ' + className + '(){', state); - if (!state.scopeIsStrict) { - utils.append('"use strict";', state); - } - if (superClass.name) { - utils.append( - 'if(' + superClass.name + '!==null){' + - superClass.name + '.apply(this,arguments);}', - state - ); - } - utils.append('}', state); - } - - utils.move(node.body.range[0] + '{'.length, state); - traverse(node.body, path, state); - utils.catchupWhiteSpace(node.range[1], state); -} - -/** - * @param {function} traverse - * @param {object} node - * @param {array} path - * @param {object} state - */ -function visitClassDeclaration(traverse, node, path, state) { - var className = node.id.name; - var superClass = _getSuperClassInfo(node, state); - - state = utils.updateState(state, { - mungeNamespace: className, - className: className, - superClass: superClass - }); - - _renderClassBody(traverse, node, path, state); - - return false; -} -visitClassDeclaration.test = function(node, path, state) { - return node.type === Syntax.ClassDeclaration; -}; - -/** - * @param {function} traverse - * @param {object} node - * @param {array} path - * @param {object} state - */ -function visitClassExpression(traverse, node, path, state) { - var className = node.id && node.id.name || _generateAnonymousClassName(state); - var superClass = _getSuperClassInfo(node, state); - - utils.append('(function(){', state); - - state = utils.updateState(state, { - mungeNamespace: className, - className: className, - superClass: superClass - }); - - _renderClassBody(traverse, node, path, state); - - utils.append('return ' + className + ';})()', state); - return false; -} -visitClassExpression.test = function(node, path, state) { - return node.type === Syntax.ClassExpression; -}; - -/** - * @param {function} traverse - * @param {object} node - * @param {array} path - * @param {object} state - */ -function visitPrivateIdentifier(traverse, node, path, state) { - utils.append(_getMungedName(node.name, state), state); - utils.move(node.range[1], state); -} -visitPrivateIdentifier.test = function(node, path, state) { - if (node.type === Syntax.Identifier && _shouldMungeIdentifier(node, state)) { - // Always munge non-computed properties of MemberExpressions - // (a la preventing access of properties of unowned objects) - if (path[0].type === Syntax.MemberExpression && path[0].object !== node - && path[0].computed === false) { - return true; - } - - // Always munge identifiers that were declared within the method function - // scope - if (utils.identWithinLexicalScope(node.name, state, state.methodFuncNode)) { - return true; - } - - // Always munge private keys on object literals defined within a method's - // scope. - if (path[0].type === Syntax.Property - && path[1].type === Syntax.ObjectExpression) { - return true; - } - - // Always munge function parameters - if (path[0].type === Syntax.FunctionExpression - || path[0].type === Syntax.FunctionDeclaration - || path[0].type === Syntax.ArrowFunctionExpression) { - for (var i = 0; i < path[0].params.length; i++) { - if (path[0].params[i] === node) { - return true; - } - } - } - } - return false; -}; - -/** - * @param {function} traverse - * @param {object} node - * @param {array} path - * @param {object} state - */ -function visitSuperCallExpression(traverse, node, path, state) { - var superClassName = state.superClass.name; - - if (node.callee.type === Syntax.Identifier) { - if (_isConstructorMethod(state.methodNode)) { - utils.append(superClassName + '.call(', state); - } else { - var protoProp = SUPER_PROTO_IDENT_PREFIX + superClassName; - if (state.methodNode.key.type === Syntax.Identifier) { - protoProp += '.' + state.methodNode.key.name; - } else if (state.methodNode.key.type === Syntax.Literal) { - protoProp += '[' + JSON.stringify(state.methodNode.key.value) + ']'; - } - utils.append(protoProp + ".call(", state); - } - utils.move(node.callee.range[1], state); - } else if (node.callee.type === Syntax.MemberExpression) { - utils.append(SUPER_PROTO_IDENT_PREFIX + superClassName, state); - utils.move(node.callee.object.range[1], state); - - if (node.callee.computed) { - // ["a" + "b"] - utils.catchup(node.callee.property.range[1] + ']'.length, state); - } else { - // .ab - utils.append('.' + node.callee.property.name, state); - } - - utils.append('.call(', state); - utils.move(node.callee.range[1], state); - } - - utils.append('this', state); - if (node.arguments.length > 0) { - utils.append(',', state); - utils.catchupWhiteSpace(node.arguments[0].range[0], state); - traverse(node.arguments, path, state); - } - - utils.catchupWhiteSpace(node.range[1], state); - utils.append(')', state); - return false; -} -visitSuperCallExpression.test = function(node, path, state) { - if (state.superClass && node.type === Syntax.CallExpression) { - var callee = node.callee; - if (callee.type === Syntax.Identifier && callee.name === 'super' - || callee.type == Syntax.MemberExpression - && callee.object.name === 'super') { - return true; - } - } - return false; -}; - -/** - * @param {function} traverse - * @param {object} node - * @param {array} path - * @param {object} state - */ -function visitSuperMemberExpression(traverse, node, path, state) { - var superClassName = state.superClass.name; - - utils.append(SUPER_PROTO_IDENT_PREFIX + superClassName, state); - utils.move(node.object.range[1], state); -} -visitSuperMemberExpression.test = function(node, path, state) { - return state.superClass - && node.type === Syntax.MemberExpression - && node.object.type === Syntax.Identifier - && node.object.name === 'super'; -}; - -exports.resetSymbols = resetSymbols; - -exports.visitorList = [ - visitClassDeclaration, - visitClassExpression, - visitClassFunctionExpression, - visitClassMethod, - visitClassMethodParam, - visitPrivateIdentifier, - visitSuperCallExpression, - visitSuperMemberExpression -]; - -},{"../src/utils":23,"./reserved-words-helper":34,"base62":10,"esprima-fb":9}],27:[function(_dereq_,module,exports){ -/** - * Copyright 2014 Facebook, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/*global exports:true*/ - -/** - * Implements ES6 destructuring assignment and pattern matchng. - * - * function init({port, ip, coords: [x, y]}) { - * return (x && y) ? {id, port} : {ip}; - * }; - * - * function init($__0) { - * var - * port = $__0.port, - * ip = $__0.ip, - * $__1 = $__0.coords, - * x = $__1[0], - * y = $__1[1]; - * return (x && y) ? {id, port} : {ip}; - * } - * - * var x, {ip, port} = init({ip, port}); - * - * var x, $__0 = init({ip, port}), ip = $__0.ip, port = $__0.port; - * - */ -var Syntax = _dereq_('esprima-fb').Syntax; -var utils = _dereq_('../src/utils'); - -var reservedWordsHelper = _dereq_('./reserved-words-helper'); -var restParamVisitors = _dereq_('./es6-rest-param-visitors'); -var restPropertyHelpers = _dereq_('./es7-rest-property-helpers'); - -// ------------------------------------------------------- -// 1. Structured variable declarations. -// -// var [a, b] = [b, a]; -// var {x, y} = {y, x}; -// ------------------------------------------------------- - -function visitStructuredVariable(traverse, node, path, state) { - // Allocate new temp for the pattern. - utils.append(utils.getTempVar(state.localScope.tempVarIndex) + '=', state); - // Skip the pattern and assign the init to the temp. - utils.catchupWhiteSpace(node.init.range[0], state); - traverse(node.init, path, state); - utils.catchup(node.init.range[1], state); - // Render the destructured data. - utils.append(',' + getDestructuredComponents(node.id, state), state); - state.localScope.tempVarIndex++; - return false; -} - -visitStructuredVariable.test = function(node, path, state) { - return node.type === Syntax.VariableDeclarator && - isStructuredPattern(node.id); -}; - -function isStructuredPattern(node) { - return node.type === Syntax.ObjectPattern || - node.type === Syntax.ArrayPattern; -} - -// Main function which does actual recursive destructuring -// of nested complex structures. -function getDestructuredComponents(node, state) { - var tmpIndex = state.localScope.tempVarIndex; - var components = []; - var patternItems = getPatternItems(node); - - for (var idx = 0; idx < patternItems.length; idx++) { - var item = patternItems[idx]; - if (!item) { - continue; - } - - if (item.type === Syntax.SpreadElement) { - // Spread/rest of an array. - // TODO(dmitrys): support spread in the middle of a pattern - // and also for function param patterns: [x, ...xs, y] - components.push(item.argument.name + - '=Array.prototype.slice.call(' + - utils.getTempVar(tmpIndex) + ',' + idx + ')' - ); - continue; - } - - if (item.type === Syntax.SpreadProperty) { - var restExpression = restPropertyHelpers.renderRestExpression( - utils.getTempVar(tmpIndex), - patternItems - ); - components.push(item.argument.name + '=' + restExpression); - continue; - } - - // Depending on pattern type (Array or Object), we get - // corresponding pattern item parts. - var accessor = getPatternItemAccessor(node, item, tmpIndex, idx); - var value = getPatternItemValue(node, item); - - // TODO(dmitrys): implement default values: {x, y=5} - if (value.type === Syntax.Identifier) { - // Simple pattern item. - components.push(value.name + '=' + accessor); - } else { - // Complex sub-structure. - components.push( - utils.getTempVar(++state.localScope.tempVarIndex) + '=' + accessor + - ',' + getDestructuredComponents(value, state) - ); - } - } - - return components.join(','); -} - -function getPatternItems(node) { - return node.properties || node.elements; -} - -function getPatternItemAccessor(node, patternItem, tmpIndex, idx) { - var tmpName = utils.getTempVar(tmpIndex); - if (node.type === Syntax.ObjectPattern) { - if (reservedWordsHelper.isReservedWord(patternItem.key.name)) { - return tmpName + '["' + patternItem.key.name + '"]'; - } else if (patternItem.key.type === Syntax.Literal) { - return tmpName + '[' + JSON.stringify(patternItem.key.value) + ']'; - } else if (patternItem.key.type === Syntax.Identifier) { - return tmpName + '.' + patternItem.key.name; - } - } else if (node.type === Syntax.ArrayPattern) { - return tmpName + '[' + idx + ']'; - } -} - -function getPatternItemValue(node, patternItem) { - return node.type === Syntax.ObjectPattern - ? patternItem.value - : patternItem; -} - -// ------------------------------------------------------- -// 2. Assignment expression. -// -// [a, b] = [b, a]; -// ({x, y} = {y, x}); -// ------------------------------------------------------- - -function visitStructuredAssignment(traverse, node, path, state) { - var exprNode = node.expression; - utils.append('var ' + utils.getTempVar(state.localScope.tempVarIndex) + '=', state); - - utils.catchupWhiteSpace(exprNode.right.range[0], state); - traverse(exprNode.right, path, state); - utils.catchup(exprNode.right.range[1], state); - - utils.append( - ';' + getDestructuredComponents(exprNode.left, state) + ';', - state - ); - - utils.catchupWhiteSpace(node.range[1], state); - state.localScope.tempVarIndex++; - return false; -} - -visitStructuredAssignment.test = function(node, path, state) { - // We consider the expression statement rather than just assignment - // expression to cover case with object patters which should be - // wrapped in grouping operator: ({x, y} = {y, x}); - return node.type === Syntax.ExpressionStatement && - node.expression.type === Syntax.AssignmentExpression && - isStructuredPattern(node.expression.left); -}; - -// ------------------------------------------------------- -// 3. Structured parameter. -// -// function foo({x, y}) { ... } -// ------------------------------------------------------- - -function visitStructuredParameter(traverse, node, path, state) { - utils.append(utils.getTempVar(getParamIndex(node, path)), state); - utils.catchupWhiteSpace(node.range[1], state); - return true; -} - -function getParamIndex(paramNode, path) { - var funcNode = path[0]; - var tmpIndex = 0; - for (var k = 0; k < funcNode.params.length; k++) { - var param = funcNode.params[k]; - if (param === paramNode) { - break; - } - if (isStructuredPattern(param)) { - tmpIndex++; - } - } - return tmpIndex; -} - -visitStructuredParameter.test = function(node, path, state) { - return isStructuredPattern(node) && isFunctionNode(path[0]); -}; - -function isFunctionNode(node) { - return (node.type == Syntax.FunctionDeclaration || - node.type == Syntax.FunctionExpression || - node.type == Syntax.MethodDefinition || - node.type == Syntax.ArrowFunctionExpression); -} - -// ------------------------------------------------------- -// 4. Function body for structured parameters. -// -// function foo({x, y}) { x; y; } -// ------------------------------------------------------- - -function visitFunctionBodyForStructuredParameter(traverse, node, path, state) { - var funcNode = path[0]; - - utils.catchup(funcNode.body.range[0] + 1, state); - renderDestructuredComponents(funcNode, state); - - if (funcNode.rest) { - utils.append( - restParamVisitors.renderRestParamSetup(funcNode, state), - state - ); - } - - return true; -} - -function renderDestructuredComponents(funcNode, state) { - var destructuredComponents = []; - - for (var k = 0; k < funcNode.params.length; k++) { - var param = funcNode.params[k]; - if (isStructuredPattern(param)) { - destructuredComponents.push( - getDestructuredComponents(param, state) - ); - state.localScope.tempVarIndex++; - } - } - - if (destructuredComponents.length) { - utils.append('var ' + destructuredComponents.join(',') + ';', state); - } -} - -visitFunctionBodyForStructuredParameter.test = function(node, path, state) { - return node.type === Syntax.BlockStatement && isFunctionNode(path[0]); -}; - -exports.visitorList = [ - visitStructuredVariable, - visitStructuredAssignment, - visitStructuredParameter, - visitFunctionBodyForStructuredParameter -]; - -exports.renderDestructuredComponents = renderDestructuredComponents; - - -},{"../src/utils":23,"./es6-rest-param-visitors":30,"./es7-rest-property-helpers":32,"./reserved-words-helper":34,"esprima-fb":9}],28:[function(_dereq_,module,exports){ -/** - * Copyright 2013 Facebook, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*jslint node:true*/ - -/** - * Desugars concise methods of objects to function expressions. - * - * var foo = { - * method(x, y) { ... } - * }; - * - * var foo = { - * method: function(x, y) { ... } - * }; - * - */ - -var Syntax = _dereq_('esprima-fb').Syntax; -var utils = _dereq_('../src/utils'); -var reservedWordsHelper = _dereq_('./reserved-words-helper'); - -function visitObjectConciseMethod(traverse, node, path, state) { - var isGenerator = node.value.generator; - if (isGenerator) { - utils.catchupWhiteSpace(node.range[0] + 1, state); - } - if (node.computed) { // []() { ...} - utils.catchup(node.key.range[1] + 1, state); - } else if (reservedWordsHelper.isReservedWord(node.key.name)) { - utils.catchup(node.key.range[0], state); - utils.append('"', state); - utils.catchup(node.key.range[1], state); - utils.append('"', state); - } - - utils.catchup(node.key.range[1], state); - utils.append( - ':function' + (isGenerator ? '*' : ''), - state - ); - path.unshift(node); - traverse(node.value, path, state); - path.shift(); - return false; -} - -visitObjectConciseMethod.test = function(node, path, state) { - return node.type === Syntax.Property && - node.value.type === Syntax.FunctionExpression && - node.method === true; -}; - -exports.visitorList = [ - visitObjectConciseMethod -]; - -},{"../src/utils":23,"./reserved-words-helper":34,"esprima-fb":9}],29:[function(_dereq_,module,exports){ -/** - * Copyright 2013 Facebook, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*jslint node: true*/ - -/** - * Desugars ES6 Object Literal short notations into ES3 full notation. - * - * // Easier return values. - * function foo(x, y) { - * return {x, y}; // {x: x, y: y} - * }; - * - * // Destructuring. - * function init({port, ip, coords: {x, y}}) { ... } - * - */ -var Syntax = _dereq_('esprima-fb').Syntax; -var utils = _dereq_('../src/utils'); - -/** - * @public - */ -function visitObjectLiteralShortNotation(traverse, node, path, state) { - utils.catchup(node.key.range[1], state); - utils.append(':' + node.key.name, state); - return false; -} - -visitObjectLiteralShortNotation.test = function(node, path, state) { - return node.type === Syntax.Property && - node.kind === 'init' && - node.shorthand === true && - path[0].type !== Syntax.ObjectPattern; -}; - -exports.visitorList = [ - visitObjectLiteralShortNotation -]; - - -},{"../src/utils":23,"esprima-fb":9}],30:[function(_dereq_,module,exports){ -/** - * Copyright 2013 Facebook, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*jslint node:true*/ - -/** - * Desugars ES6 rest parameters into an ES3 arguments array. - * - * function printf(template, ...args) { - * args.forEach(...); - * } - * - * We could use `Array.prototype.slice.call`, but that usage of arguments causes - * functions to be deoptimized in V8, so instead we use a for-loop. - * - * function printf(template) { - * for (var args = [], $__0 = 1, $__1 = arguments.length; $__0 < $__1; $__0++) - * args.push(arguments[$__0]); - * args.forEach(...); - * } - * - */ -var Syntax = _dereq_('esprima-fb').Syntax; -var utils = _dereq_('../src/utils'); - - - -function _nodeIsFunctionWithRestParam(node) { - return (node.type === Syntax.FunctionDeclaration - || node.type === Syntax.FunctionExpression - || node.type === Syntax.ArrowFunctionExpression) - && node.rest; -} - -function visitFunctionParamsWithRestParam(traverse, node, path, state) { - if (node.parametricType) { - utils.catchup(node.parametricType.range[0], state); - path.unshift(node); - traverse(node.parametricType, path, state); - path.shift(); - } - - // Render params. - if (node.params.length) { - path.unshift(node); - traverse(node.params, path, state); - path.shift(); - } else { - // -3 is for ... of the rest. - utils.catchup(node.rest.range[0] - 3, state); - } - utils.catchupWhiteSpace(node.rest.range[1], state); - - path.unshift(node); - traverse(node.body, path, state); - path.shift(); - - return false; -} - -visitFunctionParamsWithRestParam.test = function(node, path, state) { - return _nodeIsFunctionWithRestParam(node); -}; - -function renderRestParamSetup(functionNode, state) { - var idx = state.localScope.tempVarIndex++; - var len = state.localScope.tempVarIndex++; - - return 'for (var ' + functionNode.rest.name + '=[],' + - utils.getTempVar(idx) + '=' + functionNode.params.length + ',' + - utils.getTempVar(len) + '=arguments.length;' + - utils.getTempVar(idx) + '<' + utils.getTempVar(len) + ';' + - utils.getTempVar(idx) + '++) ' + - functionNode.rest.name + '.push(arguments[' + utils.getTempVar(idx) + ']);'; -} - -function visitFunctionBodyWithRestParam(traverse, node, path, state) { - utils.catchup(node.range[0] + 1, state); - var parentNode = path[0]; - utils.append(renderRestParamSetup(parentNode, state), state); - return true; -} - -visitFunctionBodyWithRestParam.test = function(node, path, state) { - return node.type === Syntax.BlockStatement - && _nodeIsFunctionWithRestParam(path[0]); -}; - -exports.renderRestParamSetup = renderRestParamSetup; -exports.visitorList = [ - visitFunctionParamsWithRestParam, - visitFunctionBodyWithRestParam -]; - -},{"../src/utils":23,"esprima-fb":9}],31:[function(_dereq_,module,exports){ -/** - * Copyright 2013 Facebook, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*jslint node:true*/ - -/** - * @typechecks - */ -'use strict'; - -var Syntax = _dereq_('esprima-fb').Syntax; -var utils = _dereq_('../src/utils'); - -/** - * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-12.1.9 - */ -function visitTemplateLiteral(traverse, node, path, state) { - var templateElements = node.quasis; - - utils.append('(', state); - for (var ii = 0; ii < templateElements.length; ii++) { - var templateElement = templateElements[ii]; - if (templateElement.value.raw !== '') { - utils.append(getCookedValue(templateElement), state); - if (!templateElement.tail) { - // + between element and substitution - utils.append(' + ', state); - } - // maintain line numbers - utils.move(templateElement.range[0], state); - utils.catchupNewlines(templateElement.range[1], state); - } else { // templateElement.value.raw === '' - // Concatenat adjacent substitutions, e.g. `${x}${y}`. Empty templates - // appear before the first and after the last element - nothing to add in - // those cases. - if (ii > 0 && !templateElement.tail) { - // + between substitution and substitution - utils.append(' + ', state); - } - } - - utils.move(templateElement.range[1], state); - if (!templateElement.tail) { - var substitution = node.expressions[ii]; - if (substitution.type === Syntax.Identifier || - substitution.type === Syntax.MemberExpression || - substitution.type === Syntax.CallExpression) { - utils.catchup(substitution.range[1], state); - } else { - utils.append('(', state); - traverse(substitution, path, state); - utils.catchup(substitution.range[1], state); - utils.append(')', state); - } - // if next templateElement isn't empty... - if (templateElements[ii + 1].value.cooked !== '') { - utils.append(' + ', state); - } - } - } - utils.move(node.range[1], state); - utils.append(')', state); - return false; -} - -visitTemplateLiteral.test = function(node, path, state) { - return node.type === Syntax.TemplateLiteral; -}; - -/** - * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-12.2.6 - */ -function visitTaggedTemplateExpression(traverse, node, path, state) { - var template = node.quasi; - var numQuasis = template.quasis.length; - - // print the tag - utils.move(node.tag.range[0], state); - traverse(node.tag, path, state); - utils.catchup(node.tag.range[1], state); - - // print array of template elements - utils.append('(function() { var siteObj = [', state); - for (var ii = 0; ii < numQuasis; ii++) { - utils.append(getCookedValue(template.quasis[ii]), state); - if (ii !== numQuasis - 1) { - utils.append(', ', state); - } - } - utils.append(']; siteObj.raw = [', state); - for (ii = 0; ii < numQuasis; ii++) { - utils.append(getRawValue(template.quasis[ii]), state); - if (ii !== numQuasis - 1) { - utils.append(', ', state); - } - } - utils.append( - ']; Object.freeze(siteObj.raw); Object.freeze(siteObj); return siteObj; }()', - state - ); - - // print substitutions - if (numQuasis > 1) { - for (ii = 0; ii < template.expressions.length; ii++) { - var expression = template.expressions[ii]; - utils.append(', ', state); - - // maintain line numbers by calling catchupWhiteSpace over the whole - // previous TemplateElement - utils.move(template.quasis[ii].range[0], state); - utils.catchupNewlines(template.quasis[ii].range[1], state); - - utils.move(expression.range[0], state); - traverse(expression, path, state); - utils.catchup(expression.range[1], state); - } - } - - // print blank lines to push the closing ) down to account for the final - // TemplateElement. - utils.catchupNewlines(node.range[1], state); - - utils.append(')', state); - - return false; -} - -visitTaggedTemplateExpression.test = function(node, path, state) { - return node.type === Syntax.TaggedTemplateExpression; -}; - -function getCookedValue(templateElement) { - return JSON.stringify(templateElement.value.cooked); -} - -function getRawValue(templateElement) { - return JSON.stringify(templateElement.value.raw); -} - -exports.visitorList = [ - visitTemplateLiteral, - visitTaggedTemplateExpression -]; - -},{"../src/utils":23,"esprima-fb":9}],32:[function(_dereq_,module,exports){ -/** - * Copyright 2013 Facebook, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*jslint node:true*/ - -/** - * Desugars ES7 rest properties into ES5 object iteration. - */ - -var Syntax = _dereq_('esprima-fb').Syntax; - -// TODO: This is a pretty massive helper, it should only be defined once, in the -// transform's runtime environment. We don't currently have a runtime though. -var restFunction = - '(function(source, exclusion) {' + - 'var rest = {};' + - 'var hasOwn = Object.prototype.hasOwnProperty;' + - 'if (source == null) {' + - 'throw new TypeError();' + - '}' + - 'for (var key in source) {' + - 'if (hasOwn.call(source, key) && !hasOwn.call(exclusion, key)) {' + - 'rest[key] = source[key];' + - '}' + - '}' + - 'return rest;' + - '})'; - -function getPropertyNames(properties) { - var names = []; - for (var i = 0; i < properties.length; i++) { - var property = properties[i]; - if (property.type === Syntax.SpreadProperty) { - continue; - } - if (property.type === Syntax.Identifier) { - names.push(property.name); - } else { - names.push(property.key.name); - } - } - return names; -} - -function getRestFunctionCall(source, exclusion) { - return restFunction + '(' + source + ',' + exclusion + ')'; -} - -function getSimpleShallowCopy(accessorExpression) { - // This could be faster with 'Object.assign({}, ' + accessorExpression + ')' - // but to unify code paths and avoid a ES6 dependency we use the same - // helper as for the exclusion case. - return getRestFunctionCall(accessorExpression, '{}'); -} - -function renderRestExpression(accessorExpression, excludedProperties) { - var excludedNames = getPropertyNames(excludedProperties); - if (!excludedNames.length) { - return getSimpleShallowCopy(accessorExpression); - } - return getRestFunctionCall( - accessorExpression, - '{' + excludedNames.join(':1,') + ':1}' - ); -} - -exports.renderRestExpression = renderRestExpression; - -},{"esprima-fb":9}],33:[function(_dereq_,module,exports){ -/** - * Copyright 2004-present Facebook. All Rights Reserved. - */ -/*global exports:true*/ - -/** - * Implements ES7 object spread property. - * https://gist.github.com/sebmarkbage/aa849c7973cb4452c547 - * - * { ...a, x: 1 } - * - * Object.assign({}, a, {x: 1 }) - * - */ - -var Syntax = _dereq_('esprima-fb').Syntax; -var utils = _dereq_('../src/utils'); - -function visitObjectLiteralSpread(traverse, node, path, state) { - utils.catchup(node.range[0], state); - - utils.append('Object.assign({', state); - - // Skip the original { - utils.move(node.range[0] + 1, state); - - var previousWasSpread = false; - - for (var i = 0; i < node.properties.length; i++) { - var property = node.properties[i]; - if (property.type === Syntax.SpreadProperty) { - - // Close the previous object or initial object - if (!previousWasSpread) { - utils.append('}', state); - } - - if (i === 0) { - // Normally there will be a comma when we catch up, but not before - // the first property. - utils.append(',', state); - } - - utils.catchup(property.range[0], state); - - // skip ... - utils.move(property.range[0] + 3, state); - - traverse(property.argument, path, state); - - utils.catchup(property.range[1], state); - - previousWasSpread = true; - - } else { - - utils.catchup(property.range[0], state); - - if (previousWasSpread) { - utils.append('{', state); - } - - traverse(property, path, state); - - utils.catchup(property.range[1], state); - - previousWasSpread = false; - - } - } - - // Strip any non-whitespace between the last item and the end. - // We only catch up on whitespace so that we ignore any trailing commas which - // are stripped out for IE8 support. Unfortunately, this also strips out any - // trailing comments. - utils.catchupWhiteSpace(node.range[1] - 1, state); - - // Skip the trailing } - utils.move(node.range[1], state); - - if (!previousWasSpread) { - utils.append('}', state); - } - - utils.append(')', state); - return false; -} - -visitObjectLiteralSpread.test = function(node, path, state) { - if (node.type !== Syntax.ObjectExpression) { - return false; - } - // Tight loop optimization - var hasAtLeastOneSpreadProperty = false; - for (var i = 0; i < node.properties.length; i++) { - var property = node.properties[i]; - if (property.type === Syntax.SpreadProperty) { - hasAtLeastOneSpreadProperty = true; - } else if (property.kind !== 'init') { - return false; - } - } - return hasAtLeastOneSpreadProperty; -}; - -exports.visitorList = [ - visitObjectLiteralSpread -]; - -},{"../src/utils":23,"esprima-fb":9}],34:[function(_dereq_,module,exports){ -/** - * Copyright 2014 Facebook, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var KEYWORDS = [ - 'break', 'do', 'in', 'typeof', 'case', 'else', 'instanceof', 'var', 'catch', - 'export', 'new', 'void', 'class', 'extends', 'return', 'while', 'const', - 'finally', 'super', 'with', 'continue', 'for', 'switch', 'yield', 'debugger', - 'function', 'this', 'default', 'if', 'throw', 'delete', 'import', 'try' -]; - -var FUTURE_RESERVED_WORDS = [ - 'enum', 'await', 'implements', 'package', 'protected', 'static', 'interface', - 'private', 'public' -]; - -var LITERALS = [ - 'null', - 'true', - 'false' -]; - -// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-reserved-words -var RESERVED_WORDS = [].concat( - KEYWORDS, - FUTURE_RESERVED_WORDS, - LITERALS -); - -var reservedWordsMap = Object.create(null); -RESERVED_WORDS.forEach(function(k) { - reservedWordsMap[k] = true; -}); - -/** - * This list should not grow as new reserved words are introdued. This list is - * of words that need to be quoted because ES3-ish browsers do not allow their - * use as identifier names. - */ -var ES3_FUTURE_RESERVED_WORDS = [ - 'enum', 'implements', 'package', 'protected', 'static', 'interface', - 'private', 'public' -]; - -var ES3_RESERVED_WORDS = [].concat( - KEYWORDS, - ES3_FUTURE_RESERVED_WORDS, - LITERALS -); - -var es3ReservedWordsMap = Object.create(null); -ES3_RESERVED_WORDS.forEach(function(k) { - es3ReservedWordsMap[k] = true; -}); - -exports.isReservedWord = function(word) { - return !!reservedWordsMap[word]; -}; - -exports.isES3ReservedWord = function(word) { - return !!es3ReservedWordsMap[word]; -}; - -},{}],35:[function(_dereq_,module,exports){ -/** - * Copyright 2014 Facebook, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -/*global exports:true*/ - -var Syntax = _dereq_('esprima-fb').Syntax; -var utils = _dereq_('../src/utils'); -var reserverdWordsHelper = _dereq_('./reserved-words-helper'); - -/** - * Code adapted from https://github.com/spicyj/es3ify - * The MIT License (MIT) - * Copyright (c) 2014 Ben Alpert - */ - -function visitProperty(traverse, node, path, state) { - utils.catchup(node.key.range[0], state); - utils.append('"', state); - utils.catchup(node.key.range[1], state); - utils.append('"', state); - utils.catchup(node.value.range[0], state); - traverse(node.value, path, state); - return false; -} - -visitProperty.test = function(node) { - return node.type === Syntax.Property && - node.key.type === Syntax.Identifier && - !node.method && - !node.shorthand && - !node.computed && - reserverdWordsHelper.isES3ReservedWord(node.key.name); -}; - -function visitMemberExpression(traverse, node, path, state) { - traverse(node.object, path, state); - utils.catchup(node.property.range[0] - 1, state); - utils.append('[', state); - utils.catchupWhiteSpace(node.property.range[0], state); - utils.append('"', state); - utils.catchup(node.property.range[1], state); - utils.append('"]', state); - return false; -} - -visitMemberExpression.test = function(node) { - return node.type === Syntax.MemberExpression && - node.property.type === Syntax.Identifier && - reserverdWordsHelper.isES3ReservedWord(node.property.name); -}; - -exports.visitorList = [ - visitProperty, - visitMemberExpression -]; - -},{"../src/utils":23,"./reserved-words-helper":34,"esprima-fb":9}],36:[function(_dereq_,module,exports){ -var esprima = _dereq_('esprima-fb'); -var utils = _dereq_('../src/utils'); - -var Syntax = esprima.Syntax; - -function _isFunctionNode(node) { - return node.type === Syntax.FunctionDeclaration - || node.type === Syntax.FunctionExpression - || node.type === Syntax.ArrowFunctionExpression; -} - -function visitClassProperty(traverse, node, path, state) { - utils.catchup(node.range[0], state); - utils.catchupWhiteOut(node.range[1], state); - return false; -} -visitClassProperty.test = function(node, path, state) { - return node.type === Syntax.ClassProperty; -}; - -function visitTypeAlias(traverse, node, path, state) { - utils.catchupWhiteOut(node.range[1], state); - return false; -} -visitTypeAlias.test = function(node, path, state) { - return node.type === Syntax.TypeAlias; -}; - -function visitTypeCast(traverse, node, path, state) { - path.unshift(node); - traverse(node.expression, path, state); - path.shift(); - - utils.catchup(node.typeAnnotation.range[0], state); - utils.catchupWhiteOut(node.typeAnnotation.range[1], state); - return false; -} -visitTypeCast.test = function(node, path, state) { - return node.type === Syntax.TypeCastExpression; -}; - -function visitInterfaceDeclaration(traverse, node, path, state) { - utils.catchupWhiteOut(node.range[1], state); - return false; -} -visitInterfaceDeclaration.test = function(node, path, state) { - return node.type === Syntax.InterfaceDeclaration; -}; - -function visitDeclare(traverse, node, path, state) { - utils.catchupWhiteOut(node.range[1], state); - return false; -} -visitDeclare.test = function(node, path, state) { - switch (node.type) { - case Syntax.DeclareVariable: - case Syntax.DeclareFunction: - case Syntax.DeclareClass: - case Syntax.DeclareModule: - return true; - } - return false; -}; - -function visitFunctionParametricAnnotation(traverse, node, path, state) { - utils.catchup(node.range[0], state); - utils.catchupWhiteOut(node.range[1], state); - return false; -} -visitFunctionParametricAnnotation.test = function(node, path, state) { - return node.type === Syntax.TypeParameterDeclaration - && path[0] - && _isFunctionNode(path[0]) - && node === path[0].typeParameters; -}; - -function visitFunctionReturnAnnotation(traverse, node, path, state) { - utils.catchup(node.range[0], state); - utils.catchupWhiteOut(node.range[1], state); - return false; -} -visitFunctionReturnAnnotation.test = function(node, path, state) { - return path[0] && _isFunctionNode(path[0]) && node === path[0].returnType; -}; - -function visitOptionalFunctionParameterAnnotation(traverse, node, path, state) { - utils.catchup(node.range[0] + node.name.length, state); - utils.catchupWhiteOut(node.range[1], state); - return false; -} -visitOptionalFunctionParameterAnnotation.test = function(node, path, state) { - return node.type === Syntax.Identifier - && node.optional - && path[0] - && _isFunctionNode(path[0]); -}; - -function visitTypeAnnotatedIdentifier(traverse, node, path, state) { - utils.catchup(node.typeAnnotation.range[0], state); - utils.catchupWhiteOut(node.typeAnnotation.range[1], state); - return false; -} -visitTypeAnnotatedIdentifier.test = function(node, path, state) { - return node.type === Syntax.Identifier && node.typeAnnotation; -}; - -function visitTypeAnnotatedObjectOrArrayPattern(traverse, node, path, state) { - utils.catchup(node.typeAnnotation.range[0], state); - utils.catchupWhiteOut(node.typeAnnotation.range[1], state); - return false; -} -visitTypeAnnotatedObjectOrArrayPattern.test = function(node, path, state) { - var rightType = node.type === Syntax.ObjectPattern - || node.type === Syntax.ArrayPattern; - return rightType && node.typeAnnotation; -}; - -/** - * Methods cause trouble, since esprima parses them as a key/value pair, where - * the location of the value starts at the method body. For example - * { bar(x:number,...y:Array):number {} } - * is parsed as - * { bar: function(x: number, ...y:Array): number {} } - * except that the location of the FunctionExpression value is 40-something, - * which is the location of the function body. This means that by the time we - * visit the params, rest param, and return type organically, we've already - * catchup()'d passed them. - */ -function visitMethod(traverse, node, path, state) { - path.unshift(node); - traverse(node.key, path, state); - - path.unshift(node.value); - traverse(node.value.params, path, state); - node.value.rest && traverse(node.value.rest, path, state); - node.value.returnType && traverse(node.value.returnType, path, state); - traverse(node.value.body, path, state); - - path.shift(); - - path.shift(); - return false; -} - -visitMethod.test = function(node, path, state) { - return (node.type === "Property" && (node.method || node.kind === "set" || node.kind === "get")) - || (node.type === "MethodDefinition"); -}; - -function visitImportType(traverse, node, path, state) { - utils.catchupWhiteOut(node.range[1], state); - return false; -} -visitImportType.test = function(node, path, state) { - return node.type === 'ImportDeclaration' - && node.isType; -}; - -exports.visitorList = [ - visitClassProperty, - visitDeclare, - visitImportType, - visitInterfaceDeclaration, - visitFunctionParametricAnnotation, - visitFunctionReturnAnnotation, - visitMethod, - visitOptionalFunctionParameterAnnotation, - visitTypeAlias, - visitTypeCast, - visitTypeAnnotatedIdentifier, - visitTypeAnnotatedObjectOrArrayPattern -]; - -},{"../src/utils":23,"esprima-fb":9}],37:[function(_dereq_,module,exports){ -/** - * Copyright 2013-2015, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ -/*global exports:true*/ -'use strict'; -var Syntax = _dereq_('jstransform').Syntax; -var utils = _dereq_('jstransform/src/utils'); - -function renderJSXLiteral(object, isLast, state, start, end) { - var lines = object.value.split(/\r\n|\n|\r/); - - if (start) { - utils.append(start, state); - } - - var lastNonEmptyLine = 0; - - lines.forEach(function(line, index) { - if (line.match(/[^ \t]/)) { - lastNonEmptyLine = index; - } - }); - - lines.forEach(function(line, index) { - var isFirstLine = index === 0; - var isLastLine = index === lines.length - 1; - var isLastNonEmptyLine = index === lastNonEmptyLine; - - // replace rendered whitespace tabs with spaces - var trimmedLine = line.replace(/\t/g, ' '); - - // trim whitespace touching a newline - if (!isFirstLine) { - trimmedLine = trimmedLine.replace(/^[ ]+/, ''); - } - if (!isLastLine) { - trimmedLine = trimmedLine.replace(/[ ]+$/, ''); - } - - if (!isFirstLine) { - utils.append(line.match(/^[ \t]*/)[0], state); - } - - if (trimmedLine || isLastNonEmptyLine) { - utils.append( - JSON.stringify(trimmedLine) + - (!isLastNonEmptyLine ? ' + \' \' +' : ''), - state); - - if (isLastNonEmptyLine) { - if (end) { - utils.append(end, state); - } - if (!isLast) { - utils.append(', ', state); - } - } - - // only restore tail whitespace if line had literals - if (trimmedLine && !isLastLine) { - utils.append(line.match(/[ \t]*$/)[0], state); - } - } - - if (!isLastLine) { - utils.append('\n', state); - } - }); - - utils.move(object.range[1], state); -} - -function renderJSXExpressionContainer(traverse, object, isLast, path, state) { - // Plus 1 to skip `{`. - utils.move(object.range[0] + 1, state); - utils.catchup(object.expression.range[0], state); - traverse(object.expression, path, state); - - if (!isLast && object.expression.type !== Syntax.JSXEmptyExpression) { - // If we need to append a comma, make sure to do so after the expression. - utils.catchup(object.expression.range[1], state, trimLeft); - utils.append(', ', state); - } - - // Minus 1 to skip `}`. - utils.catchup(object.range[1] - 1, state, trimLeft); - utils.move(object.range[1], state); - return false; -} - -function quoteAttrName(attr) { - // Quote invalid JS identifiers. - if (!/^[a-z_$][a-z\d_$]*$/i.test(attr)) { - return '"' + attr + '"'; - } - return attr; -} - -function trimLeft(value) { - return value.replace(/^[ ]+/, ''); -} - -exports.renderJSXExpressionContainer = renderJSXExpressionContainer; -exports.renderJSXLiteral = renderJSXLiteral; -exports.quoteAttrName = quoteAttrName; -exports.trimLeft = trimLeft; - -},{"jstransform":22,"jstransform/src/utils":23}],38:[function(_dereq_,module,exports){ -/** - * Copyright 2013-2015, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ -/*global exports:true*/ -'use strict'; - -var Syntax = _dereq_('jstransform').Syntax; -var utils = _dereq_('jstransform/src/utils'); - -var renderJSXExpressionContainer = - _dereq_('./jsx').renderJSXExpressionContainer; -var renderJSXLiteral = _dereq_('./jsx').renderJSXLiteral; -var quoteAttrName = _dereq_('./jsx').quoteAttrName; - -var trimLeft = _dereq_('./jsx').trimLeft; - -/** - * Customized desugar processor for React JSX. Currently: - * - * => React.createElement(X, null) - * => React.createElement(X, {prop: '1'}, null) - * => React.createElement(X, {prop:'2'}, - * React.createElement(Y, null) - * ) - *
=> React.createElement("div", null) - */ - -/** - * Removes all non-whitespace/parenthesis characters - */ -var reNonWhiteParen = /([^\s\(\)])/g; -function stripNonWhiteParen(value) { - return value.replace(reNonWhiteParen, ''); -} - -var tagConvention = /^[a-z]|\-/; -function isTagName(name) { - return tagConvention.test(name); -} - -function visitReactTag(traverse, object, path, state) { - var openingElement = object.openingElement; - var nameObject = openingElement.name; - var attributesObject = openingElement.attributes; - - utils.catchup(openingElement.range[0], state, trimLeft); - - if (nameObject.type === Syntax.JSXNamespacedName && nameObject.namespace) { - throw new Error('Namespace tags are not supported. ReactJSX is not XML.'); - } - - // We assume that the React runtime is already in scope - utils.append('React.createElement(', state); - - if (nameObject.type === Syntax.JSXIdentifier && isTagName(nameObject.name)) { - utils.append('"' + nameObject.name + '"', state); - utils.move(nameObject.range[1], state); - } else { - // Use utils.catchup in this case so we can easily handle - // JSXMemberExpressions which look like Foo.Bar.Baz. This also handles - // JSXIdentifiers that aren't fallback tags. - utils.move(nameObject.range[0], state); - utils.catchup(nameObject.range[1], state); - } - - utils.append(', ', state); - - var hasAttributes = attributesObject.length; - - var hasAtLeastOneSpreadProperty = attributesObject.some(function(attr) { - return attr.type === Syntax.JSXSpreadAttribute; - }); - - // if we don't have any attributes, pass in null - if (hasAtLeastOneSpreadProperty) { - utils.append('React.__spread({', state); - } else if (hasAttributes) { - utils.append('{', state); - } else { - utils.append('null', state); - } - - // keep track of if the previous attribute was a spread attribute - var previousWasSpread = false; - - // write attributes - attributesObject.forEach(function(attr, index) { - var isLast = index === attributesObject.length - 1; - - if (attr.type === Syntax.JSXSpreadAttribute) { - // Close the previous object or initial object - if (!previousWasSpread) { - utils.append('}, ', state); - } - - // Move to the expression start, ignoring everything except parenthesis - // and whitespace. - utils.catchup(attr.range[0], state, stripNonWhiteParen); - // Plus 1 to skip `{`. - utils.move(attr.range[0] + 1, state); - utils.catchup(attr.argument.range[0], state, stripNonWhiteParen); - - traverse(attr.argument, path, state); - - utils.catchup(attr.argument.range[1], state); - - // Move to the end, ignoring parenthesis and the closing `}` - utils.catchup(attr.range[1] - 1, state, stripNonWhiteParen); - - if (!isLast) { - utils.append(', ', state); - } - - utils.move(attr.range[1], state); - - previousWasSpread = true; - - return; - } - - // If the next attribute is a spread, we're effective last in this object - if (!isLast) { - isLast = attributesObject[index + 1].type === Syntax.JSXSpreadAttribute; - } - - if (attr.name.namespace) { - throw new Error( - 'Namespace attributes are not supported. ReactJSX is not XML.'); - } - var name = attr.name.name; - - utils.catchup(attr.range[0], state, trimLeft); - - if (previousWasSpread) { - utils.append('{', state); - } - - utils.append(quoteAttrName(name), state); - utils.append(': ', state); - - if (!attr.value) { - state.g.buffer += 'true'; - state.g.position = attr.name.range[1]; - if (!isLast) { - utils.append(', ', state); - } - } else { - utils.move(attr.name.range[1], state); - // Use catchupNewlines to skip over the '=' in the attribute - utils.catchupNewlines(attr.value.range[0], state); - if (attr.value.type === Syntax.Literal) { - renderJSXLiteral(attr.value, isLast, state); - } else { - renderJSXExpressionContainer(traverse, attr.value, isLast, path, state); - } - } - - utils.catchup(attr.range[1], state, trimLeft); - - previousWasSpread = false; - - }); - - if (!openingElement.selfClosing) { - utils.catchup(openingElement.range[1] - 1, state, trimLeft); - utils.move(openingElement.range[1], state); - } - - if (hasAttributes && !previousWasSpread) { - utils.append('}', state); - } - - if (hasAtLeastOneSpreadProperty) { - utils.append(')', state); - } - - // filter out whitespace - var childrenToRender = object.children.filter(function(child) { - return !(child.type === Syntax.Literal - && typeof child.value === 'string' - && child.value.match(/^[ \t]*[\r\n][ \t\r\n]*$/)); - }); - if (childrenToRender.length > 0) { - var lastRenderableIndex; - - childrenToRender.forEach(function(child, index) { - if (child.type !== Syntax.JSXExpressionContainer || - child.expression.type !== Syntax.JSXEmptyExpression) { - lastRenderableIndex = index; - } - }); - - if (lastRenderableIndex !== undefined) { - utils.append(', ', state); - } - - childrenToRender.forEach(function(child, index) { - utils.catchup(child.range[0], state, trimLeft); - - var isLast = index >= lastRenderableIndex; - - if (child.type === Syntax.Literal) { - renderJSXLiteral(child, isLast, state); - } else if (child.type === Syntax.JSXExpressionContainer) { - renderJSXExpressionContainer(traverse, child, isLast, path, state); - } else { - traverse(child, path, state); - if (!isLast) { - utils.append(', ', state); - } - } - - utils.catchup(child.range[1], state, trimLeft); - }); - } - - if (openingElement.selfClosing) { - // everything up to /> - utils.catchup(openingElement.range[1] - 2, state, trimLeft); - utils.move(openingElement.range[1], state); - } else { - // everything up to - utils.catchup(object.closingElement.range[0], state, trimLeft); - utils.move(object.closingElement.range[1], state); - } - - utils.append(')', state); - return false; -} - -visitReactTag.test = function(object, path, state) { - return object.type === Syntax.JSXElement; -}; - -exports.visitorList = [ - visitReactTag -]; - -},{"./jsx":37,"jstransform":22,"jstransform/src/utils":23}],39:[function(_dereq_,module,exports){ -/** - * Copyright 2013-2015, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ -/*global exports:true*/ -'use strict'; - -var Syntax = _dereq_('jstransform').Syntax; -var utils = _dereq_('jstransform/src/utils'); - -function addDisplayName(displayName, object, state) { - if (object && - object.type === Syntax.CallExpression && - object.callee.type === Syntax.MemberExpression && - object.callee.object.type === Syntax.Identifier && - object.callee.object.name === 'React' && - object.callee.property.type === Syntax.Identifier && - object.callee.property.name === 'createClass' && - object.arguments.length === 1 && - object.arguments[0].type === Syntax.ObjectExpression) { - // Verify that the displayName property isn't already set - var properties = object.arguments[0].properties; - var safe = properties.every(function(property) { - var value = property.key.type === Syntax.Identifier ? - property.key.name : - property.key.value; - return value !== 'displayName'; - }); - - if (safe) { - utils.catchup(object.arguments[0].range[0] + 1, state); - utils.append('displayName: "' + displayName + '",', state); - } - } -} - -/** - * Transforms the following: - * - * var MyComponent = React.createClass({ - * render: ... - * }); - * - * into: - * - * var MyComponent = React.createClass({ - * displayName: 'MyComponent', - * render: ... - * }); - * - * Also catches: - * - * MyComponent = React.createClass(...); - * exports.MyComponent = React.createClass(...); - * module.exports = {MyComponent: React.createClass(...)}; - */ -function visitReactDisplayName(traverse, object, path, state) { - var left, right; - - if (object.type === Syntax.AssignmentExpression) { - left = object.left; - right = object.right; - } else if (object.type === Syntax.Property) { - left = object.key; - right = object.value; - } else if (object.type === Syntax.VariableDeclarator) { - left = object.id; - right = object.init; - } - - if (left && left.type === Syntax.MemberExpression) { - left = left.property; - } - if (left && left.type === Syntax.Identifier) { - addDisplayName(left.name, right, state); - } -} - -visitReactDisplayName.test = function(object, path, state) { - return ( - object.type === Syntax.AssignmentExpression || - object.type === Syntax.Property || - object.type === Syntax.VariableDeclarator - ); -}; - -exports.visitorList = [ - visitReactDisplayName -]; - -},{"jstransform":22,"jstransform/src/utils":23}],40:[function(_dereq_,module,exports){ -/*global exports:true*/ - -'use strict'; - -var es6ArrowFunctions = - _dereq_('jstransform/visitors/es6-arrow-function-visitors'); -var es6Classes = _dereq_('jstransform/visitors/es6-class-visitors'); -var es6Destructuring = - _dereq_('jstransform/visitors/es6-destructuring-visitors'); -var es6ObjectConciseMethod = - _dereq_('jstransform/visitors/es6-object-concise-method-visitors'); -var es6ObjectShortNotation = - _dereq_('jstransform/visitors/es6-object-short-notation-visitors'); -var es6RestParameters = _dereq_('jstransform/visitors/es6-rest-param-visitors'); -var es6Templates = _dereq_('jstransform/visitors/es6-template-visitors'); -var es6CallSpread = - _dereq_('jstransform/visitors/es6-call-spread-visitors'); -var es7SpreadProperty = - _dereq_('jstransform/visitors/es7-spread-property-visitors'); -var react = _dereq_('./transforms/react'); -var reactDisplayName = _dereq_('./transforms/reactDisplayName'); -var reservedWords = _dereq_('jstransform/visitors/reserved-words-visitors'); - -/** - * Map from transformName => orderedListOfVisitors. - */ -var transformVisitors = { - 'es6-arrow-functions': es6ArrowFunctions.visitorList, - 'es6-classes': es6Classes.visitorList, - 'es6-destructuring': es6Destructuring.visitorList, - 'es6-object-concise-method': es6ObjectConciseMethod.visitorList, - 'es6-object-short-notation': es6ObjectShortNotation.visitorList, - 'es6-rest-params': es6RestParameters.visitorList, - 'es6-templates': es6Templates.visitorList, - 'es6-call-spread': es6CallSpread.visitorList, - 'es7-spread-property': es7SpreadProperty.visitorList, - 'react': react.visitorList.concat(reactDisplayName.visitorList), - 'reserved-words': reservedWords.visitorList -}; - -var transformSets = { - 'harmony': [ - 'es6-arrow-functions', - 'es6-object-concise-method', - 'es6-object-short-notation', - 'es6-classes', - 'es6-rest-params', - 'es6-templates', - 'es6-destructuring', - 'es6-call-spread', - 'es7-spread-property' - ], - 'es3': [ - 'reserved-words' - ], - 'react': [ - 'react' - ] -}; - -/** - * Specifies the order in which each transform should run. - */ -var transformRunOrder = [ - 'reserved-words', - 'es6-arrow-functions', - 'es6-object-concise-method', - 'es6-object-short-notation', - 'es6-classes', - 'es6-rest-params', - 'es6-templates', - 'es6-destructuring', - 'es6-call-spread', - 'es7-spread-property', - 'react' -]; - -/** - * Given a list of transform names, return the ordered list of visitors to be - * passed to the transform() function. - * - * @param {array?} excludes - * @return {array} - */ -function getAllVisitors(excludes) { - var ret = []; - for (var i = 0, il = transformRunOrder.length; i < il; i++) { - if (!excludes || excludes.indexOf(transformRunOrder[i]) === -1) { - ret = ret.concat(transformVisitors[transformRunOrder[i]]); - } - } - return ret; -} - -/** - * Given a list of visitor set names, return the ordered list of visitors to be - * passed to jstransform. - * - * @param {array} - * @return {array} - */ -function getVisitorsBySet(sets) { - var visitorsToInclude = sets.reduce(function(visitors, set) { - if (!transformSets.hasOwnProperty(set)) { - throw new Error('Unknown visitor set: ' + set); - } - transformSets[set].forEach(function(visitor) { - visitors[visitor] = true; - }); - return visitors; - }, {}); - - var visitorList = []; - for (var i = 0; i < transformRunOrder.length; i++) { - if (visitorsToInclude.hasOwnProperty(transformRunOrder[i])) { - visitorList = visitorList.concat(transformVisitors[transformRunOrder[i]]); - } - } - - return visitorList; -} - -exports.getVisitorsBySet = getVisitorsBySet; -exports.getAllVisitors = getAllVisitors; -exports.transformVisitors = transformVisitors; - -},{"./transforms/react":38,"./transforms/reactDisplayName":39,"jstransform/visitors/es6-arrow-function-visitors":24,"jstransform/visitors/es6-call-spread-visitors":25,"jstransform/visitors/es6-class-visitors":26,"jstransform/visitors/es6-destructuring-visitors":27,"jstransform/visitors/es6-object-concise-method-visitors":28,"jstransform/visitors/es6-object-short-notation-visitors":29,"jstransform/visitors/es6-rest-param-visitors":30,"jstransform/visitors/es6-template-visitors":31,"jstransform/visitors/es7-spread-property-visitors":33,"jstransform/visitors/reserved-words-visitors":35}],41:[function(_dereq_,module,exports){ -/** - * Copyright 2013-2015, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -'use strict'; -/*eslint-disable no-undef*/ -var Buffer = _dereq_('buffer').Buffer; - -function inlineSourceMap(sourceMap, sourceCode, sourceFilename) { - // This can be used with a sourcemap that has already has toJSON called on it. - // Check first. - var json = sourceMap; - if (typeof sourceMap.toJSON === 'function') { - json = sourceMap.toJSON(); - } - json.sources = [sourceFilename]; - json.sourcesContent = [sourceCode]; - var base64 = Buffer(JSON.stringify(json)).toString('base64'); - return '//# sourceMappingURL=data:application/json;base64,' + base64; -} - -module.exports = inlineSourceMap; - -},{"buffer":3}]},{},[1])(1) -}); \ No newline at end of file diff --git a/demo/js_dependencies/react.min.js b/demo/js_dependencies/react.min.js deleted file mode 100644 index e7b194a..0000000 --- a/demo/js_dependencies/react.min.js +++ /dev/null @@ -1,15 +0,0 @@ -/** - * React v0.13.0 - * - * Copyright 2013-2015, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.React=e()}}(function(){return function e(t,n,r){function o(a,u){if(!n[a]){if(!t[a]){var s="function"==typeof require&&require;if(!u&&s)return s(a,!0);if(i)return i(a,!0);var l=new Error("Cannot find module '"+a+"'");throw l.code="MODULE_NOT_FOUND",l}var c=n[a]={exports:{}};t[a][0].call(c.exports,function(e){var n=t[a][1][e];return o(n?n:e)},c,c.exports,e,t,n,r)}return n[a].exports}for(var i="function"==typeof require&&require,a=0;a8&&11>=_),M=32,N=String.fromCharCode(M),I=d.topLevelTypes,T={beforeInput:{phasedRegistrationNames:{bubbled:y({onBeforeInput:null}),captured:y({onBeforeInputCapture:null})},dependencies:[I.topCompositionEnd,I.topKeyPress,I.topTextInput,I.topPaste]},compositionEnd:{phasedRegistrationNames:{bubbled:y({onCompositionEnd:null}),captured:y({onCompositionEndCapture:null})},dependencies:[I.topBlur,I.topCompositionEnd,I.topKeyDown,I.topKeyPress,I.topKeyUp,I.topMouseDown]},compositionStart:{phasedRegistrationNames:{bubbled:y({onCompositionStart:null}),captured:y({onCompositionStartCapture:null})},dependencies:[I.topBlur,I.topCompositionStart,I.topKeyDown,I.topKeyPress,I.topKeyUp,I.topMouseDown]},compositionUpdate:{phasedRegistrationNames:{bubbled:y({onCompositionUpdate:null}),captured:y({onCompositionUpdateCapture:null})},dependencies:[I.topBlur,I.topCompositionUpdate,I.topKeyDown,I.topKeyPress,I.topKeyUp,I.topMouseDown]}},R=!1,P=null,w={eventTypes:T,extractEvents:function(e,t,n,r){return[s(e,t,n,r),p(e,t,n,r)]}};t.exports=w},{139:139,15:15,20:20,21:21,22:22,91:91,95:95}],4:[function(e,t){"use strict";function n(e,t){return e+t.charAt(0).toUpperCase()+t.substring(1)}var r={boxFlex:!0,boxFlexGroup:!0,columnCount:!0,flex:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,strokeOpacity:!0},o=["Webkit","ms","Moz","O"];Object.keys(r).forEach(function(e){o.forEach(function(t){r[n(t,e)]=r[e]})});var i={background:{backgroundImage:!0,backgroundPosition:!0,backgroundRepeat:!0,backgroundColor:!0},border:{borderWidth:!0,borderStyle:!0,borderColor:!0},borderBottom:{borderBottomWidth:!0,borderBottomStyle:!0,borderBottomColor:!0},borderLeft:{borderLeftWidth:!0,borderLeftStyle:!0,borderLeftColor:!0},borderRight:{borderRightWidth:!0,borderRightStyle:!0,borderRightColor:!0},borderTop:{borderTopWidth:!0,borderTopStyle:!0,borderTopColor:!0},font:{fontStyle:!0,fontVariant:!0,fontWeight:!0,fontSize:!0,lineHeight:!0,fontFamily:!0}},a={isUnitlessNumber:r,shorthandPropertyExpansions:i};t.exports=a},{}],5:[function(e,t){"use strict";var n=e(4),r=e(21),o=(e(106),e(111)),i=e(131),a=e(141),u=(e(150),a(function(e){return i(e)})),s="cssFloat";r.canUseDOM&&void 0===document.documentElement.style.cssFloat&&(s="styleFloat");var l={createMarkupForStyles:function(e){var t="";for(var n in e)if(e.hasOwnProperty(n)){var r=e[n];null!=r&&(t+=u(n)+":",t+=o(n,r)+";")}return t||null},setValueForStyles:function(e,t){var r=e.style;for(var i in t)if(t.hasOwnProperty(i)){var a=o(i,t[i]);if("float"===i&&(i=s),a)r[i]=a;else{var u=n.shorthandPropertyExpansions[i];if(u)for(var l in u)r[l]="";else r[i]=""}}}};t.exports=l},{106:106,111:111,131:131,141:141,150:150,21:21,4:4}],6:[function(e,t){"use strict";function n(){this._callbacks=null,this._contexts=null}var r=e(28),o=e(27),i=e(133);o(n.prototype,{enqueue:function(e,t){this._callbacks=this._callbacks||[],this._contexts=this._contexts||[],this._callbacks.push(e),this._contexts.push(t)},notifyAll:function(){var e=this._callbacks,t=this._contexts;if(e){i(e.length===t.length),this._callbacks=null,this._contexts=null;for(var n=0,r=e.length;r>n;n++)e[n].call(t[n]);e.length=0,t.length=0}},reset:function(){this._callbacks=null,this._contexts=null},destructor:function(){this.reset()}}),r.addPoolingTo(n),t.exports=n},{133:133,27:27,28:28}],7:[function(e,t){"use strict";function n(e){return"SELECT"===e.nodeName||"INPUT"===e.nodeName&&"file"===e.type}function r(e){var t=_.getPooled(I.change,R,e);C.accumulateTwoPhaseDispatches(t),b.batchedUpdates(o,t)}function o(e){y.enqueueEvents(e),y.processEventQueue()}function i(e,t){T=e,R=t,T.attachEvent("onchange",r)}function a(){T&&(T.detachEvent("onchange",r),T=null,R=null)}function u(e,t,n){return e===N.topChange?n:void 0}function s(e,t,n){e===N.topFocus?(a(),i(t,n)):e===N.topBlur&&a()}function l(e,t){T=e,R=t,P=e.value,w=Object.getOwnPropertyDescriptor(e.constructor.prototype,"value"),Object.defineProperty(T,"value",A),T.attachEvent("onpropertychange",p)}function c(){T&&(delete T.value,T.detachEvent("onpropertychange",p),T=null,R=null,P=null,w=null)}function p(e){if("value"===e.propertyName){var t=e.srcElement.value;t!==P&&(P=t,r(e))}}function d(e,t,n){return e===N.topInput?n:void 0}function f(e,t,n){e===N.topFocus?(c(),l(t,n)):e===N.topBlur&&c()}function h(e){return e!==N.topSelectionChange&&e!==N.topKeyUp&&e!==N.topKeyDown||!T||T.value===P?void 0:(P=T.value,R)}function m(e){return"INPUT"===e.nodeName&&("checkbox"===e.type||"radio"===e.type)}function v(e,t,n){return e===N.topClick?n:void 0}var g=e(15),y=e(17),C=e(20),E=e(21),b=e(85),_=e(93),x=e(134),D=e(136),M=e(139),N=g.topLevelTypes,I={change:{phasedRegistrationNames:{bubbled:M({onChange:null}),captured:M({onChangeCapture:null})},dependencies:[N.topBlur,N.topChange,N.topClick,N.topFocus,N.topInput,N.topKeyDown,N.topKeyUp,N.topSelectionChange]}},T=null,R=null,P=null,w=null,O=!1;E.canUseDOM&&(O=x("change")&&(!("documentMode"in document)||document.documentMode>8));var S=!1;E.canUseDOM&&(S=x("input")&&(!("documentMode"in document)||document.documentMode>9));var A={get:function(){return w.get.call(this)},set:function(e){P=""+e,w.set.call(this,e)}},k={eventTypes:I,extractEvents:function(e,t,r,o){var i,a;if(n(t)?O?i=u:a=s:D(t)?S?i=d:(i=h,a=f):m(t)&&(i=v),i){var l=i(e,t,r);if(l){var c=_.getPooled(I.change,l,o);return C.accumulateTwoPhaseDispatches(c),c}}a&&a(e,t,r)}};t.exports=k},{134:134,136:136,139:139,15:15,17:17,20:20,21:21,85:85,93:93}],8:[function(e,t){"use strict";var n=0,r={createReactRootIndex:function(){return n++}};t.exports=r},{}],9:[function(e,t){"use strict";function n(e,t,n){e.insertBefore(t,e.childNodes[n]||null)}var r=e(12),o=e(70),i=e(145),a=e(133),u={dangerouslyReplaceNodeWithMarkup:r.dangerouslyReplaceNodeWithMarkup,updateTextContent:i,processUpdates:function(e,t){for(var u,s=null,l=null,c=0;ct||r.hasOverloadedBooleanValue[e]&&t===!1}var r=e(10),o=e(143),i=(e(150),{createMarkupForID:function(e){return r.ID_ATTRIBUTE_NAME+"="+o(e)},createMarkupForProperty:function(e,t){if(r.isStandardName.hasOwnProperty(e)&&r.isStandardName[e]){if(n(e,t))return"";var i=r.getAttributeName[e];return r.hasBooleanValue[e]||r.hasOverloadedBooleanValue[e]&&t===!0?i:i+"="+o(t)}return r.isCustomAttribute(e)?null==t?"":e+"="+o(t):null},setValueForProperty:function(e,t,o){if(r.isStandardName.hasOwnProperty(t)&&r.isStandardName[t]){var i=r.getMutationMethod[t];if(i)i(e,o);else if(n(t,o))this.deleteValueForProperty(e,t);else if(r.mustUseAttribute[t])e.setAttribute(r.getAttributeName[t],""+o);else{var a=r.getPropertyName[t];r.hasSideEffects[t]&&""+e[a]==""+o||(e[a]=o)}}else r.isCustomAttribute(t)&&(null==o?e.removeAttribute(t):e.setAttribute(t,""+o))},deleteValueForProperty:function(e,t){if(r.isStandardName.hasOwnProperty(t)&&r.isStandardName[t]){var n=r.getMutationMethod[t];if(n)n(e,void 0);else if(r.mustUseAttribute[t])e.removeAttribute(r.getAttributeName[t]);else{var o=r.getPropertyName[t],i=r.getDefaultValueForProperty(e.nodeName,o);r.hasSideEffects[t]&&""+e[o]===i||(e[o]=i)}}else r.isCustomAttribute(t)&&e.removeAttribute(t)}});t.exports=i},{10:10,143:143,150:150}],12:[function(e,t){"use strict";function n(e){return e.substring(1,e.indexOf(" "))}var r=e(21),o=e(110),i=e(112),a=e(125),u=e(133),s=/^(<[^ \/>]+)/,l="data-danger-index",c={dangerouslyRenderMarkup:function(e){u(r.canUseDOM);for(var t,c={},p=0;ps;s++){var c=u[s];if(c){var p=c.extractEvents(e,t,r,i);p&&(a=o(a,p))}}return a},enqueueEvents:function(e){e&&(s=o(s,e))},processEventQueue:function(){var e=s;s=null,i(e,l),a(!s)},__purge:function(){u={}},__getListenerBank:function(){return u}};t.exports=p},{103:103,118:118,133:133,18:18,19:19}],18:[function(e,t){"use strict";function n(){if(a)for(var e in u){var t=u[e],n=a.indexOf(e);if(i(n>-1),!s.plugins[n]){i(t.extractEvents),s.plugins[n]=t;var o=t.eventTypes;for(var l in o)i(r(o[l],t,l))}}}function r(e,t,n){i(!s.eventNameDispatchConfigs.hasOwnProperty(n)),s.eventNameDispatchConfigs[n]=e;var r=e.phasedRegistrationNames;if(r){for(var a in r)if(r.hasOwnProperty(a)){var u=r[a];o(u,t,n)}return!0}return e.registrationName?(o(e.registrationName,t,n),!0):!1}function o(e,t,n){i(!s.registrationNameModules[e]),s.registrationNameModules[e]=t,s.registrationNameDependencies[e]=t.eventTypes[n].dependencies}var i=e(133),a=null,u={},s={plugins:[],eventNameDispatchConfigs:{},registrationNameModules:{},registrationNameDependencies:{},injectEventPluginOrder:function(e){i(!a),a=Array.prototype.slice.call(e),n()},injectEventPluginsByName:function(e){var t=!1;for(var r in e)if(e.hasOwnProperty(r)){var o=e[r];u.hasOwnProperty(r)&&u[r]===o||(i(!u[r]),u[r]=o,t=!0)}t&&n()},getPluginModuleForEvent:function(e){var t=e.dispatchConfig;if(t.registrationName)return s.registrationNameModules[t.registrationName]||null;for(var n in t.phasedRegistrationNames)if(t.phasedRegistrationNames.hasOwnProperty(n)){var r=s.registrationNameModules[t.phasedRegistrationNames[n]];if(r)return r}return null},_resetEventPlugins:function(){a=null;for(var e in u)u.hasOwnProperty(e)&&delete u[e];s.plugins.length=0;var t=s.eventNameDispatchConfigs;for(var n in t)t.hasOwnProperty(n)&&delete t[n];var r=s.registrationNameModules;for(var o in r)r.hasOwnProperty(o)&&delete r[o]}};t.exports=s},{133:133}],19:[function(e,t){"use strict";function n(e){return e===m.topMouseUp||e===m.topTouchEnd||e===m.topTouchCancel}function r(e){return e===m.topMouseMove||e===m.topTouchMove}function o(e){return e===m.topMouseDown||e===m.topTouchStart}function i(e,t){var n=e._dispatchListeners,r=e._dispatchIDs;if(Array.isArray(n))for(var o=0;oe&&n[e]===o[e];e++);var a=r-e;for(t=1;a>=t&&n[r-t]===o[i-t];t++);var u=t>1?1-t:void 0;return this._fallbackText=o.slice(e,u),this._fallbackText}}),r.addPoolingTo(n),t.exports=n},{128:128,27:27,28:28}],23:[function(e,t){"use strict";var n,r=e(10),o=e(21),i=r.injection.MUST_USE_ATTRIBUTE,a=r.injection.MUST_USE_PROPERTY,u=r.injection.HAS_BOOLEAN_VALUE,s=r.injection.HAS_SIDE_EFFECTS,l=r.injection.HAS_NUMERIC_VALUE,c=r.injection.HAS_POSITIVE_NUMERIC_VALUE,p=r.injection.HAS_OVERLOADED_BOOLEAN_VALUE;if(o.canUseDOM){var d=document.implementation;n=d&&d.hasFeature&&d.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")}var f={isCustomAttribute:RegExp.prototype.test.bind(/^(data|aria)-[a-z_][a-z\d_.\-]*$/),Properties:{accept:null,acceptCharset:null,accessKey:null,action:null,allowFullScreen:i|u,allowTransparency:i,alt:null,async:u,autoComplete:null,autoPlay:u,cellPadding:null,cellSpacing:null,charSet:i,checked:a|u,classID:i,className:n?i:a,cols:i|c,colSpan:null,content:null,contentEditable:null,contextMenu:i,controls:a|u,coords:null,crossOrigin:null,data:null,dateTime:i,defer:u,dir:null,disabled:i|u,download:p,draggable:null,encType:null,form:i,formAction:i,formEncType:i,formMethod:i,formNoValidate:u,formTarget:i,frameBorder:i,headers:null,height:i,hidden:i|u,href:null,hrefLang:null,htmlFor:null,httpEquiv:null,icon:null,id:a,label:null,lang:null,list:i,loop:a|u,manifest:i,marginHeight:null,marginWidth:null,max:null,maxLength:i,media:i,mediaGroup:null,method:null,min:null,multiple:a|u,muted:a|u,name:null,noValidate:u,open:u,pattern:null,placeholder:null,poster:null,preload:null,radioGroup:null,readOnly:a|u,rel:null,required:u,role:i,rows:i|c,rowSpan:null,sandbox:null,scope:null,scrolling:null,seamless:i|u,selected:a|u,shape:null,size:i|c,sizes:i,span:c,spellCheck:null,src:null,srcDoc:a,srcSet:i,start:l,step:null,style:null,tabIndex:null,target:null,title:null,type:null,useMap:null,value:a|s,width:i,wmode:i,autoCapitalize:null,autoCorrect:null,itemProp:i,itemScope:i|u,itemType:i,itemID:i,itemRef:i,property:null},DOMAttributeNames:{acceptCharset:"accept-charset",className:"class",htmlFor:"for",httpEquiv:"http-equiv"},DOMPropertyNames:{autoCapitalize:"autocapitalize",autoComplete:"autocomplete",autoCorrect:"autocorrect",autoFocus:"autofocus",autoPlay:"autoplay",encType:"encoding",hrefLang:"hreflang",radioGroup:"radiogroup",spellCheck:"spellcheck",srcDoc:"srcdoc",srcSet:"srcset"}};t.exports=f},{10:10,21:21}],24:[function(e,t){"use strict";function n(e){s(null==e.props.checkedLink||null==e.props.valueLink)}function r(e){n(e),s(null==e.props.value&&null==e.props.onChange)}function o(e){n(e),s(null==e.props.checked&&null==e.props.onChange)}function i(e){this.props.valueLink.requestChange(e.target.value)}function a(e){this.props.checkedLink.requestChange(e.target.checked)}var u=e(76),s=e(133),l={button:!0,checkbox:!0,image:!0,hidden:!0,radio:!0,reset:!0,submit:!0},c={Mixin:{propTypes:{value:function(e,t){return!e[t]||l[e.type]||e.onChange||e.readOnly||e.disabled?null:new Error("You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`.")},checked:function(e,t){return!e[t]||e.onChange||e.readOnly||e.disabled?null:new Error("You provided a `checked` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultChecked`. Otherwise, set either `onChange` or `readOnly`.")},onChange:u.func}},getValue:function(e){return e.props.valueLink?(r(e),e.props.valueLink.value):e.props.value},getChecked:function(e){return e.props.checkedLink?(o(e),e.props.checkedLink.value):e.props.checked},getOnChange:function(e){return e.props.valueLink?(r(e),i):e.props.checkedLink?(o(e),a):e.props.onChange}};t.exports=c},{133:133,76:76}],25:[function(e,t){"use strict";function n(e){e.remove()}var r=e(30),o=e(103),i=e(118),a=e(133),u={trapBubbledEvent:function(e,t){a(this.isMounted());var n=this.getDOMNode();a(n);var i=r.trapBubbledEvent(e,t,n);this._localEventListeners=o(this._localEventListeners,i)},componentWillUnmount:function(){this._localEventListeners&&i(this._localEventListeners,n)}};t.exports=u},{103:103,118:118,133:133,30:30}],26:[function(e,t){"use strict";var n=e(15),r=e(112),o=n.topLevelTypes,i={eventTypes:null,extractEvents:function(e,t,n,i){if(e===o.topTouchStart){var a=i.target;a&&!a.onclick&&(a.onclick=r)}}};t.exports=i},{112:112,15:15}],27:[function(e,t){"use strict";function n(e){if(null==e)throw new TypeError("Object.assign target cannot be null or undefined");for(var t=Object(e),n=Object.prototype.hasOwnProperty,r=1;rc;c++){var d=u[c];a.hasOwnProperty(d)&&a[d]||(d===s.topWheel?l("wheel")?m.ReactEventListener.trapBubbledEvent(s.topWheel,"wheel",o):l("mousewheel")?m.ReactEventListener.trapBubbledEvent(s.topWheel,"mousewheel",o):m.ReactEventListener.trapBubbledEvent(s.topWheel,"DOMMouseScroll",o):d===s.topScroll?l("scroll",!0)?m.ReactEventListener.trapCapturedEvent(s.topScroll,"scroll",o):m.ReactEventListener.trapBubbledEvent(s.topScroll,"scroll",m.ReactEventListener.WINDOW_HANDLE):d===s.topFocus||d===s.topBlur?(l("focus",!0)?(m.ReactEventListener.trapCapturedEvent(s.topFocus,"focus",o),m.ReactEventListener.trapCapturedEvent(s.topBlur,"blur",o)):l("focusin")&&(m.ReactEventListener.trapBubbledEvent(s.topFocus,"focusin",o),m.ReactEventListener.trapBubbledEvent(s.topBlur,"focusout",o)),a[s.topBlur]=!0,a[s.topFocus]=!0):f.hasOwnProperty(d)&&m.ReactEventListener.trapBubbledEvent(d,f[d],o),a[d]=!0)}},trapBubbledEvent:function(e,t,n){return m.ReactEventListener.trapBubbledEvent(e,t,n)},trapCapturedEvent:function(e,t,n){return m.ReactEventListener.trapCapturedEvent(e,t,n)},ensureScrollValueMonitoring:function(){if(!p){var e=u.refreshScrollValues; -m.ReactEventListener.monitorScrollValue(e),p=!0}},eventNameDispatchConfigs:o.eventNameDispatchConfigs,registrationNameModules:o.registrationNameModules,putListener:o.putListener,getListener:o.getListener,deleteListener:o.deleteListener,deleteAllListeners:o.deleteAllListeners});t.exports=m},{102:102,134:134,15:15,17:17,18:18,27:27,59:59}],31:[function(e,t){"use strict";var n=e(79),r=e(116),o=e(132),i=e(147),a={instantiateChildren:function(e){var t=r(e);for(var n in t)if(t.hasOwnProperty(n)){var i=t[n],a=o(i,null);t[n]=a}return t},updateChildren:function(e,t,a,u){var s=r(t);if(!s&&!e)return null;var l;for(l in s)if(s.hasOwnProperty(l)){var c=e&&e[l],p=c&&c._currentElement,d=s[l];if(i(p,d))n.receiveComponent(c,d,a,u),s[l]=c;else{c&&n.unmountComponent(c,l);var f=o(d,null);s[l]=f}}for(l in e)!e.hasOwnProperty(l)||s&&s.hasOwnProperty(l)||n.unmountComponent(e[l]);return s},unmountChildren:function(e){for(var t in e){var r=e[t];n.unmountComponent(r)}}};t.exports=a},{116:116,132:132,147:147,79:79}],32:[function(e,t){"use strict";function n(e,t){this.forEachFunction=e,this.forEachContext=t}function r(e,t,n,r){var o=e;o.forEachFunction.call(o.forEachContext,t,r)}function o(e,t,o){if(null==e)return e;var i=n.getPooled(t,o);d(e,r,i),n.release(i)}function i(e,t,n){this.mapResult=e,this.mapFunction=t,this.mapContext=n}function a(e,t,n,r){var o=e,i=o.mapResult,a=!i.hasOwnProperty(n);if(a){var u=o.mapFunction.call(o.mapContext,t,r);i[n]=u}}function u(e,t,n){if(null==e)return e;var r={},o=i.getPooled(r,t,n);return d(e,a,o),i.release(o),p.create(r)}function s(){return null}function l(e){return d(e,s,null)}var c=e(28),p=e(61),d=e(149),f=(e(150),c.twoArgumentPooler),h=c.threeArgumentPooler;c.addPoolingTo(n,f),c.addPoolingTo(i,h);var m={forEach:o,map:u,count:l};t.exports=m},{149:149,150:150,28:28,61:61}],33:[function(e,t){"use strict";function n(e,t){var n=x.hasOwnProperty(t)?x[t]:null;M.hasOwnProperty(t)&&g(n===b.OVERRIDE_BASE),e.hasOwnProperty(t)&&g(n===b.DEFINE_MANY||n===b.DEFINE_MANY_MERGED)}function r(e,t){if(t){g("function"!=typeof t),g(!p.isValidElement(t));var r=e.prototype;t.hasOwnProperty(E)&&D.mixins(e,t.mixins);for(var o in t)if(t.hasOwnProperty(o)&&o!==E){var i=t[o];if(n(r,o),D.hasOwnProperty(o))D[o](e,i);else{var s=x.hasOwnProperty(o),l=r.hasOwnProperty(o),c=i&&i.__reactDontBind,d="function"==typeof i,f=d&&!s&&!l&&!c;if(f)r.__reactAutoBindMap||(r.__reactAutoBindMap={}),r.__reactAutoBindMap[o]=i,r[o]=i;else if(l){var h=x[o];g(s&&(h===b.DEFINE_MANY_MERGED||h===b.DEFINE_MANY)),h===b.DEFINE_MANY_MERGED?r[o]=a(r[o],i):h===b.DEFINE_MANY&&(r[o]=u(r[o],i))}else r[o]=i}}}}function o(e,t){if(t)for(var n in t){var r=t[n];if(t.hasOwnProperty(n)){var o=n in D;g(!o);var i=n in e;g(!i),e[n]=r}}}function i(e,t){g(e&&t&&"object"==typeof e&&"object"==typeof t);for(var n in t)t.hasOwnProperty(n)&&(g(void 0===e[n]),e[n]=t[n]);return e}function a(e,t){return function(){var n=e.apply(this,arguments),r=t.apply(this,arguments);if(null==n)return r;if(null==r)return n;var o={};return i(o,n),i(o,r),o}}function u(e,t){return function(){e.apply(this,arguments),t.apply(this,arguments)}}function s(e,t){var n=t.bind(e);return n}function l(e){for(var t in e.__reactAutoBindMap)if(e.__reactAutoBindMap.hasOwnProperty(t)){var n=e.__reactAutoBindMap[t];e[t]=s(e,d.guard(n,e.constructor.displayName+"."+t))}}var c=e(34),p=(e(39),e(55)),d=e(58),f=e(65),h=e(66),m=(e(75),e(74),e(84)),v=e(27),g=e(133),y=e(138),C=e(139),E=(e(150),C({mixins:null})),b=y({DEFINE_ONCE:null,DEFINE_MANY:null,OVERRIDE_BASE:null,DEFINE_MANY_MERGED:null}),_=[],x={mixins:b.DEFINE_MANY,statics:b.DEFINE_MANY,propTypes:b.DEFINE_MANY,contextTypes:b.DEFINE_MANY,childContextTypes:b.DEFINE_MANY,getDefaultProps:b.DEFINE_MANY_MERGED,getInitialState:b.DEFINE_MANY_MERGED,getChildContext:b.DEFINE_MANY_MERGED,render:b.DEFINE_ONCE,componentWillMount:b.DEFINE_MANY,componentDidMount:b.DEFINE_MANY,componentWillReceiveProps:b.DEFINE_MANY,shouldComponentUpdate:b.DEFINE_ONCE,componentWillUpdate:b.DEFINE_MANY,componentDidUpdate:b.DEFINE_MANY,componentWillUnmount:b.DEFINE_MANY,updateComponent:b.OVERRIDE_BASE},D={displayName:function(e,t){e.displayName=t},mixins:function(e,t){if(t)for(var n=0;n";return this._createOpenTagMarkupAndPutListeners(t)+this._createContentMarkup(t,r)+o},_createOpenTagMarkupAndPutListeners:function(e){var t=this._currentElement.props,n="<"+this._tag;for(var o in t)if(t.hasOwnProperty(o)){var i=t[o];if(null!=i)if(E.hasOwnProperty(o))r(this._rootNodeID,o,i,e);else{o===_&&(i&&(i=this._previousStyleCopy=h({},t.style)),i=a.createMarkupForStyles(i));var u=s.createMarkupForProperty(o,i);u&&(n+=" "+u)}}if(e.renderToStaticMarkup)return n+">";var l=s.createMarkupForID(this._rootNodeID);return n+" "+l+">"},_createContentMarkup:function(e,t){var n="";("listing"===this._tag||"pre"===this._tag||"textarea"===this._tag)&&(n="\n");var r=this._currentElement.props,o=r.dangerouslySetInnerHTML;if(null!=o){if(null!=o.__html)return n+o.__html}else{var i=b[typeof r.children]?r.children:null,a=null!=i?null:r.children;if(null!=i)return n+m(i);if(null!=a){var u=this.mountChildren(a,e,t);return n+u.join("")}}return n},receiveComponent:function(e,t,n){var r=this._currentElement;this._currentElement=e,this.updateComponent(t,r,e,n)},updateComponent:function(e,t,r,o){n(this._currentElement.props),this._updateDOMProperties(t.props,e),this._updateDOMChildren(t.props,e,o)},_updateDOMProperties:function(e,t){var n,o,i,a=this._currentElement.props;for(n in e)if(!a.hasOwnProperty(n)&&e.hasOwnProperty(n))if(n===_){var s=this._previousStyleCopy;for(o in s)s.hasOwnProperty(o)&&(i=i||{},i[o]="")}else E.hasOwnProperty(n)?y(this._rootNodeID,n):(u.isStandardName[n]||u.isCustomAttribute(n))&&D.deletePropertyByID(this._rootNodeID,n);for(n in a){var l=a[n],c=n===_?this._previousStyleCopy:e[n];if(a.hasOwnProperty(n)&&l!==c)if(n===_)if(l&&(l=this._previousStyleCopy=h({},l)),c){for(o in c)!c.hasOwnProperty(o)||l&&l.hasOwnProperty(o)||(i=i||{},i[o]="");for(o in l)l.hasOwnProperty(o)&&c[o]!==l[o]&&(i=i||{},i[o]=l[o])}else i=l;else E.hasOwnProperty(n)?r(this._rootNodeID,n,l,t):(u.isStandardName[n]||u.isCustomAttribute(n))&&D.updatePropertyByID(this._rootNodeID,n,l)}i&&D.updateStylesByID(this._rootNodeID,i)},_updateDOMChildren:function(e,t,n){var r=this._currentElement.props,o=b[typeof e.children]?e.children:null,i=b[typeof r.children]?r.children:null,a=e.dangerouslySetInnerHTML&&e.dangerouslySetInnerHTML.__html,u=r.dangerouslySetInnerHTML&&r.dangerouslySetInnerHTML.__html,s=null!=o?null:e.children,l=null!=i?null:r.children,c=null!=o||null!=a,p=null!=i||null!=u;null!=s&&null==l?this.updateChildren(null,t,n):c&&!p&&this.updateTextContent(""),null!=i?o!==i&&this.updateTextContent(""+i):null!=u?a!==u&&D.updateInnerHTMLByID(this._rootNodeID,u):null!=l&&this.updateChildren(l,t,n)},unmountComponent:function(){this.unmountChildren(),l.deleteAllListeners(this._rootNodeID),c.unmountIDFromEnvironment(this._rootNodeID),this._rootNodeID=null}},f.measureMethods(i,"ReactDOMComponent",{mountComponent:"mountComponent",updateComponent:"updateComponent"}),h(i.prototype,i.Mixin,d.Mixin),i.injection={injectIDOperations:function(e){i.BackendIDOperations=D=e}},t.exports=i},{10:10,11:11,114:114,133:133,134:134,139:139,150:150,27:27,30:30,35:35,5:5,68:68,69:69,73:73}],43:[function(e,t){"use strict";var n=e(15),r=e(25),o=e(29),i=e(33),a=e(55),u=a.createFactory("form"),s=i.createClass({displayName:"ReactDOMForm",tagName:"FORM",mixins:[o,r],render:function(){return u(this.props)},componentDidMount:function(){this.trapBubbledEvent(n.topLevelTypes.topReset,"reset"),this.trapBubbledEvent(n.topLevelTypes.topSubmit,"submit")}});t.exports=s},{15:15,25:25,29:29,33:33,55:55}],44:[function(e,t){"use strict";var n=e(5),r=e(9),o=e(11),i=e(68),a=e(73),u=e(133),s=e(144),l={dangerouslySetInnerHTML:"`dangerouslySetInnerHTML` must be set using `updateInnerHTMLByID()`.",style:"`style` must be set using `updateStylesByID()`."},c={updatePropertyByID:function(e,t,n){var r=i.getNode(e);u(!l.hasOwnProperty(t)),null!=n?o.setValueForProperty(r,t,n):o.deleteValueForProperty(r,t)},deletePropertyByID:function(e,t,n){var r=i.getNode(e);u(!l.hasOwnProperty(t)),o.deleteValueForProperty(r,t,n)},updateStylesByID:function(e,t){var r=i.getNode(e);n.setValueForStyles(r,t)},updateInnerHTMLByID:function(e,t){var n=i.getNode(e);s(n,t)},updateTextContentByID:function(e,t){var n=i.getNode(e);r.updateTextContent(n,t)},dangerouslyReplaceNodeWithMarkupByID:function(e,t){var n=i.getNode(e);r.dangerouslyReplaceNodeWithMarkup(n,t)},dangerouslyProcessChildrenUpdates:function(e,t){for(var n=0;np;p++){var m=s[p];if(m!==a&&m.form===a.form){var v=l.getID(m);d(v);var g=h[v];d(g),c.asap(n,g)}}}return t}});t.exports=m},{11:11,133:133,2:2,24:24,27:27,29:29,33:33,55:55,68:68,85:85}],48:[function(e,t){"use strict";var n=e(29),r=e(33),o=e(55),i=(e(150),o.createFactory("option")),a=r.createClass({displayName:"ReactDOMOption",tagName:"OPTION",mixins:[n],componentWillMount:function(){},render:function(){return i(this.props,this.props.children)}});t.exports=a},{150:150,29:29,33:33,55:55}],49:[function(e,t){"use strict";function n(){if(this._pendingUpdate){this._pendingUpdate=!1;var e=a.getValue(this);null!=e&&this.isMounted()&&o(this,e)}}function r(e,t){if(null==e[t])return null;if(e.multiple){if(!Array.isArray(e[t]))return new Error("The `"+t+"` prop supplied to must be a scalar value if `multiple` is false.")}function o(e,t){var n,r,o,i=e.getDOMNode().options;if(e.props.multiple){for(n={},r=0,o=t.length;o>r;r++)n[""+t[r]]=!0;for(r=0,o=i.length;o>r;r++){var a=n.hasOwnProperty(i[r].value);i[r].selected!==a&&(i[r].selected=a)}}else{for(n=""+t,r=0,o=i.length;o>r;r++)if(i[r].value===n)return void(i[r].selected=!0);i[0].selected=!0}}var i=e(2),a=e(24),u=e(29),s=e(33),l=e(55),c=e(85),p=e(27),d=l.createFactory("select"),f=s.createClass({displayName:"ReactDOMSelect",tagName:"SELECT",mixins:[i,a.Mixin,u],propTypes:{defaultValue:r,value:r},render:function(){var e=p({},this.props);return e.onChange=this._handleChange,e.value=null,d(e,this.props.children)},componentWillMount:function(){this._pendingUpdate=!1},componentDidMount:function(){var e=a.getValue(this);null!=e?o(this,e):null!=this.props.defaultValue&&o(this,this.props.defaultValue)},componentDidUpdate:function(e){var t=a.getValue(this);null!=t?(this._pendingUpdate=!1,o(this,t)):!e.multiple!=!this.props.multiple&&(null!=this.props.defaultValue?o(this,this.props.defaultValue):o(this,this.props.multiple?[]:""))},_handleChange:function(e){var t,r=a.getOnChange(this);return r&&(t=r.call(this,e)),this._pendingUpdate=!0,c.asap(n,this),t}});t.exports=f},{2:2,24:24,27:27,29:29,33:33,55:55,85:85}],50:[function(e,t){"use strict";function n(e,t,n,r){return e===n&&t===r}function r(e){var t=document.selection,n=t.createRange(),r=n.text.length,o=n.duplicate();o.moveToElementText(e),o.setEndPoint("EndToStart",n);var i=o.text.length,a=i+r;return{start:i,end:a}}function o(e){var t=window.getSelection&&window.getSelection();if(!t||0===t.rangeCount)return null;var r=t.anchorNode,o=t.anchorOffset,i=t.focusNode,a=t.focusOffset,u=t.getRangeAt(0),s=n(t.anchorNode,t.anchorOffset,t.focusNode,t.focusOffset),l=s?0:u.toString().length,c=u.cloneRange();c.selectNodeContents(e),c.setEnd(u.startContainer,u.startOffset);var p=n(c.startContainer,c.startOffset,c.endContainer,c.endOffset),d=p?0:c.toString().length,f=d+l,h=document.createRange();h.setStart(r,o),h.setEnd(i,a);var m=h.collapsed;return{start:m?f:d,end:m?d:f}}function i(e,t){var n,r,o=document.selection.createRange().duplicate();"undefined"==typeof t.end?(n=t.start,r=n):t.start>t.end?(n=t.end,r=t.start):(n=t.start,r=t.end),o.moveToElementText(e),o.moveStart("character",n),o.setEndPoint("EndToStart",o),o.moveEnd("character",r-n),o.select()}function a(e,t){if(window.getSelection){var n=window.getSelection(),r=e[l()].length,o=Math.min(t.start,r),i="undefined"==typeof t.end?o:Math.min(t.end,r);if(!n.extend&&o>i){var a=i;i=o,o=a}var u=s(e,o),c=s(e,i);if(u&&c){var p=document.createRange();p.setStart(u.node,u.offset),n.removeAllRanges(),o>i?(n.addRange(p),n.extend(c.node,c.offset)):(p.setEnd(c.node,c.offset),n.addRange(p))}}}var u=e(21),s=e(126),l=e(128),c=u.canUseDOM&&"selection"in document&&!("getSelection"in window),p={getOffsets:c?r:o,setOffsets:c?i:a};t.exports=p},{126:126,128:128,21:21}],51:[function(e,t){"use strict";var n=e(11),r=e(35),o=e(42),i=e(27),a=e(114),u=function(){};i(u.prototype,{construct:function(e){this._currentElement=e,this._stringText=""+e,this._rootNodeID=null,this._mountIndex=0},mountComponent:function(e,t){this._rootNodeID=e;var r=a(this._stringText);return t.renderToStaticMarkup?r:""+r+""},receiveComponent:function(e){if(e!==this._currentElement){this._currentElement=e;var t=""+e;t!==this._stringText&&(this._stringText=t,o.BackendIDOperations.updateTextContentByID(this._rootNodeID,t))}},unmountComponent:function(){r.unmountIDFromEnvironment(this._rootNodeID)}}),t.exports=u},{11:11,114:114,27:27,35:35,42:42}],52:[function(e,t){"use strict";function n(){this.isMounted()&&this.forceUpdate()}var r=e(2),o=e(11),i=e(24),a=e(29),u=e(33),s=e(55),l=e(85),c=e(27),p=e(133),d=(e(150),s.createFactory("textarea")),f=u.createClass({displayName:"ReactDOMTextarea",tagName:"TEXTAREA",mixins:[r,i.Mixin,a],getInitialState:function(){var e=this.props.defaultValue,t=this.props.children;null!=t&&(p(null==e),Array.isArray(t)&&(p(t.length<=1),t=t[0]),e=""+t),null==e&&(e="");var n=i.getValue(this);return{initialValue:""+(null!=n?n:e)}},render:function(){var e=c({},this.props);return p(null==e.dangerouslySetInnerHTML),e.defaultValue=null,e.value=null,e.onChange=this._handleChange,d(e,this.state.initialValue)},componentDidUpdate:function(){var e=i.getValue(this);if(null!=e){var t=this.getDOMNode();o.setValueForProperty(t,"value",""+e)}},_handleChange:function(e){var t,r=i.getOnChange(this);return r&&(t=r.call(this,e)),l.asap(n,this),t}});t.exports=f},{11:11,133:133,150:150,2:2,24:24,27:27,29:29,33:33,55:55,85:85}],53:[function(e,t){"use strict";function n(){this.reinitializeTransaction()}var r=e(85),o=e(101),i=e(27),a=e(112),u={initialize:a,close:function(){p.isBatchingUpdates=!1}},s={initialize:a,close:r.flushBatchedUpdates.bind(r)},l=[s,u];i(n.prototype,o.Mixin,{getTransactionWrappers:function(){return l}});var c=new n,p={isBatchingUpdates:!1,batchedUpdates:function(e,t,n,r,o){var i=p.isBatchingUpdates;p.isBatchingUpdates=!0,i?e(t,n,r,o):c.perform(e,null,t,n,r,o)}};t.exports=p},{101:101,112:112,27:27,85:85}],54:[function(e,t){"use strict";function n(e){return f.createClass({tagName:e.toUpperCase(),render:function(){return new I(e,null,null,null,null,this.props)}})}function r(){R.EventEmitter.injectReactEventListener(T),R.EventPluginHub.injectEventPluginOrder(u),R.EventPluginHub.injectInstanceHandle(P),R.EventPluginHub.injectMount(w),R.EventPluginHub.injectEventPluginsByName({SimpleEventPlugin:k,EnterLeaveEventPlugin:s,ChangeEventPlugin:i,MobileSafariClickEventPlugin:p,SelectEventPlugin:S,BeforeInputEventPlugin:o}),R.NativeComponent.injectGenericComponentClass(v),R.NativeComponent.injectTextComponentClass(N),R.NativeComponent.injectAutoWrapper(n),R.Class.injectMixin(d),R.NativeComponent.injectComponentClasses({button:g,form:y,iframe:b,img:C,input:_,option:x,select:D,textarea:M,html:U("html"),head:U("head"),body:U("body")}),R.DOMProperty.injectDOMPropertyConfig(c),R.DOMProperty.injectDOMPropertyConfig(L),R.EmptyComponent.injectEmptyComponent("noscript"),R.Updates.injectReconcileTransaction(O),R.Updates.injectBatchingStrategy(m),R.RootIndex.injectCreateReactRootIndex(l.canUseDOM?a.createReactRootIndex:A.createReactRootIndex),R.Component.injectEnvironment(h),R.DOMComponent.injectIDOperations(E)}var o=e(3),i=e(7),a=e(8),u=e(13),s=e(14),l=e(21),c=e(23),p=e(26),d=e(29),f=e(33),h=e(35),m=e(53),v=e(42),g=e(41),y=e(43),C=e(46),E=e(44),b=e(45),_=e(47),x=e(48),D=e(49),M=e(52),N=e(51),I=e(55),T=e(60),R=e(62),P=e(64),w=e(68),O=e(78),S=e(87),A=e(88),k=e(89),L=e(86),U=e(109);t.exports={inject:r}},{109:109,13:13,14:14,21:21,23:23,26:26,29:29,3:3,33:33,35:35,41:41,42:42,43:43,44:44,45:45,46:46,47:47,48:48,49:49,51:51,52:52,53:53,55:55,60:60,62:62,64:64,68:68,7:7,78:78,8:8,86:86,87:87,88:88,89:89}],55:[function(e,t){"use strict";var n=e(38),r=e(39),o=e(27),i=(e(150),{key:!0,ref:!0}),a=function(e,t,n,r,o,i){this.type=e,this.key=t,this.ref=n,this._owner=r,this._context=o,this.props=i};a.prototype={_isReactElement:!0},a.createElement=function(e,t,o){var u,s={},l=null,c=null;if(null!=t){c=void 0===t.ref?null:t.ref,l=void 0===t.key?null:""+t.key;for(u in t)t.hasOwnProperty(u)&&!i.hasOwnProperty(u)&&(s[u]=t[u]) -}var p=arguments.length-2;if(1===p)s.children=o;else if(p>1){for(var d=Array(p),f=0;p>f;f++)d[f]=arguments[f+2];s.children=d}if(e&&e.defaultProps){var h=e.defaultProps;for(u in h)"undefined"==typeof s[u]&&(s[u]=h[u])}return new a(e,l,c,r.current,n.current,s)},a.createFactory=function(e){var t=a.createElement.bind(null,e);return t.type=e,t},a.cloneAndReplaceProps=function(e,t){var n=new a(e.type,e.key,e.ref,e._owner,e._context,t);return n},a.cloneElement=function(e,t,n){var u,s=o({},e.props),l=e.key,c=e.ref,p=e._owner;if(null!=t){void 0!==t.ref&&(c=t.ref,p=r.current),void 0!==t.key&&(l=""+t.key);for(u in t)t.hasOwnProperty(u)&&!i.hasOwnProperty(u)&&(s[u]=t[u])}var d=arguments.length-2;if(1===d)s.children=n;else if(d>1){for(var f=Array(d),h=0;d>h;h++)f[h]=arguments[h+2];s.children=f}return new a(e.type,l,c,p,e._context,s)},a.isValidElement=function(e){var t=!(!e||!e._isReactElement);return t},t.exports=a},{150:150,27:27,38:38,39:39}],56:[function(e,t){"use strict";function n(){if(g.current){var e=g.current.getName();if(e)return" Check the render method of `"+e+"`."}return""}function r(e){var t=e&&e.getPublicInstance();if(!t)return void 0;var n=t.constructor;return n?n.displayName||n.name||void 0:void 0}function o(){var e=g.current;return e&&r(e)||void 0}function i(e,t){e._store.validated||null!=e.key||(e._store.validated=!0,u('Each child in an array or iterator should have a unique "key" prop.',e,t))}function a(e,t,n){x.test(e)&&u("Child objects should have non-numeric keys so ordering is preserved.",t,n)}function u(e,t,n){var i=o(),a="string"==typeof n?n:n.displayName||n.name,u=i||a,s=b[e]||(b[e]={});if(!s.hasOwnProperty(u)){s[u]=!0;var l="";if(t&&t._owner&&t._owner!==g.current){var c=r(t._owner);l=" It was passed a child from "+c+"."}}}function s(e,t){if(Array.isArray(e))for(var n=0;n");var u="";o&&(u=" The element was created by "+o+".")}}function p(e,t){return e!==e?t!==t:0===e&&0===t?1/e===1/t:e===t}function d(e){if(e._store){var t=e._store.originalProps,n=e.props;for(var r in n)n.hasOwnProperty(r)&&(t.hasOwnProperty(r)&&p(t[r],n[r])||(c(r,e),t[r]=n[r]))}}function f(e){if(null!=e.type){var t=y.getComponentClassForElement(e),n=t.displayName||t.name;t.propTypes&&l(n,t.propTypes,e.props,v.prop),"function"==typeof t.getDefaultProps}}var h=e(55),m=e(61),v=e(75),g=(e(74),e(39)),y=e(71),C=e(124),E=e(133),b=(e(150),{}),_={},x=/^\d+$/,D={},M={checkAndWarnForMutatedProps:d,createElement:function(e){var t=h.createElement.apply(this,arguments);if(null==t)return t;for(var n=2;no;o++){t=e.ancestors[o];var a=c.getID(t)||"";m._handleTopLevel(e.topLevelType,t,a,e.nativeEvent)}}function i(e){var t=h(window);e(t)}var a=e(16),u=e(21),s=e(28),l=e(64),c=e(68),p=e(85),d=e(27),f=e(123),h=e(129);d(r.prototype,{destructor:function(){this.topLevelType=null,this.nativeEvent=null,this.ancestors.length=0}}),s.addPoolingTo(r,s.twoArgumentPooler);var m={_enabled:!0,_handleTopLevel:null,WINDOW_HANDLE:u.canUseDOM?window:null,setHandleTopLevel:function(e){m._handleTopLevel=e},setEnabled:function(e){m._enabled=!!e},isEnabled:function(){return m._enabled},trapBubbledEvent:function(e,t,n){var r=n;return r?a.listen(r,t,m.dispatchEvent.bind(null,e)):null},trapCapturedEvent:function(e,t,n){var r=n;return r?a.capture(r,t,m.dispatchEvent.bind(null,e)):null},monitorScrollValue:function(e){var t=i.bind(null,e);a.listen(window,"scroll",t)},dispatchEvent:function(e,t){if(m._enabled){var n=r.getPooled(e,t);try{p.batchedUpdates(o,n)}finally{r.release(n)}}}};t.exports=m},{123:123,129:129,16:16,21:21,27:27,28:28,64:64,68:68,85:85}],61:[function(e,t){"use strict";var n=(e(55),e(150),{create:function(e){return e},extract:function(e){return e},extractIfFragment:function(e){return e}});t.exports=n},{150:150,55:55}],62:[function(e,t){"use strict";var n=e(10),r=e(17),o=e(36),i=e(33),a=e(57),u=e(30),s=e(71),l=e(42),c=e(73),p=e(81),d=e(85),f={Component:o.injection,Class:i.injection,DOMComponent:l.injection,DOMProperty:n.injection,EmptyComponent:a.injection,EventPluginHub:r.injection,EventEmitter:u.injection,NativeComponent:s.injection,Perf:c.injection,RootIndex:p.injection,Updates:d.injection};t.exports=f},{10:10,17:17,30:30,33:33,36:36,42:42,57:57,71:71,73:73,81:81,85:85}],63:[function(e,t){"use strict";function n(e){return o(document.documentElement,e)}var r=e(50),o=e(107),i=e(117),a=e(119),u={hasSelectionCapabilities:function(e){return e&&("INPUT"===e.nodeName&&"text"===e.type||"TEXTAREA"===e.nodeName||"true"===e.contentEditable)},getSelectionInformation:function(){var e=a();return{focusedElem:e,selectionRange:u.hasSelectionCapabilities(e)?u.getSelection(e):null}},restoreSelection:function(e){var t=a(),r=e.focusedElem,o=e.selectionRange;t!==r&&n(r)&&(u.hasSelectionCapabilities(r)&&u.setSelection(r,o),i(r))},getSelection:function(e){var t;if("selectionStart"in e)t={start:e.selectionStart,end:e.selectionEnd};else if(document.selection&&"INPUT"===e.nodeName){var n=document.selection.createRange();n.parentElement()===e&&(t={start:-n.moveStart("character",-e.value.length),end:-n.moveEnd("character",-e.value.length)})}else t=r.getOffsets(e);return t||{start:0,end:0}},setSelection:function(e,t){var n=t.start,o=t.end;if("undefined"==typeof o&&(o=n),"selectionStart"in e)e.selectionStart=n,e.selectionEnd=Math.min(o,e.value.length);else if(document.selection&&"INPUT"===e.nodeName){var i=e.createTextRange();i.collapse(!0),i.moveStart("character",n),i.moveEnd("character",o-n),i.select()}else r.setOffsets(e,t)}};t.exports=u},{107:107,117:117,119:119,50:50}],64:[function(e,t){"use strict";function n(e){return d+e.toString(36)}function r(e,t){return e.charAt(t)===d||t===e.length}function o(e){return""===e||e.charAt(0)===d&&e.charAt(e.length-1)!==d}function i(e,t){return 0===t.indexOf(e)&&r(t,e.length)}function a(e){return e?e.substr(0,e.lastIndexOf(d)):""}function u(e,t){if(p(o(e)&&o(t)),p(i(e,t)),e===t)return e;var n,a=e.length+f;for(n=a;n=a;a++)if(r(e,a)&&r(t,a))i=a;else if(e.charAt(a)!==t.charAt(a))break;var u=e.substr(0,i);return p(o(u)),u}function l(e,t,n,r,o,s){e=e||"",t=t||"",p(e!==t);var l=i(t,e);p(l||i(e,t));for(var c=0,d=l?a:u,f=e;;f=d(f,t)){var m;if(o&&f===e||s&&f===t||(m=n(f,l,r)),m===!1||f===t)break;p(c++1){var t=e.indexOf(d,1);return t>-1?e.substr(0,t):e}return null},traverseEnterLeave:function(e,t,n,r,o){var i=s(e,t);i!==e&&l(e,i,n,r,!1,!0),i!==t&&l(i,t,n,o,!0,!1)},traverseTwoPhase:function(e,t,n){e&&(l("",e,t,n,!0,!1),l(e,"",t,n,!1,!0))},traverseAncestors:function(e,t,n){l("",e,t,n,!0,!1)},_getFirstCommonAncestorID:s,_getNextDescendantID:u,isAncestorIDOf:i,SEPARATOR:d};t.exports=m},{133:133,81:81}],65:[function(e,t){"use strict";var n={remove:function(e){e._reactInternalInstance=void 0},get:function(e){return e._reactInternalInstance},has:function(e){return void 0!==e._reactInternalInstance},set:function(e,t){e._reactInternalInstance=t}};t.exports=n},{}],66:[function(e,t){"use strict";var n={currentlyMountingInstance:null,currentlyUnmountingInstance:null};t.exports=n},{}],67:[function(e,t){"use strict";var n=e(104),r={CHECKSUM_ATTR_NAME:"data-react-checksum",addChecksumToMarkup:function(e){var t=n(e);return e.replace(">"," "+r.CHECKSUM_ATTR_NAME+'="'+t+'">')},canReuseMarkup:function(e,t){var o=t.getAttribute(r.CHECKSUM_ATTR_NAME);o=o&&parseInt(o,10);var i=n(e);return i===o}};t.exports=r},{104:104}],68:[function(e,t){"use strict";function n(e,t){for(var n=Math.min(e.length,t.length),r=0;n>r;r++)if(e.charAt(r)!==t.charAt(r))return r;return e.length===t.length?-1:n}function r(e){var t=T(e);return t&&K.getID(t)}function o(e){var t=i(e);if(t)if(k.hasOwnProperty(t)){var n=k[t];n!==e&&(P(!l(n,t)),k[t]=e)}else k[t]=e;return t}function i(e){return e&&e.getAttribute&&e.getAttribute(A)||""}function a(e,t){var n=i(e);n!==t&&delete k[n],e.setAttribute(A,t),k[t]=e}function u(e){return k.hasOwnProperty(e)&&l(k[e],e)||(k[e]=K.findReactNodeByID(e)),k[e]}function s(e){var t=E.get(e)._rootNodeID;return y.isNullComponentID(t)?null:(k.hasOwnProperty(t)&&l(k[t],t)||(k[t]=K.findReactNodeByID(t)),k[t])}function l(e,t){if(e){P(i(e)===t);var n=K.findReactContainerForID(t);if(n&&I(n,e))return!0}return!1}function c(e){delete k[e]}function p(e){var t=k[e];return t&&l(t,e)?void(j=t):!1}function d(e){j=null,C.traverseAncestors(e,p);var t=j;return j=null,t}function f(e,t,n,r,o){var i=x.mountComponent(e,t,r,N);e._isTopLevel=!0,K._mountImageIntoNode(i,n,o)}function h(e,t,n,r){var o=M.ReactReconcileTransaction.getPooled();o.perform(f,null,e,t,n,o,r),M.ReactReconcileTransaction.release(o)}var m=e(10),v=e(30),g=(e(39),e(55)),y=(e(56),e(57)),C=e(64),E=e(65),b=e(67),_=e(73),x=e(79),D=e(84),M=e(85),N=e(113),I=e(107),T=e(127),R=e(132),P=e(133),w=e(144),O=e(147),S=(e(150),C.SEPARATOR),A=m.ID_ATTRIBUTE_NAME,k={},L=1,U=9,F={},B={},V=[],j=null,K={_instancesByReactRootID:F,scrollMonitor:function(e,t){t()},_updateRootComponent:function(e,t,n,r){return K.scrollMonitor(n,function(){D.enqueueElementInternal(e,t),r&&D.enqueueCallbackInternal(e,r)}),e},_registerComponent:function(e,t){P(t&&(t.nodeType===L||t.nodeType===U)),v.ensureScrollValueMonitoring();var n=K.registerContainer(t);return F[n]=e,n},_renderNewRootComponent:function(e,t,n){var r=R(e,null),o=K._registerComponent(r,t);return M.batchedUpdates(h,r,o,t,n),r},render:function(e,t,n){P(g.isValidElement(e));var o=F[r(t)];if(o){var i=o._currentElement;if(O(i,e))return K._updateRootComponent(o,e,t,n).getPublicInstance();K.unmountComponentAtNode(t)}var a=T(t),u=a&&K.isRenderedByReact(a),s=u&&!o,l=K._renderNewRootComponent(e,t,s).getPublicInstance();return n&&n.call(l),l},constructAndRenderComponent:function(e,t,n){var r=g.createElement(e,t);return K.render(r,n)},constructAndRenderComponentByID:function(e,t,n){var r=document.getElementById(n);return P(r),K.constructAndRenderComponent(e,t,r)},registerContainer:function(e){var t=r(e);return t&&(t=C.getReactRootIDFromNodeID(t)),t||(t=C.createReactRootID()),B[t]=e,t},unmountComponentAtNode:function(e){P(e&&(e.nodeType===L||e.nodeType===U));var t=r(e),n=F[t];return n?(K.unmountComponentFromNode(n,e),delete F[t],delete B[t],!0):!1},unmountComponentFromNode:function(e,t){for(x.unmountComponent(e),t.nodeType===U&&(t=t.documentElement);t.lastChild;)t.removeChild(t.lastChild)},findReactContainerForID:function(e){var t=C.getReactRootIDFromNodeID(e),n=B[t];return n},findReactNodeByID:function(e){var t=K.findReactContainerForID(e);return K.findComponentRoot(t,e)},isRenderedByReact:function(e){if(1!==e.nodeType)return!1;var t=K.getID(e);return t?t.charAt(0)===S:!1},getFirstReactDOM:function(e){for(var t=e;t&&t.parentNode!==t;){if(K.isRenderedByReact(t))return t;t=t.parentNode}return null},findComponentRoot:function(e,t){var n=V,r=0,o=d(t)||e;for(n[0]=o.firstChild,n.length=1;r>",b=a(),_=p(),x={array:r("array"),bool:r("boolean"),func:r("function"),number:r("number"),object:r("object"),string:r("string"),any:o(),arrayOf:i,element:b,instanceOf:u,node:_,objectOf:l,oneOf:s,oneOfType:c,shape:d};t.exports=x},{112:112,55:55,61:61,74:74}],77:[function(e,t){"use strict";function n(){this.listenersToPut=[]}var r=e(28),o=e(30),i=e(27);i(n.prototype,{enqueuePutListener:function(e,t,n){this.listenersToPut.push({rootNodeID:e,propKey:t,propValue:n})},putListeners:function(){for(var e=0;en;n++){var r=v[n],o=r._pendingCallbacks;if(r._pendingCallbacks=null,d.performUpdateIfNecessary(r,e.reconcileTransaction),o)for(var a=0;a":">","<":"<",'"':""","'":"'"},i=/[&><"']/g;t.exports=r},{}],115:[function(e,t){"use strict";function n(e){return null==e?null:a(e)?e:r.has(e)?o.getNodeFromInstance(e):(i(null==e.render||"function"!=typeof e.render),void i(!1))}{var r=(e(39),e(65)),o=e(68),i=e(133),a=e(135);e(150)}t.exports=n},{133:133,135:135,150:150,39:39,65:65,68:68}],116:[function(e,t){"use strict";function n(e,t,n){var r=e,o=!r.hasOwnProperty(n);o&&null!=t&&(r[n]=t)}function r(e){if(null==e)return e;var t={};return o(e,n,t),t}{var o=e(149);e(150)}t.exports=r},{149:149,150:150}],117:[function(e,t){"use strict";function n(e){try{e.focus()}catch(t){}}t.exports=n},{}],118:[function(e,t){"use strict";var n=function(e,t,n){Array.isArray(e)?e.forEach(t,n):e&&t.call(n,e)};t.exports=n},{}],119:[function(e,t){function n(){try{return document.activeElement||document.body}catch(e){return document.body}}t.exports=n},{}],120:[function(e,t){"use strict";function n(e){var t,n=e.keyCode;return"charCode"in e?(t=e.charCode,0===t&&13===n&&(t=13)):t=n,t>=32||13===t?t:0}t.exports=n},{}],121:[function(e,t){"use strict";function n(e){if(e.key){var t=o[e.key]||e.key;if("Unidentified"!==t)return t}if("keypress"===e.type){var n=r(e);return 13===n?"Enter":String.fromCharCode(n)}return"keydown"===e.type||"keyup"===e.type?i[e.keyCode]||"Unidentified":""}var r=e(120),o={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},i={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"};t.exports=n},{120:120}],122:[function(e,t){"use strict";function n(e){var t=this,n=t.nativeEvent;if(n.getModifierState)return n.getModifierState(e);var r=o[e];return r?!!n[r]:!1}function r(){return n}var o={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};t.exports=r},{}],123:[function(e,t){"use strict";function n(e){var t=e.target||e.srcElement||window;return 3===t.nodeType?t.parentNode:t}t.exports=n},{}],124:[function(e,t){"use strict";function n(e){var t=e&&(r&&e[r]||e[o]);return"function"==typeof t?t:void 0}var r="function"==typeof Symbol&&Symbol.iterator,o="@@iterator";t.exports=n},{}],125:[function(e,t){function n(e){return o(!!i),p.hasOwnProperty(e)||(e="*"),a.hasOwnProperty(e)||(i.innerHTML="*"===e?"":"<"+e+">",a[e]=!i.firstChild),a[e]?p[e]:null}var r=e(21),o=e(133),i=r.canUseDOM?document.createElement("div"):null,a={circle:!0,defs:!0,ellipse:!0,g:!0,line:!0,linearGradient:!0,path:!0,polygon:!0,polyline:!0,radialGradient:!0,rect:!0,stop:!0,text:!0},u=[1,'"],s=[1,"","
"],l=[3,"","
"],c=[1,"",""],p={"*":[1,"?
","
"],area:[1,"",""],col:[2,"","
"],legend:[1,"
","
"],param:[1,"",""],tr:[2,"","
"],optgroup:u,option:u,caption:s,colgroup:s,tbody:s,tfoot:s,thead:s,td:l,th:l,circle:c,defs:c,ellipse:c,g:c,line:c,linearGradient:c,path:c,polygon:c,polyline:c,radialGradient:c,rect:c,stop:c,text:c};t.exports=n},{133:133,21:21}],126:[function(e,t){"use strict";function n(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function r(e){for(;e;){if(e.nextSibling)return e.nextSibling;e=e.parentNode}}function o(e,t){for(var o=n(e),i=0,a=0;o;){if(3===o.nodeType){if(a=i+o.textContent.length,t>=i&&a>=t)return{node:o,offset:t-i};i=a}o=n(r(o))}}t.exports=o},{}],127:[function(e,t){"use strict";function n(e){return e?e.nodeType===r?e.documentElement:e.firstChild:null}var r=9;t.exports=n},{}],128:[function(e,t){"use strict";function n(){return!o&&r.canUseDOM&&(o="textContent"in document.documentElement?"textContent":"innerText"),o}var r=e(21),o=null;t.exports=n},{21:21}],129:[function(e,t){"use strict";function n(e){return e===window?{x:window.pageXOffset||document.documentElement.scrollLeft,y:window.pageYOffset||document.documentElement.scrollTop}:{x:e.scrollLeft,y:e.scrollTop}}t.exports=n},{}],130:[function(e,t){function n(e){return e.replace(r,"-$1").toLowerCase()}var r=/([A-Z])/g;t.exports=n},{}],131:[function(e,t){"use strict";function n(e){return r(e).replace(o,"-ms-")}var r=e(130),o=/^ms-/;t.exports=n},{130:130}],132:[function(e,t){"use strict";function n(e){return"function"==typeof e&&"function"==typeof e.prototype.mountComponent&&"function"==typeof e.prototype.receiveComponent}function r(e,t){var r;if((null===e||e===!1)&&(e=i.emptyElement),"object"==typeof e){var o=e;r=t===o.type&&"string"==typeof o.type?a.createInternalComponent(o):n(o.type)?new o.type(o):new l}else"string"==typeof e||"number"==typeof e?r=a.createInstanceForText(e):s(!1);return r.construct(e),r._mountIndex=0,r._mountImage=null,r}var o=e(37),i=e(57),a=e(71),u=e(27),s=e(133),l=(e(150),function(){});u(l.prototype,o.Mixin,{_instantiateReactComponent:r}),t.exports=r},{133:133,150:150,27:27,37:37,57:57,71:71}],133:[function(e,t){"use strict";var n=function(e,t,n,r,o,i,a,u){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var l=[n,r,o,i,a,u],c=0;s=new Error("Invariant Violation: "+t.replace(/%s/g,function(){return l[c++]}))}throw s.framesToPop=1,s}};t.exports=n},{}],134:[function(e,t){"use strict";function n(e,t){if(!o.canUseDOM||t&&!("addEventListener"in document))return!1;var n="on"+e,i=n in document;if(!i){var a=document.createElement("div");a.setAttribute(n,"return;"),i="function"==typeof a[n]}return!i&&r&&"wheel"===e&&(i=document.implementation.hasFeature("Events.wheel","3.0")),i}var r,o=e(21);o.canUseDOM&&(r=document.implementation&&document.implementation.hasFeature&&document.implementation.hasFeature("","")!==!0),t.exports=n},{21:21}],135:[function(e,t){function n(e){return!(!e||!("function"==typeof Node?e instanceof Node:"object"==typeof e&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName))}t.exports=n},{}],136:[function(e,t){"use strict";function n(e){return e&&("INPUT"===e.nodeName&&r[e.type]||"TEXTAREA"===e.nodeName)}var r={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};t.exports=n},{}],137:[function(e,t){function n(e){return r(e)&&3==e.nodeType}var r=e(135);t.exports=n},{135:135}],138:[function(e,t){"use strict";var n=e(133),r=function(e){var t,r={};n(e instanceof Object&&!Array.isArray(e));for(t in e)e.hasOwnProperty(t)&&(r[t]=t);return r};t.exports=r},{133:133}],139:[function(e,t){var n=function(e){var t;for(t in e)if(e.hasOwnProperty(t))return t;return null};t.exports=n},{}],140:[function(e,t){"use strict";function n(e,t,n){if(!e)return null;var o={};for(var i in e)r.call(e,i)&&(o[i]=t.call(n,e[i],i,e));return o}var r=Object.prototype.hasOwnProperty;t.exports=n},{}],141:[function(e,t){"use strict";function n(e){var t={};return function(n){return t.hasOwnProperty(n)||(t[n]=e.call(this,n)),t[n]}}t.exports=n},{}],142:[function(e,t){"use strict";function n(e){return o(r.isValidElement(e)),e}var r=e(55),o=e(133);t.exports=n},{133:133,55:55}],143:[function(e,t){"use strict";function n(e){return'"'+r(e)+'"'}var r=e(114);t.exports=n},{114:114}],144:[function(e,t){"use strict";var n=e(21),r=/^[ \r\n\t\f]/,o=/<(!--|link|noscript|meta|script|style)[ \r\n\t\f\/>]/,i=function(e,t){e.innerHTML=t};if("undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction&&(i=function(e,t){MSApp.execUnsafeLocalFunction(function(){e.innerHTML=t})}),n.canUseDOM){var a=document.createElement("div");a.innerHTML=" ",""===a.innerHTML&&(i=function(e,t){if(e.parentNode&&e.parentNode.replaceChild(e,e),r.test(t)||"<"===t[0]&&o.test(t)){e.innerHTML=""+t;var n=e.firstChild;1===n.data.length?e.removeChild(n):n.deleteData(0,1)}else e.innerHTML=t})}t.exports=i},{21:21}],145:[function(e,t){"use strict";var n=e(21),r=e(114),o=e(144),i=function(e,t){e.textContent=t};n.canUseDOM&&("textContent"in document.documentElement||(i=function(e,t){o(e,r(t))})),t.exports=i},{114:114,144:144,21:21}],146:[function(e,t){"use strict";function n(e,t){if(e===t)return!0;var n;for(n in e)if(e.hasOwnProperty(n)&&(!t.hasOwnProperty(n)||e[n]!==t[n]))return!1;for(n in t)if(t.hasOwnProperty(n)&&!e.hasOwnProperty(n))return!1;return!0}t.exports=n},{}],147:[function(e,t){"use strict";function n(e,t){if(null!=e&&null!=t){var n=typeof e,r=typeof t;if("string"===n||"number"===n)return"string"===r||"number"===r;if("object"===r&&e.type===t.type&&e.key===t.key){var o=e._owner===t._owner;return o}}return!1}e(150);t.exports=n},{150:150}],148:[function(e,t){function n(e){var t=e.length;if(r(!Array.isArray(e)&&("object"==typeof e||"function"==typeof e)),r("number"==typeof t),r(0===t||t-1 in e),e.hasOwnProperty)try{return Array.prototype.slice.call(e)}catch(n){}for(var o=Array(t),i=0;t>i;i++)o[i]=e[i];return o}var r=e(133);t.exports=n},{133:133}],149:[function(e,t){"use strict";function n(e){return m[e]}function r(e,t){return e&&null!=e.key?i(e.key):t.toString(36)}function o(e){return(""+e).replace(v,n)}function i(e){return"$"+o(e)}function a(e,t,n,o,u){var c=typeof e;if(("undefined"===c||"boolean"===c)&&(e=null),null===e||"string"===c||"number"===c||s.isValidElement(e))return o(u,e,""===t?f+r(e,0):t,n),1;var m,v,g,y=0;if(Array.isArray(e))for(var C=0;C - - - - vaadin-grid Code Examples - React Integration - - - - - - - - - - - - - - -
- - - - - diff --git a/demo/react.html b/demo/react.html deleted file mode 100644 index 2194537..0000000 --- a/demo/react.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - vaadin-core-elements Code Examples - React Integration - - - - - - - - - - -
-

React Integration

-

This example demonstrates using vaadin-grid with React framework. - As React doesn't support custom attributes for elements, - vaadin-grid DOM API can't be fully utilized in the initialization.

-

Fortunately vaadin-grid also provides corresponding JavaScript APIs.

-

Note: vaadin-grid is not a React component. Instead, it must be - used with React like any JavaScript class. Please see the code example below or the - React documentation - for more information.

- -
-
-
- -
- -
- - -
- - - diff --git a/docs/integrations/img/react-integration.png b/docs/integrations/img/react-integration.png new file mode 100644 index 0000000000000000000000000000000000000000..7490bd2e81219aae81385809f79b2ebb354364b1 GIT binary patch literal 225915 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/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 kb?;+%RBs^p85W~w6&QN8fCvu^K`e}wl#+$ zl-$rVOAyE|WCJ}C9{RggV}=&4p7bAAbwW*z`Bvl6hwiCfQrZ`f9{Y}*P1^l#cPgtT zBD#BVB={AJV}u<+{C-QGQm+>!pWv#YRSS)vrmN`ie~G6Oa;y+xIip{YZMY@Z#H^Bq zr5v!BgK{_?m398(gz-Q^jQOG<`+>>qfDWfXrbFs-)QBT19}C($B@RxI5C@cG2rtDi z&>K}fxrX8!$n7qv^xG{;y6scrb0nPGKSz-tDwv&O8 z*a0fUt0+rh-y{o`DksL^EXIxK6NKqoTtr$*+p5o_lh3?Bp`6Rf8mDfNQsdXDIkp~5 z_c6jEQrCeYGjRl>BsA~MdNM96s<(3s&rUU_=Y1_{pl9H+)A_gO7dP8qPfpJ#ep7tFrrW{4)od~@$KZAOC=!4m zrAw9Gpm*N87uoEB#Oy!Hj<5a;n(n20V?8t{z`^Q}*%H6)v3>_9_uoh_2>&(4WHBlA zEdCI|@urk)L~seFP}P;#@Hp@+t%*)gW_d*Cpuy~74Y~E4)u6DtJ*GWAEAcFGv%!Sa z*k9eh$oYf{TUlFme67$MR;qx1w9prkV?Jo~mRti-16O--!5-b2OyH-)k(WcF`Sv+7 z`R4^~_A)^DRa4gsn=0F!xfq#ehD{jXuzkuyZ0R+LfS9LAgj^z16qU`81mMGu_{aG|4kh>>GQ?7-ON6&8p-K(YNB zon>2F5Hx)tc)iILDQ5j60m5}c%0g;uFb>c!C~kdf%@~GC3?U94X&@LdI$DkE1089+ zrC=gd7ADc`AJNO;Ml&_rsQ<5-2;wH%oWnw8^4Sqmz=h|dj^u0$S12YWsQXB_w`^u; zW6_rz#i*wrUzH?aUCO7omOHu~ANzG1#WQXvH~&s9tfd%uVZ{-RGd}6g1*cmT3Cw(0 z2AzHv8T(oNAoWKi&SusuEpiO5mzby58@NMM3<3Ncud8tsT!^y{S*jrCU^`Q^98tleTCtt?@wJ{B27r({jE^c7Z+Mz{uen?$!_RLkM@s2oLW2w!hOjA z5iA52cVQRfNath$GJjSU|J$4S%IdCx1N^E3t; zhAySm!3H0|--^#g@wmrE?1aYQxm{ZC+uXmFeORfqWLb*w4rp_^1*#GP!NuMadS;+L zzVjk0N(THN1^e(bG$fXKyhp9(HW2cYQMqB8zDpNWuTs+Mg8MV>vv2WT6HL**5cf1j zwga!!F|%HktG!_voy(ma`lKT5;8DlicB2u--?$^n0aXn+?GpoL4pXr}-}lFDSjI6G zO(V-M9qby!InAEqB18a#yzP6Zht&ytL``7Qk4R`<5DDTX-f#UTTk)fQ!M~02t?-B& zRDf*^z2;5KRdlnN_K9D>$S*g6l(DiSSb6L=V(`fux6~07lMGhuHWAIBmvxMTqJ>M; zZ^v?o&CIE*bn=LLf4LIVt{bwdyZoQ-7ppe{qpphuBO^gBgjg2lWy`+nx4URa>v#Yq z?<~gbAag$xCjB`ScSkt#L0p*Q#(Ev5@c39f{Et%vxL&!f|CI! zoc4=89gn^C3>`*Tx85&-?6;i9j?8aiMfL>jGQ+SM_ise8mG-)cQo{KtfcPUPcLXWZ z&}k&jPn1@DRg^r{Q1(NrtVdB{)J-}+-KjTwk(S*YT<5JLP^ipm$Xd&{Ujl7!A4x5D z)+_Y+(RTlmWm*dg$xXT@01YUcQT-(6UsXyr#{S}H_wkDqis(c|*0(wP+@#yoU4x)Zzc?Xx zFB$L2bnU~I%VYKf$4s-)q?Ey5#^LmSd|{0eiPREH=Jm1>oo^E^8-cfMIs&o-74!G7 z_WCHR(w)!UECBo?Ptd@{qEnTG9@J*Nh<5GdZ*#;pFWqD`aDi~-{?>Eg;(rfhcn-7) z*JV4k_L<|N{^YVEpC0pU4!3x*pmm^PP6|V*WL){%$KV9fb)M+{5=?V#ouH?BfiW1Mr|P`&m^ zEtap(*vsEEUI=GGNMnMxGJ43Ogq&S2Ox8Pk+a)8VBg<_i35HF0_h|QXNQWCrv++sU zc(}RlkFVdrhW&!$g3Jr_Ye?N^uv~sg_Lb|YGB4uvpqlz$U-i}$8&r(v=;Yj-*Df~$ zAJ$!h-(#vfpS%O=Lqtd|qm7Ka2%B;NeToGs z{zaP1XD-f(2G;gs-)5Tb<9jeZ__kj}vy|8KR%w_~Bx5fd3rZyDe zZIODkN%$BU%Dp5ku0_jn=Z_tY8;HG9o`q26gusr51V@NcWsk}X*kJ!-{)6C+%$xR9*%zKUAr>>8tieeZ zrCKZQ-RVPaCuQ5OetR&A`IOeNyxC(BIg9EzE&f4r2y)p<#nk#AWgAJ*k>Uu(u?QxX zS#F2gEyBb;0!1emyYI3jDpupa6~O1`H);m@!Ag}s#yBZVBD%a(L|52r;3;#!sclaT z_@I)obz=Hdn~-57uZo`=Q{cv@l?wQCaP5<~H5^Gq2p*b~dSQ^ilv4y|iYUr`tzCEyveDR>$@#**Rn@aU<*uK0+@d6>e+!_>5C-Z;gP2EhQ%|4{FUJ0rAfh8hEyty0)VEhH<#=_W zk>HN8_Rx0z@(y<_yZ5uf(8Tv-|CTRa$_FYGt#`F5Q(L1is|!>{(>*EC$zDQ^zVm;q9v+KKZ@m$Wj_~lJWAUny-_#l zzaItQlJlQ&oD-SC5przkUCl;!V5!oth%8Mk%I{09{Q`ZP->JJ6bh_QqQ5y^`nEU^+FYiQM|r|mDEv+Aa+*Z;4# zib0lTTvN6^FsMTYi}EW|wy`wrG9wKEGIow@{^#K{Mq3Fx&jW`j8!7HNa@@Eyi}?C} z*#r0&YqZa{gvS%H*Z~ciIB^lH^HDp8q!H9CPb)dt1|5^)d%@Kb0?lG!2pzxAcMwc8 zDH}r1QA$+xB(GL*OSDXOKZ!T{MEt3~JuwQK8w7xei{Eg=OYIsF&unk-igYO~fsvwp zS=sOkX9xOMDRi@i!Xi-*!Gr>_4HN-WU(LS9#2~I=5MZ5Ui?G;y%tO!H4pd1KWs$BG zf14?)a+|Xh&3(TQ0h_+PUB17yU3N-3xrDqC;S&01%4@|sM>Xfun=*-0$p%U)Fs@_r z6AnD@z-I}P$-AT@l(F_n0}s~*2%omu{2Rl$G~uO!j3c~*SBYx(9raM~NC29esP~3i5eRP9{7%fI_F>LTC_58$Z}|%#fIv z{M9ED7PT~^N~4=ccDO^X=Qb~!CRQqjDf(qq3+YL8g*T+2!o;O#eQl17_z@Ryy=~~M~4J$+WTDnXo zZpj`anVtO(VB9WKZ+1fl`jXZQTb5pZ4O`NP7tn^$xV0y?wzlC2p61YZeV))Y?Yqm% zLdINnO8J8l=^Urnz~YKhkAhgr1);J&V}?BTEt-Zz#o~>LY^QNsLga>jUuoQ^glTDb zRs9n|0n^vF&9Vf#@PLayTiVYl#i|hhXR@-94Q=49CS*EACPmX_V1Ecl5#dLkMU-mb zr)jfb%n)@YXyTcOWi5?lvYOYiILL$gQ0L@Z9Km|)()quUMhqjyyJbp`=A+{T*2e7c zWc$b;`Ch{P&l1Hli)z2Z`D&`iLXNs+$*({C?)MLy!#Jd!2d z)+rFsO>rrOrLWl45++m_wFB@UcDKSAo*V~*yMmtX^Tc1@FtfD{5rTG_~BayxMNkvlhNs!1CFX;J( z!Be~FV~*vAT{)bv8n|zj1iwT5l6xIZ$?E1KlJQR1dvgsB4tXRP8~Ie#wmdK-vhg(G z1O<^#xE0IAzM9OtxUGbmox3kyEJDYXI#ccQ>gc zG~Y1zpd7hYk;gh)o45)wB74K)%eIs<+S#yv9gur1mb^ta`dMJ71h>xfWxvYZ^huFP zG(D1OyF2uXIT#K(kQ5OM8pQ&NO=VIU;>O?5Vzpy>!4BflUG;hmOQi8+j#UZ8vOkb1Z~tb&3HCAAx8lt z9^`FAVL86;HprVECSNmNEe3YOJh%J-k}SnQU4%u|jWEN~9iSA%zZBNgO!UFW$EUl6 zq!5zPIk}!>3rI?FSc2Qpj#K(JH|P00mJFeBy@0MfeFFpiTSIzrg5O^@H#>a8x(Owe zAdrI}q=X`xNPW#cJQ7|D@6^3>`*j=$R5)QA*r+s$LY|DA)3UU@X$=}u4EONdUU6d_ z8Z=asI5nIQ%R$yWItV4wLW1$4*XV$VkA;R?b4Lt?`9z<@_{x0Q8Hh;kvddk6b|TZ( z>hw>1$@9001Ar#$6-R5`iqJS{JBM$_45a?yM2m2kT31ln>q)1yp?Wm$k1`>)IpC*3J zxvlMq7b!3;H5d8M?@j<^X74$ohPLEN?xS$8j4j`1YJ1BJz@G?)h``T()Wje!d4uYX{;ZAup}eL=TaSp2MtM!+xCZ59N%Ejo34rz@72?pHnS;bnb9v# z=J{14)Z5|Mo9EztD(YDQXAplP876(8fsH0BDh76Qe6 zFMq#%f1QJ9ogeS6E+8Y(;8(7)yBqlLM8RN)B_I68-}Q2kcL~9wYZwd z5a$C=e8woM#M))`xD8C5*=Z6@0DU)gIF>4U zuNM+O)vs{mF?1I@dVQK-yqVs2$arWFT{p^!UL4s_@)t zYY%B2f||aZZED($wH8bt23jc{1GGSIeSNUS!$Wj1SKZ7~bDWbn04L9#XDCaT>~g;o zwV41PA<;EdTN3W>Ac)~M+cv8dHnJ zQ2&PN#!N5&Is1hlpRd1Pa9%Zkh!2Nl$70d3Eq$&9~j_WedHU zPgu?J!KB!jU=ZPly&x~R0r&M?^LAvY5Mc4Zmml*{vL13KHoS@jcK_;PeY(1PtRFr; zetbJ@;z#oClHTa>zc$E>&Rlg4Saq&Uk!OX3^B=kJohn$g-+$% zzM44YZ))=CtAUUGsGR5y@zaKh5o_ht4=aZ5dM_!E(z4B6Z%vIn8R-W04BFhW#ch1Y z+{nB!LUmX)Mq8n~{I>fA?y}c_6^mxx*z?1w*4q3p4Tf1sx|cP0G5wUXH;m`J5qLNQ zYM})N@F?cOzf958T=c<=fllEA%lxq_cyF zS=YF# zY|LdWrZtV^zlZQ@?x!Vf2;EI#5F=X%5yQ@NrlaAZZ+>EyR{7RqSqA(#wi}%urIZIG zXJZMgl$8!9k}9`S;t}Y2x&WT=R`1MZd{V|iukOA|C(rN*Cgj({I+)L^zA$<96(arK zCmGau(J=0^*|q8{KT>_vrFbYT9&Ik}YP^q)q-NAiod3COA+NjLhf(n?>v1Yi z2j-ak{lKsNoePEcRm~Fm*HQ{W3DguAG<7&wu)UH!&}&m!nKvf00#TAiA-N{!O<8YOJ7J z!dHhsZERAXAot8cQx|x>3+(d_I(6w#%<4F_-|MLv$&JwV)Vyf}eGBJv z8dAOX&&n}{oC1TC40PnfA+6|yd%wu(cA>1YuMVHx{wv$5LMW_9PyP~8^;LJ_CRny- zDlcZfiR%}$r@lO_%?#t=jC+z&G`29T6u$B>k-X;RDBht?g#5lvlJ%q#(bVceq1sDu z!Rjd`T$IgBrt;4g6JhOap1Q*#EcG2}Yz1qddPJ;F-=~}PRq$?K$9Sn6d~Z`v02)J7 zAL3E?B|iwqjKhlc;awQhKwbyM~O&OLVK%%1F{xYMePzP=N7|`SkJFVl}5R z;B{FTq8ko>;s3}mvJA^7&v~#FuEsTaOKPd&27URZQ`v1Y9}ZDRrp!D?wZA%pcamy< z_!IKTvnAP=ANi*p|3}q1w%4_`T{v!RH@0otww)C_E4FPrY0%h48{1}M+i2Q%yjDa0oavWaoB&gPPY&h3DV`ZS{BimogzT0l9C3g6W+&VU< zCW(Y*CdPPLv(Bg0U5lDoZ7)HcF>yQuC$XI&-cs$DRcHCaeN1+MHDOZ%P zehn0eLI*ku{Js7<@)5eYqUj=!g36dc5!j#Bv!9M%s#(0Gh$tewyMUdUODOxldF;VL zoPR$vbU^;z>m(V(VKye269{7TIuQp`-Pzg+LAH#p$WnUf8PZj|@3?L}3l6uQ@7aY= z$3FYAg=1pftrQeO;|1`Q#wSSfN=P6fQVUYy&<*4*XGcQc_LCN&c)-$_(M13p+aAyj z>X!bQ8j^OmLP#Xuu3T=EL6Xfk;|20#kce?QF-w(1&D_2~G zie7Xgdkida)3DHe>AoxOY{Kx>Ye{VtGaXkQTFgnLqr_xy{)yHb$Q3R{R=@Hjj)>fN zq1|22wkKJ=0+bWJbFH%%BIgor2sts>^P5Y~CNmk}23>q8#RK2>A_o^S^fS~Z?%nzR zygpM05s*!y9LNOHL#7F=DfBkyy$hkC`DX|e9xJ7FjYWKYHzT91NHJsU{hC5%H zsDV3~?i_S$x@pzOq#&n<=bIld79(DXG=-u-zw!#H$C?W#D#OH_N0s5D@W4o20LYcx z*j4w7ZB?p7viGs=)F;FU72X2V)dO9${|)oxik}vQlh(lOu1D!3xO3vHKlzNLUsl15 z8oC8%t!5hzqo4zWCC*Ed!&;Z&re^0C-5v9{0mByn;5*Yq_p<8Hiqdz2*77L>f9Y!j zBMaHVlqY{3F;N-ML6F?MZC0yV!yGCpnz`sgdf*O18F~D6><)ao=LCQ!92DtzH6TCM z4dUIsBEM!yw@t|tN91u^JH^_3{0Bn=$5`st#cw4@S4(ZG!N87 zMa9q$)tUk4N$t85MKIC>B=sWlWX zsjvn9U=qy;Ba}+XRL$^i-t2vQpLXZ#0mbGl3+A8G76uQ%6<+uLKz7)6Z<3jOf>hlK z@0k?v;M?~tma41D-$%YT(ePf2&m+QR%079h*m53b38}PQUvS*yDI*E7{K23Jb+d{+iC-vkxA3id|<1-1P zyv)I5cDVj9P%_}?YWvzF(ag|U-k`^=dwMQ%CkT}vN-XlrQvk~jeJ~E+W#q1N;|Zm` z3zcu?9JcHRuBRozGnjI7`t7^&qP}T$$W)caY@8QkE3;#|Oxz`Bw8IPwzCc=DdZ$p*Z&?SC=@#V&E)e{~ zJd6*6i{wGK&&S9%VY09H*J$B9uIf_1&Z?M5QRx~juSdbNb=Dx!JBI^s8`)8zKazT> zp-aHYuw9JvVri#c(8dc$a2d{jgUsd>?%4|@lw=VhM3wxIrg@zNNC>Ai>Kgp}@ewYI zDCQ?;&y^tdsKBJJUIK+`bfrKl$MI8kFh^xWmA%gREqNx_s=c07!12Pkh3TQ&&)BL< zp+45Y`*u#dCMM^DLh%2282oPr$m@vM$M1&I1lRuV)z;Upv<}4BsXkYFhSQlMUN+Y* z`oXh+GSzKP)UFBtr;fC_h3rCk{l@+CiMosS=IU!7vJG1k;FHXS6{|1xysn!BG0s5H z>0LXw$dARn%2dRk=LF{H0~9^opCBveq+s2T9{!odgFR=3QAxEiwvb1$n>0O<07z@+ zOC;EA$hJd~u8{uZPlIyL?;VnUa&eH!?o$=}%C|BSqMRTZFi6ZX^wa7V8=|1B_`KSI zhy84sLbRGFOUmyJb?74z<_KVF9KBTdOmNYNn>gmk8Ir9X+2Auo>>Juavhiy*7QGfS z@}YIl?~K2m+U^#kI~PgSx8XmMl>_qLUjaPyWw2wjEow87ECjg>FZ3z~?dTIhc!Ls> zPBFS#Jy&QrEM>vI!d!VQu-fydB8amt$%qzBZE-BSiB+PdiHgGHhk}Car0-*4KI9^f zfu8Jy#-(Y;Huw=pb;3ji0X}~{UY?J0>p!PsyVLj;=mkKi!R$F(zF?-(Dcx{WL=n&m z%Zeb>0Y`4g&y<*wnP=bsM>}6{sY<`a3oisf&Ky@9hP=Jj@;d5D;7feSJUnug{!C z;^4EDOiyJqV|q#m%n@Q>gfeP9*7>Uo)-7R;vD(%ouDehns6R;^g3?Ds87Om7sA8E) z?DK69l@`&E1dF2=#k8jI$Ia#{LrdjyC3CJwX_72SiXwQKbT>l*FQg>=;2Hi86z=8kYHz}u`Ak|4BCPH) zVwjpWi&Q{E|2wc^5=jNm4KpZQMSzzh7m!)@iMw7O>C#la8IIa_{uk z!637xrWp`e;%nf4a)KiUD}Y5w%jvCVAeZ6--nTn4fO4$w<5)3>_WJVB-44t8djBM^ z@-_GtRI(tDSDq@&7hQ=mG~l8Wq-_r@yH09#=|2&{VcH!eFu3XbmT%#*HrglM+Pw|) zhbX3wB0WDZS{I>0f&iohb0BKO%-R&FD}V!0pyd2;&*#3}H&USm$FC_b0z3~w6VXu6 zGNCh(V0BG7O(e%Y_g2XTEhaBSfw9AIpW2Egv}_d?i8Hc%riz6+c1uycJR=3`^GEK+ zT>p7>NZd1qzE9X_RlO_t%p_-qe$){XHN!&Z?ixJzT%YDAe^S(*p~F5<2Q_pWfB6eb5J+}D<*a6*m*K>&0+v~)0+=XCb3A=E6XLi!_p)x z#$~Y8Vg%F~NnpBY$C%8btljXNQYM~sJnn+QHu5AZZDua+tLO6OMIZ2Rxk*a9H#`0B zSjgQaJA!h-qNPCkB;5>E@#0bN~94QR^UX;YY`&p z4ZDc7jz#yy3f}NLzGl%v@#?mo8Y7!0%z%cDGNuuQZ`<_V2R^JF))=vGNSUT4mL{96 z7`88XEz5a#1S(f9BWkSBVG0YIy2LL0pW8u{HSeeW;q6#{3sjRlTxO#0kpMOiKiC~# z0&EzHgMKHAYjD3o)Cdt00!&!hN?kVEK-ge!u;IpoZmg{`HBAE^xyQ7i;)+yo(x1+{ zfEFT68=wMA*!!!P=8mgreVClK6YeHvw}cP{Q&-)pP~|p&jpB#9BecVh=Uh84AAZ`g zPI1khAeGwVC`Q)|b_^rk?td>#h1#GYPLy8Xve~0u3S9BMO<*B7pXXH1GrbS`Y%Rb75J=jqF zrgtGCRiR6N!fm0X86PI9t9~iiNG#(dC8T%#dbnWxR79bKIt29tt;D+QKWO zsQ-;aF>(+Q+YmeL&QRn$Iz(KU|A|(j546)}qlU|h>jJ}SY+MdTHe;Y%{?T8&f1T7I5XJQZBl{!jw94HP z352OEoLPAjz~Ef~m5x%Rra}Q)eXRp(KrA4J&Wy`+y$&I+%Z|i-3>q7nmw()>l%@w; z2*ay^sK(VNwKq;ZhoP1klIJPC+3UuntFs4sPSQCIH9|S7#WOIl$G36tovqtHAo+b} zG#q(v&COe-WS8ZV>#M=`)k`m5Se9QDQjiMyv@ry!9ku8Tc)?V+^$iI3!@2zy5Nw0#7EY8O_caL#*O$Z5gpm5atK z&$x3}op$VB_$}|Qhwe&fJCHjkZU16l)I;QSE^?~3hHvprO2RCAZ*v=B6q$nyy75Lf zX#*7x6J7uE;bcH_8Dx_a!riLs?s8&3rsb?03e`O8#p_$u3`4e8J9kf;oQTpFf* z=V3eKv&a6zw^%P-8TsLx761aei)lcu&Qd$Cg!q63=;OzHeGit23B)(-a~t`dA~RR{ z0Oj@r=1P1~$D56NDHCTnnj=2}Obk);^Y(gs?+)!YJ5{apu&8=Dj`PX#oaEb~{!H1| zdk$p~yUr^Mdq`vJ*A}AT&TGB3cKM>F^)fPDk1K z!hcE1pFo{(SgWh|lD1%T|NLeN#2%&%jtCWJ7^vh{*nJYOl3J_M)djm46SH_j?mzFe(fmQ=84wqV$h0Un(yRLQ9Eqm9_PJfYXNA`B=L3nH@EqL}GOxr==^Z zZdU}-Bnrb1EiYL5-ix05_a*FbIJ&Nen4l^+ZcnoT3!#RcfFIQNNRVS}r)p&^XH(@5 z!Q4+wQJFd3kV8 zNmI#B#3f{6N3w{noI2@X3PQ$M~Y~mR`I5-;w_4oYnZ~w9WW9QmYyrZ+5P&9&U zz$m3}viBn7ro_Oc<1<;~H&Z8(?xom;9ZpZ`rQZtOo2`u96w0>e#rlH{9eta=TdgfS z>g1;b{J&QM$N`N%;RKl9w4}Oj-F;`RE~k)4a{O#ocZ)$|g}DKhXoHrz6~uvFf1j@et#94ME^e($ zsK%!g#eXdCRpv56Qa^uFQXzn-vz*OqsXf$`re9Z56(>pVHqH(9=hWu5eXLX^-_%rE?CkQ9fD-(8rri_^F6h>p-FvIB$%*gu-C@Duq zekZ}>E#8Z-$CDlSg!f&~Wlh<9S}+VocM%$yKV=)AGYZ9c2#{^P!y8E9$=t*WM>DcA zyVZg*E-*;_QtYj%%a_QZp{Y&Pr_jh-TL$jfQ}{C=(gG1z|-J?}<-oOw;KqF=el z&+Kv(QTL9y5O6@}3a(u&i4srbVlP?I`{wCnybVI`?42#oR&;lFY&!6_TdIFDpi971 z+@VbuF>>2krLT0lwLx5;CsKH7i#QoNJlBAevK?-v8+s*tm%WQ{!=eELKHVZH|MTZU zf?d`4E`9%Csaq$Xji|Kp^JXGq-Nxh4p67HJ>fOf785nI8eDip zCnQ-g%gLqF=^j2ds~g*i-RXfD*!ZfaVReFs1Q<;~oyN1Gkh0%vb$|(M-t>HMeM~fr zhyS4i4exB<7M_b@--ohHc{v`I;-(<`YjWi|+1m6~MnH%X^IIOZYIjg~uZ&R!+(nj< zkbud;Znvk?&9A`So_?EiHHv-wH@Y!9LAm0ZI&Ck;P|56AUfbdEux}{hGiP29D@=)r zARWN(FYf&D70gNG))Q}JnqU+7C-CLR=hV@o$+#ax`Fr|-{cbM2WlI%6X{R^da?OBs+n(^g%WcdYdQ~d zY&nL4H61n;wB;dXew)if`=(Da^#+pFl|uQEmQDG)Fi53+6ovOxh#vuKiMbR^MQLdh zYI5+AThySLk795;eLOmBU;RGzg^6#r%H4xd)=f6LBid|o-&e8V_X>!&seq0GY7RsB z`4glzgZA5jUOs*~iK871O46wylXFcgan?xRNaIi5NPB0)tNt3`dRkABDiykdn8bRZ z*HGM0Mef&?#J@ARG zxEJiZH7Bl2UK{^)H)|r%swUoB^{`BcQhtJJamh{9Z{Ci625ij|Yil_5+``b$)OvoL z^H>sDM-*%-K7}(_zdu=u9*?J#8D&_l2QKlJIA9?p%IGT!IJ6Fgsdnj#olBvR5VQwm zJ?y8r%bs>u&f{UIkH}J(SEL=FFH((|%CgGEu$3#-{Mm~2I%ygU5gTiv!XTad0#j+_ z+V*>vP5C8?8)V176lJi8NeW%$I7)N&WP!bmEZQA)Daln7PRJP#6D773@seDggT9ha z(H#W%dA)$3wfm^E@ZHnS?Y|xcS-dbZ%ujqX`XV0vWF07Pzx@~+ufu%^+$sA63jX-< z?<@#j%-?KW_r|+q!*m_L&S>|pNm7%hD_`SXJKuMHIHc@m;GNLT^I+4}1ITzn;~dzw zY~9M}w!OXY=?ZKmU}mf?SbUfkY$b)zn1;LE3i`r(M%^f5(W@2d%s2Ljq=?YSPDL4>=Cf%; zE6cBFhA}QVs8bNx5Y5B5E{2fn4*~lmoEvm(U;{)tI^^@@ka+nhbva=XV@XHvF$p3( zvtLRpsCkk^C#huxbGAROrkNbM62AmWq`p#{Fj#B&E1u8=CL{gQ9-H-(l#ZroOdOZF z<=Z)A{&y%YKSt$yiG!2Hz;D^3OYU2t)zPrZ1|?Q#w$Q)9r|Z^09nX42Cmq_s&eiAz zI}4gK`e>DkQMABtPd$^(LhPo$+yjMIEfh{|A%WlY3ocjU2H*ck4OPC^oo`werQZ>dpKb+r|F zBKcinEkq|1;KM*go69=ScZZ3@M7J$h(*cPU-Kf^@(ZDo%lQ%#A)s4pR5xd0wIUrRV zHD&+Xg|DJg;hlYNsb98tIdr+xKU-gsQ~4<;NWxF_1&QbU%*#OFzUI^FnAmKvO48&v zZIT*@JNGb3K%N#6&HPmBZ_YbSW|hmdJR9sQ?v-v^8@*mp-QYPP$~m)2DLSF?C;MIF7;S02!L{U>lp7sJ8w9=2uGPT-MX&&%x>5;SLo4 z;U7XBJFEUhBu!QxKruk@9;Y|vuP~S9vz}0CZxJ7XqG;JW3dD$3E~b0;YyM7Fl?!x(lvG}Ywndxa{LNE0YX@51O^GB4!<>0+hA!O7}A>P{@_ZG@`h<2~LrE^4tPc0@UnGLfdMOyO_P=4^PaBF$Y zT3%Qz)ktu1;5;Ag&AsyY@dGcybipPp%Kt}R`A&CU3JaG%qFMjfZnO5fZ$Y$^mu*dM zN8KRz*(lRTQ_SUZ$v2<62_joyO}LOAT?Xh%{m+RzP5SsJrFzV6hEjUxPRN(SEQYP0 zxe6WYM_}}r1toK*3=a#Y1s8@AB1(ZWoc@^#8+SsPfV{c!B5=4A`kP!p6*Mh8Vn~gH zCxclL&GOS^e)=3q;E{7}AZOce=*II?IpcyGSPPy<5*8f437Y~CX*wVv(K_gcyIT?W z{d5R*%UjZ|f>YZd#XcGS%Bol&dtl)qIDx~Oh?Xh0S*!n4VS=<{ACj*EV4`A$YBtbl zbUn?kLA7-G<;GVV5=97s+UD?Bz_SOz)Yt7{nfq7I$6dus;OE`mpS>U~dk>V!vyScS z=lW|duO{TMCtYWRHp|0Cx2MWw0zWN`miwYx?1G9>8nNf{I^n zh=@JVxi=MY!5y9$^C$ETYx3Ob;A>fD&tsyY%zVyE7SM!sF{7KTG?Vn=H^BS5Nl_uw z(*-=Q#9h#f+lM75<3zi8OezjJg-Yv7;|Y1cd_gm$0IWHJd^t`+zkfg9U46(#znBsz zn>1(MzgMq*Oplxpm_uO0xc!asl}%cmA{5Hi-<&Mlq7Ll0x`^F~PfIt^rfG~h%yB-; zv%8@a30(irA-uP)<_2T$!|)URPJtr}Q}9pgb&PKxMI63cL~sh{s}VL}$u3AFi%z6G zehLPzPHbRZT%D@PU{XWqHs2vmJdhApok}@|^O_)K?u4M!CpS(1N8S9=-5~N6m{))F zVq^)U|E>9rIt;Q9Au=)Q?>#Rs9-)pue#BKzO|Uni8|IJk$|L69 zZG!UJx3{+kg@5irrH_MmxBVaUAof@Hwmn+-K&q|zSiaC|ZP5vbFBeCwr=Q}p*NOH< zyS5f0BjKSC)$f0=IDx$z1Op=1-wO>!kIwdqS1Z}oE+zuBh1QRZJz(nx)co{ZXTXB& z*c0ToDo@Kgl_a~NLX~;K^x!7~zlo0#w&RDkURG5%GXyXh)aggksKBEueH5@?P1W%g zBt#y##7q*H=ZMGzti_93FRZL&*=ceu&(O{DrO4cpy{i$00X#~sQ(=`;mW+a#xN29(QLN_v#iPKd_Mx z4L58SH%)ioiO*_hVg`+@u$JNX(#t8D4 z?F^o{>hk3iFvU;3i6XvmGm{A z+_xpN^sCvwP0K&4jgCUy_U^T{k z9m%H)6$r(l;io+jj*dsYxAK?x(0Ff>bLr6w?=n_or}_ayW-PCvE57>GF3Pvkg^|f@ zffrJq-^frTDxC4rXgj7eb;pJn_*BQntrSMw+}M%oX2KdNPfJB1JB~P!MTU+nITY03 zQBuvEUvC_Nz5*)$4lE`<)+EXv7d;-u+rIl&iBO&Wz09z}xXUmTbpq8Gy(+Br&;EtP zY!_aTm_A7p&yVYpYgw zYTt7!`{Hh_XN@dc26A9;R4zPw6 z>;6zP%pp61VD6-a78K|_QmQ{-z zgC^E0gr>-UpKEjoZZZV>l) zoYEb!8YmbYu*V(}`eO!P2dyw0t19#+#qW108xHqcrUm0{$r+o4Ea_j{^L;%smvT3P zVHmJ~&RE9FFxFANI3-gO9Nz}F^qTWbR-JJL0r#UhcTQ~QaLEZal&VP2nH;v(6}xgH zXrb-k0KtvdjmvaxyL{*$ufb^>4Ya!4QuSk%YG#sRvQs#BUyu|#DC^D_XfOF)0#uV+ zb?=-CGQBf!yR*6|reZ=$+Dyy#b8HtCbx~9+#kUI*F_qIMRsp)7O`f#Pe`iwRFLLWL zYreQnYx!5sr|6R^{IFe;(2TE|Ws2c_Ie0y<=8kmw@pi@>7$126!X2(Vfb#pPtYyyU z3(p?iPp0gJN=;EI)hjYhTHl#c340%dWO4kX>D7KQE@{tftW65b9B#DHL6|srjBiUL zoBmHgm+dE~TIJ@@Wx!tD$%l8@aG)#{k9dEgI4*pyY8|}W6Tvi^!8|1>?<)~GE4gVn z4U+{^3N6w#iX z%z>C%n_Zah24cqVGn>Vwaaa-UcIY^}JNHWC&)4>K-tV{gRw(tgbFwH10( zA19_X3LNvO%1i-(L*gN>dI64wk(~F~_8hMnKmj64*N^1B!z?xb*MP1Ek3Kb?oZLF# zqfEtSyc`xEK0_DyyGR3i7b0w(NHbp4v6;6x!{KK`HRs1NNl(JxijN~?anA)q*aHvW zm;0mK`X3pKXVa@rU|}@C9Hr3%RwRkdu9-@d%rJOk09jIKhuLUQ z{sf(OiMJ&f$w$iUK4zVn9Y_OU1!YN74%qU|3=A?zDK(<^Ut?&yv;5@5J-!lqmfPa~wTjN}pf4^9_n!>U(SfwspNbU4h9o2XFYU zI}(nT(rT2NQ&m$2;5)%j4IQW2#(`IvN1&YC%}Y1sOyuCfnY+7p5@oo=35Uh=>h2m= zF|qT>K8^s{u}qS84ZE|x%1Ky z)mCjaECh8cdCbr4vWvocv+{5Lb*D3Dp)9ukIodej*70SY{r5dQQ6+>r)mJF(pgDWe zK@7XqQ4#CwA~O;c_g_rrnLNjK)#2Gl^p@eX!S=8KY)N@hsn{&H=aAHW$|s8gra3mm z&>LzTCE0s{(F57?&e`p{8>i7}4#x!nMlwUWDRlU%r5z1{wh`>LNvvYVCTOGy3eu?2 z0vvRbO|jic2BNt1Ae&CFP`m4ME%1C^tIxWYG#BZre&HGbPrzq|=BDQ{VOcHI z)WdG2rK@`-zED}M9SQ880UjSUhxQ3inNlB692hJY1x1Sn6KT7^}Rziw>*Vmm} z{yh&-q{(2jnP@L@z{B6dRz8rrwCon9%Ry(X=E?FEm97rA?QV>yqK%-v$JR?dR1vo? zI;1dtcZGGc5@@${m_k%{AV(WN^OK-~knh*U&$-EEhF^{md(Jtc6K)a-O20H) zs>6x*dB_)Ddhv#KD)v*3>8(CG&#c~okt!56=Y6ODjJr!gNkMnacc1p^PDa5=P2}2> z*aI9#oH@l5+j??S0%OOhFo6l0M%T|fR_1NHzQ7dRt$sX2AA9;Dd{nvk&_q$RH$@_5$2L)foF7#tQw`N182LsFcW>yzbq53}3CU!^5Qx;b6qq zlDV<5C4xhBs7wb{`A9OvC-!n8XL^jD<1`d-^ILKOVa2x$(AdSUtld7>y;16#kdHfd zAm>VZk~J6Rf-7Ksy9bxC>n>34-3S|8w08yI2fUd1x;1YrcfUFF2@)owfLx+(Mr&xS z!_bdWFh#LF2sX01YOqG7o=Q>eJX9?k%G$XP*^dMyjCtme|3#Wt*^5ZRB?jnL->Jcd z@o3_*Tx1GM3$#lN%+tGqRF}zCjg?w(3)5B>M5ymBkg?;T7z4Wyc1O~|VS3`1wIW&G z6BhGG>@Vkj0}x?-LvbRU{kD#yt`ksZQSI^4c`1X6vi_j4RZ8|}U=Z?{~W?cWt`mT{` z`*QSQDX$DyQCp8s7yQtP0w&_2EdWQL=`#Sh#He1|L&yI06er9mvxhY4t6&Vzp6^pI z))-qT4Dk&ytdD(?%(ITa)k}9+f=O{{#`bp7jijUOIiBB$G!Opp}bup>x@@#F2x& zz6EGaXxp2+ zt;K?c!=kbj6Pma0-`R;74W(wOz?I<2-*gWUIm`1;339lW@xm7@;b)u#6{2*vgYu7p z0s?sn6%P%{9pSXYX_VCZtm=6;w=iSPLupW70nFpk_&HckD;AMVu}cLl8s;+A*x%T% zG+eV1P7X)vb>Vn+bHDyrD7vXJn_g|@KYof^W`=I+A*(6^bC{j`<^y*78HoaFolb#D zRFtagJE$4>h+N!`MH4=88VaI2F;qw;cSc!d^%m9>zxY#Pw4hccLtl-Uh)* zobR#GVSew@BG#>MOf)KwqT6D#>~)@oiTY}nATA!B8+Q!yW?Gv1xdcSj6g+i=fV=`O z_}leocVWQ5eGU&&qD%MY4DCz{>`7giKdNw;OE(^+(gSO!Z8m&zL-S6JjK>wK57{36 znz&nU9;2t7LH{|bj}SYQBXBfwA8Ey}@s?(0)v?ODW1=eMLXxj_#a<>p-!ek*70MSx zDCa05JJ8^u0eS}mqwvxr{d^-|DyUI}8-DCV!B86V3gV8D%b_eaK~4D##_12UCuwKOw93y#YOdh2?q zg64go)=#sufraWipH`nxdozp3+WcXBC|BHt!?nb0mO zg-nhqaOSfI02U~~nus}E$pm#jzLC+;*PSQ9%3r|UkH!)NkGWwEerW@Pp{WgrGd>z1L^G*3b}{BMR=k6>WRf~#QB4+cuxRkH#S zjRQ$xw`tecIGE*QH@@9K>zBPOZ}hf~L$!gMwrg!0{f7*N((W-V+1Ay|hrY@l=s9j~ zZePR91<@C`(?H*&p{9H%DaC@VwSk89zMN8|qtrD%NhV~QtQMr%w>&#OEbrvc-$FNZ z%}2gbKtTL~(O-iyhA(3%mO_M>oxe&O{%{8+0+$kT)nUOJnRHF?IT<{0K$6R{wEpgdNyZQEPXHAsbOl=fihIwLp z6_TLfg?eJZSC}~#?k;4qd->@uP-ZFn9bl5~6){7e#=#7ii7b64Eu3I6Akre<8tTbC z*w%fZvTX`U2Sv0aEI^3bJQzYTlIDs|8)UpQ)HAdH5uK)_6G;QY(o_}80kwE!{~LcG z7)U&-d(QS3w6Qj8p7jC3jut5B1kKT+QfYTk#4^~pP_)=-!Y+N;;86mgC+}D-_KOjB zBu(+ya}7q!pn0g|qSVMVP3xPBBbKFEJ?+5zOleRGkIyLCO$)i%;o`?pbpipP+{c%3 zLxst^C|IBEyR~W7^1PBUbn>bCGaB6ya7M8UE-yK#yZmyVX@syV4n_(ozMuu#KnplS z7Af;ydmpe@3j(y58lVO49+ln0bko5~kV*rVDL5k?Z)TaL+6w)KzaMVbc+=`-Rz7p* zLj6K|UjtQ;;?ujVZ zuZI=u%#~27US1MGz1}%<>YI#F9o(K8Y9Wjf=^Dr0{qztT6jErSJbjdqfdEV}zD<6$ znPOs(+}g~B(kx6(xl74V3-d(=xkPJCrjZ#XIH|JC&Cw;vV3eDUHNg`N!zl z0r4(bZk0++G)k6|G7cqHKnM?p$O7Y`87NZ_?C|V9DJ7PbsNnWbWaI~^`!8tjYaeoS zp0v;+18)Vca)md6uPD9v1Ue;S3OfFmj*GUnxT4F=0GtRz;T=aOqn#a49K5S6QMqD~ zHG~!p6tN`@NA<&NA%N}NN35vF*5#~W`mQ55^sm4S6UIqW$bC8~V@34aD}A0*X)q_5 z!5Y#-CF(G#35W0nxA~H6q7)b7n!*7JnZ=z@6k6>3qa}{4vbu4$U zOR{kfcSEhpL_`mFrx}(>W0j#~9gmN%w+F_5Tm%1-mciO~cCH`XDMt=ANz_vakTX79 zA4|~;AM^A zme%!OL5lsv>`n5k3RmI|4le|6ZTnp$V(V8P*S`Kec;o z*cchB@>Teg!xtYT`%Ws%Ak5rlL9K%o{j(84!UM{rBP25)a%yu?V2W_^P6JVCQy1BI z!wB99D3EB8zB)^}Gc`4wE-_Q%8x*WXDiSQ9yD4!h1&Kz+;}Q-64&K3G$tlZ2=qCXy z8Od*5Q|fqP!Ffv%PhUQ&cwJ!y0qxZN88t zR{m*)w{M#At-sRddnBoAexDu^%!m=nG;p}e$nL%h3MocO{C(|6f~jbc=nABbx%J0e z9PBP|lFC@t)b6$53#(aL30Lf6a;0DU#*4WBwY`03J0Z9G>d(=iV@hmX9}v|F>NM{S zrxj1y(1}Z@NA6&`uEtaRc~R5xVr#%ayGZl#KLvH*re(cV@L@*6%MeS^1*G2g}!%|X8M_a=x3CYH{`g%G3Ii21o~SzhZJVdG6zv+9h$C6Vg>ND-Y7m4 zs}{1XQnz}iHZ-)iy-h3XT z2T6b}u48no{YTIW$rxn2`{S>7-0!=@LcX!{@j})~93jCVP;_pJ3oFJ8x|;D2?cz|i zNH)EFOOY7-HLtWp2x%VJyk26ct`s()P}JCgOTl*|rrUS|F)&{eb9dpSmMUF`yvF-l z)U=;NPp;imF+ro{cP6uR+7l)~l1?e7dREeAsbCEjNbt#Pk)1KP2m1?o9*3CtWD(Ag zLZ(hXg9lN*em9X(0$+g@!Dc(6G6i?KM5`U;NGd^!>R_HiPzl}O=4aUEG>eID@oK%1 zAc68r#iD66djSig$S8PAttxF&b#6Z6ai9b_2Of3+W@^KK6$3Ze{No?0o!v3V8I;0> z2}dguh^JrD=xR=TDdy9}3g1bQ8xv_|wfxwBj%&#xIriTr3LW(fx#yf*ibLEpR^E^^ zm3*HH6K{aCb={H0hA5`Eyv6Hp(CQQ~!O?Z^&msYN%oX_@q zF)ls(Dfi~&b`{$1XiMCuB4iR|ReQAYxdYtN*W=%tia(aobIQhm*DHPz-dbuNv{owE zw_qPG{2OWG;PbALQ|FIjR?T1TX2@)EOyEKw3yFx5Kvpm?u}AR=k2(lnInpN~VBIX) zY0~Z|53xJ^YBhSt^kz%dHaMhY@UeHkd+_)LCY_7kYOYexe}hp!ZA_be!|s`B`e zLI?0Gx1dc(P1$L%^ito!Bp&o zeUH-Fb6C;>o8g%xkx|A3>8s-sjhei^3DoSM1){9x#*}q5jh%Nmr9~eK9vff56!`1O zC)H#3G_3C}fZfqo&$Ym>*_~_vrYODd%a?g!#P9Yn*ugHS_JWj2=pl!pkfxuqDQ6tt zJa%VY_yo;trfuX(n9beOKQHgWV$-}tz z4IydNVKUR4W3^Defb)O?&w}caqJsJc;T9j*Z&P#peLeYDG^Rl*G9)#V?hRHB&5;(KosdPHyin{hZoi6UNs?SAU}$6}DAf7Y6$ zPCh2N&rDABxGa|S5b+c$VxO06e+^IduhBo+cn(MmQJ`H>2`%7JweLRv9B-ACX>wkZ zV{9He>Or)r6B*Nof6cELfF6j!?t(Q>7FVLb=Y_1}sCf{Ak_G6P&^!d?-bjLsotP{*w@6IU7$-i0K^`xuHAXafz85SE zIjz!WAz=r3LzNoA6uo$QyP)egVCJ8);O9VKoNWp3dAD8LtTvt8q7xYn$dp-HXe<$@5cYf)msI$wRTDD=y7@bA6fe;wu^2WutwnsdxCuR)s=mxt=aZmyNS zfT=2Y+e+0oNiu{rc`J_UiL!RO3g9^)Una&YnIOHR-CT>0&rM!X{!>r!U)>WRlC6OT z%q=EkQoi|0aDZ{yf@{^6HYOxx2lW%}iPDYS$Vt^yeVt^jO0wKvj?EVMqXW*&SK9ej zx%lary0QlgtOZ`V4eu-O>Zvy;Bf;%;iE=~7!m!x+vxJM@Y(dgV=Bk62oiHvlr9AtN z5jUH>{;|FYofeH_p06t?&in+*v_wT(Tw7b4dGHYw?D_hFO_e^MChuxXq9_sycd42M zRH+|F0t)!Kc+;M8+jL6lpYd?N@0iA$xZFkGGws)4%d*vj2$?=%eE&8}g}T`L+;3;s z3plpqZbYV|(PUPV6J57pT=MMXm&)JI=5Zm4X$01-+!P9Q{6ajdgidxYAAMVpF)4R= z_WY)}z3(pQ_3ZS&jK#r@lxrNZhKvf5k$e|X_}Homo7M?O;K@;HpUSAk!$f>Q-$vp_ zfPv>`3unNXWjFQr6j{<`Rp81;v2N0q1evGv-uje)MhEX;U(JPA!-WTt_P`3PP+=f zeZniMdNyrDzC+BFyVbl0NVDL}eT5fqSSv|Ar=|hyaO_SE#eJI6INSCG??V^|$l{SB z3lI8Jefw{K<7!L_!Cp2T_Qr>>_nq1Kg&T*og-hwJrD$JFzi7lbjC$m;f9SGfi*eh< zrbqa@F19)KZetH1G$zq1t>0}>!QBQBC#|x04Y-JC;!2Q>a@3Jb!E4B{UL8jc-1<*4 z2Yep{qPQ(TlZ5_hIcCTpnwQ737f8549iCz*VX5VY+RksYvLFnkUy1RLz(XOtV$-eO zj{^;5c-N`QTq@VY;Gl4s*N6VuY^FI4+d%Fmnf<|61y)__er+Q+CL9g*`&xk9k_`hvaj^v#t=?JGDVMaNTq2A?F1$Pq#N;XES6eHn4l_33$#puPpxVrvCIfXLdFxVrr>p^n zO^3^%1q)-x8{t93bT_th0+fU@AXP@H(u78jO96}IZM;(PHfUwD{?mmWSLD)%XF<@gw>7IU4CXroHDOIgxBxq!vcQX~nSxUb@!D^k-F zLm$Fr^`+q@iCCB%T7MaQE^x~E#7>ICupM1uUUD2jJ_W;1ZnOhx#%Z=5&x3t6We`9ilN_V`3s$)2HIIWP5<@0TxMgl0(O z-W>$he4sN)Oi9dtm#HMAOpZpWTu&lrM6@Tfuyj&8G#JoW&PeiPuE0L}-RfSLm9{J_ z;#2;$NQpQ*T7W;T{YR@g1MD*3%hYGueLv!Xfb?>(#xqB*;eOJy#+kI9?X$Y-F$z$t z?48MhoPSVU8e%Ixv#dnQzPzQJhX=7QOgx!evV_<{yM-1pL&v0URhd*$@Z0-r{ z-e>WVil3J&S`p0vQ{6iZefih;Xi;9_4t;>~$5loeS{2Arj?7FjY2^9-kXK`(Prs{> zde$4Hg_HchN3ahn!EK`=3Eav8w&WdSa5?!s0wbBC*%mTg?>@JCWe#e~{k#-f_H#WjeU2A`)M zQMeWx-Q1my2aLQ2%7_--j&UguF@YS~d*^?w*#l$3*m$2b_7ufNn5f{jml!X9jeb>0 zCLB)2AIo6E1reFZBfXP4Om(`Ps#^0S!UqM#iZ~NF4Tj(o%@>gtstuy<{!w`g{TvDV znswJf_d<3rx+TH=llHx}Q3ez77hb;}3r6lp8?1huAy{nm*XStk!s*Su6kgo_F%HYS}nsOc-(TRf}K55zNkb2~q zJzDReigIO|b9{64?L1dYQwr8E@>gNzQPv=yMZ$Nkpm}K2ru;fA>VpbI!ow9Vpy+k+ zZeM9{ueonF>-2xM^l5Qw~vE zwlPt}TbayP9wcy*M4bR_9nm>ZkQ8m=&j*aW0?4cR*27h<7PAo1dqJ1UU_8Z>WM%2( zWj0A}@^)&^+-9bfq$FYH=R1*8o{+0s%Gav|4tn~Q!tpDi)PxL)1Mb7}aU6YaX}7#A z;TXIxk`O=IcDH)7LY|~urH0*}6xA<@uS;~x_+SAe9>qxpx8sC+wsS#|{uyH%c<0jz z^sl_C+irp{WPjFkCO%q(0B3Js!h*^MUqLkQhW(Ed|5Ml23so%|G zS^3k1U&-5KMXsvGEu{(Tm4;a@VTo%!stKZUHk)_$_gaEF+ogjWR=U@nwlEV#u(c-& zZ%ULHl_!qH)W>0WWT|kZu-U@PifG*v0daX6hp}<&&9R^V@~o~p54Xd@z!&(DHV^NF zA^h1mgAU-Sa>)p-H5sY*J*_3Z7_zQ% zqVD@UfiiJa8pv0TXg+=$ZbGL*&pl;j#`}b%H1%Y;JgvhDa^RGtLoJ!B5=Kz-3xHKh zOXIV!Z^;AIx@55LU(dhEWjZ5%qW70-W~--MyLi;^b|!vCYRBUdqv%5bRa!`n3js1M zQLNF__$VvU_V`i~C&aHz%lM}9%~O3RD?NHwqaC8G?I5t=1egah?i#l=>mR^!eKR)hns$J!*ozWl7B8@|8M1gYYObeO-0t^uEm&jvx^?1Wwz2NqiFIK-Fdp+kj=?k0?U)VbIndu9 zoR_DO^nMt5^QW>lIV`J6qUu6j0a{k!iRNSfO7r+pV?pWgQBDnF!!!(EC%g@YELFWV z-+C52<90GH-SiG<8UbUEEkBo7CUFRUw>6$|hB@w4MucPjkFB@Sl9Fkgn9XQQE!&RJ zdGpFZIYC z7nPj3m(5C5b_mq-qGssqJ-Xd`>&KQ1{Ck59{gxNrBF=rAWvo|0PSZd4D>Z-5o4Y$# zob70-drWv7^jK4XlbbIE@!1j6iZ5sK&MwY9K+`zWHg}+&`k(rnL^G^rQjY8&$8Evn zJ)uxTeRdgSN7UzU@Xh_fnR9n%>+*TiP78(LP7f+DXm~DMkM9fwUF$4*ju=&J%YcK^ z`^#M$D(r3M`k&H@DTXhKosf=sn8@?A1B;xH_tL#k`qVfHMOQH{JvG<06;$*+2ecr! zU2Io2&qo0{0*Z4XCUU8GNKA6G``(JhhY~17)iN5UA2(c16opg6@^22UxZV6bJ99DZ zetXq3dtF;JvzjX~vs6G@EptfGK!NFnJ3DCE6$<}korTYX)v)wCz0l+NF_RwYA|#C# z-q%Zl{EB1&E0DB*)19(ajN#JO{5X85rC%UaJSD=&*hiVpHrhL#9Y33(yH-9zgxO6h zuV0K+RCQR-(?NL1MoMEACN4z9c7iI8a(%t~?^C~MRY3nEZebEPP3o3tcmIvRx?Vg_ z8>k+os^L2>^=wCK2)t3laLTW`jY`gmUn+tA+aJcTFC;r&pN6Tr{=ThEONs|R!X#_l z@cDl64^(ncKpxQJgg2XE2(k?`r`S4z-;K%mB#?-}k8r)2tVO|Qm=WvcbzD)L97qv_ zvD|u!hC|!nNO(lV513E0f6t+no=Nv4?2_TUJQlg`DpRca#`j!!fwHZE+>p*htpTh$ zTu4?kFf00JCUc~UB%{6@C`If64NDBwtg)5_JDa58^}XwjM2c6H4&zok&2}9b6 z$Fy3QMDOf%klt4T063*+IG6<(5X5~NkD@sNMI1?mi}s=ZEF4Q48>ij=ch^4MuTWm_ zmz$q)8D?u;z7fjd)r)XEC%mahz*<7KfIbCpkbtZtG#w#o%eGm1@8(EI)cMl@b%-d?BZ#A1IBTBXJ%_71Y1^|hbgEF zEa{J}pmrhoG$#A>9J$e{i}Fwre?}wLJ^#0{oNT@ue6K5F-vGg9 zZWS_S7G_#TaJEJ~%KJqu9|(uLX2tlnEOp5g?@BT5L?NsniRtQU@XejxMi4XtsrzLT zYCC!8Z;`d4%-_#!cOcr{1Afz_`7{JQaF@j@6S+i_DOYjGn+z0d6`Z`@$m%dBenqT4 zDC6?cZ|@yJuPsXIC|TbCqWE5iG?c{$8)o7**GKD9U{y7BJM|!GIb8#N7j~A*Y?PL; z%`fv4CaX>#!+oxY7m_G$Y?wY0s&^DyZ{qei6ogjQZoBe!bKOBl2Ir=$r=l)5 zs9#5bIH#4Ui_6yXZfRYXnkwD~av>+Q(WO`Sko>nl2a>OMoKU#K-}|E@+?G6gOqKS{ zhD^YuY8PWhDF^0G^o9(~19$yr;RmHq3d=+)Q;#I>&c{=!MEDhI?J&k*(%$$N;}|Q{ zE8WA}Y%+F=%5zwsL^_9v0+mDAA5MihsPcd3p*eC0WFj`bKQJSo*Ux>Ln}t7ns5RnS zky_*59xcDMbpIdUBkgqz54;~|PHzdoLt-=Ip)Hkv*^+*A88zQ;@)V4)OfG}F#`2ea zUhWoDGGlM0^gd;iCR7?eHWkVA8m)lzhT41NGTYh30`=`2%8h%%HTx@@#+}FIQ6rNSHuX9WcM{@)6KQpbtrKjCICfHF}$~4%1 zfj}Oxu}KDnA!)hWd7Ruw4LBe3LA%0eo!s6OXNr;5)PQADh?aKDK8>}jsL6!DoIUvz5Y+HZ_j;(am}_~Ku|r7 z@Qw7O@NImpyizWbc%9=Q9E1537wM_@04CEO@|-l6MD=DN5V73H{VC9fq*HIVhqBG zS!&4cw|bEOZ`V1ITq(yWCe8DKnythmNQdD~IDN5?ZMc{h2dz1bJwH;WD83N;+MFm7 zgxom7g+LHf;lt6A7&|wZ>C12tIhoTgTCmyd(&c}H#tn-b>@2vs{TgJr?J4C1jGB)c ze!NVB&;#7d(6f=|Vgw|}(ms}*QD5XHQ-m1KuFr;WsTfE`0Z#8wV|pB2KztRi%t#-G zm^jE*MO-Alff8FZ22>Ap7)|4>c~J?$k>*%iweNIJuleHqT(u5%C=T9X_zal;bbuo- zLhJi%{!nXLIf5MFT=ZU|mY#VOkM4T>4_*S5V8N88(ubAr82j)q%Q@3AOL$NMv%dH~ z6h4E1StMXg6PZ7pYO5ThMVDF&?;y6%=8-KAllZd3?J|@wsCSF-i!^HEu2a59k2Z@-uUAX#O89EKZo=e`$O2)i z%i-u~ig+wSlB2}f|6OBdBUf}9MN=G#LCA~^Th{KB52`uFx23dgh3V69ic4i?HbA&= zzkGILRMD_HT;pO`JuQ-VE)N$t;ye@V*Yn{Fewh^92)g?T9forw!RPS}KOHe~?`O`5 z9qbU;p2l$qRrIoBkcH7iZIOK{pJYfAx{lK-NNfI9cg`&C*&DH|O)%vo7n?1kU!Urv zbuT}$dz&~QGl6P)Yx*n2V>*Gjh}wpNrH9e_A_3KkazBm0$CvKhR69Ez5qXING(om7 z8d=ENt;V5Q;+gBKDyF8Gz`zt}@Ns){3U;`O?pgn`3J*=f2YT@O`j^bl@AR+ae|f{L zjOhvr5Q6%Z>Bg{6$&Dz9@c4=EOpSEXF#EW(gA9w@^QmH{XjlW=C#p%JEXWm%b=2g# zZsDg(n#-!{yT#YMy;MCLk<&_zFrB{cxUpqX0mxxY=6QB1u@k*So0m|uFOo#=y$-y0 zwLm`cW4Gg$l%M}m(&sb8qBPT-fI^`zB3g(jCd)z>flbx`U3!j_J7X+DJ-G^PzDk$k z$AKlJASq~)afih&kn6N9t@BWFuXDFI;??`X{maedNd^hUGjw^#FDQWbnfk`vUx+q& zGf-qd4e6kDyZoa43`?o}iNH!k-B@1%!WFy4a(~B80Pv(CnNyL(u~BkP#AKtQ6KtqM zF~6x7THtpPz^ITsftlUpF;jw^Wf>eipW2`ZO|*6iKP=fG0f}lQSY*R?{8x)~=ylR{ zsD31UjxL)nAzTF}2vPZew!2iRZJ8}k3Rgn3YwxM%1&d5V(&pjzqK7{#luWKU4`&iM zyN~m1R#fqM3jDpi!VRTge;eq*!^=2B`Ov7LeTo<3TcCteMfEw3yU5C83KkMcBiij6 zUl}hEz*AyJ{7cu=oV*BDT+v5lM?6WcF~FAB&aDp}5za07M4jKD-`zV9t3j}ZV^7Xq zWyGFp5nrXKUxlI`9%o7?V{Wr^%3;-Y7`YSVDgp4a?cV**Hp0v=gROKqYk`DJba}-g zBN|&%0KPX=QNO{DhpC$!K{aYuloJ^wt2rFee)fbE{%PZ2t_~IZ!+_zlvX-;b4s``S zPv!`kb^5wBuV4#%aL++x!vuXZulan4q+C|1S=!-=?^TJ@cRM1=^m~8~y_Aka%!3P` z=4>`Gl}6`glJb1K3};k?8S+tqQ;wd<2FWmFJ2JcI;+43Vl2l=W(PPw2Y=iwf0tO#^ z$w|2z2%AQ1i8F;Q1tOE%EaH{J*Py}cehB4karT7$LjF87bz?0N5+%FxfVx6Tw5r(_ zy*aU%HxU|yu66Hl-)F9qT6C2i!Z2b{{9dGuZpF0Te4IJB3E)RqDmSb6)5cBs{8R8X z?~61z)8tUoeQ7g=d(sV=4Eb|G$n?S!c@xagW3biM@~s;v7cjJ%uLPO~5Xq?gi|y zj=Xvl%|;Min2SP{kw@ao)_7jhs9_4Sx8yo7OyaI-_( zu!*4B5wE=Wx-HrVACA(A1J9=2Q`j;ST-?(pcsfeyTo5VvS*lkOcP72_HQlorw%Iy+ zrL9~-zG|I4`hFNr#f*MVv|c2@t()=4ru{y6=KTVK>7X#-6uyy9 zRIDPu!JkW#T;J$MCcp1h@I~5gEGkD*CSTPM?T-TZ$(*4z$@cI*1WD#;cx3A|r+mMu ze>ZDJqzl*FN4ENz5G88e2(8N})EN9TzU%nZzt3B&U0YmQv<6(kR#|hRypVfgfT0U& z&0teqaE}q5?NsMhs7ZJyqiG!PtJ5Lsq?&dmtrvv}J?khW|K)(++Q1ho19PCi3Jngd zLL*}9x`CTJfgg6RnPa|M`z2CLXh8b%POgfC203L*tU@Kb${z>^Txz$KdMaLT1+`wh!W{GTmpp$c9$l(+r2^)6%2R$4z<0T3c7RxLz?^^-I>+?{wWCNihbj4+LbJH$cQ0ObrT71dSTjFnXW2EI=~!WgNJ_X3e{VxN@h{ zs+4qJ`Ccln$t}txI`5oG`X(tKJHE7blMPW6obyd$V<$n;W<+AqU*#e53l&sLEB1Q0 zHIhY&_XG5pD|rcJp^LJc`kF0YLh5&}8h34oky0kofBvvmXfS(sLRq6<@LP1Pf}5TF zLm?BM%)~wLL~FuU(W8=B{QP=}KKulG(*%VB(QVyVQ~R5i#$yEOSq&{ThjroxN-a)} z5>znG5V{ZOXQu6S_MMi(`pl|zf zLN3{*n3yFJ7ky+|G8<(1=(e_FgSij!*;y7_*2OkZ>^l!bU$kF7$jVyEpYN+$K?+@9 z(rQ2(co4)BH3P@!`RuRdrpdW?z&3dkD+0{>`C=*HXB%}4{7!&V1q>DcN?z_L>g}Nx zHGkTW3TWV3cv0YKK~$2>rY*un`ixPvh+GB;JMQ4Au}p4=i422GQjw@hp5k&`4p!E5 zy|R;>aj{2x{@r;mX?aW?rWTUuDp;G~oKsT%9;?M{3ny#jx7Q|ztu{LNi1fPugD8vLi>2*10w#_{fYt=FS11-8)(?wK>2re%am7@dpKgKAKp{)yOUr%II{tJe9UiB(T_vG2md)XiY*bG& zEjp;Q$|PpyL1f#0oV+}gcVA#~2=ZJ>h6FF&zA|vx1{qo_+qbE@$vRHG6r?^Oh*K5= zJ~~0O>Bbqx9NJYbk&TtZ1jT4`HMobgUhJ|UFE7{^eCwN@3lV-oMRSN^ePKhy{<7O~ z_7AaGoyYp8tuWjl(Ehk;+=_tGN-eIG zJJ@jI0H2Ky0mEq?)@P?O*%Qj@y6TTbvTAA!%-;7h&m&CSoD>wZQw~al_ z_hBvmKif5!D5>9(L42BlCWGOD1!acRxV{Hdlv88=BPF9%W%<(7O#`XBzU$j0Cgl2(?hJN-wm zL1GlS)-X|If~{16Nkf=eEs)4Gs}Z0&6}hI}IV|vo2L~l1E1mEWd&zYHk#|zF@2>Sm zPSPDP+sgy0WcDH2s79jtkX)Bq^kGN`q&jiCz5^x^iPb+J@JG@c0fxRF4+h|JuC@%m zupcNSGBXO;Tw@PI*l^EO>!wK^snUs@W4huz5>q6JbH#C3FUFW+58y!|!9)^np&KNw z#nn%(7Eu)WlouPF0Udw2@---%v0pchFW8H9nXH%&UFl4D>f?As7BN>Q&C#onoZ6X2 z%=O~0gWLiF8a6O#!yjCc9*(gS4HsWy+BH<2~lES1& zjCy?X-MFU8#boJ^nAN^26N^nN9n8<)XK93xizXA#k7tG_l^QUVC^AM{7h-fWJ(n!V za)-YQA3mfjiBok*A+|tdzvox)l@WQN@QIyq1dzazfk1 z&g-wLt45Hwjb-K!MT#`NHB_Qiq85^Nh@@IJ*7|4>Tp3^^Tmm>GMUdk5w^-2j@dQj= zrm}0wzJKcRyU8-?3p!TZX~7!sI^M9&7tvzmu|wRMTc-X4)qXrh@XjnhFba5nJ>*mr zI#?L=P#U%2?wFvJ01~eega6SBNpZ%O`*D?9F+x2hFz`ITe_<}BzHDsOh1K**$mixd?cPLSRL_P81eqxjTC@>_h z+zzImu4@pAvn9vIb~B}1e-#oBM#()Dr2c$ipUjRSG@E1}*_%CnjK_E{8H3mHy8#5K zXHpYBAlYzj|MAtzo8}gp2(&grQv=_=VXTQ$!`t_vPPf#to?!J?g8DdLqrk4U?R#6% z11-^`^}(s+d}^ngx3p6dzu+v!)163n2~>l$z2}|{ev$e{;kYZ$q7;&Jn|Q0=Ar?{R zasLh2UR(ZsjE5=SpLEI}r!t;!cb-oS&a!rF0jL0;mLAL5-N`yJCYgm9 zIeejdT0p5@CnxUQGKr{We9Jcj8mqe*y1xy}_=u;*UAo?PenPSQ+i8n0&FH!a7?mdH zpMJd@+k!RMm>oXh6&19vHB{firV#mw_?k|L!c0#4JI~B zX+(pDZAo=+@nIGH?k=Bw67%%icxXm}t-xn_ znNqO$jH2;9Xj_QGz*q$UBCwNMZVO2;%r@1G zQA(G%gDLCsDWQ;+KIK6^KrqNjN)1w1ez$i@k;3;$PIh`)n6%KZ=(!$MI3i7Rn@7s( ze)*Zfj@j=_i`I6{aD#gVS0k|(9>ooa1)a6s*vdpv?$CnLv*N`IjGnojhAa+aJf_~~ z=Gfr<4zJ33oOgK9uZh#Jw3Ts+nMIZyCeMKQT+H)Ta4XL}0M!t6iP*F*EZ(-BHUm`GvvIeEn!?NsHDcxBKZ19R*9>v3 z0-Acs$o*;DuX_%s0L)p4jz0ocxFxD|>2ZniHArzHP5GSV^F98vs!o*I#rE5RZ(%vn z#%S((j>dBkR2iAc@kqs9irB7wDs5z_(^i0wVMXq~o|Gfl?9&}|bLZ0a_I!8ljDK_W zwspG|94r#K8gYg-gHNyvs?LE!xi$!wPkseohx+UrvY5AUcroG9KQLp;@zcWRn0O*~ z`IE?y@C_0)SyQI(@yWP59DbFW2Oh zk0&O1I1X2NpEF7B6JI9uB#a+!gKKoAwgp* zhKfSM7%e(@oCt2oh3JcS#C&S$`;$A|0uD*adlEC_~!b~ zWgQB49M|LYX;(+#p?E*szq8XHC{zgJ=5qQfbB){S1%Lm$4eUul2={)%!N7Bmu+2;L z^!5l3XrqlLUavk;ELU#~X(MOizYXu?M;}~ZUSIC)MIHvFp?Bdk{E#`YIFhZ=$Sq_< z)Az~bEgv0{lsMUBbAOd7vYCou#&1Zw(7r1t z7o(@l=2_@N7t?4}iw4~vrq`deK>2-OLt1JKGUeX;bxV%2$gT^8y2@PmdzfWaWf7t< z^Cx-4gqWqS2hjJq>(K&9a7Zs51O9m@{?Em7DV&Bs7gzpMBj!o+Cv8IfWL*** z4%H3Lt&VCn2oxBZQ*k9M7nOeTSL2-UtqTZ`TG(a{$4P#~GV;EVv_vklu;e1RL;)A)H-vpKT6mN zdS_`@BDg@oO@U?O5^?WG<$vo}ur)8gb1DJrz{-qG<>Yua4c2#+H#eqNeS>MZj}(_w zRYL<>gthAvb56eXF%XuOXg*GS`O21STxwjlKU<7{Z~dzYW<{hM7AMhRbz)^cP-GGy zr0kGYR^jmiyV)V#y^CX?dYoFUq-6i`^v=&CJ-L09o^zQI$E4YYt)J3W8Ku-FZWS>h z*S_vax^)OBP^Bv>)jR4HyT_5V^r$XL`z)5}io&%1y@s=BA`w}%;t220=|tAN1Uk^m zNVnkmdiSUACh5&i>N>RsauT_=lI@H(tw!U4)$BDF~Ldfkph*zYxo1Bf^gQp7)3hq@AuKf;li&JXf1eozLTg`Q&X z@u4fVu#FSQP!s(w%5E~p+<2J?`>+?kO?A9n8HFzS$xkI_w6Ke9Amqk0NJQIC5@#qf zH79vaZH05n1M4;N&o5OafQfRa5{h4PaB^dbPzeFxC9^3WX-j6mMU^vGRXM8scda(D z=eGGlT^(%g`XQm+g7gBW8ILOD{ z_Fu8Vi;~*Ie<~zDbe0nB@h-;%xrlYY!QFcd?PkmWgB4r|nZZa$<3=EAE=z*ovV5@N zp~5X|;}S-ID_p8-;>F=9lDTkxftB(_PGX4}fCeB$?YWZY7LUu}r%1C}HiP$fgl6s1 zQ0}v4>q&@>4e#6CPCqY|-wXf%g7H0aL)nV3tH~+V7?TG(gcWQ*k4`x-ON|W%H{*#6 z?_|IGxP!_ck9X!cZ*aoefT0h_E>a{hWtHf*EUQIchGghk=)4!UqD%Q=^*XV8y{!of z2UH!-xstPs<8IlOC?d`tBN78jYCn6<>^&)Yv+9!2?fpia7qLCbq`g!AG^jBmtt6N1 zD&L7qKH6yRbjYPBJIv}!`D-~Dpm|`G zF;+fHkEGCp-d0^kCtt}r_VDXqkzQ2N@T49N{~=Rv=%dGv1}JJirs{-C32ECL9mQN? zPl&T#&gnG|A8XX{&=&W78`k!+(jEIO&(zflHdKa%E~ak${Nc3Z_0xRuyw=g#H1#{;y#gI_kwfLdPd#^ev5Nu!OKq9#QTF}CA)s?Pr{&I zMq~8sPNFT&abv&DoaE)9P7pR%%zp=G>X<0uSJ9N>oLJm9MS`C~>uoIyZVXa}=v0y1 zoMe6Lmb;cW))R`!-`~9U|9M1s3SJG^sk!{9AMx zaS=IRo~l|i+GE?s>*<@HXDEJ}y$JTZAHKK;4nS{hxx8tM8{(Me61+N1_7>p@p;A}e zg->Ztp)fZp0oj=H?nlCLcT!?H1bdFPmBx6pQC`{f%z^mmxjcpF2wZN%=P2pv^zRVr z_cyhb%GV!YOYy0u1ucm&`zLLoL22II%SG!Xtx_yh@!?YYR`*jKQ)>FQ9NdEbcD-C9 zK(E1fHD?#>tW2~w{Bjt-cNaru9T^EWgERv%xy zKIfd-%m1U$s6*4es+n#_g@LwhQb0@{^>vdA&@|MqEG3M(R(JJgO9BHV;ql+;bC6(* zg3he)`27)>tQz^PGzBEZ=Y&^7f|^7V63s0z>9lIGcZ7h|)0SA^o8RAL>YDyeM1t&M zP^6ja>~YsYB_D7t)rZmw8Hi2Zbu%@!#ba~WC(x2chP@ESTS$DGTn0VW(0>m)r$5OE zt5zRq)HP|*8xoHUksSq2`MJp{z%f}>B1_&%0}o||tUEOTS6aPL1G5FWRy4KAsm5?5 z9n{s;uO}`d<}**NS*nFZ)RR`e!v_GVL3Aqn z1RB8uYb%+#KC}k{%=m*UeG%~U7jcp(mRfGwk9sMu^!uonK!o_`|-X|=3 zsi9vfFkkWNY?NiJ2F-&uRNsBm`g;C$H|A8{9*pF8@6r)0cMfPCQ*+nGozk2O^ah}PYR3T|F2jE%TeBL5u^X<3N@<=3ZOq|IPdM}Ll` zzB7B0U%bNp_%$o3I<1k!=P8y$%|!TC5B8lZ6FPCHyc(6J7Yf^g^w`Hzt9*3Gw3|f9 zeVs(wwoT=NE0@m@IPX2SFt%U(xUCwxJ=fF?G?IkhJ8WSCi7ZW?VWmz>0&nTiWgC=i zl1Ap*Fkm3hLc}JdnV1#PB>JbKt~bS!)u`S!bC=O@HMywEYACSJj%0i zk&V4(H|Iqz(|S7oeo7#aQUV~$W@$|2iZi7w$Gw_a`_Em9fff_n2wx@5Y)z=<@wzza z*hn-GDg2_vyd9?RtVPweJ=VZodw^I<7Mo4h80E+ z!v+=sK8V~yKO}u}Jt)0No6e)U#Gz(@oU1wJV?;XRqF{_pd}!1YkZ1)CsSw+K0o@z} z`as7$vz})ew%yuvA7X7r6Jh!=bSI`L8GY&2M^rVQrM80B3E?M54cXP{J0y~n#?uhQ zcOVY!KcYj{>lDY)eJ8UJhAs?%98@Q$%Q3n&Q>H_*8W2B&eGLSLGvDz1anadh{n#3F ztTOpq_;T#SGjoaB9nKw1Ykuh(B^UaByJw@&$`tsCgr8)>Krtv7rL^+#v*?fX zusVZVXShHw>tvUbe;OWuR(H)&RPlu|Be8u zXCKac!IhbC_yY*MJ0lN9Vd|vAp-wym(!aH3aY;!L^*u}d5-DmjGl-E?PC{7(jHR*r z^Njtno=p5x21z?xuNoC!!?>x~96ce)P8O^E0U@y;5~4h4tIEU#Qt(qzNpE6ECcIaI z)^odjjP>h7Kq}%d}8fcR#%=68NP6mx|lvKyjHr+Di6ziac`t?Svy_F3IDI0&Jc{`8!u?4rnuWYCCe15i6e9V}?s=12HO@n$oY^dNtKf|2_w+irnSoc$^ zKnOq5O>B*{?xJ>_oIqVmS_7-C^a{mh+!-3ZW6wo5RRY3-$|7#n=AK!S=2A$f4!mJq zmeYwI!ZG;2s|yGAxu`K35mUs*v%g^MJquXYJhj@$pQ)eJ@!z@lpyZ~H4R(JIay;L& zsb`%InK|<5vX!~9Se9h}=XJ(U9mvuDE?-h2A<(N})cbQez)vAc46AVCzJDkxnf`r) zTHO0>k3?qr7;brGBw>ea4W*TiGrU(;+^obXvG*3d{={>jGCv85_Yz}USI{hiq$&8Q zL!X!da%H>{(TZ@%MWv%MRhG)O>`2?iRmN9Zku-sT>fPPf)(LrbEa5GhH#iLm$;T_h z2(yo@bBDvG%9TCoBnN{9dZC&-d_0Q%GBu-ztaQXKsozDsjvQkC=WmCQ&(A!)dY62z z98B+bb6*nx;#TdZ{U!0FoZiN2rfdbA@V|_nMKvu&WVL$U+R>o}+m0~J#YQi#fWHeE zo3v&d+_jDnp6p6d3MVBHR{u3Km$d%g_|JiJG>+7VaaBpllWS6c@_`Q5)EL*A;7;tP zR|$M1*Z-z)x8h?8%BpJf+F>X3VHm}eaY7gF#|$`IS12Kku(7@^9IOo(2G7BlCWoG9 zGs4ru{acToOIYDIP7Qtz<*GEHR6A(>jcH4LyiF#{;bmx)%l7*^LiU#yp})hi(=i0b zE(d}BOZK*&ab4D3K*{fxYm;lw+@}VW^z8`iR7=AkGzZ4x|0pL7 zw1k94{4f!ybsv3Va?d9n)?;hl9*;ttOCT!60MrF*Q}UvU)qf{J7*?;?z-#xLIm2anPf1{#UE*@^5%R~Cd(B)rS6jYDp z-vwR`6XMv8=I+NEbIGZadZFOoi#72d*j)7{(S)GF$HJd$#O3R7RsmusQkZREGnL{I z`nI5(CtZsK&xt=!(Qc=$>W84)ltqYqY4KDbq67gKRP$E-Aql zvqtuNy}wyToUgx%ItJ}JIGc>F5$FCZSjp;tCfRkQ{sU}tSI&%RO$9J}r7T-8(jyOD z2D?fOH%>q$B4tuQC&v+3Dl&)oN~FUh`{2#9P1S)MX)1wCiq_N;SxVDvqZxB1K7<&{cQ$Fm;;7 zjy?YK6^EodN)2rC=PlEZc-Gzc&$m`*J;Nia@&0IC?y~FZ%I<|8Z!p4juHMWBBhQG@ zD}uJym!E_=M)Jr@BQJJ<>oPDI@P>u%=gLs6dfvH$@fzH| zh8=D+RCr>J{alhlNM~XIM?+?-`!*MF)bIWJi@zp<1RRw~qtgQ_xV7rgQ20$4*L3AKgfcIbXoi;nK2jDhe8?A-(+` zE}Mm4OFimtB>GuCrUr#%R*4?mK`yhH5qKcjRVAuZV#^;wW}?h}jV!T;NCK6nSXGAE zMui{02YFZfOzE$d5`b6kU!BPxaxg<&k*P7_h*6JK;Sh2MPdxU~iwwk4*N(G3?j*d( zJB}y>1}mGe-v+|!n;K%Ps+Ub+Nniu>kzB?#E(k?+On1rE0l=9)4Zi>H751YRABom0 zl!W`6n;b_5>;J3l+M}89+xQ60wYgJnn@dC_!fftSE}0mL=6=hM2*s95WXo+SBeR;V zi_oi!rcf!2xsyolA~V;1)33B<{Ji_C_q^vl=RNQH&*z`#bH3*}-|sokdCqgb&*#(F zgk;9DPmkgrC}?BayHpV3(#(hMF=UzCZOj=qt7{-r%}eRUQIjA1BxI1Lx-)e|@rWaSoB9ns9N(dRk4NrsKo2;gpEE8`d z4dq`99>4{3oosvW0^z_M(1wu-+*vQvQKwO0X9Am2k#rY0GqS)8G^A}%F&|S@c0cd& z?A(2EnD-t!EaD+>STQu0_8KF_A_;^s*So_rJib#Z_r zCTc)v39ium{iM~4GRb!$^j3Ui=z;ZT@G=|Qe%7kSE6w=EDIUAipeelnt6Ch3nx+!^3!3aaM&Bh zh#|-=gRQ#yG_HM=Zd8=gOP^#Y2De<)iu=9yW`C~x;#UyyF5Pm2uXy_+UhXEug9HM2 z#`yoWV%}CRkS;0(FD=Aa{>U~ub(l6t3X#2Ah@x2bsdWnFI@!f{J<<6#s2c~{Yma8* z>&6z_(>q!}yiL86DD}AS;W_!`yc|8JwzY|zle5F36!eYsN@MO@^8M9j#ejOR2M$TW z5D^J?QoIjbK4&nv0-X9>t}xS8;Lf9wy@;6*n2dOgD1-wYmO#Wr!+9NN!^MnVUBeH< zTD1CTZ*(?)cR#(CH)8KHnz6zv_{)!2HTWJY#?!NybxTj8Mq?d+7a~+LP!#HVnxL{v z);(T(USIc#VNq47x=YeB;tRYlv0w!5nH&(dPiva?y6B|b$5L5I)w|C(iQO^&o!I>i zQ?p!`EE}-IRyi?Qgn{HxQ0Z3i^Hi0E3wN1{af{ymN)|eS56uAE#Iu`)@VQSRmupi= zF~g=)QsxB! zFKMkX_}T|(9ZSs|{x>!|{>{GG1j~h}Wu8(ZIb1cM=l#W zERR`jMco!Vor7WQl!RBw;S9-+i^#rMB0IPO-8aT5`fuqa8b6zf1GhSfvl|e&4`K@G~}uno3Bt zT?9Q{lq(T!bzjRvb*WQCk}9!EdJL*I2sxEFeeE8Xo`sxl8s z$*I)UQ+{wpB>gzb#h+a&GxF`iq%*ph0vXJ=a9VxQ36Zu#KCwUJ)AW;9GZ^i)UgOv@ z9+K-j9)G(15Jp=sZG1DsnTJhSdu6R$^xoz`Qd{~l)-b#pW_@)m67AvGnQTzJt;2iV zq_RD6?xV`X84KC_AnToU|v5t=-z-2-2J(sF-!XV3;Uwo$lI;qUlaPQ zQ#);nKz9ZFjX+K4XE20i%F=13Be@V(5B;WbxAk}+rQ3X<&sZ3kV^Tys_rGJQW?u9G>@0w z>^~Mn@((kb*DFEzU$8qe4Nds)(@D!D+RxrJTwC2UA)A>;IrJ%}=id(e-;AQ6+}cgyDGD;W_C=$2KT<&uhtRP<}3?=T=5O z^aNFQQA)3@R(2cltW)7RGjqd2aZok+sNP#ddVNjp{2p_%UCcdg!hQlC(a}JPQW(}1 zMVo-b4`;~WZj~~R4+JGHyp->JU#-rF^*%bBGS=*Ex7NYjoDD!Nkrlhq%daa-6f17& za?rw|7Te;a2`C=(mwAfX+3XIpp47?k_(-qQ^k~#uKQFVFKdVO~mS`~Cm}D#bbM+tk z;_Ua&DS>^jq(XL>R=GY*M?RSf#f{l*?LOPFwh{v1vb8XiR~o_CDcoGUe^vf<0H7(t z*HZ)l*q~J`2>}2hKmi=V0RR9MM*&EI1#k@{04E>-kOdYHTS3DALHn=4|M86fgO()| Xu%Z5Fe#p*3kQl(#8Hsr67;^QW0M`mE literal 0 HcmV?d00001 diff --git a/docs/integrations/integrations-react.adoc b/docs/integrations/integrations-react.adoc new file mode 100644 index 0000000..6eb4a4f --- /dev/null +++ b/docs/integrations/integrations-react.adoc @@ -0,0 +1,121 @@ +--- +title: React Integration +order: 1 +layout: page +--- + +# React Integration + +The link:https://facebook.github.io/react/[React] library from Facebook easily integrates with web components. +As long as you import required polyfills and add HTML imports for the elements you are using, you can simply start adding these custom elements to your JSX markup. + +ifdef::web[] +==== +See also the link:https://facebook.github.io/react/docs/webcomponents.html[Web Components page] in React documentation. +==== +endif::web[] + + +## Grid Example + +[[figure.vaadin-grid.react]] +.React integration example using [vaadinelement]#vaadin-grid# +image::img/react-integration.png[] + +The example consists of two React components: [classname]#UserApp# and [classname]#UserGrid#. +The [classname]#UserGrid# component wraps the [vaadinelement]#vaadin-grid# element and does all necessary initialization to display a list of random users. +As React does not support link:https://facebook.github.io/react/docs/jsx-gotchas.html#custom-html-attributes[custom attributes] on standard elements, [vaadinelement]#vaadin-grid# DOM API cannot be fully utilized in the initialization. +Fortunately, [vaadinelement]#vaadin-grid# also provides corresponding JavaScript APIs. + +Selecting an item in the [classname]#UserGrid# is handled by the [classname]#UserApp# component. +The selection is handled by displaying the photo of the selected user below the [vaadinelement]#vaadin-grid#. + +The code below can be run and forked as a JSFiddle at https://jsfiddle.net/pw1nLaL8/2/. + +[source, javascript] +---- +// Create the UserGrid class +var UserGrid = React.createClass({ + render: function(){ + return ( + + ) + }, + + componentDidMount: function() { + var _this = this; + var vGrid = ReactDOM.findDOMNode(this); + + // Let the mounted upgrade + (function wait() { + if (vGrid.selection) { + // Assign the data source + vGrid.items = _this.items; + vGrid.size = 1000; + + // Bind selection listener + vGrid.addEventListener("selected-items-changed", _this.onRowSelect); + + var pictureRenderer = function(cell) { + cell.element.innerHTML = ""; + }; + + // Define columns + vGrid.columns = [ + {name: "user.picture.thumbnail", width: 100, renderer: pictureRenderer}, + {name: "user.name.first"}, + {name: "user.name.last"}, + {name: "user.email"}, + ]; + + } else { + setTimeout(wait, 50); + } + })(); + }, + + items: function(params, callback) { + var url = 'https://randomuser.me/api?index=' + params.index + '&results=' + params.count; + getJSON(url, function(data) { + callback(data.results); + }); + }, + + onRowSelect: function(e) { + var onUserSelect = this.props.onUserSelect; + var index = e.target.selection.selected()[0]; + e.target.getItem(index, function(err, data) { + onUserSelect(err ? undefined : data.user); + }); + } +}); + +var UserApp = React.createClass({ + + render: function() { + var userImage; + if (this.state.selected) { + userImage = ; + } + + return ( +
+ + {userImage} +
+ ); + }, + + getInitialState: function() { + return {}; + }, + + userSelect: function(user) { + this.setState({selected: user}); + } +}); + +HTMLImports.whenReady(function(){ + ReactDOM.render(, document.getElementById('container')); +}); +---- diff --git a/tasks/docsite.js b/tasks/docsite.js index 175df48..46ecf68 100644 --- a/tasks/docsite.js +++ b/tasks/docsite.js @@ -42,18 +42,9 @@ gulp.task('cdn:docsite:bower_components', ['cdn:stage-bower_components'], functi }); gulp.task('cdn:docsite:core-elements', function() { - return gulp.src(['docs/*', '!docs/angular2.adoc']) - .pipe(gulp.dest(docPath)); + return gulp.src(['docs/**']).pipe(gulp.dest(docPath)); }); -gulp.task('cdn:docsite:core-elements-ng2-integration', function() { - return gulp.src('docs/angular2.adoc') - .pipe(gulp.dest(docPath + '/integrations')); -}); - -gulp.task('cdn:docsite:core-elements-integrations', function() { - return getDocModifyTask('demo/**', docPath + '/integrations'); -}); gulp.task('cdn:docsite:core-elements-elements', ['cdn:docsite:bower_components'], function() { var bowerJson = require('../' + stagingPath + '/bower.json'); @@ -68,52 +59,8 @@ gulp.task('cdn:docsite:core-elements-elements', ['cdn:docsite:bower_components'] .pipe(gulp.dest(docPath + '/')); }); -function getDocModifyTask(sourceFiles, targetFolder, n) { - fs.mkdirsSync(targetFolder); - gutil.log('Generating site documentation from ' + sourceFiles + ' into ' + targetFolder); - - return gulp.src([sourceFiles, '!**/*-embed.html']) - // Remove bad tags - .pipe(replace(/^.*<(!doctype|\/?html|\/?head|\/?body|meta|title).*>.*\n/img, '')) - // Uncomment metainfo, and enclose all the example in {% raw %} ... {% endraw %} to avoid liquid conflicts - // We use gulp-modify instead of replace in order to handle the github url for this file - .pipe(modify({ - fileModifier: function(file, contents) { - var re = new RegExp(".*/" + n + "/"); - var gh = 'https://github.com/vaadin/' + n + '/edit/master/' + file.path.replace(re, ''); - return contents.replace(/^.*.*\n([\s\S]*)/img, - '---\n$1\nsourceurl: ' + gh + '\n---\n{% raw %}\n$2\n{% endraw %}'); - } - })) - .pipe(replace(/^.*
[\s\S]*?table-of-contents[\s\S]*?<\/section>.*\n/im, '')) - // Add ids to headers, so as site configures permalinks - .pipe(replace(/(.*)(<\/h\d+>)/img, function($0, $1, $2, $3){ - var id = $2.trim().toLowerCase().replace(/[^\w]+/g,'_'); - return '' + $2 + $3; - })) - // Remove webcomponents polyfill since it's added at top of the site - .pipe(replace(/^.*\s*?\n?/img, '')) - // embed files are displayed as iframe, we don't remove above fragments like body or polyfill - .pipe(addsrc(sourceFiles + '/*-embed.html')) - // Remove Analytics - .pipe(replace(/^.*\s*?\n?/img, '')) - // Adjust bowerComponents variable in common.html - .pipe(replace(/(bowerComponents *= *)'..\/..\/'/, "$1'../bower_components/'")) - // Adjust location of the current component in bower_components (..) - .pipe(replace(/(src|href)=("|')\.\.(\/\w)/mg, '$1=$2../bower_components/' + n + '$3')) - // Adjust location of dependencies in bower_components (../..) - .pipe(replace(/(src|href)=("|')(.*?)\.\.\/\.\.\//mg, '$1=$2../bower_components/')) - // Remove references to demo.css file - .pipe(replace(/^.*