From ba6ada3c8c18a15d6d17b71ce22968d348e21a41 Mon Sep 17 00:00:00 2001 From: yevhenii-moroziuk Date: Mon, 27 Jan 2025 17:29:26 +0200 Subject: [PATCH 1/3] HCK-9667: fix application crash & small refactoring --- .../componentsHelpers/parametersHelper.js | 3 +- .../componentsHelpers/responsesHelper.js | 14 +- .../securitySchemesHelper.js | 16 +- .../helpers/generateModelScript.js | 6 +- forward_engineering/helpers/pathHelper.js | 2 +- forward_engineering/utils/utils.js | 7 +- reverse_engineering/helpers/dataHelper.js | 199 ++++++++++-------- 7 files changed, 141 insertions(+), 106 deletions(-) diff --git a/forward_engineering/helpers/componentsHelpers/parametersHelper.js b/forward_engineering/helpers/componentsHelpers/parametersHelper.js index 4e01ba3..27759bc 100644 --- a/forward_engineering/helpers/componentsHelpers/parametersHelper.js +++ b/forward_engineering/helpers/componentsHelpers/parametersHelper.js @@ -237,8 +237,7 @@ function getSchemaKeyword(properties = {}) { return defaultKeyword; } - const schemaKey = Object.keys(properties).find(key => !restRequestPropNames.includes(key)); - return schemaKey; + return Object.keys(properties).find(key => !restRequestPropNames.includes(key)); } module.exports = { diff --git a/forward_engineering/helpers/componentsHelpers/responsesHelper.js b/forward_engineering/helpers/componentsHelpers/responsesHelper.js index e07f360..647aa5d 100644 --- a/forward_engineering/helpers/componentsHelpers/responsesHelper.js +++ b/forward_engineering/helpers/componentsHelpers/responsesHelper.js @@ -42,12 +42,14 @@ function mapResponse({ data, responseCollectionDescription, shouldResponseBeComm }); const links = getLinks(get(data, `properties.links`), specVersion); const extensions = getExtensions(data.scopesExtensions); - const response = {}; - if (shouldResponseBeCommented) { - response[`hackoladeInnerCommentStart`] = true; - } - - Object.assign(response, { description, headers, content, links }, extensions); + const response = { + ...(shouldResponseBeCommented && { hackoladeInnerCommentStart: true }), + description, + headers, + content, + links, + ...extensions, + }; if (shouldResponseBeCommented) { response[`hackoladeInnerCommentEnd`] = true; diff --git a/forward_engineering/helpers/componentsHelpers/securitySchemesHelper.js b/forward_engineering/helpers/componentsHelpers/securitySchemesHelper.js index a5febdc..57d8212 100644 --- a/forward_engineering/helpers/componentsHelpers/securitySchemesHelper.js +++ b/forward_engineering/helpers/componentsHelpers/securitySchemesHelper.js @@ -87,7 +87,11 @@ function mapSecurityScheme(data, specVersion) { }; const extensions = getExtensions(data.scopesExtensions); - return Object.assign({}, securitySchemeProps, commonFields, extensions); + return { + ...securitySchemeProps, + ...commonFields, + ...extensions, + }; } function mapOAuthFlows(data) { @@ -110,7 +114,10 @@ function mapOAuthFlows(data) { const extensions = getExtensions(data.scopesExtensions); - return cleanUp(Object.assign({}, flows, extensions)); + return cleanUp({ + ...flows, + ...extensions, + }); } function mapOAuthFlowObject({ authorizationUrl, tokenUrl, refreshUrl, scopes, scopesExtensions }) { @@ -122,7 +129,10 @@ function mapOAuthFlowObject({ authorizationUrl, tokenUrl, refreshUrl, scopes, sc }; const extensions = getExtensions(scopesExtensions); - return Object.assign({}, flow, extensions); + return { + ...flow, + ...extensions, + }; } function mapScopes(data) { diff --git a/forward_engineering/helpers/generateModelScript.js b/forward_engineering/helpers/generateModelScript.js index f987212..fe812a6 100644 --- a/forward_engineering/helpers/generateModelScript.js +++ b/forward_engineering/helpers/generateModelScript.js @@ -56,8 +56,12 @@ const handleRefInContainers = (containers, externalDefinitions, resolveApiExtern const separatePathAndWebhooks = containers => { const pathContainers = []; const webhookContainers = []; - console.log('containers', containers); + containers.forEach(container => { + if (!container.containerData?.[0]) { + return; + } + if (container.containerData?.[0]?.webhook) { webhookContainers.push(container); } else { diff --git a/forward_engineering/helpers/pathHelper.js b/forward_engineering/helpers/pathHelper.js index e63b86c..e33b5e9 100644 --- a/forward_engineering/helpers/pathHelper.js +++ b/forward_engineering/helpers/pathHelper.js @@ -10,7 +10,7 @@ const { getArrayItems } = require('./sharedHelper'); function getPaths(containers, containersIdsForCallbacks = [], specVersion) { return containers - .filter(({ id }) => !containersIdsForCallbacks.includes(id)) + .filter(({ id, containerData }) => !containersIdsForCallbacks.includes(id)) .reduce((acc, container, index) => { const { name, isActivated } = container.containerData[0]; const containerData = getRequestsForContainer({ diff --git a/forward_engineering/utils/utils.js b/forward_engineering/utils/utils.js index 8a93ab9..ea64700 100644 --- a/forward_engineering/utils/utils.js +++ b/forward_engineering/utils/utils.js @@ -12,11 +12,12 @@ function removeEmptyObjectFields(inputObj) { .reduce((newObj, key) => { const isObjectAndNotArray = typeof obj[key] === 'object' && !Array.isArray(obj[key]); if (isObjectAndNotArray) { - return Object.assign(newObj, { + return { + ...newObj, [key]: removeEmptyObjectFields(obj[key]), - }); + }; } - return Object.assign(newObj, { [key]: obj[key] }); + return { ...newObj, [key]: obj[key] }; }, {}); } diff --git a/reverse_engineering/helpers/dataHelper.js b/reverse_engineering/helpers/dataHelper.js index c99d677..6c4730c 100644 --- a/reverse_engineering/helpers/dataHelper.js +++ b/reverse_engineering/helpers/dataHelper.js @@ -34,9 +34,10 @@ const handleObject = (func, object, includeKey) => { return {}; } return Object.keys(object).reduce((accum, key) => { - return Object.assign({}, accum, { + return { + ...accum, [key]: func(object[key], includeKey ? key : undefined), - }); + }; }, {}); }; @@ -51,11 +52,14 @@ const getObjectProperties = (propsToClean, object) => { return obj; } if (key === '$ref') { - return Object.assign({}, obj, { [key]: resolveReference(object[key]) }); + return { ...obj, [key]: resolveReference(object[key]) }; } - return Object.assign({}, obj, { [key]: object[key] }); + return { ...obj, [key]: object[key] }; }, {}); - return Object.assign({}, getExtensionsObject(object), filteredObject); + return { + ...getExtensionsObject(object), + ...filteredObject, + }; }; const getServersData = servers => { @@ -164,9 +168,9 @@ const handleDataByConfig = (data, config) => { return { [property]: data.map(item => handleDataByConfig(item, config[0])) }; } else if (configType === 'object') { return { [property]: handleDataByConfig(data, config) }; - } else { - return { [config]: data }; } + + return { [config]: data }; }; if (typeof data === 'string') { @@ -177,15 +181,18 @@ const handleDataByConfig = (data, config) => { const extensionsObject = getExtensionsObject(data); - return Object.assign( - extensionsObject, - Object.keys(config).reduce((accumulator, key) => { + return { + ...extensionsObject, + ...Object.keys(config).reduce((accumulator, key) => { if (!data[key]) { return accumulator; } - return Object.assign({}, accumulator, handleProperty(data[key], config, key)); + return { + ...accumulator, + ...handleProperty(data[key], config, key), + }; }, {}), - ); + }; }; const getEntityData = (schema, type = REQUEST) => { @@ -217,7 +224,7 @@ const getContainersFromCallbacks = callbacks => { return [ { - data: Object.assign({}, { name: pathName }, extensionsObject), + data: { name: pathName, ...extensionsObject }, callbackPath, }, ...requestCallbacksPathsData, @@ -328,24 +335,21 @@ const handleLink = data => { const parameters = handleObject(handleExpression, data.parameters); const server = data.server && getServersData([data.server]); - return Object.assign( - {}, - data, - { - type: 'link', - subtype: 'expression', - properties: { - parameters: { - type: 'operationObject', - subtype: 'expression', - properties: parameters, - }, - requestBody, + return { + ...data, + type: 'link', + subtype: 'expression', + properties: { + parameters: { + type: 'operationObject', + subtype: 'expression', + properties: parameters, }, + requestBody, }, - server, - getExtensionsObject(data), - ); + ...server, + ...getExtensionsObject(data), + }; }; const getLinksObject = data => { @@ -363,22 +367,27 @@ const handleHeader = (data, fieldOrder) => { const schemaObject = getSchemaObject(data, fieldOrder); const content = getContentObject(data); const examples = getExamplesObject(data); - const headerProperties = Object.assign({}, schemaObject.properties || {}, { + const headerProperties = { + ...(schemaObject.properties || {}), content, examples, - }); - const header = Object.assign({}, schemaObject, data, { + }; + const header = { + ...schemaObject, + ...data, sample: getExampleStringValue(data.example), type: 'header', properties: headerProperties, - }); + }; const propsToClean = ['schema', 'examples', 'example', 'content']; return getObjectProperties(propsToClean, header); }; const handleEncoding = data => { const propsToClean = ['headers']; - return Object.assign({}, getObjectProperties(propsToClean, data), { + + return { + ...getObjectProperties(propsToClean, data), type: 'encoding', properties: { headers: { @@ -388,7 +397,7 @@ const handleEncoding = data => { properties: handleObject(handleHeader, data.headers), }, }, - }); + }; }; const handleMedia = (data, fieldOrder) => { @@ -405,34 +414,39 @@ const handleMedia = (data, fieldOrder) => { properties: handleObject(handleEncoding, data.encoding), structureType: true, }; - const mediaProperties = Object.assign({}, schemaObject.properties || {}, { + const mediaProperties = { + ...(schemaObject.properties || {}), examples, encoding, - }); + }; const propsToClean = ['schema', 'examples', 'encoding', 'example']; - return Object.assign({}, schemaObject, getObjectProperties(propsToClean, data), { + return { + ...schemaObject, + ...getObjectProperties(propsToClean, data), sample: getExampleStringValue(data.example), type: 'media', properties: mediaProperties, - }); + }; }; const handleRequestBody = (data, fieldOrder) => { const media = handleObject(handleMedia, data.content); const propsToClean = ['content']; - return Object.assign({}, getObjectProperties(propsToClean, data), { + return { + ...getObjectProperties(propsToClean, data), type: 'requestBody', properties: media, - }); + }; }; const handleCallback = (data, fieldOrder) => { const callbackExpression = (Object.keys(data) || [])[0]; - return Object.assign( - {}, - { type: 'callback', bucketId: callbackExpression, callbackExpression }, - getExtensionsObject(data), - ); + return { + type: 'callback', + bucketId: callbackExpression, + callbackExpression, + ...getExtensionsObject(data), + }; }; const handleChoiceProperty = (fieldOrder, rawChoice, name) => { @@ -459,10 +473,10 @@ const handleSchemaChoices = (schema, fieldOrder) => { }; if (!currentChoicesWithSameType) { - return Object.assign({}, accum, { [choiceType]: [choiceData] }); + return { ...accum, [choiceType]: [choiceData] }; } - return Object.assign({}, accum, { [choiceType]: accum[choiceType].concat(choiceData) }); + return { ...accum, [choiceType]: [...accum[choiceType], choiceData] }; }, {}); const choiceTypes = Object.keys(schemaChoices); @@ -502,22 +516,21 @@ const handleSchemaChoices = (schema, fieldOrder) => { })); if (choiceType === 'allOf' && hasMultipleOneOf) { - return Object.assign({}, accum, { - [choiceType]: subschemas.concat(multipleOneOf), - }); + return { + ...accum, + [choiceType]: [...subschemas, ...multipleOneOf], + }; } - return Object.assign({}, accum, { - [choiceType]: subschemas, - }); + return { ...accum, [choiceType]: subschemas }; }, {}); if (!hasAllOf && hasMultipleOneOf) { - const choicesWithAllOf = Object.assign({}, resolvedChoices, { allOf: multipleOneOf }); - return Object.assign({}, schema, choicesWithAllOf, { properties: schemaProps }); + const choicesWithAllOf = { ...resolvedChoices, allOf: multipleOneOf }; + return { ...schema, ...choicesWithAllOf, properties: schemaProps }; } - return Object.assign({}, schema, resolvedChoices, { properties: schemaProps }); + return { ...schema, ...resolvedChoices, properties: schemaProps }; }; const handleSchemaExample = (schemaType, example) => { @@ -542,22 +555,25 @@ const handleAdditionalProperties = schema => { } if (typeof data === 'object') { if (data.format) { - return Object.assign({}, schema, { + return { + ...schema, additionalPropControl: 'Object', additionalPropertiesObjectType: data.type, additionalPropertiesIntegerFormat: data.format, - }); + }; } - return Object.assign({}, schema, { + return { + ...schema, additionalPropControl: 'Object', additionalPropertiesObjectType: data.type, - }); - } else { - return Object.assign({}, schema, { - additionalPropControl: 'Boolean', - additionalProperties: !!data, - }); + }; } + + return { + ...schema, + additionalPropControl: 'Boolean', + additionalProperties: !!data, + }; }; const handleSchemaProperty = (property, data) => { @@ -616,10 +632,10 @@ const handleSchemaExtensions = schema => { if (property.startsWith(EXTENSION_SYMBOL)) { return accumulator; } - return Object.assign({}, accumulator, { [property]: schema[property] }); + return { ...accumulator, [property]: schema[property] }; }, {}); - return Object.assign({}, schemaWithoutExtensions, mappedExtensionsObject); + return { ...schemaWithoutExtensions, ...mappedExtensionsObject }; }; const handleSchemaProps = (schema, fieldOrder) => { @@ -712,13 +728,15 @@ const handleParameter = (parameter, parameterName, fieldOrder) => { content: parameterContent, examples: parameterExamples, }; - const newParameter = Object.assign({}, parameterSchemaObject, parameter, { + const newParameter = { + ...parameterSchemaObject, + ...parameter, name: parameterName || parameter.name, parameterName: parameter.name, sample: getExampleStringValue(parameter.example), type: parameterType, properties: parameterProperties, - }); + }; const propsToClean = ['schema', 'examples', 'example', 'in', 'content']; return getObjectProperties(propsToClean, newParameter); }; @@ -742,16 +760,17 @@ const handleSecuritySchemes = data => { return scopeAccum.concat({ scopeName: scopeKey, scopeDescription: flowObject.scopes[scopeKey] }); }, []); } - return Object.assign({}, accum, { [flow]: scopes ? { ...flowObject, scopes } : flowObject }); + return { ...accum, [flow]: scopes ? { ...flowObject, scopes } : flowObject }; }, {}); - data = Object.assign({}, data, { flows }); + data = { ...data, flows }; } - return Object.assign({}, getObjectProperties(propsToClean, data), { + return { + ...getObjectProperties(propsToClean, data), type: 'securityScheme', apiKeyName: data.name, schemeType: data.type, - }); + }; }; const handleRequestData = (requestData, request, fieldOrder) => { @@ -775,7 +794,8 @@ const handleRequestData = (requestData, request, fieldOrder) => { properties: callbacksData, }, }; - const jsonSchema = Object.assign({}, entityData, { + const jsonSchema = { + ...entityData, type: 'object', entityType: REQUEST, subtype: 'requestBody', @@ -783,7 +803,7 @@ const handleRequestData = (requestData, request, fieldOrder) => { properties: requestSchema, isActivated: true, withRequestBody, - }); + }; return { jsonSchema, responses }; }; @@ -797,10 +817,11 @@ const handleResponse = (responseObj, fieldOrder) => { content, links, }; - return Object.assign({}, getObjectProperties(propsToClean, responseObj), { + return { + ...getObjectProperties(propsToClean, responseObj), type: 'response', properties: propertiesSchema, - }); + }; }; const handleResponseData = (responseObj, response, request, fieldOrder) => { @@ -832,7 +853,7 @@ const getEntities = (pathData, containers, fieldOrder) => { }); return [...accumulator, jsonSchema, ...responseSchemas]; }, []); - return Object.assign(accumulator, { [container.name]: entities }); + return { ...accumulator, [container.name]: entities }; }, {}); }; @@ -910,14 +931,11 @@ const getComponents = (schemaComponents = {}, fieldOrder) => { structureType: true, properties: callbacksData, }; - const extensions = Object.assign( - {}, - { - type: 'extensions', - structureType: true, - }, - extensionsData, - ); + const extensions = { + type: 'extensions', + structureType: true, + ...extensionsData, + }; const definitionsSchema = { definitions: { @@ -951,10 +969,11 @@ const getOpenAPIJsonSchema = (data, fileName, extension) => { const schema = extension !== '.json' ? commonHelper.convertYamlToJson(data) : data; const openAPISchema = typeof schema === 'string' ? jsonComment.parse(schema.replace(/^\s*#.+$/gm, '')) : schema; const updatedOpenApiSchema = copyPathItemLevelParametersToOperationObject(openAPISchema); - const openAPISchemaWithModelName = Object.assign({}, updatedOpenApiSchema, { + + return { + ...updatedOpenApiSchema, modelName: fileName, - }); - return openAPISchemaWithModelName; + }; }; const copyPathItemLevelParametersToOperationObject = schema => { From fbc514d77c5651bc6e29c8f078645344d888e10b Mon Sep 17 00:00:00 2001 From: yevhenii-moroziuk Date: Mon, 3 Feb 2025 17:26:14 +0200 Subject: [PATCH 2/3] HCK-9667: Remove fix --- forward_engineering/helpers/generateModelScript.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/forward_engineering/helpers/generateModelScript.js b/forward_engineering/helpers/generateModelScript.js index fe812a6..f58c67e 100644 --- a/forward_engineering/helpers/generateModelScript.js +++ b/forward_engineering/helpers/generateModelScript.js @@ -58,10 +58,6 @@ const separatePathAndWebhooks = containers => { const webhookContainers = []; containers.forEach(container => { - if (!container.containerData?.[0]) { - return; - } - if (container.containerData?.[0]?.webhook) { webhookContainers.push(container); } else { From 770b8b2b3a59e9ef1b2ed176ede303a844f2f077 Mon Sep 17 00:00:00 2001 From: yevhenii-moroziuk Date: Tue, 4 Feb 2025 08:55:01 +0200 Subject: [PATCH 3/3] Update package-lock.json --- package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index cf70535..f603d33 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "OpenAPI", - "version": "0.2.3", + "version": "0.2.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "OpenAPI", - "version": "0.2.3", + "version": "0.2.4", "hasInstallScript": true, "dependencies": { "@apidevtools/swagger-parser": "10.1.0",