├── _config.yml
├── src
├── index.ts
├── constants
│ └── counter.ts
├── assets
│ └── img
│ │ ├── back.png
│ │ ├── scan.png
│ │ ├── search.png
│ │ ├── more-icon.png
│ │ ├── right-arrow.png
│ │ ├── storage-add.png
│ │ ├── storage-clear.png
│ │ ├── storage-delete.png
│ │ └── storage-modify.png
├── reducers
│ ├── index.ts
│ └── counter.ts
├── pages
│ └── index
│ │ ├── index.scss
│ │ └── index.tsx
├── app.scss
├── actions
│ └── counter.ts
├── components
│ ├── debug
│ │ ├── debug.scss
│ │ └── Debug.tsx
│ ├── appInformation
│ │ ├── appInformation.scss
│ │ └── AppInformation.tsx
│ ├── changePin
│ │ ├── changePin.scss
│ │ └── changePin.tsx
│ ├── positionSimulation
│ │ ├── positionSimulation.scss
│ │ └── PositionSimulation.tsx
│ ├── h5door
│ │ ├── h5door.scss
│ │ └── H5door.tsx
│ └── storage
│ │ ├── storage.scss
│ │ └── Storage.tsx
├── types
│ └── DebugTypes.ts
├── store
│ └── index.ts
├── index.html
├── app.tsx
└── utils
│ ├── consants.ts
│ └── util.js
├── config
├── dev.js
├── prod.js
└── index.js
├── .gitignore
├── .editorconfig
├── .prettierrc
├── global.d.ts
├── tsconfig.json
├── .eslintrc
├── project.config.json
├── package.json
└── README.md
/_config.yml:
--------------------------------------------------------------------------------
1 | theme: jekyll-theme-slate
--------------------------------------------------------------------------------
/src/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Debug } from './components/debug/Debug'
2 |
--------------------------------------------------------------------------------
/src/constants/counter.ts:
--------------------------------------------------------------------------------
1 | export const ADD = 'ADD'
2 | export const MINUS = 'MINUS'
3 |
--------------------------------------------------------------------------------
/src/assets/img/back.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jdlfe/minidebug/HEAD/src/assets/img/back.png
--------------------------------------------------------------------------------
/src/assets/img/scan.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jdlfe/minidebug/HEAD/src/assets/img/scan.png
--------------------------------------------------------------------------------
/src/assets/img/search.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jdlfe/minidebug/HEAD/src/assets/img/search.png
--------------------------------------------------------------------------------
/src/assets/img/more-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jdlfe/minidebug/HEAD/src/assets/img/more-icon.png
--------------------------------------------------------------------------------
/src/assets/img/right-arrow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jdlfe/minidebug/HEAD/src/assets/img/right-arrow.png
--------------------------------------------------------------------------------
/src/assets/img/storage-add.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jdlfe/minidebug/HEAD/src/assets/img/storage-add.png
--------------------------------------------------------------------------------
/src/assets/img/storage-clear.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jdlfe/minidebug/HEAD/src/assets/img/storage-clear.png
--------------------------------------------------------------------------------
/src/assets/img/storage-delete.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jdlfe/minidebug/HEAD/src/assets/img/storage-delete.png
--------------------------------------------------------------------------------
/src/assets/img/storage-modify.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jdlfe/minidebug/HEAD/src/assets/img/storage-modify.png
--------------------------------------------------------------------------------
/src/reducers/index.ts:
--------------------------------------------------------------------------------
1 | import { combineReducers } from 'redux'
2 | import counter from './counter'
3 |
4 | export default combineReducers({
5 | counter
6 | })
7 |
--------------------------------------------------------------------------------
/config/dev.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | env: {
3 | NODE_ENV: '"development"'
4 | },
5 | defineConstants: {
6 | },
7 | weapp: {},
8 | h5: {}
9 | }
10 |
--------------------------------------------------------------------------------
/src/pages/index/index.scss:
--------------------------------------------------------------------------------
1 | .debug-img {
2 | width: 120px;
3 | height: 120px;
4 | border: 0.5px solid #f1f1f1;
5 | margin-top: 400px;
6 | border-radius: 50%;
7 | }
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | dist/
2 | deploy_versions/
3 | .temp/
4 | .rn_temp/
5 | node_modules/
6 | .DS_Store
7 | build/
8 |
9 | # temp file for git conflict merging
10 | *.log
11 | *.swo
12 | *.swp
13 | *.vi
14 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # http://editorconfig.org
2 | root = true
3 |
4 | [*]
5 | indent_style = space
6 | indent_size = 2
7 | charset = utf-8
8 | trim_trailing_whitespace = true
9 | insert_final_newline = true
10 |
11 | [*.md]
12 | trim_trailing_whitespace = false
13 |
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "printWidth": 100,
3 | "singleQuote": true,
4 | "tabWidth": 2,
5 | "trailingComma": "es5",
6 | "semi": false,
7 | "bracketSpacing": true,
8 | "jsxBracketSameLine": false,
9 | "jsxSingleQuote": false,
10 | "arrowParens": "avoid"
11 | }
12 |
--------------------------------------------------------------------------------
/src/app.scss:
--------------------------------------------------------------------------------
1 | @import "~taro-ui/dist/style/components/list.scss";
2 | @import "~taro-ui/dist/style/components/icon.scss";
3 | @import "~taro-ui/dist/style/components/action-sheet.scss";
4 | @import "~taro-ui/dist/style/components/float-layout.scss";
5 | /**app.wxss**/
6 | .container {
7 | height: 100%;
8 | display: flex;
9 | box-sizing: border-box;
10 | }
--------------------------------------------------------------------------------
/src/actions/counter.ts:
--------------------------------------------------------------------------------
1 | import {
2 | ADD,
3 | MINUS
4 | } from '../constants/counter'
5 |
6 | export const add = () => {
7 | return {
8 | type: ADD
9 | }
10 | }
11 | export const minus = () => {
12 | return {
13 | type: MINUS
14 | }
15 | }
16 |
17 | // 异步的action
18 | export function asyncAdd () {
19 | return dispatch => {
20 | setTimeout(() => {
21 | dispatch(add())
22 | }, 2000)
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/config/prod.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | env: {
3 | NODE_ENV: '"production"'
4 | },
5 | defineConstants: {
6 | },
7 | weapp: {},
8 | h5: {
9 | /**
10 | * 如果h5端编译后体积过大,可以使用webpack-bundle-analyzer插件对打包体积进行分析。
11 | * 参考代码如下:
12 | * webpackChain (chain) {
13 | * chain.plugin('analyzer')
14 | * .use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin, [])
15 | * }
16 | */
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/global.d.ts:
--------------------------------------------------------------------------------
1 | declare module "*.png";
2 | declare module "*.gif";
3 | declare module "*.jpg";
4 | declare module "*.jpeg";
5 | declare module "*.svg";
6 | declare module "*.css";
7 | declare module "*.less";
8 | declare module "*.scss";
9 | declare module "*.sass";
10 | declare module "*.styl";
11 |
12 | // @ts-ignore
13 | declare const process: {
14 | env: {
15 | TARO_ENV: 'weapp' | 'swan' | 'alipay' | 'h5' | 'rn' | 'tt' | 'quickapp' | 'qq';
16 | [key: string]: any;
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/reducers/counter.ts:
--------------------------------------------------------------------------------
1 | import { ADD, MINUS } from '../constants/counter'
2 |
3 | const INITIAL_STATE = {
4 | num: 0
5 | }
6 |
7 | export default function counter (state = INITIAL_STATE, action) {
8 | switch (action.type) {
9 | case ADD:
10 | return {
11 | ...state,
12 | num: state.num + 1
13 | }
14 | case MINUS:
15 | return {
16 | ...state,
17 | num: state.num - 1
18 | }
19 | default:
20 | return state
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/components/debug/debug.scss:
--------------------------------------------------------------------------------
1 | .debug-container {
2 | width: 750px;
3 | height: 100%;
4 | background: #ffffff;
5 | }
6 | .home-container {
7 | display: flex;
8 | align-items: center;;
9 | justify-content: center;
10 | width: 80px;
11 | height: 80px;
12 | border: 0.5px solid #d4d4d4;
13 | margin-top: 400px;
14 | border-radius: 50%;
15 | position: fixed;
16 | right: 20px;
17 | bottom: 200px;
18 | z-index: 1000;
19 | background-color: #FFFFFF;
20 | .home-img {
21 | width: 60px;
22 | height: 60px;
23 | }
24 | }
--------------------------------------------------------------------------------
/src/types/DebugTypes.ts:
--------------------------------------------------------------------------------
1 | export type Menu = {
2 | title: string
3 | type?: number
4 | desc: string
5 | }
6 | export type ENV = {
7 | env: string
8 | name: string
9 | }
10 | export type SystemInfoItem = {
11 | name: string
12 | value: string | number
13 | type?: string
14 | }
15 | export type TransTypeItem = {
16 | type: number
17 | name: string
18 | }
19 | export type AddrInfo = {
20 | key: string,
21 | value: string,
22 | title: string,
23 | disabled: boolean
24 | }
25 | export type StorageModifyItem = {
26 | key: string
27 | value: string
28 | isModify: boolean
29 | ischecked: boolean
30 | }
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "es2017",
4 | "module": "commonjs",
5 | "removeComments": false,
6 | "preserveConstEnums": true,
7 | "moduleResolution": "node",
8 | "experimentalDecorators": true,
9 | "noImplicitAny": false,
10 | "allowSyntheticDefaultImports": true,
11 | "outDir": "lib",
12 | "noUnusedLocals": true,
13 | "noUnusedParameters": true,
14 | "strictNullChecks": true,
15 | "sourceMap": true,
16 | "baseUrl": ".",
17 | "rootDir": ".",
18 | "jsx": "preserve",
19 | "jsxFactory": "Taro.createElement",
20 | "allowJs": true,
21 | "resolveJsonModule": true,
22 | "typeRoots": [
23 | "node_modules/@types"
24 | ]
25 | },
26 | "exclude": [
27 | "node_modules",
28 | "dist"
29 | ],
30 | "compileOnSave": false
31 | }
32 |
--------------------------------------------------------------------------------
/src/pages/index/index.tsx:
--------------------------------------------------------------------------------
1 | import { ComponentClass } from 'react'
2 | import Taro, { Component, Config } from '@tarojs/taro'
3 | import { View } from '@tarojs/components'
4 |
5 | import './index.scss'
6 | import Debug from '../../components/debug/Debug'
7 |
8 | type PageStateProps = {}
9 |
10 | type PageDispatchProps = {}
11 |
12 | type PageOwnProps = {}
13 |
14 | type PageState = {}
15 |
16 | type IProps = PageStateProps & PageDispatchProps & PageOwnProps
17 |
18 | interface Index {
19 | props: IProps;
20 | }
21 |
22 | class Index extends Component {
23 |
24 | config: Config = {
25 | navigationBarTitleText: '首页'
26 | }
27 | render () {
28 | return (
29 |
30 |
31 |
32 | )
33 | }
34 | }
35 |
36 | export default Index as ComponentClass
37 |
--------------------------------------------------------------------------------
/src/store/index.ts:
--------------------------------------------------------------------------------
1 | import { createStore, applyMiddleware, compose } from 'redux'
2 | import thunkMiddleware from 'redux-thunk'
3 | import rootReducer from '../reducers'
4 |
5 | const composeEnhancers =
6 | typeof window === 'object' &&
7 | window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ?
8 | window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({
9 | // Specify extension’s options like name, actionsBlacklist, actionsCreators, serialize...
10 | }) : compose
11 |
12 | const middlewares = [
13 | thunkMiddleware
14 | ]
15 |
16 | if (process.env.NODE_ENV === 'development' && process.env.TARO_ENV !== 'quickapp') {
17 | middlewares.push(require('redux-logger').createLogger())
18 | }
19 |
20 | const enhancer = composeEnhancers(
21 | applyMiddleware(...middlewares),
22 | // other store enhancers if any
23 | )
24 |
25 | export default function configStore () {
26 | const store = createStore(rootReducer, enhancer)
27 | return store
28 | }
29 |
--------------------------------------------------------------------------------
/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "extends": ["taro", "plugin:@typescript-eslint/recommended"],
3 | "parser": "@typescript-eslint/parser",
4 | "rules": {
5 | "no-unused-vars": ["error", { "varsIgnorePattern": "Taro" }],
6 | "react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx", ".tsx"] }],
7 | "@typescript-eslint/no-unused-vars": ["error", { "varsIgnorePattern": "Taro" }],
8 | "@typescript-eslint/member-delimiter-style": {
9 | "multiline": {
10 | "delimiter": "none",
11 | "requireLast": false
12 | },
13 | "singleline": {
14 | "delimiter": "none",
15 | "requireLast": false
16 | }
17 | },
18 | "@typescript-eslint/explicit-function-return-type": 0,
19 | "@typescript-eslint/no-empty-function": ["warn"]
20 | },
21 | "parserOptions": {
22 | "ecmaFeatures": {
23 | "jsx": true
24 | },
25 | "useJSXTextNode": true,
26 | "project": "./tsconfig.json"
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/project.config.json:
--------------------------------------------------------------------------------
1 | {
2 | "miniprogramRoot": "dist/",
3 | "projectname": "MiniDebug",
4 | "description": "小程序MiniDebug工具",
5 | "appid": "wx444d544f65a4f311",
6 | "setting": {
7 | "urlCheck": true,
8 | "es6": false,
9 | "enhance": false,
10 | "postcss": false,
11 | "preloadBackgroundData": false,
12 | "minified": false,
13 | "newFeature": false,
14 | "coverView": true,
15 | "nodeModules": false,
16 | "autoAudits": false,
17 | "showShadowRootInWxmlPanel": true,
18 | "scopeDataCheck": false,
19 | "uglifyFileName": false,
20 | "checkInvalidKey": true,
21 | "checkSiteMap": true,
22 | "uploadWithSourceMap": true,
23 | "compileHotReLoad": false,
24 | "babelSetting": {
25 | "ignore": [],
26 | "disablePlugins": [],
27 | "outputPath": ""
28 | },
29 | "useIsolateContext": true,
30 | "useCompilerModule": true,
31 | "userConfirmedUseCompilerModuleSwitch": false
32 | },
33 | "compileType": "miniprogram",
34 | "simulatorType": "wechat",
35 | "simulatorPluginLibVersion": {},
36 | "condition": {}
37 | }
--------------------------------------------------------------------------------
/src/components/appInformation/appInformation.scss:
--------------------------------------------------------------------------------
1 | .info-container {
2 | background: #FFFFFF;
3 | border-top: 1px solid #f6f6f6;
4 | }
5 | .info-header {
6 | height: 80px;
7 | line-height: 80px;
8 | font-size: 28px;
9 | color:#6a6a77;
10 | padding-left: 50px;
11 | font-weight: bold;
12 | position: relative;
13 | &::before {
14 | content: "";
15 | display: inline-block;
16 | position: absolute;
17 | left: 24px;
18 | top: 50%;
19 | margin-top: -20px;
20 | width: 2PX;
21 | height: 40px;
22 | background-color: #e1251b;
23 | box-shadow: 0 7px 12px 0 rgba(97, 144, 232, 0.2);
24 | border-radius: 1PX;
25 | }
26 | }
27 | .info-item {
28 | display:flex;
29 | align-items:center;
30 | font-size: 32px;
31 | color: #333;
32 | justify-content:space-between;
33 | padding:0 32px;
34 | height:90px;
35 | border-bottom:1px solid #efefef;
36 | }
37 | .img {
38 | width: 80px;
39 | height:80px;
40 | display:inline-block;
41 | overflow:hidden;
42 | border-radius:50%;
43 | margin-right: 20px;
44 | }
45 |
--------------------------------------------------------------------------------
/src/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/src/components/changePin/changePin.scss:
--------------------------------------------------------------------------------
1 | .pin-container {
2 | display: flex;
3 | flex-direction: column;
4 | border-top: 1px solid #f6f6f6;
5 | .appinfo-item {
6 | display:flex;
7 | align-items:center;
8 | font-size: 32px;
9 | color: #333;
10 | justify-content:space-between;
11 | padding:0 32px;
12 | height:104px;
13 | border-bottom:1px solid #efefef;
14 | background: #ffffff;
15 | .item-value {
16 | flex: 1;
17 | white-space: nowrap;
18 | text-overflow: ellipsis;
19 | overflow: hidden;
20 | text-align: right;
21 | }
22 | }
23 | .appinfo-input {
24 | font-size: 32px;
25 | color: #333;
26 | padding:0 32px;
27 | height:104px;
28 | border-bottom:1px solid #efefef;
29 | background: #ffffff;
30 | }
31 | .confirm-button{
32 | position: absolute;
33 | bottom: 30px;
34 | left: 30px;
35 | width: 690px;
36 | height: 100px;
37 | background: #E1251B;
38 | border: 0;
39 | color:#ffffff;
40 | text-align: center;
41 | line-height: 100px;
42 | font-size: 32px;
43 | }
44 | }
--------------------------------------------------------------------------------
/src/components/positionSimulation/positionSimulation.scss:
--------------------------------------------------------------------------------
1 | .position-tools{
2 | background: #ffffff;
3 | border-top: 0.5px solid #d6e4ef;
4 | .tools-item{
5 | height: 90px;
6 | line-height: 90px;
7 | color: #333;
8 | font-size: 30px;
9 | padding-left: 24px;
10 | position: relative;
11 | text-align: left;
12 | background-color:#fff;
13 | &::after {
14 | content: ' ';
15 | position: absolute;
16 | box-sizing: border-box;
17 | top: auto;
18 | left: 24px;
19 | right: 0;
20 | bottom: 0;
21 | border-bottom: 1PX solid #d6e4ef;
22 | transform: scaleY(0.5);
23 | transform-origin: center;
24 | }
25 | .tools-img{
26 | height: 34px;
27 | width: 20px;
28 | position: absolute;
29 | right: 24px;
30 | top: 50%;
31 | transform: translateY(-50%);
32 | }
33 | .item-title{
34 | background: #fff;
35 | color: #333;
36 | font-size: 32px;
37 | text-align: left;
38 | padding: 0;
39 | height: 90px;
40 | line-height: 90px;
41 | &:after{
42 | border:0
43 | }
44 | }
45 | }
46 | }
47 | .trans-item {
48 | height: 100px;
49 | text-align: center;
50 | line-height: 100px;
51 | border: 0.5px solid #F5F6F7;
52 | }
--------------------------------------------------------------------------------
/src/app.tsx:
--------------------------------------------------------------------------------
1 | import '@tarojs/async-await'
2 | import Taro, { Component, Config } from '@tarojs/taro'
3 | import { Provider } from '@tarojs/redux'
4 |
5 | import Index from './pages/index/index'
6 |
7 | import configStore from './store'
8 |
9 | import './app.scss'
10 |
11 | // 如果需要在 h5 环境中开启 React Devtools
12 | // 取消以下注释:
13 | // if (process.env.NODE_ENV !== 'production' && process.env.TARO_ENV === 'h5') {
14 | // require('nerv-devtools')
15 | // }
16 |
17 | const store = configStore()
18 |
19 | class App extends Component {
20 | /**
21 | * 指定config的类型声明为: Taro.Config
22 | *
23 | * 由于 typescript 对于 object 类型推导只能推出 Key 的基本类型
24 | * 对于像 navigationBarTextStyle: 'black' 这样的推导出的类型是 string
25 | * 提示和声明 navigationBarTextStyle: 'black' | 'white' 类型冲突, 需要显示声明类型
26 | */
27 | config: Config = {
28 | pages: [
29 | 'pages/index/index',
30 | ],
31 | window: {
32 | backgroundTextStyle: 'light',
33 | navigationBarBackgroundColor: '#fff',
34 | navigationBarTitleText: 'WeChat',
35 | navigationBarTextStyle: 'black',
36 | },
37 | permission: {
38 | 'scope.userLocation': {
39 | desc: '您的位置信息将用于小程序定位',
40 | },
41 | },
42 | }
43 |
44 | globalData: object = {}
45 |
46 | // componentDidMount() {}
47 |
48 | // componentDidShow() {}
49 |
50 | // componentDidHide() {}
51 |
52 | // componentDidCatchError() {}
53 |
54 | // 在 App 类中的 render() 函数没有实际作用
55 | // 请勿修改此函数
56 | render() {
57 | return (
58 |
59 |
60 |
61 | )
62 | }
63 | }
64 |
65 | Taro.render(, document.getElementById('app'))
66 |
--------------------------------------------------------------------------------
/src/components/changePin/changePin.tsx:
--------------------------------------------------------------------------------
1 | import { ComponentClass } from 'react'
2 | import Taro, { Component } from '@tarojs/taro'
3 | import { View, Text, Input, Button, } from '@tarojs/components'
4 |
5 | import './ChangePin.scss'
6 | import { relaunch } from '../../utils/util'
7 |
8 | const app = Taro.getApp()
9 |
10 | type PageStateProps = {
11 | }
12 |
13 | type PageDispatchProps = {
14 | }
15 |
16 | type PageOwnProps = {}
17 |
18 | type PageState = {
19 | userPin: string
20 | inputPin: string
21 | }
22 |
23 | type IProps = PageStateProps & PageDispatchProps & PageOwnProps
24 |
25 | interface ChangePin {
26 | props: IProps;
27 | }
28 |
29 | class ChangePin extends Component {
30 | state = {
31 | userPin: app.globalData.userPin,
32 | inputPin: ''
33 | }
34 |
35 | handleInput = (e) => {
36 | this.setState({
37 | inputPin: e.detail.value
38 | })
39 | }
40 |
41 | handleConfirm = () => {
42 | app.globalData.userPin = this.state.inputPin
43 | relaunch({ content: '修改成功,应用即将重启', })
44 | }
45 |
46 | render () {
47 | const { userPin, inputPin, } = this.state
48 | return (
49 |
50 |
51 | 当前用户pin:
52 | {userPin}
53 |
54 |
55 |
56 |
57 | )
58 | }
59 | }
60 |
61 | export default ChangePin as ComponentClass
62 |
--------------------------------------------------------------------------------
/src/utils/consants.ts:
--------------------------------------------------------------------------------
1 | import { Menu, ENV, TransTypeItem } from "../types/DebugTypes"
2 |
3 | export const FEATURE: any = {
4 | DEFAULT: -1,
5 | CHANGE_ENV: 1,
6 | CHANGE_PIN: 2,
7 | GET_APP_INFO: 3,
8 | MOCK_POSITION: 4,
9 | MANAGE_STORAGE: 5,
10 | SCAN: 6,
11 | JUMP_H5: 7,
12 | UPDATE: 8,
13 | }
14 | export const HOME_OPERATION_LIST: Array = [
15 | FEATURE.DEFAULT,
16 | FEATURE.CHANGE_ENV,
17 | FEATURE.SCAN,
18 | FEATURE.UPDATE
19 | ]
20 | export const HOME_MENU: Array