From 4b174769f586fde51fbc90ce48791efdb58fbb49 Mon Sep 17 00:00:00 2001 From: Dreamacro <305009791@qq.com> Date: Sun, 9 Sep 2018 21:20:13 +0800 Subject: [PATCH] Update: framework code --- package-lock.json | 468 +++++++++++++++++++++--------- package.json | 22 +- src/assets/logo.png | Bin 0 -> 11748 bytes src/assets/scss/App.scss | 12 - src/components/App.tsx | 16 - src/containers/Sidebar/index.tsx | 39 +++ src/containers/Sidebar/style.scss | 49 ++++ src/i18n/index.ts | 37 +++ src/render.tsx | 21 +- src/views/App.scss | 22 ++ src/views/App.tsx | 40 +++ src/views/Logs/index.tsx | 7 + src/views/Overview/index.tsx | 7 + src/views/Proxies/index.tsx | 7 + src/views/Rules/index.tsx | 7 + src/views/Settings/index.tsx | 7 + tsconfig.json | 10 +- 17 files changed, 591 insertions(+), 180 deletions(-) create mode 100644 src/assets/logo.png delete mode 100644 src/assets/scss/App.scss delete mode 100644 src/components/App.tsx create mode 100644 src/containers/Sidebar/index.tsx create mode 100644 src/containers/Sidebar/style.scss create mode 100644 src/i18n/index.ts create mode 100644 src/views/App.scss create mode 100644 src/views/App.tsx create mode 100644 src/views/Logs/index.tsx create mode 100644 src/views/Overview/index.tsx create mode 100644 src/views/Proxies/index.tsx create mode 100644 src/views/Rules/index.tsx create mode 100644 src/views/Settings/index.tsx diff --git a/package-lock.json b/package-lock.json index 2fb4663..6bfe13c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -841,6 +841,18 @@ "integrity": "sha512-KU/VDjC5RwtDUZiz3d+DHXJF2lp5hB9dn552TXIyptj8SH1vXmR40mG0JgGq03IlYsOgGfcv8xrLpSQ0YUMQdA==", "dev": true }, + "@types/history": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.0.tgz", + "integrity": "sha512-1A/RUAX4VtmGzNTGLSfmiPxQ3XwUSe/1YN4lW9GRa+j307oFK6MPjhlvw6jEHDodUBIvSvrA7/iHDchr5LS+0Q==", + "dev": true + }, + "@types/i18next": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@types/i18next/-/i18next-8.4.5.tgz", + "integrity": "sha512-FUvAb4r6X2GWXc7j+jIIXcRcxCqSzMkWkkflcdl9Vhb1C9MrJqIqm8thtzqONEqGtWqoMMSv3piboImgIRwmVw==", + "dev": true + }, "@types/node": { "version": "10.9.4", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.9.4.tgz", @@ -876,6 +888,37 @@ "@types/react": "*" } }, + "@types/react-i18next": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/@types/react-i18next/-/react-i18next-7.8.2.tgz", + "integrity": "sha512-axbJJ7N3I7RsZSmQiM2tbLWTYCtfIszSr+KW0CJYMd6G8yiQEMG62NSBOk2xIuyZbncSwM67LO5maLN1WvOLnw==", + "dev": true, + "requires": { + "@types/i18next": "*", + "@types/react": "*" + } + }, + "@types/react-router": { + "version": "4.0.30", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-4.0.30.tgz", + "integrity": "sha512-zWt5RpWy7x7semeBIHqLZ31A1Tle0jb3R/KD2wguZqO43DjP4n8kYsH7UIpve6I4hzlSObnoIieDcp5qfyKwaQ==", + "dev": true, + "requires": { + "@types/history": "*", + "@types/react": "*" + } + }, + "@types/react-router-dom": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-4.3.0.tgz", + "integrity": "sha512-vaq+nVUGyMnIhAl+svKHmfqhCoCNe5lf1UWmvVcsBlAcX0kznF25711DNFQ7B8/QZ+ZF1zzGq1dIi9bzxIu85w==", + "dev": true, + "requires": { + "@types/history": "*", + "@types/react": "*", + "@types/react-router": "*" + } + }, "@webassemblyjs/ast": { "version": "1.5.13", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.5.13.tgz", @@ -1327,9 +1370,9 @@ "dev": true }, "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", + "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", "dev": true }, "array-union": { @@ -1359,12 +1402,6 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -1493,9 +1530,9 @@ } }, "awesome-typescript-loader": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/awesome-typescript-loader/-/awesome-typescript-loader-5.2.0.tgz", - "integrity": "sha512-3v5MEUgRz1n90u61UGYbhFxiFq1tK/HBdoY/ScBX1srOiZVo4iF9b6hyP2ZsRp1ewHKYwlEo0OaHUXJVQHv6dw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/awesome-typescript-loader/-/awesome-typescript-loader-5.2.1.tgz", + "integrity": "sha512-slv66OAJB8orL+UUaTI3pKlLorwIvS4ARZzYR9iJJyGsEgOqueMfOMdKySWzZ73vIkEe3fcwFgsKMg4d8zyb1g==", "dev": true, "requires": { "chalk": "^2.4.1", @@ -1565,9 +1602,9 @@ } }, "babel-loader": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.0.tgz", - "integrity": "sha512-lBUGBz411lSfT+8MHPEaqIVQ44odS1D/wxuTMhijqHc9arZR6jhJEaJa0RpZlCSITZoeK6xoDXTaVTrSoFD7IQ==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.2.tgz", + "integrity": "sha512-Law0PGtRV1JL8Y9Wpzc0d6EE0GD7LzXWCfaeWwboUMcBWNG6gvaWTK1/+BK7a4X5EmeJiGEuDDFxUsOa8RSWCw==", "dev": true, "requires": { "find-cache-dir": "^1.0.0", @@ -1835,14 +1872,6 @@ "dns-txt": "^2.0.2", "multicast-dns": "^6.0.1", "multicast-dns-service-types": "^1.1.0" - }, - "dependencies": { - "array-flatten": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", - "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", - "dev": true - } } }, "boolbase": { @@ -2631,12 +2660,6 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, - "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", - "dev": true - }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -3321,9 +3344,9 @@ "dev": true }, "detect-node": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", - "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", "dev": true }, "diff": { @@ -3604,15 +3627,6 @@ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "dev": true }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "dev": true, - "requires": { - "iconv-lite": "~0.4.13" - } - }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", @@ -3979,6 +3993,12 @@ "vary": "~1.1.2" }, "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", @@ -4184,21 +4204,6 @@ "websocket-driver": ">=0.5.1" } }, - "fbjs": { - "version": "0.8.17", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", - "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", - "dev": true, - "requires": { - "core-js": "^1.0.0", - "isomorphic-fetch": "^2.1.1", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.18" - } - }, "fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", @@ -5737,6 +5742,30 @@ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", "dev": true }, + "history": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/history/-/history-4.7.2.tgz", + "integrity": "sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA==", + "dev": true, + "requires": { + "invariant": "^2.2.1", + "loose-envify": "^1.2.0", + "resolve-pathname": "^2.2.0", + "value-equal": "^0.4.0", + "warning": "^3.0.0" + }, + "dependencies": { + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -5799,6 +5828,15 @@ "uglify-js": "3.4.x" } }, + "html-parse-stringify2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify2/-/html-parse-stringify2-2.0.1.tgz", + "integrity": "sha1-3FZwtyksoVi3vJFsmmc1rIhyg0o=", + "dev": true, + "requires": { + "void-elements": "^2.0.1" + } + }, "html-tags": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", @@ -5945,6 +5983,18 @@ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, + "i18next": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-11.7.0.tgz", + "integrity": "sha512-k4nu76PQMUnN4W8OGFQHK3/FWwG8k/GwXdemzMmYUVLPnpBdF6VfWbpMOpTT3DOFmFw7D6Ndj46EH1EbNNtMjw==", + "dev": true + }, + "i18next-browser-languagedetector": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-2.2.3.tgz", + "integrity": "sha512-sJZ2n9Vgax0vGer23hJMwyO3FRO7P0dq2DXZPXWE329g3snfJUcw+S24Mp3lqJaxL/0McDu4BD75ds6pzIfhhw==", + "dev": true + }, "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", @@ -6804,16 +6854,6 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "dev": true, - "requires": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" - } - }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -6935,9 +6975,9 @@ } }, "killable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz", - "integrity": "sha1-2ouEvUfeU5WHj5XWTQLyRJ/gXms=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", "dev": true }, "kind-of": { @@ -7312,6 +7352,15 @@ "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", "dev": true }, + "map-age-cleaner": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz", + "integrity": "sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -7803,16 +7852,6 @@ "lower-case": "^1.1.1" } }, - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "dev": true, - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - }, "node-forge": { "version": "0.7.5", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", @@ -8328,6 +8367,12 @@ "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", "dev": true }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, "p-event": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-event/-/p-event-1.3.0.tgz", @@ -8343,6 +8388,12 @@ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, + "p-is-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "dev": true + }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -9318,15 +9369,6 @@ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "requires": { - "asap": "~2.0.3" - } - }, "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", @@ -9556,15 +9598,15 @@ } }, "react": { - "version": "16.4.2", - "resolved": "https://registry.npmjs.org/react/-/react-16.4.2.tgz", - "integrity": "sha512-dMv7YrbxO4y2aqnvA7f/ik9ibeLSHQJTI6TrYAenPSaQ6OXfb+Oti+oJiy8WBxgRzlKatYqtCjphTgDSCEiWFg==", + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.5.0.tgz", + "integrity": "sha512-nw/yB/L51kA9PsAy17T1JrzzGRk+BlFCJwFF7p+pwVxgqwPjYNeZEkkH7LXn9dmflolrYMXLWMTkQ77suKPTNQ==", "dev": true, "requires": { - "fbjs": "^0.8.16", "loose-envify": "^1.1.0", "object-assign": "^4.1.1", - "prop-types": "^15.6.0" + "prop-types": "^15.6.2", + "schedule": "^0.3.0" } }, "react-addons-test-utils": { @@ -9574,21 +9616,21 @@ "dev": true }, "react-dom": { - "version": "16.4.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.4.2.tgz", - "integrity": "sha512-Usl73nQqzvmJN+89r97zmeUpQDKDlh58eX6Hbs/ERdDHzeBzWy+ENk7fsGQ+5KxArV1iOFPT46/VneklK9zoWw==", + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.5.0.tgz", + "integrity": "sha512-qgsQdjFH54pQ1AGLCBKsqjPxib4Pnp+cOsNxGPlkHn5YnsSt43sBvHSif6FheY7NMMS6HPeSJOxXf6ECanjacA==", "dev": true, "requires": { - "fbjs": "^0.8.16", "loose-envify": "^1.1.0", "object-assign": "^4.1.1", - "prop-types": "^15.6.0" + "prop-types": "^15.6.2", + "schedule": "^0.3.0" } }, "react-hot-loader": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.3.5.tgz", - "integrity": "sha512-6kKabumYl0rYaG9ynZMb7Wq+aR8BO9cctveYuDZJIjwXrfsABrkRGvN3QiQfUL42dh8GllkxhRFXOty+vr4aSA==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.3.6.tgz", + "integrity": "sha512-iuBeBkLz7tdkKmKduNww9o5JY4ZH1XI0TWwkWToHIqfOSh1xMCqLMSYXUasWfgZWykWWa9IkueYab+cDq2jyWg==", "dev": true, "requires": { "fast-levenshtein": "^2.0.6", @@ -9599,12 +9641,69 @@ "shallowequal": "^1.0.2" } }, + "react-i18next": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-7.11.1.tgz", + "integrity": "sha512-L7LZQGjDNwVvM2FRxs1C26AQKot9nD0U1V9VNrg/EobsqsOOv1WiuLURcZekbl1w5nD8Cqc9HJ++EP3Lkj2GTA==", + "dev": true, + "requires": { + "hoist-non-react-statics": "^2.3.1", + "html-parse-stringify2": "2.0.1", + "prop-types": "^15.6.0" + } + }, "react-lifecycles-compat": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", "dev": true }, + "react-router": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz", + "integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==", + "dev": true, + "requires": { + "history": "^4.7.2", + "hoist-non-react-statics": "^2.5.0", + "invariant": "^2.2.4", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.1", + "warning": "^4.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + } + } + }, + "react-router-dom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.3.1.tgz", + "integrity": "sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA==", + "dev": true, + "requires": { + "history": "^4.7.2", + "invariant": "^2.2.4", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.1", + "react-router": "^4.3.1", + "warning": "^4.0.1" + } + }, "read-all-stream": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", @@ -9979,6 +10078,12 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, + "resolve-pathname": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz", + "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==", + "dev": true + }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -10111,6 +10216,15 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, + "schedule": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schedule/-/schedule-0.3.0.tgz", + "integrity": "sha512-20+1KVo517sR7Nt+bYBN8a+bEJDKLPEx7Ohtts1kX05E4/HY53YUNuhfkVNItmWAnBYHcpG9vsd2/CJxG+aPCQ==", + "dev": true, + "requires": { + "object-assign": "^4.1.1" + } + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -11922,9 +12036,9 @@ } }, "tslint-config-standard": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/tslint-config-standard/-/tslint-config-standard-8.0.0.tgz", - "integrity": "sha512-VL5JHr6voPDDKwknjDfAo+ed85g3R/G6yWlAgabYI9RrliJeE28JgdH8J0g/4TAkEdIgwyyAZsZAKRlrPcGLGA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/tslint-config-standard/-/tslint-config-standard-8.0.1.tgz", + "integrity": "sha512-OWG+NblgjQlVuUS/Dmq3ax2v5QDZwRx4L0kEuDi7qFY9UI6RJhhNfoCV1qI4el8Fw1c5a5BTrjQJP0/jhGXY/Q==", "dev": true, "requires": { "tslint-eslint-rules": "^5.3.1" @@ -12008,12 +12122,6 @@ "integrity": "sha512-kk80vLW9iGtjMnIv11qyxLqZm20UklzuR2tL0QAnDIygIUIemcZMxlMWudl9OOt76H3ntVzcTiddQ1/pAAJMYg==", "dev": true }, - "ua-parser-js": { - "version": "0.7.18", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.18.tgz", - "integrity": "sha512-LtzwHlVHwFGTptfNSgezHp7WUlwiqb0gA9AALRbKaERfxwJoiX0A73QbTToxteIAuIaFshhgIZfqK8s7clqgnA==", - "dev": true - }, "uglify-js": { "version": "3.4.8", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.8.tgz", @@ -12475,6 +12583,12 @@ "spdx-expression-parse": "^3.0.0" } }, + "value-equal": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-0.4.0.tgz", + "integrity": "sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw==", + "dev": true + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -12594,6 +12708,12 @@ "indexof": "0.0.1" } }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, "ware": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ware/-/ware-1.3.0.tgz", @@ -12603,6 +12723,15 @@ "wrap-fn": "^0.1.0" } }, + "warning": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.2.tgz", + "integrity": "sha512-wbTp09q/9C+jJn4KKJfJfoS6VleK/Dti0yqWSm6KMvJ4MRCXFQNapHuJXutJIrWV0Cf4AhTdeIe4qdKHR1+Hug==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, "watchpack": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", @@ -12624,9 +12753,9 @@ } }, "webpack": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.17.1.tgz", - "integrity": "sha512-vdPYogljzWPhFKDj3Gcp01Vqgu7K3IQlybc3XIdKSQHelK1C3eIQuysEUR7MxKJmdandZlQB/9BG2Jb1leJHaw==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.17.2.tgz", + "integrity": "sha512-hCK8FPco2Paz9FVMlo3ZdVd7Jsr7qxoiEwhd7f4dMaWBLZtc7E+/9QNee4CYHlVSvpmspWBnhFpx4MiWSl3nNg==", "dev": true, "requires": { "@webassemblyjs/ast": "1.5.13", @@ -12653,7 +12782,7 @@ "tapable": "^1.0.0", "uglifyjs-webpack-plugin": "^1.2.4", "watchpack": "^1.5.0", - "webpack-sources": "^1.0.1" + "webpack-sources": "^1.2.0" }, "dependencies": { "schema-utils": { @@ -12882,9 +13011,9 @@ } }, "webpack-dev-server": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.7.tgz", - "integrity": "sha512-KagFrNHf3QKndS61cXqzkQ4gpdXo0d1LZTTplAJzNK1Ev2ZyJiu+BzerW/2dixYYfpnGzp0AcvCXpmYXIOkFOA==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.8.tgz", + "integrity": "sha512-c+tcJtDqnPdxCAzEEZKdIPmg3i5i7cAHe+B+0xFNK0BlCc2HF/unYccbU7xTgfGc5xxhCztCQzFmsqim+KhI+A==", "dev": true, "requires": { "ansi-html": "0.0.7", @@ -12897,7 +13026,7 @@ "express": "^4.16.2", "html-entities": "^1.2.0", "http-proxy-middleware": "~0.18.0", - "import-local": "^1.0.0", + "import-local": "^2.0.0", "internal-ip": "^3.0.1", "ip": "^1.1.5", "killable": "^1.0.0", @@ -12914,7 +13043,7 @@ "supports-color": "^5.1.0", "webpack-dev-middleware": "3.2.0", "webpack-log": "^2.0.0", - "yargs": "12.0.1" + "yargs": "12.0.2" }, "dependencies": { "ansi-regex": { @@ -12951,6 +13080,19 @@ } } }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -12983,6 +13125,21 @@ "rimraf": "^2.2.8" } }, + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -12992,12 +13149,37 @@ "locate-path": "^3.0.0" } }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -13008,15 +13190,26 @@ "path-exists": "^3.0.0" } }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "mem": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", + "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", "dev": true, "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^1.0.0", + "p-is-promise": "^1.1.0" + } + }, + "os-locale": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz", + "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==", + "dev": true, + "requires": { + "execa": "^0.10.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" } }, "p-limit": { @@ -13043,6 +13236,15 @@ "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", "dev": true }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -13081,16 +13283,16 @@ "dev": true }, "yargs": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.1.tgz", - "integrity": "sha512-B0vRAp1hRX4jgIOWFtjfNjd9OA9RWYZ6tqGA9/I/IrTMsxmKvtWy+ersM+jzpQqbC3YfLzeABPdeTgcJ9eu1qQ==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz", + "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", "dev": true, "requires": { "cliui": "^4.0.0", "decamelize": "^2.0.0", "find-up": "^3.0.0", "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", + "os-locale": "^3.0.0", "require-directory": "^2.1.1", "require-main-filename": "^1.0.1", "set-blocking": "^2.0.0", @@ -13166,12 +13368,6 @@ "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", "dev": true }, - "whatwg-fetch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==", - "dev": true - }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", diff --git a/package.json b/package.json index 9d98652..0bf9406 100644 --- a/package.json +++ b/package.json @@ -33,30 +33,36 @@ "@types/node": "^10.9.4", "@types/react": "^16.4.13", "@types/react-dom": "^16.0.7", - "awesome-typescript-loader": "^5.2.0", - "babel-loader": "^8.0.0", + "@types/react-i18next": "^7.8.2", + "@types/react-router-dom": "^4.3.0", + "awesome-typescript-loader": "^5.2.1", + "babel-loader": "^8.0.2", "css-loader": "^1.0.0", "file-loader": "^2.0.0", "html-webpack-plugin": "^3.2.0", + "i18next": "^11.7.0", + "i18next-browser-languagedetector": "^2.2.3", "image-webpack-loader": "^4.3.1", "node-sass": "^4.9.3", - "react": "^16.4.2", + "react": "^16.5.0", "react-addons-test-utils": "^15.6.2", - "react-dom": "^16.4.2", - "react-hot-loader": "^4.3.4", + "react-dom": "^16.5.0", + "react-hot-loader": "^4.3.6", + "react-i18next": "^7.11.1", + "react-router-dom": "^4.3.1", "sass-loader": "^7.1.0", "style-loader": "^0.23.0", "stylelint": "^9.5.0", "stylelint-config-standard": "^18.2.0", "stylelint-webpack-plugin": "^0.10.5", "tslint": "^5.11.0", - "tslint-config-standard": "^8.0.0", + "tslint-config-standard": "^8.0.1", "typescript": "^3.0.3", "uglifyjs-webpack-plugin": "^1.3.0", - "webpack": "^4.17.1", + "webpack": "^4.17.2", "webpack-cli": "^3.1.0", "webpack-dev-middleware": "^3.1.3", - "webpack-dev-server": "^3.1.5", + "webpack-dev-server": "^3.1.8", "webpack-merge": "^4.1.4" }, "dependencies": {} diff --git a/src/assets/logo.png b/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..439a7a3b5384fa7068876cf3e47fa197aebcbedc GIT binary patch literal 11748 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 { - render () { - return ( -
-

Hello World!

-

Foo to the barz

-
- ) - } -} diff --git a/src/containers/Sidebar/index.tsx b/src/containers/Sidebar/index.tsx new file mode 100644 index 0000000..6fddc80 --- /dev/null +++ b/src/containers/Sidebar/index.tsx @@ -0,0 +1,39 @@ +import * as React from 'react' +import { NavLink } from 'react-router-dom' +import { translate } from 'react-i18next' +import { I18nProps } from '@i18n' + +import './style.scss' +const logo = require('@assets/logo.png') + +interface SidebarProps extends I18nProps { + routes: { + path: string + name: string + exact?: boolean + }[] +} + +class Sidebar extends React.Component { + render () { + const { routes, t } = this.props + return ( +
+ +
    + { + routes.map( + ({ path, name, exact }) => ( +
  • + { t(name) } +
  • + ) + ) + } +
+
+ ) + } +} + +export default translate(['slidebar'])(Sidebar) diff --git a/src/containers/Sidebar/style.scss b/src/containers/Sidebar/style.scss new file mode 100644 index 0000000..274ee6c --- /dev/null +++ b/src/containers/Sidebar/style.scss @@ -0,0 +1,49 @@ +$color: #d8dee2; +$active-color: #57befc; +$active-color-right: #2c8af8; + +.slidebar { + display: flex; + flex-direction: column; + align-items: center; + width: 120px; +} + +.slidebar-logo { + margin-top: 50px; + width: 35px; + height: 35px; +} + +.slidebar-menu { + display: flex; + flex-direction: column; + margin-top: 12px; + + .item { + display: block; + margin-top: 18px; + + > a { + display: block; + width: 100px; + height: 30px; + line-height: 30px; + font-size: 14px; + border-radius: 15px; + text-align: center; + } + + > a, + a:active, + a:visited { + color: $color; + text-decoration: none; + } + + > a.active { + background: linear-gradient(to right, $active-color, $active-color-right); + color: #fff; + } + } +} diff --git a/src/i18n/index.ts b/src/i18n/index.ts new file mode 100644 index 0000000..2c896df --- /dev/null +++ b/src/i18n/index.ts @@ -0,0 +1,37 @@ +import * as i18n from 'i18next' +import * as LanguageDetector from 'i18next-browser-languagedetector' + +const options = { + fallbackLng: 'en', + + ns: ['slidebar'], + resources: { + en: { + slidebar: { + Proxies: 'Proxies', + Overview: 'Overview', + Logs: 'Logs', + Rules: 'Rules', + Setting: 'Setting' + } + }, + cn: { + slidebar: { + Proxies: '代理', + Overview: '总览', + Logs: '日志', + Rules: '规则', + Setting: '设置' + } + } + }, + react: { + wait: true + } +} + +export interface I18nProps { + t? (key: string): string +} + +export default i18n.use(LanguageDetector).init(options) diff --git a/src/render.tsx b/src/render.tsx index 9390999..613f58a 100644 --- a/src/render.tsx +++ b/src/render.tsx @@ -1,7 +1,10 @@ import * as React from 'react' import { render } from 'react-dom' +import { BrowserRouter } from 'react-router-dom' +import { I18nextProvider } from 'react-i18next' import { AppContainer } from 'react-hot-loader' -import App from '@components/App' +import App from '@views/App' +import i18n from '@i18n' const rootEl = document.getElementById('root') @@ -11,17 +14,25 @@ declare let module: { hot: any } export default function renderApp () { render( - + + + + + , rootEl ) if (module.hot) { - module.hot.accept('./components/App', () => { - const NewApp = require('./components/App').default + module.hot.accept('./views/App', () => { + const NewApp = require('./views/App').default render( - + + + + + , rootEl ) diff --git a/src/views/App.scss b/src/views/App.scss new file mode 100644 index 0000000..9f45f9d --- /dev/null +++ b/src/views/App.scss @@ -0,0 +1,22 @@ +html { + box-sizing: border-box; +} + +*, +*::before, +*::after { + margin: 0; + padding: 0; + box-sizing: inherit; +} + +body { + margin: 0; + padding: 0; +} + +.app { + display: flex; + min-height: 100vh; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; +} diff --git a/src/views/App.tsx b/src/views/App.tsx new file mode 100644 index 0000000..b389680 --- /dev/null +++ b/src/views/App.tsx @@ -0,0 +1,40 @@ +import * as React from 'react' +import { Route } from 'react-router-dom' +import { I18nProps } from '@i18n' +import './App.scss' + +import Overview from '@views/Overview' +import Proxies from '@views/Proxies' +import Logs from '@views/Logs' +import Rules from '@views/Rules' +import Settings from '@views/Settings' + +import SlideBar from '@containers/Sidebar' + +export interface AppProps extends I18nProps { +} + +export default class App extends React.Component { + render () { + const routes = [ + { path: '/', name: 'Overview', component: Overview, exact: true }, + { path: '/proxies', name: 'Proxies', component: Proxies }, + { path: '/logs', name: 'Logs', component: Logs }, + { path: '/rules', name: 'Rules', component: Rules }, + { path: '/settings', name: 'Settings', component: Settings } + ] + + return ( +
+ +
+ { + routes.map( + route => + ) + } +
+
+ ) + } +} diff --git a/src/views/Logs/index.tsx b/src/views/Logs/index.tsx new file mode 100644 index 0000000..e8fcabe --- /dev/null +++ b/src/views/Logs/index.tsx @@ -0,0 +1,7 @@ +import * as React from 'react' + +export default class Logs extends React.Component<{}, {}> { + render () { + return 'Logs' + } +} diff --git a/src/views/Overview/index.tsx b/src/views/Overview/index.tsx new file mode 100644 index 0000000..255f133 --- /dev/null +++ b/src/views/Overview/index.tsx @@ -0,0 +1,7 @@ +import * as React from 'react' + +export default class Overview extends React.Component<{}, {}> { + render () { + return 'Overview' + } +} diff --git a/src/views/Proxies/index.tsx b/src/views/Proxies/index.tsx new file mode 100644 index 0000000..ce68cce --- /dev/null +++ b/src/views/Proxies/index.tsx @@ -0,0 +1,7 @@ +import * as React from 'react' + +export default class Proxies extends React.Component<{}, {}> { + render () { + return 'Proxies' + } +} diff --git a/src/views/Rules/index.tsx b/src/views/Rules/index.tsx new file mode 100644 index 0000000..9fdc53c --- /dev/null +++ b/src/views/Rules/index.tsx @@ -0,0 +1,7 @@ +import * as React from 'react' + +export default class Rules extends React.Component<{}, {}> { + render () { + return 'Rules' + } +} diff --git a/src/views/Settings/index.tsx b/src/views/Settings/index.tsx new file mode 100644 index 0000000..66db212 --- /dev/null +++ b/src/views/Settings/index.tsx @@ -0,0 +1,7 @@ +import * as React from 'react' + +export default class Settings extends React.Component<{}, {}> { + render () { + return 'Settings' + } +} diff --git a/tsconfig.json b/tsconfig.json index d376a4c..fa76458 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,14 +11,18 @@ "experimentalDecorators": true, "baseUrl": ".", "paths": { - "@lib": ["src/libs"], + "@assets": ["src/assets"], + "@assets/*": ["src/assets/*"], + "@lib": ["src/lib"], "@lib/*": ["src/lib/*"], "@components": ["src/components"], "@components/*": ["src/components/*"], "@containers": ["src/containers"], "@containers/*": ["src/containers/*"], - "@models": ["src/models"], - "@models/*": ["src/models/*"], + "@views": ["src/views"], + "@views/*": ["src/views/*"], + "@i18n": ["src/i18n"], + "@i18n/*": ["src/i18n/*"], "@stores": ["src/stores"], "@stores/*": ["src/stores/*"] }