- 로직 삭제 = 서버 정본에서 바로(로직 줄 + 수식 문서 · `/logic/remove`) → 로직 목록 · 부르는 곳(다른 수식 문서 · 일위대가 조합 · M02 단가산출 바탕)이 있으면 확인 창 전에 막고 까닭(`/logic/users`) - 머리 단추 다섯 — [신규 로직] · [로직 복사/생성] · [로직 삭제] · [되돌림] · [저장] · [저장] 한 번 = 기본정보 + 수식 · [되돌림] = 둘 다 저장 뒤 상태 · 줄 쌓기 [고침 버림] · [수식 저장]은 M01 에서 걷음(M02 사본은 그대로) - 합계 상자 화면 아래 고정 · 원문 손잡이 브라우저 오른쪽 끝 - 왼쪽: 그룹 머리 한 줄(접어도 [+] · X 자리 그대로) · 「비우면 번호 없음」 · 가나다 체크 걷음 · 금액 줄 한 줄 배치 · 이름 단추 = 그 이름 찾은 찾기 창 · 수량 기호 = 값 + 출처 꼬리표 · [+] 메뉴(단가산출 · 율 · 식 · 근거 글 · 틀 찾기 걷음) · 식 글 눌러 그 자리 고침([식 고치기] 걷음) · 단위 = 공용 단위 고르기(친 글도 씀) · 만약 안 탄 갈래 숨김 - 오른쪽 기계 줄: 비목 수 링크 걷음 · 제목 줄 누름 = 시간당 경비 펼침 · 펼친 제목 보통 글 - 요소 키가 기호 이름으로 샌 것(`k_EQ0006`) — 변환기가 자원 이름으로(`k_하베스터`) · 수식 문서 다시 빌드(10 파일 · 78 기호 · 금액 같음) - 시험 페이지 `tools/line-stack-test` · main.py 마운트 · vite 프록시 · M01 왼쪽 「시험: 줄 쌓기」 걷음 - 단위 표준 표 읽기 = 로그인만(M02 일반 사용자 단위 목록) - 시험: test_804_7 새로 · 804_2 · 804_4 이음 글 고침(createStackScreen 줄 나뉨) · 552_3 여는 단추 기본 ⋯ 꼴로 고침(부르는 쪽이 [+] 로 바꿀 수 있음) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
83 lines
3.5 KiB
TypeScript
83 lines
3.5 KiB
TypeScript
import { resolve } from "node:path";
|
||
import { fileURLToPath } from "node:url";
|
||
|
||
const __dirname = fileURLToPath(new URL(".", import.meta.url));
|
||
// ⚠ `localhost` 로 두지 말 것 — Node 18+ 는 그것을 **IPv6(::1) 먼저** 물고, 백엔드는
|
||
// `SERVER_HOST=0.0.0.0`(IPv4 전용)로 뜬다. 그러면 프록시가 `[::1]:<포트>` 로 붙으려다
|
||
// 실패해 화면의 **모든 `/api` 요청이 「Failed to fetch」** 가 된다 — 서버는 멀쩡한데
|
||
// 저장이 실패하고, 부팅 때 죽으면 화면이 통째로 백지가 된다(2026-09-07 실측:
|
||
// `127.0.0.1:8001` 200 · `[::1]:8001` 연결 실패). 숫자로 박아 그 갈림을 없앤다.
|
||
const apiTarget = `http://127.0.0.1:${process.env.AISLO_API_PORT ?? "8000"}`;
|
||
const devPort = Number(process.env.FRONTEND_DEV_PORT ?? 5173);
|
||
|
||
/**
|
||
* Vite 설정 — 임도 설계 웹앱 (Vanilla TS + Three.js)
|
||
*
|
||
* - root: A00_Common (index.html 위치)
|
||
* - 페이지 폴더(A01_Home 등)는 ../를 통해 접근
|
||
* - 0_old(구형 코드), venv(파이썬)는 빌드에서 제외
|
||
*/
|
||
export default {
|
||
root: "A00_Common",
|
||
publicDir: false,
|
||
cacheDir: "config/node_modules/.vite",
|
||
resolve: {
|
||
alias: {
|
||
"@ui": resolve(__dirname, "./ui_template"),
|
||
"@config": resolve(__dirname, "./config"),
|
||
"@util": resolve(__dirname, "./common_util"),
|
||
three: resolve(__dirname, "./config/node_modules/three"),
|
||
"maplibre-gl": resolve(__dirname, "./config/node_modules/maplibre-gl"),
|
||
delaunator: resolve(__dirname, "./config/node_modules/delaunator"),
|
||
katex: resolve(__dirname, "./config/node_modules/katex/dist/katex.mjs"),
|
||
"@kninnug/constrainautor": resolve(
|
||
__dirname,
|
||
"./config/node_modules/@kninnug/constrainautor",
|
||
),
|
||
},
|
||
},
|
||
server: {
|
||
// main.py가 CLI --port로 덮지만, `npm run dev` 맨손 실행에서 보조 워크트리가
|
||
// 메인의 5173을 뺏지 않도록 env를 먼저 본다(dev_up.py가 주입한다).
|
||
port: devPort,
|
||
open: false,
|
||
// 코드가 아닌 폴더(서버 로그 · 자료 · 문서 · 파이썬 환경)의 파일 바뀜은 지켜보지 않음 —
|
||
// 화면이 저절로 새로 읽히는 일을 막는다(639-1). 코드(.ts · .css)는 그대로 지켜봄.
|
||
watch: {
|
||
ignored: ["tmp", "storage", "docs", "venv", "logs", "resources/tester"]
|
||
.map((dir) => `${__dirname.replace(/\\/g, "/")}${dir}/**`)
|
||
.concat(["**/*.log", "**/__pycache__/**"]),
|
||
},
|
||
// 백엔드(FastAPI) 프록시 — config_frontend.ts의 API_BASE_URL과 정합.
|
||
// 포트는 AISLO_API_PORT로 바꿀 수 있다(기본 8000) — 워크트리를 나눠 쓰는 병행
|
||
// 작업에서 각자 자기 백엔드를 보게 하려는 것이다(2026-08-30, CLAUDE.md 7장).
|
||
proxy: {
|
||
"/api": {
|
||
target: apiTarget,
|
||
changeOrigin: true,
|
||
},
|
||
// B07 독립형 CAD 앱 — FastAPI 정적 마운트로 위임
|
||
"/b07-cad": {
|
||
target: apiTarget,
|
||
changeOrigin: true,
|
||
},
|
||
},
|
||
},
|
||
// 빌드판(555-2 · `tools/preview_up.py`) — 폰 · 외부 접속용 · 포트 = 개발 포트 − 1000(5173 → 4173)
|
||
// · 프록시(/api · /b07-cad)는 server.proxy 를 그대로 물려받음.
|
||
preview: {
|
||
port: devPort - 1000,
|
||
strictPort: true,
|
||
host: true,
|
||
},
|
||
build: {
|
||
outDir: "../config/node_modules/.build",
|
||
emptyOutDir: true,
|
||
target: "es2022",
|
||
},
|
||
optimizeDeps: {
|
||
// katex 는 미리 묶기(rolldown)가 글자 규칙의 서로게이트 범위를 깨뜨림(`\text{…}` 안 그려짐) → 원본 ESM 그대로
|
||
exclude: ["0_old", "katex"],
|
||
},
|
||
};
|