@_tc/template-core 0.1.1 → 0.1.3

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/README.md CHANGED
@@ -16,7 +16,7 @@ pnpm add @_tc/template-core
16
16
 
17
17
  ## 可选:AI Agent Skill
18
18
 
19
- 包内附带 `tc-generator` skill,本质是一份可复用的 Agent 指令包,用来按 TemplateCore 约定生成业务项目、model 配置、Schema CRUD、controller 和 router。
19
+ 包内附带 `tc-generator` skill,本质是一份可复用的 Agent 指令包,用来按 TemplateCore 约定生成项目、model 配置、Schema CRUD、controller 和 router。
20
20
 
21
21
  如果你的 Agent 支持本地 skills 目录,可以从已安装的 npm 包复制安装。以 Codex 为例:
22
22
 
@@ -92,11 +92,11 @@ main().catch((error) => {
92
92
  | `pageBasePage` | `string` | 否 | `'/'` | 页面访问前缀,所有前端页面路由的基础路径 |
93
93
  | `homePage` | `string` | 否 | - | 应用首页路径 |
94
94
  | `frameBaseDir` | `string` | 否 | - | 框架根目录,通常不需要手动设置 |
95
- | `additionalPublicPaths` | `string | string[]` | 否 | - | 追加静态资源目录,必须传绝对路径 |
95
+ | `additionalPublicPaths` | `string | string[]` | 否 | - | 追加静态资源目录和 Nunjucks 模板查找目录,必须传绝对路径 |
96
96
 
97
97
  框架会自动读取 `config/config.default.ts` 中的配置(如 `port`、`env` 等)。
98
98
 
99
- 静态资源挂载顺序为:框架 `app/public`、业务 `app/public`、`additionalPublicPaths`。当 `buildFE` 输出到自定义目录时,可以用 `additionalPublicPaths` 把该目录交给 Koa 提供访问。
99
+ 静态资源挂载和 Nunjucks 模板查找顺序均为:框架 `app/public`、项目 `app/public`、`additionalPublicPaths`。当 `buildFE` 输出到自定义目录时,可以用 `additionalPublicPaths` 把该目录交给 Koa 提供静态资源访问和模板渲染。
100
100
 
101
101
  ### buildFE 参数说明
102
102
 
@@ -278,9 +278,9 @@ import type {
278
278
 
279
279
  ### 前端多语言
280
280
 
281
- TemplateCore 前端复用 `@tc/ui-react/i18n`。框架内置中文、英文资源,业务项目可以继续追加自己的资源。
281
+ TemplateCore 前端复用 `@tc/ui-react/i18n`。框架内置中文、英文资源,项目可以继续追加自己的资源。
282
282
 
283
- **追加业务语言资源**:
283
+ **追加自定义语言资源**:
284
284
 
285
285
  ```ts
286
286
  import { i18nStore } from '@tc/ui-react/i18n'
@@ -1 +1 @@
1
- var e=e=>JSON.stringify(e).replace(/</g,`\\u003c`).replace(/>/g,`\\u003e`).replace(/&/g,`\\u0026`).replace(/\u2028/g,`\\u2028`).replace(/\u2029/g,`\\u2029`),t=(t=>class{async renderPage(n){t.extends.logger.log(` - render page: `+n.params.page);try{t.extends.renderView(`dist/${n.params.page}.entry.tpl`,n,{projKey:n.query.projk,name:t.options?.name,env:t.envs.get(),basePath:e(`${t.options.pageBasePage}${n.params.page}`),projKeyJson:e(String(n.query.projk??``)),signKey:e(t.config.signKey),options:e(t.options)})}catch{t.extends.generateErrorMessage(`template not found`,{status:404,showError:!0,code:0})}}});module.exports=t;
1
+ var e=e=>JSON.stringify(e).replace(/</g,`\\u003c`).replace(/>/g,`\\u003e`).replace(/&/g,`\\u0026`).replace(/\u2028/g,`\\u2028`).replace(/\u2029/g,`\\u2029`),t=(t=>class{async renderPage(n){t.extends.logger.log(` - render page: `+n.params.page);try{t.extends.renderView(`dist/${n.params.page}.entry.tpl`,n,{projKey:n.query.projk,name:t.options?.name,env:t.envs.get(),basePath:e(`${t.options.pageBasePage}${n.params.page}`),projKeyJson:e(String(n.query.projk??``)),signKey:e(t.config.signKey),options:e(t.options)})}catch(e){console.log(`-------------- render view error --------------`),console.log(e),t.extends.generateErrorMessage(`template not found`,{status:404,showError:!0,code:0})}}});module.exports=t;
@@ -1 +1 @@
1
- const e=require(`../../_virtual/_rolldown/runtime.js`),t=require(`../../packages/core/paths.js`);let n=require(`nunjucks`);n=e.__toESM(n);let r=require(`path`);r=e.__toESM(r);var i=e=>{let i=r.default.join(t.getAppPath(e,`frame`),`./public`),a=n.default.configure(i,{autoescape:!0,throwOnUndefined:!1,trimBlocks:!1,lstripBlocks:!1,noCache:e.envs.get()===`local`,...typeof e.config.nunjucks==`object`?e.config.nunjucks:{}});return e.extends.nunjucksEnv=a,(e,t,n)=>{t.body=a.render(e,Object.assign({},t.state,n))}};module.exports=i;
1
+ const e=require(`../../_virtual/_rolldown/runtime.js`),t=require(`../../packages/core/paths.js`);let n=require(`node:path`);n=e.__toESM(n);let r=require(`nunjucks`);r=e.__toESM(r);var i=e=>{let i=[n.default.resolve(t.getAppPath(e,`frame`),`./public`),n.default.resolve(t.getAppPath(e,`business`),`./public`),...e.options.additionalPublicPaths??[]],a=r.default.configure(i,{autoescape:!0,throwOnUndefined:!1,trimBlocks:!1,lstripBlocks:!1,noCache:e.envs.get()===`local`,...typeof e.config.nunjucks==`object`?e.config.nunjucks:{}});return e.extends.nunjucksEnv=a,(e,t,n)=>{t.body=a.render(e,Object.assign({},t.state,n))}};module.exports=i;
@@ -1 +1 @@
1
- const e=require(`../_virtual/_rolldown/runtime.js`);let t=require(`path`),n=require(`koa-compress`);n=e.__toESM(n);let r=require(`koa-bodyparser`);r=e.__toESM(r);let i=require(`koa-static`);i=e.__toESM(i);var a=(0,r.default)({formLimit:`1000mb`,enableTypes:[`form`,`json`,`text`]}),o=e=>{let r={...e.envs.isLocal()?{maxage:60*1e3}:{maxage:365*24*60*60*1e3}},o=(0,t.resolve)(e.baseDir,`./app/public`),s=(0,t.resolve)(e.frameBaseDir,`./app/public`),c=e.options.additionalPublicPaths??[];c=Array.isArray(c)?c:[c],e.use(e.middlewares.errorHandle),e.use((0,n.default)({threshold:2048})),e.use((0,i.default)(s,r)),e.use((0,i.default)(o,r)),c.forEach(t=>e.use((0,i.default)(t,r))),e.use(a),e.use(e.middlewares.projectHandler),!e.envs.isLocal()&&e.use(e.middlewares.apiSignVerify),e.use(e.middlewares.apiParamsVerify)};module.exports=o;
1
+ const e=require(`../_virtual/_rolldown/runtime.js`),t=require(`../packages/core/paths.js`);let n=require(`koa-compress`);n=e.__toESM(n);let r=require(`path`),i=require(`koa-bodyparser`);i=e.__toESM(i);let a=require(`koa-static`);a=e.__toESM(a);var o=(0,i.default)({formLimit:`1000mb`,enableTypes:[`form`,`json`,`text`]}),s=e=>{let i={...e.envs.isLocal()?{maxage:60*1e3}:{maxage:365*24*60*60*1e3}};e.use(e.middlewares.errorHandle),e.use((0,n.default)({threshold:2048}));let s=(0,r.resolve)(t.getAppPath(e,`business`),`./public`),c=(0,r.resolve)(t.getAppPath(e,`frame`),`./public`),l=e.options.additionalPublicPaths??[];l=Array.isArray(l)?l:[l],e.use((0,a.default)(c,i)),e.use((0,a.default)(s,i)),l.forEach(t=>e.use((0,a.default)(t,i))),e.use(o),e.use(e.middlewares.projectHandler),!e.envs.isLocal()&&e.use(e.middlewares.apiSignVerify),e.use(e.middlewares.apiParamsVerify)};module.exports=s;
@@ -12,8 +12,8 @@ var e = (e) => JSON.stringify(e).replace(/</g, "\\u003c").replace(/>/g, "\\u003e
12
12
  signKey: e(t.config.signKey),
13
13
  options: e(t.options)
14
14
  });
15
- } catch {
16
- t.extends.generateErrorMessage("template not found", {
15
+ } catch (e) {
16
+ console.log("-------------- render view error --------------"), console.log(e), t.extends.generateErrorMessage("template not found", {
17
17
  status: 404,
18
18
  showError: !0,
19
19
  code: 0
@@ -1,9 +1,13 @@
1
1
  import { getAppPath as e } from "../../packages/core/paths.js";
2
- import t from "nunjucks";
3
- import n from "path";
2
+ import t from "node:path";
3
+ import n from "nunjucks";
4
4
  //#region app/extend/render-view.ts
5
5
  var r = (r) => {
6
- let i = n.join(e(r, "frame"), "./public"), a = t.configure(i, {
6
+ let i = [
7
+ t.resolve(e(r, "frame"), "./public"),
8
+ t.resolve(e(r, "business"), "./public"),
9
+ ...r.options.additionalPublicPaths ?? []
10
+ ], a = n.configure(i, {
7
11
  autoescape: !0,
8
12
  throwOnUndefined: !1,
9
13
  trimBlocks: !1,
@@ -1,18 +1,21 @@
1
- import { resolve as e } from "path";
1
+ import { getAppPath as e } from "../packages/core/paths.js";
2
2
  import t from "koa-compress";
3
- import n from "koa-bodyparser";
4
- import r from "koa-static";
3
+ import { resolve as n } from "path";
4
+ import r from "koa-bodyparser";
5
+ import i from "koa-static";
5
6
  //#region app/middleware.ts
6
- var i = n({
7
+ var a = r({
7
8
  formLimit: "1000mb",
8
9
  enableTypes: [
9
10
  "form",
10
11
  "json",
11
12
  "text"
12
13
  ]
13
- }), a = (n) => {
14
- let a = { ...n.envs.isLocal() ? { maxage: 60 * 1e3 } : { maxage: 365 * 24 * 60 * 60 * 1e3 } }, o = e(n.baseDir, "./app/public"), s = e(n.frameBaseDir, "./app/public"), c = n.options.additionalPublicPaths ?? [];
15
- c = Array.isArray(c) ? c : [c], n.use(n.middlewares.errorHandle), n.use(t({ threshold: 2048 })), n.use(r(s, a)), n.use(r(o, a)), c.forEach((e) => n.use(r(e, a))), n.use(i), n.use(n.middlewares.projectHandler), !n.envs.isLocal() && n.use(n.middlewares.apiSignVerify), n.use(n.middlewares.apiParamsVerify);
14
+ }), o = (r) => {
15
+ let o = { ...r.envs.isLocal() ? { maxage: 60 * 1e3 } : { maxage: 365 * 24 * 60 * 60 * 1e3 } };
16
+ r.use(r.middlewares.errorHandle), r.use(t({ threshold: 2048 }));
17
+ let s = n(e(r, "business"), "./public"), c = n(e(r, "frame"), "./public"), l = r.options.additionalPublicPaths ?? [];
18
+ l = Array.isArray(l) ? l : [l], r.use(i(c, o)), r.use(i(s, o)), l.forEach((e) => r.use(i(e, o))), r.use(a), r.use(r.middlewares.projectHandler), !r.envs.isLocal() && r.use(r.middlewares.apiSignVerify), r.use(r.middlewares.apiParamsVerify);
16
19
  };
17
20
  //#endregion
18
- export { a as default };
21
+ export { o as default };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@_tc/template-core",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "A full-stack TypeScript admin framework powered by Koa, React, and Vite - monorepo root",
5
5
  "types": "./types/index.d.ts",
6
6
  "exports": {
@@ -1,3 +1,6 @@
1
1
  import type { Ctx, KoaApp } from "../type";
2
+ /**
3
+ * 挂载模板资源地址 也就是 publish 的地址
4
+ */
2
5
  declare const _default: (app: KoaApp) => (view: string, ctx: Ctx, context?: Record<string, unknown>) => void;
3
6
  export default _default;
@@ -4,5 +4,11 @@ export interface AppPathInfo {
4
4
  type: AppPathType;
5
5
  path: string;
6
6
  }
7
+ /**
8
+ * 获取制定类型的app目录
9
+ */
7
10
  export declare function getAppPath(app: KoaApp, type: AppPathType): string | undefined;
11
+ /**
12
+ * 获取所有app目录
13
+ */
8
14
  export declare function getAppPaths(app: KoaApp): string[];