UNPKG

gen-jhipster

Version:

VHipster - Spring Boot + Angular/React/Vue in one handy generator

209 lines (208 loc) 9.78 kB
/** * Copyright 2013-2026 the original author or authors from the JHipster project. * * This file is part of the JHipster project, see https://www.jhipster.tech/ * for more information. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { uniqBy } from 'lodash-es'; import { APPLICATION_TYPE_KEY } from "../core/application-types.js"; import { GENERATOR_JHIPSTER } from "../constants/jhipster.js"; import { getDefaultRuntime } from "../jdl-config/jhipster-jdl-config.js"; import { readCurrentPathYoRcFile } from "../utils/yo-rc.js"; import { formatApplicationToExport, formatApplicationsToExport, } from "./converters/exporters/applications/jhipster-application-formatter.js"; import { GENERATOR_NAME } from "./converters/exporters/export-utils.js"; import exportDeployments from "./converters/exporters/jhipster-deployment-exporter.js"; import exportEntities from "./converters/exporters/jhipster-entity-exporter.js"; import { convert } from "./converters/jdl-to-json/jdl-with-applications-to-json-converter.js"; import JDLWithoutApplicationToJSONConverter from "./converters/jdl-to-json/jdl-without-application-to-json-converter.js"; import ParsedJDLToJDLObjectConverter from "./converters/parsed-jdl-to-jdl-object/parsed-jdl-to-jdl-object-converter.js"; import createWithApplicationValidator from "./converters/validators/jdl-with-application-validator.js"; import createWithoutApplicationValidator from "./converters/validators/jdl-without-application-validator.js"; import { BASE_NAME_KEY } from "./core/built-in-options/index.js"; import { parseFromContent, parseFromFiles } from "./core/readers/jdl-reader.js"; import { createRuntime } from "./core/runtime.js"; /** * Creates a new JDL importer from files. * There are two ways to create an importer: * - By providing an existing application content, if there's one * - Deprecated: providing some application options */ export function createImporterFromFiles(files, configuration, definition) { if (!files) { throw new Error('Files must be passed to create a new JDL importer.'); } const runtime = definition ? createRuntime(definition) : getDefaultRuntime(); const content = parseFromFiles(files, runtime); return makeJDLImporter(content, configuration || {}, runtime); } /** * Creates a new JDL importer from a JDL string content. * There are two ways to create an importer: * - By providing an existing application content, if there's one * - Deprecated: providing some application options */ export function createImporterFromContent(jdlString, configuration, definition) { if (!jdlString) { throw new Error('A JDL content must be passed to create a new JDL importer.'); } const runtime = definition ? createRuntime(definition) : getDefaultRuntime(); const content = parseFromContent(jdlString, runtime); return makeJDLImporter(content, configuration || {}, runtime); } function makeJDLImporter(content, configuration, runtime) { let importState = { exportedApplications: [], exportedApplicationsWithEntities: {}, exportedEntities: [], exportedDeployments: [], }; return { /** * Processes JDL files and converts them to JSON. * @returns {object} the state of the process: * - exportedDeployments: the exported deployments, or an empty list * - exportedApplications: the exported applications, or an empty list * - exportedEntities: the exported entities, or an empty list */ import: () => { const jdlObject = getJDLObject(content, configuration, runtime); checkForErrors(jdlObject); if (jdlObject.getApplicationQuantity() === 0 && jdlObject.getEntityQuantity() > 0) { importState.exportedEntities = importOnlyEntities(jdlObject, configuration); } else if (jdlObject.getApplicationQuantity() === 1) { importState = importOneApplicationAndEntities(jdlObject); } else { importState = importApplicationsAndEntities(jdlObject); } if (jdlObject.getDeploymentQuantity()) { importState.exportedDeployments = importDeployments(jdlObject.deployments); } return importState; }, }; } function getJDLObject(parsedJDLContent, configuration, runtime) { let baseName = configuration.applicationName; let applicationType = configuration.applicationType; if (configuration.application) { baseName ??= configuration.application[GENERATOR_JHIPSTER].baseName; applicationType ??= configuration.application[GENERATOR_JHIPSTER].applicationType; } return ParsedJDLToJDLObjectConverter.parseFromConfigurationObject({ parsedContent: parsedJDLContent, applicationType, applicationName: baseName, }, runtime); } function checkForErrors(jdlObject) { let validator; if (jdlObject.getApplicationQuantity() === 0) { validator = createWithoutApplicationValidator(jdlObject); } else { validator = createWithApplicationValidator(jdlObject); } validator.checkForErrors(); } function importOnlyEntities(jdlObject, configuration) { let { applicationName } = configuration; let application = configuration.application; application ??= readCurrentPathYoRcFile(); if (application?.[GENERATOR_JHIPSTER]) { applicationName ??= application[GENERATOR_JHIPSTER].baseName; } const entitiesPerApplicationMap = JDLWithoutApplicationToJSONConverter.convert(jdlObject, applicationName); const jsonEntities = entitiesPerApplicationMap.get(applicationName); return exportJSONEntities(jsonEntities, configuration); } function importOneApplicationAndEntities(jdlObject) { const importState = { exportedApplications: [], exportedApplicationsWithEntities: {}, exportedEntities: [], exportedDeployments: [], }; const formattedApplication = formatApplicationToExport(jdlObject.getApplications()[0]); importState.exportedApplications.push(formattedApplication); const jdlApplication = jdlObject.getApplications()[0]; const applicationName = jdlApplication.getConfigurationOptionValue(BASE_NAME_KEY); const entitiesPerApplicationMap = convert(jdlObject); const jsonEntities = entitiesPerApplicationMap.get(applicationName); const { [GENERATOR_NAME]: config, ...remaining } = formattedApplication; importState.exportedApplicationsWithEntities[applicationName] = { config, ...remaining, entities: [], }; if (jsonEntities.length !== 0) { const exportedJSONEntities = exportJSONEntities(jsonEntities, { applicationName, applicationType: jdlApplication.getConfigurationOptionValue(APPLICATION_TYPE_KEY), forSeveralApplications: false, }); importState.exportedApplicationsWithEntities[applicationName].entities = exportedJSONEntities; importState.exportedEntities = uniqBy([...importState.exportedEntities, ...exportedJSONEntities], 'name'); } return importState; } function importApplicationsAndEntities(jdlObject) { const importState = { exportedApplications: [], exportedApplicationsWithEntities: {}, exportedEntities: [], exportedDeployments: [], }; const formattedApplications = formatApplicationsToExport(jdlObject.applications); importState.exportedApplications = formattedApplications; const entitiesPerApplicationMap = convert(jdlObject); entitiesPerApplicationMap.forEach((jsonEntities, applicationName) => { const jdlApplication = jdlObject.getApplication(applicationName); const exportedJSONEntities = exportJSONEntities(jsonEntities, { applicationName, applicationType: jdlApplication.getConfigurationOptionValue(APPLICATION_TYPE_KEY), forSeveralApplications: true, }); const exportedConfig = importState.exportedApplications.find(config => applicationName === config[GENERATOR_NAME].baseName); const { [GENERATOR_NAME]: config, ...remaining } = exportedConfig; importState.exportedApplicationsWithEntities[applicationName] = { config, ...remaining, entities: exportedJSONEntities, }; importState.exportedEntities = uniqBy([...importState.exportedEntities, ...exportedJSONEntities], 'name'); }); return importState; } function importDeployments(deployments) { return exportDeployments(deployments); } function exportJSONEntities(entities, configuration) { let baseName = configuration.applicationName; let applicationType = configuration.applicationType; if (configuration.application) { baseName = configuration.application[GENERATOR_JHIPSTER].baseName; applicationType = configuration.application[GENERATOR_JHIPSTER].applicationType; } return exportEntities({ entities, application: { name: baseName, type: applicationType, forSeveralApplications: !!configuration.forSeveralApplications, }, }); }