writr 3.2.2 → 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 CHANGED
@@ -3,7 +3,7 @@
3
3
  ---
4
4
 
5
5
  ## Markdown Rendering Simplified
6
- [![Build](https://github.com/jaredwray/writr/actions/workflows/tests.yml/badge.svg)](https://github.com/jaredwray/writr/actions/workflows/tests.yml)
6
+ [![tests](https://github.com/jaredwray/writr/actions/workflows/tests.yml/badge.svg)](https://github.com/jaredwray/writr/actions/workflows/tests.yml)
7
7
  [![GitHub license](https://img.shields.io/github/license/jaredwray/writr)](https://github.com/jaredwray/writr/blob/master/LICENSE)
8
8
  [![codecov](https://codecov.io/gh/jaredwray/writr/branch/master/graph/badge.svg?token=1YdMesM07X)](https://codecov.io/gh/jaredwray/writr)
9
9
  [![npm](https://img.shields.io/npm/dm/writr)](https://npmjs.com/package/writr)
@@ -16,8 +16,9 @@
16
16
  - [License - MIT](#license)
17
17
 
18
18
  ## Features
19
- * Takes the complexity of Remark and makes it easy to use.
20
- * Up and Rendering in seconds with a simple API.
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(markdown); // <h1>Hello World 🙂</h1><p>This is a test.</p>
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(markdown, options); // <h1>Hello World ::-):</h1><p>This is a test.</p>
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
- ### `.engine`
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
- Accessing the underlying engine for this instance of Writr. This is a `Processor<Root, Root, Root, undefined, undefined>` fromt the unified `.use()` function. You can use this to add additional plugins to the engine.
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
- ### `.render(markdown: string, options?: RenderOptions): Promise<string>`
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
- interface RenderOptions {
124
- emoji?: boolean; // emoji support
125
- toc?: boolean; // table of contents generation
126
- slug?: boolean; // slug generation
127
- highlight?: boolean; // code highlighting
128
- gfm?: boolean; // github flavor markdown
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(markdown: string, options?: RenderOptions): string`
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 markdown = `# Hello World ::-):\n\n This is a test.`;
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(markdown: string, options?: RenderOptions, reactOptions?: HTMLReactParserOptions): Promise<React.JSX.Element />'
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 markdown = `# Hello World ::-):\n\n This is a test.`;
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(markdown: string, options?: RenderOptions, reactOptions?: HTMLReactParserOptions): React.JSX.Element'
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
- const markdown = `# Hello World ::-):\n\n This is a test.`;
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
- import { type HTMLReactParserOptions } from 'html-react-parser';
3
1
  import type React from 'react';
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
- constructor(options?: WritrOptions);
21
+ private _content;
22
+ private readonly _cache;
23
+ constructor(arguments1?: string | WritrOptions, arguments2?: WritrOptions);
21
24
  get options(): WritrOptions;
22
- render(markdown: string, options?: RenderOptions): Promise<string>;
23
- renderSync(markdown: string, options?: RenderOptions): string;
24
- renderReact(markdown: string, options?: RenderOptions, reactParseOptions?: HTMLReactParserOptions): Promise<string | React.JSX.Element | React.JSX.Element[]>;
25
- renderReactSync(markdown: string, options?: RenderOptions, reactParseOptions?: HTMLReactParserOptions): string | React.JSX.Element | React.JSX.Element[];
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
- constructor(options) {
40
- if (options) {
41
- this._options = { ...this._options, ...options };
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
- async render(markdown, options) {
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(markdown);
60
- return String(file);
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(markdown, options) {
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(markdown);
75
- return String(file);
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(markdown, options, reactParseOptions) {
82
- const html = await this.render(markdown, options);
172
+ async renderReact(options, reactParseOptions) {
173
+ const html = await this.render(options);
83
174
  return parse(html, reactParseOptions);
84
175
  }
85
- renderReactSync(markdown, options, reactParseOptions) {
86
- const html = this.renderSync(markdown, options);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdHIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvd3JpdHIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE9BQU8sRUFBWSxNQUFNLFNBQVMsQ0FBQztBQUMzQyxPQUFPLFdBQVcsTUFBTSxjQUFjLENBQUM7QUFDdkMsT0FBTyxZQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sVUFBVSxNQUFNLGFBQWEsQ0FBQztBQUNyQyxPQUFPLGVBQWUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLGVBQWUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLFNBQVMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxVQUFVLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sV0FBVyxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLFNBQVMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxXQUFXLE1BQU0sY0FBYyxDQUFDO0FBQ3ZDLE9BQU8sU0FBUyxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEtBQW9DLE1BQU0sbUJBQW1CLENBQUM7QUFrQnJFLE1BQU0sS0FBSztJQUNILE1BQU0sR0FBRyxPQUFPLEVBQUU7U0FDdkIsR0FBRyxDQUFDLFdBQVcsQ0FBQztTQUNoQixHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsK0JBQStCO1NBQzlDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyx3QkFBd0I7U0FDdkMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLG9CQUFvQjtTQUNyQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsMkJBQTJCO1NBQzdDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxnQ0FBZ0M7U0FDaEQsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLG1CQUFtQjtTQUNuQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsbUJBQW1CO1NBQ3BDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQyw0QkFBNEI7U0FDakQsR0FB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LENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFFRCxTQUFTLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRS9CLE9BQU8sU0FBUyxDQUFDO0lBQ2xCLENBQUM7Q0FDRDtBQUVELE9BQU8sRUFBQyxLQUFLLEVBQXdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3VuaWZpZWQsIFByb2Nlc3Nvcn0gZnJvbSAndW5pZmllZCc7XG5pbXBvcnQgcmVtYXJrUGFyc2UgZnJvbSAncmVtYXJrLXBhcnNlJztcbmltcG9ydCByZW1hcmtSZWh5cGUgZnJvbSAncmVtYXJrLXJlaHlwZSc7XG5pbXBvcnQgcmVoeXBlU2x1ZyBmcm9tICdyZWh5cGUtc2x1Zyc7XG5pbXBvcnQgcmVoeXBlSGlnaGxpZ2h0IGZyb20gJ3JlaHlwZS1oaWdobGlnaHQnO1xuaW1wb3J0IHJlaHlwZVN0cmluZ2lmeSBmcm9tICdyZWh5cGUtc3RyaW5naWZ5JztcbmltcG9ydCByZW1hcmtUb2MgZnJvbSAncmVtYXJrLXRvYyc7XG5pbXBvcnQgcmVtYXJrTWF0aCBmcm9tICdyZW1hcmstbWF0aCc7XG5pbXBvcnQgcmVoeXBlS2F0ZXggZnJvbSAncmVoeXBlLWthdGV4JztcbmltcG9ydCByZW1hcmtHZm0gZnJvbSAncmVtYXJrLWdmbSc7XG5pbXBvcnQgcmVtYXJrRW1vamkgZnJvbSAncmVtYXJrLWVtb2ppJztcbmltcG9ydCByZW1hcmtNRFggZnJvbSAncmVtYXJrLW1keCc7XG5pbXBvcnQgcGFyc2UsIHt0eXBlIEhUTUxSZWFjdFBhcnNlck9wdGlvbnN9IGZyb20gJ2h0bWwtcmVhY3QtcGFyc2VyJztcbmltcG9ydCB0eXBlIFJlYWN0IGZyb20gJ3JlYWN0JztcblxudHlwZSBXcml0ck9wdGlvbnMgPSB7XG5cdG9wZW5haT86IHN0cmluZzsgLy8gT3BlbmFpIGFwaSBrZXkgKGRlZmF1bHQ6IHVuZGVmaW5lZClcblx0cmVuZGVyT3B0aW9ucz86IFJlbmRlck9wdGlvbnM7IC8vIERlZmF1bHQgcmVuZGVyIG9wdGlvbnMgKGRlZmF1bHQ6IHVuZGVmaW5lZClcbn07XG5cbnR5cGUgUmVuZGVyT3B0aW9ucyA9IHtcblx0ZW1vamk/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.2.2",
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": ">=18.0.0"
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-output",
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-output && npx docula build -s ./site -o ./site-output",
48
- "website:serve": "rimraf ./site/README.md ./site-output && npx docula serve -s ./site -o ./site-output"
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
- "html-react-parser": "^5.1.10",
52
- "react": "^18.2.0",
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",
56
+ "react": "^18.3.1",
53
57
  "rehype-highlight": "^7.0.0",
54
- "rehype-katex": "^7.0.0",
58
+ "rehype-katex": "^7.0.1",
55
59
  "rehype-slug": "^6.0.0",
56
60
  "rehype-stringify": "^10.0.0",
57
- "remark-emoji": "^4.0.1",
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
- "ts-node": "^10.9.2",
65
- "unified": "^11.0.4"
68
+ "unified": "^11.0.5"
66
69
  },
67
70
  "devDependencies": {
68
- "@types/node": "^20.12.2",
69
- "@types/react": "^18.2.73",
70
- "@vitest/coverage-v8": "^1.4.0",
71
- "docula": "^0.5.2",
72
- "rimraf": "^5.0.5",
73
- "typescript": "^5.4.3",
74
- "vitest": "^1.4.0",
75
- "webpack": "^5.91.0",
76
- "xo": "^0.58.0"
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
  }