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.
Files changed (443) hide show
  1. package/README.md +159 -0
  2. package/dist/commands/backup.d.ts +11 -0
  3. package/dist/commands/backup.d.ts.map +1 -0
  4. package/dist/commands/backup.js +112 -0
  5. package/dist/commands/backup.js.map +1 -0
  6. package/dist/commands/config.d.ts +28 -0
  7. package/dist/commands/config.d.ts.map +1 -0
  8. package/dist/commands/config.js +190 -0
  9. package/dist/commands/config.js.map +1 -0
  10. package/dist/commands/deploy.d.ts +16 -0
  11. package/dist/commands/deploy.d.ts.map +1 -0
  12. package/dist/commands/deploy.js +235 -0
  13. package/dist/commands/deploy.js.map +1 -0
  14. package/dist/commands/destroy.d.ts +12 -0
  15. package/dist/commands/destroy.d.ts.map +1 -0
  16. package/dist/commands/destroy.js +62 -0
  17. package/dist/commands/destroy.js.map +1 -0
  18. package/dist/commands/domains.d.ts +36 -0
  19. package/dist/commands/domains.d.ts.map +1 -0
  20. package/dist/commands/domains.js +323 -0
  21. package/dist/commands/domains.js.map +1 -0
  22. package/dist/commands/env.d.ts +7 -0
  23. package/dist/commands/env.d.ts.map +1 -0
  24. package/dist/commands/env.js +42 -0
  25. package/dist/commands/env.js.map +1 -0
  26. package/dist/commands/git.d.ts +32 -0
  27. package/dist/commands/git.d.ts.map +1 -0
  28. package/dist/commands/git.js +340 -0
  29. package/dist/commands/git.js.map +1 -0
  30. package/dist/commands/init-ai.d.ts +7 -0
  31. package/dist/commands/init-ai.d.ts.map +1 -0
  32. package/dist/commands/init-ai.js +257 -0
  33. package/dist/commands/init-ai.js.map +1 -0
  34. package/dist/commands/init.d.ts +8 -0
  35. package/dist/commands/init.d.ts.map +1 -0
  36. package/dist/commands/init.js +228 -0
  37. package/dist/commands/init.js.map +1 -0
  38. package/dist/commands/link.d.ts +10 -0
  39. package/dist/commands/link.d.ts.map +1 -0
  40. package/dist/commands/link.js +193 -0
  41. package/dist/commands/link.js.map +1 -0
  42. package/dist/commands/login.d.ts +16 -0
  43. package/dist/commands/login.d.ts.map +1 -0
  44. package/dist/commands/login.js +468 -0
  45. package/dist/commands/login.js.map +1 -0
  46. package/dist/commands/logs.d.ts +16 -0
  47. package/dist/commands/logs.d.ts.map +1 -0
  48. package/dist/commands/logs.js +362 -0
  49. package/dist/commands/logs.js.map +1 -0
  50. package/dist/commands/oauth.d.ts +33 -0
  51. package/dist/commands/oauth.d.ts.map +1 -0
  52. package/dist/commands/oauth.js +181 -0
  53. package/dist/commands/oauth.js.map +1 -0
  54. package/dist/commands/preflight.d.ts +8 -0
  55. package/dist/commands/preflight.d.ts.map +1 -0
  56. package/dist/commands/preflight.js +190 -0
  57. package/dist/commands/preflight.js.map +1 -0
  58. package/dist/commands/program.d.ts +7 -0
  59. package/dist/commands/program.d.ts.map +1 -0
  60. package/dist/commands/program.js +59 -0
  61. package/dist/commands/program.js.map +1 -0
  62. package/dist/commands/programs.d.ts +7 -0
  63. package/dist/commands/programs.d.ts.map +1 -0
  64. package/dist/commands/programs.js +42 -0
  65. package/dist/commands/programs.js.map +1 -0
  66. package/dist/commands/push.d.ts +12 -0
  67. package/dist/commands/push.d.ts.map +1 -0
  68. package/dist/commands/push.js +166 -0
  69. package/dist/commands/push.js.map +1 -0
  70. package/dist/commands/register-scaffold.test.d.ts +2 -0
  71. package/dist/commands/register-scaffold.test.d.ts.map +1 -0
  72. package/dist/commands/register-scaffold.test.js +291 -0
  73. package/dist/commands/register-scaffold.test.js.map +1 -0
  74. package/dist/commands/register.d.ts +7 -0
  75. package/dist/commands/register.d.ts.map +1 -0
  76. package/dist/commands/register.js +304 -0
  77. package/dist/commands/register.js.map +1 -0
  78. package/dist/commands/rollback.d.ts +11 -0
  79. package/dist/commands/rollback.d.ts.map +1 -0
  80. package/dist/commands/rollback.js +147 -0
  81. package/dist/commands/rollback.js.map +1 -0
  82. package/dist/commands/sample.d.ts +15 -0
  83. package/dist/commands/sample.d.ts.map +1 -0
  84. package/dist/commands/sample.js +312 -0
  85. package/dist/commands/sample.js.map +1 -0
  86. package/dist/commands/scopes.d.ts +29 -0
  87. package/dist/commands/scopes.d.ts.map +1 -0
  88. package/dist/commands/scopes.js +203 -0
  89. package/dist/commands/scopes.js.map +1 -0
  90. package/dist/commands/services.d.ts +13 -0
  91. package/dist/commands/services.d.ts.map +1 -0
  92. package/dist/commands/services.js +95 -0
  93. package/dist/commands/services.js.map +1 -0
  94. package/dist/commands/settings.d.ts +10 -0
  95. package/dist/commands/settings.d.ts.map +1 -0
  96. package/dist/commands/settings.js +41 -0
  97. package/dist/commands/settings.js.map +1 -0
  98. package/dist/commands/signup.d.ts +9 -0
  99. package/dist/commands/signup.d.ts.map +1 -0
  100. package/dist/commands/signup.js +192 -0
  101. package/dist/commands/signup.js.map +1 -0
  102. package/dist/commands/status.d.ts +9 -0
  103. package/dist/commands/status.d.ts.map +1 -0
  104. package/dist/commands/status.js +170 -0
  105. package/dist/commands/status.js.map +1 -0
  106. package/dist/commands/troubleshoot.d.ts +19 -0
  107. package/dist/commands/troubleshoot.d.ts.map +1 -0
  108. package/dist/commands/troubleshoot.js +465 -0
  109. package/dist/commands/troubleshoot.js.map +1 -0
  110. package/dist/commands/update.d.ts +6 -0
  111. package/dist/commands/update.d.ts.map +1 -0
  112. package/dist/commands/update.js +64 -0
  113. package/dist/commands/update.js.map +1 -0
  114. package/dist/commands/user.d.ts +17 -0
  115. package/dist/commands/user.d.ts.map +1 -0
  116. package/dist/commands/user.js +126 -0
  117. package/dist/commands/user.js.map +1 -0
  118. package/dist/commands/versions.d.ts +16 -0
  119. package/dist/commands/versions.d.ts.map +1 -0
  120. package/dist/commands/versions.js +116 -0
  121. package/dist/commands/versions.js.map +1 -0
  122. package/dist/index.d.ts +3 -0
  123. package/dist/index.d.ts.map +1 -0
  124. package/dist/index.js +556 -0
  125. package/dist/index.js.map +1 -0
  126. package/dist/lib/__tests__/scaffold-integration.test.d.ts +2 -0
  127. package/dist/lib/__tests__/scaffold-integration.test.d.ts.map +1 -0
  128. package/dist/lib/__tests__/scaffold-integration.test.js +321 -0
  129. package/dist/lib/__tests__/scaffold-integration.test.js.map +1 -0
  130. package/dist/lib/ai/client.d.ts +39 -0
  131. package/dist/lib/ai/client.d.ts.map +1 -0
  132. package/dist/lib/ai/client.js +236 -0
  133. package/dist/lib/ai/client.js.map +1 -0
  134. package/dist/lib/ai/generator.d.ts +17 -0
  135. package/dist/lib/ai/generator.d.ts.map +1 -0
  136. package/dist/lib/ai/generator.js +338 -0
  137. package/dist/lib/ai/generator.js.map +1 -0
  138. package/dist/lib/ai/prompts.d.ts +47 -0
  139. package/dist/lib/ai/prompts.d.ts.map +1 -0
  140. package/dist/lib/ai/prompts.js +247 -0
  141. package/dist/lib/ai/prompts.js.map +1 -0
  142. package/dist/lib/ai/scanner.d.ts +50 -0
  143. package/dist/lib/ai/scanner.d.ts.map +1 -0
  144. package/dist/lib/ai/scanner.js +237 -0
  145. package/dist/lib/ai/scanner.js.map +1 -0
  146. package/dist/lib/api.d.ts +18 -0
  147. package/dist/lib/api.d.ts.map +1 -0
  148. package/dist/lib/api.js +67 -0
  149. package/dist/lib/api.js.map +1 -0
  150. package/dist/lib/auto-register.d.ts +12 -0
  151. package/dist/lib/auto-register.d.ts.map +1 -0
  152. package/dist/lib/auto-register.js +42 -0
  153. package/dist/lib/auto-register.js.map +1 -0
  154. package/dist/lib/bio.d.ts +90 -0
  155. package/dist/lib/bio.d.ts.map +1 -0
  156. package/dist/lib/bio.js +247 -0
  157. package/dist/lib/bio.js.map +1 -0
  158. package/dist/lib/builder.d.ts +65 -0
  159. package/dist/lib/builder.d.ts.map +1 -0
  160. package/dist/lib/builder.js +192 -0
  161. package/dist/lib/builder.js.map +1 -0
  162. package/dist/lib/catalog.d.ts +3 -0
  163. package/dist/lib/catalog.d.ts.map +1 -0
  164. package/dist/lib/catalog.js +17 -0
  165. package/dist/lib/catalog.js.map +1 -0
  166. package/dist/lib/config.d.ts +20 -0
  167. package/dist/lib/config.d.ts.map +1 -0
  168. package/dist/lib/config.js +124 -0
  169. package/dist/lib/config.js.map +1 -0
  170. package/dist/lib/forgejo.d.ts +188 -0
  171. package/dist/lib/forgejo.d.ts.map +1 -0
  172. package/dist/lib/forgejo.js +305 -0
  173. package/dist/lib/forgejo.js.map +1 -0
  174. package/dist/lib/output.d.ts +12 -0
  175. package/dist/lib/output.d.ts.map +1 -0
  176. package/dist/lib/output.js +39 -0
  177. package/dist/lib/output.js.map +1 -0
  178. package/dist/lib/scaffold.d.ts +30 -0
  179. package/dist/lib/scaffold.d.ts.map +1 -0
  180. package/dist/lib/scaffold.js +180 -0
  181. package/dist/lib/scaffold.js.map +1 -0
  182. package/dist/lib/scope-requests.d.ts +17 -0
  183. package/dist/lib/scope-requests.d.ts.map +1 -0
  184. package/dist/lib/scope-requests.js +78 -0
  185. package/dist/lib/scope-requests.js.map +1 -0
  186. package/dist/lib/scope-requests.test.d.ts +2 -0
  187. package/dist/lib/scope-requests.test.d.ts.map +1 -0
  188. package/dist/lib/scope-requests.test.js +239 -0
  189. package/dist/lib/scope-requests.test.js.map +1 -0
  190. package/dist/lib/troubleshoot/analyzer.d.ts +14 -0
  191. package/dist/lib/troubleshoot/analyzer.d.ts.map +1 -0
  192. package/dist/lib/troubleshoot/analyzer.js +541 -0
  193. package/dist/lib/troubleshoot/analyzer.js.map +1 -0
  194. package/dist/lib/troubleshoot/auto-fix.d.ts +29 -0
  195. package/dist/lib/troubleshoot/auto-fix.d.ts.map +1 -0
  196. package/dist/lib/troubleshoot/auto-fix.js +373 -0
  197. package/dist/lib/troubleshoot/auto-fix.js.map +1 -0
  198. package/dist/lib/troubleshoot/index.d.ts +5 -0
  199. package/dist/lib/troubleshoot/index.d.ts.map +1 -0
  200. package/dist/lib/troubleshoot/index.js +6 -0
  201. package/dist/lib/troubleshoot/index.js.map +1 -0
  202. package/dist/lib/troubleshoot/log-fetcher.d.ts +43 -0
  203. package/dist/lib/troubleshoot/log-fetcher.d.ts.map +1 -0
  204. package/dist/lib/troubleshoot/log-fetcher.js +431 -0
  205. package/dist/lib/troubleshoot/log-fetcher.js.map +1 -0
  206. package/dist/lib/troubleshoot/redactor.d.ts +35 -0
  207. package/dist/lib/troubleshoot/redactor.d.ts.map +1 -0
  208. package/dist/lib/troubleshoot/redactor.js +208 -0
  209. package/dist/lib/troubleshoot/redactor.js.map +1 -0
  210. package/dist/lib/validators/catalog-schemas.d.ts +59 -0
  211. package/dist/lib/validators/catalog-schemas.d.ts.map +1 -0
  212. package/dist/lib/validators/catalog-schemas.js +32 -0
  213. package/dist/lib/validators/catalog-schemas.js.map +1 -0
  214. package/dist/lib/validators/catalog-validator.d.ts +3 -0
  215. package/dist/lib/validators/catalog-validator.d.ts.map +1 -0
  216. package/dist/lib/validators/catalog-validator.js +247 -0
  217. package/dist/lib/validators/catalog-validator.js.map +1 -0
  218. package/dist/lib/validators/catalog-validator.test.d.ts +2 -0
  219. package/dist/lib/validators/catalog-validator.test.d.ts.map +1 -0
  220. package/dist/lib/validators/catalog-validator.test.js +420 -0
  221. package/dist/lib/validators/catalog-validator.test.js.map +1 -0
  222. package/dist/lib/validators/dockerfile-validator.d.ts +5 -0
  223. package/dist/lib/validators/dockerfile-validator.d.ts.map +1 -0
  224. package/dist/lib/validators/dockerfile-validator.js +295 -0
  225. package/dist/lib/validators/dockerfile-validator.js.map +1 -0
  226. package/dist/lib/validators/dockerfile-validator.test.d.ts +2 -0
  227. package/dist/lib/validators/dockerfile-validator.test.d.ts.map +1 -0
  228. package/dist/lib/validators/dockerfile-validator.test.js +161 -0
  229. package/dist/lib/validators/dockerfile-validator.test.js.map +1 -0
  230. package/dist/lib/validators/env-validator.d.ts +3 -0
  231. package/dist/lib/validators/env-validator.d.ts.map +1 -0
  232. package/dist/lib/validators/env-validator.js +268 -0
  233. package/dist/lib/validators/env-validator.js.map +1 -0
  234. package/dist/lib/validators/git-validator.d.ts +3 -0
  235. package/dist/lib/validators/git-validator.d.ts.map +1 -0
  236. package/dist/lib/validators/git-validator.js +236 -0
  237. package/dist/lib/validators/git-validator.js.map +1 -0
  238. package/dist/lib/validators/health-detector.d.ts +4 -0
  239. package/dist/lib/validators/health-detector.d.ts.map +1 -0
  240. package/dist/lib/validators/health-detector.js +172 -0
  241. package/dist/lib/validators/health-detector.js.map +1 -0
  242. package/dist/lib/validators/health-detector.test.d.ts +2 -0
  243. package/dist/lib/validators/health-detector.test.d.ts.map +1 -0
  244. package/dist/lib/validators/health-detector.test.js +118 -0
  245. package/dist/lib/validators/health-detector.test.js.map +1 -0
  246. package/dist/lib/validators/index.d.ts +8 -0
  247. package/dist/lib/validators/index.d.ts.map +1 -0
  248. package/dist/lib/validators/index.js +8 -0
  249. package/dist/lib/validators/index.js.map +1 -0
  250. package/dist/lib/validators/route-validator.d.ts +3 -0
  251. package/dist/lib/validators/route-validator.d.ts.map +1 -0
  252. package/dist/lib/validators/route-validator.js +238 -0
  253. package/dist/lib/validators/route-validator.js.map +1 -0
  254. package/dist/lib/validators/scope-validator.d.ts +3 -0
  255. package/dist/lib/validators/scope-validator.d.ts.map +1 -0
  256. package/dist/lib/validators/scope-validator.js +141 -0
  257. package/dist/lib/validators/scope-validator.js.map +1 -0
  258. package/dist/lib/watch.d.ts +35 -0
  259. package/dist/lib/watch.d.ts.map +1 -0
  260. package/dist/lib/watch.js +171 -0
  261. package/dist/lib/watch.js.map +1 -0
  262. package/dist/templates/api/.env.example +15 -0
  263. package/dist/templates/api/Dockerfile +45 -0
  264. package/dist/templates/api/README.md +85 -0
  265. package/dist/templates/api/catalog-info.yaml +22 -0
  266. package/dist/templates/api/gitignore +31 -0
  267. package/dist/templates/api/helm/{{name}}/Chart.yaml +9 -0
  268. package/dist/templates/api/helm/{{name}}/templates/deployment.yaml +72 -0
  269. package/dist/templates/api/helm/{{name}}/templates/ingress.yaml +43 -0
  270. package/dist/templates/api/helm/{{name}}/templates/service.yaml +17 -0
  271. package/dist/templates/api/helm/{{name}}/values.yaml +64 -0
  272. package/dist/templates/api/package.json +33 -0
  273. package/dist/templates/api/src/index.ts +61 -0
  274. package/dist/templates/api/src/routes/example.ts +165 -0
  275. package/dist/templates/api/tsconfig.json +18 -0
  276. package/dist/templates/crosspod/README.md +87 -0
  277. package/dist/templates/crosspod/service-a/Dockerfile +27 -0
  278. package/dist/templates/crosspod/service-a/catalog-info.yaml +54 -0
  279. package/dist/templates/crosspod/service-a/gitignore +5 -0
  280. package/dist/templates/crosspod/service-a/helm/{{name}}-service-a/Chart.yaml +6 -0
  281. package/dist/templates/crosspod/service-a/helm/{{name}}-service-a/templates/deployment.yaml +72 -0
  282. package/dist/templates/crosspod/service-a/helm/{{name}}-service-a/templates/ingress.yaml +43 -0
  283. package/dist/templates/crosspod/service-a/helm/{{name}}-service-a/templates/service.yaml +17 -0
  284. package/dist/templates/crosspod/service-a/helm/{{name}}-service-a/values.yaml +44 -0
  285. package/dist/templates/crosspod/service-a/package.json +29 -0
  286. package/dist/templates/crosspod/service-a/src/index.ts +89 -0
  287. package/dist/templates/crosspod/service-a/tsconfig.json +14 -0
  288. package/dist/templates/crosspod/service-b/Dockerfile +27 -0
  289. package/dist/templates/crosspod/service-b/catalog-info.yaml +27 -0
  290. package/dist/templates/crosspod/service-b/gitignore +5 -0
  291. package/dist/templates/crosspod/service-b/helm/{{name}}-service-b/Chart.yaml +6 -0
  292. package/dist/templates/crosspod/service-b/helm/{{name}}-service-b/templates/deployment.yaml +72 -0
  293. package/dist/templates/crosspod/service-b/helm/{{name}}-service-b/templates/ingress.yaml +43 -0
  294. package/dist/templates/crosspod/service-b/helm/{{name}}-service-b/templates/service.yaml +17 -0
  295. package/dist/templates/crosspod/service-b/helm/{{name}}-service-b/values.yaml +47 -0
  296. package/dist/templates/crosspod/service-b/package.json +26 -0
  297. package/dist/templates/crosspod/service-b/src/index.ts +143 -0
  298. package/dist/templates/crosspod/service-b/tsconfig.json +14 -0
  299. package/dist/templates/mga/{{name}}-api/.env.example +5 -0
  300. package/dist/templates/mga/{{name}}-api/Dockerfile +45 -0
  301. package/dist/templates/mga/{{name}}-api/catalog-info.yaml +44 -0
  302. package/dist/templates/mga/{{name}}-api/gitignore +31 -0
  303. package/dist/templates/mga/{{name}}-api/helm/{{name}}-api/Chart.yaml +9 -0
  304. package/dist/templates/mga/{{name}}-api/helm/{{name}}-api/templates/deployment.yaml +72 -0
  305. package/dist/templates/mga/{{name}}-api/helm/{{name}}-api/templates/ingress.yaml +43 -0
  306. package/dist/templates/mga/{{name}}-api/helm/{{name}}-api/templates/service.yaml +17 -0
  307. package/dist/templates/mga/{{name}}-api/helm/{{name}}-api/values.yaml +65 -0
  308. package/dist/templates/mga/{{name}}-api/package.json +37 -0
  309. package/dist/templates/mga/{{name}}-api/src/index.ts +82 -0
  310. package/dist/templates/mga/{{name}}-api/src/lib/mongo.ts +19 -0
  311. package/dist/templates/mga/{{name}}-api/src/middleware/auth.ts +133 -0
  312. package/dist/templates/mga/{{name}}-api/src/models/agent.ts +45 -0
  313. package/dist/templates/mga/{{name}}-api/src/models/application.ts +58 -0
  314. package/dist/templates/mga/{{name}}-api/src/models/invite.ts +39 -0
  315. package/dist/templates/mga/{{name}}-api/src/models/policy.ts +59 -0
  316. package/dist/templates/mga/{{name}}-api/src/models/product.ts +51 -0
  317. package/dist/templates/mga/{{name}}-api/src/models/quote.ts +68 -0
  318. package/dist/templates/mga/{{name}}-api/src/routes/agents.ts +98 -0
  319. package/dist/templates/mga/{{name}}-api/src/routes/applications.ts +170 -0
  320. package/dist/templates/mga/{{name}}-api/src/routes/invites.ts +146 -0
  321. package/dist/templates/mga/{{name}}-api/src/routes/policies.ts +70 -0
  322. package/dist/templates/mga/{{name}}-api/src/routes/products.ts +154 -0
  323. package/dist/templates/mga/{{name}}-api/src/routes/quotes.ts +263 -0
  324. package/dist/templates/mga/{{name}}-api/src/routes/reports.ts +199 -0
  325. package/dist/templates/mga/{{name}}-api/tsconfig.json +18 -0
  326. package/dist/templates/mga/{{name}}-web/.dockerignore +6 -0
  327. package/dist/templates/mga/{{name}}-web/.env.example +6 -0
  328. package/dist/templates/mga/{{name}}-web/Dockerfile +51 -0
  329. package/dist/templates/mga/{{name}}-web/catalog-info.yaml +24 -0
  330. package/dist/templates/mga/{{name}}-web/dockerignore +6 -0
  331. package/dist/templates/mga/{{name}}-web/gitignore +36 -0
  332. package/dist/templates/mga/{{name}}-web/helm/{{name}}-web/Chart.yaml +9 -0
  333. package/dist/templates/mga/{{name}}-web/helm/{{name}}-web/templates/_helpers.tpl +49 -0
  334. package/dist/templates/mga/{{name}}-web/helm/{{name}}-web/templates/configmap.yaml +10 -0
  335. package/dist/templates/mga/{{name}}-web/helm/{{name}}-web/templates/deployment.yaml +56 -0
  336. package/dist/templates/mga/{{name}}-web/helm/{{name}}-web/templates/ingress.yaml +41 -0
  337. package/dist/templates/mga/{{name}}-web/helm/{{name}}-web/templates/service.yaml +15 -0
  338. package/dist/templates/mga/{{name}}-web/helm/{{name}}-web/values.yaml +70 -0
  339. package/dist/templates/mga/{{name}}-web/next.config.js +8 -0
  340. package/dist/templates/mga/{{name}}-web/package.json +30 -0
  341. package/dist/templates/mga/{{name}}-web/public/.gitkeep +0 -0
  342. package/dist/templates/mga/{{name}}-web/public/gitkeep +0 -0
  343. package/dist/templates/mga/{{name}}-web/src/app/api/auth/callback/route.ts +77 -0
  344. package/dist/templates/mga/{{name}}-web/src/app/api/auth/login/route.ts +16 -0
  345. package/dist/templates/mga/{{name}}-web/src/app/api/auth/logout/route.ts +7 -0
  346. package/dist/templates/mga/{{name}}-web/src/app/api/auth/session/route.ts +42 -0
  347. package/dist/templates/mga/{{name}}-web/src/app/api/health/route.ts +10 -0
  348. package/dist/templates/mga/{{name}}-web/src/app/api/proxy/applications/route.ts +47 -0
  349. package/dist/templates/mga/{{name}}-web/src/app/applications/layout.tsx +17 -0
  350. package/dist/templates/mga/{{name}}-web/src/app/applications/new/page.tsx +374 -0
  351. package/dist/templates/mga/{{name}}-web/src/app/applications/page.tsx +109 -0
  352. package/dist/templates/mga/{{name}}-web/src/app/dashboard/admin/page.tsx +179 -0
  353. package/dist/templates/mga/{{name}}-web/src/app/dashboard/agent/page.tsx +125 -0
  354. package/dist/templates/mga/{{name}}-web/src/app/dashboard/insured/page.tsx +145 -0
  355. package/dist/templates/mga/{{name}}-web/src/app/dashboard/layout.tsx +17 -0
  356. package/dist/templates/mga/{{name}}-web/src/app/dashboard/page.tsx +27 -0
  357. package/dist/templates/mga/{{name}}-web/src/app/dashboard/shell.tsx +89 -0
  358. package/dist/templates/mga/{{name}}-web/src/app/globals.css +477 -0
  359. package/dist/templates/mga/{{name}}-web/src/app/layout.tsx +19 -0
  360. package/dist/templates/mga/{{name}}-web/src/app/page.tsx +74 -0
  361. package/dist/templates/mga/{{name}}-web/src/app/reports/layout.tsx +21 -0
  362. package/dist/templates/mga/{{name}}-web/src/app/reports/page.tsx +231 -0
  363. package/dist/templates/mga/{{name}}-web/src/lib/api.ts +79 -0
  364. package/dist/templates/mga/{{name}}-web/src/lib/auth.ts +285 -0
  365. package/dist/templates/mga/{{name}}-web/src/middleware.ts +71 -0
  366. package/dist/templates/mga/{{name}}-web/tsconfig.json +26 -0
  367. package/dist/templates/nextjs/.env.example +11 -0
  368. package/dist/templates/nextjs/Dockerfile +51 -0
  369. package/dist/templates/nextjs/README.md +87 -0
  370. package/dist/templates/nextjs/catalog-info.yaml +16 -0
  371. package/dist/templates/nextjs/gitignore +36 -0
  372. package/dist/templates/nextjs/helm/{{name}}/Chart.yaml +9 -0
  373. package/dist/templates/nextjs/helm/{{name}}/templates/deployment.yaml +72 -0
  374. package/dist/templates/nextjs/helm/{{name}}/templates/ingress.yaml +43 -0
  375. package/dist/templates/nextjs/helm/{{name}}/templates/service.yaml +17 -0
  376. package/dist/templates/nextjs/helm/{{name}}/values.yaml +60 -0
  377. package/dist/templates/nextjs/next.config.js +23 -0
  378. package/dist/templates/nextjs/package.json +29 -0
  379. package/dist/templates/nextjs/public/.gitkeep +0 -0
  380. package/dist/templates/nextjs/public/gitkeep +0 -0
  381. package/dist/templates/nextjs/src/app/api/example/route.ts +63 -0
  382. package/dist/templates/nextjs/src/app/api/health/route.ts +10 -0
  383. package/dist/templates/nextjs/src/app/layout.tsx +18 -0
  384. package/dist/templates/nextjs/src/app/page.tsx +49 -0
  385. package/dist/templates/nextjs/tsconfig.json +26 -0
  386. package/dist/templates/nextjs-oauth/.dockerignore +6 -0
  387. package/dist/templates/nextjs-oauth/.env.example +12 -0
  388. package/dist/templates/nextjs-oauth/Dockerfile +51 -0
  389. package/dist/templates/nextjs-oauth/README.md +115 -0
  390. package/dist/templates/nextjs-oauth/catalog-info.yaml +17 -0
  391. package/dist/templates/nextjs-oauth/dockerignore +6 -0
  392. package/dist/templates/nextjs-oauth/gitignore +36 -0
  393. package/dist/templates/nextjs-oauth/helm/Chart.yaml +6 -0
  394. package/dist/templates/nextjs-oauth/helm/templates/_helpers.tpl +49 -0
  395. package/dist/templates/nextjs-oauth/helm/templates/configmap.yaml +10 -0
  396. package/dist/templates/nextjs-oauth/helm/templates/deployment.yaml +56 -0
  397. package/dist/templates/nextjs-oauth/helm/templates/ingress.yaml +41 -0
  398. package/dist/templates/nextjs-oauth/helm/templates/service.yaml +15 -0
  399. package/dist/templates/nextjs-oauth/helm/values.yaml +69 -0
  400. package/dist/templates/nextjs-oauth/helm/{{name}}/Chart.yaml +9 -0
  401. package/dist/templates/nextjs-oauth/helm/{{name}}/templates/deployment.yaml +68 -0
  402. package/dist/templates/nextjs-oauth/helm/{{name}}/templates/service.yaml +17 -0
  403. package/dist/templates/nextjs-oauth/helm/{{name}}/values.yaml +51 -0
  404. package/dist/templates/nextjs-oauth/next.config.js +23 -0
  405. package/dist/templates/nextjs-oauth/package.json +30 -0
  406. package/dist/templates/nextjs-oauth/public/.gitkeep +0 -0
  407. package/dist/templates/nextjs-oauth/public/gitkeep +0 -0
  408. package/dist/templates/nextjs-oauth/src/app/api/auth/callback/route.ts +77 -0
  409. package/dist/templates/nextjs-oauth/src/app/api/auth/login/route.ts +16 -0
  410. package/dist/templates/nextjs-oauth/src/app/api/auth/logout/route.ts +7 -0
  411. package/dist/templates/nextjs-oauth/src/app/api/auth/session/route.ts +42 -0
  412. package/dist/templates/nextjs-oauth/src/app/api/example/route.ts +63 -0
  413. package/dist/templates/nextjs-oauth/src/app/api/health/route.ts +10 -0
  414. package/dist/templates/nextjs-oauth/src/app/dashboard/page.tsx +92 -0
  415. package/dist/templates/nextjs-oauth/src/app/layout.tsx +18 -0
  416. package/dist/templates/nextjs-oauth/src/app/page.tsx +110 -0
  417. package/dist/templates/nextjs-oauth/src/lib/auth.ts +285 -0
  418. package/dist/templates/nextjs-oauth/src/middleware.ts +71 -0
  419. package/dist/templates/nextjs-oauth/tsconfig.json +26 -0
  420. package/dist/templates/static/catalog-info.yaml +14 -0
  421. package/dist/templates/static/index.html +16 -0
  422. package/dist/templates/static/styles.css +39 -0
  423. package/dist/templates/worker/.env.example +13 -0
  424. package/dist/templates/worker/Dockerfile +26 -0
  425. package/dist/templates/worker/README.md +106 -0
  426. package/dist/templates/worker/catalog-info.yaml +19 -0
  427. package/dist/templates/worker/gitignore +5 -0
  428. package/dist/templates/worker/helm/{{name}}/Chart.yaml +9 -0
  429. package/dist/templates/worker/helm/{{name}}/templates/deployment.yaml +68 -0
  430. package/dist/templates/worker/helm/{{name}}/templates/ingress.yaml +43 -0
  431. package/dist/templates/worker/helm/{{name}}/values.yaml +64 -0
  432. package/dist/templates/worker/package.json +26 -0
  433. package/dist/templates/worker/src/index.ts +185 -0
  434. package/dist/templates/worker/tsconfig.json +14 -0
  435. package/dist/types/index.d.ts +596 -0
  436. package/dist/types/index.d.ts.map +1 -0
  437. package/dist/types/index.js +41 -0
  438. package/dist/types/index.js.map +1 -0
  439. package/dist/types/platform.d.ts +191 -0
  440. package/dist/types/platform.d.ts.map +1 -0
  441. package/dist/types/platform.js +17 -0
  442. package/dist/types/platform.js.map +1 -0
  443. 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,9 @@
1
+ apiVersion: v2
2
+ name: {{name}}
3
+ description: Helm chart for {{name}}
4
+ type: application
5
+ version: 0.1.0
6
+ appVersion: "0.1.0"
7
+ maintainers:
8
+ - name: team-platform
9
+ email: platform@insureco.io
@@ -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 }}