From 1e17eeef6b1f7123552cccd4ec5ecd47c6d5d5c6 Mon Sep 17 00:00:00 2001 From: Alex Heneveld Date: Thu, 11 Feb 2016 00:37:52 +0000 Subject: [PATCH 01/10] update js-yaml to latest (snapshot) version from commit 50c82bccf70a19fd4add99542dfdf06a60280da8 (today) with parse listener enhancement https://github.com/nodeca/js-yaml/pull/249 --- src/main/webapp/assets/js/libs/js-yaml.js | 5703 ++++++++++----------- 1 file changed, 2784 insertions(+), 2919 deletions(-) diff --git a/src/main/webapp/assets/js/libs/js-yaml.js b/src/main/webapp/assets/js/libs/js-yaml.js index fbc53e691..25bf1334f 100644 --- a/src/main/webapp/assets/js/libs/js-yaml.js +++ b/src/main/webapp/assets/js/libs/js-yaml.js @@ -1,492 +1,471 @@ -/* js-yaml 3.5.2 https://github.com/nodeca/js-yaml */(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.jsyaml = 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 */ - var CHAR_QUESTION = 0x3F; /* ? */ - var CHAR_COMMERCIAL_AT = 0x40; /* @ */ - var CHAR_LEFT_SQUARE_BRACKET = 0x5B; /* [ */ - var CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */ - var CHAR_GRAVE_ACCENT = 0x60; /* ` */ - var CHAR_LEFT_CURLY_BRACKET = 0x7B; /* { */ - var CHAR_VERTICAL_LINE = 0x7C; /* | */ - var CHAR_RIGHT_CURLY_BRACKET = 0x7D; /* } */ - - var ESCAPE_SEQUENCES = {}; - - ESCAPE_SEQUENCES[0x00] = '\\0'; - ESCAPE_SEQUENCES[0x07] = '\\a'; - ESCAPE_SEQUENCES[0x08] = '\\b'; - ESCAPE_SEQUENCES[0x09] = '\\t'; - ESCAPE_SEQUENCES[0x0A] = '\\n'; - ESCAPE_SEQUENCES[0x0B] = '\\v'; - ESCAPE_SEQUENCES[0x0C] = '\\f'; - ESCAPE_SEQUENCES[0x0D] = '\\r'; - ESCAPE_SEQUENCES[0x1B] = '\\e'; - ESCAPE_SEQUENCES[0x22] = '\\"'; - ESCAPE_SEQUENCES[0x5C] = '\\\\'; - ESCAPE_SEQUENCES[0x85] = '\\N'; - ESCAPE_SEQUENCES[0xA0] = '\\_'; - ESCAPE_SEQUENCES[0x2028] = '\\L'; - ESCAPE_SEQUENCES[0x2029] = '\\P'; - - var DEPRECATED_BOOLEANS_SYNTAX = [ - 'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON', - 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF' - ]; - - function compileStyleMap(schema, map) { - var result, keys, index, length, tag, style, type; - - if (null === map) { - return {}; - } - - result = {}; - keys = Object.keys(map); - - for (index = 0, length = keys.length; index < length; index += 1) { - tag = keys[index]; - style = String(map[tag]); - - if ('!!' === tag.slice(0, 2)) { - tag = 'tag:yaml.org,2002:' + tag.slice(2); - } + for (cycle = 0; cycle < count; cycle += 1) { + result += string; + } - type = schema.compiledTypeMap[tag]; + return result; +} - if (type && _hasOwnProperty.call(type.styleAliases, style)) { - style = type.styleAliases[style]; - } - result[tag] = style; - } +function isNegativeZero(number) { + return (0 === number) && (Number.NEGATIVE_INFINITY === 1 / number); +} - return result; - } - function encodeHex(character) { - var string, handle, length; +module.exports.isNothing = isNothing; +module.exports.isObject = isObject; +module.exports.toArray = toArray; +module.exports.repeat = repeat; +module.exports.isNegativeZero = isNegativeZero; +module.exports.extend = extend; - string = character.toString(16).toUpperCase(); +},{}],3:[function(require,module,exports){ +'use strict'; + +/*eslint-disable no-use-before-define*/ + +var common = require('./common'); +var YAMLException = require('./exception'); +var DEFAULT_FULL_SCHEMA = require('./schema/default_full'); +var DEFAULT_SAFE_SCHEMA = require('./schema/default_safe'); + +var _toString = Object.prototype.toString; +var _hasOwnProperty = Object.prototype.hasOwnProperty; + +var CHAR_TAB = 0x09; /* Tab */ +var CHAR_LINE_FEED = 0x0A; /* LF */ +var CHAR_CARRIAGE_RETURN = 0x0D; /* CR */ +var CHAR_SPACE = 0x20; /* Space */ +var CHAR_EXCLAMATION = 0x21; /* ! */ +var CHAR_DOUBLE_QUOTE = 0x22; /* " */ +var CHAR_SHARP = 0x23; /* # */ +var CHAR_PERCENT = 0x25; /* % */ +var CHAR_AMPERSAND = 0x26; /* & */ +var CHAR_SINGLE_QUOTE = 0x27; /* ' */ +var CHAR_ASTERISK = 0x2A; /* * */ +var CHAR_COMMA = 0x2C; /* , */ +var CHAR_MINUS = 0x2D; /* - */ +var CHAR_COLON = 0x3A; /* : */ +var CHAR_GREATER_THAN = 0x3E; /* > */ +var CHAR_QUESTION = 0x3F; /* ? */ +var CHAR_COMMERCIAL_AT = 0x40; /* @ */ +var CHAR_LEFT_SQUARE_BRACKET = 0x5B; /* [ */ +var CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */ +var CHAR_GRAVE_ACCENT = 0x60; /* ` */ +var CHAR_LEFT_CURLY_BRACKET = 0x7B; /* { */ +var CHAR_VERTICAL_LINE = 0x7C; /* | */ +var CHAR_RIGHT_CURLY_BRACKET = 0x7D; /* } */ + +var ESCAPE_SEQUENCES = {}; + +ESCAPE_SEQUENCES[0x00] = '\\0'; +ESCAPE_SEQUENCES[0x07] = '\\a'; +ESCAPE_SEQUENCES[0x08] = '\\b'; +ESCAPE_SEQUENCES[0x09] = '\\t'; +ESCAPE_SEQUENCES[0x0A] = '\\n'; +ESCAPE_SEQUENCES[0x0B] = '\\v'; +ESCAPE_SEQUENCES[0x0C] = '\\f'; +ESCAPE_SEQUENCES[0x0D] = '\\r'; +ESCAPE_SEQUENCES[0x1B] = '\\e'; +ESCAPE_SEQUENCES[0x22] = '\\"'; +ESCAPE_SEQUENCES[0x5C] = '\\\\'; +ESCAPE_SEQUENCES[0x85] = '\\N'; +ESCAPE_SEQUENCES[0xA0] = '\\_'; +ESCAPE_SEQUENCES[0x2028] = '\\L'; +ESCAPE_SEQUENCES[0x2029] = '\\P'; + +var DEPRECATED_BOOLEANS_SYNTAX = [ + 'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON', + 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF' +]; + +function compileStyleMap(schema, map) { + var result, keys, index, length, tag, style, type; + + if (null === map) return {}; + + result = {}; + keys = Object.keys(map); + + for (index = 0, length = keys.length; index < length; index += 1) { + tag = keys[index]; + style = String(map[tag]); + + if ('!!' === tag.slice(0, 2)) { + tag = 'tag:yaml.org,2002:' + tag.slice(2); + } + + type = schema.compiledTypeMap[tag]; + + if (type && _hasOwnProperty.call(type.styleAliases, style)) { + style = type.styleAliases[style]; + } + + result[tag] = style; + } + + return result; +} + +function encodeHex(character) { + var string, handle, length; + + string = character.toString(16).toUpperCase(); + + if (character <= 0xFF) { + handle = 'x'; + length = 2; + } else if (character <= 0xFFFF) { + handle = 'u'; + length = 4; + } else if (character <= 0xFFFFFFFF) { + handle = 'U'; + length = 8; + } else { + throw new YAMLException('code point within a string may not be greater than 0xFFFFFFFF'); + } + + return '\\' + handle + common.repeat('0', length - string.length) + string; +} + +function State(options) { + this.schema = options['schema'] || DEFAULT_FULL_SCHEMA; + this.indent = Math.max(1, (options['indent'] || 2)); + this.skipInvalid = options['skipInvalid'] || false; + this.flowLevel = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']); + this.styleMap = compileStyleMap(this.schema, options['styles'] || null); + this.sortKeys = options['sortKeys'] || false; + this.lineWidth = options['lineWidth'] || 80; + this.noRefs = options['noRefs'] || false; + + this.implicitTypes = this.schema.compiledImplicit; + this.explicitTypes = this.schema.compiledExplicit; + + this.tag = null; + this.result = ''; + + this.duplicates = []; + this.usedDuplicates = null; +} + +function indentString(string, spaces) { + var ind = common.repeat(' ', spaces), + position = 0, + next = -1, + result = '', + line, + length = string.length; - if (character <= 0xFF) { - handle = 'x'; - length = 2; - } else if (character <= 0xFFFF) { - handle = 'u'; - length = 4; - } else if (character <= 0xFFFFFFFF) { - handle = 'U'; - length = 8; + while (position < length) { + next = string.indexOf('\n', position); + if (next === -1) { + line = string.slice(position); + position = length; } else { - throw new YAMLException('code point within a string may not be greater than 0xFFFFFFFF'); + line = string.slice(position, next + 1); + position = next + 1; } - return '\\' + handle + common.repeat('0', length - string.length) + string; + if (line.length && line !== '\n') result += ind; + + result += line; } - function State(options) { - this.schema = options['schema'] || DEFAULT_FULL_SCHEMA; - this.indent = Math.max(1, (options['indent'] || 2)); - this.skipInvalid = options['skipInvalid'] || false; - this.flowLevel = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']); - this.styleMap = compileStyleMap(this.schema, options['styles'] || null); - this.sortKeys = options['sortKeys'] || false; - this.lineWidth = options['lineWidth'] || 80; - this.noRefs = options['noRefs'] || false; + return result; +} + +function generateNextLine(state, level) { + return '\n' + common.repeat(' ', state.indent * level); +} - this.implicitTypes = this.schema.compiledImplicit; - this.explicitTypes = this.schema.compiledExplicit; +function testImplicitResolving(state, str) { + var index, length, type; - this.tag = null; - this.result = ''; + for (index = 0, length = state.implicitTypes.length; index < length; index += 1) { + type = state.implicitTypes[index]; - this.duplicates = []; - this.usedDuplicates = null; + if (type.resolve(str)) { + return true; + } } - function indentString(string, spaces) { - var ind = common.repeat(' ', spaces), - position = 0, - next = -1, - result = '', - line, - length = string.length; + return false; +} - while (position < length) { - next = string.indexOf('\n', position); - if (next === -1) { - line = string.slice(position); - position = length; - } else { - line = string.slice(position, next + 1); - position = next + 1; - } - if (line.length && line !== '\n') { - result += ind; - } - result += line; - } +function StringBuilder(source) { + this.source = source; + this.result = ''; + this.checkpoint = 0; +} - return result; - } +StringBuilder.prototype.takeUpTo = function (position) { + var er; - function generateNextLine(state, level) { - return '\n' + common.repeat(' ', state.indent * level); + if (position < this.checkpoint) { + er = new Error('position should be > checkpoint'); + er.position = position; + er.checkpoint = this.checkpoint; + throw er; } - function testImplicitResolving(state, str) { - var index, length, type; + this.result += this.source.slice(this.checkpoint, position); + this.checkpoint = position; + return this; +}; - for (index = 0, length = state.implicitTypes.length; index < length; index += 1) { - type = state.implicitTypes[index]; +StringBuilder.prototype.escapeChar = function () { + var character, esc; - if (type.resolve(str)) { - return true; - } - } + character = this.source.charCodeAt(this.checkpoint); + esc = ESCAPE_SEQUENCES[character] || encodeHex(character); + this.result += esc; + this.checkpoint += 1; - return false; - } + return this; +}; - function StringBuilder(source) { - this.source = source; - this.result = ''; - this.checkpoint = 0; +StringBuilder.prototype.finish = function () { + if (this.source.length > this.checkpoint) { + this.takeUpTo(this.source.length); } +}; - StringBuilder.prototype.takeUpTo = function (position) { - var er; +function writeScalar(state, object, level, iskey) { + var simple, first, spaceWrap, folded, literal, single, double, + sawLineFeed, linePosition, longestLine, indent, max, character, + position, escapeSeq, hexEsc, previous, lineLength, modifier, + trailingLineBreaks, result; - if (position < this.checkpoint) { - er = new Error('position should be > checkpoint'); - er.position = position; - er.checkpoint = this.checkpoint; - throw er; - } + if (0 === object.length) { + state.dump = "''"; + return; + } - this.result += this.source.slice(this.checkpoint, position); - this.checkpoint = position; - return this; - }; + if (-1 !== DEPRECATED_BOOLEANS_SYNTAX.indexOf(object)) { + state.dump = "'" + object + "'"; + return; + } - StringBuilder.prototype.escapeChar = function () { - var character, esc; + simple = true; + first = object.length ? object.charCodeAt(0) : 0; + spaceWrap = (CHAR_SPACE === first || + CHAR_SPACE === object.charCodeAt(object.length - 1)); - character = this.source.charCodeAt(this.checkpoint); - esc = ESCAPE_SEQUENCES[character] || encodeHex(character); - this.result += esc; - this.checkpoint += 1; + // Simplified check for restricted first characters + // http://www.yaml.org/spec/1.2/spec.html#ns-plain-first%28c%29 + if (CHAR_MINUS === first || + CHAR_QUESTION === first || + CHAR_COMMERCIAL_AT === first || + CHAR_GRAVE_ACCENT === first) { + simple = false; + } - return this; - }; + // Can only use > and | if not wrapped in spaces or is not a key. + // Also, don't use if in flow mode. + if (spaceWrap || (state.flowLevel > -1 && state.flowLevel <= level)) { + if (spaceWrap) simple = false; - StringBuilder.prototype.finish = function () { - if (this.source.length > this.checkpoint) { - this.takeUpTo(this.source.length); - } - }; + folded = false; + literal = false; + } else { + folded = !iskey; + literal = !iskey; + } - function writeScalar(state, object, level, iskey) { - var simple, first, spaceWrap, folded, literal, single, double, - sawLineFeed, linePosition, longestLine, indent, max, character, - position, escapeSeq, hexEsc, previous, lineLength, modifier, - trailingLineBreaks, result; + single = true; + double = new StringBuilder(object); - if (0 === object.length) { - state.dump = "''"; - return; - } + sawLineFeed = false; + linePosition = 0; + longestLine = 0; - if (-1 !== DEPRECATED_BOOLEANS_SYNTAX.indexOf(object)) { - state.dump = "'" + object + "'"; - return; - } + indent = state.indent * level; + max = state.lineWidth; - simple = true; - first = object.length ? object.charCodeAt(0) : 0; - spaceWrap = (CHAR_SPACE === first || - CHAR_SPACE === object.charCodeAt(object.length - 1)); + // Replace -1 with biggest ingeger number according to + // http://ecma262-5.com/ELS5_HTML.htm#Section_8.5 + if (max === -1) max = 9007199254740991; - // Simplified check for restricted first characters - // http://www.yaml.org/spec/1.2/spec.html#ns-plain-first%28c%29 - if (CHAR_MINUS === first || - CHAR_QUESTION === first || - CHAR_COMMERCIAL_AT === first || - CHAR_GRAVE_ACCENT === first) { - simple = false; - } + if (indent < 40) max -= indent; + else max = 40; - // Can only use > and | if not wrapped in spaces or is not a key. - // Also, don't use if in flow mode. - if (spaceWrap || (state.flowLevel > -1 && state.flowLevel <= level)) { - if (spaceWrap) { + for (position = 0; position < object.length; position++) { + character = object.charCodeAt(position); + if (simple) { + // Characters that can never appear in the simple scalar + if (!simpleChar(character)) { simple = false; + } else { + // Still simple. If we make it all the way through like + // this, then we can just dump the string as-is. + continue; } - folded = false; - literal = false; - } else { - folded = !iskey; - literal = !iskey; } - single = true; - double = new StringBuilder(object); - - sawLineFeed = false; - linePosition = 0; - longestLine = 0; - - indent = state.indent * level; - max = state.lineWidth; - if (max === -1) { - // Replace -1 with biggest ingeger number according to - // http://ecma262-5.com/ELS5_HTML.htm#Section_8.5 - max = 9007199254740991; + if (single && character === CHAR_SINGLE_QUOTE) { + single = false; } - if (indent < 40) { - max -= indent; - } else { - max = 40; + escapeSeq = ESCAPE_SEQUENCES[character]; + hexEsc = needsHexEscape(character); + + if (!escapeSeq && !hexEsc) { + continue; } - for (position = 0; position < object.length; position++) { - character = object.charCodeAt(position); - if (simple) { - // Characters that can never appear in the simple scalar - if (!simpleChar(character)) { - simple = false; - } else { - // Still simple. If we make it all the way through like - // this, then we can just dump the string as-is. - continue; + if (character !== CHAR_LINE_FEED && + character !== CHAR_DOUBLE_QUOTE && + character !== CHAR_SINGLE_QUOTE) { + folded = false; + literal = false; + } else if (character === CHAR_LINE_FEED) { + sawLineFeed = true; + single = false; + if (position > 0) { + previous = object.charCodeAt(position - 1); + if (previous === CHAR_SPACE) { + literal = false; + folded = false; } } - - if (single && character === CHAR_SINGLE_QUOTE) { - single = false; - } - - escapeSeq = ESCAPE_SEQUENCES[character]; - hexEsc = needsHexEscape(character); - - if (!escapeSeq && !hexEsc) { - continue; - } - - if (character !== CHAR_LINE_FEED && - character !== CHAR_DOUBLE_QUOTE && - character !== CHAR_SINGLE_QUOTE) { - folded = false; - literal = false; - } else if (character === CHAR_LINE_FEED) { - sawLineFeed = true; - single = false; - if (position > 0) { - previous = object.charCodeAt(position - 1); - if (previous === CHAR_SPACE) { - literal = false; - folded = false; - } - } - if (folded) { - lineLength = position - linePosition; - linePosition = position; - if (lineLength > longestLine) { - longestLine = lineLength; - } - } + if (folded) { + lineLength = position - linePosition; + linePosition = position; + if (lineLength > longestLine) longestLine = lineLength; } + } - if (character !== CHAR_DOUBLE_QUOTE) { - single = false; - } + if (character !== CHAR_DOUBLE_QUOTE) single = false; - double.takeUpTo(position); - double.escapeChar(); - } + double.takeUpTo(position); + double.escapeChar(); + } - if (simple && testImplicitResolving(state, object)) { - simple = false; - } + if (simple && testImplicitResolving(state, object)) simple = false; - modifier = ''; - if (folded || literal) { - trailingLineBreaks = 0; - if (object.charCodeAt(object.length - 1) === CHAR_LINE_FEED) { + modifier = ''; + if (folded || literal) { + trailingLineBreaks = 0; + if (object.charCodeAt(object.length - 1) === CHAR_LINE_FEED) { + trailingLineBreaks += 1; + if (object.charCodeAt(object.length - 2) === CHAR_LINE_FEED) { trailingLineBreaks += 1; - if (object.charCodeAt(object.length - 2) === CHAR_LINE_FEED) { - trailingLineBreaks += 1; - } - } - - if (trailingLineBreaks === 0) { - modifier = '-'; - } else if (trailingLineBreaks === 2) { - modifier = '+'; } } - if (literal && longestLine < max || state.tag !== null) { - folded = false; - } + if (trailingLineBreaks === 0) modifier = '-'; + else if (trailingLineBreaks === 2) modifier = '+'; + } - // If it's literally one line, then don't bother with the literal. - // We may still want to do a fold, though, if it's a super long line. - if (!sawLineFeed) { - literal = false; - } + if (literal && longestLine < max || state.tag !== null) { + folded = false; + } - if (simple) { - state.dump = object; - } else if (single) { - state.dump = '\'' + object + '\''; - } else if (folded) { - result = fold(object, max); - state.dump = '>' + modifier + '\n' + indentString(result, indent); - } else if (literal) { - if (!modifier) { - object = object.replace(/\n$/, ''); - } - state.dump = '|' + modifier + '\n' + indentString(object, indent); - } else if (double) { - double.finish(); - state.dump = '"' + double.result + '"'; - } else { - throw new Error('Failed to dump scalar value'); - } + // If it's literally one line, then don't bother with the literal. + // We may still want to do a fold, though, if it's a super long line. + if (!sawLineFeed) literal = false; - return; - } + if (simple) { + state.dump = object; + } else if (single) { + state.dump = '\'' + object + '\''; + } else if (folded) { + result = fold(object, max); + state.dump = '>' + modifier + '\n' + indentString(result, indent); + } else if (literal) { + if (!modifier) object = object.replace(/\n$/, ''); + state.dump = '|' + modifier + '\n' + indentString(object, indent); + } else if (double) { + double.finish(); + state.dump = '"' + double.result + '"'; + } else { + throw new Error('Failed to dump scalar value'); + } + + return; +} // The `trailing` var is a regexp match of any trailing `\n` characters. // @@ -500,1549 +479,1517 @@ // In the case of `>+`, these line breaks are *not* doubled (like the line // breaks within the string), so it's important to only end with the exact // same number as we started. - function fold(object, max) { - var result = '', - position = 0, - length = object.length, - trailing = /\n+$/.exec(object), - newLine; - - if (trailing) { - length = trailing.index + 1; - } - - while (position < length) { - newLine = object.indexOf('\n', position); - if (newLine > length || newLine === -1) { - if (result) { - result += '\n\n'; - } - result += foldLine(object.slice(position, length), max); - position = length; - } else { - if (result) { - result += '\n\n'; - } - result += foldLine(object.slice(position, newLine), max); - position = newLine + 1; - } - } - if (trailing && trailing[0] !== '\n') { - result += trailing[0]; - } +function fold(object, max) { + var result = '', + position = 0, + length = object.length, + trailing = /\n+$/.exec(object), + newLine; - return result; + if (trailing) { + length = trailing.index + 1; } - function foldLine(line, max) { - if (line === '') { - return line; - } + while (position < length) { + newLine = object.indexOf('\n', position); + if (newLine > length || newLine === -1) { + if (result) result += '\n\n'; + result += foldLine(object.slice(position, length), max); + position = length; - var foldRe = /[^\s] [^\s]/g, - result = '', - prevMatch = 0, - foldStart = 0, - match = foldRe.exec(line), - index, - foldEnd, - folded; + } else { + if (result) result += '\n\n'; + result += foldLine(object.slice(position, newLine), max); + position = newLine + 1; + } + } - while (match) { - index = match.index; + if (trailing && trailing[0] !== '\n') result += trailing[0]; - // when we cross the max len, if the previous match would've - // been ok, use that one, and carry on. If there was no previous - // match on this fold section, then just have a long line. - if (index - foldStart > max) { - if (prevMatch !== foldStart) { - foldEnd = prevMatch; - } else { - foldEnd = index; - } + return result; +} - if (result) { - result += '\n'; - } - folded = line.slice(foldStart, foldEnd); - result += folded; - foldStart = foldEnd + 1; - } - prevMatch = index + 1; - match = foldRe.exec(line); - } +function foldLine(line, max) { + if (line === '') return line; - if (result) { - result += '\n'; - } + var foldRe = /[^\s] [^\s]/g, + result = '', + prevMatch = 0, + foldStart = 0, + match = foldRe.exec(line), + index, + foldEnd, + folded; - // if we end up with one last word at the end, then the last bit might - // be slightly bigger than we wanted, because we exited out of the loop. - if (foldStart !== prevMatch && line.length - foldStart > max) { - result += line.slice(foldStart, prevMatch) + '\n' + - line.slice(prevMatch + 1); - } else { - result += line.slice(foldStart); - } + while (match) { + index = match.index; - return result; - } + // when we cross the max len, if the previous match would've + // been ok, use that one, and carry on. If there was no previous + // match on this fold section, then just have a long line. + if (index - foldStart > max) { + if (prevMatch !== foldStart) foldEnd = prevMatch; + else foldEnd = index; -// Returns true if character can be found in a simple scalar - function simpleChar(character) { - return CHAR_TAB !== character && - CHAR_LINE_FEED !== character && - CHAR_CARRIAGE_RETURN !== character && - CHAR_COMMA !== character && - CHAR_LEFT_SQUARE_BRACKET !== character && - CHAR_RIGHT_SQUARE_BRACKET !== character && - CHAR_LEFT_CURLY_BRACKET !== character && - CHAR_RIGHT_CURLY_BRACKET !== character && - CHAR_SHARP !== character && - CHAR_AMPERSAND !== character && - CHAR_ASTERISK !== character && - CHAR_EXCLAMATION !== character && - CHAR_VERTICAL_LINE !== character && - CHAR_GREATER_THAN !== character && - CHAR_SINGLE_QUOTE !== character && - CHAR_DOUBLE_QUOTE !== character && - CHAR_PERCENT !== character && - CHAR_COLON !== character && - !ESCAPE_SEQUENCES[character] && - !needsHexEscape(character); + if (result) result += '\n'; + folded = line.slice(foldStart, foldEnd); + result += folded; + foldStart = foldEnd + 1; + } + prevMatch = index + 1; + match = foldRe.exec(line); } -// Returns true if the character code needs to be escaped. - function needsHexEscape(character) { - return !((0x00020 <= character && character <= 0x00007E) || - (0x00085 === character) || - (0x000A0 <= character && character <= 0x00D7FF) || - (0x0E000 <= character && character <= 0x00FFFD) || - (0x10000 <= character && character <= 0x10FFFF)); - } - - function writeFlowSequence(state, level, object) { - var _result = '', - _tag = state.tag, - index, - length; - - for (index = 0, length = object.length; index < length; index += 1) { - // Write only valid elements. - if (writeNode(state, level, object[index], false, false)) { - if (0 !== index) { - _result += ', '; - } - _result += state.dump; - } - } + if (result) result += '\n'; - state.tag = _tag; - state.dump = '[' + _result + ']'; + // if we end up with one last word at the end, then the last bit might + // be slightly bigger than we wanted, because we exited out of the loop. + if (foldStart !== prevMatch && line.length - foldStart > max) { + result += line.slice(foldStart, prevMatch) + '\n' + + line.slice(prevMatch + 1); + } else { + result += line.slice(foldStart); } - function writeBlockSequence(state, level, object, compact) { - var _result = '', - _tag = state.tag, - index, - length; + return result; +} - for (index = 0, length = object.length; index < length; index += 1) { - // Write only valid elements. - if (writeNode(state, level + 1, object[index], true, true)) { - if (!compact || 0 !== index) { - _result += generateNextLine(state, level); - } - _result += '- ' + state.dump; +// Returns true if character can be found in a simple scalar +function simpleChar(character) { + return CHAR_TAB !== character && + CHAR_LINE_FEED !== character && + CHAR_CARRIAGE_RETURN !== character && + CHAR_COMMA !== character && + CHAR_LEFT_SQUARE_BRACKET !== character && + CHAR_RIGHT_SQUARE_BRACKET !== character && + CHAR_LEFT_CURLY_BRACKET !== character && + CHAR_RIGHT_CURLY_BRACKET !== character && + CHAR_SHARP !== character && + CHAR_AMPERSAND !== character && + CHAR_ASTERISK !== character && + CHAR_EXCLAMATION !== character && + CHAR_VERTICAL_LINE !== character && + CHAR_GREATER_THAN !== character && + CHAR_SINGLE_QUOTE !== character && + CHAR_DOUBLE_QUOTE !== character && + CHAR_PERCENT !== character && + CHAR_COLON !== character && + !ESCAPE_SEQUENCES[character] && + !needsHexEscape(character); +} + +// Returns true if the character code needs to be escaped. +function needsHexEscape(character) { + return !((0x00020 <= character && character <= 0x00007E) || + (0x00085 === character) || + (0x000A0 <= character && character <= 0x00D7FF) || + (0x0E000 <= character && character <= 0x00FFFD) || + (0x10000 <= character && character <= 0x10FFFF)); +} + +function writeFlowSequence(state, level, object) { + var _result = '', + _tag = state.tag, + index, + length; + + for (index = 0, length = object.length; index < length; index += 1) { + // Write only valid elements. + if (writeNode(state, level, object[index], false, false)) { + if (0 !== index) _result += ', '; + _result += state.dump; + } + } + + state.tag = _tag; + state.dump = '[' + _result + ']'; +} + +function writeBlockSequence(state, level, object, compact) { + var _result = '', + _tag = state.tag, + index, + length; + + for (index = 0, length = object.length; index < length; index += 1) { + // Write only valid elements. + if (writeNode(state, level + 1, object[index], true, true)) { + if (!compact || 0 !== index) { + _result += generateNextLine(state, level); } + _result += '- ' + state.dump; } - - state.tag = _tag; - state.dump = _result || '[]'; // Empty sequence if no valid values. } - function writeFlowMapping(state, level, object) { - var _result = '', - _tag = state.tag, - objectKeyList = Object.keys(object), - index, - length, - objectKey, - objectValue, - pairBuffer; + state.tag = _tag; + state.dump = _result || '[]'; // Empty sequence if no valid values. +} - for (index = 0, length = objectKeyList.length; index < length; index += 1) { - pairBuffer = ''; +function writeFlowMapping(state, level, object) { + var _result = '', + _tag = state.tag, + objectKeyList = Object.keys(object), + index, + length, + objectKey, + objectValue, + pairBuffer; - if (0 !== index) { - pairBuffer += ', '; - } - - objectKey = objectKeyList[index]; - objectValue = object[objectKey]; + for (index = 0, length = objectKeyList.length; index < length; index += 1) { + pairBuffer = ''; - if (!writeNode(state, level, objectKey, false, false)) { - continue; // Skip this pair because of invalid key; - } + if (0 !== index) pairBuffer += ', '; - if (state.dump.length > 1024) { - pairBuffer += '? '; - } + objectKey = objectKeyList[index]; + objectValue = object[objectKey]; - pairBuffer += state.dump + ': '; + if (!writeNode(state, level, objectKey, false, false)) { + continue; // Skip this pair because of invalid key; + } - if (!writeNode(state, level, objectValue, false, false)) { - continue; // Skip this pair because of invalid value. - } + if (state.dump.length > 1024) pairBuffer += '? '; - pairBuffer += state.dump; + pairBuffer += state.dump + ': '; - // Both key and value are valid. - _result += pairBuffer; + if (!writeNode(state, level, objectValue, false, false)) { + continue; // Skip this pair because of invalid value. } - state.tag = _tag; - state.dump = '{' + _result + '}'; - } - - function writeBlockMapping(state, level, object, compact) { - var _result = '', - _tag = state.tag, - objectKeyList = Object.keys(object), - index, - length, - objectKey, - objectValue, - explicitPair, - pairBuffer; - - // Allow sorting keys so that the output file is deterministic - if (state.sortKeys === true) { - // Default sorting - objectKeyList.sort(); - } else if (typeof state.sortKeys === 'function') { - // Custom sort function - objectKeyList.sort(state.sortKeys); - } else if (state.sortKeys) { - // Something is wrong - throw new YAMLException('sortKeys must be a boolean or a function'); - } - - for (index = 0, length = objectKeyList.length; index < length; index += 1) { - pairBuffer = ''; + pairBuffer += state.dump; - if (!compact || 0 !== index) { - pairBuffer += generateNextLine(state, level); - } + // Both key and value are valid. + _result += pairBuffer; + } - objectKey = objectKeyList[index]; - objectValue = object[objectKey]; + state.tag = _tag; + state.dump = '{' + _result + '}'; +} - if (!writeNode(state, level + 1, objectKey, true, true, true)) { - continue; // Skip this pair because of invalid key. - } +function writeBlockMapping(state, level, object, compact) { + var _result = '', + _tag = state.tag, + objectKeyList = Object.keys(object), + index, + length, + objectKey, + objectValue, + explicitPair, + pairBuffer; - explicitPair = (null !== state.tag && '?' !== state.tag) || - (state.dump && state.dump.length > 1024); + // Allow sorting keys so that the output file is deterministic + if (state.sortKeys === true) { + // Default sorting + objectKeyList.sort(); + } else if (typeof state.sortKeys === 'function') { + // Custom sort function + objectKeyList.sort(state.sortKeys); + } else if (state.sortKeys) { + // Something is wrong + throw new YAMLException('sortKeys must be a boolean or a function'); + } - if (explicitPair) { - if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { - pairBuffer += '?'; - } else { - pairBuffer += '? '; - } - } + for (index = 0, length = objectKeyList.length; index < length; index += 1) { + pairBuffer = ''; - pairBuffer += state.dump; + if (!compact || 0 !== index) { + pairBuffer += generateNextLine(state, level); + } - if (explicitPair) { - pairBuffer += generateNextLine(state, level); - } + objectKey = objectKeyList[index]; + objectValue = object[objectKey]; - if (!writeNode(state, level + 1, objectValue, true, explicitPair)) { - continue; // Skip this pair because of invalid value. - } + if (!writeNode(state, level + 1, objectKey, true, true, true)) { + continue; // Skip this pair because of invalid key. + } + explicitPair = (null !== state.tag && '?' !== state.tag) || + (state.dump && state.dump.length > 1024); + + if (explicitPair) { if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { - pairBuffer += ':'; + pairBuffer += '?'; } else { - pairBuffer += ': '; + pairBuffer += '? '; } + } - pairBuffer += state.dump; + pairBuffer += state.dump; - // Both key and value are valid. - _result += pairBuffer; + if (explicitPair) { + pairBuffer += generateNextLine(state, level); } - state.tag = _tag; - state.dump = _result || '{}'; // Empty mapping if no valid pairs. + if (!writeNode(state, level + 1, objectValue, true, explicitPair)) { + continue; // Skip this pair because of invalid value. + } + + if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { + pairBuffer += ':'; + } else { + pairBuffer += ': '; + } + + pairBuffer += state.dump; + + // Both key and value are valid. + _result += pairBuffer; } - function detectType(state, object, explicit) { - var _result, typeList, index, length, type, style; + state.tag = _tag; + state.dump = _result || '{}'; // Empty mapping if no valid pairs. +} - typeList = explicit ? state.explicitTypes : state.implicitTypes; +function detectType(state, object, explicit) { + var _result, typeList, index, length, type, style; - for (index = 0, length = typeList.length; index < length; index += 1) { - type = typeList[index]; + typeList = explicit ? state.explicitTypes : state.implicitTypes; - if ((type.instanceOf || type.predicate) && - (!type.instanceOf || (('object' === typeof object) && (object instanceof type.instanceOf))) && - (!type.predicate || type.predicate(object))) { + for (index = 0, length = typeList.length; index < length; index += 1) { + type = typeList[index]; - state.tag = explicit ? type.tag : '?'; + if ((type.instanceOf || type.predicate) && + (!type.instanceOf || (('object' === typeof object) && (object instanceof type.instanceOf))) && + (!type.predicate || type.predicate(object))) { - if (type.represent) { - style = state.styleMap[type.tag] || type.defaultStyle; + state.tag = explicit ? type.tag : '?'; - if ('[object Function]' === _toString.call(type.represent)) { - _result = type.represent(object, style); - } else if (_hasOwnProperty.call(type.represent, style)) { - _result = type.represent[style](object, style); - } else { - throw new YAMLException('!<' + type.tag + '> tag resolver accepts not "' + style + '" style'); - } + if (type.represent) { + style = state.styleMap[type.tag] || type.defaultStyle; - state.dump = _result; + if ('[object Function]' === _toString.call(type.represent)) { + _result = type.represent(object, style); + } else if (_hasOwnProperty.call(type.represent, style)) { + _result = type.represent[style](object, style); + } else { + throw new YAMLException('!<' + type.tag + '> tag resolver accepts not "' + style + '" style'); } - return true; + state.dump = _result; } - } - return false; + return true; + } } + return false; +} + // Serializes `object` and writes it to global `result`. // Returns true on success, or false on invalid object. // - function writeNode(state, level, object, block, compact, iskey) { - state.tag = null; - state.dump = object; +function writeNode(state, level, object, block, compact, iskey) { + state.tag = null; + state.dump = object; - if (!detectType(state, object, false)) { - detectType(state, object, true); - } + if (!detectType(state, object, false)) { + detectType(state, object, true); + } - var type = _toString.call(state.dump); + var type = _toString.call(state.dump); - if (block) { - block = (0 > state.flowLevel || state.flowLevel > level); - } + if (block) { + block = (0 > state.flowLevel || state.flowLevel > level); + } - var objectOrArray = '[object Object]' === type || '[object Array]' === type, - duplicateIndex, - duplicate; + var objectOrArray = '[object Object]' === type || '[object Array]' === type, + duplicateIndex, + duplicate; - if (objectOrArray) { - duplicateIndex = state.duplicates.indexOf(object); - duplicate = duplicateIndex !== -1; - } + if (objectOrArray) { + duplicateIndex = state.duplicates.indexOf(object); + duplicate = duplicateIndex !== -1; + } - if ((null !== state.tag && '?' !== state.tag) || duplicate || (2 !== state.indent && level > 0)) { - compact = false; - } + if ((null !== state.tag && '?' !== state.tag) || duplicate || (2 !== state.indent && level > 0)) { + compact = false; + } - if (duplicate && state.usedDuplicates[duplicateIndex]) { - state.dump = '*ref_' + duplicateIndex; - } else { - if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) { - state.usedDuplicates[duplicateIndex] = true; - } - if ('[object Object]' === type) { - if (block && (0 !== Object.keys(state.dump).length)) { - writeBlockMapping(state, level, state.dump, compact); - if (duplicate) { - state.dump = '&ref_' + duplicateIndex + state.dump; - } - } else { - writeFlowMapping(state, level, state.dump); - if (duplicate) { - state.dump = '&ref_' + duplicateIndex + ' ' + state.dump; - } + if (duplicate && state.usedDuplicates[duplicateIndex]) { + state.dump = '*ref_' + duplicateIndex; + } else { + if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) { + state.usedDuplicates[duplicateIndex] = true; + } + if ('[object Object]' === type) { + if (block && (0 !== Object.keys(state.dump).length)) { + writeBlockMapping(state, level, state.dump, compact); + if (duplicate) { + state.dump = '&ref_' + duplicateIndex + state.dump; } - } else if ('[object Array]' === type) { - if (block && (0 !== state.dump.length)) { - writeBlockSequence(state, level, state.dump, compact); - if (duplicate) { - state.dump = '&ref_' + duplicateIndex + state.dump; - } - } else { - writeFlowSequence(state, level, state.dump); - if (duplicate) { - state.dump = '&ref_' + duplicateIndex + ' ' + state.dump; - } + } else { + writeFlowMapping(state, level, state.dump); + if (duplicate) { + state.dump = '&ref_' + duplicateIndex + ' ' + state.dump; } - } else if ('[object String]' === type) { - if ('?' !== state.tag) { - writeScalar(state, state.dump, level, iskey); + } + } else if ('[object Array]' === type) { + if (block && (0 !== state.dump.length)) { + writeBlockSequence(state, level, state.dump, compact); + if (duplicate) { + state.dump = '&ref_' + duplicateIndex + state.dump; } } else { - if (state.skipInvalid) { - return false; + writeFlowSequence(state, level, state.dump); + if (duplicate) { + state.dump = '&ref_' + duplicateIndex + ' ' + state.dump; } - throw new YAMLException('unacceptable kind of an object to dump ' + type); } - - if (null !== state.tag && '?' !== state.tag) { - state.dump = '!<' + state.tag + '> ' + state.dump; + } else if ('[object String]' === type) { + if ('?' !== state.tag) { + writeScalar(state, state.dump, level, iskey); } + } else { + if (state.skipInvalid) return false; + throw new YAMLException('unacceptable kind of an object to dump ' + type); } - return true; + if (null !== state.tag && '?' !== state.tag) { + state.dump = '!<' + state.tag + '> ' + state.dump; + } } - function getDuplicateReferences(object, state) { - var objects = [], - duplicatesIndexes = [], - index, - length; + return true; +} - inspectNode(object, objects, duplicatesIndexes); +function getDuplicateReferences(object, state) { + var objects = [], + duplicatesIndexes = [], + index, + length; - for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) { - state.duplicates.push(objects[duplicatesIndexes[index]]); - } - state.usedDuplicates = new Array(length); + inspectNode(object, objects, duplicatesIndexes); + + for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) { + state.duplicates.push(objects[duplicatesIndexes[index]]); } + state.usedDuplicates = new Array(length); +} + +function inspectNode(object, objects, duplicatesIndexes) { + var objectKeyList, + index, + length; - function inspectNode(object, objects, duplicatesIndexes) { - var objectKeyList, - index, - length; + if (null !== object && 'object' === typeof object) { + index = objects.indexOf(object); + if (-1 !== index) { + if (-1 === duplicatesIndexes.indexOf(index)) { + duplicatesIndexes.push(index); + } + } else { + objects.push(object); - if (null !== object && 'object' === typeof object) { - index = objects.indexOf(object); - if (-1 !== index) { - if (-1 === duplicatesIndexes.indexOf(index)) { - duplicatesIndexes.push(index); + if (Array.isArray(object)) { + for (index = 0, length = object.length; index < length; index += 1) { + inspectNode(object[index], objects, duplicatesIndexes); } } else { - objects.push(object); + objectKeyList = Object.keys(object); - if (Array.isArray(object)) { - for (index = 0, length = object.length; index < length; index += 1) { - inspectNode(object[index], objects, duplicatesIndexes); - } - } else { - objectKeyList = Object.keys(object); - - for (index = 0, length = objectKeyList.length; index < length; index += 1) { - inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes); - } + for (index = 0, length = objectKeyList.length; index < length; index += 1) { + inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes); } } } } +} - function dump(input, options) { - options = options || {}; +function dump(input, options) { + options = options || {}; - var state = new State(options); + var state = new State(options); - if (!state.noRefs) { - getDuplicateReferences(input, state); - } + if (!state.noRefs) getDuplicateReferences(input, state); - if (writeNode(state, 0, input, true, true)) { - return state.dump + '\n'; - } - return ''; - } + if (writeNode(state, 0, input, true, true)) return state.dump + '\n'; - function safeDump(input, options) { - return dump(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options)); - } + return ''; +} - module.exports.dump = dump; - module.exports.safeDump = safeDump; +function safeDump(input, options) { + return dump(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options)); +} + +module.exports.dump = dump; +module.exports.safeDump = safeDump; },{"./common":2,"./exception":4,"./schema/default_full":9,"./schema/default_safe":10}],4:[function(require,module,exports){ // YAML error class. http://stackoverflow.com/questions/8458984 // - 'use strict'; - - function YAMLException(reason, mark) { - // Super constructor - Error.call(this); +'use strict'; - // Include stack trace in error object - if (Error.captureStackTrace) { - // Chrome and NodeJS - Error.captureStackTrace(this, this.constructor); - } else { - // FF, IE 10+ and Safari 6+. Fallback for others - this.stack = (new Error()).stack || ''; - } +function YAMLException(reason, mark) { + // Super constructor + Error.call(this); - this.name = 'YAMLException'; - this.reason = reason; - this.mark = mark; - this.message = (this.reason || '(unknown reason)') + (this.mark ? ' ' + this.mark.toString() : ''); + // Include stack trace in error object + if (Error.captureStackTrace) { + // Chrome and NodeJS + Error.captureStackTrace(this, this.constructor); + } else { + // FF, IE 10+ and Safari 6+. Fallback for others + this.stack = (new Error()).stack || ''; } + this.name = 'YAMLException'; + this.reason = reason; + this.mark = mark; + this.message = (this.reason || '(unknown reason)') + (this.mark ? ' ' + this.mark.toString() : ''); +} + // Inherit from Error - YAMLException.prototype = Object.create(Error.prototype); - YAMLException.prototype.constructor = YAMLException; +YAMLException.prototype = Object.create(Error.prototype); +YAMLException.prototype.constructor = YAMLException; - YAMLException.prototype.toString = function toString(compact) { - var result = this.name + ': '; +YAMLException.prototype.toString = function toString(compact) { + var result = this.name + ': '; - result += this.reason || '(unknown reason)'; + result += this.reason || '(unknown reason)'; - if (!compact && this.mark) { - result += ' ' + this.mark.toString(); - } + if (!compact && this.mark) { + result += ' ' + this.mark.toString(); + } - return result; - }; + return result; +}; - module.exports = YAMLException; +module.exports = YAMLException; },{}],5:[function(require,module,exports){ - 'use strict'; +'use strict'; - /*eslint-disable max-len,no-use-before-define*/ +/*eslint-disable max-len,no-use-before-define*/ - var common = require('./common'); - var YAMLException = require('./exception'); - var Mark = require('./mark'); - var DEFAULT_SAFE_SCHEMA = require('./schema/default_safe'); - var DEFAULT_FULL_SCHEMA = require('./schema/default_full'); +var common = require('./common'); +var YAMLException = require('./exception'); +var Mark = require('./mark'); +var DEFAULT_SAFE_SCHEMA = require('./schema/default_safe'); +var DEFAULT_FULL_SCHEMA = require('./schema/default_full'); - var _hasOwnProperty = Object.prototype.hasOwnProperty; +var _hasOwnProperty = Object.prototype.hasOwnProperty; - var CONTEXT_FLOW_IN = 1; - var CONTEXT_FLOW_OUT = 2; - var CONTEXT_BLOCK_IN = 3; - var CONTEXT_BLOCK_OUT = 4; +var CONTEXT_FLOW_IN = 1; +var CONTEXT_FLOW_OUT = 2; +var CONTEXT_BLOCK_IN = 3; +var CONTEXT_BLOCK_OUT = 4; - var CHOMPING_CLIP = 1; - var CHOMPING_STRIP = 2; - var CHOMPING_KEEP = 3; +var CHOMPING_CLIP = 1; +var CHOMPING_STRIP = 2; +var CHOMPING_KEEP = 3; - var PATTERN_NON_PRINTABLE = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/; - var PATTERN_NON_ASCII_LINE_BREAKS = /[\x85\u2028\u2029]/; - var PATTERN_FLOW_INDICATORS = /[,\[\]\{\}]/; - var PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\-]+!)$/i; - var PATTERN_TAG_URI = /^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i; +var PATTERN_NON_PRINTABLE = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/; +var PATTERN_NON_ASCII_LINE_BREAKS = /[\x85\u2028\u2029]/; +var PATTERN_FLOW_INDICATORS = /[,\[\]\{\}]/; +var PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\-]+!)$/i; +var PATTERN_TAG_URI = /^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i; - function is_EOL(c) { - return (c === 0x0A/* LF */) || (c === 0x0D/* CR */); - } - - function is_WHITE_SPACE(c) { - return (c === 0x09/* Tab */) || (c === 0x20/* Space */); - } +function is_EOL(c) { + return (c === 0x0A/* LF */) || (c === 0x0D/* CR */); +} - function is_WS_OR_EOL(c) { - return (c === 0x09/* Tab */) || - (c === 0x20/* Space */) || - (c === 0x0A/* LF */) || - (c === 0x0D/* CR */); - } +function is_WHITE_SPACE(c) { + return (c === 0x09/* Tab */) || (c === 0x20/* Space */); +} - function is_FLOW_INDICATOR(c) { - return 0x2C/* , */ === c || - 0x5B/* [ */ === c || - 0x5D/* ] */ === c || - 0x7B/* { */ === c || - 0x7D/* } */ === c; - } +function is_WS_OR_EOL(c) { + return (c === 0x09/* Tab */) || + (c === 0x20/* Space */) || + (c === 0x0A/* LF */) || + (c === 0x0D/* CR */); +} - function fromHexCode(c) { - var lc; +function is_FLOW_INDICATOR(c) { + return 0x2C/* , */ === c || + 0x5B/* [ */ === c || + 0x5D/* ] */ === c || + 0x7B/* { */ === c || + 0x7D/* } */ === c; +} - if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) { - return c - 0x30; - } +function fromHexCode(c) { + var lc; - /*eslint-disable no-bitwise*/ - lc = c | 0x20; + if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) { + return c - 0x30; + } - if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) { - return lc - 0x61 + 10; - } + /*eslint-disable no-bitwise*/ + lc = c | 0x20; - return -1; + if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) { + return lc - 0x61 + 10; } - function escapedHexLen(c) { - if (c === 0x78/* x */) { return 2; } - if (c === 0x75/* u */) { return 4; } - if (c === 0x55/* U */) { return 8; } - return 0; - } + return -1; +} - function fromDecimalCode(c) { - if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) { - return c - 0x30; - } +function escapedHexLen(c) { + if (c === 0x78/* x */) { return 2; } + if (c === 0x75/* u */) { return 4; } + if (c === 0x55/* U */) { return 8; } + return 0; +} - return -1; +function fromDecimalCode(c) { + if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) { + return c - 0x30; } - function simpleEscapeSequence(c) { - return (c === 0x30/* 0 */) ? '\x00' : + return -1; +} + +function simpleEscapeSequence(c) { + return (c === 0x30/* 0 */) ? '\x00' : (c === 0x61/* a */) ? '\x07' : - (c === 0x62/* b */) ? '\x08' : - (c === 0x74/* t */) ? '\x09' : - (c === 0x09/* Tab */) ? '\x09' : - (c === 0x6E/* n */) ? '\x0A' : - (c === 0x76/* v */) ? '\x0B' : - (c === 0x66/* f */) ? '\x0C' : - (c === 0x72/* r */) ? '\x0D' : - (c === 0x65/* e */) ? '\x1B' : - (c === 0x20/* Space */) ? ' ' : - (c === 0x22/* " */) ? '\x22' : - (c === 0x2F/* / */) ? '/' : - (c === 0x5C/* \ */) ? '\x5C' : - (c === 0x4E/* N */) ? '\x85' : - (c === 0x5F/* _ */) ? '\xA0' : - (c === 0x4C/* L */) ? '\u2028' : - (c === 0x50/* P */) ? '\u2029' : ''; - } + (c === 0x62/* b */) ? '\x08' : + (c === 0x74/* t */) ? '\x09' : + (c === 0x09/* Tab */) ? '\x09' : + (c === 0x6E/* n */) ? '\x0A' : + (c === 0x76/* v */) ? '\x0B' : + (c === 0x66/* f */) ? '\x0C' : + (c === 0x72/* r */) ? '\x0D' : + (c === 0x65/* e */) ? '\x1B' : + (c === 0x20/* Space */) ? ' ' : + (c === 0x22/* " */) ? '\x22' : + (c === 0x2F/* / */) ? '/' : + (c === 0x5C/* \ */) ? '\x5C' : + (c === 0x4E/* N */) ? '\x85' : + (c === 0x5F/* _ */) ? '\xA0' : + (c === 0x4C/* L */) ? '\u2028' : + (c === 0x50/* P */) ? '\u2029' : ''; +} - function charFromCodepoint(c) { - if (c <= 0xFFFF) { - return String.fromCharCode(c); - } - // Encode UTF-16 surrogate pair - // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF - return String.fromCharCode(((c - 0x010000) >> 10) + 0xD800, - ((c - 0x010000) & 0x03FF) + 0xDC00); +function charFromCodepoint(c) { + if (c <= 0xFFFF) { + return String.fromCharCode(c); } + // Encode UTF-16 surrogate pair + // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF + return String.fromCharCode(((c - 0x010000) >> 10) + 0xD800, + ((c - 0x010000) & 0x03FF) + 0xDC00); +} - var simpleEscapeCheck = new Array(256); // integer, for fast access - var simpleEscapeMap = new Array(256); - for (var i = 0; i < 256; i++) { - simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0; - simpleEscapeMap[i] = simpleEscapeSequence(i); - } +var simpleEscapeCheck = new Array(256); // integer, for fast access +var simpleEscapeMap = new Array(256); +for (var i = 0; i < 256; i++) { + simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0; + simpleEscapeMap[i] = simpleEscapeSequence(i); +} - function State(input, options) { - this.input = input; +function State(input, options) { + this.input = input; - this.filename = options['filename'] || null; - this.schema = options['schema'] || DEFAULT_FULL_SCHEMA; - this.onWarning = options['onWarning'] || null; - this.legacy = options['legacy'] || false; - this.json = options['json'] || false; + this.filename = options['filename'] || null; + this.schema = options['schema'] || DEFAULT_FULL_SCHEMA; + this.onWarning = options['onWarning'] || null; + this.legacy = options['legacy'] || false; + this.json = options['json'] || false; + this.listener = options['listener'] || null; - this.implicitTypes = this.schema.compiledImplicit; - this.typeMap = this.schema.compiledTypeMap; + this.implicitTypes = this.schema.compiledImplicit; + this.typeMap = this.schema.compiledTypeMap; - this.length = input.length; - this.position = 0; - this.line = 0; - this.lineStart = 0; - this.lineIndent = 0; + this.length = input.length; + this.position = 0; + this.line = 0; + this.lineStart = 0; + this.lineIndent = 0; - this.documents = []; + this.documents = []; - /* - this.version; - this.checkLineBreaks; - this.tagMap; - this.anchorMap; - this.tag; - this.anchor; - this.kind; - this.result;*/ + /* + this.version; + this.checkLineBreaks; + this.tagMap; + this.anchorMap; + this.tag; + this.anchor; + this.kind; + this.result;*/ - } +} - function generateError(state, message) { - return new YAMLException( - message, - new Mark(state.filename, state.input, state.position, state.line, (state.position - state.lineStart))); - } +function generateError(state, message) { + return new YAMLException( + message, + new Mark(state.filename, state.input, state.position, state.line, (state.position - state.lineStart))); +} - function throwError(state, message) { - throw generateError(state, message); - } +function throwError(state, message) { + throw generateError(state, message); +} - function throwWarning(state, message) { - if (state.onWarning) { - state.onWarning.call(null, generateError(state, message)); - } +function throwWarning(state, message) { + if (state.onWarning) { + state.onWarning.call(null, generateError(state, message)); } +} - var directiveHandlers = { - - YAML: function handleYamlDirective(state, name, args) { +var directiveHandlers = { - var match, major, minor; + YAML: function handleYamlDirective(state, name, args) { - if (null !== state.version) { - throwError(state, 'duplication of %YAML directive'); - } + var match, major, minor; - if (1 !== args.length) { - throwError(state, 'YAML directive accepts exactly one argument'); - } + if (null !== state.version) { + throwError(state, 'duplication of %YAML directive'); + } - match = /^([0-9]+)\.([0-9]+)$/.exec(args[0]); + if (1 !== args.length) { + throwError(state, 'YAML directive accepts exactly one argument'); + } - if (null === match) { - throwError(state, 'ill-formed argument of the YAML directive'); - } + match = /^([0-9]+)\.([0-9]+)$/.exec(args[0]); - major = parseInt(match[1], 10); - minor = parseInt(match[2], 10); + if (null === match) { + throwError(state, 'ill-formed argument of the YAML directive'); + } - if (1 !== major) { - throwError(state, 'unacceptable YAML version of the document'); - } + major = parseInt(match[1], 10); + minor = parseInt(match[2], 10); - state.version = args[0]; - state.checkLineBreaks = (minor < 2); + if (1 !== major) { + throwError(state, 'unacceptable YAML version of the document'); + } - if (1 !== minor && 2 !== minor) { - throwWarning(state, 'unsupported YAML version of the document'); - } - }, + state.version = args[0]; + state.checkLineBreaks = (minor < 2); - TAG: function handleTagDirective(state, name, args) { + if (1 !== minor && 2 !== minor) { + throwWarning(state, 'unsupported YAML version of the document'); + } + }, - var handle, prefix; + TAG: function handleTagDirective(state, name, args) { - if (2 !== args.length) { - throwError(state, 'TAG directive accepts exactly two arguments'); - } + var handle, prefix; - handle = args[0]; - prefix = args[1]; + if (2 !== args.length) { + throwError(state, 'TAG directive accepts exactly two arguments'); + } - if (!PATTERN_TAG_HANDLE.test(handle)) { - throwError(state, 'ill-formed tag handle (first argument) of the TAG directive'); - } + handle = args[0]; + prefix = args[1]; - if (_hasOwnProperty.call(state.tagMap, handle)) { - throwError(state, 'there is a previously declared suffix for "' + handle + '" tag handle'); - } + if (!PATTERN_TAG_HANDLE.test(handle)) { + throwError(state, 'ill-formed tag handle (first argument) of the TAG directive'); + } - if (!PATTERN_TAG_URI.test(prefix)) { - throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive'); - } + if (_hasOwnProperty.call(state.tagMap, handle)) { + throwError(state, 'there is a previously declared suffix for "' + handle + '" tag handle'); + } - state.tagMap[handle] = prefix; + if (!PATTERN_TAG_URI.test(prefix)) { + throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive'); } - }; + state.tagMap[handle] = prefix; + } +}; - function captureSegment(state, start, end, checkJson) { - var _position, _length, _character, _result; - if (start < end) { - _result = state.input.slice(start, end); +function captureSegment(state, start, end, checkJson) { + var _position, _length, _character, _result; - if (checkJson) { - for (_position = 0, _length = _result.length; - _position < _length; - _position += 1) { - _character = _result.charCodeAt(_position); - if (!(0x09 === _character || + if (start < end) { + _result = state.input.slice(start, end); + + if (checkJson) { + for (_position = 0, _length = _result.length; + _position < _length; + _position += 1) { + _character = _result.charCodeAt(_position); + if (!(0x09 === _character || 0x20 <= _character && _character <= 0x10FFFF)) { - throwError(state, 'expected valid JSON character'); - } + throwError(state, 'expected valid JSON character'); } - } else if (PATTERN_NON_PRINTABLE.test(_result)) { - throwError(state, 'the stream contains non-printable characters'); } - - state.result += _result; + } else if (PATTERN_NON_PRINTABLE.test(_result)) { + throwError(state, 'the stream contains non-printable characters'); } + + state.result += _result; } +} - function mergeMappings(state, destination, source, overridableKeys) { - var sourceKeys, key, index, quantity; +function mergeMappings(state, destination, source, overridableKeys) { + var sourceKeys, key, index, quantity; - if (!common.isObject(source)) { - throwError(state, 'cannot merge mappings; the provided source object is unacceptable'); - } + if (!common.isObject(source)) { + throwError(state, 'cannot merge mappings; the provided source object is unacceptable'); + } - sourceKeys = Object.keys(source); + sourceKeys = Object.keys(source); - for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) { - key = sourceKeys[index]; + for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) { + key = sourceKeys[index]; - if (!_hasOwnProperty.call(destination, key)) { - destination[key] = source[key]; - overridableKeys[key] = true; - } + if (!_hasOwnProperty.call(destination, key)) { + destination[key] = source[key]; + overridableKeys[key] = true; } } +} - function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode) { - var index, quantity; +function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode) { + var index, quantity; - keyNode = String(keyNode); + keyNode = String(keyNode); - if (null === _result) { - _result = {}; - } + if (null === _result) { + _result = {}; + } - if ('tag:yaml.org,2002:merge' === keyTag) { - if (Array.isArray(valueNode)) { - for (index = 0, quantity = valueNode.length; index < quantity; index += 1) { - mergeMappings(state, _result, valueNode[index], overridableKeys); - } - } else { - mergeMappings(state, _result, valueNode, overridableKeys); + if ('tag:yaml.org,2002:merge' === keyTag) { + if (Array.isArray(valueNode)) { + for (index = 0, quantity = valueNode.length; index < quantity; index += 1) { + mergeMappings(state, _result, valueNode[index], overridableKeys); } } else { - if (!state.json && - !_hasOwnProperty.call(overridableKeys, keyNode) && - _hasOwnProperty.call(_result, keyNode)) { - throwError(state, 'duplicated mapping key'); - } - _result[keyNode] = valueNode; - delete overridableKeys[keyNode]; + mergeMappings(state, _result, valueNode, overridableKeys); } - - return _result; + } else { + if (!state.json && + !_hasOwnProperty.call(overridableKeys, keyNode) && + _hasOwnProperty.call(_result, keyNode)) { + throwError(state, 'duplicated mapping key'); + } + _result[keyNode] = valueNode; + delete overridableKeys[keyNode]; } - function readLineBreak(state) { - var ch; + return _result; +} - ch = state.input.charCodeAt(state.position); +function readLineBreak(state) { + var ch; - if (0x0A/* LF */ === ch) { - state.position++; - } else if (0x0D/* CR */ === ch) { + ch = state.input.charCodeAt(state.position); + + if (0x0A/* LF */ === ch) { + state.position++; + } else if (0x0D/* CR */ === ch) { + state.position++; + if (0x0A/* LF */ === state.input.charCodeAt(state.position)) { state.position++; - if (0x0A/* LF */ === state.input.charCodeAt(state.position)) { - state.position++; - } - } else { - throwError(state, 'a line break is expected'); } - - state.line += 1; - state.lineStart = state.position; + } else { + throwError(state, 'a line break is expected'); } - function skipSeparationSpace(state, allowComments, checkIndent) { - var lineBreaks = 0, - ch = state.input.charCodeAt(state.position); + state.line += 1; + state.lineStart = state.position; +} - while (0 !== ch) { - while (is_WHITE_SPACE(ch)) { - ch = state.input.charCodeAt(++state.position); - } +function skipSeparationSpace(state, allowComments, checkIndent) { + var lineBreaks = 0, + ch = state.input.charCodeAt(state.position); - if (allowComments && 0x23/* # */ === ch) { - do { - ch = state.input.charCodeAt(++state.position); - } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && 0 !== ch); - } + while (0 !== ch) { + while (is_WHITE_SPACE(ch)) { + ch = state.input.charCodeAt(++state.position); + } - if (is_EOL(ch)) { - readLineBreak(state); + if (allowComments && 0x23/* # */ === ch) { + do { + ch = state.input.charCodeAt(++state.position); + } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && 0 !== ch); + } - ch = state.input.charCodeAt(state.position); - lineBreaks++; - state.lineIndent = 0; + if (is_EOL(ch)) { + readLineBreak(state); - while (0x20/* Space */ === ch) { - state.lineIndent++; - ch = state.input.charCodeAt(++state.position); - } - } else { - break; - } - } + ch = state.input.charCodeAt(state.position); + lineBreaks++; + state.lineIndent = 0; - if (-1 !== checkIndent && 0 !== lineBreaks && state.lineIndent < checkIndent) { - throwWarning(state, 'deficient indentation'); + while (0x20/* Space */ === ch) { + state.lineIndent++; + ch = state.input.charCodeAt(++state.position); + } + } else { + break; } - - return lineBreaks; } - function testDocumentSeparator(state) { - var _position = state.position, - ch; + if (-1 !== checkIndent && 0 !== lineBreaks && state.lineIndent < checkIndent) { + throwWarning(state, 'deficient indentation'); + } - ch = state.input.charCodeAt(_position); + return lineBreaks; +} - // Condition state.position === state.lineStart is tested - // in parent on each call, for efficiency. No needs to test here again. - if ((0x2D/* - */ === ch || 0x2E/* . */ === ch) && - state.input.charCodeAt(_position + 1) === ch && - state.input.charCodeAt(_position + 2) === ch) { +function testDocumentSeparator(state) { + var _position = state.position, + ch; - _position += 3; + ch = state.input.charCodeAt(_position); - ch = state.input.charCodeAt(_position); + // Condition state.position === state.lineStart is tested + // in parent on each call, for efficiency. No needs to test here again. + if ((0x2D/* - */ === ch || 0x2E/* . */ === ch) && + state.input.charCodeAt(_position + 1) === ch && + state.input.charCodeAt(_position + 2) === ch) { - if (ch === 0 || is_WS_OR_EOL(ch)) { - return true; - } - } + _position += 3; - return false; - } + ch = state.input.charCodeAt(_position); - function writeFoldedLines(state, count) { - if (1 === count) { - state.result += ' '; - } else if (count > 1) { - state.result += common.repeat('\n', count - 1); + if (ch === 0 || is_WS_OR_EOL(ch)) { + return true; } } + return false; +} + +function writeFoldedLines(state, count) { + if (1 === count) { + state.result += ' '; + } else if (count > 1) { + state.result += common.repeat('\n', count - 1); + } +} + + +function readPlainScalar(state, nodeIndent, withinFlowCollection) { + var preceding, + following, + captureStart, + captureEnd, + hasPendingContent, + _line, + _lineStart, + _lineIndent, + _kind = state.kind, + _result = state.result, + ch; + + ch = state.input.charCodeAt(state.position); + + if (is_WS_OR_EOL(ch) || + is_FLOW_INDICATOR(ch) || + 0x23/* # */ === ch || + 0x26/* & */ === ch || + 0x2A/* * */ === ch || + 0x21/* ! */ === ch || + 0x7C/* | */ === ch || + 0x3E/* > */ === ch || + 0x27/* ' */ === ch || + 0x22/* " */ === ch || + 0x25/* % */ === ch || + 0x40/* @ */ === ch || + 0x60/* ` */ === ch) { + return false; + } - function readPlainScalar(state, nodeIndent, withinFlowCollection) { - var preceding, - following, - captureStart, - captureEnd, - hasPendingContent, - _line, - _lineStart, - _lineIndent, - _kind = state.kind, - _result = state.result, - ch; - - ch = state.input.charCodeAt(state.position); + if (0x3F/* ? */ === ch || 0x2D/* - */ === ch) { + following = state.input.charCodeAt(state.position + 1); - if (is_WS_OR_EOL(ch) || - is_FLOW_INDICATOR(ch) || - 0x23/* # */ === ch || - 0x26/* & */ === ch || - 0x2A/* * */ === ch || - 0x21/* ! */ === ch || - 0x7C/* | */ === ch || - 0x3E/* > */ === ch || - 0x27/* ' */ === ch || - 0x22/* " */ === ch || - 0x25/* % */ === ch || - 0x40/* @ */ === ch || - 0x60/* ` */ === ch) { + if (is_WS_OR_EOL(following) || + withinFlowCollection && is_FLOW_INDICATOR(following)) { return false; } + } + + state.kind = 'scalar'; + state.result = ''; + captureStart = captureEnd = state.position; + hasPendingContent = false; - if (0x3F/* ? */ === ch || 0x2D/* - */ === ch) { + while (0 !== ch) { + if (0x3A/* : */ === ch) { following = state.input.charCodeAt(state.position + 1); if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) { - return false; + break; } - } - - state.kind = 'scalar'; - state.result = ''; - captureStart = captureEnd = state.position; - hasPendingContent = false; - - while (0 !== ch) { - if (0x3A/* : */ === ch) { - following = state.input.charCodeAt(state.position + 1); - if (is_WS_OR_EOL(following) || - withinFlowCollection && is_FLOW_INDICATOR(following)) { - break; - } - - } else if (0x23/* # */ === ch) { - preceding = state.input.charCodeAt(state.position - 1); - - if (is_WS_OR_EOL(preceding)) { - break; - } + } else if (0x23/* # */ === ch) { + preceding = state.input.charCodeAt(state.position - 1); - } else if ((state.position === state.lineStart && testDocumentSeparator(state)) || - withinFlowCollection && is_FLOW_INDICATOR(ch)) { + if (is_WS_OR_EOL(preceding)) { break; - - } else if (is_EOL(ch)) { - _line = state.line; - _lineStart = state.lineStart; - _lineIndent = state.lineIndent; - skipSeparationSpace(state, false, -1); - - if (state.lineIndent >= nodeIndent) { - hasPendingContent = true; - ch = state.input.charCodeAt(state.position); - continue; - } else { - state.position = captureEnd; - state.line = _line; - state.lineStart = _lineStart; - state.lineIndent = _lineIndent; - break; - } } - if (hasPendingContent) { - captureSegment(state, captureStart, captureEnd, false); - writeFoldedLines(state, state.line - _line); - captureStart = captureEnd = state.position; - hasPendingContent = false; - } + } else if ((state.position === state.lineStart && testDocumentSeparator(state)) || + withinFlowCollection && is_FLOW_INDICATOR(ch)) { + break; - if (!is_WHITE_SPACE(ch)) { - captureEnd = state.position + 1; - } + } else if (is_EOL(ch)) { + _line = state.line; + _lineStart = state.lineStart; + _lineIndent = state.lineIndent; + skipSeparationSpace(state, false, -1); - ch = state.input.charCodeAt(++state.position); + if (state.lineIndent >= nodeIndent) { + hasPendingContent = true; + ch = state.input.charCodeAt(state.position); + continue; + } else { + state.position = captureEnd; + state.line = _line; + state.lineStart = _lineStart; + state.lineIndent = _lineIndent; + break; + } } - captureSegment(state, captureStart, captureEnd, false); + if (hasPendingContent) { + captureSegment(state, captureStart, captureEnd, false); + writeFoldedLines(state, state.line - _line); + captureStart = captureEnd = state.position; + hasPendingContent = false; + } - if (state.result) { - return true; + if (!is_WHITE_SPACE(ch)) { + captureEnd = state.position + 1; } - state.kind = _kind; - state.result = _result; - return false; + ch = state.input.charCodeAt(++state.position); } - function readSingleQuotedScalar(state, nodeIndent) { - var ch, - captureStart, captureEnd; + captureSegment(state, captureStart, captureEnd, false); - ch = state.input.charCodeAt(state.position); + if (state.result) { + return true; + } - if (0x27/* ' */ !== ch) { - return false; - } + state.kind = _kind; + state.result = _result; + return false; +} - state.kind = 'scalar'; - state.result = ''; - state.position++; - captureStart = captureEnd = state.position; +function readSingleQuotedScalar(state, nodeIndent) { + var ch, + captureStart, captureEnd; - while (0 !== (ch = state.input.charCodeAt(state.position))) { - if (0x27/* ' */ === ch) { - captureSegment(state, captureStart, state.position, true); - ch = state.input.charCodeAt(++state.position); + ch = state.input.charCodeAt(state.position); - if (0x27/* ' */ === ch) { - captureStart = captureEnd = state.position; - state.position++; - } else { - return true; - } + if (0x27/* ' */ !== ch) { + return false; + } - } else if (is_EOL(ch)) { - captureSegment(state, captureStart, captureEnd, true); - writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); - captureStart = captureEnd = state.position; + state.kind = 'scalar'; + state.result = ''; + state.position++; + captureStart = captureEnd = state.position; - } else if (state.position === state.lineStart && testDocumentSeparator(state)) { - throwError(state, 'unexpected end of the document within a single quoted scalar'); + while (0 !== (ch = state.input.charCodeAt(state.position))) { + if (0x27/* ' */ === ch) { + captureSegment(state, captureStart, state.position, true); + ch = state.input.charCodeAt(++state.position); - } else { + if (0x27/* ' */ === ch) { + captureStart = captureEnd = state.position; state.position++; - captureEnd = state.position; + } else { + return true; } - } - - throwError(state, 'unexpected end of the stream within a single quoted scalar'); - } - function readDoubleQuotedScalar(state, nodeIndent) { - var captureStart, - captureEnd, - hexLength, - hexResult, - tmp, - ch; + } else if (is_EOL(ch)) { + captureSegment(state, captureStart, captureEnd, true); + writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); + captureStart = captureEnd = state.position; - ch = state.input.charCodeAt(state.position); + } else if (state.position === state.lineStart && testDocumentSeparator(state)) { + throwError(state, 'unexpected end of the document within a single quoted scalar'); - if (0x22/* " */ !== ch) { - return false; + } else { + state.position++; + captureEnd = state.position; } + } - state.kind = 'scalar'; - state.result = ''; - state.position++; - captureStart = captureEnd = state.position; + throwError(state, 'unexpected end of the stream within a single quoted scalar'); +} - while (0 !== (ch = state.input.charCodeAt(state.position))) { - if (0x22/* " */ === ch) { - captureSegment(state, captureStart, state.position, true); - state.position++; - return true; +function readDoubleQuotedScalar(state, nodeIndent) { + var captureStart, + captureEnd, + hexLength, + hexResult, + tmp, + ch; - } else if (0x5C/* \ */ === ch) { - captureSegment(state, captureStart, state.position, true); - ch = state.input.charCodeAt(++state.position); + ch = state.input.charCodeAt(state.position); - if (is_EOL(ch)) { - skipSeparationSpace(state, false, nodeIndent); + if (0x22/* " */ !== ch) { + return false; + } - // TODO: rework to inline fn with no type cast? - } else if (ch < 256 && simpleEscapeCheck[ch]) { - state.result += simpleEscapeMap[ch]; - state.position++; + state.kind = 'scalar'; + state.result = ''; + state.position++; + captureStart = captureEnd = state.position; - } else if ((tmp = escapedHexLen(ch)) > 0) { - hexLength = tmp; - hexResult = 0; + while (0 !== (ch = state.input.charCodeAt(state.position))) { + if (0x22/* " */ === ch) { + captureSegment(state, captureStart, state.position, true); + state.position++; + return true; - for (; hexLength > 0; hexLength--) { - ch = state.input.charCodeAt(++state.position); + } else if (0x5C/* \ */ === ch) { + captureSegment(state, captureStart, state.position, true); + ch = state.input.charCodeAt(++state.position); - if ((tmp = fromHexCode(ch)) >= 0) { - hexResult = (hexResult << 4) + tmp; + if (is_EOL(ch)) { + skipSeparationSpace(state, false, nodeIndent); - } else { - throwError(state, 'expected hexadecimal character'); - } - } + // TODO: rework to inline fn with no type cast? + } else if (ch < 256 && simpleEscapeCheck[ch]) { + state.result += simpleEscapeMap[ch]; + state.position++; - state.result += charFromCodepoint(hexResult); + } else if ((tmp = escapedHexLen(ch)) > 0) { + hexLength = tmp; + hexResult = 0; - state.position++; + for (; hexLength > 0; hexLength--) { + ch = state.input.charCodeAt(++state.position); - } else { - throwError(state, 'unknown escape sequence'); - } + if ((tmp = fromHexCode(ch)) >= 0) { + hexResult = (hexResult << 4) + tmp; - captureStart = captureEnd = state.position; + } else { + throwError(state, 'expected hexadecimal character'); + } + } - } else if (is_EOL(ch)) { - captureSegment(state, captureStart, captureEnd, true); - writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); - captureStart = captureEnd = state.position; + state.result += charFromCodepoint(hexResult); - } else if (state.position === state.lineStart && testDocumentSeparator(state)) { - throwError(state, 'unexpected end of the document within a double quoted scalar'); + state.position++; } else { - state.position++; - captureEnd = state.position; + throwError(state, 'unknown escape sequence'); } - } - throwError(state, 'unexpected end of the stream within a double quoted scalar'); - } + captureStart = captureEnd = state.position; - function readFlowCollection(state, nodeIndent) { - var readNext = true, - _line, - _tag = state.tag, - _result, - _anchor = state.anchor, - following, - terminator, - isPair, - isExplicitPair, - isMapping, - overridableKeys = {}, - keyNode, - keyTag, - valueNode, - ch; + } else if (is_EOL(ch)) { + captureSegment(state, captureStart, captureEnd, true); + writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); + captureStart = captureEnd = state.position; - ch = state.input.charCodeAt(state.position); + } else if (state.position === state.lineStart && testDocumentSeparator(state)) { + throwError(state, 'unexpected end of the document within a double quoted scalar'); - if (ch === 0x5B/* [ */) { - terminator = 0x5D;/* ] */ - isMapping = false; - _result = []; - } else if (ch === 0x7B/* { */) { - terminator = 0x7D;/* } */ - isMapping = true; - _result = {}; } else { - return false; - } - - if (null !== state.anchor) { - state.anchorMap[state.anchor] = _result; - } + state.position++; + captureEnd = state.position; + } + } + + throwError(state, 'unexpected end of the stream within a double quoted scalar'); +} + +function readFlowCollection(state, nodeIndent) { + var readNext = true, + _line, + _tag = state.tag, + _result, + _anchor = state.anchor, + following, + terminator, + isPair, + isExplicitPair, + isMapping, + overridableKeys = {}, + keyNode, + keyTag, + valueNode, + ch; + + ch = state.input.charCodeAt(state.position); + + if (ch === 0x5B/* [ */) { + terminator = 0x5D;/* ] */ + isMapping = false; + _result = []; + } else if (ch === 0x7B/* { */) { + terminator = 0x7D;/* } */ + isMapping = true; + _result = {}; + } else { + return false; + } - ch = state.input.charCodeAt(++state.position); + if (null !== state.anchor) { + state.anchorMap[state.anchor] = _result; + } - while (0 !== ch) { - skipSeparationSpace(state, true, nodeIndent); + ch = state.input.charCodeAt(++state.position); - ch = state.input.charCodeAt(state.position); + while (0 !== ch) { + skipSeparationSpace(state, true, nodeIndent); - if (ch === terminator) { - state.position++; - state.tag = _tag; - state.anchor = _anchor; - state.kind = isMapping ? 'mapping' : 'sequence'; - state.result = _result; - return true; - } else if (!readNext) { - throwError(state, 'missed comma between flow collection entries'); - } - - keyTag = keyNode = valueNode = null; - isPair = isExplicitPair = false; - - if (0x3F/* ? */ === ch) { - following = state.input.charCodeAt(state.position + 1); + ch = state.input.charCodeAt(state.position); - if (is_WS_OR_EOL(following)) { - isPair = isExplicitPair = true; - state.position++; - skipSeparationSpace(state, true, nodeIndent); - } - } + if (ch === terminator) { + state.position++; + state.tag = _tag; + state.anchor = _anchor; + state.kind = isMapping ? 'mapping' : 'sequence'; + state.result = _result; + return true; + } else if (!readNext) { + throwError(state, 'missed comma between flow collection entries'); + } - _line = state.line; - composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); - keyTag = state.tag; - keyNode = state.result; - skipSeparationSpace(state, true, nodeIndent); + keyTag = keyNode = valueNode = null; + isPair = isExplicitPair = false; - ch = state.input.charCodeAt(state.position); + if (0x3F/* ? */ === ch) { + following = state.input.charCodeAt(state.position + 1); - if ((isExplicitPair || state.line === _line) && 0x3A/* : */ === ch) { - isPair = true; - ch = state.input.charCodeAt(++state.position); + if (is_WS_OR_EOL(following)) { + isPair = isExplicitPair = true; + state.position++; skipSeparationSpace(state, true, nodeIndent); - composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); - valueNode = state.result; - } - - if (isMapping) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode); - } else if (isPair) { - _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode)); - } else { - _result.push(keyNode); } + } - skipSeparationSpace(state, true, nodeIndent); + _line = state.line; + composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); + keyTag = state.tag; + keyNode = state.result; + skipSeparationSpace(state, true, nodeIndent); - ch = state.input.charCodeAt(state.position); + ch = state.input.charCodeAt(state.position); - if (0x2C/* , */ === ch) { - readNext = true; - ch = state.input.charCodeAt(++state.position); - } else { - readNext = false; - } + if ((isExplicitPair || state.line === _line) && 0x3A/* : */ === ch) { + isPair = true; + ch = state.input.charCodeAt(++state.position); + skipSeparationSpace(state, true, nodeIndent); + composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); + valueNode = state.result; } - throwError(state, 'unexpected end of the stream within a flow collection'); - } + if (isMapping) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode); + } else if (isPair) { + _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode)); + } else { + _result.push(keyNode); + } - function readBlockScalar(state, nodeIndent) { - var captureStart, - folding, - chomping = CHOMPING_CLIP, - detectedIndent = false, - textIndent = nodeIndent, - emptyLines = 0, - atMoreIndented = false, - tmp, - ch; + skipSeparationSpace(state, true, nodeIndent); ch = state.input.charCodeAt(state.position); - if (ch === 0x7C/* | */) { - folding = false; - } else if (ch === 0x3E/* > */) { - folding = true; + if (0x2C/* , */ === ch) { + readNext = true; + ch = state.input.charCodeAt(++state.position); } else { - return false; + readNext = false; } + } - state.kind = 'scalar'; - state.result = ''; + throwError(state, 'unexpected end of the stream within a flow collection'); +} - while (0 !== ch) { - ch = state.input.charCodeAt(++state.position); +function readBlockScalar(state, nodeIndent) { + var captureStart, + folding, + chomping = CHOMPING_CLIP, + detectedIndent = false, + textIndent = nodeIndent, + emptyLines = 0, + atMoreIndented = false, + tmp, + ch; - if (0x2B/* + */ === ch || 0x2D/* - */ === ch) { - if (CHOMPING_CLIP === chomping) { - chomping = (0x2B/* + */ === ch) ? CHOMPING_KEEP : CHOMPING_STRIP; - } else { - throwError(state, 'repeat of a chomping mode identifier'); - } + ch = state.input.charCodeAt(state.position); - } else if ((tmp = fromDecimalCode(ch)) >= 0) { - if (tmp === 0) { - throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one'); - } else if (!detectedIndent) { - textIndent = nodeIndent + tmp - 1; - detectedIndent = true; - } else { - throwError(state, 'repeat of an indentation width identifier'); - } + if (ch === 0x7C/* | */) { + folding = false; + } else if (ch === 0x3E/* > */) { + folding = true; + } else { + return false; + } + + state.kind = 'scalar'; + state.result = ''; + while (0 !== ch) { + ch = state.input.charCodeAt(++state.position); + + if (0x2B/* + */ === ch || 0x2D/* - */ === ch) { + if (CHOMPING_CLIP === chomping) { + chomping = (0x2B/* + */ === ch) ? CHOMPING_KEEP : CHOMPING_STRIP; } else { - break; + throwError(state, 'repeat of a chomping mode identifier'); } + + } else if ((tmp = fromDecimalCode(ch)) >= 0) { + if (tmp === 0) { + throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one'); + } else if (!detectedIndent) { + textIndent = nodeIndent + tmp - 1; + detectedIndent = true; + } else { + throwError(state, 'repeat of an indentation width identifier'); + } + + } else { + break; } + } - if (is_WHITE_SPACE(ch)) { - do { ch = state.input.charCodeAt(++state.position); } - while (is_WHITE_SPACE(ch)); + if (is_WHITE_SPACE(ch)) { + do { ch = state.input.charCodeAt(++state.position); } + while (is_WHITE_SPACE(ch)); - if (0x23/* # */ === ch) { - do { ch = state.input.charCodeAt(++state.position); } - while (!is_EOL(ch) && (0 !== ch)); - } + if (0x23/* # */ === ch) { + do { ch = state.input.charCodeAt(++state.position); } + while (!is_EOL(ch) && (0 !== ch)); } + } - while (0 !== ch) { - readLineBreak(state); - state.lineIndent = 0; + while (0 !== ch) { + readLineBreak(state); + state.lineIndent = 0; - ch = state.input.charCodeAt(state.position); + ch = state.input.charCodeAt(state.position); - while ((!detectedIndent || state.lineIndent < textIndent) && - (0x20/* Space */ === ch)) { - state.lineIndent++; - ch = state.input.charCodeAt(++state.position); - } + while ((!detectedIndent || state.lineIndent < textIndent) && + (0x20/* Space */ === ch)) { + state.lineIndent++; + ch = state.input.charCodeAt(++state.position); + } - if (!detectedIndent && state.lineIndent > textIndent) { - textIndent = state.lineIndent; - } + if (!detectedIndent && state.lineIndent > textIndent) { + textIndent = state.lineIndent; + } - if (is_EOL(ch)) { - emptyLines++; - continue; - } + if (is_EOL(ch)) { + emptyLines++; + continue; + } - // End of the scalar. - if (state.lineIndent < textIndent) { + // End of the scalar. + if (state.lineIndent < textIndent) { - // Perform the chomping. - if (chomping === CHOMPING_KEEP) { - state.result += common.repeat('\n', emptyLines); - } else if (chomping === CHOMPING_CLIP) { - if (detectedIndent) { // i.e. only if the scalar is not empty. - state.result += '\n'; - } + // Perform the chomping. + if (chomping === CHOMPING_KEEP) { + state.result += common.repeat('\n', emptyLines); + } else if (chomping === CHOMPING_CLIP) { + if (detectedIndent) { // i.e. only if the scalar is not empty. + state.result += '\n'; } - - // Break this `while` cycle and go to the funciton's epilogue. - break; } - // Folded style: use fancy rules to handle line breaks. - if (folding) { + // Break this `while` cycle and go to the funciton's epilogue. + break; + } - // Lines starting with white space characters (more-indented lines) are not folded. - if (is_WHITE_SPACE(ch)) { - atMoreIndented = true; - state.result += common.repeat('\n', emptyLines + 1); + // Folded style: use fancy rules to handle line breaks. + if (folding) { - // End of more-indented block. - } else if (atMoreIndented) { - atMoreIndented = false; - state.result += common.repeat('\n', emptyLines + 1); + // Lines starting with white space characters (more-indented lines) are not folded. + if (is_WHITE_SPACE(ch)) { + atMoreIndented = true; + state.result += common.repeat('\n', emptyLines + 1); - // Just one line break - perceive as the same line. - } else if (0 === emptyLines) { - if (detectedIndent) { // i.e. only if we have already read some scalar content. - state.result += ' '; - } + // End of more-indented block. + } else if (atMoreIndented) { + atMoreIndented = false; + state.result += common.repeat('\n', emptyLines + 1); - // Several line breaks - perceive as different lines. - } else { - state.result += common.repeat('\n', emptyLines); + // Just one line break - perceive as the same line. + } else if (0 === emptyLines) { + if (detectedIndent) { // i.e. only if we have already read some scalar content. + state.result += ' '; } - // Literal style: just add exact number of line breaks between content lines. - } else if (detectedIndent) { - // If current line isn't the first one - count line break from the last content line. - state.result += common.repeat('\n', emptyLines + 1); + // Several line breaks - perceive as different lines. } else { - // In case of the first content line - count only empty lines. state.result += common.repeat('\n', emptyLines); } - detectedIndent = true; - emptyLines = 0; - captureStart = state.position; + // Literal style: just add exact number of line breaks between content lines. + } else if (detectedIndent) { + // If current line isn't the first one - count line break from the last content line. + state.result += common.repeat('\n', emptyLines + 1); + } else { + // In case of the first content line - count only empty lines. + state.result += common.repeat('\n', emptyLines); + } - while (!is_EOL(ch) && (0 !== ch)) { - ch = state.input.charCodeAt(++state.position); - } + detectedIndent = true; + emptyLines = 0; + captureStart = state.position; - captureSegment(state, captureStart, state.position, false); + while (!is_EOL(ch) && (0 !== ch)) { + ch = state.input.charCodeAt(++state.position); } - return true; + captureSegment(state, captureStart, state.position, false); } - function readBlockSequence(state, nodeIndent) { - var _line, - _tag = state.tag, - _anchor = state.anchor, - _result = [], - following, - detected = false, - ch; - - if (null !== state.anchor) { - state.anchorMap[state.anchor] = _result; - } - - ch = state.input.charCodeAt(state.position); + return true; +} - while (0 !== ch) { +function readBlockSequence(state, nodeIndent) { + var _line, + _tag = state.tag, + _anchor = state.anchor, + _result = [], + following, + detected = false, + ch; - if (0x2D/* - */ !== ch) { - break; - } + if (null !== state.anchor) { + state.anchorMap[state.anchor] = _result; + } - following = state.input.charCodeAt(state.position + 1); + ch = state.input.charCodeAt(state.position); - if (!is_WS_OR_EOL(following)) { - break; - } + while (0 !== ch) { - detected = true; - state.position++; + if (0x2D/* - */ !== ch) { + break; + } - if (skipSeparationSpace(state, true, -1)) { - if (state.lineIndent <= nodeIndent) { - _result.push(null); - ch = state.input.charCodeAt(state.position); - continue; - } - } + following = state.input.charCodeAt(state.position + 1); - _line = state.line; - composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true); - _result.push(state.result); - skipSeparationSpace(state, true, -1); + if (!is_WS_OR_EOL(following)) { + break; + } - ch = state.input.charCodeAt(state.position); + detected = true; + state.position++; - if ((state.line === _line || state.lineIndent > nodeIndent) && (0 !== ch)) { - throwError(state, 'bad indentation of a sequence entry'); - } else if (state.lineIndent < nodeIndent) { - break; + if (skipSeparationSpace(state, true, -1)) { + if (state.lineIndent <= nodeIndent) { + _result.push(null); + ch = state.input.charCodeAt(state.position); + continue; } } - if (detected) { - state.tag = _tag; - state.anchor = _anchor; - state.kind = 'sequence'; - state.result = _result; - return true; - } - return false; - } + _line = state.line; + composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true); + _result.push(state.result); + skipSeparationSpace(state, true, -1); - function readBlockMapping(state, nodeIndent, flowIndent) { - var following, - allowCompact, - _line, - _tag = state.tag, - _anchor = state.anchor, - _result = {}, - overridableKeys = {}, - keyTag = null, - keyNode = null, - valueNode = null, - atExplicitKey = false, - detected = false, - ch; + ch = state.input.charCodeAt(state.position); - if (null !== state.anchor) { - state.anchorMap[state.anchor] = _result; + if ((state.line === _line || state.lineIndent > nodeIndent) && (0 !== ch)) { + throwError(state, 'bad indentation of a sequence entry'); + } else if (state.lineIndent < nodeIndent) { + break; } + } - ch = state.input.charCodeAt(state.position); + if (detected) { + state.tag = _tag; + state.anchor = _anchor; + state.kind = 'sequence'; + state.result = _result; + return true; + } + return false; +} - while (0 !== ch) { - following = state.input.charCodeAt(state.position + 1); - _line = state.line; // Save the current line. +function readBlockMapping(state, nodeIndent, flowIndent) { + var following, + allowCompact, + _line, + _tag = state.tag, + _anchor = state.anchor, + _result = {}, + overridableKeys = {}, + keyTag = null, + keyNode = null, + valueNode = null, + atExplicitKey = false, + detected = false, + ch; - // - // Explicit notation case. There are two separate blocks: - // first for the key (denoted by "?") and second for the value (denoted by ":") - // - if ((0x3F/* ? */ === ch || 0x3A/* : */ === ch) && is_WS_OR_EOL(following)) { + if (null !== state.anchor) { + state.anchorMap[state.anchor] = _result; + } - if (0x3F/* ? */ === ch) { - if (atExplicitKey) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); - keyTag = keyNode = valueNode = null; - } + ch = state.input.charCodeAt(state.position); - detected = true; - atExplicitKey = true; - allowCompact = true; + while (0 !== ch) { + following = state.input.charCodeAt(state.position + 1); + _line = state.line; // Save the current line. - } else if (atExplicitKey) { - // i.e. 0x3A/* : */ === character after the explicit key. - atExplicitKey = false; - allowCompact = true; + // + // Explicit notation case. There are two separate blocks: + // first for the key (denoted by "?") and second for the value (denoted by ":") + // + if ((0x3F/* ? */ === ch || 0x3A/* : */ === ch) && is_WS_OR_EOL(following)) { - } else { - throwError(state, 'incomplete explicit mapping pair; a key node is missed'); + if (0x3F/* ? */ === ch) { + if (atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); + keyTag = keyNode = valueNode = null; } - state.position += 1; - ch = following; + detected = true; + atExplicitKey = true; + allowCompact = true; - // - // Implicit notation case. Flow-style node as the key first, then ":", and the value. - // - } else if (composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) { + } else if (atExplicitKey) { + // i.e. 0x3A/* : */ === character after the explicit key. + atExplicitKey = false; + allowCompact = true; - if (state.line === _line) { - ch = state.input.charCodeAt(state.position); + } else { + throwError(state, 'incomplete explicit mapping pair; a key node is missed'); + } - while (is_WHITE_SPACE(ch)) { - ch = state.input.charCodeAt(++state.position); - } + state.position += 1; + ch = following; - if (0x3A/* : */ === ch) { - ch = state.input.charCodeAt(++state.position); + // + // Implicit notation case. Flow-style node as the key first, then ":", and the value. + // + } else if (composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) { - if (!is_WS_OR_EOL(ch)) { - throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping'); - } + if (state.line === _line) { + ch = state.input.charCodeAt(state.position); - if (atExplicitKey) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); - keyTag = keyNode = valueNode = null; - } + while (is_WHITE_SPACE(ch)) { + ch = state.input.charCodeAt(++state.position); + } - detected = true; - atExplicitKey = false; - allowCompact = false; - keyTag = state.tag; - keyNode = state.result; + if (0x3A/* : */ === ch) { + ch = state.input.charCodeAt(++state.position); - } else if (detected) { - throwError(state, 'can not read an implicit mapping pair; a colon is missed'); + if (!is_WS_OR_EOL(ch)) { + throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping'); + } - } else { - state.tag = _tag; - state.anchor = _anchor; - return true; // Keep the result of `composeNode`. + if (atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); + keyTag = keyNode = valueNode = null; } + detected = true; + atExplicitKey = false; + allowCompact = false; + keyTag = state.tag; + keyNode = state.result; + } else if (detected) { - throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key'); + throwError(state, 'can not read an implicit mapping pair; a colon is missed'); } else { state.tag = _tag; @@ -2050,240 +1997,269 @@ return true; // Keep the result of `composeNode`. } + } else if (detected) { + throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key'); + } else { - break; // Reading is done. Go to the epilogue. + state.tag = _tag; + state.anchor = _anchor; + return true; // Keep the result of `composeNode`. } - // - // Common reading code for both explicit and implicit notations. - // - if (state.line === _line || state.lineIndent > nodeIndent) { - if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) { - if (atExplicitKey) { - keyNode = state.result; - } else { - valueNode = state.result; - } - } + } else { + break; // Reading is done. Go to the epilogue. + } - if (!atExplicitKey) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode); - keyTag = keyNode = valueNode = null; + // + // Common reading code for both explicit and implicit notations. + // + if (state.line === _line || state.lineIndent > nodeIndent) { + if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) { + if (atExplicitKey) { + keyNode = state.result; + } else { + valueNode = state.result; } - - skipSeparationSpace(state, true, -1); - ch = state.input.charCodeAt(state.position); } - if (state.lineIndent > nodeIndent && (0 !== ch)) { - throwError(state, 'bad indentation of a mapping entry'); - } else if (state.lineIndent < nodeIndent) { - break; + if (!atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode); + keyTag = keyNode = valueNode = null; } - } - - // - // Epilogue. - // - // Special case: last mapping's node contains only the key in explicit notation. - if (atExplicitKey) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); + skipSeparationSpace(state, true, -1); + ch = state.input.charCodeAt(state.position); } - // Expose the resulting mapping. - if (detected) { - state.tag = _tag; - state.anchor = _anchor; - state.kind = 'mapping'; - state.result = _result; + if (state.lineIndent > nodeIndent && (0 !== ch)) { + throwError(state, 'bad indentation of a mapping entry'); + } else if (state.lineIndent < nodeIndent) { + break; } + } + + // + // Epilogue. + // - return detected; + // Special case: last mapping's node contains only the key in explicit notation. + if (atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); } - function readTagProperty(state) { - var _position, - isVerbatim = false, - isNamed = false, - tagHandle, - tagName, - ch; + // Expose the resulting mapping. + if (detected) { + state.tag = _tag; + state.anchor = _anchor; + state.kind = 'mapping'; + state.result = _result; + } - ch = state.input.charCodeAt(state.position); + return detected; +} - if (0x21/* ! */ !== ch) { - return false; - } +function readTagProperty(state) { + var _position, + isVerbatim = false, + isNamed = false, + tagHandle, + tagName, + ch; - if (null !== state.tag) { - throwError(state, 'duplication of a tag property'); - } + ch = state.input.charCodeAt(state.position); - ch = state.input.charCodeAt(++state.position); + if (0x21/* ! */ !== ch) { + return false; + } - if (0x3C/* < */ === ch) { - isVerbatim = true; - ch = state.input.charCodeAt(++state.position); + if (null !== state.tag) { + throwError(state, 'duplication of a tag property'); + } - } else if (0x21/* ! */ === ch) { - isNamed = true; - tagHandle = '!!'; - ch = state.input.charCodeAt(++state.position); + ch = state.input.charCodeAt(++state.position); - } else { - tagHandle = '!'; - } + if (0x3C/* < */ === ch) { + isVerbatim = true; + ch = state.input.charCodeAt(++state.position); - _position = state.position; + } else if (0x21/* ! */ === ch) { + isNamed = true; + tagHandle = '!!'; + ch = state.input.charCodeAt(++state.position); - if (isVerbatim) { - do { ch = state.input.charCodeAt(++state.position); } - while (0 !== ch && 0x3E/* > */ !== ch); + } else { + tagHandle = '!'; + } - if (state.position < state.length) { - tagName = state.input.slice(_position, state.position); - ch = state.input.charCodeAt(++state.position); - } else { - throwError(state, 'unexpected end of the stream within a verbatim tag'); - } - } else { - while (0 !== ch && !is_WS_OR_EOL(ch)) { + _position = state.position; + + if (isVerbatim) { + do { ch = state.input.charCodeAt(++state.position); } + while (0 !== ch && 0x3E/* > */ !== ch); - if (0x21/* ! */ === ch) { - if (!isNamed) { - tagHandle = state.input.slice(_position - 1, state.position + 1); + if (state.position < state.length) { + tagName = state.input.slice(_position, state.position); + ch = state.input.charCodeAt(++state.position); + } else { + throwError(state, 'unexpected end of the stream within a verbatim tag'); + } + } else { + while (0 !== ch && !is_WS_OR_EOL(ch)) { - if (!PATTERN_TAG_HANDLE.test(tagHandle)) { - throwError(state, 'named tag handle cannot contain such characters'); - } + if (0x21/* ! */ === ch) { + if (!isNamed) { + tagHandle = state.input.slice(_position - 1, state.position + 1); - isNamed = true; - _position = state.position + 1; - } else { - throwError(state, 'tag suffix cannot contain exclamation marks'); + if (!PATTERN_TAG_HANDLE.test(tagHandle)) { + throwError(state, 'named tag handle cannot contain such characters'); } - } - ch = state.input.charCodeAt(++state.position); + isNamed = true; + _position = state.position + 1; + } else { + throwError(state, 'tag suffix cannot contain exclamation marks'); + } } - tagName = state.input.slice(_position, state.position); - - if (PATTERN_FLOW_INDICATORS.test(tagName)) { - throwError(state, 'tag suffix cannot contain flow indicator characters'); - } + ch = state.input.charCodeAt(++state.position); } - if (tagName && !PATTERN_TAG_URI.test(tagName)) { - throwError(state, 'tag name cannot contain such characters: ' + tagName); + tagName = state.input.slice(_position, state.position); + + if (PATTERN_FLOW_INDICATORS.test(tagName)) { + throwError(state, 'tag suffix cannot contain flow indicator characters'); } + } - if (isVerbatim) { - state.tag = tagName; + if (tagName && !PATTERN_TAG_URI.test(tagName)) { + throwError(state, 'tag name cannot contain such characters: ' + tagName); + } - } else if (_hasOwnProperty.call(state.tagMap, tagHandle)) { - state.tag = state.tagMap[tagHandle] + tagName; + if (isVerbatim) { + state.tag = tagName; - } else if ('!' === tagHandle) { - state.tag = '!' + tagName; + } else if (_hasOwnProperty.call(state.tagMap, tagHandle)) { + state.tag = state.tagMap[tagHandle] + tagName; - } else if ('!!' === tagHandle) { - state.tag = 'tag:yaml.org,2002:' + tagName; + } else if ('!' === tagHandle) { + state.tag = '!' + tagName; - } else { - throwError(state, 'undeclared tag handle "' + tagHandle + '"'); - } + } else if ('!!' === tagHandle) { + state.tag = 'tag:yaml.org,2002:' + tagName; - return true; + } else { + throwError(state, 'undeclared tag handle "' + tagHandle + '"'); } - function readAnchorProperty(state) { - var _position, - ch; + return true; +} - ch = state.input.charCodeAt(state.position); +function readAnchorProperty(state) { + var _position, + ch; - if (0x26/* & */ !== ch) { - return false; - } + ch = state.input.charCodeAt(state.position); - if (null !== state.anchor) { - throwError(state, 'duplication of an anchor property'); - } + if (0x26/* & */ !== ch) { + return false; + } - ch = state.input.charCodeAt(++state.position); - _position = state.position; + if (null !== state.anchor) { + throwError(state, 'duplication of an anchor property'); + } - while (0 !== ch && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { - ch = state.input.charCodeAt(++state.position); - } + ch = state.input.charCodeAt(++state.position); + _position = state.position; - if (state.position === _position) { - throwError(state, 'name of an anchor node must contain at least one character'); - } + while (0 !== ch && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { + ch = state.input.charCodeAt(++state.position); + } - state.anchor = state.input.slice(_position, state.position); - return true; + if (state.position === _position) { + throwError(state, 'name of an anchor node must contain at least one character'); } - function readAlias(state) { - var _position, alias, - ch; + state.anchor = state.input.slice(_position, state.position); + return true; +} - ch = state.input.charCodeAt(state.position); +function readAlias(state) { + var _position, alias, + ch; - if (0x2A/* * */ !== ch) { - return false; - } + ch = state.input.charCodeAt(state.position); + + if (0x2A/* * */ !== ch) { + return false; + } + ch = state.input.charCodeAt(++state.position); + _position = state.position; + + while (0 !== ch && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { ch = state.input.charCodeAt(++state.position); - _position = state.position; + } - while (0 !== ch && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { - ch = state.input.charCodeAt(++state.position); - } + if (state.position === _position) { + throwError(state, 'name of an alias node must contain at least one character'); + } - if (state.position === _position) { - throwError(state, 'name of an alias node must contain at least one character'); - } + alias = state.input.slice(_position, state.position); - alias = state.input.slice(_position, state.position); + if (!state.anchorMap.hasOwnProperty(alias)) { + throwError(state, 'unidentified alias "' + alias + '"'); + } - if (!state.anchorMap.hasOwnProperty(alias)) { - throwError(state, 'unidentified alias "' + alias + '"'); - } + state.result = state.anchorMap[alias]; + skipSeparationSpace(state, true, -1); + return true; +} - state.result = state.anchorMap[alias]; - skipSeparationSpace(state, true, -1); - return true; +function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) { + var allowBlockStyles, + allowBlockScalars, + allowBlockCollections, + indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this parentIndent) { + indentStatus = 1; + } else if (state.lineIndent === parentIndent) { + indentStatus = 0; + } else if (state.lineIndent < parentIndent) { + indentStatus = -1; + } + } } - function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) { - var allowBlockStyles, - allowBlockScalars, - allowBlockCollections, - indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this parentIndent) { indentStatus = 1; @@ -2292,492 +2268,477 @@ } else if (state.lineIndent < parentIndent) { indentStatus = -1; } + } else { + allowBlockCollections = false; } } + } - if (1 === indentStatus) { - while (readTagProperty(state) || readAnchorProperty(state)) { - if (skipSeparationSpace(state, true, -1)) { - atNewLine = true; - allowBlockCollections = allowBlockStyles; - - if (state.lineIndent > parentIndent) { - indentStatus = 1; - } else if (state.lineIndent === parentIndent) { - indentStatus = 0; - } else if (state.lineIndent < parentIndent) { - indentStatus = -1; - } - } else { - allowBlockCollections = false; - } - } - } + if (allowBlockCollections) { + allowBlockCollections = atNewLine || allowCompact; + } - if (allowBlockCollections) { - allowBlockCollections = atNewLine || allowCompact; + if (1 === indentStatus || CONTEXT_BLOCK_OUT === nodeContext) { + if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) { + flowIndent = parentIndent; + } else { + flowIndent = parentIndent + 1; } - if (1 === indentStatus || CONTEXT_BLOCK_OUT === nodeContext) { - if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) { - flowIndent = parentIndent; - } else { - flowIndent = parentIndent + 1; - } - - blockIndent = state.position - state.lineStart; + blockIndent = state.position - state.lineStart; - if (1 === indentStatus) { - if (allowBlockCollections && - (readBlockSequence(state, blockIndent) || - readBlockMapping(state, blockIndent, flowIndent)) || - readFlowCollection(state, flowIndent)) { + if (1 === indentStatus) { + if (allowBlockCollections && + (readBlockSequence(state, blockIndent) || + readBlockMapping(state, blockIndent, flowIndent)) || + readFlowCollection(state, flowIndent)) { + hasContent = true; + } else { + if ((allowBlockScalars && readBlockScalar(state, flowIndent)) || + readSingleQuotedScalar(state, flowIndent) || + readDoubleQuotedScalar(state, flowIndent)) { hasContent = true; - } else { - if ((allowBlockScalars && readBlockScalar(state, flowIndent)) || - readSingleQuotedScalar(state, flowIndent) || - readDoubleQuotedScalar(state, flowIndent)) { - hasContent = true; - } else if (readAlias(state)) { - hasContent = true; + } else if (readAlias(state)) { + hasContent = true; - if (null !== state.tag || null !== state.anchor) { - throwError(state, 'alias node should not have any properties'); - } + if (null !== state.tag || null !== state.anchor) { + throwError(state, 'alias node should not have any properties'); + } - } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) { - hasContent = true; + } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) { + hasContent = true; - if (null === state.tag) { - state.tag = '?'; - } + if (null === state.tag) { + state.tag = '?'; } + } - if (null !== state.anchor) { - state.anchorMap[state.anchor] = state.result; - } + if (null !== state.anchor) { + state.anchorMap[state.anchor] = state.result; } - } else if (0 === indentStatus) { - // Special case: block sequences are allowed to have same indentation level as the parent. - // http://www.yaml.org/spec/1.2/spec.html#id2799784 - hasContent = allowBlockCollections && readBlockSequence(state, blockIndent); } + } else if (0 === indentStatus) { + // Special case: block sequences are allowed to have same indentation level as the parent. + // http://www.yaml.org/spec/1.2/spec.html#id2799784 + hasContent = allowBlockCollections && readBlockSequence(state, blockIndent); } + } - if (null !== state.tag && '!' !== state.tag) { - if ('?' === state.tag) { - for (typeIndex = 0, typeQuantity = state.implicitTypes.length; - typeIndex < typeQuantity; - typeIndex += 1) { - type = state.implicitTypes[typeIndex]; - - // Implicit resolving is not allowed for non-scalar types, and '?' - // non-specific tag is only assigned to plain scalars. So, it isn't - // needed to check for 'kind' conformity. - - if (type.resolve(state.result)) { // `state.result` updated in resolver if matched - state.result = type.construct(state.result); - state.tag = type.tag; - if (null !== state.anchor) { - state.anchorMap[state.anchor] = state.result; - } - break; - } - } - } else if (_hasOwnProperty.call(state.typeMap, state.tag)) { - type = state.typeMap[state.tag]; + if (null !== state.tag && '!' !== state.tag) { + if ('?' === state.tag) { + for (typeIndex = 0, typeQuantity = state.implicitTypes.length; + typeIndex < typeQuantity; + typeIndex += 1) { + type = state.implicitTypes[typeIndex]; - if (null !== state.result && type.kind !== state.kind) { - throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be "' + type.kind + '", not "' + state.kind + '"'); - } + // Implicit resolving is not allowed for non-scalar types, and '?' + // non-specific tag is only assigned to plain scalars. So, it isn't + // needed to check for 'kind' conformity. - if (!type.resolve(state.result)) { // `state.result` updated in resolver if matched - throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag'); - } else { + if (type.resolve(state.result)) { // `state.result` updated in resolver if matched state.result = type.construct(state.result); + state.tag = type.tag; if (null !== state.anchor) { state.anchorMap[state.anchor] = state.result; } + break; } + } + } else if (_hasOwnProperty.call(state.typeMap, state.tag)) { + type = state.typeMap[state.tag]; + + if (null !== state.result && type.kind !== state.kind) { + throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be "' + type.kind + '", not "' + state.kind + '"'); + } + + if (!type.resolve(state.result)) { // `state.result` updated in resolver if matched + throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag'); } else { - throwError(state, 'unknown tag !<' + state.tag + '>'); + state.result = type.construct(state.result); + if (null !== state.anchor) { + state.anchorMap[state.anchor] = state.result; + } } + } else { + throwError(state, 'unknown tag !<' + state.tag + '>'); } + } - return null !== state.tag || null !== state.anchor || hasContent; + if (state.listener !== null) { + state.listener('close', state); } + return null !== state.tag || null !== state.anchor || hasContent; +} - function readDocument(state) { - var documentStart = state.position, - _position, - directiveName, - directiveArgs, - hasDirectives = false, - ch; +function readDocument(state) { + var documentStart = state.position, + _position, + directiveName, + directiveArgs, + hasDirectives = false, + ch; - state.version = null; - state.checkLineBreaks = state.legacy; - state.tagMap = {}; - state.anchorMap = {}; + state.version = null; + state.checkLineBreaks = state.legacy; + state.tagMap = {}; + state.anchorMap = {}; - while (0 !== (ch = state.input.charCodeAt(state.position))) { - skipSeparationSpace(state, true, -1); + while (0 !== (ch = state.input.charCodeAt(state.position))) { + skipSeparationSpace(state, true, -1); - ch = state.input.charCodeAt(state.position); + ch = state.input.charCodeAt(state.position); - if (state.lineIndent > 0 || 0x25/* % */ !== ch) { - break; - } + if (state.lineIndent > 0 || 0x25/* % */ !== ch) { + break; + } - hasDirectives = true; + hasDirectives = true; + ch = state.input.charCodeAt(++state.position); + _position = state.position; + + while (0 !== ch && !is_WS_OR_EOL(ch)) { ch = state.input.charCodeAt(++state.position); - _position = state.position; + } - while (0 !== ch && !is_WS_OR_EOL(ch)) { - ch = state.input.charCodeAt(++state.position); - } + directiveName = state.input.slice(_position, state.position); + directiveArgs = []; - directiveName = state.input.slice(_position, state.position); - directiveArgs = []; + if (directiveName.length < 1) { + throwError(state, 'directive name must not be less than one character in length'); + } - if (directiveName.length < 1) { - throwError(state, 'directive name must not be less than one character in length'); + while (0 !== ch) { + while (is_WHITE_SPACE(ch)) { + ch = state.input.charCodeAt(++state.position); } - while (0 !== ch) { - while (is_WHITE_SPACE(ch)) { - ch = state.input.charCodeAt(++state.position); - } - - if (0x23/* # */ === ch) { - do { ch = state.input.charCodeAt(++state.position); } - while (0 !== ch && !is_EOL(ch)); - break; - } - - if (is_EOL(ch)) { - break; - } - - _position = state.position; - - while (0 !== ch && !is_WS_OR_EOL(ch)) { - ch = state.input.charCodeAt(++state.position); - } - - directiveArgs.push(state.input.slice(_position, state.position)); + if (0x23/* # */ === ch) { + do { ch = state.input.charCodeAt(++state.position); } + while (0 !== ch && !is_EOL(ch)); + break; } - if (0 !== ch) { - readLineBreak(state); + if (is_EOL(ch)) { + break; } - if (_hasOwnProperty.call(directiveHandlers, directiveName)) { - directiveHandlers[directiveName](state, directiveName, directiveArgs); - } else { - throwWarning(state, 'unknown document directive "' + directiveName + '"'); + _position = state.position; + + while (0 !== ch && !is_WS_OR_EOL(ch)) { + ch = state.input.charCodeAt(++state.position); } - } - skipSeparationSpace(state, true, -1); + directiveArgs.push(state.input.slice(_position, state.position)); + } - if (0 === state.lineIndent && - 0x2D/* - */ === state.input.charCodeAt(state.position) && - 0x2D/* - */ === state.input.charCodeAt(state.position + 1) && - 0x2D/* - */ === state.input.charCodeAt(state.position + 2)) { - state.position += 3; - skipSeparationSpace(state, true, -1); + if (0 !== ch) { + readLineBreak(state); + } - } else if (hasDirectives) { - throwError(state, 'directives end mark is expected'); + if (_hasOwnProperty.call(directiveHandlers, directiveName)) { + directiveHandlers[directiveName](state, directiveName, directiveArgs); + } else { + throwWarning(state, 'unknown document directive "' + directiveName + '"'); } + } + + skipSeparationSpace(state, true, -1); - composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true); + if (0 === state.lineIndent && + 0x2D/* - */ === state.input.charCodeAt(state.position) && + 0x2D/* - */ === state.input.charCodeAt(state.position + 1) && + 0x2D/* - */ === state.input.charCodeAt(state.position + 2)) { + state.position += 3; skipSeparationSpace(state, true, -1); - if (state.checkLineBreaks && - PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) { - throwWarning(state, 'non-ASCII line breaks are interpreted as content'); - } + } else if (hasDirectives) { + throwError(state, 'directives end mark is expected'); + } - state.documents.push(state.result); + composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true); + skipSeparationSpace(state, true, -1); - if (state.position === state.lineStart && testDocumentSeparator(state)) { + if (state.checkLineBreaks && + PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) { + throwWarning(state, 'non-ASCII line breaks are interpreted as content'); + } - if (0x2E/* . */ === state.input.charCodeAt(state.position)) { - state.position += 3; - skipSeparationSpace(state, true, -1); - } - return; - } + state.documents.push(state.result); - if (state.position < (state.length - 1)) { - throwError(state, 'end of the stream or a document separator is expected'); - } else { - return; + if (state.position === state.lineStart && testDocumentSeparator(state)) { + + if (0x2E/* . */ === state.input.charCodeAt(state.position)) { + state.position += 3; + skipSeparationSpace(state, true, -1); } + return; } + if (state.position < (state.length - 1)) { + throwError(state, 'end of the stream or a document separator is expected'); + } else { + return; + } +} - function loadDocuments(input, options) { - input = String(input); - options = options || {}; - if (input.length !== 0) { +function loadDocuments(input, options) { + input = String(input); + options = options || {}; - // Add tailing `\n` if not exists - if (0x0A/* LF */ !== input.charCodeAt(input.length - 1) && - 0x0D/* CR */ !== input.charCodeAt(input.length - 1)) { - input += '\n'; - } + if (input.length !== 0) { - // Strip BOM - if (input.charCodeAt(0) === 0xFEFF) { - input = input.slice(1); - } + // Add tailing `\n` if not exists + if (0x0A/* LF */ !== input.charCodeAt(input.length - 1) && + 0x0D/* CR */ !== input.charCodeAt(input.length - 1)) { + input += '\n'; } - var state = new State(input, options); + // Strip BOM + if (input.charCodeAt(0) === 0xFEFF) { + input = input.slice(1); + } + } - // Use 0 as string terminator. That significantly simplifies bounds check. - state.input += '\0'; + var state = new State(input, options); - while (0x20/* Space */ === state.input.charCodeAt(state.position)) { - state.lineIndent += 1; - state.position += 1; - } + // Use 0 as string terminator. That significantly simplifies bounds check. + state.input += '\0'; - while (state.position < (state.length - 1)) { - readDocument(state); - } + while (0x20/* Space */ === state.input.charCodeAt(state.position)) { + state.lineIndent += 1; + state.position += 1; + } - return state.documents; + while (state.position < (state.length - 1)) { + readDocument(state); } + return state.documents; +} - function loadAll(input, iterator, options) { - var documents = loadDocuments(input, options), index, length; - for (index = 0, length = documents.length; index < length; index += 1) { - iterator(documents[index]); - } +function loadAll(input, iterator, options) { + var documents = loadDocuments(input, options), index, length; + + for (index = 0, length = documents.length; index < length; index += 1) { + iterator(documents[index]); } +} - function load(input, options) { - var documents = loadDocuments(input, options); +function load(input, options) { + var documents = loadDocuments(input, options); - if (0 === documents.length) { - /*eslint-disable no-undefined*/ - return undefined; - } else if (1 === documents.length) { - return documents[0]; - } - throw new YAMLException('expected a single document in the stream, but found more'); + if (0 === documents.length) { + /*eslint-disable no-undefined*/ + return undefined; + } else if (1 === documents.length) { + return documents[0]; } + throw new YAMLException('expected a single document in the stream, but found more'); +} - function safeLoadAll(input, output, options) { - loadAll(input, output, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options)); - } +function safeLoadAll(input, output, options) { + loadAll(input, output, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options)); +} - function safeLoad(input, options) { - return load(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options)); - } +function safeLoad(input, options) { + return load(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options)); +} - module.exports.loadAll = loadAll; - module.exports.load = load; - module.exports.safeLoadAll = safeLoadAll; - module.exports.safeLoad = safeLoad; +module.exports.loadAll = loadAll; +module.exports.load = load; +module.exports.safeLoadAll = safeLoadAll; +module.exports.safeLoad = safeLoad; },{"./common":2,"./exception":4,"./mark":6,"./schema/default_full":9,"./schema/default_safe":10}],6:[function(require,module,exports){ - 'use strict'; +'use strict'; - var common = require('./common'); +var common = require('./common'); - function Mark(name, buffer, position, line, column) { - this.name = name; - this.buffer = buffer; - this.position = position; - this.line = line; - this.column = column; - } +function Mark(name, buffer, position, line, column) { + this.name = name; + this.buffer = buffer; + this.position = position; + this.line = line; + this.column = column; +} - Mark.prototype.getSnippet = function getSnippet(indent, maxLength) { - var head, start, tail, end, snippet; +Mark.prototype.getSnippet = function getSnippet(indent, maxLength) { + var head, start, tail, end, snippet; - if (!this.buffer) { - return null; - } + if (!this.buffer) return null; - indent = indent || 4; - maxLength = maxLength || 75; + indent = indent || 4; + maxLength = maxLength || 75; - head = ''; - start = this.position; + head = ''; + start = this.position; - while (start > 0 && -1 === '\x00\r\n\x85\u2028\u2029'.indexOf(this.buffer.charAt(start - 1))) { - start -= 1; - if (this.position - start > (maxLength / 2 - 1)) { - head = ' ... '; - start += 5; - break; - } + while (start > 0 && -1 === '\x00\r\n\x85\u2028\u2029'.indexOf(this.buffer.charAt(start - 1))) { + start -= 1; + if (this.position - start > (maxLength / 2 - 1)) { + head = ' ... '; + start += 5; + break; } + } - tail = ''; - end = this.position; + tail = ''; + end = this.position; - while (end < this.buffer.length && -1 === '\x00\r\n\x85\u2028\u2029'.indexOf(this.buffer.charAt(end))) { - end += 1; - if (end - this.position > (maxLength / 2 - 1)) { - tail = ' ... '; - end -= 5; - break; - } + while (end < this.buffer.length && -1 === '\x00\r\n\x85\u2028\u2029'.indexOf(this.buffer.charAt(end))) { + end += 1; + if (end - this.position > (maxLength / 2 - 1)) { + tail = ' ... '; + end -= 5; + break; } + } - snippet = this.buffer.slice(start, end); + snippet = this.buffer.slice(start, end); - return common.repeat(' ', indent) + head + snippet + tail + '\n' + - common.repeat(' ', indent + this.position - start + head.length) + '^'; - }; + return common.repeat(' ', indent) + head + snippet + tail + '\n' + + common.repeat(' ', indent + this.position - start + head.length) + '^'; +}; - Mark.prototype.toString = function toString(compact) { - var snippet, where = ''; +Mark.prototype.toString = function toString(compact) { + var snippet, where = ''; - if (this.name) { - where += 'in "' + this.name + '" '; - } + if (this.name) { + where += 'in "' + this.name + '" '; + } - where += 'at line ' + (this.line + 1) + ', column ' + (this.column + 1); + where += 'at line ' + (this.line + 1) + ', column ' + (this.column + 1); - if (!compact) { - snippet = this.getSnippet(); + if (!compact) { + snippet = this.getSnippet(); - if (snippet) { - where += ':\n' + snippet; - } + if (snippet) { + where += ':\n' + snippet; } + } - return where; - }; + return where; +}; - module.exports = Mark; +module.exports = Mark; },{"./common":2}],7:[function(require,module,exports){ - 'use strict'; - - /*eslint-disable max-len*/ +'use strict'; - var common = require('./common'); - var YAMLException = require('./exception'); - var Type = require('./type'); +/*eslint-disable max-len*/ +var common = require('./common'); +var YAMLException = require('./exception'); +var Type = require('./type'); - function compileList(schema, name, result) { - var exclude = []; - schema.include.forEach(function (includedSchema) { - result = compileList(includedSchema, name, result); - }); +function compileList(schema, name, result) { + var exclude = []; - schema[name].forEach(function (currentType) { - result.forEach(function (previousType, previousIndex) { - if (previousType.tag === currentType.tag) { - exclude.push(previousIndex); - } - }); + schema.include.forEach(function (includedSchema) { + result = compileList(includedSchema, name, result); + }); - result.push(currentType); + schema[name].forEach(function (currentType) { + result.forEach(function (previousType, previousIndex) { + if (previousType.tag === currentType.tag) { + exclude.push(previousIndex); + } }); - return result.filter(function (type, index) { - return -1 === exclude.indexOf(index); - }); - } + result.push(currentType); + }); + return result.filter(function (type, index) { + return -1 === exclude.indexOf(index); + }); +} - function compileMap(/* lists... */) { - var result = {}, index, length; - function collectType(type) { - result[type.tag] = type; - } +function compileMap(/* lists... */) { + var result = {}, index, length; - for (index = 0, length = arguments.length; index < length; index += 1) { - arguments[index].forEach(collectType); - } + function collectType(type) { + result[type.tag] = type; + } - return result; + for (index = 0, length = arguments.length; index < length; index += 1) { + arguments[index].forEach(collectType); } + return result; +} - function Schema(definition) { - this.include = definition.include || []; - this.implicit = definition.implicit || []; - this.explicit = definition.explicit || []; - this.implicit.forEach(function (type) { - if (type.loadKind && 'scalar' !== type.loadKind) { - throw new YAMLException('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.'); - } - }); +function Schema(definition) { + this.include = definition.include || []; + this.implicit = definition.implicit || []; + this.explicit = definition.explicit || []; - this.compiledImplicit = compileList(this, 'implicit', []); - this.compiledExplicit = compileList(this, 'explicit', []); - this.compiledTypeMap = compileMap(this.compiledImplicit, this.compiledExplicit); - } + this.implicit.forEach(function (type) { + if (type.loadKind && 'scalar' !== type.loadKind) { + throw new YAMLException('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.'); + } + }); + this.compiledImplicit = compileList(this, 'implicit', []); + this.compiledExplicit = compileList(this, 'explicit', []); + this.compiledTypeMap = compileMap(this.compiledImplicit, this.compiledExplicit); +} - Schema.DEFAULT = null; +Schema.DEFAULT = null; - Schema.create = function createSchema() { - var schemas, types; - switch (arguments.length) { - case 1: - schemas = Schema.DEFAULT; - types = arguments[0]; - break; +Schema.create = function createSchema() { + var schemas, types; - case 2: - schemas = arguments[0]; - types = arguments[1]; - break; + switch (arguments.length) { + case 1: + schemas = Schema.DEFAULT; + types = arguments[0]; + break; - default: - throw new YAMLException('Wrong number of arguments for Schema.create function'); - } + case 2: + schemas = arguments[0]; + types = arguments[1]; + break; - schemas = common.toArray(schemas); - types = common.toArray(types); + default: + throw new YAMLException('Wrong number of arguments for Schema.create function'); + } - if (!schemas.every(function (schema) { return schema instanceof Schema; })) { - throw new YAMLException('Specified list of super schemas (or a single Schema object) contains a non-Schema object.'); - } + schemas = common.toArray(schemas); + types = common.toArray(types); - if (!types.every(function (type) { return type instanceof Type; })) { - throw new YAMLException('Specified list of YAML types (or a single Type object) contains a non-Type object.'); - } + if (!schemas.every(function (schema) { return schema instanceof Schema; })) { + throw new YAMLException('Specified list of super schemas (or a single Schema object) contains a non-Schema object.'); + } - return new Schema({ - include: schemas, - explicit: types - }); - }; + if (!types.every(function (type) { return type instanceof Type; })) { + throw new YAMLException('Specified list of YAML types (or a single Type object) contains a non-Type object.'); + } + + return new Schema({ + include: schemas, + explicit: types + }); +}; - module.exports = Schema; +module.exports = Schema; },{"./common":2,"./exception":4,"./type":13}],8:[function(require,module,exports){ // Standard YAML's Core schema. @@ -2787,17 +2748,17 @@ // So, Core schema has no distinctions from JSON schema is JS-YAML. - 'use strict'; +'use strict'; - var Schema = require('../schema'); +var Schema = require('../schema'); - module.exports = new Schema({ - include: [ - require('./json') - ] - }); +module.exports = new Schema({ + include: [ + require('./json') + ] +}); },{"../schema":7,"./json":12}],9:[function(require,module,exports){ // JS-YAML's default schema for `load` function. @@ -2809,22 +2770,22 @@ // Also this schema is used as default base schema at `Schema.create` function. - 'use strict'; +'use strict'; - var Schema = require('../schema'); +var Schema = require('../schema'); - module.exports = Schema.DEFAULT = new Schema({ - include: [ - require('./default_safe') - ], - explicit: [ - require('../type/js/undefined'), - require('../type/js/regexp'), - require('../type/js/function') - ] - }); +module.exports = Schema.DEFAULT = new Schema({ + include: [ + require('./default_safe') + ], + explicit: [ + require('../type/js/undefined'), + require('../type/js/regexp'), + require('../type/js/function') + ] +}); },{"../schema":7,"../type/js/function":18,"../type/js/regexp":19,"../type/js/undefined":20,"./default_safe":10}],10:[function(require,module,exports){ // JS-YAML's default schema for `safeLoad` function. @@ -2834,46 +2795,46 @@ // extra types described at YAML tag repository. (http://yaml.org/type/) - 'use strict'; +'use strict'; - var Schema = require('../schema'); +var Schema = require('../schema'); - module.exports = new Schema({ - include: [ - require('./core') - ], - implicit: [ - require('../type/timestamp'), - require('../type/merge') - ], - explicit: [ - require('../type/binary'), - require('../type/omap'), - require('../type/pairs'), - require('../type/set') - ] - }); +module.exports = new Schema({ + include: [ + require('./core') + ], + implicit: [ + require('../type/timestamp'), + require('../type/merge') + ], + explicit: [ + require('../type/binary'), + require('../type/omap'), + require('../type/pairs'), + require('../type/set') + ] +}); },{"../schema":7,"../type/binary":14,"../type/merge":22,"../type/omap":24,"../type/pairs":25,"../type/set":27,"../type/timestamp":29,"./core":8}],11:[function(require,module,exports){ // Standard YAML's Failsafe schema. // http://www.yaml.org/spec/1.2/spec.html#id2802346 - 'use strict'; +'use strict'; - var Schema = require('../schema'); +var Schema = require('../schema'); - module.exports = new Schema({ - explicit: [ - require('../type/str'), - require('../type/seq'), - require('../type/map') - ] - }); +module.exports = new Schema({ + explicit: [ + require('../type/str'), + require('../type/seq'), + require('../type/map') + ] +}); },{"../schema":7,"../type/map":21,"../type/seq":26,"../type/str":28}],12:[function(require,module,exports){ // Standard YAML's JSON schema. @@ -2884,570 +2845,537 @@ // It allows numbers in binary notaion, use `Null` and `NULL` as `null`, etc. - 'use strict'; +'use strict'; - var Schema = require('../schema'); +var Schema = require('../schema'); - module.exports = new Schema({ - include: [ - require('./failsafe') - ], - implicit: [ - require('../type/null'), - require('../type/bool'), - require('../type/int'), - require('../type/float') - ] - }); +module.exports = new Schema({ + include: [ + require('./failsafe') + ], + implicit: [ + require('../type/null'), + require('../type/bool'), + require('../type/int'), + require('../type/float') + ] +}); },{"../schema":7,"../type/bool":15,"../type/float":16,"../type/int":17,"../type/null":23,"./failsafe":11}],13:[function(require,module,exports){ - 'use strict'; - - var YAMLException = require('./exception'); - - var TYPE_CONSTRUCTOR_OPTIONS = [ - 'kind', - 'resolve', - 'construct', - 'instanceOf', - 'predicate', - 'represent', - 'defaultStyle', - 'styleAliases' - ]; - - var YAML_NODE_KINDS = [ - 'scalar', - 'sequence', - 'mapping' - ]; - - function compileStyleAliases(map) { - var result = {}; - - if (null !== map) { - Object.keys(map).forEach(function (style) { - map[style].forEach(function (alias) { - result[String(alias)] = style; - }); +'use strict'; + +var YAMLException = require('./exception'); + +var TYPE_CONSTRUCTOR_OPTIONS = [ + 'kind', + 'resolve', + 'construct', + 'instanceOf', + 'predicate', + 'represent', + 'defaultStyle', + 'styleAliases' +]; + +var YAML_NODE_KINDS = [ + 'scalar', + 'sequence', + 'mapping' +]; + +function compileStyleAliases(map) { + var result = {}; + + if (null !== map) { + Object.keys(map).forEach(function (style) { + map[style].forEach(function (alias) { + result[String(alias)] = style; }); - } - - return result; + }); } - function Type(tag, options) { - options = options || {}; - - Object.keys(options).forEach(function (name) { - if (-1 === TYPE_CONSTRUCTOR_OPTIONS.indexOf(name)) { - throw new YAMLException('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.'); - } - }); + return result; +} - // TODO: Add tag format check. - this.tag = tag; - this.kind = options['kind'] || null; - this.resolve = options['resolve'] || function () { return true; }; - this.construct = options['construct'] || function (data) { return data; }; - this.instanceOf = options['instanceOf'] || null; - this.predicate = options['predicate'] || null; - this.represent = options['represent'] || null; - this.defaultStyle = options['defaultStyle'] || null; - this.styleAliases = compileStyleAliases(options['styleAliases'] || null); +function Type(tag, options) { + options = options || {}; - if (-1 === YAML_NODE_KINDS.indexOf(this.kind)) { - throw new YAMLException('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.'); + Object.keys(options).forEach(function (name) { + if (-1 === TYPE_CONSTRUCTOR_OPTIONS.indexOf(name)) { + throw new YAMLException('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.'); } + }); + + // TODO: Add tag format check. + this.tag = tag; + this.kind = options['kind'] || null; + this.resolve = options['resolve'] || function () { return true; }; + this.construct = options['construct'] || function (data) { return data; }; + this.instanceOf = options['instanceOf'] || null; + this.predicate = options['predicate'] || null; + this.represent = options['represent'] || null; + this.defaultStyle = options['defaultStyle'] || null; + this.styleAliases = compileStyleAliases(options['styleAliases'] || null); + + if (-1 === YAML_NODE_KINDS.indexOf(this.kind)) { + throw new YAMLException('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.'); } +} - module.exports = Type; +module.exports = Type; },{"./exception":4}],14:[function(require,module,exports){ - 'use strict'; +'use strict'; - /*eslint-disable no-bitwise*/ +/*eslint-disable no-bitwise*/ // A trick for browserified version. // Since we make browserifier to ignore `buffer` module, NodeBuffer will be undefined - var NodeBuffer = require('buffer').Buffer; - var Type = require('../type'); +var NodeBuffer = require('buffer').Buffer; +var Type = require('../type'); // [ 64, 65, 66 ] -> [ padding, CR, LF ] - var BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r'; +var BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r'; - function resolveYamlBinary(data) { - if (null === data) { - return false; - } +function resolveYamlBinary(data) { + if (null === data) return false; - var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP; + var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP; - // Convert one by one. - for (idx = 0; idx < max; idx++) { - code = map.indexOf(data.charAt(idx)); + // Convert one by one. + for (idx = 0; idx < max; idx++) { + code = map.indexOf(data.charAt(idx)); - // Skip CR/LF - if (code > 64) { continue; } + // Skip CR/LF + if (code > 64) continue; - // Fail on illegal characters - if (code < 0) { return false; } - - bitlen += 6; - } + // Fail on illegal characters + if (code < 0) return false; - // If there are any bits left, source was corrupted - return (bitlen % 8) === 0; + bitlen += 6; } - function constructYamlBinary(data) { - var idx, tailbits, - input = data.replace(/[\r\n=]/g, ''), // remove CR/LF & padding to simplify scan - max = input.length, - map = BASE64_MAP, - bits = 0, - result = []; + // If there are any bits left, source was corrupted + return (bitlen % 8) === 0; +} - // Collect by 6*4 bits (3 bytes) +function constructYamlBinary(data) { + var idx, tailbits, + input = data.replace(/[\r\n=]/g, ''), // remove CR/LF & padding to simplify scan + max = input.length, + map = BASE64_MAP, + bits = 0, + result = []; - for (idx = 0; idx < max; idx++) { - if ((idx % 4 === 0) && idx) { - result.push((bits >> 16) & 0xFF); - result.push((bits >> 8) & 0xFF); - result.push(bits & 0xFF); - } - - bits = (bits << 6) | map.indexOf(input.charAt(idx)); - } - - // Dump tail + // Collect by 6*4 bits (3 bytes) - tailbits = (max % 4) * 6; - - if (tailbits === 0) { + for (idx = 0; idx < max; idx++) { + if ((idx % 4 === 0) && idx) { result.push((bits >> 16) & 0xFF); result.push((bits >> 8) & 0xFF); result.push(bits & 0xFF); - } else if (tailbits === 18) { - result.push((bits >> 10) & 0xFF); - result.push((bits >> 2) & 0xFF); - } else if (tailbits === 12) { - result.push((bits >> 4) & 0xFF); - } - - // Wrap into Buffer for NodeJS and leave Array for browser - if (NodeBuffer) { - return new NodeBuffer(result); } - return result; + bits = (bits << 6) | map.indexOf(input.charAt(idx)); } - function representYamlBinary(object /*, style*/) { - var result = '', bits = 0, idx, tail, - max = object.length, - map = BASE64_MAP; + // Dump tail - // Convert every three bytes to 4 ASCII characters. + tailbits = (max % 4) * 6; - for (idx = 0; idx < max; idx++) { - if ((idx % 3 === 0) && idx) { - result += map[(bits >> 18) & 0x3F]; - result += map[(bits >> 12) & 0x3F]; - result += map[(bits >> 6) & 0x3F]; - result += map[bits & 0x3F]; - } + if (tailbits === 0) { + result.push((bits >> 16) & 0xFF); + result.push((bits >> 8) & 0xFF); + result.push(bits & 0xFF); + } else if (tailbits === 18) { + result.push((bits >> 10) & 0xFF); + result.push((bits >> 2) & 0xFF); + } else if (tailbits === 12) { + result.push((bits >> 4) & 0xFF); + } - bits = (bits << 8) + object[idx]; - } + // Wrap into Buffer for NodeJS and leave Array for browser + if (NodeBuffer) return new NodeBuffer(result); - // Dump tail + return result; +} - tail = max % 3; +function representYamlBinary(object /*, style*/) { + var result = '', bits = 0, idx, tail, + max = object.length, + map = BASE64_MAP; - if (tail === 0) { + // Convert every three bytes to 4 ASCII characters. + + for (idx = 0; idx < max; idx++) { + if ((idx % 3 === 0) && idx) { result += map[(bits >> 18) & 0x3F]; result += map[(bits >> 12) & 0x3F]; result += map[(bits >> 6) & 0x3F]; result += map[bits & 0x3F]; - } else if (tail === 2) { - result += map[(bits >> 10) & 0x3F]; - result += map[(bits >> 4) & 0x3F]; - result += map[(bits << 2) & 0x3F]; - result += map[64]; - } else if (tail === 1) { - result += map[(bits >> 2) & 0x3F]; - result += map[(bits << 4) & 0x3F]; - result += map[64]; - result += map[64]; } - return result; - } - - function isBinary(object) { - return NodeBuffer && NodeBuffer.isBuffer(object); + bits = (bits << 8) + object[idx]; } - module.exports = new Type('tag:yaml.org,2002:binary', { - kind: 'scalar', - resolve: resolveYamlBinary, - construct: constructYamlBinary, - predicate: isBinary, - represent: representYamlBinary - }); - -},{"../type":13,"buffer":30}],15:[function(require,module,exports){ - 'use strict'; - - var Type = require('../type'); - - function resolveYamlBoolean(data) { - if (null === data) { - return false; - } + // Dump tail - var max = data.length; + tail = max % 3; - return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) || - (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE')); + if (tail === 0) { + result += map[(bits >> 18) & 0x3F]; + result += map[(bits >> 12) & 0x3F]; + result += map[(bits >> 6) & 0x3F]; + result += map[bits & 0x3F]; + } else if (tail === 2) { + result += map[(bits >> 10) & 0x3F]; + result += map[(bits >> 4) & 0x3F]; + result += map[(bits << 2) & 0x3F]; + result += map[64]; + } else if (tail === 1) { + result += map[(bits >> 2) & 0x3F]; + result += map[(bits << 4) & 0x3F]; + result += map[64]; + result += map[64]; } - function constructYamlBoolean(data) { - return data === 'true' || - data === 'True' || - data === 'TRUE'; - } + return result; +} - function isBoolean(object) { - return '[object Boolean]' === Object.prototype.toString.call(object); - } +function isBinary(object) { + return NodeBuffer && NodeBuffer.isBuffer(object); +} - module.exports = new Type('tag:yaml.org,2002:bool', { - kind: 'scalar', - resolve: resolveYamlBoolean, - construct: constructYamlBoolean, - predicate: isBoolean, - represent: { - lowercase: function (object) { return object ? 'true' : 'false'; }, - uppercase: function (object) { return object ? 'TRUE' : 'FALSE'; }, - camelcase: function (object) { return object ? 'True' : 'False'; } - }, - defaultStyle: 'lowercase' - }); +module.exports = new Type('tag:yaml.org,2002:binary', { + kind: 'scalar', + resolve: resolveYamlBinary, + construct: constructYamlBinary, + predicate: isBinary, + represent: representYamlBinary +}); + +},{"../type":13,"buffer":30}],15:[function(require,module,exports){ +'use strict'; + +var Type = require('../type'); + +function resolveYamlBoolean(data) { + if (null === data) return false; + + var max = data.length; + + return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) || + (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE')); +} + +function constructYamlBoolean(data) { + return data === 'true' || + data === 'True' || + data === 'TRUE'; +} + +function isBoolean(object) { + return '[object Boolean]' === Object.prototype.toString.call(object); +} + +module.exports = new Type('tag:yaml.org,2002:bool', { + kind: 'scalar', + resolve: resolveYamlBoolean, + construct: constructYamlBoolean, + predicate: isBoolean, + represent: { + lowercase: function (object) { return object ? 'true' : 'false'; }, + uppercase: function (object) { return object ? 'TRUE' : 'FALSE'; }, + camelcase: function (object) { return object ? 'True' : 'False'; } + }, + defaultStyle: 'lowercase' +}); },{"../type":13}],16:[function(require,module,exports){ - 'use strict'; +'use strict'; - var common = require('../common'); - var Type = require('../type'); +var common = require('../common'); +var Type = require('../type'); - var YAML_FLOAT_PATTERN = new RegExp( - '^(?:[-+]?(?:[0-9][0-9_]*)\\.[0-9_]*(?:[eE][-+][0-9]+)?' + - '|\\.[0-9_]+(?:[eE][-+][0-9]+)?' + - '|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*' + - '|[-+]?\\.(?:inf|Inf|INF)' + - '|\\.(?:nan|NaN|NAN))$'); +var YAML_FLOAT_PATTERN = new RegExp( + '^(?:[-+]?(?:[0-9][0-9_]*)\\.[0-9_]*(?:[eE][-+][0-9]+)?' + + '|\\.[0-9_]+(?:[eE][-+][0-9]+)?' + + '|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*' + + '|[-+]?\\.(?:inf|Inf|INF)' + + '|\\.(?:nan|NaN|NAN))$'); - function resolveYamlFloat(data) { - if (null === data) { - return false; - } +function resolveYamlFloat(data) { + if (null === data) return false; - if (!YAML_FLOAT_PATTERN.test(data)) { - return false; - } - return true; - } + if (!YAML_FLOAT_PATTERN.test(data)) return false; - function constructYamlFloat(data) { - var value, sign, base, digits; + return true; +} - value = data.replace(/_/g, '').toLowerCase(); - sign = '-' === value[0] ? -1 : 1; - digits = []; +function constructYamlFloat(data) { + var value, sign, base, digits; - if (0 <= '+-'.indexOf(value[0])) { - value = value.slice(1); - } + value = data.replace(/_/g, '').toLowerCase(); + sign = '-' === value[0] ? -1 : 1; + digits = []; - if ('.inf' === value) { - return (1 === sign) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY; + if (0 <= '+-'.indexOf(value[0])) { + value = value.slice(1); + } - } else if ('.nan' === value) { - return NaN; + if ('.inf' === value) { + return (1 === sign) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY; - } else if (0 <= value.indexOf(':')) { - value.split(':').forEach(function (v) { - digits.unshift(parseFloat(v, 10)); - }); + } else if ('.nan' === value) { + return NaN; - value = 0.0; - base = 1; + } else if (0 <= value.indexOf(':')) { + value.split(':').forEach(function (v) { + digits.unshift(parseFloat(v, 10)); + }); - digits.forEach(function (d) { - value += d * base; - base *= 60; - }); + value = 0.0; + base = 1; - return sign * value; + digits.forEach(function (d) { + value += d * base; + base *= 60; + }); + + return sign * value; - } - return sign * parseFloat(value, 10); } + return sign * parseFloat(value, 10); +} - var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/; +var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/; - function representYamlFloat(object, style) { - var res; +function representYamlFloat(object, style) { + var res; - if (isNaN(object)) { - switch (style) { - case 'lowercase': - return '.nan'; - case 'uppercase': - return '.NAN'; - case 'camelcase': - return '.NaN'; - } - } else if (Number.POSITIVE_INFINITY === object) { - switch (style) { - case 'lowercase': - return '.inf'; - case 'uppercase': - return '.INF'; - case 'camelcase': - return '.Inf'; - } - } else if (Number.NEGATIVE_INFINITY === object) { - switch (style) { - case 'lowercase': - return '-.inf'; - case 'uppercase': - return '-.INF'; - case 'camelcase': - return '-.Inf'; - } - } else if (common.isNegativeZero(object)) { - return '-0.0'; + if (isNaN(object)) { + switch (style) { + case 'lowercase': return '.nan'; + case 'uppercase': return '.NAN'; + case 'camelcase': return '.NaN'; + } + } else if (Number.POSITIVE_INFINITY === object) { + switch (style) { + case 'lowercase': return '.inf'; + case 'uppercase': return '.INF'; + case 'camelcase': return '.Inf'; + } + } else if (Number.NEGATIVE_INFINITY === object) { + switch (style) { + case 'lowercase': return '-.inf'; + case 'uppercase': return '-.INF'; + case 'camelcase': return '-.Inf'; } + } else if (common.isNegativeZero(object)) { + return '-0.0'; + } - res = object.toString(10); + res = object.toString(10); - // JS stringifier can build scientific format without dots: 5e-100, - // while YAML requres dot: 5.e-100. Fix it with simple hack + // JS stringifier can build scientific format without dots: 5e-100, + // while YAML requres dot: 5.e-100. Fix it with simple hack - return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res; - } + return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res; +} - function isFloat(object) { - return ('[object Number]' === Object.prototype.toString.call(object)) && - (0 !== object % 1 || common.isNegativeZero(object)); - } +function isFloat(object) { + return ('[object Number]' === Object.prototype.toString.call(object)) && + (0 !== object % 1 || common.isNegativeZero(object)); +} - module.exports = new Type('tag:yaml.org,2002:float', { - kind: 'scalar', - resolve: resolveYamlFloat, - construct: constructYamlFloat, - predicate: isFloat, - represent: representYamlFloat, - defaultStyle: 'lowercase' - }); +module.exports = new Type('tag:yaml.org,2002:float', { + kind: 'scalar', + resolve: resolveYamlFloat, + construct: constructYamlFloat, + predicate: isFloat, + represent: representYamlFloat, + defaultStyle: 'lowercase' +}); },{"../common":2,"../type":13}],17:[function(require,module,exports){ - 'use strict'; +'use strict'; - var common = require('../common'); - var Type = require('../type'); +var common = require('../common'); +var Type = require('../type'); - function isHexCode(c) { - return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) || - ((0x41/* A */ <= c) && (c <= 0x46/* F */)) || - ((0x61/* a */ <= c) && (c <= 0x66/* f */)); - } +function isHexCode(c) { + return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) || + ((0x41/* A */ <= c) && (c <= 0x46/* F */)) || + ((0x61/* a */ <= c) && (c <= 0x66/* f */)); +} - function isOctCode(c) { - return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */)); - } +function isOctCode(c) { + return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */)); +} - function isDecCode(c) { - return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)); - } +function isDecCode(c) { + return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)); +} - function resolveYamlInteger(data) { - if (null === data) { - return false; - } +function resolveYamlInteger(data) { + if (null === data) return false; - var max = data.length, - index = 0, - hasDigits = false, - ch; + var max = data.length, + index = 0, + hasDigits = false, + ch; - if (!max) { return false; } + if (!max) return false; - ch = data[index]; + ch = data[index]; - // sign - if (ch === '-' || ch === '+') { - ch = data[++index]; - } + // sign + if (ch === '-' || ch === '+') { + ch = data[++index]; + } - if (ch === '0') { - // 0 - if (index + 1 === max) { return true; } - ch = data[++index]; + if (ch === '0') { + // 0 + if (index + 1 === max) return true; + ch = data[++index]; - // base 2, base 8, base 16 + // base 2, base 8, base 16 - if (ch === 'b') { - // base 2 - index++; + if (ch === 'b') { + // base 2 + index++; - for (; index < max; index++) { - ch = data[index]; - if (ch === '_') { continue; } - if (ch !== '0' && ch !== '1') { - return false; - } - hasDigits = true; - } - return hasDigits; + for (; index < max; index++) { + ch = data[index]; + if (ch === '_') continue; + if (ch !== '0' && ch !== '1') return false; + hasDigits = true; } + return hasDigits; + } - if (ch === 'x') { - // base 16 - index++; - - for (; index < max; index++) { - ch = data[index]; - if (ch === '_') { continue; } - if (!isHexCode(data.charCodeAt(index))) { - return false; - } - hasDigits = true; - } - return hasDigits; - } + if (ch === 'x') { + // base 16 + index++; - // base 8 for (; index < max; index++) { ch = data[index]; - if (ch === '_') { continue; } - if (!isOctCode(data.charCodeAt(index))) { - return false; - } + if (ch === '_') continue; + if (!isHexCode(data.charCodeAt(index))) return false; hasDigits = true; } return hasDigits; } - // base 10 (except 0) or base 60 - + // base 8 for (; index < max; index++) { ch = data[index]; - if (ch === '_') { continue; } - if (ch === ':') { break; } - if (!isDecCode(data.charCodeAt(index))) { - return false; - } + if (ch === '_') continue; + if (!isOctCode(data.charCodeAt(index))) return false; hasDigits = true; } + return hasDigits; + } - if (!hasDigits) { return false; } - - // if !base60 - done; - if (ch !== ':') { return true; } + // base 10 (except 0) or base 60 - // base60 almost not used, no needs to optimize - return /^(:[0-5]?[0-9])+$/.test(data.slice(index)); + for (; index < max; index++) { + ch = data[index]; + if (ch === '_') continue; + if (ch === ':') break; + if (!isDecCode(data.charCodeAt(index))) { + return false; + } + hasDigits = true; } - function constructYamlInteger(data) { - var value = data, sign = 1, ch, base, digits = []; + if (!hasDigits) return false; - if (value.indexOf('_') !== -1) { - value = value.replace(/_/g, ''); - } + // if !base60 - done; + if (ch !== ':') return true; - ch = value[0]; + // base60 almost not used, no needs to optimize + return /^(:[0-5]?[0-9])+$/.test(data.slice(index)); +} - if (ch === '-' || ch === '+') { - if (ch === '-') { sign = -1; } - value = value.slice(1); - ch = value[0]; - } +function constructYamlInteger(data) { + var value = data, sign = 1, ch, base, digits = []; - if ('0' === value) { - return 0; - } + if (value.indexOf('_') !== -1) { + value = value.replace(/_/g, ''); + } - if (ch === '0') { - if (value[1] === 'b') { - return sign * parseInt(value.slice(2), 2); - } - if (value[1] === 'x') { - return sign * parseInt(value, 16); - } - return sign * parseInt(value, 8); + ch = value[0]; - } + if (ch === '-' || ch === '+') { + if (ch === '-') sign = -1; + value = value.slice(1); + ch = value[0]; + } - if (value.indexOf(':') !== -1) { - value.split(':').forEach(function (v) { - digits.unshift(parseInt(v, 10)); - }); + if ('0' === value) return 0; - value = 0; - base = 1; + if (ch === '0') { + if (value[1] === 'b') return sign * parseInt(value.slice(2), 2); + if (value[1] === 'x') return sign * parseInt(value, 16); + return sign * parseInt(value, 8); + } - digits.forEach(function (d) { - value += (d * base); - base *= 60; - }); + if (value.indexOf(':') !== -1) { + value.split(':').forEach(function (v) { + digits.unshift(parseInt(v, 10)); + }); - return sign * value; + value = 0; + base = 1; - } + digits.forEach(function (d) { + value += (d * base); + base *= 60; + }); - return sign * parseInt(value, 10); - } + return sign * value; - function isInteger(object) { - return ('[object Number]' === Object.prototype.toString.call(object)) && - (0 === object % 1 && !common.isNegativeZero(object)); } - module.exports = new Type('tag:yaml.org,2002:int', { - kind: 'scalar', - resolve: resolveYamlInteger, - construct: constructYamlInteger, - predicate: isInteger, - represent: { - binary: function (object) { return '0b' + object.toString(2); }, - octal: function (object) { return '0' + object.toString(8); }, - decimal: function (object) { return object.toString(10); }, - hexadecimal: function (object) { return '0x' + object.toString(16).toUpperCase(); } - }, - defaultStyle: 'decimal', - styleAliases: { - binary: [ 2, 'bin' ], - octal: [ 8, 'oct' ], - decimal: [ 10, 'dec' ], - hexadecimal: [ 16, 'hex' ] - } - }); + return sign * parseInt(value, 10); +} + +function isInteger(object) { + return ('[object Number]' === Object.prototype.toString.call(object)) && + (0 === object % 1 && !common.isNegativeZero(object)); +} + +module.exports = new Type('tag:yaml.org,2002:int', { + kind: 'scalar', + resolve: resolveYamlInteger, + construct: constructYamlInteger, + predicate: isInteger, + represent: { + binary: function (object) { return '0b' + object.toString(2); }, + octal: function (object) { return '0' + object.toString(8); }, + decimal: function (object) { return object.toString(10); }, + hexadecimal: function (object) { return '0x' + object.toString(16).toUpperCase(); } + }, + defaultStyle: 'decimal', + styleAliases: { + binary: [ 2, 'bin' ], + octal: [ 8, 'oct' ], + decimal: [ 10, 'dec' ], + hexadecimal: [ 16, 'hex' ] + } +}); },{"../common":2,"../type":13}],18:[function(require,module,exports){ - 'use strict'; +'use strict'; - var esprima; +var esprima; // Browserified version does not have esprima // @@ -3456,540 +3384,477 @@ // If not found - try to fallback to window.esprima. If not // found too - then fail to parse. // - try { - // workaround to exclude package from browserify list. - var _require = require; - esprima = _require('esprima'); - } catch (_) { - /*global window */ - if (typeof window !== 'undefined') { esprima = window.esprima; } - } - - var Type = require('../../type'); - - function resolveJavascriptFunction(data) { - if (null === data) { - return false; - } - - try { - var source = '(' + data + ')', - ast = esprima.parse(source, { range: true }); +try { + // workaround to exclude package from browserify list. + var _require = require; + esprima = _require('esprima'); +} catch (_) { + /*global window */ + if (typeof window !== 'undefined') esprima = window.esprima; +} - if ('Program' !== ast.type || - 1 !== ast.body.length || - 'ExpressionStatement' !== ast.body[0].type || - 'FunctionExpression' !== ast.body[0].expression.type) { - return false; - } - - return true; - } catch (err) { - return false; - } - } +var Type = require('../../type'); - function constructJavascriptFunction(data) { - /*jslint evil:true*/ +function resolveJavascriptFunction(data) { + if (null === data) return false; + try { var source = '(' + data + ')', - ast = esprima.parse(source, { range: true }), - params = [], - body; + ast = esprima.parse(source, { range: true }); if ('Program' !== ast.type || 1 !== ast.body.length || 'ExpressionStatement' !== ast.body[0].type || 'FunctionExpression' !== ast.body[0].expression.type) { - throw new Error('Failed to resolve function'); + return false; } - ast.body[0].expression.params.forEach(function (param) { - params.push(param.name); - }); - - body = ast.body[0].expression.body.range; - - // Esprima's ranges include the first '{' and the last '}' characters on - // function expressions. So cut them out. - /*eslint-disable no-new-func*/ - return new Function(params, source.slice(body[0] + 1, body[1] - 1)); + return true; + } catch (err) { + return false; } +} - function representJavascriptFunction(object /*, style*/) { - return object.toString(); - } +function constructJavascriptFunction(data) { + /*jslint evil:true*/ - function isFunction(object) { - return '[object Function]' === Object.prototype.toString.call(object); + var source = '(' + data + ')', + ast = esprima.parse(source, { range: true }), + params = [], + body; + + if ('Program' !== ast.type || + 1 !== ast.body.length || + 'ExpressionStatement' !== ast.body[0].type || + 'FunctionExpression' !== ast.body[0].expression.type) { + throw new Error('Failed to resolve function'); } - module.exports = new Type('tag:yaml.org,2002:js/function', { - kind: 'scalar', - resolve: resolveJavascriptFunction, - construct: constructJavascriptFunction, - predicate: isFunction, - represent: representJavascriptFunction + ast.body[0].expression.params.forEach(function (param) { + params.push(param.name); }); -},{"../../type":13}],19:[function(require,module,exports){ - 'use strict'; + body = ast.body[0].expression.body.range; - var Type = require('../../type'); + // Esprima's ranges include the first '{' and the last '}' characters on + // function expressions. So cut them out. + /*eslint-disable no-new-func*/ + return new Function(params, source.slice(body[0] + 1, body[1] - 1)); +} - function resolveJavascriptRegExp(data) { - if (null === data) { - return false; - } +function representJavascriptFunction(object /*, style*/) { + return object.toString(); +} - if (0 === data.length) { - return false; - } +function isFunction(object) { + return '[object Function]' === Object.prototype.toString.call(object); +} - var regexp = data, - tail = /\/([gim]*)$/.exec(data), - modifiers = ''; +module.exports = new Type('tag:yaml.org,2002:js/function', { + kind: 'scalar', + resolve: resolveJavascriptFunction, + construct: constructJavascriptFunction, + predicate: isFunction, + represent: representJavascriptFunction +}); - // if regexp starts with '/' it can have modifiers and must be properly closed - // `/foo/gim` - modifiers tail can be maximum 3 chars - if ('/' === regexp[0]) { - if (tail) { - modifiers = tail[1]; - } +},{"../../type":13}],19:[function(require,module,exports){ +'use strict'; - if (modifiers.length > 3) { return false; } - // if expression starts with /, is should be properly terminated - if (regexp[regexp.length - modifiers.length - 1] !== '/') { return false; } +var Type = require('../../type'); - regexp = regexp.slice(1, regexp.length - modifiers.length - 1); - } +function resolveJavascriptRegExp(data) { + if (null === data) return false; + if (0 === data.length) return false; - try { - return true; - } catch (error) { - return false; - } + var regexp = data, + tail = /\/([gim]*)$/.exec(data), + modifiers = ''; + + // if regexp starts with '/' it can have modifiers and must be properly closed + // `/foo/gim` - modifiers tail can be maximum 3 chars + if ('/' === regexp[0]) { + if (tail) modifiers = tail[1]; + + if (modifiers.length > 3) return false; + // if expression starts with /, is should be properly terminated + if (regexp[regexp.length - modifiers.length - 1] !== '/') return false; } - function constructJavascriptRegExp(data) { - var regexp = data, - tail = /\/([gim]*)$/.exec(data), - modifiers = ''; + return true; +} - // `/foo/gim` - tail can be maximum 4 chars - if ('/' === regexp[0]) { - if (tail) { - modifiers = tail[1]; - } - regexp = regexp.slice(1, regexp.length - modifiers.length - 1); - } +function constructJavascriptRegExp(data) { + var regexp = data, + tail = /\/([gim]*)$/.exec(data), + modifiers = ''; - return new RegExp(regexp, modifiers); + // `/foo/gim` - tail can be maximum 4 chars + if ('/' === regexp[0]) { + if (tail) modifiers = tail[1]; + regexp = regexp.slice(1, regexp.length - modifiers.length - 1); } - function representJavascriptRegExp(object /*, style*/) { - var result = '/' + object.source + '/'; - - if (object.global) { - result += 'g'; - } + return new RegExp(regexp, modifiers); +} - if (object.multiline) { - result += 'm'; - } +function representJavascriptRegExp(object /*, style*/) { + var result = '/' + object.source + '/'; - if (object.ignoreCase) { - result += 'i'; - } + if (object.global) result += 'g'; + if (object.multiline) result += 'm'; + if (object.ignoreCase) result += 'i'; - return result; - } + return result; +} - function isRegExp(object) { - return '[object RegExp]' === Object.prototype.toString.call(object); - } +function isRegExp(object) { + return '[object RegExp]' === Object.prototype.toString.call(object); +} - module.exports = new Type('tag:yaml.org,2002:js/regexp', { - kind: 'scalar', - resolve: resolveJavascriptRegExp, - construct: constructJavascriptRegExp, - predicate: isRegExp, - represent: representJavascriptRegExp - }); +module.exports = new Type('tag:yaml.org,2002:js/regexp', { + kind: 'scalar', + resolve: resolveJavascriptRegExp, + construct: constructJavascriptRegExp, + predicate: isRegExp, + represent: representJavascriptRegExp +}); },{"../../type":13}],20:[function(require,module,exports){ - 'use strict'; +'use strict'; - var Type = require('../../type'); +var Type = require('../../type'); - function resolveJavascriptUndefined() { - return true; - } +function resolveJavascriptUndefined() { + return true; +} - function constructJavascriptUndefined() { - /*eslint-disable no-undefined*/ - return undefined; - } +function constructJavascriptUndefined() { + /*eslint-disable no-undefined*/ + return undefined; +} - function representJavascriptUndefined() { - return ''; - } +function representJavascriptUndefined() { + return ''; +} - function isUndefined(object) { - return 'undefined' === typeof object; - } +function isUndefined(object) { + return 'undefined' === typeof object; +} - module.exports = new Type('tag:yaml.org,2002:js/undefined', { - kind: 'scalar', - resolve: resolveJavascriptUndefined, - construct: constructJavascriptUndefined, - predicate: isUndefined, - represent: representJavascriptUndefined - }); +module.exports = new Type('tag:yaml.org,2002:js/undefined', { + kind: 'scalar', + resolve: resolveJavascriptUndefined, + construct: constructJavascriptUndefined, + predicate: isUndefined, + represent: representJavascriptUndefined +}); },{"../../type":13}],21:[function(require,module,exports){ - 'use strict'; +'use strict'; - var Type = require('../type'); +var Type = require('../type'); - module.exports = new Type('tag:yaml.org,2002:map', { - kind: 'mapping', - construct: function (data) { return null !== data ? data : {}; } - }); +module.exports = new Type('tag:yaml.org,2002:map', { + kind: 'mapping', + construct: function (data) { return null !== data ? data : {}; } +}); },{"../type":13}],22:[function(require,module,exports){ - 'use strict'; +'use strict'; - var Type = require('../type'); +var Type = require('../type'); - function resolveYamlMerge(data) { - return '<<' === data || null === data; - } +function resolveYamlMerge(data) { + return '<<' === data || null === data; +} - module.exports = new Type('tag:yaml.org,2002:merge', { - kind: 'scalar', - resolve: resolveYamlMerge - }); +module.exports = new Type('tag:yaml.org,2002:merge', { + kind: 'scalar', + resolve: resolveYamlMerge +}); },{"../type":13}],23:[function(require,module,exports){ - 'use strict'; +'use strict'; - var Type = require('../type'); +var Type = require('../type'); - function resolveYamlNull(data) { - if (null === data) { - return true; - } +function resolveYamlNull(data) { + if (null === data) return true; - var max = data.length; + var max = data.length; - return (max === 1 && data === '~') || - (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL')); - } + return (max === 1 && data === '~') || + (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL')); +} - function constructYamlNull() { - return null; - } +function constructYamlNull() { + return null; +} - function isNull(object) { - return null === object; - } +function isNull(object) { + return null === object; +} - module.exports = new Type('tag:yaml.org,2002:null', { - kind: 'scalar', - resolve: resolveYamlNull, - construct: constructYamlNull, - predicate: isNull, - represent: { - canonical: function () { return '~'; }, - lowercase: function () { return 'null'; }, - uppercase: function () { return 'NULL'; }, - camelcase: function () { return 'Null'; } - }, - defaultStyle: 'lowercase' - }); +module.exports = new Type('tag:yaml.org,2002:null', { + kind: 'scalar', + resolve: resolveYamlNull, + construct: constructYamlNull, + predicate: isNull, + represent: { + canonical: function () { return '~'; }, + lowercase: function () { return 'null'; }, + uppercase: function () { return 'NULL'; }, + camelcase: function () { return 'Null'; } + }, + defaultStyle: 'lowercase' +}); },{"../type":13}],24:[function(require,module,exports){ - 'use strict'; - - var Type = require('../type'); - - var _hasOwnProperty = Object.prototype.hasOwnProperty; - var _toString = Object.prototype.toString; +'use strict'; - function resolveYamlOmap(data) { - if (null === data) { - return true; - } +var Type = require('../type'); - var objectKeys = [], index, length, pair, pairKey, pairHasKey, - object = data; +var _hasOwnProperty = Object.prototype.hasOwnProperty; +var _toString = Object.prototype.toString; - for (index = 0, length = object.length; index < length; index += 1) { - pair = object[index]; - pairHasKey = false; +function resolveYamlOmap(data) { + if (null === data) return true; - if ('[object Object]' !== _toString.call(pair)) { - return false; - } + var objectKeys = [], index, length, pair, pairKey, pairHasKey, + object = data; - for (pairKey in pair) { - if (_hasOwnProperty.call(pair, pairKey)) { - if (!pairHasKey) { - pairHasKey = true; - } else { - return false; - } - } - } + for (index = 0, length = object.length; index < length; index += 1) { + pair = object[index]; + pairHasKey = false; - if (!pairHasKey) { - return false; - } + if ('[object Object]' !== _toString.call(pair)) return false; - if (-1 === objectKeys.indexOf(pairKey)) { - objectKeys.push(pairKey); - } else { - return false; + for (pairKey in pair) { + if (_hasOwnProperty.call(pair, pairKey)) { + if (!pairHasKey) pairHasKey = true; + else return false; } } - return true; - } + if (!pairHasKey) return false; - function constructYamlOmap(data) { - return null !== data ? data : []; + if (-1 === objectKeys.indexOf(pairKey)) objectKeys.push(pairKey); + else return false; } - module.exports = new Type('tag:yaml.org,2002:omap', { - kind: 'sequence', - resolve: resolveYamlOmap, - construct: constructYamlOmap - }); + return true; +} -},{"../type":13}],25:[function(require,module,exports){ - 'use strict'; +function constructYamlOmap(data) { + return null !== data ? data : []; +} - var Type = require('../type'); +module.exports = new Type('tag:yaml.org,2002:omap', { + kind: 'sequence', + resolve: resolveYamlOmap, + construct: constructYamlOmap +}); - var _toString = Object.prototype.toString; +},{"../type":13}],25:[function(require,module,exports){ +'use strict'; - function resolveYamlPairs(data) { - if (null === data) { - return true; - } +var Type = require('../type'); - var index, length, pair, keys, result, - object = data; +var _toString = Object.prototype.toString; - result = new Array(object.length); +function resolveYamlPairs(data) { + if (null === data) return true; - for (index = 0, length = object.length; index < length; index += 1) { - pair = object[index]; + var index, length, pair, keys, result, + object = data; - if ('[object Object]' !== _toString.call(pair)) { - return false; - } + result = new Array(object.length); - keys = Object.keys(pair); + for (index = 0, length = object.length; index < length; index += 1) { + pair = object[index]; - if (1 !== keys.length) { - return false; - } + if ('[object Object]' !== _toString.call(pair)) return false; - result[index] = [ keys[0], pair[keys[0]] ]; - } + keys = Object.keys(pair); - return true; + if (1 !== keys.length) return false; + + result[index] = [ keys[0], pair[keys[0]] ]; } - function constructYamlPairs(data) { - if (null === data) { - return []; - } + return true; +} - var index, length, pair, keys, result, - object = data; +function constructYamlPairs(data) { + if (null === data) return []; - result = new Array(object.length); + var index, length, pair, keys, result, + object = data; - for (index = 0, length = object.length; index < length; index += 1) { - pair = object[index]; + result = new Array(object.length); - keys = Object.keys(pair); + for (index = 0, length = object.length; index < length; index += 1) { + pair = object[index]; - result[index] = [ keys[0], pair[keys[0]] ]; - } + keys = Object.keys(pair); - return result; + result[index] = [ keys[0], pair[keys[0]] ]; } - module.exports = new Type('tag:yaml.org,2002:pairs', { - kind: 'sequence', - resolve: resolveYamlPairs, - construct: constructYamlPairs - }); + return result; +} + +module.exports = new Type('tag:yaml.org,2002:pairs', { + kind: 'sequence', + resolve: resolveYamlPairs, + construct: constructYamlPairs +}); },{"../type":13}],26:[function(require,module,exports){ - 'use strict'; +'use strict'; - var Type = require('../type'); +var Type = require('../type'); - module.exports = new Type('tag:yaml.org,2002:seq', { - kind: 'sequence', - construct: function (data) { return null !== data ? data : []; } - }); +module.exports = new Type('tag:yaml.org,2002:seq', { + kind: 'sequence', + construct: function (data) { return null !== data ? data : []; } +}); },{"../type":13}],27:[function(require,module,exports){ - 'use strict'; +'use strict'; - var Type = require('../type'); +var Type = require('../type'); - var _hasOwnProperty = Object.prototype.hasOwnProperty; +var _hasOwnProperty = Object.prototype.hasOwnProperty; - function resolveYamlSet(data) { - if (null === data) { - return true; - } +function resolveYamlSet(data) { + if (null === data) return true; - var key, object = data; + var key, object = data; - for (key in object) { - if (_hasOwnProperty.call(object, key)) { - if (null !== object[key]) { - return false; - } - } + for (key in object) { + if (_hasOwnProperty.call(object, key)) { + if (null !== object[key]) return false; } - - return true; } - function constructYamlSet(data) { - return null !== data ? data : {}; - } + return true; +} - module.exports = new Type('tag:yaml.org,2002:set', { - kind: 'mapping', - resolve: resolveYamlSet, - construct: constructYamlSet - }); +function constructYamlSet(data) { + return null !== data ? data : {}; +} + +module.exports = new Type('tag:yaml.org,2002:set', { + kind: 'mapping', + resolve: resolveYamlSet, + construct: constructYamlSet +}); },{"../type":13}],28:[function(require,module,exports){ - 'use strict'; +'use strict'; - var Type = require('../type'); +var Type = require('../type'); - module.exports = new Type('tag:yaml.org,2002:str', { - kind: 'scalar', - construct: function (data) { return null !== data ? data : ''; } - }); +module.exports = new Type('tag:yaml.org,2002:str', { + kind: 'scalar', + construct: function (data) { return null !== data ? data : ''; } +}); },{"../type":13}],29:[function(require,module,exports){ - 'use strict'; - - var Type = require('../type'); - - var YAML_TIMESTAMP_REGEXP = new RegExp( - '^([0-9][0-9][0-9][0-9])' + // [1] year - '-([0-9][0-9]?)' + // [2] month - '-([0-9][0-9]?)' + // [3] day - '(?:(?:[Tt]|[ \\t]+)' + // ... - '([0-9][0-9]?)' + // [4] hour - ':([0-9][0-9])' + // [5] minute - ':([0-9][0-9])' + // [6] second - '(?:\\.([0-9]*))?' + // [7] fraction - '(?:[ \\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour - '(?::([0-9][0-9]))?))?)?$'); // [11] tz_minute - - function resolveYamlTimestamp(data) { - if (null === data) { - return false; - } +'use strict'; - if (YAML_TIMESTAMP_REGEXP.exec(data) === null) { - return false; - } +var Type = require('../type'); - return true; - } +var YAML_TIMESTAMP_REGEXP = new RegExp( + '^([0-9][0-9][0-9][0-9])' + // [1] year + '-([0-9][0-9]?)' + // [2] month + '-([0-9][0-9]?)' + // [3] day + '(?:(?:[Tt]|[ \\t]+)' + // ... + '([0-9][0-9]?)' + // [4] hour + ':([0-9][0-9])' + // [5] minute + ':([0-9][0-9])' + // [6] second + '(?:\\.([0-9]*))?' + // [7] fraction + '(?:[ \\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour + '(?::([0-9][0-9]))?))?)?$'); // [11] tz_minute - function constructYamlTimestamp(data) { - var match, year, month, day, hour, minute, second, fraction = 0, - delta = null, tz_hour, tz_minute, date; +function resolveYamlTimestamp(data) { + if (null === data) return false; + if (YAML_TIMESTAMP_REGEXP.exec(data) === null) return false; + return true; +} - match = YAML_TIMESTAMP_REGEXP.exec(data); +function constructYamlTimestamp(data) { + var match, year, month, day, hour, minute, second, fraction = 0, + delta = null, tz_hour, tz_minute, date; - if (null === match) { - throw new Error('Date resolve error'); - } + match = YAML_TIMESTAMP_REGEXP.exec(data); - // match: [1] year [2] month [3] day + if (null === match) throw new Error('Date resolve error'); - year = +(match[1]); - month = +(match[2]) - 1; // JS month starts with 0 - day = +(match[3]); + // match: [1] year [2] month [3] day - if (!match[4]) { // no hour - return new Date(Date.UTC(year, month, day)); - } + year = +(match[1]); + month = +(match[2]) - 1; // JS month starts with 0 + day = +(match[3]); + + if (!match[4]) { // no hour + return new Date(Date.UTC(year, month, day)); + } - // match: [4] hour [5] minute [6] second [7] fraction + // match: [4] hour [5] minute [6] second [7] fraction - hour = +(match[4]); - minute = +(match[5]); - second = +(match[6]); + hour = +(match[4]); + minute = +(match[5]); + second = +(match[6]); - if (match[7]) { - fraction = match[7].slice(0, 3); - while (fraction.length < 3) { // milli-seconds - fraction += '0'; - } - fraction = +fraction; + if (match[7]) { + fraction = match[7].slice(0, 3); + while (fraction.length < 3) { // milli-seconds + fraction += '0'; } + fraction = +fraction; + } - // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute + // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute - if (match[9]) { - tz_hour = +(match[10]); - tz_minute = +(match[11] || 0); - delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds - if ('-' === match[9]) { - delta = -delta; - } - } + if (match[9]) { + tz_hour = +(match[10]); + tz_minute = +(match[11] || 0); + delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds + if ('-' === match[9]) delta = -delta; + } - date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction)); + date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction)); - if (delta) { - date.setTime(date.getTime() - delta); - } + if (delta) date.setTime(date.getTime() - delta); - return date; - } + return date; +} - function representYamlTimestamp(object /*, style*/) { - return object.toISOString(); - } +function representYamlTimestamp(object /*, style*/) { + return object.toISOString(); +} - module.exports = new Type('tag:yaml.org,2002:timestamp', { - kind: 'scalar', - resolve: resolveYamlTimestamp, - construct: constructYamlTimestamp, - instanceOf: Date, - represent: representYamlTimestamp - }); +module.exports = new Type('tag:yaml.org,2002:timestamp', { + kind: 'scalar', + resolve: resolveYamlTimestamp, + construct: constructYamlTimestamp, + instanceOf: Date, + represent: representYamlTimestamp +}); },{"../type":13}],30:[function(require,module,exports){ },{}],"/":[function(require,module,exports){ - 'use strict'; +'use strict'; - var yaml = require('./lib/js-yaml.js'); +var yaml = require('./lib/js-yaml.js'); - module.exports = yaml; +module.exports = yaml; },{"./lib/js-yaml.js":1}]},{},[])("/") -}); \ No newline at end of file +}); From 2d75ed5cdfae618af20d1a87246ea989ccca5289 Mon Sep 17 00:00:00 2001 From: Alex Heneveld Date: Thu, 11 Feb 2016 01:38:25 +0000 Subject: [PATCH 02/10] composer allows blueprints to be passed, and app-add-wizard preview button takes you to composer previously "preview" button just reset the dialog; this also gives slightly more interesting examples --- .../assets/js/model/catalog-application.js | 1 - src/main/webapp/assets/js/router.js | 8 +-- .../assets/js/view/application-add-wizard.js | 46 +++++++++----- src/main/webapp/assets/js/view/catalog.js | 3 +- src/main/webapp/assets/js/view/editor.js | 60 +++++++++++++++---- src/main/webapp/assets/tpl/editor/page.html | 2 +- 6 files changed, 87 insertions(+), 33 deletions(-) diff --git a/src/main/webapp/assets/js/model/catalog-application.js b/src/main/webapp/assets/js/model/catalog-application.js index f1a15eb7d..43f28b41e 100644 --- a/src/main/webapp/assets/js/model/catalog-application.js +++ b/src/main/webapp/assets/js/model/catalog-application.js @@ -51,7 +51,6 @@ define(["underscore", "backbone"], function (_, Backbone) { }, getId: function(id){ return this.find(function(model) { - console.info("model", model, model.get('id') === id); return model.get('id') === id; }); } diff --git a/src/main/webapp/assets/js/router.js b/src/main/webapp/assets/js/router.js index 54874a93e..1d6dae47f 100644 --- a/src/main/webapp/assets/js/router.js +++ b/src/main/webapp/assets/js/router.js @@ -123,7 +123,7 @@ define([ routes:{ 'v1/home/*trail':'homePage', //'v1/editor/*trail':'editorPage', - 'v1/editor(/)(:type)(/)(:typeId)':'editorPage', + 'v1/editor(/)(:type)(/)(:typeId)(/:content)':'editorPage', 'v1/applications/:app/entities/*trail':'applicationsPage', 'v1/applications/*trail':'applicationsPage', 'v1/applications':'applicationsPage', @@ -179,13 +179,13 @@ define([ } }, error: render}); }, - editorPage: function (type, typeId) { - console.log("editorPage", type, typeId); + editorPage: function (type, typeId, content) { var editorView = new EditorView({ collection: this.applications, appRouter: this, type: type, - typeId: typeId + typeId: typeId, + content: content }); this.showView("#application-content", editorView); $(".nav1").removeClass("active"); diff --git a/src/main/webapp/assets/js/view/application-add-wizard.js b/src/main/webapp/assets/js/view/application-add-wizard.js index 344d6a071..ffdee6d34 100644 --- a/src/main/webapp/assets/js/view/application-add-wizard.js +++ b/src/main/webapp/assets/js/view/application-add-wizard.js @@ -266,6 +266,7 @@ define([ nextStep:function () { if (this.currentStep == 0) { if (this.currentView.validate()) { + this.isTemplate = false; var yaml = (this.currentView && this.currentView.selectedTemplate && this.currentView.selectedTemplate.yaml); if (yaml) { try { @@ -283,16 +284,15 @@ define([ } } } - yaml = (hasLocation ? true : false); + this.isTemplate = (hasLocation ? true : false); } catch (e) { log("Warning: could not parse yaml template") log(yaml); - yaml = false; } } - if (yaml) { - // it's a yaml catalog template which includes a location, show the yaml tab navigate to editor - this.currentView.redirectToEditorTab(this.currentView.selectedTemplate.id); + if (this.isTemplate) { + // it's a yaml catalog *template* (because it includes a location); go to composer + this.redirectToEditorTabToDeployId(this.currentView.selectedTemplate.id); } else { // it's a java catalog template or yaml template without a location, go to wizard this.currentStep += 1; @@ -307,12 +307,16 @@ define([ }, previewStep:function () { if (this.currentView.validate()) { - this.currentStep = 0; - var that = this; - this.renderCurrentStep(function callback(view) { + var yaml; + if (this.model.mode == "yaml") { + yaml = this.model.yaml; + } else { // Drop any "None" locations. - that.model.spec.pruneLocations(); - }); + this.model.spec.pruneLocations(); + yaml = JsYaml.safeDump(oldSpecToCamp(this.model.spec.toJSON())); + } + + this.redirectToEditorTabToDeployYaml(yaml); } else { // call to validate should showFailure } @@ -323,7 +327,20 @@ define([ } else { // call to validate should showFailure } - } + }, + + redirectToEditorTabToDeployId: function(catalogId){ + this.redirectTo("/v1/editor/app/"+ (typeof catalogId === 'string' ? catalogId : '')); + }, + redirectToEditorTabToDeployYaml: function(yaml){ + this.redirectTo("/v1/editor/app/_/"+encodeURIComponent(yaml)); + }, + redirectTo: function(url){ + var $modal = $('.add-app #modal-container .modal'); + $modal.modal('hide'); + $modal.fadeTo(500,1); + Backbone.history.navigate(url, {trigger: true}); + }, }) // Note: this does not restore values on a back click; setting type and entity type+name is easy, @@ -432,11 +449,8 @@ define([ $("ul#app-add-wizard-create-tab").find("a[href='#yamlTab']").tab('show'); $("#yaml_code").focus(); }, - redirectToEditorTab: function(catalogId){ - var $modal = $('.add-app #modal-container .modal'); - $modal.modal('hide'); - $modal.fadeTo(500,1); - Backbone.history.navigate("/v1/editor/app/"+ (typeof catalogId === 'string' ? catalogId : '') ,{trigger: true}); + redirectToEditorTab: function() { + this.redirectToEditorTabToDeployId(); }, applyFilter: function(e) { var filter = $(e.currentTarget).val().toLowerCase() diff --git a/src/main/webapp/assets/js/view/catalog.js b/src/main/webapp/assets/js/view/catalog.js index 90e89cafd..eb9effd38 100644 --- a/src/main/webapp/assets/js/view/catalog.js +++ b/src/main/webapp/assets/js/view/catalog.js @@ -170,7 +170,8 @@ define([ Backbone.history.navigate("/v1/catalog/new/" + type); this.$("#catalog-add-form").html(this.contextView.$el); }else{ - Backbone.history.navigate('/v1/editor/catalog/'+ type, {trigger: true}); + // go to composer + Backbone.history.navigate('/v1/editor/catalog/', {trigger: true}); } } }); diff --git a/src/main/webapp/assets/js/view/editor.js b/src/main/webapp/assets/js/view/editor.js index 4746b33e8..baf534fc4 100644 --- a/src/main/webapp/assets/js/view/editor.js +++ b/src/main/webapp/assets/js/view/editor.js @@ -27,9 +27,28 @@ define([ "handlebars", "bootstrap" ], function (_, $, Backbone, CatalogApplication, jsYaml, CodeMirror, EditorHtml) { - var _DEFAULT_BLUEPRINT = 'name: Empty Software Process\nlocation: localhost\nservices:\n- type: org.apache.brooklyn.entity.software.base.EmptySoftwareProcess'; - var _DEFAULT_CATALOG = 'brooklyn.catalog:\n version: 0.0.1\n items:\n - id: example\n description: This is an example catalog application\n ' + - 'itemType: template\n item:\n name: Empty Software Process\n services:\n - type: org.apache.brooklyn.entity.software.base.EmptySoftwareProcess'; + var _DEFAULT_BLUEPRINT = + 'name: Sample Blueprint\n'+ + 'description: runs `sleep` for sixty seconds then stops triggering ON_FIRE in Brooklyn\n'+ + 'location: localhost\n'+ + 'services:\n'+ + '- type: org.apache.brooklyn.entity.software.base.VanillaSoftwareProcess\n'+ + ' launch.command: |\n'+ + ' echo hello world\n'+ + ' nohup sleep 60 &\n'+ + ' echo $! > ${PID_FILE:-pid.txt}\n'; + var _DEFAULT_CATALOG = + 'brooklyn.catalog:\n'+ + ' version: 0.0.1\n'+ + ' items:\n'+ + ' - id: example\n'+ + ' description: This is an example catalog application\n'+ + ' itemType: template\n'+ + ' item:\n'+ + ' name: Sample Blueprint Template\n'+ + ' services:\n'+ + ' - type: \n'+ + ' location: \n'; var EditorView = Backbone.View.extend({ tagName:"div", @@ -60,14 +79,35 @@ define([ refreshEditor: function() { var cm = this.editor; if (typeof(cm) !== "undefined") { - if(this.options.type && this.options.type === 'catalog'){ - cm.getDoc().setValue(_DEFAULT_CATALOG); - }else{ - //assume blueprint - var item = this.options.catalog.getId(this.options.typeId); - cm.getDoc().setValue((item ? item['attributes']['planYaml'] : _DEFAULT_BLUEPRINT )); + var itemText; + if (this.options.typeId === '_') { + // _ indicates a literal is being supplied + itemText = this.options.content; + } else { + if (this.options.content) { + console.log('ignoring content when typeId is not _; given:', this.options.type, this.options.typeId, this.options.content); + } + if (this.options.typeId) { + var item = this.options.catalog.getId(this.options.typeId); + if (item) itemText = item['attributes']['planYaml']; + if (!itemText) { + itemText = '# unknown type - this is an example blueprint that would reference it\n'+ + 'services:\n- type: '+this.options.typeId+'\n'; + + } + } + } + if (!itemText) { + if (this.options.type === 'catalog') { + itemText = _DEFAULT_CATALOG; + } else { + itemText = _DEFAULT_BLUEPRINT; + } } - cm.focus(); + cm.getDoc().setValue(itemText); + //better not to focus as focussing puts the cursor at the beginning which is odd + //and cmd-shift-[ and tab are intercepted so user can't navigate + // cm.focus(); cm.refresh(); } diff --git a/src/main/webapp/assets/tpl/editor/page.html b/src/main/webapp/assets/tpl/editor/page.html index 44c5d9daf..9a37fe0d1 100644 --- a/src/main/webapp/assets/tpl/editor/page.html +++ b/src/main/webapp/assets/tpl/editor/page.html @@ -36,7 +36,7 @@

YAML Composer

- + From 9d3d9bb3f8346f62028fdad1df43ec60d94e73d8 Mon Sep 17 00:00:00 2001 From: Alex Heneveld Date: Thu, 11 Feb 2016 01:50:58 +0000 Subject: [PATCH 03/10] call buttons "Open in Composer" and "Deploy" rather than "Preview" / "Finish" and the "Open in Composer" button is highlighted if you pick a template --- .../assets/js/view/application-add-wizard.js | 91 ++++++++++--------- .../tpl/app-add-wizard/modal-wizard.html | 4 +- 2 files changed, 50 insertions(+), 45 deletions(-) diff --git a/src/main/webapp/assets/js/view/application-add-wizard.js b/src/main/webapp/assets/js/view/application-add-wizard.js index ffdee6d34..62d4db2e7 100644 --- a/src/main/webapp/assets/js/view/application-add-wizard.js +++ b/src/main/webapp/assets/js/view/application-add-wizard.js @@ -166,12 +166,39 @@ define([ setVisibility(this.$("#prev_step"), (this.currentStep > 0)) + this.isTemplate = false; + { + var yaml = (this.currentView && this.currentView.selectedTemplate && this.currentView.selectedTemplate.yaml); + if (yaml) { + try { + yaml = JsYaml.safeLoad(yaml); + hasLocation = yaml.location || yaml.locations; + if (!hasLocation) { + // look for locations defined in locations + svcs = yaml.services; + if (svcs) { + for (svcI in svcs) { + if (svcs[svcI].location || svcs[svcI].locations) { + hasLocation = true; + break; + } + } + } + } + this.isTemplate = (hasLocation ? true : false); + } catch (e) { + log("Warning: could not parse yaml template of selected item") + log(yaml); + } + } + } + // next shown for first step, but not for yaml - var nextVisible = (this.currentStep < 1) && (this.model.mode != "yaml") + var nextVisible = (this.currentStep < 1) && (this.model.mode != "yaml") && (!this.isTemplate); setVisibility(this.$("#next_step"), nextVisible) - // previous shown for step 2 (but again, not yaml) - var previewVisible = (this.currentStep == 1) && (this.model.mode != "yaml") + // preview (aka "Open in Composer") shown for step 2 or for template (but again, not yaml) + var previewVisible = (((this.currentStep < 1) && this.isTemplate) || (this.currentStep == 1)) && (this.model.mode != "yaml") setVisibility(this.$("#preview_step"), previewVisible) // now set next/preview enablement @@ -266,38 +293,9 @@ define([ nextStep:function () { if (this.currentStep == 0) { if (this.currentView.validate()) { - this.isTemplate = false; - var yaml = (this.currentView && this.currentView.selectedTemplate && this.currentView.selectedTemplate.yaml); - if (yaml) { - try { - yaml = JsYaml.safeLoad(yaml); - hasLocation = yaml.location || yaml.locations; - if (!hasLocation) { - // look for locations defined in locations - svcs = yaml.services; - if (svcs) { - for (svcI in svcs) { - if (svcs[svcI].location || svcs[svcI].locations) { - hasLocation = true; - break; - } - } - } - } - this.isTemplate = (hasLocation ? true : false); - } catch (e) { - log("Warning: could not parse yaml template") - log(yaml); - } - } - if (this.isTemplate) { - // it's a yaml catalog *template* (because it includes a location); go to composer - this.redirectToEditorTabToDeployId(this.currentView.selectedTemplate.id); - } else { - // it's a java catalog template or yaml template without a location, go to wizard - this.currentStep += 1; - this.renderCurrentStep(); - } + // next not visible if it's a template, so go to create (configure) step + this.currentStep += 1; + this.renderCurrentStep(); } else { // the call to validate will have done the showFailure } @@ -307,16 +305,21 @@ define([ }, previewStep:function () { if (this.currentView.validate()) { - var yaml; - if (this.model.mode == "yaml") { - yaml = this.model.yaml; + if (this.isTemplate) { + // it's a yaml catalog *template* (because it includes a location); go to composer + this.redirectToEditorTabToDeployId(this.currentView.selectedTemplate.id); } else { - // Drop any "None" locations. - this.model.spec.pruneLocations(); - yaml = JsYaml.safeDump(oldSpecToCamp(this.model.spec.toJSON())); + var yaml; + if (this.model.mode == "yaml") { + yaml = this.model.yaml; + } else { + // Drop any "None" locations. + this.model.spec.pruneLocations(); + yaml = JsYaml.safeDump(oldSpecToCamp(this.model.spec.toJSON())); + } + + this.redirectToEditorTabToDeployYaml(yaml); } - - this.redirectToEditorTabToDeployYaml(yaml); } else { // call to validate should showFailure } @@ -417,6 +420,7 @@ define([ this.delegateEvents(); return this; }, + // TODO tabs no longer relevant onTabChange: function(e) { var tabText = $(e.target).text(); if (tabText=="Catalog") { @@ -426,6 +430,7 @@ define([ } if (tabText=="YAML") { + // TODO this mode no longer used this.model.mode = "yaml"; } else if (tabText=="Template") { this.model.mode = "template"; diff --git a/src/main/webapp/assets/tpl/app-add-wizard/modal-wizard.html b/src/main/webapp/assets/tpl/app-add-wizard/modal-wizard.html index 183a4ab97..427e10084 100644 --- a/src/main/webapp/assets/tpl/app-add-wizard/modal-wizard.html +++ b/src/main/webapp/assets/tpl/app-add-wizard/modal-wizard.html @@ -30,6 +30,6 @@

Title placeholder

From 9c6c06c94212faaaf1d456a974820941ae08f353 Mon Sep 17 00:00:00 2001 From: Alex Heneveld Date: Thu, 11 Feb 2016 02:09:59 +0000 Subject: [PATCH 04/10] app-add-wizard - remove tabs and a whole lot of code to support that, and allow "Open in Composer" for normal items, not just templates --- .../assets/js/view/application-add-wizard.js | 204 ++++-------------- .../app-add-wizard/create-entity-entry.html | 64 ------ .../assets/tpl/app-add-wizard/create.html | 46 +--- .../tpl/app-add-wizard/modal-wizard.html | 2 +- 4 files changed, 42 insertions(+), 274 deletions(-) delete mode 100644 src/main/webapp/assets/tpl/app-add-wizard/create-entity-entry.html diff --git a/src/main/webapp/assets/js/view/application-add-wizard.js b/src/main/webapp/assets/js/view/application-add-wizard.js index 62d4db2e7..1174c5e79 100644 --- a/src/main/webapp/assets/js/view/application-add-wizard.js +++ b/src/main/webapp/assets/js/view/application-add-wizard.js @@ -16,17 +16,19 @@ * specific language governing permissions and limitations * under the License. */ + /** - * Builds a Twitter Bootstrap modal as the framework for a Wizard. - * Also creates an empty Application model. + * Supplies a modal (wizardy) with a list of apps a user can pick. + * Templates (items with yaml and with a location) go to composer, + * other items (java, or yaml without a location) go to next *or* open in composer. */ + define([ "underscore", "jquery", "backbone", "brooklyn-utils", "js-yaml", "codemirror", "model/entity", "model/application", "model/location", "model/catalog-application", "text!tpl/app-add-wizard/modal-wizard.html", "text!tpl/app-add-wizard/create.html", "text!tpl/app-add-wizard/create-step-template-entry.html", - "text!tpl/app-add-wizard/create-entity-entry.html", "text!tpl/app-add-wizard/required-config-entry.html", "text!tpl/app-add-wizard/edit-config-entry.html", "text!tpl/app-add-wizard/deploy.html", @@ -40,7 +42,7 @@ define([ "codemirror-addon-display-placeholder", "bootstrap" ], function (_, $, Backbone, Util, JsYaml, CodeMirror, Entity, Application, Location, CatalogApplication, - ModalHtml, CreateHtml, CreateStepTemplateEntryHtml, CreateEntityEntryHtml, + ModalHtml, CreateHtml, CreateStepTemplateEntryHtml, RequiredConfigEntryHtml, EditConfigEntryHtml, DeployHtml, DeployVersionOptionHtml, DeployLocationRowHtml, DeployLocationOptionHtml ) { @@ -112,7 +114,6 @@ define([ this.model = {} this.model.spec = new Application.Spec; this.model.yaml = ""; - this.model.mode = "template"; // or "yaml" or "other" this.currentStep = 0; this.steps = [ { @@ -166,7 +167,7 @@ define([ setVisibility(this.$("#prev_step"), (this.currentStep > 0)) - this.isTemplate = false; + var isTemplateWithLocation = false; { var yaml = (this.currentView && this.currentView.selectedTemplate && this.currentView.selectedTemplate.yaml); if (yaml) { @@ -185,7 +186,7 @@ define([ } } } - this.isTemplate = (hasLocation ? true : false); + isTemplateWithLocation = (hasLocation ? true : false); } catch (e) { log("Warning: could not parse yaml template of selected item") log(yaml); @@ -193,41 +194,27 @@ define([ } } - // next shown for first step, but not for yaml - var nextVisible = (this.currentStep < 1) && (this.model.mode != "yaml") && (!this.isTemplate); - setVisibility(this.$("#next_step"), nextVisible) + // preview (aka "Open in Composer") enabled and shown always + setVisibility(this.$("#preview_step"), true); + setEnablement(this.$("#preview_step"), true) - // preview (aka "Open in Composer") shown for step 2 or for template (but again, not yaml) - var previewVisible = (((this.currentStep < 1) && this.isTemplate) || (this.currentStep == 1)) && (this.model.mode != "yaml") - setVisibility(this.$("#preview_step"), previewVisible) + // next shown for first step, but not for templates + var nextVisible = (this.currentStep < 1) && (!this.isTemplate); + setVisibility(this.$("#next_step"), nextVisible); // now set next/preview enablement - if (nextVisible || previewVisible) { - var nextEnabled = true; - if (this.currentStep==0 && this.model.mode=="template" && currentStepObj && currentStepObj.view) { - // disable if this is template selction (lozenge) view, and nothing is selected - if (! currentStepObj.view.selectedTemplate) - nextEnabled = false; - } - - if (nextVisible) - setEnablement(this.$("#next_step"), nextEnabled) - if (previewVisible) - setEnablement(this.$("#preview_step"), nextEnabled) + var nextEnabled = true; + if (this.currentStep==0 && currentStepObj && currentStepObj.view) { + // disable if nothing is selected in template (app lozenge list) view + if (! currentStepObj.view.selectedTemplate) + nextEnabled = false; } + + if (nextVisible) setEnablement(this.$("#next_step"), nextEnabled) - // finish from config step, preview step, and from first step if yaml tab selected (and valid) + // finish ("deploy") is shown on the config step var finishVisible = (this.currentStep >= 1); var finishEnabled = finishVisible; - if (!finishEnabled && this.currentStep==0) { - if (this.model.mode == "yaml") { - // should do better validation than non-empty - finishVisible = true; - if (self.editor && self.editor && self.editor.getValue()) { - finishEnabled = true; - } - } - } setVisibility(this.$("#finish_step"), finishVisible) setEnablement(this.$("#finish_step"), finishEnabled) }, @@ -238,13 +225,9 @@ define([ $modal.fadeTo(500,0.5); var yaml; - if (this.model.mode == "yaml") { - yaml = this.model.yaml; - } else { - // Drop any "None" locations. - this.model.spec.pruneLocations(); - yaml = JsYaml.safeDump(oldSpecToCamp(this.model.spec.toJSON())); - } + // Drop any "None" locations. + this.model.spec.pruneLocations(); + yaml = JsYaml.safeDump(oldSpecToCamp(this.model.spec.toJSON())); $.ajax({ url:'/v1/applications', @@ -304,24 +287,21 @@ define([ } }, previewStep:function () { - if (this.currentView.validate()) { - if (this.isTemplate) { - // it's a yaml catalog *template* (because it includes a location); go to composer + // no need for validation if going to composer + if (this.currentStep==0) { + // from first step, composer should load yaml from the catalog item + if (this.currentView.selectedTemplate && this.currentView.selectedTemplate.id) { this.redirectToEditorTabToDeployId(this.currentView.selectedTemplate.id); } else { - var yaml; - if (this.model.mode == "yaml") { - yaml = this.model.yaml; - } else { - // Drop any "None" locations. - this.model.spec.pruneLocations(); - yaml = JsYaml.safeDump(oldSpecToCamp(this.model.spec.toJSON())); - } - - this.redirectToEditorTabToDeployYaml(yaml); + this.redirectToEditorTabToDeployId(); } } else { - // call to validate should showFailure + // on second step we generate yaml + // Drop any "None" locations. + this.model.spec.pruneLocations(); + var yaml = JsYaml.safeDump(oldSpecToCamp(this.model.spec.toJSON())); + + this.redirectToEditorTabToDeployYaml(yaml); } }, finishStep:function () { @@ -351,19 +331,12 @@ define([ ModalWizard.StepCreate = Backbone.View.extend({ className:'modal-body', events:{ - 'click #add-app-entity':'addEntityBox', - 'click .editable-entity-heading':'expandEntity', - 'click .remove-entity-button':'removeEntityClick', - 'click .editable-entity-button':'saveEntityClick', 'click #remove-config':'removeConfigRow', 'click #add-config':'addConfigRow', 'click .template-lozenge':'templateClick', 'keyup .text-filter input':'applyFilter', 'change .text-filter input':'applyFilter', 'paste .text-filter input':'applyFilter', - 'keyup #yaml_code':'onYamlCodeChange', - 'change #yaml_code':'onYamlCodeChange', - 'paste #yaml_code':'onYamlCodeChange', 'shown a[data-toggle="tab"]':'onTabChange', 'click #templateTab #catalog-add':'switchToCatalogAdd', 'click #templateTab #catalog-yaml':'redirectToEditorTab' @@ -376,15 +349,11 @@ define([ this.$el.html(this.template({})) - // for building from entities - this.addEntityBox() - // TODO: Make into models, allow options to override, then pass in in test // with overrridden url. Can then think about fixing tests in application-add-wizard-spec.js. $.get('/v1/catalog/entities', {}, function (result) { self.catalogEntityItems = result self.catalogEntityIds = _.map(result, function(item) { return item.id }) - self.$(".entity-type-input").typeahead().data('typeahead').source = self.catalogEntityIds }); this.options.catalog.applications = new CatalogApplication.Collection(); @@ -393,7 +362,6 @@ define([ allVersions: true }), success: function (collection, response, options) { - self.$("#appClassTab .application-type-input").typeahead().data('typeahead').source = collection.getTypes(); $('#catalog-applications-throbber').hide(); $('#catalog-applications-empty').hide(); if (collection.size() > 0) { @@ -429,19 +397,6 @@ define([ $("li.text-filter").hide() } - if (tabText=="YAML") { - // TODO this mode no longer used - this.model.mode = "yaml"; - } else if (tabText=="Template") { - this.model.mode = "template"; - } else { - this.model.mode = "other"; - } - - if (this.options.wizard) - this.options.wizard.updateButtonVisibility(); - }, - onYamlCodeChange: function() { if (this.options.wizard) this.options.wizard.updateButtonVisibility(); }, @@ -450,10 +405,6 @@ define([ $modal.modal('hide'); window.location.href="#v1/catalog/new"; }, - showYamlTab: function() { - $("ul#app-add-wizard-create-tab").find("a[href='#yamlTab']").tab('show'); - $("#yaml_code").focus(); - }, redirectToEditorTab: function() { this.redirectToEditorTabToDeployId(); }, @@ -500,11 +451,6 @@ define([ name: $tl.data("name"), yaml: $tl.data("yaml"), }; - if (this.selectedTemplate.yaml) { - $("textarea#yaml_code").val(this.selectedTemplate.yaml); - } else { - $("textarea#yaml_code").val("services:\n- type: "+this.selectedTemplate.type); - } } else { this.selectedTemplate = null; } @@ -512,32 +458,6 @@ define([ if (this.options.wizard) this.options.wizard.updateButtonVisibility(); }, - expandEntity:function (event) { - $(event.currentTarget).next().show('fast').delay(1000).prev().hide('slow') - }, - saveEntityClick:function (event) { - this.saveEntity($(event.currentTarget).closest(".editable-entity-group")); - }, - saveEntity:function ($entityGroup) { - var that = this - var name = $('#entity-name',$entityGroup).val() - var type = $('#entity-type',$entityGroup).val() - if (type=="" || !_.contains(that.catalogEntityIds, type)) { - that.showFailure("Missing or invalid type"); - return false - } - var saveTarget = this.model.spec.get("entities")[$entityGroup.index()]; - this.model.spec.set("type", null) - saveTarget.name = name - saveTarget.type = type - saveTarget.config = this.getConfigMap($entityGroup) - - if (name=="") name=type; - if (name=="") name="(new entity)"; - $('#entity-name-header',$entityGroup).html( name ) - $('.editable-entity-body',$entityGroup).prev().show('fast').next().hide('fast') - return true; - }, getConfigMap:function (root) { var map = {} $('.app-add-wizard-config-entry',root).each( function (index,elt) { @@ -572,22 +492,12 @@ define([ this.model.spec.set("type", type); return true; }, - addEntityBox:function () { - var entity = new Entity.Model - this.model.spec.addEntity( entity ) - this.addEntityHtml($('#entitiesAccordionish', this.$el), entity) - }, addEntityHtml:function (parent, entity) { var $entity = _.template(CreateEntityEntryHtml, {}) var that = this parent.append($entity) parent.children().last().find('.entity-type-input').typeahead({ source: that.catalogEntityIds }) }, - removeEntityClick:function (event) { - var $entityGroup = $(event.currentTarget).parent().parent().parent(); - this.model.spec.removeEntityIndex($entityGroup.index()) - $entityGroup.remove() - }, addConfigRow:function (event) { var $row = _.template(EditConfigEntryHtml, {}) @@ -599,44 +509,10 @@ define([ validate:function () { var that = this; - var tabName = $('#app-add-wizard-create-tab li[class="active"] a').attr('href'); - if (tabName=='#entitiesTab') { - delete this.model.spec.attributes["id"] - var allokay = true - $($.find('.editable-entity-group')).each( - function (i,$entityGroup) { - allokay = that.saveEntity($($entityGroup)) & allokay - }) - if (!allokay) return false; - if (this.model.spec.get("entities") && this.model.spec.get("entities").length > 0) { - this.model.spec.set("type", null); - return true; - } - } else if (tabName=='#templateTab') { - delete this.model.spec.attributes["id"] - if (this.saveTemplate()) { - this.model.spec.set("entities", []); - return true - } - } else if (tabName=='#appClassTab') { - delete this.model.spec.attributes["id"] - if (this.saveAppClass()) { - this.model.spec.set("entities", []); - return true - } - } else if (tabName=='#yamlTab') { - if (self.editor !== null) { - this.model.yaml = self.editor.getValue(); - if (this.model.yaml) { - return true; - } - } else { - console.info("No text in the editor!"); - } - } else { - console.info("NOT IMPLEMENTED YET") - // TODO - other tabs not implemented yet - // do nothing, show error return false below + delete this.model.spec.attributes["id"] + if (this.saveTemplate()) { + this.model.spec.set("entities", []); + return true } this.showFailure("Invalid application type/spec"); return false diff --git a/src/main/webapp/assets/tpl/app-add-wizard/create-entity-entry.html b/src/main/webapp/assets/tpl/app-add-wizard/create-entity-entry.html deleted file mode 100644 index 6f334fd7d..000000000 --- a/src/main/webapp/assets/tpl/app-add-wizard/create-entity-entry.html +++ /dev/null @@ -1,64 +0,0 @@ - - - -
-
- (new entity) -
- -
-
- -
-
- ERROR Invalid entity/type definition -
- -
- - -
-
-
-
Name
- -
-
- -
-
-
Type
- -
-
- -
-
Configuration
-
-
-
- -
-
-
-
diff --git a/src/main/webapp/assets/tpl/app-add-wizard/create.html b/src/main/webapp/assets/tpl/app-add-wizard/create.html index 48a923571..e5e4406d7 100644 --- a/src/main/webapp/assets/tpl/app-add-wizard/create.html +++ b/src/main/webapp/assets/tpl/app-add-wizard/create.html @@ -29,23 +29,6 @@
@@ -64,33 +47,6 @@
- -
-
- -
- -
-
-
Type
-
- -
-
-
- -
-

coming soon! -
-
-

coming soon! -
-
-

coming soon! -
-
-

coming soon! -
- + diff --git a/src/main/webapp/assets/tpl/app-add-wizard/modal-wizard.html b/src/main/webapp/assets/tpl/app-add-wizard/modal-wizard.html index 427e10084..5276ae436 100644 --- a/src/main/webapp/assets/tpl/app-add-wizard/modal-wizard.html +++ b/src/main/webapp/assets/tpl/app-add-wizard/modal-wizard.html @@ -29,7 +29,7 @@

Title placeholder

From f49de1ca782ea158f511d80ba450e5e990e578da Mon Sep 17 00:00:00 2001 From: Alex Heneveld Date: Thu, 11 Feb 2016 02:57:32 +0000 Subject: [PATCH 05/10] use location identifier spec/name, not a random id, in app-add-wizard --- src/main/webapp/assets/js/view/application-add-wizard.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/webapp/assets/js/view/application-add-wizard.js b/src/main/webapp/assets/js/view/application-add-wizard.js index 1174c5e79..1436eeacd 100644 --- a/src/main/webapp/assets/js/view/application-add-wizard.js +++ b/src/main/webapp/assets/js/view/application-add-wizard.js @@ -595,7 +595,7 @@ define([ var $locationOptions = container.find('.select-location'); var templated = this.locations.map(function(aLocation) { return optionTemplate({ - id: aLocation.id || "", + id: aLocation.getIdentifierName() || aLocation.id || "", name: aLocation.getPrettyName() }); }); @@ -647,7 +647,7 @@ define([ }, addLocation:function () { if (this.locations.models.length>0) { - this.model.spec.addLocation(this.locations.models[0].get("id")) + this.model.spec.addLocation(this.locations.models[0].getIdentifierName()) } else { // i.e. No location this.model.spec.addLocation(undefined); @@ -702,7 +702,7 @@ define([ var loc_id = $(event.currentTarget).val(), isNoneLocation = loc_id === NO_LOCATION_INDICATOR; var locationValid = isNoneLocation || this.locations.find(function (candidate) { - return candidate.get("id")==loc_id; + return candidate.getIdentifierName()==loc_id; }); if (!locationValid) { log("invalid location "+loc_id); From 0554b0796f9886d99f50a98ef8246d8e5c8a3e55 Mon Sep 17 00:00:00 2001 From: Alex Heneveld Date: Thu, 11 Feb 2016 03:05:41 +0000 Subject: [PATCH 06/10] can go from catalog item to open in composer --- src/main/webapp/assets/js/view/catalog.js | 6 ++++++ src/main/webapp/assets/tpl/catalog/details-entity.html | 1 + 2 files changed, 7 insertions(+) diff --git a/src/main/webapp/assets/js/view/catalog.js b/src/main/webapp/assets/js/view/catalog.js index eb9effd38..5c3e2ce12 100644 --- a/src/main/webapp/assets/js/view/catalog.js +++ b/src/main/webapp/assets/js/view/catalog.js @@ -43,6 +43,7 @@ define([ var CatalogItemDetailsView = Backbone.View.extend({ events: { + "click .composer": "composeItem", "click .delete": "deleteItem" }, @@ -109,6 +110,11 @@ define([ return this; }, + composeItem: function(event) { + // TODO could make this a catalog item + Backbone.history.navigate("/v1/editor/app/"+ encodeURIComponent($(event.currentTarget).data("name")), + {trigger: true}); + }, deleteItem: function(event) { // Could use wait flag to block removal of model from collection // until server confirms deletion and success handler to perform diff --git a/src/main/webapp/assets/tpl/catalog/details-entity.html b/src/main/webapp/assets/tpl/catalog/details-entity.html index 2e43fe534..02f3fe9a8 100644 --- a/src/main/webapp/assets/tpl/catalog/details-entity.html +++ b/src/main/webapp/assets/tpl/catalog/details-entity.html @@ -20,6 +20,7 @@
+
From 61201998b3b8177d62461e433052c94208adbcac Mon Sep 17 00:00:00 2001 From: Alex Heneveld Date: Thu, 11 Feb 2016 14:09:18 +0000 Subject: [PATCH 07/10] composer is aware whether it is catalog or blueprint mode --- src/main/webapp/assets/js/view/editor.js | 24 ++++++++++++++++++++- src/main/webapp/assets/tpl/editor/page.html | 9 ++++---- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/main/webapp/assets/js/view/editor.js b/src/main/webapp/assets/js/view/editor.js index baf534fc4..fa893fca4 100644 --- a/src/main/webapp/assets/js/view/editor.js +++ b/src/main/webapp/assets/js/view/editor.js @@ -49,6 +49,10 @@ define([ ' services:\n'+ ' - type: \n'+ ' location: \n'; + + // is the user working on an app blueprint or a catalog item + var MODE_APP = "app"; + var MODE_CATALOG = "catalog"; var EditorView = Backbone.View.extend({ tagName:"div", @@ -63,6 +67,14 @@ define([ initialize:function () { var vm = this; + if (!this.options.type || this.options.type === MODE_APP) { + this.setMode(MODE_APP); + } else if (this.options.type === MODE_CATALOG) { + this.setMode(MODE_CATALOG); + } else { + console.log("unknown mode '"+this.option.type+"'; using '"+MODE_APP+"'"); + this.setMode(MODE_APP); + } this.options.catalog = new CatalogApplication.Collection(); this.options.catalog.fetch({ data: $.param({allVersions: true}), @@ -71,11 +83,21 @@ define([ } }); }, + setMode: function(mode) { + if (this.mode === mode) return; + this.mode = mode; + this.refresh(); + }, render:function (eventName) { this.$el.html(_.template(EditorHtml, {})); this.loadEditor(); + this.refresh(); return this; }, + refresh: function() { + $("#button-run", this.$el).html(this.mode==MODE_CATALOG ? "Add to Catalog" : "Deploy"); + $("#button-delete", this.$el).html("Clear"); + }, refreshEditor: function() { var cm = this.editor; if (typeof(cm) !== "undefined") { @@ -138,7 +160,7 @@ define([ }, runBlueprint: function() { if (this.validate()){ - if(this.editor.getValue().slice(0,16) === 'brooklyn.catalog'){ + if (this.mode === MODE_CATALOG) { this.submitCatalog(); }else{ this.submitApplication(); diff --git a/src/main/webapp/assets/tpl/editor/page.html b/src/main/webapp/assets/tpl/editor/page.html index 9a37fe0d1..727b4d412 100644 --- a/src/main/webapp/assets/tpl/editor/page.html +++ b/src/main/webapp/assets/tpl/editor/page.html @@ -20,10 +20,11 @@
diff --git a/src/main/webapp/index.html b/src/main/webapp/index.html index 40ffd044c..3570ca9e6 100644 --- a/src/main/webapp/index.html +++ b/src/main/webapp/index.html @@ -27,6 +27,7 @@ Brooklyn JS REST client + From 438132fcf49e7c97fafc6c334cfcdbe00a40cea7 Mon Sep 17 00:00:00 2001 From: Alex Heneveld Date: Thu, 11 Feb 2016 18:03:26 +0000 Subject: [PATCH 10/10] minor bug fixes --- .../assets/js/view/application-add-wizard.js | 41 ++++++++++--------- src/main/webapp/assets/js/view/editor.js | 3 -- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/src/main/webapp/assets/js/view/application-add-wizard.js b/src/main/webapp/assets/js/view/application-add-wizard.js index 1436eeacd..f57023a84 100644 --- a/src/main/webapp/assets/js/view/application-add-wizard.js +++ b/src/main/webapp/assets/js/view/application-add-wizard.js @@ -97,6 +97,20 @@ define([ return value; } } + + function redirectToEditorTabToDeployId(catalogId){ + redirectTo("/v1/editor/app/"+ (typeof catalogId === 'string' ? catalogId : '')); + } + function redirectToEditorTabToDeployYaml(yaml){ + redirectTo("/v1/editor/app/_/"+encodeURIComponent(yaml)); + } + function redirectTo(url){ + var $modal = $('.add-app #modal-container .modal'); + $modal.modal('hide'); + $modal.fadeTo(500,1); + Backbone.history.navigate(url, {trigger: true}); + } + var ModalWizard = Backbone.View.extend({ tagName:'div', @@ -206,7 +220,8 @@ define([ var nextEnabled = true; if (this.currentStep==0 && currentStepObj && currentStepObj.view) { // disable if nothing is selected in template (app lozenge list) view - if (! currentStepObj.view.selectedTemplate) + // or if it is a template with a location + if (!currentStepObj.view.selectedTemplate || isTemplateWithLocation) nextEnabled = false; } @@ -291,9 +306,9 @@ define([ if (this.currentStep==0) { // from first step, composer should load yaml from the catalog item if (this.currentView.selectedTemplate && this.currentView.selectedTemplate.id) { - this.redirectToEditorTabToDeployId(this.currentView.selectedTemplate.id); + redirectToEditorTabToDeployId(this.currentView.selectedTemplate.id); } else { - this.redirectToEditorTabToDeployId(); + redirectToEditorTabToDeployId(); } } else { // on second step we generate yaml @@ -301,7 +316,7 @@ define([ this.model.spec.pruneLocations(); var yaml = JsYaml.safeDump(oldSpecToCamp(this.model.spec.toJSON())); - this.redirectToEditorTabToDeployYaml(yaml); + redirectToEditorTabToDeployYaml(yaml); } }, finishStep:function () { @@ -311,19 +326,6 @@ define([ // call to validate should showFailure } }, - - redirectToEditorTabToDeployId: function(catalogId){ - this.redirectTo("/v1/editor/app/"+ (typeof catalogId === 'string' ? catalogId : '')); - }, - redirectToEditorTabToDeployYaml: function(yaml){ - this.redirectTo("/v1/editor/app/_/"+encodeURIComponent(yaml)); - }, - redirectTo: function(url){ - var $modal = $('.add-app #modal-container .modal'); - $modal.modal('hide'); - $modal.fadeTo(500,1); - Backbone.history.navigate(url, {trigger: true}); - }, }) // Note: this does not restore values on a back click; setting type and entity type+name is easy, @@ -368,7 +370,6 @@ define([ self.addTemplateLozenges(); } else { $('#catalog-applications-empty').show(); - self.showYamlTab(); } } }); @@ -405,8 +406,8 @@ define([ $modal.modal('hide'); window.location.href="#v1/catalog/new"; }, - redirectToEditorTab: function() { - this.redirectToEditorTabToDeployId(); + redirectToEditorTab: function () { + redirectToEditorTabToDeployId(); }, applyFilter: function(e) { var filter = $(e.currentTarget).val().toLowerCase() diff --git a/src/main/webapp/assets/js/view/editor.js b/src/main/webapp/assets/js/view/editor.js index f9ce5b6dd..d8670801c 100644 --- a/src/main/webapp/assets/js/view/editor.js +++ b/src/main/webapp/assets/js/view/editor.js @@ -179,7 +179,6 @@ define([ }); var that = this; this.editor.on("changes", function(editor, changes) { - console.log("editor changed", editor, changes); that.refreshOnMinorChange(); }); } @@ -209,7 +208,6 @@ define([ var yaml = this.editor.getValue(); try{ var parsed = this.parse(true); - console.log('parse', parsed); if (parsed.problem) throw parsed.problem; if (this.mode!=MODE_CATALOG && parsed.result['brooklyn.catalog'] && !parsed.result['services']) { @@ -233,7 +231,6 @@ define([ " iconUrl: http://www.apache.org/foundation/press/kit/poweredBy/Apache_PoweredBy.png\n"+ " itemType: template\n"+ " item:\n"+ - " - \n"+ // indent 6 spaces: this.editor.getValue().replace(/^(.*$)/gm,' $1'); this.mode = MODE_CATALOG;