From 7b94bc51fa6c2a413281c7e70a844ebe186f3e0f Mon Sep 17 00:00:00 2001 From: donneko <117331095+donneko@users.noreply.github.com> Date: Wed, 24 Jun 2026 15:58:16 +0900 Subject: [PATCH 1/5] #25 --- src/cli/command/dev.ts | 2 +- src/index.ts | 6 +++--- src/{ => server}/app/config-server.ts | 0 src/{ => server}/app/server.ts | 0 src/{ => server}/app/short-handler.ts | 0 5 files changed, 4 insertions(+), 4 deletions(-) rename src/{ => server}/app/config-server.ts (100%) rename src/{ => server}/app/server.ts (100%) rename src/{ => server}/app/short-handler.ts (100%) diff --git a/src/cli/command/dev.ts b/src/cli/command/dev.ts index c55082f..72c2420 100644 --- a/src/cli/command/dev.ts +++ b/src/cli/command/dev.ts @@ -1,4 +1,4 @@ -import { Server } from "../../app/server.js"; +import { Server } from "../../server/app/server.js"; import type { CmdMetaData } from "../types/tyoi-cli.js"; type RequestNameList = "GET:/test" | "GET:/test/a" | "GET:/a"; diff --git a/src/index.ts b/src/index.ts index 39e49ed..fd7ee7e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1,3 @@ -export { Server } from "./app/server.js"; -export { tyoi } from "./app/short-handler.js"; -export { defineConfig } from "./app/config-server.js"; +export { Server } from "./server/app/server.js"; +export { tyoi } from "./server/app/short-handler.js"; +export { defineConfig } from "./server/app/config-server.js"; diff --git a/src/app/config-server.ts b/src/server/app/config-server.ts similarity index 100% rename from src/app/config-server.ts rename to src/server/app/config-server.ts diff --git a/src/app/server.ts b/src/server/app/server.ts similarity index 100% rename from src/app/server.ts rename to src/server/app/server.ts diff --git a/src/app/short-handler.ts b/src/server/app/short-handler.ts similarity index 100% rename from src/app/short-handler.ts rename to src/server/app/short-handler.ts From e9823224e1846f39c7a62ad7e90e13ed920b0366 Mon Sep 17 00:00:00 2001 From: donneko <117331095+donneko@users.noreply.github.com> Date: Wed, 24 Jun 2026 15:58:49 +0900 Subject: [PATCH 2/5] =?UTF-8?q?fix=20npm=20tarball=E5=85=AC=E9=96=8B?= =?UTF-8?q?=E7=AF=84=E5=9B=B2=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 1b05f7d..b321aac 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,8 @@ "types": "./dist/index.d.ts", "files": [ "dist", - "docs", + "docs/*.md", + "docs/src", "LICENSE", "README.md", "CHANGELOG.md", From d9f22077cf360e04ac9be787f851c0c1b6e4336c Mon Sep 17 00:00:00 2001 From: donneko <117331095+donneko@users.noreply.github.com> Date: Wed, 24 Jun 2026 16:13:48 +0900 Subject: [PATCH 3/5] fix #24 --- scripts/logger.ts | 237 ------------------ scripts/testPlayground.ts | 4 +- src/cli/command/config/service/next-steps.ts | 4 +- src/cli/command/create/service/next-steps.ts | 4 +- src/cli/command/init/service/next-steps.ts | 4 +- src/cli/command/start.ts | 2 +- src/cli/service/template-copy/app/app.ts | 3 +- .../template-copy/shell/create-copy-result.ts | 6 +- .../template-copy/shell/project-name.ts | 3 +- .../template-copy/shell/template.path.ts | 3 +- src/config/tyoi.config.ts | 2 +- src/config/tyoi.default.config.ts | 2 +- src/config/tyoi.dev.config.ts | 2 +- src/server/app/config-server.ts | 4 +- src/server/app/server.ts | 35 ++- src/server/app/short-handler.ts | 4 +- src/service/find-available-port.ts | 2 +- src/service/open-browser.ts | 2 +- src/service/server-logger.ts | 18 +- src/service/server-start-summary.ts | 2 +- src/types/inner.event-bus.type.ts | 4 +- src/types/out.event-bus.type.ts | 4 +- src/util/logger.ts | 237 ------------------ 23 files changed, 68 insertions(+), 520 deletions(-) delete mode 100644 scripts/logger.ts delete mode 100644 src/util/logger.ts diff --git a/scripts/logger.ts b/scripts/logger.ts deleted file mode 100644 index 79a77dc..0000000 --- a/scripts/logger.ts +++ /dev/null @@ -1,237 +0,0 @@ -import pc from "picocolors"; -import stringWidth from "string-width"; -import stripAnsi from "strip-ansi"; - -function getWidth(): number { - const number = Number(process.env.COLUMNS); - const envColumns = Number.isFinite(number) ? number : null; - - return process.stdout.columns ?? envColumns ?? 80; -} - -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]; - - let fixedTextList: string[] = []; - const headerLength = stringWidth( - stripAnsi(textList[0] ?? "").match(/\[[a-zA-Z1-9]*\]\s/)?.[0] ?? "" - ); - - for (const text of textList) { - const index = textList.indexOf(text); - - const calcAnsiLengthValue = calcAnsiLength(text); - const textWidth = stringWidth(text); - const overContent = Math.ceil(textWidth / width); - const overHeader = (overContent - 1) * headerLength; - const textLength = textWidth - headerLength + overHeader + calcAnsiLengthValue; - - let fixedText = []; - - 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); - - const tmp = `${prefix}${text.slice(i, i + end)}`; - fixedText.push(tmp); - i += width; - } - fixedTextList = fixedTextList.concat(fixedText); - } - return fixedTextList; -} - -type CreateData = { - type: string; - message: string; - createMessage: string; -}; - -export type LoggerCreateData = { - type: string; - message: string; - createMessage: string; - date: number; -}; - -function createData(data: CreateData): LoggerCreateData { - return { - ...data, - date: Date.now(), - }; -} - -class Logger { - #addStdout(obj: LoggerCreateData) { - const { createMessage, ...stdoutObj } = obj; - process.stdout.write(JSON.stringify(stdoutObj)); - } - #addStderr(message: string) { - const out = message.endsWith("\n") ? message : message + "\n"; - process.stderr.write(out); - } - #loggerSelectProcess(data: LoggerCreateData) { - if (process.stdout.isTTY) { - this.#addStderr(data.createMessage); - } else { - this.#addStdout(data); - } - - return data; - } - - info(message: string): LoggerCreateData { - const data = this.createInfo(message); - return this.#loggerSelectProcess(data); - } - createInfo(message: string): LoggerCreateData { - const obj = createData({ - type: "INFO", - message: `[INFO] ${message}`, - createMessage: `${pc.blueBright("[INFO]")} ${message}`, - }); - return obj; - } - - warn(message: string): LoggerCreateData { - const data = this.createWarn(message); - return this.#loggerSelectProcess(data); - } - createWarn(message: string): LoggerCreateData { - const obj = createData({ - type: "WARN", - message: `[WARN] ${message}`, - createMessage: `${pc.yellow("[WARN]")} ${message}`, - }); - return obj; - } - - error(message: string): LoggerCreateData { - const data = this.createError(message); - - return this.#loggerSelectProcess(data); - } - createError(message: string): LoggerCreateData { - const obj = createData({ - type: "ERROR", - message: `[ERROR] ${message}`, - createMessage: `${pc.red("[ERROR]")} ${message}`, - }); - - return obj; - } - - success(message: string): LoggerCreateData { - const data = this.createSuccess(message); - return this.#loggerSelectProcess(data); - } - createSuccess(message: string): LoggerCreateData { - const obj = createData({ - type: "SUCCESS", - message: `[SUCCESS] ${message}`, - createMessage: `${pc.green("[SUCCESS]")} ${message}`, - }); - return obj; - } - - process(message: string): LoggerCreateData { - const data = this.createProcess(message); - return this.#loggerSelectProcess(data); - } - createProcess(message: string): LoggerCreateData { - const obj = createData({ - type: "PROCESS", - message: `[PROCESS] ${message}`, - createMessage: `${pc.magentaBright("[PROCESS]")} ${message}`, - }); - return obj; - } - - message(message: string): LoggerCreateData { - const data = this.createMessage(message); - return this.#loggerSelectProcess(data); - } - createMessage(message: string): LoggerCreateData { - const obj = createData({ - type: "MESSAGE", - message: `[MESSAGE] ${message}`, - createMessage: `${pc.gray("[MESSAGE]")} ${message}`, - }); - return obj; - } - - system(message: string): LoggerCreateData { - const data = this.createSystem(message); - return this.#loggerSelectProcess(data); - } - createSystem(message: string): LoggerCreateData { - const obj = createData({ - type: "SYSTEM", - message: `[SYSTEM] ${message}`, - createMessage: `${pc.magentaBright("[SYSTEM]")} ${message}`, - }); - return obj; - } - - bar(): LoggerCreateData { - const data = this.createBar(); - return this.#loggerSelectProcess(data); - } - createBar(): LoggerCreateData { - const width = getWidth(); - const line = `${"─".repeat(width - 2)}`; - const obj = createData({ - type: "BAR", - message: line, - createMessage: line, - }); - return obj; - } - - 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 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)); - }); - - this.#addStderr(`├${"─".repeat(width - 2)}┤`); - - 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(); diff --git a/scripts/testPlayground.ts b/scripts/testPlayground.ts index 3238abd..a8ce794 100644 --- a/scripts/testPlayground.ts +++ b/scripts/testPlayground.ts @@ -1,7 +1,7 @@ import path from "node:path"; import { spawnSync } from "node:child_process"; import { undoPlayground } from "./undoPlayground.js"; -import { logger } from "./logger.js"; +import { Logger } from "@donneko/tyoi-logger"; const PLAYGROUND_PASS = "../test/playground"; @@ -48,6 +48,8 @@ function main() { const results = testCLI(playgroundPath); + const logger = new Logger(); + const summary = logger.createInfo( (() => { const ok = results.filter((r) => r.ok); diff --git a/src/cli/command/config/service/next-steps.ts b/src/cli/command/config/service/next-steps.ts index 0aa0106..7487455 100644 --- a/src/cli/command/config/service/next-steps.ts +++ b/src/cli/command/config/service/next-steps.ts @@ -1,6 +1,8 @@ -import { logger } from "../../../../util/logger.js"; +import { Logger } from "@donneko/tyoi-logger"; export function showNextSteps(): void { + const logger = new Logger(); + logger.bar(); logger.success("次のコマンドで起動できます。"); logger.info("npx tyoi run"); diff --git a/src/cli/command/create/service/next-steps.ts b/src/cli/command/create/service/next-steps.ts index 51d63bd..e213c4f 100644 --- a/src/cli/command/create/service/next-steps.ts +++ b/src/cli/command/create/service/next-steps.ts @@ -1,6 +1,8 @@ -import { logger } from "../../../../util/logger.js"; +import { Logger } from "@donneko/tyoi-logger"; export function showNextSteps(projectName: string): void { + const logger = new Logger(); + logger.bar(); logger.success("次のコマンドで起動できます。"); logger.info(`cd ${projectName}`); diff --git a/src/cli/command/init/service/next-steps.ts b/src/cli/command/init/service/next-steps.ts index eb50cc8..31fdcfb 100644 --- a/src/cli/command/init/service/next-steps.ts +++ b/src/cli/command/init/service/next-steps.ts @@ -1,6 +1,8 @@ -import { logger } from "../../../../util/logger.js"; +import { Logger } from "@donneko/tyoi-logger"; export function showNextSteps(): void { + const logger = new Logger(); + logger.bar(); logger.success("次のコマンドで起動できます。"); logger.info("npm install"); diff --git a/src/cli/command/start.ts b/src/cli/command/start.ts index 3612cce..7ac1bf6 100644 --- a/src/cli/command/start.ts +++ b/src/cli/command/start.ts @@ -1,6 +1,6 @@ import path from "node:path"; import { pathToFileURL } from "node:url"; -import { Server } from "../../app/server.js"; +import { Server } from "../../server/app/server.js"; import type { CmdMetaData } from "../types/tyoi-cli.js"; import { askSelect } from "../../service/ask-select.js"; import { scanConfigFiles } from "../../service/scan-config-files.js"; diff --git a/src/cli/service/template-copy/app/app.ts b/src/cli/service/template-copy/app/app.ts index 4f7ae1f..b8bef59 100644 --- a/src/cli/service/template-copy/app/app.ts +++ b/src/cli/service/template-copy/app/app.ts @@ -6,7 +6,7 @@ import { createCopyResult } from "../shell/create-copy-result.js"; import fs from "node:fs"; import path from "node:path"; -import { logger } from "../../../../util/logger.js"; +import { Logger } from "@donneko/tyoi-logger"; type AppTemplateCopyDestination = "target" | "target-project"; @@ -61,6 +61,7 @@ export async function appTemplateCopy(data: AppTemplateCopyData): Promise[]; } { + const logger = new Logger(); + return { title: "コピー結果", content: [ diff --git a/src/cli/service/template-copy/shell/project-name.ts b/src/cli/service/template-copy/shell/project-name.ts index 5a1ee97..a04205a 100644 --- a/src/cli/service/template-copy/shell/project-name.ts +++ b/src/cli/service/template-copy/shell/project-name.ts @@ -1,6 +1,6 @@ import path from "node:path"; import { askInput } from "../../../../service/ask-input.js"; -import { logger } from "../../../../util/logger.js"; +import { Logger } from "@donneko/tyoi-logger"; import { isValidProjectName } from "../core/is-valid-project-name.js"; export async function getProjectName( @@ -8,6 +8,7 @@ export async function getProjectName( target: string ): Promise { let projectName = inputName; + const logger = new Logger(); if (!projectName) { const defaultName = path.basename(target); diff --git a/src/cli/service/template-copy/shell/template.path.ts b/src/cli/service/template-copy/shell/template.path.ts index a044e55..a4770d9 100644 --- a/src/cli/service/template-copy/shell/template.path.ts +++ b/src/cli/service/template-copy/shell/template.path.ts @@ -1,7 +1,7 @@ import path from "node:path"; import { askSelect } from "../../../../service/ask-select.js"; import { readDirectory } from "../../../../util/read-directory.js"; -import { logger } from "../../../../util/logger.js"; +import { Logger } from "@donneko/tyoi-logger"; import { isValidTemplate } from "../core/is-valid-template.js"; export async function getTemplatePath( @@ -11,6 +11,7 @@ export async function getTemplatePath( ): Promise { const readPath = path.join(base, templatePath); const templateFiles = await readDirectory(readPath, false); + const logger = new Logger(); let template = templateName; diff --git a/src/config/tyoi.config.ts b/src/config/tyoi.config.ts index 2ff3e1f..967a63c 100644 --- a/src/config/tyoi.config.ts +++ b/src/config/tyoi.config.ts @@ -1,4 +1,4 @@ -import { defineConfig } from "../app/config-server.js"; +import { defineConfig } from "../server/app/config-server.js"; export default defineConfig({ port: 3000, diff --git a/src/config/tyoi.default.config.ts b/src/config/tyoi.default.config.ts index 1de65e1..12eedf3 100644 --- a/src/config/tyoi.default.config.ts +++ b/src/config/tyoi.default.config.ts @@ -1,4 +1,4 @@ -import { defineDefaultConfig } from "../app/config-server.js"; +import { defineDefaultConfig } from "../server/app/config-server.js"; export default defineDefaultConfig({ port: 3000, diff --git a/src/config/tyoi.dev.config.ts b/src/config/tyoi.dev.config.ts index 42590fd..090dfdb 100644 --- a/src/config/tyoi.dev.config.ts +++ b/src/config/tyoi.dev.config.ts @@ -1,4 +1,4 @@ -import { defineConfig } from "../app/config-server.js"; +import { defineConfig } from "../server/app/config-server.js"; import morgan from "morgan"; diff --git a/src/server/app/config-server.ts b/src/server/app/config-server.ts index 397fea6..a6952bb 100644 --- a/src/server/app/config-server.ts +++ b/src/server/app/config-server.ts @@ -1,5 +1,5 @@ -import { serverDefaultConfigSchema, serverUserConfigSchema } from "../types/config.type.js"; -import type { ServerUserConfig, ServerDefaultConfig } from "../types/config.type.js"; +import { serverDefaultConfigSchema, serverUserConfigSchema } from "../../types/config.type.js"; +import type { ServerUserConfig, ServerDefaultConfig } from "../../types/config.type.js"; export function defineConfig(config: ServerUserConfig) { return serverUserConfigSchema.parse(config); diff --git a/src/server/app/server.ts b/src/server/app/server.ts index 20b8784..ae9d10b 100644 --- a/src/server/app/server.ts +++ b/src/server/app/server.ts @@ -1,27 +1,26 @@ 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 { logger } from "../util/logger.js"; -import { findAvailablePort } from "../service/find-available-port.js"; +import { pathNormalization } from "../../service/path-normalization.js"; +import { ApiRegistry, ApiRegistryHandler } from "../../util/api-registry.js"; +import { findAvailablePort } from "../../service/find-available-port.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 { 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"; -import { ServicesRegister } from "../util/services-register.js"; -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"; +} 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 { 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"; +import { ServicesRegister } from "../../util/services-register.js"; +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"; export type RequestData = { query: unknown; @@ -235,7 +234,7 @@ export class Server< if (this.#isShuttingDown) return; this.#isShuttingDown = true; - logger.bar(); + this.#serverLogger.logger("bar"); this.#serverLogger.logger( "process", this.#serverServicesRegister.get("systemMetaManager").getMeta(100).message diff --git a/src/server/app/short-handler.ts b/src/server/app/short-handler.ts index 9005da5..e4572ea 100644 --- a/src/server/app/short-handler.ts +++ b/src/server/app/short-handler.ts @@ -1,6 +1,6 @@ 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 { ApiRegistryHandler } from "../../util/api-registry.js"; +import type { WsHandler } from "../../service/web-socket-router.js"; import http from "node:http"; class shortHandler { diff --git a/src/service/find-available-port.ts b/src/service/find-available-port.ts index e24789e..ed9469d 100644 --- a/src/service/find-available-port.ts +++ b/src/service/find-available-port.ts @@ -1,7 +1,7 @@ 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 "../server/app/server.js"; type FindPortData = { startPort: number; diff --git a/src/service/open-browser.ts b/src/service/open-browser.ts index c8275de..4f84217 100644 --- a/src/service/open-browser.ts +++ b/src/service/open-browser.ts @@ -2,7 +2,7 @@ import open from "open"; import { getLanIp } from "../util/get-lan-ip.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 "../server/app/server.js"; type OpenBrowserData = { host: string; diff --git a/src/service/server-logger.ts b/src/service/server-logger.ts index b866db7..07eaaea 100644 --- a/src/service/server-logger.ts +++ b/src/service/server-logger.ts @@ -1,7 +1,13 @@ +import { Logger } from "@donneko/tyoi-logger"; + 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 { logger } from "../util/logger.js"; + +const logger = new Logger(); +type LoggerMethodName = { + [K in keyof Logger]: Logger[K] extends (...args: never[]) => unknown ? K : never; +}[keyof Logger]; export class ServerLogger { #innerEventBus!: EventBus; @@ -10,13 +16,13 @@ export class ServerLogger { this.#innerEventBus = eventBus; this.#outEventBus = outBus; } - logger( + logger( type: K, - ...args: Parameters<(typeof logger)[K]> - ): ReturnType<(typeof logger)[K]> { + ...args: Parameters + ): ReturnType { const fn = logger[type] as ( - ...args: Parameters<(typeof logger)[K]> - ) => ReturnType<(typeof logger)[K]>; + ...args: Parameters + ) => ReturnType; const data = fn.call(logger, ...args); this.#innerEventBus.emit("server/*:log", data); diff --git a/src/service/server-start-summary.ts b/src/service/server-start-summary.ts index a36e072..bcd347b 100644 --- a/src/service/server-start-summary.ts +++ b/src/service/server-start-summary.ts @@ -2,7 +2,7 @@ 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 "../server/app/server.js"; type SummaryData = { host: string; diff --git a/src/types/inner.event-bus.type.ts b/src/types/inner.event-bus.type.ts index 1e3e843..5908a3b 100644 --- a/src/types/inner.event-bus.type.ts +++ b/src/types/inner.event-bus.type.ts @@ -1,4 +1,6 @@ -import type { LoggerCreateData } from "../util/logger.js"; +import type { Logger } from "@donneko/tyoi-logger"; + +type LoggerCreateData = ReturnType; export type InnerEventBusMap = { "server/*:log": LoggerCreateData | void; diff --git a/src/types/out.event-bus.type.ts b/src/types/out.event-bus.type.ts index c181418..3253177 100644 --- a/src/types/out.event-bus.type.ts +++ b/src/types/out.event-bus.type.ts @@ -1,4 +1,6 @@ -import type { LoggerCreateData } from "../util/logger.js"; +import type { Logger } from "@donneko/tyoi-logger"; + +type LoggerCreateData = ReturnType; export type OutEventBusMap = { "server/*:log": LoggerCreateData | void; diff --git a/src/util/logger.ts b/src/util/logger.ts deleted file mode 100644 index 79a77dc..0000000 --- a/src/util/logger.ts +++ /dev/null @@ -1,237 +0,0 @@ -import pc from "picocolors"; -import stringWidth from "string-width"; -import stripAnsi from "strip-ansi"; - -function getWidth(): number { - const number = Number(process.env.COLUMNS); - const envColumns = Number.isFinite(number) ? number : null; - - return process.stdout.columns ?? envColumns ?? 80; -} - -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]; - - let fixedTextList: string[] = []; - const headerLength = stringWidth( - stripAnsi(textList[0] ?? "").match(/\[[a-zA-Z1-9]*\]\s/)?.[0] ?? "" - ); - - for (const text of textList) { - const index = textList.indexOf(text); - - const calcAnsiLengthValue = calcAnsiLength(text); - const textWidth = stringWidth(text); - const overContent = Math.ceil(textWidth / width); - const overHeader = (overContent - 1) * headerLength; - const textLength = textWidth - headerLength + overHeader + calcAnsiLengthValue; - - let fixedText = []; - - 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); - - const tmp = `${prefix}${text.slice(i, i + end)}`; - fixedText.push(tmp); - i += width; - } - fixedTextList = fixedTextList.concat(fixedText); - } - return fixedTextList; -} - -type CreateData = { - type: string; - message: string; - createMessage: string; -}; - -export type LoggerCreateData = { - type: string; - message: string; - createMessage: string; - date: number; -}; - -function createData(data: CreateData): LoggerCreateData { - return { - ...data, - date: Date.now(), - }; -} - -class Logger { - #addStdout(obj: LoggerCreateData) { - const { createMessage, ...stdoutObj } = obj; - process.stdout.write(JSON.stringify(stdoutObj)); - } - #addStderr(message: string) { - const out = message.endsWith("\n") ? message : message + "\n"; - process.stderr.write(out); - } - #loggerSelectProcess(data: LoggerCreateData) { - if (process.stdout.isTTY) { - this.#addStderr(data.createMessage); - } else { - this.#addStdout(data); - } - - return data; - } - - info(message: string): LoggerCreateData { - const data = this.createInfo(message); - return this.#loggerSelectProcess(data); - } - createInfo(message: string): LoggerCreateData { - const obj = createData({ - type: "INFO", - message: `[INFO] ${message}`, - createMessage: `${pc.blueBright("[INFO]")} ${message}`, - }); - return obj; - } - - warn(message: string): LoggerCreateData { - const data = this.createWarn(message); - return this.#loggerSelectProcess(data); - } - createWarn(message: string): LoggerCreateData { - const obj = createData({ - type: "WARN", - message: `[WARN] ${message}`, - createMessage: `${pc.yellow("[WARN]")} ${message}`, - }); - return obj; - } - - error(message: string): LoggerCreateData { - const data = this.createError(message); - - return this.#loggerSelectProcess(data); - } - createError(message: string): LoggerCreateData { - const obj = createData({ - type: "ERROR", - message: `[ERROR] ${message}`, - createMessage: `${pc.red("[ERROR]")} ${message}`, - }); - - return obj; - } - - success(message: string): LoggerCreateData { - const data = this.createSuccess(message); - return this.#loggerSelectProcess(data); - } - createSuccess(message: string): LoggerCreateData { - const obj = createData({ - type: "SUCCESS", - message: `[SUCCESS] ${message}`, - createMessage: `${pc.green("[SUCCESS]")} ${message}`, - }); - return obj; - } - - process(message: string): LoggerCreateData { - const data = this.createProcess(message); - return this.#loggerSelectProcess(data); - } - createProcess(message: string): LoggerCreateData { - const obj = createData({ - type: "PROCESS", - message: `[PROCESS] ${message}`, - createMessage: `${pc.magentaBright("[PROCESS]")} ${message}`, - }); - return obj; - } - - message(message: string): LoggerCreateData { - const data = this.createMessage(message); - return this.#loggerSelectProcess(data); - } - createMessage(message: string): LoggerCreateData { - const obj = createData({ - type: "MESSAGE", - message: `[MESSAGE] ${message}`, - createMessage: `${pc.gray("[MESSAGE]")} ${message}`, - }); - return obj; - } - - system(message: string): LoggerCreateData { - const data = this.createSystem(message); - return this.#loggerSelectProcess(data); - } - createSystem(message: string): LoggerCreateData { - const obj = createData({ - type: "SYSTEM", - message: `[SYSTEM] ${message}`, - createMessage: `${pc.magentaBright("[SYSTEM]")} ${message}`, - }); - return obj; - } - - bar(): LoggerCreateData { - const data = this.createBar(); - return this.#loggerSelectProcess(data); - } - createBar(): LoggerCreateData { - const width = getWidth(); - const line = `${"─".repeat(width - 2)}`; - const obj = createData({ - type: "BAR", - message: line, - createMessage: line, - }); - return obj; - } - - 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 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)); - }); - - this.#addStderr(`├${"─".repeat(width - 2)}┤`); - - 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(); From 70e8f0897f7814a45dcd7e069c0bfb4cc980aa1a Mon Sep 17 00:00:00 2001 From: donneko <117331095+donneko@users.noreply.github.com> Date: Wed, 24 Jun 2026 16:24:36 +0900 Subject: [PATCH 4/5] fix #23 --- scripts/testPlayground.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/scripts/testPlayground.ts b/scripts/testPlayground.ts index a8ce794..1e27320 100644 --- a/scripts/testPlayground.ts +++ b/scripts/testPlayground.ts @@ -32,11 +32,15 @@ function testCLI(playgroundPath: string): { args: string[]; ok: boolean }[] { run(["help"]); run(["info"]); - run(["init"]); + run(["init", " my-app", "--template", "basic-ts"]); undo(); - run(["create"]); + run(["init", " my-app", "--template", "basic-js"]); undo(); - run(["config"]); + run(["create", " my-app", "--template", "basic-ts"]); + undo(); + run(["create", " my-app", "--template", "basic-js"]); + undo(); + run(["config", "--template", "basic"]); run(["run"], 3000); run(["dev"], 3000); From 5464c8d4cb6cd8fbd5ded99babc76fd7596bd8e4 Mon Sep 17 00:00:00 2001 From: donneko <117331095+donneko@users.noreply.github.com> Date: Wed, 24 Jun 2026 16:30:57 +0900 Subject: [PATCH 5/5] =?UTF-8?q?ci=20test=20=E3=81=AE=20check:format:check?= =?UTF-8?q?=20=E6=B6=88=E5=8E=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/deploy-test.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/deploy-test.yml b/.github/workflows/deploy-test.yml index e6cd08b..008dc3b 100644 --- a/.github/workflows/deploy-test.yml +++ b/.github/workflows/deploy-test.yml @@ -26,9 +26,6 @@ jobs: - 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