@podosoft/podokit 0.17.4 → 1.0.1
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 +1 -1
- package/dist/deploy-compose-render.js +6 -3
- 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 +23 -8
- 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 +16 -11
- 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 +13 -0
- package/dist/toolchain.js +44 -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
|
@@ -23,14 +23,11 @@ const HEALTH_POLL_INTERVAL_MS = 2_000;
|
|
|
23
23
|
* What the images ship outside their dependency tree.
|
|
24
24
|
*
|
|
25
25
|
* Every entry mirrors a `COPY --from=build` line in the generated Dockerfiles, which
|
|
26
|
-
* is what makes the copy equivalent to a rebuild for code-only changes.
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
* `build/` would leave a stale entry running new routes.
|
|
32
|
-
* - `packages/*` are copied as real directories rather than the symlinks npm leaves
|
|
33
|
-
* behind, so their `dist/` is a separate destination from the apps'.
|
|
26
|
+
* is what makes the copy equivalent to a rebuild for code-only changes. The web
|
|
27
|
+
* image is different from the API image: the official Bun adapter bundles the web
|
|
28
|
+
* application and its workspace dependencies into `apps/web/build`, so that one
|
|
29
|
+
* directory is the complete web payload. API and worker processes still load
|
|
30
|
+
* workspace package output separately.
|
|
34
31
|
*
|
|
35
32
|
* `node_modules` is deliberately absent: the image installs a production-only,
|
|
36
33
|
* workspace-scoped tree for its own platform, and a developer's tree is neither.
|
|
@@ -47,14 +44,12 @@ function composeSyncArtifacts(projectRoot) {
|
|
|
47
44
|
for (const entry of (0, node_fs_1.readdirSync)(packagesDir).sort()) {
|
|
48
45
|
if (!(0, node_fs_1.existsSync)((0, node_path_1.join)(packagesDir, entry, "package.json")))
|
|
49
46
|
continue;
|
|
50
|
-
push(`packages/${entry}/dist`, `/app/packages/${entry}/dist`, "directory", ["api", "
|
|
47
|
+
push(`packages/${entry}/dist`, `/app/packages/${entry}/dist`, "directory", ["api", "worker"]);
|
|
51
48
|
}
|
|
52
49
|
}
|
|
53
50
|
push("apps/api/dist", "/app/apps/api/dist", "directory", ["api", "worker"]);
|
|
54
51
|
push("apps/api/scripts", "/app/apps/api/scripts", "directory", ["api", "worker"]);
|
|
55
52
|
push("apps/web/build", "/app/apps/web/build", "directory", ["web"]);
|
|
56
|
-
push("apps/web/server.js", "/app/apps/web/server.js", "file", ["web"]);
|
|
57
|
-
push("apps/web/src/lib/server", "/app/apps/web/src/lib/server", "directory", ["web"]);
|
|
58
53
|
return artifacts;
|
|
59
54
|
}
|
|
60
55
|
/** The excludes that fall inside one artifact, as paths relative to it. */
|
|
@@ -67,12 +62,11 @@ function excludesWithin(artifact, excludes) {
|
|
|
67
62
|
/**
|
|
68
63
|
* Whether the image's dependency tree can still run this code.
|
|
69
64
|
*
|
|
70
|
-
* Only the runtime dependency sets matter
|
|
71
|
-
* declare and nothing else, so a change
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
* the
|
|
75
|
-
* takes part.
|
|
65
|
+
* Only the runtime dependency sets matter for API and worker images: their package
|
|
66
|
+
* manager installed what these manifests declare and nothing else, so a change can
|
|
67
|
+
* leave the container without a package the new code imports. The web image has no
|
|
68
|
+
* runtime dependency tree; the official Bun adapter includes those dependencies in
|
|
69
|
+
* the synced build instead. `devDependencies` and package versions do not take part.
|
|
76
70
|
*/
|
|
77
71
|
function runtimeDependenciesOf(manifest) {
|
|
78
72
|
return JSON.stringify({
|
|
@@ -83,9 +77,10 @@ function runtimeDependenciesOf(manifest) {
|
|
|
83
77
|
}
|
|
84
78
|
/** The manifests whose runtime dependencies a role's container was built from. */
|
|
85
79
|
function manifestPathsFor(projectRoot, role) {
|
|
86
|
-
|
|
80
|
+
if (role === "web")
|
|
81
|
+
return [];
|
|
87
82
|
const pairs = [
|
|
88
|
-
[(0, node_path_1.join)(projectRoot, "apps",
|
|
83
|
+
[(0, node_path_1.join)(projectRoot, "apps", "api", "package.json"), "/app/apps/api/package.json"],
|
|
89
84
|
];
|
|
90
85
|
const packagesDir = (0, node_path_1.join)(projectRoot, "packages");
|
|
91
86
|
if ((0, node_fs_1.existsSync)(packagesDir)) {
|
|
@@ -165,19 +160,23 @@ function planComposeSync(projectRoot, profileName, runner = deploy_compose_exec_
|
|
|
165
160
|
*/
|
|
166
161
|
function buildArtifacts(projectRoot, runner) {
|
|
167
162
|
const manifest = (0, lockfile_1.readManifest)(projectRoot);
|
|
168
|
-
const pm = manifest?.packageManager ?? "npm";
|
|
163
|
+
const pm = manifest?.toolchain.packageManager ?? "npm";
|
|
169
164
|
const packagesDir = (0, node_path_1.join)(projectRoot, "packages");
|
|
170
165
|
if ((0, node_fs_1.existsSync)(packagesDir)) {
|
|
171
166
|
for (const entry of (0, node_fs_1.readdirSync)(packagesDir).sort()) {
|
|
172
167
|
if (!(0, node_fs_1.existsSync)((0, node_path_1.join)(packagesDir, entry, "package.json")))
|
|
173
168
|
continue;
|
|
174
|
-
(0, deploy_compose_exec_1.checked)(runner, pm,
|
|
169
|
+
(0, deploy_compose_exec_1.checked)(runner, pm, pm === "bun"
|
|
170
|
+
? ["run", "--cwd", `packages/${entry}`, "--if-present", "build"]
|
|
171
|
+
: ["run", "build", "--if-present", "--workspace", `packages/${entry}`], false);
|
|
175
172
|
}
|
|
176
173
|
}
|
|
177
174
|
for (const app of ["api", "web"]) {
|
|
178
175
|
if (!(0, node_fs_1.existsSync)((0, node_path_1.join)(projectRoot, "apps", app, "package.json")))
|
|
179
176
|
continue;
|
|
180
|
-
(0, deploy_compose_exec_1.checked)(runner, pm,
|
|
177
|
+
(0, deploy_compose_exec_1.checked)(runner, pm, pm === "bun"
|
|
178
|
+
? ["run", "--cwd", `apps/${app}`, "--if-present", "build"]
|
|
179
|
+
: ["run", "build", "--if-present", "--workspace", `apps/${app}`], false);
|
|
181
180
|
}
|
|
182
181
|
}
|
|
183
182
|
function assertNoManifestDrift(projectRoot, profile, targets, runner) {
|
package/dist/deploy-compose.js
CHANGED
|
@@ -17,6 +17,8 @@ const deploy_compose_sync_1 = require("./deploy-compose-sync");
|
|
|
17
17
|
const deploy_compose_profile_1 = require("./deploy-compose-profile");
|
|
18
18
|
const deploy_compose_render_1 = require("./deploy-compose-render");
|
|
19
19
|
const deploy_driver_2 = require("./deploy-driver");
|
|
20
|
+
const lockfile_1 = require("./lockfile");
|
|
21
|
+
const toolchain_1 = require("./toolchain");
|
|
20
22
|
/** How many rollback targets the ledger keeps. */
|
|
21
23
|
const LEDGER_DEPTH = 10;
|
|
22
24
|
function digest(parts) {
|
|
@@ -364,7 +366,8 @@ function planComposeDeployment(projectRoot, profileName, release, runner = deplo
|
|
|
364
366
|
actions.push({
|
|
365
367
|
order: order++,
|
|
366
368
|
kind: "migration",
|
|
367
|
-
description: `Run ${(profile.migration?.command ??
|
|
369
|
+
description: `Run ${(profile.migration?.command ??
|
|
370
|
+
(0, toolchain_1.toolchainMigrationCommand)((0, lockfile_1.readManifest)(projectRoot)?.toolchain ?? (0, toolchain_1.resolveToolchain)())).join(" ")} using ${images.api}.`,
|
|
368
371
|
});
|
|
369
372
|
actions.push({
|
|
370
373
|
order: order++,
|
package/dist/deploy-profile.d.ts
CHANGED
package/dist/deploy-profile.js
CHANGED
|
@@ -11,6 +11,7 @@ const node_fs_1 = require("node:fs");
|
|
|
11
11
|
const node_path_1 = require("node:path");
|
|
12
12
|
const lockfile_1 = require("./lockfile");
|
|
13
13
|
const deploy_schema_1 = require("./deploy-schema");
|
|
14
|
+
const websocket_paths_1 = require("./websocket-paths");
|
|
14
15
|
var deploy_schema_2 = require("./deploy-schema");
|
|
15
16
|
Object.defineProperty(exports, "profileDirectory", { enumerable: true, get: function () { return deploy_schema_2.profileDirectory; } });
|
|
16
17
|
Object.defineProperty(exports, "profilePath", { enumerable: true, get: function () { return deploy_schema_2.profilePath; } });
|
|
@@ -116,7 +117,7 @@ function parseProfile(value) {
|
|
|
116
117
|
const runtimeConfig = (0, deploy_schema_1.requiredRecord)(value, "runtimeConfig");
|
|
117
118
|
(0, deploy_schema_1.assertOnlyKeys)(target, ["context", "clusterFingerprint", "namespace", "release", "createNamespace"], "target");
|
|
118
119
|
(0, deploy_schema_1.assertOnlyKeys)(release, ["strategy", "tagPattern", "apiRepository", "webRepository"], "release");
|
|
119
|
-
(0, deploy_schema_1.assertOnlyKeys)(exposure, ["mode", "host", "ingressClassName", "tlsSecretName"], "exposure");
|
|
120
|
+
(0, deploy_schema_1.assertOnlyKeys)(exposure, ["mode", "host", "ingressClassName", "tlsSecretName", "webSocketPaths"], "exposure");
|
|
120
121
|
(0, deploy_schema_1.assertOnlyKeys)(workloads, ["api", "web", "worker"], "workloads");
|
|
121
122
|
(0, deploy_schema_1.assertOnlyKeys)(dependencies, ["postgres", "redis", "objectStorage"], "dependencies");
|
|
122
123
|
(0, deploy_schema_1.assertOnlyKeys)(secrets, ["api", "web", "imagePull"], "secrets");
|
|
@@ -162,6 +163,10 @@ function parseProfile(value) {
|
|
|
162
163
|
const tlsSecretName = (0, deploy_schema_1.optionalString)(exposure, "tlsSecretName");
|
|
163
164
|
if (tlsSecretName)
|
|
164
165
|
(0, deploy_schema_1.validateDnsSubdomain)(tlsSecretName, "exposure.tlsSecretName");
|
|
166
|
+
const webSocketPaths = (0, websocket_paths_1.parseExactWebSocketPaths)(exposure.webSocketPaths ?? [], "exposure.webSocketPaths");
|
|
167
|
+
if (exposureMode === "nodePort" && webSocketPaths.length > 0) {
|
|
168
|
+
throw new Error("Deployment exposure.webSocketPaths requires exposure.mode ingress.");
|
|
169
|
+
}
|
|
165
170
|
const postgres = parseStatefulDependency((0, deploy_schema_1.requiredRecord)(dependencies, "postgres"), "dependencies.postgres");
|
|
166
171
|
const redis = parseRedisDependency((0, deploy_schema_1.requiredRecord)(dependencies, "redis"), "dependencies.redis");
|
|
167
172
|
const objectStorageRecord = (0, deploy_schema_1.requiredRecord)(dependencies, "objectStorage");
|
|
@@ -204,6 +209,7 @@ function parseProfile(value) {
|
|
|
204
209
|
host,
|
|
205
210
|
ingressClassName,
|
|
206
211
|
tlsSecretName,
|
|
212
|
+
webSocketPaths,
|
|
207
213
|
},
|
|
208
214
|
workloads: {
|
|
209
215
|
api: parseWorkload((0, deploy_schema_1.requiredRecord)(workloads, "api"), "workloads.api"),
|
|
@@ -301,6 +307,7 @@ function initializeDeploymentProfile(projectRoot, name, options) {
|
|
|
301
307
|
host,
|
|
302
308
|
ingressClassName: "traefik",
|
|
303
309
|
tlsSecretName: null,
|
|
310
|
+
webSocketPaths: [],
|
|
304
311
|
},
|
|
305
312
|
workloads: {
|
|
306
313
|
api: {
|
|
@@ -376,6 +383,7 @@ function initializeDeploymentProfile(projectRoot, name, options) {
|
|
|
376
383
|
...(modules.has("rate-limit")
|
|
377
384
|
? {
|
|
378
385
|
RATE_LIMIT_TTL: "60",
|
|
386
|
+
RATE_LIMIT_KEY_PREFIX: "podokit:rate-limit",
|
|
379
387
|
RATE_LIMIT_MAX: "300",
|
|
380
388
|
RATE_LIMIT_AUTH_TTL: "60",
|
|
381
389
|
RATE_LIMIT_AUTH_MAX: "20",
|
package/dist/deploy-render.js
CHANGED
|
@@ -5,6 +5,8 @@ const node_fs_1 = require("node:fs");
|
|
|
5
5
|
const node_crypto_1 = require("node:crypto");
|
|
6
6
|
const node_path_1 = require("node:path");
|
|
7
7
|
const deploy_profile_1 = require("./deploy-profile");
|
|
8
|
+
const lockfile_1 = require("./lockfile");
|
|
9
|
+
const toolchain_1 = require("./toolchain");
|
|
8
10
|
function quote(value) {
|
|
9
11
|
return JSON.stringify(value);
|
|
10
12
|
}
|
|
@@ -351,6 +353,8 @@ function derivedRuntimeConfig(profile) {
|
|
|
351
353
|
const result = {
|
|
352
354
|
PORT: "3000",
|
|
353
355
|
BACKEND_INTERNAL_URL: `http://${profile.target.release}-api:3000`,
|
|
356
|
+
PROTOCOL_HEADER: "x-forwarded-proto",
|
|
357
|
+
HOST_HEADER: "x-forwarded-host",
|
|
354
358
|
...profile.runtimeConfig,
|
|
355
359
|
};
|
|
356
360
|
if (profile.dependencies.postgres.mode === "inCluster") {
|
|
@@ -517,16 +521,17 @@ spec:
|
|
|
517
521
|
`;
|
|
518
522
|
}
|
|
519
523
|
function exposure(profile) {
|
|
520
|
-
const
|
|
524
|
+
const webService = `${profile.target.release}-web`;
|
|
525
|
+
const apiService = `${profile.target.release}-api`;
|
|
521
526
|
if (profile.exposure.mode === "nodePort") {
|
|
522
527
|
return `apiVersion: v1
|
|
523
528
|
kind: Service
|
|
524
529
|
metadata:
|
|
525
|
-
name: ${
|
|
530
|
+
name: ${webService}-public
|
|
526
531
|
spec:
|
|
527
532
|
type: NodePort
|
|
528
533
|
selector:
|
|
529
|
-
app.kubernetes.io/name: ${
|
|
534
|
+
app.kubernetes.io/name: ${webService}
|
|
530
535
|
ports:
|
|
531
536
|
- { name: http, port: 80, targetPort: 3000 }
|
|
532
537
|
`;
|
|
@@ -537,6 +542,15 @@ spec:
|
|
|
537
542
|
secretName: ${quote(profile.exposure.tlsSecretName)}
|
|
538
543
|
`
|
|
539
544
|
: "";
|
|
545
|
+
const webSocketPaths = profile.exposure.webSocketPaths
|
|
546
|
+
.map((path) => ` - path: ${quote(path)}
|
|
547
|
+
pathType: Exact
|
|
548
|
+
backend:
|
|
549
|
+
service:
|
|
550
|
+
name: ${apiService}
|
|
551
|
+
port: { number: 3000 }
|
|
552
|
+
`)
|
|
553
|
+
.join("");
|
|
540
554
|
return `apiVersion: networking.k8s.io/v1
|
|
541
555
|
kind: Ingress
|
|
542
556
|
metadata:
|
|
@@ -547,11 +561,11 @@ ${tls} rules:
|
|
|
547
561
|
- host: ${quote(profile.exposure.host)}
|
|
548
562
|
http:
|
|
549
563
|
paths:
|
|
550
|
-
- path: /
|
|
564
|
+
${webSocketPaths} - path: /
|
|
551
565
|
pathType: Prefix
|
|
552
566
|
backend:
|
|
553
567
|
service:
|
|
554
|
-
name: ${
|
|
568
|
+
name: ${webService}
|
|
555
569
|
port: { number: 3000 }
|
|
556
570
|
`;
|
|
557
571
|
}
|
|
@@ -577,9 +591,9 @@ function migrationRuntimeEnv(profile) {
|
|
|
577
591
|
value: ${quote(value)}`)
|
|
578
592
|
.join("\n");
|
|
579
593
|
}
|
|
580
|
-
function migrationManifest(profile, release, images) {
|
|
594
|
+
function migrationManifest(profile, release, images, defaultCommand) {
|
|
581
595
|
const releaseSlug = release.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
582
|
-
const command = profile.migration?.command ??
|
|
596
|
+
const command = profile.migration?.command ?? defaultCommand;
|
|
583
597
|
return `apiVersion: batch/v1
|
|
584
598
|
kind: Job
|
|
585
599
|
metadata:
|
|
@@ -646,7 +660,8 @@ function renderDeployment(projectRoot, profileName, profile, release, resolvedIm
|
|
|
646
660
|
const effectiveRolloutStateDigest = rolloutStateDigest ?? offlineRolloutStateDigest(profile);
|
|
647
661
|
const dependencies = dependencyManifest(profile, images, effectiveRolloutStateDigest);
|
|
648
662
|
const application = applicationManifest(profile, images, effectiveRolloutStateDigest);
|
|
649
|
-
const
|
|
663
|
+
const toolchain = (0, lockfile_1.readManifest)(projectRoot)?.toolchain ?? (0, toolchain_1.resolveToolchain)();
|
|
664
|
+
const migration = migrationManifest(profile, release, images, (0, toolchain_1.toolchainMigrationCommand)(toolchain));
|
|
650
665
|
chart(dependencyChart, "podokit-dependencies", dependencies);
|
|
651
666
|
chart(applicationChart, "podokit-application", application);
|
|
652
667
|
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(root, "migration.yaml"), migration);
|
package/dist/deploy-schema.js
CHANGED
|
@@ -29,7 +29,12 @@ const IMAGE_TAG = /^[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}$/;
|
|
|
29
29
|
exports.SENSITIVE_KEY = /(password|passphrase|secret|token|private.?key|credential|access.?key|api.?keys?|signing.?key|encryption.?key)/i;
|
|
30
30
|
exports.STABLE_SEMVER_TAG_PATTERN = "^v(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)$";
|
|
31
31
|
/** Keys PodoKit derives itself, so a profile may not set them. */
|
|
32
|
-
exports.MANAGED_RUNTIME_CONFIG_KEYS = [
|
|
32
|
+
exports.MANAGED_RUNTIME_CONFIG_KEYS = [
|
|
33
|
+
"PORT",
|
|
34
|
+
"BACKEND_INTERNAL_URL",
|
|
35
|
+
"PROTOCOL_HEADER",
|
|
36
|
+
"HOST_HEADER",
|
|
37
|
+
];
|
|
33
38
|
function containsUrlCredentials(value) {
|
|
34
39
|
if (!value.includes("://"))
|
|
35
40
|
return false;
|
package/dist/dev.d.ts
CHANGED
package/dist/dev.js
CHANGED
|
@@ -12,9 +12,12 @@ const node_fs_1 = require("node:fs");
|
|
|
12
12
|
const node_os_1 = require("node:os");
|
|
13
13
|
const node_path_1 = require("node:path");
|
|
14
14
|
const lockfile_1 = require("./lockfile");
|
|
15
|
+
const websocket_paths_1 = require("./websocket-paths");
|
|
15
16
|
const GATEWAY_CONTAINER = "podokit-dev-gateway";
|
|
16
17
|
const GATEWAY_IMAGE = "traefik:v3.5";
|
|
17
18
|
const GATEWAY_LABEL = "io.podosoft.podokit.dev-gateway";
|
|
19
|
+
const GATEWAY_VERSION = "2";
|
|
20
|
+
const GATEWAY_VERSION_LABEL = "io.podosoft.podokit.dev-gateway.version";
|
|
18
21
|
const GATEWAY_NETWORK = "podokit-dev-gateway";
|
|
19
22
|
const RUNTIME_COMPOSE = ".podokit/runtime/dev.compose.yaml";
|
|
20
23
|
const DEV_CONFIG = ".podokit/dev.json";
|
|
@@ -59,7 +62,12 @@ function validatePublicUrl(publicUrl) {
|
|
|
59
62
|
catch {
|
|
60
63
|
throw new Error(`Invalid publicUrl "${publicUrl}". Use an absolute HTTPS URL.`);
|
|
61
64
|
}
|
|
62
|
-
if (parsed.protocol !== "https:" ||
|
|
65
|
+
if (parsed.protocol !== "https:" ||
|
|
66
|
+
parsed.username ||
|
|
67
|
+
parsed.password ||
|
|
68
|
+
parsed.pathname !== "/" ||
|
|
69
|
+
parsed.search ||
|
|
70
|
+
parsed.hash) {
|
|
63
71
|
throw new Error(`Invalid publicUrl "${publicUrl}". Use an HTTPS origin without a path.`);
|
|
64
72
|
}
|
|
65
73
|
}
|
|
@@ -73,14 +81,17 @@ function readDevConfig(projectRoot) {
|
|
|
73
81
|
throw new Error("PodoKit manifest is missing answers.projectName.");
|
|
74
82
|
const config = (0, node_fs_1.existsSync)(path)
|
|
75
83
|
? parseJson(path)
|
|
76
|
-
: { schemaVersion: 1, hostname: `${fallbackName}.localhost
|
|
84
|
+
: { schemaVersion: 1, hostname: `${fallbackName}.localhost`, webSocketPaths: [] };
|
|
77
85
|
if (config.schemaVersion !== 1) {
|
|
78
86
|
throw new Error(`Unsupported ${DEV_CONFIG} schemaVersion: ${String(config.schemaVersion)}`);
|
|
79
87
|
}
|
|
80
88
|
validateHostname(config.hostname);
|
|
81
89
|
if (config.publicUrl)
|
|
82
90
|
validatePublicUrl(config.publicUrl);
|
|
83
|
-
return
|
|
91
|
+
return {
|
|
92
|
+
...config,
|
|
93
|
+
webSocketPaths: (0, websocket_paths_1.parseExactWebSocketPaths)(config.webSocketPaths ?? [], `${DEV_CONFIG}.webSocketPaths`),
|
|
94
|
+
};
|
|
84
95
|
}
|
|
85
96
|
function stableId(projectRoot) {
|
|
86
97
|
return (0, node_crypto_1.createHash)("sha256").update(projectRoot).digest("hex").slice(0, 10);
|
|
@@ -113,11 +124,23 @@ function installedDevProfiles(projectRoot) {
|
|
|
113
124
|
];
|
|
114
125
|
}
|
|
115
126
|
function renderRuntimeCompose(runtime) {
|
|
116
|
-
|
|
127
|
+
const api = runtime.config.webSocketPaths.length
|
|
128
|
+
? ` api:\n networks:\n ${GATEWAY_NETWORK}:\n aliases: [${runtime.alias}-api]\n`
|
|
129
|
+
: "";
|
|
130
|
+
return `# Generated by podo dev. Do not edit.\nservices:\n traefik:\n profiles: [podokit-legacy-proxy]\n web:\n networks:\n ${GATEWAY_NETWORK}:\n aliases: [${runtime.alias}]\n${api}networks:\n ${GATEWAY_NETWORK}:\n external: true\n name: ${GATEWAY_NETWORK}\n`;
|
|
117
131
|
}
|
|
118
132
|
function renderRoute(runtime) {
|
|
119
133
|
const { alias, config, routeId } = runtime;
|
|
120
|
-
|
|
134
|
+
const hosts = routeHosts(config);
|
|
135
|
+
const hostRule = hosts.map((host) => `Host(\`${host}\`)`).join(" || ");
|
|
136
|
+
const webSocketHostRule = hosts.length > 1 ? `(${hostRule})` : hostRule;
|
|
137
|
+
const webSocketRouter = config.webSocketPaths.length
|
|
138
|
+
? ` ${routeId}-websocket:\n entryPoints: [web]\n rule: ${webSocketHostRule} && Path(${config.webSocketPaths.map((path) => `\`${path}\``).join(", ")})\n priority: 100\n service: ${routeId}-api\n`
|
|
139
|
+
: "";
|
|
140
|
+
const apiService = config.webSocketPaths.length
|
|
141
|
+
? ` ${routeId}-api:\n loadBalancer:\n servers:\n - url: http://${alias}-api:5002\n`
|
|
142
|
+
: "";
|
|
143
|
+
return `http:\n routers:\n${webSocketRouter} ${routeId}:\n entryPoints: [web]\n rule: ${hostRule}\n service: ${routeId}\n middlewares: [${routeId}-compression]\n services:\n${apiService} ${routeId}:\n loadBalancer:\n servers:\n - url: http://${alias}:5001\n middlewares:\n ${routeId}-compression:\n compress: {}\n`;
|
|
121
144
|
}
|
|
122
145
|
function devHome() {
|
|
123
146
|
return process.env.PODOKIT_DEV_HOME ?? (0, node_path_1.join)((0, node_os_1.homedir)(), ".podokit", "dev-gateway");
|
|
@@ -134,6 +157,14 @@ function registryPath(runtime) {
|
|
|
134
157
|
function routePath(runtime) {
|
|
135
158
|
return (0, node_path_1.join)(routesDirectory(), `${runtime.routeId}.yml`);
|
|
136
159
|
}
|
|
160
|
+
function routeHosts(config) {
|
|
161
|
+
return [
|
|
162
|
+
...new Set([
|
|
163
|
+
config.hostname,
|
|
164
|
+
...(config.publicUrl ? [new URL(config.publicUrl).hostname] : []),
|
|
165
|
+
]),
|
|
166
|
+
];
|
|
167
|
+
}
|
|
137
168
|
function activeEntries() {
|
|
138
169
|
const dir = registryDirectory();
|
|
139
170
|
if (!(0, node_fs_1.existsSync)(dir))
|
|
@@ -157,9 +188,12 @@ function writeRuntimeFiles(runtime) {
|
|
|
157
188
|
}
|
|
158
189
|
function registerRoute(runtime) {
|
|
159
190
|
const entries = activeEntries();
|
|
160
|
-
const
|
|
191
|
+
const requestedHosts = new Set(routeHosts(runtime.config));
|
|
192
|
+
const collision = entries.find((entry) => entry.projectRoot !== runtime.projectRoot &&
|
|
193
|
+
routeHosts(entry).some((hostname) => requestedHosts.has(hostname)));
|
|
161
194
|
if (collision) {
|
|
162
|
-
|
|
195
|
+
const duplicate = routeHosts(collision).find((hostname) => requestedHosts.has(hostname));
|
|
196
|
+
throw new Error(`Development host ${duplicate ?? runtime.config.hostname} is already registered by ${collision.projectRoot}. Change .podokit/dev.json or run podo dev down there.`);
|
|
163
197
|
}
|
|
164
198
|
for (const stale of entries.filter((entry) => entry.projectRoot === runtime.projectRoot && entry.routeId !== runtime.routeId)) {
|
|
165
199
|
(0, node_fs_1.rmSync)((0, node_path_1.join)(registryDirectory(), `${stale.routeId}.json`), { force: true });
|
|
@@ -170,6 +204,7 @@ function registerRoute(runtime) {
|
|
|
170
204
|
(0, node_fs_1.writeFileSync)(routePath(runtime), renderRoute(runtime));
|
|
171
205
|
const entry = {
|
|
172
206
|
hostname: runtime.config.hostname,
|
|
207
|
+
...(runtime.config.publicUrl ? { publicUrl: runtime.config.publicUrl } : {}),
|
|
173
208
|
projectRoot: runtime.projectRoot,
|
|
174
209
|
routeId: runtime.routeId,
|
|
175
210
|
};
|
|
@@ -198,19 +233,30 @@ function ensureNetwork(runner) {
|
|
|
198
233
|
}
|
|
199
234
|
}
|
|
200
235
|
function ensureGateway(runner) {
|
|
201
|
-
const inspect = runner("docker", [
|
|
236
|
+
const inspect = runner("docker", [
|
|
237
|
+
"inspect",
|
|
238
|
+
"--format",
|
|
239
|
+
`{{ index .Config.Labels \"${GATEWAY_LABEL}\" }} {{.State.Running}} {{ index .Config.Labels \"${GATEWAY_VERSION_LABEL}\" }}`,
|
|
240
|
+
GATEWAY_CONTAINER,
|
|
241
|
+
], { capture: true });
|
|
202
242
|
if (commandSucceeded(inspect)) {
|
|
203
|
-
const [label, running] = inspect.stdout.trim().split(/\s+/);
|
|
243
|
+
const [label, running, version] = inspect.stdout.trim().split(/\s+/);
|
|
204
244
|
if (label !== "1") {
|
|
205
245
|
throw new Error(`Container ${GATEWAY_CONTAINER} exists but is not managed by PodoKit.`);
|
|
206
246
|
}
|
|
207
|
-
if (
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
247
|
+
if (version === GATEWAY_VERSION) {
|
|
248
|
+
if (running !== "true") {
|
|
249
|
+
const start = runner("docker", ["start", GATEWAY_CONTAINER], { capture: true });
|
|
250
|
+
if (!commandSucceeded(start)) {
|
|
251
|
+
throw new Error(`Cannot start ${GATEWAY_CONTAINER}: ${start.stderr.trim()}`);
|
|
252
|
+
}
|
|
211
253
|
}
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
const remove = runner("docker", ["rm", "--force", GATEWAY_CONTAINER], { capture: true });
|
|
257
|
+
if (!commandSucceeded(remove)) {
|
|
258
|
+
throw new Error(`Cannot upgrade ${GATEWAY_CONTAINER}: ${remove.stderr.trim()}`);
|
|
212
259
|
}
|
|
213
|
-
return;
|
|
214
260
|
}
|
|
215
261
|
(0, node_fs_1.mkdirSync)(routesDirectory(), { recursive: true });
|
|
216
262
|
const run = runner("docker", [
|
|
@@ -220,6 +266,8 @@ function ensureGateway(runner) {
|
|
|
220
266
|
GATEWAY_CONTAINER,
|
|
221
267
|
"--label",
|
|
222
268
|
`${GATEWAY_LABEL}=1`,
|
|
269
|
+
"--label",
|
|
270
|
+
`${GATEWAY_VERSION_LABEL}=${GATEWAY_VERSION}`,
|
|
223
271
|
"--restart",
|
|
224
272
|
"unless-stopped",
|
|
225
273
|
"--network",
|
|
@@ -232,6 +280,7 @@ function ensureGateway(runner) {
|
|
|
232
280
|
"--providers.file.directory=/etc/traefik/dynamic",
|
|
233
281
|
"--providers.file.watch=true",
|
|
234
282
|
"--entrypoints.web.address=:80",
|
|
283
|
+
"--entrypoints.web.forwardedheaders.insecure=true",
|
|
235
284
|
"--api.dashboard=false",
|
|
236
285
|
], { capture: true });
|
|
237
286
|
if (!commandSucceeded(run)) {
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { type PackageManager } from "./create";
|
|
3
2
|
import { type LocaleDirection } from "./locale";
|
|
4
3
|
import { type DeployDriver } from "./deploy-driver";
|
|
5
4
|
interface ParsedArgs {
|
|
@@ -7,7 +6,8 @@ interface ParsedArgs {
|
|
|
7
6
|
name?: string;
|
|
8
7
|
template?: string;
|
|
9
8
|
dir?: string;
|
|
10
|
-
pm?:
|
|
9
|
+
pm?: string;
|
|
10
|
+
runtime?: string;
|
|
11
11
|
from?: string;
|
|
12
12
|
apply: boolean;
|
|
13
13
|
adopt: boolean;
|
package/dist/index.js
CHANGED
|
@@ -41,7 +41,7 @@ Usage:
|
|
|
41
41
|
Options:
|
|
42
42
|
--template <t> Template to scaffold (see below)
|
|
43
43
|
--dir <path> Target directory (default: ./<name>)
|
|
44
|
-
--
|
|
44
|
+
--runtime bun Optional explicit Bun runtime selection
|
|
45
45
|
--name <label> Display name for a locale
|
|
46
46
|
--direction <direction> Text direction: ltr | rtl (default: ltr)
|
|
47
47
|
--profile <name> Deployment profile name
|
|
@@ -63,7 +63,8 @@ ${(0, templates_1.templateListText)()}
|
|
|
63
63
|
Example:
|
|
64
64
|
npx @podosoft/podokit create my-app
|
|
65
65
|
npx @podosoft/podokit create my-app --template todo
|
|
66
|
-
|
|
66
|
+
bunx --bun @podosoft/podokit create my-app
|
|
67
|
+
cd my-app && bunx --bun @podosoft/podokit add auth
|
|
67
68
|
`;
|
|
68
69
|
const DEPLOY_HELP = `podo deploy — release an application to Kubernetes or Docker Compose
|
|
69
70
|
|
|
@@ -139,6 +140,9 @@ function parseArgs(argv) {
|
|
|
139
140
|
else if (arg === "--pm") {
|
|
140
141
|
parsed.pm = argv[++i];
|
|
141
142
|
}
|
|
143
|
+
else if (arg === "--runtime") {
|
|
144
|
+
parsed.runtime = argv[++i];
|
|
145
|
+
}
|
|
142
146
|
else if (arg === "--name") {
|
|
143
147
|
parsed.localeName = argv[++i];
|
|
144
148
|
}
|
|
@@ -395,11 +399,13 @@ async function main(argv) {
|
|
|
395
399
|
const s = (0, inspect_1.status)(process.cwd());
|
|
396
400
|
const tiers = `managed ${s.tiers.managed}, assembled ${s.tiers.assembled}, owned ${s.tiers.owned}`;
|
|
397
401
|
const modules = s.moduleDetails.map((module) => module.version ? `${module.name}@${module.version}` : module.name);
|
|
398
|
-
process.stdout.write(
|
|
399
|
-
|
|
400
|
-
`
|
|
401
|
-
|
|
402
|
-
|
|
402
|
+
process.stdout.write(args.json
|
|
403
|
+
? `${JSON.stringify(s, null, 2)}\n`
|
|
404
|
+
: `PodoKit ${s.podokitVersion} (template: ${s.template}, ${s.runtime} ${s.runtimeVersion}, ${s.packageManager})\n` +
|
|
405
|
+
`Modules: ${modules.length ? modules.join(", ") : "(none)"}\n` +
|
|
406
|
+
`Files: ${tiers}\n` +
|
|
407
|
+
`Edited: ${s.drifted.length} managed file(s)${s.missing.length ? `, ${s.missing.length} missing` : ""}\n` +
|
|
408
|
+
(s.drifted.length ? s.drifted.map((f) => ` ~ ${f}`).join("\n") + "\n" : ""));
|
|
403
409
|
}
|
|
404
410
|
catch (err) {
|
|
405
411
|
fail(err.message);
|
|
@@ -681,13 +687,13 @@ async function main(argv) {
|
|
|
681
687
|
}
|
|
682
688
|
const templatesDir = (0, node_path_1.join)(__dirname, "templates");
|
|
683
689
|
try {
|
|
684
|
-
const resolved = await (0, prompt_1.resolveCreateOptions)({ template: args.template, pm: args.pm }, ask, interactive);
|
|
690
|
+
const resolved = await (0, prompt_1.resolveCreateOptions)({ template: args.template, pm: args.pm, runtime: args.runtime }, ask, interactive);
|
|
685
691
|
const result = (0, create_1.create)({
|
|
686
692
|
name: args.name,
|
|
687
693
|
templatesDir,
|
|
688
694
|
template: resolved.template,
|
|
689
695
|
targetDir: args.dir,
|
|
690
|
-
|
|
696
|
+
runtime: resolved.toolchain.runtime,
|
|
691
697
|
ai: args.ai,
|
|
692
698
|
});
|
|
693
699
|
const relPath = (0, node_path_1.relative)(process.cwd(), result.projectDir) || ".";
|
package/dist/inspect.d.ts
CHANGED
|
@@ -7,6 +7,8 @@ export interface StatusReport {
|
|
|
7
7
|
podokitVersion: string;
|
|
8
8
|
template: string;
|
|
9
9
|
packageManager: string;
|
|
10
|
+
runtime: string;
|
|
11
|
+
runtimeVersion: string;
|
|
10
12
|
modules: string[];
|
|
11
13
|
moduleDetails: {
|
|
12
14
|
name: string;
|
|
@@ -43,6 +45,6 @@ export declare const SUPPORTED_FRAMEWORKS: Record<string, {
|
|
|
43
45
|
range: string;
|
|
44
46
|
majors: number[];
|
|
45
47
|
}>;
|
|
46
|
-
/** Parse the leading major from a semver range like `^
|
|
48
|
+
/** Parse the leading major from a semver range like `^1.4.29` or `>=1.7.1 <1.8`. */
|
|
47
49
|
export declare function leadingMajor(range: string): number | null;
|
|
48
50
|
export declare function doctor(projectRoot: string): DoctorFinding[];
|
package/dist/inspect.js
CHANGED
|
@@ -27,7 +27,9 @@ function status(projectRoot) {
|
|
|
27
27
|
return {
|
|
28
28
|
podokitVersion: manifest.podokitVersion,
|
|
29
29
|
template: manifest.template,
|
|
30
|
-
packageManager: manifest.packageManager,
|
|
30
|
+
packageManager: manifest.toolchain.packageManager,
|
|
31
|
+
runtime: manifest.toolchain.runtime,
|
|
32
|
+
runtimeVersion: manifest.toolchain.runtimeVersion,
|
|
31
33
|
modules: manifest.modules.map((m) => m.name),
|
|
32
34
|
moduleDetails: manifest.modules.map((m) => ({
|
|
33
35
|
name: m.name,
|
|
@@ -51,8 +53,8 @@ function diff(projectRoot) {
|
|
|
51
53
|
* `@podosoft/*` extensions still match.
|
|
52
54
|
*/
|
|
53
55
|
exports.SUPPORTED_FRAMEWORKS = {
|
|
54
|
-
|
|
55
|
-
"better-auth": { app: "api", range: ">=1.
|
|
56
|
+
elysia: { app: "api", range: "^1.4", majors: [1] },
|
|
57
|
+
"better-auth": { app: "api", range: ">=1.7.1 <1.8", majors: [1] },
|
|
56
58
|
svelte: { app: "web", range: "^5", majors: [5] },
|
|
57
59
|
};
|
|
58
60
|
function declaredVersion(projectRoot, app, pkg) {
|
|
@@ -62,7 +64,7 @@ function declaredVersion(projectRoot, app, pkg) {
|
|
|
62
64
|
const json = JSON.parse((0, node_fs_1.readFileSync)(file, "utf8"));
|
|
63
65
|
return json.dependencies?.[pkg] ?? json.devDependencies?.[pkg] ?? null;
|
|
64
66
|
}
|
|
65
|
-
/** Parse the leading major from a semver range like `^
|
|
67
|
+
/** Parse the leading major from a semver range like `^1.4.29` or `>=1.7.1 <1.8`. */
|
|
66
68
|
function leadingMajor(range) {
|
|
67
69
|
const match = range.match(/(\d+)\./);
|
|
68
70
|
return match ? Number(match[1]) : null;
|
package/dist/lockfile.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import type { TemplateVars } from "@podosoft/podokit-template-engine";
|
|
2
|
+
import { type Toolchain } from "./toolchain";
|
|
1
3
|
/**
|
|
2
4
|
* The generation lockfile (`.podokit/`) records how a project was assembled so
|
|
3
5
|
* `podo update` can rebuild the same inputs and detect user edits. See
|
|
4
6
|
* ADR-0009 (update mechanism) and ADR-0010 (ownership model).
|
|
5
7
|
*/
|
|
6
|
-
export declare const LOCK_SCHEMA_VERSION =
|
|
8
|
+
export declare const LOCK_SCHEMA_VERSION = 3;
|
|
7
9
|
/** File ownership tier. See ADR-0010. */
|
|
8
10
|
export type Tier = "managed" | "assembled" | "owned";
|
|
9
11
|
export interface ManifestModule {
|
|
@@ -29,7 +31,8 @@ export interface PodokitManifest {
|
|
|
29
31
|
schemaVersion: number;
|
|
30
32
|
podokitVersion: string;
|
|
31
33
|
template: string;
|
|
32
|
-
|
|
34
|
+
/** Runtime and package manager selected for generated and converted projects. */
|
|
35
|
+
toolchain: Toolchain;
|
|
33
36
|
/** Render vars / prompt answers, replayed on update (copier-style). */
|
|
34
37
|
answers: Record<string, string>;
|
|
35
38
|
modules: ManifestModule[];
|
|
@@ -63,6 +66,8 @@ export declare function manifestPath(projectRoot: string): string;
|
|
|
63
66
|
export declare function filesLockPath(projectRoot: string): string;
|
|
64
67
|
export declare function readManifest(projectRoot: string): PodokitManifest | null;
|
|
65
68
|
export declare function writeManifest(projectRoot: string, manifest: PodokitManifest): void;
|
|
69
|
+
/** Complete replay variables for a Bun-only v1 project. */
|
|
70
|
+
export declare function manifestTemplateVars(manifest: PodokitManifest): TemplateVars;
|
|
66
71
|
export declare function writeFilesLock(projectRoot: string, lock: FilesLock): void;
|
|
67
72
|
/** Read the PodoKit CLI's own version to stamp into the manifest. */
|
|
68
73
|
export declare function podokitVersion(): string;
|
|
@@ -89,7 +94,7 @@ export interface Drift {
|
|
|
89
94
|
export declare function computeDrift(projectRoot: string): Drift;
|
|
90
95
|
export interface InitLockOptions {
|
|
91
96
|
template: string;
|
|
92
|
-
|
|
97
|
+
toolchain?: Toolchain;
|
|
93
98
|
answers: Record<string, string>;
|
|
94
99
|
version?: string;
|
|
95
100
|
ownedGlobs?: string[];
|