From c138b8fef54a91009e4b5d49e0667b734de92b75 Mon Sep 17 00:00:00 2001 From: Charlie Mordant Date: Sat, 26 Jul 2025 13:23:20 +0200 Subject: [PATCH 1/4] improve jhipster developper readme --- CONTRIBUTING.md | 53 ++++++++++++++++++++++++++----------------------- DEVELOPMENT.md | 24 +++++++++++++++++++++- 2 files changed, 51 insertions(+), 26 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7e8b93980398..b7d93e9c5d4f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -25,10 +25,6 @@ If you find a bug in the source code or a mistake in the documentation, you can **Please see the Submission Guidelines below**. -## Bug bounties - -If you submitted a Pull Request that fixes a ticket with the "\$100" tag, then you are eligible for our bug bounty program! Go to our [bug bounties documentation](https://www.jhipster.tech/bug-bounties/) for more information, and claim your money. - ## Feature Requests You can request a new feature by submitting a ticket to our [GitHub issues](https://github.com/jhipster/generator-jhipster/issues). If you @@ -37,26 +33,6 @@ would like to implement a new feature then consider what kind of change it is: - **Major Changes** that you wish to contribute to the project should be discussed first. Please open a ticket which clearly states that it is a feature request in the title and explain clearly what you want to achieve in the description, and the JHipster team will discuss with you what should be done in that ticket. You can then start working on a Pull Request. In order to communicate major changes proposals and receive reviews from the core team, you can also submit an RFC. - **Small Changes** can be proposed without any discussion. Open up a ticket which clearly states that it is a feature request in the title. Explain your change in the description, and you can propose a Pull Request straight away. -## RFCs - -Sometimes, major feature requests are "complex" or "substantial". In this case, GitHub Issues might not be the best tool to present them because we will need a lot of going back and forth to reach a consensus. - -So we ask that these feature request be put through a formal design process and have their specifications described in an "RFC" (request for comments) that will be validated by the team through a Pull Request Review. - -The RFC process is intended to provide a consistent and controlled path for major features and directions of the project. - -To submit an RFC follow those steps: - -1. Discuss the RFC proposal with the core team through GitHub issues or other channels -2. Create the initial GitHub issue for the Feature Request if it doesn't already exist -3. Copy the `rfcs/0-jhipster-rfc-template.md` to `rfcs/${featureRequestIssueNumber}-my-feature-request-name.md` -4. Fill in the RFC, make sure to complete every required section -5. Submit the RFC as a Pull Request with the summary of the proposal in the PR description -6. Build consensus and integrate feedback from the reviewers -7. The Pull Request is either accepted (merged), rejected (closed) or postponed (given an "on hold" status) - -Note: The JHipster RFC process is inspired by [Rust RFCs](https://rust-lang.github.io/rfcs/). - ## Submission Guidelines ### [Submitting an Issue](https://opensource.guide/how-to-contribute/#opening-an-issue) @@ -88,13 +64,16 @@ You can run `jhipster info` in your project folder to get most of the above requ Issues opened without any of these info will be **closed** without any explanation. +## Development environment setup + +See our [Development Guide](DEVELOPMENT.md) for more information on how to configure the jhipster generator for contributing. + ### [Submitting a Pull Request](https://opensource.guide/how-to-contribute/#opening-a-pull-request) Before you submit your pull request consider the following guidelines: - Search [GitHub](https://github.com/jhipster/generator-jhipster/pulls?utf8=%E2%9C%93&q=is%3Apr) for an open or closed Pull Request that relates to your submission. -- If you want to modify the JHipster generator, read our [Development Guide](DEVELOPMENT.md) - Follow our [Coding Rules](#rules). - In GitHub, send a pull request to `jhipster/generator-jhipster:main`. - **Every CI tests must pass**. @@ -183,3 +162,27 @@ or joined the [JHipster team](https://www.jhipster.tech/team/). [issue-template]: https://github.com/jhipster/generator-jhipster/issues/new?template=BUG_REPORT.md [feature-template]: https://github.com/jhipster/generator-jhipster/issues/new?template=FEATURE_REQUEST.md + +## RFCs + +Sometimes, major feature requests are "complex" or "substantial". In this case, GitHub Issues might not be the best tool to present them because we will need a lot of going back and forth to reach a consensus. + +So we ask that these feature request be put through a formal design process and have their specifications described in an "RFC" (request for comments) that will be validated by the team through a Pull Request Review. + +The RFC process is intended to provide a consistent and controlled path for major features and directions of the project. + +To submit an RFC follow those steps: + +1. Discuss the RFC proposal with the core team through GitHub issues or other channels +2. Create the initial GitHub issue for the Feature Request if it doesn't already exist +3. Copy the `rfcs/0-jhipster-rfc-template.md` to `rfcs/${featureRequestIssueNumber}-my-feature-request-name.md` +4. Fill in the RFC, make sure to complete every required section +5. Submit the RFC as a Pull Request with the summary of the proposal in the PR description +6. Build consensus and integrate feedback from the reviewers +7. The Pull Request is either accepted (merged), rejected (closed) or postponed (given an "on hold" status) + +Note: The JHipster RFC process is inspired by [Rust RFCs](https://rust-lang.github.io/rfcs/). + +## Bug bounties + +If you submitted a Pull Request that fixes a ticket with the "\$100" tag, then you are eligible for our bug bounty program! Go to our [bug bounties documentation](https://www.jhipster.tech/bug-bounties/) for more information, and claim your money. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 49186d9bb55c..db940252fadd 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -17,7 +17,7 @@ Go to the [generator-jhipster project](https://github.com/jhipster/generator-jhi ### Set `jhipster` command to use the cloned project Since v8 `generator-jhipster` is written in TypeScript. -To run it you need to compile to JavaScript or use a just-in-time compilation. +To run it you need to compile to JavaScript or use a just-in-time compilation. `npm run compile` will be your best friend here: see [package.json script section](./package.json) for the entire list of commands. #### Running jit executable @@ -41,6 +41,17 @@ In your cloned `generator-jhipster` project, run `npm ci` and then run `npm link For testing, you will want to generate an application, and there is a specific issue here: for each application, JHipster installs a local version of itself. This is made to enable several applications to each use a specific JHipster version (application A uses JHipster 3.1.0, and application B uses JHipster 3.2.0). +#### Generating new applications from the tests samples using node bin/jhipster.cjs + +To generate a new application, you can run the following command in your terminal: + +```shell +node bin/jhipster.cjs generate-sample ng-default --global +``` +From the root of your cloned `generator-jhipster` project, this will generate a sample application in the current folder using the local version of JHipster. ng-default is the name of the sample application, you can replace it with any other sample name in the [code samples](./test-integration/samples) to generate a sample application. By default, the sample will be generated in the `../jhipster-samples` folder. +For workspaces, an additional `jhipster-samples.code-workspace` file will be generated in the same folder, which can be used to open the samples in a single VSCode workspace. Still, you'll need to delete the `jhipster-samples.code-workspace` file if you want to generate another workspace sample in the same folder. + +#### Generating a new application using npm link To overcome this, you need to run `npm link generator-jhipster` on the generated project folder as well, so that the local version has a symbolic link to the development version of JHipster. Also add the option `--skip-jhipster-dependencies` to generate the application ignoring the JHipster dependencies (otherwise a released version will be installed each time npm install/ci is called). You can later on re-add the dependency with the command `jhipster --no-skip-jhipster-dependencies`. @@ -95,6 +106,16 @@ To start debugging JHipster with **VSCode**, open the generator code in your wor It is also possible to debug sub generators by selecting one of the other debug options (for example `jhipster entity`). Those debug configurations are specified in the `.vscode/launch.json` file. +#### Debugging with IntelliJ IDEA + +When you start intelliJ IDEA on the `generator-jhipster` project, you'll have access to a run configuration letting execute any `.spec.ts` file within any package. +If you want to test a specific generator, you can create a new node.js run configuration with the following settings: +``` +application-parameters="generate-sample ms-ng-oauth2-mongodb-caffeine --global" path-to-js-file="bin/jhipster.cjs" typescript-loader="bundled" working-dir="$PROJECT_DIR$" +``` + +ms-ng-oauth2-mongodb-caffeine is the name of the sample application, you can replace it with any other sample name in the [code samples](./test-integration/samples) to generate a sample application. By default, the sample will be generated in the `../jhipster-samples` folder. + ## Generator implementation ### important config objects @@ -152,6 +173,7 @@ npm run ci:e2e:package # Builds the application npm run ci:e2e:prepare # Starts the application using docker npm run ci:e2e:run # Runs e2e tests ``` +List of commands being in the package.json scripts section of the generated sample. ## DX using vscode From 8b4a72c9a32a1c3f906a2116e1dd14a45f21934f Mon Sep 17 00:00:00 2001 From: Charlie Mordant Date: Sun, 27 Jul 2025 16:05:55 +0200 Subject: [PATCH 2/4] chore - rfc on file structure --- CONTRIBUTING.md | 6 +- DEVELOPMENT.md | 2 +- ...r-rfc-jhipster-generator-file-structure.md | 167 ++++++++++++++++++ ...generators-inheritance-and-composition.jpg | Bin 0 -> 231198 bytes 4 files changed, 172 insertions(+), 3 deletions(-) create mode 100644 rfcs/6-jhipster-rfc-jhipster-generator-file-structure.md create mode 100644 rfcs/assets/rfc6-generators-inheritance-and-composition.jpg diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b7d93e9c5d4f..bdd493abaef7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -66,7 +66,7 @@ Issues opened without any of these info will be **closed** without any explanati ## Development environment setup -See our [Development Guide](DEVELOPMENT.md) for more information on how to configure the jhipster generator for contributing. +See our [Development Guide](DEVELOPMENT.md) for more information on how to configure the JHipster generator for contributing. ### [Submitting a Pull Request](https://opensource.guide/how-to-contribute/#opening-a-pull-request) @@ -88,6 +88,8 @@ To ensure consistency throughout the source code, keep these rules in mind as yo - Most files formatting are checked by prettier and eslint. - EJS files use a two-space indentation for template logic and follow the generated file rules for the templating parts. +The jhipster generator structure and file naming conventions are documented in the [RFC 6](./rfcs/6-jhipster-rfc-jhipster-generator-file-structure.md). + Please ensure to run `npm run lint` and `npm test` on the project root before submitting a pull request. You can also run `npm run lint-fix` to fix some of the lint issues automatically. ## Git Commit Guidelines @@ -167,7 +169,7 @@ or joined the [JHipster team](https://www.jhipster.tech/team/). Sometimes, major feature requests are "complex" or "substantial". In this case, GitHub Issues might not be the best tool to present them because we will need a lot of going back and forth to reach a consensus. -So we ask that these feature request be put through a formal design process and have their specifications described in an "RFC" (request for comments) that will be validated by the team through a Pull Request Review. +So we ask that these feature requests be put through a formal design process and have their specifications described in an "RFC" (request for comments) that will be validated by the team through a Pull Request Review. The RFC process is intended to provide a consistent and controlled path for major features and directions of the project. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index db940252fadd..91a38e0f3082 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -109,7 +109,7 @@ It is also possible to debug sub generators by selecting one of the other debug #### Debugging with IntelliJ IDEA When you start intelliJ IDEA on the `generator-jhipster` project, you'll have access to a run configuration letting execute any `.spec.ts` file within any package. -If you want to test a specific generator, you can create a new node.js run configuration with the following settings: +If you want to test a specific generator, you can create a new Node.js run configuration with the following settings: ``` application-parameters="generate-sample ms-ng-oauth2-mongodb-caffeine --global" path-to-js-file="bin/jhipster.cjs" typescript-loader="bundled" working-dir="$PROJECT_DIR$" ``` diff --git a/rfcs/6-jhipster-rfc-jhipster-generator-file-structure.md b/rfcs/6-jhipster-rfc-jhipster-generator-file-structure.md new file mode 100644 index 000000000000..449dbf81d764 --- /dev/null +++ b/rfcs/6-jhipster-rfc-jhipster-generator-file-structure.md @@ -0,0 +1,167 @@ +# JHipster-RFC-6: jhipster generator file structure + + + +- Feature Name:jhipster_generator_file_structure +- Start Date: 2025-07-26 +- Issue: [jhipster/generator-jhipster#30187](https://github.com/jhipster/generator-jhipster/issues/30187) + +## Summary + +[summary]: #summary + +The goal of this RFC is to describe the generator conventions and file structure for the JHipster generator that enhances modularity, maintainability, and ease of use. The new structure will allow for better organization of files and directories, making it easier for developers to navigate and contribute to the project. + +## Motivation + +[motivation]: #motivation + +Improving the file structure of the JHipster generator is essential for several reasons: +- **Modularity**: A well-defined structure allows for better modularization of the generator, making it easier to add, remove, or update features without affecting the entire codebase. +- **Maintainability**: A clear and consistent file structure makes it easier for developers to understand the codebase, locate files, and make changes. This is especially important for new contributors who may find the current structure confusing. +- **Ease of Use**: A more intuitive file structure can improve the developer experience, making it easier to find and use the generator's features. This can lead to increased adoption and contribution from the community. +- **Scalability**: As the generator grows and evolves, a well-organized file structure will help manage complexity and ensure that the codebase remains manageable. +- **Consistency**: Establishing conventions for file organization will lead to a more consistent codebase, making it easier for developers to follow best practices and contribute effectively. +- **Extensibility**: A modular file structure will facilitate the addition of new features and technologies, allowing the generator to adapt to changing requirements and trends in the software development landscape. Also to support leverage and ease the maintainance of third party blueprint providers in the long term. + +## Guide-level explanation + +[guide-level-explanation]: #guide-level-explanation + +This RFC description will be split into multiple parts: +1. **Blueprint/Generators convention Overview**: will explain the different kind of generators and their purpose. +2. **Package and file Structure**: will describe the proposed file structure for each kind of generator. +3. Inheritance and Composition: will explain how the inheritance and composition of generators will work. +4. Methods and Functions: will detail the methods and functions that should be implemented in each file type. + +### Blueprint/Generators convention Overview + +[blueprint-generators-convention-overview]: #blueprint-generators-convention-overview + +The JHipster generator will be organized into several types of generators, each serving a specific purpose. The main types of generators are: + - **Base Generators**: These are the core generators that provide the basic functionality of the downstream JHipster generator in the inheritance chain. This includes: + - Tasks and Priorities + - Contexts and object injection in functions (application, entities, etc.) + - Facade of useful methods and functions (writing, propmting, etc.) + - **Feature Generators**: These generators add specific features or functionalities of jhipster (cucumber, kubernetes, ...). They can be used to extend the capabilities of the base generator by extending its core functionality. + - **Bootstrap Generators**: These generators are used to bootstrap the Features generators by executing common tasks that are common to many of them. + +## Reference-level explanation + +[reference-level-explanation]: #reference-level-explanation + +### Generators inheritance and composition + +[generators-inheritance-and-composition]: #generators-inheritance-and-composition + +Here is the proposed inheritance and composition possibility for the JHipster generator depending on their kind + +![Inheritance and composition diagram](./assets/rfc6-generators-inheritance-and-composition.jpg "Inheritance and composition diagram") + +### Package and file structure +[package-and-file-structure]: #package-and-file-structure + +#### Base Generators +[base-generators]: #base-generators +The base generators will be organized into a specific package structure to ensure clarity and maintainability. The proposed structure is as follows: + +```generator-jhipster/ +├── generators/ +│ ├── base-/ +│ │ ├── tasks.d.ts // optional +│ │ ├── types.d.ts // optional +│ │ ├── api.d.ts // optional +│ │ ├── index.ts +│ │ ├── generator.ts +│ │ ├── internal/ // optional +│ │ │ ├── .ts +│ │ ├── support/ // optional +│ │ │ ├── .ts +``` + +This structure allows for a clear separation of concerns, with each base generator having its own directory containing its tasks, types, and internal support files. The `internal` directory is used for helper functions that are not intended to be used outside the base generator, while the `support` directory contains utility functions that can be reused across different base generators. + +**tasks.d.ts**: This file defines the tasks that the base generator will declare. It includes the task names, descriptions, and any parameters required for each task as well as their orders and injected parameters. + +**types.d.ts**: This file defines the types used by the base generator, including any interfaces or type aliases that are specific to the base generator (Workspace, Application, Entities, Source template metadata, etc.). **RULE**: Types shouldn't contain any fields that are not directly related to the generator's functionality. They should be used to define the structure of the data that the base generator will work with, such as the application configuration or entity definitions. They can extend types from an upstream generator, and should not contain any business logic or methods. + +**api.d.ts**: This file defines the public API of the base generator, including any methods or properties that should be accessible to other generators. It serves as a contract for the base generator's functionality. + +**index.ts**: This file serves as the entry point for the base generator, exporting the main functionality and any public methods or classes that should be accessible to other generators. Usually exposes the generator class, api, types and tasks. + +**generator.ts**: This file contains the main generator class that extends the JHipster base generator class. + It should contains: + - Facade of support methods and functions that can be used by the downstream generator (`write() {return import {'./support/write.ts'}.writeFile}`). + - Loading of contextual objects (application, entities, etc.) and their injection in the priorities methods. + +##### PROs + +- Clear separation of concerns, making it easier to understand and maintain the codebase. +- Modular structure allows for easy addition or removal of features without affecting the entire codebase. +- Consistent naming conventions and file organization improve readability and developer experience. +- Allow sibling feature generators (not part of the inheritance chain) to access the base generator's support methods and functions. + +#### Feature Generators file structure +[feature-generators-file-structure]: #feature-generators-file-structure + +Feature generators will be organized in a similar way to base generators, but with a focus on adding specific features or functionalities. The proposed structure is as follows: + +```generator-jhipster/ +├── generators/ +│ ├── / +│ │ ├── commands.d.ts // optional +│ │ ├── types.d.ts // optional +│ │ ├── index.ts +│ │ ├── generator.ts +│ │ ├── files.ts // optional +│ │ ├── internal/ // optional +│ │ │ ├── .ts +│ │ ├── mutation/ // optional +│ │ │ ├── .ts +│ │ ├── support/ // optional +│ │ │ ├── .ts +│ │ ├── resources/ // optional +│ │ │ ├── . +│ │ ├── templates/ // optional +│ │ │ ├── .ts +``` +This structure allows for a clear organization of feature-specific files, with each feature generator having its own directory containing its cli commands, types, and internal support files. The `resources` directory is used for any static resources required by the feature generator, such as templates or configuration files. + +**commands.d.ts**: This file defines the CLI commands that the feature generator will provide. It includes the command names, descriptions, configuration storage, and any parameters required for each command. + +**files.ts**: This file contains the file templates and their associated metadata that the feature generator will use to generate files in the target application. It includes the file names, templates, and any parameters required for each file. **RULE**: the list of file to generate should have contextual information (application, entities, etc.) injected in the file data and never use the generator as a context. + +**mutation/**: This directory contains the mutation files that define the tasks and steps that the feature generator will perform. Each file represents a specific task or step in the generation process (i.e. `preparing.ts`) , allowing for better organization and modularity. **RULE**: Mutation methods of jhipster core should call support/methods instead of the generators facade to lower the amount of generator LoCs. + +**resources/**: This directory contains any static resources required by the feature generator, such as configuration files, images, or other assets. These resources can be used by the generator during the generation process. + +**templates/**: This directory contains any templates used by the feature generator to generate files in the target application. These templates can be used to create files with specific content or structure based on the feature being added. + +**generator.ts**: This file contains the main generator class that extends the JHipster base generator class. The difference with the base generator is that: + - It additionally contains the phase methods that will be executed in the generation process (i.e. `preparing`, `writing`, `post-processing`). + - It does not need to load the contextual objects (application, entities, etc.) as they are already loaded by the base generator. + - It can use the upstream base and feature generator's support methods and functions directly (i.e. `this.write()`) without the need to call `support/anysupport`. This will ease the refactoring of the `support`and `mutation` files, methods and functions in the future because it will not be necessary to change the import paths in the downstream feature generators. + +##### PROs + +- Clear organization of feature-specific files, making it easier to understand and maintain the codebase. +- Modular structure allows for easy addition or removal of features without affecting the entire codebase. +- Consistent naming conventions and file organization improve readability and developer experience. +- Allows for better organization of CLI commands, file templates, and mutation files, making it easier to manage the generation process. +- Provides a clear separation between static resources and templates, making it easier to manage and update them independently. +- Allows sibling feature generators (not part of the inheritance chain) to access the base generator's support methods or to reuse part of the mutations without the need to extend. + +## Drawbacks + +[drawbacks]: #drawbacks + +It includes a lot of changes to the current file structure and conventions, which may require significant effort to implement and migrate existing generators. It will lead to some refactoring in blueprints extending the V8 core generator and willing to upgrade. Hopefully, the amount of reuse of core business logic by these contributions will be much higher, which will lower their maintenance cost (and potential bugs) in the long run. + +## Unresolved questions + +[unresolved-questions]: #unresolved-questions + +The fine grained implementation details of each file as not been discussed yet, such as: + - The amount and granularity of methods in the mutate (by file, by component, etc.) and support files. + + - The other packages outside generators: cli, jdl, tests, etc. will not be changed by this RFC. They will remain as they are for now, but the new file structure will allow for easier integration of these packages in the future. diff --git a/rfcs/assets/rfc6-generators-inheritance-and-composition.jpg b/rfcs/assets/rfc6-generators-inheritance-and-composition.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a5ef857a75560a997368500ae0eb3e5204aa1f44 GIT binary patch literal 231198 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�xDsaz1^iwneYb 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

vW2ZP@iBuQ~vJ# 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 literal 0 HcmV?d00001 From 8992902eadd10346016286dcf2b8f1e208fb0c4a Mon Sep 17 00:00:00 2001 From: Charlie Mordant Date: Sun, 27 Jul 2025 16:21:53 +0200 Subject: [PATCH 3/4] prettier ignore --- DEVELOPMENT.md | 6 ++- ...r-rfc-jhipster-generator-file-structure.md | 42 ++++++++++++------- 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 91a38e0f3082..82920656249c 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -46,12 +46,14 @@ For testing, you will want to generate an application, and there is a specific i To generate a new application, you can run the following command in your terminal: ```shell -node bin/jhipster.cjs generate-sample ng-default --global +node bin/jhipster.cjs generate-sample ng-default --global ``` + From the root of your cloned `generator-jhipster` project, this will generate a sample application in the current folder using the local version of JHipster. ng-default is the name of the sample application, you can replace it with any other sample name in the [code samples](./test-integration/samples) to generate a sample application. By default, the sample will be generated in the `../jhipster-samples` folder. For workspaces, an additional `jhipster-samples.code-workspace` file will be generated in the same folder, which can be used to open the samples in a single VSCode workspace. Still, you'll need to delete the `jhipster-samples.code-workspace` file if you want to generate another workspace sample in the same folder. #### Generating a new application using npm link + To overcome this, you need to run `npm link generator-jhipster` on the generated project folder as well, so that the local version has a symbolic link to the development version of JHipster. Also add the option `--skip-jhipster-dependencies` to generate the application ignoring the JHipster dependencies (otherwise a released version will be installed each time npm install/ci is called). You can later on re-add the dependency with the command `jhipster --no-skip-jhipster-dependencies`. @@ -110,6 +112,7 @@ It is also possible to debug sub generators by selecting one of the other debug When you start intelliJ IDEA on the `generator-jhipster` project, you'll have access to a run configuration letting execute any `.spec.ts` file within any package. If you want to test a specific generator, you can create a new Node.js run configuration with the following settings: + ``` application-parameters="generate-sample ms-ng-oauth2-mongodb-caffeine --global" path-to-js-file="bin/jhipster.cjs" typescript-loader="bundled" working-dir="$PROJECT_DIR$" ``` @@ -173,6 +176,7 @@ npm run ci:e2e:package # Builds the application npm run ci:e2e:prepare # Starts the application using docker npm run ci:e2e:run # Runs e2e tests ``` + List of commands being in the package.json scripts section of the generated sample. ## DX using vscode diff --git a/rfcs/6-jhipster-rfc-jhipster-generator-file-structure.md b/rfcs/6-jhipster-rfc-jhipster-generator-file-structure.md index 449dbf81d764..a6c042a12631 100644 --- a/rfcs/6-jhipster-rfc-jhipster-generator-file-structure.md +++ b/rfcs/6-jhipster-rfc-jhipster-generator-file-structure.md @@ -17,6 +17,7 @@ The goal of this RFC is to describe the generator conventions and file structure [motivation]: #motivation Improving the file structure of the JHipster generator is essential for several reasons: + - **Modularity**: A well-defined structure allows for better modularization of the generator, making it easier to add, remove, or update features without affecting the entire codebase. - **Maintainability**: A clear and consistent file structure makes it easier for developers to understand the codebase, locate files, and make changes. This is especially important for new contributors who may find the current structure confusing. - **Ease of Use**: A more intuitive file structure can improve the developer experience, making it easier to find and use the generator's features. This can lead to increased adoption and contribution from the community. @@ -29,6 +30,7 @@ Improving the file structure of the JHipster generator is essential for several [guide-level-explanation]: #guide-level-explanation This RFC description will be split into multiple parts: + 1. **Blueprint/Generators convention Overview**: will explain the different kind of generators and their purpose. 2. **Package and file Structure**: will describe the proposed file structure for each kind of generator. 3. Inheritance and Composition: will explain how the inheritance and composition of generators will work. @@ -39,12 +41,16 @@ This RFC description will be split into multiple parts: [blueprint-generators-convention-overview]: #blueprint-generators-convention-overview The JHipster generator will be organized into several types of generators, each serving a specific purpose. The main types of generators are: - - **Base Generators**: These are the core generators that provide the basic functionality of the downstream JHipster generator in the inheritance chain. This includes: - - Tasks and Priorities + +- **Base Generators**: These are the core generators that provide the basic functionality of the downstream JHipster generator in the inheritance chain. This includes: + + - Tasks and Priorities + - Contexts and object injection in functions (application, entities, etc.) + - Facade of useful methods and functions (writing, propmting, etc.) - - **Feature Generators**: These generators add specific features or functionalities of jhipster (cucumber, kubernetes, ...). They can be used to extend the capabilities of the base generator by extending its core functionality. - - **Bootstrap Generators**: These generators are used to bootstrap the Features generators by executing common tasks that are common to many of them. +- **Feature Generators**: These generators add specific features or functionalities of jhipster (cucumber, kubernetes, ...). They can be used to extend the capabilities of the base generator by extending its core functionality. +- **Bootstrap Generators**: These generators are used to bootstrap the Features generators by executing common tasks that are common to many of them. ## Reference-level explanation @@ -56,13 +62,16 @@ The JHipster generator will be organized into several types of generators, each Here is the proposed inheritance and composition possibility for the JHipster generator depending on their kind -![Inheritance and composition diagram](./assets/rfc6-generators-inheritance-and-composition.jpg "Inheritance and composition diagram") +![Inheritance and composition diagram](./assets/rfc6-generators-inheritance-and-composition.jpg 'Inheritance and composition diagram') ### Package and file structure + [package-and-file-structure]: #package-and-file-structure #### Base Generators + [base-generators]: #base-generators + The base generators will be organized into a specific package structure to ensure clarity and maintainability. The proposed structure is as follows: ```generator-jhipster/ @@ -90,9 +99,10 @@ This structure allows for a clear separation of concerns, with each base generat **index.ts**: This file serves as the entry point for the base generator, exporting the main functionality and any public methods or classes that should be accessible to other generators. Usually exposes the generator class, api, types and tasks. **generator.ts**: This file contains the main generator class that extends the JHipster base generator class. - It should contains: - - Facade of support methods and functions that can be used by the downstream generator (`write() {return import {'./support/write.ts'}.writeFile}`). - - Loading of contextual objects (application, entities, etc.) and their injection in the priorities methods. +It should contains: + +- Facade of support methods and functions that can be used by the downstream generator (`write() {return import {'./support/write.ts'}.writeFile}`). +- Loading of contextual objects (application, entities, etc.) and their injection in the priorities methods. ##### PROs @@ -102,6 +112,7 @@ This structure allows for a clear separation of concerns, with each base generat - Allow sibling feature generators (not part of the inheritance chain) to access the base generator's support methods and functions. #### Feature Generators file structure + [feature-generators-file-structure]: #feature-generators-file-structure Feature generators will be organized in a similar way to base generators, but with a focus on adding specific features or functionalities. The proposed structure is as follows: @@ -125,22 +136,24 @@ Feature generators will be organized in a similar way to base generators, but wi │ │ ├── templates/ // optional │ │ │ ├── .ts ``` + This structure allows for a clear organization of feature-specific files, with each feature generator having its own directory containing its cli commands, types, and internal support files. The `resources` directory is used for any static resources required by the feature generator, such as templates or configuration files. **commands.d.ts**: This file defines the CLI commands that the feature generator will provide. It includes the command names, descriptions, configuration storage, and any parameters required for each command. **files.ts**: This file contains the file templates and their associated metadata that the feature generator will use to generate files in the target application. It includes the file names, templates, and any parameters required for each file. **RULE**: the list of file to generate should have contextual information (application, entities, etc.) injected in the file data and never use the generator as a context. -**mutation/**: This directory contains the mutation files that define the tasks and steps that the feature generator will perform. Each file represents a specific task or step in the generation process (i.e. `preparing.ts`) , allowing for better organization and modularity. **RULE**: Mutation methods of jhipster core should call support/methods instead of the generators facade to lower the amount of generator LoCs. +**mutation/**: This directory contains the mutation files that define the tasks and steps that the feature generator will perform. Each file represents a specific task or step in the generation process (i.e. `preparing.ts`) , allowing for better organization and modularity. **RULE**: Mutation methods of jhipster core should call support/methods instead of the generators facade to lower the amount of generator LoCs. **resources/**: This directory contains any static resources required by the feature generator, such as configuration files, images, or other assets. These resources can be used by the generator during the generation process. **templates/**: This directory contains any templates used by the feature generator to generate files in the target application. These templates can be used to create files with specific content or structure based on the feature being added. **generator.ts**: This file contains the main generator class that extends the JHipster base generator class. The difference with the base generator is that: - - It additionally contains the phase methods that will be executed in the generation process (i.e. `preparing`, `writing`, `post-processing`). - - It does not need to load the contextual objects (application, entities, etc.) as they are already loaded by the base generator. - - It can use the upstream base and feature generator's support methods and functions directly (i.e. `this.write()`) without the need to call `support/anysupport`. This will ease the refactoring of the `support`and `mutation` files, methods and functions in the future because it will not be necessary to change the import paths in the downstream feature generators. + +- It additionally contains the phase methods that will be executed in the generation process (i.e. `preparing`, `writing`, `post-processing`). +- It does not need to load the contextual objects (application, entities, etc.) as they are already loaded by the base generator. +- It can use the upstream base and feature generator's support methods and functions directly (i.e. `this.write()`) without the need to call `support/anysupport`. This will ease the refactoring of the `support`and `mutation` files, methods and functions in the future because it will not be necessary to change the import paths in the downstream feature generators. ##### PROs @@ -162,6 +175,7 @@ It includes a lot of changes to the current file structure and conventions, whic [unresolved-questions]: #unresolved-questions The fine grained implementation details of each file as not been discussed yet, such as: - - The amount and granularity of methods in the mutate (by file, by component, etc.) and support files. - - The other packages outside generators: cli, jdl, tests, etc. will not be changed by this RFC. They will remain as they are for now, but the new file structure will allow for easier integration of these packages in the future. +- The amount and granularity of methods in the mutate (by file, by component, etc.) and support files. + +- The other packages outside generators: cli, jdl, tests, etc. will not be changed by this RFC. They will remain as they are for now, but the new file structure will allow for easier integration of these packages in the future. From 4a905a0fb85a148c09ffadcca51772b506bb4352 Mon Sep 17 00:00:00 2001 From: Charlie Mordant Date: Fri, 15 Aug 2025 17:12:01 +0200 Subject: [PATCH 4/4] Update 6-jhipster-rfc-jhipster-generator-file-structure.md --- ...6-jhipster-rfc-jhipster-generator-file-structure.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/rfcs/6-jhipster-rfc-jhipster-generator-file-structure.md b/rfcs/6-jhipster-rfc-jhipster-generator-file-structure.md index a6c042a12631..eed2c995e816 100644 --- a/rfcs/6-jhipster-rfc-jhipster-generator-file-structure.md +++ b/rfcs/6-jhipster-rfc-jhipster-generator-file-structure.md @@ -78,7 +78,7 @@ The base generators will be organized into a specific package structure to ensur ├── generators/ │ ├── base-/ │ │ ├── tasks.d.ts // optional -│ │ ├── types.d.ts // optional +│ │ ├── types-mutations.ts // optional │ │ ├── api.d.ts // optional │ │ ├── index.ts │ │ ├── generator.ts @@ -92,7 +92,7 @@ This structure allows for a clear separation of concerns, with each base generat **tasks.d.ts**: This file defines the tasks that the base generator will declare. It includes the task names, descriptions, and any parameters required for each task as well as their orders and injected parameters. -**types.d.ts**: This file defines the types used by the base generator, including any interfaces or type aliases that are specific to the base generator (Workspace, Application, Entities, Source template metadata, etc.). **RULE**: Types shouldn't contain any fields that are not directly related to the generator's functionality. They should be used to define the structure of the data that the base generator will work with, such as the application configuration or entity definitions. They can extend types from an upstream generator, and should not contain any business logic or methods. +**types-mutations.ts**: This file defines the types and the mutation (from empty to fully hydrated object) used by the base generator, including any interfaces or type aliases that are specific to the base generator (Workspace, Application, Entities, Source template metadata, etc.). **RULE**: Types shouldn't contain any fields that are not directly related to the generator's functionality. They should be used to define the structure of the data that the base generator will work with, such as the application configuration or entity definitions. They can extend types from an upstream generator, and should not contain any business logic or methods. **api.d.ts**: This file defines the public API of the base generator, including any methods or properties that should be accessible to other generators. It serves as a contract for the base generator's functionality. @@ -121,14 +121,12 @@ Feature generators will be organized in a similar way to base generators, but wi ├── generators/ │ ├── / │ │ ├── commands.d.ts // optional -│ │ ├── types.d.ts // optional +│ │ ├── types-mutations.ts // optional │ │ ├── index.ts │ │ ├── generator.ts │ │ ├── files.ts // optional │ │ ├── internal/ // optional │ │ │ ├── .ts -│ │ ├── mutation/ // optional -│ │ │ ├── .ts │ │ ├── support/ // optional │ │ │ ├── .ts │ │ ├── resources/ // optional @@ -143,8 +141,6 @@ This structure allows for a clear organization of feature-specific files, with e **files.ts**: This file contains the file templates and their associated metadata that the feature generator will use to generate files in the target application. It includes the file names, templates, and any parameters required for each file. **RULE**: the list of file to generate should have contextual information (application, entities, etc.) injected in the file data and never use the generator as a context. -**mutation/**: This directory contains the mutation files that define the tasks and steps that the feature generator will perform. Each file represents a specific task or step in the generation process (i.e. `preparing.ts`) , allowing for better organization and modularity. **RULE**: Mutation methods of jhipster core should call support/methods instead of the generators facade to lower the amount of generator LoCs. - **resources/**: This directory contains any static resources required by the feature generator, such as configuration files, images, or other assets. These resources can be used by the generator during the generation process. **templates/**: This directory contains any templates used by the feature generator to generate files in the target application. These templates can be used to create files with specific content or structure based on the feature being added.