pairs.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. 'use strict';
  2. var identity = require('../../nodes/identity.js');
  3. var Pair = require('../../nodes/Pair.js');
  4. var Scalar = require('../../nodes/Scalar.js');
  5. var YAMLSeq = require('../../nodes/YAMLSeq.js');
  6. function resolvePairs(seq, onError) {
  7. if (identity.isSeq(seq)) {
  8. for (let i = 0; i < seq.items.length; ++i) {
  9. let item = seq.items[i];
  10. if (identity.isPair(item))
  11. continue;
  12. else if (identity.isMap(item)) {
  13. if (item.items.length > 1)
  14. onError('Each pair must have its own sequence indicator');
  15. const pair = item.items[0] || new Pair.Pair(new Scalar.Scalar(null));
  16. if (item.commentBefore)
  17. pair.key.commentBefore = pair.key.commentBefore
  18. ? `${item.commentBefore}\n${pair.key.commentBefore}`
  19. : item.commentBefore;
  20. if (item.comment) {
  21. const cn = pair.value ?? pair.key;
  22. cn.comment = cn.comment
  23. ? `${item.comment}\n${cn.comment}`
  24. : item.comment;
  25. }
  26. item = pair;
  27. }
  28. seq.items[i] = identity.isPair(item) ? item : new Pair.Pair(item);
  29. }
  30. }
  31. else
  32. onError('Expected a sequence for this tag');
  33. return seq;
  34. }
  35. function createPairs(schema, iterable, ctx) {
  36. const { replacer } = ctx;
  37. const pairs = new YAMLSeq.YAMLSeq(schema);
  38. pairs.tag = 'tag:yaml.org,2002:pairs';
  39. let i = 0;
  40. if (iterable && Symbol.iterator in Object(iterable))
  41. for (let it of iterable) {
  42. if (typeof replacer === 'function')
  43. it = replacer.call(iterable, String(i++), it);
  44. let key, value;
  45. if (Array.isArray(it)) {
  46. if (it.length === 2) {
  47. key = it[0];
  48. value = it[1];
  49. }
  50. else
  51. throw new TypeError(`Expected [key, value] tuple: ${it}`);
  52. }
  53. else if (it && it instanceof Object) {
  54. const keys = Object.keys(it);
  55. if (keys.length === 1) {
  56. key = keys[0];
  57. value = it[key];
  58. }
  59. else
  60. throw new TypeError(`Expected { key: value } tuple: ${it}`);
  61. }
  62. else {
  63. key = it;
  64. }
  65. pairs.items.push(Pair.createPair(key, value, ctx));
  66. }
  67. return pairs;
  68. }
  69. const pairs = {
  70. collection: 'seq',
  71. default: false,
  72. tag: 'tag:yaml.org,2002:pairs',
  73. resolve: resolvePairs,
  74. createNode: createPairs
  75. };
  76. exports.createPairs = createPairs;
  77. exports.pairs = pairs;
  78. exports.resolvePairs = resolvePairs;