pairs.js 2.7 KB

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