@oyolincc/create 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. package/package.json +2 -2
  2. package/templates/hono-fullstack/.codegraph/.gitignore +5 -0
  3. package/templates/hono-fullstack/README.md +22 -1
  4. package/templates/hono-fullstack/_gitignore +1 -0
  5. package/templates/hono-fullstack/apps/server/package.json +7 -2
  6. package/templates/hono-fullstack/apps/server/src/adapters/cloudflare/entry.ts +4 -30
  7. package/templates/hono-fullstack/apps/server/src/adapters/nodejs/bootstrap.ts +20 -12
  8. package/templates/hono-fullstack/apps/server/src/adapters/nodejs/entry.ts +7 -57
  9. package/templates/hono-fullstack/apps/server/src/app.ts +37 -21
  10. package/templates/hono-fullstack/apps/server/src/config.ts +1 -1
  11. package/templates/hono-fullstack/apps/server/src/di-container.ts +51 -0
  12. package/templates/hono-fullstack/apps/server/src/infra/logger/getter.ts +1 -1
  13. package/templates/hono-fullstack/apps/server/src/infra/logger/pino.ts +21 -34
  14. package/templates/hono-fullstack/apps/server/src/infra/work-runner/errors.ts +22 -0
  15. package/templates/hono-fullstack/apps/server/src/infra/work-runner/pass-through/runner.ts +28 -22
  16. package/templates/hono-fullstack/apps/server/src/infra/work-runner/piscina/runner.ts +11 -34
  17. package/templates/hono-fullstack/apps/server/src/infra/work-runner/{example → piscina}/worker-entry.ts +6 -2
  18. package/templates/hono-fullstack/apps/server/src/infra/work-runner/types.ts +2 -16
  19. package/templates/hono-fullstack/apps/server/src/infra/work-runner/utils/business-error.ts +10 -5
  20. package/templates/hono-fullstack/apps/server/src/infra/work-runner/utils/message.ts +5 -17
  21. package/templates/hono-fullstack/apps/server/src/middlewares/cors.ts +16 -22
  22. package/templates/hono-fullstack/apps/server/src/middlewares/logger.ts +34 -0
  23. package/templates/hono-fullstack/apps/server/src/modules/example/module.ts +8 -0
  24. package/templates/hono-fullstack/apps/server/src/modules/example/queries.ts +8 -0
  25. package/templates/hono-fullstack/apps/server/src/modules/example/routes.ts +74 -68
  26. package/templates/hono-fullstack/apps/server/src/modules/example/service.test.ts +53 -0
  27. package/templates/hono-fullstack/apps/server/src/modules/example/service.ts +54 -0
  28. package/templates/hono-fullstack/apps/server/src/modules/example/types.ts +12 -0
  29. package/templates/hono-fullstack/apps/server/src/modules/example/work-task/tasks.test.ts +9 -35
  30. package/templates/hono-fullstack/apps/server/src/modules/example/work-task/tasks.ts +15 -46
  31. package/templates/hono-fullstack/apps/server/src/shared/errors/defs/index.ts +6 -1
  32. package/templates/hono-fullstack/apps/server/src/shared/errors/handler.ts +1 -1
  33. package/templates/hono-fullstack/apps/server/src/shared/network/openapi/index.ts +1 -1
  34. package/templates/hono-fullstack/apps/server/src/shared/types/app.ts +51 -0
  35. package/templates/hono-fullstack/apps/server/src/shared/types/db.ts +126 -0
  36. package/templates/hono-fullstack/apps/server/src/shared/utils/data-access/check.ts +19 -0
  37. package/templates/hono-fullstack/apps/server/src/shared/utils/data-access/model.ts +47 -0
  38. package/templates/hono-fullstack/apps/server/src/shared/utils/data-access/params.ts +105 -0
  39. package/templates/hono-fullstack/apps/server/src/shared/utils/data-access/query.test.ts +139 -0
  40. package/templates/hono-fullstack/apps/server/src/shared/utils/data-access/query.ts +236 -0
  41. package/templates/hono-fullstack/apps/server/vite.config.ts +2 -2
  42. package/templates/hono-fullstack/apps/server/wrangler.jsonc +1 -1
  43. package/templates/hono-fullstack/apps/stack/frontend/assets/styles.css +6 -0
  44. package/templates/hono-fullstack/apps/stack/frontend/components/general/ErrorMessage.tsx +3 -1
  45. package/templates/hono-fullstack/apps/stack/frontend/components/layouts/AppLayout.tsx +2 -1
  46. package/templates/hono-fullstack/apps/stack/frontend/components/layouts/Header.tsx +14 -2
  47. package/templates/hono-fullstack/apps/stack/frontend/components/layouts/Page.tsx +2 -1
  48. package/templates/hono-fullstack/apps/stack/frontend/components/layouts/PageContainer.tsx +4 -1
  49. package/templates/hono-fullstack/apps/stack/frontend/modules/example/api.ts +16 -9
  50. package/templates/hono-fullstack/apps/stack/frontend/modules/example/components/ExampleForm.tsx +25 -12
  51. package/templates/hono-fullstack/apps/stack/frontend/modules/example/components/ExampleList.tsx +13 -4
  52. package/templates/hono-fullstack/apps/stack/frontend/modules/example/hooks/api-hooks.ts +3 -3
  53. package/templates/hono-fullstack/apps/stack/frontend/routes/__root.tsx +1 -1
  54. package/templates/hono-fullstack/apps/stack/frontend/routes/index.tsx +16 -4
  55. package/templates/hono-fullstack/apps/stack/package.json +9 -4
  56. package/templates/hono-fullstack/apps/stack/panda.config.ts +31 -0
  57. package/templates/hono-fullstack/apps/stack/tsconfig.json +1 -0
  58. package/templates/hono-fullstack/apps/stack/turbo.json +20 -0
  59. package/templates/hono-fullstack/apps/stack/vite.config.ts +48 -12
  60. package/templates/hono-fullstack/apps/stack/wrangler.jsonc +1 -1
  61. package/templates/hono-fullstack/envs/.env.example.sqlite-d1 +1 -0
  62. package/templates/hono-fullstack/libs/db/drizzle-kit/sqlite-d1.config.ts +29 -10
  63. package/templates/hono-fullstack/libs/db/package.json +1 -0
  64. package/templates/hono-fullstack/libs/db/src/dialects/sqlite/schema/columns.ts +1 -1
  65. package/templates/hono-fullstack/libs/db/src/dialects/sqlite/schema/modules/examples/examples.ts +6 -3
  66. package/templates/hono-fullstack/libs/db/src/dialects/sqlite/schema/vo.ts +7 -1
  67. package/templates/hono-fullstack/libs/definition/README.md +81 -0
  68. package/templates/hono-fullstack/libs/definition/package.json +3 -1
  69. package/templates/hono-fullstack/libs/definition/src/constants/index.ts +1 -0
  70. package/templates/hono-fullstack/libs/definition/src/constants/pagination.ts +3 -0
  71. package/templates/hono-fullstack/libs/definition/src/modules/common-contracts.ts +24 -0
  72. package/templates/hono-fullstack/libs/definition/src/modules/example/contracts.ts +34 -0
  73. package/templates/hono-fullstack/libs/definition/src/modules/example/index.ts +1 -16
  74. package/templates/hono-fullstack/libs/definition/src/modules/index.ts +2 -0
  75. package/templates/hono-fullstack/libs/definition/src/modules/vo-generated-types.ts +12 -0
  76. package/templates/hono-fullstack/libs/ui/.storybook/main.ts +32 -0
  77. package/templates/hono-fullstack/libs/ui/.storybook/panda.config.ts +22 -0
  78. package/templates/hono-fullstack/libs/ui/.storybook/preview.tsx +79 -0
  79. package/templates/hono-fullstack/libs/ui/.storybook/styles.css +1 -0
  80. package/templates/hono-fullstack/libs/ui/.storybook/vite.config.ts +37 -0
  81. package/templates/hono-fullstack/libs/ui/components.json +15 -0
  82. package/templates/hono-fullstack/libs/ui/package.json +114 -0
  83. package/templates/hono-fullstack/libs/ui/panda.config.ts +41 -0
  84. package/templates/hono-fullstack/libs/ui/src/Tooltip.tsx +47 -0
  85. package/templates/hono-fullstack/libs/ui/src/components/atoms/buttons/Button.tsx +80 -0
  86. package/templates/hono-fullstack/libs/ui/src/components/atoms/buttons/CloseButton.tsx +15 -0
  87. package/templates/hono-fullstack/libs/ui/src/components/atoms/buttons/IconButton.tsx +10 -0
  88. package/templates/hono-fullstack/libs/ui/src/components/atoms/collections/Combobox.tsx +91 -0
  89. package/templates/hono-fullstack/libs/ui/src/components/atoms/collections/Select.tsx +88 -0
  90. package/templates/hono-fullstack/libs/ui/src/components/atoms/collections/TreeView.tsx +142 -0
  91. package/templates/hono-fullstack/libs/ui/src/components/atoms/data-display/Avatar.tsx +64 -0
  92. package/templates/hono-fullstack/libs/ui/src/components/atoms/data-display/Badge.tsx +7 -0
  93. package/templates/hono-fullstack/libs/ui/src/components/atoms/data-display/Card.tsx +23 -0
  94. package/templates/hono-fullstack/libs/ui/src/components/atoms/data-display/Clipboard.tsx +77 -0
  95. package/templates/hono-fullstack/libs/ui/src/components/atoms/data-display/Icon.tsx +9 -0
  96. package/templates/hono-fullstack/libs/ui/src/components/atoms/data-display/Table.tsx +51 -0
  97. package/templates/hono-fullstack/libs/ui/src/components/atoms/data-display/Tag.tsx +23 -0
  98. package/templates/hono-fullstack/libs/ui/src/components/atoms/data-display/Timeline.tsx +33 -0
  99. package/templates/hono-fullstack/libs/ui/src/components/atoms/date-and-time/DatePicker.tsx +255 -0
  100. package/templates/hono-fullstack/libs/ui/src/components/atoms/disclosure/Accordion.tsx +48 -0
  101. package/templates/hono-fullstack/libs/ui/src/components/atoms/disclosure/Breadcrumb.tsx +50 -0
  102. package/templates/hono-fullstack/libs/ui/src/components/atoms/disclosure/Collapsible.tsx +34 -0
  103. package/templates/hono-fullstack/libs/ui/src/components/atoms/disclosure/Pagination.tsx +74 -0
  104. package/templates/hono-fullstack/libs/ui/src/components/atoms/disclosure/Steps.tsx +91 -0
  105. package/templates/hono-fullstack/libs/ui/src/components/atoms/disclosure/Tabs.tsx +37 -0
  106. package/templates/hono-fullstack/libs/ui/src/components/atoms/feedback/Alert.tsx +52 -0
  107. package/templates/hono-fullstack/libs/ui/src/components/atoms/feedback/Progress.tsx +41 -0
  108. package/templates/hono-fullstack/libs/ui/src/components/atoms/feedback/ProgressCircle.tsx +40 -0
  109. package/templates/hono-fullstack/libs/ui/src/components/atoms/feedback/Skeleton.tsx +37 -0
  110. package/templates/hono-fullstack/libs/ui/src/components/atoms/feedback/Spinner.tsx +7 -0
  111. package/templates/hono-fullstack/libs/ui/src/components/atoms/feedback/Toast.tsx +99 -0
  112. package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/Checkbox.tsx +95 -0
  113. package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/ColorPicker.tsx +148 -0
  114. package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/Editable.tsx +44 -0
  115. package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/Field.tsx +36 -0
  116. package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/Fieldset.tsx +34 -0
  117. package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/FileUpload.tsx +143 -0
  118. package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/Input.tsx +7 -0
  119. package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/InputAddon.tsx +7 -0
  120. package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/InputGroup.tsx +61 -0
  121. package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/NativeSelect.tsx +81 -0
  122. package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/NumberInput.tsx +63 -0
  123. package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/PasswordInput.tsx +76 -0
  124. package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/PinInput.tsx +36 -0
  125. package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/RadioCard.tsx +96 -0
  126. package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/RadioGroup.tsx +61 -0
  127. package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/RatingGroup.tsx +106 -0
  128. package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/SegmentGroup.tsx +68 -0
  129. package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/Slider.tsx +87 -0
  130. package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/Switch.tsx +74 -0
  131. package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/TagsInput.tsx +77 -0
  132. package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/Textarea.tsx +7 -0
  133. package/templates/hono-fullstack/libs/ui/src/components/atoms/index.ts +98 -0
  134. package/templates/hono-fullstack/libs/ui/src/components/atoms/internal/AbsoluteCenter.tsx +7 -0
  135. package/templates/hono-fullstack/libs/ui/src/components/atoms/internal/Loader.tsx +69 -0
  136. package/templates/hono-fullstack/libs/ui/src/components/atoms/internal/Span.tsx +5 -0
  137. package/templates/hono-fullstack/libs/ui/src/components/atoms/internal/create-layout.ts +18 -0
  138. package/templates/hono-fullstack/libs/ui/src/components/atoms/layout/Float.tsx +7 -0
  139. package/templates/hono-fullstack/libs/ui/src/components/atoms/layout/Grid.tsx +17 -0
  140. package/templates/hono-fullstack/libs/ui/src/components/atoms/layout/Group.tsx +7 -0
  141. package/templates/hono-fullstack/libs/ui/src/components/atoms/layout/ScrollArea.tsx +46 -0
  142. package/templates/hono-fullstack/libs/ui/src/components/atoms/layout/Separator.tsx +26 -0
  143. package/templates/hono-fullstack/libs/ui/src/components/atoms/layout/Stack.tsx +54 -0
  144. package/templates/hono-fullstack/libs/ui/src/components/atoms/overlays/Dialog.tsx +69 -0
  145. package/templates/hono-fullstack/libs/ui/src/components/atoms/overlays/Drawer.tsx +49 -0
  146. package/templates/hono-fullstack/libs/ui/src/components/atoms/overlays/HoverCard.tsx +37 -0
  147. package/templates/hono-fullstack/libs/ui/src/components/atoms/overlays/Menu.tsx +74 -0
  148. package/templates/hono-fullstack/libs/ui/src/components/atoms/overlays/OverlayManager.test.ts +124 -0
  149. package/templates/hono-fullstack/libs/ui/src/components/atoms/overlays/OverlayManager.tsx +189 -0
  150. package/templates/hono-fullstack/libs/ui/src/components/atoms/overlays/Popover.tsx +57 -0
  151. package/templates/hono-fullstack/libs/ui/src/components/atoms/overlays/Tooltip.tsx +37 -0
  152. package/templates/hono-fullstack/libs/ui/src/components/atoms/typography/Heading.tsx +6 -0
  153. package/templates/hono-fullstack/libs/ui/src/components/atoms/typography/Link.tsx +7 -0
  154. package/templates/hono-fullstack/libs/ui/src/components/atoms/typography/LinkOverlay.tsx +21 -0
  155. package/templates/hono-fullstack/libs/ui/src/components/atoms/typography/Text.tsx +6 -0
  156. package/templates/hono-fullstack/libs/ui/src/components/atoms/utilities/VisuallyHidden.tsx +13 -0
  157. package/templates/hono-fullstack/libs/ui/src/hooks.ts +242 -0
  158. package/templates/hono-fullstack/libs/ui/src/index.ts +19 -0
  159. package/templates/hono-fullstack/libs/ui/src/theme/animation-styles.ts +50 -0
  160. package/templates/hono-fullstack/libs/ui/src/theme/breakpoints.ts +7 -0
  161. package/templates/hono-fullstack/libs/ui/src/theme/conditions.ts +12 -0
  162. package/templates/hono-fullstack/libs/ui/src/theme/containers.ts +16 -0
  163. package/templates/hono-fullstack/libs/ui/src/theme/global-css.ts +12 -0
  164. package/templates/hono-fullstack/libs/ui/src/theme/keyframes.ts +157 -0
  165. package/templates/hono-fullstack/libs/ui/src/theme/layer-styles.ts +11 -0
  166. package/templates/hono-fullstack/libs/ui/src/theme/patterns/grid.ts +51 -0
  167. package/templates/hono-fullstack/libs/ui/src/theme/patterns/index.ts +60 -0
  168. package/templates/hono-fullstack/libs/ui/src/theme/patterns/stack.ts +46 -0
  169. package/templates/hono-fullstack/libs/ui/src/theme/recipes/absolute-center.ts +38 -0
  170. package/templates/hono-fullstack/libs/ui/src/theme/recipes/accordion.ts +68 -0
  171. package/templates/hono-fullstack/libs/ui/src/theme/recipes/alert.ts +83 -0
  172. package/templates/hono-fullstack/libs/ui/src/theme/recipes/avatar.ts +155 -0
  173. package/templates/hono-fullstack/libs/ui/src/theme/recipes/badge.ts +67 -0
  174. package/templates/hono-fullstack/libs/ui/src/theme/recipes/breadcrumb.ts +69 -0
  175. package/templates/hono-fullstack/libs/ui/src/theme/recipes/button.ts +149 -0
  176. package/templates/hono-fullstack/libs/ui/src/theme/recipes/card.ts +36 -0
  177. package/templates/hono-fullstack/libs/ui/src/theme/recipes/checkbox.ts +120 -0
  178. package/templates/hono-fullstack/libs/ui/src/theme/recipes/clipboard.ts +22 -0
  179. package/templates/hono-fullstack/libs/ui/src/theme/recipes/collapsible.ts +26 -0
  180. package/templates/hono-fullstack/libs/ui/src/theme/recipes/color-picker.ts +299 -0
  181. package/templates/hono-fullstack/libs/ui/src/theme/recipes/combobox.ts +141 -0
  182. package/templates/hono-fullstack/libs/ui/src/theme/recipes/date-picker.ts +302 -0
  183. package/templates/hono-fullstack/libs/ui/src/theme/recipes/dialog.ts +191 -0
  184. package/templates/hono-fullstack/libs/ui/src/theme/recipes/drawer.ts +170 -0
  185. package/templates/hono-fullstack/libs/ui/src/theme/recipes/editable.ts +64 -0
  186. package/templates/hono-fullstack/libs/ui/src/theme/recipes/field.ts +41 -0
  187. package/templates/hono-fullstack/libs/ui/src/theme/recipes/fieldset.ts +47 -0
  188. package/templates/hono-fullstack/libs/ui/src/theme/recipes/file-upload.ts +86 -0
  189. package/templates/hono-fullstack/libs/ui/src/theme/recipes/group.ts +78 -0
  190. package/templates/hono-fullstack/libs/ui/src/theme/recipes/heading.ts +24 -0
  191. package/templates/hono-fullstack/libs/ui/src/theme/recipes/hover-card.ts +47 -0
  192. package/templates/hono-fullstack/libs/ui/src/theme/recipes/icon.ts +25 -0
  193. package/templates/hono-fullstack/libs/ui/src/theme/recipes/index.ts +120 -0
  194. package/templates/hono-fullstack/libs/ui/src/theme/recipes/input-addon.ts +51 -0
  195. package/templates/hono-fullstack/libs/ui/src/theme/recipes/input-group.ts +77 -0
  196. package/templates/hono-fullstack/libs/ui/src/theme/recipes/input.ts +99 -0
  197. package/templates/hono-fullstack/libs/ui/src/theme/recipes/link.ts +36 -0
  198. package/templates/hono-fullstack/libs/ui/src/theme/recipes/menu.ts +114 -0
  199. package/templates/hono-fullstack/libs/ui/src/theme/recipes/native-select.ts +92 -0
  200. package/templates/hono-fullstack/libs/ui/src/theme/recipes/number-input.ts +91 -0
  201. package/templates/hono-fullstack/libs/ui/src/theme/recipes/pagination.ts +9 -0
  202. package/templates/hono-fullstack/libs/ui/src/theme/recipes/pin-input.ts +33 -0
  203. package/templates/hono-fullstack/libs/ui/src/theme/recipes/popover.ts +78 -0
  204. package/templates/hono-fullstack/libs/ui/src/theme/recipes/progress-circle.ts +50 -0
  205. package/templates/hono-fullstack/libs/ui/src/theme/recipes/progress.ts +112 -0
  206. package/templates/hono-fullstack/libs/ui/src/theme/recipes/radio-card.ts +223 -0
  207. package/templates/hono-fullstack/libs/ui/src/theme/recipes/radio-group.ts +78 -0
  208. package/templates/hono-fullstack/libs/ui/src/theme/recipes/rating-group.ts +98 -0
  209. package/templates/hono-fullstack/libs/ui/src/theme/recipes/scroll-area.ts +119 -0
  210. package/templates/hono-fullstack/libs/ui/src/theme/recipes/segment-group.ts +162 -0
  211. package/templates/hono-fullstack/libs/ui/src/theme/recipes/select.ts +157 -0
  212. package/templates/hono-fullstack/libs/ui/src/theme/recipes/separator.ts +25 -0
  213. package/templates/hono-fullstack/libs/ui/src/theme/recipes/skeleton.ts +65 -0
  214. package/templates/hono-fullstack/libs/ui/src/theme/recipes/slider.ts +164 -0
  215. package/templates/hono-fullstack/libs/ui/src/theme/recipes/spinner.ts +34 -0
  216. package/templates/hono-fullstack/libs/ui/src/theme/recipes/steps.ts +162 -0
  217. package/templates/hono-fullstack/libs/ui/src/theme/recipes/switch.ts +150 -0
  218. package/templates/hono-fullstack/libs/ui/src/theme/recipes/table.ts +150 -0
  219. package/templates/hono-fullstack/libs/ui/src/theme/recipes/tabs.ts +128 -0
  220. package/templates/hono-fullstack/libs/ui/src/theme/recipes/tag.ts +114 -0
  221. package/templates/hono-fullstack/libs/ui/src/theme/recipes/tags-input.ts +201 -0
  222. package/templates/hono-fullstack/libs/ui/src/theme/recipes/text.ts +7 -0
  223. package/templates/hono-fullstack/libs/ui/src/theme/recipes/textarea.ts +90 -0
  224. package/templates/hono-fullstack/libs/ui/src/theme/recipes/timeline.ts +137 -0
  225. package/templates/hono-fullstack/libs/ui/src/theme/recipes/toast.ts +52 -0
  226. package/templates/hono-fullstack/libs/ui/src/theme/recipes/tooltip.ts +44 -0
  227. package/templates/hono-fullstack/libs/ui/src/theme/recipes/tree-view.ts +200 -0
  228. package/templates/hono-fullstack/libs/ui/src/theme/semanticTokens/colors/amber.ts +91 -0
  229. package/templates/hono-fullstack/libs/ui/src/theme/semanticTokens/colors/gray.ts +103 -0
  230. package/templates/hono-fullstack/libs/ui/src/theme/semanticTokens/colors/green.ts +88 -0
  231. package/templates/hono-fullstack/libs/ui/src/theme/semanticTokens/colors/index.ts +14 -0
  232. package/templates/hono-fullstack/libs/ui/src/theme/semanticTokens/colors/lime.ts +91 -0
  233. package/templates/hono-fullstack/libs/ui/src/theme/semanticTokens/colors/red.ts +88 -0
  234. package/templates/hono-fullstack/libs/ui/src/theme/semanticTokens/index.ts +8 -0
  235. package/templates/hono-fullstack/libs/ui/src/theme/semanticTokens/shadows.ts +46 -0
  236. package/templates/hono-fullstack/libs/ui/src/theme/text-styles.ts +82 -0
  237. package/templates/hono-fullstack/libs/ui/src/theme/tokens/animations.ts +8 -0
  238. package/templates/hono-fullstack/libs/ui/src/theme/tokens/aspect-ratio.ts +6 -0
  239. package/templates/hono-fullstack/libs/ui/src/theme/tokens/borders.ts +5 -0
  240. package/templates/hono-fullstack/libs/ui/src/theme/tokens/colors.ts +35 -0
  241. package/templates/hono-fullstack/libs/ui/src/theme/tokens/durations.ts +11 -0
  242. package/templates/hono-fullstack/libs/ui/src/theme/tokens/easings.ts +9 -0
  243. package/templates/hono-fullstack/libs/ui/src/theme/tokens/index.ts +42 -0
  244. package/templates/hono-fullstack/libs/ui/src/theme/tokens/radii.ts +13 -0
  245. package/templates/hono-fullstack/libs/ui/src/theme/tokens/sizes.ts +27 -0
  246. package/templates/hono-fullstack/libs/ui/src/theme/tokens/spacing.ts +41 -0
  247. package/templates/hono-fullstack/libs/ui/src/theme/tokens/typography.ts +86 -0
  248. package/templates/hono-fullstack/libs/ui/src/theme/tokens/z-index.ts +43 -0
  249. package/templates/hono-fullstack/libs/ui/stories/README.md +107 -0
  250. package/templates/hono-fullstack/libs/ui/stories/actions/Button.stories.tsx +260 -0
  251. package/templates/hono-fullstack/libs/ui/stories/actions/Clipboard.stories.tsx +87 -0
  252. package/templates/hono-fullstack/libs/ui/stories/actions/IconButton.stories.tsx +33 -0
  253. package/templates/hono-fullstack/libs/ui/stories/collections/Combobox.stories.tsx +334 -0
  254. package/templates/hono-fullstack/libs/ui/stories/collections/Select.stories.tsx +342 -0
  255. package/templates/hono-fullstack/libs/ui/stories/collections/TreeView.stories.tsx +252 -0
  256. package/templates/hono-fullstack/libs/ui/stories/color/ColorPicker.stories.tsx +217 -0
  257. package/templates/hono-fullstack/libs/ui/stories/date/DatePicker.stories.tsx +302 -0
  258. package/templates/hono-fullstack/libs/ui/stories/disclosure/Accordion.stories.tsx +105 -0
  259. package/templates/hono-fullstack/libs/ui/stories/disclosure/Collapsible.stories.tsx +55 -0
  260. package/templates/hono-fullstack/libs/ui/stories/disclosure/Steps.stories.tsx +208 -0
  261. package/templates/hono-fullstack/libs/ui/stories/disclosure/Tabs.stories.tsx +176 -0
  262. package/templates/hono-fullstack/libs/ui/stories/display/Avatar.stories.tsx +108 -0
  263. package/templates/hono-fullstack/libs/ui/stories/display/Badge.stories.tsx +90 -0
  264. package/templates/hono-fullstack/libs/ui/stories/display/Card.stories.tsx +121 -0
  265. package/templates/hono-fullstack/libs/ui/stories/display/Heading.stories.tsx +62 -0
  266. package/templates/hono-fullstack/libs/ui/stories/display/Icon.stories.tsx +51 -0
  267. package/templates/hono-fullstack/libs/ui/stories/display/Table.stories.tsx +222 -0
  268. package/templates/hono-fullstack/libs/ui/stories/display/Tag.stories.tsx +168 -0
  269. package/templates/hono-fullstack/libs/ui/stories/display/Text.stories.tsx +32 -0
  270. package/templates/hono-fullstack/libs/ui/stories/display/Timeline.stories.tsx +241 -0
  271. package/templates/hono-fullstack/libs/ui/stories/feedback/Alert.stories.tsx +122 -0
  272. package/templates/hono-fullstack/libs/ui/stories/feedback/Progress.stories.tsx +163 -0
  273. package/templates/hono-fullstack/libs/ui/stories/feedback/ProgressCircle.stories.tsx +176 -0
  274. package/templates/hono-fullstack/libs/ui/stories/feedback/Skeleton.stories.tsx +75 -0
  275. package/templates/hono-fullstack/libs/ui/stories/feedback/Spinner.stories.tsx +49 -0
  276. package/templates/hono-fullstack/libs/ui/stories/feedback/Toast.stories.tsx +145 -0
  277. package/templates/hono-fullstack/libs/ui/stories/forms/Checkbox.stories.tsx +281 -0
  278. package/templates/hono-fullstack/libs/ui/stories/forms/Editable.stories.tsx +94 -0
  279. package/templates/hono-fullstack/libs/ui/stories/forms/Field.stories.tsx +72 -0
  280. package/templates/hono-fullstack/libs/ui/stories/forms/Fieldset.stories.tsx +109 -0
  281. package/templates/hono-fullstack/libs/ui/stories/forms/FileUpload.stories.tsx +115 -0
  282. package/templates/hono-fullstack/libs/ui/stories/forms/Form.stories.tsx +120 -0
  283. package/templates/hono-fullstack/libs/ui/stories/forms/Input.stories.tsx +155 -0
  284. package/templates/hono-fullstack/libs/ui/stories/forms/InputGroup.stories.tsx +79 -0
  285. package/templates/hono-fullstack/libs/ui/stories/forms/NativeSelect.stories.tsx +160 -0
  286. package/templates/hono-fullstack/libs/ui/stories/forms/NumberInput.stories.tsx +149 -0
  287. package/templates/hono-fullstack/libs/ui/stories/forms/PasswordInput.stories.tsx +141 -0
  288. package/templates/hono-fullstack/libs/ui/stories/forms/PinInput.stories.tsx +155 -0
  289. package/templates/hono-fullstack/libs/ui/stories/forms/RadioCard.stories.tsx +265 -0
  290. package/templates/hono-fullstack/libs/ui/stories/forms/RadioGroup.stories.tsx +109 -0
  291. package/templates/hono-fullstack/libs/ui/stories/forms/RatingGroup.stories.tsx +123 -0
  292. package/templates/hono-fullstack/libs/ui/stories/forms/SegmentGroup.stories.tsx +130 -0
  293. package/templates/hono-fullstack/libs/ui/stories/forms/Slider.stories.tsx +190 -0
  294. package/templates/hono-fullstack/libs/ui/stories/forms/Switch.stories.tsx +124 -0
  295. package/templates/hono-fullstack/libs/ui/stories/forms/TagsInput.stories.tsx +154 -0
  296. package/templates/hono-fullstack/libs/ui/stories/forms/Textarea.stories.tsx +148 -0
  297. package/templates/hono-fullstack/libs/ui/stories/layout/Grid.stories.tsx +60 -0
  298. package/templates/hono-fullstack/libs/ui/stories/layout/Positioning.stories.tsx +90 -0
  299. package/templates/hono-fullstack/libs/ui/stories/layout/ScrollArea.stories.tsx +68 -0
  300. package/templates/hono-fullstack/libs/ui/stories/layout/Stack.stories.tsx +87 -0
  301. package/templates/hono-fullstack/libs/ui/stories/navigation/Breadcrumb.stories.tsx +104 -0
  302. package/templates/hono-fullstack/libs/ui/stories/navigation/Link.stories.tsx +62 -0
  303. package/templates/hono-fullstack/libs/ui/stories/navigation/LinkBox.stories.tsx +45 -0
  304. package/templates/hono-fullstack/libs/ui/stories/navigation/Pagination.stories.tsx +74 -0
  305. package/templates/hono-fullstack/libs/ui/stories/overlays/Dialog.stories.tsx +255 -0
  306. package/templates/hono-fullstack/libs/ui/stories/overlays/Drawer.stories.tsx +114 -0
  307. package/templates/hono-fullstack/libs/ui/stories/overlays/HoverCard.stories.tsx +47 -0
  308. package/templates/hono-fullstack/libs/ui/stories/overlays/Menu.stories.tsx +133 -0
  309. package/templates/hono-fullstack/libs/ui/stories/overlays/OverlayManager.stories.tsx +206 -0
  310. package/templates/hono-fullstack/libs/ui/stories/overlays/Popover.stories.tsx +73 -0
  311. package/templates/hono-fullstack/libs/ui/stories/overlays/Tooltip.stories.tsx +114 -0
  312. package/templates/hono-fullstack/libs/ui/stories/tsconfig.json +14 -0
  313. package/templates/hono-fullstack/libs/ui/tsconfig.build.json +5 -0
  314. package/templates/hono-fullstack/libs/ui/tsconfig.json +13 -0
  315. package/templates/hono-fullstack/libs/ui/turbo.json +28 -0
  316. package/templates/hono-fullstack/libs/ui/vite.config.ts +33 -0
  317. package/templates/hono-fullstack/oyo.config.json +30 -4
  318. package/templates/hono-fullstack/package.json +1 -0
  319. package/templates/hono-fullstack/pnpm-workspace.yaml +20 -10
  320. package/templates/hono-fullstack/turbo.json +10 -0
  321. package/templates/hono-server/.codegraph/.gitignore +5 -0
  322. package/templates/hono-server/README.md +9 -1
  323. package/templates/hono-server/_gitignore +1 -0
  324. package/templates/hono-server/apps/server/package.json +7 -2
  325. package/templates/hono-server/apps/server/src/adapters/cloudflare/entry.ts +4 -30
  326. package/templates/hono-server/apps/server/src/adapters/nodejs/bootstrap.ts +20 -12
  327. package/templates/hono-server/apps/server/src/adapters/nodejs/entry.ts +7 -57
  328. package/templates/hono-server/apps/server/src/app.ts +37 -21
  329. package/templates/hono-server/apps/server/src/config.ts +1 -1
  330. package/templates/hono-server/apps/server/src/di-container.ts +51 -0
  331. package/templates/hono-server/apps/server/src/infra/logger/getter.ts +1 -1
  332. package/templates/hono-server/apps/server/src/infra/logger/pino.ts +21 -34
  333. package/templates/hono-server/apps/server/src/infra/work-runner/errors.ts +22 -0
  334. package/templates/hono-server/apps/server/src/infra/work-runner/pass-through/runner.ts +28 -22
  335. package/templates/hono-server/apps/server/src/infra/work-runner/piscina/runner.ts +11 -34
  336. package/templates/hono-server/apps/server/src/infra/work-runner/{example → piscina}/worker-entry.ts +6 -2
  337. package/templates/hono-server/apps/server/src/infra/work-runner/types.ts +2 -16
  338. package/templates/hono-server/apps/server/src/infra/work-runner/utils/business-error.ts +10 -5
  339. package/templates/hono-server/apps/server/src/infra/work-runner/utils/message.ts +5 -17
  340. package/templates/hono-server/apps/server/src/middlewares/cors.ts +16 -22
  341. package/templates/hono-server/apps/server/src/middlewares/logger.ts +34 -0
  342. package/templates/hono-server/apps/server/src/modules/example/module.ts +8 -0
  343. package/templates/hono-server/apps/server/src/modules/example/queries.ts +8 -0
  344. package/templates/hono-server/apps/server/src/modules/example/routes.ts +74 -68
  345. package/templates/hono-server/apps/server/src/modules/example/service.test.ts +53 -0
  346. package/templates/hono-server/apps/server/src/modules/example/service.ts +54 -0
  347. package/templates/hono-server/apps/server/src/modules/example/types.ts +12 -0
  348. package/templates/hono-server/apps/server/src/modules/example/work-task/tasks.test.ts +9 -35
  349. package/templates/hono-server/apps/server/src/modules/example/work-task/tasks.ts +15 -46
  350. package/templates/hono-server/apps/server/src/shared/errors/defs/index.ts +6 -1
  351. package/templates/hono-server/apps/server/src/shared/errors/handler.ts +1 -1
  352. package/templates/hono-server/apps/server/src/shared/network/openapi/index.ts +1 -1
  353. package/templates/hono-server/apps/server/src/shared/types/app.ts +51 -0
  354. package/templates/hono-server/apps/server/src/shared/types/db.ts +126 -0
  355. package/templates/hono-server/apps/server/src/shared/utils/data-access/check.ts +19 -0
  356. package/templates/hono-server/apps/server/src/shared/utils/data-access/model.ts +47 -0
  357. package/templates/hono-server/apps/server/src/shared/utils/data-access/params.ts +105 -0
  358. package/templates/hono-server/apps/server/src/shared/utils/data-access/query.test.ts +139 -0
  359. package/templates/hono-server/apps/server/src/shared/utils/data-access/query.ts +236 -0
  360. package/templates/hono-server/apps/server/vite.config.ts +2 -2
  361. package/templates/hono-server/apps/server/wrangler.jsonc +1 -1
  362. package/templates/hono-server/docker/README.md +1 -1
  363. package/templates/hono-server/envs/.env.example.sqlite-d1 +1 -0
  364. package/templates/hono-server/libs/db/drizzle-kit/sqlite-d1.config.ts +29 -10
  365. package/templates/hono-server/libs/db/package.json +1 -0
  366. package/templates/hono-server/libs/db/src/dialects/sqlite/schema/columns.ts +1 -1
  367. package/templates/hono-server/libs/db/src/dialects/sqlite/schema/modules/examples/examples.ts +6 -3
  368. package/templates/hono-server/libs/db/src/dialects/sqlite/schema/vo.ts +7 -1
  369. package/templates/hono-server/libs/definition/README.md +81 -0
  370. package/templates/hono-server/libs/definition/package.json +3 -1
  371. package/templates/hono-server/libs/definition/src/constants/index.ts +1 -0
  372. package/templates/hono-server/libs/definition/src/constants/pagination.ts +3 -0
  373. package/templates/hono-server/libs/definition/src/modules/common-contracts.ts +24 -0
  374. package/templates/hono-server/libs/definition/src/modules/example/contracts.ts +34 -0
  375. package/templates/hono-server/libs/definition/src/modules/example/index.ts +1 -16
  376. package/templates/hono-server/libs/definition/src/modules/index.ts +2 -0
  377. package/templates/hono-server/libs/definition/src/modules/vo-generated-types.ts +12 -0
  378. package/templates/hono-server/oyo.config.json +30 -4
  379. package/templates/hono-server/package.json +1 -0
  380. package/templates/hono-server/pnpm-workspace.yaml +9 -7
  381. package/templates/hono-server/turbo.json +10 -0
  382. package/templates/monorepo/.codegraph/.gitignore +5 -0
  383. package/templates/monorepo/_gitignore +1 -0
  384. package/templates/monorepo/oyo.config.json +6 -4
  385. package/templates/monorepo/pnpm-workspace.yaml +4 -4
  386. package/templates/monorepo/turbo.json +10 -0
  387. package/templates/hono-fullstack/apps/server/src/modules/example/contracts.ts +0 -9
  388. package/templates/hono-fullstack/apps/server/src/shared/app/types.ts +0 -44
  389. package/templates/hono-fullstack/apps/stack/frontend/styles.css +0 -23
  390. package/templates/hono-server/apps/server/src/modules/example/contracts.ts +0 -9
  391. package/templates/hono-server/apps/server/src/shared/app/types.ts +0 -44
@@ -1,8 +1,29 @@
1
- import { defineConfig, lazyPlugins, type PluginOption } from 'vite-plus'
1
+ import { defineConfig, lazyPlugins, type PluginOption, type UserConfig } from 'vite-plus'
2
2
  import { tanstackStart } from '@tanstack/react-start/plugin/vite'
3
- import tailwindcss from '@tailwindcss/vite'
3
+ import pandacss from '@pandacss/vite'
4
4
  import viteReact from '@vitejs/plugin-react'
5
5
  import path from 'node:path'
6
+ import {
7
+ isUseClientDirectiveWarning,
8
+ type BundlerLog,
9
+ type BundlerLogHandler,
10
+ type BundlerLogLevel,
11
+ } from '@oyolincc/dev-config'
12
+
13
+ const build = {
14
+ rolldownOptions: {
15
+ onLog(level: BundlerLogLevel, log: BundlerLog, defaultHandler: BundlerLogHandler) {
16
+ // 普通 SSR 不消费 RSC 边界,仅忽略依赖中的 use client 指令警告。
17
+ if (
18
+ level === 'warn' &&
19
+ isUseClientDirectiveWarning(log) &&
20
+ log.id?.split(/[\\/]/).includes('node_modules')
21
+ )
22
+ return
23
+ defaultHandler(level, log)
24
+ },
25
+ },
26
+ } satisfies NonNullable<UserConfig['build']>
6
27
 
7
28
  export default defineConfig(() => {
8
29
  const deployTarget = process.env.DEPLOY_TARGET || 'node'
@@ -49,7 +70,10 @@ export default defineConfig(() => {
49
70
  '#server-runtime': path.resolve(import.meta.dirname, `./backend/${deployTarget}.ts`),
50
71
  },
51
72
  },
52
- optimizeDeps: { include: ['@repo/definition/frontend'] },
73
+ optimizeDeps: {
74
+ include: ['@repo/definition/frontend', '@repo/ui'],
75
+ },
76
+ build,
53
77
  plugins: lazyPlugins(async () => {
54
78
  const runtimePlugins =
55
79
  deployTarget === 'cloudflare'
@@ -61,19 +85,31 @@ export default defineConfig(() => {
61
85
  },
62
86
  }),
63
87
  ]
64
- : (await import('nitro/vite')).nitro({
65
- preset: 'node_server',
66
- serverDir: './nitro',
67
- // 拦住第二次:Nitro 最终 server bundle
68
- rollupConfig: {
69
- external: [serverExternal],
70
- },
71
- })
88
+ : [
89
+ {
90
+ name: 'stack:server-runtime-reload',
91
+ apply: 'serve' as const,
92
+ configResolved(config) {
93
+ config.configFileDependencies.push(
94
+ path.resolve(import.meta.dirname, '../server/dist/nodejsEntry.mjs'),
95
+ )
96
+ },
97
+ } satisfies PluginOption,
98
+ ...(await import('nitro/vite')).nitro({
99
+ preset: 'node_server',
100
+ serverDir: './nitro',
101
+ // 拦住第二次:Nitro 最终 server bundle
102
+ rollupConfig: {
103
+ external: [serverExternal],
104
+ onLog: build.rolldownOptions.onLog,
105
+ },
106
+ }),
107
+ ]
72
108
 
73
109
  const pluginOptions = [
74
110
  ...runtimePlugins,
111
+ pandacss(),
75
112
  ...tanstackStart({ srcDirectory: './frontend' }),
76
- ...tailwindcss(),
77
113
  ...viteReact(),
78
114
  ] as PluginOption[]
79
115
  return pluginOptions
@@ -5,7 +5,7 @@
5
5
  "compatibility_date": "2026-09-23",
6
6
  "compatibility_flags": ["nodejs_compat"],
7
7
  "observability": {
8
- "logs": { "enabled": true, "invocation_logs": true },
8
+ "logs": { "enabled": true, "invocation_logs": false },
9
9
  "traces": { "enabled": false },
10
10
  },
11
11
  "d1_databases": [
@@ -1,3 +1,4 @@
1
1
  CLOUDFLARE_ACCOUNT_ID=
2
2
  CLOUDFLARE_DATABASE_ID=
3
3
  CLOUDFLARE_TOKEN=
4
+ IS_D1_LOCAL=1
@@ -4,19 +4,38 @@ import { d1SchemaConfig } from '@repo/definition/backend'
4
4
 
5
5
  const configDir = import.meta.dirname
6
6
 
7
- const { cloudflareAccountId, cloudflareDatabaseId, cloudflareToken } = d1SchemaConfig.resolve({
8
- context: process.env,
9
- matchContextKey: 'constantCase',
10
- })
7
+ let dbCredentials:
8
+ | {
9
+ accountId: string
10
+ databaseId: string
11
+ token: string
12
+ }
13
+ | {
14
+ url: string
15
+ } = {
16
+ url: path.join(
17
+ configDir,
18
+ '../../../.wrangler/state/v3/d1/miniflare-D1DatabaseObject/metadata.sqlite',
19
+ ),
20
+ }
21
+ const isD1Local = !!process.env.IS_D1_LOCAL
22
+
23
+ if (!isD1Local) {
24
+ const { cloudflareAccountId, cloudflareDatabaseId, cloudflareToken } = d1SchemaConfig.resolve({
25
+ context: process.env,
26
+ matchContextKey: 'constantCase',
27
+ })
28
+ dbCredentials = {
29
+ accountId: cloudflareAccountId,
30
+ databaseId: cloudflareDatabaseId,
31
+ token: cloudflareToken,
32
+ }
33
+ }
11
34
 
12
35
  export default defineConfig({
13
36
  dialect: 'sqlite',
14
- driver: 'd1-http',
37
+ driver: isD1Local ? undefined : 'd1-http',
15
38
  schema: path.join(configDir, '../src/dialects/sqlite/schema/tables.ts'),
16
39
  out: path.join(configDir, '../migrations/sqlite-d1'),
17
- dbCredentials: {
18
- accountId: cloudflareAccountId,
19
- databaseId: cloudflareDatabaseId,
20
- token: cloudflareToken,
21
- },
40
+ dbCredentials,
22
41
  })
@@ -22,6 +22,7 @@
22
22
  "dev:sqlite:gen": "oyo env sqlite -- drizzle-kit generate --config=drizzle-kit/sqlite.config.ts",
23
23
  "dev:sqlite:migrate": "oyo env sqlite -- drizzle-kit migrate --config=drizzle-kit/sqlite.config.ts",
24
24
  "dev:d1:gen": "oyo env sqlite-d1 -- drizzle-kit generate --config=drizzle-kit/sqlite-d1.config.ts",
25
+ "dev:d1:push": "oyo env sqlite-d1 -- drizzle-kit push --config=drizzle-kit/sqlite-d1.config.ts",
25
26
  "dev:d1:migrate": "oyo env sqlite-d1 -- drizzle-kit migrate --config=drizzle-kit/sqlite-d1.config.ts"
26
27
  },
27
28
  "dependencies": {
@@ -12,7 +12,7 @@ export const idType = customType<{ data: string; driverData: number | bigint }>(
12
12
 
13
13
  export const autoIncrementId = (name: string) =>
14
14
  idType(name)
15
- .primaryKey({ autoIncrement: true })
15
+ .primaryKey()
16
16
  .$defaultFn(() => sql`null`)
17
17
 
18
18
  export function timestampMsColumn(name: string) {
@@ -11,12 +11,15 @@ export const examples = sqliteTable('examples', {
11
11
 
12
12
  export type InsertExample = typeof examples.$inferInsert
13
13
 
14
- export const voExamples = defineVO({
14
+ export const voExamplesId = defineVO({ id: examples.id })
15
+ export type IExamplesIdVO = SelectVOResults<typeof voExamplesId>
16
+
17
+ export const voExamplesList = defineVO({
15
18
  id: examples.id,
16
19
  message: examples.message,
17
20
  createdAt: examples.createdAt,
18
21
  updatedAt: examples.updatedAt,
19
22
  })
20
- export type IExamplesVO = SelectVOResults<typeof voExamples>
23
+ export type IExamplesListVO = SelectVOResults<typeof voExamplesList>
21
24
 
22
- export const vcExamples = { default: voExamples } as const
25
+ export const vcExamples = { id: voExamplesId, list: voExamplesList }
@@ -1 +1,7 @@
1
- export { vcExamples, voExamples, type IExamplesVO } from './modules/examples/examples'
1
+ export {
2
+ vcExamples,
3
+ voExamplesId,
4
+ voExamplesList,
5
+ type IExamplesIdVO,
6
+ type IExamplesListVO,
7
+ } from './modules/examples/examples'
@@ -0,0 +1,81 @@
1
+ # Definition
2
+
3
+ 存放前后端共享的业务常量、Valibot contracts 和类型。contracts 根据 Drizzle 表生成初稿,再由业务维护;VO 类型根据显式声明的查询投影生成。数据库结构只能提供字段线索,不能替代 API 设计。
4
+
5
+ ## 生成流程
6
+
7
+ 1. 修改 `libs/db/src/dialects/sqlite/schema` 中的表定义,并自行更新 DB 构建产物。生成器读取的是 `libs/db/dist/sqlite/schema.mjs`,不会自动编译源码。
8
+ 2. 检查仓库根目录 `oyo.config.json` 的 `codeGenerator` 配置。
9
+ 3. 在仓库根目录按需执行;contracts 按提示选择表并确认名称,VO 读取入口中的全部 `voXxx` 导出:
10
+
11
+ ```sh
12
+ pnpm --filter @repo/definition codegen:contracts
13
+ pnpm --filter @repo/definition codegen:vo
14
+ ```
15
+
16
+ 4. 查看 diff,补齐业务约束、允许编辑的字段和模块导出,再接入调用方。
17
+
18
+ **当前两个生成脚本均设置了 `IS_OVERRIDE=1`,会覆盖对应产物,包括手改的 contracts 和公共分页文件。** 重新生成前保留改动,生成后逐项合并业务规则。生成器默认跳过已有文件,但当前脚本主动开启了覆盖;`IS_TEST=1` 仅解析和交互,不写文件或配置记录。
19
+
20
+ ## 配置重点
21
+
22
+ 路径以 `codeGenerator.root` 为基准;`root` 相对配置文件所在目录。
23
+
24
+ | 配置 | 当前用途 |
25
+ | --------------------------------------- | -------------------------------------------------------------------------------------- |
26
+ | `database.entry` | Drizzle 表定义的运行时入口,contracts 与 VO 共用 |
27
+ | `database.customTypes` | 自定义列类型映射;当前 `integer → string` 对应自定义 ID 列,不代表所有整数列都转字符串 |
28
+ | `contracts.outputDir` | 必填,默认输出位置,目前为 `src/modules` |
29
+ | `contracts.createOne.excludePrimaryKey` | 默认 `true`,创建 DTO 排除主键 |
30
+ | `contracts.createOne.excludeFields` | 按 Drizzle 属性名排除字段;当前为 `createdAt`、`updatedAt`,实体没有对应字段时忽略 |
31
+ | `contracts.constantsSource` | 公共 contracts 引用的常量文件,当前提供 `DEFAULT_PAGE_SIZE` |
32
+ | `contracts.models` | 实体名到 contracts 文件路径的映射,当前为 `example/contracts.ts` |
33
+ | `contracts.commonContracts` | 公共 contracts 文件路径,默认位于 `outputDir` 下 |
34
+ | `vo.outputDir` | 必填,VO 类型输出目录,目前为 `src/modules` |
35
+ | `vo.models` | 生成文件路径记录;`vo-generated-types` 对应 VO 类型文件 |
36
+
37
+ 生成时会记录文件路径到 `contracts.models` / `contracts.commonContracts`。调整目录后同步修改这些记录;已有记录优先于默认输出路径。创建字段排除配置仅影响 `$CreateOne`,查询字段不受影响。
38
+
39
+ ## 产物约定
40
+
41
+ | 产物 | 用途与维护要求 |
42
+ | ---------------- | ----------------------------------------------------------------------------------------------- |
43
+ | `实体$CreateOne` | 创建 API DTO 草稿。筛选客户端可提交的字段,移除服务端自动填充字段;也承载供更新复用的字段规则 |
44
+ | `实体$UpdateOne` | 从 `$CreateOne` 选取允许编辑的字段并转为可选。初始 `v.pick(..., [])` 为空,**必须主动填写字段** |
45
+ | `实体$FindOne` | 查询条件草稿,字段可选;包含查询输入转换,有 `createdAt` 时补充起止时间条件 |
46
+ | `实体$FindMany` | `$FindOne` 与公共分页规则组合 |
47
+ | `I实体…` | 对应 schema 的输入类型;经过转换后的数据类型需要时使用 `v.InferOutput` |
48
+
49
+ 这些是请求约定,不是数据库 insert/update schema,也不是响应结构。服务端校验后由 Service 组装 IP、时间等字段并写库。没有前端表单的后台任务同样按操作定义输入约定;无需为复用生成物而模拟表单 DTO。响应类型按实际 VO 定义。
50
+
51
+ 前端表单与 API 字段和规则一致时可直接复用;存在确认字段、界面专用字段或不同必填规则时,基于对应 contract 派生表单 schema。服务端必须独立校验 API DTO,不能依赖前端校验。
52
+
53
+ ## VO 工作流
54
+
55
+ 在 DB schema 中用 `defineVO` 声明需要返回的列集合,并通过 `schema/vo.ts` 从 `database.entry` 导出。导出名使用 `voXxx`,生成类型名为 `IXxxVO`:
56
+
57
+ ```ts
58
+ export const voExamplesList = defineVO({
59
+ id: examples.id,
60
+ message: examples.message,
61
+ })
62
+ ```
63
+
64
+ 执行 `codegen:vo` 后,默认集中输出到 `vo.outputDir/vo-generated-types.ts`。VO 生成不依赖 contracts,也不受 `contracts.createOne` 排除字段配置影响。服务端查询的 `voType` 选择仍需在 Model 的 VO 集合中配置;生成类型不会自动改变查询或序列化行为。
65
+
66
+ - **维护投影源,不手改生成文件。** 列集合变化后更新 DB 构建产物,再重新生成;生成文件整体覆盖,不做业务规则合并。
67
+ - **VO 是响应类型,不提供运行时校验。** ID、日期等按列解析规则映射为前端类型,当前日期为 `string`;调用方仍须保证实际响应的序列化结果一致。
68
+ - **检查类型精度。** `$type<T>()` 中的业务枚举、JSON 结构等无法从运行时完整还原,必要时在独立业务类型中细化。当前非空列或带默认值的列生成必填字段,其余为可选且允许 `null`;需核对实际查询结果,尤其是可空列和关联查询。
69
+ - **按实际场景定义投影。** 列表、详情分别选择需要的字段,避免整表暴露。仅含必填字符串 `id` 的投影自动复用公共 `IIdVO`,保留原实体类型名。
70
+ - **接入导出链。** 将生成类型从 `modules/index.ts` 等入口导出,前后端通过 definition 使用,前端无需依赖 DB 包。
71
+
72
+ ## 生成后必查
73
+
74
+ - **业务常量不能靠 DB 类型自动推断。** Drizzle 的 `$type<T>()` 在运行时不保留枚举成员;默认值也不等于枚举范围。需要时手动接入 `v.picklist(Object.values(...))`,不使用 `v.enum`。
75
+ - **保留真正需要的转换。** 字符串常量直接用 `picklist`,无需先 `string` / `toString`;数值查询参数需要时先 `toNumber` 再校验常量范围。
76
+ - **补业务规则。** 当前 example 的 message 使用 trim 和非空校验,重新生成后需检查。字段关联、权限、唯一性和非 CRUD 操作等由业务补充,生成器不承诺覆盖。
77
+ - **检查必填、空值与默认值。** DB 默认值可能使创建字段变为 optional;生成规则不会自动允许 `null`。需要清空字段时显式允许 nullable;检查自动 trim、非空规则是否适合正文等字段。
78
+ - **收敛查询与更新范围。** 不是每个 DB 字段都应允许查询或编辑;范围查询、分页整数限制等按接口补齐。当前 example 仅允许更新 message。
79
+ - **补齐导出。** 生成文件不会自动接入各层 `index.ts`;检查实体、`modules` 及 `frontend` / `backend` 的导出链,避免文件存在但包入口不可用。
80
+
81
+ DB 结构变更后重新生成只是起点。以最终业务 contract 为准,检查调用方与 Service 的字段映射,并保留手工补充的校验。
@@ -15,7 +15,9 @@
15
15
  "build": "vp pack",
16
16
  "dev": "vp pack --watch",
17
17
  "test": "vp test",
18
- "check": "vp check"
18
+ "check": "vp check",
19
+ "codegen:contracts": "IS_OVERRIDE=1 oyo gen contracts",
20
+ "codegen:vo": "IS_OVERRIDE=1 oyo gen vo"
19
21
  },
20
22
  "dependencies": {
21
23
  "change-case": "catalog:shared",
@@ -0,0 +1 @@
1
+ export * from './pagination'
@@ -0,0 +1,3 @@
1
+ export const DEFAULT_PAGE_SIZE = 10
2
+ export const MAX_PAGE_SIZE = 100
3
+ export const DEFAULT_QUERY_MAX = 1000
@@ -0,0 +1,24 @@
1
+ import * as v from 'valibot'
2
+ import { DEFAULT_PAGE_SIZE } from '../constants/index'
3
+
4
+ export const PaginationSchema = v.object({
5
+ page: v.optional(
6
+ v.pipe(
7
+ v.unknown(),
8
+ v.toNumber('非法页码'),
9
+ v.finite('非法页码'),
10
+ v.minValue(1, '非法页码'),
11
+ ) as v.GenericSchema<number, number>,
12
+ 1,
13
+ ),
14
+ limit: v.optional(
15
+ v.pipe(
16
+ v.unknown(),
17
+ v.toNumber('非法limit'),
18
+ v.finite('非法limit'),
19
+ v.minValue(1, '非法limit'),
20
+ ) as v.GenericSchema<number, number>,
21
+ DEFAULT_PAGE_SIZE,
22
+ ),
23
+ })
24
+ export type Pagination = v.InferOutput<typeof PaginationSchema>
@@ -0,0 +1,34 @@
1
+ import * as v from 'valibot'
2
+ import { PaginationSchema } from '../common-contracts'
3
+
4
+ export const Example$CreateOne = v.object({
5
+ message: v.pipe(v.string('message无效'), v.trim(), v.minLength(1, 'message不能为空')),
6
+ })
7
+ export type IExampleCreateOne = v.InferInput<typeof Example$CreateOne>
8
+
9
+ export const Example$UpdateOne = v.partial(v.pick(Example$CreateOne, ['message']))
10
+ export type IExampleUpdateOne = v.InferInput<typeof Example$UpdateOne>
11
+
12
+ export const Example$FindOne = v.partial(
13
+ v.object({
14
+ id: v.pipe(v.unknown(), v.toString('id无效')) as v.GenericSchema<string, string>,
15
+ message: v.pipe(v.unknown(), v.toString('message无效')) as v.GenericSchema<string, string>,
16
+ }),
17
+ )
18
+ export type IExampleFindOne = v.InferInput<typeof Example$FindOne>
19
+
20
+ export const Example$FindMany = v.object({
21
+ ...PaginationSchema.entries,
22
+ ...Example$FindOne.entries,
23
+ })
24
+ export type IExampleFindMany = v.InferInput<typeof Example$FindMany>
25
+
26
+ export const Example$Process = v.pick(Example$CreateOne, ['message'])
27
+ export type IExampleProcess = v.InferInput<typeof Example$Process>
28
+
29
+ export const Example$ProcessResult = v.object({
30
+ original: v.string(),
31
+ normalized: v.string(),
32
+ length: v.number(),
33
+ })
34
+ export type IExampleProcessResult = v.InferOutput<typeof Example$ProcessResult>
@@ -1,16 +1 @@
1
- export type Example = {
2
- id: string
3
- message: string
4
- createdAt: string
5
- updatedAt: string
6
- }
7
-
8
- export type CreateExampleInput = Pick<Example, 'message'>
9
-
10
- export type ProcessExampleInput = Pick<Example, 'message'>
11
-
12
- export type ProcessExampleOutput = {
13
- original: string
14
- normalized: string
15
- length: number
16
- }
1
+ export * from './contracts'
@@ -1 +1,3 @@
1
1
  export * from './example'
2
+ export * from './common-contracts'
3
+ export * from './vo-generated-types'
@@ -0,0 +1,12 @@
1
+ // 自动生成的面向前端的 VO 类型,请勿手动修改
2
+ export type IIdVO = {
3
+ id: string
4
+ }
5
+
6
+ export type IExamplesIdVO = IIdVO
7
+ export type IExamplesListVO = {
8
+ id: string
9
+ message: string
10
+ createdAt: string
11
+ updatedAt: string
12
+ }
@@ -0,0 +1,32 @@
1
+ import { fileURLToPath } from 'node:url'
2
+ import type { StorybookConfig } from '@storybook/react-vite'
3
+ import { isUseClientDirectiveWarning } from '@oyolincc/dev-config'
4
+
5
+ const config: StorybookConfig = {
6
+ stories: ['../stories/**/*.stories.tsx'],
7
+ addons: ['@storybook/addon-docs'],
8
+ framework: {
9
+ name: '@storybook/react-vite',
10
+ options: {
11
+ builder: {
12
+ viteConfigPath: fileURLToPath(new URL('./vite.config.ts', import.meta.url)),
13
+ },
14
+ },
15
+ },
16
+ viteFinal(config) {
17
+ config.build = {
18
+ ...config.build,
19
+ rolldownOptions: {
20
+ ...config.build?.rolldownOptions,
21
+ onLog(level, log, defaultHandler) {
22
+ // Storybook runs entirely in the browser and does not need RSC boundaries.
23
+ if (level === 'warn' && isUseClientDirectiveWarning(log)) return
24
+ defaultHandler(level, log)
25
+ },
26
+ },
27
+ }
28
+ return config
29
+ },
30
+ }
31
+
32
+ export default config
@@ -0,0 +1,22 @@
1
+ import { defineConfig } from '@pandacss/dev'
2
+ import config from '../panda.config'
3
+
4
+ export default defineConfig({
5
+ ...config,
6
+ preflight: true,
7
+ globalCss: {
8
+ extend: {
9
+ ...config.globalCss?.extend,
10
+ html: { colorPalette: 'gray' },
11
+ body: { background: 'gray.bg.page', color: 'gray.fg.default' },
12
+ },
13
+ },
14
+ include: ['./src/**/*.{ts,tsx}', './stories/**/*.{ts,tsx}', './.storybook/**/*.{ts,tsx}'],
15
+ exclude: ['./.storybook/styled-system/**'],
16
+ outdir: '.storybook/styled-system',
17
+ // Controls choose values at runtime, beyond Panda's static JSX extraction.
18
+ staticCss: {
19
+ recipes: '*',
20
+ css: [{ properties: { colorPalette: ['gray', 'lime', 'red', 'green'] } }],
21
+ },
22
+ })
@@ -0,0 +1,79 @@
1
+ import type { Preview } from '@storybook/react-vite'
2
+ import { lazy, Suspense, useEffect, useState, type PropsWithChildren } from 'react'
3
+ import type { DocsContainerProps } from '@storybook/addon-docs/blocks'
4
+ import { GLOBALS_UPDATED } from 'storybook/internal/core-events'
5
+ import type { Globals } from 'storybook/internal/types'
6
+ import { themes } from 'storybook/theming'
7
+ import { MINIMAL_VIEWPORTS } from 'storybook/viewport'
8
+ import './styles.css'
9
+
10
+ const DocsContainer = lazy(() =>
11
+ import('@storybook/addon-docs/blocks').then((module) => ({ default: module.DocsContainer })),
12
+ )
13
+
14
+ function ThemedDocsContainer({ children, context }: PropsWithChildren<DocsContainerProps>) {
15
+ const [theme, setTheme] = useState<'light' | 'dark'>(() =>
16
+ context.getStoryContext(context.componentStories()[0]).globals.theme === 'light' ? 'light' : 'dark',
17
+ )
18
+
19
+ useEffect(() => {
20
+ const updateTheme = ({ globals }: { globals: Globals }) => {
21
+ setTheme(globals.theme === 'light' ? 'light' : 'dark')
22
+ }
23
+ context.channel.on(GLOBALS_UPDATED, updateTheme)
24
+ return () => context.channel.off(GLOBALS_UPDATED, updateTheme)
25
+ }, [context.channel])
26
+
27
+ return (
28
+ <Suspense fallback={null}>
29
+ <DocsContainer context={context} theme={themes[theme]}>
30
+ {children}
31
+ </DocsContainer>
32
+ </Suspense>
33
+ )
34
+ }
35
+
36
+ const preview: Preview = {
37
+ tags: ['autodocs'],
38
+ globalTypes: {
39
+ theme: {
40
+ description: '组件主题',
41
+ toolbar: {
42
+ icon: 'circlehollow',
43
+ dynamicTitle: true,
44
+ items: [
45
+ { value: 'light', title: '浅色' },
46
+ { value: 'dark', title: '深色' },
47
+ ],
48
+ },
49
+ },
50
+ },
51
+ initialGlobals: { theme: 'dark' },
52
+ parameters: {
53
+ layout: 'padded',
54
+ controls: { expanded: true },
55
+ backgrounds: { disable: true },
56
+ viewport: { options: MINIMAL_VIEWPORTS },
57
+ docs: {
58
+ container: ThemedDocsContainer,
59
+ codePanel: true,
60
+ source: { type: 'dynamic', excludeDecorators: true },
61
+ },
62
+ },
63
+ decorators: [
64
+ function ThemeDecorator(Story, { globals }) {
65
+ const theme = globals.theme === 'light' ? 'light' : 'dark'
66
+
67
+ useEffect(() => {
68
+ const root = document.documentElement
69
+ root.classList.toggle('dark', theme === 'dark')
70
+ root.classList.toggle('light', theme === 'light')
71
+ root.style.colorScheme = theme
72
+ }, [theme])
73
+
74
+ return <Story />
75
+ },
76
+ ],
77
+ }
78
+
79
+ export default preview
@@ -0,0 +1 @@
1
+ @layer reset, base, tokens, recipes, utilities;
@@ -0,0 +1,37 @@
1
+ import { fileURLToPath } from 'node:url'
2
+ import pandacss from '@pandacss/vite'
3
+ import { defineConfig } from 'vite-plus'
4
+
5
+ export default defineConfig({
6
+ plugins: [
7
+ pandacss({
8
+ cwd: fileURLToPath(new URL('../', import.meta.url)),
9
+ configPath: '.storybook/panda.config.ts',
10
+ }),
11
+ ],
12
+ server: {
13
+ warmup: {
14
+ clientFiles: [fileURLToPath(new URL('../src/index.ts', import.meta.url))],
15
+ },
16
+ },
17
+ resolve: {
18
+ alias: [
19
+ {
20
+ find: /^@repo\/ui$/,
21
+ replacement: fileURLToPath(new URL('../src/index.ts', import.meta.url)),
22
+ },
23
+ {
24
+ find: /^@repo\/ui\/tooltip$/,
25
+ replacement: fileURLToPath(new URL('../src/Tooltip.tsx', import.meta.url)),
26
+ },
27
+ {
28
+ find: 'styled-system',
29
+ replacement: fileURLToPath(new URL('./styled-system', import.meta.url)),
30
+ },
31
+ {
32
+ find: '@',
33
+ replacement: fileURLToPath(new URL('../src', import.meta.url)),
34
+ },
35
+ ],
36
+ },
37
+ })
@@ -0,0 +1,15 @@
1
+ {
2
+ "$schema": "https://park-ui.com/schema/components.json",
3
+ "framework": "react",
4
+ "panda": {
5
+ "config": "panda.config.ts"
6
+ },
7
+ "aliases": {
8
+ "components": "@/components",
9
+ "hooks": "@/hooks",
10
+ "lib": "@/lib",
11
+ "recipes": "@/theme/recipes",
12
+ "theme": "@/theme",
13
+ "ui": "@/components/atoms"
14
+ }
15
+ }