From 1ce21967b16ea1a008365d8462b8744a21c5c6ca Mon Sep 17 00:00:00 2001 From: Joshua Tag Howard Date: Mon, 28 Oct 2024 20:52:08 +0000 Subject: [PATCH 1/8] Add devcontainer --- .devcontainer/devcontainer.json | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .devcontainer/devcontainer.json diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000..ee45b8e4 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,22 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/typescript-node +{ + "name": "Node.js & TypeScript", + // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile + "image": "mcr.microsoft.com/devcontainers/typescript-node:1-22-bookworm" + + // Features to add to the dev container. More info: https://containers.dev/features. + // "features": {}, + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + // "forwardPorts": [], + + // Use 'postCreateCommand' to run commands after the container is created. + // "postCreateCommand": "yarn install", + + // Configure tool-specific properties. + // "customizations": {}, + + // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. + // "remoteUser": "root" +} From d23785d22da4cca5c841e04b1e20e18b7b1d138f Mon Sep 17 00:00:00 2001 From: Joshua Tag Howard Date: Mon, 28 Oct 2024 21:00:26 +0000 Subject: [PATCH 2/8] Typescript port --- .gitignore | 1 + README.md | 286 ++++++----- package.json | 40 +- src/index.d.ts | 18 +- src/index.js | 231 --------- src/index.tsx | 216 +++++++++ src/lib/AstRenderer.js | 186 ------- src/lib/AstRenderer.ts | 170 +++++++ .../{textStyleProps.js => textStyleProps.ts} | 0 src/lib/parser.js | 27 -- src/lib/parser.ts | 28 ++ src/lib/renderRules.js | 347 ------------- src/lib/renderRules.tsx | 455 ++++++++++++++++++ src/lib/{styles.js => styles.ts} | 0 src/lib/types.ts | 16 + src/lib/util/Token.js | 8 - src/lib/util/Token.ts | 35 ++ src/lib/util/cleanupTokens.js | 58 --- src/lib/util/cleanupTokens.ts | 63 +++ src/lib/util/convertAdditionalStyles.js | 25 - src/lib/util/convertAdditionalStyles.ts | 25 + src/lib/util/flattenInlineTokens.js | 14 - src/lib/util/flattenInlineTokens.ts | 19 + src/lib/util/getTokenTypeByToken.js | 44 -- src/lib/util/getTokenTypeByToken.ts | 49 ++ .../util/{getUniqueID.js => getUniqueID.ts} | 0 ...{groupTextTokens.js => groupTextTokens.ts} | 15 +- src/lib/util/hasParents.js | 9 - src/lib/util/hasParents.ts | 5 + ...mParagraph.js => omitListItemParagraph.ts} | 15 +- src/lib/util/openUrl.js | 12 - src/lib/util/openUrl.ts | 15 + src/lib/util/removeTextStyleProps.js | 15 - src/lib/util/removeTextStyleProps.ts | 17 + src/lib/util/renderInlineAsText.js | 13 - src/lib/util/renderInlineAsText.ts | 15 + src/lib/util/splitTextNonTextNodes.js | 14 - src/lib/util/stringToTokens.js | 10 - src/lib/util/stringToTokens.ts | 15 + .../util/{tokensToAST.js => tokensToAST.ts} | 38 +- tsconfig.json | 101 ++++ tsconfig.tsbuildinfo | 1 + 42 files changed, 1438 insertions(+), 1233 deletions(-) delete mode 100644 src/index.js create mode 100644 src/index.tsx delete mode 100644 src/lib/AstRenderer.js create mode 100644 src/lib/AstRenderer.ts rename src/lib/data/{textStyleProps.js => textStyleProps.ts} (100%) delete mode 100644 src/lib/parser.js create mode 100644 src/lib/parser.ts delete mode 100644 src/lib/renderRules.js create mode 100644 src/lib/renderRules.tsx rename src/lib/{styles.js => styles.ts} (100%) create mode 100644 src/lib/types.ts delete mode 100644 src/lib/util/Token.js create mode 100644 src/lib/util/Token.ts delete mode 100644 src/lib/util/cleanupTokens.js create mode 100644 src/lib/util/cleanupTokens.ts delete mode 100644 src/lib/util/convertAdditionalStyles.js create mode 100644 src/lib/util/convertAdditionalStyles.ts delete mode 100644 src/lib/util/flattenInlineTokens.js create mode 100644 src/lib/util/flattenInlineTokens.ts delete mode 100644 src/lib/util/getTokenTypeByToken.js create mode 100644 src/lib/util/getTokenTypeByToken.ts rename src/lib/util/{getUniqueID.js => getUniqueID.ts} (100%) rename src/lib/util/{groupTextTokens.js => groupTextTokens.ts} (50%) delete mode 100644 src/lib/util/hasParents.js create mode 100644 src/lib/util/hasParents.ts rename src/lib/util/{omitListItemParagraph.js => omitListItemParagraph.ts} (67%) delete mode 100644 src/lib/util/openUrl.js create mode 100644 src/lib/util/openUrl.ts delete mode 100644 src/lib/util/removeTextStyleProps.js create mode 100644 src/lib/util/removeTextStyleProps.ts delete mode 100644 src/lib/util/renderInlineAsText.js create mode 100644 src/lib/util/renderInlineAsText.ts delete mode 100644 src/lib/util/splitTextNonTextNodes.js delete mode 100644 src/lib/util/stringToTokens.js create mode 100644 src/lib/util/stringToTokens.ts rename src/lib/util/{tokensToAST.js => tokensToAST.ts} (54%) create mode 100644 tsconfig.json create mode 100644 tsconfig.tsbuildinfo diff --git a/.gitignore b/.gitignore index e3e176f1..e1e826b7 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ package-lock.json yarn-error.log yarn.lock .eslintcache +/dist \ No newline at end of file diff --git a/README.md b/README.md index dd58d859..bb352d88 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # React Native Markdown Display [![npm version](https://badge.fury.io/js/react-native-markdown-display.svg)](https://badge.fury.io/js/react-native-markdown-display) [![Known Vulnerabilities](https://snyk.io/test/github/iamacup/react-native-markdown-display/badge.svg)](https://snyk.io/test/github/iamacup/react-native-markdown-display) -**This is a fork of [iamacup/react-native-markdown-display](https://github.com/iamacup/react-native-markdown-display) that increases the depended upon versions of react to 18 and react-native to v0.68. This makes it compatible with Expo SDK 46** +\*\*This is a vendored copy of [@jonasmerlin/react-native-markdown-display](https://github.com/jonasmerlin/react-native-markdown-display) -It a 100% compatible CommonMark renderer, a react-native markdown renderer done right. This is __not__ a web-view markdown renderer but a renderer that uses native components for all its elements. These components can be overwritten and styled as needed. +It a 100% compatible CommonMark renderer, a react-native markdown renderer done right. This is **not** a web-view markdown renderer but a renderer that uses native components for all its elements. These components can be overwritten and styled as needed. ### Compatibility with react-native-markdown-renderer @@ -11,11 +11,13 @@ This is intended to be a replacement for react-native-markdown-renderer, with a ### Install #### Yarn + ```npm yarn add react-native-markdown-display ``` #### NPM + ```npm npm install -S react-native-markdown-display ``` @@ -56,32 +58,29 @@ const App: () => React$Node = () => { export default App; ``` - ### Props and Functions The `` object takes the following common props: -| Property | Default | Required | Description -| --- | --- | --- | --- -| `children` | N/A | `true` | The markdown string to render, or the [pre-processed tree](#pre-processing) -| `style` | [source](https://github.com/iamacup/react-native-markdown-display/blob/master/src/lib/styles.js) | `false` | An object to override the styling for the various rules, [see style section below](#rules-and-styles) for more info -| `mergeStyle` | `true` | `false` | If true, when a style is supplied, the individual items are merged with the default styles instead of overwriting them -| `rules` | [source](https://github.com/iamacup/react-native-markdown-display/blob/master/src/lib/renderRules.js) | `false` | An object of rules that specify how to render each markdown item, [see rules section below](#rules) for more info -| `onLinkPress` | `import { Linking } from 'react-native';` and `Linking.openURL(url);` | `false` | A handler function to change click behaviour, [see handling links section below](#handling-links) for more info -| `debugPrintTree` | `false` | `false` | Will print the AST tree to the console to help you see what the markdown is being translated to - +| Property | Default | Required | Description | +| ---------------- | ----------------------------------------------------------------------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------- | +| `children` | N/A | `true` | The markdown string to render, or the [pre-processed tree](#pre-processing) | +| `style` | [source](https://github.com/iamacup/react-native-markdown-display/blob/master/src/lib/styles.js) | `false` | An object to override the styling for the various rules, [see style section below](#rules-and-styles) for more info | +| `mergeStyle` | `true` | `false` | If true, when a style is supplied, the individual items are merged with the default styles instead of overwriting them | +| `rules` | [source](https://github.com/iamacup/react-native-markdown-display/blob/master/src/lib/renderRules.js) | `false` | An object of rules that specify how to render each markdown item, [see rules section below](#rules) for more info | +| `onLinkPress` | `import { Linking } from 'react-native';` and `Linking.openURL(url);` | `false` | A handler function to change click behaviour, [see handling links section below](#handling-links) for more info | +| `debugPrintTree` | `false` | `false` | Will print the AST tree to the console to help you see what the markdown is being translated to | And some additional, less used options: -| Property | Default | Required | Description -| --- | --- | --- | --- -| `renderer` | `instanceOf(AstRenderer)` | `false` | Used to specify a custom renderer, you can not use the rules or styles props with a custom renderer. -| `markdownit` | `instanceOf(MarkdownIt)` | `false` | A custom markdownit instance with your configuration, default is `MarkdownIt({typographer: true})` -| `maxTopLevelChildren` | `null` | `false` | If defined as a number will only render out first `n` many top level children, then will try to render out `topLevelMaxExceededItem` -| `topLevelMaxExceededItem` | `...` | `false` | Will render when `maxTopLevelChildren` is hit. Make sure to give it a key! -| `allowedImageHandlers` | `['data:image/png;base64', 'data:image/gif;base64', 'data:image/jpeg;base64', 'https://', 'http://']` | `false` | Any image that does not start with one of these will have the `defaultImageHandler` value prepended to it (unless `defaultImageHandler` is null in which case it won't try to render anything) -| `defaultImageHandler` | `http://` | `false` | Will be prepended to an image url if it does not start with something in the `allowedImageHandlers` array, if this is set to null, it won't try to recover but will just not render anything instead. - +| Property | Default | Required | Description | +| ------------------------- | ----------------------------------------------------------------------------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `renderer` | `instanceOf(AstRenderer)` | `false` | Used to specify a custom renderer, you can not use the rules or styles props with a custom renderer. | +| `markdownit` | `instanceOf(MarkdownIt)` | `false` | A custom markdownit instance with your configuration, default is `MarkdownIt({typographer: true})` | +| `maxTopLevelChildren` | `null` | `false` | If defined as a number will only render out first `n` many top level children, then will try to render out `topLevelMaxExceededItem` | +| `topLevelMaxExceededItem` | `...` | `false` | Will render when `maxTopLevelChildren` is hit. Make sure to give it a key! | +| `allowedImageHandlers` | `['data:image/png;base64', 'data:image/gif;base64', 'data:image/jpeg;base64', 'https://', 'http://']` | `false` | Any image that does not start with one of these will have the `defaultImageHandler` value prepended to it (unless `defaultImageHandler` is null in which case it won't try to render anything) | +| `defaultImageHandler` | `http://` | `false` | Will be prepended to an image url if it does not start with something in the `allowedImageHandlers` array, if this is set to null, it won't try to recover but will just not render anything instead. | # Syntax Support @@ -97,14 +96,13 @@ And some additional, less used options: ###### h6 Heading ``` -| iOS | Android -| --- | --- -| | +| iOS | Android | +| ----------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- | +| | |

-
Horizontal Rules

@@ -119,16 +117,13 @@ And some additional, less used options: Some text below ``` -| iOS | Android -| --- | --- -| | - +| iOS | Android | +| ----------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- | +| | |

- -
Emphasis

@@ -144,14 +139,13 @@ And some additional, less used options: ~~Strikethrough~~ ``` -| iOS | Android -| --- | --- -| | +| iOS | Android | +| ----------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- | +| | |

-
Blockquotes

@@ -161,14 +155,13 @@ And some additional, less used options: > > > ...or with spaces between arrows. ``` -| iOS | Android -| --- | --- -| | +| iOS | Android | +| ----------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- | +| | |

-
Lists

@@ -195,48 +188,47 @@ And some additional, less used options: 58. bar ``` -| iOS | Android -| --- | --- -| | +| iOS | Android | +| ----------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- | +| | |

-
Code

``` Inline \`code\` - Indented code +Indented code // Some comments line 1 of code line 2 of code line 3 of code +Block code "fences" - Block code "fences" +\`\`\` +Sample text here... +\`\`\` - \`\`\` - Sample text here... - \`\`\` +Syntax highlighting - Syntax highlighting +\`\`\` js +var foo = function (bar) { +return bar++; +}; - \`\`\` js - var foo = function (bar) { - return bar++; - }; +console.log(foo(5)); +\`\`\` - console.log(foo(5)); - \`\`\` ``` | iOS | Android | --- | --- -| | +| |

@@ -246,24 +238,26 @@ And some additional, less used options:

``` - | Option | Description | - | ------ | ----------- | - | data | path to data files to supply the data that will be passed into templates. | - | engine | engine to be used for processing templates. Handlebars is the default. | - | ext | extension to be used for dest files. | - Right aligned columns +| Option | Description | +| ------ | ------------------------------------------------------------------------- | +| data | path to data files to supply the data that will be passed into templates. | +| engine | engine to be used for processing templates. Handlebars is the default. | +| ext | extension to be used for dest files. | + +Right aligned columns + +| Option | Description | +| -----: | ------------------------------------------------------------------------: | +| data | path to data files to supply the data that will be passed into templates. | +| engine | engine to be used for processing templates. Handlebars is the default. | +| ext | extension to be used for dest files. | - | Option | Description | - | ------:| -----------:| - | data | path to data files to supply the data that will be passed into templates. | - | engine | engine to be used for processing templates. Handlebars is the default. | - | ext | extension to be used for dest files. | ``` | iOS | Android | --- | --- -| | +| |

@@ -272,16 +266,18 @@ And some additional, less used options:

``` - [link text](https://www.google.com) - [link with title](https://www.google.com "title text!") +[link text](https://www.google.com) + +[link with title](https://www.google.com 'title text!') + +Autoconverted link https://www.google.com (enable linkify to see) - Autoconverted link https://www.google.com (enable linkify to see) ``` | iOS | Android | --- | --- -| | +| |

@@ -290,21 +286,23 @@ And some additional, less used options:

``` - ![Minion](https://octodex.github.com/images/minion.png) - ![Stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg "The Stormtroopocat") - Like links, Images also have a footnote style syntax +![Minion](https://octodex.github.com/images/minion.png) +![Stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg 'The Stormtroopocat') - ![Alt text][id] +Like links, Images also have a footnote style syntax - With a reference later in the document defining the URL location: +![Alt text][id] + +With a reference later in the document defining the URL location: + +[id]: https://octodex.github.com/images/dojocat.jpg 'The Dojocat' - [id]: https://octodex.github.com/images/dojocat.jpg "The Dojocat" ``` | iOS | Android | --- | --- -| | +| |

@@ -314,20 +312,22 @@ And some additional, less used options:

``` - Enable typographer option to see result. - (c) (C) (r) (R) (tm) (TM) (p) (P) +- +Enable typographer option to see result. - test.. test... test..... test?..... test!.... +(c) (C) (r) (R) (tm) (TM) (p) (P) +- - !!!!!! ???? ,, -- --- +test.. test... test..... test?..... test!.... - "Smartypants, double quotes" and 'single quotes' -``` +!!!!!! ???? ,, -- --- + +"Smartypants, double quotes" and 'single quotes' + +```` | iOS | Android | --- | --- -| | +| |

@@ -351,7 +351,7 @@ import { SafeAreaView, ScrollView, StatusBar } from 'react-native'; import Markdown, { MarkdownIt } from 'react-native-markdown-display'; import blockEmbedPlugin from 'markdown-it-block-embed'; -const markdownItInstance = +const markdownItInstance = MarkdownIt({typographer: true}) .use(blockEmbedPlugin, { containerClassName: "video-embed" @@ -386,7 +386,7 @@ const App: () => React$Node = () => { export default App; -``` +```` In the console, we will see the following rendered tree: @@ -401,15 +401,13 @@ body With the following error message: ``` -Warning, unknown render rule encountered: video. 'unknown' render rule used (by default, returns null - nothing rendered) +Warning, unknown render rule encountered: video. 'unknown' render rule used (by default, returns null - nothing rendered) ``` - #### Step 2 We need to create the **render rules** and **styles** to handle this new **'video'** component - ```jsx import React from 'react'; import { SafeAreaView, ScrollView, StatusBar } from 'react-native'; @@ -417,7 +415,7 @@ import { SafeAreaView, ScrollView, StatusBar } from 'react-native'; import Markdown, { MarkdownIt } from 'react-native-markdown-display'; import blockEmbedPlugin from 'markdown-it-block-embed'; -const markdownItInstance = +const markdownItInstance = MarkdownIt({typographer: true}) .use(blockEmbedPlugin, { containerClassName: "video-embed" @@ -455,7 +453,7 @@ const App: () => React$Node = () => { Return a video component instead of this text component! ); } - + }} > {copy} @@ -501,14 +499,15 @@ And all of the video properties needed to render something meaningful are on the You can do some additional debugging of what the markdown instance is spitting out like this: ```jsx -import Markdown, { MarkdownIt } from 'react-native-markdown-display'; +import Markdown, {MarkdownIt} from 'react-native-markdown-display'; import blockEmbedPlugin from 'markdown-it-block-embed'; -const markdownItInstance = - MarkdownIt({typographer: true}) - .use(blockEmbedPlugin, { - containerClassName: "video-embed" - }); +const markdownItInstance = MarkdownIt({typographer: true}).use( + blockEmbedPlugin, + { + containerClassName: 'video-embed', + }, +); const copy = ` # Some header @@ -523,7 +522,6 @@ console.log(astTree); //this contains the html that would be generated - not used by react-native-markdown-display but useful for reference const html = markdownItInstance.render(copy); console.log(html); - ``` The above code will output something like this: @@ -549,11 +547,9 @@ html:
``` -

-
All Markdown for Testing

@@ -712,7 +708,6 @@ Typographic Replacements

- # Rules and Styles ### How to style stuff @@ -723,11 +718,10 @@ Think of the implementation like applying styles in CSS. changes to the `body` e **Be careful when styling 'text':** the text rule is not applied to all rendered text, most notably list bullet points. If you want to, for instance, color all text, change the `body` style. -
Example

- + ```jsx import React from 'react'; @@ -783,7 +777,7 @@ export default App;

-### Styles +### Styles Styles are used to override how certain rules are styled. The existing implementation is [here](https://github.com/iamacup/react-native-markdown-display/blob/master/src/lib/styles.js) @@ -925,46 +919,45 @@ export default App;

- ### All rules and their associated styles: -| Render Rule | Style(s) | -| ------ | ----------- | -| `body` | `body` | -| `heading1` | `heading1` | -| `heading2` | `heading2` | -| `heading3` | `heading3` | -| `heading4` | `heading4` | -| `heading5` | `heading5` | -| `heading6` | `heading6` | -| `hr` | `hr` | -| `strong` | `strong` | -| `em` | `em` | -| `s` | `s` | -| `blockquote` | `blockquote` | -| `bullet_list` | `bullet_list` | -| `ordered_list` | `ordered_list` | -| `list_item` | `list_item` - This is a special case that contains a set of pseudo classes that don't align to the render rule: `ordered_list_icon`, `ordered_list_content`, `bullet_list_icon`, `bullet_list_content` | -| `code_inline` | `code_inline` | -| `code_block` | `code_block` | -| `fence` | `fence` | -| `table` | `table` | -| `thead` | `thead` | -| `tbody` | `tbody` | -| `th` | `th` | -| `tr` | `tr` | -| `td` | `td` | -| `link` | `link` | -| `blocklink` | `blocklink` | -| `image` | `image` | -| `text` | `text` | -| `textgroup` | `textgroup` | -| `paragraph` | `paragraph` | -| `hardbreak` | `hardbreak` | -| `softbreak` | `softbreak` | -| `pre` | `pre` | -| `inline` | `inline` | -| `span` | `span` | +| Render Rule | Style(s) | +| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `body` | `body` | +| `heading1` | `heading1` | +| `heading2` | `heading2` | +| `heading3` | `heading3` | +| `heading4` | `heading4` | +| `heading5` | `heading5` | +| `heading6` | `heading6` | +| `hr` | `hr` | +| `strong` | `strong` | +| `em` | `em` | +| `s` | `s` | +| `blockquote` | `blockquote` | +| `bullet_list` | `bullet_list` | +| `ordered_list` | `ordered_list` | +| `list_item` | `list_item` - This is a special case that contains a set of pseudo classes that don't align to the render rule: `ordered_list_icon`, `ordered_list_content`, `bullet_list_icon`, `bullet_list_content` | +| `code_inline` | `code_inline` | +| `code_block` | `code_block` | +| `fence` | `fence` | +| `table` | `table` | +| `thead` | `thead` | +| `tbody` | `tbody` | +| `th` | `th` | +| `tr` | `tr` | +| `td` | `td` | +| `link` | `link` | +| `blocklink` | `blocklink` | +| `image` | `image` | +| `text` | `text` | +| `textgroup` | `textgroup` | +| `paragraph` | `paragraph` | +| `hardbreak` | `hardbreak` | +| `softbreak` | `softbreak` | +| `pre` | `pre` | +| `inline` | `inline` | +| `span` | `span` | # Handling Links @@ -988,7 +981,7 @@ const onLinkPress = (url) => { // some custom logic return false; } - + // return true to open with `Linking.openURL // return false to handle it yourself return true @@ -1071,7 +1064,6 @@ export default App;

- # Disabling Specific Types of Markdown You can dissable any type of markdown you want, which is very useful in a mobile environment, by passing the markdownit property like below. Note that for convenience we also export the `MarkdownIt` instance so you don't have to include it as a project dependency directly just to remove some types of markdown. @@ -1117,7 +1109,6 @@ export default App; A full list of things you can turn off is [here](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/commonmark.js) - ### Pre Processing It is possible to need to pre-process the data outside of this library ([related discussion here](https://github.com/iamacup/react-native-markdown-display/issues/79)). As a result, you can pass an AST tree directly as the children like this: @@ -1160,7 +1151,6 @@ const App: () => React$Node = () => { export default App; ``` - ### Other Notes This is a fork of [react-native-markdown-renderer](https://github.com/mientjan/react-native-markdown-renderer), a library that unfortunately has not been updated for some time so i took all of the outstanding pull requests from that library and tested + merged as necessary. diff --git a/package.json b/package.json index 455dcb34..617aa217 100644 --- a/package.json +++ b/package.json @@ -1,15 +1,12 @@ { - "name": "@jonasmerlin/react-native-markdown-display", - "version": "1.0.2", + "name": "@ukdanceblue/react-native-markdown-display", "description": "Markdown renderer for react-native, with CommonMark spec support + adds syntax extensions & sugar (URL autolinking, typographer), originally created by Mient-jan Stelling as react-native-markdown-renderer", "main": "src/index.js", "types": "src/index.d.ts", "scripts": { - "lint": "eslint --fix --cache ./src" + "build": "tsc", + "watch": "tsc -w" }, - "pre-commit": [ - "lint" - ], "repository": { "type": "git", "url": "git+https://github.com/jonasmerlin/react-native-markdown-display.git" @@ -24,33 +21,18 @@ ], "author": "Mient-jan Stelling and Tom Pickard + others from the community", "license": "MIT", - "bugs": { - "url": "https://github.com/jonasmerlin/react-native-markdown-display/issues" - }, - "homepage": "https://github.com/jonasmerlin/react-native-markdown-display/", "dependencies": { - "css-to-react-native": "^3.0.0", - "markdown-it": "^13.0.1", - "prop-types": "^15.8.1", - "react-native-fit-image": "^1.5.5" + "css-to-react-native": "^3.2.0", + "markdown-it": "^14.1.0" }, "peerDependencies": { - "react": "^16.2.0 || ^18.0.0", - "react-native": ">=0.50.4" + "react": ">=18.0.0", + "react-native": ">=0.76.0" }, "devDependencies": { - "@types/markdown-it": "^12.2.3", - "@types/react-native": ">=0.67.7", - "@babel/core": "^7.17.10", - "@babel/runtime": "^7.17.9", - "@react-native-community/eslint-config": "^3.0.2", - "@typescript-eslint/parser": "^5.23.0", - "eslint": "^8.15.0", - "json-schema": "^0.4.0", - "pre-commit": "1.2.2", - "typescript": "^4.6.4" - }, - "directories": { - "doc": "doc" + "@types/markdown-it": "^14.1.2", + "@types/react": "^18.0.0", + "react-native": "^0.76.0", + "typescript": "^5.6.3" } } diff --git a/src/index.d.ts b/src/index.d.ts index ae8e8e01..ca5ed4b6 100644 --- a/src/index.d.ts +++ b/src/index.d.ts @@ -1,8 +1,8 @@ // tslint:disable:max-classes-per-file -import MarkdownIt from 'markdown-it'; -import Token from 'markdown-it/lib/token'; -import {ComponentType, ReactNode} from 'react'; -import {StyleSheet, View} from 'react-native'; +import MarkdownIt from "markdown-it"; +import Token from "markdown-it/lib/token"; +import { ComponentType, ReactNode } from "react"; +import { StyleSheet, View } from "react-native"; export function getUniqueID(): string; export function openUrl(url: string): void; @@ -24,7 +24,7 @@ export type RenderLinkFunction = ( children: ReactNode[], parentNodes: ASTNode[], styles: any, - onLinkPress?: (url: string) => boolean, + onLinkPress?: (url: string) => boolean ) => ReactNode; export type RenderImageFunction = ( @@ -33,7 +33,7 @@ export type RenderImageFunction = ( parentNodes: ASTNode[], styles: any, allowedImageHandlers: string[], - defaultImageHandler: string, + defaultImageHandler: string | null ) => ReactNode; export interface RenderRules { @@ -71,12 +71,12 @@ export class AstRenderer { export function parser( source: string, renderer: (node: ASTNode) => View, - parser: MarkdownParser, + parser: MarkdownParser ): any; export function stringToTokens( source: string, - markdownIt: MarkdownParser, + markdownIt: MarkdownParser ): Token[]; export function tokensToAST(tokens: ReadonlyArray): ASTNode[]; @@ -95,5 +95,5 @@ export interface MarkdownProps { type MarkdownStatic = ComponentType; export const Markdown: MarkdownStatic; export type Markdown = MarkdownStatic; -export {MarkdownIt}; +export { MarkdownIt }; export default Markdown; diff --git a/src/index.js b/src/index.js deleted file mode 100644 index 59afec7c..00000000 --- a/src/index.js +++ /dev/null @@ -1,231 +0,0 @@ -/** - * Base Markdown component - * @author Mient-jan Stelling + contributors - */ - -import React, {useMemo} from 'react'; -import {Text, StyleSheet} from 'react-native'; -import PropTypes from 'prop-types'; -import parser from './lib/parser'; -import getUniqueID from './lib/util/getUniqueID'; -import hasParents from './lib/util/hasParents'; -import openUrl from './lib/util/openUrl'; -import tokensToAST from './lib/util/tokensToAST'; -import renderRules from './lib/renderRules'; -import AstRenderer from './lib/AstRenderer'; -import MarkdownIt from 'markdown-it'; -import removeTextStyleProps from './lib/util/removeTextStyleProps'; -import {styles} from './lib/styles'; -import {stringToTokens} from './lib/util/stringToTokens'; -import FitImage from 'react-native-fit-image'; -import textStyleProps from './lib/data/textStyleProps'; - -export { - getUniqueID, - openUrl, - hasParents, - renderRules, - AstRenderer, - parser, - stringToTokens, - tokensToAST, - MarkdownIt, - styles, - removeTextStyleProps, - FitImage, - textStyleProps, -}; - -// we use StyleSheet.flatten here to make sure we have an object, in case someone -// passes in a StyleSheet.create result to the style prop -const getStyle = (mergeStyle, style) => { - let useStyles = {}; - - if (mergeStyle === true && style !== null) { - // make sure we get anything user defuned - Object.keys(style).forEach((value) => { - useStyles[value] = { - ...StyleSheet.flatten(style[value]), - }; - }); - - // combine any existing styles - Object.keys(styles).forEach((value) => { - useStyles[value] = { - ...styles[value], - ...StyleSheet.flatten(style[value]), - }; - }); - } else { - useStyles = { - ...styles, - }; - - if (style !== null) { - Object.keys(style).forEach((value) => { - useStyles[value] = { - ...StyleSheet.flatten(style[value]), - }; - }); - } - } - - Object.keys(useStyles).forEach((value) => { - useStyles['_VIEW_SAFE_' + value] = removeTextStyleProps(useStyles[value]); - }); - - return StyleSheet.create(useStyles); -}; - -const getRenderer = ( - renderer, - rules, - style, - mergeStyle, - onLinkPress, - maxTopLevelChildren, - topLevelMaxExceededItem, - allowedImageHandlers, - defaultImageHandler, - debugPrintTree, -) => { - if (renderer && rules) { - console.warn( - 'react-native-markdown-display you are using renderer and rules at the same time. This is not possible, props.rules is ignored', - ); - } - - if (renderer && style) { - console.warn( - 'react-native-markdown-display you are using renderer and style at the same time. This is not possible, props.style is ignored', - ); - } - - // these checks are here to prevent extra overhead. - if (renderer) { - if (!(typeof renderer === 'function') || renderer instanceof AstRenderer) { - return renderer; - } else { - throw new Error( - 'Provided renderer is not compatible with function or AstRenderer. please change', - ); - } - } else { - let useStyles = getStyle(mergeStyle, style); - - return new AstRenderer( - { - ...renderRules, - ...(rules || {}), - }, - useStyles, - onLinkPress, - maxTopLevelChildren, - topLevelMaxExceededItem, - allowedImageHandlers, - defaultImageHandler, - debugPrintTree, - ); - } -}; - -const Markdown = React.memo( - ({ - children, - renderer = null, - rules = null, - style = null, - mergeStyle = true, - markdownit = MarkdownIt({ - typographer: true, - }), - onLinkPress, - maxTopLevelChildren = null, - topLevelMaxExceededItem = ..., - allowedImageHandlers = [ - 'data:image/png;base64', - 'data:image/gif;base64', - 'data:image/jpeg;base64', - 'https://', - 'http://', - ], - defaultImageHandler = 'https://', - debugPrintTree = false, - }) => { - const momoizedRenderer = useMemo( - () => - getRenderer( - renderer, - rules, - style, - mergeStyle, - onLinkPress, - maxTopLevelChildren, - topLevelMaxExceededItem, - allowedImageHandlers, - defaultImageHandler, - debugPrintTree, - ), - [ - maxTopLevelChildren, - onLinkPress, - renderer, - rules, - style, - mergeStyle, - topLevelMaxExceededItem, - allowedImageHandlers, - defaultImageHandler, - debugPrintTree, - ], - ); - - const momoizedParser = useMemo(() => markdownit, [markdownit]); - - return parser(children, momoizedRenderer.render, momoizedParser); - }, -); - -Markdown.propTypes = { - children: PropTypes.oneOfType([PropTypes.node, PropTypes.array]).isRequired, - renderer: PropTypes.oneOfType([ - PropTypes.func, - PropTypes.instanceOf(AstRenderer), - ]), - onLinkPress: PropTypes.func, - maxTopLevelChildren: PropTypes.number, - topLevelMaxExceededItem: PropTypes.any, - rules: (props, propName, componentName) => { - let invalidProps = []; - const prop = props[propName]; - - if (!prop) { - return; - } - - if (typeof prop === 'object') { - invalidProps = Object.keys(prop).filter( - (key) => typeof prop[key] !== 'function', - ); - } - - if (typeof prop !== 'object') { - return new Error( - `Invalid prop \`${propName}\` supplied to \`${componentName}\`. Must be of shape {[index:string]:function} `, - ); - } else if (invalidProps.length > 0) { - return new Error( - `Invalid prop \`${propName}\` supplied to \`${componentName}\`. These ` + - `props are not of type function \`${invalidProps.join(', ')}\` `, - ); - } - }, - markdownit: PropTypes.instanceOf(MarkdownIt), - style: PropTypes.any, - mergeStyle: PropTypes.bool, - allowedImageHandlers: PropTypes.arrayOf(PropTypes.string), - defaultImageHandler: PropTypes.string, - debugPrintTree: PropTypes.bool, -}; - -export default Markdown; diff --git a/src/index.tsx b/src/index.tsx new file mode 100644 index 00000000..990d448a --- /dev/null +++ b/src/index.tsx @@ -0,0 +1,216 @@ +/* eslint-disable react-refresh/only-export-components */ +import MarkdownIt from "markdown-it"; +import type { ReactNode } from "react"; +import React, { useMemo } from "react"; +import type { TextStyle, ViewStyle } from "react-native"; +import { StyleSheet, Text } from "react-native"; + +import AstRenderer from "./lib/AstRenderer"; +import parser from "./lib/parser"; +import type { RenderRules } from "./lib/renderRules"; +import renderRules from "./lib/renderRules"; +import { styles } from "./lib/styles"; +import type { ASTNode } from "./lib/types"; +import removeTextStyleProps from "./lib/util/removeTextStyleProps"; + +function getStyle( + mergeStyle: boolean, + style: StyleSheet.NamedStyles | undefined +): ReturnType { + let useStyles: Record = {}; + + if (mergeStyle && style != null) { + Object.keys(style).forEach((value) => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + useStyles[value] = { + // @ts-expect-error this is fine + ...StyleSheet.flatten(style[value]), + }; + }); + + Object.keys(styles).forEach((value) => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + useStyles[value] = { + // @ts-expect-error this is fine + ...styles[value], + // @ts-expect-error this is fine + ...StyleSheet.flatten(style[value]), + }; + }); + } else { + // @ts-expect-error this is fine + useStyles = { + ...styles, + }; + + if (style != null) { + Object.keys(style).forEach((value) => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + useStyles[value] = { + // @ts-expect-error this is fine + ...StyleSheet.flatten(style[value]), + }; + }); + } + } + + Object.keys(useStyles).forEach((value) => { + useStyles[`_VIEW_SAFE_${value}`] = removeTextStyleProps(useStyles[value]); + }); + + return StyleSheet.create(useStyles); +} + +const getRenderer = ( + renderer: AstRenderer | undefined, + rules: RenderRules | undefined, + style: StyleSheet.NamedStyles | undefined, + mergeStyle: boolean, + onLinkPress: ((url: string) => boolean) | undefined, + maxTopLevelChildren: number | null, + topLevelMaxExceededItem: React.ReactNode, + allowedImageHandlers: string[], + defaultImageHandler: string, + debugPrintTree: boolean +): AstRenderer => { + if (renderer && rules) { + console.warn( + "react-native-markdown-display you are using renderer and rules at the same time. This is not possible, props.rules is ignored" + ); + } + + if (renderer && style) { + console.warn( + "react-native-markdown-display you are using renderer and style at the same time. This is not possible, props.style is ignored" + ); + } + + if (renderer) { + if ( + !(typeof renderer === "function") || + (renderer as unknown) instanceof AstRenderer + ) { + return renderer; + } else { + throw new TypeError( + "Provided renderer is not compatible with function or AstRenderer. please change" + ); + } + } else { + const useStyles = getStyle(mergeStyle, style); + + return new AstRenderer( + { + ...renderRules, + ...(rules ?? {}), + }, + useStyles, + onLinkPress, + maxTopLevelChildren, + topLevelMaxExceededItem, + allowedImageHandlers, + defaultImageHandler, + debugPrintTree + ); + } +}; + +export interface MarkdownProps { + children: string; + rules?: RenderRules; + style?: StyleSheet.NamedStyles; + renderer?: AstRenderer; + markdownit?: MarkdownIt; + mergeStyle?: boolean; + debugPrintTree?: boolean; + onLinkPress?: (url: string) => boolean; +} + +const Markdown: React.FC< + MarkdownProps & { + maxTopLevelChildren: number | null; + topLevelMaxExceededItem: React.ReactNode; + allowedImageHandlers: string[]; + defaultImageHandler: string; + } +> = React.memo( + ({ + children, + renderer = undefined, + rules = undefined, + style = undefined, + mergeStyle = true, + markdownit = MarkdownIt({ + typographer: true, + }), + onLinkPress, + maxTopLevelChildren = null, + topLevelMaxExceededItem = ..., + allowedImageHandlers = [ + "data:image/png;base64", + "data:image/gif;base64", + "data:image/jpeg;base64", + "https://", + "http://", + ], + defaultImageHandler = "https://", + debugPrintTree = false, + }: MarkdownProps & { + maxTopLevelChildren: number | null; + topLevelMaxExceededItem: React.ReactNode; + allowedImageHandlers: string[]; + defaultImageHandler: string; + }) => { + const momoizedRenderer = useMemo( + () => + getRenderer( + renderer, + rules, + style, + mergeStyle, + onLinkPress, + maxTopLevelChildren, + topLevelMaxExceededItem, + allowedImageHandlers, + defaultImageHandler, + debugPrintTree + ), + [ + maxTopLevelChildren, + onLinkPress, + renderer, + rules, + style, + mergeStyle, + topLevelMaxExceededItem, + allowedImageHandlers, + defaultImageHandler, + debugPrintTree, + ] + ); + + const memoizedParser = useMemo(() => markdownit, [markdownit]); + + return parser( + children, + (nodes: readonly ASTNode[]): ReactNode => momoizedRenderer.render(nodes), + memoizedParser + ); + } +); + +export default Markdown; + +export { default as MarkdownIt } from "markdown-it"; +export { default as AstRenderer } from "./lib/AstRenderer"; +export { default as textStyleProps } from "./lib/data/textStyleProps"; +export { default as parser } from "./lib/parser"; +export { default as renderRules } from "./lib/renderRules"; +export { styles } from "./lib/styles"; +export { default as getUniqueID } from "./lib/util/getUniqueID"; +export { default as hasParents } from "./lib/util/hasParents"; +export { default as openUrl } from "./lib/util/openUrl"; +export { default as removeTextStyleProps } from "./lib/util/removeTextStyleProps"; +export { stringToTokens } from "./lib/util/stringToTokens"; +export { default as tokensToAST } from "./lib/util/tokensToAST"; + diff --git a/src/lib/AstRenderer.js b/src/lib/AstRenderer.js deleted file mode 100644 index 608e9455..00000000 --- a/src/lib/AstRenderer.js +++ /dev/null @@ -1,186 +0,0 @@ -import {StyleSheet} from 'react-native'; - -import getUniqueID from './util/getUniqueID'; -import convertAdditionalStyles from './util/convertAdditionalStyles'; - -import textStyleProps from './data/textStyleProps'; - -export default class AstRenderer { - /** - * - * @param {Object.} renderRules - * @param {any} style - */ - constructor( - renderRules, - style, - onLinkPress, - maxTopLevelChildren, - topLevelMaxExceededItem, - allowedImageHandlers, - defaultImageHandler, - debugPrintTree, - ) { - this._renderRules = renderRules; - this._style = style; - this._onLinkPress = onLinkPress; - this._maxTopLevelChildren = maxTopLevelChildren; - this._topLevelMaxExceededItem = topLevelMaxExceededItem; - this._allowedImageHandlers = allowedImageHandlers; - this._defaultImageHandler = defaultImageHandler; - this._debugPrintTree = debugPrintTree; - } - - /** - * - * @param {string} type - * @return {string} - */ - getRenderFunction = (type) => { - const renderFunction = this._renderRules[type]; - - if (!renderFunction) { - console.warn( - `Warning, unknown render rule encountered: ${type}. 'unknown' render rule used (by default, returns null - nothing rendered)`, - ); - return this._renderRules.unknown; - } - - return renderFunction; - }; - - /** - * - * @param node - * @param parentNodes - * @return {*} - */ - renderNode = (node, parentNodes, isRoot = false) => { - const renderFunction = this.getRenderFunction(node.type); - const parents = [...parentNodes]; - - if (this._debugPrintTree === true) { - let str = ''; - - for (let a = 0; a < parents.length; a++) { - str = str + '-'; - } - - console.log(`${str}${node.type}`); - } - - parents.unshift(node); - - // calculate the children first - let children = node.children.map((value) => { - return this.renderNode(value, parents); - }); - - // render any special types of nodes that have different renderRule function signatures - - if (node.type === 'link' || node.type === 'blocklink') { - return renderFunction( - node, - children, - parentNodes, - this._style, - this._onLinkPress, - ); - } - - if (node.type === 'image') { - return renderFunction( - node, - children, - parentNodes, - this._style, - this._allowedImageHandlers, - this._defaultImageHandler, - ); - } - - // We are at the bottom of some tree - grab all the parent styles - // this effectively grabs the styles from parents and - // applies them in order of priority parent (least) to child (most) - // to allow styling global, then lower down things individually - - // we have to handle list_item seperately here because they have some child - // pseudo classes that need the additional style props from parents passed down to them - if (children.length === 0 || node.type === 'list_item') { - const styleObj = {}; - - for (let a = parentNodes.length - 1; a > -1; a--) { - // grab and additional attributes specified by markdown-it - let refStyle = {}; - - if ( - parentNodes[a].attributes && - parentNodes[a].attributes.style && - typeof parentNodes[a].attributes.style === 'string' - ) { - refStyle = convertAdditionalStyles(parentNodes[a].attributes.style); - } - - // combine in specific styles for the object - if (this._style[parentNodes[a].type]) { - refStyle = { - ...refStyle, - ...StyleSheet.flatten(this._style[parentNodes[a].type]), - }; - - // workaround for list_items and their content cascading down the tree - if (parentNodes[a].type === 'list_item') { - let contentStyle = {}; - - if (parentNodes[a + 1].type === 'bullet_list') { - contentStyle = this._style.bullet_list_content; - } else if (parentNodes[a + 1].type === 'ordered_list') { - contentStyle = this._style.ordered_list_content; - } - - refStyle = { - ...refStyle, - ...StyleSheet.flatten(contentStyle), - }; - } - } - - // then work out if any of them are text styles that should be used in the end. - const arr = Object.keys(refStyle); - - for (let b = 0; b < arr.length; b++) { - if (textStyleProps.includes(arr[b])) { - styleObj[arr[b]] = refStyle[arr[b]]; - } - } - } - - return renderFunction(node, children, parentNodes, this._style, styleObj); - } - - // cull top level children - - if ( - isRoot === true && - this._maxTopLevelChildren && - children.length > this._maxTopLevelChildren - ) { - children = children.slice(0, this._maxTopLevelChildren); - children.push(this._topLevelMaxExceededItem); - } - - // render anythign else that has a normal signature - - return renderFunction(node, children, parentNodes, this._style); - }; - - /** - * - * @param nodes - * @return {*} - */ - render = (nodes) => { - const root = {type: 'body', key: getUniqueID(), children: nodes}; - return this.renderNode(root, [], true); - }; -} diff --git a/src/lib/AstRenderer.ts b/src/lib/AstRenderer.ts new file mode 100644 index 00000000..0543e79c --- /dev/null +++ b/src/lib/AstRenderer.ts @@ -0,0 +1,170 @@ +import { StyleSheet, ViewStyle } from "react-native"; + +import getUniqueID from "./util/getUniqueID"; +import convertAdditionalStyles from "./util/convertAdditionalStyles"; + +import textStyleProps from "./data/textStyleProps"; +import { RenderRules } from "./renderRules"; +import { ASTNode } from "./types"; +import { ReactNode } from "react"; + +export default class AstRenderer { + constructor( + private renderRules: RenderRules, + private style: Record, + private onLinkPress: ((url: string) => boolean) | undefined, + private maxTopLevelChildren: number | null, + private topLevelMaxExceededItem: React.ReactNode, + private allowedImageHandlers: string[], + private defaultImageHandler: string, + private debugPrintTree: boolean + ) {} + + getRenderFunction(type: R): RenderRules[R] { + const renderFunction = this.renderRules[type]; + + if (!renderFunction) { + console.warn( + `Warning, unknown render rule encountered: ${type}. 'unknown' render rule used (by default, returns null - nothing rendered)` + ); + return this.renderRules.unknown; + } + + return renderFunction; + } + + renderNode(node: ASTNode, parentNodes: ASTNode[], isRoot = false): ReactNode { + const parents = [...parentNodes]; + + if (this.debugPrintTree === true) { + let str = ""; + + for (let a = 0; a < parents.length; a++) { + str = str + "-"; + } + + console.log(`${str}${node.type}`); + } + + parents.unshift(node); + + // calculate the children first + let children = node.children.map((value) => { + return this.renderNode(value, parents); + }); + + // render any special types of nodes that have different renderRule function signatures + + if (node.type === "link" || node.type === "blocklink") { + return this.getRenderFunction(node.type)( + node, + children, + parentNodes, + this.style, + this.onLinkPress + ); + } + + if (node.type === "image") { + return this.getRenderFunction(node.type)( + node, + children, + parentNodes, + this.style, + this.allowedImageHandlers, + this.defaultImageHandler + ); + } + + // We are at the bottom of some tree - grab all the parent styles + // this effectively grabs the styles from parents and + // applies them in order of priority parent (least) to child (most) + // to allow styling global, then lower down things individually + + // we have to handle list_item seperately here because they have some child + // pseudo classes that need the additional style props from parents passed down to them + if (children.length === 0 || node.type === "list_item") { + const styleObj = {}; + + for (let a = parentNodes.length - 1; a > -1; a--) { + // grab and additional attributes specified by markdown-it + let refStyle = {}; + + if ( + parentNodes[a].attributes && + parentNodes[a].attributes?.style && + typeof parentNodes[a].attributes?.style === "string" + ) { + refStyle = convertAdditionalStyles(parentNodes[a].attributes?.style); + } + + // combine in specific styles for the object + if (this.style[parentNodes[a].type]) { + refStyle = { + ...refStyle, + ...StyleSheet.flatten(this.style[parentNodes[a].type]), + }; + + // workaround for list_items and their content cascading down the tree + if (parentNodes[a].type === "list_item") { + let contentStyle = {}; + + if (parentNodes[a + 1].type === "bullet_list") { + contentStyle = this.style.bullet_list_content; + } else if (parentNodes[a + 1].type === "ordered_list") { + contentStyle = this.style.ordered_list_content; + } + + refStyle = { + ...refStyle, + ...StyleSheet.flatten(contentStyle), + }; + } + } + + // then work out if any of them are text styles that should be used in the end. + const arr = Object.keys(refStyle) as (keyof ViewStyle)[]; + + for (let b = 0; b < arr.length; b++) { + if (textStyleProps.includes(arr[b])) { + // @ts-expect-error - this is fine + styleObj[arr[b]] = refStyle[arr[b]]; + } + } + } + + return this.getRenderFunction(node.type)( + node, + children, + parentNodes, + this.style, + styleObj + ); + } + + // cull top level children + + if ( + isRoot === true && + this.maxTopLevelChildren && + children.length > this.maxTopLevelChildren + ) { + children = children.slice(0, this.maxTopLevelChildren); + children.push(this.topLevelMaxExceededItem); + } + + // render anythign else that has a normal signature + + return this.getRenderFunction(node.type)( + node, + children, + parentNodes, + this.style + ); + } + + render(nodes: ReadonlyArray): ReactNode { + const root: ASTNode = { type: "body", key: getUniqueID(), children: nodes }; + return this.renderNode(root, [], true); + } +} diff --git a/src/lib/data/textStyleProps.js b/src/lib/data/textStyleProps.ts similarity index 100% rename from src/lib/data/textStyleProps.js rename to src/lib/data/textStyleProps.ts diff --git a/src/lib/parser.js b/src/lib/parser.js deleted file mode 100644 index 4e897933..00000000 --- a/src/lib/parser.js +++ /dev/null @@ -1,27 +0,0 @@ -import tokensToAST from './util/tokensToAST'; -import {stringToTokens} from './util/stringToTokens'; -import {cleanupTokens} from './util/cleanupTokens'; -import groupTextTokens from './util/groupTextTokens'; -import omitListItemParagraph from './util/omitListItemParagraph'; - -/** - * - * @param {string} source - * @param {function} [renderer] - * @param {AstRenderer} [markdownIt] - * @return {View} - */ -export default function parser(source, renderer, markdownIt) { - if (Array.isArray(source)) { - return renderer(source); - } - - let tokens = stringToTokens(source, markdownIt); - tokens = cleanupTokens(tokens); - tokens = groupTextTokens(tokens); - tokens = omitListItemParagraph(tokens); - - const astTree = tokensToAST(tokens); - - return renderer(astTree); -} diff --git a/src/lib/parser.ts b/src/lib/parser.ts new file mode 100644 index 00000000..ad8975ac --- /dev/null +++ b/src/lib/parser.ts @@ -0,0 +1,28 @@ +import tokensToAST from "./util/tokensToAST"; +import { stringToTokens } from "./util/stringToTokens"; +import { cleanupTokens } from "./util/cleanupTokens"; +import groupTextTokens from "./util/groupTextTokens"; +import omitListItemParagraph from "./util/omitListItemParagraph"; +import { ReactNode } from "react"; +import MarkdownIt, { Token } from "markdown-it"; +import TextToken from "./util/Token"; +import { ASTNode } from "./types"; + +export default function parser( + source: string, + renderer: (source: ASTNode[]) => ReactNode, + markdownIt: MarkdownIt +): ReactNode { + if (Array.isArray(source)) { + return renderer(source); + } + + let tokens: (Token | TextToken)[] = stringToTokens(source, markdownIt); + tokens = cleanupTokens(tokens); + tokens = groupTextTokens(tokens); + tokens = omitListItemParagraph(tokens); + + const astTree = tokensToAST(tokens); + + return renderer(astTree); +} diff --git a/src/lib/renderRules.js b/src/lib/renderRules.js deleted file mode 100644 index 6f2ed8d4..00000000 --- a/src/lib/renderRules.js +++ /dev/null @@ -1,347 +0,0 @@ -import React from 'react'; -import { - Text, - TouchableWithoutFeedback, - View, - Platform, - StyleSheet, -} from 'react-native'; -import FitImage from 'react-native-fit-image'; - -import openUrl from './util/openUrl'; -import hasParents from './util/hasParents'; - -import textStyleProps from './data/textStyleProps'; - -const renderRules = { - // when unknown elements are introduced, so it wont break - unknown: (node, children, parent, styles) => null, - - // The main container - body: (node, children, parent, styles) => ( - - {children} - - ), - - // Headings - heading1: (node, children, parent, styles) => ( - - {children} - - ), - heading2: (node, children, parent, styles) => ( - - {children} - - ), - heading3: (node, children, parent, styles) => ( - - {children} - - ), - heading4: (node, children, parent, styles) => ( - - {children} - - ), - heading5: (node, children, parent, styles) => ( - - {children} - - ), - heading6: (node, children, parent, styles) => ( - - {children} - - ), - - // Horizontal Rule - hr: (node, children, parent, styles) => ( - - ), - - // Emphasis - strong: (node, children, parent, styles) => ( - - {children} - - ), - em: (node, children, parent, styles) => ( - - {children} - - ), - s: (node, children, parent, styles) => ( - - {children} - - ), - - // Blockquotes - blockquote: (node, children, parent, styles) => ( - - {children} - - ), - - // Lists - bullet_list: (node, children, parent, styles) => ( - - {children} - - ), - ordered_list: (node, children, parent, styles) => ( - - {children} - - ), - // this is a unique and quite annoying render rule because it has - // child items that can be styled (the list icon and the list content) - // outside of the AST tree so there are some work arounds in the - // AST renderer specifically to get the styling right here - list_item: (node, children, parent, styles, inheritedStyles = {}) => { - // we need to grab any text specific stuff here that is applied on the list_item style - // and apply it onto bullet_list_icon. the AST renderer has some workaround code to make - // the content classes apply correctly to the child AST tree items as well - // as code that forces the creation of the inheritedStyles object for list_items - const refStyle = { - ...inheritedStyles, - ...StyleSheet.flatten(styles.list_item), - }; - - const arr = Object.keys(refStyle); - - const modifiedInheritedStylesObj = {}; - - for (let b = 0; b < arr.length; b++) { - if (textStyleProps.includes(arr[b])) { - modifiedInheritedStylesObj[arr[b]] = refStyle[arr[b]]; - } - } - - if (hasParents(parent, 'bullet_list')) { - return ( - - - {Platform.select({ - android: '\u2022', - ios: '\u00B7', - default: '\u2022', - })} - - {children} - - ); - } - - if (hasParents(parent, 'ordered_list')) { - const orderedListIndex = parent.findIndex( - (el) => el.type === 'ordered_list', - ); - - const orderedList = parent[orderedListIndex]; - let listItemNumber; - - if (orderedList.attributes && orderedList.attributes.start) { - listItemNumber = orderedList.attributes.start + node.index; - } else { - listItemNumber = node.index + 1; - } - - return ( - - - {listItemNumber} - {node.markup} - - {children} - - ); - } - - // we should not need this, but just in case - return ( - - {children} - - ); - }, - - // Code - code_inline: (node, children, parent, styles, inheritedStyles = {}) => ( - - {node.content} - - ), - code_block: (node, children, parent, styles, inheritedStyles = {}) => { - // we trim new lines off the end of code blocks because the parser sends an extra one. - let {content} = node; - - if ( - typeof node.content === 'string' && - node.content.charAt(node.content.length - 1) === '\n' - ) { - content = node.content.substring(0, node.content.length - 1); - } - - return ( - - {content} - - ); - }, - fence: (node, children, parent, styles, inheritedStyles = {}) => { - // we trim new lines off the end of code blocks because the parser sends an extra one. - let {content} = node; - - if ( - typeof node.content === 'string' && - node.content.charAt(node.content.length - 1) === '\n' - ) { - content = node.content.substring(0, node.content.length - 1); - } - - return ( - - {content} - - ); - }, - - // Tables - table: (node, children, parent, styles) => ( - - {children} - - ), - thead: (node, children, parent, styles) => ( - - {children} - - ), - tbody: (node, children, parent, styles) => ( - - {children} - - ), - th: (node, children, parent, styles) => ( - - {children} - - ), - tr: (node, children, parent, styles) => ( - - {children} - - ), - td: (node, children, parent, styles) => ( - - {children} - - ), - - // Links - link: (node, children, parent, styles, onLinkPress) => ( - openUrl(node.attributes.href, onLinkPress)}> - {children} - - ), - blocklink: (node, children, parent, styles, onLinkPress) => ( - openUrl(node.attributes.href, onLinkPress)} - style={styles.blocklink}> - {children} - - ), - - // Images - image: ( - node, - children, - parent, - styles, - allowedImageHandlers, - defaultImageHandler, - ) => { - const {src, alt} = node.attributes; - - // we check that the source starts with at least one of the elements in allowedImageHandlers - const show = - allowedImageHandlers.filter((value) => { - return src.toLowerCase().startsWith(value.toLowerCase()); - }).length > 0; - - if (show === false && defaultImageHandler === null) { - return null; - } - - const imageProps = { - indicator: true, - key: node.key, - style: styles._VIEW_SAFE_image, - source: { - uri: show === true ? src : `${defaultImageHandler}${src}`, - }, - }; - - if (alt) { - imageProps.accessible = true; - imageProps.accessibilityLabel = alt; - } - - return ; - }, - - // Text Output - text: (node, children, parent, styles, inheritedStyles = {}) => ( - - {node.content} - - ), - textgroup: (node, children, parent, styles) => ( - - {children} - - ), - paragraph: (node, children, parent, styles) => ( - - {children} - - ), - hardbreak: (node, children, parent, styles) => ( - - {'\n'} - - ), - softbreak: (node, children, parent, styles) => ( - - {'\n'} - - ), - - // Believe these are never used but retained for completeness - pre: (node, children, parent, styles) => ( - - {children} - - ), - inline: (node, children, parent, styles) => ( - - {children} - - ), - span: (node, children, parent, styles) => ( - - {children} - - ), -}; - -export default renderRules; diff --git a/src/lib/renderRules.tsx b/src/lib/renderRules.tsx new file mode 100644 index 00000000..926d7dea --- /dev/null +++ b/src/lib/renderRules.tsx @@ -0,0 +1,455 @@ +import type { ReactNode } from "react"; +import type { ViewStyle } from "react-native"; +import { + Platform, + StyleSheet, + Text, + TouchableWithoutFeedback, + View, +} from "react-native"; + +import textStyleProps from "./data/textStyleProps"; +import type { ASTNode } from "./types"; +import hasParents from "./util/hasParents"; +import openUrl from "./util/openUrl"; + +export type RenderFunction = ( + node: ASTNode, + children: ReactNode[], + parentNodes: ASTNode[], + styles: Record +) => ReactNode; + +export type InheritingRenderFunction = ( + node: ASTNode, + children: ReactNode[], + parentNodes: ASTNode[], + styles: Record, + inheritedStyles?: Record +) => ReactNode; + +export type RenderLinkFunction = ( + node: ASTNode, + children: ReactNode[], + parentNodes: ASTNode[], + styles: Record, + onLinkPress?: (url: string) => boolean +) => ReactNode; + +export type RenderImageFunction = ( + node: ASTNode, + children: ReactNode[], + parentNodes: ASTNode[], + styles: Record, + allowedImageHandlers: string[], + defaultImageHandler: string | null +) => ReactNode; + +export type SomeRenderFunction = + | RenderFunction + | InheritingRenderFunction + | RenderLinkFunction + | RenderImageFunction; + +export interface RenderRules { + unknown: RenderFunction; + body: RenderFunction; + heading1: RenderFunction; + heading2: RenderFunction; + heading3: RenderFunction; + heading4: RenderFunction; + heading5: RenderFunction; + heading6: RenderFunction; + hr: RenderFunction; + strong: RenderFunction; + em: RenderFunction; + s: RenderFunction; + blockquote: RenderFunction; + bullet_list: RenderFunction; + ordered_list: RenderFunction; + list_item: InheritingRenderFunction; + code_inline: InheritingRenderFunction; + code_block: InheritingRenderFunction; + fence: InheritingRenderFunction; + table: RenderFunction; + thead: RenderFunction; + tbody: RenderFunction; + th: RenderFunction; + tr: RenderFunction; + td: RenderFunction; + link: RenderLinkFunction; + blocklink: RenderLinkFunction; + image: RenderImageFunction; + text: InheritingRenderFunction; + textgroup: RenderFunction; + paragraph: RenderFunction; + hardbreak: RenderFunction; + softbreak: RenderFunction; + pre: RenderFunction; + inline: RenderFunction; + span: RenderFunction; +} + +const renderRules: RenderRules = { + // when unknown elements are introduced, so it wont break + unknown: () => null, + + // The main container + body: (node, children, _parent, styles) => ( + + {children} + + ), + + // Headings + heading1: (node, children, _parent, styles) => ( + + {children} + + ), + heading2: (node, children, _parent, styles) => ( + + {children} + + ), + heading3: (node, children, _parent, styles) => ( + + {children} + + ), + heading4: (node, children, _parent, styles) => ( + + {children} + + ), + heading5: (node, children, _parent, styles) => ( + + {children} + + ), + heading6: (node, children, _parent, styles) => ( + + {children} + + ), + + // Horizontal Rule + hr: (node, _children, _parent, styles) => ( + + ), + + // Emphasis + strong: (node, children, _parent, styles) => ( + + {children} + + ), + em: (node, children, _parent, styles) => ( + + {children} + + ), + s: (node, children, _parent, styles) => ( + + {children} + + ), + + // Blockquotes + blockquote: (node, children, _parent, styles) => ( + + {children} + + ), + + // Lists + bullet_list: (node, children, _parent, styles) => ( + + {children} + + ), + ordered_list: (node, children, _parent, styles) => ( + + {children} + + ), + // this is a unique and quite annoying render rule because it has + // child items that can be styled (the list icon and the list content) + // outside of the AST tree so there are some work arounds in the + // AST renderer specifically to get the styling right here + list_item: (node, children, parent, styles, inheritedStyles = {}) => { + // we need to grab any text specific stuff here that is applied on the list_item style + // and apply it onto bullet_list_icon. the AST renderer has some workaround code to make + // the content classes apply correctly to the child AST tree items as well + // as code that forces the creation of the inheritedStyles object for list_items + const refStyle = { + ...inheritedStyles, + ...StyleSheet.flatten(styles.list_item), + }; + + const arr = Object.keys(refStyle); + + const modifiedInheritedStylesObj: Record = {}; + + for (let b = 0; b < arr.length; b++) { + if (textStyleProps.includes(arr[b])) { + // @ts-expect-error - this is fine + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + modifiedInheritedStylesObj[arr[b]] = refStyle[arr[b]]; + } + } + + if (hasParents(parent, "bullet_list")) { + return ( + + + {Platform.select({ + android: "\u2022", + ios: "\u00B7", + default: "\u2022", + })} + + {children} + + ); + } + + if (hasParents(parent, "ordered_list")) { + const orderedListIndex = parent.findIndex( + (el) => el.type === "ordered_list" + ); + + const orderedList = parent[orderedListIndex]; + let listItemNumber; + + // @ts-expect-error - this is fine + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, prefer-const + listItemNumber = orderedList.attributes.start + ? // @ts-expect-error - this is fine + // eslint-disable-next-line @typescript-eslint/restrict-plus-operands + orderedList.attributes.start + node.index + : (node.index ?? 0) + 1; + + return ( + + + {listItemNumber} + {node.markup} + + {children} + + ); + } + + // we should not need this, but just in case + return ( + + {children} + + ); + }, + + // Code + code_inline: (node, _children, _parent, styles, inheritedStyles = {}) => ( + + {node.content} + + ), + code_block: ( + { content, key }, + _children, + _parent, + styles, + inheritedStyles = {} + ) => { + // we trim new lines off the end of code blocks because the parser sends an extra one. + + if (typeof content === "string" && content.endsWith("\n")) { + content = content.substring(0, content.length - 1); + } + + return ( + + {content} + + ); + }, + fence: ( + { content, key }, + _children, + _parent, + styles, + inheritedStyles = {} + ) => { + // we trim new lines off the end of code blocks because the parser sends an extra one. + + if (typeof content === "string" && content.endsWith("\n")) { + content = content.substring(0, content.length - 1); + } + + return ( + + {content} + + ); + }, + + // Tables + table: (node, children, _parent, styles) => ( + + {children} + + ), + thead: (node, children, _parent, styles) => ( + + {children} + + ), + tbody: (node, children, _parent, styles) => ( + + {children} + + ), + th: (node, children, _parent, styles) => ( + + {children} + + ), + tr: (node, children, _parent, styles) => ( + + {children} + + ), + td: (node, children, _parent, styles) => ( + + {children} + + ), + + // Links + link: (node, children, _parent, styles, onLinkPress) => ( + openUrl(node.attributes?.href, onLinkPress)) + } + > + {children} + + ), + blocklink: (node, children, _parent, styles, onLinkPress) => ( + openUrl(node.attributes?.href, onLinkPress)) + } + style={styles.blocklink} + > + {children} + + ), + + // Images + image: ( + node, + _children, + _parent, + styles, + allowedImageHandlers, + defaultImageHandler + ) => { + if (!node.attributes) { + return null; + } + + const { src, alt } = node.attributes; + + if (typeof src !== "string") { + return null; + } + + // we check that the source starts with at least one of the elements in allowedImageHandlers + const show = allowedImageHandlers.some((value) => { + return src.toLowerCase().startsWith(value.toLowerCase()); + }); + + if (!show && defaultImageHandler === null) { + return null; + } + + const imageProps = { + indicator: true, + key: node.key, + style: styles._VIEW_SAFE_image, + source: { + uri: show ? src : `${defaultImageHandler}${src}`, + }, + }; + + if (alt) { + // @ts-expect-error - this is fine + imageProps.accessible = true; + // @ts-expect-error - this is fine + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + imageProps.accessibilityLabel = alt; + } + + if (imageProps.style.overflow === "scroll") { + throw new Error( + "Image style property 'overflow' is set to 'scroll'. This is not supported" + ); + } + // @ts-expect-error - this is fine + return ; + }, + + // Text Output + text: (node, _children, _parent, styles, inheritedStyles = {}) => ( + + {node.content} + + ), + textgroup: (node, children, _parent, styles) => ( + + {children} + + ), + paragraph: (node, children, _parent, styles) => ( + + {children} + + ), + hardbreak: (node, _children, _parent, styles) => ( + + {"\n"} + + ), + softbreak: (node, _children, _parent, styles) => ( + + {"\n"} + + ), + + // Believe these are never used but retained for completeness + pre: (node, children, _parent, styles) => ( + + {children} + + ), + inline: (node, children, _parent, styles) => ( + + {children} + + ), + span: (node, children, _parent, styles) => ( + + {children} + + ), +}; + +export default renderRules; diff --git a/src/lib/styles.js b/src/lib/styles.ts similarity index 100% rename from src/lib/styles.js rename to src/lib/styles.ts diff --git a/src/lib/types.ts b/src/lib/types.ts new file mode 100644 index 00000000..caf8e4e3 --- /dev/null +++ b/src/lib/types.ts @@ -0,0 +1,16 @@ +import type { RenderRules } from "./renderRules"; + +export interface ASTNode { + type: T; + sourceType?: string; // original source token name + sourceInfo?: string; + sourceMeta?: string; + block?: boolean; + key: string; + content?: string; + markup?: string; + tokenIndex?: number; + index?: number; + attributes?: Record; + children: ReadonlyArray; +} diff --git a/src/lib/util/Token.js b/src/lib/util/Token.js deleted file mode 100644 index 9a7c18c5..00000000 --- a/src/lib/util/Token.js +++ /dev/null @@ -1,8 +0,0 @@ -export default class Token { - constructor(type, nesting = 0, children = null, block = false) { - this.type = type; - this.nesting = nesting; - this.children = children; - this.block = block; - } -} diff --git a/src/lib/util/Token.ts b/src/lib/util/Token.ts new file mode 100644 index 00000000..9939cf3e --- /dev/null +++ b/src/lib/util/Token.ts @@ -0,0 +1,35 @@ +import { Token } from "markdown-it"; + +export default class TextToken { + constructor( + public type: "textgroup", + public nesting: number + ) {} + + public get children(): Token[] { + return []; + } + + public get tag(): "" { + return ""; + } + + public get content(): "" { + return ""; + } + + public get attrs(): null { + return null; + } + public get info(): undefined { + return undefined; + } + public get meta(): undefined { + return undefined; + } + public get markup(): undefined { + return undefined; + } + + public block: boolean = false; +} diff --git a/src/lib/util/cleanupTokens.js b/src/lib/util/cleanupTokens.js deleted file mode 100644 index 621b761d..00000000 --- a/src/lib/util/cleanupTokens.js +++ /dev/null @@ -1,58 +0,0 @@ -import getTokenTypeByToken from './getTokenTypeByToken'; -import flattenInlineTokens from './flattenInlineTokens'; -import renderInlineAsText from './renderInlineAsText'; - -export function cleanupTokens(tokens) { - tokens = flattenInlineTokens(tokens); - tokens.forEach((token) => { - token.type = getTokenTypeByToken(token); - - // set image and hardbreak to block elements - if (token.type === 'image' || token.type === 'hardbreak') { - token.block = true; - } - - // Set img alt text - if (token.type === 'image') { - token.attrs[token.attrIndex('alt')][1] = renderInlineAsText( - token.children, - ); - } - }); - - /** - * changing a link token to a blocklink to fix issue where link tokens with - * nested non text tokens breaks component - */ - const stack = []; - tokens = tokens.reduce((acc, token, index) => { - if (token.type === 'link' && token.nesting === 1) { - stack.push(token); - } else if ( - stack.length > 0 && - token.type === 'link' && - token.nesting === -1 - ) { - if (stack.some((stackToken) => stackToken.block)) { - stack[0].type = 'blocklink'; - stack[0].block = true; - token.type = 'blocklink'; - token.block = true; - } - - stack.push(token); - - while (stack.length) { - acc.push(stack.shift()); - } - } else if (stack.length > 0) { - stack.push(token); - } else { - acc.push(token); - } - - return acc; - }, []); - - return tokens; -} diff --git a/src/lib/util/cleanupTokens.ts b/src/lib/util/cleanupTokens.ts new file mode 100644 index 00000000..c17afbcf --- /dev/null +++ b/src/lib/util/cleanupTokens.ts @@ -0,0 +1,63 @@ +import getTokenTypeByToken from "./getTokenTypeByToken"; +import flattenInlineTokens from "./flattenInlineTokens"; +import renderInlineAsText from "./renderInlineAsText"; +import { Token } from "markdown-it"; +import TextToken from "./Token"; + +export function cleanupTokens( + tokens: (Token | TextToken)[] +): (Token | TextToken)[] { + tokens = flattenInlineTokens(tokens); + tokens.forEach((token) => { + token.type = getTokenTypeByToken(token); + + // set image and hardbreak to block elements + if (token.type === "image" || token.type === "hardbreak") { + token.block = true; + } + + // Set img alt text + if (token.type === "image") { + if (token.attrs) + token.attrs[token.attrIndex("alt")][1] = renderInlineAsText( + token.children ?? [] + ); + } + }); + + /** + * changing a link token to a blocklink to fix issue where link tokens with + * nested non text tokens breaks component + */ + const stack: (Token | TextToken)[] = []; + tokens = tokens.reduce<(Token | TextToken)[]>((acc, token) => { + if (token.type === "link" && token.nesting === 1) { + stack.push(token); + } else if ( + stack.length > 0 && + token.type === "link" && + token.nesting === -1 + ) { + if (stack.some((stackToken) => stackToken.block)) { + stack[0].type = "blocklink"; + stack[0].block = true; + token.type = "blocklink"; + token.block = true; + } + + stack.push(token); + + while (stack.length) { + acc.push(stack.shift()!); + } + } else if (stack.length > 0) { + stack.push(token); + } else { + acc.push(token); + } + + return acc; + }, []); + + return tokens; +} diff --git a/src/lib/util/convertAdditionalStyles.js b/src/lib/util/convertAdditionalStyles.js deleted file mode 100644 index 3cf4e40e..00000000 --- a/src/lib/util/convertAdditionalStyles.js +++ /dev/null @@ -1,25 +0,0 @@ -import cssToReactNative from 'css-to-react-native'; - -export default function convertAdditionalStyles(style) { - const rules = style.split(';'); - - const tuples = rules - .map((rule) => { - let [key, value] = rule.split(':'); - - if (key && value) { - key = key.trim(); - value = value.trim(); - return [key, value]; - } else { - return null; - } - }) - .filter((x) => { - return x != null; - }); - - const conv = cssToReactNative(tuples); - - return conv; -} diff --git a/src/lib/util/convertAdditionalStyles.ts b/src/lib/util/convertAdditionalStyles.ts new file mode 100644 index 00000000..6186a6cb --- /dev/null +++ b/src/lib/util/convertAdditionalStyles.ts @@ -0,0 +1,25 @@ +import cssToReactNative, { Style, StyleTuple } from "css-to-react-native"; + +export default function convertAdditionalStyles(style: string): Style { + const rules = style.split(";"); + + const tuples: StyleTuple[] = rules + .map((rule): StyleTuple | null => { + let [key, value] = rule.split(":"); + + if (key && value) { + key = key.trim(); + value = value.trim(); + return [key, value]; + } else { + return null; + } + }) + .filter((x) => { + return x != null; + }); + + const conv = cssToReactNative(tuples); + + return conv; +} diff --git a/src/lib/util/flattenInlineTokens.js b/src/lib/util/flattenInlineTokens.js deleted file mode 100644 index 4fe3b605..00000000 --- a/src/lib/util/flattenInlineTokens.js +++ /dev/null @@ -1,14 +0,0 @@ -export default function flattenTokens(tokens) { - return tokens.reduce((acc, curr) => { - if (curr.type === 'inline' && curr.children && curr.children.length > 0) { - const children = flattenTokens(curr.children); - while (children.length) { - acc.push(children.shift()); - } - } else { - acc.push(curr); - } - - return acc; - }, []); -} diff --git a/src/lib/util/flattenInlineTokens.ts b/src/lib/util/flattenInlineTokens.ts new file mode 100644 index 00000000..8e165918 --- /dev/null +++ b/src/lib/util/flattenInlineTokens.ts @@ -0,0 +1,19 @@ +import { Token } from "markdown-it"; +import TextToken from "./Token"; + +export default function flattenTokens( + tokens: (Token | TextToken)[] +): (Token | TextToken)[] { + return tokens.reduce<(Token | TextToken)[]>((acc, curr) => { + if (curr.type === "inline" && curr.children && curr.children.length > 0) { + const children = flattenTokens(curr.children); + while (children.length) { + acc.push(children.shift()!); + } + } else { + acc.push(curr); + } + + return acc; + }, []); +} diff --git a/src/lib/util/getTokenTypeByToken.js b/src/lib/util/getTokenTypeByToken.js deleted file mode 100644 index c4955105..00000000 --- a/src/lib/util/getTokenTypeByToken.js +++ /dev/null @@ -1,44 +0,0 @@ -const regSelectOpenClose = /_open|_close/g; - -/** - * - * @example { - "type": "heading_open", - "tag": "h1", - "attrs": null, - "map": [ - 1, - 2 - ], - "nesting": 1, - "level": 0, - "children": null, - "content": "", - "markup": "#", - "info": "", - "meta": null, - "block": true, - "hidden": false - } - * @param token - * @return {String} - */ -export default function getTokenTypeByToken(token) { - let cleanedType = 'unknown'; - - if (token.type) { - cleanedType = token.type.replace(regSelectOpenClose, ''); - } - - switch (cleanedType) { - case 'heading': { - cleanedType = `${cleanedType}${token.tag.substr(1)}`; - break; - } - default: { - break; - } - } - - return cleanedType; -} diff --git a/src/lib/util/getTokenTypeByToken.ts b/src/lib/util/getTokenTypeByToken.ts new file mode 100644 index 00000000..728cc114 --- /dev/null +++ b/src/lib/util/getTokenTypeByToken.ts @@ -0,0 +1,49 @@ +import { Token } from "markdown-it"; +import { RenderRules } from "../renderRules"; +import TextToken from "./Token"; + +const regSelectOpenClose = /_open|_close/g; + +/** + * + * @example { + "type": "heading_open", + "tag": "h1", + "attrs": null, + "map": [ + 1, + 2 + ], + "nesting": 1, + "level": 0, + "children": null, + "content": "", + "markup": "#", + "info": "", + "meta": null, + "block": true, + "hidden": false + } + * @param token + * @return {String} + */ +export default function getTokenTypeByToken( + token: Token | TextToken +): keyof RenderRules { + let cleanedType: keyof RenderRules | "heading" = "unknown"; + + if (token.type) { + cleanedType = token.type.replace(regSelectOpenClose, "") as + | keyof RenderRules + | "heading"; + } + + switch (cleanedType) { + case "heading": { + return `${cleanedType}${token.tag.substring(1) as "1" | "2" | "3" | "4" | "5" | "6"}`; + } + default: { + return cleanedType; + } + } +} diff --git a/src/lib/util/getUniqueID.js b/src/lib/util/getUniqueID.ts similarity index 100% rename from src/lib/util/getUniqueID.js rename to src/lib/util/getUniqueID.ts diff --git a/src/lib/util/groupTextTokens.js b/src/lib/util/groupTextTokens.ts similarity index 50% rename from src/lib/util/groupTextTokens.js rename to src/lib/util/groupTextTokens.ts index fb38e3d1..d5c5ccd3 100644 --- a/src/lib/util/groupTextTokens.js +++ b/src/lib/util/groupTextTokens.ts @@ -1,20 +1,23 @@ -import Token from './Token'; +import { Token } from "markdown-it"; +import TextToken from "./Token"; -export default function groupTextTokens(tokens) { - const result = []; +export default function groupTextTokens( + tokens: (Token | TextToken)[] +): (Token | TextToken)[] { + const result: (Token | TextToken)[] = []; let hasGroup = false; - tokens.forEach((token, index) => { + tokens.forEach((token) => { if (!token.block && !hasGroup) { hasGroup = true; - result.push(new Token('textgroup', 1)); + result.push(new TextToken("textgroup", 1)); result.push(token); } else if (!token.block && hasGroup) { result.push(token); } else if (token.block && hasGroup) { hasGroup = false; - result.push(new Token('textgroup', -1)); + result.push(new TextToken("textgroup", -1)); result.push(token); } else { result.push(token); diff --git a/src/lib/util/hasParents.js b/src/lib/util/hasParents.js deleted file mode 100644 index 57287540..00000000 --- a/src/lib/util/hasParents.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * - * @param {Array} parents - * @param {string} type - * @return {boolean} - */ -export default function hasParents(parents, type) { - return parents.findIndex((el) => el.type === type) > -1; -} diff --git a/src/lib/util/hasParents.ts b/src/lib/util/hasParents.ts new file mode 100644 index 00000000..d23ecc35 --- /dev/null +++ b/src/lib/util/hasParents.ts @@ -0,0 +1,5 @@ +import { ASTNode } from "../types"; + +export default function hasParents(parents: ASTNode[], type: string): boolean { + return parents.findIndex((el) => el.type === type) > -1; +} diff --git a/src/lib/util/omitListItemParagraph.js b/src/lib/util/omitListItemParagraph.ts similarity index 67% rename from src/lib/util/omitListItemParagraph.js rename to src/lib/util/omitListItemParagraph.ts index 8efc08ae..7b9c0c0c 100644 --- a/src/lib/util/omitListItemParagraph.js +++ b/src/lib/util/omitListItemParagraph.ts @@ -1,6 +1,11 @@ -export default function omitListItemParagraph(tokens) { +import { Token } from "markdown-it"; +import TextToken from "./Token"; + +export default function omitListItemParagraph( + tokens: (Token | TextToken)[] +): (Token | TextToken)[] { // used to ensure that we remove the correct ending paragraph token - let depth = null; + let depth: number | null = null; return tokens.filter((token, index) => { // update depth if we've already removed a starting paragraph token if (depth !== null) { @@ -8,13 +13,13 @@ export default function omitListItemParagraph(tokens) { } // check for a list_item token followed by paragraph token (to remove) - if (token.type === 'list_item' && token.nesting === 1 && depth === null) { + if (token.type === "list_item" && token.nesting === 1 && depth === null) { const next = index + 1 in tokens ? tokens[index + 1] : null; - if (next && next.type === 'paragraph' && next.nesting === 1) { + if (next && next.type === "paragraph" && next.nesting === 1) { depth = 0; return true; } - } else if (token.type === 'paragraph') { + } else if (token.type === "paragraph") { if (token.nesting === 1 && depth === 1) { // remove the paragraph token immediately after the list_item token return false; diff --git a/src/lib/util/openUrl.js b/src/lib/util/openUrl.js deleted file mode 100644 index 1c1bf198..00000000 --- a/src/lib/util/openUrl.js +++ /dev/null @@ -1,12 +0,0 @@ -import {Linking} from 'react-native'; - -export default function openUrl(url, customCallback) { - if (customCallback) { - const result = customCallback(url); - if (url && result && typeof result === 'boolean') { - Linking.openURL(url); - } - } else if (url) { - Linking.openURL(url); - } -} diff --git a/src/lib/util/openUrl.ts b/src/lib/util/openUrl.ts new file mode 100644 index 00000000..dd71856d --- /dev/null +++ b/src/lib/util/openUrl.ts @@ -0,0 +1,15 @@ +import { Linking } from "react-native"; + +export default function openUrl( + url: string, + customCallback?: (url: string) => boolean +): void { + if (customCallback) { + const result = customCallback(url); + if (url && result && typeof result === "boolean") { + Linking.openURL(url); + } + } else if (url) { + Linking.openURL(url); + } +} diff --git a/src/lib/util/removeTextStyleProps.js b/src/lib/util/removeTextStyleProps.js deleted file mode 100644 index 773fec86..00000000 --- a/src/lib/util/removeTextStyleProps.js +++ /dev/null @@ -1,15 +0,0 @@ -import textStyleProps from '../data/textStyleProps'; - -export default function removeTextStyleProps(style) { - const intersection = textStyleProps.filter((value) => - Object.keys(style).includes(value), - ); - - const obj = {...style}; - - intersection.forEach((value) => { - delete obj[value]; - }); - - return obj; -} diff --git a/src/lib/util/removeTextStyleProps.ts b/src/lib/util/removeTextStyleProps.ts new file mode 100644 index 00000000..b4e5f740 --- /dev/null +++ b/src/lib/util/removeTextStyleProps.ts @@ -0,0 +1,17 @@ +import { ViewStyle } from "react-native"; +import textStyleProps from "../data/textStyleProps"; + +export default function removeTextStyleProps(style: ViewStyle): ViewStyle { + const intersection = textStyleProps.filter((value) => + Object.keys(style).includes(value) + ); + + const obj = { ...style }; + + intersection.forEach((value) => { + // @ts-ignore + delete obj[value]; + }); + + return obj; +} diff --git a/src/lib/util/renderInlineAsText.js b/src/lib/util/renderInlineAsText.js deleted file mode 100644 index 274efae9..00000000 --- a/src/lib/util/renderInlineAsText.js +++ /dev/null @@ -1,13 +0,0 @@ -export default function renderInlineAsText(tokens) { - var result = ''; - - for (var i = 0, len = tokens.length; i < len; i++) { - if (tokens[i].type === 'text') { - result += tokens[i].content; - } else if (tokens[i].type === 'image') { - result += renderInlineAsText(tokens[i].children); - } - } - - return result; -} diff --git a/src/lib/util/renderInlineAsText.ts b/src/lib/util/renderInlineAsText.ts new file mode 100644 index 00000000..3d9101d6 --- /dev/null +++ b/src/lib/util/renderInlineAsText.ts @@ -0,0 +1,15 @@ +import { Token } from "markdown-it"; + +export default function renderInlineAsText(tokens: Token[]): string { + var result = ""; + + for (var i = 0, len = tokens.length; i < len; i++) { + if (tokens[i].type === "text") { + result += tokens[i].content; + } else if (tokens[i].type === "image") { + result += renderInlineAsText(tokens[i].children!); + } + } + + return result; +} diff --git a/src/lib/util/splitTextNonTextNodes.js b/src/lib/util/splitTextNonTextNodes.js deleted file mode 100644 index e8111695..00000000 --- a/src/lib/util/splitTextNonTextNodes.js +++ /dev/null @@ -1,14 +0,0 @@ -export default function splitTextNonTextNodes(children) { - return children.reduce( - (acc, curr) => { - if (curr.type.displayName === 'Text') { - acc.textNodes.push(curr); - } else { - acc.nonTextNodes.push(curr); - } - - return acc; - }, - {textNodes: [], nonTextNodes: []}, - ); -} diff --git a/src/lib/util/stringToTokens.js b/src/lib/util/stringToTokens.js deleted file mode 100644 index 6ac77f37..00000000 --- a/src/lib/util/stringToTokens.js +++ /dev/null @@ -1,10 +0,0 @@ -export function stringToTokens(source, markdownIt) { - let result = []; - try { - result = markdownIt.parse(source, {}); - } catch (err) { - console.warn(err); - } - - return result; -} diff --git a/src/lib/util/stringToTokens.ts b/src/lib/util/stringToTokens.ts new file mode 100644 index 00000000..9d327ae3 --- /dev/null +++ b/src/lib/util/stringToTokens.ts @@ -0,0 +1,15 @@ +import MarkdownIt, { Token } from "markdown-it"; + +export function stringToTokens( + source: string, + markdownIt: MarkdownIt +): Token[] { + let result: Token[] = []; + try { + result = markdownIt.parse(source, {}); + } catch (err) { + console.warn(err); + } + + return result; +} diff --git a/src/lib/util/tokensToAST.js b/src/lib/util/tokensToAST.ts similarity index 54% rename from src/lib/util/tokensToAST.js rename to src/lib/util/tokensToAST.ts index b0ed265c..dd8f23d2 100644 --- a/src/lib/util/tokensToAST.js +++ b/src/lib/util/tokensToAST.ts @@ -1,13 +1,10 @@ -import getUniqueID from './getUniqueID'; -import getTokenTypeByToken from './getTokenTypeByToken'; +import getUniqueID from "./getUniqueID"; +import getTokenTypeByToken from "./getTokenTypeByToken"; +import { Token } from "markdown-it"; +import { ASTNode } from "../types"; +import TextToken from "./Token"; -/** - * - * @param {{type: string, tag:string, content: string, children: *, attrs: Array, meta, info, block: boolean}} token - * @param {number} tokenIndex - * @return {{type: string, content, tokenIndex: *, index: number, attributes: {}, children: *}} - */ -function createNode(token, tokenIndex) { +function createNode(token: Token | TextToken, tokenIndex: number): ASTNode { const type = getTokenTypeByToken(token); const content = token.content; @@ -16,7 +13,7 @@ function createNode(token, tokenIndex) { if (token.attrs) { attributes = token.attrs.reduce((prev, curr) => { const [name, value] = curr; - return {...prev, [name]: value}; + return { ...prev, [name]: value }; }, {}); } @@ -27,23 +24,18 @@ function createNode(token, tokenIndex) { sourceMeta: token.meta, block: token.block, markup: token.markup, - key: getUniqueID() + '_' + type, + key: getUniqueID() + "_" + type, content, tokenIndex, index: 0, attributes, - children: tokensToAST(token.children), + children: token.children ? tokensToAST(token.children) : [], }; } -/** - * - * @param {Array<{type: string, tag:string, content: string, children: *, attrs: Array}>}tokens - * @return {Array} - */ -export default function tokensToAST(tokens) { +export default function tokensToAST(tokens: (Token | TextToken)[]): ASTNode[] { let stack = []; - let children = []; + let children: ASTNode[] = []; if (!tokens || tokens.length === 0) { return []; @@ -55,9 +47,9 @@ export default function tokensToAST(tokens) { if ( !( - astNode.type === 'text' && + astNode.type === "text" && astNode.children.length === 0 && - astNode.content === '' + astNode.content === "" ) ) { astNode.index = children.length; @@ -65,9 +57,9 @@ export default function tokensToAST(tokens) { if (token.nesting === 1) { children.push(astNode); stack.push(children); - children = astNode.children; + children = [...astNode.children]; } else if (token.nesting === -1) { - children = stack.pop(); + children = stack.pop() ?? []; } else if (token.nesting === 0) { children.push(astNode); } diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..49844674 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,101 @@ +{ + "compilerOptions": { + "noEmit": false, + /* Visit https://aka.ms/tsconfig to read more about this file */ + /* Projects */ + "incremental": true /* Save .tsbuildinfo files to allow for incremental compilation of projects. */, + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + /* Language and Environment */ + "target": "ES2021" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + "lib": [ + "ES2021", + "ES2022.Error" + ] /* Specify a set of bundled library declaration files that describe the target runtime environment. */, + "jsx": "preserve" /* Specify what JSX code is generated. */, + "experimentalDecorators": true /* Enable experimental support for TC39 stage 2 draft decorators. */, + "emitDecoratorMetadata": true /* Emit design-type metadata for decorated declarations in source files. */, + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + /* Modules */ + "module": "NodeNext" /* Specify what module code is generated. */, + "rootDir": "./src" /* Specify the root folder within your source files. */, + // "moduleResolution": "classic", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + /* Emit */ + "declaration": true /* Generate .d.ts files from TypeScript and JavaScript files in your project. */, + "declarationMap": true /* Create sourcemaps for d.ts files. */, + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + "sourceMap": true /* Create source map files for emitted JavaScript files. */, + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + "outDir": "./dist" /* Specify an output folder for all emitted files. */, + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + /* Interop Constraints */ + "isolatedModules": true /* Ensure that each file can be safely transpiled without relying on other imports. */, + "allowSyntheticDefaultImports": true /* Allow 'import x from y' when a module doesn't have a default export. */, + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + "noImplicitAny": true /* Enable error reporting for expressions and declarations with an implied 'any' type. */, + "strictNullChecks": true /* When type checking, take into account 'null' and 'undefined'. */, + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + "strictPropertyInitialization": true /* Check for class properties that are declared but not set in the constructor. */, + "noImplicitThis": true /* Enable error reporting when 'this' is given the type 'any'. */, + "useUnknownInCatchVariables": true /* Default catch clause variables as 'unknown' instead of 'any'. */, + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true /* Interpret optional property types as written, rather than adding 'undefined'. */, + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + "noUncheckedIndexedAccess": false /* Add 'undefined' to a type when accessed using an index. */, + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + /* Completeness */ + "skipDefaultLibCheck": false /* Skip type checking .d.ts files that are included with TypeScript. */, + // "skipLibCheck": false /* Skip type checking all .d.ts files. */ + "types": [] + }, + "include": ["./src/**/*"] +} diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo new file mode 100644 index 00000000..bc51d918 --- /dev/null +++ b/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/@types/linkify-it/build/index.cjs.d.ts","./node_modules/@types/mdurl/build/index.cjs.d.ts","./node_modules/@types/markdown-it/dist/index.cjs.d.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/prop-types/index.d.ts","./node_modules/@types/react/index.d.ts","./node_modules/react-native/types/modules/BatchedBridge.d.ts","./node_modules/react-native/types/modules/Codegen.d.ts","./node_modules/react-native/types/modules/Devtools.d.ts","./node_modules/react-native/types/modules/globals.d.ts","./node_modules/react-native/types/modules/LaunchScreen.d.ts","./node_modules/react-native/types/private/Utilities.d.ts","./node_modules/react-native/types/public/Insets.d.ts","./node_modules/react-native/types/public/ReactNativeTypes.d.ts","./node_modules/react-native/Libraries/Types/CoreEventTypes.d.ts","./node_modules/react-native/types/public/ReactNativeRenderer.d.ts","./node_modules/react-native/Libraries/Components/Touchable/Touchable.d.ts","./node_modules/react-native/Libraries/Components/View/ViewAccessibility.d.ts","./node_modules/react-native/Libraries/Components/View/ViewPropTypes.d.ts","./node_modules/react-native/Libraries/Components/RefreshControl/RefreshControl.d.ts","./node_modules/react-native/Libraries/Components/ScrollView/ScrollView.d.ts","./node_modules/react-native/Libraries/Components/View/View.d.ts","./node_modules/react-native/Libraries/Image/ImageResizeMode.d.ts","./node_modules/react-native/Libraries/Image/ImageSource.d.ts","./node_modules/react-native/Libraries/Image/Image.d.ts","./node_modules/@react-native/virtualized-lists/Lists/VirtualizedList.d.ts","./node_modules/@react-native/virtualized-lists/index.d.ts","./node_modules/react-native/Libraries/Lists/FlatList.d.ts","./node_modules/react-native/Libraries/ReactNative/RendererProxy.d.ts","./node_modules/react-native/Libraries/Lists/SectionList.d.ts","./node_modules/react-native/Libraries/Text/Text.d.ts","./node_modules/react-native/Libraries/Animated/Animated.d.ts","./node_modules/react-native/Libraries/StyleSheet/StyleSheetTypes.d.ts","./node_modules/react-native/Libraries/StyleSheet/StyleSheet.d.ts","./node_modules/react-native/Libraries/StyleSheet/processColor.d.ts","./node_modules/react-native/Libraries/ActionSheetIOS/ActionSheetIOS.d.ts","./node_modules/react-native/Libraries/Alert/Alert.d.ts","./node_modules/react-native/Libraries/Animated/Easing.d.ts","./node_modules/react-native/Libraries/Animated/useAnimatedValue.d.ts","./node_modules/react-native/Libraries/vendor/emitter/EventEmitter.d.ts","./node_modules/react-native/Libraries/EventEmitter/RCTDeviceEventEmitter.d.ts","./node_modules/react-native/Libraries/EventEmitter/RCTNativeAppEventEmitter.d.ts","./node_modules/react-native/Libraries/AppState/AppState.d.ts","./node_modules/react-native/Libraries/BatchedBridge/NativeModules.d.ts","./node_modules/react-native/Libraries/Components/AccessibilityInfo/AccessibilityInfo.d.ts","./node_modules/react-native/Libraries/Components/ActivityIndicator/ActivityIndicator.d.ts","./node_modules/react-native/Libraries/Components/Clipboard/Clipboard.d.ts","./node_modules/react-native/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.d.ts","./node_modules/react-native/Libraries/EventEmitter/NativeEventEmitter.d.ts","./node_modules/react-native/Libraries/Components/Keyboard/Keyboard.d.ts","./node_modules/react-native/types/private/TimerMixin.d.ts","./node_modules/react-native/Libraries/Components/Keyboard/KeyboardAvoidingView.d.ts","./node_modules/react-native/Libraries/Components/Pressable/Pressable.d.ts","./node_modules/react-native/Libraries/Components/ProgressBarAndroid/ProgressBarAndroid.d.ts","./node_modules/react-native/Libraries/Components/SafeAreaView/SafeAreaView.d.ts","./node_modules/react-native/Libraries/Components/StatusBar/StatusBar.d.ts","./node_modules/react-native/Libraries/Components/Switch/Switch.d.ts","./node_modules/react-native/Libraries/Components/TextInput/InputAccessoryView.d.ts","./node_modules/react-native/Libraries/Components/TextInput/TextInput.d.ts","./node_modules/react-native/Libraries/Components/ToastAndroid/ToastAndroid.d.ts","./node_modules/react-native/Libraries/Components/Touchable/TouchableWithoutFeedback.d.ts","./node_modules/react-native/Libraries/Components/Touchable/TouchableHighlight.d.ts","./node_modules/react-native/Libraries/Components/Touchable/TouchableOpacity.d.ts","./node_modules/react-native/Libraries/Components/Touchable/TouchableNativeFeedback.d.ts","./node_modules/react-native/Libraries/Components/Button.d.ts","./node_modules/react-native/Libraries/Core/registerCallableModule.d.ts","./node_modules/react-native/Libraries/DevToolsSettings/DevToolsSettingsManager.d.ts","./node_modules/react-native/Libraries/Interaction/InteractionManager.d.ts","./node_modules/react-native/Libraries/Interaction/PanResponder.d.ts","./node_modules/react-native/Libraries/LayoutAnimation/LayoutAnimation.d.ts","./node_modules/react-native/Libraries/Linking/Linking.d.ts","./node_modules/react-native/Libraries/LogBox/LogBox.d.ts","./node_modules/react-native/Libraries/Modal/Modal.d.ts","./node_modules/react-native/Libraries/Performance/Systrace.d.ts","./node_modules/react-native/Libraries/PermissionsAndroid/PermissionsAndroid.d.ts","./node_modules/react-native/Libraries/PushNotificationIOS/PushNotificationIOS.d.ts","./node_modules/react-native/Libraries/Utilities/IPerformanceLogger.d.ts","./node_modules/react-native/Libraries/ReactNative/AppRegistry.d.ts","./node_modules/react-native/Libraries/ReactNative/I18nManager.d.ts","./node_modules/react-native/Libraries/ReactNative/RootTag.d.ts","./node_modules/react-native/Libraries/ReactNative/UIManager.d.ts","./node_modules/react-native/Libraries/ReactNative/requireNativeComponent.d.ts","./node_modules/react-native/Libraries/Settings/Settings.d.ts","./node_modules/react-native/Libraries/Share/Share.d.ts","./node_modules/react-native/Libraries/StyleSheet/PlatformColorValueTypesIOS.d.ts","./node_modules/react-native/Libraries/StyleSheet/PlatformColorValueTypes.d.ts","./node_modules/react-native/Libraries/TurboModule/RCTExport.d.ts","./node_modules/react-native/Libraries/TurboModule/TurboModuleRegistry.d.ts","./node_modules/react-native/Libraries/Utilities/Appearance.d.ts","./node_modules/react-native/Libraries/Utilities/BackHandler.d.ts","./node_modules/react-native/Libraries/Utilities/DevSettings.d.ts","./node_modules/react-native/Libraries/Utilities/Dimensions.d.ts","./node_modules/react-native/Libraries/Utilities/PixelRatio.d.ts","./node_modules/react-native/Libraries/Utilities/Platform.d.ts","./node_modules/react-native/Libraries/Vibration/Vibration.d.ts","./node_modules/react-native/Libraries/YellowBox/YellowBoxDeprecated.d.ts","./node_modules/react-native/Libraries/vendor/core/ErrorUtils.d.ts","./node_modules/react-native/types/public/DeprecatedPropertiesAlias.d.ts","./node_modules/react-native/types/index.d.ts","./src/lib/util/getUniqueID.ts","./node_modules/css-to-react-native/index.d.ts","./src/lib/util/convertAdditionalStyles.ts","./src/lib/data/textStyleProps.ts","./src/lib/types.ts","./src/lib/util/hasParents.ts","./src/lib/util/openUrl.ts","./src/lib/renderRules.tsx","./src/lib/AstRenderer.ts","./src/lib/util/Token.ts","./src/lib/util/getTokenTypeByToken.ts","./src/lib/util/tokensToAST.ts","./src/lib/util/stringToTokens.ts","./src/lib/util/flattenInlineTokens.ts","./src/lib/util/renderInlineAsText.ts","./src/lib/util/cleanupTokens.ts","./src/lib/util/groupTextTokens.ts","./src/lib/util/omitListItemParagraph.ts","./src/lib/parser.ts","./src/lib/styles.ts","./src/lib/util/removeTextStyleProps.ts","./src/index.tsx"],"fileIdsList":[[57,150],[77],[51,52],[54,55,56],[85,86],[57,66,72,73,76,79,81,82,85],[83],[93],[57,65,91],[57,63,65,66,70,84,85],[57,85,114,115],[57,63,65,66,70,85],[91,100],[57,63,70,84,85,102],[57,64,66,69,70,73,84,85],[57,63,65,70,85],[57,63,65,70],[57,63,64,66,68,70,71,84,85],[57,85],[57,84,85],[57,63,65,66,69,70,84,85,91,102],[57,64,66],[57,73,84,85,112],[57,63,68,85,112,114],[57,73,112],[57,63,64,66,68,69,84,85,102],[66],[57,64,66,67,68,69,84,85],[91],[92],[57,63,64,65,66,69,74,75,84,85],[66,67],[57,72,73,78,84,85],[57,72,78,80,84,85],[57,66,70],[57,84,128],[57],[57,65],[65],[85],[84],[74,83,85],[57,63,65,66,69,84,85],[138],[100],[58,59,60,61,62,64,65,66,67,68,69,70,71,72,73,74,75,76,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149],[150],[60],[53,57,150,151,154,155,156,157,158,159,162,163,169,170,171],[57,150,151,153,154,155,158],[53,57,155,160,162,163,166,167,168],[57,150,154,155,156,157],[158],[53],[53,160,161,164,165],[152],[53,160],[53,158,160],[155],[150,154],[53,151,155,160,161]],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"45d8ccb3dfd57355eb29749919142d4321a0aa4df6acdfc54e30433d7176600a","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1a94697425a99354df73d9c8291e2ecd4dddd370aed4023c2d6dee6cccb32666","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3f9fc0ec0b96a9e642f11eda09c0be83a61c7b336977f8b9fdb1e9788e925fe","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3d7b04b45033f57351c8434f60b6be1ea71a2dfec2d0a0c3c83badbb0e3e693","affectsGlobalScope":true,"impliedFormat":1},{"version":"956d27abdea9652e8368ce029bb1e0b9174e9678a273529f426df4b3d90abd60","affectsGlobalScope":true,"impliedFormat":1},{"version":"e6633e05da3ff36e6da2ec170d0d03ccf33de50ca4dc6f5aeecb572cedd162fb","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"742f21debb3937c3839a63245648238555bdab1ea095d43fd10c88a64029bf76","impliedFormat":1},{"version":"0944f27ebff4b20646b71e7e3faaaae50a6debd40bc63e225de1320dd15c5795","impliedFormat":1},{"version":"8a7219b41d3c1c93f3f3b779146f313efade2404eeece88dcd366df7e2364977","impliedFormat":1},{"version":"36a2e4c9a67439aca5f91bb304611d5ae6e20d420503e96c230cf8fcdc948d94","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"ed6b820c54de95b2510bb673490d61c7f2187f532a339d8d04981645a918961f","impliedFormat":1},{"version":"aa17748c522bd586f8712b1a308ea23af59c309b2fd278f6d4f406647c72e659","affectsGlobalScope":true,"impliedFormat":1},{"version":"3a909e8789a4f8b5377ef3fb8dc10d0c0a090c03f2e40aab599534727457475a","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b47c8df863142d9383f948c987e1ebd25ade3867aeb4ae60e9d6009035dfe46","impliedFormat":1},{"version":"b8dd45aa6e099a5f564edcabfe8114096b096eb1ffaa343dd6f3fe73f1a6e85e","impliedFormat":1},{"version":"38e8ac2d182bd3f85d28de9bdf1386c19a319f9c0280aa43960204c353b07878","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc4db28f3510994e45bbabba1ee33e9a0d27dab33d4c8a5844cee8c85438a058","impliedFormat":1},{"version":"232f660363b3b189f7be7822ed71e907195d1a85bc8d55d2b7ce3f09b2136938","impliedFormat":1},{"version":"e745388cfad9efb4e5a9a15a2c6b66d54094dd82f8d0c2551064e216f7b51526","impliedFormat":1},{"version":"53390c21d095fb54e6c0b8351cbf7f4008f096ade9717bc5ee75e340bc3dfa30","impliedFormat":1},{"version":"71493b2c538dffa1e3e968b55b70984b542cc6e488012850865f72768ff32630","impliedFormat":1},{"version":"8ebf448e9837fda1a368acbb575b0e28843d5b2a3fda04bce76248b64326ea49","impliedFormat":1},{"version":"91b9f6241fca7843985aa31157cfa08cc724c77d91145a4d834d27cdde099c05","impliedFormat":1},{"version":"8b94ac8c460c9a2578ca3308fecfcf034e21af89e9c287c97710e9717ffae133","impliedFormat":1},{"version":"a7266bcc42f8ec0f31f319c2dd8100411b4d7b8a534235cb00a719f1c8a2a42e","impliedFormat":1},{"version":"3dfa3a6f2a62259b56fa7bcebfbacf886848dfa037298be5bed07c7a0381ee4f","impliedFormat":1},{"version":"a1e3cda52746919d2a95784ce0b1b9ffa22052209aab5f54e079e7b920f5339e","impliedFormat":1},{"version":"1882680f8c88c5648d603408dd1943857ca831a815e33d3126be8368f7a69252","impliedFormat":1},{"version":"f387a979388291b2688ba0f604e3ae78874f5f777616b448d34109762a4f05a9","impliedFormat":1},{"version":"cae0fb826d8a88749189b8a924dfcb5d3ad629e3bc5ec934195fbd83fa48b068","impliedFormat":1},{"version":"376b8482d1224aa83f4521590672304e30ba847d0b87b9e1a62b2e60a5c788f2","impliedFormat":1},{"version":"488242948cc48ee6413a159c60bcaf70de15db01364741737a962662f1a127a5","impliedFormat":1},{"version":"42bacb33cddecbcfe3e043ee1117ba848801749e44f947626765b3e0aec74b1c","impliedFormat":1},{"version":"b326790c20287ad266b5fcd0c388e2a83320a24747856727dcb70c7bbd489dfc","impliedFormat":1},{"version":"cd2156bc8e4d54d52a2817d1b6f4629a5dd3173b1d8bb0fc893ee678d6a78ecd","impliedFormat":1},{"version":"60526d9010e8ccb2a76a59821061463464c3acd5bc7a50320df6d2e4e0d6e4f7","impliedFormat":1},{"version":"562cce1c8e14e8d5a55d1931cb1848b1df49cc7b1024356d56f3550ed57ad67f","impliedFormat":1},{"version":"623fa4efc706bb9956d0ae94b13321c6617655bf8ebdb270c9792bb398f82e44","impliedFormat":1},{"version":"f20c96192f5841cbf982d2c1989c1e9fdef41c4a9db7543edff131007bf1dbfb","impliedFormat":1},{"version":"79d6871ce0da76f4c865a58daa509d5c8a10545d510b804501daa5d0626e7028","impliedFormat":1},{"version":"9054417b5760061bc5fe31f9eee5dc9bf018339b0617d3c65dd1673c8e3c0f25","impliedFormat":1},{"version":"442856ad0787bc213f659e134c204ad0d502179aa216bf700faefb5572208358","impliedFormat":1},{"version":"443702ca8101ef0adc827c2cc530ca93cf98d41e36ce4399efb9bc833ad9cb62","impliedFormat":1},{"version":"c94f70562ae60797cce564c3bebbaaf1752c327d5063d6ac152aa5ca1616c267","impliedFormat":1},{"version":"2aeb5fcdfc884b16015617d263fd8d1a8513f7efe23880be4e5f0bdb3794b37c","impliedFormat":1},{"version":"fd412dd6372493eb8e3e95cae8687d35e4d34dde905a33e0ee47b74224cdd6ab","impliedFormat":1},{"version":"b561170fbe8d4292425e1dfa52406c8d97575681f7a5e420d11d9f72f7c29e38","impliedFormat":1},{"version":"5fe94f3f6411a0f6293f16fdc8e02ee61138941847ce91d6f6800c97fac22fcd","impliedFormat":1},{"version":"7f7c0ecc3eeeef905a3678e540947f4fbbc1a9c76075419dcc5fbfc3df59cb0b","impliedFormat":1},{"version":"df3303018d45c92be73fb4a282d5a242579f96235f5e0f8981983102caf5feca","impliedFormat":1},{"version":"35db266b474b3b9dfd0bc7d25dff3926cc227de45394262f3783b8b174182a16","impliedFormat":1},{"version":"8205e62a7310ac0513747f6d84175400680cff372559bc5fbe2df707194a295d","impliedFormat":1},{"version":"084d0df6805570b6dc6c8b49c3a71d5bdfe59606901e0026c63945b68d4b080a","impliedFormat":1},{"version":"8387fa3287992c71702756fe6ecea68e2f8f2c5aa434493e3afe4817dd4a4787","impliedFormat":1},{"version":"0f066f9654e700a9cf79c75553c934eb14296aa80583bd2b5d07e2d582a3f4ee","impliedFormat":1},{"version":"269c5d54104033b70331343bd931c9933852a882391ed6bd98c3d8b7d6465d22","impliedFormat":1},{"version":"a56b8577aaf471d9e60582065a8193269310e8cae48c1ce4111ed03216f5f715","impliedFormat":1},{"version":"486ae83cd51b813095f6716f06cc9b2cf480ad1d6c7f8ec59674d6c858cd2407","impliedFormat":1},{"version":"fff527e2567a24dd634a30268f1aa8a220315fed9c513d70ee872e54f67f27f3","impliedFormat":1},{"version":"5dd0ff735b3f2e642c3f16bcfb3dc4ecebb679a70e43cfb19ab5fd84d8faaeed","impliedFormat":1},{"version":"d1d78d1ef0f21ac77cdc436d2a4d56592453a8a2e51af2040ec9a69a5d35e4de","impliedFormat":1},{"version":"bc55b91274e43f88030c9cfe2c4217fae57894c3c302173ab6e9743c29484e3d","impliedFormat":1},{"version":"8bb22f70bfd7bf186631fa565c9202ee6a1009ffb961197b7d092b5a1e1d56b1","impliedFormat":1},{"version":"77282216c61bcef9a700db98e142301d5a7d988d3076286029da63e415e98a42","impliedFormat":1},{"version":"6c28f4f95aaa6c3c8b1a0681c29f446b0bf0ed1aa5aa11e8b2ca6fc9e066e9f2","impliedFormat":1},{"version":"64ce8e260a1362d4cadd6c753581a912a9869d4a53ec6e733dc61018f9250f5d","impliedFormat":1},{"version":"85a915dbb768b89cb92f5e6c165d776bfebd065883c34fee4e0219c3ed321b47","impliedFormat":1},{"version":"83df2f39cb14971adea51d1c84e7d146a34e9b7f84ad118450a51bdc3138412c","impliedFormat":1},{"version":"b96364fcb0c9d521e7618346b00acf3fe16ccf9368404ceac1658edee7b6332c","impliedFormat":1},{"version":"bdb2b70c74908c92ec41d8dd8375a195cb3bb07523e4de642b2b2dfbde249ca6","impliedFormat":1},{"version":"7b329f4137a552073f504022acbf8cd90d49cc5e5529791bef508f76ff774854","impliedFormat":1},{"version":"f63bbbffcfc897d22f34cf19ae13405cd267b1783cd21ec47d8a2d02947c98c1","impliedFormat":1},{"version":"7889f4932dfa7b1126cdc17914d85d80b5860cc3d62ba329494007e8aab45430","impliedFormat":1},{"version":"d9725ef7f60a791668f7fb808eb90b1789feaaef989a686fefc0f7546a51dcdc","impliedFormat":1},{"version":"df55b9be6ba19a6f77487e09dc7a94d7c9bf66094d35ea168dbd4bac42c46b8f","impliedFormat":1},{"version":"595125f3e088b883d104622ef10e6b7d5875ff6976bbe4d7dca090a3e2dca513","impliedFormat":1},{"version":"8ebb6f0603bf481e893311c49e4d2e2061413c51b9ba5898cd9b0a01f5ef19c8","impliedFormat":1},{"version":"e0d7eed4ba363df3faadb8e617f95f9fc8adfbb00b87db7ade4a1098d6cf1e90","impliedFormat":1},{"version":"38faab59a79924ce5eb4f2f3e7e7db91e74d425b4183f908cc014be213f0d971","impliedFormat":1},{"version":"de115595321ce012c456f512a799679bfc874f0ac0a4928a8429557bb25086aa","impliedFormat":1},{"version":"cdca67bd898deff48e3acb05fb44500b5ebce16c26a8ec99dee1522cf9879795","impliedFormat":1},{"version":"0524cab11ba9048d151d93cc666d3908fda329eec6b1642e9a936093e6d79f28","impliedFormat":1},{"version":"869073d7523e75f45bd65b2072865c60002d5e0cbd3d17831e999cf011312778","impliedFormat":1},{"version":"bc7b5906a6ce6c5744a640c314e020856be6c50a693e77dc12aff2d77b12ca76","impliedFormat":1},{"version":"56503e377bc1344f155e4e3115a772cb4e59350c0b8131e3e1fb2750ac491608","impliedFormat":1},{"version":"6b579287217ee1320ee1c6cfec5f6730f3a1f91daab000f7131558ee531b2bf8","impliedFormat":1},{"version":"e2ddb2877f5a841866f4fc772a601b58e90ac8399b35f9a06535be81b8e08b47","impliedFormat":1},{"version":"a793636667598e739a52684033037a67dc2d9db37fab727623626ef19aa5abb9","impliedFormat":1},{"version":"b15d6238a86bc0fc2368da429249b96c260debc0cec3eb7b5f838ad32587c129","impliedFormat":1},{"version":"9a9fba3a20769b0a74923e7032997451b61c1bd371c519429b29019399040d74","impliedFormat":1},{"version":"4b10e2fe52cb61035e58df3f1fdd926dd0fe9cf1a2302f92916da324332fb4e0","impliedFormat":1},{"version":"d1092ae8d6017f359f4758115f588e089848cc8fb359f7ba045b1a1cf3668a49","impliedFormat":1},{"version":"ddae9195b0da7b25a585ef43365f4dc5204a746b155fbee71e6ee1a9193fb69f","impliedFormat":1},{"version":"32dbced998ce74c5e76ce87044d0b4071857576dde36b0c6ed1d5957ce9cf5b5","impliedFormat":1},{"version":"5bc29a9918feba88816b71e32960cf11243b77b76630e9e87cad961e5e1d31d0","impliedFormat":1},{"version":"341ffa358628577f490f128f3880c01d50ef31412d1be012bb1cd959b0a383ea","impliedFormat":1},{"version":"ecc1b8878c8033bde0204b85e26fe1af6847805427759e5723882c848a11e134","impliedFormat":1},{"version":"cfc9c32553ad3b5be38342bc8731397438a93531118e1a226a8c79ad255b4f0c","impliedFormat":1},{"version":"16e5b5b023c2a1119c1878a51714861c56255778de0a7fe378391876a15f7433","impliedFormat":1},{"version":"52e8612d284467b4417143ca8fe54d30145fdfc3815f5b5ea9b14b677f422be5","impliedFormat":1},{"version":"a090a8a3b0ef2cceeb089acf4df95df72e7d934215896afe264ff6f734d66d15","impliedFormat":1},{"version":"a0259c6054e3ed2c5fb705b6638e384446cbcdf7fd2072c659b43bd56e214b9a","impliedFormat":1},{"version":"005319c82222e57934c7b211013eb6931829e46b2a61c5d9a1c3c25f8dc3ea90","impliedFormat":1},{"version":"151f422f08c8ca67b77c5c39d49278b4df452ef409237c8219be109ae3cdae9d","impliedFormat":1},{"version":"6466cbb0aa561e1c1a87850a1f066692f1692a0a9513c508a3886cd66a62dae8","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb5cfe79e5f80bd06b0cb8d75274f7710ccb0ba269d35ab06c45dad7bf50a450","signature":"9f2c77b3670856f0be5fd1a504cbc163606ceed481860513eca72634b32d3c7d","impliedFormat":1},{"version":"6d1d31f1786b80ab882f0844f2c99767f6f0c6538e94a4292775e8e741c6a802","impliedFormat":1},{"version":"57271ace81d2865cc16c47eb125f0f34d38ce536989895e8d6c9236f5fca4e1d","signature":"2a9464ab1154680f9a45713ad52ee914229ef5a0100cd8a7dc41e9c8dc8563c3","impliedFormat":1},{"version":"3a72663f675bb47f1c4a42ddf03d0b94442f767d270231af2c3e65a81a195d94","signature":"66b9118e963c55e4311125a3312c9d946106d43d9def22ed3f41bd52462a4c80","impliedFormat":1},{"version":"2c81020b79f5e9f087e7f5b3665533450999dfba029db049020a02581649422a","signature":"43b56e7f904cbc5ea05d44daa7a46044ffa69e065868df65b003157dbd5956fe","impliedFormat":1},{"version":"83c3cf713a4561204ae2316b33266be18e8dd858823f14f8ba02a47ba359d92f","signature":"d728c1eb02f8384410cf59b5698c2d9f52c7ad655e839d6dbb1f1ad64877cadf","impliedFormat":1},{"version":"6bf6420b513f4b548ba2da6baf7fd9ef8c13f7125ddfbdbfb8e04a206131c040","signature":"8158a29454ce0c7ddb8bd1e17062ce64f9c6d2fa4d8c844ade50a4189da2b05d","impliedFormat":1},{"version":"22110b658bd84f2cc193bf941e2313dc799f592424b5376fffd5fe21e1b15f87","signature":"79119a0b05f41118afb2d66ae50d7a36a4df53e9ea25d545ad008513afe7e510","impliedFormat":1},{"version":"eb7fd9013b9782bf257fc968373728f46ee6ed18e0b4530350e143656833ebd6","signature":"8c0faac21b200b337ed21f09ffedab948ed83200b1b41e4b2e5e1c751bd11c3b","impliedFormat":1},{"version":"5d810ff49a73754dbecd14c8936c32d1e1c42af8c3635ec72380d4f1b2009670","signature":"ea588380242774f14bbbbdce180cb43218d5cf788f864d311015910a428a7ec5","impliedFormat":1},{"version":"25057b50fcc66651f1acb841a0f872d844151a32eb9332b49f2b9723ccac711d","signature":"2b3d74e32bb0bd3cd9965f28ba76e5b6587232bf5dbe440f0363231849e42a93","impliedFormat":1},{"version":"b2e3018573b49a4f2a8c6b2b7472fb6c665de88b833a47169c4a565d1518a4af","signature":"b6c08b3fdc441e99db8d4c55838f76fa2024855eb6c64dd86bb77d831b29a449","impliedFormat":1},{"version":"b58f80095cd5db44743fa90aa4c24f70c1e820445f2f42d7cbe5f82450e111ce","signature":"b064caa285e15d91ac315e46f7a970940452b4a8f1c071736ca18a48faa98348","impliedFormat":1},{"version":"5c70463772e79053d76ed4ca991e48a369c8c1a0a55f1b7bdb98964b93c97064","signature":"7214a8af60b4039a192bf3460cf48b16c27272aed494e16c8fb375cbcab8a669","impliedFormat":1},{"version":"ee072494ac2f54647366f670806e13c59d6ac15b95b118c7d489c40d9c1c718f","signature":"d45382d88b9f313315c4693a3aceb2d137db236ed435726ccc3cb5f4f95fb696","impliedFormat":1},{"version":"bffccb7cd6245db255a421592298c1b84e141cf6a1c45c523d54bbf21607b4b3","signature":"ef963a484a85f604c7e9a105f7e53e6176e1d5cdb5d50c69b15188fa94b7ac07","impliedFormat":1},{"version":"4b7a89c94d301e1322e826c3ec402886e290cef23b5cd772e4ed1fceb0820181","signature":"f5d48ed660a093a592fb4d6711e62cacc74112af8ef529921da1d69850cb7246","impliedFormat":1},{"version":"b76ab52fed35ea1483b53a1a5b8065fa196291b29d38516f4310cca617b836a8","signature":"ed66b549cf33c8068d2d68f0e3cb42eb5476e55fcc730fb0d4853e22df31355b","impliedFormat":1},{"version":"ff2bcfc8ea435e32cf3e46979a50badc7cd0ff3adc3a827a6acc264b3c2b04d4","signature":"6d19e497dbbd0db80757a13d2ed759939d8f651a1d063570bc21359319f375b1","impliedFormat":1},{"version":"fabeb2404bc5ee310dd52d7ed4322914f57e1a7e3ec6fc59da04728b80d4f07e","signature":"8660e950fd61b3f60ae718284fef7d215011ed9d19ddf110ab688b9a69fc5e64","impliedFormat":1},{"version":"411aac6f5713c193891ac8c9bcc0db7a37159da7f91e412dd86e827ecc8c61f0","signature":"5ade073342145585fc0e64759dfcec8d0289e94abc75d2fb333522956c4f5a4b","impliedFormat":1},{"version":"d91770e85017b2623e7bc749dcc2357256cdc10bc041ff80eec21b6028158a05","signature":"68e069b7ef4d7fad012b2aab487ccd1ab728fadc06240683ce520642a7961451","impliedFormat":1}],"root":[151,[153,172]],"options":{"allowSyntheticDefaultImports":true,"declaration":true,"declarationMap":true,"emitDecoratorMetadata":true,"esModuleInterop":true,"experimentalDecorators":true,"jsx":1,"module":199,"noImplicitAny":true,"noImplicitThis":true,"noUncheckedIndexedAccess":false,"outDir":"./dist","rootDir":"./src","skipDefaultLibCheck":false,"sourceMap":true,"strict":true,"strictNullChecks":true,"strictPropertyInitialization":true,"target":8,"useUnknownInCatchVariables":true},"referencedMap":[[77,1],[78,2],[53,3],[57,4],[87,5],[83,6],[90,7],[94,8],[96,9],[97,10],[116,11],[99,12],[101,13],[103,14],[104,15],[105,16],[71,16],[106,17],[72,18],[107,19],[108,10],[109,20],[110,21],[68,22],[113,23],[115,24],[114,25],[112,26],[73,17],[69,27],[70,28],[100,29],[92,29],[93,30],[76,31],[119,29],[120,32],[122,13],[79,33],[81,34],[124,35],[129,36],[80,37],[131,37],[132,38],[133,39],[135,40],[137,40],[136,40],[85,41],[84,42],[86,40],[82,43],[139,44],[66,38],[140,8],[141,8],[142,45],[143,29],[147,37],[150,46],[59,47],[60,48],[149,47],[67,27],[65,37],[172,49],[159,50],[169,51],[158,52],[170,47],[155,53],[160,54],[166,55],[153,56],[164,57],[161,58],[167,57],[156,59],[168,57],[157,47],[171,60],[165,54],[163,54],[162,61]],"version":"5.6.3"} \ No newline at end of file From eaf28260f7f6233c069bbc5becbac3ab81bc52b8 Mon Sep 17 00:00:00 2001 From: Joshua Tag Howard Date: Mon, 28 Oct 2024 21:25:03 +0000 Subject: [PATCH 3/8] Add eslint and prettier --- .devcontainer/devcontainer.json | 31 ++++---- .eslintrc.js | 9 --- .prettierrc | 5 ++ .prettierrc.js | 6 -- .vscode/settings.json | 3 + README.md | 12 +-- eslint.config.mjs | 28 +++++++ package.json | 14 +++- src/index.d.ts | 99 ------------------------- src/index.tsx | 60 ++++++++------- src/lib/AstRenderer.ts | 51 +++++++------ src/lib/data/textStyleProps.ts | 38 +++++----- src/lib/parser.ts | 12 +-- src/lib/renderRules.tsx | 53 +++++++------ src/lib/styles.ts | 88 +++++++++++----------- src/lib/types.ts | 8 +- src/lib/util/Token.ts | 18 ++--- src/lib/util/cleanupTokens.ts | 6 +- src/lib/util/convertAdditionalStyles.ts | 2 +- src/lib/util/flattenInlineTokens.ts | 4 +- src/lib/util/getTokenTypeByToken.ts | 6 +- src/lib/util/groupTextTokens.ts | 4 +- src/lib/util/hasParents.ts | 2 +- src/lib/util/omitListItemParagraph.ts | 4 +- src/lib/util/openUrl.ts | 12 ++- src/lib/util/removeTextStyleProps.ts | 9 ++- src/lib/util/renderInlineAsText.ts | 6 +- src/lib/util/stringToTokens.ts | 4 +- src/lib/util/tokensToAST.ts | 14 ++-- tsconfig.tsbuildinfo | 2 +- 30 files changed, 273 insertions(+), 337 deletions(-) delete mode 100644 .eslintrc.js create mode 100644 .prettierrc delete mode 100644 .prettierrc.js create mode 100644 .vscode/settings.json create mode 100644 eslint.config.mjs delete mode 100644 src/index.d.ts diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index ee45b8e4..b012da2c 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,22 +1,27 @@ // For format details, see https://aka.ms/devcontainer.json. For config options, see the // README at: https://github.com/devcontainers/templates/tree/main/src/typescript-node { - "name": "Node.js & TypeScript", - // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile - "image": "mcr.microsoft.com/devcontainers/typescript-node:1-22-bookworm" + "name": "Node.js & TypeScript", + // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile + "image": "mcr.microsoft.com/devcontainers/typescript-node:1-22-bookworm", + "customizations": { + "vscode": { + "extensions": ["esbenp.prettier-vscode", "dbaeumer.vscode-eslint"] + } + } - // Features to add to the dev container. More info: https://containers.dev/features. - // "features": {}, + // Features to add to the dev container. More info: https://containers.dev/features. + // "features": {}, - // Use 'forwardPorts' to make a list of ports inside the container available locally. - // "forwardPorts": [], + // Use 'forwardPorts' to make a list of ports inside the container available locally. + // "forwardPorts": [], - // Use 'postCreateCommand' to run commands after the container is created. - // "postCreateCommand": "yarn install", + // Use 'postCreateCommand' to run commands after the container is created. + // "postCreateCommand": "yarn install", - // Configure tool-specific properties. - // "customizations": {}, + // Configure tool-specific properties. + // "customizations": {}, - // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. - // "remoteUser": "root" + // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. + // "remoteUser": "root" } diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index d46623ba..00000000 --- a/.eslintrc.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = { - root: true, - extends: '@react-native-community', - settings: { - react: { - version: require('./package.json').peerDependencies.react, - }, - } -}; diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..4b0d4ad5 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,5 @@ +{ + "bracketSpacing": false, + "singleQuote": false, + "trailingComma": "all" +} diff --git a/.prettierrc.js b/.prettierrc.js deleted file mode 100644 index 5c4de1a4..00000000 --- a/.prettierrc.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - bracketSpacing: false, - jsxBracketSameLine: true, - singleQuote: true, - trailingComma: 'all', -}; diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..1e9031c3 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "typescript.tsserver.experimental.enableProjectDiagnostics": true +} diff --git a/README.md b/README.md index bb352d88..55087f5d 100644 --- a/README.md +++ b/README.md @@ -269,7 +269,7 @@ Right aligned columns [link text](https://www.google.com) -[link with title](https://www.google.com 'title text!') +[link with title](https://www.google.com "title text!") Autoconverted link https://www.google.com (enable linkify to see) @@ -288,7 +288,7 @@ Autoconverted link https://www.google.com (enable linkify to see) ``` ![Minion](https://octodex.github.com/images/minion.png) -![Stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg 'The Stormtroopocat') +![Stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg "The Stormtroopocat") Like links, Images also have a footnote style syntax @@ -296,7 +296,7 @@ Like links, Images also have a footnote style syntax With a reference later in the document defining the URL location: -[id]: https://octodex.github.com/images/dojocat.jpg 'The Dojocat' +[id]: https://octodex.github.com/images/dojocat.jpg "The Dojocat" ``` @@ -499,13 +499,13 @@ And all of the video properties needed to render something meaningful are on the You can do some additional debugging of what the markdown instance is spitting out like this: ```jsx -import Markdown, {MarkdownIt} from 'react-native-markdown-display'; -import blockEmbedPlugin from 'markdown-it-block-embed'; +import Markdown, {MarkdownIt} from "react-native-markdown-display"; +import blockEmbedPlugin from "markdown-it-block-embed"; const markdownItInstance = MarkdownIt({typographer: true}).use( blockEmbedPlugin, { - containerClassName: 'video-embed', + containerClassName: "video-embed", }, ); diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..bc2f9e54 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,28 @@ +import eslint from "@eslint/js"; +import tseslint from "typescript-eslint"; + +export default tseslint.config( + eslint.configs.recommended, + ...tseslint.configs.strictTypeChecked, + ...tseslint.configs.stylisticTypeChecked, + { + languageOptions: { + parserOptions: { + projectService: { + allowDefaultProject: ["eslint.config.mjs"], + }, + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + tsconfigRootDir: import.meta.dirname, + }, + }, + }, + { + rules: { + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/no-unused-vars": ["error", {argsIgnorePattern: "^_"}], + }, + }, + { + ignores: ["dist/"], + }, +); diff --git a/package.json b/package.json index 617aa217..1af7596b 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,12 @@ "types": "src/index.d.ts", "scripts": { "build": "tsc", - "watch": "tsc -w" + "watch": "tsc -w", + "lint": "eslint .", + "lint-fix": "eslint . --fix", + "format": "prettier . --check", + "format-fix": "prettier . --write", + "check": "npm run lint && npm run format && npm run build -- --noEmit" }, "repository": { "type": "git", @@ -30,9 +35,14 @@ "react-native": ">=0.76.0" }, "devDependencies": { + "@eslint/js": "^9.13.0", + "@types/eslint__js": "^8.42.3", "@types/markdown-it": "^14.1.2", "@types/react": "^18.0.0", + "eslint": "^9.13.0", + "prettier": "^3.3.3", "react-native": "^0.76.0", - "typescript": "^5.6.3" + "typescript": "^5.6.3", + "typescript-eslint": "^8.12.0" } } diff --git a/src/index.d.ts b/src/index.d.ts deleted file mode 100644 index ca5ed4b6..00000000 --- a/src/index.d.ts +++ /dev/null @@ -1,99 +0,0 @@ -// tslint:disable:max-classes-per-file -import MarkdownIt from "markdown-it"; -import Token from "markdown-it/lib/token"; -import { ComponentType, ReactNode } from "react"; -import { StyleSheet, View } from "react-native"; - -export function getUniqueID(): string; -export function openUrl(url: string): void; - -export function hasParents(parents: any[], type: string): boolean; - -export type RenderFunction = ( - node: ASTNode, - children: ReactNode[], - parentNodes: ASTNode[], - styles: any, - styleObj?: any, - // must have this so that we can have fixed overrides with more arguments - ...args: any -) => ReactNode; - -export type RenderLinkFunction = ( - node: ASTNode, - children: ReactNode[], - parentNodes: ASTNode[], - styles: any, - onLinkPress?: (url: string) => boolean -) => ReactNode; - -export type RenderImageFunction = ( - node: ASTNode, - children: ReactNode[], - parentNodes: ASTNode[], - styles: any, - allowedImageHandlers: string[], - defaultImageHandler: string | null -) => ReactNode; - -export interface RenderRules { - [name: string]: RenderFunction | undefined; - link?: RenderLinkFunction; - blocklink?: RenderLinkFunction; - image?: RenderImageFunction; -} - -export const renderRules: RenderRules; - -export interface MarkdownParser { - parse: (value: string, options: any) => Token[]; -} - -export interface ASTNode { - type: string; - sourceType: string; // original source token name - key: string; - content: string; - markup: string; - tokenIndex: number; - index: number; - attributes: Record; - children: ASTNode[]; -} - -export class AstRenderer { - constructor(renderRules: RenderRules, style?: any); - getRenderFunction(type: string): RenderFunction; - renderNode(node: any, parentNodes: ReadonlyArray): ReactNode; - render(nodes: ReadonlyArray): View; -} - -export function parser( - source: string, - renderer: (node: ASTNode) => View, - parser: MarkdownParser -): any; - -export function stringToTokens( - source: string, - markdownIt: MarkdownParser -): Token[]; - -export function tokensToAST(tokens: ReadonlyArray): ASTNode[]; - -export interface MarkdownProps { - children?: ReactNode; - rules?: RenderRules; - style?: StyleSheet.NamedStyles; - renderer?: AstRenderer; - markdownit?: MarkdownIt; - mergeStyle?: boolean; - debugPrintTree?: boolean; - onLinkPress?: (url: string) => boolean; -} - -type MarkdownStatic = ComponentType; -export const Markdown: MarkdownStatic; -export type Markdown = MarkdownStatic; -export { MarkdownIt }; -export default Markdown; diff --git a/src/index.tsx b/src/index.tsx index 990d448a..4aed590c 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,21 +1,20 @@ -/* eslint-disable react-refresh/only-export-components */ import MarkdownIt from "markdown-it"; -import type { ReactNode } from "react"; -import React, { useMemo } from "react"; -import type { TextStyle, ViewStyle } from "react-native"; -import { StyleSheet, Text } from "react-native"; +import type {ReactNode} from "react"; +import React, {useMemo} from "react"; +import type {TextStyle, ViewStyle} from "react-native"; +import {StyleSheet, Text} from "react-native"; import AstRenderer from "./lib/AstRenderer"; import parser from "./lib/parser"; -import type { RenderRules } from "./lib/renderRules"; +import type {RenderRules} from "./lib/renderRules"; import renderRules from "./lib/renderRules"; -import { styles } from "./lib/styles"; -import type { ASTNode } from "./lib/types"; +import {styles} from "./lib/styles"; +import type {ASTNode} from "./lib/types"; import removeTextStyleProps from "./lib/util/removeTextStyleProps"; function getStyle( mergeStyle: boolean, - style: StyleSheet.NamedStyles | undefined + style: StyleSheet.NamedStyles | undefined, ): ReturnType { let useStyles: Record = {}; @@ -71,17 +70,17 @@ const getRenderer = ( topLevelMaxExceededItem: React.ReactNode, allowedImageHandlers: string[], defaultImageHandler: string, - debugPrintTree: boolean + debugPrintTree: boolean, ): AstRenderer => { if (renderer && rules) { console.warn( - "react-native-markdown-display you are using renderer and rules at the same time. This is not possible, props.rules is ignored" + "react-native-markdown-display you are using renderer and rules at the same time. This is not possible, props.rules is ignored", ); } if (renderer && style) { console.warn( - "react-native-markdown-display you are using renderer and style at the same time. This is not possible, props.style is ignored" + "react-native-markdown-display you are using renderer and style at the same time. This is not possible, props.style is ignored", ); } @@ -93,7 +92,7 @@ const getRenderer = ( return renderer; } else { throw new TypeError( - "Provided renderer is not compatible with function or AstRenderer. please change" + "Provided renderer is not compatible with function or AstRenderer. please change", ); } } else { @@ -110,7 +109,7 @@ const getRenderer = ( topLevelMaxExceededItem, allowedImageHandlers, defaultImageHandler, - debugPrintTree + debugPrintTree, ); } }; @@ -173,7 +172,7 @@ const Markdown: React.FC< topLevelMaxExceededItem, allowedImageHandlers, defaultImageHandler, - debugPrintTree + debugPrintTree, ), [ maxTopLevelChildren, @@ -186,7 +185,7 @@ const Markdown: React.FC< allowedImageHandlers, defaultImageHandler, debugPrintTree, - ] + ], ); const memoizedParser = useMemo(() => markdownit, [markdownit]); @@ -194,23 +193,22 @@ const Markdown: React.FC< return parser( children, (nodes: readonly ASTNode[]): ReactNode => momoizedRenderer.render(nodes), - memoizedParser + memoizedParser, ); - } + }, ); export default Markdown; -export { default as MarkdownIt } from "markdown-it"; -export { default as AstRenderer } from "./lib/AstRenderer"; -export { default as textStyleProps } from "./lib/data/textStyleProps"; -export { default as parser } from "./lib/parser"; -export { default as renderRules } from "./lib/renderRules"; -export { styles } from "./lib/styles"; -export { default as getUniqueID } from "./lib/util/getUniqueID"; -export { default as hasParents } from "./lib/util/hasParents"; -export { default as openUrl } from "./lib/util/openUrl"; -export { default as removeTextStyleProps } from "./lib/util/removeTextStyleProps"; -export { stringToTokens } from "./lib/util/stringToTokens"; -export { default as tokensToAST } from "./lib/util/tokensToAST"; - +export {default as MarkdownIt} from "markdown-it"; +export {default as AstRenderer} from "./lib/AstRenderer"; +export {default as textStyleProps} from "./lib/data/textStyleProps"; +export {default as parser} from "./lib/parser"; +export {default as renderRules} from "./lib/renderRules"; +export {styles} from "./lib/styles"; +export {default as getUniqueID} from "./lib/util/getUniqueID"; +export {default as hasParents} from "./lib/util/hasParents"; +export {default as openUrl} from "./lib/util/openUrl"; +export {default as removeTextStyleProps} from "./lib/util/removeTextStyleProps"; +export {stringToTokens} from "./lib/util/stringToTokens"; +export {default as tokensToAST} from "./lib/util/tokensToAST"; diff --git a/src/lib/AstRenderer.ts b/src/lib/AstRenderer.ts index 0543e79c..003cc62e 100644 --- a/src/lib/AstRenderer.ts +++ b/src/lib/AstRenderer.ts @@ -1,12 +1,12 @@ -import { StyleSheet, ViewStyle } from "react-native"; +import {StyleSheet, ViewStyle} from "react-native"; -import getUniqueID from "./util/getUniqueID"; import convertAdditionalStyles from "./util/convertAdditionalStyles"; +import getUniqueID from "./util/getUniqueID"; +import {ReactNode} from "react"; import textStyleProps from "./data/textStyleProps"; -import { RenderRules } from "./renderRules"; -import { ASTNode } from "./types"; -import { ReactNode } from "react"; +import {RenderRules} from "./renderRules"; +import {ASTNode} from "./types"; export default class AstRenderer { constructor( @@ -17,15 +17,15 @@ export default class AstRenderer { private topLevelMaxExceededItem: React.ReactNode, private allowedImageHandlers: string[], private defaultImageHandler: string, - private debugPrintTree: boolean + private debugPrintTree: boolean, ) {} getRenderFunction(type: R): RenderRules[R] { const renderFunction = this.renderRules[type]; - if (!renderFunction) { + if (!renderFunction as unknown) { console.warn( - `Warning, unknown render rule encountered: ${type}. 'unknown' render rule used (by default, returns null - nothing rendered)` + `Warning, unknown render rule encountered: ${type}. 'unknown' render rule used (by default, returns null - nothing rendered)`, ); return this.renderRules.unknown; } @@ -36,10 +36,11 @@ export default class AstRenderer { renderNode(node: ASTNode, parentNodes: ASTNode[], isRoot = false): ReactNode { const parents = [...parentNodes]; - if (this.debugPrintTree === true) { + if (this.debugPrintTree) { let str = ""; - for (let a = 0; a < parents.length; a++) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + for (const _ of parents) { str = str + "-"; } @@ -61,7 +62,7 @@ export default class AstRenderer { children, parentNodes, this.style, - this.onLinkPress + this.onLinkPress, ); } @@ -72,7 +73,7 @@ export default class AstRenderer { parentNodes, this.style, this.allowedImageHandlers, - this.defaultImageHandler + this.defaultImageHandler, ); } @@ -91,15 +92,16 @@ export default class AstRenderer { let refStyle = {}; if ( - parentNodes[a].attributes && parentNodes[a].attributes?.style && typeof parentNodes[a].attributes?.style === "string" ) { - refStyle = convertAdditionalStyles(parentNodes[a].attributes?.style); + refStyle = convertAdditionalStyles( + String(parentNodes[a].attributes?.style), + ); } // combine in specific styles for the object - if (this.style[parentNodes[a].type]) { + if (this.style[parentNodes[a].type] as unknown) { refStyle = { ...refStyle, ...StyleSheet.flatten(this.style[parentNodes[a].type]), @@ -125,10 +127,11 @@ export default class AstRenderer { // then work out if any of them are text styles that should be used in the end. const arr = Object.keys(refStyle) as (keyof ViewStyle)[]; - for (let b = 0; b < arr.length; b++) { - if (textStyleProps.includes(arr[b])) { - // @ts-expect-error - this is fine - styleObj[arr[b]] = refStyle[arr[b]]; + for (const key of arr) { + if (textStyleProps.includes(key)) { + // @ts-expect-error this is fine + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + styleObj[key] = refStyle[key]; } } } @@ -138,14 +141,14 @@ export default class AstRenderer { children, parentNodes, this.style, - styleObj + styleObj, ); } // cull top level children if ( - isRoot === true && + isRoot && this.maxTopLevelChildren && children.length > this.maxTopLevelChildren ) { @@ -159,12 +162,12 @@ export default class AstRenderer { node, children, parentNodes, - this.style + this.style, ); } - render(nodes: ReadonlyArray): ReactNode { - const root: ASTNode = { type: "body", key: getUniqueID(), children: nodes }; + render(nodes: readonly ASTNode[]): ReactNode { + const root: ASTNode = {type: "body", key: getUniqueID(), children: nodes}; return this.renderNode(root, [], true); } } diff --git a/src/lib/data/textStyleProps.ts b/src/lib/data/textStyleProps.ts index c48139d0..a9350870 100644 --- a/src/lib/data/textStyleProps.ts +++ b/src/lib/data/textStyleProps.ts @@ -1,21 +1,21 @@ export default [ - 'textShadowOffset', - 'color', - 'fontSize', - 'fontStyle', - 'fontWeight', - 'lineHeight', - 'textAlign', - 'textDecorationLine', - 'textShadowColor', - 'fontFamily', - 'textShadowRadius', - 'includeFontPadding', - 'textAlignVertical', - 'fontVariant', - 'letterSpacing', - 'textDecorationColor', - 'textDecorationStyle', - 'textTransform', - 'writingDirection', + "textShadowOffset", + "color", + "fontSize", + "fontStyle", + "fontWeight", + "lineHeight", + "textAlign", + "textDecorationLine", + "textShadowColor", + "fontFamily", + "textShadowRadius", + "includeFontPadding", + "textAlignVertical", + "fontVariant", + "letterSpacing", + "textDecorationColor", + "textDecorationStyle", + "textTransform", + "writingDirection", ]; diff --git a/src/lib/parser.ts b/src/lib/parser.ts index ad8975ac..66bb1dbf 100644 --- a/src/lib/parser.ts +++ b/src/lib/parser.ts @@ -1,17 +1,17 @@ import tokensToAST from "./util/tokensToAST"; -import { stringToTokens } from "./util/stringToTokens"; -import { cleanupTokens } from "./util/cleanupTokens"; +import {stringToTokens} from "./util/stringToTokens"; +import {cleanupTokens} from "./util/cleanupTokens"; import groupTextTokens from "./util/groupTextTokens"; import omitListItemParagraph from "./util/omitListItemParagraph"; -import { ReactNode } from "react"; -import MarkdownIt, { Token } from "markdown-it"; +import {ReactNode} from "react"; +import MarkdownIt, {Token} from "markdown-it"; import TextToken from "./util/Token"; -import { ASTNode } from "./types"; +import {ASTNode} from "./types"; export default function parser( source: string, renderer: (source: ASTNode[]) => ReactNode, - markdownIt: MarkdownIt + markdownIt: MarkdownIt, ): ReactNode { if (Array.isArray(source)) { return renderer(source); diff --git a/src/lib/renderRules.tsx b/src/lib/renderRules.tsx index 926d7dea..1efd3a58 100644 --- a/src/lib/renderRules.tsx +++ b/src/lib/renderRules.tsx @@ -1,5 +1,5 @@ -import type { ReactNode } from "react"; -import type { ViewStyle } from "react-native"; +import type {ReactNode} from "react"; +import type {ViewStyle} from "react-native"; import { Platform, StyleSheet, @@ -9,7 +9,7 @@ import { } from "react-native"; import textStyleProps from "./data/textStyleProps"; -import type { ASTNode } from "./types"; +import type {ASTNode} from "./types"; import hasParents from "./util/hasParents"; import openUrl from "./util/openUrl"; @@ -17,7 +17,7 @@ export type RenderFunction = ( node: ASTNode, children: ReactNode[], parentNodes: ASTNode[], - styles: Record + styles: Record, ) => ReactNode; export type InheritingRenderFunction = ( @@ -25,7 +25,7 @@ export type InheritingRenderFunction = ( children: ReactNode[], parentNodes: ASTNode[], styles: Record, - inheritedStyles?: Record + inheritedStyles?: Record, ) => ReactNode; export type RenderLinkFunction = ( @@ -33,7 +33,7 @@ export type RenderLinkFunction = ( children: ReactNode[], parentNodes: ASTNode[], styles: Record, - onLinkPress?: (url: string) => boolean + onLinkPress?: (url: string) => boolean, ) => ReactNode; export type RenderImageFunction = ( @@ -42,7 +42,7 @@ export type RenderImageFunction = ( parentNodes: ASTNode[], styles: Record, allowedImageHandlers: string[], - defaultImageHandler: string | null + defaultImageHandler: string | null, ) => ReactNode; export type SomeRenderFunction = @@ -191,11 +191,11 @@ const renderRules: RenderRules = { const modifiedInheritedStylesObj: Record = {}; - for (let b = 0; b < arr.length; b++) { - if (textStyleProps.includes(arr[b])) { + for (const key of arr) { + if (textStyleProps.includes(key)) { // @ts-expect-error - this is fine // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - modifiedInheritedStylesObj[arr[b]] = refStyle[arr[b]]; + modifiedInheritedStylesObj[key] = refStyle[key]; } } @@ -219,7 +219,7 @@ const renderRules: RenderRules = { if (hasParents(parent, "ordered_list")) { const orderedListIndex = parent.findIndex( - (el) => el.type === "ordered_list" + (el) => el.type === "ordered_list", ); const orderedList = parent[orderedListIndex]; @@ -259,11 +259,11 @@ const renderRules: RenderRules = { ), code_block: ( - { content, key }, + {content, key}, _children, _parent, styles, - inheritedStyles = {} + inheritedStyles = {}, ) => { // we trim new lines off the end of code blocks because the parser sends an extra one. @@ -277,13 +277,7 @@ const renderRules: RenderRules = { ); }, - fence: ( - { content, key }, - _children, - _parent, - styles, - inheritedStyles = {} - ) => { + fence: ({content, key}, _children, _parent, styles, inheritedStyles = {}) => { // we trim new lines off the end of code blocks because the parser sends an extra one. if (typeof content === "string" && content.endsWith("\n")) { @@ -335,7 +329,10 @@ const renderRules: RenderRules = { key={node.key} style={styles.link} onPress={ - node.attributes && (() => openUrl(node.attributes?.href, onLinkPress)) + node.attributes && + (() => { + openUrl(String(node.attributes?.href), onLinkPress); + }) } > {children} @@ -345,7 +342,10 @@ const renderRules: RenderRules = { openUrl(node.attributes?.href, onLinkPress)) + node.attributes && + (() => { + openUrl(String(node.attributes?.href), onLinkPress); + }) } style={styles.blocklink} > @@ -360,13 +360,13 @@ const renderRules: RenderRules = { _parent, styles, allowedImageHandlers, - defaultImageHandler + defaultImageHandler, ) => { if (!node.attributes) { return null; } - const { src, alt } = node.attributes; + const {src, alt} = node.attributes; if (typeof src !== "string") { return null; @@ -386,7 +386,7 @@ const renderRules: RenderRules = { key: node.key, style: styles._VIEW_SAFE_image, source: { - uri: show ? src : `${defaultImageHandler}${src}`, + uri: show ? src : `${String(defaultImageHandler)}${src}`, }, }; @@ -394,13 +394,12 @@ const renderRules: RenderRules = { // @ts-expect-error - this is fine imageProps.accessible = true; // @ts-expect-error - this is fine - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment imageProps.accessibilityLabel = alt; } if (imageProps.style.overflow === "scroll") { throw new Error( - "Image style property 'overflow' is set to 'scroll'. This is not supported" + "Image style property 'overflow' is set to 'scroll'. This is not supported", ); } // @ts-expect-error - this is fine diff --git a/src/lib/styles.ts b/src/lib/styles.ts index e1b5e39e..1590643b 100644 --- a/src/lib/styles.ts +++ b/src/lib/styles.ts @@ -1,4 +1,4 @@ -import {Platform} from 'react-native'; +import {Platform} from "react-native"; // this is converted to a stylesheet internally at run time with StyleSheet.create( export const styles = { @@ -7,51 +7,51 @@ export const styles = { // Headings heading1: { - flexDirection: 'row', + flexDirection: "row", fontSize: 32, }, heading2: { - flexDirection: 'row', + flexDirection: "row", fontSize: 24, }, heading3: { - flexDirection: 'row', + flexDirection: "row", fontSize: 18, }, heading4: { - flexDirection: 'row', + flexDirection: "row", fontSize: 16, }, heading5: { - flexDirection: 'row', + flexDirection: "row", fontSize: 13, }, heading6: { - flexDirection: 'row', + flexDirection: "row", fontSize: 11, }, // Horizontal Rule hr: { - backgroundColor: '#000000', + backgroundColor: "#000000", height: 1, }, // Emphasis strong: { - fontWeight: 'bold', + fontWeight: "bold", }, em: { - fontStyle: 'italic', + fontStyle: "italic", }, s: { - textDecorationLine: 'line-through', + textDecorationLine: "line-through", }, // Blockquotes blockquote: { - backgroundColor: '#F5F5F5', - borderColor: '#CCC', + backgroundColor: "#F5F5F5", + borderColor: "#CCC", borderLeftWidth: 4, marginLeft: 5, paddingHorizontal: 5, @@ -61,8 +61,8 @@ export const styles = { bullet_list: {}, ordered_list: {}, list_item: { - flexDirection: 'row', - justifyContent: 'flex-start', + flexDirection: "row", + justifyContent: "flex-start", }, // @pseudo class, does not have a unique render rule bullet_list_icon: { @@ -86,46 +86,46 @@ export const styles = { // Code code_inline: { borderWidth: 1, - borderColor: '#CCCCCC', - backgroundColor: '#f5f5f5', + borderColor: "#CCCCCC", + backgroundColor: "#f5f5f5", padding: 10, borderRadius: 4, ...Platform.select({ - ['ios']: { - fontFamily: 'Courier', + ["ios"]: { + fontFamily: "Courier", }, - ['android']: { - fontFamily: 'monospace', + ["android"]: { + fontFamily: "monospace", }, }), }, code_block: { borderWidth: 1, - borderColor: '#CCCCCC', - backgroundColor: '#f5f5f5', + borderColor: "#CCCCCC", + backgroundColor: "#f5f5f5", padding: 10, borderRadius: 4, ...Platform.select({ - ['ios']: { - fontFamily: 'Courier', + ["ios"]: { + fontFamily: "Courier", }, - ['android']: { - fontFamily: 'monospace', + ["android"]: { + fontFamily: "monospace", }, }), }, fence: { borderWidth: 1, - borderColor: '#CCCCCC', - backgroundColor: '#f5f5f5', + borderColor: "#CCCCCC", + backgroundColor: "#f5f5f5", padding: 10, borderRadius: 4, ...Platform.select({ - ['ios']: { - fontFamily: 'Courier', + ["ios"]: { + fontFamily: "Courier", }, - ['android']: { - fontFamily: 'monospace', + ["android"]: { + fontFamily: "monospace", }, }), }, @@ -133,7 +133,7 @@ export const styles = { // Tables table: { borderWidth: 1, - borderColor: '#000000', + borderColor: "#000000", borderRadius: 3, }, thead: {}, @@ -144,8 +144,8 @@ export const styles = { }, tr: { borderBottomWidth: 1, - borderColor: '#000000', - flexDirection: 'row', + borderColor: "#000000", + flexDirection: "row", }, td: { flex: 1, @@ -154,11 +154,11 @@ export const styles = { // Links link: { - textDecorationLine: 'underline', + textDecorationLine: "underline", }, blocklink: { flex: 1, - borderColor: '#000000', + borderColor: "#000000", borderBottomWidth: 1, }, @@ -173,14 +173,14 @@ export const styles = { paragraph: { marginTop: 10, marginBottom: 10, - flexWrap: 'wrap', - flexDirection: 'row', - alignItems: 'flex-start', - justifyContent: 'flex-start', - width: '100%', + flexWrap: "wrap", + flexDirection: "row", + alignItems: "flex-start", + justifyContent: "flex-start", + width: "100%", }, hardbreak: { - width: '100%', + width: "100%", height: 1, }, softbreak: {}, diff --git a/src/lib/types.ts b/src/lib/types.ts index caf8e4e3..d5cd4d07 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -1,16 +1,16 @@ -import type { RenderRules } from "./renderRules"; +import type {RenderRules} from "./renderRules"; export interface ASTNode { type: T; sourceType?: string; // original source token name sourceInfo?: string; - sourceMeta?: string; + sourceMeta?: unknown; block?: boolean; key: string; content?: string; markup?: string; tokenIndex?: number; index?: number; - attributes?: Record; - children: ReadonlyArray; + attributes?: Record; + children: readonly ASTNode[]; } diff --git a/src/lib/util/Token.ts b/src/lib/util/Token.ts index 9939cf3e..f10d7605 100644 --- a/src/lib/util/Token.ts +++ b/src/lib/util/Token.ts @@ -1,26 +1,20 @@ -import { Token } from "markdown-it"; +import {Token} from "markdown-it"; export default class TextToken { constructor( public type: "textgroup", - public nesting: number + public nesting: number, ) {} public get children(): Token[] { return []; } - public get tag(): "" { - return ""; - } + public readonly tag = ""; - public get content(): "" { - return ""; - } + public readonly content = ""; - public get attrs(): null { - return null; - } + public readonly attrs = null; public get info(): undefined { return undefined; } @@ -31,5 +25,5 @@ export default class TextToken { return undefined; } - public block: boolean = false; + public block = false; } diff --git a/src/lib/util/cleanupTokens.ts b/src/lib/util/cleanupTokens.ts index c17afbcf..a1295a69 100644 --- a/src/lib/util/cleanupTokens.ts +++ b/src/lib/util/cleanupTokens.ts @@ -1,11 +1,11 @@ import getTokenTypeByToken from "./getTokenTypeByToken"; import flattenInlineTokens from "./flattenInlineTokens"; import renderInlineAsText from "./renderInlineAsText"; -import { Token } from "markdown-it"; +import {Token} from "markdown-it"; import TextToken from "./Token"; export function cleanupTokens( - tokens: (Token | TextToken)[] + tokens: (Token | TextToken)[], ): (Token | TextToken)[] { tokens = flattenInlineTokens(tokens); tokens.forEach((token) => { @@ -20,7 +20,7 @@ export function cleanupTokens( if (token.type === "image") { if (token.attrs) token.attrs[token.attrIndex("alt")][1] = renderInlineAsText( - token.children ?? [] + token.children ?? [], ); } }); diff --git a/src/lib/util/convertAdditionalStyles.ts b/src/lib/util/convertAdditionalStyles.ts index 6186a6cb..19d38b0e 100644 --- a/src/lib/util/convertAdditionalStyles.ts +++ b/src/lib/util/convertAdditionalStyles.ts @@ -1,4 +1,4 @@ -import cssToReactNative, { Style, StyleTuple } from "css-to-react-native"; +import cssToReactNative, {Style, StyleTuple} from "css-to-react-native"; export default function convertAdditionalStyles(style: string): Style { const rules = style.split(";"); diff --git a/src/lib/util/flattenInlineTokens.ts b/src/lib/util/flattenInlineTokens.ts index 8e165918..3379fe04 100644 --- a/src/lib/util/flattenInlineTokens.ts +++ b/src/lib/util/flattenInlineTokens.ts @@ -1,8 +1,8 @@ -import { Token } from "markdown-it"; +import {Token} from "markdown-it"; import TextToken from "./Token"; export default function flattenTokens( - tokens: (Token | TextToken)[] + tokens: (Token | TextToken)[], ): (Token | TextToken)[] { return tokens.reduce<(Token | TextToken)[]>((acc, curr) => { if (curr.type === "inline" && curr.children && curr.children.length > 0) { diff --git a/src/lib/util/getTokenTypeByToken.ts b/src/lib/util/getTokenTypeByToken.ts index 728cc114..b5a3d232 100644 --- a/src/lib/util/getTokenTypeByToken.ts +++ b/src/lib/util/getTokenTypeByToken.ts @@ -1,5 +1,5 @@ -import { Token } from "markdown-it"; -import { RenderRules } from "../renderRules"; +import {Token} from "markdown-it"; +import {RenderRules} from "../renderRules"; import TextToken from "./Token"; const regSelectOpenClose = /_open|_close/g; @@ -28,7 +28,7 @@ const regSelectOpenClose = /_open|_close/g; * @return {String} */ export default function getTokenTypeByToken( - token: Token | TextToken + token: Token | TextToken, ): keyof RenderRules { let cleanedType: keyof RenderRules | "heading" = "unknown"; diff --git a/src/lib/util/groupTextTokens.ts b/src/lib/util/groupTextTokens.ts index d5c5ccd3..d4478a1e 100644 --- a/src/lib/util/groupTextTokens.ts +++ b/src/lib/util/groupTextTokens.ts @@ -1,8 +1,8 @@ -import { Token } from "markdown-it"; +import {Token} from "markdown-it"; import TextToken from "./Token"; export default function groupTextTokens( - tokens: (Token | TextToken)[] + tokens: (Token | TextToken)[], ): (Token | TextToken)[] { const result: (Token | TextToken)[] = []; diff --git a/src/lib/util/hasParents.ts b/src/lib/util/hasParents.ts index d23ecc35..53bf84c1 100644 --- a/src/lib/util/hasParents.ts +++ b/src/lib/util/hasParents.ts @@ -1,4 +1,4 @@ -import { ASTNode } from "../types"; +import {ASTNode} from "../types"; export default function hasParents(parents: ASTNode[], type: string): boolean { return parents.findIndex((el) => el.type === type) > -1; diff --git a/src/lib/util/omitListItemParagraph.ts b/src/lib/util/omitListItemParagraph.ts index 7b9c0c0c..ee05abff 100644 --- a/src/lib/util/omitListItemParagraph.ts +++ b/src/lib/util/omitListItemParagraph.ts @@ -1,8 +1,8 @@ -import { Token } from "markdown-it"; +import {Token} from "markdown-it"; import TextToken from "./Token"; export default function omitListItemParagraph( - tokens: (Token | TextToken)[] + tokens: (Token | TextToken)[], ): (Token | TextToken)[] { // used to ensure that we remove the correct ending paragraph token let depth: number | null = null; diff --git a/src/lib/util/openUrl.ts b/src/lib/util/openUrl.ts index dd71856d..06be37cb 100644 --- a/src/lib/util/openUrl.ts +++ b/src/lib/util/openUrl.ts @@ -1,15 +1,19 @@ -import { Linking } from "react-native"; +import {Linking} from "react-native"; export default function openUrl( url: string, - customCallback?: (url: string) => boolean + customCallback?: (url: string) => boolean, ): void { if (customCallback) { const result = customCallback(url); if (url && result && typeof result === "boolean") { - Linking.openURL(url); + Linking.openURL(url).catch((err: unknown) => { + console.warn(err); + }); } } else if (url) { - Linking.openURL(url); + Linking.openURL(url).catch((err: unknown) => { + console.warn(err); + }); } } diff --git a/src/lib/util/removeTextStyleProps.ts b/src/lib/util/removeTextStyleProps.ts index b4e5f740..bb44078f 100644 --- a/src/lib/util/removeTextStyleProps.ts +++ b/src/lib/util/removeTextStyleProps.ts @@ -1,15 +1,16 @@ -import { ViewStyle } from "react-native"; +import {ViewStyle} from "react-native"; import textStyleProps from "../data/textStyleProps"; export default function removeTextStyleProps(style: ViewStyle): ViewStyle { const intersection = textStyleProps.filter((value) => - Object.keys(style).includes(value) + Object.keys(style).includes(value), ); - const obj = { ...style }; + const obj = {...style}; intersection.forEach((value) => { - // @ts-ignore + // @ts-expect-error this is fine + // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete obj[value]; }); diff --git a/src/lib/util/renderInlineAsText.ts b/src/lib/util/renderInlineAsText.ts index 3d9101d6..5bf26105 100644 --- a/src/lib/util/renderInlineAsText.ts +++ b/src/lib/util/renderInlineAsText.ts @@ -1,9 +1,9 @@ -import { Token } from "markdown-it"; +import {Token} from "markdown-it"; export default function renderInlineAsText(tokens: Token[]): string { - var result = ""; + let result = ""; - for (var i = 0, len = tokens.length; i < len; i++) { + for (let i = 0, len = tokens.length; i < len; i++) { if (tokens[i].type === "text") { result += tokens[i].content; } else if (tokens[i].type === "image") { diff --git a/src/lib/util/stringToTokens.ts b/src/lib/util/stringToTokens.ts index 9d327ae3..ceb48e70 100644 --- a/src/lib/util/stringToTokens.ts +++ b/src/lib/util/stringToTokens.ts @@ -1,8 +1,8 @@ -import MarkdownIt, { Token } from "markdown-it"; +import MarkdownIt, {Token} from "markdown-it"; export function stringToTokens( source: string, - markdownIt: MarkdownIt + markdownIt: MarkdownIt, ): Token[] { let result: Token[] = []; try { diff --git a/src/lib/util/tokensToAST.ts b/src/lib/util/tokensToAST.ts index dd8f23d2..c132091f 100644 --- a/src/lib/util/tokensToAST.ts +++ b/src/lib/util/tokensToAST.ts @@ -1,7 +1,7 @@ -import getUniqueID from "./getUniqueID"; +import {Token} from "markdown-it"; +import {ASTNode} from "../types"; import getTokenTypeByToken from "./getTokenTypeByToken"; -import { Token } from "markdown-it"; -import { ASTNode } from "../types"; +import getUniqueID from "./getUniqueID"; import TextToken from "./Token"; function createNode(token: Token | TextToken, tokenIndex: number): ASTNode { @@ -13,7 +13,7 @@ function createNode(token: Token | TextToken, tokenIndex: number): ASTNode { if (token.attrs) { attributes = token.attrs.reduce((prev, curr) => { const [name, value] = curr; - return { ...prev, [name]: value }; + return {...prev, [name]: value}; }, {}); } @@ -21,7 +21,7 @@ function createNode(token: Token | TextToken, tokenIndex: number): ASTNode { type, sourceType: token.type, sourceInfo: token.info, - sourceMeta: token.meta, + sourceMeta: token.meta as unknown, block: token.block, markup: token.markup, key: getUniqueID() + "_" + type, @@ -33,8 +33,8 @@ function createNode(token: Token | TextToken, tokenIndex: number): ASTNode { }; } -export default function tokensToAST(tokens: (Token | TextToken)[]): ASTNode[] { - let stack = []; +export default function tokensToAST(tokens?: (Token | TextToken)[]): ASTNode[] { + const stack = []; let children: ASTNode[] = []; if (!tokens || tokens.length === 0) { diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo index bc51d918..6bf8f8a4 100644 --- a/tsconfig.tsbuildinfo +++ b/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/@types/linkify-it/build/index.cjs.d.ts","./node_modules/@types/mdurl/build/index.cjs.d.ts","./node_modules/@types/markdown-it/dist/index.cjs.d.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/prop-types/index.d.ts","./node_modules/@types/react/index.d.ts","./node_modules/react-native/types/modules/BatchedBridge.d.ts","./node_modules/react-native/types/modules/Codegen.d.ts","./node_modules/react-native/types/modules/Devtools.d.ts","./node_modules/react-native/types/modules/globals.d.ts","./node_modules/react-native/types/modules/LaunchScreen.d.ts","./node_modules/react-native/types/private/Utilities.d.ts","./node_modules/react-native/types/public/Insets.d.ts","./node_modules/react-native/types/public/ReactNativeTypes.d.ts","./node_modules/react-native/Libraries/Types/CoreEventTypes.d.ts","./node_modules/react-native/types/public/ReactNativeRenderer.d.ts","./node_modules/react-native/Libraries/Components/Touchable/Touchable.d.ts","./node_modules/react-native/Libraries/Components/View/ViewAccessibility.d.ts","./node_modules/react-native/Libraries/Components/View/ViewPropTypes.d.ts","./node_modules/react-native/Libraries/Components/RefreshControl/RefreshControl.d.ts","./node_modules/react-native/Libraries/Components/ScrollView/ScrollView.d.ts","./node_modules/react-native/Libraries/Components/View/View.d.ts","./node_modules/react-native/Libraries/Image/ImageResizeMode.d.ts","./node_modules/react-native/Libraries/Image/ImageSource.d.ts","./node_modules/react-native/Libraries/Image/Image.d.ts","./node_modules/@react-native/virtualized-lists/Lists/VirtualizedList.d.ts","./node_modules/@react-native/virtualized-lists/index.d.ts","./node_modules/react-native/Libraries/Lists/FlatList.d.ts","./node_modules/react-native/Libraries/ReactNative/RendererProxy.d.ts","./node_modules/react-native/Libraries/Lists/SectionList.d.ts","./node_modules/react-native/Libraries/Text/Text.d.ts","./node_modules/react-native/Libraries/Animated/Animated.d.ts","./node_modules/react-native/Libraries/StyleSheet/StyleSheetTypes.d.ts","./node_modules/react-native/Libraries/StyleSheet/StyleSheet.d.ts","./node_modules/react-native/Libraries/StyleSheet/processColor.d.ts","./node_modules/react-native/Libraries/ActionSheetIOS/ActionSheetIOS.d.ts","./node_modules/react-native/Libraries/Alert/Alert.d.ts","./node_modules/react-native/Libraries/Animated/Easing.d.ts","./node_modules/react-native/Libraries/Animated/useAnimatedValue.d.ts","./node_modules/react-native/Libraries/vendor/emitter/EventEmitter.d.ts","./node_modules/react-native/Libraries/EventEmitter/RCTDeviceEventEmitter.d.ts","./node_modules/react-native/Libraries/EventEmitter/RCTNativeAppEventEmitter.d.ts","./node_modules/react-native/Libraries/AppState/AppState.d.ts","./node_modules/react-native/Libraries/BatchedBridge/NativeModules.d.ts","./node_modules/react-native/Libraries/Components/AccessibilityInfo/AccessibilityInfo.d.ts","./node_modules/react-native/Libraries/Components/ActivityIndicator/ActivityIndicator.d.ts","./node_modules/react-native/Libraries/Components/Clipboard/Clipboard.d.ts","./node_modules/react-native/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.d.ts","./node_modules/react-native/Libraries/EventEmitter/NativeEventEmitter.d.ts","./node_modules/react-native/Libraries/Components/Keyboard/Keyboard.d.ts","./node_modules/react-native/types/private/TimerMixin.d.ts","./node_modules/react-native/Libraries/Components/Keyboard/KeyboardAvoidingView.d.ts","./node_modules/react-native/Libraries/Components/Pressable/Pressable.d.ts","./node_modules/react-native/Libraries/Components/ProgressBarAndroid/ProgressBarAndroid.d.ts","./node_modules/react-native/Libraries/Components/SafeAreaView/SafeAreaView.d.ts","./node_modules/react-native/Libraries/Components/StatusBar/StatusBar.d.ts","./node_modules/react-native/Libraries/Components/Switch/Switch.d.ts","./node_modules/react-native/Libraries/Components/TextInput/InputAccessoryView.d.ts","./node_modules/react-native/Libraries/Components/TextInput/TextInput.d.ts","./node_modules/react-native/Libraries/Components/ToastAndroid/ToastAndroid.d.ts","./node_modules/react-native/Libraries/Components/Touchable/TouchableWithoutFeedback.d.ts","./node_modules/react-native/Libraries/Components/Touchable/TouchableHighlight.d.ts","./node_modules/react-native/Libraries/Components/Touchable/TouchableOpacity.d.ts","./node_modules/react-native/Libraries/Components/Touchable/TouchableNativeFeedback.d.ts","./node_modules/react-native/Libraries/Components/Button.d.ts","./node_modules/react-native/Libraries/Core/registerCallableModule.d.ts","./node_modules/react-native/Libraries/DevToolsSettings/DevToolsSettingsManager.d.ts","./node_modules/react-native/Libraries/Interaction/InteractionManager.d.ts","./node_modules/react-native/Libraries/Interaction/PanResponder.d.ts","./node_modules/react-native/Libraries/LayoutAnimation/LayoutAnimation.d.ts","./node_modules/react-native/Libraries/Linking/Linking.d.ts","./node_modules/react-native/Libraries/LogBox/LogBox.d.ts","./node_modules/react-native/Libraries/Modal/Modal.d.ts","./node_modules/react-native/Libraries/Performance/Systrace.d.ts","./node_modules/react-native/Libraries/PermissionsAndroid/PermissionsAndroid.d.ts","./node_modules/react-native/Libraries/PushNotificationIOS/PushNotificationIOS.d.ts","./node_modules/react-native/Libraries/Utilities/IPerformanceLogger.d.ts","./node_modules/react-native/Libraries/ReactNative/AppRegistry.d.ts","./node_modules/react-native/Libraries/ReactNative/I18nManager.d.ts","./node_modules/react-native/Libraries/ReactNative/RootTag.d.ts","./node_modules/react-native/Libraries/ReactNative/UIManager.d.ts","./node_modules/react-native/Libraries/ReactNative/requireNativeComponent.d.ts","./node_modules/react-native/Libraries/Settings/Settings.d.ts","./node_modules/react-native/Libraries/Share/Share.d.ts","./node_modules/react-native/Libraries/StyleSheet/PlatformColorValueTypesIOS.d.ts","./node_modules/react-native/Libraries/StyleSheet/PlatformColorValueTypes.d.ts","./node_modules/react-native/Libraries/TurboModule/RCTExport.d.ts","./node_modules/react-native/Libraries/TurboModule/TurboModuleRegistry.d.ts","./node_modules/react-native/Libraries/Utilities/Appearance.d.ts","./node_modules/react-native/Libraries/Utilities/BackHandler.d.ts","./node_modules/react-native/Libraries/Utilities/DevSettings.d.ts","./node_modules/react-native/Libraries/Utilities/Dimensions.d.ts","./node_modules/react-native/Libraries/Utilities/PixelRatio.d.ts","./node_modules/react-native/Libraries/Utilities/Platform.d.ts","./node_modules/react-native/Libraries/Vibration/Vibration.d.ts","./node_modules/react-native/Libraries/YellowBox/YellowBoxDeprecated.d.ts","./node_modules/react-native/Libraries/vendor/core/ErrorUtils.d.ts","./node_modules/react-native/types/public/DeprecatedPropertiesAlias.d.ts","./node_modules/react-native/types/index.d.ts","./src/lib/util/getUniqueID.ts","./node_modules/css-to-react-native/index.d.ts","./src/lib/util/convertAdditionalStyles.ts","./src/lib/data/textStyleProps.ts","./src/lib/types.ts","./src/lib/util/hasParents.ts","./src/lib/util/openUrl.ts","./src/lib/renderRules.tsx","./src/lib/AstRenderer.ts","./src/lib/util/Token.ts","./src/lib/util/getTokenTypeByToken.ts","./src/lib/util/tokensToAST.ts","./src/lib/util/stringToTokens.ts","./src/lib/util/flattenInlineTokens.ts","./src/lib/util/renderInlineAsText.ts","./src/lib/util/cleanupTokens.ts","./src/lib/util/groupTextTokens.ts","./src/lib/util/omitListItemParagraph.ts","./src/lib/parser.ts","./src/lib/styles.ts","./src/lib/util/removeTextStyleProps.ts","./src/index.tsx"],"fileIdsList":[[57,150],[77],[51,52],[54,55,56],[85,86],[57,66,72,73,76,79,81,82,85],[83],[93],[57,65,91],[57,63,65,66,70,84,85],[57,85,114,115],[57,63,65,66,70,85],[91,100],[57,63,70,84,85,102],[57,64,66,69,70,73,84,85],[57,63,65,70,85],[57,63,65,70],[57,63,64,66,68,70,71,84,85],[57,85],[57,84,85],[57,63,65,66,69,70,84,85,91,102],[57,64,66],[57,73,84,85,112],[57,63,68,85,112,114],[57,73,112],[57,63,64,66,68,69,84,85,102],[66],[57,64,66,67,68,69,84,85],[91],[92],[57,63,64,65,66,69,74,75,84,85],[66,67],[57,72,73,78,84,85],[57,72,78,80,84,85],[57,66,70],[57,84,128],[57],[57,65],[65],[85],[84],[74,83,85],[57,63,65,66,69,84,85],[138],[100],[58,59,60,61,62,64,65,66,67,68,69,70,71,72,73,74,75,76,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149],[150],[60],[53,57,150,151,154,155,156,157,158,159,162,163,169,170,171],[57,150,151,153,154,155,158],[53,57,155,160,162,163,166,167,168],[57,150,154,155,156,157],[158],[53],[53,160,161,164,165],[152],[53,160],[53,158,160],[155],[150,154],[53,151,155,160,161]],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"45d8ccb3dfd57355eb29749919142d4321a0aa4df6acdfc54e30433d7176600a","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1a94697425a99354df73d9c8291e2ecd4dddd370aed4023c2d6dee6cccb32666","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3f9fc0ec0b96a9e642f11eda09c0be83a61c7b336977f8b9fdb1e9788e925fe","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3d7b04b45033f57351c8434f60b6be1ea71a2dfec2d0a0c3c83badbb0e3e693","affectsGlobalScope":true,"impliedFormat":1},{"version":"956d27abdea9652e8368ce029bb1e0b9174e9678a273529f426df4b3d90abd60","affectsGlobalScope":true,"impliedFormat":1},{"version":"e6633e05da3ff36e6da2ec170d0d03ccf33de50ca4dc6f5aeecb572cedd162fb","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"742f21debb3937c3839a63245648238555bdab1ea095d43fd10c88a64029bf76","impliedFormat":1},{"version":"0944f27ebff4b20646b71e7e3faaaae50a6debd40bc63e225de1320dd15c5795","impliedFormat":1},{"version":"8a7219b41d3c1c93f3f3b779146f313efade2404eeece88dcd366df7e2364977","impliedFormat":1},{"version":"36a2e4c9a67439aca5f91bb304611d5ae6e20d420503e96c230cf8fcdc948d94","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"ed6b820c54de95b2510bb673490d61c7f2187f532a339d8d04981645a918961f","impliedFormat":1},{"version":"aa17748c522bd586f8712b1a308ea23af59c309b2fd278f6d4f406647c72e659","affectsGlobalScope":true,"impliedFormat":1},{"version":"3a909e8789a4f8b5377ef3fb8dc10d0c0a090c03f2e40aab599534727457475a","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b47c8df863142d9383f948c987e1ebd25ade3867aeb4ae60e9d6009035dfe46","impliedFormat":1},{"version":"b8dd45aa6e099a5f564edcabfe8114096b096eb1ffaa343dd6f3fe73f1a6e85e","impliedFormat":1},{"version":"38e8ac2d182bd3f85d28de9bdf1386c19a319f9c0280aa43960204c353b07878","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc4db28f3510994e45bbabba1ee33e9a0d27dab33d4c8a5844cee8c85438a058","impliedFormat":1},{"version":"232f660363b3b189f7be7822ed71e907195d1a85bc8d55d2b7ce3f09b2136938","impliedFormat":1},{"version":"e745388cfad9efb4e5a9a15a2c6b66d54094dd82f8d0c2551064e216f7b51526","impliedFormat":1},{"version":"53390c21d095fb54e6c0b8351cbf7f4008f096ade9717bc5ee75e340bc3dfa30","impliedFormat":1},{"version":"71493b2c538dffa1e3e968b55b70984b542cc6e488012850865f72768ff32630","impliedFormat":1},{"version":"8ebf448e9837fda1a368acbb575b0e28843d5b2a3fda04bce76248b64326ea49","impliedFormat":1},{"version":"91b9f6241fca7843985aa31157cfa08cc724c77d91145a4d834d27cdde099c05","impliedFormat":1},{"version":"8b94ac8c460c9a2578ca3308fecfcf034e21af89e9c287c97710e9717ffae133","impliedFormat":1},{"version":"a7266bcc42f8ec0f31f319c2dd8100411b4d7b8a534235cb00a719f1c8a2a42e","impliedFormat":1},{"version":"3dfa3a6f2a62259b56fa7bcebfbacf886848dfa037298be5bed07c7a0381ee4f","impliedFormat":1},{"version":"a1e3cda52746919d2a95784ce0b1b9ffa22052209aab5f54e079e7b920f5339e","impliedFormat":1},{"version":"1882680f8c88c5648d603408dd1943857ca831a815e33d3126be8368f7a69252","impliedFormat":1},{"version":"f387a979388291b2688ba0f604e3ae78874f5f777616b448d34109762a4f05a9","impliedFormat":1},{"version":"cae0fb826d8a88749189b8a924dfcb5d3ad629e3bc5ec934195fbd83fa48b068","impliedFormat":1},{"version":"376b8482d1224aa83f4521590672304e30ba847d0b87b9e1a62b2e60a5c788f2","impliedFormat":1},{"version":"488242948cc48ee6413a159c60bcaf70de15db01364741737a962662f1a127a5","impliedFormat":1},{"version":"42bacb33cddecbcfe3e043ee1117ba848801749e44f947626765b3e0aec74b1c","impliedFormat":1},{"version":"b326790c20287ad266b5fcd0c388e2a83320a24747856727dcb70c7bbd489dfc","impliedFormat":1},{"version":"cd2156bc8e4d54d52a2817d1b6f4629a5dd3173b1d8bb0fc893ee678d6a78ecd","impliedFormat":1},{"version":"60526d9010e8ccb2a76a59821061463464c3acd5bc7a50320df6d2e4e0d6e4f7","impliedFormat":1},{"version":"562cce1c8e14e8d5a55d1931cb1848b1df49cc7b1024356d56f3550ed57ad67f","impliedFormat":1},{"version":"623fa4efc706bb9956d0ae94b13321c6617655bf8ebdb270c9792bb398f82e44","impliedFormat":1},{"version":"f20c96192f5841cbf982d2c1989c1e9fdef41c4a9db7543edff131007bf1dbfb","impliedFormat":1},{"version":"79d6871ce0da76f4c865a58daa509d5c8a10545d510b804501daa5d0626e7028","impliedFormat":1},{"version":"9054417b5760061bc5fe31f9eee5dc9bf018339b0617d3c65dd1673c8e3c0f25","impliedFormat":1},{"version":"442856ad0787bc213f659e134c204ad0d502179aa216bf700faefb5572208358","impliedFormat":1},{"version":"443702ca8101ef0adc827c2cc530ca93cf98d41e36ce4399efb9bc833ad9cb62","impliedFormat":1},{"version":"c94f70562ae60797cce564c3bebbaaf1752c327d5063d6ac152aa5ca1616c267","impliedFormat":1},{"version":"2aeb5fcdfc884b16015617d263fd8d1a8513f7efe23880be4e5f0bdb3794b37c","impliedFormat":1},{"version":"fd412dd6372493eb8e3e95cae8687d35e4d34dde905a33e0ee47b74224cdd6ab","impliedFormat":1},{"version":"b561170fbe8d4292425e1dfa52406c8d97575681f7a5e420d11d9f72f7c29e38","impliedFormat":1},{"version":"5fe94f3f6411a0f6293f16fdc8e02ee61138941847ce91d6f6800c97fac22fcd","impliedFormat":1},{"version":"7f7c0ecc3eeeef905a3678e540947f4fbbc1a9c76075419dcc5fbfc3df59cb0b","impliedFormat":1},{"version":"df3303018d45c92be73fb4a282d5a242579f96235f5e0f8981983102caf5feca","impliedFormat":1},{"version":"35db266b474b3b9dfd0bc7d25dff3926cc227de45394262f3783b8b174182a16","impliedFormat":1},{"version":"8205e62a7310ac0513747f6d84175400680cff372559bc5fbe2df707194a295d","impliedFormat":1},{"version":"084d0df6805570b6dc6c8b49c3a71d5bdfe59606901e0026c63945b68d4b080a","impliedFormat":1},{"version":"8387fa3287992c71702756fe6ecea68e2f8f2c5aa434493e3afe4817dd4a4787","impliedFormat":1},{"version":"0f066f9654e700a9cf79c75553c934eb14296aa80583bd2b5d07e2d582a3f4ee","impliedFormat":1},{"version":"269c5d54104033b70331343bd931c9933852a882391ed6bd98c3d8b7d6465d22","impliedFormat":1},{"version":"a56b8577aaf471d9e60582065a8193269310e8cae48c1ce4111ed03216f5f715","impliedFormat":1},{"version":"486ae83cd51b813095f6716f06cc9b2cf480ad1d6c7f8ec59674d6c858cd2407","impliedFormat":1},{"version":"fff527e2567a24dd634a30268f1aa8a220315fed9c513d70ee872e54f67f27f3","impliedFormat":1},{"version":"5dd0ff735b3f2e642c3f16bcfb3dc4ecebb679a70e43cfb19ab5fd84d8faaeed","impliedFormat":1},{"version":"d1d78d1ef0f21ac77cdc436d2a4d56592453a8a2e51af2040ec9a69a5d35e4de","impliedFormat":1},{"version":"bc55b91274e43f88030c9cfe2c4217fae57894c3c302173ab6e9743c29484e3d","impliedFormat":1},{"version":"8bb22f70bfd7bf186631fa565c9202ee6a1009ffb961197b7d092b5a1e1d56b1","impliedFormat":1},{"version":"77282216c61bcef9a700db98e142301d5a7d988d3076286029da63e415e98a42","impliedFormat":1},{"version":"6c28f4f95aaa6c3c8b1a0681c29f446b0bf0ed1aa5aa11e8b2ca6fc9e066e9f2","impliedFormat":1},{"version":"64ce8e260a1362d4cadd6c753581a912a9869d4a53ec6e733dc61018f9250f5d","impliedFormat":1},{"version":"85a915dbb768b89cb92f5e6c165d776bfebd065883c34fee4e0219c3ed321b47","impliedFormat":1},{"version":"83df2f39cb14971adea51d1c84e7d146a34e9b7f84ad118450a51bdc3138412c","impliedFormat":1},{"version":"b96364fcb0c9d521e7618346b00acf3fe16ccf9368404ceac1658edee7b6332c","impliedFormat":1},{"version":"bdb2b70c74908c92ec41d8dd8375a195cb3bb07523e4de642b2b2dfbde249ca6","impliedFormat":1},{"version":"7b329f4137a552073f504022acbf8cd90d49cc5e5529791bef508f76ff774854","impliedFormat":1},{"version":"f63bbbffcfc897d22f34cf19ae13405cd267b1783cd21ec47d8a2d02947c98c1","impliedFormat":1},{"version":"7889f4932dfa7b1126cdc17914d85d80b5860cc3d62ba329494007e8aab45430","impliedFormat":1},{"version":"d9725ef7f60a791668f7fb808eb90b1789feaaef989a686fefc0f7546a51dcdc","impliedFormat":1},{"version":"df55b9be6ba19a6f77487e09dc7a94d7c9bf66094d35ea168dbd4bac42c46b8f","impliedFormat":1},{"version":"595125f3e088b883d104622ef10e6b7d5875ff6976bbe4d7dca090a3e2dca513","impliedFormat":1},{"version":"8ebb6f0603bf481e893311c49e4d2e2061413c51b9ba5898cd9b0a01f5ef19c8","impliedFormat":1},{"version":"e0d7eed4ba363df3faadb8e617f95f9fc8adfbb00b87db7ade4a1098d6cf1e90","impliedFormat":1},{"version":"38faab59a79924ce5eb4f2f3e7e7db91e74d425b4183f908cc014be213f0d971","impliedFormat":1},{"version":"de115595321ce012c456f512a799679bfc874f0ac0a4928a8429557bb25086aa","impliedFormat":1},{"version":"cdca67bd898deff48e3acb05fb44500b5ebce16c26a8ec99dee1522cf9879795","impliedFormat":1},{"version":"0524cab11ba9048d151d93cc666d3908fda329eec6b1642e9a936093e6d79f28","impliedFormat":1},{"version":"869073d7523e75f45bd65b2072865c60002d5e0cbd3d17831e999cf011312778","impliedFormat":1},{"version":"bc7b5906a6ce6c5744a640c314e020856be6c50a693e77dc12aff2d77b12ca76","impliedFormat":1},{"version":"56503e377bc1344f155e4e3115a772cb4e59350c0b8131e3e1fb2750ac491608","impliedFormat":1},{"version":"6b579287217ee1320ee1c6cfec5f6730f3a1f91daab000f7131558ee531b2bf8","impliedFormat":1},{"version":"e2ddb2877f5a841866f4fc772a601b58e90ac8399b35f9a06535be81b8e08b47","impliedFormat":1},{"version":"a793636667598e739a52684033037a67dc2d9db37fab727623626ef19aa5abb9","impliedFormat":1},{"version":"b15d6238a86bc0fc2368da429249b96c260debc0cec3eb7b5f838ad32587c129","impliedFormat":1},{"version":"9a9fba3a20769b0a74923e7032997451b61c1bd371c519429b29019399040d74","impliedFormat":1},{"version":"4b10e2fe52cb61035e58df3f1fdd926dd0fe9cf1a2302f92916da324332fb4e0","impliedFormat":1},{"version":"d1092ae8d6017f359f4758115f588e089848cc8fb359f7ba045b1a1cf3668a49","impliedFormat":1},{"version":"ddae9195b0da7b25a585ef43365f4dc5204a746b155fbee71e6ee1a9193fb69f","impliedFormat":1},{"version":"32dbced998ce74c5e76ce87044d0b4071857576dde36b0c6ed1d5957ce9cf5b5","impliedFormat":1},{"version":"5bc29a9918feba88816b71e32960cf11243b77b76630e9e87cad961e5e1d31d0","impliedFormat":1},{"version":"341ffa358628577f490f128f3880c01d50ef31412d1be012bb1cd959b0a383ea","impliedFormat":1},{"version":"ecc1b8878c8033bde0204b85e26fe1af6847805427759e5723882c848a11e134","impliedFormat":1},{"version":"cfc9c32553ad3b5be38342bc8731397438a93531118e1a226a8c79ad255b4f0c","impliedFormat":1},{"version":"16e5b5b023c2a1119c1878a51714861c56255778de0a7fe378391876a15f7433","impliedFormat":1},{"version":"52e8612d284467b4417143ca8fe54d30145fdfc3815f5b5ea9b14b677f422be5","impliedFormat":1},{"version":"a090a8a3b0ef2cceeb089acf4df95df72e7d934215896afe264ff6f734d66d15","impliedFormat":1},{"version":"a0259c6054e3ed2c5fb705b6638e384446cbcdf7fd2072c659b43bd56e214b9a","impliedFormat":1},{"version":"005319c82222e57934c7b211013eb6931829e46b2a61c5d9a1c3c25f8dc3ea90","impliedFormat":1},{"version":"151f422f08c8ca67b77c5c39d49278b4df452ef409237c8219be109ae3cdae9d","impliedFormat":1},{"version":"6466cbb0aa561e1c1a87850a1f066692f1692a0a9513c508a3886cd66a62dae8","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb5cfe79e5f80bd06b0cb8d75274f7710ccb0ba269d35ab06c45dad7bf50a450","signature":"9f2c77b3670856f0be5fd1a504cbc163606ceed481860513eca72634b32d3c7d","impliedFormat":1},{"version":"6d1d31f1786b80ab882f0844f2c99767f6f0c6538e94a4292775e8e741c6a802","impliedFormat":1},{"version":"57271ace81d2865cc16c47eb125f0f34d38ce536989895e8d6c9236f5fca4e1d","signature":"2a9464ab1154680f9a45713ad52ee914229ef5a0100cd8a7dc41e9c8dc8563c3","impliedFormat":1},{"version":"3a72663f675bb47f1c4a42ddf03d0b94442f767d270231af2c3e65a81a195d94","signature":"66b9118e963c55e4311125a3312c9d946106d43d9def22ed3f41bd52462a4c80","impliedFormat":1},{"version":"2c81020b79f5e9f087e7f5b3665533450999dfba029db049020a02581649422a","signature":"43b56e7f904cbc5ea05d44daa7a46044ffa69e065868df65b003157dbd5956fe","impliedFormat":1},{"version":"83c3cf713a4561204ae2316b33266be18e8dd858823f14f8ba02a47ba359d92f","signature":"d728c1eb02f8384410cf59b5698c2d9f52c7ad655e839d6dbb1f1ad64877cadf","impliedFormat":1},{"version":"6bf6420b513f4b548ba2da6baf7fd9ef8c13f7125ddfbdbfb8e04a206131c040","signature":"8158a29454ce0c7ddb8bd1e17062ce64f9c6d2fa4d8c844ade50a4189da2b05d","impliedFormat":1},{"version":"22110b658bd84f2cc193bf941e2313dc799f592424b5376fffd5fe21e1b15f87","signature":"79119a0b05f41118afb2d66ae50d7a36a4df53e9ea25d545ad008513afe7e510","impliedFormat":1},{"version":"eb7fd9013b9782bf257fc968373728f46ee6ed18e0b4530350e143656833ebd6","signature":"8c0faac21b200b337ed21f09ffedab948ed83200b1b41e4b2e5e1c751bd11c3b","impliedFormat":1},{"version":"5d810ff49a73754dbecd14c8936c32d1e1c42af8c3635ec72380d4f1b2009670","signature":"ea588380242774f14bbbbdce180cb43218d5cf788f864d311015910a428a7ec5","impliedFormat":1},{"version":"25057b50fcc66651f1acb841a0f872d844151a32eb9332b49f2b9723ccac711d","signature":"2b3d74e32bb0bd3cd9965f28ba76e5b6587232bf5dbe440f0363231849e42a93","impliedFormat":1},{"version":"b2e3018573b49a4f2a8c6b2b7472fb6c665de88b833a47169c4a565d1518a4af","signature":"b6c08b3fdc441e99db8d4c55838f76fa2024855eb6c64dd86bb77d831b29a449","impliedFormat":1},{"version":"b58f80095cd5db44743fa90aa4c24f70c1e820445f2f42d7cbe5f82450e111ce","signature":"b064caa285e15d91ac315e46f7a970940452b4a8f1c071736ca18a48faa98348","impliedFormat":1},{"version":"5c70463772e79053d76ed4ca991e48a369c8c1a0a55f1b7bdb98964b93c97064","signature":"7214a8af60b4039a192bf3460cf48b16c27272aed494e16c8fb375cbcab8a669","impliedFormat":1},{"version":"ee072494ac2f54647366f670806e13c59d6ac15b95b118c7d489c40d9c1c718f","signature":"d45382d88b9f313315c4693a3aceb2d137db236ed435726ccc3cb5f4f95fb696","impliedFormat":1},{"version":"bffccb7cd6245db255a421592298c1b84e141cf6a1c45c523d54bbf21607b4b3","signature":"ef963a484a85f604c7e9a105f7e53e6176e1d5cdb5d50c69b15188fa94b7ac07","impliedFormat":1},{"version":"4b7a89c94d301e1322e826c3ec402886e290cef23b5cd772e4ed1fceb0820181","signature":"f5d48ed660a093a592fb4d6711e62cacc74112af8ef529921da1d69850cb7246","impliedFormat":1},{"version":"b76ab52fed35ea1483b53a1a5b8065fa196291b29d38516f4310cca617b836a8","signature":"ed66b549cf33c8068d2d68f0e3cb42eb5476e55fcc730fb0d4853e22df31355b","impliedFormat":1},{"version":"ff2bcfc8ea435e32cf3e46979a50badc7cd0ff3adc3a827a6acc264b3c2b04d4","signature":"6d19e497dbbd0db80757a13d2ed759939d8f651a1d063570bc21359319f375b1","impliedFormat":1},{"version":"fabeb2404bc5ee310dd52d7ed4322914f57e1a7e3ec6fc59da04728b80d4f07e","signature":"8660e950fd61b3f60ae718284fef7d215011ed9d19ddf110ab688b9a69fc5e64","impliedFormat":1},{"version":"411aac6f5713c193891ac8c9bcc0db7a37159da7f91e412dd86e827ecc8c61f0","signature":"5ade073342145585fc0e64759dfcec8d0289e94abc75d2fb333522956c4f5a4b","impliedFormat":1},{"version":"d91770e85017b2623e7bc749dcc2357256cdc10bc041ff80eec21b6028158a05","signature":"68e069b7ef4d7fad012b2aab487ccd1ab728fadc06240683ce520642a7961451","impliedFormat":1}],"root":[151,[153,172]],"options":{"allowSyntheticDefaultImports":true,"declaration":true,"declarationMap":true,"emitDecoratorMetadata":true,"esModuleInterop":true,"experimentalDecorators":true,"jsx":1,"module":199,"noImplicitAny":true,"noImplicitThis":true,"noUncheckedIndexedAccess":false,"outDir":"./dist","rootDir":"./src","skipDefaultLibCheck":false,"sourceMap":true,"strict":true,"strictNullChecks":true,"strictPropertyInitialization":true,"target":8,"useUnknownInCatchVariables":true},"referencedMap":[[77,1],[78,2],[53,3],[57,4],[87,5],[83,6],[90,7],[94,8],[96,9],[97,10],[116,11],[99,12],[101,13],[103,14],[104,15],[105,16],[71,16],[106,17],[72,18],[107,19],[108,10],[109,20],[110,21],[68,22],[113,23],[115,24],[114,25],[112,26],[73,17],[69,27],[70,28],[100,29],[92,29],[93,30],[76,31],[119,29],[120,32],[122,13],[79,33],[81,34],[124,35],[129,36],[80,37],[131,37],[132,38],[133,39],[135,40],[137,40],[136,40],[85,41],[84,42],[86,40],[82,43],[139,44],[66,38],[140,8],[141,8],[142,45],[143,29],[147,37],[150,46],[59,47],[60,48],[149,47],[67,27],[65,37],[172,49],[159,50],[169,51],[158,52],[170,47],[155,53],[160,54],[166,55],[153,56],[164,57],[161,58],[167,57],[156,59],[168,57],[157,47],[171,60],[165,54],[163,54],[162,61]],"version":"5.6.3"} \ No newline at end of file +{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/@types/linkify-it/build/index.cjs.d.ts","./node_modules/@types/mdurl/build/index.cjs.d.ts","./node_modules/@types/markdown-it/dist/index.cjs.d.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/prop-types/index.d.ts","./node_modules/@types/react/index.d.ts","./node_modules/react-native/types/modules/BatchedBridge.d.ts","./node_modules/react-native/types/modules/Codegen.d.ts","./node_modules/react-native/types/modules/Devtools.d.ts","./node_modules/react-native/types/modules/globals.d.ts","./node_modules/react-native/types/modules/LaunchScreen.d.ts","./node_modules/react-native/types/private/Utilities.d.ts","./node_modules/react-native/types/public/Insets.d.ts","./node_modules/react-native/types/public/ReactNativeTypes.d.ts","./node_modules/react-native/Libraries/Types/CoreEventTypes.d.ts","./node_modules/react-native/types/public/ReactNativeRenderer.d.ts","./node_modules/react-native/Libraries/Components/Touchable/Touchable.d.ts","./node_modules/react-native/Libraries/Components/View/ViewAccessibility.d.ts","./node_modules/react-native/Libraries/Components/View/ViewPropTypes.d.ts","./node_modules/react-native/Libraries/Components/RefreshControl/RefreshControl.d.ts","./node_modules/react-native/Libraries/Components/ScrollView/ScrollView.d.ts","./node_modules/react-native/Libraries/Components/View/View.d.ts","./node_modules/react-native/Libraries/Image/ImageResizeMode.d.ts","./node_modules/react-native/Libraries/Image/ImageSource.d.ts","./node_modules/react-native/Libraries/Image/Image.d.ts","./node_modules/@react-native/virtualized-lists/Lists/VirtualizedList.d.ts","./node_modules/@react-native/virtualized-lists/index.d.ts","./node_modules/react-native/Libraries/Lists/FlatList.d.ts","./node_modules/react-native/Libraries/ReactNative/RendererProxy.d.ts","./node_modules/react-native/Libraries/Lists/SectionList.d.ts","./node_modules/react-native/Libraries/Text/Text.d.ts","./node_modules/react-native/Libraries/Animated/Animated.d.ts","./node_modules/react-native/Libraries/StyleSheet/StyleSheetTypes.d.ts","./node_modules/react-native/Libraries/StyleSheet/StyleSheet.d.ts","./node_modules/react-native/Libraries/StyleSheet/processColor.d.ts","./node_modules/react-native/Libraries/ActionSheetIOS/ActionSheetIOS.d.ts","./node_modules/react-native/Libraries/Alert/Alert.d.ts","./node_modules/react-native/Libraries/Animated/Easing.d.ts","./node_modules/react-native/Libraries/Animated/useAnimatedValue.d.ts","./node_modules/react-native/Libraries/vendor/emitter/EventEmitter.d.ts","./node_modules/react-native/Libraries/EventEmitter/RCTDeviceEventEmitter.d.ts","./node_modules/react-native/Libraries/EventEmitter/RCTNativeAppEventEmitter.d.ts","./node_modules/react-native/Libraries/AppState/AppState.d.ts","./node_modules/react-native/Libraries/BatchedBridge/NativeModules.d.ts","./node_modules/react-native/Libraries/Components/AccessibilityInfo/AccessibilityInfo.d.ts","./node_modules/react-native/Libraries/Components/ActivityIndicator/ActivityIndicator.d.ts","./node_modules/react-native/Libraries/Components/Clipboard/Clipboard.d.ts","./node_modules/react-native/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.d.ts","./node_modules/react-native/Libraries/EventEmitter/NativeEventEmitter.d.ts","./node_modules/react-native/Libraries/Components/Keyboard/Keyboard.d.ts","./node_modules/react-native/types/private/TimerMixin.d.ts","./node_modules/react-native/Libraries/Components/Keyboard/KeyboardAvoidingView.d.ts","./node_modules/react-native/Libraries/Components/Pressable/Pressable.d.ts","./node_modules/react-native/Libraries/Components/ProgressBarAndroid/ProgressBarAndroid.d.ts","./node_modules/react-native/Libraries/Components/SafeAreaView/SafeAreaView.d.ts","./node_modules/react-native/Libraries/Components/StatusBar/StatusBar.d.ts","./node_modules/react-native/Libraries/Components/Switch/Switch.d.ts","./node_modules/react-native/Libraries/Components/TextInput/InputAccessoryView.d.ts","./node_modules/react-native/Libraries/Components/TextInput/TextInput.d.ts","./node_modules/react-native/Libraries/Components/ToastAndroid/ToastAndroid.d.ts","./node_modules/react-native/Libraries/Components/Touchable/TouchableWithoutFeedback.d.ts","./node_modules/react-native/Libraries/Components/Touchable/TouchableHighlight.d.ts","./node_modules/react-native/Libraries/Components/Touchable/TouchableOpacity.d.ts","./node_modules/react-native/Libraries/Components/Touchable/TouchableNativeFeedback.d.ts","./node_modules/react-native/Libraries/Components/Button.d.ts","./node_modules/react-native/Libraries/Core/registerCallableModule.d.ts","./node_modules/react-native/Libraries/DevToolsSettings/DevToolsSettingsManager.d.ts","./node_modules/react-native/Libraries/Interaction/InteractionManager.d.ts","./node_modules/react-native/Libraries/Interaction/PanResponder.d.ts","./node_modules/react-native/Libraries/LayoutAnimation/LayoutAnimation.d.ts","./node_modules/react-native/Libraries/Linking/Linking.d.ts","./node_modules/react-native/Libraries/LogBox/LogBox.d.ts","./node_modules/react-native/Libraries/Modal/Modal.d.ts","./node_modules/react-native/Libraries/Performance/Systrace.d.ts","./node_modules/react-native/Libraries/PermissionsAndroid/PermissionsAndroid.d.ts","./node_modules/react-native/Libraries/PushNotificationIOS/PushNotificationIOS.d.ts","./node_modules/react-native/Libraries/Utilities/IPerformanceLogger.d.ts","./node_modules/react-native/Libraries/ReactNative/AppRegistry.d.ts","./node_modules/react-native/Libraries/ReactNative/I18nManager.d.ts","./node_modules/react-native/Libraries/ReactNative/RootTag.d.ts","./node_modules/react-native/Libraries/ReactNative/UIManager.d.ts","./node_modules/react-native/Libraries/ReactNative/requireNativeComponent.d.ts","./node_modules/react-native/Libraries/Settings/Settings.d.ts","./node_modules/react-native/Libraries/Share/Share.d.ts","./node_modules/react-native/Libraries/StyleSheet/PlatformColorValueTypesIOS.d.ts","./node_modules/react-native/Libraries/StyleSheet/PlatformColorValueTypes.d.ts","./node_modules/react-native/Libraries/TurboModule/RCTExport.d.ts","./node_modules/react-native/Libraries/TurboModule/TurboModuleRegistry.d.ts","./node_modules/react-native/Libraries/Utilities/Appearance.d.ts","./node_modules/react-native/Libraries/Utilities/BackHandler.d.ts","./node_modules/react-native/Libraries/Utilities/DevSettings.d.ts","./node_modules/react-native/Libraries/Utilities/Dimensions.d.ts","./node_modules/react-native/Libraries/Utilities/PixelRatio.d.ts","./node_modules/react-native/Libraries/Utilities/Platform.d.ts","./node_modules/react-native/Libraries/Vibration/Vibration.d.ts","./node_modules/react-native/Libraries/YellowBox/YellowBoxDeprecated.d.ts","./node_modules/react-native/Libraries/vendor/core/ErrorUtils.d.ts","./node_modules/react-native/types/public/DeprecatedPropertiesAlias.d.ts","./node_modules/react-native/types/index.d.ts","./node_modules/css-to-react-native/index.d.ts","./src/lib/util/convertAdditionalStyles.ts","./src/lib/util/getUniqueID.ts","./src/lib/data/textStyleProps.ts","./src/lib/types.ts","./src/lib/util/hasParents.ts","./src/lib/util/openUrl.ts","./src/lib/renderRules.tsx","./src/lib/AstRenderer.ts","./src/lib/util/Token.ts","./src/lib/util/getTokenTypeByToken.ts","./src/lib/util/tokensToAST.ts","./src/lib/util/stringToTokens.ts","./src/lib/util/flattenInlineTokens.ts","./src/lib/util/renderInlineAsText.ts","./src/lib/util/cleanupTokens.ts","./src/lib/util/groupTextTokens.ts","./src/lib/util/omitListItemParagraph.ts","./src/lib/parser.ts","./src/lib/styles.ts","./src/lib/util/removeTextStyleProps.ts","./src/index.tsx"],"fileIdsList":[[57,150],[77],[51,52],[54,55,56],[85,86],[57,66,72,73,76,79,81,82,85],[83],[93],[57,65,91],[57,63,65,66,70,84,85],[57,85,114,115],[57,63,65,66,70,85],[91,100],[57,63,70,84,85,102],[57,64,66,69,70,73,84,85],[57,63,65,70,85],[57,63,65,70],[57,63,64,66,68,70,71,84,85],[57,85],[57,84,85],[57,63,65,66,69,70,84,85,91,102],[57,64,66],[57,73,84,85,112],[57,63,68,85,112,114],[57,73,112],[57,63,64,66,68,69,84,85,102],[66],[57,64,66,67,68,69,84,85],[91],[92],[57,63,64,65,66,69,74,75,84,85],[66,67],[57,72,73,78,84,85],[57,72,78,80,84,85],[57,66,70],[57,84,128],[57],[57,65],[65],[85],[84],[74,83,85],[57,63,65,66,69,84,85],[138],[100],[58,59,60,61,62,64,65,66,67,68,69,70,71,72,73,74,75,76,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149],[150],[60],[53,57,150,153,154,155,156,157,158,159,162,163,169,170,171],[57,150,152,153,154,155,158],[53,57,155,160,162,163,166,167,168],[57,150,154,155,156,157],[158],[53],[53,160,161,164,165],[151],[53,160],[53,158,160],[155],[150,154],[53,153,155,160,161]],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"45d8ccb3dfd57355eb29749919142d4321a0aa4df6acdfc54e30433d7176600a","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1a94697425a99354df73d9c8291e2ecd4dddd370aed4023c2d6dee6cccb32666","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3f9fc0ec0b96a9e642f11eda09c0be83a61c7b336977f8b9fdb1e9788e925fe","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3d7b04b45033f57351c8434f60b6be1ea71a2dfec2d0a0c3c83badbb0e3e693","affectsGlobalScope":true,"impliedFormat":1},{"version":"956d27abdea9652e8368ce029bb1e0b9174e9678a273529f426df4b3d90abd60","affectsGlobalScope":true,"impliedFormat":1},{"version":"e6633e05da3ff36e6da2ec170d0d03ccf33de50ca4dc6f5aeecb572cedd162fb","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"742f21debb3937c3839a63245648238555bdab1ea095d43fd10c88a64029bf76","impliedFormat":1},{"version":"0944f27ebff4b20646b71e7e3faaaae50a6debd40bc63e225de1320dd15c5795","impliedFormat":1},{"version":"8a7219b41d3c1c93f3f3b779146f313efade2404eeece88dcd366df7e2364977","impliedFormat":1},{"version":"36a2e4c9a67439aca5f91bb304611d5ae6e20d420503e96c230cf8fcdc948d94","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"ed6b820c54de95b2510bb673490d61c7f2187f532a339d8d04981645a918961f","impliedFormat":1},{"version":"aa17748c522bd586f8712b1a308ea23af59c309b2fd278f6d4f406647c72e659","affectsGlobalScope":true,"impliedFormat":1},{"version":"3a909e8789a4f8b5377ef3fb8dc10d0c0a090c03f2e40aab599534727457475a","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b47c8df863142d9383f948c987e1ebd25ade3867aeb4ae60e9d6009035dfe46","impliedFormat":1},{"version":"b8dd45aa6e099a5f564edcabfe8114096b096eb1ffaa343dd6f3fe73f1a6e85e","impliedFormat":1},{"version":"38e8ac2d182bd3f85d28de9bdf1386c19a319f9c0280aa43960204c353b07878","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc4db28f3510994e45bbabba1ee33e9a0d27dab33d4c8a5844cee8c85438a058","impliedFormat":1},{"version":"232f660363b3b189f7be7822ed71e907195d1a85bc8d55d2b7ce3f09b2136938","impliedFormat":1},{"version":"e745388cfad9efb4e5a9a15a2c6b66d54094dd82f8d0c2551064e216f7b51526","impliedFormat":1},{"version":"53390c21d095fb54e6c0b8351cbf7f4008f096ade9717bc5ee75e340bc3dfa30","impliedFormat":1},{"version":"71493b2c538dffa1e3e968b55b70984b542cc6e488012850865f72768ff32630","impliedFormat":1},{"version":"8ebf448e9837fda1a368acbb575b0e28843d5b2a3fda04bce76248b64326ea49","impliedFormat":1},{"version":"91b9f6241fca7843985aa31157cfa08cc724c77d91145a4d834d27cdde099c05","impliedFormat":1},{"version":"8b94ac8c460c9a2578ca3308fecfcf034e21af89e9c287c97710e9717ffae133","impliedFormat":1},{"version":"a7266bcc42f8ec0f31f319c2dd8100411b4d7b8a534235cb00a719f1c8a2a42e","impliedFormat":1},{"version":"3dfa3a6f2a62259b56fa7bcebfbacf886848dfa037298be5bed07c7a0381ee4f","impliedFormat":1},{"version":"a1e3cda52746919d2a95784ce0b1b9ffa22052209aab5f54e079e7b920f5339e","impliedFormat":1},{"version":"1882680f8c88c5648d603408dd1943857ca831a815e33d3126be8368f7a69252","impliedFormat":1},{"version":"f387a979388291b2688ba0f604e3ae78874f5f777616b448d34109762a4f05a9","impliedFormat":1},{"version":"cae0fb826d8a88749189b8a924dfcb5d3ad629e3bc5ec934195fbd83fa48b068","impliedFormat":1},{"version":"376b8482d1224aa83f4521590672304e30ba847d0b87b9e1a62b2e60a5c788f2","impliedFormat":1},{"version":"488242948cc48ee6413a159c60bcaf70de15db01364741737a962662f1a127a5","impliedFormat":1},{"version":"42bacb33cddecbcfe3e043ee1117ba848801749e44f947626765b3e0aec74b1c","impliedFormat":1},{"version":"b326790c20287ad266b5fcd0c388e2a83320a24747856727dcb70c7bbd489dfc","impliedFormat":1},{"version":"cd2156bc8e4d54d52a2817d1b6f4629a5dd3173b1d8bb0fc893ee678d6a78ecd","impliedFormat":1},{"version":"60526d9010e8ccb2a76a59821061463464c3acd5bc7a50320df6d2e4e0d6e4f7","impliedFormat":1},{"version":"562cce1c8e14e8d5a55d1931cb1848b1df49cc7b1024356d56f3550ed57ad67f","impliedFormat":1},{"version":"623fa4efc706bb9956d0ae94b13321c6617655bf8ebdb270c9792bb398f82e44","impliedFormat":1},{"version":"f20c96192f5841cbf982d2c1989c1e9fdef41c4a9db7543edff131007bf1dbfb","impliedFormat":1},{"version":"79d6871ce0da76f4c865a58daa509d5c8a10545d510b804501daa5d0626e7028","impliedFormat":1},{"version":"9054417b5760061bc5fe31f9eee5dc9bf018339b0617d3c65dd1673c8e3c0f25","impliedFormat":1},{"version":"442856ad0787bc213f659e134c204ad0d502179aa216bf700faefb5572208358","impliedFormat":1},{"version":"443702ca8101ef0adc827c2cc530ca93cf98d41e36ce4399efb9bc833ad9cb62","impliedFormat":1},{"version":"c94f70562ae60797cce564c3bebbaaf1752c327d5063d6ac152aa5ca1616c267","impliedFormat":1},{"version":"2aeb5fcdfc884b16015617d263fd8d1a8513f7efe23880be4e5f0bdb3794b37c","impliedFormat":1},{"version":"fd412dd6372493eb8e3e95cae8687d35e4d34dde905a33e0ee47b74224cdd6ab","impliedFormat":1},{"version":"b561170fbe8d4292425e1dfa52406c8d97575681f7a5e420d11d9f72f7c29e38","impliedFormat":1},{"version":"5fe94f3f6411a0f6293f16fdc8e02ee61138941847ce91d6f6800c97fac22fcd","impliedFormat":1},{"version":"7f7c0ecc3eeeef905a3678e540947f4fbbc1a9c76075419dcc5fbfc3df59cb0b","impliedFormat":1},{"version":"df3303018d45c92be73fb4a282d5a242579f96235f5e0f8981983102caf5feca","impliedFormat":1},{"version":"35db266b474b3b9dfd0bc7d25dff3926cc227de45394262f3783b8b174182a16","impliedFormat":1},{"version":"8205e62a7310ac0513747f6d84175400680cff372559bc5fbe2df707194a295d","impliedFormat":1},{"version":"084d0df6805570b6dc6c8b49c3a71d5bdfe59606901e0026c63945b68d4b080a","impliedFormat":1},{"version":"8387fa3287992c71702756fe6ecea68e2f8f2c5aa434493e3afe4817dd4a4787","impliedFormat":1},{"version":"0f066f9654e700a9cf79c75553c934eb14296aa80583bd2b5d07e2d582a3f4ee","impliedFormat":1},{"version":"269c5d54104033b70331343bd931c9933852a882391ed6bd98c3d8b7d6465d22","impliedFormat":1},{"version":"a56b8577aaf471d9e60582065a8193269310e8cae48c1ce4111ed03216f5f715","impliedFormat":1},{"version":"486ae83cd51b813095f6716f06cc9b2cf480ad1d6c7f8ec59674d6c858cd2407","impliedFormat":1},{"version":"fff527e2567a24dd634a30268f1aa8a220315fed9c513d70ee872e54f67f27f3","impliedFormat":1},{"version":"5dd0ff735b3f2e642c3f16bcfb3dc4ecebb679a70e43cfb19ab5fd84d8faaeed","impliedFormat":1},{"version":"d1d78d1ef0f21ac77cdc436d2a4d56592453a8a2e51af2040ec9a69a5d35e4de","impliedFormat":1},{"version":"bc55b91274e43f88030c9cfe2c4217fae57894c3c302173ab6e9743c29484e3d","impliedFormat":1},{"version":"8bb22f70bfd7bf186631fa565c9202ee6a1009ffb961197b7d092b5a1e1d56b1","impliedFormat":1},{"version":"77282216c61bcef9a700db98e142301d5a7d988d3076286029da63e415e98a42","impliedFormat":1},{"version":"6c28f4f95aaa6c3c8b1a0681c29f446b0bf0ed1aa5aa11e8b2ca6fc9e066e9f2","impliedFormat":1},{"version":"64ce8e260a1362d4cadd6c753581a912a9869d4a53ec6e733dc61018f9250f5d","impliedFormat":1},{"version":"85a915dbb768b89cb92f5e6c165d776bfebd065883c34fee4e0219c3ed321b47","impliedFormat":1},{"version":"83df2f39cb14971adea51d1c84e7d146a34e9b7f84ad118450a51bdc3138412c","impliedFormat":1},{"version":"b96364fcb0c9d521e7618346b00acf3fe16ccf9368404ceac1658edee7b6332c","impliedFormat":1},{"version":"bdb2b70c74908c92ec41d8dd8375a195cb3bb07523e4de642b2b2dfbde249ca6","impliedFormat":1},{"version":"7b329f4137a552073f504022acbf8cd90d49cc5e5529791bef508f76ff774854","impliedFormat":1},{"version":"f63bbbffcfc897d22f34cf19ae13405cd267b1783cd21ec47d8a2d02947c98c1","impliedFormat":1},{"version":"7889f4932dfa7b1126cdc17914d85d80b5860cc3d62ba329494007e8aab45430","impliedFormat":1},{"version":"d9725ef7f60a791668f7fb808eb90b1789feaaef989a686fefc0f7546a51dcdc","impliedFormat":1},{"version":"df55b9be6ba19a6f77487e09dc7a94d7c9bf66094d35ea168dbd4bac42c46b8f","impliedFormat":1},{"version":"595125f3e088b883d104622ef10e6b7d5875ff6976bbe4d7dca090a3e2dca513","impliedFormat":1},{"version":"8ebb6f0603bf481e893311c49e4d2e2061413c51b9ba5898cd9b0a01f5ef19c8","impliedFormat":1},{"version":"e0d7eed4ba363df3faadb8e617f95f9fc8adfbb00b87db7ade4a1098d6cf1e90","impliedFormat":1},{"version":"38faab59a79924ce5eb4f2f3e7e7db91e74d425b4183f908cc014be213f0d971","impliedFormat":1},{"version":"de115595321ce012c456f512a799679bfc874f0ac0a4928a8429557bb25086aa","impliedFormat":1},{"version":"cdca67bd898deff48e3acb05fb44500b5ebce16c26a8ec99dee1522cf9879795","impliedFormat":1},{"version":"0524cab11ba9048d151d93cc666d3908fda329eec6b1642e9a936093e6d79f28","impliedFormat":1},{"version":"869073d7523e75f45bd65b2072865c60002d5e0cbd3d17831e999cf011312778","impliedFormat":1},{"version":"bc7b5906a6ce6c5744a640c314e020856be6c50a693e77dc12aff2d77b12ca76","impliedFormat":1},{"version":"56503e377bc1344f155e4e3115a772cb4e59350c0b8131e3e1fb2750ac491608","impliedFormat":1},{"version":"6b579287217ee1320ee1c6cfec5f6730f3a1f91daab000f7131558ee531b2bf8","impliedFormat":1},{"version":"e2ddb2877f5a841866f4fc772a601b58e90ac8399b35f9a06535be81b8e08b47","impliedFormat":1},{"version":"a793636667598e739a52684033037a67dc2d9db37fab727623626ef19aa5abb9","impliedFormat":1},{"version":"b15d6238a86bc0fc2368da429249b96c260debc0cec3eb7b5f838ad32587c129","impliedFormat":1},{"version":"9a9fba3a20769b0a74923e7032997451b61c1bd371c519429b29019399040d74","impliedFormat":1},{"version":"4b10e2fe52cb61035e58df3f1fdd926dd0fe9cf1a2302f92916da324332fb4e0","impliedFormat":1},{"version":"d1092ae8d6017f359f4758115f588e089848cc8fb359f7ba045b1a1cf3668a49","impliedFormat":1},{"version":"ddae9195b0da7b25a585ef43365f4dc5204a746b155fbee71e6ee1a9193fb69f","impliedFormat":1},{"version":"32dbced998ce74c5e76ce87044d0b4071857576dde36b0c6ed1d5957ce9cf5b5","impliedFormat":1},{"version":"5bc29a9918feba88816b71e32960cf11243b77b76630e9e87cad961e5e1d31d0","impliedFormat":1},{"version":"341ffa358628577f490f128f3880c01d50ef31412d1be012bb1cd959b0a383ea","impliedFormat":1},{"version":"ecc1b8878c8033bde0204b85e26fe1af6847805427759e5723882c848a11e134","impliedFormat":1},{"version":"cfc9c32553ad3b5be38342bc8731397438a93531118e1a226a8c79ad255b4f0c","impliedFormat":1},{"version":"16e5b5b023c2a1119c1878a51714861c56255778de0a7fe378391876a15f7433","impliedFormat":1},{"version":"52e8612d284467b4417143ca8fe54d30145fdfc3815f5b5ea9b14b677f422be5","impliedFormat":1},{"version":"a090a8a3b0ef2cceeb089acf4df95df72e7d934215896afe264ff6f734d66d15","impliedFormat":1},{"version":"a0259c6054e3ed2c5fb705b6638e384446cbcdf7fd2072c659b43bd56e214b9a","impliedFormat":1},{"version":"005319c82222e57934c7b211013eb6931829e46b2a61c5d9a1c3c25f8dc3ea90","impliedFormat":1},{"version":"151f422f08c8ca67b77c5c39d49278b4df452ef409237c8219be109ae3cdae9d","impliedFormat":1},{"version":"6466cbb0aa561e1c1a87850a1f066692f1692a0a9513c508a3886cd66a62dae8","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d1d31f1786b80ab882f0844f2c99767f6f0c6538e94a4292775e8e741c6a802","impliedFormat":1},{"version":"4fed47227c29f71b82b4d21a9448e15492cdcc8b0858db30220178f05bbbeaa5","signature":"2a9464ab1154680f9a45713ad52ee914229ef5a0100cd8a7dc41e9c8dc8563c3","impliedFormat":1},{"version":"bb5cfe79e5f80bd06b0cb8d75274f7710ccb0ba269d35ab06c45dad7bf50a450","signature":"9f2c77b3670856f0be5fd1a504cbc163606ceed481860513eca72634b32d3c7d","impliedFormat":1},{"version":"c01cfa0f58e00bf8da8d4c5735784e1f181d5400a4ac81eedb7945788c0f0202","signature":"66b9118e963c55e4311125a3312c9d946106d43d9def22ed3f41bd52462a4c80","impliedFormat":1},{"version":"b411b5e0d027fad8b10c853e0bca6deb5c853c33434ba036b4b1c1aeed40cd14","signature":"74059c61aa14513a42afb684f2f27e698094baa9895f8e4b04a65b94375f5c40","impliedFormat":1},{"version":"fe5ee97529518a08f57ed224e67bfa96301e005bd08b5a5417344fcff97b3ac0","signature":"d728c1eb02f8384410cf59b5698c2d9f52c7ad655e839d6dbb1f1ad64877cadf","impliedFormat":1},{"version":"be7661a81fd349aa2baf5a7c29d0bd983a83ad685f4aa39c78dbc792c75e2ed9","signature":"8158a29454ce0c7ddb8bd1e17062ce64f9c6d2fa4d8c844ade50a4189da2b05d","impliedFormat":1},{"version":"083095f34bdcebdab08299946c14711451b411c27fce43b36c581c7872320281","signature":"79119a0b05f41118afb2d66ae50d7a36a4df53e9ea25d545ad008513afe7e510","impliedFormat":1},{"version":"9af86084a8ebbdad91aaae097e5a8a7da9fa391af3b5c23a92792d99e76f4677","signature":"d1ebadbf2f41d122d2910386bdc3e6080bce2b5d9707eb827acfc2736f2d911a","impliedFormat":1},{"version":"d66a64bd5ba6d512d47ccc0074cf9db23d7ea162de0739e8fcf77f0aeea37f3f","signature":"510cee1c8ec65773a4b4f970a8b04848bca6d2bfb4673fda9e7fe79cf669215c","impliedFormat":1},{"version":"f4f0f246a8a08617301f3b78229759623855253757b7b83f87447f2607a9e411","signature":"2b3d74e32bb0bd3cd9965f28ba76e5b6587232bf5dbe440f0363231849e42a93","impliedFormat":1},{"version":"c6c8073aa43181b3fb62e1db3462a8ed7d69980f44fb3ef805dc5d76114a443d","signature":"d160d34450c71d714ba809b84ab233881c3cbd582f2c129f8d7e20de2ea2e830","impliedFormat":1},{"version":"3561dd3bf6bb6e1afac607f92542b34e00203dd62a283d60f33c358b875de50f","signature":"b064caa285e15d91ac315e46f7a970940452b4a8f1c071736ca18a48faa98348","impliedFormat":1},{"version":"1bf3e9968191c32ae06a3d7bfd42555330950550c7319ac62d589da1c80e7e9f","signature":"7214a8af60b4039a192bf3460cf48b16c27272aed494e16c8fb375cbcab8a669","impliedFormat":1},{"version":"486302e6935a1024c28a1e21c4c2c6780bb32f24738b2e7ae576bf3515be21ec","signature":"d45382d88b9f313315c4693a3aceb2d137db236ed435726ccc3cb5f4f95fb696","impliedFormat":1},{"version":"98e00c2a3eab378b7026c6e83b0c8f89cffdec8bf39b96db5994951f457c9c84","signature":"ef963a484a85f604c7e9a105f7e53e6176e1d5cdb5d50c69b15188fa94b7ac07","impliedFormat":1},{"version":"a433d0f67aad0528586fb70ffd3a412221a98867fca8dc3df6eabcafbd2c1bd8","signature":"f5d48ed660a093a592fb4d6711e62cacc74112af8ef529921da1d69850cb7246","impliedFormat":1},{"version":"3944301fc3fecdfa3419d986f5e70a1ed82ddb44916072e076e42008877d66eb","signature":"ed66b549cf33c8068d2d68f0e3cb42eb5476e55fcc730fb0d4853e22df31355b","impliedFormat":1},{"version":"69202e2cda90a7dcf9eeb0ca62dec22f92acf669076829b44b627625c05830db","signature":"6d19e497dbbd0db80757a13d2ed759939d8f651a1d063570bc21359319f375b1","impliedFormat":1},{"version":"d4495febc498e1b9ebb71d5bec3120c93fc3971244b4a6a52da7b3006356aa39","signature":"8660e950fd61b3f60ae718284fef7d215011ed9d19ddf110ab688b9a69fc5e64","impliedFormat":1},{"version":"49c886c9ab3bedd4456c156d8d7b2cc02a167a1cb70a590a026f6ba54ebd2236","signature":"5ade073342145585fc0e64759dfcec8d0289e94abc75d2fb333522956c4f5a4b","impliedFormat":1},{"version":"9e2125dd17fd8f9b4546de01a8b30d8b45e8755a2461982c99e1638350f76a82","signature":"68e069b7ef4d7fad012b2aab487ccd1ab728fadc06240683ce520642a7961451","impliedFormat":1}],"root":[[152,172]],"options":{"allowSyntheticDefaultImports":true,"declaration":true,"declarationMap":true,"emitDecoratorMetadata":true,"esModuleInterop":true,"experimentalDecorators":true,"jsx":1,"module":199,"noImplicitAny":true,"noImplicitThis":true,"noUncheckedIndexedAccess":false,"outDir":"./dist","rootDir":"./src","skipDefaultLibCheck":false,"sourceMap":true,"strict":true,"strictNullChecks":true,"strictPropertyInitialization":true,"target":8,"useUnknownInCatchVariables":true},"referencedMap":[[77,1],[78,2],[53,3],[57,4],[87,5],[83,6],[90,7],[94,8],[96,9],[97,10],[116,11],[99,12],[101,13],[103,14],[104,15],[105,16],[71,16],[106,17],[72,18],[107,19],[108,10],[109,20],[110,21],[68,22],[113,23],[115,24],[114,25],[112,26],[73,17],[69,27],[70,28],[100,29],[92,29],[93,30],[76,31],[119,29],[120,32],[122,13],[79,33],[81,34],[124,35],[129,36],[80,37],[131,37],[132,38],[133,39],[135,40],[137,40],[136,40],[85,41],[84,42],[86,40],[82,43],[139,44],[66,38],[140,8],[141,8],[142,45],[143,29],[147,37],[150,46],[59,47],[60,48],[149,47],[67,27],[65,37],[172,49],[159,50],[169,51],[158,52],[170,47],[155,53],[160,54],[166,55],[152,56],[164,57],[161,58],[167,57],[156,59],[168,57],[157,47],[171,60],[165,54],[163,54],[162,61]],"affectedFilesPendingEmit":[[172,51],[159,51],[154,51],[169,51],[158,51],[170,51],[155,51],[160,51],[166,51],[152,51],[164,51],[161,51],[167,51],[156,51],[168,51],[157,51],[171,51],[165,51],[163,51],[162,51]],"version":"5.6.3"} \ No newline at end of file From 1be241b011b228ce48e41cf9c77618d070d5c248 Mon Sep 17 00:00:00 2001 From: Joshua Tag Howard Date: Mon, 28 Oct 2024 21:31:30 +0000 Subject: [PATCH 4/8] Update .npmignore and package.json --- .npmignore | 1 + README.md | 10 ++++++++-- package.json | 5 +++-- tsconfig.tsbuildinfo | 2 +- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/.npmignore b/.npmignore index 5a3dd218..f34c5929 100644 --- a/.npmignore +++ b/.npmignore @@ -3,3 +3,4 @@ /bin /docs /doc +/dist \ No newline at end of file diff --git a/README.md b/README.md index 55087f5d..b58958a2 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,15 @@ # React Native Markdown Display [![npm version](https://badge.fury.io/js/react-native-markdown-display.svg)](https://badge.fury.io/js/react-native-markdown-display) [![Known Vulnerabilities](https://snyk.io/test/github/iamacup/react-native-markdown-display/badge.svg)](https://snyk.io/test/github/iamacup/react-native-markdown-display) -\*\*This is a vendored copy of [@jonasmerlin/react-native-markdown-display](https://github.com/jonasmerlin/react-native-markdown-display) - It a 100% compatible CommonMark renderer, a react-native markdown renderer done right. This is **not** a web-view markdown renderer but a renderer that uses native components for all its elements. These components can be overwritten and styled as needed. +## Credit + +- [mientjan/react-native-markdown-renderer](https://github.com/mientjan/react-native-markdown-renderer): Original library +- [iamacup/react-native-markdown-display](https://github.com/iamacup/react-native-markdown-display): Fork +- [jonasmerlin/react-native-markdown-display](https://github.com/jonasmerlin/react-native-markdown-display): Second Fork +- [@jthoward64](https://github.com/jthoward64): Typescript port + + ### Compatibility with react-native-markdown-renderer This is intended to be a replacement for react-native-markdown-renderer, with a variety of bug fixes and enhancements - **Due to how the new style rules work, there may be some tweaking needed**, [see how to style stuff section below](#How-to-style-stuff) diff --git a/package.json b/package.json index 1af7596b..0549e4fe 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "description": "Markdown renderer for react-native, with CommonMark spec support + adds syntax extensions & sugar (URL autolinking, typographer), originally created by Mient-jan Stelling as react-native-markdown-renderer", "main": "src/index.js", "types": "src/index.d.ts", + "version": "0.1.0", "scripts": { "build": "tsc", "watch": "tsc -w", @@ -14,7 +15,7 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/jonasmerlin/react-native-markdown-display.git" + "url": "git+https://github.com/ukdanceblue/react-native-markdown-display.git" }, "keywords": [ "react", @@ -24,7 +25,7 @@ "commonmark", "markdown-it" ], - "author": "Mient-jan Stelling and Tom Pickard + others from the community", + "author": "Mient-jan Stelling and Tom Pickard + others from the community, ported to TypeScript by Tag Howard", "license": "MIT", "dependencies": { "css-to-react-native": "^3.2.0", diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo index 6bf8f8a4..0100964e 100644 --- a/tsconfig.tsbuildinfo +++ b/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/@types/linkify-it/build/index.cjs.d.ts","./node_modules/@types/mdurl/build/index.cjs.d.ts","./node_modules/@types/markdown-it/dist/index.cjs.d.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/prop-types/index.d.ts","./node_modules/@types/react/index.d.ts","./node_modules/react-native/types/modules/BatchedBridge.d.ts","./node_modules/react-native/types/modules/Codegen.d.ts","./node_modules/react-native/types/modules/Devtools.d.ts","./node_modules/react-native/types/modules/globals.d.ts","./node_modules/react-native/types/modules/LaunchScreen.d.ts","./node_modules/react-native/types/private/Utilities.d.ts","./node_modules/react-native/types/public/Insets.d.ts","./node_modules/react-native/types/public/ReactNativeTypes.d.ts","./node_modules/react-native/Libraries/Types/CoreEventTypes.d.ts","./node_modules/react-native/types/public/ReactNativeRenderer.d.ts","./node_modules/react-native/Libraries/Components/Touchable/Touchable.d.ts","./node_modules/react-native/Libraries/Components/View/ViewAccessibility.d.ts","./node_modules/react-native/Libraries/Components/View/ViewPropTypes.d.ts","./node_modules/react-native/Libraries/Components/RefreshControl/RefreshControl.d.ts","./node_modules/react-native/Libraries/Components/ScrollView/ScrollView.d.ts","./node_modules/react-native/Libraries/Components/View/View.d.ts","./node_modules/react-native/Libraries/Image/ImageResizeMode.d.ts","./node_modules/react-native/Libraries/Image/ImageSource.d.ts","./node_modules/react-native/Libraries/Image/Image.d.ts","./node_modules/@react-native/virtualized-lists/Lists/VirtualizedList.d.ts","./node_modules/@react-native/virtualized-lists/index.d.ts","./node_modules/react-native/Libraries/Lists/FlatList.d.ts","./node_modules/react-native/Libraries/ReactNative/RendererProxy.d.ts","./node_modules/react-native/Libraries/Lists/SectionList.d.ts","./node_modules/react-native/Libraries/Text/Text.d.ts","./node_modules/react-native/Libraries/Animated/Animated.d.ts","./node_modules/react-native/Libraries/StyleSheet/StyleSheetTypes.d.ts","./node_modules/react-native/Libraries/StyleSheet/StyleSheet.d.ts","./node_modules/react-native/Libraries/StyleSheet/processColor.d.ts","./node_modules/react-native/Libraries/ActionSheetIOS/ActionSheetIOS.d.ts","./node_modules/react-native/Libraries/Alert/Alert.d.ts","./node_modules/react-native/Libraries/Animated/Easing.d.ts","./node_modules/react-native/Libraries/Animated/useAnimatedValue.d.ts","./node_modules/react-native/Libraries/vendor/emitter/EventEmitter.d.ts","./node_modules/react-native/Libraries/EventEmitter/RCTDeviceEventEmitter.d.ts","./node_modules/react-native/Libraries/EventEmitter/RCTNativeAppEventEmitter.d.ts","./node_modules/react-native/Libraries/AppState/AppState.d.ts","./node_modules/react-native/Libraries/BatchedBridge/NativeModules.d.ts","./node_modules/react-native/Libraries/Components/AccessibilityInfo/AccessibilityInfo.d.ts","./node_modules/react-native/Libraries/Components/ActivityIndicator/ActivityIndicator.d.ts","./node_modules/react-native/Libraries/Components/Clipboard/Clipboard.d.ts","./node_modules/react-native/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.d.ts","./node_modules/react-native/Libraries/EventEmitter/NativeEventEmitter.d.ts","./node_modules/react-native/Libraries/Components/Keyboard/Keyboard.d.ts","./node_modules/react-native/types/private/TimerMixin.d.ts","./node_modules/react-native/Libraries/Components/Keyboard/KeyboardAvoidingView.d.ts","./node_modules/react-native/Libraries/Components/Pressable/Pressable.d.ts","./node_modules/react-native/Libraries/Components/ProgressBarAndroid/ProgressBarAndroid.d.ts","./node_modules/react-native/Libraries/Components/SafeAreaView/SafeAreaView.d.ts","./node_modules/react-native/Libraries/Components/StatusBar/StatusBar.d.ts","./node_modules/react-native/Libraries/Components/Switch/Switch.d.ts","./node_modules/react-native/Libraries/Components/TextInput/InputAccessoryView.d.ts","./node_modules/react-native/Libraries/Components/TextInput/TextInput.d.ts","./node_modules/react-native/Libraries/Components/ToastAndroid/ToastAndroid.d.ts","./node_modules/react-native/Libraries/Components/Touchable/TouchableWithoutFeedback.d.ts","./node_modules/react-native/Libraries/Components/Touchable/TouchableHighlight.d.ts","./node_modules/react-native/Libraries/Components/Touchable/TouchableOpacity.d.ts","./node_modules/react-native/Libraries/Components/Touchable/TouchableNativeFeedback.d.ts","./node_modules/react-native/Libraries/Components/Button.d.ts","./node_modules/react-native/Libraries/Core/registerCallableModule.d.ts","./node_modules/react-native/Libraries/DevToolsSettings/DevToolsSettingsManager.d.ts","./node_modules/react-native/Libraries/Interaction/InteractionManager.d.ts","./node_modules/react-native/Libraries/Interaction/PanResponder.d.ts","./node_modules/react-native/Libraries/LayoutAnimation/LayoutAnimation.d.ts","./node_modules/react-native/Libraries/Linking/Linking.d.ts","./node_modules/react-native/Libraries/LogBox/LogBox.d.ts","./node_modules/react-native/Libraries/Modal/Modal.d.ts","./node_modules/react-native/Libraries/Performance/Systrace.d.ts","./node_modules/react-native/Libraries/PermissionsAndroid/PermissionsAndroid.d.ts","./node_modules/react-native/Libraries/PushNotificationIOS/PushNotificationIOS.d.ts","./node_modules/react-native/Libraries/Utilities/IPerformanceLogger.d.ts","./node_modules/react-native/Libraries/ReactNative/AppRegistry.d.ts","./node_modules/react-native/Libraries/ReactNative/I18nManager.d.ts","./node_modules/react-native/Libraries/ReactNative/RootTag.d.ts","./node_modules/react-native/Libraries/ReactNative/UIManager.d.ts","./node_modules/react-native/Libraries/ReactNative/requireNativeComponent.d.ts","./node_modules/react-native/Libraries/Settings/Settings.d.ts","./node_modules/react-native/Libraries/Share/Share.d.ts","./node_modules/react-native/Libraries/StyleSheet/PlatformColorValueTypesIOS.d.ts","./node_modules/react-native/Libraries/StyleSheet/PlatformColorValueTypes.d.ts","./node_modules/react-native/Libraries/TurboModule/RCTExport.d.ts","./node_modules/react-native/Libraries/TurboModule/TurboModuleRegistry.d.ts","./node_modules/react-native/Libraries/Utilities/Appearance.d.ts","./node_modules/react-native/Libraries/Utilities/BackHandler.d.ts","./node_modules/react-native/Libraries/Utilities/DevSettings.d.ts","./node_modules/react-native/Libraries/Utilities/Dimensions.d.ts","./node_modules/react-native/Libraries/Utilities/PixelRatio.d.ts","./node_modules/react-native/Libraries/Utilities/Platform.d.ts","./node_modules/react-native/Libraries/Vibration/Vibration.d.ts","./node_modules/react-native/Libraries/YellowBox/YellowBoxDeprecated.d.ts","./node_modules/react-native/Libraries/vendor/core/ErrorUtils.d.ts","./node_modules/react-native/types/public/DeprecatedPropertiesAlias.d.ts","./node_modules/react-native/types/index.d.ts","./node_modules/css-to-react-native/index.d.ts","./src/lib/util/convertAdditionalStyles.ts","./src/lib/util/getUniqueID.ts","./src/lib/data/textStyleProps.ts","./src/lib/types.ts","./src/lib/util/hasParents.ts","./src/lib/util/openUrl.ts","./src/lib/renderRules.tsx","./src/lib/AstRenderer.ts","./src/lib/util/Token.ts","./src/lib/util/getTokenTypeByToken.ts","./src/lib/util/tokensToAST.ts","./src/lib/util/stringToTokens.ts","./src/lib/util/flattenInlineTokens.ts","./src/lib/util/renderInlineAsText.ts","./src/lib/util/cleanupTokens.ts","./src/lib/util/groupTextTokens.ts","./src/lib/util/omitListItemParagraph.ts","./src/lib/parser.ts","./src/lib/styles.ts","./src/lib/util/removeTextStyleProps.ts","./src/index.tsx"],"fileIdsList":[[57,150],[77],[51,52],[54,55,56],[85,86],[57,66,72,73,76,79,81,82,85],[83],[93],[57,65,91],[57,63,65,66,70,84,85],[57,85,114,115],[57,63,65,66,70,85],[91,100],[57,63,70,84,85,102],[57,64,66,69,70,73,84,85],[57,63,65,70,85],[57,63,65,70],[57,63,64,66,68,70,71,84,85],[57,85],[57,84,85],[57,63,65,66,69,70,84,85,91,102],[57,64,66],[57,73,84,85,112],[57,63,68,85,112,114],[57,73,112],[57,63,64,66,68,69,84,85,102],[66],[57,64,66,67,68,69,84,85],[91],[92],[57,63,64,65,66,69,74,75,84,85],[66,67],[57,72,73,78,84,85],[57,72,78,80,84,85],[57,66,70],[57,84,128],[57],[57,65],[65],[85],[84],[74,83,85],[57,63,65,66,69,84,85],[138],[100],[58,59,60,61,62,64,65,66,67,68,69,70,71,72,73,74,75,76,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149],[150],[60],[53,57,150,153,154,155,156,157,158,159,162,163,169,170,171],[57,150,152,153,154,155,158],[53,57,155,160,162,163,166,167,168],[57,150,154,155,156,157],[158],[53],[53,160,161,164,165],[151],[53,160],[53,158,160],[155],[150,154],[53,153,155,160,161]],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"45d8ccb3dfd57355eb29749919142d4321a0aa4df6acdfc54e30433d7176600a","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1a94697425a99354df73d9c8291e2ecd4dddd370aed4023c2d6dee6cccb32666","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3f9fc0ec0b96a9e642f11eda09c0be83a61c7b336977f8b9fdb1e9788e925fe","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3d7b04b45033f57351c8434f60b6be1ea71a2dfec2d0a0c3c83badbb0e3e693","affectsGlobalScope":true,"impliedFormat":1},{"version":"956d27abdea9652e8368ce029bb1e0b9174e9678a273529f426df4b3d90abd60","affectsGlobalScope":true,"impliedFormat":1},{"version":"e6633e05da3ff36e6da2ec170d0d03ccf33de50ca4dc6f5aeecb572cedd162fb","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"742f21debb3937c3839a63245648238555bdab1ea095d43fd10c88a64029bf76","impliedFormat":1},{"version":"0944f27ebff4b20646b71e7e3faaaae50a6debd40bc63e225de1320dd15c5795","impliedFormat":1},{"version":"8a7219b41d3c1c93f3f3b779146f313efade2404eeece88dcd366df7e2364977","impliedFormat":1},{"version":"36a2e4c9a67439aca5f91bb304611d5ae6e20d420503e96c230cf8fcdc948d94","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"ed6b820c54de95b2510bb673490d61c7f2187f532a339d8d04981645a918961f","impliedFormat":1},{"version":"aa17748c522bd586f8712b1a308ea23af59c309b2fd278f6d4f406647c72e659","affectsGlobalScope":true,"impliedFormat":1},{"version":"3a909e8789a4f8b5377ef3fb8dc10d0c0a090c03f2e40aab599534727457475a","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b47c8df863142d9383f948c987e1ebd25ade3867aeb4ae60e9d6009035dfe46","impliedFormat":1},{"version":"b8dd45aa6e099a5f564edcabfe8114096b096eb1ffaa343dd6f3fe73f1a6e85e","impliedFormat":1},{"version":"38e8ac2d182bd3f85d28de9bdf1386c19a319f9c0280aa43960204c353b07878","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc4db28f3510994e45bbabba1ee33e9a0d27dab33d4c8a5844cee8c85438a058","impliedFormat":1},{"version":"232f660363b3b189f7be7822ed71e907195d1a85bc8d55d2b7ce3f09b2136938","impliedFormat":1},{"version":"e745388cfad9efb4e5a9a15a2c6b66d54094dd82f8d0c2551064e216f7b51526","impliedFormat":1},{"version":"53390c21d095fb54e6c0b8351cbf7f4008f096ade9717bc5ee75e340bc3dfa30","impliedFormat":1},{"version":"71493b2c538dffa1e3e968b55b70984b542cc6e488012850865f72768ff32630","impliedFormat":1},{"version":"8ebf448e9837fda1a368acbb575b0e28843d5b2a3fda04bce76248b64326ea49","impliedFormat":1},{"version":"91b9f6241fca7843985aa31157cfa08cc724c77d91145a4d834d27cdde099c05","impliedFormat":1},{"version":"8b94ac8c460c9a2578ca3308fecfcf034e21af89e9c287c97710e9717ffae133","impliedFormat":1},{"version":"a7266bcc42f8ec0f31f319c2dd8100411b4d7b8a534235cb00a719f1c8a2a42e","impliedFormat":1},{"version":"3dfa3a6f2a62259b56fa7bcebfbacf886848dfa037298be5bed07c7a0381ee4f","impliedFormat":1},{"version":"a1e3cda52746919d2a95784ce0b1b9ffa22052209aab5f54e079e7b920f5339e","impliedFormat":1},{"version":"1882680f8c88c5648d603408dd1943857ca831a815e33d3126be8368f7a69252","impliedFormat":1},{"version":"f387a979388291b2688ba0f604e3ae78874f5f777616b448d34109762a4f05a9","impliedFormat":1},{"version":"cae0fb826d8a88749189b8a924dfcb5d3ad629e3bc5ec934195fbd83fa48b068","impliedFormat":1},{"version":"376b8482d1224aa83f4521590672304e30ba847d0b87b9e1a62b2e60a5c788f2","impliedFormat":1},{"version":"488242948cc48ee6413a159c60bcaf70de15db01364741737a962662f1a127a5","impliedFormat":1},{"version":"42bacb33cddecbcfe3e043ee1117ba848801749e44f947626765b3e0aec74b1c","impliedFormat":1},{"version":"b326790c20287ad266b5fcd0c388e2a83320a24747856727dcb70c7bbd489dfc","impliedFormat":1},{"version":"cd2156bc8e4d54d52a2817d1b6f4629a5dd3173b1d8bb0fc893ee678d6a78ecd","impliedFormat":1},{"version":"60526d9010e8ccb2a76a59821061463464c3acd5bc7a50320df6d2e4e0d6e4f7","impliedFormat":1},{"version":"562cce1c8e14e8d5a55d1931cb1848b1df49cc7b1024356d56f3550ed57ad67f","impliedFormat":1},{"version":"623fa4efc706bb9956d0ae94b13321c6617655bf8ebdb270c9792bb398f82e44","impliedFormat":1},{"version":"f20c96192f5841cbf982d2c1989c1e9fdef41c4a9db7543edff131007bf1dbfb","impliedFormat":1},{"version":"79d6871ce0da76f4c865a58daa509d5c8a10545d510b804501daa5d0626e7028","impliedFormat":1},{"version":"9054417b5760061bc5fe31f9eee5dc9bf018339b0617d3c65dd1673c8e3c0f25","impliedFormat":1},{"version":"442856ad0787bc213f659e134c204ad0d502179aa216bf700faefb5572208358","impliedFormat":1},{"version":"443702ca8101ef0adc827c2cc530ca93cf98d41e36ce4399efb9bc833ad9cb62","impliedFormat":1},{"version":"c94f70562ae60797cce564c3bebbaaf1752c327d5063d6ac152aa5ca1616c267","impliedFormat":1},{"version":"2aeb5fcdfc884b16015617d263fd8d1a8513f7efe23880be4e5f0bdb3794b37c","impliedFormat":1},{"version":"fd412dd6372493eb8e3e95cae8687d35e4d34dde905a33e0ee47b74224cdd6ab","impliedFormat":1},{"version":"b561170fbe8d4292425e1dfa52406c8d97575681f7a5e420d11d9f72f7c29e38","impliedFormat":1},{"version":"5fe94f3f6411a0f6293f16fdc8e02ee61138941847ce91d6f6800c97fac22fcd","impliedFormat":1},{"version":"7f7c0ecc3eeeef905a3678e540947f4fbbc1a9c76075419dcc5fbfc3df59cb0b","impliedFormat":1},{"version":"df3303018d45c92be73fb4a282d5a242579f96235f5e0f8981983102caf5feca","impliedFormat":1},{"version":"35db266b474b3b9dfd0bc7d25dff3926cc227de45394262f3783b8b174182a16","impliedFormat":1},{"version":"8205e62a7310ac0513747f6d84175400680cff372559bc5fbe2df707194a295d","impliedFormat":1},{"version":"084d0df6805570b6dc6c8b49c3a71d5bdfe59606901e0026c63945b68d4b080a","impliedFormat":1},{"version":"8387fa3287992c71702756fe6ecea68e2f8f2c5aa434493e3afe4817dd4a4787","impliedFormat":1},{"version":"0f066f9654e700a9cf79c75553c934eb14296aa80583bd2b5d07e2d582a3f4ee","impliedFormat":1},{"version":"269c5d54104033b70331343bd931c9933852a882391ed6bd98c3d8b7d6465d22","impliedFormat":1},{"version":"a56b8577aaf471d9e60582065a8193269310e8cae48c1ce4111ed03216f5f715","impliedFormat":1},{"version":"486ae83cd51b813095f6716f06cc9b2cf480ad1d6c7f8ec59674d6c858cd2407","impliedFormat":1},{"version":"fff527e2567a24dd634a30268f1aa8a220315fed9c513d70ee872e54f67f27f3","impliedFormat":1},{"version":"5dd0ff735b3f2e642c3f16bcfb3dc4ecebb679a70e43cfb19ab5fd84d8faaeed","impliedFormat":1},{"version":"d1d78d1ef0f21ac77cdc436d2a4d56592453a8a2e51af2040ec9a69a5d35e4de","impliedFormat":1},{"version":"bc55b91274e43f88030c9cfe2c4217fae57894c3c302173ab6e9743c29484e3d","impliedFormat":1},{"version":"8bb22f70bfd7bf186631fa565c9202ee6a1009ffb961197b7d092b5a1e1d56b1","impliedFormat":1},{"version":"77282216c61bcef9a700db98e142301d5a7d988d3076286029da63e415e98a42","impliedFormat":1},{"version":"6c28f4f95aaa6c3c8b1a0681c29f446b0bf0ed1aa5aa11e8b2ca6fc9e066e9f2","impliedFormat":1},{"version":"64ce8e260a1362d4cadd6c753581a912a9869d4a53ec6e733dc61018f9250f5d","impliedFormat":1},{"version":"85a915dbb768b89cb92f5e6c165d776bfebd065883c34fee4e0219c3ed321b47","impliedFormat":1},{"version":"83df2f39cb14971adea51d1c84e7d146a34e9b7f84ad118450a51bdc3138412c","impliedFormat":1},{"version":"b96364fcb0c9d521e7618346b00acf3fe16ccf9368404ceac1658edee7b6332c","impliedFormat":1},{"version":"bdb2b70c74908c92ec41d8dd8375a195cb3bb07523e4de642b2b2dfbde249ca6","impliedFormat":1},{"version":"7b329f4137a552073f504022acbf8cd90d49cc5e5529791bef508f76ff774854","impliedFormat":1},{"version":"f63bbbffcfc897d22f34cf19ae13405cd267b1783cd21ec47d8a2d02947c98c1","impliedFormat":1},{"version":"7889f4932dfa7b1126cdc17914d85d80b5860cc3d62ba329494007e8aab45430","impliedFormat":1},{"version":"d9725ef7f60a791668f7fb808eb90b1789feaaef989a686fefc0f7546a51dcdc","impliedFormat":1},{"version":"df55b9be6ba19a6f77487e09dc7a94d7c9bf66094d35ea168dbd4bac42c46b8f","impliedFormat":1},{"version":"595125f3e088b883d104622ef10e6b7d5875ff6976bbe4d7dca090a3e2dca513","impliedFormat":1},{"version":"8ebb6f0603bf481e893311c49e4d2e2061413c51b9ba5898cd9b0a01f5ef19c8","impliedFormat":1},{"version":"e0d7eed4ba363df3faadb8e617f95f9fc8adfbb00b87db7ade4a1098d6cf1e90","impliedFormat":1},{"version":"38faab59a79924ce5eb4f2f3e7e7db91e74d425b4183f908cc014be213f0d971","impliedFormat":1},{"version":"de115595321ce012c456f512a799679bfc874f0ac0a4928a8429557bb25086aa","impliedFormat":1},{"version":"cdca67bd898deff48e3acb05fb44500b5ebce16c26a8ec99dee1522cf9879795","impliedFormat":1},{"version":"0524cab11ba9048d151d93cc666d3908fda329eec6b1642e9a936093e6d79f28","impliedFormat":1},{"version":"869073d7523e75f45bd65b2072865c60002d5e0cbd3d17831e999cf011312778","impliedFormat":1},{"version":"bc7b5906a6ce6c5744a640c314e020856be6c50a693e77dc12aff2d77b12ca76","impliedFormat":1},{"version":"56503e377bc1344f155e4e3115a772cb4e59350c0b8131e3e1fb2750ac491608","impliedFormat":1},{"version":"6b579287217ee1320ee1c6cfec5f6730f3a1f91daab000f7131558ee531b2bf8","impliedFormat":1},{"version":"e2ddb2877f5a841866f4fc772a601b58e90ac8399b35f9a06535be81b8e08b47","impliedFormat":1},{"version":"a793636667598e739a52684033037a67dc2d9db37fab727623626ef19aa5abb9","impliedFormat":1},{"version":"b15d6238a86bc0fc2368da429249b96c260debc0cec3eb7b5f838ad32587c129","impliedFormat":1},{"version":"9a9fba3a20769b0a74923e7032997451b61c1bd371c519429b29019399040d74","impliedFormat":1},{"version":"4b10e2fe52cb61035e58df3f1fdd926dd0fe9cf1a2302f92916da324332fb4e0","impliedFormat":1},{"version":"d1092ae8d6017f359f4758115f588e089848cc8fb359f7ba045b1a1cf3668a49","impliedFormat":1},{"version":"ddae9195b0da7b25a585ef43365f4dc5204a746b155fbee71e6ee1a9193fb69f","impliedFormat":1},{"version":"32dbced998ce74c5e76ce87044d0b4071857576dde36b0c6ed1d5957ce9cf5b5","impliedFormat":1},{"version":"5bc29a9918feba88816b71e32960cf11243b77b76630e9e87cad961e5e1d31d0","impliedFormat":1},{"version":"341ffa358628577f490f128f3880c01d50ef31412d1be012bb1cd959b0a383ea","impliedFormat":1},{"version":"ecc1b8878c8033bde0204b85e26fe1af6847805427759e5723882c848a11e134","impliedFormat":1},{"version":"cfc9c32553ad3b5be38342bc8731397438a93531118e1a226a8c79ad255b4f0c","impliedFormat":1},{"version":"16e5b5b023c2a1119c1878a51714861c56255778de0a7fe378391876a15f7433","impliedFormat":1},{"version":"52e8612d284467b4417143ca8fe54d30145fdfc3815f5b5ea9b14b677f422be5","impliedFormat":1},{"version":"a090a8a3b0ef2cceeb089acf4df95df72e7d934215896afe264ff6f734d66d15","impliedFormat":1},{"version":"a0259c6054e3ed2c5fb705b6638e384446cbcdf7fd2072c659b43bd56e214b9a","impliedFormat":1},{"version":"005319c82222e57934c7b211013eb6931829e46b2a61c5d9a1c3c25f8dc3ea90","impliedFormat":1},{"version":"151f422f08c8ca67b77c5c39d49278b4df452ef409237c8219be109ae3cdae9d","impliedFormat":1},{"version":"6466cbb0aa561e1c1a87850a1f066692f1692a0a9513c508a3886cd66a62dae8","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d1d31f1786b80ab882f0844f2c99767f6f0c6538e94a4292775e8e741c6a802","impliedFormat":1},{"version":"4fed47227c29f71b82b4d21a9448e15492cdcc8b0858db30220178f05bbbeaa5","signature":"2a9464ab1154680f9a45713ad52ee914229ef5a0100cd8a7dc41e9c8dc8563c3","impliedFormat":1},{"version":"bb5cfe79e5f80bd06b0cb8d75274f7710ccb0ba269d35ab06c45dad7bf50a450","signature":"9f2c77b3670856f0be5fd1a504cbc163606ceed481860513eca72634b32d3c7d","impliedFormat":1},{"version":"c01cfa0f58e00bf8da8d4c5735784e1f181d5400a4ac81eedb7945788c0f0202","signature":"66b9118e963c55e4311125a3312c9d946106d43d9def22ed3f41bd52462a4c80","impliedFormat":1},{"version":"b411b5e0d027fad8b10c853e0bca6deb5c853c33434ba036b4b1c1aeed40cd14","signature":"74059c61aa14513a42afb684f2f27e698094baa9895f8e4b04a65b94375f5c40","impliedFormat":1},{"version":"fe5ee97529518a08f57ed224e67bfa96301e005bd08b5a5417344fcff97b3ac0","signature":"d728c1eb02f8384410cf59b5698c2d9f52c7ad655e839d6dbb1f1ad64877cadf","impliedFormat":1},{"version":"be7661a81fd349aa2baf5a7c29d0bd983a83ad685f4aa39c78dbc792c75e2ed9","signature":"8158a29454ce0c7ddb8bd1e17062ce64f9c6d2fa4d8c844ade50a4189da2b05d","impliedFormat":1},{"version":"083095f34bdcebdab08299946c14711451b411c27fce43b36c581c7872320281","signature":"79119a0b05f41118afb2d66ae50d7a36a4df53e9ea25d545ad008513afe7e510","impliedFormat":1},{"version":"9af86084a8ebbdad91aaae097e5a8a7da9fa391af3b5c23a92792d99e76f4677","signature":"d1ebadbf2f41d122d2910386bdc3e6080bce2b5d9707eb827acfc2736f2d911a","impliedFormat":1},{"version":"d66a64bd5ba6d512d47ccc0074cf9db23d7ea162de0739e8fcf77f0aeea37f3f","signature":"510cee1c8ec65773a4b4f970a8b04848bca6d2bfb4673fda9e7fe79cf669215c","impliedFormat":1},{"version":"f4f0f246a8a08617301f3b78229759623855253757b7b83f87447f2607a9e411","signature":"2b3d74e32bb0bd3cd9965f28ba76e5b6587232bf5dbe440f0363231849e42a93","impliedFormat":1},{"version":"c6c8073aa43181b3fb62e1db3462a8ed7d69980f44fb3ef805dc5d76114a443d","signature":"d160d34450c71d714ba809b84ab233881c3cbd582f2c129f8d7e20de2ea2e830","impliedFormat":1},{"version":"3561dd3bf6bb6e1afac607f92542b34e00203dd62a283d60f33c358b875de50f","signature":"b064caa285e15d91ac315e46f7a970940452b4a8f1c071736ca18a48faa98348","impliedFormat":1},{"version":"1bf3e9968191c32ae06a3d7bfd42555330950550c7319ac62d589da1c80e7e9f","signature":"7214a8af60b4039a192bf3460cf48b16c27272aed494e16c8fb375cbcab8a669","impliedFormat":1},{"version":"486302e6935a1024c28a1e21c4c2c6780bb32f24738b2e7ae576bf3515be21ec","signature":"d45382d88b9f313315c4693a3aceb2d137db236ed435726ccc3cb5f4f95fb696","impliedFormat":1},{"version":"98e00c2a3eab378b7026c6e83b0c8f89cffdec8bf39b96db5994951f457c9c84","signature":"ef963a484a85f604c7e9a105f7e53e6176e1d5cdb5d50c69b15188fa94b7ac07","impliedFormat":1},{"version":"a433d0f67aad0528586fb70ffd3a412221a98867fca8dc3df6eabcafbd2c1bd8","signature":"f5d48ed660a093a592fb4d6711e62cacc74112af8ef529921da1d69850cb7246","impliedFormat":1},{"version":"3944301fc3fecdfa3419d986f5e70a1ed82ddb44916072e076e42008877d66eb","signature":"ed66b549cf33c8068d2d68f0e3cb42eb5476e55fcc730fb0d4853e22df31355b","impliedFormat":1},{"version":"69202e2cda90a7dcf9eeb0ca62dec22f92acf669076829b44b627625c05830db","signature":"6d19e497dbbd0db80757a13d2ed759939d8f651a1d063570bc21359319f375b1","impliedFormat":1},{"version":"d4495febc498e1b9ebb71d5bec3120c93fc3971244b4a6a52da7b3006356aa39","signature":"8660e950fd61b3f60ae718284fef7d215011ed9d19ddf110ab688b9a69fc5e64","impliedFormat":1},{"version":"49c886c9ab3bedd4456c156d8d7b2cc02a167a1cb70a590a026f6ba54ebd2236","signature":"5ade073342145585fc0e64759dfcec8d0289e94abc75d2fb333522956c4f5a4b","impliedFormat":1},{"version":"9e2125dd17fd8f9b4546de01a8b30d8b45e8755a2461982c99e1638350f76a82","signature":"68e069b7ef4d7fad012b2aab487ccd1ab728fadc06240683ce520642a7961451","impliedFormat":1}],"root":[[152,172]],"options":{"allowSyntheticDefaultImports":true,"declaration":true,"declarationMap":true,"emitDecoratorMetadata":true,"esModuleInterop":true,"experimentalDecorators":true,"jsx":1,"module":199,"noImplicitAny":true,"noImplicitThis":true,"noUncheckedIndexedAccess":false,"outDir":"./dist","rootDir":"./src","skipDefaultLibCheck":false,"sourceMap":true,"strict":true,"strictNullChecks":true,"strictPropertyInitialization":true,"target":8,"useUnknownInCatchVariables":true},"referencedMap":[[77,1],[78,2],[53,3],[57,4],[87,5],[83,6],[90,7],[94,8],[96,9],[97,10],[116,11],[99,12],[101,13],[103,14],[104,15],[105,16],[71,16],[106,17],[72,18],[107,19],[108,10],[109,20],[110,21],[68,22],[113,23],[115,24],[114,25],[112,26],[73,17],[69,27],[70,28],[100,29],[92,29],[93,30],[76,31],[119,29],[120,32],[122,13],[79,33],[81,34],[124,35],[129,36],[80,37],[131,37],[132,38],[133,39],[135,40],[137,40],[136,40],[85,41],[84,42],[86,40],[82,43],[139,44],[66,38],[140,8],[141,8],[142,45],[143,29],[147,37],[150,46],[59,47],[60,48],[149,47],[67,27],[65,37],[172,49],[159,50],[169,51],[158,52],[170,47],[155,53],[160,54],[166,55],[152,56],[164,57],[161,58],[167,57],[156,59],[168,57],[157,47],[171,60],[165,54],[163,54],[162,61]],"affectedFilesPendingEmit":[[172,51],[159,51],[154,51],[169,51],[158,51],[170,51],[155,51],[160,51],[166,51],[152,51],[164,51],[161,51],[167,51],[156,51],[168,51],[157,51],[171,51],[165,51],[163,51],[162,51]],"version":"5.6.3"} \ No newline at end of file +{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/@types/linkify-it/build/index.cjs.d.ts","./node_modules/@types/mdurl/build/index.cjs.d.ts","./node_modules/@types/markdown-it/dist/index.cjs.d.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/prop-types/index.d.ts","./node_modules/@types/react/index.d.ts","./node_modules/react-native/types/modules/BatchedBridge.d.ts","./node_modules/react-native/types/modules/Codegen.d.ts","./node_modules/react-native/types/modules/Devtools.d.ts","./node_modules/react-native/types/modules/globals.d.ts","./node_modules/react-native/types/modules/LaunchScreen.d.ts","./node_modules/react-native/types/private/Utilities.d.ts","./node_modules/react-native/types/public/Insets.d.ts","./node_modules/react-native/types/public/ReactNativeTypes.d.ts","./node_modules/react-native/Libraries/Types/CoreEventTypes.d.ts","./node_modules/react-native/types/public/ReactNativeRenderer.d.ts","./node_modules/react-native/Libraries/Components/Touchable/Touchable.d.ts","./node_modules/react-native/Libraries/Components/View/ViewAccessibility.d.ts","./node_modules/react-native/Libraries/Components/View/ViewPropTypes.d.ts","./node_modules/react-native/Libraries/Components/RefreshControl/RefreshControl.d.ts","./node_modules/react-native/Libraries/Components/ScrollView/ScrollView.d.ts","./node_modules/react-native/Libraries/Components/View/View.d.ts","./node_modules/react-native/Libraries/Image/ImageResizeMode.d.ts","./node_modules/react-native/Libraries/Image/ImageSource.d.ts","./node_modules/react-native/Libraries/Image/Image.d.ts","./node_modules/@react-native/virtualized-lists/Lists/VirtualizedList.d.ts","./node_modules/@react-native/virtualized-lists/index.d.ts","./node_modules/react-native/Libraries/Lists/FlatList.d.ts","./node_modules/react-native/Libraries/ReactNative/RendererProxy.d.ts","./node_modules/react-native/Libraries/Lists/SectionList.d.ts","./node_modules/react-native/Libraries/Text/Text.d.ts","./node_modules/react-native/Libraries/Animated/Animated.d.ts","./node_modules/react-native/Libraries/StyleSheet/StyleSheetTypes.d.ts","./node_modules/react-native/Libraries/StyleSheet/StyleSheet.d.ts","./node_modules/react-native/Libraries/StyleSheet/processColor.d.ts","./node_modules/react-native/Libraries/ActionSheetIOS/ActionSheetIOS.d.ts","./node_modules/react-native/Libraries/Alert/Alert.d.ts","./node_modules/react-native/Libraries/Animated/Easing.d.ts","./node_modules/react-native/Libraries/Animated/useAnimatedValue.d.ts","./node_modules/react-native/Libraries/vendor/emitter/EventEmitter.d.ts","./node_modules/react-native/Libraries/EventEmitter/RCTDeviceEventEmitter.d.ts","./node_modules/react-native/Libraries/EventEmitter/RCTNativeAppEventEmitter.d.ts","./node_modules/react-native/Libraries/AppState/AppState.d.ts","./node_modules/react-native/Libraries/BatchedBridge/NativeModules.d.ts","./node_modules/react-native/Libraries/Components/AccessibilityInfo/AccessibilityInfo.d.ts","./node_modules/react-native/Libraries/Components/ActivityIndicator/ActivityIndicator.d.ts","./node_modules/react-native/Libraries/Components/Clipboard/Clipboard.d.ts","./node_modules/react-native/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.d.ts","./node_modules/react-native/Libraries/EventEmitter/NativeEventEmitter.d.ts","./node_modules/react-native/Libraries/Components/Keyboard/Keyboard.d.ts","./node_modules/react-native/types/private/TimerMixin.d.ts","./node_modules/react-native/Libraries/Components/Keyboard/KeyboardAvoidingView.d.ts","./node_modules/react-native/Libraries/Components/Pressable/Pressable.d.ts","./node_modules/react-native/Libraries/Components/ProgressBarAndroid/ProgressBarAndroid.d.ts","./node_modules/react-native/Libraries/Components/SafeAreaView/SafeAreaView.d.ts","./node_modules/react-native/Libraries/Components/StatusBar/StatusBar.d.ts","./node_modules/react-native/Libraries/Components/Switch/Switch.d.ts","./node_modules/react-native/Libraries/Components/TextInput/InputAccessoryView.d.ts","./node_modules/react-native/Libraries/Components/TextInput/TextInput.d.ts","./node_modules/react-native/Libraries/Components/ToastAndroid/ToastAndroid.d.ts","./node_modules/react-native/Libraries/Components/Touchable/TouchableWithoutFeedback.d.ts","./node_modules/react-native/Libraries/Components/Touchable/TouchableHighlight.d.ts","./node_modules/react-native/Libraries/Components/Touchable/TouchableOpacity.d.ts","./node_modules/react-native/Libraries/Components/Touchable/TouchableNativeFeedback.d.ts","./node_modules/react-native/Libraries/Components/Button.d.ts","./node_modules/react-native/Libraries/Core/registerCallableModule.d.ts","./node_modules/react-native/Libraries/DevToolsSettings/DevToolsSettingsManager.d.ts","./node_modules/react-native/Libraries/Interaction/InteractionManager.d.ts","./node_modules/react-native/Libraries/Interaction/PanResponder.d.ts","./node_modules/react-native/Libraries/LayoutAnimation/LayoutAnimation.d.ts","./node_modules/react-native/Libraries/Linking/Linking.d.ts","./node_modules/react-native/Libraries/LogBox/LogBox.d.ts","./node_modules/react-native/Libraries/Modal/Modal.d.ts","./node_modules/react-native/Libraries/Performance/Systrace.d.ts","./node_modules/react-native/Libraries/PermissionsAndroid/PermissionsAndroid.d.ts","./node_modules/react-native/Libraries/PushNotificationIOS/PushNotificationIOS.d.ts","./node_modules/react-native/Libraries/Utilities/IPerformanceLogger.d.ts","./node_modules/react-native/Libraries/ReactNative/AppRegistry.d.ts","./node_modules/react-native/Libraries/ReactNative/I18nManager.d.ts","./node_modules/react-native/Libraries/ReactNative/RootTag.d.ts","./node_modules/react-native/Libraries/ReactNative/UIManager.d.ts","./node_modules/react-native/Libraries/ReactNative/requireNativeComponent.d.ts","./node_modules/react-native/Libraries/Settings/Settings.d.ts","./node_modules/react-native/Libraries/Share/Share.d.ts","./node_modules/react-native/Libraries/StyleSheet/PlatformColorValueTypesIOS.d.ts","./node_modules/react-native/Libraries/StyleSheet/PlatformColorValueTypes.d.ts","./node_modules/react-native/Libraries/TurboModule/RCTExport.d.ts","./node_modules/react-native/Libraries/TurboModule/TurboModuleRegistry.d.ts","./node_modules/react-native/Libraries/Utilities/Appearance.d.ts","./node_modules/react-native/Libraries/Utilities/BackHandler.d.ts","./node_modules/react-native/Libraries/Utilities/DevSettings.d.ts","./node_modules/react-native/Libraries/Utilities/Dimensions.d.ts","./node_modules/react-native/Libraries/Utilities/PixelRatio.d.ts","./node_modules/react-native/Libraries/Utilities/Platform.d.ts","./node_modules/react-native/Libraries/Vibration/Vibration.d.ts","./node_modules/react-native/Libraries/YellowBox/YellowBoxDeprecated.d.ts","./node_modules/react-native/Libraries/vendor/core/ErrorUtils.d.ts","./node_modules/react-native/types/public/DeprecatedPropertiesAlias.d.ts","./node_modules/react-native/types/index.d.ts","./node_modules/css-to-react-native/index.d.ts","./src/lib/util/convertAdditionalStyles.ts","./src/lib/util/getUniqueID.ts","./src/lib/data/textStyleProps.ts","./src/lib/types.ts","./src/lib/util/hasParents.ts","./src/lib/util/openUrl.ts","./src/lib/renderRules.tsx","./src/lib/AstRenderer.ts","./src/lib/util/Token.ts","./src/lib/util/getTokenTypeByToken.ts","./src/lib/util/tokensToAST.ts","./src/lib/util/stringToTokens.ts","./src/lib/util/flattenInlineTokens.ts","./src/lib/util/renderInlineAsText.ts","./src/lib/util/cleanupTokens.ts","./src/lib/util/groupTextTokens.ts","./src/lib/util/omitListItemParagraph.ts","./src/lib/parser.ts","./src/lib/styles.ts","./src/lib/util/removeTextStyleProps.ts","./src/index.tsx"],"fileIdsList":[[57,150],[77],[51,52],[54,55,56],[85,86],[57,66,72,73,76,79,81,82,85],[83],[93],[57,65,91],[57,63,65,66,70,84,85],[57,85,114,115],[57,63,65,66,70,85],[91,100],[57,63,70,84,85,102],[57,64,66,69,70,73,84,85],[57,63,65,70,85],[57,63,65,70],[57,63,64,66,68,70,71,84,85],[57,85],[57,84,85],[57,63,65,66,69,70,84,85,91,102],[57,64,66],[57,73,84,85,112],[57,63,68,85,112,114],[57,73,112],[57,63,64,66,68,69,84,85,102],[66],[57,64,66,67,68,69,84,85],[91],[92],[57,63,64,65,66,69,74,75,84,85],[66,67],[57,72,73,78,84,85],[57,72,78,80,84,85],[57,66,70],[57,84,128],[57],[57,65],[65],[85],[84],[74,83,85],[57,63,65,66,69,84,85],[138],[100],[58,59,60,61,62,64,65,66,67,68,69,70,71,72,73,74,75,76,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149],[150],[60],[53,57,150,153,154,155,156,157,158,159,162,163,169,170,171],[57,150,152,153,154,155,158],[53,57,155,160,162,163,166,167,168],[57,150,154,155,156,157],[158],[53],[53,160,161,164,165],[151],[53,160],[53,158,160],[155],[150,154],[53,153,155,160,161]],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"45d8ccb3dfd57355eb29749919142d4321a0aa4df6acdfc54e30433d7176600a","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1a94697425a99354df73d9c8291e2ecd4dddd370aed4023c2d6dee6cccb32666","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3f9fc0ec0b96a9e642f11eda09c0be83a61c7b336977f8b9fdb1e9788e925fe","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3d7b04b45033f57351c8434f60b6be1ea71a2dfec2d0a0c3c83badbb0e3e693","affectsGlobalScope":true,"impliedFormat":1},{"version":"956d27abdea9652e8368ce029bb1e0b9174e9678a273529f426df4b3d90abd60","affectsGlobalScope":true,"impliedFormat":1},{"version":"e6633e05da3ff36e6da2ec170d0d03ccf33de50ca4dc6f5aeecb572cedd162fb","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"742f21debb3937c3839a63245648238555bdab1ea095d43fd10c88a64029bf76","impliedFormat":1},{"version":"0944f27ebff4b20646b71e7e3faaaae50a6debd40bc63e225de1320dd15c5795","impliedFormat":1},{"version":"8a7219b41d3c1c93f3f3b779146f313efade2404eeece88dcd366df7e2364977","impliedFormat":1},{"version":"36a2e4c9a67439aca5f91bb304611d5ae6e20d420503e96c230cf8fcdc948d94","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"ed6b820c54de95b2510bb673490d61c7f2187f532a339d8d04981645a918961f","impliedFormat":1},{"version":"aa17748c522bd586f8712b1a308ea23af59c309b2fd278f6d4f406647c72e659","affectsGlobalScope":true,"impliedFormat":1},{"version":"3a909e8789a4f8b5377ef3fb8dc10d0c0a090c03f2e40aab599534727457475a","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b47c8df863142d9383f948c987e1ebd25ade3867aeb4ae60e9d6009035dfe46","impliedFormat":1},{"version":"b8dd45aa6e099a5f564edcabfe8114096b096eb1ffaa343dd6f3fe73f1a6e85e","impliedFormat":1},{"version":"38e8ac2d182bd3f85d28de9bdf1386c19a319f9c0280aa43960204c353b07878","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc4db28f3510994e45bbabba1ee33e9a0d27dab33d4c8a5844cee8c85438a058","impliedFormat":1},{"version":"232f660363b3b189f7be7822ed71e907195d1a85bc8d55d2b7ce3f09b2136938","impliedFormat":1},{"version":"e745388cfad9efb4e5a9a15a2c6b66d54094dd82f8d0c2551064e216f7b51526","impliedFormat":1},{"version":"53390c21d095fb54e6c0b8351cbf7f4008f096ade9717bc5ee75e340bc3dfa30","impliedFormat":1},{"version":"71493b2c538dffa1e3e968b55b70984b542cc6e488012850865f72768ff32630","impliedFormat":1},{"version":"8ebf448e9837fda1a368acbb575b0e28843d5b2a3fda04bce76248b64326ea49","impliedFormat":1},{"version":"91b9f6241fca7843985aa31157cfa08cc724c77d91145a4d834d27cdde099c05","impliedFormat":1},{"version":"8b94ac8c460c9a2578ca3308fecfcf034e21af89e9c287c97710e9717ffae133","impliedFormat":1},{"version":"a7266bcc42f8ec0f31f319c2dd8100411b4d7b8a534235cb00a719f1c8a2a42e","impliedFormat":1},{"version":"3dfa3a6f2a62259b56fa7bcebfbacf886848dfa037298be5bed07c7a0381ee4f","impliedFormat":1},{"version":"a1e3cda52746919d2a95784ce0b1b9ffa22052209aab5f54e079e7b920f5339e","impliedFormat":1},{"version":"1882680f8c88c5648d603408dd1943857ca831a815e33d3126be8368f7a69252","impliedFormat":1},{"version":"f387a979388291b2688ba0f604e3ae78874f5f777616b448d34109762a4f05a9","impliedFormat":1},{"version":"cae0fb826d8a88749189b8a924dfcb5d3ad629e3bc5ec934195fbd83fa48b068","impliedFormat":1},{"version":"376b8482d1224aa83f4521590672304e30ba847d0b87b9e1a62b2e60a5c788f2","impliedFormat":1},{"version":"488242948cc48ee6413a159c60bcaf70de15db01364741737a962662f1a127a5","impliedFormat":1},{"version":"42bacb33cddecbcfe3e043ee1117ba848801749e44f947626765b3e0aec74b1c","impliedFormat":1},{"version":"b326790c20287ad266b5fcd0c388e2a83320a24747856727dcb70c7bbd489dfc","impliedFormat":1},{"version":"cd2156bc8e4d54d52a2817d1b6f4629a5dd3173b1d8bb0fc893ee678d6a78ecd","impliedFormat":1},{"version":"60526d9010e8ccb2a76a59821061463464c3acd5bc7a50320df6d2e4e0d6e4f7","impliedFormat":1},{"version":"562cce1c8e14e8d5a55d1931cb1848b1df49cc7b1024356d56f3550ed57ad67f","impliedFormat":1},{"version":"623fa4efc706bb9956d0ae94b13321c6617655bf8ebdb270c9792bb398f82e44","impliedFormat":1},{"version":"f20c96192f5841cbf982d2c1989c1e9fdef41c4a9db7543edff131007bf1dbfb","impliedFormat":1},{"version":"79d6871ce0da76f4c865a58daa509d5c8a10545d510b804501daa5d0626e7028","impliedFormat":1},{"version":"9054417b5760061bc5fe31f9eee5dc9bf018339b0617d3c65dd1673c8e3c0f25","impliedFormat":1},{"version":"442856ad0787bc213f659e134c204ad0d502179aa216bf700faefb5572208358","impliedFormat":1},{"version":"443702ca8101ef0adc827c2cc530ca93cf98d41e36ce4399efb9bc833ad9cb62","impliedFormat":1},{"version":"c94f70562ae60797cce564c3bebbaaf1752c327d5063d6ac152aa5ca1616c267","impliedFormat":1},{"version":"2aeb5fcdfc884b16015617d263fd8d1a8513f7efe23880be4e5f0bdb3794b37c","impliedFormat":1},{"version":"fd412dd6372493eb8e3e95cae8687d35e4d34dde905a33e0ee47b74224cdd6ab","impliedFormat":1},{"version":"b561170fbe8d4292425e1dfa52406c8d97575681f7a5e420d11d9f72f7c29e38","impliedFormat":1},{"version":"5fe94f3f6411a0f6293f16fdc8e02ee61138941847ce91d6f6800c97fac22fcd","impliedFormat":1},{"version":"7f7c0ecc3eeeef905a3678e540947f4fbbc1a9c76075419dcc5fbfc3df59cb0b","impliedFormat":1},{"version":"df3303018d45c92be73fb4a282d5a242579f96235f5e0f8981983102caf5feca","impliedFormat":1},{"version":"35db266b474b3b9dfd0bc7d25dff3926cc227de45394262f3783b8b174182a16","impliedFormat":1},{"version":"8205e62a7310ac0513747f6d84175400680cff372559bc5fbe2df707194a295d","impliedFormat":1},{"version":"084d0df6805570b6dc6c8b49c3a71d5bdfe59606901e0026c63945b68d4b080a","impliedFormat":1},{"version":"8387fa3287992c71702756fe6ecea68e2f8f2c5aa434493e3afe4817dd4a4787","impliedFormat":1},{"version":"0f066f9654e700a9cf79c75553c934eb14296aa80583bd2b5d07e2d582a3f4ee","impliedFormat":1},{"version":"269c5d54104033b70331343bd931c9933852a882391ed6bd98c3d8b7d6465d22","impliedFormat":1},{"version":"a56b8577aaf471d9e60582065a8193269310e8cae48c1ce4111ed03216f5f715","impliedFormat":1},{"version":"486ae83cd51b813095f6716f06cc9b2cf480ad1d6c7f8ec59674d6c858cd2407","impliedFormat":1},{"version":"fff527e2567a24dd634a30268f1aa8a220315fed9c513d70ee872e54f67f27f3","impliedFormat":1},{"version":"5dd0ff735b3f2e642c3f16bcfb3dc4ecebb679a70e43cfb19ab5fd84d8faaeed","impliedFormat":1},{"version":"d1d78d1ef0f21ac77cdc436d2a4d56592453a8a2e51af2040ec9a69a5d35e4de","impliedFormat":1},{"version":"bc55b91274e43f88030c9cfe2c4217fae57894c3c302173ab6e9743c29484e3d","impliedFormat":1},{"version":"8bb22f70bfd7bf186631fa565c9202ee6a1009ffb961197b7d092b5a1e1d56b1","impliedFormat":1},{"version":"77282216c61bcef9a700db98e142301d5a7d988d3076286029da63e415e98a42","impliedFormat":1},{"version":"6c28f4f95aaa6c3c8b1a0681c29f446b0bf0ed1aa5aa11e8b2ca6fc9e066e9f2","impliedFormat":1},{"version":"64ce8e260a1362d4cadd6c753581a912a9869d4a53ec6e733dc61018f9250f5d","impliedFormat":1},{"version":"85a915dbb768b89cb92f5e6c165d776bfebd065883c34fee4e0219c3ed321b47","impliedFormat":1},{"version":"83df2f39cb14971adea51d1c84e7d146a34e9b7f84ad118450a51bdc3138412c","impliedFormat":1},{"version":"b96364fcb0c9d521e7618346b00acf3fe16ccf9368404ceac1658edee7b6332c","impliedFormat":1},{"version":"bdb2b70c74908c92ec41d8dd8375a195cb3bb07523e4de642b2b2dfbde249ca6","impliedFormat":1},{"version":"7b329f4137a552073f504022acbf8cd90d49cc5e5529791bef508f76ff774854","impliedFormat":1},{"version":"f63bbbffcfc897d22f34cf19ae13405cd267b1783cd21ec47d8a2d02947c98c1","impliedFormat":1},{"version":"7889f4932dfa7b1126cdc17914d85d80b5860cc3d62ba329494007e8aab45430","impliedFormat":1},{"version":"d9725ef7f60a791668f7fb808eb90b1789feaaef989a686fefc0f7546a51dcdc","impliedFormat":1},{"version":"df55b9be6ba19a6f77487e09dc7a94d7c9bf66094d35ea168dbd4bac42c46b8f","impliedFormat":1},{"version":"595125f3e088b883d104622ef10e6b7d5875ff6976bbe4d7dca090a3e2dca513","impliedFormat":1},{"version":"8ebb6f0603bf481e893311c49e4d2e2061413c51b9ba5898cd9b0a01f5ef19c8","impliedFormat":1},{"version":"e0d7eed4ba363df3faadb8e617f95f9fc8adfbb00b87db7ade4a1098d6cf1e90","impliedFormat":1},{"version":"38faab59a79924ce5eb4f2f3e7e7db91e74d425b4183f908cc014be213f0d971","impliedFormat":1},{"version":"de115595321ce012c456f512a799679bfc874f0ac0a4928a8429557bb25086aa","impliedFormat":1},{"version":"cdca67bd898deff48e3acb05fb44500b5ebce16c26a8ec99dee1522cf9879795","impliedFormat":1},{"version":"0524cab11ba9048d151d93cc666d3908fda329eec6b1642e9a936093e6d79f28","impliedFormat":1},{"version":"869073d7523e75f45bd65b2072865c60002d5e0cbd3d17831e999cf011312778","impliedFormat":1},{"version":"bc7b5906a6ce6c5744a640c314e020856be6c50a693e77dc12aff2d77b12ca76","impliedFormat":1},{"version":"56503e377bc1344f155e4e3115a772cb4e59350c0b8131e3e1fb2750ac491608","impliedFormat":1},{"version":"6b579287217ee1320ee1c6cfec5f6730f3a1f91daab000f7131558ee531b2bf8","impliedFormat":1},{"version":"e2ddb2877f5a841866f4fc772a601b58e90ac8399b35f9a06535be81b8e08b47","impliedFormat":1},{"version":"a793636667598e739a52684033037a67dc2d9db37fab727623626ef19aa5abb9","impliedFormat":1},{"version":"b15d6238a86bc0fc2368da429249b96c260debc0cec3eb7b5f838ad32587c129","impliedFormat":1},{"version":"9a9fba3a20769b0a74923e7032997451b61c1bd371c519429b29019399040d74","impliedFormat":1},{"version":"4b10e2fe52cb61035e58df3f1fdd926dd0fe9cf1a2302f92916da324332fb4e0","impliedFormat":1},{"version":"d1092ae8d6017f359f4758115f588e089848cc8fb359f7ba045b1a1cf3668a49","impliedFormat":1},{"version":"ddae9195b0da7b25a585ef43365f4dc5204a746b155fbee71e6ee1a9193fb69f","impliedFormat":1},{"version":"32dbced998ce74c5e76ce87044d0b4071857576dde36b0c6ed1d5957ce9cf5b5","impliedFormat":1},{"version":"5bc29a9918feba88816b71e32960cf11243b77b76630e9e87cad961e5e1d31d0","impliedFormat":1},{"version":"341ffa358628577f490f128f3880c01d50ef31412d1be012bb1cd959b0a383ea","impliedFormat":1},{"version":"ecc1b8878c8033bde0204b85e26fe1af6847805427759e5723882c848a11e134","impliedFormat":1},{"version":"cfc9c32553ad3b5be38342bc8731397438a93531118e1a226a8c79ad255b4f0c","impliedFormat":1},{"version":"16e5b5b023c2a1119c1878a51714861c56255778de0a7fe378391876a15f7433","impliedFormat":1},{"version":"52e8612d284467b4417143ca8fe54d30145fdfc3815f5b5ea9b14b677f422be5","impliedFormat":1},{"version":"a090a8a3b0ef2cceeb089acf4df95df72e7d934215896afe264ff6f734d66d15","impliedFormat":1},{"version":"a0259c6054e3ed2c5fb705b6638e384446cbcdf7fd2072c659b43bd56e214b9a","impliedFormat":1},{"version":"005319c82222e57934c7b211013eb6931829e46b2a61c5d9a1c3c25f8dc3ea90","impliedFormat":1},{"version":"151f422f08c8ca67b77c5c39d49278b4df452ef409237c8219be109ae3cdae9d","impliedFormat":1},{"version":"6466cbb0aa561e1c1a87850a1f066692f1692a0a9513c508a3886cd66a62dae8","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d1d31f1786b80ab882f0844f2c99767f6f0c6538e94a4292775e8e741c6a802","impliedFormat":1},{"version":"4fed47227c29f71b82b4d21a9448e15492cdcc8b0858db30220178f05bbbeaa5","signature":"2a9464ab1154680f9a45713ad52ee914229ef5a0100cd8a7dc41e9c8dc8563c3","impliedFormat":1},{"version":"bb5cfe79e5f80bd06b0cb8d75274f7710ccb0ba269d35ab06c45dad7bf50a450","signature":"9f2c77b3670856f0be5fd1a504cbc163606ceed481860513eca72634b32d3c7d","impliedFormat":1},{"version":"c01cfa0f58e00bf8da8d4c5735784e1f181d5400a4ac81eedb7945788c0f0202","signature":"66b9118e963c55e4311125a3312c9d946106d43d9def22ed3f41bd52462a4c80","impliedFormat":1},{"version":"b411b5e0d027fad8b10c853e0bca6deb5c853c33434ba036b4b1c1aeed40cd14","signature":"74059c61aa14513a42afb684f2f27e698094baa9895f8e4b04a65b94375f5c40","impliedFormat":1},{"version":"fe5ee97529518a08f57ed224e67bfa96301e005bd08b5a5417344fcff97b3ac0","signature":"d728c1eb02f8384410cf59b5698c2d9f52c7ad655e839d6dbb1f1ad64877cadf","impliedFormat":1},{"version":"be7661a81fd349aa2baf5a7c29d0bd983a83ad685f4aa39c78dbc792c75e2ed9","signature":"8158a29454ce0c7ddb8bd1e17062ce64f9c6d2fa4d8c844ade50a4189da2b05d","impliedFormat":1},{"version":"083095f34bdcebdab08299946c14711451b411c27fce43b36c581c7872320281","signature":"79119a0b05f41118afb2d66ae50d7a36a4df53e9ea25d545ad008513afe7e510","impliedFormat":1},{"version":"9af86084a8ebbdad91aaae097e5a8a7da9fa391af3b5c23a92792d99e76f4677","signature":"d1ebadbf2f41d122d2910386bdc3e6080bce2b5d9707eb827acfc2736f2d911a","impliedFormat":1},{"version":"d66a64bd5ba6d512d47ccc0074cf9db23d7ea162de0739e8fcf77f0aeea37f3f","signature":"510cee1c8ec65773a4b4f970a8b04848bca6d2bfb4673fda9e7fe79cf669215c","impliedFormat":1},{"version":"f4f0f246a8a08617301f3b78229759623855253757b7b83f87447f2607a9e411","signature":"2b3d74e32bb0bd3cd9965f28ba76e5b6587232bf5dbe440f0363231849e42a93","impliedFormat":1},{"version":"c6c8073aa43181b3fb62e1db3462a8ed7d69980f44fb3ef805dc5d76114a443d","signature":"d160d34450c71d714ba809b84ab233881c3cbd582f2c129f8d7e20de2ea2e830","impliedFormat":1},{"version":"3561dd3bf6bb6e1afac607f92542b34e00203dd62a283d60f33c358b875de50f","signature":"b064caa285e15d91ac315e46f7a970940452b4a8f1c071736ca18a48faa98348","impliedFormat":1},{"version":"1bf3e9968191c32ae06a3d7bfd42555330950550c7319ac62d589da1c80e7e9f","signature":"7214a8af60b4039a192bf3460cf48b16c27272aed494e16c8fb375cbcab8a669","impliedFormat":1},{"version":"486302e6935a1024c28a1e21c4c2c6780bb32f24738b2e7ae576bf3515be21ec","signature":"d45382d88b9f313315c4693a3aceb2d137db236ed435726ccc3cb5f4f95fb696","impliedFormat":1},{"version":"98e00c2a3eab378b7026c6e83b0c8f89cffdec8bf39b96db5994951f457c9c84","signature":"ef963a484a85f604c7e9a105f7e53e6176e1d5cdb5d50c69b15188fa94b7ac07","impliedFormat":1},{"version":"a433d0f67aad0528586fb70ffd3a412221a98867fca8dc3df6eabcafbd2c1bd8","signature":"f5d48ed660a093a592fb4d6711e62cacc74112af8ef529921da1d69850cb7246","impliedFormat":1},{"version":"3944301fc3fecdfa3419d986f5e70a1ed82ddb44916072e076e42008877d66eb","signature":"ed66b549cf33c8068d2d68f0e3cb42eb5476e55fcc730fb0d4853e22df31355b","impliedFormat":1},{"version":"69202e2cda90a7dcf9eeb0ca62dec22f92acf669076829b44b627625c05830db","signature":"6d19e497dbbd0db80757a13d2ed759939d8f651a1d063570bc21359319f375b1","impliedFormat":1},{"version":"d4495febc498e1b9ebb71d5bec3120c93fc3971244b4a6a52da7b3006356aa39","signature":"8660e950fd61b3f60ae718284fef7d215011ed9d19ddf110ab688b9a69fc5e64","impliedFormat":1},{"version":"49c886c9ab3bedd4456c156d8d7b2cc02a167a1cb70a590a026f6ba54ebd2236","signature":"5ade073342145585fc0e64759dfcec8d0289e94abc75d2fb333522956c4f5a4b","impliedFormat":1},{"version":"9e2125dd17fd8f9b4546de01a8b30d8b45e8755a2461982c99e1638350f76a82","signature":"68e069b7ef4d7fad012b2aab487ccd1ab728fadc06240683ce520642a7961451","impliedFormat":1}],"root":[[152,172]],"options":{"allowSyntheticDefaultImports":true,"declaration":true,"declarationMap":true,"emitDecoratorMetadata":true,"esModuleInterop":true,"experimentalDecorators":true,"jsx":1,"module":199,"noImplicitAny":true,"noImplicitThis":true,"noUncheckedIndexedAccess":false,"outDir":"./dist","rootDir":"./src","skipDefaultLibCheck":false,"sourceMap":true,"strict":true,"strictNullChecks":true,"strictPropertyInitialization":true,"target":8,"useUnknownInCatchVariables":true},"referencedMap":[[77,1],[78,2],[53,3],[57,4],[87,5],[83,6],[90,7],[94,8],[96,9],[97,10],[116,11],[99,12],[101,13],[103,14],[104,15],[105,16],[71,16],[106,17],[72,18],[107,19],[108,10],[109,20],[110,21],[68,22],[113,23],[115,24],[114,25],[112,26],[73,17],[69,27],[70,28],[100,29],[92,29],[93,30],[76,31],[119,29],[120,32],[122,13],[79,33],[81,34],[124,35],[129,36],[80,37],[131,37],[132,38],[133,39],[135,40],[137,40],[136,40],[85,41],[84,42],[86,40],[82,43],[139,44],[66,38],[140,8],[141,8],[142,45],[143,29],[147,37],[150,46],[59,47],[60,48],[149,47],[67,27],[65,37],[172,49],[159,50],[169,51],[158,52],[170,47],[155,53],[160,54],[166,55],[152,56],[164,57],[161,58],[167,57],[156,59],[168,57],[157,47],[171,60],[165,54],[163,54],[162,61]],"version":"5.6.3"} \ No newline at end of file From 1299c190e2e96cfc6090ac62531a922f5285b5fb Mon Sep 17 00:00:00 2001 From: Joshua Tag Howard Date: Mon, 28 Oct 2024 21:39:10 +0000 Subject: [PATCH 5/8] Update .gitignore and package.json --- .gitignore | 3 ++- package.json | 50 +++++++++++++++++++++++++------------------- tsconfig.json | 2 +- tsconfig.tsbuildinfo | 1 - 4 files changed, 32 insertions(+), 24 deletions(-) delete mode 100644 tsconfig.tsbuildinfo diff --git a/.gitignore b/.gitignore index e1e826b7..68b7c6f6 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ package-lock.json yarn-error.log yarn.lock .eslintcache -/dist \ No newline at end of file +/dist +tsconfig.tsbuildinfo \ No newline at end of file diff --git a/package.json b/package.json index 0549e4fe..35c039b7 100644 --- a/package.json +++ b/package.json @@ -1,22 +1,7 @@ { "name": "@ukdanceblue/react-native-markdown-display", - "description": "Markdown renderer for react-native, with CommonMark spec support + adds syntax extensions & sugar (URL autolinking, typographer), originally created by Mient-jan Stelling as react-native-markdown-renderer", - "main": "src/index.js", - "types": "src/index.d.ts", "version": "0.1.0", - "scripts": { - "build": "tsc", - "watch": "tsc -w", - "lint": "eslint .", - "lint-fix": "eslint . --fix", - "format": "prettier . --check", - "format-fix": "prettier . --write", - "check": "npm run lint && npm run format && npm run build -- --noEmit" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/ukdanceblue/react-native-markdown-display.git" - }, + "description": "Markdown renderer for react-native, with CommonMark spec support + adds syntax extensions & sugar (URL autolinking, typographer), originally created by Mient-jan Stelling as react-native-markdown-renderer", "keywords": [ "react", "react-native", @@ -25,16 +10,35 @@ "commonmark", "markdown-it" ], - "author": "Mient-jan Stelling and Tom Pickard + others from the community, ported to TypeScript by Tag Howard", + "repository": { + "type": "git", + "url": "git+https://github.com/ukdanceblue/react-native-markdown-display.git" + }, "license": "MIT", + "author": "Mient-jan Stelling and Tom Pickard + others from the community, ported to TypeScript by Tag Howard", + "type": "module", + "exports": { + ".": { + "react-native": "./dist/index.js", + "default": "./dist/index.js", + "types": "./dist/index.d.ts" + } + }, + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "build": "tsc", + "check": "npm run lint && npm run format && npm run build -- --noEmit", + "format": "prettier . --check", + "format-fix": "prettier . --write", + "lint": "eslint .", + "lint-fix": "eslint . --fix", + "watch": "tsc -w" + }, "dependencies": { "css-to-react-native": "^3.2.0", "markdown-it": "^14.1.0" }, - "peerDependencies": { - "react": ">=18.0.0", - "react-native": ">=0.76.0" - }, "devDependencies": { "@eslint/js": "^9.13.0", "@types/eslint__js": "^8.42.3", @@ -45,5 +49,9 @@ "react-native": "^0.76.0", "typescript": "^5.6.3", "typescript-eslint": "^8.12.0" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-native": ">=0.76.0" } } diff --git a/tsconfig.json b/tsconfig.json index 49844674..44dfd82f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,7 +15,7 @@ "ES2021", "ES2022.Error" ] /* Specify a set of bundled library declaration files that describe the target runtime environment. */, - "jsx": "preserve" /* Specify what JSX code is generated. */, + "jsx": "react-native" /* Specify what JSX code is generated. */, "experimentalDecorators": true /* Enable experimental support for TC39 stage 2 draft decorators. */, "emitDecoratorMetadata": true /* Emit design-type metadata for decorated declarations in source files. */, // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo deleted file mode 100644 index 0100964e..00000000 --- a/tsconfig.tsbuildinfo +++ /dev/null @@ -1 +0,0 @@ -{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/@types/linkify-it/build/index.cjs.d.ts","./node_modules/@types/mdurl/build/index.cjs.d.ts","./node_modules/@types/markdown-it/dist/index.cjs.d.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/prop-types/index.d.ts","./node_modules/@types/react/index.d.ts","./node_modules/react-native/types/modules/BatchedBridge.d.ts","./node_modules/react-native/types/modules/Codegen.d.ts","./node_modules/react-native/types/modules/Devtools.d.ts","./node_modules/react-native/types/modules/globals.d.ts","./node_modules/react-native/types/modules/LaunchScreen.d.ts","./node_modules/react-native/types/private/Utilities.d.ts","./node_modules/react-native/types/public/Insets.d.ts","./node_modules/react-native/types/public/ReactNativeTypes.d.ts","./node_modules/react-native/Libraries/Types/CoreEventTypes.d.ts","./node_modules/react-native/types/public/ReactNativeRenderer.d.ts","./node_modules/react-native/Libraries/Components/Touchable/Touchable.d.ts","./node_modules/react-native/Libraries/Components/View/ViewAccessibility.d.ts","./node_modules/react-native/Libraries/Components/View/ViewPropTypes.d.ts","./node_modules/react-native/Libraries/Components/RefreshControl/RefreshControl.d.ts","./node_modules/react-native/Libraries/Components/ScrollView/ScrollView.d.ts","./node_modules/react-native/Libraries/Components/View/View.d.ts","./node_modules/react-native/Libraries/Image/ImageResizeMode.d.ts","./node_modules/react-native/Libraries/Image/ImageSource.d.ts","./node_modules/react-native/Libraries/Image/Image.d.ts","./node_modules/@react-native/virtualized-lists/Lists/VirtualizedList.d.ts","./node_modules/@react-native/virtualized-lists/index.d.ts","./node_modules/react-native/Libraries/Lists/FlatList.d.ts","./node_modules/react-native/Libraries/ReactNative/RendererProxy.d.ts","./node_modules/react-native/Libraries/Lists/SectionList.d.ts","./node_modules/react-native/Libraries/Text/Text.d.ts","./node_modules/react-native/Libraries/Animated/Animated.d.ts","./node_modules/react-native/Libraries/StyleSheet/StyleSheetTypes.d.ts","./node_modules/react-native/Libraries/StyleSheet/StyleSheet.d.ts","./node_modules/react-native/Libraries/StyleSheet/processColor.d.ts","./node_modules/react-native/Libraries/ActionSheetIOS/ActionSheetIOS.d.ts","./node_modules/react-native/Libraries/Alert/Alert.d.ts","./node_modules/react-native/Libraries/Animated/Easing.d.ts","./node_modules/react-native/Libraries/Animated/useAnimatedValue.d.ts","./node_modules/react-native/Libraries/vendor/emitter/EventEmitter.d.ts","./node_modules/react-native/Libraries/EventEmitter/RCTDeviceEventEmitter.d.ts","./node_modules/react-native/Libraries/EventEmitter/RCTNativeAppEventEmitter.d.ts","./node_modules/react-native/Libraries/AppState/AppState.d.ts","./node_modules/react-native/Libraries/BatchedBridge/NativeModules.d.ts","./node_modules/react-native/Libraries/Components/AccessibilityInfo/AccessibilityInfo.d.ts","./node_modules/react-native/Libraries/Components/ActivityIndicator/ActivityIndicator.d.ts","./node_modules/react-native/Libraries/Components/Clipboard/Clipboard.d.ts","./node_modules/react-native/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.d.ts","./node_modules/react-native/Libraries/EventEmitter/NativeEventEmitter.d.ts","./node_modules/react-native/Libraries/Components/Keyboard/Keyboard.d.ts","./node_modules/react-native/types/private/TimerMixin.d.ts","./node_modules/react-native/Libraries/Components/Keyboard/KeyboardAvoidingView.d.ts","./node_modules/react-native/Libraries/Components/Pressable/Pressable.d.ts","./node_modules/react-native/Libraries/Components/ProgressBarAndroid/ProgressBarAndroid.d.ts","./node_modules/react-native/Libraries/Components/SafeAreaView/SafeAreaView.d.ts","./node_modules/react-native/Libraries/Components/StatusBar/StatusBar.d.ts","./node_modules/react-native/Libraries/Components/Switch/Switch.d.ts","./node_modules/react-native/Libraries/Components/TextInput/InputAccessoryView.d.ts","./node_modules/react-native/Libraries/Components/TextInput/TextInput.d.ts","./node_modules/react-native/Libraries/Components/ToastAndroid/ToastAndroid.d.ts","./node_modules/react-native/Libraries/Components/Touchable/TouchableWithoutFeedback.d.ts","./node_modules/react-native/Libraries/Components/Touchable/TouchableHighlight.d.ts","./node_modules/react-native/Libraries/Components/Touchable/TouchableOpacity.d.ts","./node_modules/react-native/Libraries/Components/Touchable/TouchableNativeFeedback.d.ts","./node_modules/react-native/Libraries/Components/Button.d.ts","./node_modules/react-native/Libraries/Core/registerCallableModule.d.ts","./node_modules/react-native/Libraries/DevToolsSettings/DevToolsSettingsManager.d.ts","./node_modules/react-native/Libraries/Interaction/InteractionManager.d.ts","./node_modules/react-native/Libraries/Interaction/PanResponder.d.ts","./node_modules/react-native/Libraries/LayoutAnimation/LayoutAnimation.d.ts","./node_modules/react-native/Libraries/Linking/Linking.d.ts","./node_modules/react-native/Libraries/LogBox/LogBox.d.ts","./node_modules/react-native/Libraries/Modal/Modal.d.ts","./node_modules/react-native/Libraries/Performance/Systrace.d.ts","./node_modules/react-native/Libraries/PermissionsAndroid/PermissionsAndroid.d.ts","./node_modules/react-native/Libraries/PushNotificationIOS/PushNotificationIOS.d.ts","./node_modules/react-native/Libraries/Utilities/IPerformanceLogger.d.ts","./node_modules/react-native/Libraries/ReactNative/AppRegistry.d.ts","./node_modules/react-native/Libraries/ReactNative/I18nManager.d.ts","./node_modules/react-native/Libraries/ReactNative/RootTag.d.ts","./node_modules/react-native/Libraries/ReactNative/UIManager.d.ts","./node_modules/react-native/Libraries/ReactNative/requireNativeComponent.d.ts","./node_modules/react-native/Libraries/Settings/Settings.d.ts","./node_modules/react-native/Libraries/Share/Share.d.ts","./node_modules/react-native/Libraries/StyleSheet/PlatformColorValueTypesIOS.d.ts","./node_modules/react-native/Libraries/StyleSheet/PlatformColorValueTypes.d.ts","./node_modules/react-native/Libraries/TurboModule/RCTExport.d.ts","./node_modules/react-native/Libraries/TurboModule/TurboModuleRegistry.d.ts","./node_modules/react-native/Libraries/Utilities/Appearance.d.ts","./node_modules/react-native/Libraries/Utilities/BackHandler.d.ts","./node_modules/react-native/Libraries/Utilities/DevSettings.d.ts","./node_modules/react-native/Libraries/Utilities/Dimensions.d.ts","./node_modules/react-native/Libraries/Utilities/PixelRatio.d.ts","./node_modules/react-native/Libraries/Utilities/Platform.d.ts","./node_modules/react-native/Libraries/Vibration/Vibration.d.ts","./node_modules/react-native/Libraries/YellowBox/YellowBoxDeprecated.d.ts","./node_modules/react-native/Libraries/vendor/core/ErrorUtils.d.ts","./node_modules/react-native/types/public/DeprecatedPropertiesAlias.d.ts","./node_modules/react-native/types/index.d.ts","./node_modules/css-to-react-native/index.d.ts","./src/lib/util/convertAdditionalStyles.ts","./src/lib/util/getUniqueID.ts","./src/lib/data/textStyleProps.ts","./src/lib/types.ts","./src/lib/util/hasParents.ts","./src/lib/util/openUrl.ts","./src/lib/renderRules.tsx","./src/lib/AstRenderer.ts","./src/lib/util/Token.ts","./src/lib/util/getTokenTypeByToken.ts","./src/lib/util/tokensToAST.ts","./src/lib/util/stringToTokens.ts","./src/lib/util/flattenInlineTokens.ts","./src/lib/util/renderInlineAsText.ts","./src/lib/util/cleanupTokens.ts","./src/lib/util/groupTextTokens.ts","./src/lib/util/omitListItemParagraph.ts","./src/lib/parser.ts","./src/lib/styles.ts","./src/lib/util/removeTextStyleProps.ts","./src/index.tsx"],"fileIdsList":[[57,150],[77],[51,52],[54,55,56],[85,86],[57,66,72,73,76,79,81,82,85],[83],[93],[57,65,91],[57,63,65,66,70,84,85],[57,85,114,115],[57,63,65,66,70,85],[91,100],[57,63,70,84,85,102],[57,64,66,69,70,73,84,85],[57,63,65,70,85],[57,63,65,70],[57,63,64,66,68,70,71,84,85],[57,85],[57,84,85],[57,63,65,66,69,70,84,85,91,102],[57,64,66],[57,73,84,85,112],[57,63,68,85,112,114],[57,73,112],[57,63,64,66,68,69,84,85,102],[66],[57,64,66,67,68,69,84,85],[91],[92],[57,63,64,65,66,69,74,75,84,85],[66,67],[57,72,73,78,84,85],[57,72,78,80,84,85],[57,66,70],[57,84,128],[57],[57,65],[65],[85],[84],[74,83,85],[57,63,65,66,69,84,85],[138],[100],[58,59,60,61,62,64,65,66,67,68,69,70,71,72,73,74,75,76,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149],[150],[60],[53,57,150,153,154,155,156,157,158,159,162,163,169,170,171],[57,150,152,153,154,155,158],[53,57,155,160,162,163,166,167,168],[57,150,154,155,156,157],[158],[53],[53,160,161,164,165],[151],[53,160],[53,158,160],[155],[150,154],[53,153,155,160,161]],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"45d8ccb3dfd57355eb29749919142d4321a0aa4df6acdfc54e30433d7176600a","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1a94697425a99354df73d9c8291e2ecd4dddd370aed4023c2d6dee6cccb32666","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3f9fc0ec0b96a9e642f11eda09c0be83a61c7b336977f8b9fdb1e9788e925fe","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3d7b04b45033f57351c8434f60b6be1ea71a2dfec2d0a0c3c83badbb0e3e693","affectsGlobalScope":true,"impliedFormat":1},{"version":"956d27abdea9652e8368ce029bb1e0b9174e9678a273529f426df4b3d90abd60","affectsGlobalScope":true,"impliedFormat":1},{"version":"e6633e05da3ff36e6da2ec170d0d03ccf33de50ca4dc6f5aeecb572cedd162fb","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"742f21debb3937c3839a63245648238555bdab1ea095d43fd10c88a64029bf76","impliedFormat":1},{"version":"0944f27ebff4b20646b71e7e3faaaae50a6debd40bc63e225de1320dd15c5795","impliedFormat":1},{"version":"8a7219b41d3c1c93f3f3b779146f313efade2404eeece88dcd366df7e2364977","impliedFormat":1},{"version":"36a2e4c9a67439aca5f91bb304611d5ae6e20d420503e96c230cf8fcdc948d94","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"ed6b820c54de95b2510bb673490d61c7f2187f532a339d8d04981645a918961f","impliedFormat":1},{"version":"aa17748c522bd586f8712b1a308ea23af59c309b2fd278f6d4f406647c72e659","affectsGlobalScope":true,"impliedFormat":1},{"version":"3a909e8789a4f8b5377ef3fb8dc10d0c0a090c03f2e40aab599534727457475a","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b47c8df863142d9383f948c987e1ebd25ade3867aeb4ae60e9d6009035dfe46","impliedFormat":1},{"version":"b8dd45aa6e099a5f564edcabfe8114096b096eb1ffaa343dd6f3fe73f1a6e85e","impliedFormat":1},{"version":"38e8ac2d182bd3f85d28de9bdf1386c19a319f9c0280aa43960204c353b07878","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc4db28f3510994e45bbabba1ee33e9a0d27dab33d4c8a5844cee8c85438a058","impliedFormat":1},{"version":"232f660363b3b189f7be7822ed71e907195d1a85bc8d55d2b7ce3f09b2136938","impliedFormat":1},{"version":"e745388cfad9efb4e5a9a15a2c6b66d54094dd82f8d0c2551064e216f7b51526","impliedFormat":1},{"version":"53390c21d095fb54e6c0b8351cbf7f4008f096ade9717bc5ee75e340bc3dfa30","impliedFormat":1},{"version":"71493b2c538dffa1e3e968b55b70984b542cc6e488012850865f72768ff32630","impliedFormat":1},{"version":"8ebf448e9837fda1a368acbb575b0e28843d5b2a3fda04bce76248b64326ea49","impliedFormat":1},{"version":"91b9f6241fca7843985aa31157cfa08cc724c77d91145a4d834d27cdde099c05","impliedFormat":1},{"version":"8b94ac8c460c9a2578ca3308fecfcf034e21af89e9c287c97710e9717ffae133","impliedFormat":1},{"version":"a7266bcc42f8ec0f31f319c2dd8100411b4d7b8a534235cb00a719f1c8a2a42e","impliedFormat":1},{"version":"3dfa3a6f2a62259b56fa7bcebfbacf886848dfa037298be5bed07c7a0381ee4f","impliedFormat":1},{"version":"a1e3cda52746919d2a95784ce0b1b9ffa22052209aab5f54e079e7b920f5339e","impliedFormat":1},{"version":"1882680f8c88c5648d603408dd1943857ca831a815e33d3126be8368f7a69252","impliedFormat":1},{"version":"f387a979388291b2688ba0f604e3ae78874f5f777616b448d34109762a4f05a9","impliedFormat":1},{"version":"cae0fb826d8a88749189b8a924dfcb5d3ad629e3bc5ec934195fbd83fa48b068","impliedFormat":1},{"version":"376b8482d1224aa83f4521590672304e30ba847d0b87b9e1a62b2e60a5c788f2","impliedFormat":1},{"version":"488242948cc48ee6413a159c60bcaf70de15db01364741737a962662f1a127a5","impliedFormat":1},{"version":"42bacb33cddecbcfe3e043ee1117ba848801749e44f947626765b3e0aec74b1c","impliedFormat":1},{"version":"b326790c20287ad266b5fcd0c388e2a83320a24747856727dcb70c7bbd489dfc","impliedFormat":1},{"version":"cd2156bc8e4d54d52a2817d1b6f4629a5dd3173b1d8bb0fc893ee678d6a78ecd","impliedFormat":1},{"version":"60526d9010e8ccb2a76a59821061463464c3acd5bc7a50320df6d2e4e0d6e4f7","impliedFormat":1},{"version":"562cce1c8e14e8d5a55d1931cb1848b1df49cc7b1024356d56f3550ed57ad67f","impliedFormat":1},{"version":"623fa4efc706bb9956d0ae94b13321c6617655bf8ebdb270c9792bb398f82e44","impliedFormat":1},{"version":"f20c96192f5841cbf982d2c1989c1e9fdef41c4a9db7543edff131007bf1dbfb","impliedFormat":1},{"version":"79d6871ce0da76f4c865a58daa509d5c8a10545d510b804501daa5d0626e7028","impliedFormat":1},{"version":"9054417b5760061bc5fe31f9eee5dc9bf018339b0617d3c65dd1673c8e3c0f25","impliedFormat":1},{"version":"442856ad0787bc213f659e134c204ad0d502179aa216bf700faefb5572208358","impliedFormat":1},{"version":"443702ca8101ef0adc827c2cc530ca93cf98d41e36ce4399efb9bc833ad9cb62","impliedFormat":1},{"version":"c94f70562ae60797cce564c3bebbaaf1752c327d5063d6ac152aa5ca1616c267","impliedFormat":1},{"version":"2aeb5fcdfc884b16015617d263fd8d1a8513f7efe23880be4e5f0bdb3794b37c","impliedFormat":1},{"version":"fd412dd6372493eb8e3e95cae8687d35e4d34dde905a33e0ee47b74224cdd6ab","impliedFormat":1},{"version":"b561170fbe8d4292425e1dfa52406c8d97575681f7a5e420d11d9f72f7c29e38","impliedFormat":1},{"version":"5fe94f3f6411a0f6293f16fdc8e02ee61138941847ce91d6f6800c97fac22fcd","impliedFormat":1},{"version":"7f7c0ecc3eeeef905a3678e540947f4fbbc1a9c76075419dcc5fbfc3df59cb0b","impliedFormat":1},{"version":"df3303018d45c92be73fb4a282d5a242579f96235f5e0f8981983102caf5feca","impliedFormat":1},{"version":"35db266b474b3b9dfd0bc7d25dff3926cc227de45394262f3783b8b174182a16","impliedFormat":1},{"version":"8205e62a7310ac0513747f6d84175400680cff372559bc5fbe2df707194a295d","impliedFormat":1},{"version":"084d0df6805570b6dc6c8b49c3a71d5bdfe59606901e0026c63945b68d4b080a","impliedFormat":1},{"version":"8387fa3287992c71702756fe6ecea68e2f8f2c5aa434493e3afe4817dd4a4787","impliedFormat":1},{"version":"0f066f9654e700a9cf79c75553c934eb14296aa80583bd2b5d07e2d582a3f4ee","impliedFormat":1},{"version":"269c5d54104033b70331343bd931c9933852a882391ed6bd98c3d8b7d6465d22","impliedFormat":1},{"version":"a56b8577aaf471d9e60582065a8193269310e8cae48c1ce4111ed03216f5f715","impliedFormat":1},{"version":"486ae83cd51b813095f6716f06cc9b2cf480ad1d6c7f8ec59674d6c858cd2407","impliedFormat":1},{"version":"fff527e2567a24dd634a30268f1aa8a220315fed9c513d70ee872e54f67f27f3","impliedFormat":1},{"version":"5dd0ff735b3f2e642c3f16bcfb3dc4ecebb679a70e43cfb19ab5fd84d8faaeed","impliedFormat":1},{"version":"d1d78d1ef0f21ac77cdc436d2a4d56592453a8a2e51af2040ec9a69a5d35e4de","impliedFormat":1},{"version":"bc55b91274e43f88030c9cfe2c4217fae57894c3c302173ab6e9743c29484e3d","impliedFormat":1},{"version":"8bb22f70bfd7bf186631fa565c9202ee6a1009ffb961197b7d092b5a1e1d56b1","impliedFormat":1},{"version":"77282216c61bcef9a700db98e142301d5a7d988d3076286029da63e415e98a42","impliedFormat":1},{"version":"6c28f4f95aaa6c3c8b1a0681c29f446b0bf0ed1aa5aa11e8b2ca6fc9e066e9f2","impliedFormat":1},{"version":"64ce8e260a1362d4cadd6c753581a912a9869d4a53ec6e733dc61018f9250f5d","impliedFormat":1},{"version":"85a915dbb768b89cb92f5e6c165d776bfebd065883c34fee4e0219c3ed321b47","impliedFormat":1},{"version":"83df2f39cb14971adea51d1c84e7d146a34e9b7f84ad118450a51bdc3138412c","impliedFormat":1},{"version":"b96364fcb0c9d521e7618346b00acf3fe16ccf9368404ceac1658edee7b6332c","impliedFormat":1},{"version":"bdb2b70c74908c92ec41d8dd8375a195cb3bb07523e4de642b2b2dfbde249ca6","impliedFormat":1},{"version":"7b329f4137a552073f504022acbf8cd90d49cc5e5529791bef508f76ff774854","impliedFormat":1},{"version":"f63bbbffcfc897d22f34cf19ae13405cd267b1783cd21ec47d8a2d02947c98c1","impliedFormat":1},{"version":"7889f4932dfa7b1126cdc17914d85d80b5860cc3d62ba329494007e8aab45430","impliedFormat":1},{"version":"d9725ef7f60a791668f7fb808eb90b1789feaaef989a686fefc0f7546a51dcdc","impliedFormat":1},{"version":"df55b9be6ba19a6f77487e09dc7a94d7c9bf66094d35ea168dbd4bac42c46b8f","impliedFormat":1},{"version":"595125f3e088b883d104622ef10e6b7d5875ff6976bbe4d7dca090a3e2dca513","impliedFormat":1},{"version":"8ebb6f0603bf481e893311c49e4d2e2061413c51b9ba5898cd9b0a01f5ef19c8","impliedFormat":1},{"version":"e0d7eed4ba363df3faadb8e617f95f9fc8adfbb00b87db7ade4a1098d6cf1e90","impliedFormat":1},{"version":"38faab59a79924ce5eb4f2f3e7e7db91e74d425b4183f908cc014be213f0d971","impliedFormat":1},{"version":"de115595321ce012c456f512a799679bfc874f0ac0a4928a8429557bb25086aa","impliedFormat":1},{"version":"cdca67bd898deff48e3acb05fb44500b5ebce16c26a8ec99dee1522cf9879795","impliedFormat":1},{"version":"0524cab11ba9048d151d93cc666d3908fda329eec6b1642e9a936093e6d79f28","impliedFormat":1},{"version":"869073d7523e75f45bd65b2072865c60002d5e0cbd3d17831e999cf011312778","impliedFormat":1},{"version":"bc7b5906a6ce6c5744a640c314e020856be6c50a693e77dc12aff2d77b12ca76","impliedFormat":1},{"version":"56503e377bc1344f155e4e3115a772cb4e59350c0b8131e3e1fb2750ac491608","impliedFormat":1},{"version":"6b579287217ee1320ee1c6cfec5f6730f3a1f91daab000f7131558ee531b2bf8","impliedFormat":1},{"version":"e2ddb2877f5a841866f4fc772a601b58e90ac8399b35f9a06535be81b8e08b47","impliedFormat":1},{"version":"a793636667598e739a52684033037a67dc2d9db37fab727623626ef19aa5abb9","impliedFormat":1},{"version":"b15d6238a86bc0fc2368da429249b96c260debc0cec3eb7b5f838ad32587c129","impliedFormat":1},{"version":"9a9fba3a20769b0a74923e7032997451b61c1bd371c519429b29019399040d74","impliedFormat":1},{"version":"4b10e2fe52cb61035e58df3f1fdd926dd0fe9cf1a2302f92916da324332fb4e0","impliedFormat":1},{"version":"d1092ae8d6017f359f4758115f588e089848cc8fb359f7ba045b1a1cf3668a49","impliedFormat":1},{"version":"ddae9195b0da7b25a585ef43365f4dc5204a746b155fbee71e6ee1a9193fb69f","impliedFormat":1},{"version":"32dbced998ce74c5e76ce87044d0b4071857576dde36b0c6ed1d5957ce9cf5b5","impliedFormat":1},{"version":"5bc29a9918feba88816b71e32960cf11243b77b76630e9e87cad961e5e1d31d0","impliedFormat":1},{"version":"341ffa358628577f490f128f3880c01d50ef31412d1be012bb1cd959b0a383ea","impliedFormat":1},{"version":"ecc1b8878c8033bde0204b85e26fe1af6847805427759e5723882c848a11e134","impliedFormat":1},{"version":"cfc9c32553ad3b5be38342bc8731397438a93531118e1a226a8c79ad255b4f0c","impliedFormat":1},{"version":"16e5b5b023c2a1119c1878a51714861c56255778de0a7fe378391876a15f7433","impliedFormat":1},{"version":"52e8612d284467b4417143ca8fe54d30145fdfc3815f5b5ea9b14b677f422be5","impliedFormat":1},{"version":"a090a8a3b0ef2cceeb089acf4df95df72e7d934215896afe264ff6f734d66d15","impliedFormat":1},{"version":"a0259c6054e3ed2c5fb705b6638e384446cbcdf7fd2072c659b43bd56e214b9a","impliedFormat":1},{"version":"005319c82222e57934c7b211013eb6931829e46b2a61c5d9a1c3c25f8dc3ea90","impliedFormat":1},{"version":"151f422f08c8ca67b77c5c39d49278b4df452ef409237c8219be109ae3cdae9d","impliedFormat":1},{"version":"6466cbb0aa561e1c1a87850a1f066692f1692a0a9513c508a3886cd66a62dae8","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d1d31f1786b80ab882f0844f2c99767f6f0c6538e94a4292775e8e741c6a802","impliedFormat":1},{"version":"4fed47227c29f71b82b4d21a9448e15492cdcc8b0858db30220178f05bbbeaa5","signature":"2a9464ab1154680f9a45713ad52ee914229ef5a0100cd8a7dc41e9c8dc8563c3","impliedFormat":1},{"version":"bb5cfe79e5f80bd06b0cb8d75274f7710ccb0ba269d35ab06c45dad7bf50a450","signature":"9f2c77b3670856f0be5fd1a504cbc163606ceed481860513eca72634b32d3c7d","impliedFormat":1},{"version":"c01cfa0f58e00bf8da8d4c5735784e1f181d5400a4ac81eedb7945788c0f0202","signature":"66b9118e963c55e4311125a3312c9d946106d43d9def22ed3f41bd52462a4c80","impliedFormat":1},{"version":"b411b5e0d027fad8b10c853e0bca6deb5c853c33434ba036b4b1c1aeed40cd14","signature":"74059c61aa14513a42afb684f2f27e698094baa9895f8e4b04a65b94375f5c40","impliedFormat":1},{"version":"fe5ee97529518a08f57ed224e67bfa96301e005bd08b5a5417344fcff97b3ac0","signature":"d728c1eb02f8384410cf59b5698c2d9f52c7ad655e839d6dbb1f1ad64877cadf","impliedFormat":1},{"version":"be7661a81fd349aa2baf5a7c29d0bd983a83ad685f4aa39c78dbc792c75e2ed9","signature":"8158a29454ce0c7ddb8bd1e17062ce64f9c6d2fa4d8c844ade50a4189da2b05d","impliedFormat":1},{"version":"083095f34bdcebdab08299946c14711451b411c27fce43b36c581c7872320281","signature":"79119a0b05f41118afb2d66ae50d7a36a4df53e9ea25d545ad008513afe7e510","impliedFormat":1},{"version":"9af86084a8ebbdad91aaae097e5a8a7da9fa391af3b5c23a92792d99e76f4677","signature":"d1ebadbf2f41d122d2910386bdc3e6080bce2b5d9707eb827acfc2736f2d911a","impliedFormat":1},{"version":"d66a64bd5ba6d512d47ccc0074cf9db23d7ea162de0739e8fcf77f0aeea37f3f","signature":"510cee1c8ec65773a4b4f970a8b04848bca6d2bfb4673fda9e7fe79cf669215c","impliedFormat":1},{"version":"f4f0f246a8a08617301f3b78229759623855253757b7b83f87447f2607a9e411","signature":"2b3d74e32bb0bd3cd9965f28ba76e5b6587232bf5dbe440f0363231849e42a93","impliedFormat":1},{"version":"c6c8073aa43181b3fb62e1db3462a8ed7d69980f44fb3ef805dc5d76114a443d","signature":"d160d34450c71d714ba809b84ab233881c3cbd582f2c129f8d7e20de2ea2e830","impliedFormat":1},{"version":"3561dd3bf6bb6e1afac607f92542b34e00203dd62a283d60f33c358b875de50f","signature":"b064caa285e15d91ac315e46f7a970940452b4a8f1c071736ca18a48faa98348","impliedFormat":1},{"version":"1bf3e9968191c32ae06a3d7bfd42555330950550c7319ac62d589da1c80e7e9f","signature":"7214a8af60b4039a192bf3460cf48b16c27272aed494e16c8fb375cbcab8a669","impliedFormat":1},{"version":"486302e6935a1024c28a1e21c4c2c6780bb32f24738b2e7ae576bf3515be21ec","signature":"d45382d88b9f313315c4693a3aceb2d137db236ed435726ccc3cb5f4f95fb696","impliedFormat":1},{"version":"98e00c2a3eab378b7026c6e83b0c8f89cffdec8bf39b96db5994951f457c9c84","signature":"ef963a484a85f604c7e9a105f7e53e6176e1d5cdb5d50c69b15188fa94b7ac07","impliedFormat":1},{"version":"a433d0f67aad0528586fb70ffd3a412221a98867fca8dc3df6eabcafbd2c1bd8","signature":"f5d48ed660a093a592fb4d6711e62cacc74112af8ef529921da1d69850cb7246","impliedFormat":1},{"version":"3944301fc3fecdfa3419d986f5e70a1ed82ddb44916072e076e42008877d66eb","signature":"ed66b549cf33c8068d2d68f0e3cb42eb5476e55fcc730fb0d4853e22df31355b","impliedFormat":1},{"version":"69202e2cda90a7dcf9eeb0ca62dec22f92acf669076829b44b627625c05830db","signature":"6d19e497dbbd0db80757a13d2ed759939d8f651a1d063570bc21359319f375b1","impliedFormat":1},{"version":"d4495febc498e1b9ebb71d5bec3120c93fc3971244b4a6a52da7b3006356aa39","signature":"8660e950fd61b3f60ae718284fef7d215011ed9d19ddf110ab688b9a69fc5e64","impliedFormat":1},{"version":"49c886c9ab3bedd4456c156d8d7b2cc02a167a1cb70a590a026f6ba54ebd2236","signature":"5ade073342145585fc0e64759dfcec8d0289e94abc75d2fb333522956c4f5a4b","impliedFormat":1},{"version":"9e2125dd17fd8f9b4546de01a8b30d8b45e8755a2461982c99e1638350f76a82","signature":"68e069b7ef4d7fad012b2aab487ccd1ab728fadc06240683ce520642a7961451","impliedFormat":1}],"root":[[152,172]],"options":{"allowSyntheticDefaultImports":true,"declaration":true,"declarationMap":true,"emitDecoratorMetadata":true,"esModuleInterop":true,"experimentalDecorators":true,"jsx":1,"module":199,"noImplicitAny":true,"noImplicitThis":true,"noUncheckedIndexedAccess":false,"outDir":"./dist","rootDir":"./src","skipDefaultLibCheck":false,"sourceMap":true,"strict":true,"strictNullChecks":true,"strictPropertyInitialization":true,"target":8,"useUnknownInCatchVariables":true},"referencedMap":[[77,1],[78,2],[53,3],[57,4],[87,5],[83,6],[90,7],[94,8],[96,9],[97,10],[116,11],[99,12],[101,13],[103,14],[104,15],[105,16],[71,16],[106,17],[72,18],[107,19],[108,10],[109,20],[110,21],[68,22],[113,23],[115,24],[114,25],[112,26],[73,17],[69,27],[70,28],[100,29],[92,29],[93,30],[76,31],[119,29],[120,32],[122,13],[79,33],[81,34],[124,35],[129,36],[80,37],[131,37],[132,38],[133,39],[135,40],[137,40],[136,40],[85,41],[84,42],[86,40],[82,43],[139,44],[66,38],[140,8],[141,8],[142,45],[143,29],[147,37],[150,46],[59,47],[60,48],[149,47],[67,27],[65,37],[172,49],[159,50],[169,51],[158,52],[170,47],[155,53],[160,54],[166,55],[152,56],[164,57],[161,58],[167,57],[156,59],[168,57],[157,47],[171,60],[165,54],[163,54],[162,61]],"version":"5.6.3"} \ No newline at end of file From db387091fd9cafe27c649b80252e979949908448 Mon Sep 17 00:00:00 2001 From: Joshua Tag Howard Date: Mon, 28 Oct 2024 21:53:07 +0000 Subject: [PATCH 6/8] Update dependencies and add TypeScript support --- README.md | 16 ++++----------- package.json | 3 ++- src/index.tsx | 56 ++++++++++++++++++++++++++------------------------- 3 files changed, 35 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index b58958a2..ef107361 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# React Native Markdown Display [![npm version](https://badge.fury.io/js/react-native-markdown-display.svg)](https://badge.fury.io/js/react-native-markdown-display) [![Known Vulnerabilities](https://snyk.io/test/github/iamacup/react-native-markdown-display/badge.svg)](https://snyk.io/test/github/iamacup/react-native-markdown-display) +# React Native Markdown Display It a 100% compatible CommonMark renderer, a react-native markdown renderer done right. This is **not** a web-view markdown renderer but a renderer that uses native components for all its elements. These components can be overwritten and styled as needed. @@ -16,16 +16,8 @@ This is intended to be a replacement for react-native-markdown-renderer, with a ### Install -#### Yarn - -```npm -yarn add react-native-markdown-display -``` - -#### NPM - -```npm -npm install -S react-native-markdown-display +```sh +npm install @ukdanceblue/react-native-markdown-display ``` ### Get Started @@ -34,7 +26,7 @@ npm install -S react-native-markdown-display import React from 'react'; import { SafeAreaView, ScrollView, StatusBar } from 'react-native'; -import Markdown from 'react-native-markdown-display'; +import Markdown from '@ukdanceblue/react-native-markdown-display'; const copy = `# h1 Heading 8-) diff --git a/package.json b/package.json index 35c039b7..422efd03 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ukdanceblue/react-native-markdown-display", - "version": "0.1.0", + "version": "0.1.1", "description": "Markdown renderer for react-native, with CommonMark spec support + adds syntax extensions & sugar (URL autolinking, typographer), originally created by Mient-jan Stelling as react-native-markdown-renderer", "keywords": [ "react", @@ -14,6 +14,7 @@ "type": "git", "url": "git+https://github.com/ukdanceblue/react-native-markdown-display.git" }, + "private": false, "license": "MIT", "author": "Mient-jan Stelling and Tom Pickard + others from the community, ported to TypeScript by Tag Howard", "type": "module", diff --git a/src/index.tsx b/src/index.tsx index 4aed590c..06e8a008 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,15 +1,15 @@ import MarkdownIt from "markdown-it"; -import type {ReactNode} from "react"; -import React, {useMemo} from "react"; -import type {TextStyle, ViewStyle} from "react-native"; -import {StyleSheet, Text} from "react-native"; +import type { ReactNode } from "react"; +import React, { useMemo } from "react"; +import type { TextStyle, ViewStyle } from "react-native"; +import { StyleSheet, Text } from "react-native"; import AstRenderer from "./lib/AstRenderer"; import parser from "./lib/parser"; -import type {RenderRules} from "./lib/renderRules"; +import type { RenderRules } from "./lib/renderRules"; import renderRules from "./lib/renderRules"; -import {styles} from "./lib/styles"; -import type {ASTNode} from "./lib/types"; +import { styles } from "./lib/styles"; +import type { ASTNode } from "./lib/types"; import removeTextStyleProps from "./lib/util/removeTextStyleProps"; function getStyle( @@ -127,10 +127,10 @@ export interface MarkdownProps { const Markdown: React.FC< MarkdownProps & { - maxTopLevelChildren: number | null; - topLevelMaxExceededItem: React.ReactNode; - allowedImageHandlers: string[]; - defaultImageHandler: string; + maxTopLevelChildren?: number | null; + topLevelMaxExceededItem?: React.ReactNode; + allowedImageHandlers?: string[]; + defaultImageHandler?: string; } > = React.memo( ({ @@ -155,10 +155,10 @@ const Markdown: React.FC< defaultImageHandler = "https://", debugPrintTree = false, }: MarkdownProps & { - maxTopLevelChildren: number | null; - topLevelMaxExceededItem: React.ReactNode; - allowedImageHandlers: string[]; - defaultImageHandler: string; + maxTopLevelChildren?: number | null; + topLevelMaxExceededItem?: React.ReactNode; + allowedImageHandlers?: string[]; + defaultImageHandler?: string; }) => { const momoizedRenderer = useMemo( () => @@ -200,15 +200,17 @@ const Markdown: React.FC< export default Markdown; -export {default as MarkdownIt} from "markdown-it"; -export {default as AstRenderer} from "./lib/AstRenderer"; -export {default as textStyleProps} from "./lib/data/textStyleProps"; -export {default as parser} from "./lib/parser"; -export {default as renderRules} from "./lib/renderRules"; -export {styles} from "./lib/styles"; -export {default as getUniqueID} from "./lib/util/getUniqueID"; -export {default as hasParents} from "./lib/util/hasParents"; -export {default as openUrl} from "./lib/util/openUrl"; -export {default as removeTextStyleProps} from "./lib/util/removeTextStyleProps"; -export {stringToTokens} from "./lib/util/stringToTokens"; -export {default as tokensToAST} from "./lib/util/tokensToAST"; +export { default as MarkdownIt } from "markdown-it"; +export { default as AstRenderer } from "./lib/AstRenderer"; +export { default as textStyleProps } from "./lib/data/textStyleProps"; +export { default as parser } from "./lib/parser"; +export { default as renderRules } from "./lib/renderRules"; +export { styles } from "./lib/styles"; +export type { ASTNode } from "./lib/types"; +export { default as getUniqueID } from "./lib/util/getUniqueID"; +export { default as hasParents } from "./lib/util/hasParents"; +export { default as openUrl } from "./lib/util/openUrl"; +export { default as removeTextStyleProps } from "./lib/util/removeTextStyleProps"; +export { stringToTokens } from "./lib/util/stringToTokens"; +export { default as tokensToAST } from "./lib/util/tokensToAST"; + From 2f9ac63ff4140481ff1a2eb621bb1847260877e7 Mon Sep 17 00:00:00 2001 From: Joshua Tag Howard Date: Mon, 28 Oct 2024 22:46:13 +0000 Subject: [PATCH 7/8] Add demo --- demo/.gitignore | 35 +++++ demo/App.tsx | 55 ++++++++ demo/app.json | 27 ++++ demo/assets/adaptive-icon.png | Bin 0 -> 17547 bytes demo/assets/favicon.png | Bin 0 -> 1466 bytes demo/assets/icon.png | Bin 0 -> 22380 bytes demo/assets/splash.png | Bin 0 -> 47346 bytes demo/babel.config.js | 6 + demo/package.json | 29 ++++ demo/sampleFiles.ts | 246 ++++++++++++++++++++++++++++++++++ demo/tsconfig.json | 6 + package.json | 4 +- tsconfig.json | 4 +- 13 files changed, 408 insertions(+), 4 deletions(-) create mode 100644 demo/.gitignore create mode 100644 demo/App.tsx create mode 100644 demo/app.json create mode 100644 demo/assets/adaptive-icon.png create mode 100644 demo/assets/favicon.png create mode 100644 demo/assets/icon.png create mode 100644 demo/assets/splash.png create mode 100644 demo/babel.config.js create mode 100644 demo/package.json create mode 100644 demo/sampleFiles.ts create mode 100644 demo/tsconfig.json diff --git a/demo/.gitignore b/demo/.gitignore new file mode 100644 index 00000000..05647d55 --- /dev/null +++ b/demo/.gitignore @@ -0,0 +1,35 @@ +# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files + +# dependencies +node_modules/ + +# Expo +.expo/ +dist/ +web-build/ + +# Native +*.orig.* +*.jks +*.p8 +*.p12 +*.key +*.mobileprovision + +# Metro +.metro-health-check* + +# debug +npm-debug.* +yarn-debug.* +yarn-error.* + +# macOS +.DS_Store +*.pem + +# local env files +.env*.local + +# typescript +*.tsbuildinfo diff --git a/demo/App.tsx b/demo/App.tsx new file mode 100644 index 00000000..d304476b --- /dev/null +++ b/demo/App.tsx @@ -0,0 +1,55 @@ +import { StatusBar } from "expo-status-bar"; +import { Text, View } from "react-native"; + +import Markdown from "@ukdanceblue/react-native-markdown-display"; +import { useState } from "react"; +import Picker from "react-native-picker-select"; +import * as Samples from "./sampleFiles"; + +const sampleList = Object.entries(Samples); + +export default function App() { + const [selectedSample, setSelectedSample] = useState(sampleList[0][1]); + + return ( + + + ({label: key, value}))} + onValueChange={(value: string) => { + setSelectedSample(value); + }} + /> + + + {selectedSample} + + + {selectedSample} + + + + ); +} diff --git a/demo/app.json b/demo/app.json new file mode 100644 index 00000000..bc8f04e8 --- /dev/null +++ b/demo/app.json @@ -0,0 +1,27 @@ +{ + "expo": { + "name": "demo", + "slug": "demo", + "version": "1.0.0", + "orientation": "portrait", + "icon": "./assets/icon.png", + "userInterfaceStyle": "light", + "splash": { + "image": "./assets/splash.png", + "resizeMode": "contain", + "backgroundColor": "#ffffff" + }, + "ios": { + "supportsTablet": true + }, + "android": { + "adaptiveIcon": { + "foregroundImage": "./assets/adaptive-icon.png", + "backgroundColor": "#ffffff" + } + }, + "web": { + "favicon": "./assets/favicon.png" + } + } +} diff --git a/demo/assets/adaptive-icon.png b/demo/assets/adaptive-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..03d6f6b6c6727954aec1d8206222769afd178d8d GIT binary patch literal 17547 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 literal 0 HcmV?d00001 diff --git a/demo/assets/icon.png b/demo/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a0b1526fc7b78680fd8d733dbc6113e1af695487 GIT binary patch literal 22380 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 literal 0 HcmV?d00001 diff --git a/demo/assets/splash.png b/demo/assets/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..0e89705a9436743e42954d3744a0e7ff0d3d4701 GIT binary patch literal 47346 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 literal 0 HcmV?d00001 diff --git a/demo/babel.config.js b/demo/babel.config.js new file mode 100644 index 00000000..2900afe9 --- /dev/null +++ b/demo/babel.config.js @@ -0,0 +1,6 @@ +module.exports = function(api) { + api.cache(true); + return { + presets: ['babel-preset-expo'], + }; +}; diff --git a/demo/package.json b/demo/package.json new file mode 100644 index 00000000..1fcfcc3e --- /dev/null +++ b/demo/package.json @@ -0,0 +1,29 @@ +{ + "name": "demo", + "version": "1.0.0", + "main": "expo/AppEntry.js", + "scripts": { + "start": "expo start", + "android": "expo start --android", + "ios": "expo start --ios", + "web": "expo start --web" + }, + "dependencies": { + "@expo/metro-runtime": "~3.2.3", + "@react-native-picker/picker": "2.7.5", + "@ukdanceblue/react-native-markdown-display": "latest", + "expo": "~51.0.28", + "expo-status-bar": "~1.12.1", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-native": "0.74.5", + "react-native-picker-select": "^9.3.1", + "react-native-web": "~0.19.10" + }, + "devDependencies": { + "@babel/core": "^7.20.0", + "@types/react": "~18.2.45", + "typescript": "^5.1.3" + }, + "private": true +} diff --git a/demo/sampleFiles.ts b/demo/sampleFiles.ts new file mode 100644 index 00000000..a0272bab --- /dev/null +++ b/demo/sampleFiles.ts @@ -0,0 +1,246 @@ +export const markdownItDemo = `--- +__Advertisement :)__ + +- __[pica](https://nodeca.github.io/pica/demo/)__ - high quality and fast image + resize in browser. +- __[babelfish](https://github.com/nodeca/babelfish/)__ - developer friendly + i18n with plurals support and easy syntax. + +You will like those projects! + +--- + +# h1 Heading 8-) +## h2 Heading +### h3 Heading +#### h4 Heading +##### h5 Heading +###### h6 Heading + + +## Horizontal Rules + +___ + +--- + +*** + + +## Typographic replacements + +Enable typographer option to see result. + +(c) (C) (r) (R) (tm) (TM) (p) (P) +- + +test.. test... test..... test?..... test!.... + +!!!!!! ???? ,, -- --- + +"Smartypants, double quotes" and 'single quotes' + + +## Emphasis + +**This is bold text** + +__This is bold text__ + +*This is italic text* + +_This is italic text_ + +~~Strikethrough~~ + + +## Blockquotes + + +> Blockquotes can also be nested... +>> ...by using additional greater-than signs right next to each other... +> > > ...or with spaces between arrows. + + +## Lists + +Unordered + ++ Create a list by starting a line with \`+\`, \`-\`, or \`*\` ++ Sub-lists are made by indenting 2 spaces: + - Marker character change forces new list start: + * Ac tristique libero volutpat at + + Facilisis in pretium nisl aliquet + - Nulla volutpat aliquam velit ++ Very easy! + +Ordered + +1. Lorem ipsum dolor sit amet +2. Consectetur adipiscing elit +3. Integer molestie lorem at massa + + +1. You can use sequential numbers... +1. ...or keep all the numbers as \`1.\` + +Start numbering with offset: + +57. foo +1. bar + + +## Code + +Inline \`code\` + +Indented code + + // Some comments + line 1 of code + line 2 of code + line 3 of code + + +Block code "fences" + +\`\`\` +Sample text here... +\`\`\` + +Syntax highlighting + +\`\`\` js +var foo = function (bar) { + return bar++; +}; + +console.log(foo(5)); +\`\`\` + +## Tables + +| Option | Description | +| ------ | ----------- | +| data | path to data files to supply the data that will be passed into templates. | +| engine | engine to be used for processing templates. Handlebars is the default. | +| ext | extension to be used for dest files. | + +Right aligned columns + +| Option | Description | +| ------:| -----------:| +| data | path to data files to supply the data that will be passed into templates. | +| engine | engine to be used for processing templates. Handlebars is the default. | +| ext | extension to be used for dest files. | + + +## Links + +[link text](http://dev.nodeca.com) + +[link with title](http://nodeca.github.io/pica/demo/ "title text!") + +Autoconverted link https://github.com/nodeca/pica (enable linkify to see) + + +## Images + +![Minion](https://octodex.github.com/images/minion.png) +![Stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg "The Stormtroopocat") + +Like links, Images also have a footnote style syntax + +![Alt text][id] + +With a reference later in the document defining the URL location: + +[id]: https://octodex.github.com/images/dojocat.jpg "The Dojocat" + + +## Plugins + +The killer feature of \`markdown-it\` is very effective support of +[syntax plugins](https://www.npmjs.org/browse/keyword/markdown-it-plugin). + + +### [Emojies](https://github.com/markdown-it/markdown-it-emoji) + +> Classic markup: :wink: :cry: :laughing: :yum: +> +> Shortcuts (emoticons): :-) :-( 8-) ;) + +see [how to change output](https://github.com/markdown-it/markdown-it-emoji#change-output) with twemoji. + + +### [Subscript](https://github.com/markdown-it/markdown-it-sub) / [Superscript](https://github.com/markdown-it/markdown-it-sup) + +- 19^th^ +- H~2~O + + +### [\\](https://github.com/markdown-it/markdown-it-ins) + +++Inserted text++ + + +### [\\](https://github.com/markdown-it/markdown-it-mark) + +==Marked text== + + +### [Footnotes](https://github.com/markdown-it/markdown-it-footnote) + +Footnote 1 link[^first]. + +Footnote 2 link[^second]. + +Inline footnote^[Text of inline footnote] definition. + +Duplicated footnote reference[^second]. + +[^first]: Footnote **can have markup** + + and multiple paragraphs. + +[^second]: Footnote text. + + +### [Definition lists](https://github.com/markdown-it/markdown-it-deflist) + +Term 1 + +: Definition 1 +with lazy continuation. + +Term 2 with *inline markup* + +: Definition 2 + + { some code, part of Definition 2 } + + Third paragraph of definition 2. + +_Compact style:_ + +Term 1 + ~ Definition 1 + +Term 2 + ~ Definition 2a + ~ Definition 2b + + +### [Abbreviations](https://github.com/markdown-it/markdown-it-abbr) + +This is HTML abbreviation example. + +It converts "HTML", but keep intact partial entries like "xxxHTMLyyy" and so on. + +*[HTML]: Hyper Text Markup Language + +### [Custom containers](https://github.com/markdown-it/markdown-it-container) + +::: warning +*here be dragons* +::: +` \ No newline at end of file diff --git a/demo/tsconfig.json b/demo/tsconfig.json new file mode 100644 index 00000000..b9567f60 --- /dev/null +++ b/demo/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "expo/tsconfig.base", + "compilerOptions": { + "strict": true + } +} diff --git a/package.json b/package.json index 422efd03..00267517 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ukdanceblue/react-native-markdown-display", - "version": "0.1.1", + "version": "0.1.2", "description": "Markdown renderer for react-native, with CommonMark spec support + adds syntax extensions & sugar (URL autolinking, typographer), originally created by Mient-jan Stelling as react-native-markdown-renderer", "keywords": [ "react", @@ -53,6 +53,6 @@ }, "peerDependencies": { "react": ">=18.0.0", - "react-native": ">=0.76.0" + "react-native": ">=0.74.0" } } diff --git a/tsconfig.json b/tsconfig.json index 44dfd82f..910bffee 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -26,9 +26,9 @@ // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ /* Modules */ - "module": "NodeNext" /* Specify what module code is generated. */, + "module": "CommonJS" /* Specify what module code is generated. */, "rootDir": "./src" /* Specify the root folder within your source files. */, - // "moduleResolution": "classic", /* Specify how TypeScript looks up a file from a given module specifier. */ + "moduleResolution": "Node", /* Specify how TypeScript looks up a file from a given module specifier. */ // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ From ebd95f7d1e609524e25bf5ba161ff2f0d6bd3c47 Mon Sep 17 00:00:00 2001 From: Joshua Tag Howard Date: Tue, 29 Oct 2024 00:02:49 +0000 Subject: [PATCH 8/8] Fix some bugs --- demo/package.json | 2 +- package.json | 2 +- src/lib/parser.ts | 15 +++++++------- src/lib/renderRules.tsx | 9 +++++---- src/lib/util/Token.ts | 29 --------------------------- src/lib/util/cleanupTokens.ts | 13 ++++++------ src/lib/util/flattenInlineTokens.ts | 9 ++++----- src/lib/util/getTokenTypeByToken.ts | 14 +++++++------ src/lib/util/groupTextTokens.ts | 15 +++++++------- src/lib/util/omitListItemParagraph.ts | 7 +++---- src/lib/util/tokensToAST.ts | 16 ++++++++------- 11 files changed, 52 insertions(+), 79 deletions(-) delete mode 100644 src/lib/util/Token.ts diff --git a/demo/package.json b/demo/package.json index 1fcfcc3e..bdca7ce5 100644 --- a/demo/package.json +++ b/demo/package.json @@ -11,7 +11,7 @@ "dependencies": { "@expo/metro-runtime": "~3.2.3", "@react-native-picker/picker": "2.7.5", - "@ukdanceblue/react-native-markdown-display": "latest", + "@ukdanceblue/react-native-markdown-display": "^0.1.3", "expo": "~51.0.28", "expo-status-bar": "~1.12.1", "react": "18.2.0", diff --git a/package.json b/package.json index 00267517..537319d3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ukdanceblue/react-native-markdown-display", - "version": "0.1.2", + "version": "0.1.6", "description": "Markdown renderer for react-native, with CommonMark spec support + adds syntax extensions & sugar (URL autolinking, typographer), originally created by Mient-jan Stelling as react-native-markdown-renderer", "keywords": [ "react", diff --git a/src/lib/parser.ts b/src/lib/parser.ts index 66bb1dbf..b5cce86b 100644 --- a/src/lib/parser.ts +++ b/src/lib/parser.ts @@ -1,12 +1,11 @@ -import tokensToAST from "./util/tokensToAST"; -import {stringToTokens} from "./util/stringToTokens"; -import {cleanupTokens} from "./util/cleanupTokens"; +import MarkdownIt, { Token } from "markdown-it"; +import { ReactNode } from "react"; +import { ASTNode } from "./types"; +import { cleanupTokens } from "./util/cleanupTokens"; import groupTextTokens from "./util/groupTextTokens"; import omitListItemParagraph from "./util/omitListItemParagraph"; -import {ReactNode} from "react"; -import MarkdownIt, {Token} from "markdown-it"; -import TextToken from "./util/Token"; -import {ASTNode} from "./types"; +import { stringToTokens } from "./util/stringToTokens"; +import tokensToAST from "./util/tokensToAST"; export default function parser( source: string, @@ -17,7 +16,7 @@ export default function parser( return renderer(source); } - let tokens: (Token | TextToken)[] = stringToTokens(source, markdownIt); + let tokens: (Token)[] = stringToTokens(source, markdownIt); tokens = cleanupTokens(tokens); tokens = groupTextTokens(tokens); tokens = omitListItemParagraph(tokens); diff --git a/src/lib/renderRules.tsx b/src/lib/renderRules.tsx index 1efd3a58..fbb64e4a 100644 --- a/src/lib/renderRules.tsx +++ b/src/lib/renderRules.tsx @@ -1,6 +1,7 @@ -import type {ReactNode} from "react"; -import type {ViewStyle} from "react-native"; +import type { ReactNode } from "react"; +import type { ViewStyle } from "react-native"; import { + Image, Platform, StyleSheet, Text, @@ -9,7 +10,7 @@ import { } from "react-native"; import textStyleProps from "./data/textStyleProps"; -import type {ASTNode} from "./types"; +import type { ASTNode } from "./types"; import hasParents from "./util/hasParents"; import openUrl from "./util/openUrl"; @@ -403,7 +404,7 @@ const renderRules: RenderRules = { ); } // @ts-expect-error - this is fine - return ; + return ; }, // Text Output diff --git a/src/lib/util/Token.ts b/src/lib/util/Token.ts deleted file mode 100644 index f10d7605..00000000 --- a/src/lib/util/Token.ts +++ /dev/null @@ -1,29 +0,0 @@ -import {Token} from "markdown-it"; - -export default class TextToken { - constructor( - public type: "textgroup", - public nesting: number, - ) {} - - public get children(): Token[] { - return []; - } - - public readonly tag = ""; - - public readonly content = ""; - - public readonly attrs = null; - public get info(): undefined { - return undefined; - } - public get meta(): undefined { - return undefined; - } - public get markup(): undefined { - return undefined; - } - - public block = false; -} diff --git a/src/lib/util/cleanupTokens.ts b/src/lib/util/cleanupTokens.ts index a1295a69..e4c03dff 100644 --- a/src/lib/util/cleanupTokens.ts +++ b/src/lib/util/cleanupTokens.ts @@ -1,12 +1,11 @@ -import getTokenTypeByToken from "./getTokenTypeByToken"; +import { Token } from "markdown-it"; import flattenInlineTokens from "./flattenInlineTokens"; +import getTokenTypeByToken from "./getTokenTypeByToken"; import renderInlineAsText from "./renderInlineAsText"; -import {Token} from "markdown-it"; -import TextToken from "./Token"; export function cleanupTokens( - tokens: (Token | TextToken)[], -): (Token | TextToken)[] { + tokens: (Token)[], +): (Token)[] { tokens = flattenInlineTokens(tokens); tokens.forEach((token) => { token.type = getTokenTypeByToken(token); @@ -29,8 +28,8 @@ export function cleanupTokens( * changing a link token to a blocklink to fix issue where link tokens with * nested non text tokens breaks component */ - const stack: (Token | TextToken)[] = []; - tokens = tokens.reduce<(Token | TextToken)[]>((acc, token) => { + const stack: (Token)[] = []; + tokens = tokens.reduce<(Token)[]>((acc, token) => { if (token.type === "link" && token.nesting === 1) { stack.push(token); } else if ( diff --git a/src/lib/util/flattenInlineTokens.ts b/src/lib/util/flattenInlineTokens.ts index 3379fe04..35561f37 100644 --- a/src/lib/util/flattenInlineTokens.ts +++ b/src/lib/util/flattenInlineTokens.ts @@ -1,10 +1,9 @@ -import {Token} from "markdown-it"; -import TextToken from "./Token"; +import { Token } from "markdown-it"; export default function flattenTokens( - tokens: (Token | TextToken)[], -): (Token | TextToken)[] { - return tokens.reduce<(Token | TextToken)[]>((acc, curr) => { + tokens: (Token)[], +): (Token )[] { + return tokens.reduce((acc, curr) => { if (curr.type === "inline" && curr.children && curr.children.length > 0) { const children = flattenTokens(curr.children); while (children.length) { diff --git a/src/lib/util/getTokenTypeByToken.ts b/src/lib/util/getTokenTypeByToken.ts index b5a3d232..03f3a2c8 100644 --- a/src/lib/util/getTokenTypeByToken.ts +++ b/src/lib/util/getTokenTypeByToken.ts @@ -1,6 +1,5 @@ -import {Token} from "markdown-it"; -import {RenderRules} from "../renderRules"; -import TextToken from "./Token"; +import { Token } from "markdown-it"; +import { RenderRules } from "../renderRules"; const regSelectOpenClose = /_open|_close/g; @@ -28,7 +27,7 @@ const regSelectOpenClose = /_open|_close/g; * @return {String} */ export default function getTokenTypeByToken( - token: Token | TextToken, + token: Token, ): keyof RenderRules { let cleanedType: keyof RenderRules | "heading" = "unknown"; @@ -40,10 +39,13 @@ export default function getTokenTypeByToken( switch (cleanedType) { case "heading": { - return `${cleanedType}${token.tag.substring(1) as "1" | "2" | "3" | "4" | "5" | "6"}`; + cleanedType = `${cleanedType}${token.tag.substring(1) as "1" | "2" | "3" | "4" | "5" | "6"}`; + break; } default: { - return cleanedType; + break; } } + + return cleanedType; } diff --git a/src/lib/util/groupTextTokens.ts b/src/lib/util/groupTextTokens.ts index d4478a1e..8c6fee32 100644 --- a/src/lib/util/groupTextTokens.ts +++ b/src/lib/util/groupTextTokens.ts @@ -1,23 +1,24 @@ -import {Token} from "markdown-it"; -import TextToken from "./Token"; +import MarkdownIt, { type Token } from "markdown-it"; + +const {core: {State: {prototype: {Token}}}} = new MarkdownIt(); export default function groupTextTokens( - tokens: (Token | TextToken)[], -): (Token | TextToken)[] { - const result: (Token | TextToken)[] = []; + tokens: Token[], +): (Token)[] { + const result: Token[] = []; let hasGroup = false; tokens.forEach((token) => { if (!token.block && !hasGroup) { hasGroup = true; - result.push(new TextToken("textgroup", 1)); + result.push(new Token("textgroup", "", 1)); result.push(token); } else if (!token.block && hasGroup) { result.push(token); } else if (token.block && hasGroup) { hasGroup = false; - result.push(new TextToken("textgroup", -1)); + result.push(new Token("textgroup", "", -1)); result.push(token); } else { result.push(token); diff --git a/src/lib/util/omitListItemParagraph.ts b/src/lib/util/omitListItemParagraph.ts index ee05abff..239f982a 100644 --- a/src/lib/util/omitListItemParagraph.ts +++ b/src/lib/util/omitListItemParagraph.ts @@ -1,9 +1,8 @@ -import {Token} from "markdown-it"; -import TextToken from "./Token"; +import { Token } from "markdown-it"; export default function omitListItemParagraph( - tokens: (Token | TextToken)[], -): (Token | TextToken)[] { + tokens: Token[], +): Token[] { // used to ensure that we remove the correct ending paragraph token let depth: number | null = null; return tokens.filter((token, index) => { diff --git a/src/lib/util/tokensToAST.ts b/src/lib/util/tokensToAST.ts index c132091f..2c736ade 100644 --- a/src/lib/util/tokensToAST.ts +++ b/src/lib/util/tokensToAST.ts @@ -1,10 +1,9 @@ -import {Token} from "markdown-it"; -import {ASTNode} from "../types"; +import { Token } from "markdown-it"; +import { ASTNode } from "../types"; import getTokenTypeByToken from "./getTokenTypeByToken"; import getUniqueID from "./getUniqueID"; -import TextToken from "./Token"; -function createNode(token: Token | TextToken, tokenIndex: number): ASTNode { +function createNode(token: Token, tokenIndex: number): ASTNode { const type = getTokenTypeByToken(token); const content = token.content; @@ -33,7 +32,7 @@ function createNode(token: Token | TextToken, tokenIndex: number): ASTNode { }; } -export default function tokensToAST(tokens?: (Token | TextToken)[]): ASTNode[] { +export default function tokensToAST(tokens?: (Token)[]): ASTNode[] { const stack = []; let children: ASTNode[] = []; @@ -57,9 +56,12 @@ export default function tokensToAST(tokens?: (Token | TextToken)[]): ASTNode[] { if (token.nesting === 1) { children.push(astNode); stack.push(children); - children = [...astNode.children]; + // @ts-expect-error read-only is not a concern + children = astNode.children; } else if (token.nesting === -1) { - children = stack.pop() ?? []; + // @ts-expect-error we know it's defined + children = stack.pop(); + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition } else if (token.nesting === 0) { children.push(astNode); }