cabloy 5.1.225 → 5.1.227

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 (89) hide show
  1. package/.cabloy-version +1 -1
  2. package/.github/workflows/vona-tsc.yml +2 -2
  3. package/CHANGELOG.md +22 -0
  4. package/oxlint.config.ts +5 -1
  5. package/package.json +5 -11
  6. package/repo-agent-governance/managed-assets.json +9 -9
  7. package/repo-agent-governance/policies/repository.md +2 -0
  8. package/repo-agent-governance/skills/cabloy-spec-execution/references/execution-protocol.md +6 -2
  9. package/repo-agent-governance/skills/cabloy-spec-generation/SKILL.md +1 -1
  10. package/repo-docs/ai/ai-spec-driven-development.md +6 -2
  11. package/repo-docs/reference/repo-scripts.md +18 -19
  12. package/scripts/oxlintPlugins.ts +25 -0
  13. package/scripts/typecheck.test.ts +107 -94
  14. package/scripts/typecheck.ts +1 -1
  15. package/vona/oxlint.config.ts +5 -1
  16. package/vona/package.original.json +5 -6
  17. package/vona/packages-cli/cabloy-cli/package.json +1 -1
  18. package/vona/packages-cli/cli/package.json +1 -1
  19. package/vona/packages-cli/cli-set-api/package.json +1 -1
  20. package/vona/packages-cli/cli-set-api/src/lib/beans.ts +0 -2
  21. package/vona/packages-cli/cli-set-api/src/lib/commands.ts +0 -2
  22. package/vona/packages-utils/lint/package.json +3 -3
  23. package/vona/packages-utils/module-glob/package.json +2 -1
  24. package/vona/packages-utils/module-glob/src/index.ts +2 -26
  25. package/vona/packages-utils/module-glob/src/suites.ts +31 -0
  26. package/vona/packages-utils/module-glob/test/suites.test.ts +108 -0
  27. package/vona/packages-vona/vona/package.json +1 -1
  28. package/vona/pnpm-lock.yaml +254 -182
  29. package/vona/pnpm-workspace.yaml +0 -1
  30. package/vona/src/suite/a-commerce/modules/commerce-catalog/test/product.test.ts +2 -0
  31. package/vona/src/suite/a-commerce/modules/commerce-catalog/test/sku.test.ts +1 -0
  32. package/vona/src/suite/a-commerce/modules/commerce-catalog/test/skuUniqueness.test.ts +9 -10
  33. package/vona/src/suite/a-commerce/modules/commerce-member/test/addressOwnership.test.ts +43 -16
  34. package/vona/src/suite/a-commerce/modules/commerce-member/test/addressPresentation.test.ts +7 -1
  35. package/vona/src/suite/a-commerce/modules/commerce-payment/test/paymentIndexes.test.ts +2 -1
  36. package/vona/src/suite/a-commerce/modules/commerce-promotion/test/couponReservation.test.ts +18 -9
  37. package/vona/src/suite/a-commerce/modules/commerce-trade/test/cartOwnership.test.ts +28 -11
  38. package/vona/src/suite/a-commerce/modules/commerce-trade/test/checkoutReservation.test.ts +33 -21
  39. package/vona/src/suite/a-commerce/modules/commerce-trade/test/checkoutTransaction.test.ts +6 -5
  40. package/vona/src/suite/a-commerce/modules/commerce-trade/test/orderSnapshot.test.ts +33 -25
  41. package/vona/src/suite/a-commerce/modules/commerce-trade/test/paymentOutcome.test.ts +31 -20
  42. package/vona/src/suite/a-commerce/modules/commerce-trade/test/refundLifecycle.test.ts +30 -30
  43. package/vona/src/suite/a-commerce/modules/commerce-trade/test/reservationExpiry.test.ts +24 -26
  44. package/vona/src/suite/a-commerce/modules/commerce-trade/test/shipment.test.ts +7 -2
  45. package/vona/src/suite/a-commerce/modules/commerce-trade/test/shipmentRefundRace.test.ts +15 -5
  46. package/vona/src/suite/a-commerce/modules/commerce-trade/test/stockBalance.test.ts +7 -5
  47. package/vona/src/suite/a-home/modules/home-user/test/account.test.ts +2 -2
  48. package/vona/src/suite/a-home/modules/home-user/test/accountActivation.test.ts +2 -1
  49. package/vona/src/suite/a-home/modules/home-user/test/accountOpenapi.test.ts +53 -42
  50. package/vona/src/suite/a-home/modules/home-user/test/accountPasswordReset.test.ts +1 -0
  51. package/vona/src/suite/a-home/modules/home-user/test/accountPasswordSet.test.ts +2 -1
  52. package/vona/src/suite/a-training/modules/training-record/test/record.test.ts +12 -7
  53. package/vona/src/suite/a-training/modules/training-student/test/student.test.ts +23 -11
  54. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/package.json +1 -1
  55. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/test/rbacCatalogGuard.test.ts +5 -1
  56. package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/package.json +1 -1
  57. package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/test/ssrMenuVisibility.test.ts +3 -3
  58. package/vona/src/suite-vendor/a-cabloy/package.json +2 -2
  59. package/vona/src/suite-vendor/a-vona/modules/a-core/package.json +1 -1
  60. package/vona/src/suite-vendor/a-vona/modules/a-metrics/package.json +1 -1
  61. package/vona/src/suite-vendor/a-vona/modules/a-metrics/test/middlewareSystem.health.test.ts +33 -12
  62. package/vona/src/suite-vendor/a-vona/modules/a-openapi/package.json +1 -1
  63. package/vona/src/suite-vendor/a-vona/modules/a-openapi/src/types/permissions.ts +3 -1
  64. package/vona/src/suite-vendor/a-vona/modules/a-orm/package.json +1 -1
  65. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/bean.model/bean.model_crud_inner.ts +6 -2
  66. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/bean.model/bean.model_crud_table.ts +4 -4
  67. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/dto/dtoMutate.ts +38 -9
  68. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/relationsGroup.ts +12 -10
  69. package/vona/src/suite-vendor/a-vona/modules/a-orm/test/dtoMutate.types.test.ts +129 -0
  70. package/vona/src/suite-vendor/a-vona/modules/a-permission/package.json +1 -1
  71. package/vona/src/suite-vendor/a-vona/modules/a-security/package.json +1 -1
  72. package/vona/src/suite-vendor/a-vona/modules/a-security/test/origin.test.ts +1 -0
  73. package/vona/src/suite-vendor/a-vona/modules/a-web/cli/controller/metadata/generate.ts +72 -28
  74. package/vona/src/suite-vendor/a-vona/modules/a-web/package.json +1 -1
  75. package/vona/src/suite-vendor/a-vona/modules/a-web/test/controllerMetadataParser.test.ts +156 -0
  76. package/vona/src/suite-vendor/a-vona/package.json +1 -1
  77. package/vona/tsconfig.json +19 -35
  78. package/zova/oxlint.config.ts +5 -1
  79. package/zova/package.original.json +6 -6
  80. package/zova/packages-cli/cli/package.json +3 -3
  81. package/zova/packages-cli/cli-set-front/package.json +4 -4
  82. package/zova/packages-utils/zova-vite/package.json +2 -2
  83. package/zova/packages-zova/zova/package.json +2 -2
  84. package/zova/pnpm-lock.yaml +195 -65
  85. package/zova/src/suite-vendor/a-zova/modules/a-zova/package.json +2 -2
  86. package/zova/src/suite-vendor/a-zova/package.json +2 -2
  87. package/vona/packages-cli/cli-set-api/src/lib/bean/cli.bin.tsc.ts +0 -89
  88. package/vona/packages-cli/cli-set-api/src/lib/command/bin.tsc.ts +0 -24
  89. /package/{vona/packages-cli/cli-set-api/src/lib → scripts}/typescriptRunner.ts +0 -0
@@ -177,6 +177,7 @@ async function withWhiteList(whiteList: string | string[], fn: () => Promise<voi
177
177
  await app.bean.executor.mockCtx(async () => {
178
178
  const options =
179
179
  app.bean.onion.middlewareSystem.getOnionSlice('a-security:cors').beanOptions.options;
180
+ assert.ok(options);
180
181
  const whiteListPrevious = options.whiteList;
181
182
  options.whiteList = Array.isArray(whiteList) ? [...whiteList] : whiteList;
182
183
  try {
@@ -1,10 +1,11 @@
1
+ import type { types as t } from '@babel/core';
1
2
  import type { IMetadataCustomGenerateOptions } from '@cabloy/cli';
2
3
 
3
4
  import { combineApiPathControllerAndActionRaw } from '@cabloy/utils';
4
5
  import { toUpperCaseFirstChar } from '@cabloy/word-utils';
5
6
 
6
7
  export default async function (options: IMetadataCustomGenerateOptions): Promise<string> {
7
- const { sceneName, moduleName, globFiles } = options;
8
+ const { sceneName, moduleName, globFiles, cli } = options;
8
9
  const contentResources: string[] = [];
9
10
  const contentImports: string[] = [];
10
11
  const contentActions: string[] = [];
@@ -22,11 +23,25 @@ export default async function (options: IMetadataCustomGenerateOptions): Promise
22
23
  export interface ${opionsName} {
23
24
  actions?: TypeControllerOptionsActions<${className}>;
24
25
  }`);
26
+ const file = cli.helper.gogocode(fileContent, {
27
+ parseOptions: { sourceType: 'module', plugins: ['typescript', 'decorators-legacy'] },
28
+ }).node as t.File;
29
+ const declaration = file.program.body
30
+ .map(statement =>
31
+ statement.type === 'ExportNamedDeclaration' || statement.type === 'ExportDefaultDeclaration'
32
+ ? statement.declaration
33
+ : statement,
34
+ )
35
+ .find(
36
+ (node): node is t.ClassDeclaration =>
37
+ node?.type === 'ClassDeclaration' && node.id?.name === className,
38
+ );
39
+ if (!declaration) continue;
25
40
  // controllerPath
26
- const controllerPath = __parseControllerPath(fileContent);
41
+ const controllerPath = __parseControllerPath(declaration);
27
42
  if (controllerPath === false) continue;
28
43
  // actionPath;
29
- const actionPaths = __parseActionPaths(fileContent);
44
+ const actionPaths = __parseActionPaths(declaration);
30
45
  for (const [method, actionPath] of actionPaths) {
31
46
  if (!contentPaths[method]) contentPaths[method] = [];
32
47
  const apiPath = __combineApiPath(moduleName, controllerPath, actionPath);
@@ -81,36 +96,65 @@ ${contentResources2}
81
96
  return content;
82
97
  }
83
98
 
84
- function __parseControllerPath(fileContent: string): string | false {
85
- let matched = fileContent.match(
86
- /@Controller<.*?>\(\{[\s\S]*?path: ('[^']*')[\s\S]*?\}[\s\S]*?\)\s*export class/,
87
- );
88
- if (!matched) {
89
- matched = fileContent.match(/@Controller<.*?>\(([^)]*)\)/);
99
+ function __parseControllerPath(declaration: t.ClassDeclaration): string | false {
100
+ for (const decorator of declaration.decorators ?? []) {
101
+ const call = decorator.expression;
102
+ if (
103
+ call.type !== 'CallExpression' ||
104
+ call.callee.type !== 'Identifier' ||
105
+ call.callee.name !== 'Controller'
106
+ ) {
107
+ continue;
108
+ }
109
+ const argument = call.arguments[0];
110
+ if (!argument) return '';
111
+ if (argument.type === 'StringLiteral') return argument.value;
112
+ if (argument.type !== 'ObjectExpression') return false;
113
+ // Read the last explicit path; a later spread/computed key makes it dynamic.
114
+ for (const property of argument.properties.toReversed()) {
115
+ if (property.type === 'SpreadElement' || property.computed) return false;
116
+ const key = property.key;
117
+ if (
118
+ (key.type === 'Identifier' && key.name === 'path') ||
119
+ (key.type === 'StringLiteral' && key.value === 'path')
120
+ ) {
121
+ return property.type === 'ObjectProperty' && property.value.type === 'StringLiteral'
122
+ ? property.value.value
123
+ : false;
124
+ }
125
+ }
126
+ return '';
90
127
  }
91
- if (!matched) return false;
92
- const controllerPath = matched[1];
93
- if (controllerPath === '') return '';
94
- return controllerPath.split(',')[0].replaceAll("'", '');
128
+ return false;
95
129
  }
96
130
 
97
- function __parseActionPaths(fileContent: string): [string, string][] {
131
+ function __parseActionPaths(declaration: t.ClassDeclaration): [string, string][] {
98
132
  const actionPaths: [string, string][] = [];
99
- const matches = fileContent.match(
100
- /(@Web\.get|@Web\.post|@Web\.delete|@Web\.put|@Web\.patch)\([\s\S]*?\)/g,
101
- );
102
- if (!matches) return [];
103
- for (const match of matches) {
104
- const matches2 = match.match(/@([^(]*)\(([\s\S]*?)\)/);
105
- if (!matches2) throw new Error('parse action path error');
106
- let actionPath = matches2[2];
107
- if (actionPath !== '' && !actionPath.startsWith("'")) continue; // exclude regexp
108
- if (actionPath.startsWith("'")) {
109
- const pos = actionPath.indexOf("'", 1);
110
- actionPath = actionPath.substring(1, pos);
133
+ for (const member of declaration.body.body) {
134
+ if (member.type !== 'ClassMethod') continue;
135
+ for (const decorator of member.decorators ?? []) {
136
+ const call = decorator.expression;
137
+ if (call.type !== 'CallExpression') continue;
138
+ const callee = call.callee;
139
+ if (
140
+ callee.type !== 'MemberExpression' ||
141
+ callee.computed ||
142
+ callee.object.type !== 'Identifier' ||
143
+ callee.object.name !== 'Web' ||
144
+ callee.property.type !== 'Identifier' ||
145
+ !['get', 'post', 'delete', 'put', 'patch'].includes(callee.property.name)
146
+ ) {
147
+ continue;
148
+ }
149
+ const argument = call.arguments[0];
150
+ // Options-only and no-argument decorators map to the root action route.
151
+ // RegExp and other dynamic expressions cannot supply static route metadata.
152
+ if (!argument || argument.type === 'ObjectExpression') {
153
+ actionPaths.push([toUpperCaseFirstChar(callee.property.name), '']);
154
+ } else if (argument.type === 'StringLiteral') {
155
+ actionPaths.push([toUpperCaseFirstChar(callee.property.name), argument.value]);
156
+ }
111
157
  }
112
- const method = toUpperCaseFirstChar(matches2[1].substring(4));
113
- actionPaths.push([method, actionPath]);
114
158
  }
115
159
  return actionPaths;
116
160
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-module-a-web",
3
- "version": "5.1.23",
3
+ "version": "5.1.24",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "",
6
6
  "keywords": [
@@ -0,0 +1,156 @@
1
+ import gogocode from 'gogocode';
2
+ import assert from 'node:assert/strict';
3
+ import { test } from 'node:test';
4
+
5
+ import generate from '../cli/controller/metadata/generate.ts';
6
+
7
+ async function routes(controller: string, methods: string, extra = '') {
8
+ const content = await generate({
9
+ cli: { helper: { gogocode } },
10
+ sceneName: 'controller',
11
+ moduleName: 'test-parser',
12
+ globFiles: [
13
+ {
14
+ className: 'ControllerExample',
15
+ beanName: 'example',
16
+ fileNameJSRelative: '../controller/example.ts',
17
+ fileContent: `${extra}
18
+ ${controller}
19
+ export class ControllerExample extends BeanBase {
20
+ ${methods}
21
+ }`,
22
+ },
23
+ ],
24
+ } as never);
25
+ return Object.fromEntries(
26
+ Array.from(content.matchAll(/export interface IApiPath(\w+)Record\{([\s\S]*?)\}/g), match => [
27
+ match[1],
28
+ Array.from(match[2].matchAll(/'([^']+)': undefined;/g), entry => entry[1]),
29
+ ]),
30
+ );
31
+ }
32
+
33
+ test('options-only Web get/post decorators produce root action routes', async () => {
34
+ assert.deepEqual(
35
+ await routes(
36
+ "@Controller<IControllerOptions>('trainingRecord')",
37
+ `@Web.get({ summary: 'List records (current)', meta: { label: makeLabel('list') } })
38
+ async list() {}
39
+ @Web.post({ summary: 'Create record', meta: { nested: { enabled: true } } })
40
+ async create() {}`,
41
+ ),
42
+ {
43
+ Get: ['/test/parser/trainingRecord'],
44
+ Post: ['/test/parser/trainingRecord'],
45
+ },
46
+ );
47
+ });
48
+
49
+ test('object Controller path survives nested metadata and following Api.exclude', async () => {
50
+ for (const typeArguments of ['', '<IControllerOptions>']) {
51
+ assert.deepEqual(
52
+ await routes(
53
+ `@Controller${typeArguments}({
54
+ meta: { path: 'notTheControllerPath', guard: makeGuard({ enabled: true }) },
55
+ path: 'passportTest',
56
+ })
57
+ @Api.exclude()`,
58
+ `@Web.get({ summary: 'Passport test (root)' })
59
+ async read() {}
60
+ @Web.post('login', { summary: 'Login' })
61
+ async login() {}`,
62
+ ),
63
+ {
64
+ Get: ['/test/parser/passportTest'],
65
+ Post: ['/test/parser/passportTest/login'],
66
+ },
67
+ );
68
+ }
69
+ });
70
+
71
+ test('string paths and all existing action verbs remain supported', async () => {
72
+ assert.deepEqual(
73
+ await routes(
74
+ '@Controller<IControllerOptions>("records", { meta: { nested: true } })',
75
+ `@Web.get('items/:id', { summary: 'Read (one)' })
76
+ read() {}
77
+ @Web.post( 'items' )
78
+ create() {}
79
+ @Web.put("items/:id")
80
+ replace() {}
81
+ @Web.patch('/absolute/:id')
82
+ update() {}
83
+ @Web.delete('//external/:id')
84
+ remove() {}`,
85
+ ),
86
+ {
87
+ Get: ['/test/parser/records/items/:id'],
88
+ Post: ['/test/parser/records/items'],
89
+ Put: ['/test/parser/records/items/:id'],
90
+ Patch: ['/absolute/:id'],
91
+ Delete: ['//external/:id'],
92
+ },
93
+ );
94
+ });
95
+
96
+ test('no-path Controller and Web decorators preserve root routes', async () => {
97
+ for (const controller of [
98
+ '@Controller()',
99
+ '@Controller<IControllerOptions>()',
100
+ "@Controller({ meta: { path: 'nestedOnly' } })",
101
+ "@Controller<IControllerOptions>({ meta: { path: 'nestedOnly' } })",
102
+ "@Controller('')",
103
+ ]) {
104
+ assert.deepEqual(
105
+ await routes(controller, '@Web.get()\nread() {}\n@Web.post()\ncreate() {}'),
106
+ { Get: ['/test/parser'], Post: ['/test/parser'] },
107
+ controller,
108
+ );
109
+ }
110
+ });
111
+
112
+ test('RegExp and dynamic action routes stay excluded, without evaluating expressions', async () => {
113
+ assert.deepEqual(
114
+ await routes(
115
+ "@Controller('records')",
116
+ `@Web.get(/items\\/(.*)/)
117
+ regex() {}
118
+ @Web.post(new RegExp('items'))
119
+ regexConstructor() {}
120
+ @Web.put(dynamicPath)
121
+ identifier() {}
122
+ @Web.patch(resolvePath())
123
+ expression() {}
124
+ @Web.delete(\`items/\${id}\`)
125
+ template() {}
126
+ @Web.get('kept')
127
+ kept() {}`,
128
+ ),
129
+ { Get: ['/test/parser/records/kept'] },
130
+ );
131
+ for (const controller of [
132
+ '@Controller(dynamicPath)',
133
+ '@Controller({ path: resolvePath() })',
134
+ '@Controller({ path: /items/ })',
135
+ "@Controller({ path: 'records', ...dynamicOptions })",
136
+ ]) {
137
+ assert.deepEqual(await routes(controller, '@Web.get()\nread() {}'), {}, controller);
138
+ }
139
+ });
140
+
141
+ test('only real decorators on the owning controller contribute routes', async () => {
142
+ assert.deepEqual(
143
+ await routes(
144
+ "@Controller({ 'path': 'records' })",
145
+ `// @Web.get('comment')
146
+ @Web.get('kept')
147
+ kept() { return "@Web.post('string')"; }`,
148
+ `@Controller('unrelated')
149
+ class ControllerOther {
150
+ @Web.get('other')
151
+ other() {}
152
+ }`,
153
+ ),
154
+ { Get: ['/test/parser/records/kept'] },
155
+ );
156
+ });
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-suite-a-vona",
3
- "version": "5.1.105",
3
+ "version": "5.1.107",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "",
6
6
  "author": "",
@@ -1,41 +1,25 @@
1
1
  {
2
2
  "extends": "./tsconfig.base.json",
3
3
  "compilerOptions": {
4
+ "composite": false,
5
+ "declaration": false,
6
+ "declarationMap": false,
4
7
  "noEmit": true
5
8
  },
6
- "references": [
7
- {
8
- "path": "packages-utils/compose"
9
- },
10
- {
11
- "path": "packages-utils/deps"
12
- },
13
- {
14
- "path": "packages-utils/json5"
15
- },
16
- {
17
- "path": "packages-utils/localeutil"
18
- },
19
- {
20
- "path": "packages-vona/vona-shared"
21
- },
22
- {
23
- "path": "packages-vona/vona-core"
24
- },
25
- {
26
- "path": "packages-vona/vona"
27
- },
28
- {
29
- "path": "packages-vona/vona-mock"
30
- }
31
- ],
32
- "include": [
33
- ".vona/**/*.ts",
34
- ".vona-test-*/**/*.ts",
35
- "src/backend/package.json",
36
- "src/backend/config",
37
- "src/backend/play",
38
- "src/backend/typing"
39
- ],
40
- "exclude": []
9
+ "exclude": [
10
+ "**/cli/**",
11
+ "**/dist/**",
12
+ "./dist",
13
+ "./dist-releases",
14
+ "./coverage",
15
+ "./.app",
16
+ "./.app-test-*",
17
+ "./.vona",
18
+ "./.vona-test-*",
19
+ "./.zova-rest",
20
+ "./node_modules",
21
+ "./packages-cli",
22
+ "./packages-utils",
23
+ "./packages-vona"
24
+ ]
41
25
  }
@@ -1,7 +1,9 @@
1
1
  import { oxcLintConfigVue } from '@cabloy/lint';
2
2
  import { defineConfig } from 'oxlint';
3
3
 
4
- export default defineConfig(
4
+ import { resolveOxlintPlugins } from '../scripts/oxlintPlugins.ts';
5
+
6
+ const config = defineConfig(
5
7
  oxcLintConfigVue({
6
8
  ignorePatterns: [
7
9
  '**/node_modules',
@@ -60,3 +62,5 @@ export default defineConfig(
60
62
  ],
61
63
  }),
62
64
  );
65
+
66
+ export default resolveOxlintPlugins(config);
@@ -23,10 +23,10 @@
23
23
  "dev:spa": "npm run prerun && quasar dev --mode spa --flavor admin",
24
24
  "build:spa": "npm run prerun && quasar build --mode spa --flavor admin",
25
25
  "preview:spa": "vite preview --outDir=dist/spa-admin",
26
- "prerun": "npm run zova :tools:deps && npm run tsc",
27
- "tsc": "tsc --noEmit --project tsconfig.vue-tsc.json",
28
- "tsc:native": "node ../scripts/typecheck.ts native zova --noEmit --incremental false --project tsconfig.vue-tsc.json",
29
- "tsc:legacy": "node ../scripts/typecheck.ts typescript zova --noEmit --incremental false --project tsconfig.vue-tsc.json",
26
+ "prerun": "npm run zova :tools:deps",
27
+ "tsc": "npm run tsc:native",
28
+ "tsc:native": "npm run prerun && node ../scripts/typecheck.ts native zova --noEmit --incremental false --project tsconfig.vue-tsc.json",
29
+ "tsc:legacy": "npm run prerun && node ../scripts/typecheck.ts typescript zova --noEmit --incremental false --project tsconfig.vue-tsc.json",
30
30
  "format": "oxfmt --check",
31
31
  "format:fix": "oxfmt --write",
32
32
  "lint": "oxlint",
@@ -93,8 +93,8 @@
93
93
  "textlint-rule-ja-no-mixed-period": "^3.0.2",
94
94
  "textlint-rule-ja-space-between-half-and-full-width": "^2.4.2",
95
95
  "textlint-rule-period-in-list-item": "^1.0.1",
96
- "oxfmt": "^0.62.0",
97
- "oxlint": "^1.77.0"
96
+ "oxfmt": "^0.74.0",
97
+ "oxlint": "^1.89.0"
98
98
  },
99
99
  "engines": {
100
100
  "node": ">=24.4.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zova-cli",
3
- "version": "1.2.118",
3
+ "version": "1.2.120",
4
4
  "gitHead": "6f675a8cc46d596142c591c28a40cc4d82fcc6cc",
5
5
  "description": "zova cli",
6
6
  "keywords": [
@@ -40,11 +40,11 @@
40
40
  "postpack": "clean-package restore"
41
41
  },
42
42
  "dependencies": {
43
- "@cabloy/cli": "^3.1.30",
43
+ "@cabloy/cli": "^3.1.31",
44
44
  "@cabloy/process-helper": "^3.1.9",
45
45
  "fs-extra": "^11.3.5",
46
46
  "semver": "^7.6.2",
47
- "zova-cli-set-front": "^1.2.116"
47
+ "zova-cli-set-front": "^1.2.118"
48
48
  },
49
49
  "devDependencies": {
50
50
  "clean-package": "^2.2.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zova-cli-set-front",
3
- "version": "1.2.116",
3
+ "version": "1.2.118",
4
4
  "gitHead": "6f675a8cc46d596142c591c28a40cc4d82fcc6cc",
5
5
  "description": "zova cli-set-front",
6
6
  "keywords": [
@@ -41,7 +41,7 @@
41
41
  "@babel/plugin-proposal-decorators": "^7.29.0",
42
42
  "@babel/plugin-transform-class-properties": "^7.28.6",
43
43
  "@babel/plugin-transform-typescript": "^7.28.6",
44
- "@cabloy/cli": "^3.1.30",
44
+ "@cabloy/cli": "^3.1.31",
45
45
  "@cabloy/extend": "^3.2.8",
46
46
  "@cabloy/module-info": "^2.0.3",
47
47
  "@cabloy/openapi-typescript": "^7.9.2",
@@ -49,7 +49,7 @@
49
49
  "@cabloy/vite-plugin-babel": "^1.3.3",
50
50
  "@cabloy/vue-babel-plugin-jsx": "^2.0.1",
51
51
  "@cabloy/word-utils": "^2.1.14",
52
- "@typescript/native-preview": "^7.0.0-dev.20260320.1",
52
+ "@typescript/native-preview": "npm:typescript@7.0.2",
53
53
  "@vitejs/plugin-vue-jsx": "^5.1.5",
54
54
  "babel-plugin-transform-typescript-metadata": "^0.4.0",
55
55
  "babel-plugin-zova-bean-module": "^1.2.15",
@@ -70,7 +70,7 @@
70
70
  "vite": "^8.3.4",
71
71
  "yaml": "^2.8.3",
72
72
  "zova-openapi": "^1.1.17",
73
- "zova-vite": "^1.1.49"
73
+ "zova-vite": "^1.1.50"
74
74
  },
75
75
  "devDependencies": {
76
76
  "clean-package": "^2.2.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zova-vite",
3
- "version": "1.1.49",
3
+ "version": "1.1.50",
4
4
  "gitHead": "09d901d17140a80ee0764211b441cda72fd94663",
5
5
  "description": "zova vite",
6
6
  "keywords": [
@@ -42,7 +42,7 @@
42
42
  "@babel/plugin-transform-typescript": "^7.28.6",
43
43
  "@cabloy/dotenv": "^1.2.9",
44
44
  "@cabloy/extend": "^3.2.8",
45
- "@cabloy/module-glob": "^5.3.18",
45
+ "@cabloy/module-glob": "^5.3.19",
46
46
  "@cabloy/module-info": "^2.0.3",
47
47
  "@cabloy/vite-plugin-babel": "^1.3.3",
48
48
  "@cabloy/vue-babel-plugin-jsx": "^2.0.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zova",
3
- "version": "5.1.173",
3
+ "version": "5.1.174",
4
4
  "gitHead": "2c5c19284bab738e492856189acb6fad74b8a7b7",
5
5
  "description": "A vue3 framework with ioc",
6
6
  "keywords": [
@@ -46,7 +46,7 @@
46
46
  },
47
47
  "dependencies": {
48
48
  "zova-core": "^5.1.93",
49
- "zova-suite-a-zova": "^5.1.172"
49
+ "zova-suite-a-zova": "^5.1.173"
50
50
  },
51
51
  "devDependencies": {
52
52
  "clean-package": "^2.2.0",