gryffon / ringteki Goto Github PK
View Code? Open in Web Editor NEWBrowser based Legend of the Five Rings LCG
Home Page: https://jigoku.online
License: MIT License
Browser based Legend of the Five Rings LCG
Home Page: https://jigoku.online
License: MIT License
Instead of the game passing the uuid of facedown cards to the client, it passes their location. This shouldn't give any additional information to nefarious players, as they know the location of whatever they clicked.
It means changing the client side clicking function to pass uuid normally, or location when uuid is unknown (actually, passing both is probably easier and less likely to cause bugs), and then changing the click handler in Game and getting it to intercept locations and substitute the appropriate uuid.
Thoughts?
If you click on 'Show' in the menu of either Conflict or Dynasty deck, the resulting Popup window is positioned below the deck (instead of above it) and it's laid out as a 1 by the number of cards in the deck.
Let's look into what it would take to get rid of these warnings:
npm WARN deprecated [email protected]: We're super 😸 excited that you're trying to use ES2015 syntax, but instead of making more yearly presets 😭 , Babel now has a better preset that we recommend you use instead: npm install babel-preset-env --save-dev. preset-env without options will compile ES2015+ down to ES5 just like using all the presets together and thus is more future proof. It also allows you to target specific browsers so that Babel can do less work and you can ship native ES2015+ to user 😎 ! We are also in the process of releasing v7, so please give http://babeljs.io/blog/2017/09/12/planning-for-7.0 a read and help test it out in beta! Thanks so much for using Babel 🙏, please give us a follow on Twitter @babeljs for news on Babel, join slack.babeljs.io for discussion/development and help support the project at opencollective.com/babel
npm WARN deprecated [email protected]: Package renamed to phantomjs-prebuilt. Please update 'phantomjs' package references to 'phantomjs-prebuilt'
npm WARN deprecated [email protected]: All versions below 4.0.1 of Nodemailer are deprecated. See https://nodemailer.com/status/
npm WARN deprecated [email protected]: ReDoS vulnerability parsing Set-Cookie https://nodesecurity.io/advisories/130
npm WARN deprecated [email protected]: Use uuid module instead
We have the ability to track fate on ring tokens, however, it ends up centering the display of said tokens, so it's not currently useful for an actual count.
This can be seen in-game by using the /add-fate-ring command, eg; /add-fate-ring air 1
Cards with attachments aren't spaced far enough apart.
2017-09-21T05:38:16.158Z - error: TypeError: Cannot read property 'each' of undefined
at Player.moveCard (/home/debian/node-1/server/game/player.js:999:29)
at Player.drop (/home/debian/node-1/server/game/player.js:813:18)
at Game.drop (/home/debian/node-1/server/game/game.js:353:19)
at runAndCatchErrors (/home/debian/node-1/server/gamenode/gameserver.js:337:26)
at GameServer.runAndCatchErrors (/home/debian/node-1/server/gamenode/gameserver.js:116:13)
at GameServer.onGameMessage (/home/debian/node-1/server/gamenode/gameserver.js:336:14)
at Socket.onSocketEvent (/home/debian/node-1/server/socket.js:51:13)
at emitMany (events.js:146:13)
at Socket.emit (events.js:223:7)
at /home/debian/node-1/node_modules/socket.io/lib/socket.js:503:12
at _combinedTickCallback (internal/process/next_tick.js:131:7)
at process._tickDomainCallback (internal/process/next_tick.js:218:9)
/home/debian/node-1/node_modules/raven/lib/client.js:159
kwargs.user = extend({}, this._globalContext.user, domainContext.user, kwargs.user);
^
TypeError: Cannot read property 'user' of undefined
at Raven.process (/home/debian/node-1/node_modules/raven/lib/client.js:159:49)
at /home/debian/node-1/node_modules/raven/lib/client.js:255:12
at /home/debian/node-1/node_modules/raven/lib/parsers.js:52:5
at /home/debian/node-1/node_modules/raven/lib/utils.js:211:30
at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:504:3)
Seeing odd card placement and delayed card frames on chromebook
2017-09-20T14:26:30.161Z - error: TypeError: context.source.play is not a function
at PlayCardAction.executeHandler (/home/debian/node-1/server/game/playcardaction.js:25:24)
at EventWindow.game.raiseEvent [as handler] (/home/debian/node-1/server/game/gamesteps/abilityresolver.js:130:30)
at EventWindow.executeHandler (/home/debian/node-1/server/game/gamesteps/eventwindow.js:84:18)
at SimpleStep.EventWindow.pipeline.initialise.SimpleStep [as continueFunc] (/home/debian/node-1/server/game/gamesteps/eventwindow.js:19:45)
at SimpleStep.continue (/home/debian/node-1/server/game/gamesteps/simplestep.js:10:21)
at GamePipeline.continue (/home/debian/node-1/server/game/gamepipeline.js:91:36)
at EventWindow.continue (/home/debian/node-1/server/game/gamesteps/eventwindow.js:46:38)
at GamePipeline.continue (/home/debian/node-1/server/game/gamepipeline.js:91:36)
at AbilityResolver.continue (/home/debian/node-1/server/game/gamesteps/abilityresolver.js:52:42)
at GamePipeline.continue (/home/debian/node-1/server/game/gamepipeline.js:91:36)
at DrawPhase.continue (/home/debian/node-1/server/game/gamesteps/phase.js:40:38)
at GamePipeline.continue (/home/debian/node-1/server/game/gamepipeline.js:91:36)
at Game.continue (/home/debian/node-1/server/game/game.js:866:31)
at runAndCatchErrors (/home/debian/node-1/server/gamenode/gameserver.js:339:26)
at GameServer.runAndCatchErrors (/home/debian/node-1/server/gamenode/gameserver.js:116:13)
at GameServer.onGameMessage (/home/debian/node-1/server/gamenode/gameserver.js:336:14)
at Socket.onSocketEvent (/home/debian/node-1/server/socket.js:51:13)
at emitTwo (events.js:125:13)
at Socket.emit (events.js:213:7)
at /home/debian/node-1/node_modules/socket.io/lib/socket.js:503:12
at _combinedTickCallback (internal/process/next_tick.js:131:7)
at process._tickDomainCallback (internal/process/next_tick.js:218:9)
/home/debian/node-1/node_modules/raven/lib/client.js:159
kwargs.user = extend({}, this._globalContext.user, domainContext.user, kwargs.user);
^
TypeError: Cannot read property 'user' of undefined
at Raven.process (/home/debian/node-1/node_modules/raven/lib/client.js:159:49)
at /home/debian/node-1/node_modules/raven/lib/client.js:255:12
at /home/debian/node-1/node_modules/raven/lib/parsers.js:52:5
at /home/debian/node-1/node_modules/raven/lib/utils.js:211:30
at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:504:3)
When trying to access jigoku.online, I get a DreamHost error page with the following text:
Well, this is awkward. The site you're looking for is not here.
Is this your site? Get more info or contact support.
In the span of 10 mins I have shown up in the chat log as 2 different users, neither of which were me.
Clicking on a province can break the province and if it's face down reveal what it is.
Need to be a little more determinate about when this happens.
Lobby server seems to be dropping people and reconnecting
/home/debian/ringteki/server/lobby.js:121
return user.name.toLowerCase();
^
TypeError: Cannot read property 'toLowerCase' of undefined
at .sortBy.user (/home/debian/ringteki/server/lobby.js:121:29)
at /home/debian/ringteki/node_modules/underscore/underscore.js:380:19
at Function..map..collect (/home/debian/ringteki/node_modules/underscore/underscore.js:172:24)
at Function..sortBy (/home/debian/ringteki/node_modules/underscore/underscore.js:376:22)
at Lobby.getUserList (/home/debian/ringteki/server/lobby.js:120:22)
at Lobby.broadcastUserList (/home/debian/ringteki/server/lobby.js:182:45)
at Lobby.onAuthenticated (/home/debian/ringteki/server/lobby.js:260:14)
at emitTwo (events.js:125:13)
at Socket.emit (events.js:213:7)
at jwt.verify (/home/debian/ringteki/server/socket.js:67:18)
at /home/debian/ringteki/node_modules/jsonwebtoken/verify.js:27:18
at _combinedTickCallback (internal/process/next_tick.js:131:7)
at process._tickDomainCallback (internal/process/next_tick.js:218:9)
Broken province only seems to bow instead of be 180 degrees
References card types like "Plot Cards" and "Agendas"
Just trying to debug some of the things we're seeing with the server
Error: listen EACCES 0.0.0.0:80
at Object._errnoException (util.js:1041:11)
at _exceptionWithHostPort (util.js:1064:20)
at Server.setupListenHandle [as _listen2] (net.js:1305:19)
at listenInCluster (net.js:1370:12)
at doListen (net.js:1492:7)
at _combinedTickCallback (internal/process/next_tick.js:141:11)
at process._tickDomainCallback (internal/process/next_tick.js:218:9)
at Function.Module.runMain (module.js:611:11)
at startup (bootstrap_node.js:158:16)
at bootstrap_node.js:598:3
Character leaving play should reset honored status
bug report from discord
While cards seem to be pulling most keywords correctly from the database, unique doesn't work.
It might be because it's called unicity or something?
After finishing a conflict, a new action window does not happen.
When viewing the province deck, the top card of the deck stays in hidden mode in the display.
Error: Argument passed in must be a single String of 12 bytes or a string of 24 hex characters
at Function.createFromHexString (/home/debian/ringteki/node_modules/bson/lib/bson/objectid.js:289:11)
at /home/debian/ringteki/server/api/decks.js:17:56
at Layer.handle [as handle_request] (/home/debian/ringteki/node_modules/express/lib/router/layer.js:95:5)
at next (/home/debian/ringteki/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/home/debian/ringteki/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/home/debian/ringteki/node_modules/express/lib/router/layer.js:95:5)
at /home/debian/ringteki/node_modules/express/lib/router/index.js:281:22
at param (/home/debian/ringteki/node_modules/express/lib/router/index.js:354:14)
at param (/home/debian/ringteki/node_modules/express/lib/router/index.js:365:14)
at Function.process_params (/home/debian/ringteki/node_modules/express/lib/router/index.js:410:3)
at next (/home/debian/ringteki/node_modules/express/lib/router/index.js:275:10)
at urlencodedParser (/home/debian/ringteki/node_modules/body-parser/lib/types/urlencoded.js:91:7)
at Layer.handle [as handle_request] (/home/debian/ringteki/node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/home/debian/ringteki/node_modules/express/lib/router/index.js:317:13)
at /home/debian/ringteki/node_modules/express/lib/router/index.js:284:7
at Function.process_params (/home/debian/ringteki/node_modules/express/lib/router/index.js:335:12)
at next (/home/debian/ringteki/node_modules/express/lib/router/index.js:275:10)
at jsonParser (/home/debian/ringteki/node_modules/body-parser/lib/types/json.js:103:7)
at Layer.handle [as handle_request] (/home/debian/ringteki/node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/home/debian/ringteki/node_modules/express/lib/router/index.js:317:13)
at /home/debian/ringteki/node_modules/express/lib/router/index.js:284:7
at Function.process_params (/home/debian/ringteki/node_modules/express/lib/router/index.js:335:12)
at next (/home/debian/ringteki/node_modules/express/lib/router/index.js:275:10)
at cookieParser (/home/debian/ringteki/node_modules/cookie-parser/index.js:70:5)
at Layer.handle [as handle_request] (/home/debian/ringteki/node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/home/debian/ringteki/node_modules/express/lib/router/index.js:317:13)
at /home/debian/ringteki/node_modules/express/lib/router/index.js:284:7
at Function.process_params (/home/debian/ringteki/node_modules/express/lib/router/index.js:335:12)
at next (/home/debian/ringteki/node_modules/express/lib/router/index.js:275:10)
at SessionStrategy.strategy.pass (/home/debian/ringteki/node_modules/passport/lib/middleware/authenticate.js:325:9)
at /home/debian/ringteki/node_modules/passport/lib/strategies/session.js:65:12
at pass (/home/debian/ringteki/node_modules/passport/lib/authenticator.js:327:31)
at deserialized (/home/debian/ringteki/node_modules/passport/lib/authenticator.js:339:7)
at userService.getUserById.then.user (/home/debian/ringteki/server/server.js:193:17)
at
at process._tickDomainCallback (internal/process/next_tick.js:228:7)
The extra fate for going second doesn't appear to be happening
/home/debian/ringteki/node_modules/config/lib/config.js:925
throw new Error("Cannot parse config file: '" + fullFilename + "': " + e3);
^
Error: Cannot parse config file: '/home/debian/ringteki/config/default.json5': SyntaxError: Expected '}' instead of 'c'
at Config.util.parseFile (/home/debian/ringteki/node_modules/config/lib/config.js:925:11)
at /home/debian/ringteki/node_modules/config/lib/config.js:696:28
at Array.forEach ()
at /home/debian/ringteki/node_modules/config/lib/config.js:692:14
at Array.forEach ()
at Config.util.loadFileConfigs (/home/debian/ringteki/node_modules/config/lib/config.js:691:13)
at new Config (/home/debian/ringteki/node_modules/config/lib/config.js:122:27)
at Object. (/home/debian/ringteki/node_modules/config/lib/config.js:1749:31)
at Module._compile (module.js:573:30)
at Object.Module._extensions..js (module.js:584:10)
at Module.load (module.js:507:32)
at tryModuleLoad (module.js:470:12)
at Function.Module._load (module.js:462:3)
at Module.require (module.js:517:17)
at require (internal/module.js:11:18)
at Object. (/home/debian/ringteki/server/server.js:7:16)
Look into replacing the first player text box with the token image.
Feature request as title
The user list does not appear to be showing all logged in users. This may be a red herring, due to the login issue we're seeing.
The role card needs to be added to the deck information.
Additionally, the deck summary should include what role the deck has.
While cards are not implemented, need a way to specify that a manual action was taken
It's been asked that the zoom card be made bigger.
Chat seems to be trying to display symbols for elements (e.g. when adding fate to a ring), but just shows a square box.
The unit tests desperately need to be cleaned up.
This will be very beneficial, in that the CI results will actually become more meaningful.
Going though the Going through the tests, I'm finding some consistency issues in where the correct data for certain card attributes is located. For example, in drawcard.getsummary.spec.js, the test thinks that setting the card's 'militaryskill' attribute is correct, but getSummary() actually uses an attribute that is part of 'cardData', which is itself an attribute of the original card.
It doesn't really matter either way, but which one of those do we want to be correct? I'm honestly a big fan of never using the cardData attribute for anything once the card has been initialized, but it's a big enough change I want to give people a chance to weigh in.
When dragging an attached attachment to the discard pile, it does not appear to remove the card from play as an attachment.
The text entry boxes on the site need to have their css updated so as not to blend in with the background so much.
Conflict resolution/skill is not taking into account attachments or honor status
The stronghold is currently unable to be bowed. It likely needs the onClick for the Province type updated.
While we are currently doing all of the actions required of setup, some of them are not happening int he correct order.
Posting "Setup" from the RRG for easy reference:
Setup
To set up a game, perform the following steps in order:
Of note;
ReferenceError: _ is not defined
at app.get (/home/debian/ringteki/server/server.js:119:28)
at Layer.handle [as handle_request] (/home/debian/ringteki/node_modules/express/lib/router/layer.js:95:5)
at next (/home/debian/ringteki/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/home/debian/ringteki/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/home/debian/ringteki/node_modules/express/lib/router/layer.js:95:5)
at /home/debian/ringteki/node_modules/express/lib/router/index.js:281:22
at param (/home/debian/ringteki/node_modules/express/lib/router/index.js:354:14)
at param (/home/debian/ringteki/node_modules/express/lib/router/index.js:365:14)
at Function.process_params (/home/debian/ringteki/node_modules/express/lib/router/index.js:410:3)
at next (/home/debian/ringteki/node_modules/express/lib/router/index.js:275:10)
at middleware (/home/debian/ringteki/node_modules/webpack-hot-middleware/middleware.js:26:48)
at Layer.handle [as handle_request] (/home/debian/ringteki/node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/home/debian/ringteki/node_modules/express/lib/router/index.js:317:13)
at /home/debian/ringteki/node_modules/express/lib/router/index.js:284:7
at Function.process_params (/home/debian/ringteki/node_modules/express/lib/router/index.js:335:12)
at next (/home/debian/ringteki/node_modules/express/lib/router/index.js:275:10)
at goNext (/home/debian/ringteki/node_modules/webpack-dev-middleware/middleware.js:27:49)
at processRequest (/home/debian/ringteki/node_modules/webpack-dev-middleware/middleware.js:66:21)
at continueBecauseBundleAvailable (/home/debian/ringteki/node_modules/webpack-dev-middleware/lib/Shared.js:139:6)
at Array.forEach ()
at /home/debian/ringteki/node_modules/webpack-dev-middleware/lib/Shared.js:138:9
at _combinedTickCallback (internal/process/next_tick.js:131:7)
at process._tickDomainCallback (internal/process/next_tick.js:218:9)
ReferenceError: _ is not defined
at app.get (/home/debian/ringteki/server/server.js:119:28)
at Layer.handle [as handle_request] (/home/debian/ringteki/node_modules/express/lib/router/layer.js:95:5)
at next (/home/debian/ringteki/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/home/debian/ringteki/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/home/debian/ringteki/node_modules/express/lib/router/layer.js:95:5)
at /home/debian/ringteki/node_modules/express/lib/router/index.js:281:22
at param (/home/debian/ringteki/node_modules/express/lib/router/index.js:354:14)
at param (/home/debian/ringteki/node_modules/express/lib/router/index.js:365:14)
at Function.process_params (/home/debian/ringteki/node_modules/express/lib/router/index.js:410:3)
at next (/home/debian/ringteki/node_modules/express/lib/router/index.js:275:10)
at middleware (/home/debian/ringteki/node_modules/webpack-hot-middleware/middleware.js:26:48)
at Layer.handle [as handle_request] (/home/debian/ringteki/node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/home/debian/ringteki/node_modules/express/lib/router/index.js:317:13)
at /home/debian/ringteki/node_modules/express/lib/router/index.js:284:7
at Function.process_params (/home/debian/ringteki/node_modules/express/lib/router/index.js:335:12)
at next (/home/debian/ringteki/node_modules/express/lib/router/index.js:275:10)
at middleware (/home/debian/ringteki/node_modules/webpack-hot-middleware/middleware.js:26:48)
at Layer.handle [as handle_request] (/home/debian/ringteki/node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/home/debian/ringteki/node_modules/express/lib/router/index.js:317:13)
at /home/debian/ringteki/node_modules/express/lib/router/index.js:284:7
at Function.process_params (/home/debian/ringteki/node_modules/express/lib/router/index.js:335:12)
at next (/home/debian/ringteki/node_modules/express/lib/router/index.js:275:10)
at goNext (/home/debian/ringteki/node_modules/webpack-dev-middleware/middleware.js:27:49)
at processRequest (/home/debian/ringteki/node_modules/webpack-dev-middleware/middleware.js:66:21)
at continueBecauseBundleAvailable (/home/debian/ringteki/node_modules/webpack-dev-middleware/lib/Shared.js:139:6)
at Array.forEach ()
at /home/debian/ringteki/node_modules/webpack-dev-middleware/lib/Shared.js:138:9
at _combinedTickCallback (internal/process/next_tick.js:131:7)
at process._tickDomainCallback (internal/process/next_tick.js:218:9)
Deckbuilder complains about invalid cards. Not familiar with _.js but _.each syntax, but based on chrome debugger; check should be for card.card.type. Deck will return a card object, which then has card attribute, which then has a type attribute.
Suggest changing the iterator variable, to something else to avoid confusion.
client\deck-validator.js
`
var stronghold = getStronghold(deck.stronghold);
function getStronghold(deck) {
var stronghold;
_.each(deck, card => {
if(card.type === 'stronghold')
{
stronghold = card;
}
});
return stronghold;
}
`
Another section of code has the correct addressing
//Ensure one province of each element _.each(deck.provinceCards, card => { if(card.card.element === 'air') {
Dragging a card into play from your hand or either deck, or completing setup and clicking a card in a province breaks the chat box, and stops players sending messages, or game generated messages from appearing.
Need to check that fate is being assigned properly when passing in Dynasty
The action window defaults need to be updated on the profile page to be specific to L5R
timeout
2017-09-20T22:29:18.593Z - info: user 'Sideshow' disconnected from a game: ping timeout
2017-09-20T22:29:18.861Z - info: user 'Sideshow' disconnected from a game: ping timeout
2017-09-20T22:29:43.492Z - info: user 'Sideshow' reconnected to game
2017-09-20T22:30:35.239Z - info: No game for Jadiel disconnecting
2017-09-20T22:30:38.491Z - info: user 'Sideshow' disconnected from a game: ping timeout
2017-09-20T22:30:38.930Z - info: user 'Sideshow' disconnected from a game: ping timeout
2017-09-20T22:30:39.436Z - info: user 'Sideshow' disconnected from a game: ping timeout
I do not know if it is intended, but the game immediately moves to graying out the screen and ring selection after a player selects whether to resolve a ring. It seems very confusing to zoom past the pre-conflict action window between every conflict since there was one given right after the draw phase.
When mousing over the province card, it doesn't show up as the zoom card
2017-09-20T23:43:50.958Z - info: TypeError: Cannot read property 'disableGravatar' of undefined
at _.reduce (/home/debian/ringteki/server/game/gamechat.js:28:101)
at iterator (/home/debian/ringteki/node_modules/underscore/underscore.js:184:16)
at Function. (/home/debian/ringteki/node_modules/underscore/underscore.js:199:14)
at GameChat.addMessage (/home/debian/ringteki/server/game/gamechat.js:22:18)
at PendingGame.addMessage (/home/debian/ringteki/server/pendinggame.js:62:23)
at PendingGame.chat (/home/debian/ringteki/server/pendinggame.js:210:14)
at Lobby.onPendingGameChat (/home/debian/ringteki/server/lobby.js:426:14)
at Socket.onSocketEvent (/home/debian/ringteki/server/socket.js:51:13)
at emitOne (events.js:115:13)
at Socket.emit (events.js:210:7)
at /home/debian/ringteki/node_modules/socket.io/lib/socket.js:503:12
at _combinedTickCallback (internal/process/next_tick.js:131:7)
at process._tickDomainCallback (internal/process/next_tick.js:218:9)
/home/debian/ringteki/node_modules/raven/lib/client.js:159
kwargs.user = extend({}, this._globalContext.user, domainContext.user, kwargs.user);
^
TypeError: Cannot read property 'user' of undefined
at Raven.process (/home/debian/ringteki/node_modules/raven/lib/client.js:159:49)
at /home/debian/ringteki/node_modules/raven/lib/client.js:255:12
at /home/debian/ringteki/node_modules/raven/lib/parsers.js:52:5
at /home/debian/ringteki/node_modules/raven/lib/utils.js:211:30
at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:504:3)
Mousing over cards or provinces that are on the board does not result in the zoomed view in the upper right hand cover
Second player has first action in Dynasty phase
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.