jest-community / jest-junit Goto Github PK
View Code? Open in Web Editor NEWA Jest reporter that creates compatible junit xml files
License: Apache License 2.0
A Jest reporter that creates compatible junit xml files
License: Apache License 2.0
I'm not sure if this is possible but it would be a huge benefit if the results of any console.log
statements, etc. were made available inside of <testcase>
elements using <system-out>
and <system-err>
.
If we add
{
"testResultsProcessor": "jest-junit"
}
we get this
Out of the box, Create React App only supports overriding these Jest options:
• collectCoverageFrom
• coverageReporters
• coverageThreshold
• snapshotSerializers.
These options in your package.json Jest configuration are not currently supported by Create React App:
• testResultsProcessor
For example, my current output is this:
<testcase classname="classname" name="classname" time="0.771"> </testcase>
But I want my output to look like this instead:
`
<classname>classname</classname>
<name>classname</name>
<time>0.771</time>
I ask because I need to convert this file to a csv and can't find a package that will read from the attributes and not the inner xml.
The license file for this package isn't quite right..... Looks like you need to update it to correctly tell people the year and name of copyright owner....
Copyright {yyyy} {name of copyright owner}
or even the screenshot taken at the end of each test / test failure?
Assume the screenshot already been taken by puppeteer...
I am not really sure if its something has to been done inside jest or somewhere else?
Thanks
It seems that in the latest release (3.2.1) the format of the xml report file has changed, omitting the tests attribute of the testsuit containing the amount of tests that were ran.
This breaks our CI since our Jenkins publisher is relying on this attribute.
Looking at the code, it seems that there's no way to configure the reporter to include it.
Is there a plan to introduce it back again?
According to JUnit testsuite.timestamp
is expected to be in local time without any timezone indicator (yes, it is strange indeed, but never the less).
After upgrading to v6, Jenkins/xUnit fail to read the test result reports (complaining about the file
attribute in testcase
):
WARNING: At line 3 of file:/var/lib/jenkins/workspace/[...]/target/junit.xml:cvc-complex-type.3.2.2: Attribut 'file' darf nicht in Element 'testcase' vorkommen.
[...]
FATAL: The result file '/var/lib/jenkins/workspace/[...]/target/junit.xml' for the metric 'JUnit' is not valid. The result file has been skipped.
I guess it has to do with #71.
Anyone else experiencing this problem?
Jenkins: v2.150.1
xUnit plugin: v.2.3.2
on a updated windows 10 64bit,
with node 10.16.3,
with jest 1.20,
with a very simple test
describe('Generic Test', () => {
test("test1", () => {
expect(2).toBe(2)
})
});
with this jest.config.js file
module.exports = {
preset: "jest-puppeteer",
setupFilesAfterEnv: [ // NOT setupFiles
"./custom-configuration.js"
],
reporters: ["default","jest-junit"]
};
if i run "jest" from the root of the project,
test pass and jest quit creating the xml.
if i run from external path, jest pass the test, then it hangs.
jest --config c:\src\e2e\jest.config.js --rootDir c:\src\e2e\
the problem is related with the reporter,
if i remove the reporter,
everything works.
any suggestion?
thanks.
I have installed jest and jest-junit as devDependencies in my project. However when I try to run the command from the example, I get the following error.
● Validation Error: Module 'jest-junit' in the testResultsProcessor option was not found. Configuration Documentation: https://facebook.github.io/jest/docs/configuration.html
I am using the command
jest --ci --testResultsProcessor='jest-junit'
in the scripts section of my package.json. Please let me know if you need any additional information or can't reproduce the issue.
Whenever I run a single test via IntelliJ IDEA (also applies to WebStorm) the resulting junit.xml
is created in the directory where the test file exists instead of at the root of my project.
It would be great if "output"
supported something like Jest's "<rootDir>"
which several of its path-like options support (see https://facebook.github.io/jest/docs/en/configuration.html).
e.g. package.json snippet:
"jest-junit": {
"output": "<rootDir>/junit.xml"
}
"<rootDir>/junit.xml"
would also probably be a sensible default rather than "./junit.xml"
.
Thank you.
$ npm install --save-dev jest-junit
npm ERR! cb() never called!
anyone else running into this?
Considering the following console output
PASS __tests__\src\common\services\index.test.js
PASS __tests__\src\common\services\support.test.js
FAIL __tests__\src\features\product\routers\product.js
● Test suite failed to run
brand-engine\src\common\react-app\src\common\templates\cta.mustache:1
({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){<a class="hello" href="{{ href }}">{{ hrefText }}</a>
^
SyntaxError: Unexpected token <
4 | import FrameworkTemplate from '../../../common/framework-template';
5 |
> 6 | import * as cta from '../../../common/templates/cta.mustache';
7 |
8 | class Home extends React.Component {
9 | render() {
at ScriptTransformer._transformAndBuildScript (node_modules/jest-runtime/build/script_transformer.js:307:17)
at Object.<anonymous> (src/common/react-app/src/features/test/components/home.js:6:38)
at Object.<anonymous> (src/common/react-app/src/app.js:6:39)
PASS __tests__\src\common\framework-engine\index.test.js
There is no output in the junit.xml
referencing product.js
test suite providing no indication it failed. Everything else is in there as expected.
Hi,
I was wondering, why is uniqueOutputName
not a boolean option? Currently, it requires the string value 'true'
. When setting it to boolean true
, it does not work.
https://github.com/jest-community/jest-junit/blob/master/index.js#L28
Is this by design or a mistake?
I'm just curious, I can't find any examples or documentation on how to output the generated test-results.xml to a specific directory. Is this possible?
Recently console logging was implemented as part of 7.0.0 , We really like this feature and are about to add it to our test suite. However, we noticed that currently the logged object is unnecessarily long with redundant info, see below:
{
"message": "2019-07-31 15:02:50:360 WorkerID:1 \u001b[32minfo\u001b[39m: Generated headers for account \n",
"origin": "/Users/s/Documents/dev/qa-automation/node_modules/winston/lib/winston/transports/console.js:79",
"type": "log"
}
Instead it would be nice if only the message value is displayed in the logs, see below:
"2019-07-31 15:00:53:930 WorkerID:1 \u001b[32minfo\u001b[39m: Generated headers\n",
Another option would be provide a way to switch between the two options,e.g. full_console_log = true/false in jest-junit in case the full form has benefit for other users. I was able to get the shorttened logs by changing below line 77 in index.js
consoleBuffer[testResult.testFilePath] = testResult.console.map(item => item.message)
The shorter logging also has the benefit of smaller log file.
Appreciate any thoughts on the above.
I was trying to make time splitting to work on circle ci and addFileAttribute
does not work
jest-junit: ^9.0.0
I have this test file
describe('quick', () => {
it('takes 1 second to finish', async () => {
await new Promise(resolve => setTimeout(resolve, 1*1000)) })
})
and
reporters in jest:
reporters: [
'default',
[
'jest-junit',
{
outputDirectory: 'test-results/junit',
addFileAttribute: true,
},
],
],
the output I am getting:
<?xml version="1.0" encoding="UTF-8"?>
<testsuites name="jest tests" tests="1" failures="0" time="2.006">
<testsuite name="quick" errors="0" failures="0" skipped="0" timestamp="2019-11-28T09:37:09" time="1.711" tests="1">
<testcase classname="quick takes 1 second to finish" name="quick takes 1 second to finish" time="1.006">
</testcase>
</testsuite>
</testsuites>
i have my package.json as below:
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test --env=jsdom",
"test:cov": "yarn test -- --coverage",
"test:ci": "react-scripts test --env=jsdom --reporters=jest-junit ./node_modules/jest-junit --
coverage ",
"eject": "react-scripts eject",
"lint": "eslint src",
"dev": "node server & react-scripts start",
"jest-junit": {
"reporters":["jest-junit"],
"output": "./junit.xml",
"classNameTemplate": "{classname}-{title}",
"titleTemplate": "{classname}-{title}",
"ancestorSeparator": " › ",
"suiteNameTemplate": "{filename|filepath|ancestorTitles}",
"usePathForSuiteName": "true"
}
},
But junit-xml file still uses the default string present in describe() of test cases. can you help me how can i configure junit-xml file.
I would like to know if it would be possible to add more granularity in the junit.xml report. I would like to list the test step each test need to go through. So that, in my report, i could see all the step that happen and get the context right away if there is a failure. Is this something possible ?
I try to add assertion at each steps and also just do a test for each step. But it doesn't work. In the case of the assertion it only show the failed one. And for the later one, Jest does not guarantee the order in which a test is ran within a test suite.
I'm working on a project that has some custom tooling around running tests and being able consume junit output via stdout would make things a lot easier. Would you be interested in a PR to add an option to send output to stdout instead of a file?
If I pass these options based on the example in the README
// jest.config.js
{
reporters: [
"default",
[
"jest-junit",
{
a: 'b',
classNameTemplate: (vars) => {
throw new Error('fook');
return vars.classname.toUpperCase();
}
}
]
]
}
And I log the options in the JestJunit
constructor function, it logs this:
[ [ 'default', {} ],
[ '/Users/developer15/projects/scot.disclosure.digital-frontend/node_modules/jest-junit/index.js',
{ a: 'b' } ] ]
So the function gets blitzed because I guess JSON.stringify
is called somewhere.
Did this ever work?
It would be great if we could template the name of the output file.
That way projects that utilize yarn workspaces can set a single output dir with changing titles
"jest-junit": {
"output": "./test-{title}.xml",
}
I'm running some Jest tests multiple times with different environment options. I have several files that look like the following but with different config file names, etc.:
module.exports = {
name: "Windows 10 Chrome 62.0 1024x768",
displayName: "Windows 10 Chrome 62.0 1024x768",
testEnvironment: "<rootDir>/WebDriverEnvironment.js",
testEnvironmentOptions: {
serverUrl: "http://hub-cloud.browserstack.com/wd/hub",
capabilities: {
"os": "Windows",
"os_version": "10",
"browserName": "Chrome",
"browser_version": "62.0",
"resolution": "1024x768",
"browserstack.user": process.env.BROWSERSTACK_USER,
"browserstack.key": process.env.BROWSERSTACK_ACCESSKEY,
"browserstack.local": true,
}
}
};
They are each named something like remote-{platform}-{browser}-{resolution}.config.js
so I have a final config file to run them all:
jest.config.js
module.exports = {
globalSetup: "<rootDir>/global.setup.js",
globalTeardown: "<rootDir>/global.teardown.js",
setupTestFrameworkScriptFile: "<rootDir>/test-framework.setup.js",
projects: [
"<rootDir>/remote-*.config.js"
],
testResultsProcessor: "jest-junit"
};
The problem I am having though is that the junit.xml generated contains <testsuite name="undefined"...
😢
Would is be possible to use the displayName for each project as the testSuiteName? If not, maybe the config file name/path? Thanks.
See also https://facebook.github.io/jest/docs/en/configuration.html#projects-array-string-projectconfig
HI,
library throws an error if application is located in root directory.
Error: Unable to locate package.json starting at /
at getAppOptions (/node_modules/jest-junit/utils/getOptions.js:40:9)
at module.exports (/node_modules/jest-junit/utils/getOptions.js:44:55)
at module.exports (/node_modules/jest-junit/index.js:23:19)
I came across this error then tried to get report while running tests in docker container. There is a simple workaround this problem, which is changing working dir to non-root directory, so I'm not sure that it should be fixed.
The config option for classNameTemplate doesn't seem to work when using a function.
jest reporters:
reporters: [
'default',
[
'jest-junit',
{
classNameTemplate: vars => {
return vars.classname.toUpperCase();
},
},
],
]
test file (also tried wrapping with describe('App', () =>
):
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
it('renders without crashing', () => {
const div = document.createElement('div');
ReactDOM.render(<App />, div);
ReactDOM.unmountComponentAtNode(div);
});
junit.xml
<testsuites name="jest tests" tests="1" failures="0" time="1.175">
<testsuite name="undefined" errors="0" failures="0" skipped="0" timestamp="2018-08-15T22:18:04" time="0.495" tests="1">
<testcase classname=" renders without crashing" name=" renders without crashing" time="0.027">
</testcase>
</testsuite>
</testsuites>
Expected value of classname
to be uppercased.
However, it does work when using a string, eg:
<testsuites name="jest tests" tests="1" failures="0" time="1.191">
<testsuite name="undefined" errors="0" failures="0" skipped="0" timestamp="2018-08-15T22:19:05" time="0.494" tests="1">
<testcase classname="foo" name=" renders without crashing" time="0.027">
</testcase>
</testsuite>
</testsuites>
jest reporters:
reporters: [
'default',
[
'jest-junit',
{
classNameTemplate: 'foo',
},
],
]
Had an idea for a feature that I wanted to talk about before just trying to code something.
One of the disconnects between how this library and how JUnit seems to typically export test results is around the name of the testsuite. It seems that testsuites from typical maven executions (failsafe, surefire) use the filename as the name of the testsuite. Jest-junit is using either the descriptor assigned in the describe(...)
code blocks or the file path depending on the configuration. This makes our jest-junit reports look very different than our other JUnit test reports
It would be great to be able to specify either the default behavior (using the describe(...)
descriptor, using the file path or using the file name. An example might be:
"jest-junit" : {
"suiteNameTemplate": "{filename|filepath|ancestorTitles}"
}
This name would be similar to the other possible configuration values such as classNameTemplate
and titleTemplate
.
The biggest catch here would be to understand the behavior of using this proposed idea with the existing usePathForSuiteName
property. Maybe allow this property to override that existing value if set for a certain release number until potentially deprecating?
Let me know your thoughts!
In the code, I saw the ancestorTitles
are concatenated using a space. In Jest, by default they use the ›
character to concatenate the strings between hierarchies and I think it would be good to allow users to customize this character.
If you are agreeable with this I can create a PR to implement this. I'm thinking of implementing this through the env variable like how the class name template is done.
Hi there,
I use this project very successfully on our CI in combination with create-react-app;
yarn test -- --testResultsProcessor jest-junit
Now I was thinking if it is possible to add the code coverage report to the generated junit.xml? Thanks in advance for any help!
Cheers!
I need the test failures to report at the root element of the tree. Is there a way to report if a failure occurred on the root xml element?
Current:
<?xml version="1.0" encoding="UTF-8"?>
<testsuites>
<testsuite id="0" name="/app/src/Test.test.js" errors="0" package="/app/src/Test.test.js" hostname="localhost" tests="1" failures="0" time="0.192" timestamp="2018-02-02T16:16:46">
...
</testsuite>
<testsuite id="1" name="/app/src/App.test.js" errors="0" package="/app/src/App.test.js" hostname="localhost" tests="1" failures="0" time="0.353" timestamp="2018-02-02T16:16:46">
...
</testsuite>
</testsuites>
Desired:
<?xml version="1.0" encoding="UTF-8"?>
<testsuites failures="0">
<testsuite id="0" name="/app/src/Test.test.js" errors="0" package="/app/src/Test.test.js" hostname="localhost" tests="1" failures="0" time="0.192" timestamp="2018-02-02T16:16:46">
...
</testsuite>
<testsuite id="1" name="/app/src/App.test.js" errors="0" package="/app/src/App.test.js" hostname="localhost" tests="1" failures="0" time="0.353" timestamp="2018-02-02T16:16:46">
...
</testsuite>
</testsuites>
Notice the failures attribute on the first element.
Any help is appreciated.
If only specifying outputName
to change the name of the file, this value gets ignored.
This is because there's a strict check on outputDirectory
being null (which is the default value)
This can be confusing, as if you just want to rename the file, you wouldn't necessarily think about setting the directory as well.
I am currently seeing some issues running jest with the jest-junit reporter. I am getting a junit xml file back that is properly formatted but contains invalid data for instance I am seeing this:
<testsuite name="src/__tests__/Example.test.js" errors="0" failures="0" skipped="1" timestamp="2019-10-02T21:35:57" time="-11770557.774" tests="1">
<testcase classname="Example thing" name="Example thing" time="0.001">
<skipped/>
</testcase>
</testsuite>
Notice the time="-11770557.774"
bit and the fact that it can't possible have a negative number for the amount of time a test took.
This is just one example and at fist I thought it was just because the test was skipped and the timing was so close that the logic resulted in a rounding error or something similar. However it also appears on tests that are successful/failed.
That being said I looked at the code specifically this line: https://github.com/jest-community/jest-junit/blob/v8.0.0/utils/buildJsonResults.js#L84 and based on this logic it seems that the suite.perfStats.end
is equal to 0
otherwise I have no idea why/how the resulting return from the executionTime
function could ever really be negative.
I am not 100% certain this is an issue with the jest-junit or if the issue is really with jest itself, but I can't find any existing issues referencing this. Any guidance would be extremely helpful.
Version Details:
Hi,
I ran few test suites, most failed to run due to compilation error (test didnt actually ran). One suite ran successfully with 2 tests that passed.
The output .xml file reports 2 tests where both succeeded. Doesn't it make sense to report all the failing tests in the tests suites as failures (Even though they didn't run, they failed to compile)?
Yoni
If a unit test is written without an outer describe()
-- which by the way should be optional, then jest-junit
sets the testsuite name to undefined
.
There should be a way to configure using the test file path instead of the outermost describe()
.
Hello, I have setup my jest to use the jest config, however jest-junit is ignoring it and using all default values. However if I add it to the package.json it works. Is there something I need to do to have it point to the jest config and not the package.json?
I copied and pasted what was in the instructions
Jest CLI output:
at Object.<anonymous> (src/client/reducers/pages/xxx.test.js:1324:26
Jest-Junit output:
Local:
at Object.<anonymous> (/Users/joelbrenstrum/Development/Projects/xxx/xxx/src/client/reducers/pages/xxx.test.js:1324:26)
Azure Dev Ops:
Object.<anonymous> (/home/vsts/work/1/s/xxx/src/client/reducers/pages/xxx.test.js:1060:72)
Is it possible to get the relative path put into the stack trace?
We use Azure dev ops and these links generate as clickable but dont lead anywhere.
When I use the following command:
jest --testResultProcess ./node_modules/jest-junit --projects proj1 proj2
it fails because cannot find packages.json file. It's probably due to this line: https://github.com/palmerj3/jest-junit/blob/8e5a183aa034efeaf34def5b537136f2dcb63c32/utils/getOptions.js#L20
Could you make it optional or even better - find it based on testFilePath
@MRolandd currently jest does not differentiate between an "error" and a "failure" so currently that portion is unused.
It's a feature I've wanted to add to jest for a while and eventually will do - it's a bit complex of a change in jest to make that happen.
Originally posted by @palmerj3 in #85 (comment)
Ok, then it is a way to parse syntax errors from the code as failures? If I have a syntax error my log file is empty. Just with an empty
Would it be possible to use ancestors
as a way of defining nested testsuites?
Ideally, what I'd like to achieve:
describe
inside the file, if there's only one top-level describe
.describe
.describe
is their own nested testsuite, under the file testsuite.
describe
, they are nested under the parent describe
as a new testsuite.I'm wondering why jest --ci --testResultsProcessor="jest-junit"
is a deprecated pattern? It's super useful to set the results processor at the command line for CI environments (no need to have the junit file artifact generated when running tests locally).
outputDir
is invalid in the 8.0.0 changelog – it should say outputDirectory
.
When using junit report with java the classname contains the package name and the class name.
Tools like Jenkins CI assume this format and group test result by package name by using everything before the last .
in the classname as a package name.
When using junit-jest it would be useful to support mapping the file folder to the "package" name but /
would need to be replaced by .
.
This is currently not possible with the templates as string but could be achieved if the classNameTemplate would accept a javascript function taking as arguments an object with a poperty for each variables accepted by templates ( {classname}, {title}, {filepath}, {filename}, {displayName}) and return a string
the jestconfig could then look something like
module.exports = {
...baseConfig,
"reporters": [
["jest-junit", {
classNameTemplate: function (variables) {
const folder = variables.filepath.substr(0, variables.filepath.length - variables.filename.length)
return folder.replace(/\//g, '.');
}
}]
]
};
It could also be nice to have an additional filefolder
variable to avoid doing substrings in the function.
Thanks for the project!
I created a jest config file that looks like this:
{
\"globals\":{
\"src_dir\": \"$src_dir\",
\"src_ref_dir\":\"$src_ref_dir\"
},
\"reporters\": [
\"default\",
[ \"jest-junit\", {
\"suiteName\": \"tests\",
\"outputDirectory\": \"$user_dir/log\",
\"outputName\": \"log.xml\",
\"classNameTemplate\": \"{classname}\",
\"titleTemplate\": \"test_{title}\",
\"ancestorSeparator\": \" › \",
\"suiteNameTemplate\":\"MainTest\",
\"usePathForSuiteName\": \"false\"
} ]
],
\"testResultsProcessor\": \"jest-junit\"
}";
(I write it dynamically for each test).
and my jest exec cmd is : "$(npm bin)/jest --testRegex MainTest.js --findRelatedTests $test_file --config=$conf_file --globals --json --rootDir=$rootDir --notify 2>&1"
I tried different thing but couldn't get console.log to show an output. Something like PHPUnit has with
<system-out>output print</system-out>
in it's XML output.
Any solution?
PS: forgot to mantion. I want the console.log
to output from the file to be tested
, not from the test file
This makes the package unusable for us in a CI environment - test steps rely on an exit code of 1 to properly signal failure. Perhaps related to winterbe/jest-teamcity-reporter#6?
01:05 PM $ npm --version
3.10.9
01:05 PM $ node --version
v7.2.1
01:06 PM $ yarn --version
0.18.1
"jest": "^18.1.0"
With jest-junit
configured as the testResultsProcessor:
$ yarn run test:ci # translates to 'jest --coverage --runInBand'
Test Suites: 2 failed, 313 passed, 315 total
Tests: 3 failed, 1416 passed, 1419 total
Snapshots: 299 passed, 299 total
Time: 40.853s
Ran all test suites.
✨ Done in 42.16s.
$ echo $?
0
Without "testResultsProcessor": "./node_modules/jest-junit"
in my jest config:
$ yarn run test:ci # translates to 'jest --coverage --runInBand'
Test Suites: 2 failed, 313 passed, 315 total
Tests: 3 failed, 1416 passed, 1419 total
Snapshots: 299 passed, 299 total
Time: 36.84s, estimated 39s
Ran all test suites.
(node:64662) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 43): undefined
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
$ echo $?
1
This reporter works with the jest projects array but all that happens is the last project to run overwrites the file. I'd either like it to append to the original file or create separate files. Is there a way to do this?
Hi,
Jest now has the ability to specify multiple projects: https://jestjs.io/docs/en/configuration.html#projects-array-string-projectconfig
When I try to use this with jest-junit, I don't seem to have any junit files generated. No errors are thrown.
As a workaround, I'm running each project separately in CI with --config
settings, eg;
// package.json:
"jest": {
"projects": ["foo.jest.config.js", "bar.jest.config.js"]
}
// ci script:
JEST_JUNIT_OUTPUT=foo-tests.xml yarn jest --config foo.jest.config.js
JEST_JUNIT_OUTPUT=bar-tests.xml yarn jest --config bar.jest.config.js
// in development
yarn jest // runs both foo and bar
I haven't done any digging into why this may be happening.
Do you think this can be fixed?
Hi @palmerj3, thanks for you reporter.
Is there a reason why you require node >=5? I was trying to run in on node 4 (v4.8.0) and it worked too.
We have node 4 on our CI, and it would be great, if we could lower the required node in your package.json to 4.
Thanks!
How to display syntax errors in Junit log? Or exactly how does the <error>
tag appear? If I fail a test it is a <failure>
.
In PHP unit the <error>
tag appears when There is a syntax error
Error: Cannot find module './utils/buildJsonResults'
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.