@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.
- package/LICENSE +21 -0
- package/README.md +275 -2
- package/bin/mash.ts +253 -0
- package/dist/bin/mash.d.ts +39 -0
- package/dist/bin/mash.d.ts.map +1 -0
- package/dist/bin/mash.js +281 -0
- package/dist/bin/mash.js.map +1 -0
- package/dist/src/analysis/analyze.d.ts +97 -0
- package/dist/src/analysis/analyze.d.ts.map +1 -0
- package/dist/src/analysis/analyze.js +1406 -0
- package/dist/src/analysis/analyze.js.map +1 -0
- package/dist/src/analysis/fs.d.ts +39 -0
- package/dist/src/analysis/fs.d.ts.map +1 -0
- package/dist/src/analysis/fs.js +117 -0
- package/dist/src/analysis/fs.js.map +1 -0
- package/dist/src/analysis/outputs.d.ts +16 -0
- package/dist/src/analysis/outputs.d.ts.map +1 -0
- package/dist/src/analysis/outputs.js +277 -0
- package/dist/src/analysis/outputs.js.map +1 -0
- package/dist/src/analysis/value.d.ts +76 -0
- package/dist/src/analysis/value.d.ts.map +1 -0
- package/dist/src/analysis/value.js +248 -0
- package/dist/src/analysis/value.js.map +1 -0
- package/dist/src/behaviors/defs/core.d.ts +15 -0
- package/dist/src/behaviors/defs/core.d.ts.map +1 -0
- package/dist/src/behaviors/defs/core.js +1084 -0
- package/dist/src/behaviors/defs/core.js.map +1 -0
- package/dist/src/behaviors/defs/devtools.d.ts +9 -0
- package/dist/src/behaviors/defs/devtools.d.ts.map +1 -0
- package/dist/src/behaviors/defs/devtools.js +432 -0
- package/dist/src/behaviors/defs/devtools.js.map +1 -0
- package/dist/src/behaviors/defs/macos.d.ts +12 -0
- package/dist/src/behaviors/defs/macos.d.ts.map +1 -0
- package/dist/src/behaviors/defs/macos.js +454 -0
- package/dist/src/behaviors/defs/macos.js.map +1 -0
- package/dist/src/behaviors/defs/tools.d.ts +9 -0
- package/dist/src/behaviors/defs/tools.d.ts.map +1 -0
- package/dist/src/behaviors/defs/tools.js +639 -0
- package/dist/src/behaviors/defs/tools.js.map +1 -0
- package/dist/src/behaviors/dsl.d.ts +95 -0
- package/dist/src/behaviors/dsl.d.ts.map +1 -0
- package/dist/src/behaviors/dsl.js +267 -0
- package/dist/src/behaviors/dsl.js.map +1 -0
- package/dist/src/behaviors/index.d.ts +12 -0
- package/dist/src/behaviors/index.d.ts.map +1 -0
- package/dist/src/behaviors/index.js +18 -0
- package/dist/src/behaviors/index.js.map +1 -0
- package/dist/src/behaviors/registry.d.ts +45 -0
- package/dist/src/behaviors/registry.d.ts.map +1 -0
- package/dist/src/behaviors/registry.js +266 -0
- package/dist/src/behaviors/registry.js.map +1 -0
- package/dist/src/behaviors/roles.d.ts +29 -0
- package/dist/src/behaviors/roles.d.ts.map +1 -0
- package/dist/src/behaviors/roles.js +198 -0
- package/dist/src/behaviors/roles.js.map +1 -0
- package/dist/src/behaviors/types.d.ts +120 -0
- package/dist/src/behaviors/types.d.ts.map +1 -0
- package/dist/src/behaviors/types.js +12 -0
- package/dist/src/behaviors/types.js.map +1 -0
- package/dist/src/index.d.ts +27 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +24 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/integrations/deepsea.d.ts +121 -0
- package/dist/src/integrations/deepsea.d.ts.map +1 -0
- package/dist/src/integrations/deepsea.js +199 -0
- package/dist/src/integrations/deepsea.js.map +1 -0
- package/dist/src/machine.d.ts +139 -0
- package/dist/src/machine.d.ts.map +1 -0
- package/dist/src/machine.js +400 -0
- package/dist/src/machine.js.map +1 -0
- package/dist/src/parser/ast.d.ts +369 -0
- package/dist/src/parser/ast.d.ts.map +1 -0
- package/dist/src/parser/ast.js +17 -0
- package/dist/src/parser/ast.js.map +1 -0
- package/dist/src/parser/parser.d.ts +48 -0
- package/dist/src/parser/parser.d.ts.map +1 -0
- package/dist/src/parser/parser.js +1950 -0
- package/dist/src/parser/parser.js.map +1 -0
- package/dist/src/policy/effects.d.ts +86 -0
- package/dist/src/policy/effects.d.ts.map +1 -0
- package/dist/src/policy/effects.js +53 -0
- package/dist/src/policy/effects.js.map +1 -0
- package/dist/src/policy/policy.d.ts +130 -0
- package/dist/src/policy/policy.d.ts.map +1 -0
- package/dist/src/policy/policy.js +532 -0
- package/dist/src/policy/policy.js.map +1 -0
- package/dist/src/printer/doc.d.ts +151 -0
- package/dist/src/printer/doc.d.ts.map +1 -0
- package/dist/src/printer/doc.js +409 -0
- package/dist/src/printer/doc.js.map +1 -0
- package/dist/src/printer/highlight.d.ts +53 -0
- package/dist/src/printer/highlight.d.ts.map +1 -0
- package/dist/src/printer/highlight.js +339 -0
- package/dist/src/printer/highlight.js.map +1 -0
- package/dist/src/printer/html.d.ts +72 -0
- package/dist/src/printer/html.d.ts.map +1 -0
- package/dist/src/printer/html.js +423 -0
- package/dist/src/printer/html.js.map +1 -0
- package/dist/src/printer/print.d.ts +63 -0
- package/dist/src/printer/print.d.ts.map +1 -0
- package/dist/src/printer/print.js +484 -0
- package/dist/src/printer/print.js.map +1 -0
- package/dist/src/printer/summary.d.ts +50 -0
- package/dist/src/printer/summary.d.ts.map +1 -0
- package/dist/src/printer/summary.js +621 -0
- package/dist/src/printer/summary.js.map +1 -0
- package/dist/src/trace/events.d.ts +183 -0
- package/dist/src/trace/events.d.ts.map +1 -0
- package/dist/src/trace/events.js +9 -0
- package/dist/src/trace/events.js.map +1 -0
- package/dist/src/trace/progress.d.ts +58 -0
- package/dist/src/trace/progress.d.ts.map +1 -0
- package/dist/src/trace/progress.js +83 -0
- package/dist/src/trace/progress.js.map +1 -0
- package/dist/src/vm/arith.d.ts +29 -0
- package/dist/src/vm/arith.d.ts.map +1 -0
- package/dist/src/vm/arith.js +258 -0
- package/dist/src/vm/arith.js.map +1 -0
- package/dist/src/vm/builtins.d.ts +31 -0
- package/dist/src/vm/builtins.d.ts.map +1 -0
- package/dist/src/vm/builtins.js +1773 -0
- package/dist/src/vm/builtins.js.map +1 -0
- package/dist/src/vm/emulate.d.ts +75 -0
- package/dist/src/vm/emulate.d.ts.map +1 -0
- package/dist/src/vm/emulate.js +380 -0
- package/dist/src/vm/emulate.js.map +1 -0
- package/dist/src/vm/expand.d.ts +68 -0
- package/dist/src/vm/expand.d.ts.map +1 -0
- package/dist/src/vm/expand.js +744 -0
- package/dist/src/vm/expand.js.map +1 -0
- package/dist/src/vm/external.d.ts +34 -0
- package/dist/src/vm/external.d.ts.map +1 -0
- package/dist/src/vm/external.js +228 -0
- package/dist/src/vm/external.js.map +1 -0
- package/dist/src/vm/fifo.d.ts +66 -0
- package/dist/src/vm/fifo.d.ts.map +1 -0
- package/dist/src/vm/fifo.js +232 -0
- package/dist/src/vm/fifo.js.map +1 -0
- package/dist/src/vm/interp.d.ts +209 -0
- package/dist/src/vm/interp.d.ts.map +1 -0
- package/dist/src/vm/interp.js +1641 -0
- package/dist/src/vm/interp.js.map +1 -0
- package/dist/src/vm/io.d.ts +180 -0
- package/dist/src/vm/io.d.ts.map +1 -0
- package/dist/src/vm/io.js +502 -0
- package/dist/src/vm/io.js.map +1 -0
- package/dist/src/vm/pattern.d.ts +46 -0
- package/dist/src/vm/pattern.d.ts.map +1 -0
- package/dist/src/vm/pattern.js +498 -0
- package/dist/src/vm/pattern.js.map +1 -0
- package/dist/src/vm/proc.d.ts +94 -0
- package/dist/src/vm/proc.d.ts.map +1 -0
- package/dist/src/vm/proc.js +130 -0
- package/dist/src/vm/proc.js.map +1 -0
- package/dist/src/vm/state.d.ts +104 -0
- package/dist/src/vm/state.d.ts.map +1 -0
- package/dist/src/vm/state.js +233 -0
- package/dist/src/vm/state.js.map +1 -0
- package/dist/src/vm/test.d.ts +11 -0
- package/dist/src/vm/test.d.ts.map +1 -0
- package/dist/src/vm/test.js +277 -0
- package/dist/src/vm/test.js.map +1 -0
- package/package.json +63 -4
- package/src/analysis/analyze.ts +1395 -0
- package/src/analysis/fs.ts +121 -0
- package/src/analysis/outputs.ts +242 -0
- package/src/analysis/value.ts +264 -0
- package/src/behaviors/defs/core.ts +970 -0
- package/src/behaviors/defs/devtools.ts +400 -0
- package/src/behaviors/defs/macos.ts +426 -0
- package/src/behaviors/defs/tools.ts +596 -0
- package/src/behaviors/dsl.ts +293 -0
- package/src/behaviors/index.ts +19 -0
- package/src/behaviors/registry.ts +261 -0
- package/src/behaviors/roles.ts +187 -0
- package/src/behaviors/types.ts +127 -0
- package/src/index.ts +27 -0
- package/src/integrations/deepsea.ts +259 -0
- package/src/machine.ts +483 -0
- package/src/parser/ast.ts +472 -0
- package/src/parser/parser.ts +1826 -0
- package/src/policy/effects.ts +102 -0
- package/src/policy/policy.ts +578 -0
- package/src/printer/doc.ts +454 -0
- package/src/printer/highlight.ts +283 -0
- package/src/printer/html.ts +441 -0
- package/src/printer/print.ts +528 -0
- package/src/printer/summary.ts +601 -0
- package/src/trace/events.ts +102 -0
- package/src/trace/progress.ts +119 -0
- package/src/vm/arith.ts +236 -0
- package/src/vm/builtins.ts +1590 -0
- package/src/vm/emulate.ts +337 -0
- package/src/vm/expand.ts +721 -0
- package/src/vm/external.ts +265 -0
- package/src/vm/fifo.ts +226 -0
- package/src/vm/interp.ts +1623 -0
- package/src/vm/io.ts +570 -0
- package/src/vm/pattern.ts +477 -0
- package/src/vm/proc.ts +147 -0
- package/src/vm/state.ts +267 -0
- 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) => ({ '&': '&', '<': '<', '>': '>', '"': '"' })[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":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAGxD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAC9D,OAAO,EAAE,QAAQ,EAAsB,MAAM,YAAY,CAAA;AAqCzD,+CAA+C;AAC/C,SAAS,aAAa,CAAC,CAAS;IAC9B,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,GAAG;YAAE,SAAQ;QACzC,IAAI,IAAI,KAAK,IAAI;YAAE,GAAG,CAAC,GAAG,EAAE,CAAA;;YACvB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACrB,CAAC;IACD,OAAO,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;AACzE,CAAC;AAED,IAAI,eAAe,GAA4B,IAAI,CAAA;AAEnD;;;GAGG;AACH,SAAS,WAAW,CAAC,MAAgB,EAAE,MAAc,EAAE,GAAuB,EAAE,IAAwB;IACtG,MAAM,GAAG,GAAG,IAAI,GAAG,EAAoB,CAAA;IACvC,MAAM,KAAK,GAAG,IAAI,GAAG,EAA8B,CAAA;IACnD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE;YAC3C,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;YAC3C,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE;YAC/B,MAAM,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,aAAa,EAAE,GAAG,IAAI,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE;YACjI,SAAS,EAAE,CAAC,eAAe,KAAK,gBAAgB,EAAE,CAAC;SACpD,CAAC,CAAA;QACF,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ;YAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,GAAuB,EAAsB,EAAE;QACvE,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,SAAS,CAAA,CAAC,gCAAgC;QAC9E,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,aAAa,CAAC,CAAC,CAAC,CAAA;QAC9C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAC/F,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,SAAS,CAAA,CAAC,QAAQ;QAChD,OAAO,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACvD,CAAC,CAAA;IACD,MAAM,GAAG,GAAG,CAAC,EAAU,EAAE,CAAgB,EAAE,GAAuB,EAAQ,EAAE;QAC1E,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE;YAAE,OAAM;QAClC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;IACjD,CAAC,CAAA;IACD,MAAM,KAAK,GAAG,CAAC,CAAU,EAAQ,EAAE;QACjC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,KAAK,MAAM,CAAC,IAAI,CAAC;gBAAE,KAAK,CAAC,CAAC,CAAC,CAAA;YAC3B,OAAM;QACR,CAAC;QACD,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAM;QAC/C,MAAM,IAAI,GAAG,CAAqC,CAAA;QAClD,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YAClC,MAAM,CAAC,GAAG,IAAkC,CAAA;YAC5C,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YAC3B,IAAI,KAAK,GAA0C,EAAE,CAAA;YACrD,IAAI,CAAC;gBACH,KAAK,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAA;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACP,eAAe;YACjB,CAAC;YACD,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACvB,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC;oBAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;YACpG,CAAC,CAAC,CAAA;YACF,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;gBACzB,IAAI,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAAE,SAAQ;gBACxF,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAA;YAC5C,CAAC;QACH,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,KAAK,CAAC,CAAC,CAAC,CAAA;IACrG,CAAC,CAAA;IACD,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAClB,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,kGAAkG;AAClG,SAAS,SAAS,CAAC,CAAW,EAAE,IAAwB;IACtD,IAAI,CAAC,CAAC,CAAC,GAAG;QAAE,OAAO,CAAC,CAAC,OAAO,CAAA;IAC5B,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;IAC/G,OAAO,KAAK,KAAK,CAAC,CAAC,GAAG,IAAI,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,GAAG,EAAE,CAAA;AAClG,CAAC;AAED,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;AAa/G,MAAM,QAAQ,GAAG,GAAG,CAAA;AAOpB,gEAAgE;AAChE,SAAS,YAAY,CAAC,GAAQ,EAAE,MAAM,IAAI,GAAG,EAAgB;IAC3D,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAA;IACvC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,IAAI,GAAG;YAAE,YAAY,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;QACzC,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC;QACd,KAAK,KAAK,CAAC;QACX,KAAK,SAAS;YACZ,IAAI,GAAG,CAAC,IAAI;gBAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAA;YACnF,MAAK;QACP,KAAK,OAAO,CAAC;QAAC,KAAK,QAAQ,CAAC;QAAC,KAAK,MAAM;YAAE,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAAC,MAAK;QAC3E,KAAK,MAAM;YAAE,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK;gBAAE,YAAY,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAAC,MAAK;QACnE,KAAK,SAAS;YAAE,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAAC,MAAK;QACjF,KAAK,QAAQ;YAAE,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAAC,MAAK;QAChD,OAAO,CAAC,CAAC,MAAK;IAChB,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;GAIG;AACH,2EAA2E;AAC3E,SAAS,SAAS,CAAC,MAAc,EAAE,CAAO;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;IAChD,OAAO,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,CAAA;AACzF,CAAC;AAED,kFAAkF;AAClF,SAAS,WAAW,CAAC,MAAc,EAAE,CAAO,EAAE,KAAa;IACzD,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,CAAA;IAC5B,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,IAAI,CAAA;IAC9B,IAAI,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IACvC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;QAAE,IAAI,GAAG,KAAK,CAAA;IACjD,IAAI,IAAI,IAAI,CAAC,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IAChC,MAAM,KAAK,GAAyB;QAClC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE;QAC3C,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;QAChC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE;KAC1C,CAAA;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAA;AAC9D,CAAC;AAED,SAAS,UAAU,CAAC,MAAc,EAAE,CAAO,EAAE,KAAa,EAAE,IAAY,EAAE,QAAgB;IACxF,IAAI,CAAC,CAAC,IAAI;QAAE,OAAO,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,CAAA;IAChD,MAAM,KAAK,GAAuB,EAAE,CAAA;IACpC,IAAI,GAAG,GAAG,CAAC,CAAC,KAAK,CAAA;IACjB,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QACtC,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;QACrD,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;QACpB,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG;YAAE,MAAK;QACrB,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;IACb,CAAC;IACD,oEAAoE;IACpE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI;QAAE,KAAK,CAAC,GAAG,EAAE,CAAA;IAC/I,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;IAClC,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAChG,MAAM,KAAK,GAAyB,EAAE,CAAA;IACtC,IAAI,MAAM,GAAG,KAAK,CAAA;IAClB,MAAM,IAAI,GAAG,CAAC,EAAU,EAAE,EAAU,EAAE,KAAa,EAAE,KAAa,EAAQ,EAAE;QAC1E,IAAI,EAAE,GAAG,EAAE,IAAI,KAAK,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAA;YAChD,OAAM;QACR,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,CAAA;QAC3C,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CAAA;QACvD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC,CAAA;QAC/D,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAA;QAC5C,IAAI,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAA;QACnE,MAAM,GAAG,IAAI,CAAA;IACf,CAAC,CAAA;IACD,MAAM,YAAY,GAAG,CAAC,CAAS,EAAQ,EAAE;QACvC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACrB,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACzF,CAAC,CAAA;IACD,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAA;IACtB,MAAM,OAAO,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IAClF,MAAM,OAAO,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACnE,IAAI,KAAe,CAAA;IACnB,IAAI,YAAY,GAAG,CAAC,CAAC,CAAA;IACrB,IAAI,UAAU,GAAG,CAAC,CAAC,CAAA;IACnB,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC;QACjB,MAAM,GAAG,IAAI,CAAA;QACb,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACpB,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;YACnC,YAAY,GAAG,QAAQ,CAAA;YACvB,UAAU,GAAG,CAAC,CAAA;QAChB,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;YAC3D,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAA;YACxC,UAAU,GAAG,CAAC,GAAG,CAAC,CAAA;QACpB,CAAC;IACH,CAAC;;QAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;IACnC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,KAAK,UAAU,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;YAC1C,MAAM,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAA;YACjC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YACzD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,UAAU,GAAG,YAAY,eAAe,EAAE,CAAC,CAAA;QACnF,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;QACtD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI;YAAE,YAAY,CAAC,CAAC,CAAC,CAAA;IACrD,CAAC;IACD,IAAI,YAAY,IAAI,CAAC,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QAC1C,MAAM,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAA;QACjC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAA;QACnD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,UAAU,GAAG,YAAY,eAAe,EAAE,CAAC,CAAA;IACnF,CAAC;IACD,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IACxB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC5H,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AACxB,CAAC;AAED,MAAM,GAAG,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAA;AAE/H,8EAA8E;AAC9E,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,UAAuB,EAAE;IAClE,OAAO,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;AACxD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAgB,EAAE,MAAc,EAAE,UAAuB,EAAE;IACzF,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAA;IACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAA;IACtC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAA;IACrC,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,EAAE,CAAA;IACjD,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;IACvD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;IACxB,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAA;IAC/B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAA;IACxC,8EAA8E;IAC9E,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAA;IACvC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;QAC/B,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC;YAAE,SAAQ;QAChD,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;QACpE,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,SAAQ;QACzD,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAA;IAC/E,CAAC;IACD,oFAAoF;IACpF,MAAM,QAAQ,GAAG,QAAQ,IAAI,CAAC,OAAO,CAAC,gBAAgB,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;IACnF,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAExC,IAAI,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAA;IAC5C,IAAI,CAAC,GAAiB,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;IACpD,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,QAAQ,IAAI,IAAI,GAAG,aAAa,EAAE,IAAI,EAAE,EAAE,CAAC;QAC5D,OAAO,GAAG,IAAI,GAAG,EAAE,CAAA;QACnB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAC/B,MAAM,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;YAC9E,IAAI,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;QAC7B,CAAC;QACD,CAAC,GAAG,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAA;QACrD,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2C,CAAA;QACjE,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;YACvC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAA;YACnC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAC5B,CAAC;QACD,IAAI,OAAO,GAAG,KAAK,CAAA;QACnB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YACrC,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;YAC9B,IAAI,IAAI,IAAI,CAAC;gBAAE,OAAM;YACrB,wHAAwH;YACxH,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;iBAC1E,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;iBAC3E,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAE,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,CAAA;YAChE,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,IAAI,IAAI,IAAI,CAAC;oBAAE,MAAK;gBACpB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAA;gBAC5C,IAAI,KAAK,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;oBAC9D,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;oBACvB,IAAI,IAAI,CAAC,CAAC,KAAK,GAAG,KAAK,CAAA;oBACvB,OAAO,GAAG,IAAI,CAAA;gBAChB,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,OAAO;YAAE,MAAK;IACrB,CAAC;IAED,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,QAAiB,EAAU,EAAE,CAC5E,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAC9B,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,QAAQ,IAAI,EAAE,CAAA;QACrC,OAAO,GAAG,CAAC,CAAC,CAAC,gBAAgB,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC7E,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEb,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAK,UAAyE,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAA;IAC1H,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,EAAoB,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IACpH,MAAM,SAAS,GAAG,IAAI,CAAA;IAEtB,IAAI,IAAI,GAAG,EAAE,CAAA;IACb,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAChE,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACjE,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;YACd,4FAA4F;YAC5F,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAK,CAAC,CAAA;YAC5B,MAAM,OAAO,GAAa,EAAE,CAAA;YAC5B,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,CAAA;gBACxE,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;YACtD,CAAC;YACD,IAAI,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACzB,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;YACtD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAA;YACjH,MAAM,IAAI,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;YACvE,IAAI,IAAI,gBAAgB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,CAAA;YAC1E,IAAI,CAAC,EAAE,CAAC;gBACN,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;oBAC3B,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;wBAAE,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAA;yBACrE,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;wBAAE,IAAI,IAAI,qBAAqB,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAA;yBACxG,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;wBAAE,IAAI,IAAI,oBAAoB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAA;gBACpF,CAAC;YACH,CAAC;iBAAM,IAAI,CAAC,CAAC,GAAG;gBAAE,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAA;;gBAC3D,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;YACxB,IAAI,IAAI,SAAS,CAAA;QACnB,CAAC;aAAM,IAAI,CAAC,CAAC,GAAG;YAAE,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAA;;YAC3D,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IACnF,CAAC;IACD,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAA;IAC7E,OAAO,EAAE,IAAI,EAAE,qBAAqB,IAAI,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,CAAA;AACxG,CAAC;AAOD;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAA6G;IAC9I,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;QACnC,MAAM,CAAC,GAAG,CAAC,CAAC,MAA4B,CAAA;QACxC,MAAM,IAAI,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,mBAAmB,CAAC,CAAA;QAC9C,IAAI,IAAI,EAAE,CAAC;YACT,CAAC,CAAC,cAAc,EAAE,CACjB;YAAC,UAAoF,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;YACvI,OAAM;QACR,CAAC;QACD,CAAC,EAAE,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,mHAAmH;AACnH,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,kBAAkB,CAAC,QAAQ,EAAE,aAAa,CAAA;AAEzE,yHAAyH;AACzH,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BvB,CAAA"}
|
|
@@ -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"}
|