@clazic/kordoc 2.5.0 → 2.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/batch-provider-XRF6F26E.js +234 -0
- package/dist/batch-provider-XRF6F26E.js.map +1 -0
- package/dist/{chunk-NKUNXGWI.js → chunk-25ZYYLVP.js} +8 -6
- package/dist/chunk-25ZYYLVP.js.map +1 -0
- package/dist/{chunk-IJGNPAK2.js → chunk-5CILZHRW.js} +2 -2
- package/dist/chunk-S7BHLD2V.js +200 -0
- package/dist/{chunk-Y4WFKJ5P.js.map → chunk-S7BHLD2V.js.map} +1 -1
- package/dist/cli.js +6 -38
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +473 -2816
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +482 -2826
- package/dist/index.js.map +1 -1
- package/dist/mcp.js +3 -6
- package/dist/mcp.js.map +1 -1
- package/dist/{resolve-XWYJYKKH.js → resolve-ZSUEJK3E.js} +4 -4
- package/dist/{utils-RBXHHCLI.js → utils-H2BL5GNR.js} +2 -2
- package/dist/{watch-FRLS6FKE.js → watch-D6ODQLPJ.js} +4 -7
- package/dist/{watch-FRLS6FKE.js.map → watch-D6ODQLPJ.js.map} +1 -1
- package/package.json +3 -7
- package/dist/batch-provider-5BFJRKAZ.js +0 -190
- package/dist/batch-provider-5BFJRKAZ.js.map +0 -1
- package/dist/chunk-AEWWERJ5.js +0 -35
- package/dist/chunk-AEWWERJ5.js.map +0 -1
- package/dist/chunk-CPTOBJJD.js +0 -125
- package/dist/chunk-CPTOBJJD.js.map +0 -1
- package/dist/chunk-NKUNXGWI.js.map +0 -1
- package/dist/chunk-THBLCND6.js +0 -33
- package/dist/chunk-THBLCND6.js.map +0 -1
- package/dist/chunk-Y4WFKJ5P.js +0 -167
- package/dist/doctor-SJ7NYSXC.js +0 -126
- package/dist/doctor-SJ7NYSXC.js.map +0 -1
- package/dist/install-commands-P2KTEXQ4.js +0 -11
- package/dist/pm-7KGLH6MX.js +0 -9
- package/dist/pm-7KGLH6MX.js.map +0 -1
- package/dist/setup/doctor.cjs +0 -308
- package/dist/setup/doctor.js +0 -288
- package/dist/utils-RBXHHCLI.js.map +0 -1
- package/scripts/postinstall.cjs +0 -27
- /package/dist/{chunk-IJGNPAK2.js.map → chunk-5CILZHRW.js.map} +0 -0
- /package/dist/{resolve-XWYJYKKH.js.map → resolve-ZSUEJK3E.js.map} +0 -0
- /package/dist/{install-commands-P2KTEXQ4.js.map → utils-H2BL5GNR.js.map} +0 -0
package/dist/chunk-CPTOBJJD.js
DELETED
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
__require
|
|
4
|
-
} from "./chunk-ZWE3DS7E.js";
|
|
5
|
-
|
|
6
|
-
// src/setup/detect.ts
|
|
7
|
-
import { spawnSync } from "child_process";
|
|
8
|
-
import { existsSync } from "fs";
|
|
9
|
-
import { join } from "path";
|
|
10
|
-
var isWin = process.platform === "win32";
|
|
11
|
-
function which(cmd) {
|
|
12
|
-
const finder = isWin ? "where" : "which";
|
|
13
|
-
const r = spawnSync(finder, [cmd], { encoding: "utf8", shell: isWin });
|
|
14
|
-
if (r.status !== 0) return void 0;
|
|
15
|
-
return r.stdout.split(/\r?\n/).find(Boolean)?.trim();
|
|
16
|
-
}
|
|
17
|
-
function resolveCmd(cmd, envKey) {
|
|
18
|
-
const override = process.env[envKey];
|
|
19
|
-
if (override) return override;
|
|
20
|
-
const found = which(cmd);
|
|
21
|
-
if (found) return found;
|
|
22
|
-
if (isWin) return findWinCandidate(cmd);
|
|
23
|
-
return void 0;
|
|
24
|
-
}
|
|
25
|
-
function findWinCandidate(cmd) {
|
|
26
|
-
const exe = cmd.endsWith(".exe") ? cmd : `${cmd}.exe`;
|
|
27
|
-
const userProfile = process.env["USERPROFILE"] ?? "C:\\Users\\Default";
|
|
28
|
-
const localAppData = process.env["LOCALAPPDATA"] ?? join(userProfile, "AppData", "Local");
|
|
29
|
-
const programFiles = process.env["ProgramFiles"] ?? "C:\\Program Files";
|
|
30
|
-
const programFilesX86 = process.env["ProgramFiles(x86)"] ?? "C:\\Program Files (x86)";
|
|
31
|
-
const isPopplerExe = ["pdftoppm.exe", "pdfinfo.exe", "pdftotext.exe"].includes(exe);
|
|
32
|
-
const isSoffice = exe === "soffice.exe";
|
|
33
|
-
if (isPopplerExe) return findPopplerWin(exe, { userProfile, localAppData, programFiles, programFilesX86 });
|
|
34
|
-
if (isSoffice) return findSofficeWin({ programFiles, programFilesX86, localAppData });
|
|
35
|
-
return void 0;
|
|
36
|
-
}
|
|
37
|
-
function findPopplerWin(exe, p) {
|
|
38
|
-
const scoopPath = join(p.userProfile, "scoop", "apps", "poppler", "current", "bin", exe);
|
|
39
|
-
if (existsSync(scoopPath)) return scoopPath;
|
|
40
|
-
const wingetBase = join(p.localAppData, "Microsoft", "WinGet", "Packages");
|
|
41
|
-
const wingetResult = globFirst(wingetBase, ["oschwartz10612.Poppler_*"], ["poppler-*", "Library", "bin", exe]);
|
|
42
|
-
if (wingetResult) return wingetResult;
|
|
43
|
-
const chocoBase = join("C:", "ProgramData", "chocolatey", "lib", "poppler", "tools");
|
|
44
|
-
const chocoResult = globFirst(chocoBase, ["poppler-*"], ["bin", exe]);
|
|
45
|
-
if (chocoResult) return chocoResult;
|
|
46
|
-
for (const base of [
|
|
47
|
-
join("C:", "poppler", "bin", exe),
|
|
48
|
-
join("C:", "tools", "poppler", "bin", exe),
|
|
49
|
-
join(p.programFiles, "poppler", "bin", exe),
|
|
50
|
-
join(p.programFilesX86, "poppler", "bin", exe),
|
|
51
|
-
join(p.localAppData, "Programs", "poppler", "bin", exe)
|
|
52
|
-
]) {
|
|
53
|
-
if (existsSync(base)) return base;
|
|
54
|
-
}
|
|
55
|
-
return void 0;
|
|
56
|
-
}
|
|
57
|
-
function findSofficeWin(p) {
|
|
58
|
-
for (const candidate of [
|
|
59
|
-
join(p.programFiles, "LibreOffice", "program", "soffice.exe"),
|
|
60
|
-
join(p.programFilesX86, "LibreOffice", "program", "soffice.exe"),
|
|
61
|
-
join(p.localAppData, "Programs", "LibreOffice", "program", "soffice.exe"),
|
|
62
|
-
// winget 설치는 Program Files와 동일
|
|
63
|
-
join(p.programFiles, "LibreOffice 24", "program", "soffice.exe"),
|
|
64
|
-
join(p.programFiles, "LibreOffice 25", "program", "soffice.exe")
|
|
65
|
-
]) {
|
|
66
|
-
if (existsSync(candidate)) return candidate;
|
|
67
|
-
}
|
|
68
|
-
return void 0;
|
|
69
|
-
}
|
|
70
|
-
function globFirst(base, wildcardSegments, rest) {
|
|
71
|
-
if (!existsSync(base)) return void 0;
|
|
72
|
-
let current = base;
|
|
73
|
-
for (const seg of wildcardSegments) {
|
|
74
|
-
if (!seg.includes("*")) {
|
|
75
|
-
current = join(current, seg);
|
|
76
|
-
if (!existsSync(current)) return void 0;
|
|
77
|
-
continue;
|
|
78
|
-
}
|
|
79
|
-
try {
|
|
80
|
-
const { readdirSync } = __require("fs");
|
|
81
|
-
const entries = readdirSync(current);
|
|
82
|
-
const pattern = seg.replace(/\*/g, ".*");
|
|
83
|
-
const re = new RegExp(`^${pattern}$`, "i");
|
|
84
|
-
const match = entries.find((e) => re.test(e));
|
|
85
|
-
if (!match) return void 0;
|
|
86
|
-
current = join(current, match);
|
|
87
|
-
} catch {
|
|
88
|
-
return void 0;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
const final = join(current, ...rest);
|
|
92
|
-
return existsSync(final) ? final : void 0;
|
|
93
|
-
}
|
|
94
|
-
function probe(cmd, envKey, versionArgs = ["--version"]) {
|
|
95
|
-
const resolvedPath = resolveCmd(cmd, envKey);
|
|
96
|
-
if (!resolvedPath) return { name: cmd, found: false };
|
|
97
|
-
const v = spawnSync(resolvedPath, versionArgs, { encoding: "utf8", shell: isWin });
|
|
98
|
-
const versionLine = (v.stdout || v.stderr).split(/\r?\n/)[0]?.trim();
|
|
99
|
-
return { name: cmd, found: true, path: resolvedPath, version: versionLine };
|
|
100
|
-
}
|
|
101
|
-
function probeOcrToolchain() {
|
|
102
|
-
return {
|
|
103
|
-
// poppler는 --version이 비표준이므로 -v 사용
|
|
104
|
-
pdftoppm: probe("pdftoppm", "KORDOC_PDFTOPPM_PATH", ["-v"]),
|
|
105
|
-
pdfinfo: probe("pdfinfo", "KORDOC_PDFINFO_PATH", ["-v"]),
|
|
106
|
-
pdftotext: probe("pdftotext", "KORDOC_PDFTOTEXT_PATH", ["-v"]),
|
|
107
|
-
soffice: probe("soffice", "KORDOC_SOFFICE_PATH", ["--version"])
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
function isWSL() {
|
|
111
|
-
if (process.platform !== "linux") return false;
|
|
112
|
-
try {
|
|
113
|
-
const { readFileSync } = __require("fs");
|
|
114
|
-
const version = readFileSync("/proc/version", "utf8");
|
|
115
|
-
return /microsoft|wsl/i.test(version);
|
|
116
|
-
} catch {
|
|
117
|
-
return false;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
export {
|
|
122
|
-
probeOcrToolchain,
|
|
123
|
-
isWSL
|
|
124
|
-
};
|
|
125
|
-
//# sourceMappingURL=chunk-CPTOBJJD.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/setup/detect.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\"\nimport { existsSync } from \"node:fs\"\nimport { join } from \"node:path\"\n\nexport interface ToolStatus {\n name: string\n found: boolean\n path?: string\n version?: string\n}\n\nconst isWin = process.platform === \"win32\"\n\nfunction which(cmd: string): string | undefined {\n const finder = isWin ? \"where\" : \"which\"\n const r = spawnSync(finder, [cmd], { encoding: \"utf8\", shell: isWin })\n if (r.status !== 0) return undefined\n return r.stdout.split(/\\r?\\n/).find(Boolean)?.trim()\n}\n\n/** 환경변수 override → PATH 탐색 → Windows 후보 경로 순으로 감지 */\nfunction resolveCmd(cmd: string, envKey: string): string | undefined {\n const override = process.env[envKey]\n if (override) return override\n\n const found = which(cmd)\n if (found) return found\n\n if (isWin) return findWinCandidate(cmd)\n return undefined\n}\n\n/**\n * Windows에서 PATH 미등록 설치 경로를 와일드카드 방식으로 탐색.\n * scoop / winget / choco / 수동 설치 경로를 순서대로 시도.\n */\nfunction findWinCandidate(cmd: string): string | undefined {\n const exe = cmd.endsWith(\".exe\") ? cmd : `${cmd}.exe`\n const userProfile = process.env[\"USERPROFILE\"] ?? \"C:\\\\Users\\\\Default\"\n const localAppData = process.env[\"LOCALAPPDATA\"] ?? join(userProfile, \"AppData\", \"Local\")\n const programFiles = process.env[\"ProgramFiles\"] ?? \"C:\\\\Program Files\"\n const programFilesX86 = process.env[\"ProgramFiles(x86)\"] ?? \"C:\\\\Program Files (x86)\"\n\n const isPopplerExe = [\"pdftoppm.exe\", \"pdfinfo.exe\", \"pdftotext.exe\"].includes(exe)\n const isSoffice = exe === \"soffice.exe\"\n\n if (isPopplerExe) return findPopplerWin(exe, { userProfile, localAppData, programFiles, programFilesX86 })\n if (isSoffice) return findSofficeWin({ programFiles, programFilesX86, localAppData })\n return undefined\n}\n\ninterface WinPaths {\n userProfile: string\n localAppData: string\n programFiles: string\n programFilesX86: string\n}\n\nfunction findPopplerWin(exe: string, p: WinPaths): string | undefined {\n // scoop: %USERPROFILE%\\scoop\\apps\\poppler\\current\\bin\\\n const scoopPath = join(p.userProfile, \"scoop\", \"apps\", \"poppler\", \"current\", \"bin\", exe)\n if (existsSync(scoopPath)) return scoopPath\n\n // winget: %LOCALAPPDATA%\\Microsoft\\WinGet\\Packages\\oschwartz10612.Poppler_*\\poppler-*\\Library\\bin\\\n const wingetBase = join(p.localAppData, \"Microsoft\", \"WinGet\", \"Packages\")\n const wingetResult = globFirst(wingetBase, [\"oschwartz10612.Poppler_*\"], [\"poppler-*\", \"Library\", \"bin\", exe])\n if (wingetResult) return wingetResult\n\n // choco: C:\\ProgramData\\chocolatey\\lib\\poppler\\tools\\poppler-*\\bin\\\n const chocoBase = join(\"C:\", \"ProgramData\", \"chocolatey\", \"lib\", \"poppler\", \"tools\")\n const chocoResult = globFirst(chocoBase, [\"poppler-*\"], [\"bin\", exe])\n if (chocoResult) return chocoResult\n\n // 수동 설치 일반 경로\n for (const base of [\n join(\"C:\", \"poppler\", \"bin\", exe),\n join(\"C:\", \"tools\", \"poppler\", \"bin\", exe),\n join(p.programFiles, \"poppler\", \"bin\", exe),\n join(p.programFilesX86, \"poppler\", \"bin\", exe),\n join(p.localAppData, \"Programs\", \"poppler\", \"bin\", exe),\n ]) {\n if (existsSync(base)) return base\n }\n\n return undefined\n}\n\nfunction findSofficeWin(p: Pick<WinPaths, \"programFiles\" | \"programFilesX86\" | \"localAppData\">): string | undefined {\n for (const candidate of [\n join(p.programFiles, \"LibreOffice\", \"program\", \"soffice.exe\"),\n join(p.programFilesX86, \"LibreOffice\", \"program\", \"soffice.exe\"),\n join(p.localAppData, \"Programs\", \"LibreOffice\", \"program\", \"soffice.exe\"),\n // winget 설치는 Program Files와 동일\n join(p.programFiles, \"LibreOffice 24\", \"program\", \"soffice.exe\"),\n join(p.programFiles, \"LibreOffice 25\", \"program\", \"soffice.exe\"),\n ]) {\n if (existsSync(candidate)) return candidate\n }\n return undefined\n}\n\n/**\n * 와일드카드 패턴(*)이 포함된 단계적 경로를 첫 번째 매칭으로 resolve.\n * readdirSync로 해당 디렉토리 엔트리 중 패턴 매칭하는 첫 번째를 사용.\n */\nfunction globFirst(base: string, wildcardSegments: string[], rest: string[]): string | undefined {\n if (!existsSync(base)) return undefined\n\n let current = base\n for (const seg of wildcardSegments) {\n if (!seg.includes(\"*\")) {\n current = join(current, seg)\n if (!existsSync(current)) return undefined\n continue\n }\n try {\n const { readdirSync } = require(\"node:fs\") as typeof import(\"node:fs\")\n const entries = readdirSync(current)\n const pattern = seg.replace(/\\*/g, \".*\")\n const re = new RegExp(`^${pattern}$`, \"i\")\n const match = entries.find(e => re.test(e))\n if (!match) return undefined\n current = join(current, match)\n } catch {\n return undefined\n }\n }\n\n const final = join(current, ...rest)\n return existsSync(final) ? final : undefined\n}\n\nexport function probe(cmd: string, envKey: string, versionArgs: string[] = [\"--version\"]): ToolStatus {\n const resolvedPath = resolveCmd(cmd, envKey)\n if (!resolvedPath) return { name: cmd, found: false }\n\n const v = spawnSync(resolvedPath, versionArgs, { encoding: \"utf8\", shell: isWin })\n const versionLine = (v.stdout || v.stderr).split(/\\r?\\n/)[0]?.trim()\n return { name: cmd, found: true, path: resolvedPath, version: versionLine }\n}\n\nexport interface OcrToolchainStatus {\n pdftoppm: ToolStatus\n pdfinfo: ToolStatus\n pdftotext: ToolStatus\n soffice: ToolStatus\n}\n\nexport function probeOcrToolchain(): OcrToolchainStatus {\n return {\n // poppler는 --version이 비표준이므로 -v 사용\n pdftoppm: probe(\"pdftoppm\", \"KORDOC_PDFTOPPM_PATH\", [\"-v\"]),\n pdfinfo: probe(\"pdfinfo\", \"KORDOC_PDFINFO_PATH\", [\"-v\"]),\n pdftotext: probe(\"pdftotext\", \"KORDOC_PDFTOTEXT_PATH\", [\"-v\"]),\n soffice: probe(\"soffice\", \"KORDOC_SOFFICE_PATH\", [\"--version\"]),\n }\n}\n\n/** WSL 환경 여부 감지 (Node.js가 WSL 내부 Linux로 실행 중인지) */\nexport function isWSL(): boolean {\n if (process.platform !== \"linux\") return false\n try {\n const { readFileSync } = require(\"node:fs\") as typeof import(\"node:fs\")\n const version = readFileSync(\"/proc/version\", \"utf8\")\n return /microsoft|wsl/i.test(version)\n } catch {\n return false\n }\n}\n"],"mappings":"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","names":[]}
|