import { Children, code, List, mapJoin, Show, SourceFile, } from "@alloy-js/core"; import { MavenProjectConfig } from "../symbols/index.js"; import { useProject } from "./ProjectDirectory.js"; export interface MavenProjectProps { projectConfig: MavenProjectConfig; } /** * Represents a maven project. Use if you want to generate a Java project */ export function MavenProject(props: MavenProjectProps) { return ; } export interface PomFileProps { projectConfig: MavenProjectConfig; } export function PomFile({ projectConfig }: PomFileProps) { const scope = useProject().scope; // The following spaghetti mess is so the final output is formatted correctly. // Needs to be this way for when some options aren't provided, there's no random whitespace, // and so that looped sections are indented correctly. return ( } > {projectConfig.repositories && ( )} {projectConfig.pluginRepositories && ( )} {scope.dependencies.size > 0 && ( )} {projectConfig.build && ( )} ); } function PomFileRoot(props: { children: Children }) { return code` ${props.children} `; } function PomFileMetadata(props: PomFileProps) { return code` 4.0.0 ${props.projectConfig.groupId} ${props.projectConfig.artifactId} ${props.projectConfig.version} `; } function PomFileProperties(props: PomFileProps) { return code` ${props.projectConfig?.javaVersion} ${props.projectConfig?.javaVersion} UTF-8 `; } function PomFileRepositories(props: PomFileProps) { if (props.projectConfig.repositories === undefined) { return undefined; } return code` ${mapJoin( () => props.projectConfig.repositories!, (repo) => code` ${repo.id} ${repo.url} `, { joiner: }, )} `; } function PomFilePluginRepositories(props: PomFileProps) { if (!props.projectConfig.pluginRepositories) { return ""; } return code` ${mapJoin( () => props.projectConfig.pluginRepositories!, (repo) => code` ${repo.id} ${repo.url} `, { joiner: }, )} `; } function PomFileDependencies(props: PomFileProps) { const scope = useProject().scope; return ( 0}> {code` ${Array.from(scope.dependencies.values()).map( (dep) => code` ${dep.groupId} ${dep.artifactId} ${dep.version !== undefined ? `${dep.version}` : undefined} ${dep.scope ?? "provided"} `, )} `} ); } export function PomFileBuild(props: PomFileProps) { if (!props.projectConfig.build) { return ""; } return code` ${()} ${()} `; } function PomFileBuildPlugins(props: MavenProjectConfig["build"]) { if (!props || !props.plugins) { return ""; } return code` ${mapJoin( () => props.plugins!, (plugin) => code` ${plugin.groupId} ${plugin.artifactId} ${plugin.version !== undefined ? `${plugin.version}` : undefined} ${ plugin.executions && code` ${mapJoin( () => plugin.executions!, (execution) => code` ${execution.id ? `${execution.id}` : undefined} ${execution.phase ? `${execution.phase}` : undefined} ${ execution.goals && code` ${mapJoin( () => execution.goals!, (goal) => code` ${goal} `, )} ` } `, )} ` }${ plugin.configuration && code` ${mapJoin( () => Object.entries(plugin.configuration!), ([key, value]) => code` <${key}>${value} `, )} ` } `, )} `; } function PomFileBuildResources(props: MavenProjectConfig["build"]) { if (!props || !props.resources) { return ""; } return code` ${mapJoin( () => props.resources!, (resource) => code` ${resource.directory}${ resource.includes && code` ${resource.includes.map( (include) => code` ${include} `, )} ` }${ resource.excludes && code` ${resource.excludes.map( (exclude) => code` ${exclude} `, )} ` }${ resource.filtering !== undefined ? ` ${resource.filtering}` : undefined }${ resource.targetPath !== undefined ? ` ${resource.targetPath}` : undefined } `, )} `; }