@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.
- package/package.json +2 -2
- package/templates/hono-fullstack/.codegraph/.gitignore +5 -0
- package/templates/hono-fullstack/README.md +22 -1
- package/templates/hono-fullstack/_gitignore +1 -0
- package/templates/hono-fullstack/apps/server/package.json +7 -2
- package/templates/hono-fullstack/apps/server/src/adapters/cloudflare/entry.ts +4 -30
- package/templates/hono-fullstack/apps/server/src/adapters/nodejs/bootstrap.ts +20 -12
- package/templates/hono-fullstack/apps/server/src/adapters/nodejs/entry.ts +7 -57
- package/templates/hono-fullstack/apps/server/src/app.ts +37 -21
- package/templates/hono-fullstack/apps/server/src/config.ts +1 -1
- package/templates/hono-fullstack/apps/server/src/di-container.ts +51 -0
- package/templates/hono-fullstack/apps/server/src/infra/logger/getter.ts +1 -1
- package/templates/hono-fullstack/apps/server/src/infra/logger/pino.ts +21 -34
- package/templates/hono-fullstack/apps/server/src/infra/work-runner/errors.ts +22 -0
- package/templates/hono-fullstack/apps/server/src/infra/work-runner/pass-through/runner.ts +28 -22
- package/templates/hono-fullstack/apps/server/src/infra/work-runner/piscina/runner.ts +11 -34
- package/templates/hono-fullstack/apps/server/src/infra/work-runner/{example → piscina}/worker-entry.ts +6 -2
- package/templates/hono-fullstack/apps/server/src/infra/work-runner/types.ts +2 -16
- package/templates/hono-fullstack/apps/server/src/infra/work-runner/utils/business-error.ts +10 -5
- package/templates/hono-fullstack/apps/server/src/infra/work-runner/utils/message.ts +5 -17
- package/templates/hono-fullstack/apps/server/src/middlewares/cors.ts +16 -22
- package/templates/hono-fullstack/apps/server/src/middlewares/logger.ts +34 -0
- package/templates/hono-fullstack/apps/server/src/modules/example/module.ts +8 -0
- package/templates/hono-fullstack/apps/server/src/modules/example/queries.ts +8 -0
- package/templates/hono-fullstack/apps/server/src/modules/example/routes.ts +74 -68
- package/templates/hono-fullstack/apps/server/src/modules/example/service.test.ts +53 -0
- package/templates/hono-fullstack/apps/server/src/modules/example/service.ts +54 -0
- package/templates/hono-fullstack/apps/server/src/modules/example/types.ts +12 -0
- package/templates/hono-fullstack/apps/server/src/modules/example/work-task/tasks.test.ts +9 -35
- package/templates/hono-fullstack/apps/server/src/modules/example/work-task/tasks.ts +15 -46
- package/templates/hono-fullstack/apps/server/src/shared/errors/defs/index.ts +6 -1
- package/templates/hono-fullstack/apps/server/src/shared/errors/handler.ts +1 -1
- package/templates/hono-fullstack/apps/server/src/shared/network/openapi/index.ts +1 -1
- package/templates/hono-fullstack/apps/server/src/shared/types/app.ts +51 -0
- package/templates/hono-fullstack/apps/server/src/shared/types/db.ts +126 -0
- package/templates/hono-fullstack/apps/server/src/shared/utils/data-access/check.ts +19 -0
- package/templates/hono-fullstack/apps/server/src/shared/utils/data-access/model.ts +47 -0
- package/templates/hono-fullstack/apps/server/src/shared/utils/data-access/params.ts +105 -0
- package/templates/hono-fullstack/apps/server/src/shared/utils/data-access/query.test.ts +139 -0
- package/templates/hono-fullstack/apps/server/src/shared/utils/data-access/query.ts +236 -0
- package/templates/hono-fullstack/apps/server/vite.config.ts +2 -2
- package/templates/hono-fullstack/apps/server/wrangler.jsonc +1 -1
- package/templates/hono-fullstack/apps/stack/frontend/assets/styles.css +6 -0
- package/templates/hono-fullstack/apps/stack/frontend/components/general/ErrorMessage.tsx +3 -1
- package/templates/hono-fullstack/apps/stack/frontend/components/layouts/AppLayout.tsx +2 -1
- package/templates/hono-fullstack/apps/stack/frontend/components/layouts/Header.tsx +14 -2
- package/templates/hono-fullstack/apps/stack/frontend/components/layouts/Page.tsx +2 -1
- package/templates/hono-fullstack/apps/stack/frontend/components/layouts/PageContainer.tsx +4 -1
- package/templates/hono-fullstack/apps/stack/frontend/modules/example/api.ts +16 -9
- package/templates/hono-fullstack/apps/stack/frontend/modules/example/components/ExampleForm.tsx +25 -12
- package/templates/hono-fullstack/apps/stack/frontend/modules/example/components/ExampleList.tsx +13 -4
- package/templates/hono-fullstack/apps/stack/frontend/modules/example/hooks/api-hooks.ts +3 -3
- package/templates/hono-fullstack/apps/stack/frontend/routes/__root.tsx +1 -1
- package/templates/hono-fullstack/apps/stack/frontend/routes/index.tsx +16 -4
- package/templates/hono-fullstack/apps/stack/package.json +9 -4
- package/templates/hono-fullstack/apps/stack/panda.config.ts +31 -0
- package/templates/hono-fullstack/apps/stack/tsconfig.json +1 -0
- package/templates/hono-fullstack/apps/stack/turbo.json +20 -0
- package/templates/hono-fullstack/apps/stack/vite.config.ts +48 -12
- package/templates/hono-fullstack/apps/stack/wrangler.jsonc +1 -1
- package/templates/hono-fullstack/envs/.env.example.sqlite-d1 +1 -0
- package/templates/hono-fullstack/libs/db/drizzle-kit/sqlite-d1.config.ts +29 -10
- package/templates/hono-fullstack/libs/db/package.json +1 -0
- package/templates/hono-fullstack/libs/db/src/dialects/sqlite/schema/columns.ts +1 -1
- package/templates/hono-fullstack/libs/db/src/dialects/sqlite/schema/modules/examples/examples.ts +6 -3
- package/templates/hono-fullstack/libs/db/src/dialects/sqlite/schema/vo.ts +7 -1
- package/templates/hono-fullstack/libs/definition/README.md +81 -0
- package/templates/hono-fullstack/libs/definition/package.json +3 -1
- package/templates/hono-fullstack/libs/definition/src/constants/index.ts +1 -0
- package/templates/hono-fullstack/libs/definition/src/constants/pagination.ts +3 -0
- package/templates/hono-fullstack/libs/definition/src/modules/common-contracts.ts +24 -0
- package/templates/hono-fullstack/libs/definition/src/modules/example/contracts.ts +34 -0
- package/templates/hono-fullstack/libs/definition/src/modules/example/index.ts +1 -16
- package/templates/hono-fullstack/libs/definition/src/modules/index.ts +2 -0
- package/templates/hono-fullstack/libs/definition/src/modules/vo-generated-types.ts +12 -0
- package/templates/hono-fullstack/libs/ui/.storybook/main.ts +32 -0
- package/templates/hono-fullstack/libs/ui/.storybook/panda.config.ts +22 -0
- package/templates/hono-fullstack/libs/ui/.storybook/preview.tsx +79 -0
- package/templates/hono-fullstack/libs/ui/.storybook/styles.css +1 -0
- package/templates/hono-fullstack/libs/ui/.storybook/vite.config.ts +37 -0
- package/templates/hono-fullstack/libs/ui/components.json +15 -0
- package/templates/hono-fullstack/libs/ui/package.json +114 -0
- package/templates/hono-fullstack/libs/ui/panda.config.ts +41 -0
- package/templates/hono-fullstack/libs/ui/src/Tooltip.tsx +47 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/buttons/Button.tsx +80 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/buttons/CloseButton.tsx +15 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/buttons/IconButton.tsx +10 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/collections/Combobox.tsx +91 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/collections/Select.tsx +88 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/collections/TreeView.tsx +142 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/data-display/Avatar.tsx +64 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/data-display/Badge.tsx +7 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/data-display/Card.tsx +23 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/data-display/Clipboard.tsx +77 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/data-display/Icon.tsx +9 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/data-display/Table.tsx +51 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/data-display/Tag.tsx +23 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/data-display/Timeline.tsx +33 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/date-and-time/DatePicker.tsx +255 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/disclosure/Accordion.tsx +48 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/disclosure/Breadcrumb.tsx +50 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/disclosure/Collapsible.tsx +34 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/disclosure/Pagination.tsx +74 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/disclosure/Steps.tsx +91 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/disclosure/Tabs.tsx +37 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/feedback/Alert.tsx +52 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/feedback/Progress.tsx +41 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/feedback/ProgressCircle.tsx +40 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/feedback/Skeleton.tsx +37 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/feedback/Spinner.tsx +7 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/feedback/Toast.tsx +99 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/Checkbox.tsx +95 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/ColorPicker.tsx +148 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/Editable.tsx +44 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/Field.tsx +36 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/Fieldset.tsx +34 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/FileUpload.tsx +143 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/Input.tsx +7 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/InputAddon.tsx +7 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/InputGroup.tsx +61 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/NativeSelect.tsx +81 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/NumberInput.tsx +63 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/PasswordInput.tsx +76 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/PinInput.tsx +36 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/RadioCard.tsx +96 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/RadioGroup.tsx +61 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/RatingGroup.tsx +106 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/SegmentGroup.tsx +68 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/Slider.tsx +87 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/Switch.tsx +74 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/TagsInput.tsx +77 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/forms/Textarea.tsx +7 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/index.ts +98 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/internal/AbsoluteCenter.tsx +7 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/internal/Loader.tsx +69 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/internal/Span.tsx +5 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/internal/create-layout.ts +18 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/layout/Float.tsx +7 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/layout/Grid.tsx +17 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/layout/Group.tsx +7 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/layout/ScrollArea.tsx +46 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/layout/Separator.tsx +26 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/layout/Stack.tsx +54 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/overlays/Dialog.tsx +69 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/overlays/Drawer.tsx +49 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/overlays/HoverCard.tsx +37 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/overlays/Menu.tsx +74 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/overlays/OverlayManager.test.ts +124 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/overlays/OverlayManager.tsx +189 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/overlays/Popover.tsx +57 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/overlays/Tooltip.tsx +37 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/typography/Heading.tsx +6 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/typography/Link.tsx +7 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/typography/LinkOverlay.tsx +21 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/typography/Text.tsx +6 -0
- package/templates/hono-fullstack/libs/ui/src/components/atoms/utilities/VisuallyHidden.tsx +13 -0
- package/templates/hono-fullstack/libs/ui/src/hooks.ts +242 -0
- package/templates/hono-fullstack/libs/ui/src/index.ts +19 -0
- package/templates/hono-fullstack/libs/ui/src/theme/animation-styles.ts +50 -0
- package/templates/hono-fullstack/libs/ui/src/theme/breakpoints.ts +7 -0
- package/templates/hono-fullstack/libs/ui/src/theme/conditions.ts +12 -0
- package/templates/hono-fullstack/libs/ui/src/theme/containers.ts +16 -0
- package/templates/hono-fullstack/libs/ui/src/theme/global-css.ts +12 -0
- package/templates/hono-fullstack/libs/ui/src/theme/keyframes.ts +157 -0
- package/templates/hono-fullstack/libs/ui/src/theme/layer-styles.ts +11 -0
- package/templates/hono-fullstack/libs/ui/src/theme/patterns/grid.ts +51 -0
- package/templates/hono-fullstack/libs/ui/src/theme/patterns/index.ts +60 -0
- package/templates/hono-fullstack/libs/ui/src/theme/patterns/stack.ts +46 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/absolute-center.ts +38 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/accordion.ts +68 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/alert.ts +83 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/avatar.ts +155 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/badge.ts +67 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/breadcrumb.ts +69 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/button.ts +149 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/card.ts +36 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/checkbox.ts +120 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/clipboard.ts +22 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/collapsible.ts +26 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/color-picker.ts +299 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/combobox.ts +141 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/date-picker.ts +302 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/dialog.ts +191 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/drawer.ts +170 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/editable.ts +64 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/field.ts +41 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/fieldset.ts +47 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/file-upload.ts +86 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/group.ts +78 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/heading.ts +24 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/hover-card.ts +47 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/icon.ts +25 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/index.ts +120 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/input-addon.ts +51 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/input-group.ts +77 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/input.ts +99 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/link.ts +36 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/menu.ts +114 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/native-select.ts +92 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/number-input.ts +91 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/pagination.ts +9 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/pin-input.ts +33 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/popover.ts +78 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/progress-circle.ts +50 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/progress.ts +112 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/radio-card.ts +223 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/radio-group.ts +78 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/rating-group.ts +98 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/scroll-area.ts +119 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/segment-group.ts +162 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/select.ts +157 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/separator.ts +25 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/skeleton.ts +65 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/slider.ts +164 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/spinner.ts +34 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/steps.ts +162 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/switch.ts +150 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/table.ts +150 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/tabs.ts +128 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/tag.ts +114 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/tags-input.ts +201 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/text.ts +7 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/textarea.ts +90 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/timeline.ts +137 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/toast.ts +52 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/tooltip.ts +44 -0
- package/templates/hono-fullstack/libs/ui/src/theme/recipes/tree-view.ts +200 -0
- package/templates/hono-fullstack/libs/ui/src/theme/semanticTokens/colors/amber.ts +91 -0
- package/templates/hono-fullstack/libs/ui/src/theme/semanticTokens/colors/gray.ts +103 -0
- package/templates/hono-fullstack/libs/ui/src/theme/semanticTokens/colors/green.ts +88 -0
- package/templates/hono-fullstack/libs/ui/src/theme/semanticTokens/colors/index.ts +14 -0
- package/templates/hono-fullstack/libs/ui/src/theme/semanticTokens/colors/lime.ts +91 -0
- package/templates/hono-fullstack/libs/ui/src/theme/semanticTokens/colors/red.ts +88 -0
- package/templates/hono-fullstack/libs/ui/src/theme/semanticTokens/index.ts +8 -0
- package/templates/hono-fullstack/libs/ui/src/theme/semanticTokens/shadows.ts +46 -0
- package/templates/hono-fullstack/libs/ui/src/theme/text-styles.ts +82 -0
- package/templates/hono-fullstack/libs/ui/src/theme/tokens/animations.ts +8 -0
- package/templates/hono-fullstack/libs/ui/src/theme/tokens/aspect-ratio.ts +6 -0
- package/templates/hono-fullstack/libs/ui/src/theme/tokens/borders.ts +5 -0
- package/templates/hono-fullstack/libs/ui/src/theme/tokens/colors.ts +35 -0
- package/templates/hono-fullstack/libs/ui/src/theme/tokens/durations.ts +11 -0
- package/templates/hono-fullstack/libs/ui/src/theme/tokens/easings.ts +9 -0
- package/templates/hono-fullstack/libs/ui/src/theme/tokens/index.ts +42 -0
- package/templates/hono-fullstack/libs/ui/src/theme/tokens/radii.ts +13 -0
- package/templates/hono-fullstack/libs/ui/src/theme/tokens/sizes.ts +27 -0
- package/templates/hono-fullstack/libs/ui/src/theme/tokens/spacing.ts +41 -0
- package/templates/hono-fullstack/libs/ui/src/theme/tokens/typography.ts +86 -0
- package/templates/hono-fullstack/libs/ui/src/theme/tokens/z-index.ts +43 -0
- package/templates/hono-fullstack/libs/ui/stories/README.md +107 -0
- package/templates/hono-fullstack/libs/ui/stories/actions/Button.stories.tsx +260 -0
- package/templates/hono-fullstack/libs/ui/stories/actions/Clipboard.stories.tsx +87 -0
- package/templates/hono-fullstack/libs/ui/stories/actions/IconButton.stories.tsx +33 -0
- package/templates/hono-fullstack/libs/ui/stories/collections/Combobox.stories.tsx +334 -0
- package/templates/hono-fullstack/libs/ui/stories/collections/Select.stories.tsx +342 -0
- package/templates/hono-fullstack/libs/ui/stories/collections/TreeView.stories.tsx +252 -0
- package/templates/hono-fullstack/libs/ui/stories/color/ColorPicker.stories.tsx +217 -0
- package/templates/hono-fullstack/libs/ui/stories/date/DatePicker.stories.tsx +302 -0
- package/templates/hono-fullstack/libs/ui/stories/disclosure/Accordion.stories.tsx +105 -0
- package/templates/hono-fullstack/libs/ui/stories/disclosure/Collapsible.stories.tsx +55 -0
- package/templates/hono-fullstack/libs/ui/stories/disclosure/Steps.stories.tsx +208 -0
- package/templates/hono-fullstack/libs/ui/stories/disclosure/Tabs.stories.tsx +176 -0
- package/templates/hono-fullstack/libs/ui/stories/display/Avatar.stories.tsx +108 -0
- package/templates/hono-fullstack/libs/ui/stories/display/Badge.stories.tsx +90 -0
- package/templates/hono-fullstack/libs/ui/stories/display/Card.stories.tsx +121 -0
- package/templates/hono-fullstack/libs/ui/stories/display/Heading.stories.tsx +62 -0
- package/templates/hono-fullstack/libs/ui/stories/display/Icon.stories.tsx +51 -0
- package/templates/hono-fullstack/libs/ui/stories/display/Table.stories.tsx +222 -0
- package/templates/hono-fullstack/libs/ui/stories/display/Tag.stories.tsx +168 -0
- package/templates/hono-fullstack/libs/ui/stories/display/Text.stories.tsx +32 -0
- package/templates/hono-fullstack/libs/ui/stories/display/Timeline.stories.tsx +241 -0
- package/templates/hono-fullstack/libs/ui/stories/feedback/Alert.stories.tsx +122 -0
- package/templates/hono-fullstack/libs/ui/stories/feedback/Progress.stories.tsx +163 -0
- package/templates/hono-fullstack/libs/ui/stories/feedback/ProgressCircle.stories.tsx +176 -0
- package/templates/hono-fullstack/libs/ui/stories/feedback/Skeleton.stories.tsx +75 -0
- package/templates/hono-fullstack/libs/ui/stories/feedback/Spinner.stories.tsx +49 -0
- package/templates/hono-fullstack/libs/ui/stories/feedback/Toast.stories.tsx +145 -0
- package/templates/hono-fullstack/libs/ui/stories/forms/Checkbox.stories.tsx +281 -0
- package/templates/hono-fullstack/libs/ui/stories/forms/Editable.stories.tsx +94 -0
- package/templates/hono-fullstack/libs/ui/stories/forms/Field.stories.tsx +72 -0
- package/templates/hono-fullstack/libs/ui/stories/forms/Fieldset.stories.tsx +109 -0
- package/templates/hono-fullstack/libs/ui/stories/forms/FileUpload.stories.tsx +115 -0
- package/templates/hono-fullstack/libs/ui/stories/forms/Form.stories.tsx +120 -0
- package/templates/hono-fullstack/libs/ui/stories/forms/Input.stories.tsx +155 -0
- package/templates/hono-fullstack/libs/ui/stories/forms/InputGroup.stories.tsx +79 -0
- package/templates/hono-fullstack/libs/ui/stories/forms/NativeSelect.stories.tsx +160 -0
- package/templates/hono-fullstack/libs/ui/stories/forms/NumberInput.stories.tsx +149 -0
- package/templates/hono-fullstack/libs/ui/stories/forms/PasswordInput.stories.tsx +141 -0
- package/templates/hono-fullstack/libs/ui/stories/forms/PinInput.stories.tsx +155 -0
- package/templates/hono-fullstack/libs/ui/stories/forms/RadioCard.stories.tsx +265 -0
- package/templates/hono-fullstack/libs/ui/stories/forms/RadioGroup.stories.tsx +109 -0
- package/templates/hono-fullstack/libs/ui/stories/forms/RatingGroup.stories.tsx +123 -0
- package/templates/hono-fullstack/libs/ui/stories/forms/SegmentGroup.stories.tsx +130 -0
- package/templates/hono-fullstack/libs/ui/stories/forms/Slider.stories.tsx +190 -0
- package/templates/hono-fullstack/libs/ui/stories/forms/Switch.stories.tsx +124 -0
- package/templates/hono-fullstack/libs/ui/stories/forms/TagsInput.stories.tsx +154 -0
- package/templates/hono-fullstack/libs/ui/stories/forms/Textarea.stories.tsx +148 -0
- package/templates/hono-fullstack/libs/ui/stories/layout/Grid.stories.tsx +60 -0
- package/templates/hono-fullstack/libs/ui/stories/layout/Positioning.stories.tsx +90 -0
- package/templates/hono-fullstack/libs/ui/stories/layout/ScrollArea.stories.tsx +68 -0
- package/templates/hono-fullstack/libs/ui/stories/layout/Stack.stories.tsx +87 -0
- package/templates/hono-fullstack/libs/ui/stories/navigation/Breadcrumb.stories.tsx +104 -0
- package/templates/hono-fullstack/libs/ui/stories/navigation/Link.stories.tsx +62 -0
- package/templates/hono-fullstack/libs/ui/stories/navigation/LinkBox.stories.tsx +45 -0
- package/templates/hono-fullstack/libs/ui/stories/navigation/Pagination.stories.tsx +74 -0
- package/templates/hono-fullstack/libs/ui/stories/overlays/Dialog.stories.tsx +255 -0
- package/templates/hono-fullstack/libs/ui/stories/overlays/Drawer.stories.tsx +114 -0
- package/templates/hono-fullstack/libs/ui/stories/overlays/HoverCard.stories.tsx +47 -0
- package/templates/hono-fullstack/libs/ui/stories/overlays/Menu.stories.tsx +133 -0
- package/templates/hono-fullstack/libs/ui/stories/overlays/OverlayManager.stories.tsx +206 -0
- package/templates/hono-fullstack/libs/ui/stories/overlays/Popover.stories.tsx +73 -0
- package/templates/hono-fullstack/libs/ui/stories/overlays/Tooltip.stories.tsx +114 -0
- package/templates/hono-fullstack/libs/ui/stories/tsconfig.json +14 -0
- package/templates/hono-fullstack/libs/ui/tsconfig.build.json +5 -0
- package/templates/hono-fullstack/libs/ui/tsconfig.json +13 -0
- package/templates/hono-fullstack/libs/ui/turbo.json +28 -0
- package/templates/hono-fullstack/libs/ui/vite.config.ts +33 -0
- package/templates/hono-fullstack/oyo.config.json +30 -4
- package/templates/hono-fullstack/package.json +1 -0
- package/templates/hono-fullstack/pnpm-workspace.yaml +20 -10
- package/templates/hono-fullstack/turbo.json +10 -0
- package/templates/hono-server/.codegraph/.gitignore +5 -0
- package/templates/hono-server/README.md +9 -1
- package/templates/hono-server/_gitignore +1 -0
- package/templates/hono-server/apps/server/package.json +7 -2
- package/templates/hono-server/apps/server/src/adapters/cloudflare/entry.ts +4 -30
- package/templates/hono-server/apps/server/src/adapters/nodejs/bootstrap.ts +20 -12
- package/templates/hono-server/apps/server/src/adapters/nodejs/entry.ts +7 -57
- package/templates/hono-server/apps/server/src/app.ts +37 -21
- package/templates/hono-server/apps/server/src/config.ts +1 -1
- package/templates/hono-server/apps/server/src/di-container.ts +51 -0
- package/templates/hono-server/apps/server/src/infra/logger/getter.ts +1 -1
- package/templates/hono-server/apps/server/src/infra/logger/pino.ts +21 -34
- package/templates/hono-server/apps/server/src/infra/work-runner/errors.ts +22 -0
- package/templates/hono-server/apps/server/src/infra/work-runner/pass-through/runner.ts +28 -22
- package/templates/hono-server/apps/server/src/infra/work-runner/piscina/runner.ts +11 -34
- package/templates/hono-server/apps/server/src/infra/work-runner/{example → piscina}/worker-entry.ts +6 -2
- package/templates/hono-server/apps/server/src/infra/work-runner/types.ts +2 -16
- package/templates/hono-server/apps/server/src/infra/work-runner/utils/business-error.ts +10 -5
- package/templates/hono-server/apps/server/src/infra/work-runner/utils/message.ts +5 -17
- package/templates/hono-server/apps/server/src/middlewares/cors.ts +16 -22
- package/templates/hono-server/apps/server/src/middlewares/logger.ts +34 -0
- package/templates/hono-server/apps/server/src/modules/example/module.ts +8 -0
- package/templates/hono-server/apps/server/src/modules/example/queries.ts +8 -0
- package/templates/hono-server/apps/server/src/modules/example/routes.ts +74 -68
- package/templates/hono-server/apps/server/src/modules/example/service.test.ts +53 -0
- package/templates/hono-server/apps/server/src/modules/example/service.ts +54 -0
- package/templates/hono-server/apps/server/src/modules/example/types.ts +12 -0
- package/templates/hono-server/apps/server/src/modules/example/work-task/tasks.test.ts +9 -35
- package/templates/hono-server/apps/server/src/modules/example/work-task/tasks.ts +15 -46
- package/templates/hono-server/apps/server/src/shared/errors/defs/index.ts +6 -1
- package/templates/hono-server/apps/server/src/shared/errors/handler.ts +1 -1
- package/templates/hono-server/apps/server/src/shared/network/openapi/index.ts +1 -1
- package/templates/hono-server/apps/server/src/shared/types/app.ts +51 -0
- package/templates/hono-server/apps/server/src/shared/types/db.ts +126 -0
- package/templates/hono-server/apps/server/src/shared/utils/data-access/check.ts +19 -0
- package/templates/hono-server/apps/server/src/shared/utils/data-access/model.ts +47 -0
- package/templates/hono-server/apps/server/src/shared/utils/data-access/params.ts +105 -0
- package/templates/hono-server/apps/server/src/shared/utils/data-access/query.test.ts +139 -0
- package/templates/hono-server/apps/server/src/shared/utils/data-access/query.ts +236 -0
- package/templates/hono-server/apps/server/vite.config.ts +2 -2
- package/templates/hono-server/apps/server/wrangler.jsonc +1 -1
- package/templates/hono-server/docker/README.md +1 -1
- package/templates/hono-server/envs/.env.example.sqlite-d1 +1 -0
- package/templates/hono-server/libs/db/drizzle-kit/sqlite-d1.config.ts +29 -10
- package/templates/hono-server/libs/db/package.json +1 -0
- package/templates/hono-server/libs/db/src/dialects/sqlite/schema/columns.ts +1 -1
- package/templates/hono-server/libs/db/src/dialects/sqlite/schema/modules/examples/examples.ts +6 -3
- package/templates/hono-server/libs/db/src/dialects/sqlite/schema/vo.ts +7 -1
- package/templates/hono-server/libs/definition/README.md +81 -0
- package/templates/hono-server/libs/definition/package.json +3 -1
- package/templates/hono-server/libs/definition/src/constants/index.ts +1 -0
- package/templates/hono-server/libs/definition/src/constants/pagination.ts +3 -0
- package/templates/hono-server/libs/definition/src/modules/common-contracts.ts +24 -0
- package/templates/hono-server/libs/definition/src/modules/example/contracts.ts +34 -0
- package/templates/hono-server/libs/definition/src/modules/example/index.ts +1 -16
- package/templates/hono-server/libs/definition/src/modules/index.ts +2 -0
- package/templates/hono-server/libs/definition/src/modules/vo-generated-types.ts +12 -0
- package/templates/hono-server/oyo.config.json +30 -4
- package/templates/hono-server/package.json +1 -0
- package/templates/hono-server/pnpm-workspace.yaml +9 -7
- package/templates/hono-server/turbo.json +10 -0
- package/templates/monorepo/.codegraph/.gitignore +5 -0
- package/templates/monorepo/_gitignore +1 -0
- package/templates/monorepo/oyo.config.json +6 -4
- package/templates/monorepo/pnpm-workspace.yaml +4 -4
- package/templates/monorepo/turbo.json +10 -0
- package/templates/hono-fullstack/apps/server/src/modules/example/contracts.ts +0 -9
- package/templates/hono-fullstack/apps/server/src/shared/app/types.ts +0 -44
- package/templates/hono-fullstack/apps/stack/frontend/styles.css +0 -23
- package/templates/hono-server/apps/server/src/modules/example/contracts.ts +0 -9
- 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
|
|
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: {
|
|
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
|
-
:
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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":
|
|
8
|
+
"logs": { "enabled": true, "invocation_logs": false },
|
|
9
9
|
"traces": { "enabled": false },
|
|
10
10
|
},
|
|
11
11
|
"d1_databases": [
|
|
@@ -4,19 +4,38 @@ import { d1SchemaConfig } from '@repo/definition/backend'
|
|
|
4
4
|
|
|
5
5
|
const configDir = import.meta.dirname
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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(
|
|
15
|
+
.primaryKey()
|
|
16
16
|
.$defaultFn(() => sql`null`)
|
|
17
17
|
|
|
18
18
|
export function timestampMsColumn(name: string) {
|
package/templates/hono-fullstack/libs/db/src/dialects/sqlite/schema/modules/examples/examples.ts
CHANGED
|
@@ -11,12 +11,15 @@ export const examples = sqliteTable('examples', {
|
|
|
11
11
|
|
|
12
12
|
export type InsertExample = typeof examples.$inferInsert
|
|
13
13
|
|
|
14
|
-
export const
|
|
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
|
|
23
|
+
export type IExamplesListVO = SelectVOResults<typeof voExamplesList>
|
|
21
24
|
|
|
22
|
-
export const vcExamples = {
|
|
25
|
+
export const vcExamples = { id: voExamplesId, list: voExamplesList }
|
|
@@ -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,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
|
|
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'
|
|
@@ -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
|
+
}
|