@taliesinb/mash 0.0.0-stage → 0.1.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 (203) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +275 -2
  3. package/bin/mash.ts +253 -0
  4. package/dist/bin/mash.d.ts +39 -0
  5. package/dist/bin/mash.d.ts.map +1 -0
  6. package/dist/bin/mash.js +281 -0
  7. package/dist/bin/mash.js.map +1 -0
  8. package/dist/src/analysis/analyze.d.ts +97 -0
  9. package/dist/src/analysis/analyze.d.ts.map +1 -0
  10. package/dist/src/analysis/analyze.js +1406 -0
  11. package/dist/src/analysis/analyze.js.map +1 -0
  12. package/dist/src/analysis/fs.d.ts +39 -0
  13. package/dist/src/analysis/fs.d.ts.map +1 -0
  14. package/dist/src/analysis/fs.js +117 -0
  15. package/dist/src/analysis/fs.js.map +1 -0
  16. package/dist/src/analysis/outputs.d.ts +16 -0
  17. package/dist/src/analysis/outputs.d.ts.map +1 -0
  18. package/dist/src/analysis/outputs.js +277 -0
  19. package/dist/src/analysis/outputs.js.map +1 -0
  20. package/dist/src/analysis/value.d.ts +76 -0
  21. package/dist/src/analysis/value.d.ts.map +1 -0
  22. package/dist/src/analysis/value.js +248 -0
  23. package/dist/src/analysis/value.js.map +1 -0
  24. package/dist/src/behaviors/defs/core.d.ts +15 -0
  25. package/dist/src/behaviors/defs/core.d.ts.map +1 -0
  26. package/dist/src/behaviors/defs/core.js +1084 -0
  27. package/dist/src/behaviors/defs/core.js.map +1 -0
  28. package/dist/src/behaviors/defs/devtools.d.ts +9 -0
  29. package/dist/src/behaviors/defs/devtools.d.ts.map +1 -0
  30. package/dist/src/behaviors/defs/devtools.js +432 -0
  31. package/dist/src/behaviors/defs/devtools.js.map +1 -0
  32. package/dist/src/behaviors/defs/macos.d.ts +12 -0
  33. package/dist/src/behaviors/defs/macos.d.ts.map +1 -0
  34. package/dist/src/behaviors/defs/macos.js +454 -0
  35. package/dist/src/behaviors/defs/macos.js.map +1 -0
  36. package/dist/src/behaviors/defs/tools.d.ts +9 -0
  37. package/dist/src/behaviors/defs/tools.d.ts.map +1 -0
  38. package/dist/src/behaviors/defs/tools.js +639 -0
  39. package/dist/src/behaviors/defs/tools.js.map +1 -0
  40. package/dist/src/behaviors/dsl.d.ts +95 -0
  41. package/dist/src/behaviors/dsl.d.ts.map +1 -0
  42. package/dist/src/behaviors/dsl.js +267 -0
  43. package/dist/src/behaviors/dsl.js.map +1 -0
  44. package/dist/src/behaviors/index.d.ts +12 -0
  45. package/dist/src/behaviors/index.d.ts.map +1 -0
  46. package/dist/src/behaviors/index.js +18 -0
  47. package/dist/src/behaviors/index.js.map +1 -0
  48. package/dist/src/behaviors/registry.d.ts +45 -0
  49. package/dist/src/behaviors/registry.d.ts.map +1 -0
  50. package/dist/src/behaviors/registry.js +266 -0
  51. package/dist/src/behaviors/registry.js.map +1 -0
  52. package/dist/src/behaviors/roles.d.ts +29 -0
  53. package/dist/src/behaviors/roles.d.ts.map +1 -0
  54. package/dist/src/behaviors/roles.js +198 -0
  55. package/dist/src/behaviors/roles.js.map +1 -0
  56. package/dist/src/behaviors/types.d.ts +120 -0
  57. package/dist/src/behaviors/types.d.ts.map +1 -0
  58. package/dist/src/behaviors/types.js +12 -0
  59. package/dist/src/behaviors/types.js.map +1 -0
  60. package/dist/src/index.d.ts +27 -0
  61. package/dist/src/index.d.ts.map +1 -0
  62. package/dist/src/index.js +24 -0
  63. package/dist/src/index.js.map +1 -0
  64. package/dist/src/integrations/deepsea.d.ts +121 -0
  65. package/dist/src/integrations/deepsea.d.ts.map +1 -0
  66. package/dist/src/integrations/deepsea.js +199 -0
  67. package/dist/src/integrations/deepsea.js.map +1 -0
  68. package/dist/src/machine.d.ts +139 -0
  69. package/dist/src/machine.d.ts.map +1 -0
  70. package/dist/src/machine.js +400 -0
  71. package/dist/src/machine.js.map +1 -0
  72. package/dist/src/parser/ast.d.ts +369 -0
  73. package/dist/src/parser/ast.d.ts.map +1 -0
  74. package/dist/src/parser/ast.js +17 -0
  75. package/dist/src/parser/ast.js.map +1 -0
  76. package/dist/src/parser/parser.d.ts +48 -0
  77. package/dist/src/parser/parser.d.ts.map +1 -0
  78. package/dist/src/parser/parser.js +1950 -0
  79. package/dist/src/parser/parser.js.map +1 -0
  80. package/dist/src/policy/effects.d.ts +86 -0
  81. package/dist/src/policy/effects.d.ts.map +1 -0
  82. package/dist/src/policy/effects.js +53 -0
  83. package/dist/src/policy/effects.js.map +1 -0
  84. package/dist/src/policy/policy.d.ts +130 -0
  85. package/dist/src/policy/policy.d.ts.map +1 -0
  86. package/dist/src/policy/policy.js +532 -0
  87. package/dist/src/policy/policy.js.map +1 -0
  88. package/dist/src/printer/doc.d.ts +151 -0
  89. package/dist/src/printer/doc.d.ts.map +1 -0
  90. package/dist/src/printer/doc.js +409 -0
  91. package/dist/src/printer/doc.js.map +1 -0
  92. package/dist/src/printer/highlight.d.ts +53 -0
  93. package/dist/src/printer/highlight.d.ts.map +1 -0
  94. package/dist/src/printer/highlight.js +339 -0
  95. package/dist/src/printer/highlight.js.map +1 -0
  96. package/dist/src/printer/html.d.ts +72 -0
  97. package/dist/src/printer/html.d.ts.map +1 -0
  98. package/dist/src/printer/html.js +423 -0
  99. package/dist/src/printer/html.js.map +1 -0
  100. package/dist/src/printer/print.d.ts +63 -0
  101. package/dist/src/printer/print.d.ts.map +1 -0
  102. package/dist/src/printer/print.js +484 -0
  103. package/dist/src/printer/print.js.map +1 -0
  104. package/dist/src/printer/summary.d.ts +50 -0
  105. package/dist/src/printer/summary.d.ts.map +1 -0
  106. package/dist/src/printer/summary.js +621 -0
  107. package/dist/src/printer/summary.js.map +1 -0
  108. package/dist/src/trace/events.d.ts +183 -0
  109. package/dist/src/trace/events.d.ts.map +1 -0
  110. package/dist/src/trace/events.js +9 -0
  111. package/dist/src/trace/events.js.map +1 -0
  112. package/dist/src/trace/progress.d.ts +58 -0
  113. package/dist/src/trace/progress.d.ts.map +1 -0
  114. package/dist/src/trace/progress.js +83 -0
  115. package/dist/src/trace/progress.js.map +1 -0
  116. package/dist/src/vm/arith.d.ts +29 -0
  117. package/dist/src/vm/arith.d.ts.map +1 -0
  118. package/dist/src/vm/arith.js +258 -0
  119. package/dist/src/vm/arith.js.map +1 -0
  120. package/dist/src/vm/builtins.d.ts +31 -0
  121. package/dist/src/vm/builtins.d.ts.map +1 -0
  122. package/dist/src/vm/builtins.js +1773 -0
  123. package/dist/src/vm/builtins.js.map +1 -0
  124. package/dist/src/vm/emulate.d.ts +75 -0
  125. package/dist/src/vm/emulate.d.ts.map +1 -0
  126. package/dist/src/vm/emulate.js +380 -0
  127. package/dist/src/vm/emulate.js.map +1 -0
  128. package/dist/src/vm/expand.d.ts +68 -0
  129. package/dist/src/vm/expand.d.ts.map +1 -0
  130. package/dist/src/vm/expand.js +744 -0
  131. package/dist/src/vm/expand.js.map +1 -0
  132. package/dist/src/vm/external.d.ts +34 -0
  133. package/dist/src/vm/external.d.ts.map +1 -0
  134. package/dist/src/vm/external.js +228 -0
  135. package/dist/src/vm/external.js.map +1 -0
  136. package/dist/src/vm/fifo.d.ts +66 -0
  137. package/dist/src/vm/fifo.d.ts.map +1 -0
  138. package/dist/src/vm/fifo.js +232 -0
  139. package/dist/src/vm/fifo.js.map +1 -0
  140. package/dist/src/vm/interp.d.ts +209 -0
  141. package/dist/src/vm/interp.d.ts.map +1 -0
  142. package/dist/src/vm/interp.js +1641 -0
  143. package/dist/src/vm/interp.js.map +1 -0
  144. package/dist/src/vm/io.d.ts +180 -0
  145. package/dist/src/vm/io.d.ts.map +1 -0
  146. package/dist/src/vm/io.js +502 -0
  147. package/dist/src/vm/io.js.map +1 -0
  148. package/dist/src/vm/pattern.d.ts +46 -0
  149. package/dist/src/vm/pattern.d.ts.map +1 -0
  150. package/dist/src/vm/pattern.js +498 -0
  151. package/dist/src/vm/pattern.js.map +1 -0
  152. package/dist/src/vm/proc.d.ts +94 -0
  153. package/dist/src/vm/proc.d.ts.map +1 -0
  154. package/dist/src/vm/proc.js +130 -0
  155. package/dist/src/vm/proc.js.map +1 -0
  156. package/dist/src/vm/state.d.ts +104 -0
  157. package/dist/src/vm/state.d.ts.map +1 -0
  158. package/dist/src/vm/state.js +233 -0
  159. package/dist/src/vm/state.js.map +1 -0
  160. package/dist/src/vm/test.d.ts +11 -0
  161. package/dist/src/vm/test.d.ts.map +1 -0
  162. package/dist/src/vm/test.js +277 -0
  163. package/dist/src/vm/test.js.map +1 -0
  164. package/package.json +63 -4
  165. package/src/analysis/analyze.ts +1395 -0
  166. package/src/analysis/fs.ts +121 -0
  167. package/src/analysis/outputs.ts +242 -0
  168. package/src/analysis/value.ts +264 -0
  169. package/src/behaviors/defs/core.ts +970 -0
  170. package/src/behaviors/defs/devtools.ts +400 -0
  171. package/src/behaviors/defs/macos.ts +426 -0
  172. package/src/behaviors/defs/tools.ts +596 -0
  173. package/src/behaviors/dsl.ts +293 -0
  174. package/src/behaviors/index.ts +19 -0
  175. package/src/behaviors/registry.ts +261 -0
  176. package/src/behaviors/roles.ts +187 -0
  177. package/src/behaviors/types.ts +127 -0
  178. package/src/index.ts +27 -0
  179. package/src/integrations/deepsea.ts +259 -0
  180. package/src/machine.ts +483 -0
  181. package/src/parser/ast.ts +472 -0
  182. package/src/parser/parser.ts +1826 -0
  183. package/src/policy/effects.ts +102 -0
  184. package/src/policy/policy.ts +578 -0
  185. package/src/printer/doc.ts +454 -0
  186. package/src/printer/highlight.ts +283 -0
  187. package/src/printer/html.ts +441 -0
  188. package/src/printer/print.ts +528 -0
  189. package/src/printer/summary.ts +601 -0
  190. package/src/trace/events.ts +102 -0
  191. package/src/trace/progress.ts +119 -0
  192. package/src/vm/arith.ts +236 -0
  193. package/src/vm/builtins.ts +1590 -0
  194. package/src/vm/emulate.ts +337 -0
  195. package/src/vm/expand.ts +721 -0
  196. package/src/vm/external.ts +265 -0
  197. package/src/vm/fifo.ts +226 -0
  198. package/src/vm/interp.ts +1623 -0
  199. package/src/vm/io.ts +570 -0
  200. package/src/vm/pattern.ts +477 -0
  201. package/src/vm/proc.ts +147 -0
  202. package/src/vm/state.ts +267 -0
  203. package/src/vm/test.ts +253 -0
@@ -0,0 +1,423 @@
1
+ /**
2
+ * HTML-native pretty-printing: the same layout as `format`, emitted as
3
+ * syntax-highlighted spans, with best-effort truncation of over-long words so
4
+ * lines fit the width. Truncated output is for display only (it is not valid
5
+ * bash); hidden text stays in the DOM and a click can reveal it.
6
+ *
7
+ * Truncation is a small search, not an optimum: render, find lines over the
8
+ * width, shorten the most suitable atom on each (quoted strings and
9
+ * substitutions first, never command names or flags), re-render, repeat until
10
+ * nothing changes. Multi-line atoms (quoted strings, here-doc bodies) get
11
+ * their continuation lines clipped to the width and are collapsed to their
12
+ * first lines when they are longer than `maxLines`.
13
+ */
14
+ import { literalOf, parse } from "../parser/parser.js";
15
+ import { analyzeScript } from "../analysis/analyze.js";
16
+ import { concrete, hole, known } from "../analysis/value.js";
17
+ import { defaultBehaviors } from "../behaviors/index.js";
18
+ import { render } from "./doc.js";
19
+ import { Highlight, simpleCommandRoles } from "./highlight.js";
20
+ import { buildDoc } from "./print.js";
21
+ /** `/a/./b/../c` → `/a/c` (absolute paths). */
22
+ function normalizePath(p) {
23
+ const out = [];
24
+ for (const part of p.split('/')) {
25
+ if (part === '' || part === '.')
26
+ continue;
27
+ if (part === '..')
28
+ out.pop();
29
+ else
30
+ out.push(part);
31
+ }
32
+ return '/' + out.join('/') + (p.endsWith('/') && out.length ? '/' : '');
33
+ }
34
+ let sharedBehaviors = null;
35
+ /**
36
+ * File and directory arguments (and redirection targets) by word id, with
37
+ * their absolute path when the static analysis knows the working directory.
38
+ */
39
+ function staticPaths(script, source, cwd, home) {
40
+ const out = new Map();
41
+ const cwdAt = new Map();
42
+ try {
43
+ const report = analyzeScript(script, source, {
44
+ cwd: cwd ? known(cwd) : hole('path', 'cwd'),
45
+ env: home ? { HOME: home } : {},
46
+ policy: { mode: 'danger-full-access', workspaceRoot: cwd ?? '/', writableTemp: true, network: 'allow', unknownCommands: 'allow' },
47
+ behaviors: (sharedBehaviors ??= defaultBehaviors()),
48
+ });
49
+ for (const c of report.commands)
50
+ cwdAt.set(c.nodeId, concrete(c.cwd));
51
+ }
52
+ catch {
53
+ // display only: paths stay unresolved
54
+ }
55
+ const absOf = (w, dir) => {
56
+ if (/[*?[\]{}$`\\]/.test(w))
57
+ return undefined; // globs and anything unexpanded
58
+ if (w.startsWith('/'))
59
+ return normalizePath(w);
60
+ if (w === '~' || w.startsWith('~/'))
61
+ return home ? normalizePath(home + w.slice(1)) : undefined;
62
+ if (w.startsWith('~'))
63
+ return undefined; // ~user
64
+ return dir ? normalizePath(`${dir}/${w}`) : undefined;
65
+ };
66
+ const add = (id, w, dir) => {
67
+ if (w === null || w === '')
68
+ return;
69
+ out.set(id, { written: w, abs: absOf(w, dir) });
70
+ };
71
+ const visit = (n) => {
72
+ if (Array.isArray(n)) {
73
+ for (const x of n)
74
+ visit(x);
75
+ return;
76
+ }
77
+ if (n === null || typeof n !== 'object')
78
+ return;
79
+ const node = n;
80
+ if (node.type === 'SimpleCommand') {
81
+ const c = node;
82
+ const dir = cwdAt.get(c.id);
83
+ let roles = [];
84
+ try {
85
+ roles = simpleCommandRoles(c);
86
+ }
87
+ catch {
88
+ // display only
89
+ }
90
+ c.words.forEach((w, i) => {
91
+ if (w.type === 'Word' && (roles[i] === 'file' || roles[i] === 'dir'))
92
+ add(w.id, literalOf(w), dir);
93
+ });
94
+ for (const r of c.redirs) {
95
+ if (r.heredoc || /&\s*$/.test(source.slice(r.span.start, r.target.span.start)))
96
+ continue;
97
+ add(r.target.id, literalOf(r.target), dir);
98
+ }
99
+ }
100
+ for (const [k, v] of Object.entries(node))
101
+ if (k !== 'span' && v && typeof v === 'object')
102
+ visit(v);
103
+ };
104
+ visit(script.body);
105
+ return out;
106
+ }
107
+ /** The tooltip for a path: `as written → absolute` when they differ beyond `~`, else the path. */
108
+ function pathTitle(p, home) {
109
+ if (!p.abs)
110
+ return p.written;
111
+ const tilde = home && (p.written === '~' || p.written.startsWith('~/')) ? home + p.written.slice(1) : p.written;
112
+ return tilde === p.abs || tilde === p.abs.replace(/\/$/, '') ? p.abs : `${p.written} → ${p.abs}`;
113
+ }
114
+ const fileHref = (abs) => 'file://' + encodeURI(abs).replace(/#/g, '%23').replace(/\?/g, '%3F');
115
+ const ELLIPSIS = '…';
116
+ /** Atoms referenced by a document, with their source ranges. */
117
+ function collectAtoms(doc, out = new Map()) {
118
+ if (typeof doc === 'string')
119
+ return out;
120
+ if (Array.isArray(doc)) {
121
+ for (const d of doc)
122
+ collectAtoms(d, out);
123
+ return out;
124
+ }
125
+ switch (doc.t) {
126
+ case 'src':
127
+ case 'heredoc':
128
+ if (doc.atom)
129
+ out.set(doc.atom.id, { ...doc.atom, start: doc.start, end: doc.end });
130
+ break;
131
+ case 'group':
132
+ case 'indent':
133
+ case 'mark':
134
+ collectAtoms(doc.doc, out);
135
+ break;
136
+ case 'fill':
137
+ for (const p of doc.parts)
138
+ collectAtoms(p, out);
139
+ break;
140
+ case 'ifBreak':
141
+ collectAtoms(doc.broken, out);
142
+ collectAtoms(doc.flat, out);
143
+ break;
144
+ case 'suffix':
145
+ collectAtoms(doc.doc, out);
146
+ break;
147
+ default: break;
148
+ }
149
+ return out;
150
+ }
151
+ /**
152
+ * How an atom is shown under the current limits, or null when it is shown in
153
+ * full. `first` limits the width of its first line; continuation lines are
154
+ * clipped to `cols` (they start at column 0); more than `maxLines` lines collapse.
155
+ */
156
+ /** The narrowest a path atom gets: `…/basename` (whole last component). */
157
+ function tailFloor(source, a) {
158
+ const slash = source.lastIndexOf('/', a.end - 2);
159
+ return slash > a.start ? Math.min(a.end - a.start, 1 + a.end - slash) : a.end - a.start;
160
+ }
161
+ /** A path shortened from the left at a `/` where possible: `…/pages/395.html`. */
162
+ function tailDisplay(source, a, limit) {
163
+ const full = a.end - a.start;
164
+ if (limit >= full)
165
+ return null;
166
+ let from = a.end - Math.max(1, limit - 1);
167
+ const slash = source.indexOf('/', from);
168
+ if (slash >= 0 && slash < a.end - 1)
169
+ from = slash;
170
+ if (from <= a.start)
171
+ return null;
172
+ const parts = [
173
+ { kind: 'hide', start: a.start, end: from },
174
+ { kind: 'mark', text: ELLIPSIS },
175
+ { kind: 'show', start: from, end: a.end },
176
+ ];
177
+ return { text: ELLIPSIS + source.slice(from, a.end), parts };
178
+ }
179
+ function displayFor(source, a, first, cols, maxLines) {
180
+ if (a.tail)
181
+ return tailDisplay(source, a, first);
182
+ const lines = [];
183
+ let pos = a.start;
184
+ while (pos <= a.end) {
185
+ const nlAt = source.indexOf('\n', pos);
186
+ const e = nlAt === -1 || nlAt >= a.end ? a.end : nlAt;
187
+ lines.push([pos, e]);
188
+ if (e >= a.end)
189
+ break;
190
+ pos = e + 1;
191
+ }
192
+ // a here-doc body ends with a newline: drop the empty line after it
193
+ if (lines.length > 1 && lines[lines.length - 1][0] === lines[lines.length - 1][1] && a.end > a.start && source[a.end - 1] === '\n')
194
+ lines.pop();
195
+ const lastChar = source[a.end - 1];
196
+ const closeLen = a.kind === 'word' && a.end - a.start > 2 && `'")}\``.includes(lastChar) ? 1 : 0;
197
+ const parts = [];
198
+ let hidden = false;
199
+ const clip = (ls, le, limit, close) => {
200
+ if (le - ls <= limit) {
201
+ parts.push({ kind: 'show', start: ls, end: le });
202
+ return;
203
+ }
204
+ const keep = Math.max(1, limit - 1 - close);
205
+ parts.push({ kind: 'show', start: ls, end: ls + keep });
206
+ parts.push({ kind: 'hide', start: ls + keep, end: le - close });
207
+ parts.push({ kind: 'mark', text: ELLIPSIS });
208
+ if (close)
209
+ parts.push({ kind: 'show', start: le - close, end: le });
210
+ hidden = true;
211
+ };
212
+ const newlineAfter = (i) => {
213
+ const e = lines[i][1];
214
+ if (e < a.end && source[e] === '\n')
215
+ parts.push({ kind: 'show', start: e, end: e + 1 });
216
+ };
217
+ const n = lines.length;
218
+ const limitOf = (i) => (i === 0 && a.kind !== 'hd' ? first : cols);
219
+ const closeOf = (i) => (i === n - 1 ? closeLen : 0);
220
+ let shown;
221
+ let collapseFrom = -1;
222
+ let collapseTo = -1;
223
+ if (n > maxLines) {
224
+ hidden = true;
225
+ if (a.kind === 'hd') {
226
+ shown = [...Array(maxLines).keys()];
227
+ collapseFrom = maxLines;
228
+ collapseTo = n;
229
+ }
230
+ else {
231
+ shown = [...Array(Math.max(1, maxLines - 1)).keys(), n - 1];
232
+ collapseFrom = Math.max(1, maxLines - 1);
233
+ collapseTo = n - 1;
234
+ }
235
+ }
236
+ else
237
+ shown = [...Array(n).keys()];
238
+ for (const i of shown) {
239
+ if (i === collapseTo && collapseFrom >= 0) {
240
+ const hs = lines[collapseFrom][0];
241
+ parts.push({ kind: 'hide', start: hs, end: lines[i][0] });
242
+ parts.push({ kind: 'mark', text: `⋯ ${collapseTo - collapseFrom} more lines\n` });
243
+ }
244
+ clip(lines[i][0], lines[i][1], limitOf(i), closeOf(i));
245
+ if (i !== n - 1 || a.kind === 'hd')
246
+ newlineAfter(i);
247
+ }
248
+ if (collapseFrom >= 0 && collapseTo === n) {
249
+ const hs = lines[collapseFrom][0];
250
+ parts.push({ kind: 'hide', start: hs, end: a.end });
251
+ parts.push({ kind: 'mark', text: `⋯ ${collapseTo - collapseFrom} more lines\n` });
252
+ }
253
+ if (!hidden)
254
+ return null;
255
+ const text = parts.map((p) => (p.kind === 'mark' ? p.text : p.kind === 'show' ? source.slice(p.start, p.end) : '')).join('');
256
+ return { text, parts };
257
+ }
258
+ const esc = (s) => s.replace(/[&<>"]/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;' })[c]);
259
+ /** Pretty-print `source` as highlighted (and, by default, truncated) HTML. */
260
+ export function formatHtml(source, options = {}) {
261
+ return printScriptHtml(parse(source), source, options);
262
+ }
263
+ export function printScriptHtml(script, source, options = {}) {
264
+ const truncate = options.truncate ?? true;
265
+ const maxLines = options.maxLines ?? 8;
266
+ const minKeep = options.minKeep ?? 16;
267
+ const maxIterations = options.maxIterations ?? 12;
268
+ const { doc, opts } = buildDoc(script, source, options);
269
+ const width = opts.width;
270
+ const atoms = collectAtoms(doc);
271
+ const limits = new Map();
272
+ // how far each atom may shrink: paths to `…/basename`, other words to minKeep
273
+ const floor = new Map();
274
+ for (const a of atoms.values()) {
275
+ if (a.kind !== 'word' || a.weight <= 0)
276
+ continue;
277
+ const firstLine = source.slice(a.start, a.end).split('\n')[0].length;
278
+ if (source.slice(a.start, a.end).includes('\n'))
279
+ continue;
280
+ floor.set(a.id, a.tail ? tailFloor(source, a) : Math.min(firstLine, minKeep));
281
+ }
282
+ // prefer shortening atoms over breaking lines: layout measures atoms at their floor
283
+ const minWidth = truncate && (options.preferTruncation ?? true) ? floor : undefined;
284
+ const hl = new Highlight(script, source);
285
+ let display = new Map();
286
+ let r = render(doc, width, { source });
287
+ for (let iter = 0; truncate && iter < maxIterations; iter++) {
288
+ display = new Map();
289
+ for (const a of atoms.values()) {
290
+ const d = displayFor(source, a, limits.get(a.id) ?? Infinity, width, maxLines);
291
+ if (d)
292
+ display.set(a.id, d);
293
+ }
294
+ r = render(doc, width, { source, display, minWidth });
295
+ const byLine = new Map();
296
+ for (const [id, pos] of r.atoms) {
297
+ const list = byLine.get(pos.line) ?? [];
298
+ list.push({ id, width: pos.width });
299
+ byLine.set(pos.line, list);
300
+ }
301
+ let changed = false;
302
+ r.text.split('\n').forEach((line, i) => {
303
+ let over = line.length - width;
304
+ if (over <= 0)
305
+ return;
306
+ // shorten the line's atoms, most suitable first (weight × width), each down to its floor, until the overflow is covered
307
+ const cands = (byLine.get(i) ?? [])
308
+ .map((c) => ({ ...c, a: atoms.get(c.id), lo: floor.get(c.id) ?? minKeep }))
309
+ .filter((c) => c.a && c.a.kind !== 'hd' && c.a.weight > 0 && c.width > c.lo)
310
+ .sort((x, y) => y.a.weight * y.width - x.a.weight * x.width);
311
+ for (const c of cands) {
312
+ if (over <= 0)
313
+ break;
314
+ const limit = Math.max(c.lo, c.width - over);
315
+ if (limit < (limits.get(c.id) ?? Infinity) && limit < c.width) {
316
+ limits.set(c.id, limit);
317
+ over -= c.width - limit;
318
+ changed = true;
319
+ }
320
+ }
321
+ });
322
+ if (!changed)
323
+ break;
324
+ }
325
+ const highlighted = (start, end, fallback) => hl.runs(start, end).map((run) => {
326
+ const cls = run.cls || fallback || '';
327
+ return cls ? `<span class="${cls}">${esc(run.text)}</span>` : esc(run.text);
328
+ }).join('');
329
+ const home = options.home ?? globalThis.process?.env?.HOME;
330
+ const paths = options.paths === false ? new Map() : staticPaths(script, source, options.cwd, home);
331
+ const TITLE_MAX = 2000;
332
+ let html = '';
333
+ for (const p of r.pieces) {
334
+ const d = p.atom !== undefined ? display.get(p.atom) : undefined;
335
+ const path = p.atom !== undefined ? paths.get(p.atom) : undefined;
336
+ if (d || path) {
337
+ // one wrapper per atom: path role (whole thing underlined), tooltip, link, truncation state
338
+ const a = atoms.get(p.atom);
339
+ const classes = [];
340
+ if (path) {
341
+ const last = p.src ? hl.runs(p.src[1] - 1, p.src[1])[0]?.cls : undefined;
342
+ classes.push('pth', last === 'dir' ? 'dir' : 'file');
343
+ }
344
+ if (d)
345
+ classes.push('tc');
346
+ const full = a ? source.slice(a.start, a.end) : p.text;
347
+ const title = path ? pathTitle(path, home) : full.length > TITLE_MAX ? full.slice(0, TITLE_MAX) + ELLIPSIS : full;
348
+ const href = path?.abs ? ` data-href="${esc(fileHref(path.abs))}"` : '';
349
+ html += `<span class="${classes.join(' ')}" title="${esc(title)}"${href}>`;
350
+ if (d) {
351
+ for (const part of d.parts) {
352
+ if (part.kind === 'show')
353
+ html += highlighted(part.start, part.end, p.cls);
354
+ else if (part.kind === 'hide')
355
+ html += `<span class="hid">${highlighted(part.start, part.end, p.cls)}</span>`;
356
+ else if (part.kind === 'mark')
357
+ html += `<span class="el">${esc(part.text)}</span>`;
358
+ }
359
+ }
360
+ else if (p.src)
361
+ html += highlighted(p.src[0], p.src[1], p.cls);
362
+ else
363
+ html += esc(p.text);
364
+ html += '</span>';
365
+ }
366
+ else if (p.src)
367
+ html += highlighted(p.src[0], p.src[1], p.cls);
368
+ else
369
+ html += p.cls ? `<span class="${p.cls}">${esc(p.text)}</span>` : esc(p.text);
370
+ }
371
+ const overflowing = r.text.split('\n').filter((l) => l.length > width).length;
372
+ return { html: `<pre class="mash">${html}</pre>`, text: r.text, truncated: display.size, overflowing };
373
+ }
374
+ /**
375
+ * Click behavior for HTML output under `root`: a statically known path opens
376
+ * in a new tab (`file://`; browsers allow that from file:// pages, not from
377
+ * http ones), any other shortened item expands or collapses.
378
+ */
379
+ export function attachHtmlHandlers(root) {
380
+ root.addEventListener('click', (e) => {
381
+ const t = e.target;
382
+ const link = t?.closest?.('.mash [data-href]');
383
+ if (link) {
384
+ e.preventDefault();
385
+ globalThis.open?.(link.dataset.href, '_blank', 'noopener');
386
+ return;
387
+ }
388
+ t?.closest?.('.mash .tc')?.classList.toggle('open');
389
+ });
390
+ }
391
+ /** {@link attachHtmlHandlers} as a script for pages without a module loader: `<script>${HTML_SCRIPT}</script>`. */
392
+ export const HTML_SCRIPT = `(${attachHtmlHandlers.toString()})(document)`;
393
+ /** Default styles (light and dark). Attach the click handlers with {@link attachHtmlHandlers} or {@link HTML_SCRIPT}. */
394
+ export const HTML_CSS = `
395
+ .mash { --kw:#a626a4; --op:#0184bc; --cmd:#4078f2; --flag:#986801; --str:#50a14f; --esc:#c18401; --var:#e45649;
396
+ --sub:#0184bc; --ar:#986801; --asg:#e45649; --rd:#0184bc; --hd:#50a14f; --cm:#a0a1a7; --fn:#4078f2; --el:#a0a1a7;
397
+ --dir:#00838f; --file:#3f51b5; --re:#d84315; --code:#7b5e57; --sc:#7e3fd8;
398
+ font: 13px/1.5 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; white-space: pre; margin: 0; tab-size: 4; }
399
+ @media (prefers-color-scheme: dark) {
400
+ .mash { --kw:#c678dd; --op:#56b6c2; --cmd:#61afef; --flag:#d19a66; --str:#98c379; --esc:#e5c07b; --var:#e06c75;
401
+ --sub:#56b6c2; --ar:#d19a66; --asg:#e06c75; --rd:#56b6c2; --hd:#98c379; --cm:#7f848e; --fn:#61afef; --el:#7f848e;
402
+ --dir:#4dd0e1; --file:#9fa8ff; --re:#ff8a65; --code:#c8b5ad; --sc:#c49bff; }
403
+ }
404
+ .mash .kw { color: var(--kw); } .mash .op { color: var(--op); } .mash .cmd { color: var(--cmd); font-weight: 600; }
405
+ .mash .flag { color: var(--flag); } .mash .str { color: var(--str); } .mash .esc { color: var(--esc); }
406
+ .mash .var { color: var(--var); } .mash .sub { color: var(--sub); font-weight: 600; } .mash .ar, .mash .num { color: var(--ar); }
407
+ .mash .asg { color: var(--asg); } .mash .rd { color: var(--rd); } .mash .hd { color: var(--hd); }
408
+ .mash .pth { text-decoration: underline dotted; text-underline-offset: 3px; }
409
+ .mash .pth.dir { text-decoration-color: color-mix(in srgb, var(--dir) 55%, transparent); } .mash .pth.file { text-decoration-color: color-mix(in srgb, var(--file) 55%, transparent); }
410
+ .mash [data-href] { cursor: pointer; } .mash [data-href]:hover { background: color-mix(in srgb, currentColor 12%, transparent); border-radius: 3px; }
411
+ .mash .pth .dir, .mash .pth .file { text-decoration: none; }
412
+ /* paths: dotted underline (both kinds), told apart by color */
413
+ .mash .dir, .mash .file { text-decoration: underline dotted; text-underline-offset: 3px; }
414
+ .mash .dir { color: var(--dir); text-decoration-color: color-mix(in srgb, var(--dir) 45%, transparent); }
415
+ .mash .file { color: var(--file); text-decoration-color: color-mix(in srgb, var(--file) 45%, transparent); }
416
+ .mash .re { color: var(--re); } .mash .code { color: var(--code); } .mash .sc { color: var(--sc); font-weight: 600; }
417
+ .mash .cm { color: var(--cm); font-style: italic; } .mash .fn { color: var(--fn); font-weight: 600; } .mash .ct { color: var(--el); }
418
+ .mash .tc .hid { display: none; } .mash .tc.open .hid { display: inline; } .mash .tc.open > .el { display: none; }
419
+ .mash.sum { display: inline-block; white-space: pre; max-width: 100%; overflow: hidden; vertical-align: bottom; }
420
+ .mash.sum .el { cursor: help; } .mash .tr:hover { background: color-mix(in srgb, var(--el) 15%, transparent); border-radius: 3px; }
421
+ .mash .el { color: var(--el); cursor: pointer; border-radius: 3px; } .mash .el:hover { background: color-mix(in srgb, var(--el) 20%, transparent); }
422
+ `;
423
+ //# sourceMappingURL=html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../../../src/printer/html.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Pretty-printer: renders a parsed script as readable bash that parses to the
3
+ * same AST (see docs/pretty-printer.md).
4
+ *
5
+ * Words, assignment values, redirections, here-doc bodies, arithmetic and
6
+ * `[[ ]]` expressions are emitted as their exact source text; only the layout
7
+ * (newlines, ` \` continuations, indentation) is regenerated.
8
+ */
9
+ import type * as A from '../parser/ast.ts';
10
+ import { type Doc } from './doc.ts';
11
+ export interface FormatOptions {
12
+ /** Target line width (default 80). Single words longer than this overflow. */
13
+ width?: number;
14
+ /** Indentation step (default 2). Wrapped arguments are indented twice this. */
15
+ indent?: number;
16
+ /** Where `|`, `&&`, `||` go when a chain is broken: end of line (default) or start (with `\` continuations). */
17
+ operators?: 'trailing' | 'leading';
18
+ /**
19
+ * Prefix assignments (`FOO=1 BAR=2 cmd`): `auto` (default) puts each on its
20
+ * own line when there are two or more, or when the command does not fit;
21
+ * `always` does so for any number; `inline` only when it does not fit.
22
+ */
23
+ assignments?: 'auto' | 'always' | 'inline';
24
+ /** Compound commands: `auto` (default) keeps short ones on one line when they fit; `expanded` always expands. */
25
+ compounds?: 'auto' | 'expanded';
26
+ /** Reformat multi-line `$(…)` / `<(…)` bodies inside words (default false: verbatim). */
27
+ formatSubstitutions?: boolean;
28
+ /** Keep at most this many blank lines between statements (default 1; 0 drops them). */
29
+ blankLines?: number;
30
+ /** `function` keyword: normalize to `name()` (default) or preserve the original header. */
31
+ functionKeyword?: 'normalize' | 'preserve';
32
+ /**
33
+ * Top-level statements that share a source line (`a; b; c`). bash reads a
34
+ * script line by line: an expansion error (bad arithmetic, readonly
35
+ * assignment) discards the rest of the *logical* line, and an alias is only
36
+ * active from the next line. So:
37
+ * - `continuation` (default): one per line joined by `; \` — exactly the same behavior;
38
+ * - `newline`: plain separate lines (differs only after such an error);
39
+ * - `preserve`: keep them on one line.
40
+ * Inside compound commands and `$(…)` layout never matters (they are parsed whole).
41
+ */
42
+ statements?: 'continuation' | 'newline' | 'preserve';
43
+ }
44
+ export interface FormatResult {
45
+ text: string;
46
+ /** Output range of every statement and command, by AST node id. */
47
+ map: Map<number, {
48
+ start: number;
49
+ end: number;
50
+ }>;
51
+ }
52
+ /** Options with defaults applied. */
53
+ export type Opts = Required<FormatOptions>;
54
+ /** Parse and pretty-print `source`. Throws ParseError on invalid input. */
55
+ export declare function format(source: string, options?: FormatOptions): FormatResult;
56
+ /** Pretty-print an already parsed script; `source` must be the text it was parsed from. */
57
+ export declare function printScript(script: A.Script, source: string, options?: FormatOptions): FormatResult;
58
+ /** The layout document for a script (shared by the text and HTML renderers). */
59
+ export declare function buildDoc(script: A.Script, source: string, options?: FormatOptions): {
60
+ doc: Doc;
61
+ opts: Opts;
62
+ };
63
+ //# sourceMappingURL=print.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"print.d.ts","sourceRoot":"","sources":["../../../src/printer/print.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,KAAK,CAAC,MAAM,kBAAkB,CAAA;AAI1C,OAAO,EACU,KAAK,GAAG,EACxB,MAAM,UAAU,CAAA;AAEjB,MAAM,WAAW,aAAa;IAC5B,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gHAAgH;IAChH,SAAS,CAAC,EAAE,UAAU,GAAG,SAAS,CAAA;IAClC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAA;IAC1C,iHAAiH;IACjH,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU,CAAA;IAC/B,yFAAyF;IACzF,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,uFAAuF;IACvF,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,2FAA2F;IAC3F,eAAe,CAAC,EAAE,WAAW,GAAG,UAAU,CAAA;IAC1C;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,cAAc,GAAG,SAAS,GAAG,UAAU,CAAA;CACrD;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,mEAAmE;IACnE,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACjD;AAED,qCAAqC;AACrC,MAAM,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA;AAO1C,2EAA2E;AAC3E,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,YAAY,CAEhF;AAED,2FAA2F;AAC3F,wBAAgB,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,YAAY,CAIvG;AAED,gFAAgF;AAChF,wBAAgB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG;IAAE,GAAG,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,CAOhH"}