Files
ts-scripts/bundles/create-java-project.ts
2026-02-15 21:47:47 +08:00

136 lines
3.5 KiB
TypeScript

#!/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<string, BuildFiles> = {
"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<void> {
log.info(`Write file: ${DOT_GIT_IGNORE}`);
await writeStringToFile(
DOT_GIT_IGNORE,
DEFAULT_GIT_IGNORE.join("\n") + "\n",
);
}
async function createDirs(): Promise<void> {
for (const dir of DIRS) {
log.info(`Create directory: ${dir}`);
await makeDirectory(dir);
}
}
async function fetchScript(
scriptName: string,
localName?: string,
): Promise<string> {
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<void> {
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));