From 434bcb5216e0dd734eaaba60aeb8a1c4582b75d4 Mon Sep 17 00:00:00 2001 From: Gilas Amalanda Date: Thu, 27 Oct 2022 20:34:27 +0700 Subject: [PATCH 1/3] feat: add required for formdata --- lib/index.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/index.js b/lib/index.js index a8d58fb..9fafde6 100644 --- a/lib/index.js +++ b/lib/index.js @@ -195,16 +195,19 @@ function parseBody (body = {}, method) { 'text/plain': {} } break - case 'formdata': + case 'formdata': { + let required = body.formdata.filter(obj => /\[required\]/gi.test(obj.description)).map(obj => obj.key) content = { 'multipart/form-data': { schema: { type: 'object', + ...(required.length ? { required: required } : {}), properties: body.formdata.reduce(mapFormData(), {}) } } } break + } case 'urlencoded': content = { 'application/x-www-form-urlencoded': { From e70da658ea32132293b3c73e332f0bb9275f11a6 Mon Sep 17 00:00:00 2001 From: Gilas Amalanda Date: Thu, 27 Oct 2022 23:16:57 +0700 Subject: [PATCH 2/3] test: change expected form data output yml --- test/resources/output/FormData.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/resources/output/FormData.yml b/test/resources/output/FormData.yml index 69f576c..da7d3d9 100644 --- a/test/resources/output/FormData.yml +++ b/test/resources/output/FormData.yml @@ -16,6 +16,9 @@ paths: multipart/form-data: schema: type: object + required: + - name + - email properties: name: type: string From 8cdbbda9261e0e27b5e33114a12614936c4e6880 Mon Sep 17 00:00:00 2001 From: Jorge Date: Sat, 5 Nov 2022 19:27:57 +0100 Subject: [PATCH 3/3] feat: formdata and x-www-form-urlencoded support required indicator in postman field descriptor --- lib/index.js | 43 ++++++++++++++---------- package-lock.json | 4 +-- package.json | 2 +- test/resources/output/FormUrlencoded.yml | 5 +++ 4 files changed, 33 insertions(+), 21 deletions(-) diff --git a/lib/index.js b/lib/index.js index 0ef1103..ec9f1d3 100644 --- a/lib/index.js +++ b/lib/index.js @@ -196,42 +196,40 @@ function parseBody (body = {}, method) { } break case 'formdata': { - let required = body.formdata.filter(obj => /\[required\]/gi.test(obj.description)).map(obj => obj.key) content = { - 'multipart/form-data': { - schema: { - type: 'object', - ...(required.length ? { required: required } : {}), - properties: body.formdata.reduce(mapFormData(), {}) - } - } + 'multipart/form-data': parseFormData(body.formdata) } break } case 'urlencoded': content = { - 'application/x-www-form-urlencoded': { - schema: { - properties: body.urlencoded.reduce(mapFormData(), {}) - } - } + 'application/x-www-form-urlencoded': parseFormData(body.urlencoded) } break } return { requestBody: { content } } } -/* Accumulator function for form data values */ -function mapFormData () { - return (obj, { key, type, description, value }) => { - obj[key] = { +/** Parse the body for create a form data structure */ +function parseFormData (data) { + const objectSchema = { + schema: { + type: 'object' + } + } + return data.reduce((obj, { key, type, description, value }) => { + const { schema } = obj + if (isRequired(description)) { + (schema.required = schema.required || []).push(key) + } + (schema.properties = schema.properties || {})[key] = { type: inferType(value), ...(description ? { description: description.replace(/ ?\[required\] ?/gi, '') } : {}), ...(value ? { example: value } : {}), ...(type === 'file' ? { format: 'binary' } : {}) } return obj - } + }, objectSchema) } /** @@ -603,6 +601,15 @@ async function resolveInput (input) { } } +/** + * return if the provided text contains the '[required]' mark + * @param {*} text The text where we should look for the required mark + * @returns boolean + */ +function isRequired (text) { + return /\[required\]/gi.test(text) +} + postmanToOpenApi.version = version module.exports = postmanToOpenApi diff --git a/package-lock.json b/package-lock.json index c4361ef..7610e13 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "postman-to-openapi", - "version": "2.7.2", + "version": "2.8.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "postman-to-openapi", - "version": "2.7.2", + "version": "2.8.0", "license": "MIT", "dependencies": { "commander": "^8.3.0", diff --git a/package.json b/package.json index 432aacc..882ea61 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "postman-to-openapi", - "version": "2.7.2", + "version": "2.8.0", "description": "Convert postman collection to OpenAPI spec", "main": "lib/index.js", "types": "types/index.d.ts", diff --git a/test/resources/output/FormUrlencoded.yml b/test/resources/output/FormUrlencoded.yml index 6e1d141..82dbdb5 100644 --- a/test/resources/output/FormUrlencoded.yml +++ b/test/resources/output/FormUrlencoded.yml @@ -14,6 +14,11 @@ paths: content: application/x-www-form-urlencoded: schema: + type: object + required: + - name + - email + - password properties: name: type: string