From 95e633348a98741ed41aa46ee63914fce9b17873 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Sat, 14 Feb 2026 21:50:18 +0800 Subject: [PATCH] updates --- bundles/create-java-project.ts | 141 +++++++++++++++++++++++++++++++++ libraries/deno-commons-mod.ts | 4 +- 2 files changed, 143 insertions(+), 2 deletions(-) create mode 100644 bundles/create-java-project.ts diff --git a/bundles/create-java-project.ts b/bundles/create-java-project.ts new file mode 100644 index 0000000..0e42845 --- /dev/null +++ b/bundles/create-java-project.ts @@ -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 = { + "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") { + 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)); diff --git a/libraries/deno-commons-mod.ts b/libraries/deno-commons-mod.ts index ff89e16..2bed60c 100644 --- a/libraries/deno-commons-mod.ts +++ b/libraries/deno-commons-mod.ts @@ -5,7 +5,7 @@ import {decodeBase64, encodeBase64} from "jsr:@std/encoding/base64"; import {dirname, fromFileUrl} from "jsr:@std/path"; import {toArrayBuffer} from "jsr:@std/streams"; 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 {promisify} from "node:util"; @@ -829,7 +829,7 @@ export async function existsPath(path: string): Promise { } } return new Promise((resolve) => { - fs.stat(path, (err, stats) => { + stat(path, (err, stats) => { err ? resolve(false) : resolve(stats !== null); }); });