diff --git a/.gitignore b/.gitignore index c07f7e1..0859556 100644 --- a/.gitignore +++ b/.gitignore @@ -56,3 +56,4 @@ lib/ .DS_Store deploy-script.sh coverage/ +.nyc_output/ diff --git a/configs/node/api-flow-config.js b/configs/node/api-flow-config.js index 97b2d80..f6cad0f 100644 --- a/configs/node/api-flow-config.js +++ b/configs/node/api-flow-config.js @@ -2,28 +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 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 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 InternalSerializer from '../../src/serializers/internal/Serializer' export const loaders = [ SwaggerLoader, - RAMLLoader + RAMLLoader, + PostmanV2Loader ] export const parsers = [ SwaggerV2Parser, - RAMLV1Parser + RAMLV1Parser, + PostmanV2Parser ] export const serializers = [ SwaggerV2Serializer, RAMLV1Serializer, - InternalSerializer + InternalSerializer, + PostmanV2Serializer ] export const environment = Environment diff --git a/configs/web/api-flow-config.js b/configs/web/api-flow-config.js index 81aa211..12e25e9 100644 --- a/configs/web/api-flow-config.js +++ b/configs/web/api-flow-config.js @@ -2,28 +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 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 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 InternalSerializer from '../../src/serializers/internal/Serializer' export const loaders = [ SwaggerLoader, - RAMLLoader + RAMLLoader, + PostmanV2Loader ] export const parsers = [ SwaggerV2Parser, - RAMLV1Parser + RAMLV1Parser, + PostmanV2Parser ] export const serializers = [ SwaggerV2Serializer, RAMLV1Serializer, - InternalSerializer + InternalSerializer, + PostmanV2Serializer ] export const environment = Environment diff --git a/configs/webworker/api-flow-config.js b/configs/webworker/api-flow-config.js index 81aa211..12e25e9 100644 --- a/configs/webworker/api-flow-config.js +++ b/configs/webworker/api-flow-config.js @@ -2,28 +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 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 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 InternalSerializer from '../../src/serializers/internal/Serializer' export const loaders = [ SwaggerLoader, - RAMLLoader + RAMLLoader, + PostmanV2Loader ] export const parsers = [ SwaggerV2Parser, - RAMLV1Parser + RAMLV1Parser, + PostmanV2Parser ] export const serializers = [ SwaggerV2Serializer, RAMLV1Serializer, - InternalSerializer + InternalSerializer, + PostmanV2Serializer ] export const environment = Environment diff --git a/src/loaders/internal/Loader.js b/src/loaders/internal/Loader.js index efdf747..c4e033c 100644 --- a/src/loaders/internal/Loader.js +++ b/src/loaders/internal/Loader.js @@ -70,11 +70,12 @@ methods.parseJSON = (str) => { methods.resolve = (options, uri, { $ref = '' } = {}) => { const uriToLoad = resolve(uri, $ref) - if (parse(uriToLoad).protocol === 'file:') { - return options.fsResolver.resolve(uriToLoad.split('#')[0]) + const protocol = parse(uriToLoad).protocol + if (protocol && protocol.substr(0, 4) === 'http') { + return options.httpResolver.resolve(uriToLoad.split('#')[0]) } - return options.httpResolver.resolve(uriToLoad.split('#')[0]) + return options.fsResolver.resolve(uriToLoad.split('#')[0]) } diff --git a/src/loaders/postman/v2.0/Loader.js b/src/loaders/postman/v2.0/Loader.js index 237398d..96f8481 100644 --- a/src/loaders/postman/v2.0/Loader.js +++ b/src/loaders/postman/v2.0/Loader.js @@ -87,11 +87,11 @@ methods.isParsable = (content) => { methods.resolve = (options, uri, { $ref = '' } = {}) => { const uriToLoad = resolve(uri, $ref) const protocol = parse(uriToLoad).protocol - if (protocol === 'file:' || protocol === 'file') { - return options.fsResolver.resolve(uriToLoad.split('#')[0]) + if (protocol && protocol.substr(0, 4) === 'http') { + return options.httpResolver.resolve(uriToLoad.split('#')[0]) } - return options.httpResolver.resolve(uriToLoad.split('#')[0]) + return options.fsResolver.resolve(uriToLoad.split('#')[0]) } methods.normalizeRequestItem = (item) => { diff --git a/src/loaders/swagger/Loader.js b/src/loaders/swagger/Loader.js index ff66f33..159e516 100644 --- a/src/loaders/swagger/Loader.js +++ b/src/loaders/swagger/Loader.js @@ -122,11 +122,12 @@ methods.traverse = (content, { $ref = '#/' } = {}) => { methods.resolve = (options, uri, { $ref = '' } = {}) => { const uriToLoad = resolve(uri, $ref) - if (parse(uriToLoad).protocol === 'file:') { - return options.fsResolver.resolve(uriToLoad.split('#')[0]) + const protocol = parse(uriToLoad).protocol + if (protocol && protocol.substr(0, 4) === 'http') { + return options.httpResolver.resolve(uriToLoad.split('#')[0]) } - return options.httpResolver.resolve(uriToLoad.split('#')[0]) + return options.fsResolver.resolve(uriToLoad.split('#')[0]) } methods.objectMap = (obj, func) => { diff --git a/src/loaders/template/v1.0/Loader.js b/src/loaders/template/v1.0/Loader.js index 1509f5d..7ca25c7 100644 --- a/src/loaders/template/v1.0/Loader.js +++ b/src/loaders/template/v1.0/Loader.js @@ -125,11 +125,11 @@ methods.isParsable = (content) => { methods.resolve = (options, uri, { $ref = '' } = {}) => { const uriToLoad = resolve(uri, $ref) const protocol = parse(uriToLoad).protocol - if (protocol === 'file:' || protocol === 'file' || !protocol) { - return options.fsResolver.resolve(uriToLoad.split('#')[0]) + if (protocol && protocol.substr(0, 4) === 'http') { + return options.httpResolver.resolve(uriToLoad.split('#')[0]) } - return options.httpResolver.resolve(uriToLoad.split('#')[0]) + return options.fsResolver.resolve(uriToLoad.split('#')[0]) } /** diff --git a/src/parsers/postman/v2.0/Parser.js b/src/parsers/postman/v2.0/Parser.js index 52b8980..401546f 100644 --- a/src/parsers/postman/v2.0/Parser.js +++ b/src/parsers/postman/v2.0/Parser.js @@ -478,7 +478,7 @@ methods.addHostEntryToHostMap = (hostMap, { key, value }) => { const hostname = key.get('hostname') ? key.get('hostname').generate(List([ '{{', '}}' ])) : '' const port = key.get('port') ? ':' + key.get('port').generate(List([ '{{', '}}' ])) : '' const host = hostname + port - const pathname = key.get('pathname').generate(List([ '{{', '}}' ])) + const pathname = key.get('pathname') ? key.get('pathname').generate(List([ '{{', '}}' ])) : '' if (!hostMap[host]) { hostMap[host] = { entries: [], lcPathname: pathname.split('/') } diff --git a/src/parsers/postman/v2.0/__tests__/Parser.spec.js b/src/parsers/postman/v2.0/__tests__/Parser.spec.js index dd36787..b2cb0c1 100644 --- a/src/parsers/postman/v2.0/__tests__/Parser.spec.js +++ b/src/parsers/postman/v2.0/__tests__/Parser.spec.js @@ -960,6 +960,13 @@ describe('parsers/postman/v2.0/Parser.js', () => { variableDelimiters: List([ '{{', '}}', ':' ]) }), value: 321 + }, + { + key: new URL({ + url: 'staging.paw.cloud', + variableDelimiters: List([ '{{', '}}', ':' ]) + }), + value: 123 } ] const expected = { @@ -1017,6 +1024,18 @@ describe('parsers/postman/v2.0/Parser.js', () => { } ], lcPathname: [ '', 'users', '321' ] + }, + 'staging.paw.cloud': { + entries: [ + { + key: new URL({ + url: 'staging.paw.cloud', + variableDelimiters: List([ '{{', '}}', ':' ]) + }), + value: 123 + } + ], + lcPathname: [ '' ] } } diff --git a/src/serializers/paw/Serializer.js b/src/serializers/paw/Serializer.js index 23297a1..a5f0ff1 100644 --- a/src/serializers/paw/Serializer.js +++ b/src/serializers/paw/Serializer.js @@ -442,7 +442,7 @@ methods.convertAuthIntoDynamicValue = (auth) => { * @param {Environment} environment: the environment in which this auth value is applicable. * @param {Auth} auth: the auth to add to the domain * @param {string} key: the name of the auth - * @returns {EnvironmentVariable} the newly created environment variable. + * @returns {{ variable: EnvironmentVariable, auth: Auth }} the newly created environment variable. */ methods.addAuthToDomain = (domain, environment, auth, key) => { const variable = domain.createEnvironmentVariable(key) @@ -450,7 +450,7 @@ methods.addAuthToDomain = (domain, environment, auth, key) => { const ds = methods.wrapDV(dv) variable.setValue(ds, environment) - return variable + return { variable, auth } } /** @@ -1041,7 +1041,7 @@ methods.convertAuthFromReference = (store, reference) => { * converts a reference or an auth into a DynamicString Entry. * @param {Store} store: the store used to resolve references * @param {Auth|Reference} authOrReference: the record to convert into a DynamicString - * @returns {DynamicString} the corresponding DynamicString + * @returns {{ variable: DynamicString, auth: Auth }} the corresponding DynamicString */ methods.convertReferenceOrAuthToDsEntry = (store, authOrReference) => { if (authOrReference instanceof Reference) { @@ -1049,18 +1049,25 @@ methods.convertReferenceOrAuthToDsEntry = (store, authOrReference) => { } const dv = methods.convertAuthIntoDynamicValue(authOrReference) - return methods.wrapDV(dv) + return { variable: methods.wrapDV(dv), auth: authOrReference } } // TODO create Variable DS that has enum with all auth possible /** * sets the Auth DynamicString as am Authorization Header. * @param {PawRequest} pawRequest: the paw request to update - * @param {DynamicString} auth: the DynamicString representing an auth + * @param {Objecti} authData: the object containing the auth representation as a DynamicString and + * the original auth Record. + * @param {DynamicString} variable: the DynamicString representing an auth + * @param {Auth} auth: the original auth * @returns {PawRequest} the update paw request */ -methods.addAuthToRequest = (pawRequest, auth) => { - pawRequest.setHeader('Authorization', auth) +methods.addAuthToRequest = (pawRequest, { variable, auth }) => { + let authName = 'Authorization' + if (auth instanceof Auth.ApiKey) { + authName = auth.get('name') + } + pawRequest.setHeader(authName, variable) return pawRequest } diff --git a/src/serializers/paw/__tests__/Serializer.spec.js b/src/serializers/paw/__tests__/Serializer.spec.js index ccd6baf..1eb1c31 100644 --- a/src/serializers/paw/__tests__/Serializer.spec.js +++ b/src/serializers/paw/__tests__/Serializer.spec.js @@ -746,7 +746,7 @@ describe('serializers/paw/Serializer.js', () => { spyOn(__internals__, 'convertAuthIntoDynamicValue').andReturn(123) spyOn(__internals__, 'wrapDV').andReturn('123') - const expected = variable + const expected = { variable, auth } const actual = __internals__.addAuthToDomain(domain, environment, auth, key) expect(domain.createEnvironmentVariable).toHaveBeenCalledWith(key) @@ -2040,7 +2040,7 @@ describe('serializers/paw/Serializer.js', () => { const store = new Store() const auth = new Auth.Basic() - const expected = '123' + const expected = { variable: '123', auth } const actual = __internals__.convertReferenceOrAuthToDsEntry(store, auth) expect(actual).toEqual(expected) @@ -2051,12 +2051,27 @@ describe('serializers/paw/Serializer.js', () => { it('should work', () => { const pawReq = { setHeader: () => {} } spyOn(pawReq, 'setHeader').andReturn(123) - const auth = 'some dynamic string' + const authData = { variable: 'some dynamic string', auth: new Auth.Basic() } + + const expected = pawReq + const actual = __internals__.addAuthToRequest(pawReq, authData) + + expect(pawReq.setHeader).toHaveBeenCalledWith('Authorization', authData.variable) + expect(actual).toEqual(expected) + }) + + it('should work with ApiKeys custom headers', () => { + const pawReq = { setHeader: () => {} } + spyOn(pawReq, 'setHeader').andReturn(123) + const authData = { + variable: 'some dynamic string', + auth: new Auth.ApiKey({ name: 'X-Auth-Token' }) + } const expected = pawReq - const actual = __internals__.addAuthToRequest(pawReq, auth) + const actual = __internals__.addAuthToRequest(pawReq, authData) - expect(pawReq.setHeader).toHaveBeenCalledWith('Authorization', auth) + expect(pawReq.setHeader).toHaveBeenCalledWith('X-Auth-Token', authData.variable) expect(actual).toEqual(expected) }) }) diff --git a/src/serializers/postman/v2.0/Serializer.js b/src/serializers/postman/v2.0/Serializer.js index 1920695..70f68f1 100644 --- a/src/serializers/postman/v2.0/Serializer.js +++ b/src/serializers/postman/v2.0/Serializer.js @@ -35,7 +35,7 @@ import Auth from '../../../models/Auth' import { convertEntryListInMap } from '../../../utils/fp-utils' const __meta__ = { - format: 'postman', + format: 'postman-collection', version: 'v2.0' }