### Run Gradle Tests in Demo Project Source: https://github.com/micronaut-projects/micronaut-projectgen/blob/0.0.x/test-suite-helloworld-cli/README.md Navigate into the generated project directory and run the tests using Gradle. This verifies the project setup and added features. ```bash cd demo ./gradlew test ``` -------------------------------- ### Implement Options Interface for Project Generation Source: https://github.com/micronaut-projects/micronaut-projectgen/blob/0.0.x/src/main/docs/guide/demo/defineOptions.adoc Implement the `api:projectgen.core.options.Options` interface to define custom project generation options. This example shows a basic implementation. ```java package io.micronaut.projectgen.demo; import io.micronaut.projectgen.core.options.Options; import io.micronaut.projectgen.core.options.OptionsFactory; import jakarta.inject.Singleton; @Singleton public class OptionsFactory implements OptionsFactory { @Override public Options create() { return new Options() { @Override public String getName() { return "demo"; } @Override public String getDescription() { return "A demo project"; } }; } } ``` -------------------------------- ### Features Endpoint Response Example Source: https://context7.com/micronaut-projects/micronaut-projectgen/llms.txt Example JSON response from the `/api/v1/features` endpoint, listing available features with their details. ```json { "features": [ { "name": "graalvm", "title": "GraalVM Native Image", "description": "Support for compiling Micronaut applications to native images using GraalVM.", "preview": false, "community": false }, { "name": "http-server", "title": "Micronaut HTTP Server", "description": "Adds Netty-based HTTP server support.", "preview": false, "community": false } ] } ``` -------------------------------- ### Micronaut CLI Project Generation Example Source: https://github.com/micronaut-projects/micronaut-projectgen/blob/0.0.x/src/main/docs/guide/demo/cli.adoc Use this Java code to create a Micronaut CLI application that generates a project. It leverages the ProjectGenerator API to create a project in a specified directory. ```java package io.micronaut.projectgen.demo; import io.micronaut.core.annotation.NonNull; import io.micronaut.core.annotation.Nullable; import io.micronaut.inject.cli.Command; import io.micronaut.projectgen.core.generator.ProjectGenerator; import io.micronaut.projectgen.core.model.ProjectModel; import jakarta.inject.Inject; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @Command(name = "create", description = "Create a new project") public class CreateCommand { @Inject private ProjectGenerator projectGenerator; @Command public void create(@NonNull String name, @Nullable Path directory) throws IOException { if (directory == null) { directory = Path.of(System.getProperty("user.dir")); } if (!Files.exists(directory)) { Files.createDirectories(directory); } ProjectModel project = ProjectModel.builder(name).build(); projectGenerator.generate(project, directory); System.out.println("Project " + name + " generated in " + directory.toAbsolutePath()); } } ``` -------------------------------- ### Language Enum Usage Source: https://context7.com/micronaut-projects/micronaut-projectgen/llms.txt Illustrates the use of the `Language` enum for supported JVM programming languages. Shows how to get language extensions, source directories, and generate full file paths for source and test files. Also demonstrates utility methods for retrieving all extensions and source directories. ```java import io.micronaut.projectgen.core.options.Language; Language lang = Language.of("kotlin").orElseThrow(); System.out.println(lang.getExtension()); // → "kt" System.out.println(lang.getSrcDir()); // → "src/main/kotlin" System.out.println(lang.getTestSrcDir()); // → "src/test/kotlin" // Full file path helpers String srcPath = lang.getSourcePath("/com/example/App"); // → "src/main/kotlin/com/example/App.kt" String testPath = lang.getTestSourcePath("/com/example/AppTest"); // → "src/test/kotlin/com/example/AppTest.kt" // Aggregate utilities String[] allExtensions = Language.extensions(); // ["py", "java", "groovy", "kt"] String[] allSrcDirs = Language.srcDirs(); // ["src/main/python", ...] ``` -------------------------------- ### Publish Micronaut to Maven Local Source: https://github.com/micronaut-projects/micronaut-projectgen/blob/0.0.x/CONTRIBUTING.md Run this task to get a local development version of Micronaut XXX working. You can then reference the version specified in `gradle.properties` in a test project. ```bash ./gradlew pTML ``` -------------------------------- ### Get Inline Diff via HTTP API Source: https://context7.com/micronaut-projects/micronaut-projectgen/llms.txt Use `POST /api/v1/diff` to retrieve the project diff inline as `text/plain`. Requires a `FeatureDiffer` bean in the context. ```bash # Inline diff curl -X POST http://localhost:8080/api/v1/diff \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "name=demo&lang=java&build=gradle&java=21&features=graalvm" ``` -------------------------------- ### Configure Project Generation Options Source: https://context7.com/micronaut-projects/micronaut-projectgen/llms.txt Demonstrates how to configure project generation options using `GenericOptionsBuilder`. Shows how to set project name, package, build tools, language, JDK version, test framework, and features. Also illustrates accessing computed defaults for source paths and build tools. ```java import io.micronaut.projectgen.core.options.*; import io.micronaut.projectgen.core.buildtools.BuildTool; import io.micronaut.projectgen.core.buildtools.gradle.GradleDsl; // Build Options for a Kotlin + Gradle Kotlin DSL project targeting JDK 21 Options options = GenericOptionsBuilder.builder() .name("my-service") .packageName("com.example") .group("com.example") .artifact("my-service") .version("0.1") .language(Language.KOTLIN) .buildTools(List.of(BuildTool.GRADLE)) .gradleDsl(GradleDsl.KOTLIN) .java(JdkVersion.JDK_21) .testFramework(TestFramework.KOTEST) .features(List.of("graalvm", "http-client")) .build(); // Access computed defaults String sourcePath = options.language().getSourcePath("/com/example/Application"); // → "src/main/kotlin/com/example/Application.kt" String testPath = options.testFramework().getSourcePath("/com/example/MyService", options.language()); // → "src/test/kotlin/com/example/MyServiceTest.kt" BuildTool primary = options.getBuildTool(); // → BuildTool.GRADLE ``` -------------------------------- ### Create Project Directory Source: https://github.com/micronaut-projects/micronaut-projectgen/blob/0.0.x/test-suite-helloworld-cli/README.md Create a new directory where the project will be generated. Ensure this directory is empty. ```bash mkdir demo ``` -------------------------------- ### Add Sample Java Code Source: https://github.com/micronaut-projects/micronaut-projectgen/blob/0.0.x/src/main/docs/guide/demo/addCode.adoc Demonstrates adding a basic Java source file to the generated project. This is useful for including starter code or utility classes. ```java package io.micronaut.projectgen.demo; public class SampleCode { public String hello() { return "Hello World!"; } } ``` -------------------------------- ### Run Maven Tests in Demo Project Source: https://github.com/micronaut-projects/micronaut-projectgen/blob/0.0.x/test-suite-helloworld-cli/README.md Navigate into the generated project directory and run the tests using Maven. This provides an alternative way to verify the project. ```bash cd demo ./mvnw test ``` -------------------------------- ### Build test-suite-helloworld-cli Module Source: https://github.com/micronaut-projects/micronaut-projectgen/blob/0.0.x/test-suite-helloworld-cli/README.md Build the specified module in the project. This is a prerequisite for using the CLI. ```bash ./gradlew :test-suite-helloworld-cli:build ``` -------------------------------- ### Test Project Generation Source: https://github.com/micronaut-projects/micronaut-projectgen/blob/0.0.x/src/main/docs/guide/demo/test.adoc This Java code snippet demonstrates how to test the project generation functionality. It includes necessary imports and a test method. ```java package io.micronaut.projectgen.demo; import io.micronaut.projectgen.ProjectGenerator; import org.junit.jupiter.api.Test; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import static org.junit.jupiter.api.Assertions.assertTrue; class ProjectGenTest { @Test void testProjectGeneration() throws IOException { Path tempDir = Files.createTempDirectory("micronaut-projectgen-test"); ProjectGenerator generator = new ProjectGenerator(tempDir); generator.generate("my-app"); Path appPath = tempDir.resolve("my-app"); assertTrue(Files.exists(appPath)); assertTrue(Files.isDirectory(appPath)); // Further assertions can be added here to check the generated project structure and files } } ``` -------------------------------- ### Inspect OpenRewrite Recipes with RecipeFetcher Source: https://context7.com/micronaut-projects/micronaut-projectgen/llms.txt Use `RecipeFetcher` to retrieve dependencies, properties, and files declared in OpenRewrite recipes. This Java code demonstrates how to fetch Gradle and Maven dependencies, application and bootstrap properties, files, and documentation links associated with a given recipe name. ```java import io.micronaut.projectgen.core.openrewrite.RecipeFetcher; import io.micronaut.projectgen.core.buildtools.BuildTool; import jakarta.inject.Inject; @Singleton public class RecipeInspector { @Inject RecipeFetcher recipeFetcher; public void inspect(String recipeName) { // Retrieve dependencies declared in the recipe for Gradle var gradleDeps = recipeFetcher.findAllByRecipeNameAndBuildTool(recipeName, BuildTool.GRADLE); gradleDeps.forEach(d -> System.out.printf("Gradle: %s:%s%n", d.getGroupId(), d.getArtifactId())); // Maven variant var mavenDeps = recipeFetcher.findAllByRecipeNameAndBuildTool(recipeName, BuildTool.MAVEN); // Application properties added by the recipe recipeFetcher.findPropertiesByRecipeName(recipeName) .ifPresent(props -> props.forEach((k, v) -> System.out.printf("%s=%s%n", k, v))); // Bootstrap properties recipeFetcher.findBootstrapPropertiesByRecipeName(recipeName) .ifPresent(props -> props.forEach((k, v) -> System.out.printf("bootstrap.%s=%s%n", k, v))); // Files created by the recipe (e.g. XML files) recipeFetcher.findAllFilesByRecipeName(recipeName) .forEach(fc -> System.out.println("File: " + fc.relativeFileName())); // Documentation links recipeFetcher.findFrameworkDocumentationByRecipeName(recipeName) .ifPresent(link -> System.out.println("Docs: " + link)); } } ``` -------------------------------- ### Generate New Project with CLI Source: https://github.com/micronaut-projects/micronaut-projectgen/blob/0.0.x/test-suite-helloworld-cli/README.md Use the built CLI tool to generate a new project in the specified output directory. This command assumes the CLI JAR is in the correct location. ```bash java -jar test-suite-helloworld-cli/build/libs/test-suite-helloworld-cli-0.1-all.jar create --output demo ``` -------------------------------- ### Generate Gradle build file (build.gradle.kts) Source: https://github.com/micronaut-projects/micronaut-projectgen/blob/0.0.x/src/main/docs/guide/demo.adoc This Kotlin script configures the Gradle build for a Java application, including dependencies and main class. ```kotlin plugins { id("java") id("application") } group = "io.micronaut.projectgen" version = "1.0.0" repositories { mavenCentral() } dependencies { testImplementation("org.junit.jupiter:junit-jupiter:5.10.2") } java { sourceCompatibility = JavaVersion.VERSION_21 targetCompatibility = JavaVersion.VERSION_21 } tasks.test { useJUnitPlatform() } application { mainClass.set("com.example.HelloWorld") } ``` -------------------------------- ### Generate Maven build file (pom.xml) Source: https://github.com/micronaut-projects/micronaut-projectgen/blob/0.0.x/src/main/docs/guide/demo.adoc This XML configuration sets up the Maven build for a Java project, specifying plugins, dependencies, and the main class. ```xml 4.0.0 io.micronaut.projectgen demo-project 1.0.0 21 21 org.junit.jupiter junit-jupiter 5.10.2 test org.apache.maven.plugins maven-surefire-plugin 3.1.2 org.apache.maven.plugins maven-jar-plugin 3.3.0 com.example.HelloWorld ``` -------------------------------- ### Download Project Diff via API Source: https://context7.com/micronaut-projects/micronaut-projectgen/llms.txt Use this curl command to download a project diff. Specify project name, language, build tool, Java version, and desired features. ```bash curl -X POST http://localhost:8080/api/v1/diff/download \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "name=demo&lang=java&build=gradle&java=21&features=graalvm" \ -o demo.diff ``` -------------------------------- ### Project Download Controller Source: https://github.com/micronaut-projects/micronaut-projectgen/blob/0.0.x/src/main/docs/guide/demo/httpServerDemo.adoc This Java controller handles requests to download a ZIP file containing a generated project. It utilizes Micronaut Views for server-side HTML rendering. ```java package io.micronaut.projectgen.demo; import io.micronaut.core.annotation.Nullable; import io.micronaut.http.HttpRequest; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Get; import io.micronaut.http.server.types.files.StreamedFile; import io.micronaut.projectgen.ProjectGenerator; import io.micronaut.projectgen.model.ProjectRequest; import io.micronaut.views.ViewsRenderer; import java.io.ByteArrayInputStream; import java.util.Map; @Controller public class HomeController { private final ViewsRenderer viewsRenderer; private final ProjectGenerator projectGenerator; public HomeController(ViewsRenderer viewsRenderer, ProjectGenerator projectGenerator) { this.viewsRenderer = viewsRenderer; this.projectGenerator = projectGenerator; } @Get public StreamedFile index(HttpRequest request, @Nullable String feature) { return new StreamedFile(new ByteArrayInputStream(viewsRenderer.render("index", Map.of("features", ProjectGenerator.FEATURES, "feature", feature == null ? "" : feature)).getBytes()), "text/html"); } @Get("/download") public StreamedFile download(HttpRequest request) { ProjectRequest projectRequest = new ProjectRequest(); projectRequest.setFeatures(request.getParameters().values().stream().toList()); return new StreamedFile(projectGenerator.generate(projectRequest), "application/zip"); } } ``` -------------------------------- ### Download Project ZIP via HTTP API Source: https://context7.com/micronaut-projects/micronaut-projectgen/llms.txt Use the `POST /api/v1/download/zip` endpoint to generate and download a project as a ZIP file. Accepts form-urlencoded data for project configuration. ```bash # Generate a Micronaut Kotlin + Gradle project with GraalVM support curl -X POST http://localhost:8080/api/v1/download/zip \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "name=my-app&lang=kotlin&build=gradle&gradleDsl=KOTLIN&java=21&testFramework=kotest&features=graalvm,http-server&packageName=com.example" \ -o my-app.zip # Verify the archive contents unzip -l my-app.zip # Archive: my-app.zip # Length Date Time Name # --------- ---------- ----- ---- # ... 2025-04-28 00:00 my-app/build.gradle.kts # ... 2025-04-28 00:00 my-app/settings.gradle.kts # ... 2025-04-28 00:00 my-app/src/main/kotlin/com/example/Application.kt # ... ... ``` -------------------------------- ### List Available Features via HTTP API Source: https://context7.com/micronaut-projects/micronaut-projectgen/llms.txt Query available features for project generation using `POST /api/v1/features`. This is useful for populating UI feature selectors. ```bash curl -X POST http://localhost:8080/api/v1/features \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "lang=java&build=gradle&java=21" | jq . ``` -------------------------------- ### Publish test-suite-openrewrite to Maven Local Source: https://github.com/micronaut-projects/micronaut-projectgen/blob/0.0.x/test-suite-helloworld-cli/README.md Publish the OpenRewrite recipes module to your local Maven repository. This is necessary for the CLI to access the recipes. ```bash ./gradlew publishToMavenLocal ``` -------------------------------- ### BuildTool Enum Usage Source: https://context7.com/micronaut-projects/micronaut-projectgen/llms.txt Shows how to use the `BuildTool` enum to identify build tools like Gradle and Maven. Demonstrates obtaining a `BuildTool` instance from a string, accessing its conventional JAR directory and display title, and using the default option. ```java import io.micronaut.projectgen.core.buildtools.BuildTool; BuildTool tool = BuildTool.of("gradle").orElseThrow(); // tool == BuildTool.GRADLE System.out.println(tool.getJarDirectory()); // → "build/libs" System.out.println(tool.getTitle()); // → "Gradle" System.out.println(BuildTool.DEFAULT_OPTION); // → BuildTool.GRADLE BuildTool maven = BuildTool.MAVEN; System.out.println(maven.getJarDirectory()); // → "target" ``` -------------------------------- ### Generate Projects to a Directory with ProjectGenerator Source: https://context7.com/micronaut-projects/micronaut-projectgen/llms.txt Use ProjectGenerator.writeTo() to generate project files directly into a specified filesystem directory. Ensure the Options object is configured with project details. ```java import io.micronaut.projectgen.core.generator.ProjectGenerator; import io.micronaut.projectgen.core.io.FileSystemOutputHandler; import io.micronaut.projectgen.core.io.ConsoleOutput; import io.micronaut.projectgen.core.options.*; import io.micronaut.projectgen.core.buildtools.BuildTool; import jakarta.inject.Inject; import java.io.File; import java.util.List; @Singleton public class GenerationService { @Inject ProjectGenerator projectGenerator; // Generate directly to a filesystem directory public void generateToDirectory(File outputDir) { Options options = GenericOptionsBuilder.builder() .name("demo-app") .packageName("com.example") .language(Language.JAVA) .buildTools(List.of(BuildTool.GRADLE)) .java(JdkVersion.JDK_21) .testFramework(TestFramework.JUNIT) .features(List.of("http-server", "graalvm")) .build(); projectGenerator.writeTo(options, outputDir); // → writes all project files under outputDir/demo-app/ } // Generate using a custom OutputHandler with console logging public void generateWithHandler(OutputHandler handler) throws Exception { Options options = GenericOptionsBuilder.builder() .name("demo-app") .packageName("com.example") .language(Language.KOTLIN) .buildTools(List.of(BuildTool.MAVEN)) .java(JdkVersion.JDK_21) .testFramework(TestFramework.JUNIT) .build(); projectGenerator.generate(options, handler, msg -> System.out.println("[WARN] " + msg)); } } ``` -------------------------------- ### Add Maven Surefire Plugin Source: https://github.com/micronaut-projects/micronaut-projectgen/blob/0.0.x/src/main/docs/guide/demo/addMavenPlugin.adoc This code snippet shows how to integrate the Maven Surefire Plugin into your project. ```java package io.micronaut.projectgen.demo; import io.micronaut.projectgen.ProjectGenerator; import io.micronaut.projectgen.buildtools.maven.MavenPlugin; public class MavenSurefirePlugin { public static void main(String[] args) { ProjectGenerator.generate(project -> { project.getBuildTools().getMaven().addPlugin(MavenPlugin.builder() .groupId("org.apache.maven.plugins") .artifactId("maven-surefire-plugin") .version("3.1.2") .build()); }); } } ``` -------------------------------- ### Generate Project Diff with FeatureDiffer Source: https://context7.com/micronaut-projects/micronaut-projectgen/llms.txt Use `FeatureDiffer` to generate a unified diff string showing file changes when applying specific features. Requires `Options` to be configured. ```java import io.micronaut.projectgen.core.diff.FeatureDiffer; import io.micronaut.projectgen.core.options.*; import io.micronaut.projectgen.core.buildtools.BuildTool; import jakarta.inject.Inject; import java.util.List; @Singleton public class DiffService { @Inject FeatureDiffer featureDiffer; public String getDiff() throws Exception { Options options = GenericOptionsBuilder.builder() .name("demo") .packageName("com.example") .language(Language.JAVA) .buildTools(List.of(BuildTool.GRADLE)) .java(JdkVersion.JDK_21) .features(List.of("graalvm")) .build(); String diff = featureDiffer.diff(options); System.out.println(diff); // Output: unified diff text showing new/modified files when graalvm feature is added return diff; } } ``` -------------------------------- ### Configure Download ZIP Endpoint Source: https://context7.com/micronaut-projects/micronaut-projectgen/llms.txt Customize the path and enabled state of the download ZIP endpoint using `application.yml` configuration. ```yaml projectgen: controllers: download-zip: enabled: true path: /api/v1/download/zip # default ``` -------------------------------- ### Configure Controller Paths and Enablement Source: https://context7.com/micronaut-projects/micronaut-projectgen/llms.txt This YAML configuration allows overriding controller paths and enabling/disabling them. It defines settings for download-zip, features, and diff controllers. ```yaml # application.yml — override all controller paths and toggle them individually projectgen: controllers: download-zip: enabled: true path: /api/v1/download/zip # POST → returns project ZIP features: enabled: true path: /api/v1/features # POST → returns available features JSON project: controllers: diff: enabled: true path: /api/v1/diff # POST → returns diff as text/plain ``` -------------------------------- ### Configure Maven Local Repository for Gradle Source: https://github.com/micronaut-projects/micronaut-projectgen/blob/0.0.x/CONTRIBUTING.md If you use Gradle, add the `mavenLocal` repository to your project's `build.gradle` file to reference local Micronaut versions. Maven automatically handles this. ```gradle repositories { mavenLocal() mavenCentral() } ``` -------------------------------- ### Add Maven Jar Plugin Source: https://github.com/micronaut-projects/micronaut-projectgen/blob/0.0.x/src/main/docs/guide/demo/addMavenPlugin.adoc Use this code to add the Maven Jar Plugin to your project configuration. ```java package io.micronaut.projectgen.demo; import io.micronaut.projectgen.ProjectGenerator; import io.micronaut.projectgen.buildtools.maven.MavenPlugin; public class MavenJarPluginFeature { public static void main(String[] args) { ProjectGenerator.generate(project -> { project.getBuildTools().getMaven().addPlugin(MavenPlugin.builder() .groupId("org.apache.maven.plugins") .artifactId("maven-jar-plugin") .version("3.3.0") .build()); }); } } ``` -------------------------------- ### Define Root Feature for Project Generation Source: https://github.com/micronaut-projects/micronaut-projectgen/blob/0.0.x/src/main/docs/guide/demo/root.adoc This Java code defines a root feature for project generation. It demonstrates how a feature can apply other features by implementing the `DefaultFeature` interface and its `shouldApply` method. ```java package io.micronaut.projectgen.demo; import io.micronaut.core.annotation.NonNull; import io.micronaut.core.annotation.Nullable; import io.micronaut.projectgen.core.feature.DefaultFeature; import io.micronaut.projectgen.core.feature.Feature; import io.micronaut.projectgen.core.project.ProjectGenerationContext; import jakarta.inject.Singleton; @Singleton public class Root implements DefaultFeature { @Override @NonNull public String getName() { return "root"; } @Override @Nullable public Feature[] getFeatures() { return new Feature[]{ new HelloWorldFeature() }; } @Override public boolean shouldApply(@NonNull ProjectGenerationContext context) { return true; } } ``` -------------------------------- ### Add Gradle Java Plugin Source: https://github.com/micronaut-projects/micronaut-projectgen/blob/0.0.x/src/main/docs/guide/demo/addGradlePlugins.adoc Use this feature to include the Gradle Java Plugin in your project. Ensure the necessary ProjectGen API is available. ```java package io.micronaut.projectgen.demo; import io.micronaut.projectgen.core.buildtools.gradle.GradlePlugin; import io.micronaut.projectgen.core.buildtools.gradle.GradlePluginConfiguration; import io.micronaut.projectgen.core.buildtools.gradle.GradlePluginConfiguration.PluginType; import io.micronaut.projectgen.core.feature.Feature; public class GradleJavaPluginFeature implements Feature { @Override public void apply(FeatureContext context) { context.getBuildTools().getGradle().addPlugin(GradlePlugin.builder() .id("java") .configuration(GradlePluginConfiguration.builder() .type(PluginType.CORE) .build()) .build()); } } ``` -------------------------------- ### JDK Version: `JdkVersion` Source: https://context7.com/micronaut-projects/micronaut-projectgen/llms.txt Represents a major JDK release. Predefined constants exist from JDK 8 to JDK 23. Arbitrary versions can be parsed from a string or integer. ```java import io.micronaut.projectgen.core.options.JdkVersion; // From constant JdkVersion jdk21 = JdkVersion.JDK_21; System.out.println(jdk21.majorVersion()); // → 21 System.out.println(jdk21.name()); // → "JDK_21" System.out.println(jdk21.asString()); // → "21" // From string (supports "21" or "JDK_21") JdkVersion parsed = JdkVersion.valueOf("17"); System.out.println(parsed.majorVersion()); // → 17 // Version comparison boolean isModern = jdk21.greaterThanEqual(JdkVersion.JDK_17); // → true // List all known versions JdkVersion.JDKS.forEach(v -> System.out.println(v.name())); // JDK_8, JDK_9, ..., JDK_23 ``` -------------------------------- ### Run Checkstyle for a Module Source: https://github.com/micronaut-projects/micronaut-projectgen/blob/0.0.x/CONTRIBUTING.md Execute Checkstyle for a specific module to ensure code adheres to Micronaut's standards for organization, Javadoc, and style. The configuration is defined in `config/checkstyle/checkstyle.xml`. ```bash ./gradlew :checkstyleMain ``` -------------------------------- ### Configure Features Endpoint Source: https://context7.com/micronaut-projects/micronaut-projectgen/llms.txt Control the enabled state and path of the features endpoint via `application.yml` configuration. ```yaml projectgen: controllers: features: enabled: true path: /api/v1/features # default ``` -------------------------------- ### Default Feature Interface: `DefaultFeature` Implementation Source: https://context7.com/micronaut-projects/micronaut-projectgen/llms.txt Extends `Feature` with a `shouldApply` predicate for automatic inclusion based on conditions. Implement this for features that should be applied by default when specific criteria are met. ```java import io.micronaut.projectgen.core.feature.*; import io.micronaut.projectgen.core.options.Options; import io.micronaut.projectgen.core.options.Language; import jakarta.inject.Singleton; import java.util.Set; @Singleton public class KotlinStdlibFeature implements DefaultFeature { @Override public String getName() { return "kotlin-stdlib"; } @Override public boolean shouldApply(Options options, Set selectedFeatures) { // Automatically apply when the selected language is Kotlin return options.language() == Language.KOTLIN; } @Override public void apply(io.micronaut.projectgen.core.generator.GeneratorContext ctx) { ctx.getRootModule().addDependency( io.micronaut.projectgen.core.buildtools.dependencies.Dependency.builder() .groupId("org.jetbrains.kotlin") .artifactId("kotlin-stdlib-jdk8") .compile() .build() ); } } ``` -------------------------------- ### Generate Project ZIP Archive with ZipGenerator Source: https://context7.com/micronaut-projects/micronaut-projectgen/llms.txt Use ZipGenerator.zip() to create an in-memory ZIP archive of a generated project. The result is a Micronaut Writable, suitable for streaming or writing to disk. ```java import io.micronaut.projectgen.core.io.zip.ZipGenerator; import io.micronaut.projectgen.core.options.*; import io.micronaut.projectgen.core.buildtools.BuildTool; import jakarta.inject.Inject; import java.io.*; import java.nio.file.*; import java.util.List; @Singleton public class DownloadService { @Inject ZipGenerator zipGenerator; public byte[] downloadProjectZip() throws IOException { Options options = GenericOptionsBuilder.builder() .name("my-project") .packageName("org.example") .language(Language.GROOVY) .buildTools(List.of(BuildTool.GRADLE)) .java(JdkVersion.JDK_17) .testFramework(TestFramework.SPOCK) .build(); var writable = zipGenerator.zip(options); ByteArrayOutputStream baos = new ByteArrayOutputStream(); writable.writeTo(new OutputStreamWriter(baos)); return baos.toByteArray(); // → ZIP bytes containing the generated project structure } } ``` -------------------------------- ### Test Framework Enum: `TestFramework` Source: https://context7.com/micronaut-projects/micronaut-projectgen/llms.txt Models supported test frameworks, understanding language constraints, source path conventions, and file-name suffixes. Use `TestFramework.of()` for custom frameworks. ```java import io.micronaut.projectgen.core.options.TestFramework; import io.micronaut.projectgen.core.options.Language; // JUnit works with Java, Kotlin, and Groovy TestFramework junit = TestFramework.JUNIT; System.out.println(junit.getTestFrameworkSuffix()); // → "Test." System.out.println(junit.getSupportedLanguages()); // → [JAVA, KOTLIN, GROOVY] // Spock requires Groovy TestFramework spock = TestFramework.SPOCK; System.out.println(spock.getDefaultLanguage()); // → GROOVY System.out.println(spock.getTestFrameworkSuffix()); // → "Spec." System.out.println(spock.getSourcePath("/com/example/MyService", Language.GROOVY)); // → "src/test/groovy/com/example/MyServiceSpec.groovy" // Kotest requires Kotlin TestFramework kotest = TestFramework.of("kotest").orElseThrow(); System.out.println(kotest.isKotlinTestFramework()); // → true ``` -------------------------------- ### Build Dependencies with Dependency.builder() Source: https://context7.com/micronaut-projects/micronaut-projectgen/llms.txt Use Dependency.builder() to create dependency objects. Supports standard JVM scopes for Gradle and Maven. Versions can be explicit or resolved from a BOM. ```java import io.micronaut.projectgen.core.buildtools.dependencies.Dependency; // Explicit coordinates Dependency compileLib = Dependency.builder() .groupId("io.micronaut.data") .artifactId("micronaut-data-jdbc") .version("4.10.0") .compile() .build(); ``` ```java // BOM-managed (version resolved from CoordinateResolver) Dependency bomDep = Dependency.builder() .lookupArtifactId("micronaut-data-processor") .annotationProcessor() .build(); ``` ```java // Annotation processor with priority flag Dependency apPriority = Dependency.builder() .lookupArtifactId("micronaut-inject-java") .annotationProcessor(true) .build(); ``` ```java // POM import Dependency bom = Dependency.builder() .groupId("io.micronaut.platform") .artifactId("micronaut-platform") .version("4.7.0") .pom() .compile() .build(); ``` ```java // Test runtime with exclusion Dependency testRuntime = Dependency.builder() .groupId("ch.qos.logback") .artifactId("logback-classic") .testRuntime() .exclude(Dependency.builder().groupId("org.slf4j").artifactId("slf4j-api").build()) .build(); ``` -------------------------------- ### Feature Interface: `Feature` Implementation Source: https://context7.com/micronaut-projects/micronaut-projectgen/llms.txt The primary extension point for features. Implement this interface to declare a unique name, optional ordering, and lifecycle hooks for processing and applying features. ```java import io.micronaut.projectgen.core.feature.*; import io.micronaut.projectgen.core.generator.GeneratorContext; import io.micronaut.projectgen.core.options.Options; import io.micronaut.projectgen.core.buildtools.dependencies.Dependency; import io.micronaut.projectgen.core.buildtools.Scope; import jakarta.inject.Singleton; @Singleton public class MyDatabaseFeature implements Feature { @Override public String getName() { return "my-database"; } @Override public String getTitle() { return "My Database"; } @Override public String getDescription() { return "Adds My Database support."; } @Override public int getOrder() { return FeaturePhase.DEFAULT.getOrder(); } @Override public boolean supports(Options options) { // Only for Gradle projects return options.getBuildTool() != null; } @Override public void apply(GeneratorContext ctx) { // Add a compile-time dependency ctx.getRootModule().addDependency( Dependency.builder() .groupId("com.example") .artifactId("my-db-driver") .version("1.0.0") .compile() .build() ); // Add application config ctx.getRootModule().getConfiguration().addNested("datasources.default.url", "jdbc:mydb://localhost/mydb"); } } ``` -------------------------------- ### ModuleContext: Manage Dependencies, Templates, and Configuration Source: https://context7.com/micronaut-projects/micronaut-projectgen/llms.txt ModuleContext is used to accumulate project artifacts per module. Add dependencies, templates, build plugins, and configure application settings. ```java import io.micronaut.projectgen.core.generator.ModuleContext; import io.micronaut.projectgen.core.buildtools.dependencies.Dependency; import io.micronaut.projectgen.core.buildtools.BuildPlugin; import io.micronaut.projectgen.core.template.StringTemplate; import io.micronaut.context.env.Environment; ModuleContext module = ctx.getRootModule(); // --- Dependencies --- module.addDependency( Dependency.builder() .groupId("io.micronaut") .artifactId("micronaut-http-server-netty") .compile() .build() ); module.addDependency( Dependency.builder() .lookupArtifactId("micronaut-test-junit5") // resolved from BOM .test() .build() ); // --- Templates --- module.addTemplate("readme", new StringTemplate("README.md", "# My Project\n")); module.addHelpLink("Micronaut Docs", "https://docs.micronaut.io"); // --- Configuration (application.yml / properties) --- module.getConfiguration().addNested("micronaut.application.name", "my-app"); module.devConfiguration().addNested("micronaut.server.port", 8080); module.testConfiguration().addNested("micronaut.environments", "test"); // --- Environment-specific config --- module.getConfigurationByEnvironment(Environment.DEVELOPMENT) .addNested("datasources.default.url", "jdbc:h2:mem:devDb"); // --- Build plugins --- // module.addBuildPlugin(GradlePlugin.builder().id("com.google.cloud.tools.jib").build()); // --- Dependency lookup by recipe (OpenRewrite integration) --- module.addDependenciesByRecipeName(options, "io.micronaut.starter.add-http-client"); module.addConfigurationByRecipeName("io.micronaut.starter.add-http-client"); ``` -------------------------------- ### Features Endpoint Source: https://context7.com/micronaut-projects/micronaut-projectgen/llms.txt Retrieves a list of available features for a given set of project options. Useful for populating UI feature selectors. ```APIDOC ## POST /api/v1/features ### Description Returns a JSON list of features available for the given options payload. Useful for populating a UI feature selector. ### Method POST ### Endpoint /api/v1/features ### Parameters #### Request Body - **lang** (string) - Required - The programming language (e.g., `java`, `kotlin`). - **build** (string) - Required - The build tool (e.g., `gradle`, `maven`). - **java** (string) - Optional - The Java version (e.g., `21`). ### Request Example ```bash curl -X POST http://localhost:8080/api/v1/features \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "lang=java&build=gradle&java=21" | jq . ``` ### Response #### Success Response (200) - **features** (array) - A list of available features. - **name** (string) - The internal name of the feature. - **title** (string) - The display name of the feature. - **description** (string) - A description of the feature. - **preview** (boolean) - Indicates if the feature is in preview. - **community** (boolean) - Indicates if the feature is community-contributed. ### Response Example ```json { "features": [ { "name": "graalvm", "title": "GraalVM Native Image", "description": "Support for compiling Micronaut applications to native images using GraalVM.", "preview": false, "community": false }, { "name": "http-server", "title": "Micronaut HTTP Server", "description": "Adds Netty-based HTTP server support.", "preview": false, "community": false } ] } ``` ``` -------------------------------- ### GeneratorContext: Inspect Project and Features Source: https://context7.com/micronaut-projects/micronaut-projectgen/llms.txt Use GeneratorContext to access project metadata, environment details, and feature information. It allows resolving coordinates and checking feature presence. ```java import io.micronaut.projectgen.core.generator.GeneratorContext; import io.micronaut.projectgen.core.feature.Feature; // Inside Feature.apply(GeneratorContext ctx): @Override public void apply(GeneratorContext ctx) { // Inspect options and environment ctx.getLanguage(); // Language enum ctx.getJdkVersion(); // JdkVersion ctx.getTestFramework(); // TestFramework enum ctx.getBuildTool(); // BuildTool (primary) // Feature detection boolean hasGraal = ctx.isFeaturePresent(GraalVMFeature.class); ctx.getFeature(SomeFeature.class).ifPresent(f -> { /* ... */ }); // Resolve a coordinate from the BOM catalog var coord = ctx.resolveCoordinate("micronaut-http"); // Check source path using current language String path = ctx.getSourcePath("/com/example/MyApp"); // Work on the root module var module = ctx.getRootModule(); module.addDependency(...); module.getConfiguration().addNested("micronaut.application.name", ctx.getProject().getName()); // Work on a named sub-module (multi-module projects) var api = ctx.getModuleByName("api"); api.addTemplate("readme", new StringTemplate("README.md", "# API Module")); } ``` -------------------------------- ### Download ZIP File Source: https://github.com/micronaut-projects/micronaut-projectgen/blob/0.0.x/src/main/docs/guide/modules/httpServer/downloadZip.adoc This endpoint allows you to download a ZIP file using a POST request with `application/x-www-form-urlencoded` content type. ```APIDOC ## POST /download/zip ### Description Allows downloading a ZIP file. ### Method POST ### Endpoint /download/zip ### Parameters #### Request Body - **contentType** (string) - Required - The content type for the request, expected to be `application/x-www-form-urlencoded`. - **fileName** (string) - Required - The name of the file to be downloaded as a ZIP. ### Request Example ``` POST /download/zip HTTP/1.1 Host: localhost:8080 Content-Type: application/x-www-form-urlencoded fileName=my-archive.zip ``` ### Response #### Success Response (200) - **file** (byte[]) - The content of the ZIP file. ``` -------------------------------- ### Add Feature to Existing Project Source: https://github.com/micronaut-projects/micronaut-projectgen/blob/0.0.x/test-suite-helloworld-cli/README.md Add a new feature to an existing project generated by the CLI. This command will run OpenRewrite recipes to modify the project. ```bash java -jar test-suite-helloworld-cli/build/libs/test-suite-helloworld-cli-0.1-all.jar add --project demo ``` -------------------------------- ### Create Generator Context with ContextFactory Source: https://context7.com/micronaut-projects/micronaut-projectgen/llms.txt Utilize `ContextFactory` to create `GeneratorContext` and `FeatureContext` objects. It resolves available features, applies defaults, validates constraints, and allows manual feature application. ```java import io.micronaut.projectgen.core.generator.*; import io.micronaut.projectgen.core.feature.*; import io.micronaut.projectgen.core.options.*; import jakarta.inject.Inject; import java.util.List; @Singleton public class CustomGenerationService { @Inject ContextFactory contextFactory; @Inject List availableFeaturesList; public GeneratorContext buildContext(Options options) { // Resolves available features, applies defaults, validates constraints GeneratorContext ctx = contextFactory.createGeneratorContext( availableFeaturesList, options, warning -> System.err.println("[WARN] " + warning) ); // Inspect the final resolved feature set ctx.getFeatures().getFeatures().forEach(f -> System.out.println("Feature: " + f.getName()) ); // Manually apply features and inspect module output ctx.applyFeatures(); System.out.println("Dependencies: " + ctx.getRootModule().getDependencies().size()); return ctx; } } ``` -------------------------------- ### Download ZIP Endpoint Source: https://context7.com/micronaut-projects/micronaut-projectgen/llms.txt Generates and downloads a Micronaut project as a ZIP file. Accepts form-urlencoded data for project configuration. ```APIDOC ## POST /api/v1/download/zip ### Description Accepts a `application/x-www-form-urlencoded` body and returns the generated project as a ZIP file attachment. ### Method POST ### Endpoint /api/v1/download/zip ### Parameters #### Request Body - **name** (string) - Required - The name of the project. - **lang** (string) - Required - The programming language (e.g., `java`, `kotlin`). - **build** (string) - Required - The build tool (e.g., `gradle`, `maven`). - **gradleDsl** (string) - Optional - The Gradle DSL to use (e.g., `kotlin`, `groovy`). - **java** (string) - Optional - The Java version (e.g., `21`). - **testFramework** (string) - Optional - The test framework (e.g., `kotest`). - **features** (string) - Optional - A comma-separated list of features to include (e.g., `graalvm,http-server`). - **packageName** (string) - Optional - The package name for the project. ### Request Example ```bash curl -X POST http://localhost:8080/api/v1/download/zip \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "name=my-app&lang=kotlin&build=gradle&gradleDsl=KOTLIN&java=21&testFramework=kotest&features=graalvm,http-server&packageName=com.example" \ -o my-app.zip ``` ### Response - **Success Response (200)**: Returns a ZIP file attachment containing the generated project. ``` -------------------------------- ### FeatureContext: Add, Exclude, and Check Features Source: https://context7.com/micronaut-projects/micronaut-projectgen/llms.txt Use FeatureContext to manage the list of features during selection. Add or exclude features based on conditions, and inspect existing features. ```java import io.micronaut.projectgen.core.feature.*; // Inside Feature.processSelectedFeatures(FeatureContext ctx): @Override public void processSelectedFeatures(FeatureContext ctx) { // Add a companion feature if not already present ctx.addFeatureIfNotPresent(SomeOtherFeature.class, new SomeOtherFeature()); // Exclude an incompatible feature ctx.exclude(feature -> feature instanceof IncompatibleFeature); // Check presence before acting if (ctx.isPresent(SecurityFeature.class)) { ctx.addFeature(new OAuthFeature()); } // Inspect current options Language lang = ctx.getLanguage(); // e.g. Language.JAVA TestFramework tf = ctx.getTestFramework(); // e.g. TestFramework.JUNIT } ``` -------------------------------- ### Add Gradle Application Plugin Source: https://github.com/micronaut-projects/micronaut-projectgen/blob/0.0.x/src/main/docs/guide/demo/addGradlePlugins.adoc This feature adds the Gradle Application Plugin to your project. It requires access to the ProjectGen API for build tool configuration. ```java package io.micronaut.projectgen.demo; import io.micronaut.projectgen.core.buildtools.gradle.GradlePlugin; import io.micronaut.projectgen.core.buildtools.gradle.GradlePluginConfiguration; import io.micronaut.projectgen.core.buildtools.gradle.GradlePluginConfiguration.PluginType; import io.micronaut.projectgen.core.feature.Feature; public class GradleApplicationPluginFeature implements Feature { @Override public void apply(FeatureContext context) { context.getBuildTools().getGradle().addPlugin(GradlePlugin.builder() .id("application") .configuration(GradlePluginConfiguration.builder() .type(PluginType.CORE) .build()) .build()); } } ``` -------------------------------- ### Add JUnit Jupiter Dependency Source: https://github.com/micronaut-projects/micronaut-projectgen/blob/0.0.x/src/main/docs/guide/demo/addDependency.adoc Use the Dependency API to add the JUnit Jupiter dependency to your project. This is typically done when configuring build tools. ```java package io.micronaut.projectgen.demo; import io.micronaut.projectgen.core.buildtools.dependencies.Dependency; import io.micronaut.projectgen.core.buildtools.dependencies.DependencyScope; import io.micronaut.projectgen.core.buildtools.dependencies.DependencyType; public class JunitJupiter { public static Dependency junitJupiter() { return Dependency.builder() .groupId("org.junit.jupiter") .artifactId("junit-jupiter-api") .scope(DependencyScope.TEST) .type(DependencyType.ANNOTATION_PROCESSOR) .build(); } } ```