@_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.
- package/.skills/tc-generator/reference/model-schema.md +18 -0
- package/.skills/tc-generator/reference/runtime-extensions.md +20 -0
- package/AGENT_README.md +29 -11
- package/README.md +222 -27
- package/cjs/app/controller/view.js +1 -1
- package/cjs/bundler/buildFE.js +1 -0
- package/cjs/bundler/index.js +1 -1
- package/cjs/bundler/utils.js +1 -1
- package/cjs/packages/common/index.js +1 -1
- package/cjs/packages/common/rafTimer.js +1 -0
- package/esm/app/controller/view.js +4 -1
- package/esm/bundler/buildFE.js +14 -0
- package/esm/bundler/index.js +3 -15
- package/esm/bundler/utils.js +1 -0
- package/esm/packages/common/index.js +3 -2
- package/esm/packages/common/rafTimer.js +47 -0
- package/fe/frontend/apps/dash/Dashboard.js +6 -4
- package/fe/frontend/apps/dash/dash.entry.js +4 -0
- package/fe/frontend/src/common/generateMenuData.d.ts +4 -1
- package/fe/frontend/src/common/generateMenuData.js +3 -3
- package/fe/frontend/src/common/language.d.ts +12 -1
- package/fe/frontend/src/common/language.js +27 -6
- package/fe/frontend/src/common/rafTimer.d.ts +1 -0
- package/fe/frontend/src/common/rafTimer.js +2 -0
- package/fe/frontend/src/common/request.js +1 -0
- package/fe/frontend/src/common/theme.d.ts +7 -0
- package/fe/frontend/src/common/theme.js +33 -0
- package/fe/frontend/src/components/BasePage/HeaderView.js +2 -2
- package/fe/frontend/src/components/LanguageSwitch/LanguageSwitch.js +22 -6
- package/fe/frontend/src/components/ThemeSwitch/ThemeSwitch.d.ts +3 -2
- package/fe/frontend/src/components/ThemeSwitch/ThemeSwitch.js +6 -29
- package/fe/frontend/src/components/ThemeSwitch/index.d.ts +1 -0
- package/fe/frontend/src/components/ThemeSwitch/index.js +3 -2
- package/fe/frontend/src/components/index.js +2 -2
- package/fe/frontend/src/defaultPages/NotFoundPage/index.js +4 -3
- package/fe/frontend/src/defaultPages/SchemaPage/components/CallCom/DetailPanel.js +14 -9
- package/fe/frontend/src/defaultPages/SchemaPage/components/CallCom/PopFrom.js +8 -7
- package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaSearch/index.js +20 -24
- package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaTable/PreviewImage.d.ts +10 -0
- package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaTable/PreviewImage.js +17 -0
- package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaTable/data.d.ts +5 -0
- package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaTable/data.js +8 -0
- package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaTable/index.js +50 -32
- package/fe/frontend/src/defaultPages/SchemaPage/index.css +0 -4
- package/fe/frontend/src/defaultPages/SchemaPage/index.js +5 -3
- package/fe/frontend/src/defaultPages/SlotPage/index.js +6 -3
- package/fe/frontend/src/hooks/useText.d.ts +3 -0
- package/fe/frontend/src/hooks/useText.js +14 -0
- package/fe/frontend/src/index.d.ts +11 -3
- package/fe/frontend/src/index.js +8 -3
- package/fe/frontend/src/language/index.d.ts +0 -2
- package/fe/frontend/src/language/index.js +1 -7
- package/fe/frontend/src/language/resources.d.ts +2 -0
- package/fe/frontend/src/language/resources.js +9 -0
- package/fe/model/types/data/schema.d.ts +24 -2
- package/fe/model/types/index.d.ts +1 -0
- package/fe/packages/common/i18n/default.js +3 -0
- package/fe/packages/common/i18n/en-US.js +5 -2
- package/fe/packages/common/i18n/index.js +13 -0
- package/fe/packages/common/i18n/locales.js +7 -0
- package/fe/packages/common/index.d.ts +1 -0
- package/fe/packages/common/rafTimer.d.ts +7 -0
- package/fe/packages/common/rafTimer.js +168 -0
- package/fe/packages/react/hooks/index.d.ts +9 -0
- package/fe/packages/react/hooks/index.js +8 -0
- package/fe/packages/react/hooks/useRefState.d.ts +4 -12
- package/fe/packages/react/hooks/useRefState.js +18 -8
- package/fe/packages/react/ui/components/DataTable/dataTableWidth.d.ts +12 -0
- package/fe/packages/react/ui/components/DataTable/dataTableWidth.js +33 -0
- package/fe/packages/react/ui/components/DataTable/dataTableWidth.test.js +39 -0
- package/fe/packages/react/ui/components/DataTable/index.d.ts +1 -1
- package/fe/packages/react/ui/components/DataTable/index.js +12 -32
- package/fe/packages/react/ui/components/Textarea/Textarea.d.ts +1 -1
- package/fe/packages/react/ui/components/Textarea/Textarea.js +1 -1
- package/fe/packages/react/ui/components/types/baseType.d.ts +21 -0
- package/fe/packages/react/ui/components/types/baseType.js +0 -0
- package/model/frontend/src/common/language.d.ts +12 -1
- package/model/frontend/src/hooks/useText.d.ts +3 -0
- package/model/frontend/src/language/index.d.ts +0 -2
- package/model/frontend/src/language/resources.d.ts +2 -0
- package/model/model/types/data/schema.d.ts +24 -2
- package/model/model/types/index.d.ts +1 -0
- package/model/packages/common/index.d.ts +1 -0
- package/model/packages/common/rafTimer.d.ts +7 -0
- package/model/packages/react/ui/components/DataTable/dataTableWidth.d.ts +12 -0
- package/model/packages/react/ui/components/DataTable/index.d.ts +1 -1
- package/model/packages/react/ui/components/Textarea/Textarea.d.ts +1 -1
- package/model/packages/react/ui/components/types/baseType.d.ts +21 -0
- package/package.json +5 -5
- package/types/bundler/buildFE.d.ts +2 -0
- package/types/bundler/index.d.ts +1 -2
- package/types/packages/common/i18n/default.d.ts +4 -0
- package/types/packages/common/i18n/en-US.d.ts +6 -2
- package/types/packages/common/i18n/index.d.ts +21 -0
- package/types/packages/common/i18n/locales.d.ts +10 -0
- package/types/packages/common/i18n/types.d.ts +40 -0
- package/types/packages/common/index.d.ts +1 -0
- package/types/packages/common/rafTimer.d.ts +44 -0
package/cjs/bundler/utils.js
CHANGED
|
@@ -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=
|
|
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 };
|
package/esm/bundler/index.js
CHANGED
|
@@ -1,15 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
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 };
|
package/esm/bundler/utils.js
CHANGED
|
@@ -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 {
|
|
14
|
-
|
|
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 ?
|
|
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
|
-
|
|
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:
|
|
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 {
|
|
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
|
-
|
|
6
|
-
i18nStore.getState().addResources(
|
|
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.
|
|
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";
|
|
@@ -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 =
|
|
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 {
|
|
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:
|
|
15
|
+
var getDefaultLanguageOptions = (text) => [{
|
|
16
|
+
label: text(frontendLangKeys.languageSwitchZhCN),
|
|
16
17
|
value: "zh-CN",
|
|
17
18
|
searchText: "zh-CN 中文 简体中文"
|
|
18
19
|
}, {
|
|
19
|
-
label:
|
|
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 ??
|
|
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 ??
|
|
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
|
-
|
|
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" ?
|
|
58
|
-
const tooltip = checked ?
|
|
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,5 +1,6 @@
|
|
|
1
|
-
import
|
|
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 {
|
|
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:
|
|
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:
|
|
22
|
+
children: text(frontendLangKeys.notFoundDescription)
|
|
22
23
|
})
|
|
23
24
|
]
|
|
24
25
|
})
|