Dashboard sipadu mbip
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

FlowCollection.js 5.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _constants = require("../constants");
  7. var _errors = require("../errors");
  8. var _BlankLine = _interopRequireDefault(require("./BlankLine"));
  9. var _Comment = _interopRequireDefault(require("./Comment"));
  10. var _Node = _interopRequireDefault(require("./Node"));
  11. var _Range = _interopRequireDefault(require("./Range"));
  12. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  13. class FlowCollection extends _Node.default {
  14. constructor(type, props) {
  15. super(type, props);
  16. this.items = null;
  17. }
  18. prevNodeIsJsonLike(idx = this.items.length) {
  19. const node = this.items[idx - 1];
  20. return !!node && (node.jsonLike || node.type === _constants.Type.COMMENT && this.nodeIsJsonLike(idx - 1));
  21. }
  22. /**
  23. * @param {ParseContext} context
  24. * @param {number} start - Index of first character
  25. * @returns {number} - Index of the character after this
  26. */
  27. parse(context, start) {
  28. this.context = context;
  29. const {
  30. parseNode,
  31. src
  32. } = context;
  33. let {
  34. indent,
  35. lineStart
  36. } = context;
  37. let char = src[start]; // { or [
  38. this.items = [{
  39. char,
  40. offset: start
  41. }];
  42. let offset = _Node.default.endOfWhiteSpace(src, start + 1);
  43. char = src[offset];
  44. while (char && char !== ']' && char !== '}') {
  45. switch (char) {
  46. case '\n':
  47. {
  48. lineStart = offset + 1;
  49. const wsEnd = _Node.default.endOfWhiteSpace(src, lineStart);
  50. if (src[wsEnd] === '\n') {
  51. const blankLine = new _BlankLine.default();
  52. lineStart = blankLine.parse({
  53. src
  54. }, lineStart);
  55. this.items.push(blankLine);
  56. }
  57. offset = _Node.default.endOfIndent(src, lineStart);
  58. if (offset <= lineStart + indent) {
  59. char = src[offset];
  60. if (offset < lineStart + indent || char !== ']' && char !== '}') {
  61. const msg = 'Insufficient indentation in flow collection';
  62. this.error = new _errors.YAMLSemanticError(this, msg);
  63. }
  64. }
  65. }
  66. break;
  67. case ',':
  68. {
  69. this.items.push({
  70. char,
  71. offset
  72. });
  73. offset += 1;
  74. }
  75. break;
  76. case '#':
  77. {
  78. const comment = new _Comment.default();
  79. offset = comment.parse({
  80. src
  81. }, offset);
  82. this.items.push(comment);
  83. }
  84. break;
  85. case '?':
  86. case ':':
  87. {
  88. const next = src[offset + 1];
  89. if (next === '\n' || next === '\t' || next === ' ' || next === ',' || // in-flow : after JSON-like key does not need to be followed by whitespace
  90. char === ':' && this.prevNodeIsJsonLike()) {
  91. this.items.push({
  92. char,
  93. offset
  94. });
  95. offset += 1;
  96. break;
  97. }
  98. }
  99. // fallthrough
  100. default:
  101. {
  102. const node = parseNode({
  103. atLineStart: false,
  104. inCollection: false,
  105. inFlow: true,
  106. indent: -1,
  107. lineStart,
  108. parent: this
  109. }, offset);
  110. if (!node) {
  111. // at next document start
  112. this.valueRange = new _Range.default(start, offset);
  113. return offset;
  114. }
  115. this.items.push(node);
  116. offset = _Node.default.normalizeOffset(src, node.range.end);
  117. }
  118. }
  119. offset = _Node.default.endOfWhiteSpace(src, offset);
  120. char = src[offset];
  121. }
  122. this.valueRange = new _Range.default(start, offset + 1);
  123. if (char) {
  124. this.items.push({
  125. char,
  126. offset
  127. });
  128. offset = _Node.default.endOfWhiteSpace(src, offset + 1);
  129. offset = this.parseComment(offset);
  130. }
  131. return offset;
  132. }
  133. setOrigRanges(cr, offset) {
  134. offset = super.setOrigRanges(cr, offset);
  135. this.items.forEach(node => {
  136. if (node instanceof _Node.default) {
  137. offset = node.setOrigRanges(cr, offset);
  138. } else if (cr.length === 0) {
  139. node.origOffset = node.offset;
  140. } else {
  141. let i = offset;
  142. while (i < cr.length) {
  143. if (cr[i] > node.offset) break;else ++i;
  144. }
  145. node.origOffset = node.offset + i;
  146. offset = i;
  147. }
  148. });
  149. return offset;
  150. }
  151. toString() {
  152. const {
  153. context: {
  154. src
  155. },
  156. items,
  157. range,
  158. value
  159. } = this;
  160. if (value != null) return value;
  161. const nodes = items.filter(item => item instanceof _Node.default);
  162. let str = '';
  163. let prevEnd = range.start;
  164. nodes.forEach(node => {
  165. const prefix = src.slice(prevEnd, node.range.start);
  166. prevEnd = node.range.end;
  167. str += prefix + String(node);
  168. if (str[str.length - 1] === '\n' && src[prevEnd - 1] !== '\n' && src[prevEnd] === '\n') {
  169. // Comment range does not include the terminal newline, but its
  170. // stringified value does. Without this fix, newlines at comment ends
  171. // get duplicated.
  172. prevEnd += 1;
  173. }
  174. });
  175. str += src.slice(prevEnd, range.end);
  176. return _Node.default.addStringTerminator(src, range.end, str);
  177. }
  178. }
  179. exports.default = FlowCollection;