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,172 @@
1
+ import { readFile, readdir } from 'node:fs/promises';
2
+ import { join, extname } from 'node:path';
3
+ import { getFrameworkFromCatalog } from './dockerfile-validator.js';
4
+ // Frameworks that don't need app-level health endpoints (server handles it)
5
+ const HEALTH_SKIP_FRAMEWORKS = ['static'];
6
+ // Patterns that indicate health endpoint implementation
7
+ const HEALTH_PATTERNS = [
8
+ // Express/Fastify style
9
+ /(?:app|router|server)\s*\.\s*(?:get|use)\s*\(\s*['"](\/health|\/healthz|\/health\/live|\/health\/ready)['"]/gi,
10
+ // NestJS style
11
+ /@Get\s*\(\s*['"](health|healthz)['"]\s*\)/gi,
12
+ // Generic route definition
13
+ /['"](?:\/health|\/healthz|\/health\/live|\/health\/ready)['"]/gi,
14
+ // Go style
15
+ /(?:Handle|HandleFunc)\s*\(\s*['"](\/health|\/healthz)['"]/gi,
16
+ // Python/FastAPI style
17
+ /@(?:app|router)\s*\.\s*get\s*\(\s*['"](\/health|\/healthz)['"]/gi,
18
+ ];
19
+ // File extensions to scan
20
+ const SCAN_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.go', '.py', '.rs'];
21
+ // Directories to skip
22
+ const SKIP_DIRS = ['node_modules', '.git', 'dist', 'build', 'coverage', '.next', '__pycache__', 'target', 'vendor'];
23
+ export async function detectHealthEndpoints(cwd = process.cwd()) {
24
+ const checks = [];
25
+ // Static sites use nginx which handles health checks — no app-level endpoint needed
26
+ const framework = await getFrameworkFromCatalog(cwd);
27
+ if (framework && HEALTH_SKIP_FRAMEWORKS.includes(framework)) {
28
+ checks.push({
29
+ name: 'Health endpoint defined',
30
+ status: 'skip',
31
+ message: `Health endpoint not required for ${framework} framework — nginx handles health checks`,
32
+ });
33
+ return { checks };
34
+ }
35
+ try {
36
+ const matches = await scanForHealthEndpoints(cwd);
37
+ if (matches.length > 0) {
38
+ const details = matches.map(m => `${m.file}:${m.line} - ${m.path}`);
39
+ // Check if multiple health endpoints exist
40
+ const uniquePaths = [...new Set(matches.map(m => m.path))];
41
+ if (uniquePaths.length > 1) {
42
+ checks.push({
43
+ name: 'Health endpoint defined',
44
+ status: 'warn',
45
+ message: `Multiple health endpoint paths detected: ${uniquePaths.join(', ')}`,
46
+ details,
47
+ remediation: 'Consider consolidating to a single /health endpoint',
48
+ });
49
+ }
50
+ else {
51
+ checks.push({
52
+ name: 'Health endpoint defined',
53
+ status: 'pass',
54
+ message: `Health endpoint found at ${uniquePaths[0]}`,
55
+ details,
56
+ });
57
+ }
58
+ // Check for Kubernetes-style readiness/liveness probes
59
+ const hasLiveness = matches.some(m => m.path.includes('live') || m.path.includes('liveness'));
60
+ const hasReadiness = matches.some(m => m.path.includes('ready') || m.path.includes('readiness'));
61
+ if (hasLiveness && hasReadiness) {
62
+ checks.push({
63
+ name: 'Kubernetes probes',
64
+ status: 'pass',
65
+ message: 'Separate liveness and readiness probes detected',
66
+ });
67
+ }
68
+ else if (matches.length > 0) {
69
+ checks.push({
70
+ name: 'Kubernetes probes',
71
+ status: 'warn',
72
+ message: 'Consider adding separate liveness and readiness probes',
73
+ details: [
74
+ 'Liveness probe: /health/live - restart if unhealthy',
75
+ 'Readiness probe: /health/ready - remove from load balancer if not ready',
76
+ ],
77
+ remediation: 'Add /health/live and /health/ready endpoints for better Kubernetes integration',
78
+ });
79
+ }
80
+ }
81
+ else {
82
+ checks.push({
83
+ name: 'Health endpoint defined',
84
+ status: 'fail',
85
+ message: 'No health endpoint detected in source code',
86
+ details: [
87
+ 'Searched for: /health, /healthz, /health/live, /health/ready',
88
+ `Scanned extensions: ${SCAN_EXTENSIONS.join(', ')}`,
89
+ ],
90
+ remediation: 'Add a GET /health endpoint that returns 200 OK when the service is healthy',
91
+ });
92
+ }
93
+ }
94
+ catch (error) {
95
+ checks.push({
96
+ name: 'Health endpoint scan',
97
+ status: 'fail',
98
+ message: `Failed to scan for health endpoints: ${error instanceof Error ? error.message : 'Unknown error'}`,
99
+ });
100
+ }
101
+ return { checks };
102
+ }
103
+ async function scanForHealthEndpoints(dir, baseDir = dir) {
104
+ const matches = [];
105
+ try {
106
+ const entries = await readdir(dir, { withFileTypes: true });
107
+ for (const entry of entries) {
108
+ const fullPath = join(dir, entry.name);
109
+ if (entry.isDirectory()) {
110
+ if (!SKIP_DIRS.includes(entry.name)) {
111
+ const subMatches = await scanForHealthEndpoints(fullPath, baseDir);
112
+ matches.push(...subMatches);
113
+ }
114
+ }
115
+ else if (entry.isFile()) {
116
+ const ext = extname(entry.name);
117
+ if (SCAN_EXTENSIONS.includes(ext)) {
118
+ const fileMatches = await scanFile(fullPath, baseDir);
119
+ matches.push(...fileMatches);
120
+ }
121
+ }
122
+ }
123
+ }
124
+ catch {
125
+ // Ignore permission errors and continue
126
+ }
127
+ return matches;
128
+ }
129
+ async function scanFile(filePath, baseDir) {
130
+ const matches = [];
131
+ try {
132
+ const content = await readFile(filePath, 'utf-8');
133
+ const lines = content.split('\n');
134
+ const relativePath = filePath.replace(baseDir + '/', '');
135
+ for (let i = 0; i < lines.length; i++) {
136
+ const line = lines[i];
137
+ for (const pattern of HEALTH_PATTERNS) {
138
+ // Reset lastIndex for global patterns
139
+ pattern.lastIndex = 0;
140
+ const match = pattern.exec(line);
141
+ if (match) {
142
+ // Extract the health path from the match
143
+ const pathMatch = line.match(/['"](\/health[^'"]*)['"]/i);
144
+ const healthPath = pathMatch ? pathMatch[1] : '/health';
145
+ matches.push({
146
+ file: relativePath,
147
+ line: i + 1,
148
+ path: healthPath,
149
+ snippet: line.trim().substring(0, 100),
150
+ });
151
+ break; // Only one match per line
152
+ }
153
+ }
154
+ }
155
+ }
156
+ catch {
157
+ // Ignore read errors and continue
158
+ }
159
+ return matches;
160
+ }
161
+ // Export for use by other validators
162
+ export async function getHealthEndpointPath(cwd = process.cwd()) {
163
+ const matches = await scanForHealthEndpoints(cwd);
164
+ if (matches.length === 0)
165
+ return null;
166
+ // Prefer /health over others
167
+ const healthMatch = matches.find(m => m.path === '/health');
168
+ if (healthMatch)
169
+ return healthMatch.path;
170
+ return matches[0].path;
171
+ }
172
+ //# sourceMappingURL=health-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-detector.js","sourceRoot":"","sources":["../../../src/lib/validators/health-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=health-detector.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-detector.test.d.ts","sourceRoot":"","sources":["../../../src/lib/validators/health-detector.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,118 @@
1
+ import { describe, it, expect, afterEach } from 'vitest';
2
+ import { mkdir, writeFile, rm } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { tmpdir } from 'node:os';
5
+ import { randomUUID } from 'node:crypto';
6
+ import { detectHealthEndpoints } from './health-detector.js';
7
+ async function createFixture(files) {
8
+ const dir = join(tmpdir(), `iec-test-${randomUUID()}`);
9
+ await mkdir(dir, { recursive: true });
10
+ for (const [name, content] of Object.entries(files)) {
11
+ const filePath = join(dir, name);
12
+ const parentDir = join(filePath, '..');
13
+ await mkdir(parentDir, { recursive: true });
14
+ await writeFile(filePath, content, 'utf-8');
15
+ }
16
+ return dir;
17
+ }
18
+ const STATIC_CATALOG = `
19
+ apiVersion: backstage.io/v1alpha1
20
+ kind: Component
21
+ metadata:
22
+ name: my-site
23
+ description: My static site
24
+ annotations:
25
+ insureco.io/framework: static
26
+ spec:
27
+ type: service
28
+ lifecycle: production
29
+ owner: my-org
30
+ `;
31
+ const EXPRESS_CATALOG = `
32
+ apiVersion: backstage.io/v1alpha1
33
+ kind: Component
34
+ metadata:
35
+ name: my-api
36
+ description: My Express API
37
+ annotations:
38
+ insureco.io/framework: express
39
+ spec:
40
+ type: service
41
+ lifecycle: production
42
+ owner: my-org
43
+ `;
44
+ const BARE_CATALOG = `
45
+ apiVersion: backstage.io/v1alpha1
46
+ kind: Component
47
+ metadata:
48
+ name: my-service
49
+ description: No framework annotation
50
+ spec:
51
+ type: service
52
+ lifecycle: production
53
+ owner: my-org
54
+ `;
55
+ describe('health-detector', () => {
56
+ const tempDirs = [];
57
+ afterEach(async () => {
58
+ await Promise.all(tempDirs.map(d => rm(d, { recursive: true, force: true })));
59
+ tempDirs.splice(0, tempDirs.length);
60
+ });
61
+ async function setup(files) {
62
+ const dir = await createFixture(files);
63
+ tempDirs.push(dir);
64
+ return dir;
65
+ }
66
+ describe('static framework', () => {
67
+ it('should skip health check for static sites', async () => {
68
+ const dir = await setup({
69
+ 'catalog-info.yaml': STATIC_CATALOG,
70
+ 'index.html': '<html><body>Hello</body></html>',
71
+ });
72
+ const result = await detectHealthEndpoints(dir);
73
+ const check = result.checks.find(c => c.name === 'Health endpoint defined');
74
+ expect(check).toBeDefined();
75
+ expect(check.status).toBe('skip');
76
+ expect(check.message).toContain('static');
77
+ expect(check.message).toContain('nginx');
78
+ });
79
+ it('should skip health check for static site even without html files', async () => {
80
+ const dir = await setup({ 'catalog-info.yaml': STATIC_CATALOG });
81
+ const result = await detectHealthEndpoints(dir);
82
+ const check = result.checks.find(c => c.name === 'Health endpoint defined');
83
+ expect(check).toBeDefined();
84
+ expect(check.status).toBe('skip');
85
+ });
86
+ });
87
+ describe('non-static frameworks', () => {
88
+ it('should still require health endpoint for express apps', async () => {
89
+ const dir = await setup({ 'catalog-info.yaml': EXPRESS_CATALOG });
90
+ const result = await detectHealthEndpoints(dir);
91
+ const check = result.checks.find(c => c.name === 'Health endpoint defined');
92
+ expect(check).toBeDefined();
93
+ expect(check.status).toBe('fail');
94
+ });
95
+ it('should pass when express app has health endpoint', async () => {
96
+ const dir = await setup({
97
+ 'catalog-info.yaml': EXPRESS_CATALOG,
98
+ 'src/index.ts': `
99
+ import express from 'express'
100
+ const app = express()
101
+ app.get('/health', (req, res) => res.json({ status: 'ok' }))
102
+ `,
103
+ });
104
+ const result = await detectHealthEndpoints(dir);
105
+ const check = result.checks.find(c => c.name === 'Health endpoint defined');
106
+ expect(check).toBeDefined();
107
+ expect(check.status).toBe('pass');
108
+ });
109
+ it('should fail when no catalog and no health endpoint', async () => {
110
+ const dir = await setup({ 'catalog-info.yaml': BARE_CATALOG });
111
+ const result = await detectHealthEndpoints(dir);
112
+ const check = result.checks.find(c => c.name === 'Health endpoint defined');
113
+ expect(check).toBeDefined();
114
+ expect(check.status).toBe('fail');
115
+ });
116
+ });
117
+ });
118
+ //# sourceMappingURL=health-detector.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-detector.test.js","sourceRoot":"","sources":["../../../src/lib/validators/health-detector.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export { validateCatalog } from './catalog-validator.js';
2
+ export { validateDockerfile, detectFramework, getFrameworkFromCatalog } from './dockerfile-validator.js';
3
+ export { detectHealthEndpoints, getHealthEndpointPath } from './health-detector.js';
4
+ export { validateEnvVars } from './env-validator.js';
5
+ export { validateRoutes } from './route-validator.js';
6
+ export { validateGit } from './git-validator.js';
7
+ export { validateScopes } from './scope-validator.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/validators/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AACxG,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,8 @@
1
+ export { validateCatalog } from './catalog-validator.js';
2
+ export { validateDockerfile, detectFramework, getFrameworkFromCatalog } from './dockerfile-validator.js';
3
+ export { detectHealthEndpoints, getHealthEndpointPath } from './health-detector.js';
4
+ export { validateEnvVars } from './env-validator.js';
5
+ export { validateRoutes } from './route-validator.js';
6
+ export { validateGit } from './git-validator.js';
7
+ export { validateScopes } from './scope-validator.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/validators/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AACxG,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { PreflightResult } from '../../types/index.js';
2
+ export declare function validateRoutes(cwd?: string): Promise<PreflightResult>;
3
+ //# sourceMappingURL=route-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-validator.d.ts","sourceRoot":"","sources":["../../../src/lib/validators/route-validator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAA8D,MAAM,sBAAsB,CAAA;AAavH,wBAAsB,cAAc,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,eAAe,CAAC,CAmF1F"}
@@ -0,0 +1,238 @@
1
+ import { readFile, access } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { parse } from 'yaml';
4
+ // Valid HTTP methods
5
+ const VALID_METHODS = new Set(['GET', 'POST', 'PUT', 'DELETE', 'PATCH']);
6
+ // Valid auth types
7
+ const VALID_AUTH_TYPES = new Set(['none', 'required', 'service']);
8
+ // Route path patterns
9
+ const PATH_PATTERN = /^\/[a-z0-9\-_/:{}*]*$/i;
10
+ const PARAM_PATTERN = /\{([a-z][a-z0-9_]*)\}/gi;
11
+ const WILDCARD_PATTERN = /\*/;
12
+ export async function validateRoutes(cwd = process.cwd()) {
13
+ const checks = [];
14
+ const catalogPath = join(cwd, 'catalog-info.yaml');
15
+ try {
16
+ await access(catalogPath);
17
+ }
18
+ catch {
19
+ checks.push({
20
+ name: 'Routes defined',
21
+ status: 'skip',
22
+ message: 'No catalog-info.yaml found, skipping route validation',
23
+ });
24
+ return { checks };
25
+ }
26
+ try {
27
+ const content = await readFile(catalogPath, 'utf-8');
28
+ const catalogInfo = parse(content);
29
+ const routes = catalogInfo.spec?.routes;
30
+ if (!routes || routes.length === 0) {
31
+ checks.push({
32
+ name: 'Routes defined',
33
+ status: 'warn',
34
+ message: 'No routes defined in catalog-info.yaml',
35
+ details: [
36
+ 'Without routes, the service will not be accessible through Janus gateway',
37
+ 'Only direct Kubernetes service access will work',
38
+ ],
39
+ remediation: 'Add routes to catalog-info.yaml spec.routes section for API gateway access',
40
+ });
41
+ return { checks };
42
+ }
43
+ checks.push({
44
+ name: 'Routes defined',
45
+ status: 'pass',
46
+ message: `${routes.length} route(s) defined in catalog-info.yaml`,
47
+ });
48
+ // Validate each route
49
+ const routeValidations = routes.map(validateRoute);
50
+ const invalidRoutes = routeValidations.filter(v => !v.isValid);
51
+ if (invalidRoutes.length > 0) {
52
+ const details = invalidRoutes.flatMap(r => r.issues.map(i => `${r.path}: ${i}`));
53
+ checks.push({
54
+ name: 'Routes valid',
55
+ status: 'fail',
56
+ message: `${invalidRoutes.length} route(s) have validation errors`,
57
+ details,
58
+ remediation: 'Fix the route validation errors listed above',
59
+ });
60
+ }
61
+ else {
62
+ checks.push({
63
+ name: 'Routes valid',
64
+ status: 'pass',
65
+ message: 'All routes pass validation',
66
+ });
67
+ }
68
+ // Check for overlapping routes
69
+ const overlapCheck = checkRouteOverlaps(routes);
70
+ checks.push(overlapCheck);
71
+ // Check for security concerns
72
+ const securityCheck = checkRouteSecurity(routes);
73
+ checks.push(securityCheck);
74
+ // Check for rate limiting
75
+ const rateLimitCheck = checkRateLimits(routes);
76
+ checks.push(rateLimitCheck);
77
+ }
78
+ catch (error) {
79
+ checks.push({
80
+ name: 'Route validation',
81
+ status: 'fail',
82
+ message: `Failed to validate routes: ${error instanceof Error ? error.message : 'Unknown error'}`,
83
+ });
84
+ }
85
+ return { checks };
86
+ }
87
+ function validateRoute(route) {
88
+ const issues = [];
89
+ // Validate path
90
+ if (!route.path) {
91
+ issues.push('Missing path');
92
+ }
93
+ else if (!PATH_PATTERN.test(route.path)) {
94
+ issues.push(`Invalid path format: ${route.path}`);
95
+ }
96
+ // Validate methods
97
+ if (!route.methods || route.methods.length === 0) {
98
+ issues.push('No HTTP methods defined');
99
+ }
100
+ else {
101
+ const invalidMethods = route.methods.filter(m => !VALID_METHODS.has(m));
102
+ if (invalidMethods.length > 0) {
103
+ issues.push(`Invalid methods: ${invalidMethods.join(', ')}`);
104
+ }
105
+ }
106
+ // Validate auth
107
+ if (!route.auth) {
108
+ issues.push('Missing auth type');
109
+ }
110
+ else if (!VALID_AUTH_TYPES.has(route.auth)) {
111
+ issues.push(`Invalid auth type: ${route.auth} (must be: none, required, or service)`);
112
+ }
113
+ // Validate scopes if auth requires them
114
+ if (route.auth === 'required' && (!route.scopes || route.scopes.length === 0)) {
115
+ issues.push('Auth is required but no scopes defined');
116
+ }
117
+ // Validate rate limit if present
118
+ if (route.rateLimit) {
119
+ if (!route.rateLimit.requestsPerMinute || route.rateLimit.requestsPerMinute < 1) {
120
+ issues.push('Invalid requestsPerMinute in rateLimit');
121
+ }
122
+ if (route.rateLimit.burstSize && route.rateLimit.burstSize < 1) {
123
+ issues.push('Invalid burstSize in rateLimit');
124
+ }
125
+ }
126
+ return {
127
+ path: route.path || '(no path)',
128
+ isValid: issues.length === 0,
129
+ issues,
130
+ };
131
+ }
132
+ function checkRouteOverlaps(routes) {
133
+ const overlaps = [];
134
+ for (let i = 0; i < routes.length; i++) {
135
+ for (let j = i + 1; j < routes.length; j++) {
136
+ const pathA = routes[i].path;
137
+ const pathB = routes[j].path;
138
+ // Check for exact match
139
+ if (pathA === pathB) {
140
+ const methodsA = new Set(routes[i].methods);
141
+ const methodsB = routes[j].methods;
142
+ const overlap = methodsB.filter(m => methodsA.has(m));
143
+ if (overlap.length > 0) {
144
+ overlaps.push(`${pathA} ${overlap.join(',')} - duplicate route definition`);
145
+ }
146
+ }
147
+ // Check for pattern conflicts
148
+ if (routesPotentiallyConflict(pathA, pathB)) {
149
+ overlaps.push(`${pathA} may conflict with ${pathB}`);
150
+ }
151
+ }
152
+ }
153
+ if (overlaps.length > 0) {
154
+ return {
155
+ name: 'No route conflicts',
156
+ status: 'warn',
157
+ message: `${overlaps.length} potential route conflict(s) detected`,
158
+ details: overlaps,
159
+ remediation: 'Review route definitions to ensure no unintended overlaps',
160
+ };
161
+ }
162
+ return {
163
+ name: 'No route conflicts',
164
+ status: 'pass',
165
+ message: 'No route conflicts detected',
166
+ };
167
+ }
168
+ function routesPotentiallyConflict(pathA, pathB) {
169
+ // Normalize paths
170
+ const normalizeA = pathA.replace(PARAM_PATTERN, ':param').replace(WILDCARD_PATTERN, '*');
171
+ const normalizeB = pathB.replace(PARAM_PATTERN, ':param').replace(WILDCARD_PATTERN, '*');
172
+ if (normalizeA === normalizeB)
173
+ return true;
174
+ // Check if one is a prefix of another with wildcard
175
+ if (normalizeA.includes('*') || normalizeB.includes('*')) {
176
+ const baseA = normalizeA.replace(/\*.*$/, '');
177
+ const baseB = normalizeB.replace(/\*.*$/, '');
178
+ if (baseA.startsWith(baseB) || baseB.startsWith(baseA)) {
179
+ return true;
180
+ }
181
+ }
182
+ return false;
183
+ }
184
+ function checkRouteSecurity(routes) {
185
+ const issues = [];
186
+ const publicRoutes = routes.filter(r => r.auth === 'none');
187
+ const writePublicRoutes = publicRoutes.filter(r => r.methods.some(m => ['POST', 'PUT', 'DELETE', 'PATCH'].includes(m)));
188
+ if (writePublicRoutes.length > 0) {
189
+ issues.push(...writePublicRoutes.map(r => `${r.path} allows ${r.methods.filter(m => m !== 'GET').join(',')} without auth`));
190
+ }
191
+ // Check for admin-looking routes without auth
192
+ const adminRoutes = routes.filter(r => r.auth === 'none' &&
193
+ (r.path.includes('admin') || r.path.includes('internal') || r.path.includes('debug')));
194
+ if (adminRoutes.length > 0) {
195
+ issues.push(...adminRoutes.map(r => `${r.path} appears to be an admin route but has no auth`));
196
+ }
197
+ if (issues.length > 0) {
198
+ return {
199
+ name: 'Route security',
200
+ status: 'warn',
201
+ message: `${issues.length} potential security concern(s)`,
202
+ details: issues,
203
+ remediation: 'Consider adding authentication to sensitive routes',
204
+ };
205
+ }
206
+ return {
207
+ name: 'Route security',
208
+ status: 'pass',
209
+ message: 'Routes follow security best practices',
210
+ };
211
+ }
212
+ function checkRateLimits(routes) {
213
+ const publicRoutes = routes.filter(r => r.auth === 'none');
214
+ const publicWithoutRateLimit = publicRoutes.filter(r => !r.rateLimit);
215
+ if (publicWithoutRateLimit.length > 0) {
216
+ return {
217
+ name: 'Rate limiting',
218
+ status: 'warn',
219
+ message: `${publicWithoutRateLimit.length} public route(s) without rate limiting`,
220
+ details: publicWithoutRateLimit.map(r => r.path),
221
+ remediation: 'Add rateLimit to public routes to prevent abuse',
222
+ };
223
+ }
224
+ const rateLimitedRoutes = routes.filter(r => r.rateLimit);
225
+ if (rateLimitedRoutes.length > 0) {
226
+ return {
227
+ name: 'Rate limiting',
228
+ status: 'pass',
229
+ message: `${rateLimitedRoutes.length} route(s) have rate limiting configured`,
230
+ };
231
+ }
232
+ return {
233
+ name: 'Rate limiting',
234
+ status: 'skip',
235
+ message: 'No public routes found',
236
+ };
237
+ }
238
+ //# sourceMappingURL=route-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-validator.js","sourceRoot":"","sources":["../../../src/lib/validators/route-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { PreflightResult } from '../../types/index.js';
2
+ export declare function validateScopes(cwd?: string): Promise<PreflightResult>;
3
+ //# sourceMappingURL=scope-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-validator.d.ts","sourceRoot":"","sources":["../../../src/lib/validators/scope-validator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAA+B,MAAM,sBAAsB,CAAA;AAGxF,wBAAsB,cAAc,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,eAAe,CAAC,CA6J1F"}