diff --git a/.github/workflows/deploy-test.yml b/.github/workflows/deploy-test.yml index 7ed5160..e6cd08b 100644 --- a/.github/workflows/deploy-test.yml +++ b/.github/workflows/deploy-test.yml @@ -2,7 +2,7 @@ name: Test on Dev on: push: - branches: [dev] + branches: [dev, main] workflow_dispatch: @@ -23,5 +23,17 @@ jobs: - name: Install dependencies run: npm ci - - name: Test Package + - name: Test Type + run: npm run test:type + + - name: Test Format + run: npm run check:format:check + + - name: Test Lint + run: npm run check:lint + + - name: Test Vitest run: npm run test:vitest + + - name: Test Pack + run: npm pack --dry-run --json --silent \ No newline at end of file diff --git a/package.json b/package.json index 462b69d..1b05f7d 100644 --- a/package.json +++ b/package.json @@ -7,11 +7,12 @@ "test:type": "tsc --noEmit", "test:use--init": "npm pack && tsx ./scripts/initPlayground.ts", "test:use": "npm run test:use--init && tsx ./scripts/testPlayground.ts", + "test:ci": "npm run test:type && npm run check:format:check && npm run test:vitest", - "check:format--write": "prettier . --write", - "check:format--check": "prettier . --check", + "check:format:write": "prettier . --write", + "check:format:check": "prettier . --check", "check:lint": "eslint .", - "check:lint--fix": "eslint . --fix", + "check:lint:fix": "eslint . --fix", "docs:dev": "vitepress dev docs", "docs:build": "vitepress build docs", diff --git a/public/main/index.html b/public/main/index.html index c274343..9f6a091 100644 --- a/public/main/index.html +++ b/public/main/index.html @@ -1,48 +1,52 @@ - + - - - - tyoi-server | デフォルトページ - - + + + + tyoi-server | デフォルトページ + + - - - -
-

tyoi-server

-
-
-
-
-

tyoi-server

-

Small local API and static file server framework.

-
-
- -

Server is Running

-
-
-
-
- -

Server Test Page

-
-
-

tyoi-api-server が正常に起動し、このページを配信しています。

-
-
+ + + +
+

tyoi-server

+
+
+
+
+

tyoi-server

+

+ Small local API and static file server framework. +

+
+
+ +

Server is Running

+
+
+
+
+ +

Server Test Page

+
+
+

tyoi-api-server が正常に起動し、このページを配信しています。

+
+
-
-
- ! -

Note

-
-
-

このページは動作確認用です。
使用するときは任意のディレクトリーにサーバーをインストールしてください。

-
-
-
- - \ No newline at end of file +
+
+ ! +

Note

+
+
+

+ このページは動作確認用です。
使用するときは任意のディレクトリーにサーバーをインストールしてください。 +

+
+
+
+ + diff --git a/public/main/src/style/index.css b/public/main/src/style/index.css index f24ba84..758db4e 100644 --- a/public/main/src/style/index.css +++ b/public/main/src/style/index.css @@ -1,4 +1,4 @@ -body{ +body { display: flex; flex-direction: column; @@ -12,7 +12,7 @@ body{ background-color: #0e1220; color: #ebebeb; } -.header{ +.header { width: 100%; height: 2.5em; @@ -35,7 +35,7 @@ body{ } */ -.main-section{ +.main-section { width: 100%; height: auto; overflow: hidden; @@ -46,7 +46,7 @@ body{ border-radius: 5px; box-sizing: border-box; } -.main-section-header{ +.main-section-header { display: flex; align-items: center; gap: 0.3em; @@ -59,22 +59,22 @@ body{ background-color: #5a668f40; border-bottom: #ebebeb4b 1px solid; } -.main-section-header-icon{ +.main-section-header-icon { font-size: 0.8em; } -.main-section-header-title{ +.main-section-header-title { font-size: 0.9em; font-weight: bold; } -.main-section-main{ +.main-section-main { padding: 0.8em 1em; width: 100%; height: auto; } -.main-hero{ +.main-hero { display: flex; flex-direction: column; justify-content: center; @@ -86,50 +86,48 @@ body{ padding-bottom: 2em; box-sizing: border-box; } -.main-hero-title{ +.main-hero-title { display: flex; flex-direction: column; justify-content: center; gap: 0.5em; box-sizing: border-box; } -.main-hero-title-box{ +.main-hero-title-box { display: flex; flex-direction: column; justify-content: center; gap: 0.5em; box-sizing: border-box; } -.main-hero-title-text{ +.main-hero-title-text { font-size: 2em; font-weight: bold; background: linear-gradient(90deg, #372dff 0%, #ff8bff 70%); background-clip: text; color: transparent; } -.main-hero-title-description{ +.main-hero-title-description { width: 60%; font-size: 1em; } -.main-hero-status{ +.main-hero-status { width: fit-content; display: inline-flex; justify-content: center; align-items: center; gap: 0.5em; - color: #55CA93; - background-color: #55CA9320; - border: #55CA9320 1px solid; + color: #55ca93; + background-color: #55ca9320; + border: #55ca9320 1px solid; padding: 0.3em 0.6em; border-radius: 5px; } -.main-hero-status-icon{ +.main-hero-status-icon { font-size: 0.8em; } -.main-hero-status-text{ +.main-hero-status-text { font-size: 0.8em; } - - diff --git a/public/main/src/style/init.css b/public/main/src/style/init.css index e1b1495..4eacb20 100644 --- a/public/main/src/style/init.css +++ b/public/main/src/style/init.css @@ -1,13 +1,18 @@ -body{ +body { margin: 0; padding: 0; } -h1,h2,h3,h4,h5,h6{ +h1, +h2, +h3, +h4, +h5, +h6 { font-size: 1em; - font-weight:unset; + font-weight: unset; margin: 0; } -p{ +p { margin: 0; -} \ No newline at end of file +} diff --git a/scripts/ask-select.ts b/scripts/ask-select.ts index de34481..7d7bc20 100644 --- a/scripts/ask-select.ts +++ b/scripts/ask-select.ts @@ -1,18 +1,18 @@ import readline from "readline"; type SelectArgs = { - message:string; - selects:string[]; -} - -class FirstRender{ - private args:SelectArgs; - private index:number - constructor(args:SelectArgs,index:number){ + message: string; + selects: string[]; +}; + +class FirstRender { + private args: SelectArgs; + private index: number; + constructor(args: SelectArgs, index: number) { this.args = args; this.index = index; } - render(){ + render() { process.stdout.write(`${this.args.message}\n`); this.args.selects.forEach((choice, i) => { @@ -20,14 +20,14 @@ class FirstRender{ process.stdout.write(`${cursor} ${choice}\n`); }); } - clear(){ + clear() { const len = this.args.selects.length + 1; readline.moveCursor(process.stdout, 0, -len); readline.clearScreenDown(process.stdout); } } -function reRowRender(len:number,index:number,setText:string){ +function reRowRender(len: number, index: number, setText: string) { // index の行へ移動 readline.moveCursor(process.stdout, 0, -(len - index)); readline.clearLine(process.stdout, 0); @@ -37,29 +37,26 @@ function reRowRender(len:number,index:number,setText:string){ readline.moveCursor(process.stdout, 0, len - index - 1); } -function selectRender(args:SelectArgs,index:number,oldIndex:number) { +function selectRender(args: SelectArgs, index: number, oldIndex: number) { // カーソルは一番した前提。 const len = args.selects.length; - reRowRender(len,oldIndex,` ${args.selects[oldIndex]}`); - reRowRender(len,index,`❯ ${args.selects[index]}`); + reRowRender(len, oldIndex, ` ${args.selects[oldIndex]}`); + reRowRender(len, index, `❯ ${args.selects[index]}`); } - -export async function askSelect(args:SelectArgs):Promise { - +export async function askSelect(args: SelectArgs): Promise { return new Promise((resolve) => { - let index = 0; let oldIndex = 0; const choices = args.selects; - const firstRender = new FirstRender(args,index); + const firstRender = new FirstRender(args, index); const render = () => { - selectRender(args,index,oldIndex); - } + selectRender(args, index, oldIndex); + }; const cleanup = () => { if (process.stdin.isTTY) { process.stdin.setRawMode(false); @@ -68,7 +65,7 @@ export async function askSelect(args:SelectArgs):Promise { process.stdin.off("data", keySelect); process.stdin.pause(); }; - const keySelect = (key:string ) => { + const keySelect = (key: string) => { switch (key) { case "\u001b[A": { const nextIndex = Math.max(0, index - 1); @@ -96,17 +93,16 @@ export async function askSelect(args:SelectArgs):Promise { cleanup(); resolve(-1); break; - } } - if (process.stdin.isTTY){ + }; + if (process.stdin.isTTY) { process.stdin.setRawMode(true); process.stdin.resume(); process.stdin.setEncoding("utf8"); firstRender.render(); - process.stdin.on("data",keySelect); - }else{ - resolve(-1) - - }; - }) -} \ No newline at end of file + process.stdin.on("data", keySelect); + } else { + resolve(-1); + } + }); +} diff --git a/scripts/initPlayground.ts b/scripts/initPlayground.ts index a292562..b500ba4 100644 --- a/scripts/initPlayground.ts +++ b/scripts/initPlayground.ts @@ -1,128 +1,93 @@ import path from "node:path"; -import fs from "node:fs" +import fs from "node:fs"; import { spawnSync } from "node:child_process"; import { askSelect } from "./ask-select.js"; -const PLAYGROUND_PASS = "../test/playground" -const PACK_PASS = "../" -const TEMPLATE_PASS = "./template/package.json" +const PLAYGROUND_PASS = "../test/playground"; +const PACK_PASS = "../"; +const TEMPLATE_PASS = "./template/package.json"; const PACK_REGEX = /^donneko-tyoi-server-.*\.tgz$/; -async function getPackagePath():Promise{ +async function getPackagePath(): Promise { const dirname = import.meta.dirname; - const packDirPath = path.join(dirname,PACK_PASS); + const packDirPath = path.join(dirname, PACK_PASS); const items = fs.readdirSync(packDirPath); - const packPath = items.filter(i => PACK_REGEX.test(i)); - if(!packPath)throw Error("パッケージがありませんでした"); + const packPath = items.filter((i) => PACK_REGEX.test(i)); + if (!packPath) throw Error("パッケージがありませんでした"); const index = await askSelect({ - message:"使用するパッケージを選択してください", - selects:packPath + message: "使用するパッケージを選択してください", + selects: packPath, }); - if(!packPath[index])throw Error("パッケージが見つかりませんでした"); + if (!packPath[index]) throw Error("パッケージが見つかりませんでした"); return packPath[index]; } -function getPlaygroundPath():string{ +function getPlaygroundPath(): string { const dirname = import.meta.dirname; - return path.join(dirname,PLAYGROUND_PASS); + return path.join(dirname, PLAYGROUND_PASS); } -function getTemplatePath():string{ +function getTemplatePath(): string { const dirname = import.meta.dirname; - return path.join(dirname,TEMPLATE_PASS); + return path.join(dirname, TEMPLATE_PASS); } - -function clearPlayground( - playgroundPath:string -){ +function clearPlayground(playgroundPath: string) { const items = fs.readdirSync(playgroundPath); - items.forEach(item=>{ - const itemPath = path.join(playgroundPath,item); - fs.rmSync(itemPath,{ recursive: true, force: true }); + items.forEach((item) => { + const itemPath = path.join(playgroundPath, item); + fs.rmSync(itemPath, { recursive: true, force: true }); }); } -function createPlayground( - playgroundPath:string, - templatePath:string -){ - - const name = path.basename(templatePath) - const fixPath = path.join(playgroundPath,name); - fs.copyFileSync( - templatePath, - fixPath - ); +function createPlayground(playgroundPath: string, templatePath: string) { + const name = path.basename(templatePath); + const fixPath = path.join(playgroundPath, name); + fs.copyFileSync(templatePath, fixPath); } -function copyPackage( - packagePath:string, - playgroundPath:string -){ - - const name = path.basename(packagePath) - const fixPath = path.join(playgroundPath,name); - fs.copyFileSync( - packagePath, - fixPath - ); +function copyPackage(packagePath: string, playgroundPath: string) { + const name = path.basename(packagePath); + const fixPath = path.join(playgroundPath, name); + fs.copyFileSync(packagePath, fixPath); } -function editPackageJson( - packagePath:string, - playgroundPath:string -){ - const packageFileName = path.basename(packagePath) +function editPackageJson(packagePath: string, playgroundPath: string) { + const packageFileName = path.basename(packagePath); const packageJsonPath = path.join(playgroundPath, "package.json"); const text = fs.readFileSync(packageJsonPath, "utf-8"); - const fixText = - text.replaceAll("__PACK_FILE_NAME__", packageFileName); + const fixText = text.replaceAll("__PACK_FILE_NAME__", packageFileName); - fs.writeFileSync( - packageJsonPath, - fixText - ); + fs.writeFileSync(packageJsonPath, fixText); } -function installNPM( - playgroundPath:string, -){ +function installNPM(playgroundPath: string) { spawnSync("npm", ["install"], { cwd: playgroundPath, stdio: "inherit", }); } -async function main(){ +async function main() { const packagePath = await getPackagePath(); const playgroundPath = getPlaygroundPath(); const templatePath = getTemplatePath(); clearPlayground(playgroundPath); - createPlayground( - playgroundPath, - templatePath - ); + createPlayground(playgroundPath, templatePath); - copyPackage( - packagePath, - playgroundPath - ); + copyPackage(packagePath, playgroundPath); - editPackageJson( - packagePath, - playgroundPath - ); + editPackageJson(packagePath, playgroundPath); installNPM(playgroundPath); } -await main(); \ No newline at end of file +await main(); diff --git a/scripts/logger.ts b/scripts/logger.ts index 1a7b9ca..79a77dc 100644 --- a/scripts/logger.ts +++ b/scripts/logger.ts @@ -2,52 +2,48 @@ import pc from "picocolors"; import stringWidth from "string-width"; import stripAnsi from "strip-ansi"; -function getWidth():number{ +function getWidth(): number { const number = Number(process.env.COLUMNS); - const envColumns = Number.isFinite(number)? number : null; + const envColumns = Number.isFinite(number) ? number : null; - return process.stdout.columns ?? - envColumns ?? - 80; + return process.stdout.columns ?? envColumns ?? 80; } -function calcAnsiLength(text:string){ - const cleanText = stripAnsi(text); - const ansiLength = (text.length - cleanText.length); +function calcAnsiLength(text: string) { + const cleanText = stripAnsi(text); + const ansiLength = text.length - cleanText.length; return ansiLength; } +function textNormalizer(text: string, width: number): string[] { + const textList = Array.isArray(text.split("\n")) ? text.split("\n") : [text]; -function textNormalizer(text:string,width:number):string[] { + let fixedTextList: string[] = []; + const headerLength = stringWidth( + stripAnsi(textList[0] ?? "").match(/\[[a-zA-Z1-9]*\]\s/)?.[0] ?? "" + ); - const textList = (Array.isArray(text.split("\n")))? - text.split("\n"): - [text]; - - let fixedTextList:string[] = []; - const headerLength = stringWidth(stripAnsi(textList[0]?? "").match(/\[[a-zA-Z1-9]*\]\s/)?.[0] ?? ""); - - for(const text of textList){ + for (const text of textList) { const index = textList.indexOf(text); const calcAnsiLengthValue = calcAnsiLength(text); - const textWidth = stringWidth(text); + const textWidth = stringWidth(text); const overContent = Math.ceil(textWidth / width); - const overHeader = (overContent - 1) * headerLength; - const textLength = (textWidth - headerLength) + overHeader + calcAnsiLengthValue; + const overHeader = (overContent - 1) * headerLength; + const textLength = textWidth - headerLength + overHeader + calcAnsiLengthValue; let fixedText = []; - if(textLength <= width){ - const prefix = " ".repeat(index === 0?0:headerLength) + if (textLength <= width) { + const prefix = " ".repeat(index === 0 ? 0 : headerLength); fixedTextList.push(`${prefix}${text}`); continue; } // 横幅より長かったら... - for(let i = 0; i < textLength;){ - const prefix = " ".repeat(i >= width?headerLength:0); - const end = width + (i >= width? -headerLength:calcAnsiLengthValue); + for (let i = 0; i < textLength; ) { + const prefix = " ".repeat(i >= width ? headerLength : 0); + const end = width + (i >= width ? -headerLength : calcAnsiLengthValue); const tmp = `${prefix}${text.slice(i, i + end)}`; fixedText.push(tmp); @@ -59,64 +55,62 @@ function textNormalizer(text:string,width:number):string[] { } type CreateData = { - type:string; - message:string; - createMessage:string; -} + type: string; + message: string; + createMessage: string; +}; export type LoggerCreateData = { - type:string; - message:string; - createMessage:string; - date:number; -} - + type: string; + message: string; + createMessage: string; + date: number; +}; -function createData(data:CreateData):LoggerCreateData{ +function createData(data: CreateData): LoggerCreateData { return { ...data, date: Date.now(), }; } - -class Logger{ - #addStdout(obj:LoggerCreateData){ - const {createMessage,...stdoutObj } = obj; +class Logger { + #addStdout(obj: LoggerCreateData) { + const { createMessage, ...stdoutObj } = obj; process.stdout.write(JSON.stringify(stdoutObj)); } - #addStderr(message:string){ + #addStderr(message: string) { const out = message.endsWith("\n") ? message : message + "\n"; process.stderr.write(out); } - #loggerSelectProcess(data:LoggerCreateData){ - if((process.stdout.isTTY)){ + #loggerSelectProcess(data: LoggerCreateData) { + if (process.stdout.isTTY) { this.#addStderr(data.createMessage); - }else{ + } else { this.#addStdout(data); } return data; } - info(message: string):LoggerCreateData{ + info(message: string): LoggerCreateData { const data = this.createInfo(message); return this.#loggerSelectProcess(data); } - createInfo(message: string):LoggerCreateData{ + createInfo(message: string): LoggerCreateData { const obj = createData({ - type:"INFO", - message:`[INFO] ${message}`, - createMessage:`${pc.blueBright("[INFO]")} ${message}`, + type: "INFO", + message: `[INFO] ${message}`, + createMessage: `${pc.blueBright("[INFO]")} ${message}`, }); return obj; } - warn(message: string):LoggerCreateData{ + warn(message: string): LoggerCreateData { const data = this.createWarn(message); return this.#loggerSelectProcess(data); } - createWarn(message: string):LoggerCreateData{ + createWarn(message: string): LoggerCreateData { const obj = createData({ type: "WARN", message: `[WARN] ${message}`, @@ -125,13 +119,12 @@ class Logger{ return obj; } - error(message: string):LoggerCreateData{ - + error(message: string): LoggerCreateData { const data = this.createError(message); return this.#loggerSelectProcess(data); } - createError(message: string):LoggerCreateData{ + createError(message: string): LoggerCreateData { const obj = createData({ type: "ERROR", message: `[ERROR] ${message}`, @@ -141,11 +134,11 @@ class Logger{ return obj; } - success(message: string):LoggerCreateData{ + success(message: string): LoggerCreateData { const data = this.createSuccess(message); return this.#loggerSelectProcess(data); } - createSuccess(message: string):LoggerCreateData{ + createSuccess(message: string): LoggerCreateData { const obj = createData({ type: "SUCCESS", message: `[SUCCESS] ${message}`, @@ -154,11 +147,11 @@ class Logger{ return obj; } - process(message: string):LoggerCreateData{ + process(message: string): LoggerCreateData { const data = this.createProcess(message); return this.#loggerSelectProcess(data); } - createProcess(message: string):LoggerCreateData{ + createProcess(message: string): LoggerCreateData { const obj = createData({ type: "PROCESS", message: `[PROCESS] ${message}`, @@ -167,11 +160,11 @@ class Logger{ return obj; } - message(message: string):LoggerCreateData{ + message(message: string): LoggerCreateData { const data = this.createMessage(message); return this.#loggerSelectProcess(data); } - createMessage(message: string):LoggerCreateData{ + createMessage(message: string): LoggerCreateData { const obj = createData({ type: "MESSAGE", message: `[MESSAGE] ${message}`, @@ -180,11 +173,11 @@ class Logger{ return obj; } - system(message: string):LoggerCreateData{ + system(message: string): LoggerCreateData { const data = this.createSystem(message); return this.#loggerSelectProcess(data); } - createSystem(message: string):LoggerCreateData{ + createSystem(message: string): LoggerCreateData { const obj = createData({ type: "SYSTEM", message: `[SYSTEM] ${message}`, @@ -193,11 +186,11 @@ class Logger{ return obj; } - bar():LoggerCreateData{ + bar(): LoggerCreateData { const data = this.createBar(); return this.#loggerSelectProcess(data); } - createBar():LoggerCreateData{ + createBar(): LoggerCreateData { const width = getWidth(); const line = `${"─".repeat(width - 2)}`; const obj = createData({ @@ -208,44 +201,37 @@ class Logger{ return obj; } - window(window:{ - title:string; - content:LoggerCreateData[]; - }):void{ - - if(!(process.stdout.isTTY)){ - window.content.forEach((data)=>{ - this.#loggerSelectProcess(data) + window(window: { title: string; content: LoggerCreateData[] }): void { + if (!process.stdout.isTTY) { + window.content.forEach((data) => { + this.#loggerSelectProcess(data); }); return; } const width = getWidth(); - const createLine = (line:string):string => { - const repeatNumber = (width - 2) - stringWidth(line); + const createLine = (line: string): string => { + const repeatNumber = width - 2 - stringWidth(line); const safeRepeatNumber = repeatNumber >= 0 ? repeatNumber : 0; return `│${line}${" ".repeat(safeRepeatNumber)}│`; - } + }; this.#addStderr(`┌${"─".repeat(width - 2)}┐`); - textNormalizer(window.title,(width - 2)) - .forEach((text)=>{ - this.#addStderr(createLine(text)); + textNormalizer(window.title, width - 2).forEach((text) => { + this.#addStderr(createLine(text)); }); this.#addStderr(`├${"─".repeat(width - 2)}┤`); - window.content. - forEach((lineText)=>{ - textNormalizer(lineText.createMessage,(width - 2)). - forEach((text)=>{ - this.#addStderr(createLine(text)); - }); + window.content.forEach((lineText) => { + textNormalizer(lineText.createMessage, width - 2).forEach((text) => { + this.#addStderr(createLine(text)); + }); }); this.#addStderr(`└${"─".repeat(width - 2)}┘`); } } -export const logger = new Logger(); \ No newline at end of file +export const logger = new Logger(); diff --git a/scripts/testPlayground.ts b/scripts/testPlayground.ts index e26a875..3238abd 100644 --- a/scripts/testPlayground.ts +++ b/scripts/testPlayground.ts @@ -3,36 +3,32 @@ import { spawnSync } from "node:child_process"; import { undoPlayground } from "./undoPlayground.js"; import { logger } from "./logger.js"; -const PLAYGROUND_PASS = "../test/playground" +const PLAYGROUND_PASS = "../test/playground"; - -function getPlaygroundPath():string{ +function getPlaygroundPath(): string { const dirname = import.meta.dirname; - return path.join(dirname,PLAYGROUND_PASS); + return path.join(dirname, PLAYGROUND_PASS); } - -function testCLI( - playgroundPath:string -):{args:string[],ok:boolean}[]{ - const testResult:{args:string[],ok:boolean}[] = [] - const run = (args:string[],timeout?:number | undefined) => { - console.log(`[テスト実行] : `,...args); - const result = spawnSync("npx", ["tyoi",...args], { +function testCLI(playgroundPath: string): { args: string[]; ok: boolean }[] { + const testResult: { args: string[]; ok: boolean }[] = []; + const run = (args: string[], timeout?: number | undefined) => { + console.log(`[テスト実行] : `, ...args); + const result = spawnSync("npx", ["tyoi", ...args], { cwd: playgroundPath, stdio: "inherit", timeout, }); testResult.push({ - args:["npx","tyoi",...args], - ok:!result.status + args: ["npx", "tyoi", ...args], + ok: !result.status, }); - } - const undo = () =>{ - console.log("[戻しています]") + }; + const undo = () => { + console.log("[戻しています]"); undoPlayground(playgroundPath); - } + }; run(["help"]); run(["info"]); @@ -41,36 +37,36 @@ function testCLI( run(["create"]); undo(); run(["config"]); - run(["run"],3000); - run(["dev"],3000); + run(["run"], 3000); + run(["dev"], 3000); - return testResult + return testResult; } -function main(){ +function main() { const playgroundPath = getPlaygroundPath(); const results = testCLI(playgroundPath); - const summary = logger.createInfo((()=>{ - const ok = results.filter((r)=>r.ok); - const error = results.filter((r)=>!(r.ok)); + const summary = logger.createInfo( + (() => { + const ok = results.filter((r) => r.ok); + const error = results.filter((r) => !r.ok); - return `テスト回数 : ${results.length}\nOK : ${ok.length}\nERROR : ${error.length}`; - })()); + return `テスト回数 : ${results.length}\nOK : ${ok.length}\nERROR : ${error.length}`; + })() + ); logger.window({ - title:"CLIテスト結果の結果", - content:[ + title: "CLIテスト結果の結果", + content: [ summary, logger.createBar(), - ...results.map(r=> - r.ok? - logger.createSuccess(r.args.join(" ")): - logger.createError(r.args.join(" ")) - ) - ] - }) + ...results.map((r) => + r.ok ? logger.createSuccess(r.args.join(" ")) : logger.createError(r.args.join(" ")) + ), + ], + }); } -main(); \ No newline at end of file +main(); diff --git a/scripts/tsconfig.json b/scripts/tsconfig.json index a4847c6..6519c6f 100644 --- a/scripts/tsconfig.json +++ b/scripts/tsconfig.json @@ -5,4 +5,4 @@ "rootDir": "." }, "include": ["*.ts"] -} \ No newline at end of file +} diff --git a/scripts/undoPlayground.ts b/scripts/undoPlayground.ts index 048ba8d..1261ad1 100644 --- a/scripts/undoPlayground.ts +++ b/scripts/undoPlayground.ts @@ -1,36 +1,24 @@ import path from "node:path"; -import fs from "node:fs" +import fs from "node:fs"; -const PACK_REGEX = /^donneko-tyoi-server-[0-9].[0-9].[0-9].tgz$/; -const NOT_REMOVES:string[] = [ - "node_modules", - "package.json", - "package-lock.json" -] +const PACK_REGEX = /^donneko-tyoi-server-[0-9].[0-9].[0-9].tgz$/; +const NOT_REMOVES: string[] = ["node_modules", "package.json", "package-lock.json"]; -function isNotRemove(fileName:string):boolean{ - return PACK_REGEX.test(fileName) || - NOT_REMOVES.includes(fileName); +function isNotRemove(fileName: string): boolean { + return PACK_REGEX.test(fileName) || NOT_REMOVES.includes(fileName); } -function clearPlayground( - playgroundPath:string -){ +function clearPlayground(playgroundPath: string) { const items = fs.readdirSync(playgroundPath); - for(const item of items){ + for (const item of items) { + if (isNotRemove(item)) continue; - if(isNotRemove(item))continue; - - const itemPath = path.join(playgroundPath,item); - fs.rmSync(itemPath,{ recursive: true, force: true }); + const itemPath = path.join(playgroundPath, item); + fs.rmSync(itemPath, { recursive: true, force: true }); } } -export function undoPlayground( - playgroundPath:string -){ - clearPlayground( - playgroundPath - ) -} \ No newline at end of file +export function undoPlayground(playgroundPath: string) { + clearPlayground(playgroundPath); +} diff --git a/src/app/config-server.ts b/src/app/config-server.ts index c33108b..397fea6 100644 --- a/src/app/config-server.ts +++ b/src/app/config-server.ts @@ -1,13 +1,9 @@ import { serverDefaultConfigSchema, serverUserConfigSchema } from "../types/config.type.js"; import type { ServerUserConfig, ServerDefaultConfig } from "../types/config.type.js"; -export function defineConfig( - config:ServerUserConfig -){ +export function defineConfig(config: ServerUserConfig) { return serverUserConfigSchema.parse(config); } -export function defineDefaultConfig( - config:ServerDefaultConfig -){ +export function defineDefaultConfig(config: ServerDefaultConfig) { return serverDefaultConfigSchema.parse(config); -} \ No newline at end of file +} diff --git a/src/app/server.ts b/src/app/server.ts index a34410e..20b8784 100644 --- a/src/app/server.ts +++ b/src/app/server.ts @@ -2,13 +2,17 @@ import express from "express"; import http from "node:http"; import { pathNormalization } from "../service/path-normalization.js"; -import { ApiRegistry , ApiRegistryHandler} from "../util/api-registry.js"; +import { ApiRegistry, ApiRegistryHandler } from "../util/api-registry.js"; import { logger } from "../util/logger.js"; import { findAvailablePort } from "../service/find-available-port.js"; -import type { BrowserOpenConfig,ServerDefaultConfig,ServerUserConfig } from "../types/config.type.js" +import type { + BrowserOpenConfig, + ServerDefaultConfig, + ServerUserConfig, +} from "../types/config.type.js"; import { serverStartSummary } from "../service/server-start-summary.js"; import { openBrowser } from "../service/open-browser.js"; -import { EventBus ,EventBusHandler} from "../util/event-bus.js"; +import { EventBus, EventBusHandler } from "../util/event-bus.js"; import { ServerLogger } from "../service/server-logger.js"; import type { OutEventBusMap } from "../types/out.event-bus.type.js"; import type { InnerEventBusMap } from "../types/inner.event-bus.type.js"; @@ -17,67 +21,63 @@ import { HttpMetaManager } from "../service/http-meta/http-meta-manager.js"; import { SystemMetaManager } from "../service/system-meta/system-meta-manager.js"; import { configManager } from "../service/config-manager.js"; import { RegisterManager } from "../service/register-manager.js"; -import { WebSocketRouter ,type WsHandler } from "../service/web-socket-router.js"; - +import { WebSocketRouter, type WsHandler } from "../service/web-socket-router.js"; export type RequestData = { - query : unknown, - body : unknown, - headers: unknown -} + query: unknown; + body: unknown; + headers: unknown; +}; type RequestEventMap = { [N in L]: RequestData; -} +}; export type StartServerOptions = { port?: number; exposeLan?: boolean; - showQrCode?:boolean; - autoPort?:boolean; - openBrowser?:BrowserOpenConfig; + showQrCode?: boolean; + autoPort?: boolean; + openBrowser?: BrowserOpenConfig; }; export type ServerOptions = ServerUserConfig & { baseDirname: string; -} +}; -function removeUndefinedConfig(config:ServerUserConfig):Partial{ +function removeUndefinedConfig(config: ServerUserConfig): Partial { return Object.fromEntries( Object.entries(config).filter(([, value]) => value !== undefined) ) as Partial; } export type ServerServicesRegister = { - innerEventBus:EventBus; - outEventBus:EventBus; - serverLogger:ServerLogger - httpMetaManager:HttpMetaManager; - systemMetaManager:SystemMetaManager; - serverConfig:configManager; - serverRegister:RegisterManager; -} + innerEventBus: EventBus; + outEventBus: EventBus; + serverLogger: ServerLogger; + httpMetaManager: HttpMetaManager; + systemMetaManager: SystemMetaManager; + serverConfig: configManager; + serverRegister: RegisterManager; +}; export class Server< RequestNameList extends string = string, - WebSocketNameList extends string = string ->{ + WebSocketNameList extends string = string, +> { #appServer = express(); #serverAPIs = new ApiRegistry>(); #outEventBus = new EventBus(); #innerEventBus = new EventBus(); - #serverLogger = new ServerLogger( - this.#innerEventBus, - this.#outEventBus - ); + #serverLogger = new ServerLogger(this.#innerEventBus, this.#outEventBus); #httpServer: http.Server | null = null; - #serverConfig:configManager = new configManager(); - #serverRegister:RegisterManager = new RegisterManager(); + #serverConfig: configManager = new configManager(); + #serverRegister: RegisterManager = new RegisterManager(); #serverServicesRegister = new ServicesRegister({ - innerEventBus:this.#innerEventBus, - outEventBus:this.#outEventBus, - serverLogger:this.#serverLogger, - httpMetaManager:new HttpMetaManager(), - systemMetaManager:new SystemMetaManager(), - serverConfig:this.#serverConfig, - serverRegister:this.#serverRegister + innerEventBus: this.#innerEventBus, + outEventBus: this.#outEventBus, + serverLogger: this.#serverLogger, + httpMetaManager: new HttpMetaManager(), + systemMetaManager: new SystemMetaManager(), + serverConfig: this.#serverConfig, + serverRegister: this.#serverRegister, }); #webSocketRouter = new WebSocketRouter(); @@ -108,9 +108,8 @@ export class Server< * return data; * }) */ - constructor(options?:ServerOptions){ - - if(options){ + constructor(options?: ServerOptions) { + if (options) { this.#serverConfig.updateConfig(removeUndefinedConfig(options)); } @@ -119,32 +118,36 @@ export class Server< } // サーバー作成前の設定 - #init(){ + #init() { const baseDirname = this.#serverConfig.getConfig("baseDirname"); const publicDirname = this.#serverConfig.getConfig("publicDirname"); const signalShutdownHandling = this.#serverConfig.getConfig("signalShutdownHandling"); - if(!baseDirname) throw new Error("baseDirname is required"); + if (!baseDirname) throw new Error("baseDirname is required"); - this.#serverConfig.updateConfig({baseDirname}); + this.#serverConfig.updateConfig({ baseDirname }); - const publicDirectoryPath = pathNormalization(baseDirname,publicDirname); - this.#serverRegister.updateConfig({publicDirectoryPath}); + const publicDirectoryPath = pathNormalization(baseDirname, publicDirname); + this.#serverRegister.updateConfig({ publicDirectoryPath }); - if(signalShutdownHandling){ - process.on("SIGINT" , async ()=>{ await this.#shutdownServer() }); - process.on("SIGTERM", async ()=>{ await this.#shutdownServer() }); + if (signalShutdownHandling) { + process.on("SIGINT", async () => { + await this.#shutdownServer(); + }); + process.on("SIGTERM", async () => { + await this.#shutdownServer(); + }); } } // サーバー作成 - #initServer(){ + #initServer() { const middlewares = this.#serverConfig.getConfig("middlewares"); const apiPrefix = this.#serverConfig.getConfig("apiPrefix"); const publicDirectoryPath = this.#serverRegister.getConfig("publicDirectoryPath") ?? ""; // ミドルウェアと追加する。 - for(const middleware of middlewares){ + for (const middleware of middlewares) { this.#appServer.use(middleware); } // JSONを受け取れるようにする @@ -160,13 +163,14 @@ export class Server< this.#appServer.use((req, res) => { const sendData = this.#serverServicesRegister.get("httpMetaManager").getMeta(404); - res.status(sendData.code) - .send(`

${sendData.message}


${sendData.description}

`); + res.status(sendData.code).send( + `

${sendData.message}


${sendData.description}

` + ); }); } // サーバーAPI処理 - async #apiProcess(req:express.Request, res:express.Response) { + async #apiProcess(req: express.Request, res: express.Response) { try { const key = `${req.method}:${req.path}`; @@ -174,7 +178,7 @@ export class Server< res.status(404).json({ ok: false, code: "API_NOT_FOUND", - message: "API not found" + message: "API not found", }); return; } @@ -182,44 +186,43 @@ export class Server< const result = await this.#serverAPIs.emit(key, { query: req.query, body: req.body, - headers: req.headers + headers: req.headers, }); res.json({ ok: true, - data: result + data: result, }); - - } catch (error) { + } catch { res.status(500).json({ ok: false, code: "API_INTERNAL_ERROR", - message: "Internal server error" + message: "Internal server error", }); } - }; + } - async #createHttpServer(port:number,host:string):Promise{ - const httpServer = await new Promise((resolve,reject)=>{ + async #createHttpServer(port: number, host: string): Promise { + const httpServer = await new Promise((resolve, reject) => { const server = http.createServer(this.#appServer); this.#webSocketRouter.start(server); - server.listen(port,host); + server.listen(port, host); const onError = (error: Error) => { - server.off("listening",onListening); + server.off("listening", onListening); this.#httpServer = null; reject(error); }; const onListening = () => { - server.off("error",onError); + server.off("error", onError); resolve(server); }; - server.once("error",onError); - server.once("listening",onListening); + server.once("error", onError); + server.once("listening", onListening); this.#httpServer = server; }); @@ -227,28 +230,26 @@ export class Server< return httpServer; } - #isShuttingDown:boolean = false; - async #shutdownServer(){ - if(this.#isShuttingDown) return; + #isShuttingDown: boolean = false; + async #shutdownServer() { + if (this.#isShuttingDown) return; this.#isShuttingDown = true; logger.bar(); - this.#serverLogger.logger("process", - this.#serverServicesRegister - .get("systemMetaManager") - .getMeta(100).message + this.#serverLogger.logger( + "process", + this.#serverServicesRegister.get("systemMetaManager").getMeta(100).message ); await this.stopServer(); - this.#serverLogger.logger("success", - this.#serverServicesRegister - .get("systemMetaManager") - .getMeta(101).message + this.#serverLogger.logger( + "success", + this.#serverServicesRegister.get("systemMetaManager").getMeta(101).message ); } - #isStarting:boolean = false; + #isStarting: boolean = false; /** * サーバーの起動する。 * @param options サーバー起動時の便利なオプションを設定できます @@ -260,22 +261,21 @@ export class Server< port:3000 }); */ - async startServer(options?:StartServerOptions):Promise{ + async startServer(options?: StartServerOptions): Promise { try { - if(this.#httpServer){ - this.#serverLogger.logger("warn", - this.#serverServicesRegister - .get("systemMetaManager") - .getMeta(102).message + if (this.#httpServer) { + this.#serverLogger.logger( + "warn", + this.#serverServicesRegister.get("systemMetaManager").getMeta(102).message ); return; } - if(this.#isStarting) return; + if (this.#isStarting) return; this.#isStarting = true; - this.#innerEventBus.emit("server/start:process",{}); + // this.#innerEventBus.emit("server/start:process", {}); - if(options){ + if (options) { this.#serverConfig.updateConfig(removeUndefinedConfig(options)); } const exposeLan = this.#serverConfig.getConfig("exposeLan"); @@ -287,81 +287,75 @@ export class Server< const configPort = this.#serverConfig.getConfig("port"); const publicDirectoryPath = this.#serverRegister.getConfig("publicDirectoryPath") ?? ""; - // ホスト設定 const host = exposeLan ? "0.0.0.0" : "127.0.0.1"; // ポート設定 // MEMO constructorで設定した値がデフォルトで上書きされる可能性があるから、ifはoptionsで比較 const tmpPort = await findAvailablePort({ - startPort:configPort, + startPort: configPort, host, - isAutoPort:autoPort, - servicesRegister:this.#serverServicesRegister + isAutoPort: autoPort, + servicesRegister: this.#serverServicesRegister, }); // サーバー起動処理 - const httpServer = await this.#createHttpServer(tmpPort,host); + const httpServer = await this.#createHttpServer(tmpPort, host); const address = httpServer.address(); - const port = typeof address === "object" && address !== null - ? address.port - : tmpPort; - this.#serverConfig.updateConfig({port}); + const port = typeof address === "object" && address !== null ? address.port : tmpPort; + this.#serverConfig.updateConfig({ port }); // スタートログ serverStartSummary({ host, port, - publicPath:publicDirname, - publicFullPath:publicDirectoryPath, - apiPrefix:apiPrefix, - isShowQrCode:showQrCode, - servicesRegister:this.#serverServicesRegister + publicPath: publicDirname, + publicFullPath: publicDirectoryPath, + apiPrefix: apiPrefix, + isShowQrCode: showQrCode, + servicesRegister: this.#serverServicesRegister, }); // ブラウザオープン - if(openBrowserConfig){ + if (openBrowserConfig) { await openBrowser({ host, port, - target:openBrowserConfig, - servicesRegister:this.#serverServicesRegister + target: openBrowserConfig, + servicesRegister: this.#serverServicesRegister, }); } - this.#innerEventBus.emit("server/start:success",{}); + // this.#innerEventBus.emit("server/start:success", {}); this.#isStarting = false; return httpServer; - } catch (error) { this.#isStarting = false; - this.#serverLogger.logger("error", - this.#serverServicesRegister - .get("systemMetaManager") - .getMeta(103).message + this.#serverLogger.logger( + "error", + this.#serverServicesRegister.get("systemMetaManager").getMeta(103).message ); - if(error instanceof Error){ - this.#serverLogger.logger("error",error.message); - this.#innerEventBus.emit("server/start:error",{error}); - }else{ - this.#innerEventBus.emit("server/start:error",{}); + if (error instanceof Error) { + this.#serverLogger.logger("error", error.message); + this.#innerEventBus.emit("server/start:error", { error }); + } else { + this.#innerEventBus.emit("server/start:error", {}); } throw error; } - } - #isStopServer:boolean = false; - async stopServer():Promise{ + #isStopServer: boolean = false; + async stopServer(): Promise { const server = this.#httpServer; if (!server) return; - if(this.#isStopServer) return; + if (this.#isStopServer) return; this.#isStopServer = true; - return new Promise((resolve,reject)=>{ + return new Promise((resolve, reject) => { let settled = false; const finish = () => { if (settled) return; @@ -371,49 +365,45 @@ export class Server< this.#isStopServer = false; this.#httpServer = null; }; - this.#serverLogger.logger("process", - this.#serverServicesRegister - .get("systemMetaManager") - .getMeta(104).message + this.#serverLogger.logger( + "process", + this.#serverServicesRegister.get("systemMetaManager").getMeta(104).message ); - this.#innerEventBus.emit("server/stop:process",{}); + // this.#innerEventBus.emit("server/stop:process", {}); const timeout = setTimeout(() => { if (settled) return; server?.closeAllConnections(); - this.#serverLogger.logger("warn", - this.#serverServicesRegister - .get("systemMetaManager") - .getMeta(105).message + this.#serverLogger.logger( + "warn", + this.#serverServicesRegister.get("systemMetaManager").getMeta(105).message ); - this.#innerEventBus.emit("server/stop:timeout",{}); + // this.#innerEventBus.emit("server/stop:timeout", {}); finish(); resolve(); }, 10000); - server?.close((error)=>{ + server?.close((error) => { if (settled) return; - if(error){ - this.#serverLogger.logger("error", - this.#serverServicesRegister - .get("systemMetaManager") - .getMeta(106).message + if (error) { + this.#serverLogger.logger( + "error", + this.#serverServicesRegister.get("systemMetaManager").getMeta(106).message ); - this.#innerEventBus.emit("server/stop:error",{}); + // this.#innerEventBus.emit("server/stop:error", {}); finish(); reject(error); return; - }; - this.#serverLogger.logger("success", - this.#serverServicesRegister - .get("systemMetaManager") - .getMeta(107).message + } + this.#serverLogger.logger( + "success", + this.#serverServicesRegister.get("systemMetaManager").getMeta(107).message ); - this.#innerEventBus.emit("server/stop:success",{}); + // this.#innerEventBus.emit("server/stop:success", {}); finish(); resolve(); @@ -423,80 +413,89 @@ export class Server< } // Event登録 - onEvent(type:Key,fn:EventBusHandler){ - return this.#outEventBus.on(type,fn); + onEvent(type: Key, fn: EventBusHandler) { + return this.#outEventBus.on(type, fn); } // Event一度のみ起動 - onceEvent(type:Key,fn:EventBusHandler){ - return this.#outEventBus.once(type,fn); + onceEvent( + type: Key, + fn: EventBusHandler + ) { + return this.#outEventBus.once(type, fn); } // Event消去 - offEvent(type:Key,fn:EventBusHandler){ - this.#outEventBus.off(type,fn); + offEvent( + type: Key, + fn: EventBusHandler + ) { + this.#outEventBus.off(type, fn); } // Eventが存在するか? - hasEvent(type:Key){ + hasEvent(type: Key) { return this.#outEventBus.has(type); } // API登録 - onAPI>(type:Key,fn:ApiRegistryHandler[Key]>){ - return this.#serverAPIs.on(type,fn); + onAPI>( + type: Key, + fn: ApiRegistryHandler[Key]> + ) { + return this.#serverAPIs.on(type, fn); } // API一度のみ起動 - onceAPI>(type:Key,fn:ApiRegistryHandler[Key]>){ - return this.#serverAPIs.once(type,fn); + onceAPI>( + type: Key, + fn: ApiRegistryHandler[Key]> + ) { + return this.#serverAPIs.once(type, fn); } // API消去 - offAPI>(type:Key){ + offAPI>(type: Key) { this.#serverAPIs.off(type); } // APIが存在するか? - hasAPI>(type:Key){ + hasAPI>(type: Key) { return this.#serverAPIs.has(type); } // API手動実行 - emitAPI>(type:Key,data:RequestEventMap[Key]){ - return this.#serverAPIs.emit(type,data); + emitAPI>( + type: Key, + data: RequestEventMap[Key] + ) { + return this.#serverAPIs.emit(type, data); } // WebSocket登録 - onWebSocket( - type:Key, - fn:ApiRegistryHandler - ){ - return this.#webSocketRouter.on(type,fn); + onWebSocket(type: Key, fn: ApiRegistryHandler) { + return this.#webSocketRouter.on(type, fn); } // WebSocket一度のみ起動 - onceWebSocket( - type:Key, - fn:ApiRegistryHandler - ){ - return this.#webSocketRouter.once(type,fn); + onceWebSocket(type: Key, fn: ApiRegistryHandler) { + return this.#webSocketRouter.once(type, fn); } // WebSocket消去 - offWebSocket(type:Key){ + offWebSocket(type: Key) { this.#webSocketRouter.off(type); } // WebSocketが存在するか? - hasWebSocket(type:string){ + hasWebSocket(type: string) { return this.#webSocketRouter.has(type); } // サーバー起動中か? - isRunning():boolean{ + isRunning(): boolean { return this.#httpServer !== null; } // サーバーポート取得 - getPort():number{ + getPort(): number { return this.#serverConfig.getConfig("port"); } // サーバー設定取得 - getConfig(key:K):ServerDefaultConfig[K]{ + getConfig(key: K): ServerDefaultConfig[K] { return this.#serverConfig.getConfig(key); } // HTTPサーバー取得 - getHttpServer():http.Server | null{ + getHttpServer(): http.Server | null { return this.#httpServer; } } diff --git a/src/app/short-handler.ts b/src/app/short-handler.ts index 64457a5..9005da5 100644 --- a/src/app/short-handler.ts +++ b/src/app/short-handler.ts @@ -1,43 +1,39 @@ -import { Server , type ServerOptions , type RequestData , type StartServerOptions} from "./server.js"; -import { ApiRegistryHandler} from "../util/api-registry.js"; +import { Server, type ServerOptions, type RequestData, type StartServerOptions } from "./server.js"; +import { ApiRegistryHandler } from "../util/api-registry.js"; import type { WsHandler } from "../service/web-socket-router.js"; import http from "node:http"; -class shortHandler{ - private server:Server; +class shortHandler { + private server: Server; - constructor(server:Server){ + constructor(server: Server) { this.server = server; } - get tyoiServer(){ + get tyoiServer() { return this.server; } - get(pass:string,fn:ApiRegistryHandler):this{ - this.server.onAPI(`GET:${pass}`,fn); + get(pass: string, fn: ApiRegistryHandler): this { + this.server.onAPI(`GET:${pass}`, fn); return this; } - post(pass:string,fn:ApiRegistryHandler):this{ - this.server.onAPI(`POST:${pass}`,fn); + post(pass: string, fn: ApiRegistryHandler): this { + this.server.onAPI(`POST:${pass}`, fn); return this; } - ws(pass:string,fn:ApiRegistryHandler):this{ - this.server.onWebSocket(`${pass}`,fn); + ws(pass: string, fn: ApiRegistryHandler): this { + this.server.onWebSocket(`${pass}`, fn); return this; } - async start( - options?:StartServerOptions - ):Promise{ + async start(options?: StartServerOptions): Promise { return this.server.startServer(options); } - async close():Promise{ + async close(): Promise { this.server.stopServer(); } } -export function tyoi( - options:ServerOptions -):shortHandler{ +export function tyoi(options: ServerOptions): shortHandler { const server = new Server(options); return new shortHandler(server); } diff --git a/src/cli/app/app-tyoi-cli.ts b/src/cli/app/app-tyoi-cli.ts index c3e8584..80f5427 100644 --- a/src/cli/app/app-tyoi-cli.ts +++ b/src/cli/app/app-tyoi-cli.ts @@ -1,10 +1,10 @@ import { CommandHandler } from "@donneko/tyoi-cli"; -import type { MetaData } from "../types/tyoi-cli.js" +import type { MetaData } from "../types/tyoi-cli.js"; import { getOnError } from "../service/app-tyoi-cli/on-error.js"; import { getMetaData } from "../service/app-tyoi-cli/meta-data.js"; import { addCommand } from "../service/app-tyoi-cli/add-command.js"; -export async function appTyoiCli(){ +export async function appTyoiCli() { const argv = process.argv.slice(2); const cmdHandler = new CommandHandler(); @@ -13,4 +13,4 @@ export async function appTyoiCli(){ addCommand(cmdHandler); await cmdHandler.run(argv); -} \ No newline at end of file +} diff --git a/src/cli/command/config/main.ts b/src/cli/command/config/main.ts index a7ab082..0fb98d1 100644 --- a/src/cli/command/config/main.ts +++ b/src/cli/command/config/main.ts @@ -1,35 +1,33 @@ import type { CmdMetaData } from "../../types/tyoi-cli.js"; import { showNextSteps } from "./service/next-steps.js"; -import copyTemplate from "../../service/template-copy/main.js" - -export default async function serverConfig(data:CmdMetaData){ +import copyTemplate from "../../service/template-copy/main.js"; +export default async function serverConfig(data: CmdMetaData) { const TEMPLATE_PASS = "../templates/config"; const mainDirname = data.meta.cli.dirname; - const processCwd = data.meta.cli.cwd; + const processCwd = data.meta.cli.cwd; const option = data.meta.option; const projectName = data.args[0]; const pack = data.meta.pack; - await copyTemplate( - { - target:processCwd, - base:mainDirname, - option:{ - template:option?.template, - ...(projectName !== undefined ? { projectName } : {}), - }, - pack:{ - version:pack.version, - }, - app:{ - templatePass:TEMPLATE_PASS, - replacePackageJson:false - } - }); + await copyTemplate({ + target: processCwd, + base: mainDirname, + option: { + template: option?.template, + ...(projectName !== undefined ? { projectName } : {}), + }, + pack: { + version: pack.version, + }, + app: { + templatePass: TEMPLATE_PASS, + replacePackageJson: false, + }, + }); showNextSteps(); } diff --git a/src/cli/command/config/service/next-steps.ts b/src/cli/command/config/service/next-steps.ts index fc8eac3..0aa0106 100644 --- a/src/cli/command/config/service/next-steps.ts +++ b/src/cli/command/config/service/next-steps.ts @@ -1,7 +1,6 @@ import { logger } from "../../../../util/logger.js"; -export function showNextSteps( -): void { +export function showNextSteps(): void { logger.bar(); logger.success("次のコマンドで起動できます。"); logger.info("npx tyoi run"); diff --git a/src/cli/command/create/main.ts b/src/cli/command/create/main.ts index f5b3f73..dc258b0 100644 --- a/src/cli/command/create/main.ts +++ b/src/cli/command/create/main.ts @@ -1,35 +1,33 @@ import type { CmdMetaData } from "../../types/tyoi-cli.js"; import { showNextSteps } from "./service/next-steps.js"; -import copyTemplate from "../../service/template-copy/main.js" - -export default async function serverCreate(data:CmdMetaData){ +import copyTemplate from "../../service/template-copy/main.js"; +export default async function serverCreate(data: CmdMetaData) { const TEMPLATE_PASS = "../templates/project"; const mainDirname = data.meta.cli.dirname; - const processCwd = data.meta.cli.cwd; + const processCwd = data.meta.cli.cwd; const option = data.meta.option; const projectName = data.args[0]; const pack = data.meta.pack; - const usedProjectName = await copyTemplate( - { - target:processCwd, - base:mainDirname, - option:{ - template:option?.template, - ...(projectName !== undefined ? { projectName } : {}), - }, - pack:{ - version:pack.version, - }, - app:{ - templatePass:TEMPLATE_PASS, - destination:"target-project" - } - }); + const usedProjectName = await copyTemplate({ + target: processCwd, + base: mainDirname, + option: { + template: option?.template, + ...(projectName !== undefined ? { projectName } : {}), + }, + pack: { + version: pack.version, + }, + app: { + templatePass: TEMPLATE_PASS, + destination: "target-project", + }, + }); showNextSteps(usedProjectName.projectName); } diff --git a/src/cli/command/create/service/next-steps.ts b/src/cli/command/create/service/next-steps.ts index 61a490a..51d63bd 100644 --- a/src/cli/command/create/service/next-steps.ts +++ b/src/cli/command/create/service/next-steps.ts @@ -1,8 +1,6 @@ import { logger } from "../../../../util/logger.js"; -export function showNextSteps( - projectName: string -): void { +export function showNextSteps(projectName: string): void { logger.bar(); logger.success("次のコマンドで起動できます。"); logger.info(`cd ${projectName}`); diff --git a/src/cli/command/default.ts b/src/cli/command/default.ts index ea2b69c..6297747 100644 --- a/src/cli/command/default.ts +++ b/src/cli/command/default.ts @@ -4,15 +4,15 @@ import type { CmdMetaData } from "../types/tyoi-cli.js"; import help from "./help.js"; import run from "./start.js"; -export default async function main(data:CmdMetaData){ - if(data.meta.option?.version){ +export default async function main(data: CmdMetaData) { + if (data.meta.option?.version) { const logger = new Logger(); logger.system(data.meta.pack.version); return; } - if(data.meta.option?.help){ - help(data); + if (data.meta.option?.help) { + help(); return; } await run(data); -} \ No newline at end of file +} diff --git a/src/cli/command/dev.ts b/src/cli/command/dev.ts index 15aa7ef..c55082f 100644 --- a/src/cli/command/dev.ts +++ b/src/cli/command/dev.ts @@ -3,7 +3,7 @@ import type { CmdMetaData } from "../types/tyoi-cli.js"; type RequestNameList = "GET:/test" | "GET:/test/a" | "GET:/a"; -export default async function runDevServer(data:CmdMetaData){ +export default async function runDevServer(data: CmdMetaData) { const mainDirname = data.meta.cli.dirname; // サーバー作成 @@ -11,10 +11,9 @@ export default async function runDevServer(data:CmdMetaData){ const server = new Server({ ...devConfig.default, ...data.meta.option, - ...{baseDirname:mainDirname} + ...{ baseDirname: mainDirname }, }); // サーバー起動 await server.startServer(); - -} \ No newline at end of file +} diff --git a/src/cli/command/help.ts b/src/cli/command/help.ts index 4fc0492..5580803 100644 --- a/src/cli/command/help.ts +++ b/src/cli/command/help.ts @@ -1,12 +1,12 @@ -import type { CmdMetaData } from "../types/tyoi-cli.js"; +// import type { CmdMetaData } from "../types/tyoi-cli.js"; import { Logger } from "@donneko/tyoi-logger"; -export default function serverHelp(data:CmdMetaData){ +export default function serverHelp() { const logger = new Logger(); logger.window({ - title:"help 表示", - content:[ + title: "help 表示", + content: [ logger.createInfo(`現在使用できるコマンドは以下の通りです。\n更新 : [2026/06/07]`), logger.createBar(), logger.createMessage(`dev : 動作確認用の設定で動作確認用サーバーが起動します。`), @@ -15,7 +15,7 @@ export default function serverHelp(data:CmdMetaData){ logger.createMessage(`run : 現在のディレクトリーのサーバーを起動します`), logger.createMessage(`create : 新しいフォルダーにサーバーを作成します`), logger.createMessage(`config : 現在のディレクトリーに設定ファイルを追加します`), - logger.createMessage(`info : "tyoi run" の設定が適用されるの確認結果が表示されます`) - ] + logger.createMessage(`info : "tyoi run" の設定が適用されるの確認結果が表示されます`), + ], }); -} \ No newline at end of file +} diff --git a/src/cli/command/info/main.ts b/src/cli/command/info/main.ts index 83a085c..1c8869f 100644 --- a/src/cli/command/info/main.ts +++ b/src/cli/command/info/main.ts @@ -4,60 +4,53 @@ import { getConfigFile } from "./service/getConfigFile.js"; import { pathToFileURL } from "node:url"; import { Logger } from "@donneko/tyoi-logger"; - async function getConfig( - processCwd:string, - mainDirname:string, - optionArgs:any -):Promise{ - + processCwd: string, + mainDirname: string, + optionArgs: unknown +): Promise { + if (!(typeof optionArgs === "object")) return; + const file = await getConfigFile(processCwd); let useConfig = {}; - if(file){ - const filePath = path.join(processCwd,file) - useConfig = await import(pathToFileURL(filePath).href).then((r)=> r.default); + if (file) { + const filePath = path.join(processCwd, file); + useConfig = await import(pathToFileURL(filePath).href).then((r) => r.default); } const config = { ...useConfig, ...optionArgs, - ...{baseDirname:file ? processCwd : mainDirname} + ...{ baseDirname: file ? processCwd : mainDirname }, }; return config; } -function addLog( - config:any -){ +function addLog(config: unknown) { + if (!(typeof config === "object")) return; + const logger = new Logger(); const logs = []; - for (const [key, value] of Object.entries(config)) { - logs.push(`${key} : ${value}`) + for (const [key, value] of Object.entries(config as Record)) { + logs.push(`${key} : ${value}`); } logger.window({ - title:"config info", - content:[ - ...logs.map(l=>logger.createSystem(l)) - ] - }) + title: "config info", + content: [...logs.map((l) => logger.createSystem(l))], + }); } -export default async function serverCreate(data:CmdMetaData){ - +export default async function serverCreate(data: CmdMetaData) { const mainDirname = data.meta.cli.dirname; - const processCwd = data.meta.cli.cwd; + const processCwd = data.meta.cli.cwd; - const config = await getConfig( - processCwd, - mainDirname, - data.meta.option.optionArgs, - ); + const config = await getConfig(processCwd, mainDirname, data.meta.option.optionArgs); addLog(config); -} \ No newline at end of file +} diff --git a/src/cli/command/info/service/getConfigFile.ts b/src/cli/command/info/service/getConfigFile.ts index a6edd74..41711df 100644 --- a/src/cli/command/info/service/getConfigFile.ts +++ b/src/cli/command/info/service/getConfigFile.ts @@ -1,17 +1,17 @@ import { askSelect } from "../../../../service/ask-select.js"; import { scanConfigFiles } from "../../../../service/scan-config-files.js"; -export async function getConfigFile(processCwd:string):Promise{ - const files = await scanConfigFiles(processCwd) +export async function getConfigFile(processCwd: string): Promise { + const files = await scanConfigFiles(processCwd); - if(files.length === 0)return null; + if (files.length === 0) return null; - if(files.length > 1){ + if (files.length > 1) { const index = await askSelect({ - message:"使用する設定ファイルを選択してください。", - selects:files + message: "使用する設定ファイルを選択してください。", + selects: files, }); - return index === -1?null:files[index]; + return index === -1 ? null : files[index]; } return files[0]; diff --git a/src/cli/command/init/main.ts b/src/cli/command/init/main.ts index 22591cb..18f910e 100644 --- a/src/cli/command/init/main.ts +++ b/src/cli/command/init/main.ts @@ -1,34 +1,32 @@ import type { CmdMetaData } from "../../types/tyoi-cli.js"; import { showNextSteps } from "./service/next-steps.js"; -import copyTemplate from "../../service/template-copy/main.js" - -export default async function serverInit(data:CmdMetaData){ +import copyTemplate from "../../service/template-copy/main.js"; +export default async function serverInit(data: CmdMetaData) { const TEMPLATE_PASS = "../templates/project"; const mainDirname = data.meta.cli.dirname; - const processCwd = data.meta.cli.cwd; + const processCwd = data.meta.cli.cwd; const option = data.meta.option; const projectName = data.args[0]; const pack = data.meta.pack; - await copyTemplate( - { - target:processCwd, - base:mainDirname, - option:{ - template:option?.template, - ...(projectName !== undefined ? { projectName } : {}), - }, - pack:{ - version:pack.version, - }, - app:{ - templatePass:TEMPLATE_PASS - } - }); + await copyTemplate({ + target: processCwd, + base: mainDirname, + option: { + template: option?.template, + ...(projectName !== undefined ? { projectName } : {}), + }, + pack: { + version: pack.version, + }, + app: { + templatePass: TEMPLATE_PASS, + }, + }); showNextSteps(); } diff --git a/src/cli/command/init/service/next-steps.ts b/src/cli/command/init/service/next-steps.ts index fb54bc1..eb50cc8 100644 --- a/src/cli/command/init/service/next-steps.ts +++ b/src/cli/command/init/service/next-steps.ts @@ -1,7 +1,6 @@ import { logger } from "../../../../util/logger.js"; -export function showNextSteps( -): void { +export function showNextSteps(): void { logger.bar(); logger.success("次のコマンドで起動できます。"); logger.info("npm install"); diff --git a/src/cli/command/start.ts b/src/cli/command/start.ts index d921de6..3612cce 100644 --- a/src/cli/command/start.ts +++ b/src/cli/command/start.ts @@ -7,44 +7,41 @@ import { scanConfigFiles } from "../../service/scan-config-files.js"; type RequestNameList = "GET:/test" | "GET:/test/a" | "GET:/a"; +async function getConfigFile(processCwd: string): Promise { + const files = await scanConfigFiles(processCwd); + if (files.length === 0) return null; -async function getConfigFile(processCwd:string):Promise{ - const files = await scanConfigFiles(processCwd) - - if(files.length === 0)return null; - - if(files.length > 1){ + if (files.length > 1) { const index = await askSelect({ - message:"使用する設定ファイルを選択してください。", - selects:files + message: "使用する設定ファイルを選択してください。", + selects: files, }); - return index === -1?null:files[index]; + return index === -1 ? null : files[index]; } return files[0]; } -export default async function runStartServer(data:CmdMetaData){ - const cwd = data.meta.cli.cwd; +export default async function runStartServer(data: CmdMetaData) { + const cwd = data.meta.cli.cwd; const dirname = data.meta.cli.dirname; const file = await getConfigFile(cwd); let useConfig = {}; - if(file){ - const filePath = path.join(cwd,file) - useConfig = await import(pathToFileURL(filePath).href).then((r)=> r.default); + if (file) { + const filePath = path.join(cwd, file); + useConfig = await import(pathToFileURL(filePath).href).then((r) => r.default); } // サーバー作成 const server = new Server({ ...useConfig, ...data.meta.option, - ...{baseDirname:file ? cwd : dirname} + ...{ baseDirname: file ? cwd : dirname }, }); // サーバー起動 await server.startServer(); - } diff --git a/src/cli/main.ts b/src/cli/main.ts index de0726f..dbba1a6 100644 --- a/src/cli/main.ts +++ b/src/cli/main.ts @@ -1,5 +1,5 @@ import { appTyoiCli } from "./app/app-tyoi-cli.js"; -export async function tyoiCli(){ +export async function tyoiCli() { await appTyoiCli(); -} \ No newline at end of file +} diff --git a/src/cli/service/app-tyoi-cli/add-command.ts b/src/cli/service/app-tyoi-cli/add-command.ts index 48406ae..1e0823a 100644 --- a/src/cli/service/app-tyoi-cli/add-command.ts +++ b/src/cli/service/app-tyoi-cli/add-command.ts @@ -1,22 +1,22 @@ -import type { CmdHandler } from "../../types/tyoi-cli.js" +import type { CmdHandler } from "../../types/tyoi-cli.js"; -import dev from "../../command/dev.js"; +import dev from "../../command/dev.js"; import create from "../../command/create/main.js"; -import init from "../../command/init/main.js"; -import help from "../../command/help.js"; -import run from "../../command/start.js"; +import init from "../../command/init/main.js"; +import help from "../../command/help.js"; +import run from "../../command/start.js"; import config from "../../command/config/main.js"; -import info from "../../command/info/main.js"; -import def from "../../command/default.js"; +import info from "../../command/info/main.js"; +import def from "../../command/default.js"; -export function addCommand(cmdHandler:CmdHandler){ +export function addCommand(cmdHandler: CmdHandler) { cmdHandler - .add("" ,def) - .add("dev" ,dev) - .add("run" ,run) - .add("create",create) - .add("config",config) - .add("init" ,init) - .add("info" ,info) - .add("help" ,help); -} \ No newline at end of file + .add("", def) + .add("dev", dev) + .add("run", run) + .add("create", create) + .add("config", config) + .add("init", init) + .add("info", info) + .add("help", help); +} diff --git a/src/cli/service/app-tyoi-cli/meta-data.ts b/src/cli/service/app-tyoi-cli/meta-data.ts index 742b905..ae57a2a 100644 --- a/src/cli/service/app-tyoi-cli/meta-data.ts +++ b/src/cli/service/app-tyoi-cli/meta-data.ts @@ -1,17 +1,17 @@ -import { getOption } from "./option.js" +import { getOption } from "./option.js"; import path from "node:path"; -import type { MetaData } from "../../types/tyoi-cli.js" +import type { MetaData } from "../../types/tyoi-cli.js"; -export function getMetaData(argv:string[]):MetaData{ +export function getMetaData(argv: string[]): MetaData { return { - pack:{ - version:"0.0.6", - name:"" + pack: { + version: "0.0.6", + name: "", }, - cli:{ - cwd:process.cwd(), - dirname:path.join(import.meta.dirname,"../../../") + cli: { + cwd: process.cwd(), + dirname: path.join(import.meta.dirname, "../../../"), }, - option:getOption(argv) - } + option: getOption(argv), + }; } diff --git a/src/cli/service/app-tyoi-cli/on-error.ts b/src/cli/service/app-tyoi-cli/on-error.ts index 66e6c66..402c5ad 100644 --- a/src/cli/service/app-tyoi-cli/on-error.ts +++ b/src/cli/service/app-tyoi-cli/on-error.ts @@ -1,6 +1,6 @@ import { Logger } from "@donneko/tyoi-logger"; -export function getOnError(){ +export function getOnError() { const logger = new Logger(); logger.bar(); diff --git a/src/cli/service/app-tyoi-cli/option.ts b/src/cli/service/app-tyoi-cli/option.ts index 79e6e01..47e56ff 100644 --- a/src/cli/service/app-tyoi-cli/option.ts +++ b/src/cli/service/app-tyoi-cli/option.ts @@ -1,8 +1,8 @@ -import minimist from "minimist" +import minimist from "minimist"; -export function getOption(argv:string[]){ +export function getOption(argv: string[]) { // コマンド解析 - const args = minimist(argv,{ + const args = minimist(argv, { alias: { p: "port", o: "open", @@ -10,19 +10,13 @@ export function getOption(argv:string[]){ h: "help", }, - boolean: [ - "open", - "version", - "help" - ], + boolean: ["open", "version", "help"], - string: [ - "template" - ] + string: ["template"], }); - const {open:openBrowser,...tmp} = args; - const updateArgs = args.open?{openBrowser,...tmp}:args; + const { open: openBrowser, ...tmp } = args; + const updateArgs = args.open ? { openBrowser, ...tmp } : args; - return updateArgs + return updateArgs; } diff --git a/src/cli/service/template-copy/app/app.ts b/src/cli/service/template-copy/app/app.ts index 6d34959..4f7ae1f 100644 --- a/src/cli/service/template-copy/app/app.ts +++ b/src/cli/service/template-copy/app/app.ts @@ -11,105 +11,74 @@ import { logger } from "../../../../util/logger.js"; type AppTemplateCopyDestination = "target" | "target-project"; export type AppTemplateCopyData = { - target:string, - base:string, - option:{ - template?:string, - projectName?:string - }, - pack:{ - version:string, - }, - app:{ - templatePass:string, - destination?:AppTemplateCopyDestination, - replacePackageJson?:boolean - } -} + target: string; + base: string; + option: { + template?: string; + projectName?: string; + }; + pack: { + version: string; + }; + app: { + templatePass: string; + destination?: AppTemplateCopyDestination; + replacePackageJson?: boolean; + }; +}; export type AppTemplateCopyReturn = { - projectName:string -} + projectName: string; +}; function getProjectPath( - target:string, - projectName:string, - destination:AppTemplateCopyDestination -):string{ - if(destination === "target-project"){ - return path.join(target,projectName); + target: string, + projectName: string, + destination: AppTemplateCopyDestination +): string { + if (destination === "target-project") { + return path.join(target, projectName); } return target; } function createProjectDirectory( - projectPath:string, - destination:AppTemplateCopyDestination -):void{ - if(destination !== "target-project") return; + projectPath: string, + destination: AppTemplateCopyDestination +): void { + if (destination !== "target-project") return; if (fs.existsSync(projectPath)) { - throw Error(`エラー: コピー先がすでに存在するため、安全のために終了します。 (${projectPath})`); + throw Error( + `エラー: コピー先がすでに存在するため、安全のために終了します。 (${projectPath})` + ); } fs.mkdirSync(projectPath); } +export async function appTemplateCopy(data: AppTemplateCopyData): Promise { + const { target, base, option, pack, app } = data; -export async function appTemplateCopy( - data:AppTemplateCopyData -):Promise{ - const { - target, - base, - option, - pack, - app - } = data; + const { template, projectName } = option; - const { - template, - projectName - } = option; + const templatePath = await getTemplatePath(template, base, app.templatePass); + const fixProjectName = await getProjectName(projectName, target); - const templatePath = await getTemplatePath( - template, - base, - app.templatePass - ); + const destination = app.destination ?? "target"; + const projectPath = getProjectPath(target, fixProjectName, destination); - const fixProjectName = await getProjectName( - projectName, - target - ); + createProjectDirectory(projectPath, destination); - const destination = app.destination ?? "target"; - const projectPath = getProjectPath( - target, - fixProjectName, - destination - ); - - createProjectDirectory( - projectPath, - destination - ); - - const copyResult = await copyFolder(templatePath,projectPath); - logger.window( - createCopyResult(copyResult) - ); - - if(app.replacePackageJson ?? true){ - replacePackageJson( - projectPath, - fixProjectName, - pack.version - ); + const copyResult = await copyFolder(templatePath, projectPath); + logger.window(createCopyResult(copyResult)); + + if (app.replacePackageJson ?? true) { + replacePackageJson(projectPath, fixProjectName, pack.version); } return { - projectName:fixProjectName, - } + projectName: fixProjectName, + }; } diff --git a/src/cli/service/template-copy/core/is-valid-project-name.ts b/src/cli/service/template-copy/core/is-valid-project-name.ts index 878ad17..5a27c92 100644 --- a/src/cli/service/template-copy/core/is-valid-project-name.ts +++ b/src/cli/service/template-copy/core/is-valid-project-name.ts @@ -1,5 +1,3 @@ -export function isValidProjectName( - projectName:string -):boolean{ +export function isValidProjectName(projectName: string): boolean { return /^[a-zA-Z0-9-]+$/.test(projectName); -} \ No newline at end of file +} diff --git a/src/cli/service/template-copy/core/is-valid-template.ts b/src/cli/service/template-copy/core/is-valid-template.ts index 9e8c7e8..31fe2bd 100644 --- a/src/cli/service/template-copy/core/is-valid-template.ts +++ b/src/cli/service/template-copy/core/is-valid-template.ts @@ -1,9 +1,6 @@ export function isValidTemplate( - templateName:string | undefined, - templateFiles:string[] -):boolean -{ - return templateName? - templateFiles.includes(templateName): - false; -} \ No newline at end of file + templateName: string | undefined, + templateFiles: string[] +): boolean { + return templateName ? templateFiles.includes(templateName) : false; +} diff --git a/src/cli/service/template-copy/main.ts b/src/cli/service/template-copy/main.ts index c75bf97..a2f15e7 100644 --- a/src/cli/service/template-copy/main.ts +++ b/src/cli/service/template-copy/main.ts @@ -1,7 +1,9 @@ -import { appTemplateCopy, type AppTemplateCopyData ,type AppTemplateCopyReturn} from "./app/app.js"; +import { + appTemplateCopy, + type AppTemplateCopyData, + type AppTemplateCopyReturn, +} from "./app/app.js"; -export default async function main( - data:AppTemplateCopyData -):Promise{ +export default async function main(data: AppTemplateCopyData): Promise { return await appTemplateCopy(data); -} \ No newline at end of file +} diff --git a/src/cli/service/template-copy/shell/copy-folder.ts b/src/cli/service/template-copy/shell/copy-folder.ts index 1dd8b7e..d4f371f 100644 --- a/src/cli/service/template-copy/shell/copy-folder.ts +++ b/src/cli/service/template-copy/shell/copy-folder.ts @@ -1,29 +1,21 @@ -import fs from "node:fs" +import fs from "node:fs"; import path from "node:path"; function copy( - templatePath:string, - projectPath:string, - { - error = [], - ok = [] - }:{error?:string[],ok?:string[]} = {} -){ - - const items = fs.readdirSync(templatePath,{withFileTypes:true}); + templatePath: string, + projectPath: string, + { error = [], ok = [] }: { error?: string[]; ok?: string[] } = {} +) { + const items = fs.readdirSync(templatePath, { withFileTypes: true }); for (const item of items) { - const templateItem = path.join(templatePath,item.name); - const projectItem = path.join(projectPath,item.name); + const templateItem = path.join(templatePath, item.name); + const projectItem = path.join(projectPath, item.name); try { - if(item.isDirectory()){ + if (item.isDirectory()) { fs.mkdirSync(projectItem); - copy( - templateItem, - projectItem, - {error,ok} - ) - }else{ - fs.copyFileSync(templateItem,projectItem); + copy(templateItem, projectItem, { error, ok }); + } else { + fs.copyFileSync(templateItem, projectItem); } ok.push(projectItem); } catch (e) { @@ -31,17 +23,12 @@ function copy( throw e; } } - return {error,ok}; + return { error, ok }; } export async function copyFolder( - templatePath:string, - projectPath:string -):Promise<{error:string[],ok:string[]}>{ - - - return copy( - templatePath, - projectPath - ); -} \ No newline at end of file + templatePath: string, + projectPath: string +): Promise<{ error: string[]; ok: string[] }> { + return copy(templatePath, projectPath); +} diff --git a/src/cli/service/template-copy/shell/create-copy-result.ts b/src/cli/service/template-copy/shell/create-copy-result.ts index b254c61..e0f635e 100644 --- a/src/cli/service/template-copy/shell/create-copy-result.ts +++ b/src/cli/service/template-copy/shell/create-copy-result.ts @@ -1,24 +1,14 @@ -import { logger, type LoggerCreateData } from "../../../../util/logger.js" - - -export function createCopyResult( - { - error, - ok - }:{ - error:string[] - ok:string[] - } -):{ - title:string, - content:LoggerCreateData[] -}{ +import { logger, type LoggerCreateData } from "../../../../util/logger.js"; +export function createCopyResult({ error, ok }: { error: string[]; ok: string[] }): { + title: string; + content: LoggerCreateData[]; +} { return { - title:"コピー結果", - content:[ - ...error.map(m => logger.createError(m)), - ...ok.map(m => logger.createSuccess(m)) - ] - } -} \ No newline at end of file + title: "コピー結果", + content: [ + ...error.map((m) => logger.createError(m)), + ...ok.map((m) => logger.createSuccess(m)), + ], + }; +} diff --git a/src/cli/service/template-copy/shell/project-name.ts b/src/cli/service/template-copy/shell/project-name.ts index 5a94067..5a1ee97 100644 --- a/src/cli/service/template-copy/shell/project-name.ts +++ b/src/cli/service/template-copy/shell/project-name.ts @@ -4,26 +4,24 @@ import { logger } from "../../../../util/logger.js"; import { isValidProjectName } from "../core/is-valid-project-name.js"; export async function getProjectName( - inputName:string | undefined, - target:string -):Promise{ - + inputName: string | undefined, + target: string +): Promise { let projectName = inputName; - if(!projectName){ + if (!projectName) { const defaultName = path.basename(target); - const InputProjectName = await askInput( - `Project名を入力してください。デフォルト(${defaultName}) : ` - ) ?? defaultName; + const InputProjectName = + (await askInput(`Project名を入力してください。デフォルト(${defaultName}) : `)) ?? + defaultName; - projectName = InputProjectName + projectName = InputProjectName; } - if (!isValidProjectName(projectName)){ + if (!isValidProjectName(projectName)) { throw Error(`プロジェクト名に使える文字は英数字・- のみです。[${projectName}]`); } logger.info(`選択されたプロジェクト名[${projectName}]`); return projectName; } - diff --git a/src/cli/service/template-copy/shell/replace-name.ts b/src/cli/service/template-copy/shell/replace-name.ts index 80a55e2..c566c6f 100644 --- a/src/cli/service/template-copy/shell/replace-name.ts +++ b/src/cli/service/template-copy/shell/replace-name.ts @@ -1,20 +1,17 @@ import path from "node:path"; -import fs from "node:fs" +import fs from "node:fs"; export function replacePackageJson( - projectPath: string, - projectName: string, - version:string - ): void { + projectPath: string, + projectName: string, + version: string +): void { const packageJsonPath = path.join(projectPath, "package.json"); const text = fs.readFileSync(packageJsonPath, "utf-8"); - const fixText = - text.replaceAll("__PROJECT_NAME__", projectName) - .replaceAll("__TYOI_SERVER_VERSION__", version); + const fixText = text + .replaceAll("__PROJECT_NAME__", projectName) + .replaceAll("__TYOI_SERVER_VERSION__", version); - fs.writeFileSync( - packageJsonPath, - fixText - ); -} \ No newline at end of file + fs.writeFileSync(packageJsonPath, fixText); +} diff --git a/src/cli/service/template-copy/shell/template.path.ts b/src/cli/service/template-copy/shell/template.path.ts index b2b74b2..a044e55 100644 --- a/src/cli/service/template-copy/shell/template.path.ts +++ b/src/cli/service/template-copy/shell/template.path.ts @@ -4,25 +4,19 @@ import { readDirectory } from "../../../../util/read-directory.js"; import { logger } from "../../../../util/logger.js"; import { isValidTemplate } from "../core/is-valid-template.js"; - export async function getTemplatePath( - templateName:string | undefined, - base:string, - templatePath:string -):Promise{ + templateName: string | undefined, + base: string, + templatePath: string +): Promise { const readPath = path.join(base, templatePath); const templateFiles = await readDirectory(readPath, false); let template = templateName; if (template) { - if ( - isValidTemplate( - template, - templateFiles - ) - ){ - return path.join(readPath,template); + if (isValidTemplate(template, templateFiles)) { + return path.join(readPath, template); } throw new Error(`コピー元のテンプレートが見つかりません: ${template}`); @@ -30,15 +24,15 @@ export async function getTemplatePath( const index = await askSelect({ message: "テンプレートを選択してください", - selects: templateFiles + selects: templateFiles, }); - template = templateFiles[(index === -1)?0:index]; + template = templateFiles[index === -1 ? 0 : index]; - if(!template){ + if (!template) { throw new Error(`コピー元のテンプレートが指定されていません: ${template}`); } logger.info(`選択されたテンプレート[${template}]`); - return path.join(readPath,template); + return path.join(readPath, template); } diff --git a/src/cli/types/tyoi-cli.ts b/src/cli/types/tyoi-cli.ts index a670a43..e006458 100644 --- a/src/cli/types/tyoi-cli.ts +++ b/src/cli/types/tyoi-cli.ts @@ -1,4 +1,4 @@ -import type minimist from "minimist" +import type minimist from "minimist"; import type { CommandHandler } from "@donneko/tyoi-cli"; type Data = { @@ -9,17 +9,17 @@ type Data = { }; export type MetaData = { - pack:{ - version:string, - name:string - }, - cli:{ - cwd:string, - dirname:string - }, - option:minimist.ParsedArgs -} + pack: { + version: string; + name: string; + }; + cli: { + cwd: string; + dirname: string; + }; + option: minimist.ParsedArgs; +}; export type CmdMetaData = Data; -export type CmdHandler = CommandHandler; \ No newline at end of file +export type CmdHandler = CommandHandler; diff --git a/src/config/tyoi.config.ts b/src/config/tyoi.config.ts index 9ef2f9a..2ff3e1f 100644 --- a/src/config/tyoi.config.ts +++ b/src/config/tyoi.config.ts @@ -2,13 +2,13 @@ import { defineConfig } from "../app/config-server.js"; export default defineConfig({ port: 3000, - autoPort:true, + autoPort: true, - publicDirname:"../public/main", + publicDirname: "../public/main", apiPrefix: "/api", exposeLan: false, showQrCode: false, openBrowser: true, -}); \ No newline at end of file +}); diff --git a/src/config/tyoi.default.config.ts b/src/config/tyoi.default.config.ts index 6e371d7..1de65e1 100644 --- a/src/config/tyoi.default.config.ts +++ b/src/config/tyoi.default.config.ts @@ -2,12 +2,12 @@ import { defineDefaultConfig } from "../app/config-server.js"; export default defineDefaultConfig({ port: 3000, - autoPort:false, + autoPort: false, - publicDirname:"../public/main", + publicDirname: "../public/main", apiPrefix: "/api", - middlewares:[], + middlewares: [], exposeLan: false, showQrCode: false, @@ -15,4 +15,4 @@ export default defineDefaultConfig({ openBrowser: false, signalShutdownHandling: true, -}); \ No newline at end of file +}); diff --git a/src/config/tyoi.dev.config.ts b/src/config/tyoi.dev.config.ts index 9acb460..42590fd 100644 --- a/src/config/tyoi.dev.config.ts +++ b/src/config/tyoi.dev.config.ts @@ -4,17 +4,15 @@ import morgan from "morgan"; export default defineConfig({ port: 3000, - autoPort:true, + autoPort: true, - publicDirname:"../public/main", - apiPrefix:"/api", + publicDirname: "../public/main", + apiPrefix: "/api", - middlewares:[ - morgan("dev") - ], + middlewares: [morgan("dev")], exposeLan: true, showQrCode: true, openBrowser: false, -}); \ No newline at end of file +}); diff --git a/src/main.ts b/src/main.ts index 9021b9e..58bbad0 100644 --- a/src/main.ts +++ b/src/main.ts @@ -2,7 +2,7 @@ import { tyoiCli } from "./cli/main.js"; -async function boot(){ +async function boot() { await tyoiCli(); } -await boot(); \ No newline at end of file +await boot(); diff --git a/src/service/ask-input.ts b/src/service/ask-input.ts index 829bdd0..5d47b8c 100644 --- a/src/service/ask-input.ts +++ b/src/service/ask-input.ts @@ -1,24 +1,22 @@ -import readline from 'node:readline/promises'; +import readline from "node:readline/promises"; import rend from "readline"; -import { stdin as input, stdout as output } from 'node:process'; - -export async function askInput( - message:string -):Promise{ +import { stdin as input, stdout as output } from "node:process"; +export async function askInput(message: string): Promise { const rl = readline.createInterface({ input, output }); - let answer; + try { - answer = await rl.question(message); + const answer = await rl.question(message); - rend.moveCursor(process.stdout, 0,-1); - rend.clearLine(process.stdout,0); + rend.moveCursor(process.stdout, 0, -1); + rend.clearLine(process.stdout, 0); + if (answer.length === 0) { + return null; + } + + return answer; } finally { rl.close(); - - return (!answer || answer.length === 0)? - null: - answer } } diff --git a/src/service/ask-select.ts b/src/service/ask-select.ts index de34481..7d7bc20 100644 --- a/src/service/ask-select.ts +++ b/src/service/ask-select.ts @@ -1,18 +1,18 @@ import readline from "readline"; type SelectArgs = { - message:string; - selects:string[]; -} - -class FirstRender{ - private args:SelectArgs; - private index:number - constructor(args:SelectArgs,index:number){ + message: string; + selects: string[]; +}; + +class FirstRender { + private args: SelectArgs; + private index: number; + constructor(args: SelectArgs, index: number) { this.args = args; this.index = index; } - render(){ + render() { process.stdout.write(`${this.args.message}\n`); this.args.selects.forEach((choice, i) => { @@ -20,14 +20,14 @@ class FirstRender{ process.stdout.write(`${cursor} ${choice}\n`); }); } - clear(){ + clear() { const len = this.args.selects.length + 1; readline.moveCursor(process.stdout, 0, -len); readline.clearScreenDown(process.stdout); } } -function reRowRender(len:number,index:number,setText:string){ +function reRowRender(len: number, index: number, setText: string) { // index の行へ移動 readline.moveCursor(process.stdout, 0, -(len - index)); readline.clearLine(process.stdout, 0); @@ -37,29 +37,26 @@ function reRowRender(len:number,index:number,setText:string){ readline.moveCursor(process.stdout, 0, len - index - 1); } -function selectRender(args:SelectArgs,index:number,oldIndex:number) { +function selectRender(args: SelectArgs, index: number, oldIndex: number) { // カーソルは一番した前提。 const len = args.selects.length; - reRowRender(len,oldIndex,` ${args.selects[oldIndex]}`); - reRowRender(len,index,`❯ ${args.selects[index]}`); + reRowRender(len, oldIndex, ` ${args.selects[oldIndex]}`); + reRowRender(len, index, `❯ ${args.selects[index]}`); } - -export async function askSelect(args:SelectArgs):Promise { - +export async function askSelect(args: SelectArgs): Promise { return new Promise((resolve) => { - let index = 0; let oldIndex = 0; const choices = args.selects; - const firstRender = new FirstRender(args,index); + const firstRender = new FirstRender(args, index); const render = () => { - selectRender(args,index,oldIndex); - } + selectRender(args, index, oldIndex); + }; const cleanup = () => { if (process.stdin.isTTY) { process.stdin.setRawMode(false); @@ -68,7 +65,7 @@ export async function askSelect(args:SelectArgs):Promise { process.stdin.off("data", keySelect); process.stdin.pause(); }; - const keySelect = (key:string ) => { + const keySelect = (key: string) => { switch (key) { case "\u001b[A": { const nextIndex = Math.max(0, index - 1); @@ -96,17 +93,16 @@ export async function askSelect(args:SelectArgs):Promise { cleanup(); resolve(-1); break; - } } - if (process.stdin.isTTY){ + }; + if (process.stdin.isTTY) { process.stdin.setRawMode(true); process.stdin.resume(); process.stdin.setEncoding("utf8"); firstRender.render(); - process.stdin.on("data",keySelect); - }else{ - resolve(-1) - - }; - }) -} \ No newline at end of file + process.stdin.on("data", keySelect); + } else { + resolve(-1); + } + }); +} diff --git a/src/service/config-manager.ts b/src/service/config-manager.ts index dfee257..634cfb0 100644 --- a/src/service/config-manager.ts +++ b/src/service/config-manager.ts @@ -1,23 +1,20 @@ -import { ConfigController } from "../util/config-controller.js" -import { type ServerDefaultConfig ,serverDefaultConfigSchema } from "../types/config.type.js" -import TYOI_DEFAULT_CONFIG from "../config/tyoi.default.config.js" +import { ConfigController } from "../util/config-controller.js"; +import { type ServerDefaultConfig, serverDefaultConfigSchema } from "../types/config.type.js"; +import TYOI_DEFAULT_CONFIG from "../config/tyoi.default.config.js"; type ConfigControllerType = ConfigController; -export class configManager{ +export class configManager { private configController = new ConfigController( TYOI_DEFAULT_CONFIG, serverDefaultConfigSchema ); updateConfig( - ...config:Parameters - ):ReturnType - { + ...config: Parameters + ): ReturnType { return this.configController.updateConfig(...config); } - getConfig( - key: K - ): ServerDefaultConfig[K] { + getConfig(key: K): ServerDefaultConfig[K] { return this.configController.getConfig(key); } -} \ No newline at end of file +} diff --git a/src/service/find-available-port.ts b/src/service/find-available-port.ts index 1dba173..e24789e 100644 --- a/src/service/find-available-port.ts +++ b/src/service/find-available-port.ts @@ -1,62 +1,62 @@ import { isUserRequest } from "../util/is-user-request.js"; import { isPortInUse } from "../util/is-portIn-use.js"; import { type ServicesRegister } from "../util/services-register.js"; -import { type ServerServicesRegister } from "../app/server.js" - +import { type ServerServicesRegister } from "../app/server.js"; type FindPortData = { startPort: number; - host:string; - isAutoPort:boolean; - servicesRegister:ServicesRegister; -} -export async function findAvailablePort(findPortData:FindPortData) { - - const { - startPort, - host, - isAutoPort, - servicesRegister - } = findPortData; + host: string; + isAutoPort: boolean; + servicesRegister: ServicesRegister; +}; +export async function findAvailablePort(findPortData: FindPortData) { + const { startPort, host, isAutoPort, servicesRegister } = findPortData; const serverLogger = servicesRegister.get("serverLogger"); let port = startPort; - while (await isPortInUse(port,host)) { - - if(isAutoPort){ - port++ + while (await isPortInUse(port, host)) { + if (isAutoPort) { + port++; continue; } serverLogger.logger("bar"); - serverLogger.logger("warn", + serverLogger.logger( + "warn", servicesRegister - .get("systemMetaManager") - .getMeta(108).message.replace("__PORT__",(port).toString()) + .get("systemMetaManager") + .getMeta(108) + .message.replace("__PORT__", port.toString()) ); const isAllow = await isUserRequest( - serverLogger.logger("createSystem", + serverLogger.logger( + "createSystem", servicesRegister - .get("systemMetaManager") - .getMeta(109).message.replace("__PORT__",(port + 1).toString()) - ).createMessage); + .get("systemMetaManager") + .getMeta(109) + .message.replace("__PORT__", (port + 1).toString()) + ).createMessage + ); - if(!isAllow){ + if (!isAllow) { throw new Error( servicesRegister - .get("systemMetaManager") - .getMeta(110).message.replace("__PORT__",(port).toString()) + .get("systemMetaManager") + .getMeta(110) + .message.replace("__PORT__", port.toString()) ); } - port++ - serverLogger.logger("info", + port++; + serverLogger.logger( + "info", servicesRegister - .get("systemMetaManager") - .getMeta(111).message.replace("__PORT__",(port).toString()) + .get("systemMetaManager") + .getMeta(111) + .message.replace("__PORT__", port.toString()) ); } diff --git a/src/service/http-meta/data/error-code-1xx.ts b/src/service/http-meta/data/error-code-1xx.ts index eb37e6d..29676b2 100644 --- a/src/service/http-meta/data/error-code-1xx.ts +++ b/src/service/http-meta/data/error-code-1xx.ts @@ -2,25 +2,27 @@ export const ERROR_CODE_1XX = [ { code: 100, message: "Continue", - description: "The server has received the request headers, and the client should proceed to send the request body.", - label:"http" + description: + "The server has received the request headers, and the client should proceed to send the request body.", + label: "http", }, { code: 101, message: "Switching Protocols", description: "The requester has asked the server to switch protocols.", - label:"http" + label: "http", }, { - code:102, + code: 102, message: "Processing", - description: "This code indicates that the server has received and is processing the request, but no response is available yet. This prevents the client from timing out and assuming the request was lost.", - label:"http" + description: + "This code indicates that the server has received and is processing the request, but no response is available yet. This prevents the client from timing out and assuming the request was lost.", + label: "http", }, { - code:103, + code: 103, message: "Early Hints", description: "Used to return some response headers before final HTTP message.", - label:"http" - } -] as const; \ No newline at end of file + label: "http", + }, +] as const; diff --git a/src/service/http-meta/data/error-code-2xx.ts b/src/service/http-meta/data/error-code-2xx.ts index 5b1bd6a..75f4461 100644 --- a/src/service/http-meta/data/error-code-2xx.ts +++ b/src/service/http-meta/data/error-code-2xx.ts @@ -1,72 +1,78 @@ export const ERROR_CODE_2XX = [ { - code:200, - message:"OK", - description: "The request is OK (this is the standard response for successful HTTP requests).", - label:"http" - + code: 200, + message: "OK", + description: + "The request is OK (this is the standard response for successful HTTP requests).", + label: "http", }, { - code:201, - message:"Created", + code: 201, + message: "Created", description: "The request has been fulfilled, and a new resource is created.", - label:"http" - + label: "http", }, { - code:202, - message:"Accepted", - description: "The request has been accepted for processing, but the processing has not been completed. The request might or might not eventually be acted upon, and may be disallowed when processing occurs.", - label:"http" + code: 202, + message: "Accepted", + description: + "The request has been accepted for processing, but the processing has not been completed. The request might or might not eventually be acted upon, and may be disallowed when processing occurs.", + label: "http", }, { code: 203, message: "Non-Authoritative Information", - description: "The request has been successfully processed, but is returning information that may be from another source.", - label:"http" - + description: + "The request has been successfully processed, but is returning information that may be from another source.", + label: "http", }, { code: 204, message: "No Content", - description: "The request has been successfully processed, but is not returning any content.", - label:"http" - + description: + "The request has been successfully processed, but is not returning any content.", + label: "http", }, { code: 205, message: "Reset Content", - description: "The request has been successfully processed, but is not returning any content, and requires that the requester reset the document view.", - label:"http" + description: + "The request has been successfully processed, but is not returning any content, and requires that the requester reset the document view.", + label: "http", }, { code: 206, message: "Partial Content", - description: "The server is delivering only part of the resource due to a range header sent by the client.", - label:"http" + description: + "The server is delivering only part of the resource due to a range header sent by the client.", + label: "http", }, { code: 207, message: "Multi-Status", - description: "The message body that follows is by default an XML message and can contain a number of separate response codes, depending on how many sub-requests were made.", - label:"http" + description: + "The message body that follows is by default an XML message and can contain a number of separate response codes, depending on how many sub-requests were made.", + label: "http", }, { code: 208, message: "Already Reported", - description: "The members of a DAV binding have already been enumerated in a preceding part of the (multistatus) response, and are not being included again.", - label:"http" + description: + "The members of a DAV binding have already been enumerated in a preceding part of the (multistatus) response, and are not being included again.", + label: "http", }, { code: 218, message: "This is fine (Apache Web Server)", - description: "Used as a catch-all error condition for allowing response bodies to flow through Apache when ProxyErrorOverride is enabled.", - label:"http" + description: + "Used as a catch-all error condition for allowing response bodies to flow through Apache when ProxyErrorOverride is enabled.", + label: "http", }, { code: 226, message: "IM Used", - description: "The server has fulfilled a request for the resource, and the response is a representation of the result of one or more instance-manipulations applied to the current instance.", - label:"http" + description: + "The server has fulfilled a request for the resource, and the response is a representation of the result of one or more instance-manipulations applied to the current instance.", + label: "http", }, -] as const; \ No newline at end of file +] as const; diff --git a/src/service/http-meta/data/error-code-3xx.ts b/src/service/http-meta/data/error-code-3xx.ts index df74f6f..6de4e34 100644 --- a/src/service/http-meta/data/error-code-3xx.ts +++ b/src/service/http-meta/data/error-code-3xx.ts @@ -2,50 +2,52 @@ export const ERROR_CODE_3XX = [ { code: 300, message: "Multiple Choices", - description: "A link list. The user can select a link and go to that location. Maximum five addresses.", - label:"http" + description: + "A link list. The user can select a link and go to that location. Maximum five addresses.", + label: "http", }, { code: 301, message: "Moved Permanently", description: "The requested page has moved to a new URL.", - label:"http" + label: "http", }, { code: 302, message: "Found", description: "The requested page has moved temporarily to a new URL.", - label:"http" + label: "http", }, { code: 303, message: "See Other", description: "The requested page can be found under a different URL.", - label:"http" + label: "http", }, { code: 304, message: "Not Modified", description: "Indicates the requested page has not been modified since last requested.", - label:"http" + label: "http", }, { code: 306, message: "Switch Proxy", - description: "No longer used. Originally meant \"Subsequent requests should use the specified proxy.\"", - label:"http" + description: + 'No longer used. Originally meant "Subsequent requests should use the specified proxy."', + label: "http", }, { code: 307, message: "Temporary Redirect", description: "The requested page has moved temporarily to a new URL.", - label:"http" - + label: "http", }, { code: 308, message: "Resume Incomplete", - description: "Used in the resumable requests proposal to resume aborted PUT or POST requests.", - label:"http" + description: + "Used in the resumable requests proposal to resume aborted PUT or POST requests.", + label: "http", }, ] as const; diff --git a/src/service/http-meta/data/error-code-4xx.ts b/src/service/http-meta/data/error-code-4xx.ts index 45281da..622ac47 100644 --- a/src/service/http-meta/data/error-code-4xx.ts +++ b/src/service/http-meta/data/error-code-4xx.ts @@ -1,243 +1,267 @@ export const ERROR_CODE_4XX = [ - { code: 400, message: "Bad Request", description: "The request cannot be fulfilled due to bad syntax.", - label:"http" + label: "http", }, { code: 401, message: "Unauthorized", - description: "The request was a legal request, but the server is refusing to respond to it. For use when authentication is possible but has failed or not yet been provided.", - label:"http" + description: + "The request was a legal request, but the server is refusing to respond to it. For use when authentication is possible but has failed or not yet been provided.", + label: "http", }, { code: 402, message: "Payment Required", description: "Not yet implemented by RFC standards, but reserved for future use.", - label:"http" + label: "http", }, { code: 403, message: "Forbidden", - description: "The request was a legal request, but the server is refusing to respond to it.", - label:"http" + description: + "The request was a legal request, but the server is refusing to respond to it.", + label: "http", }, { code: 404, message: "Not Found", - description: "The requested page could not be found but may be available again in the future.", - label:"http" + description: + "The requested page could not be found but may be available again in the future.", + label: "http", }, { code: 405, message: "Method Not Allowed", - description: "A request was made of a page using a request method not supported by that page.", - label:"http" + description: + "A request was made of a page using a request method not supported by that page.", + label: "http", }, { code: 406, message: "Not Acceptable", description: "The server can only generate a response that is not accepted by the client.", - label:"http" + label: "http", }, { code: 407, message: "Proxy Authentication Required", description: "The client must first authenticate itself with the proxy.", - label:"http" + label: "http", }, { code: 408, message: "Request Timeout", description: "The server timed out waiting for the request.", - label:"http" + label: "http", }, { code: 409, message: "Conflict", description: "The request could not be completed because of a conflict in the request.", - label:"http" + label: "http", }, { code: 410, message: "Gone", description: "The requested page is no longer available.", - label:"http" + label: "http", }, { code: 411, message: "Length Required", - description: "The \"Content-Length\" is not defined. The server will not accept the request without it.", - label:"http" + description: + 'The "Content-Length" is not defined. The server will not accept the request without it.', + label: "http", }, { code: 412, message: "Precondition Failed", description: "The precondition given in the request evaluated to false by the server.", - label:"http" + label: "http", }, { code: 413, message: "Request Entity Too Large", - description: "The server will not accept the request, because the request entity is too large.", - label:"http" + description: + "The server will not accept the request, because the request entity is too large.", + label: "http", }, { code: 414, message: "Request-URI Too Long", - description: "The server will not accept the request, because the URL is too long. Occurs when you convert a POST request to a GET request with a long query information.", - label:"http" + description: + "The server will not accept the request, because the URL is too long. Occurs when you convert a POST request to a GET request with a long query information.", + label: "http", }, { code: 415, message: "Unsupported Media Type", - description: "The server will not accept the request, because the media type is not supported.", - label:"http" + description: + "The server will not accept the request, because the media type is not supported.", + label: "http", }, { code: 416, message: "Requested Range Not Satisfiable", - description: "The client has asked for a portion of the file, but the server cannot supply that portion.", - label:"http" + description: + "The client has asked for a portion of the file, but the server cannot supply that portion.", + label: "http", }, { code: 417, message: "Expectation Failed", description: "The server cannot meet the requirements of the Expect request-header field.", - label:"http" + label: "http", }, { code: 418, message: "I'm a teapot", - description: "Any attempt to brew coffee with a teapot should result in the error code \"418 I'm a teapot\". The resulting entity body MAY be short and stout.", - label:"http" + description: + 'Any attempt to brew coffee with a teapot should result in the error code "418 I\'m a teapot". The resulting entity body MAY be short and stout.', + label: "http", }, { code: 419, message: "Page Expired (Laravel Framework)", description: "Used by the Laravel Framework when a CSRF Token is missing or expired.", - label:"http" + label: "http", }, { code: 420, message: "Method Failure (Spring Framework)", description: "A deprecated response used by the Spring Framework when a method has failed.", - label:"http" + label: "http", }, { code: 421, message: "Misdirected Request", - description: "The request was directed at a server that is not able to produce a response (for example because a connection reuse).", - label:"http" + description: + "The request was directed at a server that is not able to produce a response (for example because a connection reuse).", + label: "http", }, { code: 422, message: "Unprocessable Entity", - description: "The request was well-formed but was unable to be followed due to semantic errors.", - label:"http" + description: + "The request was well-formed but was unable to be followed due to semantic errors.", + label: "http", }, { code: 423, message: "Locked", description: "The resource that is being accessed is locked.", - label:"http" + label: "http", }, { code: 424, message: "Failed Dependency", description: "The request failed due to failure of a previous request (e.g., a PROPPATCH).", - label:"http" + label: "http", }, { code: 426, message: "Upgrade Required", - description: "The client should switch to a different protocol such as TLS\/1.0, given in the Upgrade header field.", - label:"http" + description: + "The client should switch to a different protocol such as TLS 1.0, given in the Upgrade header field.", + label: "http", }, { code: 428, message: "Precondition Required", description: "The origin server requires the request to be conditional.", - label:"http" + label: "http", }, { code: 429, message: "Too Many Requests", - description: "The user has sent too many requests in a given amount of time. Intended for use with rate limiting schemes.", - label:"http" + description: + "The user has sent too many requests in a given amount of time. Intended for use with rate limiting schemes.", + label: "http", }, { code: 431, message: "Request Header Fields Too Large", - description: "The server is unwilling to process the request because either an individual header field, or all the header fields collectively, are too large.", - label:"http" + description: + "The server is unwilling to process the request because either an individual header field, or all the header fields collectively, are too large.", + label: "http", }, { code: 440, message: "Login Time-out", description: "The client's session has expired and must log in again. (IIS)", - label:"http" + label: "http", }, { code: 444, message: "Connection Closed Without Response", - description: "A non-standard status code used to instruct nginx to close the connection without sending a response to the client, most commonly used to deny malicious or malformed requests.", - label:"http" + description: + "A non-standard status code used to instruct nginx to close the connection without sending a response to the client, most commonly used to deny malicious or malformed requests.", + label: "http", }, { code: 449, message: "Retry With", - description: "The server cannot honour the request because the user has not provided the required information. (IIS)", - label:"http" + description: + "The server cannot honour the request because the user has not provided the required information. (IIS)", + label: "http", }, { code: 450, message: "Blocked by Windows Parental Controls", - description: "The Microsoft extension code indicated when Windows Parental Controls are turned on and are blocking access to the requested webpage.", - label:"http" + description: + "The Microsoft extension code indicated when Windows Parental Controls are turned on and are blocking access to the requested webpage.", + label: "http", }, { code: 451, message: "Unavailable For Legal Reasons", - description: "A server operator has received a legal demand to deny access to a resource or to a set of resources that includes the requested resource.", - label:"http" + description: + "A server operator has received a legal demand to deny access to a resource or to a set of resources that includes the requested resource.", + label: "http", }, { code: 494, message: "Request Header Too Large", - description: "Used by nginx to indicate the client sent too large of a request or header line that is too long.", - label:"http" + description: + "Used by nginx to indicate the client sent too large of a request or header line that is too long.", + label: "http", }, { code: 495, message: "SSL Certificate Error", - description: "An expansion of the 400 Bad Request response code, used when the client has provided an invalid client certificate.", - label:"http" + description: + "An expansion of the 400 Bad Request response code, used when the client has provided an invalid client certificate.", + label: "http", }, { code: 496, message: "SSL Certificate Required", - description: "An expansion of the 400 Bad Request response code, used when a client certificate is required but not provided.", - label:"http" + description: + "An expansion of the 400 Bad Request response code, used when a client certificate is required but not provided.", + label: "http", }, { code: 497, message: "HTTP Request Sent to HTTPS Port", - description: "An expansion of the 400 Bad Request response code, used when the client has made a HTTP request to a port listening for HTTPS requests.", - label:"http" + description: + "An expansion of the 400 Bad Request response code, used when the client has made a HTTP request to a port listening for HTTPS requests.", + label: "http", }, { code: 498, message: "Invalid Token (Esri)", - description: "Returned by ArcGIS for Server. Code 498 indicates an expired or otherwise invalid token.", - label:"http" + description: + "Returned by ArcGIS for Server. Code 498 indicates an expired or otherwise invalid token.", + label: "http", }, { code: 499, message: "Client Closed Request", - description: "A non-standard status code introduced by nginx for the case when a client closes the connection while nginx is processing the request.", - label:"http" + description: + "A non-standard status code introduced by nginx for the case when a client closes the connection while nginx is processing the request.", + label: "http", }, ] as const; diff --git a/src/service/http-meta/data/error-code-5xx.ts b/src/service/http-meta/data/error-code-5xx.ts index e9b6a6f..cfa0884 100644 --- a/src/service/http-meta/data/error-code-5xx.ts +++ b/src/service/http-meta/data/error-code-5xx.ts @@ -1,135 +1,149 @@ export const ERROR_CODE_5XX = [ - { code: 500, message: "Internal Server Error", - description: "An error has occurred in a server side script, a no more specific message is suitable.", - label:"http" + description: + "An error has occurred in a server side script, a no more specific message is suitable.", + label: "http", }, { code: 501, message: "Not Implemented", - description: "The server either does not recognize the request method, or it lacks the ability to fulfill the request.", - label:"http" + description: + "The server either does not recognize the request method, or it lacks the ability to fulfill the request.", + label: "http", }, { code: 502, message: "Bad Gateway", - description: "The server was acting as a gateway or proxy and received an invalid response from the upstream server.", - label:"http" + description: + "The server was acting as a gateway or proxy and received an invalid response from the upstream server.", + label: "http", }, { code: 503, message: "Service Unavailable", description: "The server is currently unavailable (overloaded or down).", - label:"http" + label: "http", }, { code: 504, message: "Gateway Timeout", - description: "The server was acting as a gateway or proxy and did not receive a timely response from the upstream server.", - label:"http" + description: + "The server was acting as a gateway or proxy and did not receive a timely response from the upstream server.", + label: "http", }, { code: 505, message: "HTTP Version Not Supported", description: "The server does not support the HTTP protocol version used in the request.", - label:"http" + label: "http", }, { code: 506, message: "Variant Also Negotiates", - description: "Transparent content negotiation for the request results in a circular reference.", - label:"http" + description: + "Transparent content negotiation for the request results in a circular reference.", + label: "http", }, { code: 507, message: "Insufficient Storage", - description: "The server is unable to store the representation needed to complete the request.", - label:"http" + description: + "The server is unable to store the representation needed to complete the request.", + label: "http", }, { code: 508, message: "Loop Detected", - description: "The server detected an infinite loop while processing the request (sent instead of 208 Already Reported).", - label:"http" + description: + "The server detected an infinite loop while processing the request (sent instead of 208 Already Reported).", + label: "http", }, { code: 509, message: "Bandwidth Limit Exceeded", - description: "The server has exceeded the bandwidth specified by the server administrator; this is often used by shared hosting providers to limit the bandwidth of customers.", - label:"http" + description: + "The server has exceeded the bandwidth specified by the server administrator; this is often used by shared hosting providers to limit the bandwidth of customers.", + label: "http", }, { code: 510, message: "Not Extended", description: "Further extensions to the request are required for the server to fulfil it.", - label:"http" + label: "http", }, { code: 511, message: "Network Authentication Required", description: "The client needs to authenticate to gain network access.", - label:"http" + label: "http", }, { code: 520, message: "Unknown Error", - description: "The 520 error is used as a \"catch-all response for when the origin server returns something unexpected\", listing connection resets, large headers, and empty or invalid responses as common triggers.", - label:"http" + description: + 'The 520 error is used as a "catch-all response for when the origin server returns something unexpected", listing connection resets, large headers, and empty or invalid responses as common triggers.', + label: "http", }, { code: 521, message: "Web Server Is Down", description: "The origin server has refused the connection from Cloudflare.", - label:"http" + label: "http", }, { code: 522, message: "Connection Timed Out", description: "Cloudflare could not negotiate a TCP handshake with the origin server.", - label:"http" + label: "http", }, { code: 523, - message : "Origin Is Unreachable", - description: "Cloudflare could not reach the origin server; for example, if the DNS records for the origin server are incorrect.", - label:"http" + message: "Origin Is Unreachable", + description: + "Cloudflare could not reach the origin server; for example, if the DNS records for the origin server are incorrect.", + label: "http", }, { code: 524, message: "A Timeout Occurred", - description: "Cloudflare was able to complete a TCP connection to the origin server, but did not receive a timely HTTP response.", - label:"http" + description: + "Cloudflare was able to complete a TCP connection to the origin server, but did not receive a timely HTTP response.", + label: "http", }, { code: 525, message: "SSL Handshake Failed", description: "Cloudflare could not negotiate a SSL/TLS handshake with the origin server.", - label:"http" + label: "http", }, { code: 526, message: "Invalid SSL Certificate", - description: "Used by Cloudflare and Cloud Foundry's gorouter to indicate failure to validate the SSL/TLS certificate that the origin server presented.", - label:"http" + description: + "Used by Cloudflare and Cloud Foundry's gorouter to indicate failure to validate the SSL/TLS certificate that the origin server presented.", + label: "http", }, { code: 527, message: "Railgun Listener to Origin Error", - description: "Error 527 indicates that the request timed out or failed after the WAN connection had been established.", - label:"http" + description: + "Error 527 indicates that the request timed out or failed after the WAN connection had been established.", + label: "http", }, { code: 530, message: "Origin DNS Error", - description: "Error 530 indicates that the requested host name could not be resolved on the Cloudflare network to an origin server.", - label:"http" + description: + "Error 530 indicates that the requested host name could not be resolved on the Cloudflare network to an origin server.", + label: "http", }, { code: 598, message: "Network Read Timeout Error", - description: "Used by some HTTP proxies to signal a network read timeout behind the proxy to a client in front of the proxy.", - label:"http" - } + description: + "Used by some HTTP proxies to signal a network read timeout behind the proxy to a client in front of the proxy.", + label: "http", + }, ] as const; diff --git a/src/service/http-meta/data/error-code-index.ts b/src/service/http-meta/data/error-code-index.ts index c2dfc3b..6d6d62f 100644 --- a/src/service/http-meta/data/error-code-index.ts +++ b/src/service/http-meta/data/error-code-index.ts @@ -1,8 +1,8 @@ -import {ERROR_CODE_1XX} from "./error-code-1xx.js"; -import {ERROR_CODE_2XX} from "./error-code-2xx.js"; -import {ERROR_CODE_3XX} from "./error-code-3xx.js"; -import {ERROR_CODE_4XX} from "./error-code-4xx.js"; -import {ERROR_CODE_5XX} from "./error-code-5xx.js"; +import { ERROR_CODE_1XX } from "./error-code-1xx.js"; +import { ERROR_CODE_2XX } from "./error-code-2xx.js"; +import { ERROR_CODE_3XX } from "./error-code-3xx.js"; +import { ERROR_CODE_4XX } from "./error-code-4xx.js"; +import { ERROR_CODE_5XX } from "./error-code-5xx.js"; export const HTTP_ERROR_CODE = [ ...ERROR_CODE_1XX, diff --git a/src/service/http-meta/http-meta-manager.ts b/src/service/http-meta/http-meta-manager.ts index 03844b2..64c1e6e 100644 --- a/src/service/http-meta/http-meta-manager.ts +++ b/src/service/http-meta/http-meta-manager.ts @@ -1,13 +1,10 @@ import { CodeToMetaManager } from "../../util/code-to-error-message.js"; import { HTTP_ERROR_CODE } from "./data/error-code-index.js"; - - -export class HttpMetaManager{ - private DATA_MANAGER:CodeToMetaManager = new CodeToMetaManager(HTTP_ERROR_CODE); - getMeta( - code:Parameters["getMeta"]>[1] - ){ - return this.DATA_MANAGER.getMeta("http",code); +export class HttpMetaManager { + private DATA_MANAGER: CodeToMetaManager<(typeof HTTP_ERROR_CODE)[number]> = + new CodeToMetaManager<(typeof HTTP_ERROR_CODE)[number]>(HTTP_ERROR_CODE); + getMeta(code: Parameters["getMeta"]>[1]) { + return this.DATA_MANAGER.getMeta("http", code); } -} \ No newline at end of file +} diff --git a/src/service/open-browser.ts b/src/service/open-browser.ts index a1c83a8..c8275de 100644 --- a/src/service/open-browser.ts +++ b/src/service/open-browser.ts @@ -1,23 +1,18 @@ import open from "open"; import { getLanIp } from "../util/get-lan-ip.js"; -import type { BrowserOpenConfig } from "../types/config.type.js" +import type { BrowserOpenConfig } from "../types/config.type.js"; import { type ServicesRegister } from "../util/services-register.js"; -import { type ServerServicesRegister } from "../app/server.js" +import { type ServerServicesRegister } from "../app/server.js"; type OpenBrowserData = { - host:string; - port:number; - target:BrowserOpenConfig; - servicesRegister:ServicesRegister; -} + host: string; + port: number; + target: BrowserOpenConfig; + servicesRegister: ServicesRegister; +}; -export async function openBrowser(openBrowserData:OpenBrowserData):Promise{ - const { - host, - port, - target, - servicesRegister - } = openBrowserData; +export async function openBrowser(openBrowserData: OpenBrowserData): Promise { + const { host, port, target, servicesRegister } = openBrowserData; const serverLogger = servicesRegister.get("serverLogger"); @@ -25,15 +20,10 @@ export async function openBrowser(openBrowserData:OpenBrowserData):Promise const ip = getLanIp(); const networkUrl = `http://${ip}:${port}`; - if((!isLAN && target === "network")) serverLogger.logger("warn", - servicesRegister - .get("systemMetaManager") - .getMeta(112).message - ); + if (!isLAN && target === "network") + serverLogger.logger("warn", servicesRegister.get("systemMetaManager").getMeta(112).message); - const targetUrl = (isLAN && target === "network") - ? networkUrl - : `http://localhost:${port}`; + const targetUrl = isLAN && target === "network" ? networkUrl : `http://localhost:${port}`; await open(targetUrl); -} \ No newline at end of file +} diff --git a/src/service/path-normalization.ts b/src/service/path-normalization.ts index fdd8af1..9c81bf4 100644 --- a/src/service/path-normalization.ts +++ b/src/service/path-normalization.ts @@ -5,10 +5,9 @@ import path from "node:path"; * @param baseDirname 基準になるディレクトリー * @param publicDirname 公開するディレクトリーのパス */ -export function pathNormalization(baseDirname:string,publicDirname:string):string{ - +export function pathNormalization(baseDirname: string, publicDirname: string): string { // 利用者が危ないパスにしても、このサーバーは開発用なので割り切ります。 const deliveryPath = path.resolve(baseDirname, publicDirname); return deliveryPath; -} \ No newline at end of file +} diff --git a/src/service/register-manager.ts b/src/service/register-manager.ts index 4d91c2d..224b366 100644 --- a/src/service/register-manager.ts +++ b/src/service/register-manager.ts @@ -1,17 +1,14 @@ -import { ConfigController } from "../util/config-controller.js" -import type { ServerRegister } from "../types/register.type.js" +import { ConfigController } from "../util/config-controller.js"; +import type { ServerRegister } from "../types/register.type.js"; type RegisterControllerType = ConfigController; -export class RegisterManager{ +export class RegisterManager { private configController = new ConfigController({}); updateConfig( - ...config:Parameters - ):ReturnType - { + ...config: Parameters + ): ReturnType { return this.configController.updateConfig(...config); } - getConfig( - key: K - ): ServerRegister[K] { + getConfig(key: K): ServerRegister[K] { return this.configController.getConfig(key); } -} \ No newline at end of file +} diff --git a/src/service/scan-config-files.ts b/src/service/scan-config-files.ts index 6fc9469..e2a9d0e 100644 --- a/src/service/scan-config-files.ts +++ b/src/service/scan-config-files.ts @@ -1,5 +1,5 @@ -import path from 'path'; -import { readDirectory } from '../util/read-directory.js'; +import path from "path"; +import { readDirectory } from "../util/read-directory.js"; export async function scanConfigFiles(passedPath: string): Promise { const regex = /^(tyoi)\.([A-Za-z0-9.]+(\.config)|config)\.(ts|js)$/; @@ -9,14 +9,16 @@ export async function scanConfigFiles(passedPath: string): Promise { if (!current.includes("config")) return filteredCurrent.toSorted(); - const configPath = path.join(passedPath, 'config'); - const configFiles = await readDirectory(configPath,true); - const filteredConfigFiles = configFiles.filter((file) => { - const fileName = path.basename(file) - return regex.test(fileName); - }).map(value=>{ - return `config${path.sep}${value}`; - }); + const configPath = path.join(passedPath, "config"); + const configFiles = await readDirectory(configPath, true); + const filteredConfigFiles = configFiles + .filter((file) => { + const fileName = path.basename(file); + return regex.test(fileName); + }) + .map((value) => { + return `config${path.sep}${value}`; + }); return filteredCurrent.concat(filteredConfigFiles).toSorted(); -} \ No newline at end of file +} diff --git a/src/service/server-logger.ts b/src/service/server-logger.ts index d349a77..b866db7 100644 --- a/src/service/server-logger.ts +++ b/src/service/server-logger.ts @@ -1,30 +1,26 @@ import { type InnerEventBusMap } from "../types/inner.event-bus.type.js"; import { type OutEventBusMap } from "../types/out.event-bus.type.js"; -import { type EventBus } from "../util/event-bus.js"; +import { type EventBus } from "../util/event-bus.js"; import { logger } from "../util/logger.js"; - -export class ServerLogger{ - #innerEventBus!:EventBus; - #outEventBus!:EventBus; - constructor( - eventBus:EventBus, - outBus:EventBus - ){ +export class ServerLogger { + #innerEventBus!: EventBus; + #outEventBus!: EventBus; + constructor(eventBus: EventBus, outBus: EventBus) { this.#innerEventBus = eventBus; - this.#outEventBus = outBus; + this.#outEventBus = outBus; } - logger( - type:K, - ...args:Parameters<(typeof logger)[K]> - ):ReturnType<(typeof logger)[K]>{ - const fn = logger[type] as - (...args:Parameters<(typeof logger)[K]>) - => ReturnType<(typeof logger)[K]>; + logger( + type: K, + ...args: Parameters<(typeof logger)[K]> + ): ReturnType<(typeof logger)[K]> { + const fn = logger[type] as ( + ...args: Parameters<(typeof logger)[K]> + ) => ReturnType<(typeof logger)[K]>; - const data = fn.call(logger,...args); - this.#innerEventBus.emit("server/*:log",data); - this.#outEventBus.emit("server/*:log",data); + const data = fn.call(logger, ...args); + this.#innerEventBus.emit("server/*:log", data); + this.#outEventBus.emit("server/*:log", data); return data; } -} \ No newline at end of file +} diff --git a/src/service/server-start-summary.ts b/src/service/server-start-summary.ts index e33d8f4..a36e072 100644 --- a/src/service/server-start-summary.ts +++ b/src/service/server-start-summary.ts @@ -2,30 +2,21 @@ import qrcode from "qrcode-terminal"; import { getLanIp } from "../util/get-lan-ip.js"; import { type ServicesRegister } from "../util/services-register.js"; -import { type ServerServicesRegister } from "../app/server.js" - +import { type ServerServicesRegister } from "../app/server.js"; type SummaryData = { - host:string; - port:number; - publicPath:string; - publicFullPath:string; - apiPrefix:string; - isShowQrCode:boolean; - servicesRegister:ServicesRegister; -} + host: string; + port: number; + publicPath: string; + publicFullPath: string; + apiPrefix: string; + isShowQrCode: boolean; + servicesRegister: ServicesRegister; +}; -export function serverStartSummary(summaryData:SummaryData):void{ - - const { - host, - port, - publicPath, - publicFullPath, - apiPrefix, - isShowQrCode, - servicesRegister - } = summaryData; +export function serverStartSummary(summaryData: SummaryData): void { + const { host, port, publicPath, publicFullPath, apiPrefix, isShowQrCode, servicesRegister } = + summaryData; const serverLogger = servicesRegister.get("serverLogger"); const systemMetaManager = servicesRegister.get("systemMetaManager"); @@ -35,33 +26,53 @@ export function serverStartSummary(summaryData:SummaryData):void{ const ip = getLanIp(); const networkUrl = `http://${ip}:${port}`; - // ログ系 - serverLogger.logger("window",{ - title:systemMetaManager.getMeta(121).message, - content:[ - serverLogger.logger("createSuccess",systemMetaManager.getMeta(113).message), - serverLogger.logger("createInfo",`${systemMetaManager.getMeta(114).message}${port}`), - serverLogger.logger("createInfo",`${systemMetaManager.getMeta(115).message}${port}`), - ...(isLAN ? [serverLogger.logger("createInfo",`${systemMetaManager.getMeta(116).message}${networkUrl}`)] : []), - serverLogger.logger("createInfo",`${systemMetaManager.getMeta(117).message}${publicFullPath}`), - serverLogger.logger("createInfo",`${systemMetaManager.getMeta(118).message}${publicPath}`), - serverLogger.logger("createInfo",`${systemMetaManager.getMeta(119).message}${apiPrefix}`), - ] - }) + serverLogger.logger("window", { + title: systemMetaManager.getMeta(121).message, + content: [ + serverLogger.logger("createSuccess", systemMetaManager.getMeta(113).message), + serverLogger.logger("createInfo", `${systemMetaManager.getMeta(114).message}${port}`), + serverLogger.logger("createInfo", `${systemMetaManager.getMeta(115).message}${port}`), + ...(isLAN + ? [ + serverLogger.logger( + "createInfo", + `${systemMetaManager.getMeta(116).message}${networkUrl}` + ), + ] + : []), + serverLogger.logger( + "createInfo", + `${systemMetaManager.getMeta(117).message}${publicFullPath}` + ), + serverLogger.logger( + "createInfo", + `${systemMetaManager.getMeta(118).message}${publicPath}` + ), + serverLogger.logger( + "createInfo", + `${systemMetaManager.getMeta(119).message}${apiPrefix}` + ), + ], + }); // QRcode生成 - if(isShowQrCode && isLAN){ - serverLogger.logger("window",{ - title:systemMetaManager.getMeta(122).message, - content:[ - serverLogger.logger("createInfo",systemMetaManager.getMeta(120).message), - serverLogger.logger("createInfo",(() => { - let qrString = ""; - qrcode.generate(networkUrl, {small: true},(qr)=>{qrString = qr}); - return qrString; - })()) - ] + if (isShowQrCode && isLAN) { + serverLogger.logger("window", { + title: systemMetaManager.getMeta(122).message, + content: [ + serverLogger.logger("createInfo", systemMetaManager.getMeta(120).message), + serverLogger.logger( + "createInfo", + (() => { + let qrString = ""; + qrcode.generate(networkUrl, { small: true }, (qr) => { + qrString = qr; + }); + return qrString; + })() + ), + ], }); } } diff --git a/src/service/system-meta/data/code-1xx.ts b/src/service/system-meta/data/code-1xx.ts index e1969db..31bb4c7 100644 --- a/src/service/system-meta/data/code-1xx.ts +++ b/src/service/system-meta/data/code-1xx.ts @@ -2,116 +2,116 @@ export const CODE_1XX = [ { code: 100, message: "サーバーをシャットダウン中...", - label:"system" + label: "system", }, { code: 101, - message:"サーバーをシャットダウンしました。", - label:"system" + message: "サーバーをシャットダウンしました。", + label: "system", }, { code: 102, - message:"すでにサーバーは起動しています。", - label:"system" + message: "すでにサーバーは起動しています。", + label: "system", }, { code: 103, - message:"サーバー起動中にエラーが発生しました。", - label:"system" + message: "サーバー起動中にエラーが発生しました。", + label: "system", }, { code: 104, - message:"終了処理を開始しました...", - label:"system" + message: "終了処理を開始しました...", + label: "system", }, { code: 105, - message:"タイムアウトしました。強制的にサーバーをシャットダウンします。", - label:"system" + message: "タイムアウトしました。強制的にサーバーをシャットダウンします。", + label: "system", }, { code: 106, - message:"サーバー終了中にエラーが発生しました", - label:"system" + message: "サーバー終了中にエラーが発生しました", + label: "system", }, { code: 107, - message:"サーバー終了しました。", - label:"system" + message: "サーバー終了しました。", + label: "system", }, { code: 108, - message:"ポート[__PORT__]は使用できませんでした。", - label:"system" + message: "ポート[__PORT__]は使用できませんでした。", + label: "system", }, { code: 109, - message:"代わりにポート[__PORT__]を使用してもいいですか?", - label:"system" + message: "代わりにポート[__PORT__]を使用してもいいですか?", + label: "system", }, { code: 110, - message:"ポート[__PORT__]は使用中です。起動を中止しました。", - label:"system" + message: "ポート[__PORT__]は使用中です。起動を中止しました。", + label: "system", }, { code: 111, - message:"ポート[__PORT__]を使用します", - label:"system" + message: "ポート[__PORT__]を使用します", + label: "system", }, { code: 112, - message:"ネットワークが有効ではないため開けません。", - label:"system" + message: "ネットワークが有効ではないため開けません。", + label: "system", }, { code: 113, - message:"サーバーは起動しました", - label:"system" + message: "サーバーは起動しました", + label: "system", }, { code: 114, - message:"Port: ", - label:"system" + message: "Port: ", + label: "system", }, { code: 115, - message:"Local: http://localhost:", - label:"system" + message: "Local: http://localhost:", + label: "system", }, { code: 116, - message:"Network: ", - label:"system" + message: "Network: ", + label: "system", }, { code: 117, - message:"public full: ", - label:"system" + message: "public full: ", + label: "system", }, { code: 118, - message:"Public: ", - label:"system" + message: "Public: ", + label: "system", }, { code: 119, - message:"API: ", - label:"system" + message: "API: ", + label: "system", }, { code: 120, - message:"Network URL QRcode", - label:"system" + message: "Network URL QRcode", + label: "system", }, { code: 121, - message:"summary", - label:"system" + message: "summary", + label: "system", }, { code: 122, - message:"QRcode", - label:"system" + message: "QRcode", + label: "system", }, -] as const; \ No newline at end of file +] as const; diff --git a/src/service/system-meta/data/code-index.ts b/src/service/system-meta/data/code-index.ts index 2209340..1826947 100644 --- a/src/service/system-meta/data/code-index.ts +++ b/src/service/system-meta/data/code-index.ts @@ -1,5 +1,3 @@ -import {CODE_1XX} from "./code-1xx.js"; +import { CODE_1XX } from "./code-1xx.js"; -export const SYSTEM_CODE = [ - ...CODE_1XX, -] as const; +export const SYSTEM_CODE = [...CODE_1XX] as const; diff --git a/src/service/system-meta/system-meta-manager.ts b/src/service/system-meta/system-meta-manager.ts index 9a3684f..6a8d616 100644 --- a/src/service/system-meta/system-meta-manager.ts +++ b/src/service/system-meta/system-meta-manager.ts @@ -1,13 +1,11 @@ import { CodeToMetaManager } from "../../util/code-to-error-message.js"; import { SYSTEM_CODE } from "./data/code-index.js"; - - -export class SystemMetaManager{ - private DATA_MANAGER:CodeToMetaManager = new CodeToMetaManager( SYSTEM_CODE ); - getMeta( - code:Parameters["getMeta"]>[1] - ){ - return this.DATA_MANAGER.getMeta("system",code); +export class SystemMetaManager { + private DATA_MANAGER: CodeToMetaManager<(typeof SYSTEM_CODE)[number]> = new CodeToMetaManager< + (typeof SYSTEM_CODE)[number] + >(SYSTEM_CODE); + getMeta(code: Parameters["getMeta"]>[1]) { + return this.DATA_MANAGER.getMeta("system", code); } -} \ No newline at end of file +} diff --git a/src/service/web-socket-router.ts b/src/service/web-socket-router.ts index 7a45919..700c466 100644 --- a/src/service/web-socket-router.ts +++ b/src/service/web-socket-router.ts @@ -1,4 +1,4 @@ -import { ApiRegistry , type ApiRegistryHandler} from "../util/api-registry.js"; +import { ApiRegistry, type ApiRegistryHandler } from "../util/api-registry.js"; import type { Server } from "node:http"; import { WebSocketServer } from "ws"; import type { WebSocket } from "ws"; @@ -6,23 +6,20 @@ import type { Duplex } from "node:stream"; import type { IncomingMessage } from "node:http"; export type WsHandler = { - ws: WebSocket, - req: IncomingMessage + ws: WebSocket; + req: IncomingMessage; }; -export class WebSocketRouter{ - private webSocketRegistry = new ApiRegistry>(); +export class WebSocketRouter { + private webSocketRegistry = new ApiRegistry>(); - start(server:Server){ + start(server: Server) { const wss = new WebSocketServer({ - noServer:true + noServer: true, }); - server.on("upgrade",(req, socket, head)=>{ - const url = new URL( - req.url ?? "/", - `http://${req.headers.host}` - ); + server.on("upgrade", (req, socket, head) => { + const url = new URL(req.url ?? "/", `http://${req.headers.host}`); const pathname = url.pathname; if (!this.webSocketRegistry.has(pathname)) { @@ -31,33 +28,25 @@ export class WebSocketRouter{ } wss.handleUpgrade(req, socket as Duplex, head, (ws) => { - this.webSocketRegistry.emit(pathname,{ws,req}); + this.webSocketRegistry.emit(pathname, { ws, req }); }); }); } - - // WebSocket登録 - on( - type:Key, - fn:ApiRegistryHandler - ){ - return this.webSocketRegistry.on(type,fn); + on(type: Key, fn: ApiRegistryHandler) { + return this.webSocketRegistry.on(type, fn); } // WebSocket一度のみ起動 - once( - type:Key, - fn:ApiRegistryHandler - ){ - return this.webSocketRegistry.once(type,fn); + once(type: Key, fn: ApiRegistryHandler) { + return this.webSocketRegistry.once(type, fn); } // WebSocket消去 - off(type:Key){ + off(type: Key) { this.webSocketRegistry.off(type); } // WebSocketが存在するか? - has(type:string){ + has(type: string) { return this.webSocketRegistry.has(type); } -} \ No newline at end of file +} diff --git a/src/types/config.type.ts b/src/types/config.type.ts index df7e03b..a93acf9 100644 --- a/src/types/config.type.ts +++ b/src/types/config.type.ts @@ -1,10 +1,7 @@ import express from "express"; import z from "zod"; -export type BrowserOpenConfig = - | boolean - | "local" - | "network"; +export type BrowserOpenConfig = boolean | "local" | "network"; export const serverUserConfigSchema = z.object({ baseDirname: z.string().optional(), @@ -16,7 +13,7 @@ export const serverUserConfigSchema = z.object({ showQrCode: z.boolean().optional(), openBrowser: z.union([z.boolean(), z.enum(["local", "network"])]).optional(), autoPort: z.boolean().optional(), - signalShutdownHandling: z.boolean().optional() + signalShutdownHandling: z.boolean().optional(), }); export type ServerUserConfig = z.infer; @@ -31,7 +28,7 @@ export const serverDefaultConfigSchema = z.object({ showQrCode: z.boolean(), openBrowser: z.union([z.boolean(), z.enum(["local", "network"])]), autoPort: z.boolean(), - signalShutdownHandling: z.boolean() + signalShutdownHandling: z.boolean(), }); export type ServerDefaultConfig = z.infer; diff --git a/src/types/inner.event-bus.type.ts b/src/types/inner.event-bus.type.ts index 3a5edf0..1e3e843 100644 --- a/src/types/inner.event-bus.type.ts +++ b/src/types/inner.event-bus.type.ts @@ -1,20 +1,20 @@ import type { LoggerCreateData } from "../util/logger.js"; export type InnerEventBusMap = { - "server/*:log": LoggerCreateData | void, - "server/start:error":{ - error?:Error - }, - "server/start:success":{ - }, - "server/start:process":{ - }, - "server/stop:error":{ - }, - "server/stop:timeout":{ - }, - "server/stop:success":{ - }, - "server/stop:process":{ - } -} \ No newline at end of file + "server/*:log": LoggerCreateData | void; + "server/start:error": { + error?: Error; + }; + // "server/start:success":{ + // }, + // "server/start:process":{ + // }, + // "server/stop:error":{ + // }, + // "server/stop:timeout":{ + // }, + // "server/stop:success":{ + // }, + // "server/stop:process":{ + // } +}; diff --git a/src/types/out.event-bus.type.ts b/src/types/out.event-bus.type.ts index 5163364..c181418 100644 --- a/src/types/out.event-bus.type.ts +++ b/src/types/out.event-bus.type.ts @@ -1,5 +1,5 @@ import type { LoggerCreateData } from "../util/logger.js"; export type OutEventBusMap = { - "server/*:log": LoggerCreateData | void -} \ No newline at end of file + "server/*:log": LoggerCreateData | void; +}; diff --git a/src/types/register.type.ts b/src/types/register.type.ts index f2f1ccb..1e90215 100644 --- a/src/types/register.type.ts +++ b/src/types/register.type.ts @@ -1,3 +1,3 @@ export type ServerRegister = { - publicDirectoryPath?:string; -}; \ No newline at end of file + publicDirectoryPath?: string; +}; diff --git a/src/util/api-registry.ts b/src/util/api-registry.ts index 32af06b..93e4e0d 100644 --- a/src/util/api-registry.ts +++ b/src/util/api-registry.ts @@ -1,11 +1,7 @@ -export type ApiRegistryHandler = - (arg: Type) => Result | Promise; -export class ApiRegistry>{ +export type ApiRegistryHandler = (arg: Type) => Result | Promise; - #EVENT_DATA_STORE = new Map< - keyof ApiRegistryMap, - Function - >(); +export class ApiRegistry> { + #EVENT_DATA_STORE = new Map(); /** * ハンドラを登録する関数 @@ -16,12 +12,12 @@ export class ApiRegistry>{ * const unsubscribe = registry.on("foo", handler); * unsubscribe(); // handler を解除 */ - on(type:Key,fn:ApiRegistryHandler){ - if(this.#EVENT_DATA_STORE.has(type)){ + on(type: KEY, fn: ApiRegistryHandler) { + if (this.#EVENT_DATA_STORE.has(type)) { console.warn(`[EventBus on warn] すでに登録された関数が上書きされました。`); } - this.#EVENT_DATA_STORE.set(type,fn)!; + this.#EVENT_DATA_STORE.set(type, fn as unknown); return () => this.off(type); } @@ -33,12 +29,12 @@ export class ApiRegistry>{ * @example * registry.once("foo", handler); */ - once(type:Key,fn:ApiRegistryHandler){ - const func:ApiRegistryHandler = (arg) =>{ + once(type: Key, fn: ApiRegistryHandler) { + const func: ApiRegistryHandler = (arg) => { this.off(type); return fn(arg); }; - return this.on(type,func); + return this.on(type, func); } /** @@ -49,9 +45,7 @@ export class ApiRegistry>{ * console.log(registry.has("foo")); */ has(type: string): type is Extract { - return this.#EVENT_DATA_STORE.has( - type as Extract - ); + return this.#EVENT_DATA_STORE.has(type as Extract); } /** @@ -60,7 +54,7 @@ export class ApiRegistry>{ * @example * registry.off("foo",handler); */ - off(type:Key){ + off(type: Key) { this.#EVENT_DATA_STORE.delete(type); } @@ -71,15 +65,16 @@ export class ApiRegistry>{ * @example * registry.emit("foo",arg); */ - async emit(type:Key,arg:ApiRegistryMap[Key]):Promise{ + async emit( + type: Key, + arg: ApiRegistryMap[Key] + ): Promise { const fn = this.#EVENT_DATA_STORE.get(type); - if(!fn)return; + if (!fn) return; try { - return await ( - fn as ApiRegistryHandler - )(arg); + return await (fn as ApiRegistryHandler)(arg); } catch (error) { console.error(`[EventBus emit error] ${String(type)}`, error); throw error; diff --git a/src/util/code-to-error-message.ts b/src/util/code-to-error-message.ts index c398e96..6a7a652 100644 --- a/src/util/code-to-error-message.ts +++ b/src/util/code-to-error-message.ts @@ -4,15 +4,15 @@ type CodeTableRecord = { [key: string]: unknown; }; -type CodeByLabel< - T extends CodeTableRecord, - L extends T["label"] -> = Extract["code"]; +type CodeByLabel = Extract< + T, + { label: L } +>["code"]; type MetaByLabelAndCode< T extends CodeTableRecord, L extends T["label"], - C extends CodeByLabel + C extends CodeByLabel, > = Extract; export class CodeToMetaManager { @@ -26,16 +26,13 @@ export class CodeToMetaManager { this.CODE_TABLE = [...this.CODE_TABLE, record]; } - getMeta< - L extends CodeTable["label"], - C extends CodeByLabel - >( + getMeta>( label: L, - code: C, + code: C ): MetaByLabelAndCode { const record = this.CODE_TABLE.find( - (item): item is MetaByLabelAndCode => - item.label === label && item.code === code + (item): item is MetaByLabelAndCode => + item.label === label && item.code === code ); if (!record) { @@ -44,4 +41,4 @@ export class CodeToMetaManager { return record; } -} \ No newline at end of file +} diff --git a/src/util/config-controller.ts b/src/util/config-controller.ts index 19dd033..a3156b0 100644 --- a/src/util/config-controller.ts +++ b/src/util/config-controller.ts @@ -1,24 +1,23 @@ import z from "zod"; -export class ConfigController>{ - - private configData:ConfigMap; +export class ConfigController> { + private configData: ConfigMap; private schema?: z.ZodType; - constructor(config:ConfigMap, schema?: z.ZodType){ + constructor(config: ConfigMap, schema?: z.ZodType) { this.configData = schema ? schema.parse(config) : config; - if(schema)this.schema = schema; + if (schema) this.schema = schema; } - updateConfig(config:Partial):void{ + updateConfig(config: Partial): void { const newConfig = { ...this.configData, ...config }; this.configData = this.schema ? this.schema.parse(newConfig) : newConfig; } - getConfig(key:K):ConfigMap[K]{ + getConfig(key: K): ConfigMap[K] { return this.configData[key]; } - setSchema(schema:z.ZodType):void{ + setSchema(schema: z.ZodType): void { this.schema = schema; this.configData = this.schema.parse(this.configData); } -} \ No newline at end of file +} diff --git a/src/util/data-register-controller.ts b/src/util/data-register-controller.ts deleted file mode 100644 index e96c04c..0000000 --- a/src/util/data-register-controller.ts +++ /dev/null @@ -1,39 +0,0 @@ -type DefaultTable = Record -export class DataRegisterController{ - private DATA_TABLE:readonly Table[]; - - constructor(dataTable:readonly Table[]){ - this.DATA_TABLE = dataTable; - } - - // 参照 - indexOf(key:string,value:any):number{ - return this.DATA_TABLE.findIndex(table=> table[key] === value) - } - length():number{ - return this.DATA_TABLE.length; - } - allList():Table[]{ - return [...this.DATA_TABLE]; - } - selectIndex(index:number){ - return this.DATA_TABLE[index]; - } - searchDataTable(key:string,value:any){ - return this.DATA_TABLE.find(table => table[key] === value) - } - filterDataTable(key:string,values:any[]){ - return this.DATA_TABLE.filter(table => values.includes(table[key])) - } - filterKey(key:string){ - return this.DATA_TABLE.map(table => table[key]) - } - - - // 編集 - push(record:Table):void{ - const newTable = [...this.DATA_TABLE]; - newTable.push(record); - this.DATA_TABLE = newTable; - } -} \ No newline at end of file diff --git a/src/util/event-bus.ts b/src/util/event-bus.ts index f81bf1b..8b583fc 100644 --- a/src/util/event-bus.ts +++ b/src/util/event-bus.ts @@ -1,11 +1,6 @@ -export type EventBusHandler = - (arg: Type) => Result | Promise; -export class EventBus>{ - - #EVENT_DATA_STORE = new Map< - keyof EventBusMap, - Function[] - >(); +export type EventBusHandler = (arg: Type) => Result | Promise; +export class EventBus> { + #EVENT_DATA_STORE = new Map(); /** * ハンドラを登録する関数 @@ -16,15 +11,15 @@ export class EventBus>{ * const unsubscribe = eventBus.on("foo", handler); * unsubscribe(); // handler を解除 */ - on(type:Key,fn:EventBusHandler){ - if(!this.#EVENT_DATA_STORE.has(type)){ - this.#EVENT_DATA_STORE.set(type,[]); + on(type: Key, fn: EventBusHandler) { + if (!this.#EVENT_DATA_STORE.has(type)) { + this.#EVENT_DATA_STORE.set(type, []); } const list = this.#EVENT_DATA_STORE.get(type)!; - list.push(fn); + list.push(fn as unknown); - return () => this.off(type,fn); + return () => this.off(type, fn); } /** @@ -34,12 +29,12 @@ export class EventBus>{ * @example * eventBus.once("foo", handler); */ - once(type:Key,fn:EventBusHandler){ - const func:EventBusHandler = (arg) =>{ - this.off(type,func); + once(type: Key, fn: EventBusHandler) { + const func: EventBusHandler = (arg) => { + this.off(type, func); return fn(arg); }; - return this.on(type,func); + return this.on(type, func); } /** @@ -50,9 +45,7 @@ export class EventBus>{ * console.log(eventBus.has("foo")); */ has(type: string): type is Extract { - return this.#EVENT_DATA_STORE.has( - type as Extract - ); + return this.#EVENT_DATA_STORE.has(type as Extract); } /** @@ -61,16 +54,16 @@ export class EventBus>{ * @example * eventBus.off("foo",handler); */ - off(type:Key,fn:EventBusHandler){ + off(type: Key, fn: EventBusHandler) { const list = this.#EVENT_DATA_STORE.get(type); if (!list) return; const index = list.indexOf(fn); if (index === -1) return; - list.splice(index,1); + list.splice(index, 1); - if(list.length === 0){ + if (list.length === 0) { this.#EVENT_DATA_STORE.delete(type); } } @@ -82,24 +75,19 @@ export class EventBus>{ * @example * eventBus.emit("foo",arg); */ - async emit(type:Key,arg:EventBusMap[Key]):Promise{ + async emit(type: Key, arg: EventBusMap[Key]): Promise { const list = this.#EVENT_DATA_STORE.get(type); const task = []; - if(!list)return; + if (!list) return; try { - for(const fn of [...list]){ - task.push( - ( - fn as EventBusHandler - )(arg) - ); + for (const fn of [...list]) { + task.push((fn as EventBusHandler)(arg)); } await Promise.all(task); } catch (error) { console.error(`[EventBus emit error] ${String(type)}`, error); throw error; } - } } diff --git a/src/util/get-lan-ip.ts b/src/util/get-lan-ip.ts index 67a2e57..4efb649 100644 --- a/src/util/get-lan-ip.ts +++ b/src/util/get-lan-ip.ts @@ -9,14 +9,11 @@ export function getLanIp() { if (!netList) continue; for (const net of netList) { - if ( - net.family === "IPv4" && - !net.internal - ) { - return net.address; - } + if (net.family === "IPv4" && !net.internal) { + return net.address; + } } } return "localhost"; -} \ No newline at end of file +} diff --git a/src/util/is-portIn-use.ts b/src/util/is-portIn-use.ts index a890cae..93eb5b5 100644 --- a/src/util/is-portIn-use.ts +++ b/src/util/is-portIn-use.ts @@ -1,6 +1,6 @@ import net from "node:net"; -export async function isPortInUse(port: number,host:string): Promise { +export async function isPortInUse(port: number, host: string): Promise { return new Promise((resolve) => { const server = net.createServer(); @@ -17,6 +17,6 @@ export async function isPortInUse(port: number,host:string): Promise { resolve(false); }); - server.listen(port,host); + server.listen(port, host); }); -} \ No newline at end of file +} diff --git a/src/util/is-user-request.ts b/src/util/is-user-request.ts index 3466d0d..185f35c 100644 --- a/src/util/is-user-request.ts +++ b/src/util/is-user-request.ts @@ -1,22 +1,22 @@ import readline from "node:readline/promises"; -export async function isUserRequest(message:string):Promise{ +export async function isUserRequest(message: string): Promise { const rl = readline.createInterface({ input: process.stdin, - output: process.stdout + output: process.stdout, }); let answerReturn: boolean | null = null; - while(answerReturn === null){ + while (answerReturn === null) { const answer = await rl.question(`${message} (y/n): `); const answerUpper = answer.toUpperCase(); - if(answerUpper === "Y" || answerUpper === "YES"){ + if (answerUpper === "Y" || answerUpper === "YES") { answerReturn = true; break; } - if(answerUpper === "N" || answerUpper === "NO"){ + if (answerUpper === "N" || answerUpper === "NO") { answerReturn = false; break; } @@ -24,4 +24,4 @@ export async function isUserRequest(message:string):Promise{ rl.close(); return answerReturn; -} \ No newline at end of file +} diff --git a/src/util/logger.ts b/src/util/logger.ts index 1a7b9ca..79a77dc 100644 --- a/src/util/logger.ts +++ b/src/util/logger.ts @@ -2,52 +2,48 @@ import pc from "picocolors"; import stringWidth from "string-width"; import stripAnsi from "strip-ansi"; -function getWidth():number{ +function getWidth(): number { const number = Number(process.env.COLUMNS); - const envColumns = Number.isFinite(number)? number : null; + const envColumns = Number.isFinite(number) ? number : null; - return process.stdout.columns ?? - envColumns ?? - 80; + return process.stdout.columns ?? envColumns ?? 80; } -function calcAnsiLength(text:string){ - const cleanText = stripAnsi(text); - const ansiLength = (text.length - cleanText.length); +function calcAnsiLength(text: string) { + const cleanText = stripAnsi(text); + const ansiLength = text.length - cleanText.length; return ansiLength; } +function textNormalizer(text: string, width: number): string[] { + const textList = Array.isArray(text.split("\n")) ? text.split("\n") : [text]; -function textNormalizer(text:string,width:number):string[] { + let fixedTextList: string[] = []; + const headerLength = stringWidth( + stripAnsi(textList[0] ?? "").match(/\[[a-zA-Z1-9]*\]\s/)?.[0] ?? "" + ); - const textList = (Array.isArray(text.split("\n")))? - text.split("\n"): - [text]; - - let fixedTextList:string[] = []; - const headerLength = stringWidth(stripAnsi(textList[0]?? "").match(/\[[a-zA-Z1-9]*\]\s/)?.[0] ?? ""); - - for(const text of textList){ + for (const text of textList) { const index = textList.indexOf(text); const calcAnsiLengthValue = calcAnsiLength(text); - const textWidth = stringWidth(text); + const textWidth = stringWidth(text); const overContent = Math.ceil(textWidth / width); - const overHeader = (overContent - 1) * headerLength; - const textLength = (textWidth - headerLength) + overHeader + calcAnsiLengthValue; + const overHeader = (overContent - 1) * headerLength; + const textLength = textWidth - headerLength + overHeader + calcAnsiLengthValue; let fixedText = []; - if(textLength <= width){ - const prefix = " ".repeat(index === 0?0:headerLength) + if (textLength <= width) { + const prefix = " ".repeat(index === 0 ? 0 : headerLength); fixedTextList.push(`${prefix}${text}`); continue; } // 横幅より長かったら... - for(let i = 0; i < textLength;){ - const prefix = " ".repeat(i >= width?headerLength:0); - const end = width + (i >= width? -headerLength:calcAnsiLengthValue); + for (let i = 0; i < textLength; ) { + const prefix = " ".repeat(i >= width ? headerLength : 0); + const end = width + (i >= width ? -headerLength : calcAnsiLengthValue); const tmp = `${prefix}${text.slice(i, i + end)}`; fixedText.push(tmp); @@ -59,64 +55,62 @@ function textNormalizer(text:string,width:number):string[] { } type CreateData = { - type:string; - message:string; - createMessage:string; -} + type: string; + message: string; + createMessage: string; +}; export type LoggerCreateData = { - type:string; - message:string; - createMessage:string; - date:number; -} - + type: string; + message: string; + createMessage: string; + date: number; +}; -function createData(data:CreateData):LoggerCreateData{ +function createData(data: CreateData): LoggerCreateData { return { ...data, date: Date.now(), }; } - -class Logger{ - #addStdout(obj:LoggerCreateData){ - const {createMessage,...stdoutObj } = obj; +class Logger { + #addStdout(obj: LoggerCreateData) { + const { createMessage, ...stdoutObj } = obj; process.stdout.write(JSON.stringify(stdoutObj)); } - #addStderr(message:string){ + #addStderr(message: string) { const out = message.endsWith("\n") ? message : message + "\n"; process.stderr.write(out); } - #loggerSelectProcess(data:LoggerCreateData){ - if((process.stdout.isTTY)){ + #loggerSelectProcess(data: LoggerCreateData) { + if (process.stdout.isTTY) { this.#addStderr(data.createMessage); - }else{ + } else { this.#addStdout(data); } return data; } - info(message: string):LoggerCreateData{ + info(message: string): LoggerCreateData { const data = this.createInfo(message); return this.#loggerSelectProcess(data); } - createInfo(message: string):LoggerCreateData{ + createInfo(message: string): LoggerCreateData { const obj = createData({ - type:"INFO", - message:`[INFO] ${message}`, - createMessage:`${pc.blueBright("[INFO]")} ${message}`, + type: "INFO", + message: `[INFO] ${message}`, + createMessage: `${pc.blueBright("[INFO]")} ${message}`, }); return obj; } - warn(message: string):LoggerCreateData{ + warn(message: string): LoggerCreateData { const data = this.createWarn(message); return this.#loggerSelectProcess(data); } - createWarn(message: string):LoggerCreateData{ + createWarn(message: string): LoggerCreateData { const obj = createData({ type: "WARN", message: `[WARN] ${message}`, @@ -125,13 +119,12 @@ class Logger{ return obj; } - error(message: string):LoggerCreateData{ - + error(message: string): LoggerCreateData { const data = this.createError(message); return this.#loggerSelectProcess(data); } - createError(message: string):LoggerCreateData{ + createError(message: string): LoggerCreateData { const obj = createData({ type: "ERROR", message: `[ERROR] ${message}`, @@ -141,11 +134,11 @@ class Logger{ return obj; } - success(message: string):LoggerCreateData{ + success(message: string): LoggerCreateData { const data = this.createSuccess(message); return this.#loggerSelectProcess(data); } - createSuccess(message: string):LoggerCreateData{ + createSuccess(message: string): LoggerCreateData { const obj = createData({ type: "SUCCESS", message: `[SUCCESS] ${message}`, @@ -154,11 +147,11 @@ class Logger{ return obj; } - process(message: string):LoggerCreateData{ + process(message: string): LoggerCreateData { const data = this.createProcess(message); return this.#loggerSelectProcess(data); } - createProcess(message: string):LoggerCreateData{ + createProcess(message: string): LoggerCreateData { const obj = createData({ type: "PROCESS", message: `[PROCESS] ${message}`, @@ -167,11 +160,11 @@ class Logger{ return obj; } - message(message: string):LoggerCreateData{ + message(message: string): LoggerCreateData { const data = this.createMessage(message); return this.#loggerSelectProcess(data); } - createMessage(message: string):LoggerCreateData{ + createMessage(message: string): LoggerCreateData { const obj = createData({ type: "MESSAGE", message: `[MESSAGE] ${message}`, @@ -180,11 +173,11 @@ class Logger{ return obj; } - system(message: string):LoggerCreateData{ + system(message: string): LoggerCreateData { const data = this.createSystem(message); return this.#loggerSelectProcess(data); } - createSystem(message: string):LoggerCreateData{ + createSystem(message: string): LoggerCreateData { const obj = createData({ type: "SYSTEM", message: `[SYSTEM] ${message}`, @@ -193,11 +186,11 @@ class Logger{ return obj; } - bar():LoggerCreateData{ + bar(): LoggerCreateData { const data = this.createBar(); return this.#loggerSelectProcess(data); } - createBar():LoggerCreateData{ + createBar(): LoggerCreateData { const width = getWidth(); const line = `${"─".repeat(width - 2)}`; const obj = createData({ @@ -208,44 +201,37 @@ class Logger{ return obj; } - window(window:{ - title:string; - content:LoggerCreateData[]; - }):void{ - - if(!(process.stdout.isTTY)){ - window.content.forEach((data)=>{ - this.#loggerSelectProcess(data) + window(window: { title: string; content: LoggerCreateData[] }): void { + if (!process.stdout.isTTY) { + window.content.forEach((data) => { + this.#loggerSelectProcess(data); }); return; } const width = getWidth(); - const createLine = (line:string):string => { - const repeatNumber = (width - 2) - stringWidth(line); + const createLine = (line: string): string => { + const repeatNumber = width - 2 - stringWidth(line); const safeRepeatNumber = repeatNumber >= 0 ? repeatNumber : 0; return `│${line}${" ".repeat(safeRepeatNumber)}│`; - } + }; this.#addStderr(`┌${"─".repeat(width - 2)}┐`); - textNormalizer(window.title,(width - 2)) - .forEach((text)=>{ - this.#addStderr(createLine(text)); + textNormalizer(window.title, width - 2).forEach((text) => { + this.#addStderr(createLine(text)); }); this.#addStderr(`├${"─".repeat(width - 2)}┤`); - window.content. - forEach((lineText)=>{ - textNormalizer(lineText.createMessage,(width - 2)). - forEach((text)=>{ - this.#addStderr(createLine(text)); - }); + window.content.forEach((lineText) => { + textNormalizer(lineText.createMessage, width - 2).forEach((text) => { + this.#addStderr(createLine(text)); + }); }); this.#addStderr(`└${"─".repeat(width - 2)}┘`); } } -export const logger = new Logger(); \ No newline at end of file +export const logger = new Logger(); diff --git a/src/util/read-directory.ts b/src/util/read-directory.ts index b2a81d8..288290f 100644 --- a/src/util/read-directory.ts +++ b/src/util/read-directory.ts @@ -1,6 +1,9 @@ -import fs from 'fs/promises'; +import fs from "fs/promises"; -export async function readDirectory(filePath: string, recursive: boolean = false): Promise { +export async function readDirectory( + filePath: string, + recursive: boolean = false +): Promise { const data = await fs.readdir(filePath, { recursive }); return data; } diff --git a/src/util/services-register.ts b/src/util/services-register.ts index f5120a8..1661269 100644 --- a/src/util/services-register.ts +++ b/src/util/services-register.ts @@ -1,10 +1,7 @@ +export class ServicesRegister> { + constructor(private services: ServicesMAP) {} - - -export class ServicesRegister> { - constructor(private services: ServicesMAP){} - - get(key: K):ServicesMAP[K] { + get(key: K): ServicesMAP[K] { return this.services[key]; } -} \ No newline at end of file +} diff --git a/templates/config/basic/tyoi.config.js b/templates/config/basic/tyoi.config.js index 95cc636..2feb1fc 100644 --- a/templates/config/basic/tyoi.config.js +++ b/templates/config/basic/tyoi.config.js @@ -3,9 +3,9 @@ import morgan from "morgan"; export default defineConfig({ port: 3000, - autoPort:true, + autoPort: true, - publicDirname:"./public/main", + publicDirname: "./public/main", apiPrefix: "/api", exposeLan: false, @@ -13,7 +13,5 @@ export default defineConfig({ openBrowser: false, - middlewares:[ - morgan("dev") - ] + middlewares: [morgan("dev")], }); diff --git a/templates/project/basic-js/public/main/index.html b/templates/project/basic-js/public/main/index.html index 3a5e512..463ed7e 100644 --- a/templates/project/basic-js/public/main/index.html +++ b/templates/project/basic-js/public/main/index.html @@ -1,48 +1,52 @@ - + - - - - tyoi-server | デフォルトページ - - + + + + tyoi-server | デフォルトページ + + - - - -
-

tyoi-server

-
-
-
-
-

tyoi-server

-

Small local API and static file server framework.

-
-
- -

Server is Running

-
-
-
-
- -

Server Test Page

-
-
-

tyoi-api-server が正常に起動し、このページを配信しています。

-
-
+ + + +
+

tyoi-server

+
+
+
+
+

tyoi-server

+

+ Small local API and static file server framework. +

+
+
+ +

Server is Running

+
+
+
+
+ +

Server Test Page

+
+
+

tyoi-api-server が正常に起動し、このページを配信しています。

+
+
-
-
- ! -

Note

-
-
-

このページは動作確認用です。
使用するときはこのディレクトリー内にデータを配置してください。

-
-
-
- - \ No newline at end of file +
+
+ ! +

Note

+
+
+

+ このページは動作確認用です。
使用するときはこのディレクトリー内にデータを配置してください。 +

+
+
+
+ + diff --git a/templates/project/basic-js/public/main/src/style/index.css b/templates/project/basic-js/public/main/src/style/index.css index f24ba84..758db4e 100644 --- a/templates/project/basic-js/public/main/src/style/index.css +++ b/templates/project/basic-js/public/main/src/style/index.css @@ -1,4 +1,4 @@ -body{ +body { display: flex; flex-direction: column; @@ -12,7 +12,7 @@ body{ background-color: #0e1220; color: #ebebeb; } -.header{ +.header { width: 100%; height: 2.5em; @@ -35,7 +35,7 @@ body{ } */ -.main-section{ +.main-section { width: 100%; height: auto; overflow: hidden; @@ -46,7 +46,7 @@ body{ border-radius: 5px; box-sizing: border-box; } -.main-section-header{ +.main-section-header { display: flex; align-items: center; gap: 0.3em; @@ -59,22 +59,22 @@ body{ background-color: #5a668f40; border-bottom: #ebebeb4b 1px solid; } -.main-section-header-icon{ +.main-section-header-icon { font-size: 0.8em; } -.main-section-header-title{ +.main-section-header-title { font-size: 0.9em; font-weight: bold; } -.main-section-main{ +.main-section-main { padding: 0.8em 1em; width: 100%; height: auto; } -.main-hero{ +.main-hero { display: flex; flex-direction: column; justify-content: center; @@ -86,50 +86,48 @@ body{ padding-bottom: 2em; box-sizing: border-box; } -.main-hero-title{ +.main-hero-title { display: flex; flex-direction: column; justify-content: center; gap: 0.5em; box-sizing: border-box; } -.main-hero-title-box{ +.main-hero-title-box { display: flex; flex-direction: column; justify-content: center; gap: 0.5em; box-sizing: border-box; } -.main-hero-title-text{ +.main-hero-title-text { font-size: 2em; font-weight: bold; background: linear-gradient(90deg, #372dff 0%, #ff8bff 70%); background-clip: text; color: transparent; } -.main-hero-title-description{ +.main-hero-title-description { width: 60%; font-size: 1em; } -.main-hero-status{ +.main-hero-status { width: fit-content; display: inline-flex; justify-content: center; align-items: center; gap: 0.5em; - color: #55CA93; - background-color: #55CA9320; - border: #55CA9320 1px solid; + color: #55ca93; + background-color: #55ca9320; + border: #55ca9320 1px solid; padding: 0.3em 0.6em; border-radius: 5px; } -.main-hero-status-icon{ +.main-hero-status-icon { font-size: 0.8em; } -.main-hero-status-text{ +.main-hero-status-text { font-size: 0.8em; } - - diff --git a/templates/project/basic-js/public/main/src/style/init.css b/templates/project/basic-js/public/main/src/style/init.css index e1b1495..4eacb20 100644 --- a/templates/project/basic-js/public/main/src/style/init.css +++ b/templates/project/basic-js/public/main/src/style/init.css @@ -1,13 +1,18 @@ -body{ +body { margin: 0; padding: 0; } -h1,h2,h3,h4,h5,h6{ +h1, +h2, +h3, +h4, +h5, +h6 { font-size: 1em; - font-weight:unset; + font-weight: unset; margin: 0; } -p{ +p { margin: 0; -} \ No newline at end of file +} diff --git a/templates/project/basic-js/src/server.js b/templates/project/basic-js/src/server.js index e6454b8..9a02111 100644 --- a/templates/project/basic-js/src/server.js +++ b/templates/project/basic-js/src/server.js @@ -6,9 +6,7 @@ const server = new Server({ baseDirname: import.meta.dirname, publicDirname: "../public/main", port: 3000, - middlewares:[ - morgan("dev") - ] + middlewares: [morgan("dev")], }); // サーバー起動 diff --git a/templates/project/basic-js/tyoi.config.js b/templates/project/basic-js/tyoi.config.js index 562d23f..1630183 100644 --- a/templates/project/basic-js/tyoi.config.js +++ b/templates/project/basic-js/tyoi.config.js @@ -3,9 +3,9 @@ import morgan from "morgan"; export default defineConfig({ port: 3000, - autoPort:true, + autoPort: true, - publicDirname:"./public/main", + publicDirname: "./public/main", apiPrefix: "/api", exposeLan: false, @@ -13,7 +13,5 @@ export default defineConfig({ openBrowser: true, - middlewares:[ - morgan("dev") - ] + middlewares: [morgan("dev")], }); diff --git a/templates/project/basic-ts/public/main/index.html b/templates/project/basic-ts/public/main/index.html index 3a5e512..463ed7e 100644 --- a/templates/project/basic-ts/public/main/index.html +++ b/templates/project/basic-ts/public/main/index.html @@ -1,48 +1,52 @@ - + - - - - tyoi-server | デフォルトページ - - + + + + tyoi-server | デフォルトページ + + - - - -
-

tyoi-server

-
-
-
-
-

tyoi-server

-

Small local API and static file server framework.

-
-
- -

Server is Running

-
-
-
-
- -

Server Test Page

-
-
-

tyoi-api-server が正常に起動し、このページを配信しています。

-
-
+ + + +
+

tyoi-server

+
+
+
+
+

tyoi-server

+

+ Small local API and static file server framework. +

+
+
+ +

Server is Running

+
+
+
+
+ +

Server Test Page

+
+
+

tyoi-api-server が正常に起動し、このページを配信しています。

+
+
-
-
- ! -

Note

-
-
-

このページは動作確認用です。
使用するときはこのディレクトリー内にデータを配置してください。

-
-
-
- - \ No newline at end of file +
+
+ ! +

Note

+
+
+

+ このページは動作確認用です。
使用するときはこのディレクトリー内にデータを配置してください。 +

+
+
+
+ + diff --git a/templates/project/basic-ts/public/main/src/style/index.css b/templates/project/basic-ts/public/main/src/style/index.css index f24ba84..758db4e 100644 --- a/templates/project/basic-ts/public/main/src/style/index.css +++ b/templates/project/basic-ts/public/main/src/style/index.css @@ -1,4 +1,4 @@ -body{ +body { display: flex; flex-direction: column; @@ -12,7 +12,7 @@ body{ background-color: #0e1220; color: #ebebeb; } -.header{ +.header { width: 100%; height: 2.5em; @@ -35,7 +35,7 @@ body{ } */ -.main-section{ +.main-section { width: 100%; height: auto; overflow: hidden; @@ -46,7 +46,7 @@ body{ border-radius: 5px; box-sizing: border-box; } -.main-section-header{ +.main-section-header { display: flex; align-items: center; gap: 0.3em; @@ -59,22 +59,22 @@ body{ background-color: #5a668f40; border-bottom: #ebebeb4b 1px solid; } -.main-section-header-icon{ +.main-section-header-icon { font-size: 0.8em; } -.main-section-header-title{ +.main-section-header-title { font-size: 0.9em; font-weight: bold; } -.main-section-main{ +.main-section-main { padding: 0.8em 1em; width: 100%; height: auto; } -.main-hero{ +.main-hero { display: flex; flex-direction: column; justify-content: center; @@ -86,50 +86,48 @@ body{ padding-bottom: 2em; box-sizing: border-box; } -.main-hero-title{ +.main-hero-title { display: flex; flex-direction: column; justify-content: center; gap: 0.5em; box-sizing: border-box; } -.main-hero-title-box{ +.main-hero-title-box { display: flex; flex-direction: column; justify-content: center; gap: 0.5em; box-sizing: border-box; } -.main-hero-title-text{ +.main-hero-title-text { font-size: 2em; font-weight: bold; background: linear-gradient(90deg, #372dff 0%, #ff8bff 70%); background-clip: text; color: transparent; } -.main-hero-title-description{ +.main-hero-title-description { width: 60%; font-size: 1em; } -.main-hero-status{ +.main-hero-status { width: fit-content; display: inline-flex; justify-content: center; align-items: center; gap: 0.5em; - color: #55CA93; - background-color: #55CA9320; - border: #55CA9320 1px solid; + color: #55ca93; + background-color: #55ca9320; + border: #55ca9320 1px solid; padding: 0.3em 0.6em; border-radius: 5px; } -.main-hero-status-icon{ +.main-hero-status-icon { font-size: 0.8em; } -.main-hero-status-text{ +.main-hero-status-text { font-size: 0.8em; } - - diff --git a/templates/project/basic-ts/public/main/src/style/init.css b/templates/project/basic-ts/public/main/src/style/init.css index e1b1495..4eacb20 100644 --- a/templates/project/basic-ts/public/main/src/style/init.css +++ b/templates/project/basic-ts/public/main/src/style/init.css @@ -1,13 +1,18 @@ -body{ +body { margin: 0; padding: 0; } -h1,h2,h3,h4,h5,h6{ +h1, +h2, +h3, +h4, +h5, +h6 { font-size: 1em; - font-weight:unset; + font-weight: unset; margin: 0; } -p{ +p { margin: 0; -} \ No newline at end of file +} diff --git a/templates/project/basic-ts/src/server.ts b/templates/project/basic-ts/src/server.ts index e6454b8..9a02111 100644 --- a/templates/project/basic-ts/src/server.ts +++ b/templates/project/basic-ts/src/server.ts @@ -6,9 +6,7 @@ const server = new Server({ baseDirname: import.meta.dirname, publicDirname: "../public/main", port: 3000, - middlewares:[ - morgan("dev") - ] + middlewares: [morgan("dev")], }); // サーバー起動 diff --git a/templates/project/basic-ts/tsconfig.json b/templates/project/basic-ts/tsconfig.json index 5498b7e..aad430a 100644 --- a/templates/project/basic-ts/tsconfig.json +++ b/templates/project/basic-ts/tsconfig.json @@ -14,4 +14,4 @@ "outDir": "./dist" }, "include": ["src"] -} \ No newline at end of file +} diff --git a/templates/project/basic-ts/tyoi.config.js b/templates/project/basic-ts/tyoi.config.js index 562d23f..1630183 100644 --- a/templates/project/basic-ts/tyoi.config.js +++ b/templates/project/basic-ts/tyoi.config.js @@ -3,9 +3,9 @@ import morgan from "morgan"; export default defineConfig({ port: 3000, - autoPort:true, + autoPort: true, - publicDirname:"./public/main", + publicDirname: "./public/main", apiPrefix: "/api", exposeLan: false, @@ -13,7 +13,5 @@ export default defineConfig({ openBrowser: true, - middlewares:[ - morgan("dev") - ] + middlewares: [morgan("dev")], }); diff --git a/test/scripts/util/api-registry.test.ts b/test/scripts/util/api-registry.test.ts index 861feb3..c0975d9 100644 --- a/test/scripts/util/api-registry.test.ts +++ b/test/scripts/util/api-registry.test.ts @@ -1,34 +1,33 @@ -import { expect,describe ,test ,vi} from "vitest"; -import { ApiRegistry } from "../../../src/util/api-registry.js" - -describe("ApiRegistry",()=>{ +import { expect, describe, test, vi } from "vitest"; +import { ApiRegistry } from "../../../src/util/api-registry.js"; +describe("ApiRegistry", () => { const apiRegistry = new ApiRegistry(); const onceCallback = vi.fn(); const onCallback = vi.fn(); - test("once 登録",()=>{ - apiRegistry.once("a",onceCallback); + test("once 登録", () => { + apiRegistry.once("a", onceCallback); }); - test("has 存在確認",()=>{ + test("has 存在確認", () => { apiRegistry.has("a"); }); - test("emit 着火",()=>{ - apiRegistry.emit("a",{}); + test("emit 着火", () => { + apiRegistry.emit("a", {}); expect(onceCallback).toHaveBeenCalledTimes(1); }); - test("on 登録",()=>{ - apiRegistry.on("b",onCallback); + test("on 登録", () => { + apiRegistry.on("b", onCallback); }); - test("has 存在確認",()=>{ + test("has 存在確認", () => { apiRegistry.has("b"); }); - test("off 解除",()=>{ + test("off 解除", () => { apiRegistry.off("b"); }); - test("emit 発火",()=>{ - apiRegistry.emit("b",{}); + test("emit 発火", () => { + apiRegistry.emit("b", {}); expect(onCallback).toHaveBeenCalledTimes(0); }); -}); \ No newline at end of file +}); diff --git a/test/scripts/util/code-to-error-message.test.ts b/test/scripts/util/code-to-error-message.test.ts index 075006a..342012c 100644 --- a/test/scripts/util/code-to-error-message.test.ts +++ b/test/scripts/util/code-to-error-message.test.ts @@ -1,61 +1,60 @@ -import { expect,describe ,test } from "vitest"; -import { CodeToMetaManager } from "../../../src/util/code-to-error-message.js" - -describe("CodeToMetaManager",()=>{ +import { expect, describe, test } from "vitest"; +import { CodeToMetaManager } from "../../../src/util/code-to-error-message.js"; +describe("CodeToMetaManager", () => { const TEST_DATA = [ { code: 1, message: "aaa-1", description: "1-1-1", - label:"aaa" + label: "aaa", }, { code: 2, message: "aaa-2", description: "2-2-2", - label:"aaa" + label: "aaa", }, { - code:1, + code: 1, message: "bbb-1", description: "1-1-1", - label:"bbb" - } + label: "bbb", + }, ] as const; const codeToMetaManager = new CodeToMetaManager(TEST_DATA); - test("getMeta データが正常に取得できる",()=>{ - const data = codeToMetaManager.getMeta("aaa",1); + test("getMeta データが正常に取得できる", () => { + const data = codeToMetaManager.getMeta("aaa", 1); expect(data).toEqual({ code: 1, message: "aaa-1", description: "1-1-1", - label:"aaa" + label: "aaa", }); }); - test("getMeta データが正常に取得できる",()=>{ - const data = codeToMetaManager.getMeta("aaa",2); + test("getMeta データが正常に取得できる", () => { + const data = codeToMetaManager.getMeta("aaa", 2); expect(data).toEqual({ code: 2, message: "aaa-2", description: "2-2-2", - label:"aaa" + label: "aaa", }); }); - test("getMeta データが正常に取得できる",()=>{ - const data = codeToMetaManager.getMeta("bbb",1); + test("getMeta データが正常に取得できる", () => { + const data = codeToMetaManager.getMeta("bbb", 1); expect(data).toEqual({ code: 1, message: "bbb-1", description: "1-1-1", - label:"bbb" + label: "bbb", }); }); -}); \ No newline at end of file +}); diff --git a/test/scripts/util/get-lan-ip.test.ts b/test/scripts/util/get-lan-ip.test.ts index 71a3946..9cc3a12 100644 --- a/test/scripts/util/get-lan-ip.test.ts +++ b/test/scripts/util/get-lan-ip.test.ts @@ -1,11 +1,10 @@ -import { expect,describe ,test} from "vitest"; -import { getLanIp } from "../../../src/util/get-lan-ip" +import { expect, describe, test } from "vitest"; +import { getLanIp } from "../../../src/util/get-lan-ip"; - -describe("getLanIp",()=>{ - test("",()=>{ +describe("getLanIp", () => { + test("", () => { const ip = getLanIp(); expect(ip).toEqual(expect.any(String)); - }) -}) \ No newline at end of file + }); +}); diff --git a/tsconfig.test.json b/tsconfig.test.json index d183f1a..f2e79ff 100644 --- a/tsconfig.test.json +++ b/tsconfig.test.json @@ -2,7 +2,7 @@ "extends": "./tsconfig.json", "compilerOptions": { "noEmit": true, - "rootDir": "./test/scripts", + "rootDir": "./test/scripts" }, "include": ["test/scripts/**/*.ts"] -} \ No newline at end of file +} diff --git a/tyoi.config.js b/tyoi.config.js index 9e369e0..b67cddd 100644 --- a/tyoi.config.js +++ b/tyoi.config.js @@ -3,9 +3,9 @@ import morgan from "morgan"; export default defineConfig({ port: 3000, - autoPort:true, + autoPort: true, - publicDirname:"./public/main", + publicDirname: "./public/main", apiPrefix: "/api", exposeLan: false, @@ -13,7 +13,5 @@ export default defineConfig({ openBrowser: false, - middlewares:[ - morgan("dev") - ] + middlewares: [morgan("dev")], });