dsh-plugin-prompt-tool 0.4.2 → 0.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 (188) hide show
  1. package/README.md +125 -222
  2. package/engine/compaction-epoch.mjs +139 -0
  3. package/engine/compositions/library/bootstrap-filesystem.yml +19 -0
  4. package/engine/compositions/library/compaction.yml +52 -0
  5. package/engine/compositions/library/context-gate.yml +40 -0
  6. package/engine/compositions/library/custom-bash.yml +14 -0
  7. package/engine/compositions/library/delegation.yml +85 -0
  8. package/engine/compositions/library/official-agent-instructions.yml +17 -0
  9. package/engine/compositions/library/official-persistent-shell.yml +56 -0
  10. package/engine/compositions/library/official-skill-filesystem-cordis.yml +10 -0
  11. package/engine/compositions/library/official-tool-bash.yml +6 -0
  12. package/engine/compositions/library/official-tool-cordis.yml +13 -0
  13. package/engine/compositions/library/official-tool-presentation.yml +7 -0
  14. package/engine/compositions/library/official-tool-skill.yml +14 -0
  15. package/engine/compositions/library/persistent-shell.yml +36 -0
  16. package/engine/compositions/library/persona.yml +9 -0
  17. package/engine/compositions/library/planning.yml +41 -0
  18. package/engine/compositions/library/prompt-config-engine.yml +16 -0
  19. package/engine/compositions/library/router-first-turn.yml +9 -0
  20. package/engine/compositions/library/run-code-env.yml +15 -0
  21. package/engine/compositions/library/skill-filesystem.yml +13 -0
  22. package/engine/compositions/library/skill-search.yml +14 -0
  23. package/engine/compositions/library/str-replace-editor.yml +10 -0
  24. package/engine/compositions/library/tool-ask-user.yml +8 -0
  25. package/engine/compositions/library/tool-bash.yml +16 -0
  26. package/engine/compositions/library/tool-bootstrap.yml +16 -0
  27. package/engine/compositions/library/tool-filter.yml +12 -0
  28. package/engine/compositions/library/tool-fs-search.yml +18 -0
  29. package/engine/compositions/library/tool-fs.yml +10 -0
  30. package/engine/compositions/library/tool-goal.yml +19 -0
  31. package/engine/compositions/library/tool-jobs.yml +23 -0
  32. package/engine/compositions/library/tool-pwsh.yml +12 -0
  33. package/engine/compositions/library/tool-todo.yml +11 -0
  34. package/engine/compositions/library/tool-web.yml +9 -0
  35. package/engine/compositions/source/local/context-gate.yml +37 -0
  36. package/engine/compositions/source/local/custom-bash.yml +11 -0
  37. package/engine/compositions/source/local/prompt-config-engine.yml +13 -0
  38. package/engine/compositions/source/local/router-first-turn.yml +5 -0
  39. package/engine/compositions/source/local/run-code-env.yml +12 -0
  40. package/engine/compositions/source/local/skill-search.yml +11 -0
  41. package/engine/compositions/source/local/tool-bootstrap.yml +13 -0
  42. package/engine/context-gate.mjs +305 -0
  43. package/{preset → engine}/custom-bash.mjs +243 -243
  44. package/engine/executor.mjs +271 -0
  45. package/engine/fillers.mjs +273 -0
  46. package/engine/layers.mjs +220 -0
  47. package/engine/prompt-config-engine.mjs +49 -0
  48. package/{preset → engine}/router-first-turn.mjs +85 -73
  49. package/engine/run-code-env.mjs +208 -0
  50. package/engine/schema.mjs +294 -0
  51. package/{preset → engine}/shared.mjs +54 -0
  52. package/engine/strategies.mjs +223 -0
  53. package/{preset → engine}/tool-bootstrap.mjs +350 -282
  54. package/engine/tool-filter.mjs +80 -0
  55. package/engine/vendor/yaml/LICENSE +13 -0
  56. package/engine/vendor/yaml/dist/compose/compose-collection.js +88 -0
  57. package/engine/vendor/yaml/dist/compose/compose-doc.js +43 -0
  58. package/engine/vendor/yaml/dist/compose/compose-node.js +109 -0
  59. package/engine/vendor/yaml/dist/compose/compose-scalar.js +86 -0
  60. package/engine/vendor/yaml/dist/compose/composer.js +219 -0
  61. package/engine/vendor/yaml/dist/compose/resolve-block-map.js +115 -0
  62. package/engine/vendor/yaml/dist/compose/resolve-block-scalar.js +198 -0
  63. package/engine/vendor/yaml/dist/compose/resolve-block-seq.js +49 -0
  64. package/engine/vendor/yaml/dist/compose/resolve-end.js +37 -0
  65. package/engine/vendor/yaml/dist/compose/resolve-flow-collection.js +207 -0
  66. package/engine/vendor/yaml/dist/compose/resolve-flow-scalar.js +225 -0
  67. package/engine/vendor/yaml/dist/compose/resolve-props.js +146 -0
  68. package/engine/vendor/yaml/dist/compose/util-contains-newline.js +34 -0
  69. package/engine/vendor/yaml/dist/compose/util-empty-scalar-position.js +26 -0
  70. package/engine/vendor/yaml/dist/compose/util-flow-indent-check.js +15 -0
  71. package/engine/vendor/yaml/dist/compose/util-map-includes.js +13 -0
  72. package/engine/vendor/yaml/dist/doc/Document.js +335 -0
  73. package/engine/vendor/yaml/dist/doc/anchors.js +71 -0
  74. package/engine/vendor/yaml/dist/doc/applyReviver.js +55 -0
  75. package/engine/vendor/yaml/dist/doc/createNode.js +88 -0
  76. package/engine/vendor/yaml/dist/doc/directives.js +176 -0
  77. package/engine/vendor/yaml/dist/errors.js +57 -0
  78. package/engine/vendor/yaml/dist/index.js +17 -0
  79. package/engine/vendor/yaml/dist/log.js +11 -0
  80. package/engine/vendor/yaml/dist/nodes/Alias.js +116 -0
  81. package/engine/vendor/yaml/dist/nodes/Collection.js +147 -0
  82. package/engine/vendor/yaml/dist/nodes/Node.js +38 -0
  83. package/engine/vendor/yaml/dist/nodes/Pair.js +36 -0
  84. package/engine/vendor/yaml/dist/nodes/Scalar.js +24 -0
  85. package/engine/vendor/yaml/dist/nodes/YAMLMap.js +144 -0
  86. package/engine/vendor/yaml/dist/nodes/YAMLSeq.js +113 -0
  87. package/engine/vendor/yaml/dist/nodes/addPairToJSMap.js +63 -0
  88. package/engine/vendor/yaml/dist/nodes/identity.js +36 -0
  89. package/engine/vendor/yaml/dist/nodes/toJS.js +37 -0
  90. package/engine/vendor/yaml/dist/parse/cst-scalar.js +214 -0
  91. package/engine/vendor/yaml/dist/parse/cst-stringify.js +61 -0
  92. package/engine/vendor/yaml/dist/parse/cst-visit.js +97 -0
  93. package/engine/vendor/yaml/dist/parse/cst.js +98 -0
  94. package/engine/vendor/yaml/dist/parse/lexer.js +721 -0
  95. package/engine/vendor/yaml/dist/parse/line-counter.js +39 -0
  96. package/engine/vendor/yaml/dist/parse/parser.js +975 -0
  97. package/engine/vendor/yaml/dist/public-api.js +102 -0
  98. package/engine/vendor/yaml/dist/schema/Schema.js +37 -0
  99. package/engine/vendor/yaml/dist/schema/common/map.js +17 -0
  100. package/engine/vendor/yaml/dist/schema/common/null.js +15 -0
  101. package/engine/vendor/yaml/dist/schema/common/seq.js +17 -0
  102. package/engine/vendor/yaml/dist/schema/common/string.js +14 -0
  103. package/engine/vendor/yaml/dist/schema/core/bool.js +19 -0
  104. package/engine/vendor/yaml/dist/schema/core/float.js +43 -0
  105. package/engine/vendor/yaml/dist/schema/core/int.js +38 -0
  106. package/engine/vendor/yaml/dist/schema/core/schema.js +23 -0
  107. package/engine/vendor/yaml/dist/schema/json/schema.js +62 -0
  108. package/engine/vendor/yaml/dist/schema/tags.js +96 -0
  109. package/engine/vendor/yaml/dist/schema/yaml-1.1/binary.js +58 -0
  110. package/engine/vendor/yaml/dist/schema/yaml-1.1/bool.js +26 -0
  111. package/engine/vendor/yaml/dist/schema/yaml-1.1/float.js +46 -0
  112. package/engine/vendor/yaml/dist/schema/yaml-1.1/int.js +71 -0
  113. package/engine/vendor/yaml/dist/schema/yaml-1.1/merge.js +67 -0
  114. package/engine/vendor/yaml/dist/schema/yaml-1.1/omap.js +74 -0
  115. package/engine/vendor/yaml/dist/schema/yaml-1.1/pairs.js +78 -0
  116. package/engine/vendor/yaml/dist/schema/yaml-1.1/schema.js +39 -0
  117. package/engine/vendor/yaml/dist/schema/yaml-1.1/set.js +93 -0
  118. package/engine/vendor/yaml/dist/schema/yaml-1.1/timestamp.js +101 -0
  119. package/engine/vendor/yaml/dist/stringify/foldFlowLines.js +146 -0
  120. package/engine/vendor/yaml/dist/stringify/stringify.js +129 -0
  121. package/engine/vendor/yaml/dist/stringify/stringifyCollection.js +153 -0
  122. package/engine/vendor/yaml/dist/stringify/stringifyComment.js +20 -0
  123. package/engine/vendor/yaml/dist/stringify/stringifyDocument.js +85 -0
  124. package/engine/vendor/yaml/dist/stringify/stringifyNumber.js +25 -0
  125. package/engine/vendor/yaml/dist/stringify/stringifyPair.js +150 -0
  126. package/engine/vendor/yaml/dist/stringify/stringifyString.js +336 -0
  127. package/engine/vendor/yaml/dist/util.js +11 -0
  128. package/engine/vendor/yaml/dist/visit.js +233 -0
  129. package/engine/vendor/yaml/index.js +5 -0
  130. package/engine/vendor/yaml/package.json +11 -0
  131. package/lib/client.js +4421 -781
  132. package/lib/client.js.map +1 -1
  133. package/lib/index.d.mts +504 -51
  134. package/lib/index.mjs +3871 -731
  135. package/lib/preset-core.d.mts +7 -37
  136. package/lib/preset-core.mjs +44 -283
  137. package/lib/prompt-configs-BcP6miu9.d.mts +102 -0
  138. package/lib/prompt-configs-k7wuZs0C.mjs +719 -0
  139. package/package.json +104 -98
  140. package/preset/anchored/preset.yml +344 -0
  141. package/preset/creative/preset.yml +62 -0
  142. package/preset/custom/preset.yml +13 -0
  143. package/preset/liangshen/preset.yml +66 -0
  144. package/preset/minimal/preset.yml +41 -0
  145. package/preset/ptc/preset.yml +50 -0
  146. package/preset/standard/preset.yml +49 -0
  147. package/skills/manifest.json +7 -0
  148. package/skills/sandboxmod/SKILL.md +49 -49
  149. package/skills/web ui/SKILL.md +42 -0
  150. package/templates/10-pre-step.yml +28 -0
  151. package/templates/11-merged-a.yml +11 -0
  152. package/templates/13-anchor.yml +19 -0
  153. package/templates/14-first-turn-anchor.yml +27 -0
  154. package/templates/15-guide-auto.yml +25 -0
  155. package/templates/16-custom-fallback.yml +21 -0
  156. package/templates/17-instruction-hint.yml +23 -0
  157. package/templates/18-placeholder-env-facts.yml +11 -0
  158. package/templates/19-placeholder-skill-catalog.yml +19 -0
  159. package/templates/20-system-section.yml +14 -0
  160. package/templates/30-runtime-context.yml +10 -0
  161. package/templates/31-runtime-context-placeholder.yml +18 -0
  162. package/templates/40-agent-request.yml +11 -0
  163. package/templates/50-llm-stream.yml +9 -0
  164. package/templates/60-tool-pipeline.yml +12 -0
  165. package/AGENTS.md +0 -4
  166. package/plan.md +0 -312
  167. package/preset/agent.cordis.yml +0 -443
  168. package/preset/compaction-epoch.mjs +0 -81
  169. package/preset/context-gate.mjs +0 -165
  170. package/preset/instruction-hint.mjs +0 -217
  171. package/preset/near-anchor.mjs +0 -101
  172. package/preset/preset.yml +0 -3
  173. package/preset/prompt-injector.mjs +0 -112
  174. package/preset/router-guide.mjs +0 -79
  175. package/preset.md +0 -115
  176. package/upstream/dsh-anchored-standard/LICENSE +0 -22
  177. package/upstream/dsh-anchored-standard/NOTICE +0 -19
  178. package/upstream/dsh-anchored-standard/REVISION +0 -1
  179. package/upstream/dsh-anchored-standard/preset/agent.cordis.yml +0 -440
  180. package/upstream/dsh-anchored-standard/preset/compaction-epoch.mjs +0 -81
  181. package/upstream/dsh-anchored-standard/preset/context-gate.mjs +0 -202
  182. package/upstream/dsh-anchored-standard/preset/custom-bash.mjs +0 -219
  183. package/upstream/dsh-anchored-standard/preset/dev-tool-search.mjs +0 -131
  184. package/upstream/dsh-anchored-standard/preset/instruction-hint.mjs +0 -231
  185. package/upstream/dsh-anchored-standard/preset/preset.yml +0 -3
  186. package/upstream/dsh-anchored-standard/preset/skill-search.mjs +0 -142
  187. package/upstream/dsh-anchored-standard/preset/tool-bootstrap.mjs +0 -301
  188. /package/{preset → engine}/skill-search.mjs +0 -0
@@ -0,0 +1,129 @@
1
+ import { anchorIsValid } from '../doc/anchors.js';
2
+ import { isPair, isAlias, isNode, isScalar, isCollection } from '../nodes/identity.js';
3
+ import { stringifyComment } from './stringifyComment.js';
4
+ import { stringifyString } from './stringifyString.js';
5
+
6
+ function createStringifyContext(doc, options) {
7
+ const opt = Object.assign({
8
+ blockQuote: true,
9
+ commentString: stringifyComment,
10
+ defaultKeyType: null,
11
+ defaultStringType: 'PLAIN',
12
+ directives: null,
13
+ doubleQuotedAsJSON: false,
14
+ doubleQuotedMinMultiLineLength: 40,
15
+ falseStr: 'false',
16
+ flowCollectionPadding: true,
17
+ indentSeq: true,
18
+ lineWidth: 80,
19
+ minContentWidth: 20,
20
+ nullStr: 'null',
21
+ simpleKeys: false,
22
+ singleQuote: null,
23
+ trailingComma: false,
24
+ trueStr: 'true',
25
+ verifyAliasOrder: true
26
+ }, doc.schema.toStringOptions, options);
27
+ let inFlow;
28
+ switch (opt.collectionStyle) {
29
+ case 'block':
30
+ inFlow = false;
31
+ break;
32
+ case 'flow':
33
+ inFlow = true;
34
+ break;
35
+ default:
36
+ inFlow = null;
37
+ }
38
+ return {
39
+ anchors: new Set(),
40
+ doc,
41
+ flowCollectionPadding: opt.flowCollectionPadding ? ' ' : '',
42
+ indent: '',
43
+ indentStep: typeof opt.indent === 'number' ? ' '.repeat(opt.indent) : ' ',
44
+ inFlow,
45
+ options: opt
46
+ };
47
+ }
48
+ function getTagObject(tags, item) {
49
+ if (item.tag) {
50
+ const match = tags.filter(t => t.tag === item.tag);
51
+ if (match.length > 0)
52
+ return match.find(t => t.format === item.format) ?? match[0];
53
+ }
54
+ let tagObj = undefined;
55
+ let obj;
56
+ if (isScalar(item)) {
57
+ obj = item.value;
58
+ let match = tags.filter(t => t.identify?.(obj));
59
+ if (match.length > 1) {
60
+ const testMatch = match.filter(t => t.test);
61
+ if (testMatch.length > 0)
62
+ match = testMatch;
63
+ }
64
+ tagObj =
65
+ match.find(t => t.format === item.format) ?? match.find(t => !t.format);
66
+ }
67
+ else {
68
+ obj = item;
69
+ tagObj = tags.find(t => t.nodeClass && obj instanceof t.nodeClass);
70
+ }
71
+ if (!tagObj) {
72
+ const name = obj?.constructor?.name ?? (obj === null ? 'null' : typeof obj);
73
+ throw new Error(`Tag not resolved for ${name} value`);
74
+ }
75
+ return tagObj;
76
+ }
77
+ // needs to be called before value stringifier to allow for circular anchor refs
78
+ function stringifyProps(node, tagObj, { anchors, doc }) {
79
+ if (!doc.directives)
80
+ return '';
81
+ const props = [];
82
+ const anchor = (isScalar(node) || isCollection(node)) && node.anchor;
83
+ if (anchor && anchorIsValid(anchor)) {
84
+ anchors.add(anchor);
85
+ props.push(`&${anchor}`);
86
+ }
87
+ const tag = node.tag ?? (tagObj.default ? null : tagObj.tag);
88
+ if (tag)
89
+ props.push(doc.directives.tagString(tag));
90
+ return props.join(' ');
91
+ }
92
+ function stringify(item, ctx, onComment, onChompKeep) {
93
+ if (isPair(item))
94
+ return item.toString(ctx, onComment, onChompKeep);
95
+ if (isAlias(item)) {
96
+ if (ctx.doc.directives)
97
+ return item.toString(ctx);
98
+ if (ctx.resolvedAliases?.has(item)) {
99
+ throw new TypeError(`Cannot stringify circular structure without alias nodes`);
100
+ }
101
+ else {
102
+ if (ctx.resolvedAliases)
103
+ ctx.resolvedAliases.add(item);
104
+ else
105
+ ctx.resolvedAliases = new Set([item]);
106
+ item = item.resolve(ctx.doc);
107
+ }
108
+ }
109
+ let tagObj = undefined;
110
+ const node = isNode(item)
111
+ ? item
112
+ : ctx.doc.createNode(item, { onTagObj: o => (tagObj = o) });
113
+ tagObj ?? (tagObj = getTagObject(ctx.doc.schema.tags, node));
114
+ const props = stringifyProps(node, tagObj, ctx);
115
+ if (props.length > 0)
116
+ ctx.indentAtStart = (ctx.indentAtStart ?? 0) + props.length + 1;
117
+ const str = typeof tagObj.stringify === 'function'
118
+ ? tagObj.stringify(node, ctx, onComment, onChompKeep)
119
+ : isScalar(node)
120
+ ? stringifyString(node, ctx, onComment, onChompKeep)
121
+ : node.toString(ctx, onComment, onChompKeep);
122
+ if (!props)
123
+ return str;
124
+ return isScalar(node) || str[0] === '{' || str[0] === '['
125
+ ? `${props} ${str}`
126
+ : `${props}\n${ctx.indent}${str}`;
127
+ }
128
+
129
+ export { createStringifyContext, stringify };
@@ -0,0 +1,153 @@
1
+ import { isNode, isPair } from '../nodes/identity.js';
2
+ import { stringify } from './stringify.js';
3
+ import { lineComment, indentComment } from './stringifyComment.js';
4
+
5
+ function stringifyCollection(collection, ctx, options) {
6
+ const flow = ctx.inFlow ?? collection.flow;
7
+ const stringify = flow ? stringifyFlowCollection : stringifyBlockCollection;
8
+ return stringify(collection, ctx, options);
9
+ }
10
+ function stringifyBlockCollection({ comment, items }, ctx, { blockItemPrefix, flowChars, itemIndent, onChompKeep, onComment }) {
11
+ const { indent, options: { commentString } } = ctx;
12
+ const itemCtx = Object.assign({}, ctx, { indent: itemIndent, type: null });
13
+ let chompKeep = false; // flag for the preceding node's status
14
+ const lines = [];
15
+ for (let i = 0; i < items.length; ++i) {
16
+ const item = items[i];
17
+ let comment = null;
18
+ if (isNode(item)) {
19
+ if (!chompKeep && item.spaceBefore)
20
+ lines.push('');
21
+ addCommentBefore(ctx, lines, item.commentBefore, chompKeep);
22
+ if (item.comment)
23
+ comment = item.comment;
24
+ }
25
+ else if (isPair(item)) {
26
+ const ik = isNode(item.key) ? item.key : null;
27
+ if (ik) {
28
+ if (!chompKeep && ik.spaceBefore)
29
+ lines.push('');
30
+ addCommentBefore(ctx, lines, ik.commentBefore, chompKeep);
31
+ }
32
+ }
33
+ chompKeep = false;
34
+ let str = stringify(item, itemCtx, () => (comment = null), () => (chompKeep = true));
35
+ if (comment)
36
+ str += lineComment(str, itemIndent, commentString(comment));
37
+ if (chompKeep && comment)
38
+ chompKeep = false;
39
+ lines.push(blockItemPrefix + str);
40
+ }
41
+ let str;
42
+ if (lines.length === 0) {
43
+ str = flowChars.start + flowChars.end;
44
+ }
45
+ else {
46
+ str = lines[0];
47
+ for (let i = 1; i < lines.length; ++i) {
48
+ const line = lines[i];
49
+ str += line ? `\n${indent}${line}` : '\n';
50
+ }
51
+ }
52
+ if (comment) {
53
+ str += '\n' + indentComment(commentString(comment), indent);
54
+ if (onComment)
55
+ onComment();
56
+ }
57
+ else if (chompKeep && onChompKeep)
58
+ onChompKeep();
59
+ return str;
60
+ }
61
+ function stringifyFlowCollection({ items }, ctx, { flowChars, itemIndent }) {
62
+ const { indent, indentStep, flowCollectionPadding: fcPadding, options: { commentString } } = ctx;
63
+ itemIndent += indentStep;
64
+ const itemCtx = Object.assign({}, ctx, {
65
+ indent: itemIndent,
66
+ inFlow: true,
67
+ type: null
68
+ });
69
+ let reqNewline = false;
70
+ let linesAtValue = 0;
71
+ const lines = [];
72
+ for (let i = 0; i < items.length; ++i) {
73
+ const item = items[i];
74
+ let comment = null;
75
+ if (isNode(item)) {
76
+ if (item.spaceBefore)
77
+ lines.push('');
78
+ addCommentBefore(ctx, lines, item.commentBefore, false);
79
+ if (item.comment)
80
+ comment = item.comment;
81
+ }
82
+ else if (isPair(item)) {
83
+ const ik = isNode(item.key) ? item.key : null;
84
+ if (ik) {
85
+ if (ik.spaceBefore)
86
+ lines.push('');
87
+ addCommentBefore(ctx, lines, ik.commentBefore, false);
88
+ if (ik.comment)
89
+ reqNewline = true;
90
+ }
91
+ const iv = isNode(item.value) ? item.value : null;
92
+ if (iv) {
93
+ if (iv.comment)
94
+ comment = iv.comment;
95
+ if (iv.commentBefore)
96
+ reqNewline = true;
97
+ }
98
+ else if (item.value == null && ik?.comment) {
99
+ comment = ik.comment;
100
+ }
101
+ }
102
+ if (comment)
103
+ reqNewline = true;
104
+ let str = stringify(item, itemCtx, () => (comment = null));
105
+ reqNewline || (reqNewline = lines.length > linesAtValue || str.includes('\n'));
106
+ if (i < items.length - 1) {
107
+ str += ',';
108
+ }
109
+ else if (ctx.options.trailingComma) {
110
+ if (ctx.options.lineWidth > 0) {
111
+ reqNewline || (reqNewline = lines.reduce((sum, line) => sum + line.length + 2, 2) +
112
+ (str.length + 2) >
113
+ ctx.options.lineWidth);
114
+ }
115
+ if (reqNewline) {
116
+ str += ',';
117
+ }
118
+ }
119
+ if (comment)
120
+ str += lineComment(str, itemIndent, commentString(comment));
121
+ lines.push(str);
122
+ linesAtValue = lines.length;
123
+ }
124
+ const { start, end } = flowChars;
125
+ if (lines.length === 0) {
126
+ return start + end;
127
+ }
128
+ else {
129
+ if (!reqNewline) {
130
+ const len = lines.reduce((sum, line) => sum + line.length + 2, 2);
131
+ reqNewline = ctx.options.lineWidth > 0 && len > ctx.options.lineWidth;
132
+ }
133
+ if (reqNewline) {
134
+ let str = start;
135
+ for (const line of lines)
136
+ str += line ? `\n${indentStep}${indent}${line}` : '\n';
137
+ return `${str}\n${indent}${end}`;
138
+ }
139
+ else {
140
+ return `${start}${fcPadding}${lines.join(' ')}${fcPadding}${end}`;
141
+ }
142
+ }
143
+ }
144
+ function addCommentBefore({ indent, options: { commentString } }, lines, comment, chompKeep) {
145
+ if (comment && chompKeep)
146
+ comment = comment.replace(/^\n+/, '');
147
+ if (comment) {
148
+ const ic = indentComment(commentString(comment), indent);
149
+ lines.push(ic.trimStart()); // Avoid double indent on first line
150
+ }
151
+ }
152
+
153
+ export { stringifyCollection };
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Stringifies a comment.
3
+ *
4
+ * Empty comment lines are left empty,
5
+ * lines consisting of a single space are replaced by `#`,
6
+ * and all other lines are prefixed with a `#`.
7
+ */
8
+ const stringifyComment = (str) => str.replace(/^(?!$)(?: $)?/gm, '#');
9
+ function indentComment(comment, indent) {
10
+ if (/^\n+$/.test(comment))
11
+ return comment.substring(1);
12
+ return indent ? comment.replace(/^(?! *$)/gm, indent) : comment;
13
+ }
14
+ const lineComment = (str, indent, comment) => str.endsWith('\n')
15
+ ? indentComment(comment, indent)
16
+ : comment.includes('\n')
17
+ ? '\n' + indentComment(comment, indent)
18
+ : (str.endsWith(' ') ? '' : ' ') + comment;
19
+
20
+ export { indentComment, lineComment, stringifyComment };
@@ -0,0 +1,85 @@
1
+ import { isNode } from '../nodes/identity.js';
2
+ import { createStringifyContext, stringify } from './stringify.js';
3
+ import { indentComment, lineComment } from './stringifyComment.js';
4
+
5
+ function stringifyDocument(doc, options) {
6
+ const lines = [];
7
+ let hasDirectives = options.directives === true;
8
+ if (options.directives !== false && doc.directives) {
9
+ const dir = doc.directives.toString(doc);
10
+ if (dir) {
11
+ lines.push(dir);
12
+ hasDirectives = true;
13
+ }
14
+ else if (doc.directives.docStart)
15
+ hasDirectives = true;
16
+ }
17
+ if (hasDirectives)
18
+ lines.push('---');
19
+ const ctx = createStringifyContext(doc, options);
20
+ const { commentString } = ctx.options;
21
+ if (doc.commentBefore) {
22
+ if (lines.length !== 1)
23
+ lines.unshift('');
24
+ const cs = commentString(doc.commentBefore);
25
+ lines.unshift(indentComment(cs, ''));
26
+ }
27
+ let chompKeep = false;
28
+ let contentComment = null;
29
+ if (doc.contents) {
30
+ if (isNode(doc.contents)) {
31
+ if (doc.contents.spaceBefore && hasDirectives)
32
+ lines.push('');
33
+ if (doc.contents.commentBefore) {
34
+ const cs = commentString(doc.contents.commentBefore);
35
+ lines.push(indentComment(cs, ''));
36
+ }
37
+ // top-level block scalars need to be indented if followed by a comment
38
+ ctx.forceBlockIndent = !!doc.comment;
39
+ contentComment = doc.contents.comment;
40
+ }
41
+ const onChompKeep = contentComment ? undefined : () => (chompKeep = true);
42
+ let body = stringify(doc.contents, ctx, () => (contentComment = null), onChompKeep);
43
+ if (contentComment)
44
+ body += lineComment(body, '', commentString(contentComment));
45
+ if ((body[0] === '|' || body[0] === '>') &&
46
+ lines[lines.length - 1] === '---') {
47
+ // Top-level block scalars with a preceding doc marker ought to use the
48
+ // same line for their header.
49
+ lines[lines.length - 1] = `--- ${body}`;
50
+ }
51
+ else
52
+ lines.push(body);
53
+ }
54
+ else {
55
+ lines.push(stringify(doc.contents, ctx));
56
+ }
57
+ if (doc.directives?.docEnd) {
58
+ if (doc.comment) {
59
+ const cs = commentString(doc.comment);
60
+ if (cs.includes('\n')) {
61
+ lines.push('...');
62
+ lines.push(indentComment(cs, ''));
63
+ }
64
+ else {
65
+ lines.push(`... ${cs}`);
66
+ }
67
+ }
68
+ else {
69
+ lines.push('...');
70
+ }
71
+ }
72
+ else {
73
+ let dc = doc.comment;
74
+ if (dc && chompKeep)
75
+ dc = dc.replace(/^\n+/, '');
76
+ if (dc) {
77
+ if ((!chompKeep || contentComment) && lines[lines.length - 1] !== '')
78
+ lines.push('');
79
+ lines.push(indentComment(commentString(dc), ''));
80
+ }
81
+ }
82
+ return lines.join('\n') + '\n';
83
+ }
84
+
85
+ export { stringifyDocument };
@@ -0,0 +1,25 @@
1
+ function stringifyNumber({ format, minFractionDigits, tag, value }) {
2
+ if (typeof value === 'bigint')
3
+ return String(value);
4
+ const num = typeof value === 'number' ? value : Number(value);
5
+ if (!isFinite(num))
6
+ return isNaN(num) ? '.nan' : num < 0 ? '-.inf' : '.inf';
7
+ let n = Object.is(value, -0) ? '-0' : JSON.stringify(value);
8
+ if (!format &&
9
+ minFractionDigits &&
10
+ (!tag || tag === 'tag:yaml.org,2002:float') &&
11
+ /^-?\d/.test(n) &&
12
+ !n.includes('e')) {
13
+ let i = n.indexOf('.');
14
+ if (i < 0) {
15
+ i = n.length;
16
+ n += '.';
17
+ }
18
+ let d = minFractionDigits - (n.length - i - 1);
19
+ while (d-- > 0)
20
+ n += '0';
21
+ }
22
+ return n;
23
+ }
24
+
25
+ export { stringifyNumber };
@@ -0,0 +1,150 @@
1
+ import { isCollection, isNode, isScalar, isSeq } from '../nodes/identity.js';
2
+ import { Scalar } from '../nodes/Scalar.js';
3
+ import { stringify } from './stringify.js';
4
+ import { lineComment, indentComment } from './stringifyComment.js';
5
+
6
+ function stringifyPair({ key, value }, ctx, onComment, onChompKeep) {
7
+ const { allNullValues, doc, indent, indentStep, options: { commentString, indentSeq, simpleKeys } } = ctx;
8
+ let keyComment = (isNode(key) && key.comment) || null;
9
+ if (simpleKeys) {
10
+ if (keyComment) {
11
+ throw new Error('With simple keys, key nodes cannot have comments');
12
+ }
13
+ if (isCollection(key) || (!isNode(key) && typeof key === 'object')) {
14
+ const msg = 'With simple keys, collection cannot be used as a key value';
15
+ throw new Error(msg);
16
+ }
17
+ }
18
+ let explicitKey = !simpleKeys &&
19
+ (!key ||
20
+ (keyComment && value == null && !ctx.inFlow) ||
21
+ isCollection(key) ||
22
+ (isScalar(key)
23
+ ? key.type === Scalar.BLOCK_FOLDED || key.type === Scalar.BLOCK_LITERAL
24
+ : typeof key === 'object'));
25
+ ctx = Object.assign({}, ctx, {
26
+ allNullValues: false,
27
+ implicitKey: !explicitKey && (simpleKeys || !allNullValues),
28
+ indent: indent + indentStep
29
+ });
30
+ let keyCommentDone = false;
31
+ let chompKeep = false;
32
+ let str = stringify(key, ctx, () => (keyCommentDone = true), () => (chompKeep = true));
33
+ if (!explicitKey && !ctx.inFlow && str.length > 1024) {
34
+ if (simpleKeys)
35
+ throw new Error('With simple keys, single line scalar must not span more than 1024 characters');
36
+ explicitKey = true;
37
+ }
38
+ if (ctx.inFlow) {
39
+ if (allNullValues || value == null) {
40
+ if (keyCommentDone && onComment)
41
+ onComment();
42
+ return str === '' ? '?' : explicitKey ? `? ${str}` : str;
43
+ }
44
+ }
45
+ else if ((allNullValues && !simpleKeys) || (value == null && explicitKey)) {
46
+ str = `? ${str}`;
47
+ if (keyComment && !keyCommentDone) {
48
+ str += lineComment(str, ctx.indent, commentString(keyComment));
49
+ }
50
+ else if (chompKeep && onChompKeep)
51
+ onChompKeep();
52
+ return str;
53
+ }
54
+ if (keyCommentDone)
55
+ keyComment = null;
56
+ if (explicitKey) {
57
+ if (keyComment)
58
+ str += lineComment(str, ctx.indent, commentString(keyComment));
59
+ str = `? ${str}\n${indent}:`;
60
+ }
61
+ else {
62
+ str = `${str}:`;
63
+ if (keyComment)
64
+ str += lineComment(str, ctx.indent, commentString(keyComment));
65
+ }
66
+ let vsb, vcb, valueComment;
67
+ if (isNode(value)) {
68
+ vsb = !!value.spaceBefore;
69
+ vcb = value.commentBefore;
70
+ valueComment = value.comment;
71
+ }
72
+ else {
73
+ vsb = false;
74
+ vcb = null;
75
+ valueComment = null;
76
+ if (value && typeof value === 'object')
77
+ value = doc.createNode(value);
78
+ }
79
+ ctx.implicitKey = false;
80
+ if (!explicitKey && !keyComment && isScalar(value))
81
+ ctx.indentAtStart = str.length + 1;
82
+ chompKeep = false;
83
+ if (!indentSeq &&
84
+ indentStep.length >= 2 &&
85
+ !ctx.inFlow &&
86
+ !explicitKey &&
87
+ isSeq(value) &&
88
+ !value.flow &&
89
+ !value.tag &&
90
+ !value.anchor) {
91
+ // If indentSeq === false, consider '- ' as part of indentation where possible
92
+ ctx.indent = ctx.indent.substring(2);
93
+ }
94
+ let valueCommentDone = false;
95
+ const valueStr = stringify(value, ctx, () => (valueCommentDone = true), () => (chompKeep = true));
96
+ let ws = ' ';
97
+ if (keyComment || vsb || vcb) {
98
+ ws = vsb ? '\n' : '';
99
+ if (vcb) {
100
+ const cs = commentString(vcb);
101
+ ws += `\n${indentComment(cs, ctx.indent)}`;
102
+ }
103
+ if (valueStr === '' && !ctx.inFlow) {
104
+ if (ws === '\n' && valueComment)
105
+ ws = '\n\n';
106
+ }
107
+ else {
108
+ ws += `\n${ctx.indent}`;
109
+ }
110
+ }
111
+ else if (!explicitKey && isCollection(value)) {
112
+ const vs0 = valueStr[0];
113
+ const nl0 = valueStr.indexOf('\n');
114
+ const hasNewline = nl0 !== -1;
115
+ const flow = ctx.inFlow ?? value.flow ?? value.items.length === 0;
116
+ if (hasNewline || !flow) {
117
+ let hasPropsLine = false;
118
+ if (hasNewline && (vs0 === '&' || vs0 === '!')) {
119
+ let sp0 = valueStr.indexOf(' ');
120
+ if (vs0 === '&' &&
121
+ sp0 !== -1 &&
122
+ sp0 < nl0 &&
123
+ valueStr[sp0 + 1] === '!') {
124
+ sp0 = valueStr.indexOf(' ', sp0 + 1);
125
+ }
126
+ if (sp0 === -1 || nl0 < sp0)
127
+ hasPropsLine = true;
128
+ }
129
+ if (!hasPropsLine)
130
+ ws = `\n${ctx.indent}`;
131
+ }
132
+ }
133
+ else if (valueStr === '' || valueStr[0] === '\n') {
134
+ ws = '';
135
+ }
136
+ str += ws + valueStr;
137
+ if (ctx.inFlow) {
138
+ if (valueCommentDone && onComment)
139
+ onComment();
140
+ }
141
+ else if (valueComment && !valueCommentDone) {
142
+ str += lineComment(str, ctx.indent, commentString(valueComment));
143
+ }
144
+ else if (chompKeep && onChompKeep) {
145
+ onChompKeep();
146
+ }
147
+ return str;
148
+ }
149
+
150
+ export { stringifyPair };