krakenjs / adaro Goto Github PK
View Code? Open in Web Editor NEWA Dust.js view renderer for express
License: Other
A Dust.js view renderer for express
License: Other
I was using adaro with express and ran into an issue when I need to render HMTL emails using node-email-templates: https://github.com/niftylettuce/node-email-templates. Adaro/dust works great until after I render a single email. After rendering an email it seems that some global adaro/dust state gets corrupted and it is unable to render any of my regular view templates. node-email-templates uses consolidate so I replaced adaro with consolidate and everything works fine.
when call like this in controller,
var data = {
"key is not views,settings,ext":"run ok "
};
res.render('index', data);
if data has no properties like "views,settings,ext", it can run ok,
BUT,when data has these properties,like this
var data = {
name: 'test',
views: 'this is test string!',
settings: 'this is the data from models',
ext:'but it will not ok!'
};
res.render('index', data);
the programe will throw errors of 503.
I find these errors is caused by adaro\lib\engine.js,adaro\lib\utils.js, in which the above three properties is used as important parameters.
But these properties name can also be used as data for render. When your data has "views,settings,ext" properties name, the programe will core.
You can git checkout my test case to verify it.
After I updated dustjs modules in my Kraken application, I get following error while rendering the dust page:
TypeError: Cannot read property 'name' of undefined
at applied (/abc/GitRepo/sampleApp/node_modules/adaro/lib/patch/index.js:121:21)
at notApplied (/abc/GitRepo/sampleApp/node_modules/adaro/lib/patch/index.js:126:13)
at Object.apply (/abc/GitRepo/sampleApp/node_modules/adaro/lib/patch/index.js:113:13)
at View.engine (/abc/GitRepo/sampleApp/node_modules/adaro/lib/engine.js:92:15)
at View.render (/abc/GitRepo/sampleApp/node_modules/express/lib/view.js:93:8)
at EventEmitter.app.render (/abc/GitRepo/sampleApp/node_modules/express/lib/application.js:530:10)
at ServerResponse.res.render (/abc/GitRepo/sampleApp/node_modules/express/lib/response.js:933:7)
at ServerResponse.res.render (/abc/GitRepo/sampleApp/node_modules/logger/index.js:164:20)
at ServerResponse._analytics.res.render (/abc/GitRepo/sampleApp/node_modules/analytics-xxx/lib/node-analytics.js:172:16)
at serverError (/abc/GitRepo/sampleApp/node_modules/kraken-js/middleware/500.js:30:17)
These are my dustjs modules:
"dusthelpers-supplement": "^1.0.0",
"dustjs-helpers": "^1.7.3",
"dustjs-linkedin": "^2.7.0",
"ppdustjs-filters-secure": "0.0.2",
"grunt-dustjs": "^1.2.1"
My view engine configuration in config.json:
"view engines": {
"js": {
"module": "engine-munger",
"renderer": {
"method": "js",
"arguments": [
{ "cache": true, "helpers": [ "ppdustjs-filters-secure", "dustjs-helpers" ] },
{
"views": "config:express.views",
"view engine": "config:express.view engine",
"i18n": "config:i18n"
}
]
}
}
},
Any idea why adaro is throwing this error? Is there a specific dustjs version which needs to be used to resolve this error?
Problem is
krakenjs/kraken-js#371
Btw, unit test fails in this combination
But, this will pass
It would be nice if it was possible to add an option to initialize dust filters same as helpers.
I would like to configure this to use a .html file extension instead of .dust. Is this a possibility?
Perhaps package.json should include "dustjs-linkedin" and "dustjs-helpers" as dependencies, these are needed to use the module.
Or is it assumed people will add these dependencies themselves when they use adaro?
What is the need for Brook
for the streaming interface? I'm not understanding why we need to wrap a the provided dust Stream
with Brook
as it's not doing any sort of transformations, just buffering
After running npm update on my project a week or two ago i've been experiencing abnormalities with adaro cache, it simply won't refresh the views files after changes being made to them although it does refresh but only after stopping and starting nodejs again. I'm quite a amateur with nodejs and i'm confused where to start diagnosing for the issue's root.
Here's how adaro is configured on my project, already ensured that env is in development mode;
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'dust');
app.engine('dust', dustjs.dust({ cache: (app.get('env') == "production") ? true : false }));
express 4.12.2
adaro 2.0.0-1
Since there is no reaction to issues and / or PRs for some months I just wanted to know whether adaro is still being developed.
Just a quick heads-up in case anyone else falls on the same issue I had.
If you follow the Express doc, your definition of the views
folder probably looks something like this : app.set('views', process.cwd() + '/templates');
The string concatenation will ignore platform-specific rules and on Windows, your views path will look like this : c:\project\folder/templates
, which means nameify() will be unable to remove it from the file path, leading to errors like
Error: ENOENT, open 'c:\project\folder\templates\project\folder\templates\index.dust'
The easiest way to avoid this is to change
app.set('views', process.cwd() + '/templates');
into
app.set('views', path.join(process.cwd(), 'templates'});
, which will ensure your platform conventions will be respected.
NB: obviously you need to require the path node module before your app.set()
.
Eventually, utils.nameify() might try to catch that kind of issues and warn the user of their mistake.
If the file isn't a npm module, reqwire always require it using the current executable path.
This causes problems when we don't start the application in its root.
Ex: node /app/my-app/server
Hi all,
I cloned my app which runs fine, on a new server, and I get the following error on npm start, any idea where it could come from?
TypeError: Cannot read property 'name' of undefined at applied (/myApp/node_modules/adaro/lib/patch/index.js:121:21) at notApplied (/myApp/node_modules/adaro/lib/patch/index.js:126:13) at Object.apply (/myApp/node_modules/adaro/lib/patch/index.js:113:13) at View.engine (/myApp/node_modules/adaro/lib/engine.js:96:15) at View.render (/myApp/node_modules/express/lib/view.js:93:8) at EventEmitter.app.render (/myApp/node_modules/express/lib/application.js:566:10) at ServerResponse.res.render (/myApp/node_modules/express/lib/response.js:938:7) at /myApp/controllers/index.js:16:13 at Layer.handle [as handle_request] (/myApp/node_modules/express/lib/router/layer.js:82:5) at next (/myApp/node_modules/express/lib/router/route.js:110:13)
The line mentioned in index.js is :
res.render('index', model);
app.engine('dust', adaro.dust({
'whitespace': true
}));
app.set('view engine', 'dust');
This should disable whitespace compression, correct? Isn't doing so for me.
We are using the following kraken version: "kraken-js": "^1.0.3",
And we are seeing the following error:
2014-12-31 15:06 -06:00: TypeError: Cannot read property 'replace' of undefined
at Object.nameify (/opt/pm2/lq-mserver/source/node_modules/adaro/lib/utils.js:44:16)
at engine (/opt/pm2/lq-mserver/source/node_modules/adaro/lib/engine.js:116:22)
at View.proto.render (/opt/pm2/lq-mserver/source/node_modules/engine-munger/lib/expressView.js:45:9)
at EventEmitter.app.render (/opt/pm2/lq-mserver/source/node_modules/express/lib/application.js:530:10)
at ServerResponse.res.render (/opt/pm2/lq-mserver/source/node_modules/express/lib/response.js:904:7)
at serverError (/opt/pm2/lq-mserver/source/node_modules/kraken-js/middleware/500.js:30:17)
at serverError (eval at createToggleWrapper (/opt/pm2/lq-mserver/source/node_modules/kraken-js/node_modules/meddleware/index.js:1:0), <anonymous>:1:77)
at Layer.handle_error (/opt/pm2/lq-mserver/source/node_modules/express/lib/router/layer.js:58:5)
at trim_prefix (/opt/pm2/lq-mserver/source/node_modules/express/lib/router/index.js:269:13)
at /opt/pm2/lq-mserver/source/node_modules/express/lib/router/index.js:238:9
I took a look at the code
exports.nameify = function nameify(file, views, ext) {
// Windows. Ugh.
views = views && views.replace(CRAZY_SLASHES, '\\\\');
// Escape special characters in path
views = views && views.replace(REGEX_SPECIAL_CHARACTERS, "\\$&");
// Remove absolute path (if necessary)
file = file.replace(new RegExp('^' + views), '');
// Remove file extension
file = file.replace(ext, '');
// Remove leading slash or drive (platform-dependent, e.g. `c:\\` or '/');
file = exports.isAbsolutePath(file) ? file.replace(ROOT_DIR, '') : file;
// Remove remaining leading slashes (if not abs path).
file = file.replace(LEADING_SEPARATOR, '');
// Ensure path separators in name are all forward-slashes.
file = file.replace(ALL_SEPARATORS, '/');
return file;
};
and the line in question is
file = file.replace(new RegExp('^' + views), '');
So it appears that the file being passed in is undefined.
Any ideas how to further debug this?
Thanks,
bart
After upgrading to Node v10, Adaro causes Kraken to fail to start, given an issue with the freshy module
In the README.MD under the
cache (optional, defaults to true) Boolean
it reads:
app.engine('dust', dustjs.dust({ cache: false }));
app.set('view engine', 'dust');
However dustjs is not defined anywhere. Is that a typo and should it be
adaro.dust({ cache: false })
Currently it would be required to have a .properties file for each .dust file. Some files may get their content entirely from their data model, or else have no localizable content.
Hi,
I am not sure I am looking your documentation correctly for adding a new helper, do you have any examples from Kraken where I would be able to see a helper being added?
Thanks
I am facing this error while trying to access my application.
Whats going wrong?
Error:Invalid template [layouts/master]
Error: Invalid template [errors/500]
at /home/ubuntu/Desktop/click2call/node_modules/adaro/lib/reader/js.js:51:18
at /home/ubuntu/Desktop/click2call/node_modules/makara/lib/cache.js:68:13
at fs.js:266:14
at /home/ubuntu/Desktop/click2call/node_modules/makara/node_modules/graceful-fs/graceful-fs.js:103:5
at Object.oncomplete (fs.js:107:15)
Hi
Docs say you can do
var adaro = require('adaro'),
instance = adaro(options);
and those options can pass helpers. But it's not a case anymore, as export from adaro module is not a function. Either this
adaro.dust({ ... })
won't pass helpers, only way that seems working for me is
var dust = adaro.dust({});
dust.dust.helpers = ...
i couldn't get dust to work with express by calling:
var adaro = require('adaro');
app.engine('dust', adaro());
instead, i needed to call:
app.engine('dust', adaro.dust());
is this a documentation error?
Thank you for Kraken & Adaro. We are trying to migrate our stack.
A working "hello" example for Adaro would be really helpful. It would have helped me.
Also a notice on README about the problem with Dust 2.7.0 -- which I thankfully bumped into while reading every issue, open and close, hoping to find clues.
In my case I tried last week and wasted an hour trying to get Adaro to work and switched to Hoffman. Now that we have migrated to Dust we are looking at Kraken which meant I had to find out what I didn't "get" with Adaro. It took me another hour of frustration to ready every issue ever in Adaro, where, thankfully, I found #50.
It is not intuitive to think the problem is with the Dust library.
I am posting this issue to try and help the next developer.
Also, links on README to closed, but insightful issues are a big help. I think every project should have a list of "Interesting Issues". The don't even need to be introduced; just the links.
Thanks!
In a dust view I am able to something like this:
{>"widgets/sample":user/}
(pass the user variable to with partial at widgets/sample.
But I would like to do something like this:
{#zone_b}
{>"widgets/{.}":user/}
{/zone_b}
pass the user variable as the context into an iterpolated view.
Is there a way to acheive this?
We upgrading to Kraken 2.0, in our app we use dustjs to prerender multiple templates from different submodules. Before adaro 1.x we can require dustjs from everywhere and we can use it to render or compile different templates. Now adaro use freshy to create it own, separate instance of dustjs even if dustjs-linkedin installed in Kraken node_modules.
Not sure why it was done, but is there anyway to get adaro's dust instance with all helpers to use in app controller?
Is there a way to improve the stack trace in adaro? I am not able to determine what causing my issue? This only occurs once deployed and not locally.
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (http.js:691:11)
at ServerResponse.res.setHeader (/var/lib/openshift/53f40f114382ec37cc0005e8/app-root/runtime/repo/node_modules/connect-mongodb/node_modules/connect/lib/patch.js:62:20)
at ServerResponse.header (/var/lib/openshift/53f40f114382ec37cc0005e8/app-root/runtime/repo/node_modules/express/lib/response.js:717:10)
at ServerResponse.send (/var/lib/openshift/53f40f114382ec37cc0005e8/app-root/runtime/repo/node_modules/express/lib/response.js:146:12)
at fn (/var/lib/openshift/53f40f114382ec37cc0005e8/app-root/runtime/repo/node_modules/express/lib/response.js:951:10)
at Stub.callback (/var/lib/openshift/53f40f114382ec37cc0005e8/app-root/runtime/repo/node_modules/adaro/lib/engine.js:126:22)
at Stub.flush (/var/lib/openshift/53f40f114382ec37cc0005e8/app-root/runtime/repo/node_modules/dustjs-linkedin/lib/dust.js:457:10)
at Chunk.end (/var/lib/openshift/53f40f114382ec37cc0005e8/app-root/runtime/repo/node_modules/dustjs-linkedin/lib/dust.js:567:15)
at /var/lib/openshift/53f40f114382ec37cc0005e8/app-root/runtime/repo/node_modules/adaro/lib/patch/index.js:85:53
at /var/lib/openshift/53f40f114382ec37cc0005e8/app-root/runtime/repo/node_modules/adaro/lib/reader/js.js:39:13
I am trying to render localized email templates but its not working for me.
I have had a look at: krakenjs/kraken-js#157
Here is my code based on that issue.
var adaro = require('adaro');
adaro.render('./public/templates/emails/activation', {}, function(error, output){
if(error){
console.log(error);
}
else{
console.log(output);
}
});
The above code does not echo any result on the console.
Detailed answer would help :(
We are using [email protected] version which in turn depends on [email protected] this dependency path:
The [email protected] is a package reported with vulnerability.https://exchange.xforce.ibmcloud.com/vulnerabilities/167421
A higher version of Chokidar would be able to remove this vulnerability.
It would be highly appreciated if you could help in having proper versions of the dependency packages to overcome this issue.
I'd like pass an absolute path to a helper module (from within a subApp). Is this a bug or by design?
If I understand correctly, if I want to stream my views, I have to do the following:
res.render('index', {
"async": doSomethingAsync
}, function (err, stream) {
stream.pipe(res);
});
is there anyway the 3rd argument can be moved elsewhere so I don't have to repeat it for every time I call res.render?
Hello,
npm audit
detected a vulnerability in adaro:
=== npm audit security report ===
Manual Review
Some vulnerabilities require your attention to resolve
Visit https://go.npm.me/audit-guide for additional guidance
Low Regular Expression Denial of Service
Package braces
Patched in >=2.3.1
Dependency of adaro
Path adaro > dustjs-linkedin > chokidar > anymatch > micromatch >
braces
More info https://npmjs.com/advisories/786
found 1 low severity vulnerability in 6357 scanned packages
1 vulnerability requires manual review. See the full report for details.
Can the maintainers address this?
cc: @grawk @gabrielcsapo
I receive a version conflict error when deploying to Heroku.
When I specify the latest dustjs-linkedin version (2.3.x as of this writing) in my package.json, the build fails due to a conflicting version being specified in/required by Adaro (and Makara). Both of those require 2.0.x and prevent using the latest versions in context of a deployed heroku app.
Hi, sorry this is probably user error rather than an adaro problem with but I'm struggling to make it work, and might be a simple thing I'm missing.
I'm trying to render an object structure such as
{
name:"Home Page",
url: "/",
"sub-page1": {
name: "Sub Page 1",
url: "/sub-page1",
"sub-sub-page1": {
"name": "Sub Sub Page1",
"url": "/sub-page1/sub-sub-page1"
}
}
}
to something like
My current attempt looks like this, calling itself:
<li>
<a href="{url}">{name}</a>{#.}<ul>{>"components/menu/recurlist"/}</ul>{/.}
</li>
Hi,
I reopen a new issue for this, since the previous pull request was not valid (by breaking some test cases).
To summarize: I was trying to add the ability to choose your own custom extension (.html, .dust, etc), but I have finally discovered another issue.
If you initialize two engines:
adaro.dust
adaro.js
Then, the first one is always used.
If you want to render a template 'hello' with your second engine, instead of loading 'hello.js' it tries to load 'hello.dust'.
I think this is because of this test dust.load.name === 'cabbage'
which remains true between two engine instances, so the old reader is still used.
In the docs: "The layout includes a special partial with the dynamic name {_main}". When I generate a new app using Yeoman, the mechanism for inclusion is {+main}
I'm building an app using Express/Dust, and am trying to utilize Dust's asynchronous streaming interface. I discovered that Express and Dust don't play well together when it comes to asynchronous rendering, which where Adaro can help.
I'm now trying to implement Adaro into my app. However, I can't find any good examples of how to use Adaro. Are there any resources you could point me to, or could you provide any code samples?
When rending for many concurrent requests, patch/unpatch interleaving could cause inconsistent state causing rendering failure and app crashiness.
We use latest dust (2.6.2) and dust helpers (1.6.2) with adaro (0.1.8) in krakenjs (1.0.3)
When dust template has @eq
helper without @select
html output nothing:
Data:
sessionHelper = {
"seo": false,
"timestamp": 1428589929727,
"port": 3000,
"user": {}
}
This is works as expected:
{@select key=sessionHelper.seo}
{@eq value="false" type="boolean"}
<h1>Select + EQ: The this right</h1>
{:else}
<h1>Select + EQ: This this wrong</h1>
{/eq}
{/select}
output:
<h1>Select + EQ: The this right</h1>
And this DOES NOT output anything:
{@eq key=sessionHelper.seo value="false" type="boolean"}
<h1>EQ only: The this right</h1>
{:else}
<h1>EQ only: This this wrong</h1>
{/eq}
I thought this a dust issue, but rendering same code from controller with dust.comple and dust.render will output correct lines in both versions.
Also, I was trying to update adaro
to latest 2.0.0-x but it wont work with engine-munger
that requires "adaro": "~0.1.5"
Here is an example of working code in pure dust, it works as expected: http://jsfiddle.net/7x4z3766/
We are using adaro 2.0.0-4 with dustjs-linkedin 2.7.0 and dustjs-helpers 1.7.0
The webpage we are trying to render is a dust template and it renders fine... until we add a partial like this:
{>"/shared/page_ready" /}
Using the above partial throws the following error:
Template Not Found: /shared/page_ready
Error: Template Not Found: /shared/page_ready
at runChain (D:\nodeapps\exp0\node_modules\adaro\node_modules\dustjacket\index.js:56:47)
at args (D:\nodeapps\exp0\node_modules\adaro\node_modules\dustjacket\index.js:75:32)
at D:\nodeapps\exp0\node_modules\adaro\lib\engine.js:43:17
at fs.js:265:20
at FSReqWrap.oncomplete (fs.js:99:15)
Of course, the page_ready.dust
file exists in the [views_folder]/shared
folder.
Could you give us a hint about why this error is happening?
Thanks a lot
Alex
We have [email protected] with adaro@1.0.0-2 0.1.10 and [email protected]
On production, with pre compiled templates we have this error on some pages:
TypeError: Cannot read property 'substr' of undefined
at peg$parseraw (/home/gits/websites/antero/node_modules/dustjs-linkedin/lib/parser.js:2152:16)
at peg$parsepart (/home/gits/websites/antero/node_modules/dustjs-linkedin/lib/parser.js:410:12)
at peg$parsebody (/home/gits/websites/antero/node_modules/dustjs-linkedin/lib/parser.js:393:12)
at peg$parsestart (/home/gits/websites/antero/node_modules/dustjs-linkedin/lib/parser.js:383:12)
at parse (/home/gits/websites/antero/node_modules/dustjs-linkedin/lib/parser.js:2691:18)
at Object.compiler.compile (/home/gits/websites/antero/node_modules/dustjs-linkedin/lib/compiler.js:30:27)
at /home/gits/websites/antero/node_modules/adaro/lib/patch/index.js:82:64
at /home/gits/websites/antero/node_modules/adaro/lib/reader/js.js:39:13
at fs.js:336:14
at /home/gits/websites/antero/node_modules/engine-munger/node_modules/graceful-fs/graceful-fs.js:104:5
Here is template:
{>"layouts/masterNew" /}
{<css_local}
<link rel="stylesheet" href="/css/bootstrap-datetimepicker.min.css">
{/css_local}
{<body}
{#item}
.... removed ...
{/item}
{/body}
{<scripts_local}
.... removed ...
{/scripts_local}
The problem in those lines
{<css_local}
<link rel="stylesheet" href="/css/bootstrap-datetimepicker.min.css">
{/css_local}
if I change there word: stylesheet to stylesheets error wont happen.
Again, this only happens with templates after they compiled, in dev env no errors.
Please help.
Hi,
I've recently migrated from engine-munger to makara and noticed some of my dust helpers don't work anymore. I've finally ended up in adaro which seems to reproduce my issue:
Here is the test using [email protected]
only which works as expected:
var dust = require('dustjs-linkedin');
dust.helpers.foo = function (chunk, ctx, bodies, params) {
chunk.write('[');
chunk.render(bodies.block, ctx);
chunk.write(']');
return chunk;
};
var helloTmpl = dust.compile('Hello world', 'hello');
dust.loadSource(helloTmpl);
var testTmpl = dust.compile('Test: {@foo}{>"hello"/}{/foo}!', 'test');
dust.loadSource(testTmpl);
dust.render('test', { }, function (err, res) {
console.log(err, res);
});
// null 'Test: [Hello world]!'
Now with [email protected]
, I define the two views:
{! templates/hello.dust !}
Hello world
{! templates/test.dust !}
Test: {@foo}{>"hello"/}{/foo}!
And the test app:
var express = require('express');
var app = express();
var adaro = require('adaro');
var options = {
cache: false,
helpers: [
function (dust) {
dust.helpers.foo = function (chunk, ctx, bodies, params) {
chunk.write('[');
chunk.render(bodies.block, ctx);
chunk.write(']');
return chunk;
}
}
]
};
app.engine('dust', adaro.dust(options));
app.set('view engine', 'dust');
app.set('views', 'templates');
app.get('/*', function (req, res) {
res.render(req.path.substr(1));
});
server = app.listen(3000, function () {
console.log('listening');
});
# node test.js
listening
# curl http://localhost:3000/hello
Hello world
# curl http://localhost:3000/test
Here the second request is somehow in a "waiting" state and nothing is sent back
It can only be reproduced when a partial is inside a helper section.
This line in my code throws:
app.engine('dust', adaro.dust({}));
Error:
โ Test suite failed to run
TypeError: require.cache.hasOwnProperty is not a function
at unload (node_modules\freshy\index.js:54:23)
at getFresh (node_modules\freshy\index.js:20:5)
at node_modules\freshy\index.js:94:19
at exports.create (node_modules\adaro\lib\engine.js:43:16)
at Object.<anonymous> (app.js:53:26)
at Object.<anonymous> (__tests__\one.test.js:8:11)
Why does it happen? How to solve?
Adaro's documentation needs some serious work, IMO.
For starters - could someone please provide a simple, fully-functional example that demonstrates the use of layouts within the context of an Express application that doesn't use Kraken? Nothing I've tried seems to work.
You start off by talking about requiring adaro
and passing it to Express with various options for defining helpers, etc... Great, I'm with you. Afterwards, when you begin discussing layouts, you reference the dust.render()
method. Isn't the point of adaro to provide integration with Express via res.render()
? And where did the dust
var come from to begin with? It's not explained at all. Did you require dustjs-linked
? And this layout
option... Are we supposed to pass that into the initial factory method - adaro.dust()
? Or are we supposed to pass that for each individual render call?
Take this for example:
dust.render('index', { layout: 'myLayout' }, ...);
What exactly is ...
? This is not explained. Does the second parameter get passed to the template as a context? Or do we have to pass in another object for that?
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.