@_tc/template-core 0.2.12 → 0.3.0
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-component-usage-skills/SKILL.md +7 -9
- package/.skills/tc-component-usage-skills/reference/component-api.md +2 -2
- package/.skills/tc-component-usage-skills/reference/examples.md +9 -9
- package/.skills/tc-component-usage-skills/reference/patterns.md +5 -5
- package/.skills/tc-component-usage-skills/reference/template-core-frontend.md +1 -1
- package/.skills/tc-generator/SKILL.md +30 -14
- package/.skills/tc-generator/reference/example.md +4 -4
- package/.skills/tc-generator/reference/model-schema.md +9 -5
- package/.skills/tc-generator/reference/runtime-extensions.md +9 -7
- package/AGENT_README.md +52 -33
- package/CHANGE.md +48 -5
- package/README.md +147 -46
- package/cjs/app/controller/ssr.js +1 -0
- package/cjs/app/controller/view.js +1 -1
- package/cjs/app/html/shell.js +36 -0
- package/cjs/app/middleware.js +1 -1
- package/cjs/app/router/ssr.js +1 -0
- package/cjs/app/router/view.js +1 -1
- package/cjs/app/ssr/html.js +17 -0
- package/cjs/app/ssr/manifest.js +2 -0
- package/cjs/app/view/entry.tpl +2 -37
- package/cjs/bundler/buildBE.js +1 -1
- package/cjs/bundler/buildSSR.js +1 -0
- package/cjs/bundler/entryCollect.js +1 -0
- package/cjs/bundler/feSharedConfig.js +1 -0
- package/cjs/bundler/index.js +1 -1
- package/cjs/bundler/ssrClientManifest.js +1 -0
- package/cjs/bundler/ssrEntries.js +1 -0
- package/cjs/bundler/utils.js +3 -3
- package/cjs/packages/common/i18n/index.js +1 -1
- package/cjs/packages/common/index.js +1 -1
- package/cjs/packages/common/ssr/hydration.js +1 -0
- package/cjs/packages/common/ssr/index.js +1 -0
- package/cjs/packages/core/index.js +1 -1
- package/cjs/packages/core/loader/controller.js +1 -1
- package/cjs/packages/core/loader/extend.js +1 -1
- package/cjs/packages/core/loader/merge.js +1 -0
- package/cjs/packages/core/loader/middleware.js +1 -1
- package/cjs/packages/core/loader/model.js +1 -1
- package/cjs/packages/core/loader/router-schema.js +1 -1
- package/cjs/packages/core/loader/router.js +1 -1
- package/cjs/packages/core/loader/service.js +1 -1
- package/cjs/packages/core/paths.js +1 -1
- package/cjs/scripts/vite-build/build.js +3 -3
- package/cjs/scripts/vite-build/collect.js +1 -1
- package/cjs/scripts/vite-build/dts.js +1 -1
- package/cjs/scripts/vite-build/normalize.js +1 -1
- package/cjs/ssrSharedData/outputPaths.js +1 -0
- package/esm/app/controller/ssr.js +215 -0
- package/esm/app/controller/view.js +26 -25
- package/esm/app/html/shell.js +69 -0
- package/esm/app/middleware.js +18 -9
- package/esm/app/router/ssr.js +8 -0
- package/esm/app/router/view.js +5 -4
- package/esm/app/ssr/html.js +90 -0
- package/esm/app/ssr/manifest.js +47 -0
- package/esm/app/view/entry.tpl +2 -37
- package/esm/bundler/buildBE.js +1 -1
- package/esm/bundler/buildSSR.js +126 -0
- package/esm/bundler/entryCollect.js +45 -0
- package/esm/bundler/feSharedConfig.js +143 -0
- package/esm/bundler/index.js +4 -2
- package/esm/bundler/ssrClientManifest.js +14 -0
- package/esm/bundler/ssrEntries.js +13 -0
- package/esm/bundler/utils.js +248 -255
- package/esm/packages/common/i18n/index.js +5 -1
- package/esm/packages/common/index.js +4 -2
- package/esm/packages/common/ssr/hydration.js +55 -0
- package/esm/packages/common/ssr/index.js +20 -0
- package/esm/packages/core/index.js +42 -42
- package/esm/packages/core/loader/controller.js +11 -9
- package/esm/packages/core/loader/extend.js +20 -16
- package/esm/packages/core/loader/merge.js +7 -0
- package/esm/packages/core/loader/middleware.js +11 -12
- package/esm/packages/core/loader/model.js +2 -2
- package/esm/packages/core/loader/router-schema.js +22 -15
- package/esm/packages/core/loader/router.js +32 -26
- package/esm/packages/core/loader/service.js +11 -9
- package/esm/packages/core/paths.js +9 -1
- package/esm/scripts/vite-build/build.js +88 -83
- package/esm/scripts/vite-build/collect.js +31 -27
- package/esm/scripts/vite-build/dts.js +1 -1
- package/esm/scripts/vite-build/normalize.js +6 -3
- package/esm/ssrSharedData/outputPaths.js +33 -0
- package/fe/frontend/apps/dash/Dashboard.d.ts +5 -1
- package/fe/frontend/apps/dash/Dashboard.js +22 -13
- package/fe/frontend/apps/dash/types.d.ts +2 -0
- package/fe/frontend/src/api/baseInfo.d.ts +1 -1
- package/fe/frontend/src/common/CRUD/CRUD.js +1 -1
- package/fe/frontend/src/common/CRUD/index.js +1 -1
- package/fe/frontend/src/common/menu.d.ts +1 -1
- package/fe/frontend/src/common/menu.js +8 -7
- package/fe/frontend/src/common/request.js +1 -1
- package/fe/frontend/src/common/schemaForm.d.ts +1 -0
- package/fe/frontend/src/common/schemaForm.js +12 -0
- package/fe/frontend/src/components/AsyncSelect/AsyncSelect.d.ts +1 -1
- package/fe/frontend/src/components/Router/basename.d.ts +3 -0
- package/fe/frontend/src/components/Router/basename.js +11 -0
- package/fe/frontend/src/components/Router/index.d.ts +1 -1
- package/fe/frontend/src/components/Router/index.js +3 -1
- package/fe/frontend/src/defaultPages/SchemaPage/components/CallCom/builtIn.d.ts +1 -1
- package/fe/frontend/src/defaultPages/SchemaPage/components/SchemaTable/data.d.ts +1 -1
- package/fe/frontend/src/defaultPages/SchemaPage/schemaType.d.ts +2 -2
- package/fe/frontend/src/defaultPages/SchemaPage/utils/schemaConversion.d.ts +1 -1
- package/fe/frontend/src/defaultPages/SidebarSlotPage/SidebarSlotContainer.d.ts +2 -1
- package/fe/frontend/src/defaultPages/SidebarSlotPage/SidebarSlotContainer.js +8 -4
- package/fe/frontend/src/defaultPages/SidebarSlotPageTmp.js +2 -1
- package/fe/frontend/src/exportStore.js +2 -2
- package/fe/frontend/src/hooks/useCurrentMenuData.d.ts +1 -1
- package/fe/frontend/src/hooks/useCurrentMenuData.js +2 -2
- package/fe/frontend/src/hooks/useRouterParams.js +4 -3
- package/fe/frontend/src/index.d.ts +1 -0
- package/fe/frontend/src/index.js +4 -3
- package/fe/frontend/src/main.js +2 -0
- package/fe/frontend/src/stores/mode.d.ts +15 -2
- package/fe/frontend/src/stores/mode.js +19 -5
- package/fe/frontend/src/typing/window.d.ts +2 -0
- package/fe/packages/common/LRUCache.js +2 -0
- package/fe/packages/common/array/index.js +37 -0
- package/fe/packages/common/cache/index.js +2 -0
- package/fe/packages/common/guards/index.js +19 -1
- package/fe/packages/common/http/index.js +1 -1
- package/fe/packages/common/i18n/index.js +8 -4
- package/fe/packages/common/i18n/locales.js +1 -1
- package/fe/packages/common/i18n/types.d.ts +1 -0
- package/fe/packages/common/i18n/types.js +0 -0
- package/fe/packages/common/index.d.ts +1 -0
- package/fe/packages/common/index.js +17 -0
- package/fe/packages/common/log/index.js +146 -0
- package/fe/packages/common/number/index.js +11 -0
- package/fe/packages/common/object/filterEmpty.js +2 -1
- package/fe/packages/common/object/filtereEmpty.js +2 -0
- package/fe/packages/common/object/index.js +20 -0
- package/fe/packages/common/ssr/hydration.d.ts +23 -0
- package/fe/packages/common/ssr/hydration.js +88 -0
- package/fe/packages/common/ssr/index.d.ts +8 -0
- package/fe/packages/common/ssr/index.js +52 -0
- package/fe/packages/common/string/index.js +32 -0
- package/fe/packages/common/types/index.js +0 -0
- package/fe/packages/react/hooks/index.d.ts +2 -0
- package/fe/packages/react/hooks/index.js +3 -1
- package/fe/packages/react/hooks/useHydrationData.d.ts +2 -0
- package/fe/packages/react/hooks/useHydrationData.js +23 -0
- package/fe/packages/react/hooks/useSSR.d.ts +6 -0
- package/fe/packages/react/hooks/useSSR.js +46 -0
- package/fe/packages/react/ui/components/DataTable/index.js +16 -15
- package/fe/packages/react/ui/components/Form/SchemaForm/data.d.ts +3 -2
- package/fe/packages/react/ui/components/Form/SchemaForm/data.js +5 -6
- package/fe/packages/react/ui/components/Form/SchemaForm/index.d.ts +1 -0
- package/fe/packages/react/ui/components/Form/SchemaForm/index.js +2 -2
- package/fe/packages/react/ui/components/Form/index.js +2 -1
- package/fe/packages/react/ui/components/Input/Input.js +5 -1
- package/fe/packages/react/ui/components/Popup/Popup.js +6 -1
- package/fe/packages/react/ui/components/index.js +2 -1
- package/fe/packages/react/ui/components/testPage/demos/core/DataTableDemo.js +241 -211
- package/fe/packages/react/ui/components/testPage/demos/core/DataTableDemo2.js +1 -1
- package/fe/packages/react/ui/i18n/I18nProvider.js +4 -0
- package/fe/packages/react/ui/index.js +2 -1
- package/fe/ssr/apps/dash/dash.entry.d.ts +13 -0
- package/fe/ssr/apps/dash/dash.entry.js +162 -0
- package/fe/ssr/apps/demo/demo.entry.d.ts +13 -0
- package/fe/ssr/apps/demo/demo.entry.js +38 -0
- package/fe/ssr/apps/server-data/server-data.entry.d.ts +26 -0
- package/fe/ssr/apps/server-data/server-data.entry.js +275 -0
- package/fe/ssr/apps/ui-components/ui-components.entry.d.ts +5 -0
- package/fe/ssr/apps/ui-components/ui-components.entry.js +17 -0
- package/fe/ssr/components/StreamingRender/StreamingCache.d.ts +2 -0
- package/fe/ssr/components/StreamingRender/StreamingCache.js +31 -0
- package/fe/ssr/components/StreamingRender/StreamingRender.d.ts +3 -0
- package/fe/ssr/components/StreamingRender/StreamingRender.js +48 -0
- package/fe/ssr/components/StreamingRender/StreamingScript.d.ts +8 -0
- package/fe/ssr/components/StreamingRender/StreamingScript.js +58 -0
- package/fe/ssr/components/StreamingRender/index.d.ts +4 -0
- package/fe/ssr/components/StreamingRender/index.js +5 -0
- package/fe/ssr/components/StreamingRender/type.d.ts +9 -0
- package/fe/ssr/components/StreamingRender/type.js +0 -0
- package/fe/ssr/components/index.d.ts +2 -0
- package/fe/ssr/components/index.js +2 -0
- package/fe/ssr/createSSREntry.d.ts +6 -0
- package/fe/ssr/createSSREntry.js +42 -0
- package/fe/ssr/hooks/index.d.ts +1 -0
- package/fe/ssr/hooks/index.js +2 -0
- package/fe/ssr/hooks/useSuspensePromise.d.ts +1 -0
- package/fe/ssr/hooks/useSuspensePromise.js +31 -0
- package/fe/ssr/index.d.ts +4 -0
- package/fe/ssr/index.js +6 -0
- package/fe/ssr/types.d.ts +13 -0
- package/fe/ssr/types.js +0 -0
- package/{model → models}/frontend/src/typing/window.d.ts +2 -0
- package/{model → models}/packages/common/i18n/types.d.ts +1 -0
- package/{model → models}/packages/common/index.d.ts +1 -0
- package/models/packages/common/ssr/hydration.d.ts +23 -0
- package/models/packages/common/ssr/index.d.ts +8 -0
- package/{model → models}/packages/react/ui/components/Form/SchemaForm/data.d.ts +3 -2
- package/{model → models}/packages/react/ui/components/Form/SchemaForm/index.d.ts +1 -0
- package/package.json +43 -6
- package/types/app/controller/ssr.d.ts +14 -0
- package/types/app/html/shell.d.ts +101 -0
- package/types/app/router/ssr.d.ts +6 -0
- package/types/app/ssr/html.d.ts +53 -0
- package/types/app/ssr/manifest.d.ts +17 -0
- package/types/app/typings.d.ts +2 -0
- package/types/bundler/buildSSR.d.ts +56 -0
- package/types/bundler/entryCollect.d.ts +36 -0
- package/types/bundler/feSharedConfig.d.ts +35 -0
- package/types/bundler/index.d.ts +4 -0
- package/types/bundler/ssrClientManifest.d.ts +4 -0
- package/types/bundler/ssrEntries.d.ts +23 -0
- package/types/bundler/state.d.ts +2 -2
- package/types/bundler/utils.d.ts +35 -2
- package/types/config/config.default.d.ts +10 -0
- package/types/packages/common/i18n/types.d.ts +2 -0
- package/types/packages/common/index.d.ts +1 -0
- package/types/packages/common/ssr/hydration.d.ts +72 -0
- package/types/packages/common/ssr/index.d.ts +34 -0
- package/types/packages/core/loader/merge.d.ts +3 -0
- package/types/packages/core/loader/model.d.ts +2 -2
- package/types/packages/core/paths.d.ts +5 -0
- package/types/packages/core/types.d.ts +10 -1
- package/types/scripts/vite-build/build.d.ts +1 -0
- package/types/scripts/vite-build/types.d.ts +3 -0
- package/types/ssrSharedData/outputPaths.d.ts +59 -0
- package/fe/packages/react/hooks/useWatch.test.js +0 -24
- package/fe/packages/react/ui/assets/table/no-result.js +0 -4
- package/fe/packages/react/ui/components/DataTable/dataTableWidth.test.js +0 -39
- package/fe/packages/react/ui/components/InputNumber/inputNumberUtils.test.js +0 -59
- /package/.skills/tc-generator/reference/project-template/{model → models}/product/mode.js +0 -0
- /package/.skills/tc-generator/reference/project-template/{model → models}/product/project/default.js +0 -0
- /package/fe/{model → models}/types/data/button.d.ts +0 -0
- /package/fe/{model → models}/types/data/component.d.ts +0 -0
- /package/fe/{model → models}/types/data/fetchInfo.d.ts +0 -0
- /package/fe/{model → models}/types/data/schema.d.ts +0 -0
- /package/fe/{model → models}/types/data/search.d.ts +0 -0
- /package/fe/{model → models}/types/index.d.ts +0 -0
- /package/fe/{model → models}/types/menuType.d.ts +0 -0
- /package/fe/{model → models}/types/model.d.ts +0 -0
- /package/{model → models}/frontend/extended/SchemaForm/data.d.ts +0 -0
- /package/{model → models}/frontend/src/common/auth/index.d.ts +0 -0
- /package/{model → models}/frontend/src/common/fetchErrorShow.d.ts +0 -0
- /package/{model → models}/frontend/src/common/language.d.ts +0 -0
- /package/{model → models}/frontend/src/common/logFn/index.d.ts +0 -0
- /package/{model → models}/frontend/src/common/request.d.ts +0 -0
- /package/{model → models}/frontend/src/components/AsyncSelect/AsyncSelect.d.ts +0 -0
- /package/{model → models}/frontend/src/components/AsyncSelect/index.d.ts +0 -0
- /package/{model → models}/frontend/src/defaultPages/SchemaPage/components/CallCom/DetailPanel.d.ts +0 -0
- /package/{model → models}/frontend/src/defaultPages/SchemaPage/components/CallCom/PopFrom.d.ts +0 -0
- /package/{model → models}/frontend/src/defaultPages/SchemaPage/components/CallCom/builtIn.d.ts +0 -0
- /package/{model → models}/frontend/src/defaultPages/SchemaPage/data/eventInfo.d.ts +0 -0
- /package/{model → models}/frontend/src/defaultPages/SchemaPage/data/index.d.ts +0 -0
- /package/{model → models}/frontend/src/defaultPages/SchemaPage/hooks/useComConfig.d.ts +0 -0
- /package/{model → models}/frontend/src/defaultPages/SchemaPage/schemaType.d.ts +0 -0
- /package/{model → models}/frontend/src/defaultPages/SchemaPage/utils/permissions.d.ts +0 -0
- /package/{model → models}/frontend/src/defaultPages/SchemaPage/utils/validator.d.ts +0 -0
- /package/{model → models}/frontend/src/hooks/useText.d.ts +0 -0
- /package/{model → models}/frontend/src/language/en-US.d.ts +0 -0
- /package/{model → models}/frontend/src/language/index.d.ts +0 -0
- /package/{model → models}/frontend/src/language/resources.d.ts +0 -0
- /package/{model → models}/frontend/src/language/zh-CN.d.ts +0 -0
- /package/{model → models}/frontend/src/stores/apiFreezer.d.ts +0 -0
- /package/{model → models}/frontend/src/stores/schemaEventBus.d.ts +0 -0
- /package/{model → models}/frontend/src/stores/schemaStore.d.ts +0 -0
- /package/{model → models}/frontend/src/typing/scalability.d.ts +0 -0
- /package/{model/model → models/models}/index.d.ts +0 -0
- /package/{model/model → models/models}/test.d.ts +0 -0
- /package/{model/model → models/models}/types/data/button.d.ts +0 -0
- /package/{model/model → models/models}/types/data/component.d.ts +0 -0
- /package/{model/model → models/models}/types/data/fetchInfo.d.ts +0 -0
- /package/{model/model → models/models}/types/data/schema.d.ts +0 -0
- /package/{model/model → models/models}/types/data/search.d.ts +0 -0
- /package/{model/model → models/models}/types/index.d.ts +0 -0
- /package/{model/model → models/models}/types/menuType.d.ts +0 -0
- /package/{model/model → models/models}/types/model.d.ts +0 -0
- /package/{model → models}/packages/common/array/index.d.ts +0 -0
- /package/{model → models}/packages/common/cache/LRUCache.d.ts +0 -0
- /package/{model → models}/packages/common/cache/index.d.ts +0 -0
- /package/{model → models}/packages/common/guards/index.d.ts +0 -0
- /package/{model → models}/packages/common/http/index.d.ts +0 -0
- /package/{model → models}/packages/common/i18n/default.d.ts +0 -0
- /package/{model → models}/packages/common/i18n/en-US.d.ts +0 -0
- /package/{model → models}/packages/common/i18n/index.d.ts +0 -0
- /package/{model → models}/packages/common/i18n/locales.d.ts +0 -0
- /package/{model → models}/packages/common/log/index.d.ts +0 -0
- /package/{model → models}/packages/common/number/index.d.ts +0 -0
- /package/{model → models}/packages/common/object/filterEmpty.d.ts +0 -0
- /package/{model → models}/packages/common/object/index.d.ts +0 -0
- /package/{model → models}/packages/common/rafTimer.d.ts +0 -0
- /package/{model → models}/packages/common/string/index.d.ts +0 -0
- /package/{model → models}/packages/common/types/index.d.ts +0 -0
- /package/{model → models}/packages/react/hooks/useBreadcrumb.d.ts +0 -0
- /package/{model → models}/packages/react/hooks/useExecuteOnce.d.ts +0 -0
- /package/{model → models}/packages/react/hooks/useLanguage.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Button/Button.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Button/SubmitButton.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Button/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Card/Card.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Card/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Checkbox/Checkbox.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Checkbox/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/ConfirmDialog/ConfirmDialog.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/ConfirmDialog/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/DataTable/ActionBtn.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/DataTable/dataTableWidth.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/DataTable/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Date/Calendar.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Date/Date.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Date/LocaleContext.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Date/LocaleProvider.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Date/TimePicker.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Date/data.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Date/dateLocaleStore.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Date/dropdownPositioning.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Date/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Date/locales.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Drawer/Drawer.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Drawer/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Dropdown/Dropdown.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Dropdown/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Form/Form.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Form/FormItem.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Form/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Form/useForm.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/ImagePreview/ImagePreview.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/ImagePreview/PreviewImage.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/ImagePreview/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Input/Input.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Input/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/InputNumber/InputNumber.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/InputNumber/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/InputNumber/inputNumberUtils.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Label/Label.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Label/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Layout/Layout.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Layout/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Loading/Loading.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Loading/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Menu/Menu.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Menu/MenuContext.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Menu/MenuItem.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Menu/SubMenu.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Menu/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Menu/menuTypes.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Menu/utils.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Message/Message.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Message/MessageManager.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Message/data.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Message/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Modal/Modal.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Modal/ModalManager.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Modal/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Notification/Notification.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Notification/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Overlay/Overlay.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Overlay/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Pagination/Pagination.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Pagination/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Popup/Popup.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Popup/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Radio/Radio.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Radio/RadioGroup.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Radio/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Search/Search.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Search/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Select/Select.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Select/dropdownPositioning.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Select/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Skeleton/Skeleton.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Skeleton/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Switch/Switch.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Switch/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/TableSearch/TableSearch.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/TableSearch/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/TableSearch/lang.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/TableSearch/tableSearchLocaleStore.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Tabs/Tabs.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Tabs/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Textarea/Textarea.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Textarea/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Tooltip/Tooltip.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Tooltip/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/TreeSelect/TreeSelect.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/TreeSelect/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Upload/ImageUpload.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Upload/Upload.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/Upload/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/breadcrumb/breadcrumb.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/breadcrumb/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/hooks/useDropdownPositioning.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/hooks/useInputController.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/table/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/table/table.d.ts +0 -0
- /package/{model → models}/packages/react/ui/components/types/baseType.d.ts +0 -0
- /package/{model → models}/packages/react/ui/i18n/I18nProvider.d.ts +0 -0
- /package/{model → models}/packages/react/ui/i18n/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/i18n/useI18n.d.ts +0 -0
- /package/{model → models}/packages/react/ui/index.d.ts +0 -0
- /package/{model → models}/packages/react/ui/lib/createStoreHook.d.ts +0 -0
- /package/{model → models}/packages/react/ui/lib/export.d.ts +0 -0
- /package/{model → models}/packages/react/ui/lib/utils.d.ts +0 -0
- /package/{model → models}/packages/react/ui/stores/breadcrumb.d.ts +0 -0
- /package/{model → models}/packages/react/ui/stores/language.d.ts +0 -0
- /package/{model → models}/packages/react/ui/types/index.d.ts +0 -0
- /package/{model → models}/typings/type.d.ts +0 -0
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tc-component-usage-skills
|
|
3
|
-
description: Use when building or modifying React UI in TemplateCore projects. Covers how to choose, compose, and correctly use components from
|
|
3
|
+
description: Use when building or modifying React UI in TemplateCore projects. Covers how to choose, compose, and correctly use components from the published `@_tc/template-core/fe/rc` UI entry, plus TemplateCore frontend helpers from `@_tc/template-core/fe` such as `AsyncSelect`, `LanguageSwitch`, and `ThemeSwitch`. Includes patterns for forms, tables, modals, drawers, menus, Dashboard toolbar UI, and TC visual style.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# TC Component Usage
|
|
7
7
|
|
|
8
|
-
Use this skill when writing React components that consume
|
|
8
|
+
Use this skill when writing React components that consume the published TemplateCore UI entry `@_tc/template-core/fe/rc` or frontend helpers from `@_tc/template-core/fe`.
|
|
9
9
|
|
|
10
10
|
## Quick Decision Flow
|
|
11
11
|
|
|
@@ -51,7 +51,7 @@ const [form] = useForm<T>();
|
|
|
51
51
|
```
|
|
52
52
|
|
|
53
53
|
UI-library built-in `type` values: `input`, `inputNumber`, `select`, `textarea`, `switch`, `date`, `checkbox`.
|
|
54
|
-
TemplateCore adds framework type `asyncSelect
|
|
54
|
+
TemplateCore adds framework type `asyncSelect`; custom app types are registered in the consumer app at `frontend/extended/SchemaForm/data.ts`.
|
|
55
55
|
|
|
56
56
|
### Modal (Declarative + Imperative)
|
|
57
57
|
|
|
@@ -114,24 +114,22 @@ pnpm type-check
|
|
|
114
114
|
## Component Import Convention
|
|
115
115
|
|
|
116
116
|
```tsx
|
|
117
|
-
import { Button, Form, FormItem, Input, DataTable, Modal, modal, useForm } from '@
|
|
117
|
+
import { Button, Form, FormItem, Input, DataTable, Modal, modal, useForm } from '@_tc/template-core/fe/rc'
|
|
118
118
|
import { AsyncSelect, LanguageSwitch, ThemeSwitch } from '@_tc/template-core/fe'
|
|
119
119
|
```
|
|
120
120
|
|
|
121
|
-
When
|
|
121
|
+
When editing the TemplateCore package source repository, `@tc/ui-react` is the raw UI workspace package. Published consumer projects should use `@_tc/template-core/fe/rc`, which re-exports the UI component library:
|
|
122
122
|
|
|
123
123
|
```tsx
|
|
124
124
|
import { Button, DataTable, TableSearch } from '@_tc/template-core/fe/rc'
|
|
125
125
|
```
|
|
126
126
|
|
|
127
|
-
Inside this source repository, use `@tc/ui-react` for the raw UI workspace package. The `@_tc/template-core/fe/rc` path is a published TemplateCore package export generated into `dist/package.json`.
|
|
128
|
-
|
|
129
127
|
Style entry:
|
|
130
128
|
|
|
131
129
|
```tsx
|
|
132
|
-
import '@tc/ui-react/index.css'
|
|
133
|
-
// or, in published TemplateCore frontend entries:
|
|
134
130
|
import '@_tc/template-core/fe/tailwind_ui.css'
|
|
131
|
+
// source repository raw UI work can use:
|
|
132
|
+
// import '@tc/ui-react/index.css'
|
|
135
133
|
```
|
|
136
134
|
|
|
137
135
|
## Visual Style
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Component API Reference
|
|
2
2
|
|
|
3
|
-
Complete props for
|
|
3
|
+
Complete props for the UI components re-exported by `@_tc/template-core/fe/rc`.
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -317,7 +317,7 @@ interface SchemaFormProps<T> {
|
|
|
317
317
|
}
|
|
318
318
|
```
|
|
319
319
|
|
|
320
|
-
**Important:** In `horizontal` layout, `footerButtons` are NOT auto-rendered. UI-library built-in types: `input`, `inputNumber`, `select`, `textarea`, `switch`, `date`, `checkbox`. TemplateCore also registers framework type `asyncSelect`. App types are
|
|
320
|
+
**Important:** In `horizontal` layout, `footerButtons` are NOT auto-rendered. UI-library built-in types: `input`, `inputNumber`, `select`, `textarea`, `switch`, `date`, `checkbox`. TemplateCore also registers framework type `asyncSelect`. App types are registered in `frontend/extended/SchemaForm/data.ts` and resolved by the TemplateCore build alias.
|
|
321
321
|
|
|
322
322
|
---
|
|
323
323
|
|
|
@@ -8,8 +8,8 @@ Copy-paste starting points for common TC UI scenarios.
|
|
|
8
8
|
|
|
9
9
|
```tsx
|
|
10
10
|
import { useState, useEffect, useCallback } from 'react'
|
|
11
|
-
import { DataTable, TableSearch, Button, Modal, SchemaForm, ConfirmDialog, message, useForm } from '@
|
|
12
|
-
import type { TableColumnDef, TableSearchSchema } from '@
|
|
11
|
+
import { DataTable, TableSearch, Button, Modal, SchemaForm, ConfirmDialog, message, useForm } from '@_tc/template-core/fe/rc'
|
|
12
|
+
import type { TableColumnDef, TableSearchSchema } from '@_tc/template-core/fe/rc'
|
|
13
13
|
|
|
14
14
|
interface Product {
|
|
15
15
|
id: number
|
|
@@ -164,7 +164,7 @@ export function ProductList() {
|
|
|
164
164
|
## Example 2: Detail Drawer
|
|
165
165
|
|
|
166
166
|
```tsx
|
|
167
|
-
import { Drawer, Button, Loading, Skeleton } from '@
|
|
167
|
+
import { Drawer, Button, Loading, Skeleton } from '@_tc/template-core/fe/rc'
|
|
168
168
|
|
|
169
169
|
export function UserDetailDrawer({ userId, open, onClose }: {
|
|
170
170
|
userId: number | null
|
|
@@ -207,7 +207,7 @@ export function UserDetailDrawer({ userId, open, onClose }: {
|
|
|
207
207
|
## Example 3: App Shell with Sidebar Menu
|
|
208
208
|
|
|
209
209
|
```tsx
|
|
210
|
-
import { Layout, Menu, Breadcrumb } from '@
|
|
210
|
+
import { Layout, Menu, Breadcrumb } from '@_tc/template-core/fe/rc'
|
|
211
211
|
import { useNavigate, useLocation } from 'react-router-dom'
|
|
212
212
|
|
|
213
213
|
export function AppShell({ children }: { children: ReactNode }) {
|
|
@@ -253,7 +253,7 @@ export function AppShell({ children }: { children: ReactNode }) {
|
|
|
253
253
|
## Example 4: Image Upload Form
|
|
254
254
|
|
|
255
255
|
```tsx
|
|
256
|
-
import { SchemaForm, ImageUpload, message, useForm } from '@
|
|
256
|
+
import { SchemaForm, ImageUpload, message, useForm } from '@_tc/template-core/fe/rc'
|
|
257
257
|
|
|
258
258
|
interface BannerForm {
|
|
259
259
|
title: string
|
|
@@ -295,7 +295,7 @@ function BannerEditor() {
|
|
|
295
295
|
## Example 5: TreeSelect for Permissions
|
|
296
296
|
|
|
297
297
|
```tsx
|
|
298
|
-
import { TreeSelect } from '@
|
|
298
|
+
import { TreeSelect } from '@_tc/template-core/fe/rc'
|
|
299
299
|
|
|
300
300
|
function PermissionEditor() {
|
|
301
301
|
const [checked, setChecked] = useState<(string | number)[]>([])
|
|
@@ -326,7 +326,7 @@ function PermissionEditor() {
|
|
|
326
326
|
## Example 6: DataTable with Row Selection (Batch Actions)
|
|
327
327
|
|
|
328
328
|
```tsx
|
|
329
|
-
import { DataTable, Button, message } from '@
|
|
329
|
+
import { DataTable, Button, message } from '@_tc/template-core/fe/rc'
|
|
330
330
|
|
|
331
331
|
function BatchUserList() {
|
|
332
332
|
const [selectedKeys, setSelectedKeys] = useState<(string | number)[]>([])
|
|
@@ -368,7 +368,7 @@ function BatchUserList() {
|
|
|
368
368
|
## Example 7: DatePicker Usage
|
|
369
369
|
|
|
370
370
|
```tsx
|
|
371
|
-
import { DatePicker } from '@
|
|
371
|
+
import { DatePicker } from '@_tc/template-core/fe/rc'
|
|
372
372
|
|
|
373
373
|
// Single date
|
|
374
374
|
<DatePicker
|
|
@@ -398,7 +398,7 @@ import { DatePicker } from '@tc/ui-react'
|
|
|
398
398
|
## Example 8: Tooltip & Popup
|
|
399
399
|
|
|
400
400
|
```tsx
|
|
401
|
-
import { Tooltip, Popup, Dropdown, Button } from '@
|
|
401
|
+
import { Tooltip, Popup, Dropdown, Button } from '@_tc/template-core/fe/rc'
|
|
402
402
|
import { useRef, useState } from 'react'
|
|
403
403
|
|
|
404
404
|
// Simple tooltip
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Component Patterns
|
|
2
2
|
|
|
3
|
-
Recurring patterns and best practices for `@
|
|
3
|
+
Recurring patterns and best practices for TemplateCore UI components from `@_tc/template-core/fe/rc`.
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -69,7 +69,7 @@ TemplateCore already registers framework field type `asyncSelect`:
|
|
|
69
69
|
The options endpoint should return the normal TemplateCore response wrapper, usually via `this.success(ctx, options)`.
|
|
70
70
|
|
|
71
71
|
```tsx
|
|
72
|
-
//
|
|
72
|
+
// frontend/extended/SchemaForm/data.ts
|
|
73
73
|
const consumerComponentsMap = {
|
|
74
74
|
richText: RichTextEditor,
|
|
75
75
|
userSelector: UserSelect,
|
|
@@ -311,7 +311,7 @@ In `mode='top'`, SubMenus always use popup dropdowns.
|
|
|
311
311
|
### Toast Messages
|
|
312
312
|
|
|
313
313
|
```tsx
|
|
314
|
-
import { message } from '@
|
|
314
|
+
import { message } from '@_tc/template-core/fe/rc'
|
|
315
315
|
|
|
316
316
|
message.success('User created successfully')
|
|
317
317
|
message.error('Failed to save')
|
|
@@ -322,7 +322,7 @@ message.info('New update available')
|
|
|
322
322
|
### Notifications (Corner)
|
|
323
323
|
|
|
324
324
|
```tsx
|
|
325
|
-
import { Notification } from '@
|
|
325
|
+
import { Notification } from '@_tc/template-core/fe/rc'
|
|
326
326
|
|
|
327
327
|
// As component
|
|
328
328
|
<Notification type="error" title="Upload Failed" message="Network error. Retry?" />
|
|
@@ -385,7 +385,7 @@ This means both patterns work identically:
|
|
|
385
385
|
|
|
386
386
|
## CSS Conventions
|
|
387
387
|
|
|
388
|
-
- Import styles before using components: `@
|
|
388
|
+
- Import styles before using components: `@_tc/template-core/fe/tailwind_ui.css` for published TemplateCore frontend entries; raw UI source work can use `@tc/ui-react/index.css`.
|
|
389
389
|
- All CSS classes are prefixed `tc-ui-<component-name>`
|
|
390
390
|
- Tailwind CSS used for styling
|
|
391
391
|
- Theme via CSS custom properties: `hsl(var(--theme-primary))`, `hsl(var(--theme-background))`, etc.
|
|
@@ -11,7 +11,7 @@ import type { BaseResponse, RequestConfig, ResponseConfig } from '@_tc/template-
|
|
|
11
11
|
import { Button, DataTable, TableSearch } from '@_tc/template-core/fe/rc'
|
|
12
12
|
```
|
|
13
13
|
|
|
14
|
-
Inside
|
|
14
|
+
Inside the TemplateCore package source repository, use `@tc/ui-react` for the raw UI workspace package. In published business projects, prefer `@_tc/template-core/fe/rc` for UI components, `@_tc/template-core/fe` for frontend runtime helpers, and `@_tc/template-core/fe/common/request` when only the request layer is needed.
|
|
15
15
|
|
|
16
16
|
## LanguageSwitch
|
|
17
17
|
|
|
@@ -1,21 +1,24 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tc-generator
|
|
3
|
-
description: Generate
|
|
3
|
+
description: Generate consumer business projects, modules, model configurations, Schema CRUD pages, controllers, routers, and project overrides that use the TemplateCore npm package's Koa + React + model-driven conventions. Use when the user asks to create or modify TC/TemplateCore consumer apps, admin modules, models/mode.js files, schemaConfig CRUD pages, menu structures, or app/controller and app/router files.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# TC Generator
|
|
7
7
|
|
|
8
|
-
Use this skill to generate or update
|
|
8
|
+
Use this skill to generate or update consumer business code that runs on TemplateCore.
|
|
9
|
+
|
|
10
|
+
This workspace is the TemplateCore npm package repository (`@_tc/template-core`). Treat generated business code as consumer-app code that imports the package. Do not treat the package repository root as the business `baseDir` unless the user explicitly asks to edit this repository's demo, reference templates, or framework/package source.
|
|
9
11
|
|
|
10
12
|
## Quick Workflow
|
|
11
13
|
|
|
12
|
-
1. Identify the target business root.
|
|
14
|
+
1. Identify the target consumer business root. A generated consumer app usually uses:
|
|
13
15
|
- `index.js`
|
|
14
16
|
- `config/config.default.js`
|
|
15
17
|
- `app/controller/*.js`
|
|
16
18
|
- `app/router/*.js`
|
|
17
|
-
- `
|
|
18
|
-
- optional `
|
|
19
|
+
- `models/{modelKey}/mode.js`
|
|
20
|
+
- optional `models/{modelKey}/project/{projectKey}.js`
|
|
21
|
+
- optional `ssr/apps/{page}/{page}.entry.jsx|tsx` only when the user explicitly asks for SSR pages.
|
|
19
22
|
2. Read only the reference needed:
|
|
20
23
|
- Model/menu/schema rules: `reference/model-schema.md`
|
|
21
24
|
- Runtime extensions (db, Dashboard slots/routes, frontend helpers): `reference/runtime-extensions.md`
|
|
@@ -23,15 +26,17 @@ Use this skill to generate or update TemplateCore business code.
|
|
|
23
26
|
- Complete product CRUD example: `reference/example.md`
|
|
24
27
|
3. Generate the smallest working slice first: config, entry, controller, router, model.
|
|
25
28
|
4. Keep keys stable. Array merge and project overrides depend on `key`.
|
|
26
|
-
5. Prefer CommonJS `.js` for generated
|
|
29
|
+
5. Prefer CommonJS `.js` for generated consumer examples unless the existing consumer app already uses TypeScript.
|
|
27
30
|
|
|
28
31
|
## TemplateCore Conventions
|
|
29
32
|
|
|
30
|
-
- Start the app with `serverStart({ name, baseDir })` from `@_tc/template-core`.
|
|
31
|
-
- Start the built-in frontend with `await buildFE("dev")` from `@_tc/template-core/bundler` when the user needs the admin UI. The current API returns `Promise<void>`; in dev mode it performs the initial build, then watches the
|
|
33
|
+
- Start the consumer app with `serverStart({ name, baseDir })` from `@_tc/template-core`.
|
|
34
|
+
- Start the built-in frontend with `await buildFE("dev")` from `@_tc/template-core/bundler` when the user needs the admin UI. The current API returns `Promise<void>`; in dev mode it performs the initial build, then watches the consumer app's `frontend/` directory. Use `buildFE("prod", { output: "run", minifyHtml: true })` when the generated consumer app should emit its own `app/public/dist` templates and compact final `.tpl` output.
|
|
32
35
|
- `buildFE()` writes `FEBuildKey` into the output directory; the server uses it to invalidate local HTML ETag cache after frontend rebuilds.
|
|
33
|
-
-
|
|
34
|
-
-
|
|
36
|
+
- Generate SSR pages only when requested. SSR entries live under `ssr/apps/{page}/{page}.entry.tsx`, import `createSSREntry` from `@_tc/template-core/ssr/createSSREntry`, and are built with `buildSSR({ baseDir, output: "run" })` from `@_tc/template-core/bundler`. Use `watchSSRFiles({ baseDir, output: "run" })` for development watches. SSR entries may export static strings or `SSRPageMetaResolver` functions as `pageTitle` / `pageDescription`; resolver functions run after `getServerProps()` and receive `{ params, query, path, app, ctx, props }`.
|
|
37
|
+
- SSR entry files are built for both server and browser. Do not put top-level Node-only or browser-only side effects in them; load server-only code inside `getServerProps()` with dynamic import and guard browser APIs with `typeof window !== "undefined"` or React effects. Do not call frontend API helpers that depend on `window` or `localStorage` from `getServerProps()`; put Node-safe request/data code in `*.server.ts` and import it dynamically from `getServerProps()`.
|
|
38
|
+
- If `buildFE("dev")` is used in a standalone consumer app, include the TemplateCore peer dependencies or use the package manager's peer dependency auto-install behavior.
|
|
39
|
+
- Consumer business code lives under the consumer app's `baseDir`, not inside this TemplateCore npm package's framework folders.
|
|
35
40
|
- The framework provides `app.extends.db` as a default SQLite-backed KV/SQL helper. Use it for small framework/business settings; override `app/extends/db.js` only when the project needs a custom storage implementation.
|
|
36
41
|
- Backend loaders map filenames to camelCase fields:
|
|
37
42
|
- `app/controller/product.js` -> `app.controller.product`
|
|
@@ -47,25 +52,36 @@ Use this skill to generate or update TemplateCore business code.
|
|
|
47
52
|
|
|
48
53
|
## Output Rules
|
|
49
54
|
|
|
50
|
-
- Make generated code directly runnable when package dependencies are installed.
|
|
55
|
+
- Make generated consumer code directly runnable when its package dependencies are installed.
|
|
51
56
|
- Include realistic in-memory data only for demos or scaffolds.
|
|
52
57
|
- Use `$i18n::...` only when also adding or pointing to language resources; otherwise write plain labels.
|
|
53
58
|
- For Schema CRUD, include `tableOption`, `createFormOption`, `editFormOption`, and `detailPanelOption` only where the field should appear.
|
|
54
59
|
- For edit/detail components, set `fetchKey` to the primary key field.
|
|
55
60
|
- For remove buttons, use `$schema::{field}` to pull values from the current row.
|
|
56
|
-
-
|
|
61
|
+
- When generating or updating a model, validate every requested form `comType` and table `renderComponent` before writing the model:
|
|
62
|
+
- Do not hard-code the available `comType` or `renderComponent` names in this skill. They are extensible by the framework consumer and can vary by project/version.
|
|
63
|
+
- Determine availability from the target consumer app's existing registrations and the TemplateCore package source/docs available in this repository. Consumer app registrations include `frontend/extended/SchemaForm/data.ts` for form types and `frontend/extended/SchemaPage/SchemaTable/data.ts` for table render components.
|
|
64
|
+
- If a requested type/component cannot be verified as available, do not invent a substitute, do not auto-create frontend extensions, and do not force the model to use an unknown type. Return the unverified/missing type list to the user and ask them to choose whether to reuse an existing type, add/register a custom component, or adjust the field design.
|
|
65
|
+
- Generate frontend extensions only when explicitly requested or after the user confirms a missing custom type/component:
|
|
57
66
|
- Dashboard header UI: `frontend/extended/dash/components.tsx` with `HeaderView.userArea`
|
|
58
67
|
- Dashboard custom routes: `frontend/extended/dash/customRoutes.tsx`
|
|
59
68
|
- SchemaForm field types: `frontend/extended/SchemaForm/data.ts`
|
|
69
|
+
- SchemaTable render components: `frontend/extended/SchemaPage/SchemaTable/data.ts`
|
|
60
70
|
- SchemaPage custom call components: `frontend/extended/SchemaPage/CallCom/data.ts`
|
|
61
71
|
|
|
62
72
|
## Validation
|
|
63
73
|
|
|
64
|
-
When editing
|
|
74
|
+
When editing this TemplateCore npm package repository, verify with the closest relevant package command:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
npm run type-check
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
When editing or generating a consumer business project, verify with the closest command available in that project:
|
|
65
81
|
|
|
66
82
|
```bash
|
|
67
83
|
pnpm type-check
|
|
68
84
|
pnpm dev
|
|
69
85
|
```
|
|
70
86
|
|
|
71
|
-
For generated standalone CommonJS examples, at minimum inspect paths and imports against the
|
|
87
|
+
For generated standalone CommonJS examples, at minimum inspect paths and imports against the TemplateCore package name.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Complete Product CRUD Example
|
|
2
2
|
|
|
3
|
-
This example creates a minimal
|
|
3
|
+
This example creates a minimal consumer business project that imports the `@_tc/template-core` npm package and exposes a product Schema CRUD page. It is not the layout of the TemplateCore package repository itself.
|
|
4
4
|
|
|
5
5
|
## Structure
|
|
6
6
|
|
|
@@ -13,7 +13,7 @@ my-admin/
|
|
|
13
13
|
│ └── product.js
|
|
14
14
|
├── config/
|
|
15
15
|
│ └── config.default.js
|
|
16
|
-
├──
|
|
16
|
+
├── models/
|
|
17
17
|
│ └── product/
|
|
18
18
|
│ ├── mode.js
|
|
19
19
|
│ └── project/
|
|
@@ -155,7 +155,7 @@ module.exports = (app, router) => {
|
|
|
155
155
|
};
|
|
156
156
|
```
|
|
157
157
|
|
|
158
|
-
##
|
|
158
|
+
## models/product/mode.js
|
|
159
159
|
|
|
160
160
|
```js
|
|
161
161
|
module.exports = {
|
|
@@ -339,7 +339,7 @@ module.exports = {
|
|
|
339
339
|
};
|
|
340
340
|
```
|
|
341
341
|
|
|
342
|
-
##
|
|
342
|
+
## models/product/project/default.js
|
|
343
343
|
|
|
344
344
|
```js
|
|
345
345
|
module.exports = {
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
# TemplateCore Model Schema Reference
|
|
2
2
|
|
|
3
|
+
This reference describes model files in a consumer business app that uses the `@_tc/template-core` npm package. Paths are relative to that app's `baseDir`, not to the TemplateCore package repository root, unless the user explicitly asks to edit this repository's demo or reference files.
|
|
4
|
+
|
|
3
5
|
## File Layout
|
|
4
6
|
|
|
5
|
-
The model loader reads the business root:
|
|
7
|
+
The model loader reads the consumer business root:
|
|
6
8
|
|
|
7
9
|
```text
|
|
8
|
-
|
|
9
|
-
|
|
10
|
+
models/{modelKey}/mode.js
|
|
11
|
+
models/{modelKey}/project/{projectKey}.js
|
|
10
12
|
```
|
|
11
13
|
|
|
12
|
-
`
|
|
14
|
+
`models/index.js` and `models/index.ts` are ignored.
|
|
13
15
|
|
|
14
16
|
Loader output shape:
|
|
15
17
|
|
|
@@ -228,7 +230,7 @@ cover: {
|
|
|
228
230
|
|
|
229
231
|
Built-in `PreviewImage` accepts the current field value as a string or string array. Project-specific table render components are registered in `frontend/extended/SchemaPage/SchemaTable/data.ts` and referenced by `tableOption.renderComponent`.
|
|
230
232
|
|
|
231
|
-
|
|
233
|
+
Example form `comType` values often seen in TemplateCore configs. This is not an authoritative or exhaustive list; verify available types from the target consumer app and this package repository before generating a model.
|
|
232
234
|
|
|
233
235
|
```text
|
|
234
236
|
input
|
|
@@ -240,6 +242,8 @@ date
|
|
|
240
242
|
checkbox
|
|
241
243
|
```
|
|
242
244
|
|
|
245
|
+
Model generation guard: before writing generated model config, verify that every `comType` and `tableOption.renderComponent` can be found in the target consumer app registrations or the TemplateCore package source/docs available in this repository. Because both extension points are consumer-extensible, this reference should not be treated as an authoritative list of all valid names. If a needed type cannot be verified, return the unverified `comType` / `renderComponent` names to the user for confirmation instead of auto-creating a custom component or forcing an unknown type into the model.
|
|
246
|
+
|
|
243
247
|
Useful option fields:
|
|
244
248
|
|
|
245
249
|
```js
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# TemplateCore Runtime Extensions
|
|
2
2
|
|
|
3
|
-
Use this reference when generating business code that needs persistence, Dashboard customization, or frontend helper components.
|
|
3
|
+
Use this reference when generating consumer business code that needs persistence, Dashboard customization, or frontend helper components.
|
|
4
|
+
|
|
5
|
+
This repository is the `@_tc/template-core` npm package source. Paths such as `app/extends/*` and `frontend/extended/*` are consumer-app paths under that app's `baseDir`, not package-source paths, unless the task is explicitly about this repository's demo, docs, or framework implementation.
|
|
4
6
|
|
|
5
7
|
## Default DB
|
|
6
8
|
|
|
@@ -10,7 +12,7 @@ Use this reference when generating business code that needs persistence, Dashboa
|
|
|
10
12
|
.template-core/template-core.sqlite
|
|
11
13
|
```
|
|
12
14
|
|
|
13
|
-
The default path is relative to the
|
|
15
|
+
The default path is relative to the consumer app `baseDir`. Configure it in `config/config.default.js`:
|
|
14
16
|
|
|
15
17
|
```js
|
|
16
18
|
module.exports = {
|
|
@@ -179,7 +181,7 @@ Keep header content compact; the default header already owns brand, title, and m
|
|
|
179
181
|
|
|
180
182
|
## Server Router Guard
|
|
181
183
|
|
|
182
|
-
Use `app/router-guard.js` or `app/router-guard.ts` in the generated
|
|
184
|
+
Use `app/router-guard.js` or `app/router-guard.ts` in the generated consumer app when unmatched server paths need custom fallback behavior. The file lives directly under the consumer app's `app/` directory.
|
|
183
185
|
|
|
184
186
|
```js
|
|
185
187
|
module.exports = (app) => (ctx) => {
|
|
@@ -222,14 +224,14 @@ Use `frontend/extended/dash/routeGuard.ts` when the built-in Dashboard needs a o
|
|
|
222
224
|
```ts
|
|
223
225
|
import type { DashRouteGuard } from '@_tc/template-core/fe'
|
|
224
226
|
|
|
225
|
-
const dashRouteGuard: DashRouteGuard = ({ isLoggedIn }) => {
|
|
226
|
-
if (!isLoggedIn) return '/login'
|
|
227
|
+
const dashRouteGuard: DashRouteGuard = ({ isLoggedIn, isSSR }) => {
|
|
228
|
+
if (!isLoggedIn) return isSSR ? '/login?from=ssr' : '/login'
|
|
227
229
|
}
|
|
228
230
|
|
|
229
231
|
export default dashRouteGuard
|
|
230
232
|
```
|
|
231
233
|
|
|
232
|
-
Return a login URL string when the framework should jump with `window.location.href`; the login page does not need to be inside Dash routes. `DashRouteGuardResult` is `string | undefined`, and `undefined` also interrupts the built-in Dashboard redirect, including the implicit return from a logged-in branch.
|
|
234
|
+
Return a login URL string when the framework should jump with `window.location.href`; the login page does not need to be inside Dash routes. `DashRouteGuardContext` includes `renderMode: 'csr' | 'ssr'` and `isSSR` for render-mode-specific redirects. `DashRouteGuardResult` is `string | undefined`, and `undefined` also interrupts the built-in Dashboard redirect, including the implicit return from a logged-in branch.
|
|
233
235
|
|
|
234
236
|
## Frontend Helpers
|
|
235
237
|
|
|
@@ -313,7 +315,7 @@ cover: {
|
|
|
313
315
|
}
|
|
314
316
|
```
|
|
315
317
|
|
|
316
|
-
For project-specific renderers, create `frontend/extended/SchemaPage/SchemaTable/data.ts` and default-export a component map typed as `SchemaTableRenderComponentsMap` from `@_tc/template-core/fe`. Extend `SchemaTableNamespace.RenderComponentPropsMap` from `@_tc/template-core/
|
|
318
|
+
For project-specific renderers, create `frontend/extended/SchemaPage/SchemaTable/data.ts` and default-export a component map typed as `SchemaTableRenderComponentsMap` from `@_tc/template-core/fe`. Extend `SchemaTableNamespace.RenderComponentPropsMap` from `@_tc/template-core/models` when TypeScript model config should know the renderer props.
|
|
317
319
|
|
|
318
320
|
## SchemaPage CallCom Extensions
|
|
319
321
|
|