@_tc/template-core 0.2.0-bate.0 → 0.2.0-bate.10

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.
Files changed (164) hide show
  1. package/.skills/tc-component-usage-skills/reference/template-core-frontend.md +8 -1
  2. package/.skills/tc-generator/SKILL.md +3 -2
  3. package/.skills/tc-generator/reference/example.md +1 -1
  4. package/.skills/tc-generator/reference/model-schema.md +18 -0
  5. package/.skills/tc-generator/reference/project-template/index.js +1 -1
  6. package/.skills/tc-generator/reference/runtime-extensions.md +22 -2
  7. package/AGENT_README.md +35 -14
  8. package/README.md +238 -33
  9. package/cjs/app/controller/view.js +1 -1
  10. package/cjs/app/{extend → extends}/db.js +1 -1
  11. package/cjs/app/extends/localCacheHtmlEtag.js +1 -0
  12. package/cjs/app/extends/render-view.js +1 -0
  13. package/cjs/app/middleware.js +1 -1
  14. package/cjs/app/view/entry.tpl +0 -16
  15. package/cjs/bundler/buildFE.js +1 -0
  16. package/cjs/bundler/index.js +1 -1
  17. package/cjs/bundler/state.js +1 -1
  18. package/cjs/bundler/utils.js +3 -3
  19. package/cjs/packages/common/index.js +1 -1
  20. package/cjs/packages/common/rafTimer.js +1 -0
  21. package/cjs/packages/common/string/index.js +1 -1
  22. package/cjs/packages/core/index.js +1 -1
  23. package/cjs/packages/core/loader/controller.js +1 -1
  24. package/cjs/packages/core/loader/extend.js +1 -1
  25. package/cjs/packages/core/loader/middleware.js +1 -1
  26. package/cjs/packages/core/loader/router-schema.js +1 -1
  27. package/cjs/packages/core/loader/router.js +1 -1
  28. package/cjs/packages/core/loader/service.js +1 -1
  29. package/cjs/packages/utils/runFileFn.js +1 -1
  30. package/esm/app/controller/view.js +28 -15
  31. package/esm/app/{extend → extends}/$fetch.js +1 -1
  32. package/esm/app/{extend → extends}/crypto.js +1 -1
  33. package/esm/app/{extend → extends}/db.js +2 -2
  34. package/esm/app/{extend → extends}/generateErrorMessage.js +1 -1
  35. package/esm/app/extends/localCacheHtmlEtag.js +41 -0
  36. package/esm/app/{extend → extends}/logger.js +1 -1
  37. package/esm/app/{extend → extends}/parsingParamsOnUrl.js +1 -1
  38. package/esm/app/extends/render-view.js +18 -0
  39. package/esm/app/middleware.js +8 -12
  40. package/esm/app/view/entry.tpl +0 -16
  41. package/esm/bundler/buildFE.js +14 -0
  42. package/esm/bundler/index.js +2 -14
  43. package/esm/bundler/state.js +5 -1
  44. package/esm/bundler/utils.js +130 -104
  45. package/esm/packages/common/index.js +7 -6
  46. package/esm/packages/common/rafTimer.js +47 -0
  47. package/esm/packages/common/string/index.js +11 -2
  48. package/esm/packages/core/index.js +34 -28
  49. package/esm/packages/core/loader/controller.js +6 -6
  50. package/esm/packages/core/loader/extend.js +6 -6
  51. package/esm/packages/core/loader/middleware.js +6 -6
  52. package/esm/packages/core/loader/router-schema.js +7 -7
  53. package/esm/packages/core/loader/router.js +13 -13
  54. package/esm/packages/core/loader/service.js +6 -6
  55. package/esm/packages/utils/runFileFn.js +10 -10
  56. package/fe/frontend/apps/dash/Dashboard.js +6 -4
  57. package/fe/frontend/apps/dash/dash.entry.js +4 -0
  58. package/fe/frontend/src/common/generateMenuData.d.ts +4 -1
  59. package/fe/frontend/src/common/generateMenuData.js +3 -3
  60. package/fe/frontend/src/common/language.d.ts +12 -1
  61. package/fe/frontend/src/common/language.js +25 -4
  62. package/fe/frontend/src/common/rafTimer.d.ts +1 -0
  63. package/fe/frontend/src/common/rafTimer.js +2 -0
  64. package/fe/frontend/src/common/request.js +1 -0
  65. package/fe/frontend/src/common/theme.d.ts +7 -0
  66. package/fe/frontend/src/common/theme.js +33 -0
  67. package/fe/frontend/src/components/BasePage/HeaderView.js +2 -2
  68. package/fe/frontend/src/components/LanguageSwitch/LanguageSwitch.js +22 -6
  69. package/fe/frontend/src/components/ThemeSwitch/ThemeSwitch.d.ts +3 -2
  70. package/fe/frontend/src/components/ThemeSwitch/ThemeSwitch.js +6 -29
  71. package/fe/frontend/src/components/ThemeSwitch/index.d.ts +1 -0
  72. package/fe/frontend/src/components/ThemeSwitch/index.js +3 -2
  73. package/fe/frontend/src/components/index.js +2 -2
  74. package/fe/frontend/src/defaultPages/NotFoundPage/index.js +4 -3
  75. package/fe/frontend/src/defaultPages/SchemaPage/components/CallCom/DetailPanel.js +14 -9
  76. package/fe/frontend/src/defaultPages/SchemaPage/components/CallCom/PopFrom.js +8 -7
  77. package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaSearch/index.js +20 -24
  78. package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaTable/PreviewImage.d.ts +10 -0
  79. package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaTable/PreviewImage.js +17 -0
  80. package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaTable/data.d.ts +5 -0
  81. package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaTable/data.js +8 -0
  82. package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaTable/index.js +50 -32
  83. package/fe/frontend/src/defaultPages/SchemaPage/index.css +0 -4
  84. package/fe/frontend/src/defaultPages/SchemaPage/index.js +5 -3
  85. package/fe/frontend/src/defaultPages/SlotPage/index.js +6 -3
  86. package/fe/frontend/src/hooks/useText.d.ts +3 -0
  87. package/fe/frontend/src/hooks/useText.js +14 -0
  88. package/fe/frontend/src/index.d.ts +11 -3
  89. package/fe/frontend/src/index.js +8 -3
  90. package/fe/frontend/src/language/index.d.ts +0 -2
  91. package/fe/frontend/src/language/index.js +1 -7
  92. package/fe/frontend/src/language/resources.d.ts +2 -0
  93. package/fe/frontend/src/language/resources.js +9 -0
  94. package/fe/model/types/data/schema.d.ts +24 -2
  95. package/fe/model/types/index.d.ts +1 -0
  96. package/fe/packages/common/i18n/default.js +3 -0
  97. package/fe/packages/common/i18n/en-US.js +5 -2
  98. package/fe/packages/common/i18n/index.js +13 -0
  99. package/fe/packages/common/i18n/locales.js +7 -0
  100. package/fe/packages/common/index.d.ts +1 -0
  101. package/fe/packages/common/rafTimer.d.ts +7 -0
  102. package/fe/packages/common/rafTimer.js +168 -0
  103. package/fe/packages/common/string/index.d.ts +9 -0
  104. package/fe/packages/react/hooks/index.d.ts +9 -0
  105. package/fe/packages/react/hooks/index.js +8 -0
  106. package/fe/packages/react/hooks/useRefState.d.ts +4 -12
  107. package/fe/packages/react/hooks/useRefState.js +18 -8
  108. package/fe/packages/react/ui/components/DataTable/dataTableWidth.d.ts +12 -0
  109. package/fe/packages/react/ui/components/DataTable/dataTableWidth.js +33 -0
  110. package/fe/packages/react/ui/components/DataTable/dataTableWidth.test.js +39 -0
  111. package/fe/packages/react/ui/components/DataTable/index.d.ts +1 -1
  112. package/fe/packages/react/ui/components/DataTable/index.js +12 -32
  113. package/fe/packages/react/ui/components/Textarea/Textarea.d.ts +1 -1
  114. package/fe/packages/react/ui/components/Textarea/Textarea.js +1 -1
  115. package/fe/packages/react/ui/components/types/baseType.d.ts +21 -0
  116. package/fe/packages/react/ui/components/types/baseType.js +0 -0
  117. package/model/frontend/src/common/language.d.ts +12 -1
  118. package/model/frontend/src/hooks/useText.d.ts +3 -0
  119. package/model/frontend/src/language/index.d.ts +0 -2
  120. package/model/frontend/src/language/resources.d.ts +2 -0
  121. package/model/model/types/data/schema.d.ts +24 -2
  122. package/model/model/types/index.d.ts +1 -0
  123. package/model/packages/common/index.d.ts +1 -0
  124. package/model/packages/common/rafTimer.d.ts +7 -0
  125. package/model/packages/common/string/index.d.ts +9 -0
  126. package/model/packages/react/ui/components/DataTable/dataTableWidth.d.ts +12 -0
  127. package/model/packages/react/ui/components/DataTable/index.d.ts +1 -1
  128. package/model/packages/react/ui/components/Textarea/Textarea.d.ts +1 -1
  129. package/model/packages/react/ui/components/types/baseType.d.ts +21 -0
  130. package/package.json +5 -5
  131. package/types/app/extends/localCacheHtmlEtag.d.ts +10 -0
  132. package/types/app/{extend → extends}/render-view.d.ts +1 -1
  133. package/types/app/service/base.d.ts +1 -1
  134. package/types/app/service/project.d.ts +1 -1
  135. package/types/app/type.d.ts +2 -1
  136. package/types/app/typings.d.ts +10 -8
  137. package/types/bundler/buildFE.d.ts +2 -0
  138. package/types/bundler/index.d.ts +1 -2
  139. package/types/bundler/state.d.ts +4 -0
  140. package/types/bundler/utils.d.ts +5 -0
  141. package/types/index.d.ts +3 -3
  142. package/types/packages/common/i18n/default.d.ts +4 -0
  143. package/types/packages/common/i18n/en-US.d.ts +6 -2
  144. package/types/packages/common/i18n/index.d.ts +21 -0
  145. package/types/packages/common/i18n/locales.d.ts +10 -0
  146. package/types/packages/common/i18n/types.d.ts +40 -0
  147. package/types/packages/common/index.d.ts +1 -0
  148. package/types/packages/common/rafTimer.d.ts +44 -0
  149. package/types/packages/common/string/index.d.ts +16 -0
  150. package/types/packages/core/loader/extend.d.ts +1 -1
  151. package/types/packages/core/types.d.ts +4 -0
  152. package/cjs/app/extend/render-view.js +0 -1
  153. package/esm/app/extend/render-view.js +0 -25
  154. /package/cjs/app/{extend → extends}/$fetch.js +0 -0
  155. /package/cjs/app/{extend → extends}/crypto.js +0 -0
  156. /package/cjs/app/{extend → extends}/generateErrorMessage.js +0 -0
  157. /package/cjs/app/{extend → extends}/logger.js +0 -0
  158. /package/cjs/app/{extend → extends}/parsingParamsOnUrl.js +0 -0
  159. /package/types/app/{extend → extends}/$fetch.d.ts +0 -0
  160. /package/types/app/{extend → extends}/crypto.d.ts +0 -0
  161. /package/types/app/{extend → extends}/db.d.ts +0 -0
  162. /package/types/app/{extend → extends}/generateErrorMessage.d.ts +0 -0
  163. /package/types/app/{extend → extends}/logger.d.ts +0 -0
  164. /package/types/app/{extend → extends}/parsingParamsOnUrl.d.ts +0 -0
@@ -1,16 +1,16 @@
1
- import { getAppPaths as e } from "../paths.js";
2
- import { resolve as t } from "../../utils/path.js";
3
- import { loadFileFn as n } from "../../utils/loadFile.js";
4
- import { runFileFn as r } from "../../utils/runFileFn.js";
1
+ import { resolve as e } from "../../utils/path.js";
2
+ import { loadFileFn as t } from "../../utils/loadFile.js";
3
+ import { runFileFn as n } from "../../utils/runFileFn.js";
5
4
  import "../../utils/index.js";
5
+ import { getAppPaths as r } from "../paths.js";
6
6
  //#region packages/core/loader/router-schema.ts
7
7
  var i = (i) => {
8
8
  let a = {};
9
- e(i).forEach((e) => {
10
- n(e, "router-schema", { preProcessingFileCallback(e) {
9
+ r(i).forEach((r) => {
10
+ t(r, "router-schema", { preProcessingFileCallback(t) {
11
11
  a = {
12
12
  ...a,
13
- ...r(t(e))
13
+ ...n(e(t))
14
14
  };
15
15
  } });
16
16
  }), i.routerSchema = a;
@@ -1,26 +1,26 @@
1
- import { getAppPath as e, getAppPaths as t } from "../paths.js";
2
- import { resolve as n } from "../../utils/path.js";
3
- import { loadFileFn as r } from "../../utils/loadFile.js";
4
- import { runFileFn as i } from "../../utils/runFileFn.js";
1
+ import { resolve as e } from "../../utils/path.js";
2
+ import { loadFileFn as t } from "../../utils/loadFile.js";
3
+ import { runFileFn as n } from "../../utils/runFileFn.js";
5
4
  import "../../utils/index.js";
5
+ import { getAppPath as r, getAppPaths as i } from "../paths.js";
6
6
  import { existsSync as a } from "fs";
7
7
  import o from "koa-router";
8
8
  //#region packages/core/loader/router.ts
9
9
  var s = (s) => {
10
- let c, l = e(s, "business");
11
- if (l) for (let e of ["router-guard.ts", "router-guard.js"]) {
12
- let t = n(l, e);
13
- if (a(t)) {
14
- c = i(t)(s);
10
+ let c, l = r(s, "business");
11
+ if (l) for (let t of ["router-guard.ts", "router-guard.js"]) {
12
+ let r = e(l, t);
13
+ if (a(r)) {
14
+ c = n(r)(s);
15
15
  break;
16
16
  }
17
17
  }
18
18
  c || console.info("-- [router-guard] -- not router-guard.(ts|js) file");
19
19
  let u = [];
20
- t(s).forEach((e) => {
21
- r(e, "router", { preProcessingFileCallback: (e) => {
22
- let t = new o();
23
- t.level = 0, u.push(t), i(n(e))(s, t);
20
+ i(s).forEach((r) => {
21
+ t(r, "router", { preProcessingFileCallback: (t) => {
22
+ let r = new o();
23
+ r.level = 0, u.push(r), n(e(t))(s, r);
24
24
  } });
25
25
  });
26
26
  let d = new o();
@@ -1,12 +1,12 @@
1
- import { getAppPaths as e } from "../paths.js";
2
- import { loadFileFn as t } from "../../utils/loadFile.js";
3
- import { runFileFn as n } from "../../utils/runFileFn.js";
1
+ import { loadFileFn as e } from "../../utils/loadFile.js";
2
+ import { runFileFn as t } from "../../utils/runFileFn.js";
4
3
  import "../../utils/index.js";
4
+ import { getAppPaths as n } from "../paths.js";
5
5
  //#region packages/core/loader/service.ts
6
6
  var r = (r) => {
7
- r.service = e(r).reduce((e, i) => ({
8
- ...e,
9
- ...t(i, "service", { loadFileCallback: (e) => new (n(e)(r))() })
7
+ r.service = n(r).reduce((n, i) => ({
8
+ ...n,
9
+ ...e(i, "service", { loadFileCallback: (e) => new (t(e)(r))() })
10
10
  }), {});
11
11
  };
12
12
  //#endregion
@@ -1,6 +1,6 @@
1
1
  import { __require as e } from "../../_virtual/_rolldown/runtime.js";
2
- import { extname as t } from "path";
3
- import { readFileSync as n } from "fs";
2
+ import { readFileSync as t } from "fs";
3
+ import { extname as n } from "path";
4
4
  //#region packages/utils/runFileFn.ts
5
5
  var r = !1;
6
6
  function i(e) {
@@ -9,12 +9,12 @@ function i(e) {
9
9
  function a(e) {
10
10
  return e && typeof e == "object" && "default" in e && e.default !== void 0 ? e.default : e;
11
11
  }
12
- function o(n) {
12
+ function o(t) {
13
13
  try {
14
- return e(n);
14
+ return e(t);
15
15
  } catch (r) {
16
- if (t(n) !== ".ts" || !s(r)) throw r;
17
- return c(), delete e.cache[e.resolve(n)], e(n);
16
+ if (n(t) !== ".ts" || !s(r)) throw r;
17
+ return c(), delete e.cache[e.resolve(t)], e(t);
18
18
  }
19
19
  }
20
20
  function s(e) {
@@ -23,11 +23,11 @@ function s(e) {
23
23
  }
24
24
  function c() {
25
25
  if (r) return;
26
- let t = l();
26
+ let n = l();
27
27
  e.extensions[".ts"] = (e, r) => {
28
- let { outputText: i } = t.transpileModule(n(r, "utf8"), { compilerOptions: {
29
- module: t.ModuleKind.CommonJS,
30
- target: t.ScriptTarget.ES2020,
28
+ let { outputText: i } = n.transpileModule(t(r, "utf8"), { compilerOptions: {
29
+ module: n.ModuleKind.CommonJS,
30
+ target: n.ScriptTarget.ES2020,
31
31
  esModuleInterop: !0,
32
32
  allowSyntheticDefaultImports: !0
33
33
  } });
@@ -1,10 +1,10 @@
1
1
  import { getAuthToken } from "../../src/common/auth/index.js";
2
- import { getText } from "../../src/common/language.js";
3
2
  import { generateMenuItemData } from "../../src/common/generateMenuData.js";
4
3
  import { Menu } from "../../../packages/react/ui/components/Menu/Menu.js";
5
4
  import "../../../packages/react/ui/components/index.js";
6
5
  import { useModeStore } from "../../src/stores/mode.js";
7
6
  import { findMenuItem, leftSidebarBasePath } from "../../src/common/menu.js";
7
+ import { useText } from "../../src/hooks/useText.js";
8
8
  import HeaderView from "../../src/components/BasePage/HeaderView.js";
9
9
  import useRouterParams from "../../src/hooks/useRouterParams.js";
10
10
  import useInit from "../../../packages/react/hooks/useInit.js";
@@ -83,6 +83,7 @@ var getRenderableHomePage = (projectInfo) => {
83
83
  var Dashboard = () => {
84
84
  const { initModeData, initData, projectInfo } = useModeStore();
85
85
  const HeaderUserArea = dashComponents["HeaderView.userArea"];
86
+ const text = useText();
86
87
  useInit(() => {
87
88
  !initData && initModeData();
88
89
  });
@@ -94,7 +95,7 @@ var Dashboard = () => {
94
95
  if (initData && projectInfo?.menuLayout === "top") return /* @__PURE__ */ jsx(Menu, {
95
96
  className: " w-full",
96
97
  mode: "top",
97
- items: generateMenuItemData(projectInfo.menu),
98
+ items: generateMenuItemData(projectInfo.menu, text),
98
99
  selectedKey: SK,
99
100
  onSelect: (e) => {
100
101
  uSK(e);
@@ -107,7 +108,8 @@ var Dashboard = () => {
107
108
  initData,
108
109
  projectInfo,
109
110
  SK,
110
- nav
111
+ nav,
112
+ text
111
113
  ]);
112
114
  useEffect(() => {
113
115
  if (initData && projectInfo) {
@@ -165,7 +167,7 @@ var Dashboard = () => {
165
167
  const getTitle = () => {
166
168
  const title = projectInfo?.desc ?? projectInfo?.name;
167
169
  if (!isInit.current && title) document.title = projectInfo?.name ?? title;
168
- return title ? getText(title) : void 0;
170
+ return title ? text(title) : void 0;
169
171
  };
170
172
  return /* @__PURE__ */ jsxs("div", {
171
173
  className: "dash-main h-screen flex flex-col overflow-hidden bg-theme-bg text-foreground",
@@ -1,6 +1,8 @@
1
+ import { registerFrontendI18nResources } from "../../src/common/language.js";
1
2
  import { QK, leftSidebarBasePath } from "../../src/common/menu.js";
2
3
  import Dashboard from "./Dashboard.js";
3
4
  import { renderImportComponent } from "../../src/common/importComponent.js";
5
+ import { initThemeMode } from "../../src/common/theme.js";
4
6
  import { initApp } from "../../src/main.js";
5
7
  import { jsx } from "react/jsx-runtime";
6
8
  import extendDashRoutes from "@tc/scalability/dash/customRoutes";
@@ -54,6 +56,8 @@ initApp(({ children }) => /* @__PURE__ */ jsx("div", {
54
56
  }), {
55
57
  routes: getDefaultPageRoutes(),
56
58
  beforeRender: async (context) => {
59
+ await registerFrontendI18nResources();
60
+ initThemeMode();
57
61
  if (typeof initDash === "function") await initDash(context);
58
62
  }
59
63
  });
@@ -1,3 +1,6 @@
1
1
  import type { ProjectInfo } from "../api/baseInfo";
2
2
  import type { MenuItemData } from "../../../packages/react/ui/components/index";
3
- export declare const generateMenuItemData: (data: ProjectInfo["menu"]) => MenuItemData[];
3
+ import { getText } from "./language";
4
+ type TextResolver = typeof getText;
5
+ export declare const generateMenuItemData: (data: ProjectInfo["menu"], text?: TextResolver) => MenuItemData[];
6
+ export {};
@@ -1,11 +1,11 @@
1
1
  import { getText } from "./language.js";
2
2
  //#region frontend/src/common/generateMenuData.ts
3
- var generateMenuItemData = (data) => {
3
+ var generateMenuItemData = (data, text = getText) => {
4
4
  return data.map((m) => {
5
- const children = m.menuType === "group" && m.subMenu.length ? generateMenuItemData(m.subMenu) : void 0;
5
+ const children = m.menuType === "group" && m.subMenu.length ? generateMenuItemData(m.subMenu, text) : void 0;
6
6
  return {
7
7
  key: m.key,
8
- label: getText(m.name),
8
+ label: text(m.name),
9
9
  icon: m.icon,
10
10
  children,
11
11
  minWidth: 100
@@ -1,2 +1,13 @@
1
- import type { I18nInterpolationValues, I18nTranslateOptions } from "../../../packages/react/ui/i18n/index";
1
+ import type { I18nAddResourcesOptions, I18nDictionary, I18nInterpolationValues, I18nLanguage, I18nResources, I18nSetResourcesOptions, I18nTranslateOptions } from "../../../packages/react/ui/i18n/index";
2
+ export declare const addLanguageResources: (language: I18nLanguage, messages: I18nDictionary, options?: I18nAddResourcesOptions) => void;
3
+ export declare const setLanguage: (language: I18nLanguage) => void;
4
+ export declare const setFallbackLanguage: (language: I18nLanguage) => void;
5
+ export declare const setResources: (resources: I18nResources, options?: I18nSetResourcesOptions) => void;
6
+ export declare const getCurrentLanguage: () => string;
7
+ export declare const getFallbackLanguage: () => string;
8
+ export declare const getI18nResources: () => Partial<Record<string, I18nDictionary>>;
9
+ export declare const getSupportedLanguages: () => string[];
10
+ export declare const registerFrontendI18nResources: (resources?: I18nResources) => Promise<void>;
2
11
  export declare const getText: (key: string, fillingData?: I18nInterpolationValues, options?: I18nTranslateOptions) => string;
12
+ export declare const t: <T = string>(key: string, fillingData?: I18nInterpolationValues, options?: I18nTranslateOptions) => string | T;
13
+ export type { I18nAddResourcesOptions, I18nDictionary, I18nInterpolationValues, I18nLanguage, I18nResources, I18nSetResourcesOptions, I18nTranslateOptions, };
@@ -1,12 +1,33 @@
1
- import { frontendI18nResources, i18nKeyPrefix } from "../language/index.js";
1
+ import { i18nKeyPrefix } from "../language/index.js";
2
2
  import { i18n, i18nStore } from "../../../packages/common/i18n/index.js";
3
3
  import "../../../packages/react/ui/i18n/index.js";
4
4
  //#region frontend/src/common/language.ts
5
- i18nStore.getState().addResources("zh-CN", frontendI18nResources["zh-CN"] ?? {});
6
- i18nStore.getState().addResources("en-US", frontendI18nResources["en-US"] ?? {});
5
+ var addLanguageResources = (language, messages, options) => {
6
+ i18nStore.getState().addResources(language, messages, options);
7
+ };
8
+ var setLanguage = (language) => {
9
+ i18nStore.getState().setLanguage(language);
10
+ };
11
+ var setFallbackLanguage = (language) => {
12
+ i18nStore.getState().setFallbackLanguage(language);
13
+ };
14
+ var setResources = (resources, options) => {
15
+ i18nStore.getState().setResources(resources, options);
16
+ };
17
+ var getCurrentLanguage = () => i18nStore.getState().language;
18
+ var getFallbackLanguage = () => i18nStore.getState().fallbackLanguage;
19
+ var getI18nResources = () => i18nStore.getState().resources;
20
+ var getSupportedLanguages = () => Object.keys(getI18nResources());
21
+ var registerFrontendI18nResources = async (resources) => {
22
+ const nextResources = resources ?? (await import("../language/resources.js")).frontendI18nResources;
23
+ Object.entries(nextResources).forEach(([language, messages]) => {
24
+ addLanguageResources(language, messages ?? {});
25
+ });
26
+ };
7
27
  var getText = (key, fillingData, options) => {
8
28
  if (key.includes("$i18n::")) return i18n(key.replace(i18nKeyPrefix, ""), fillingData, options);
9
29
  return key;
10
30
  };
31
+ var t = i18n;
11
32
  //#endregion
12
- export { getText };
33
+ export { addLanguageResources, getCurrentLanguage, getFallbackLanguage, getI18nResources, getSupportedLanguages, getText, registerFrontendI18nResources, setFallbackLanguage, setLanguage, setResources, t };
@@ -0,0 +1 @@
1
+ export * from "../../../packages/common/rafTimer";
@@ -0,0 +1,2 @@
1
+ import { clearRafTimer, rafClearInterval, rafClearTimeout, rafSetInterval, rafSetTimeout } from "../../../packages/common/rafTimer.js";
2
+ export { clearRafTimer, rafClearInterval, rafClearTimeout, rafSetInterval, rafSetTimeout };
@@ -100,6 +100,7 @@ api.interceptors.request.use(async (config) => {
100
100
  const aauto = getApiAuth();
101
101
  const time = (/* @__PURE__ */ new Date()).getTime();
102
102
  config.headers = {
103
+ "Content-Type": "application/json",
103
104
  ...config.headers,
104
105
  s_t: time + "",
105
106
  s_sign: md5(`${window["_signKey"]}_${time}`),
@@ -0,0 +1,7 @@
1
+ export type ThemeSwitchMode = 'light' | 'dark';
2
+ export declare const themeSwitchStorageKey = "tc_theme";
3
+ export declare const getStoredThemeMode: (storageKey?: string) => ThemeSwitchMode | null;
4
+ export declare const getCurrentThemeMode: (defaultValue?: ThemeSwitchMode, storageKey?: string) => ThemeSwitchMode;
5
+ export declare const persistThemeMode: (mode: ThemeSwitchMode, storageKey?: string) => void;
6
+ export declare const applyThemeMode: (mode?: ThemeSwitchMode, persist?: boolean, storageKey?: string) => void;
7
+ export declare const initThemeMode: (defaultValue?: ThemeSwitchMode, storageKey?: string) => ThemeSwitchMode;
@@ -0,0 +1,33 @@
1
+ //#region frontend/src/common/theme.ts
2
+ var themeSwitchStorageKey = "tc_theme";
3
+ var canUseDocument = () => typeof document !== "undefined";
4
+ var canUseLocalStorage = () => typeof localStorage !== "undefined";
5
+ var getStoredThemeMode = (storageKey = themeSwitchStorageKey) => {
6
+ if (!canUseLocalStorage()) return null;
7
+ const value = localStorage.getItem(storageKey);
8
+ return value === "light" || value === "dark" ? value : null;
9
+ };
10
+ var getCurrentThemeMode = (defaultValue, storageKey = themeSwitchStorageKey) => {
11
+ const storedMode = getStoredThemeMode(storageKey);
12
+ if (storedMode) return storedMode;
13
+ if (defaultValue) return defaultValue;
14
+ if (!canUseDocument()) return "light";
15
+ return document.documentElement.classList.contains("dark") ? "dark" : "light";
16
+ };
17
+ var persistThemeMode = (mode, storageKey = themeSwitchStorageKey) => {
18
+ if (canUseLocalStorage()) localStorage.setItem(storageKey, mode);
19
+ };
20
+ var applyThemeMode = (mode = getCurrentThemeMode(), persist = false, storageKey = themeSwitchStorageKey) => {
21
+ if (!canUseDocument()) return;
22
+ const root = document.documentElement;
23
+ root.classList.toggle("dark", mode === "dark");
24
+ root.style.colorScheme = mode;
25
+ if (persist) persistThemeMode(mode, storageKey);
26
+ };
27
+ var initThemeMode = (defaultValue, storageKey = themeSwitchStorageKey) => {
28
+ const mode = getCurrentThemeMode(defaultValue, storageKey);
29
+ applyThemeMode(mode, false, storageKey);
30
+ return mode;
31
+ };
32
+ //#endregion
33
+ export { applyThemeMode, getCurrentThemeMode, getStoredThemeMode, initThemeMode, persistThemeMode, themeSwitchStorageKey };
@@ -1,7 +1,7 @@
1
1
  import { frontendLangKeys } from "../../language/index.js";
2
- import { getText } from "../../common/language.js";
3
2
  import { cn } from "../../../../packages/react/ui/lib/utils.js";
4
3
  import "../../../../packages/react/ui/index.js";
4
+ import { useText } from "../../hooks/useText.js";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  import { Boxes } from "lucide-react";
7
7
  //#region frontend/src/components/BasePage/HeaderView.tsx
@@ -14,7 +14,7 @@ var headerThemeStyle = {
14
14
  var imageLogoPattern = /^(https?:\/\/|data:image\/|\/|\.\/|\.\.\/|.*\.(svg|png|jpe?g|webp|gif)$)/i;
15
15
  var HeaderView = (props) => {
16
16
  const { icon, title, menu, userArea, children } = props ?? defaultProps;
17
- const defaultTitle = getText(frontendLangKeys.appTitle);
17
+ const defaultTitle = useText()(frontendLangKeys.appTitle);
18
18
  const brandLogo = icon ? typeof icon === "string" ? imageLogoPattern.test(icon) ? /* @__PURE__ */ jsx("img", {
19
19
  className: "h-full max-w-[112px] object-contain",
20
20
  src: icon,
@@ -2,31 +2,47 @@ import { frontendLangKeys } from "../../language/index.js";
2
2
  import { i18nStore } from "../../../../packages/common/i18n/index.js";
3
3
  import { useI18nStore } from "../../../../packages/react/ui/i18n/useI18n.js";
4
4
  import "../../../../packages/react/ui/i18n/index.js";
5
- import { getText } from "../../common/language.js";
5
+ import { getSupportedLanguages } from "../../common/language.js";
6
6
  import { cn } from "../../../../packages/react/ui/lib/utils.js";
7
7
  import { Button } from "../../../../packages/react/ui/components/Button/Button.js";
8
8
  import { Dropdown } from "../../../../packages/react/ui/components/Dropdown/Dropdown.js";
9
9
  import "../../../../packages/react/ui/index.js";
10
+ import { useText } from "../../hooks/useText.js";
10
11
  import { useCallback, useMemo, useRef } from "react";
11
12
  import { jsx, jsxs } from "react/jsx-runtime";
12
13
  import { Check, ChevronDown } from "lucide-react";
13
14
  //#region frontend/src/components/LanguageSwitch/LanguageSwitch.tsx
14
- var getDefaultLanguageOptions = () => [{
15
- label: getText(frontendLangKeys.languageSwitchZhCN),
15
+ var getDefaultLanguageOptions = (text) => [{
16
+ label: text(frontendLangKeys.languageSwitchZhCN),
16
17
  value: "zh-CN",
17
18
  searchText: "zh-CN 中文 简体中文"
18
19
  }, {
19
- label: getText(frontendLangKeys.languageSwitchEnUS),
20
+ label: text(frontendLangKeys.languageSwitchEnUS),
20
21
  value: "en-US",
21
22
  searchText: "en-US English"
22
23
  }];
24
+ var getLanguageOptions = (text) => {
25
+ const baseOptions = getDefaultLanguageOptions(text);
26
+ const seen = new Set(baseOptions.map((option) => option.value));
27
+ return [...baseOptions, ...getSupportedLanguages().filter((language) => !seen.has(language)).map((language) => ({
28
+ label: language,
29
+ value: language,
30
+ searchText: language
31
+ }))];
32
+ };
23
33
  var LanguageSwitch = ({ value, defaultValue, options, onChange, className, buttonClassName, placeholder, disabled, loading, clearable: _clearable, searchable: _searchable, placement = "bottom-end", getPopupContainer = "parent", ...props }) => {
24
34
  const rootRef = useRef(null);
35
+ const text = useText();
25
36
  const currentLanguage = useI18nStore((state) => state.language);
26
- const mergedOptions = useMemo(() => options ?? getDefaultLanguageOptions(), [currentLanguage, options]);
37
+ const mergedOptions = useMemo(() => options ?? getLanguageOptions(text), [
38
+ currentLanguage,
39
+ options,
40
+ useI18nStore((state) => state.resources),
41
+ text
42
+ ]);
27
43
  const selectedLanguage = value ?? currentLanguage ?? defaultValue;
28
44
  const selectedOption = mergedOptions.find((option) => option.value === selectedLanguage);
29
- const displayText = selectedOption?.label ?? placeholder ?? getText(frontendLangKeys.languageSwitchPlaceholder);
45
+ const displayText = selectedOption?.label ?? placeholder ?? text(frontendLangKeys.languageSwitchPlaceholder);
30
46
  const handleChange = useCallback((language) => {
31
47
  if (!language) return;
32
48
  const nextLanguage = String(language);
@@ -1,4 +1,6 @@
1
- export type ThemeSwitchMode = 'light' | 'dark';
1
+ import { type ThemeSwitchMode } from "../../common/theme";
2
+ export { applyThemeMode, themeSwitchStorageKey } from "../../common/theme";
3
+ export type { ThemeSwitchMode } from "../../common/theme";
2
4
  export interface ThemeSwitchProps {
3
5
  value?: ThemeSwitchMode;
4
6
  defaultValue?: ThemeSwitchMode;
@@ -9,6 +11,5 @@ export interface ThemeSwitchProps {
9
11
  persist?: boolean;
10
12
  storageKey?: string;
11
13
  }
12
- export declare const themeSwitchStorageKey = "tc_theme";
13
14
  declare const ThemeSwitch: ({ value, defaultValue, onChange, disabled, className, showLabel, persist, storageKey, }: ThemeSwitchProps) => import("react/jsx-runtime").JSX.Element;
14
15
  export default ThemeSwitch;
@@ -1,41 +1,18 @@
1
1
  import { frontendLangKeys } from "../../language/index.js";
2
2
  import { useI18nStore } from "../../../../packages/react/ui/i18n/useI18n.js";
3
3
  import "../../../../packages/react/ui/i18n/index.js";
4
- import { getText } from "../../common/language.js";
5
4
  import { cn } from "../../../../packages/react/ui/lib/utils.js";
6
5
  import { Switch } from "../../../../packages/react/ui/components/Switch/Switch.js";
7
6
  import { Tooltip } from "../../../../packages/react/ui/components/Tooltip/Tooltip.js";
8
7
  import "../../../../packages/react/ui/index.js";
8
+ import { useText } from "../../hooks/useText.js";
9
+ import { applyThemeMode, getCurrentThemeMode, persistThemeMode, themeSwitchStorageKey } from "../../common/theme.js";
9
10
  import { useEffect, useState } from "react";
10
11
  import { jsx, jsxs } from "react/jsx-runtime";
11
12
  import { Moon, Sun } from "lucide-react";
12
13
  //#region frontend/src/components/ThemeSwitch/ThemeSwitch.tsx
13
- var themeSwitchStorageKey = "tc_theme";
14
- var canUseDocument = () => typeof document !== "undefined";
15
- var canUseLocalStorage = () => typeof localStorage !== "undefined";
16
- var getStoredThemeMode = (storageKey) => {
17
- if (!canUseLocalStorage()) return null;
18
- const value = localStorage.getItem(storageKey);
19
- return value === "light" || value === "dark" ? value : null;
20
- };
21
- var getCurrentThemeMode = (defaultValue, storageKey = themeSwitchStorageKey) => {
22
- const storedMode = getStoredThemeMode(storageKey);
23
- if (storedMode) return storedMode;
24
- if (defaultValue) return defaultValue;
25
- if (!canUseDocument()) return "light";
26
- return document.documentElement.classList.contains("dark") ? "dark" : "light";
27
- };
28
- var persistThemeMode = (mode, storageKey) => {
29
- if (canUseLocalStorage()) localStorage.setItem(storageKey, mode);
30
- };
31
- var applyThemeMode = (mode, persist, storageKey) => {
32
- if (!canUseDocument()) return;
33
- const root = document.documentElement;
34
- root.classList.toggle("dark", mode === "dark");
35
- root.style.colorScheme = mode;
36
- if (persist) persistThemeMode(mode, storageKey);
37
- };
38
14
  var ThemeSwitch = ({ value, defaultValue, onChange, disabled, className, showLabel = false, persist = true, storageKey = themeSwitchStorageKey }) => {
15
+ const text = useText();
39
16
  useI18nStore((state) => state.language);
40
17
  const [internalMode, setInternalMode] = useState(() => getCurrentThemeMode(defaultValue, storageKey));
41
18
  const isControlled = value !== void 0;
@@ -54,8 +31,8 @@ var ThemeSwitch = ({ value, defaultValue, onChange, disabled, className, showLab
54
31
  if (persist) persistThemeMode(nextMode, storageKey);
55
32
  onChange?.(nextMode);
56
33
  };
57
- const label = mode === "dark" ? getText(frontendLangKeys.themeSwitchDark) : getText(frontendLangKeys.themeSwitchLight);
58
- const tooltip = checked ? getText(frontendLangKeys.themeSwitchToLight) : getText(frontendLangKeys.themeSwitchToDark);
34
+ const label = mode === "dark" ? text(frontendLangKeys.themeSwitchDark) : text(frontendLangKeys.themeSwitchLight);
35
+ const tooltip = checked ? text(frontendLangKeys.themeSwitchToLight) : text(frontendLangKeys.themeSwitchToDark);
59
36
  return /* @__PURE__ */ jsxs("div", {
60
37
  className: cn("inline-flex shrink-0 items-center gap-2 text-foreground", className),
61
38
  children: [
@@ -84,4 +61,4 @@ var ThemeSwitch = ({ value, defaultValue, onChange, disabled, className, showLab
84
61
  });
85
62
  };
86
63
  //#endregion
87
- export { ThemeSwitch as default, themeSwitchStorageKey };
64
+ export { applyThemeMode, ThemeSwitch as default, themeSwitchStorageKey };
@@ -1,3 +1,4 @@
1
1
  import ThemeSwitch from "./ThemeSwitch";
2
2
  export * from "./ThemeSwitch";
3
+ export * from "../../common/theme";
3
4
  export default ThemeSwitch;
@@ -1,5 +1,6 @@
1
- import ThemeSwitch, { themeSwitchStorageKey } from "./ThemeSwitch.js";
1
+ import { applyThemeMode, getCurrentThemeMode, getStoredThemeMode, initThemeMode, persistThemeMode, themeSwitchStorageKey } from "../../common/theme.js";
2
+ import ThemeSwitch from "./ThemeSwitch.js";
2
3
  //#region frontend/src/components/ThemeSwitch/index.ts
3
4
  var ThemeSwitch_default = ThemeSwitch;
4
5
  //#endregion
5
- export { ThemeSwitch_default as default, themeSwitchStorageKey };
6
+ export { applyThemeMode, ThemeSwitch_default as default, getCurrentThemeMode, getStoredThemeMode, initThemeMode, persistThemeMode, themeSwitchStorageKey };
@@ -1,7 +1,7 @@
1
1
  import HeaderView from "./BasePage/HeaderView.js";
2
+ import { applyThemeMode, getCurrentThemeMode, getStoredThemeMode, initThemeMode, persistThemeMode, themeSwitchStorageKey } from "../common/theme.js";
2
3
  import { generateRouter } from "./Router/index.js";
3
4
  import AsyncSelect_default from "./AsyncSelect/index.js";
4
5
  import LanguageSwitch_default from "./LanguageSwitch/index.js";
5
- import { themeSwitchStorageKey } from "./ThemeSwitch/ThemeSwitch.js";
6
6
  import ThemeSwitch_default from "./ThemeSwitch/index.js";
7
- export { AsyncSelect_default as AsyncSelect, HeaderView, LanguageSwitch_default as LanguageSwitch, ThemeSwitch_default as ThemeSwitch, generateRouter, themeSwitchStorageKey };
7
+ export { AsyncSelect_default as AsyncSelect, HeaderView, LanguageSwitch_default as LanguageSwitch, ThemeSwitch_default as ThemeSwitch, applyThemeMode, generateRouter, getCurrentThemeMode, getStoredThemeMode, initThemeMode, persistThemeMode, themeSwitchStorageKey };
@@ -1,8 +1,9 @@
1
1
  import { frontendLangKeys } from "../../language/index.js";
2
- import { getText } from "../../common/language.js";
2
+ import { useText } from "../../hooks/useText.js";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
4
  //#region frontend/src/defaultPages/NotFoundPage/index.tsx
5
5
  var NotFoundPage = () => {
6
+ const text = useText();
6
7
  return /* @__PURE__ */ jsx("div", {
7
8
  className: "flex h-full min-h-[240px] w-full items-center justify-center bg-theme-bg px-6 text-foreground",
8
9
  children: /* @__PURE__ */ jsxs("div", {
@@ -14,11 +15,11 @@ var NotFoundPage = () => {
14
15
  }),
15
16
  /* @__PURE__ */ jsx("h1", {
16
17
  className: "text-lg font-semibold tracking-normal",
17
- children: getText(frontendLangKeys.notFoundTitle)
18
+ children: text(frontendLangKeys.notFoundTitle)
18
19
  }),
19
20
  /* @__PURE__ */ jsx("p", {
20
21
  className: "mt-2 text-sm leading-6 text-muted-foreground",
21
- children: getText(frontendLangKeys.notFoundDescription)
22
+ children: text(frontendLangKeys.notFoundDescription)
22
23
  })
23
24
  ]
24
25
  })
@@ -1,8 +1,8 @@
1
1
  import { frontendLangKeys } from "../../../../language/index.js";
2
- import { getText } from "../../../../common/language.js";
3
2
  import { Drawer } from "../../../../../../packages/react/ui/components/Drawer/Drawer.js";
4
3
  import "../../../../../../packages/react/ui/components/index.js";
5
4
  import { request } from "../../../../common/request.js";
5
+ import { useText } from "../../../../hooks/useText.js";
6
6
  import { schemaEventBus } from "../../../../stores/schemaEventBus.js";
7
7
  import { handlingRequestErrors } from "../../../../common/fetchErrorShow.js";
8
8
  import useExecuteOnce from "../../../../../../packages/react/hooks/useExecuteOnce.js";
@@ -28,7 +28,7 @@ var getOptionLabel = (options, value) => {
28
28
  if (!matchedOption || typeof matchedOption !== "object") return void 0;
29
29
  return matchedOption.label ?? stringifyValue(value);
30
30
  };
31
- var formatValue = (value, fieldInfo) => {
31
+ var formatValue = (value, fieldInfo, text) => {
32
32
  if (isEmptyValue(value)) return EMPTY_TEXT;
33
33
  const option = fieldInfo.option;
34
34
  const optionLabel = getOptionLabel(option?.options ?? option?.enumList, value);
@@ -39,28 +39,33 @@ var formatValue = (value, fieldInfo) => {
39
39
  return stringifyValue(item);
40
40
  }).join(", ");
41
41
  }
42
- if (typeof value === "boolean") return value ? getText(frontendLangKeys.yes) : getText(frontendLangKeys.no);
42
+ if (typeof value === "boolean") return value ? text(frontendLangKeys.yes) : text(frontendLangKeys.no);
43
43
  return stringifyValue(value);
44
44
  };
45
- var generateFields = (schema, data) => {
45
+ var generateFields = (schema, data, text) => {
46
46
  if (!schema?.properties) return [];
47
47
  return Object.keys(schema.properties).reduce((fields, key) => {
48
48
  const fieldInfo = schema.properties[key];
49
49
  if (!fieldInfo?.option || fieldInfo.option.visible === false) return fields;
50
50
  fields.push({
51
51
  key,
52
- label: getText(fieldInfo.label),
53
- value: formatValue(data?.[key], fieldInfo),
52
+ label: text(fieldInfo.label),
53
+ value: formatValue(data?.[key], fieldInfo, text),
54
54
  level: fieldInfo.level ?? 10
55
55
  });
56
56
  return fields;
57
57
  }, []).sort((a, b) => a.level - b.level);
58
58
  };
59
59
  var DetailPanel = memo((props) => {
60
+ const text = useText();
60
61
  const [open, setOpen] = useState(true);
61
62
  const [data, setData] = useState(props.data);
62
63
  const { config, schema, api } = useComConfig({ comName: props.comName });
63
- const fields = useMemo(() => generateFields(schema, data), [data, schema]);
64
+ const fields = useMemo(() => generateFields(schema, data, text), [
65
+ data,
66
+ schema,
67
+ text
68
+ ]);
64
69
  useExecuteOnce(async () => {
65
70
  const fetchKey = config?.fetchKey;
66
71
  if (fetchKey) {
@@ -73,7 +78,7 @@ var DetailPanel = memo((props) => {
73
78
  return /* @__PURE__ */ jsx("div", {
74
79
  className: "detail-panel",
75
80
  children: /* @__PURE__ */ jsx(Drawer, {
76
- title: getText(config?.title ?? ""),
81
+ title: text(config?.title ?? ""),
77
82
  open,
78
83
  onClose: () => {
79
84
  setOpen(false);
@@ -93,7 +98,7 @@ var DetailPanel = memo((props) => {
93
98
  }, field.key))
94
99
  }) : /* @__PURE__ */ jsx("div", {
95
100
  className: "py-8 text-center text-sm text-muted-foreground",
96
- children: getText(frontendLangKeys.noData)
101
+ children: text(frontendLangKeys.noData)
97
102
  })
98
103
  })
99
104
  });