writr 3.2.3 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +98 -54
- package/dist/writr-cache.d.ts +22 -0
- package/dist/writr-cache.js +70 -0
- package/dist/writr.d.ts +24 -7
- package/dist/writr.js +129 -14
- package/package.json +28 -20
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
---
|
|
4
4
|
|
|
5
5
|
## Markdown Rendering Simplified
|
|
6
|
-
[](https://github.com/jaredwray/writr/actions/workflows/tests.yml)
|
|
7
7
|
[](https://github.com/jaredwray/writr/blob/master/LICENSE)
|
|
8
8
|
[](https://codecov.io/gh/jaredwray/writr)
|
|
9
9
|
[](https://npmjs.com/package/writr)
|
|
@@ -16,8 +16,9 @@
|
|
|
16
16
|
- [License - MIT](#license)
|
|
17
17
|
|
|
18
18
|
## Features
|
|
19
|
-
*
|
|
20
|
-
*
|
|
19
|
+
* Removes the remark / unified complexity and easy to use.
|
|
20
|
+
* Built in caching 💥 making it render very fast when there isnt a change
|
|
21
|
+
* Frontmatter support built in by default. :tada:
|
|
21
22
|
* Easily Render to `React` or `HTML`.
|
|
22
23
|
* Generates a Table of Contents for your markdown files (remark-toc).
|
|
23
24
|
* Slug generation for your markdown files (rehype-slug).
|
|
@@ -27,6 +28,7 @@
|
|
|
27
28
|
* Github Flavor Markdown (remark-gfm).
|
|
28
29
|
* Emoji Support (remark-emoji).
|
|
29
30
|
* MDX Support (remark-mdx).
|
|
31
|
+
* ESM and Node 20+
|
|
30
32
|
|
|
31
33
|
## Getting Started
|
|
32
34
|
|
|
@@ -41,53 +43,30 @@
|
|
|
41
43
|
```javascript
|
|
42
44
|
import { Writr } from 'writr';
|
|
43
45
|
|
|
44
|
-
const writr = new Writr();
|
|
45
|
-
const markdown = `# Hello World ::-):\n\n This is a test.`;
|
|
46
|
+
const writr = new Writr(`# Hello World ::-):\n\n This is a test.`);
|
|
46
47
|
|
|
47
|
-
const html = await writr.render(
|
|
48
|
+
const html = await writr.render(); // <h1>Hello World 🙂</h1><p>This is a test.</p>
|
|
48
49
|
```
|
|
49
50
|
Its just that simple. Want to add some options? No problem.
|
|
50
51
|
|
|
51
52
|
```javascript
|
|
52
53
|
import { Writr } from 'writr';
|
|
53
|
-
const writr = new Writr();
|
|
54
|
-
const markdown = `# Hello World ::-):\n\n This is a test.`;
|
|
54
|
+
const writr = new Writr(`# Hello World ::-):\n\n This is a test.`);
|
|
55
55
|
const options = {
|
|
56
56
|
emoji: false
|
|
57
57
|
}
|
|
58
|
-
const html = await writr.render(
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
Want to render to a translation? No problem.
|
|
62
|
-
|
|
63
|
-
```javascript
|
|
64
|
-
import { Writr } from 'writr';
|
|
65
|
-
const writr = new Writr({ openai: 'your-api-key'});
|
|
66
|
-
const markdown = `# Hello World ::-):\n\n This is a test.`;
|
|
67
|
-
const langCode = 'es';
|
|
68
|
-
const html = await writr.renderTranslation(markdown, langCode, options); // <h1>Hola Mundo 🙂</h1><p>Esta es una prueba.</p>
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
How about generating keywords and descriptions for your front matter?
|
|
72
|
-
|
|
73
|
-
```javascript
|
|
74
|
-
import { Writr } from 'writr';
|
|
75
|
-
const writr = new Writr({ openai: 'your-api-key'});
|
|
76
|
-
const markdown = `# Hello World ::-):\n\n This is a test.`;
|
|
77
|
-
const keywords = await writr.keywords(markdown); // ['Hello World', 'Test']
|
|
78
|
-
const description = await writr.description(markdown); // 'Hello World Test'
|
|
58
|
+
const html = await writr.render(options); // <h1>Hello World ::-):</h1><p>This is a test.</p>
|
|
79
59
|
```
|
|
80
60
|
|
|
81
61
|
## API
|
|
82
62
|
|
|
83
|
-
### `new Writr(options?: WritrOptions)`
|
|
63
|
+
### `new Writr(arg?: string | WritrOptions, options?: WritrOptions)`
|
|
84
64
|
|
|
85
|
-
You can access the `WritrOptions` from the instance of Writr. Here is an example of WritrOptions.
|
|
65
|
+
By default the constructor takes in a markdown `string` or `WritrOptions` in the first parameter. You can also send in nothing and set the markdown via `.content` property. If you want to pass in your markdown and options you can easily do this with `new Writr('## Your Markdown Here', { ...options here})`. You can access the `WritrOptions` from the instance of Writr. Here is an example of WritrOptions.
|
|
86
66
|
|
|
87
67
|
```javascript
|
|
88
68
|
import { Writr, WritrOptions } from 'writr';
|
|
89
69
|
const writrOptions = {
|
|
90
|
-
openai: 'your-api-key', // openai api key (default: undefined)
|
|
91
70
|
renderOptions: {
|
|
92
71
|
emoji: true,
|
|
93
72
|
toc: true,
|
|
@@ -95,22 +74,59 @@ const writrOptions = {
|
|
|
95
74
|
highlight: true,
|
|
96
75
|
gfm: true,
|
|
97
76
|
math: true,
|
|
98
|
-
mdx: true
|
|
77
|
+
mdx: true,
|
|
78
|
+
caching: true,
|
|
99
79
|
}
|
|
100
80
|
};
|
|
101
81
|
const writr = new Writr(writrOptions);
|
|
102
82
|
```
|
|
103
83
|
|
|
104
|
-
### `.
|
|
84
|
+
### `.content`
|
|
85
|
+
|
|
86
|
+
Setting the markdown content for the instance of Writr. This can be set via the constructor or directly on the instance and can even handle `frontmatter`.
|
|
105
87
|
|
|
106
|
-
|
|
88
|
+
```javascript
|
|
107
89
|
|
|
90
|
+
import { Writr } from 'writr';
|
|
91
|
+
const writr = new Writr();
|
|
92
|
+
writr.content = `---
|
|
93
|
+
title: Hello World
|
|
94
|
+
---
|
|
95
|
+
# Hello World ::-):\n\n This is a test.`;
|
|
96
|
+
```
|
|
108
97
|
|
|
109
98
|
### `.options`
|
|
110
99
|
|
|
111
100
|
Accessing the default options for this instance of Writr.
|
|
112
101
|
|
|
113
|
-
### `.
|
|
102
|
+
### `.cache`
|
|
103
|
+
|
|
104
|
+
Accessing the cache for this instance of Writr. By default this is an in memory cache and is enabled by default. You can disable this by setting `caching: false` in the `RenderOptions` of the `WritrOptions` or when calling render passing the `RenderOptions` like here:
|
|
105
|
+
|
|
106
|
+
```javascript
|
|
107
|
+
import { Writr } from 'writr';
|
|
108
|
+
const writr = new Writr(`# Hello World ::-):\n\n This is a test.`);
|
|
109
|
+
const options = {
|
|
110
|
+
caching: false
|
|
111
|
+
}
|
|
112
|
+
const html = await writr.render(options); // <h1>Hello World ::-):</h1><p>This is a test.</p>
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
If you would like to use a specific storage adapter from https://keyv.org you can pass in the adapter like so:
|
|
116
|
+
|
|
117
|
+
```javascript
|
|
118
|
+
import { Writr } from 'writr';
|
|
119
|
+
import Keyv from '@keyv/redis';
|
|
120
|
+
const keyvRedis = new Keyv('redis://user:pass@localhost:6379');
|
|
121
|
+
const writr = new Writr(`# Hello World ::-):\n\n This is a test.`);
|
|
122
|
+
writr.cache.setStorageAdapter(keyvRedis);
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### `.engine`
|
|
126
|
+
|
|
127
|
+
Accessing the underlying engine for this instance of Writr. This is a `Processor<Root, Root, Root, undefined, undefined>` fro the unified `.use()` function. You can use this to add additional plugins to the engine.
|
|
128
|
+
|
|
129
|
+
### `.render(options?: RenderOptions): Promise<string>`
|
|
114
130
|
|
|
115
131
|
Rendering markdown to HTML. the options are based on RenderOptions. Which you can access from the Writr instance.
|
|
116
132
|
|
|
@@ -120,48 +136,76 @@ import { Writr, RenderOptions } from 'writr';
|
|
|
120
136
|
## `RenderOptions`
|
|
121
137
|
|
|
122
138
|
```js
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
139
|
+
type RenderOptions = {
|
|
140
|
+
emoji?: boolean; // Emoji support (default: true)
|
|
141
|
+
toc?: boolean; // Table of contents generation (default: true)
|
|
142
|
+
slug?: boolean; // Slug generation (default: true)
|
|
143
|
+
highlight?: boolean; // Code highlighting (default: true)
|
|
144
|
+
gfm?: boolean; // Github flavor markdown (default: true)
|
|
145
|
+
math?: boolean; // Math support (default: true)
|
|
146
|
+
mdx?: boolean; // MDX support (default: true)
|
|
147
|
+
caching?: boolean; // Caching (default: true)
|
|
148
|
+
};
|
|
130
149
|
```
|
|
131
150
|
|
|
132
|
-
### `.renderSync(
|
|
151
|
+
### `.renderSync(options?: RenderOptions): string`
|
|
133
152
|
|
|
134
153
|
Rendering markdown to HTML synchronously. the options are based on RenderOptions. Which you can access from the Writr instance. The parameters are the same as the `.render()` function.
|
|
135
154
|
|
|
136
155
|
```javascript
|
|
137
156
|
import { Writr } from 'writr';
|
|
138
|
-
const writr = new Writr();
|
|
139
|
-
const
|
|
140
|
-
const html = writr.renderSync(markdown); // <h1>Hello World 🙂</h1><p>This is a test.</p>
|
|
157
|
+
const writr = new Writr(`# Hello World ::-):\n\n This is a test.`);
|
|
158
|
+
const html = writr.renderSync(); // <h1>Hello World 🙂</h1><p>This is a test.</p>
|
|
141
159
|
```
|
|
142
160
|
|
|
143
|
-
### '.renderReact(
|
|
161
|
+
### '.renderReact(options?: RenderOptions, reactOptions?: HTMLReactParserOptions): Promise<React.JSX.Element />'
|
|
144
162
|
|
|
145
163
|
Rendering markdown to React. The options are based on RenderOptions and now HTMLReactParserOptions from `html-react-parser`.
|
|
146
164
|
|
|
147
165
|
```javascript
|
|
148
166
|
import { Writr } from 'writr';
|
|
149
|
-
const writr = new Writr();
|
|
150
|
-
const
|
|
151
|
-
const reactElement = await writr.renderReact(markdown); // Will return a React.JSX.Element
|
|
167
|
+
const writr = new Writr(`# Hello World ::-):\n\n This is a test.`);
|
|
168
|
+
const reactElement = await writr.renderReact(); // Will return a React.JSX.Element
|
|
152
169
|
```
|
|
153
170
|
|
|
154
|
-
### '.renderReactSync(
|
|
171
|
+
### '.renderReactSync( options?: RenderOptions, reactOptions?: HTMLReactParserOptions): React.JSX.Element'
|
|
155
172
|
|
|
156
173
|
Rendering markdown to React. The options are based on RenderOptions and now HTMLReactParserOptions from `html-react-parser`.
|
|
157
174
|
|
|
175
|
+
```javascript
|
|
176
|
+
import { Writr } from 'writr';
|
|
177
|
+
const writr = new Writr(`# Hello World ::-):\n\n This is a test.`);
|
|
178
|
+
const reactElement = writr.renderReactSync(); // Will return a React.JSX.Element
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### `.loadFromFile(filePath: string): Promise<void>`
|
|
182
|
+
|
|
183
|
+
Load your markdown content from a file path.
|
|
184
|
+
|
|
158
185
|
```javascript
|
|
159
186
|
import { Writr } from 'writr';
|
|
160
187
|
const writr = new Writr();
|
|
161
|
-
|
|
162
|
-
const reactElement = writr.renderReactSync(markdown); // Will return a React.JSX.Element
|
|
188
|
+
await writr.loadFromFile('path/to/file.md');
|
|
163
189
|
```
|
|
164
190
|
|
|
191
|
+
### `.loadFromFileSync(filePath: string): void`
|
|
192
|
+
|
|
193
|
+
Load your markdown content from a file path synchronously.
|
|
194
|
+
|
|
195
|
+
### `.saveToFile(filePath: string): Promise<void>`
|
|
196
|
+
|
|
197
|
+
Save your markdown and frontmatter (if included) content to a file path.
|
|
198
|
+
|
|
199
|
+
```javascript
|
|
200
|
+
import { Writr } from 'writr';
|
|
201
|
+
const writr = new Writr(`# Hello World ::-):\n\n This is a test.`);
|
|
202
|
+
await writr.saveToFile('path/to/file.md');
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### `.saveToFileSync(filePath: string): void`
|
|
206
|
+
|
|
207
|
+
Save your markdown and frontmatter (if included) content to a file path synchronously.
|
|
208
|
+
|
|
165
209
|
## Code of Conduct and Contributing
|
|
166
210
|
[Code of Conduct](CODE_OF_CONDUCT.md) and [Contributing](CONTRIBUTING.md) guidelines.
|
|
167
211
|
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Keyv, type KeyvStoreAdapter } from 'keyv';
|
|
2
|
+
import { type RenderOptions } from './writr.js';
|
|
3
|
+
export declare class WritrCache {
|
|
4
|
+
private _markdownStore;
|
|
5
|
+
private _markdownStoreSync;
|
|
6
|
+
private _hashStore;
|
|
7
|
+
constructor();
|
|
8
|
+
get markdownStore(): Keyv;
|
|
9
|
+
get markdownStoreSync(): Map<string, string>;
|
|
10
|
+
get hashStore(): Map<string, string>;
|
|
11
|
+
getMarkdown(markdown: string, options?: RenderOptions): Promise<string | undefined>;
|
|
12
|
+
getMarkdownSync(markdown: string, options?: RenderOptions): string | undefined;
|
|
13
|
+
setMarkdown(markdown: string, value: string, options?: RenderOptions): Promise<boolean>;
|
|
14
|
+
setMarkdownSync(markdown: string, value: string, options?: RenderOptions): boolean;
|
|
15
|
+
get(key: string): Promise<string | undefined>;
|
|
16
|
+
getSync(key: string): string | undefined;
|
|
17
|
+
set(key: string, value: string): Promise<boolean>;
|
|
18
|
+
setSync(key: string, value: string): boolean;
|
|
19
|
+
clear(): Promise<void>;
|
|
20
|
+
setStorageAdapter(adapter: KeyvStoreAdapter): void;
|
|
21
|
+
hash(markdown: string, options?: RenderOptions): string;
|
|
22
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { Keyv } from 'keyv';
|
|
3
|
+
export class WritrCache {
|
|
4
|
+
_markdownStore;
|
|
5
|
+
_markdownStoreSync;
|
|
6
|
+
_hashStore;
|
|
7
|
+
constructor() {
|
|
8
|
+
this._markdownStore = new Keyv();
|
|
9
|
+
this._markdownStoreSync = new Map();
|
|
10
|
+
this._hashStore = new Map();
|
|
11
|
+
}
|
|
12
|
+
get markdownStore() {
|
|
13
|
+
return this._markdownStore;
|
|
14
|
+
}
|
|
15
|
+
get markdownStoreSync() {
|
|
16
|
+
return this._markdownStoreSync;
|
|
17
|
+
}
|
|
18
|
+
get hashStore() {
|
|
19
|
+
return this._hashStore;
|
|
20
|
+
}
|
|
21
|
+
async getMarkdown(markdown, options) {
|
|
22
|
+
const key = this.hash(markdown, options);
|
|
23
|
+
return this.get(key);
|
|
24
|
+
}
|
|
25
|
+
getMarkdownSync(markdown, options) {
|
|
26
|
+
const key = this.hash(markdown, options);
|
|
27
|
+
return this.getSync(key);
|
|
28
|
+
}
|
|
29
|
+
async setMarkdown(markdown, value, options) {
|
|
30
|
+
const key = this.hash(markdown, options);
|
|
31
|
+
return this.set(key, value);
|
|
32
|
+
}
|
|
33
|
+
setMarkdownSync(markdown, value, options) {
|
|
34
|
+
const key = this.hash(markdown, options);
|
|
35
|
+
this.setSync(key, value);
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
async get(key) {
|
|
39
|
+
return this._markdownStore.get(key);
|
|
40
|
+
}
|
|
41
|
+
getSync(key) {
|
|
42
|
+
return this._markdownStoreSync.get(key);
|
|
43
|
+
}
|
|
44
|
+
async set(key, value) {
|
|
45
|
+
return this._markdownStore.set(key, value);
|
|
46
|
+
}
|
|
47
|
+
setSync(key, value) {
|
|
48
|
+
this._markdownStoreSync.set(key, value);
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
async clear() {
|
|
52
|
+
await this._markdownStore.clear();
|
|
53
|
+
this._markdownStoreSync = new Map();
|
|
54
|
+
this._hashStore = new Map();
|
|
55
|
+
}
|
|
56
|
+
setStorageAdapter(adapter) {
|
|
57
|
+
this._markdownStore = new Keyv({ store: adapter });
|
|
58
|
+
}
|
|
59
|
+
hash(markdown, options) {
|
|
60
|
+
const key = JSON.stringify({ markdown, options });
|
|
61
|
+
let result = this._hashStore.get(key);
|
|
62
|
+
if (result) {
|
|
63
|
+
return result;
|
|
64
|
+
}
|
|
65
|
+
result = createHash('sha256').update(key).digest('hex');
|
|
66
|
+
this._hashStore.set(key, result);
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdHItY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvd3JpdHItY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFPLEVBQUMsSUFBSSxFQUF3QixNQUFNLE1BQU0sQ0FBQztBQUdqRCxNQUFNLE9BQU8sVUFBVTtJQUNkLGNBQWMsQ0FBTztJQUNyQixrQkFBa0IsQ0FBc0I7SUFDeEMsVUFBVSxDQUFzQjtJQUV4QztRQUNDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQVcsYUFBYTtRQUN2QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQVcsaUJBQWlCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQ2hDLENBQUM7SUFFRCxJQUFXLFNBQVM7UUFDbkIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3hCLENBQUM7SUFFTSxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQWdCLEVBQUUsT0FBdUI7UUFDakUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDekMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFTSxlQUFlLENBQUMsUUFBZ0IsRUFBRSxPQUF1QjtRQUMvRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN6QyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsUUFBZ0IsRUFBRSxLQUFhLEVBQUUsT0FBdUI7UUFDaEYsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDekMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRU0sZUFBZSxDQUFDLFFBQWdCLEVBQUUsS0FBYSxFQUFFLE9BQXVCO1FBQzlFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLE9BQU8sSUFBSSxDQUFDO0lBQ2IsQ0FBQztJQUVNLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBVztRQUMzQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTSxPQUFPLENBQUMsR0FBVztRQUN6QixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVNLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBVyxFQUFFLEtBQWE7UUFDMUMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVNLE9BQU8sQ0FBQyxHQUFXLEVBQUUsS0FBYTtRQUN4QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4QyxPQUFPLElBQUksQ0FBQztJQUNiLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSztRQUNqQixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxPQUF5QjtRQUNqRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksSUFBSSxDQUFDLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVNLElBQUksQ0FBQyxRQUFnQixFQUFFLE9BQXVCO1FBQ3BELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBQyxRQUFRLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUNoRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1osT0FBTyxNQUFNLENBQUM7UUFDZixDQUFDO1FBRUQsTUFBTSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVqQyxPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Y3JlYXRlSGFzaH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtLZXl2LCB0eXBlIEtleXZTdG9yZUFkYXB0ZXJ9IGZyb20gJ2tleXYnO1xuaW1wb3J0IHt0eXBlIFJlbmRlck9wdGlvbnN9IGZyb20gJy4vd3JpdHIuanMnO1xuXG5leHBvcnQgY2xhc3MgV3JpdHJDYWNoZSB7XG5cdHByaXZhdGUgX21hcmtkb3duU3RvcmU6IEtleXY7XG5cdHByaXZhdGUgX21hcmtkb3duU3RvcmVTeW5jOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuXHRwcml2YXRlIF9oYXNoU3RvcmU6IE1hcDxzdHJpbmcsIHN0cmluZz47XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0dGhpcy5fbWFya2Rvd25TdG9yZSA9IG5ldyBLZXl2KCk7XG5cdFx0dGhpcy5fbWFya2Rvd25TdG9yZVN5bmMgPSBuZXcgTWFwKCk7XG5cdFx0dGhpcy5faGFzaFN0b3JlID0gbmV3IE1hcCgpO1xuXHR9XG5cblx0cHVibGljIGdldCBtYXJrZG93blN0b3JlKCk6IEtleXYge1xuXHRcdHJldHVybiB0aGlzLl9tYXJrZG93blN0b3JlO1xuXHR9XG5cblx0cHVibGljIGdldCBtYXJrZG93blN0b3JlU3luYygpOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcblx0XHRyZXR1cm4gdGhpcy5fbWFya2Rvd25TdG9yZVN5bmM7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IGhhc2hTdG9yZSgpOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcblx0XHRyZXR1cm4gdGhpcy5faGFzaFN0b3JlO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIGdldE1hcmtkb3duKG1hcmtkb3duOiBzdHJpbmcsIG9wdGlvbnM/OiBSZW5kZXJPcHRpb25zKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcblx0XHRjb25zdCBrZXkgPSB0aGlzLmhhc2gobWFya2Rvd24sIG9wdGlvbnMpO1xuXHRcdHJldHVybiB0aGlzLmdldChrZXkpO1xuXHR9XG5cblx0cHVibGljIGdldE1hcmtkb3duU3luYyhtYXJrZG93bjogc3RyaW5nLCBvcHRpb25zPzogUmVuZGVyT3B0aW9ucyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qga2V5ID0gdGhpcy5oYXNoKG1hcmtkb3duLCBvcHRpb25zKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRTeW5jKGtleSk7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgc2V0TWFya2Rvd24obWFya2Rvd246IHN0cmluZywgdmFsdWU6IHN0cmluZywgb3B0aW9ucz86IFJlbmRlck9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRjb25zdCBrZXkgPSB0aGlzLmhhc2gobWFya2Rvd24sIG9wdGlvbnMpO1xuXHRcdHJldHVybiB0aGlzLnNldChrZXksIHZhbHVlKTtcblx0fVxuXG5cdHB1YmxpYyBzZXRNYXJrZG93blN5bmMobWFya2Rvd246IHN0cmluZywgdmFsdWU6IHN0cmluZywgb3B0aW9ucz86IFJlbmRlck9wdGlvbnMpOiBib29sZWFuIHtcblx0XHRjb25zdCBrZXkgPSB0aGlzLmhhc2gobWFya2Rvd24sIG9wdGlvbnMpO1xuXHRcdHRoaXMuc2V0U3luYyhrZXksIHZhbHVlKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuXHRcdHJldHVybiB0aGlzLl9tYXJrZG93blN0b3JlLmdldChrZXkpO1xuXHR9XG5cblx0cHVibGljIGdldFN5bmMoa2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLl9tYXJrZG93blN0b3JlU3luYy5nZXQoa2V5KTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRyZXR1cm4gdGhpcy5fbWFya2Rvd25TdG9yZS5zZXQoa2V5LCB2YWx1ZSk7XG5cdH1cblxuXHRwdWJsaWMgc2V0U3luYyhrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHRoaXMuX21hcmtkb3duU3RvcmVTeW5jLnNldChrZXksIHZhbHVlKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBjbGVhcigpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRhd2FpdCB0aGlzLl9tYXJrZG93blN0b3JlLmNsZWFyKCk7XG5cdFx0dGhpcy5fbWFya2Rvd25TdG9yZVN5bmMgPSBuZXcgTWFwKCk7XG5cdFx0dGhpcy5faGFzaFN0b3JlID0gbmV3IE1hcCgpO1xuXHR9XG5cblx0cHVibGljIHNldFN0b3JhZ2VBZGFwdGVyKGFkYXB0ZXI6IEtleXZTdG9yZUFkYXB0ZXIpOiB2b2lkIHtcblx0XHR0aGlzLl9tYXJrZG93blN0b3JlID0gbmV3IEtleXYoe3N0b3JlOiBhZGFwdGVyfSk7XG5cdH1cblxuXHRwdWJsaWMgaGFzaChtYXJrZG93bjogc3RyaW5nLCBvcHRpb25zPzogUmVuZGVyT3B0aW9ucyk6IHN0cmluZyB7XG5cdFx0Y29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkoe21hcmtkb3duLCBvcHRpb25zfSk7XG5cdFx0bGV0IHJlc3VsdCA9IHRoaXMuX2hhc2hTdG9yZS5nZXQoa2V5KTtcblx0XHRpZiAocmVzdWx0KSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdHJlc3VsdCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShrZXkpLmRpZ2VzdCgnaGV4Jyk7XG5cdFx0dGhpcy5faGFzaFN0b3JlLnNldChrZXksIHJlc3VsdCk7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG59XG4iXX0=
|
package/dist/writr.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Processor } from 'unified';
|
|
2
1
|
import type React from 'react';
|
|
3
2
|
import { type HTMLReactParserOptions } from 'html-react-parser';
|
|
3
|
+
import { WritrCache } from './writr-cache.js';
|
|
4
4
|
type WritrOptions = {
|
|
5
5
|
openai?: string;
|
|
6
6
|
renderOptions?: RenderOptions;
|
|
@@ -13,16 +13,33 @@ type RenderOptions = {
|
|
|
13
13
|
gfm?: boolean;
|
|
14
14
|
math?: boolean;
|
|
15
15
|
mdx?: boolean;
|
|
16
|
+
caching?: boolean;
|
|
16
17
|
};
|
|
17
18
|
declare class Writr {
|
|
18
|
-
engine: Processor<import("mdast").Root, import("mdast").Root, import("hast").Root, import("hast").Root, string>;
|
|
19
|
+
engine: import("unified").Processor<import("mdast").Root, import("mdast").Root, import("hast").Root, import("hast").Root, string>;
|
|
19
20
|
private readonly _options;
|
|
20
|
-
|
|
21
|
+
private _content;
|
|
22
|
+
private readonly _cache;
|
|
23
|
+
constructor(arguments1?: string | WritrOptions, arguments2?: WritrOptions);
|
|
21
24
|
get options(): WritrOptions;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
get content(): string;
|
|
26
|
+
set content(value: string);
|
|
27
|
+
get cache(): WritrCache;
|
|
28
|
+
get frontMatterRaw(): string;
|
|
29
|
+
get body(): string;
|
|
30
|
+
get markdown(): string;
|
|
31
|
+
get frontMatter(): Record<string, any>;
|
|
32
|
+
set frontMatter(data: Record<string, any>);
|
|
33
|
+
getFrontMatterValue<T>(key: string): T;
|
|
34
|
+
render(options?: RenderOptions): Promise<string>;
|
|
35
|
+
renderSync(options?: RenderOptions): string;
|
|
36
|
+
renderReact(options?: RenderOptions, reactParseOptions?: HTMLReactParserOptions): Promise<string | React.JSX.Element | React.JSX.Element[]>;
|
|
37
|
+
renderReactSync(options?: RenderOptions, reactParseOptions?: HTMLReactParserOptions): string | React.JSX.Element | React.JSX.Element[];
|
|
38
|
+
loadFromFile(filePath: string): Promise<void>;
|
|
39
|
+
loadFromFileSync(filePath: string): void;
|
|
40
|
+
saveToFile(filePath: string): Promise<void>;
|
|
41
|
+
saveToFileSync(filePath: string): void;
|
|
42
|
+
private isCacheEnabled;
|
|
26
43
|
private createProcessor;
|
|
27
44
|
}
|
|
28
45
|
export { Writr, type WritrOptions, type RenderOptions };
|
package/dist/writr.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import { dirname } from 'node:path';
|
|
1
3
|
import { unified } from 'unified';
|
|
2
4
|
import remarkParse from 'remark-parse';
|
|
3
5
|
import remarkRehype from 'remark-rehype';
|
|
@@ -11,6 +13,8 @@ import remarkGfm from 'remark-gfm';
|
|
|
11
13
|
import remarkEmoji from 'remark-emoji';
|
|
12
14
|
import remarkMDX from 'remark-mdx';
|
|
13
15
|
import parse from 'html-react-parser';
|
|
16
|
+
import * as yaml from 'js-yaml';
|
|
17
|
+
import { WritrCache } from './writr-cache.js';
|
|
14
18
|
class Writr {
|
|
15
19
|
engine = unified()
|
|
16
20
|
.use(remarkParse)
|
|
@@ -34,11 +38,24 @@ class Writr {
|
|
|
34
38
|
gfm: true,
|
|
35
39
|
math: true,
|
|
36
40
|
mdx: true,
|
|
41
|
+
caching: true,
|
|
37
42
|
},
|
|
38
43
|
};
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
44
|
+
_content = '';
|
|
45
|
+
_cache = new WritrCache();
|
|
46
|
+
constructor(arguments1, arguments2) {
|
|
47
|
+
if (typeof arguments1 === 'string') {
|
|
48
|
+
this._content = arguments1;
|
|
49
|
+
}
|
|
50
|
+
else if (arguments1) {
|
|
51
|
+
this._options = { ...this._options, ...arguments1 };
|
|
52
|
+
if (this._options.renderOptions) {
|
|
53
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
54
|
+
this.engine = this.createProcessor(this._options.renderOptions);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (arguments2) {
|
|
58
|
+
this._options = { ...this._options, ...arguments2 };
|
|
42
59
|
if (this._options.renderOptions) {
|
|
43
60
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
44
61
|
this.engine = this.createProcessor(this._options.renderOptions);
|
|
@@ -48,44 +65,142 @@ class Writr {
|
|
|
48
65
|
get options() {
|
|
49
66
|
return this._options;
|
|
50
67
|
}
|
|
51
|
-
|
|
68
|
+
get content() {
|
|
69
|
+
return this._content;
|
|
70
|
+
}
|
|
71
|
+
set content(value) {
|
|
72
|
+
this._content = value;
|
|
73
|
+
}
|
|
74
|
+
get cache() {
|
|
75
|
+
return this._cache;
|
|
76
|
+
}
|
|
77
|
+
get frontMatterRaw() {
|
|
78
|
+
const start = this._content.indexOf('---\n');
|
|
79
|
+
if (start === -1) {
|
|
80
|
+
return '';
|
|
81
|
+
} // Return empty string if no starting delimiter is found
|
|
82
|
+
const end = this._content.indexOf('\n---\n', start + 4);
|
|
83
|
+
if (end === -1) {
|
|
84
|
+
return '';
|
|
85
|
+
} // Return empty string if no ending delimiter is found
|
|
86
|
+
return this._content.slice(start, end + 5); // Extract front matter including delimiters
|
|
87
|
+
}
|
|
88
|
+
get body() {
|
|
89
|
+
const start = this._content.indexOf('---\n');
|
|
90
|
+
if (start === -1) {
|
|
91
|
+
return this._content;
|
|
92
|
+
}
|
|
93
|
+
const end = this._content.indexOf('\n---\n', start + 4);
|
|
94
|
+
if (end === -1) {
|
|
95
|
+
return this._content;
|
|
96
|
+
}
|
|
97
|
+
// Return the content after the closing --- marker
|
|
98
|
+
return this._content.slice(Math.max(0, end + 5)).trim();
|
|
99
|
+
}
|
|
100
|
+
get markdown() {
|
|
101
|
+
return this.body;
|
|
102
|
+
}
|
|
103
|
+
get frontMatter() {
|
|
104
|
+
const frontMatter = this.frontMatterRaw;
|
|
105
|
+
const match = /^---\s*([\s\S]*?)\s*---\s*/.exec(frontMatter);
|
|
106
|
+
if (match) {
|
|
107
|
+
return yaml.load(match[1].trim());
|
|
108
|
+
}
|
|
109
|
+
return {};
|
|
110
|
+
}
|
|
111
|
+
set frontMatter(data) {
|
|
112
|
+
const frontMatter = this.frontMatterRaw;
|
|
113
|
+
const yamlString = yaml.dump(data);
|
|
114
|
+
const newFrontMatter = `---\n${yamlString}---\n`;
|
|
115
|
+
this._content = this._content.replace(frontMatter, newFrontMatter);
|
|
116
|
+
}
|
|
117
|
+
getFrontMatterValue(key) {
|
|
118
|
+
return this.frontMatter[key];
|
|
119
|
+
}
|
|
120
|
+
async render(options) {
|
|
52
121
|
try {
|
|
122
|
+
let result = '';
|
|
123
|
+
if (this.isCacheEnabled(options)) {
|
|
124
|
+
const cached = await this._cache.getMarkdown(this._content, options);
|
|
125
|
+
if (cached) {
|
|
126
|
+
return cached;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
53
129
|
let { engine } = this;
|
|
54
130
|
if (options) {
|
|
55
131
|
options = { ...this._options.renderOptions, ...options };
|
|
56
132
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
57
133
|
engine = this.createProcessor(options);
|
|
58
134
|
}
|
|
59
|
-
const file = await engine.process(
|
|
60
|
-
|
|
135
|
+
const file = await engine.process(this.body);
|
|
136
|
+
result = String(file);
|
|
137
|
+
if (this.isCacheEnabled(options)) {
|
|
138
|
+
await this._cache.setMarkdown(this._content, result, options);
|
|
139
|
+
}
|
|
140
|
+
return result;
|
|
61
141
|
}
|
|
62
142
|
catch (error) {
|
|
63
143
|
throw new Error(`Failed to render markdown: ${error.message}`);
|
|
64
144
|
}
|
|
65
145
|
}
|
|
66
|
-
renderSync(
|
|
146
|
+
renderSync(options) {
|
|
67
147
|
try {
|
|
148
|
+
let result = '';
|
|
149
|
+
if (this.isCacheEnabled(options)) {
|
|
150
|
+
const cached = this._cache.getMarkdownSync(this._content, options);
|
|
151
|
+
if (cached) {
|
|
152
|
+
return cached;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
68
155
|
let { engine } = this;
|
|
69
156
|
if (options) {
|
|
70
157
|
options = { ...this._options.renderOptions, ...options };
|
|
71
158
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
72
159
|
engine = this.createProcessor(options);
|
|
73
160
|
}
|
|
74
|
-
const file = engine.processSync(
|
|
75
|
-
|
|
161
|
+
const file = engine.processSync(this.body);
|
|
162
|
+
result = String(file);
|
|
163
|
+
if (this.isCacheEnabled(options)) {
|
|
164
|
+
this._cache.setMarkdownSync(this._content, result, options);
|
|
165
|
+
}
|
|
166
|
+
return result;
|
|
76
167
|
}
|
|
77
168
|
catch (error) {
|
|
78
169
|
throw new Error(`Failed to render markdown: ${error.message}`);
|
|
79
170
|
}
|
|
80
171
|
}
|
|
81
|
-
async renderReact(
|
|
82
|
-
const html = await this.render(
|
|
172
|
+
async renderReact(options, reactParseOptions) {
|
|
173
|
+
const html = await this.render(options);
|
|
83
174
|
return parse(html, reactParseOptions);
|
|
84
175
|
}
|
|
85
|
-
renderReactSync(
|
|
86
|
-
const html = this.renderSync(
|
|
176
|
+
renderReactSync(options, reactParseOptions) {
|
|
177
|
+
const html = this.renderSync(options);
|
|
87
178
|
return parse(html, reactParseOptions);
|
|
88
179
|
}
|
|
180
|
+
async loadFromFile(filePath) {
|
|
181
|
+
const { readFile } = fs.promises;
|
|
182
|
+
this._content = await readFile(filePath, 'utf8');
|
|
183
|
+
}
|
|
184
|
+
loadFromFileSync(filePath) {
|
|
185
|
+
this._content = fs.readFileSync(filePath, 'utf8');
|
|
186
|
+
}
|
|
187
|
+
async saveToFile(filePath) {
|
|
188
|
+
const { writeFile, mkdir } = fs.promises;
|
|
189
|
+
const directoryPath = dirname(filePath);
|
|
190
|
+
await mkdir(directoryPath, { recursive: true });
|
|
191
|
+
await writeFile(filePath, this._content, 'utf8');
|
|
192
|
+
}
|
|
193
|
+
saveToFileSync(filePath) {
|
|
194
|
+
const directoryPath = dirname(filePath);
|
|
195
|
+
fs.mkdirSync(directoryPath, { recursive: true });
|
|
196
|
+
fs.writeFileSync(filePath, this._content, 'utf8');
|
|
197
|
+
}
|
|
198
|
+
isCacheEnabled(options) {
|
|
199
|
+
if (options?.caching !== undefined) {
|
|
200
|
+
return options.caching;
|
|
201
|
+
}
|
|
202
|
+
return this._options?.renderOptions?.caching ?? false;
|
|
203
|
+
}
|
|
89
204
|
createProcessor(options) {
|
|
90
205
|
const processor = unified().use(remarkParse);
|
|
91
206
|
if (options.gfm) {
|
|
@@ -115,4 +230,4 @@ class Writr {
|
|
|
115
230
|
}
|
|
116
231
|
}
|
|
117
232
|
export { Writr };
|
|
118
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdHIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvd3JpdHIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE9BQU8sRUFBWSxNQUFNLFNBQVMsQ0FBQztBQUMzQyxPQUFPLFdBQVcsTUFBTSxjQUFjLENBQUM7QUFDdkMsT0FBTyxZQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sVUFBVSxNQUFNLGFBQWEsQ0FBQztBQUNyQyxPQUFPLGVBQWUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLGVBQWUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLFNBQVMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxVQUFVLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sV0FBVyxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLFNBQVMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxXQUFXLE1BQU0sY0FBYyxDQUFDO0FBQ3ZDLE9BQU8sU0FBUyxNQUFNLFlBQVksQ0FBQztBQUVuQyxPQUFPLEtBQW9DLE1BQU0sbUJBQW1CLENBQUM7QUFpQnJFLE1BQU0sS0FBSztJQUNILE1BQU0sR0FBRyxPQUFPLEVBQUU7U0FDdkIsR0FBRyxDQUFDLFdBQVcsQ0FBQztTQUNoQixHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsK0JBQStCO1NBQzlDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyx3QkFBd0I7U0FDdkMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLG9CQUFvQjtTQUNyQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsMkJBQTJCO1NBQzdDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxnQ0FBZ0M7U0FDaEQsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLG1CQUFtQjtTQUNuQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsbUJBQW1CO1NBQ3BDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQyw0QkFBNEI7U0FDakQsR0FB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LENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFFRCxTQUFTLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRS9CLE9BQU8sU0FBUyxDQUFDO0lBQ2xCLENBQUM7Q0FDRDtBQUVELE9BQU8sRUFBQyxLQUFLLEVBQXdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3VuaWZpZWQsIFByb2Nlc3Nvcn0gZnJvbSAndW5pZmllZCc7XG5pbXBvcnQgcmVtYXJrUGFyc2UgZnJvbSAncmVtYXJrLXBhcnNlJztcbmltcG9ydCByZW1hcmtSZWh5cGUgZnJvbSAncmVtYXJrLXJlaHlwZSc7XG5pbXBvcnQgcmVoeXBlU2x1ZyBmcm9tICdyZWh5cGUtc2x1Zyc7XG5pbXBvcnQgcmVoeXBlSGlnaGxpZ2h0IGZyb20gJ3JlaHlwZS1oaWdobGlnaHQnO1xuaW1wb3J0IHJlaHlwZVN0cmluZ2lmeSBmcm9tICdyZWh5cGUtc3RyaW5naWZ5JztcbmltcG9ydCByZW1hcmtUb2MgZnJvbSAncmVtYXJrLXRvYyc7XG5pbXBvcnQgcmVtYXJrTWF0aCBmcm9tICdyZW1hcmstbWF0aCc7XG5pbXBvcnQgcmVoeXBlS2F0ZXggZnJvbSAncmVoeXBlLWthdGV4JztcbmltcG9ydCByZW1hcmtHZm0gZnJvbSAncmVtYXJrLWdmbSc7XG5pbXBvcnQgcmVtYXJrRW1vamkgZnJvbSAncmVtYXJrLWVtb2ppJztcbmltcG9ydCByZW1hcmtNRFggZnJvbSAncmVtYXJrLW1keCc7XG5pbXBvcnQgdHlwZSBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgcGFyc2UsIHt0eXBlIEhUTUxSZWFjdFBhcnNlck9wdGlvbnN9IGZyb20gJ2h0bWwtcmVhY3QtcGFyc2VyJztcblxudHlwZSBXcml0ck9wdGlvbnMgPSB7XG5cdG9wZW5haT86IHN0cmluZzsgLy8gT3BlbmFpIGFwaSBrZXkgKGRlZmF1bHQ6IHVuZGVmaW5lZClcblx0cmVuZGVyT3B0aW9ucz86IFJlbmRlck9wdGlvbnM7IC8vIERlZmF1bHQgcmVuZGVyIG9wdGlvbnMgKGRlZmF1bHQ6IHVuZGVmaW5lZClcbn07XG5cbnR5cGUgUmVuZGVyT3B0aW9ucyA9IHtcblx0ZW1vamk/OiBib29sZWFuOyAvLyBFbW9qaSBzdXBwb3J0IChkZWZhdWx0OiB0cnVlKVxuXHR0b2M/OiBib29sZWFuOyAvLyBUYWJsZSBvZiBjb250ZW50cyBnZW5lcmF0aW9uIChkZWZhdWx0OiB0cnVlKVxuXHRzbHVnPzogYm9vbGVhbjsgLy8gU2x1ZyBnZW5lcmF0aW9uIChkZWZhdWx0OiB0cnVlKVxuXHRoaWdobGlnaHQ/OiBib29sZWFuOyAvLyBDb2RlIGhpZ2hsaWdodGluZyAoZGVmYXVsdDogdHJ1ZSlcblx0Z2ZtPzogYm9vbGVhbjsgLy8gR2l0aHViIGZsYXZvciBtYXJrZG93biAoZGVmYXVsdDogdHJ1ZSlcblx0bWF0aD86IGJvb2xlYW47IC8vIE1hdGggc3VwcG9ydCAoZGVmYXVsdDogdHJ1ZSlcblx0bWR4PzogYm9vbGVhbjsgLy8gTURYIHN1cHBvcnQgKGRlZmF1bHQ6IHRydWUpXG59O1xuXG5jbGFzcyBXcml0ciB7XG5cdHB1YmxpYyBlbmdpbmUgPSB1bmlmaWVkKClcblx0XHQudXNlKHJlbWFya1BhcnNlKVxuXHRcdC51c2UocmVtYXJrR2ZtKSAvLyBVc2UgR2l0SHViIEZsYXZvcmVkIE1hcmtkb3duXG5cdFx0LnVzZShyZW1hcmtUb2MpIC8vIEFkZCB0YWJsZSBvZiBjb250ZW50c1xuXHRcdC51c2UocmVtYXJrRW1vamkpIC8vIEFkZCBlbW9qaSBzdXBwb3J0XG5cdFx0LnVzZShyZW1hcmtSZWh5cGUpIC8vIENvbnZlcnQgbWFya2Rvd24gdG8gSFRNTFxuXHRcdC51c2UocmVoeXBlU2x1ZykgLy8gQWRkIHNsdWdzIHRvIGhlYWRpbmdzIGluIEhUTUxcblx0XHQudXNlKHJlbWFya01hdGgpIC8vIEFkZCBtYXRoIHN1cHBvcnRcblx0XHQudXNlKHJlaHlwZUthdGV4KSAvLyBBZGQgbWF0aCBzdXBwb3J0XG5cdFx0LnVzZShyZWh5cGVIaWdobGlnaHQpIC8vIEFwcGx5IHN5bnRheCBoaWdobGlnaHRpbmdcblx0XHQudXNlKHJlbWFya01EWCkgLy8gQWRkIE1EWCBzdXBwb3J0XG5cdFx0LnVzZShyZWh5cGVTdHJpbmdpZnkpOyAvLyBTdHJpbmdpZnkgSFRNTFxuXG5cdHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnM6IFdyaXRyT3B0aW9ucyA9IHtcblx0XHRvcGVuYWk6IHVuZGVmaW5lZCxcblx0XHRyZW5kZXJPcHRpb25zOiB7XG5cdFx0XHRlbW9qaTogdHJ1ZSxcblx0XHRcdHRvYzogdHJ1ZSxcblx0XHRcdHNsdWc6IHRydWUsXG5cdFx0XHRoaWdobGlnaHQ6IHRydWUsXG5cdFx0XHRnZm06IHRydWUsXG5cdFx0XHRtYXRoOiB0cnVlLFxuXHRcdFx0bWR4OiB0cnVlLFxuXHRcdH0sXG5cdH07XG5cblx0Y29uc3RydWN0b3Iob3B0aW9ucz86IFdyaXRyT3B0aW9ucykge1xuXHRcdGlmIChvcHRpb25zKSB7XG5cdFx0XHR0aGlzLl9vcHRpb25zID0gey4uLnRoaXMuX29wdGlvbnMsIC4uLm9wdGlvbnN9O1xuXHRcdFx0aWYgKHRoaXMuX29wdGlvbnMucmVuZGVyT3B0aW9ucykge1xuXHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50XG5cdFx0XHRcdHRoaXMuZW5naW5lID0gdGhpcy5jcmVhdGVQcm9jZXNzb3IodGhpcy5fb3B0aW9ucy5yZW5kZXJPcHRpb25zKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgZ2V0IG9wdGlvbnMoKTogV3JpdHJPcHRpb25zIHtcblx0XHRyZXR1cm4gdGhpcy5fb3B0aW9ucztcblx0fVxuXG5cdGFzeW5jIHJlbmRlcihtYXJrZG93bjogc3RyaW5nLCBvcHRpb25zPzogUmVuZGVyT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0dHJ5IHtcblx0XHRcdGxldCB7ZW5naW5lfSA9IHRoaXM7XG5cdFx0XHRpZiAob3B0aW9ucykge1xuXHRcdFx0XHRvcHRpb25zID0gey4uLnRoaXMuX29wdGlvbnMucmVuZGVyT3B0aW9ucywgLi4ub3B0aW9uc307XG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnRcblx0XHRcdFx0ZW5naW5lID0gdGhpcy5jcmVhdGVQcm9jZXNzb3Iob3B0aW9ucyk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGZpbGUgPSBhd2FpdCBlbmdpbmUucHJvY2VzcyhtYXJrZG93bik7XG5cdFx0XHRyZXR1cm4gU3RyaW5nKGZpbGUpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZW5kZXIgbWFya2Rvd246ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuXHRcdH1cblx0fVxuXG5cdHJlbmRlclN5bmMobWFya2Rvd246IHN0cmluZywgb3B0aW9ucz86IFJlbmRlck9wdGlvbnMpOiBzdHJpbmcge1xuXHRcdHRyeSB7XG5cdFx0XHRsZXQge2VuZ2luZX0gPSB0aGlzO1xuXHRcdFx0aWYgKG9wdGlvbnMpIHtcblx0XHRcdFx0b3B0aW9ucyA9IHsuLi50aGlzLl9vcHRpb25zLnJlbmRlck9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuXHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50XG5cdFx0XHRcdGVuZ2luZSA9IHRoaXMuY3JlYXRlUHJvY2Vzc29yKG9wdGlvbnMpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBmaWxlID0gZW5naW5lLnByb2Nlc3NTeW5jKG1hcmtkb3duKTtcblx0XHRcdHJldHVybiBTdHJpbmcoZmlsZSk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlbmRlciBtYXJrZG93bjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgcmVuZGVyUmVhY3QobWFya2Rvd246IHN0cmluZywgb3B0aW9ucz86IFJlbmRlck9wdGlvbnMsIHJlYWN0UGFyc2VPcHRpb25zPzogSFRNTFJlYWN0UGFyc2VyT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nIHwgUmVhY3QuSlNYLkVsZW1lbnQgfCBSZWFjdC5KU1guRWxlbWVudFtdPiB7XG5cdFx0Y29uc3QgaHRtbCA9IGF3YWl0IHRoaXMucmVuZGVyKG1hcmtkb3duLCBvcHRpb25zKTtcblxuXHRcdHJldHVybiBwYXJzZShodG1sLCByZWFjdFBhcnNlT3B0aW9ucyk7XG5cdH1cblxuXHRyZW5kZXJSZWFjdFN5bmMobWFya2Rvd246IHN0cmluZywgb3B0aW9ucz86IFJlbmRlck9wdGlvbnMsIHJlYWN0UGFyc2VPcHRpb25zPzogSFRNTFJlYWN0UGFyc2VyT3B0aW9ucyk6IHN0cmluZyB8IFJlYWN0LkpTWC5FbGVtZW50IHwgUmVhY3QuSlNYLkVsZW1lbnRbXSB7XG5cdFx0Y29uc3QgaHRtbCA9IHRoaXMucmVuZGVyU3luYyhtYXJrZG93biwgb3B0aW9ucyk7XG5cdFx0cmV0dXJuIHBhcnNlKGh0bWwsIHJlYWN0UGFyc2VPcHRpb25zKTtcblx0fVxuXG5cdHByaXZhdGUgY3JlYXRlUHJvY2Vzc29yKG9wdGlvbnM6IFJlbmRlck9wdGlvbnMpOiBhbnkge1xuXHRcdGNvbnN0IHByb2Nlc3NvciA9IHVuaWZpZWQoKS51c2UocmVtYXJrUGFyc2UpO1xuXG5cdFx0aWYgKG9wdGlvbnMuZ2ZtKSB7XG5cdFx0XHRwcm9jZXNzb3IudXNlKHJlbWFya0dmbSk7XG5cdFx0fVxuXG5cdFx0aWYgKG9wdGlvbnMudG9jKSB7XG5cdFx0XHRwcm9jZXNzb3IudXNlKHJlbWFya1RvYywge2hlYWRpbmc6ICd0b2N8dGFibGUgb2YgY29udGVudHMnfSk7XG5cdFx0fVxuXG5cdFx0aWYgKG9wdGlvbnMuZW1vamkpIHtcblx0XHRcdHByb2Nlc3Nvci51c2UocmVtYXJrRW1vamkpO1xuXHRcdH1cblxuXHRcdHByb2Nlc3Nvci51c2UocmVtYXJrUmVoeXBlKTtcblxuXHRcdGlmIChvcHRpb25zLnNsdWcpIHtcblx0XHRcdHByb2Nlc3Nvci51c2UocmVoeXBlU2x1Zyk7XG5cdFx0fVxuXG5cdFx0aWYgKG9wdGlvbnMuaGlnaGxpZ2h0KSB7XG5cdFx0XHRwcm9jZXNzb3IudXNlKHJlaHlwZUhpZ2hsaWdodCk7XG5cdFx0fVxuXG5cdFx0aWYgKG9wdGlvbnMubWF0aCkge1xuXHRcdFx0cHJvY2Vzc29yLnVzZShyZW1hcmtNYXRoKS51c2UocmVoeXBlS2F0ZXgpO1xuXHRcdH1cblxuXHRcdGlmIChvcHRpb25zLm1keCkge1xuXHRcdFx0cHJvY2Vzc29yLnVzZShyZW1hcmtNRFgpO1xuXHRcdH1cblxuXHRcdHByb2Nlc3Nvci51c2UocmVoeXBlU3RyaW5naWZ5KTtcblxuXHRcdHJldHVybiBwcm9jZXNzb3I7XG5cdH1cbn1cblxuZXhwb3J0IHtXcml0ciwgdHlwZSBXcml0ck9wdGlvbnMsIHR5cGUgUmVuZGVyT3B0aW9uc307XG5cbiJdfQ==
|
|
233
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdHIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvd3JpdHIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3pCLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLFdBQVcsTUFBTSxjQUFjLENBQUM7QUFDdkMsT0FBTyxZQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sVUFBVSxNQUFNLGFBQWEsQ0FBQztBQUNyQyxPQUFPLGVBQWUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLGVBQWUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLFNBQVMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxVQUFVLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sV0FBVyxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLFNBQVMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxXQUFXLE1BQU0sY0FBYyxDQUFDO0FBQ3ZDLE9BQU8sU0FBUyxNQUFNLFlBQVksQ0FBQztBQUVuQyxPQUFPLEtBQW9DLE1BQU0sbUJBQW1CLENBQUM7QUFDckUsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFDaEMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBa0I1QyxNQUFNLEtBQUs7SUFDSCxNQUFNLEdBQUcsT0FBTyxFQUFFO1NBQ3ZCLEdBQUcsQ0FBQyxXQUFXLENBQUM7U0FDaEIsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLCtCQUErQjtTQUM5QyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsd0JBQXdCO1NBQ3ZDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxvQkFBb0I7U0FDckMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLDJCQUEyQjtTQUM3QyxHQUFH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QUksT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ25CLFNBQVMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUVELFNBQVMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFNUIsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdkIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2pCLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUVELFNBQVMsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFL0IsT0FBTyxTQUFTLENBQUM7SUFDbEIsQ0FBQztDQUNEO0FBRUQsT0FBTyxFQUFDLEtBQUssRUFBd0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7ZGlybmFtZX0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7dW5pZmllZH0gZnJvbSAndW5pZmllZCc7XG5pbXBvcnQgcmVtYXJrUGFyc2UgZnJvbSAncmVtYXJrLXBhcnNlJztcbmltcG9ydCByZW1hcmtSZWh5cGUgZnJvbSAncmVtYXJrLXJlaHlwZSc7XG5pbXBvcnQgcmVoeXBlU2x1ZyBmcm9tICdyZWh5cGUtc2x1Zyc7XG5pbXBvcnQgcmVoeXBlSGlnaGxpZ2h0IGZyb20gJ3JlaHlwZS1oaWdobGlnaHQnO1xuaW1wb3J0IHJlaHlwZVN0cmluZ2lmeSBmcm9tICdyZWh5cGUtc3RyaW5naWZ5JztcbmltcG9ydCByZW1hcmtUb2MgZnJvbSAncmVtYXJrLXRvYyc7XG5pbXBvcnQgcmVtYXJrTWF0aCBmcm9tICdyZW1hcmstbWF0aCc7XG5pbXBvcnQgcmVoeXBlS2F0ZXggZnJvbSAncmVoeXBlLWthdGV4JztcbmltcG9ydCByZW1hcmtHZm0gZnJvbSAncmVtYXJrLWdmbSc7XG5pbXBvcnQgcmVtYXJrRW1vamkgZnJvbSAncmVtYXJrLWVtb2ppJztcbmltcG9ydCByZW1hcmtNRFggZnJvbSAncmVtYXJrLW1keCc7XG5pbXBvcnQgdHlwZSBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgcGFyc2UsIHt0eXBlIEhUTUxSZWFjdFBhcnNlck9wdGlvbnN9IGZyb20gJ2h0bWwtcmVhY3QtcGFyc2VyJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQge1dyaXRyQ2FjaGV9IGZyb20gJy4vd3JpdHItY2FjaGUuanMnO1xuXG50eXBlIFdyaXRyT3B0aW9ucyA9IHtcblx0b3BlbmFpPzogc3RyaW5nOyAvLyBPcGVuYWkgYXBpIGtleSAoZGVmYXVsdDogdW5kZWZpbmVkKVxuXHRyZW5kZXJPcHRpb25zPzogUmVuZGVyT3B0aW9uczsgLy8gRGVmYXVsdCByZW5kZXIgb3B0aW9ucyAoZGVmYXVsdDogdW5kZWZpbmVkKVxufTtcblxudHlwZSBSZW5kZXJPcHRpb25zID0ge1xuXHRlbW9qaT86IGJvb2xlYW47IC8vIEVtb2ppIHN1cHBvcnQgKGRlZmF1bHQ6IHRydWUpXG5cdHRvYz86IGJvb2xlYW47IC8vIFRhYmxlIG9mIGNvbnRlbnRzIGdlbmVyYXRpb24gKGRlZmF1bHQ6IHRydWUpXG5cdHNsdWc/OiBib29sZWFuOyAvLyBTbHVnIGdlbmVyYXRpb24gKGRlZmF1bHQ6IHRydWUpXG5cdGhpZ2hsaWdodD86IGJvb2xlYW47IC8vIENvZGUgaGlnaGxpZ2h0aW5nIChkZWZhdWx0OiB0cnVlKVxuXHRnZm0/OiBib29sZWFuOyAvLyBHaXRodWIgZmxhdm9yIG1hcmtkb3duIChkZWZhdWx0OiB0cnVlKVxuXHRtYXRoPzogYm9vbGVhbjsgLy8gTWF0aCBzdXBwb3J0IChkZWZhdWx0OiB0cnVlKVxuXHRtZHg/OiBib29sZWFuOyAvLyBNRFggc3VwcG9ydCAoZGVmYXVsdDogdHJ1ZSlcblx0Y2FjaGluZz86IGJvb2xlYW47IC8vIENhY2hpbmcgKGRlZmF1bHQ6IHRydWUpXG59O1xuXG5jbGFzcyBXcml0ciB7XG5cdHB1YmxpYyBlbmdpbmUgPSB1bmlmaWVkKClcblx0XHQudXNlKHJlbWFya1BhcnNlKVxuXHRcdC51c2UocmVtYXJrR2ZtKSAvLyBVc2UgR2l0SHViIEZsYXZvcmVkIE1hcmtkb3duXG5cdFx0LnVzZShyZW1hcmtUb2MpIC8vIEFkZCB0YWJsZSBvZiBjb250ZW50c1xuXHRcdC51c2UocmVtYXJrRW1vamkpIC8vIEFkZCBlbW9qaSBzdXBwb3J0XG5cdFx0LnVzZShyZW1hcmtSZWh5cGUpIC8vIENvbnZlcnQgbWFya2Rvd24gdG8gSFRNTFxuXHRcdC51c2UocmVoeXBlU2x1ZykgLy8gQWRkIHNsdWdzIHRvIGhlYWRpbmdzIGluIEhUTUxcblx0XHQudXNlKHJlbWFya01hdGgpIC8vIEFkZCBtYXRoIHN1cHBvcnRcblx0XHQudXNlKHJlaHlwZUthdGV4KSAvLyBBZGQgbWF0aCBzdXBwb3J0XG5cdFx0LnVzZShyZWh5cGVIaWdobGlnaHQpIC8vIEFwcGx5IHN5bnRheCBoaWdobGlnaHRpbmdcblx0XHQudXNlKHJlbWFya01EWCkgLy8gQWRkIE1EWCBzdXBwb3J0XG5cdFx0LnVzZShyZWh5cGVTdHJpbmdpZnkpOyAvLyBTdHJpbmdpZnkgSFRNTFxuXG5cdHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnM6IFdyaXRyT3B0aW9ucyA9IHtcblx0XHRvcGVuYWk6IHVuZGVmaW5lZCxcblx0XHRyZW5kZXJPcHRpb25zOiB7XG5cdFx0XHRlbW9qaTogdHJ1ZSxcblx0XHRcdHRvYzogdHJ1ZSxcblx0XHRcdHNsdWc6IHRydWUsXG5cdFx0XHRoaWdobGlnaHQ6IHRydWUsXG5cdFx0XHRnZm06IHRydWUsXG5cdFx0XHRtYXRoOiB0cnVlLFxuXHRcdFx0bWR4OiB0cnVlLFxuXHRcdFx0Y2FjaGluZzogdHJ1ZSxcblx0XHR9LFxuXHR9O1xuXG5cdHByaXZhdGUgX2NvbnRlbnQgPSAnJztcblxuXHRwcml2YXRlIHJlYWRvbmx5IF9jYWNoZSA9IG5ldyBXcml0ckNhY2hlKCk7XG5cblx0Y29uc3RydWN0b3IoYXJndW1lbnRzMT86IHN0cmluZyB8IFdyaXRyT3B0aW9ucywgYXJndW1lbnRzMj86IFdyaXRyT3B0aW9ucykge1xuXHRcdGlmICh0eXBlb2YgYXJndW1lbnRzMSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdHRoaXMuX2NvbnRlbnQgPSBhcmd1bWVudHMxO1xuXHRcdH0gZWxzZSBpZiAoYXJndW1lbnRzMSkge1xuXHRcdFx0dGhpcy5fb3B0aW9ucyA9IHsuLi50aGlzLl9vcHRpb25zLCAuLi5hcmd1bWVudHMxfTtcblx0XHRcdGlmICh0aGlzLl9vcHRpb25zLnJlbmRlck9wdGlvbnMpIHtcblx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudFxuXHRcdFx0XHR0aGlzLmVuZ2luZSA9IHRoaXMuY3JlYXRlUHJvY2Vzc29yKHRoaXMuX29wdGlvbnMucmVuZGVyT3B0aW9ucyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGFyZ3VtZW50czIpIHtcblx0XHRcdHRoaXMuX29wdGlvbnMgPSB7Li4udGhpcy5fb3B0aW9ucywgLi4uYXJndW1lbnRzMn07XG5cdFx0XHRpZiAodGhpcy5fb3B0aW9ucy5yZW5kZXJPcHRpb25zKSB7XG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnRcblx0XHRcdFx0dGhpcy5lbmdpbmUgPSB0aGlzLmNyZWF0ZVByb2Nlc3Nvcih0aGlzLl9vcHRpb25zLnJlbmRlck9wdGlvbnMpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBnZXQgb3B0aW9ucygpOiBXcml0ck9wdGlvbnMge1xuXHRcdHJldHVybiB0aGlzLl9vcHRpb25zO1xuXHR9XG5cblx0cHVibGljIGdldCBjb250ZW50KCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuX2NvbnRlbnQ7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGNvbnRlbnQodmFsdWU6IHN0cmluZykge1xuXHRcdHRoaXMuX2NvbnRlbnQgPSB2YWx1ZTtcblx0fVxuXG5cdHB1YmxpYyBnZXQgY2FjaGUoKTogV3JpdHJDYWNoZSB7XG5cdFx0cmV0dXJuIHRoaXMuX2NhY2hlO1xuXHR9XG5cblx0Z2V0IGZyb250TWF0dGVyUmF3KCk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgc3RhcnQgPSB0aGlzLl9jb250ZW50LmluZGV4T2YoJy0tLVxcbicpO1xuXHRcdGlmIChzdGFydCA9PT0gLTEpIHtcblx0XHRcdHJldHVybiAnJztcblx0XHR9IC8vIFJldHVybiBlbXB0eSBzdHJpbmcgaWYgbm8gc3RhcnRpbmcgZGVsaW1pdGVyIGlzIGZvdW5kXG5cblx0XHRjb25zdCBlbmQgPSB0aGlzLl9jb250ZW50LmluZGV4T2YoJ1xcbi0tLVxcbicsIHN0YXJ0ICsgNCk7XG5cdFx0aWYgKGVuZCA9PT0gLTEpIHtcblx0XHRcdHJldHVybiAnJztcblx0XHR9IC8vIFJldHVybiBlbXB0eSBzdHJpbmcgaWYgbm8gZW5kaW5nIGRlbGltaXRlciBpcyBmb3VuZFxuXG5cdFx0cmV0dXJuIHRoaXMuX2NvbnRlbnQuc2xpY2Uoc3RhcnQsIGVuZCArIDUpOyAvLyBFeHRyYWN0IGZyb250IG1hdHRlciBpbmNsdWRpbmcgZGVsaW1pdGVyc1xuXHR9XG5cblx0Z2V0IGJvZHkoKTogc3RyaW5nIHtcblx0XHRjb25zdCBzdGFydCA9IHRoaXMuX2NvbnRlbnQuaW5kZXhPZignLS0tXFxuJyk7XG5cdFx0aWYgKHN0YXJ0ID09PSAtMSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2NvbnRlbnQ7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZW5kID0gdGhpcy5fY29udGVudC5pbmRleE9mKCdcXG4tLS1cXG4nLCBzdGFydCArIDQpO1xuXHRcdGlmIChlbmQgPT09IC0xKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY29udGVudDtcblx0XHR9XG5cblx0XHQvLyBSZXR1cm4gdGhlIGNvbnRlbnQgYWZ0ZXIgdGhlIGNsb3NpbmcgLS0tIG1hcmtlclxuXHRcdHJldHVybiB0aGlzLl9jb250ZW50LnNsaWNlKE1hdGgubWF4KDAsIGVuZCArIDUpKS50cmltKCk7XG5cdH1cblxuXHRnZXQgbWFya2Rvd24oKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5ib2R5O1xuXHR9XG5cblx0Z2V0IGZyb250TWF0dGVyKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuXHRcdGNvbnN0IGZyb250TWF0dGVyID0gdGhpcy5mcm9udE1hdHRlclJhdztcblx0XHRjb25zdCBtYXRjaCA9IC9eLS0tXFxzKihbXFxzXFxTXSo/KVxccyotLS1cXHMqLy5leGVjKGZyb250TWF0dGVyKTtcblx0XHRpZiAobWF0Y2gpIHtcblx0XHRcdHJldHVybiB5YW1sLmxvYWQobWF0Y2hbMV0udHJpbSgpKSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXHRcdH1cblxuXHRcdHJldHVybiB7fTtcblx0fVxuXG5cdHNldCBmcm9udE1hdHRlcihkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG5cdFx0Y29uc3QgZnJvbnRNYXR0ZXIgPSB0aGlzLmZyb250TWF0dGVyUmF3O1xuXHRcdGNvbnN0IHlhbWxTdHJpbmcgPSB5YW1sLmR1bXAoZGF0YSk7XG5cdFx0Y29uc3QgbmV3RnJvbnRNYXR0ZXIgPSBgLS0tXFxuJHt5YW1sU3RyaW5nfS0tLVxcbmA7XG5cdFx0dGhpcy5fY29udGVudCA9IHRoaXMuX2NvbnRlbnQucmVwbGFjZShmcm9udE1hdHRlciwgbmV3RnJvbnRNYXR0ZXIpO1xuXHR9XG5cblx0cHVibGljIGdldEZyb250TWF0dGVyVmFsdWU8VD4oa2V5OiBzdHJpbmcpOiBUIHtcblx0XHRyZXR1cm4gdGhpcy5mcm9udE1hdHRlcltrZXldIGFzIFQ7XG5cdH1cblxuXHRhc3luYyByZW5kZXIob3B0aW9ucz86IFJlbmRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdHRyeSB7XG5cdFx0XHRsZXQgcmVzdWx0ID0gJyc7XG5cdFx0XHRpZiAodGhpcy5pc0NhY2hlRW5hYmxlZChvcHRpb25zKSkge1xuXHRcdFx0XHRjb25zdCBjYWNoZWQgPSBhd2FpdCB0aGlzLl9jYWNoZS5nZXRNYXJrZG93bih0aGlzLl9jb250ZW50LCBvcHRpb25zKTtcblx0XHRcdFx0aWYgKGNhY2hlZCkge1xuXHRcdFx0XHRcdHJldHVybiBjYWNoZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0bGV0IHtlbmdpbmV9ID0gdGhpcztcblx0XHRcdGlmIChvcHRpb25zKSB7XG5cdFx0XHRcdG9wdGlvbnMgPSB7Li4udGhpcy5fb3B0aW9ucy5yZW5kZXJPcHRpb25zLCAuLi5vcHRpb25zfTtcblx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudFxuXHRcdFx0XHRlbmdpbmUgPSB0aGlzLmNyZWF0ZVByb2Nlc3NvcihvcHRpb25zKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZmlsZSA9IGF3YWl0IGVuZ2luZS5wcm9jZXNzKHRoaXMuYm9keSk7XG5cdFx0XHRyZXN1bHQgPSBTdHJpbmcoZmlsZSk7XG5cdFx0XHRpZiAodGhpcy5pc0NhY2hlRW5hYmxlZChvcHRpb25zKSkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLl9jYWNoZS5zZXRNYXJrZG93bih0aGlzLl9jb250ZW50LCByZXN1bHQsIG9wdGlvbnMpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZW5kZXIgbWFya2Rvd246ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuXHRcdH1cblx0fVxuXG5cdHJlbmRlclN5bmMob3B0aW9ucz86IFJlbmRlck9wdGlvbnMpOiBzdHJpbmcge1xuXHRcdHRyeSB7XG5cdFx0XHRsZXQgcmVzdWx0ID0gJyc7XG5cdFx0XHRpZiAodGhpcy5pc0NhY2hlRW5hYmxlZChvcHRpb25zKSkge1xuXHRcdFx0XHRjb25zdCBjYWNoZWQgPSB0aGlzLl9jYWNoZS5nZXRNYXJrZG93blN5bmModGhpcy5fY29udGVudCwgb3B0aW9ucyk7XG5cdFx0XHRcdGlmIChjYWNoZWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gY2FjaGVkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGxldCB7ZW5naW5lfSA9IHRoaXM7XG5cdFx0XHRpZiAob3B0aW9ucykge1xuXHRcdFx0XHRvcHRpb25zID0gey4uLnRoaXMuX29wdGlvbnMucmVuZGVyT3B0aW9ucywgLi4ub3B0aW9uc307XG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnRcblx0XHRcdFx0ZW5naW5lID0gdGhpcy5jcmVhdGVQcm9jZXNzb3Iob3B0aW9ucyk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGZpbGUgPSBlbmdpbmUucHJvY2Vzc1N5bmModGhpcy5ib2R5KTtcblx0XHRcdHJlc3VsdCA9IFN0cmluZyhmaWxlKTtcblx0XHRcdGlmICh0aGlzLmlzQ2FjaGVFbmFibGVkKG9wdGlvbnMpKSB7XG5cdFx0XHRcdHRoaXMuX2NhY2hlLnNldE1hcmtkb3duU3luYyh0aGlzLl9jb250ZW50LCByZXN1bHQsIG9wdGlvbnMpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZW5kZXIgbWFya2Rvd246ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIHJlbmRlclJlYWN0KG9wdGlvbnM/OiBSZW5kZXJPcHRpb25zLCByZWFjdFBhcnNlT3B0aW9ucz86IEhUTUxSZWFjdFBhcnNlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZyB8IFJlYWN0LkpTWC5FbGVtZW50IHwgUmVhY3QuSlNYLkVsZW1lbnRbXT4ge1xuXHRcdGNvbnN0IGh0bWwgPSBhd2FpdCB0aGlzLnJlbmRlcihvcHRpb25zKTtcblxuXHRcdHJldHVybiBwYXJzZShodG1sLCByZWFjdFBhcnNlT3B0aW9ucyk7XG5cdH1cblxuXHRyZW5kZXJSZWFjdFN5bmMob3B0aW9ucz86IFJlbmRlck9wdGlvbnMsIHJlYWN0UGFyc2VPcHRpb25zPzogSFRNTFJlYWN0UGFyc2VyT3B0aW9ucyk6IHN0cmluZyB8IFJlYWN0LkpTWC5FbGVtZW50IHwgUmVhY3QuSlNYLkVsZW1lbnRbXSB7XG5cdFx0Y29uc3QgaHRtbCA9IHRoaXMucmVuZGVyU3luYyhvcHRpb25zKTtcblx0XHRyZXR1cm4gcGFyc2UoaHRtbCwgcmVhY3RQYXJzZU9wdGlvbnMpO1xuXHR9XG5cblx0YXN5bmMgbG9hZEZyb21GaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCB7cmVhZEZpbGV9ID0gZnMucHJvbWlzZXM7XG5cdFx0dGhpcy5fY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuXHR9XG5cblx0bG9hZEZyb21GaWxlU3luYyhmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy5fY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcblx0fVxuXG5cdGFzeW5jIHNhdmVUb0ZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHt3cml0ZUZpbGUsIG1rZGlyfSA9IGZzLnByb21pc2VzO1xuXHRcdGNvbnN0IGRpcmVjdG9yeVBhdGggPSBkaXJuYW1lKGZpbGVQYXRoKTtcblx0XHRhd2FpdCBta2RpcihkaXJlY3RvcnlQYXRoLCB7cmVjdXJzaXZlOiB0cnVlfSk7XG5cdFx0YXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCB0aGlzLl9jb250ZW50LCAndXRmOCcpO1xuXHR9XG5cblx0c2F2ZVRvRmlsZVN5bmMoZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IGRpcmVjdG9yeVBhdGggPSBkaXJuYW1lKGZpbGVQYXRoKTtcblx0XHRmcy5ta2RpclN5bmMoZGlyZWN0b3J5UGF0aCwge3JlY3Vyc2l2ZTogdHJ1ZX0pO1xuXHRcdGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIHRoaXMuX2NvbnRlbnQsICd1dGY4Jyk7XG5cdH1cblxuXHRwcml2YXRlIGlzQ2FjaGVFbmFibGVkKG9wdGlvbnM/OiBSZW5kZXJPcHRpb25zKTogYm9vbGVhbiB7XG5cdFx0aWYgKG9wdGlvbnM/LmNhY2hpbmcgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIG9wdGlvbnMuY2FjaGluZztcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fb3B0aW9ucz8ucmVuZGVyT3B0aW9ucz8uY2FjaGluZyA/PyBmYWxzZTtcblx0fVxuXG5cdHByaXZhdGUgY3JlYXRlUHJvY2Vzc29yKG9wdGlvbnM6IFJlbmRlck9wdGlvbnMpOiBhbnkge1xuXHRcdGNvbnN0IHByb2Nlc3NvciA9IHVuaWZpZWQoKS51c2UocmVtYXJrUGFyc2UpO1xuXG5cdFx0aWYgKG9wdGlvbnMuZ2ZtKSB7XG5cdFx0XHRwcm9jZXNzb3IudXNlKHJlbWFya0dmbSk7XG5cdFx0fVxuXG5cdFx0aWYgKG9wdGlvbnMudG9jKSB7XG5cdFx0XHRwcm9jZXNzb3IudXNlKHJlbWFya1RvYywge2hlYWRpbmc6ICd0b2N8dGFibGUgb2YgY29udGVudHMnfSk7XG5cdFx0fVxuXG5cdFx0aWYgKG9wdGlvbnMuZW1vamkpIHtcblx0XHRcdHByb2Nlc3Nvci51c2UocmVtYXJrRW1vamkpO1xuXHRcdH1cblxuXHRcdHByb2Nlc3Nvci51c2UocmVtYXJrUmVoeXBlKTtcblxuXHRcdGlmIChvcHRpb25zLnNsdWcpIHtcblx0XHRcdHByb2Nlc3Nvci51c2UocmVoeXBlU2x1Zyk7XG5cdFx0fVxuXG5cdFx0aWYgKG9wdGlvbnMuaGlnaGxpZ2h0KSB7XG5cdFx0XHRwcm9jZXNzb3IudXNlKHJlaHlwZUhpZ2hsaWdodCk7XG5cdFx0fVxuXG5cdFx0aWYgKG9wdGlvbnMubWF0aCkge1xuXHRcdFx0cHJvY2Vzc29yLnVzZShyZW1hcmtNYXRoKS51c2UocmVoeXBlS2F0ZXgpO1xuXHRcdH1cblxuXHRcdGlmIChvcHRpb25zLm1keCkge1xuXHRcdFx0cHJvY2Vzc29yLnVzZShyZW1hcmtNRFgpO1xuXHRcdH1cblxuXHRcdHByb2Nlc3Nvci51c2UocmVoeXBlU3RyaW5naWZ5KTtcblxuXHRcdHJldHVybiBwcm9jZXNzb3I7XG5cdH1cbn1cblxuZXhwb3J0IHtXcml0ciwgdHlwZSBXcml0ck9wdGlvbnMsIHR5cGUgUmVuZGVyT3B0aW9uc307XG5cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "writr",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0",
|
|
4
4
|
"description": "Markdown Rendering Simplified",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": "./dist/writr.js",
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"repository": "https://github.com/jaredwray/writr.git",
|
|
9
9
|
"author": "Jared Wray <me@jaredwray.com>",
|
|
10
10
|
"engines": {
|
|
11
|
-
"node": ">=
|
|
11
|
+
"node": ">=20"
|
|
12
12
|
},
|
|
13
13
|
"license": "MIT",
|
|
14
14
|
"keywords": [
|
|
@@ -40,40 +40,46 @@
|
|
|
40
40
|
"markdown-to-react"
|
|
41
41
|
],
|
|
42
42
|
"scripts": {
|
|
43
|
-
"clean": "rimraf ./dist ./coverage ./node_modules ./package-lock.json ./yarn.lock ./site/README.md ./site
|
|
43
|
+
"clean": "rimraf ./dist ./coverage ./node_modules ./package-lock.json ./yarn.lock ./site/README.md ./site/dist",
|
|
44
44
|
"build": "rimraf ./dist && tsc",
|
|
45
45
|
"test": "xo --fix && vitest run --coverage",
|
|
46
46
|
"prepare": "npm run build",
|
|
47
|
-
"website:build": "rimraf ./site/README.md ./site
|
|
48
|
-
"website:serve": "rimraf ./site/README.md ./site
|
|
47
|
+
"website:build": "rimraf ./site/README.md ./site/dist && npx docula build -s ./site -o ./site/dist",
|
|
48
|
+
"website:serve": "rimraf ./site/README.md ./site/dist && npx docula serve -s ./site -o ./site/dist"
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
|
-
"
|
|
51
|
+
"crypto": "^1.0.1",
|
|
52
|
+
"fs": "^0.0.1-security",
|
|
53
|
+
"html-react-parser": "^5.1.15",
|
|
54
|
+
"js-yaml": "^4.1.0",
|
|
55
|
+
"keyv": "^5.0.1",
|
|
52
56
|
"react": "^18.3.1",
|
|
53
57
|
"rehype-highlight": "^7.0.0",
|
|
54
|
-
"rehype-katex": "^7.0.
|
|
58
|
+
"rehype-katex": "^7.0.1",
|
|
55
59
|
"rehype-slug": "^6.0.0",
|
|
56
60
|
"rehype-stringify": "^10.0.0",
|
|
57
|
-
"remark-emoji": "^
|
|
61
|
+
"remark-emoji": "^5.0.1",
|
|
58
62
|
"remark-gfm": "^4.0.0",
|
|
59
63
|
"remark-math": "^6.0.0",
|
|
60
64
|
"remark-mdx": "^3.0.1",
|
|
61
65
|
"remark-parse": "^11.0.0",
|
|
62
66
|
"remark-rehype": "^11.1.0",
|
|
63
67
|
"remark-toc": "^9.0.0",
|
|
64
|
-
"
|
|
65
|
-
"unified": "^11.0.4"
|
|
68
|
+
"unified": "^11.0.5"
|
|
66
69
|
},
|
|
67
70
|
"devDependencies": {
|
|
68
|
-
"@
|
|
69
|
-
"@types/
|
|
70
|
-
"@
|
|
71
|
-
"
|
|
72
|
-
"
|
|
73
|
-
"
|
|
74
|
-
"
|
|
75
|
-
"
|
|
76
|
-
"
|
|
71
|
+
"@keyv/sqlite": "^4.0.1",
|
|
72
|
+
"@types/js-yaml": "^4.0.9",
|
|
73
|
+
"@types/node": "^22.5.1",
|
|
74
|
+
"@types/react": "^18.3.5",
|
|
75
|
+
"@vitest/coverage-v8": "^2.0.5",
|
|
76
|
+
"docula": "^0.9.0",
|
|
77
|
+
"rimraf": "^6.0.1",
|
|
78
|
+
"ts-node": "^10.9.2",
|
|
79
|
+
"typescript": "^5.5.4",
|
|
80
|
+
"vitest": "^2.0.5",
|
|
81
|
+
"webpack": "^5.94.0",
|
|
82
|
+
"xo": "^0.59.3"
|
|
77
83
|
},
|
|
78
84
|
"xo": {
|
|
79
85
|
"ignores": [
|
|
@@ -81,6 +87,8 @@
|
|
|
81
87
|
]
|
|
82
88
|
},
|
|
83
89
|
"files": [
|
|
84
|
-
"dist"
|
|
90
|
+
"dist",
|
|
91
|
+
"README.md",
|
|
92
|
+
"LICENSE"
|
|
85
93
|
]
|
|
86
94
|
}
|