@voltro/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +52 -0
- package/LICENSE +57 -0
- package/README.md +26 -0
- package/SECURITY.md +56 -0
- package/THIRD-PARTY-NOTICES.md +20236 -0
- package/bin/voltro.mjs +43 -0
- package/dist/bin.d.ts +1 -0
- package/dist/bin.js +9 -0
- package/dist/commands-CfPH2Wf4.js +18061 -0
- package/dist/frameworkInspectState-CX2250XB.js +86 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.js +5 -0
- package/dist/inspectState.d.ts +116 -0
- package/dist/inspectState.js +2 -0
- package/dist/startup.d.ts +26 -0
- package/dist/startup.js +2 -0
- package/dist/startupRunner-CRhuUl91.js +71 -0
- package/package.json +88 -0
- package/templates/AGENTS.core.md +258 -0
- package/templates/AGENTS.md +351 -0
- package/templates/agent-docs/_index.md +93 -0
- package/templates/agent-docs/_manifest.json +655 -0
- package/templates/agent-docs/ai.md +1845 -0
- package/templates/agent-docs/authentication.md +1788 -0
- package/templates/agent-docs/caching.md +624 -0
- package/templates/agent-docs/cli.md +1650 -0
- package/templates/agent-docs/configuration.md +295 -0
- package/templates/agent-docs/data.md +2172 -0
- package/templates/agent-docs/database/advancedqueries.md +1583 -0
- package/templates/agent-docs/database/columntypes.md +1200 -0
- package/templates/agent-docs/database/hosting.md +881 -0
- package/templates/agent-docs/database/migrations.md +2938 -0
- package/templates/agent-docs/database/misc.md +270 -0
- package/templates/agent-docs/database/overview.md +108 -0
- package/templates/agent-docs/database/querying.md +1622 -0
- package/templates/agent-docs/database/scaling.md +331 -0
- package/templates/agent-docs/database/schema.md +1458 -0
- package/templates/agent-docs/database/seedsdialects.md +1235 -0
- package/templates/agent-docs/database/transactions.md +285 -0
- package/templates/agent-docs/deployment.md +999 -0
- package/templates/agent-docs/internationalization.md +359 -0
- package/templates/agent-docs/introduction.md +438 -0
- package/templates/agent-docs/multi-tenancy.md +610 -0
- package/templates/agent-docs/observability.md +350 -0
- package/templates/agent-docs/plugins.md +1273 -0
- package/templates/agent-docs/reference.md +978 -0
- package/templates/agent-docs/routing.md +1553 -0
- package/templates/agent-docs/scheduling.md +666 -0
- package/templates/agent-docs/schema-driven-ui.md +607 -0
- package/templates/agent-docs/security.md +42 -0
- package/templates/agent-docs/templates/apibackends.md +3214 -0
- package/templates/agent-docs/templates/appshells.md +2062 -0
- package/templates/agent-docs/templates/custom.md +128 -0
- package/templates/agent-docs/templates/overview.md +122 -0
- package/templates/agent-docs/templates/serverless.md +315 -0
- package/templates/agent-docs/testing.md +376 -0
- package/templates/agent-docs/workflows.md +1351 -0
- package/templates/apps/api-ai/README.md +105 -0
- package/templates/apps/api-ai/actions/summarize.action.server.tsx +32 -0
- package/templates/apps/api-ai/actions/summarize.action.ts +33 -0
- package/templates/apps/api-ai/agents/support.agent.server.tsx +31 -0
- package/templates/apps/api-ai/agents/support.agent.tsx +27 -0
- package/templates/apps/api-ai/app.config.ts +57 -0
- package/templates/apps/api-ai/database/schema.ts +67 -0
- package/templates/apps/api-ai/package.json +27 -0
- package/templates/apps/api-ai/seeds/docs.seed.ts +67 -0
- package/templates/apps/api-ai/template.json +6 -0
- package/templates/apps/api-ai/tests/summarize.test.ts +50 -0
- package/templates/apps/api-ai/tools/searchDocs.tool.tsx +60 -0
- package/templates/apps/api-ai/tsconfig.json +5 -0
- package/templates/apps/api-auth/.env +17 -0
- package/templates/apps/api-auth/README.md +109 -0
- package/templates/apps/api-auth/actions/me.action.server.ts +20 -0
- package/templates/apps/api-auth/actions/me.action.ts +19 -0
- package/templates/apps/api-auth/app.config.ts +59 -0
- package/templates/apps/api-auth/database/schema.ts +26 -0
- package/templates/apps/api-auth/package.json +28 -0
- package/templates/apps/api-auth/template.json +6 -0
- package/templates/apps/api-auth/tests/me.test.ts +37 -0
- package/templates/apps/api-auth/tsconfig.json +5 -0
- package/templates/apps/api-backend/README.md +25 -0
- package/templates/apps/api-backend/app.config.ts +39 -0
- package/templates/apps/api-backend/database/schema.ts +57 -0
- package/templates/apps/api-backend/mutations/notes.create.mutation.server.ts +19 -0
- package/templates/apps/api-backend/mutations/notes.create.mutation.ts +37 -0
- package/templates/apps/api-backend/package.json +28 -0
- package/templates/apps/api-backend/queries/notes.query.server.ts +14 -0
- package/templates/apps/api-backend/queries/notes.query.ts +20 -0
- package/templates/apps/api-backend/template.json +6 -0
- package/templates/apps/api-backend/tests/notes.create.test.ts +50 -0
- package/templates/apps/api-backend/tsconfig.json +5 -0
- package/templates/apps/api-backend-deactivation/README.md +49 -0
- package/templates/apps/api-backend-deactivation/actions/users.get.action.server.ts +17 -0
- package/templates/apps/api-backend-deactivation/actions/users.get.action.ts +18 -0
- package/templates/apps/api-backend-deactivation/app.config.ts +20 -0
- package/templates/apps/api-backend-deactivation/database/schema.ts +41 -0
- package/templates/apps/api-backend-deactivation/mutations/users.create.mutation.server.ts +6 -0
- package/templates/apps/api-backend-deactivation/mutations/users.create.mutation.ts +16 -0
- package/templates/apps/api-backend-deactivation/mutations/users.deactivate.mutation.server.ts +10 -0
- package/templates/apps/api-backend-deactivation/mutations/users.deactivate.mutation.ts +19 -0
- package/templates/apps/api-backend-deactivation/package.json +28 -0
- package/templates/apps/api-backend-deactivation/template.json +6 -0
- package/templates/apps/api-backend-deactivation/tests/users.deactivate.test.ts +47 -0
- package/templates/apps/api-backend-deactivation/tsconfig.json +5 -0
- package/templates/apps/api-backend-mail/README.md +39 -0
- package/templates/apps/api-backend-mail/actions/sendWelcome.action.server.ts +15 -0
- package/templates/apps/api-backend-mail/actions/sendWelcome.action.ts +21 -0
- package/templates/apps/api-backend-mail/app.config.ts +34 -0
- package/templates/apps/api-backend-mail/database/schema.ts +57 -0
- package/templates/apps/api-backend-mail/emails/welcome.email.tsx +106 -0
- package/templates/apps/api-backend-mail/mutations/notes.create.mutation.server.ts +19 -0
- package/templates/apps/api-backend-mail/mutations/notes.create.mutation.ts +37 -0
- package/templates/apps/api-backend-mail/package.json +30 -0
- package/templates/apps/api-backend-mail/queries/notes.query.server.ts +14 -0
- package/templates/apps/api-backend-mail/queries/notes.query.ts +20 -0
- package/templates/apps/api-backend-mail/template.json +6 -0
- package/templates/apps/api-backend-mail/tests/notes.create.test.ts +50 -0
- package/templates/apps/api-backend-mail/tsconfig.json +5 -0
- package/templates/apps/api-backend-mariadb/.env.example +35 -0
- package/templates/apps/api-backend-mariadb/README.md +31 -0
- package/templates/apps/api-backend-mariadb/app.config.ts +68 -0
- package/templates/apps/api-backend-mariadb/database/schema.ts +57 -0
- package/templates/apps/api-backend-mariadb/mutations/notes.create.mutation.server.ts +19 -0
- package/templates/apps/api-backend-mariadb/mutations/notes.create.mutation.ts +37 -0
- package/templates/apps/api-backend-mariadb/package.json +30 -0
- package/templates/apps/api-backend-mariadb/queries/notes.query.server.ts +14 -0
- package/templates/apps/api-backend-mariadb/queries/notes.query.ts +20 -0
- package/templates/apps/api-backend-mariadb/template.json +6 -0
- package/templates/apps/api-backend-mariadb/tests/notes.create.test.ts +50 -0
- package/templates/apps/api-backend-mariadb/tsconfig.json +5 -0
- package/templates/apps/api-backend-storage/README.md +86 -0
- package/templates/apps/api-backend-storage/actions/uploadAvatar.action.server.ts +21 -0
- package/templates/apps/api-backend-storage/actions/uploadAvatar.action.ts +21 -0
- package/templates/apps/api-backend-storage/actions/uploadDocument.action.server.ts +21 -0
- package/templates/apps/api-backend-storage/actions/uploadDocument.action.ts +20 -0
- package/templates/apps/api-backend-storage/app.config.ts +38 -0
- package/templates/apps/api-backend-storage/database/schema.ts +57 -0
- package/templates/apps/api-backend-storage/mutations/notes.create.mutation.server.ts +19 -0
- package/templates/apps/api-backend-storage/mutations/notes.create.mutation.ts +37 -0
- package/templates/apps/api-backend-storage/package.json +27 -0
- package/templates/apps/api-backend-storage/queries/notes.query.server.ts +14 -0
- package/templates/apps/api-backend-storage/queries/notes.query.ts +20 -0
- package/templates/apps/api-backend-storage/template.json +6 -0
- package/templates/apps/api-backend-storage/tests/notes.create.test.ts +50 -0
- package/templates/apps/api-backend-storage/tsconfig.json +5 -0
- package/templates/apps/api-data-advanced/.env +17 -0
- package/templates/apps/api-data-advanced/README.md +88 -0
- package/templates/apps/api-data-advanced/app.config.ts +56 -0
- package/templates/apps/api-data-advanced/database/actors.entity.ts +14 -0
- package/templates/apps/api-data-advanced/database/authors.entity.ts +30 -0
- package/templates/apps/api-data-advanced/database/authors.relations.ts +15 -0
- package/templates/apps/api-data-advanced/database/books.entity.ts +59 -0
- package/templates/apps/api-data-advanced/database/books.relations.ts +10 -0
- package/templates/apps/api-data-advanced/database/index.ts +23 -0
- package/templates/apps/api-data-advanced/database/tenants.entity.ts +11 -0
- package/templates/apps/api-data-advanced/package.json +28 -0
- package/templates/apps/api-data-advanced/queries/authors.withBooks.query.server.ts +18 -0
- package/templates/apps/api-data-advanced/queries/authors.withBooks.query.ts +40 -0
- package/templates/apps/api-data-advanced/queries/books.search.query.server.ts +17 -0
- package/templates/apps/api-data-advanced/queries/books.search.query.ts +39 -0
- package/templates/apps/api-data-advanced/seeds/catalog.seed.ts +101 -0
- package/templates/apps/api-data-advanced/template.json +6 -0
- package/templates/apps/api-data-advanced/tests/queries.test.ts +124 -0
- package/templates/apps/api-data-advanced/tsconfig.json +5 -0
- package/templates/apps/api-durable/README.md +81 -0
- package/templates/apps/api-durable/aggregates/orderStats.aggregate.ts +49 -0
- package/templates/apps/api-durable/app.config.ts +41 -0
- package/templates/apps/api-durable/database/schema.ts +65 -0
- package/templates/apps/api-durable/mutations/orders.approve.mutation.server.ts +43 -0
- package/templates/apps/api-durable/mutations/orders.approve.mutation.ts +23 -0
- package/templates/apps/api-durable/mutations/orders.place.mutation.server.ts +45 -0
- package/templates/apps/api-durable/mutations/orders.place.mutation.ts +40 -0
- package/templates/apps/api-durable/package.json +28 -0
- package/templates/apps/api-durable/schedules/nightlyReport.cron.tsx +37 -0
- package/templates/apps/api-durable/startup/warm.startup.tsx +33 -0
- package/templates/apps/api-durable/subscribers/orderChanges.subscribe.ts +27 -0
- package/templates/apps/api-durable/template.json +6 -0
- package/templates/apps/api-durable/tests/orders.place.test.ts +91 -0
- package/templates/apps/api-durable/triggers/order.placed.trigger.tsx +21 -0
- package/templates/apps/api-durable/tsconfig.json +5 -0
- package/templates/apps/api-durable/workflows/order.fulfill.workflow.server.tsx +103 -0
- package/templates/apps/api-durable/workflows/order.fulfill.workflow.tsx +25 -0
- package/templates/apps/api-feature-flags/README.md +63 -0
- package/templates/apps/api-feature-flags/actions/notes.export.action.server.ts +11 -0
- package/templates/apps/api-feature-flags/actions/notes.export.action.ts +18 -0
- package/templates/apps/api-feature-flags/app.config.ts +41 -0
- package/templates/apps/api-feature-flags/database/schema.ts +37 -0
- package/templates/apps/api-feature-flags/mutations/notes.create.mutation.server.ts +29 -0
- package/templates/apps/api-feature-flags/mutations/notes.create.mutation.ts +28 -0
- package/templates/apps/api-feature-flags/package.json +29 -0
- package/templates/apps/api-feature-flags/template.json +6 -0
- package/templates/apps/api-feature-flags/tests/notes.create.test.ts +67 -0
- package/templates/apps/api-feature-flags/tsconfig.json +5 -0
- package/templates/apps/api-governance/.env +4 -0
- package/templates/apps/api-governance/README.md +61 -0
- package/templates/apps/api-governance/actions/profiles.get.action.server.ts +17 -0
- package/templates/apps/api-governance/actions/profiles.get.action.ts +17 -0
- package/templates/apps/api-governance/app.config.ts +35 -0
- package/templates/apps/api-governance/database/schema.ts +41 -0
- package/templates/apps/api-governance/mutations/profiles.create.mutation.server.ts +17 -0
- package/templates/apps/api-governance/mutations/profiles.create.mutation.ts +21 -0
- package/templates/apps/api-governance/package.json +29 -0
- package/templates/apps/api-governance/template.json +6 -0
- package/templates/apps/api-governance/tests/profiles.create.test.ts +59 -0
- package/templates/apps/api-governance/tsconfig.json +5 -0
- package/templates/apps/api-kv/README.md +100 -0
- package/templates/apps/api-kv/actions/sync.pull.action.server.ts +75 -0
- package/templates/apps/api-kv/actions/sync.pull.action.ts +25 -0
- package/templates/apps/api-kv/actions/sync.reset.action.server.ts +25 -0
- package/templates/apps/api-kv/actions/sync.reset.action.ts +22 -0
- package/templates/apps/api-kv/actions/sync.status.action.server.ts +28 -0
- package/templates/apps/api-kv/actions/sync.status.action.ts +17 -0
- package/templates/apps/api-kv/app.config.ts +48 -0
- package/templates/apps/api-kv/database/schema.ts +62 -0
- package/templates/apps/api-kv/package.json +28 -0
- package/templates/apps/api-kv/queries/events.list.query.server.ts +14 -0
- package/templates/apps/api-kv/queries/events.list.query.ts +23 -0
- package/templates/apps/api-kv/template.json +6 -0
- package/templates/apps/api-kv/tests/sync.test.ts +103 -0
- package/templates/apps/api-kv/tsconfig.json +5 -0
- package/templates/apps/api-moderation/README.md +46 -0
- package/templates/apps/api-moderation/app.config.ts +33 -0
- package/templates/apps/api-moderation/database/schema.ts +45 -0
- package/templates/apps/api-moderation/mutations/comments.create.mutation.server.ts +8 -0
- package/templates/apps/api-moderation/mutations/comments.create.mutation.ts +20 -0
- package/templates/apps/api-moderation/mutations/posts.create.mutation.server.ts +9 -0
- package/templates/apps/api-moderation/mutations/posts.create.mutation.ts +25 -0
- package/templates/apps/api-moderation/package.json +29 -0
- package/templates/apps/api-moderation/template.json +6 -0
- package/templates/apps/api-moderation/tests/posts.create.test.ts +79 -0
- package/templates/apps/api-moderation/tsconfig.json +5 -0
- package/templates/apps/api-observability/README.md +106 -0
- package/templates/apps/api-observability/app.config.ts +32 -0
- package/templates/apps/api-observability/database/schema.ts +38 -0
- package/templates/apps/api-observability/mutations/notes.create.mutation.server.ts +33 -0
- package/templates/apps/api-observability/mutations/notes.create.mutation.ts +15 -0
- package/templates/apps/api-observability/package.json +29 -0
- package/templates/apps/api-observability/queries/notes.list.query.server.ts +7 -0
- package/templates/apps/api-observability/queries/notes.list.query.ts +14 -0
- package/templates/apps/api-observability/template.json +6 -0
- package/templates/apps/api-observability/tests/notes.create.test.ts +36 -0
- package/templates/apps/api-observability/tsconfig.json +5 -0
- package/templates/apps/api-ratelimit/README.md +49 -0
- package/templates/apps/api-ratelimit/app.config.ts +42 -0
- package/templates/apps/api-ratelimit/database/schema.ts +37 -0
- package/templates/apps/api-ratelimit/mutations/notes.create.mutation.server.ts +16 -0
- package/templates/apps/api-ratelimit/mutations/notes.create.mutation.ts +34 -0
- package/templates/apps/api-ratelimit/package.json +29 -0
- package/templates/apps/api-ratelimit/template.json +6 -0
- package/templates/apps/api-ratelimit/tests/notes.create.test.ts +69 -0
- package/templates/apps/api-ratelimit/tsconfig.json +5 -0
- package/templates/apps/api-rbac/README.md +59 -0
- package/templates/apps/api-rbac/app.config.ts +48 -0
- package/templates/apps/api-rbac/database/schema.ts +37 -0
- package/templates/apps/api-rbac/mutations/notes.create.mutation.server.ts +22 -0
- package/templates/apps/api-rbac/mutations/notes.create.mutation.ts +26 -0
- package/templates/apps/api-rbac/package.json +29 -0
- package/templates/apps/api-rbac/template.json +6 -0
- package/templates/apps/api-rbac/tests/notes.create.test.ts +80 -0
- package/templates/apps/api-rbac/tsconfig.json +5 -0
- package/templates/apps/api-rest/README.md +85 -0
- package/templates/apps/api-rest/app.config.ts +70 -0
- package/templates/apps/api-rest/database/schema.ts +52 -0
- package/templates/apps/api-rest/lib/product.ts +30 -0
- package/templates/apps/api-rest/package.json +27 -0
- package/templates/apps/api-rest/routes/v1/products.create.route.tsx +45 -0
- package/templates/apps/api-rest/routes/v1/products.delete.route.tsx +25 -0
- package/templates/apps/api-rest/routes/v1/products.get.route.tsx +29 -0
- package/templates/apps/api-rest/routes/v1/products.list.route.tsx +43 -0
- package/templates/apps/api-rest/template.json +6 -0
- package/templates/apps/api-rest/tests/products.create.test.ts +53 -0
- package/templates/apps/api-rest/tsconfig.json +5 -0
- package/templates/apps/api-saas/README.md +106 -0
- package/templates/apps/api-saas/app.config.ts +51 -0
- package/templates/apps/api-saas/database/schema.ts +50 -0
- package/templates/apps/api-saas/mutations/projects.create.mutation.server.ts +52 -0
- package/templates/apps/api-saas/mutations/projects.create.mutation.ts +18 -0
- package/templates/apps/api-saas/package.json +31 -0
- package/templates/apps/api-saas/queries/projects.list.query.server.ts +7 -0
- package/templates/apps/api-saas/queries/projects.list.query.ts +18 -0
- package/templates/apps/api-saas/template.json +6 -0
- package/templates/apps/api-saas/tests/projects.create.test.ts +47 -0
- package/templates/apps/api-saas/tsconfig.json +5 -0
- package/templates/apps/api-search/README.md +68 -0
- package/templates/apps/api-search/app.config.ts +31 -0
- package/templates/apps/api-search/database/schema.ts +47 -0
- package/templates/apps/api-search/lib/search.ts +27 -0
- package/templates/apps/api-search/mutations/articles.create.mutation.server.ts +19 -0
- package/templates/apps/api-search/mutations/articles.create.mutation.ts +35 -0
- package/templates/apps/api-search/package.json +29 -0
- package/templates/apps/api-search/queries/articles.list.query.server.ts +14 -0
- package/templates/apps/api-search/queries/articles.list.query.ts +19 -0
- package/templates/apps/api-search/seeds/articles.seed.ts +41 -0
- package/templates/apps/api-search/startup/searchBackfill.startup.tsx +24 -0
- package/templates/apps/api-search/template.json +6 -0
- package/templates/apps/api-search/tests/articles.create.test.ts +69 -0
- package/templates/apps/api-search/tsconfig.json +5 -0
- package/templates/apps/api-versioning/README.md +51 -0
- package/templates/apps/api-versioning/actions/documents.asOf.action.server.ts +13 -0
- package/templates/apps/api-versioning/actions/documents.asOf.action.ts +14 -0
- package/templates/apps/api-versioning/actions/documents.history.action.server.ts +15 -0
- package/templates/apps/api-versioning/actions/documents.history.action.ts +17 -0
- package/templates/apps/api-versioning/app.config.ts +24 -0
- package/templates/apps/api-versioning/database/schema.ts +38 -0
- package/templates/apps/api-versioning/mutations/documents.create.mutation.server.ts +8 -0
- package/templates/apps/api-versioning/mutations/documents.create.mutation.ts +21 -0
- package/templates/apps/api-versioning/mutations/documents.update.mutation.server.ts +9 -0
- package/templates/apps/api-versioning/mutations/documents.update.mutation.ts +21 -0
- package/templates/apps/api-versioning/package.json +29 -0
- package/templates/apps/api-versioning/template.json +6 -0
- package/templates/apps/api-versioning/tests/documents.create.test.ts +37 -0
- package/templates/apps/api-versioning/tsconfig.json +5 -0
- package/templates/apps/api-webhooks/.env +6 -0
- package/templates/apps/api-webhooks/README.md +106 -0
- package/templates/apps/api-webhooks/app.config.ts +16 -0
- package/templates/apps/api-webhooks/database/schema.ts +49 -0
- package/templates/apps/api-webhooks/events/order.completed.webhook.tsx +22 -0
- package/templates/apps/api-webhooks/mutations/orders.fulfill.mutation.server.ts +37 -0
- package/templates/apps/api-webhooks/mutations/orders.fulfill.mutation.ts +15 -0
- package/templates/apps/api-webhooks/package.json +28 -0
- package/templates/apps/api-webhooks/queries/orders.list.query.server.ts +7 -0
- package/templates/apps/api-webhooks/queries/orders.list.query.ts +15 -0
- package/templates/apps/api-webhooks/template.json +6 -0
- package/templates/apps/api-webhooks/tests/orders.fulfill.test.ts +51 -0
- package/templates/apps/api-webhooks/tsconfig.json +5 -0
- package/templates/apps/api-webhooks/webhooks/orders.webhook.tsx +35 -0
- package/templates/apps/changelog/README.md +77 -0
- package/templates/apps/changelog/app.config.ts +27 -0
- package/templates/apps/changelog/content/releases/0.1.0.mdx +19 -0
- package/templates/apps/changelog/content/releases/0.2.0.mdx +28 -0
- package/templates/apps/changelog/package.json +30 -0
- package/templates/apps/changelog/scripts/generate-rss.mjs +38 -0
- package/templates/apps/changelog/src/globals.css +66 -0
- package/templates/apps/changelog/src/globals.d.ts +16 -0
- package/templates/apps/changelog/src/lib/locale.test.ts +72 -0
- package/templates/apps/changelog/src/lib/locale.ts +55 -0
- package/templates/apps/changelog/src/lib/releases.ts +21 -0
- package/templates/apps/changelog/src/locales/de.ts +22 -0
- package/templates/apps/changelog/src/locales/en.ts +30 -0
- package/templates/apps/changelog/src/pages/[locale]/[slug].tsx +24 -0
- package/templates/apps/changelog/src/pages/[locale]/index.tsx +13 -0
- package/templates/apps/changelog/src/pages/[locale]/mirrors.test.tsx +95 -0
- package/templates/apps/changelog/src/pages/[slug].test.tsx +127 -0
- package/templates/apps/changelog/src/pages/[slug].tsx +52 -0
- package/templates/apps/changelog/src/pages/index.test.tsx +112 -0
- package/templates/apps/changelog/src/pages/index.tsx +55 -0
- package/templates/apps/changelog/src/pages/layout.tsx +84 -0
- package/templates/apps/changelog/template.json +6 -0
- package/templates/apps/changelog/tsconfig.json +11 -0
- package/templates/apps/edge-functions/README.md +55 -0
- package/templates/apps/edge-functions/functions/aiComplete.serverless.ts +58 -0
- package/templates/apps/edge-functions/functions/currencyConvert.serverless.ts +47 -0
- package/templates/apps/edge-functions/functions/geoGreeting.serverless.ts +44 -0
- package/templates/apps/edge-functions/functions/health.serverless.ts +29 -0
- package/templates/apps/edge-functions/functions/resolveLink.serverless.ts +32 -0
- package/templates/apps/edge-functions/functions/shareLink.serverless.ts +30 -0
- package/templates/apps/edge-functions/functions/slackNotify.serverless.ts +40 -0
- package/templates/apps/edge-functions/functions/verifySignature.serverless.ts +52 -0
- package/templates/apps/edge-functions/package.json +21 -0
- package/templates/apps/edge-functions/template.json +6 -0
- package/templates/apps/edge-functions/tsconfig.json +10 -0
- package/templates/apps/frontend-admin/README.md +40 -0
- package/templates/apps/frontend-admin/app.config.ts +37 -0
- package/templates/apps/frontend-admin/package.json +30 -0
- package/templates/apps/frontend-admin/src/config.ts +8 -0
- package/templates/apps/frontend-admin/src/globals.css +76 -0
- package/templates/apps/frontend-admin/src/globals.d.ts +6 -0
- package/templates/apps/frontend-admin/src/lib/admin.ts +16 -0
- package/templates/apps/frontend-admin/src/lib/auth.ts +24 -0
- package/templates/apps/frontend-admin/src/locales/de.ts +67 -0
- package/templates/apps/frontend-admin/src/locales/en.ts +79 -0
- package/templates/apps/frontend-admin/src/locales/index.ts +15 -0
- package/templates/apps/frontend-admin/src/pages/(marketing)/index.test.tsx +55 -0
- package/templates/apps/frontend-admin/src/pages/(marketing)/index.tsx +32 -0
- package/templates/apps/frontend-admin/src/pages/(marketing)/layout.tsx +29 -0
- package/templates/apps/frontend-admin/src/pages/(marketing)/login.test.tsx +73 -0
- package/templates/apps/frontend-admin/src/pages/(marketing)/login.tsx +35 -0
- package/templates/apps/frontend-admin/src/pages/admin/[entity].tsx +121 -0
- package/templates/apps/frontend-admin/src/pages/admin/entity.test.tsx +119 -0
- package/templates/apps/frontend-admin/src/pages/admin/error.tsx +20 -0
- package/templates/apps/frontend-admin/src/pages/admin/fallbacks.test.tsx +68 -0
- package/templates/apps/frontend-admin/src/pages/admin/index.test.tsx +88 -0
- package/templates/apps/frontend-admin/src/pages/admin/index.tsx +65 -0
- package/templates/apps/frontend-admin/src/pages/admin/layout.test.tsx +114 -0
- package/templates/apps/frontend-admin/src/pages/admin/layout.tsx +97 -0
- package/templates/apps/frontend-admin/src/pages/admin/loading.tsx +15 -0
- package/templates/apps/frontend-admin/src/pages/admin/not-found.tsx +15 -0
- package/templates/apps/frontend-admin/src/pages/layout.tsx +12 -0
- package/templates/apps/frontend-admin/src/pages/layouts.test.tsx +54 -0
- package/templates/apps/frontend-admin/template.json +6 -0
- package/templates/apps/frontend-admin/tsconfig.json +11 -0
- package/templates/apps/frontend-app/README.md +98 -0
- package/templates/apps/frontend-app/app.config.ts +43 -0
- package/templates/apps/frontend-app/package.json +30 -0
- package/templates/apps/frontend-app/src/locales/de.ts +36 -0
- package/templates/apps/frontend-app/src/locales/en.ts +43 -0
- package/templates/apps/frontend-app/src/locales/index.ts +15 -0
- package/templates/apps/frontend-app/src/pages/index.test.tsx +167 -0
- package/templates/apps/frontend-app/src/pages/index.tsx +136 -0
- package/templates/apps/frontend-app/src/pages/layout.tsx +41 -0
- package/templates/apps/frontend-app/src/pages/schema-ui.test.tsx +99 -0
- package/templates/apps/frontend-app/src/pages/schema-ui.tsx +74 -0
- package/templates/apps/frontend-app/template.json +6 -0
- package/templates/apps/frontend-app/tsconfig.json +11 -0
- package/templates/apps/frontend-blank/README.md +18 -0
- package/templates/apps/frontend-blank/app.config.ts +29 -0
- package/templates/apps/frontend-blank/package.json +29 -0
- package/templates/apps/frontend-blank/src/locales/de.ts +15 -0
- package/templates/apps/frontend-blank/src/locales/en.ts +22 -0
- package/templates/apps/frontend-blank/src/locales/index.ts +15 -0
- package/templates/apps/frontend-blank/src/pages/index.test.tsx +55 -0
- package/templates/apps/frontend-blank/src/pages/index.tsx +27 -0
- package/templates/apps/frontend-blank/src/pages/layout.test.tsx +54 -0
- package/templates/apps/frontend-blank/src/pages/layout.tsx +35 -0
- package/templates/apps/frontend-blank/template.json +6 -0
- package/templates/apps/frontend-blank/tsconfig.json +11 -0
- package/templates/apps/frontend-contact/README.md +65 -0
- package/templates/apps/frontend-contact/app.config.ts +25 -0
- package/templates/apps/frontend-contact/functions/sendMessage.serverless.ts +69 -0
- package/templates/apps/frontend-contact/package.json +33 -0
- package/templates/apps/frontend-contact/src/components/ContactForm.island.test.tsx +142 -0
- package/templates/apps/frontend-contact/src/components/ContactForm.island.tsx +104 -0
- package/templates/apps/frontend-contact/src/config.ts +12 -0
- package/templates/apps/frontend-contact/src/globals.css +84 -0
- package/templates/apps/frontend-contact/src/lib/locale.ts +55 -0
- package/templates/apps/frontend-contact/src/locales/de.ts +26 -0
- package/templates/apps/frontend-contact/src/locales/en.ts +29 -0
- package/templates/apps/frontend-contact/src/pages/[locale]/index.tsx +14 -0
- package/templates/apps/frontend-contact/src/pages/index.test.tsx +70 -0
- package/templates/apps/frontend-contact/src/pages/index.tsx +63 -0
- package/templates/apps/frontend-contact/src/pages/layout.tsx +65 -0
- package/templates/apps/frontend-contact/template.json +6 -0
- package/templates/apps/frontend-contact/tsconfig.json +11 -0
- package/templates/apps/frontend-dashboard/README.md +54 -0
- package/templates/apps/frontend-dashboard/app.config.ts +39 -0
- package/templates/apps/frontend-dashboard/package.json +29 -0
- package/templates/apps/frontend-dashboard/src/config.ts +8 -0
- package/templates/apps/frontend-dashboard/src/globals.css +72 -0
- package/templates/apps/frontend-dashboard/src/globals.d.ts +6 -0
- package/templates/apps/frontend-dashboard/src/lib/auth.ts +27 -0
- package/templates/apps/frontend-dashboard/src/locales/de.ts +49 -0
- package/templates/apps/frontend-dashboard/src/locales/en.ts +60 -0
- package/templates/apps/frontend-dashboard/src/locales/index.ts +15 -0
- package/templates/apps/frontend-dashboard/src/pages/(marketing)/index.test.tsx +55 -0
- package/templates/apps/frontend-dashboard/src/pages/(marketing)/index.tsx +34 -0
- package/templates/apps/frontend-dashboard/src/pages/(marketing)/layout.tsx +32 -0
- package/templates/apps/frontend-dashboard/src/pages/(marketing)/login.test.tsx +74 -0
- package/templates/apps/frontend-dashboard/src/pages/(marketing)/login.tsx +40 -0
- package/templates/apps/frontend-dashboard/src/pages/dashboard/error.tsx +21 -0
- package/templates/apps/frontend-dashboard/src/pages/dashboard/fallbacks.test.tsx +68 -0
- package/templates/apps/frontend-dashboard/src/pages/dashboard/index.test.tsx +55 -0
- package/templates/apps/frontend-dashboard/src/pages/dashboard/index.tsx +38 -0
- package/templates/apps/frontend-dashboard/src/pages/dashboard/layout.test.tsx +88 -0
- package/templates/apps/frontend-dashboard/src/pages/dashboard/layout.tsx +69 -0
- package/templates/apps/frontend-dashboard/src/pages/dashboard/loading.tsx +21 -0
- package/templates/apps/frontend-dashboard/src/pages/dashboard/not-found.tsx +19 -0
- package/templates/apps/frontend-dashboard/src/pages/dashboard/settings.test.tsx +69 -0
- package/templates/apps/frontend-dashboard/src/pages/dashboard/settings.tsx +35 -0
- package/templates/apps/frontend-dashboard/src/pages/layout.tsx +12 -0
- package/templates/apps/frontend-dashboard/src/pages/layouts.test.tsx +54 -0
- package/templates/apps/frontend-dashboard/template.json +6 -0
- package/templates/apps/frontend-dashboard/tsconfig.json +11 -0
- package/templates/apps/frontend-docs/README.md +19 -0
- package/templates/apps/frontend-docs/app.config.ts +25 -0
- package/templates/apps/frontend-docs/package.json +29 -0
- package/templates/apps/frontend-docs/src/globals.css +32 -0
- package/templates/apps/frontend-docs/src/lib/locale.test.ts +72 -0
- package/templates/apps/frontend-docs/src/lib/locale.ts +56 -0
- package/templates/apps/frontend-docs/src/locales/de.ts +24 -0
- package/templates/apps/frontend-docs/src/locales/en.ts +28 -0
- package/templates/apps/frontend-docs/src/pages/[locale]/docs/[...slug].tsx +18 -0
- package/templates/apps/frontend-docs/src/pages/[locale]/index.tsx +13 -0
- package/templates/apps/frontend-docs/src/pages/[locale]/mirrors.test.tsx +67 -0
- package/templates/apps/frontend-docs/src/pages/docs/[...slug].test.tsx +115 -0
- package/templates/apps/frontend-docs/src/pages/docs/[...slug].tsx +82 -0
- package/templates/apps/frontend-docs/src/pages/index.test.tsx +90 -0
- package/templates/apps/frontend-docs/src/pages/index.tsx +45 -0
- package/templates/apps/frontend-docs/src/pages/layout.test.tsx +84 -0
- package/templates/apps/frontend-docs/src/pages/layout.tsx +66 -0
- package/templates/apps/frontend-docs/template.json +6 -0
- package/templates/apps/frontend-docs/tsconfig.json +11 -0
- package/templates/apps/frontend-i18n/README.md +61 -0
- package/templates/apps/frontend-i18n/app.config.ts +33 -0
- package/templates/apps/frontend-i18n/package.json +28 -0
- package/templates/apps/frontend-i18n/src/globals.css +46 -0
- package/templates/apps/frontend-i18n/src/globals.d.ts +6 -0
- package/templates/apps/frontend-i18n/src/lib/locale.test.ts +72 -0
- package/templates/apps/frontend-i18n/src/lib/locale.ts +55 -0
- package/templates/apps/frontend-i18n/src/locales/de.ts +24 -0
- package/templates/apps/frontend-i18n/src/locales/en.ts +25 -0
- package/templates/apps/frontend-i18n/src/pages/[locale]/about.tsx +11 -0
- package/templates/apps/frontend-i18n/src/pages/[locale]/index.tsx +13 -0
- package/templates/apps/frontend-i18n/src/pages/[locale]/mirrors.test.tsx +50 -0
- package/templates/apps/frontend-i18n/src/pages/about.test.tsx +75 -0
- package/templates/apps/frontend-i18n/src/pages/about.tsx +31 -0
- package/templates/apps/frontend-i18n/src/pages/index.test.tsx +102 -0
- package/templates/apps/frontend-i18n/src/pages/index.tsx +43 -0
- package/templates/apps/frontend-i18n/src/pages/layout.test.tsx +86 -0
- package/templates/apps/frontend-i18n/src/pages/layout.tsx +70 -0
- package/templates/apps/frontend-i18n/template.json +6 -0
- package/templates/apps/frontend-i18n/tsconfig.json +11 -0
- package/templates/apps/frontend-landing/README.md +17 -0
- package/templates/apps/frontend-landing/app.config.ts +25 -0
- package/templates/apps/frontend-landing/package.json +29 -0
- package/templates/apps/frontend-landing/src/globals.css +23 -0
- package/templates/apps/frontend-landing/src/lib/locale.test.ts +72 -0
- package/templates/apps/frontend-landing/src/lib/locale.ts +55 -0
- package/templates/apps/frontend-landing/src/locales/de.ts +24 -0
- package/templates/apps/frontend-landing/src/locales/en.ts +26 -0
- package/templates/apps/frontend-landing/src/pages/[locale]/index.tsx +13 -0
- package/templates/apps/frontend-landing/src/pages/[locale]/mirrors.test.tsx +37 -0
- package/templates/apps/frontend-landing/src/pages/index.test.tsx +110 -0
- package/templates/apps/frontend-landing/src/pages/index.tsx +75 -0
- package/templates/apps/frontend-landing/src/pages/layout.test.tsx +84 -0
- package/templates/apps/frontend-landing/src/pages/layout.tsx +66 -0
- package/templates/apps/frontend-landing/template.json +6 -0
- package/templates/apps/frontend-landing/tsconfig.json +11 -0
- package/templates/apps/frontend-spa/README.md +45 -0
- package/templates/apps/frontend-spa/app.config.ts +27 -0
- package/templates/apps/frontend-spa/package.json +29 -0
- package/templates/apps/frontend-spa/src/globals.css +84 -0
- package/templates/apps/frontend-spa/src/locales/de.ts +22 -0
- package/templates/apps/frontend-spa/src/locales/en.ts +29 -0
- package/templates/apps/frontend-spa/src/locales/index.ts +15 -0
- package/templates/apps/frontend-spa/src/pages/index.test.tsx +137 -0
- package/templates/apps/frontend-spa/src/pages/index.tsx +123 -0
- package/templates/apps/frontend-spa/src/pages/layout.tsx +27 -0
- package/templates/apps/frontend-spa/template.json +6 -0
- package/templates/apps/frontend-spa/tsconfig.json +11 -0
- package/templates/apps/frontend-ssr/README.md +68 -0
- package/templates/apps/frontend-ssr/app.config.ts +32 -0
- package/templates/apps/frontend-ssr/package.json +29 -0
- package/templates/apps/frontend-ssr/src/globals.css +67 -0
- package/templates/apps/frontend-ssr/src/locales/de.ts +41 -0
- package/templates/apps/frontend-ssr/src/locales/en.ts +54 -0
- package/templates/apps/frontend-ssr/src/locales/index.ts +16 -0
- package/templates/apps/frontend-ssr/src/pages/feed-swr.test.tsx +69 -0
- package/templates/apps/frontend-ssr/src/pages/feed-swr.tsx +54 -0
- package/templates/apps/frontend-ssr/src/pages/feed.test.tsx +73 -0
- package/templates/apps/frontend-ssr/src/pages/feed.tsx +64 -0
- package/templates/apps/frontend-ssr/src/pages/index.test.tsx +89 -0
- package/templates/apps/frontend-ssr/src/pages/index.tsx +72 -0
- package/templates/apps/frontend-ssr/src/pages/layout.tsx +37 -0
- package/templates/apps/frontend-ssr/template.json +6 -0
- package/templates/apps/frontend-ssr/tsconfig.json +11 -0
- package/templates/apps/frontend-ssr-api/README.md +50 -0
- package/templates/apps/frontend-ssr-api/app.config.ts +43 -0
- package/templates/apps/frontend-ssr-api/package.json +30 -0
- package/templates/apps/frontend-ssr-api/src/globals.css +38 -0
- package/templates/apps/frontend-ssr-api/src/globals.d.ts +6 -0
- package/templates/apps/frontend-ssr-api/src/locales/de.ts +20 -0
- package/templates/apps/frontend-ssr-api/src/locales/en.ts +31 -0
- package/templates/apps/frontend-ssr-api/src/locales/index.ts +16 -0
- package/templates/apps/frontend-ssr-api/src/pages/index.test.tsx +105 -0
- package/templates/apps/frontend-ssr-api/src/pages/index.tsx +83 -0
- package/templates/apps/frontend-ssr-api/src/pages/layout.tsx +28 -0
- package/templates/apps/frontend-ssr-api/template.json +6 -0
- package/templates/apps/frontend-ssr-api/tsconfig.json +11 -0
- package/templates/apps/frontend-static-blog/README.md +49 -0
- package/templates/apps/frontend-static-blog/app.config.ts +34 -0
- package/templates/apps/frontend-static-blog/package.json +28 -0
- package/templates/apps/frontend-static-blog/src/components/ReadingProgress.island.test.tsx +65 -0
- package/templates/apps/frontend-static-blog/src/components/ReadingProgress.island.tsx +35 -0
- package/templates/apps/frontend-static-blog/src/content/posts.ts +64 -0
- package/templates/apps/frontend-static-blog/src/globals.css +75 -0
- package/templates/apps/frontend-static-blog/src/lib/locale.test.ts +72 -0
- package/templates/apps/frontend-static-blog/src/lib/locale.ts +55 -0
- package/templates/apps/frontend-static-blog/src/locales/de.ts +19 -0
- package/templates/apps/frontend-static-blog/src/locales/en.ts +26 -0
- package/templates/apps/frontend-static-blog/src/pages/[locale]/blog/[slug].tsx +20 -0
- package/templates/apps/frontend-static-blog/src/pages/[locale]/index.tsx +13 -0
- package/templates/apps/frontend-static-blog/src/pages/[locale]/mirrors.test.tsx +62 -0
- package/templates/apps/frontend-static-blog/src/pages/blog/[slug].test.tsx +116 -0
- package/templates/apps/frontend-static-blog/src/pages/blog/[slug].tsx +69 -0
- package/templates/apps/frontend-static-blog/src/pages/index.test.tsx +100 -0
- package/templates/apps/frontend-static-blog/src/pages/index.tsx +58 -0
- package/templates/apps/frontend-static-blog/src/pages/layout.tsx +63 -0
- package/templates/apps/frontend-static-blog/template.json +6 -0
- package/templates/apps/frontend-static-blog/tsconfig.json +11 -0
- package/templates/baselines/bare/.env.example +37 -0
- package/templates/baselines/bare/README.md +47 -0
- package/templates/baselines/bare/baseline.json +31 -0
- package/templates/baselines/bare/deploy/README.md +43 -0
- package/templates/baselines/bare/deploy/voltro.service.example +36 -0
- package/templates/baselines/compose/.env.example +46 -0
- package/templates/baselines/compose/README.md +69 -0
- package/templates/baselines/compose/baseline.json +51 -0
- package/templates/baselines/compose/docker/.dockerignore +38 -0
- package/templates/baselines/compose/docker/api.Dockerfile +57 -0
- package/templates/baselines/compose/docker/dev.Dockerfile +35 -0
- package/templates/baselines/compose/docker/web.Dockerfile +59 -0
- package/templates/baselines/compose/docker-compose.dev.yml +89 -0
- package/templates/baselines/compose/docker-compose.prod.yml +87 -0
- package/templates/baselines/compose/docker-compose.yml +41 -0
- package/templates/baselines/compose-mariadb/.env.example +57 -0
- package/templates/baselines/compose-mariadb/README.md +78 -0
- package/templates/baselines/compose-mariadb/baseline.json +51 -0
- package/templates/baselines/compose-mariadb/docker/.dockerignore +38 -0
- package/templates/baselines/compose-mariadb/docker/api.Dockerfile +57 -0
- package/templates/baselines/compose-mariadb/docker/dev.Dockerfile +35 -0
- package/templates/baselines/compose-mariadb/docker/mariadb-init.sql +6 -0
- package/templates/baselines/compose-mariadb/docker/web.Dockerfile +59 -0
- package/templates/baselines/compose-mariadb/docker-compose.dev.yml +117 -0
- package/templates/baselines/compose-mariadb/docker-compose.prod.yml +114 -0
- package/templates/baselines/compose-mariadb/docker-compose.yml +79 -0
- package/templates/baselines/helm/.env.example +39 -0
- package/templates/baselines/helm/README.md +98 -0
- package/templates/baselines/helm/baseline.json +53 -0
- package/templates/baselines/helm/charts/voltro-app/.helmignore +10 -0
- package/templates/baselines/helm/charts/voltro-app/Chart.yaml +10 -0
- package/templates/baselines/helm/charts/voltro-app/templates/_helpers.tpl +36 -0
- package/templates/baselines/helm/charts/voltro-app/templates/configmap.yaml +13 -0
- package/templates/baselines/helm/charts/voltro-app/templates/deployment-api.yaml +120 -0
- package/templates/baselines/helm/charts/voltro-app/templates/deployment-web.yaml +45 -0
- package/templates/baselines/helm/charts/voltro-app/templates/ingress.yaml +37 -0
- package/templates/baselines/helm/charts/voltro-app/templates/postgres-service.yaml +19 -0
- package/templates/baselines/helm/charts/voltro-app/templates/postgres-statefulset.yaml +73 -0
- package/templates/baselines/helm/charts/voltro-app/templates/secret.yaml +33 -0
- package/templates/baselines/helm/charts/voltro-app/templates/service-api.yaml +19 -0
- package/templates/baselines/helm/charts/voltro-app/templates/service-web.yaml +19 -0
- package/templates/baselines/helm/charts/voltro-app/values-dev.yaml +21 -0
- package/templates/baselines/helm/charts/voltro-app/values-prod.yaml +58 -0
- package/templates/baselines/helm/charts/voltro-app/values-staging.yaml +25 -0
- package/templates/baselines/helm/charts/voltro-app/values.yaml +109 -0
- package/templates/baselines/helm/deploy/README.md +94 -0
- package/templates/patches/@effect__cluster@0.59.0.patch +262 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// Root layout — wraps every page. Strategy B (URL-prefix i18n): an INNER
|
|
2
|
+
// <I18nProvider> reads the locale FROM THE URL, so `voltro build` pre-renders
|
|
3
|
+
// each page once per locale (en at the bare path, de under /de) with the right
|
|
4
|
+
// catalog baked into the static HTML.
|
|
5
|
+
//
|
|
6
|
+
// The language switcher is a plain <a> per locale — a real browser navigation
|
|
7
|
+
// to the other locale's crawlable URL. That is exactly right for a static
|
|
8
|
+
// content site: the index is `interactive: 'none'` (zero JS) and the post
|
|
9
|
+
// pages hydrate only their island, so there is no client runtime to swap
|
|
10
|
+
// catalogs in place; a hard nav to the pre-rendered variant is the whole point.
|
|
11
|
+
//
|
|
12
|
+
// `<html>`/`<head>`/`<body>` belong to the framework's index.html shell;
|
|
13
|
+
// render only the in-document chrome here.
|
|
14
|
+
|
|
15
|
+
import type { ReactNode } from 'react'
|
|
16
|
+
import { I18nProvider, T } from '@voltro/i18n'
|
|
17
|
+
import { useLocation } from '@voltro/web'
|
|
18
|
+
import {
|
|
19
|
+
CATALOGS,
|
|
20
|
+
DEFAULT_LOCALE,
|
|
21
|
+
SUPPORTED_LOCALES,
|
|
22
|
+
stripLocalePrefix,
|
|
23
|
+
useUrlLocale,
|
|
24
|
+
withLocalePrefix,
|
|
25
|
+
} from '../lib/locale'
|
|
26
|
+
import '../globals.css'
|
|
27
|
+
|
|
28
|
+
function SiteHeader(): ReactNode {
|
|
29
|
+
const locale = useUrlLocale()
|
|
30
|
+
// The path WITHOUT its locale prefix, so switching language keeps you on the
|
|
31
|
+
// same page (e.g. /de/blog/x → /blog/x, then re-prefixed per locale).
|
|
32
|
+
const barePath = stripLocalePrefix(useLocation())
|
|
33
|
+
return (
|
|
34
|
+
<header className="site-header">
|
|
35
|
+
<a className="brand" href={withLocalePrefix('/', locale)}>{{capProjectName}}</a>
|
|
36
|
+
<span className="spacer" />
|
|
37
|
+
<span className="lang">
|
|
38
|
+
<span className="label">
|
|
39
|
+
<T id="nav.language" />:
|
|
40
|
+
</span>
|
|
41
|
+
{SUPPORTED_LOCALES.map((code) => (
|
|
42
|
+
<a
|
|
43
|
+
key={code}
|
|
44
|
+
href={withLocalePrefix(barePath, code)}
|
|
45
|
+
aria-current={code === locale ? 'true' : undefined}
|
|
46
|
+
>
|
|
47
|
+
{code.toUpperCase()}
|
|
48
|
+
</a>
|
|
49
|
+
))}
|
|
50
|
+
</span>
|
|
51
|
+
</header>
|
|
52
|
+
)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export default function Layout({ children }: { readonly children: ReactNode }): ReactNode {
|
|
56
|
+
const locale = useUrlLocale()
|
|
57
|
+
return (
|
|
58
|
+
<I18nProvider locale={locale} messages={CATALOGS[locale]} defaultLocale={DEFAULT_LOCALE}>
|
|
59
|
+
<SiteHeader />
|
|
60
|
+
{children}
|
|
61
|
+
</I18nProvider>
|
|
62
|
+
)
|
|
63
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "frontend-static-blog",
|
|
3
|
+
"kind": "web",
|
|
4
|
+
"summary": "Static SSG blog: dynamic [slug] routes pre-rendered at build via getStaticPaths from a content source (the CMS→static pattern), per-post meta from loaderData, and ONE island (reading-progress bar) showing selective hydration. No backend.",
|
|
5
|
+
"tags": ["web", "frontend", "static", "ssg", "blog", "getStaticPaths", "islands", "content"]
|
|
6
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../../tsconfig.base.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"jsx": "react-jsx",
|
|
5
|
+
"lib": ["ES2024", "DOM", "DOM.Iterable"],
|
|
6
|
+
"module": "ESNext",
|
|
7
|
+
"moduleResolution": "Bundler"
|
|
8
|
+
},
|
|
9
|
+
"include": ["src/**/*"],
|
|
10
|
+
"exclude": ["node_modules", "dist", ".framework"]
|
|
11
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Voltro local env — bare baseline.
|
|
2
|
+
#
|
|
3
|
+
# The Voltro CLI auto-loads .env from each app dir + every ancestor
|
|
4
|
+
# at boot (see voltro/packages/cli/src/bin.ts). Shell exports always
|
|
5
|
+
# override .env values, so CI can set DB_URL via env without touching
|
|
6
|
+
# this file.
|
|
7
|
+
|
|
8
|
+
# Postgres connection. Bring your own (host install, docker run,
|
|
9
|
+
# cloud provider URL).
|
|
10
|
+
DB_URL=postgres://app:app@localhost:5432/{{projectName}}
|
|
11
|
+
|
|
12
|
+
# Session signing secret. The plugin-auth handlers refuse to mint
|
|
13
|
+
# sessions without it. Rotate before shipping.
|
|
14
|
+
VOLTRO_SESSION_SECRET=dev-only-secret-please-rotate-in-prod
|
|
15
|
+
|
|
16
|
+
# ─── Optional backends — ALL OFF by default; uncomment to activate ───────────
|
|
17
|
+
# The cache and the durable KV each run on a zero-infra default (in-process
|
|
18
|
+
# memory / your SQL store). Point either at a RESP server (Redis / Valkey /
|
|
19
|
+
# KeyDB / Dragonfly / Upstash) ONLY when you want cross-instance sharing.
|
|
20
|
+
# Enablement is per concern — a bare REDIS_URL is NOT a master switch; each
|
|
21
|
+
# concern reads its own <NAME>_REDIS_URL first, then a shared REDIS_URL.
|
|
22
|
+
|
|
23
|
+
# @voltro/cache → Redis: a distributed query/result cache. `voltro add redis`
|
|
24
|
+
# wires this for you (flips app.config `cache: 'redis'` + adds the infra).
|
|
25
|
+
# CACHE_BACKEND=redis
|
|
26
|
+
# CACHE_REDIS_URL=redis://localhost:6379
|
|
27
|
+
|
|
28
|
+
# @voltro/kv → Redis: durable `ctx.kv`. Default backend is `database`
|
|
29
|
+
# (durable, shared across replicas, survives restarts) — leave it unless you
|
|
30
|
+
# specifically want KV on Redis. If you do, use a PERSISTENT redis (AOF/RDB),
|
|
31
|
+
# NOT an ephemeral cache-only one: an eviction/restart is data loss for
|
|
32
|
+
# durable KV. See docs → Caching → Key-value backends.
|
|
33
|
+
# KV_BACKEND=redis
|
|
34
|
+
# KV_REDIS_URL=redis://localhost:6379
|
|
35
|
+
|
|
36
|
+
# One server for everything, instead of the per-concern URLs above:
|
|
37
|
+
# REDIS_URL=redis://localhost:6379
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Bare baseline
|
|
2
|
+
|
|
3
|
+
Native Node + pnpm. No containers, no orchestration. You bring your
|
|
4
|
+
own Postgres.
|
|
5
|
+
|
|
6
|
+
## What this baseline gives you
|
|
7
|
+
|
|
8
|
+
- `.env.example` — the env vars Voltro reads on boot, with sane
|
|
9
|
+
defaults for a local install.
|
|
10
|
+
- `deploy/voltro.service.example` — a sample systemd unit you can
|
|
11
|
+
copy to `/etc/systemd/system/voltro.service` on a VPS and adjust.
|
|
12
|
+
- `deploy/README.md` — short notes on rolling-your-own deploy.
|
|
13
|
+
|
|
14
|
+
That's it. No `Dockerfile`, no `docker-compose.yml`, no
|
|
15
|
+
`charts/`. By design.
|
|
16
|
+
|
|
17
|
+
## What you have to do
|
|
18
|
+
|
|
19
|
+
### Local dev
|
|
20
|
+
|
|
21
|
+
1. Install Postgres locally (`brew install postgresql@17`,
|
|
22
|
+
`apt install postgresql-17`, or run a one-off
|
|
23
|
+
`docker run postgres:17-alpine -p 5432:5432 ...`).
|
|
24
|
+
2. Create the database: `createdb voltro_local`
|
|
25
|
+
3. Copy env: `cp .env.example .env` and edit `DB_URL`.
|
|
26
|
+
4. `pnpm install && pnpm dev`
|
|
27
|
+
|
|
28
|
+
### Production deploy
|
|
29
|
+
|
|
30
|
+
You're on your own. Common approaches:
|
|
31
|
+
|
|
32
|
+
- **systemd on a VPS** — see `deploy/voltro.service.example` for a
|
|
33
|
+
starting unit. `pnpm voltro build .` per app, copy `dist/` over,
|
|
34
|
+
enable + start the unit.
|
|
35
|
+
- **PM2 / Forever / Nodemon** — wraps the same `node dist/...`
|
|
36
|
+
command with auto-restart.
|
|
37
|
+
- **Cloud Run / Fly.io / Render** — these will want a `Dockerfile`
|
|
38
|
+
anyway. If you're going that route, switch to the **compose**
|
|
39
|
+
baseline: `voltro baseline set compose`.
|
|
40
|
+
|
|
41
|
+
## Switching baselines
|
|
42
|
+
|
|
43
|
+
Run `voltro baseline set compose` to add Docker / `voltro baseline
|
|
44
|
+
set helm` to add a Helm chart. The switch writes the new baseline's
|
|
45
|
+
files and backs up your current `.env.example` + any conflicting
|
|
46
|
+
files to `.voltro-baseline-backup/<timestamp>/`. Your application
|
|
47
|
+
code is never touched.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "bare",
|
|
3
|
+
"displayName": "Bare",
|
|
4
|
+
"summary": "Native Node + pnpm only. No containers, no orchestration. You bring your own Postgres (host install, cloud provider, or external Docker).",
|
|
5
|
+
"tags": ["native", "minimal", "starter"],
|
|
6
|
+
"recommendedFor": "Solo devs, prototyping, environments where Docker is unavailable or undesired.",
|
|
7
|
+
"tradeoffs": {
|
|
8
|
+
"pros": [
|
|
9
|
+
"Fastest HMR — native fs.watch (<50ms)",
|
|
10
|
+
"Lowest memory overhead",
|
|
11
|
+
"Native TypeScript LSP + debugger",
|
|
12
|
+
"No image-build step"
|
|
13
|
+
],
|
|
14
|
+
"cons": [
|
|
15
|
+
"Postgres setup is your problem (brew/apt/docker-on-the-side)",
|
|
16
|
+
"Onboarding new devs requires per-dev environment setup",
|
|
17
|
+
"Deploy story = whatever you build (systemd? PM2? rolling-yours?)"
|
|
18
|
+
]
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
".env.example",
|
|
22
|
+
"deploy/README.md",
|
|
23
|
+
"deploy/voltro.service.example"
|
|
24
|
+
],
|
|
25
|
+
"packageJsonScripts": {
|
|
26
|
+
"dev": "turbo run dev",
|
|
27
|
+
"build": "turbo run build",
|
|
28
|
+
"test": "turbo run test",
|
|
29
|
+
"typecheck": "turbo run typecheck"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Deploy notes — bare baseline
|
|
2
|
+
|
|
3
|
+
You are running native Node, so deploy is "ship the built `dist/`
|
|
4
|
+
to a host that has Node 24 + pnpm".
|
|
5
|
+
|
|
6
|
+
## systemd on a Linux VPS
|
|
7
|
+
|
|
8
|
+
1. Build on a build host (or in CI):
|
|
9
|
+
```sh
|
|
10
|
+
pnpm install --frozen-lockfile
|
|
11
|
+
pnpm voltro build . # per app
|
|
12
|
+
```
|
|
13
|
+
2. Rsync the project to the target host.
|
|
14
|
+
3. Install Postgres on the host (or point `DB_URL` at a managed
|
|
15
|
+
service like RDS / Supabase / Neon).
|
|
16
|
+
4. Copy `deploy/voltro.service.example` to
|
|
17
|
+
`/etc/systemd/system/voltro-{{appName}}.service`, adjust the
|
|
18
|
+
`WorkingDirectory` and `EnvironmentFile`, then:
|
|
19
|
+
```sh
|
|
20
|
+
sudo systemctl daemon-reload
|
|
21
|
+
sudo systemctl enable --now voltro-{{appName}}
|
|
22
|
+
sudo systemctl status voltro-{{appName}}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Per-app you'll want one unit. systemd handles restarts, env file
|
|
26
|
+
loading, journald log capture.
|
|
27
|
+
|
|
28
|
+
## PM2
|
|
29
|
+
|
|
30
|
+
```sh
|
|
31
|
+
pm2 start "pnpm voltro start ." --name {{appName}} --cwd apps/{{appName}}
|
|
32
|
+
pm2 save
|
|
33
|
+
pm2 startup
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Easier than systemd, more moving parts.
|
|
37
|
+
|
|
38
|
+
## When to switch to compose
|
|
39
|
+
|
|
40
|
+
If your deploy story includes more than one app + a Postgres, and
|
|
41
|
+
you're going to want CI to build images, switch to the **compose**
|
|
42
|
+
baseline. The native deploy story stays the same as a fallback
|
|
43
|
+
either way — switching baselines doesn't ban Node-native runs.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# systemd unit example for a Voltro app on a Linux VPS.
|
|
2
|
+
#
|
|
3
|
+
# Copy to /etc/systemd/system/voltro-<appName>.service and adjust
|
|
4
|
+
# the paths + User + EnvironmentFile to match your install.
|
|
5
|
+
#
|
|
6
|
+
# sudo cp deploy/voltro.service.example \
|
|
7
|
+
# /etc/systemd/system/voltro-{{appName}}.service
|
|
8
|
+
# sudo systemctl daemon-reload
|
|
9
|
+
# sudo systemctl enable --now voltro-{{appName}}
|
|
10
|
+
# sudo journalctl -u voltro-{{appName}} -f
|
|
11
|
+
|
|
12
|
+
[Unit]
|
|
13
|
+
Description=Voltro app: {{appName}}
|
|
14
|
+
After=network-online.target postgresql.service
|
|
15
|
+
Wants=network-online.target
|
|
16
|
+
|
|
17
|
+
[Service]
|
|
18
|
+
Type=simple
|
|
19
|
+
User=voltro
|
|
20
|
+
Group=voltro
|
|
21
|
+
WorkingDirectory=/opt/{{projectName}}/apps/{{appName}}
|
|
22
|
+
EnvironmentFile=/opt/{{projectName}}/apps/{{appName}}/.env
|
|
23
|
+
ExecStart=/usr/bin/pnpm voltro start .
|
|
24
|
+
Restart=on-failure
|
|
25
|
+
RestartSec=5
|
|
26
|
+
StandardOutput=journal
|
|
27
|
+
StandardError=journal
|
|
28
|
+
|
|
29
|
+
# Hardening — adjust as your host allows
|
|
30
|
+
NoNewPrivileges=true
|
|
31
|
+
ProtectSystem=strict
|
|
32
|
+
ProtectHome=true
|
|
33
|
+
ReadWritePaths=/opt/{{projectName}}
|
|
34
|
+
|
|
35
|
+
[Install]
|
|
36
|
+
WantedBy=multi-user.target
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Voltro local env — compose baseline.
|
|
2
|
+
#
|
|
3
|
+
# The Voltro CLI auto-loads .env from each app dir + every ancestor
|
|
4
|
+
# at boot (see voltro/packages/cli/src/bin.ts). Shell exports always
|
|
5
|
+
# override .env values, so CI can set DB_URL via env without touching
|
|
6
|
+
# this file.
|
|
7
|
+
|
|
8
|
+
# Postgres connection — points at the postgres service in
|
|
9
|
+
# docker-compose.yml (port 5433 to avoid clashing with a host pg on 5432).
|
|
10
|
+
# When you run inside the docker network (dev:docker / prod:up), the
|
|
11
|
+
# host is `postgres`. When you run native (pnpm dev with pnpm db:up),
|
|
12
|
+
# the host is `localhost` and port stays 5433.
|
|
13
|
+
DB_URL=postgres://app:app@localhost:5433/{{projectName}}
|
|
14
|
+
|
|
15
|
+
# Used by prod:up — required, no dev fallback.
|
|
16
|
+
VOLTRO_SESSION_SECRET=dev-only-secret-please-rotate-in-prod
|
|
17
|
+
|
|
18
|
+
# Used by docker-compose.prod.yml — the prod postgres uses a
|
|
19
|
+
# different password from dev (intentional: avoid `db:reset` blowing
|
|
20
|
+
# away the prod-shape dataset by accident).
|
|
21
|
+
POSTGRES_PASSWORD=change-me-in-prod
|
|
22
|
+
|
|
23
|
+
# ─── Optional backends — ALL OFF by default; uncomment to activate ───────────
|
|
24
|
+
# The cache and the durable KV each run on a zero-infra default (in-process
|
|
25
|
+
# memory / your SQL store). Point either at a RESP server (Redis / Valkey /
|
|
26
|
+
# KeyDB / Dragonfly / Upstash) ONLY when you want cross-instance sharing.
|
|
27
|
+
# Enablement is per concern — a bare REDIS_URL is NOT a master switch; each
|
|
28
|
+
# concern reads its own <NAME>_REDIS_URL first, then a shared REDIS_URL.
|
|
29
|
+
|
|
30
|
+
# @voltro/cache → Redis: a distributed query/result cache. Easiest path:
|
|
31
|
+
# `voltro add redis` uncomments these AND injects a `redis` service into
|
|
32
|
+
# docker-compose.yml; then `docker compose up -d redis` and reboot.
|
|
33
|
+
# CACHE_BACKEND=redis
|
|
34
|
+
# CACHE_REDIS_URL=redis://localhost:6379
|
|
35
|
+
|
|
36
|
+
# @voltro/kv → Redis: durable `ctx.kv`. Default backend is `database`
|
|
37
|
+
# (durable, shared across replicas, survives restarts) — leave it unless you
|
|
38
|
+
# specifically want KV on Redis. If you do, use a PERSISTENT redis (AOF/RDB),
|
|
39
|
+
# NOT the ephemeral cache service `voltro add redis` provisions: an
|
|
40
|
+
# eviction/restart is data loss for durable KV. See docs → Caching → Key-value
|
|
41
|
+
# backends.
|
|
42
|
+
# KV_BACKEND=redis
|
|
43
|
+
# KV_REDIS_URL=redis://localhost:6379
|
|
44
|
+
|
|
45
|
+
# One server for everything, instead of the per-concern URLs above:
|
|
46
|
+
# REDIS_URL=redis://localhost:6379
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Compose baseline
|
|
2
|
+
|
|
3
|
+
Three docker-compose files + two Dockerfiles. Postgres included.
|
|
4
|
+
Two flavours: dev with volume-mounted HMR, prod with built images.
|
|
5
|
+
|
|
6
|
+
## Layout
|
|
7
|
+
|
|
8
|
+
```
|
|
9
|
+
.
|
|
10
|
+
├── docker/
|
|
11
|
+
│ ├── api.Dockerfile # multi-stage: deps + builder + prod
|
|
12
|
+
│ ├── web.Dockerfile # multi-stage: deps + builder + prod
|
|
13
|
+
│ └── .dockerignore
|
|
14
|
+
├── docker-compose.yml # postgres only — the "infra" file
|
|
15
|
+
├── docker-compose.dev.yml # postgres + apps in dev mode
|
|
16
|
+
└── docker-compose.prod.yml # postgres + apps in prod (built images)
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Common flows
|
|
20
|
+
|
|
21
|
+
### Daily dev — fastest
|
|
22
|
+
|
|
23
|
+
```sh
|
|
24
|
+
pnpm db:up # boot postgres only
|
|
25
|
+
pnpm dev # turbo run dev, native node, HMR <50ms
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Daily dev — full-docker (slower HMR but zero host install)
|
|
29
|
+
|
|
30
|
+
```sh
|
|
31
|
+
pnpm dev:docker # boots postgres + all apps in containers
|
|
32
|
+
pnpm dev:docker:down # stop everything
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Production smoke-test on localhost
|
|
36
|
+
|
|
37
|
+
```sh
|
|
38
|
+
pnpm prod:build # build all images (slow first run, ~5 min)
|
|
39
|
+
pnpm prod:up # boot the prod stack
|
|
40
|
+
pnpm prod:down # tear down
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## When to add apps
|
|
44
|
+
|
|
45
|
+
The shipped compose files cover ONE api + ONE web by default. As you
|
|
46
|
+
add apps to `apps/`, mirror the pattern in both `docker-compose.dev.yml`
|
|
47
|
+
and `docker-compose.prod.yml`: copy a service block, change its
|
|
48
|
+
`working_dir` / `APP_PATH` / port.
|
|
49
|
+
|
|
50
|
+
A future `voltro baseline sync` will auto-regenerate the service
|
|
51
|
+
blocks from your `project.json` / `app.config.ts` files. Until then,
|
|
52
|
+
hand-edit.
|
|
53
|
+
|
|
54
|
+
## What's NOT in here
|
|
55
|
+
|
|
56
|
+
- No CI configs (GitHub Actions / GitLab CI). Each provider's syntax
|
|
57
|
+
is different; we don't pick a winner.
|
|
58
|
+
- No reverse proxy (Traefik / nginx / Caddy). If you need one in
|
|
59
|
+
prod, add it as a service in `docker-compose.prod.yml`.
|
|
60
|
+
- No Redis, S3-emulator, or other infra. Add as needed.
|
|
61
|
+
|
|
62
|
+
## Switching baselines
|
|
63
|
+
|
|
64
|
+
`voltro baseline set helm` → swaps to Helm chart + Kustomize overlays.
|
|
65
|
+
`voltro baseline set bare` → removes docker-compose entirely.
|
|
66
|
+
|
|
67
|
+
Either switch backs up the current docker-compose files + Dockerfiles
|
|
68
|
+
to `.voltro-baseline-backup/<timestamp>/`. Application code is never
|
|
69
|
+
touched.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "compose",
|
|
3
|
+
"displayName": "Docker Compose",
|
|
4
|
+
"summary": "Full stack via docker-compose: separate dev (volume-mounted HMR) and prod (built images) variants. Postgres included.",
|
|
5
|
+
"tags": ["docker", "compose", "dev", "prod"],
|
|
6
|
+
"recommendedFor": "Teams without k8s; VPS or self-hosted deploys; reproducible onboarding for new devs.",
|
|
7
|
+
"tradeoffs": {
|
|
8
|
+
"pros": [
|
|
9
|
+
"Zero-host-install: docker + git is all you need to run the stack",
|
|
10
|
+
"Prod-parity smoke-tests locally via `prod:up`",
|
|
11
|
+
"Onboarding new devs is `pnpm dev:docker` after clone",
|
|
12
|
+
"Postgres, Redis, S3-emulators etc. are trivial additions"
|
|
13
|
+
],
|
|
14
|
+
"cons": [
|
|
15
|
+
"HMR through volumes is slower than native (200-2000ms vs <50ms, esp. on macOS)",
|
|
16
|
+
"Requires per-app Dockerfile maintenance",
|
|
17
|
+
"Docker Desktop adds ~3GB memory overhead on macOS/Windows",
|
|
18
|
+
"First-time image build for prod variant is slow (5+ minutes)"
|
|
19
|
+
]
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
".env.example",
|
|
23
|
+
"docker/api.Dockerfile",
|
|
24
|
+
"docker/web.Dockerfile",
|
|
25
|
+
"docker/dev.Dockerfile",
|
|
26
|
+
"docker/.dockerignore",
|
|
27
|
+
"docker-compose.yml",
|
|
28
|
+
"docker-compose.dev.yml",
|
|
29
|
+
"docker-compose.prod.yml"
|
|
30
|
+
],
|
|
31
|
+
"packageJsonScripts": {
|
|
32
|
+
"dev": "turbo run dev",
|
|
33
|
+
"dev:hybrid": "docker compose up -d --wait postgres && turbo run dev",
|
|
34
|
+
"dev:docker": "HOST_UID=$(id -u) HOST_GID=$(id -g) docker compose -f docker-compose.dev.yml up",
|
|
35
|
+
"dev:docker:bg": "HOST_UID=$(id -u) HOST_GID=$(id -g) docker compose -f docker-compose.dev.yml up -d",
|
|
36
|
+
"dev:docker:down": "docker compose -f docker-compose.dev.yml down",
|
|
37
|
+
"dev:docker:logs": "docker compose -f docker-compose.dev.yml logs -f",
|
|
38
|
+
"build": "turbo run build",
|
|
39
|
+
"test": "turbo run test",
|
|
40
|
+
"typecheck": "turbo run typecheck",
|
|
41
|
+
"db:up": "docker compose up -d --wait postgres",
|
|
42
|
+
"db:down": "docker compose stop postgres",
|
|
43
|
+
"db:reset": "docker compose down -v postgres && docker compose up -d --wait postgres",
|
|
44
|
+
"db:logs": "docker compose logs -f postgres",
|
|
45
|
+
"db:psql": "docker compose exec postgres psql -U app -d {{projectNameSnake}}",
|
|
46
|
+
"prod:build": "docker compose -f docker-compose.prod.yml build",
|
|
47
|
+
"prod:up": "docker compose -f docker-compose.prod.yml up -d",
|
|
48
|
+
"prod:down": "docker compose -f docker-compose.prod.yml down",
|
|
49
|
+
"prod:logs": "docker compose -f docker-compose.prod.yml logs -f"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Build context excludes — keep image size sane.
|
|
2
|
+
#
|
|
3
|
+
# Most of these are obvious noise. Customize per project if you
|
|
4
|
+
# have additional generated dirs to exclude.
|
|
5
|
+
|
|
6
|
+
**/node_modules
|
|
7
|
+
**/dist
|
|
8
|
+
**/.turbo
|
|
9
|
+
**/.next
|
|
10
|
+
**/.vite
|
|
11
|
+
**/.cache
|
|
12
|
+
**/coverage
|
|
13
|
+
|
|
14
|
+
**/.env
|
|
15
|
+
**/.env.local
|
|
16
|
+
**/.env.*.local
|
|
17
|
+
**/.voltro
|
|
18
|
+
**/.voltro-baseline-backup
|
|
19
|
+
|
|
20
|
+
**/.git
|
|
21
|
+
**/.gitignore.local
|
|
22
|
+
|
|
23
|
+
**/.vscode
|
|
24
|
+
**/.idea
|
|
25
|
+
**/*.swp
|
|
26
|
+
**/*.swo
|
|
27
|
+
|
|
28
|
+
**/*.log
|
|
29
|
+
**/npm-debug.log*
|
|
30
|
+
**/yarn-debug.log*
|
|
31
|
+
**/yarn-error.log*
|
|
32
|
+
|
|
33
|
+
**/.DS_Store
|
|
34
|
+
**/Thumbs.db
|
|
35
|
+
|
|
36
|
+
**/Dockerfile*
|
|
37
|
+
**/docker-compose*.yml
|
|
38
|
+
**/.dockerignore
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# API service Dockerfile for {{projectName}}'s Node-based api apps.
|
|
2
|
+
#
|
|
3
|
+
# Build context = project root (where pnpm-workspace.yaml lives).
|
|
4
|
+
# The `.dockerignore` next to this file aggressively excludes noise.
|
|
5
|
+
#
|
|
6
|
+
# Build args:
|
|
7
|
+
# APP_PATH — path relative to context where the api lives.
|
|
8
|
+
# e.g. apps/{{projectName}}/api
|
|
9
|
+
#
|
|
10
|
+
# Targets:
|
|
11
|
+
# prod — production image (this file's only target; dev uses
|
|
12
|
+
# node:24-alpine directly via docker-compose.dev.yml so
|
|
13
|
+
# code mounts work without an image-build step).
|
|
14
|
+
#
|
|
15
|
+
# Build:
|
|
16
|
+
# docker build \
|
|
17
|
+
# -f docker/api.Dockerfile \
|
|
18
|
+
# --build-arg APP_PATH=apps/{{projectName}}/api \
|
|
19
|
+
# -t {{projectName}}-api:latest \
|
|
20
|
+
# .
|
|
21
|
+
|
|
22
|
+
ARG NODE_VERSION=24-alpine
|
|
23
|
+
ARG PNPM_VERSION=10.25.0
|
|
24
|
+
ARG APP_PATH=apps/{{projectName}}/api
|
|
25
|
+
|
|
26
|
+
# ---------- deps stage ----------
|
|
27
|
+
FROM node:${NODE_VERSION} AS deps
|
|
28
|
+
ARG PNPM_VERSION
|
|
29
|
+
RUN corepack enable && corepack prepare pnpm@${PNPM_VERSION} --activate
|
|
30
|
+
WORKDIR /workspace
|
|
31
|
+
|
|
32
|
+
# Copy ONLY what pnpm install needs — lockfile + workspace manifests.
|
|
33
|
+
COPY pnpm-lock.yaml pnpm-workspace.yaml package.json ./
|
|
34
|
+
COPY apps apps
|
|
35
|
+
COPY packages packages
|
|
36
|
+
|
|
37
|
+
RUN pnpm install --frozen-lockfile
|
|
38
|
+
|
|
39
|
+
# ---------- builder stage ----------
|
|
40
|
+
FROM deps AS builder
|
|
41
|
+
ARG APP_PATH
|
|
42
|
+
WORKDIR /workspace/${APP_PATH}
|
|
43
|
+
RUN pnpm voltro codegen . || true
|
|
44
|
+
|
|
45
|
+
# ---------- prod runner ----------
|
|
46
|
+
FROM node:${NODE_VERSION} AS prod
|
|
47
|
+
ARG PNPM_VERSION
|
|
48
|
+
ARG APP_PATH
|
|
49
|
+
RUN corepack enable && corepack prepare pnpm@${PNPM_VERSION} --activate
|
|
50
|
+
WORKDIR /workspace
|
|
51
|
+
|
|
52
|
+
COPY --from=builder /workspace /workspace
|
|
53
|
+
|
|
54
|
+
WORKDIR /workspace/${APP_PATH}
|
|
55
|
+
EXPOSE 4000
|
|
56
|
+
ENV NODE_ENV=production
|
|
57
|
+
CMD ["pnpm", "voltro", "start", "."]
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Dev runtime image for {{projectName}}'s node/vite services.
|
|
2
|
+
#
|
|
3
|
+
# Why this exists (vs `image: node:24-alpine` directly in compose):
|
|
4
|
+
#
|
|
5
|
+
# Compose's `user: "${HOST_UID}:${HOST_GID}"` directive runs the
|
|
6
|
+
# container process as the host's UID/GID so files written into the
|
|
7
|
+
# bind-mounted workspace land owned by the host user, not root.
|
|
8
|
+
# That kills the "root-owned .framework/.vite/deps blocks native vite"
|
|
9
|
+
# bug that bites every dev who alternates between full-docker and
|
|
10
|
+
# native pnpm dev.
|
|
11
|
+
#
|
|
12
|
+
# But it also means:
|
|
13
|
+
# - The container has no `/etc/passwd` entry for that numeric UID,
|
|
14
|
+
# so HOME resolves to `/` (read-only for non-root).
|
|
15
|
+
# - `corepack enable` writes to `/usr/local/bin/` (root-owned in the
|
|
16
|
+
# stock node image), which a non-root container can't do.
|
|
17
|
+
#
|
|
18
|
+
# So we PREBAKE pnpm here as root at build time. /usr/local/bin/pnpm
|
|
19
|
+
# becomes world-executable (mode 755) → the non-root runtime user can
|
|
20
|
+
# exec it. HOME=/tmp gives pnpm/npm a writable home for state files.
|
|
21
|
+
#
|
|
22
|
+
# Build:
|
|
23
|
+
# docker build -f docker/dev.Dockerfile -t {{projectName}}-dev .
|
|
24
|
+
# (compose's `build:` does this automatically on first `up`)
|
|
25
|
+
|
|
26
|
+
FROM node:24-alpine
|
|
27
|
+
|
|
28
|
+
RUN corepack enable && corepack prepare pnpm@10.25.0 --activate
|
|
29
|
+
|
|
30
|
+
ENV HOME=/tmp
|
|
31
|
+
ENV PATH=/tmp/.local/bin:$PATH
|
|
32
|
+
|
|
33
|
+
# Don't pin a USER directive here — that would FREEZE the image to a
|
|
34
|
+
# specific UID. Compose's `user: "${HOST_UID}:${HOST_GID}"` is the
|
|
35
|
+
# right place to do that, dynamic per-host.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Web (Vite) Dockerfile for {{projectName}}'s React apps.
|
|
2
|
+
#
|
|
3
|
+
# Build context = project root (where pnpm-workspace.yaml lives).
|
|
4
|
+
# The `.dockerignore` next to this file aggressively excludes noise.
|
|
5
|
+
#
|
|
6
|
+
# Build args:
|
|
7
|
+
# APP_PATH — path relative to context where the web app lives.
|
|
8
|
+
# e.g. apps/{{projectName}}/web
|
|
9
|
+
# APP_PORT — the port the app's `voltro start` listens on.
|
|
10
|
+
# Must match the app's app.config.ts `port` field.
|
|
11
|
+
#
|
|
12
|
+
# Targets:
|
|
13
|
+
# prod — production image (`voltro build .` then `voltro start .`)
|
|
14
|
+
#
|
|
15
|
+
# Build:
|
|
16
|
+
# docker build \
|
|
17
|
+
# -f docker/web.Dockerfile \
|
|
18
|
+
# --build-arg APP_PATH=apps/{{projectName}}/web \
|
|
19
|
+
# --build-arg APP_PORT=5173 \
|
|
20
|
+
# -t {{projectName}}-web:latest \
|
|
21
|
+
# .
|
|
22
|
+
|
|
23
|
+
ARG NODE_VERSION=24-alpine
|
|
24
|
+
ARG PNPM_VERSION=10.25.0
|
|
25
|
+
ARG APP_PATH=apps/{{projectName}}/web
|
|
26
|
+
ARG APP_PORT=5173
|
|
27
|
+
|
|
28
|
+
# ---------- deps stage ----------
|
|
29
|
+
FROM node:${NODE_VERSION} AS deps
|
|
30
|
+
ARG PNPM_VERSION
|
|
31
|
+
RUN corepack enable && corepack prepare pnpm@${PNPM_VERSION} --activate
|
|
32
|
+
WORKDIR /workspace
|
|
33
|
+
|
|
34
|
+
COPY pnpm-lock.yaml pnpm-workspace.yaml package.json ./
|
|
35
|
+
COPY apps apps
|
|
36
|
+
COPY packages packages
|
|
37
|
+
|
|
38
|
+
RUN pnpm install --frozen-lockfile
|
|
39
|
+
|
|
40
|
+
# ---------- builder stage ----------
|
|
41
|
+
FROM deps AS builder
|
|
42
|
+
ARG APP_PATH
|
|
43
|
+
WORKDIR /workspace/${APP_PATH}
|
|
44
|
+
RUN pnpm voltro build .
|
|
45
|
+
|
|
46
|
+
# ---------- prod runner ----------
|
|
47
|
+
FROM node:${NODE_VERSION} AS prod
|
|
48
|
+
ARG PNPM_VERSION
|
|
49
|
+
ARG APP_PATH
|
|
50
|
+
ARG APP_PORT
|
|
51
|
+
RUN corepack enable && corepack prepare pnpm@${PNPM_VERSION} --activate
|
|
52
|
+
WORKDIR /workspace
|
|
53
|
+
|
|
54
|
+
COPY --from=builder /workspace /workspace
|
|
55
|
+
|
|
56
|
+
WORKDIR /workspace/${APP_PATH}
|
|
57
|
+
EXPOSE ${APP_PORT}
|
|
58
|
+
ENV NODE_ENV=production
|
|
59
|
+
CMD ["pnpm", "voltro", "start", "."]
|