UNPKG

generator-pyhipster

Version:

Python (Flask) + Angular/React/Vue in one handy generator

490 lines (457 loc) 29.9 kB
/** * Copyright 2013-2022 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. */ const assert = require('assert'); const _ = require('lodash'); const { isReservedTableName } = require('../jdl/jhipster/reserved-keywords'); const { BlobTypes, CommonDBTypes, RelationalOnlyDBTypes } = require('../jdl/jhipster/field-types'); const { MIN, MINLENGTH, MINBYTES, MAX, MAXBYTES, MAXLENGTH, PATTERN, REQUIRED, UNIQUE } = require('../jdl/jhipster/validations'); const { MYSQL, SQL } = require('../jdl/jhipster/database-types'); const { MapperTypes } = require('../jdl/jhipster/entity-options'); const { MAPSTRUCT } = MapperTypes; const { TEXT, IMAGE, ANY } = BlobTypes; const { BOOLEAN, BIG_DECIMAL, DOUBLE, DURATION, FLOAT, INSTANT, INTEGER, LOCAL_DATE, LONG, STRING, UUID, ZONED_DATE_TIME, IMAGE_BLOB, ANY_BLOB, TEXT_BLOB, BLOB, } = CommonDBTypes; const { BYTES, BYTE_BUFFER } = RelationalOnlyDBTypes; const fakeStringTemplateForFieldName = columnName => { let fakeTemplate; if (columnName === 'first_name') { fakeTemplate = 'name.firstName'; } else if (columnName === 'last_name') { fakeTemplate = 'name.lastName'; } else if (columnName === 'job_title') { fakeTemplate = 'name.jobTitle'; } else if (columnName === 'telephone' || columnName === 'phone') { fakeTemplate = 'phone.phoneNumber'; } else if (columnName === 'zip_code' || columnName === 'post_code') { fakeTemplate = 'address.zipCode'; } else if (columnName === 'city') { fakeTemplate = 'address.city'; } else if (columnName === 'street_name' || columnName === 'street') { fakeTemplate = 'address.streetName'; } else if (columnName === 'country') { fakeTemplate = 'address.country'; } else if (columnName === 'country_code') { fakeTemplate = 'address.countryCode'; } else if (columnName === 'color') { fakeTemplate = 'commerce.color'; } else if (columnName === 'account') { fakeTemplate = 'finance.account'; } else if (columnName === 'account_name') { fakeTemplate = 'finance.accountName'; } else if (columnName === 'currency_code') { fakeTemplate = 'finance.currencyCode'; } else if (columnName === 'currency_name') { fakeTemplate = 'finance.currencyName'; } else if (columnName === 'currency_symbol') { fakeTemplate = 'finance.currencySymbol'; } else if (columnName === 'iban') { fakeTemplate = 'finance.iban'; } else if (columnName === 'bic') { fakeTemplate = 'finance.bic'; } else if (columnName === 'email') { fakeTemplate = 'internet.email'; } else if (columnName === 'url') { fakeTemplate = 'internet.url'; } else { fakeTemplate = 'random.words'; } return `{{${fakeTemplate}}}`; }; const generateFakeDataForField = (field, faker, changelogDate, type = 'csv') => { let data; if (field.fakerTemplate) { data = faker.faker(field.fakerTemplate); } else if (field.fieldValidate && field.fieldValidateRules.includes('pattern')) { const re = field.createRandexp(); if (!re) { return undefined; } const generated = re.gen(); if (type === 'csv' || type === 'cypress') { data = generated.replace(/"/g, ''); } else { data = generated; } if (data.length === 0) { data = undefined; } } else if (field.fieldIsEnum) { if (field.fieldValues.length !== 0) { const enumValues = field.enumValues; data = enumValues[faker.datatype.number(enumValues.length - 1)].name; } else { data = undefined; } } else if (field.fieldType === DURATION && type === 'cypress') { data = `PT${faker.datatype.number({ min: 1, max: 59 })}M`; // eslint-disable-next-line no-template-curly-in-string } else if ([INTEGER, LONG, FLOAT, '${floatType}', DOUBLE, BIG_DECIMAL, DURATION].includes(field.fieldType)) { data = faker.datatype.number({ max: field.fieldValidateRulesMax ? parseInt(field.fieldValidateRulesMax, 10) : undefined, min: field.fieldValidateRulesMin ? parseInt(field.fieldValidateRulesMin, 10) : undefined, }); } else if ([INSTANT, ZONED_DATE_TIME, LOCAL_DATE].includes(field.fieldType)) { // Iso: YYYY-MM-DDTHH:mm:ss.sssZ const date = faker.date.recent(1, changelogDate); const isoDate = date.toISOString(); if (field.fieldType === LOCAL_DATE) { data = isoDate.split('T')[0]; } else if (type === 'json-serializable') { data = date; } else { // Write the date without milliseconds so Java can parse it // See https://stackoverflow.com/a/34053802/150868 // YYYY-MM-DDTHH:mm:ss data = isoDate.split('.')[0]; if (type === 'cypress') { // YYYY-MM-DDTHH:mm data = data.substr(0, data.length - 3); } } } else if (field.fieldType === BYTES && field.fieldTypeBlobContent !== TEXT) { data = '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'; } else if (field.fieldType === BYTES && field.fieldTypeBlobContent === TEXT) { data = 'Welcome to PyHipster!! This helps you to quickly generate, develop, & deploy modern web applications using Python 3 and Flask.'; } else if (field.fieldType === STRING) { data = field.id ? faker.datatype.uuid() : faker.fake(fakeStringTemplateForFieldName(field.columnName)); } else if (field.fieldType === UUID) { data = faker.datatype.uuid(); } else if (field.fieldType === BOOLEAN) { data = faker.datatype.boolean(); } if (field.fieldType === BYTES && type === 'json-serializable') { data = Buffer.from(data).toString('base64'); } // Validation rules if (data !== undefined && field.fieldValidate === true) { // manage String max length if (field.fieldValidateRules.includes(MAXLENGTH)) { const maxlength = field.fieldValidateRulesMaxlength; data = data.substring(0, maxlength); } // manage String min length if (field.fieldValidateRules.includes(MINLENGTH)) { const minlength = field.fieldValidateRulesMinlength; data = data.length > minlength ? data : data + 'X'.repeat(minlength - data.length); } // test if generated data is still compatible with the regexp as we potentially modify it with min/maxLength if (field.fieldValidateRules.includes(PATTERN) && !new RegExp(`^${field.fieldValidateRulesPattern}$`).test(data)) { data = undefined; } } if ( data !== undefined && type === 'ts' && // eslint-disable-next-line no-template-curly-in-string ![BOOLEAN, INTEGER, LONG, FLOAT, '${floatType}', DOUBLE, BIG_DECIMAL].includes(field.fieldType) ) { data = `'${data}'`; } else if (data !== undefined && type === 'csv' && field.fieldValidate && field.fieldValidateRules.includes(PATTERN)) { data = `"${data}"`; } return data; }; function _derivedProperties(field) { const fieldType = field.fieldType; const fieldTypeBlobContent = field.fieldTypeBlobContent; const validationRules = field.fieldValidate ? field.fieldValidateRules : []; _.defaults(field, { blobContentTypeText: fieldTypeBlobContent === TEXT, blobContentTypeImage: fieldTypeBlobContent === IMAGE, blobContentTypeAny: fieldTypeBlobContent === ANY, fieldTypeBoolean: fieldType === BOOLEAN, fieldTypeBigDecimal: fieldType === BIG_DECIMAL, fieldTypeDouble: fieldType === DOUBLE, fieldTypeDuration: fieldType === DURATION, fieldTypeFloat: fieldType === FLOAT, fieldTypeInstant: fieldType === INSTANT, fieldTypeInteger: fieldType === INTEGER, fieldTypeLocalDate: fieldType === LOCAL_DATE, fieldTypeLong: fieldType === LONG, fieldTypeString: fieldType === STRING, fieldTypeUUID: fieldType === UUID, fieldTypeZonedDateTime: fieldType === ZONED_DATE_TIME, fieldTypeImageBlob: fieldType === IMAGE_BLOB, fieldTypeAnyBlob: fieldType === ANY_BLOB, fieldTypeTextBlob: fieldType === TEXT_BLOB, fieldTypeBlob: fieldType === BLOB, fieldTypeBytes: fieldType === BYTES, fieldTypeByteBuffer: fieldType === BYTE_BUFFER, fieldTypeNumeric: fieldType === INTEGER || fieldType === LONG || fieldType === FLOAT || fieldType === DOUBLE || fieldType === BIG_DECIMAL, fieldTypeBinary: fieldType === BYTES || fieldType === BYTE_BUFFER, fieldTypeTimed: fieldType === ZONED_DATE_TIME || fieldType === INSTANT, fieldTypeCharSequence: fieldType === STRING || fieldType === UUID, fieldTypeTemporal: fieldType === ZONED_DATE_TIME || fieldType === INSTANT || fieldType === LOCAL_DATE, fieldValidationRequired: validationRules.includes(REQUIRED), fieldValidationMin: validationRules.includes(MIN), fieldValidationMinLength: validationRules.includes(MINLENGTH), fieldValidationMax: validationRules.includes(MAX), fieldValidationMaxLength: validationRules.includes(MAXLENGTH), fieldValidationPattern: validationRules.includes(PATTERN), fieldValidationUnique: validationRules.includes(UNIQUE), fieldValidationMinBytes: validationRules.includes(MINBYTES), fieldValidationMaxBytes: validationRules.includes(MAXBYTES), }); } function prepareFieldForTemplates(entityWithConfig, field, generator) { _.defaults(field, { propertyName: field.fieldName, fieldNameCapitalized: _.upperFirst(field.fieldName), fieldNameUnderscored: _.snakeCase(field.fieldName), fieldNameHumanized: _.startCase(field.fieldName), fieldTranslationKey: `${entityWithConfig.i18nKeyPrefix}.${field.fieldName}`, tsType: generator.getTypescriptKeyType(field.fieldType), entity: entityWithConfig, }); const fieldType = field.fieldType; if (field.mapstructExpression) { assert.equal( entityWithConfig.dto, MAPSTRUCT, `@MapstructExpression requires an Entity with mapstruct dto [${entityWithConfig.name}.${field.fieldName}].` ); // Remove from Entity.java and liquibase. field.transient = true; // Disable update form. field.readonly = true; } if (field.id) { if (field.autoGenerate === undefined) { field.autoGenerate = !entityWithConfig.primaryKey.composite && [LONG, UUID].includes(field.fieldType); } if (!field.autoGenerate) { field.liquibaseAutoIncrement = false; field.jpaGeneratedValue = false; field.autoGenerateByService = false; field.autoGenerateByRepository = false; field.requiresPersistableImplementation = true; } else if (entityWithConfig.databaseType !== SQL) { field.liquibaseAutoIncrement = false; field.jpaGeneratedValue = false; field.autoGenerateByService = field.fieldType === UUID; field.autoGenerateByRepository = !field.autoGenerateByService; field.requiresPersistableImplementation = false; field.readonly = true; } else if (entityWithConfig.reactive) { field.liquibaseAutoIncrement = field.fieldType === LONG; field.jpaGeneratedValue = false; field.autoGenerateByService = !field.liquibaseAutoIncrement; field.autoGenerateByRepository = !field.autoGenerateByService; field.requiresPersistableImplementation = !field.liquibaseAutoIncrement; field.readonly = true; } else { const defaultGenerationType = entityWithConfig.prodDatabaseType === MYSQL ? 'identity' : 'sequence'; field.jpaGeneratedValue = field.jpaGeneratedValue || field.fieldType === LONG ? defaultGenerationType : true; field.autoGenerateByService = false; field.autoGenerateByRepository = true; field.requiresPersistableImplementation = false; field.readonly = true; if (field.jpaGeneratedValue === 'identity') { field.liquibaseAutoIncrement = true; } } } field.fieldIsEnum = !field.id && fieldIsEnum(fieldType); field.fieldWithContentType = (fieldType === BYTES || fieldType === BYTE_BUFFER) && field.fieldTypeBlobContent !== TEXT; if (field.fieldWithContentType) { field.contentTypeFieldName = `${field.fieldName}ContentType`; } if (entityWithConfig.prodDatabaseType) { // TODO move to server generator. prepareServerFieldForTemplates(entityWithConfig, field, generator); } prepareClientFieldForTemplates(entityWithConfig, field, generator); if (field.fieldIsEnum) { field.enumValues = getEnumValuesWithCustomValues(field.fieldValues); } field.fieldValidate = Array.isArray(field.fieldValidateRules) && field.fieldValidateRules.length >= 1; field.nullable = !(field.fieldValidate === true && field.fieldValidateRules.includes(REQUIRED)); field.unique = field.fieldValidate === true && field.fieldValidateRules.includes(UNIQUE); if (field.unique) { field.uniqueConstraintName = generator.getUXConstraintName( entityWithConfig.entityTableName, field.columnName, entityWithConfig.prodDatabaseType ); } if (field.fieldValidate === true && field.fieldValidateRules.includes(MAXLENGTH)) { field.maxlength = field.fieldValidateRulesMaxlength || 255; } const faker = entityWithConfig.faker; field.createRandexp = () => { // check if regex is valid. If not, issue warning and we skip fake data generation. try { // eslint-disable-next-line no-new new RegExp(field.fieldValidateRulesPattern); } catch (e) { generator.warning(`${field.fieldName} pattern is not valid: ${field.fieldValidateRulesPattern}. Skipping generating fake data. `); return undefined; } return faker.createRandexp(field.fieldValidateRulesPattern); }; field.uniqueValue = []; field.generateFakeData = (type = 'csv') => { let data = generateFakeDataForField(field, faker, entityWithConfig.changelogDateForRecent, type); // manage uniqueness if (field.fieldValidate === true && field.fieldValidateRules.includes(UNIQUE)) { let i = 0; while (field.uniqueValue.indexOf(data) !== -1) { if (i++ === 5) { data = undefined; break; } data = generateFakeDataForField(field, faker, entityWithConfig.changelogDateForRecent, type); } if (data !== undefined) { field.uniqueValue.push(data); } } if (data === undefined) { generator.warning(`Error generating fake data for field ${field.fieldName}`); } return data; }; field.path = [field.fieldName]; field.relationshipsPath = []; field.reference = fieldToReference(entityWithConfig, field); _derivedProperties(field); return field; } function fieldIsEnum(fieldType) { return ![ STRING, INTEGER, LONG, FLOAT, DOUBLE, BIG_DECIMAL, LOCAL_DATE, INSTANT, ZONED_DATE_TIME, DURATION, UUID, BOOLEAN, BYTES, BYTE_BUFFER, ].includes(fieldType); } /** * From an enum's values (with or without custom values), returns the enum's values without custom values. * @param {String} enumValues - an enum's values. * @return {Array<String>} the formatted enum's values. */ function getEnumValuesWithCustomValues(enumValues) { if (!enumValues || enumValues === '') { throw new Error('Enumeration values must be passed to get the formatted values.'); } return enumValues.split(',').map(enumValue => { if (!enumValue.includes('(')) { return { name: enumValue.trim(), value: enumValue.trim() }; } const matched = /\s*(.+?)\s*\((.+?)\)/.exec(enumValue); return { name: matched[1], value: matched[2], }; }); } function prepareClientFieldForTemplates(entityWithConfig, field, generator) { if (field.fieldValidateRulesPatternAngular === undefined) { field.fieldValidateRulesPatternAngular = field.fieldValidateRulesPattern ? field.fieldValidateRulesPattern.replace(/"/g, '&#34;') : field.fieldValidateRulesPattern; } if (field.fieldValidateRulesPatternReact === undefined) { field.fieldValidateRulesPatternReact = field.fieldValidateRulesPattern ? field.fieldValidateRulesPattern.replace(/'/g, "\\'") : field.fieldValidateRulesPattern; } } function prepareServerFieldForTemplates(entityWithConfig, field, generator) { if (field.fieldNameAsDatabaseColumn === undefined) { const fieldNameUnderscored = _.snakeCase(field.fieldName); const jhiFieldNamePrefix = generator.getColumnName(entityWithConfig.jhiPrefix); if (isReservedTableName(fieldNameUnderscored, entityWithConfig.prodDatabaseType)) { if (!jhiFieldNamePrefix) { generator.warning( `The field name '${fieldNameUnderscored}' is regarded as a reserved keyword, but you have defined an empty jhiPrefix. This might lead to a non-working application.` ); field.fieldNameAsDatabaseColumn = fieldNameUnderscored; } else { field.fieldNameAsDatabaseColumn = `${jhiFieldNamePrefix}_${fieldNameUnderscored}`; } } else { field.fieldNameAsDatabaseColumn = fieldNameUnderscored; } } field.columnName = field.fieldNameAsDatabaseColumn; if (field.fieldInJavaBeanMethod === undefined) { // Handle the specific case when the second letter is capitalized // See http://stackoverflow.com/questions/2948083/naming-convention-for-getters-setters-in-java if (field.fieldName.length > 1) { const firstLetter = field.fieldName.charAt(0); const secondLetter = field.fieldName.charAt(1); if (firstLetter === firstLetter.toLowerCase() && secondLetter === secondLetter.toUpperCase()) { field.fieldInJavaBeanMethod = firstLetter.toLowerCase() + field.fieldName.slice(1); } else { field.fieldInJavaBeanMethod = _.upperFirst(field.fieldName); } } else { field.fieldInJavaBeanMethod = _.upperFirst(field.fieldName); } } if (field.fieldValidateRulesPatternJava === undefined) { field.fieldValidateRulesPatternJava = field.fieldValidateRulesPattern ? field.fieldValidateRulesPattern.replace(/\\/g, '\\\\').replace(/"/g, '\\"') : field.fieldValidateRulesPattern; } } function fieldToReference(entity, field, pathPrefix = []) { return { id: field.id, entity, field, multiple: false, owned: true, doc: field.javadoc, label: field.fieldNameHumanized, name: field.fieldName, type: field.fieldType, nameCapitalized: field.fieldNameCapitalized, path: [...pathPrefix, field.fieldName], }; } module.exports = { prepareFieldForTemplates, fieldIsEnum, getEnumValuesWithCustomValues, fieldToReference };