This commit is contained in:
2026-02-14 21:50:18 +08:00
parent 9572478316
commit 95e633348a
2 changed files with 143 additions and 2 deletions

View File

@@ -0,0 +1,141 @@
#!/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));

View File

@@ -5,7 +5,7 @@ import {decodeBase64, encodeBase64} from "jsr:@std/encoding/base64";
import {dirname, fromFileUrl} from "jsr:@std/path"; import {dirname, fromFileUrl} from "jsr:@std/path";
import {toArrayBuffer} from "jsr:@std/streams"; import {toArrayBuffer} from "jsr:@std/streams";
import {spawn, SpawnOptionsWithoutStdio} from "node:child_process"; import {spawn, SpawnOptionsWithoutStdio} from "node:child_process";
import {createWriteStream, mkdir, readFile, readFileSync, rm, writeFile,} from "node:fs"; import {createWriteStream, mkdir, readFile, readFileSync, rm, stat, writeFile,} from "node:fs";
import {pipeline} from "node:stream"; import {pipeline} from "node:stream";
import {promisify} from "node:util"; import {promisify} from "node:util";
@@ -829,7 +829,7 @@ export async function existsPath(path: string): Promise<boolean> {
} }
} }
return new Promise((resolve) => { return new Promise((resolve) => {
fs.stat(path, (err, stats) => { stat(path, (err, stats) => {
err ? resolve(false) : resolve(stats !== null); err ? resolve(false) : resolve(stats !== null);
}); });
}); });