Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support URL Objects #145

Open
wants to merge 34 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
6cb67ed
Merge pull request #1 from luckymarmot/develop
JonathanMontane Aug 4, 2017
6548f50
Update README.md
JonathanMontane Aug 4, 2017
117f3de
fixed a bug where a single slash between two components was removed f…
JonathanMontane Aug 16, 2017
7da803f
Merge pull request #2 from JonathanMontane/0001-fix-swagger-path-issue
JonathanMontane Aug 16, 2017
f631741
added support for custom headers for api key auths
JonathanMontane Aug 20, 2017
3e57cba
Merge pull request #3 from JonathanMontane/0003-fix-auth-header
JonathanMontane Aug 20, 2017
ada2adb
fixed pathname bug for very weird urls
JonathanMontane Sep 14, 2017
8d64741
Merge pull request #5 from JonathanMontane/0005-postman-fix
JonathanMontane Sep 14, 2017
ea91a47
Fixed wrong folder for webworker output
JonathanMontane Sep 28, 2017
3df6680
fixed missing postman loader, parser, and serializers from configs
JonathanMontane Oct 5, 2017
80319d7
Merge pull request #6 from JonathanMontane/0006-augment-configs
JonathanMontane Oct 5, 2017
3ef1dca
loaders now defaults to fsResolution instead of httpResolution
JonathanMontane Oct 5, 2017
3793547
Merge pull request #7 from JonathanMontane/0007-fix-loaders
JonathanMontane Oct 5, 2017
aba4a50
linting
JonathanMontane Oct 5, 2017
4eca0c0
Merge pull request #8 from JonathanMontane/0007-fix-loaders
JonathanMontane Oct 5, 2017
038778f
Merge branch 'develop' of github.com:JonathanMontane/API-Flow into de…
Oct 10, 2017
905b69f
Postman Collection loaders, serializers and parsers
Oct 10, 2017
897505e
Merge pull request #9 from philsturgeon/fix-postman-node
JonathanMontane Oct 10, 2017
1b8beb2
Fixed the installation instructions
philsturgeon Aug 26, 2017
e0eaf63
Created a clear TODO for anyone looking
Dec 5, 2017
0cca354
Hunting through travis.yml isnt ideal
Nov 30, 2017
4cd8c6a
Local links work well for GitHub READMEs
Dec 5, 2017
376bcf4
Merge branch 'develop' of https://github.com/luckymarmot/API-Flow int…
Dec 6, 2017
833f96c
For some reason the tests still pass
Dec 6, 2017
13576bb
Never make a header with value: null
Dec 6, 2017
ed487db
Merge branch 'feature/no-null-postman-header-value' into develop
Dec 6, 2017
576a2ff
Merge branch 'improve-readme' into develop
Dec 6, 2017
f81a99a
Merge branch 'please-dont-make-contributors-hunt' into develop
Dec 6, 2017
6b5d75d
Just be inconsistent like before
Dec 6, 2017
a2c79ef
Support example and x-example in Swagger Properties
Dec 11, 2017
6a01f3d
Merge branch 'feature/swagger-examples' into develop
Dec 12, 2017
f4da01f
Empty swagger response description is actually fine
Dec 7, 2017
6765409
Merge branch 'feature/swagger-default-description' into develop
Dec 20, 2017
655b752
Support URL objects with raw and not much else
Nov 30, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
PRs are always welcome, and we'll be happy to merge them if the test suite passes.

To run the entire test suite would take a long time, so we've broken it down into various groups:

``` shell
TEST_TARGET=lint make test
TEST_TARGET=unit make test
TEST_TARGET=e2e make test
TEST_TARGET=cov make test
```

All of these will be run by Travis, but you could save the ice caps from melting a little by running at least `unit` and `e2e` before you push.

Our sole requirement is that organizations that want to extend API-Flow to support their format write both a parser and a serializer, and not simply a serializer.
79 changes: 44 additions & 35 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,60 +4,72 @@

A flow written in ES6 using Immutable to convert between API description formats (Swagger, etc.) and other programs such as cURL command lines.

## What formats are supported and what will be in the future
## Format Support

We currently support:
- `Swagger v2.0 (in/out)`
- `RAML v1.0 (in/out)`
- `Postman Collection v2.0 (in/out)`
- `Paw v3.1 (in/out)`

- Swagger v2.0 (in/out)
- RAML v1.0 (in/out)
- Postman Collection v2.0 (in/out)
- Paw v3.1 (in/out)

We intend to support:
- `Swagger v3.0`
- `RAML v0.8`
- `Postman Collection v1.0`
- `Postman Dump v1.0`
- `Insomnia v3.0`
- `Api-Blueprint`

- Swagger v3.0
- RAML v0.8
- Postman Collection v1.0
- Postman Dump v1.0
- Insomnia v3.0
- API Blueprint
- and many more.

## Installation
### from a cloned repository

just run
You can install this library in two different ways.


### Install via NPM/Yarn

```shell
$ yarn add api-flow
# or
$ npm install api-flow
```

### Install from source

Just run:

```sh
git clone https://github.com/luckymarmot/API-Flow.git
cd API-Flow
make install
yarn install
make
```

This will install the node module dependencies

## Building the different libraries
### node, web, and webworker

run the following command to build API-Flow for the different environments that you need
This will install the node module dependencies, but you will need to build API-Flow for the different [environments](src/environments) that you need:

```sh
# use TARGET="node" if you only want the node library
make runners TARGET="node web webworker"
```

### Paw

You can use the following command to add the different extensions to Paw
You can use the following command to compile different extensions.

```sh
# use TARGET="swagger" if you only want the swagger bindings
make transfer TARGET="swagger raml1 postman2"
```

## Using the npm module
### as a standard library
## Usage

### Standard Library

```js
const ApiFlow = require('api-flow'); // if from npm
const ApiFlow = require('./dist/node/api-flow.js'); // if from `make runners TARGET="node"`
const ApiFlow = require('api-flow').default; // if from yarn/npm
const ApiFlow = require('./dist/node/api-flow.js').default; // if from `make runners TARGET="node"`

const path = require('path');

const options = {
source: {
Expand All @@ -80,22 +92,19 @@ promise.then((data) => {
})
```

### Using as a CLI (coming soon)
```sh
node ./bin/api-flow.js some_swagger.json -f swagger -t raml > converted.yml
```

### User Interface

API-Flow is one of the main components of [Console.REST](https://github.com/luckymarmot/console-rest). If you're an API user, you can easily use [https://console.rest/](https://console.rest/) to convert API description files. If you're an API provider, you can add a button to your API docs to let your users open and play with your API in client apps including Paw or Postman.

## Contributing

PRs are welcomed!
Read [CONTRIBUTING.md](CONTRIBUTING.md) for more tips on testing and contributing.

Our sole requirement is that organizations that want to extend API-Flow to support their format write both a parser and a serializer, and not simply a serializer.

## Documentation
You can find more information about the internal structure of API-Flow in [src](https://github.com/luckymarmot/API-Flow/tree/develop/src). We've also created a set of templates to help speed up the extension process: [loader](https://github.com/luckymarmot/API-Flow/tree/develop/src/loaders/template/v1.0), [parser](https://github.com/luckymarmot/API-Flow/tree/develop/src/parsers/template/v1.0/), and [environment](https://github.com/luckymarmot/API-Flow/tree/develop/src/environments/template)

You can find more information about the internal structure of API-Flow in [src](src). We've also created a set of templates to help speed up the extension process: [loader](src/loaders/template/v1.0), [parser](src/parsers/template/v1.0/), and [environment](src/environments/template)

## License

Expand All @@ -104,4 +113,4 @@ Copyright © 2016 Paw Inc.

## Contributors

See [Contributors](https://github.com/luckymarmot/API-Flow/graphs/contributors).
See [Contributors](https://github.com/JonathanMontane/API-Flow/graphs/contributors).
12 changes: 6 additions & 6 deletions configs/node/api-flow-config.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,34 +2,34 @@ import Environment from '../../src/environments/node/Environment'

import SwaggerLoader from '../../src/loaders/swagger/Loader'
import RAMLLoader from '../../src/loaders/raml/Loader'
import PostmanV2Loader from '../../src/loaders/postman/v2.0/Loader'
import PostmanCollectionV2Loader from '../../src/loaders/postman/v2.0/Loader'

import SwaggerV2Parser from '../../src/parsers/swagger/v2.0/Parser'
import RAMLV1Parser from '../../src/parsers/raml/v1.0/Parser'
import PostmanV2Parser from '../../src/loaders/postman/v2.0/Parser'
import PostmanCollectionV2Parser from '../../src/parsers/postman/v2.0/Parser'

import SwaggerV2Serializer from '../../src/serializers/swagger/v2.0/Serializer'
import RAMLV1Serializer from '../../src/serializers/raml/v1.0/Serializer'
import PostmanV2Serializer from '../../src/serializers/postman/v2.0/Serializer'
import PostmanCollectionV2Serializer from '../../src/serializers/postman/v2.0/Serializer'
import InternalSerializer from '../../src/serializers/internal/Serializer'

export const loaders = [
SwaggerLoader,
RAMLLoader,
PostmanV2Loader
PostmanCollectionV2Loader
]

export const parsers = [
SwaggerV2Parser,
RAMLV1Parser,
PostmanV2Parser
PostmanCollectionV2Parser
]

export const serializers = [
SwaggerV2Serializer,
RAMLV1Serializer,
InternalSerializer,
PostmanV2Serializer
PostmanCollectionV2Serializer
]

export const environment = Environment
10 changes: 5 additions & 5 deletions configs/web/api-flow-config.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,21 @@ import Environment from '../../src/environments/web/Environment'

import SwaggerLoader from '../../src/loaders/swagger/Loader'
import RAMLLoader from '../../src/loaders/raml/Loader'
import PostmanV2Loader from '../../src/loaders/postman/v2.0/Loader'
import PostmanCollectionV2Loader from '../../src/loaders/postman/v2.0/Loader'

import SwaggerV2Parser from '../../src/parsers/swagger/v2.0/Parser'
import RAMLV1Parser from '../../src/parsers/raml/v1.0/Parser'
import PostmanV2Parser from '../../src/loaders/postman/v2.0/Parser'
import PostmanCollectionV2Parser from '../../src/parsers/postman/v2.0/Parser'

import SwaggerV2Serializer from '../../src/serializers/swagger/v2.0/Serializer'
import RAMLV1Serializer from '../../src/serializers/raml/v1.0/Serializer'
import PostmanV2Serializer from '../../src/serializers/postman/v2.0/Serializer'
import PostmanCollectionV2Serializer from '../../src/serializers/postman/v2.0/Serializer'
import InternalSerializer from '../../src/serializers/internal/Serializer'

export const loaders = [
SwaggerLoader,
RAMLLoader,
PostmanV2Loader
PostmanCollectionV2Loader
]

export const parsers = [
Expand All @@ -29,7 +29,7 @@ export const serializers = [
SwaggerV2Serializer,
RAMLV1Serializer,
InternalSerializer,
PostmanV2Serializer
PostmanCollectionV2Serializer
]

export const environment = Environment
12 changes: 6 additions & 6 deletions configs/webworker/api-flow-config.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,34 +2,34 @@ import Environment from '../../src/environments/web/Environment'

import SwaggerLoader from '../../src/loaders/swagger/Loader'
import RAMLLoader from '../../src/loaders/raml/Loader'
import PostmanV2Loader from '../../src/loaders/postman/v2.0/Loader'
import PostmanCollectionV2Loader from '../../src/loaders/postman/v2.0/Loader'

import SwaggerV2Parser from '../../src/parsers/swagger/v2.0/Parser'
import RAMLV1Parser from '../../src/parsers/raml/v1.0/Parser'
import PostmanV2Parser from '../../src/loaders/postman/v2.0/Parser'
import PostmanCollectionV2Parser from '../../src/parsers/postman/v2.0/Parser'

import SwaggerV2Serializer from '../../src/serializers/swagger/v2.0/Serializer'
import RAMLV1Serializer from '../../src/serializers/raml/v1.0/Serializer'
import PostmanV2Serializer from '../../src/serializers/postman/v2.0/Serializer'
import PostmanCollectionV2Serializer from '../../src/serializers/postman/v2.0/Serializer'
import InternalSerializer from '../../src/serializers/internal/Serializer'

export const loaders = [
SwaggerLoader,
RAMLLoader,
PostmanV2Loader
PostmanCollectionV2Loader
]

export const parsers = [
SwaggerV2Parser,
RAMLV1Parser,
PostmanV2Parser
PostmanCollectionV2Parser
]

export const serializers = [
SwaggerV2Serializer,
RAMLV1Serializer,
InternalSerializer,
PostmanV2Serializer
PostmanCollectionV2Serializer
]

export const environment = Environment
2 changes: 1 addition & 1 deletion configs/webworker/webpack.config.babel.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ const config = {
target: 'webworker',
entry: path.resolve(__dirname, './api-flow.js'),
output: {
path: path.resolve(__dirname, '../../../dist/node/'),
path: path.resolve(__dirname, '../../../dist/webworker/'),
filename: 'api-flow.js',
libraryTarget: 'umd'
},
Expand Down
4 changes: 2 additions & 2 deletions src/api-flow-config.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import PostmanCollectionV2Parser from './parsers/postman/v2.0/Parser'
import SwaggerV2Serializer from './serializers/swagger/v2.0/Serializer'
import RAMLV1Serializer from './serializers/raml/v1.0/Serializer'
import InternalSerializer from './serializers/internal/Serializer'
import PostmanV2Serializer from './serializers/postman/v2.0/Serializer'
import PostmanCollectionV2Serializer from './serializers/postman/v2.0/Serializer'
import ApiBlueprint1ASerializer from './serializers/api-blueprint/1A/Serializer'

export const loaders = [
Expand All @@ -34,7 +34,7 @@ export const serializers = [
SwaggerV2Serializer,
RAMLV1Serializer,
InternalSerializer,
PostmanV2Serializer,
PostmanCollectionV2Serializer,
ApiBlueprint1ASerializer
]

Expand Down
24 changes: 17 additions & 7 deletions src/loaders/postman/v2.0/Loader.js
Original file line number Diff line number Diff line change
Expand Up @@ -270,17 +270,27 @@ methods.normalizeRequestURL = (item) => {
return item
}

if (typeof item.request.url === 'string') {
item.request.urlString = item.request.url
item.request.url = methods.createPostmanURLObjectFromURLString(item.request.urlString)
}
else {
if (item.request.url && !item.request.url.domain && item.request.url.host) {
item.request.url.domain = item.request.url.host
let { url, urlString } = item.request

if (typeof url === 'object') {
// Lets just use this raw string, its gonna have everything
if (url.raw) {
item.request.urlString = url.raw
item.request.url = methods.createPostmanURLObjectFromURLString(url.raw)
return item
}
// cater to some random bug before we do the object normalization
if (!url.domain && url.host) {
item.request.url.domain = url.host
}
item.request.urlString = methods.createPostmanURLStringFromURLObject(item.request.url)
return item
}

// It's not an object, hope its a string or numeric that'll act like a string
item.request.urlString = url
item.request.url = methods.createPostmanURLObjectFromURLString(url)

return item
}

Expand Down
8 changes: 5 additions & 3 deletions src/loaders/postman/v2.0/__tests__/Loader.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -436,12 +436,14 @@ describe('loaders/postman/v2.0/Loader.js', () => {
const inputs = [
{ request: { url: '123' } },
{ request: { url: 234 } },
{ request: { url: { host: 345 } } }
{ request: { url: { raw: 345 } } },
{ request: { url: { host: 456 } } }
]
const expected = [
{ request: { url: '123123', urlString: '123' } },
{ request: { url: 234, urlString: 234 / 2 } },
{ request: { url: { host: 345, domain: 345 }, urlString: 345 / 2 } }
{ request: { url: 234 * 2, urlString: 234 } },
{ request: { url: 345 * 2, urlString: 345 } },
{ request: { url: { host: 456, domain: 456 }, urlString: 456 / 2 } }
]
const actual = inputs.map(input => __internals__.normalizeRequestURL(input))
expect(actual).toEqual(expected)
Expand Down
6 changes: 6 additions & 0 deletions src/parsers/swagger/v2.0/Parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -1252,6 +1252,12 @@ methods.convertParameterObjectIntoParameter = (parameterEntry) => {
applicableContexts
}

if (typeof parameter.example !== 'undefined') {
paramInstance.examples = List([parameter.example])
} else if (typeof parameter['x-example'] !== 'undefined') {
paramInstance.examples = List([parameter['x-example']])
}

if (parameter.type === 'array' && parameter.items) {
const { value } = methods.convertParameterObjectIntoParameter({
key: null,
Expand Down
Loading