@podosoft/podokit 0.17.4 → 1.0.2
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/README.md +70 -114
- package/dist/add.d.ts +3 -2
- package/dist/add.js +18 -8
- package/dist/assemble.d.ts +2 -0
- package/dist/assemble.js +18 -5
- package/dist/create.d.ts +8 -4
- package/dist/create.js +16 -6
- package/dist/deploy-compose-profile.js +1 -0
- package/dist/deploy-compose-render.d.ts +2 -2
- package/dist/deploy-compose-render.js +9 -6
- package/dist/deploy-compose-sync.d.ts +10 -14
- package/dist/deploy-compose-sync.js +21 -22
- package/dist/deploy-compose.js +4 -1
- package/dist/deploy-profile.d.ts +1 -0
- package/dist/deploy-profile.js +9 -1
- package/dist/deploy-render.js +28 -13
- package/dist/deploy-schema.js +6 -1
- package/dist/dev.d.ts +1 -0
- package/dist/dev.js +63 -14
- package/dist/index.d.ts +2 -2
- package/dist/index.js +15 -9
- package/dist/inspect.d.ts +3 -1
- package/dist/inspect.js +6 -4
- package/dist/lockfile.d.ts +8 -3
- package/dist/lockfile.js +18 -4
- package/dist/prompt.d.ts +5 -12
- package/dist/prompt.js +5 -22
- package/dist/remove.js +10 -5
- package/dist/templates/base/AGENTS.md +8 -6
- package/dist/templates/base/README.md +2 -2
- package/dist/templates/base/apps/api/src/main.ts +1 -1
- package/dist/templates/base/bunfig.toml +3 -0
- package/dist/templates/base/package.json +5 -4
- package/dist/templates/{fullstack-nest-svelte → fullstack}/AGENTS.md +19 -12
- package/dist/templates/fullstack/Dockerfile.dev +31 -0
- package/dist/templates/{fullstack-nest-svelte → fullstack}/README.md +35 -18
- package/dist/templates/fullstack/apps/api/Dockerfile +47 -0
- package/dist/templates/fullstack/apps/api/package.json +35 -0
- package/dist/templates/fullstack/apps/api/scripts/build.mjs +38 -0
- package/dist/templates/fullstack/apps/api/scripts/verify-api-contract.ts +37 -0
- package/dist/templates/fullstack/apps/api/src/app.extensions.ts +10 -0
- package/dist/templates/fullstack/apps/api/src/app.ts +162 -0
- package/dist/templates/{todo → fullstack}/apps/api/src/config/redis.connection.spec.ts +20 -2
- package/dist/templates/{todo → fullstack}/apps/api/src/config/redis.connection.ts +16 -0
- package/dist/templates/fullstack/apps/api/src/core/api-contract.spec.ts +59 -0
- package/dist/templates/fullstack/apps/api/src/core/api-contract.ts +169 -0
- package/dist/templates/fullstack/apps/api/src/core/services.spec.ts +90 -0
- package/dist/templates/fullstack/apps/api/src/core/services.ts +208 -0
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/api/src/database/data-source.ts +8 -3
- package/dist/templates/fullstack/apps/api/src/database/database.ts +25 -0
- package/dist/templates/fullstack/apps/api/src/health/health.plugin.ts +28 -0
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/api/src/health/readiness.service.spec.ts +1 -1
- package/dist/templates/{todo → fullstack}/apps/api/src/health/readiness.service.ts +0 -3
- package/dist/templates/fullstack/apps/api/src/main.ts +30 -0
- package/dist/templates/{todo → fullstack}/apps/api/tsconfig.json +1 -2
- package/dist/templates/fullstack/apps/web/Dockerfile +41 -0
- package/dist/templates/{todo → fullstack}/apps/web/components.json +3 -3
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/package.json +13 -10
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/app.html +0 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/alert/alert-action.svelte +1 -1
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/alert/alert-description.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/alert/alert-title.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/alert/alert.svelte +1 -1
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/avatar/avatar-badge.svelte +1 -1
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/avatar/avatar-fallback.svelte +1 -1
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/avatar/avatar-group-count.svelte +1 -1
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/avatar/avatar-group.svelte +1 -1
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/avatar/avatar-image.svelte +1 -1
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/avatar/avatar.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/badge/badge.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/button/button.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/card/card-action.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/card/card-content.svelte +1 -1
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/card/card-description.svelte +1 -1
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/card/card-footer.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/card/card-header.svelte +1 -1
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/card/card-title.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/card/card.svelte +1 -1
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/checkbox/checkbox.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dialog/dialog-content.svelte +2 -2
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/dialog/dialog-description.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dialog/dialog-footer.svelte +2 -2
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/dialog/dialog-header.svelte +1 -1
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/dialog/dialog-overlay.svelte +1 -1
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/dialog/dialog-title.svelte +1 -1
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +1 -1
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte +1 -1
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte +1 -1
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte +1 -1
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte +1 -1
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/input/input.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/label/label.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/select/select-content.svelte +2 -2
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/select/select-group-heading.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/select/select-group.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/select/select-item.svelte +1 -1
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/select/select-label.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/select/select-scroll-down-button.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/select/select-scroll-up-button.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/select/select-separator.svelte +2 -2
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/select/select-trigger.svelte +1 -1
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/separator/separator.svelte +1 -1
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/skeleton/skeleton.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/switch/switch.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/table/table-body.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/table/table-caption.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/table/table-cell.svelte +1 -1
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/table/table-footer.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/table/table-head.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/table/table-header.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/table/table-row.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/table/table.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/tabs/tabs-content.svelte +1 -1
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/tabs/tabs-list.svelte +1 -1
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/components/ui/tabs/tabs-trigger.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/tabs/tabs.svelte +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/tooltip/tooltip-content.svelte +2 -2
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/server/api.ts +9 -6
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/server/backend-proxy.test.ts +25 -0
- package/dist/templates/{todo → fullstack}/apps/web/src/lib/server/backend-proxy.ts +8 -1
- package/dist/templates/fullstack/apps/web/src/routes/+layout.svelte +14 -0
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/routes/+page.svelte +5 -5
- package/dist/templates/{todo → fullstack}/apps/web/src/routes/api/[...path]/+server.ts +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/routes/api/auth/[...all]/+server.ts +1 -1
- package/dist/templates/{todo → fullstack}/apps/web/tsconfig.json +3 -2
- package/dist/templates/fullstack/apps/web/vite.config.ts +25 -0
- package/dist/templates/fullstack/bunfig.toml +3 -0
- package/dist/templates/{todo → fullstack}/compose.dev.yaml +8 -38
- package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-agents/skills/podokit-deploy/SKILL.md +5 -5
- package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-agents/skills/podokit-deploy/references/profile.md +5 -3
- package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-agents/skills/podokit-deploy/references/rollback.md +2 -2
- package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-agents/skills/podokit-deploy-fast/SKILL.md +3 -3
- package/dist/templates/{todo → fullstack}/dot-claude/skills/podokit-add-module/SKILL.md +2 -2
- package/dist/templates/fullstack/dot-claude/skills/podokit-elysia-endpoint/SKILL.md +27 -0
- package/dist/templates/{todo → fullstack}/dot-claude/skills/podokit-sveltekit-route/SKILL.md +4 -4
- package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-claude/skills/podokit-update/SKILL.md +3 -1
- package/dist/templates/{todo → fullstack}/dot-devcontainer/devcontainer.json +1 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-env.example +1 -7
- package/dist/templates/{todo → fullstack}/dot-github/workflows/release.yml +5 -8
- package/dist/templates/fullstack/dot-mcp.json +8 -0
- package/dist/templates/fullstack/dot-podokit/dev.json +5 -0
- package/dist/templates/{fullstack-nest-svelte → fullstack}/infra/docker/docker-compose.yml +2 -2
- package/dist/templates/{fullstack-nest-svelte → fullstack}/infra/docker/sms-sink.mjs +2 -1
- package/dist/templates/{fullstack-nest-svelte → fullstack}/infra/k3s/README.md +5 -0
- package/dist/templates/{fullstack-nest-svelte → fullstack}/infra/k3s/configmap.yaml +2 -0
- package/dist/templates/fullstack/package.json +27 -0
- package/dist/templates/{fullstack-nest-svelte → fullstack}/tests/README.md +6 -6
- package/dist/templates/fullstack/tests/package.json +15 -0
- package/dist/templates/{fullstack-nest-svelte → fullstack}/tests/ui/smoke.ui.spec.ts +2 -1
- package/dist/templates/modules/admin-dashboard/files/apps/api/scripts/bootstrap-admin.mjs +4 -4
- package/dist/templates/modules/admin-dashboard/files/apps/api/src/admin.module.ts +153 -0
- package/dist/templates/modules/admin-dashboard/files/apps/api/src/profile-image/profile-image.service.spec.ts +13 -13
- package/dist/templates/modules/admin-dashboard/files/apps/api/src/profile-image/profile-image.service.ts +34 -22
- package/dist/templates/modules/admin-dashboard/files/apps/api/src/profile-image/profile-image.validation.spec.ts +7 -7
- package/dist/templates/modules/admin-dashboard/files/apps/api/src/profile-image/profile-image.validation.ts +5 -6
- package/dist/templates/modules/admin-dashboard/files/apps/api/src/site-settings/site-settings.service.ts +31 -29
- package/dist/templates/modules/admin-dashboard/files/apps/api/src/site-settings/site-settings.validation.spec.ts +22 -0
- package/dist/templates/modules/admin-dashboard/files/apps/api/src/site-settings/site-settings.validation.ts +73 -0
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/app.d.ts +2 -2
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/hooks.server.ts +7 -6
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/admin/registry.svelte.ts +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/auth-redirect.ts +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/account-menu.svelte +6 -6
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/account-page.svelte +16 -13
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/admin-sidebar.svelte +3 -3
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/data-table.svelte +4 -4
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/impersonation-banner.svelte +24 -0
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/language-switch.svelte +4 -4
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/session-idle-timeout.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/settings/appearance-card.svelte +10 -10
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/sidebar-user-menu.svelte +4 -4
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/site-footer.svelte +2 -2
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/site-runtime.svelte +3 -3
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/table-pagination.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/table-toolbar.svelte +4 -4
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/theme-toggle.svelte +3 -3
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/pagination/pagination-content.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/pagination/pagination-ellipsis.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/pagination/pagination-item.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/pagination/pagination-link.svelte +2 -2
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/pagination/pagination-next-button.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/pagination/pagination-next.svelte +2 -2
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/pagination/pagination-prev-button.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/pagination/pagination-previous.svelte +2 -2
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/pagination/pagination.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sheet/sheet-content.svelte +2 -2
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sheet/sheet-description.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sheet/sheet-footer.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sheet/sheet-header.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sheet/sheet-overlay.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sheet/sheet-title.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/context.svelte.ts +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-content.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-footer.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-group-action.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-group-content.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-group-label.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-group.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-header.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-input.svelte +2 -2
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-inset.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-menu-action.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-menu-badge.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-menu-button.svelte +2 -2
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-menu-item.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-menu-skeleton.svelte +2 -2
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-menu-sub-button.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-menu-sub-item.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-menu-sub.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-menu.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-provider.svelte +2 -2
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-rail.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-separator.svelte +2 -2
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar-trigger.svelte +2 -2
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/ui/sidebar/sidebar.svelte +2 -2
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/components/user-avatar.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/lib/i18n/index.ts +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/+layout.server.ts +2 -2
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/+layout.svelte +8 -20
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/admin/+page.svelte +3 -3
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/admin/account/+page.svelte +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/admin/audit/+page.server.ts +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/admin/audit/+page.svelte +5 -5
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/admin/organizations/+page.server.ts +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/admin/organizations/+page.svelte +10 -10
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/admin/sessions/+page.server.ts +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/admin/sessions/+page.svelte +9 -9
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/admin/settings/+page.server.ts +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/admin/settings/+page.svelte +13 -13
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/admin/settings/general-settings.svelte +10 -10
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/admin/users/+page.server.ts +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(admin)/admin/users/+page.svelte +18 -17
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(app)/+layout.server.ts +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(app)/accept-invitation/[id]/+page.svelte +4 -4
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(auth)/+layout.svelte +2 -2
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(auth)/forgot-password/+page.svelte +7 -7
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(auth)/login/+page.svelte +10 -10
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(auth)/pending-approval/+page.svelte +3 -3
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(auth)/reset-password/+page.svelte +7 -7
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(auth)/signup/+page.svelte +9 -9
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/(auth)/verify-email/+page.svelte +7 -7
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/+layout.server.ts +3 -3
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/+page.svelte +6 -6
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/account/+page.server.ts +6 -3
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/account/+page.svelte +12 -8
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/maintenance/+page.svelte +4 -4
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/oauth2/consent/+page.svelte +3 -3
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/setup-2fa/+page.server.ts +1 -1
- package/dist/templates/modules/admin-dashboard/files/apps/web/src/routes/setup-2fa/+page.svelte +13 -9
- package/dist/templates/modules/admin-dashboard/files/dot-claude/skills/podokit-data-table/SKILL.md +3 -3
- package/dist/templates/modules/admin-dashboard/files/tests/helpers/accounts.ts +17 -2
- package/dist/templates/modules/admin-dashboard/files/tests/helpers/disposable-users.ts +29 -12
- package/dist/templates/modules/admin-dashboard/files/tests/helpers/hydration.ts +4 -4
- package/dist/templates/modules/admin-dashboard/files/tests/ui/account.ui.spec.ts +51 -0
- package/dist/templates/modules/admin-dashboard/files/tests/ui/auth.ui.spec.ts +2 -2
- package/dist/templates/modules/admin-dashboard/files/tests/ui/impersonation.ui.spec.ts +4 -2
- package/dist/templates/modules/admin-dashboard/files/tests/ui/oidc.ui.spec.ts +26 -13
- package/dist/templates/modules/admin-dashboard/files/tests/ui/passkey.ui.spec.ts +3 -2
- package/dist/templates/modules/admin-dashboard/module.manifest.json +14 -24
- package/dist/templates/modules/api-key-auth/files/apps/api/src/api-key/api-key-verifier.spec.ts +1 -1
- package/dist/templates/modules/api-key-auth/files/apps/api/src/api-key/api-key-verifier.ts +0 -2
- package/dist/templates/modules/api-key-auth/files/apps/api/src/api-key/api-key.module.spec.ts +21 -0
- package/dist/templates/modules/api-key-auth/files/apps/api/src/api-key/api-key.module.ts +36 -9
- package/dist/templates/modules/api-key-auth/module.manifest.json +4 -4
- package/dist/templates/modules/audit-log/files/apps/api/src/audit/README.md +17 -16
- package/dist/templates/modules/audit-log/files/apps/api/src/audit/audit-events.ts +8 -6
- package/dist/templates/modules/audit-log/files/apps/api/src/audit/audit-hook.ts +2 -2
- package/dist/templates/modules/audit-log/files/apps/api/src/audit/audit.module.ts +31 -12
- package/dist/templates/modules/audit-log/files/apps/api/src/audit/audit.service.spec.ts +48 -0
- package/dist/templates/modules/audit-log/files/apps/api/src/audit/audit.service.ts +76 -25
- package/dist/templates/modules/audit-log/module.manifest.json +12 -16
- package/dist/templates/modules/auth/files/apps/api/scripts/configure-auth.mjs +5 -5
- package/dist/templates/modules/auth/files/apps/api/scripts/run-migrations.mjs +14 -0
- package/dist/templates/modules/auth/files/apps/api/src/auth/auth-provider.ts +3 -6
- package/dist/templates/modules/auth/files/apps/api/src/auth/auth.module.ts +176 -0
- package/dist/templates/modules/auth/files/apps/api/src/auth/auth.openapi.spec.ts +20 -0
- package/dist/templates/modules/auth/files/apps/api/src/auth/auth.openapi.ts +22 -0
- package/dist/templates/modules/auth/files/apps/api/src/auth/auth.runtime.spec.ts +3 -3
- package/dist/templates/modules/auth/files/apps/api/src/auth/auth.service.spec.ts +52 -0
- package/dist/templates/modules/auth/files/apps/api/src/auth/auth.service.ts +78 -0
- package/dist/templates/modules/auth/files/apps/api/src/auth/auth.ts +4 -1
- package/dist/templates/modules/auth/files/apps/api/src/auth/user-delete-handlers.spec.ts +6 -6
- package/dist/templates/modules/auth/files/apps/api/src/auth-config/auth-config.service.ts +214 -100
- package/dist/templates/modules/auth/files/apps/api/src/migrations/1720400000000-InitAppSettings.ts +2 -1
- package/dist/templates/modules/auth/files/apps/api/src/settings/app-settings.migration.spec.ts +34 -0
- package/dist/templates/modules/auth/files/apps/api/src/settings/flag-defaults.ts +3 -3
- package/dist/templates/modules/auth/files/apps/api/src/settings/settings.service.ts +26 -30
- package/dist/templates/modules/auth/files/dot-claude/skills/podokit-configure-auth/SKILL.md +7 -7
- package/dist/templates/modules/auth/files/dot-claude/skills/podokit-configure-auth/references/bootstrap-admin.md +3 -3
- package/dist/templates/modules/auth/files/dot-claude/skills/podokit-configure-auth/references/google.md +3 -3
- package/dist/templates/modules/auth/module.manifest.json +24 -77
- package/dist/templates/modules/bullmq/files/apps/api/src/jobs/demo.processor.spec.ts +10 -0
- package/dist/templates/modules/bullmq/files/apps/api/src/jobs/demo.processor.ts +3 -9
- package/dist/templates/modules/bullmq/files/apps/api/src/jobs/jobs.module.ts +35 -13
- package/dist/templates/modules/bullmq/files/apps/api/src/jobs/worker.module.ts +18 -19
- package/dist/templates/modules/bullmq/files/apps/api/src/main-worker.ts +12 -10
- package/dist/templates/modules/bullmq/files/infra/docker/worker.compose.example.yml +1 -1
- package/dist/templates/modules/bullmq/files/infra/k3s/worker-deployment.yaml +1 -1
- package/dist/templates/modules/bullmq/module.manifest.json +8 -9
- package/dist/templates/modules/file-upload/files/apps/api/src/files/files.module.ts +28 -8
- package/dist/templates/modules/file-upload/files/tests/api/files.api.spec.ts +9 -4
- package/dist/templates/modules/file-upload/module.manifest.json +2 -5
- package/dist/templates/modules/job-progress/files/apps/api/src/progress/job-progress.module.ts +33 -11
- package/dist/templates/modules/job-progress/files/apps/api/src/progress/progress.bridge.spec.ts +6 -6
- package/dist/templates/modules/job-progress/files/apps/api/src/progress/progress.bridge.ts +5 -13
- package/dist/templates/modules/job-progress/files/apps/api/src/progress/progress.processor.ts +11 -18
- package/dist/templates/modules/job-progress/module.manifest.json +5 -8
- package/dist/templates/modules/logging/files/apps/api/src/logging/logging.module.ts +15 -28
- package/dist/templates/modules/logging/module.manifest.json +5 -6
- package/dist/templates/modules/mailer/module.manifest.json +2 -2
- package/dist/templates/modules/object-storage-s3/files/apps/api/src/storage/storage.config.spec.ts +20 -0
- package/dist/templates/modules/object-storage-s3/files/apps/api/src/storage/storage.config.ts +17 -21
- package/dist/templates/modules/object-storage-s3/files/apps/api/src/storage/storage.module.ts +43 -9
- package/dist/templates/modules/object-storage-s3/files/apps/api/src/storage/storage.service.ts +26 -35
- package/dist/templates/modules/object-storage-s3/module.manifest.json +3 -7
- package/dist/templates/modules/rate-limit/files/apps/api/src/rate-limit/rate-limit.config.spec.ts +10 -4
- package/dist/templates/modules/rate-limit/files/apps/api/src/rate-limit/rate-limit.config.ts +13 -0
- package/dist/templates/modules/rate-limit/files/apps/api/src/rate-limit/rate-limit.identity.spec.ts +43 -103
- package/dist/templates/modules/rate-limit/files/apps/api/src/rate-limit/rate-limit.identity.ts +19 -56
- package/dist/templates/modules/rate-limit/files/apps/api/src/rate-limit/rate-limit.module.spec.ts +124 -212
- package/dist/templates/modules/rate-limit/files/apps/api/src/rate-limit/rate-limit.module.ts +123 -87
- package/dist/templates/modules/rate-limit/files/tests/api/rate-limit.api.spec.ts +17 -1
- package/dist/templates/modules/rate-limit/module.manifest.json +17 -11
- package/dist/templates/modules/redis/files/apps/api/src/redis/redis.module.ts +41 -10
- package/dist/templates/modules/redis/files/apps/api/src/redis/redis.service.spec.ts +3 -3
- package/dist/templates/modules/redis/files/apps/api/src/redis/redis.service.ts +29 -51
- package/dist/templates/modules/redis/module.manifest.json +3 -12
- package/dist/templates/modules/sse/files/apps/api/src/events/events.module.ts +46 -17
- package/dist/templates/modules/sse/files/apps/api/src/events/events.service.spec.ts +19 -50
- package/dist/templates/modules/sse/files/apps/api/src/events/events.service.ts +40 -25
- package/dist/templates/modules/sse/files/apps/api/src/events/events.transport.ts +25 -79
- package/dist/templates/modules/sse/module.manifest.json +2 -5
- package/dist/templates/todo/AGENTS.md +15 -12
- package/dist/templates/todo/README.md +19 -13
- package/dist/templates/todo/apps/api/src/todos/todo.plugin.ts +59 -0
- package/dist/templates/todo/apps/api/src/todos/todo.repository.ts +69 -0
- package/dist/templates/todo/apps/web/src/routes/+page.svelte +7 -7
- package/dist/templates.js +4 -4
- package/dist/toolchain.d.ts +14 -0
- package/dist/toolchain.js +48 -0
- package/dist/update.d.ts +18 -1
- package/dist/update.js +50 -12
- package/dist/websocket-paths.d.ts +1 -0
- package/dist/websocket-paths.js +32 -0
- package/package.json +5 -4
- package/dist/templates/fullstack-nest-svelte/Dockerfile.dev +0 -58
- package/dist/templates/fullstack-nest-svelte/apps/api/Dockerfile +0 -88
- package/dist/templates/fullstack-nest-svelte/apps/api/nest-cli.json +0 -5
- package/dist/templates/fullstack-nest-svelte/apps/api/package.json +0 -66
- package/dist/templates/fullstack-nest-svelte/apps/api/src/app.extensions.ts +0 -21
- package/dist/templates/fullstack-nest-svelte/apps/api/src/app.module.ts +0 -26
- package/dist/templates/fullstack-nest-svelte/apps/api/src/common/all-exceptions.filter.ts +0 -43
- package/dist/templates/fullstack-nest-svelte/apps/api/src/config/redis.connection.spec.ts +0 -53
- package/dist/templates/fullstack-nest-svelte/apps/api/src/config/redis.connection.ts +0 -69
- package/dist/templates/fullstack-nest-svelte/apps/api/src/health/health.controller.ts +0 -38
- package/dist/templates/fullstack-nest-svelte/apps/api/src/health/health.module.ts +0 -11
- package/dist/templates/fullstack-nest-svelte/apps/api/src/health/readiness.service.ts +0 -33
- package/dist/templates/fullstack-nest-svelte/apps/api/src/main.ts +0 -29
- package/dist/templates/fullstack-nest-svelte/apps/api/tsconfig.json +0 -30
- package/dist/templates/fullstack-nest-svelte/apps/web/Dockerfile +0 -81
- package/dist/templates/fullstack-nest-svelte/apps/web/components.json +0 -15
- package/dist/templates/fullstack-nest-svelte/apps/web/server.js +0 -31
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/alert/alert-description.svelte +0 -23
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/avatar/avatar-badge.svelte +0 -26
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/avatar/avatar-fallback.svelte +0 -20
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/avatar/avatar-group-count.svelte +0 -23
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/avatar/avatar-group.svelte +0 -23
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/avatar/avatar-image.svelte +0 -17
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/avatar/avatar.svelte +0 -26
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/card/card-description.svelte +0 -20
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/card/card-footer.svelte +0 -20
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/card/card-title.svelte +0 -20
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/checkbox/checkbox.svelte +0 -39
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/dialog/dialog-description.svelte +0 -17
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/dialog/dialog-header.svelte +0 -20
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/dialog/dialog-overlay.svelte +0 -17
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/dialog/dialog-title.svelte +0 -17
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +0 -44
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte +0 -31
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte +0 -27
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte +0 -17
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte +0 -17
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +0 -29
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/select/select-group-heading.svelte +0 -21
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/select/select-label.svelte +0 -20
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/select/select-trigger.svelte +0 -29
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/separator/separator.svelte +0 -23
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/skeleton/skeleton.svelte +0 -17
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/table/table-footer.svelte +0 -20
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/tabs/tabs-list.svelte +0 -20
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/components/ui/tabs/tabs-trigger.svelte +0 -20
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/server/api.ts +0 -21
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/server/backend-proxy.test.ts +0 -79
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/server/backend-proxy.ts +0 -80
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/server/ws-upgrade.js +0 -267
- package/dist/templates/fullstack-nest-svelte/apps/web/src/lib/server/ws-upgrade.test.js +0 -134
- package/dist/templates/fullstack-nest-svelte/apps/web/src/routes/+layout.svelte +0 -9
- package/dist/templates/fullstack-nest-svelte/apps/web/src/routes/api/[...path]/+server.ts +0 -16
- package/dist/templates/fullstack-nest-svelte/apps/web/svelte.config.js +0 -15
- package/dist/templates/fullstack-nest-svelte/apps/web/tsconfig.json +0 -9
- package/dist/templates/fullstack-nest-svelte/apps/web/vite.config.ts +0 -29
- package/dist/templates/fullstack-nest-svelte/compose.dev.yaml +0 -162
- package/dist/templates/fullstack-nest-svelte/dot-claude/skills/podokit-add-module/SKILL.md +0 -27
- package/dist/templates/fullstack-nest-svelte/dot-claude/skills/podokit-nest-endpoint/SKILL.md +0 -23
- package/dist/templates/fullstack-nest-svelte/dot-claude/skills/podokit-sveltekit-route/SKILL.md +0 -23
- package/dist/templates/fullstack-nest-svelte/dot-devcontainer/devcontainer.json +0 -20
- package/dist/templates/fullstack-nest-svelte/dot-github/workflows/release.yml +0 -142
- package/dist/templates/fullstack-nest-svelte/dot-mcp.json +0 -8
- package/dist/templates/fullstack-nest-svelte/dot-podokit/dev.json +0 -4
- package/dist/templates/fullstack-nest-svelte/package.json +0 -21
- package/dist/templates/fullstack-nest-svelte/tests/package.json +0 -15
- package/dist/templates/modules/admin-dashboard/files/apps/api/src/profile-image/profile-image-upload.interceptor.ts +0 -39
- package/dist/templates/modules/admin-dashboard/files/apps/api/src/profile-image/profile-image.controller.ts +0 -73
- package/dist/templates/modules/admin-dashboard/files/apps/api/src/profile-image/profile-image.module.ts +0 -9
- package/dist/templates/modules/admin-dashboard/files/apps/api/src/site-settings/site-settings.controller.ts +0 -155
- package/dist/templates/modules/admin-dashboard/files/apps/api/src/site-settings/site-settings.module.ts +0 -14
- package/dist/templates/modules/api-key-auth/files/apps/api/src/api-key/api-key.decorator.ts +0 -9
- package/dist/templates/modules/api-key-auth/files/apps/api/src/api-key/api-key.guard.spec.ts +0 -49
- package/dist/templates/modules/api-key-auth/files/apps/api/src/api-key/api-key.guard.ts +0 -21
- package/dist/templates/modules/api-key-auth/files/apps/api/src/machine/machine.controller.ts +0 -14
- package/dist/templates/modules/audit-log/files/apps/api/src/audit/audit-log.entity.ts +0 -46
- package/dist/templates/modules/audit-log/files/apps/api/src/audit/audit.controller.ts +0 -21
- package/dist/templates/modules/audit-log/files/apps/api/src/audit/audit.decorator.ts +0 -23
- package/dist/templates/modules/audit-log/files/apps/api/src/audit/audit.interceptor.ts +0 -56
- package/dist/templates/modules/auth/files/apps/api/src/account/account.controller.ts +0 -101
- package/dist/templates/modules/auth/files/apps/api/src/account/account.module.ts +0 -6
- package/dist/templates/modules/auth/files/apps/api/src/auth/two-factor-required.guard.ts +0 -68
- package/dist/templates/modules/auth/files/apps/api/src/auth-config/auth-config.controller.ts +0 -33
- package/dist/templates/modules/auth/files/apps/api/src/auth-config/auth-config.entity.ts +0 -26
- package/dist/templates/modules/auth/files/apps/api/src/auth-config/auth-config.module.ts +0 -12
- package/dist/templates/modules/auth/files/apps/api/src/health/health.controller.ts +0 -41
- package/dist/templates/modules/auth/files/apps/api/src/settings/app-setting.entity.ts +0 -16
- package/dist/templates/modules/auth/files/apps/api/src/settings/settings.module.ts +0 -11
- package/dist/templates/modules/bullmq/files/apps/api/src/jobs/dto/create-job.dto.ts +0 -9
- package/dist/templates/modules/bullmq/files/apps/api/src/jobs/jobs.controller.ts +0 -29
- package/dist/templates/modules/file-upload/files/apps/api/src/files/files.controller.ts +0 -32
- package/dist/templates/modules/job-progress/files/apps/api/src/progress/dto/start-job.dto.ts +0 -11
- package/dist/templates/modules/job-progress/files/apps/api/src/progress/progress.controller.ts +0 -17
- package/dist/templates/modules/object-storage-s3/files/apps/api/src/storage/dto/put-object.dto.ts +0 -8
- package/dist/templates/modules/object-storage-s3/files/apps/api/src/storage/storage.controller.ts +0 -29
- package/dist/templates/modules/object-storage-s3/files/apps/api/src/storage/storage.service.spec.ts +0 -35
- package/dist/templates/modules/rate-limit/files/apps/api/src/rate-limit/rate-limit.module.integration.spec.ts +0 -91
- package/dist/templates/modules/redis/files/apps/api/src/redis/cache.controller.ts +0 -21
- package/dist/templates/modules/redis/files/apps/api/src/redis/dto/set-cache.dto.ts +0 -14
- package/dist/templates/modules/sse/files/apps/api/src/events/dto/publish-event.dto.ts +0 -8
- package/dist/templates/modules/sse/files/apps/api/src/events/events.controller.ts +0 -39
- package/dist/templates/modules/sse/files/apps/api/src/events/events.transport.redis.spec.ts +0 -42
- package/dist/templates/modules/sse/files/apps/api/src/events/events.transport.spec.ts +0 -97
- package/dist/templates/todo/CLAUDE.md +0 -6
- package/dist/templates/todo/Dockerfile.dev +0 -58
- package/dist/templates/todo/apps/api/Dockerfile +0 -88
- package/dist/templates/todo/apps/api/nest-cli.json +0 -5
- package/dist/templates/todo/apps/api/package.json +0 -66
- package/dist/templates/todo/apps/api/scripts/.keep +0 -1
- package/dist/templates/todo/apps/api/src/app.extensions.ts +0 -21
- package/dist/templates/todo/apps/api/src/app.module.ts +0 -28
- package/dist/templates/todo/apps/api/src/common/all-exceptions.filter.ts +0 -43
- package/dist/templates/todo/apps/api/src/common/app-exception.ts +0 -4
- package/dist/templates/todo/apps/api/src/config/env.validation.ts +0 -23
- package/dist/templates/todo/apps/api/src/database/data-source.ts +0 -19
- package/dist/templates/todo/apps/api/src/database/migrate.ts +0 -16
- package/dist/templates/todo/apps/api/src/health/health.controller.ts +0 -38
- package/dist/templates/todo/apps/api/src/health/health.module.ts +0 -11
- package/dist/templates/todo/apps/api/src/health/readiness.service.spec.ts +0 -22
- package/dist/templates/todo/apps/api/src/main.ts +0 -29
- package/dist/templates/todo/apps/api/src/todos/dto/create-todo.dto.ts +0 -10
- package/dist/templates/todo/apps/api/src/todos/dto/update-todo.dto.ts +0 -10
- package/dist/templates/todo/apps/api/src/todos/todo.entity.ts +0 -16
- package/dist/templates/todo/apps/api/src/todos/todos.controller.ts +0 -38
- package/dist/templates/todo/apps/api/src/todos/todos.module.ts +0 -12
- package/dist/templates/todo/apps/api/src/todos/todos.service.ts +0 -41
- package/dist/templates/todo/apps/web/Dockerfile +0 -78
- package/dist/templates/todo/apps/web/package.json +0 -38
- package/dist/templates/todo/apps/web/server.js +0 -31
- package/dist/templates/todo/apps/web/src/app.css +0 -81
- package/dist/templates/todo/apps/web/src/app.d.ts +0 -11
- package/dist/templates/todo/apps/web/src/app.html +0 -13
- package/dist/templates/todo/apps/web/src/lib/api.ts +0 -5
- package/dist/templates/todo/apps/web/src/lib/components/site-runtime.svelte +0 -7
- package/dist/templates/todo/apps/web/src/lib/components/ui/alert/alert-action.svelte +0 -20
- package/dist/templates/todo/apps/web/src/lib/components/ui/alert/alert-title.svelte +0 -23
- package/dist/templates/todo/apps/web/src/lib/components/ui/alert/alert.svelte +0 -43
- package/dist/templates/todo/apps/web/src/lib/components/ui/alert/index.ts +0 -17
- package/dist/templates/todo/apps/web/src/lib/components/ui/avatar/index.ts +0 -22
- package/dist/templates/todo/apps/web/src/lib/components/ui/badge/badge.svelte +0 -49
- package/dist/templates/todo/apps/web/src/lib/components/ui/badge/index.ts +0 -2
- package/dist/templates/todo/apps/web/src/lib/components/ui/button/button.svelte +0 -82
- package/dist/templates/todo/apps/web/src/lib/components/ui/button/index.ts +0 -17
- package/dist/templates/todo/apps/web/src/lib/components/ui/card/card-action.svelte +0 -23
- package/dist/templates/todo/apps/web/src/lib/components/ui/card/card-content.svelte +0 -20
- package/dist/templates/todo/apps/web/src/lib/components/ui/card/card-header.svelte +0 -23
- package/dist/templates/todo/apps/web/src/lib/components/ui/card/card.svelte +0 -22
- package/dist/templates/todo/apps/web/src/lib/components/ui/card/index.ts +0 -25
- package/dist/templates/todo/apps/web/src/lib/components/ui/checkbox/index.ts +0 -6
- package/dist/templates/todo/apps/web/src/lib/components/ui/dialog/dialog-close.svelte +0 -11
- package/dist/templates/todo/apps/web/src/lib/components/ui/dialog/dialog-content.svelte +0 -48
- package/dist/templates/todo/apps/web/src/lib/components/ui/dialog/dialog-footer.svelte +0 -32
- package/dist/templates/todo/apps/web/src/lib/components/ui/dialog/dialog-portal.svelte +0 -7
- package/dist/templates/todo/apps/web/src/lib/components/ui/dialog/dialog-trigger.svelte +0 -11
- package/dist/templates/todo/apps/web/src/lib/components/ui/dialog/dialog.svelte +0 -7
- package/dist/templates/todo/apps/web/src/lib/components/ui/dialog/index.ts +0 -34
- package/dist/templates/todo/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-group.svelte +0 -16
- package/dist/templates/todo/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte +0 -22
- package/dist/templates/todo/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-group.svelte +0 -7
- package/dist/templates/todo/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte +0 -24
- package/dist/templates/todo/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-portal.svelte +0 -7
- package/dist/templates/todo/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte +0 -16
- package/dist/templates/todo/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte +0 -34
- package/dist/templates/todo/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte +0 -20
- package/dist/templates/todo/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-sub.svelte +0 -7
- package/dist/templates/todo/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-trigger.svelte +0 -7
- package/dist/templates/todo/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu.svelte +0 -7
- package/dist/templates/todo/apps/web/src/lib/components/ui/dropdown-menu/index.ts +0 -54
- package/dist/templates/todo/apps/web/src/lib/components/ui/input/index.ts +0 -7
- package/dist/templates/todo/apps/web/src/lib/components/ui/input/input.svelte +0 -48
- package/dist/templates/todo/apps/web/src/lib/components/ui/label/index.ts +0 -7
- package/dist/templates/todo/apps/web/src/lib/components/ui/label/label.svelte +0 -20
- package/dist/templates/todo/apps/web/src/lib/components/ui/select/index.ts +0 -37
- package/dist/templates/todo/apps/web/src/lib/components/ui/select/select-content.svelte +0 -45
- package/dist/templates/todo/apps/web/src/lib/components/ui/select/select-group.svelte +0 -17
- package/dist/templates/todo/apps/web/src/lib/components/ui/select/select-item.svelte +0 -40
- package/dist/templates/todo/apps/web/src/lib/components/ui/select/select-portal.svelte +0 -7
- package/dist/templates/todo/apps/web/src/lib/components/ui/select/select-scroll-down-button.svelte +0 -20
- package/dist/templates/todo/apps/web/src/lib/components/ui/select/select-scroll-up-button.svelte +0 -20
- package/dist/templates/todo/apps/web/src/lib/components/ui/select/select-separator.svelte +0 -18
- package/dist/templates/todo/apps/web/src/lib/components/ui/select/select.svelte +0 -11
- package/dist/templates/todo/apps/web/src/lib/components/ui/separator/index.ts +0 -7
- package/dist/templates/todo/apps/web/src/lib/components/ui/skeleton/index.ts +0 -7
- package/dist/templates/todo/apps/web/src/lib/components/ui/sonner/index.ts +0 -1
- package/dist/templates/todo/apps/web/src/lib/components/ui/sonner/sonner.svelte +0 -34
- package/dist/templates/todo/apps/web/src/lib/components/ui/switch/index.ts +0 -7
- package/dist/templates/todo/apps/web/src/lib/components/ui/switch/switch.svelte +0 -29
- package/dist/templates/todo/apps/web/src/lib/components/ui/table/index.ts +0 -28
- package/dist/templates/todo/apps/web/src/lib/components/ui/table/table-body.svelte +0 -15
- package/dist/templates/todo/apps/web/src/lib/components/ui/table/table-caption.svelte +0 -20
- package/dist/templates/todo/apps/web/src/lib/components/ui/table/table-cell.svelte +0 -15
- package/dist/templates/todo/apps/web/src/lib/components/ui/table/table-head.svelte +0 -15
- package/dist/templates/todo/apps/web/src/lib/components/ui/table/table-header.svelte +0 -20
- package/dist/templates/todo/apps/web/src/lib/components/ui/table/table-row.svelte +0 -15
- package/dist/templates/todo/apps/web/src/lib/components/ui/table/table.svelte +0 -17
- package/dist/templates/todo/apps/web/src/lib/components/ui/tabs/index.ts +0 -16
- package/dist/templates/todo/apps/web/src/lib/components/ui/tabs/tabs-content.svelte +0 -17
- package/dist/templates/todo/apps/web/src/lib/components/ui/tabs/tabs.svelte +0 -19
- package/dist/templates/todo/apps/web/src/lib/components/ui/tooltip/index.ts +0 -19
- package/dist/templates/todo/apps/web/src/lib/components/ui/tooltip/tooltip-content.svelte +0 -52
- package/dist/templates/todo/apps/web/src/lib/components/ui/tooltip/tooltip-portal.svelte +0 -7
- package/dist/templates/todo/apps/web/src/lib/components/ui/tooltip/tooltip-provider.svelte +0 -7
- package/dist/templates/todo/apps/web/src/lib/components/ui/tooltip/tooltip-trigger.svelte +0 -7
- package/dist/templates/todo/apps/web/src/lib/components/ui/tooltip/tooltip.svelte +0 -7
- package/dist/templates/todo/apps/web/src/lib/i18n/README.md +0 -9
- package/dist/templates/todo/apps/web/src/lib/i18n/catalogs/app/en.json +0 -1
- package/dist/templates/todo/apps/web/src/lib/i18n/catalogs/app/ko.json +0 -1
- package/dist/templates/todo/apps/web/src/lib/i18n/locales/en.json +0 -6
- package/dist/templates/todo/apps/web/src/lib/i18n/locales/ko.json +0 -6
- package/dist/templates/todo/apps/web/src/lib/server/ws-upgrade.js +0 -267
- package/dist/templates/todo/apps/web/src/lib/server/ws-upgrade.test.js +0 -134
- package/dist/templates/todo/apps/web/src/lib/utils.ts +0 -11
- package/dist/templates/todo/apps/web/src/routes/+layout.svelte +0 -9
- package/dist/templates/todo/apps/web/src/routes/api/auth/[...all]/+server.ts +0 -16
- package/dist/templates/todo/apps/web/static/.gitkeep +0 -0
- package/dist/templates/todo/apps/web/static/favicon.svg +0 -13
- package/dist/templates/todo/apps/web/svelte.config.js +0 -15
- package/dist/templates/todo/apps/web/vite.config.ts +0 -29
- package/dist/templates/todo/dot-agents/skills/podokit-deploy/SKILL.md +0 -65
- package/dist/templates/todo/dot-agents/skills/podokit-deploy/agents/openai.yaml +0 -4
- package/dist/templates/todo/dot-agents/skills/podokit-deploy/references/profile.md +0 -75
- package/dist/templates/todo/dot-agents/skills/podokit-deploy/references/release.md +0 -64
- package/dist/templates/todo/dot-agents/skills/podokit-deploy/references/rollback.md +0 -5
- package/dist/templates/todo/dot-agents/skills/podokit-deploy-fast/SKILL.md +0 -92
- package/dist/templates/todo/dot-claude/skills/podokit-add-locale/SKILL.md +0 -63
- package/dist/templates/todo/dot-claude/skills/podokit-add-locale/agents/openai.yaml +0 -4
- package/dist/templates/todo/dot-claude/skills/podokit-add-locale/references/catalog-format.md +0 -49
- package/dist/templates/todo/dot-claude/skills/podokit-deploy/SKILL.md +0 -8
- package/dist/templates/todo/dot-claude/skills/podokit-deploy-fast/SKILL.md +0 -8
- package/dist/templates/todo/dot-claude/skills/podokit-nest-endpoint/SKILL.md +0 -23
- package/dist/templates/todo/dot-claude/skills/podokit-update/SKILL.md +0 -26
- package/dist/templates/todo/dot-cursor/rules/podokit.mdc +0 -11
- package/dist/templates/todo/dot-dockerignore +0 -15
- package/dist/templates/todo/dot-env.docker +0 -26
- package/dist/templates/todo/dot-env.example +0 -34
- package/dist/templates/todo/dot-github/copilot-instructions.md +0 -6
- package/dist/templates/todo/dot-gitignore +0 -23
- package/dist/templates/todo/dot-mcp.json +0 -8
- package/dist/templates/todo/dot-podokit/dev.json +0 -4
- package/dist/templates/todo/infra/docker/docker-compose.yml +0 -33
- package/dist/templates/todo/infra/k3s/README.md +0 -18
- package/dist/templates/todo/infra/k3s/api-deployment.yaml +0 -29
- package/dist/templates/todo/infra/k3s/configmap.yaml +0 -12
- package/dist/templates/todo/infra/k3s/ingress.yaml +0 -32
- package/dist/templates/todo/infra/k3s/namespace.yaml +0 -4
- package/dist/templates/todo/infra/k3s/secret.example.yaml +0 -10
- package/dist/templates/todo/infra/k3s/services.yaml +0 -21
- package/dist/templates/todo/infra/k3s/web-deployment.yaml +0 -30
- package/dist/templates/todo/infra/traefik/dynamic.yml +0 -17
- package/dist/templates/todo/package.json +0 -21
- package/dist/templates/todo/tests/README.md +0 -21
- package/dist/templates/todo/tests/api/health.api.spec.ts +0 -14
- package/dist/templates/todo/tests/package.json +0 -15
- package/dist/templates/todo/tests/playwright.config.ts +0 -27
- package/dist/templates/todo/tests/playwright.extensions.ts +0 -44
- package/dist/templates/todo/tests/ui/smoke.ui.spec.ts +0 -8
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/CLAUDE.md +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/api/scripts/.keep +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/api/src/common/app-exception.ts +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/api/src/config/env.validation.ts +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/api/src/database/migrate.ts +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/app.css +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/app.d.ts +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/api.ts +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/site-runtime.svelte +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/alert/index.ts +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/avatar/index.ts +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/badge/index.ts +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/button/index.ts +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/card/index.ts +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/checkbox/index.ts +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dialog/dialog-close.svelte +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dialog/dialog-portal.svelte +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dialog/dialog-trigger.svelte +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dialog/dialog.svelte +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dialog/index.ts +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-group.svelte +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-group.svelte +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-portal.svelte +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-sub.svelte +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu-trigger.svelte +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/dropdown-menu.svelte +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/dropdown-menu/index.ts +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/input/index.ts +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/label/index.ts +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/select/index.ts +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/select/select-portal.svelte +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/select/select.svelte +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/separator/index.ts +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/skeleton/index.ts +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/sonner/index.ts +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/sonner/sonner.svelte +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/switch/index.ts +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/table/index.ts +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/tabs/index.ts +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/tooltip/index.ts +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/tooltip/tooltip-portal.svelte +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/tooltip/tooltip-provider.svelte +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/tooltip/tooltip-trigger.svelte +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/components/ui/tooltip/tooltip.svelte +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/i18n/README.md +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/i18n/catalogs/app/en.json +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/i18n/catalogs/app/ko.json +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/i18n/locales/en.json +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/i18n/locales/ko.json +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/src/lib/utils.ts +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/static/.gitkeep +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/apps/web/static/favicon.svg +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-agents/skills/podokit-deploy/agents/openai.yaml +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-agents/skills/podokit-deploy/references/release.md +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-claude/skills/podokit-add-locale/SKILL.md +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-claude/skills/podokit-add-locale/agents/openai.yaml +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-claude/skills/podokit-add-locale/references/catalog-format.md +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-claude/skills/podokit-deploy/SKILL.md +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-claude/skills/podokit-deploy-fast/SKILL.md +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-cursor/rules/podokit.mdc +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-dockerignore +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-env.docker +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-github/copilot-instructions.md +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/dot-gitignore +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/infra/k3s/api-deployment.yaml +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/infra/k3s/ingress.yaml +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/infra/k3s/namespace.yaml +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/infra/k3s/secret.example.yaml +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/infra/k3s/services.yaml +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/infra/k3s/web-deployment.yaml +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/infra/traefik/dynamic.yml +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/tests/api/health.api.spec.ts +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/tests/playwright.config.ts +0 -0
- /package/dist/templates/{fullstack-nest-svelte → fullstack}/tests/playwright.extensions.ts +0 -0
package/dist/lockfile.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import type { TemplateVars } from "@podosoft/podokit-template-engine";
|
|
2
|
+
import { type Toolchain } from "./toolchain";
|
|
1
3
|
/**
|
|
2
4
|
* The generation lockfile (`.podokit/`) records how a project was assembled so
|
|
3
5
|
* `podo update` can rebuild the same inputs and detect user edits. See
|
|
4
6
|
* ADR-0009 (update mechanism) and ADR-0010 (ownership model).
|
|
5
7
|
*/
|
|
6
|
-
export declare const LOCK_SCHEMA_VERSION =
|
|
8
|
+
export declare const LOCK_SCHEMA_VERSION = 3;
|
|
7
9
|
/** File ownership tier. See ADR-0010. */
|
|
8
10
|
export type Tier = "managed" | "assembled" | "owned";
|
|
9
11
|
export interface ManifestModule {
|
|
@@ -29,7 +31,8 @@ export interface PodokitManifest {
|
|
|
29
31
|
schemaVersion: number;
|
|
30
32
|
podokitVersion: string;
|
|
31
33
|
template: string;
|
|
32
|
-
|
|
34
|
+
/** Runtime and package manager selected for generated and converted projects. */
|
|
35
|
+
toolchain: Toolchain;
|
|
33
36
|
/** Render vars / prompt answers, replayed on update (copier-style). */
|
|
34
37
|
answers: Record<string, string>;
|
|
35
38
|
modules: ManifestModule[];
|
|
@@ -63,6 +66,8 @@ export declare function manifestPath(projectRoot: string): string;
|
|
|
63
66
|
export declare function filesLockPath(projectRoot: string): string;
|
|
64
67
|
export declare function readManifest(projectRoot: string): PodokitManifest | null;
|
|
65
68
|
export declare function writeManifest(projectRoot: string, manifest: PodokitManifest): void;
|
|
69
|
+
/** Complete replay variables for a Bun-only v1 project. */
|
|
70
|
+
export declare function manifestTemplateVars(manifest: PodokitManifest): TemplateVars;
|
|
66
71
|
export declare function writeFilesLock(projectRoot: string, lock: FilesLock): void;
|
|
67
72
|
/** Read the PodoKit CLI's own version to stamp into the manifest. */
|
|
68
73
|
export declare function podokitVersion(): string;
|
|
@@ -89,7 +94,7 @@ export interface Drift {
|
|
|
89
94
|
export declare function computeDrift(projectRoot: string): Drift;
|
|
90
95
|
export interface InitLockOptions {
|
|
91
96
|
template: string;
|
|
92
|
-
|
|
97
|
+
toolchain?: Toolchain;
|
|
93
98
|
answers: Record<string, string>;
|
|
94
99
|
version?: string;
|
|
95
100
|
ownedGlobs?: string[];
|
package/dist/lockfile.js
CHANGED
|
@@ -5,6 +5,7 @@ exports.manifestPath = manifestPath;
|
|
|
5
5
|
exports.filesLockPath = filesLockPath;
|
|
6
6
|
exports.readManifest = readManifest;
|
|
7
7
|
exports.writeManifest = writeManifest;
|
|
8
|
+
exports.manifestTemplateVars = manifestTemplateVars;
|
|
8
9
|
exports.writeFilesLock = writeFilesLock;
|
|
9
10
|
exports.podokitVersion = podokitVersion;
|
|
10
11
|
exports.matchGlob = matchGlob;
|
|
@@ -19,12 +20,13 @@ exports.recordModules = recordModules;
|
|
|
19
20
|
const node_fs_1 = require("node:fs");
|
|
20
21
|
const node_path_1 = require("node:path");
|
|
21
22
|
const podokit_template_engine_1 = require("@podosoft/podokit-template-engine");
|
|
23
|
+
const toolchain_1 = require("./toolchain");
|
|
22
24
|
/**
|
|
23
25
|
* The generation lockfile (`.podokit/`) records how a project was assembled so
|
|
24
26
|
* `podo update` can rebuild the same inputs and detect user edits. See
|
|
25
27
|
* ADR-0009 (update mechanism) and ADR-0010 (ownership model).
|
|
26
28
|
*/
|
|
27
|
-
exports.LOCK_SCHEMA_VERSION =
|
|
29
|
+
exports.LOCK_SCHEMA_VERSION = 3;
|
|
28
30
|
const PODOKIT_DIR = ".podokit";
|
|
29
31
|
const MANIFEST_FILE = "manifest.json";
|
|
30
32
|
const FILES_LOCK_FILE = "files.lock";
|
|
@@ -48,7 +50,7 @@ exports.DEFAULT_OWNED_GLOBS = [
|
|
|
48
50
|
// Locale definitions and app messages are application-owned extension points.
|
|
49
51
|
"apps/web/src/lib/i18n/locales/**",
|
|
50
52
|
"apps/web/src/lib/i18n/catalogs/app/**",
|
|
51
|
-
// Owned
|
|
53
|
+
// Owned Elysia extension slot — register application services and plugins here.
|
|
52
54
|
"apps/api/src/app.extensions.ts",
|
|
53
55
|
// AI agent guidance — yours to customize; update never touches it.
|
|
54
56
|
"AGENTS.md",
|
|
@@ -82,12 +84,24 @@ function filesLockPath(projectRoot) {
|
|
|
82
84
|
}
|
|
83
85
|
function readManifest(projectRoot) {
|
|
84
86
|
const file = manifestPath(projectRoot);
|
|
85
|
-
|
|
87
|
+
if (!(0, node_fs_1.existsSync)(file))
|
|
88
|
+
return null;
|
|
89
|
+
const raw = JSON.parse((0, node_fs_1.readFileSync)(file, "utf8"));
|
|
90
|
+
if (raw.schemaVersion !== exports.LOCK_SCHEMA_VERSION
|
|
91
|
+
|| raw.toolchain?.runtime !== "bun"
|
|
92
|
+
|| raw.toolchain.packageManager !== "bun") {
|
|
93
|
+
throw new Error("This project was generated by PodoKit v0 and is not compatible with PodoKit v1 updates. Use @podosoft/podokit@0.17.4 for this project; create a new v1 project for Bun and Elysia.");
|
|
94
|
+
}
|
|
95
|
+
return raw;
|
|
86
96
|
}
|
|
87
97
|
function writeManifest(projectRoot, manifest) {
|
|
88
98
|
(0, node_fs_1.mkdirSync)(podokitDir(projectRoot), { recursive: true });
|
|
89
99
|
(0, node_fs_1.writeFileSync)(manifestPath(projectRoot), `${JSON.stringify({ ...manifest, schemaVersion: exports.LOCK_SCHEMA_VERSION }, null, 2)}\n`);
|
|
90
100
|
}
|
|
101
|
+
/** Complete replay variables for a Bun-only v1 project. */
|
|
102
|
+
function manifestTemplateVars(manifest) {
|
|
103
|
+
return { ...manifest.answers, ...(0, toolchain_1.toolchainTemplateVars)(manifest.toolchain) };
|
|
104
|
+
}
|
|
91
105
|
function writeFilesLock(projectRoot, lock) {
|
|
92
106
|
(0, node_fs_1.mkdirSync)(podokitDir(projectRoot), { recursive: true });
|
|
93
107
|
(0, node_fs_1.writeFileSync)(filesLockPath(projectRoot), `${JSON.stringify({ ...lock, schemaVersion: exports.LOCK_SCHEMA_VERSION }, null, 2)}\n`);
|
|
@@ -196,7 +210,7 @@ function initLockfile(projectRoot, options) {
|
|
|
196
210
|
schemaVersion: exports.LOCK_SCHEMA_VERSION,
|
|
197
211
|
podokitVersion: options.version ?? podokitVersion(),
|
|
198
212
|
template: options.template,
|
|
199
|
-
|
|
213
|
+
toolchain: options.toolchain ?? (0, toolchain_1.resolveToolchain)(),
|
|
200
214
|
answers: options.answers,
|
|
201
215
|
modules: [],
|
|
202
216
|
ownedGlobs,
|
package/dist/prompt.d.ts
CHANGED
|
@@ -1,20 +1,13 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
export declare const PACKAGE_MANAGERS: PackageManager[];
|
|
3
|
-
/** Asks a single question and resolves to the trimmed answer (empty if skipped). */
|
|
1
|
+
import { type Toolchain } from "./toolchain";
|
|
4
2
|
export type Ask = (question: string) => Promise<string>;
|
|
5
3
|
export interface RawCreateArgs {
|
|
6
4
|
template?: string;
|
|
7
|
-
pm?:
|
|
5
|
+
pm?: string;
|
|
6
|
+
runtime?: string;
|
|
8
7
|
}
|
|
9
8
|
export interface ResolvedCreateOptions {
|
|
10
9
|
template: string;
|
|
11
|
-
|
|
10
|
+
toolchain: Toolchain;
|
|
12
11
|
}
|
|
13
|
-
/**
|
|
14
|
-
* Resolve the template and package manager for `create`.
|
|
15
|
-
*
|
|
16
|
-
* Precedence: an explicit flag wins; otherwise, when `interactive` is true the
|
|
17
|
-
* user is prompted (blank answer = default); otherwise the default is used.
|
|
18
|
-
* Kept free of I/O — the caller injects `ask` — so it is unit-testable.
|
|
19
|
-
*/
|
|
12
|
+
/** Resolve a Bun-only v1 project create request without runtime/package prompts. */
|
|
20
13
|
export declare function resolveCreateOptions(args: RawCreateArgs, ask: Ask, interactive: boolean): Promise<ResolvedCreateOptions>;
|
package/dist/prompt.js
CHANGED
|
@@ -1,19 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PACKAGE_MANAGERS = void 0;
|
|
4
3
|
exports.resolveCreateOptions = resolveCreateOptions;
|
|
5
4
|
const templates_1 = require("./templates");
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
return exports.PACKAGE_MANAGERS.includes(value);
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Resolve the template and package manager for `create`.
|
|
12
|
-
*
|
|
13
|
-
* Precedence: an explicit flag wins; otherwise, when `interactive` is true the
|
|
14
|
-
* user is prompted (blank answer = default); otherwise the default is used.
|
|
15
|
-
* Kept free of I/O — the caller injects `ask` — so it is unit-testable.
|
|
16
|
-
*/
|
|
5
|
+
const toolchain_1 = require("./toolchain");
|
|
6
|
+
/** Resolve a Bun-only v1 project create request without runtime/package prompts. */
|
|
17
7
|
async function resolveCreateOptions(args, ask, interactive) {
|
|
18
8
|
let template = args.template;
|
|
19
9
|
if (!template && interactive) {
|
|
@@ -24,14 +14,7 @@ async function resolveCreateOptions(args, ask, interactive) {
|
|
|
24
14
|
if (!(0, templates_1.isKnownTemplate)(template)) {
|
|
25
15
|
throw new Error(`Unknown template "${template}". Choose one of: ${templates_1.TEMPLATE_NAMES.join(", ")}.`);
|
|
26
16
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
pm = answer || undefined;
|
|
31
|
-
}
|
|
32
|
-
pm = pm ?? "npm";
|
|
33
|
-
if (!isPackageManager(pm)) {
|
|
34
|
-
throw new Error(`Invalid package manager "${pm}". Choose one of: ${exports.PACKAGE_MANAGERS.join(", ")}.`);
|
|
35
|
-
}
|
|
36
|
-
return { template, packageManager: pm };
|
|
17
|
+
if (args.pm)
|
|
18
|
+
throw new Error("PodoKit v1 uses Bun as its package manager; remove --pm.");
|
|
19
|
+
return { template, toolchain: (0, toolchain_1.resolveToolchain)(args.runtime ?? "bun") };
|
|
37
20
|
}
|
package/dist/remove.js
CHANGED
|
@@ -6,8 +6,10 @@ const node_path_1 = require("node:path");
|
|
|
6
6
|
const podokit_template_engine_1 = require("@podosoft/podokit-template-engine");
|
|
7
7
|
const add_1 = require("./add");
|
|
8
8
|
const lockfile_1 = require("./lockfile");
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
const toolchain_1 = require("./toolchain");
|
|
10
|
+
function readModuleManifest(moduleDir, vars) {
|
|
11
|
+
const source = (0, node_fs_1.readFileSync)((0, node_path_1.join)(moduleDir, "module.manifest.json"), "utf8");
|
|
12
|
+
return JSON.parse(vars ? (0, podokit_template_engine_1.renderTokens)(source, vars) : source);
|
|
11
13
|
}
|
|
12
14
|
function readJson(path) {
|
|
13
15
|
return JSON.parse((0, node_fs_1.readFileSync)(path, "utf8"));
|
|
@@ -47,14 +49,18 @@ function removeModule(options) {
|
|
|
47
49
|
if (!moduleDir) {
|
|
48
50
|
throw new Error(`Cannot resolve module "${module}" to un-apply it. Is it still installed/bundled?`);
|
|
49
51
|
}
|
|
50
|
-
const
|
|
52
|
+
const vars = {
|
|
53
|
+
projectName: projectName(projectRoot),
|
|
54
|
+
...(0, toolchain_1.toolchainTemplateVars)(manifest.toolchain),
|
|
55
|
+
};
|
|
56
|
+
const targetManifest = readModuleManifest(moduleDir, vars);
|
|
51
57
|
// Resolve the manifests of the OTHER installed modules once — used for the
|
|
52
58
|
// requires guard and to decide which files/deps/env are shared.
|
|
53
59
|
const others = manifest.modules
|
|
54
60
|
.filter((m) => m.name !== module)
|
|
55
61
|
.map((m) => {
|
|
56
62
|
const dir = (0, add_1.resolveModuleDir)(m.packageName ?? m.name, modulesDir, projectRoot);
|
|
57
|
-
return dir ? { name: m.name, dir, manifest: readModuleManifest(dir) } : null;
|
|
63
|
+
return dir ? { name: m.name, dir, manifest: readModuleManifest(dir, vars) } : null;
|
|
58
64
|
})
|
|
59
65
|
.filter((m) => m !== null);
|
|
60
66
|
// Guard: refuse if another installed module requires this one.
|
|
@@ -62,7 +68,6 @@ function removeModule(options) {
|
|
|
62
68
|
if (dependents.length) {
|
|
63
69
|
throw new Error(`Cannot remove "${module}": required by ${dependents.join(", ")}. Remove ${dependents.length > 1 ? "those" : "that"} first.`);
|
|
64
70
|
}
|
|
65
|
-
const vars = { projectName: projectName(projectRoot) };
|
|
66
71
|
const sharedFiles = new Set(others.flatMap((o) => moduleFilePaths(o.dir, vars)));
|
|
67
72
|
const lock = (0, lockfile_1.readFilesLock)(projectRoot);
|
|
68
73
|
// 1) un-wire marker injections (idempotent; skips optional/absent).
|
|
@@ -5,17 +5,17 @@ by [PodoKit](https://github.com/podosoft-dev/podokit).
|
|
|
5
5
|
|
|
6
6
|
## Project overview
|
|
7
7
|
|
|
8
|
-
A minimal
|
|
8
|
+
A minimal Bun 1.4 workspace starter. Build it up from here — add features with the
|
|
9
9
|
`podo` CLI (`podo add <module>`; run `podo add` with no argument to list them).
|
|
10
10
|
|
|
11
11
|
## Commands
|
|
12
12
|
|
|
13
13
|
```bash
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
{{packageManager}} install
|
|
15
|
+
{{rootRun}} dev # runs workspace dev scripts
|
|
16
|
+
{{rootRun}} build
|
|
17
|
+
{{rootRun}} lint # type-check
|
|
18
|
+
{{rootRun}} test
|
|
19
19
|
```
|
|
20
20
|
|
|
21
21
|
## Code style
|
|
@@ -28,3 +28,5 @@ npm test
|
|
|
28
28
|
This project is managed by the `podo` CLI; `.podokit/` records how it was
|
|
29
29
|
assembled (do not edit by hand). Use `podo status`/`podo diff` to see your local
|
|
30
30
|
edits and `podo update` to pull in improvements without losing your work.
|
|
31
|
+
PodoKit v1 projects are Bun-only. Projects created with PodoKit 0.x remain on
|
|
32
|
+
their pinned 0.x CLI line and are not converted in place.
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Generated with [PodoKit](https://github.com/podosoft-dev/podokit).
|
|
4
4
|
|
|
5
|
-
A
|
|
6
|
-
SvelteKit web
|
|
5
|
+
A minimal Bun 1.4 TypeScript workspace. Add the `fullstack` template when you
|
|
6
|
+
need an Elysia API and SvelteKit web application.
|
|
7
7
|
|
|
8
8
|
## Getting started
|
|
9
9
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Entry point placeholder for the {{projectName}} API.
|
|
2
|
-
// The
|
|
2
|
+
// The Bun + Elysia starter is provided by `templates/fullstack`.
|
|
3
3
|
export function health(): { status: string } {
|
|
4
4
|
return { status: "ok" };
|
|
5
5
|
}
|
|
@@ -2,16 +2,17 @@
|
|
|
2
2
|
"name": "{{projectName}}",
|
|
3
3
|
"version": "0.0.0",
|
|
4
4
|
"private": true,
|
|
5
|
+
"packageManager": "bun@1.4.0",
|
|
5
6
|
"engines": {
|
|
6
|
-
"
|
|
7
|
+
"bun": "1.4.0"
|
|
7
8
|
},
|
|
8
9
|
"workspaces": [
|
|
9
10
|
"apps/*"
|
|
10
11
|
],
|
|
11
12
|
"scripts": {
|
|
12
13
|
"dev": "echo \"Run 'dev' in apps/api and apps/web\" && exit 0",
|
|
13
|
-
"build": "
|
|
14
|
-
"lint": "
|
|
15
|
-
"test": "
|
|
14
|
+
"build": "bun run --workspaces --if-present build",
|
|
15
|
+
"lint": "bun run --workspaces --if-present lint",
|
|
16
|
+
"test": "bun run --workspaces --if-present test"
|
|
16
17
|
}
|
|
17
18
|
}
|
|
@@ -6,28 +6,32 @@ Follow it so your changes match the project's conventions.
|
|
|
6
6
|
|
|
7
7
|
## Project overview
|
|
8
8
|
|
|
9
|
-
A full-stack TypeScript monorepo (
|
|
9
|
+
A Bun 1.4 full-stack TypeScript monorepo ({{packageManager}} workspaces):
|
|
10
10
|
|
|
11
|
-
- `apps/api` — **
|
|
11
|
+
- `apps/api` — **Elysia** backend (`{{projectName}}-api`), Bun.SQL + PostgreSQL, merged OpenAPI at `/api-docs`.
|
|
12
12
|
- `apps/web` — **SvelteKit** frontend (`{{projectName}}-web`), Tailwind v4 + shadcn-svelte + typesafe-i18n.
|
|
13
13
|
- `infra/` — Docker Compose (PostgreSQL/Redis) and example k3s manifests.
|
|
14
|
-
- `.podokit/` — PodoKit
|
|
14
|
+
- `.podokit/` — PodoKit generation metadata plus application-owned development and
|
|
15
|
+
deployment profiles (see "PodoKit tooling" below).
|
|
15
16
|
|
|
16
17
|
## Setup & commands
|
|
17
18
|
|
|
18
19
|
```bash
|
|
19
|
-
|
|
20
|
+
{{packageManager}} install
|
|
20
21
|
cp .env.example .env
|
|
21
22
|
docker compose -f infra/docker/docker-compose.yml up -d # PostgreSQL (+ Redis)
|
|
22
|
-
|
|
23
|
+
{{rootRun}} dev # api on http://localhost:5002, web on http://localhost:5001
|
|
23
24
|
```
|
|
24
25
|
|
|
25
26
|
- **Ports: web = 5001, api = 5002.** The web app reaches the API only through its
|
|
26
27
|
SvelteKit server proxy (`/api/*`), never with a direct browser `fetch`.
|
|
27
|
-
- Build: `
|
|
28
|
-
- Per workspace: `
|
|
29
|
-
- DB migrations (TypeORM
|
|
30
|
-
- e2e (Playwright, ships in `tests/`): `
|
|
28
|
+
- Build: `{{rootRun}} build` · Type-check/lint: `{{rootRun}} lint` · Unit tests: `{{rootRun}} test`
|
|
29
|
+
- Per workspace: `{{apiRun}} build` / `{{webRun}} build`.
|
|
30
|
+
- DB migrations (TypeORM migration layer only): `{{apiRun}} migration:run`.
|
|
31
|
+
- e2e (Playwright, ships in `tests/`): `{{rootRun}} test:e2e`.
|
|
32
|
+
- Playwright officially runs on Node, so `bunx playwright` respects its Node
|
|
33
|
+
shebang. Node LTS is a test-tool dependency only; API, web, worker, migrations,
|
|
34
|
+
builds, and unit tests run on Bun.
|
|
31
35
|
|
|
32
36
|
**Always** verify a change by building the affected workspace (and `svelte-check`
|
|
33
37
|
for web) before considering it done. UI changes need a Playwright test; API
|
|
@@ -37,7 +41,7 @@ changes need an e2e/unit test.
|
|
|
37
41
|
|
|
38
42
|
### TypeScript (both apps)
|
|
39
43
|
- `strict` mode. **No `any`** — use `unknown` + narrowing. **No `@ts-ignore`/`@ts-expect-error`** and no `eslint-disable`.
|
|
40
|
-
- Explicit function return types.
|
|
44
|
+
- Explicit function return types. Validate HTTP inputs with Elysia `t` schemas.
|
|
41
45
|
- Keep `noUnusedLocals`, `noUnusedParameters`, `noImplicitReturns`, `noUncheckedIndexedAccess`.
|
|
42
46
|
|
|
43
47
|
### Svelte 5 (web)
|
|
@@ -59,12 +63,15 @@ changes need an e2e/unit test.
|
|
|
59
63
|
This project is managed by the `podo` CLI. Files have an ownership tier recorded
|
|
60
64
|
in `.podokit/files.lock` — respect it:
|
|
61
65
|
|
|
62
|
-
- **owned** (your code: `apps/web/src/routes/**`, your components/services, `apps/api/src/app.extensions.ts`, and this `AGENTS.md`) — edit freely.
|
|
63
|
-
- **assembled** (e.g. `apps/api/src/app.
|
|
66
|
+
- **owned** (your code: `apps/web/src/routes/**`, your components/services, `apps/api/src/app.extensions.ts`, and this `AGENTS.md`) — edit freely. Add application-owned services or module descriptors through `app.extensions.ts` instead of changing toolkit registrations.
|
|
67
|
+
- **assembled** (e.g. `apps/api/src/app.ts`, `auth.ts`) — contain `// podokit:begin:… / …:end` fenced regions that the toolkit recomputes. Edit outside the fences only; **never hand-edit inside the fences**.
|
|
64
68
|
- **managed** (bootstrap/config like `main.ts`) — the toolkit may update these; avoid gratuitous edits.
|
|
65
69
|
|
|
66
70
|
Useful commands:
|
|
67
71
|
|
|
72
|
+
- `podo dev watch|up|ps|logs|exec|down` — run container development through the
|
|
73
|
+
shared loopback gateway. `.podokit/dev.json` owns the local/public hosts and the
|
|
74
|
+
exact API WebSocket allowlist; never use a prefix or wildcard for that allowlist.
|
|
68
75
|
- `podo add <module>` — add a feature (auth, admin-dashboard, redis, bullmq, …). It wires itself into the app; run `podo add` with no argument to list modules.
|
|
69
76
|
- `podo remove <module>` — un-apply a module (inverse of add; refuses if another module needs it, keeps files you edited).
|
|
70
77
|
- `podo status` / `podo diff` — see your local edits vs. what PodoKit generated.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Development image for the Bun 1.4.0 PodoKit monorepo.
|
|
2
|
+
FROM oven/bun:1.4.0-alpine AS manifests
|
|
3
|
+
WORKDIR /src
|
|
4
|
+
COPY . .
|
|
5
|
+
RUN mkdir -p /app \
|
|
6
|
+
&& cp package.json bun.lock bunfig.toml /app/ \
|
|
7
|
+
&& find . -name package.json -not -path "*/node_modules/*" \
|
|
8
|
+
-exec sh -c 'mkdir -p "/app/$(dirname "$1")" && cp "$1" "/app/$1"' _ {} \;
|
|
9
|
+
|
|
10
|
+
FROM oven/bun:1.4.0-alpine
|
|
11
|
+
|
|
12
|
+
RUN apk add --no-cache git python3 make g++ ca-certificates
|
|
13
|
+
|
|
14
|
+
WORKDIR /app
|
|
15
|
+
COPY --from=manifests /app ./
|
|
16
|
+
ARG PODOKIT_NPM_REGISTRY=""
|
|
17
|
+
RUN if [ -n "$PODOKIT_NPM_REGISTRY" ]; then \
|
|
18
|
+
bun install --frozen-lockfile --registry "$PODOKIT_NPM_REGISTRY"; \
|
|
19
|
+
else \
|
|
20
|
+
bun install --frozen-lockfile; \
|
|
21
|
+
fi
|
|
22
|
+
|
|
23
|
+
COPY . .
|
|
24
|
+
RUN if [ -d packages ]; then \
|
|
25
|
+
for manifest in packages/*/package.json; do \
|
|
26
|
+
[ -e "$manifest" ] || continue; \
|
|
27
|
+
bun run --cwd "$(dirname "$manifest")" --if-present build; \
|
|
28
|
+
done; \
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
EXPOSE 5001 5002
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Full-stack TypeScript starter generated with [PodoKit](https://github.com/podosoft-dev/podokit).
|
|
4
4
|
|
|
5
|
-
- `apps/api` —
|
|
5
|
+
- `apps/api` — Bun 1.4 + Elysia API: schema-validated env, `/health` + `/health/ready`, merged OpenAPI at `/api-docs`, a standard error envelope, and Bun.SQL + PostgreSQL. TypeORM is used only to execute migrations.
|
|
6
6
|
- `apps/web` — SvelteKit app (TailwindCSS v4, shadcn-svelte, typesafe-i18n) that talks to the API through a server-side proxy.
|
|
7
7
|
- `infra/` — Docker Compose (PostgreSQL, Redis) and k3s manifests.
|
|
8
8
|
|
|
@@ -13,7 +13,7 @@ Full-stack TypeScript starter generated with [PodoKit](https://github.com/podoso
|
|
|
13
13
|
```bash
|
|
14
14
|
{{packageManager}} install
|
|
15
15
|
cp .env.example .env
|
|
16
|
-
|
|
16
|
+
{{packageExecutor}} @podosoft/podokit dev watch
|
|
17
17
|
```
|
|
18
18
|
|
|
19
19
|
Open the URL printed by the command; a new project defaults to
|
|
@@ -23,15 +23,20 @@ one user-level Traefik gateway on `127.0.0.1:80`; additional projects reuse it a
|
|
|
23
23
|
route by that hostname. Even a single app uses
|
|
24
24
|
the same topology, with one route and no project-specific host port.
|
|
25
25
|
|
|
26
|
+
When the API exposes WebSocket endpoints, add their exact paths to
|
|
27
|
+
`.podokit/dev.json` under `webSocketPaths`. The shared gateway sends only those paths
|
|
28
|
+
directly to the API and leaves every other path on the web app. Add `publicUrl` to the
|
|
29
|
+
same file when an HTTPS tunnel preserves its public `Host` header.
|
|
30
|
+
|
|
26
31
|
Run lifecycle and container commands from a second terminal:
|
|
27
32
|
|
|
28
33
|
```bash
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
{{packageExecutor}} @podosoft/podokit dev url
|
|
35
|
+
{{packageExecutor}} @podosoft/podokit dev up -d # detached stack without source watching
|
|
36
|
+
{{packageExecutor}} @podosoft/podokit dev ps
|
|
37
|
+
{{packageExecutor}} @podosoft/podokit dev logs
|
|
38
|
+
{{packageExecutor}} @podosoft/podokit dev exec api {{apiRun}} migration:run
|
|
39
|
+
{{packageExecutor}} @podosoft/podokit dev down
|
|
35
40
|
```
|
|
36
41
|
|
|
37
42
|
`dev watch` reads `.podokit/manifest.json` and automatically activates `cache`,
|
|
@@ -41,7 +46,7 @@ Watch attached.
|
|
|
41
46
|
You can still activate an additional Compose profile explicitly:
|
|
42
47
|
|
|
43
48
|
```bash
|
|
44
|
-
|
|
49
|
+
{{packageExecutor}} @podosoft/podokit dev watch --profile dev
|
|
45
50
|
```
|
|
46
51
|
|
|
47
52
|
Explicit profile flags are preserved for other lifecycle commands. `dev down`
|
|
@@ -66,17 +71,15 @@ docker compose -f infra/docker/docker-compose.yml up -d
|
|
|
66
71
|
|
|
67
72
|
## Database & migrations
|
|
68
73
|
|
|
69
|
-
The API uses
|
|
70
|
-
|
|
71
|
-
generate and run a migration:
|
|
74
|
+
The API uses Bun.SQL for request-time queries and TypeORM only as a migration
|
|
75
|
+
runner. Add a numbered migration under `apps/api/src/migrations`, then run it:
|
|
72
76
|
|
|
73
77
|
```bash
|
|
74
|
-
{{
|
|
75
|
-
{{packageManager}} run migration:run -w {{projectName}}-api
|
|
78
|
+
{{apiRun}} migration:run
|
|
76
79
|
```
|
|
77
80
|
|
|
78
81
|
Want a worked example? Generate the `todo` template instead:
|
|
79
|
-
`
|
|
82
|
+
`{{packageExecutor}} @podosoft/podokit create my-app --template todo`.
|
|
80
83
|
|
|
81
84
|
For multi-project routing, container profiles, migrations, and OAuth over a
|
|
82
85
|
stable HTTPS tunnel, see the PodoKit [development guide](https://github.com/podosoft-dev/podokit/blob/main/docs/development.md).
|
|
@@ -88,9 +91,9 @@ route every public path through the web proxy. For a managed release on an
|
|
|
88
91
|
existing cluster, initialize an application-owned profile:
|
|
89
92
|
|
|
90
93
|
```bash
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
+
{{packageExecutor}} @podosoft/podokit deploy init --profile production --context production --host app.example.com
|
|
95
|
+
{{packageExecutor}} @podosoft/podokit deploy doctor --profile production
|
|
96
|
+
{{packageExecutor}} @podosoft/podokit deploy plan --profile production --release v1.2.3
|
|
94
97
|
```
|
|
95
98
|
|
|
96
99
|
Use existing Kubernetes Secrets and never commit their values. See the PodoKit
|
|
@@ -103,3 +106,17 @@ lockfile and all workspace package manifests:
|
|
|
103
106
|
docker build -f apps/api/Dockerfile -t {{projectName}}-api .
|
|
104
107
|
docker build -f apps/web/Dockerfile -t {{projectName}}-web .
|
|
105
108
|
```
|
|
109
|
+
|
|
110
|
+
The generated Kubernetes deployment trusts the ingress-provided
|
|
111
|
+
`x-forwarded-proto` and `x-forwarded-host` headers so the web server can enforce
|
|
112
|
+
same-origin form submissions. If the web container is served directly over plain
|
|
113
|
+
HTTP, fix its public origin at build time instead:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
docker build --build-arg PODOKIT_BUILD_ORIGIN=https://example.com -f apps/web/Dockerfile -t {{projectName}}-web .
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
For a Docker Compose deployment behind a trusted reverse proxy, set
|
|
120
|
+
`PROTOCOL_HEADER=x-forwarded-proto` and `HOST_HEADER=x-forwarded-host` in the
|
|
121
|
+
deployment profile runtime configuration. Never trust client-controlled forwarded
|
|
122
|
+
headers on a directly exposed container.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# syntax=docker/dockerfile:1
|
|
2
|
+
|
|
3
|
+
FROM oven/bun:1.4.0-alpine AS manifests
|
|
4
|
+
WORKDIR /src
|
|
5
|
+
COPY . .
|
|
6
|
+
RUN mkdir -p /app \
|
|
7
|
+
&& cp package.json bun.lock bunfig.toml /app/ \
|
|
8
|
+
&& find . -name package.json -not -path "*/node_modules/*" \
|
|
9
|
+
-exec sh -c 'mkdir -p "/app/$(dirname "$1")" && cp "$1" "/app/$1"' _ {} \;
|
|
10
|
+
|
|
11
|
+
FROM oven/bun:1.4.0-alpine AS deps
|
|
12
|
+
WORKDIR /app
|
|
13
|
+
COPY --from=manifests /app ./
|
|
14
|
+
RUN bun ci
|
|
15
|
+
|
|
16
|
+
FROM oven/bun:1.4.0-alpine AS prod-deps
|
|
17
|
+
WORKDIR /app
|
|
18
|
+
COPY --from=manifests /app ./
|
|
19
|
+
RUN bun install --production --frozen-lockfile --filter './apps/api'
|
|
20
|
+
|
|
21
|
+
FROM oven/bun:1.4.0-alpine AS build
|
|
22
|
+
WORKDIR /app
|
|
23
|
+
COPY --from=deps /app ./
|
|
24
|
+
COPY . .
|
|
25
|
+
RUN if [ -d packages ]; then \
|
|
26
|
+
for manifest in packages/*/package.json; do \
|
|
27
|
+
[ -e "$manifest" ] || continue; \
|
|
28
|
+
bun run --cwd "$(dirname "$manifest")" --if-present build; \
|
|
29
|
+
done; \
|
|
30
|
+
fi
|
|
31
|
+
RUN bun run --cwd apps/api build
|
|
32
|
+
RUN mkdir -p /app/packages
|
|
33
|
+
|
|
34
|
+
FROM oven/bun:1.4.0-alpine AS runtime
|
|
35
|
+
WORKDIR /app
|
|
36
|
+
ENV NODE_ENV=production
|
|
37
|
+
COPY --from=prod-deps /app/node_modules ./node_modules
|
|
38
|
+
COPY --from=manifests /app/apps/api ./apps/api
|
|
39
|
+
COPY --from=build /app/packages ./packages
|
|
40
|
+
COPY --from=build /app/apps/api/dist ./apps/api/dist
|
|
41
|
+
COPY --from=build /app/apps/api/scripts ./apps/api/scripts
|
|
42
|
+
WORKDIR /app/apps/api
|
|
43
|
+
USER bun
|
|
44
|
+
EXPOSE 3000
|
|
45
|
+
HEALTHCHECK --interval=10s --timeout=5s --start-period=30s --retries=6 \
|
|
46
|
+
CMD bun -e "fetch('http://127.0.0.1:' + (process.env.PORT ?? '3000') + '/health/ready').then((r) => process.exit(r.ok ? 0 : 1)).catch(() => process.exit(1))"
|
|
47
|
+
CMD ["bun", "dist/main.js"]
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{projectName}}-api",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"scripts": {
|
|
6
|
+
"dev": "bun --watch src/main.ts",
|
|
7
|
+
"build": "bun scripts/build.mjs",
|
|
8
|
+
"start": "bun dist/main.js",
|
|
9
|
+
"lint": "bunx tsc -p tsconfig.json --noEmit",
|
|
10
|
+
"test": "bun test src",
|
|
11
|
+
"contract": "bun scripts/verify-api-contract.ts",
|
|
12
|
+
"migrate:all": "bun dist/database/migrate.js",
|
|
13
|
+
"typeorm": "bunx typeorm-ts-node-commonjs -d src/database/data-source.ts",
|
|
14
|
+
"migration:run": "bun run typeorm -- migration:run",
|
|
15
|
+
"migration:revert": "bun run typeorm -- migration:revert",
|
|
16
|
+
"migration:generate": "bun run typeorm -- migration:generate"
|
|
17
|
+
},
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@podosoft/podokit-contracts": "^0.4.0",
|
|
20
|
+
"@elysia/cors": "^1.4.2",
|
|
21
|
+
"@elysia/openapi": "^1.4.15",
|
|
22
|
+
"dotenv": "^16.4.5",
|
|
23
|
+
"elysia": "^1.4.29",
|
|
24
|
+
"pg": "^8.12.0",
|
|
25
|
+
"pino": "^9.6.0",
|
|
26
|
+
"typeorm": "^0.3.20",
|
|
27
|
+
"zod": "^3.23.8"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@types/bun": "^1.3.9",
|
|
31
|
+
"@types/node": "^20.17.0",
|
|
32
|
+
"ts-node": "^10.9.2",
|
|
33
|
+
"typescript": "^6.0.3"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { existsSync, readdirSync } from "node:fs";
|
|
2
|
+
|
|
3
|
+
const targets = [
|
|
4
|
+
{ entrypoint: "src/main.ts", outdir: "dist" },
|
|
5
|
+
{ entrypoint: "src/database/migrate.ts", outdir: "dist/database" },
|
|
6
|
+
{ entrypoint: "src/migrate.ts", outdir: "dist" },
|
|
7
|
+
{ entrypoint: "src/main-worker.ts", outdir: "dist" },
|
|
8
|
+
].filter((target) => existsSync(target.entrypoint));
|
|
9
|
+
|
|
10
|
+
for (const target of targets) {
|
|
11
|
+
const result = await Bun.build({
|
|
12
|
+
entrypoints: [target.entrypoint],
|
|
13
|
+
outdir: target.outdir,
|
|
14
|
+
target: "bun",
|
|
15
|
+
});
|
|
16
|
+
if (!result.success) {
|
|
17
|
+
for (const log of result.logs) process.stderr.write(`${log}\n`);
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (existsSync("src/migrations")) {
|
|
23
|
+
const migrations = readdirSync("src/migrations")
|
|
24
|
+
.filter((file) => /^\d+-.+\.ts$/.test(file))
|
|
25
|
+
.map((file) => `src/migrations/${file}`);
|
|
26
|
+
if (migrations.length > 0) {
|
|
27
|
+
const result = await Bun.build({
|
|
28
|
+
entrypoints: migrations,
|
|
29
|
+
outdir: "dist/migrations",
|
|
30
|
+
target: "bun",
|
|
31
|
+
external: ["typeorm"],
|
|
32
|
+
});
|
|
33
|
+
if (!result.success) {
|
|
34
|
+
for (const log of result.logs) process.stderr.write(`${log}\n`);
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|