142 lines
3.4 KiB
TypeScript
142 lines
3.4 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> {
|
|
await writeStringToFile(
|
|
DOT_GIT_IGNORE,
|
|
DEFAULT_GIT_IGNORE.join("\n") + "\n",
|
|
);
|
|
}
|
|
|
|
async function createDirs(): Promise<void> {
|
|
for (const dir of DIRS) {
|
|
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") {
|
|
const buildFiles = BUILD_FILES_MAP["8"];
|
|
await handleJdk(buildFiles, flags);
|
|
} else {
|
|
throw new Error(`Invalid JDK: ${flags.jdk ?? "not-assigned"}`);
|
|
}
|
|
}
|
|
|
|
main().catch((e) => log.error(e));
|