iec-cli 0.6.6
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 +159 -0
- package/dist/commands/backup.d.ts +11 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +112 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/config.d.ts +28 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +190 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/deploy.d.ts +16 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +235 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/destroy.d.ts +12 -0
- package/dist/commands/destroy.d.ts.map +1 -0
- package/dist/commands/destroy.js +62 -0
- package/dist/commands/destroy.js.map +1 -0
- package/dist/commands/domains.d.ts +36 -0
- package/dist/commands/domains.d.ts.map +1 -0
- package/dist/commands/domains.js +323 -0
- package/dist/commands/domains.js.map +1 -0
- package/dist/commands/env.d.ts +7 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +42 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/git.d.ts +32 -0
- package/dist/commands/git.d.ts.map +1 -0
- package/dist/commands/git.js +340 -0
- package/dist/commands/git.js.map +1 -0
- package/dist/commands/init-ai.d.ts +7 -0
- package/dist/commands/init-ai.d.ts.map +1 -0
- package/dist/commands/init-ai.js +257 -0
- package/dist/commands/init-ai.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +228 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/link.d.ts +10 -0
- package/dist/commands/link.d.ts.map +1 -0
- package/dist/commands/link.js +193 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/login.d.ts +16 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +468 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logs.d.ts +16 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +362 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/oauth.d.ts +33 -0
- package/dist/commands/oauth.d.ts.map +1 -0
- package/dist/commands/oauth.js +181 -0
- package/dist/commands/oauth.js.map +1 -0
- package/dist/commands/preflight.d.ts +8 -0
- package/dist/commands/preflight.d.ts.map +1 -0
- package/dist/commands/preflight.js +190 -0
- package/dist/commands/preflight.js.map +1 -0
- package/dist/commands/program.d.ts +7 -0
- package/dist/commands/program.d.ts.map +1 -0
- package/dist/commands/program.js +59 -0
- package/dist/commands/program.js.map +1 -0
- package/dist/commands/programs.d.ts +7 -0
- package/dist/commands/programs.d.ts.map +1 -0
- package/dist/commands/programs.js +42 -0
- package/dist/commands/programs.js.map +1 -0
- package/dist/commands/push.d.ts +12 -0
- package/dist/commands/push.d.ts.map +1 -0
- package/dist/commands/push.js +166 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/register-scaffold.test.d.ts +2 -0
- package/dist/commands/register-scaffold.test.d.ts.map +1 -0
- package/dist/commands/register-scaffold.test.js +291 -0
- package/dist/commands/register-scaffold.test.js.map +1 -0
- package/dist/commands/register.d.ts +7 -0
- package/dist/commands/register.d.ts.map +1 -0
- package/dist/commands/register.js +304 -0
- package/dist/commands/register.js.map +1 -0
- package/dist/commands/rollback.d.ts +11 -0
- package/dist/commands/rollback.d.ts.map +1 -0
- package/dist/commands/rollback.js +147 -0
- package/dist/commands/rollback.js.map +1 -0
- package/dist/commands/sample.d.ts +15 -0
- package/dist/commands/sample.d.ts.map +1 -0
- package/dist/commands/sample.js +312 -0
- package/dist/commands/sample.js.map +1 -0
- package/dist/commands/scopes.d.ts +29 -0
- package/dist/commands/scopes.d.ts.map +1 -0
- package/dist/commands/scopes.js +203 -0
- package/dist/commands/scopes.js.map +1 -0
- package/dist/commands/services.d.ts +13 -0
- package/dist/commands/services.d.ts.map +1 -0
- package/dist/commands/services.js +95 -0
- package/dist/commands/services.js.map +1 -0
- package/dist/commands/settings.d.ts +10 -0
- package/dist/commands/settings.d.ts.map +1 -0
- package/dist/commands/settings.js +41 -0
- package/dist/commands/settings.js.map +1 -0
- package/dist/commands/signup.d.ts +9 -0
- package/dist/commands/signup.d.ts.map +1 -0
- package/dist/commands/signup.js +192 -0
- package/dist/commands/signup.js.map +1 -0
- package/dist/commands/status.d.ts +9 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +170 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/troubleshoot.d.ts +19 -0
- package/dist/commands/troubleshoot.d.ts.map +1 -0
- package/dist/commands/troubleshoot.js +465 -0
- package/dist/commands/troubleshoot.js.map +1 -0
- package/dist/commands/update.d.ts +6 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +64 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/user.d.ts +17 -0
- package/dist/commands/user.d.ts.map +1 -0
- package/dist/commands/user.js +126 -0
- package/dist/commands/user.js.map +1 -0
- package/dist/commands/versions.d.ts +16 -0
- package/dist/commands/versions.d.ts.map +1 -0
- package/dist/commands/versions.js +116 -0
- package/dist/commands/versions.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +556 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/__tests__/scaffold-integration.test.d.ts +2 -0
- package/dist/lib/__tests__/scaffold-integration.test.d.ts.map +1 -0
- package/dist/lib/__tests__/scaffold-integration.test.js +321 -0
- package/dist/lib/__tests__/scaffold-integration.test.js.map +1 -0
- package/dist/lib/ai/client.d.ts +39 -0
- package/dist/lib/ai/client.d.ts.map +1 -0
- package/dist/lib/ai/client.js +236 -0
- package/dist/lib/ai/client.js.map +1 -0
- package/dist/lib/ai/generator.d.ts +17 -0
- package/dist/lib/ai/generator.d.ts.map +1 -0
- package/dist/lib/ai/generator.js +338 -0
- package/dist/lib/ai/generator.js.map +1 -0
- package/dist/lib/ai/prompts.d.ts +47 -0
- package/dist/lib/ai/prompts.d.ts.map +1 -0
- package/dist/lib/ai/prompts.js +247 -0
- package/dist/lib/ai/prompts.js.map +1 -0
- package/dist/lib/ai/scanner.d.ts +50 -0
- package/dist/lib/ai/scanner.d.ts.map +1 -0
- package/dist/lib/ai/scanner.js +237 -0
- package/dist/lib/ai/scanner.js.map +1 -0
- package/dist/lib/api.d.ts +18 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +67 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/auto-register.d.ts +12 -0
- package/dist/lib/auto-register.d.ts.map +1 -0
- package/dist/lib/auto-register.js +42 -0
- package/dist/lib/auto-register.js.map +1 -0
- package/dist/lib/bio.d.ts +90 -0
- package/dist/lib/bio.d.ts.map +1 -0
- package/dist/lib/bio.js +247 -0
- package/dist/lib/bio.js.map +1 -0
- package/dist/lib/builder.d.ts +65 -0
- package/dist/lib/builder.d.ts.map +1 -0
- package/dist/lib/builder.js +192 -0
- package/dist/lib/builder.js.map +1 -0
- package/dist/lib/catalog.d.ts +3 -0
- package/dist/lib/catalog.d.ts.map +1 -0
- package/dist/lib/catalog.js +17 -0
- package/dist/lib/catalog.js.map +1 -0
- package/dist/lib/config.d.ts +20 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +124 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/forgejo.d.ts +188 -0
- package/dist/lib/forgejo.d.ts.map +1 -0
- package/dist/lib/forgejo.js +305 -0
- package/dist/lib/forgejo.js.map +1 -0
- package/dist/lib/output.d.ts +12 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +39 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/scaffold.d.ts +30 -0
- package/dist/lib/scaffold.d.ts.map +1 -0
- package/dist/lib/scaffold.js +180 -0
- package/dist/lib/scaffold.js.map +1 -0
- package/dist/lib/scope-requests.d.ts +17 -0
- package/dist/lib/scope-requests.d.ts.map +1 -0
- package/dist/lib/scope-requests.js +78 -0
- package/dist/lib/scope-requests.js.map +1 -0
- package/dist/lib/scope-requests.test.d.ts +2 -0
- package/dist/lib/scope-requests.test.d.ts.map +1 -0
- package/dist/lib/scope-requests.test.js +239 -0
- package/dist/lib/scope-requests.test.js.map +1 -0
- package/dist/lib/troubleshoot/analyzer.d.ts +14 -0
- package/dist/lib/troubleshoot/analyzer.d.ts.map +1 -0
- package/dist/lib/troubleshoot/analyzer.js +541 -0
- package/dist/lib/troubleshoot/analyzer.js.map +1 -0
- package/dist/lib/troubleshoot/auto-fix.d.ts +29 -0
- package/dist/lib/troubleshoot/auto-fix.d.ts.map +1 -0
- package/dist/lib/troubleshoot/auto-fix.js +373 -0
- package/dist/lib/troubleshoot/auto-fix.js.map +1 -0
- package/dist/lib/troubleshoot/index.d.ts +5 -0
- package/dist/lib/troubleshoot/index.d.ts.map +1 -0
- package/dist/lib/troubleshoot/index.js +6 -0
- package/dist/lib/troubleshoot/index.js.map +1 -0
- package/dist/lib/troubleshoot/log-fetcher.d.ts +43 -0
- package/dist/lib/troubleshoot/log-fetcher.d.ts.map +1 -0
- package/dist/lib/troubleshoot/log-fetcher.js +431 -0
- package/dist/lib/troubleshoot/log-fetcher.js.map +1 -0
- package/dist/lib/troubleshoot/redactor.d.ts +35 -0
- package/dist/lib/troubleshoot/redactor.d.ts.map +1 -0
- package/dist/lib/troubleshoot/redactor.js +208 -0
- package/dist/lib/troubleshoot/redactor.js.map +1 -0
- package/dist/lib/validators/catalog-schemas.d.ts +59 -0
- package/dist/lib/validators/catalog-schemas.d.ts.map +1 -0
- package/dist/lib/validators/catalog-schemas.js +32 -0
- package/dist/lib/validators/catalog-schemas.js.map +1 -0
- package/dist/lib/validators/catalog-validator.d.ts +3 -0
- package/dist/lib/validators/catalog-validator.d.ts.map +1 -0
- package/dist/lib/validators/catalog-validator.js +247 -0
- package/dist/lib/validators/catalog-validator.js.map +1 -0
- package/dist/lib/validators/catalog-validator.test.d.ts +2 -0
- package/dist/lib/validators/catalog-validator.test.d.ts.map +1 -0
- package/dist/lib/validators/catalog-validator.test.js +420 -0
- package/dist/lib/validators/catalog-validator.test.js.map +1 -0
- package/dist/lib/validators/dockerfile-validator.d.ts +5 -0
- package/dist/lib/validators/dockerfile-validator.d.ts.map +1 -0
- package/dist/lib/validators/dockerfile-validator.js +295 -0
- package/dist/lib/validators/dockerfile-validator.js.map +1 -0
- package/dist/lib/validators/dockerfile-validator.test.d.ts +2 -0
- package/dist/lib/validators/dockerfile-validator.test.d.ts.map +1 -0
- package/dist/lib/validators/dockerfile-validator.test.js +161 -0
- package/dist/lib/validators/dockerfile-validator.test.js.map +1 -0
- package/dist/lib/validators/env-validator.d.ts +3 -0
- package/dist/lib/validators/env-validator.d.ts.map +1 -0
- package/dist/lib/validators/env-validator.js +268 -0
- package/dist/lib/validators/env-validator.js.map +1 -0
- package/dist/lib/validators/git-validator.d.ts +3 -0
- package/dist/lib/validators/git-validator.d.ts.map +1 -0
- package/dist/lib/validators/git-validator.js +236 -0
- package/dist/lib/validators/git-validator.js.map +1 -0
- package/dist/lib/validators/health-detector.d.ts +4 -0
- package/dist/lib/validators/health-detector.d.ts.map +1 -0
- package/dist/lib/validators/health-detector.js +172 -0
- package/dist/lib/validators/health-detector.js.map +1 -0
- package/dist/lib/validators/health-detector.test.d.ts +2 -0
- package/dist/lib/validators/health-detector.test.d.ts.map +1 -0
- package/dist/lib/validators/health-detector.test.js +118 -0
- package/dist/lib/validators/health-detector.test.js.map +1 -0
- package/dist/lib/validators/index.d.ts +8 -0
- package/dist/lib/validators/index.d.ts.map +1 -0
- package/dist/lib/validators/index.js +8 -0
- package/dist/lib/validators/index.js.map +1 -0
- package/dist/lib/validators/route-validator.d.ts +3 -0
- package/dist/lib/validators/route-validator.d.ts.map +1 -0
- package/dist/lib/validators/route-validator.js +238 -0
- package/dist/lib/validators/route-validator.js.map +1 -0
- package/dist/lib/validators/scope-validator.d.ts +3 -0
- package/dist/lib/validators/scope-validator.d.ts.map +1 -0
- package/dist/lib/validators/scope-validator.js +141 -0
- package/dist/lib/validators/scope-validator.js.map +1 -0
- package/dist/lib/watch.d.ts +35 -0
- package/dist/lib/watch.d.ts.map +1 -0
- package/dist/lib/watch.js +171 -0
- package/dist/lib/watch.js.map +1 -0
- package/dist/templates/api/.env.example +15 -0
- package/dist/templates/api/Dockerfile +45 -0
- package/dist/templates/api/README.md +85 -0
- package/dist/templates/api/catalog-info.yaml +22 -0
- package/dist/templates/api/gitignore +31 -0
- package/dist/templates/api/helm/{{name}}/Chart.yaml +9 -0
- package/dist/templates/api/helm/{{name}}/templates/deployment.yaml +72 -0
- package/dist/templates/api/helm/{{name}}/templates/ingress.yaml +43 -0
- package/dist/templates/api/helm/{{name}}/templates/service.yaml +17 -0
- package/dist/templates/api/helm/{{name}}/values.yaml +64 -0
- package/dist/templates/api/package.json +33 -0
- package/dist/templates/api/src/index.ts +61 -0
- package/dist/templates/api/src/routes/example.ts +165 -0
- package/dist/templates/api/tsconfig.json +18 -0
- package/dist/templates/crosspod/README.md +87 -0
- package/dist/templates/crosspod/service-a/Dockerfile +27 -0
- package/dist/templates/crosspod/service-a/catalog-info.yaml +54 -0
- package/dist/templates/crosspod/service-a/gitignore +5 -0
- package/dist/templates/crosspod/service-a/helm/{{name}}-service-a/Chart.yaml +6 -0
- package/dist/templates/crosspod/service-a/helm/{{name}}-service-a/templates/deployment.yaml +72 -0
- package/dist/templates/crosspod/service-a/helm/{{name}}-service-a/templates/ingress.yaml +43 -0
- package/dist/templates/crosspod/service-a/helm/{{name}}-service-a/templates/service.yaml +17 -0
- package/dist/templates/crosspod/service-a/helm/{{name}}-service-a/values.yaml +44 -0
- package/dist/templates/crosspod/service-a/package.json +29 -0
- package/dist/templates/crosspod/service-a/src/index.ts +89 -0
- package/dist/templates/crosspod/service-a/tsconfig.json +14 -0
- package/dist/templates/crosspod/service-b/Dockerfile +27 -0
- package/dist/templates/crosspod/service-b/catalog-info.yaml +27 -0
- package/dist/templates/crosspod/service-b/gitignore +5 -0
- package/dist/templates/crosspod/service-b/helm/{{name}}-service-b/Chart.yaml +6 -0
- package/dist/templates/crosspod/service-b/helm/{{name}}-service-b/templates/deployment.yaml +72 -0
- package/dist/templates/crosspod/service-b/helm/{{name}}-service-b/templates/ingress.yaml +43 -0
- package/dist/templates/crosspod/service-b/helm/{{name}}-service-b/templates/service.yaml +17 -0
- package/dist/templates/crosspod/service-b/helm/{{name}}-service-b/values.yaml +47 -0
- package/dist/templates/crosspod/service-b/package.json +26 -0
- package/dist/templates/crosspod/service-b/src/index.ts +143 -0
- package/dist/templates/crosspod/service-b/tsconfig.json +14 -0
- package/dist/templates/mga/{{name}}-api/.env.example +5 -0
- package/dist/templates/mga/{{name}}-api/Dockerfile +45 -0
- package/dist/templates/mga/{{name}}-api/catalog-info.yaml +44 -0
- package/dist/templates/mga/{{name}}-api/gitignore +31 -0
- package/dist/templates/mga/{{name}}-api/helm/{{name}}-api/Chart.yaml +9 -0
- package/dist/templates/mga/{{name}}-api/helm/{{name}}-api/templates/deployment.yaml +72 -0
- package/dist/templates/mga/{{name}}-api/helm/{{name}}-api/templates/ingress.yaml +43 -0
- package/dist/templates/mga/{{name}}-api/helm/{{name}}-api/templates/service.yaml +17 -0
- package/dist/templates/mga/{{name}}-api/helm/{{name}}-api/values.yaml +65 -0
- package/dist/templates/mga/{{name}}-api/package.json +37 -0
- package/dist/templates/mga/{{name}}-api/src/index.ts +82 -0
- package/dist/templates/mga/{{name}}-api/src/lib/mongo.ts +19 -0
- package/dist/templates/mga/{{name}}-api/src/middleware/auth.ts +133 -0
- package/dist/templates/mga/{{name}}-api/src/models/agent.ts +45 -0
- package/dist/templates/mga/{{name}}-api/src/models/application.ts +58 -0
- package/dist/templates/mga/{{name}}-api/src/models/invite.ts +39 -0
- package/dist/templates/mga/{{name}}-api/src/models/policy.ts +59 -0
- package/dist/templates/mga/{{name}}-api/src/models/product.ts +51 -0
- package/dist/templates/mga/{{name}}-api/src/models/quote.ts +68 -0
- package/dist/templates/mga/{{name}}-api/src/routes/agents.ts +98 -0
- package/dist/templates/mga/{{name}}-api/src/routes/applications.ts +170 -0
- package/dist/templates/mga/{{name}}-api/src/routes/invites.ts +146 -0
- package/dist/templates/mga/{{name}}-api/src/routes/policies.ts +70 -0
- package/dist/templates/mga/{{name}}-api/src/routes/products.ts +154 -0
- package/dist/templates/mga/{{name}}-api/src/routes/quotes.ts +263 -0
- package/dist/templates/mga/{{name}}-api/src/routes/reports.ts +199 -0
- package/dist/templates/mga/{{name}}-api/tsconfig.json +18 -0
- package/dist/templates/mga/{{name}}-web/.dockerignore +6 -0
- package/dist/templates/mga/{{name}}-web/.env.example +6 -0
- package/dist/templates/mga/{{name}}-web/Dockerfile +51 -0
- package/dist/templates/mga/{{name}}-web/catalog-info.yaml +24 -0
- package/dist/templates/mga/{{name}}-web/dockerignore +6 -0
- package/dist/templates/mga/{{name}}-web/gitignore +36 -0
- package/dist/templates/mga/{{name}}-web/helm/{{name}}-web/Chart.yaml +9 -0
- package/dist/templates/mga/{{name}}-web/helm/{{name}}-web/templates/_helpers.tpl +49 -0
- package/dist/templates/mga/{{name}}-web/helm/{{name}}-web/templates/configmap.yaml +10 -0
- package/dist/templates/mga/{{name}}-web/helm/{{name}}-web/templates/deployment.yaml +56 -0
- package/dist/templates/mga/{{name}}-web/helm/{{name}}-web/templates/ingress.yaml +41 -0
- package/dist/templates/mga/{{name}}-web/helm/{{name}}-web/templates/service.yaml +15 -0
- package/dist/templates/mga/{{name}}-web/helm/{{name}}-web/values.yaml +70 -0
- package/dist/templates/mga/{{name}}-web/next.config.js +8 -0
- package/dist/templates/mga/{{name}}-web/package.json +30 -0
- package/dist/templates/mga/{{name}}-web/public/.gitkeep +0 -0
- package/dist/templates/mga/{{name}}-web/public/gitkeep +0 -0
- package/dist/templates/mga/{{name}}-web/src/app/api/auth/callback/route.ts +77 -0
- package/dist/templates/mga/{{name}}-web/src/app/api/auth/login/route.ts +16 -0
- package/dist/templates/mga/{{name}}-web/src/app/api/auth/logout/route.ts +7 -0
- package/dist/templates/mga/{{name}}-web/src/app/api/auth/session/route.ts +42 -0
- package/dist/templates/mga/{{name}}-web/src/app/api/health/route.ts +10 -0
- package/dist/templates/mga/{{name}}-web/src/app/api/proxy/applications/route.ts +47 -0
- package/dist/templates/mga/{{name}}-web/src/app/applications/layout.tsx +17 -0
- package/dist/templates/mga/{{name}}-web/src/app/applications/new/page.tsx +374 -0
- package/dist/templates/mga/{{name}}-web/src/app/applications/page.tsx +109 -0
- package/dist/templates/mga/{{name}}-web/src/app/dashboard/admin/page.tsx +179 -0
- package/dist/templates/mga/{{name}}-web/src/app/dashboard/agent/page.tsx +125 -0
- package/dist/templates/mga/{{name}}-web/src/app/dashboard/insured/page.tsx +145 -0
- package/dist/templates/mga/{{name}}-web/src/app/dashboard/layout.tsx +17 -0
- package/dist/templates/mga/{{name}}-web/src/app/dashboard/page.tsx +27 -0
- package/dist/templates/mga/{{name}}-web/src/app/dashboard/shell.tsx +89 -0
- package/dist/templates/mga/{{name}}-web/src/app/globals.css +477 -0
- package/dist/templates/mga/{{name}}-web/src/app/layout.tsx +19 -0
- package/dist/templates/mga/{{name}}-web/src/app/page.tsx +74 -0
- package/dist/templates/mga/{{name}}-web/src/app/reports/layout.tsx +21 -0
- package/dist/templates/mga/{{name}}-web/src/app/reports/page.tsx +231 -0
- package/dist/templates/mga/{{name}}-web/src/lib/api.ts +79 -0
- package/dist/templates/mga/{{name}}-web/src/lib/auth.ts +285 -0
- package/dist/templates/mga/{{name}}-web/src/middleware.ts +71 -0
- package/dist/templates/mga/{{name}}-web/tsconfig.json +26 -0
- package/dist/templates/nextjs/.env.example +11 -0
- package/dist/templates/nextjs/Dockerfile +51 -0
- package/dist/templates/nextjs/README.md +87 -0
- package/dist/templates/nextjs/catalog-info.yaml +16 -0
- package/dist/templates/nextjs/gitignore +36 -0
- package/dist/templates/nextjs/helm/{{name}}/Chart.yaml +9 -0
- package/dist/templates/nextjs/helm/{{name}}/templates/deployment.yaml +72 -0
- package/dist/templates/nextjs/helm/{{name}}/templates/ingress.yaml +43 -0
- package/dist/templates/nextjs/helm/{{name}}/templates/service.yaml +17 -0
- package/dist/templates/nextjs/helm/{{name}}/values.yaml +60 -0
- package/dist/templates/nextjs/next.config.js +23 -0
- package/dist/templates/nextjs/package.json +29 -0
- package/dist/templates/nextjs/public/.gitkeep +0 -0
- package/dist/templates/nextjs/public/gitkeep +0 -0
- package/dist/templates/nextjs/src/app/api/example/route.ts +63 -0
- package/dist/templates/nextjs/src/app/api/health/route.ts +10 -0
- package/dist/templates/nextjs/src/app/layout.tsx +18 -0
- package/dist/templates/nextjs/src/app/page.tsx +49 -0
- package/dist/templates/nextjs/tsconfig.json +26 -0
- package/dist/templates/nextjs-oauth/.dockerignore +6 -0
- package/dist/templates/nextjs-oauth/.env.example +12 -0
- package/dist/templates/nextjs-oauth/Dockerfile +51 -0
- package/dist/templates/nextjs-oauth/README.md +115 -0
- package/dist/templates/nextjs-oauth/catalog-info.yaml +17 -0
- package/dist/templates/nextjs-oauth/dockerignore +6 -0
- package/dist/templates/nextjs-oauth/gitignore +36 -0
- package/dist/templates/nextjs-oauth/helm/Chart.yaml +6 -0
- package/dist/templates/nextjs-oauth/helm/templates/_helpers.tpl +49 -0
- package/dist/templates/nextjs-oauth/helm/templates/configmap.yaml +10 -0
- package/dist/templates/nextjs-oauth/helm/templates/deployment.yaml +56 -0
- package/dist/templates/nextjs-oauth/helm/templates/ingress.yaml +41 -0
- package/dist/templates/nextjs-oauth/helm/templates/service.yaml +15 -0
- package/dist/templates/nextjs-oauth/helm/values.yaml +69 -0
- package/dist/templates/nextjs-oauth/helm/{{name}}/Chart.yaml +9 -0
- package/dist/templates/nextjs-oauth/helm/{{name}}/templates/deployment.yaml +68 -0
- package/dist/templates/nextjs-oauth/helm/{{name}}/templates/service.yaml +17 -0
- package/dist/templates/nextjs-oauth/helm/{{name}}/values.yaml +51 -0
- package/dist/templates/nextjs-oauth/next.config.js +23 -0
- package/dist/templates/nextjs-oauth/package.json +30 -0
- package/dist/templates/nextjs-oauth/public/.gitkeep +0 -0
- package/dist/templates/nextjs-oauth/public/gitkeep +0 -0
- package/dist/templates/nextjs-oauth/src/app/api/auth/callback/route.ts +77 -0
- package/dist/templates/nextjs-oauth/src/app/api/auth/login/route.ts +16 -0
- package/dist/templates/nextjs-oauth/src/app/api/auth/logout/route.ts +7 -0
- package/dist/templates/nextjs-oauth/src/app/api/auth/session/route.ts +42 -0
- package/dist/templates/nextjs-oauth/src/app/api/example/route.ts +63 -0
- package/dist/templates/nextjs-oauth/src/app/api/health/route.ts +10 -0
- package/dist/templates/nextjs-oauth/src/app/dashboard/page.tsx +92 -0
- package/dist/templates/nextjs-oauth/src/app/layout.tsx +18 -0
- package/dist/templates/nextjs-oauth/src/app/page.tsx +110 -0
- package/dist/templates/nextjs-oauth/src/lib/auth.ts +285 -0
- package/dist/templates/nextjs-oauth/src/middleware.ts +71 -0
- package/dist/templates/nextjs-oauth/tsconfig.json +26 -0
- package/dist/templates/static/catalog-info.yaml +14 -0
- package/dist/templates/static/index.html +16 -0
- package/dist/templates/static/styles.css +39 -0
- package/dist/templates/worker/.env.example +13 -0
- package/dist/templates/worker/Dockerfile +26 -0
- package/dist/templates/worker/README.md +106 -0
- package/dist/templates/worker/catalog-info.yaml +19 -0
- package/dist/templates/worker/gitignore +5 -0
- package/dist/templates/worker/helm/{{name}}/Chart.yaml +9 -0
- package/dist/templates/worker/helm/{{name}}/templates/deployment.yaml +68 -0
- package/dist/templates/worker/helm/{{name}}/templates/ingress.yaml +43 -0
- package/dist/templates/worker/helm/{{name}}/values.yaml +64 -0
- package/dist/templates/worker/package.json +26 -0
- package/dist/templates/worker/src/index.ts +185 -0
- package/dist/templates/worker/tsconfig.json +14 -0
- package/dist/types/index.d.ts +596 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +41 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/platform.d.ts +191 -0
- package/dist/types/platform.d.ts.map +1 -0
- package/dist/types/platform.js +17 -0
- package/dist/types/platform.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
apiVersion: v1
|
|
2
|
+
kind: Service
|
|
3
|
+
metadata:
|
|
4
|
+
name: {{ .Release.Name }}
|
|
5
|
+
labels:
|
|
6
|
+
app: {{ .Release.Name }}
|
|
7
|
+
app.kubernetes.io/name: {{ .Release.Name }}
|
|
8
|
+
app.kubernetes.io/instance: {{ .Release.Name }}
|
|
9
|
+
spec:
|
|
10
|
+
type: {{ .Values.service.type }}
|
|
11
|
+
ports:
|
|
12
|
+
- port: {{ .Values.service.port }}
|
|
13
|
+
targetPort: http
|
|
14
|
+
protocol: TCP
|
|
15
|
+
name: http
|
|
16
|
+
selector:
|
|
17
|
+
app: {{ .Release.Name }}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
replicaCount: 1
|
|
2
|
+
|
|
3
|
+
image:
|
|
4
|
+
repository: registry.digitalocean.com/insureco/{{name}}-service-a
|
|
5
|
+
tag: latest
|
|
6
|
+
pullPolicy: IfNotPresent
|
|
7
|
+
|
|
8
|
+
imagePullSecrets:
|
|
9
|
+
- name: insureco
|
|
10
|
+
|
|
11
|
+
service:
|
|
12
|
+
type: ClusterIP
|
|
13
|
+
port: 3000
|
|
14
|
+
|
|
15
|
+
resources:
|
|
16
|
+
limits:
|
|
17
|
+
cpu: 200m
|
|
18
|
+
memory: 256Mi
|
|
19
|
+
requests:
|
|
20
|
+
cpu: 50m
|
|
21
|
+
memory: 64Mi
|
|
22
|
+
|
|
23
|
+
ingress:
|
|
24
|
+
enabled: false
|
|
25
|
+
className: nginx
|
|
26
|
+
annotations: {}
|
|
27
|
+
hosts: []
|
|
28
|
+
tls: []
|
|
29
|
+
|
|
30
|
+
secretRef: ""
|
|
31
|
+
|
|
32
|
+
livenessProbe:
|
|
33
|
+
httpGet:
|
|
34
|
+
path: /health
|
|
35
|
+
port: 3000
|
|
36
|
+
initialDelaySeconds: 10
|
|
37
|
+
periodSeconds: 10
|
|
38
|
+
|
|
39
|
+
readinessProbe:
|
|
40
|
+
httpGet:
|
|
41
|
+
path: /health
|
|
42
|
+
port: 3000
|
|
43
|
+
initialDelaySeconds: 5
|
|
44
|
+
periodSeconds: 5
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{name}}-service-a",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Provider service - exposes internal data API",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"build": "tsc",
|
|
8
|
+
"dev": "tsx watch src/index.ts",
|
|
9
|
+
"start": "node dist/index.js",
|
|
10
|
+
"lint": "eslint src --ext .ts",
|
|
11
|
+
"typecheck": "tsc --noEmit"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"express": "^4.21.0",
|
|
15
|
+
"cors": "^2.8.5",
|
|
16
|
+
"helmet": "^8.0.0",
|
|
17
|
+
"zod": "^3.24.0"
|
|
18
|
+
},
|
|
19
|
+
"devDependencies": {
|
|
20
|
+
"@types/cors": "^2.8.17",
|
|
21
|
+
"@types/express": "^5.0.0",
|
|
22
|
+
"@types/node": "^22.0.0",
|
|
23
|
+
"tsx": "^4.0.0",
|
|
24
|
+
"typescript": "^5.7.0"
|
|
25
|
+
},
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=20.0.0"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import express, { type Request, type Response, type NextFunction } from 'express'
|
|
2
|
+
import helmet from 'helmet'
|
|
3
|
+
|
|
4
|
+
const app = express()
|
|
5
|
+
const PORT = process.env.PORT || 3000
|
|
6
|
+
const SERVICE_NAME = '{{name}}-service-a'
|
|
7
|
+
|
|
8
|
+
// Middleware
|
|
9
|
+
app.use(helmet())
|
|
10
|
+
app.use(express.json())
|
|
11
|
+
|
|
12
|
+
// Sample data store
|
|
13
|
+
interface Item {
|
|
14
|
+
id: string
|
|
15
|
+
name: string
|
|
16
|
+
value: number
|
|
17
|
+
source: string
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const items: Item[] = [
|
|
21
|
+
{ id: '1', name: 'Widget A', value: 100, source: SERVICE_NAME },
|
|
22
|
+
{ id: '2', name: 'Widget B', value: 200, source: SERVICE_NAME },
|
|
23
|
+
{ id: '3', name: 'Widget C', value: 300, source: SERVICE_NAME },
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
// Request logging with caller identification
|
|
27
|
+
app.use((req: Request, _res: Response, next: NextFunction) => {
|
|
28
|
+
const caller = req.headers['x-service-name'] || 'unknown'
|
|
29
|
+
const timestamp = new Date().toISOString()
|
|
30
|
+
process.stdout.write(`[${timestamp}] ${req.method} ${req.path} (caller: ${caller})\n`)
|
|
31
|
+
next()
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
// Health check - public
|
|
35
|
+
app.get('/health', (_req: Request, res: Response) => {
|
|
36
|
+
res.json({
|
|
37
|
+
status: 'healthy',
|
|
38
|
+
service: SERVICE_NAME,
|
|
39
|
+
timestamp: new Date().toISOString(),
|
|
40
|
+
})
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
// Internal API - service-to-service only
|
|
44
|
+
// In production, Janus validates the auth: service requirement
|
|
45
|
+
app.get('/api/internal/items', (req: Request, res: Response) => {
|
|
46
|
+
// Log the service-to-service call
|
|
47
|
+
const callerService = req.headers['x-service-name'] as string
|
|
48
|
+
process.stdout.write(`Internal API called by: ${callerService || 'direct'}\n`)
|
|
49
|
+
|
|
50
|
+
res.json({
|
|
51
|
+
success: true,
|
|
52
|
+
data: items,
|
|
53
|
+
meta: {
|
|
54
|
+
source: SERVICE_NAME,
|
|
55
|
+
timestamp: new Date().toISOString(),
|
|
56
|
+
},
|
|
57
|
+
})
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
app.get('/api/internal/items/:id', (req: Request, res: Response) => {
|
|
61
|
+
const item = items.find(i => i.id === req.params.id)
|
|
62
|
+
|
|
63
|
+
if (!item) {
|
|
64
|
+
res.status(404).json({
|
|
65
|
+
success: false,
|
|
66
|
+
error: { code: 'NOT_FOUND', message: 'Item not found' },
|
|
67
|
+
})
|
|
68
|
+
return
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
res.json({
|
|
72
|
+
success: true,
|
|
73
|
+
data: item,
|
|
74
|
+
})
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
// Error handler
|
|
78
|
+
app.use((err: Error, _req: Request, res: Response, _next: NextFunction) => {
|
|
79
|
+
process.stderr.write(`Error: ${err.message}\n`)
|
|
80
|
+
res.status(500).json({
|
|
81
|
+
success: false,
|
|
82
|
+
error: { code: 'INTERNAL_ERROR', message: 'Internal error' },
|
|
83
|
+
})
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
app.listen(PORT, () => {
|
|
87
|
+
process.stdout.write(`${SERVICE_NAME} listening on port ${PORT}\n`)
|
|
88
|
+
process.stdout.write(`This service exposes internal APIs for service-to-service communication\n`)
|
|
89
|
+
})
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "NodeNext",
|
|
5
|
+
"moduleResolution": "NodeNext",
|
|
6
|
+
"outDir": "./dist",
|
|
7
|
+
"rootDir": "./src",
|
|
8
|
+
"strict": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"skipLibCheck": true
|
|
11
|
+
},
|
|
12
|
+
"include": ["src/**/*"],
|
|
13
|
+
"exclude": ["node_modules", "dist"]
|
|
14
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
FROM node:22-alpine AS builder
|
|
2
|
+
WORKDIR /app
|
|
3
|
+
COPY package*.json ./
|
|
4
|
+
RUN npm ci
|
|
5
|
+
COPY . .
|
|
6
|
+
RUN npm run build
|
|
7
|
+
|
|
8
|
+
FROM node:22-alpine
|
|
9
|
+
WORKDIR /app
|
|
10
|
+
COPY package*.json ./
|
|
11
|
+
RUN npm ci --production && npm cache clean --force
|
|
12
|
+
COPY --from=builder /app/dist ./dist
|
|
13
|
+
|
|
14
|
+
ENV NODE_ENV=production
|
|
15
|
+
ENV PORT=3000
|
|
16
|
+
|
|
17
|
+
RUN addgroup -g 1001 -S nodejs && \
|
|
18
|
+
adduser -S nodejs -u 1001 && \
|
|
19
|
+
chown -R nodejs:nodejs /app
|
|
20
|
+
|
|
21
|
+
USER nodejs
|
|
22
|
+
EXPOSE 3000
|
|
23
|
+
|
|
24
|
+
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
|
25
|
+
CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1
|
|
26
|
+
|
|
27
|
+
CMD ["node", "dist/index.js"]
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
apiVersion: backstage.io/v1alpha1
|
|
2
|
+
kind: Component
|
|
3
|
+
metadata:
|
|
4
|
+
name: {{name}}-service-b
|
|
5
|
+
description: Consumer service for {{name}} - calls service-a internally
|
|
6
|
+
tags:
|
|
7
|
+
- tawa
|
|
8
|
+
- api
|
|
9
|
+
- consumer
|
|
10
|
+
annotations:
|
|
11
|
+
insureco.io/framework: express
|
|
12
|
+
insureco.io/language: typescript
|
|
13
|
+
spec:
|
|
14
|
+
type: service
|
|
15
|
+
lifecycle: experimental
|
|
16
|
+
owner: {{owner}}
|
|
17
|
+
consumesApis:
|
|
18
|
+
- {{name}}-service-a-api
|
|
19
|
+
routes:
|
|
20
|
+
- path: /health
|
|
21
|
+
methods: [GET]
|
|
22
|
+
auth: none
|
|
23
|
+
description: Health check endpoint
|
|
24
|
+
- path: /api/*
|
|
25
|
+
methods: [GET, POST]
|
|
26
|
+
auth: required
|
|
27
|
+
description: Public API that aggregates data from service-a
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
apiVersion: apps/v1
|
|
2
|
+
kind: Deployment
|
|
3
|
+
metadata:
|
|
4
|
+
name: {{ .Release.Name }}
|
|
5
|
+
labels:
|
|
6
|
+
app: {{ .Release.Name }}
|
|
7
|
+
app.kubernetes.io/name: {{ .Release.Name }}
|
|
8
|
+
app.kubernetes.io/instance: {{ .Release.Name }}
|
|
9
|
+
spec:
|
|
10
|
+
replicas: {{ .Values.replicaCount }}
|
|
11
|
+
selector:
|
|
12
|
+
matchLabels:
|
|
13
|
+
app: {{ .Release.Name }}
|
|
14
|
+
template:
|
|
15
|
+
metadata:
|
|
16
|
+
labels:
|
|
17
|
+
app: {{ .Release.Name }}
|
|
18
|
+
app.kubernetes.io/name: {{ .Release.Name }}
|
|
19
|
+
app.kubernetes.io/instance: {{ .Release.Name }}
|
|
20
|
+
spec:
|
|
21
|
+
{{- with .Values.imagePullSecrets }}
|
|
22
|
+
imagePullSecrets:
|
|
23
|
+
{{- toYaml . | nindent 8 }}
|
|
24
|
+
{{- end }}
|
|
25
|
+
containers:
|
|
26
|
+
- name: {{ .Chart.Name }}
|
|
27
|
+
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
|
|
28
|
+
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
|
29
|
+
ports:
|
|
30
|
+
- name: http
|
|
31
|
+
containerPort: {{ .Values.service.port }}
|
|
32
|
+
protocol: TCP
|
|
33
|
+
envFrom:
|
|
34
|
+
- configMapRef:
|
|
35
|
+
name: {{ .Release.Name }}-config
|
|
36
|
+
optional: true
|
|
37
|
+
- secretRef:
|
|
38
|
+
name: {{ .Release.Name }}-secrets
|
|
39
|
+
optional: true
|
|
40
|
+
{{- if .Values.secretRef }}
|
|
41
|
+
- secretRef:
|
|
42
|
+
name: {{ .Values.secretRef }}
|
|
43
|
+
{{- end }}
|
|
44
|
+
{{- with .Values.env }}
|
|
45
|
+
env:
|
|
46
|
+
{{- range $key, $value := . }}
|
|
47
|
+
- name: {{ $key }}
|
|
48
|
+
value: {{ $value | quote }}
|
|
49
|
+
{{- end }}
|
|
50
|
+
{{- end }}
|
|
51
|
+
{{- with .Values.livenessProbe }}
|
|
52
|
+
livenessProbe:
|
|
53
|
+
{{- toYaml . | nindent 12 }}
|
|
54
|
+
{{- end }}
|
|
55
|
+
{{- with .Values.readinessProbe }}
|
|
56
|
+
readinessProbe:
|
|
57
|
+
{{- toYaml . | nindent 12 }}
|
|
58
|
+
{{- end }}
|
|
59
|
+
resources:
|
|
60
|
+
{{- toYaml .Values.resources | nindent 12 }}
|
|
61
|
+
{{- with .Values.nodeSelector }}
|
|
62
|
+
nodeSelector:
|
|
63
|
+
{{- toYaml . | nindent 8 }}
|
|
64
|
+
{{- end }}
|
|
65
|
+
{{- with .Values.affinity }}
|
|
66
|
+
affinity:
|
|
67
|
+
{{- toYaml . | nindent 8 }}
|
|
68
|
+
{{- end }}
|
|
69
|
+
{{- with .Values.tolerations }}
|
|
70
|
+
tolerations:
|
|
71
|
+
{{- toYaml . | nindent 8 }}
|
|
72
|
+
{{- end }}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{{- if .Values.ingress.enabled -}}
|
|
2
|
+
apiVersion: networking.k8s.io/v1
|
|
3
|
+
kind: Ingress
|
|
4
|
+
metadata:
|
|
5
|
+
name: {{ .Release.Name }}
|
|
6
|
+
labels:
|
|
7
|
+
app: {{ .Release.Name }}
|
|
8
|
+
app.kubernetes.io/name: {{ .Release.Name }}
|
|
9
|
+
app.kubernetes.io/instance: {{ .Release.Name }}
|
|
10
|
+
{{- with .Values.ingress.annotations }}
|
|
11
|
+
annotations:
|
|
12
|
+
{{- toYaml . | nindent 4 }}
|
|
13
|
+
{{- end }}
|
|
14
|
+
spec:
|
|
15
|
+
{{- if .Values.ingress.className }}
|
|
16
|
+
ingressClassName: {{ .Values.ingress.className }}
|
|
17
|
+
{{- end }}
|
|
18
|
+
{{- if .Values.ingress.tls }}
|
|
19
|
+
tls:
|
|
20
|
+
{{- range .Values.ingress.tls }}
|
|
21
|
+
- hosts:
|
|
22
|
+
{{- range .hosts }}
|
|
23
|
+
- {{ . | quote }}
|
|
24
|
+
{{- end }}
|
|
25
|
+
secretName: {{ .secretName }}
|
|
26
|
+
{{- end }}
|
|
27
|
+
{{- end }}
|
|
28
|
+
rules:
|
|
29
|
+
{{- range .Values.ingress.hosts }}
|
|
30
|
+
- host: {{ .host | quote }}
|
|
31
|
+
http:
|
|
32
|
+
paths:
|
|
33
|
+
{{- range .paths }}
|
|
34
|
+
- path: {{ .path }}
|
|
35
|
+
pathType: {{ .pathType }}
|
|
36
|
+
backend:
|
|
37
|
+
service:
|
|
38
|
+
name: {{ $.Release.Name }}
|
|
39
|
+
port:
|
|
40
|
+
number: {{ $.Values.service.port }}
|
|
41
|
+
{{- end }}
|
|
42
|
+
{{- end }}
|
|
43
|
+
{{- end }}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
apiVersion: v1
|
|
2
|
+
kind: Service
|
|
3
|
+
metadata:
|
|
4
|
+
name: {{ .Release.Name }}
|
|
5
|
+
labels:
|
|
6
|
+
app: {{ .Release.Name }}
|
|
7
|
+
app.kubernetes.io/name: {{ .Release.Name }}
|
|
8
|
+
app.kubernetes.io/instance: {{ .Release.Name }}
|
|
9
|
+
spec:
|
|
10
|
+
type: {{ .Values.service.type }}
|
|
11
|
+
ports:
|
|
12
|
+
- port: {{ .Values.service.port }}
|
|
13
|
+
targetPort: http
|
|
14
|
+
protocol: TCP
|
|
15
|
+
name: http
|
|
16
|
+
selector:
|
|
17
|
+
app: {{ .Release.Name }}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
replicaCount: 1
|
|
2
|
+
|
|
3
|
+
image:
|
|
4
|
+
repository: registry.digitalocean.com/insureco/{{name}}-service-b
|
|
5
|
+
tag: latest
|
|
6
|
+
pullPolicy: IfNotPresent
|
|
7
|
+
|
|
8
|
+
imagePullSecrets:
|
|
9
|
+
- name: insureco
|
|
10
|
+
|
|
11
|
+
service:
|
|
12
|
+
type: ClusterIP
|
|
13
|
+
port: 3000
|
|
14
|
+
|
|
15
|
+
resources:
|
|
16
|
+
limits:
|
|
17
|
+
cpu: 200m
|
|
18
|
+
memory: 256Mi
|
|
19
|
+
requests:
|
|
20
|
+
cpu: 50m
|
|
21
|
+
memory: 64Mi
|
|
22
|
+
|
|
23
|
+
env:
|
|
24
|
+
SERVICE_A_URL: "http://{{name}}-service-a:3000"
|
|
25
|
+
|
|
26
|
+
ingress:
|
|
27
|
+
enabled: false
|
|
28
|
+
className: nginx
|
|
29
|
+
annotations: {}
|
|
30
|
+
hosts: []
|
|
31
|
+
tls: []
|
|
32
|
+
|
|
33
|
+
secretRef: ""
|
|
34
|
+
|
|
35
|
+
livenessProbe:
|
|
36
|
+
httpGet:
|
|
37
|
+
path: /health
|
|
38
|
+
port: 3000
|
|
39
|
+
initialDelaySeconds: 10
|
|
40
|
+
periodSeconds: 10
|
|
41
|
+
|
|
42
|
+
readinessProbe:
|
|
43
|
+
httpGet:
|
|
44
|
+
path: /health
|
|
45
|
+
port: 3000
|
|
46
|
+
initialDelaySeconds: 5
|
|
47
|
+
periodSeconds: 5
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{name}}-service-b",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Consumer service - calls service-a internally",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"build": "tsc",
|
|
8
|
+
"dev": "tsx watch src/index.ts",
|
|
9
|
+
"start": "node dist/index.js",
|
|
10
|
+
"lint": "eslint src --ext .ts",
|
|
11
|
+
"typecheck": "tsc --noEmit"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"express": "^4.21.0",
|
|
15
|
+
"helmet": "^8.0.0"
|
|
16
|
+
},
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"@types/express": "^5.0.0",
|
|
19
|
+
"@types/node": "^22.0.0",
|
|
20
|
+
"tsx": "^4.0.0",
|
|
21
|
+
"typescript": "^5.7.0"
|
|
22
|
+
},
|
|
23
|
+
"engines": {
|
|
24
|
+
"node": ">=20.0.0"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import express, { type Request, type Response, type NextFunction } from 'express'
|
|
2
|
+
import helmet from 'helmet'
|
|
3
|
+
|
|
4
|
+
const app = express()
|
|
5
|
+
const PORT = process.env.PORT || 3000
|
|
6
|
+
const SERVICE_NAME = '{{name}}-service-b'
|
|
7
|
+
|
|
8
|
+
// Service A URL - uses Kubernetes internal DNS
|
|
9
|
+
// Format: http://<service-name>.<namespace>.svc.cluster.local:<port>
|
|
10
|
+
// Simplified: http://<service-name>:<port> when in same namespace
|
|
11
|
+
const SERVICE_A_URL = process.env.SERVICE_A_URL || 'http://{{name}}-service-a:3000'
|
|
12
|
+
|
|
13
|
+
// Middleware
|
|
14
|
+
app.use(helmet())
|
|
15
|
+
app.use(express.json())
|
|
16
|
+
|
|
17
|
+
// Request logging
|
|
18
|
+
app.use((req: Request, _res: Response, next: NextFunction) => {
|
|
19
|
+
const timestamp = new Date().toISOString()
|
|
20
|
+
process.stdout.write(`[${timestamp}] ${req.method} ${req.path}\n`)
|
|
21
|
+
next()
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
// Health check
|
|
25
|
+
app.get('/health', (_req: Request, res: Response) => {
|
|
26
|
+
res.json({
|
|
27
|
+
status: 'healthy',
|
|
28
|
+
service: SERVICE_NAME,
|
|
29
|
+
timestamp: new Date().toISOString(),
|
|
30
|
+
})
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
// Helper function to call service-a
|
|
34
|
+
async function callServiceA(path: string): Promise<unknown> {
|
|
35
|
+
const url = `${SERVICE_A_URL}${path}`
|
|
36
|
+
process.stdout.write(`Calling service-a: ${url}\n`)
|
|
37
|
+
|
|
38
|
+
const response = await fetch(url, {
|
|
39
|
+
headers: {
|
|
40
|
+
'Content-Type': 'application/json',
|
|
41
|
+
// Identify ourselves for logging/tracing
|
|
42
|
+
'X-Service-Name': SERVICE_NAME,
|
|
43
|
+
// In production, include service credentials for auth: service routes
|
|
44
|
+
// 'Authorization': `Bearer ${process.env.SERVICE_TOKEN}`,
|
|
45
|
+
},
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
if (!response.ok) {
|
|
49
|
+
throw new Error(`Service A returned ${response.status}`)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return response.json()
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Public API that aggregates data from service-a
|
|
56
|
+
app.get('/api/data', async (_req: Request, res: Response) => {
|
|
57
|
+
try {
|
|
58
|
+
// Call service-a's internal API
|
|
59
|
+
const serviceAResponse = await callServiceA('/api/internal/items') as {
|
|
60
|
+
success: boolean
|
|
61
|
+
data: Array<{ id: string; name: string; value: number; source: string }>
|
|
62
|
+
meta: { source: string; timestamp: string }
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Process and transform the data
|
|
66
|
+
const processedData = {
|
|
67
|
+
items: serviceAResponse.data.map(item => ({
|
|
68
|
+
...item,
|
|
69
|
+
processedBy: SERVICE_NAME,
|
|
70
|
+
displayValue: `$${item.value.toFixed(2)}`,
|
|
71
|
+
})),
|
|
72
|
+
totalValue: serviceAResponse.data.reduce((sum, item) => sum + item.value, 0),
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
res.json({
|
|
76
|
+
success: true,
|
|
77
|
+
data: processedData,
|
|
78
|
+
meta: {
|
|
79
|
+
aggregator: SERVICE_NAME,
|
|
80
|
+
source: serviceAResponse.meta.source,
|
|
81
|
+
timestamp: new Date().toISOString(),
|
|
82
|
+
},
|
|
83
|
+
})
|
|
84
|
+
} catch (error) {
|
|
85
|
+
process.stderr.write(`Error calling service-a: ${error}\n`)
|
|
86
|
+
res.status(502).json({
|
|
87
|
+
success: false,
|
|
88
|
+
error: {
|
|
89
|
+
code: 'UPSTREAM_ERROR',
|
|
90
|
+
message: 'Failed to retrieve data from upstream service',
|
|
91
|
+
},
|
|
92
|
+
})
|
|
93
|
+
}
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
// Get specific item with enrichment
|
|
97
|
+
app.get('/api/data/:id', async (req: Request, res: Response) => {
|
|
98
|
+
try {
|
|
99
|
+
const response = await callServiceA(`/api/internal/items/${req.params.id}`) as {
|
|
100
|
+
success: boolean
|
|
101
|
+
data: { id: string; name: string; value: number; source: string }
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const enrichedItem = {
|
|
105
|
+
...response.data,
|
|
106
|
+
processedBy: SERVICE_NAME,
|
|
107
|
+
displayValue: `$${response.data.value.toFixed(2)}`,
|
|
108
|
+
retrievedAt: new Date().toISOString(),
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
res.json({
|
|
112
|
+
success: true,
|
|
113
|
+
data: enrichedItem,
|
|
114
|
+
})
|
|
115
|
+
} catch (error) {
|
|
116
|
+
const err = error as Error
|
|
117
|
+
if (err.message.includes('404')) {
|
|
118
|
+
res.status(404).json({
|
|
119
|
+
success: false,
|
|
120
|
+
error: { code: 'NOT_FOUND', message: 'Item not found' },
|
|
121
|
+
})
|
|
122
|
+
return
|
|
123
|
+
}
|
|
124
|
+
res.status(502).json({
|
|
125
|
+
success: false,
|
|
126
|
+
error: { code: 'UPSTREAM_ERROR', message: 'Failed to retrieve item' },
|
|
127
|
+
})
|
|
128
|
+
}
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
// Error handler
|
|
132
|
+
app.use((err: Error, _req: Request, res: Response, _next: NextFunction) => {
|
|
133
|
+
process.stderr.write(`Error: ${err.message}\n`)
|
|
134
|
+
res.status(500).json({
|
|
135
|
+
success: false,
|
|
136
|
+
error: { code: 'INTERNAL_ERROR', message: 'Internal error' },
|
|
137
|
+
})
|
|
138
|
+
})
|
|
139
|
+
|
|
140
|
+
app.listen(PORT, () => {
|
|
141
|
+
process.stdout.write(`${SERVICE_NAME} listening on port ${PORT}\n`)
|
|
142
|
+
process.stdout.write(`Configured to call service-a at: ${SERVICE_A_URL}\n`)
|
|
143
|
+
})
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "NodeNext",
|
|
5
|
+
"moduleResolution": "NodeNext",
|
|
6
|
+
"outDir": "./dist",
|
|
7
|
+
"rootDir": "./src",
|
|
8
|
+
"strict": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"skipLibCheck": true
|
|
11
|
+
},
|
|
12
|
+
"include": ["src/**/*"],
|
|
13
|
+
"exclude": ["node_modules", "dist"]
|
|
14
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
FROM node:22-alpine AS builder
|
|
2
|
+
|
|
3
|
+
WORKDIR /app
|
|
4
|
+
|
|
5
|
+
# Copy package files
|
|
6
|
+
COPY package*.json ./
|
|
7
|
+
|
|
8
|
+
# Install dependencies
|
|
9
|
+
RUN npm ci
|
|
10
|
+
|
|
11
|
+
# Copy source code
|
|
12
|
+
COPY . .
|
|
13
|
+
|
|
14
|
+
# Build TypeScript
|
|
15
|
+
RUN npm run build
|
|
16
|
+
|
|
17
|
+
# Production stage
|
|
18
|
+
FROM node:22-alpine
|
|
19
|
+
|
|
20
|
+
WORKDIR /app
|
|
21
|
+
|
|
22
|
+
# Copy package files and install production deps only
|
|
23
|
+
COPY package*.json ./
|
|
24
|
+
RUN npm ci --production && npm cache clean --force
|
|
25
|
+
|
|
26
|
+
# Copy built application
|
|
27
|
+
COPY --from=builder /app/dist ./dist
|
|
28
|
+
|
|
29
|
+
# Set environment
|
|
30
|
+
ENV NODE_ENV=production
|
|
31
|
+
ENV PORT=3000
|
|
32
|
+
|
|
33
|
+
# Create non-root user
|
|
34
|
+
RUN addgroup -g 1001 -S nodejs && \
|
|
35
|
+
adduser -S nodejs -u 1001 && \
|
|
36
|
+
chown -R nodejs:nodejs /app
|
|
37
|
+
|
|
38
|
+
USER nodejs
|
|
39
|
+
|
|
40
|
+
EXPOSE 3000
|
|
41
|
+
|
|
42
|
+
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
|
43
|
+
CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1
|
|
44
|
+
|
|
45
|
+
CMD ["node", "dist/index.js"]
|