@_tc/template-core 0.2.0-bate.1 → 0.2.0-bate.11

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 (98) hide show
  1. package/.skills/tc-generator/reference/model-schema.md +18 -0
  2. package/.skills/tc-generator/reference/runtime-extensions.md +20 -0
  3. package/AGENT_README.md +29 -11
  4. package/README.md +222 -27
  5. package/cjs/app/controller/view.js +1 -1
  6. package/cjs/bundler/buildFE.js +1 -0
  7. package/cjs/bundler/index.js +1 -1
  8. package/cjs/bundler/utils.js +1 -1
  9. package/cjs/packages/common/index.js +1 -1
  10. package/cjs/packages/common/rafTimer.js +1 -0
  11. package/esm/app/controller/view.js +4 -1
  12. package/esm/bundler/buildFE.js +14 -0
  13. package/esm/bundler/index.js +3 -15
  14. package/esm/bundler/utils.js +1 -0
  15. package/esm/packages/common/index.js +3 -2
  16. package/esm/packages/common/rafTimer.js +47 -0
  17. package/fe/frontend/apps/dash/Dashboard.js +6 -4
  18. package/fe/frontend/apps/dash/dash.entry.js +4 -0
  19. package/fe/frontend/src/common/generateMenuData.d.ts +4 -1
  20. package/fe/frontend/src/common/generateMenuData.js +3 -3
  21. package/fe/frontend/src/common/language.d.ts +12 -1
  22. package/fe/frontend/src/common/language.js +27 -6
  23. package/fe/frontend/src/common/rafTimer.d.ts +1 -0
  24. package/fe/frontend/src/common/rafTimer.js +2 -0
  25. package/fe/frontend/src/common/request.js +1 -0
  26. package/fe/frontend/src/common/theme.d.ts +7 -0
  27. package/fe/frontend/src/common/theme.js +33 -0
  28. package/fe/frontend/src/components/BasePage/HeaderView.js +2 -2
  29. package/fe/frontend/src/components/LanguageSwitch/LanguageSwitch.js +22 -6
  30. package/fe/frontend/src/components/ThemeSwitch/ThemeSwitch.d.ts +3 -2
  31. package/fe/frontend/src/components/ThemeSwitch/ThemeSwitch.js +6 -29
  32. package/fe/frontend/src/components/ThemeSwitch/index.d.ts +1 -0
  33. package/fe/frontend/src/components/ThemeSwitch/index.js +3 -2
  34. package/fe/frontend/src/components/index.js +2 -2
  35. package/fe/frontend/src/defaultPages/NotFoundPage/index.js +4 -3
  36. package/fe/frontend/src/defaultPages/SchemaPage/components/CallCom/DetailPanel.js +14 -9
  37. package/fe/frontend/src/defaultPages/SchemaPage/components/CallCom/PopFrom.js +8 -7
  38. package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaSearch/index.js +20 -24
  39. package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaTable/PreviewImage.d.ts +10 -0
  40. package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaTable/PreviewImage.js +17 -0
  41. package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaTable/data.d.ts +5 -0
  42. package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaTable/data.js +8 -0
  43. package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaTable/index.js +50 -32
  44. package/fe/frontend/src/defaultPages/SchemaPage/index.css +0 -4
  45. package/fe/frontend/src/defaultPages/SchemaPage/index.js +5 -3
  46. package/fe/frontend/src/defaultPages/SlotPage/index.js +6 -3
  47. package/fe/frontend/src/hooks/useText.d.ts +3 -0
  48. package/fe/frontend/src/hooks/useText.js +14 -0
  49. package/fe/frontend/src/index.d.ts +11 -3
  50. package/fe/frontend/src/index.js +8 -3
  51. package/fe/frontend/src/language/index.d.ts +0 -2
  52. package/fe/frontend/src/language/index.js +1 -7
  53. package/fe/frontend/src/language/resources.d.ts +2 -0
  54. package/fe/frontend/src/language/resources.js +9 -0
  55. package/fe/model/types/data/schema.d.ts +24 -2
  56. package/fe/model/types/index.d.ts +1 -0
  57. package/fe/packages/common/i18n/default.js +3 -0
  58. package/fe/packages/common/i18n/en-US.js +5 -2
  59. package/fe/packages/common/i18n/index.js +13 -0
  60. package/fe/packages/common/i18n/locales.js +7 -0
  61. package/fe/packages/common/index.d.ts +1 -0
  62. package/fe/packages/common/rafTimer.d.ts +7 -0
  63. package/fe/packages/common/rafTimer.js +168 -0
  64. package/fe/packages/react/hooks/index.d.ts +9 -0
  65. package/fe/packages/react/hooks/index.js +8 -0
  66. package/fe/packages/react/hooks/useRefState.d.ts +4 -12
  67. package/fe/packages/react/hooks/useRefState.js +18 -8
  68. package/fe/packages/react/ui/components/DataTable/dataTableWidth.d.ts +12 -0
  69. package/fe/packages/react/ui/components/DataTable/dataTableWidth.js +33 -0
  70. package/fe/packages/react/ui/components/DataTable/dataTableWidth.test.js +39 -0
  71. package/fe/packages/react/ui/components/DataTable/index.d.ts +1 -1
  72. package/fe/packages/react/ui/components/DataTable/index.js +12 -32
  73. package/fe/packages/react/ui/components/Textarea/Textarea.d.ts +1 -1
  74. package/fe/packages/react/ui/components/Textarea/Textarea.js +1 -1
  75. package/fe/packages/react/ui/components/types/baseType.d.ts +21 -0
  76. package/fe/packages/react/ui/components/types/baseType.js +0 -0
  77. package/model/frontend/src/common/language.d.ts +12 -1
  78. package/model/frontend/src/hooks/useText.d.ts +3 -0
  79. package/model/frontend/src/language/index.d.ts +0 -2
  80. package/model/frontend/src/language/resources.d.ts +2 -0
  81. package/model/model/types/data/schema.d.ts +24 -2
  82. package/model/model/types/index.d.ts +1 -0
  83. package/model/packages/common/index.d.ts +1 -0
  84. package/model/packages/common/rafTimer.d.ts +7 -0
  85. package/model/packages/react/ui/components/DataTable/dataTableWidth.d.ts +12 -0
  86. package/model/packages/react/ui/components/DataTable/index.d.ts +1 -1
  87. package/model/packages/react/ui/components/Textarea/Textarea.d.ts +1 -1
  88. package/model/packages/react/ui/components/types/baseType.d.ts +21 -0
  89. package/package.json +5 -5
  90. package/types/bundler/buildFE.d.ts +2 -0
  91. package/types/bundler/index.d.ts +1 -2
  92. package/types/packages/common/i18n/default.d.ts +4 -0
  93. package/types/packages/common/i18n/en-US.d.ts +6 -2
  94. package/types/packages/common/i18n/index.d.ts +21 -0
  95. package/types/packages/common/i18n/locales.d.ts +10 -0
  96. package/types/packages/common/i18n/types.d.ts +40 -0
  97. package/types/packages/common/index.d.ts +1 -0
  98. package/types/packages/common/rafTimer.d.ts +44 -0
@@ -1,3 +1,3 @@
1
1
  Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../_virtual/_rolldown/runtime.js`),t=require(`../packages/common/log/index.js`),n=require(`../packages/utils/path.js`);require(`../packages/utils/index.js`);const r=require(`./state.js`);let i=require(`fs`),a=require(`path`);a=e.__toESM(a);let o=require(`glob`);o=e.__toESM(o);let s=require(`vite`),c=require(`@tailwindcss/vite`);c=e.__toESM(c);let l=require(`module`),u=require(`url`);var d=typeof __filename==`string`?__filename:(0,u.fileURLToPath)({}.url),f=a.default.dirname(d),p=process.cwd(),m=(0,l.createRequire)(d),h=a.default.resolve(f,`../../`),g=a.default.resolve(f,`../`),_=a.default.resolve(h,`./fe/frontend`),v=a.default.resolve(p,`.`),y=a.default.resolve(v,`./frontend`),b=e=>a.default.dirname(m.resolve(`${e}/package.json`)),x=a.default.join(v,`.tc-entry-html`),S=`<!-- {{InsertScript}} -->`,C={head:`<!-- TC_HEAD_SLOT -->`,bodyBeforeRoot:`<!-- TC_BODY_BEFORE_ROOT_SLOT -->`,bodyAfterRoot:`<!-- TC_BODY_AFTER_ROOT_SLOT -->`},w=[`head`,`body-before-root`,`body-after-root`],T=()=>({head:``,"body-before-root":``,"body-after-root":``}),E=e=>e.trim().replace(/<!--(?!\s*(?:tc-slot:|\/tc-slot:))[\s\S]*?-->/g,``).replace(/>\s+</g,`><`),D=e=>{let t=[],n=e.replace(/<(script|style|textarea|pre)\b[\s\S]*?<\/\1>/gi,e=>{let n=`__TC_HTML_PRESERVED_${t.length}__`;return t.push(e),n}).replace(/<!--(?!\s*(?:tc-slot:|\/tc-slot:|\{\{InsertScript\}\}|TC_))[\s\S]*?-->/g,``).replace(/>\s+</g,`><`).trim();return t.reduce((e,t,n)=>e.replace(`__TC_HTML_PRESERVED_${n}__`,t),n)},O=e=>e.split(a.default.sep).join(`/`),k=e=>{let t=O(e);return t.startsWith(`.`)||t.startsWith(`/`)?t:`./${t}`},A=e=>/<html[\s>]/i.test(e)&&e.includes(`window['_basePath']`)&&/<div\s+id=["']root["']\s*><\/div>/i.test(e),j=e=>{let n=T(),r=(0,i.readFileSync)(e,`utf-8`),a=/<!--\s*tc-slot:([\w-]+)\s*-->([\s\S]*?)<!--\s*\/tc-slot:\1\s*-->/g,o=!1,s=r;if(r.replace(a,(t,r,i)=>{if(o=!0,!w.includes(r))throw Error(`Invalid html slot "${r}" in ${e}. Allowed slots: ${w.join(`, `)}.`);return n[r]+=i.trim()?`${i}\n`:``,s=s.replace(t,``),t}),s.trim()){if(A(r))return t.logYellow(`ignored legacy generated entry html: ${e}`),T();throw Error([`Invalid custom entry html: ${e}.`,`Custom entry html can only contain tc-slot blocks, for example:`,`<!-- tc-slot:head -->`,`<meta name="description" content="..." />`,`<!-- /tc-slot:head -->`].join(`
2
2
  `))}return o&&t.logYellow(`using custom entry html slots: ${e}`),n},M=(e,t)=>{let r=a.default.basename(e),s=[a.default.join(e,`${t}.html`),a.default.join(e,`${r}.html`)].find(e=>(0,i.existsSync)(e));if(s)return s;if(o.sync(n.resolve(e,`*.html`)).length)throw Error([`Entry html filename is not supported in ${e}.`,`Use ${t}.html or ${r}.html as a tc-slot file.`].join(`
3
- `))},N=(e,t)=>e.replace(C.head,E(t.head)).replace(C.bodyBeforeRoot,E(t[`body-before-root`])).replace(C.bodyAfterRoot,E(t[`body-after-root`])),P=(e=new Date)=>{let t=(e,t=2)=>e.toString().padStart(t,`0`);return[e.getFullYear(),t(e.getMonth()+1),t(e.getDate()),t(e.getHours())].join(`/`)+`:${t(e.getMinutes())}:${t(e.getSeconds())}:${t(e.getMilliseconds(),3)}`},F=(e,t,n,r)=>{let o=a.default.join(x,`${n}.html`),s=k(a.default.relative(a.default.dirname(o),t));return(0,i.writeFileSync)(o,N(e,r).replace(S,`<script type="module" src="${s}"><\/script>`)),o};function I(){t.logWhite(`frameFEPath: `+_),t.logWhite(`runFEPath: `+y);let e=[_,y].reduce((e,t)=>{let r=[`js`,`jsx`,`ts`,`tsx`].map(e=>n.resolve(t,`/**`,`/*.`+e)),i=o.sync(r).filter(e=>e.includes(`.entry.`)).filter(e=>!e.includes(`.d.ts`));return[...e,...i]},[]),r={};if(!e.length)return r;(0,i.rmSync)(x,{recursive:!0,force:!0}),(0,i.mkdirSync)(x,{recursive:!0});let s=(0,i.readFileSync)(a.default.resolve(g,`./app/view/entry.tpl`),`utf-8`);for(let t=0;t<e.length;t++){let n=e[t],i=a.default.resolve(n,`../`),o=M(i,a.default.basename(n).replace(/\.entry\.[^.]+$/,``)),c=o?a.default.basename(o,`.html`):i.split(a.default.sep).at(-1);r[c]=F(s,n,c,o?j(o):T())}return r}function L(){let e=r.buildFESharedState.options.output??`frame`;return e!==`frame`&&t.logRed(`Please pay attention to the build output.`),e===`run`?a.default.join(v,`./app/public/dist`):typeof e==`function`?e():a.default.join(g,`./app/public/dist`)}var R=async e=>{let n=(await import(`chokidar`)).watch(y,{ignored:/(^|[\/\\])\../,persistent:!0,ignoreInitial:!0}),r=!1;n.on(`change`,async n=>{if(!r){r=!0,t.logYellow(`changed: ${n}`);try{await e?.()}catch(e){t.logRed(e)}finally{r=!1}}}),t.logYellow(`watching ${y}/...`)};function z(){return{name:`flatten-html`,apply:`build`,closeBundle(){let e=L(),t=P();(0,i.writeFileSync)(n.resolve(e,`./FEBuildKey`),t)}}}function B(e=`.html`){let n=[...new Set(Array.isArray(e)?e:[e])];return{name:`flatten-html`,apply:`build`,closeBundle(){let e=L();if(!(0,i.existsSync)(e))return;let s=r.buildFESharedState.options.minifyHtml??!1,c=o.sync(`**/*.html`,{cwd:e,dot:!0});for(let t of c){let r=a.default.join(e,t),o=(0,i.readFileSync)(r,`utf-8`),c=s?D(o):o,l=a.default.basename(t,`.html`),u=`.entry`;l.indexOf(u)===-1&&(l+=u);for(let t of n){let n=l+t,o=a.default.join(e,n);r===o?s&&(0,i.writeFileSync)(o,c):(0,i.writeFileSync)(o,c)}n.some(t=>r===a.default.join(e,l+t))||(0,i.unlinkSync)(r)}let l=[...new Set(c.map(e=>a.default.dirname(e)))].sort().reverse(),u=e=>{if(!((0,i.existsSync)(e)?(0,i.readdirSync)(e):[1]).length){(0,i.rmdirSync)(e);let t=e.split(a.default.sep).slice(0,-1);t.length&&u(t.join(a.default.sep))}};for(let t of l)t&&t!==`.`&&u(a.default.join(e,t));let d=n.flatMap(t=>o.sync(`**/*`+t,{cwd:e,dot:!0}));for(let e of d)t.logYellow(`final file path -----> `+e)}}}function V(e){let t=[``,`.ts`,`.tsx`,`.js`,`.jsx`];return e.reduce((e,[n,r,o=y,s=`./defaultAlias`])=>{let c=t.map(e=>a.default.resolve(o,r+e)).find(e=>(0,i.existsSync)(e)),l=a.default.resolve(f,s);return c&&(l=c),e[n]=l,e},{})}var H=(...e)=>new RegExp(e.join(`[\\/]`)),U=e=>`_${e}_tcC`,W=async(e,n)=>{try{await(0,s.build)({configFile:!1,base:`/dist`,plugins:[(await import(`@vitejs/plugin-react`)).default(),B([`.tpl`]),z(),(0,c.default)()],build:{outDir:L(),emptyOutDir:!0,sourcemap:n===`dev`?`inline`:`hidden`,rolldownOptions:{input:e,output:{codeSplitting:{groups:[{name:U(`__nm`),test:H(`node_modules`),maxSize:5e5,minShareCount:2,priority:1},{name:U(`r`),test:H(`node_modules`,`react`),minShareCount:2,maxSize:5e5,priority:5},{name:U(`r-d`),test:H(`node_modules`,`react-dom`),minShareCount:2,maxSize:2e5,priority:10},{name:U(`r-r-d`),test:H(`node_modules`,`react-router-dom`),minShareCount:2,maxSize:5e5,priority:10},{name:U(`ajv`),test:H(`node_modules`,`ajv`),minShareCount:2,maxSize:2e5,priority:10},{name:U(`ui-lib`),test:H(`components`),minShareCount:2,maxSize:2e5,priority:5},{name:U(`ui-f-lib`),test:H(`components`,`.*?[Ff]orm.*?`),minShareCount:2,maxSize:5e4,priority:10}]}}}},resolve:{alias:{react:b(`react`),"react-dom":b(`react-dom`),"@tc/ui-react/hooks":a.default.resolve(f,`../../fe/packages/react/hooks/`),"@tc/ui-react":a.default.resolve(f,`../../fe/packages/react/ui/`),...V([[`@tc/scalability/SchemaForm/frameData`,`./extended/SchemaForm/data`,_],[`@tc/scalability/SchemaForm/data`,`./extended/SchemaForm/data`],[`@tc/scalability/SchemaPage/CallCom/data`,`./extended/SchemaPage/CallCom/data`],[`@tc/scalability/dash/customRoutes`,`./extended/dash/customRoutes`],[`@tc/scalability/dash/init`,`./extended/dash/init`],[`@tc/scalability/dash/components`,`./extended/dash/components`],[`@tc/scalability/dash/routeGuard`,`./extended/dash/routeGuard`,void 0,`./defaultRouteGuard`]])}}}),t.logJoinColorized(t.colorize(`builded`,`green`),t.colorize(` -> `,`white`),t.colorize(`time: `,`cyan`),t.colorize(new Date,`pink`))}catch(e){if(t.logRed(e),n!==`dev`)throw e}};exports.VBuildFE=W,exports.entries=I,exports.generateBuildKeyPlugin=z,exports.outDir=L,exports.watchFiles=R;
3
+ `))},N=(e,t)=>e.replace(C.head,E(t.head)).replace(C.bodyBeforeRoot,E(t[`body-before-root`])).replace(C.bodyAfterRoot,E(t[`body-after-root`])),P=(e=new Date)=>{let t=(e,t=2)=>e.toString().padStart(t,`0`);return[e.getFullYear(),t(e.getMonth()+1),t(e.getDate()),t(e.getHours())].join(`/`)+`:${t(e.getMinutes())}:${t(e.getSeconds())}:${t(e.getMilliseconds(),3)}`},F=(e,t,n,r)=>{let o=a.default.join(x,`${n}.html`),s=k(a.default.relative(a.default.dirname(o),t));return(0,i.writeFileSync)(o,N(e,r).replace(S,`<script type="module" src="${s}"><\/script>`)),o};function I(){t.logWhite(`frameFEPath: `+_),t.logWhite(`runFEPath: `+y);let e=[_,y].reduce((e,t)=>{let r=[`js`,`jsx`,`ts`,`tsx`].map(e=>n.resolve(t,`/**`,`/*.`+e)),i=o.sync(r).filter(e=>e.includes(`.entry.`)).filter(e=>!e.includes(`.d.ts`));return[...e,...i]},[]),r={};if(!e.length)return r;(0,i.rmSync)(x,{recursive:!0,force:!0}),(0,i.mkdirSync)(x,{recursive:!0});let s=(0,i.readFileSync)(a.default.resolve(g,`./app/view/entry.tpl`),`utf-8`);for(let t=0;t<e.length;t++){let n=e[t],i=a.default.resolve(n,`../`),o=M(i,a.default.basename(n).replace(/\.entry\.[^.]+$/,``)),c=o?a.default.basename(o,`.html`):i.split(a.default.sep).at(-1);r[c]=F(s,n,c,o?j(o):T())}return r}function L(){let e=r.buildFESharedState.options.output??`frame`;return e!==`frame`&&t.logRed(`Please pay attention to the build output.`),e===`run`?a.default.join(v,`./app/public/dist`):typeof e==`function`?e():a.default.join(g,`./app/public/dist`)}var R=async e=>{let n=(await import(`chokidar`)).watch(y,{ignored:/(^|[\/\\])\../,persistent:!0,ignoreInitial:!0}),r=!1;n.on(`change`,async n=>{if(!r){r=!0,t.logYellow(`changed: ${n}`);try{await e?.()}catch(e){t.logRed(e)}finally{r=!1}}}),t.logYellow(`watching ${y}/...`)};function z(){return{name:`flatten-html`,apply:`build`,closeBundle(){let e=L(),t=P();(0,i.writeFileSync)(n.resolve(e,`./FEBuildKey`),t)}}}function B(e=`.html`){let n=[...new Set(Array.isArray(e)?e:[e])];return{name:`flatten-html`,apply:`build`,closeBundle(){let e=L();if(!(0,i.existsSync)(e))return;let s=r.buildFESharedState.options.minifyHtml??!1,c=o.sync(`**/*.html`,{cwd:e,dot:!0});for(let t of c){let r=a.default.join(e,t),o=(0,i.readFileSync)(r,`utf-8`),c=s?D(o):o,l=a.default.basename(t,`.html`),u=`.entry`;l.indexOf(u)===-1&&(l+=u);for(let t of n){let n=l+t,o=a.default.join(e,n);r===o?s&&(0,i.writeFileSync)(o,c):(0,i.writeFileSync)(o,c)}n.some(t=>r===a.default.join(e,l+t))||(0,i.unlinkSync)(r)}let l=[...new Set(c.map(e=>a.default.dirname(e)))].sort().reverse(),u=e=>{if(!((0,i.existsSync)(e)?(0,i.readdirSync)(e):[1]).length){(0,i.rmdirSync)(e);let t=e.split(a.default.sep).slice(0,-1);t.length&&u(t.join(a.default.sep))}};for(let t of l)t&&t!==`.`&&u(a.default.join(e,t));let d=n.flatMap(t=>o.sync(`**/*`+t,{cwd:e,dot:!0}));for(let e of d)t.logYellow(`final file path -----> `+e)}}}function V(e){let t=[``,`.ts`,`.tsx`,`.js`,`.jsx`];return e.reduce((e,[n,r,o=y,s=`./defaultAlias`])=>{let c=t.map(e=>a.default.resolve(o,r+e)).find(e=>(0,i.existsSync)(e)),l=a.default.resolve(f,s);return c&&(l=c),e[n]=l,e},{})}var H=(...e)=>new RegExp(e.join(`[\\/]`)),U=e=>`_${e}_tcC`,W=async(e,n)=>{try{await(0,s.build)({configFile:!1,base:`/dist`,plugins:[(await import(`@vitejs/plugin-react`)).default(),B([`.tpl`]),z(),(0,c.default)()],build:{outDir:L(),emptyOutDir:!0,sourcemap:n===`dev`?`inline`:`hidden`,rolldownOptions:{input:e,output:{codeSplitting:{groups:[{name:U(`__nm`),test:H(`node_modules`),maxSize:5e5,minShareCount:2,priority:1},{name:U(`r`),test:H(`node_modules`,`react`),minShareCount:2,maxSize:5e5,priority:5},{name:U(`r-d`),test:H(`node_modules`,`react-dom`),minShareCount:2,maxSize:2e5,priority:10},{name:U(`r-r-d`),test:H(`node_modules`,`react-router-dom`),minShareCount:2,maxSize:5e5,priority:10},{name:U(`ajv`),test:H(`node_modules`,`ajv`),minShareCount:2,maxSize:2e5,priority:10},{name:U(`ui-lib`),test:H(`components`),minShareCount:2,maxSize:2e5,priority:5},{name:U(`ui-f-lib`),test:H(`components`,`.*?[Ff]orm.*?`),minShareCount:2,maxSize:5e4,priority:10}]}}}},resolve:{alias:{react:b(`react`),"react-dom":b(`react-dom`),"@tc/ui-react/hooks":a.default.resolve(f,`../../fe/packages/react/hooks/`),"@tc/ui-react":a.default.resolve(f,`../../fe/packages/react/ui/`),...V([[`@tc/scalability/SchemaForm/frameData`,`./extended/SchemaForm/data`,_],[`@tc/scalability/SchemaForm/data`,`./extended/SchemaForm/data`],[`@tc/scalability/SchemaPage/CallCom/data`,`./extended/SchemaPage/CallCom/data`],[`@tc/scalability/SchemaPage/SchemaTable/data`,`./extended/SchemaPage/SchemaTable/data`],[`@tc/scalability/dash/customRoutes`,`./extended/dash/customRoutes`],[`@tc/scalability/dash/init`,`./extended/dash/init`],[`@tc/scalability/dash/components`,`./extended/dash/components`],[`@tc/scalability/dash/routeGuard`,`./extended/dash/routeGuard`,void 0,`./defaultRouteGuard`]])}}}),t.logJoinColorized(t.colorize(`builded`,`green`),t.colorize(` -> `,`white`),t.colorize(`time: `,`cyan`),t.colorize(new Date,`pink`))}catch(e){if(t.logRed(e),n!==`dev`)throw e}};exports.VBuildFE=W,exports.entries=I,exports.generateBuildKeyPlugin=z,exports.outDir=L,exports.watchFiles=R;
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./guards/index.js`),t=require(`./array/index.js`),n=require(`./cache/LRUCache.js`),r=require(`./http/index.js`),i=require(`./i18n/default.js`),a=require(`./i18n/en-US.js`),o=require(`./i18n/locales.js`),s=require(`./i18n/index.js`),c=require(`./log/index.js`),l=require(`./number/index.js`),u=require(`./object/filterEmpty.js`),d=require(`./object/index.js`),f=require(`./string/index.js`);exports.ANSI_RESET=c.ANSI_RESET,exports.FetchAxios=r.FetchAxios,exports.LRUCache=n.LRUCache,exports.ansiColors=c.ansiColors,exports.axios=r.axios,exports.capitalize=f.capitalize,exports.chunk=t.chunk,exports.clamp=l.clamp,exports.colorLog=c.colorLog,exports.colorize=c.colorize,exports.compact=t.compact,exports.createInstance=r.createInstance,exports.defaultEnglishResources=a.defaultEnglishResources,exports.defaultLanguage=o.defaultLanguage,exports.defaultLanguageResources=i.defaultLanguageResources,exports.filterEmpty=u.filterEmpty,exports.filtereEmpty=u.filtereEmpty,exports.getI18nPathValue=s.getI18nPathValue,exports.getLanguage=s.getLanguage,exports.groupBy=t.groupBy,exports.i18n=s.i18n,exports.i18nStore=s.i18nStore,exports.interpolateI18nMessage=s.interpolateI18nMessage,exports.isBlank=f.isBlank,exports.isBoolean=e.isBoolean,exports.isFunction=e.isFunction,exports.isNil=e.isNil,exports.isNonNullable=e.isNonNullable,exports.isNumber=e.isNumber,exports.isPlainI18nDictionary=s.isPlainI18nDictionary,exports.isPlainObject=e.isPlainObject,exports.isString=e.isString,exports.joinColorized=c.joinColorized,exports.joinStr=f.joinStr,exports.kebabCase=f.kebabCase,exports.languageLocalKey=o.languageLocalKey,exports.logColor=c.logColor,exports.logColorized=c.logColorized,exports.logGreen=c.logGreen,exports.logJoinColorized=c.logJoinColorized,exports.logPink=c.logPink,exports.logRed=c.logRed,exports.logWhite=c.logWhite,exports.logYellow=c.logYellow,exports.mapValues=d.mapValues,exports.mergeI18nDictionary=s.mergeI18nDictionary,exports.mergeI18nResources=s.mergeI18nResources,exports.omit=d.omit,exports.pick=d.pick,exports.t=s.t,exports.toArray=t.toArray,exports.toFiniteNumber=l.toFiniteNumber,exports.translate=s.translate,exports.translations=o.translations,exports.uniqueBy=t.uniqueBy;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./guards/index.js`),t=require(`./array/index.js`),n=require(`./cache/LRUCache.js`),r=require(`./http/index.js`),i=require(`./i18n/default.js`),a=require(`./i18n/en-US.js`),o=require(`./i18n/locales.js`),s=require(`./i18n/index.js`),c=require(`./log/index.js`),l=require(`./number/index.js`),u=require(`./object/filterEmpty.js`),d=require(`./object/index.js`),f=require(`./rafTimer.js`),p=require(`./string/index.js`);exports.ANSI_RESET=c.ANSI_RESET,exports.FetchAxios=r.FetchAxios,exports.LRUCache=n.LRUCache,exports.ansiColors=c.ansiColors,exports.axios=r.axios,exports.capitalize=p.capitalize,exports.chunk=t.chunk,exports.clamp=l.clamp,exports.clearRafTimer=f.clearRafTimer,exports.colorLog=c.colorLog,exports.colorize=c.colorize,exports.compact=t.compact,exports.createInstance=r.createInstance,exports.defaultEnglishResources=a.defaultEnglishResources,exports.defaultLanguage=o.defaultLanguage,exports.defaultLanguageResources=i.defaultLanguageResources,exports.filterEmpty=u.filterEmpty,exports.filtereEmpty=u.filtereEmpty,exports.getI18nPathValue=s.getI18nPathValue,exports.getLanguage=s.getLanguage,exports.groupBy=t.groupBy,exports.i18n=s.i18n,exports.i18nStore=s.i18nStore,exports.interpolateI18nMessage=s.interpolateI18nMessage,exports.isBlank=p.isBlank,exports.isBoolean=e.isBoolean,exports.isFunction=e.isFunction,exports.isNil=e.isNil,exports.isNonNullable=e.isNonNullable,exports.isNumber=e.isNumber,exports.isPlainI18nDictionary=s.isPlainI18nDictionary,exports.isPlainObject=e.isPlainObject,exports.isString=e.isString,exports.joinColorized=c.joinColorized,exports.joinStr=p.joinStr,exports.kebabCase=p.kebabCase,exports.languageLocalKey=o.languageLocalKey,exports.logColor=c.logColor,exports.logColorized=c.logColorized,exports.logGreen=c.logGreen,exports.logJoinColorized=c.logJoinColorized,exports.logPink=c.logPink,exports.logRed=c.logRed,exports.logWhite=c.logWhite,exports.logYellow=c.logYellow,exports.mapValues=d.mapValues,exports.mergeI18nDictionary=s.mergeI18nDictionary,exports.mergeI18nResources=s.mergeI18nResources,exports.omit=d.omit,exports.pick=d.pick,exports.rafClearInterval=f.rafClearInterval,exports.rafClearTimeout=f.rafClearTimeout,exports.rafSetInterval=f.rafSetInterval,exports.rafSetTimeout=f.rafSetTimeout,exports.t=s.t,exports.toArray=t.toArray,exports.toFiniteNumber=l.toFiniteNumber,exports.translate=s.translate,exports.translations=o.translations,exports.uniqueBy=t.uniqueBy;
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=16,t=globalThis,n=new Map,r=0,i=e=>Math.max(0,e??0),a=()=>t.performance?.now?.()??Date.now(),o=()=>{let n=t.requestAnimationFrame,r=t.cancelAnimationFrame;if(typeof n==`function`&&typeof r==`function`)return{scheduleFrame:e=>n.call(t,e),cancelFrame:e=>r.call(t,e)};let i=t.setTimeout,o=t.clearTimeout;if(typeof i!=`function`||typeof o!=`function`)throw Error(`raf timer requires requestAnimationFrame or setTimeout/clearTimeout.`);return{scheduleFrame:n=>i.call(t,()=>n(a()),e),cancelFrame:e=>o.call(t,e)}},s,c=()=>(s??=o(),s),l=()=>(r+=1,r),u=e=>{let t=n.get(e);t&&(c().cancelFrame(t.frameId),n.delete(e))},d=(e,t)=>{let r=n.get(e);if(r){if(r.type===`timeout`?t-r.startTime>=r.delay:t-r.lastRunTime>=r.delay){if(r.type===`timeout`){n.delete(e),r.callback();return}r.lastRunTime=t,r.callback()}n.has(e)&&(r.frameId=c().scheduleFrame(t=>d(e,t)))}},f=(e,t,r,o)=>{let s=l(),u=a(),f={type:e,delay:i(r),callback:()=>t(...o??[]),startTime:u,lastRunTime:u,frameId:0};return n.set(s,f),f.frameId=c().scheduleFrame(e=>d(s,e)),s},p=(e,t,...n)=>f(`timeout`,e,t,n),m=e=>{u(e)},h=(e,t,...n)=>f(`interval`,e,t,n),g=e=>{u(e)},_=e=>{u(e)};exports.clearRafTimer=_,exports.rafClearInterval=g,exports.rafClearTimeout=m,exports.rafSetInterval=h,exports.rafSetTimeout=p;
@@ -23,7 +23,10 @@ var t = (e) => JSON.stringify(e).replace(/</g, "\\u003c").replace(/>/g, "\\u003e
23
23
  n.extends.localCacheHtmlEtag.setEtag(s, e);
24
24
  }
25
25
  let c = n.extends.localCacheHtmlEtag.getEtag(s);
26
- c || console.log("---- etag 缓存异常 请检查服务 ----"), r.etag = c ?? Date.now() + "";
26
+ if (c || console.log("---- etag 缓存异常 请检查服务 ----"), r.etag = c ?? Date.now() + "", r.fresh) {
27
+ r.status = 304;
28
+ return;
29
+ }
27
30
  } catch (e) {
28
31
  console.log("-------------- render view error --------------"), console.log(e), n.extends.generateErrorMessage("template not found", {
29
32
  status: 404,
@@ -0,0 +1,14 @@
1
+ import { logRed as e } from "../packages/common/log/index.js";
2
+ import { setBuildFEOptions as t } from "./state.js";
3
+ import { dev as n } from "./dev.js";
4
+ import { prod as r } from "./prod.js";
5
+ //#region bundler/buildFE.ts
6
+ var i = (i, a) => {
7
+ switch (t(a), i) {
8
+ case "dev": return n();
9
+ case "prod": return r();
10
+ default: return e("Usage: npx tsx scripts/index.ts [dev|prod]"), Promise.resolve();
11
+ }
12
+ };
13
+ //#endregion
14
+ export { i as buildFE };
@@ -1,15 +1,3 @@
1
- import { logRed as e } from "../packages/common/log/index.js";
2
- import { buildBE as t } from "./buildBE.js";
3
- import { setBuildFEOptions as n } from "./state.js";
4
- import { dev as r } from "./dev.js";
5
- import { prod as i } from "./prod.js";
6
- //#region bundler/index.ts
7
- var a = (t, a) => {
8
- switch (n(a), t) {
9
- case "dev": return r();
10
- case "prod": return i();
11
- default: return e("Usage: npx tsx scripts/index.ts [dev|prod]"), Promise.resolve();
12
- }
13
- };
14
- //#endregion
15
- export { t as buildBE, a as buildFE };
1
+ import { buildBE as e } from "./buildBE.js";
2
+ import { buildFE as t } from "./buildFE.js";
3
+ export { e as buildBE, t as buildFE };
@@ -252,6 +252,7 @@ var Q = (...e) => new RegExp(e.join("[\\/]")), $ = (e) => `_${e}_tcC`, ee = asyn
252
252
  ],
253
253
  ["@tc/scalability/SchemaForm/data", "./extended/SchemaForm/data"],
254
254
  ["@tc/scalability/SchemaPage/CallCom/data", "./extended/SchemaPage/CallCom/data"],
255
+ ["@tc/scalability/SchemaPage/SchemaTable/data", "./extended/SchemaPage/SchemaTable/data"],
255
256
  ["@tc/scalability/dash/customRoutes", "./extended/dash/customRoutes"],
256
257
  ["@tc/scalability/dash/init", "./extended/dash/init"],
257
258
  ["@tc/scalability/dash/components", "./extended/dash/components"],
@@ -10,5 +10,6 @@ import { ANSI_RESET as j, ansiColors as M, colorLog as N, colorize as P, joinCol
10
10
  import { clamp as W, toFiniteNumber as G } from "./number/index.js";
11
11
  import { filterEmpty as K, filtereEmpty as q } from "./object/filterEmpty.js";
12
12
  import { mapValues as J, omit as Y, pick as X } from "./object/index.js";
13
- import { capitalize as Z, isBlank as Q, joinStr as $, kebabCase as ee } from "./string/index.js";
14
- export { j as ANSI_RESET, p as FetchAxios, f as LRUCache, M as ansiColors, m as axios, Z as capitalize, s as chunk, W as clamp, N as colorLog, P as colorize, c as compact, h as createInstance, _ as defaultEnglishResources, v as defaultLanguage, g as defaultLanguageResources, K as filterEmpty, q as filtereEmpty, x as getI18nPathValue, S as getLanguage, l as groupBy, C as i18n, w as i18nStore, T as interpolateI18nMessage, Q as isBlank, e as isBoolean, t as isFunction, n as isNil, r as isNonNullable, i as isNumber, E as isPlainI18nDictionary, a as isPlainObject, o as isString, F as joinColorized, $ as joinStr, ee as kebabCase, y as languageLocalKey, I as logColor, L as logColorized, R as logGreen, z as logJoinColorized, B as logPink, V as logRed, H as logWhite, U as logYellow, J as mapValues, D as mergeI18nDictionary, O as mergeI18nResources, Y as omit, X as pick, k as t, u as toArray, G as toFiniteNumber, A as translate, b as translations, d as uniqueBy };
13
+ import { clearRafTimer as Z, rafClearInterval as Q, rafClearTimeout as $, rafSetInterval as ee, rafSetTimeout as te } from "./rafTimer.js";
14
+ import { capitalize as ne, isBlank as re, joinStr as ie, kebabCase as ae } from "./string/index.js";
15
+ export { j as ANSI_RESET, p as FetchAxios, f as LRUCache, M as ansiColors, m as axios, ne as capitalize, s as chunk, W as clamp, Z as clearRafTimer, N as colorLog, P as colorize, c as compact, h as createInstance, _ as defaultEnglishResources, v as defaultLanguage, g as defaultLanguageResources, K as filterEmpty, q as filtereEmpty, x as getI18nPathValue, S as getLanguage, l as groupBy, C as i18n, w as i18nStore, T as interpolateI18nMessage, re as isBlank, e as isBoolean, t as isFunction, n as isNil, r as isNonNullable, i as isNumber, E as isPlainI18nDictionary, a as isPlainObject, o as isString, F as joinColorized, ie as joinStr, ae as kebabCase, y as languageLocalKey, I as logColor, L as logColorized, R as logGreen, z as logJoinColorized, B as logPink, V as logRed, H as logWhite, U as logYellow, J as mapValues, D as mergeI18nDictionary, O as mergeI18nResources, Y as omit, X as pick, Q as rafClearInterval, $ as rafClearTimeout, ee as rafSetInterval, te as rafSetTimeout, k as t, u as toArray, G as toFiniteNumber, A as translate, b as translations, d as uniqueBy };
@@ -0,0 +1,47 @@
1
+ //#region packages/common/rafTimer.ts
2
+ var e = 16, t = globalThis, n = /* @__PURE__ */ new Map(), r = 0, i = (e) => Math.max(0, e ?? 0), a = () => t.performance?.now?.() ?? Date.now(), o = () => {
3
+ let n = t.requestAnimationFrame, r = t.cancelAnimationFrame;
4
+ if (typeof n == "function" && typeof r == "function") return {
5
+ scheduleFrame: (e) => n.call(t, e),
6
+ cancelFrame: (e) => r.call(t, e)
7
+ };
8
+ let i = t.setTimeout, o = t.clearTimeout;
9
+ if (typeof i != "function" || typeof o != "function") throw Error("raf timer requires requestAnimationFrame or setTimeout/clearTimeout.");
10
+ return {
11
+ scheduleFrame: (n) => i.call(t, () => n(a()), e),
12
+ cancelFrame: (e) => o.call(t, e)
13
+ };
14
+ }, s, c = () => (s ??= o(), s), l = () => (r += 1, r), u = (e) => {
15
+ let t = n.get(e);
16
+ t && (c().cancelFrame(t.frameId), n.delete(e));
17
+ }, d = (e, t) => {
18
+ let r = n.get(e);
19
+ if (r) {
20
+ if (r.type === "timeout" ? t - r.startTime >= r.delay : t - r.lastRunTime >= r.delay) {
21
+ if (r.type === "timeout") {
22
+ n.delete(e), r.callback();
23
+ return;
24
+ }
25
+ r.lastRunTime = t, r.callback();
26
+ }
27
+ n.has(e) && (r.frameId = c().scheduleFrame((t) => d(e, t)));
28
+ }
29
+ }, f = (e, t, r, o) => {
30
+ let s = l(), u = a(), f = {
31
+ type: e,
32
+ delay: i(r),
33
+ callback: () => t(...o ?? []),
34
+ startTime: u,
35
+ lastRunTime: u,
36
+ frameId: 0
37
+ };
38
+ return n.set(s, f), f.frameId = c().scheduleFrame((e) => d(s, e)), s;
39
+ }, p = (e, t, ...n) => f("timeout", e, t, n), m = (e) => {
40
+ u(e);
41
+ }, h = (e, t, ...n) => f("interval", e, t, n), g = (e) => {
42
+ u(e);
43
+ }, _ = (e) => {
44
+ u(e);
45
+ };
46
+ //#endregion
47
+ export { _ as clearRafTimer, g as rafClearInterval, m as rafClearTimeout, h as rafSetInterval, p as rafSetTimeout };
@@ -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
- if (key.includes("$i18n::")) return i18n(key.replace(i18nKeyPrefix, ""), fillingData, options);
9
- return key;
28
+ if (key.startsWith("$i18n::")) return i18n(key.slice(i18nKeyPrefix.length), fillingData, options);
29
+ return i18n(key, fillingData, options);
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
  })