Skip to content

Commit

Permalink
HCK-9607: browser support (#40)
Browse files Browse the repository at this point in the history
* feat: allowed FE features in browser

* chore: followed sonar suggestions

* chore: followed sonar suggestions

* chore: added `postinstall` hook
  • Loading branch information
chulanovskyi-bs authored Jan 23, 2025
1 parent ea0c84d commit dca73fd
Show file tree
Hide file tree
Showing 19 changed files with 301 additions and 223 deletions.
6 changes: 6 additions & 0 deletions api/fe.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
const { generateModelScript, validate } = require('../forward_engineering/api');

module.exports = {
generateModelScript,
validate,
};
9 changes: 9 additions & 0 deletions esbuild.package.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ const fs = require('fs');
const path = require('path');
const esbuild = require('esbuild');
const { clean } = require('esbuild-plugin-clean');
const { copy } = require('esbuild-plugin-copy');
const { copyFolderFiles, addReleaseFlag } = require('@hackolade/hck-esbuild-plugins-pack');
const { EXCLUDED_EXTENSIONS, EXCLUDED_FILES, DEFAULT_RELEASE_FOLDER_PATH } = require('./buildConstants');

Expand All @@ -11,6 +12,7 @@ const RELEASE_FOLDER_PATH = path.join(DEFAULT_RELEASE_FOLDER_PATH, `${packageDat
esbuild
.build({
entryPoints: [
path.resolve(__dirname, 'api', 'fe.js'),
path.resolve(__dirname, 'api', 're.js'),
path.resolve(__dirname, 'forward_engineering', 'api.js'),
path.resolve(__dirname, 'reverse_engineering', 'api.js'),
Expand All @@ -22,10 +24,17 @@ esbuild
outdir: RELEASE_FOLDER_PATH,
minify: true,
logLevel: 'info',
external: ['lodash'],
plugins: [
clean({
patterns: [DEFAULT_RELEASE_FOLDER_PATH],
}),
copy({
assets: {
from: [path.join('node_modules', 'lodash', '**', '*')],
to: [path.join('node_modules', 'lodash')],
},
}),
copyFolderFiles({
fromPath: __dirname,
targetFolderPath: RELEASE_FOLDER_PATH,
Expand Down
6 changes: 3 additions & 3 deletions forward_engineering/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ module.exports = {

const extensions = getExtensions(data.modelData[0].scopesExtensions);
const filteredSwaggerSchema = utils.removeEmptyObjectFields(
Object.assign({}, swaggerSchema, extensions),
{ ...swaggerSchema, ...extensions },
filtrationConfig,
);

Expand All @@ -87,7 +87,7 @@ module.exports = {
default: {
const schemaString = JSON.stringify(filteredSwaggerSchema, null, 2);
let schema = addCommentsSigns(schemaString, 'json');
if (!(data.options && data.options.isCalledFromFETab)) {
if (!data.options?.isCalledFromFETab) {
schema = removeCommentLines(schema);
}
cb(null, schema);
Expand Down Expand Up @@ -187,7 +187,7 @@ const removeCommentLines = scriptString => {
.split('\n')
.filter(line => !isCommentedLine.test(line))
.join('\n')
.replace(/(.*?),\s*(\}|])/g, '$1$2');
.replace(/(.*?),\s*([}\]])/g, '$1$2');
};

const handleRefInContainers = (containers, externalDefinitions, resolveApiExternalRefs) => {
Expand Down
45 changes: 18 additions & 27 deletions forward_engineering/helpers/commonHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,11 @@ const getExtensions = require('./extensionsHelper');

function mapExternalDocs(docs) {
if (docs) {
return Object.assign(
{},
{
description: docs.externalDocsDescription,
url: docs.externalDocsUrl,
},
getExtensions(docs.scopesExtensions),
);
return {
description: docs.externalDocsDescription,
url: docs.externalDocsUrl,
...getExtensions(docs.scopesExtensions),
};
}
}

Expand Down Expand Up @@ -67,15 +64,12 @@ function mapSecurityDefinitions(securityDefinitions = []) {
in: data.securitySchemeIn,
};
case 'oauth2':
return Object.assign(
{},
{
description: data.securitySchemeDescription,
flow: data.securitySchemeFlow,
scopes: getScopes(data.securitySchemeScopes),
},
getParamsForFlow(data.securitySchemeFlow, data),
);
return {
description: data.securitySchemeDescription,
flow: data.securitySchemeFlow,
scopes: getScopes(data.securitySchemeScopes),
...getParamsForFlow(data.securitySchemeFlow, data),
};
default:
return null;
}
Expand All @@ -98,21 +92,18 @@ function mapSecurityDefinitions(securityDefinitions = []) {
}
};

const modelSecurityDefinitions = securityDefinitions.reduce((acc, secDef) => {
acc[secDef.securityDefinitionsName] = Object.assign(
{},
{ type: secDef.securitySchemeType },
getPropsForType(secDef.securitySchemeType, secDef),
getExtensions(secDef.scopesExtensions),
);
return securityDefinitions.reduce((acc, secDef) => {
acc[secDef.securityDefinitionsName] = {
type: secDef.securitySchemeType,
...getPropsForType(secDef.securitySchemeType, secDef),
...getExtensions(secDef.scopesExtensions),
};
return acc;
}, {});

return modelSecurityDefinitions;
}

function mapArrayFieldByName(dataArray, fieldName) {
return dataArray && dataArray.map(dataItem => dataItem[fieldName]);
return dataArray?.map(dataItem => dataItem[fieldName]);
}

function activateItem(item) {
Expand Down
42 changes: 14 additions & 28 deletions forward_engineering/helpers/convertReferences.js
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
const cloneDeep = require('lodash.clonedeep');

const add = (obj, name, value) => Object.assign({}, obj, { [name]: value });
const add = (obj, name, value) => ({ ...obj, [name]: value });

const getDefinition = (reference, definitions) => {
const isModel = /\#model/i.test(reference.$ref || '');
const isInternal = /^\#\/definitions/i.test(reference.$ref || '');
const isModel = /#model/i.test(reference.$ref || '');
const isInternal = /^#\/definitions/i.test(reference.$ref || '');

if (isModel) {
const definitionName = reference.$ref.replace(/\#model\/definitions\//i, '');
const definitionName = reference.$ref.replace(/#model\/definitions\//i, '');

return cloneDeep(definitions.model.properties[definitionName]);
} else if (isInternal) {
const definitionName = reference.$ref.replace(/\#\/definitions\//, '');
const definitionName = reference.$ref.replace(/#\/definitions\//, '');

return cloneDeep(definitions.internal.properties[definitionName]);
} else {
Expand Down Expand Up @@ -54,9 +54,7 @@ const replaceReferencesInParameters = (jsonSchema, definitions) => {
return add(properties, propertyName, updatedProperty);
}, {});

return Object.assign({}, jsonSchema, {
properties,
});
return { ...jsonSchema, properties };
};

const convertReferencesInEntities = ({ entities, jsonSchemas, definitions }) => {
Expand All @@ -65,21 +63,15 @@ const convertReferencesInEntities = ({ entities, jsonSchemas, definitions }) =>
const internalDefinition = JSON.parse(definitions.internal[entityId]);

if (jsonSchema.entityType !== 'request') {
return Object.assign({}, result, {
[entityId]: jsonSchemas[entityId],
});
return { ...result, [entityId]: jsonSchemas[entityId] };
}

const replacedReferences = replaceReferencesInParameters(
jsonSchema,
Object.assign({}, definitions, {
internal: internalDefinition,
}),
);

return Object.assign({}, result, {
[entityId]: JSON.stringify(replacedReferences),
const replacedReferences = replaceReferencesInParameters(jsonSchema, {
...definitions,
internal: internalDefinition,
});

return { ...result, [entityId]: JSON.stringify(replacedReferences) };
}, {});
};

Expand All @@ -95,16 +87,10 @@ const convertReferences = data => {
},
});

return containers.concat(
Object.assign({}, container, {
jsonSchema,
}),
);
return containers.concat({ ...container, jsonSchema });
}, []);

return Object.assign({}, data, {
containers,
});
return { ...data, containers };
};

module.exports = convertReferences;
14 changes: 6 additions & 8 deletions forward_engineering/helpers/definitionsHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ function getDefinitions(definitions, containers) {
const internalDefinitions = getInternalDefinitions(containers);
const modelDefinitions = getModelDefinitions(JSON.stringify(definitions));

return Object.assign({}, internalDefinitions, modelDefinitions);
return { ...internalDefinitions, ...modelDefinitions };
}

function getModelDefinitions(definitions) {
Expand Down Expand Up @@ -34,27 +34,25 @@ function getInternalDefinitions(containers) {
}

return containers.reduce((acc, container) => {
return Object.assign({}, acc, getContainerInternalDefinitions(container));
return { ...acc, ...getContainerInternalDefinitions(container) };
}, {});
}

function getContainerInternalDefinitions(container) {
return Object.keys(container.internalDefinitions)
.map(key => getCollectionInternalDefinitions(JSON.parse(container.internalDefinitions[key])))
.filter(containerDefinition => containerDefinition)
.reduce((acc, containerDefinition) => Object.assign({}, acc, containerDefinition), {});
.reduce((acc, containerDefinition) => ({ ...acc, ...containerDefinition }), {});
}

function getCollectionInternalDefinitions(definitions) {
if (!definitions || !definitions.properties) {
if (!definitions?.properties) {
return null;
}
Object.keys(definitions.properties).reduce((acc, key) => {
return Object.keys(definitions.properties).reduce((acc, key) => {
const name = prepareName(key);

return Object.assign({}, acc, {
[name]: typeHelper.getType(activateItem(definitions.properties[key]), true),
});
return { ...acc, [name]: typeHelper.getType(activateItem(definitions.properties[key]), true) };
}, {});
}

Expand Down
2 changes: 1 addition & 1 deletion forward_engineering/helpers/extensionsHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ function getExtensions(data = []) {
}

function filterExtensionsByPrefix({ extensionPattern }) {
return extensionPattern && extensionPattern.startsWith('x-');
return extensionPattern?.startsWith('x-');
}

module.exports = getExtensions;
30 changes: 12 additions & 18 deletions forward_engineering/helpers/infoHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,38 +10,32 @@ function getInfo(data) {
version: data.modelVersion || '',
};
const extensions = getExtensions(data.infoExtensions);
return Object.assign({}, info, extensions);
return { ...info, ...extensions };
}

function getContact(contact) {
if (!contact) {
return null;
}

return Object.assign(
{},
{
name: contact.contactName,
url: contact.contactURL,
email: contact.contactemail,
},
getExtensions(contact.contactExtensions),
);
return {
name: contact.contactName,
url: contact.contactURL,
email: contact.contactemail,
...getExtensions(contact.contactExtensions),
};
}

function getLicense(license) {
if (!license) {
return null;
}

return Object.assign(
{},
{
name: license.licenseName,
url: license.licenseURL,
},
getExtensions(license.contactExtensions),
);
return {
name: license.licenseName,
url: license.licenseURL,
...getExtensions(license.contactExtensions),
};
}

module.exports = getInfo;
Loading

0 comments on commit dca73fd

Please sign in to comment.