@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,151 @@
1
+ /**
2
+ * A small Wadler/Prettier-style document IR and renderer, with three
3
+ * bash-specific extensions:
4
+ *
5
+ * - Two kinds of line break. `cont` separates words of one command and
6
+ * breaks as ` \` + newline (a line continuation). `nl` sits where bash
7
+ * accepts a bare newline (after `|`, `&&`, `;`, `then`, `do`, `{` …).
8
+ * - A here-document queue: a `heredoc` element is emitted after the next
9
+ * real newline (an `nl` or `hard` break, never a continuation), which is
10
+ * where bash reads here-doc bodies.
11
+ * - Line suffixes for trailing comments: written just before the next real
12
+ * newline, so `a # c` stays one line. Rendering a continuation while a
13
+ * comment is pending would comment out the backslash, so it throws.
14
+ *
15
+ * Indentation is written lazily (only before text), so the output never has
16
+ * trailing whitespace on blank lines.
17
+ */
18
+ /** A truncatable atom (a word, comment or here-doc body) for the HTML renderer. */
19
+ export interface AtomInfo {
20
+ id: number;
21
+ kind: 'word' | 'hd' | 'cm';
22
+ /** Preference when choosing what to shorten (higher first); 0 = never. */
23
+ weight: number;
24
+ /** A path: shortened from the left, keeping its tail (`…/pages/395.html`). */
25
+ tail?: boolean;
26
+ }
27
+ export type Doc = string | Doc[]
28
+ /** Verbatim source text `source.slice(start, end)`. */
29
+ | {
30
+ t: 'src';
31
+ start: number;
32
+ end: number;
33
+ atom?: AtomInfo;
34
+ cls?: string;
35
+ }
36
+ /** Generated text with a highlight class (keywords, operators). */
37
+ | {
38
+ t: 'tok';
39
+ text: string;
40
+ cls: string;
41
+ } | {
42
+ t: 'group';
43
+ doc: Doc;
44
+ break?: boolean;
45
+ heredocBreaks?: boolean;
46
+ } | {
47
+ t: 'indent';
48
+ doc: Doc;
49
+ by: number;
50
+ } | {
51
+ t: 'line';
52
+ kind: 'cont' | 'nl' | 'hard';
53
+ flat: string;
54
+ blank?: boolean;
55
+ force?: boolean;
56
+ } | {
57
+ t: 'fill';
58
+ parts: Doc[];
59
+ } | {
60
+ t: 'ifBreak';
61
+ broken: Doc;
62
+ flat: Doc;
63
+ } | {
64
+ t: 'suffix';
65
+ doc: Doc;
66
+ } | {
67
+ t: 'breakParent';
68
+ } | {
69
+ t: 'heredoc';
70
+ start: number;
71
+ end: number;
72
+ terminator: string;
73
+ atom?: AtomInfo;
74
+ } | {
75
+ t: 'mark';
76
+ id: number;
77
+ doc: Doc;
78
+ };
79
+ export declare const group: (doc: Doc, brk?: boolean) => Doc;
80
+ /**
81
+ * A compound command's group: also breaks when it contains a here-doc, so the
82
+ * body is emitted before the closing keyword (bash stores a function or
83
+ * compound command before reading a body that follows its line).
84
+ */
85
+ export declare const compoundGroup: (doc: Doc, brk?: boolean) => Doc;
86
+ export declare const indent: (doc: Doc, by: number) => Doc;
87
+ /** Word separator: ' ' flat, ' \' + newline broken. */
88
+ export declare const cont: Doc;
89
+ /** A continuation that always breaks (prefix assignments on their own lines). */
90
+ export declare const contForced: Doc;
91
+ /** A bare-newline break that prints `flat` when the group fits. */
92
+ export declare const nl: (flat?: string, blank?: boolean) => Doc;
93
+ /** Always a newline. */
94
+ export declare const hard: Doc;
95
+ export declare const blankLine: Doc;
96
+ export declare const fill: (parts: Doc[]) => Doc;
97
+ export declare const ifBreak: (broken: Doc, flat: Doc) => Doc;
98
+ /** Text written just before the next real newline (a trailing comment); breaks enclosing groups. */
99
+ export declare const suffix: (doc: Doc) => Doc;
100
+ export declare const heredoc: (start: number, end: number, terminator: string, atom?: AtomInfo) => Doc;
101
+ export declare const src: (start: number, end: number, atom?: AtomInfo, cls?: string) => Doc;
102
+ export declare const tok: (text: string, cls: string) => Doc;
103
+ export declare const mark: (id: number, doc: Doc) => Doc;
104
+ export declare function join(sep: Doc, docs: Doc[]): Doc[];
105
+ export interface RenderResult {
106
+ text: string;
107
+ /** Output range of every `mark`ed node. */
108
+ map: Map<number, {
109
+ start: number;
110
+ end: number;
111
+ }>;
112
+ /** The output as classified pieces, in order (for the HTML renderer). */
113
+ pieces: Piece[];
114
+ /** Where each atom's first line landed: output line, column and width. */
115
+ atoms: Map<number, {
116
+ line: number;
117
+ col: number;
118
+ width: number;
119
+ }>;
120
+ }
121
+ /** A piece of output: generated text, or verbatim source (`src`), possibly an atom shown through a display. */
122
+ export interface Piece {
123
+ text: string;
124
+ cls?: string;
125
+ src?: [number, number];
126
+ atom?: number;
127
+ }
128
+ /** How an atom is displayed (the HTML renderer's truncation): `text` is what is measured and shown. */
129
+ export interface AtomDisplay {
130
+ text: string;
131
+ parts: ({
132
+ kind: 'show' | 'hide';
133
+ start: number;
134
+ end: number;
135
+ } | {
136
+ kind: 'mark';
137
+ text: string;
138
+ })[];
139
+ }
140
+ export interface RenderContext {
141
+ source: string;
142
+ display?: Map<number, AtomDisplay>;
143
+ /**
144
+ * Smallest width each atom may be shortened to. When given, a group (or an
145
+ * argument) whose line fits with its atoms at these widths stays on one
146
+ * line instead of breaking: the caller then shortens the atoms to fit.
147
+ */
148
+ minWidth?: Map<number, number>;
149
+ }
150
+ export declare function render(root: Doc, width: number, ctx: RenderContext): RenderResult;
151
+ //# sourceMappingURL=doc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc.d.ts","sourceRoot":"","sources":["../../../src/printer/doc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,409 @@
1
+ /**
2
+ * A small Wadler/Prettier-style document IR and renderer, with three
3
+ * bash-specific extensions:
4
+ *
5
+ * - Two kinds of line break. `cont` separates words of one command and
6
+ * breaks as ` \` + newline (a line continuation). `nl` sits where bash
7
+ * accepts a bare newline (after `|`, `&&`, `;`, `then`, `do`, `{` …).
8
+ * - A here-document queue: a `heredoc` element is emitted after the next
9
+ * real newline (an `nl` or `hard` break, never a continuation), which is
10
+ * where bash reads here-doc bodies.
11
+ * - Line suffixes for trailing comments: written just before the next real
12
+ * newline, so `a # c` stays one line. Rendering a continuation while a
13
+ * comment is pending would comment out the backslash, so it throws.
14
+ *
15
+ * Indentation is written lazily (only before text), so the output never has
16
+ * trailing whitespace on blank lines.
17
+ */
18
+ // ---------------------------------------------------------------------------
19
+ // Builders
20
+ // ---------------------------------------------------------------------------
21
+ export const group = (doc, brk = false) => ({ t: 'group', doc, break: brk });
22
+ /**
23
+ * A compound command's group: also breaks when it contains a here-doc, so the
24
+ * body is emitted before the closing keyword (bash stores a function or
25
+ * compound command before reading a body that follows its line).
26
+ */
27
+ export const compoundGroup = (doc, brk = false) => ({ t: 'group', doc, break: brk, heredocBreaks: true });
28
+ export const indent = (doc, by) => ({ t: 'indent', doc, by });
29
+ /** Word separator: ' ' flat, ' \' + newline broken. */
30
+ export const cont = { t: 'line', kind: 'cont', flat: ' ' };
31
+ /** A continuation that always breaks (prefix assignments on their own lines). */
32
+ export const contForced = { t: 'line', kind: 'cont', flat: ' ', force: true };
33
+ /** A bare-newline break that prints `flat` when the group fits. */
34
+ export const nl = (flat = ' ', blank = false) => ({ t: 'line', kind: 'nl', flat, blank });
35
+ /** Always a newline. */
36
+ export const hard = { t: 'line', kind: 'hard', flat: '' };
37
+ export const blankLine = { t: 'line', kind: 'hard', flat: '', blank: true };
38
+ export const fill = (parts) => ({ t: 'fill', parts });
39
+ export const ifBreak = (broken, flat) => ({ t: 'ifBreak', broken, flat });
40
+ /** Text written just before the next real newline (a trailing comment); breaks enclosing groups. */
41
+ export const suffix = (doc) => [{ t: 'suffix', doc }, { t: 'breakParent' }];
42
+ export const heredoc = (start, end, terminator, atom) => ({ t: 'heredoc', start, end, terminator, atom });
43
+ export const src = (start, end, atom, cls) => ({ t: 'src', start, end, atom, cls });
44
+ export const tok = (text, cls) => ({ t: 'tok', text, cls });
45
+ export const mark = (id, doc) => ({ t: 'mark', id, doc });
46
+ export function join(sep, docs) {
47
+ const out = [];
48
+ docs.forEach((d, i) => {
49
+ if (i > 0)
50
+ out.push(sep);
51
+ out.push(d);
52
+ });
53
+ return out;
54
+ }
55
+ // ---------------------------------------------------------------------------
56
+ // Break propagation: hard lines and comments break every enclosing group
57
+ // ---------------------------------------------------------------------------
58
+ /** Returns [forces a break, contains a here-doc]. */
59
+ function propagate(doc) {
60
+ if (typeof doc === 'string')
61
+ return [false, false];
62
+ const all = (docs) => {
63
+ let brk = false;
64
+ let hd = false;
65
+ for (const d of docs) {
66
+ const [b, h] = propagate(d);
67
+ brk ||= b;
68
+ hd ||= h;
69
+ }
70
+ return [brk, hd];
71
+ };
72
+ if (Array.isArray(doc))
73
+ return all(doc);
74
+ switch (doc.t) {
75
+ case 'group': {
76
+ const [inner, hd] = propagate(doc.doc);
77
+ if (inner || (hd && doc.heredocBreaks))
78
+ doc.break = true;
79
+ return [inner || doc.break === true, hd];
80
+ }
81
+ case 'indent':
82
+ case 'mark':
83
+ return propagate(doc.doc);
84
+ case 'fill':
85
+ return all(doc.parts);
86
+ case 'ifBreak':
87
+ return all([doc.broken, doc.flat]);
88
+ case 'line':
89
+ return [doc.kind === 'hard', false];
90
+ case 'breakParent':
91
+ return [true, false];
92
+ case 'heredoc':
93
+ return [false, true];
94
+ default:
95
+ return [false, false];
96
+ }
97
+ }
98
+ /** Width of `s` up to its first newline, and whether it contains one. */
99
+ function measure(s) {
100
+ const i = s.indexOf('\n');
101
+ return i === -1 ? { width: s.length, multiline: false } : { width: i, multiline: true };
102
+ }
103
+ export function render(root, width, ctx) {
104
+ propagate(root);
105
+ const source = ctx.source;
106
+ /** The text a `src` element shows (its atom display when truncated). */
107
+ const srcText = (d) => {
108
+ const disp = d.atom ? ctx.display?.get(d.atom.id) : undefined;
109
+ return disp ? disp.text : source.slice(d.start, d.end);
110
+ };
111
+ const hasNewline = (doc) => {
112
+ if (typeof doc === 'string')
113
+ return doc.includes('\n');
114
+ if (Array.isArray(doc))
115
+ return doc.some(hasNewline);
116
+ switch (doc.t) {
117
+ case 'src': return srcText(doc).includes('\n');
118
+ case 'tok': return doc.text.includes('\n');
119
+ case 'group':
120
+ case 'indent':
121
+ case 'mark': return hasNewline(doc.doc);
122
+ case 'fill': return doc.parts.some(hasNewline);
123
+ case 'ifBreak': return hasNewline(doc.flat);
124
+ case 'line': return doc.kind === 'hard';
125
+ default: return false;
126
+ }
127
+ };
128
+ /**
129
+ * Does `next` (followed by the rest of the current line, from `rest`) fit in
130
+ * `avail` columns? Measures up to the first line break that will happen.
131
+ */
132
+ const fitsExact = (next, rest, avail, mustBeFlat, compressed) => {
133
+ let remaining = avail;
134
+ const stack = [next];
135
+ let restIdx = rest.length - 1;
136
+ const text = (s) => {
137
+ const m = measure(s);
138
+ remaining -= m.width;
139
+ return m.multiline ? remaining >= 0 : null;
140
+ };
141
+ while (remaining >= 0) {
142
+ let cmd = stack.pop();
143
+ if (!cmd) {
144
+ if (restIdx < 0)
145
+ return true;
146
+ cmd = rest[restIdx--];
147
+ }
148
+ const { ind, mode, doc } = cmd;
149
+ if (typeof doc === 'string') {
150
+ const r = text(doc);
151
+ if (r !== null)
152
+ return r;
153
+ continue;
154
+ }
155
+ if (Array.isArray(doc)) {
156
+ for (let i = doc.length - 1; i >= 0; i--)
157
+ stack.push({ ind, mode, doc: doc[i] });
158
+ continue;
159
+ }
160
+ switch (doc.t) {
161
+ case 'src': {
162
+ const t = srcText(doc);
163
+ const min = compressed && doc.atom ? ctx.minWidth?.get(doc.atom.id) : undefined;
164
+ if (min !== undefined && !t.includes('\n')) {
165
+ remaining -= Math.min(t.length, min);
166
+ break;
167
+ }
168
+ const r = text(t);
169
+ if (r !== null)
170
+ return r;
171
+ break;
172
+ }
173
+ case 'tok': {
174
+ const r = text(doc.text);
175
+ if (r !== null)
176
+ return r;
177
+ break;
178
+ }
179
+ case 'group':
180
+ if (mustBeFlat && doc.break)
181
+ return false;
182
+ stack.push({ ind, mode: doc.break ? 'break' : mode, doc: doc.doc });
183
+ break;
184
+ case 'indent':
185
+ case 'mark':
186
+ stack.push({ ind, mode, doc: doc.doc });
187
+ break;
188
+ case 'fill':
189
+ for (let i = doc.parts.length - 1; i >= 0; i--)
190
+ stack.push({ ind, mode, doc: doc.parts[i] });
191
+ break;
192
+ case 'ifBreak':
193
+ stack.push({ ind, mode, doc: mode === 'break' ? doc.broken : doc.flat });
194
+ break;
195
+ case 'line':
196
+ if (doc.force) {
197
+ // a forced continuation (assignment lines): what follows must fit on the new line
198
+ remaining = width - ind;
199
+ break;
200
+ }
201
+ if (doc.kind === 'hard' || mode === 'break')
202
+ return true;
203
+ remaining -= doc.flat.length;
204
+ break;
205
+ default:
206
+ break;
207
+ }
208
+ }
209
+ return false;
210
+ };
211
+ /** Fits as is, or (when atoms may be shortened) with every atom at its minimum width. */
212
+ const fits = (next, rest, avail, mustBeFlat) =>
213
+ // compressed: keep 3 columns for what a break would add at the line end (` \\`, ` &&`, `; \\`)
214
+ fitsExact(next, rest, avail, mustBeFlat, false) || (ctx.minWidth !== undefined && fitsExact(next, rest, avail - 3, mustBeFlat, true));
215
+ /** Fits without shortening anything. */
216
+ const fitsAsIs = (next, rest, avail, mustBeFlat) => fitsExact(next, rest, avail, mustBeFlat, false);
217
+ let out = '';
218
+ let col = 0;
219
+ let line = 0;
220
+ let pendingIndent = null;
221
+ let suffixes = [];
222
+ let heredocs = [];
223
+ const pieces = [];
224
+ const atoms = new Map();
225
+ const map = new Map();
226
+ const openMarks = [];
227
+ const write = (s, meta = {}) => {
228
+ if (s === '')
229
+ return;
230
+ if (pendingIndent !== null) {
231
+ if (pendingIndent > 0) {
232
+ const pad = ' '.repeat(pendingIndent);
233
+ out += pad;
234
+ pieces.push({ text: pad });
235
+ }
236
+ col = pendingIndent;
237
+ pendingIndent = null;
238
+ }
239
+ for (const m of openMarks)
240
+ if (m.start === null)
241
+ m.start = out.length;
242
+ if (meta.atom !== undefined)
243
+ atoms.set(meta.atom, { line, col, width: measure(s).width });
244
+ out += s;
245
+ pieces.push({ text: s, ...meta });
246
+ const i = s.lastIndexOf('\n');
247
+ if (i === -1)
248
+ col += s.length;
249
+ else {
250
+ col = s.length - i - 1;
251
+ for (const ch of s)
252
+ if (ch === '\n')
253
+ line++;
254
+ }
255
+ };
256
+ const rawNewline = () => {
257
+ out += '\n';
258
+ pieces.push({ text: '\n' });
259
+ line++;
260
+ col = 0;
261
+ };
262
+ /** Write a document that holds only text (suffixes): src, tok, strings, arrays. */
263
+ const writeInline = (d) => {
264
+ if (typeof d === 'string')
265
+ write(d);
266
+ else if (Array.isArray(d))
267
+ d.forEach(writeInline);
268
+ else if (d.t === 'src')
269
+ write(srcText(d), { src: [d.start, d.end], atom: d.atom?.id, cls: d.cls });
270
+ else if (d.t === 'tok')
271
+ write(d.text, { cls: d.cls });
272
+ };
273
+ const newline = (ind, blank, kind) => {
274
+ if (kind === 'cont') {
275
+ if (suffixes.length > 0)
276
+ throw new Error('printer: a comment would swallow a line continuation');
277
+ write(' ');
278
+ write('\\', { cls: 'ct' });
279
+ rawNewline();
280
+ pendingIndent = ind;
281
+ return;
282
+ }
283
+ if (suffixes.length > 0) {
284
+ for (const sfx of suffixes)
285
+ writeInline(sfx);
286
+ suffixes = [];
287
+ }
288
+ rawNewline();
289
+ if (heredocs.length > 0) {
290
+ for (const h of heredocs) {
291
+ const body = srcText(h);
292
+ if (body !== '') {
293
+ write(body, { src: [h.start, h.end], atom: h.atom?.id, cls: 'hd' });
294
+ if (!body.endsWith('\n'))
295
+ rawNewline();
296
+ }
297
+ write(h.terminator, { cls: 'rd' });
298
+ rawNewline();
299
+ }
300
+ heredocs = [];
301
+ }
302
+ if (blank)
303
+ rawNewline();
304
+ pendingIndent = ind;
305
+ };
306
+ const stack = [{ ind: 0, mode: 'break', doc: root }];
307
+ const restCmds = () => stack.filter((s) => 'doc' in s);
308
+ while (stack.length > 0) {
309
+ const item = stack.pop();
310
+ if ('close' in item) {
311
+ const m = openMarks.pop();
312
+ map.set(m.id, { start: m.start ?? out.length, end: out.length });
313
+ continue;
314
+ }
315
+ if ('fillRest' in item) {
316
+ // [separator, content, separator, content, …]
317
+ const [sep, content, ...more] = item.fillRest;
318
+ if (content === undefined)
319
+ continue;
320
+ const pairFits = fits({ ind: item.ind, mode: 'flat', doc: [sep, content] }, [], width - col, true);
321
+ // Breaking only helps if the content then fits on its fresh line. A word
322
+ // that is too long anyway, or spans lines (a quoted multi-line string),
323
+ // stays attached: a ` \` there would only separate it from its flag.
324
+ const breakHelps = !pairFits && !hasNewline(content) && fitsAsIs({ ind: item.ind, mode: 'flat', doc: content }, [], width - item.ind, true);
325
+ if (more.length > 0)
326
+ stack.push({ fillRest: more, ind: item.ind });
327
+ stack.push({ ind: item.ind, mode: pairFits ? 'flat' : 'break', doc: content });
328
+ stack.push({ ind: item.ind, mode: breakHelps ? 'break' : 'flat', doc: sep });
329
+ continue;
330
+ }
331
+ const { ind, mode, doc } = item;
332
+ if (typeof doc === 'string') {
333
+ write(doc);
334
+ continue;
335
+ }
336
+ if (Array.isArray(doc)) {
337
+ for (let i = doc.length - 1; i >= 0; i--)
338
+ stack.push({ ind, mode, doc: doc[i] });
339
+ continue;
340
+ }
341
+ switch (doc.t) {
342
+ case 'src':
343
+ write(srcText(doc), { src: [doc.start, doc.end], atom: doc.atom?.id, cls: doc.cls });
344
+ break;
345
+ case 'tok':
346
+ write(doc.text, { cls: doc.cls });
347
+ break;
348
+ case 'group': {
349
+ let m = 'break';
350
+ if (!doc.break && (mode === 'flat' || fits({ ind, mode: 'flat', doc: doc.doc }, restCmds(), width - col, false)))
351
+ m = 'flat';
352
+ stack.push({ ind, mode: m, doc: doc.doc });
353
+ break;
354
+ }
355
+ case 'indent':
356
+ stack.push({ ind: ind + doc.by, mode, doc: doc.doc });
357
+ break;
358
+ case 'fill': {
359
+ if (doc.parts.length === 0)
360
+ break;
361
+ if (mode === 'flat') {
362
+ for (let i = doc.parts.length - 1; i >= 0; i--)
363
+ stack.push({ ind, mode, doc: doc.parts[i] });
364
+ break;
365
+ }
366
+ const [first, ...more] = doc.parts;
367
+ const firstFits = fits({ ind, mode: 'flat', doc: first }, [], width - col, true);
368
+ if (more.length > 0)
369
+ stack.push({ fillRest: more, ind });
370
+ stack.push({ ind, mode: firstFits ? 'flat' : 'break', doc: first });
371
+ break;
372
+ }
373
+ case 'ifBreak':
374
+ stack.push({ ind, mode, doc: mode === 'break' ? doc.broken : doc.flat });
375
+ break;
376
+ case 'line':
377
+ if (doc.kind !== 'hard' && !doc.force && mode === 'flat')
378
+ write(doc.flat, /[;&|]/.test(doc.flat) ? { cls: 'op' } : {});
379
+ else
380
+ newline(ind, doc.blank === true, doc.kind);
381
+ break;
382
+ case 'suffix':
383
+ suffixes.push(doc.doc);
384
+ break;
385
+ case 'breakParent':
386
+ break;
387
+ case 'heredoc':
388
+ heredocs.push(doc);
389
+ break;
390
+ case 'mark':
391
+ openMarks.push({ id: doc.id, start: null });
392
+ stack.push({ close: doc.id });
393
+ stack.push({ ind, mode, doc: doc.doc });
394
+ break;
395
+ }
396
+ }
397
+ for (const sfx of suffixes)
398
+ writeInline(sfx);
399
+ if (heredocs.length > 0)
400
+ newline(0, false, 'hard');
401
+ if (out.endsWith('\n')) {
402
+ out = out.slice(0, -1);
403
+ const last = pieces[pieces.length - 1];
404
+ if (last?.text === '\n')
405
+ pieces.pop();
406
+ }
407
+ return { text: out, map, pieces, atoms };
408
+ }
409
+ //# sourceMappingURL=doc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc.js","sourceRoot":"","sources":["../../../src/printer/doc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Syntax classes for every character of a parsed script, from the AST (not
3
+ * regexes). Outer constructs are painted first and inner ones override, so
4
+ * `"$x"` as an argument is a string with a variable inside.
5
+ *
6
+ * Class names (short, semantic; styled by HTML_CSS in html.ts):
7
+ * kw keywords and grouping (`if`, `do`, `{`, `[[`)
8
+ * op control operators (`|`, `&&`, `;`, `;;`)
9
+ * cmd command names flag options (`-x`, `--long`)
10
+ * str quoted strings esc escapes (`\x`)
11
+ * var parameter expansions sub `$( )`, backquotes, `<( )`
12
+ * ar arithmetic num numbers in arithmetic
13
+ * asg assignment names rd redirections and here-doc delimiters
14
+ * hd here-doc bodies cm comments
15
+ * fn function names ct line continuations (`\`)
16
+ * dir directory arguments file file arguments, redirection targets
17
+ * re search patterns code program text (`sed`/`awk`/`jq` programs, `python -c`, `bash -c`)
18
+ * sc subcommands (`git status`, `npm run build`, `docker compose up`)
19
+ *
20
+ * Argument roles (`dir`, `file`, `re`, `code`, and `cmd` for nested commands
21
+ * such as `timeout 5 npx vitest`) come from the behavior definitions
22
+ * (src/behaviors/roles.ts); they recolor plain and quoted text but keep
23
+ * variables and substitutions inside the word.
24
+ */
25
+ import type * as A from '../parser/ast.ts';
26
+ import type { ArgRole } from '../behaviors/types.ts';
27
+ export declare const CLASS_NAMES: readonly ["", "kw", "op", "cmd", "flag", "str", "esc", "var", "sub", "ar", "num", "asg", "rd", "hd", "cm", "fn", "dir", "file", "re", "code", "sc"];
28
+ export type ClassName = (typeof CLASS_NAMES)[number];
29
+ /** Roles of a simple command's words (aligned with `c.words`), from the behavior definitions. */
30
+ export declare function simpleCommandRoles(c: A.SimpleCommand): (ArgRole | undefined)[];
31
+ export declare class Highlight {
32
+ private readonly cls;
33
+ readonly source: string;
34
+ constructor(script: A.Script, source: string);
35
+ /** The class runs covering `[start, end)`. */
36
+ runs(start: number, end: number): {
37
+ text: string;
38
+ cls: ClassName;
39
+ }[];
40
+ /** Recolor the plain and quoted characters of a span. */
41
+ private recolor;
42
+ private paint;
43
+ private stmts;
44
+ private stmt;
45
+ private command;
46
+ private assign;
47
+ private redirect;
48
+ private word;
49
+ private parts;
50
+ private arith;
51
+ private cond;
52
+ }
53
+ //# sourceMappingURL=highlight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"highlight.d.ts","sourceRoot":"","sources":["../../../src/printer/highlight.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,KAAK,CAAC,MAAM,kBAAkB,CAAA;AAG1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAEpD,eAAO,MAAM,WAAW,qJAAsJ,CAAA;AAC9K,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;AAOpD,iGAAiG;AACjG,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,aAAa,GAAG,CAAC,OAAO,GAAG,SAAS,CAAC,EAAE,CAI9E;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAY;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;gBAEX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM;IAO5C,8CAA8C;IAC9C,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,SAAS,CAAA;KAAE,EAAE;IAapE,yDAAyD;IACzD,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,OAAO;IAyFf,OAAO,CAAC,MAAM;IAYd,OAAO,CAAC,QAAQ;IAehB,OAAO,CAAC,IAAI;IAKZ,OAAO,CAAC,KAAK;IAgDb,OAAO,CAAC,KAAK;IAcb,OAAO,CAAC,IAAI;CAUb"}