#!/usr/bin/env runts -- --allow-all import {args, existsPath, log, makeDirectory, term, writeStringToFile,} from "../libraries/deno-commons-mod.ts"; import {parseArgs} from "jsr:@std/cli/parse-args"; const DOT_GIT_IGNORE = ".gitignore"; const DEFAULT_GIT_IGNORE: string[] = [ "build", "classes", ".DS_Store", ".gradle", ".classpath", ".project", ".settings", "*.iml", "*.ipr", "*.iws", ]; const DIRS: string[] = [ "src/main/java", "src/main/resources", "src/test/java", "src/test/resources", ]; const BUILD_JSON = "build.json"; const BUILD_GRADLE = "build.gradle"; interface BuildFiles { build: string; jarGradle: string; springBootGradle: string; } const BUILD_FILES_MAP: Record = { "8": { build: "build.json", jarGradle: "build_jar_template.gradle", springBootGradle: "build_springboot_template.gradle", }, }; const SCRIPT_URL_PREFIX = "https://script.hatter.ink/@latest/"; // build.json | build_springboot_template.gradle | build_jar_template.gradle async function writeGitIgnore(): Promise { await writeStringToFile( DOT_GIT_IGNORE, DEFAULT_GIT_IGNORE.join("\n") + "\n", ); } async function createDirs(): Promise { for (const dir of DIRS) { await makeDirectory(dir); } } async function fetchScript( scriptName: string, localName?: string, ): Promise { const scriptUrl = `${SCRIPT_URL_PREFIX}${scriptName}`; const localScriptName = localName ?? scriptName; log.info(`Fetch script: ${scriptUrl} -> ${localScriptName}`); const scripResponse = await fetch(scriptUrl); if (scripResponse.status !== 200) { throw new Error( `Fetch script: ${scriptUrl} -> ${localScriptName} failed, status: ${scripResponse.status}`, ); } await writeStringToFile(localScriptName, await scripResponse.text()); } function showHelp() { console.log( term.auto(`[blue][b]create-java-project.ts[//] - Create Java project [blue][b]create-java-project.ts[//] --help|-h - for help [blue][b]create-java-project.ts[//] --jdk VERSION springboot|jar - create springboot or jar project Supported JDK: - 8, 1.8`), ); } async function handleJdk(buildFiles: BuildFiles, flags: any): Promise { let buildGradleFile = null; if (flags._[0] == "springboot") { buildGradleFile = buildFiles.springBootGradle; } else if (flags._[0] == "jar") { buildGradleFile = buildFiles.jarGradle; } else { throw new Error(`Invalid target: ${flags._[0]}`); } if (await existsPath(BUILD_JSON) || await existsPath(BUILD_GRADLE)) { throw new Error(`File ${BUILD_JSON} or ${BUILD_GRADLE} already exists`); } await fetchScript(buildFiles.build, BUILD_JSON); await fetchScript(buildGradleFile, BUILD_GRADLE); } async function main() { const flags = parseArgs(args(), { boolean: [ "help", ], string: [ "jdk", ], alias: { h: "help", }, }); if (flags.help || flags._.length === 0) { showHelp(); return; } if (flags.jdk == "8" || flags.jdk == "1.8") { await handleJdk(BUILD_FILES_MAP["8"], flags); } else { throw new Error(`Invalid JDK: ${flags.jdk ?? "not-assigned"}`); } } main().catch((e) => log.error(e));