ruimarinho / google-libphonenumber Goto Github PK
View Code? Open in Web Editor NEWThe up-to-date and reliable Google's libphonenumber package for node.js.
Home Page: https://ruimarinho.github.io/google-libphonenumber
License: Other
The up-to-date and reliable Google's libphonenumber package for node.js.
Home Page: https://ruimarinho.github.io/google-libphonenumber
License: Other
If you take a look at the google tests, you can see that you are able to access a RegionCode dictionary right off of the main lib. However, this comes back undefined:
> var libphonenumber = require('google-libphonenumber')
undefined
> libphonenumber.RegionCode
undefined
Any thoughts on how this is missing?
Hello,
would it be possible/feasible/allowable/... to pass a flag to choose if we want to throw an error or receive an error string (ideally in an 'err' property)?
I'm using your package in the sync validate function of redux-forms and i need to try...catch every time to not destroy what the user is typing when i could use the error string to show the error with internationalization when the user corrects his input.
I would like to use the AsYouTypeFormatter functionality of libphonenumber.
However, calling libphonenumber.phoneUtil.getAsYouTypeFormatter('US')
fails with undefined is not a function
error. Is it not exported?
/app/node_modules/google-libphonenumber/src/phonenumberutil.js:45: ERROR - 'i18n.phonenumbers.PhoneMetadataCollection' goog.require'd but not used
goog.require('i18n.phonenumbers.PhoneMetadataCollection');
^
1 error(s), 0 warning(s)
PhoneNumberUtil phUtil = PhoneNumberUtil.getInstance();
PhoneNumber number1, number2;
number1 = phUtil.parse("1-800-456-1414", "US"); // works fine
number2 = phUtil.parse("1-800-100-8731", "US");
PhoneNumberType pnType = phUtil.getNumberType(number2);
For number1
, I get TOLL_FREE, but for number2
, I get UNKNOWN.
Any idea why?
Is ist possible to use the other native features such as isValidNumber, PhoneNumberOfflineGeocoder, PhoneNumberToCarrierMapper with google-libphonenumber?
I'm getting the following exception when using:
phoneUtil.getNumberType('4477516575751')
Error:
Error: Uncaught (in promise): TypeError: a.getCountryCodeOrDefault is not a function
TypeError: a.getCountryCodeOrDefault is not a function
at i18n.phonenumbers.PhoneNumberUtil.getRegionCodeForNumber (libphonenumber.js:4269)
at i18n.phonenumbers.PhoneNumberUtil.getNumberType (libphonenumber.js:4216)
I'm using typescript with ES6 style imports and JSPM
import 'google-libphonenumber';
declare var PhoneNumberUtil: any;
PhoneNumberUtil.getInstance().formatLocal('US', input)
My use case the need to check against U.S numbers only, is it possible to customize the lib thus reducing the size to only U.S based checks.
Just wondering if this library is intended to be usable with browserify. When I require it I get an error "fs.readFileSync is not a function"
Hi.
Im trying to use this package in a project but
phoneUtil.isValidNumber(phoneNr);gives me
TypeError: a.getCountryCodeOrDefault is not a function.
So for testing i tried it out in npm browser test site (link below) and it gave me the same error: https://tonicdev.com/npm/google-libphonenumber
Heres the copy paste code to test:
require("google-libphonenumber") // Require `PhoneNumberFormat`. var PNF = require('google-libphonenumber').PhoneNumberFormat; // Get an instance of `PhoneNumberUtil`. var phoneUtil = require('google-libphonenumber').PhoneNumberUtil.getInstance(); // Parse number with country code. var phoneNumber = phoneUtil.parse('202-456-1414', 'US'); // Print number in the international format. console.log(phoneUtil.format(phoneNumber, PNF.INTERNATIONAL)); // => +1 202-456-1414 var phoneNr = { "country_code": 41, "national_number": 446681800 }; phoneUtil.isValidNumber(phoneNr);
The phoneUtil.format works but not phoneUtil.isValidNumber. I might be doing something wrong but i cant figure out what.
Do you guys get isValidNumber working?
I have tried numerous ways to validate a number with isValidNumber()
but it always returns false. For example:
phoneUtil.isValidNumberForRegion( phoneUtil.parseAndKeepRawInput('5555555555', 'US'), 'US')
returns false even though parseAndKeepRawInput returns a valid phone object. Scouring the docs and looking at the demo, isPossibleNumber
seems to be the only method that indicates a valid phone number. Has isValidNumber
been deprecated?
import libPhoneNum from 'google-libphonenumber/dist/libphonenumber'
// not sure how the validation API is exposed at this point
Hi, I noticed the update for 8.8.9 has been committed at 19321bc, but there is no release yet. Any chance of getting this into npm
?
Hello,
i'm trying to get the geo info for a number but cant seen to find the PhoneMetadataCollection
function/values ??
i even searched the source but not luck ๐จ
Thanks
When using google-libphonenumber installed via npm with webpack, I get the following warning on each build. I believe it is common to provide both source and dist files in node packages, am I right? That should solve this problem.
WARNING in ./~/google-libphonenumber/dist/libphonenumber.js
Critical dependencies:
1:487-494 This seems to be a pre-built javascript file. Though this is possible, it's not recommended. Try to require the original source to get better results.
@ ./~/google-libphonenumber/dist/libphonenumber.js 1:487-494
I'm trying to format 44 20 7928 5211
in E164 with the expected output of +442079285211
However when I parse it with the US region code it is deemed an invalid number, and when i parse it with the ZZ code I get an invalid country code error. Is there any recommended way of parsing a number when there's no default country code? It seemed like ZZ would be the right approach.
Hi I'm trying to use this lib in a typescript project, when I do import { PhoneNumberUtil, PhoneNumber, PhoneNumberFormat, AsYouTypeFormatter } from 'google-libphonenumber';
I get an error saying "could not find declaration file for module 'google-libphonenumber'"
There's a @types/google-libphonenumber package but it has outdated definitions, thus it doesn't have all functionality (like extractPossibleNumber)
Is it possible to use this module with typescript?
Thanks.
I have loaded in an HTML page the code stored in the dist/browser directory.
I cannot find any global variable ready to be called by my custom code.
My view is that the only point of having a dist/browser directory is to offer standalone browser-ready code, equipped with a local README that explains how to use it.
`var region = 'IN';
var phone = '4155216849';
var phoneNumber = phoneUtil.parse(phone, region);
console.log(phone + ' isValid ' + phoneUtil.isValidNumber(phoneNumber));
console.log(phone + ' number type ' + phoneUtil.getNumberType(phoneNumber));
console.log(phoneUtil.format(phoneNumber, PNF.INTERNATIONAL));`
Output:
4155216849 isValid true
4155216849 number type 0
+91 4155 216 849
I tried dialing this number in India and seems its not a valid number in India.
Following npm's convention when using npm version
, tags will be updated to include the v prefix. Existing tags will be renamed.
Just started getting this error, have a version of the code running perfectly on our live server. Running "google-libphonenumber": "^3.0.0",
on node v8.1.4, npm 5.3.0
{
err:{
AssertionError
at new goog.asserts.AssertionError (**PATH**/node_modules/google-libphonenumber/dist/libphonenumber.js:1208:20)
at Object.goog.asserts.doAssertFailure_ (**PATH**/node_modules/google-libphonenumber/dist/libphonenumber.js:1226:7)
at Object.goog.asserts.assert (**PATH**/node_modules/google-libphonenumber/dist/libphonenumber.js:1233:53)
at new goog.proto2.FieldDescriptor (**PATH**/node_modules/google-libphonenumber/dist/libphonenumber.js:1960:16)
at Function.goog.proto2.Message.createDescriptor (**PATH**/node_modules/google-libphonenumber/dist/libphonenumber.js:2255:22)
at i18n.phonenumbers.PhoneMetadata.getDescriptor (**PATH**/node_modules/google-libphonenumber/dist/libphonenumber.js:3130:79)
at i18n.phonenumbers.PhoneMetadata.goog.proto2.Message (**PATH**/node_modules/google-libphonenumber/dist/libphonenumber.js:2080:23)
at new i18n.phonenumbers.PhoneMetadata (**PATH**/node_modules/google-libphonenumber/dist/libphonenumber.js:2592:23)
at Object.1 (**PATH**/node_modules/google-libphonenumber/dist/libphonenumber.js:4684:56)
at s (**PATH**/node_modules/google-libphonenumber/dist/libphonenumber.js:1:690)
at e (**PATH**/node_modules/google-libphonenumber/dist/libphonenumber.js:1:861)
at **PATH**/node_modules/google-libphonenumber/dist/libphonenumber.js:1:879
at i (**PATH**/node_modules/google-libphonenumber/dist/libphonenumber.js:1:150)
at Object.<anonymous> (**PATH**/node_modules/google-libphonenumber/dist/libphonenumber.js:1:392)
at Module._compile (module.js:569:30)
at Object.Module._extensions..js (module.js:580:10)
at Module.load (module.js:503:32)
at tryModuleLoad (module.js:466:12)
at Function.Module._load (module.js:458:3)
at Module.require (module.js:513:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (**PATH**//orders/data/order-container.js:5:21)
message: 'Assertion failed',
reportErrorToServer: true,
messagePattern: 'Assertion failed'
}
}
the code that triggers the error:
const Container = require('./container');
const phoneUtil = require('google-libphonenumber').PhoneNumberUtil.getInstance();
const PNF = require('google-libphonenumber').PhoneNumberFormat;
class OrderContainer extends Container {}
the const phoneUtil
line is where it is throwing the error. I'm not sure what changed, we haven't been working in this section of the code so it is odd for it to have started erroring.
Adds .d.ts for type checking in VSCode and others, please.
Numbers starting with 77******** shows invalid number for the given region 'IN'.
The API call with the latest version of google-libphonenumber, shows the wrong result for isValidNumber()
Have filed the bug with Google Phone lib as well :
https://issuetracker.google.com/issues/69244622
This is Google's API response :
http://libphonenumber.appspot.com/phonenumberparser?number=%2B91+7707059626
Need to fix this, provided Google API is fixed first. Adding is as a TODO .
Here is the complete implementation as it is from npm runkit of google-libphonenumber
var phoneUtil = require("google-libphonenumber").PhoneNumberUtil.getInstance();
var phoneNumber0 = "+917707059626";
var phoneNumber1 = "+918197800510";
var phoneNumber2 = "+917707111289";
var phone0 = phoneUtil.parse(phoneNumber0);
var phone1 = phoneUtil.parse(phoneNumber1);
var phone2 = phoneUtil.parse(phoneNumber2);
console.log(phoneUtil.isValidNumber(phone0)); // failed
console.log(phoneUtil.isValidNumber(phone1)); // success
console.log(phoneUtil.isValidNumber(phone2)); // failed
Sorry if this was in the demo or documentation somewhere, but how can I get the following from a number using this library? Any documentation or samples on how to get this from a
****Validation Results:****
Result from isPossibleNumber()
Result from isValidNumber()
Result from isValidNumberForRegion()
Result from getNumberType()
****Formatting Results:****
E164 format
Hello,
When bundling with webpack, I'm getting this warning, like in #38:
WARNING in ./~/google-libphonenumber/dist/browser/libphonenumber.js
Critical dependencies:
1:487-494 This seems to be a pre-built javascript file. Though this is possible, it's not recommended. Try to require the original source to get better results.
@ ./~/google-libphonenumber/dist/browser/libphonenumber.js 1:487-494
This is because you have on package.json:
"browser": "dist/browser/libphonenumber.js",
Webpack will resolve the import to this file by default (unless you are using webpack with 'target': 'node' for usage in node.js, which is not the most common usage).
I don't know if taking this line from the package.json will break browserify builds (I'm not experient with browserify), but from what I can tell from other libraries, this is not needed.
So what is the difference between dist/browser/libphonenumber.js and dist/libphonenumber ?
Can we just keep the 'main' entry on package.json?
Hi,
Nice to see that you maintain a project like this, but it heavily infringes on Googles trademark, and is in no way related to, or maintained by Google. You should in my opinion look to change this.
Please refer to the Google Trademarks page for more information:
We cannot approve any company names or application names that incorporate a Google trademark, or that are confusingly similar to Google's trademarks.
As a new user i'm having a hard time familiarizing myself with this library, the google docs are not helping.
A simple layout of the available classes, methods and their arguments would be ideal.
Hi,
I wanted to use your module but, I'm using with this error...:
- Undefined is not a function
vm.runInContext(fs.readFileSync(file), sandbox);
Sorry, I'm a not a expert about NPM... so I can't help "more".
Here how I "use" your package:
$ npm install --save-dev google-libphonenumber
Here my file:
var phoneUtil = require('google-libphonenumber').phoneUtil
[...]
function isPhone(str, countryCode)ย {
try {
phoneUtil.parse(str, countryCode)
return (true)
}
catch(err) {
return (false)
}
}
and the full stack trace:
Uncaught TypeError: undefined is not a function index.js:43
loadScript index.js:48
module.exports.load index.js:2
(anonymous function) bootstrap b4bd7468d6ba5d125b49?019c:504
__webpack_require__ bootstrap b4bd7468d6ba5d125b49?019c:76
fn index.js:6
(anonymous function) index.js:57
(anonymous function) bootstrap b4bd7468d6ba5d125b49?019c:504
__webpack_require__ bootstrap b4bd7468d6ba5d125b49?019c:76
fn StringUtils.js:2
dotNetDateRE bootstrap b4bd7468d6ba5d125b49?019c:504
__webpack_require__ bootstrap b4bd7468d6ba5d125b49?019c:76
fn CreateCustomerId.js:4
(anonymous function) bootstrap b4bd7468d6ba5d125b49?019c:504
__webpack_require__ bootstrap b4bd7468d6ba5d125b49?019c:76
fn CreateCustomer.js:8
(anonymous function) bootstrap b4bd7468d6ba5d125b49?019c:504
__webpack_require__ bootstrap b4bd7468d6ba5d125b49?019c:76
fn index.js:23
(anonymous function) bootstrap b4bd7468d6ba5d125b49?019c:504
__webpack_require__ bootstrap b4bd7468d6ba5d125b49?019c:76
fn index.js:537
(anonymous function) bootstrap b4bd7468d6ba5d125b49?019c:504
__webpack_require__ bootstrap b4bd7468d6ba5d125b49?019c:527
(anonymous function) index.js:531
(anonymous function)
Again, sorry I can't help more...
I see there is some list of region codes, but it doesn't contain the full name of the country and it doesn't have the ISD code for that country eg. +1 for US. Does it make sense to add this in to this library? Is there some other library that includes this? I guess I could create one manually.
Hello,
I have a German phone number like this (4906) 227-7474
and I want to format into international format
var PNF = require('google-libphonenumber').PhoneNumberFormat;
var phoneUtil = require('google-libphonenumber').PhoneNumberUtil.getInstance();
var phoneNumber = phoneUtil.parse('(4906) 227-7474', 'DE');
phoneUtil.format(phoneNumber, PNF.INTERNATIONAL);
//phoneUtil.isValidNumber(phoneNumber) is true
I got +49 4906 2277474
but I want to get 49 6227 7474
How can I get it?
FYI:
For Germany https://en.wikipedia.org/wiki/List_of_dialling_codes_in_Germany#06
49 - country code
06 - area code
Thx, Vitaly
const phoneUtil = require('google-libphonenumber').PhoneNumberUtil.getInstance();
const invalidNumber = '+12223334444';
console.log(`${invalidNumber} is valid: ${phoneUtil.isValidNumber(invalidNumber)}`);
Error message was TypeError: a.getCountryCodeOrDefault is not a function
Looked into /dist/libphonenumber.js a bit and could not find getCountryCodeOrDefault() from there.
Thanks.
Released 13 days ago: https://github.com/googlei18n/libphonenumber/releases/tag/v8.3.2
Hey,
is you lib up-to-date?
because i saw there is already a 7.0.2 version of https://github.com/googlei18n/libphonenumber.
i wanne figure out which npm module has the best support of the original google lib.
Thx,
kate
Country: PH
Phone number: 09781234567
I tested on this website https://giggsey.com/libphonenumber/?phonenumber=09781234567&country=PH&language=®ion= and it is a valid phone number. Can you take a look?
I couldnt use your library, because i always got
Ive debugged a little, in parseHelper_ function:
goog.string.StringBuffer is undefined.
with https://github.com/wajatimur/node-phonenumber the problem does not appear.
so i assume the problem is inside your implementation.
if you found the problem, i will reuse your lib!
thx!
hi there! Thanks for awesome tool!
one thing I wanna report though: when parsing my Canadian cell phone number isValidNumber() gives me 'false'. Here're the steps to reproduce:
// install lib
npm install google-libphonenumber // installs: [email protected]
// check node version
node --version
v8.7.0
// run node
node
// Require PhoneNumberFormat
.
var PNF = require('google-libphonenumber').PhoneNumberFormat;
// Get an instance of PhoneNumberUtil
.
var phoneUtil = require('google-libphonenumber').PhoneNumberUtil.getInstance();
// parse
var phone_number = phoneUtil.parse("+15197227878", "CA"); // also tried "US"
// check if parsed ok
phoneUtil.isValidNumber(phone_number);
true
phoneUtil.format(phone_number, PNF.E164);
'+15197227878'
// check if valid for region (always gives me false)
phoneUtil.isValidNumberForRegion(phone_number)
false
Thanks,
Dmitry Shevkoplyas
Hi,
I saw in #116 that getNationalSignificantNumber
will return an empty string instead of null
.
Is this the only breaking change ? Because I saw in the PR code that a lot of code has been deleted.
If there is more, can you list the Breaking changes in the CHANGELOG file ?
Thank you
When using the npm (latest v1.0.12) under Webpack, I'm getting this warning message below in my browser console.
Although its just a warning and not a breaking issue, I was wonder if there is a recommended way around it:
./~/google-libphonenumber/dist/browser/libphonenumber.js
Critical dependencies:
1:487-494 This seems to be a pre-built javascript file. Though this is possible, it's not recommended. Try to require the original source to get better results.
@ ./~/google-libphonenumber/dist/browser/libphonenumber.js 1:487-494
Just tried it on a blank state:
var phoneUtil = require('google-libphonenumber').PhoneNumberUtil.getInstance();
phoneUtil.isValidNumber('1234');
throws:
TypeError: a.getCountryCodeOrDefault is not a function
update: doesn't seem to work with valid number either, tried the same example like in the browser demo, aka my phone number. the browser demo worked, the node one didn't.
In the demo getNumberType() seems to return MOBILE
but in my code I am getting 1
var mobileNumberValidator = require('google-libphonenumber').PhoneNumberUtil.getInstance();
var parsedMobileNumber = mobileNumberValidator.parse(mobileNumber, 'GB');
var isMobile = mobileNumberValidator.getNumberType(parsedMobileNumber);
console.log(isMobile) // This is printing: 1
I would like to return MOBILE
like in the demo, is there something that I am doing wrong?
I'm using this with webpack, and it tells me:
WARNING in .//google-libphonenumber/dist/browser/libphonenumber.js/google-libphonenumber/dist/browser/libphonenumber.js 1:487-494
Critical dependencies:
1:487-494 This seems to be a pre-built javascript file. Though this is possible, it's not recommended. Try to require the original source to get better results.
@ ./
Which seems sensible. I'm not sure about the buildprocess being used here. Is it possible to use the uncompresed files as input to browserify/webpack?
I'm using this package in a project and need the recent fixes from libphonenumber v8.8.1
Would you please update your package?
var gp = require('google-libphonenumber').PhoneNumberUtil.getInstance();
causes this error
number.js:1058
throw a;
^
AssertionError: Assertion failed
at new goog.asserts.AssertionError (...../node_modules/google-libphonenumber/dist/libphonenumber.js:1051:20)
at Object.goog.asserts.doAssertFailure_ (..../node_modules/google-libphonenumber/dist/libphonenumber.js:1068:7)
at Object.goog.asserts.assert as assert
at new goog.proto2.FieldDescriptor (..../node_modules/google-libphonenumber/dist/libphonenumber.js:1553:16)
at Function.goog.proto2.Message.createDescriptor (..../node_modules/google-libphonenumber/dist/libphonenumber.js:2069:22)
at i18n.phonenumbers.PhoneMetadata.getDescriptor (..../node_modules/google-libphonenumber/dist/libphonenumber.js:2946:117)
at goog.proto2.Message (..../node_modules/google-libphonenumber/dist/libphonenumber.js:1897:23)
at new i18n.phonenumbers.PhoneMetadata (..../node_modules/google-libphonenumber/dist/libphonenumber.js:2411:23)
at Object. (..../node_modules/google-libphonenumber/dist/libphonenumber.js:4432:56)
at Module._compile (module.js:435:26)
Hey,
Can you describe to me why +507 570-0440 for Panama (PA) is not valid, but +507 470-0440 is valid? What is the difference?
I can't find some specific case for that in https://en.wikipedia.org/wiki/Telephone_numbers_in_Panama
(All telephone numbers in Panama are seven or eight digits long (xxx-xxxx or 6xxx-xxxx) and there are no area codes.)
Thx, V
Try to select any country with 4-digit country code
code example
mask = phoneUtil.parse(text, country.iso2); //where text save text in input w/o plus
number = phoneUtil.format(mask, PNF.INTERNATIONAL)
// For any 4-digit numbers, started from 1 (+1876, Jamaica) numbers incorrect detected us U.S. number
Numbers starting with 8209****** shows invalid number for the given region 'IN'. Here is the npm runkit demo for the same.
https://runkit.com/592d3e4bb70f37001158b54d/592d3e4bb70f37001158b54e
However, the API call with the latest version of google-libphonenumber, shows the accurate result.
http://libphonenumber.appspot.com/phonenumberparser?number=%2B91+8209890000
My assumption is there is something wrong with the implementation.
Here is the complete implementation as it is from npm runkit of google-libphonenumber
var phoneUtil = require("google-libphonenumber").PhoneNumberUtil.getInstance();
var phoneNumber0 = "+918209000000";
var phoneNumber1 = "+918197800510";
var phoneNumber2 = "+918209890000";
var phone0 = phoneUtil.parse(phoneNumber0);
var phone1 = phoneUtil.parse(phoneNumber1);
var phone2 = phoneUtil.parse(phoneNumber2);
console.log(phoneUtil.isValidNumber(phone0)); // failed
console.log(phoneUtil.isValidNumber(phone1)); // success
console.log(phoneUtil.isValidNumber(phone2)); // failed
Hi
Is it possible to use this as a script tag on its own <script> </script>
Running phone number in subject through https://rawgit.com/googlei18n/libphonenumber/master/javascript/i18n/phonenumbers/demo-compiled.html (w/o default country or carrier code) gives the following output:
****Parsing Result:****
{"country_code":234,"national_number":9068084779,"raw_input":"+2349068084779","country_code_source":1}
****Validation Results:****
Result from isPossibleNumber(): true
Result from isValidNumber(): true
Phone Number region: NG
Result from getNumberType(): MOBILE
****Formatting Results:****
E164 format: +2349068084779
Original format: +234 906 808 4779
National format: 0906 808 4779
International format: +234 906 808 4779
Out-of-country format from US: 011 234 906 808 4779
Out-of-country format from Switzerland: 00 234 906 808 4779
****AsYouTypeFormatter Results****
Char entered: + Output: +
Char entered: 2 Output: +2
Char entered: 3 Output: +23
Char entered: 4 Output: +234
Char entered: 9 Output: +234 9
Char entered: 0 Output: +234 90
Char entered: 6 Output: +234 9 06
Char entered: 8 Output: +234 9 068
Char entered: 0 Output: +234 9 068 0
Char entered: 8 Output: +234 9 068 08
Char entered: 4 Output: +234 9 068 084
Char entered: 7 Output: +234 9 068 0847
Char entered: 7 Output: +234 906 808 477
Char entered: 9 Output: +234 906 808 4779
As we can see, it's valid phone number. Doing the same using google-libphonenumber produces "unknown phone number". It seems library is up to date with https://github.com/googlei18n/libphonenumber and yet it misbehaves. Any thoughts?
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.