@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/templates.js
CHANGED
|
@@ -6,16 +6,16 @@ exports.templateListText = templateListText;
|
|
|
6
6
|
// Order matters: the first entry is the default and prompts list them in order.
|
|
7
7
|
exports.TEMPLATES = [
|
|
8
8
|
{
|
|
9
|
-
name: "fullstack
|
|
10
|
-
description: "
|
|
9
|
+
name: "fullstack",
|
|
10
|
+
description: "Bun + Elysia + SvelteKit starter — Bun.SQL, OpenAPI, no domain code",
|
|
11
11
|
},
|
|
12
12
|
{
|
|
13
13
|
name: "todo",
|
|
14
|
-
description: "Fullstack starter plus a Todo CRUD example
|
|
14
|
+
description: "Fullstack starter plus a Bun.SQL Todo CRUD example and UI",
|
|
15
15
|
},
|
|
16
16
|
{
|
|
17
17
|
name: "base",
|
|
18
|
-
description: "Minimal
|
|
18
|
+
description: "Minimal Bun workspace to build up from scratch",
|
|
19
19
|
},
|
|
20
20
|
];
|
|
21
21
|
exports.DEFAULT_TEMPLATE = exports.TEMPLATES[0].name;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { TemplateVars } from "@podosoft/podokit-template-engine";
|
|
2
|
+
export declare const BUN_VERSION = "1.4.0";
|
|
3
|
+
export type Runtime = "bun";
|
|
4
|
+
export type PackageManager = "bun";
|
|
5
|
+
export interface Toolchain {
|
|
6
|
+
runtime: Runtime;
|
|
7
|
+
runtimeVersion: string;
|
|
8
|
+
packageManager: PackageManager;
|
|
9
|
+
}
|
|
10
|
+
export declare function resolveToolchain(runtime?: string, packageManager?: string): Toolchain;
|
|
11
|
+
export declare function toolchainTemplateVars(toolchain: Toolchain): TemplateVars;
|
|
12
|
+
export declare function isRuntime(value: string): value is Runtime;
|
|
13
|
+
export declare function toolchainMigrationCommand(_toolchain: Toolchain): string[];
|
|
14
|
+
export declare function toolchainWorkerCommand(_toolchain: Toolchain): string[];
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BUN_VERSION = void 0;
|
|
4
|
+
exports.resolveToolchain = resolveToolchain;
|
|
5
|
+
exports.toolchainTemplateVars = toolchainTemplateVars;
|
|
6
|
+
exports.isRuntime = isRuntime;
|
|
7
|
+
exports.toolchainMigrationCommand = toolchainMigrationCommand;
|
|
8
|
+
exports.toolchainWorkerCommand = toolchainWorkerCommand;
|
|
9
|
+
exports.BUN_VERSION = "1.4.0";
|
|
10
|
+
function resolveToolchain(runtime = "bun", packageManager) {
|
|
11
|
+
if (runtime !== "bun") {
|
|
12
|
+
throw new Error("PodoKit v1 generates Bun-only applications. Existing Node projects must remain on @podosoft/podokit@0.17.4.");
|
|
13
|
+
}
|
|
14
|
+
if (packageManager && packageManager !== "bun") {
|
|
15
|
+
throw new Error("PodoKit v1 uses Bun as its package manager; remove --pm.");
|
|
16
|
+
}
|
|
17
|
+
return { runtime: "bun", runtimeVersion: exports.BUN_VERSION, packageManager: "bun" };
|
|
18
|
+
}
|
|
19
|
+
function toolchainTemplateVars(toolchain) {
|
|
20
|
+
return {
|
|
21
|
+
runtime: toolchain.runtime,
|
|
22
|
+
runtimeVersion: toolchain.runtimeVersion,
|
|
23
|
+
runtimeCommand: "bun",
|
|
24
|
+
runtimeBinPrefix: "bunx --bun ",
|
|
25
|
+
packageManager: "bun",
|
|
26
|
+
packageExecutor: "bunx --bun",
|
|
27
|
+
packageExecutorCommand: "bunx",
|
|
28
|
+
packageExecutorArgs: '"--bun", ',
|
|
29
|
+
ciSetup: "- uses: oven-sh/setup-bun@v2\n with:\n bun-version: 1.4.0",
|
|
30
|
+
ciInstallCommand: "bun ci",
|
|
31
|
+
ciLintCommand: "bun run lint",
|
|
32
|
+
ciTestCommand: "bun run test",
|
|
33
|
+
profileRuntime: "bun",
|
|
34
|
+
rootRun: "bun run",
|
|
35
|
+
apiRun: "bun run --cwd apps/api",
|
|
36
|
+
apiWorkspaceArg: "",
|
|
37
|
+
webRun: "bun run --cwd apps/web",
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function isRuntime(value) {
|
|
41
|
+
return value === "bun";
|
|
42
|
+
}
|
|
43
|
+
function toolchainMigrationCommand(_toolchain) {
|
|
44
|
+
return ["bun", "run", "migrate:all"];
|
|
45
|
+
}
|
|
46
|
+
function toolchainWorkerCommand(_toolchain) {
|
|
47
|
+
return ["bun", "dist/main-worker.js"];
|
|
48
|
+
}
|
package/dist/update.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { type TemplateVars } from "@podosoft/podokit-template-engine";
|
|
1
2
|
import { type Tier } from "./lockfile";
|
|
3
|
+
import type { Toolchain } from "./toolchain";
|
|
2
4
|
/**
|
|
3
5
|
* `podo update` planner. For now it produces a dry-run plan only: it assembles
|
|
4
6
|
* the new-version tree from the installed CLI's templates and compares it to the
|
|
@@ -26,12 +28,27 @@ export interface UpdatePlan {
|
|
|
26
28
|
* Build the update plan. `templatesDir` is the installed CLI's template set (the
|
|
27
29
|
* new version); the lock records what PodoKit last wrote (to detect user edits).
|
|
28
30
|
*/
|
|
29
|
-
export
|
|
31
|
+
export interface PlanOptions {
|
|
32
|
+
/** Replay variables for a toolchain conversion instead of the current answers. */
|
|
33
|
+
targetAnswers?: TemplateVars;
|
|
34
|
+
/** Treat normally owned runtime scaffolding as managed for this operation. */
|
|
35
|
+
forceManagedPaths?: string[];
|
|
36
|
+
/** Restrict planning to selected paths, used by focused conversions. */
|
|
37
|
+
onlyPaths?: string[];
|
|
38
|
+
}
|
|
39
|
+
export declare function planUpdate(projectRoot: string, templatesDir: string, options?: PlanOptions): UpdatePlan;
|
|
30
40
|
export interface ApplyOptions {
|
|
31
41
|
/** Templates for the version the project is currently on, for 3-way merges. */
|
|
32
42
|
oldTemplatesDir?: string;
|
|
33
43
|
/** Preinstalled previous external modules. Primarily useful for offline updates. */
|
|
34
44
|
oldExternalModulesRoot?: string;
|
|
45
|
+
/** Replay variables and manifest value used by a runtime conversion. */
|
|
46
|
+
targetAnswers?: TemplateVars;
|
|
47
|
+
targetToolchain?: Toolchain;
|
|
48
|
+
forceManagedPaths?: string[];
|
|
49
|
+
onlyPaths?: string[];
|
|
50
|
+
/** Refuse to write anything when a 3-way merge would leave conflict markers. */
|
|
51
|
+
abortOnConflict?: boolean;
|
|
35
52
|
}
|
|
36
53
|
export interface ApplyResult {
|
|
37
54
|
written: string[];
|
package/dist/update.js
CHANGED
|
@@ -97,11 +97,7 @@ function targetOwnedGlobs(projectRoot, templatesDir, modules, current) {
|
|
|
97
97
|
}
|
|
98
98
|
return [...owned];
|
|
99
99
|
}
|
|
100
|
-
|
|
101
|
-
* Build the update plan. `templatesDir` is the installed CLI's template set (the
|
|
102
|
-
* new version); the lock records what PodoKit last wrote (to detect user edits).
|
|
103
|
-
*/
|
|
104
|
-
function planUpdate(projectRoot, templatesDir) {
|
|
100
|
+
function planUpdate(projectRoot, templatesDir, options = {}) {
|
|
105
101
|
const manifest = (0, lockfile_1.readManifest)(projectRoot);
|
|
106
102
|
const lock = (0, lockfile_1.readFilesLock)(projectRoot);
|
|
107
103
|
if (!manifest || !lock)
|
|
@@ -110,7 +106,7 @@ function planUpdate(projectRoot, templatesDir) {
|
|
|
110
106
|
const newTree = (0, assemble_1.assembleProject)({
|
|
111
107
|
templatesDir,
|
|
112
108
|
template: manifest.template,
|
|
113
|
-
answers:
|
|
109
|
+
answers: options.targetAnswers ?? (0, lockfile_1.manifestTemplateVars)(manifest),
|
|
114
110
|
modules,
|
|
115
111
|
projectRoot,
|
|
116
112
|
});
|
|
@@ -139,6 +135,8 @@ function planUpdate(projectRoot, templatesDir) {
|
|
|
139
135
|
for (const path of [...paths].sort()) {
|
|
140
136
|
if (movedSources.has(path) || movedTargets.has(path))
|
|
141
137
|
continue;
|
|
138
|
+
if (options.onlyPaths && !options.onlyPaths.some((glob) => (0, lockfile_1.matchGlob)(path, glob)))
|
|
139
|
+
continue;
|
|
142
140
|
const locked = lock.files[path];
|
|
143
141
|
const newText = treeText(newTree, path);
|
|
144
142
|
const disk = diskContent(projectRoot, path);
|
|
@@ -146,10 +144,15 @@ function planUpdate(projectRoot, templatesDir) {
|
|
|
146
144
|
// particular, an exact path recorded by `podo eject` must keep winning over
|
|
147
145
|
// a module's managed override, while managed overrides may still reclaim a
|
|
148
146
|
// path covered only by a broad owned glob.
|
|
147
|
+
const forceManaged = options.forceManagedPaths?.some((glob) => (0, lockfile_1.matchGlob)(path, glob)) ?? false;
|
|
149
148
|
const controlledByTarget = managedOverrides.some((glob) => (0, lockfile_1.matchGlob)(path, glob)) ||
|
|
150
149
|
ownedGlobs.some((glob) => (0, lockfile_1.matchGlob)(path, glob));
|
|
151
150
|
const classified = (0, lockfile_1.classifyTier)(path, newText ?? disk ?? "", ownedGlobs, managedOverrides);
|
|
152
|
-
const tier =
|
|
151
|
+
const tier = forceManaged
|
|
152
|
+
? "managed"
|
|
153
|
+
: controlledByTarget
|
|
154
|
+
? classified
|
|
155
|
+
: locked?.tier ?? classified;
|
|
153
156
|
if (tier === "owned") {
|
|
154
157
|
// A file introduced by a newer template or module has no previous lock
|
|
155
158
|
// entry. Seed it once when the application has not already claimed that
|
|
@@ -264,9 +267,17 @@ function writeFile(projectRoot, path, content) {
|
|
|
264
267
|
* Files that are neither in the assembled tree nor explicitly owned stay out of
|
|
265
268
|
* the lock instead of being accidentally adopted as managed files.
|
|
266
269
|
*/
|
|
267
|
-
function updatedFilesLock(projectRoot, newTree, previous, ownedGlobs, managedOverrides) {
|
|
270
|
+
function updatedFilesLock(projectRoot, newTree, previous, ownedGlobs, managedOverrides, onlyPaths) {
|
|
268
271
|
const next = (0, lockfile_1.computeFilesLock)(projectRoot, ownedGlobs, managedOverrides);
|
|
269
272
|
for (const [path, entry] of Object.entries(next.files)) {
|
|
273
|
+
if (onlyPaths && !onlyPaths.some((glob) => (0, lockfile_1.matchGlob)(path, glob))) {
|
|
274
|
+
const previousEntry = previous.files[path];
|
|
275
|
+
if (previousEntry)
|
|
276
|
+
next.files[path] = previousEntry;
|
|
277
|
+
else
|
|
278
|
+
delete next.files[path];
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
270
281
|
const newText = treeText(newTree, path);
|
|
271
282
|
if (newText !== null) {
|
|
272
283
|
if (entry.tier !== "owned") {
|
|
@@ -317,12 +328,16 @@ function applyUpdate(projectRoot, templatesDir, options = {}) {
|
|
|
317
328
|
const previousLock = (0, lockfile_1.readFilesLock)(projectRoot);
|
|
318
329
|
if (!manifest || !previousLock)
|
|
319
330
|
throw new inspect_1.NotAProjectError();
|
|
320
|
-
const plan = planUpdate(projectRoot, templatesDir
|
|
331
|
+
const plan = planUpdate(projectRoot, templatesDir, {
|
|
332
|
+
targetAnswers: options.targetAnswers,
|
|
333
|
+
forceManagedPaths: options.forceManagedPaths,
|
|
334
|
+
onlyPaths: options.onlyPaths,
|
|
335
|
+
});
|
|
321
336
|
const modules = targetModules(projectRoot, templatesDir, manifest.modules);
|
|
322
337
|
const newTree = (0, assemble_1.assembleProject)({
|
|
323
338
|
templatesDir,
|
|
324
339
|
template: manifest.template,
|
|
325
|
-
answers:
|
|
340
|
+
answers: options.targetAnswers ?? (0, lockfile_1.manifestTemplateVars)(manifest),
|
|
326
341
|
modules,
|
|
327
342
|
projectRoot,
|
|
328
343
|
});
|
|
@@ -349,7 +364,7 @@ function applyUpdate(projectRoot, templatesDir, options = {}) {
|
|
|
349
364
|
oldTree = (0, assemble_1.assembleProject)({
|
|
350
365
|
templatesDir: options.oldTemplatesDir,
|
|
351
366
|
template: manifest.template,
|
|
352
|
-
answers: manifest
|
|
367
|
+
answers: (0, lockfile_1.manifestTemplateVars)(manifest),
|
|
353
368
|
modules: manifest.modules,
|
|
354
369
|
projectRoot: previousModules.root,
|
|
355
370
|
});
|
|
@@ -359,6 +374,27 @@ function applyUpdate(projectRoot, templatesDir, options = {}) {
|
|
|
359
374
|
(0, node_fs_1.rmSync)(previousModules.root, { recursive: true, force: true });
|
|
360
375
|
}
|
|
361
376
|
}
|
|
377
|
+
if (options.abortOnConflict) {
|
|
378
|
+
const unresolved = [];
|
|
379
|
+
for (const change of plan.changes) {
|
|
380
|
+
if (change.action !== "conflict")
|
|
381
|
+
continue;
|
|
382
|
+
const next = treeText(newTree, change.path);
|
|
383
|
+
const base = oldTree ? treeText(oldTree, change.path) : null;
|
|
384
|
+
const current = diskContent(projectRoot, change.path)?.toString("utf8") ?? null;
|
|
385
|
+
if (next === null || base === null || current === null) {
|
|
386
|
+
unresolved.push(change.path);
|
|
387
|
+
continue;
|
|
388
|
+
}
|
|
389
|
+
if ((0, podokit_template_engine_1.threeWayMerge)(base, current, next).conflicts > 0)
|
|
390
|
+
unresolved.push(change.path);
|
|
391
|
+
}
|
|
392
|
+
if (unresolved.length) {
|
|
393
|
+
throw new Error(`Runtime conversion would conflict with local edits:\n${unresolved
|
|
394
|
+
.map((path) => ` - ${path}`)
|
|
395
|
+
.join("\n")}`);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
362
398
|
const result = {
|
|
363
399
|
written: [],
|
|
364
400
|
moved: (0, module_migrations_1.applyModuleMigrations)(projectRoot, migrationPlan),
|
|
@@ -395,7 +431,7 @@ function applyUpdate(projectRoot, templatesDir, options = {}) {
|
|
|
395
431
|
// Keep the assembled target as the managed baseline. A merged working file
|
|
396
432
|
// intentionally remains drifted so a future update performs another 3-way
|
|
397
433
|
// merge instead of treating the user's lines as clean generated output.
|
|
398
|
-
(0, lockfile_1.writeFilesLock)(projectRoot, updatedFilesLock(projectRoot, newTree, previousLock, migratedOwnedGlobs, migratedManagedOverrides));
|
|
434
|
+
(0, lockfile_1.writeFilesLock)(projectRoot, updatedFilesLock(projectRoot, newTree, previousLock, migratedOwnedGlobs, migratedManagedOverrides, options.onlyPaths));
|
|
399
435
|
const modulesDir = (0, node_path_1.join)(templatesDir, "modules");
|
|
400
436
|
const appliedMigrations = new Map();
|
|
401
437
|
for (const pending of pendingMigrations) {
|
|
@@ -424,6 +460,8 @@ function applyUpdate(projectRoot, templatesDir, options = {}) {
|
|
|
424
460
|
});
|
|
425
461
|
(0, lockfile_1.writeManifest)(projectRoot, {
|
|
426
462
|
...manifest,
|
|
463
|
+
answers: options.targetAnswers ?? (0, lockfile_1.manifestTemplateVars)(manifest),
|
|
464
|
+
toolchain: options.targetToolchain ?? manifest.toolchain,
|
|
427
465
|
ownedGlobs: migratedOwnedGlobs,
|
|
428
466
|
managedOverrides: migratedManagedOverrides,
|
|
429
467
|
modules: refreshedModules,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function parseExactWebSocketPaths(value: unknown, field: string): string[];
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseExactWebSocketPaths = parseExactWebSocketPaths;
|
|
4
|
+
const MAX_PATHS = 32;
|
|
5
|
+
const MAX_PATH_LENGTH = 2_048;
|
|
6
|
+
const SAFE_PATH = /^\/[A-Za-z0-9._~!$&'()+,;=:@/-]*$/;
|
|
7
|
+
function parseExactWebSocketPaths(value, field) {
|
|
8
|
+
if (!Array.isArray(value)) {
|
|
9
|
+
throw new Error(`Configuration field "${field}" must be an array of exact URL paths.`);
|
|
10
|
+
}
|
|
11
|
+
if (value.length > MAX_PATHS) {
|
|
12
|
+
throw new Error(`Configuration field "${field}" must contain at most ${MAX_PATHS} paths.`);
|
|
13
|
+
}
|
|
14
|
+
const paths = [];
|
|
15
|
+
const seen = new Set();
|
|
16
|
+
for (const path of value) {
|
|
17
|
+
if (typeof path !== "string" ||
|
|
18
|
+
path === "/" ||
|
|
19
|
+
path.length > MAX_PATH_LENGTH ||
|
|
20
|
+
!SAFE_PATH.test(path) ||
|
|
21
|
+
path.includes("//") ||
|
|
22
|
+
path.split("/").some((segment) => segment === "." || segment === "..")) {
|
|
23
|
+
throw new Error(`Configuration field "${field}" must contain only static absolute paths such as "/events/ws". Root, patterns, queries, fragments, encoded separators, and traversal segments are not allowed.`);
|
|
24
|
+
}
|
|
25
|
+
if (seen.has(path)) {
|
|
26
|
+
throw new Error(`Configuration field "${field}" contains duplicate path "${path}".`);
|
|
27
|
+
}
|
|
28
|
+
seen.add(path);
|
|
29
|
+
paths.push(path);
|
|
30
|
+
}
|
|
31
|
+
return paths;
|
|
32
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@podosoft/podokit",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "An opinionated
|
|
3
|
+
"version": "1.0.2",
|
|
4
|
+
"description": "An opinionated Bun and Elysia full-stack TypeScript starter toolkit and CLI with SvelteKit, TailwindCSS, shadcn-svelte, Docker, and k3s.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
"directory": "packages/cli"
|
|
10
10
|
},
|
|
11
11
|
"keywords": [
|
|
12
|
-
"
|
|
12
|
+
"elysia",
|
|
13
|
+
"bun",
|
|
13
14
|
"sveltekit",
|
|
14
15
|
"starter",
|
|
15
16
|
"cli",
|
|
@@ -39,7 +40,7 @@
|
|
|
39
40
|
"provenance": true
|
|
40
41
|
},
|
|
41
42
|
"scripts": {
|
|
42
|
-
"build": "tsc -p tsconfig.json && node scripts/copy-templates.mjs",
|
|
43
|
+
"build": "node scripts/clean-dist.mjs && tsc -p tsconfig.json && node scripts/copy-templates.mjs",
|
|
43
44
|
"lint": "tsc -p tsconfig.json --noEmit",
|
|
44
45
|
"test": "vitest run"
|
|
45
46
|
},
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
# Development image for the PodoKit monorepo (web + api).
|
|
2
|
-
# Dependencies and source are baked in; `docker compose watch` syncs your
|
|
3
|
-
# edits into the running container so the native file watchers fire.
|
|
4
|
-
|
|
5
|
-
# Every workspace manifest, collected rather than listed.
|
|
6
|
-
#
|
|
7
|
-
# Listing them by hand only works for the workspaces this template starts with. A
|
|
8
|
-
# project that adds `packages/*` then has workspace manifests that never reach the
|
|
9
|
-
# image, so npm does not know those names are local and goes looking for them on the
|
|
10
|
-
# public registry — `npm error 404 '@scope/thing' is not in this registry`, from an
|
|
11
|
-
# install that succeeds on the developer's own machine. The production images
|
|
12
|
-
# collect manifests for exactly this reason; this one was the exception until a
|
|
13
|
-
# generated project with shared packages could not start its dev stack at all.
|
|
14
|
-
FROM node:22-bookworm-slim AS manifests
|
|
15
|
-
WORKDIR /src
|
|
16
|
-
COPY . .
|
|
17
|
-
RUN mkdir -p /app \
|
|
18
|
-
&& cp package.json /app/ \
|
|
19
|
-
&& find . -name package.json -not -path "*/node_modules/*" \
|
|
20
|
-
-exec sh -c 'mkdir -p "/app/$(dirname "$1")" && cp "$1" "/app/$1"' _ {} \;
|
|
21
|
-
|
|
22
|
-
FROM node:22-bookworm-slim
|
|
23
|
-
|
|
24
|
-
# git for the toolchain (editors, AI agents); build tools for native modules.
|
|
25
|
-
RUN apt-get update \
|
|
26
|
-
&& apt-get install -y --no-install-recommends git python3 make g++ ca-certificates \
|
|
27
|
-
&& rm -rf /var/lib/apt/lists/*
|
|
28
|
-
|
|
29
|
-
WORKDIR /app
|
|
30
|
-
|
|
31
|
-
# Install workspace dependencies (cached unless a package.json changes).
|
|
32
|
-
# NB: the host package-lock.json is intentionally NOT copied — a lockfile
|
|
33
|
-
# generated on macOS/Windows prunes platform-specific optional deps and can drop
|
|
34
|
-
# packages (e.g. @swc/cli) on linux. Resolving fresh in-container avoids that.
|
|
35
|
-
COPY --from=manifests /app ./
|
|
36
|
-
ARG PODOKIT_NPM_REGISTRY=""
|
|
37
|
-
RUN if [ -n "$PODOKIT_NPM_REGISTRY" ]; then npm config set registry "$PODOKIT_NPM_REGISTRY"; fi \
|
|
38
|
-
&& npm install
|
|
39
|
-
|
|
40
|
-
# Baked source (kept in sync during development by `docker compose watch`).
|
|
41
|
-
COPY . .
|
|
42
|
-
|
|
43
|
-
# Workspace packages compile before the apps that import them. Apps import them by
|
|
44
|
-
# their published entry point (`dist/index.js`), so without this the API starts and
|
|
45
|
-
# dies on MODULE_NOT_FOUND for a package whose symlink is right there — the link
|
|
46
|
-
# resolves, the built file behind it does not exist. `--if-present` keeps a project
|
|
47
|
-
# with no packages, or one whose packages need no build, working unchanged.
|
|
48
|
-
#
|
|
49
|
-
# `docker compose watch` syncs app source only, so a change under packages/* needs
|
|
50
|
-
# this image rebuilt rather than a container restart.
|
|
51
|
-
RUN if [ -d packages ]; then \
|
|
52
|
-
for manifest in packages/*/package.json; do \
|
|
53
|
-
[ -e "$manifest" ] || continue; \
|
|
54
|
-
npm run build --if-present --workspace "$(dirname "$manifest")"; \
|
|
55
|
-
done; \
|
|
56
|
-
fi
|
|
57
|
-
|
|
58
|
-
EXPOSE 5001 5002
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
# syntax=docker/dockerfile:1
|
|
2
|
-
|
|
3
|
-
# The npm that reads package-lock.json must be the major that wrote it. node:22
|
|
4
|
-
# bundles npm 10, and a lockfile written by npm 11 records platform-specific
|
|
5
|
-
# packages as extraneous with no `optional` flag; npm 10 rejects those with
|
|
6
|
-
# EBADPLATFORM instead of skipping them, so `npm ci` fails inside the image while
|
|
7
|
-
# `npm install` on the developer's machine is fine. Keep this in step with the npm
|
|
8
|
-
# the project is developed with.
|
|
9
|
-
ARG NPM_VERSION=11.17.0
|
|
10
|
-
|
|
11
|
-
# Every workspace manifest, and nothing else.
|
|
12
|
-
#
|
|
13
|
-
# Listing them by hand only works for the workspaces this template starts with: npm
|
|
14
|
-
# does NOT fail when a workspace's package.json is absent, it silently installs a
|
|
15
|
-
# tree without that package's dependencies. A project that adds packages/* then
|
|
16
|
-
# builds against different versions than it resolves locally, and only inside the
|
|
17
|
-
# image. Collecting them keeps `npm ci` correct whatever the workspace layout is,
|
|
18
|
-
# and the stages below still cache on the manifests' content.
|
|
19
|
-
FROM node:22-alpine AS manifests
|
|
20
|
-
WORKDIR /src
|
|
21
|
-
COPY . .
|
|
22
|
-
RUN mkdir -p /app \
|
|
23
|
-
&& cp package.json package-lock.json /app/ \
|
|
24
|
-
&& find . -name package.json -not -path "*/node_modules/*" \
|
|
25
|
-
-exec sh -c 'mkdir -p "/app/$(dirname "$1")" && cp "$1" "/app/$1"' _ {} \;
|
|
26
|
-
|
|
27
|
-
FROM node:22-alpine AS deps
|
|
28
|
-
WORKDIR /app
|
|
29
|
-
COPY --from=manifests /app ./
|
|
30
|
-
ARG NPM_VERSION
|
|
31
|
-
RUN npm i -g "npm@${NPM_VERSION}"
|
|
32
|
-
RUN npm ci --no-audit --no-fund
|
|
33
|
-
|
|
34
|
-
# Production dependencies only, resolved from the same lockfile. The runtime stage
|
|
35
|
-
# copies node_modules from here and never from deps or build, so the shipped image
|
|
36
|
-
# does not carry the TypeScript compiler, Vite, or the test tooling.
|
|
37
|
-
FROM node:22-alpine AS prod-deps
|
|
38
|
-
WORKDIR /app
|
|
39
|
-
COPY --from=manifests /app ./
|
|
40
|
-
ARG NPM_VERSION
|
|
41
|
-
RUN npm i -g "npm@${NPM_VERSION}"
|
|
42
|
-
# The runtime tree for this image only.
|
|
43
|
-
#
|
|
44
|
-
# Scoping to the one workspace matters: --omit=dev at the root still installs the
|
|
45
|
-
# union of every workspace's production dependencies, so the API image carried Vite
|
|
46
|
-
# and the web image carried Nest. Measured on a generated project, this is 198
|
|
47
|
-
# packages instead of 283. TypeScript stays either way -- typeorm depends on ts-node,
|
|
48
|
-
# which depends on it, so it is a production dependency and not bloat.
|
|
49
|
-
RUN npm ci --omit=dev --no-audit --no-fund --workspace=apps/api --include-workspace-root
|
|
50
|
-
|
|
51
|
-
FROM node:22-alpine AS build
|
|
52
|
-
WORKDIR /app
|
|
53
|
-
# Everything npm ci produced, not just the root node_modules: npm nests any
|
|
54
|
-
# dependency it cannot hoist, and copying only the root directory leaves a workspace
|
|
55
|
-
# package compiling against the wrong version of it.
|
|
56
|
-
COPY --from=deps /app ./
|
|
57
|
-
COPY . .
|
|
58
|
-
# Local workspace packages compile before the app that imports them. Apps import
|
|
59
|
-
# them by their published entry points and .dockerignore excludes dist, so nothing
|
|
60
|
-
# here has compiled output until it is compiled here.
|
|
61
|
-
RUN if [ -d packages ]; then \
|
|
62
|
-
for manifest in packages/*/package.json; do \
|
|
63
|
-
[ -e "$manifest" ] || continue; \
|
|
64
|
-
npm run build --if-present --workspace "$(dirname "$manifest")"; \
|
|
65
|
-
done; \
|
|
66
|
-
fi
|
|
67
|
-
RUN npm run build --workspace=apps/api
|
|
68
|
-
# The runtime needs the real workspace package directories, not just the symlinks
|
|
69
|
-
# npm leaves in node_modules pointing at them. Without this the image boots and
|
|
70
|
-
# dies on "Cannot find module <package>" -- a dangling link, at runtime only.
|
|
71
|
-
# mkdir keeps the COPY valid for a project that has no packages/ at all.
|
|
72
|
-
RUN mkdir -p /app/packages
|
|
73
|
-
|
|
74
|
-
FROM node:22-alpine AS runtime
|
|
75
|
-
WORKDIR /app
|
|
76
|
-
ENV NODE_ENV=production
|
|
77
|
-
RUN addgroup -S -g 101 app && adduser -S -D -H -u 100 -G app app
|
|
78
|
-
COPY --from=prod-deps /app/node_modules ./node_modules
|
|
79
|
-
COPY --from=manifests /app/apps/api ./apps/api
|
|
80
|
-
COPY --from=build /app/packages ./packages
|
|
81
|
-
COPY --from=build /app/apps/api/dist ./apps/api/dist
|
|
82
|
-
COPY --from=build /app/apps/api/scripts ./apps/api/scripts
|
|
83
|
-
WORKDIR /app/apps/api
|
|
84
|
-
USER 100:101
|
|
85
|
-
EXPOSE 3000
|
|
86
|
-
HEALTHCHECK --interval=10s --timeout=5s --start-period=30s --retries=6 \
|
|
87
|
-
CMD node -e "fetch('http://127.0.0.1:3000/health/ready').then((r) => process.exit(r.ok ? 0 : 1)).catch(() => process.exit(1))"
|
|
88
|
-
CMD ["node", "dist/main"]
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "{{projectName}}-api",
|
|
3
|
-
"version": "0.0.0",
|
|
4
|
-
"private": true,
|
|
5
|
-
"scripts": {
|
|
6
|
-
"dev": "nest start --watch --builder swc",
|
|
7
|
-
"build": "nest build",
|
|
8
|
-
"start": "node dist/main",
|
|
9
|
-
"lint": "tsc -p tsconfig.json --noEmit",
|
|
10
|
-
"test": "jest --passWithNoTests",
|
|
11
|
-
"migrate:all": "node dist/database/migrate",
|
|
12
|
-
"typeorm": "typeorm-ts-node-commonjs -d src/database/data-source.ts",
|
|
13
|
-
"migration:run": "npm run typeorm -- migration:run",
|
|
14
|
-
"migration:revert": "npm run typeorm -- migration:revert",
|
|
15
|
-
"migration:generate": "npm run typeorm -- migration:generate"
|
|
16
|
-
},
|
|
17
|
-
"dependencies": {
|
|
18
|
-
"@podosoft/podokit-contracts": "^0.4.0",
|
|
19
|
-
"@nestjs/common": "^11.1.27",
|
|
20
|
-
"@nestjs/config": "^4.0.4",
|
|
21
|
-
"@nestjs/core": "^11.1.27",
|
|
22
|
-
"@nestjs/platform-express": "^11.1.27",
|
|
23
|
-
"@nestjs/swagger": "^11.4.5",
|
|
24
|
-
"@nestjs/typeorm": "^11.0.3",
|
|
25
|
-
"class-transformer": "^0.5.1",
|
|
26
|
-
"class-validator": "^0.14.1",
|
|
27
|
-
"dotenv": "^16.4.5",
|
|
28
|
-
"pg": "^8.12.0",
|
|
29
|
-
"reflect-metadata": "^0.2.2",
|
|
30
|
-
"rxjs": "^7.8.1",
|
|
31
|
-
"typeorm": "^0.3.20",
|
|
32
|
-
"zod": "^3.23.8"
|
|
33
|
-
},
|
|
34
|
-
"devDependencies": {
|
|
35
|
-
"@nestjs/cli": "^11.0.23",
|
|
36
|
-
"@nestjs/testing": "^11.1.27",
|
|
37
|
-
"@types/express": "^5.0.1",
|
|
38
|
-
"@types/node": "^20.17.0",
|
|
39
|
-
"@types/supertest": "^6.0.2",
|
|
40
|
-
"jest": "^29.7.0",
|
|
41
|
-
"supertest": "^7.0.0",
|
|
42
|
-
"ts-jest": "^29.2.5",
|
|
43
|
-
"ts-node": "^10.9.2",
|
|
44
|
-
"typescript": "^6.0.3",
|
|
45
|
-
"@swc/core": "^1.7.0",
|
|
46
|
-
"@swc/cli": "^0.4.0"
|
|
47
|
-
},
|
|
48
|
-
"jest": {
|
|
49
|
-
"moduleFileExtensions": [
|
|
50
|
-
"js",
|
|
51
|
-
"json",
|
|
52
|
-
"ts"
|
|
53
|
-
],
|
|
54
|
-
"rootDir": "src",
|
|
55
|
-
"testRegex": ".*\\.spec\\.ts$",
|
|
56
|
-
"transform": {
|
|
57
|
-
"^.+\\.ts$": [
|
|
58
|
-
"ts-jest",
|
|
59
|
-
{
|
|
60
|
-
"tsconfig": "tsconfig.json"
|
|
61
|
-
}
|
|
62
|
-
]
|
|
63
|
-
},
|
|
64
|
-
"testEnvironment": "node"
|
|
65
|
-
}
|
|
66
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import type { DynamicModule, Provider, Type } from "@nestjs/common";
|
|
2
|
-
|
|
3
|
-
// Owned extension slot for the Nest app. This file is yours — PodoKit never
|
|
4
|
-
// writes to it, so `podo update` leaves it alone. Use it to add your own modules
|
|
5
|
-
// or providers, or to override a PodoKit-provided provider without editing
|
|
6
|
-
// managed code. Because these are spread in *after* the module-wired providers,
|
|
7
|
-
// an override here takes precedence.
|
|
8
|
-
//
|
|
9
|
-
// Example — swap the mailer transport for your own implementation:
|
|
10
|
-
// import { Mailer } from "./mailer/mailer";
|
|
11
|
-
// import { MyMailer } from "./my-mailer";
|
|
12
|
-
// export const extensionProviders: Provider[] = [
|
|
13
|
-
// { provide: Mailer, useClass: MyMailer },
|
|
14
|
-
// ];
|
|
15
|
-
|
|
16
|
-
/** Extra modules to import into AppModule (or DynamicModule overrides). */
|
|
17
|
-
export const extensionImports: (Type | DynamicModule)[] = [];
|
|
18
|
-
|
|
19
|
-
/** Extra or overriding providers for AppModule. Same-token providers listed here
|
|
20
|
-
* win over the ones PodoKit modules registered. */
|
|
21
|
-
export const extensionProviders: Provider[] = [];
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { Module } from "@nestjs/common";
|
|
2
|
-
import { ConfigModule } from "@nestjs/config";
|
|
3
|
-
import { TypeOrmModule } from "@nestjs/typeorm";
|
|
4
|
-
import { validateEnv } from "./config/env.validation";
|
|
5
|
-
import { dataSourceOptions } from "./database/data-source";
|
|
6
|
-
import { HealthModule } from "./health/health.module";
|
|
7
|
-
import { extensionImports, extensionProviders } from "./app.extensions";
|
|
8
|
-
// podokit:begin:imports
|
|
9
|
-
// podokit:end:imports
|
|
10
|
-
|
|
11
|
-
@Module({
|
|
12
|
-
imports: [
|
|
13
|
-
ConfigModule.forRoot({ isGlobal: true, validate: validateEnv }),
|
|
14
|
-
TypeOrmModule.forRoot(dataSourceOptions),
|
|
15
|
-
HealthModule,
|
|
16
|
-
// podokit:begin:module-imports
|
|
17
|
-
// podokit:end:module-imports
|
|
18
|
-
...extensionImports,
|
|
19
|
-
],
|
|
20
|
-
providers: [
|
|
21
|
-
// podokit:begin:providers
|
|
22
|
-
// podokit:end:providers
|
|
23
|
-
...extensionProviders,
|
|
24
|
-
],
|
|
25
|
-
})
|
|
26
|
-
export class AppModule {}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { ArgumentsHost, Catch, ExceptionFilter, HttpException, HttpStatus } from "@nestjs/common";
|
|
2
|
-
import type { Request, Response } from "express";
|
|
3
|
-
import { AppException } from "./app-exception";
|
|
4
|
-
|
|
5
|
-
interface ErrorBody {
|
|
6
|
-
success: false;
|
|
7
|
-
error: {
|
|
8
|
-
code: string;
|
|
9
|
-
message: string;
|
|
10
|
-
statusCode: number;
|
|
11
|
-
path: string;
|
|
12
|
-
timestamp: string;
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
@Catch()
|
|
17
|
-
export class AllExceptionsFilter implements ExceptionFilter {
|
|
18
|
-
catch(exception: unknown, host: ArgumentsHost): void {
|
|
19
|
-
const ctx = host.switchToHttp();
|
|
20
|
-
const response = ctx.getResponse<Response>();
|
|
21
|
-
const request = ctx.getRequest<Request>();
|
|
22
|
-
|
|
23
|
-
let statusCode = HttpStatus.INTERNAL_SERVER_ERROR;
|
|
24
|
-
let code = "INTERNAL_ERROR";
|
|
25
|
-
let message = "Internal server error";
|
|
26
|
-
|
|
27
|
-
if (exception instanceof AppException) {
|
|
28
|
-
statusCode = exception.statusCode;
|
|
29
|
-
code = exception.code;
|
|
30
|
-
message = exception.message;
|
|
31
|
-
} else if (exception instanceof HttpException) {
|
|
32
|
-
statusCode = exception.getStatus();
|
|
33
|
-
code = "HTTP_ERROR";
|
|
34
|
-
message = exception.message;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
const body: ErrorBody = {
|
|
38
|
-
success: false,
|
|
39
|
-
error: { code, message, statusCode, path: request.url, timestamp: new Date().toISOString() },
|
|
40
|
-
};
|
|
41
|
-
response.status(statusCode).json(body);
|
|
42
|
-
}
|
|
43
|
-
}
|