Giter Club home page Giter Club logo

teeny-request's Introduction

Build Status

THIS REPOSITORY AND PACKAGE WILL BE DEPRECATED IN JULY 2024. RELEVANT FUNCTIONALITIES HAVE BEEN MOVED TO GOOGLEAPIS/GAXIOS

teeny-request

Like request, but much smaller - and with less options. Uses node-fetch under the hood. Pop it in where you would use request. Improves load and parse time of modules.

const request = require('teeny-request').teenyRequest;

request({uri: 'http://ip.jsontest.com/'}, function (error, response, body) {
  console.log('error:', error); // Print the error if one occurred
  console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
  console.log('body:', body); // Print the JSON.
});

For TypeScript, you can use @types/request.

import {teenyRequest as request} from 'teeny-request';
import * as r from 'request'; // Only for type declarations

request({uri: 'http://ip.jsontest.com/'}, (error: any, response: r.Response, body: any) => {
  console.log('error:', error); // Print the error if one occurred
  console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
  console.log('body:', body); // Print the JSON.
});

teenyRequest(options, callback)

Options are limited to the following

  • uri
  • method, default GET
  • headers
  • json
  • qs
  • useQuerystring
  • timeout in ms
  • gzip
  • proxy
request({uri:'http://service.com/upload', method:'POST', json: {key:'value'}}, function(err,httpResponse,body){ /* ... */ })

The callback argument gets 3 arguments:

  • An error when applicable (usually from http.ClientRequest object)
  • A response object with statusCode, a statusMessage, and a body
  • The third is the response body (JSON object)

defaults(options)

Set default options for every teenyRequest call.

let defaultRequest = teenyRequest.defaults({timeout: 60000});
      defaultRequest({uri: 'http://ip.jsontest.com/'}, function (error, response, body) {
            assert.ifError(error);
            assert.strictEqual(response.statusCode, 200);
            console.log(body.ip);
            assert.notEqual(body.ip, null);
            
            done();
        });

Proxy environment variables

If environment variables HTTP_PROXY, HTTPS_PROXY, or NO_PROXY are set, they are respected.

Building with Webpack 4+

Since 4.0.0, Webpack uses javascript/esm for .mjs files which handles ESM more strictly compared to javascript/auto. If you get the error Can't import the named export 'PassThrough' from non EcmaScript module, please add the following to your Webpack config:

{
    test: /\.mjs$/,
    type: 'javascript/auto',
},

Motivation

request has a ton of options and features and is accordingly large. Requiring a module incurs load and parse time. For request, that is around 600ms.

Load time of request measured with require-so-slow

teeny-request doesn't have any of the bells and whistles that request has, but is so much faster to load. If startup time is an issue and you don't need much beyond a basic GET and POST, you can use teeny-request.

Thanks

Special thanks to billyjacobson for suggesting the name. Please report all bugs to them. Just kidding. Please open issues.

teeny-request's People

Contributors

alexander-fenster avatar alexpts avatar bcoe avatar callmehiphop avatar chingor13 avatar danielbankhead avatar davidkhala avatar ddelgrosso1 avatar fhinkel avatar gcf-owl-bot[bot] avatar goatandsheep avatar google-cloud-policy-bot[bot] avatar jkwlui avatar jsjoeio avatar justinbeckwith avatar kjin avatar maneesht avatar nathanmosher avatar release-please[bot] avatar renovate-bot avatar renovate[bot] avatar sesam avatar sofisl avatar stephenplusplus avatar summer-ji-eng avatar surferjeffatgoogle avatar yoshi-automation avatar zamnuts avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

teeny-request's Issues

Request option gzip=false is not handled correctly

@google-cloud/bigquery relies on @google-cloud/common for requests, and then uses teeny-request.

I wanted to disable gzip for all requests, but it turns out that the gzip variable is not handled correctly and it never end up being assigned.

File index.ts -> Ln 92.

function requestToFetchOptions(reqOpts: Options) {
  const options: f.RequestInit = {
    method: reqOpts.method || 'GET',
    ...(reqOpts.timeout && {timeout: reqOpts.timeout}),
    ...(reqOpts.gzip && {compress: reqOpts.gzip}),
  };

  // ...
}

If reqOpts.gzip is false, the code after && will be never executed, and never assigned.

Environment details

  • OS:
  • Node.js version: v12.11.1
  • npm version: 6.11.3
  • teeny-request version: 5.3.0

Steps to reproduce

teenyRequest({ uri: '...', gzip: false });

or

let bigquery = new BigQuery(options);

bigquery.interceptors.push({
  request: function (reqOpts) {
    reqOpts.gzip = false;
    return reqOpts
  }
});

Set up CI

We need to run whatever scripts we run to get kokoro setup on the backend :)

Can't import the named export 'PassThrough' from non EcmaScript module

Hello,

While using this module in a project built with webpack 4.9.3 and the following config:

module.exports = {
  entry: './index.js',
  target: 'node',
  node: false,
  resolve: {
    mainFields: ['main', 'module'],
  },
  optimization: {
    minimize: false,
  },
  module: {
    rules: [{
      test: /\.m?js$/,
      exclude: /node_modules/,
      use: {
        loader: 'babel-loader',
      },
    }],
  },
  stats: {
    warnings: false,
  },
};

I am having the issue below:

ERROR in <project>/node_modules/teeny-request/node_modules/node-fetch/lib/index.mjs 496:11-22
Can't import the named export 'PassThrough' from non EcmaScript module (only default export is available)
 @ <project>/node_modules/teeny-request/build/src/index.js
 @ <project>/packages/queue-srv/src/pubsub.js
 @ <project>/packages/queue-srv/index.js
 @ <project>/packages/api-srv/src/Chat/ChatManagement.js
 @ <project>/packages/api-srv/index.js
 @ ./src/user.js
 @ ./index.js

ERROR in <project>/node_modules/teeny-request/node_modules/node-fetch/lib/index.mjs 497:11-22
Can't import the named export 'PassThrough' from non EcmaScript module (only default export is available)
 @ <project>/node_modules/teeny-request/build/src/index.js
 @ <project>/packages/queue-srv/src/pubsub.js
 @ <project>/packages/queue-srv/index.js
 @ <project>/packages/api-srv/src/Chat/ChatManagement.js
 @ <project>/packages/api-srv/index.js
 @ ./src/user.js
 @ ./index.js

Adding the following rule to webpack config seems to solve the issue:

      {
        test: /\.mjs$/,
        type: 'javascript/auto',
      },

Is this required somehow for this module? Is it related to node-fetch/node-fetch#493?

Streaming mode is handling errors

Currently in stream mode, if you make a request to a 404 endpoint, it will emit the error event with the response body. In callback mode, err will be null.

I noticed this while investigating googleapis/nodejs-storage#720. retry-request uses the response from this library to decide whether a request should be retried: https://github.com/stephenplusplus/retry-request/blob/48a8ec0ce54805ab8ea41edc8c89363a09c886d9/index.js#L168.

The request library doesn't treat a 404 as an error, for example. It reserves the err argument for things like a DNS lookup failure. Anything else must be parsed by the caller and self-determined to be an error.

teeny: should include the request in the response failed

This test failed!

To configure my behavior, see the Flaky Bot documentation.

If I'm commenting on this issue too often, add the flakybot: quiet label and
I will stop commenting.


commit: 7a1316d
buildURL: Build Status, Sponge
status: failed

Test output
Timeout of 10000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (/workspace/build/test/index.js)
Error: Timeout of 10000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (/workspace/build/test/index.js)
    at listOnTimeout (internal/timers.js:554:17)
    at processTimers (internal/timers.js:497:7)

Use gts?

npm.im/gts to get a consistent style

Set up CI

It looks like there's no CI set up here quite yet :) It would be rad to get Travis or CircleCI setup!

Synthesis failed for teeny-request

Hello! Autosynth couldn't regenerate teeny-request. 💔

Here's the output from running synth.py:

2020-05-14 06:37:10,551 autosynth [INFO] > logs will be written to: /tmpfs/src/github/synthtool/logs/googleapis/teeny-request
2020-05-14 06:37:10,554 synthtool [ERROR] > Failed executing git clone --single-branch https://github.com/googleapis/teeny-request.git /home/kbuilder/.cache/synthtool/teeny-request:

fatal: could not create work tree dir '/home/kbuilder/.cache/synthtool/teeny-request': No space left on device

Traceback (most recent call last):
  File "/home/kbuilder/.pyenv/versions/3.6.9/lib/python3.6/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/home/kbuilder/.pyenv/versions/3.6.9/lib/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/tmpfs/src/github/synthtool/autosynth/synth.py", line 600, in <module>
    main()
  File "/tmpfs/src/github/synthtool/autosynth/synth.py", line 472, in main
    return _inner_main(temp_dir)
  File "/tmpfs/src/github/synthtool/autosynth/synth.py", line 519, in _inner_main
    working_repo_path = synthtool_git.clone(f"https://github.com/{args.repository}.git")
  File "/tmpfs/src/github/synthtool/synthtool/sources/git.py", line 83, in clone
    shell.run(cmd, check=True)
  File "/tmpfs/src/github/synthtool/synthtool/shell.py", line 39, in run
    raise exc
  File "/tmpfs/src/github/synthtool/synthtool/shell.py", line 33, in run
    encoding="utf-8",
  File "/home/kbuilder/.pyenv/versions/3.6.9/lib/python3.6/subprocess.py", line 438, in run
    output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command '['git', 'clone', '--single-branch', 'https://github.com/googleapis/teeny-request.git', PosixPath('/home/kbuilder/.cache/synthtool/teeny-request')]' returned non-zero exit status 128.

Google internal developers can see the full log here.

maxSockets is not passed to the underlying agent when forever:true

While troubleshooting the issue googleapis/nodejs-bigquery#624 it was found that despite @google-cloud/common/util declaring maxSockets, this isn't actually propagated down to the HTTP/S agent that teeny-request uses, and maxSockets always defaults to Infinity.

Note that a new Agent is only used either when a proxy is defined, or when forever: true; the Node.js globalAgent is used in all other cases.

Environment details

  • OS: linux
  • Node.js version: 10.19.0
  • npm version: 6.14.4
  • teeny-request version: 6.0.3

Need to cut a release

When this library was transferred over to the googleapis org, something got lost in translation with the version number and available tags. I tried to cut a 4.0 release in #46, but it turns out that 4.0 had already been released 😱

@bcoe - can you figure out how to get the chances since 4.0 went out into a new release? I think it's going to be a semver major due to the changes in #44

Cannot bundle this lib

Hey guys,

when I bundle this lib (e.g. with esbuild or webpack) I am getting the following error:
TypeError: Expected signal to be an instanceof AbortSignal

This is caused by node-fetch 2.x and is solved with versions 3.x, see here:
node-fetch/node-fetch#667

Do you plan to update node-fetch in the near future? I would need that fix for @google-cloud/[email protected].
Thanks in advance

Agent pooling/caching

One of our users reported an issue (googleapis/nodejs-bigquery#547) about a memory leak coming from teeny-request. I dived in and it looks like the the issue is related to the forever option (#54) where we end up creating a new Agent per request.

I think we're going to want to implement some kind of agent pooling. Just wanted to have a small discussion before opening a PR, but my plan was to create a sort of global map in teeny-request that might end up looking something like this

const agentPool = new Map([
  ['http:forever', new http.Agent({keepAlive: true})],
  ['https:forever', new https.Agent({keepAlive: true})],
  [`http:${proxy}`, new HttpProxyAgent(proxy)]
]);

Synthesis failed for teeny-request

Hello! Autosynth couldn't regenerate teeny-request. 💔

Here's the output from running synth.py:

Cloning into 'working_repo'...
Switched to branch 'autosynth'
Running synthtool
['/tmpfs/src/git/autosynth/env/bin/python3', '-m', 'synthtool', 'synth.py', '--']
synthtool > Executing /tmpfs/src/git/autosynth/working_repo/synth.py.
.eslintignore
.eslintrc.yml
.github/ISSUE_TEMPLATE/bug_report.md
.github/ISSUE_TEMPLATE/feature_request.md
.github/ISSUE_TEMPLATE/support_request.md
.github/PULL_REQUEST_TEMPLATE.md
synthtool > Wrote metadata to synth.metadata.
Traceback (most recent call last):
  File "/home/kbuilder/.pyenv/versions/3.6.1/lib/python3.6/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/home/kbuilder/.pyenv/versions/3.6.1/lib/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/tmpfs/src/git/autosynth/env/lib/python3.6/site-packages/synthtool/__main__.py", line 99, in <module>
    main()
  File "/tmpfs/src/git/autosynth/env/lib/python3.6/site-packages/click/core.py", line 764, in __call__
    return self.main(*args, **kwargs)
  File "/tmpfs/src/git/autosynth/env/lib/python3.6/site-packages/click/core.py", line 717, in main
    rv = self.invoke(ctx)
  File "/tmpfs/src/git/autosynth/env/lib/python3.6/site-packages/click/core.py", line 956, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/tmpfs/src/git/autosynth/env/lib/python3.6/site-packages/click/core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "/tmpfs/src/git/autosynth/env/lib/python3.6/site-packages/synthtool/__main__.py", line 91, in main
    spec.loader.exec_module(synth_module)  # type: ignore
  File "<frozen importlib._bootstrap_external>", line 678, in exec_module
  File "<frozen importlib._bootstrap>", line 205, in _call_with_frames_removed
  File "/tmpfs/src/git/autosynth/working_repo/synth.py", line 6, in <module>
    templates = common_templates.node_library()
  File "/tmpfs/src/git/autosynth/env/lib/python3.6/site-packages/synthtool/gcp/common.py", line 89, in node_library
    return self._generic_library("node_library", **kwargs)
  File "/tmpfs/src/git/autosynth/env/lib/python3.6/site-packages/synthtool/gcp/common.py", line 49, in _generic_library
    result = t.render(**kwargs)
  File "/tmpfs/src/git/autosynth/env/lib/python3.6/site-packages/synthtool/sources/templates.py", line 83, in render
    _render_to_path(self.env, template_name, self.dir, kwargs)
  File "/tmpfs/src/git/autosynth/env/lib/python3.6/site-packages/synthtool/sources/templates.py", line 53, in _render_to_path
    output.dump(fh)
  File "/tmpfs/src/git/autosynth/env/lib/python3.6/site-packages/jinja2/environment.py", line 1313, in dump
    fp.writelines(iterable)
  File "/tmpfs/src/git/autosynth/env/lib/python3.6/site-packages/jinja2/environment.py", line 1357, in __next__
    return self._next()
  File "/tmpfs/src/git/autosynth/env/lib/python3.6/site-packages/jinja2/environment.py", line 1125, in generate
    yield self.environment.handle_exception()
  File "/tmpfs/src/git/autosynth/env/lib/python3.6/site-packages/jinja2/environment.py", line 832, in handle_exception
    reraise(*rewrite_traceback_stack(source=source))
  File "/tmpfs/src/git/autosynth/env/lib/python3.6/site-packages/jinja2/_compat.py", line 28, in reraise
    raise value.with_traceback(tb)
  File "/tmpfs/src/git/autosynth/env/lib/python3.6/site-packages/synthtool/gcp/templates/node_library/.github/PULL_REQUEST_TEMPLATE.md", line 2, in top-level template code
    - [ ] Make sure to open an issue as a [bug/issue](https://github.com/{{ metadata['repo']['repo'] }}/issues/new/choose) before writing your code!  That way we can discuss the change, evaluate designs, and agree on the general idea
  File "/tmpfs/src/git/autosynth/env/lib/python3.6/site-packages/jinja2/environment.py", line 452, in getitem
    return obj[argument]
jinja2.exceptions.UndefinedError: 'dict object' has no attribute 'repo'

Synthesis failed

Google internal developers can see the full log here.

PR to fix undefined error in getAgent?

Hi there!

I think I found a bug in getAgent.

Due to this type assertion, getAgent assumes that uri is defined and calls .startsWith which throws an error. I came to this conclusion while running into an error with codecov.

It looks like this type assertion came back in Nov. 2018 via this PR.

I believe the simplest fix would be to change const isHttp = uri.startsWith('http://'); -> const isHttp = uri?.startsWith('http://'); (using the optional chaining operator), which means you'd probably want to change the parameter type annotation for uri: string -> uri: string | undefined and add a test.

Would you accept a PR for this?

Synthesis failed for teeny-request

Hello! Autosynth couldn't regenerate teeny-request. 💔

Please investigate and fix this issue within 5 business days. While it remains broken,
this library cannot be updated with changes to the teeny-request API, and the library grows
stale.

See https://github.com/googleapis/synthtool/blob/master/autosynth/TroubleShooting.md
for trouble shooting tips.

Here's the output from running synth.py:

 04:59:09,444 autosynth [DEBUG] > Running: /tmpfs/src/github/synthtool/env/bin/python3 -m synthtool --metadata synth.metadata synth.py --
2021-04-08 04:59:09,671 synthtool [DEBUG] > Executing /home/kbuilder/.cache/synthtool/teeny-request/synth.py.
On branch autosynth-74
nothing to commit, working tree clean
2021-04-08 04:59:09,799 synthtool [DEBUG] > Using precloned repo /home/kbuilder/.cache/synthtool/synthtool
DEBUG:synthtool:Using precloned repo /home/kbuilder/.cache/synthtool/synthtool
.eslintignore
.eslintrc.json
.gitattributes
.github/CODEOWNERS
.github/ISSUE_TEMPLATE/bug_report.md
.github/ISSUE_TEMPLATE/feature_request.md
.github/ISSUE_TEMPLATE/support_request.md
.github/PULL_REQUEST_TEMPLATE.md
.github/release-please.yml
.github/workflows/ci.yaml
.kokoro/.gitattributes
.kokoro/common.cfg
.kokoro/continuous/node10/common.cfg
.kokoro/continuous/node10/docs.cfg
.kokoro/continuous/node10/test.cfg
.kokoro/continuous/node12/common.cfg
.kokoro/continuous/node12/lint.cfg
.kokoro/continuous/node12/samples-test.cfg
.kokoro/continuous/node12/system-test.cfg
.kokoro/continuous/node12/test.cfg
.kokoro/docs.sh
.kokoro/lint.sh
.kokoro/populate-secrets.sh
.kokoro/presubmit/node10/common.cfg
.kokoro/presubmit/node12/common.cfg
.kokoro/presubmit/node12/samples-test.cfg
.kokoro/presubmit/node12/system-test.cfg
.kokoro/presubmit/node12/test.cfg
.kokoro/publish.sh
.kokoro/release/docs-devsite.cfg
.kokoro/release/docs-devsite.sh
.kokoro/release/docs.cfg
.kokoro/release/docs.sh
.kokoro/release/publish.cfg
.kokoro/samples-test.sh
.kokoro/system-test.sh
.kokoro/test.bat
.kokoro/test.sh
.kokoro/trampoline.sh
.kokoro/trampoline_v2.sh
.mocharc.js
.nycrc
.prettierignore
.prettierrc.js
.trampolinerc
CODE_OF_CONDUCT.md
CONTRIBUTING.md
LICENSE
Skipping: README.md
api-extractor.json
renovate.json
Skipping: samples/README.md
2021-04-08 04:59:09,880 synthtool [DEBUG] > Installing dependencies...
DEBUG:synthtool:Installing dependencies...
npm WARN deprecated [email protected]: Breaking change found in this patch version
npm WARN deprecated [email protected]: NOTICE: ts-simple-ast has been renamed to ts-morph and version reset to 1.0.0. Switch at your leisure...
npm WARN deprecated [email protected]: Use cheerio-select instead
npm WARN deprecated [email protected]: Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.
npm WARN deprecated [email protected]: The package has been renamed to `open`
npm WARN deprecated [email protected]: fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.
npm WARN deprecated [email protected]: core-js@<3 is no longer maintained and not recommended for usage due to the number of issues. Please, upgrade your dependencies to the actual version of core-js@3.
npm WARN deprecated [email protected]: Please see https://github.com/lydell/urix#deprecated
npm WARN deprecated [email protected]: https://github.com/lydell/resolve-url#deprecated

> [email protected] postinstall /home/kbuilder/.cache/synthtool/teeny-request/node_modules/core-js
> node -e "try{require('./postinstall')}catch(e){}"


> @compodoc/[email protected] postinstall /home/kbuilder/.cache/synthtool/teeny-request/node_modules/@compodoc/compodoc
> opencollective-postinstall || exit 0

�[96m�[1mThank you for using @compodoc/compodoc!�[96m�[1m
�[0m�[96mIf you rely on this package, please consider supporting our open collective:�[22m�[39m
> �[94mhttps://opencollective.com/compodoc/donate�[0m


> [email protected] prepare /home/kbuilder/.cache/synthtool/teeny-request
> npm run compile


> [email protected] precompile /home/kbuilder/.cache/synthtool/teeny-request
> gts clean

version: 14
Removing build ...

> [email protected] compile /home/kbuilder/.cache/synthtool/teeny-request
> tsc -p .

�[96mnode_modules/@types/sinon/index.d.ts�[0m:�[93m778�[0m:�[93m36�[0m - �[91merror�[0m�[90m TS2694: �[0mNamespace '"/home/kbuilder/.cache/synthtool/teeny-request/node_modules/@sinonjs/fake-timers/types/fake-timers-src"' has no exported member 'TimerId'.

�[7m778�[0m     type SinonTimerId = FakeTimers.TimerId;
�[7m   �[0m �[91m                                   ~~~~~~~�[0m

�[96mnode_modules/@types/sinon/index.d.ts�[0m:�[93m780�[0m:�[93m39�[0m - �[91merror�[0m�[90m TS2694: �[0mNamespace '"/home/kbuilder/.cache/synthtool/teeny-request/node_modules/@sinonjs/fake-timers/types/fake-timers-src"' has no exported member 'InstalledMethods'.

�[7m780�[0m     type SinonFakeTimers = FakeTimers.InstalledMethods &
�[7m   �[0m �[91m                                      ~~~~~~~~~~~~~~~~�[0m

�[96mnode_modules/@types/sinon/index.d.ts�[0m:�[93m781�[0m:�[93m20�[0m - �[91merror�[0m�[90m TS2694: �[0mNamespace '"/home/kbuilder/.cache/synthtool/teeny-request/node_modules/@sinonjs/fake-timers/types/fake-timers-src"' has no exported member 'NodeClock'.

�[7m781�[0m         FakeTimers.NodeClock &
�[7m   �[0m �[91m                   ~~~~~~~~~�[0m

�[96mnode_modules/@types/sinon/index.d.ts�[0m:�[93m782�[0m:�[93m20�[0m - �[91merror�[0m�[90m TS2694: �[0mNamespace '"/home/kbuilder/.cache/synthtool/teeny-request/node_modules/@sinonjs/fake-timers/types/fake-timers-src"' has no exported member 'BrowserClock'.

�[7m782�[0m         FakeTimers.BrowserClock & {
�[7m   �[0m �[91m                   ~~~~~~~~~~~~�[0m


Found 4 errors.

npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] compile: `tsc -p .`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the [email protected] compile script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/kbuilder/.npm/_logs/2021-04-08T11_59_33_932Z-debug.log
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] prepare: `npm run compile`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the [email protected] prepare script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/kbuilder/.npm/_logs/2021-04-08T11_59_33_987Z-debug.log
2021-04-08 04:59:34,019 synthtool [ERROR] > Failed executing npm install:

None
ERROR:synthtool:Failed executing npm install:

None
Traceback (most recent call last):
  File "/home/kbuilder/.pyenv/versions/3.6.9/lib/python3.6/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/home/kbuilder/.pyenv/versions/3.6.9/lib/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/tmpfs/src/github/synthtool/synthtool/__main__.py", line 102, in <module>
    main()
  File "/tmpfs/src/github/synthtool/env/lib/python3.6/site-packages/click/core.py", line 829, in __call__
    return self.main(*args, **kwargs)
  File "/tmpfs/src/github/synthtool/env/lib/python3.6/site-packages/click/core.py", line 782, in main
    rv = self.invoke(ctx)
  File "/tmpfs/src/github/synthtool/env/lib/python3.6/site-packages/click/core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/tmpfs/src/github/synthtool/env/lib/python3.6/site-packages/click/core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "/tmpfs/src/github/synthtool/synthtool/__main__.py", line 94, in main
    spec.loader.exec_module(synth_module)  # type: ignore
  File "<frozen importlib._bootstrap_external>", line 678, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/home/kbuilder/.cache/synthtool/teeny-request/synth.py", line 12, in <module>
    node.install()
  File "/tmpfs/src/github/synthtool/synthtool/languages/node.py", line 171, in install
    shell.run(["npm", "install"], hide_output=hide_output)
  File "/tmpfs/src/github/synthtool/synthtool/shell.py", line 39, in run
    raise exc
  File "/tmpfs/src/github/synthtool/synthtool/shell.py", line 33, in run
    encoding="utf-8",
  File "/home/kbuilder/.pyenv/versions/3.6.9/lib/python3.6/subprocess.py", line 438, in run
    output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command '['npm', 'install']' returned non-zero exit status 1.
2021-04-08 04:59:34,063 autosynth [ERROR] > Synthesis failed
2021-04-08 04:59:34,063 autosynth [DEBUG] > Running: git reset --hard HEAD
HEAD is now at 360f083 chore(deps): update dependency sinon to v10 (#215)
2021-04-08 04:59:34,071 autosynth [DEBUG] > Running: git checkout autosynth
Switched to branch 'autosynth'
2021-04-08 04:59:34,075 autosynth [DEBUG] > Running: git clean -fdx
Removing __pycache__/
Removing node_modules/
Traceback (most recent call last):
  File "/home/kbuilder/.pyenv/versions/3.6.9/lib/python3.6/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/home/kbuilder/.pyenv/versions/3.6.9/lib/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/tmpfs/src/github/synthtool/autosynth/synth.py", line 356, in <module>
    main()
  File "/tmpfs/src/github/synthtool/autosynth/synth.py", line 191, in main
    return _inner_main(temp_dir)
  File "/tmpfs/src/github/synthtool/autosynth/synth.py", line 336, in _inner_main
    commit_count = synthesize_loop(x, multiple_prs, change_pusher, synthesizer)
  File "/tmpfs/src/github/synthtool/autosynth/synth.py", line 68, in synthesize_loop
    has_changes = toolbox.synthesize_version_in_new_branch(synthesizer, youngest)
  File "/tmpfs/src/github/synthtool/autosynth/synth_toolbox.py", line 259, in synthesize_version_in_new_branch
    synthesizer.synthesize(synth_log_path, self.environ)
  File "/tmpfs/src/github/synthtool/autosynth/synthesizer.py", line 120, in synthesize
    synth_proc.check_returncode()  # Raise an exception.
  File "/home/kbuilder/.pyenv/versions/3.6.9/lib/python3.6/subprocess.py", line 389, in check_returncode
    self.stderr)
subprocess.CalledProcessError: Command '['/tmpfs/src/github/synthtool/env/bin/python3', '-m', 'synthtool', '--metadata', 'synth.metadata', 'synth.py', '--']' returned non-zero exit status 1.

Google internal developers can see the full log here.

Synthesis failed for teeny-request

Hello! Autosynth couldn't regenerate teeny-request. 💔

Please investigate and fix this issue within 5 business days. While it remains broken,
this library cannot be updated with changes to the teeny-request API, and the library grows
stale.

See https://github.com/googleapis/synthtool/blob/master/autosynth/TroubleShooting.md
for trouble shooting tips.

Here's the output from running synth.py:

git log -1 --pretty=%at e8d9c5ebf915069df34c207ba8b9a1cfbdb39592
2021-04-17 05:53:22,406 autosynth [DEBUG] > Running: git log -1 --pretty=%at 551dd78ca04f7989abc9e63e392f8b8cfa1a0ef9
2021-04-17 05:53:22,409 autosynth [DEBUG] > Running: git log -1 --pretty=%at 68b8d39a3d5338ed5ff068ad8aa59fb271ef088b
2021-04-17 05:53:22,412 autosynth [DEBUG] > Running: git log -1 --pretty=%at edbd72054bf9f71505782a94d9973e26866f7038
2021-04-17 05:53:22,414 autosynth [DEBUG] > Running: git log -1 --pretty=%at f6132d5e7eddc9d8f08bc4a1cca9234baee38c94
2021-04-17 05:53:22,417 autosynth [DEBUG] > Running: git log -1 --pretty=%at a22531f8364582f51485e4e9db85872d93514ab1
2021-04-17 05:53:22,419 autosynth [DEBUG] > Running: git log -1 --pretty=%at 6d76df2138f8f841e5a5b9ac427f81def520c15f
2021-04-17 05:53:22,422 autosynth [DEBUG] > Running: git log -1 --pretty=%at ff39353f34a36e7643b86e97724e4027ab466dc6
2021-04-17 05:53:22,425 autosynth [DEBUG] > Running: git log -1 --pretty=%at bf04d88353da12e9326236164dcb3150dfbfcff8
2021-04-17 05:53:22,428 autosynth [DEBUG] > Running: git log -1 --pretty=%at 063de45298fbdd88916018ba566c7ecd254b39ae
2021-04-17 05:53:22,431 autosynth [DEBUG] > Running: git log -1 --pretty=%at 5b5bf6d519b2d658d9f2e483d9f6f3d0ba8ee6bc
2021-04-17 05:53:22,433 autosynth [DEBUG] > Running: git log -1 --pretty=%at f4c3a57aeddad8ad720e075a9e8342f1f7b9b766
2021-04-17 05:53:22,436 autosynth [DEBUG] > Running: git log -1 --pretty=%at 705743e66f5c0b24a95f7f30619c9d3ef747b317
2021-04-17 05:53:22,439 autosynth [DEBUG] > Running: git log -1 --pretty=%at 0f3469e88a4be9af4d9b1c4b6cf6fd3f8ac15588
2021-04-17 05:53:22,442 autosynth [DEBUG] > Running: git log -1 --pretty=%at fbc7b766ef43c75293b26159ecaf66cb3fb23770
2021-04-17 05:53:22,445 autosynth [DEBUG] > Running: git log -1 --pretty=%at 6444141a0ab125ff5579e0b697b41ccc500cbda7
2021-04-17 05:53:22,448 autosynth [DEBUG] > Running: git log -1 --pretty=%at 5b0e1592dd7d70b485e157ea4b3eb1704ecbd015
2021-04-17 05:53:22,451 autosynth [DEBUG] > Running: git log -1 --pretty=%at 1f5e6bc8dc8e3661ee550905fc070e55e1b6cea1
2021-04-17 05:53:22,454 autosynth [DEBUG] > Running: git log -1 --pretty=%at d9ddac83a22a600dd33854c9d835a4fe52284207
2021-04-17 05:53:22,457 autosynth [DEBUG] > Running: git log -1 --pretty=%at 0a071b3460344886297a304253bf924aa68ddb7e
2021-04-17 05:53:22,460 autosynth [DEBUG] > Running: git log -1 --pretty=%at 082e1ca0863b13ada8594fe91845380765da5b70
2021-04-17 05:53:22,463 autosynth [DEBUG] > Running: git log -1 --pretty=%at 8285c2b4cdbc3771d031ad91e1c4ec9e55fff45d
2021-04-17 05:53:22,465 autosynth [DEBUG] > Running: git log -1 --pretty=%at 89a8b2e692f7208103647750496610832abebdd0
2021-04-17 05:53:22,468 autosynth [DEBUG] > Running: git log -1 --pretty=%at 721339ab60a6eb63b889978b3d9b295dcb3be370
2021-04-17 05:53:22,471 autosynth [DEBUG] > Running: git log -1 --pretty=%at 14111b3ce3334271d8a7a2bc6c108cfccca9943e
2021-04-17 05:53:22,474 autosynth [DEBUG] > Running: git log -1 --pretty=%at 043cc620d6a6111816d9e09f2a97208565fde958
2021-04-17 05:53:22,477 autosynth [DEBUG] > Running: git log -1 --pretty=%at 1657dd8c79a82b3fe9dde3ff6e0eda3d47fb117f
2021-04-17 05:53:22,480 autosynth [DEBUG] > Running: git log -1 --pretty=%at 898b38a6f4fab89a76dfb152480bb034a781331b
2021-04-17 05:53:22,483 autosynth [DEBUG] > Running: git log -1 --pretty=%at 6e8322421485d0937cb4758db812d8fbca0bbedd
2021-04-17 05:53:22,485 autosynth [DEBUG] > Running: git log -1 --pretty=%at b33b0e2056a85fc2264b294f2cf47dcd45e95186
2021-04-17 05:53:22,488 autosynth [DEBUG] > Running: git log -1 --pretty=%at c6706ee5d693e9ae5967614170732646590d8374
2021-04-17 05:53:22,491 autosynth [DEBUG] > Running: git log -1 --pretty=%at ff6b759fcb58f216f62b48d5be0bb85fafbc3bb2
2021-04-17 05:53:22,495 autosynth [DEBUG] > Running: git checkout f24a49c4f1b9fd35c519dc81c281ce3152f4f737
Note: checking out 'f24a49c4f1b9fd35c519dc81c281ce3152f4f737'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at f24a49c chore(deps): update dependency @types/sinon to v10 (#217)
2021-04-17 05:53:22,499 autosynth [DEBUG] > Running: git checkout ff6b759fcb58f216f62b48d5be0bb85fafbc3bb2
Note: checking out 'ff6b759fcb58f216f62b48d5be0bb85fafbc3bb2'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at ff6b759 chore: Fix python owlbot post processor image cloudbuild.yaml (#1054)
2021-04-17 05:53:22,506 autosynth [DEBUG] > Running: git branch -f autosynth-93
2021-04-17 05:53:22,509 autosynth [DEBUG] > Running: git checkout autosynth-93
Switched to branch 'autosynth-93'
2021-04-17 05:53:22,513 autosynth [INFO] > Running synthtool
2021-04-17 05:53:22,513 autosynth [INFO] > ['/tmpfs/src/github/synthtool/env/bin/python3', '-m', 'synthtool', '--metadata', 'synth.metadata', 'synth.py', '--']
2021-04-17 05:53:22,513 autosynth [DEBUG] > log_file_path: /tmpfs/src/logs/teeny-request/93/sponge_log.log
2021-04-17 05:53:22,514 autosynth [DEBUG] > Running: /tmpfs/src/github/synthtool/env/bin/python3 -m synthtool --metadata synth.metadata synth.py --
2021-04-17 05:53:22,721 synthtool [DEBUG] > Executing /home/kbuilder/.cache/synthtool/teeny-request/synth.py.
On branch autosynth-93
nothing to commit, working tree clean
2021-04-17 05:53:22,841 synthtool [DEBUG] > Using precloned repo /home/kbuilder/.cache/synthtool/synthtool
DEBUG:synthtool:Using precloned repo /home/kbuilder/.cache/synthtool/synthtool
Traceback (most recent call last):
  File "/home/kbuilder/.pyenv/versions/3.6.9/lib/python3.6/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/home/kbuilder/.pyenv/versions/3.6.9/lib/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/tmpfs/src/github/synthtool/synthtool/__main__.py", line 102, in <module>
    main()
  File "/tmpfs/src/github/synthtool/env/lib/python3.6/site-packages/click/core.py", line 829, in __call__
    return self.main(*args, **kwargs)
  File "/tmpfs/src/github/synthtool/env/lib/python3.6/site-packages/click/core.py", line 782, in main
    rv = self.invoke(ctx)
  File "/tmpfs/src/github/synthtool/env/lib/python3.6/site-packages/click/core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/tmpfs/src/github/synthtool/env/lib/python3.6/site-packages/click/core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "/tmpfs/src/github/synthtool/synthtool/__main__.py", line 94, in main
    spec.loader.exec_module(synth_module)  # type: ignore
  File "<frozen importlib._bootstrap_external>", line 678, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/home/kbuilder/.cache/synthtool/teeny-request/synth.py", line 10, in <module>
    templates = common_templates.node_library()
  File "/tmpfs/src/github/synthtool/synthtool/gcp/common.py", line 301, in node_library
    return self._generic_library("node_library", **kwargs)
  File "/tmpfs/src/github/synthtool/synthtool/gcp/common.py", line 65, in _generic_library
    kwargs["metadata"]["repository"]
  File "/tmpfs/src/github/synthtool/synthtool/gcp/common.py", line 374, in _get_default_branch_name
    github_req.raise_for_status()
  File "/tmpfs/src/github/synthtool/env/lib/python3.6/site-packages/requests/models.py", line 943, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 403 Client Error: rate limit exceeded for url: https://api.github.com/repos/googleapis/teeny-request
2021-04-17 05:53:22,935 autosynth [ERROR] > Synthesis failed
2021-04-17 05:53:22,936 autosynth [DEBUG] > Running: git reset --hard HEAD
HEAD is now at f24a49c chore(deps): update dependency @types/sinon to v10 (#217)
2021-04-17 05:53:22,940 autosynth [DEBUG] > Running: git checkout autosynth
Switched to branch 'autosynth'
2021-04-17 05:53:22,944 autosynth [DEBUG] > Running: git clean -fdx
Removing __pycache__/
Traceback (most recent call last):
  File "/home/kbuilder/.pyenv/versions/3.6.9/lib/python3.6/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/home/kbuilder/.pyenv/versions/3.6.9/lib/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/tmpfs/src/github/synthtool/autosynth/synth.py", line 356, in <module>
    main()
  File "/tmpfs/src/github/synthtool/autosynth/synth.py", line 191, in main
    return _inner_main(temp_dir)
  File "/tmpfs/src/github/synthtool/autosynth/synth.py", line 336, in _inner_main
    commit_count = synthesize_loop(x, multiple_prs, change_pusher, synthesizer)
  File "/tmpfs/src/github/synthtool/autosynth/synth.py", line 68, in synthesize_loop
    has_changes = toolbox.synthesize_version_in_new_branch(synthesizer, youngest)
  File "/tmpfs/src/github/synthtool/autosynth/synth_toolbox.py", line 259, in synthesize_version_in_new_branch
    synthesizer.synthesize(synth_log_path, self.environ)
  File "/tmpfs/src/github/synthtool/autosynth/synthesizer.py", line 120, in synthesize
    synth_proc.check_returncode()  # Raise an exception.
  File "/home/kbuilder/.pyenv/versions/3.6.9/lib/python3.6/subprocess.py", line 389, in check_returncode
    self.stderr)
subprocess.CalledProcessError: Command '['/tmpfs/src/github/synthtool/env/bin/python3', '-m', 'synthtool', '--metadata', 'synth.metadata', 'synth.py', '--']' returned non-zero exit status 1.

Google internal developers can see the full log here.

Setup Greenkeeper

It would be super nice to have Greenkeeper keeping things up to date here :)

Module can't be casted to `typeof request` in 3.9.1

It seems like teenyRequest doesn't have the same interface as request in 3.9.1, according to TypeScript:

src/trace-writer.ts:83:26 - error TS2352: Conversion of type 'typeof teenyRequest' to type 'RequestAPI<Request, CoreOptions, RequiredUriUrl>' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first.
  Property 'get' is missing in type 'typeof teenyRequest'.

83           requestModule: teenyRequest as typeof r,

I didn't observe this with 3.9.0.

I can help fix this, but given the recency of the changes it seems like @kinwa91 or @JustinBeckwith might have a better idea of where the fix is?

Support streams

I'm not clear exactly how this integrates with the @google-cloud/* modules, but if this is the library we're using instead of request, I believe we will need stream support as well. Sorry if this is already covered, and I just missed it.

CVE-2020-15168 node-fetch

This is in relation to the following security advisory of node-fetch GHSA-w7rc-rwvf-8q5r

which needs to be updated to ^2.6.1 at a minimum

  1. Is this a client library issue or a product issue?

Security

  1. Did someone already solve this?

No

  1. Do you have a support contract?

No

multipart with 2 or more parts never resolves, possible incorrect multiplexing

Not sure if this is a bug or feature request: multipart is not a documented API, but code and types exist for it.

Environment details

  • OS: ubuntu 18.04
  • Node.js version: 10.20.1
  • npm version: 6.14.4
  • teeny-request version: 6.0.3

Steps to reproduce

A test using two strings fails. The callback is never called and mocha times out at 10s. This is likely due to the PassThrough stream in createMultipartStream (eventually options.body) never has Writable.end() called.

  it('should support multipart with more than 2 parts', done => {
    const scope = nock(uri).post('/').reply(200, {hello: '🌍'});
    teenyRequest(
      {
        method: 'POST',
        headers: {},
        multipart: [{body: 'foo'}, {body: 'bar'}],
        uri,
      },
      (err, res, body) => {
        assert.ifError(err);
        assert.deepStrictEqual(body, {hello: '🌍'});
        scope.done();
        done();
      }
    );
  });

There are two other potential and related bugs:

  1. Incorrect parallel stream multiplexing.
  2. Multiple stream.end() calls.

I haven't looked into these issues, but noticed a possible problem while diagnosing the callback issue mentioned previously.

teeny-request/src/index.ts

Lines 173 to 178 in 45b79fe

part.body.pipe(stream, {end: false});
part.body.on('end', () => {
stream.write('\r\n');
stream.write(finale);
stream.end();
});

The above snippet would synchronously iterate all multipart input streams which effectively does:

const stream = new PassThrough();
part1.body.pipe(stream, {end: false});
part2.body.pipe(stream, {end: false}); // multiple writes from different sources to the same stream
stream.pipe(req);

part1.body.once('end', () => stream.end());
part2.body.once('end', () => stream.end()); // multiple end calls

Make stream readable

Normal request streams allow you to read from them via pipe or data events. This currently is not possible here. We should support it because I think it is probably the expected behavior.

Dependency Dashboard

This issue provides visibility into Renovate updates and their statuses. Learn more

Awaiting Schedule

These updates are awaiting their schedule. Click on a checkbox to get an update now.

  • chore(deps): update actions/setup-node action to v2

Ignored or Blocked

These are blocked by an existing closed PR and will not be recreated unless you click a checkbox below.


  • Check this box to trigger a request for Renovate to run again on this repository

Broken badge link and svg

Is your feature request related to a problem? Please describe.
The Badge svg show unknown and link is not found. They point the old personal domain instead of googleapis
Describe the solution you'd like
Update link and svg

Your .repo-metadata.json file has a problem 🤒

You have a problem with your .repo-metadata.json file:

Result of scan 📈:

  • must have required property 'library_type' in .repo-metadata.json
  • must have required property 'release_level' in .repo-metadata.json
  • must have required property 'client_documentation' in .repo-metadata.json

☝️ Once you address these problems, you can close this issue.

Need help?

  • Schema definition: lists valid options for each field.
  • API index: for gRPC libraries api_shortname should match the subdomain of an API's hostName.
  • Reach out to go/github-automation if you have any questions.

Synthesis failed for teeny-request

Hello! Autosynth couldn't regenerate teeny-request. 💔

Here's the output from running synth.py:

Cloning into 'working_repo'...
Switched to branch 'autosynth'
Traceback (most recent call last):
  File "/home/kbuilder/.pyenv/versions/3.6.1/lib/python3.6/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/home/kbuilder/.pyenv/versions/3.6.1/lib/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/tmpfs/src/git/autosynth/autosynth/synth.py", line 256, in <module>
    main()
  File "/tmpfs/src/git/autosynth/autosynth/synth.py", line 196, in main
    last_synth_commit_hash = get_last_metadata_commit(args.metadata_path)
  File "/tmpfs/src/git/autosynth/autosynth/synth.py", line 149, in get_last_metadata_commit
    text=True,
  File "/home/kbuilder/.pyenv/versions/3.6.1/lib/python3.6/subprocess.py", line 403, in run
    with Popen(*popenargs, **kwargs) as process:
TypeError: __init__() got an unexpected keyword argument 'text'

Google internal developers can see the full log here.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.