This is an automated email from the ASF dual-hosted git repository. shuai pushed a commit to branch feat/basepath in repository https://gitbox.apache.org/repos/asf/incubator-answer.git
commit 53ba7fb0355fcffc8393bc340d4515adc8e81168 Merge: 530065d2 92eec140 Author: shuai <[email protected]> AuthorDate: Tue Apr 23 10:22:23 2024 +0800 feat: support for parametrizing the base path #335 #836 #800 ui/.env.production | 5 +- ui/package.json | 3 +- ui/pnpm-lock.yaml | 131 +++++++++++++++------ ui/scripts/env.js | 21 ++++ ui/src/App.tsx | 4 +- ui/src/components/Header/index.tsx | 49 ++++---- ui/src/components/PageTags/index.tsx | 8 +- ui/src/components/Share/index.tsx | 5 +- ui/src/pages/Admin/Answers/index.tsx | 8 +- ui/src/pages/Admin/Questions/index.tsx | 6 +- .../pages/Install/components/FifthStep/index.tsx | 10 +- ui/src/pages/Install/index.tsx | 3 +- .../Ask/components/SearchQuestion/index.tsx | 5 +- ui/src/pages/Questions/EditAnswer/index.tsx | 8 +- ui/src/pages/Users/Logout/index.tsx | 4 +- ui/src/router/alias.ts | 2 + ui/src/utils/floppyNavigation.ts | 23 +++- 17 files changed, 211 insertions(+), 84 deletions(-) diff --cc ui/.env.production index 33d84710,5e1007e7..3d8f6a77 --- a/ui/.env.production +++ b/ui/.env.production @@@ -1,4 -1,5 +1,5 @@@ TSC_COMPILE_ON_ERROR=true ESLINT_NO_DEV_ERRORS=true --PUBLIC_URL = / --REACT_APP_API_URL = / -REACT_APP_BASE_URL = "" ++PUBLIC_URL=/ ++REACT_APP_API_URL=/ ++REACT_APP_BASE_URL=/test diff --cc ui/package.json index 63a1f85d,e10d6e7c..86e34c1e --- a/ui/package.json +++ b/ui/package.json @@@ -2,10 -2,10 +2,10 @@@ "name": "answer-static", "version": "0.1.0", "private": true, - "homepage": "/test", + "homepage": "/", "scripts": { "start": "react-app-rewired start", -- "build": "react-app-rewired build", ++ "build": "node ./scripts/env.js && react-app-rewired build", "lint": "eslint . --cache --fix --ext .ts,.tsx", "prettier": "prettier --write 'src/**/*.{js,jsx,ts,tsx,json,css,scss,md}' --config ./.prettierrc.json", "pre-install": "node ./scripts/preinstall.js && pnpm install", @@@ -76,6 -76,6 +76,7 @@@ "eslint-plugin-react-hooks": "^4.6.0", "humps": "^2.0.1", "husky": "^8.0.1", ++ "js-yaml": "^4.1.0", "lint-staged": "^13.2.3", "postcss": "^8.0.0", "prettier": "^3.1.0", diff --cc ui/pnpm-lock.yaml index 0369458a,83bdc9e2..18092545 --- a/ui/pnpm-lock.yaml +++ b/ui/pnpm-lock.yaml @@@ -200,6 -183,6 +183,9 @@@ importers husky: specifier: ^8.0.1 version: 8.0.1 ++ js-yaml: ++ specifier: ^4.1.0 ++ version: 4.1.0 lint-staged: specifier: ^13.2.3 version: 13.3.0 @@@ -231,6 -214,6 +217,64 @@@ specifier: ^0.8.0 version: 0.8.0 ++ src/plugins/captcha-basic: ++ devDependencies: ++ '@typescript-eslint/eslint-plugin': ++ specifier: ^6.0.0 ++ version: 6.11.0(@typescript-eslint/[email protected])([email protected])([email protected]) ++ '@typescript-eslint/parser': ++ specifier: ^6.0.0 ++ version: 6.11.0([email protected])([email protected]) ++ '@vitejs/plugin-react-swc': ++ specifier: ^3.3.2 ++ version: 3.5.0([email protected]) ++ eslint: ++ specifier: ^8.45.0 ++ version: 8.53.0 ++ eslint-plugin-react-hooks: ++ specifier: ^4.6.0 ++ version: 4.6.0([email protected]) ++ eslint-plugin-react-refresh: ++ specifier: ^0.4.3 ++ version: 0.4.5([email protected]) ++ typescript: ++ specifier: ^5.0.2 ++ version: 5.3.2 ++ vite: ++ specifier: ^4.4.5 ++ version: 4.5.0(@types/[email protected])([email protected]) ++ ++ src/plugins/captcha-google-v2: ++ dependencies: ++ react-google-recaptcha: ++ specifier: ^3.1.0 ++ version: 3.1.0([email protected]) ++ devDependencies: ++ '@typescript-eslint/eslint-plugin': ++ specifier: ^6.0.0 ++ version: 6.11.0(@typescript-eslint/[email protected])([email protected])([email protected]) ++ '@typescript-eslint/parser': ++ specifier: ^6.0.0 ++ version: 6.11.0([email protected])([email protected]) ++ '@vitejs/plugin-react-swc': ++ specifier: ^3.3.2 ++ version: 3.5.0([email protected]) ++ eslint: ++ specifier: ^8.45.0 ++ version: 8.53.0 ++ eslint-plugin-react-hooks: ++ specifier: ^4.6.0 ++ version: 4.6.0([email protected]) ++ eslint-plugin-react-refresh: ++ specifier: ^0.4.3 ++ version: 0.4.5([email protected]) ++ typescript: ++ specifier: ^5.0.2 ++ version: 5.3.2 ++ vite: ++ specifier: ^4.4.5 ++ version: 4.5.0(@types/[email protected])([email protected]) ++ src/plugins/editor-chart: dependencies: mermaid: @@@ -3072,7 -3055,7 +3116,7 @@@ packages resolution: {integrity: sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==} dependencies: '@types/estree': 1.0.0 -- '@types/json-schema': 7.0.13 ++ '@types/json-schema': 7.0.15 /@types/[email protected]: resolution: {integrity: sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==} @@@ -3149,12 -3132,12 +3193,8 @@@ pretty-format: 27.5.1 dev: true -- /@types/[email protected]: -- resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==} -- /@types/[email protected]: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} -- dev: true /@types/[email protected]: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} @@@ -3594,7 -3577,7 +3634,7 @@@ peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: -- '@types/json-schema': 7.0.13 ++ '@types/json-schema': 7.0.15 '@typescript-eslint/scope-manager': 5.38.0 '@typescript-eslint/types': 5.38.0 '@typescript-eslint/typescript-estree': 5.38.0([email protected]) @@@ -3612,7 -3595,7 +3652,7 @@@ eslint: ^7.0.0 || ^8.0.0 dependencies: '@eslint-community/eslint-utils': 4.4.0([email protected]) -- '@types/json-schema': 7.0.13 ++ '@types/json-schema': 7.0.15 '@types/semver': 7.5.5 '@typescript-eslint/scope-manager': 6.11.0 '@typescript-eslint/types': 6.11.0 @@@ -3631,7 -3614,7 +3671,7 @@@ eslint: ^7.0.0 || ^8.0.0 dependencies: '@eslint-community/eslint-utils': 4.4.0([email protected]) -- '@types/json-schema': 7.0.13 ++ '@types/json-schema': 7.0.15 '@types/semver': 7.5.5 '@typescript-eslint/scope-manager': 6.11.0 '@typescript-eslint/types': 6.11.0 @@@ -3950,7 -3933,7 +3990,6 @@@ resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} engines: {node: '>=0.4.0'} hasBin: true -- dev: true /[email protected]: resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==} @@@ -6954,7 -6937,7 +6993,7 @@@ optional: true dependencies: '@babel/code-frame': 7.18.6 -- '@types/json-schema': 7.0.13 ++ '@types/json-schema': 7.0.15 chalk: 4.1.2 chokidar: 3.5.3 cosmiconfig: 6.0.0 @@@ -7262,6 -7245,6 +7301,12 @@@ resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} dev: false ++ /[email protected]: ++ resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} ++ dependencies: ++ react-is: 16.13.1 ++ dev: false ++ /[email protected]: resolution: {integrity: sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==} engines: {node: '>= 6.0.0'} @@@ -8421,7 -8404,7 +8466,7 @@@ optional: true dependencies: abab: 2.0.6 -- acorn: 8.10.0 ++ acorn: 8.11.3 acorn-globals: 6.0.0 cssom: 0.4.4 cssstyle: 2.3.0 @@@ -10282,6 -10265,6 +10327,16 @@@ semver: 5.7.1 dev: true ++ /[email protected]([email protected]): ++ resolution: {integrity: sha512-bCpkbm9JiAuMGhkqoAiC0lLkb40DJ0HOEJIku+9JDjxX3Rcs+ztEOG13wbrOskt3n2DTrjshhaQ/iay+SnGg5Q==} ++ peerDependencies: ++ react: '>=16.4.1' ++ dependencies: ++ hoist-non-react-statics: 3.3.2 ++ prop-types: 15.8.1 ++ react: 18.2.0 ++ dev: false ++ /[email protected](@types/[email protected])([email protected])([email protected]): resolution: {integrity: sha512-87gRP69VAfeU2yKgp8RI3HvzhPNrnYIV2QNranYXataz3ef+k7OhvKGGdxQLQfUsQ2RTmlY66tn4pdFrZ94hNg==} peerDependencies: @@@ -10366,6 -10349,6 +10421,16 @@@ resolution: {integrity: sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==} dev: false ++ /[email protected]([email protected]): ++ resolution: {integrity: sha512-cYW2/DWas8nEKZGD7SCu9BSuVz8iOcOLHChHyi7upUuVhkpkhYG/6N3KDiTQ3XAiZ2UAZkfvYKMfAHOzBOcGEg==} ++ peerDependencies: ++ react: '>=16.4.1' ++ dependencies: ++ prop-types: 15.8.1 ++ react: 18.2.0 ++ react-async-script: 1.2.0([email protected]) ++ dev: false ++ /[email protected]([email protected])([email protected]): resolution: {integrity: sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==} peerDependencies: @@@ -10947,7 -10930,7 +11012,7 @@@ resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==} engines: {node: '>= 8.9.0'} dependencies: -- '@types/json-schema': 7.0.13 ++ '@types/json-schema': 7.0.15 ajv: 6.12.6 ajv-keywords: 3.5.2([email protected]) @@@ -10955,7 -10938,7 +11020,7 @@@ resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} engines: {node: '>= 8.9.0'} dependencies: -- '@types/json-schema': 7.0.13 ++ '@types/json-schema': 7.0.15 ajv: 6.12.6 ajv-keywords: 3.5.2([email protected]) @@@ -10963,7 -10946,7 +11028,7 @@@ resolution: {integrity: sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==} engines: {node: '>= 10.13.0'} dependencies: -- '@types/json-schema': 7.0.13 ++ '@types/json-schema': 7.0.15 ajv: 6.12.6 ajv-keywords: 3.5.2([email protected]) @@@ -10980,7 -10963,7 +11045,7 @@@ resolution: {integrity: sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==} engines: {node: '>= 12.13.0'} dependencies: -- '@types/json-schema': 7.0.13 ++ '@types/json-schema': 7.0.15 ajv: 8.11.0 ajv-formats: 2.1.1([email protected]) ajv-keywords: 5.1.0([email protected]) @@@ -11713,7 -11696,7 +11778,7 @@@ hasBin: true dependencies: '@jridgewell/source-map': 0.3.2 -- acorn: 8.10.0 ++ acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 diff --cc ui/scripts/env.js index 00000000,00000000..df97966c new file mode 100644 --- /dev/null +++ b/ui/scripts/env.js @@@ -1,0 -1,0 +1,21 @@@ ++const fs = require('fs'); ++const path = require('path'); ++const yaml = require('js-yaml'); ++ ++const configFilePath = path.resolve(__dirname, '../../configs/config.yaml'); ++const envFilePath = path.resolve(__dirname, '../.env.production'); ++ ++// Read config.yaml file ++const config = yaml.load(fs.readFileSync(configFilePath, 'utf8')); ++ ++// Generate .env file content ++let envContent = 'TSC_COMPILE_ON_ERROR=true\nESLINT_NO_DEV_ERRORS=true\n'; ++for (const key in config.ui) { ++ const value = config.ui[key]; ++ envContent += `${key.toUpperCase()}=${value}\n`; ++} ++ ++// Write .env file ++fs.writeFileSync(envFilePath, envContent); ++ ++console.log(`Generated ${envFilePath}`); diff --cc ui/src/router/alias.ts index 5a155969,5f765b22..21a466c0 --- a/ui/src/router/alias.ts +++ b/ui/src/router/alias.ts @@@ -16,6 -16,10 +16,8 @@@ * specific language governing permissions and limitations * under the License. */ - + export const REACT_BASE_PATH = process.env.REACT_APP_BASE_URL || ''; - + export const BASE_ORIGIN = `${window.location.origin}${REACT_BASE_PATH}`; export const RouteAlias = { home: '/',
