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,141 @@
|
|
|
1
|
+
import { readFile, access } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { parse } from 'yaml';
|
|
4
|
+
import { BioClient } from '../bio.js';
|
|
5
|
+
export async function validateScopes(cwd = process.cwd()) {
|
|
6
|
+
const checks = [];
|
|
7
|
+
const catalogPath = join(cwd, 'catalog-info.yaml');
|
|
8
|
+
try {
|
|
9
|
+
await access(catalogPath);
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
checks.push({
|
|
13
|
+
name: 'Scope grants',
|
|
14
|
+
status: 'skip',
|
|
15
|
+
message: 'No catalog-info.yaml found, skipping scope validation',
|
|
16
|
+
});
|
|
17
|
+
return { checks };
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
const content = await readFile(catalogPath, 'utf-8');
|
|
21
|
+
const catalogInfo = parse(content);
|
|
22
|
+
const requiredScopes = catalogInfo.spec?.requiredScopes;
|
|
23
|
+
if (!requiredScopes || requiredScopes.length === 0) {
|
|
24
|
+
checks.push({
|
|
25
|
+
name: 'Scope grants',
|
|
26
|
+
status: 'skip',
|
|
27
|
+
message: 'No requiredScopes defined in catalog-info.yaml',
|
|
28
|
+
});
|
|
29
|
+
return { checks };
|
|
30
|
+
}
|
|
31
|
+
const serviceName = catalogInfo.metadata?.name;
|
|
32
|
+
if (!serviceName) {
|
|
33
|
+
checks.push({
|
|
34
|
+
name: 'Scope grants',
|
|
35
|
+
status: 'fail',
|
|
36
|
+
message: 'No service name in catalog-info.yaml metadata',
|
|
37
|
+
});
|
|
38
|
+
return { checks };
|
|
39
|
+
}
|
|
40
|
+
// Query Bio-id for current scope grants
|
|
41
|
+
let bio;
|
|
42
|
+
try {
|
|
43
|
+
bio = await BioClient.create();
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
checks.push({
|
|
47
|
+
name: 'Scope grants',
|
|
48
|
+
status: 'warn',
|
|
49
|
+
message: 'Could not connect to Bio-id to verify scope grants',
|
|
50
|
+
remediation: 'Run "iec login" to authenticate, then retry',
|
|
51
|
+
});
|
|
52
|
+
return { checks };
|
|
53
|
+
}
|
|
54
|
+
const grantsResult = await bio.listScopeGrants({
|
|
55
|
+
requestingServiceId: serviceName,
|
|
56
|
+
});
|
|
57
|
+
if (!grantsResult.success) {
|
|
58
|
+
checks.push({
|
|
59
|
+
name: 'Scope grants',
|
|
60
|
+
status: 'warn',
|
|
61
|
+
message: `Could not fetch scope grants: ${grantsResult.error?.message}`,
|
|
62
|
+
remediation: 'Ensure Bio-id is reachable and you are authenticated',
|
|
63
|
+
});
|
|
64
|
+
return { checks };
|
|
65
|
+
}
|
|
66
|
+
const grants = grantsResult.data || [];
|
|
67
|
+
const pendingDetails = [];
|
|
68
|
+
const missingDetails = [];
|
|
69
|
+
const grantedDetails = [];
|
|
70
|
+
for (const req of requiredScopes) {
|
|
71
|
+
for (const scope of req.scopes) {
|
|
72
|
+
const matchingGrant = grants.find((g) => g.targetServiceId === req.service &&
|
|
73
|
+
g.requestedScopes.includes(scope));
|
|
74
|
+
if (!matchingGrant) {
|
|
75
|
+
missingDetails.push(`${scope} from ${req.service} — not requested yet`);
|
|
76
|
+
}
|
|
77
|
+
else if (matchingGrant.status === 'approved') {
|
|
78
|
+
if (matchingGrant.grantedScopes.includes(scope)) {
|
|
79
|
+
grantedDetails.push(`${scope} from ${req.service}`);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
missingDetails.push(`${scope} from ${req.service} — requested but not in granted set`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else if (matchingGrant.status === 'pending') {
|
|
86
|
+
pendingDetails.push(`${scope} from ${req.service} — awaiting admin approval`);
|
|
87
|
+
}
|
|
88
|
+
else if (matchingGrant.status === 'denied') {
|
|
89
|
+
missingDetails.push(`${scope} from ${req.service} — request was denied`);
|
|
90
|
+
}
|
|
91
|
+
else if (matchingGrant.status === 'revoked') {
|
|
92
|
+
missingDetails.push(`${scope} from ${req.service} — grant was revoked`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (grantedDetails.length > 0) {
|
|
97
|
+
checks.push({
|
|
98
|
+
name: 'Scope grants approved',
|
|
99
|
+
status: 'pass',
|
|
100
|
+
message: `${grantedDetails.length} scope(s) granted`,
|
|
101
|
+
details: grantedDetails,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
if (pendingDetails.length > 0) {
|
|
105
|
+
checks.push({
|
|
106
|
+
name: 'Scope grants pending',
|
|
107
|
+
status: 'warn',
|
|
108
|
+
message: `${pendingDetails.length} scope(s) awaiting approval`,
|
|
109
|
+
details: pendingDetails,
|
|
110
|
+
remediation: 'Ask an admin to approve the pending scope requests',
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
if (missingDetails.length > 0) {
|
|
114
|
+
checks.push({
|
|
115
|
+
name: 'Scope grants missing',
|
|
116
|
+
status: 'warn',
|
|
117
|
+
message: `${missingDetails.length} required scope(s) not yet available`,
|
|
118
|
+
details: missingDetails,
|
|
119
|
+
remediation: 'Run "iec scopes request <service> <scopes>" to request missing scopes',
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
if (grantedDetails.length === 0 &&
|
|
123
|
+
pendingDetails.length === 0 &&
|
|
124
|
+
missingDetails.length === 0) {
|
|
125
|
+
checks.push({
|
|
126
|
+
name: 'Scope grants',
|
|
127
|
+
status: 'pass',
|
|
128
|
+
message: 'All required scopes are available',
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
checks.push({
|
|
134
|
+
name: 'Scope validation',
|
|
135
|
+
status: 'fail',
|
|
136
|
+
message: `Failed to validate scopes: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
return { checks };
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=scope-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope-validator.js","sourceRoot":"","sources":["../../../src/lib/validators/scope-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { BuilderClient } from './builder.js';
|
|
2
|
+
interface WatchOptions {
|
|
3
|
+
/** Max consecutive transient errors before giving up (default: 10) */
|
|
4
|
+
maxRetries?: number;
|
|
5
|
+
/** Base poll interval in ms (default: 3000) */
|
|
6
|
+
pollInterval?: number;
|
|
7
|
+
/** Max poll interval in ms during backoff (default: 15000) */
|
|
8
|
+
maxPollInterval?: number;
|
|
9
|
+
/** Max total watch duration in ms (default: 30 minutes) */
|
|
10
|
+
timeout?: number;
|
|
11
|
+
/** Stream build logs incrementally (default: true) */
|
|
12
|
+
streamLogs?: boolean;
|
|
13
|
+
/** Label for terminal output — e.g. "Build", "Deployment", "Rollback" */
|
|
14
|
+
label?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare class WatchError extends Error {
|
|
17
|
+
readonly buildId: string;
|
|
18
|
+
constructor(message: string, buildId: string);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Watch a build's progress with retry logic, backoff, and incremental log streaming.
|
|
22
|
+
* Throws WatchError on timeout, max retries, or build failure.
|
|
23
|
+
*/
|
|
24
|
+
export declare function watchBuild(builder: BuilderClient, buildId: string, options?: WatchOptions): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* After a successful deploy, check if the service's HTTPS endpoint is reachable.
|
|
27
|
+
* Cloudflare edge certificates for new sub-subdomains can take a few minutes to provision.
|
|
28
|
+
* This polls the health endpoint and advises the user if the cert isn't ready yet.
|
|
29
|
+
*/
|
|
30
|
+
export declare function checkHttpsReadiness(hostname: string, options?: {
|
|
31
|
+
maxAttempts?: number;
|
|
32
|
+
interval?: number;
|
|
33
|
+
}): Promise<void>;
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=watch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/lib/watch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAmBjD,UAAU,YAAY;IACpB,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,8DAA8D;IAC9D,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,sDAAsD;IACtD,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,qBAAa,UAAW,SAAQ,KAAK;aACU,OAAO,EAAE,MAAM;gBAAhD,OAAO,EAAE,MAAM,EAAkB,OAAO,EAAE,MAAM;CAI7D;AAMD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CAgGf;AAkCD;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAgCpI"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { log } from './output.js';
|
|
2
|
+
const TERMINAL_STATES = ['completed', 'failed', 'cancelled'];
|
|
3
|
+
const STATUS_ICONS = {
|
|
4
|
+
queued: '\u23f3', // hourglass
|
|
5
|
+
cloning: '\ud83d\udce5', // inbox
|
|
6
|
+
building: '\ud83d\udd28', // hammer
|
|
7
|
+
pushing: '\ud83d\udce4', // outbox
|
|
8
|
+
deploying: '\ud83d\ude80', // rocket
|
|
9
|
+
completed: '\u2705', // check
|
|
10
|
+
failed: '\u274c', // x
|
|
11
|
+
cancelled: '\u26d4', // no entry
|
|
12
|
+
};
|
|
13
|
+
export class WatchError extends Error {
|
|
14
|
+
buildId;
|
|
15
|
+
constructor(message, buildId) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.buildId = buildId;
|
|
18
|
+
this.name = 'WatchError';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function isTransientError(code) {
|
|
22
|
+
return code === 'NON_JSON_RESPONSE' || code === 'HTTP_ERROR';
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Watch a build's progress with retry logic, backoff, and incremental log streaming.
|
|
26
|
+
* Throws WatchError on timeout, max retries, or build failure.
|
|
27
|
+
*/
|
|
28
|
+
export async function watchBuild(builder, buildId, options = {}) {
|
|
29
|
+
const { maxRetries = 10, pollInterval = 3000, maxPollInterval = 15000, timeout = 30 * 60 * 1000, streamLogs = true, label = 'Build', } = options;
|
|
30
|
+
let lastStatus = '';
|
|
31
|
+
let consecutiveErrors = 0;
|
|
32
|
+
let currentInterval = pollInterval;
|
|
33
|
+
let logLinesSeen = 0;
|
|
34
|
+
const startTime = Date.now();
|
|
35
|
+
while (true) {
|
|
36
|
+
// Timeout guard
|
|
37
|
+
if (Date.now() - startTime > timeout) {
|
|
38
|
+
log.error(`${label} watch timed out after ${Math.round(timeout / 60000)} minutes`);
|
|
39
|
+
log.dim(` The build may still be running. Check status with:`);
|
|
40
|
+
log.dim(` iec status --build ${buildId}`);
|
|
41
|
+
throw new WatchError('Watch timed out', buildId);
|
|
42
|
+
}
|
|
43
|
+
const result = await builder.getBuild(buildId);
|
|
44
|
+
if (!result.success || !result.data) {
|
|
45
|
+
consecutiveErrors++;
|
|
46
|
+
const errMsg = result.error?.message || 'Unknown error';
|
|
47
|
+
if (consecutiveErrors >= maxRetries) {
|
|
48
|
+
log.error(`${label} watch failed after ${maxRetries} consecutive errors`);
|
|
49
|
+
log.dim(` Last error: ${errMsg}`);
|
|
50
|
+
log.dim(` The build may still be running. Check status with:`);
|
|
51
|
+
log.dim(` iec status --build ${buildId}`);
|
|
52
|
+
throw new WatchError(`Failed after ${maxRetries} consecutive errors: ${errMsg}`, buildId);
|
|
53
|
+
}
|
|
54
|
+
if (isTransientError(result.error?.code)) {
|
|
55
|
+
// Backoff on transient errors (Cloudflare HTML pages, 502s, etc.)
|
|
56
|
+
currentInterval = Math.min(currentInterval * 1.5, maxPollInterval);
|
|
57
|
+
log.warning(`${label} status unavailable (${consecutiveErrors}/${maxRetries}), retrying...`);
|
|
58
|
+
log.dim(` ${errMsg}`);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
throw new WatchError(`Failed to get build status: ${errMsg}`, buildId);
|
|
62
|
+
}
|
|
63
|
+
await delay(currentInterval);
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
// Successful response — reset error state and interval
|
|
67
|
+
consecutiveErrors = 0;
|
|
68
|
+
currentInterval = pollInterval;
|
|
69
|
+
const build = result.data;
|
|
70
|
+
// Print status transition
|
|
71
|
+
if (build.status !== lastStatus) {
|
|
72
|
+
lastStatus = build.status;
|
|
73
|
+
const icon = STATUS_ICONS[build.status] || '\u2022';
|
|
74
|
+
log.info(`${icon} ${build.status}`);
|
|
75
|
+
}
|
|
76
|
+
// Stream incremental logs
|
|
77
|
+
if (streamLogs) {
|
|
78
|
+
logLinesSeen = await printNewLogs(builder, buildId, logLinesSeen);
|
|
79
|
+
}
|
|
80
|
+
// Check for terminal state
|
|
81
|
+
if (TERMINAL_STATES.includes(build.status)) {
|
|
82
|
+
log.info('');
|
|
83
|
+
if (build.status === 'completed') {
|
|
84
|
+
log.success(`${label} completed successfully!`);
|
|
85
|
+
if (build.imageTag) {
|
|
86
|
+
log.dim(` Image: ${build.imageTag}`);
|
|
87
|
+
}
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
else if (build.status === 'cancelled') {
|
|
91
|
+
log.warning(`${label} was cancelled`);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
log.error(`${label} failed`);
|
|
96
|
+
if (build.error) {
|
|
97
|
+
log.dim(` Error: ${build.error}`);
|
|
98
|
+
}
|
|
99
|
+
log.info('');
|
|
100
|
+
log.info('View full logs:');
|
|
101
|
+
log.dim(` iec logs --build ${buildId}`);
|
|
102
|
+
throw new WatchError(`${label} failed: ${build.error || 'Unknown error'}`, buildId);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
await delay(currentInterval);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async function printNewLogs(builder, buildId, linesSeen) {
|
|
109
|
+
try {
|
|
110
|
+
const result = await builder.getBuildLogs(buildId);
|
|
111
|
+
if (!result.success || !result.data) {
|
|
112
|
+
return linesSeen;
|
|
113
|
+
}
|
|
114
|
+
const logs = Array.isArray(result.data.logs)
|
|
115
|
+
? result.data.logs
|
|
116
|
+
: typeof result.data.logs === 'string'
|
|
117
|
+
? result.data.logs.split('\n')
|
|
118
|
+
: [];
|
|
119
|
+
if (logs.length > linesSeen) {
|
|
120
|
+
const newLines = logs.slice(linesSeen);
|
|
121
|
+
for (const line of newLines) {
|
|
122
|
+
log.dim(` ${line}`);
|
|
123
|
+
}
|
|
124
|
+
return logs.length;
|
|
125
|
+
}
|
|
126
|
+
return linesSeen;
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
// Log fetching is best-effort, don't interrupt the watch
|
|
130
|
+
return linesSeen;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* After a successful deploy, check if the service's HTTPS endpoint is reachable.
|
|
135
|
+
* Cloudflare edge certificates for new sub-subdomains can take a few minutes to provision.
|
|
136
|
+
* This polls the health endpoint and advises the user if the cert isn't ready yet.
|
|
137
|
+
*/
|
|
138
|
+
export async function checkHttpsReadiness(hostname, options = {}) {
|
|
139
|
+
const { maxAttempts = 10, interval = 5000 } = options;
|
|
140
|
+
const healthUrl = `https://${hostname}/health`;
|
|
141
|
+
log.info('');
|
|
142
|
+
log.info(`Checking HTTPS readiness for ${hostname}...`);
|
|
143
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
144
|
+
try {
|
|
145
|
+
const response = await fetch(healthUrl, {
|
|
146
|
+
signal: AbortSignal.timeout(5000),
|
|
147
|
+
});
|
|
148
|
+
if (response.ok) {
|
|
149
|
+
log.success(`HTTPS is live: https://${hostname}`);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
log.dim(` Attempt ${attempt}/${maxAttempts}: HTTP ${response.status}`);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
if (attempt === 1) {
|
|
156
|
+
log.dim(` Cloudflare SSL certificate is provisioning — this typically takes 1-3 minutes for new subdomains.`);
|
|
157
|
+
}
|
|
158
|
+
log.dim(` Attempt ${attempt}/${maxAttempts}: waiting for HTTPS...`);
|
|
159
|
+
}
|
|
160
|
+
if (attempt < maxAttempts) {
|
|
161
|
+
await delay(interval);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
log.warning(`HTTPS not yet available for ${hostname}`);
|
|
165
|
+
log.dim(` The Cloudflare SSL certificate may still be provisioning.`);
|
|
166
|
+
log.dim(` Check manually: curl -s https://${hostname}/api/health`);
|
|
167
|
+
}
|
|
168
|
+
function delay(ms) {
|
|
169
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/lib/watch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Server Configuration
|
|
2
|
+
PORT=3000
|
|
3
|
+
NODE_ENV=development
|
|
4
|
+
|
|
5
|
+
# Database (if needed)
|
|
6
|
+
# DATABASE_URL=mongodb://localhost:27017/{{name}}
|
|
7
|
+
|
|
8
|
+
# Redis (if needed)
|
|
9
|
+
# REDIS_URL=redis://localhost:6379
|
|
10
|
+
|
|
11
|
+
# External Services
|
|
12
|
+
# API_KEY=your-api-key-here
|
|
13
|
+
|
|
14
|
+
# Logging
|
|
15
|
+
LOG_LEVEL=info
|
|
@@ -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"]
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# {{name}}
|
|
2
|
+
|
|
3
|
+
{{description}}
|
|
4
|
+
|
|
5
|
+
## Getting Started
|
|
6
|
+
|
|
7
|
+
### Prerequisites
|
|
8
|
+
|
|
9
|
+
- Node.js 20+
|
|
10
|
+
- npm or pnpm
|
|
11
|
+
|
|
12
|
+
### Installation
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm install
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
### Development
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm run dev
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
The server will start on http://localhost:3000
|
|
25
|
+
|
|
26
|
+
### Production Build
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npm run build
|
|
30
|
+
npm start
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## API Endpoints
|
|
34
|
+
|
|
35
|
+
### Health Check
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
GET /health
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Returns service health status.
|
|
42
|
+
|
|
43
|
+
### Items API
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
GET /api/items # List all items
|
|
47
|
+
GET /api/items/:id # Get single item
|
|
48
|
+
POST /api/items # Create item
|
|
49
|
+
PUT /api/items/:id # Update item
|
|
50
|
+
DELETE /api/items/:id # Delete item
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Deployment
|
|
54
|
+
|
|
55
|
+
### Using iec-cli
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
# Link repository for auto-deploy
|
|
59
|
+
iec link
|
|
60
|
+
|
|
61
|
+
# Manual deploy to sandbox
|
|
62
|
+
iec deploy
|
|
63
|
+
|
|
64
|
+
# Deploy to production
|
|
65
|
+
iec deploy --prod
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Environment Variables
|
|
69
|
+
|
|
70
|
+
See `.env.example` for available configuration options.
|
|
71
|
+
|
|
72
|
+
## Project Structure
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
{{name}}/
|
|
76
|
+
├── src/
|
|
77
|
+
│ ├── index.ts # Application entry point
|
|
78
|
+
│ └── routes/
|
|
79
|
+
│ └── example.ts # Example CRUD routes
|
|
80
|
+
├── helm/
|
|
81
|
+
│ └── {{name}}/ # Kubernetes Helm chart
|
|
82
|
+
├── Dockerfile
|
|
83
|
+
├── catalog-info.yaml # Backstage service catalog
|
|
84
|
+
└── package.json
|
|
85
|
+
```
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
apiVersion: backstage.io/v1alpha1
|
|
2
|
+
kind: Component
|
|
3
|
+
metadata:
|
|
4
|
+
name: {{name}}
|
|
5
|
+
description: {{description}}
|
|
6
|
+
tags:
|
|
7
|
+
- tawa
|
|
8
|
+
- api
|
|
9
|
+
- express
|
|
10
|
+
annotations:
|
|
11
|
+
insureco.io/framework: express
|
|
12
|
+
insureco.io/language: typescript
|
|
13
|
+
spec:
|
|
14
|
+
type: service
|
|
15
|
+
lifecycle: experimental
|
|
16
|
+
owner: {{owner}}
|
|
17
|
+
routes:
|
|
18
|
+
- path: /api/items
|
|
19
|
+
methods: [GET, POST]
|
|
20
|
+
auth: required
|
|
21
|
+
scopes: [items:read, items:write]
|
|
22
|
+
description: CRUD operations for items
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Dependencies
|
|
2
|
+
node_modules/
|
|
3
|
+
|
|
4
|
+
# Build output
|
|
5
|
+
dist/
|
|
6
|
+
|
|
7
|
+
# Environment files
|
|
8
|
+
.env
|
|
9
|
+
.env.local
|
|
10
|
+
.env.*.local
|
|
11
|
+
|
|
12
|
+
# Logs
|
|
13
|
+
*.log
|
|
14
|
+
npm-debug.log*
|
|
15
|
+
|
|
16
|
+
# IDE
|
|
17
|
+
.idea/
|
|
18
|
+
.vscode/
|
|
19
|
+
*.swp
|
|
20
|
+
*.swo
|
|
21
|
+
|
|
22
|
+
# OS
|
|
23
|
+
.DS_Store
|
|
24
|
+
Thumbs.db
|
|
25
|
+
|
|
26
|
+
# Test coverage
|
|
27
|
+
coverage/
|
|
28
|
+
|
|
29
|
+
# Temporary files
|
|
30
|
+
tmp/
|
|
31
|
+
temp/
|
|
@@ -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 }}
|