generated from ttipo/project-base
c31442e639
로그인은 비밀번호가 맞고 2단계를 켠 직원만 코드 단계로 간다. 설정 › 계정에 2단계 인증 · 앱 비밀번호 · 로그인 기록을 더하고, 비밀번호 화면에 2단계를 켠 직원의 코드 칸을 둔다. 비밀(코드 단계의 비밀번호 · 2단계 키 · 앱 비밀번호 값)은 화면 메모리에만 두고, 세션이 바뀌면 그 창을 모두 닫는다 — 12단계부터 다른 기기의 로그아웃이 이 세션을 바로 끊는다. 비밀이 드는 요청은 Pinia 액션 밖에서 보낸다(devtools 기록). QR 은 uqr 0.1.3(MIT · 의존성 없음 — 2단계 인증 화면 청크에만)으로 SVG 를 그린다(v-html 없음). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
57 lines
1.5 KiB
JSON
57 lines
1.5 KiB
JSON
{
|
|
"name": "frontend",
|
|
"version": "0.0.0",
|
|
"private": true,
|
|
"type": "module",
|
|
"scripts": {
|
|
"dev": "vite",
|
|
"build": "run-p type-check \"build-only {@}\" --",
|
|
"preview": "vite preview",
|
|
"test:unit": "vitest",
|
|
"build-only": "vite build",
|
|
"type-check": "vue-tsc --build",
|
|
"lint": "eslint . --max-warnings 0",
|
|
"lint:fix": "eslint . --fix",
|
|
"format": "oxfmt src/"
|
|
},
|
|
"dependencies": {
|
|
"@tiptap/core": "3.31.4",
|
|
"@tiptap/extension-table": "3.31.4",
|
|
"@tiptap/extension-text-align": "3.31.4",
|
|
"@tiptap/extension-text-style": "3.31.4",
|
|
"@tiptap/extensions": "3.31.4",
|
|
"@tiptap/pm": "3.31.4",
|
|
"@tiptap/starter-kit": "3.31.4",
|
|
"axios": "^1.14.0",
|
|
"dompurify": "^3.4.17",
|
|
"pinia": "^3.0.4",
|
|
"pretendard": "^1.3.9",
|
|
"uqr": "0.1.3",
|
|
"vue": "^3.5.43",
|
|
"vue-router": "^4.4.5"
|
|
},
|
|
"devDependencies": {
|
|
"@tsconfig/node24": "^24.0.4",
|
|
"@types/jsdom": "^28.0.1",
|
|
"@types/node": "^24.12.0",
|
|
"@vitejs/plugin-vue": "^6.0.5",
|
|
"@vitejs/plugin-vue-jsx": "^5.1.5",
|
|
"@vue/eslint-config-typescript": "^14.2.0",
|
|
"@vue/test-utils": "^2.4.6",
|
|
"@vue/tsconfig": "^0.9.1",
|
|
"eslint": "^9.18.0",
|
|
"eslint-plugin-vue": "^9.32.0",
|
|
"jsdom": "^29.0.1",
|
|
"npm-run-all2": "^8.0.4",
|
|
"oxfmt": "^0.72.0",
|
|
"typescript": "~6.0.0",
|
|
"vite": "^8.3.4",
|
|
"vite-plugin-vue-devtools": "^8.1.1",
|
|
"vitest": "^4.1.2",
|
|
"vue-tsc": "^3.2.6"
|
|
},
|
|
"engines": {
|
|
"node": "^20.19.0 || >=22.12.0"
|
|
}
|
|
}
|