refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
{
"name" : "x-ui-frontend" ,
"version" : "0.0.0" ,
"lockfileVersion" : 3 ,
"requires" : true ,
"packages" : {
"" : {
"name" : "x-ui-frontend" ,
"version" : "0.0.0" ,
"dependencies" : {
"@ant-design/icons-vue" : "^7.0.1" ,
"ant-design-vue" : "^4.2.6" ,
"axios" : "^1.7.9" ,
feat(frontend): Phase 5f-iii — inbound add/edit modal + delete/clone/reset
Wires up the inbound CRUD flows. The protocol-specific and transport-
specific forms are still ahead in 5f-iii-b — for now the modal exposes
those as JSON textareas so users can both edit existing inbounds without
losing settings and create new ones from default templates.
- InboundFormModal.vue: tabbed modal with a full Basics tab (enable,
remark, protocol, listen, port, total GB, traffic reset, expiry
date) and three JSON-edit tabs (Settings, Stream, Sniffing). Add
mode stamps a fresh template per protocol via
Inbound.Settings.getSettings(protocol); changing the protocol in
add mode restamps the JSON. Edit mode pretty-prints the existing
JSON so the user sees the same fields they save back.
- POST /panel/api/inbounds/add or /panel/api/inbounds/update/:id on
submit; on success the parent refreshes the list and the modal
closes. Malformed JSON in any of the three textareas surfaces a
message.error and aborts the save without losing user input.
- InboundsPage.vue: wires the row action menu to real handlers —
edit (opens the modal in edit mode), delete, reset-traffic,
clone, reset-clients, del-depleted-clients all go through
Modal.confirm and refresh on success. General actions menu wires
reset-inbounds / reset-clients / del-depleted-clients the same way.
Remaining actions (qrcode/info/import/export/copyClients) still
toast as "coming soon" — those land in 5f-iv and 5f-v.
- Adds dayjs ^1.11.20 dep for the a-date-picker v-model interop.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 11:41:21 +00:00
"dayjs" : "^1.11.20" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"moment" : "^2.30.1" ,
2026-05-08 11:08:39 +00:00
"otpauth" : "^9.5.1" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"qrious" : "^4.0.2" ,
2026-05-08 09:11:06 +00:00
"qs" : "^6.13.1" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"vue" : "^3.5.13" ,
2026-05-08 22:17:25 +00:00
"vue-i18n" : "^11.1.4" ,
"vue3-persian-datetime-picker" : "^1.2.2"
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
} ,
"devDependencies" : {
2026-05-08 09:11:06 +00:00
"@vitejs/plugin-vue" : "^6.0.6" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"eslint" : "^9.17.0" ,
"eslint-plugin-vue" : "^9.32.0" ,
2026-05-08 09:11:06 +00:00
"vite" : "^8.0.11"
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
}
} ,
"node_modules/@ant-design/colors" : {
"version" : "6.0.0" ,
"resolved" : "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz" ,
"integrity" : "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==" ,
"dependencies" : {
"@ctrl/tinycolor" : "^3.4.0"
}
} ,
"node_modules/@ant-design/icons-svg" : {
"version" : "4.4.2" ,
"resolved" : "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz" ,
"integrity" : "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA=="
} ,
"node_modules/@ant-design/icons-vue" : {
"version" : "7.0.1" ,
"resolved" : "https://registry.npmjs.org/@ant-design/icons-vue/-/icons-vue-7.0.1.tgz" ,
"integrity" : "sha512-eCqY2unfZK6Fe02AwFlDHLfoyEFreP6rBwAZMIJ1LugmfMiVgwWDYlp1YsRugaPtICYOabV1iWxXdP12u9U43Q==" ,
"dependencies" : {
"@ant-design/colors" : "^6.0.0" ,
"@ant-design/icons-svg" : "^4.2.1"
} ,
"peerDependencies" : {
"vue" : ">=3.0.3"
}
} ,
"node_modules/@babel/helper-string-parser" : {
"version" : "7.27.1" ,
"resolved" : "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz" ,
"integrity" : "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==" ,
"engines" : {
"node" : ">=6.9.0"
}
} ,
"node_modules/@babel/helper-validator-identifier" : {
"version" : "7.28.5" ,
"resolved" : "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz" ,
"integrity" : "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==" ,
"engines" : {
"node" : ">=6.9.0"
}
} ,
"node_modules/@babel/parser" : {
"version" : "7.29.3" ,
"resolved" : "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz" ,
"integrity" : "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==" ,
"dependencies" : {
"@babel/types" : "^7.29.0"
} ,
"bin" : {
"parser" : "bin/babel-parser.js"
} ,
"engines" : {
"node" : ">=6.0.0"
}
} ,
"node_modules/@babel/runtime" : {
"version" : "7.29.2" ,
"resolved" : "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz" ,
"integrity" : "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==" ,
"engines" : {
"node" : ">=6.9.0"
}
} ,
"node_modules/@babel/types" : {
"version" : "7.29.0" ,
"resolved" : "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz" ,
"integrity" : "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==" ,
"dependencies" : {
"@babel/helper-string-parser" : "^7.27.1" ,
"@babel/helper-validator-identifier" : "^7.28.5"
} ,
"engines" : {
"node" : ">=6.9.0"
}
} ,
"node_modules/@ctrl/tinycolor" : {
"version" : "3.6.1" ,
"resolved" : "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz" ,
"integrity" : "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==" ,
"engines" : {
"node" : ">=10"
}
} ,
2026-05-08 09:11:06 +00:00
"node_modules/@emnapi/core" : {
"version" : "1.10.0" ,
"resolved" : "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz" ,
"integrity" : "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"dev" : true ,
"optional" : true ,
2026-05-08 09:11:06 +00:00
"dependencies" : {
"@emnapi/wasi-threads" : "1.2.1" ,
"tslib" : "^2.4.0"
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
}
} ,
2026-05-08 09:11:06 +00:00
"node_modules/@emnapi/runtime" : {
"version" : "1.10.0" ,
"resolved" : "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz" ,
"integrity" : "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"dev" : true ,
"optional" : true ,
2026-05-08 09:11:06 +00:00
"dependencies" : {
"tslib" : "^2.4.0"
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
}
} ,
2026-05-08 09:11:06 +00:00
"node_modules/@emnapi/wasi-threads" : {
"version" : "1.2.1" ,
"resolved" : "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz" ,
"integrity" : "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"dev" : true ,
"optional" : true ,
2026-05-08 09:11:06 +00:00
"dependencies" : {
"tslib" : "^2.4.0"
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
}
} ,
2026-05-08 09:11:06 +00:00
"node_modules/@emotion/hash" : {
"version" : "0.9.2" ,
"resolved" : "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz" ,
"integrity" : "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g=="
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
} ,
2026-05-08 09:11:06 +00:00
"node_modules/@emotion/unitless" : {
"version" : "0.8.1" ,
"resolved" : "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz" ,
"integrity" : "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ=="
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
} ,
"node_modules/@eslint-community/eslint-utils" : {
"version" : "4.9.1" ,
"resolved" : "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz" ,
"integrity" : "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==" ,
"dev" : true ,
"dependencies" : {
"eslint-visitor-keys" : "^3.4.3"
} ,
"engines" : {
"node" : "^12.22.0 || ^14.17.0 || >=16.0.0"
} ,
"funding" : {
"url" : "https://opencollective.com/eslint"
} ,
"peerDependencies" : {
"eslint" : "^6.0.0 || ^7.0.0 || >=8.0.0"
}
} ,
"node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys" : {
"version" : "3.4.3" ,
"resolved" : "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" ,
"integrity" : "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==" ,
"dev" : true ,
"engines" : {
"node" : "^12.22.0 || ^14.17.0 || >=16.0.0"
} ,
"funding" : {
"url" : "https://opencollective.com/eslint"
}
} ,
"node_modules/@eslint-community/regexpp" : {
"version" : "4.12.2" ,
"resolved" : "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz" ,
"integrity" : "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==" ,
"dev" : true ,
"engines" : {
"node" : "^12.0.0 || ^14.0.0 || >=16.0.0"
}
} ,
"node_modules/@eslint/config-array" : {
"version" : "0.21.2" ,
"resolved" : "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz" ,
"integrity" : "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==" ,
"dev" : true ,
"dependencies" : {
"@eslint/object-schema" : "^2.1.7" ,
"debug" : "^4.3.1" ,
"minimatch" : "^3.1.5"
} ,
"engines" : {
"node" : "^18.18.0 || ^20.9.0 || >=21.1.0"
}
} ,
"node_modules/@eslint/config-helpers" : {
"version" : "0.4.2" ,
"resolved" : "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz" ,
"integrity" : "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==" ,
"dev" : true ,
"dependencies" : {
"@eslint/core" : "^0.17.0"
} ,
"engines" : {
"node" : "^18.18.0 || ^20.9.0 || >=21.1.0"
}
} ,
"node_modules/@eslint/core" : {
"version" : "0.17.0" ,
"resolved" : "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz" ,
"integrity" : "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==" ,
"dev" : true ,
"dependencies" : {
"@types/json-schema" : "^7.0.15"
} ,
"engines" : {
"node" : "^18.18.0 || ^20.9.0 || >=21.1.0"
}
} ,
"node_modules/@eslint/eslintrc" : {
"version" : "3.3.5" ,
"resolved" : "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz" ,
"integrity" : "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==" ,
"dev" : true ,
"dependencies" : {
"ajv" : "^6.14.0" ,
"debug" : "^4.3.2" ,
"espree" : "^10.0.1" ,
"globals" : "^14.0.0" ,
"ignore" : "^5.2.0" ,
"import-fresh" : "^3.2.1" ,
"js-yaml" : "^4.1.1" ,
"minimatch" : "^3.1.5" ,
"strip-json-comments" : "^3.1.1"
} ,
"engines" : {
"node" : "^18.18.0 || ^20.9.0 || >=21.1.0"
} ,
"funding" : {
"url" : "https://opencollective.com/eslint"
}
} ,
"node_modules/@eslint/js" : {
"version" : "9.39.4" ,
"resolved" : "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz" ,
"integrity" : "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==" ,
"dev" : true ,
"engines" : {
"node" : "^18.18.0 || ^20.9.0 || >=21.1.0"
} ,
"funding" : {
"url" : "https://eslint.org/donate"
}
} ,
"node_modules/@eslint/object-schema" : {
"version" : "2.1.7" ,
"resolved" : "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz" ,
"integrity" : "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==" ,
"dev" : true ,
"engines" : {
"node" : "^18.18.0 || ^20.9.0 || >=21.1.0"
}
} ,
"node_modules/@eslint/plugin-kit" : {
"version" : "0.4.1" ,
"resolved" : "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz" ,
"integrity" : "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==" ,
"dev" : true ,
"dependencies" : {
"@eslint/core" : "^0.17.0" ,
"levn" : "^0.4.1"
} ,
"engines" : {
"node" : "^18.18.0 || ^20.9.0 || >=21.1.0"
}
} ,
"node_modules/@humanfs/core" : {
"version" : "0.19.2" ,
"resolved" : "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz" ,
"integrity" : "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==" ,
"dev" : true ,
"dependencies" : {
"@humanfs/types" : "^0.15.0"
} ,
"engines" : {
"node" : ">=18.18.0"
}
} ,
"node_modules/@humanfs/node" : {
"version" : "0.16.8" ,
"resolved" : "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz" ,
"integrity" : "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==" ,
"dev" : true ,
"dependencies" : {
"@humanfs/core" : "^0.19.2" ,
"@humanfs/types" : "^0.15.0" ,
"@humanwhocodes/retry" : "^0.4.0"
} ,
"engines" : {
"node" : ">=18.18.0"
}
} ,
"node_modules/@humanfs/types" : {
"version" : "0.15.0" ,
"resolved" : "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz" ,
"integrity" : "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==" ,
"dev" : true ,
"engines" : {
"node" : ">=18.18.0"
}
} ,
"node_modules/@humanwhocodes/module-importer" : {
"version" : "1.0.1" ,
"resolved" : "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" ,
"integrity" : "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==" ,
"dev" : true ,
"engines" : {
"node" : ">=12.22"
} ,
"funding" : {
"type" : "github" ,
"url" : "https://github.com/sponsors/nzakas"
}
} ,
"node_modules/@humanwhocodes/retry" : {
"version" : "0.4.3" ,
"resolved" : "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz" ,
"integrity" : "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==" ,
"dev" : true ,
"engines" : {
"node" : ">=18.18"
} ,
"funding" : {
"type" : "github" ,
"url" : "https://github.com/sponsors/nzakas"
}
} ,
"node_modules/@intlify/core-base" : {
2026-05-08 09:11:06 +00:00
"version" : "11.4.2" ,
"resolved" : "https://registry.npmjs.org/@intlify/core-base/-/core-base-11.4.2.tgz" ,
"integrity" : "sha512-7fpuCcVmeLv2T9qHsARqGvh8xt+sV2fH+Q+gMHFwB/rPXzo85DpbJFKn7dBH1L5p0c2cSh2DW+2h/64EKrISmA==" ,
"dependencies" : {
"@intlify/devtools-types" : "11.4.2" ,
"@intlify/message-compiler" : "11.4.2" ,
"@intlify/shared" : "11.4.2"
} ,
"engines" : {
"node" : ">= 16"
} ,
"funding" : {
"url" : "https://github.com/sponsors/kazupon"
}
} ,
"node_modules/@intlify/devtools-types" : {
"version" : "11.4.2" ,
"resolved" : "https://registry.npmjs.org/@intlify/devtools-types/-/devtools-types-11.4.2.tgz" ,
"integrity" : "sha512-3u8EN1kB6EMSi96KXs5k7a8y2X2g4+h3X6iwVZU47cP4n+mTuq//WMjG588BzSp/2XQ/dTXo2BLUXX+XS+PNfA==" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"dependencies" : {
2026-05-08 09:11:06 +00:00
"@intlify/core-base" : "11.4.2" ,
"@intlify/shared" : "11.4.2"
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
} ,
"engines" : {
"node" : ">= 16"
} ,
"funding" : {
"url" : "https://github.com/sponsors/kazupon"
}
} ,
"node_modules/@intlify/message-compiler" : {
2026-05-08 09:11:06 +00:00
"version" : "11.4.2" ,
"resolved" : "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-11.4.2.tgz" ,
"integrity" : "sha512-a6CDSGSMTGrg0BjD97x8TBYPf7qQMDlZipJ6UDfv/pd4OIym8TMlHu3MsH0bTNnRdAG2D6EFEykIgiQPqvtTkA==" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"dependencies" : {
2026-05-08 09:11:06 +00:00
"@intlify/shared" : "11.4.2" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"source-map-js" : "^1.0.2"
} ,
"engines" : {
"node" : ">= 16"
} ,
"funding" : {
"url" : "https://github.com/sponsors/kazupon"
}
} ,
"node_modules/@intlify/shared" : {
2026-05-08 09:11:06 +00:00
"version" : "11.4.2" ,
"resolved" : "https://registry.npmjs.org/@intlify/shared/-/shared-11.4.2.tgz" ,
"integrity" : "sha512-NzpHbguRCsOHDwxmlBa9qu/imc+/QWgsYUaK6FZeNC0wK8QfAbhqrktEp/haVzxU1aikH8IX4ytD+mfFEMi/9A==" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"engines" : {
"node" : ">= 16"
} ,
"funding" : {
"url" : "https://github.com/sponsors/kazupon"
}
} ,
"node_modules/@jridgewell/sourcemap-codec" : {
"version" : "1.5.5" ,
"resolved" : "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz" ,
"integrity" : "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="
} ,
2026-05-08 09:11:06 +00:00
"node_modules/@napi-rs/wasm-runtime" : {
"version" : "1.1.4" ,
"resolved" : "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz" ,
"integrity" : "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"dev" : true ,
"optional" : true ,
2026-05-08 09:11:06 +00:00
"dependencies" : {
"@tybys/wasm-util" : "^0.10.1"
} ,
"funding" : {
"type" : "github" ,
"url" : "https://github.com/sponsors/Brooooooklyn"
} ,
"peerDependencies" : {
"@emnapi/core" : "^1.7.1" ,
"@emnapi/runtime" : "^1.7.1"
}
} ,
2026-05-08 11:08:39 +00:00
"node_modules/@noble/hashes" : {
"version" : "2.2.0" ,
"resolved" : "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz" ,
"integrity" : "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==" ,
"engines" : {
"node" : ">= 20.19.0"
} ,
"funding" : {
"url" : "https://paulmillr.com/funding/"
}
} ,
2026-05-08 09:11:06 +00:00
"node_modules/@oxc-project/types" : {
"version" : "0.128.0" ,
"resolved" : "https://registry.npmjs.org/@oxc-project/types/-/types-0.128.0.tgz" ,
"integrity" : "sha512-huv1Y/LzBJkBVHt3OlC7u0zHBW9qXf1FdD7sGmc1rXc2P1mTwHssYv7jyGx5KAACSCH+9B3Bhn6Z9luHRvf7pQ==" ,
"dev" : true ,
"funding" : {
"url" : "https://github.com/sponsors/Boshen"
}
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
} ,
2026-05-08 09:11:06 +00:00
"node_modules/@rolldown/binding-android-arm64" : {
"version" : "1.0.0-rc.18" ,
"resolved" : "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.18.tgz" ,
"integrity" : "sha512-lIDyUAfD7U3+BWKzdxMbJcsYHuqXqmGz40aeRqvuAm3y5TkJSYTBW2RDrn65DJFPQqVjUAUqq5uz8urzQ8aBdQ==" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"cpu" : [
"arm64"
] ,
"dev" : true ,
"optional" : true ,
"os" : [
"android"
2026-05-08 09:11:06 +00:00
] ,
"engines" : {
"node" : "^20.19.0 || >=22.12.0"
}
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
} ,
2026-05-08 09:11:06 +00:00
"node_modules/@rolldown/binding-darwin-arm64" : {
"version" : "1.0.0-rc.18" ,
"resolved" : "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.18.tgz" ,
"integrity" : "sha512-apJq2ktnGp27nSInMR5Vcj8kY6xJzDAvfdIFlpDcAK/w4cDO58qVoi1YQsES/SKiFNge/6e4CUzgjfHduYqWpQ==" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"cpu" : [
"arm64"
] ,
"dev" : true ,
"optional" : true ,
"os" : [
"darwin"
2026-05-08 09:11:06 +00:00
] ,
"engines" : {
"node" : "^20.19.0 || >=22.12.0"
}
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
} ,
2026-05-08 09:11:06 +00:00
"node_modules/@rolldown/binding-darwin-x64" : {
"version" : "1.0.0-rc.18" ,
"resolved" : "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.18.tgz" ,
"integrity" : "sha512-5Ofot8xbs+pxRHJqm9/9N/4sTQOvdrwEsmPE9pdLEEoAbdZtG6F2LMDfO1sp6ZAtXJuJV/21ew2srq3W8NXB5g==" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"cpu" : [
"x64"
] ,
"dev" : true ,
"optional" : true ,
"os" : [
"darwin"
] ,
2026-05-08 09:11:06 +00:00
"engines" : {
"node" : "^20.19.0 || >=22.12.0"
}
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
} ,
2026-05-08 09:11:06 +00:00
"node_modules/@rolldown/binding-freebsd-x64" : {
"version" : "1.0.0-rc.18" ,
"resolved" : "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.18.tgz" ,
"integrity" : "sha512-7h8eeOTT1eyqJyx64BFCnWZpNm486hGWt2sqeLLgDxA0xI1oGZ9H7gK1S85uNGmBhkdPwa/6reTxfFFKvIsebw==" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"cpu" : [
"x64"
] ,
"dev" : true ,
"optional" : true ,
"os" : [
"freebsd"
] ,
2026-05-08 09:11:06 +00:00
"engines" : {
"node" : "^20.19.0 || >=22.12.0"
}
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
} ,
2026-05-08 09:11:06 +00:00
"node_modules/@rolldown/binding-linux-arm-gnueabihf" : {
"version" : "1.0.0-rc.18" ,
"resolved" : "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.18.tgz" ,
"integrity" : "sha512-eRcm/HVt9U/JFu5RKAEKwGQYtDCKWLiaH6wOnsSEp6NMBb/3Os8LgHZlNyzMpFVNmiiMFlfb2zEnebfzJrHFmg==" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"cpu" : [
"arm"
] ,
"dev" : true ,
"optional" : true ,
"os" : [
"linux"
] ,
2026-05-08 09:11:06 +00:00
"engines" : {
"node" : "^20.19.0 || >=22.12.0"
}
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
} ,
2026-05-08 09:11:06 +00:00
"node_modules/@rolldown/binding-linux-arm64-gnu" : {
"version" : "1.0.0-rc.18" ,
"resolved" : "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.18.tgz" ,
"integrity" : "sha512-SOrT/cT4ukTmgnrEz/Hg3m7LBnuCLW9psDeMKrimRWY4I8DmnO7Lco8W2vtqPmMkbVu8iJ+g4GFLVLLOVjJ9DQ==" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"cpu" : [
"arm64"
] ,
"dev" : true ,
"optional" : true ,
"os" : [
"linux"
] ,
2026-05-08 09:11:06 +00:00
"engines" : {
"node" : "^20.19.0 || >=22.12.0"
}
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
} ,
2026-05-08 09:11:06 +00:00
"node_modules/@rolldown/binding-linux-arm64-musl" : {
"version" : "1.0.0-rc.18" ,
"resolved" : "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.18.tgz" ,
"integrity" : "sha512-QWjdxN1HJCpBTAcZ5N5F7wju3gVPzRzSpmGzx7na0c/1qpN9CFil+xt+l9lV/1M6/gqHSNXCiqPfwhVJPeLnug==" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"cpu" : [
2026-05-08 09:11:06 +00:00
"arm64"
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
] ,
"dev" : true ,
"optional" : true ,
"os" : [
"linux"
] ,
2026-05-08 09:11:06 +00:00
"engines" : {
"node" : "^20.19.0 || >=22.12.0"
}
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
} ,
2026-05-08 09:11:06 +00:00
"node_modules/@rolldown/binding-linux-ppc64-gnu" : {
"version" : "1.0.0-rc.18" ,
"resolved" : "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.18.tgz" ,
"integrity" : "sha512-ugCOyj7a4d9h3q9B+wXmf6g3a68UsjGh6dob5DHevHGMwDUbhsYNbSPxJsENcIttJZ9jv7qGM2UesLw5jqIhdg==" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"cpu" : [
"ppc64"
] ,
"dev" : true ,
"optional" : true ,
"os" : [
"linux"
] ,
2026-05-08 09:11:06 +00:00
"engines" : {
"node" : "^20.19.0 || >=22.12.0"
}
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
} ,
2026-05-08 09:11:06 +00:00
"node_modules/@rolldown/binding-linux-s390x-gnu" : {
"version" : "1.0.0-rc.18" ,
"resolved" : "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.18.tgz" ,
"integrity" : "sha512-kKWRhbsotpXkGbcd5dllUWg5gEXcDAa8u5YnP9AV5DYNbvJHGzzuwv7dpmhc8NqKMJldl0a+x76IHbspEpEmdA==" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"cpu" : [
"s390x"
] ,
"dev" : true ,
"optional" : true ,
"os" : [
"linux"
2026-05-08 09:11:06 +00:00
] ,
"engines" : {
"node" : "^20.19.0 || >=22.12.0"
}
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
} ,
2026-05-08 09:11:06 +00:00
"node_modules/@rolldown/binding-linux-x64-gnu" : {
"version" : "1.0.0-rc.18" ,
"resolved" : "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.18.tgz" ,
"integrity" : "sha512-uCo8ElcCIAMyYAZyuIZ81oFkhTSIllNvUCHCAlbhlN4ji3uC28h7IIdlXyIvGO7HsuqnV9p3rD/bpH7XhIyhRw==" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"cpu" : [
"x64"
] ,
"dev" : true ,
"optional" : true ,
"os" : [
"linux"
2026-05-08 09:11:06 +00:00
] ,
"engines" : {
"node" : "^20.19.0 || >=22.12.0"
}
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
} ,
2026-05-08 09:11:06 +00:00
"node_modules/@rolldown/binding-linux-x64-musl" : {
"version" : "1.0.0-rc.18" ,
"resolved" : "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.18.tgz" ,
"integrity" : "sha512-XNOQZtuE6yUIvx4rwGemwh8kpL1xvU41FXy/s9K7T/3JVcqGzo3NfKM2HrbrGgfPYGFW42f07Wk++aOC6B9NWA==" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"cpu" : [
"x64"
] ,
"dev" : true ,
"optional" : true ,
"os" : [
"linux"
] ,
2026-05-08 09:11:06 +00:00
"engines" : {
"node" : "^20.19.0 || >=22.12.0"
}
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
} ,
2026-05-08 09:11:06 +00:00
"node_modules/@rolldown/binding-openharmony-arm64" : {
"version" : "1.0.0-rc.18" ,
"resolved" : "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.18.tgz" ,
"integrity" : "sha512-tSn/kzrfa7tNOXr7sEacDBN4YsIqTyLqh45IO0nHDwtpKIDNDJr+VFojt+4klSpChxB29JLyduSsE0MKEwa65A==" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"cpu" : [
"arm64"
] ,
"dev" : true ,
"optional" : true ,
"os" : [
"openharmony"
] ,
2026-05-08 09:11:06 +00:00
"engines" : {
"node" : "^20.19.0 || >=22.12.0"
}
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
} ,
2026-05-08 09:11:06 +00:00
"node_modules/@rolldown/binding-wasm32-wasi" : {
"version" : "1.0.0-rc.18" ,
"resolved" : "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.18.tgz" ,
"integrity" : "sha512-+J9YGmc+czgqlhYmwun3S3O0FIZhsH8ep2456xwjAdIOmuJxM7xz4P4PtrxU+Bz17a/5bqPA8o3HAAoX0teUdg==" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"cpu" : [
2026-05-08 09:11:06 +00:00
"wasm32"
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
] ,
"dev" : true ,
"optional" : true ,
2026-05-08 09:11:06 +00:00
"dependencies" : {
"@emnapi/core" : "1.10.0" ,
"@emnapi/runtime" : "1.10.0" ,
"@napi-rs/wasm-runtime" : "^1.1.4"
} ,
"engines" : {
"node" : "^20.19.0 || >=22.12.0"
}
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
} ,
2026-05-08 09:11:06 +00:00
"node_modules/@rolldown/binding-win32-arm64-msvc" : {
"version" : "1.0.0-rc.18" ,
"resolved" : "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.18.tgz" ,
"integrity" : "sha512-zsu47DgU0FQzSwi6sU9dZoEdUv7pc1AptSEz/Z8HBg54sV0Pbs3N0+CrIbTsgiu6EyoaNN9CHboqbLaz9lhOyQ==" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"cpu" : [
2026-05-08 09:11:06 +00:00
"arm64"
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
] ,
"dev" : true ,
"optional" : true ,
"os" : [
"win32"
2026-05-08 09:11:06 +00:00
] ,
"engines" : {
"node" : "^20.19.0 || >=22.12.0"
}
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
} ,
2026-05-08 09:11:06 +00:00
"node_modules/@rolldown/binding-win32-x64-msvc" : {
"version" : "1.0.0-rc.18" ,
"resolved" : "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.18.tgz" ,
"integrity" : "sha512-7H+3yqGgmnlDTRRhw/xpYY9J1kf4GC681nVc4GqKhExZTDrVVrV2tsOR9kso0fvgBdcTCcQShx4SLLoHgaLwhg==" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"cpu" : [
"x64"
] ,
"dev" : true ,
"optional" : true ,
"os" : [
"win32"
2026-05-08 09:11:06 +00:00
] ,
"engines" : {
"node" : "^20.19.0 || >=22.12.0"
}
} ,
"node_modules/@rolldown/pluginutils" : {
"version" : "1.0.0-rc.13" ,
"resolved" : "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.13.tgz" ,
"integrity" : "sha512-3ngTAv6F/Py35BsYbeeLeecvhMKdsKm4AoOETVhAA+Qc8nrA2I0kF7oa93mE9qnIurngOSpMnQ0x2nQY2FPviA==" ,
"dev" : true
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
} ,
"node_modules/@simonwep/pickr" : {
"version" : "1.8.2" ,
"resolved" : "https://registry.npmjs.org/@simonwep/pickr/-/pickr-1.8.2.tgz" ,
"integrity" : "sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==" ,
"dependencies" : {
"core-js" : "^3.15.1" ,
"nanopop" : "^2.1.0"
}
} ,
2026-05-08 09:11:06 +00:00
"node_modules/@tybys/wasm-util" : {
"version" : "0.10.2" ,
"resolved" : "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz" ,
"integrity" : "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==" ,
"dev" : true ,
"optional" : true ,
"dependencies" : {
"tslib" : "^2.4.0"
}
} ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"node_modules/@types/estree" : {
"version" : "1.0.9" ,
"resolved" : "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz" ,
"integrity" : "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==" ,
"dev" : true
} ,
"node_modules/@types/json-schema" : {
"version" : "7.0.15" ,
"resolved" : "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" ,
"integrity" : "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" ,
"dev" : true
} ,
"node_modules/@vitejs/plugin-vue" : {
2026-05-08 09:11:06 +00:00
"version" : "6.0.6" ,
"resolved" : "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.6.tgz" ,
"integrity" : "sha512-u9HHgfrq3AjXlysn0eINFnWQOJQLO9WN6VprZ8FXl7A2bYisv3Hui9Ij+7QZ41F/WYWarHjwBbXtD7dKg3uxbg==" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"dev" : true ,
2026-05-08 09:11:06 +00:00
"dependencies" : {
"@rolldown/pluginutils" : "1.0.0-rc.13"
} ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"engines" : {
2026-05-08 09:11:06 +00:00
"node" : "^20.19.0 || >=22.12.0"
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
} ,
"peerDependencies" : {
2026-05-08 09:11:06 +00:00
"vite" : "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"vue" : "^3.2.25"
}
} ,
"node_modules/@vue/compiler-core" : {
"version" : "3.5.34" ,
"resolved" : "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.34.tgz" ,
"integrity" : "sha512-s9cLyK5mLcvZ4Agva5QgRsQyLKvts9WbU9DB6NqiZkkGEdwmcEiylj5Jbwkp680drF/NNCV8OlAJSe+yMLxaJw==" ,
"dependencies" : {
"@babel/parser" : "^7.29.3" ,
"@vue/shared" : "3.5.34" ,
"entities" : "^7.0.1" ,
"estree-walker" : "^2.0.2" ,
"source-map-js" : "^1.2.1"
}
} ,
"node_modules/@vue/compiler-dom" : {
"version" : "3.5.34" ,
"resolved" : "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.34.tgz" ,
"integrity" : "sha512-EbF/T++k0e2MMZlJsBhzK8Sgwt0HcIPOhzn1CTB/lv6sQcyk+OWf8YeiLxZp3ro7MbbLcAfAJ6sEvjFWuNgUCw==" ,
"dependencies" : {
"@vue/compiler-core" : "3.5.34" ,
"@vue/shared" : "3.5.34"
}
} ,
"node_modules/@vue/compiler-sfc" : {
"version" : "3.5.34" ,
"resolved" : "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.34.tgz" ,
"integrity" : "sha512-D/ihr6uZeIt6r+pVZf46RWT1fAsLFMbUP7k8G1VkiiWexriED9GrX3echHd4Abbt17zjlfiFJ8z7a3BxZOPNjg==" ,
"dependencies" : {
"@babel/parser" : "^7.29.3" ,
"@vue/compiler-core" : "3.5.34" ,
"@vue/compiler-dom" : "3.5.34" ,
"@vue/compiler-ssr" : "3.5.34" ,
"@vue/shared" : "3.5.34" ,
"estree-walker" : "^2.0.2" ,
"magic-string" : "^0.30.21" ,
"postcss" : "^8.5.14" ,
"source-map-js" : "^1.2.1"
}
} ,
"node_modules/@vue/compiler-ssr" : {
"version" : "3.5.34" ,
"resolved" : "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.34.tgz" ,
"integrity" : "sha512-cDtTHKibkThKGHH1SP+WdccquNRYQDFH6rRjQCqT9G2ltFAfoR5pUftpab/z+aM5mW9HLLVQW7hfKKQe/1GBeQ==" ,
"dependencies" : {
"@vue/compiler-dom" : "3.5.34" ,
"@vue/shared" : "3.5.34"
}
} ,
"node_modules/@vue/devtools-api" : {
"version" : "6.6.4" ,
"resolved" : "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz" ,
"integrity" : "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g=="
} ,
"node_modules/@vue/reactivity" : {
"version" : "3.5.34" ,
"resolved" : "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.34.tgz" ,
"integrity" : "sha512-y9XDjCEuBp+98k+UL5dbYkh57AHU4o6cxZedOPXw3bmrZZYLQsVHguGurq7hVrPCSrQtrnz1f9dssyFr+dMXfQ==" ,
"dependencies" : {
"@vue/shared" : "3.5.34"
}
} ,
"node_modules/@vue/runtime-core" : {
"version" : "3.5.34" ,
"resolved" : "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.34.tgz" ,
"integrity" : "sha512-mKeBYvu8tcMSLhypAHBmriUFfWXKTCF/23Z4jiCoYK3UtWepkliViNLuR90V9XOyD62mUxs9p1jsrpK3CCGIzw==" ,
"dependencies" : {
"@vue/reactivity" : "3.5.34" ,
"@vue/shared" : "3.5.34"
}
} ,
"node_modules/@vue/runtime-dom" : {
"version" : "3.5.34" ,
"resolved" : "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.34.tgz" ,
"integrity" : "sha512-e8kZzERmCwUnBRVsgSQlAfrfU2rGoy0FFKPBXSlfEjc/O3KfA7QP0t1/2ZylrbchjmIKB4dPTd07A6WPr0eOrg==" ,
"dependencies" : {
"@vue/reactivity" : "3.5.34" ,
"@vue/runtime-core" : "3.5.34" ,
"@vue/shared" : "3.5.34" ,
"csstype" : "^3.2.3"
}
} ,
"node_modules/@vue/server-renderer" : {
"version" : "3.5.34" ,
"resolved" : "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.34.tgz" ,
"integrity" : "sha512-nHxmJoTrKsmrkbILRhkC9gY1G3moZbJTqCzDd7DOOzG5KH9oeJ0Unqrff5f9v0pW//jES05ZkJcNtfE8JjOIew==" ,
"dependencies" : {
"@vue/compiler-ssr" : "3.5.34" ,
"@vue/shared" : "3.5.34"
} ,
"peerDependencies" : {
"vue" : "3.5.34"
}
} ,
"node_modules/@vue/shared" : {
"version" : "3.5.34" ,
"resolved" : "https://registry.npmjs.org/@vue/shared/-/shared-3.5.34.tgz" ,
"integrity" : "sha512-24uqU4OIiX29ryC3MeWid/Xf2fa2EFRUVLb77nRhk+UrTVrh/XiGtFAFmJBAtBRbjwNdsPRP+jj/OL27Eg1NDA=="
} ,
"node_modules/acorn" : {
"version" : "8.16.0" ,
"resolved" : "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz" ,
"integrity" : "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==" ,
"dev" : true ,
"bin" : {
"acorn" : "bin/acorn"
} ,
"engines" : {
"node" : ">=0.4.0"
}
} ,
"node_modules/acorn-jsx" : {
"version" : "5.3.2" ,
"resolved" : "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" ,
"integrity" : "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" ,
"dev" : true ,
"peerDependencies" : {
"acorn" : "^6.0.0 || ^7.0.0 || ^8.0.0"
}
} ,
"node_modules/ajv" : {
"version" : "6.15.0" ,
"resolved" : "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz" ,
"integrity" : "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==" ,
"dev" : true ,
"dependencies" : {
"fast-deep-equal" : "^3.1.1" ,
"fast-json-stable-stringify" : "^2.0.0" ,
"json-schema-traverse" : "^0.4.1" ,
"uri-js" : "^4.2.2"
} ,
"funding" : {
"type" : "github" ,
"url" : "https://github.com/sponsors/epoberezkin"
}
} ,
"node_modules/ansi-styles" : {
"version" : "4.3.0" ,
"resolved" : "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" ,
"integrity" : "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" ,
"dev" : true ,
"dependencies" : {
"color-convert" : "^2.0.1"
} ,
"engines" : {
"node" : ">=8"
} ,
"funding" : {
"url" : "https://github.com/chalk/ansi-styles?sponsor=1"
}
} ,
"node_modules/ant-design-vue" : {
"version" : "4.2.6" ,
"resolved" : "https://registry.npmjs.org/ant-design-vue/-/ant-design-vue-4.2.6.tgz" ,
"integrity" : "sha512-t7eX13Yj3i9+i5g9lqFyYneoIb3OzTvQjq9Tts1i+eiOd3Eva/6GagxBSXM1fOCjqemIu0FYVE1ByZ/38epR3Q==" ,
"dependencies" : {
"@ant-design/colors" : "^6.0.0" ,
"@ant-design/icons-vue" : "^7.0.0" ,
"@babel/runtime" : "^7.10.5" ,
"@ctrl/tinycolor" : "^3.5.0" ,
"@emotion/hash" : "^0.9.0" ,
"@emotion/unitless" : "^0.8.0" ,
"@simonwep/pickr" : "~1.8.0" ,
"array-tree-filter" : "^2.1.0" ,
"async-validator" : "^4.0.0" ,
"csstype" : "^3.1.1" ,
"dayjs" : "^1.10.5" ,
"dom-align" : "^1.12.1" ,
"dom-scroll-into-view" : "^2.0.0" ,
"lodash" : "^4.17.21" ,
"lodash-es" : "^4.17.15" ,
"resize-observer-polyfill" : "^1.5.1" ,
"scroll-into-view-if-needed" : "^2.2.25" ,
"shallow-equal" : "^1.0.0" ,
"stylis" : "^4.1.3" ,
"throttle-debounce" : "^5.0.0" ,
"vue-types" : "^3.0.0" ,
"warning" : "^4.0.0"
} ,
"engines" : {
"node" : ">=12.22.0"
} ,
"funding" : {
"type" : "opencollective" ,
"url" : "https://opencollective.com/ant-design-vue"
} ,
"peerDependencies" : {
"vue" : ">=3.2.0"
}
} ,
"node_modules/argparse" : {
"version" : "2.0.1" ,
"resolved" : "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" ,
"integrity" : "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" ,
"dev" : true
} ,
"node_modules/array-tree-filter" : {
"version" : "2.1.0" ,
"resolved" : "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz" ,
"integrity" : "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw=="
} ,
"node_modules/async-validator" : {
"version" : "4.2.5" ,
"resolved" : "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz" ,
"integrity" : "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg=="
} ,
"node_modules/asynckit" : {
"version" : "0.4.0" ,
"resolved" : "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" ,
"integrity" : "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
} ,
"node_modules/axios" : {
"version" : "1.16.0" ,
"resolved" : "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz" ,
"integrity" : "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==" ,
"dependencies" : {
"follow-redirects" : "^1.16.0" ,
"form-data" : "^4.0.5" ,
"proxy-from-env" : "^2.1.0"
}
} ,
"node_modules/balanced-match" : {
"version" : "1.0.2" ,
"resolved" : "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" ,
2026-05-08 22:17:25 +00:00
"integrity" : "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
} ,
"node_modules/boolbase" : {
"version" : "1.0.0" ,
"resolved" : "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" ,
"integrity" : "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" ,
"dev" : true
} ,
"node_modules/brace-expansion" : {
"version" : "1.1.14" ,
"resolved" : "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz" ,
"integrity" : "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==" ,
"dependencies" : {
"balanced-match" : "^1.0.0" ,
"concat-map" : "0.0.1"
}
} ,
"node_modules/call-bind-apply-helpers" : {
"version" : "1.0.2" ,
"resolved" : "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz" ,
"integrity" : "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==" ,
"dependencies" : {
2026-05-08 09:11:06 +00:00
"es-errors" : "^1.3.0" ,
"function-bind" : "^1.1.2"
} ,
"engines" : {
"node" : ">= 0.4"
}
} ,
"node_modules/call-bound" : {
"version" : "1.0.4" ,
"resolved" : "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz" ,
"integrity" : "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==" ,
"dependencies" : {
"call-bind-apply-helpers" : "^1.0.2" ,
"get-intrinsic" : "^1.3.0"
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
} ,
"engines" : {
"node" : ">= 0.4"
2026-05-08 09:11:06 +00:00
} ,
"funding" : {
"url" : "https://github.com/sponsors/ljharb"
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
}
} ,
"node_modules/callsites" : {
"version" : "3.1.0" ,
"resolved" : "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" ,
"integrity" : "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" ,
"dev" : true ,
"engines" : {
"node" : ">=6"
}
} ,
"node_modules/chalk" : {
"version" : "4.1.2" ,
"resolved" : "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" ,
"integrity" : "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==" ,
"dev" : true ,
"dependencies" : {
"ansi-styles" : "^4.1.0" ,
"supports-color" : "^7.1.0"
} ,
"engines" : {
"node" : ">=10"
} ,
"funding" : {
"url" : "https://github.com/chalk/chalk?sponsor=1"
}
} ,
"node_modules/color-convert" : {
"version" : "2.0.1" ,
"resolved" : "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" ,
"integrity" : "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" ,
"dev" : true ,
"dependencies" : {
"color-name" : "~1.1.4"
} ,
"engines" : {
"node" : ">=7.0.0"
}
} ,
"node_modules/color-name" : {
"version" : "1.1.4" ,
"resolved" : "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" ,
"integrity" : "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" ,
"dev" : true
} ,
"node_modules/combined-stream" : {
"version" : "1.0.8" ,
"resolved" : "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" ,
"integrity" : "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==" ,
"dependencies" : {
"delayed-stream" : "~1.0.0"
} ,
"engines" : {
"node" : ">= 0.8"
}
} ,
"node_modules/compute-scroll-into-view" : {
"version" : "1.0.20" ,
"resolved" : "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz" ,
"integrity" : "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg=="
} ,
"node_modules/concat-map" : {
"version" : "0.0.1" ,
"resolved" : "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" ,
2026-05-08 22:17:25 +00:00
"integrity" : "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
} ,
"node_modules/core-js" : {
"version" : "3.49.0" ,
"resolved" : "https://registry.npmjs.org/core-js/-/core-js-3.49.0.tgz" ,
"integrity" : "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==" ,
"hasInstallScript" : true ,
"funding" : {
"type" : "opencollective" ,
"url" : "https://opencollective.com/core-js"
}
} ,
"node_modules/cross-spawn" : {
"version" : "7.0.6" ,
"resolved" : "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" ,
"integrity" : "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==" ,
"dev" : true ,
"dependencies" : {
"path-key" : "^3.1.0" ,
"shebang-command" : "^2.0.0" ,
"which" : "^2.0.1"
} ,
"engines" : {
"node" : ">= 8"
}
} ,
"node_modules/cssesc" : {
"version" : "3.0.0" ,
"resolved" : "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" ,
"integrity" : "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" ,
"dev" : true ,
"bin" : {
"cssesc" : "bin/cssesc"
} ,
"engines" : {
"node" : ">=4"
}
} ,
"node_modules/csstype" : {
"version" : "3.2.3" ,
"resolved" : "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz" ,
"integrity" : "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="
} ,
"node_modules/dayjs" : {
"version" : "1.11.20" ,
"resolved" : "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz" ,
"integrity" : "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ=="
} ,
"node_modules/debug" : {
"version" : "4.4.3" ,
"resolved" : "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" ,
"integrity" : "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==" ,
"dev" : true ,
"dependencies" : {
"ms" : "^2.1.3"
} ,
"engines" : {
"node" : ">=6.0"
} ,
"peerDependenciesMeta" : {
"supports-color" : {
"optional" : true
}
}
} ,
"node_modules/deep-is" : {
"version" : "0.1.4" ,
"resolved" : "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" ,
"integrity" : "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" ,
"dev" : true
} ,
"node_modules/delayed-stream" : {
"version" : "1.0.0" ,
"resolved" : "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" ,
"integrity" : "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" ,
"engines" : {
"node" : ">=0.4.0"
}
} ,
2026-05-08 09:11:06 +00:00
"node_modules/detect-libc" : {
"version" : "2.1.2" ,
"resolved" : "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz" ,
"integrity" : "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==" ,
"dev" : true ,
"engines" : {
"node" : ">=8"
}
} ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"node_modules/dom-align" : {
"version" : "1.12.4" ,
"resolved" : "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz" ,
"integrity" : "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw=="
} ,
"node_modules/dom-scroll-into-view" : {
"version" : "2.0.1" ,
"resolved" : "https://registry.npmjs.org/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz" ,
"integrity" : "sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w=="
} ,
"node_modules/dunder-proto" : {
"version" : "1.0.1" ,
"resolved" : "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" ,
"integrity" : "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==" ,
"dependencies" : {
"call-bind-apply-helpers" : "^1.0.1" ,
"es-errors" : "^1.3.0" ,
"gopd" : "^1.2.0"
} ,
"engines" : {
"node" : ">= 0.4"
}
} ,
"node_modules/entities" : {
"version" : "7.0.1" ,
"resolved" : "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz" ,
"integrity" : "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==" ,
"engines" : {
"node" : ">=0.12"
} ,
"funding" : {
"url" : "https://github.com/fb55/entities?sponsor=1"
}
} ,
"node_modules/es-define-property" : {
"version" : "1.0.1" ,
"resolved" : "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" ,
"integrity" : "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" ,
"engines" : {
"node" : ">= 0.4"
}
} ,
"node_modules/es-errors" : {
"version" : "1.3.0" ,
"resolved" : "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" ,
"integrity" : "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" ,
"engines" : {
"node" : ">= 0.4"
}
} ,
"node_modules/es-object-atoms" : {
"version" : "1.1.1" ,
"resolved" : "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz" ,
"integrity" : "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==" ,
"dependencies" : {
"es-errors" : "^1.3.0"
} ,
"engines" : {
"node" : ">= 0.4"
}
} ,
"node_modules/es-set-tostringtag" : {
"version" : "2.1.0" ,
"resolved" : "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz" ,
"integrity" : "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==" ,
"dependencies" : {
"es-errors" : "^1.3.0" ,
"get-intrinsic" : "^1.2.6" ,
"has-tostringtag" : "^1.0.2" ,
"hasown" : "^2.0.2"
} ,
"engines" : {
"node" : ">= 0.4"
}
} ,
"node_modules/escape-string-regexp" : {
"version" : "4.0.0" ,
"resolved" : "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" ,
"integrity" : "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" ,
"dev" : true ,
"engines" : {
"node" : ">=10"
} ,
"funding" : {
"url" : "https://github.com/sponsors/sindresorhus"
}
} ,
"node_modules/eslint" : {
"version" : "9.39.4" ,
"resolved" : "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz" ,
"integrity" : "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==" ,
"dev" : true ,
"dependencies" : {
"@eslint-community/eslint-utils" : "^4.8.0" ,
"@eslint-community/regexpp" : "^4.12.1" ,
"@eslint/config-array" : "^0.21.2" ,
"@eslint/config-helpers" : "^0.4.2" ,
"@eslint/core" : "^0.17.0" ,
"@eslint/eslintrc" : "^3.3.5" ,
"@eslint/js" : "9.39.4" ,
"@eslint/plugin-kit" : "^0.4.1" ,
"@humanfs/node" : "^0.16.6" ,
"@humanwhocodes/module-importer" : "^1.0.1" ,
"@humanwhocodes/retry" : "^0.4.2" ,
"@types/estree" : "^1.0.6" ,
"ajv" : "^6.14.0" ,
"chalk" : "^4.0.0" ,
"cross-spawn" : "^7.0.6" ,
"debug" : "^4.3.2" ,
"escape-string-regexp" : "^4.0.0" ,
"eslint-scope" : "^8.4.0" ,
"eslint-visitor-keys" : "^4.2.1" ,
"espree" : "^10.4.0" ,
"esquery" : "^1.5.0" ,
"esutils" : "^2.0.2" ,
"fast-deep-equal" : "^3.1.3" ,
"file-entry-cache" : "^8.0.0" ,
"find-up" : "^5.0.0" ,
"glob-parent" : "^6.0.2" ,
"ignore" : "^5.2.0" ,
"imurmurhash" : "^0.1.4" ,
"is-glob" : "^4.0.0" ,
"json-stable-stringify-without-jsonify" : "^1.0.1" ,
"lodash.merge" : "^4.6.2" ,
"minimatch" : "^3.1.5" ,
"natural-compare" : "^1.4.0" ,
"optionator" : "^0.9.3"
} ,
"bin" : {
"eslint" : "bin/eslint.js"
} ,
"engines" : {
"node" : "^18.18.0 || ^20.9.0 || >=21.1.0"
} ,
"funding" : {
"url" : "https://eslint.org/donate"
} ,
"peerDependencies" : {
"jiti" : "*"
} ,
"peerDependenciesMeta" : {
"jiti" : {
"optional" : true
}
}
} ,
"node_modules/eslint-plugin-vue" : {
"version" : "9.33.0" ,
"resolved" : "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.33.0.tgz" ,
"integrity" : "sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==" ,
"dev" : true ,
"dependencies" : {
"@eslint-community/eslint-utils" : "^4.4.0" ,
"globals" : "^13.24.0" ,
"natural-compare" : "^1.4.0" ,
"nth-check" : "^2.1.1" ,
"postcss-selector-parser" : "^6.0.15" ,
"semver" : "^7.6.3" ,
"vue-eslint-parser" : "^9.4.3" ,
"xml-name-validator" : "^4.0.0"
} ,
"engines" : {
"node" : "^14.17.0 || >=16.0.0"
} ,
"peerDependencies" : {
"eslint" : "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0"
}
} ,
"node_modules/eslint-plugin-vue/node_modules/globals" : {
"version" : "13.24.0" ,
"resolved" : "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz" ,
"integrity" : "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==" ,
"dev" : true ,
"dependencies" : {
"type-fest" : "^0.20.2"
} ,
"engines" : {
"node" : ">=8"
} ,
"funding" : {
"url" : "https://github.com/sponsors/sindresorhus"
}
} ,
"node_modules/eslint-scope" : {
"version" : "8.4.0" ,
"resolved" : "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz" ,
"integrity" : "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==" ,
"dev" : true ,
"dependencies" : {
"esrecurse" : "^4.3.0" ,
"estraverse" : "^5.2.0"
} ,
"engines" : {
"node" : "^18.18.0 || ^20.9.0 || >=21.1.0"
} ,
"funding" : {
"url" : "https://opencollective.com/eslint"
}
} ,
"node_modules/eslint-visitor-keys" : {
"version" : "4.2.1" ,
"resolved" : "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz" ,
"integrity" : "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==" ,
"dev" : true ,
"engines" : {
"node" : "^18.18.0 || ^20.9.0 || >=21.1.0"
} ,
"funding" : {
"url" : "https://opencollective.com/eslint"
}
} ,
"node_modules/espree" : {
"version" : "10.4.0" ,
"resolved" : "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz" ,
"integrity" : "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==" ,
"dev" : true ,
"dependencies" : {
"acorn" : "^8.15.0" ,
"acorn-jsx" : "^5.3.2" ,
"eslint-visitor-keys" : "^4.2.1"
} ,
"engines" : {
"node" : "^18.18.0 || ^20.9.0 || >=21.1.0"
} ,
"funding" : {
"url" : "https://opencollective.com/eslint"
}
} ,
"node_modules/esquery" : {
"version" : "1.7.0" ,
"resolved" : "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz" ,
"integrity" : "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==" ,
"dev" : true ,
"dependencies" : {
"estraverse" : "^5.1.0"
} ,
"engines" : {
"node" : ">=0.10"
}
} ,
"node_modules/esrecurse" : {
"version" : "4.3.0" ,
"resolved" : "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" ,
"integrity" : "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==" ,
"dev" : true ,
"dependencies" : {
"estraverse" : "^5.2.0"
} ,
"engines" : {
"node" : ">=4.0"
}
} ,
"node_modules/estraverse" : {
"version" : "5.3.0" ,
"resolved" : "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" ,
"integrity" : "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" ,
"dev" : true ,
"engines" : {
"node" : ">=4.0"
}
} ,
"node_modules/estree-walker" : {
"version" : "2.0.2" ,
"resolved" : "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" ,
"integrity" : "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
} ,
"node_modules/esutils" : {
"version" : "2.0.3" ,
"resolved" : "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" ,
"integrity" : "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" ,
"dev" : true ,
"engines" : {
"node" : ">=0.10.0"
}
} ,
"node_modules/fast-deep-equal" : {
"version" : "3.1.3" ,
"resolved" : "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" ,
"integrity" : "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" ,
"dev" : true
} ,
"node_modules/fast-json-stable-stringify" : {
"version" : "2.1.0" ,
"resolved" : "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" ,
"integrity" : "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" ,
"dev" : true
} ,
"node_modules/fast-levenshtein" : {
"version" : "2.0.6" ,
"resolved" : "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" ,
"integrity" : "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" ,
"dev" : true
} ,
"node_modules/fdir" : {
"version" : "6.5.0" ,
"resolved" : "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz" ,
"integrity" : "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==" ,
"dev" : true ,
"engines" : {
"node" : ">=12.0.0"
} ,
"peerDependencies" : {
"picomatch" : "^3 || ^4"
} ,
"peerDependenciesMeta" : {
"picomatch" : {
"optional" : true
}
}
} ,
"node_modules/file-entry-cache" : {
"version" : "8.0.0" ,
"resolved" : "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz" ,
"integrity" : "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==" ,
"dev" : true ,
"dependencies" : {
"flat-cache" : "^4.0.0"
} ,
"engines" : {
"node" : ">=16.0.0"
}
} ,
"node_modules/find-up" : {
"version" : "5.0.0" ,
"resolved" : "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" ,
"integrity" : "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==" ,
"dev" : true ,
"dependencies" : {
"locate-path" : "^6.0.0" ,
"path-exists" : "^4.0.0"
} ,
"engines" : {
"node" : ">=10"
} ,
"funding" : {
"url" : "https://github.com/sponsors/sindresorhus"
}
} ,
"node_modules/flat-cache" : {
"version" : "4.0.1" ,
"resolved" : "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz" ,
"integrity" : "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==" ,
"dev" : true ,
"dependencies" : {
"flatted" : "^3.2.9" ,
"keyv" : "^4.5.4"
} ,
"engines" : {
"node" : ">=16"
}
} ,
"node_modules/flatted" : {
"version" : "3.4.2" ,
"resolved" : "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz" ,
"integrity" : "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==" ,
"dev" : true
} ,
"node_modules/follow-redirects" : {
"version" : "1.16.0" ,
"resolved" : "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz" ,
"integrity" : "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==" ,
"funding" : [
{
"type" : "individual" ,
"url" : "https://github.com/sponsors/RubenVerborgh"
}
] ,
"engines" : {
"node" : ">=4.0"
} ,
"peerDependenciesMeta" : {
"debug" : {
"optional" : true
}
}
} ,
"node_modules/form-data" : {
"version" : "4.0.5" ,
"resolved" : "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz" ,
"integrity" : "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==" ,
"dependencies" : {
"asynckit" : "^0.4.0" ,
"combined-stream" : "^1.0.8" ,
"es-set-tostringtag" : "^2.1.0" ,
"hasown" : "^2.0.2" ,
"mime-types" : "^2.1.12"
} ,
"engines" : {
"node" : ">= 6"
}
} ,
2026-05-08 22:17:25 +00:00
"node_modules/fs.realpath" : {
"version" : "1.0.0" ,
"resolved" : "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" ,
"integrity" : "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
} ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"node_modules/fsevents" : {
"version" : "2.3.3" ,
"resolved" : "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" ,
"integrity" : "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==" ,
"dev" : true ,
"hasInstallScript" : true ,
"optional" : true ,
"os" : [
"darwin"
] ,
"engines" : {
"node" : "^8.16.0 || ^10.6.0 || >=11.0.0"
}
} ,
"node_modules/function-bind" : {
"version" : "1.1.2" ,
"resolved" : "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" ,
"integrity" : "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" ,
"funding" : {
"url" : "https://github.com/sponsors/ljharb"
}
} ,
"node_modules/get-intrinsic" : {
"version" : "1.3.0" ,
"resolved" : "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" ,
"integrity" : "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==" ,
"dependencies" : {
"call-bind-apply-helpers" : "^1.0.2" ,
"es-define-property" : "^1.0.1" ,
"es-errors" : "^1.3.0" ,
"es-object-atoms" : "^1.1.1" ,
"function-bind" : "^1.1.2" ,
"get-proto" : "^1.0.1" ,
"gopd" : "^1.2.0" ,
"has-symbols" : "^1.1.0" ,
"hasown" : "^2.0.2" ,
"math-intrinsics" : "^1.1.0"
} ,
"engines" : {
"node" : ">= 0.4"
} ,
"funding" : {
"url" : "https://github.com/sponsors/ljharb"
}
} ,
"node_modules/get-proto" : {
"version" : "1.0.1" ,
"resolved" : "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz" ,
"integrity" : "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==" ,
"dependencies" : {
"dunder-proto" : "^1.0.1" ,
"es-object-atoms" : "^1.0.0"
} ,
"engines" : {
"node" : ">= 0.4"
}
} ,
2026-05-08 22:17:25 +00:00
"node_modules/glob" : {
"version" : "7.2.3" ,
"resolved" : "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" ,
"integrity" : "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==" ,
"deprecated" : "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me" ,
"dependencies" : {
"fs.realpath" : "^1.0.0" ,
"inflight" : "^1.0.4" ,
"inherits" : "2" ,
"minimatch" : "^3.1.1" ,
"once" : "^1.3.0" ,
"path-is-absolute" : "^1.0.0"
} ,
"engines" : {
"node" : "*"
} ,
"funding" : {
"url" : "https://github.com/sponsors/isaacs"
}
} ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"node_modules/glob-parent" : {
"version" : "6.0.2" ,
"resolved" : "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" ,
"integrity" : "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==" ,
"dev" : true ,
"dependencies" : {
"is-glob" : "^4.0.3"
} ,
"engines" : {
"node" : ">=10.13.0"
}
} ,
"node_modules/globals" : {
"version" : "14.0.0" ,
"resolved" : "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz" ,
"integrity" : "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==" ,
"dev" : true ,
"engines" : {
"node" : ">=18"
} ,
"funding" : {
"url" : "https://github.com/sponsors/sindresorhus"
}
} ,
"node_modules/gopd" : {
"version" : "1.2.0" ,
"resolved" : "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" ,
"integrity" : "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" ,
"engines" : {
"node" : ">= 0.4"
} ,
"funding" : {
"url" : "https://github.com/sponsors/ljharb"
}
} ,
"node_modules/has-flag" : {
"version" : "4.0.0" ,
"resolved" : "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" ,
"integrity" : "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" ,
"dev" : true ,
"engines" : {
"node" : ">=8"
}
} ,
"node_modules/has-symbols" : {
"version" : "1.1.0" ,
"resolved" : "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" ,
"integrity" : "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" ,
"engines" : {
"node" : ">= 0.4"
} ,
"funding" : {
"url" : "https://github.com/sponsors/ljharb"
}
} ,
"node_modules/has-tostringtag" : {
"version" : "1.0.2" ,
"resolved" : "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" ,
"integrity" : "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==" ,
"dependencies" : {
"has-symbols" : "^1.0.3"
} ,
"engines" : {
"node" : ">= 0.4"
} ,
"funding" : {
"url" : "https://github.com/sponsors/ljharb"
}
} ,
"node_modules/hasown" : {
"version" : "2.0.3" ,
"resolved" : "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz" ,
"integrity" : "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==" ,
"dependencies" : {
"function-bind" : "^1.1.2"
} ,
"engines" : {
"node" : ">= 0.4"
}
} ,
"node_modules/ignore" : {
"version" : "5.3.2" ,
"resolved" : "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" ,
"integrity" : "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==" ,
"dev" : true ,
"engines" : {
"node" : ">= 4"
}
} ,
"node_modules/import-fresh" : {
"version" : "3.3.1" ,
"resolved" : "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz" ,
"integrity" : "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==" ,
"dev" : true ,
"dependencies" : {
"parent-module" : "^1.0.0" ,
"resolve-from" : "^4.0.0"
} ,
"engines" : {
"node" : ">=6"
} ,
"funding" : {
"url" : "https://github.com/sponsors/sindresorhus"
}
} ,
"node_modules/imurmurhash" : {
"version" : "0.1.4" ,
"resolved" : "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" ,
"integrity" : "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" ,
"dev" : true ,
"engines" : {
"node" : ">=0.8.19"
}
} ,
2026-05-08 22:17:25 +00:00
"node_modules/inflight" : {
"version" : "1.0.6" ,
"resolved" : "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" ,
"integrity" : "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==" ,
"deprecated" : "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful." ,
"dependencies" : {
"once" : "^1.3.0" ,
"wrappy" : "1"
}
} ,
"node_modules/inherits" : {
"version" : "2.0.4" ,
"resolved" : "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" ,
"integrity" : "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
} ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"node_modules/is-extglob" : {
"version" : "2.1.1" ,
"resolved" : "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" ,
"integrity" : "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" ,
"dev" : true ,
"engines" : {
"node" : ">=0.10.0"
}
} ,
"node_modules/is-glob" : {
"version" : "4.0.3" ,
"resolved" : "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" ,
"integrity" : "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==" ,
"dev" : true ,
"dependencies" : {
"is-extglob" : "^2.1.1"
} ,
"engines" : {
"node" : ">=0.10.0"
}
} ,
"node_modules/is-plain-object" : {
"version" : "3.0.1" ,
"resolved" : "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz" ,
"integrity" : "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==" ,
"engines" : {
"node" : ">=0.10.0"
}
} ,
"node_modules/isexe" : {
"version" : "2.0.0" ,
"resolved" : "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" ,
"integrity" : "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" ,
"dev" : true
} ,
2026-05-08 22:17:25 +00:00
"node_modules/jalaali-js" : {
"version" : "1.2.8" ,
"resolved" : "https://registry.npmjs.org/jalaali-js/-/jalaali-js-1.2.8.tgz" ,
"integrity" : "sha512-Jl/EwY84JwjW2wsWqeU4pNd22VNQ7EkjI36bDuLw31wH98WQW4fPjD0+mG7cdCK+Y8D6s9R3zLiQ3LaKu6bD8A=="
} ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"node_modules/js-tokens" : {
"version" : "4.0.0" ,
"resolved" : "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" ,
"integrity" : "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
} ,
"node_modules/js-yaml" : {
"version" : "4.1.1" ,
"resolved" : "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz" ,
"integrity" : "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==" ,
"dev" : true ,
"dependencies" : {
"argparse" : "^2.0.1"
} ,
"bin" : {
"js-yaml" : "bin/js-yaml.js"
}
} ,
"node_modules/json-buffer" : {
"version" : "3.0.1" ,
"resolved" : "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" ,
"integrity" : "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" ,
"dev" : true
} ,
"node_modules/json-schema-traverse" : {
"version" : "0.4.1" ,
"resolved" : "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" ,
"integrity" : "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" ,
"dev" : true
} ,
"node_modules/json-stable-stringify-without-jsonify" : {
"version" : "1.0.1" ,
"resolved" : "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" ,
"integrity" : "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" ,
"dev" : true
} ,
"node_modules/keyv" : {
"version" : "4.5.4" ,
"resolved" : "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" ,
"integrity" : "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==" ,
"dev" : true ,
"dependencies" : {
"json-buffer" : "3.0.1"
}
} ,
"node_modules/levn" : {
"version" : "0.4.1" ,
"resolved" : "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" ,
"integrity" : "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==" ,
"dev" : true ,
"dependencies" : {
"prelude-ls" : "^1.2.1" ,
"type-check" : "~0.4.0"
} ,
"engines" : {
"node" : ">= 0.8.0"
}
} ,
2026-05-08 09:11:06 +00:00
"node_modules/lightningcss" : {
"version" : "1.32.0" ,
"resolved" : "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz" ,
"integrity" : "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==" ,
"dev" : true ,
"dependencies" : {
"detect-libc" : "^2.0.3"
} ,
"engines" : {
"node" : ">= 12.0.0"
} ,
"funding" : {
"type" : "opencollective" ,
"url" : "https://opencollective.com/parcel"
} ,
"optionalDependencies" : {
"lightningcss-android-arm64" : "1.32.0" ,
"lightningcss-darwin-arm64" : "1.32.0" ,
"lightningcss-darwin-x64" : "1.32.0" ,
"lightningcss-freebsd-x64" : "1.32.0" ,
"lightningcss-linux-arm-gnueabihf" : "1.32.0" ,
"lightningcss-linux-arm64-gnu" : "1.32.0" ,
"lightningcss-linux-arm64-musl" : "1.32.0" ,
"lightningcss-linux-x64-gnu" : "1.32.0" ,
"lightningcss-linux-x64-musl" : "1.32.0" ,
"lightningcss-win32-arm64-msvc" : "1.32.0" ,
"lightningcss-win32-x64-msvc" : "1.32.0"
}
} ,
"node_modules/lightningcss-android-arm64" : {
"version" : "1.32.0" ,
"resolved" : "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz" ,
"integrity" : "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==" ,
"cpu" : [
"arm64"
] ,
"dev" : true ,
"optional" : true ,
"os" : [
"android"
] ,
"engines" : {
"node" : ">= 12.0.0"
} ,
"funding" : {
"type" : "opencollective" ,
"url" : "https://opencollective.com/parcel"
}
} ,
"node_modules/lightningcss-darwin-arm64" : {
"version" : "1.32.0" ,
"resolved" : "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz" ,
"integrity" : "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==" ,
"cpu" : [
"arm64"
] ,
"dev" : true ,
"optional" : true ,
"os" : [
"darwin"
] ,
"engines" : {
"node" : ">= 12.0.0"
} ,
"funding" : {
"type" : "opencollective" ,
"url" : "https://opencollective.com/parcel"
}
} ,
"node_modules/lightningcss-darwin-x64" : {
"version" : "1.32.0" ,
"resolved" : "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz" ,
"integrity" : "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==" ,
"cpu" : [
"x64"
] ,
"dev" : true ,
"optional" : true ,
"os" : [
"darwin"
] ,
"engines" : {
"node" : ">= 12.0.0"
} ,
"funding" : {
"type" : "opencollective" ,
"url" : "https://opencollective.com/parcel"
}
} ,
"node_modules/lightningcss-freebsd-x64" : {
"version" : "1.32.0" ,
"resolved" : "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz" ,
"integrity" : "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==" ,
"cpu" : [
"x64"
] ,
"dev" : true ,
"optional" : true ,
"os" : [
"freebsd"
] ,
"engines" : {
"node" : ">= 12.0.0"
} ,
"funding" : {
"type" : "opencollective" ,
"url" : "https://opencollective.com/parcel"
}
} ,
"node_modules/lightningcss-linux-arm-gnueabihf" : {
"version" : "1.32.0" ,
"resolved" : "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz" ,
"integrity" : "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==" ,
"cpu" : [
"arm"
] ,
"dev" : true ,
"optional" : true ,
"os" : [
"linux"
] ,
"engines" : {
"node" : ">= 12.0.0"
} ,
"funding" : {
"type" : "opencollective" ,
"url" : "https://opencollective.com/parcel"
}
} ,
"node_modules/lightningcss-linux-arm64-gnu" : {
"version" : "1.32.0" ,
"resolved" : "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz" ,
"integrity" : "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==" ,
"cpu" : [
"arm64"
] ,
"dev" : true ,
"optional" : true ,
"os" : [
"linux"
] ,
"engines" : {
"node" : ">= 12.0.0"
} ,
"funding" : {
"type" : "opencollective" ,
"url" : "https://opencollective.com/parcel"
}
} ,
"node_modules/lightningcss-linux-arm64-musl" : {
"version" : "1.32.0" ,
"resolved" : "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz" ,
"integrity" : "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==" ,
"cpu" : [
"arm64"
] ,
"dev" : true ,
"optional" : true ,
"os" : [
"linux"
] ,
"engines" : {
"node" : ">= 12.0.0"
} ,
"funding" : {
"type" : "opencollective" ,
"url" : "https://opencollective.com/parcel"
}
} ,
"node_modules/lightningcss-linux-x64-gnu" : {
"version" : "1.32.0" ,
"resolved" : "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz" ,
"integrity" : "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==" ,
"cpu" : [
"x64"
] ,
"dev" : true ,
"optional" : true ,
"os" : [
"linux"
] ,
"engines" : {
"node" : ">= 12.0.0"
} ,
"funding" : {
"type" : "opencollective" ,
"url" : "https://opencollective.com/parcel"
}
} ,
"node_modules/lightningcss-linux-x64-musl" : {
"version" : "1.32.0" ,
"resolved" : "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz" ,
"integrity" : "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==" ,
"cpu" : [
"x64"
] ,
"dev" : true ,
"optional" : true ,
"os" : [
"linux"
] ,
"engines" : {
"node" : ">= 12.0.0"
} ,
"funding" : {
"type" : "opencollective" ,
"url" : "https://opencollective.com/parcel"
}
} ,
"node_modules/lightningcss-win32-arm64-msvc" : {
"version" : "1.32.0" ,
"resolved" : "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz" ,
"integrity" : "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==" ,
"cpu" : [
"arm64"
] ,
"dev" : true ,
"optional" : true ,
"os" : [
"win32"
] ,
"engines" : {
"node" : ">= 12.0.0"
} ,
"funding" : {
"type" : "opencollective" ,
"url" : "https://opencollective.com/parcel"
}
} ,
"node_modules/lightningcss-win32-x64-msvc" : {
"version" : "1.32.0" ,
"resolved" : "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz" ,
"integrity" : "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==" ,
"cpu" : [
"x64"
] ,
"dev" : true ,
"optional" : true ,
"os" : [
"win32"
] ,
"engines" : {
"node" : ">= 12.0.0"
} ,
"funding" : {
"type" : "opencollective" ,
"url" : "https://opencollective.com/parcel"
}
} ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"node_modules/locate-path" : {
"version" : "6.0.0" ,
"resolved" : "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" ,
"integrity" : "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==" ,
"dev" : true ,
"dependencies" : {
"p-locate" : "^5.0.0"
} ,
"engines" : {
"node" : ">=10"
} ,
"funding" : {
"url" : "https://github.com/sponsors/sindresorhus"
}
} ,
"node_modules/lodash" : {
"version" : "4.18.1" ,
"resolved" : "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz" ,
"integrity" : "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q=="
} ,
"node_modules/lodash-es" : {
"version" : "4.18.1" ,
"resolved" : "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz" ,
"integrity" : "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A=="
} ,
"node_modules/lodash.merge" : {
"version" : "4.6.2" ,
"resolved" : "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" ,
"integrity" : "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" ,
"dev" : true
} ,
"node_modules/loose-envify" : {
"version" : "1.4.0" ,
"resolved" : "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" ,
"integrity" : "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==" ,
"dependencies" : {
"js-tokens" : "^3.0.0 || ^4.0.0"
} ,
"bin" : {
"loose-envify" : "cli.js"
}
} ,
"node_modules/magic-string" : {
"version" : "0.30.21" ,
"resolved" : "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz" ,
"integrity" : "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==" ,
"dependencies" : {
"@jridgewell/sourcemap-codec" : "^1.5.5"
}
} ,
"node_modules/math-intrinsics" : {
"version" : "1.1.0" ,
"resolved" : "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" ,
"integrity" : "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" ,
"engines" : {
"node" : ">= 0.4"
}
} ,
"node_modules/mime-db" : {
"version" : "1.52.0" ,
"resolved" : "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" ,
"integrity" : "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" ,
"engines" : {
"node" : ">= 0.6"
}
} ,
"node_modules/mime-types" : {
"version" : "2.1.35" ,
"resolved" : "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" ,
"integrity" : "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==" ,
"dependencies" : {
"mime-db" : "1.52.0"
} ,
"engines" : {
"node" : ">= 0.6"
}
} ,
"node_modules/minimatch" : {
"version" : "3.1.5" ,
"resolved" : "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz" ,
"integrity" : "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==" ,
"dependencies" : {
"brace-expansion" : "^1.1.7"
} ,
"engines" : {
"node" : "*"
}
} ,
"node_modules/moment" : {
"version" : "2.30.1" ,
"resolved" : "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz" ,
"integrity" : "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==" ,
"engines" : {
"node" : "*"
}
} ,
2026-05-08 22:17:25 +00:00
"node_modules/moment-jalaali" : {
"version" : "0.9.6" ,
"resolved" : "https://registry.npmjs.org/moment-jalaali/-/moment-jalaali-0.9.6.tgz" ,
"integrity" : "sha512-v8wXjQplvk5ez+sUqgsWIrafwIf1BEXXvzTYwsg1wHcqh27nSgKPCJ6FnZRrCz03MoNyB9N31L0oms+vE8Rq7g==" ,
"dependencies" : {
"jalaali-js" : "^1.1.0" ,
"moment" : "^2.22.2" ,
"moment-timezone" : "^0.5.21" ,
"rimraf" : "^3.0.2"
}
} ,
"node_modules/moment-timezone" : {
"version" : "0.5.48" ,
"resolved" : "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.48.tgz" ,
"integrity" : "sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==" ,
"dependencies" : {
"moment" : "^2.29.4"
} ,
"engines" : {
"node" : "*"
}
} ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"node_modules/ms" : {
"version" : "2.1.3" ,
"resolved" : "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" ,
"integrity" : "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" ,
"dev" : true
} ,
"node_modules/nanoid" : {
"version" : "3.3.12" ,
"resolved" : "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz" ,
"integrity" : "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==" ,
"funding" : [
{
"type" : "github" ,
"url" : "https://github.com/sponsors/ai"
}
] ,
"bin" : {
"nanoid" : "bin/nanoid.cjs"
} ,
"engines" : {
"node" : "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
} ,
"node_modules/nanopop" : {
"version" : "2.4.2" ,
"resolved" : "https://registry.npmjs.org/nanopop/-/nanopop-2.4.2.tgz" ,
"integrity" : "sha512-NzOgmMQ+elxxHeIha+OG/Pv3Oc3p4RU2aBhwWwAqDpXrdTbtRylbRLQztLy8dMMwfl6pclznBdfUhccEn9ZIzw=="
} ,
"node_modules/natural-compare" : {
"version" : "1.4.0" ,
"resolved" : "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" ,
"integrity" : "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" ,
"dev" : true
} ,
"node_modules/nth-check" : {
"version" : "2.1.1" ,
"resolved" : "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" ,
"integrity" : "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==" ,
"dev" : true ,
"dependencies" : {
"boolbase" : "^1.0.0"
} ,
"funding" : {
"url" : "https://github.com/fb55/nth-check?sponsor=1"
}
} ,
2026-05-08 09:11:06 +00:00
"node_modules/object-inspect" : {
"version" : "1.13.4" ,
"resolved" : "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz" ,
"integrity" : "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==" ,
"engines" : {
"node" : ">= 0.4"
} ,
"funding" : {
"url" : "https://github.com/sponsors/ljharb"
}
} ,
2026-05-08 22:17:25 +00:00
"node_modules/once" : {
"version" : "1.4.0" ,
"resolved" : "https://registry.npmjs.org/once/-/once-1.4.0.tgz" ,
"integrity" : "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==" ,
"dependencies" : {
"wrappy" : "1"
}
} ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"node_modules/optionator" : {
"version" : "0.9.4" ,
"resolved" : "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" ,
"integrity" : "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==" ,
"dev" : true ,
"dependencies" : {
"deep-is" : "^0.1.3" ,
"fast-levenshtein" : "^2.0.6" ,
"levn" : "^0.4.1" ,
"prelude-ls" : "^1.2.1" ,
"type-check" : "^0.4.0" ,
"word-wrap" : "^1.2.5"
} ,
"engines" : {
"node" : ">= 0.8.0"
}
} ,
2026-05-08 11:08:39 +00:00
"node_modules/otpauth" : {
"version" : "9.5.1" ,
"resolved" : "https://registry.npmjs.org/otpauth/-/otpauth-9.5.1.tgz" ,
"integrity" : "sha512-fJmDAHc8wImfqqqOXIlBvT1dEKrZK0Cmb2VEgScpNTolCz0PHh6ExUZGv4sLtOsWNaHCQlD+rRqaPgnoxFoZjQ==" ,
"dependencies" : {
"@noble/hashes" : "2.2.0"
} ,
"funding" : {
"url" : "https://github.com/hectorm/otpauth?sponsor=1"
}
} ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"node_modules/p-limit" : {
"version" : "3.1.0" ,
"resolved" : "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" ,
"integrity" : "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==" ,
"dev" : true ,
"dependencies" : {
"yocto-queue" : "^0.1.0"
} ,
"engines" : {
"node" : ">=10"
} ,
"funding" : {
"url" : "https://github.com/sponsors/sindresorhus"
}
} ,
"node_modules/p-locate" : {
"version" : "5.0.0" ,
"resolved" : "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" ,
"integrity" : "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==" ,
"dev" : true ,
"dependencies" : {
"p-limit" : "^3.0.2"
} ,
"engines" : {
"node" : ">=10"
} ,
"funding" : {
"url" : "https://github.com/sponsors/sindresorhus"
}
} ,
"node_modules/parent-module" : {
"version" : "1.0.1" ,
"resolved" : "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" ,
"integrity" : "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==" ,
"dev" : true ,
"dependencies" : {
"callsites" : "^3.0.0"
} ,
"engines" : {
"node" : ">=6"
}
} ,
"node_modules/path-exists" : {
"version" : "4.0.0" ,
"resolved" : "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" ,
"integrity" : "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" ,
"dev" : true ,
"engines" : {
"node" : ">=8"
}
} ,
2026-05-08 22:17:25 +00:00
"node_modules/path-is-absolute" : {
"version" : "1.0.1" ,
"resolved" : "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" ,
"integrity" : "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" ,
"engines" : {
"node" : ">=0.10.0"
}
} ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"node_modules/path-key" : {
"version" : "3.1.1" ,
"resolved" : "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" ,
"integrity" : "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" ,
"dev" : true ,
"engines" : {
"node" : ">=8"
}
} ,
"node_modules/picocolors" : {
"version" : "1.1.1" ,
"resolved" : "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" ,
"integrity" : "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
} ,
"node_modules/picomatch" : {
"version" : "4.0.4" ,
"resolved" : "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz" ,
"integrity" : "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==" ,
"dev" : true ,
"engines" : {
"node" : ">=12"
} ,
"funding" : {
"url" : "https://github.com/sponsors/jonschlinkert"
}
} ,
"node_modules/postcss" : {
"version" : "8.5.14" ,
"resolved" : "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz" ,
"integrity" : "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==" ,
"funding" : [
{
"type" : "opencollective" ,
"url" : "https://opencollective.com/postcss/"
} ,
{
"type" : "tidelift" ,
"url" : "https://tidelift.com/funding/github/npm/postcss"
} ,
{
"type" : "github" ,
"url" : "https://github.com/sponsors/ai"
}
] ,
"dependencies" : {
"nanoid" : "^3.3.11" ,
"picocolors" : "^1.1.1" ,
"source-map-js" : "^1.2.1"
} ,
"engines" : {
"node" : "^10 || ^12 || >=14"
}
} ,
"node_modules/postcss-selector-parser" : {
"version" : "6.1.2" ,
"resolved" : "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz" ,
"integrity" : "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==" ,
"dev" : true ,
"dependencies" : {
"cssesc" : "^3.0.0" ,
"util-deprecate" : "^1.0.2"
} ,
"engines" : {
"node" : ">=4"
}
} ,
"node_modules/prelude-ls" : {
"version" : "1.2.1" ,
"resolved" : "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" ,
"integrity" : "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" ,
"dev" : true ,
"engines" : {
"node" : ">= 0.8.0"
}
} ,
"node_modules/proxy-from-env" : {
"version" : "2.1.0" ,
"resolved" : "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz" ,
"integrity" : "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==" ,
"engines" : {
"node" : ">=10"
}
} ,
"node_modules/punycode" : {
"version" : "2.3.1" ,
"resolved" : "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" ,
"integrity" : "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" ,
"dev" : true ,
"engines" : {
"node" : ">=6"
}
} ,
"node_modules/qrious" : {
"version" : "4.0.2" ,
"resolved" : "https://registry.npmjs.org/qrious/-/qrious-4.0.2.tgz" ,
"integrity" : "sha512-xWPJIrK1zu5Ypn898fBp8RHkT/9ibquV2Kv24S/JY9VYEhMBMKur1gHVsOiNUh7PHP9uCgejjpZUHUIXXKoU/g=="
} ,
2026-05-08 09:11:06 +00:00
"node_modules/qs" : {
"version" : "6.15.1" ,
"resolved" : "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz" ,
"integrity" : "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==" ,
"dependencies" : {
"side-channel" : "^1.1.0"
} ,
"engines" : {
"node" : ">=0.6"
} ,
"funding" : {
"url" : "https://github.com/sponsors/ljharb"
}
} ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"node_modules/resize-observer-polyfill" : {
"version" : "1.5.1" ,
"resolved" : "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz" ,
"integrity" : "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
} ,
"node_modules/resolve-from" : {
"version" : "4.0.0" ,
"resolved" : "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" ,
"integrity" : "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" ,
"dev" : true ,
"engines" : {
"node" : ">=4"
}
} ,
2026-05-08 22:17:25 +00:00
"node_modules/rimraf" : {
"version" : "3.0.2" ,
"resolved" : "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" ,
"integrity" : "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==" ,
"deprecated" : "Rimraf versions prior to v4 are no longer supported" ,
"dependencies" : {
"glob" : "^7.1.3"
} ,
"bin" : {
"rimraf" : "bin.js"
} ,
"funding" : {
"url" : "https://github.com/sponsors/isaacs"
}
} ,
2026-05-08 09:11:06 +00:00
"node_modules/rolldown" : {
"version" : "1.0.0-rc.18" ,
"resolved" : "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.18.tgz" ,
"integrity" : "sha512-phmyKBpuBdRYDf4hgyynGAYn/rDDe+iZXKVJ7WX5b1zQzpLkP5oJRPGsfJuHdzPMlyyEO/4sPW6yfSx2gf7lVg==" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"dev" : true ,
"dependencies" : {
2026-05-08 09:11:06 +00:00
"@oxc-project/types" : "=0.128.0" ,
"@rolldown/pluginutils" : "1.0.0-rc.18"
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
} ,
"bin" : {
2026-05-08 09:11:06 +00:00
"rolldown" : "bin/cli.mjs"
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
} ,
"engines" : {
2026-05-08 09:11:06 +00:00
"node" : "^20.19.0 || >=22.12.0"
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
} ,
"optionalDependencies" : {
2026-05-08 09:11:06 +00:00
"@rolldown/binding-android-arm64" : "1.0.0-rc.18" ,
"@rolldown/binding-darwin-arm64" : "1.0.0-rc.18" ,
"@rolldown/binding-darwin-x64" : "1.0.0-rc.18" ,
"@rolldown/binding-freebsd-x64" : "1.0.0-rc.18" ,
"@rolldown/binding-linux-arm-gnueabihf" : "1.0.0-rc.18" ,
"@rolldown/binding-linux-arm64-gnu" : "1.0.0-rc.18" ,
"@rolldown/binding-linux-arm64-musl" : "1.0.0-rc.18" ,
"@rolldown/binding-linux-ppc64-gnu" : "1.0.0-rc.18" ,
"@rolldown/binding-linux-s390x-gnu" : "1.0.0-rc.18" ,
"@rolldown/binding-linux-x64-gnu" : "1.0.0-rc.18" ,
"@rolldown/binding-linux-x64-musl" : "1.0.0-rc.18" ,
"@rolldown/binding-openharmony-arm64" : "1.0.0-rc.18" ,
"@rolldown/binding-wasm32-wasi" : "1.0.0-rc.18" ,
"@rolldown/binding-win32-arm64-msvc" : "1.0.0-rc.18" ,
"@rolldown/binding-win32-x64-msvc" : "1.0.0-rc.18"
}
} ,
"node_modules/rolldown/node_modules/@rolldown/pluginutils" : {
"version" : "1.0.0-rc.18" ,
"resolved" : "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.18.tgz" ,
"integrity" : "sha512-CUY5Mnhe64xQBGZEEXQ5WyZwsc1JU3vAZLIxtrsBt3LO6UOb+C8GunVKqe9sT8NeWb4lqSaoJtp2xo6GxT1MNw==" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"dev" : true
} ,
"node_modules/scroll-into-view-if-needed" : {
"version" : "2.2.31" ,
"resolved" : "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz" ,
"integrity" : "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==" ,
"dependencies" : {
"compute-scroll-into-view" : "^1.0.20"
}
} ,
"node_modules/semver" : {
"version" : "7.7.4" ,
"resolved" : "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz" ,
"integrity" : "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==" ,
"dev" : true ,
"bin" : {
"semver" : "bin/semver.js"
} ,
"engines" : {
"node" : ">=10"
}
} ,
"node_modules/shallow-equal" : {
"version" : "1.2.1" ,
"resolved" : "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz" ,
"integrity" : "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA=="
} ,
"node_modules/shebang-command" : {
"version" : "2.0.0" ,
"resolved" : "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" ,
"integrity" : "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==" ,
"dev" : true ,
"dependencies" : {
"shebang-regex" : "^3.0.0"
} ,
"engines" : {
"node" : ">=8"
}
} ,
"node_modules/shebang-regex" : {
"version" : "3.0.0" ,
"resolved" : "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" ,
"integrity" : "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" ,
"dev" : true ,
"engines" : {
"node" : ">=8"
}
} ,
2026-05-08 09:11:06 +00:00
"node_modules/side-channel" : {
"version" : "1.1.0" ,
"resolved" : "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz" ,
"integrity" : "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==" ,
"dependencies" : {
"es-errors" : "^1.3.0" ,
"object-inspect" : "^1.13.3" ,
"side-channel-list" : "^1.0.0" ,
"side-channel-map" : "^1.0.1" ,
"side-channel-weakmap" : "^1.0.2"
} ,
"engines" : {
"node" : ">= 0.4"
} ,
"funding" : {
"url" : "https://github.com/sponsors/ljharb"
}
} ,
"node_modules/side-channel-list" : {
"version" : "1.0.1" ,
"resolved" : "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz" ,
"integrity" : "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==" ,
"dependencies" : {
"es-errors" : "^1.3.0" ,
"object-inspect" : "^1.13.4"
} ,
"engines" : {
"node" : ">= 0.4"
} ,
"funding" : {
"url" : "https://github.com/sponsors/ljharb"
}
} ,
"node_modules/side-channel-map" : {
"version" : "1.0.1" ,
"resolved" : "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz" ,
"integrity" : "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==" ,
"dependencies" : {
"call-bound" : "^1.0.2" ,
"es-errors" : "^1.3.0" ,
"get-intrinsic" : "^1.2.5" ,
"object-inspect" : "^1.13.3"
} ,
"engines" : {
"node" : ">= 0.4"
} ,
"funding" : {
"url" : "https://github.com/sponsors/ljharb"
}
} ,
"node_modules/side-channel-weakmap" : {
"version" : "1.0.2" ,
"resolved" : "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz" ,
"integrity" : "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==" ,
"dependencies" : {
"call-bound" : "^1.0.2" ,
"es-errors" : "^1.3.0" ,
"get-intrinsic" : "^1.2.5" ,
"object-inspect" : "^1.13.3" ,
"side-channel-map" : "^1.0.1"
} ,
"engines" : {
"node" : ">= 0.4"
} ,
"funding" : {
"url" : "https://github.com/sponsors/ljharb"
}
} ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"node_modules/source-map-js" : {
"version" : "1.2.1" ,
"resolved" : "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" ,
"integrity" : "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" ,
"engines" : {
"node" : ">=0.10.0"
}
} ,
"node_modules/strip-json-comments" : {
"version" : "3.1.1" ,
"resolved" : "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" ,
"integrity" : "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" ,
"dev" : true ,
"engines" : {
"node" : ">=8"
} ,
"funding" : {
"url" : "https://github.com/sponsors/sindresorhus"
}
} ,
"node_modules/stylis" : {
"version" : "4.4.0" ,
"resolved" : "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz" ,
"integrity" : "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA=="
} ,
"node_modules/supports-color" : {
"version" : "7.2.0" ,
"resolved" : "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" ,
"integrity" : "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" ,
"dev" : true ,
"dependencies" : {
"has-flag" : "^4.0.0"
} ,
"engines" : {
"node" : ">=8"
}
} ,
"node_modules/throttle-debounce" : {
"version" : "5.0.2" ,
"resolved" : "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz" ,
"integrity" : "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==" ,
"engines" : {
"node" : ">=12.22"
}
} ,
"node_modules/tinyglobby" : {
"version" : "0.2.16" ,
"resolved" : "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz" ,
"integrity" : "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==" ,
"dev" : true ,
"dependencies" : {
"fdir" : "^6.5.0" ,
"picomatch" : "^4.0.4"
} ,
"engines" : {
"node" : ">=12.0.0"
} ,
"funding" : {
"url" : "https://github.com/sponsors/SuperchupuDev"
}
} ,
2026-05-08 09:11:06 +00:00
"node_modules/tslib" : {
"version" : "2.8.1" ,
"resolved" : "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" ,
"integrity" : "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" ,
"dev" : true ,
"optional" : true
} ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"node_modules/type-check" : {
"version" : "0.4.0" ,
"resolved" : "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" ,
"integrity" : "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==" ,
"dev" : true ,
"dependencies" : {
"prelude-ls" : "^1.2.1"
} ,
"engines" : {
"node" : ">= 0.8.0"
}
} ,
"node_modules/type-fest" : {
"version" : "0.20.2" ,
"resolved" : "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" ,
"integrity" : "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" ,
"dev" : true ,
"engines" : {
"node" : ">=10"
} ,
"funding" : {
"url" : "https://github.com/sponsors/sindresorhus"
}
} ,
"node_modules/uri-js" : {
"version" : "4.4.1" ,
"resolved" : "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" ,
"integrity" : "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==" ,
"dev" : true ,
"dependencies" : {
"punycode" : "^2.1.0"
}
} ,
"node_modules/util-deprecate" : {
"version" : "1.0.2" ,
"resolved" : "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" ,
"integrity" : "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" ,
"dev" : true
} ,
"node_modules/vite" : {
2026-05-08 09:11:06 +00:00
"version" : "8.0.11" ,
"resolved" : "https://registry.npmjs.org/vite/-/vite-8.0.11.tgz" ,
"integrity" : "sha512-Jz1mxtUBR5xTT65VOdJZUUeoyLtqljmFkiUXhPTLZka3RDc9vpi/xXkyrnsdRcm2lIi3l3GPMnAidTsEGIj3Ow==" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"dev" : true ,
"dependencies" : {
2026-05-08 09:11:06 +00:00
"lightningcss" : "^1.32.0" ,
"picomatch" : "^4.0.4" ,
"postcss" : "^8.5.14" ,
"rolldown" : "1.0.0-rc.18" ,
"tinyglobby" : "^0.2.16"
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
} ,
"bin" : {
"vite" : "bin/vite.js"
} ,
"engines" : {
2026-05-08 09:11:06 +00:00
"node" : "^20.19.0 || >=22.12.0"
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
} ,
"funding" : {
"url" : "https://github.com/vitejs/vite?sponsor=1"
} ,
"optionalDependencies" : {
"fsevents" : "~2.3.3"
} ,
"peerDependencies" : {
2026-05-08 09:11:06 +00:00
"@types/node" : "^20.19.0 || >=22.12.0" ,
"@vitejs/devtools" : "^0.1.18" ,
"esbuild" : "^0.27.0 || ^0.28.0" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"jiti" : ">=1.21.0" ,
2026-05-08 09:11:06 +00:00
"less" : "^4.0.0" ,
"sass" : "^1.70.0" ,
"sass-embedded" : "^1.70.0" ,
"stylus" : ">=0.54.8" ,
"sugarss" : "^5.0.0" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"terser" : "^5.16.0" ,
"tsx" : "^4.8.1" ,
"yaml" : "^2.4.2"
} ,
"peerDependenciesMeta" : {
"@types/node" : {
"optional" : true
} ,
2026-05-08 09:11:06 +00:00
"@vitejs/devtools" : {
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"optional" : true
} ,
2026-05-08 09:11:06 +00:00
"esbuild" : {
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"optional" : true
} ,
2026-05-08 09:11:06 +00:00
"jiti" : {
"optional" : true
} ,
"less" : {
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"optional" : true
} ,
"sass" : {
"optional" : true
} ,
"sass-embedded" : {
"optional" : true
} ,
"stylus" : {
"optional" : true
} ,
"sugarss" : {
"optional" : true
} ,
"terser" : {
"optional" : true
} ,
"tsx" : {
"optional" : true
} ,
"yaml" : {
"optional" : true
}
}
} ,
"node_modules/vue" : {
"version" : "3.5.34" ,
"resolved" : "https://registry.npmjs.org/vue/-/vue-3.5.34.tgz" ,
"integrity" : "sha512-WdLBG9gm02OgJIG9axd5Hpx0TFLdzVgfG2evFFu8Rur5O/IoGc5cMjnjh3tPL6GnRGsYvUhBSKVPYVcxRKpMCA==" ,
"dependencies" : {
"@vue/compiler-dom" : "3.5.34" ,
"@vue/compiler-sfc" : "3.5.34" ,
"@vue/runtime-dom" : "3.5.34" ,
"@vue/server-renderer" : "3.5.34" ,
"@vue/shared" : "3.5.34"
} ,
"peerDependencies" : {
"typescript" : "*"
} ,
"peerDependenciesMeta" : {
"typescript" : {
"optional" : true
}
}
} ,
"node_modules/vue-eslint-parser" : {
"version" : "9.4.3" ,
"resolved" : "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz" ,
"integrity" : "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==" ,
"dev" : true ,
"dependencies" : {
"debug" : "^4.3.4" ,
"eslint-scope" : "^7.1.1" ,
"eslint-visitor-keys" : "^3.3.0" ,
"espree" : "^9.3.1" ,
"esquery" : "^1.4.0" ,
"lodash" : "^4.17.21" ,
"semver" : "^7.3.6"
} ,
"engines" : {
"node" : "^14.17.0 || >=16.0.0"
} ,
"funding" : {
"url" : "https://github.com/sponsors/mysticatea"
} ,
"peerDependencies" : {
"eslint" : ">=6.0.0"
}
} ,
"node_modules/vue-eslint-parser/node_modules/eslint-scope" : {
"version" : "7.2.2" ,
"resolved" : "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" ,
"integrity" : "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==" ,
"dev" : true ,
"dependencies" : {
"esrecurse" : "^4.3.0" ,
"estraverse" : "^5.2.0"
} ,
"engines" : {
"node" : "^12.22.0 || ^14.17.0 || >=16.0.0"
} ,
"funding" : {
"url" : "https://opencollective.com/eslint"
}
} ,
"node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys" : {
"version" : "3.4.3" ,
"resolved" : "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" ,
"integrity" : "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==" ,
"dev" : true ,
"engines" : {
"node" : "^12.22.0 || ^14.17.0 || >=16.0.0"
} ,
"funding" : {
"url" : "https://opencollective.com/eslint"
}
} ,
"node_modules/vue-eslint-parser/node_modules/espree" : {
"version" : "9.6.1" ,
"resolved" : "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" ,
"integrity" : "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==" ,
"dev" : true ,
"dependencies" : {
"acorn" : "^8.9.0" ,
"acorn-jsx" : "^5.3.2" ,
"eslint-visitor-keys" : "^3.4.1"
} ,
"engines" : {
"node" : "^12.22.0 || ^14.17.0 || >=16.0.0"
} ,
"funding" : {
"url" : "https://opencollective.com/eslint"
}
} ,
"node_modules/vue-i18n" : {
2026-05-08 09:11:06 +00:00
"version" : "11.4.2" ,
"resolved" : "https://registry.npmjs.org/vue-i18n/-/vue-i18n-11.4.2.tgz" ,
"integrity" : "sha512-sADDeKXqAGsPX6tK3t3y2ZiMpbVWN12tG+MhTiJ06rVoh58eGtM4wFyw3uWGbVkXByVp9Ne/AP+nSSzI+J9OAQ==" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"dependencies" : {
2026-05-08 09:11:06 +00:00
"@intlify/core-base" : "11.4.2" ,
"@intlify/devtools-types" : "11.4.2" ,
"@intlify/shared" : "11.4.2" ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"@vue/devtools-api" : "^6.5.0"
} ,
"engines" : {
"node" : ">= 16"
} ,
"funding" : {
"url" : "https://github.com/sponsors/kazupon"
} ,
"peerDependencies" : {
"vue" : "^3.0.0"
}
} ,
"node_modules/vue-types" : {
"version" : "3.0.2" ,
"resolved" : "https://registry.npmjs.org/vue-types/-/vue-types-3.0.2.tgz" ,
"integrity" : "sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==" ,
"dependencies" : {
"is-plain-object" : "3.0.1"
} ,
"engines" : {
"node" : ">=10.15.0"
} ,
"peerDependencies" : {
"vue" : "^3.0.0"
}
} ,
2026-05-08 22:17:25 +00:00
"node_modules/vue3-persian-datetime-picker" : {
"version" : "1.2.2" ,
"resolved" : "https://registry.npmjs.org/vue3-persian-datetime-picker/-/vue3-persian-datetime-picker-1.2.2.tgz" ,
"integrity" : "sha512-d7nkj5vgtUvEXZboSdRmP1uwBfXvXgXqdvsOOMQb34jiMZU/aBDrTYWTEe1N+XKF9pvTTJn8Rws9ttJmyhK/hw==" ,
"dependencies" : {
"moment-jalaali" : "^0.9.4"
}
} ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"node_modules/warning" : {
"version" : "4.0.3" ,
"resolved" : "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz" ,
"integrity" : "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==" ,
"dependencies" : {
"loose-envify" : "^1.0.0"
}
} ,
"node_modules/which" : {
"version" : "2.0.2" ,
"resolved" : "https://registry.npmjs.org/which/-/which-2.0.2.tgz" ,
"integrity" : "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==" ,
"dev" : true ,
"dependencies" : {
"isexe" : "^2.0.0"
} ,
"bin" : {
"node-which" : "bin/node-which"
} ,
"engines" : {
"node" : ">= 8"
}
} ,
"node_modules/word-wrap" : {
"version" : "1.2.5" ,
"resolved" : "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" ,
"integrity" : "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==" ,
"dev" : true ,
"engines" : {
"node" : ">=0.10.0"
}
} ,
2026-05-08 22:17:25 +00:00
"node_modules/wrappy" : {
"version" : "1.0.2" ,
"resolved" : "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" ,
"integrity" : "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
} ,
refactor(frontend): Phase 3 — port utils, models, axios, websocket as ES modules
Ports the framework-agnostic JS from web/assets/js/ into frontend/src/
so Vue 3 pages can import what they need without relying on script-tag
globals.
- web/assets/js/util/index.js (927 lines, 21 classes) →
frontend/src/utils/legacy.js + a barrel at utils/index.js. All
classes are now named exports.
- Vue.prototype.$message in HttpUtil → direct import of `message`
from ant-design-vue (Vue 3 has no Vue.prototype).
- RandomUtil.randomShadowsocksPassword previously defaulted to
SSMethods.BLAKE3_AES_256_GCM from inbound.js, creating a circular
import. Replaced with the literal string default.
- MediaQueryMixin (Vue 2 mixin) removed. Replaced by
composables/useMediaQuery.js — Vue 3 composable returning reactive
`isMobile`.
- axios-init.js wrapped as setupAxios(); Qs global → npm `qs`.
- websocket.js exported as WebSocketClient class; the implicit
window.wsClient global is gone — pages instantiate it themselves.
- model/{inbound,outbound,dbinbound,setting,reality_targets}.js
copied with `export` added on every top-level declaration. Imports
between models and utils are wired up explicitly.
- subscription.js deferred to Phase 5 (it's a Vue 2 mount, not a util).
- App.vue smoke test exercises SizeFormatter / RandomUtil / Wireguard /
useMediaQuery so the user can verify Phase 3 with `npm run dev`.
Run `cd frontend && npm install && npm run dev` — qs was added so a
fresh install is required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 08:47:15 +00:00
"node_modules/xml-name-validator" : {
"version" : "4.0.0" ,
"resolved" : "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz" ,
"integrity" : "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==" ,
"dev" : true ,
"engines" : {
"node" : ">=12"
}
} ,
"node_modules/yocto-queue" : {
"version" : "0.1.0" ,
"resolved" : "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" ,
"integrity" : "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" ,
"dev" : true ,
"engines" : {
"node" : ">=10"
} ,
"funding" : {
"url" : "https://github.com/sponsors/sindresorhus"
}
}
}
}