@halofy/agent-connect 0.12.0 → 0.13.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 (253) hide show
  1. package/README.md +228 -12
  2. package/bin/halofy-agent.mjs +83 -8
  3. package/node_modules/yaml/LICENSE +13 -0
  4. package/node_modules/yaml/README.md +172 -0
  5. package/node_modules/yaml/bin.mjs +11 -0
  6. package/node_modules/yaml/browser/dist/compose/compose-collection.js +88 -0
  7. package/node_modules/yaml/browser/dist/compose/compose-doc.js +43 -0
  8. package/node_modules/yaml/browser/dist/compose/compose-node.js +109 -0
  9. package/node_modules/yaml/browser/dist/compose/compose-scalar.js +86 -0
  10. package/node_modules/yaml/browser/dist/compose/composer.js +219 -0
  11. package/node_modules/yaml/browser/dist/compose/resolve-block-map.js +115 -0
  12. package/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +198 -0
  13. package/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +49 -0
  14. package/node_modules/yaml/browser/dist/compose/resolve-end.js +37 -0
  15. package/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +207 -0
  16. package/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +226 -0
  17. package/node_modules/yaml/browser/dist/compose/resolve-props.js +146 -0
  18. package/node_modules/yaml/browser/dist/compose/util-contains-newline.js +34 -0
  19. package/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +26 -0
  20. package/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +15 -0
  21. package/node_modules/yaml/browser/dist/compose/util-map-includes.js +13 -0
  22. package/node_modules/yaml/browser/dist/doc/Document.js +335 -0
  23. package/node_modules/yaml/browser/dist/doc/anchors.js +71 -0
  24. package/node_modules/yaml/browser/dist/doc/applyReviver.js +55 -0
  25. package/node_modules/yaml/browser/dist/doc/createNode.js +88 -0
  26. package/node_modules/yaml/browser/dist/doc/directives.js +176 -0
  27. package/node_modules/yaml/browser/dist/errors.js +57 -0
  28. package/node_modules/yaml/browser/dist/index.js +17 -0
  29. package/node_modules/yaml/browser/dist/log.js +11 -0
  30. package/node_modules/yaml/browser/dist/nodes/Alias.js +118 -0
  31. package/node_modules/yaml/browser/dist/nodes/Collection.js +147 -0
  32. package/node_modules/yaml/browser/dist/nodes/Node.js +38 -0
  33. package/node_modules/yaml/browser/dist/nodes/Pair.js +36 -0
  34. package/node_modules/yaml/browser/dist/nodes/Scalar.js +24 -0
  35. package/node_modules/yaml/browser/dist/nodes/YAMLMap.js +144 -0
  36. package/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +113 -0
  37. package/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +63 -0
  38. package/node_modules/yaml/browser/dist/nodes/identity.js +36 -0
  39. package/node_modules/yaml/browser/dist/nodes/toJS.js +37 -0
  40. package/node_modules/yaml/browser/dist/parse/cst-scalar.js +214 -0
  41. package/node_modules/yaml/browser/dist/parse/cst-stringify.js +61 -0
  42. package/node_modules/yaml/browser/dist/parse/cst-visit.js +97 -0
  43. package/node_modules/yaml/browser/dist/parse/cst.js +98 -0
  44. package/node_modules/yaml/browser/dist/parse/lexer.js +721 -0
  45. package/node_modules/yaml/browser/dist/parse/line-counter.js +39 -0
  46. package/node_modules/yaml/browser/dist/parse/parser.js +975 -0
  47. package/node_modules/yaml/browser/dist/public-api.js +102 -0
  48. package/node_modules/yaml/browser/dist/schema/Schema.js +37 -0
  49. package/node_modules/yaml/browser/dist/schema/common/map.js +17 -0
  50. package/node_modules/yaml/browser/dist/schema/common/null.js +15 -0
  51. package/node_modules/yaml/browser/dist/schema/common/seq.js +17 -0
  52. package/node_modules/yaml/browser/dist/schema/common/string.js +14 -0
  53. package/node_modules/yaml/browser/dist/schema/core/bool.js +19 -0
  54. package/node_modules/yaml/browser/dist/schema/core/float.js +43 -0
  55. package/node_modules/yaml/browser/dist/schema/core/int.js +38 -0
  56. package/node_modules/yaml/browser/dist/schema/core/schema.js +23 -0
  57. package/node_modules/yaml/browser/dist/schema/json/schema.js +62 -0
  58. package/node_modules/yaml/browser/dist/schema/tags.js +96 -0
  59. package/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +58 -0
  60. package/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +26 -0
  61. package/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +46 -0
  62. package/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +71 -0
  63. package/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +67 -0
  64. package/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +74 -0
  65. package/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +78 -0
  66. package/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +39 -0
  67. package/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +93 -0
  68. package/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
  69. package/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +146 -0
  70. package/node_modules/yaml/browser/dist/stringify/stringify.js +129 -0
  71. package/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +153 -0
  72. package/node_modules/yaml/browser/dist/stringify/stringifyComment.js +20 -0
  73. package/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +85 -0
  74. package/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +25 -0
  75. package/node_modules/yaml/browser/dist/stringify/stringifyPair.js +150 -0
  76. package/node_modules/yaml/browser/dist/stringify/stringifyString.js +336 -0
  77. package/node_modules/yaml/browser/dist/util.js +11 -0
  78. package/node_modules/yaml/browser/dist/visit.js +233 -0
  79. package/node_modules/yaml/browser/index.js +5 -0
  80. package/node_modules/yaml/browser/package.json +3 -0
  81. package/node_modules/yaml/dist/cli.d.ts +8 -0
  82. package/node_modules/yaml/dist/cli.mjs +201 -0
  83. package/node_modules/yaml/dist/compose/compose-collection.d.ts +11 -0
  84. package/node_modules/yaml/dist/compose/compose-collection.js +90 -0
  85. package/node_modules/yaml/dist/compose/compose-doc.d.ts +7 -0
  86. package/node_modules/yaml/dist/compose/compose-doc.js +45 -0
  87. package/node_modules/yaml/dist/compose/compose-node.d.ts +29 -0
  88. package/node_modules/yaml/dist/compose/compose-node.js +112 -0
  89. package/node_modules/yaml/dist/compose/compose-scalar.d.ts +5 -0
  90. package/node_modules/yaml/dist/compose/compose-scalar.js +88 -0
  91. package/node_modules/yaml/dist/compose/composer.d.ts +63 -0
  92. package/node_modules/yaml/dist/compose/composer.js +224 -0
  93. package/node_modules/yaml/dist/compose/resolve-block-map.d.ts +6 -0
  94. package/node_modules/yaml/dist/compose/resolve-block-map.js +117 -0
  95. package/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
  96. package/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
  97. package/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
  98. package/node_modules/yaml/dist/compose/resolve-block-seq.js +51 -0
  99. package/node_modules/yaml/dist/compose/resolve-end.d.ts +6 -0
  100. package/node_modules/yaml/dist/compose/resolve-end.js +39 -0
  101. package/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
  102. package/node_modules/yaml/dist/compose/resolve-flow-collection.js +209 -0
  103. package/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
  104. package/node_modules/yaml/dist/compose/resolve-flow-scalar.js +228 -0
  105. package/node_modules/yaml/dist/compose/resolve-props.d.ts +23 -0
  106. package/node_modules/yaml/dist/compose/resolve-props.js +148 -0
  107. package/node_modules/yaml/dist/compose/util-contains-newline.d.ts +2 -0
  108. package/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
  109. package/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
  110. package/node_modules/yaml/dist/compose/util-empty-scalar-position.js +28 -0
  111. package/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
  112. package/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
  113. package/node_modules/yaml/dist/compose/util-map-includes.d.ts +4 -0
  114. package/node_modules/yaml/dist/compose/util-map-includes.js +15 -0
  115. package/node_modules/yaml/dist/doc/Document.d.ts +141 -0
  116. package/node_modules/yaml/dist/doc/Document.js +337 -0
  117. package/node_modules/yaml/dist/doc/anchors.d.ts +24 -0
  118. package/node_modules/yaml/dist/doc/anchors.js +76 -0
  119. package/node_modules/yaml/dist/doc/applyReviver.d.ts +9 -0
  120. package/node_modules/yaml/dist/doc/applyReviver.js +57 -0
  121. package/node_modules/yaml/dist/doc/createNode.d.ts +17 -0
  122. package/node_modules/yaml/dist/doc/createNode.js +90 -0
  123. package/node_modules/yaml/dist/doc/directives.d.ts +49 -0
  124. package/node_modules/yaml/dist/doc/directives.js +178 -0
  125. package/node_modules/yaml/dist/errors.d.ts +21 -0
  126. package/node_modules/yaml/dist/errors.js +62 -0
  127. package/node_modules/yaml/dist/index.d.ts +25 -0
  128. package/node_modules/yaml/dist/index.js +50 -0
  129. package/node_modules/yaml/dist/log.d.ts +3 -0
  130. package/node_modules/yaml/dist/log.js +19 -0
  131. package/node_modules/yaml/dist/nodes/Alias.d.ts +29 -0
  132. package/node_modules/yaml/dist/nodes/Alias.js +120 -0
  133. package/node_modules/yaml/dist/nodes/Collection.d.ts +73 -0
  134. package/node_modules/yaml/dist/nodes/Collection.js +151 -0
  135. package/node_modules/yaml/dist/nodes/Node.d.ts +53 -0
  136. package/node_modules/yaml/dist/nodes/Node.js +40 -0
  137. package/node_modules/yaml/dist/nodes/Pair.d.ts +22 -0
  138. package/node_modules/yaml/dist/nodes/Pair.js +39 -0
  139. package/node_modules/yaml/dist/nodes/Scalar.d.ts +47 -0
  140. package/node_modules/yaml/dist/nodes/Scalar.js +27 -0
  141. package/node_modules/yaml/dist/nodes/YAMLMap.d.ts +53 -0
  142. package/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
  143. package/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
  144. package/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
  145. package/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
  146. package/node_modules/yaml/dist/nodes/addPairToJSMap.js +65 -0
  147. package/node_modules/yaml/dist/nodes/identity.d.ts +23 -0
  148. package/node_modules/yaml/dist/nodes/identity.js +53 -0
  149. package/node_modules/yaml/dist/nodes/toJS.d.ts +29 -0
  150. package/node_modules/yaml/dist/nodes/toJS.js +39 -0
  151. package/node_modules/yaml/dist/options.d.ts +350 -0
  152. package/node_modules/yaml/dist/parse/cst-scalar.d.ts +64 -0
  153. package/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
  154. package/node_modules/yaml/dist/parse/cst-stringify.d.ts +8 -0
  155. package/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
  156. package/node_modules/yaml/dist/parse/cst-visit.d.ts +39 -0
  157. package/node_modules/yaml/dist/parse/cst-visit.js +99 -0
  158. package/node_modules/yaml/dist/parse/cst.d.ts +109 -0
  159. package/node_modules/yaml/dist/parse/cst.js +112 -0
  160. package/node_modules/yaml/dist/parse/lexer.d.ts +87 -0
  161. package/node_modules/yaml/dist/parse/lexer.js +723 -0
  162. package/node_modules/yaml/dist/parse/line-counter.d.ts +22 -0
  163. package/node_modules/yaml/dist/parse/line-counter.js +41 -0
  164. package/node_modules/yaml/dist/parse/parser.d.ts +84 -0
  165. package/node_modules/yaml/dist/parse/parser.js +980 -0
  166. package/node_modules/yaml/dist/public-api.d.ts +44 -0
  167. package/node_modules/yaml/dist/public-api.js +107 -0
  168. package/node_modules/yaml/dist/schema/Schema.d.ts +17 -0
  169. package/node_modules/yaml/dist/schema/Schema.js +39 -0
  170. package/node_modules/yaml/dist/schema/common/map.d.ts +2 -0
  171. package/node_modules/yaml/dist/schema/common/map.js +19 -0
  172. package/node_modules/yaml/dist/schema/common/null.d.ts +4 -0
  173. package/node_modules/yaml/dist/schema/common/null.js +17 -0
  174. package/node_modules/yaml/dist/schema/common/seq.d.ts +2 -0
  175. package/node_modules/yaml/dist/schema/common/seq.js +19 -0
  176. package/node_modules/yaml/dist/schema/common/string.d.ts +2 -0
  177. package/node_modules/yaml/dist/schema/common/string.js +16 -0
  178. package/node_modules/yaml/dist/schema/core/bool.d.ts +4 -0
  179. package/node_modules/yaml/dist/schema/core/bool.js +21 -0
  180. package/node_modules/yaml/dist/schema/core/float.d.ts +4 -0
  181. package/node_modules/yaml/dist/schema/core/float.js +47 -0
  182. package/node_modules/yaml/dist/schema/core/int.d.ts +4 -0
  183. package/node_modules/yaml/dist/schema/core/int.js +42 -0
  184. package/node_modules/yaml/dist/schema/core/schema.d.ts +1 -0
  185. package/node_modules/yaml/dist/schema/core/schema.js +25 -0
  186. package/node_modules/yaml/dist/schema/json/schema.d.ts +2 -0
  187. package/node_modules/yaml/dist/schema/json/schema.js +64 -0
  188. package/node_modules/yaml/dist/schema/json-schema.d.ts +69 -0
  189. package/node_modules/yaml/dist/schema/tags.d.ts +48 -0
  190. package/node_modules/yaml/dist/schema/tags.js +99 -0
  191. package/node_modules/yaml/dist/schema/types.d.ts +92 -0
  192. package/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
  193. package/node_modules/yaml/dist/schema/yaml-1.1/binary.js +70 -0
  194. package/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
  195. package/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
  196. package/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
  197. package/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
  198. package/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
  199. package/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
  200. package/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
  201. package/node_modules/yaml/dist/schema/yaml-1.1/merge.js +71 -0
  202. package/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +22 -0
  203. package/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
  204. package/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
  205. package/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
  206. package/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
  207. package/node_modules/yaml/dist/schema/yaml-1.1/schema.js +41 -0
  208. package/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
  209. package/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
  210. package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
  211. package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
  212. package/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
  213. package/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
  214. package/node_modules/yaml/dist/stringify/stringify.d.ts +21 -0
  215. package/node_modules/yaml/dist/stringify/stringify.js +132 -0
  216. package/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
  217. package/node_modules/yaml/dist/stringify/stringifyCollection.js +155 -0
  218. package/node_modules/yaml/dist/stringify/stringifyComment.d.ts +10 -0
  219. package/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
  220. package/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
  221. package/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
  222. package/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
  223. package/node_modules/yaml/dist/stringify/stringifyNumber.js +27 -0
  224. package/node_modules/yaml/dist/stringify/stringifyPair.d.ts +3 -0
  225. package/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
  226. package/node_modules/yaml/dist/stringify/stringifyString.d.ts +9 -0
  227. package/node_modules/yaml/dist/stringify/stringifyString.js +338 -0
  228. package/node_modules/yaml/dist/test-events.d.ts +4 -0
  229. package/node_modules/yaml/dist/test-events.js +134 -0
  230. package/node_modules/yaml/dist/util.d.ts +16 -0
  231. package/node_modules/yaml/dist/util.js +28 -0
  232. package/node_modules/yaml/dist/visit.d.ts +102 -0
  233. package/node_modules/yaml/dist/visit.js +236 -0
  234. package/node_modules/yaml/package.json +97 -0
  235. package/node_modules/yaml/util.js +2 -0
  236. package/package.json +8 -2
  237. package/src/claude-config.mjs +60 -2
  238. package/src/claude-hook.mjs +20 -7
  239. package/src/client-registry.mjs +13 -0
  240. package/src/delivery-sync.mjs +14 -0
  241. package/src/health.mjs +15 -0
  242. package/src/hermes-config.mjs +283 -0
  243. package/src/hermes-health.mjs +45 -0
  244. package/src/hermes-hook.mjs +86 -0
  245. package/src/hermes-plugin.py +67 -0
  246. package/src/host-hook.mjs +4 -7
  247. package/src/install.mjs +10 -2
  248. package/src/installer-cli.mjs +25 -3
  249. package/src/instructions.mjs +34 -15
  250. package/src/runtime.mjs +1 -1
  251. package/src/skill-guard.mjs +171 -0
  252. package/src/skills-sync.mjs +32 -16
  253. package/src/version.mjs +3 -3
@@ -0,0 +1,226 @@
1
+ import { Scalar } from '../nodes/Scalar.js';
2
+ import { resolveEnd } from './resolve-end.js';
3
+
4
+ function resolveFlowScalar(scalar, strict, onError) {
5
+ const { offset, type, source, end } = scalar;
6
+ let _type;
7
+ let value;
8
+ const _onError = (rel, code, msg) => onError(offset + rel, code, msg);
9
+ switch (type) {
10
+ case 'scalar':
11
+ _type = Scalar.PLAIN;
12
+ value = plainValue(source, _onError);
13
+ break;
14
+ case 'single-quoted-scalar':
15
+ _type = Scalar.QUOTE_SINGLE;
16
+ value = singleQuotedValue(source, _onError);
17
+ break;
18
+ case 'double-quoted-scalar':
19
+ _type = Scalar.QUOTE_DOUBLE;
20
+ value = doubleQuotedValue(source, _onError);
21
+ break;
22
+ /* istanbul ignore next should not happen */
23
+ default:
24
+ onError(scalar, 'UNEXPECTED_TOKEN', `Expected a flow scalar value, but found: ${type}`);
25
+ return {
26
+ value: '',
27
+ type: null,
28
+ comment: '',
29
+ range: [offset, offset + source.length, offset + source.length]
30
+ };
31
+ }
32
+ const valueEnd = offset + source.length;
33
+ const re = resolveEnd(end, valueEnd, strict, onError);
34
+ return {
35
+ value,
36
+ type: _type,
37
+ comment: re.comment,
38
+ range: [offset, valueEnd, re.offset]
39
+ };
40
+ }
41
+ function plainValue(source, onError) {
42
+ let badChar = '';
43
+ switch (source[0]) {
44
+ /* istanbul ignore next should not happen */
45
+ case '\t':
46
+ badChar = 'a tab character';
47
+ break;
48
+ case ',':
49
+ badChar = 'flow indicator character ,';
50
+ break;
51
+ case '%':
52
+ badChar = 'directive indicator character %';
53
+ break;
54
+ case '|':
55
+ case '>': {
56
+ badChar = `block scalar indicator ${source[0]}`;
57
+ break;
58
+ }
59
+ case '@':
60
+ case '`': {
61
+ badChar = `reserved character ${source[0]}`;
62
+ break;
63
+ }
64
+ }
65
+ if (badChar)
66
+ onError(0, 'BAD_SCALAR_START', `Plain value cannot start with ${badChar}`);
67
+ return unfoldLines(source);
68
+ }
69
+ function singleQuotedValue(source, onError) {
70
+ if (source[source.length - 1] !== "'" || source.length === 1)
71
+ onError(source.length, 'MISSING_CHAR', "Missing closing 'quote");
72
+ return unfoldLines(source.slice(1, -1)).replace(/''/g, "'");
73
+ }
74
+ function unfoldLines(source) {
75
+ const line = /(.*?)\r?\n/sy;
76
+ let match = line.exec(source);
77
+ if (!match)
78
+ return source;
79
+ /**
80
+ * The negative lookbehinds in these RegExps are to
81
+ * prevent causing a polynomial search time in certain cases.
82
+ *
83
+ * The try-catch is for Safari < 16.4 and other old browsers:
84
+ * https://caniuse.com/js-regexp-lookbehind
85
+ */
86
+ let trimEnd, trimBoth;
87
+ try {
88
+ trimEnd = new RegExp('(?<![ \t])[ \t]+$');
89
+ trimBoth = new RegExp('^[ \t]+|(?<![ \t])[ \t]+$', 'g');
90
+ }
91
+ catch {
92
+ trimEnd = /[ \t]+$/;
93
+ trimBoth = /^[ \t]+|[ \t]+$/g;
94
+ }
95
+ let res = match[1].replace(trimEnd, '');
96
+ let sep = ' ';
97
+ let pos = line.lastIndex;
98
+ while ((match = line.exec(source))) {
99
+ const lm = match[1].replace(trimBoth, '');
100
+ if (lm === '') {
101
+ if (sep === '\n')
102
+ res += sep;
103
+ else
104
+ sep = '\n';
105
+ }
106
+ else {
107
+ res += sep + lm;
108
+ sep = ' ';
109
+ }
110
+ pos = line.lastIndex;
111
+ }
112
+ const last = /[ \t]*(.*)/sy;
113
+ last.lastIndex = pos;
114
+ match = last.exec(source);
115
+ return res + sep + (match?.[1] ?? '');
116
+ }
117
+ function doubleQuotedValue(source, onError) {
118
+ let res = '';
119
+ for (let i = 1; i < source.length - 1; ++i) {
120
+ const ch = source[i];
121
+ if (ch === '\r' && source[i + 1] === '\n')
122
+ continue;
123
+ if (ch === '\n') {
124
+ const { fold, offset } = foldNewline(source, i);
125
+ res += fold;
126
+ i = offset;
127
+ }
128
+ else if (ch === '\\') {
129
+ let next = source[++i];
130
+ const cc = escapeCodes[next];
131
+ if (cc)
132
+ res += cc;
133
+ else if (next === '\n') {
134
+ // skip escaped newlines, but still trim the following line
135
+ next = source[i + 1];
136
+ while (next === ' ' || next === '\t')
137
+ next = source[++i + 1];
138
+ }
139
+ else if (next === '\r' && source[i + 1] === '\n') {
140
+ // skip escaped CRLF newlines, but still trim the following line
141
+ next = source[++i + 1];
142
+ while (next === ' ' || next === '\t')
143
+ next = source[++i + 1];
144
+ }
145
+ else if (next === 'x' || next === 'u' || next === 'U') {
146
+ const length = next === 'x' ? 2 : next === 'u' ? 4 : 8;
147
+ res += parseCharCode(source, i + 1, length, onError);
148
+ i += length;
149
+ }
150
+ else {
151
+ const raw = source.substr(i - 1, 2);
152
+ onError(i - 1, 'BAD_DQ_ESCAPE', `Invalid escape sequence ${raw}`);
153
+ res += raw;
154
+ }
155
+ }
156
+ else if (ch === ' ' || ch === '\t') {
157
+ // trim trailing whitespace
158
+ const wsStart = i;
159
+ let next = source[i + 1];
160
+ while (next === ' ' || next === '\t')
161
+ next = source[++i + 1];
162
+ if (next !== '\n' && !(next === '\r' && source[i + 2] === '\n'))
163
+ res += i > wsStart ? source.slice(wsStart, i + 1) : ch;
164
+ }
165
+ else {
166
+ res += ch;
167
+ }
168
+ }
169
+ if (source[source.length - 1] !== '"' || source.length === 1)
170
+ onError(source.length, 'MISSING_CHAR', 'Missing closing "quote');
171
+ return res;
172
+ }
173
+ /**
174
+ * Fold a single newline into a space, multiple newlines to N - 1 newlines.
175
+ * Presumes `source[offset] === '\n'`
176
+ */
177
+ function foldNewline(source, offset) {
178
+ let fold = '';
179
+ let ch = source[offset + 1];
180
+ while (ch === ' ' || ch === '\t' || ch === '\n' || ch === '\r') {
181
+ if (ch === '\r' && source[offset + 2] !== '\n')
182
+ break;
183
+ if (ch === '\n')
184
+ fold += '\n';
185
+ offset += 1;
186
+ ch = source[offset + 1];
187
+ }
188
+ if (!fold)
189
+ fold = ' ';
190
+ return { fold, offset };
191
+ }
192
+ const escapeCodes = {
193
+ '0': '\0', // null character
194
+ a: '\x07', // bell character
195
+ b: '\b', // backspace
196
+ e: '\x1b', // escape character
197
+ f: '\f', // form feed
198
+ n: '\n', // line feed
199
+ r: '\r', // carriage return
200
+ t: '\t', // horizontal tab
201
+ v: '\v', // vertical tab
202
+ N: '\u0085', // Unicode next line
203
+ _: '\u00a0', // Unicode non-breaking space
204
+ L: '\u2028', // Unicode line separator
205
+ P: '\u2029', // Unicode paragraph separator
206
+ ' ': ' ',
207
+ '"': '"',
208
+ '/': '/',
209
+ '\\': '\\',
210
+ '\t': '\t'
211
+ };
212
+ function parseCharCode(source, offset, length, onError) {
213
+ const cc = source.substr(offset, length);
214
+ const ok = cc.length === length && /^[0-9a-fA-F]+$/.test(cc);
215
+ const code = ok ? parseInt(cc, 16) : NaN;
216
+ try {
217
+ return String.fromCodePoint(code);
218
+ }
219
+ catch {
220
+ const raw = source.substr(offset - 2, length + 2);
221
+ onError(offset - 2, 'BAD_DQ_ESCAPE', `Invalid escape sequence ${raw}`);
222
+ return raw;
223
+ }
224
+ }
225
+
226
+ export { resolveFlowScalar };
@@ -0,0 +1,146 @@
1
+ function resolveProps(tokens, { flow, indicator, next, offset, onError, parentIndent, startOnNewline }) {
2
+ let spaceBefore = false;
3
+ let atNewline = startOnNewline;
4
+ let hasSpace = startOnNewline;
5
+ let comment = '';
6
+ let commentSep = '';
7
+ let hasNewline = false;
8
+ let reqSpace = false;
9
+ let tab = null;
10
+ let anchor = null;
11
+ let tag = null;
12
+ let newlineAfterProp = null;
13
+ let comma = null;
14
+ let found = null;
15
+ let start = null;
16
+ for (const token of tokens) {
17
+ if (reqSpace) {
18
+ if (token.type !== 'space' &&
19
+ token.type !== 'newline' &&
20
+ token.type !== 'comma')
21
+ onError(token.offset, 'MISSING_CHAR', 'Tags and anchors must be separated from the next token by white space');
22
+ reqSpace = false;
23
+ }
24
+ if (tab) {
25
+ if (atNewline && token.type !== 'comment' && token.type !== 'newline') {
26
+ onError(tab, 'TAB_AS_INDENT', 'Tabs are not allowed as indentation');
27
+ }
28
+ tab = null;
29
+ }
30
+ switch (token.type) {
31
+ case 'space':
32
+ // At the doc level, tabs at line start may be parsed
33
+ // as leading white space rather than indentation.
34
+ // In a flow collection, only the parser handles indent.
35
+ if (!flow &&
36
+ (indicator !== 'doc-start' || next?.type !== 'flow-collection') &&
37
+ token.source.includes('\t')) {
38
+ tab = token;
39
+ }
40
+ hasSpace = true;
41
+ break;
42
+ case 'comment': {
43
+ if (!hasSpace)
44
+ onError(token, 'MISSING_CHAR', 'Comments must be separated from other tokens by white space characters');
45
+ const cb = token.source.substring(1) || ' ';
46
+ if (!comment)
47
+ comment = cb;
48
+ else
49
+ comment += commentSep + cb;
50
+ commentSep = '';
51
+ atNewline = false;
52
+ break;
53
+ }
54
+ case 'newline':
55
+ if (atNewline) {
56
+ if (comment)
57
+ comment += token.source;
58
+ else if (!found || indicator !== 'seq-item-ind')
59
+ spaceBefore = true;
60
+ }
61
+ else
62
+ commentSep += token.source;
63
+ atNewline = true;
64
+ hasNewline = true;
65
+ if (anchor || tag)
66
+ newlineAfterProp = token;
67
+ hasSpace = true;
68
+ break;
69
+ case 'anchor':
70
+ if (anchor)
71
+ onError(token, 'MULTIPLE_ANCHORS', 'A node can have at most one anchor');
72
+ if (token.source.endsWith(':'))
73
+ onError(token.offset + token.source.length - 1, 'BAD_ALIAS', 'Anchor ending in : is ambiguous', true);
74
+ anchor = token;
75
+ start ?? (start = token.offset);
76
+ atNewline = false;
77
+ hasSpace = false;
78
+ reqSpace = true;
79
+ break;
80
+ case 'tag': {
81
+ if (tag)
82
+ onError(token, 'MULTIPLE_TAGS', 'A node can have at most one tag');
83
+ tag = token;
84
+ start ?? (start = token.offset);
85
+ atNewline = false;
86
+ hasSpace = false;
87
+ reqSpace = true;
88
+ break;
89
+ }
90
+ case indicator:
91
+ // Could here handle preceding comments differently
92
+ if (anchor || tag)
93
+ onError(token, 'BAD_PROP_ORDER', `Anchors and tags must be after the ${token.source} indicator`);
94
+ if (found)
95
+ onError(token, 'UNEXPECTED_TOKEN', `Unexpected ${token.source} in ${flow ?? 'collection'}`);
96
+ found = token;
97
+ atNewline =
98
+ indicator === 'seq-item-ind' || indicator === 'explicit-key-ind';
99
+ hasSpace = false;
100
+ break;
101
+ case 'comma':
102
+ if (flow) {
103
+ if (comma)
104
+ onError(token, 'UNEXPECTED_TOKEN', `Unexpected , in ${flow}`);
105
+ comma = token;
106
+ atNewline = false;
107
+ hasSpace = false;
108
+ break;
109
+ }
110
+ // else fallthrough
111
+ default:
112
+ onError(token, 'UNEXPECTED_TOKEN', `Unexpected ${token.type} token`);
113
+ atNewline = false;
114
+ hasSpace = false;
115
+ }
116
+ }
117
+ const last = tokens[tokens.length - 1];
118
+ const end = last ? last.offset + last.source.length : offset;
119
+ if (reqSpace &&
120
+ next &&
121
+ next.type !== 'space' &&
122
+ next.type !== 'newline' &&
123
+ next.type !== 'comma' &&
124
+ (next.type !== 'scalar' || next.source !== '')) {
125
+ onError(next.offset, 'MISSING_CHAR', 'Tags and anchors must be separated from the next token by white space');
126
+ }
127
+ if (tab &&
128
+ ((atNewline && tab.indent <= parentIndent) ||
129
+ next?.type === 'block-map' ||
130
+ next?.type === 'block-seq'))
131
+ onError(tab, 'TAB_AS_INDENT', 'Tabs are not allowed as indentation');
132
+ return {
133
+ comma,
134
+ found,
135
+ spaceBefore,
136
+ comment,
137
+ hasNewline,
138
+ anchor,
139
+ tag,
140
+ newlineAfterProp,
141
+ end,
142
+ start: start ?? end
143
+ };
144
+ }
145
+
146
+ export { resolveProps };
@@ -0,0 +1,34 @@
1
+ function containsNewline(key) {
2
+ if (!key)
3
+ return null;
4
+ switch (key.type) {
5
+ case 'alias':
6
+ case 'scalar':
7
+ case 'double-quoted-scalar':
8
+ case 'single-quoted-scalar':
9
+ if (key.source.includes('\n'))
10
+ return true;
11
+ if (key.end)
12
+ for (const st of key.end)
13
+ if (st.type === 'newline')
14
+ return true;
15
+ return false;
16
+ case 'flow-collection':
17
+ for (const it of key.items) {
18
+ for (const st of it.start)
19
+ if (st.type === 'newline')
20
+ return true;
21
+ if (it.sep)
22
+ for (const st of it.sep)
23
+ if (st.type === 'newline')
24
+ return true;
25
+ if (containsNewline(it.key) || containsNewline(it.value))
26
+ return true;
27
+ }
28
+ return false;
29
+ default:
30
+ return true;
31
+ }
32
+ }
33
+
34
+ export { containsNewline };
@@ -0,0 +1,26 @@
1
+ function emptyScalarPosition(offset, before, pos) {
2
+ if (before) {
3
+ pos ?? (pos = before.length);
4
+ for (let i = pos - 1; i >= 0; --i) {
5
+ let st = before[i];
6
+ switch (st.type) {
7
+ case 'space':
8
+ case 'comment':
9
+ case 'newline':
10
+ offset -= st.source.length;
11
+ continue;
12
+ }
13
+ // Technically, an empty scalar is immediately after the last non-empty
14
+ // node, but it's more useful to place it after any whitespace.
15
+ st = before[++i];
16
+ while (st?.type === 'space') {
17
+ offset += st.source.length;
18
+ st = before[++i];
19
+ }
20
+ break;
21
+ }
22
+ }
23
+ return offset;
24
+ }
25
+
26
+ export { emptyScalarPosition };
@@ -0,0 +1,15 @@
1
+ import { containsNewline } from './util-contains-newline.js';
2
+
3
+ function flowIndentCheck(indent, fc, onError) {
4
+ if (fc?.type === 'flow-collection') {
5
+ const end = fc.end[0];
6
+ if (end.indent === indent &&
7
+ (end.source === ']' || end.source === '}') &&
8
+ containsNewline(fc)) {
9
+ const msg = 'Flow end indicator should be more indented than parent';
10
+ onError(end, 'BAD_INDENT', msg, true);
11
+ }
12
+ }
13
+ }
14
+
15
+ export { flowIndentCheck };
@@ -0,0 +1,13 @@
1
+ import { isScalar } from '../nodes/identity.js';
2
+
3
+ function mapIncludes(ctx, items, search) {
4
+ const { uniqueKeys } = ctx.options;
5
+ if (uniqueKeys === false)
6
+ return false;
7
+ const isEqual = typeof uniqueKeys === 'function'
8
+ ? uniqueKeys
9
+ : (a, b) => a === b || (isScalar(a) && isScalar(b) && a.value === b.value);
10
+ return items.some(pair => isEqual(pair.key, search));
11
+ }
12
+
13
+ export { mapIncludes };