yaml 1.3.0 → 1.5.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 (145) hide show
  1. package/README.md +29 -23
  2. package/browser/dist/Anchors.js +12 -10
  3. package/browser/dist/Document.js +122 -60
  4. package/browser/dist/constants.js +34 -0
  5. package/browser/dist/cst/Alias.js +1 -3
  6. package/browser/dist/cst/BlankLine.js +5 -7
  7. package/browser/dist/cst/BlockValue.js +4 -4
  8. package/browser/dist/cst/Collection.js +8 -8
  9. package/browser/dist/cst/CollectionItem.js +6 -8
  10. package/browser/dist/cst/Comment.js +5 -7
  11. package/browser/dist/cst/Directive.js +5 -7
  12. package/browser/dist/cst/Document.js +8 -10
  13. package/browser/dist/cst/FlowCollection.js +5 -7
  14. package/browser/dist/cst/Node.js +12 -40
  15. package/browser/dist/cst/ParseContext.js +32 -34
  16. package/browser/dist/cst/PlainValue.js +1 -3
  17. package/browser/dist/cst/QuoteDouble.js +1 -3
  18. package/browser/dist/cst/QuoteSingle.js +1 -3
  19. package/browser/dist/cst/Range.js +1 -3
  20. package/browser/dist/cst/getLinePos.js +8 -13
  21. package/browser/dist/cst/parse.js +1 -4
  22. package/browser/dist/deprecation.js +34 -0
  23. package/browser/dist/errors.js +50 -59
  24. package/browser/dist/index.js +7 -4
  25. package/browser/dist/listTagNames.js +1 -3
  26. package/browser/dist/schema/Alias.js +90 -10
  27. package/browser/dist/schema/Collection.js +3 -3
  28. package/browser/dist/schema/Map.js +22 -105
  29. package/browser/dist/schema/Merge.js +74 -1
  30. package/browser/dist/schema/Node.js +1 -3
  31. package/browser/dist/schema/Pair.js +52 -26
  32. package/browser/dist/schema/Scalar.js +3 -5
  33. package/browser/dist/schema/Seq.js +30 -7
  34. package/browser/dist/schema/index.js +158 -82
  35. package/browser/dist/schema/parseMap.js +18 -21
  36. package/browser/dist/schema/parseSeq.js +9 -12
  37. package/browser/dist/{schema/_string.js → stringify.js} +65 -73
  38. package/browser/dist/tags/core.js +132 -0
  39. package/browser/dist/tags/failsafe/index.js +17 -0
  40. package/browser/dist/tags/failsafe/map.js +65 -0
  41. package/browser/dist/tags/failsafe/seq.js +54 -0
  42. package/browser/dist/tags/failsafe/string.js +40 -0
  43. package/browser/dist/tags/index.js +50 -0
  44. package/browser/dist/tags/json.js +103 -0
  45. package/browser/dist/tags/options.js +35 -0
  46. package/browser/dist/{schema/_binary.js → tags/yaml-1.1/binary.js} +20 -20
  47. package/browser/dist/tags/yaml-1.1/index.js +177 -0
  48. package/browser/dist/{schema/_omap.js → tags/yaml-1.1/omap.js} +25 -25
  49. package/browser/dist/{schema/_pairs.js → tags/yaml-1.1/pairs.js} +9 -13
  50. package/browser/dist/tags/yaml-1.1/set.js +140 -0
  51. package/browser/dist/{schema/_timestamp.js → tags/yaml-1.1/timestamp.js} +13 -10
  52. package/browser/dist/test-events.js +1 -4
  53. package/browser/dist/toJSON.js +20 -8
  54. package/browser/index.js +1 -0
  55. package/browser/map.js +2 -1
  56. package/browser/pair.js +2 -1
  57. package/browser/parse-cst.js +1 -1
  58. package/browser/scalar.js +2 -1
  59. package/browser/schema.js +7 -3
  60. package/browser/seq.js +2 -1
  61. package/browser/types/binary.js +7 -1
  62. package/browser/types/omap.js +2 -1
  63. package/browser/types/pairs.js +2 -1
  64. package/browser/types/set.js +2 -1
  65. package/browser/types/timestamp.js +10 -1
  66. package/browser/types.js +11 -0
  67. package/browser/util.js +15 -0
  68. package/dist/Anchors.js +9 -8
  69. package/dist/Document.js +55 -39
  70. package/dist/constants.js +34 -0
  71. package/dist/cst/Alias.js +1 -3
  72. package/dist/cst/BlankLine.js +5 -7
  73. package/dist/cst/BlockValue.js +4 -4
  74. package/dist/cst/Collection.js +8 -8
  75. package/dist/cst/CollectionItem.js +6 -8
  76. package/dist/cst/Comment.js +5 -7
  77. package/dist/cst/Directive.js +5 -7
  78. package/dist/cst/Document.js +8 -10
  79. package/dist/cst/FlowCollection.js +5 -7
  80. package/dist/cst/Node.js +12 -40
  81. package/dist/cst/ParseContext.js +32 -34
  82. package/dist/cst/PlainValue.js +1 -3
  83. package/dist/cst/QuoteDouble.js +1 -3
  84. package/dist/cst/QuoteSingle.js +1 -3
  85. package/dist/cst/Range.js +1 -3
  86. package/dist/cst/getLinePos.js +8 -12
  87. package/dist/cst/parse.js +1 -4
  88. package/dist/deprecation.js +34 -0
  89. package/dist/errors.js +29 -35
  90. package/dist/index.js +7 -4
  91. package/dist/listTagNames.js +1 -3
  92. package/dist/schema/Alias.js +67 -12
  93. package/dist/schema/Map.js +10 -74
  94. package/dist/schema/Merge.js +31 -0
  95. package/dist/schema/Node.js +1 -3
  96. package/dist/schema/Pair.js +46 -20
  97. package/dist/schema/Scalar.js +3 -5
  98. package/dist/schema/Seq.js +9 -5
  99. package/dist/schema/index.js +109 -74
  100. package/dist/schema/parseMap.js +18 -21
  101. package/dist/schema/parseSeq.js +9 -12
  102. package/dist/{schema/_string.js → stringify.js} +56 -65
  103. package/dist/tags/core.js +96 -0
  104. package/dist/tags/failsafe/index.js +17 -0
  105. package/dist/tags/failsafe/map.js +33 -0
  106. package/dist/tags/failsafe/seq.js +34 -0
  107. package/dist/tags/failsafe/string.js +40 -0
  108. package/dist/tags/index.js +50 -0
  109. package/dist/tags/json.js +67 -0
  110. package/dist/tags/options.js +35 -0
  111. package/dist/{schema/_binary.js → tags/yaml-1.1/binary.js} +18 -20
  112. package/dist/tags/yaml-1.1/index.js +131 -0
  113. package/dist/{schema/_omap.js → tags/yaml-1.1/omap.js} +16 -16
  114. package/dist/{schema/_pairs.js → tags/yaml-1.1/pairs.js} +9 -11
  115. package/dist/{schema/_set.js → tags/yaml-1.1/set.js} +12 -44
  116. package/dist/{schema/_timestamp.js → tags/yaml-1.1/timestamp.js} +7 -10
  117. package/dist/test-events.js +1 -4
  118. package/dist/toJSON.js +15 -5
  119. package/index.js +1 -0
  120. package/map.js +2 -1
  121. package/package.json +22 -17
  122. package/pair.js +2 -1
  123. package/parse-cst.js +1 -1
  124. package/scalar.js +2 -1
  125. package/schema.js +7 -3
  126. package/seq.js +2 -1
  127. package/types/binary.js +7 -1
  128. package/types/omap.js +2 -1
  129. package/types/pairs.js +2 -1
  130. package/types/set.js +2 -1
  131. package/types/timestamp.js +10 -1
  132. package/types.js +11 -0
  133. package/util.js +15 -0
  134. package/browser/dist/polyfill.js +0 -251
  135. package/browser/dist/schema/_set.js +0 -212
  136. package/browser/dist/schema/core.js +0 -98
  137. package/browser/dist/schema/failsafe.js +0 -125
  138. package/browser/dist/schema/json.js +0 -66
  139. package/browser/dist/schema/yaml-1.1.js +0 -140
  140. package/dist/linePos.js +0 -58
  141. package/dist/polyfill.js +0 -27
  142. package/dist/schema/core.js +0 -79
  143. package/dist/schema/failsafe.js +0 -74
  144. package/dist/schema/json.js +0 -56
  145. package/dist/schema/yaml-1.1.js +0 -115
@@ -158,6 +158,4 @@ class PlainValue extends _Node.default {
158
158
 
159
159
  }
160
160
 
161
- exports.default = PlainValue;
162
- module.exports = exports.default;
163
- module.exports.default = exports.default;
161
+ exports.default = PlainValue;
@@ -234,6 +234,4 @@ class QuoteDouble extends _Node.default {
234
234
 
235
235
  }
236
236
 
237
- exports.default = QuoteDouble;
238
- module.exports = exports.default;
239
- module.exports.default = exports.default;
237
+ exports.default = QuoteDouble;
@@ -110,6 +110,4 @@ class QuoteSingle extends _Node.default {
110
110
 
111
111
  }
112
112
 
113
- exports.default = QuoteSingle;
114
- module.exports = exports.default;
115
- module.exports.default = exports.default;
113
+ exports.default = QuoteSingle;
package/dist/cst/Range.js CHANGED
@@ -60,6 +60,4 @@ class Range {
60
60
 
61
61
  }
62
62
 
63
- exports.default = Range;
64
- module.exports = exports.default;
65
- module.exports.default = exports.default;
63
+ exports.default = Range;
@@ -24,7 +24,7 @@ function findLineStarts(src) {
24
24
  * the latter, starting indices for lines are cached in the document as
25
25
  * `lineStarts: number[]`.
26
26
  *
27
- * Returns a zero-indexed `{ line, col }` location if found, or
27
+ * Returns a one-indexed `{ line, col }` location if found, or
28
28
  * `undefined` otherwise.
29
29
  *
30
30
  * @param {number} offset
@@ -55,29 +55,25 @@ function getLinePos(offset, cst) {
55
55
  const start = lineStarts[i];
56
56
 
57
57
  if (offset < start) {
58
- const line = i - 1;
59
58
  return {
60
- line,
61
- col: offset - lineStarts[line]
59
+ line: i,
60
+ col: offset - lineStarts[i - 1] + 1
62
61
  };
63
62
  }
64
63
 
65
64
  if (offset === start) return {
66
- line: i,
67
- col: 0
65
+ line: i + 1,
66
+ col: 1
68
67
  };
69
68
  }
70
69
 
71
- const line = lineStarts.length - 1;
70
+ const line = lineStarts.length;
72
71
  return {
73
72
  line,
74
- col: offset - lineStarts[line]
73
+ col: offset - lineStarts[line - 1] + 1
75
74
  };
76
75
  }
77
76
  }
78
77
 
79
78
  return undefined;
80
- }
81
-
82
- module.exports = exports.default;
83
- module.exports.default = exports.default;
79
+ }
package/dist/cst/parse.js CHANGED
@@ -52,7 +52,4 @@ function parse(src) {
52
52
  documents.toString = () => documents.join('...\n');
53
53
 
54
54
  return documents;
55
- }
56
-
57
- module.exports = exports.default;
58
- module.exports.default = exports.default;
55
+ }
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.warnFileDeprecation = warnFileDeprecation;
7
+ exports.warnOptionDeprecation = warnOptionDeprecation;
8
+
9
+ /* global global, console */
10
+ function warn(msg) {
11
+ if (global && global.process && global.process.emitWarning) {
12
+ global.process.emitWarning(msg, 'DeprecationWarning');
13
+ } else {
14
+ // eslint-disable-next-line no-console
15
+ console.warn(`DeprecationWarning: ${msg}`);
16
+ }
17
+ }
18
+
19
+ function warnFileDeprecation(filename) {
20
+ if (global && global._YAML_SILENCE_DEPRECATION_WARNINGS) return;
21
+ const path = filename.replace(/.*yaml[/\\]/i, '').replace(/\.js$/, '').replace(/\\/g, '/');
22
+ warn(`The endpoint 'yaml/${path}' will be removed in a future release.`);
23
+ }
24
+
25
+ const warned = {};
26
+
27
+ function warnOptionDeprecation(name, alternative) {
28
+ if (global && global._YAML_SILENCE_DEPRECATION_WARNINGS) return;
29
+ if (warned[name]) return;
30
+ warned[name] = true;
31
+ let msg = `The option '${name}' will be removed in a future release`;
32
+ msg += alternative ? `, use '${alternative}' instead.` : '.';
33
+ warn(msg);
34
+ }
package/dist/errors.js CHANGED
@@ -3,70 +3,64 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.YAMLWarning = exports.YAMLSyntaxError = exports.YAMLSemanticError = exports.YAMLReferenceError = void 0;
6
+ exports.YAMLWarning = exports.YAMLSyntaxError = exports.YAMLSemanticError = exports.YAMLReferenceError = exports.YAMLError = void 0;
7
7
 
8
8
  var _Node = _interopRequireDefault(require("./cst/Node"));
9
9
 
10
10
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
11
 
12
- class YAMLReferenceError extends ReferenceError {
13
- constructor(source, message) {
14
- if (!message || !(source instanceof _Node.default)) {
15
- throw new Error('Invalid arguments for new YAMLReferenceError');
16
- }
17
-
12
+ class YAMLError extends Error {
13
+ constructor(name, source, message) {
14
+ if (!message || !(source instanceof _Node.default)) throw new Error(`Invalid arguments for new ${name}`);
18
15
  super();
19
- this.name = 'YAMLReferenceError';
16
+ this.name = name;
20
17
  this.message = message;
21
18
  this.source = source;
22
19
  }
23
20
 
21
+ makePretty() {
22
+ if (this.source) {
23
+ this.nodeType = this.source.type;
24
+ this.range = this.source.range;
25
+ this.linePos = this.source.rangeAsLinePos;
26
+ delete this.source;
27
+ }
28
+ }
29
+
24
30
  }
25
31
 
26
- exports.YAMLReferenceError = YAMLReferenceError;
32
+ exports.YAMLError = YAMLError;
27
33
 
28
- class YAMLSemanticError extends SyntaxError {
34
+ class YAMLReferenceError extends YAMLError {
29
35
  constructor(source, message) {
30
- if (!message || !(source instanceof _Node.default)) {
31
- throw new Error('Invalid arguments for new YAMLSemanticError');
32
- }
36
+ super('YAMLReferenceError', source, message);
37
+ }
33
38
 
34
- super();
35
- this.name = 'YAMLSemanticError';
36
- this.message = message;
37
- this.source = source;
39
+ }
40
+
41
+ exports.YAMLReferenceError = YAMLReferenceError;
42
+
43
+ class YAMLSemanticError extends YAMLError {
44
+ constructor(source, message) {
45
+ super('YAMLSemanticError', source, message);
38
46
  }
39
47
 
40
48
  }
41
49
 
42
50
  exports.YAMLSemanticError = YAMLSemanticError;
43
51
 
44
- class YAMLSyntaxError extends SyntaxError {
52
+ class YAMLSyntaxError extends YAMLError {
45
53
  constructor(source, message) {
46
- if (!message || !(source instanceof _Node.default)) {
47
- throw new Error('Invalid arguments for new YAMLSyntaxError');
48
- }
49
-
50
- super();
51
- this.name = 'YAMLSyntaxError';
52
- this.message = message;
53
- this.source = source;
54
+ super('YAMLSyntaxError', source, message);
54
55
  }
55
56
 
56
57
  }
57
58
 
58
59
  exports.YAMLSyntaxError = YAMLSyntaxError;
59
60
 
60
- class YAMLWarning extends Error {
61
+ class YAMLWarning extends YAMLError {
61
62
  constructor(source, message) {
62
- if (!message || !(source instanceof _Node.default)) {
63
- throw new Error('Invalid arguments for new YAMLWarning');
64
- }
65
-
66
- super();
67
- this.name = 'YAMLWarning';
68
- this.message = message;
69
- this.source = source;
63
+ super('YAMLWarning', source, message);
70
64
  }
71
65
 
72
66
  }
package/dist/index.js CHANGED
@@ -17,10 +17,15 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
17
17
 
18
18
  /* global console */
19
19
  const defaultOptions = {
20
+ anchorPrefix: 'a',
21
+ customTags: null,
22
+ keepCstNodes: false,
20
23
  keepNodeTypes: true,
21
24
  keepBlobsInJSON: true,
22
25
  mapAsMap: false,
23
- tags: null,
26
+ maxAliasCount: 100,
27
+ prettyErrors: false,
28
+ // TODO Set true in v2
24
29
  version: '1.2'
25
30
  };
26
31
 
@@ -82,6 +87,4 @@ var _default = {
82
87
  parseDocument,
83
88
  stringify
84
89
  };
85
- exports.default = _default;
86
- module.exports = exports.default;
87
- module.exports.default = exports.default;
90
+ exports.default = _default;
@@ -35,6 +35,4 @@ const visit = (node, tags) => {
35
35
 
36
36
  var _default = node => Object.keys(visit(node, {}));
37
37
 
38
- exports.default = _default;
39
- module.exports = exports.default;
40
- module.exports.default = exports.default;
38
+ exports.default = _default;
@@ -5,26 +5,56 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
- var _Node = require("../cst/Node");
8
+ var _constants = require("../constants");
9
+
10
+ var _errors = require("../errors");
9
11
 
10
12
  var _toJSON = _interopRequireDefault(require("../toJSON"));
11
13
 
12
- var _Node2 = _interopRequireDefault(require("./Node"));
14
+ var _Collection = _interopRequireDefault(require("./Collection"));
15
+
16
+ var _Node = _interopRequireDefault(require("./Node"));
17
+
18
+ var _Pair = _interopRequireDefault(require("./Pair"));
13
19
 
14
20
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
21
 
16
22
  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; }
17
23
 
18
- class Alias extends _Node2.default {
24
+ const getAliasCount = (node, anchors) => {
25
+ if (node instanceof Alias) {
26
+ const anchor = anchors.find(a => a.node === node.source);
27
+ return anchor.count * anchor.aliasCount;
28
+ } else if (node instanceof _Collection.default) {
29
+ let count = 0;
30
+
31
+ for (const item of node.items) {
32
+ const c = getAliasCount(item, anchors);
33
+ if (c > count) count = c;
34
+ }
35
+
36
+ return count;
37
+ } else if (node instanceof _Pair.default) {
38
+ const kc = getAliasCount(node.key, anchors);
39
+ const vc = getAliasCount(node.value, anchors);
40
+ return Math.max(kc, vc);
41
+ }
42
+
43
+ return 1;
44
+ };
45
+
46
+ class Alias extends _Node.default {
19
47
  static stringify({
20
48
  range,
21
49
  source
22
50
  }, {
23
51
  anchors,
24
52
  doc,
25
- implicitKey
53
+ implicitKey,
54
+ inStringifyKey
26
55
  }) {
27
- const anchor = Object.keys(anchors).find(a => anchors[a] === source);
56
+ let anchor = Object.keys(anchors).find(a => anchors[a] === source);
57
+ if (!anchor && inStringifyKey) anchor = doc.anchors.getName(source) || doc.anchors.newName();
28
58
  if (anchor) return `*${anchor}${implicitKey ? ' ' : ''}`;
29
59
  const msg = doc.anchors.getName(source) ? 'Alias node must be after source node' : 'Source node not found for alias node';
30
60
  throw new Error(`${msg} [${range}]`);
@@ -33,22 +63,47 @@ class Alias extends _Node2.default {
33
63
  constructor(source) {
34
64
  super();
35
65
  this.source = source;
36
- this.type = _Node.Type.ALIAS;
66
+ this.type = _constants.Type.ALIAS;
37
67
  }
38
68
 
39
69
  set tag(t) {
40
70
  throw new Error('Alias nodes cannot have tags');
41
71
  }
42
72
 
43
- toJSON(arg, opt) {
44
- return (0, _toJSON.default)(this.source, arg, opt);
73
+ toJSON(arg, ctx) {
74
+ if (!ctx) return (0, _toJSON.default)(this.source, arg, ctx);
75
+ const {
76
+ anchors,
77
+ maxAliasCount
78
+ } = ctx;
79
+ const anchor = anchors.find(a => a.node === this.source);
80
+
81
+ if (!anchor || !anchor.res) {
82
+ const msg = 'This should not happen: Alias anchor was not resolved?';
83
+ if (this.cstNode) throw new _errors.YAMLReferenceError(this.cstNode, msg);else throw new ReferenceError(msg);
84
+ }
85
+
86
+ if (maxAliasCount >= 0) {
87
+ anchor.count += 1;
88
+ if (anchor.aliasCount === 0) anchor.aliasCount = getAliasCount(this.source, anchors);
89
+
90
+ if (anchor.count * anchor.aliasCount > maxAliasCount) {
91
+ const msg = 'Excessive alias count indicates a resource exhaustion attack';
92
+ if (this.cstNode) throw new _errors.YAMLReferenceError(this.cstNode, msg);else throw new ReferenceError(msg);
93
+ }
94
+ }
95
+
96
+ return anchor.res;
97
+ } // Only called when stringifying an alias mapping key while constructing
98
+ // Object output.
99
+
100
+
101
+ toString(ctx) {
102
+ return Alias.stringify(this, ctx);
45
103
  }
46
104
 
47
105
  }
48
106
 
49
107
  exports.default = Alias;
50
108
 
51
- _defineProperty(Alias, "default", true);
52
-
53
- module.exports = exports.default;
54
- module.exports.default = exports.default;
109
+ _defineProperty(Alias, "default", true);
@@ -6,19 +6,14 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.findPair = findPair;
7
7
  exports.default = void 0;
8
8
 
9
- var _toJSON = _interopRequireDefault(require("../toJSON"));
10
-
11
9
  var _Collection = _interopRequireDefault(require("./Collection"));
12
10
 
13
- var _Merge = _interopRequireDefault(require("./Merge"));
14
-
15
11
  var _Pair = _interopRequireDefault(require("./Pair"));
16
12
 
17
13
  var _Scalar = _interopRequireDefault(require("./Scalar"));
18
14
 
19
15
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
20
16
 
21
- // Published as 'yaml/map'
22
17
  function findPair(items, key) {
23
18
  const k = key instanceof _Scalar.default ? key.value : key;
24
19
 
@@ -61,78 +56,19 @@ class YAMLMap extends _Collection.default {
61
56
  const prev = findPair(this.items, key);
62
57
  if (prev) prev.value = value;else this.items.push(new _Pair.default(key, value));
63
58
  }
59
+ /**
60
+ * @param {*} arg ignored
61
+ * @param {*} ctx Conversion context, originally set in Document#toJSON()
62
+ * @param {Class} Type If set, forces the returned collection type
63
+ * @returns {*} Instance of Type, Map, or Object
64
+ */
64
65
 
65
- toJSON(_, opt) {
66
- if (opt && opt.mapAsMap) return this.toJSMap(opt);
67
- return this.items.reduce((map, item) => {
68
- if (item instanceof _Merge.default) {
69
- // If the value associated with a merge key is a single mapping node,
70
- // each of its key/value pairs is inserted into the current mapping,
71
- // unless the key already exists in it. If the value associated with the
72
- // merge key is a sequence, then this sequence is expected to contain
73
- // mapping nodes and each of these nodes is merged in turn according to
74
- // its order in the sequence. Keys in mapping nodes earlier in the
75
- // sequence override keys specified in later mapping nodes.
76
- // -- http://yaml.org/type/merge.html
77
- const keys = Object.keys(map);
78
- const {
79
- items
80
- } = item.value;
81
-
82
- for (let i = items.length - 1; i >= 0; --i) {
83
- const {
84
- source
85
- } = items[i];
86
-
87
- if (source instanceof YAMLMap) {
88
- const obj = source.toJSON('', opt);
89
- Object.keys(obj).forEach(key => {
90
- if (!keys.includes(key)) map[key] = obj[key];
91
- });
92
- } else {
93
- throw new Error('Merge sources must be maps');
94
- }
95
- }
96
- } else {
97
- const {
98
- stringKey,
99
- value
100
- } = item;
101
- map[stringKey] = (0, _toJSON.default)(value, stringKey, opt);
102
- }
103
-
104
- return map;
105
- }, {});
106
- }
107
66
 
108
- toJSMap(opt) {
109
- const map = new Map();
67
+ toJSON(_, ctx, Type) {
68
+ const map = Type ? new Type() : ctx && ctx.mapAsMap ? new Map() : {};
69
+ if (ctx && ctx.onCreate) ctx.onCreate(map);
110
70
 
111
- for (const item of this.items) {
112
- if (item instanceof _Merge.default) {
113
- const {
114
- items
115
- } = item.value;
116
-
117
- for (let i = items.length - 1; i >= 0; --i) {
118
- const {
119
- source
120
- } = items[i];
121
-
122
- if (source instanceof YAMLMap) {
123
- for (const [key, value] of source.toJSMap(opt)) {
124
- if (!map.has(key)) map.set(key, value);
125
- }
126
- } else {
127
- throw new Error('Merge sources must be maps');
128
- }
129
- }
130
- } else {
131
- const key = (0, _toJSON.default)(item.key, '', opt);
132
- const value = (0, _toJSON.default)(item.value, key, opt);
133
- map.set(key, value);
134
- }
135
- }
71
+ for (const item of this.items) item.addToJSMap(ctx, map);
136
72
 
137
73
  return map;
138
74
  }
@@ -5,6 +5,8 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = exports.MERGE_KEY = void 0;
7
7
 
8
+ var _Map = _interopRequireDefault(require("./Map"));
9
+
8
10
  var _Pair = _interopRequireDefault(require("./Pair"));
9
11
 
10
12
  var _Scalar = _interopRequireDefault(require("./Scalar"));
@@ -34,6 +36,35 @@ class Merge extends _Pair.default {
34
36
  }
35
37
 
36
38
  this.type = 'MERGE_PAIR';
39
+ } // If the value associated with a merge key is a single mapping node, each of
40
+ // its key/value pairs is inserted into the current mapping, unless the key
41
+ // already exists in it. If the value associated with the merge key is a
42
+ // sequence, then this sequence is expected to contain mapping nodes and each
43
+ // of these nodes is merged in turn according to its order in the sequence.
44
+ // Keys in mapping nodes earlier in the sequence override keys specified in
45
+ // later mapping nodes. -- http://yaml.org/type/merge.html
46
+
47
+
48
+ addToJSMap(ctx, map) {
49
+ for (const _ref of this.value.items) {
50
+ const {
51
+ source
52
+ } = _ref;
53
+ if (!(source instanceof _Map.default)) throw new Error('Merge sources must be maps');
54
+ const srcMap = source.toJSON(null, ctx, Map);
55
+
56
+ for (const [key, value] of srcMap) {
57
+ if (map instanceof Map) {
58
+ if (!map.has(key)) map.set(key, value);
59
+ } else if (map instanceof Set) {
60
+ map.add(key);
61
+ } else {
62
+ if (!map.hasOwnProperty(key)) map[key] = value;
63
+ }
64
+ }
65
+ }
66
+
67
+ return map;
37
68
  }
38
69
 
39
70
  toString(ctx, onComment) {
@@ -7,6 +7,4 @@ exports.default = void 0;
7
7
 
8
8
  class Node {}
9
9
 
10
- exports.default = Node;
11
- module.exports = exports.default;
12
- module.exports.default = exports.default;
10
+ exports.default = Node;
@@ -18,6 +18,19 @@ var _Scalar = _interopRequireDefault(require("./Scalar"));
18
18
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
19
 
20
20
  // Published as 'yaml/pair'
21
+ const stringifyKey = (key, jsKey, ctx) => {
22
+ if (jsKey === null) return '';
23
+ if (typeof jsKey !== 'object') return String(jsKey);
24
+ if (key instanceof _Node.default && ctx && ctx.doc) return key.toString({
25
+ anchors: {},
26
+ doc: ctx.doc,
27
+ indent: '',
28
+ inFlow: true,
29
+ inStringifyKey: true
30
+ });
31
+ return JSON.stringify(jsKey);
32
+ };
33
+
21
34
  class Pair extends _Node.default {
22
35
  constructor(key, value = null) {
23
36
  super();
@@ -35,27 +48,30 @@ class Pair extends _Node.default {
35
48
  this.key.commentBefore = cb;
36
49
  }
37
50
 
38
- get stringKey() {
39
- const key = (0, _toJSON.default)(this.key);
40
- if (key === null) return '';
41
- if (typeof key === 'object') try {
42
- return JSON.stringify(key);
43
- } catch (e) {
44
- /* should not happen, but let's ignore in any case */
51
+ addToJSMap(ctx, map) {
52
+ const key = (0, _toJSON.default)(this.key, '', ctx);
53
+
54
+ if (map instanceof Map) {
55
+ const value = (0, _toJSON.default)(this.value, key, ctx);
56
+ map.set(key, value);
57
+ } else if (map instanceof Set) {
58
+ map.add(key);
59
+ } else {
60
+ const stringKey = stringifyKey(this.key, key, ctx);
61
+ map[stringKey] = (0, _toJSON.default)(this.value, stringKey, ctx);
45
62
  }
46
- return String(key);
63
+
64
+ return map;
47
65
  }
48
66
 
49
- toJSON(_, opt) {
50
- const pair = {};
51
- const sk = this.stringKey;
52
- pair[sk] = (0, _toJSON.default)(this.value, sk, opt);
53
- return pair;
67
+ toJSON(_, ctx) {
68
+ const pair = ctx && ctx.mapAsMap ? new Map() : {};
69
+ return this.addToJSMap(ctx, pair);
54
70
  }
55
71
 
56
72
  toString(ctx, onComment, onChompKeep) {
57
73
  if (!ctx || !ctx.doc) return JSON.stringify(this);
58
- const {
74
+ let {
59
75
  key,
60
76
  value
61
77
  } = this;
@@ -91,27 +107,37 @@ class Pair extends _Node.default {
91
107
  }
92
108
 
93
109
  let vcb = '';
110
+ let valueComment = null;
94
111
 
95
- if (value) {
112
+ if (value instanceof _Node.default) {
96
113
  if (value.spaceBefore) vcb = '\n';
97
114
 
98
115
  if (value.commentBefore) {
99
116
  const cs = value.commentBefore.replace(/^/gm, `${ctx.indent}#`);
100
117
  vcb += `\n${cs}`;
101
118
  }
119
+
120
+ valueComment = value.comment;
121
+ } else if (value && typeof value === 'object') {
122
+ value = doc.schema.createNode(value, true);
102
123
  }
103
124
 
104
125
  ctx.implicitKey = false;
105
- let valueComment = value instanceof _Node.default && value.comment;
106
126
  chompKeep = false;
107
127
  const valueStr = doc.schema.stringify(value, ctx, () => valueComment = null, () => chompKeep = true);
108
- const ws = vcb || this.comment || !explicitKey && value instanceof _Collection.default ? `${vcb}\n${ctx.indent}` : ' ';
128
+ let ws = ' ';
129
+
130
+ if (vcb || this.comment) {
131
+ ws = `${vcb}\n${ctx.indent}`;
132
+ } else if (!explicitKey && value instanceof _Collection.default) {
133
+ const flow = valueStr[0] === '[' || valueStr[0] === '{';
134
+ if (!flow || valueStr.includes('\n')) ws = `\n${ctx.indent}`;
135
+ }
136
+
109
137
  if (chompKeep && !valueComment && onChompKeep) onChompKeep();
110
138
  return (0, _addComment.default)(str + ws + valueStr, ctx.indent, valueComment);
111
139
  }
112
140
 
113
141
  }
114
142
 
115
- exports.default = Pair;
116
- module.exports = exports.default;
117
- module.exports.default = exports.default;
143
+ exports.default = Pair;
@@ -18,8 +18,8 @@ class Scalar extends _Node.default {
18
18
  this.value = value;
19
19
  }
20
20
 
21
- toJSON(arg, opt) {
22
- return opt && opt.keep ? this.value : (0, _toJSON.default)(this.value, arg, opt);
21
+ toJSON(arg, ctx) {
22
+ return ctx && ctx.keep ? this.value : (0, _toJSON.default)(this.value, arg, ctx);
23
23
  }
24
24
 
25
25
  toString() {
@@ -28,6 +28,4 @@ class Scalar extends _Node.default {
28
28
 
29
29
  }
30
30
 
31
- exports.default = Scalar;
32
- module.exports = exports.default;
33
- module.exports.default = exports.default;
31
+ exports.default = Scalar;