From 9b6ddc86ef6b5c3cbbcd76af88177811da720c22 Mon Sep 17 00:00:00 2001 From: Somesh Date: Sun, 7 Jun 2020 05:34:14 +0530 Subject: [PATCH 1/5] Adds option for additional snippets for SDK generator - Adds option SDKGEN_enabled - Adds addition snippets (if SDKGEN_enabled is true) - Adds test for extra snippets - Updates README for nodejs-request with new option --- codegens/nodejs-request/README.md | 1 + codegens/nodejs-request/lib/request.js | 34 +++++++++++++++---- .../nodejs-request/test/unit/snippet.test.js | 27 +++++++++++++++ test/codegen/structure.test.js | 9 ++++- 4 files changed, 63 insertions(+), 8 deletions(-) diff --git a/codegens/nodejs-request/README.md b/codegens/nodejs-request/README.md index ec86322bf..b5dedcaf5 100644 --- a/codegens/nodejs-request/README.md +++ b/codegens/nodejs-request/README.md @@ -19,6 +19,7 @@ Convert function will take three parameters * `trimRequestBody` : Trim request body fields * `followRedirect` : Boolean denoting whether to redirect a request * `ES6_enabled` : Boolean denoting whether to generate snippet with ES6 features + * `SDKGEN_enabled` : Boolean denoting wether to add checkpoints and other snippets required for postman collection code generator * `callback`- callback function with first parameter as error and second parameter as string for code snippet diff --git a/codegens/nodejs-request/lib/request.js b/codegens/nodejs-request/lib/request.js index 73d2e5d29..cb284d627 100644 --- a/codegens/nodejs-request/lib/request.js +++ b/codegens/nodejs-request/lib/request.js @@ -13,14 +13,17 @@ var _ = require('./lodash'), * @returns {String} - nodejs(request) code snippet for given request object */ function makeSnippet (request, indentString, options) { - var snippet, + var snippet = '', optionsArray = [], isFormDataFile = false; + // These checkpoints are usefull to extract required content from the generated snippet + // These checkpoints are placed at different blocks of snippet further + snippet += options.SDKGEN_enabled ? '// ---> IMPORTS BEGIN <---\n' : ''; if (options.ES6_enabled) { - snippet = 'const '; + snippet += 'const '; } else { - snippet = 'var '; + snippet += 'var '; } snippet += 'request = require(\'request\');\n'; if (request.body && request.body.mode === 'formdata') { @@ -39,6 +42,9 @@ function makeSnippet (request, indentString, options) { } snippet += 'fs = require(\'fs\');\n'; } + snippet += options.SDKGEN_enabled ? '// ---> IMPORTS ENDS <---\n' : ''; + + snippet += options.SDKGEN_enabled ? '// ---> CONFIG BEGIN <---\n' : ''; if (options.ES6_enabled) { snippet += 'let '; } @@ -48,8 +54,8 @@ function makeSnippet (request, indentString, options) { snippet += 'options = {\n'; /** - * creating string to represent options object using optionArray.join() - * example: + * creating string to represent options object using optionArray.join() + * example: * options: { * method: 'GET', * url: 'www.google.com', @@ -88,7 +94,9 @@ function makeSnippet (request, indentString, options) { } snippet += optionsArray.join(',\n') + '\n'; snippet += '};\n'; + snippet += options.SDKGEN_enabled ? '// ---> CONFIG ENDS <---\n' : ''; + snippet += options.SDKGEN_enabled ? '// ---> REQUEST STARTS <---\n' : ''; snippet += 'request(options, '; if (options.ES6_enabled) { snippet += '(error, response) => {\n'; @@ -96,9 +104,14 @@ function makeSnippet (request, indentString, options) { else { snippet += 'function (error, response) {\n'; } - snippet += indentString + 'if (error) throw new Error(error);\n'; - snippet += indentString + 'console.log(response.body);\n'; + snippet += indentString; + snippet += options.SDKGEN_enabled ? '' : 'if (error) throw new Error(error);\n'; + snippet += indentString; + snippet += options.SDKGEN_enabled ? 'callback(error, response);\n' : 'console.log(response.body);\n'; snippet += '});\n'; + snippet += options.SDKGEN_enabled ? '// ---> REQUEST ENDS <---\n' : ''; + console.log(snippet); + console.log(); return snippet; } @@ -152,6 +165,13 @@ function getOptions () { type: 'boolean', default: false, description: 'Modifies code snippet to incorporate ES6 (EcmaScript) features' + }, + { + name: 'Codegen for SDK generator', + id: 'SDKGEN_enabled', + type: 'boolean', + default: false, + description: 'Adds checkpoints and snippets changes to be used for postman collection code generator' } ]; } diff --git a/codegens/nodejs-request/test/unit/snippet.test.js b/codegens/nodejs-request/test/unit/snippet.test.js index 1d4102e34..028ca0931 100644 --- a/codegens/nodejs-request/test/unit/snippet.test.js +++ b/codegens/nodejs-request/test/unit/snippet.test.js @@ -376,6 +376,33 @@ describe('nodejs-request convert function', function () { }); }); + it('should return snippets with checkpoints and snippets for sdkgenerator', function () { + var request = new sdk.Request({ + 'method': 'GET', + 'header': [], + 'url': { + 'raw': 'https://google.com', + 'protocol': 'https', + 'host': [ + 'google', + 'com' + ] + } + }); + convert(request, { SDKGEN_enabled: true}, function (error, snippet) { + if (error) { + expect.fail(null, null, error); + } + expect(snippet).to.be.a('string'); + expect(snippet).to.include('// ---> IMPORTS BEGINS <---\n'); + expect(snippet).to.include('// ---> IMPORTS ENDS <---\n'); + expect(snippet).to.include('// ---> CONFIG BEGINS <---\n'); + expect(snippet).to.include('// ---> CONFIG ENDS <---\n'); + expect(snippet).to.include('// ---> REQUEST BEGINS <---\n'); + expect(snippet).to.include('// ---> REQUEST ENDS <---\n'); + }); + }); + describe('getOptions function', function () { it('should return an array of specific options', function () { diff --git a/test/codegen/structure.test.js b/test/codegen/structure.test.js index aaaa3e1ae..1eb971f86 100644 --- a/test/codegen/structure.test.js +++ b/test/codegen/structure.test.js @@ -67,6 +67,12 @@ const expectedOptions = { type: 'boolean', default: false, description: 'Modifies code snippet to incorporate ES6 (EcmaScript) features' + }, + SDKGEN_enables: { + name: 'Codegen for SDK generator', + type: 'boolean', + default: false, + description: 'Adds checkpoints and snippets changes to be used for postman collection code generator' } }, // Standard array of ids that should be used for options ids. Any new option should be updated here. @@ -83,7 +89,8 @@ const expectedOptions = { 'lineContinuationCharacter', 'protocol', 'useMimeType', - 'ES6_enabled' + 'ES6_enabled', + 'SDKGEN_enabled' ], CODEGEN_ABS_PATH = `./codegens/${codegen}`; describe('Code-gen repository ' + codegen, function () { From 46e5d9532827a4658938ed5e81e8054ed0cd071e Mon Sep 17 00:00:00 2001 From: Somesh Date: Sun, 7 Jun 2020 23:49:05 +0530 Subject: [PATCH 2/5] changes checkpoint statements --- codegens/nodejs-request/lib/request.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/codegens/nodejs-request/lib/request.js b/codegens/nodejs-request/lib/request.js index cb284d627..73c03d5fe 100644 --- a/codegens/nodejs-request/lib/request.js +++ b/codegens/nodejs-request/lib/request.js @@ -18,7 +18,7 @@ function makeSnippet (request, indentString, options) { isFormDataFile = false; // These checkpoints are usefull to extract required content from the generated snippet // These checkpoints are placed at different blocks of snippet further - snippet += options.SDKGEN_enabled ? '// ---> IMPORTS BEGIN <---\n' : ''; + snippet += options.SDKGEN_enabled ? '// ---> IMPORTS <---\n' : ''; if (options.ES6_enabled) { snippet += 'const '; } @@ -42,9 +42,9 @@ function makeSnippet (request, indentString, options) { } snippet += 'fs = require(\'fs\');\n'; } - snippet += options.SDKGEN_enabled ? '// ---> IMPORTS ENDS <---\n' : ''; + snippet += options.SDKGEN_enabled ? '// ---> IMPORTS <---\n' : ''; - snippet += options.SDKGEN_enabled ? '// ---> CONFIG BEGIN <---\n' : ''; + snippet += options.SDKGEN_enabled ? '// ---> CONFIG <---\n' : ''; if (options.ES6_enabled) { snippet += 'let '; } @@ -94,9 +94,9 @@ function makeSnippet (request, indentString, options) { } snippet += optionsArray.join(',\n') + '\n'; snippet += '};\n'; - snippet += options.SDKGEN_enabled ? '// ---> CONFIG ENDS <---\n' : ''; + snippet += options.SDKGEN_enabled ? '// ---> CONFIG <---\n' : ''; - snippet += options.SDKGEN_enabled ? '// ---> REQUEST STARTS <---\n' : ''; + snippet += options.SDKGEN_enabled ? '// ---> REQUEST <---\n' : ''; snippet += 'request(options, '; if (options.ES6_enabled) { snippet += '(error, response) => {\n'; @@ -109,8 +109,8 @@ function makeSnippet (request, indentString, options) { snippet += indentString; snippet += options.SDKGEN_enabled ? 'callback(error, response);\n' : 'console.log(response.body);\n'; snippet += '});\n'; - snippet += options.SDKGEN_enabled ? '// ---> REQUEST ENDS <---\n' : ''; - console.log(snippet); + snippet += options.SDKGEN_enabled ? '// ---> REQUEST <---\n' : ''; + console.log(JSON.stringify(snippet)); console.log(); return snippet; } From 937dfe0955fd8862267eb428aa71c6c6173c1013 Mon Sep 17 00:00:00 2001 From: Somesh Date: Tue, 9 Jun 2020 00:24:03 +0530 Subject: [PATCH 3/5] Modifies function of SDKGEN_enabled option: - import statements in snippets are added only if SDKGEN_enabled is disabled - changes test for SDKGEN_enabled option --- codegens/nodejs-request/README.md | 2 +- codegens/nodejs-request/lib/request.js | 47 ++++++++----------- .../nodejs-request/test/unit/snippet.test.js | 11 ++--- test/codegen/structure.test.js | 2 +- 4 files changed, 26 insertions(+), 36 deletions(-) diff --git a/codegens/nodejs-request/README.md b/codegens/nodejs-request/README.md index b5dedcaf5..f1994ec10 100644 --- a/codegens/nodejs-request/README.md +++ b/codegens/nodejs-request/README.md @@ -19,7 +19,7 @@ Convert function will take three parameters * `trimRequestBody` : Trim request body fields * `followRedirect` : Boolean denoting whether to redirect a request * `ES6_enabled` : Boolean denoting whether to generate snippet with ES6 features - * `SDKGEN_enabled` : Boolean denoting wether to add checkpoints and other snippets required for postman collection code generator + * `SDKGEN_enabled` : Boolean denoting wether to denote snippet for codegen or sdkgen * `callback`- callback function with first parameter as error and second parameter as string for code snippet diff --git a/codegens/nodejs-request/lib/request.js b/codegens/nodejs-request/lib/request.js index 73c03d5fe..d2878d346 100644 --- a/codegens/nodejs-request/lib/request.js +++ b/codegens/nodejs-request/lib/request.js @@ -18,33 +18,31 @@ function makeSnippet (request, indentString, options) { isFormDataFile = false; // These checkpoints are usefull to extract required content from the generated snippet // These checkpoints are placed at different blocks of snippet further - snippet += options.SDKGEN_enabled ? '// ---> IMPORTS <---\n' : ''; - if (options.ES6_enabled) { - snippet += 'const '; - } - else { - snippet += 'var '; - } - snippet += 'request = require(\'request\');\n'; - if (request.body && request.body.mode === 'formdata') { - _.forEach(request.body.toJSON().formdata, function (data) { - if (!data.disabled && data.type === 'file') { - isFormDataFile = true; - } - }); - } - if (isFormDataFile) { + if (!options.SDKGEN_enabled) { if (options.ES6_enabled) { snippet += 'const '; } else { snippet += 'var '; } - snippet += 'fs = require(\'fs\');\n'; + snippet += 'request = require(\'request\');\n'; + if (request.body && request.body.mode === 'formdata') { + _.forEach(request.body.toJSON().formdata, function (data) { + if (!data.disabled && data.type === 'file') { + isFormDataFile = true; + } + }); + } + if (isFormDataFile) { + if (options.ES6_enabled) { + snippet += 'const '; + } + else { + snippet += 'var '; + } + snippet += 'fs = require(\'fs\');\n'; + } } - snippet += options.SDKGEN_enabled ? '// ---> IMPORTS <---\n' : ''; - - snippet += options.SDKGEN_enabled ? '// ---> CONFIG <---\n' : ''; if (options.ES6_enabled) { snippet += 'let '; } @@ -94,9 +92,6 @@ function makeSnippet (request, indentString, options) { } snippet += optionsArray.join(',\n') + '\n'; snippet += '};\n'; - snippet += options.SDKGEN_enabled ? '// ---> CONFIG <---\n' : ''; - - snippet += options.SDKGEN_enabled ? '// ---> REQUEST <---\n' : ''; snippet += 'request(options, '; if (options.ES6_enabled) { snippet += '(error, response) => {\n'; @@ -109,9 +104,7 @@ function makeSnippet (request, indentString, options) { snippet += indentString; snippet += options.SDKGEN_enabled ? 'callback(error, response);\n' : 'console.log(response.body);\n'; snippet += '});\n'; - snippet += options.SDKGEN_enabled ? '// ---> REQUEST <---\n' : ''; - console.log(JSON.stringify(snippet)); - console.log(); + console.log(snippet); return snippet; } @@ -171,7 +164,7 @@ function getOptions () { id: 'SDKGEN_enabled', type: 'boolean', default: false, - description: 'Adds checkpoints and snippets changes to be used for postman collection code generator' + description: 'Generates snippet for SDK generator.' } ]; } diff --git a/codegens/nodejs-request/test/unit/snippet.test.js b/codegens/nodejs-request/test/unit/snippet.test.js index 028ca0931..c72676206 100644 --- a/codegens/nodejs-request/test/unit/snippet.test.js +++ b/codegens/nodejs-request/test/unit/snippet.test.js @@ -376,7 +376,7 @@ describe('nodejs-request convert function', function () { }); }); - it('should return snippets with checkpoints and snippets for sdkgenerator', function () { + it('should return snippets without imports', function () { var request = new sdk.Request({ 'method': 'GET', 'header': [], @@ -394,12 +394,9 @@ describe('nodejs-request convert function', function () { expect.fail(null, null, error); } expect(snippet).to.be.a('string'); - expect(snippet).to.include('// ---> IMPORTS BEGINS <---\n'); - expect(snippet).to.include('// ---> IMPORTS ENDS <---\n'); - expect(snippet).to.include('// ---> CONFIG BEGINS <---\n'); - expect(snippet).to.include('// ---> CONFIG ENDS <---\n'); - expect(snippet).to.include('// ---> REQUEST BEGINS <---\n'); - expect(snippet).to.include('// ---> REQUEST ENDS <---\n'); + expect(snippet).not.to.include('var request = require(\'request\');'); + expect(snippet).not.to.include('var fs = require(\'fs\');'); + expect(snippet).to.include('callback(error, response);'); }); }); diff --git a/test/codegen/structure.test.js b/test/codegen/structure.test.js index 1eb971f86..ff4a533d6 100644 --- a/test/codegen/structure.test.js +++ b/test/codegen/structure.test.js @@ -72,7 +72,7 @@ const expectedOptions = { name: 'Codegen for SDK generator', type: 'boolean', default: false, - description: 'Adds checkpoints and snippets changes to be used for postman collection code generator' + description: 'Generates snippet for SDK generator.' } }, // Standard array of ids that should be used for options ids. Any new option should be updated here. From 488ccc7a12431d188726e93e21db957e81fe525a Mon Sep 17 00:00:00 2001 From: Somesh Date: Wed, 10 Jun 2020 00:13:00 +0530 Subject: [PATCH 4/5] Removes unwanted console.log --- codegens/nodejs-request/lib/request.js | 1 - 1 file changed, 1 deletion(-) diff --git a/codegens/nodejs-request/lib/request.js b/codegens/nodejs-request/lib/request.js index d2878d346..3f94396d5 100644 --- a/codegens/nodejs-request/lib/request.js +++ b/codegens/nodejs-request/lib/request.js @@ -104,7 +104,6 @@ function makeSnippet (request, indentString, options) { snippet += indentString; snippet += options.SDKGEN_enabled ? 'callback(error, response);\n' : 'console.log(response.body);\n'; snippet += '});\n'; - console.log(snippet); return snippet; } From 18b07c7d3b33f62311b479a793603a4d4f68f399 Mon Sep 17 00:00:00 2001 From: Somesh Koli Date: Tue, 4 Aug 2020 01:04:27 +0530 Subject: [PATCH 5/5] Fixes issue with usage of double quote - force uses single quote throughout the generate sdk --- codegens/nodejs-request/lib/parseRequest.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/codegens/nodejs-request/lib/parseRequest.js b/codegens/nodejs-request/lib/parseRequest.js index 75c99fd8f..3d7d6fac5 100644 --- a/codegens/nodejs-request/lib/parseRequest.js +++ b/codegens/nodejs-request/lib/parseRequest.js @@ -102,10 +102,10 @@ function parseBody (requestbody, indentString, trimBody, contentType) { return `body: JSON.stringify(${JSON.stringify(jsonBody)})\n`; } catch (error) { - return `body: ${JSON.stringify(requestbody[requestbody.mode])}\n`; + return `body: '${sanitize(requestbody[requestbody.mode])}'\n`; } } - return `body: ${JSON.stringify(requestbody[requestbody.mode])}\n`; + return `body: '${sanitize(requestbody[requestbody.mode])}'\n`; // eslint-disable-next-line no-case-declarations case 'graphql': let query = requestbody[requestbody.mode].query,