yaml 1.8.3 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/README.md +4 -4
  2. package/browser/dist/PlainValue-ff5147c6.js +1277 -0
  3. package/browser/dist/Schema-2bf2c74e.js +679 -0
  4. package/browser/dist/index.js +923 -38
  5. package/browser/dist/legacy-exports.js +3 -0
  6. package/browser/dist/parse-cst.js +1904 -0
  7. package/browser/dist/resolveSeq-04825f30.js +2373 -0
  8. package/browser/dist/types.js +4 -0
  9. package/browser/dist/util.js +2 -0
  10. package/browser/dist/warnings-0e4b70d3.js +499 -0
  11. package/browser/index.js +1 -1
  12. package/browser/map.js +2 -2
  13. package/browser/pair.js +2 -2
  14. package/browser/parse-cst.js +1 -1
  15. package/browser/scalar.js +2 -2
  16. package/browser/schema.js +8 -6
  17. package/browser/seq.js +2 -2
  18. package/browser/types/binary.js +3 -2
  19. package/browser/types/omap.js +3 -2
  20. package/browser/types/pairs.js +3 -2
  21. package/browser/types/set.js +3 -2
  22. package/browser/types/timestamp.js +6 -6
  23. package/browser/types.js +1 -11
  24. package/browser/util.js +1 -15
  25. package/dist/Document-2cf6b08c.js +757 -0
  26. package/dist/PlainValue-ec8e588e.js +876 -0
  27. package/dist/Schema-42e9705c.js +522 -0
  28. package/dist/index.js +21 -43
  29. package/dist/legacy-exports.js +16 -0
  30. package/dist/parse-cst.js +1747 -0
  31. package/dist/resolveSeq-4a68b39b.js +2115 -0
  32. package/dist/test-events.js +11 -14
  33. package/dist/types.js +23 -0
  34. package/dist/util.js +19 -0
  35. package/dist/warnings-39684f17.js +416 -0
  36. package/index.d.ts +372 -0
  37. package/index.js +1 -1
  38. package/map.js +2 -2
  39. package/package.json +32 -45
  40. package/pair.js +2 -2
  41. package/parse-cst.d.ts +187 -0
  42. package/parse-cst.js +1 -1
  43. package/scalar.js +2 -2
  44. package/schema.js +8 -6
  45. package/seq.js +2 -2
  46. package/types/binary.js +3 -2
  47. package/types/omap.js +3 -2
  48. package/types/pairs.js +3 -2
  49. package/types/set.js +3 -2
  50. package/types/timestamp.js +6 -6
  51. package/types.d.ts +407 -0
  52. package/types.js +16 -10
  53. package/types.mjs +15 -18
  54. package/util.d.ts +86 -0
  55. package/util.js +14 -13
  56. package/util.mjs +13 -19
  57. package/browser/dist/Anchors.js +0 -133
  58. package/browser/dist/Document.js +0 -819
  59. package/browser/dist/addComment.js +0 -8
  60. package/browser/dist/constants.js +0 -26
  61. package/browser/dist/cst/Alias.js +0 -42
  62. package/browser/dist/cst/BlankLine.js +0 -56
  63. package/browser/dist/cst/BlockValue.js +0 -247
  64. package/browser/dist/cst/Collection.js +0 -274
  65. package/browser/dist/cst/CollectionItem.js +0 -136
  66. package/browser/dist/cst/Comment.js +0 -40
  67. package/browser/dist/cst/Directive.js +0 -72
  68. package/browser/dist/cst/Document.js +0 -282
  69. package/browser/dist/cst/FlowCollection.js +0 -216
  70. package/browser/dist/cst/Node.js +0 -388
  71. package/browser/dist/cst/ParseContext.js +0 -248
  72. package/browser/dist/cst/PlainValue.js +0 -166
  73. package/browser/dist/cst/QuoteDouble.js +0 -241
  74. package/browser/dist/cst/QuoteSingle.js +0 -116
  75. package/browser/dist/cst/Range.js +0 -67
  76. package/browser/dist/cst/parse.js +0 -48
  77. package/browser/dist/cst/source-utils.js +0 -168
  78. package/browser/dist/errors.js +0 -112
  79. package/browser/dist/foldFlowLines.js +0 -138
  80. package/browser/dist/listTagNames.js +0 -28
  81. package/browser/dist/schema/Alias.js +0 -139
  82. package/browser/dist/schema/Collection.js +0 -267
  83. package/browser/dist/schema/Map.js +0 -178
  84. package/browser/dist/schema/Merge.js +0 -127
  85. package/browser/dist/schema/Node.js +0 -7
  86. package/browser/dist/schema/Pair.js +0 -171
  87. package/browser/dist/schema/Scalar.js +0 -38
  88. package/browser/dist/schema/Seq.js +0 -114
  89. package/browser/dist/schema/index.js +0 -382
  90. package/browser/dist/schema/parseMap.js +0 -312
  91. package/browser/dist/schema/parseSeq.js +0 -168
  92. package/browser/dist/schema/parseUtils.js +0 -110
  93. package/browser/dist/stringify.js +0 -331
  94. package/browser/dist/tags/core.js +0 -126
  95. package/browser/dist/tags/failsafe/index.js +0 -4
  96. package/browser/dist/tags/failsafe/map.js +0 -56
  97. package/browser/dist/tags/failsafe/seq.js +0 -43
  98. package/browser/dist/tags/failsafe/string.js +0 -28
  99. package/browser/dist/tags/index.js +0 -36
  100. package/browser/dist/tags/json.js +0 -76
  101. package/browser/dist/tags/options.js +0 -23
  102. package/browser/dist/tags/yaml-1.1/binary.js +0 -87
  103. package/browser/dist/tags/yaml-1.1/index.js +0 -157
  104. package/browser/dist/tags/yaml-1.1/omap.js +0 -142
  105. package/browser/dist/tags/yaml-1.1/pairs.js +0 -81
  106. package/browser/dist/tags/yaml-1.1/set.js +0 -114
  107. package/browser/dist/tags/yaml-1.1/timestamp.js +0 -97
  108. package/browser/dist/test-events.js +0 -163
  109. package/browser/dist/toJSON.js +0 -20
  110. package/browser/dist/warnings.js +0 -28
  111. package/dist/Anchors.js +0 -125
  112. package/dist/Document.js +0 -710
  113. package/dist/addComment.js +0 -17
  114. package/dist/constants.js +0 -34
  115. package/dist/cst/Alias.js +0 -38
  116. package/dist/cst/BlankLine.js +0 -56
  117. package/dist/cst/BlockValue.js +0 -248
  118. package/dist/cst/Collection.js +0 -271
  119. package/dist/cst/CollectionItem.js +0 -140
  120. package/dist/cst/Comment.js +0 -38
  121. package/dist/cst/Directive.js +0 -64
  122. package/dist/cst/Document.js +0 -281
  123. package/dist/cst/FlowCollection.js +0 -218
  124. package/dist/cst/Node.js +0 -365
  125. package/dist/cst/ParseContext.js +0 -258
  126. package/dist/cst/PlainValue.js +0 -161
  127. package/dist/cst/QuoteDouble.js +0 -237
  128. package/dist/cst/QuoteSingle.js +0 -113
  129. package/dist/cst/Range.js +0 -63
  130. package/dist/cst/parse.js +0 -55
  131. package/dist/cst/source-utils.js +0 -178
  132. package/dist/errors.js +0 -102
  133. package/dist/foldFlowLines.js +0 -146
  134. package/dist/listTagNames.js +0 -38
  135. package/dist/schema/Alias.js +0 -110
  136. package/dist/schema/Collection.js +0 -188
  137. package/dist/schema/Map.js +0 -103
  138. package/dist/schema/Merge.js +0 -80
  139. package/dist/schema/Node.js +0 -10
  140. package/dist/schema/Pair.js +0 -161
  141. package/dist/schema/Scalar.js +0 -31
  142. package/dist/schema/Seq.js +0 -78
  143. package/dist/schema/index.js +0 -315
  144. package/dist/schema/parseMap.js +0 -343
  145. package/dist/schema/parseSeq.js +0 -180
  146. package/dist/schema/parseUtils.js +0 -104
  147. package/dist/stringify.js +0 -358
  148. package/dist/tags/core.js +0 -114
  149. package/dist/tags/failsafe/index.js +0 -17
  150. package/dist/tags/failsafe/map.js +0 -37
  151. package/dist/tags/failsafe/seq.js +0 -34
  152. package/dist/tags/failsafe/string.js +0 -40
  153. package/dist/tags/index.js +0 -62
  154. package/dist/tags/json.js +0 -60
  155. package/dist/tags/options.js +0 -35
  156. package/dist/tags/yaml-1.1/binary.js +0 -97
  157. package/dist/tags/yaml-1.1/index.js +0 -131
  158. package/dist/tags/yaml-1.1/omap.js +0 -105
  159. package/dist/tags/yaml-1.1/pairs.js +0 -80
  160. package/dist/tags/yaml-1.1/set.js +0 -91
  161. package/dist/tags/yaml-1.1/timestamp.js +0 -93
  162. package/dist/toJSON.js +0 -23
  163. package/dist/warnings.js +0 -39
@@ -1,258 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _constants = require("../constants");
9
-
10
- var _errors = require("../errors");
11
-
12
- var _Alias = _interopRequireDefault(require("./Alias"));
13
-
14
- var _BlockValue = _interopRequireDefault(require("./BlockValue"));
15
-
16
- var _Collection = _interopRequireDefault(require("./Collection"));
17
-
18
- var _CollectionItem = _interopRequireDefault(require("./CollectionItem"));
19
-
20
- var _FlowCollection = _interopRequireDefault(require("./FlowCollection"));
21
-
22
- var _Node = _interopRequireDefault(require("./Node"));
23
-
24
- var _PlainValue = _interopRequireDefault(require("./PlainValue"));
25
-
26
- var _QuoteDouble = _interopRequireDefault(require("./QuoteDouble"));
27
-
28
- var _QuoteSingle = _interopRequireDefault(require("./QuoteSingle"));
29
-
30
- var _Range = _interopRequireDefault(require("./Range"));
31
-
32
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
33
-
34
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
35
-
36
- function createNewNode(type, props) {
37
- switch (type) {
38
- case _constants.Type.ALIAS:
39
- return new _Alias.default(type, props);
40
-
41
- case _constants.Type.BLOCK_FOLDED:
42
- case _constants.Type.BLOCK_LITERAL:
43
- return new _BlockValue.default(type, props);
44
-
45
- case _constants.Type.FLOW_MAP:
46
- case _constants.Type.FLOW_SEQ:
47
- return new _FlowCollection.default(type, props);
48
-
49
- case _constants.Type.MAP_KEY:
50
- case _constants.Type.MAP_VALUE:
51
- case _constants.Type.SEQ_ITEM:
52
- return new _CollectionItem.default(type, props);
53
-
54
- case _constants.Type.COMMENT:
55
- case _constants.Type.PLAIN:
56
- return new _PlainValue.default(type, props);
57
-
58
- case _constants.Type.QUOTE_DOUBLE:
59
- return new _QuoteDouble.default(type, props);
60
-
61
- case _constants.Type.QUOTE_SINGLE:
62
- return new _QuoteSingle.default(type, props);
63
-
64
- /* istanbul ignore next */
65
-
66
- default:
67
- return null;
68
- // should never happen
69
- }
70
- }
71
- /**
72
- * @param {boolean} atLineStart - Node starts at beginning of line
73
- * @param {boolean} inFlow - true if currently in a flow context
74
- * @param {boolean} inCollection - true if currently in a collection context
75
- * @param {number} indent - Current level of indentation
76
- * @param {number} lineStart - Start of the current line
77
- * @param {Node} parent - The parent of the node
78
- * @param {string} src - Source of the YAML document
79
- */
80
-
81
-
82
- class ParseContext {
83
- static parseType(src, offset, inFlow) {
84
- switch (src[offset]) {
85
- case '*':
86
- return _constants.Type.ALIAS;
87
-
88
- case '>':
89
- return _constants.Type.BLOCK_FOLDED;
90
-
91
- case '|':
92
- return _constants.Type.BLOCK_LITERAL;
93
-
94
- case '{':
95
- return _constants.Type.FLOW_MAP;
96
-
97
- case '[':
98
- return _constants.Type.FLOW_SEQ;
99
-
100
- case '?':
101
- return !inFlow && _Node.default.atBlank(src, offset + 1, true) ? _constants.Type.MAP_KEY : _constants.Type.PLAIN;
102
-
103
- case ':':
104
- return !inFlow && _Node.default.atBlank(src, offset + 1, true) ? _constants.Type.MAP_VALUE : _constants.Type.PLAIN;
105
-
106
- case '-':
107
- return !inFlow && _Node.default.atBlank(src, offset + 1, true) ? _constants.Type.SEQ_ITEM : _constants.Type.PLAIN;
108
-
109
- case '"':
110
- return _constants.Type.QUOTE_DOUBLE;
111
-
112
- case "'":
113
- return _constants.Type.QUOTE_SINGLE;
114
-
115
- default:
116
- return _constants.Type.PLAIN;
117
- }
118
- }
119
-
120
- constructor(orig = {}, {
121
- atLineStart,
122
- inCollection,
123
- inFlow,
124
- indent,
125
- lineStart,
126
- parent
127
- } = {}) {
128
- _defineProperty(this, "parseNode", (overlay, start) => {
129
- if (_Node.default.atDocumentBoundary(this.src, start)) return null;
130
- const context = new ParseContext(this, overlay);
131
- const {
132
- props,
133
- type,
134
- valueStart
135
- } = context.parseProps(start);
136
- const node = createNewNode(type, props);
137
- let offset = node.parse(context, valueStart);
138
- node.range = new _Range.default(start, offset);
139
- /* istanbul ignore if */
140
-
141
- if (offset <= start) {
142
- // This should never happen, but if it does, let's make sure to at least
143
- // step one character forward to avoid a busy loop.
144
- node.error = new Error(`Node#parse consumed no characters`);
145
- node.error.parseEnd = offset;
146
- node.error.source = node;
147
- node.range.end = start + 1;
148
- }
149
-
150
- if (context.nodeStartsCollection(node)) {
151
- if (!node.error && !context.atLineStart && context.parent.type === _constants.Type.DOCUMENT) {
152
- node.error = new _errors.YAMLSyntaxError(node, 'Block collection must not have preceding content here (e.g. directives-end indicator)');
153
- }
154
-
155
- const collection = new _Collection.default(node);
156
- offset = collection.parse(new ParseContext(context), offset);
157
- collection.range = new _Range.default(start, offset);
158
- return collection;
159
- }
160
-
161
- return node;
162
- });
163
-
164
- this.atLineStart = atLineStart != null ? atLineStart : orig.atLineStart || false;
165
- this.inCollection = inCollection != null ? inCollection : orig.inCollection || false;
166
- this.inFlow = inFlow != null ? inFlow : orig.inFlow || false;
167
- this.indent = indent != null ? indent : orig.indent;
168
- this.lineStart = lineStart != null ? lineStart : orig.lineStart;
169
- this.parent = parent != null ? parent : orig.parent || {};
170
- this.root = orig.root;
171
- this.src = orig.src;
172
- }
173
-
174
- nodeStartsCollection(node) {
175
- const {
176
- inCollection,
177
- inFlow,
178
- src
179
- } = this;
180
- if (inCollection || inFlow) return false;
181
- if (node instanceof _CollectionItem.default) return true; // check for implicit key
182
-
183
- let offset = node.range.end;
184
- if (src[offset] === '\n' || src[offset - 1] === '\n') return false;
185
- offset = _Node.default.endOfWhiteSpace(src, offset);
186
- return src[offset] === ':';
187
- } // Anchor and tag are before type, which determines the node implementation
188
- // class; hence this intermediate step.
189
-
190
-
191
- parseProps(offset) {
192
- const {
193
- inFlow,
194
- parent,
195
- src
196
- } = this;
197
- const props = [];
198
- let lineHasProps = false;
199
- offset = _Node.default.endOfWhiteSpace(src, offset);
200
- let ch = src[offset];
201
-
202
- while (ch === _constants.Char.ANCHOR || ch === _constants.Char.COMMENT || ch === _constants.Char.TAG || ch === '\n') {
203
- if (ch === '\n') {
204
- const lineStart = offset + 1;
205
-
206
- const inEnd = _Node.default.endOfIndent(src, lineStart);
207
-
208
- const indentDiff = inEnd - (lineStart + this.indent);
209
- const noIndicatorAsIndent = parent.type === _constants.Type.SEQ_ITEM && parent.context.atLineStart;
210
- if (!_Node.default.nextNodeIsIndented(src[inEnd], indentDiff, !noIndicatorAsIndent)) break;
211
- this.atLineStart = true;
212
- this.lineStart = lineStart;
213
- lineHasProps = false;
214
- offset = inEnd;
215
- } else if (ch === _constants.Char.COMMENT) {
216
- const end = _Node.default.endOfLine(src, offset + 1);
217
-
218
- props.push(new _Range.default(offset, end));
219
- offset = end;
220
- } else {
221
- let end = _Node.default.endOfIdentifier(src, offset + 1);
222
-
223
- if (ch === _constants.Char.TAG && src[end] === ',' && /^[a-zA-Z0-9-]+\.[a-zA-Z0-9-]+,\d\d\d\d(-\d\d){0,2}\/\S/.test(src.slice(offset + 1, end + 13))) {
224
- // Let's presume we're dealing with a YAML 1.0 domain tag here, rather
225
- // than an empty but 'foo.bar' private-tagged node in a flow collection
226
- // followed without whitespace by a plain string starting with a year
227
- // or date divided by something.
228
- end = _Node.default.endOfIdentifier(src, end + 5);
229
- }
230
-
231
- props.push(new _Range.default(offset, end));
232
- lineHasProps = true;
233
- offset = _Node.default.endOfWhiteSpace(src, end);
234
- }
235
-
236
- ch = src[offset];
237
- } // '- &a : b' has an anchor on an empty node
238
-
239
-
240
- if (lineHasProps && ch === ':' && _Node.default.atBlank(src, offset + 1, true)) offset -= 1;
241
- const type = ParseContext.parseType(src, offset, inFlow);
242
- return {
243
- props,
244
- type,
245
- valueStart: offset
246
- };
247
- }
248
- /**
249
- * Parses a node from the source
250
- * @param {ParseContext} overlay
251
- * @param {number} start - Index of first non-whitespace character for the node
252
- * @returns {?Node} - null if at a document boundary
253
- */
254
-
255
-
256
- }
257
-
258
- exports.default = ParseContext;
@@ -1,161 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _Node = _interopRequireDefault(require("./Node"));
9
-
10
- var _Range = _interopRequireDefault(require("./Range"));
11
-
12
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
-
14
- class PlainValue extends _Node.default {
15
- static endOfLine(src, start, inFlow) {
16
- let ch = src[start];
17
- let offset = start;
18
-
19
- while (ch && ch !== '\n') {
20
- if (inFlow && (ch === '[' || ch === ']' || ch === '{' || ch === '}' || ch === ',')) break;
21
- const next = src[offset + 1];
22
- if (ch === ':' && (!next || next === '\n' || next === '\t' || next === ' ' || inFlow && next === ',')) break;
23
- if ((ch === ' ' || ch === '\t') && next === '#') break;
24
- offset += 1;
25
- ch = next;
26
- }
27
-
28
- return offset;
29
- }
30
-
31
- get strValue() {
32
- if (!this.valueRange || !this.context) return null;
33
- let {
34
- start,
35
- end
36
- } = this.valueRange;
37
- const {
38
- src
39
- } = this.context;
40
- let ch = src[end - 1];
41
-
42
- while (start < end && (ch === '\n' || ch === '\t' || ch === ' ')) ch = src[--end - 1];
43
-
44
- ch = src[start];
45
-
46
- while (start < end && (ch === '\n' || ch === '\t' || ch === ' ')) ch = src[++start];
47
-
48
- let str = '';
49
-
50
- for (let i = start; i < end; ++i) {
51
- const ch = src[i];
52
-
53
- if (ch === '\n') {
54
- const {
55
- fold,
56
- offset
57
- } = _Node.default.foldNewline(src, i, -1);
58
-
59
- str += fold;
60
- i = offset;
61
- } else if (ch === ' ' || ch === '\t') {
62
- // trim trailing whitespace
63
- const wsStart = i;
64
- let next = src[i + 1];
65
-
66
- while (i < end && (next === ' ' || next === '\t')) {
67
- i += 1;
68
- next = src[i + 1];
69
- }
70
-
71
- if (next !== '\n') str += i > wsStart ? src.slice(wsStart, i + 1) : ch;
72
- } else {
73
- str += ch;
74
- }
75
- }
76
-
77
- return str;
78
- }
79
-
80
- parseBlockValue(start) {
81
- const {
82
- indent,
83
- inFlow,
84
- src
85
- } = this.context;
86
- let offset = start;
87
- let valueEnd = start;
88
-
89
- for (let ch = src[offset]; ch === '\n'; ch = src[offset]) {
90
- if (_Node.default.atDocumentBoundary(src, offset + 1)) break;
91
-
92
- const end = _Node.default.endOfBlockIndent(src, indent, offset + 1);
93
-
94
- if (end === null || src[end] === '#') break;
95
-
96
- if (src[end] === '\n') {
97
- offset = end;
98
- } else {
99
- valueEnd = PlainValue.endOfLine(src, end, inFlow);
100
- offset = valueEnd;
101
- }
102
- }
103
-
104
- if (this.valueRange.isEmpty()) this.valueRange.start = start;
105
- this.valueRange.end = valueEnd;
106
- return valueEnd;
107
- }
108
- /**
109
- * Parses a plain value from the source
110
- *
111
- * Accepted forms are:
112
- * ```
113
- * #comment
114
- *
115
- * first line
116
- *
117
- * first line #comment
118
- *
119
- * first line
120
- * block
121
- * lines
122
- *
123
- * #comment
124
- * block
125
- * lines
126
- * ```
127
- * where block lines are empty or have an indent level greater than `indent`.
128
- *
129
- * @param {ParseContext} context
130
- * @param {number} start - Index of first character
131
- * @returns {number} - Index of the character after this scalar, may be `\n`
132
- */
133
-
134
-
135
- parse(context, start) {
136
- this.context = context;
137
- const {
138
- inFlow,
139
- src
140
- } = context;
141
- let offset = start;
142
- const ch = src[offset];
143
-
144
- if (ch && ch !== '#' && ch !== '\n') {
145
- offset = PlainValue.endOfLine(src, start, inFlow);
146
- }
147
-
148
- this.valueRange = new _Range.default(start, offset);
149
- offset = _Node.default.endOfWhiteSpace(src, offset);
150
- offset = this.parseComment(offset);
151
-
152
- if (!this.hasComment || this.valueRange.isEmpty()) {
153
- offset = this.parseBlockValue(offset);
154
- }
155
-
156
- return offset;
157
- }
158
-
159
- }
160
-
161
- exports.default = PlainValue;
@@ -1,237 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _errors = require("../errors");
9
-
10
- var _Node = _interopRequireDefault(require("./Node"));
11
-
12
- var _Range = _interopRequireDefault(require("./Range"));
13
-
14
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
-
16
- class QuoteDouble extends _Node.default {
17
- static endOfQuote(src, offset) {
18
- let ch = src[offset];
19
-
20
- while (ch && ch !== '"') {
21
- offset += ch === '\\' ? 2 : 1;
22
- ch = src[offset];
23
- }
24
-
25
- return offset + 1;
26
- }
27
- /**
28
- * @returns {string | { str: string, errors: YAMLSyntaxError[] }}
29
- */
30
-
31
-
32
- get strValue() {
33
- if (!this.valueRange || !this.context) return null;
34
- const errors = [];
35
- const {
36
- start,
37
- end
38
- } = this.valueRange;
39
- const {
40
- indent,
41
- src
42
- } = this.context;
43
- if (src[end - 1] !== '"') errors.push(new _errors.YAMLSyntaxError(this, 'Missing closing "quote')); // Using String#replace is too painful with escaped newlines preceded by
44
- // escaped backslashes; also, this should be faster.
45
-
46
- let str = '';
47
-
48
- for (let i = start + 1; i < end - 1; ++i) {
49
- const ch = src[i];
50
-
51
- if (ch === '\n') {
52
- if (_Node.default.atDocumentBoundary(src, i + 1)) errors.push(new _errors.YAMLSemanticError(this, 'Document boundary indicators are not allowed within string values'));
53
-
54
- const {
55
- fold,
56
- offset,
57
- error
58
- } = _Node.default.foldNewline(src, i, indent);
59
-
60
- str += fold;
61
- i = offset;
62
- if (error) errors.push(new _errors.YAMLSemanticError(this, 'Multi-line double-quoted string needs to be sufficiently indented'));
63
- } else if (ch === '\\') {
64
- i += 1;
65
-
66
- switch (src[i]) {
67
- case '0':
68
- str += '\0';
69
- break;
70
- // null character
71
-
72
- case 'a':
73
- str += '\x07';
74
- break;
75
- // bell character
76
-
77
- case 'b':
78
- str += '\b';
79
- break;
80
- // backspace
81
-
82
- case 'e':
83
- str += '\x1b';
84
- break;
85
- // escape character
86
-
87
- case 'f':
88
- str += '\f';
89
- break;
90
- // form feed
91
-
92
- case 'n':
93
- str += '\n';
94
- break;
95
- // line feed
96
-
97
- case 'r':
98
- str += '\r';
99
- break;
100
- // carriage return
101
-
102
- case 't':
103
- str += '\t';
104
- break;
105
- // horizontal tab
106
-
107
- case 'v':
108
- str += '\v';
109
- break;
110
- // vertical tab
111
-
112
- case 'N':
113
- str += '\u0085';
114
- break;
115
- // Unicode next line
116
-
117
- case '_':
118
- str += '\u00a0';
119
- break;
120
- // Unicode non-breaking space
121
-
122
- case 'L':
123
- str += '\u2028';
124
- break;
125
- // Unicode line separator
126
-
127
- case 'P':
128
- str += '\u2029';
129
- break;
130
- // Unicode paragraph separator
131
-
132
- case ' ':
133
- str += ' ';
134
- break;
135
-
136
- case '"':
137
- str += '"';
138
- break;
139
-
140
- case '/':
141
- str += '/';
142
- break;
143
-
144
- case '\\':
145
- str += '\\';
146
- break;
147
-
148
- case '\t':
149
- str += '\t';
150
- break;
151
-
152
- case 'x':
153
- str += this.parseCharCode(i + 1, 2, errors);
154
- i += 2;
155
- break;
156
-
157
- case 'u':
158
- str += this.parseCharCode(i + 1, 4, errors);
159
- i += 4;
160
- break;
161
-
162
- case 'U':
163
- str += this.parseCharCode(i + 1, 8, errors);
164
- i += 8;
165
- break;
166
-
167
- case '\n':
168
- // skip escaped newlines, but still trim the following line
169
- while (src[i + 1] === ' ' || src[i + 1] === '\t') i += 1;
170
-
171
- break;
172
-
173
- default:
174
- errors.push(new _errors.YAMLSyntaxError(this, `Invalid escape sequence ${src.substr(i - 1, 2)}`));
175
- str += '\\' + src[i];
176
- }
177
- } else if (ch === ' ' || ch === '\t') {
178
- // trim trailing whitespace
179
- const wsStart = i;
180
- let next = src[i + 1];
181
-
182
- while (next === ' ' || next === '\t') {
183
- i += 1;
184
- next = src[i + 1];
185
- }
186
-
187
- if (next !== '\n') str += i > wsStart ? src.slice(wsStart, i + 1) : ch;
188
- } else {
189
- str += ch;
190
- }
191
- }
192
-
193
- return errors.length > 0 ? {
194
- errors,
195
- str
196
- } : str;
197
- }
198
-
199
- parseCharCode(offset, length, errors) {
200
- const {
201
- src
202
- } = this.context;
203
- const cc = src.substr(offset, length);
204
- const ok = cc.length === length && /^[0-9a-fA-F]+$/.test(cc);
205
- const code = ok ? parseInt(cc, 16) : NaN;
206
-
207
- if (isNaN(code)) {
208
- errors.push(new _errors.YAMLSyntaxError(this, `Invalid escape sequence ${src.substr(offset - 2, length + 2)}`));
209
- return src.substr(offset - 2, length + 2);
210
- }
211
-
212
- return String.fromCodePoint(code);
213
- }
214
- /**
215
- * Parses a "double quoted" value from the source
216
- *
217
- * @param {ParseContext} context
218
- * @param {number} start - Index of first character
219
- * @returns {number} - Index of the character after this scalar
220
- */
221
-
222
-
223
- parse(context, start) {
224
- this.context = context;
225
- const {
226
- src
227
- } = context;
228
- let offset = QuoteDouble.endOfQuote(src, start + 1);
229
- this.valueRange = new _Range.default(start, offset);
230
- offset = _Node.default.endOfWhiteSpace(src, offset);
231
- offset = this.parseComment(offset);
232
- return offset;
233
- }
234
-
235
- }
236
-
237
- exports.default = QuoteDouble;