solid-mds 0.3.2
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 +476 -0
- package/dist/index.d.ts +50 -0
- package/dist/index.jsx +402 -0
- package/package.json +66 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Matthias Reis
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
# solid-mds
|
|
2
|
+
|
|
3
|
+
A SolidJS library for parsing and rendering MDS (Markdown Steps) format — an
|
|
4
|
+
extended Markdown syntax designed for step-based content like slide decks,
|
|
5
|
+
tutorials, and wizards.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install solid-mds
|
|
11
|
+
# or
|
|
12
|
+
pnpm add solid-mds
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
**Peer dependency:** This library requires SolidJS ^1.9.0
|
|
16
|
+
|
|
17
|
+
## Quick Start
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
import { parse } from "solid-mds";
|
|
21
|
+
|
|
22
|
+
const markdown = `
|
|
23
|
+
# Hello World
|
|
24
|
+
|
|
25
|
+
This is **bold** and *italic* text.
|
|
26
|
+
`;
|
|
27
|
+
|
|
28
|
+
function App() {
|
|
29
|
+
const result = parse(markdown);
|
|
30
|
+
return <div>{result.steps.default.body}</div>;
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Opinionated Plugin Configuration
|
|
35
|
+
|
|
36
|
+
solid-mds comes pre-configured with an opinionated set of remark/rehype plugins:
|
|
37
|
+
|
|
38
|
+
- **[remark-gfm](https://github.com/remarkjs/remark-gfm)** — GitHub Flavored
|
|
39
|
+
Markdown (tables, strikethrough, autolinks, task lists)
|
|
40
|
+
- **[remark-math](https://github.com/remarkjs/remark-math)** +
|
|
41
|
+
**[rehype-katex](https://github.com/remarkjs/rehype-katex)** — LaTeX math
|
|
42
|
+
rendering
|
|
43
|
+
|
|
44
|
+
These plugins are always enabled and cannot be configured. This ensures
|
|
45
|
+
consistent rendering across all use cases.
|
|
46
|
+
|
|
47
|
+
**Note:** To display math properly, include the KaTeX CSS in your app:
|
|
48
|
+
|
|
49
|
+
```html
|
|
50
|
+
<link
|
|
51
|
+
rel="stylesheet"
|
|
52
|
+
href="https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css"
|
|
53
|
+
/>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Supported Markdown Features
|
|
57
|
+
|
|
58
|
+
### Standard Markdown
|
|
59
|
+
|
|
60
|
+
```markdown
|
|
61
|
+
# Heading 1
|
|
62
|
+
|
|
63
|
+
## Heading 2
|
|
64
|
+
|
|
65
|
+
### Heading 3
|
|
66
|
+
|
|
67
|
+
**bold** and _italic_ and ~~strikethrough~~
|
|
68
|
+
|
|
69
|
+
- Unordered list
|
|
70
|
+
- Another item
|
|
71
|
+
|
|
72
|
+
1. Ordered list
|
|
73
|
+
2. Second item
|
|
74
|
+
|
|
75
|
+
> Blockquotes
|
|
76
|
+
|
|
77
|
+
`inline code`
|
|
78
|
+
|
|
79
|
+
[Links](https://example.com)
|
|
80
|
+
|
|
81
|
+

|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### GFM Extensions
|
|
85
|
+
|
|
86
|
+
#### Tables
|
|
87
|
+
|
|
88
|
+
```markdown
|
|
89
|
+
| Header 1 | Header 2 |
|
|
90
|
+
| -------- | -------- |
|
|
91
|
+
| Cell 1 | Cell 2 |
|
|
92
|
+
| Cell 3 | Cell 4 |
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
#### Task Lists
|
|
96
|
+
|
|
97
|
+
```markdown
|
|
98
|
+
- [x] Completed task
|
|
99
|
+
- [ ] Incomplete task
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
#### Autolinks
|
|
103
|
+
|
|
104
|
+
```markdown
|
|
105
|
+
Visit https://example.com automatically linked.
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Math (LaTeX)
|
|
109
|
+
|
|
110
|
+
#### Inline Math
|
|
111
|
+
|
|
112
|
+
```markdown
|
|
113
|
+
The equation $E = mc^2$ is famous.
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
#### Block Math
|
|
117
|
+
|
|
118
|
+
```markdown
|
|
119
|
+
$$
|
|
120
|
+
\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}
|
|
121
|
+
$$
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## MDS Format: Steps
|
|
125
|
+
|
|
126
|
+
MDS extends Markdown with a step-based structure using `+++stepId` separators:
|
|
127
|
+
|
|
128
|
+
```markdown
|
|
129
|
+
+++intro
|
|
130
|
+
# Welcome
|
|
131
|
+
|
|
132
|
+
This is the introduction step.
|
|
133
|
+
|
|
134
|
+
+++
|
|
135
|
+
|
|
136
|
+
main
|
|
137
|
+
|
|
138
|
+
# Main Content
|
|
139
|
+
|
|
140
|
+
This is the main step.
|
|
141
|
+
|
|
142
|
+
+++conclusion
|
|
143
|
+
|
|
144
|
+
# Summary
|
|
145
|
+
|
|
146
|
+
This is the conclusion.
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Parsing Steps
|
|
150
|
+
|
|
151
|
+
```tsx
|
|
152
|
+
import { parse } from "solid-mds";
|
|
153
|
+
|
|
154
|
+
const result = parse(markdown);
|
|
155
|
+
|
|
156
|
+
// result.first → "intro" (first step ID)
|
|
157
|
+
// result.count → 3 (number of steps)
|
|
158
|
+
// result.steps.intro.body → JSX.Element
|
|
159
|
+
// result.steps.intro.next → "main"
|
|
160
|
+
// result.steps.main.prev → "intro"
|
|
161
|
+
// result.steps.main.next → "conclusion"
|
|
162
|
+
// result.steps.conclusion.prev → "main"
|
|
163
|
+
// result.steps.conclusion.next → null
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Step Object Structure
|
|
167
|
+
|
|
168
|
+
Each step contains:
|
|
169
|
+
|
|
170
|
+
```ts
|
|
171
|
+
interface Step {
|
|
172
|
+
id: string; // Step identifier
|
|
173
|
+
body: JSX.Element; // Rendered markdown content
|
|
174
|
+
local: object; // Local metadata (see below)
|
|
175
|
+
prev: string | null; // Previous step ID
|
|
176
|
+
next: string | null; // Next step ID
|
|
177
|
+
current: number; // 1-based position
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## Metadata Blocks
|
|
182
|
+
|
|
183
|
+
### Local Metadata (per step)
|
|
184
|
+
|
|
185
|
+
Use ` ```@| ` blocks to define key-value metadata for a step:
|
|
186
|
+
|
|
187
|
+
````markdown
|
|
188
|
+
+++slide1
|
|
189
|
+
|
|
190
|
+
```@|
|
|
191
|
+
title: Introduction
|
|
192
|
+
speaker: John Doe
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
# Welcome to the Presentation
|
|
196
|
+
````
|
|
197
|
+
|
|
198
|
+
Access via `result.steps.slide1.local.title`.
|
|
199
|
+
|
|
200
|
+
### Local Markdown Blocks
|
|
201
|
+
|
|
202
|
+
Use ` ```@/name ` to define named markdown content within a step:
|
|
203
|
+
|
|
204
|
+
````markdown
|
|
205
|
+
+++slide1
|
|
206
|
+
|
|
207
|
+
```@/notes
|
|
208
|
+
These are speaker notes with **formatting**.
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
# Main Slide Content
|
|
212
|
+
````
|
|
213
|
+
|
|
214
|
+
Access via `result.steps.slide1.local.notes` (returns `JSX.Element`).
|
|
215
|
+
|
|
216
|
+
### Global Metadata
|
|
217
|
+
|
|
218
|
+
Use ` ```@@| ` for document-wide metadata:
|
|
219
|
+
|
|
220
|
+
````markdown
|
|
221
|
+
```@@|
|
|
222
|
+
author: Jane Smith
|
|
223
|
+
version: 1.0
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
+++first
|
|
227
|
+
|
|
228
|
+
# First Step
|
|
229
|
+
````
|
|
230
|
+
|
|
231
|
+
Access via `result.global.author`.
|
|
232
|
+
|
|
233
|
+
### Global Markdown Blocks
|
|
234
|
+
|
|
235
|
+
Use ` ```@@/name ` for global named markdown content:
|
|
236
|
+
|
|
237
|
+
````markdown
|
|
238
|
+
```@@/footer
|
|
239
|
+
Made with ❤️ by **Our Team**
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
+++first
|
|
243
|
+
|
|
244
|
+
# Content
|
|
245
|
+
````
|
|
246
|
+
|
|
247
|
+
Access via `result.global.footer` (returns `JSX.Element`).
|
|
248
|
+
|
|
249
|
+
## Custom Components
|
|
250
|
+
|
|
251
|
+
Override default HTML elements or create custom block components:
|
|
252
|
+
|
|
253
|
+
### Override Standard Elements
|
|
254
|
+
|
|
255
|
+
```tsx
|
|
256
|
+
import {
|
|
257
|
+
parse,
|
|
258
|
+
ComponentMap,
|
|
259
|
+
StandardComponentProps,
|
|
260
|
+
} from "solid-mds";
|
|
261
|
+
|
|
262
|
+
const CustomHeading = (props: StandardComponentProps) => (
|
|
263
|
+
<h1 class="text-4xl font-bold text-blue-600">{props.children}</h1>
|
|
264
|
+
);
|
|
265
|
+
|
|
266
|
+
const components: ComponentMap = {
|
|
267
|
+
h1: CustomHeading,
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
const result = parse(markdown, components);
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### Custom Blocks
|
|
274
|
+
|
|
275
|
+
Create custom components that receive special props from code blocks:
|
|
276
|
+
|
|
277
|
+
```tsx
|
|
278
|
+
import { parse, ComponentMap, CustomBlockProps } from "solid-mds";
|
|
279
|
+
|
|
280
|
+
// Define a custom component
|
|
281
|
+
const Alert = (props: CustomBlockProps) => (
|
|
282
|
+
<div class={`alert alert-${props.payload[0] || "info"}`}>
|
|
283
|
+
{props.children}
|
|
284
|
+
</div>
|
|
285
|
+
);
|
|
286
|
+
|
|
287
|
+
const components: ComponentMap = {
|
|
288
|
+
alert: Alert,
|
|
289
|
+
};
|
|
290
|
+
|
|
291
|
+
const markdown = `
|
|
292
|
+
\`\`\`alert/warning
|
|
293
|
+
This is a **warning** message!
|
|
294
|
+
\`\`\`
|
|
295
|
+
`;
|
|
296
|
+
|
|
297
|
+
const result = parse(markdown, components);
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
The code block ` ```slert/warning ` will render using your `Alert` component
|
|
301
|
+
with:
|
|
302
|
+
|
|
303
|
+
- `props.payload` → `["warning"]` (path segments after component name)
|
|
304
|
+
- `props.raw` → `"This is a **warning** message!"` (raw content as string if you
|
|
305
|
+
need it)
|
|
306
|
+
- `props.children` → Rendered markdown as JSX
|
|
307
|
+
|
|
308
|
+
### Custom Blocks with Data
|
|
309
|
+
|
|
310
|
+
Use the `|` suffix for YAML data instead of markdown content:
|
|
311
|
+
|
|
312
|
+
```tsx
|
|
313
|
+
const Card = (props: CustomBlockProps) => (
|
|
314
|
+
<div class="card">
|
|
315
|
+
<h2>{props.data?.title}</h2>
|
|
316
|
+
<p>{props.data?.description}</p>
|
|
317
|
+
</div>
|
|
318
|
+
);
|
|
319
|
+
|
|
320
|
+
const components: ComponentMap = { Card };
|
|
321
|
+
|
|
322
|
+
const markdown = `
|
|
323
|
+
\`\`\`Card|
|
|
324
|
+
title: My Card Title
|
|
325
|
+
description: This is the card description
|
|
326
|
+
\`\`\`
|
|
327
|
+
`;
|
|
328
|
+
|
|
329
|
+
const result = parse(markdown, components);
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
With ` ```Card| `, the content is parsed as YAML and available via `props.data`.
|
|
333
|
+
|
|
334
|
+
## Complete Example
|
|
335
|
+
|
|
336
|
+
```tsx
|
|
337
|
+
import { createSignal, Show, For } from "solid-js";
|
|
338
|
+
import {
|
|
339
|
+
parse,
|
|
340
|
+
ComponentMap,
|
|
341
|
+
CustomBlockProps,
|
|
342
|
+
StandardComponentProps,
|
|
343
|
+
} from "solid-mds";
|
|
344
|
+
|
|
345
|
+
// Custom components
|
|
346
|
+
const Slide = (props: CustomBlockProps) => (
|
|
347
|
+
<div class="slide" data-layout={props.payload[0]}>
|
|
348
|
+
{props.children}
|
|
349
|
+
</div>
|
|
350
|
+
);
|
|
351
|
+
|
|
352
|
+
const Code = (props: StandardComponentProps) => (
|
|
353
|
+
<pre class="bg-gray-800 text-white p-4 rounded">
|
|
354
|
+
<code>{props.children}</code>
|
|
355
|
+
</pre>
|
|
356
|
+
);
|
|
357
|
+
|
|
358
|
+
const components: ComponentMap = {
|
|
359
|
+
Slide,
|
|
360
|
+
code: Code,
|
|
361
|
+
};
|
|
362
|
+
|
|
363
|
+
// Markdown content
|
|
364
|
+
const content = `
|
|
365
|
+
\`\`\`@@|
|
|
366
|
+
title: My Presentation
|
|
367
|
+
author: Developer
|
|
368
|
+
\`\`\`
|
|
369
|
+
|
|
370
|
+
+++intro
|
|
371
|
+
\`\`\`@|
|
|
372
|
+
transition: fade
|
|
373
|
+
\`\`\`
|
|
374
|
+
|
|
375
|
+
# Welcome
|
|
376
|
+
|
|
377
|
+
Introduction slide content.
|
|
378
|
+
|
|
379
|
+
+++demo
|
|
380
|
+
\`\`\`Slide/centered
|
|
381
|
+
# Demo Time
|
|
382
|
+
|
|
383
|
+
Check out this code:
|
|
384
|
+
|
|
385
|
+
\`\`\`js
|
|
386
|
+
console.log("Hello!");
|
|
387
|
+
\`\`\`
|
|
388
|
+
\`\`\`
|
|
389
|
+
|
|
390
|
+
+++end
|
|
391
|
+
# Thank You!
|
|
392
|
+
|
|
393
|
+
Questions?
|
|
394
|
+
`;
|
|
395
|
+
|
|
396
|
+
function Presentation() {
|
|
397
|
+
const result = parse(content, components);
|
|
398
|
+
const [currentId, setCurrentId] = createSignal(result.first);
|
|
399
|
+
|
|
400
|
+
const currentStep = () => result.steps[currentId()!];
|
|
401
|
+
|
|
402
|
+
const goNext = () => {
|
|
403
|
+
const next = currentStep()?.next;
|
|
404
|
+
if (next) setCurrentId(next);
|
|
405
|
+
};
|
|
406
|
+
|
|
407
|
+
const goPrev = () => {
|
|
408
|
+
const prev = currentStep()?.prev;
|
|
409
|
+
if (prev) setCurrentId(prev);
|
|
410
|
+
};
|
|
411
|
+
|
|
412
|
+
return (
|
|
413
|
+
<div class="presentation">
|
|
414
|
+
<header>
|
|
415
|
+
<h1>{result.global?.title}</h1>
|
|
416
|
+
<span>by {result.global?.author}</span>
|
|
417
|
+
</header>
|
|
418
|
+
|
|
419
|
+
<main>
|
|
420
|
+
<Show when={currentStep()}>{currentStep().body}</Show>
|
|
421
|
+
</main>
|
|
422
|
+
|
|
423
|
+
<footer>
|
|
424
|
+
<button onClick={goPrev} disabled={!currentStep()?.prev}>
|
|
425
|
+
Previous
|
|
426
|
+
</button>
|
|
427
|
+
<span>
|
|
428
|
+
{currentStep()?.current} / {result.count}
|
|
429
|
+
</span>
|
|
430
|
+
<button onClick={goNext} disabled={!currentStep()?.next}>
|
|
431
|
+
Next
|
|
432
|
+
</button>
|
|
433
|
+
</footer>
|
|
434
|
+
</div>
|
|
435
|
+
);
|
|
436
|
+
}
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
## API Reference
|
|
440
|
+
|
|
441
|
+
### `parse<TGlobal, TLocal>(input: string, components?: ComponentMap): ParseResult`
|
|
442
|
+
|
|
443
|
+
Parses MDS content and returns a structured result. Please provide proper types
|
|
444
|
+
for your global and local scope to receive a properly typed result.
|
|
445
|
+
|
|
446
|
+
**Parameters:**
|
|
447
|
+
|
|
448
|
+
- `input` — The MDS/Markdown string to parse
|
|
449
|
+
- `components` — Optional map of custom components
|
|
450
|
+
|
|
451
|
+
**Returns:**
|
|
452
|
+
|
|
453
|
+
```ts
|
|
454
|
+
interface ParseResult<TGlobal, TLocal> {
|
|
455
|
+
first: string | null; // First step ID
|
|
456
|
+
steps: Record<string, Step<TLocal>>; // All steps by ID
|
|
457
|
+
count: number; // Total number of steps
|
|
458
|
+
global: TGlobal | null; // Global metadata
|
|
459
|
+
}
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
### Type Exports
|
|
463
|
+
|
|
464
|
+
```ts
|
|
465
|
+
import type {
|
|
466
|
+
ComponentMap,
|
|
467
|
+
CustomBlockProps,
|
|
468
|
+
StandardComponentProps,
|
|
469
|
+
ParseResult,
|
|
470
|
+
Step,
|
|
471
|
+
} from "solid-mds";
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
## License
|
|
475
|
+
|
|
476
|
+
MIT
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Component, JSX } from 'solid-js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Props for custom block components (code blocks with name/sub/path syntax)
|
|
5
|
+
*/
|
|
6
|
+
interface CustomBlockProps {
|
|
7
|
+
/** The path segments after the component name, e.g. ['substructure', 'subsub'] */
|
|
8
|
+
payload: string[];
|
|
9
|
+
/** The raw content of the code block as plain text */
|
|
10
|
+
raw: string;
|
|
11
|
+
/** Parsed YAML data when using componentName| syntax */
|
|
12
|
+
data?: Record<string, string | string[]>;
|
|
13
|
+
/** The markdown-rendered content as children */
|
|
14
|
+
children?: JSX.Element;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Standard component props for regular HTML elements
|
|
18
|
+
*/
|
|
19
|
+
interface StandardComponentProps {
|
|
20
|
+
children?: JSX.Element;
|
|
21
|
+
[key: string]: unknown;
|
|
22
|
+
}
|
|
23
|
+
type ComponentMap = {
|
|
24
|
+
[tagName: string]: Component<CustomBlockProps> | Component<StandardComponentProps>;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
interface StepLocalBase {
|
|
28
|
+
[key: string]: unknown;
|
|
29
|
+
}
|
|
30
|
+
interface GlobalMetaBase {
|
|
31
|
+
[key: string]: unknown;
|
|
32
|
+
}
|
|
33
|
+
interface Step<TLocal = StepLocalBase> {
|
|
34
|
+
id: string;
|
|
35
|
+
local: TLocal;
|
|
36
|
+
/** Component function that renders the step body. Call it to get JSX: {step.Body()} */
|
|
37
|
+
Body: Component;
|
|
38
|
+
prev: string | null;
|
|
39
|
+
next: string | null;
|
|
40
|
+
current: number;
|
|
41
|
+
}
|
|
42
|
+
interface ParseResult<TGlobal = GlobalMetaBase, TLocal = StepLocalBase> {
|
|
43
|
+
first: string | null;
|
|
44
|
+
steps: Record<string, Step<TLocal>>;
|
|
45
|
+
count: number;
|
|
46
|
+
global: TGlobal | null;
|
|
47
|
+
}
|
|
48
|
+
declare function parse<TGlobal = GlobalMetaBase, TLocal = StepLocalBase>(input: string, components?: ComponentMap): ParseResult<TGlobal, TLocal>;
|
|
49
|
+
|
|
50
|
+
export { type ComponentMap, type CustomBlockProps, type GlobalMetaBase, type ParseResult, type StandardComponentProps, type Step, type StepLocalBase, parse };
|
package/dist/index.jsx
ADDED
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
// src/index.tsx
|
|
2
|
+
import { unified } from "unified";
|
|
3
|
+
import remarkParse from "remark-parse";
|
|
4
|
+
import remarkGfm from "remark-gfm";
|
|
5
|
+
import remarkMath from "remark-math";
|
|
6
|
+
import remarkRehype from "remark-rehype";
|
|
7
|
+
import rehypeKatex from "rehype-katex";
|
|
8
|
+
import { parse as parseYaml2 } from "yaml";
|
|
9
|
+
|
|
10
|
+
// src/hast-to-solid.tsx
|
|
11
|
+
function convertProperties(properties) {
|
|
12
|
+
if (!properties) return {};
|
|
13
|
+
const result = {};
|
|
14
|
+
for (const [key, value] of Object.entries(properties)) {
|
|
15
|
+
if (key === "className") {
|
|
16
|
+
result.class = value;
|
|
17
|
+
} else if (key === "class") {
|
|
18
|
+
result.class = Array.isArray(value) ? value.join(" ") : value;
|
|
19
|
+
} else {
|
|
20
|
+
result[key] = value;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return result;
|
|
24
|
+
}
|
|
25
|
+
function renderElement(tagName, props, children) {
|
|
26
|
+
switch (tagName) {
|
|
27
|
+
case "p":
|
|
28
|
+
return <p {...props}>{children}</p>;
|
|
29
|
+
case "h1":
|
|
30
|
+
return <h1 {...props}>{children}</h1>;
|
|
31
|
+
case "h2":
|
|
32
|
+
return <h2 {...props}>{children}</h2>;
|
|
33
|
+
case "h3":
|
|
34
|
+
return <h3 {...props}>{children}</h3>;
|
|
35
|
+
case "h4":
|
|
36
|
+
return <h4 {...props}>{children}</h4>;
|
|
37
|
+
case "h5":
|
|
38
|
+
return <h5 {...props}>{children}</h5>;
|
|
39
|
+
case "h6":
|
|
40
|
+
return <h6 {...props}>{children}</h6>;
|
|
41
|
+
case "div":
|
|
42
|
+
return <div {...props}>{children}</div>;
|
|
43
|
+
case "span":
|
|
44
|
+
return <span {...props}>{children}</span>;
|
|
45
|
+
case "a":
|
|
46
|
+
return <a {...props}>{children}</a>;
|
|
47
|
+
case "strong":
|
|
48
|
+
return <strong {...props}>{children}</strong>;
|
|
49
|
+
case "b":
|
|
50
|
+
return <b {...props}>{children}</b>;
|
|
51
|
+
case "em":
|
|
52
|
+
return <em {...props}>{children}</em>;
|
|
53
|
+
case "i":
|
|
54
|
+
return <i {...props}>{children}</i>;
|
|
55
|
+
case "code":
|
|
56
|
+
return <code {...props}>{children}</code>;
|
|
57
|
+
case "pre":
|
|
58
|
+
return <pre {...props}>{children}</pre>;
|
|
59
|
+
case "blockquote":
|
|
60
|
+
return <blockquote {...props}>{children}</blockquote>;
|
|
61
|
+
case "ul":
|
|
62
|
+
return <ul {...props}>{children}</ul>;
|
|
63
|
+
case "ol":
|
|
64
|
+
return <ol {...props}>{children}</ol>;
|
|
65
|
+
case "li":
|
|
66
|
+
return <li {...props}>{children}</li>;
|
|
67
|
+
case "hr":
|
|
68
|
+
return <hr {...props} />;
|
|
69
|
+
case "br":
|
|
70
|
+
return <br {...props} />;
|
|
71
|
+
case "img":
|
|
72
|
+
return <img {...props} />;
|
|
73
|
+
case "table":
|
|
74
|
+
return <table {...props}>{children}</table>;
|
|
75
|
+
case "thead":
|
|
76
|
+
return <thead {...props}>{children}</thead>;
|
|
77
|
+
case "tbody":
|
|
78
|
+
return <tbody {...props}>{children}</tbody>;
|
|
79
|
+
case "tr":
|
|
80
|
+
return <tr {...props}>{children}</tr>;
|
|
81
|
+
case "th":
|
|
82
|
+
return <th {...props}>{children}</th>;
|
|
83
|
+
case "td":
|
|
84
|
+
return <td {...props}>{children}</td>;
|
|
85
|
+
case "del":
|
|
86
|
+
return <del {...props}>{children}</del>;
|
|
87
|
+
case "sup":
|
|
88
|
+
return <sup {...props}>{children}</sup>;
|
|
89
|
+
case "sub":
|
|
90
|
+
return <sub {...props}>{children}</sub>;
|
|
91
|
+
// GFM elements
|
|
92
|
+
case "input":
|
|
93
|
+
return <input {...props} />;
|
|
94
|
+
case "section":
|
|
95
|
+
return <section {...props}>{children}</section>;
|
|
96
|
+
// KaTeX math elements
|
|
97
|
+
case "math":
|
|
98
|
+
return <math {...props}>{children}</math>;
|
|
99
|
+
case "semantics":
|
|
100
|
+
return <semantics {...props}>{children}</semantics>;
|
|
101
|
+
case "mrow":
|
|
102
|
+
return <mrow {...props}>{children}</mrow>;
|
|
103
|
+
case "mi":
|
|
104
|
+
return <mi {...props}>{children}</mi>;
|
|
105
|
+
case "mo":
|
|
106
|
+
return <mo {...props}>{children}</mo>;
|
|
107
|
+
case "mn":
|
|
108
|
+
return <mn {...props}>{children}</mn>;
|
|
109
|
+
case "mfrac":
|
|
110
|
+
return <mfrac {...props}>{children}</mfrac>;
|
|
111
|
+
case "msup":
|
|
112
|
+
return <msup {...props}>{children}</msup>;
|
|
113
|
+
case "msub":
|
|
114
|
+
return <msub {...props}>{children}</msub>;
|
|
115
|
+
case "msubsup":
|
|
116
|
+
return <msubsup {...props}>{children}</msubsup>;
|
|
117
|
+
case "msqrt":
|
|
118
|
+
return <msqrt {...props}>{children}</msqrt>;
|
|
119
|
+
case "mroot":
|
|
120
|
+
return <mroot {...props}>{children}</mroot>;
|
|
121
|
+
case "munder":
|
|
122
|
+
return <munder {...props}>{children}</munder>;
|
|
123
|
+
case "mover":
|
|
124
|
+
return <mover {...props}>{children}</mover>;
|
|
125
|
+
case "munderover":
|
|
126
|
+
return <munderover {...props}>{children}</munderover>;
|
|
127
|
+
case "mtable":
|
|
128
|
+
return <mtable {...props}>{children}</mtable>;
|
|
129
|
+
case "mtr":
|
|
130
|
+
return <mtr {...props}>{children}</mtr>;
|
|
131
|
+
case "mtd":
|
|
132
|
+
return <mtd {...props}>{children}</mtd>;
|
|
133
|
+
case "mtext":
|
|
134
|
+
return <mtext {...props}>{children}</mtext>;
|
|
135
|
+
case "mspace":
|
|
136
|
+
return <mspace {...props}>{children}</mspace>;
|
|
137
|
+
case "annotation":
|
|
138
|
+
return <annotation {...props}>{children}</annotation>;
|
|
139
|
+
case "svg":
|
|
140
|
+
return <svg {...props}>{children}</svg>;
|
|
141
|
+
case "path":
|
|
142
|
+
return <path {...props} />;
|
|
143
|
+
case "line":
|
|
144
|
+
return <line {...props} />;
|
|
145
|
+
case "rect":
|
|
146
|
+
return <rect {...props} />;
|
|
147
|
+
case "circle":
|
|
148
|
+
return <circle {...props} />;
|
|
149
|
+
case "g":
|
|
150
|
+
return <g {...props}>{children}</g>;
|
|
151
|
+
case "defs":
|
|
152
|
+
return <defs {...props}>{children}</defs>;
|
|
153
|
+
case "clipPath":
|
|
154
|
+
return <clipPath {...props}>{children}</clipPath>;
|
|
155
|
+
case "use":
|
|
156
|
+
return <use {...props} />;
|
|
157
|
+
default:
|
|
158
|
+
return <div {...props}>{children}</div>;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
function renderNode(node, components) {
|
|
162
|
+
if (node.type === "text") {
|
|
163
|
+
return node.value;
|
|
164
|
+
}
|
|
165
|
+
if (node.type === "element") {
|
|
166
|
+
const element = node;
|
|
167
|
+
const tagName = element.tagName;
|
|
168
|
+
const rawProps = convertProperties(element.properties);
|
|
169
|
+
const CustomComponent = components[tagName];
|
|
170
|
+
const childElements = element.children.length > 0 ? element.children.map((child) => renderNode(child, components)) : null;
|
|
171
|
+
if (CustomComponent) {
|
|
172
|
+
if (typeof rawProps.payload === "string" && typeof rawProps.raw === "string") {
|
|
173
|
+
const customBlockProps = {
|
|
174
|
+
payload: JSON.parse(rawProps.payload),
|
|
175
|
+
raw: rawProps.raw
|
|
176
|
+
};
|
|
177
|
+
if (typeof rawProps.data === "string") {
|
|
178
|
+
customBlockProps.data = JSON.parse(rawProps.data);
|
|
179
|
+
}
|
|
180
|
+
const Comp2 = CustomComponent;
|
|
181
|
+
return <Comp2 {...customBlockProps}>{childElements}</Comp2>;
|
|
182
|
+
}
|
|
183
|
+
const Comp = CustomComponent;
|
|
184
|
+
return <Comp {...rawProps}>{childElements}</Comp>;
|
|
185
|
+
}
|
|
186
|
+
return renderElement(tagName, rawProps, childElements);
|
|
187
|
+
}
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
function hastToSolidComponent(hastTree, components = {}) {
|
|
191
|
+
const treeData = hastTree;
|
|
192
|
+
const componentMap = components;
|
|
193
|
+
return function HastBody() {
|
|
194
|
+
const elements = treeData.children.map((node) => renderNode(node, componentMap));
|
|
195
|
+
return <>{elements}</>;
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// src/remark-custom-blocks.ts
|
|
200
|
+
import { visit } from "unist-util-visit";
|
|
201
|
+
import { parse as parseYaml } from "yaml";
|
|
202
|
+
function remarkCustomBlocks(options) {
|
|
203
|
+
const { components, processor } = options;
|
|
204
|
+
return (tree) => {
|
|
205
|
+
visit(tree, "code", (node, index, parent) => {
|
|
206
|
+
if (!parent || index === void 0) return;
|
|
207
|
+
const lang = node.lang;
|
|
208
|
+
if (!lang) return;
|
|
209
|
+
const isDataBlock = lang.endsWith("|");
|
|
210
|
+
const cleanLang = isDataBlock ? lang.slice(0, -1) : lang;
|
|
211
|
+
const segments = cleanLang.split("/");
|
|
212
|
+
const componentName = segments[0];
|
|
213
|
+
const raw = node.value;
|
|
214
|
+
if (!components.has(componentName)) return;
|
|
215
|
+
const payload = segments.slice(1);
|
|
216
|
+
if (isDataBlock) {
|
|
217
|
+
const data = parseYaml(raw);
|
|
218
|
+
const customNode2 = {
|
|
219
|
+
type: "customBlock",
|
|
220
|
+
data: {
|
|
221
|
+
hName: componentName,
|
|
222
|
+
hProperties: {
|
|
223
|
+
payload: JSON.stringify(payload),
|
|
224
|
+
raw,
|
|
225
|
+
data: JSON.stringify(data)
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
children: []
|
|
229
|
+
};
|
|
230
|
+
parent.children[index] = customNode2;
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
const contentMdast = processor.parse(raw);
|
|
234
|
+
const customNode = {
|
|
235
|
+
type: "customBlock",
|
|
236
|
+
data: {
|
|
237
|
+
hName: componentName,
|
|
238
|
+
hProperties: {
|
|
239
|
+
payload: JSON.stringify(payload),
|
|
240
|
+
raw
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
children: contentMdast.children
|
|
244
|
+
};
|
|
245
|
+
parent.children[index] = customNode;
|
|
246
|
+
});
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// src/index.tsx
|
|
251
|
+
function parseLocalMeta(content, processor, components) {
|
|
252
|
+
const metaPattern = /```@\|\s*\n([\s\S]*?)```\s*\n?/g;
|
|
253
|
+
let match;
|
|
254
|
+
let local = {};
|
|
255
|
+
let body = content;
|
|
256
|
+
while ((match = metaPattern.exec(content)) !== null) {
|
|
257
|
+
const parsed = parseYaml2(match[1]);
|
|
258
|
+
local = { ...local, ...parsed };
|
|
259
|
+
}
|
|
260
|
+
body = content.replace(metaPattern, "").trim();
|
|
261
|
+
const localMdPattern = /```@\/(\w+)\s*\n([\s\S]*?)```\s*\n?/g;
|
|
262
|
+
const localMdBlocks = {};
|
|
263
|
+
while ((match = localMdPattern.exec(body)) !== null) {
|
|
264
|
+
const name = match[1];
|
|
265
|
+
const content2 = match[2].trim();
|
|
266
|
+
if (localMdBlocks[name]) {
|
|
267
|
+
localMdBlocks[name] += "\n\n" + content2;
|
|
268
|
+
} else {
|
|
269
|
+
localMdBlocks[name] = content2;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
body = body.replace(localMdPattern, "").trim();
|
|
273
|
+
for (const [name, mdContent] of Object.entries(localMdBlocks)) {
|
|
274
|
+
const mdast = processor.parse(mdContent);
|
|
275
|
+
const hastTree = processor.runSync(mdast);
|
|
276
|
+
local[name] = hastToSolidComponent(hastTree, components);
|
|
277
|
+
}
|
|
278
|
+
return { local, body };
|
|
279
|
+
}
|
|
280
|
+
function parseGlobalMeta(input, processor, components) {
|
|
281
|
+
const globalDataPattern = /```@@\|\s*\n([\s\S]*?)```/g;
|
|
282
|
+
let match;
|
|
283
|
+
let global = {};
|
|
284
|
+
while ((match = globalDataPattern.exec(input)) !== null) {
|
|
285
|
+
const parsed = parseYaml2(match[1]);
|
|
286
|
+
global = { ...global, ...parsed };
|
|
287
|
+
}
|
|
288
|
+
const globalMdPattern = /```@@\/(\w+)\s*\n([\s\S]*?)```/g;
|
|
289
|
+
const globalMdBlocks = {};
|
|
290
|
+
while ((match = globalMdPattern.exec(input)) !== null) {
|
|
291
|
+
const name = match[1];
|
|
292
|
+
const content = match[2].trim();
|
|
293
|
+
if (globalMdBlocks[name]) {
|
|
294
|
+
globalMdBlocks[name] += "\n\n" + content;
|
|
295
|
+
} else {
|
|
296
|
+
globalMdBlocks[name] = content;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
for (const [name, mdContent] of Object.entries(globalMdBlocks)) {
|
|
300
|
+
const mdast = processor.parse(mdContent);
|
|
301
|
+
const hastTree = processor.runSync(mdast);
|
|
302
|
+
global[name] = hastToSolidComponent(hastTree, components);
|
|
303
|
+
}
|
|
304
|
+
return Object.keys(global).length > 0 ? global : null;
|
|
305
|
+
}
|
|
306
|
+
function isInsideCodeBlock(input, position) {
|
|
307
|
+
const beforeText = input.slice(0, position);
|
|
308
|
+
const fencePattern = /^```/gm;
|
|
309
|
+
let fenceCount = 0;
|
|
310
|
+
let match;
|
|
311
|
+
while ((match = fencePattern.exec(beforeText)) !== null) {
|
|
312
|
+
fenceCount++;
|
|
313
|
+
}
|
|
314
|
+
return fenceCount % 2 === 1;
|
|
315
|
+
}
|
|
316
|
+
var VALID_ID_PATTERN = /^[a-z0-9-]+$/;
|
|
317
|
+
function validateStepId(id, lineNumber) {
|
|
318
|
+
if (!VALID_ID_PATTERN.test(id)) {
|
|
319
|
+
throw new Error(
|
|
320
|
+
`Invalid step ID "${id}" at line ${lineNumber}. Step IDs must only contain lowercase letters (a-z), numbers (0-9), and hyphens (-).`
|
|
321
|
+
);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
function parse(input, components = {}) {
|
|
325
|
+
const stepPattern = /^\+\+\+(.+)$/gm;
|
|
326
|
+
const steps = {};
|
|
327
|
+
const componentNames = new Set(Object.keys(components));
|
|
328
|
+
const baseProcessor = unified().use(remarkParse).use(remarkGfm).use(remarkMath);
|
|
329
|
+
const processor = unified().use(remarkParse).use(remarkGfm).use(remarkMath).use(remarkCustomBlocks, {
|
|
330
|
+
components: componentNames,
|
|
331
|
+
processor: baseProcessor
|
|
332
|
+
}).use(remarkRehype, { allowDangerousHtml: true }).use(rehypeKatex);
|
|
333
|
+
const global = parseGlobalMeta(input, processor, components);
|
|
334
|
+
let match;
|
|
335
|
+
const matches = [];
|
|
336
|
+
while ((match = stepPattern.exec(input)) !== null) {
|
|
337
|
+
if (!isInsideCodeBlock(input, match.index)) {
|
|
338
|
+
const id = match[1].trim();
|
|
339
|
+
const lineNumber = input.slice(0, match.index).split("\n").length;
|
|
340
|
+
validateStepId(id, lineNumber);
|
|
341
|
+
matches.push({ id, index: match.index });
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
if (matches.length === 0) {
|
|
345
|
+
const { local, body: markdown } = parseLocalMeta(
|
|
346
|
+
input.trim(),
|
|
347
|
+
processor,
|
|
348
|
+
components
|
|
349
|
+
);
|
|
350
|
+
const mdast = processor.parse(markdown);
|
|
351
|
+
const hastTree = processor.runSync(mdast);
|
|
352
|
+
const Body = hastToSolidComponent(hastTree, components);
|
|
353
|
+
steps["default"] = {
|
|
354
|
+
id: "default",
|
|
355
|
+
local,
|
|
356
|
+
Body,
|
|
357
|
+
prev: null,
|
|
358
|
+
next: null,
|
|
359
|
+
current: 1
|
|
360
|
+
};
|
|
361
|
+
return {
|
|
362
|
+
first: "default",
|
|
363
|
+
steps,
|
|
364
|
+
count: 1,
|
|
365
|
+
global
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
for (let i = 0; i < matches.length; i++) {
|
|
369
|
+
const current = matches[i];
|
|
370
|
+
const nextMatch = matches[i + 1];
|
|
371
|
+
const prevMatch = matches[i - 1];
|
|
372
|
+
const startIndex = current.index + `+++${current.id}`.length;
|
|
373
|
+
const endIndex = nextMatch ? nextMatch.index : input.length;
|
|
374
|
+
const rawContent = input.slice(startIndex, endIndex).trim();
|
|
375
|
+
const { local, body: markdown } = parseLocalMeta(
|
|
376
|
+
rawContent,
|
|
377
|
+
processor,
|
|
378
|
+
components
|
|
379
|
+
);
|
|
380
|
+
const mdast = processor.parse(markdown);
|
|
381
|
+
const hastTree = processor.runSync(mdast);
|
|
382
|
+
const Body = hastToSolidComponent(hastTree, components);
|
|
383
|
+
steps[current.id] = {
|
|
384
|
+
id: current.id,
|
|
385
|
+
local,
|
|
386
|
+
Body,
|
|
387
|
+
prev: prevMatch ? prevMatch.id : null,
|
|
388
|
+
next: nextMatch ? nextMatch.id : null,
|
|
389
|
+
current: i + 1
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
return {
|
|
393
|
+
first: matches.length > 0 ? matches[0].id : null,
|
|
394
|
+
steps,
|
|
395
|
+
count: matches.length,
|
|
396
|
+
global
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
export {
|
|
400
|
+
parse
|
|
401
|
+
};
|
|
402
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzeCIsICIuLi9zcmMvaGFzdC10by1zb2xpZC50c3giLCAiLi4vc3JjL3JlbWFyay1jdXN0b20tYmxvY2tzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBDb21wb25lbnQsIEpTWCB9IGZyb20gXCJzb2xpZC1qc1wiO1xuaW1wb3J0IHsgdW5pZmllZCwgdHlwZSBQcm9jZXNzb3IgfSBmcm9tIFwidW5pZmllZFwiO1xuaW1wb3J0IHJlbWFya1BhcnNlIGZyb20gXCJyZW1hcmstcGFyc2VcIjtcbmltcG9ydCByZW1hcmtHZm0gZnJvbSBcInJlbWFyay1nZm1cIjtcbmltcG9ydCByZW1hcmtNYXRoIGZyb20gXCJyZW1hcmstbWF0aFwiO1xuaW1wb3J0IHJlbWFya1JlaHlwZSBmcm9tIFwicmVtYXJrLXJlaHlwZVwiO1xuaW1wb3J0IHJlaHlwZUthdGV4IGZyb20gXCJyZWh5cGUta2F0ZXhcIjtcbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlWWFtbCB9IGZyb20gXCJ5YW1sXCI7XG5pbXBvcnQgdHlwZSB7IFJvb3QgfSBmcm9tIFwiaGFzdFwiO1xuaW1wb3J0IHtcbiAgaGFzdFRvU29saWRKc3gsXG4gIGhhc3RUb1NvbGlkQ29tcG9uZW50LFxuICBDb21wb25lbnRNYXAsXG59IGZyb20gXCIuL2hhc3QtdG8tc29saWRcIjtcbmltcG9ydCB7IHJlbWFya0N1c3RvbUJsb2NrcyB9IGZyb20gXCIuL3JlbWFyay1jdXN0b20tYmxvY2tzXCI7XG5cbmV4cG9ydCB0eXBlIHtcbiAgQ29tcG9uZW50TWFwLFxuICBDdXN0b21CbG9ja1Byb3BzLFxuICBTdGFuZGFyZENvbXBvbmVudFByb3BzLFxufSBmcm9tIFwiLi9oYXN0LXRvLXNvbGlkXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RlcExvY2FsQmFzZSB7XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2xvYmFsTWV0YUJhc2Uge1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXA8VExvY2FsID0gU3RlcExvY2FsQmFzZT4ge1xuICBpZDogc3RyaW5nO1xuICBsb2NhbDogVExvY2FsO1xuICAvKiogQ29tcG9uZW50IGZ1bmN0aW9uIHRoYXQgcmVuZGVycyB0aGUgc3RlcCBib2R5LiBDYWxsIGl0IHRvIGdldCBKU1g6IHtzdGVwLkJvZHkoKX0gKi9cbiAgQm9keTogQ29tcG9uZW50O1xuICBwcmV2OiBzdHJpbmcgfCBudWxsO1xuICBuZXh0OiBzdHJpbmcgfCBudWxsO1xuICBjdXJyZW50OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VSZXN1bHQ8VEdsb2JhbCA9IEdsb2JhbE1ldGFCYXNlLCBUTG9jYWwgPSBTdGVwTG9jYWxCYXNlPiB7XG4gIGZpcnN0OiBzdHJpbmcgfCBudWxsO1xuICBzdGVwczogUmVjb3JkPHN0cmluZywgU3RlcDxUTG9jYWw+PjtcbiAgY291bnQ6IG51bWJlcjtcbiAgZ2xvYmFsOiBUR2xvYmFsIHwgbnVsbDtcbn1cblxuXG5mdW5jdGlvbiBwYXJzZUxvY2FsTWV0YShcbiAgY29udGVudDogc3RyaW5nLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcm9jZXNzb3I6IFByb2Nlc3NvcjxhbnksIGFueSwgYW55LCBhbnksIGFueT4sXG4gIGNvbXBvbmVudHM6IENvbXBvbmVudE1hcCxcbik6IHsgbG9jYWw6IFN0ZXBMb2NhbEJhc2U7IGJvZHk6IHN0cmluZyB9IHtcbiAgLy8gTWF0Y2ggYWxsIGxvY2FsIG1ldGFkYXRhIGJsb2NrczogYGBgQHwgLi4uIGBgYFxuICAvLyBNdWx0aXBsZSBibG9ja3MgYXJlIG1lcmdlZCwgbGF0ZXIgdmFsdWVzIG92ZXJyaWRlIGVhcmxpZXIgb25lc1xuICBjb25zdCBtZXRhUGF0dGVybiA9IC9gYGBAXFx8XFxzKlxcbihbXFxzXFxTXSo/KWBgYFxccypcXG4/L2c7XG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcbiAgbGV0IGxvY2FsOiBTdGVwTG9jYWxCYXNlID0ge307XG4gIGxldCBib2R5ID0gY29udGVudDtcblxuICB3aGlsZSAoKG1hdGNoID0gbWV0YVBhdHRlcm4uZXhlYyhjb250ZW50KSkgIT09IG51bGwpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVlhbWwobWF0Y2hbMV0pO1xuICAgIGxvY2FsID0geyAuLi5sb2NhbCwgLi4ucGFyc2VkIH07XG4gIH1cblxuICAvLyBSZW1vdmUgYWxsIG1ldGFkYXRhIGJsb2NrcyBmcm9tIGJvZHlcbiAgYm9keSA9IGNvbnRlbnQucmVwbGFjZShtZXRhUGF0dGVybiwgXCJcIikudHJpbSgpO1xuXG4gIC8vIE1hdGNoIGxvY2FsIG1kIGJsb2NrczogYGBgQC9uYW1lIC4uLiBgYGBcbiAgLy8gVGhlc2UgYXJlIG1hcmtkb3duIGJsb2NrcyB0aGF0IGdldCByZW5kZXJlZCBhbmQgc3RvcmVkIGluIGxvY2FsW25hbWVdXG4gIGNvbnN0IGxvY2FsTWRQYXR0ZXJuID0gL2BgYEBcXC8oXFx3KylcXHMqXFxuKFtcXHNcXFNdKj8pYGBgXFxzKlxcbj8vZztcbiAgY29uc3QgbG9jYWxNZEJsb2NrczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIHdoaWxlICgobWF0Y2ggPSBsb2NhbE1kUGF0dGVybi5leGVjKGJvZHkpKSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IG5hbWUgPSBtYXRjaFsxXTtcbiAgICBjb25zdCBjb250ZW50ID0gbWF0Y2hbMl0udHJpbSgpO1xuICAgIC8vIENvbmNhdGVuYXRlIGlmIG11bHRpcGxlIGJsb2NrcyB3aXRoIHNhbWUgbmFtZVxuICAgIGlmIChsb2NhbE1kQmxvY2tzW25hbWVdKSB7XG4gICAgICBsb2NhbE1kQmxvY2tzW25hbWVdICs9IFwiXFxuXFxuXCIgKyBjb250ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2NhbE1kQmxvY2tzW25hbWVdID0gY29udGVudDtcbiAgICB9XG4gIH1cblxuICAvLyBSZW1vdmUgYWxsIGxvY2FsIG1kIGJsb2NrcyBmcm9tIGJvZHlcbiAgYm9keSA9IGJvZHkucmVwbGFjZShsb2NhbE1kUGF0dGVybiwgXCJcIikudHJpbSgpO1xuXG4gIC8vIENvbnZlcnQgYWxsIGxvY2FsIG1kIGJsb2NrcyB0byBKU1hcbiAgZm9yIChjb25zdCBbbmFtZSwgbWRDb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhsb2NhbE1kQmxvY2tzKSkge1xuICAgIGNvbnN0IG1kYXN0ID0gcHJvY2Vzc29yLnBhcnNlKG1kQ29udGVudCk7XG4gICAgY29uc3QgaGFzdFRyZWUgPSBwcm9jZXNzb3IucnVuU3luYyhtZGFzdCkgYXMgUm9vdDtcbiAgICBsb2NhbFtuYW1lXSA9IGhhc3RUb1NvbGlkQ29tcG9uZW50KGhhc3RUcmVlLCBjb21wb25lbnRzKTtcbiAgfVxuXG4gIHJldHVybiB7IGxvY2FsLCBib2R5IH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlR2xvYmFsTWV0YShcbiAgaW5wdXQ6IHN0cmluZyxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJvY2Vzc29yOiBQcm9jZXNzb3I8YW55LCBhbnksIGFueSwgYW55LCBhbnk+LFxuICBjb21wb25lbnRzOiBDb21wb25lbnRNYXAsXG4pOiBHbG9iYWxNZXRhQmFzZSB8IG51bGwge1xuICAvLyBNYXRjaCBnbG9iYWwgZGF0YSBibG9ja3M6IGBgYEBAfCAuLi4gYGBgXG4gIC8vIENhbiBhcHBlYXIgYW55d2hlcmUgaW4gdGhlIGRvY3VtZW50LCBtYXkgaGF2ZSBtdWx0aXBsZSBibG9ja3NcbiAgY29uc3QgZ2xvYmFsRGF0YVBhdHRlcm4gPSAvYGBgQEBcXHxcXHMqXFxuKFtcXHNcXFNdKj8pYGBgL2c7XG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcbiAgbGV0IGdsb2JhbDogR2xvYmFsTWV0YUJhc2UgPSB7fTtcblxuICB3aGlsZSAoKG1hdGNoID0gZ2xvYmFsRGF0YVBhdHRlcm4uZXhlYyhpbnB1dCkpICE9PSBudWxsKSB7XG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VZYW1sKG1hdGNoWzFdKTtcbiAgICBnbG9iYWwgPSB7IC4uLmdsb2JhbCwgLi4ucGFyc2VkIH07XG4gIH1cblxuICAvLyBNYXRjaCBnbG9iYWwgbWQgYmxvY2tzOiBgYGBAQC9uYW1lIC4uLiBgYGBcbiAgLy8gVGhlc2UgYXJlIG1hcmtkb3duIGJsb2NrcyB0aGF0IGdldCByZW5kZXJlZCBhbmQgc3RvcmVkIGluIGdsb2JhbFtuYW1lXVxuICBjb25zdCBnbG9iYWxNZFBhdHRlcm4gPSAvYGBgQEBcXC8oXFx3KylcXHMqXFxuKFtcXHNcXFNdKj8pYGBgL2c7XG4gIGNvbnN0IGdsb2JhbE1kQmxvY2tzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgd2hpbGUgKChtYXRjaCA9IGdsb2JhbE1kUGF0dGVybi5leGVjKGlucHV0KSkgIT09IG51bGwpIHtcbiAgICBjb25zdCBuYW1lID0gbWF0Y2hbMV07XG4gICAgY29uc3QgY29udGVudCA9IG1hdGNoWzJdLnRyaW0oKTtcbiAgICAvLyBDb25jYXRlbmF0ZSBpZiBtdWx0aXBsZSBibG9ja3Mgd2l0aCBzYW1lIG5hbWVcbiAgICBpZiAoZ2xvYmFsTWRCbG9ja3NbbmFtZV0pIHtcbiAgICAgIGdsb2JhbE1kQmxvY2tzW25hbWVdICs9IFwiXFxuXFxuXCIgKyBjb250ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBnbG9iYWxNZEJsb2Nrc1tuYW1lXSA9IGNvbnRlbnQ7XG4gICAgfVxuICB9XG5cbiAgLy8gQ29udmVydCBhbGwgZ2xvYmFsIG1kIGJsb2NrcyB0byBDb21wb25lbnRzXG4gIGZvciAoY29uc3QgW25hbWUsIG1kQ29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoZ2xvYmFsTWRCbG9ja3MpKSB7XG4gICAgY29uc3QgbWRhc3QgPSBwcm9jZXNzb3IucGFyc2UobWRDb250ZW50KTtcbiAgICBjb25zdCBoYXN0VHJlZSA9IHByb2Nlc3Nvci5ydW5TeW5jKG1kYXN0KSBhcyBSb290O1xuICAgIGdsb2JhbFtuYW1lXSA9IGhhc3RUb1NvbGlkQ29tcG9uZW50KGhhc3RUcmVlLCBjb21wb25lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3Qua2V5cyhnbG9iYWwpLmxlbmd0aCA+IDAgPyBnbG9iYWwgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBpc0luc2lkZUNvZGVCbG9jayhpbnB1dDogc3RyaW5nLCBwb3NpdGlvbjogbnVtYmVyKTogYm9vbGVhbiB7XG4gIC8vIEZpbmQgYWxsIGNvZGUgYmxvY2sgZmVuY2VzIGJlZm9yZSB0aGlzIHBvc2l0aW9uXG4gIGNvbnN0IGJlZm9yZVRleHQgPSBpbnB1dC5zbGljZSgwLCBwb3NpdGlvbik7XG4gIGNvbnN0IGZlbmNlUGF0dGVybiA9IC9eYGBgL2dtO1xuICBsZXQgZmVuY2VDb3VudCA9IDA7XG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcblxuICB3aGlsZSAoKG1hdGNoID0gZmVuY2VQYXR0ZXJuLmV4ZWMoYmVmb3JlVGV4dCkpICE9PSBudWxsKSB7XG4gICAgZmVuY2VDb3VudCsrO1xuICB9XG5cbiAgLy8gSWYgb2RkIG51bWJlciBvZiBmZW5jZXMsIHdlJ3JlIGluc2lkZSBhIGNvZGUgYmxvY2tcbiAgcmV0dXJuIGZlbmNlQ291bnQgJSAyID09PSAxO1xufVxuXG5jb25zdCBWQUxJRF9JRF9QQVRURVJOID0gL15bYS16MC05LV0rJC87XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3RlcElkKGlkOiBzdHJpbmcsIGxpbmVOdW1iZXI6IG51bWJlcik6IHZvaWQge1xuICBpZiAoIVZBTElEX0lEX1BBVFRFUk4udGVzdChpZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBzdGVwIElEIFwiJHtpZH1cIiBhdCBsaW5lICR7bGluZU51bWJlcn0uIGAgK1xuICAgICAgICBgU3RlcCBJRHMgbXVzdCBvbmx5IGNvbnRhaW4gbG93ZXJjYXNlIGxldHRlcnMgKGEteiksIG51bWJlcnMgKDAtOSksIGFuZCBoeXBoZW5zICgtKS5gLFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlPFRHbG9iYWwgPSBHbG9iYWxNZXRhQmFzZSwgVExvY2FsID0gU3RlcExvY2FsQmFzZT4oXG4gIGlucHV0OiBzdHJpbmcsXG4gIGNvbXBvbmVudHM6IENvbXBvbmVudE1hcCA9IHt9LFxuKTogUGFyc2VSZXN1bHQ8VEdsb2JhbCwgVExvY2FsPiB7XG4gIC8vIENhcHR1cmUgZXZlcnl0aGluZyBhZnRlciArKysgdW50aWwgZW5kIG9mIGxpbmVcbiAgY29uc3Qgc3RlcFBhdHRlcm4gPSAvXlxcK1xcK1xcKyguKykkL2dtO1xuICBjb25zdCBzdGVwczogUmVjb3JkPHN0cmluZywgU3RlcDxUTG9jYWw+PiA9IHt9O1xuICBjb25zdCBjb21wb25lbnROYW1lcyA9IG5ldyBTZXQoT2JqZWN0LmtleXMoY29tcG9uZW50cykpO1xuICBjb25zdCBiYXNlUHJvY2Vzc29yID0gdW5pZmllZCgpXG4gICAgLnVzZShyZW1hcmtQYXJzZSlcbiAgICAudXNlKHJlbWFya0dmbSlcbiAgICAudXNlKHJlbWFya01hdGgpO1xuICBjb25zdCBwcm9jZXNzb3IgPSB1bmlmaWVkKClcbiAgICAudXNlKHJlbWFya1BhcnNlKVxuICAgIC51c2UocmVtYXJrR2ZtKVxuICAgIC51c2UocmVtYXJrTWF0aClcbiAgICAudXNlKHJlbWFya0N1c3RvbUJsb2Nrcywge1xuICAgICAgY29tcG9uZW50czogY29tcG9uZW50TmFtZXMsXG4gICAgICBwcm9jZXNzb3I6IGJhc2VQcm9jZXNzb3IsXG4gICAgfSlcbiAgICAudXNlKHJlbWFya1JlaHlwZSwgeyBhbGxvd0Rhbmdlcm91c0h0bWw6IHRydWUgfSlcbiAgICAudXNlKHJlaHlwZUthdGV4KTtcbiAgY29uc3QgZ2xvYmFsID0gcGFyc2VHbG9iYWxNZXRhKGlucHV0LCBwcm9jZXNzb3IsIGNvbXBvbmVudHMpO1xuXG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcbiAgY29uc3QgbWF0Y2hlczogeyBpZDogc3RyaW5nOyBpbmRleDogbnVtYmVyIH1bXSA9IFtdO1xuXG4gIHdoaWxlICgobWF0Y2ggPSBzdGVwUGF0dGVybi5leGVjKGlucHV0KSkgIT09IG51bGwpIHtcbiAgICAvLyBTa2lwIHRoaXMgbWF0Y2ggaWYgaXQncyBpbnNpZGUgYSBjb2RlIGJsb2NrXG4gICAgaWYgKCFpc0luc2lkZUNvZGVCbG9jayhpbnB1dCwgbWF0Y2guaW5kZXgpKSB7XG4gICAgICBjb25zdCBpZCA9IG1hdGNoWzFdLnRyaW0oKTtcbiAgICAgIC8vIENhbGN1bGF0ZSBsaW5lIG51bWJlciBmb3IgZXJyb3IgbWVzc2FnZXNcbiAgICAgIGNvbnN0IGxpbmVOdW1iZXIgPSBpbnB1dC5zbGljZSgwLCBtYXRjaC5pbmRleCkuc3BsaXQoXCJcXG5cIikubGVuZ3RoO1xuICAgICAgdmFsaWRhdGVTdGVwSWQoaWQsIGxpbmVOdW1iZXIpO1xuICAgICAgbWF0Y2hlcy5wdXNoKHsgaWQsIGluZGV4OiBtYXRjaC5pbmRleCB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBJZiBubyBzZXBhcmF0b3JzIGZvdW5kLCB0cmVhdCB0aGUgZW50aXJlIGlucHV0IGFzIGEgc2luZ2xlIFwiZGVmYXVsdFwiIHN0ZXBcbiAgaWYgKG1hdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc3QgeyBsb2NhbCwgYm9keTogbWFya2Rvd24gfSA9IHBhcnNlTG9jYWxNZXRhKFxuICAgICAgaW5wdXQudHJpbSgpLFxuICAgICAgcHJvY2Vzc29yLFxuICAgICAgY29tcG9uZW50cyxcbiAgICApO1xuXG4gICAgY29uc3QgbWRhc3QgPSBwcm9jZXNzb3IucGFyc2UobWFya2Rvd24pO1xuICAgIGNvbnN0IGhhc3RUcmVlID0gcHJvY2Vzc29yLnJ1blN5bmMobWRhc3QpIGFzIFJvb3Q7XG4gICAgY29uc3QgQm9keSA9IGhhc3RUb1NvbGlkQ29tcG9uZW50KGhhc3RUcmVlLCBjb21wb25lbnRzKTtcblxuICAgIHN0ZXBzW1wiZGVmYXVsdFwiXSA9IHtcbiAgICAgIGlkOiBcImRlZmF1bHRcIixcbiAgICAgIGxvY2FsOiBsb2NhbCBhcyBUTG9jYWwsXG4gICAgICBCb2R5LFxuICAgICAgcHJldjogbnVsbCxcbiAgICAgIG5leHQ6IG51bGwsXG4gICAgICBjdXJyZW50OiAxLFxuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgZmlyc3Q6IFwiZGVmYXVsdFwiLFxuICAgICAgc3RlcHMsXG4gICAgICBjb3VudDogMSxcbiAgICAgIGdsb2JhbDogZ2xvYmFsIGFzIFRHbG9iYWwgfCBudWxsLFxuICAgIH07XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjdXJyZW50ID0gbWF0Y2hlc1tpXTtcbiAgICBjb25zdCBuZXh0TWF0Y2ggPSBtYXRjaGVzW2kgKyAxXTtcbiAgICBjb25zdCBwcmV2TWF0Y2ggPSBtYXRjaGVzW2kgLSAxXTtcblxuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBjdXJyZW50LmluZGV4ICsgYCsrKyR7Y3VycmVudC5pZH1gLmxlbmd0aDtcbiAgICBjb25zdCBlbmRJbmRleCA9IG5leHRNYXRjaCA/IG5leHRNYXRjaC5pbmRleCA6IGlucHV0Lmxlbmd0aDtcblxuICAgIGNvbnN0IHJhd0NvbnRlbnQgPSBpbnB1dC5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCkudHJpbSgpO1xuICAgIGNvbnN0IHsgbG9jYWwsIGJvZHk6IG1hcmtkb3duIH0gPSBwYXJzZUxvY2FsTWV0YShcbiAgICAgIHJhd0NvbnRlbnQsXG4gICAgICBwcm9jZXNzb3IsXG4gICAgICBjb21wb25lbnRzLFxuICAgICk7XG5cbiAgICBjb25zdCBtZGFzdCA9IHByb2Nlc3Nvci5wYXJzZShtYXJrZG93bik7XG4gICAgY29uc3QgaGFzdFRyZWUgPSBwcm9jZXNzb3IucnVuU3luYyhtZGFzdCkgYXMgUm9vdDtcbiAgICBjb25zdCBCb2R5ID0gaGFzdFRvU29saWRDb21wb25lbnQoaGFzdFRyZWUsIGNvbXBvbmVudHMpO1xuXG4gICAgc3RlcHNbY3VycmVudC5pZF0gPSB7XG4gICAgICBpZDogY3VycmVudC5pZCxcbiAgICAgIGxvY2FsOiBsb2NhbCBhcyBUTG9jYWwsXG4gICAgICBCb2R5LFxuICAgICAgcHJldjogcHJldk1hdGNoID8gcHJldk1hdGNoLmlkIDogbnVsbCxcbiAgICAgIG5leHQ6IG5leHRNYXRjaCA/IG5leHRNYXRjaC5pZCA6IG51bGwsXG4gICAgICBjdXJyZW50OiBpICsgMSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBmaXJzdDogbWF0Y2hlcy5sZW5ndGggPiAwID8gbWF0Y2hlc1swXS5pZCA6IG51bGwsXG4gICAgc3RlcHMsXG4gICAgY291bnQ6IG1hdGNoZXMubGVuZ3RoLFxuICAgIGdsb2JhbDogZ2xvYmFsIGFzIFRHbG9iYWwgfCBudWxsLFxuICB9O1xufVxuIiwgImltcG9ydCB7IEpTWCwgQ29tcG9uZW50LCBjaGlsZHJlbiBhcyByZXNvbHZlQ2hpbGRyZW4gfSBmcm9tIFwic29saWQtanNcIjtcbmltcG9ydCB0eXBlIHsgUm9vdCwgRWxlbWVudCwgVGV4dCwgUm9vdENvbnRlbnQgfSBmcm9tIFwiaGFzdFwiO1xuXG4vKipcbiAqIFByb3BzIGZvciBjdXN0b20gYmxvY2sgY29tcG9uZW50cyAoY29kZSBibG9ja3Mgd2l0aCBuYW1lL3N1Yi9wYXRoIHN5bnRheClcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21CbG9ja1Byb3BzIHtcbiAgLyoqIFRoZSBwYXRoIHNlZ21lbnRzIGFmdGVyIHRoZSBjb21wb25lbnQgbmFtZSwgZS5nLiBbJ3N1YnN0cnVjdHVyZScsICdzdWJzdWInXSAqL1xuICBwYXlsb2FkOiBzdHJpbmdbXTtcbiAgLyoqIFRoZSByYXcgY29udGVudCBvZiB0aGUgY29kZSBibG9jayBhcyBwbGFpbiB0ZXh0ICovXG4gIHJhdzogc3RyaW5nO1xuICAvKiogUGFyc2VkIFlBTUwgZGF0YSB3aGVuIHVzaW5nIGNvbXBvbmVudE5hbWV8IHN5bnRheCAqL1xuICBkYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+O1xuICAvKiogVGhlIG1hcmtkb3duLXJlbmRlcmVkIGNvbnRlbnQgYXMgY2hpbGRyZW4gKi9cbiAgY2hpbGRyZW4/OiBKU1guRWxlbWVudDtcbn1cblxuLyoqXG4gKiBTdGFuZGFyZCBjb21wb25lbnQgcHJvcHMgZm9yIHJlZ3VsYXIgSFRNTCBlbGVtZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YW5kYXJkQ29tcG9uZW50UHJvcHMge1xuICBjaGlsZHJlbj86IEpTWC5FbGVtZW50O1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5leHBvcnQgdHlwZSBDb21wb25lbnRNYXAgPSB7XG4gIFt0YWdOYW1lOiBzdHJpbmddOiBDb21wb25lbnQ8Q3VzdG9tQmxvY2tQcm9wcz4gfCBDb21wb25lbnQ8U3RhbmRhcmRDb21wb25lbnRQcm9wcz47XG59O1xuXG5mdW5jdGlvbiBjb252ZXJ0UHJvcGVydGllcyhcbiAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWRcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgaWYgKCFwcm9wZXJ0aWVzKSByZXR1cm4ge307XG5cbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BlcnRpZXMpKSB7XG4gICAgaWYgKGtleSA9PT0gXCJjbGFzc05hbWVcIikge1xuICAgICAgcmVzdWx0LmNsYXNzID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwiY2xhc3NcIikge1xuICAgICAgcmVzdWx0LmNsYXNzID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5qb2luKFwiIFwiKSA6IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckVsZW1lbnQoXG4gIHRhZ05hbWU6IHN0cmluZyxcbiAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBjaGlsZHJlbjogSlNYLkVsZW1lbnRcbik6IEpTWC5FbGVtZW50IHtcbiAgc3dpdGNoICh0YWdOYW1lKSB7XG4gICAgY2FzZSBcInBcIjpcbiAgICAgIHJldHVybiA8cCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L3A+O1xuICAgIGNhc2UgXCJoMVwiOlxuICAgICAgcmV0dXJuIDxoMSB7Li4ucHJvcHN9PntjaGlsZHJlbn08L2gxPjtcbiAgICBjYXNlIFwiaDJcIjpcbiAgICAgIHJldHVybiA8aDIgey4uLnByb3BzfT57Y2hpbGRyZW59PC9oMj47XG4gICAgY2FzZSBcImgzXCI6XG4gICAgICByZXR1cm4gPGgzIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvaDM+O1xuICAgIGNhc2UgXCJoNFwiOlxuICAgICAgcmV0dXJuIDxoNCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L2g0PjtcbiAgICBjYXNlIFwiaDVcIjpcbiAgICAgIHJldHVybiA8aDUgey4uLnByb3BzfT57Y2hpbGRyZW59PC9oNT47XG4gICAgY2FzZSBcImg2XCI6XG4gICAgICByZXR1cm4gPGg2IHsuLi5wcm9wc30+e2NoaWxkcmVufTwvaDY+O1xuICAgIGNhc2UgXCJkaXZcIjpcbiAgICAgIHJldHVybiA8ZGl2IHsuLi5wcm9wc30+e2NoaWxkcmVufTwvZGl2PjtcbiAgICBjYXNlIFwic3BhblwiOlxuICAgICAgcmV0dXJuIDxzcGFuIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvc3Bhbj47XG4gICAgY2FzZSBcImFcIjpcbiAgICAgIHJldHVybiA8YSB7Li4ucHJvcHN9PntjaGlsZHJlbn08L2E+O1xuICAgIGNhc2UgXCJzdHJvbmdcIjpcbiAgICAgIHJldHVybiA8c3Ryb25nIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvc3Ryb25nPjtcbiAgICBjYXNlIFwiYlwiOlxuICAgICAgcmV0dXJuIDxiIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvYj47XG4gICAgY2FzZSBcImVtXCI6XG4gICAgICByZXR1cm4gPGVtIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvZW0+O1xuICAgIGNhc2UgXCJpXCI6XG4gICAgICByZXR1cm4gPGkgey4uLnByb3BzfT57Y2hpbGRyZW59PC9pPjtcbiAgICBjYXNlIFwiY29kZVwiOlxuICAgICAgcmV0dXJuIDxjb2RlIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvY29kZT47XG4gICAgY2FzZSBcInByZVwiOlxuICAgICAgcmV0dXJuIDxwcmUgey4uLnByb3BzfT57Y2hpbGRyZW59PC9wcmU+O1xuICAgIGNhc2UgXCJibG9ja3F1b3RlXCI6XG4gICAgICByZXR1cm4gPGJsb2NrcXVvdGUgey4uLnByb3BzfT57Y2hpbGRyZW59PC9ibG9ja3F1b3RlPjtcbiAgICBjYXNlIFwidWxcIjpcbiAgICAgIHJldHVybiA8dWwgey4uLnByb3BzfT57Y2hpbGRyZW59PC91bD47XG4gICAgY2FzZSBcIm9sXCI6XG4gICAgICByZXR1cm4gPG9sIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvb2w+O1xuICAgIGNhc2UgXCJsaVwiOlxuICAgICAgcmV0dXJuIDxsaSB7Li4ucHJvcHN9PntjaGlsZHJlbn08L2xpPjtcbiAgICBjYXNlIFwiaHJcIjpcbiAgICAgIHJldHVybiA8aHIgey4uLnByb3BzfSAvPjtcbiAgICBjYXNlIFwiYnJcIjpcbiAgICAgIHJldHVybiA8YnIgey4uLnByb3BzfSAvPjtcbiAgICBjYXNlIFwiaW1nXCI6XG4gICAgICByZXR1cm4gPGltZyB7Li4ucHJvcHN9IC8+O1xuICAgIGNhc2UgXCJ0YWJsZVwiOlxuICAgICAgcmV0dXJuIDx0YWJsZSB7Li4ucHJvcHN9PntjaGlsZHJlbn08L3RhYmxlPjtcbiAgICBjYXNlIFwidGhlYWRcIjpcbiAgICAgIHJldHVybiA8dGhlYWQgey4uLnByb3BzfT57Y2hpbGRyZW59PC90aGVhZD47XG4gICAgY2FzZSBcInRib2R5XCI6XG4gICAgICByZXR1cm4gPHRib2R5IHsuLi5wcm9wc30+e2NoaWxkcmVufTwvdGJvZHk+O1xuICAgIGNhc2UgXCJ0clwiOlxuICAgICAgcmV0dXJuIDx0ciB7Li4ucHJvcHN9PntjaGlsZHJlbn08L3RyPjtcbiAgICBjYXNlIFwidGhcIjpcbiAgICAgIHJldHVybiA8dGggey4uLnByb3BzfT57Y2hpbGRyZW59PC90aD47XG4gICAgY2FzZSBcInRkXCI6XG4gICAgICByZXR1cm4gPHRkIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvdGQ+O1xuICAgIGNhc2UgXCJkZWxcIjpcbiAgICAgIHJldHVybiA8ZGVsIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvZGVsPjtcbiAgICBjYXNlIFwic3VwXCI6XG4gICAgICByZXR1cm4gPHN1cCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L3N1cD47XG4gICAgY2FzZSBcInN1YlwiOlxuICAgICAgcmV0dXJuIDxzdWIgey4uLnByb3BzfT57Y2hpbGRyZW59PC9zdWI+O1xuICAgIC8vIEdGTSBlbGVtZW50c1xuICAgIGNhc2UgXCJpbnB1dFwiOlxuICAgICAgcmV0dXJuIDxpbnB1dCB7Li4ucHJvcHN9IC8+O1xuICAgIGNhc2UgXCJzZWN0aW9uXCI6XG4gICAgICByZXR1cm4gPHNlY3Rpb24gey4uLnByb3BzfT57Y2hpbGRyZW59PC9zZWN0aW9uPjtcbiAgICAvLyBLYVRlWCBtYXRoIGVsZW1lbnRzXG4gICAgY2FzZSBcIm1hdGhcIjpcbiAgICAgIHJldHVybiA8bWF0aCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L21hdGg+O1xuICAgIGNhc2UgXCJzZW1hbnRpY3NcIjpcbiAgICAgIHJldHVybiA8c2VtYW50aWNzIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvc2VtYW50aWNzPjtcbiAgICBjYXNlIFwibXJvd1wiOlxuICAgICAgcmV0dXJuIDxtcm93IHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbXJvdz47XG4gICAgY2FzZSBcIm1pXCI6XG4gICAgICByZXR1cm4gPG1pIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbWk+O1xuICAgIGNhc2UgXCJtb1wiOlxuICAgICAgcmV0dXJuIDxtbyB7Li4ucHJvcHN9PntjaGlsZHJlbn08L21vPjtcbiAgICBjYXNlIFwibW5cIjpcbiAgICAgIHJldHVybiA8bW4gey4uLnByb3BzfT57Y2hpbGRyZW59PC9tbj47XG4gICAgY2FzZSBcIm1mcmFjXCI6XG4gICAgICByZXR1cm4gPG1mcmFjIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbWZyYWM+O1xuICAgIGNhc2UgXCJtc3VwXCI6XG4gICAgICByZXR1cm4gPG1zdXAgey4uLnByb3BzfT57Y2hpbGRyZW59PC9tc3VwPjtcbiAgICBjYXNlIFwibXN1YlwiOlxuICAgICAgcmV0dXJuIDxtc3ViIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbXN1Yj47XG4gICAgY2FzZSBcIm1zdWJzdXBcIjpcbiAgICAgIHJldHVybiA8bXN1YnN1cCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L21zdWJzdXA+O1xuICAgIGNhc2UgXCJtc3FydFwiOlxuICAgICAgcmV0dXJuIDxtc3FydCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L21zcXJ0PjtcbiAgICBjYXNlIFwibXJvb3RcIjpcbiAgICAgIHJldHVybiA8bXJvb3Qgey4uLnByb3BzfT57Y2hpbGRyZW59PC9tcm9vdD47XG4gICAgY2FzZSBcIm11bmRlclwiOlxuICAgICAgcmV0dXJuIDxtdW5kZXIgey4uLnByb3BzfT57Y2hpbGRyZW59PC9tdW5kZXI+O1xuICAgIGNhc2UgXCJtb3ZlclwiOlxuICAgICAgcmV0dXJuIDxtb3ZlciB7Li4ucHJvcHN9PntjaGlsZHJlbn08L21vdmVyPjtcbiAgICBjYXNlIFwibXVuZGVyb3ZlclwiOlxuICAgICAgcmV0dXJuIDxtdW5kZXJvdmVyIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbXVuZGVyb3Zlcj47XG4gICAgY2FzZSBcIm10YWJsZVwiOlxuICAgICAgcmV0dXJuIDxtdGFibGUgey4uLnByb3BzfT57Y2hpbGRyZW59PC9tdGFibGU+O1xuICAgIGNhc2UgXCJtdHJcIjpcbiAgICAgIHJldHVybiA8bXRyIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbXRyPjtcbiAgICBjYXNlIFwibXRkXCI6XG4gICAgICByZXR1cm4gPG10ZCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L210ZD47XG4gICAgY2FzZSBcIm10ZXh0XCI6XG4gICAgICByZXR1cm4gPG10ZXh0IHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbXRleHQ+O1xuICAgIGNhc2UgXCJtc3BhY2VcIjpcbiAgICAgIHJldHVybiA8bXNwYWNlIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbXNwYWNlPjtcbiAgICBjYXNlIFwiYW5ub3RhdGlvblwiOlxuICAgICAgcmV0dXJuIDxhbm5vdGF0aW9uIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvYW5ub3RhdGlvbj47XG4gICAgY2FzZSBcInN2Z1wiOlxuICAgICAgcmV0dXJuIDxzdmcgey4uLnByb3BzfT57Y2hpbGRyZW59PC9zdmc+O1xuICAgIGNhc2UgXCJwYXRoXCI6XG4gICAgICByZXR1cm4gPHBhdGggey4uLnByb3BzfSAvPjtcbiAgICBjYXNlIFwibGluZVwiOlxuICAgICAgcmV0dXJuIDxsaW5lIHsuLi5wcm9wc30gLz47XG4gICAgY2FzZSBcInJlY3RcIjpcbiAgICAgIHJldHVybiA8cmVjdCB7Li4ucHJvcHN9IC8+O1xuICAgIGNhc2UgXCJjaXJjbGVcIjpcbiAgICAgIHJldHVybiA8Y2lyY2xlIHsuLi5wcm9wc30gLz47XG4gICAgY2FzZSBcImdcIjpcbiAgICAgIHJldHVybiA8ZyB7Li4ucHJvcHN9PntjaGlsZHJlbn08L2c+O1xuICAgIGNhc2UgXCJkZWZzXCI6XG4gICAgICByZXR1cm4gPGRlZnMgey4uLnByb3BzfT57Y2hpbGRyZW59PC9kZWZzPjtcbiAgICBjYXNlIFwiY2xpcFBhdGhcIjpcbiAgICAgIHJldHVybiA8Y2xpcFBhdGggey4uLnByb3BzfT57Y2hpbGRyZW59PC9jbGlwUGF0aD47XG4gICAgY2FzZSBcInVzZVwiOlxuICAgICAgcmV0dXJuIDx1c2Ugey4uLnByb3BzfSAvPjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIDxkaXYgey4uLnByb3BzfT57Y2hpbGRyZW59PC9kaXY+O1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbmRlck5vZGUoXG4gIG5vZGU6IFJvb3RDb250ZW50LFxuICBjb21wb25lbnRzOiBDb21wb25lbnRNYXBcbik6IEpTWC5FbGVtZW50IHwgc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChub2RlLnR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgcmV0dXJuIChub2RlIGFzIFRleHQpLnZhbHVlO1xuICB9XG5cbiAgaWYgKG5vZGUudHlwZSA9PT0gXCJlbGVtZW50XCIpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gbm9kZSBhcyBFbGVtZW50O1xuICAgIGNvbnN0IHRhZ05hbWUgPSBlbGVtZW50LnRhZ05hbWU7XG4gICAgY29uc3QgcmF3UHJvcHMgPSBjb252ZXJ0UHJvcGVydGllcyhlbGVtZW50LnByb3BlcnRpZXMpO1xuICAgIGNvbnN0IEN1c3RvbUNvbXBvbmVudCA9IGNvbXBvbmVudHNbdGFnTmFtZV07XG5cbiAgICBjb25zdCBjaGlsZEVsZW1lbnRzID1cbiAgICAgIGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMFxuICAgICAgICA/IGVsZW1lbnQuY2hpbGRyZW4ubWFwKChjaGlsZCkgPT4gcmVuZGVyTm9kZShjaGlsZCwgY29tcG9uZW50cykpXG4gICAgICAgIDogbnVsbDtcblxuICAgIGlmIChDdXN0b21Db21wb25lbnQpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBjdXN0b20gYmxvY2sgY29tcG9uZW50IChoYXMgcGF5bG9hZCBhbmQgcmF3IHByb3BzKVxuICAgICAgaWYgKHR5cGVvZiByYXdQcm9wcy5wYXlsb2FkID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiByYXdQcm9wcy5yYXcgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgLy8gRGVzZXJpYWxpemUgcGF5bG9hZCBmcm9tIEpTT04gc3RyaW5nXG4gICAgICAgIGNvbnN0IGN1c3RvbUJsb2NrUHJvcHM6IEN1c3RvbUJsb2NrUHJvcHMgPSB7XG4gICAgICAgICAgcGF5bG9hZDogSlNPTi5wYXJzZShyYXdQcm9wcy5wYXlsb2FkIGFzIHN0cmluZyksXG4gICAgICAgICAgcmF3OiByYXdQcm9wcy5yYXcgYXMgc3RyaW5nLFxuICAgICAgICB9O1xuICAgICAgICAvLyBBZGQgZGF0YSBpZiBwcmVzZW50IChmb3IgY29tcG9uZW50TmFtZXwgc3ludGF4KVxuICAgICAgICBpZiAodHlwZW9mIHJhd1Byb3BzLmRhdGEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBjdXN0b21CbG9ja1Byb3BzLmRhdGEgPSBKU09OLnBhcnNlKHJhd1Byb3BzLmRhdGEgYXMgc3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBDb21wID0gQ3VzdG9tQ29tcG9uZW50IGFzIENvbXBvbmVudDxDdXN0b21CbG9ja1Byb3BzPjtcbiAgICAgICAgcmV0dXJuIDxDb21wIHsuLi5jdXN0b21CbG9ja1Byb3BzfT57Y2hpbGRFbGVtZW50c308L0NvbXA+O1xuICAgICAgfVxuICAgICAgY29uc3QgQ29tcCA9IEN1c3RvbUNvbXBvbmVudCBhcyBDb21wb25lbnQ8U3RhbmRhcmRDb21wb25lbnRQcm9wcz47XG4gICAgICByZXR1cm4gPENvbXAgey4uLnJhd1Byb3BzfT57Y2hpbGRFbGVtZW50c308L0NvbXA+O1xuICAgIH1cblxuICAgIHJldHVybiByZW5kZXJFbGVtZW50KHRhZ05hbWUsIHJhd1Byb3BzLCBjaGlsZEVsZW1lbnRzIGFzIEpTWC5FbGVtZW50KTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzdFRvU29saWRKc3goXG4gIGhhc3RUcmVlOiBSb290LFxuICBjb21wb25lbnRzOiBDb21wb25lbnRNYXAgPSB7fVxuKTogSlNYLkVsZW1lbnQge1xuICBjb25zdCBlbGVtZW50cyA9IGhhc3RUcmVlLmNoaWxkcmVuLm1hcCgobm9kZSkgPT4gcmVuZGVyTm9kZShub2RlLCBjb21wb25lbnRzKSk7XG4gIHJldHVybiA8PntlbGVtZW50c308Lz47XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNvbXBvbmVudCBmdW5jdGlvbiB0aGF0IHJlbmRlcnMgdGhlIEhBU1QgdHJlZSB3aGVuIGNhbGxlZC5cbiAqIFRoaXMgZGVmZXJzIEpTWCBlbGVtZW50IGNyZWF0aW9uIHVudGlsIHJlbmRlciB0aW1lLCB3aGljaCBpcyBpbXBvcnRhbnRcbiAqIGZvciBTU1IgaHlkcmF0aW9uIHRvIHdvcmsgY29ycmVjdGx5LlxuICpcbiAqIFdlIHNlcmlhbGl6ZSB0aGUgSEFTVCB0cmVlIGFuZCBjb21wb25lbnRzIGluZm8gc28gdGhhdCB0aGUgZXhhY3Qgc2FtZVxuICogcmVuZGVyaW5nIGxvZ2ljIHJ1bnMgb24gYm90aCBzZXJ2ZXIgYW5kIGNsaWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc3RUb1NvbGlkQ29tcG9uZW50KFxuICBoYXN0VHJlZTogUm9vdCxcbiAgY29tcG9uZW50czogQ29tcG9uZW50TWFwID0ge31cbik6ICgpID0+IEpTWC5FbGVtZW50IHtcbiAgLy8gU3RvcmUgdGhlIHRyZWUgZGF0YSwgbm90IHByZS1yZW5kZXJlZCBlbGVtZW50c1xuICBjb25zdCB0cmVlRGF0YSA9IGhhc3RUcmVlO1xuICBjb25zdCBjb21wb25lbnRNYXAgPSBjb21wb25lbnRzO1xuXG4gIHJldHVybiBmdW5jdGlvbiBIYXN0Qm9keSgpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IHRyZWVEYXRhLmNoaWxkcmVuLm1hcCgobm9kZSkgPT4gcmVuZGVyTm9kZShub2RlLCBjb21wb25lbnRNYXApKTtcbiAgICByZXR1cm4gPD57ZWxlbWVudHN9PC8+O1xuICB9O1xufVxuIiwgImltcG9ydCB0eXBlIHsgUm9vdCwgQ29kZSwgUGFyZW50LCBSb290Q29udGVudCB9IGZyb20gXCJtZGFzdFwiO1xuaW1wb3J0IHR5cGUgeyBQcm9jZXNzb3IgfSBmcm9tIFwidW5pZmllZFwiO1xuaW1wb3J0IHsgdmlzaXQgfSBmcm9tIFwidW5pc3QtdXRpbC12aXNpdFwiO1xuaW1wb3J0IHsgcGFyc2UgYXMgcGFyc2VZYW1sIH0gZnJvbSBcInlhbWxcIjtcblxuLyoqXG4gKiBDb21wb25lbnQgdGhhdCByZWNlaXZlcyBjdXN0b20gYmxvY2sgcHJvcHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21CbG9ja0NvbXBvbmVudFByb3BzIHtcbiAgLyoqIFRoZSBwYXRoIHNlZ21lbnRzIGFmdGVyIHRoZSBjb21wb25lbnQgbmFtZSwgZS5nLiBbJ3N1YnN0cnVjdHVyZScsICdzdWJzdWInXSAqL1xuICBwYXlsb2FkOiBzdHJpbmdbXTtcbiAgLyoqIFRoZSByYXcgY29udGVudCBvZiB0aGUgY29kZSBibG9jayBhcyBwbGFpbiB0ZXh0ICovXG4gIHJhdzogc3RyaW5nO1xuICAvKiogUGFyc2VkIFlBTUwgZGF0YSB3aGVuIHVzaW5nIGNvbXBvbmVudE5hbWV8IHN5bnRheCAqL1xuICBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBUaGUgbWFya2Rvd24tcmVuZGVyZWQgY29udGVudCBhcyBjaGlsZHJlbiAqL1xuICBjaGlsZHJlbj86IHVua25vd247XG59XG5cbi8qKlxuICogU2V0IG9mIGNvbXBvbmVudCBuYW1lcyB0aGF0IGFyZSBhdmFpbGFibGVcbiAqL1xuZXhwb3J0IHR5cGUgQ3VzdG9tQmxvY2tDb21wb25lbnRzID0gU2V0PHN0cmluZz47XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVtYXJrQ3VzdG9tQmxvY2tzT3B0aW9ucyB7XG4gIC8qKiBTZXQgb2YgY29tcG9uZW50IG5hbWVzIHRoYXQgYXJlIGF2YWlsYWJsZSAqL1xuICBjb21wb25lbnRzOiBDdXN0b21CbG9ja0NvbXBvbmVudHM7XG4gIC8qKiBUaGUgcHJvY2Vzc29yIHRvIHVzZSBmb3IgcGFyc2luZyBuZXN0ZWQgbWFya2Rvd24gKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJvY2Vzc29yOiBQcm9jZXNzb3I8YW55LCBhbnksIGFueSwgYW55LCBhbnk+O1xufVxuXG5cbi8qKlxuICogQSByZW1hcmsgcGx1Z2luIHRoYXQgdHJhbnNmb3JtcyBjb2RlIGJsb2NrcyB3aXRoIGBuYW1lL3BhdGgvc2VnbWVudHNgIHN5bnRheFxuICogaW50byBjdXN0b20gYmxvY2sgbm9kZXMgdGhhdCByZW5kZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudC5cbiAqXG4gKiBDb2RlIGJsb2NrcyBsaWtlOlxuICogYGBgY29tcG9uZW50TmFtZS9zdWIvcGF0aFxuICogY29udGVudCBoZXJlXG4gKiBgYGBcbiAqXG4gKiBXaWxsIGJlIHRyYW5zZm9ybWVkIHRvIHVzZSB0aGUgY29tcG9uZW50IGlmIGl0IGV4aXN0cyBpbiB0aGUgY29tcG9uZW50cyBzZXQsXG4gKiBvdGhlcndpc2UgdGhleSByZW1haW4gYXMgcmVndWxhciBjb2RlIGJsb2Nrcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbWFya0N1c3RvbUJsb2NrcyhvcHRpb25zOiBSZW1hcmtDdXN0b21CbG9ja3NPcHRpb25zKSB7XG4gIGNvbnN0IHsgY29tcG9uZW50cywgcHJvY2Vzc29yIH0gPSBvcHRpb25zO1xuXG4gIHJldHVybiAodHJlZTogUm9vdCkgPT4ge1xuICAgIHZpc2l0KHRyZWUsIFwiY29kZVwiLCAobm9kZTogQ29kZSwgaW5kZXgsIHBhcmVudDogUGFyZW50IHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAoIXBhcmVudCB8fCBpbmRleCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGxhbmcgPSBub2RlLmxhbmc7XG4gICAgICBpZiAoIWxhbmcpIHJldHVybjtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGRhdGEgYmxvY2sgKGxhbmcgZW5kcyB3aXRoIHwpXG4gICAgICBjb25zdCBpc0RhdGFCbG9jayA9IGxhbmcuZW5kc1dpdGgoXCJ8XCIpO1xuICAgICAgY29uc3QgY2xlYW5MYW5nID0gaXNEYXRhQmxvY2sgPyBsYW5nLnNsaWNlKDAsIC0xKSA6IGxhbmc7XG5cbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gY2xlYW5MYW5nLnNwbGl0KFwiL1wiKTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBzZWdtZW50c1swXTtcbiAgICAgIGNvbnN0IHJhdyA9IG5vZGUudmFsdWU7XG5cbiAgICAgIC8vIElmIHRoZSBjb21wb25lbnQgZG9lc24ndCBleGlzdCwgbGVhdmUgaXQgYXMgYSByZWd1bGFyIGNvZGUgYmxvY2tcbiAgICAgIGlmICghY29tcG9uZW50cy5oYXMoY29tcG9uZW50TmFtZSkpIHJldHVybjtcblxuICAgICAgY29uc3QgcGF5bG9hZCA9IHNlZ21lbnRzLnNsaWNlKDEpO1xuXG4gICAgICAvLyBGb3IgZGF0YSBibG9ja3MsIHBhcnNlIFlBTUwgaW5zdGVhZCBvZiBtYXJrZG93blxuICAgICAgaWYgKGlzRGF0YUJsb2NrKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBwYXJzZVlhbWwocmF3KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgICAgICBjb25zdCBjdXN0b21Ob2RlID0ge1xuICAgICAgICAgIHR5cGU6IFwiY3VzdG9tQmxvY2tcIixcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBoTmFtZTogY29tcG9uZW50TmFtZSxcbiAgICAgICAgICAgIGhQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgIHBheWxvYWQ6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLFxuICAgICAgICAgICAgICByYXcsXG4gICAgICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgfTtcblxuICAgICAgICBwYXJlbnQuY2hpbGRyZW5baW5kZXhdID0gY3VzdG9tTm9kZSBhcyB1bmtub3duIGFzIFJvb3RDb250ZW50O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFBhcnNlIHRoZSBjb250ZW50IGFzIG1hcmtkb3duIHRvIGdldCBpdHMgQVNUXG4gICAgICBjb25zdCBjb250ZW50TWRhc3QgPSBwcm9jZXNzb3IucGFyc2UocmF3KSBhcyBSb290O1xuXG4gICAgICAvLyBDcmVhdGUgYSBjdXN0b20gZWxlbWVudCB0aGF0IHdpbGwgYmUgY29udmVydGVkIHRvIGhhc3RcbiAgICAgIC8vIFdlIHVzZSBhIGN1c3RvbSBub2RlIHR5cGUgdGhhdCByZW1hcmstcmVoeXBlIHdpbGwgaGFuZGxlXG4gICAgICBjb25zdCBjdXN0b21Ob2RlID0ge1xuICAgICAgICB0eXBlOiBcImN1c3RvbUJsb2NrXCIsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBoTmFtZTogY29tcG9uZW50TmFtZSxcbiAgICAgICAgICBoUHJvcGVydGllczoge1xuICAgICAgICAgICAgcGF5bG9hZDogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksXG4gICAgICAgICAgICByYXcsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgY2hpbGRyZW46IGNvbnRlbnRNZGFzdC5jaGlsZHJlbixcbiAgICAgIH07XG5cbiAgICAgIC8vIFJlcGxhY2UgdGhlIGNvZGUgbm9kZSB3aXRoIG91ciBjdXN0b20gYmxvY2tcbiAgICAgIHBhcmVudC5jaGlsZHJlbltpbmRleF0gPSBjdXN0b21Ob2RlIGFzIHVua25vd24gYXMgUm9vdENvbnRlbnQ7XG4gICAgfSk7XG4gIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQ0EsU0FBUyxlQUErQjtBQUN4QyxPQUFPLGlCQUFpQjtBQUN4QixPQUFPLGVBQWU7QUFDdEIsT0FBTyxnQkFBZ0I7QUFDdkIsT0FBTyxrQkFBa0I7QUFDekIsT0FBTyxpQkFBaUI7QUFDeEIsU0FBUyxTQUFTQSxrQkFBaUI7OztBQ3NCbkMsU0FBUyxrQkFDUCxZQUN5QjtBQUN6QixNQUFJLENBQUMsV0FBWSxRQUFPLENBQUM7QUFFekIsUUFBTSxTQUFrQyxDQUFDO0FBRXpDLGFBQVcsQ0FBQyxLQUFLLEtBQUssS0FBSyxPQUFPLFFBQVEsVUFBVSxHQUFHO0FBQ3JELFFBQUksUUFBUSxhQUFhO0FBQ3ZCLGFBQU8sUUFBUTtBQUFBLElBQ2pCLFdBQVcsUUFBUSxTQUFTO0FBQzFCLGFBQU8sUUFBUSxNQUFNLFFBQVEsS0FBSyxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUk7QUFBQSxJQUMxRCxPQUFPO0FBQ0wsYUFBTyxHQUFHLElBQUk7QUFBQSxJQUNoQjtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7QUFFQSxTQUFTLGNBQ1AsU0FDQSxPQUNBLFVBQ2E7QUFDYixVQUFRLFNBQVM7QUFBQSxJQUNmLEtBQUs7QUFDSCxhQUFPLENBQUMsTUFBTSxRQUFRLFNBQVMsRUFBdkI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsT0FBTyxRQUFRLFNBQVMsRUFBeEI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsT0FBTyxRQUFRLFNBQVMsRUFBeEI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsT0FBTyxRQUFRLFNBQVMsRUFBeEI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsT0FBTyxRQUFRLFNBQVMsRUFBeEI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsT0FBTyxRQUFRLFNBQVMsRUFBeEI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsT0FBTyxRQUFRLFNBQVMsRUFBeEI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsUUFBUSxRQUFRLFNBQVMsRUFBekI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsU0FBUyxRQUFRLFNBQVMsRUFBMUI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsTUFBTSxRQUFRLFNBQVMsRUFBdkI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsV0FBVyxRQUFRLFNBQVMsRUFBNUI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsTUFBTSxRQUFRLFNBQVMsRUFBdkI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsT0FBTyxRQUFRLFNBQVMsRUFBeEI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsTUFBTSxRQUFRLFNBQVMsRUFBdkI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsU0FBUyxRQUFRLFNBQVMsRUFBMUI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsUUFBUSxRQUFRLFNBQVMsRUFBekI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsZUFBZSxRQUFRLFNBQVMsRUFBaEM7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsT0FBTyxRQUFRLFNBQVMsRUFBeEI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsT0FBTyxRQUFRLFNBQVMsRUFBeEI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsT0FBTyxRQUFRLFNBQVMsRUFBeEI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsT0FBTyxPQUFPO0FBQUEsSUFDeEIsS0FBSztBQUNILGFBQU8sQ0FBQyxPQUFPLE9BQU87QUFBQSxJQUN4QixLQUFLO0FBQ0gsYUFBTyxDQUFDLFFBQVEsT0FBTztBQUFBLElBQ3pCLEtBQUs7QUFDSCxhQUFPLENBQUMsVUFBVSxRQUFRLFNBQVMsRUFBM0I7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsVUFBVSxRQUFRLFNBQVMsRUFBM0I7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsVUFBVSxRQUFRLFNBQVMsRUFBM0I7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsT0FBTyxRQUFRLFNBQVMsRUFBeEI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsT0FBTyxRQUFRLFNBQVMsRUFBeEI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsT0FBTyxRQUFRLFNBQVMsRUFBeEI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsUUFBUSxRQUFRLFNBQVMsRUFBekI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsUUFBUSxRQUFRLFNBQVMsRUFBekI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsUUFBUSxRQUFRLFNBQVMsRUFBekI7QUFBQTtBQUFBLElBRVYsS0FBSztBQUNILGFBQU8sQ0FBQyxVQUFVLE9BQU87QUFBQSxJQUMzQixLQUFLO0FBQ0gsYUFBTyxDQUFDLFlBQVksUUFBUSxTQUFTLEVBQTdCO0FBQUE7QUFBQSxJQUVWLEtBQUs7QUFDSCxhQUFPLENBQUMsU0FBUyxRQUFRLFNBQVMsRUFBMUI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsY0FBYyxRQUFRLFNBQVMsRUFBL0I7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsU0FBUyxRQUFRLFNBQVMsRUFBMUI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsT0FBTyxRQUFRLFNBQVMsRUFBeEI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsT0FBTyxRQUFRLFNBQVMsRUFBeEI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsT0FBTyxRQUFRLFNBQVMsRUFBeEI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsVUFBVSxRQUFRLFNBQVMsRUFBM0I7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsU0FBUyxRQUFRLFNBQVMsRUFBMUI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsU0FBUyxRQUFRLFNBQVMsRUFBMUI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsWUFBWSxRQUFRLFNBQVMsRUFBN0I7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsVUFBVSxRQUFRLFNB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eEIsVUFBTSxFQUFFLE9BQU8sTUFBTSxTQUFTLElBQUk7QUFBQSxNQUNoQyxNQUFNLEtBQUs7QUFBQSxNQUNYO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFFQSxVQUFNLFFBQVEsVUFBVSxNQUFNLFFBQVE7QUFDdEMsVUFBTSxXQUFXLFVBQVUsUUFBUSxLQUFLO0FBQ3hDLFVBQU0sT0FBTyxxQkFBcUIsVUFBVSxVQUFVO0FBRXRELFVBQU0sU0FBUyxJQUFJO0FBQUEsTUFDakIsSUFBSTtBQUFBLE1BQ0o7QUFBQSxNQUNBO0FBQUEsTUFDQSxNQUFNO0FBQUEsTUFDTixNQUFNO0FBQUEsTUFDTixTQUFTO0FBQUEsSUFDWDtBQUVBLFdBQU87QUFBQSxNQUNMLE9BQU87QUFBQSxNQUNQO0FBQUEsTUFDQSxPQUFPO0FBQUEsTUFDUDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsV0FBUyxJQUFJLEdBQUcsSUFBSSxRQUFRLFFBQVEsS0FBSztBQUN2QyxVQUFNLFVBQVUsUUFBUSxDQUFDO0FBQ3pCLFVBQU0sWUFBWSxRQUFRLElBQUksQ0FBQztBQUMvQixVQUFNLFlBQVksUUFBUSxJQUFJLENBQUM7QUFFL0IsVUFBTSxhQUFhLFFBQVEsUUFBUSxNQUFNLFFBQVEsRUFBRSxHQUFHO0FBQ3RELFVBQU0sV0FBVyxZQUFZLFVBQVUsUUFBUSxNQUFNO0FBRXJELFVBQU0sYUFBYSxNQUFNLE1BQU0sWUFBWSxRQUFRLEVBQUUsS0FBSztBQUMxRCxVQUFNLEVBQUUsT0FBTyxNQUFNLFNBQVMsSUFBSTtBQUFBLE1BQ2hDO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBRUEsVUFBTSxRQUFRLFVBQVUsTUFBTSxRQUFRO0FBQ3RDLFVBQU0sV0FBVyxVQUFVLFFBQVEsS0FBSztBQUN4QyxVQUFNLE9BQU8scUJBQXFCLFVBQVUsVUFBVTtBQUV0RCxVQUFNLFFBQVEsRUFBRSxJQUFJO0FBQUEsTUFDbEIsSUFBSSxRQUFRO0FBQUEsTUFDWjtBQUFBLE1BQ0E7QUFBQSxNQUNBLE1BQU0sWUFBWSxVQUFVLEtBQUs7QUFBQSxNQUNqQyxNQUFNLFlBQVksVUFBVSxLQUFLO0FBQUEsTUFDakMsU0FBUyxJQUFJO0FBQUEsSUFDZjtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQUEsSUFDTCxPQUFPLFFBQVEsU0FBUyxJQUFJLFFBQVEsQ0FBQyxFQUFFLEtBQUs7QUFBQSxJQUM1QztBQUFBLElBQ0EsT0FBTyxRQUFRO0FBQUEsSUFDZjtBQUFBLEVBQ0Y7QUFDRjsiLAogICJuYW1lcyI6IFsicGFyc2VZYW1sIiwgIkNvbXAiLCAiY3VzdG9tTm9kZSIsICJwYXJzZVlhbWwiLCAiY29udGVudCJdCn0K
|
package/package.json
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "solid-mds",
|
|
3
|
+
"version": "0.3.2",
|
|
4
|
+
"description": "A SolidJS library for parsing and rendering MDS (Markdown Steps) format",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Matthias Reis",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"solid",
|
|
9
|
+
"solidjs",
|
|
10
|
+
"markdown",
|
|
11
|
+
"parser",
|
|
12
|
+
"slides",
|
|
13
|
+
"presentation",
|
|
14
|
+
"remark",
|
|
15
|
+
"rehype"
|
|
16
|
+
],
|
|
17
|
+
"type": "module",
|
|
18
|
+
"main": "./dist/index.jsx",
|
|
19
|
+
"module": "./dist/index.jsx",
|
|
20
|
+
"types": "./dist/index.d.ts",
|
|
21
|
+
"exports": {
|
|
22
|
+
".": {
|
|
23
|
+
"types": "./dist/index.d.ts",
|
|
24
|
+
"default": "./dist/index.jsx"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"dist",
|
|
29
|
+
"README.md",
|
|
30
|
+
"LICENSE"
|
|
31
|
+
],
|
|
32
|
+
"scripts": {
|
|
33
|
+
"build": "tsup",
|
|
34
|
+
"dev": "tsup --watch",
|
|
35
|
+
"test": "vitest run",
|
|
36
|
+
"test:watch": "vitest",
|
|
37
|
+
"prepublishOnly": "pnpm run build",
|
|
38
|
+
"release": "bash ../../scripts/release.sh"
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"yaml": "^2.7.0",
|
|
42
|
+
"rehype-katex": "^7.0.0",
|
|
43
|
+
"rehype-stringify": "^10.0.1",
|
|
44
|
+
"remark-gfm": "^4.0.0",
|
|
45
|
+
"remark-math": "^6.0.0",
|
|
46
|
+
"remark-parse": "^11.0.0",
|
|
47
|
+
"remark-rehype": "^11.1.1",
|
|
48
|
+
"unified": "^11.0.5",
|
|
49
|
+
"unist-util-visit": "^5.0.0"
|
|
50
|
+
},
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"@solidjs/testing-library": "^0.8.0",
|
|
53
|
+
"@types/hast": "^3.0.4",
|
|
54
|
+
"@types/mdast": "^4.0.4",
|
|
55
|
+
"jsdom": "^26.0.0",
|
|
56
|
+
"tsup": "^8.3.5",
|
|
57
|
+
"tsup-preset-solid": "^2.2.0",
|
|
58
|
+
"typescript": "^5.7.3",
|
|
59
|
+
"vite-plugin-solid": "^2.10.0",
|
|
60
|
+
"vitest": "^3.0.0"
|
|
61
|
+
},
|
|
62
|
+
"peerDependencies": {
|
|
63
|
+
"solid-js": "^1.9.0"
|
|
64
|
+
},
|
|
65
|
+
"typesVersions": {}
|
|
66
|
+
}
|