vona-cli-set-api 1.1.59 → 1.1.62

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/cli/templates/create/project/cabloy-basic/boilerplate/__CABLOY_BASIC__ +0 -0
  2. package/cli/templates/create/project/cabloy-basic/boilerplate/__VONA__ +1 -0
  3. package/cli/templates/create/project/cabloy-basic/boilerplate/src/suite/cabloy-basic/package.json +2 -2
  4. package/cli/templates/create/project/cabloy-start/boilerplate/__CABLOY_START__ +0 -0
  5. package/cli/templates/create/project/cabloy-start/boilerplate/__VONA__ +1 -0
  6. package/cli/templates/create/project/cabloy-start/boilerplate/src/suite/a-home/modules/home-user/src/dto/login.ts +2 -2
  7. package/cli/templates/create/project/cabloy-start/boilerplate/src/suite/a-home/modules/home-user/src/dto/register.ts +2 -2
  8. package/cli/templates/tools/crudBasic/boilerplate/src/entity/{{resourceName}}.tsx_ +2 -2
  9. package/cli/templates/tools/crudStart/boilerplate/src/controller/{{resourceName}}.ts_ +49 -0
  10. package/cli/templates/tools/crudStart/boilerplate/src/dto/{{resourceName}}Create.tsx_ +28 -0
  11. package/cli/templates/tools/crudStart/boilerplate/src/dto/{{resourceName}}SelectReq.tsx_ +21 -0
  12. package/cli/templates/tools/crudStart/boilerplate/src/dto/{{resourceName}}SelectRes.tsx_ +11 -0
  13. package/cli/templates/tools/crudStart/boilerplate/src/dto/{{resourceName}}SelectResItem.tsx_ +36 -0
  14. package/cli/templates/tools/crudStart/boilerplate/src/dto/{{resourceName}}Update.tsx_ +28 -0
  15. package/cli/templates/tools/crudStart/boilerplate/src/dto/{{resourceName}}View.tsx_ +23 -0
  16. package/cli/templates/tools/crudStart/boilerplate/src/entity/{{resourceName}}.tsx_ +49 -0
  17. package/cli/templates/tools/crudStart/boilerplate/src/model/{{resourceName}}.ts_ +8 -0
  18. package/cli/templates/tools/crudStart/boilerplate/src/service/{{resourceName}}.ts_ +35 -0
  19. package/cli/templates/tools/crudStart/boilerplate/test/{{resourceName}}.test.ts_ +43 -0
  20. package/cli/templates/tools/crudStart/snippets/1-package.json.ts +16 -0
  21. package/cli/templates/tools/crudStart/snippets/2-meta.index.ts +48 -0
  22. package/cli/templates/tools/crudStart/snippets/2-meta.version.ts +55 -0
  23. package/cli/templates/tools/crudStart/snippets/3-en-us.ts +30 -0
  24. package/cli/templates/tools/crudStart/snippets/4-zh-cn.ts +13 -0
  25. package/cli/templates/tools/crudStart/utils.ts +27 -0
  26. package/dist/index.js +88 -4
  27. package/dist/lib/bean/cli.tools.crudStart.d.ts +15 -0
  28. package/dist/lib/beans.d.ts +2 -0
  29. package/dist/lib/command/tools.crudStart.d.ts +34 -0
  30. package/dist/lib/commands.d.ts +33 -0
  31. package/dist-cli/templates/tools/crudStart/snippets/1-package.json.js +9 -0
  32. package/dist-cli/templates/tools/crudStart/snippets/2-meta.index.js +35 -0
  33. package/dist-cli/templates/tools/crudStart/snippets/2-meta.version.js +41 -0
  34. package/dist-cli/templates/tools/crudStart/snippets/3-en-us.js +20 -0
  35. package/dist-cli/templates/tools/crudStart/snippets/4-zh-cn.js +10 -0
  36. package/dist-cli/templates/tools/crudStart/utils.js +13 -0
  37. package/package.json +2 -2
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-suite-cabloy-basic",
3
- "version": "5.1.31",
3
+ "version": "5.1.32",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "",
6
6
  "author": "",
@@ -11,7 +11,7 @@
11
11
  },
12
12
  "dependencies": {
13
13
  "vona-module-basic-siteadmin": "workspace:^",
14
- "vona-suite-a-cabloy": "^5.1.14"
14
+ "vona-suite-a-cabloy": "^5.1.15"
15
15
  },
16
16
  "title": "cabloy-basic"
17
17
  }
@@ -3,7 +3,7 @@ import type { IDecoratorDtoOptions } from 'vona-module-a-web';
3
3
  import { DtoCaptchaVerify } from 'vona-module-a-captcha';
4
4
  import { Api, v } from 'vona-module-a-openapiutils';
5
5
  import { Dto } from 'vona-module-a-web';
6
- import { ZovaRender } from 'zova-rest-cabloy-basic-admin';
6
+ import { ZovaRender } from 'zova-rest-cabloy-start-admin';
7
7
 
8
8
  export interface IDtoOptionsLogin extends IDecoratorDtoOptions {}
9
9
 
@@ -18,7 +18,7 @@ export class DtoLogin {
18
18
  @Api.field(
19
19
  v.required(),
20
20
  ZovaRender.layout({ iconPrefix: ':editor:code-block' }),
21
- ZovaRender.field('basic-captcha:formFieldCaptcha'),
21
+ ZovaRender.field('start-captcha:formFieldCaptcha'),
22
22
  )
23
23
  captcha: DtoCaptchaVerify;
24
24
  }
@@ -3,7 +3,7 @@ import type { IDecoratorDtoOptions } from 'vona-module-a-web';
3
3
  import { DtoCaptchaVerify } from 'vona-module-a-captcha';
4
4
  import { Api, v } from 'vona-module-a-openapiutils';
5
5
  import { Dto } from 'vona-module-a-web';
6
- import { ZovaRender } from 'zova-rest-cabloy-basic-admin';
6
+ import { ZovaRender } from 'zova-rest-cabloy-start-admin';
7
7
 
8
8
  export interface IDtoOptionsRegister extends IDecoratorDtoOptions {}
9
9
 
@@ -23,6 +23,6 @@ export class DtoRegister {
23
23
  @Api.field(v.min(6), v.max(20))
24
24
  passwordConfirm: string;
25
25
 
26
- @Api.field(ZovaRender.field('basic-captcha:formFieldCaptcha'))
26
+ @Api.field(ZovaRender.field('start-captcha:formFieldCaptcha'))
27
27
  captcha: DtoCaptchaVerify;
28
28
  }
@@ -12,6 +12,8 @@ export interface IEntityOptions<%=argv.resourceNameCapitalize%> extends IDecorat
12
12
  openapi: { title: $locale('<%=argv.resourceNameCapitalize%>') },
13
13
  fields: {
14
14
  id: $makeMetadata(ZovaRender.order(1, 'core')),
15
+ iid: $makeMetadata(ZovaRender.visible(false)),
16
+ deleted: $makeMetadata(ZovaRender.visible(false)),
15
17
  createdAt: $makeMetadata(
16
18
  ZovaRender.order(-2, 'max'),
17
19
  ZovaRender.field('basic-date:formFieldDate'),
@@ -26,8 +28,6 @@ export interface IEntityOptions<%=argv.resourceNameCapitalize%> extends IDecorat
26
28
  ZovaRender.field('basic-date:formFieldDateRange', undefined, 'filter'),
27
29
  v.filterTransform('a-web:dateRange'),
28
30
  ),
29
- deleted: $makeMetadata(ZovaRender.visible(false)),
30
- iid: $makeMetadata(ZovaRender.visible(false)),
31
31
  },
32
32
  })
33
33
  export class Entity<%=argv.resourceNameCapitalize%> extends EntityBase {
@@ -0,0 +1,49 @@
1
+ import type { TableIdentity } from 'table-identity';
2
+ import type { IQueryParams } from 'vona-module-a-orm';
3
+ import type { IDecoratorControllerOptions } from 'vona-module-a-web';
4
+
5
+ import { BeanBase } from 'vona';
6
+ import { Api, Resource, v } from 'vona-module-a-openapiutils';
7
+ import { Arg, Controller, Web } from 'vona-module-a-web';
8
+
9
+ import type { Model<%=argv.resourceNameCapitalize%> } from '../model/<%=argv.resourceName%>.ts';
10
+
11
+ import { Dto<%=argv.resourceNameCapitalize%>Create } from '../dto/<%=argv.resourceName%>Create.tsx';
12
+ import { Dto<%=argv.resourceNameCapitalize%>SelectReq } from '../dto/<%=argv.resourceName%>SelectReq.tsx';
13
+ import { Dto<%=argv.resourceNameCapitalize%>SelectRes } from '../dto/<%=argv.resourceName%>SelectRes.tsx';
14
+ import { Dto<%=argv.resourceNameCapitalize%>Update } from '../dto/<%=argv.resourceName%>Update.tsx';
15
+ import { Dto<%=argv.resourceNameCapitalize%>View } from '../dto/<%=argv.resourceName%>View.tsx';
16
+
17
+ export interface IControllerOptions<%=argv.resourceNameCapitalize%> extends IDecoratorControllerOptions {}
18
+
19
+ @Controller<IControllerOptions<%=argv.resourceNameCapitalize%>>('<%=argv.resourceName%>')
20
+ @Resource()
21
+ export class Controller<%=argv.resourceNameCapitalize%> extends BeanBase {
22
+ @Web.post()
23
+ @Api.body(v.tableIdentity())
24
+ async create(@Arg.body() <%=argv.resourceName%>: Dto<%=argv.resourceNameCapitalize%>Create): Promise<TableIdentity> {
25
+ return (await this.scope.service.<%=argv.resourceName%>.create(<%=argv.resourceName%>)).id;
26
+ }
27
+
28
+ @Web.get()
29
+ @Api.body(Dto<%=argv.resourceNameCapitalize%>SelectRes)
30
+ async select(@Arg.filter(Dto<%=argv.resourceNameCapitalize%>SelectReq) params: IQueryParams<Model<%=argv.resourceNameCapitalize%>>): Promise<Dto<%=argv.resourceNameCapitalize%>SelectRes> {
31
+ return await this.scope.service.<%=argv.resourceName%>.select(params);
32
+ }
33
+
34
+ @Web.get(':id')
35
+ @Api.body(v.optional(), v.object(Dto<%=argv.resourceNameCapitalize%>View))
36
+ async view(@Arg.param('id', v.tableIdentity()) id: TableIdentity): Promise<Dto<%=argv.resourceNameCapitalize%>View | undefined> {
37
+ return await this.scope.service.<%=argv.resourceName%>.view(id);
38
+ }
39
+
40
+ @Web.patch(':id')
41
+ async update(@Arg.param('id', v.tableIdentity()) id: TableIdentity, @Arg.body() <%=argv.resourceName%>: Dto<%=argv.resourceNameCapitalize%>Update) {
42
+ return await this.scope.service.<%=argv.resourceName%>.update(id, <%=argv.resourceName%>);
43
+ }
44
+
45
+ @Web.delete(':id')
46
+ async delete(@Arg.param('id', v.tableIdentity()) id: TableIdentity) {
47
+ return await this.scope.service.<%=argv.resourceName%>.delete(id);
48
+ }
49
+ }
@@ -0,0 +1,28 @@
1
+ import type { IDecoratorDtoOptions } from 'vona-module-a-web';
2
+
3
+ import { $Dto } from 'vona-module-a-orm';
4
+ import { Dto } from 'vona-module-a-web';
5
+ import { ZovaRender } from 'zova-rest-cabloy-start-admin';
6
+
7
+ import { Model<%=argv.resourceNameCapitalize%> } from '../model/<%=argv.resourceName%>.ts';
8
+
9
+ export interface IDtoOptions<%=argv.resourceNameCapitalize%>Create extends IDecoratorDtoOptions {}
10
+
11
+ @Dto<IDtoOptions<%=argv.resourceNameCapitalize%>Create>({
12
+ blocks: [
13
+ ZovaRender.block('start-pageentry:blockPageEntry', {
14
+ blocks: [
15
+ ZovaRender.block('start-pageentry:blockForm'),
16
+ ZovaRender.block('start-pageentry:blockToolbarRow', {
17
+ actions: [
18
+ ZovaRender.formActionRow('start-form:actionSubmit', {
19
+ permission: { action: 'update', formScene: ['create', 'edit'] },
20
+ }),
21
+ ZovaRender.formActionRow('start-form:actionBack', { permission: { public: true } }),
22
+ ],
23
+ }),
24
+ ],
25
+ }),
26
+ ],
27
+ })
28
+ export class Dto<%=argv.resourceNameCapitalize%>Create extends $Dto.create(() => Model<%=argv.resourceNameCapitalize%>) {}
@@ -0,0 +1,21 @@
1
+ import type { IDecoratorDtoOptions } from 'vona-module-a-web';
2
+
3
+ import { Api, v } from 'vona-module-a-openapiutils';
4
+ import { $Dto } from 'vona-module-a-orm';
5
+ import { Dto } from 'vona-module-a-web';
6
+ import z from 'zod';
7
+
8
+ import { Entity<%=argv.resourceNameCapitalize%> } from '../entity/<%=argv.resourceName%>.tsx';
9
+
10
+ export interface IDtoOptions<%=argv.resourceNameCapitalize%>SelectReq extends IDecoratorDtoOptions {}
11
+
12
+ @Dto<IDtoOptions<%=argv.resourceNameCapitalize%>SelectReq>({
13
+ openapi: { filter: { table: '<%=argv.moduleResourceName%>' } },
14
+ fields: {
15
+ createdAt: z.string().optional(),
16
+ },
17
+ })
18
+ export class Dto<%=argv.resourceNameCapitalize%>SelectReq extends $Dto.queryPage(Entity<%=argv.resourceNameCapitalize%>, ['name', 'createdAt']) {
19
+ @Api.field(v.optional())
20
+ name?: string;
21
+ }
@@ -0,0 +1,11 @@
1
+ import type { IDecoratorDtoOptions } from 'vona-module-a-web';
2
+
3
+ import { $Dto } from 'vona-module-a-orm';
4
+ import { Dto } from 'vona-module-a-web';
5
+
6
+ import { Dto<%=argv.resourceNameCapitalize%>SelectResItem } from './<%=argv.resourceName%>SelectResItem.tsx';
7
+
8
+ export interface IDtoOptions<%=argv.resourceNameCapitalize%>SelectRes extends IDecoratorDtoOptions {}
9
+
10
+ @Dto<IDtoOptions<%=argv.resourceNameCapitalize%>SelectRes>()
11
+ export class Dto<%=argv.resourceNameCapitalize%>SelectRes extends $Dto.listAndCount(Dto<%=argv.resourceNameCapitalize%>SelectResItem) {}
@@ -0,0 +1,36 @@
1
+ import type { IDecoratorDtoOptions } from 'vona-module-a-web';
2
+
3
+ import { Api, v } from 'vona-module-a-openapiutils';
4
+ import { $Dto } from 'vona-module-a-orm';
5
+ import { Dto } from 'vona-module-a-web';
6
+ import { ZovaRender } from 'zova-rest-cabloy-start-admin';
7
+
8
+ import { $locale } from '../.metadata/locales.ts';
9
+ import { Model<%=argv.resourceNameCapitalize%> } from '../model/<%=argv.resourceName%>.ts';
10
+
11
+ export interface IDtoOptions<%=argv.resourceNameCapitalize%>SelectResItem extends IDecoratorDtoOptions {}
12
+
13
+ @Dto<IDtoOptions<%=argv.resourceNameCapitalize%>SelectResItem>({
14
+ blocks: [
15
+ ZovaRender.block('start-page:blockPage', {
16
+ blocks: [
17
+ ZovaRender.block('start-page:blockFilter'),
18
+ ZovaRender.block('start-page:blockToolbarBulk', {
19
+ actions: [ZovaRender.tableActionBulk('start-table:actionCreate')],
20
+ }),
21
+ ZovaRender.block('start-page:blockTable'),
22
+ ZovaRender.block('start-page:blockPager'),
23
+ ],
24
+ }),
25
+ ],
26
+ })
27
+ export class Dto<%=argv.resourceNameCapitalize%>SelectResItem extends $Dto.get(() => Model<%=argv.resourceNameCapitalize%>) {
28
+ @Api.field(
29
+ v.title($locale('Operations')),
30
+ ZovaRender.order(1, 'max'),
31
+ ZovaRender.cell('start-table:actionOperationsRow', {
32
+ actions: [ZovaRender.tableActionRow('start-table:actionUpdate'), ZovaRender.tableActionRow('start-table:actionDelete')],
33
+ }),
34
+ )
35
+ _operationsRow?: unknown;
36
+ }
@@ -0,0 +1,28 @@
1
+ import type { IDecoratorDtoOptions } from 'vona-module-a-web';
2
+
3
+ import { $Dto } from 'vona-module-a-orm';
4
+ import { Dto } from 'vona-module-a-web';
5
+ import { ZovaRender } from 'zova-rest-cabloy-start-admin';
6
+
7
+ import { Model<%=argv.resourceNameCapitalize%> } from '../model/<%=argv.resourceName%>.ts';
8
+
9
+ export interface IDtoOptions<%=argv.resourceNameCapitalize%>Update extends IDecoratorDtoOptions {}
10
+
11
+ @Dto<IDtoOptions<%=argv.resourceNameCapitalize%>Update>({
12
+ blocks: [
13
+ ZovaRender.block('start-pageentry:blockPageEntry', {
14
+ blocks: [
15
+ ZovaRender.block('start-pageentry:blockForm'),
16
+ ZovaRender.block('start-pageentry:blockToolbarRow', {
17
+ actions: [
18
+ ZovaRender.formActionRow('start-form:actionSubmit', {
19
+ permission: { action: 'update', formScene: ['create', 'edit'] },
20
+ }),
21
+ ZovaRender.formActionRow('start-form:actionBack', { permission: { public: true } }),
22
+ ],
23
+ }),
24
+ ],
25
+ }),
26
+ ],
27
+ })
28
+ export class Dto<%=argv.resourceNameCapitalize%>Update extends $Dto.update(() => Model<%=argv.resourceNameCapitalize%>) {}
@@ -0,0 +1,23 @@
1
+ import type { IDecoratorDtoOptions } from 'vona-module-a-web';
2
+
3
+ import { $Dto } from 'vona-module-a-orm';
4
+ import { Dto } from 'vona-module-a-web';
5
+ import { ZovaRender } from 'zova-rest-cabloy-start-admin';
6
+
7
+ import { Model<%=argv.resourceNameCapitalize%> } from '../model/<%=argv.resourceName%>.ts';
8
+
9
+ export interface IDtoOptions<%=argv.resourceNameCapitalize%>View extends IDecoratorDtoOptions {}
10
+
11
+ @Dto<IDtoOptions<%=argv.resourceNameCapitalize%>View>({
12
+ blocks: [
13
+ ZovaRender.block('start-pageentry:blockPageEntry', {
14
+ blocks: [
15
+ ZovaRender.block('start-pageentry:blockForm'),
16
+ ZovaRender.block('start-pageentry:blockToolbarRow', {
17
+ actions: [ZovaRender.formActionRow('start-form:actionBack', { permission: { public: true } })],
18
+ }),
19
+ ],
20
+ }),
21
+ ],
22
+ })
23
+ export class Dto<%=argv.resourceNameCapitalize%>View extends $Dto.get(() => Model<%=argv.resourceNameCapitalize%>) {}
@@ -0,0 +1,49 @@
1
+ import type { IDecoratorEntityOptions } from 'vona-module-a-orm';
2
+
3
+ import { $makeMetadata, Api, v } from 'vona-module-a-openapiutils';
4
+ import { Entity, EntityBase } from 'vona-module-a-orm';
5
+ import { ZovaRender } from 'zova-rest-cabloy-start-admin';
6
+
7
+ import { $locale } from '../.metadata/locales.ts';
8
+
9
+ export interface IEntityOptions<%=argv.resourceNameCapitalize%> extends IDecoratorEntityOptions {}
10
+
11
+ @Entity<IEntityOptions<%=argv.resourceNameCapitalize%>>('<%=argv.moduleResourceName%>', {
12
+ openapi: { title: $locale('<%=argv.resourceNameCapitalize%>') },
13
+ fields: {
14
+ id: $makeMetadata(ZovaRender.order(1, 'core')),
15
+ iid: $makeMetadata(ZovaRender.visible(false)),
16
+ deleted: $makeMetadata(ZovaRender.visible(false)),
17
+ createdAt: $makeMetadata(
18
+ ZovaRender.order(-2, 'max'),
19
+ ZovaRender.field('start-date:formFieldDate'),
20
+ ZovaRender.cell('start-date:date'),
21
+ ZovaRender.field('start-date:formFieldDateRange', undefined, 'filter'),
22
+ v.filterTransform('a-web:dateRange'),
23
+ ),
24
+ updatedAt: $makeMetadata(
25
+ ZovaRender.order(-1, 'max'),
26
+ ZovaRender.field('start-date:formFieldDate'),
27
+ ZovaRender.cell('start-date:date'),
28
+ ZovaRender.field('start-date:formFieldDateRange', undefined, 'filter'),
29
+ v.filterTransform('a-web:dateRange'),
30
+ ),
31
+ },
32
+ })
33
+ export class Entity<%=argv.resourceNameCapitalize%> extends EntityBase {
34
+ @Api.field(
35
+ v.title($locale('Name')),
36
+ v.required(),
37
+ v.min(2),
38
+ ZovaRender.order(1),
39
+ ZovaRender.cell('start-table:actionView'),
40
+ )
41
+ name: string;
42
+
43
+ @Api.field(
44
+ v.title($locale('Description')),
45
+ v.optional(),
46
+ ZovaRender.order(2),
47
+ )
48
+ description?: string;
49
+ }
@@ -0,0 +1,8 @@
1
+ import type { IDecoratorModelOptions } from 'vona-module-a-orm';
2
+ import { BeanModelBase, Model } from 'vona-module-a-orm';
3
+ import { Entity<%=argv.resourceNameCapitalize%> } from '../entity/<%=argv.resourceName%>.tsx';
4
+
5
+ export interface IModelOptions<%=argv.resourceNameCapitalize%> extends IDecoratorModelOptions<Entity<%=argv.resourceNameCapitalize%>> {}
6
+
7
+ @Model<IModelOptions<%=argv.resourceNameCapitalize%>>({ entity: Entity<%=argv.resourceNameCapitalize%> })
8
+ export class Model<%=argv.resourceNameCapitalize%> extends BeanModelBase<Entity<%=argv.resourceNameCapitalize%>> {}
@@ -0,0 +1,35 @@
1
+ import type { TableIdentity } from 'table-identity';
2
+ import type { IQueryParams } from 'vona-module-a-orm';
3
+
4
+ import { BeanBase } from 'vona';
5
+ import { Service } from 'vona-module-a-bean';
6
+
7
+ import type { Dto<%=argv.resourceNameCapitalize%>Create } from '../dto/<%=argv.resourceName%>Create.tsx';
8
+ import type { Dto<%=argv.resourceNameCapitalize%>SelectRes } from '../dto/<%=argv.resourceName%>SelectRes.tsx';
9
+ import type { Dto<%=argv.resourceNameCapitalize%>Update } from '../dto/<%=argv.resourceName%>Update.tsx';
10
+ import type { Dto<%=argv.resourceNameCapitalize%>View } from '../dto/<%=argv.resourceName%>View.tsx';
11
+ import type { Entity<%=argv.resourceNameCapitalize%> } from '../entity/<%=argv.resourceName%>.tsx';
12
+ import type { Model<%=argv.resourceNameCapitalize%> } from '../model/<%=argv.resourceName%>.ts';
13
+
14
+ @Service()
15
+ export class Service<%=argv.resourceNameCapitalize%> extends BeanBase {
16
+ async create(<%=argv.resourceName%>: Dto<%=argv.resourceNameCapitalize%>Create): Promise<Entity<%=argv.resourceNameCapitalize%>> {
17
+ return await this.scope.model.<%=argv.resourceName%>.insert(<%=argv.resourceName%>);
18
+ }
19
+
20
+ async select(params?: IQueryParams<Model<%=argv.resourceNameCapitalize%>>): Promise<Dto<%=argv.resourceNameCapitalize%>SelectRes> {
21
+ return await this.scope.model.<%=argv.resourceName%>.selectAndCount(params);
22
+ }
23
+
24
+ async view(id: TableIdentity): Promise<Dto<%=argv.resourceNameCapitalize%>View | undefined> {
25
+ return await this.scope.model.<%=argv.resourceName%>.getById(id);
26
+ }
27
+
28
+ async update(id: TableIdentity, <%=argv.resourceName%>: Dto<%=argv.resourceNameCapitalize%>Update) {
29
+ return await this.scope.model.<%=argv.resourceName%>.updateById(id, <%=argv.resourceName%>);
30
+ }
31
+
32
+ async delete(id: TableIdentity) {
33
+ return await this.scope.model.<%=argv.resourceName%>.deleteById(id);
34
+ }
35
+ }
@@ -0,0 +1,43 @@
1
+ import type { Dto<%=argv.resourceNameCapitalize%>Create, Dto<%=argv.resourceNameCapitalize%>SelectRes, Dto<%=argv.resourceNameCapitalize%>Update, Entity<%=argv.resourceNameCapitalize%> } from 'vona-module-<%=argv.moduleInfo.relativeName%>';
2
+ import assert from 'node:assert';
3
+ import { describe, it } from 'node:test';
4
+ import { app } from 'vona-mock';
5
+
6
+ describe('<%=argv.resourceName%>.test.ts', () => {
7
+ it('action:<%=argv.resourceName%>', async () => {
8
+ await app.bean.executor.mockCtx(async () => {
9
+ // data
10
+ const data: Dto<%=argv.resourceNameCapitalize%>Create = {
11
+ name: '__Tom__',
12
+ description: 'This is a test',
13
+ };
14
+ const dataUpdate: Dto<%=argv.resourceNameCapitalize%>Update = {
15
+ name: '__TomNew__',
16
+ description: 'This is a test',
17
+ };
18
+ // login
19
+ await app.bean.passport.signinMock();
20
+ // create
21
+ const <%=argv.resourceName%>Id = await app.bean.executor.performAction('post', '<%=argv.moduleActionPathRaw%>', { body: data });
22
+ assert.equal(!!<%=argv.resourceName%>Id, true);
23
+ // findMany
24
+ const selectRes: Dto<%=argv.resourceNameCapitalize%>SelectRes = await app.bean.executor.performAction('get', '<%=argv.moduleActionPathRaw%>');
25
+ assert.equal(selectRes.list.findIndex(item => item.name === data.name) > -1, true);
26
+ // update
27
+ await app.bean.executor.performAction('patch', '<%=argv.moduleActionPathRaw%>/:id', {
28
+ params: { id: <%=argv.resourceName%>Id },
29
+ body: dataUpdate,
30
+ });
31
+ // findOne
32
+ let <%=argv.resourceName%>: Entity<%=argv.resourceNameCapitalize%> = await app.bean.executor.performAction('get', '<%=argv.moduleActionPathRaw%>/:id', { params: { id: <%=argv.resourceName%>Id } });
33
+ assert.equal(<%=argv.resourceName%>.name, dataUpdate.name);
34
+ // delete
35
+ await app.bean.executor.performAction('delete', '<%=argv.moduleActionPathRaw%>/:id', { params: { id: <%=argv.resourceName%>.id } });
36
+ // findOne
37
+ <%=argv.resourceName%> = await app.bean.executor.performAction('get', '<%=argv.moduleActionPathRaw%>/:id', { params: { id: <%=argv.resourceName%>.id } });
38
+ assert.equal(<%=argv.resourceName%>, undefined);
39
+ // logout
40
+ await app.bean.passport.signout();
41
+ });
42
+ });
43
+ });
@@ -0,0 +1,16 @@
1
+ import { metadataCustomSnippet } from '@cabloy/cli';
2
+
3
+ declare module '@cabloy/cli' {
4
+ interface ICommandArgv {
5
+ fileVersion: number;
6
+ }
7
+ }
8
+
9
+ export default metadataCustomSnippet({
10
+ file: 'package.json',
11
+ language: 'json',
12
+ async transform({ ast, argv }) {
13
+ argv.fileVersion = ast.vonaModule.fileVersion = 1 + (ast.vonaModule.fileVersion ?? 0);
14
+ return ast;
15
+ },
16
+ });
@@ -0,0 +1,48 @@
1
+ import { metadataCustomSnippet } from '@cabloy/cli';
2
+ import { catchError } from '@cabloy/utils';
3
+ import fs from 'node:fs';
4
+
5
+ declare module '@cabloy/cli' {
6
+ interface ICommandArgv {
7
+ module: string;
8
+ }
9
+ }
10
+
11
+ const __snippet_import1 = "import { $tableColumns } from 'vona-module-a-ormutils';";
12
+ const __snippet_update = "...$tableColumns('<%=argv.moduleResourceName%>', 'name'),";
13
+
14
+ export default metadataCustomSnippet({
15
+ file: 'src/bean/meta.index.ts',
16
+ language: 'plain',
17
+ format: true,
18
+ init: async ({ cli, argv, targetFile }) => {
19
+ await catchError(() => {
20
+ return cli.helper.invokeCli(
21
+ [':create:bean', 'meta', 'index', `--module=${argv.module}`, '--nometadata', '--noformat'],
22
+ {
23
+ cwd: argv.projectPath,
24
+ },
25
+ );
26
+ });
27
+ return fs.readFileSync(targetFile).toString('utf8');
28
+ },
29
+ async transform({ cli, ast }) {
30
+ // import1
31
+ if (!ast.includes(__snippet_import1)) {
32
+ const code = await cli.template.renderContent({ content: __snippet_import1 });
33
+ ast = ast.replace(
34
+ "import { Meta } from 'vona-module-a-meta';",
35
+ `import { Meta } from 'vona-module-a-meta';\n${code}`,
36
+ );
37
+ }
38
+ // update
39
+ const code = await cli.template.renderContent({ content: __snippet_update });
40
+ if (ast.includes('indexes: {}')) {
41
+ ast = ast.replace('indexes: {', `indexes: {\n ${code}\n `);
42
+ } else {
43
+ ast = ast.replace('indexes: {', `indexes: {\n ${code}`);
44
+ }
45
+ // ok
46
+ return ast;
47
+ },
48
+ });
@@ -0,0 +1,55 @@
1
+ import { metadataCustomSnippet } from '@cabloy/cli';
2
+ import { catchError } from '@cabloy/utils';
3
+ import fs from 'node:fs';
4
+
5
+ declare module '@cabloy/cli' {
6
+ interface ICommandArgv {
7
+ module: string;
8
+ }
9
+ }
10
+
11
+ const __snippet_update = `if (options.version === <%=argv.fileVersion%>) {
12
+ const entity<%=argv.resourceNameCapitalize%> = this.scope.entity.<%=argv.resourceName%>;
13
+ await this.bean.model.createTable(entity<%=argv.resourceNameCapitalize%>.$table, table => {
14
+ table.comment(entity<%=argv.resourceNameCapitalize%>.$comment.$table);
15
+ table.basicFields();
16
+ table.string(entity<%=argv.resourceNameCapitalize%>.name, 50).comment(entity<%=argv.resourceNameCapitalize%>.$comment.name);
17
+ table.string(entity<%=argv.resourceNameCapitalize%>.description, 255).comment(entity<%=argv.resourceNameCapitalize%>.$comment.description);
18
+ });
19
+ }
20
+ `;
21
+
22
+ export default metadataCustomSnippet({
23
+ file: 'src/bean/meta.version.ts',
24
+ language: 'gogo',
25
+ format: true,
26
+ init: async ({ cli, argv, targetFile }) => {
27
+ await catchError(() => {
28
+ return cli.helper.invokeCli(
29
+ [
30
+ ':create:bean',
31
+ 'meta',
32
+ 'version',
33
+ `--module=${argv.module}`,
34
+ '--nometadata',
35
+ '--noformat',
36
+ ],
37
+ {
38
+ cwd: argv.projectPath,
39
+ },
40
+ );
41
+ });
42
+ return fs.readFileSync(targetFile).toString('utf8');
43
+ },
44
+ async transform({ cli, ast }) {
45
+ // update
46
+ ast.replace(
47
+ 'async update(_options: IMetaVersionUpdateOptions) {$$$1}',
48
+ 'async update(options: IMetaVersionUpdateOptions) {$$$1}',
49
+ );
50
+ const code = await cli.template.renderContent({ content: __snippet_update });
51
+ ast.replace('async update($$$0) {$$$1}', `async update($$$0) {\n $$$1\n ${code}}`);
52
+ // ok
53
+ return ast;
54
+ },
55
+ });
@@ -0,0 +1,30 @@
1
+ import { metadataCustomSnippet } from '@cabloy/cli';
2
+ import { catchError } from '@cabloy/utils';
3
+ import fs from 'node:fs';
4
+
5
+ import { locale_transform } from '../utils.ts';
6
+
7
+ const __resources = { Name: 'Name', Description: 'Description', Operations: 'Operations' };
8
+
9
+ declare module '@cabloy/cli' {
10
+ interface ICommandArgv {
11
+ module: string;
12
+ resourceNameCapitalize: string;
13
+ }
14
+ }
15
+
16
+ export default metadataCustomSnippet({
17
+ file: 'src/config/locale/en-us.ts',
18
+ language: 'plain',
19
+ init: async ({ cli, argv, targetFile }) => {
20
+ await catchError(() => {
21
+ return cli.helper.invokeCli([':init:locale', argv.module, '--nometadata', '--noformat'], {
22
+ cwd: argv.projectPath,
23
+ });
24
+ });
25
+ return fs.readFileSync(targetFile).toString('utf8');
26
+ },
27
+ async transform({ ast, argv }) {
28
+ return locale_transform({ ast, argv, resources: __resources });
29
+ },
30
+ });
@@ -0,0 +1,13 @@
1
+ import { metadataCustomSnippet } from '@cabloy/cli';
2
+
3
+ import { locale_transform } from '../utils.ts';
4
+
5
+ const __resources = { Name: '名称', Description: '描述', Operations: '操作' };
6
+
7
+ export default metadataCustomSnippet({
8
+ file: 'src/config/locale/zh-cn.ts',
9
+ language: 'plain',
10
+ async transform({ ast, argv }) {
11
+ return locale_transform({ ast, argv, resources: __resources });
12
+ },
13
+ });
@@ -0,0 +1,27 @@
1
+ import { evaluateSimple } from '@cabloy/utils';
2
+
3
+ export async function locale_transform({
4
+ ast,
5
+ argv,
6
+ resources,
7
+ }: {
8
+ ast: string;
9
+ argv: any;
10
+ resources: any;
11
+ }) {
12
+ const values = evaluateSimple(ast.replace('export default', '').replace(';', ''));
13
+ resources = Object.assign(
14
+ {},
15
+ resources,
16
+ { [argv.resourceNameCapitalize]: argv.resourceNameCapitalize },
17
+ values,
18
+ );
19
+ const keys = Object.keys(resources).sort();
20
+ let content = '';
21
+ for (const key of keys) {
22
+ content += ` ${key}: '${resources[key].replaceAll("'", "\\'")}',\n`;
23
+ }
24
+ ast = `export default {\n${content}};\n`;
25
+ // ok
26
+ return ast;
27
+ }
package/dist/index.js CHANGED
@@ -1972,9 +1972,10 @@ class CliToolsCrud extends BeanCliBase {
1972
1972
  // noformat
1973
1973
  // argv.noformat = true;
1974
1974
  // ssrSiteModuleName
1975
- argv.ssrSiteModuleName = fs.existsSync(path.join(argv.projectPath, 'src/suite/cabloy-start')) ? 'vona-module-start-siteadmin' : 'vona-module-basic-siteadmin';
1976
- argv.ssrSiteOnionName = fs.existsSync(path.join(argv.projectPath, 'src/suite/cabloy-start')) ? 'start-siteadmin:admin' : 'basic-siteadmin:admin';
1977
- argv.ssrSiteGroupName = fs.existsSync(path.join(argv.projectPath, 'src/suite/cabloy-start')) ? 'start-siteadmin:management' : 'basic-siteadmin:management';
1975
+ const isCabloyStart = fs.existsSync(path.join(argv.projectPath, '__CABLOY_START__'));
1976
+ argv.ssrSiteModuleName = isCabloyStart ? 'vona-module-start-siteadmin' : 'vona-module-basic-siteadmin';
1977
+ argv.ssrSiteOnionName = isCabloyStart ? 'start-siteadmin:admin' : 'basic-siteadmin:admin';
1978
+ argv.ssrSiteGroupName = isCabloyStart ? 'start-siteadmin:management' : 'basic-siteadmin:management';
1978
1979
  // module name/info
1979
1980
  const moduleName = argv.module;
1980
1981
  argv.moduleInfo = this.helper.parseModuleInfo(moduleName);
@@ -1994,7 +1995,8 @@ class CliToolsCrud extends BeanCliBase {
1994
1995
  throw new Error(`resource exists: ${resourceName}`);
1995
1996
  }
1996
1997
  // tools:crud
1997
- await this.helper.invokeCli([':tools:crudBasic', resourceName, `--module=${argv.module}`, '--nometadata'], {
1998
+ const commandName = isCabloyStart ? ':tools:crudStart' : ':tools:crudBasic';
1999
+ await this.helper.invokeCli([commandName, resourceName, `--module=${argv.module}`, '--nometadata'], {
1998
2000
  cwd: argv.projectPath
1999
2001
  });
2000
2002
  // render
@@ -2059,6 +2061,52 @@ class CliToolsCrudBasic extends BeanCliBase {
2059
2061
  }
2060
2062
  }
2061
2063
 
2064
+ class CliToolsCrudStart extends BeanCliBase {
2065
+ async execute() {
2066
+ const {
2067
+ argv
2068
+ } = this.context;
2069
+ // super
2070
+ await super.execute();
2071
+ // noformat
2072
+ // argv.noformat = true;
2073
+ // module name/info
2074
+ const moduleName = argv.module;
2075
+ argv.moduleInfo = this.helper.parseModuleInfo(moduleName);
2076
+ // check if exists
2077
+ const _module = this.helper.findModule(moduleName);
2078
+ if (!_module) {
2079
+ throw new Error(`module does not exist: ${moduleName}`);
2080
+ }
2081
+ // target dir
2082
+ const targetDir = await this.helper.ensureDir(_module.root);
2083
+ // resourceName
2084
+ const resourceName = argv.resourceName;
2085
+ argv.resourceNameCapitalize = this.helper.firstCharToUpperCase(resourceName);
2086
+ // moduleResourceName
2087
+ argv.moduleResourceName = this.helper.combineModuleNameAndResource(argv.moduleInfo.relativeName, argv.resourceName);
2088
+ argv.moduleActionPathRaw = combineApiPathControllerAndActionRaw(moduleName, resourceName, '', true);
2089
+ // controller
2090
+ const controllerFile = path.join(targetDir, 'src/controller', `${resourceName}.ts`);
2091
+ if (fs.existsSync(controllerFile)) {
2092
+ throw new Error(`resource exists: ${resourceName}`);
2093
+ }
2094
+ // render
2095
+ await this.template.renderBoilerplateAndSnippets({
2096
+ targetDir,
2097
+ setName: __ThisSetName__,
2098
+ snippetsPath: 'tools/crudStart/snippets',
2099
+ boilerplatePath: 'tools/crudStart/boilerplate'
2100
+ });
2101
+ // tools.metadata
2102
+ if (!argv.nometadata) {
2103
+ await this.helper.invokeCli([':tools:metadata', moduleName], {
2104
+ cwd: argv.projectPath
2105
+ });
2106
+ }
2107
+ }
2108
+ }
2109
+
2062
2110
  class CliToolsDeps extends BeanCliBase {
2063
2111
  async execute() {
2064
2112
  const {
@@ -2868,6 +2916,7 @@ const beans = {
2868
2916
  'tools.deps': CliToolsDeps,
2869
2917
  'tools.metadata': CliToolsMetadata,
2870
2918
  'tools.crudBasic': CliToolsCrudBasic,
2919
+ 'tools.crudStart': CliToolsCrudStart,
2871
2920
  'tools.crud': CliToolsCrud
2872
2921
  };
2873
2922
 
@@ -3445,6 +3494,40 @@ var toolsCrudBasic = {
3445
3494
  }
3446
3495
  };
3447
3496
 
3497
+ var toolsCrudStart = {
3498
+ bean: 'tools.crudStart',
3499
+ info: {
3500
+ version: '5.0.0',
3501
+ title: 'Cli: Tools: Crud Start',
3502
+ usage: 'vona :tools:crudStart resourceName [--module=]'
3503
+ },
3504
+ options: {
3505
+ module: {
3506
+ description: 'module name',
3507
+ type: 'string'
3508
+ }
3509
+ },
3510
+ groups: {
3511
+ default: {
3512
+ questions: {
3513
+ resourceName: {
3514
+ type: 'input',
3515
+ message: 'resourceName',
3516
+ initial: {
3517
+ expression: 'arg0'
3518
+ },
3519
+ required: true
3520
+ },
3521
+ module: {
3522
+ type: 'input',
3523
+ message: 'module name',
3524
+ required: true
3525
+ }
3526
+ }
3527
+ }
3528
+ }
3529
+ };
3530
+
3448
3531
  var toolsDeps = {
3449
3532
  bean: 'tools.deps',
3450
3533
  info: {
@@ -3509,6 +3592,7 @@ const commands = {
3509
3592
  deps: toolsDeps,
3510
3593
  metadata: toolsMetadata,
3511
3594
  crudBasic: toolsCrudBasic,
3595
+ crudStart: toolsCrudStart,
3512
3596
  crud: toolsCrud
3513
3597
  }
3514
3598
  };
@@ -0,0 +1,15 @@
1
+ import type { IModuleInfo } from '@cabloy/module-info';
2
+ import { BeanCliBase } from '@cabloy/cli';
3
+ declare module '@cabloy/cli' {
4
+ interface ICommandArgv {
5
+ module: string;
6
+ moduleInfo: IModuleInfo;
7
+ resourceName: string;
8
+ resourceNameCapitalize: string;
9
+ moduleResourceName: string;
10
+ moduleActionPathRaw: string;
11
+ }
12
+ }
13
+ export declare class CliToolsCrudStart extends BeanCliBase {
14
+ execute(): Promise<void>;
15
+ }
@@ -25,6 +25,7 @@ import { CliInitStatic } from './bean/cli.init.static.ts';
25
25
  import { CliInitTypes } from './bean/cli.init.types.ts';
26
26
  import { CliToolsCrud } from './bean/cli.tools.crud.ts';
27
27
  import { CliToolsCrudBasic } from './bean/cli.tools.crudBasic.ts';
28
+ import { CliToolsCrudStart } from './bean/cli.tools.crudStart.ts';
28
29
  import { CliToolsDeps } from './bean/cli.tools.deps.ts';
29
30
  import { CliToolsMetadata } from './bean/cli.tools.metadata.ts';
30
31
  export declare const beans: {
@@ -56,5 +57,6 @@ export declare const beans: {
56
57
  'tools.deps': typeof CliToolsDeps;
57
58
  'tools.metadata': typeof CliToolsMetadata;
58
59
  'tools.crudBasic': typeof CliToolsCrudBasic;
60
+ 'tools.crudStart': typeof CliToolsCrudStart;
59
61
  'tools.crud': typeof CliToolsCrud;
60
62
  };
@@ -0,0 +1,34 @@
1
+ declare const _default: {
2
+ bean: string;
3
+ info: {
4
+ version: string;
5
+ title: string;
6
+ usage: string;
7
+ };
8
+ options: {
9
+ module: {
10
+ description: string;
11
+ type: string;
12
+ };
13
+ };
14
+ groups: {
15
+ default: {
16
+ questions: {
17
+ resourceName: {
18
+ type: string;
19
+ message: string;
20
+ initial: {
21
+ expression: string;
22
+ };
23
+ required: boolean;
24
+ };
25
+ module: {
26
+ type: string;
27
+ message: string;
28
+ required: boolean;
29
+ };
30
+ };
31
+ };
32
+ };
33
+ };
34
+ export default _default;
@@ -523,6 +523,39 @@ export declare const commands: {
523
523
  };
524
524
  };
525
525
  };
526
+ crudStart: {
527
+ bean: string;
528
+ info: {
529
+ version: string;
530
+ title: string;
531
+ usage: string;
532
+ };
533
+ options: {
534
+ module: {
535
+ description: string;
536
+ type: string;
537
+ };
538
+ };
539
+ groups: {
540
+ default: {
541
+ questions: {
542
+ resourceName: {
543
+ type: string;
544
+ message: string;
545
+ initial: {
546
+ expression: string;
547
+ };
548
+ required: boolean;
549
+ };
550
+ module: {
551
+ type: string;
552
+ message: string;
553
+ required: boolean;
554
+ };
555
+ };
556
+ };
557
+ };
558
+ };
526
559
  crud: {
527
560
  bean: string;
528
561
  info: {
@@ -0,0 +1,9 @@
1
+ import { metadataCustomSnippet } from '@cabloy/cli';
2
+ export default metadataCustomSnippet({
3
+ file: 'package.json',
4
+ language: 'json',
5
+ async transform({ ast, argv }) {
6
+ argv.fileVersion = ast.vonaModule.fileVersion = 1 + (ast.vonaModule.fileVersion ?? 0);
7
+ return ast;
8
+ },
9
+ });
@@ -0,0 +1,35 @@
1
+ import { metadataCustomSnippet } from '@cabloy/cli';
2
+ import { catchError } from '@cabloy/utils';
3
+ import fs from 'node:fs';
4
+ const __snippet_import1 = "import { $tableColumns } from 'vona-module-a-ormutils';";
5
+ const __snippet_update = "...$tableColumns('<%=argv.moduleResourceName%>', 'name'),";
6
+ export default metadataCustomSnippet({
7
+ file: 'src/bean/meta.index.ts',
8
+ language: 'plain',
9
+ format: true,
10
+ init: async ({ cli, argv, targetFile }) => {
11
+ await catchError(() => {
12
+ return cli.helper.invokeCli([':create:bean', 'meta', 'index', `--module=${argv.module}`, '--nometadata', '--noformat'], {
13
+ cwd: argv.projectPath,
14
+ });
15
+ });
16
+ return fs.readFileSync(targetFile).toString('utf8');
17
+ },
18
+ async transform({ cli, ast }) {
19
+ // import1
20
+ if (!ast.includes(__snippet_import1)) {
21
+ const code = await cli.template.renderContent({ content: __snippet_import1 });
22
+ ast = ast.replace("import { Meta } from 'vona-module-a-meta';", `import { Meta } from 'vona-module-a-meta';\n${code}`);
23
+ }
24
+ // update
25
+ const code = await cli.template.renderContent({ content: __snippet_update });
26
+ if (ast.includes('indexes: {}')) {
27
+ ast = ast.replace('indexes: {', `indexes: {\n ${code}\n `);
28
+ }
29
+ else {
30
+ ast = ast.replace('indexes: {', `indexes: {\n ${code}`);
31
+ }
32
+ // ok
33
+ return ast;
34
+ },
35
+ });
@@ -0,0 +1,41 @@
1
+ import { metadataCustomSnippet } from '@cabloy/cli';
2
+ import { catchError } from '@cabloy/utils';
3
+ import fs from 'node:fs';
4
+ const __snippet_update = `if (options.version === <%=argv.fileVersion%>) {
5
+ const entity<%=argv.resourceNameCapitalize%> = this.scope.entity.<%=argv.resourceName%>;
6
+ await this.bean.model.createTable(entity<%=argv.resourceNameCapitalize%>.$table, table => {
7
+ table.comment(entity<%=argv.resourceNameCapitalize%>.$comment.$table);
8
+ table.basicFields();
9
+ table.string(entity<%=argv.resourceNameCapitalize%>.name, 50).comment(entity<%=argv.resourceNameCapitalize%>.$comment.name);
10
+ table.string(entity<%=argv.resourceNameCapitalize%>.description, 255).comment(entity<%=argv.resourceNameCapitalize%>.$comment.description);
11
+ });
12
+ }
13
+ `;
14
+ export default metadataCustomSnippet({
15
+ file: 'src/bean/meta.version.ts',
16
+ language: 'gogo',
17
+ format: true,
18
+ init: async ({ cli, argv, targetFile }) => {
19
+ await catchError(() => {
20
+ return cli.helper.invokeCli([
21
+ ':create:bean',
22
+ 'meta',
23
+ 'version',
24
+ `--module=${argv.module}`,
25
+ '--nometadata',
26
+ '--noformat',
27
+ ], {
28
+ cwd: argv.projectPath,
29
+ });
30
+ });
31
+ return fs.readFileSync(targetFile).toString('utf8');
32
+ },
33
+ async transform({ cli, ast }) {
34
+ // update
35
+ ast.replace('async update(_options: IMetaVersionUpdateOptions) {$$$1}', 'async update(options: IMetaVersionUpdateOptions) {$$$1}');
36
+ const code = await cli.template.renderContent({ content: __snippet_update });
37
+ ast.replace('async update($$$0) {$$$1}', `async update($$$0) {\n $$$1\n ${code}}`);
38
+ // ok
39
+ return ast;
40
+ },
41
+ });
@@ -0,0 +1,20 @@
1
+ import { metadataCustomSnippet } from '@cabloy/cli';
2
+ import { catchError } from '@cabloy/utils';
3
+ import fs from 'node:fs';
4
+ import { locale_transform } from "../utils.js";
5
+ const __resources = { Name: 'Name', Description: 'Description', Operations: 'Operations' };
6
+ export default metadataCustomSnippet({
7
+ file: 'src/config/locale/en-us.ts',
8
+ language: 'plain',
9
+ init: async ({ cli, argv, targetFile }) => {
10
+ await catchError(() => {
11
+ return cli.helper.invokeCli([':init:locale', argv.module, '--nometadata', '--noformat'], {
12
+ cwd: argv.projectPath,
13
+ });
14
+ });
15
+ return fs.readFileSync(targetFile).toString('utf8');
16
+ },
17
+ async transform({ ast, argv }) {
18
+ return locale_transform({ ast, argv, resources: __resources });
19
+ },
20
+ });
@@ -0,0 +1,10 @@
1
+ import { metadataCustomSnippet } from '@cabloy/cli';
2
+ import { locale_transform } from "../utils.js";
3
+ const __resources = { Name: '名称', Description: '描述', Operations: '操作' };
4
+ export default metadataCustomSnippet({
5
+ file: 'src/config/locale/zh-cn.ts',
6
+ language: 'plain',
7
+ async transform({ ast, argv }) {
8
+ return locale_transform({ ast, argv, resources: __resources });
9
+ },
10
+ });
@@ -0,0 +1,13 @@
1
+ import { evaluateSimple } from '@cabloy/utils';
2
+ export async function locale_transform({ ast, argv, resources, }) {
3
+ const values = evaluateSimple(ast.replace('export default', '').replace(';', ''));
4
+ resources = Object.assign({}, resources, { [argv.resourceNameCapitalize]: argv.resourceNameCapitalize }, values);
5
+ const keys = Object.keys(resources).sort();
6
+ let content = '';
7
+ for (const key of keys) {
8
+ content += ` ${key}: '${resources[key].replaceAll("'", "\\'")}',\n`;
9
+ }
10
+ ast = `export default {\n${content}};\n`;
11
+ // ok
12
+ return ast;
13
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-cli-set-api",
3
- "version": "1.1.59",
3
+ "version": "1.1.62",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "vona cli-set-api",
6
6
  "keywords": [
@@ -65,8 +65,8 @@
65
65
  "@cabloy/cli": "^3.1.10",
66
66
  "@cabloy/extend": "^3.2.5",
67
67
  "@cabloy/module-glob": "^5.3.8",
68
- "babel-plugin-vona-bean-module": "^1.1.6",
69
68
  "@cabloy/dotenv": "^1.2.5",
69
+ "babel-plugin-vona-bean-module": "^1.1.6",
70
70
  "@cabloy/utils": "^2.1.17",
71
71
  "vona-core": "^5.1.13"
72
72
  },