@hivecommons/promptargs 0.7.0 → 0.9.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 (81) hide show
  1. package/README.md +106 -20
  2. package/dist/autodetect.js +39 -12
  3. package/dist/autodetect.js.map +1 -1
  4. package/dist/cli.js +78 -147
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands.d.ts +4 -0
  7. package/dist/commands.js +148 -0
  8. package/dist/commands.js.map +1 -0
  9. package/dist/flags.d.ts +20 -0
  10. package/dist/flags.js +101 -0
  11. package/dist/flags.js.map +1 -0
  12. package/dist/loader.d.ts +2 -0
  13. package/dist/loader.js +84 -11
  14. package/dist/loader.js.map +1 -1
  15. package/dist/log.d.ts +19 -0
  16. package/dist/log.js +41 -0
  17. package/dist/log.js.map +1 -0
  18. package/dist/parser.js +39 -9
  19. package/dist/parser.js.map +1 -1
  20. package/dist/resolver.d.ts +3 -1
  21. package/dist/resolver.js +105 -34
  22. package/dist/resolver.js.map +1 -1
  23. package/dist/status.d.ts +1 -1
  24. package/dist/status.js +5 -4
  25. package/dist/status.js.map +1 -1
  26. package/dist/ui.d.ts +3 -0
  27. package/dist/ui.html +21 -6
  28. package/dist/ui.js +89 -12
  29. package/dist/ui.js.map +1 -1
  30. package/package.json +13 -4
  31. package/dist/autodetect.test.d.ts +0 -1
  32. package/dist/autodetect.test.js +0 -207
  33. package/dist/autodetect.test.js.map +0 -1
  34. package/dist/cli.test.d.ts +0 -1
  35. package/dist/cli.test.js +0 -310
  36. package/dist/cli.test.js.map +0 -1
  37. package/dist/index.test.d.ts +0 -1
  38. package/dist/index.test.js +0 -59
  39. package/dist/index.test.js.map +0 -1
  40. package/dist/iterate.test.d.ts +0 -1
  41. package/dist/iterate.test.js +0 -20
  42. package/dist/iterate.test.js.map +0 -1
  43. package/dist/loader.test.d.ts +0 -1
  44. package/dist/loader.test.js +0 -65
  45. package/dist/loader.test.js.map +0 -1
  46. package/dist/parser.test.d.ts +0 -1
  47. package/dist/parser.test.js +0 -93
  48. package/dist/parser.test.js.map +0 -1
  49. package/dist/resolver.test.d.ts +0 -1
  50. package/dist/resolver.test.js +0 -184
  51. package/dist/resolver.test.js.map +0 -1
  52. package/dist/sanitize.test.d.ts +0 -1
  53. package/dist/sanitize.test.js +0 -38
  54. package/dist/sanitize.test.js.map +0 -1
  55. package/dist/status.test.d.ts +0 -1
  56. package/dist/status.test.js +0 -33
  57. package/dist/status.test.js.map +0 -1
  58. package/dist/ui-bootstrap.test.d.ts +0 -1
  59. package/dist/ui-bootstrap.test.js +0 -479
  60. package/dist/ui-bootstrap.test.js.map +0 -1
  61. package/dist/ui-builder.test.d.ts +0 -1
  62. package/dist/ui-builder.test.js +0 -272
  63. package/dist/ui-builder.test.js.map +0 -1
  64. package/dist/ui-command-quoting.test.d.ts +0 -1
  65. package/dist/ui-command-quoting.test.js +0 -95
  66. package/dist/ui-command-quoting.test.js.map +0 -1
  67. package/dist/ui-harness.d.ts +0 -20
  68. package/dist/ui-harness.js +0 -40
  69. package/dist/ui-harness.js.map +0 -1
  70. package/dist/ui-harness.test.d.ts +0 -1
  71. package/dist/ui-harness.test.js +0 -30
  72. package/dist/ui-harness.test.js.map +0 -1
  73. package/dist/ui-inline.test.d.ts +0 -1
  74. package/dist/ui-inline.test.js +0 -90
  75. package/dist/ui-inline.test.js.map +0 -1
  76. package/dist/ui-interactions.test.d.ts +0 -1
  77. package/dist/ui-interactions.test.js +0 -489
  78. package/dist/ui-interactions.test.js.map +0 -1
  79. package/dist/ui.test.d.ts +0 -1
  80. package/dist/ui.test.js +0 -283
  81. package/dist/ui.test.js.map +0 -1
@@ -1,184 +0,0 @@
1
- import { describe, it, before, after } from 'node:test';
2
- import assert from 'node:assert';
3
- import { mkdtempSync, writeFileSync, rmSync, mkdirSync } from 'node:fs';
4
- import { join } from 'node:path';
5
- import { PassThrough } from 'node:stream';
6
- import { resolve } from './resolver.js';
7
- // Variable names are deliberately obscure so the autodetect env-var
8
- // fallback never picks them up from the test environment.
9
- function v(name, defaultValue) {
10
- return { name, defaultValue, raw: `{{${name}}}` };
11
- }
12
- let tmp;
13
- before(() => {
14
- tmp = mkdtempSync(join(process.cwd(), '.pa-resolver-'));
15
- });
16
- after(() => {
17
- rmSync(tmp, { recursive: true, force: true });
18
- });
19
- describe('resolve scalar values', () => {
20
- it('takes values from flags', async () => {
21
- const r = await resolve([v('pa_x')], { pa_x: 'hello' }, false);
22
- assert.strictEqual(r.values.pa_x, 'hello');
23
- assert.deepStrictEqual(r.iterations, [{ pa_x: 'hello' }]);
24
- });
25
- it('flags win over defaults', async () => {
26
- const r = await resolve([v('pa_x', 'dflt')], { pa_x: 'flag' }, false);
27
- assert.strictEqual(r.values.pa_x, 'flag');
28
- });
29
- it('falls back to defaults', async () => {
30
- const r = await resolve([v('pa_x', 'dflt')], {}, false);
31
- assert.strictEqual(r.values.pa_x, 'dflt');
32
- });
33
- it('leaves unfilled vars unset when non-interactive', async () => {
34
- const r = await resolve([v('pa_missing')], {}, false);
35
- assert.ok(!('pa_missing' in r.values));
36
- assert.deepStrictEqual(r.iterations, [{}]);
37
- });
38
- it('autodetect wins over defaults', async () => {
39
- process.env.pa_env_var = 'from-env';
40
- try {
41
- const r = await resolve([v('pa_env_var', 'dflt')], {}, false);
42
- assert.strictEqual(r.values.pa_env_var, 'from-env');
43
- }
44
- finally {
45
- delete process.env.pa_env_var;
46
- }
47
- });
48
- });
49
- describe('resolve array expansion', () => {
50
- it('splits comma-separated flag values into iterations', async () => {
51
- const r = await resolve([v('pa_f')], { pa_f: 'a.go, b.go,c.go' }, false);
52
- assert.deepStrictEqual(r.iterations.map(i => i.pa_f), ['a.go', 'b.go', 'c.go']);
53
- });
54
- it('reads @file values one per line', async () => {
55
- const listFile = join(tmp, 'list.txt');
56
- writeFileSync(listFile, 'one\n two \n\nthree\n');
57
- const r = await resolve([v('pa_f')], { pa_f: `@${listFile}` }, false);
58
- assert.deepStrictEqual(r.iterations.map(i => i.pa_f), ['one', 'two', 'three']);
59
- });
60
- it('treats @nonexistent as a literal value', async () => {
61
- const r = await resolve([v('pa_f')], { pa_f: '@/no/such/file' }, false);
62
- assert.strictEqual(r.values.pa_f, '@/no/such/file');
63
- });
64
- it('zips arrays of equal length by default', async () => {
65
- const r = await resolve([v('pa_a'), v('pa_b')], { pa_a: '1,2', pa_b: 'x,y' }, false);
66
- assert.deepStrictEqual(r.iterations.map(i => [i.pa_a, i.pa_b]), [['1', 'x'], ['2', 'y']]);
67
- });
68
- it('recycles shorter arrays when zipping', async () => {
69
- const r = await resolve([v('pa_a'), v('pa_b')], { pa_a: '1,2,3', pa_b: 'x,y' }, false);
70
- assert.deepStrictEqual(r.iterations.map(i => [i.pa_a, i.pa_b]), [['1', 'x'], ['2', 'y'], ['3', 'x']]);
71
- });
72
- it('builds the cartesian product with cross=true', async () => {
73
- const r = await resolve([v('pa_a'), v('pa_b')], { pa_a: '1,2', pa_b: 'x,y' }, false, true);
74
- assert.strictEqual(r.iterations.length, 4);
75
- assert.deepStrictEqual(r.iterations.map(i => `${i.pa_a}${i.pa_b}`).sort(), ['1x', '1y', '2x', '2y']);
76
- });
77
- it('carries scalar values into every iteration', async () => {
78
- const r = await resolve([v('pa_a'), v('pa_s', 'fixed')], { pa_a: '1,2' }, false);
79
- assert.deepStrictEqual(r.iterations.map(i => [i.pa_a, i.pa_s]), [['1', 'fixed'], ['2', 'fixed']]);
80
- });
81
- it('keeps "-" (stdin placeholder) as a single literal', async () => {
82
- const r = await resolve([v('pa_f')], { pa_f: '-' }, false);
83
- assert.strictEqual(r.values.pa_f, '-');
84
- assert.strictEqual(r.iterations.length, 1);
85
- });
86
- });
87
- describe('resolve glob expansion', () => {
88
- it('expands a matching glob into sorted file iterations', async () => {
89
- const dir = join(tmp, 'glob');
90
- mkdirSync(dir);
91
- writeFileSync(join(dir, 'b.txt'), '');
92
- writeFileSync(join(dir, 'a.txt'), '');
93
- writeFileSync(join(dir, 'c.md'), '');
94
- const r = await resolve([v('pa_f')], { pa_f: join(dir, '*.txt') }, false);
95
- assert.deepStrictEqual(r.iterations.map(i => i.pa_f), [join(dir, 'a.txt'), join(dir, 'b.txt')]);
96
- });
97
- it('skips hidden files unless the segment starts with a dot', async () => {
98
- const dir = join(tmp, 'hidden');
99
- mkdirSync(dir);
100
- writeFileSync(join(dir, '.secret.txt'), '');
101
- writeFileSync(join(dir, 'plain.txt'), '');
102
- const r = await resolve([v('pa_f')], { pa_f: join(dir, '*.txt') }, false);
103
- assert.deepStrictEqual(r.iterations.map(i => i.pa_f), [join(dir, 'plain.txt')]);
104
- });
105
- it('treats a non-matching glob as a literal', async () => {
106
- const pattern = join(tmp, 'nope', '*.zzz');
107
- const r = await resolve([v('pa_f')], { pa_f: pattern }, false);
108
- assert.strictEqual(r.values.pa_f, pattern);
109
- });
110
- it('expands a relative glob against the current directory', async () => {
111
- // All other glob tests use absolute patterns; this walks the base === ''
112
- // branches (readdir of '.', bare-entry results) in expandGlob.
113
- const dir = join(tmp, 'relative');
114
- mkdirSync(dir);
115
- writeFileSync(join(dir, 'one.txt'), '');
116
- writeFileSync(join(dir, 'two.txt'), '');
117
- const prevCwd = process.cwd();
118
- process.chdir(dir);
119
- try {
120
- const r = await resolve([v('pa_f')], { pa_f: '*.txt' }, false);
121
- assert.deepStrictEqual(r.iterations.map(i => i.pa_f), ['one.txt', 'two.txt']);
122
- // A literal leading segment resolved relative to the cwd.
123
- mkdirSync(join(dir, 'sub'));
124
- writeFileSync(join(dir, 'sub', 'three.txt'), '');
125
- const r2 = await resolve([v('pa_f')], { pa_f: 'sub/*.txt' }, false);
126
- assert.deepStrictEqual(r2.iterations.map(i => i.pa_f), [join('sub', 'three.txt')]);
127
- }
128
- finally {
129
- process.chdir(prevCwd);
130
- }
131
- });
132
- it('expands a ? wildcard segment without a *', async () => {
133
- const dir = join(tmp, 'qmark');
134
- mkdirSync(dir);
135
- writeFileSync(join(dir, 'a1.txt'), '');
136
- writeFileSync(join(dir, 'a2.txt'), '');
137
- writeFileSync(join(dir, 'a12.txt'), '');
138
- const r = await resolve([v('pa_f')], { pa_f: join(dir, 'a?.txt') }, false);
139
- assert.deepStrictEqual(r.iterations.map(i => i.pa_f), [join(dir, 'a1.txt'), join(dir, 'a2.txt')]);
140
- });
141
- it('survives an unreadable glob base (file used as directory)', async () => {
142
- // "plain-file/*.md": the base exists but readdirSync throws ENOTDIR;
143
- // the expander must skip it instead of crashing, leaving a literal.
144
- const file = join(tmp, 'plain-file');
145
- writeFileSync(file, 'not a dir');
146
- const pattern = join(file, '*.md');
147
- const r = await resolve([v('pa_f')], { pa_f: pattern }, false);
148
- assert.strictEqual(r.values.pa_f, pattern);
149
- assert.strictEqual(r.iterations.length, 1);
150
- });
151
- });
152
- describe('resolve interactive prompting', () => {
153
- // resolve()'s ask() reads from process.stdin via readline; swap in a
154
- // PassThrough so answers can be scripted without a child process.
155
- async function withStdin(input, fn) {
156
- const fake = new PassThrough();
157
- const desc = Object.getOwnPropertyDescriptor(process, 'stdin');
158
- Object.defineProperty(process, 'stdin', { value: fake, configurable: true });
159
- try {
160
- fake.write(input);
161
- return await fn();
162
- }
163
- finally {
164
- Object.defineProperty(process, 'stdin', desc);
165
- }
166
- }
167
- it('asks for missing values and trims the answer', async () => {
168
- const r = await withStdin(' spaced answer \n', () => resolve([v('pa_ask')], {}, true));
169
- assert.strictEqual(r.values.pa_ask, 'spaced answer');
170
- assert.deepStrictEqual(r.iterations, [{ pa_ask: 'spaced answer' }]);
171
- });
172
- it('expands a comma-separated interactive answer into iterations', async () => {
173
- const r = await withStdin('one,two,three\n', () => resolve([v('pa_ask')], {}, true));
174
- assert.deepStrictEqual(r.iterations.map(i => i.pa_ask), ['one', 'two', 'three']);
175
- });
176
- it('prefers flags and defaults over prompting', async () => {
177
- // A sentinel answer is queued: if resolve prompted for either var it
178
- // would consume it and the assertions below would fail.
179
- const r = await withStdin('SENTINEL_NOT_CONSUMED\n', () => resolve([v('pa_flag'), v('pa_dflt', 'd')], { pa_flag: 'f' }, true));
180
- assert.strictEqual(r.values.pa_flag, 'f');
181
- assert.strictEqual(r.values.pa_dflt, 'd');
182
- });
183
- });
184
- //# sourceMappingURL=resolver.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolver.test.js","sourceRoot":"","sources":["../src/resolver.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,38 +0,0 @@
1
- import { test } from 'node:test';
2
- import assert from 'node:assert';
3
- import { sanitizeForTerminal } from './sanitize.js';
4
- test('passes plain text through unchanged', () => {
5
- assert.strictEqual(sanitizeForTerminal('hello world'), 'hello world');
6
- });
7
- test('preserves newlines and tabs', () => {
8
- assert.strictEqual(sanitizeForTerminal('a\n\tb'), 'a\n\tb');
9
- });
10
- test('strips CSI color/cursor sequences', () => {
11
- assert.strictEqual(sanitizeForTerminal('\x1b[31mred\x1b[0m'), 'red');
12
- assert.strictEqual(sanitizeForTerminal('up\x1b[2Aover\x1b[10D'), 'upover');
13
- });
14
- test('strips OSC sequences (BEL and ST terminated)', () => {
15
- // Window retitle
16
- assert.strictEqual(sanitizeForTerminal('\x1b]0;pwned\x07safe'), 'safe');
17
- // OSC 52 clipboard write, ST-terminated
18
- assert.strictEqual(sanitizeForTerminal('\x1b]52;c;ZXZpbA==\x1b\\safe'), 'safe');
19
- });
20
- test('strips unterminated OSC sequence', () => {
21
- assert.strictEqual(sanitizeForTerminal('a\x1b]0;title'), 'a');
22
- });
23
- test('strips DCS/SOS/PM/APC sequences', () => {
24
- assert.strictEqual(sanitizeForTerminal('\x1bPq payload\x1b\\ok'), 'ok');
25
- assert.strictEqual(sanitizeForTerminal('\x1b_apc\x1b\\ok'), 'ok');
26
- });
27
- test('strips single-character escapes', () => {
28
- assert.strictEqual(sanitizeForTerminal('a\x1bcb'), 'ab');
29
- });
30
- test('strips carriage returns, C0 controls, DEL, and C1 bytes', () => {
31
- assert.strictEqual(sanitizeForTerminal('fake\rreal'), 'fakereal');
32
- assert.strictEqual(sanitizeForTerminal('a\x00b\x08c\x7fd'), 'abcd');
33
- assert.strictEqual(sanitizeForTerminal('a\u009b31mb'), 'a31mb');
34
- });
35
- test('handles empty string', () => {
36
- assert.strictEqual(sanitizeForTerminal(''), '');
37
- });
38
- //# sourceMappingURL=sanitize.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sanitize.test.js","sourceRoot":"","sources":["../src/sanitize.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;IAC/C,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC,CAAC;AACxE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE;IACvC,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC9D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE;IAC7C,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,EAAE,KAAK,CAAC,CAAC;IACrE,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,uBAAuB,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC7E,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,8CAA8C,EAAE,GAAG,EAAE;IACxD,iBAAiB;IACjB,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC,CAAC;IACxE,wCAAwC;IACxC,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,8BAA8B,CAAC,EAAE,MAAM,CAAC,CAAC;AAClF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAC5C,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,eAAe,CAAC,EAAE,GAAG,CAAC,CAAC;AAChE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC3C,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,EAAE,IAAI,CAAC,CAAC;IACxE,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,EAAE,IAAI,CAAC,CAAC;AACpE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC3C,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;AAC3D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yDAAyD,EAAE,GAAG,EAAE;IACnE,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC,CAAC;IAClE,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC,CAAC;IACpE,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,CAAC;AAClE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE;IAChC,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAClD,CAAC,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,33 +0,0 @@
1
- import { describe, it } from 'node:test';
2
- import assert from 'node:assert';
3
- import { renderStatus } from './status.js';
4
- function v(name, defaultValue) {
5
- return { name, defaultValue, raw: `{{${name}}}` };
6
- }
7
- describe('renderStatus', () => {
8
- it('shows ✅ and values when all vars are filled', () => {
9
- const out = renderStatus('review', [v('file')], { file: 'a.go' });
10
- assert.strictEqual(out, '✅ review: file=a.go');
11
- });
12
- it('shows 📋 and ___ placeholders for unfilled vars', () => {
13
- const out = renderStatus('review', [v('file'), v('focus')], { file: 'a.go' });
14
- assert.strictEqual(out, '📋 review: file=a.go focus=___');
15
- });
16
- it('marks values that equal the default with (default)', () => {
17
- const out = renderStatus('t', [v('tone', 'concise')], { tone: 'concise' });
18
- assert.strictEqual(out, '✅ t: tone=concise(default)');
19
- });
20
- it('does not mark overridden defaults', () => {
21
- const out = renderStatus('t', [v('tone', 'concise')], { tone: 'verbose' });
22
- assert.strictEqual(out, '✅ t: tone=verbose');
23
- });
24
- it('renders iteration progress', () => {
25
- const out = renderStatus('t', [v('f')], { f: 'x' }, { current: 2, total: 5 });
26
- assert.strictEqual(out, '✅ t [2/5]: f=x');
27
- });
28
- it('handles templates with no vars', () => {
29
- const out = renderStatus('plain', [], {});
30
- assert.strictEqual(out, '✅ plain: ');
31
- });
32
- });
33
- //# sourceMappingURL=status.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"status.test.js","sourceRoot":"","sources":["../src/status.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,SAAS,CAAC,CAAC,IAAY,EAAE,YAAqB;IAC5C,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC;AACpD,CAAC;AAED,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAClE,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9E,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,iCAAiC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC3E,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,4BAA4B,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC3E,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9E,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1C,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};