cabloy 5.1.94 → 5.1.96

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 (208) hide show
  1. package/.cabloy-version +1 -0
  2. package/.claude/skills/cabloy-backend-scaffold/references/follow-up-checklist.md +4 -1
  3. package/.claude/skills/cabloy-resource-field-update/SKILL.md +6 -3
  4. package/.github/workflows/vona-test-crud.yml +2 -0
  5. package/.github/workflows/vona-test-mysql.yml +2 -0
  6. package/.github/workflows/vona-test-pg.yml +2 -0
  7. package/.github/workflows/vona-test-sqlite3.yml +2 -0
  8. package/CHANGELOG.md +38 -0
  9. package/CLAUDE.md +1 -0
  10. package/cabloy-docs/ai/playbook-backend-module.md +6 -3
  11. package/cabloy-docs/fullstack/framework-performance.md +3 -3
  12. package/cabloy-docs/fullstack/quickstart.md +1 -1
  13. package/package.json +1 -1
  14. package/scripts/release.ts +27 -1
  15. package/vona/docker-compose-original/docker-compose-dockerfile-app +4 -0
  16. package/vona/docker-compose-original/docker-compose.original.yml +0 -1
  17. package/vona/env/.env +0 -1
  18. package/vona/env/.env.prod +0 -1
  19. package/vona/env/.env.prod.docker +0 -7
  20. package/vona/package.original.json +3 -3
  21. package/vona/packages-cli/cabloy-cli/package.json +2 -2
  22. package/vona/packages-cli/cli/package.json +1 -1
  23. package/vona/packages-cli/cli-set-api/package.json +2 -2
  24. package/vona/packages-cli/cli-set-api/src/lib/bean/cli.bin.build.ts +70 -2
  25. package/vona/packages-utils/babel-plugin-vona-bean-module/package.json +2 -2
  26. package/vona/packages-utils/module-glob/package.json +2 -2
  27. package/vona/packages-utils/module-info-pro/package.json +2 -2
  28. package/vona/packages-utils/utils/package.json +2 -2
  29. package/vona/packages-vona/vona/package.json +1 -1
  30. package/vona/packages-vona/vona-core/package.json +2 -2
  31. package/vona/packages-vona/vona-core/src/lib/addon/addon.ts +77 -0
  32. package/vona/packages-vona/vona-core/src/lib/addon/index.ts +3 -0
  33. package/vona/packages-vona/vona-core/src/lib/addon/sharp.ts +46 -0
  34. package/vona/packages-vona/vona-core/src/lib/addon/sqlite3.ts +23 -0
  35. package/vona/packages-vona/vona-core/src/lib/index.ts +1 -0
  36. package/vona/packages-vona/vona-core/src/lib/utils/index.ts +0 -1
  37. package/vona/packages-vona/vona-core/src/lib/utils/util.ts +5 -0
  38. package/vona/packages-vona/vona-mock/package.json +2 -2
  39. package/vona/pnpm-lock.yaml +449 -158
  40. package/vona/pnpm-workspace.yaml +1 -1
  41. package/vona/src/backend/cli.ts +2 -5
  42. package/vona/src/backend/config/config/config.ts +0 -4
  43. package/vona/src/suite/a-demo/modules/demo-basic/src/bean/ssrMenu.admin.ts +1 -1
  44. package/vona/src/suite/a-training/modules/training-record/src/.metadata/index.ts +26 -0
  45. package/vona/src/suite/a-training/modules/training-record/src/bean/imageScene.sceneImage.ts +11 -0
  46. package/vona/src/suite/a-training/modules/training-record/src/bean/meta.version.ts +1 -0
  47. package/vona/src/suite/a-training/modules/training-record/src/config/locale/en-us.ts +1 -0
  48. package/vona/src/suite/a-training/modules/training-record/src/config/locale/zh-cn.ts +1 -0
  49. package/vona/src/suite/a-training/modules/training-record/src/dto/recordSelectResItem.tsx +12 -0
  50. package/vona/src/suite/a-training/modules/training-record/src/dto/recordView.tsx +12 -0
  51. package/vona/src/suite/a-training/modules/training-record/src/entity/record.tsx +26 -1
  52. package/vona/src/suite/a-training/modules/training-record/src/index.ts +1 -0
  53. package/vona/src/suite/a-training/modules/training-student/src/.metadata/index.ts +27 -1
  54. package/vona/src/suite/a-training/modules/training-student/src/bean/imageScene.studentImage.ts +10 -0
  55. package/vona/src/suite/a-training/modules/training-student/src/bean/meta.version.ts +1 -0
  56. package/vona/src/suite/a-training/modules/training-student/src/config/locale/en-us.ts +1 -0
  57. package/vona/src/suite/a-training/modules/training-student/src/config/locale/zh-cn.ts +1 -0
  58. package/vona/src/suite/a-training/modules/training-student/src/dto/detailRecordBase.tsx +16 -2
  59. package/vona/src/suite/a-training/modules/training-student/src/dto/studentCreate.tsx +1 -1
  60. package/vona/src/suite/a-training/modules/training-student/src/dto/studentSelectResItem.tsx +12 -0
  61. package/vona/src/suite/a-training/modules/training-student/src/dto/studentUpdate.tsx +1 -1
  62. package/vona/src/suite/a-training/modules/training-student/src/dto/studentView.tsx +13 -1
  63. package/vona/src/suite/a-training/modules/training-student/src/entity/student.tsx +26 -1
  64. package/vona/src/suite/a-training/modules/training-student/src/index.ts +1 -0
  65. package/vona/src/suite/a-training/modules/training-student/src/model/student.ts +1 -0
  66. package/vona/src/suite-vendor/a-auth/modules/a-auth/package.json +1 -1
  67. package/vona/src/suite-vendor/a-auth/modules/a-auth/src/bean/bean.authProvider.ts +2 -5
  68. package/vona/src/suite-vendor/a-auth/package.json +1 -1
  69. package/vona/src/suite-vendor/a-image/modules/a-image/cli/imageProvider/boilerplate/{{sceneName}}.{{beanName}}.ts_ +23 -0
  70. package/vona/src/suite-vendor/a-image/modules/a-image/cli/imageScene/boilerplate/{{sceneName}}.{{beanName}}.ts_ +5 -0
  71. package/vona/src/suite-vendor/a-image/modules/a-image/package.json +68 -0
  72. package/vona/src/suite-vendor/a-image/modules/a-image/src/.metadata/index.ts +482 -0
  73. package/vona/src/suite-vendor/a-image/modules/a-image/src/.metadata/locales.ts +18 -0
  74. package/vona/src/suite-vendor/a-image/modules/a-image/src/.metadata/this.ts +2 -0
  75. package/vona/src/suite-vendor/a-image/modules/a-image/src/bean/bean.image.ts +443 -0
  76. package/vona/src/suite-vendor/a-image/modules/a-image/src/bean/bean.imageProvider.ts +55 -0
  77. package/vona/src/suite-vendor/a-image/modules/a-image/src/bean/bean.imageUploadPolicy.ts +174 -0
  78. package/vona/src/suite-vendor/a-image/modules/a-image/src/bean/meta.redlock.ts +11 -0
  79. package/vona/src/suite-vendor/a-image/modules/a-image/src/bean/meta.version.ts +40 -0
  80. package/vona/src/suite-vendor/a-image/modules/a-image/src/bean/serializerTransform.resolveView.ts +44 -0
  81. package/vona/src/suite-vendor/a-image/modules/a-image/src/bean/serializerTransform.resolveViews.ts +44 -0
  82. package/vona/src/suite-vendor/a-image/modules/a-image/src/config/config.ts +17 -0
  83. package/vona/src/suite-vendor/a-image/modules/a-image/src/config/locale/en-us.ts +1 -0
  84. package/vona/src/suite-vendor/a-image/modules/a-image/src/config/locale/zh-cn.ts +1 -0
  85. package/vona/src/suite-vendor/a-image/modules/a-image/src/controller/image.ts +165 -0
  86. package/vona/src/suite-vendor/a-image/modules/a-image/src/dto/imageDeliveryRequest.ts +20 -0
  87. package/vona/src/suite-vendor/a-image/modules/a-image/src/dto/imageDirectUploadRequest.ts +36 -0
  88. package/vona/src/suite-vendor/a-image/modules/a-image/src/dto/imageDirectUploadResponse.ts +38 -0
  89. package/vona/src/suite-vendor/a-image/modules/a-image/src/dto/imageTransformOptions.tsx +42 -0
  90. package/vona/src/suite-vendor/a-image/modules/a-image/src/dto/imageUploadResponse.ts +62 -0
  91. package/vona/src/suite-vendor/a-image/modules/a-image/src/dto/imageUploadTokenRequest.ts +24 -0
  92. package/vona/src/suite-vendor/a-image/modules/a-image/src/dto/imageUploadTokenResponse.ts +16 -0
  93. package/vona/src/suite-vendor/a-image/modules/a-image/src/dto/imageUploadUrlRequest.ts +33 -0
  94. package/vona/src/suite-vendor/a-image/modules/a-image/src/dto/imageView.ts +46 -0
  95. package/vona/src/suite-vendor/a-image/modules/a-image/src/entity/image.ts +58 -0
  96. package/vona/src/suite-vendor/a-image/modules/a-image/src/entity/imageProvider.ts +24 -0
  97. package/vona/src/suite-vendor/a-image/modules/a-image/src/index.ts +4 -0
  98. package/vona/src/suite-vendor/a-image/modules/a-image/src/lib/imageProvider.ts +9 -0
  99. package/vona/src/suite-vendor/a-image/modules/a-image/src/lib/imageScene.ts +7 -0
  100. package/vona/src/suite-vendor/a-image/modules/a-image/src/lib/imageVariant.ts +46 -0
  101. package/vona/src/suite-vendor/a-image/modules/a-image/src/lib/index.ts +3 -0
  102. package/vona/src/suite-vendor/a-image/modules/a-image/src/model/image.ts +10 -0
  103. package/vona/src/suite-vendor/a-image/modules/a-image/src/model/imageProvider.ts +10 -0
  104. package/vona/src/suite-vendor/a-image/modules/a-image/src/types/image.ts +208 -0
  105. package/vona/src/suite-vendor/a-image/modules/a-image/src/types/imageProvider.ts +110 -0
  106. package/vona/src/suite-vendor/a-image/modules/a-image/src/types/imageScene.ts +52 -0
  107. package/vona/src/suite-vendor/a-image/modules/a-image/src/types/index.ts +3 -0
  108. package/vona/src/suite-vendor/a-image/modules/a-image/tsconfig.build.json +11 -0
  109. package/vona/src/suite-vendor/a-image/modules/a-image/tsconfig.json +7 -0
  110. package/vona/src/suite-vendor/a-image/modules/image-cloudflare/package.json +49 -0
  111. package/vona/src/suite-vendor/a-image/modules/image-cloudflare/src/.metadata/index.ts +89 -0
  112. package/vona/src/suite-vendor/a-image/modules/image-cloudflare/src/.metadata/this.ts +2 -0
  113. package/vona/src/suite-vendor/a-image/modules/image-cloudflare/src/bean/imageProvider.cloudflare.ts +155 -0
  114. package/vona/src/suite-vendor/a-image/modules/image-cloudflare/src/index.ts +1 -0
  115. package/vona/src/suite-vendor/a-image/modules/image-cloudflare/src/lib/cloudflareImageUrl.ts +112 -0
  116. package/vona/src/suite-vendor/a-image/modules/image-cloudflare/src/service/imageCloudflare.ts +273 -0
  117. package/vona/src/suite-vendor/a-image/modules/image-cloudflare/tsconfig.build.json +11 -0
  118. package/vona/src/suite-vendor/a-image/modules/image-cloudflare/tsconfig.json +7 -0
  119. package/vona/src/suite-vendor/a-image/modules/image-native/package.json +63 -0
  120. package/vona/src/suite-vendor/a-image/modules/image-native/src/.metadata/index.ts +114 -0
  121. package/vona/src/suite-vendor/a-image/modules/image-native/src/.metadata/this.ts +2 -0
  122. package/vona/src/suite-vendor/a-image/modules/image-native/src/bean/imageProvider.native.ts +131 -0
  123. package/vona/src/suite-vendor/a-image/modules/image-native/src/config/config.ts +11 -0
  124. package/vona/src/suite-vendor/a-image/modules/image-native/src/index.ts +1 -0
  125. package/vona/src/suite-vendor/a-image/modules/image-native/src/monkey.ts +33 -0
  126. package/vona/src/suite-vendor/a-image/modules/image-native/src/service/imageNative.ts +291 -0
  127. package/vona/src/suite-vendor/a-image/modules/image-native/tsconfig.build.json +11 -0
  128. package/vona/src/suite-vendor/a-image/modules/image-native/tsconfig.json +7 -0
  129. package/vona/src/suite-vendor/a-image/package.json +14 -0
  130. package/vona/src/suite-vendor/a-image/tsconfig.base.json +4 -0
  131. package/vona/src/suite-vendor/a-image/tsconfig.json +16 -0
  132. package/vona/src/suite-vendor/a-vona/modules/a-core/package.json +2 -2
  133. package/vona/src/suite-vendor/a-vona/modules/a-jwt/package.json +1 -1
  134. package/vona/src/suite-vendor/a-vona/modules/a-jwt/src/service/jwtClient.ts +5 -0
  135. package/vona/src/suite-vendor/a-vona/modules/a-jwt/src/types/jwt.ts +1 -0
  136. package/vona/src/suite-vendor/a-vona/modules/a-openapiutils/package.json +1 -1
  137. package/vona/src/suite-vendor/a-vona/modules/a-openapiutils/src/lib/schema/makeSchemaLikes.ts +6 -3
  138. package/vona/src/suite-vendor/a-vona/modules/a-openapiutils/src/lib/utils.ts +13 -7
  139. package/vona/src/suite-vendor/a-vona/modules/a-orm/package.json +1 -1
  140. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/database.ts +0 -1
  141. package/vona/src/suite-vendor/a-vona/modules/a-ormdialect/package.json +9 -1
  142. package/vona/src/suite-vendor/a-vona/modules/a-upload/package.json +1 -1
  143. package/vona/src/suite-vendor/a-vona/modules/a-upload/src/bean/interceptor.upload.ts +39 -7
  144. package/vona/src/suite-vendor/a-vona/package.json +1 -1
  145. package/zova/packages-cli/cli/package.json +3 -3
  146. package/zova/packages-cli/cli-set-front/package.json +9 -9
  147. package/zova/packages-cli/cli-set-front/src/lib/bean/cli.openapi.generate.ts +20 -10
  148. package/zova/packages-utils/babel-plugin-zova-bean-module/package.json +2 -2
  149. package/zova/packages-utils/babel-plugin-zova-bean-use/package.json +2 -2
  150. package/zova/packages-utils/babel-plugin-zova-behavior/package.json +2 -2
  151. package/zova/packages-utils/babel-plugin-zova-component/package.json +2 -2
  152. package/zova/packages-utils/zova-jsx/package.json +3 -3
  153. package/zova/packages-utils/zova-vite/package.json +7 -7
  154. package/zova/packages-zova/zova/package.json +3 -3
  155. package/zova/packages-zova/zova-core/package.json +3 -3
  156. package/zova/pnpm-lock.yaml +117 -62
  157. package/zova/src/suite/a-home/modules/home-api/src/api/captcha.ts +3 -1
  158. package/zova/src/suite/a-home/modules/home-api/src/api/home.ts +3 -1
  159. package/zova/src/suite/a-home/modules/home-api/src/api/homeBaseMenu.ts +3 -1
  160. package/zova/src/suite/a-home/modules/home-api/src/api/homeBasePermission.ts +3 -1
  161. package/zova/src/suite/a-home/modules/home-api/src/api/homeUserPassport.ts +22 -20
  162. package/zova/src/suite/a-home/modules/home-api/src/api/openapi/schemas.ts +163 -53
  163. package/zova/src/suite/a-home/modules/home-api/src/api/openapi/types.ts +2060 -675
  164. package/zova/src/suite/a-home/modules/home-api/src/api/testSsrToolOne.ts +3 -1
  165. package/zova/src/suite/a-home/modules/home-api/src/apiSchema/captcha.ts +3 -1
  166. package/zova/src/suite/a-home/modules/home-api/src/apiSchema/home.ts +3 -1
  167. package/zova/src/suite/a-home/modules/home-api/src/apiSchema/homeBaseMenu.ts +3 -1
  168. package/zova/src/suite/a-home/modules/home-api/src/apiSchema/homeBasePermission.ts +3 -1
  169. package/zova/src/suite/a-home/modules/home-api/src/apiSchema/homeUserPassport.ts +13 -11
  170. package/zova/src/suite/a-home/modules/home-api/src/apiSchema/testSsrToolOne.ts +3 -1
  171. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/schemas.ts +54 -16
  172. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/types.ts +468 -8
  173. package/zova/src/suite/a-training/modules/training-student/src/apiSchema/trainingStudent.ts +3 -1
  174. package/zova/src/suite/cabloy-basic/modules/basic-details/src/bean/tableCell.actionUpdate.tsx +1 -1
  175. package/zova/src/suite/cabloy-basic/modules/basic-details/src/component/actionCreate/controller.tsx +1 -1
  176. package/zova/src/suite/cabloy-basic/modules/basic-details/src/service/detail.tsx +53 -1
  177. package/zova/src/suite/cabloy-basic/modules/basic-image/cli/openapi.config.ts +9 -0
  178. package/zova/src/suite/cabloy-basic/modules/basic-image/package.json +60 -0
  179. package/zova/src/suite/cabloy-basic/modules/basic-image/src/.metadata/component/formFieldImage.ts +31 -0
  180. package/zova/src/suite/cabloy-basic/modules/basic-image/src/.metadata/index.ts +191 -0
  181. package/zova/src/suite/cabloy-basic/modules/basic-image/src/.metadata/locales.ts +7 -0
  182. package/zova/src/suite/cabloy-basic/modules/basic-image/src/.metadata/this.ts +2 -0
  183. package/zova/src/suite/cabloy-basic/modules/basic-image/src/api/image.ts +104 -0
  184. package/zova/src/suite/cabloy-basic/modules/basic-image/src/api/openapi/baseURL.ts +5 -0
  185. package/zova/src/suite/cabloy-basic/modules/basic-image/src/api/openapi/index.ts +3 -0
  186. package/zova/src/suite/cabloy-basic/modules/basic-image/src/api/openapi/schemas.ts +262 -0
  187. package/zova/src/suite/cabloy-basic/modules/basic-image/src/api/openapi/types.ts +5159 -0
  188. package/zova/src/suite/cabloy-basic/modules/basic-image/src/apiSchema/image.ts +35 -0
  189. package/zova/src/suite/cabloy-basic/modules/basic-image/src/bean/tableCell.image.tsx +200 -0
  190. package/zova/src/suite/cabloy-basic/modules/basic-image/src/component/formFieldImage/controller.tsx +781 -0
  191. package/zova/src/suite/cabloy-basic/modules/basic-image/src/config/locale/en-us.ts +18 -0
  192. package/zova/src/suite/cabloy-basic/modules/basic-image/src/config/locale/zh-cn.ts +18 -0
  193. package/zova/src/suite/cabloy-basic/modules/basic-image/src/index.ts +4 -0
  194. package/zova/src/suite/cabloy-basic/modules/basic-image/src/lib/index.ts +2 -0
  195. package/zova/src/suite/cabloy-basic/modules/basic-image/src/lib/preview.ts +105 -0
  196. package/zova/src/suite/cabloy-basic/modules/basic-image/src/lib/previewDialog.tsx +190 -0
  197. package/zova/src/suite/cabloy-basic/modules/basic-image/src/types/image.ts +5 -0
  198. package/zova/src/suite/cabloy-basic/modules/basic-image/src/types/index.ts +1 -0
  199. package/zova/src/suite/cabloy-basic/modules/basic-image/tsconfig.build.json +13 -0
  200. package/zova/src/suite/cabloy-basic/modules/basic-image/tsconfig.json +5 -0
  201. package/zova/src/suite/cabloy-basic/package.json +1 -0
  202. package/zova/src/suite-vendor/a-zova/modules/a-openapi/package.json +1 -1
  203. package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/image.ts +1 -0
  204. package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/index.ts +1 -0
  205. package/zova/src/suite-vendor/a-zova/modules/a-zova/package.json +5 -5
  206. package/zova/src/suite-vendor/a-zova/package.json +3 -3
  207. package/vona/packages-vona/vona-core/src/lib/utils/sqlite3.ts +0 -50
  208. /package/vona/patches/{zova-core@5.1.74.patch → zova-core@5.1.75.patch} +0 -0
@@ -0,0 +1 @@
1
+ 5.1.96
@@ -15,7 +15,10 @@ After generating or extending a backend thread, check which follow-up layers app
15
15
  - OpenAPI metadata
16
16
  - inferred DTO opportunities
17
17
  - frontend contract impact
18
- - `@Api.field(...)` / `$makeSchema(...)` ordering when an explicit zod/custom schema is present: put that schema last because `makeSchemaLikes(...)` applies arguments right-to-left and later helpers can otherwise be ignored
18
+ - `@Api.field(...)` / `$makeSchema(...)` ordering: framework guards now preserve previously attached OpenAPI metadata across schema rebuilds, but structure-shaping schemaLike is still order-sensitive
19
+ - when an explicit zod/custom schema or other structure-defining schemaLike is present, put that structure-defining schemaLike last because `makeSchemaLikes(...)` applies arguments right-to-left and later structure changes can otherwise alter or replace the intended schema
20
+ - treat `v.object(...)`, `v.array(...)`, `v.optional()`, `v.nullable()`, `v.default(...)`, and preprocess/transform wrappers as structure-shaping rather than metadata-only
21
+ - after touching structure-shaping schemaLike, verify the emitted schema/OpenAPI result explicitly
19
22
 
20
23
  ## Persistence follow-up
21
24
 
@@ -158,9 +158,12 @@ For enum-like numeric or string values, prefer an explicit constrained schema su
158
158
 
159
159
  Ordering rule:
160
160
 
161
- - when that explicit zod schema is passed into `@Api.field(...)`, put it as the **last argument**
162
- - keep helper metadata such as `v.xxx(...)` and `ZovaRender.xxx(...)` before the zod schema
163
- - otherwise helpers written after the zod schema may stop taking effect
161
+ - framework-level guarding now preserves previously attached OpenAPI metadata across schema rebuilds, so metadata-only helpers are less order-sensitive than before
162
+ - this only removes **metadata-loss order pitfalls**; it does **not** make all `schemaLike` arguments fully order-independent
163
+ - when an explicit zod/custom schema or other structure-shaping schemaLike is passed into `@Api.field(...)`, keep that structure-defining schemaLike as the **last argument** unless a local pattern clearly requires otherwise
164
+ - treat helpers such as `v.object(...)`, `v.array(...)`, `v.optional()`, `v.nullable()`, `v.default(...)`, and preprocess/transform wrappers as structure-shaping, not metadata-only
165
+ - keep helper metadata such as `v.xxx(...)` and `ZovaRender.xxx(...)` before the final structure-defining schemaLike
166
+ - after edits involving structure-shaping schemaLike, verify the emitted schema/OpenAPI result instead of assuming reorder is safe
164
167
 
165
168
  Then check whether DTOs are already inferred through patterns such as:
166
169
 
@@ -37,5 +37,7 @@ jobs:
37
37
  working-directory: vona
38
38
  - run: npm run build -- --flavor=ci
39
39
  working-directory: vona
40
+ - run: pnpm -C ./dist/ci install
41
+ working-directory: vona
40
42
  - run: npm run play -- --mode=prod --flavor=ci
41
43
  working-directory: vona
@@ -38,5 +38,7 @@ jobs:
38
38
  working-directory: vona
39
39
  - run: DATABASE_DEFAULT_CLIENT=mysql DATABASE_CLIENT_MYSQL_HOST=127.0.0.1 DATABASE_CLIENT_MYSQL_PASSWORD=root npm run build -- --flavor=ci
40
40
  working-directory: vona
41
+ - run: pnpm -C ./dist/ci install
42
+ working-directory: vona
41
43
  - run: DATABASE_DEFAULT_CLIENT=mysql DATABASE_CLIENT_MYSQL_HOST=127.0.0.1 DATABASE_CLIENT_MYSQL_PASSWORD=root npm run play -- --mode=prod --flavor=ci
42
44
  working-directory: vona
@@ -38,5 +38,7 @@ jobs:
38
38
  working-directory: vona
39
39
  - run: DATABASE_DEFAULT_CLIENT=pg npm run build -- --flavor=ci
40
40
  working-directory: vona
41
+ - run: pnpm -C ./dist/ci install
42
+ working-directory: vona
41
43
  - run: DATABASE_DEFAULT_CLIENT=pg npm run play -- --mode=prod --flavor=ci
42
44
  working-directory: vona
@@ -31,5 +31,7 @@ jobs:
31
31
  working-directory: vona
32
32
  - run: DATABASE_DEFAULT_CLIENT=sqlite3 npm run build -- --flavor=ci
33
33
  working-directory: vona
34
+ - run: pnpm -C ./dist/ci install
35
+ working-directory: vona
34
36
  - run: DATABASE_DEFAULT_CLIENT=sqlite3 npm run play -- --mode=prod --flavor=ci
35
37
  working-directory: vona
package/CHANGELOG.md CHANGED
@@ -1,5 +1,43 @@
1
1
  # Changelog
2
2
 
3
+ ## 5.1.96
4
+
5
+ ### Features
6
+
7
+ - Integrate Cloudflare image provider with signed image delivery.
8
+ - Add scene-based image upload flow.
9
+ - Secure image upload token flow and support imageId-based training images.
10
+ - Restore `expiresIn` support for image upload tokens.
11
+ - Add basic-image table cell thumbnails.
12
+ - Add basic-image student field integration.
13
+ - Add the `a-image` upload API contract.
14
+ - Align image variants with transform options.
15
+ - Add the `a-image` suite scaffold and tests.
16
+
17
+ ### Bug Fixes
18
+
19
+ - Sync nested detail image previews after dialog submission.
20
+ - Preserve OpenAPI metadata across schema rebuilds.
21
+ - Correct basic-image upload and preview URLs.
22
+ - Tighten image upload constraints.
23
+
24
+ ### Improvements
25
+
26
+ - Strengthen image variant typing.
27
+ - Move basic-image types into `src/types`.
28
+ - Generate the basic-image OpenAPI SDK.
29
+ - Skip redundant OpenAPI metadata merges.
30
+ - Configure the default image upload provider.
31
+ - Extract shared base options for image provider clients.
32
+ - Remove the unused native signed URL helper.
33
+
34
+ ## 5.1.95
35
+
36
+ ### Improvements
37
+
38
+ - Refresh the Zova lockfile to prepare for the compensation rerun.
39
+ - Refresh the `vona zova-core` patch for compatibility with `v5.1.75`.
40
+
3
41
  ## 5.1.94
4
42
 
5
43
  ### Features
package/CLAUDE.md CHANGED
@@ -65,6 +65,7 @@ Before inventing a custom implementation path:
65
65
  - `src/bean` defines the global shorthand surface; classes that should not appear in `IBeanRecordGlobal` should move to `src/lib` or `src/service` rather than being filtered by `@Virtual()`.
66
66
  - When backend code references `this.bean.xxx`, `ctx.bean.xxx`, or `app.bean.xxx`, use `IBeanRecordGlobal` and module `src/.metadata/index.ts` as the first static lookup surface; use `IBeanRecordGeneral` or `src/service` only when the target is not a global shorthand.
67
67
  - When adding a persisted field to an existing backend resource, ask the user whether `vonaModule.fileVersion` should be incremented before changing `meta.version.ts` or the module schema path. If yes, add a new migration version and bump `fileVersion`. If no, keep the current `fileVersion` and fold the schema change into the current version path. Do not assume the versioning strategy without confirmation.
68
+ - For `@Api.field(...)` and related schemaLike composition, framework guards now preserve previously attached OpenAPI metadata across schema rebuilds, but structure-shaping schemaLike is still order-sensitive. Treat `v.object(...)`, `v.array(...)`, `v.optional()`, `v.nullable()`, `v.default(...)`, and preprocess/transform wrappers as structure-shaping; keep the final structure-defining schemaLike last and verify emitted schema/OpenAPI output after such edits.
68
69
 
69
70
  ## Verification expectations
70
71
 
@@ -68,9 +68,12 @@ Depending on the feature, extend the generated code with the right framework-lev
68
68
 
69
69
  When refining entity or DTO fields that use `@Api.field(...)`, apply this framework-specific guardrail:
70
70
 
71
- - if you include an explicit zod schema such as `z.number().int().min(1)`, place it as the **last argument**
72
- - keep helper metadata such as `v.xxx(...)` and `ZovaRender.xxx(...)` before the zod schema
73
- - otherwise helpers written after the zod schema may stop taking effect
71
+ - framework-level guarding now preserves previously attached OpenAPI metadata across schema rebuilds, so metadata-only helpers are less order-sensitive than before
72
+ - this only removes **metadata-loss order pitfalls**; it does **not** make all `schemaLike` arguments fully order-independent
73
+ - if you include an explicit zod schema such as `z.number().int().min(1)`, or another structure-shaping schemaLike, place that structure-defining schemaLike as the **last argument**
74
+ - treat helpers such as `v.object(...)`, `v.array(...)`, `v.optional()`, `v.nullable()`, `v.default(...)`, and preprocess/transform wrappers as structure-shaping rather than metadata-only
75
+ - keep helper metadata such as `v.xxx(...)` and `ZovaRender.xxx(...)` before the final structure-defining schemaLike
76
+ - after edits involving structure-shaping schemaLike, verify the emitted schema/OpenAPI result instead of assuming reorder is safe
74
77
 
75
78
  Relevant docs:
76
79
 
@@ -42,17 +42,17 @@ For the current public explanation of this backend capability, see [Cache Guide]
42
42
 
43
43
  This is the kind of result Cabloy is designed to support: a framework that stays operationally calm even when the system keeps running for long periods.
44
44
 
45
- One internally generated project was kept running continuously for **2 days**. At one representative PM2 snapshot, the process looked like this:
45
+ One internally generated project was kept running continuously for **21 days**. At one representative PM2 snapshot, the process looked like this:
46
46
 
47
47
  ```text
48
48
  ┌────┬─────────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
49
49
  │ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │
50
50
  ├────┼─────────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
51
- │ 0 │ cabloy_*** │ default │ N/A │ cluster │ 226947 │ 2D │ 17 │ online │ 0% │ 376.2mb │ ubuntu │ disabled │
51
+ │ 0 │ cabloy_*** │ default │ N/A │ cluster │ 226947 │ 21D │ 17 │ online │ 0% │ 435.0mb │ ubuntu │ disabled │
52
52
  └────┴─────────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
53
53
  ```
54
54
 
55
- For this 2-day continuous run, the observed result was **0 memory leak**.
55
+ For this 21-day continuous run, the observed result was **0 memory leak**.
56
56
 
57
57
  The value of this example is not that it is a synthetic micro-benchmark. The value is that it reflects a real long-running project process with a clear, inspectable runtime footprint.
58
58
 
@@ -90,7 +90,7 @@ Both Cabloy Basic and Cabloy Start support the same Docker Compose command flow.
90
90
 
91
91
  ```bash
92
92
  npm run build:docker
93
- cd docker-compose
93
+ cd vona/docker-compose
94
94
  sudo COMPOSE_BAKE=true docker-compose build
95
95
  sudo docker-compose up
96
96
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cabloy",
3
- "version": "5.1.94",
3
+ "version": "5.1.96",
4
4
  "gitHead": "2c5c19284bab738e492856189acb6fad74b8a7b7",
5
5
  "description": "A Node.js fullstack framework",
6
6
  "keywords": [
@@ -37,6 +37,7 @@ const ZOVA_CORE_PACKAGE_JSON_PATH = resolve(
37
37
  'package.json',
38
38
  );
39
39
  const PACKAGE_JSON_PATH = resolve(ROOT_DIR, 'package.json');
40
+ const CABLOY_VERSION_PATH = resolve(ROOT_DIR, '.cabloy-version');
40
41
  const CHANGELOG_PATH = resolve(ROOT_DIR, 'CHANGELOG.md');
41
42
  const ZOVA_CORE_PATCH_TARGETS = [
42
43
  'dist/bean/resource/error/errorGlobal.d.ts',
@@ -95,6 +96,23 @@ function writePackageJson(pkg: Record<string, any>): void {
95
96
  writeFileSync(PACKAGE_JSON_PATH, `${JSON.stringify(pkg, null, 2)}\n`);
96
97
  }
97
98
 
99
+ function readCabloyVersion(): string | null {
100
+ if (!existsSync(CABLOY_VERSION_PATH)) return null;
101
+ const version = readFileSync(CABLOY_VERSION_PATH, 'utf-8').trim();
102
+ if (!version) return null;
103
+ if (!isValidVersion(version)) {
104
+ throw new Error(`Invalid Cabloy version marker: ${version}`);
105
+ }
106
+ return version;
107
+ }
108
+
109
+ function writeCabloyVersion(version: string): void {
110
+ if (!isValidVersion(version)) {
111
+ throw new Error(`Invalid Cabloy version: ${version}`);
112
+ }
113
+ writeFileSync(CABLOY_VERSION_PATH, `${version}\n`);
114
+ }
115
+
98
116
  function isValidVersion(version: string): boolean {
99
117
  return /^\d+\.\d+\.\d+$/.test(version);
100
118
  }
@@ -612,6 +630,7 @@ async function versionBump(
612
630
  ): Promise<string> {
613
631
  const pkg = readPackageJson();
614
632
  const currentVersion = pkg.version;
633
+ const currentCabloyVersion = readCabloyVersion();
615
634
  const lastTag = getLastTag();
616
635
 
617
636
  // Check for changes since last tag
@@ -629,6 +648,12 @@ async function versionBump(
629
648
  }
630
649
  }
631
650
 
651
+ if (currentCabloyVersion && currentCabloyVersion !== currentVersion) {
652
+ throw new Error(
653
+ `Version mismatch before release: package.json=${currentVersion}, .cabloy-version=${currentCabloyVersion}`,
654
+ );
655
+ }
656
+
632
657
  const newVersion = bumpVersion(currentVersion, bumpType);
633
658
  // eslint-disable-next-line
634
659
  console.log(`\n📦 Version bump: ${currentVersion} → ${newVersion}`);
@@ -636,10 +661,11 @@ async function versionBump(
636
661
  pkg.version = newVersion;
637
662
  if (!dryRun) {
638
663
  writePackageJson(pkg);
664
+ writeCabloyVersion(newVersion);
639
665
  }
640
666
 
641
667
  const tag = `${TAG_PREFIX}${newVersion}`;
642
- exec('git add package.json', dryRun);
668
+ exec('git add package.json .cabloy-version', dryRun);
643
669
  exec(`git commit -m "chore: release v${newVersion}"`, dryRun);
644
670
  exec(`git tag ${tag}`, dryRun);
645
671
  exec('git push', dryRun);
@@ -1,10 +1,14 @@
1
1
  FROM node:24
2
2
 
3
+ RUN corepack enable && corepack prepare pnpm@11.5.2 --activate
4
+
3
5
  RUN mkdir -p /opt/node/app/dist
4
6
  WORKDIR /opt/node/app
5
7
 
8
+ COPY ./dist/docker /opt/node/app/dist/docker
6
9
  COPY ./scripts /opt/node/app/scripts
7
10
 
11
+ RUN pnpm -C ./dist/docker install
8
12
  RUN chmod +x /opt/node/app/scripts/*.sh
9
13
 
10
14
  # start
@@ -10,7 +10,6 @@ services:
10
10
  ports:
11
11
  - '7202:7102'
12
12
  volumes:
13
- - ./output/dist/docker:/opt/node/app/dist/docker
14
13
  - ./output/app/.vona:/root/.vona
15
14
  command: [./scripts/wait-for-it.sh, 'pg:5432', 'redis:6379', -s, --, ./scripts/app-init.sh]
16
15
 
package/vona/env/.env CHANGED
@@ -56,7 +56,6 @@ TEST_PATTERNS_IGNORE = '**/test-vona/test/cache/cacheMem.test.ts,**/test-vona/te
56
56
  DATABASE_DEFAULT_CLIENT = 'sqlite3' # sqlite3/pg/mysql
57
57
 
58
58
  DATABASE_CLIENT_SQLITE3_FILENAME =
59
- DATABASE_CLIENT_SQLITE3_NATIVEBINDING = false
60
59
 
61
60
  DATABASE_CLIENT_PG_HOST = 127.0.0.1
62
61
  DATABASE_CLIENT_PG_PORT = 5432
@@ -7,7 +7,6 @@ SERVER_KEYS = vona__1596889048291_2867
7
7
  DATABASE_DEFAULT_CLIENT = 'sqlite3' # sqlite3/pg/mysql
8
8
 
9
9
  DATABASE_CLIENT_SQLITE3_FILENAME =
10
- DATABASE_CLIENT_SQLITE3_NATIVEBINDING = true
11
10
 
12
11
  DATABASE_CLIENT_PG_HOST = 127.0.0.1
13
12
  DATABASE_CLIENT_PG_PORT = 5432
@@ -3,17 +3,10 @@
3
3
  SERVER_KEYS = vona__1596889048291_2867
4
4
  SERVER_WORKERS = 1
5
5
 
6
- # build
7
-
8
- BUILD_MINIFY = false
9
- BUILD_COPY_DIST = ./docker-compose/output/dist
10
-
11
6
  # database
12
7
 
13
8
  DATABASE_DEFAULT_CLIENT = 'pg' # sqlite3/pg/mysql
14
9
 
15
- DATABASE_CLIENT_SQLITE3_NATIVEBINDING = false
16
-
17
10
  DATABASE_CLIENT_PG_HOST = pg # see: docker-compose.yml
18
11
  DATABASE_CLIENT_PG_PORT = 5432
19
12
  DATABASE_CLIENT_PG_USER = postgres
@@ -28,9 +28,9 @@
28
28
  "tsc": "npm run prerun && npm run vona :bin:tsc",
29
29
  "build": "npm run prerun && npm run vona :bin:build -- --flavor=normal",
30
30
  "build:docker": "npm run prerun && npm run vona :bin:build -- --flavor=docker",
31
- "start": "node ./dist/normal/bootstrap.js",
32
- "start:one": "cross-env SERVER_WORKERS=1 node ./dist/normal/bootstrap.js",
33
- "start:docker": "cross-env SERVER_WORKERS=1 node ./dist/docker/bootstrap.js",
31
+ "start": "pnpm -C ./dist/normal install && node ./dist/normal/bootstrap.js",
32
+ "start:one": "pnpm -C ./dist/normal install && cross-env SERVER_WORKERS=1 node ./dist/normal/bootstrap.js",
33
+ "start:docker": "pnpm -C ./dist/docker install && cross-env SERVER_WORKERS=1 node ./dist/docker/bootstrap.js",
34
34
  "prerun": "npm run vona :tools:deps",
35
35
  "format": "oxfmt --check",
36
36
  "format:fix": "oxfmt --write",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cabloy/cli",
3
- "version": "3.1.27",
3
+ "version": "3.1.28",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "@cabloy/cli",
6
6
  "keywords": [
@@ -37,7 +37,7 @@
37
37
  "dependencies": {
38
38
  "@babel/parser": "^7.29.2",
39
39
  "@cabloy/module-glob": "workspace:^",
40
- "@cabloy/module-info": "^2.0.0",
40
+ "@cabloy/module-info": "^2.0.3",
41
41
  "@cabloy/process-helper": "workspace:^",
42
42
  "@cabloy/utils": "workspace:^",
43
43
  "@cabloy/word-utils": "^2.1.8",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-cli",
3
- "version": "1.1.127",
3
+ "version": "1.1.128",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "vona cli",
6
6
  "keywords": [
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-cli-set-api",
3
- "version": "1.1.125",
3
+ "version": "1.1.126",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "vona cli-set-api",
6
6
  "keywords": [
@@ -46,7 +46,7 @@
46
46
  "@cabloy/dotenv": "workspace:^",
47
47
  "@cabloy/extend": "workspace:^",
48
48
  "@cabloy/module-glob": "workspace:^",
49
- "@cabloy/module-info": "^2.0.0",
49
+ "@cabloy/module-info": "^2.0.3",
50
50
  "@cabloy/utils": "workspace:^",
51
51
  "@cabloy/word-utils": "^2.1.8",
52
52
  "@lcov-viewer/cli": "^1.3.0",
@@ -93,7 +93,8 @@ export class CliBinBuild extends BeanCliBase {
93
93
  const { env, modulesMeta } = await generateVonaMeta(configMeta, configOptions);
94
94
  const outDir = path.join(projectPath, getOutDir());
95
95
  await rimraf(outDir);
96
- await this._rollup(projectPath, env, outDir);
96
+ const { externals, allowBuilds } = await this._rollup(projectPath, env, modulesMeta, outDir);
97
+ await this._packageJson(projectPath, outDir, externals, allowBuilds);
97
98
  await this._assets(projectPath, modulesMeta, outDir);
98
99
  // custom
99
100
  await this._custom(projectPath, env, outDir);
@@ -122,6 +123,37 @@ export class CliBinBuild extends BeanCliBase {
122
123
  }
123
124
  }
124
125
 
126
+ async _packageJson(
127
+ _projectPath: string,
128
+ outDir: string,
129
+ externals: Record<string, string>,
130
+ allowBuilds: Record<string, boolean>,
131
+ ) {
132
+ // package.json
133
+ const dependencies: Record<string, string> = {};
134
+ for (const name of Object.keys(externals).sort()) {
135
+ const version = externals[name];
136
+ if (!version) throw new Error(`external dependency version not found: ${name}`);
137
+ dependencies[name] = version;
138
+ }
139
+ const pkgContent = {
140
+ type: 'module',
141
+ dependencies,
142
+ };
143
+ await fse.writeFile(
144
+ path.join(outDir, 'package.json'),
145
+ `${JSON.stringify(pkgContent, null, 2)}\n`,
146
+ );
147
+ // pnpm-workspace.yaml
148
+ const nativeBuildDepsAllowList = Object.keys(allowBuilds);
149
+ const content = [
150
+ 'allowBuilds:',
151
+ ...nativeBuildDepsAllowList.map(name => ` ${name}: true`),
152
+ '',
153
+ ].join('\n');
154
+ await fse.writeFile(path.join(outDir, 'pnpm-workspace.yaml'), content);
155
+ }
156
+
125
157
  async _custom(projectPath: string, env: NodeJS.ProcessEnv, outDir: string) {
126
158
  // custom
127
159
  const jsFile = path.join(projectPath, 'src/backend/cli.ts');
@@ -156,7 +188,12 @@ export class CliBinBuild extends BeanCliBase {
156
188
  await rimraf(`${assetsPath}/**/.DS_Store`, { glob: true });
157
189
  }
158
190
 
159
- async _rollup(projectPath: string, env: NodeJS.ProcessEnv, outDir: string) {
191
+ async _rollup(
192
+ projectPath: string,
193
+ env: NodeJS.ProcessEnv,
194
+ modulesMeta: Awaited<ReturnType<typeof glob>>,
195
+ outDir: string,
196
+ ) {
160
197
  const aliasEntries: aliasImport.Alias[] = [];
161
198
  const dialectDrivers = (process.env.BUILD_DIALECT_DRIVERS || '').split(',');
162
199
  for (const name of __dialectDriversAll) {
@@ -167,6 +204,34 @@ export class CliBinBuild extends BeanCliBase {
167
204
  const sourceMap = process.env.BUILD_SOURCEMAP === 'true';
168
205
 
169
206
  const replaceValues = generateConfigDefine(env, ['NODE_ENV', 'META_MODE', 'META_FLAVOR']);
207
+ for (const relativeName in modulesMeta.modules) {
208
+ const module = modulesMeta.modules[relativeName];
209
+ const replacesModule = module.package.vonaModule?.bundle?.replaces;
210
+ if (!replacesModule) continue;
211
+ for (const replaceModule of replacesModule) {
212
+ replaceValues[replaceModule[0]] = replaceModule[1];
213
+ }
214
+ }
215
+
216
+ const externals: Record<string, string> = {};
217
+ for (const relativeName in modulesMeta.modules) {
218
+ const module = modulesMeta.modules[relativeName];
219
+ const externalsModule = module.package.vonaModule?.bundle?.externals;
220
+ if (!externalsModule) continue;
221
+ for (const external of externalsModule) {
222
+ externals[external] = module.package.dependencies[external];
223
+ }
224
+ }
225
+
226
+ const allowBuilds: Record<string, true> = {};
227
+ for (const relativeName in modulesMeta.modules) {
228
+ const module = modulesMeta.modules[relativeName];
229
+ const allowBuildsModule = module.package.vonaModule?.bundle?.allowBuilds;
230
+ if (!allowBuildsModule) continue;
231
+ for (const allowBuild of allowBuildsModule) {
232
+ allowBuilds[allowBuild] = true;
233
+ }
234
+ }
170
235
 
171
236
  const babelPluginVonaBeanModule = getAbsolutePathOfModule('babel-plugin-vona-bean-module', '');
172
237
  const babelPluginTransformTypescriptMetadata = getAbsolutePathOfModule(
@@ -235,6 +300,7 @@ export class CliBinBuild extends BeanCliBase {
235
300
  const inputOptions: RollupOptions = {
236
301
  input: path.join(projectPath, '.vona/bootstrap.ts'),
237
302
  plugins,
303
+ external: Object.keys(externals),
238
304
  onLog: (level: LogLevel, log: RollupLog, defaultHandler: LogOrStringHandler) => {
239
305
  if (
240
306
  log.code === 'CIRCULAR_DEPENDENCY' &&
@@ -276,5 +342,7 @@ export class CliBinBuild extends BeanCliBase {
276
342
  await bundle.close();
277
343
  }
278
344
  }
345
+
346
+ return { externals, allowBuilds };
279
347
  }
280
348
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "babel-plugin-vona-bean-module",
3
- "version": "1.1.6",
3
+ "version": "1.1.7",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "babel-plugin-vona-bean-module",
6
6
  "keywords": [
@@ -39,7 +39,7 @@
39
39
  "dependencies": {
40
40
  "@babel/core": "^7.29.0",
41
41
  "@babel/traverse": "^7.29.0",
42
- "@cabloy/module-info": "^2.0.0",
42
+ "@cabloy/module-info": "^2.0.3",
43
43
  "@cabloy/word-utils": "^2.1.8"
44
44
  },
45
45
  "devDependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cabloy/module-glob",
3
- "version": "5.3.16",
3
+ "version": "5.3.17",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "cabloy module-glob",
6
6
  "keywords": [
@@ -34,7 +34,7 @@
34
34
  "postpack": "clean-package restore"
35
35
  },
36
36
  "dependencies": {
37
- "@cabloy/module-info": "^2.0.0",
37
+ "@cabloy/module-info": "^2.0.3",
38
38
  "@cabloy/utils": "workspace:^",
39
39
  "boxen": "^4.2.0",
40
40
  "chalk": "^3.0.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cabloy/module-info-pro",
3
- "version": "1.1.7",
3
+ "version": "1.1.8",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "cabloy module-info-pro",
6
6
  "keywords": [
@@ -34,7 +34,7 @@
34
34
  "postpack": "clean-package restore"
35
35
  },
36
36
  "dependencies": {
37
- "@cabloy/module-info": "^2.0.0",
37
+ "@cabloy/module-info": "^2.0.3",
38
38
  "stack-utils": "^2.0.6"
39
39
  },
40
40
  "devDependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cabloy/utils",
3
- "version": "2.1.25",
3
+ "version": "2.1.26",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "cabloy utils",
6
6
  "keywords": [
@@ -34,7 +34,7 @@
34
34
  "postpack": "clean-package restore"
35
35
  },
36
36
  "dependencies": {
37
- "@cabloy/module-info": "^2.0.0",
37
+ "@cabloy/module-info": "^2.0.3",
38
38
  "@cabloy/word-utils": "^2.1.8",
39
39
  "@marcbachmann/cel-js": "^7.6.0",
40
40
  "object-hash": "^3.0.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona",
3
- "version": "5.1.67",
3
+ "version": "5.1.68",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "Vona is an intuitive, elegant and powerful Node.js framework for rapidly developing enterprise applications of any size",
6
6
  "keywords": [
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-core",
3
- "version": "5.1.30",
3
+ "version": "5.1.31",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "vona",
6
6
  "keywords": [
@@ -39,7 +39,7 @@
39
39
  "@cabloy/extend": "workspace:^",
40
40
  "@cabloy/json5": "workspace:^",
41
41
  "@cabloy/localeutil": "workspace:^",
42
- "@cabloy/module-info": "^2.0.0",
42
+ "@cabloy/module-info": "^2.0.3",
43
43
  "@cabloy/module-info-pro": "workspace:^",
44
44
  "@cabloy/type-fest": "^5.3.1",
45
45
  "@cabloy/utils": "workspace:^",