uyu423/r2curl

View on GitHub
README.md

Summary

Maintainability
Test Coverage
# r2curl

[![npm version](https://badge.fury.io/js/r2curl.svg)](https://badge.fury.io/js/r2curl) [![Download Status](https://img.shields.io/npm/dw/r2curl.svg)](https://npmcharts.com/compare/r2curl?minimal=true) [![Github Star](https://img.shields.io/github/stars/uyu423/r2curl.svg?style=popout)](https://github.com/uyu423/r2curl)  [![MIT Licence](https://badges.frapsoft.com/os/mit/mit.svg?v=103)](https://opensource.org/licenses/mit-license.php) [![CircleCI](https://circleci.com/gh/uyu423/r2curl.svg?style=svg)](https://circleci.com/gh/uyu423/r2curl) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/f74cdea970d44550a0bff9319e467256)](https://www.codacy.com/app/uyu423/r2curl?utm_source=github.com&utm_medium=referral&utm_content=uyu423/r2curl&utm_campaign=Badge_Grade) [![Code Climate](https://codeclimate.com/github/uyu423/r2curl.svg)](https://codeclimate.com/github/uyu423/r2curl) [![Test Coverage](https://api.codeclimate.com/v1/badges/bb19fbd2394b545aefb2/test_coverage)](https://codeclimate.com/github/uyu423/r2curl/test_coverage)

<p align="center">
  <img width="460" src="./logo.png">
</p>

## Background

- [r2curl](https://github.com/uyu423/r2curl) was inspired by [@delirius325/axios-curlirize](https://github.com/delirius325/axios-curlirize).
- axios-curlirize is very convenient. but works as a middleware for axios, and I think this part is black box logic 
  - it contains potentially asynchronous concurrency issues and difficult-to-manage elements.
- So I created a new 'Request to cURL' package that is completely independent of the dependencies of axios.

## Feature

- Generates cURL commands completely independently from the outside of the request wrapper package.
- Provides additional options involved in generating the cURL command.
- It will be updated soon to be available in packages like [node-fetch](https://www.npmjs.com/package/node-fetch) or [request](https://www.npmjs.com/package/request).

## Roadmap

  - [x] [axios](https://www.npmjs.com/package/axios)
    - [x] AxiosRequestConfig
    - [x] AxiosResposne
  - [ ] [node-fetch](https://www.npmjs.com/package/node-fetch)
  - [ ] [request](https://www.npmjs.com/package/request)
  - [ ] ...

## Install

```bash
npm install r2curl --save
```

## Usage

### axios

#### `AxiosResponse`

```typescript
// if js, const r2curl = require('r2curl');
import r2curl from 'r2curl';

const response = await axios.get('https://google.com');
const curl = r2curl(response);

console.log(curl);
// stdout "curl -X GET 'https://google.com' -H 'Accept:application/json, text/plain, */*' -H 'User-Agent:axios/0.18.0'"
```

#### `AxiosRequestConfig`

```typescript
// if js, const r2curl = require('r2curl');
import r2curl from 'r2curl';

// config as AxiosRequestConfig
const config = {
  url: 'https://google.com',
  method: 'POST',
  data: {
    caller: 'curl tester',
  },
  headers: {
    'Content-Type': 'application/json',
  },
};

const curl = r2curl(reqeustConfig);
console.log(curl);
// stdout `curl -X POST 'https://google.com' -H 'Content-Type:application/json' --data '{"caller":"curl tester"}'`

const response = await axios.request(config);
```

### node-fetch

- update soon (target 0.2.0)
- see [github project board](https://github.com/uyu423/r2curl/projects/1)

### request

- update soon (target 0.2.0)
- see [github project board](https://github.com/uyu423/r2curl/projects/1)

## More `r2curl` Options

### `option.quote`

- Determines the type of quota around the body and uri.
- default is `single`

```typescript
import r2curl from 'r2curl';

// option as IR2CurlOptions.ts
const option = {
  /** Determines the type of quota around the body and uri. */
  quote: 'double',
};

const curl = r2curl(requestConfig, option);
console.log(curl); 
```

### `option.defaultContentType`

- Determines the default Content-Type header value for `POST` and `PUT` requests.
- default is `application/json; charset=utf-8`
- Type is `(enum) HTTP_HEADER_CONTENT_TYPE` | `string` | `false`;
- If you give `(boolean) false` to `defaultContentType`, you can disable `Content-Type` Header.

```typescript
import r2curl, { HTTP_HEADER_CONTENT_TYPE } from 'r2curl';

// const optionUsingEnum = {
//   defaultContentType: HTTP_HEADER_CONTENT_TYPE.TEXT,
// };
const option = {
  defaultContentType: 'application/json5',
}
const request: AxiosRequestConfig = { url: 'https://google.com', method: 'POST' };

const curl = r2curl(config, option);
console.log(curl); 
// output: curl -X POST 'https://google.com' -H 'Content-Type:application/json5
```

### `option.forceBody`

- Accept Body all HTTP Method.
- By default, Body is not allowed in `GET` and `DELETE` methods.
- However, some services such as ElasticSearch should be able to use the Body as a `GET` method. At this point, use this option to activate the Body.

```typescript
import r2curl from 'r2curl';

const config: AxiosRequestConfig = {
  url: 'https://google.com',
  method: 'GET',
  data: {
    caller: 'https://github.com/uyu423/r2curl',
    sorry: true,
  },
};

const option = {
  forceBody: true,
}

const curl = r2curl(config, option);
// output: 'curl -X GET \'https://google.com\' --data \'{"caller":"https://github.com/uyu423/r2curl","sorry":true}\''
```