rehypejs / rehype-raw Goto Github PK
View Code? Open in Web Editor NEWplugin to parse the tree again
Home Page: https://unifiedjs.com
License: MIT License
plugin to parse the tree again
Home Page: https://unifiedjs.com
License: MIT License
6.1.0
https://codesandbox.io/s/remark-rehype-debug-forked-8tk7h?file=/src/index.js
I'm not sure if this is a bug with remark-rehype
or rehype-raw
. Please forgive me if I got it wrong.
The issue is that HTML comments with an odd number of -
characters is not parsed properly. If you feed the following code through remark-rehype
and rehype-raw
:
<!-- An HTML comment with 2 dashes -->
# This heading works (2 dashes)
You will get a proper parsed heading. However, if you use 3 dashes, like this:
<!--- An HTML comment with 3 dashes --->
# This heading is broken (3 dashes)
Then you get no parsed content at all.
The pattern repeats. 4 dashes works, 5 doesn't, 6 works, 7 doesn't, etc...
Any number of dashes in the <!---- --->
comment tag should be supported.
Only even numbers of dashes are parsed properly.
Node v16
yarn v1
macOS
Webpack
7.0.0
No response
I'm using this lib as a sort of MDX to have a realtime markdown editor with some custom components, i'm using the react-markdown lib, and adding custom components under the components
propriety.
When dealing with known tags, like <a />
everything seems to work properly, but when using custom tags, for example a <Pdf src="..."/>
, it seems like the tag never closes. I've read #16 and #8 made sure there were a new line between the component and the rest, this is the source:
test (shown)
<Pdf src="somepdf.pdf" />
test 123 (not shown, as the pdf component has no children, but it is being sent as a child to Pdf)
To make it work i need to manually close the tag <Pdf src="..." ></Pdf>
.
Is this expected behaviour? If so, is there a workaround?
If it could be useful, this is my code:
<ReactMarkdown
remarkPlugins={[
remarkGfm,
remarkMath,
]}
rehypePlugins={[
[rehypeKatex, {output: 'htmlAndMathml'}],
rehypeRaw,
]
}
components={{
//hidden rest of components
pdf: withPropsValidator(MD_CUSTOM_COMPONENTS.pdf, ({props, children}) => {
return <PDFRenderer
src={props.src}
style={{
width: props.width,
minHeight: props.minheight,
height: props.height,
}}
allowOpen={props.allowopen}
allowToolbar={props.allowtoolbar}
allowResize={props.allowresize}
/>
}),
}}
>
{markdown}
</ReactMarkdown>;
I expect the custom tag to close, leading to further source to be parsed on it's own instead of being a child of the self closing tag
The custom self closing tag doesn't close, making all the next items as children of this tag
Node v17
npm 8
Windows
Next.js
6.1.1
https://codesandbox.io/s/vigilant-davinci-np1zyu
See https://codesandbox.io/s/vigilant-davinci-np1zyu for minimal reproduction.
Can be reproduce in node :
// test.mjs
import { read } from 'to-vfile'
import { unified } from 'unified'
import rehypeParse from 'rehype-parse'
import rehypeRaw from 'rehype-raw';
import rehypeStringify from 'rehype-stringify'
main()
async function main() {
const file = await unified()
.use(rehypeParse)
.use(rehypeRaw)
.use(rehypeStringify)
.process(await read('example.html'))
console.log("file: ", String(file))
}
<!-- example.html -->
<html>
<body>
<h2>Table test</h2>
<table>
<thead>
<tr>
<th>Column 1</th>
<th>Column 2</th>
<th>Column 3</th>
</tr>
</thead>
<tbody>
<tr>
<td>foo 1</td>
<td>foo 2</td>
<td>foo 3</td>
</tr>
<tr>
<td>bar 1</td>
<td>bar 2</td>
<td>bar 3</td>
</tr>
</tbody>
</table>
</body>
</html>
output should be :
<!doctype html><html><head></head><body>
<h2>Table test</h2>
<table><thead><tr><th>Column 1</th><th>Column 2</th><th>Column 3</th></tr></thead><tbody><tr><td>foo 1</td><td>foo 2</td><td>foo 3</td></tr><tr><td>bar 1</td><td>bar 2</td><td>bar 3</td></tr></tbody></table>
</body></html>
output is :
<!doctype html><html><head></head><body>
<h2>Table test</h2>
<table><thead><tr><th>Column 1</th><th>Column 2</th><th>Column 3</th></tr></thead><tbody><tr><td>foo 1</td><td>foo 2</td><td>foo 3</td></tr><tr><td>bar 1</td><td>bar 2</td><td>bar 3</td></tr></tbody></table>
</body></html>
Notice, empty lines...
Node v17, Node v16, Other (please specify in steps to reproduce)
yarn 1
macOS
Other (please specify in steps to reproduce)
Just starting using unified, remark & rehype in the context of a static site generator written in typescript and noticed this package is missing typings.
I just patched it with the following local src/node_modules/rehype-raw/index.d.ts
, which is enough for my project but would be great to have complete typings for this plugin.
// TypeScript Version: 3.0
declare module 'rehype-raw' {
import { Plugin } from 'unified';
const rehypeRaw: Plugin;
export default rehypeRaw;
}
Please, update hast-util-raw
dependency to v8 and thus parse5
to v7. Otherwise, two parse5
dependencies will be installed in my project. The other coming from [email protected]
(currently the latest version).
npm update hast-util-raw@^8.0.0
None
Hello, lovely library. But is it possible to design a devop package so that it is understood by all collectors, i.e. with index.js, as in the other packages.
We have to stay on version 6.1.1, where it is not used.
Arrange it in a standard way
7.0.0
No response
<ReactMarkdown
className='prose max-w-none'
remarkPlugins={[remarkGfm]}
rehypePlugins={[rehypeRaw]}
(...)
no problem
The error message "'(options?: Options | null | undefined) => (tree: Root, file: VFile) => Root' type cannot be assigned to 'Pluggable<any[]>' type" suggests a type incompatibility issue in your TypeScript code.
Other (please specify in steps to reproduce)
yarn 3
macOS
Next.js
When there is a self closing tag (eg. <br/>
) before markdown content, the markdown is not parsed and is shown as is.
Example input:
<img src="https://a.storyblok.com/f/68034/756x1000/db92d9ed67/hc_3000_r.png" width="110" />
El <b>VF 1000 / 65R32 CFO 200A8 HC3000R TL</b> tiene un **nuevo** diseño de banda de rodadura
Img + El VF 1000 / 65R32 CFO 200A8 HC3000R TL tiene un nuevo diseño de banda de rodadura
Img + El VF 1000 / 65R32 CFO 200A8 HC3000R TL tiene un **nuevo** diseño de banda de rodadura
When you look at the documentation, rehype-raw is parsing text-nodes that might be nested within html tags (and can contain html syntax itself):
<div class="note">
A mix of *markdown* and <em>HTML</em>.
</div>
yields:
<div class="note">
<p>A mix of <em>markdown</em> and <em>HTML</em>.</p>
</div>
The textnode of the div.note element was interpreted as a markdown paragraph and thus parsed and wrapped in a p-element, with its inner text also being parsed, resulting in a em-node with markdown as text value.
However, when I dont use the paragraph whitespace:
<div class="note">
A mix of *markdown* and <em>HTML</em>.
</div>
or
<div class="note">A mix of *markdown* and <em>HTML</em>.</div>
this yields:
<div class="note">
A mix of *markdown* and <em>HTML</em>.
</div>
The textnode of the div.node element was not wrapped in a paragraph (because it didnt have the required linebreaks). This is correct behaviour. But I would still expect the text value to be processed to end up with an emphasis element like this:
<div class="note">
A mix of <em>markdown</em> and <em>HTML</em>.
</div>
Is this intended behaviour not to parse the entire textnode because it is no paragraph? If it is a bug, I will look into it to fix it.
Thanks for looking into this!
Hello.
After using rehype-ray all nodes position is blanked.
position.start and position.end are set no an empty object
Is this a bug?
"react-markdown": "^8.0.7", "rehype-raw": "^7.0.0"
No response
1 - Create a new react project (NextJS project in my case).
npx create-next-app@latest
2 - Install React markdown
npm install react-markdown
3- Install rehype-raw
npm install rehype-raw
Now if you try to use rehype raw with react markdown, you should get the following error:
Text version:
Type '(options?: Options | null | undefined) => (tree: Root, file: VFile) => Root' is not assignable to type 'Pluggable<any[]>'.
Type '(options?: Options | null | undefined) => (tree: Root, file: VFile) => Root' is not assignable to type 'Plugin<any[], any, any>'.
Type '(tree: Root, file: VFile) => Root' is not assignable to type 'void | Transformer<any, any>'.
Type '(tree: Root, file: VFile) => Root' is not assignable to type 'Transformer<any, any>'.
Types of parameters 'file' and 'file' are incompatible.
Type 'import("/private/tmp/my-app/node_modules/vfile/lib/index").VFile' is not assignable to type 'import("/private/tmp/my-app/node_modules/hast-util-raw/node_modules/vfile/lib/index").VFile'.
Types of property 'messages' are incompatible.
Type 'import("/private/tmp/my-app/node_modules/vfile-message/lib/index").VFileMessage[]' is not assignable to type 'import("/private/tmp/my-app/node_modules/hast-util-raw/node_modules/vfile-message/lib/index").VFileMessage[]'.
Type 'VFileMessage' is missing the following properties from type 'VFileMessage': ancestors, placets(2322)
After updating rehype-raw from 6.1.1 to 7, the plugin should work seamlessly with react-markdown and not generate any TypeScript errors. It should be fully compatible right out of the box.
I'm getting a typescript error after updating rehype-raw from 6.1.1 to 7
Node v16
npm 8
macOS
Next.js
I'm stupid sorry
In readme.md var format = require('rehype-raw')
should be var format = require('rehype-format')
, shouldn't it?
"rehype-raw": "^6.1.1"
No response
I am using the following code:
<figure>
<video width="100%" height="100%" controls >
<source src="example.mp4" type="video/mp4" />
<p>
Your browser doesn't support HTML video. Here is a
<a href="example.mp4">link to the video</a> instead.
</p>
</video>
<figcaption class="figure-caption">example.mp4</figcaption>
</figure>
on a .md file in NextJS (Node v20, NPM 9).
A video should be rendered on the resulting HTML page.
A video is not rendered and upon closer inspection, an img tag is being spat out instead.
Other (please specify in steps to reproduce)
Other (please specify in steps to reproduce)
Linux
Next.js
I am trying to allow a permissive parsing to get a flexible mardown to react rendering with mapping.
I saw in a comment that using rehype-raw was one solution. And it looks good!
I just found an issue tho.
Whenever I use remark/rehype -slug+autolinks (I tried with remark-* initially and when I got the issue, tried with rehype-* versions but no luck) with rehype-raw, I am getting an error.
Here is a minimal snippet that should trigger a similar error I am getting
var unified = require('unified');
var markdown = require('remark-parse');
var remark2rehype = require('remark-rehype');
var slug = require('rehype-slug');
var link = require('rehype-autolink-headings');
var raw = require('rehype-raw');
var stringify = require('rehype-stringify');
const input = `## Test
[link](href)
\`\`\`js
console.log(window)
\`\`\`
<button>Random Html</button>
<Button>Random react like stuff</Button>
`;
unified()
.use(markdown)
.use(remark2rehype, {allowDangerousHTML: true})
.use(slug)
.use(link)
.use(raw)
.use(stringify)
.processSync(input);
You can test is there http://requirebin.com/?gist=3feede6e8cc19e061589bdc2f6634bef
And here is my version of the error
TypeError: Cannot read property 'length' of undefined
at all (node_modules/hast-util-raw/index.js:103:23)
at element (node_modules/hast-util-raw/index.js:120:5)
at one (node_modules/zwitch/index.js:20:25)
at all (node_modules/hast-util-raw/index.js:107:7)
at element (node_modules/hast-util-raw/index.js:120:5)
at one (node_modules/zwitch/index.js:20:25)
at all (node_modules/hast-util-raw/index.js:107:7)
at element (node_modules/hast-util-raw/index.js:120:5)
at one (node_modules/zwitch/index.js:20:25)
at all (node_modules/hast-util-raw/index.js:107:7)
at root (node_modules/hast-util-raw/index.js:112:5)
at one (node_modules/zwitch/index.js:20:25)
at fragment (node_modules/hast-util-raw/index.js:85:5)
at wrap (node_modules/hast-util-raw/index.js:41:43)
at wrapped (node_modules/trough/index.js:93:19)
at next (node_modules/trough/index.js:56:24)
...
Not sure if it's directly a rehype-raw error but I don't have it until I use this module, that's why I opened an issue here :)
Is there a way to make the convertion optional for some components? I have a custom component in the Markdown Parser from react-markdown and I need it to keep its children always as a string, but if there is html content inside that content, that content gets parsed as nodes. Is there a way to prevent that? I need the plugin to make that convertion in other components but NOT in this one. Here is an example of my code
<ReactMarkdown
remarkPlugins={[remarkGfm, remarkGemoji, remarkMath]}
rehypePlugins={[rehypeRaw, rehypeKatex]}
components={{
codeviewer: CodeViewerComponent,
}}
>
{preParsedContent}
</ReactMarkdown>
Maybe if there were a function to unparse the children of a component
Or a list of components to just receive the children unparsed
"rehype-raw": "^7.0.0"
No response
Dependencies
"react-markdown": "^9.0.0",
"rehype-highlight": "^7.0.0",
"rehype-raw": "^7.0.0",
"remark-gfm": "^4.0.0",
Code
<ReactMarkdown
rehypePlugins={[rehypeRaw, rehypeHighlight, [remarkGfm, { singleTilde: false }]]}
components={components}
{...other}
/>
The warning logs will be removed when rehypeRaw
is removed or downgrade versions:
"react-markdown": "^8.0.7",
"rehype-highlight": "^6.0.0",
"rehype-raw": "^6.1.1",
"remark-gfm": "^3.0.1",
Environment:
MacOS
Build and bundle tools: Create react app
Node: v18.17.1
npm : 9.6.7
Warning is not displayed Failed to parse source map from...
When using the latest version.
The version shows a warning
"react-markdown": "^9.0.0",
"rehype-highlight": "^7.0.0",
"rehype-raw": "^7.0.0",
"remark-gfm": "^4.0.0",
The version not shows a warning
"react-markdown": "^8.0.7",
"rehype-highlight": "^6.0.0",
"rehype-raw": "^6.1.1",
"remark-gfm": "^3.0.1",
Compiled with warnings.
Failed to parse source map from '/Volumes/DATA/cra-ts/node_modules/parse5/dist/common/doctype.js.map' file: Error: ENOENT: no such file or directory, open '/Volumes/DATA/cra-ts/node_modules/parse5/dist/common/doctype.js.map'
Failed to parse source map from '/Volumes/DATA/cra-ts/node_modules/parse5/dist/common/error-codes.js.map' file: Error: ENOENT: no such file or directory, open '/Volumes/DATA/cra-ts/node_modules/parse5/dist/common/error-codes.js.map'
Failed to parse source map from '/Volumes/DATA/cra-ts/node_modules/parse5/dist/common/foreign-content.js.map' file: Error: ENOENT: no such file or directory, open '/Volumes/DATA/cra-ts/node_modules/parse5/dist/common/foreign-content.js.map'
Failed to parse source map from '/Volumes/DATA/cra-ts/node_modules/parse5/dist/common/html.js.map' file: Error: ENOENT: no such file or directory, open '/Volumes/DATA/cra-ts/node_modules/parse5/dist/common/html.js.map'
Failed to parse source map from '/Volumes/DATA/cra-ts/node_modules/parse5/dist/common/token.js.map' file: Error: ENOENT: no such file or directory, open '/Volumes/DATA/cra-ts/node_modules/parse5/dist/common/token.js.map'
Failed to parse source map from '/Volumes/DATA/cra-ts/node_modules/parse5/dist/common/unicode.js.map' file: Error: ENOENT: no such file or directory, open '/Volumes/DATA/cra-ts/node_modules/parse5/dist/common/unicode.js.map'
Failed to parse source map from '/Volumes/DATA/cra-ts/node_modules/parse5/dist/index.js.map' file: Error: ENOENT: no such file or directory, open '/Volumes/DATA/cra-ts/node_modules/parse5/dist/index.js.map'
Failed to parse source map from '/Volumes/DATA/cra-ts/node_modules/parse5/dist/parser/formatting-element-list.js.map' file: Error: ENOENT: no such file or directory, open '/Volumes/DATA/cra-ts/node_modules/parse5/dist/parser/formatting-element-list.js.map'
Failed to parse source map from '/Volumes/DATA/cra-ts/node_modules/parse5/dist/parser/index.js.map' file: Error: ENOENT: no such file or directory, open '/Volumes/DATA/cra-ts/node_modules/parse5/dist/parser/index.js.map'
Failed to parse source map from '/Volumes/DATA/cra-ts/node_modules/parse5/dist/parser/open-element-stack.js.map' file: Error: ENOENT: no such file or directory, open '/Volumes/DATA/cra-ts/node_modules/parse5/dist/parser/open-element-stack.js.map'
Failed to parse source map from '/Volumes/DATA/cra-ts/node_modules/parse5/dist/serializer/index.js.map' file: Error: ENOENT: no such file or directory, open '/Volumes/DATA/cra-ts/node_modules/parse5/dist/serializer/index.js.map'
Failed to parse source map from '/Volumes/DATA/cra-ts/node_modules/parse5/dist/tokenizer/index.js.map' file: Error: ENOENT: no such file or directory, open '/Volumes/DATA/cra-ts/node_modules/parse5/dist/tokenizer/index.js.map'
Failed to parse source map from '/Volumes/DATA/cra-ts/node_modules/parse5/dist/tokenizer/preprocessor.js.map' file: Error: ENOENT: no such file or directory, open '/Volumes/DATA/cra-ts/node_modules/parse5/dist/tokenizer/preprocessor.js.map'
Failed to parse source map from '/Volumes/DATA/cra-ts/node_modules/parse5/dist/tree-adapters/default.js.map' file: Error: ENOENT: no such file or directory, open '/Volumes/DATA/cra-ts/node_modules/parse5/dist/tree-adapters/default.js.map'
Search for the keywords to learn more about each warning.
To ignore, add // eslint-disable-next-line to the line before.
WARNING in ./node_modules/parse5/dist/common/doctype.js
Module Warning (from ./node_modules/source-map-loader/dist/cjs.js):
Failed to parse source map from '/Volumes/DATA/cra-ts/node_modules/parse5/dist/common/doctype.js.map' file: Error: ENOENT: no such file or directory, open '/Volumes/DATA/cra-ts/node_modules/parse5/dist/common/doctype.js.map'
WARNING in ./node_modules/parse5/dist/common/error-codes.js
Module Warning (from ./node_modules/source-map-loader/dist/cjs.js):
Failed to parse source map from '/Volumes/DATA/cra-ts/node_modules/parse5/dist/common/error-codes.js.map' file: Error: ENOENT: no such file or directory, open '/Volumes/DATA/cra-ts/node_modules/parse5/dist/common/error-codes.js.map'
WARNING in ./node_modules/parse5/dist/common/foreign-content.js
Module Warning (from ./node_modules/source-map-loader/dist/cjs.js):
Failed to parse source map from '/Volumes/DATA/cra-ts/node_modules/parse5/dist/common/foreign-content.js.map' file: Error: ENOENT: no such file or directory, open '/Volumes/DATA/cra-ts/node_modules/parse5/dist/common/foreign-content.js.map'
WARNING in ./node_modules/parse5/dist/common/html.js
Module Warning (from ./node_modules/source-map-loader/dist/cjs.js):
Failed to parse source map from '/Volumes/DATA/cra-ts/node_modules/parse5/dist/common/html.js.map' file: Error: ENOENT: no such file or directory, open '/Volumes/DATA/cra-ts/node_modules/parse5/dist/common/html.js.map'
WARNING in ./node_modules/parse5/dist/common/token.js
Module Warning (from ./node_modules/source-map-loader/dist/cjs.js):
Failed to parse source map from '/Volumes/DATA/cra-ts/node_modules/parse5/dist/common/token.js.map' file: Error: ENOENT: no such file or directory, open '/Volumes/DATA/cra-ts/node_modules/parse5/dist/common/token.js.map'
WARNING in ./node_modules/parse5/dist/common/unicode.js
Module Warning (from ./node_modules/source-map-loader/dist/cjs.js):
Failed to parse source map from '/Volumes/DATA/cra-ts/node_modules/parse5/dist/common/unicode.js.map' file: Error: ENOENT: no such file or directory, open '/Volumes/DATA/cra-ts/node_modules/parse5/dist/common/unicode.js.map'
WARNING in ./node_modules/parse5/dist/index.js
Module Warning (from ./node_modules/source-map-loader/dist/cjs.js):
Failed to parse source map from '/Volumes/DATA/cra-ts/node_modules/parse5/dist/index.js.map' file: Error: ENOENT: no such file or directory, open '/Volumes/DATA/cra-ts/node_modules/parse5/dist/index.js.map'
WARNING in ./node_modules/parse5/dist/parser/formatting-element-list.js
Module Warning (from ./node_modules/source-map-loader/dist/cjs.js):
Failed to parse source map from '/Volumes/DATA/cra-ts/node_modules/parse5/dist/parser/formatting-element-list.js.map' file: Error: ENOENT: no such file or directory, open '/Volumes/DATA/cra-ts/node_modules/parse5/dist/parser/formatting-element-list.js.map'
WARNING in ./node_modules/parse5/dist/parser/index.js
Module Warning (from ./node_modules/source-map-loader/dist/cjs.js):
Failed to parse source map from '/Volumes/DATA/cra-ts/node_modules/parse5/dist/parser/index.js.map' file: Error: ENOENT: no such file or directory, open '/Volumes/DATA/cra-ts/node_modules/parse5/dist/parser/index.js.map'
WARNING in ./node_modules/parse5/dist/parser/open-element-stack.js
Module Warning (from ./node_modules/source-map-loader/dist/cjs.js):
Failed to parse source map from '/Volumes/DATA/cra-ts/node_modules/parse5/dist/parser/open-element-stack.js.map' file: Error: ENOENT: no such file or directory, open '/Volumes/DATA/cra-ts/node_modules/parse5/dist/parser/open-element-stack.js.map'
WARNING in ./node_modules/parse5/dist/serializer/index.js
Module Warning (from ./node_modules/source-map-loader/dist/cjs.js):
Failed to parse source map from '/Volumes/DATA/cra-ts/node_modules/parse5/dist/serializer/index.js.map' file: Error: ENOENT: no such file or directory, open '/Volumes/DATA/cra-ts/node_modules/parse5/dist/serializer/index.js.map'
WARNING in ./node_modules/parse5/dist/tokenizer/index.js
Module Warning (from ./node_modules/source-map-loader/dist/cjs.js):
Failed to parse source map from '/Volumes/DATA/cra-ts/node_modules/parse5/dist/tokenizer/index.js.map' file: Error: ENOENT: no such file or directory, open '/Volumes/DATA/cra-ts/node_modules/parse5/dist/tokenizer/index.js.map'
WARNING in ./node_modules/parse5/dist/tokenizer/preprocessor.js
Module Warning (from ./node_modules/source-map-loader/dist/cjs.js):
Failed to parse source map from '/Volumes/DATA/cra-ts/node_modules/parse5/dist/tokenizer/preprocessor.js.map' file: Error: ENOENT: no such file or directory, open '/Volumes/DATA/cra-ts/node_modules/parse5/dist/tokenizer/preprocessor.js.map'
WARNING in ./node_modules/parse5/dist/tree-adapters/default.js
Module Warning (from ./node_modules/source-map-loader/dist/cjs.js):
Failed to parse source map from '/Volumes/DATA/cra-ts/node_modules/parse5/dist/tree-adapters/default.js.map' file: Error: ENOENT: no such file or directory, open '/Volumes/DATA/cra-ts/node_modules/parse5/dist/tree-adapters/default.js.map'
webpack compiled with 14 warnings
No issues found.
No response
No response
macOS
Create React App
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.