mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-06-05 20:54:14 +00:00
Step 8 of the Vue→React migration. Ports the xray config entry: page shell, basics/routing/outbounds/balancers/dns tabs, the rule + balancer + dns server + dns presets + warp + nord modals, the protocol-aware outbound form, and the shared FinalMaskForm (TCP/UDP masks + QUIC params). Adds useXraySetting that mirrors the legacy two-way sync between the JSON template string and the parsed templateSettings tree. The outbound model itself stays in JS so the class-driven form keeps its existing mutation API; instance access is typed loosely inside the form to match. The shared FinalMaskForm.vue and JsonEditor.vue stay alongside the new .tsx versions until step 9 — InboundFormModal.vue still imports them. Adds react-hooks/immutability and react-hooks/refs to the already-disabled react-compiler rule set; both flag the outbound form's instance-mutation pattern that doesn't run through useState.
102 lines
3.4 KiB
JavaScript
102 lines
3.4 KiB
JavaScript
import js from '@eslint/js';
|
|
import vue from 'eslint-plugin-vue';
|
|
import vueParser from 'vue-eslint-parser';
|
|
import tseslint from 'typescript-eslint';
|
|
import reactHooks from 'eslint-plugin-react-hooks';
|
|
import globals from 'globals';
|
|
|
|
export default [
|
|
{ ignores: ['node_modules/**', '../web/dist/**'] },
|
|
js.configs.recommended,
|
|
...vue.configs['flat/recommended'],
|
|
{
|
|
files: ['**/*.{js,vue}'],
|
|
languageOptions: {
|
|
ecmaVersion: 2022,
|
|
sourceType: 'module',
|
|
parser: vueParser,
|
|
parserOptions: {
|
|
ecmaFeatures: { jsx: false },
|
|
},
|
|
globals: {
|
|
...globals.browser,
|
|
...globals.node,
|
|
},
|
|
},
|
|
rules: {
|
|
'no-unused-vars': ['warn', {
|
|
argsIgnorePattern: '^_',
|
|
varsIgnorePattern: '^_',
|
|
caughtErrorsIgnorePattern: '^_',
|
|
}],
|
|
'no-empty': ['error', { allowEmptyCatch: true }],
|
|
'no-case-declarations': 'off',
|
|
|
|
// Stylistic rules from vue/recommended that don't match the
|
|
// existing codebase formatting. Disable rather than churn the
|
|
// whole tree to satisfy them.
|
|
'vue/multi-word-component-names': 'off',
|
|
'vue/no-v-html': 'off',
|
|
'vue/html-self-closing': 'off',
|
|
'vue/max-attributes-per-line': 'off',
|
|
'vue/singleline-html-element-content-newline': 'off',
|
|
'vue/multiline-html-element-content-newline': 'off',
|
|
'vue/html-indent': 'off',
|
|
'vue/html-closing-bracket-newline': 'off',
|
|
'vue/attributes-order': 'off',
|
|
'vue/first-attribute-linebreak': 'off',
|
|
'vue/one-component-per-file': 'off',
|
|
'vue/order-in-components': 'off',
|
|
'vue/attribute-hyphenation': 'off',
|
|
'vue/v-on-event-hyphenation': 'off',
|
|
|
|
// Pervasive in form components ported from the Vue 2 codebase
|
|
// (parent passes a reactive object; child mutates it in place).
|
|
// Properly fixing this means rewiring those components to emit
|
|
// updates — a meaningful architectural change, separate task.
|
|
'vue/no-mutating-props': 'off',
|
|
},
|
|
},
|
|
...tseslint.configs.recommended.map((config) => ({
|
|
...config,
|
|
files: ['**/*.{ts,tsx}'],
|
|
})),
|
|
{
|
|
files: ['**/*.{ts,tsx}'],
|
|
plugins: {
|
|
'react-hooks': reactHooks,
|
|
},
|
|
languageOptions: {
|
|
ecmaVersion: 2022,
|
|
sourceType: 'module',
|
|
globals: {
|
|
...globals.browser,
|
|
},
|
|
},
|
|
rules: {
|
|
...reactHooks.configs.recommended.rules,
|
|
'@typescript-eslint/no-unused-vars': ['warn', {
|
|
argsIgnorePattern: '^_',
|
|
varsIgnorePattern: '^_',
|
|
caughtErrorsIgnorePattern: '^_',
|
|
}],
|
|
'no-empty': ['error', { allowEmptyCatch: true }],
|
|
|
|
// react-hooks v7 introduces several new rules driven by the React
|
|
// Compiler. The migration uses several legitimate patterns those
|
|
// rules flag (initial-fetch in useEffect, dirty-check derived
|
|
// state, `Date.now()` inside derive helpers, inline arrow event
|
|
// handlers, in-place mutation of imported Outbound class
|
|
// instances in the OutboundFormModal). We're not running the
|
|
// compiler, so the memoization-preservation warnings have no
|
|
// effect on runtime — turning them off until the codebase
|
|
// stabilises.
|
|
'react-hooks/set-state-in-effect': 'off',
|
|
'react-hooks/purity': 'off',
|
|
'react-hooks/react-compiler': 'off',
|
|
'react-hooks/preserve-manual-memoization': 'off',
|
|
'react-hooks/immutability': 'off',
|
|
'react-hooks/refs': 'off',
|
|
},
|
|
},
|
|
];
|