@qlover/create-app 0.3.3 → 0.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +51 -0
- package/package.json +3 -3
- package/templates/react-app/README.md +311 -120
- package/templates/react-app/config/Identifier.I18n.ts +170 -0
- package/templates/react-app/config/common.ts +13 -0
- package/templates/react-app/package.json +4 -2
- package/templates/react-app/public/locales/en/common.json +25 -1
- package/templates/react-app/public/locales/zh/common.json +25 -1
- package/templates/react-app/src/App.tsx +5 -4
- package/templates/react-app/src/base/apis/AiApi.ts +4 -4
- package/templates/react-app/src/base/apis/feApi/FeApiAdapter.ts +2 -2
- package/templates/react-app/src/base/apis/userApi/UserApiAdapter.ts +2 -2
- package/templates/react-app/src/base/cases/AppConfig.ts +103 -0
- package/templates/react-app/src/base/cases/{appError/AppError.ts → AppError.ts} +0 -3
- package/templates/react-app/src/base/cases/DialogHandler.ts +86 -0
- package/templates/react-app/src/base/cases/RouterLoader.ts +166 -0
- package/templates/react-app/src/base/port/InteractionHubInterface.ts +94 -0
- package/templates/react-app/src/base/services/I18nService.ts +19 -0
- package/templates/react-app/src/base/types/deprecated-antd.d.ts +60 -0
- package/templates/react-app/src/core/IOC.ts +6 -1
- package/templates/react-app/src/core/bootstrap.ts +21 -31
- package/templates/react-app/src/core/globals.ts +8 -1
- package/templates/react-app/src/core/registers/RegisterGlobals.ts +11 -7
- package/templates/react-app/src/core/registers/index.ts +1 -2
- package/templates/react-app/src/pages/base/About.tsx +114 -1
- package/templates/react-app/src/pages/base/Executor.tsx +10 -15
- package/templates/react-app/src/styles/css/antd-themes/_default.css +239 -0
- package/templates/react-app/src/styles/css/antd-themes/dark.css +176 -0
- package/templates/react-app/src/styles/css/antd-themes/index.css +3 -0
- package/templates/react-app/src/styles/css/antd-themes/no-context.css +34 -0
- package/templates/react-app/src/styles/css/antd-themes/pink.css +199 -0
- package/templates/react-app/src/styles/css/index.css +3 -0
- package/templates/react-app/src/styles/css/themes/_default.css +10 -181
- package/templates/react-app/src/styles/css/themes/dark.css +10 -135
- package/templates/react-app/src/styles/css/themes/pink.css +10 -141
- package/templates/react-app/src/uikit/components/RouterRenderComponent.tsx +1 -1
- package/templates/react-app/src/uikit/controllers/RouterController.ts +1 -1
- package/templates/react-app/src/uikit/controllers/UserController.ts +1 -1
- package/templates/react-app/tsconfig.json +3 -2
- package/templates/react-app/tsconfig.node.json +2 -1
- package/templates/react-app/vite.config.ts +8 -2
- package/templates/react-app/src/base/cases/router-loader/index.ts +0 -90
- package/templates/react-app/src/core/AppConfig.ts +0 -36
|
@@ -5,156 +5,25 @@
|
|
|
5
5
|
--color-bg-base: 255 241 242; /* rose-50 */
|
|
6
6
|
--color-bg-secondary: 255 228 230; /* rose-100 */
|
|
7
7
|
--color-bg-elevated: 254 205 211; /* rose-200 */
|
|
8
|
-
|
|
8
|
+
|
|
9
9
|
/* 文字颜色 */
|
|
10
10
|
--color-text-primary: 190 18 60; /* rose-700 */
|
|
11
11
|
--color-text-secondary: 225 29 72; /* rose-600 */
|
|
12
12
|
--color-text-tertiary: 244 63 94; /* rose-500 */
|
|
13
|
-
|
|
13
|
+
|
|
14
14
|
/* 边框颜色 */
|
|
15
15
|
--color-border: 254 205 211; /* rose-200 */
|
|
16
|
-
|
|
16
|
+
|
|
17
17
|
/* 品牌色 */
|
|
18
18
|
--color-brand: 225 29 72; /* rose-600 */
|
|
19
19
|
--color-brand-hover: 244 63 94; /* rose-500 */
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/* custom variables - for antd and custom css */
|
|
24
|
-
[data-theme='pink'],
|
|
25
|
-
[data-theme='pink'] .fe-theme {
|
|
26
|
-
/* Antd 主色调相关变量 - 玫瑰色主题 */
|
|
27
|
-
--fe-color-primary: #f472b6; /* pink-400 */
|
|
28
|
-
--fe-color-primary-hover: #ec4899; /* pink-500 */
|
|
29
|
-
--fe-color-primary-active: #db2777; /* pink-600 */
|
|
30
|
-
--fe-color-primary-bg: rgba(244, 114, 182, 0.1); /* pink-400 with 0.1 opacity */
|
|
31
|
-
--fe-color-primary-border: #f472b6; /* pink-400 */
|
|
32
|
-
--fe-color-primary-text: #f472b6; /* pink-400 */
|
|
33
|
-
--fe-color-primary-text-hover: #ec4899; /* pink-500 */
|
|
34
|
-
--fe-color-primary-text-active: #db2777; /* pink-600 */
|
|
35
|
-
--fe-color-primary-deprecated-bg: #f472b6; /* pink-400 */
|
|
36
|
-
--fe-color-primary-deprecated-border: #f472b6; /* pink-400 */
|
|
37
|
-
|
|
38
|
-
/* Antd 基础变量 */
|
|
39
|
-
--ant-color-bg-container: rgb(255 241 242);
|
|
40
|
-
--ant-color-bg-elevated: rgb(254 205 211);
|
|
41
|
-
--ant-color-text: rgba(190 18 60 / 0.85);
|
|
42
|
-
--ant-color-text-secondary: rgba(190 18 60 / 0.45);
|
|
43
|
-
--ant-color-text-tertiary: rgba(190 18 60 / 0.35);
|
|
44
|
-
--ant-color-text-quaternary: rgba(190 18 60 / 0.15);
|
|
45
|
-
--ant-color-text-placeholder: rgba(190 18 60 / 0.25);
|
|
46
|
-
--ant-color-border: rgb(254 205 211);
|
|
47
|
-
|
|
48
|
-
/* Antd Input 组件变量 */
|
|
49
|
-
&.ant-input-css-var {
|
|
50
|
-
/* Input 背景色 */
|
|
51
|
-
--fe-input-bg: var(--ant-color-bg-container);
|
|
52
|
-
--fe-input-hover-bg: var(--ant-color-bg-elevated);
|
|
53
|
-
--fe-input-active-bg: var(--ant-color-bg-elevated);
|
|
54
|
-
--fe-input-addon-bg: rgba(190 18 60, 0.02);
|
|
55
|
-
|
|
56
|
-
/* Input 边框颜色 */
|
|
57
|
-
--fe-input-border-color: var(--ant-color-border);
|
|
58
|
-
--fe-input-hover-border-color: rgb(var(--color-brand));
|
|
59
|
-
--fe-input-active-border-color: rgb(var(--color-brand));
|
|
60
|
-
|
|
61
|
-
/* Input 阴影效果 */
|
|
62
|
-
--fe-input-active-shadow: 0 0 0 2px rgba(var(--color-brand), 0.1);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/* 登录页特定样式 */
|
|
66
|
-
--login-card-shadow: 0 4px 12px rgba(244 63 94 / 0.15);
|
|
67
|
-
--login-input-bg: var(--ant-color-bg-container);
|
|
68
|
-
--login-input-border: var(--ant-color-border);
|
|
69
|
-
--login-button-text: rgb(255 255 255);
|
|
70
|
-
--login-social-button-bg: var(--ant-color-bg-container);
|
|
71
|
-
--login-social-button-border: var(--ant-color-border);
|
|
72
|
-
|
|
73
|
-
/* Antd Button 组件变量 */
|
|
74
|
-
&.ant-btn {
|
|
75
|
-
/* 玫瑰色主题 */
|
|
76
|
-
--fe-button-primary-color: #fff;
|
|
77
|
-
--fe-button-primary-bg: #f472b6; /* pink-400 */
|
|
78
|
-
--fe-button-primary-hover-bg: #ec4899; /* pink-500 */
|
|
79
|
-
--fe-button-primary-active-bg: #db2777; /* pink-600 */
|
|
80
|
-
--fe-button-primary-shadow: 0 2px 0 rgba(219, 39, 119, 0.15);
|
|
81
|
-
|
|
82
|
-
/* 默认按钮 */
|
|
83
|
-
--fe-button-default-color: rgb(190 18 60);
|
|
84
|
-
--fe-button-default-bg: rgb(255 241 242);
|
|
85
|
-
--fe-button-default-border-color: rgb(254 205 211);
|
|
86
|
-
--fe-button-default-hover-bg: rgb(255 241 242);
|
|
87
|
-
--fe-button-default-hover-color: #f472b6;
|
|
88
|
-
--fe-button-default-hover-border-color: #f472b6;
|
|
89
|
-
--fe-button-default-active-bg: rgb(255 241 242);
|
|
90
|
-
--fe-button-default-active-color: #db2777;
|
|
91
|
-
--fe-button-default-active-border-color: #db2777;
|
|
92
|
-
--fe-button-default-shadow: 0 2px 0 rgba(244, 114, 182, 0.1);
|
|
93
|
-
|
|
94
|
-
/* 其他状态 */
|
|
95
|
-
--fe-button-text-hover-bg: rgba(244, 114, 182, 0.08);
|
|
96
|
-
--fe-button-border-color-disabled: rgb(254 205 211);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/* Antd 图标相关变量 */
|
|
100
|
-
--fe-color-icon: rgba(190, 18, 60, 0.45); /* 粉色主题下的图标颜色 */
|
|
101
|
-
--fe-color-icon-hover: rgba(190, 18, 60, 0.85); /* 粉色主题下图标悬停颜色 */
|
|
102
|
-
--fe-color-icon-active: var(--fe-color-primary); /* 使用主题粉色 */
|
|
103
|
-
--fe-color-icon-disabled: rgba(190, 18, 60, 0.25); /* 粉色主题下禁用状态 */
|
|
104
|
-
|
|
105
|
-
/* Antd Select 组件变量 */
|
|
106
|
-
&.ant-select-css-var {
|
|
107
|
-
--fe-select-internal_fixed_item_margin: 2px;
|
|
108
|
-
--fe-select-z-index-popup: 1050;
|
|
109
|
-
--fe-select-option-selected-color: rgba(190, 18, 60, 0.88);
|
|
110
|
-
--fe-select-option-selected-font-weight: 600;
|
|
111
|
-
--fe-select-option-selected-bg: var(--fe-color-primary-bg);
|
|
112
|
-
--fe-select-option-active-bg: rgba(190, 18, 60, 0.04);
|
|
113
|
-
--fe-select-option-padding: 5px 12px;
|
|
114
|
-
--fe-select-option-font-size: 14px;
|
|
115
|
-
--fe-select-option-line-height: 1.5714285714285714;
|
|
116
|
-
--fe-select-option-height: 32px;
|
|
117
|
-
--fe-select-selector-bg: var(--fe-color-bg-container);
|
|
118
|
-
--fe-select-clear-bg: var(--fe-color-bg-container);
|
|
119
|
-
--fe-select-single-item-height-lg: 40px;
|
|
120
|
-
--fe-select-multiple-item-bg: rgba(190, 18, 60, 0.06);
|
|
121
|
-
--fe-select-multiple-item-border-color: transparent;
|
|
122
|
-
--fe-select-multiple-item-height: 24px;
|
|
123
|
-
--fe-select-multiple-item-height-sm: 16px;
|
|
124
|
-
--fe-select-multiple-item-height-lg: 32px;
|
|
125
|
-
--fe-select-multiple-selector-bg-disabled: rgba(190, 18, 60, 0.04);
|
|
126
|
-
--fe-select-multiple-item-color-disabled: rgba(190, 18, 60, 0.25);
|
|
127
|
-
--fe-select-multiple-item-border-color-disabled: transparent;
|
|
128
|
-
--fe-select-show-arrow-padding-inline-end: 18px;
|
|
129
|
-
--fe-select-hover-border-color: var(--fe-color-primary);
|
|
130
|
-
--fe-select-active-border-color: var(--fe-color-primary-active);
|
|
131
|
-
--fe-select-active-outline-color: var(--fe-color-primary-bg);
|
|
132
|
-
--fe-select-select-affix-padding: 4px;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/* Antd Tag 组件变量 */
|
|
136
|
-
&.ant-tag-css-var {
|
|
137
|
-
--fe-tag-default-bg: var(--fe-color-bg-container);
|
|
138
|
-
--fe-tag-default-color: var(--fe-color-text);
|
|
139
|
-
--fe-tag-default-border-color: var(--fe-color-border);
|
|
140
|
-
--fe-tag-font-size: 12px;
|
|
141
|
-
--fe-tag-line-height: 20px;
|
|
142
|
-
--fe-tag-height: 22px;
|
|
143
|
-
--fe-tag-padding-horizontal: 7px;
|
|
144
|
-
--fe-tag-margin: 0 8px 0 0;
|
|
145
|
-
--fe-tag-border-radius: 4px;
|
|
146
|
-
}
|
|
147
20
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
--
|
|
151
|
-
--
|
|
152
|
-
--
|
|
153
|
-
--
|
|
154
|
-
--
|
|
155
|
-
--fe-progress-circle-text-color: var(--fe-color-text);
|
|
156
|
-
--fe-progress-circle-trail-color: var(--fe-color-bg-elevated);
|
|
157
|
-
--fe-progress-circle-stroke-width: 6px;
|
|
158
|
-
--fe-progress-line-stroke-width: 8px;
|
|
21
|
+
/* 登录页特定样式 */
|
|
22
|
+
--login-card-shadow: 0 4px 12px rgba(244 63 94 / 0.15);
|
|
23
|
+
--login-input-bg: var(--ant-color-bg-container);
|
|
24
|
+
--login-input-border: var(--ant-color-border);
|
|
25
|
+
--login-button-text: rgb(255 255 255);
|
|
26
|
+
--login-social-button-bg: var(--ant-color-bg-container);
|
|
27
|
+
--login-social-button-border: var(--ant-color-border);
|
|
159
28
|
}
|
|
160
29
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Suspense } from 'react';
|
|
2
2
|
import { Loading } from './Loading';
|
|
3
3
|
import BaseRouteProvider from '@/uikit/providers/BaseRouteProvider';
|
|
4
|
-
import { RouterLoaderRender } from '@/base/cases/
|
|
4
|
+
import { RouterLoaderRender } from '@/base/cases/RouterLoader';
|
|
5
5
|
|
|
6
6
|
export const RouterRenderComponent: RouterLoaderRender = (route) => {
|
|
7
7
|
const Component = route.element();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { RouteConfigValue } from '@/base/cases/
|
|
1
|
+
import type { RouteConfigValue } from '@/base/cases/RouterLoader';
|
|
2
2
|
import type { NavigateFunction, NavigateOptions } from 'react-router-dom';
|
|
3
3
|
import type { UIDependenciesInterface } from '@/base/port/UIDependenciesInterface';
|
|
4
4
|
import type { LoggerInterface } from '@qlover/logger';
|
|
@@ -9,7 +9,7 @@ import { inject, injectable } from 'inversify';
|
|
|
9
9
|
import { IOCIdentifier } from '@/core/IOC';
|
|
10
10
|
import { LoginInterface } from '@/base/port/LoginInterface';
|
|
11
11
|
import { UserApi } from '@/base/apis/userApi/UserApi';
|
|
12
|
-
import { AppError } from '@/base/cases/
|
|
12
|
+
import { AppError } from '@/base/cases/AppError';
|
|
13
13
|
import { LOCAL_NO_USER_TOKEN } from '@config/Identifier.Error';
|
|
14
14
|
import { SliceStore } from '@qlover/slice-store-react';
|
|
15
15
|
|
|
@@ -20,10 +20,11 @@
|
|
|
20
20
|
"types": ["vite/client"],
|
|
21
21
|
"paths": {
|
|
22
22
|
"@/*": ["./src/*"],
|
|
23
|
-
"@config/*": ["./config/*"]
|
|
23
|
+
"@config/*": ["./config/*"],
|
|
24
|
+
"@lib/*": ["./lib/*"]
|
|
24
25
|
},
|
|
25
26
|
"experimentalDecorators": true
|
|
26
27
|
},
|
|
27
|
-
"include": ["src"],
|
|
28
|
+
"include": ["src", "lib/**/*.tsx"],
|
|
28
29
|
"references": [{ "path": "./tsconfig.node.json" }]
|
|
29
30
|
}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { defineConfig } from 'vitest/config';
|
|
2
2
|
import react from '@vitejs/plugin-react';
|
|
3
|
-
import { envPrefix } from './config/common';
|
|
3
|
+
import { envPrefix, overrideAntdThemeMode } from './config/common';
|
|
4
4
|
import { name, version } from './package.json';
|
|
5
5
|
import tsconfigPaths from 'vite-tsconfig-paths';
|
|
6
6
|
import envConfig from '@qlover/corekit-bridge/vite-env-config/index';
|
|
7
|
-
import ts2Locales from '@
|
|
7
|
+
import ts2Locales from '@brain-toolkit/ts2locales/vite';
|
|
8
8
|
import i18nConfig from './config/i18n';
|
|
9
9
|
import tailwindcss from '@tailwindcss/vite';
|
|
10
|
+
import viteDeprecatedAntd from '@brain-toolkit/antd-theme-override/vite';
|
|
10
11
|
|
|
11
12
|
// https://vite.dev/config/
|
|
12
13
|
export default defineConfig({
|
|
@@ -34,6 +35,11 @@ export default defineConfig({
|
|
|
34
35
|
target: './public/locales/{{lng}}/common.json'
|
|
35
36
|
}
|
|
36
37
|
]
|
|
38
|
+
}),
|
|
39
|
+
viteDeprecatedAntd({
|
|
40
|
+
mode: overrideAntdThemeMode,
|
|
41
|
+
overriedCssFilePath: './src/styles/css/antd-themes/no-context.css',
|
|
42
|
+
targetPath: './src/base/types/deprecated-antd.d.ts'
|
|
37
43
|
})
|
|
38
44
|
],
|
|
39
45
|
envPrefix: envPrefix,
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import { RouteObject } from 'react-router-dom';
|
|
2
|
-
import isString from 'lodash/isString';
|
|
3
|
-
import type { ComponentType, LazyExoticComponent, ReactNode } from 'react';
|
|
4
|
-
|
|
5
|
-
export type ComponentValue = Record<string, () => unknown>;
|
|
6
|
-
|
|
7
|
-
type RouteComponentType<T = unknown> =
|
|
8
|
-
| ComponentType<T>
|
|
9
|
-
| LazyExoticComponent<ComponentType<T>>;
|
|
10
|
-
|
|
11
|
-
export type RouteConfigValue = Omit<RouteObject, 'element' | 'children'> & {
|
|
12
|
-
/**
|
|
13
|
-
* 路径
|
|
14
|
-
*
|
|
15
|
-
* FIXME: support `ReactNode`
|
|
16
|
-
*/
|
|
17
|
-
element?: string;
|
|
18
|
-
children?: RouteConfigValue[];
|
|
19
|
-
meta?: Record<string, unknown>;
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
export type RouterLoaderRender = (
|
|
23
|
-
route: Omit<RouteConfigValue, 'element'> & {
|
|
24
|
-
element: () => RouteComponentType;
|
|
25
|
-
}
|
|
26
|
-
) => ReactNode;
|
|
27
|
-
|
|
28
|
-
export type RouterLoaderOptions = {
|
|
29
|
-
/**
|
|
30
|
-
* 路由配置
|
|
31
|
-
*/
|
|
32
|
-
routes?: RouteConfigValue[];
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* 组件映射表
|
|
36
|
-
*/
|
|
37
|
-
componentMaps?: ComponentValue;
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* 渲染路由
|
|
41
|
-
*/
|
|
42
|
-
render: RouterLoaderRender;
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
export class RouterLoader {
|
|
46
|
-
constructor(private readonly options: RouterLoaderOptions) {
|
|
47
|
-
if (!options.render) {
|
|
48
|
-
throw new Error('RouterLoader render is required');
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
getComponentMaps(): ComponentValue {
|
|
53
|
-
const { componentMaps = {} } = this.options;
|
|
54
|
-
|
|
55
|
-
return componentMaps;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
getComponent(element: string): () => RouteComponentType {
|
|
59
|
-
const maps = this.getComponentMaps();
|
|
60
|
-
|
|
61
|
-
const component = maps[element];
|
|
62
|
-
|
|
63
|
-
if (!component) {
|
|
64
|
-
throw new Error(`Component not found: ${element}`);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
return component as () => RouteComponentType;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
toRoute(route: RouteConfigValue): RouteObject {
|
|
71
|
-
const { render } = this.options;
|
|
72
|
-
const { element, children, ...rest } = route;
|
|
73
|
-
|
|
74
|
-
if (!element || !isString(element)) {
|
|
75
|
-
console.warn(
|
|
76
|
-
`Invalid route, path is: ${route.path}, element is: ${element}`
|
|
77
|
-
);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const componet = this.getComponent(element || '404');
|
|
81
|
-
const Element = render({ ...rest, element: componet });
|
|
82
|
-
|
|
83
|
-
// @ts-expect-error
|
|
84
|
-
return {
|
|
85
|
-
...rest,
|
|
86
|
-
element: Element,
|
|
87
|
-
children: children?.map((child) => this.toRoute(child))
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import type { EnvConfigInterface } from '@qlover/corekit-bridge';
|
|
2
|
-
|
|
3
|
-
export class AppConfigImpl implements EnvConfigInterface {
|
|
4
|
-
readonly appName = '';
|
|
5
|
-
readonly appVersion = '';
|
|
6
|
-
/**
|
|
7
|
-
* vite mode
|
|
8
|
-
*
|
|
9
|
-
*/
|
|
10
|
-
readonly env: string = '';
|
|
11
|
-
|
|
12
|
-
readonly userTokenStorageKey = '';
|
|
13
|
-
readonly openAiModels = [
|
|
14
|
-
'gpt-4o-mini',
|
|
15
|
-
'gpt-3.5-turbo',
|
|
16
|
-
'gpt-3.5-turbo-2',
|
|
17
|
-
'gpt-4',
|
|
18
|
-
'gpt-4-32k'
|
|
19
|
-
];
|
|
20
|
-
readonly openAiBaseUrl = '';
|
|
21
|
-
readonly openAiToken = '';
|
|
22
|
-
readonly openAiTokenPrefix = '';
|
|
23
|
-
readonly openAiRequireToken = true;
|
|
24
|
-
readonly loginUser = '';
|
|
25
|
-
readonly loginPassword = '';
|
|
26
|
-
|
|
27
|
-
readonly feApiBaseUrl = '';
|
|
28
|
-
readonly userApiBaseUrl = '';
|
|
29
|
-
|
|
30
|
-
readonly aiApiBaseUrl = 'https://api.openai.com/v1';
|
|
31
|
-
readonly aiApiToken = '';
|
|
32
|
-
readonly aiApiTokenPrefix = 'Bearer';
|
|
33
|
-
readonly aiApiRequireToken = true;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export default new AppConfigImpl();
|