## 공통 필드
```json
{
"name": "datamaker-annotator-frontend",
"version": "v0.0.2",
"private": true,
"browserslist": ["> 1%", "last 2 versions", "not dead"],
"lint-staged": {
"src/**/*.{js,vue,tsx,ts,jsx}": ["eslint --fix", "prettier --write"]
}
}
```
## Scripts
### main (Vue 3.x)
```json
{
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview",
"test": "vitest run",
"test:watch": "vitest --watch",
"test:coverage": "vitest --coverage",
"test:coverage:open": "vitest --coverage --open",
"test:coverage:html": "vitest --coverage --html",
"test:coverage:json": "vitest --coverage --json",
"test:coverage:text": "vitest --coverage --text",
"test:ui": "vitest --ui",
"lint": "eslint --ext .js,.vue src",
"prettier": "prettier --write \"src/**/*.{js,vue}\"",
"prepare": "husky install",
"lint-staged": "lint-staged",
"type-check": "tsc --noEmit",
"type-check:watch": "tsc --noEmit --watch",
"test:e2e": "playwright test",
"wasm-build": "node scripts/wasm-build.js",
"migration:status": "node scripts/migration-status.js"
}
}
```
### staging (Vue 2.x)
```json
{
"scripts": {
"serve": "webpack serve",
"build": "webpack --mode production",
"test": "vitest run",
"lint": "eslint --ext .js,.vue src",
"prettier": "prettier --write \"src/**/*.{js,vue}\"",
"prepare": "husky install",
"lint-staged": "lint-staged",
"type-check": "tsc --noEmit",
"test:e2e": "playwright test"
}
}
```
## Dependencies
### main (Vue 3.x)
```json
{
"dependencies": {
"vue": "^3.5.25",
"vuex": "^4.1.0",
"vue-router": "^4.6.4",
"vue-i18n": "^11.2.2",
"@vue/compiler-sfc": "^3.5.25",
"vue-draggable-plus": "^0.6.1",
"vue-select": "4.0.0-beta.6",
"vue-toast-notification": "^3.1.3",
"vuex-persist": "^3.1.3",
"@sentry/vue": "^10.30.0",
"@sentry/browser": "^10.30.0",
"axios": "^1.13.5",
"three": "^0.182.0",
"three-mesh-bvh": "^0.9.3",
"video.js": "^8.23.4",
"wavesurfer.js": "^7.12.1",
"lodash": "^4.17.23",
"dayjs": "^1.11.19",
"nanoid": "^5.1.6",
"chroma-js": "^3.2.0",
"comlink": "^4.4.2",
"marked": "^17.0.1",
"highlight.js": "^11.11.1",
"jsoneditor": "^10.4.2",
"ajv": "^8.18.0",
"@mathjax/src": "^4.1.0",
"@turf/turf": "^7.3.1",
"@tweenjs/tween.js": "^25.0.0",
"@fancyapps/ui": "^6.1.7",
"@flatten-js/boolean-op": "^1.1.4",
"@flatten-js/core": "^1.6.10",
"@fortawesome/fontawesome-free": "^7.1.0",
"animate.css": "^4.1.1",
"async-lz-string": "^1.1.0",
"core-js": "^3.47.0",
"dat.gui": "^0.7.9",
"dotenv": "^17.2.3",
"fast-json-stable-stringify": "^2.1.0",
"hsl-to-hex": "^1.0.0",
"jquery": "^3.7.1",
"magic-wand-tool": "^1.1.7",
"multi-range-slider-vue": "^1.1.4",
"postinstall-postinstall": "^2.1.0",
"simple-lazy-debounce": "^0.1.0",
"tinykeys": "^3.0.0",
"vue-plugin-load-script": "^2.1.1",
"xlsx": "https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz",
"annotator-util": "file:wasm/annotator",
"image-annotator-util": "file:wasm/image-annotator",
"wasm-utils": "file:wasm/wasm-utils"
}
}
```
### main (Vue 3.x) - devDependencies
```json
{
"devDependencies": {
"vite": "^7.3.0",
"@vitejs/plugin-vue": "^6.0.3",
"vite-plugin-wasm": "^3.5.0",
"vite-plugin-top-level-await": "^1.6.0",
"rollup-plugin-visualizer": "^6.0.5",
"@intlify/unplugin-vue-i18n": "^11.0.3",
"typescript": "^5.9.3",
"@typescript-eslint/eslint-plugin": "^8.50.0",
"@typescript-eslint/parser": "^8.50.0",
"typescript-eslint": "^8.50.0",
"eslint": "^9.39.2",
"@eslint/js": "^9.39.2",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-n": "^17.23.1",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-perfectionist": "^4.15.1",
"eslint-plugin-prettier": "^5.5.4",
"eslint-plugin-promise": "^7.2.1",
"eslint-plugin-vue": "^10.6.2",
"vue-eslint-parser": "^10.2.0",
"prettier": "^3.7.4",
"prettier-plugin-vue": "^1.1.6",
"globals": "^16.5.0",
"tailwindcss": "^4.1.18",
"@tailwindcss/forms": "^0.5.10",
"@tailwindcss/postcss": "^4.1.18",
"autoprefixer": "^10.4.23",
"sass": "^1.96.0",
"vitest": "^4.0.15",
"@vitest/ui": "^4.0.15",
"@playwright/test": "^1.57.0",
"@types/node": "^25.0.2",
"@vue/runtime-dom": "^3.5.25",
"jsdom": "^27.3.0",
"husky": "^9.1.7",
"lint-staged": "^16.2.7",
"mocha-teamcity-reporter": "^4.2.0",
"dat.gui": "^0.7.9"
}
}
```
### staging (Vue 2.x) - Dependencies (main과 다른 부분)
```json
{
"dependencies": {
"vue": "2.6.14",
"vue-template-compiler": "2.6.14",
"vuex": "3.4.0",
"vue-router": "3.2.0",
"vue-i18n": "8.25.0",
"@vue/composition-api": "1.7.1",
"bootstrap": "4.6.2",
"bootstrap-vue": "2.21.2",
"vuex-persistedstate": "^4.1.0",
"@sentry/vue": "^7.x",
"moment": "^2.29.4",
"d3": "^7.x",
"openseadragon": "^4.x",
"chart.js": "^4.x",
"@ckeditor/ckeditor5-vue2": "...",
"vue-formulate": "...",
"vue-worker": "..."
}
}
```
### staging (Vue 2.x) - devDependencies (main과 다른 부분)
```json
{
"devDependencies": {
"webpack": "^5.x",
"webpack-cli": "^5.x",
"webpack-dev-server": "^4.x",
"vue-loader": "^15.x",
"ts-loader": "^9.x",
"babel-loader": "^9.x",
"@babel/core": "^7.x",
"@babel/preset-env": "^7.x",
"@babel/plugin-proposal-class-properties": "^7.x",
"@babel/plugin-transform-runtime": "^7.x",
"babel-plugin-module-resolver": "^5.x",
"babel-plugin-transform-remove-console": "^6.x",
"css-loader": "^6.x",
"sass-loader": "^13.x",
"style-loader": "^3.x",
"postcss-loader": "^7.x",
"html-webpack-plugin": "^5.x",
"copy-webpack-plugin": "^11.x",
"vite-plugin-vue2": "..."
}
}
```