├── .eslintignore ├── src ├── main │ ├── module-entry.ts │ ├── erdiagram │ │ ├── common │ │ │ ├── exports.ts │ │ │ └── config │ │ │ │ ├── exports.ts │ │ │ │ ├── ConfigManager.ts │ │ │ │ └── AbstractConfigManager.ts │ │ ├── converter │ │ │ ├── diagram │ │ │ │ ├── common │ │ │ │ │ ├── exports.ts │ │ │ │ │ └── config │ │ │ │ │ │ ├── DiagramLevel.ts │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ └── DiagramSourceCodeGeneratorConfig.ts │ │ │ │ ├── exports.ts │ │ │ │ ├── nomnoml │ │ │ │ │ ├── exports.ts │ │ │ │ │ ├── entity │ │ │ │ │ │ ├── NomnomlEntityIdentityPropertyCodeGenerator.ts │ │ │ │ │ │ └── NomnomlEntityPropertyCodeGenerator.ts │ │ │ │ │ ├── config │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ ├── NomnomlConfig.ts │ │ │ │ │ │ ├── NomnomlStyleConfig.ts │ │ │ │ │ │ └── NomnomlConfigManager.ts │ │ │ │ │ ├── directive │ │ │ │ │ │ └── NomnomlDirectivesCodeGenerator.ts │ │ │ │ │ └── relationship │ │ │ │ │ │ ├── NomnomlRelationshipCardinalityCodeGenerator.ts │ │ │ │ │ │ ├── NomnomlRelationshipDirectionCodeGenerator.ts │ │ │ │ │ │ └── NomnomlUnnamedRelationshipCodeGenerator.ts │ │ │ │ └── plantuml │ │ │ │ │ ├── exports.ts │ │ │ │ │ ├── config │ │ │ │ │ ├── exports.ts │ │ │ │ │ ├── PlantUmlConfig.ts │ │ │ │ │ └── PlantUmlConfigManager.ts │ │ │ │ │ ├── entity │ │ │ │ │ ├── PlantUmlEntityIdentityPropertyCodeGenerator.ts │ │ │ │ │ ├── PlantUmlDirectivesCodeGenerator.ts │ │ │ │ │ └── PlantUmlEntityPropertyCodeGenerator.ts │ │ │ │ │ └── relationship │ │ │ │ │ ├── PlantUmlRelationshipCardinalityCodeGenerator.ts │ │ │ │ │ ├── PlantUmlRelationshipDirectionCodeGenerator.ts │ │ │ │ │ └── PlantUmlRelationshipCodeGenerator.ts │ │ │ ├── oop │ │ │ │ ├── exports.ts │ │ │ │ ├── source-code-generator │ │ │ │ │ ├── exports.ts │ │ │ │ │ ├── java │ │ │ │ │ │ ├── jpa │ │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ │ ├── transformer │ │ │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ │ │ ├── setup │ │ │ │ │ │ │ │ │ ├── JpaTransformerSetupData.ts │ │ │ │ │ │ │ │ │ └── JpaTransformerSetupDataGenerator.ts │ │ │ │ │ │ │ │ ├── visitor │ │ │ │ │ │ │ │ │ └── field │ │ │ │ │ │ │ │ │ │ └── FieldAnnotationsSupplier.ts │ │ │ │ │ │ │ │ ├── JpaTransformerBuilder.ts │ │ │ │ │ │ │ │ └── finder │ │ │ │ │ │ │ │ │ └── ClassModelSourceFinder.ts │ │ │ │ │ │ │ ├── config │ │ │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ │ │ ├── JpaConfig.ts │ │ │ │ │ │ │ │ └── JpaConfigManager.ts │ │ │ │ │ │ │ └── JpaEnumTypesProvider.ts │ │ │ │ │ │ ├── lombok │ │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ │ ├── transformer │ │ │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ │ │ └── LombokTransformer.ts │ │ │ │ │ │ │ ├── config │ │ │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ │ │ ├── LombokConfig.ts │ │ │ │ │ │ │ │ └── LombokConfigManager.ts │ │ │ │ │ │ │ └── lombok-java-types.ts │ │ │ │ │ │ ├── model │ │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ │ ├── generator │ │ │ │ │ │ │ │ ├── config │ │ │ │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ │ │ │ └── JavaClassModelConfig.ts │ │ │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ │ │ ├── JavaClassModelGenerationResult.ts │ │ │ │ │ │ │ │ ├── source │ │ │ │ │ │ │ │ │ ├── JavaClassModelDescriptorsRepositoryBuilder.ts │ │ │ │ │ │ │ │ │ └── JavaClassModelDescriptorsRepository.ts │ │ │ │ │ │ │ │ └── JavaClassGenerator.ts │ │ │ │ │ │ │ ├── transformer │ │ │ │ │ │ │ │ ├── JavaClassModelTransformer.ts │ │ │ │ │ │ │ │ └── java-class-model-transformer-context-types.ts │ │ │ │ │ │ │ └── java-class-model-types.ts │ │ │ │ │ │ ├── type │ │ │ │ │ │ │ ├── JavaExtendedPackage.ts │ │ │ │ │ │ │ ├── JavaType.ts │ │ │ │ │ │ │ ├── parameterized │ │ │ │ │ │ │ │ ├── JavaParameterizedType.ts │ │ │ │ │ │ │ │ ├── isJavaParameterizedType.ts │ │ │ │ │ │ │ │ └── createJavaArrayType.ts │ │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ │ ├── simple │ │ │ │ │ │ │ │ └── createJavaSimpleType.ts │ │ │ │ │ │ │ └── import │ │ │ │ │ │ │ │ ├── JavaImportStatementsGenerator.ts │ │ │ │ │ │ │ │ ├── JavaAnnotationUsedTypesCompiler.ts │ │ │ │ │ │ │ │ └── JavaClassUsedTypesCompiler.ts │ │ │ │ │ │ ├── validation │ │ │ │ │ │ │ ├── strategy │ │ │ │ │ │ │ │ ├── NotNullBlobValidationStrategy.ts │ │ │ │ │ │ │ │ └── NotNullTextValidationStrategy.ts │ │ │ │ │ │ │ ├── config │ │ │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ │ │ ├── BeanValidationConfig.ts │ │ │ │ │ │ │ │ └── BeanValidationConfigManager.ts │ │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ │ ├── JavaValidationAnnotationTypesProvider.ts │ │ │ │ │ │ │ └── visitor │ │ │ │ │ │ │ │ └── BeanValidationFieldVisitor.ts │ │ │ │ │ │ ├── code │ │ │ │ │ │ │ ├── util │ │ │ │ │ │ │ │ ├── getAnnotationsLines.ts │ │ │ │ │ │ │ │ └── prependVisibility.ts │ │ │ │ │ │ │ ├── JavaClassModelCodeGenerator.ts │ │ │ │ │ │ │ └── JavaClassModelSourceFilesGenerator.ts │ │ │ │ │ │ ├── annotation │ │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ │ ├── annotation-parameter-types.ts │ │ │ │ │ │ │ ├── utils │ │ │ │ │ │ │ │ └── RawAnnotationParameterValue.ts │ │ │ │ │ │ │ └── JavaAnnotation.ts │ │ │ │ │ │ └── exports.ts │ │ │ │ │ ├── typescript │ │ │ │ │ │ ├── type │ │ │ │ │ │ │ ├── TypeScriptType.ts │ │ │ │ │ │ │ ├── parameterized │ │ │ │ │ │ │ │ ├── TypeScriptParameterizedType.ts │ │ │ │ │ │ │ │ ├── isTypeScriptParameterizedType.ts │ │ │ │ │ │ │ │ ├── createTypeScriptArrayType.ts │ │ │ │ │ │ │ │ └── createTypeScriptParameterizedType.ts │ │ │ │ │ │ │ ├── simple │ │ │ │ │ │ │ │ └── createTypeScriptSimpleType.ts │ │ │ │ │ │ │ └── exports.ts │ │ │ │ │ │ ├── config │ │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ │ └── TypeScriptConfig.ts │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ ├── TypeScriptSourceCodeGeneratorBuilder.ts │ │ │ │ │ │ └── TypeScriptSourceCodeGenerator.ts │ │ │ │ │ └── common │ │ │ │ │ │ └── type │ │ │ │ │ │ └── FieldTypeResolver.ts │ │ │ │ └── model │ │ │ │ │ ├── exports.ts │ │ │ │ │ ├── config │ │ │ │ │ ├── exports.ts │ │ │ │ │ ├── ClassModelConfig.ts │ │ │ │ │ └── ClassModelConfigManager.ts │ │ │ │ │ ├── class-model-types.ts │ │ │ │ │ ├── class │ │ │ │ │ └── field │ │ │ │ │ │ ├── RelationshipMemberToClassFieldMapper.ts │ │ │ │ │ │ ├── EntityPropertyToClassFieldMapper.ts │ │ │ │ │ │ └── EntityToIdClassFieldMapper.ts │ │ │ │ │ ├── ClassModelGenerator.ts │ │ │ │ │ └── source-metadata │ │ │ │ │ ├── source-metadata-utils.ts │ │ │ │ │ └── source-metadata-types.ts │ │ │ ├── database │ │ │ │ ├── exports.ts │ │ │ │ ├── source-code-generator │ │ │ │ │ ├── sql │ │ │ │ │ │ ├── dialect │ │ │ │ │ │ │ ├── common │ │ │ │ │ │ │ │ ├── config │ │ │ │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ │ │ │ └── SqlDialectConfig.ts │ │ │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ │ │ ├── column │ │ │ │ │ │ │ │ │ ├── SqlIdColumnCodeGenerator.ts │ │ │ │ │ │ │ │ │ ├── SqlColumnCodeGenerator.ts │ │ │ │ │ │ │ │ │ └── SqlForeignColumnCodeGenerator.ts │ │ │ │ │ │ │ │ ├── SqlTypeResolver.ts │ │ │ │ │ │ │ │ ├── sql-script-types.ts │ │ │ │ │ │ │ │ └── SqlDialect.ts │ │ │ │ │ │ │ ├── mysql │ │ │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ │ │ └── config │ │ │ │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ │ │ │ └── MysqlDialectConfig.ts │ │ │ │ │ │ │ ├── oracle │ │ │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ │ │ └── config │ │ │ │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ │ │ │ └── OracleDialectConfig.ts │ │ │ │ │ │ │ ├── sqlite │ │ │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ │ │ ├── config │ │ │ │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ │ │ │ └── SqliteDialectConfig.ts │ │ │ │ │ │ │ │ └── column │ │ │ │ │ │ │ │ │ └── SqliteIdColumnCodeGenerator.ts │ │ │ │ │ │ │ ├── sqlserver │ │ │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ │ │ └── config │ │ │ │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ │ │ │ └── SqlServerDialectConfig.ts │ │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ │ └── postgresql │ │ │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ │ │ └── config │ │ │ │ │ │ │ │ ├── exports.ts │ │ │ │ │ │ │ │ └── PostgresqlDialectConfig.ts │ │ │ │ │ │ └── exports.ts │ │ │ │ │ ├── exports.ts │ │ │ │ │ └── SqlSourceCodeGeneratorBuilder.ts │ │ │ │ └── model │ │ │ │ │ ├── exports.ts │ │ │ │ │ ├── config │ │ │ │ │ ├── exports.ts │ │ │ │ │ ├── DatabaseModelConfig.ts │ │ │ │ │ └── DatabaseModelConfigManager.ts │ │ │ │ │ └── database-model-types.ts │ │ │ ├── common │ │ │ │ ├── exports.ts │ │ │ │ ├── id-naming-strategy │ │ │ │ │ ├── IdNamingStrategy.ts │ │ │ │ │ ├── exports.ts │ │ │ │ │ └── StandardIdNamingStrategies.ts │ │ │ │ ├── SourceFileInfo.ts │ │ │ │ └── case-format │ │ │ │ │ ├── CaseFormat.ts │ │ │ │ │ ├── exports.ts │ │ │ │ │ ├── AbstractUnderscoreCaseFormat.ts │ │ │ │ │ ├── LowerUnderscoreCaseFormat.ts │ │ │ │ │ ├── UpperUnderscoreCaseFormat.ts │ │ │ │ │ ├── UpperCamelCaseFormat.ts │ │ │ │ │ ├── CapitalizedUnderscoreCaseFormat.ts │ │ │ │ │ ├── CaseConverter.ts │ │ │ │ │ ├── AbstractCamelCaseFormat.ts │ │ │ │ │ ├── LowerCamelCaseFormat.ts │ │ │ │ │ └── StandardCaseFormats.ts │ │ │ ├── SourceCodeGenerator.ts │ │ │ ├── exports.ts │ │ │ └── MultipleFileSourceCodeGenerator.ts │ │ ├── parser │ │ │ ├── types │ │ │ │ ├── error │ │ │ │ │ ├── ERDiagramError.ts │ │ │ │ │ ├── ERDiagramSyntaxError.ts │ │ │ │ │ ├── ERDiagramUnknownTypeError.ts │ │ │ │ │ ├── ERDiagramDuplicatedEntityNameError.ts │ │ │ │ │ ├── ERDiagramDuplicatedPropertyNameError.ts │ │ │ │ │ ├── ERDiagramInvalidIdentityDefinitionError.ts │ │ │ │ │ ├── ERDiagramParseLineError.ts │ │ │ │ │ ├── ERDiagramEntityError.ts │ │ │ │ │ ├── ERDiagramRelationshipError.ts │ │ │ │ │ ├── ERDiagramEntityPropertyError.ts │ │ │ │ │ ├── ERDiagramUnknownEntityError.ts │ │ │ │ │ ├── ERDiagramMultipleIdentitiesError.ts │ │ │ │ │ └── exports.ts │ │ │ │ ├── exports.ts │ │ │ │ ├── ParseState.ts │ │ │ │ ├── parsed-entity-relationship-model-types.ts │ │ │ │ └── entity-relationship-model-types.ts │ │ │ ├── exports.ts │ │ │ ├── config │ │ │ │ ├── EntityRelationshipModelParserConfig.ts │ │ │ │ ├── exports.ts │ │ │ │ └── EntityRelationshipModelParserConfigManager.ts │ │ │ ├── line │ │ │ │ └── EntityRelationshipModelLineParserErrorHandler.ts │ │ │ ├── statement │ │ │ │ ├── statement-type-guesser.ts │ │ │ │ └── statement-types-regexes.ts │ │ │ ├── validator │ │ │ │ └── EntityRelationshipModelParseResultValidatorErrorHandler.ts │ │ │ ├── ParsedModelToPublicModelConverter.ts │ │ │ └── EntityRelationshipModelParserWithoutValidation.ts │ │ ├── util │ │ │ ├── types.ts │ │ │ ├── array-utils.ts │ │ │ ├── string-utils.ts │ │ │ ├── map-utils.ts │ │ │ ├── regex-utils.ts │ │ │ └── indent-utils.ts │ │ └── exports.ts │ └── standalone-entry.js └── test │ └── erdiagram │ ├── converter │ ├── database │ │ └── source-code-generator │ │ │ └── sql │ │ │ └── DatabaseModelToSqlCodeConverter_func_spec_expected_results │ │ │ ├── mysql │ │ │ ├── table_without_columns_nor_references.sql │ │ │ ├── table_with_custom_id.sql │ │ │ ├── table_with_columns_with_modifiers.sql │ │ │ ├── table_referencing_itself.sql │ │ │ ├── table_with_nullable_reference_to_another_table.sql │ │ │ ├── table_with_reference_to_another_table.sql │ │ │ ├── table_with_reference_to_another_table_with_a_custom_id.sql │ │ │ ├── table_with_unique_reference_to_another_table.sql │ │ │ ├── table_with_columns_of_all_types.sql │ │ │ └── tables_referencing_each_other.sql │ │ │ ├── sqlserver │ │ │ ├── table_without_columns_nor_references.sql │ │ │ ├── table_with_custom_id.sql │ │ │ ├── table_with_columns_with_modifiers.sql │ │ │ ├── table_referencing_itself.sql │ │ │ ├── table_with_nullable_reference_to_another_table.sql │ │ │ ├── table_with_reference_to_another_table.sql │ │ │ ├── table_with_reference_to_another_table_with_a_custom_id.sql │ │ │ ├── table_with_unique_reference_to_another_table.sql │ │ │ ├── table_with_columns_of_all_types.sql │ │ │ └── tables_referencing_each_other.sql │ │ │ ├── postgresql │ │ │ ├── table_without_columns_nor_references.sql │ │ │ ├── table_with_custom_id.sql │ │ │ ├── table_with_columns_with_modifiers.sql │ │ │ ├── table_referencing_itself.sql │ │ │ ├── table_with_nullable_reference_to_another_table.sql │ │ │ ├── table_with_reference_to_another_table.sql │ │ │ ├── table_with_reference_to_another_table_with_a_custom_id.sql │ │ │ ├── table_with_columns_of_all_types.sql │ │ │ ├── table_with_unique_reference_to_another_table.sql │ │ │ └── tables_referencing_each_other.sql │ │ │ ├── sqlite │ │ │ ├── table_without_columns_nor_references.sql │ │ │ ├── table_with_custom_id.sql │ │ │ ├── table_referencing_itself.sql │ │ │ ├── table_with_columns_with_modifiers.sql │ │ │ ├── table_with_nullable_reference_to_another_table.sql │ │ │ ├── table_with_reference_to_another_table.sql │ │ │ ├── table_with_reference_to_another_table_with_a_custom_id.sql │ │ │ ├── table_with_unique_reference_to_another_table.sql │ │ │ ├── tables_referencing_each_other.sql │ │ │ └── table_with_columns_of_all_types.sql │ │ │ └── oracle │ │ │ ├── table_without_columns_nor_references.sql │ │ │ ├── table_with_custom_id.sql │ │ │ ├── table_with_columns_with_modifiers.sql │ │ │ ├── table_referencing_itself.sql │ │ │ ├── table_with_nullable_reference_to_another_table.sql │ │ │ ├── table_with_reference_to_another_table.sql │ │ │ ├── table_with_columns_of_all_types.sql │ │ │ ├── table_with_reference_to_another_table_with_a_custom_id.sql │ │ │ ├── table_with_unique_reference_to_another_table.sql │ │ │ └── tables_referencing_each_other.sql │ ├── oop │ │ └── source-code-generator │ │ │ └── java │ │ │ ├── annotation │ │ │ └── java-annotation-mothers.ts │ │ │ ├── jpa │ │ │ └── JpaEnumTypesProvider.unit.spec.ts │ │ │ └── validation │ │ │ ├── BeanValidationTransformer.func.spec.ts │ │ │ └── JavaValidationAnnotationTypesProvider.unit.spec.ts │ ├── MultipleFileSourceCodeGenerator.unit.spec.ts │ └── common │ │ ├── source-metadata-instances.ts │ │ └── case-format │ │ └── CaseConverter.unit.spec.ts │ ├── parser │ ├── types │ │ └── error │ │ │ └── ERDiagramParseLineError.unit.spec.ts │ ├── entity-relationship-model-mothers.ts │ └── config │ │ └── EntityRelationshipModelParserConfigManager.unit.spec.ts │ └── util │ ├── array-utils.unit.spec.ts │ ├── jest-utils.ts │ └── regex-utils.unit.spec.ts ├── .gitignore ├── .prettierrc ├── .npmignore ├── .editorconfig ├── jest.config.js ├── scripts ├── bundle-ts-declaration-files.js └── utils │ └── colorize.js ├── tsconfig.json ├── coverage ├── badge-lines.svg ├── badge-branches.svg ├── badge-functions.svg └── badge-statements.svg ├── LICENSE └── .eslintrc.js /.eslintignore: -------------------------------------------------------------------------------- 1 | /* 2 | !src/ 3 | !test/ 4 | -------------------------------------------------------------------------------- /src/main/module-entry.ts: -------------------------------------------------------------------------------- 1 | export * from './erdiagram/exports'; 2 | -------------------------------------------------------------------------------- /src/main/erdiagram/common/exports.ts: -------------------------------------------------------------------------------- 1 | export * from './config/exports'; 2 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/diagram/common/exports.ts: -------------------------------------------------------------------------------- 1 | export * from './config/exports'; 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | /coverage/** 3 | !/coverage/badge-**.svg 4 | .idea 5 | *.iml 6 | .npmrc 7 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 120, 3 | "trailingComma": "all", 4 | "singleQuote": true 5 | } 6 | -------------------------------------------------------------------------------- /src/main/standalone-entry.js: -------------------------------------------------------------------------------- 1 | import * as ERDiagram from './erdiagram/exports'; 2 | 3 | export default ERDiagram; 4 | -------------------------------------------------------------------------------- /src/main/erdiagram/parser/types/error/ERDiagramError.ts: -------------------------------------------------------------------------------- 1 | export default class ERDiagramError extends Error { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/exports.ts: -------------------------------------------------------------------------------- 1 | export * from './source-code-generator/exports'; 2 | export * from './model/exports'; 3 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/exports.ts: -------------------------------------------------------------------------------- 1 | export * from './source-code-generator/exports'; 2 | export * from './model/exports'; 3 | -------------------------------------------------------------------------------- /src/main/erdiagram/parser/types/exports.ts: -------------------------------------------------------------------------------- 1 | export * from './entity-relationship-model-types'; 2 | export * from './error/exports'; 3 | -------------------------------------------------------------------------------- /src/main/erdiagram/util/types.ts: -------------------------------------------------------------------------------- 1 | export type WithPartial = Omit & { 2 | [P in K]: Partial 3 | }; 4 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/common/exports.ts: -------------------------------------------------------------------------------- 1 | export * from './case-format/exports'; 2 | export * from './id-naming-strategy/exports'; 3 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/exports.ts: -------------------------------------------------------------------------------- 1 | export * from './java/exports'; 2 | export * from './typescript/exports'; 3 | -------------------------------------------------------------------------------- /src/main/erdiagram/exports.ts: -------------------------------------------------------------------------------- 1 | export * from './common/exports'; 2 | export * from './converter/exports'; 3 | export * from './parser/exports'; 4 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/jpa/exports.ts: -------------------------------------------------------------------------------- 1 | export * from './config/exports'; 2 | export * from './transformer/exports'; 3 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/lombok/exports.ts: -------------------------------------------------------------------------------- 1 | export * from './config/exports'; 2 | export * from './transformer/exports'; 3 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/model/exports.ts: -------------------------------------------------------------------------------- 1 | export * from './generator/exports'; 2 | export * from './java-class-model-types'; 3 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/diagram/exports.ts: -------------------------------------------------------------------------------- 1 | export * from './common/exports'; 2 | export * from './nomnoml/exports'; 3 | export * from './plantuml/exports'; 4 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/common/id-naming-strategy/IdNamingStrategy.ts: -------------------------------------------------------------------------------- 1 | type IdNamingStrategy = (entityName: string) => string; 2 | export default IdNamingStrategy; 3 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/common/SourceFileInfo.ts: -------------------------------------------------------------------------------- 1 | export default interface SourceFileInfo { 2 | folder: string[]; 3 | filename: string; 4 | contents: string; 5 | } 6 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/source-code-generator/sql/dialect/common/config/exports.ts: -------------------------------------------------------------------------------- 1 | import SqlDialectConfig from './SqlDialectConfig'; 2 | 3 | export { 4 | SqlDialectConfig 5 | }; 6 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/diagram/common/config/DiagramLevel.ts: -------------------------------------------------------------------------------- 1 | enum DiagramLevel { 2 | CONCEPTUAL = 'conceptual', 3 | LOGICAL = 'logical' 4 | } 5 | 6 | export default DiagramLevel; 7 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/lombok/transformer/exports.ts: -------------------------------------------------------------------------------- 1 | import { LombokTransformer } from './LombokTransformer'; 2 | 3 | export { 4 | LombokTransformer 5 | }; 6 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/typescript/type/TypeScriptType.ts: -------------------------------------------------------------------------------- 1 | export default interface TypeScriptType { 2 | 3 | name: string; 4 | 5 | format(): string; 6 | 7 | } 8 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/common/case-format/CaseFormat.ts: -------------------------------------------------------------------------------- 1 | export default interface CaseFormat { 2 | 3 | splitWords(text: string): string[]; 4 | 5 | joinWords(words: string[]): string; 6 | 7 | } 8 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | /.idea 2 | /node_modules 3 | /scripts 4 | /src 5 | /lib 6 | /coverage 7 | /docs 8 | package-lock.json 9 | tsconfig.json 10 | tslint.json 11 | jest.config.js 12 | webpack.config.js 13 | .npmrc 14 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/type/JavaExtendedPackage.ts: -------------------------------------------------------------------------------- 1 | enum JavaExtendedPackage { 2 | JAVAX = 'javax', 3 | JAKARTA = 'jakarta' 4 | } 5 | 6 | export default JavaExtendedPackage; 7 | -------------------------------------------------------------------------------- /src/main/erdiagram/parser/types/error/ERDiagramSyntaxError.ts: -------------------------------------------------------------------------------- 1 | import ERDiagramError from '@/erdiagram/parser/types/error/ERDiagramError'; 2 | 3 | export default class ERDiagramSyntaxError extends ERDiagramError { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /src/main/erdiagram/common/config/exports.ts: -------------------------------------------------------------------------------- 1 | import ConfigManager from './ConfigManager'; 2 | import AbstractConfigManager from './AbstractConfigManager'; 3 | 4 | export { 5 | ConfigManager, 6 | AbstractConfigManager 7 | }; 8 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/diagram/nomnoml/exports.ts: -------------------------------------------------------------------------------- 1 | import NomnomlSourceCodeGenerator from './NomnomlSourceCodeGenerator'; 2 | 3 | export * from './config/exports'; 4 | 5 | export { 6 | NomnomlSourceCodeGenerator 7 | }; 8 | -------------------------------------------------------------------------------- /src/main/erdiagram/parser/types/error/ERDiagramUnknownTypeError.ts: -------------------------------------------------------------------------------- 1 | import ERDiagramError from '@/erdiagram/parser/types/error/ERDiagramError'; 2 | 3 | export default class ERDiagramUnknownTypeError extends ERDiagramError { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/diagram/plantuml/exports.ts: -------------------------------------------------------------------------------- 1 | import PlantUmlSourceCodeGenerator 2 | from './PlantUmlSourceCodeGenerator'; 3 | 4 | export * from './config/exports'; 5 | 6 | export { 7 | PlantUmlSourceCodeGenerator 8 | }; 9 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/model/exports.ts: -------------------------------------------------------------------------------- 1 | import ClassModelGenerator from './ClassModelGenerator'; 2 | 3 | export * from './class-model-types'; 4 | export * from './config/exports'; 5 | 6 | export { 7 | ClassModelGenerator 8 | }; 9 | -------------------------------------------------------------------------------- /src/main/erdiagram/parser/exports.ts: -------------------------------------------------------------------------------- 1 | import EntityRelationshipModelParser from './EntityRelationshipModelParser'; 2 | 3 | export * from './config/exports'; 4 | export * from './types/exports'; 5 | 6 | export { 7 | EntityRelationshipModelParser 8 | }; 9 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/model/exports.ts: -------------------------------------------------------------------------------- 1 | import DatabaseModelGenerator from './DatabaseModelGenerator'; 2 | 3 | export * from './database-model-types'; 4 | export * from './config/exports'; 5 | 6 | export { 7 | DatabaseModelGenerator 8 | }; 9 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/validation/strategy/NotNullBlobValidationStrategy.ts: -------------------------------------------------------------------------------- 1 | enum NotNullBlobValidationStrategy { 2 | NOT_NULL = 'not_null', 3 | NOT_EMPTY = 'not_empty' 4 | } 5 | 6 | export default NotNullBlobValidationStrategy; 7 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/common/id-naming-strategy/exports.ts: -------------------------------------------------------------------------------- 1 | import StandardIdNamingStrategies from './StandardIdNamingStrategies'; 2 | import IdNamingStrategy from './IdNamingStrategy'; 3 | 4 | export { 5 | IdNamingStrategy, 6 | StandardIdNamingStrategies 7 | }; 8 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/jpa/transformer/exports.ts: -------------------------------------------------------------------------------- 1 | import {JpaTransformer} from './JpaTransformer'; 2 | import JpaTransformerBuilder from './JpaTransformerBuilder'; 3 | 4 | export { 5 | JpaTransformer, 6 | JpaTransformerBuilder 7 | }; 8 | -------------------------------------------------------------------------------- /src/main/erdiagram/parser/types/error/ERDiagramDuplicatedEntityNameError.ts: -------------------------------------------------------------------------------- 1 | import ERDiagramEntityError from '@/erdiagram/parser/types/error/ERDiagramEntityError'; 2 | 3 | export default class ERDiagramDuplicatedEntityNameError extends ERDiagramEntityError { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/diagram/common/config/exports.ts: -------------------------------------------------------------------------------- 1 | import DiagramLevel from './DiagramLevel'; 2 | import DiagramSourceCodeGeneratorConfig from './DiagramSourceCodeGeneratorConfig'; 3 | 4 | 5 | export { 6 | DiagramLevel, 7 | DiagramSourceCodeGeneratorConfig 8 | }; 9 | -------------------------------------------------------------------------------- /src/main/erdiagram/util/array-utils.ts: -------------------------------------------------------------------------------- 1 | export function removeDuplicates(array: T[]): T[] { 2 | return [...new Set(array)]; 3 | } 4 | 5 | export function removeNullableValues(array: (T | null | undefined)[]): T[] { 6 | return array.filter(e => e != null) as T[]; 7 | } 8 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/source-code-generator/sql/dialect/common/exports.ts: -------------------------------------------------------------------------------- 1 | import SqlDialect from '@/erdiagram/converter/database/source-code-generator/sql/dialect/common/SqlDialect'; 2 | 3 | export * from './config/exports'; 4 | 5 | export { 6 | SqlDialect 7 | }; 8 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/diagram/common/config/DiagramSourceCodeGeneratorConfig.ts: -------------------------------------------------------------------------------- 1 | import DiagramLevel from '@/erdiagram/converter/diagram/common/config/DiagramLevel'; 2 | 3 | export default interface DiagramSourceCodeGeneratorConfig { 4 | diagramLevel: DiagramLevel; 5 | } 6 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/SourceCodeGenerator.ts: -------------------------------------------------------------------------------- 1 | import {EntityRelationshipModel} from '@/erdiagram/parser/types/entity-relationship-model-types'; 2 | 3 | export default interface SourceCodeGenerator { 4 | 5 | generateSourceCode(model: EntityRelationshipModel): string; 6 | 7 | } 8 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/source-code-generator/sql/dialect/mysql/exports.ts: -------------------------------------------------------------------------------- 1 | import MysqlDialect from '@/erdiagram/converter/database/source-code-generator/sql/dialect/mysql/MysqlDialect'; 2 | 3 | export * from './config/exports'; 4 | 5 | export { 6 | MysqlDialect 7 | }; 8 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/common/type/FieldTypeResolver.ts: -------------------------------------------------------------------------------- 1 | import {ClassFieldDescriptor} from '@/erdiagram/converter/oop/model/class-model-types'; 2 | 3 | export default interface FieldTypeResolver { 4 | resolveFieldType(field: ClassFieldDescriptor): T; 5 | } -------------------------------------------------------------------------------- /src/main/erdiagram/parser/config/EntityRelationshipModelParserConfig.ts: -------------------------------------------------------------------------------- 1 | export default interface EntityRelationshipModelParserConfig { 2 | allowUnknownEntities: boolean; 3 | } 4 | 5 | export type PartialEntityRelationshipModelParserConfig = Partial; 6 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/source-code-generator/sql/dialect/oracle/exports.ts: -------------------------------------------------------------------------------- 1 | import OracleDialect from '@/erdiagram/converter/database/source-code-generator/sql/dialect/oracle/OracleDialect'; 2 | 3 | export * from './config/exports'; 4 | 5 | export { 6 | OracleDialect 7 | }; 8 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/source-code-generator/sql/dialect/sqlite/exports.ts: -------------------------------------------------------------------------------- 1 | import SqliteDialect from '@/erdiagram/converter/database/source-code-generator/sql/dialect/sqlite/SqliteDialect'; 2 | 3 | export * from './config/exports'; 4 | 5 | export { 6 | SqliteDialect 7 | }; 8 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/jpa/transformer/setup/JpaTransformerSetupData.ts: -------------------------------------------------------------------------------- 1 | import {DatabaseModel} from '@/erdiagram/converter/database/model/database-model-types'; 2 | 3 | export default interface JpaTransformerSetupData { 4 | databaseModel: DatabaseModel; 5 | } 6 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/validation/strategy/NotNullTextValidationStrategy.ts: -------------------------------------------------------------------------------- 1 | enum NotNullTextValidationStrategy { 2 | NOT_NULL = 'not_null', 3 | NOT_EMPTY = 'not_empty', 4 | NOT_BLANK = 'not_blank' 5 | } 6 | 7 | export default NotNullTextValidationStrategy; 8 | -------------------------------------------------------------------------------- /src/main/erdiagram/parser/types/error/ERDiagramDuplicatedPropertyNameError.ts: -------------------------------------------------------------------------------- 1 | import ERDiagramEntityPropertyError from '@/erdiagram/parser/types/error/ERDiagramEntityPropertyError'; 2 | 3 | export default class ERDiagramDuplicatedPropertyNameError extends ERDiagramEntityPropertyError { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/mysql/table_without_columns_nor_references.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `TestTable` ( 2 | `id` BIGINT NOT NULL AUTO_INCREMENT, 3 | CONSTRAINT `TestTable_pk` PRIMARY KEY (`id`) 4 | ); -------------------------------------------------------------------------------- /src/main/erdiagram/converter/common/case-format/exports.ts: -------------------------------------------------------------------------------- 1 | import CaseConverter from './CaseConverter'; 2 | import CaseFormat from './CaseFormat'; 3 | import StandardCaseFormats from './StandardCaseFormats'; 4 | 5 | export { 6 | CaseFormat, 7 | StandardCaseFormats, 8 | CaseConverter 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/erdiagram/parser/types/error/ERDiagramInvalidIdentityDefinitionError.ts: -------------------------------------------------------------------------------- 1 | import ERDiagramEntityPropertyError from '@/erdiagram/parser/types/error/ERDiagramEntityPropertyError'; 2 | 3 | export default class ERDiagramInvalidIdentityDefinitionError extends ERDiagramEntityPropertyError { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/sqlserver/table_without_columns_nor_references.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE "TestTable" ( 2 | "Id" BIGINT NOT NULL IDENTITY(1, 1), 3 | CONSTRAINT "TestTable_pk" PRIMARY KEY ("Id") 4 | ); -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/source-code-generator/sql/dialect/sqlserver/exports.ts: -------------------------------------------------------------------------------- 1 | import SqlServerDialect 2 | from '@/erdiagram/converter/database/source-code-generator/sql/dialect/sqlserver/SqlServerDialect'; 3 | 4 | export * from './config/exports'; 5 | 6 | export { 7 | SqlServerDialect 8 | }; 9 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/model/config/exports.ts: -------------------------------------------------------------------------------- 1 | import ClassModelConfig from './ClassModelConfig'; 2 | import classModelConfigManager, {ClassModelConfigManager} from './ClassModelConfigManager'; 3 | 4 | export { 5 | ClassModelConfig, 6 | ClassModelConfigManager, 7 | classModelConfigManager 8 | }; 9 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/type/JavaType.ts: -------------------------------------------------------------------------------- 1 | export default interface JavaType { 2 | 3 | readonly packageName?: string; 4 | readonly name: string; 5 | readonly canonicalName: string; 6 | 7 | formatSimple(): string; 8 | 9 | formatCanonical(): string; 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/source-code-generator/sql/dialect/exports.ts: -------------------------------------------------------------------------------- 1 | export * from './common/exports'; 2 | 3 | export * from './mysql/exports'; 4 | export * from './oracle/exports'; 5 | export * from './sqlite/exports'; 6 | export * from './sqlserver/exports'; 7 | export * from './postgresql/exports'; 8 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/source-code-generator/sql/dialect/postgresql/exports.ts: -------------------------------------------------------------------------------- 1 | import PostgresqlDialect 2 | from '@/erdiagram/converter/database/source-code-generator/sql/dialect/postgresql/PostgresqlDialect'; 3 | 4 | export * from './config/exports'; 5 | 6 | export { 7 | PostgresqlDialect 8 | }; 9 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/postgresql/table_without_columns_nor_references.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE "test_table" ( 2 | "id" BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY, 3 | CONSTRAINT "test_table_pk" PRIMARY KEY ("id") 4 | ); -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/source-code-generator/sql/exports.ts: -------------------------------------------------------------------------------- 1 | import DatabaseModelToSqlCodeConverter 2 | from '@/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter'; 3 | 4 | export * from './dialect/exports'; 5 | 6 | export { 7 | DatabaseModelToSqlCodeConverter 8 | }; 9 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/sqlite/table_without_columns_nor_references.sql: -------------------------------------------------------------------------------- 1 | PRAGMA foreign_keys = OFF; 2 | 3 | CREATE TABLE "test_table" ( 4 | "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT 5 | ); 6 | 7 | PRAGMA foreign_keys = ON; -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/jpa/config/exports.ts: -------------------------------------------------------------------------------- 1 | import JpaConfig, {PartialJpaConfig} from './JpaConfig'; 2 | import jpaConfigManager, {JpaConfigManager} from './JpaConfigManager'; 3 | 4 | export { 5 | JpaConfig, 6 | PartialJpaConfig, 7 | JpaConfigManager, 8 | jpaConfigManager 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/type/parameterized/JavaParameterizedType.ts: -------------------------------------------------------------------------------- 1 | import JavaType from '@/erdiagram/converter/oop/source-code-generator/java/type/JavaType'; 2 | 3 | export default interface JavaParameterizedType extends JavaType { 4 | readonly parameterTypes: ReadonlyArray; 5 | } 6 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/mysql/table_with_custom_id.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `TestTable` ( 2 | `theCustomIdentityOfTestTable` BIGINT NOT NULL AUTO_INCREMENT, 3 | CONSTRAINT `TestTable_pk` PRIMARY KEY (`theCustomIdentityOfTestTable`) 4 | ); -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/model/config/exports.ts: -------------------------------------------------------------------------------- 1 | import DatabaseModelConfig from './DatabaseModelConfig'; 2 | import databaseModelConfigManager, {DatabaseModelConfigManager} from './DatabaseModelConfigManager'; 3 | 4 | export { 5 | DatabaseModelConfig, 6 | DatabaseModelConfigManager, 7 | databaseModelConfigManager 8 | }; 9 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/model/config/ClassModelConfig.ts: -------------------------------------------------------------------------------- 1 | import IdNamingStrategy from '@/erdiagram/converter/common/id-naming-strategy/IdNamingStrategy'; 2 | 3 | export default interface ClassModelConfig { 4 | idNamingStrategy: IdNamingStrategy; 5 | } 6 | 7 | export type PartialClassModelConfig = Partial; 8 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/sqlserver/table_with_custom_id.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE "TestTable" ( 2 | "TheCustomIdentityOfTestTable" BIGINT NOT NULL IDENTITY(1, 1), 3 | CONSTRAINT "TestTable_pk" PRIMARY KEY ("TheCustomIdentityOfTestTable") 4 | ); -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/sqlite/table_with_custom_id.sql: -------------------------------------------------------------------------------- 1 | PRAGMA foreign_keys = OFF; 2 | 3 | CREATE TABLE "test_table" ( 4 | "the_custom_identity_of_test_table" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT 5 | ); 6 | 7 | PRAGMA foreign_keys = ON; -------------------------------------------------------------------------------- /src/main/erdiagram/converter/diagram/plantuml/config/exports.ts: -------------------------------------------------------------------------------- 1 | import plantUmlConfigManager, {PlantUmlConfigManager} from './PlantUmlConfigManager'; 2 | import PlantUmlConfig from '@/erdiagram/converter/diagram/plantuml/config/PlantUmlConfig'; 3 | 4 | export { 5 | PlantUmlConfig, 6 | PlantUmlConfigManager, 7 | plantUmlConfigManager 8 | }; 9 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/code/util/getAnnotationsLines.ts: -------------------------------------------------------------------------------- 1 | import JavaAnnotation from '@/erdiagram/converter/oop/source-code-generator/java/annotation/JavaAnnotation'; 2 | 3 | export default function getAnnotationsLines(annotations: JavaAnnotation[]) { 4 | return annotations.map(annotation => annotation.format()); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/typescript/type/parameterized/TypeScriptParameterizedType.ts: -------------------------------------------------------------------------------- 1 | import TypeScriptType from '@/erdiagram/converter/oop/source-code-generator/typescript/type/TypeScriptType'; 2 | 3 | export default interface TypeScriptParameterizedType extends TypeScriptType { 4 | parameterTypes: TypeScriptType[]; 5 | } 6 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/postgresql/table_with_custom_id.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE "test_table" ( 2 | "the_custom_identity_of_test_table" BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY, 3 | CONSTRAINT "test_table_pk" PRIMARY KEY ("the_custom_identity_of_test_table") 4 | ); -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/source-code-generator/sql/dialect/mysql/config/exports.ts: -------------------------------------------------------------------------------- 1 | import MysqlDialectConfig from './MysqlDialectConfig'; 2 | import mysqlDialectConfigManager, {MysqlDialectConfigManager} from './MysqlDialectConfigManager'; 3 | 4 | export { 5 | MysqlDialectConfig, 6 | MysqlDialectConfigManager, 7 | mysqlDialectConfigManager 8 | }; 9 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/lombok/config/exports.ts: -------------------------------------------------------------------------------- 1 | import LombokConfig, { PartialLombokConfig } from './LombokConfig'; 2 | import lombokConfigManager, { LombokConfigManager } from './LombokConfigManager'; 3 | 4 | export { 5 | LombokConfig, 6 | PartialLombokConfig, 7 | LombokConfigManager, 8 | lombokConfigManager 9 | }; 10 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/oracle/table_without_columns_nor_references.sql: -------------------------------------------------------------------------------- 1 | CREATE SEQUENCE "TEST_TABLE_SEQ" START WITH 1; 2 | CREATE TABLE "TEST_TABLE" ( 3 | "ID" NUMBER NOT NULL DEFAULT "TEST_TABLE_SEQ".nextval, 4 | CONSTRAINT "TEST_TABLE_PK" PRIMARY KEY ("ID") 5 | ); -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/source-code-generator/sql/dialect/oracle/config/exports.ts: -------------------------------------------------------------------------------- 1 | import OracleDialectConfig from './OracleDialectConfig'; 2 | import oracleDialectConfigManager, {OracleDialectConfigManager} from './OracleDialectConfigManager'; 3 | 4 | export { 5 | OracleDialectConfig, 6 | OracleDialectConfigManager, 7 | oracleDialectConfigManager 8 | }; 9 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/source-code-generator/sql/dialect/sqlite/config/exports.ts: -------------------------------------------------------------------------------- 1 | import SqliteDialectConfig from './SqliteDialectConfig'; 2 | import sqliteDialectConfigManager, {SqliteDialectConfigManager} from './SqliteDialectConfigManager'; 3 | 4 | export { 5 | SqliteDialectConfig, 6 | SqliteDialectConfigManager, 7 | sqliteDialectConfigManager 8 | }; 9 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/diagram/plantuml/config/PlantUmlConfig.ts: -------------------------------------------------------------------------------- 1 | import DiagramSourceCodeGeneratorConfig 2 | from '@/erdiagram/converter/diagram/common/config/DiagramSourceCodeGeneratorConfig'; 3 | 4 | export default interface PlantUmlConfig extends DiagramSourceCodeGeneratorConfig { 5 | 6 | } 7 | 8 | export type PartialPlantUmlConfig = Partial; 9 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/model/config/DatabaseModelConfig.ts: -------------------------------------------------------------------------------- 1 | import IdNamingStrategy from '@/erdiagram/converter/common/id-naming-strategy/IdNamingStrategy'; 2 | 3 | export default interface DatabaseModelConfig { 4 | usePluralTableNames: boolean; 5 | idNamingStrategy: IdNamingStrategy; 6 | } 7 | 8 | export type PartialDatabaseModelConfig = Partial; 9 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/source-code-generator/sql/dialect/common/column/SqlIdColumnCodeGenerator.ts: -------------------------------------------------------------------------------- 1 | import {IdColumnCode} from '@/erdiagram/converter/database/source-code-generator/sql/dialect/common/sql-script-types'; 2 | 3 | export default interface SqlIdColumnCodeGenerator { 4 | generateIdColumnCode(outputTableName: string, identityColumnName: string): IdColumnCode; 5 | } 6 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/source-code-generator/sql/dialect/sqlserver/config/exports.ts: -------------------------------------------------------------------------------- 1 | import SqlServerDialectConfig from './SqlServerDialectConfig'; 2 | import sqlServerDialectConfigManager, {SqlServerDialectConfigManager} from './SqlServerDialectConfigManager'; 3 | 4 | export { 5 | SqlServerDialectConfig, 6 | SqlServerDialectConfigManager, 7 | sqlServerDialectConfigManager 8 | }; 9 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/typescript/config/exports.ts: -------------------------------------------------------------------------------- 1 | import TypeScriptConfig, {PartialTypeScriptConfig} from './TypeScriptConfig'; 2 | import typescriptConfigManager, {TypeScriptConfigManager} from './TypeScriptConfigManager'; 3 | 4 | export { 5 | TypeScriptConfig, 6 | PartialTypeScriptConfig, 7 | TypeScriptConfigManager, 8 | typescriptConfigManager 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/erdiagram/util/string-utils.ts: -------------------------------------------------------------------------------- 1 | export function capitalizeWord(text: string) { 2 | return text[0].toUpperCase() + text.substring(1); 3 | } 4 | 5 | export function uncapitalizeWord(text: string) { 6 | return text[0].toLowerCase() + text.substring(1); 7 | } 8 | 9 | export function removeNonEmptyStrings(strings: string[]) { 10 | return strings.filter(chunk => chunk.length > 0); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/source-code-generator/exports.ts: -------------------------------------------------------------------------------- 1 | import SqlSourceCodeGenerator from './SqlSourceCodeGenerator'; 2 | import SqlSourceCodeGeneratorBuilder 3 | from '@/erdiagram/converter/database/source-code-generator/SqlSourceCodeGeneratorBuilder'; 4 | 5 | export * from './sql/exports'; 6 | 7 | export { 8 | SqlSourceCodeGenerator, 9 | SqlSourceCodeGeneratorBuilder 10 | }; 11 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/source-code-generator/sql/dialect/postgresql/config/exports.ts: -------------------------------------------------------------------------------- 1 | import PostgresqlDialectConfig from './PostgresqlDialectConfig'; 2 | import postgresqlDialectConfigManager, {PostgresqlDialectConfigManager} from './PostgresqlDialectConfigManager'; 3 | 4 | export { 5 | PostgresqlDialectConfig, 6 | PostgresqlDialectConfigManager, 7 | postgresqlDialectConfigManager 8 | }; 9 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/oracle/table_with_custom_id.sql: -------------------------------------------------------------------------------- 1 | CREATE SEQUENCE "TEST_TABLE_SEQ" START WITH 1; 2 | CREATE TABLE "TEST_TABLE" ( 3 | "THE_CUSTOM_IDENTITY_OF_TEST_TABLE" NUMBER NOT NULL DEFAULT "TEST_TABLE_SEQ".nextval, 4 | CONSTRAINT "TEST_TABLE_PK" PRIMARY KEY ("THE_CUSTOM_IDENTITY_OF_TEST_TABLE") 5 | ); -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/lombok/config/LombokConfig.ts: -------------------------------------------------------------------------------- 1 | export default interface LombokConfig { 2 | builderAnnotation: boolean; 3 | dataAnnotation: boolean; 4 | getterAnnotation: boolean; 5 | setterAnnotation: boolean; 6 | toStringAnnotation: boolean; 7 | equalsAndHashCodeAnnotation: boolean; 8 | } 9 | 10 | export type PartialLombokConfig = Partial; 11 | -------------------------------------------------------------------------------- /src/main/erdiagram/util/map-utils.ts: -------------------------------------------------------------------------------- 1 | export function classifyBy(objects: T[], keyMapper: (object: T) => K, valueMapper: (object: T) => V): Map { 2 | 3 | const map = new Map(); 4 | 5 | objects.forEach(object => { 6 | 7 | const key = keyMapper(object); 8 | const value = valueMapper(object); 9 | 10 | map.set(key, value); 11 | 12 | }); 13 | 14 | return map; 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/code/util/prependVisibility.ts: -------------------------------------------------------------------------------- 1 | import { JavaVisibility } from '@/erdiagram/converter/oop/source-code-generator/java/model/java-class-model-types'; 2 | 3 | export default function prependVisibility(text: string, visibility: JavaVisibility): string { 4 | if (visibility === JavaVisibility.PACKAGE_PRIVATE) { 5 | return text; 6 | } 7 | return visibility + ' ' + text; 8 | } 9 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/mysql/table_with_columns_with_modifiers.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `TestTable` ( 2 | `id` BIGINT NOT NULL AUTO_INCREMENT, 3 | `nullableColumn` INT, 4 | `uniqueColumn` INT NOT NULL, 5 | CONSTRAINT `TestTable_pk` PRIMARY KEY (`id`), 6 | CONSTRAINT `TestTable_uniqueColumn_unique` UNIQUE (`uniqueColumn`) 7 | ); -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/sqlserver/table_with_columns_with_modifiers.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE "TestTable" ( 2 | "Id" BIGINT NOT NULL IDENTITY(1, 1), 3 | "NullableColumn" INT, 4 | "UniqueColumn" INT NOT NULL, 5 | CONSTRAINT "TestTable_pk" PRIMARY KEY ("Id"), 6 | CONSTRAINT "TestTable_UniqueColumn_unique" UNIQUE ("UniqueColumn") 7 | ); -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/validation/config/exports.ts: -------------------------------------------------------------------------------- 1 | import BeanValidationConfig, {PartialBeanValidationConfig} from './BeanValidationConfig'; 2 | import beanValidationConfigManager, {BeanValidationConfigManager} from './BeanValidationConfigManager'; 3 | 4 | export { 5 | BeanValidationConfig, 6 | PartialBeanValidationConfig, 7 | BeanValidationConfigManager, 8 | beanValidationConfigManager 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/erdiagram/parser/config/exports.ts: -------------------------------------------------------------------------------- 1 | import EntityRelationshipModelParserConfig from './EntityRelationshipModelParserConfig'; 2 | import entityRelationshipModelParserConfigManager, {EntityRelationshipModelParserConfigManager} from './EntityRelationshipModelParserConfigManager'; 3 | 4 | export { 5 | EntityRelationshipModelParserConfig, 6 | EntityRelationshipModelParserConfigManager, 7 | entityRelationshipModelParserConfigManager 8 | }; 9 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/model/generator/config/exports.ts: -------------------------------------------------------------------------------- 1 | import JavaClassModelConfig, {PartialJavaClassModelConfig} from './JavaClassModelConfig'; 2 | import javaClassModelConfigManager, {JavaClassModelConfigManager} from './JavaClassModelConfigManager'; 3 | 4 | export { 5 | JavaClassModelConfig, 6 | PartialJavaClassModelConfig, 7 | JavaClassModelConfigManager, 8 | javaClassModelConfigManager 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/erdiagram/common/config/ConfigManager.ts: -------------------------------------------------------------------------------- 1 | import {JsonValue} from 'true-json'; 2 | 3 | export default interface ConfigManager { 4 | 5 | getDefaultConfig(): C; 6 | 7 | mergeConfigs(fullConfig: C, partialConfig: P): C; 8 | 9 | mergeWithDefaultConfig(partialConfig: P): C; 10 | 11 | convertToSerializableObject(fullConfig: C): JsonValue; 12 | 13 | convertFromSerializableObject(serializableConfig: JsonValue): C; 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/diagram/nomnoml/entity/NomnomlEntityIdentityPropertyCodeGenerator.ts: -------------------------------------------------------------------------------- 1 | import {EntityPropertyType} from '@/erdiagram/parser/types/entity-relationship-model-types'; 2 | 3 | export default class NomnomlEntityIdentityPropertyCodeGenerator { 4 | 5 | public generateEntityIdentityPropertyCode(identityPropertyName: string): string { 6 | return `${identityPropertyName}: ${EntityPropertyType.IDENTITY}`; 7 | } 8 | 9 | } 10 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/diagram/plantuml/entity/PlantUmlEntityIdentityPropertyCodeGenerator.ts: -------------------------------------------------------------------------------- 1 | import {EntityPropertyType} from '@/erdiagram/parser/types/entity-relationship-model-types'; 2 | 3 | export default class PlantUmlEntityIdentityPropertyCodeGenerator { 4 | 5 | public generateEntityIdentityPropertyCode(identityPropertyName: string): string { 6 | return `{field} ${identityPropertyName}: ${EntityPropertyType.IDENTITY}`; 7 | } 8 | 9 | } 10 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/mysql/table_referencing_itself.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `TestTable` ( 2 | `id` BIGINT NOT NULL AUTO_INCREMENT, 3 | `selfReferenceId` BIGINT NOT NULL, 4 | CONSTRAINT `TestTable_pk` PRIMARY KEY (`id`) 5 | ); 6 | 7 | ALTER TABLE `TestTable` ADD CONSTRAINT `TestTable_selfReferenceId_fk` FOREIGN KEY (`selfReferenceId`) REFERENCES `TestTable` (`id`); -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/source-code-generator/sql/dialect/common/config/SqlDialectConfig.ts: -------------------------------------------------------------------------------- 1 | import CaseFormat from '@/erdiagram/converter/common/case-format/CaseFormat'; 2 | import {EntityPropertyType} from '@/erdiagram/parser/types/entity-relationship-model-types'; 3 | 4 | export default interface SqlDialectConfig { 5 | typeBindings: Record; 6 | tableNameCaseFormat: CaseFormat; 7 | columnNameCaseFormat: CaseFormat; 8 | } 9 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/diagram/nomnoml/config/exports.ts: -------------------------------------------------------------------------------- 1 | import nomnomlConfigManager, {NomnomlConfigManager} from './NomnomlConfigManager'; 2 | import NomnomlConfig from '@/erdiagram/converter/diagram/nomnoml/config/NomnomlConfig'; 3 | import NomnomlStyleConfig from '@/erdiagram/converter/diagram/nomnoml/config/NomnomlStyleConfig'; 4 | 5 | export { 6 | NomnomlConfig, 7 | NomnomlStyleConfig, 8 | NomnomlConfigManager, 9 | nomnomlConfigManager 10 | }; 11 | -------------------------------------------------------------------------------- /src/main/erdiagram/parser/types/error/ERDiagramParseLineError.ts: -------------------------------------------------------------------------------- 1 | import ERDiagramError from '@/erdiagram/parser/types/error/ERDiagramError'; 2 | 3 | export default class ERDiagramParseLineError extends ERDiagramError { 4 | 5 | constructor( 6 | public readonly cause: ERDiagramError, 7 | public readonly lineIndex: number 8 | ) { 9 | super(cause.message); 10 | } 11 | 12 | get lineNumber() { 13 | return this.lineIndex + 1; 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/postgresql/table_with_columns_with_modifiers.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE "test_table" ( 2 | "id" BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY, 3 | "nullable_column" INTEGER, 4 | "unique_column" INTEGER NOT NULL, 5 | CONSTRAINT "test_table_pk" PRIMARY KEY ("id"), 6 | CONSTRAINT "test_table_unique_column_unique" UNIQUE ("unique_column") 7 | ); -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/sqlserver/table_referencing_itself.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE "TestTable" ( 2 | "Id" BIGINT NOT NULL IDENTITY(1, 1), 3 | "SelfReferenceId" BIGINT NOT NULL, 4 | CONSTRAINT "TestTable_pk" PRIMARY KEY ("Id") 5 | ); 6 | 7 | ALTER TABLE "TestTable" ADD CONSTRAINT "TestTable_SelfReferenceId_fk" FOREIGN KEY ("SelfReferenceId") REFERENCES "TestTable" ("Id"); -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/sqlite/table_referencing_itself.sql: -------------------------------------------------------------------------------- 1 | PRAGMA foreign_keys = OFF; 2 | 3 | CREATE TABLE "test_table" ( 4 | "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 5 | "self_reference_id" INTEGER NOT NULL, 6 | CONSTRAINT "test_table_self_reference_id_fk" FOREIGN KEY ("self_reference_id") REFERENCES "test_table" ("id") 7 | ); 8 | 9 | PRAGMA foreign_keys = ON; -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/annotation/exports.ts: -------------------------------------------------------------------------------- 1 | import JavaAnnotation from '@/erdiagram/converter/oop/source-code-generator/java/annotation/JavaAnnotation'; 2 | import RawAnnotationParameterValue 3 | from '@/erdiagram/converter/oop/source-code-generator/java/annotation/utils/RawAnnotationParameterValue'; 4 | 5 | export * from './annotation-parameter-types'; 6 | 7 | export { 8 | JavaAnnotation, 9 | RawAnnotationParameterValue 10 | }; 11 | -------------------------------------------------------------------------------- /src/main/erdiagram/parser/types/error/ERDiagramEntityError.ts: -------------------------------------------------------------------------------- 1 | import ERDiagramError from '@/erdiagram/parser/types/error/ERDiagramError'; 2 | import {ParsedEntityDescriptor} from '@/erdiagram/parser/types/parsed-entity-relationship-model-types'; 3 | 4 | export default class ERDiagramEntityError extends ERDiagramError { 5 | 6 | constructor( 7 | message: string, 8 | public readonly entity: ParsedEntityDescriptor 9 | ) { 10 | super(message); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/sqlite/table_with_columns_with_modifiers.sql: -------------------------------------------------------------------------------- 1 | PRAGMA foreign_keys = OFF; 2 | 3 | CREATE TABLE "test_table" ( 4 | "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 5 | "nullable_column" INTEGER, 6 | "unique_column" INTEGER NOT NULL, 7 | CONSTRAINT "test_table_unique_column_unique" UNIQUE ("unique_column") 8 | ); 9 | 10 | PRAGMA foreign_keys = ON; -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/postgresql/table_referencing_itself.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE "test_table" ( 2 | "id" BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY, 3 | "self_reference_id" BIGINT NOT NULL, 4 | CONSTRAINT "test_table_pk" PRIMARY KEY ("id") 5 | ); 6 | 7 | ALTER TABLE "test_table" ADD CONSTRAINT "test_table_self_reference_id_fk" FOREIGN KEY ("self_reference_id") REFERENCES "test_table" ("id"); -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/source-code-generator/sql/dialect/mysql/config/MysqlDialectConfig.ts: -------------------------------------------------------------------------------- 1 | import SqlDialectConfig 2 | from '@/erdiagram/converter/database/source-code-generator/sql/dialect/common/config/SqlDialectConfig'; 3 | import {WithPartial} from '@/erdiagram/util/types'; 4 | 5 | export default interface MysqlDialectConfig extends SqlDialectConfig { 6 | 7 | } 8 | 9 | export type PartialMysqlDialectConfig = Partial>; 10 | -------------------------------------------------------------------------------- /src/main/erdiagram/parser/types/ParseState.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ParsedEntityDescriptor, 3 | ParsedRelationshipDescriptor, 4 | ParsedStatementResult 5 | } from '@/erdiagram/parser/types/parsed-entity-relationship-model-types'; 6 | 7 | export default interface ParseState { 8 | entities: ParsedEntityDescriptor[]; 9 | relationships: ParsedRelationshipDescriptor[]; 10 | entityBeingParsed: ParsedEntityDescriptor | null; 11 | statementResultToLineMap: Map; 12 | } 13 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/source-code-generator/sql/dialect/oracle/config/OracleDialectConfig.ts: -------------------------------------------------------------------------------- 1 | import SqlDialectConfig 2 | from '@/erdiagram/converter/database/source-code-generator/sql/dialect/common/config/SqlDialectConfig'; 3 | import {WithPartial} from '@/erdiagram/util/types'; 4 | 5 | export default interface OracleDialectConfig extends SqlDialectConfig { 6 | 7 | } 8 | 9 | export type PartialOracleDialectConfig = Partial>; 10 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/source-code-generator/sql/dialect/sqlite/config/SqliteDialectConfig.ts: -------------------------------------------------------------------------------- 1 | import SqlDialectConfig 2 | from '@/erdiagram/converter/database/source-code-generator/sql/dialect/common/config/SqlDialectConfig'; 3 | import {WithPartial} from '@/erdiagram/util/types'; 4 | 5 | export default interface SqliteDialectConfig extends SqlDialectConfig { 6 | 7 | } 8 | 9 | export type PartialSqliteDialectConfig = Partial>; 10 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/diagram/nomnoml/config/NomnomlConfig.ts: -------------------------------------------------------------------------------- 1 | import NomnomlStyleConfig from '@/erdiagram/converter/diagram/nomnoml/config/NomnomlStyleConfig'; 2 | import DiagramSourceCodeGeneratorConfig 3 | from '@/erdiagram/converter/diagram/common/config/DiagramSourceCodeGeneratorConfig'; 4 | 5 | export default interface NomnomlConfig extends DiagramSourceCodeGeneratorConfig { 6 | style: NomnomlStyleConfig; 7 | } 8 | 9 | export type PartialNomnomlConfig = Partial; 10 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/common/case-format/AbstractUnderscoreCaseFormat.ts: -------------------------------------------------------------------------------- 1 | import CaseFormat from '@/erdiagram/converter/common/case-format/CaseFormat'; 2 | import {removeNonEmptyStrings} from '@/erdiagram/util/string-utils'; 3 | 4 | export default abstract class AbstractUnderscoreCaseFormat implements CaseFormat { 5 | 6 | abstract joinWords(words: string[]): string; 7 | 8 | public splitWords(text: string): string[] { 9 | return removeNonEmptyStrings(text.split('_')); 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/main/erdiagram/parser/types/error/ERDiagramRelationshipError.ts: -------------------------------------------------------------------------------- 1 | import ERDiagramError from '@/erdiagram/parser/types/error/ERDiagramError'; 2 | import {ParsedRelationshipDescriptor} from '@/erdiagram/parser/types/parsed-entity-relationship-model-types'; 3 | 4 | export default class ERDiagramRelationshipError extends ERDiagramError { 5 | 6 | constructor( 7 | message: string, 8 | public readonly relationship: ParsedRelationshipDescriptor 9 | ) { 10 | super(message); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/oracle/table_with_columns_with_modifiers.sql: -------------------------------------------------------------------------------- 1 | CREATE SEQUENCE "TEST_TABLE_SEQ" START WITH 1; 2 | CREATE TABLE "TEST_TABLE" ( 3 | "ID" NUMBER NOT NULL DEFAULT "TEST_TABLE_SEQ".nextval, 4 | "NULLABLE_COLUMN" NUMBER, 5 | "UNIQUE_COLUMN" NUMBER NOT NULL, 6 | CONSTRAINT "TEST_TABLE_PK" PRIMARY KEY ("ID"), 7 | CONSTRAINT "TEST_TABLE_UNIQUE_COLUMN_UNIQUE" UNIQUE ("UNIQUE_COLUMN") 8 | ); -------------------------------------------------------------------------------- /src/test/erdiagram/converter/oop/source-code-generator/java/annotation/java-annotation-mothers.ts: -------------------------------------------------------------------------------- 1 | import JavaAnnotation, {JavaAnnotationParametersRecord} from '@/erdiagram/converter/oop/source-code-generator/java/annotation/JavaAnnotation'; 2 | import parseJavaType from '@/erdiagram/converter/oop/source-code-generator/java/type/parseJavaType'; 3 | 4 | export function createJavaAnnotation(type: string, parameters?: JavaAnnotationParametersRecord) { 5 | return new JavaAnnotation(parseJavaType(type), parameters); 6 | } -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/source-code-generator/sql/dialect/sqlserver/config/SqlServerDialectConfig.ts: -------------------------------------------------------------------------------- 1 | import SqlDialectConfig 2 | from '@/erdiagram/converter/database/source-code-generator/sql/dialect/common/config/SqlDialectConfig'; 3 | import {WithPartial} from '@/erdiagram/util/types'; 4 | 5 | export default interface SqlServerDialectConfig extends SqlDialectConfig { 6 | 7 | } 8 | 9 | export type PartialSqlServerDialectConfig = Partial>; 10 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/model/generator/exports.ts: -------------------------------------------------------------------------------- 1 | import JavaClassModelGenerationResult 2 | from '@/erdiagram/converter/oop/source-code-generator/java/model/generator/JavaClassModelGenerationResult'; 3 | import JavaClassModelGenerator 4 | from '@/erdiagram/converter/oop/source-code-generator/java/model/generator/JavaClassModelGenerator'; 5 | 6 | export * from './config/exports'; 7 | 8 | export { 9 | JavaClassModelGenerationResult, 10 | JavaClassModelGenerator 11 | }; 12 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/source-code-generator/sql/dialect/postgresql/config/PostgresqlDialectConfig.ts: -------------------------------------------------------------------------------- 1 | import SqlDialectConfig 2 | from '@/erdiagram/converter/database/source-code-generator/sql/dialect/common/config/SqlDialectConfig'; 3 | import {WithPartial} from '@/erdiagram/util/types'; 4 | 5 | export default interface PostgresqlDialectConfig extends SqlDialectConfig { 6 | 7 | } 8 | 9 | export type PartialPostgresqlDialectConfig = Partial>; 10 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/diagram/nomnoml/directive/NomnomlDirectivesCodeGenerator.ts: -------------------------------------------------------------------------------- 1 | import NomnomlStyleConfig from '@/erdiagram/converter/diagram/nomnoml/config/NomnomlStyleConfig'; 2 | 3 | export default class NomnomlDirectivesCodeGenerator { 4 | 5 | public generateDirectivesCode(styleConfig: NomnomlStyleConfig): string { 6 | return Object.entries(styleConfig) 7 | .filter(([, value]) => value != null && value !== '') 8 | .map(([key, value]) => `#${key}: ${value}`) 9 | .join('\n'); 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/exports.ts: -------------------------------------------------------------------------------- 1 | import SourceCodeGenerator from './SourceCodeGenerator'; 2 | import MultipleFileSourceCodeGenerator, {isMultipleFileSourceCodeGenerator} from '@/erdiagram/converter/MultipleFileSourceCodeGenerator'; 3 | 4 | export * from './common/exports'; 5 | export * from './database/exports'; 6 | export * from './oop/exports'; 7 | export * from './diagram/exports'; 8 | 9 | export { 10 | SourceCodeGenerator, 11 | MultipleFileSourceCodeGenerator, 12 | isMultipleFileSourceCodeGenerator 13 | }; 14 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/type/parameterized/isJavaParameterizedType.ts: -------------------------------------------------------------------------------- 1 | import JavaType from '@/erdiagram/converter/oop/source-code-generator/java/type/JavaType'; 2 | import JavaParameterizedType 3 | from '@/erdiagram/converter/oop/source-code-generator/java/type/parameterized/JavaParameterizedType'; 4 | 5 | export default function isJavaParameterizedType(javaType: JavaType): javaType is JavaParameterizedType { 6 | return Array.isArray((javaType as JavaParameterizedType).parameterTypes); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/common/case-format/LowerUnderscoreCaseFormat.ts: -------------------------------------------------------------------------------- 1 | import AbstractUnderscoreCaseFormat from '@/erdiagram/converter/common/case-format/AbstractUnderscoreCaseFormat'; 2 | import {removeNonEmptyStrings} from '@/erdiagram/util/string-utils'; 3 | 4 | export default class LowerUnderscoreCaseFormat extends AbstractUnderscoreCaseFormat { 5 | 6 | public joinWords(words: string[]): string { 7 | return removeNonEmptyStrings(words) 8 | .map(word => word.toLowerCase()) 9 | .join('_'); 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/common/case-format/UpperUnderscoreCaseFormat.ts: -------------------------------------------------------------------------------- 1 | import AbstractUnderscoreCaseFormat from '@/erdiagram/converter/common/case-format/AbstractUnderscoreCaseFormat'; 2 | import {removeNonEmptyStrings} from '@/erdiagram/util/string-utils'; 3 | 4 | export default class UpperUnderscoreCaseFormat extends AbstractUnderscoreCaseFormat { 5 | 6 | public joinWords(words: string[]): string { 7 | return removeNonEmptyStrings(words) 8 | .map(word => word.toUpperCase()) 9 | .join('_'); 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/oracle/table_referencing_itself.sql: -------------------------------------------------------------------------------- 1 | CREATE SEQUENCE "TEST_TABLE_SEQ" START WITH 1; 2 | CREATE TABLE "TEST_TABLE" ( 3 | "ID" NUMBER NOT NULL DEFAULT "TEST_TABLE_SEQ".nextval, 4 | "SELF_REFERENCE_ID" NUMBER NOT NULL, 5 | CONSTRAINT "TEST_TABLE_PK" PRIMARY KEY ("ID") 6 | ); 7 | 8 | ALTER TABLE "TEST_TABLE" ADD CONSTRAINT "TEST_TABLE_SELF_REFERENCE_ID_FK" FOREIGN KEY ("SELF_REFERENCE_ID") REFERENCES "TEST_TABLE" ("ID"); -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/exports.ts: -------------------------------------------------------------------------------- 1 | import JavaSourceCodeGenerator from './JavaSourceCodeGenerator'; 2 | import JavaSourceCodeGeneratorBuilder from './JavaSourceCodeGeneratorBuilder'; 3 | 4 | export * from './annotation/exports'; 5 | export * from './model/exports'; 6 | export * from './jpa/exports'; 7 | export * from './lombok/exports'; 8 | export * from './validation/exports'; 9 | export * from './type/exports'; 10 | 11 | export { 12 | JavaSourceCodeGenerator, 13 | JavaSourceCodeGeneratorBuilder 14 | }; 15 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/common/case-format/UpperCamelCaseFormat.ts: -------------------------------------------------------------------------------- 1 | import AbstractCamelCaseFormat from '@/erdiagram/converter/common/case-format/AbstractCamelCaseFormat'; 2 | import {capitalizeWord, removeNonEmptyStrings} from '@/erdiagram/util/string-utils'; 3 | 4 | export default class UpperCamelCaseFormat extends AbstractCamelCaseFormat { 5 | 6 | public joinWords(words: string[]): string { 7 | return removeNonEmptyStrings(words) 8 | .map(word => word.toLowerCase()) 9 | .map(capitalizeWord) 10 | .join(''); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/diagram/nomnoml/relationship/NomnomlRelationshipCardinalityCodeGenerator.ts: -------------------------------------------------------------------------------- 1 | import {Cardinality} from '@/erdiagram/parser/types/entity-relationship-model-types'; 2 | 3 | export default class NomnomlRelationshipCardinalityCodeGenerator { 4 | 5 | public generateCardinalityCode(cardinality: Cardinality): string { 6 | switch (cardinality) { 7 | case Cardinality.ZERO_OR_ONE: 8 | return '0..1'; 9 | case Cardinality.ONE: 10 | return '1'; 11 | case Cardinality.MANY: 12 | return '*'; 13 | } 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/diagram/plantuml/relationship/PlantUmlRelationshipCardinalityCodeGenerator.ts: -------------------------------------------------------------------------------- 1 | import {Cardinality} from '@/erdiagram/parser/types/entity-relationship-model-types'; 2 | 3 | export default class PlantUmlRelationshipCardinalityCodeGenerator { 4 | 5 | public generateCardinalityCode(cardinality: Cardinality): string { 6 | switch (cardinality) { 7 | case Cardinality.ZERO_OR_ONE: 8 | return '0..1'; 9 | case Cardinality.ONE: 10 | return '1'; 11 | case Cardinality.MANY: 12 | return '*'; 13 | } 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/erdiagram/util/regex-utils.ts: -------------------------------------------------------------------------------- 1 | export function escapeRegExpSpecialChars(text: string): string { 2 | return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string 3 | } 4 | 5 | export function joinRegExps(...regexes: (RegExp | string)[]): RegExp { 6 | 7 | const source = regexes 8 | .map((e): string => { 9 | if (typeof e === 'string') { 10 | return escapeRegExpSpecialChars(e); 11 | } else { 12 | return e.source; 13 | } 14 | }) 15 | .join(''); 16 | 17 | return new RegExp(source); 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/diagram/plantuml/relationship/PlantUmlRelationshipDirectionCodeGenerator.ts: -------------------------------------------------------------------------------- 1 | import {Direction} from '@/erdiagram/parser/types/entity-relationship-model-types'; 2 | 3 | export default class PlantUmlRelationshipDirectionCodeGenerator { 4 | 5 | public generateDirectionCode(direction: Direction): string { 6 | switch (direction) { 7 | case Direction.LEFT_TO_RIGHT: 8 | return '-->'; 9 | case Direction.RIGHT_TO_LEFT: 10 | return '<--'; 11 | case Direction.BIDIRECTIONAL: 12 | return '<-->'; 13 | } 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/model/generator/JavaClassModelGenerationResult.ts: -------------------------------------------------------------------------------- 1 | import {JavaClassModel} from '@/erdiagram/converter/oop/source-code-generator/java/model/java-class-model-types'; 2 | import JavaClassModelDescriptorsRepository 3 | from '@/erdiagram/converter/oop/source-code-generator/java/model/generator/source/JavaClassModelDescriptorsRepository'; 4 | 5 | export default interface JavaClassModelGenerationResult { 6 | javaClassModel: JavaClassModel; 7 | javaClassModelDescriptorsRepository: JavaClassModelDescriptorsRepository; 8 | } 9 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/typescript/config/TypeScriptConfig.ts: -------------------------------------------------------------------------------- 1 | import TypeScriptType from '@/erdiagram/converter/oop/source-code-generator/typescript/type/TypeScriptType'; 2 | import {WithPartial} from '@/erdiagram/util/types'; 3 | import {EntityPropertyType} from '@/erdiagram/parser/types/entity-relationship-model-types'; 4 | 5 | export default interface TypeScriptConfig { 6 | typeBindings: Record; 7 | } 8 | 9 | export type PartialTypeScriptConfig = Partial>; 10 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/sqlite/table_with_nullable_reference_to_another_table.sql: -------------------------------------------------------------------------------- 1 | PRAGMA foreign_keys = OFF; 2 | 3 | CREATE TABLE "test_table_1" ( 4 | "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 5 | "table_2_id" INTEGER, 6 | CONSTRAINT "test_table_1_table_2_id_fk" FOREIGN KEY ("table_2_id") REFERENCES "test_table_2" ("id") 7 | ); 8 | 9 | CREATE TABLE "test_table_2" ( 10 | "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT 11 | ); 12 | 13 | PRAGMA foreign_keys = ON; -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/sqlite/table_with_reference_to_another_table.sql: -------------------------------------------------------------------------------- 1 | PRAGMA foreign_keys = OFF; 2 | 3 | CREATE TABLE "test_table_1" ( 4 | "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 5 | "table_2_id" INTEGER NOT NULL, 6 | CONSTRAINT "test_table_1_table_2_id_fk" FOREIGN KEY ("table_2_id") REFERENCES "test_table_2" ("id") 7 | ); 8 | 9 | CREATE TABLE "test_table_2" ( 10 | "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT 11 | ); 12 | 13 | PRAGMA foreign_keys = ON; -------------------------------------------------------------------------------- /src/main/erdiagram/converter/common/case-format/CapitalizedUnderscoreCaseFormat.ts: -------------------------------------------------------------------------------- 1 | import AbstractUnderscoreCaseFormat from '@/erdiagram/converter/common/case-format/AbstractUnderscoreCaseFormat'; 2 | import {capitalizeWord, removeNonEmptyStrings} from '@/erdiagram/util/string-utils'; 3 | 4 | export default class CapitalizedUnderscoreCaseFormat extends AbstractUnderscoreCaseFormat { 5 | 6 | public joinWords(words: string[]): string { 7 | return removeNonEmptyStrings(words) 8 | .map(word => word.toLowerCase()) 9 | .map(capitalizeWord) 10 | .join('_'); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/typescript/type/parameterized/isTypeScriptParameterizedType.ts: -------------------------------------------------------------------------------- 1 | import TypeScriptType from '@/erdiagram/converter/oop/source-code-generator/typescript/type/TypeScriptType'; 2 | import TypeScriptParameterizedType 3 | from '@/erdiagram/converter/oop/source-code-generator/typescript/type/parameterized/TypeScriptParameterizedType'; 4 | 5 | export default function isTypeScriptParameterizedType(javaType: TypeScriptType): javaType is TypeScriptParameterizedType { 6 | return Array.isArray((javaType as TypeScriptParameterizedType).parameterTypes); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/source-code-generator/sql/dialect/common/column/SqlColumnCodeGenerator.ts: -------------------------------------------------------------------------------- 1 | import {TableColumnDescriptor} from '@/erdiagram/converter/database/model/database-model-types'; 2 | import {RegularColumnCode} from '@/erdiagram/converter/database/source-code-generator/sql/dialect/common/sql-script-types'; 3 | import {OmitSource} from '@/erdiagram/converter/oop/model/source-metadata/source-metadata-types'; 4 | 5 | export default interface SqlColumnCodeGenerator { 6 | generateColumnCode(outputTableName: string, column: OmitSource): RegularColumnCode; 7 | } 8 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/diagram/plantuml/entity/PlantUmlDirectivesCodeGenerator.ts: -------------------------------------------------------------------------------- 1 | import DiagramLevel from '@/erdiagram/converter/diagram/common/config/DiagramLevel'; 2 | 3 | export default class PlantUmlDirectivesCodeGenerator { 4 | 5 | private readonly diagramLevel: DiagramLevel; 6 | 7 | constructor(diagramLevel: DiagramLevel) { 8 | this.diagramLevel = diagramLevel; 9 | } 10 | 11 | public generate(): string { 12 | 13 | if (this.diagramLevel !== DiagramLevel.CONCEPTUAL) { 14 | return ''; 15 | } 16 | 17 | return `hide members 18 | hide methods`; 19 | 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/mysql/table_with_nullable_reference_to_another_table.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `TestTable1` ( 2 | `id` BIGINT NOT NULL AUTO_INCREMENT, 3 | `table2Id` BIGINT, 4 | CONSTRAINT `TestTable1_pk` PRIMARY KEY (`id`) 5 | ); 6 | 7 | CREATE TABLE `TestTable2` ( 8 | `id` BIGINT NOT NULL AUTO_INCREMENT, 9 | CONSTRAINT `TestTable2_pk` PRIMARY KEY (`id`) 10 | ); 11 | 12 | ALTER TABLE `TestTable1` ADD CONSTRAINT `TestTable1_table2Id_fk` FOREIGN KEY (`table2Id`) REFERENCES `TestTable2` (`id`); -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/mysql/table_with_reference_to_another_table.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `TestTable1` ( 2 | `id` BIGINT NOT NULL AUTO_INCREMENT, 3 | `table2Id` BIGINT NOT NULL, 4 | CONSTRAINT `TestTable1_pk` PRIMARY KEY (`id`) 5 | ); 6 | 7 | CREATE TABLE `TestTable2` ( 8 | `id` BIGINT NOT NULL AUTO_INCREMENT, 9 | CONSTRAINT `TestTable2_pk` PRIMARY KEY (`id`) 10 | ); 11 | 12 | ALTER TABLE `TestTable1` ADD CONSTRAINT `TestTable1_table2Id_fk` FOREIGN KEY (`table2Id`) REFERENCES `TestTable2` (`id`); -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/sqlite/table_with_reference_to_another_table_with_a_custom_id.sql: -------------------------------------------------------------------------------- 1 | PRAGMA foreign_keys = OFF; 2 | 3 | CREATE TABLE "test_table_1" ( 4 | "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 5 | "table_2_id" INTEGER NOT NULL, 6 | CONSTRAINT "test_table_1_table_2_id_fk" FOREIGN KEY ("table_2_id") REFERENCES "test_table_2" ("custom_id") 7 | ); 8 | 9 | CREATE TABLE "test_table_2" ( 10 | "custom_id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT 11 | ); 12 | 13 | PRAGMA foreign_keys = ON; -------------------------------------------------------------------------------- /src/main/erdiagram/parser/types/error/ERDiagramEntityPropertyError.ts: -------------------------------------------------------------------------------- 1 | import ERDiagramEntityError from '@/erdiagram/parser/types/error/ERDiagramEntityError'; 2 | import { 3 | ParsedEntityDescriptor, 4 | ParsedEntityPropertyDescriptor 5 | } from '@/erdiagram/parser/types/parsed-entity-relationship-model-types'; 6 | 7 | export default class ERDiagramEntityPropertyError extends ERDiagramEntityError { 8 | 9 | constructor( 10 | message: string, 11 | entity: ParsedEntityDescriptor, 12 | public readonly property: ParsedEntityPropertyDescriptor 13 | ) { 14 | super(message, entity); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/sqlserver/table_with_nullable_reference_to_another_table.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE "TestTable1" ( 2 | "Id" BIGINT NOT NULL IDENTITY(1, 1), 3 | "Table2Id" BIGINT, 4 | CONSTRAINT "TestTable1_pk" PRIMARY KEY ("Id") 5 | ); 6 | 7 | CREATE TABLE "TestTable2" ( 8 | "Id" BIGINT NOT NULL IDENTITY(1, 1), 9 | CONSTRAINT "TestTable2_pk" PRIMARY KEY ("Id") 10 | ); 11 | 12 | ALTER TABLE "TestTable1" ADD CONSTRAINT "TestTable1_Table2Id_fk" FOREIGN KEY ("Table2Id") REFERENCES "TestTable2" ("Id"); -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/sqlserver/table_with_reference_to_another_table.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE "TestTable1" ( 2 | "Id" BIGINT NOT NULL IDENTITY(1, 1), 3 | "Table2Id" BIGINT NOT NULL, 4 | CONSTRAINT "TestTable1_pk" PRIMARY KEY ("Id") 5 | ); 6 | 7 | CREATE TABLE "TestTable2" ( 8 | "Id" BIGINT NOT NULL IDENTITY(1, 1), 9 | CONSTRAINT "TestTable2_pk" PRIMARY KEY ("Id") 10 | ); 11 | 12 | ALTER TABLE "TestTable1" ADD CONSTRAINT "TestTable1_Table2Id_fk" FOREIGN KEY ("Table2Id") REFERENCES "TestTable2" ("Id"); -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/jpa/config/JpaConfig.ts: -------------------------------------------------------------------------------- 1 | import CaseFormat from '@/erdiagram/converter/common/case-format/CaseFormat'; 2 | import JavaExtendedPackage from '@/erdiagram/converter/oop/source-code-generator/java/type/JavaExtendedPackage'; 3 | 4 | export default interface JpaConfig { 5 | tableNameCaseFormat: CaseFormat; 6 | columnNameCaseFormat: CaseFormat; 7 | annotateGetters: boolean; 8 | useExplicitTableName: boolean; 9 | useExplicitColumnName: boolean; 10 | javaExtendedPackage: JavaExtendedPackage; 11 | } 12 | 13 | export type PartialJpaConfig = Partial; 14 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/common/case-format/CaseConverter.ts: -------------------------------------------------------------------------------- 1 | import CaseFormat from '@/erdiagram/converter/common/case-format/CaseFormat'; 2 | 3 | export default class CaseConverter { 4 | 5 | constructor( 6 | private readonly sourceCaseFormat: CaseFormat, 7 | private readonly targetCaseFormat: CaseFormat 8 | ) { 9 | 10 | } 11 | 12 | public convertCase(text: string) { 13 | 14 | if (this.sourceCaseFormat === this.targetCaseFormat) { 15 | return text; 16 | } 17 | 18 | const words = this.sourceCaseFormat.splitWords(text); 19 | 20 | return this.targetCaseFormat.joinWords(words); 21 | 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/common/id-naming-strategy/StandardIdNamingStrategies.ts: -------------------------------------------------------------------------------- 1 | import {uncapitalizeWord} from '@/erdiagram/util/string-utils'; 2 | import IdNamingStrategy from '@/erdiagram/converter/common/id-naming-strategy/IdNamingStrategy'; 3 | 4 | const defaultIdNamingStrategy: IdNamingStrategy = () => 'id'; 5 | const entityNamePrefixIdNamingStrategy: IdNamingStrategy = entityName => `${uncapitalizeWord(entityName)}Id`; 6 | 7 | const StandardIdNamingStrategies = { 8 | DEFAULT: defaultIdNamingStrategy, 9 | ENTITY_NAME_PREFIX: entityNamePrefixIdNamingStrategy 10 | }; 11 | 12 | export default StandardIdNamingStrategies; 13 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/common/case-format/AbstractCamelCaseFormat.ts: -------------------------------------------------------------------------------- 1 | import CaseFormat from '@/erdiagram/converter/common/case-format/CaseFormat'; 2 | import {removeNonEmptyStrings} from '@/erdiagram/util/string-utils'; 3 | 4 | const CAMEL_CASE_WORD_BOUNDARIES_REGEX = /((?<=[^A-Z])(?=[A-Z])|(?=[A-Z][a-z])|(?<=[A-Za-z])(?=[0-9]))/; 5 | 6 | export default abstract class AbstractCamelCaseFormat implements CaseFormat { 7 | 8 | abstract joinWords(words: string[]): string; 9 | 10 | public splitWords(text: string): string[] { 11 | return removeNonEmptyStrings(text.split(CAMEL_CASE_WORD_BOUNDARIES_REGEX)); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/source-code-generator/sql/dialect/common/column/SqlForeignColumnCodeGenerator.ts: -------------------------------------------------------------------------------- 1 | import {TableReferenceDescriptor} from '@/erdiagram/converter/database/model/database-model-types'; 2 | import {ForeignKeyColumnCode} from '@/erdiagram/converter/database/source-code-generator/sql/dialect/common/sql-script-types'; 3 | import {OmitSource} from '@/erdiagram/converter/oop/model/source-metadata/source-metadata-types'; 4 | 5 | export default interface SqlForeignColumnCodeGenerator { 6 | generateForeignColumnCode(outputTableName: string, reference: OmitSource): ForeignKeyColumnCode; 7 | } 8 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/annotation/annotation-parameter-types.ts: -------------------------------------------------------------------------------- 1 | import RawAnnotationParameterValue 2 | from '@/erdiagram/converter/oop/source-code-generator/java/annotation/utils/RawAnnotationParameterValue'; 3 | import JavaAnnotation from '@/erdiagram/converter/oop/source-code-generator/java/annotation/JavaAnnotation'; 4 | 5 | export type JavaAnnotationParameterValue = JavaAnnotationParameterSingleValue | JavaAnnotationParameterSingleValue[]; 6 | export type JavaAnnotationParameterSingleValue = 7 | number 8 | | boolean 9 | | string 10 | | RawAnnotationParameterValue 11 | | JavaAnnotation; 12 | -------------------------------------------------------------------------------- /src/main/erdiagram/parser/line/EntityRelationshipModelLineParserErrorHandler.ts: -------------------------------------------------------------------------------- 1 | import ERDiagramError from '@/erdiagram/parser/types/error/ERDiagramError'; 2 | import ERDiagramParseLineError from '@/erdiagram/parser/types/error/ERDiagramParseLineError'; 3 | 4 | export default class EntityRelationshipModelLineParserErrorHandler { 5 | 6 | public handleLineError(error: unknown, lineIndex: number): never { 7 | 8 | /* istanbul ignore else */ 9 | if (error instanceof ERDiagramError) { 10 | throw new ERDiagramParseLineError(error, lineIndex); 11 | } 12 | 13 | /* istanbul ignore next */ 14 | throw error; 15 | 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/mysql/table_with_reference_to_another_table_with_a_custom_id.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `TestTable1` ( 2 | `id` BIGINT NOT NULL AUTO_INCREMENT, 3 | `table2Id` BIGINT NOT NULL, 4 | CONSTRAINT `TestTable1_pk` PRIMARY KEY (`id`) 5 | ); 6 | 7 | CREATE TABLE `TestTable2` ( 8 | `customId` BIGINT NOT NULL AUTO_INCREMENT, 9 | CONSTRAINT `TestTable2_pk` PRIMARY KEY (`customId`) 10 | ); 11 | 12 | ALTER TABLE `TestTable1` ADD CONSTRAINT `TestTable1_table2Id_fk` FOREIGN KEY (`table2Id`) REFERENCES `TestTable2` (`customId`); -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/sqlserver/table_with_reference_to_another_table_with_a_custom_id.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE "TestTable1" ( 2 | "Id" BIGINT NOT NULL IDENTITY(1, 1), 3 | "Table2Id" BIGINT NOT NULL, 4 | CONSTRAINT "TestTable1_pk" PRIMARY KEY ("Id") 5 | ); 6 | 7 | CREATE TABLE "TestTable2" ( 8 | "CustomId" BIGINT NOT NULL IDENTITY(1, 1), 9 | CONSTRAINT "TestTable2_pk" PRIMARY KEY ("CustomId") 10 | ); 11 | 12 | ALTER TABLE "TestTable1" ADD CONSTRAINT "TestTable1_Table2Id_fk" FOREIGN KEY ("Table2Id") REFERENCES "TestTable2" ("CustomId"); -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/model/generator/config/JavaClassModelConfig.ts: -------------------------------------------------------------------------------- 1 | import JavaType from '@/erdiagram/converter/oop/source-code-generator/java/type/JavaType'; 2 | import { WithPartial } from '@/erdiagram/util/types'; 3 | import { EntityPropertyType } from '@/erdiagram/parser/types/entity-relationship-model-types'; 4 | 5 | export default interface JavaClassModelConfig { 6 | generatedClassesPackage?: string; 7 | fluentSetters: boolean; 8 | typeBindings: Record; 9 | } 10 | 11 | export type PartialJavaClassModelConfig = Partial>; 12 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/postgresql/table_with_nullable_reference_to_another_table.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE "test_table_1" ( 2 | "id" BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY, 3 | "table_2_id" BIGINT, 4 | CONSTRAINT "test_table_1_pk" PRIMARY KEY ("id") 5 | ); 6 | 7 | CREATE TABLE "test_table_2" ( 8 | "id" BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY, 9 | CONSTRAINT "test_table_2_pk" PRIMARY KEY ("id") 10 | ); 11 | 12 | ALTER TABLE "test_table_1" ADD CONSTRAINT "test_table_1_table_2_id_fk" FOREIGN KEY ("table_2_id") REFERENCES "test_table_2" ("id"); -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/postgresql/table_with_reference_to_another_table.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE "test_table_1" ( 2 | "id" BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY, 3 | "table_2_id" BIGINT NOT NULL, 4 | CONSTRAINT "test_table_1_pk" PRIMARY KEY ("id") 5 | ); 6 | 7 | CREATE TABLE "test_table_2" ( 8 | "id" BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY, 9 | CONSTRAINT "test_table_2_pk" PRIMARY KEY ("id") 10 | ); 11 | 12 | ALTER TABLE "test_table_1" ADD CONSTRAINT "test_table_1_table_2_id_fk" FOREIGN KEY ("table_2_id") REFERENCES "test_table_2" ("id"); -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/sqlite/table_with_unique_reference_to_another_table.sql: -------------------------------------------------------------------------------- 1 | PRAGMA foreign_keys = OFF; 2 | 3 | CREATE TABLE "test_table_1" ( 4 | "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 5 | "table_2_id" INTEGER NOT NULL, 6 | CONSTRAINT "test_table_1_table_2_id_unique" UNIQUE ("table_2_id"), 7 | CONSTRAINT "test_table_1_table_2_id_fk" FOREIGN KEY ("table_2_id") REFERENCES "test_table_2" ("id") 8 | ); 9 | 10 | CREATE TABLE "test_table_2" ( 11 | "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT 12 | ); 13 | 14 | PRAGMA foreign_keys = ON; -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/typescript/type/simple/createTypeScriptSimpleType.ts: -------------------------------------------------------------------------------- 1 | import TypeScriptType from '@/erdiagram/converter/oop/source-code-generator/typescript/type/TypeScriptType'; 2 | 3 | export default function createTypeScriptSimpleType(name: string): TypeScriptType { 4 | return new TypeScriptSimpleTypeImpl(name); 5 | } 6 | 7 | class TypeScriptSimpleTypeImpl implements TypeScriptType { 8 | 9 | private readonly _name: string; 10 | 11 | constructor(name: string) { 12 | this._name = name; 13 | } 14 | 15 | get name() { 16 | return this._name; 17 | } 18 | 19 | format(): string { 20 | return this._name; 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/mysql/table_with_unique_reference_to_another_table.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `TestTable1` ( 2 | `id` BIGINT NOT NULL AUTO_INCREMENT, 3 | `table2Id` BIGINT NOT NULL, 4 | CONSTRAINT `TestTable1_pk` PRIMARY KEY (`id`), 5 | CONSTRAINT `TestTable1_table2Id_unique` UNIQUE (`table2Id`) 6 | ); 7 | 8 | CREATE TABLE `TestTable2` ( 9 | `id` BIGINT NOT NULL AUTO_INCREMENT, 10 | CONSTRAINT `TestTable2_pk` PRIMARY KEY (`id`) 11 | ); 12 | 13 | ALTER TABLE `TestTable1` ADD CONSTRAINT `TestTable1_table2Id_fk` FOREIGN KEY (`table2Id`) REFERENCES `TestTable2` (`id`); -------------------------------------------------------------------------------- /src/main/erdiagram/converter/diagram/nomnoml/config/NomnomlStyleConfig.ts: -------------------------------------------------------------------------------- 1 | export default interface NomnomlStyleConfig { 2 | arrowSize?: number; 3 | bendSize?: number; 4 | direction?: 'down' | 'right'; 5 | gutter?: number; 6 | edgeMargin?: number; 7 | gravity?: number; 8 | edges?: 'hard' | 'rounded'; 9 | background?: string; 10 | fill?: string; 11 | fillArrows?: boolean; 12 | font?: string; 13 | fontSize?: number; 14 | leading?: number; 15 | lineWidth?: number; 16 | padding?: number; 17 | spacing?: number; 18 | stroke?: string; 19 | title?: string; 20 | zoom?: number; 21 | acyclicer?: 'greedy'; 22 | ranker?: 'network-simplex' | 'tight-tree' | 'longest-path'; 23 | } 24 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/typescript/exports.ts: -------------------------------------------------------------------------------- 1 | import TypeScriptClassModelToCodeConverter from './TypeScriptClassModelToCodeConverter'; 2 | import TypeScriptSourceCodeGenerator 3 | from '@/erdiagram/converter/oop/source-code-generator/typescript/TypeScriptSourceCodeGenerator'; 4 | import TypeScriptSourceCodeGeneratorBuilder 5 | from '@/erdiagram/converter/oop/source-code-generator/typescript/TypeScriptSourceCodeGeneratorBuilder'; 6 | 7 | export * from './config/exports'; 8 | export * from './type/exports'; 9 | 10 | export { 11 | TypeScriptClassModelToCodeConverter, 12 | TypeScriptSourceCodeGenerator, 13 | TypeScriptSourceCodeGeneratorBuilder 14 | }; 15 | -------------------------------------------------------------------------------- /src/main/erdiagram/parser/types/error/ERDiagramUnknownEntityError.ts: -------------------------------------------------------------------------------- 1 | import ERDiagramRelationshipError from '@/erdiagram/parser/types/error/ERDiagramRelationshipError'; 2 | import {ParsedRelationshipDescriptor} from '@/erdiagram/parser/types/parsed-entity-relationship-model-types'; 3 | import {RelationshipMember} from '@/erdiagram/parser/types/entity-relationship-model-types'; 4 | 5 | export default class ERDiagramUnknownEntityError extends ERDiagramRelationshipError { 6 | 7 | constructor( 8 | message: string, 9 | relationship: ParsedRelationshipDescriptor, 10 | public readonly member: RelationshipMember 11 | ) { 12 | super(message, relationship); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/mysql/table_with_columns_of_all_types.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `TestTable` ( 2 | `id` BIGINT NOT NULL AUTO_INCREMENT, 3 | `booleanColumn` BOOLEAN NOT NULL, 4 | `shortColumn` SHORT NOT NULL, 5 | `intColumn` INT NOT NULL, 6 | `longColumn` BIGINT NOT NULL, 7 | `decimalColumn` DECIMAL(10, 3) NOT NULL, 8 | `textColumn` VARCHAR(50) NOT NULL, 9 | `dateColumn` DATE NOT NULL, 10 | `timeColumn` TIME NOT NULL, 11 | `datetimeColumn` TIMESTAMP NOT NULL, 12 | `blobColumn` BLOB NOT NULL, 13 | CONSTRAINT `TestTable_pk` PRIMARY KEY (`id`) 14 | ); -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/sqlserver/table_with_unique_reference_to_another_table.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE "TestTable1" ( 2 | "Id" BIGINT NOT NULL IDENTITY(1, 1), 3 | "Table2Id" BIGINT NOT NULL, 4 | CONSTRAINT "TestTable1_pk" PRIMARY KEY ("Id"), 5 | CONSTRAINT "TestTable1_Table2Id_unique" UNIQUE ("Table2Id") 6 | ); 7 | 8 | CREATE TABLE "TestTable2" ( 9 | "Id" BIGINT NOT NULL IDENTITY(1, 1), 10 | CONSTRAINT "TestTable2_pk" PRIMARY KEY ("Id") 11 | ); 12 | 13 | ALTER TABLE "TestTable1" ADD CONSTRAINT "TestTable1_Table2Id_fk" FOREIGN KEY ("Table2Id") REFERENCES "TestTable2" ("Id"); -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/lombok/lombok-java-types.ts: -------------------------------------------------------------------------------- 1 | import createJavaSimpleType 2 | from '@/erdiagram/converter/oop/source-code-generator/java/type/simple/createJavaSimpleType'; 3 | 4 | const LOMBOK_PACKAGE = 'lombok'; 5 | 6 | export const LombokAnnotationTypes = { 7 | Builder: createJavaSimpleType('Builder', LOMBOK_PACKAGE), 8 | Data: createJavaSimpleType('Data', LOMBOK_PACKAGE), 9 | Getter: createJavaSimpleType('Getter', LOMBOK_PACKAGE), 10 | Setter: createJavaSimpleType('Setter', LOMBOK_PACKAGE), 11 | ToString: createJavaSimpleType('ToString', LOMBOK_PACKAGE), 12 | EqualsAndHashCode: createJavaSimpleType('EqualsAndHashCode', LOMBOK_PACKAGE) 13 | }; 14 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/postgresql/table_with_reference_to_another_table_with_a_custom_id.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE "test_table_1" ( 2 | "id" BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY, 3 | "table_2_id" BIGINT NOT NULL, 4 | CONSTRAINT "test_table_1_pk" PRIMARY KEY ("id") 5 | ); 6 | 7 | CREATE TABLE "test_table_2" ( 8 | "custom_id" BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY, 9 | CONSTRAINT "test_table_2_pk" PRIMARY KEY ("custom_id") 10 | ); 11 | 12 | ALTER TABLE "test_table_1" ADD CONSTRAINT "test_table_1_table_2_id_fk" FOREIGN KEY ("table_2_id") REFERENCES "test_table_2" ("custom_id"); -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/validation/exports.ts: -------------------------------------------------------------------------------- 1 | import NotNullTextValidationStrategy 2 | from '@/erdiagram/converter/oop/source-code-generator/java/validation/strategy/NotNullTextValidationStrategy'; 3 | import NotNullBlobValidationStrategy 4 | from '@/erdiagram/converter/oop/source-code-generator/java/validation/strategy/NotNullBlobValidationStrategy'; 5 | import BeanValidationTransformer 6 | from '@/erdiagram/converter/oop/source-code-generator/java/validation/BeanValidationTransformer'; 7 | 8 | export * from './config/exports'; 9 | 10 | export { 11 | NotNullTextValidationStrategy, 12 | NotNullBlobValidationStrategy, 13 | BeanValidationTransformer 14 | }; 15 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/sqlserver/table_with_columns_of_all_types.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE "TestTable" ( 2 | "Id" BIGINT NOT NULL IDENTITY(1, 1), 3 | "BooleanColumn" BIT NOT NULL, 4 | "ShortColumn" SMALLINT NOT NULL, 5 | "IntColumn" INT NOT NULL, 6 | "LongColumn" BIGINT NOT NULL, 7 | "DecimalColumn" DECIMAL(10, 3) NOT NULL, 8 | "TextColumn" NVARCHAR(50) NOT NULL, 9 | "DateColumn" DATE NOT NULL, 10 | "TimeColumn" TIME NOT NULL, 11 | "DatetimeColumn" DATETIME2 NOT NULL, 12 | "BlobColumn" VARBINARY(MAX) NOT NULL, 13 | CONSTRAINT "TestTable_pk" PRIMARY KEY ("Id") 14 | ); -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/jpa/JpaEnumTypesProvider.ts: -------------------------------------------------------------------------------- 1 | import JavaExtendedPackage 2 | from '@/erdiagram/converter/oop/source-code-generator/java/type/JavaExtendedPackage'; 3 | import createJavaSimpleType 4 | from '@/erdiagram/converter/oop/source-code-generator/java/type/simple/createJavaSimpleType'; 5 | 6 | export default class JpaEnumTypesProvider { 7 | 8 | private readonly _packageName: string; 9 | 10 | constructor( 11 | javaExtendedPackage: JavaExtendedPackage 12 | ) { 13 | this._packageName = `${javaExtendedPackage}.persistence`; 14 | } 15 | 16 | generationType() { 17 | return createJavaSimpleType('GenerationType', this._packageName); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/sqlite/tables_referencing_each_other.sql: -------------------------------------------------------------------------------- 1 | PRAGMA foreign_keys = OFF; 2 | 3 | CREATE TABLE "test_table_1" ( 4 | "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 5 | "table_2_id" INTEGER NOT NULL, 6 | CONSTRAINT "test_table_1_table_2_id_fk" FOREIGN KEY ("table_2_id") REFERENCES "test_table_2" ("id") 7 | ); 8 | 9 | CREATE TABLE "test_table_2" ( 10 | "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 11 | "table_1_id" INTEGER NOT NULL, 12 | CONSTRAINT "test_table_2_table_1_id_fk" FOREIGN KEY ("table_1_id") REFERENCES "test_table_1" ("id") 13 | ); 14 | 15 | PRAGMA foreign_keys = ON; -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/postgresql/table_with_columns_of_all_types.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE "test_table" ( 2 | "id" BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY, 3 | "boolean_column" BOOLEAN NOT NULL, 4 | "short_column" SMALLINT NOT NULL, 5 | "int_column" INTEGER NOT NULL, 6 | "long_column" BIGINT NOT NULL, 7 | "decimal_column" DECIMAL(10, 3) NOT NULL, 8 | "text_column" VARCHAR(50) NOT NULL, 9 | "date_column" DATE NOT NULL, 10 | "time_column" TIME NOT NULL, 11 | "datetime_column" TIMESTAMP NOT NULL, 12 | "blob_column" BYTEA NOT NULL, 13 | CONSTRAINT "test_table_pk" PRIMARY KEY ("id") 14 | ); -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # This file is for unifying the coding style for different editors and IDEs 2 | # editorconfig.org 3 | 4 | root = true 5 | 6 | [*] 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | indent_style = tab 12 | indent_size = 4 13 | ij_continuation_indent_size = 8 14 | ij_typescript_spaces_within_imports = true 15 | ij_typescript_spaces_within_object_literal_braces = true 16 | ij_typescript_enforce_trailing_comma = remove 17 | ij_typescript_imports_wrap = split_into_lines 18 | ij_typescript_force_quote_style = true 19 | ij_typescript_use_double_quotes = false 20 | ij_typescript_force_semicolon_style = true 21 | ij_typescript_use_semicolon_after_statement = true 22 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/sqlite/table_with_columns_of_all_types.sql: -------------------------------------------------------------------------------- 1 | PRAGMA foreign_keys = OFF; 2 | 3 | CREATE TABLE "test_table" ( 4 | "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 5 | "boolean_column" INTEGER NOT NULL, 6 | "short_column" INTEGER NOT NULL, 7 | "int_column" INTEGER NOT NULL, 8 | "long_column" INTEGER NOT NULL, 9 | "decimal_column" REAL(10, 3) NOT NULL, 10 | "text_column" TEXT(50) NOT NULL, 11 | "date_column" INTEGER NOT NULL, 12 | "time_column" INTEGER NOT NULL, 13 | "datetime_column" INTEGER NOT NULL, 14 | "blob_column" BLOB NOT NULL 15 | ); 16 | 17 | PRAGMA foreign_keys = ON; -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/postgresql/table_with_unique_reference_to_another_table.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE "test_table_1" ( 2 | "id" BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY, 3 | "table_2_id" BIGINT NOT NULL, 4 | CONSTRAINT "test_table_1_pk" PRIMARY KEY ("id"), 5 | CONSTRAINT "test_table_1_table_2_id_unique" UNIQUE ("table_2_id") 6 | ); 7 | 8 | CREATE TABLE "test_table_2" ( 9 | "id" BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY, 10 | CONSTRAINT "test_table_2_pk" PRIMARY KEY ("id") 11 | ); 12 | 13 | ALTER TABLE "test_table_1" ADD CONSTRAINT "test_table_1_table_2_id_fk" FOREIGN KEY ("table_2_id") REFERENCES "test_table_2" ("id"); -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/source-code-generator/sql/dialect/common/SqlTypeResolver.ts: -------------------------------------------------------------------------------- 1 | import {EntityPropertyType} from '@/erdiagram/parser/types/entity-relationship-model-types'; 2 | 3 | export default class SqlTypeResolver { 4 | 5 | private readonly typeBindings: Partial>; 6 | 7 | constructor(typeBindings: Partial>) { 8 | this.typeBindings = typeBindings; 9 | } 10 | 11 | public resolveSqlType(type: EntityPropertyType): string { 12 | 13 | /* istanbul ignore next */ 14 | if (!Object.hasOwn(this.typeBindings, type)) { 15 | throw new Error('Unsupported type: ' + type); 16 | } 17 | 18 | return this.typeBindings[type]!; 19 | 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/test/erdiagram/parser/types/error/ERDiagramParseLineError.unit.spec.ts: -------------------------------------------------------------------------------- 1 | import ERDiagramParseLineError from '@/erdiagram/parser/types/error/ERDiagramParseLineError'; 2 | import ERDiagramError from '@/erdiagram/parser/types/error/ERDiagramError'; 3 | 4 | test('Line number getter', () => { 5 | 6 | [0, 10, 42, 1970].forEach(lineIndex => { 7 | 8 | const lineNumber = lineIndex + 1; 9 | const errorMessage = `This is a error on line ${lineNumber}`; 10 | 11 | const lineError = new ERDiagramParseLineError(new ERDiagramError(errorMessage), lineIndex); 12 | 13 | expect(lineError.message).toBe(errorMessage); 14 | expect(lineError.lineIndex).toBe(lineIndex); 15 | expect(lineError.lineNumber).toBe(lineNumber); 16 | 17 | }); 18 | 19 | }); 20 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/source-code-generator/sql/dialect/common/sql-script-types.ts: -------------------------------------------------------------------------------- 1 | export interface TableCreationStatements { 2 | createTableStatement: string; 3 | alterTableStatements: string; 4 | } 5 | 6 | export interface CreateTableLines { 7 | sequences: string[]; 8 | columns: string[]; 9 | fkConstraints: string[]; 10 | otherConstraints: string[]; 11 | } 12 | 13 | export interface IdColumnCode { 14 | createSequenceLine?: string; 15 | columnLine: string; 16 | pkConstraintLine?: string; 17 | } 18 | 19 | export interface RegularColumnCode { 20 | columnLine: string; 21 | uniqueConstraintLine?: string; 22 | } 23 | 24 | export interface ForeignKeyColumnCode extends RegularColumnCode { 25 | fkConstraintLine: string; 26 | } 27 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/mysql/tables_referencing_each_other.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `TestTable1` ( 2 | `id` BIGINT NOT NULL AUTO_INCREMENT, 3 | `table2Id` BIGINT NOT NULL, 4 | CONSTRAINT `TestTable1_pk` PRIMARY KEY (`id`) 5 | ); 6 | 7 | CREATE TABLE `TestTable2` ( 8 | `id` BIGINT NOT NULL AUTO_INCREMENT, 9 | `table1Id` BIGINT NOT NULL, 10 | CONSTRAINT `TestTable2_pk` PRIMARY KEY (`id`) 11 | ); 12 | 13 | ALTER TABLE `TestTable1` ADD CONSTRAINT `TestTable1_table2Id_fk` FOREIGN KEY (`table2Id`) REFERENCES `TestTable2` (`id`); 14 | 15 | ALTER TABLE `TestTable2` ADD CONSTRAINT `TestTable2_table1Id_fk` FOREIGN KEY (`table1Id`) REFERENCES `TestTable1` (`id`); -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/sqlserver/tables_referencing_each_other.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE "TestTable1" ( 2 | "Id" BIGINT NOT NULL IDENTITY(1, 1), 3 | "Table2Id" BIGINT NOT NULL, 4 | CONSTRAINT "TestTable1_pk" PRIMARY KEY ("Id") 5 | ); 6 | 7 | CREATE TABLE "TestTable2" ( 8 | "Id" BIGINT NOT NULL IDENTITY(1, 1), 9 | "Table1Id" BIGINT NOT NULL, 10 | CONSTRAINT "TestTable2_pk" PRIMARY KEY ("Id") 11 | ); 12 | 13 | ALTER TABLE "TestTable1" ADD CONSTRAINT "TestTable1_Table2Id_fk" FOREIGN KEY ("Table2Id") REFERENCES "TestTable2" ("Id"); 14 | 15 | ALTER TABLE "TestTable2" ADD CONSTRAINT "TestTable2_Table1Id_fk" FOREIGN KEY ("Table1Id") REFERENCES "TestTable1" ("Id"); -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/oracle/table_with_nullable_reference_to_another_table.sql: -------------------------------------------------------------------------------- 1 | CREATE SEQUENCE "TEST_TABLE_1_SEQ" START WITH 1; 2 | CREATE TABLE "TEST_TABLE_1" ( 3 | "ID" NUMBER NOT NULL DEFAULT "TEST_TABLE_1_SEQ".nextval, 4 | "TABLE_2_ID" NUMBER, 5 | CONSTRAINT "TEST_TABLE_1_PK" PRIMARY KEY ("ID") 6 | ); 7 | 8 | CREATE SEQUENCE "TEST_TABLE_2_SEQ" START WITH 1; 9 | CREATE TABLE "TEST_TABLE_2" ( 10 | "ID" NUMBER NOT NULL DEFAULT "TEST_TABLE_2_SEQ".nextval, 11 | CONSTRAINT "TEST_TABLE_2_PK" PRIMARY KEY ("ID") 12 | ); 13 | 14 | ALTER TABLE "TEST_TABLE_1" ADD CONSTRAINT "TEST_TABLE_1_TABLE_2_ID_FK" FOREIGN KEY ("TABLE_2_ID") REFERENCES "TEST_TABLE_2" ("ID"); -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/oracle/table_with_reference_to_another_table.sql: -------------------------------------------------------------------------------- 1 | CREATE SEQUENCE "TEST_TABLE_1_SEQ" START WITH 1; 2 | CREATE TABLE "TEST_TABLE_1" ( 3 | "ID" NUMBER NOT NULL DEFAULT "TEST_TABLE_1_SEQ".nextval, 4 | "TABLE_2_ID" NUMBER NOT NULL, 5 | CONSTRAINT "TEST_TABLE_1_PK" PRIMARY KEY ("ID") 6 | ); 7 | 8 | CREATE SEQUENCE "TEST_TABLE_2_SEQ" START WITH 1; 9 | CREATE TABLE "TEST_TABLE_2" ( 10 | "ID" NUMBER NOT NULL DEFAULT "TEST_TABLE_2_SEQ".nextval, 11 | CONSTRAINT "TEST_TABLE_2_PK" PRIMARY KEY ("ID") 12 | ); 13 | 14 | ALTER TABLE "TEST_TABLE_1" ADD CONSTRAINT "TEST_TABLE_1_TABLE_2_ID_FK" FOREIGN KEY ("TABLE_2_ID") REFERENCES "TEST_TABLE_2" ("ID"); -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/oracle/table_with_columns_of_all_types.sql: -------------------------------------------------------------------------------- 1 | CREATE SEQUENCE "TEST_TABLE_SEQ" START WITH 1; 2 | CREATE TABLE "TEST_TABLE" ( 3 | "ID" NUMBER NOT NULL DEFAULT "TEST_TABLE_SEQ".nextval, 4 | "BOOLEAN_COLUMN" NUMBER(1, 0) NOT NULL, 5 | "SHORT_COLUMN" NUMBER NOT NULL, 6 | "INT_COLUMN" NUMBER NOT NULL, 7 | "LONG_COLUMN" NUMBER NOT NULL, 8 | "DECIMAL_COLUMN" NUMBER(10, 3) NOT NULL, 9 | "TEXT_COLUMN" VARCHAR2(50) NOT NULL, 10 | "DATE_COLUMN" DATE NOT NULL, 11 | "TIME_COLUMN" TIMESTAMP NOT NULL, 12 | "DATETIME_COLUMN" TIMESTAMP NOT NULL, 13 | "BLOB_COLUMN" BLOB NOT NULL, 14 | CONSTRAINT "TEST_TABLE_PK" PRIMARY KEY ("ID") 15 | ); -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/oracle/table_with_reference_to_another_table_with_a_custom_id.sql: -------------------------------------------------------------------------------- 1 | CREATE SEQUENCE "TEST_TABLE_1_SEQ" START WITH 1; 2 | CREATE TABLE "TEST_TABLE_1" ( 3 | "ID" NUMBER NOT NULL DEFAULT "TEST_TABLE_1_SEQ".nextval, 4 | "TABLE_2_ID" NUMBER NOT NULL, 5 | CONSTRAINT "TEST_TABLE_1_PK" PRIMARY KEY ("ID") 6 | ); 7 | 8 | CREATE SEQUENCE "TEST_TABLE_2_SEQ" START WITH 1; 9 | CREATE TABLE "TEST_TABLE_2" ( 10 | "CUSTOM_ID" NUMBER NOT NULL DEFAULT "TEST_TABLE_2_SEQ".nextval, 11 | CONSTRAINT "TEST_TABLE_2_PK" PRIMARY KEY ("CUSTOM_ID") 12 | ); 13 | 14 | ALTER TABLE "TEST_TABLE_1" ADD CONSTRAINT "TEST_TABLE_1_TABLE_2_ID_FK" FOREIGN KEY ("TABLE_2_ID") REFERENCES "TEST_TABLE_2" ("CUSTOM_ID"); -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/postgresql/tables_referencing_each_other.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE "test_table_1" ( 2 | "id" BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY, 3 | "table_2_id" BIGINT NOT NULL, 4 | CONSTRAINT "test_table_1_pk" PRIMARY KEY ("id") 5 | ); 6 | 7 | CREATE TABLE "test_table_2" ( 8 | "id" BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY, 9 | "table_1_id" BIGINT NOT NULL, 10 | CONSTRAINT "test_table_2_pk" PRIMARY KEY ("id") 11 | ); 12 | 13 | ALTER TABLE "test_table_1" ADD CONSTRAINT "test_table_1_table_2_id_fk" FOREIGN KEY ("table_2_id") REFERENCES "test_table_2" ("id"); 14 | 15 | ALTER TABLE "test_table_2" ADD CONSTRAINT "test_table_2_table_1_id_fk" FOREIGN KEY ("table_1_id") REFERENCES "test_table_1" ("id"); -------------------------------------------------------------------------------- /src/main/erdiagram/converter/MultipleFileSourceCodeGenerator.ts: -------------------------------------------------------------------------------- 1 | import {EntityRelationshipModel} from '@/erdiagram/parser/types/entity-relationship-model-types'; 2 | import SourceFileInfo from '@/erdiagram/converter/common/SourceFileInfo'; 3 | import SourceCodeGenerator from '@/erdiagram/converter/SourceCodeGenerator'; 4 | 5 | export default interface MultipleFileSourceCodeGenerator 6 | extends SourceCodeGenerator { 7 | 8 | generateSourceFiles(model: EntityRelationshipModel): SourceFileInfo[]; 9 | 10 | } 11 | 12 | export function isMultipleFileSourceCodeGenerator( 13 | generator: SourceCodeGenerator 14 | ): generator is MultipleFileSourceCodeGenerator { 15 | const uncheckedCastedGenerator = generator as MultipleFileSourceCodeGenerator; 16 | return typeof uncheckedCastedGenerator.generateSourceFiles === 'function'; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/jpa/transformer/visitor/field/FieldAnnotationsSupplier.ts: -------------------------------------------------------------------------------- 1 | import {JavaField} from '@/erdiagram/converter/oop/source-code-generator/java/model/java-class-model-types'; 2 | import {JavaFieldTransformContext} from '@/erdiagram/converter/oop/source-code-generator/java/model/transformer/java-class-model-transformer-context-types'; 3 | import JpaTransformerSetupData 4 | from '@/erdiagram/converter/oop/source-code-generator/java/jpa/transformer/setup/JpaTransformerSetupData'; 5 | import JavaAnnotation from '@/erdiagram/converter/oop/source-code-generator/java/annotation/JavaAnnotation'; 6 | 7 | export default interface FieldAnnotationsSupplier { 8 | 9 | getAnnotations(javaField: JavaField, context: JavaFieldTransformContext): JavaAnnotation[]; 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/type/exports.ts: -------------------------------------------------------------------------------- 1 | import JavaExtendedPackage from './JavaExtendedPackage'; 2 | import JavaType from './JavaType'; 3 | import JavaParameterizedType from './parameterized/JavaParameterizedType'; 4 | import parseJavaType from './parseJavaType'; 5 | import createJavaSimpleType from './simple/createJavaSimpleType'; 6 | import createJavaParameterizedType from './parameterized/createJavaParameterizedType'; 7 | import createJavaArrayType from './parameterized/createJavaArrayType'; 8 | import isJavaParameterizedType from './parameterized/isJavaParameterizedType'; 9 | 10 | export { 11 | JavaExtendedPackage, 12 | JavaType, 13 | createJavaSimpleType, 14 | JavaParameterizedType, 15 | createJavaParameterizedType, 16 | createJavaArrayType, 17 | isJavaParameterizedType, 18 | parseJavaType 19 | }; 20 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/MultipleFileSourceCodeGenerator.unit.spec.ts: -------------------------------------------------------------------------------- 1 | import SourceCodeGenerator from '@/erdiagram/converter/SourceCodeGenerator'; 2 | import MultipleFileSourceCodeGenerator, {isMultipleFileSourceCodeGenerator} from '@/erdiagram/converter/MultipleFileSourceCodeGenerator'; 3 | 4 | test('isMultipleFileSourceCodeGenerator()', () => { 5 | 6 | const nonMultipleGenerator: SourceCodeGenerator = { 7 | generateSourceCode() { 8 | return ''; 9 | } 10 | }; 11 | 12 | const multipleGenerator: MultipleFileSourceCodeGenerator = { 13 | generateSourceCode() { 14 | return ''; 15 | }, 16 | generateSourceFiles() { 17 | return []; 18 | } 19 | }; 20 | 21 | expect(isMultipleFileSourceCodeGenerator(nonMultipleGenerator)).toBe(false); 22 | expect(isMultipleFileSourceCodeGenerator(multipleGenerator)).toBe(true); 23 | 24 | }); 25 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/oracle/table_with_unique_reference_to_another_table.sql: -------------------------------------------------------------------------------- 1 | CREATE SEQUENCE "TEST_TABLE_1_SEQ" START WITH 1; 2 | CREATE TABLE "TEST_TABLE_1" ( 3 | "ID" NUMBER NOT NULL DEFAULT "TEST_TABLE_1_SEQ".nextval, 4 | "TABLE_2_ID" NUMBER NOT NULL, 5 | CONSTRAINT "TEST_TABLE_1_PK" PRIMARY KEY ("ID"), 6 | CONSTRAINT "TEST_TABLE_1_TABLE_2_ID_UNIQUE" UNIQUE ("TABLE_2_ID") 7 | ); 8 | 9 | CREATE SEQUENCE "TEST_TABLE_2_SEQ" START WITH 1; 10 | CREATE TABLE "TEST_TABLE_2" ( 11 | "ID" NUMBER NOT NULL DEFAULT "TEST_TABLE_2_SEQ".nextval, 12 | CONSTRAINT "TEST_TABLE_2_PK" PRIMARY KEY ("ID") 13 | ); 14 | 15 | ALTER TABLE "TEST_TABLE_1" ADD CONSTRAINT "TEST_TABLE_1_TABLE_2_ID_FK" FOREIGN KEY ("TABLE_2_ID") REFERENCES "TEST_TABLE_2" ("ID"); -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | preset: 'ts-jest', 3 | testEnvironment: 'node', 4 | collectCoverageFrom: [ 5 | 'src/main/**/*.{ts,js}', 6 | '!src/main/**/*.d.ts', 7 | '!src/main/**/exports.ts', 8 | '!src/main/module-entry.ts', 9 | '!src/main/standalone-entry.js' 10 | ], 11 | coverageDirectory: 'coverage', 12 | coverageReporters: [ 13 | 'json-summary', 14 | 'text', 15 | 'lcov' 16 | ], 17 | testPathIgnorePatterns: [ 18 | '/node_modules/' 19 | ], 20 | verbose: false, 21 | roots: [ 22 | '/src' 23 | ], 24 | moduleNameMapper: { 25 | '@/(.*)?': '/src/main/$1', 26 | '#/(.*)?': '/src/test/$1', 27 | }, 28 | transform: { 29 | '\\.sql$': '@glen/jest-raw-loader' 30 | } 31 | }; 32 | -------------------------------------------------------------------------------- /src/main/erdiagram/parser/types/error/ERDiagramMultipleIdentitiesError.ts: -------------------------------------------------------------------------------- 1 | import ERDiagramEntityPropertyError from '@/erdiagram/parser/types/error/ERDiagramEntityPropertyError'; 2 | import { 3 | ParsedEntityDescriptor, 4 | ParsedEntityPropertyDescriptor 5 | } from '@/erdiagram/parser/types/parsed-entity-relationship-model-types'; 6 | 7 | export default class ERDiagramMultipleIdentitiesError extends ERDiagramEntityPropertyError { 8 | 9 | public readonly identityProperties: ParsedEntityPropertyDescriptor[]; 10 | 11 | constructor( 12 | message: string, 13 | entity: ParsedEntityDescriptor, 14 | identityProperties: ParsedEntityPropertyDescriptor[] 15 | ) { 16 | const firstDuplicateApparition = identityProperties[1]; 17 | super(message, entity, firstDuplicateApparition); 18 | this.identityProperties = identityProperties; 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/erdiagram/util/indent-utils.ts: -------------------------------------------------------------------------------- 1 | const DEFAULT_INDENT = ' '; 2 | 3 | export function indentLines(lines: string[], indent?: string | number) { 4 | const indentText = generateIndentText(indent); 5 | return lines.map(line => indentLineUsingIndentText(line, indentText)); 6 | } 7 | 8 | export function indentLine(line: string, indent?: string | number) { 9 | return indentLineUsingIndentText(line, generateIndentText(indent)); 10 | } 11 | 12 | function generateIndentText(indent: string | number = DEFAULT_INDENT): string { 13 | 14 | if (typeof indent !== 'number') { 15 | return indent; 16 | } 17 | 18 | return ''.padEnd(indent, ' '); 19 | 20 | } 21 | 22 | function indentLineUsingIndentText(line: string, indentText: string) { 23 | if (line.trim().length === 0) { 24 | return line; 25 | } else { 26 | return indentText + line; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/common/case-format/LowerCamelCaseFormat.ts: -------------------------------------------------------------------------------- 1 | import AbstractCamelCaseFormat from '@/erdiagram/converter/common/case-format/AbstractCamelCaseFormat'; 2 | import {capitalizeWord, removeNonEmptyStrings} from '@/erdiagram/util/string-utils'; 3 | 4 | export default class LowerCamelCaseFormat extends AbstractCamelCaseFormat { 5 | 6 | public joinWords(words: string[]): string { 7 | 8 | const nonEmptyWords = removeNonEmptyStrings(words) 9 | 10 | if (nonEmptyWords.length === 0) { 11 | return ''; 12 | } 13 | 14 | const [firstWord, ...otherWords] = nonEmptyWords; 15 | 16 | const lowerCaseFirstWord = firstWord.toLowerCase(); 17 | 18 | const capitalizedOtherWords = otherWords 19 | .map(word => word.toLowerCase()) 20 | .map(capitalizeWord); 21 | 22 | return lowerCaseFirstWord + capitalizedOtherWords.join(''); 23 | 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/oop/source-code-generator/java/jpa/JpaEnumTypesProvider.unit.spec.ts: -------------------------------------------------------------------------------- 1 | import JpaEnumTypesProvider 2 | from '@/erdiagram/converter/oop/source-code-generator/java/jpa/JpaEnumTypesProvider'; 3 | import JavaExtendedPackage 4 | from '@/erdiagram/converter/oop/source-code-generator/java/type/JavaExtendedPackage'; 5 | import createJavaSimpleType 6 | from '@/erdiagram/converter/oop/source-code-generator/java/type/simple/createJavaSimpleType'; 7 | 8 | test.each([ 9 | [JavaExtendedPackage.JAVAX, 'javax.persistence'], 10 | [JavaExtendedPackage.JAKARTA, 'jakarta.persistence'] 11 | ])('%s package (%s)', (javaExtendedPackage, expectedPackageName) => { 12 | 13 | const provider = new JpaEnumTypesProvider(javaExtendedPackage); 14 | 15 | expect(provider.generationType()).toStrictEqual(createJavaSimpleType('GenerationType', expectedPackageName)); 16 | 17 | }); 18 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/validation/config/BeanValidationConfig.ts: -------------------------------------------------------------------------------- 1 | import NotNullTextValidationStrategy 2 | from '@/erdiagram/converter/oop/source-code-generator/java/validation/strategy/NotNullTextValidationStrategy'; 3 | import NotNullBlobValidationStrategy 4 | from '@/erdiagram/converter/oop/source-code-generator/java/validation/strategy/NotNullBlobValidationStrategy'; 5 | import JavaExtendedPackage 6 | from '@/erdiagram/converter/oop/source-code-generator/java/type/JavaExtendedPackage'; 7 | 8 | export default interface BeanValidationConfig { 9 | notNullTextValidationStrategy: NotNullTextValidationStrategy; 10 | notNullBlobValidationStrategy: NotNullBlobValidationStrategy; 11 | javaExtendedPackage: JavaExtendedPackage; 12 | annotateGetters: boolean; 13 | } 14 | 15 | export type PartialBeanValidationConfig = Partial; 16 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/typescript/type/exports.ts: -------------------------------------------------------------------------------- 1 | import TypeScriptType from './TypeScriptType'; 2 | import TypeScriptParameterizedType from './parameterized/TypeScriptParameterizedType'; 3 | import parseTypeScriptType from './parseTypeScriptType'; 4 | import createTypeScriptParameterizedType from './parameterized/createTypeScriptParameterizedType'; 5 | import createTypeScriptArrayType from './parameterized/createTypeScriptArrayType'; 6 | import isTypeScriptParameterizedType from './parameterized/isTypeScriptParameterizedType'; 7 | import createTypeScriptSimpleType from './simple/createTypeScriptSimpleType'; 8 | 9 | export { 10 | TypeScriptType, 11 | createTypeScriptSimpleType, 12 | TypeScriptParameterizedType, 13 | createTypeScriptParameterizedType, 14 | createTypeScriptArrayType, 15 | isTypeScriptParameterizedType, 16 | parseTypeScriptType 17 | }; 18 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/diagram/plantuml/config/PlantUmlConfigManager.ts: -------------------------------------------------------------------------------- 1 | import AbstractConfigManager from '@/erdiagram/common/config/AbstractConfigManager'; 2 | import PlantUmlConfig, {PartialPlantUmlConfig} from '@/erdiagram/converter/diagram/plantuml/config/PlantUmlConfig'; 3 | import DiagramLevel from '@/erdiagram/converter/diagram/common/config/DiagramLevel'; 4 | 5 | export class PlantUmlConfigManager extends AbstractConfigManager { 6 | 7 | getDefaultConfig(): PlantUmlConfig { 8 | return { 9 | diagramLevel: DiagramLevel.LOGICAL, 10 | }; 11 | } 12 | 13 | mergeConfigs(fullConfig: PlantUmlConfig, partialConfig?: PartialPlantUmlConfig): PlantUmlConfig { 14 | return { 15 | ...fullConfig, 16 | ...partialConfig, 17 | }; 18 | } 19 | 20 | } 21 | 22 | const plantUmlConfigManager = new PlantUmlConfigManager(); 23 | export default plantUmlConfigManager; 24 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/diagram/nomnoml/relationship/NomnomlRelationshipDirectionCodeGenerator.ts: -------------------------------------------------------------------------------- 1 | import {Direction} from '@/erdiagram/parser/types/entity-relationship-model-types'; 2 | 3 | export default class NomnomlRelationshipDirectionCodeGenerator { 4 | 5 | public generateDirectionCode(direction: Direction): string { 6 | switch (direction) { 7 | case Direction.LEFT_TO_RIGHT: 8 | return '->'; 9 | case Direction.RIGHT_TO_LEFT: 10 | return '<-'; 11 | case Direction.BIDIRECTIONAL: 12 | return '<->'; 13 | } 14 | } 15 | 16 | public generateLeftSideDirectionCode(direction: Direction): string { 17 | return [Direction.RIGHT_TO_LEFT, Direction.BIDIRECTIONAL].includes(direction) ? '<-' : '-'; 18 | } 19 | 20 | public generateRightSideDirectionCode(direction: Direction): string { 21 | return [Direction.LEFT_TO_RIGHT, Direction.BIDIRECTIONAL].includes(direction) ? '->' : '-'; 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/model/transformer/JavaClassModelTransformer.ts: -------------------------------------------------------------------------------- 1 | import { 2 | JavaClass, 3 | JavaClassModel, 4 | JavaField 5 | } from '@/erdiagram/converter/oop/source-code-generator/java/model/java-class-model-types'; 6 | import { 7 | JavaClassModelTransformContext, 8 | JavaClassTransformContext, 9 | JavaFieldTransformContext, 10 | SetupContext 11 | } from '@/erdiagram/converter/oop/source-code-generator/java/model/transformer/java-class-model-transformer-context-types'; 12 | 13 | export default interface JavaClassModelTransformer { 14 | 15 | setup(context: SetupContext): T; 16 | 17 | visitField(javaField: JavaField, context: JavaFieldTransformContext): void; 18 | 19 | visitClass(javaClass: JavaClass, context: JavaClassTransformContext): void; 20 | 21 | visitModel(javaClassModel: JavaClassModel, context: JavaClassModelTransformContext): void; 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter_func_spec_expected_results/oracle/tables_referencing_each_other.sql: -------------------------------------------------------------------------------- 1 | CREATE SEQUENCE "TEST_TABLE_1_SEQ" START WITH 1; 2 | CREATE TABLE "TEST_TABLE_1" ( 3 | "ID" NUMBER NOT NULL DEFAULT "TEST_TABLE_1_SEQ".nextval, 4 | "TABLE_2_ID" NUMBER NOT NULL, 5 | CONSTRAINT "TEST_TABLE_1_PK" PRIMARY KEY ("ID") 6 | ); 7 | 8 | CREATE SEQUENCE "TEST_TABLE_2_SEQ" START WITH 1; 9 | CREATE TABLE "TEST_TABLE_2" ( 10 | "ID" NUMBER NOT NULL DEFAULT "TEST_TABLE_2_SEQ".nextval, 11 | "TABLE_1_ID" NUMBER NOT NULL, 12 | CONSTRAINT "TEST_TABLE_2_PK" PRIMARY KEY ("ID") 13 | ); 14 | 15 | ALTER TABLE "TEST_TABLE_1" ADD CONSTRAINT "TEST_TABLE_1_TABLE_2_ID_FK" FOREIGN KEY ("TABLE_2_ID") REFERENCES "TEST_TABLE_2" ("ID"); 16 | 17 | ALTER TABLE "TEST_TABLE_2" ADD CONSTRAINT "TEST_TABLE_2_TABLE_1_ID_FK" FOREIGN KEY ("TABLE_1_ID") REFERENCES "TEST_TABLE_1" ("ID"); -------------------------------------------------------------------------------- /scripts/bundle-ts-declaration-files.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const {execSync} = require('child_process'); 3 | const { 4 | green, 5 | blue, 6 | } = require('./utils/colorize'); 7 | 8 | const projectPath = path.resolve(__dirname, '..'); 9 | 10 | const dtsBundleGeneratorBinFile = path.resolve(projectPath, 'node_modules/.bin/dts-bundle-generator'); 11 | 12 | const outputFile = path.resolve(projectPath, 'dist/erdiagram.d.ts'); 13 | const relativeOutputFile = path.relative(projectPath, outputFile); 14 | 15 | const entryFile = path.resolve(projectPath, 'src/main/module-entry.ts'); 16 | const relativeEntryFile = path.relative(projectPath, entryFile); 17 | 18 | console.log(`Generating type declarations bundle from entry file ${blue(relativeEntryFile)}`); 19 | 20 | execSync(`${dtsBundleGeneratorBinFile} -o "${outputFile}" "${entryFile}"`) 21 | 22 | console.log(green(`Type declarations bundle successfully generated in ${blue(relativeOutputFile)}`)); 23 | console.log(); 24 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/oop/source-code-generator/java/validation/BeanValidationTransformer.func.spec.ts: -------------------------------------------------------------------------------- 1 | import BeanValidationTransformer 2 | from '@/erdiagram/converter/oop/source-code-generator/java/validation/BeanValidationTransformer'; 3 | import { getTransformedJavaClassModel } from '../util/transformer-test-utils'; 4 | import { 5 | checkAnnotations, 6 | checkClassFieldsAnnotations 7 | } from '#/erdiagram/converter/oop/source-code-generator/java/util/annotation-test-utils'; 8 | 9 | test('Simple entity', () => { 10 | 11 | const transformer = new BeanValidationTransformer(); 12 | 13 | const javaClassModel = getTransformedJavaClassModel(` 14 | TestEntity 15 | field int 16 | `, transformer); 17 | 18 | const testEntityClass = javaClassModel.classes[0]; 19 | expect(testEntityClass.name).toBe('TestEntity'); 20 | checkAnnotations(testEntityClass, []); 21 | checkClassFieldsAnnotations(testEntityClass, { 22 | id: [], 23 | field: ['@NotNull'] 24 | }); 25 | 26 | }); 27 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/jpa/transformer/setup/JpaTransformerSetupDataGenerator.ts: -------------------------------------------------------------------------------- 1 | import {SetupContext} from '@/erdiagram/converter/oop/source-code-generator/java/model/transformer/java-class-model-transformer-context-types'; 2 | import DatabaseModelGenerator from '@/erdiagram/converter/database/model/DatabaseModelGenerator'; 3 | import JpaTransformerSetupData 4 | from '@/erdiagram/converter/oop/source-code-generator/java/jpa/transformer/setup/JpaTransformerSetupData'; 5 | 6 | export default class JpaTransformerSetupDataGenerator { 7 | 8 | private readonly _databaseModelGenerator: DatabaseModelGenerator; 9 | 10 | constructor(databaseModelGenerator: DatabaseModelGenerator) { 11 | this._databaseModelGenerator = databaseModelGenerator; 12 | } 13 | 14 | setup(context: SetupContext): JpaTransformerSetupData { 15 | return { 16 | databaseModel: this._databaseModelGenerator.generateDatabaseModel(context.entityRelationshipModel) 17 | }; 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/lombok/config/LombokConfigManager.ts: -------------------------------------------------------------------------------- 1 | import AbstractConfigManager from '@/erdiagram/common/config/AbstractConfigManager'; 2 | import LombokConfig, { PartialLombokConfig } from '@/erdiagram/converter/oop/source-code-generator/java/lombok/config/LombokConfig'; 3 | 4 | export class LombokConfigManager extends AbstractConfigManager { 5 | 6 | getDefaultConfig(): LombokConfig { 7 | return { 8 | builderAnnotation: false, 9 | dataAnnotation: false, 10 | getterAnnotation: false, 11 | setterAnnotation: false, 12 | toStringAnnotation: false, 13 | equalsAndHashCodeAnnotation: false 14 | }; 15 | } 16 | 17 | mergeConfigs(fullConfig: LombokConfig, partialConfig?: PartialLombokConfig): LombokConfig { 18 | return { 19 | ...fullConfig, 20 | ...partialConfig 21 | }; 22 | } 23 | 24 | } 25 | 26 | const lombokConfigManager = new LombokConfigManager(); 27 | export default lombokConfigManager; 28 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/model/class-model-types.ts: -------------------------------------------------------------------------------- 1 | import {EntityPropertyType} from '@/erdiagram/parser/types/entity-relationship-model-types'; 2 | import { 3 | EntityIdentitySourceMetadata, 4 | EntityPropertySourceMetadata, 5 | EntitySourceMetadata, 6 | RelationshipMemberSourceMetadata 7 | } from '@/erdiagram/converter/oop/model/source-metadata/source-metadata-types'; 8 | 9 | export interface ClassModel { 10 | classes: ClassDescriptor[]; 11 | } 12 | 13 | export interface ClassDescriptor { 14 | name: string; 15 | fields: ClassFieldDescriptor[]; 16 | sourceMetadata: EntitySourceMetadata; 17 | } 18 | 19 | export interface ClassFieldDescriptor { 20 | name: string; 21 | nullable: boolean; 22 | list: boolean; 23 | maxSize?: number; 24 | // Find a better way to represent when a field is an entity or a built-in type 25 | primitiveType?: EntityPropertyType; 26 | entityType?: string; 27 | sourceMetadata: EntityIdentitySourceMetadata | EntityPropertySourceMetadata | RelationshipMemberSourceMetadata; 28 | } 29 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/validation/JavaValidationAnnotationTypesProvider.ts: -------------------------------------------------------------------------------- 1 | import JavaExtendedPackage 2 | from '@/erdiagram/converter/oop/source-code-generator/java/type/JavaExtendedPackage'; 3 | import createJavaSimpleType 4 | from '@/erdiagram/converter/oop/source-code-generator/java/type/simple/createJavaSimpleType'; 5 | 6 | export default class JavaValidationAnnotationTypesProvider { 7 | 8 | private readonly _packageName: string; 9 | 10 | constructor( 11 | javaExtendedPackage: JavaExtendedPackage 12 | ) { 13 | this._packageName = `${javaExtendedPackage}.validation.constraints`; 14 | } 15 | 16 | notNull() { 17 | return createJavaSimpleType('NotNull', this._packageName); 18 | } 19 | 20 | notEmpty() { 21 | return createJavaSimpleType('NotEmpty', this._packageName); 22 | } 23 | 24 | notBlank() { 25 | return createJavaSimpleType('NotBlank', this._packageName); 26 | } 27 | 28 | size() { 29 | return createJavaSimpleType('Size', this._packageName); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/erdiagram/parser/statement/statement-type-guesser.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ENTITY_NAME_LINE_REGEX, 3 | ENTITY_PROPERTY_LINE_REGEX, 4 | RELATIONSHIP_LINE_REGEX 5 | } from '@/erdiagram/parser/statement/statement-types-regexes'; 6 | 7 | export enum StatementType { 8 | ENTITY_NAME = 'entityName', 9 | ENTITY_PROPERTY = 'entityProperty', 10 | RELATIONSHIP = 'relationship', 11 | BLANK_LINE = 'blankLine', 12 | UNKNOWN = 'unknown' 13 | } 14 | 15 | export function guessStatementType(line: string): StatementType { 16 | if (ENTITY_NAME_LINE_REGEX.test(line)) { 17 | return StatementType.ENTITY_NAME; 18 | } else if (ENTITY_PROPERTY_LINE_REGEX.test(line)) { 19 | return StatementType.ENTITY_PROPERTY; 20 | } else if (RELATIONSHIP_LINE_REGEX.test(line)) { 21 | return StatementType.RELATIONSHIP; 22 | } else if (isBlankLine(line)) { 23 | return StatementType.BLANK_LINE; 24 | } else { 25 | return StatementType.UNKNOWN; 26 | } 27 | } 28 | 29 | function isBlankLine(line: string) { 30 | return /^\s*(#.*)?$/.test(line); 31 | } 32 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2023", 4 | "module": "ES2022", 5 | "outDir": "./dist", 6 | "strict": true, 7 | "moduleResolution": "node", 8 | "experimentalDecorators": true, 9 | "esModuleInterop": true, 10 | "allowSyntheticDefaultImports": true, 11 | "sourceMap": true, 12 | "declaration": false, 13 | "declarationMap": false, 14 | "downlevelIteration": true, 15 | "baseUrl": ".", 16 | "paths": { 17 | "@/*": [ 18 | "src/main/*" 19 | ], 20 | "#/*": [ 21 | "src/test/*" 22 | ] 23 | }, 24 | "types": [ 25 | "node", 26 | "jest" 27 | ], 28 | "lib": [ 29 | "esnext", 30 | "dom" 31 | ] 32 | }, 33 | "include": [ 34 | "src" 35 | ], 36 | "exclude": [ 37 | "node_modules", 38 | "node_modules/**", 39 | "src/test/**" 40 | ] 41 | } 42 | -------------------------------------------------------------------------------- /src/test/erdiagram/util/array-utils.unit.spec.ts: -------------------------------------------------------------------------------- 1 | import {removeDuplicates, removeNullableValues} from '@/erdiagram/util/array-utils'; 2 | 3 | describe('Remove duplicates', () => { 4 | 5 | test('Remove duplicated primitive values', () => { 6 | 7 | const array = [1, 2, 3, 4, 3, 2, 1, 2]; 8 | 9 | const result = removeDuplicates(array); 10 | 11 | expect(result).toStrictEqual([1, 2, 3, 4]); 12 | 13 | }); 14 | 15 | test('Remove duplicated objects', () => { 16 | 17 | const objectA = {}; 18 | const objectB = {}; 19 | const objectC = {}; 20 | 21 | const array = [objectA, objectA, objectB, objectC, objectB, objectA, objectC, objectB]; 22 | 23 | const result = removeDuplicates(array); 24 | 25 | expect(result).toStrictEqual([objectA, objectB, objectC]); 26 | 27 | }); 28 | 29 | }); 30 | 31 | test('Remove nullable values', () => { 32 | 33 | const array = [undefined, 1, 2, null, 3, undefined, null, 4, null, 5, undefined]; 34 | 35 | const result = removeNullableValues(array); 36 | 37 | expect(result).toStrictEqual([1, 2, 3, 4, 5]); 38 | 39 | }); 40 | -------------------------------------------------------------------------------- /src/main/erdiagram/parser/config/EntityRelationshipModelParserConfigManager.ts: -------------------------------------------------------------------------------- 1 | import AbstractConfigManager from '@/erdiagram/common/config/AbstractConfigManager'; 2 | import EntityRelationshipModelParserConfig, {PartialEntityRelationshipModelParserConfig} from '@/erdiagram/parser/config/EntityRelationshipModelParserConfig'; 3 | 4 | export class EntityRelationshipModelParserConfigManager 5 | extends AbstractConfigManager { 6 | 7 | getDefaultConfig(): EntityRelationshipModelParserConfig { 8 | return { 9 | allowUnknownEntities: false 10 | }; 11 | } 12 | 13 | mergeConfigs(fullConfig: EntityRelationshipModelParserConfig, partialConfig?: PartialEntityRelationshipModelParserConfig): EntityRelationshipModelParserConfig { 14 | return { 15 | ...fullConfig, 16 | ...partialConfig 17 | }; 18 | } 19 | 20 | } 21 | 22 | const entityRelationshipModelParserConfigManager = new EntityRelationshipModelParserConfigManager(); 23 | export default entityRelationshipModelParserConfigManager; 24 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/source-code-generator/sql/dialect/common/SqlDialect.ts: -------------------------------------------------------------------------------- 1 | import { 2 | TableColumnDescriptor, 3 | TableReferenceDescriptor 4 | } from '@/erdiagram/converter/database/model/database-model-types'; 5 | import { 6 | ForeignKeyColumnCode, 7 | IdColumnCode, 8 | RegularColumnCode 9 | } from '@/erdiagram/converter/database/source-code-generator/sql/dialect/common/sql-script-types'; 10 | 11 | export default interface SqlDialect { 12 | 13 | getScriptStartCode(): string; 14 | 15 | getScriptEndCode(): string; 16 | 17 | mustUseAlterTableForForeignKeys(): boolean; 18 | 19 | getCreateTableStartCode(tableName: string): string; 20 | 21 | getIdColumnCode(tableName: string, identityColumnName: string): IdColumnCode; 22 | 23 | getColumnCode(tableName: string, column: TableColumnDescriptor): RegularColumnCode; 24 | 25 | getForeignColumnCode(tableName: string, reference: TableReferenceDescriptor): ForeignKeyColumnCode; 26 | 27 | getCreateTableEndCode(): string 28 | 29 | getAlterTableAddCode(tableName: string, constraintCode: string): string; 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/annotation/utils/RawAnnotationParameterValue.ts: -------------------------------------------------------------------------------- 1 | import JavaType from '@/erdiagram/converter/oop/source-code-generator/java/type/JavaType'; 2 | import {JavaAnnotationParameterValue} from '@/erdiagram/converter/oop/source-code-generator/java/annotation/annotation-parameter-types'; 3 | 4 | const RAW_ANNOTATION_PARAMETER_VALUE_SYMBOL = Symbol('RawAnnotationParameterValue'); 5 | 6 | export default interface RawAnnotationParameterValue { 7 | [RAW_ANNOTATION_PARAMETER_VALUE_SYMBOL]: true; 8 | code: string; 9 | usedTypes: JavaType[]; 10 | } 11 | 12 | export function createRawParameterValue(code: string, ...usedTypes: JavaType[]): RawAnnotationParameterValue { 13 | return { 14 | [RAW_ANNOTATION_PARAMETER_VALUE_SYMBOL]: true, 15 | code, 16 | usedTypes 17 | }; 18 | } 19 | 20 | export function isRawParameterValue(value: JavaAnnotationParameterValue): value is RawAnnotationParameterValue { 21 | return value != null && typeof value === 'object' && (value as RawAnnotationParameterValue)[RAW_ANNOTATION_PARAMETER_VALUE_SYMBOL]; 22 | } 23 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/type/simple/createJavaSimpleType.ts: -------------------------------------------------------------------------------- 1 | import JavaType from '@/erdiagram/converter/oop/source-code-generator/java/type/JavaType'; 2 | 3 | export default function createJavaSimpleType(name: string, packageName?: string): JavaType { 4 | return new JavaSimpleTypeImpl(name, packageName); 5 | } 6 | 7 | class JavaSimpleTypeImpl implements JavaType { 8 | 9 | private readonly _name: string; 10 | private readonly _packageName?: string; 11 | private readonly _canonicalName: string; 12 | 13 | constructor(name: string, packageName?: string) { 14 | this._name = name; 15 | this._packageName = packageName; 16 | this._canonicalName = packageName ? `${packageName}.${name}` : name; 17 | } 18 | 19 | get canonicalName() { 20 | return this._canonicalName; 21 | } 22 | 23 | get name() { 24 | return this._name; 25 | } 26 | 27 | get packageName() { 28 | return this._packageName; 29 | } 30 | 31 | formatSimple() { 32 | return this._name; 33 | } 34 | 35 | formatCanonical() { 36 | return this._canonicalName; 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/typescript/type/parameterized/createTypeScriptArrayType.ts: -------------------------------------------------------------------------------- 1 | import TypeScriptType from '@/erdiagram/converter/oop/source-code-generator/typescript/type/TypeScriptType'; 2 | import TypeScriptParameterizedType 3 | from '@/erdiagram/converter/oop/source-code-generator/typescript/type/parameterized/TypeScriptParameterizedType'; 4 | 5 | export default function createTypeScriptArrayType(parameterType: TypeScriptType): TypeScriptParameterizedType { 6 | return new TypeScriptArrayTypeImpl(parameterType); 7 | } 8 | 9 | class TypeScriptArrayTypeImpl implements TypeScriptParameterizedType { 10 | 11 | private readonly _parameterType: TypeScriptType; 12 | 13 | constructor(parameterType: TypeScriptType) { 14 | this._parameterType = parameterType; 15 | } 16 | 17 | get name() { 18 | return 'Array'; 19 | } 20 | 21 | get parameterTypes() { 22 | return [this._parameterType]; 23 | } 24 | 25 | format(): string { 26 | const formattedParameterType = this._parameterType.format(); 27 | return `${formattedParameterType}[]`; 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/test/erdiagram/parser/entity-relationship-model-mothers.ts: -------------------------------------------------------------------------------- 1 | import { 2 | EntityDescriptor, 3 | EntityPropertyDescriptor, 4 | EntityPropertyType 5 | } from '@/erdiagram/parser/types/entity-relationship-model-types'; 6 | 7 | export function createEntityWithoutProperties(name: string): EntityDescriptor { 8 | return { 9 | name, 10 | identityPropertyName: undefined, 11 | properties: [] 12 | }; 13 | } 14 | 15 | export type PartialEntityPropertyDescriptor = Partial>; 16 | 17 | export function createEntityProperty(name: string, type: EntityPropertyType, options?: PartialEntityPropertyDescriptor): EntityPropertyDescriptor { 18 | return { 19 | name, 20 | type, 21 | length: options?.length ?? [], 22 | optional: options?.optional ?? false, 23 | unique: options?.unique ?? false 24 | }; 25 | } 26 | 27 | export function createSimpleEntityProperty(name: string, type: EntityPropertyType, length: number[] = []): EntityPropertyDescriptor { 28 | return { 29 | name, 30 | type, 31 | length, 32 | optional: false, 33 | unique: false 34 | }; 35 | } 36 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/common/case-format/StandardCaseFormats.ts: -------------------------------------------------------------------------------- 1 | import LowerCamelCaseFormat from '@/erdiagram/converter/common/case-format/LowerCamelCaseFormat'; 2 | import UpperCamelCaseFormat from '@/erdiagram/converter/common/case-format/UpperCamelCaseFormat'; 3 | import LowerUnderscoreCaseFormat from '@/erdiagram/converter/common/case-format/LowerUnderscoreCaseFormat'; 4 | import CapitalizedUnderscoreCaseFormat from '@/erdiagram/converter/common/case-format/CapitalizedUnderscoreCaseFormat'; 5 | import UpperUnderscoreCaseFormat from '@/erdiagram/converter/common/case-format/UpperUnderscoreCaseFormat'; 6 | import CaseFormat from '@/erdiagram/converter/common/case-format/CaseFormat'; 7 | 8 | const StandardCaseFormats = { 9 | LOWER_CAMEL: new LowerCamelCaseFormat() as CaseFormat, 10 | UPPER_CAMEL: new UpperCamelCaseFormat() as CaseFormat, 11 | LOWER_UNDERSCORE: new LowerUnderscoreCaseFormat() as CaseFormat, 12 | CAPITALIZED_UNDERSCORE: new CapitalizedUnderscoreCaseFormat() as CaseFormat, 13 | UPPER_UNDERSCORE: new UpperUnderscoreCaseFormat() as CaseFormat, 14 | }; 15 | 16 | export default StandardCaseFormats; 17 | -------------------------------------------------------------------------------- /coverage/badge-lines.svg: -------------------------------------------------------------------------------- 1 | Coverage: 100%Coverage100% -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/model/transformer/java-class-model-transformer-context-types.ts: -------------------------------------------------------------------------------- 1 | import {EntityRelationshipModel} from '@/erdiagram/parser/types/entity-relationship-model-types'; 2 | import {ClassDescriptor, ClassFieldDescriptor, ClassModel} from '@/erdiagram/converter/oop/model/class-model-types'; 3 | import {JavaClass, JavaClassModel} from '@/erdiagram/converter/oop/source-code-generator/java/model/java-class-model-types'; 4 | 5 | export interface BaseContext { 6 | entityRelationshipModel: EntityRelationshipModel; 7 | classModel: ClassModel; 8 | javaClassModel: JavaClassModel; 9 | } 10 | 11 | export interface SetupContext extends BaseContext { 12 | 13 | } 14 | 15 | export interface JavaClassModelTransformContext extends BaseContext { 16 | setupData: T; 17 | } 18 | 19 | export interface JavaClassTransformContext extends JavaClassModelTransformContext { 20 | classDescriptor: ClassDescriptor; 21 | } 22 | 23 | export interface JavaFieldTransformContext extends JavaClassTransformContext { 24 | javaClass: JavaClass; 25 | fieldDescriptor: ClassFieldDescriptor; 26 | } 27 | -------------------------------------------------------------------------------- /coverage/badge-branches.svg: -------------------------------------------------------------------------------- 1 | Coverage: 100%Coverage100% -------------------------------------------------------------------------------- /coverage/badge-functions.svg: -------------------------------------------------------------------------------- 1 | Coverage: 100%Coverage100% -------------------------------------------------------------------------------- /coverage/badge-statements.svg: -------------------------------------------------------------------------------- 1 | Coverage: 100%Coverage100% -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/jpa/transformer/JpaTransformerBuilder.ts: -------------------------------------------------------------------------------- 1 | import DatabaseModelGenerator from '@/erdiagram/converter/database/model/DatabaseModelGenerator'; 2 | import {PartialDatabaseModelConfig} from '@/erdiagram/converter/database/model/config/DatabaseModelConfig'; 3 | import {PartialJpaConfig} from '@/erdiagram/converter/oop/source-code-generator/java/jpa/config/JpaConfig'; 4 | import {JpaTransformer} from '@/erdiagram/converter/oop/source-code-generator/java/jpa/transformer/JpaTransformer'; 5 | 6 | export default class JpaTransformerBuilder { 7 | 8 | private _databaseModelConfig: PartialDatabaseModelConfig = {}; 9 | private _config: PartialJpaConfig = {}; 10 | 11 | public configureDatabaseModel(config: PartialDatabaseModelConfig) { 12 | this._databaseModelConfig = config; 13 | return this; 14 | } 15 | 16 | public configureJpa(config: PartialJpaConfig) { 17 | this._config = config; 18 | return this; 19 | } 20 | 21 | public build() { 22 | return new JpaTransformer( 23 | new DatabaseModelGenerator(this._databaseModelConfig), 24 | this._config 25 | ); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Néstor Pérez González 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/model/class/field/RelationshipMemberToClassFieldMapper.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Cardinality, 3 | RelationshipDescriptor, 4 | RelationshipMember 5 | } from '@/erdiagram/parser/types/entity-relationship-model-types'; 6 | import {ClassFieldDescriptor} from '@/erdiagram/converter/oop/model/class-model-types'; 7 | import pluralize from 'pluralize'; 8 | import {SourceType} from '@/erdiagram/converter/oop/model/source-metadata/source-metadata-types'; 9 | 10 | export default class RelationshipMemberToClassFieldMapper { 11 | 12 | public mapRelationshipMemberToField(relationship: RelationshipDescriptor, toMember: RelationshipMember): ClassFieldDescriptor { 13 | 14 | const list = toMember.cardinality === Cardinality.MANY; 15 | const name = list ? pluralize(toMember.entityAlias) : toMember.entityAlias; 16 | 17 | return { 18 | name, 19 | nullable: toMember.cardinality === Cardinality.ZERO_OR_ONE, 20 | entityType: toMember.entity, 21 | list, 22 | sourceMetadata: { 23 | sourceType: SourceType.RELATIONSHIP_MEMBER, 24 | relationship, 25 | referencedMember: toMember 26 | } 27 | }; 28 | 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/erdiagram/common/config/AbstractConfigManager.ts: -------------------------------------------------------------------------------- 1 | import ConfigManager from '@/erdiagram/common/config/ConfigManager'; 2 | import {JsonAdapter, JsonAdapters, JsonValue} from 'true-json'; 3 | 4 | export default abstract class AbstractConfigManager> implements ConfigManager { 5 | 6 | private readonly _jsonAdapter: JsonAdapter; 7 | 8 | constructor() { 9 | this._jsonAdapter = this.getJsonAdapter(); 10 | } 11 | 12 | abstract getDefaultConfig(): C; 13 | 14 | abstract mergeConfigs(fullConfig: C, partialConfig?: P): C; 15 | 16 | mergeWithDefaultConfig(partialConfig?: P): C { 17 | return this.mergeConfigs(this.getDefaultConfig(), partialConfig); 18 | } 19 | 20 | convertToSerializableObject(fullConfig: C): JsonValue { 21 | return this._jsonAdapter.adaptToJson(fullConfig); 22 | } 23 | 24 | convertFromSerializableObject(serializableConfig: JsonValue): C { 25 | return this._jsonAdapter.recoverFromJson(serializableConfig); 26 | } 27 | 28 | protected getJsonAdapter(): JsonAdapter { 29 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 30 | return JsonAdapters.identity(); 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/model/class/field/EntityPropertyToClassFieldMapper.ts: -------------------------------------------------------------------------------- 1 | import {ClassFieldDescriptor} from '@/erdiagram/converter/oop/model/class-model-types'; 2 | import { 3 | EntityDescriptor, 4 | EntityPropertyDescriptor, 5 | EntityPropertyType 6 | } from '@/erdiagram/parser/types/entity-relationship-model-types'; 7 | import {SourceType} from '@/erdiagram/converter/oop/model/source-metadata/source-metadata-types'; 8 | 9 | const TYPES_WITH_MAX_SIZE_SUPPORT = [EntityPropertyType.TEXT, EntityPropertyType.BLOB]; 10 | 11 | export default class EntityPropertyToClassFieldMapper { 12 | 13 | public mapPropertyToField(entity: EntityDescriptor, property: EntityPropertyDescriptor): ClassFieldDescriptor { 14 | 15 | const { 16 | name, 17 | optional, 18 | type, 19 | length 20 | } = property; 21 | 22 | return { 23 | name, 24 | nullable: optional, 25 | primitiveType: type, 26 | list: false, 27 | maxSize: TYPES_WITH_MAX_SIZE_SUPPORT.includes(type) ? length[0] : undefined, 28 | sourceMetadata: { 29 | sourceType: SourceType.ENTITY_PROPERTY, 30 | entity, 31 | property 32 | } 33 | }; 34 | 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/model/database-model-types.ts: -------------------------------------------------------------------------------- 1 | import {EntityPropertyType} from '@/erdiagram/parser/types/entity-relationship-model-types'; 2 | import { 3 | EntityPropertySourceMetadata, 4 | EntitySourceMetadata, 5 | RelationshipMemberSourceMetadata, 6 | RelationshipSourceMetadata 7 | } from '@/erdiagram/converter/oop/model/source-metadata/source-metadata-types'; 8 | 9 | export interface DatabaseModel { 10 | tables: TableDescriptor[]; 11 | } 12 | 13 | export interface TableDescriptor { 14 | name: string; 15 | identityColumnName: string; 16 | columns: TableColumnDescriptor[]; 17 | references: TableReferenceDescriptor[]; 18 | sourceMetadata: EntitySourceMetadata | RelationshipSourceMetadata; 19 | } 20 | 21 | export interface TableColumnDescriptor { 22 | name: string; 23 | notNull: boolean; 24 | unique: boolean; 25 | type: EntityPropertyType; 26 | length: number[]; 27 | sourceMetadata: EntityPropertySourceMetadata; 28 | } 29 | 30 | export interface TableReferenceDescriptor { 31 | columnName: string; 32 | targetTableName: string; 33 | targetTableIdentityColumnName: string; 34 | notNull: boolean; 35 | unique: boolean; 36 | sourceMetadata: RelationshipMemberSourceMetadata; 37 | } 38 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/diagram/nomnoml/entity/NomnomlEntityPropertyCodeGenerator.ts: -------------------------------------------------------------------------------- 1 | import {EntityPropertyDescriptor, EntityPropertyType} from '@/erdiagram/parser/types/entity-relationship-model-types'; 2 | 3 | export default class NomnomlEntityPropertyCodeGenerator { 4 | 5 | public generateEntityPropertyCode(property: EntityPropertyDescriptor): string { 6 | 7 | const { 8 | name, 9 | type, 10 | length, 11 | optional, 12 | unique 13 | } = property; 14 | 15 | const typeWithLengthCode = this.getTypeWithLengthCode(type, length); 16 | 17 | const modifiersCode = this.getModifiersCode(optional, unique); 18 | 19 | return `${name}${modifiersCode}: ${typeWithLengthCode}`; 20 | 21 | } 22 | 23 | private getTypeWithLengthCode(type: EntityPropertyType, length: number[]): string { 24 | 25 | if (length.length === 0) { 26 | return type; 27 | } 28 | 29 | return `${type}(${length.join(', ')})`; 30 | 31 | } 32 | 33 | private getModifiersCode(optional: boolean, unique: boolean) { 34 | 35 | const optionalModifierCode = optional ? '?' : ''; 36 | const uniqueModifierCode = unique ? '!' : ''; 37 | 38 | return optionalModifierCode + uniqueModifierCode; 39 | 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /src/main/erdiagram/parser/types/parsed-entity-relationship-model-types.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Direction, 3 | EntityPropertyType, 4 | RelationshipMember 5 | } from '@/erdiagram/parser/types/entity-relationship-model-types'; 6 | 7 | export interface EntityRelationshipModelParseResult { 8 | model: ParsedEntityRelationshipModel; 9 | statementResultToLineMap: Map; 10 | } 11 | 12 | export type ParsedStatementResult = 13 | ParsedEntityDescriptor 14 | | ParsedEntityPropertyDescriptor 15 | | ParsedRelationshipDescriptor; 16 | 17 | export interface ParsedEntityRelationshipModel { 18 | entities: ParsedEntityDescriptor[]; 19 | relationships: ParsedRelationshipDescriptor[]; 20 | } 21 | 22 | export interface ParsedEntityDescriptor { 23 | name: string; 24 | properties: ParsedEntityPropertyDescriptor[]; 25 | } 26 | 27 | export interface ParsedEntityPropertyDescriptor { 28 | name: string; 29 | optional: boolean; 30 | unique: boolean; 31 | type: EntityPropertyType; 32 | length: number[]; 33 | } 34 | 35 | export interface ParsedRelationshipDescriptor { 36 | leftMember: RelationshipMember; 37 | rightMember: RelationshipMember; 38 | direction: Direction; 39 | relationshipName?: string; 40 | } 41 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/diagram/plantuml/entity/PlantUmlEntityPropertyCodeGenerator.ts: -------------------------------------------------------------------------------- 1 | import {EntityPropertyDescriptor, EntityPropertyType} from '@/erdiagram/parser/types/entity-relationship-model-types'; 2 | 3 | export default class PlantUmlEntityPropertyCodeGenerator { 4 | 5 | public generateEntityPropertyCode(property: EntityPropertyDescriptor): string { 6 | 7 | const { 8 | name, 9 | type, 10 | length, 11 | optional, 12 | unique 13 | } = property; 14 | 15 | const typeWithLengthCode = this.getTypeWithLengthCode(type, length); 16 | 17 | const modifiersCode = this.getModifiersCode(optional, unique); 18 | 19 | return `{field} ${name}${modifiersCode}: ${typeWithLengthCode}`; 20 | 21 | } 22 | 23 | private getTypeWithLengthCode(type: EntityPropertyType, length: number[]): string { 24 | 25 | if (length.length === 0) { 26 | return type; 27 | } 28 | 29 | return `${type}(${length.join(', ')})`; 30 | 31 | } 32 | 33 | private getModifiersCode(optional: boolean, unique: boolean) { 34 | 35 | const optionalModifierCode = optional ? '?' : ''; 36 | const uniqueModifierCode = unique ? '!' : ''; 37 | 38 | return optionalModifierCode + uniqueModifierCode; 39 | 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | browser: true, 5 | es2021: true, 6 | node: true 7 | }, 8 | extends: [ 9 | 'eslint:recommended', 10 | 'plugin:@typescript-eslint/recommended' 11 | ], 12 | parser: '@typescript-eslint/parser', 13 | parserOptions: { 14 | ecmaVersion: 12, 15 | sourceType: 'module' 16 | }, 17 | plugins: [ 18 | '@typescript-eslint' 19 | ], 20 | rules: { 21 | 'no-console': 'error', 22 | '@typescript-eslint/naming-convention': [ 23 | // TODO enable and fix the errors at some point 24 | 'off', 25 | { 26 | selector: 'memberLike', 27 | modifiers: [ 28 | 'private' 29 | ], 30 | format: [ 31 | 'camelCase' 32 | ], 33 | 'leadingUnderscore': 'require' 34 | } 35 | ] 36 | }, 37 | overrides: [ 38 | { 39 | files: [ 40 | 'src/test/**/*.spec.ts' 41 | ], 42 | env: { 43 | jest: true 44 | } 45 | } 46 | ] 47 | } 48 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/code/JavaClassModelCodeGenerator.ts: -------------------------------------------------------------------------------- 1 | import { 2 | JavaClass, 3 | JavaClassModel 4 | } from '@/erdiagram/converter/oop/source-code-generator/java/model/java-class-model-types'; 5 | import JavaClassCodeGenerator from '@/erdiagram/converter/oop/source-code-generator/java/code/JavaClassCodeGenerator'; 6 | 7 | export default class JavaClassModelCodeGenerator { 8 | 9 | private readonly _javaClassCodeGenerator: JavaClassCodeGenerator; 10 | 11 | constructor(javaClassCodeGenerator: JavaClassCodeGenerator) { 12 | this._javaClassCodeGenerator = javaClassCodeGenerator; 13 | } 14 | 15 | public generateCode(javaClassModel: JavaClassModel): string { 16 | return javaClassModel.classes 17 | .map(javaClass => this.generateClassCode(javaClass)) 18 | .join('\n\n'); 19 | } 20 | 21 | private generateClassCode(javaClass: JavaClass) { 22 | const headerComment = this.generateClassHeaderComment(javaClass); 23 | const classCode = this._javaClassCodeGenerator.generateCode(javaClass); 24 | return `${headerComment}\n\n${classCode}`; 25 | } 26 | 27 | private generateClassHeaderComment(javaClass: JavaClass) { 28 | return `/* ========== ${javaClass.name} class ========== */`; 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /scripts/utils/colorize.js: -------------------------------------------------------------------------------- 1 | function black(str) { 2 | return colorize('black', str); 3 | } 4 | 5 | function red(str) { 6 | return colorize('red', str); 7 | } 8 | 9 | function green(str) { 10 | return colorize('green', str); 11 | } 12 | 13 | function yellow(str) { 14 | return colorize('yellow', str); 15 | } 16 | 17 | function blue(str) { 18 | return colorize('blue', str); 19 | } 20 | 21 | function magenta(str) { 22 | return colorize('magenta', str); 23 | } 24 | 25 | function cyan(str) { 26 | return colorize('cyan', str); 27 | } 28 | 29 | function white(str) { 30 | return colorize('white', str); 31 | } 32 | 33 | function colorize(colorName, str) { 34 | 35 | const ConsoleColors = { 36 | black: '\x1b[30m', 37 | red: '\x1b[31m', 38 | green: '\x1b[32m', 39 | yellow: '\x1b[33m', 40 | blue: '\x1b[34m', 41 | magenta: '\x1b[35m', 42 | cyan: '\x1b[36m', 43 | white: '\x1b[37m' 44 | }; 45 | 46 | const BOLD_START = '\x1b[1m'; 47 | const BOLD_END = '\x1b[22m'; 48 | const COLOR_RESET = '\x1b[39m'; 49 | 50 | return `${BOLD_START}${ConsoleColors[colorName]}${str}${COLOR_RESET}${BOLD_END}`; 51 | 52 | } 53 | 54 | module.exports = { 55 | black, 56 | red, 57 | green, 58 | yellow, 59 | blue, 60 | magenta, 61 | cyan, 62 | white, 63 | }; 64 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/model/config/ClassModelConfigManager.ts: -------------------------------------------------------------------------------- 1 | import AbstractConfigManager from '@/erdiagram/common/config/AbstractConfigManager'; 2 | import ClassModelConfig, {PartialClassModelConfig} from '@/erdiagram/converter/oop/model/config/ClassModelConfig'; 3 | import StandardIdNamingStrategies from '@/erdiagram/converter/common/id-naming-strategy/StandardIdNamingStrategies'; 4 | import {JsonAdapter, JsonAdapters} from 'true-json'; 5 | 6 | export class ClassModelConfigManager extends AbstractConfigManager { 7 | 8 | getDefaultConfig(): ClassModelConfig { 9 | return { 10 | idNamingStrategy: StandardIdNamingStrategies.DEFAULT 11 | }; 12 | } 13 | 14 | mergeConfigs(fullConfig: ClassModelConfig, partialConfig?: PartialClassModelConfig): ClassModelConfig { 15 | return { 16 | ...fullConfig, 17 | ...partialConfig 18 | }; 19 | } 20 | 21 | protected getJsonAdapter(): JsonAdapter { 22 | return JsonAdapters.object({ 23 | idNamingStrategy: JsonAdapters.byKeyLenient(StandardIdNamingStrategies, 'DEFAULT') 24 | }); 25 | } 26 | 27 | } 28 | 29 | const classModelConfigManager = new ClassModelConfigManager(); 30 | export default classModelConfigManager; 31 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/oop/source-code-generator/java/validation/JavaValidationAnnotationTypesProvider.unit.spec.ts: -------------------------------------------------------------------------------- 1 | import JavaValidationAnnotationTypesProvider 2 | from '@/erdiagram/converter/oop/source-code-generator/java/validation/JavaValidationAnnotationTypesProvider'; 3 | import JavaExtendedPackage 4 | from '@/erdiagram/converter/oop/source-code-generator/java/type/JavaExtendedPackage'; 5 | import createJavaSimpleType 6 | from '@/erdiagram/converter/oop/source-code-generator/java/type/simple/createJavaSimpleType'; 7 | 8 | test.each([ 9 | [JavaExtendedPackage.JAVAX, 'javax.validation.constraints'], 10 | [JavaExtendedPackage.JAKARTA, 'jakarta.validation.constraints'] 11 | ])('%s package (%s)', (javaExtendedPackage, expectedPackageName) => { 12 | 13 | const provider = new JavaValidationAnnotationTypesProvider(javaExtendedPackage); 14 | 15 | expect(provider.notNull()).toStrictEqual(createJavaSimpleType('NotNull', expectedPackageName)); 16 | expect(provider.notEmpty()).toStrictEqual(createJavaSimpleType('NotEmpty', expectedPackageName)); 17 | expect(provider.notBlank()).toStrictEqual(createJavaSimpleType('NotBlank', expectedPackageName)); 18 | expect(provider.size()).toStrictEqual(createJavaSimpleType('Size', expectedPackageName)); 19 | 20 | }); 21 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/model/ClassModelGenerator.ts: -------------------------------------------------------------------------------- 1 | import {ClassModel} from '@/erdiagram/converter/oop/model/class-model-types'; 2 | import {EntityRelationshipModel} from '@/erdiagram/parser/types/entity-relationship-model-types'; 3 | import ClassModelConfig, {PartialClassModelConfig} from '@/erdiagram/converter/oop/model/config/ClassModelConfig'; 4 | import classModelConfigManager from '@/erdiagram/converter/oop/model/config/ClassModelConfigManager'; 5 | import EntityToClassMapper from '@/erdiagram/converter/oop/model/class/EntityToClassMapper'; 6 | 7 | export default class ClassModelGenerator { 8 | 9 | private readonly config: ClassModelConfig; 10 | private readonly entityToClassMapper: EntityToClassMapper; 11 | 12 | constructor(config?: PartialClassModelConfig) { 13 | this.config = classModelConfigManager.mergeWithDefaultConfig(config); 14 | this.entityToClassMapper = new EntityToClassMapper(this.config); 15 | } 16 | 17 | generateClassModel(model: EntityRelationshipModel): ClassModel { 18 | 19 | const { 20 | entities, 21 | relationships 22 | } = model; 23 | 24 | const classes = entities.map(entity => this.entityToClassMapper.mapEntityToClass(entity, relationships)); 25 | 26 | return { 27 | classes 28 | }; 29 | 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/jpa/transformer/finder/ClassModelSourceFinder.ts: -------------------------------------------------------------------------------- 1 | import {isRelationshipMemberSourceMetadata} from '@/erdiagram/converter/oop/model/source-metadata/source-metadata-utils'; 2 | import {RelationshipMember} from '@/erdiagram/parser/types/entity-relationship-model-types'; 3 | import {ClassFieldDescriptor, ClassModel} from '@/erdiagram/converter/oop/model/class-model-types'; 4 | 5 | export default class ClassModelSourceFinder { 6 | 7 | public findClassAndFieldFromReferencedMember(classModel: ClassModel, referencedMember: RelationshipMember) { 8 | 9 | for (const classDescriptor of classModel.classes) { 10 | 11 | const foundField = classDescriptor.fields.find(field => this.isCorrespondingField(field, referencedMember)); 12 | 13 | if (foundField != null) { 14 | return { 15 | classDescriptor, 16 | field: foundField 17 | }; 18 | } 19 | 20 | } 21 | 22 | throw new Error(`Cannot find field from target member "${referencedMember.entityAlias}"`); 23 | 24 | } 25 | 26 | private isCorrespondingField(field: ClassFieldDescriptor, referencedMember: RelationshipMember) { 27 | return isRelationshipMemberSourceMetadata(field.sourceMetadata) && field.sourceMetadata.referencedMember === referencedMember; 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/typescript/type/parameterized/createTypeScriptParameterizedType.ts: -------------------------------------------------------------------------------- 1 | import TypeScriptType from '@/erdiagram/converter/oop/source-code-generator/typescript/type/TypeScriptType'; 2 | import TypeScriptParameterizedType 3 | from '@/erdiagram/converter/oop/source-code-generator/typescript/type/parameterized/TypeScriptParameterizedType'; 4 | 5 | export default function createTypeScriptParameterizedType(name: string, parameterTypes: TypeScriptType[]): TypeScriptParameterizedType { 6 | return new TypeScriptParameterizedTypeImpl(name, parameterTypes); 7 | } 8 | 9 | class TypeScriptParameterizedTypeImpl implements TypeScriptParameterizedType { 10 | 11 | private readonly _name: string; 12 | private readonly _parameterTypes: TypeScriptType[]; 13 | 14 | constructor(name: string, parameterTypes: TypeScriptType[]) { 15 | this._name = name; 16 | this._parameterTypes = parameterTypes; 17 | } 18 | 19 | get name() { 20 | return this._name; 21 | } 22 | 23 | get parameterTypes() { 24 | return this._parameterTypes; 25 | } 26 | 27 | format(): string { 28 | const formattedParameterTypes = this._parameterTypes.map(parameterType => parameterType.format()).join(', '); 29 | return `${this._name}<${formattedParameterTypes}>`; 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/common/source-metadata-instances.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Cardinality, 3 | Direction, 4 | EntityDescriptor, 5 | EntityPropertyDescriptor, 6 | EntityPropertyType, 7 | EntityRelationshipModel, 8 | RelationshipDescriptor, 9 | RelationshipMember 10 | } from '@/erdiagram/parser/types/entity-relationship-model-types'; 11 | 12 | export const dummySourceProperty: EntityPropertyDescriptor = { 13 | name: 'dummySourceProperty', 14 | type: EntityPropertyType.BOOLEAN, 15 | length: [], 16 | optional: false, 17 | unique: false 18 | }; 19 | 20 | export const dummySourceEntity: EntityDescriptor = { 21 | name: 'DummySourceEntity', 22 | properties: [ 23 | dummySourceProperty 24 | ] 25 | }; 26 | 27 | export const dummySourceRelationshipMember: RelationshipMember = { 28 | entity: dummySourceEntity.name, 29 | cardinality: Cardinality.MANY, 30 | entityAlias: 'dummySourceEntity' 31 | }; 32 | 33 | export const dummySourceRelationship: RelationshipDescriptor = { 34 | direction: Direction.BIDIRECTIONAL, 35 | leftMember: dummySourceRelationshipMember, 36 | rightMember: dummySourceRelationshipMember 37 | }; 38 | 39 | export const dummySourceEntityRelationshipModel: EntityRelationshipModel = { 40 | entities: [dummySourceEntity], 41 | relationships: [dummySourceRelationship] 42 | }; 43 | -------------------------------------------------------------------------------- /src/test/erdiagram/parser/config/EntityRelationshipModelParserConfigManager.unit.spec.ts: -------------------------------------------------------------------------------- 1 | import {EntityRelationshipModelParserConfigManager} from '@/erdiagram/parser/config/EntityRelationshipModelParserConfigManager'; 2 | import EntityRelationshipModelParserConfig from '@/erdiagram/parser/config/EntityRelationshipModelParserConfig'; 3 | import {JsonValue} from 'true-json'; 4 | 5 | const configManager = new EntityRelationshipModelParserConfigManager(); 6 | 7 | describe('Serialization', () => { 8 | 9 | [true, false].forEach(allowUnknownEntities => { 10 | 11 | const config: EntityRelationshipModelParserConfig = { 12 | allowUnknownEntities 13 | }; 14 | 15 | const serializableConfig: JsonValue = { 16 | allowUnknownEntities 17 | }; 18 | 19 | test(`Convert to serializable object (allowUnknownEntities = ${allowUnknownEntities})`, () => { 20 | 21 | const result = configManager.convertToSerializableObject(config); 22 | 23 | expect(result).toStrictEqual(serializableConfig); 24 | 25 | }); 26 | 27 | test(`Convert from serializable object (allowUnknownEntities = ${allowUnknownEntities})`, () => { 28 | 29 | const result = configManager.convertFromSerializableObject(serializableConfig); 30 | 31 | expect(result).toStrictEqual(config); 32 | 33 | }); 34 | 35 | }); 36 | 37 | }); 38 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/source-code-generator/SqlSourceCodeGeneratorBuilder.ts: -------------------------------------------------------------------------------- 1 | import {PartialDatabaseModelConfig} from '@/erdiagram/converter/database/model/config/DatabaseModelConfig'; 2 | import SqlDialect from '@/erdiagram/converter/database/source-code-generator/sql/dialect/common/SqlDialect'; 3 | import DatabaseModelGenerator from '@/erdiagram/converter/database/model/DatabaseModelGenerator'; 4 | import SqlSourceCodeGenerator from '@/erdiagram/converter/database/source-code-generator/SqlSourceCodeGenerator'; 5 | import DatabaseModelToSqlCodeConverter 6 | from '@/erdiagram/converter/database/source-code-generator/sql/DatabaseModelToSqlCodeConverter'; 7 | 8 | export default class SqlSourceCodeGeneratorBuilder { 9 | 10 | private readonly _sqlDialect: SqlDialect; 11 | private _databaseModelConfig: PartialDatabaseModelConfig = {}; 12 | 13 | constructor(sqlDialect: SqlDialect) { 14 | this._sqlDialect = sqlDialect; 15 | } 16 | 17 | public configureDatabaseModel(config: PartialDatabaseModelConfig) { 18 | this._databaseModelConfig = config; 19 | return this; 20 | } 21 | 22 | public build() { 23 | return new SqlSourceCodeGenerator( 24 | new DatabaseModelGenerator(this._databaseModelConfig), 25 | new DatabaseModelToSqlCodeConverter(this._sqlDialect) 26 | ); 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/model/config/DatabaseModelConfigManager.ts: -------------------------------------------------------------------------------- 1 | import AbstractConfigManager from '@/erdiagram/common/config/AbstractConfigManager'; 2 | import DatabaseModelConfig, {PartialDatabaseModelConfig} from '@/erdiagram/converter/database/model/config/DatabaseModelConfig'; 3 | import StandardIdNamingStrategies from '@/erdiagram/converter/common/id-naming-strategy/StandardIdNamingStrategies'; 4 | import {JsonAdapter, JsonAdapters} from 'true-json'; 5 | 6 | export class DatabaseModelConfigManager extends AbstractConfigManager { 7 | 8 | getDefaultConfig(): DatabaseModelConfig { 9 | return { 10 | usePluralTableNames: false, 11 | idNamingStrategy: StandardIdNamingStrategies.DEFAULT 12 | }; 13 | } 14 | 15 | mergeConfigs(fullConfig: DatabaseModelConfig, partialConfig?: PartialDatabaseModelConfig): DatabaseModelConfig { 16 | return { 17 | ...fullConfig, 18 | ...partialConfig 19 | }; 20 | } 21 | 22 | protected getJsonAdapter(): JsonAdapter { 23 | return JsonAdapters.object({ 24 | idNamingStrategy: JsonAdapters.byKeyLenient(StandardIdNamingStrategies, 'DEFAULT') 25 | }); 26 | } 27 | 28 | } 29 | 30 | const databaseModelConfigManager = new DatabaseModelConfigManager(); 31 | export default databaseModelConfigManager; 32 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/model/java-class-model-types.ts: -------------------------------------------------------------------------------- 1 | import JavaType from '@/erdiagram/converter/oop/source-code-generator/java/type/JavaType'; 2 | import JavaAnnotation from '@/erdiagram/converter/oop/source-code-generator/java/annotation/JavaAnnotation'; 3 | 4 | export interface JavaClassModel { 5 | classes: JavaClass[]; 6 | } 7 | 8 | export interface JavaAnnotatedElement { 9 | annotations: JavaAnnotation[]; 10 | } 11 | 12 | export interface JavaAccessibleElement { 13 | visibility: JavaVisibility; 14 | } 15 | 16 | export enum JavaVisibility { 17 | PRIVATE = 'private', 18 | PROTECTED = 'protected', 19 | PUBLIC = 'public', 20 | PACKAGE_PRIVATE = 'package-private' 21 | } 22 | 23 | export interface JavaClass extends JavaAnnotatedElement, JavaAccessibleElement { 24 | packageName?: string; 25 | name: string; 26 | fields: JavaField[]; 27 | } 28 | 29 | export interface JavaField extends JavaAnnotatedElement, JavaAccessibleElement { 30 | name: string; 31 | type: JavaType; 32 | getter?: JavaFieldGetter; 33 | setter?: JavaFieldSetter; 34 | } 35 | 36 | export interface JavaFieldGetter extends JavaAnnotatedElement, JavaAccessibleElement { 37 | name: string; 38 | } 39 | 40 | export interface JavaFieldSetter extends JavaAnnotatedElement, JavaAccessibleElement { 41 | name: string; 42 | fluent: boolean; 43 | } 44 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/model/class/field/EntityToIdClassFieldMapper.ts: -------------------------------------------------------------------------------- 1 | import {ClassFieldDescriptor} from '@/erdiagram/converter/oop/model/class-model-types'; 2 | import {EntityDescriptor, EntityPropertyType} from '@/erdiagram/parser/types/entity-relationship-model-types'; 3 | import IdNamingStrategy from '@/erdiagram/converter/common/id-naming-strategy/IdNamingStrategy'; 4 | import {SourceType} from '@/erdiagram/converter/oop/model/source-metadata/source-metadata-types'; 5 | 6 | export default class EntityToIdClassFieldMapper { 7 | 8 | constructor( 9 | private readonly idNamingStrategy: IdNamingStrategy 10 | ) { 11 | 12 | } 13 | 14 | public mapEntityToIdClassField(entity: EntityDescriptor): ClassFieldDescriptor { 15 | return { 16 | name: this.getIdentityFieldName(entity), 17 | primitiveType: EntityPropertyType.IDENTITY, 18 | // ID field must be nullable, so NULL value can be used to represent an unsaved instance 19 | nullable: true, 20 | list: false, 21 | sourceMetadata: { 22 | sourceType: SourceType.ENTITY_IDENTITY, 23 | entity 24 | } 25 | }; 26 | } 27 | 28 | private getIdentityFieldName(entity: EntityDescriptor) { 29 | 30 | if (entity.identityPropertyName) { 31 | return entity.identityPropertyName; 32 | } 33 | 34 | const {idNamingStrategy} = this; 35 | return idNamingStrategy(entity.name); 36 | 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /src/main/erdiagram/parser/types/error/exports.ts: -------------------------------------------------------------------------------- 1 | import ERDiagramError from './ERDiagramError'; 2 | import ERDiagramParseLineError from './ERDiagramParseLineError'; 3 | import ERDiagramSyntaxError from './ERDiagramSyntaxError'; 4 | import ERDiagramUnknownTypeError from './ERDiagramUnknownTypeError'; 5 | import ERDiagramRelationshipError from './ERDiagramRelationshipError'; 6 | import ERDiagramUnknownEntityError from './ERDiagramUnknownEntityError'; 7 | import ERDiagramEntityError from './ERDiagramEntityError'; 8 | import ERDiagramDuplicatedEntityNameError from './ERDiagramDuplicatedEntityNameError'; 9 | import ERDiagramEntityPropertyError from './ERDiagramEntityPropertyError'; 10 | import ERDiagramMultipleIdentitiesError from './ERDiagramMultipleIdentitiesError'; 11 | import ERDiagramInvalidIdentityDefinitionError from './ERDiagramInvalidIdentityDefinitionError'; 12 | import ERDiagramDuplicatedPropertyNameError from './ERDiagramDuplicatedPropertyNameError'; 13 | 14 | export { 15 | ERDiagramError, 16 | ERDiagramParseLineError, 17 | ERDiagramSyntaxError, 18 | ERDiagramUnknownTypeError, 19 | ERDiagramRelationshipError, 20 | ERDiagramUnknownEntityError, 21 | ERDiagramEntityError, 22 | ERDiagramDuplicatedEntityNameError, 23 | ERDiagramEntityPropertyError, 24 | ERDiagramMultipleIdentitiesError, 25 | ERDiagramInvalidIdentityDefinitionError, 26 | ERDiagramDuplicatedPropertyNameError 27 | }; 28 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/model/generator/source/JavaClassModelDescriptorsRepositoryBuilder.ts: -------------------------------------------------------------------------------- 1 | import {JavaClass, JavaField} from '@/erdiagram/converter/oop/source-code-generator/java/model/java-class-model-types'; 2 | import {ClassDescriptor, ClassFieldDescriptor} from '@/erdiagram/converter/oop/model/class-model-types'; 3 | import JavaClassModelDescriptorsRepository 4 | from '@/erdiagram/converter/oop/source-code-generator/java/model/generator/source/JavaClassModelDescriptorsRepository'; 5 | 6 | export default class JavaClassModelDescriptorsRepositoryBuilder { 7 | 8 | private readonly _classDescriptorsMap = new Map(); 9 | private readonly _fieldDescriptorsMap = new Map(); 10 | 11 | public addClass(javaClass: JavaClass, classDescriptor: ClassDescriptor): this { 12 | this._classDescriptorsMap.set(javaClass, classDescriptor); 13 | return this; 14 | } 15 | 16 | public addField(javaField: JavaField, fieldDescriptor: ClassFieldDescriptor): this { 17 | this._fieldDescriptorsMap.set(javaField, fieldDescriptor); 18 | return this; 19 | } 20 | 21 | public build(): JavaClassModelDescriptorsRepository { 22 | return new JavaClassModelDescriptorsRepository( 23 | new Map(this._classDescriptorsMap.entries()), 24 | new Map(this._fieldDescriptorsMap.entries()) 25 | ); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/test/erdiagram/util/jest-utils.ts: -------------------------------------------------------------------------------- 1 | import Mock = jest.Mock; 2 | 3 | export type MockObject = T & PublicMembersMocks; 4 | 5 | export type PublicMembersMocks = { 6 | [P in keyof T]: T[P] extends (...args: infer A) => infer R ? Mock : T[P]; 7 | }; 8 | 9 | export function createMockObject(publicMembersMocks: PublicMembersMocks): MockObject { 10 | return new Proxy>(publicMembersMocks, { 11 | get(target, property) { 12 | 13 | if (!Object.hasOwn(target, property)) { 14 | throw new Error(`Accessing a non-mocked property "${property.toString()}"`); 15 | } 16 | 17 | return target[property as keyof T]; 18 | 19 | } 20 | }) as MockObject; 21 | } 22 | 23 | type ProxyTarget = Record; 24 | 25 | export function createMockProxy(): MockObject { 26 | return new Proxy({}, { 27 | get(target, property: keyof ProxyTarget) { 28 | 29 | if (!Object.hasOwn(target, property)) { 30 | target[property] = jest.fn(); 31 | } 32 | 33 | return target[property]; 34 | 35 | } 36 | }) as MockObject; 37 | } 38 | 39 | export function checkAllMockCalls(mockFn: Mock, callsArgs: A[]) { 40 | 41 | expect(mockFn).toHaveBeenCalledTimes(callsArgs.length); 42 | 43 | callsArgs.forEach((args, index) => { 44 | expect(mockFn).toHaveBeenNthCalledWith(index + 1, ...args); 45 | }); 46 | 47 | } 48 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/typescript/TypeScriptSourceCodeGeneratorBuilder.ts: -------------------------------------------------------------------------------- 1 | import ClassModelGenerator from '@/erdiagram/converter/oop/model/ClassModelGenerator'; 2 | import {PartialClassModelConfig} from '@/erdiagram/converter/oop/model/config/ClassModelConfig'; 3 | import TypeScriptClassModelToCodeConverter 4 | from '@/erdiagram/converter/oop/source-code-generator/typescript/TypeScriptClassModelToCodeConverter'; 5 | import {PartialTypeScriptConfig} from '@/erdiagram/converter/oop/source-code-generator/typescript/config/TypeScriptConfig'; 6 | import TypeScriptSourceCodeGenerator 7 | from '@/erdiagram/converter/oop/source-code-generator/typescript/TypeScriptSourceCodeGenerator'; 8 | 9 | export default class TypeScriptSourceCodeGeneratorBuilder { 10 | 11 | private _classModelConfig: PartialClassModelConfig = {}; 12 | private _typeScriptConfig: PartialTypeScriptConfig = {}; 13 | 14 | public configureClassModel(config: PartialClassModelConfig) { 15 | this._classModelConfig = config; 16 | return this; 17 | } 18 | 19 | public configureTypeScript(config: PartialTypeScriptConfig) { 20 | this._typeScriptConfig = config; 21 | return this; 22 | } 23 | 24 | public build() { 25 | return new TypeScriptSourceCodeGenerator( 26 | new ClassModelGenerator(this._classModelConfig), 27 | new TypeScriptClassModelToCodeConverter(this._typeScriptConfig) 28 | ); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/erdiagram/parser/validator/EntityRelationshipModelParseResultValidatorErrorHandler.ts: -------------------------------------------------------------------------------- 1 | import {ParsedStatementResult} from '@/erdiagram/parser/types/parsed-entity-relationship-model-types'; 2 | import ERDiagramParseLineError from '@/erdiagram/parser/types/error/ERDiagramParseLineError'; 3 | import ERDiagramRelationshipError from '@/erdiagram/parser/types/error/ERDiagramRelationshipError'; 4 | import ERDiagramEntityError from '@/erdiagram/parser/types/error/ERDiagramEntityError'; 5 | import ERDiagramEntityPropertyError from '@/erdiagram/parser/types/error/ERDiagramEntityPropertyError'; 6 | 7 | export default class EntityRelationshipModelParseResultValidatorErrorHandler { 8 | 9 | public handleValidationError(error: unknown, statementResultToLineMap: Map): never { 10 | 11 | if (error instanceof ERDiagramEntityPropertyError) { 12 | throw new ERDiagramParseLineError(error, statementResultToLineMap.get(error.property)!); 13 | } 14 | 15 | if (error instanceof ERDiagramEntityError) { 16 | throw new ERDiagramParseLineError(error, statementResultToLineMap.get(error.entity)!); 17 | } 18 | 19 | /* istanbul ignore else */ 20 | if (error instanceof ERDiagramRelationshipError) { 21 | throw new ERDiagramParseLineError(error, statementResultToLineMap.get(error.relationship)!); 22 | } 23 | 24 | /* istanbul ignore next */ 25 | throw error; 26 | 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/main/erdiagram/parser/types/entity-relationship-model-types.ts: -------------------------------------------------------------------------------- 1 | export interface EntityRelationshipModel { 2 | entities: EntityDescriptor[]; 3 | relationships: RelationshipDescriptor[]; 4 | } 5 | 6 | export interface EntityDescriptor { 7 | name: string; 8 | identityPropertyName?: string; 9 | properties: EntityPropertyDescriptor[]; 10 | } 11 | 12 | export interface EntityPropertyDescriptor { 13 | name: string; 14 | optional: boolean; 15 | unique: boolean; 16 | type: EntityPropertyType; 17 | length: number[]; 18 | } 19 | 20 | export enum EntityPropertyType { 21 | IDENTITY = 'identity', 22 | BOOLEAN = 'bool', 23 | SHORT = 'short', 24 | INT = 'int', 25 | LONG = 'long', 26 | DECIMAL = 'decimal', 27 | TEXT = 'text', 28 | DATE = 'date', 29 | TIME = 'time', 30 | DATETIME = 'datetime', 31 | BLOB = 'blob' 32 | } 33 | 34 | export interface RelationshipDescriptor { 35 | leftMember: RelationshipMember; 36 | rightMember: RelationshipMember; 37 | direction: Direction; 38 | relationshipName?: string; 39 | } 40 | 41 | export interface RelationshipMember { 42 | entity: string; 43 | entityAlias: string; 44 | cardinality: Cardinality; 45 | } 46 | 47 | export enum Cardinality { 48 | MANY = 'many', 49 | ONE = 'one', 50 | ZERO_OR_ONE = 'zero_or_one' 51 | } 52 | 53 | export enum Direction { 54 | LEFT_TO_RIGHT = 'left_to_right', 55 | RIGHT_TO_LEFT = 'right_to_left', 56 | BIDIRECTIONAL = 'bidirectional' 57 | } 58 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/lombok/transformer/LombokTransformer.ts: -------------------------------------------------------------------------------- 1 | import JavaClassModelTransformer 2 | from '@/erdiagram/converter/oop/source-code-generator/java/model/transformer/JavaClassModelTransformer'; 3 | import { PartialLombokConfig } from '@/erdiagram/converter/oop/source-code-generator/java/lombok/config/LombokConfig'; 4 | import lombokConfigManager 5 | from '@/erdiagram/converter/oop/source-code-generator/java/lombok/config/LombokConfigManager'; 6 | import { JavaClass } from '@/erdiagram/converter/oop/source-code-generator/java/model/java-class-model-types'; 7 | import LombokTransformerClassVisitor 8 | from '@/erdiagram/converter/oop/source-code-generator/java/lombok/transformer/visitor/class/LombokTransformerClassVisitor'; 9 | 10 | export class LombokTransformer implements JavaClassModelTransformer { 11 | 12 | private readonly _classVisitor: LombokTransformerClassVisitor; 13 | 14 | constructor(config?: PartialLombokConfig) { 15 | const fullConfig = lombokConfigManager.mergeWithDefaultConfig(config); 16 | this._classVisitor = new LombokTransformerClassVisitor(fullConfig); 17 | } 18 | 19 | setup(): unknown { 20 | return undefined; 21 | } 22 | 23 | visitField(): void { 24 | // Do nothing 25 | } 26 | 27 | visitClass(javaClass: JavaClass): void { 28 | this._classVisitor.visitClass(javaClass); 29 | } 30 | 31 | visitModel(): void { 32 | // Do nothing 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /src/main/erdiagram/parser/ParsedModelToPublicModelConverter.ts: -------------------------------------------------------------------------------- 1 | import { 2 | EntityDescriptor, 3 | EntityPropertyDescriptor, 4 | EntityPropertyType, 5 | EntityRelationshipModel 6 | } from '@/erdiagram/parser/types/entity-relationship-model-types'; 7 | import { 8 | ParsedEntityDescriptor, 9 | ParsedEntityRelationshipModel 10 | } from '@/erdiagram/parser/types/parsed-entity-relationship-model-types'; 11 | 12 | export default class ParsedModelToPublicModelConverter { 13 | 14 | public convertParsedModelToPublicModel(parsedModel: ParsedEntityRelationshipModel): EntityRelationshipModel { 15 | return { 16 | entities: parsedModel.entities.map(parsedEntity => this.convertParsedEntityToPublicEntity(parsedEntity)), 17 | relationships: parsedModel.relationships 18 | }; 19 | } 20 | 21 | private convertParsedEntityToPublicEntity(parsedEntity: ParsedEntityDescriptor): EntityDescriptor { 22 | 23 | const identityProperty = this.getEntityIdentityProperty(parsedEntity); 24 | 25 | return { 26 | name: parsedEntity.name, 27 | identityPropertyName: identityProperty?.name, 28 | properties: parsedEntity.properties.filter(property => property != identityProperty) 29 | }; 30 | 31 | } 32 | 33 | private getEntityIdentityProperty(parsedEntity: ParsedEntityDescriptor): EntityPropertyDescriptor | undefined { 34 | return parsedEntity.properties.find(property => property.type === EntityPropertyType.IDENTITY); 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /src/test/erdiagram/util/regex-utils.unit.spec.ts: -------------------------------------------------------------------------------- 1 | import {escapeRegExpSpecialChars, joinRegExps} from '@/erdiagram/util/regex-utils'; 2 | 3 | describe('Escape special characters', () => { 4 | 5 | test('Ensure input is interpreted as a literal string', () => { 6 | 7 | const literalString = '^a+$'; 8 | const regex = new RegExp(escapeRegExpSpecialChars(literalString)); 9 | 10 | const result = regex.test(literalString); 11 | 12 | expect(result).toBe(true); 13 | 14 | }); 15 | 16 | test('Ensure input is not interpreted as a regex pattern', () => { 17 | 18 | const regex = new RegExp(escapeRegExpSpecialChars('^a+$')); 19 | 20 | const result = regex.test('aaaa'); 21 | 22 | expect(result).toBe(false); 23 | 24 | }); 25 | 26 | }); 27 | 28 | describe('Join RegExps', () => { 29 | 30 | test('Join compiled RegExps', () => { 31 | 32 | const regex = joinRegExps(/^a+/, /b+$/); 33 | 34 | const result = regex.test('aaabb'); 35 | 36 | expect(result).toBe(true); 37 | 38 | }); 39 | 40 | test('Join literal strings', () => { 41 | 42 | const regex = joinRegExps('^a+', 'b+$'); 43 | 44 | const result = regex.test('^a+b+$'); 45 | 46 | expect(result).toBe(true); 47 | 48 | }); 49 | 50 | test('Join compile RegExp with literal string', () => { 51 | 52 | const regex = joinRegExps(/^a+/, 'b+$'); 53 | 54 | const result = regex.test('aaab+$'); 55 | 56 | expect(result).toBe(true); 57 | 58 | }); 59 | 60 | }); 61 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/annotation/JavaAnnotation.ts: -------------------------------------------------------------------------------- 1 | import JavaType from '@/erdiagram/converter/oop/source-code-generator/java/type/JavaType'; 2 | import formatJavaAnnotation 3 | from '@/erdiagram/converter/oop/source-code-generator/java/annotation/utils/formatJavaAnnotation'; 4 | import { 5 | createRawParameterValue, 6 | isRawParameterValue 7 | } from '@/erdiagram/converter/oop/source-code-generator/java/annotation/utils/RawAnnotationParameterValue'; 8 | import {JavaAnnotationParameterValue} from '@/erdiagram/converter/oop/source-code-generator/java/annotation/annotation-parameter-types'; 9 | 10 | export type JavaAnnotationParametersRecord = Record; 11 | 12 | export default class JavaAnnotation { 13 | 14 | private readonly _type: JavaType; 15 | private readonly _parameters: JavaAnnotationParametersRecord; 16 | 17 | constructor( 18 | annotationType: JavaType, 19 | parameters: JavaAnnotationParametersRecord = {} 20 | ) { 21 | this._type = annotationType; 22 | this._parameters = parameters; 23 | } 24 | 25 | get type() { 26 | return this._type; 27 | } 28 | 29 | get parameters() { 30 | return this._parameters; 31 | } 32 | 33 | public format(): string { 34 | return formatJavaAnnotation(this); 35 | } 36 | 37 | static createRawParameterValue = createRawParameterValue; 38 | static isRawParameterValue = isRawParameterValue; 39 | 40 | } 41 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/code/JavaClassModelSourceFilesGenerator.ts: -------------------------------------------------------------------------------- 1 | import { 2 | JavaClass, 3 | JavaClassModel 4 | } from '@/erdiagram/converter/oop/source-code-generator/java/model/java-class-model-types'; 5 | import JavaClassCodeGenerator from '@/erdiagram/converter/oop/source-code-generator/java/code/JavaClassCodeGenerator'; 6 | import SourceFileInfo from '@/erdiagram/converter/common/SourceFileInfo'; 7 | 8 | export default class JavaClassModelSourceFilesGenerator { 9 | 10 | private readonly _javaClassCodeGenerator: JavaClassCodeGenerator; 11 | 12 | constructor(javaClassCodeGenerator: JavaClassCodeGenerator) { 13 | this._javaClassCodeGenerator = javaClassCodeGenerator; 14 | } 15 | 16 | public generateSourceFiles(javaClassModel: JavaClassModel): SourceFileInfo[] { 17 | return javaClassModel.classes.map(javaClass => this.generateClassSourceFile(javaClass)); 18 | } 19 | 20 | private generateClassSourceFile(javaClass: JavaClass): SourceFileInfo { 21 | return { 22 | folder: this.generateClassSourceFileFolder(javaClass), 23 | filename: this.generateClassSourceFileName(javaClass), 24 | contents: this._javaClassCodeGenerator.generateCode(javaClass) 25 | }; 26 | } 27 | 28 | private generateClassSourceFileFolder(javaClass: JavaClass) { 29 | return javaClass.packageName?.split('.') ?? []; 30 | } 31 | 32 | private generateClassSourceFileName(javaClass: JavaClass) { 33 | return `${javaClass.name}.java`; 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/type/parameterized/createJavaArrayType.ts: -------------------------------------------------------------------------------- 1 | import JavaType from '@/erdiagram/converter/oop/source-code-generator/java/type/JavaType'; 2 | import JavaParameterizedType 3 | from '@/erdiagram/converter/oop/source-code-generator/java/type/parameterized/JavaParameterizedType'; 4 | 5 | export default function createJavaArrayType(parameterType: JavaType): JavaParameterizedType { 6 | return new JavaArrayTypeImpl(parameterType); 7 | } 8 | 9 | class JavaArrayTypeImpl implements JavaParameterizedType { 10 | 11 | private readonly _name: string; 12 | private readonly _canonicalName: string; 13 | private readonly _parameterType: JavaType; 14 | 15 | constructor(parameterType: JavaType) { 16 | this._name = `${parameterType.name}[]`; 17 | this._canonicalName = `${parameterType.canonicalName}[]`; 18 | this._parameterType = parameterType; 19 | } 20 | 21 | get canonicalName() { 22 | return this._canonicalName; 23 | } 24 | 25 | get name() { 26 | return this._name; 27 | } 28 | 29 | get packageName() { 30 | return undefined; 31 | } 32 | 33 | get parameterTypes() { 34 | return [this._parameterType]; 35 | } 36 | 37 | formatSimple() { 38 | const formattedParameterType = this._parameterType.formatSimple(); 39 | return `${formattedParameterType}[]`; 40 | } 41 | 42 | formatCanonical() { 43 | const formattedParameterType = this._parameterType.formatCanonical(); 44 | return `${formattedParameterType}[]`; 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/model/generator/source/JavaClassModelDescriptorsRepository.ts: -------------------------------------------------------------------------------- 1 | import {JavaClass, JavaField} from '@/erdiagram/converter/oop/source-code-generator/java/model/java-class-model-types'; 2 | import {ClassDescriptor, ClassFieldDescriptor} from '@/erdiagram/converter/oop/model/class-model-types'; 3 | 4 | export default class JavaClassModelDescriptorsRepository { 5 | 6 | private readonly _classDescriptorsMap: Map; 7 | private readonly _fieldDescriptorsMap: Map; 8 | 9 | constructor( 10 | classDescriptorsMap: Map, 11 | fieldDescriptorsMap: Map 12 | ) { 13 | this._classDescriptorsMap = classDescriptorsMap; 14 | this._fieldDescriptorsMap = fieldDescriptorsMap; 15 | } 16 | 17 | public getClassDescriptor(javaClass: JavaClass): ClassDescriptor { 18 | 19 | const classDescriptor = this._classDescriptorsMap.get(javaClass); 20 | 21 | if (classDescriptor == null) { 22 | throw new Error(`Cannot find descriptor for Java class "${javaClass.name}"`); 23 | } 24 | 25 | return classDescriptor; 26 | 27 | } 28 | 29 | public getFieldDescriptor(javaField: JavaField): ClassFieldDescriptor { 30 | 31 | const fieldDescriptor = this._fieldDescriptorsMap.get(javaField); 32 | 33 | if (fieldDescriptor == null) { 34 | throw new Error(`Cannot find descriptor for Java field "${javaField.name}"`); 35 | } 36 | 37 | return fieldDescriptor; 38 | 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/test/erdiagram/converter/common/case-format/CaseConverter.unit.spec.ts: -------------------------------------------------------------------------------- 1 | import CaseFormat from '@/erdiagram/converter/common/case-format/CaseFormat'; 2 | import CaseConverter from '@/erdiagram/converter/common/case-format/CaseConverter'; 3 | import {removeNonEmptyStrings} from '@/erdiagram/util/string-utils'; 4 | 5 | const hashCaseFormat: CaseFormat = { 6 | joinWords(words: string[]): string { 7 | return removeNonEmptyStrings(words).join('#'); 8 | }, 9 | splitWords(text: string): string[] { 10 | return removeNonEmptyStrings(text.split('#')); 11 | } 12 | }; 13 | 14 | const doubleDollarCaseFormat: CaseFormat = { 15 | joinWords(words: string[]): string { 16 | return removeNonEmptyStrings(words).join('$$'); 17 | }, 18 | splitWords(text: string): string[] { 19 | return removeNonEmptyStrings(text.split('$$')); 20 | } 21 | }; 22 | 23 | const hashCaseText = 'lorem#ipsum#dolor#sit#amet'; 24 | const doubleDollarCaseText = 'lorem$$ipsum$$dolor$$sit$$amet'; 25 | 26 | test('Convert case from hash case to double-dollar case', () => { 27 | 28 | const caseConverter = new CaseConverter(hashCaseFormat, doubleDollarCaseFormat); 29 | const result = caseConverter.convertCase(hashCaseText); 30 | 31 | expect(result).toBe(doubleDollarCaseText); 32 | 33 | }); 34 | 35 | test('Convert case from double-dollar case to hash case', () => { 36 | 37 | const caseConverter = new CaseConverter(doubleDollarCaseFormat, hashCaseFormat); 38 | const result = caseConverter.convertCase(doubleDollarCaseText); 39 | 40 | expect(result).toBe(hashCaseText); 41 | 42 | }); 43 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/diagram/nomnoml/relationship/NomnomlUnnamedRelationshipCodeGenerator.ts: -------------------------------------------------------------------------------- 1 | import {RelationshipDescriptor} from '@/erdiagram/parser/types/entity-relationship-model-types'; 2 | import NomnomlRelationshipDirectionCodeGenerator 3 | from '@/erdiagram/converter/diagram/nomnoml/relationship/NomnomlRelationshipDirectionCodeGenerator'; 4 | import NomnomlRelationshipCardinalityCodeGenerator 5 | from '@/erdiagram/converter/diagram/nomnoml/relationship/NomnomlRelationshipCardinalityCodeGenerator'; 6 | 7 | export default class NomnomlUnnamedRelationshipCodeGenerator { 8 | 9 | constructor( 10 | private readonly relationshipDirectionCodeGenerator: NomnomlRelationshipDirectionCodeGenerator, 11 | private readonly relationshipCardinalityCodeGenerator: NomnomlRelationshipCardinalityCodeGenerator 12 | ) { 13 | 14 | } 15 | 16 | public generateUnnamedRelationshipCode(relationship: RelationshipDescriptor): string { 17 | 18 | const { 19 | leftMember, 20 | rightMember, 21 | direction 22 | } = relationship; 23 | 24 | const leftMemberCardinalityCode = this.relationshipCardinalityCodeGenerator.generateCardinalityCode(leftMember.cardinality); 25 | const rightMemberCardinalityCode = this.relationshipCardinalityCodeGenerator.generateCardinalityCode(rightMember.cardinality); 26 | 27 | const directionCode = this.relationshipDirectionCodeGenerator.generateDirectionCode(direction); 28 | return `[${leftMember.entity}] ${leftMemberCardinalityCode}${directionCode}${rightMemberCardinalityCode} [${rightMember.entity}]`; 29 | 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/database/source-code-generator/sql/dialect/sqlite/column/SqliteIdColumnCodeGenerator.ts: -------------------------------------------------------------------------------- 1 | import {EntityPropertyType} from '@/erdiagram/parser/types/entity-relationship-model-types'; 2 | import CaseConverter from '@/erdiagram/converter/common/case-format/CaseConverter'; 3 | import {IdColumnCode} from '@/erdiagram/converter/database/source-code-generator/sql/dialect/common/sql-script-types'; 4 | import SqlIdColumnCodeGenerator 5 | from '@/erdiagram/converter/database/source-code-generator/sql/dialect/common/column/SqlIdColumnCodeGenerator'; 6 | import SqlTypeResolver from '@/erdiagram/converter/database/source-code-generator/sql/dialect/common/SqlTypeResolver'; 7 | 8 | export default class SqliteIdColumnCodeGenerator implements SqlIdColumnCodeGenerator { 9 | 10 | constructor( 11 | private readonly typeResolver: SqlTypeResolver, 12 | private readonly columnNameCaseConverter: CaseConverter 13 | ) { 14 | 15 | } 16 | 17 | public generateIdColumnCode(outputTableName: string, identityColumnName: string): IdColumnCode { 18 | 19 | const outputIdentityColumnName = this.columnNameCaseConverter.convertCase(identityColumnName); 20 | 21 | return { 22 | columnLine: this.generateIdColumnDeclarationLine(outputIdentityColumnName) 23 | }; 24 | 25 | } 26 | 27 | private generateIdColumnDeclarationLine(outputIdentityColumnName: string): string { 28 | const sqlType = this.typeResolver.resolveSqlType(EntityPropertyType.IDENTITY); 29 | return `"${outputIdentityColumnName}" ${sqlType} NOT NULL PRIMARY KEY AUTOINCREMENT`; 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/validation/config/BeanValidationConfigManager.ts: -------------------------------------------------------------------------------- 1 | import AbstractConfigManager from '@/erdiagram/common/config/AbstractConfigManager'; 2 | import BeanValidationConfig, { PartialBeanValidationConfig } from '@/erdiagram/converter/oop/source-code-generator/java/validation/config/BeanValidationConfig'; 3 | import NotNullTextValidationStrategy 4 | from '@/erdiagram/converter/oop/source-code-generator/java/validation/strategy/NotNullTextValidationStrategy'; 5 | import NotNullBlobValidationStrategy 6 | from '@/erdiagram/converter/oop/source-code-generator/java/validation/strategy/NotNullBlobValidationStrategy'; 7 | import JavaExtendedPackage from '@/erdiagram/converter/oop/source-code-generator/java/type/JavaExtendedPackage'; 8 | 9 | export class BeanValidationConfigManager 10 | extends AbstractConfigManager { 11 | 12 | getDefaultConfig(): BeanValidationConfig { 13 | return { 14 | notNullTextValidationStrategy: NotNullTextValidationStrategy.NOT_NULL, 15 | notNullBlobValidationStrategy: NotNullBlobValidationStrategy.NOT_NULL, 16 | javaExtendedPackage: JavaExtendedPackage.JAKARTA, 17 | annotateGetters: false 18 | }; 19 | } 20 | 21 | mergeConfigs(fullConfig: BeanValidationConfig, partialConfig?: PartialBeanValidationConfig): BeanValidationConfig { 22 | return { 23 | ...fullConfig, 24 | ...partialConfig 25 | }; 26 | } 27 | 28 | } 29 | 30 | const beanValidationConfigManager = new BeanValidationConfigManager(); 31 | export default beanValidationConfigManager; 32 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/diagram/nomnoml/config/NomnomlConfigManager.ts: -------------------------------------------------------------------------------- 1 | import AbstractConfigManager from '@/erdiagram/common/config/AbstractConfigManager'; 2 | import NomnomlConfig, {PartialNomnomlConfig} from '@/erdiagram/converter/diagram/nomnoml/config/NomnomlConfig'; 3 | import DiagramLevel from '@/erdiagram/converter/diagram/common/config/DiagramLevel'; 4 | 5 | export class NomnomlConfigManager extends AbstractConfigManager { 6 | 7 | getDefaultConfig(): NomnomlConfig { 8 | return { 9 | diagramLevel: DiagramLevel.LOGICAL, 10 | style: { 11 | arrowSize: 1, 12 | bendSize: undefined, 13 | direction: undefined, 14 | gutter: undefined, 15 | edgeMargin: undefined, 16 | gravity: 1.5, 17 | edges: undefined, 18 | background: 'transparent', 19 | fill: '#fefece', 20 | fillArrows: undefined, 21 | font: undefined, 22 | fontSize: undefined, 23 | leading: undefined, 24 | lineWidth: 1, 25 | padding: undefined, 26 | spacing: undefined, 27 | stroke: '#333333', 28 | title: undefined, 29 | zoom: undefined, 30 | acyclicer: undefined, 31 | ranker: 'longest-path' 32 | } 33 | }; 34 | } 35 | 36 | mergeConfigs(fullConfig: NomnomlConfig, partialConfig?: PartialNomnomlConfig): NomnomlConfig { 37 | return { 38 | ...fullConfig, 39 | ...partialConfig, 40 | style: { 41 | ...fullConfig.style, 42 | ...partialConfig?.style, 43 | } 44 | }; 45 | } 46 | 47 | } 48 | 49 | const nomnomlConfigManager = new NomnomlConfigManager(); 50 | export default nomnomlConfigManager; 51 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/jpa/config/JpaConfigManager.ts: -------------------------------------------------------------------------------- 1 | import AbstractConfigManager from '@/erdiagram/common/config/AbstractConfigManager'; 2 | import JpaConfig, { PartialJpaConfig } from '@/erdiagram/converter/oop/source-code-generator/java/jpa/config/JpaConfig'; 3 | import { 4 | JsonAdapter, 5 | JsonAdapters 6 | } from 'true-json'; 7 | import StandardCaseFormats from '@/erdiagram/converter/common/case-format/StandardCaseFormats'; 8 | import JavaExtendedPackage from '@/erdiagram/converter/oop/source-code-generator/java/type/JavaExtendedPackage'; 9 | 10 | export class JpaConfigManager extends AbstractConfigManager { 11 | 12 | getDefaultConfig(): JpaConfig { 13 | return { 14 | tableNameCaseFormat: StandardCaseFormats.UPPER_CAMEL, 15 | columnNameCaseFormat: StandardCaseFormats.LOWER_CAMEL, 16 | annotateGetters: false, 17 | useExplicitTableName: false, 18 | useExplicitColumnName: false, 19 | javaExtendedPackage: JavaExtendedPackage.JAKARTA 20 | }; 21 | } 22 | 23 | mergeConfigs(fullConfig: JpaConfig, partialConfig?: PartialJpaConfig): JpaConfig { 24 | return { 25 | ...fullConfig, 26 | ...partialConfig 27 | }; 28 | } 29 | 30 | protected getJsonAdapter(): JsonAdapter { 31 | return JsonAdapters.object({ 32 | tableNameCaseFormat: JsonAdapters.byKeyLenient(StandardCaseFormats, 'UPPER_CAMEL'), 33 | columnNameCaseFormat: JsonAdapters.byKeyLenient(StandardCaseFormats, 'LOWER_CAMEL') 34 | }); 35 | } 36 | 37 | } 38 | 39 | const jpaConfigManager = new JpaConfigManager(); 40 | export default jpaConfigManager; 41 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/validation/visitor/BeanValidationFieldVisitor.ts: -------------------------------------------------------------------------------- 1 | import {JavaFieldTransformContext} from '@/erdiagram/converter/oop/source-code-generator/java/model/transformer/java-class-model-transformer-context-types'; 2 | import { 3 | JavaAnnotatedElement, 4 | JavaField 5 | } from '@/erdiagram/converter/oop/source-code-generator/java/model/java-class-model-types'; 6 | import BeanValidationAnnotationsSupplier 7 | from '@/erdiagram/converter/oop/source-code-generator/java/validation/visitor/BeanValidationAnnotationsSupplier'; 8 | 9 | export default class BeanValidationFieldVisitor { 10 | 11 | private readonly _beanValidationAnnotationsGenerator: BeanValidationAnnotationsSupplier; 12 | private readonly _annotateGetters: boolean; 13 | 14 | constructor( 15 | beanValidationAnnotationsGenerator: BeanValidationAnnotationsSupplier, 16 | annotateGetters: boolean 17 | ) { 18 | this._beanValidationAnnotationsGenerator = beanValidationAnnotationsGenerator; 19 | this._annotateGetters = annotateGetters; 20 | } 21 | 22 | visitField(javaField: JavaField, context: JavaFieldTransformContext): void { 23 | 24 | const annotations = this._beanValidationAnnotationsGenerator.getAnnotations(context.fieldDescriptor); 25 | const elementToAnnotate = this.getElementToAnnotate(javaField); 26 | 27 | elementToAnnotate.annotations.push(...annotations); 28 | 29 | } 30 | 31 | private getElementToAnnotate(javaField: JavaField): JavaAnnotatedElement { 32 | 33 | if (this._annotateGetters && javaField.getter != null) { 34 | return javaField.getter; 35 | } 36 | 37 | return javaField; 38 | 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/model/source-metadata/source-metadata-utils.ts: -------------------------------------------------------------------------------- 1 | import { 2 | EntityIdentitySourceMetadata, 3 | EntityPropertySourceMetadata, 4 | EntityRelationshipModelSourceMetadata, 5 | EntitySourceMetadata, 6 | RelationshipMemberSourceMetadata, 7 | RelationshipSourceMetadata, 8 | SourceMetadata, 9 | SourceType 10 | } from '@/erdiagram/converter/oop/model/source-metadata/source-metadata-types'; 11 | 12 | export function isEntityRelationshipModelSourceMetadata(sourceMetadata: SourceMetadata): sourceMetadata is EntityRelationshipModelSourceMetadata { 13 | return sourceMetadata.sourceType === SourceType.ENTITY_RELATIONSHIP_MODEL; 14 | } 15 | 16 | export function isEntitySourceMetadata(sourceMetadata: SourceMetadata): sourceMetadata is EntitySourceMetadata { 17 | return sourceMetadata.sourceType === SourceType.ENTITY; 18 | } 19 | 20 | export function isEntityIdentitySourceMetadata(sourceMetadata: SourceMetadata): sourceMetadata is EntityIdentitySourceMetadata { 21 | return sourceMetadata.sourceType === SourceType.ENTITY_IDENTITY; 22 | } 23 | 24 | export function isEntityPropertySourceMetadata(sourceMetadata: SourceMetadata): sourceMetadata is EntityPropertySourceMetadata { 25 | return sourceMetadata.sourceType === SourceType.ENTITY_PROPERTY; 26 | } 27 | 28 | export function isRelationshipSourceMetadata(sourceMetadata: SourceMetadata): sourceMetadata is RelationshipSourceMetadata { 29 | return sourceMetadata.sourceType === SourceType.RELATIONSHIP; 30 | } 31 | 32 | export function isRelationshipMemberSourceMetadata(sourceMetadata: SourceMetadata): sourceMetadata is RelationshipMemberSourceMetadata { 33 | return sourceMetadata.sourceType === SourceType.RELATIONSHIP_MEMBER; 34 | } 35 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/typescript/TypeScriptSourceCodeGenerator.ts: -------------------------------------------------------------------------------- 1 | import {EntityRelationshipModel} from '@/erdiagram/parser/types/entity-relationship-model-types'; 2 | import ClassModelGenerator from '@/erdiagram/converter/oop/model/ClassModelGenerator'; 3 | import SourceCodeGenerator from '@/erdiagram/converter/SourceCodeGenerator'; 4 | import TypeScriptClassModelToCodeConverter 5 | from '@/erdiagram/converter/oop/source-code-generator/typescript/TypeScriptClassModelToCodeConverter'; 6 | import TypeScriptSourceCodeGeneratorBuilder 7 | from '@/erdiagram/converter/oop/source-code-generator/typescript/TypeScriptSourceCodeGeneratorBuilder'; 8 | 9 | export default class TypeScriptSourceCodeGenerator implements SourceCodeGenerator { 10 | 11 | private readonly _classModelGenerator: ClassModelGenerator; 12 | private readonly _typeScriptClassModelToCodeConverter: TypeScriptClassModelToCodeConverter; 13 | 14 | constructor( 15 | classModelGenerator: ClassModelGenerator, 16 | typeScriptClassModelToCodeConverter: TypeScriptClassModelToCodeConverter 17 | ) { 18 | this._classModelGenerator = classModelGenerator; 19 | this._typeScriptClassModelToCodeConverter = typeScriptClassModelToCodeConverter; 20 | } 21 | 22 | generateSourceCode(entityRelationshipModel: EntityRelationshipModel): string { 23 | const classModel = this._classModelGenerator.generateClassModel(entityRelationshipModel); 24 | return this._typeScriptClassModelToCodeConverter.convertToCode(classModel); 25 | } 26 | 27 | static withDefaultConfig() { 28 | return this.builder().build(); 29 | } 30 | 31 | static builder() { 32 | return new TypeScriptSourceCodeGeneratorBuilder(); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/model/generator/JavaClassGenerator.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ClassDescriptor, 3 | ClassFieldDescriptor 4 | } from '@/erdiagram/converter/oop/model/class-model-types'; 5 | import { 6 | JavaClass, 7 | JavaField, 8 | JavaVisibility 9 | } from '@/erdiagram/converter/oop/source-code-generator/java/model/java-class-model-types'; 10 | import JavaFieldGenerator 11 | from '@/erdiagram/converter/oop/source-code-generator/java/model/generator/JavaFieldGenerator'; 12 | 13 | interface FieldGeneratedEvent { 14 | javaField: JavaField; 15 | fieldDescriptor: ClassFieldDescriptor; 16 | } 17 | 18 | type FieldGeneratedEventListener = (event: FieldGeneratedEvent) => void; 19 | 20 | export default class JavaClassGenerator { 21 | 22 | private readonly _generatedClassesPackage?: string; 23 | private readonly _fieldGenerator: JavaFieldGenerator; 24 | 25 | constructor( 26 | generatedClassesPackage: string | undefined, 27 | fieldGenerator: JavaFieldGenerator 28 | ) { 29 | this._generatedClassesPackage = generatedClassesPackage; 30 | this._fieldGenerator = fieldGenerator; 31 | } 32 | 33 | public generateJavaClass(classDescriptor: ClassDescriptor, fieldGeneratedEventListener: FieldGeneratedEventListener): JavaClass { 34 | return { 35 | packageName: this._generatedClassesPackage, 36 | visibility: JavaVisibility.PUBLIC, 37 | name: classDescriptor.name, 38 | annotations: [], 39 | fields: classDescriptor.fields.map(fieldDescriptor => { 40 | const javaField = this._fieldGenerator.generateJavaField(fieldDescriptor); 41 | fieldGeneratedEventListener({ javaField, fieldDescriptor }); 42 | return javaField; 43 | }) 44 | }; 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/diagram/plantuml/relationship/PlantUmlRelationshipCodeGenerator.ts: -------------------------------------------------------------------------------- 1 | import {RelationshipDescriptor} from '@/erdiagram/parser/types/entity-relationship-model-types'; 2 | import PlantUmlRelationshipDirectionCodeGenerator 3 | from '@/erdiagram/converter/diagram/plantuml/relationship/PlantUmlRelationshipDirectionCodeGenerator'; 4 | import PlantUmlRelationshipCardinalityCodeGenerator 5 | from '@/erdiagram/converter/diagram/plantuml/relationship/PlantUmlRelationshipCardinalityCodeGenerator'; 6 | 7 | export default class PlantUmlRelationshipCodeGenerator { 8 | 9 | private readonly relationshipDirectionCodeGenerator = new PlantUmlRelationshipDirectionCodeGenerator(); 10 | private readonly relationshipCardinalityCodeGenerator = new PlantUmlRelationshipCardinalityCodeGenerator(); 11 | 12 | public generateRelationshipCode(relationship: RelationshipDescriptor): string { 13 | 14 | const { 15 | leftMember, 16 | rightMember, 17 | direction 18 | } = relationship; 19 | 20 | const leftMemberCardinalityCode = this.relationshipCardinalityCodeGenerator.generateCardinalityCode(leftMember.cardinality); 21 | const rightMemberCardinalityCode = this.relationshipCardinalityCodeGenerator.generateCardinalityCode(rightMember.cardinality); 22 | 23 | const directionCode = this.relationshipDirectionCodeGenerator.generateDirectionCode(direction); 24 | 25 | const relationshipCode = `${leftMember.entity} "${leftMemberCardinalityCode}" ${directionCode} "${rightMemberCardinalityCode}" ${rightMember.entity}`; 26 | 27 | if (relationship.relationshipName) { 28 | return `${relationshipCode} : ${relationship.relationshipName}`; 29 | } else { 30 | return relationshipCode; 31 | } 32 | 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/type/import/JavaImportStatementsGenerator.ts: -------------------------------------------------------------------------------- 1 | import JavaType from '@/erdiagram/converter/oop/source-code-generator/java/type/JavaType'; 2 | import {removeDuplicates} from '@/erdiagram/util/array-utils'; 3 | import isJavaParameterizedType 4 | from '@/erdiagram/converter/oop/source-code-generator/java/type/parameterized/isJavaParameterizedType'; 5 | 6 | const JAVA_LANG_PACKAGE = 'java.lang'; 7 | 8 | // TODO add unit tests 9 | export default class JavaImportStatementsGenerator { 10 | 11 | private readonly _currentPackage?: string; 12 | 13 | constructor(currentPackage?: string) { 14 | this._currentPackage = currentPackage; 15 | } 16 | 17 | public generateImportStatements(javaTypes: JavaType[]): string[] { 18 | 19 | const cannonicalNames = this.unrollTypesRecursively(javaTypes) 20 | .filter(javaType => this.isImportRequired(javaType)) 21 | .map(javaType => javaType.canonicalName); 22 | 23 | return removeDuplicates(cannonicalNames) 24 | .sort() 25 | .map(cannonicalName => `import ${cannonicalName};`); 26 | 27 | } 28 | 29 | private unrollTypesRecursively(javaTypes: ReadonlyArray, appendTo: JavaType[] = []): JavaType[] { 30 | 31 | for (const javaType of javaTypes) { 32 | 33 | appendTo.push(javaType); 34 | 35 | if (isJavaParameterizedType(javaType)) { 36 | this.unrollTypesRecursively(javaType.parameterTypes, appendTo); 37 | } 38 | 39 | } 40 | 41 | return appendTo; 42 | 43 | } 44 | 45 | private isImportRequired(javaType: JavaType): boolean { 46 | return !!javaType.packageName 47 | && javaType.packageName !== JAVA_LANG_PACKAGE 48 | && javaType.packageName !== this._currentPackage; 49 | } 50 | 51 | } 52 | -------------------------------------------------------------------------------- /src/main/erdiagram/parser/statement/statement-types-regexes.ts: -------------------------------------------------------------------------------- 1 | import {joinRegExps} from '@/erdiagram/util/regex-utils'; 2 | 3 | const IDENTITY_REGEX = /[a-zA-Z_][a-zA-Z_0-9]*/; 4 | const OPTIONAL_TRAILING_SPACES_AND_COMMENT = /\s*(#.*)?$/; 5 | 6 | // Entity name 7 | 8 | export const ENTITY_NAME_LINE_REGEX = new RegExp(`^(${IDENTITY_REGEX.source})${OPTIONAL_TRAILING_SPACES_AND_COMMENT.source}`); 9 | 10 | // Entity property 11 | 12 | const PROPERTY_NAME_REGEX = new RegExp(`(${IDENTITY_REGEX.source})`); 13 | const PROPERTY_MODIFIERS_REGEX = new RegExp(`([?!]*)`); 14 | 15 | const PROPERTY_TYPE_NAME_REGEX = new RegExp(`(${IDENTITY_REGEX.source})`); 16 | const PROPERTY_TYPE_LENGTH_REGEX = new RegExp(`(?:\\((\\s*\\d+\\s*(?:,\\s*\\d+\\s*)*)\\))?`); 17 | 18 | const ENTITY_PROPERTY_REGEX = joinRegExps(PROPERTY_NAME_REGEX, PROPERTY_MODIFIERS_REGEX, /\s+/, PROPERTY_TYPE_NAME_REGEX, PROPERTY_TYPE_LENGTH_REGEX); 19 | 20 | export const ENTITY_PROPERTY_LINE_REGEX = new RegExp(`^\\s+${ENTITY_PROPERTY_REGEX.source}${OPTIONAL_TRAILING_SPACES_AND_COMMENT.source}`); 21 | 22 | // Relationship 23 | 24 | const RELATIONSHIP_DIRECTION_REGEX = /(<-|->|<->)/; 25 | const RELATIONSHIP_CARDINALITY_REGEX = /([?1*])?/; 26 | const DIRECTION_AND_CARDINALITY_REGEX = joinRegExps(RELATIONSHIP_CARDINALITY_REGEX, RELATIONSHIP_DIRECTION_REGEX, RELATIONSHIP_CARDINALITY_REGEX); 27 | 28 | const ENTITY_AND_ALIAS_REGEX = new RegExp(`(${IDENTITY_REGEX.source})(?:\\s+(${IDENTITY_REGEX.source}))?`); 29 | 30 | export const RELATIONSHIP_LINE_REGEX = new RegExp(`^${ENTITY_AND_ALIAS_REGEX.source}\\s*?${DIRECTION_AND_CARDINALITY_REGEX.source}\\s*?${ENTITY_AND_ALIAS_REGEX.source}(?:\\s+\\(\\s*(${IDENTITY_REGEX.source})\\s*\\))?${OPTIONAL_TRAILING_SPACES_AND_COMMENT.source}`); 31 | -------------------------------------------------------------------------------- /src/main/erdiagram/parser/EntityRelationshipModelParserWithoutValidation.ts: -------------------------------------------------------------------------------- 1 | import { 2 | EntityRelationshipModelParseResult, 3 | ParsedStatementResult 4 | } from '@/erdiagram/parser/types/parsed-entity-relationship-model-types'; 5 | import EntityRelationshipModelLineParser from '@/erdiagram/parser/line/EntityRelationshipModelLineParser'; 6 | import ParseState from '@/erdiagram/parser/types/ParseState'; 7 | 8 | const LINE_SEPARATOR = '\n'; 9 | 10 | export default class EntityRelationshipModelParserWithoutValidation { 11 | 12 | private readonly lineParser: EntityRelationshipModelLineParser; 13 | 14 | constructor() { 15 | this.lineParser = new EntityRelationshipModelLineParser(); 16 | } 17 | 18 | public parseModelWithoutValidation(code: string): EntityRelationshipModelParseResult { 19 | 20 | const state = this.createInitialParseState(); 21 | 22 | this.parseCode(code, state); 23 | 24 | return this.mapParseStateToParseResult(state); 25 | 26 | } 27 | 28 | private createInitialParseState(): ParseState { 29 | return { 30 | entities: [], 31 | relationships: [], 32 | entityBeingParsed: null, 33 | statementResultToLineMap: new Map() 34 | }; 35 | } 36 | 37 | private parseCode(code: string, state: ParseState) { 38 | const lines = code.split(LINE_SEPARATOR); 39 | this.lineParser.parseLines(lines, state); 40 | } 41 | 42 | private mapParseStateToParseResult(state: ParseState): EntityRelationshipModelParseResult { 43 | 44 | const { 45 | entities, 46 | relationships, 47 | statementResultToLineMap 48 | } = state; 49 | 50 | return { 51 | model: { 52 | entities, 53 | relationships 54 | }, 55 | statementResultToLineMap 56 | }; 57 | 58 | } 59 | 60 | } 61 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/type/import/JavaAnnotationUsedTypesCompiler.ts: -------------------------------------------------------------------------------- 1 | import JavaType from '@/erdiagram/converter/oop/source-code-generator/java/type/JavaType'; 2 | import JavaAnnotation from '@/erdiagram/converter/oop/source-code-generator/java/annotation/JavaAnnotation'; 3 | import { 4 | JavaAnnotationParameterSingleValue, 5 | JavaAnnotationParameterValue 6 | } from '@/erdiagram/converter/oop/source-code-generator/java/annotation/annotation-parameter-types'; 7 | 8 | export default class JavaAnnotationUsedTypesCompiler { 9 | 10 | public getUsedTypes(annotation: JavaAnnotation): JavaType[] { 11 | 12 | const parametersUsedTypes = Object.values(annotation.parameters) 13 | .filter(parameterValue => parameterValue != null) 14 | .flatMap(parameterValue => this.getAnnotationParameterUsedTypes(parameterValue!)); 15 | 16 | return [ 17 | annotation.type, 18 | ...parametersUsedTypes 19 | ]; 20 | 21 | } 22 | 23 | private getAnnotationParameterUsedTypes(parameterValue: JavaAnnotationParameterValue): JavaType[] { 24 | 25 | if (!Array.isArray(parameterValue)) { 26 | return this.getAnnotationSingleParameterUsedTypes(parameterValue); 27 | } 28 | 29 | return parameterValue.flatMap(singleParameterValue => this.getAnnotationSingleParameterUsedTypes(singleParameterValue)); 30 | 31 | } 32 | 33 | private getAnnotationSingleParameterUsedTypes(parameterValue: JavaAnnotationParameterSingleValue): JavaType[] { 34 | 35 | if (JavaAnnotation.isRawParameterValue(parameterValue)) { 36 | return parameterValue.usedTypes; 37 | } 38 | 39 | if (parameterValue instanceof JavaAnnotation) { 40 | return this.getUsedTypes(parameterValue); 41 | } 42 | 43 | return []; 44 | 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/source-code-generator/java/type/import/JavaClassUsedTypesCompiler.ts: -------------------------------------------------------------------------------- 1 | import JavaType from '@/erdiagram/converter/oop/source-code-generator/java/type/JavaType'; 2 | import {JavaClass} from '@/erdiagram/converter/oop/source-code-generator/java/model/java-class-model-types'; 3 | import JavaAnnotation from '@/erdiagram/converter/oop/source-code-generator/java/annotation/JavaAnnotation'; 4 | import JavaAnnotationUsedTypesCompiler 5 | from '@/erdiagram/converter/oop/source-code-generator/java/type/import/JavaAnnotationUsedTypesCompiler'; 6 | 7 | // TODO add unit tests 8 | export default class JavaClassUsedTypesCompiler { 9 | 10 | private readonly _javaAnnotationUsedTypesCompiler = new JavaAnnotationUsedTypesCompiler(); 11 | 12 | constructor(javaAnnotationUsedTypesCompiler: JavaAnnotationUsedTypesCompiler) { 13 | this._javaAnnotationUsedTypesCompiler = javaAnnotationUsedTypesCompiler; 14 | } 15 | 16 | public getUsedTypes(javaClass: JavaClass): JavaType[] { 17 | 18 | const usedTypes: JavaType[] = []; 19 | 20 | usedTypes.push(...this.getAnnotationsUsedTypes(javaClass.annotations)); 21 | 22 | javaClass.fields.forEach(javaField => { 23 | 24 | usedTypes.push(javaField.type); 25 | 26 | usedTypes.push(...this.getAnnotationsUsedTypes(javaField.annotations)); 27 | usedTypes.push(...this.getAnnotationsUsedTypes(javaField.getter?.annotations ?? [])); 28 | usedTypes.push(...this.getAnnotationsUsedTypes(javaField.setter?.annotations ?? [])); 29 | 30 | }); 31 | 32 | return usedTypes; 33 | 34 | } 35 | 36 | private getAnnotationsUsedTypes(annotations: JavaAnnotation[]): JavaType[] { 37 | return annotations.flatMap(annotation => this._javaAnnotationUsedTypesCompiler.getUsedTypes(annotation)); 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /src/main/erdiagram/converter/oop/model/source-metadata/source-metadata-types.ts: -------------------------------------------------------------------------------- 1 | import { 2 | EntityDescriptor, 3 | EntityPropertyDescriptor, 4 | EntityRelationshipModel, 5 | RelationshipDescriptor, 6 | RelationshipMember 7 | } from '@/erdiagram/parser/types/entity-relationship-model-types'; 8 | 9 | export enum SourceType { 10 | ENTITY_RELATIONSHIP_MODEL = 'entity_relationship_model', 11 | ENTITY = 'entity', 12 | ENTITY_IDENTITY = 'entity_identity', 13 | ENTITY_PROPERTY = 'entity_property', 14 | RELATIONSHIP = 'relationship', 15 | RELATIONSHIP_MEMBER = 'relationship_member' 16 | } 17 | 18 | export interface SourceMetadata { 19 | readonly sourceType: T; 20 | } 21 | 22 | export interface EntityRelationshipModelSourceMetadata extends SourceMetadata { 23 | entityRelationshipModel: EntityRelationshipModel; 24 | } 25 | 26 | export interface EntitySourceMetadata extends SourceMetadata { 27 | entity: EntityDescriptor; 28 | } 29 | 30 | export interface EntityIdentitySourceMetadata extends SourceMetadata { 31 | entity: EntityDescriptor; 32 | } 33 | 34 | export interface EntityPropertySourceMetadata extends SourceMetadata { 35 | entity: EntityDescriptor; 36 | property: EntityPropertyDescriptor; 37 | } 38 | 39 | export interface RelationshipSourceMetadata extends SourceMetadata { 40 | relationship: RelationshipDescriptor; 41 | } 42 | 43 | export interface RelationshipMemberSourceMetadata extends SourceMetadata { 44 | relationship: RelationshipDescriptor; 45 | referencedMember: RelationshipMember; 46 | } 47 | 48 | export type OmitSource = Omit; 49 | --------------------------------------------------------------------------------