mirror of https://github.com/fatedier/frp
fatedier
2 years ago
committed by
GitHub
20 changed files with 271 additions and 334 deletions
File diff suppressed because one or more lines are too long
@ -0,0 +1,25 @@
|
||||
package util |
||||
|
||||
func InSlice[T comparable](v T, s []T) bool { |
||||
for _, vv := range s { |
||||
if v == vv { |
||||
return true |
||||
} |
||||
} |
||||
return false |
||||
} |
||||
|
||||
func InSliceAny[T any](v T, s []T, equalFn func(a, b T) bool) bool { |
||||
for _, vv := range s { |
||||
if equalFn(v, vv) { |
||||
return true |
||||
} |
||||
} |
||||
return false |
||||
} |
||||
|
||||
func InSliceAnyFunc[T any](equalFn func(a, b T) bool) func(v T, s []T) bool { |
||||
return func(v T, s []T) bool { |
||||
return InSliceAny(v, s, equalFn) |
||||
} |
||||
} |
@ -0,0 +1,49 @@
|
||||
package util |
||||
|
||||
import ( |
||||
"testing" |
||||
|
||||
"github.com/stretchr/testify/require" |
||||
) |
||||
|
||||
func TestInSlice(t *testing.T) { |
||||
require := require.New(t) |
||||
require.True(InSlice(1, []int{1, 2, 3})) |
||||
require.False(InSlice(0, []int{1, 2, 3})) |
||||
require.True(InSlice("foo", []string{"foo", "bar"})) |
||||
require.False(InSlice("not exist", []string{"foo", "bar"})) |
||||
} |
||||
|
||||
type testStructA struct { |
||||
Name string |
||||
Age int |
||||
} |
||||
|
||||
func TestInSliceAny(t *testing.T) { |
||||
require := require.New(t) |
||||
|
||||
a := testStructA{Name: "foo", Age: 20} |
||||
b := testStructA{Name: "foo", Age: 30} |
||||
c := testStructA{Name: "bar", Age: 20} |
||||
|
||||
equalFn := func(o, p testStructA) bool { |
||||
return o.Name == p.Name |
||||
} |
||||
require.True(InSliceAny(a, []testStructA{b, c}, equalFn)) |
||||
require.False(InSliceAny(c, []testStructA{a, b}, equalFn)) |
||||
} |
||||
|
||||
func TestInSliceAnyFunc(t *testing.T) { |
||||
require := require.New(t) |
||||
|
||||
a := testStructA{Name: "foo", Age: 20} |
||||
b := testStructA{Name: "foo", Age: 30} |
||||
c := testStructA{Name: "bar", Age: 20} |
||||
|
||||
equalFn := func(o, p testStructA) bool { |
||||
return o.Name == p.Name |
||||
} |
||||
testStructAInSlice := InSliceAnyFunc(equalFn) |
||||
require.True(testStructAInSlice(a, []testStructA{b, c})) |
||||
require.False(testStructAInSlice(c, []testStructA{a, b})) |
||||
} |
@ -1,30 +1,30 @@
|
||||
/* eslint-env node */ |
||||
require("@rushstack/eslint-patch/modern-module-resolution"); |
||||
require('@rushstack/eslint-patch/modern-module-resolution') |
||||
|
||||
module.exports = { |
||||
root: true, |
||||
extends: [ |
||||
"plugin:vue/vue3-essential", |
||||
"eslint:recommended", |
||||
"@vue/eslint-config-typescript", |
||||
"@vue/eslint-config-prettier", |
||||
'plugin:vue/vue3-essential', |
||||
'eslint:recommended', |
||||
'@vue/eslint-config-typescript', |
||||
'@vue/eslint-config-prettier', |
||||
], |
||||
parserOptions: { |
||||
ecmaVersion: "latest", |
||||
ecmaVersion: 'latest', |
||||
}, |
||||
rules: { |
||||
"@typescript-eslint/no-unused-vars": [ |
||||
"warn", |
||||
'@typescript-eslint/no-unused-vars': [ |
||||
'warn', |
||||
{ |
||||
argsIgnorePattern: "^_", |
||||
varsIgnorePattern: "^_", |
||||
argsIgnorePattern: '^_', |
||||
varsIgnorePattern: '^_', |
||||
}, |
||||
], |
||||
"vue/multi-word-component-names": [ |
||||
"error", |
||||
'vue/multi-word-component-names': [ |
||||
'error', |
||||
{ |
||||
ignores: ["Overview"], |
||||
ignores: ['Overview'], |
||||
}, |
||||
], |
||||
}, |
||||
}; |
||||
} |
||||
|
@ -1 +1,5 @@
|
||||
{} |
||||
{ |
||||
"tabWidth": 2, |
||||
"semi": false, |
||||
"singleQuote": true |
||||
} |
||||
|
@ -1,13 +1,13 @@
|
||||
import { createApp } from "vue"; |
||||
import "element-plus/dist/index.css"; |
||||
import "element-plus/theme-chalk/dark/css-vars.css"; |
||||
import App from "./App.vue"; |
||||
import router from "./router"; |
||||
import { createApp } from 'vue' |
||||
import 'element-plus/dist/index.css' |
||||
import 'element-plus/theme-chalk/dark/css-vars.css' |
||||
import App from './App.vue' |
||||
import router from './router' |
||||
|
||||
import "./assets/dark.css"; |
||||
import './assets/dark.css' |
||||
|
||||
const app = createApp(App); |
||||
const app = createApp(App) |
||||
|
||||
app.use(router); |
||||
app.use(router) |
||||
|
||||
app.mount("#app"); |
||||
app.mount('#app') |
||||
|
@ -1,21 +1,21 @@
|
||||
import { createRouter, createWebHashHistory } from "vue-router"; |
||||
import Overview from "../components/Overview.vue"; |
||||
import ClientConfigure from "../components/ClientConfigure.vue"; |
||||
import { createRouter, createWebHashHistory } from 'vue-router' |
||||
import Overview from '../components/Overview.vue' |
||||
import ClientConfigure from '../components/ClientConfigure.vue' |
||||
|
||||
const router = createRouter({ |
||||
history: createWebHashHistory(), |
||||
routes: [ |
||||
{ |
||||
path: "/", |
||||
name: "Overview", |
||||
path: '/', |
||||
name: 'Overview', |
||||
component: Overview, |
||||
}, |
||||
{ |
||||
path: "/configure", |
||||
name: "ClientConfigure", |
||||
path: '/configure', |
||||
name: 'ClientConfigure', |
||||
component: ClientConfigure, |
||||
}, |
||||
], |
||||
}); |
||||
}) |
||||
|
||||
export default router; |
||||
export default router |
||||
|
Loading…
Reference in new issue