@phila/cli 0.0.1

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 (278) hide show
  1. package/dist/commands/config.d.ts +30 -0
  2. package/dist/commands/config.d.ts.map +1 -0
  3. package/dist/commands/config.js +135 -0
  4. package/dist/commands/config.js.map +1 -0
  5. package/dist/commands/deploy.d.ts +2 -0
  6. package/dist/commands/deploy.d.ts.map +1 -0
  7. package/dist/commands/deploy.js +224 -0
  8. package/dist/commands/deploy.js.map +1 -0
  9. package/dist/commands/destroy.d.ts +3 -0
  10. package/dist/commands/destroy.d.ts.map +1 -0
  11. package/dist/commands/destroy.js +110 -0
  12. package/dist/commands/destroy.js.map +1 -0
  13. package/dist/commands/init.d.ts +25 -0
  14. package/dist/commands/init.d.ts.map +1 -0
  15. package/dist/commands/init.js +513 -0
  16. package/dist/commands/init.js.map +1 -0
  17. package/dist/commands/map.d.ts +8 -0
  18. package/dist/commands/map.d.ts.map +1 -0
  19. package/dist/commands/map.js +186 -0
  20. package/dist/commands/map.js.map +1 -0
  21. package/dist/commands/ship.d.ts +20 -0
  22. package/dist/commands/ship.d.ts.map +1 -0
  23. package/dist/commands/ship.js +445 -0
  24. package/dist/commands/ship.js.map +1 -0
  25. package/dist/commands/templates.d.ts +3 -0
  26. package/dist/commands/templates.d.ts.map +1 -0
  27. package/dist/commands/templates.js +120 -0
  28. package/dist/commands/templates.js.map +1 -0
  29. package/dist/index.d.ts +3 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +82 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/templates/_shared/city.config.json.tmpl +24 -0
  34. package/dist/templates/_shared/dotnet-api/Api.csproj +17 -0
  35. package/dist/templates/_shared/dotnet-api/Program.cs +58 -0
  36. package/dist/templates/_shared/dotnet-api/aws-lambda-tools-defaults.json +10 -0
  37. package/dist/templates/_shared/dotnet-api/obj/Api.csproj.nuget.dgspec.json +80 -0
  38. package/dist/templates/_shared/dotnet-api/obj/Api.csproj.nuget.g.props +15 -0
  39. package/dist/templates/_shared/dotnet-api/obj/Api.csproj.nuget.g.targets +2 -0
  40. package/dist/templates/_shared/dotnet-api/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs +4 -0
  41. package/dist/templates/_shared/dotnet-api/obj/Debug/net8.0/Api.AssemblyInfo.cs +22 -0
  42. package/dist/templates/_shared/dotnet-api/obj/Debug/net8.0/Api.AssemblyInfoInputs.cache +1 -0
  43. package/dist/templates/_shared/dotnet-api/obj/Debug/net8.0/Api.GeneratedMSBuildEditorConfig.editorconfig +19 -0
  44. package/dist/templates/_shared/dotnet-api/obj/Debug/net8.0/Api.GlobalUsings.g.cs +17 -0
  45. package/dist/templates/_shared/dotnet-api/obj/Debug/net8.0/Api.assets.cache +0 -0
  46. package/dist/templates/_shared/dotnet-api/obj/Debug/net8.0/Api.csproj.AssemblyReference.cache +0 -0
  47. package/dist/templates/_shared/dotnet-api/obj/project.assets.json +708 -0
  48. package/dist/templates/_shared/dotnet-api/obj/project.nuget.cache +35 -0
  49. package/dist/templates/_shared/dotnet-api-postgres/Api.csproj +19 -0
  50. package/dist/templates/_shared/dotnet-api-postgres/Program.cs +167 -0
  51. package/dist/templates/_shared/dotnet-api-postgres/aws-lambda-tools-defaults.json +10 -0
  52. package/dist/templates/_shared/dotnet-api-postgres/obj/Api.csproj.nuget.dgspec.json +88 -0
  53. package/dist/templates/_shared/dotnet-api-postgres/obj/Api.csproj.nuget.g.props +15 -0
  54. package/dist/templates/_shared/dotnet-api-postgres/obj/Api.csproj.nuget.g.targets +2 -0
  55. package/dist/templates/_shared/dotnet-api-postgres/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs +4 -0
  56. package/dist/templates/_shared/dotnet-api-postgres/obj/Debug/net8.0/Api.AssemblyInfo.cs +22 -0
  57. package/dist/templates/_shared/dotnet-api-postgres/obj/Debug/net8.0/Api.AssemblyInfoInputs.cache +1 -0
  58. package/dist/templates/_shared/dotnet-api-postgres/obj/Debug/net8.0/Api.GeneratedMSBuildEditorConfig.editorconfig +19 -0
  59. package/dist/templates/_shared/dotnet-api-postgres/obj/Debug/net8.0/Api.GlobalUsings.g.cs +17 -0
  60. package/dist/templates/_shared/dotnet-api-postgres/obj/Debug/net8.0/Api.assets.cache +0 -0
  61. package/dist/templates/_shared/dotnet-api-postgres/obj/project.assets.json +106 -0
  62. package/dist/templates/_shared/dotnet-api-postgres/obj/project.nuget.cache +15 -0
  63. package/dist/templates/_shared/nuxt-frontend/app.vue +3 -0
  64. package/dist/templates/_shared/nuxt-frontend/nuxt.config.ts +25 -0
  65. package/dist/templates/_shared/nuxt-frontend/package.json.tmpl +19 -0
  66. package/dist/templates/_shared/nuxt-frontend/pages/index.vue +6 -0
  67. package/dist/templates/_shared/nuxt-frontend/public/.gitkeep +0 -0
  68. package/dist/templates/_shared/nuxt-frontend/tsconfig.json +3 -0
  69. package/dist/templates/_shared/webapp-cdk-package.json.tmpl +23 -0
  70. package/dist/templates/_shared/webapp-frontend/app.vue +3 -0
  71. package/dist/templates/_shared/webapp-frontend/nuxt.config.ts +25 -0
  72. package/dist/templates/_shared/webapp-frontend/package.json.tmpl +19 -0
  73. package/dist/templates/_shared/webapp-frontend/pages/index.vue +7 -0
  74. package/dist/templates/_shared/webapp-frontend/public/.gitkeep +0 -0
  75. package/dist/templates/_shared/webapp-frontend/tsconfig.json +3 -0
  76. package/dist/templates/lambda-api-nodejs/README.md.tmpl +203 -0
  77. package/dist/templates/lambda-api-nodejs/apps/__lambdaName__/index.ts +89 -0
  78. package/dist/templates/lambda-api-nodejs/apps/__lambdaName__/package.json +17 -0
  79. package/dist/templates/lambda-api-nodejs/apps/__lambdaName__/tsconfig.json +8 -0
  80. package/dist/templates/lambda-api-nodejs/cdk/app.ts.tmpl +53 -0
  81. package/dist/templates/lambda-api-nodejs/cdk/cdk.json +68 -0
  82. package/dist/templates/lambda-api-nodejs/cdk/package.json +23 -0
  83. package/dist/templates/lambda-api-nodejs/cdk/tsconfig.json +9 -0
  84. package/dist/templates/lambda-api-nodejs/package.json.tmpl +20 -0
  85. package/dist/templates/lambda-api-nodejs/tsconfig.json +27 -0
  86. package/dist/templates/lambda-dynamo-api/README.md.tmpl +184 -0
  87. package/dist/templates/lambda-dynamo-api/apps/__lambdaName__/index.ts +109 -0
  88. package/dist/templates/lambda-dynamo-api/apps/__lambdaName__/package.json +19 -0
  89. package/dist/templates/lambda-dynamo-api/apps/__lambdaName__/tsconfig.json +24 -0
  90. package/dist/templates/lambda-dynamo-api/cdk/app.ts.tmpl +59 -0
  91. package/dist/templates/lambda-dynamo-api/cdk/cdk.json +73 -0
  92. package/dist/templates/lambda-dynamo-api/cdk/package.json +23 -0
  93. package/dist/templates/lambda-dynamo-api/cdk/tsconfig.json +14 -0
  94. package/dist/templates/lambda-dynamo-api/package.json.tmpl +20 -0
  95. package/dist/templates/lambda-dynamo-api/tsconfig.json +27 -0
  96. package/dist/templates/lambda-postgres-api/README.md.tmpl +234 -0
  97. package/dist/templates/lambda-postgres-api/apps/__lambdaName__/index.ts +76 -0
  98. package/dist/templates/lambda-postgres-api/apps/__lambdaName__/package.json +18 -0
  99. package/dist/templates/lambda-postgres-api/apps/__lambdaName__/tsconfig.json +26 -0
  100. package/dist/templates/lambda-postgres-api/cdk/app.ts.tmpl +55 -0
  101. package/dist/templates/lambda-postgres-api/cdk/cdk.json +4 -0
  102. package/dist/templates/lambda-postgres-api/cdk/package.json +23 -0
  103. package/dist/templates/lambda-postgres-api/cdk/tsconfig.json +25 -0
  104. package/dist/templates/lambda-postgres-api/package.json.tmpl +20 -0
  105. package/dist/templates/lambda-postgres-api/tsconfig.json +11 -0
  106. package/dist/templates/static-site/README.md.tmpl +72 -0
  107. package/dist/templates/static-site/cdk/app.ts.tmpl +50 -0
  108. package/dist/templates/static-site/cdk/cdk.json +68 -0
  109. package/dist/templates/static-site/cdk/package.json +23 -0
  110. package/dist/templates/static-site/cdk/tsconfig.json +9 -0
  111. package/dist/templates/static-site/frontend/.gitkeep +0 -0
  112. package/dist/templates/static-site/frontend/README.md +41 -0
  113. package/dist/templates/static-site/frontend/package.json +9 -0
  114. package/dist/templates/static-site/package.json.tmpl +19 -0
  115. package/dist/templates/static-site/tsconfig.json +27 -0
  116. package/dist/templates/webapp-ecs-dotnet/README.md.tmpl +213 -0
  117. package/dist/templates/webapp-ecs-dotnet/apps/api/Api.csproj +12 -0
  118. package/dist/templates/webapp-ecs-dotnet/apps/api/Dockerfile +30 -0
  119. package/dist/templates/webapp-ecs-dotnet/apps/api/Program.cs +85 -0
  120. package/dist/templates/webapp-ecs-dotnet/apps/api/obj/Api.csproj.nuget.dgspec.json +70 -0
  121. package/dist/templates/webapp-ecs-dotnet/apps/api/obj/Api.csproj.nuget.g.props +15 -0
  122. package/dist/templates/webapp-ecs-dotnet/apps/api/obj/Api.csproj.nuget.g.targets +2 -0
  123. package/dist/templates/webapp-ecs-dotnet/apps/api/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs +4 -0
  124. package/dist/templates/webapp-ecs-dotnet/apps/api/obj/Debug/net8.0/Api.AssemblyInfo.cs +22 -0
  125. package/dist/templates/webapp-ecs-dotnet/apps/api/obj/Debug/net8.0/Api.AssemblyInfoInputs.cache +1 -0
  126. package/dist/templates/webapp-ecs-dotnet/apps/api/obj/Debug/net8.0/Api.GeneratedMSBuildEditorConfig.editorconfig +19 -0
  127. package/dist/templates/webapp-ecs-dotnet/apps/api/obj/Debug/net8.0/Api.GlobalUsings.g.cs +17 -0
  128. package/dist/templates/webapp-ecs-dotnet/apps/api/obj/Debug/net8.0/Api.assets.cache +0 -0
  129. package/dist/templates/webapp-ecs-dotnet/apps/api/obj/project.assets.json +75 -0
  130. package/dist/templates/webapp-ecs-dotnet/apps/api/obj/project.nuget.cache +8 -0
  131. package/dist/templates/webapp-ecs-dotnet/cdk/app.ts.tmpl +60 -0
  132. package/dist/templates/webapp-ecs-dotnet/cdk/cdk.json +38 -0
  133. package/dist/templates/webapp-ecs-dotnet/cdk/tsconfig.json +25 -0
  134. package/dist/templates/webapp-ecs-dotnet/package.json.tmpl +23 -0
  135. package/dist/templates/webapp-ecs-dotnet/tsconfig.json +26 -0
  136. package/dist/templates/webapp-ecs-node/README.md.tmpl +207 -0
  137. package/dist/templates/webapp-ecs-node/apps/api/Dockerfile +33 -0
  138. package/dist/templates/webapp-ecs-node/apps/api/index.ts +74 -0
  139. package/dist/templates/webapp-ecs-node/apps/api/package.json +22 -0
  140. package/dist/templates/webapp-ecs-node/apps/api/tsconfig.json +18 -0
  141. package/dist/templates/webapp-ecs-node/cdk/app.ts.tmpl +60 -0
  142. package/dist/templates/webapp-ecs-node/cdk/cdk.json +38 -0
  143. package/dist/templates/webapp-ecs-node/cdk/tsconfig.json +25 -0
  144. package/dist/templates/webapp-ecs-node/package.json.tmpl +25 -0
  145. package/dist/templates/webapp-ecs-node/tsconfig.json +26 -0
  146. package/dist/templates/webapp-ecs-postgres-dotnet/README.md.tmpl +271 -0
  147. package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/Api.csproj +17 -0
  148. package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/Dockerfile +30 -0
  149. package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/Program.cs +194 -0
  150. package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/obj/Api.csproj.nuget.dgspec.json +80 -0
  151. package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/obj/Api.csproj.nuget.g.props +19 -0
  152. package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/obj/Api.csproj.nuget.g.targets +6 -0
  153. package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs +4 -0
  154. package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/obj/Debug/net8.0/Api.AssemblyInfo.cs +22 -0
  155. package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/obj/Debug/net8.0/Api.AssemblyInfoInputs.cache +1 -0
  156. package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/obj/Debug/net8.0/Api.GeneratedMSBuildEditorConfig.editorconfig +19 -0
  157. package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/obj/Debug/net8.0/Api.GlobalUsings.g.cs +17 -0
  158. package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/obj/Debug/net8.0/Api.assets.cache +0 -0
  159. package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/obj/Debug/net8.0/Api.csproj.AssemblyReference.cache +0 -0
  160. package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/obj/project.assets.json +395 -0
  161. package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/obj/project.nuget.cache +49 -0
  162. package/dist/templates/webapp-ecs-postgres-dotnet/cdk/app.ts.tmpl +62 -0
  163. package/dist/templates/webapp-ecs-postgres-dotnet/cdk/cdk.json +38 -0
  164. package/dist/templates/webapp-ecs-postgres-dotnet/cdk/tsconfig.json +25 -0
  165. package/dist/templates/webapp-ecs-postgres-dotnet/package.json.tmpl +23 -0
  166. package/dist/templates/webapp-ecs-postgres-dotnet/tsconfig.json +26 -0
  167. package/dist/templates/webapp-ecs-postgres-node/README.md.tmpl +261 -0
  168. package/dist/templates/webapp-ecs-postgres-node/apps/api/Dockerfile +33 -0
  169. package/dist/templates/webapp-ecs-postgres-node/apps/api/index.ts +160 -0
  170. package/dist/templates/webapp-ecs-postgres-node/apps/api/package.json +25 -0
  171. package/dist/templates/webapp-ecs-postgres-node/apps/api/tsconfig.json +18 -0
  172. package/dist/templates/webapp-ecs-postgres-node/cdk/app.ts.tmpl +62 -0
  173. package/dist/templates/webapp-ecs-postgres-node/cdk/cdk.json +38 -0
  174. package/dist/templates/webapp-ecs-postgres-node/cdk/tsconfig.json +25 -0
  175. package/dist/templates/webapp-ecs-postgres-node/package.json.tmpl +25 -0
  176. package/dist/templates/webapp-ecs-postgres-node/tsconfig.json +26 -0
  177. package/dist/templates/webapp-lambda-dotnet/README.md.tmpl +188 -0
  178. package/dist/templates/webapp-lambda-dotnet/apps/api/Api.csproj +17 -0
  179. package/dist/templates/webapp-lambda-dotnet/apps/api/Program.cs +58 -0
  180. package/dist/templates/webapp-lambda-dotnet/apps/api/aws-lambda-tools-defaults.json +10 -0
  181. package/dist/templates/webapp-lambda-dotnet/apps/api/obj/Api.csproj.nuget.dgspec.json +80 -0
  182. package/dist/templates/webapp-lambda-dotnet/apps/api/obj/Api.csproj.nuget.g.props +15 -0
  183. package/dist/templates/webapp-lambda-dotnet/apps/api/obj/Api.csproj.nuget.g.targets +2 -0
  184. package/dist/templates/webapp-lambda-dotnet/apps/api/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs +4 -0
  185. package/dist/templates/webapp-lambda-dotnet/apps/api/obj/Debug/net8.0/Api.AssemblyInfo.cs +22 -0
  186. package/dist/templates/webapp-lambda-dotnet/apps/api/obj/Debug/net8.0/Api.AssemblyInfoInputs.cache +1 -0
  187. package/dist/templates/webapp-lambda-dotnet/apps/api/obj/Debug/net8.0/Api.GeneratedMSBuildEditorConfig.editorconfig +19 -0
  188. package/dist/templates/webapp-lambda-dotnet/apps/api/obj/Debug/net8.0/Api.GlobalUsings.g.cs +17 -0
  189. package/dist/templates/webapp-lambda-dotnet/apps/api/obj/Debug/net8.0/Api.assets.cache +0 -0
  190. package/dist/templates/webapp-lambda-dotnet/apps/api/obj/Debug/net8.0/Api.csproj.AssemblyReference.cache +0 -0
  191. package/dist/templates/webapp-lambda-dotnet/apps/api/obj/project.assets.json +708 -0
  192. package/dist/templates/webapp-lambda-dotnet/apps/api/obj/project.nuget.cache +35 -0
  193. package/dist/templates/webapp-lambda-dotnet/cdk/app.ts.tmpl +59 -0
  194. package/dist/templates/webapp-lambda-dotnet/cdk/cdk.json +68 -0
  195. package/dist/templates/webapp-lambda-dotnet/cdk/tsconfig.json +9 -0
  196. package/dist/templates/webapp-lambda-dotnet/package.json.tmpl +23 -0
  197. package/dist/templates/webapp-lambda-dotnet/tsconfig.json +27 -0
  198. package/dist/templates/webapp-lambda-dynamo-dotnet/README.md.tmpl +223 -0
  199. package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/Api.csproj +18 -0
  200. package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/Program.cs +155 -0
  201. package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/aws-lambda-tools-defaults.json +10 -0
  202. package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/obj/Api.csproj.nuget.dgspec.json +84 -0
  203. package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/obj/Api.csproj.nuget.g.props +19 -0
  204. package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/obj/Api.csproj.nuget.g.targets +2 -0
  205. package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs +4 -0
  206. package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/obj/Debug/net8.0/Api.AssemblyInfo.cs +22 -0
  207. package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/obj/Debug/net8.0/Api.AssemblyInfoInputs.cache +1 -0
  208. package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/obj/Debug/net8.0/Api.GeneratedMSBuildEditorConfig.editorconfig +19 -0
  209. package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/obj/Debug/net8.0/Api.GlobalUsings.g.cs +17 -0
  210. package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/obj/Debug/net8.0/Api.assets.cache +0 -0
  211. package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/obj/Debug/net8.0/Api.csproj.AssemblyReference.cache +0 -0
  212. package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/obj/project.assets.json +989 -0
  213. package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/obj/project.nuget.cache +223 -0
  214. package/dist/templates/webapp-lambda-dynamo-dotnet/cdk/app.ts.tmpl +65 -0
  215. package/dist/templates/webapp-lambda-dynamo-dotnet/cdk/cdk.json +68 -0
  216. package/dist/templates/webapp-lambda-dynamo-dotnet/cdk/tsconfig.json +9 -0
  217. package/dist/templates/webapp-lambda-dynamo-dotnet/package.json.tmpl +23 -0
  218. package/dist/templates/webapp-lambda-dynamo-dotnet/tsconfig.json +27 -0
  219. package/dist/templates/webapp-lambda-dynamo-node/README.md.tmpl +189 -0
  220. package/dist/templates/webapp-lambda-dynamo-node/apps/api/index.ts +109 -0
  221. package/dist/templates/webapp-lambda-dynamo-node/apps/api/package.json +19 -0
  222. package/dist/templates/webapp-lambda-dynamo-node/apps/api/tsconfig.json +8 -0
  223. package/dist/templates/webapp-lambda-dynamo-node/cdk/app.ts.tmpl +65 -0
  224. package/dist/templates/webapp-lambda-dynamo-node/cdk/cdk.json +68 -0
  225. package/dist/templates/webapp-lambda-dynamo-node/cdk/tsconfig.json +9 -0
  226. package/dist/templates/webapp-lambda-dynamo-node/package.json.tmpl +24 -0
  227. package/dist/templates/webapp-lambda-dynamo-node/tsconfig.json +27 -0
  228. package/dist/templates/webapp-lambda-node/README.md.tmpl +179 -0
  229. package/dist/templates/webapp-lambda-node/apps/api/index.ts +100 -0
  230. package/dist/templates/webapp-lambda-node/apps/api/package.json +17 -0
  231. package/dist/templates/webapp-lambda-node/apps/api/tsconfig.json +8 -0
  232. package/dist/templates/webapp-lambda-node/cdk/app.ts.tmpl +59 -0
  233. package/dist/templates/webapp-lambda-node/cdk/cdk.json +68 -0
  234. package/dist/templates/webapp-lambda-node/cdk/tsconfig.json +9 -0
  235. package/dist/templates/webapp-lambda-node/package.json.tmpl +24 -0
  236. package/dist/templates/webapp-lambda-node/tsconfig.json +27 -0
  237. package/dist/templates/webapp-lambda-postgres-dotnet/README.md.tmpl +240 -0
  238. package/dist/templates/webapp-lambda-postgres-dotnet/apps/api/Api.csproj +19 -0
  239. package/dist/templates/webapp-lambda-postgres-dotnet/apps/api/Program.cs +167 -0
  240. package/dist/templates/webapp-lambda-postgres-dotnet/apps/api/aws-lambda-tools-defaults.json +10 -0
  241. package/dist/templates/webapp-lambda-postgres-dotnet/apps/api/obj/Api.csproj.nuget.dgspec.json +88 -0
  242. package/dist/templates/webapp-lambda-postgres-dotnet/apps/api/obj/Api.csproj.nuget.g.props +15 -0
  243. package/dist/templates/webapp-lambda-postgres-dotnet/apps/api/obj/Api.csproj.nuget.g.targets +2 -0
  244. package/dist/templates/webapp-lambda-postgres-dotnet/apps/api/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs +4 -0
  245. package/dist/templates/webapp-lambda-postgres-dotnet/apps/api/obj/Debug/net8.0/Api.AssemblyInfo.cs +22 -0
  246. package/dist/templates/webapp-lambda-postgres-dotnet/apps/api/obj/Debug/net8.0/Api.AssemblyInfoInputs.cache +1 -0
  247. package/dist/templates/webapp-lambda-postgres-dotnet/apps/api/obj/Debug/net8.0/Api.GeneratedMSBuildEditorConfig.editorconfig +19 -0
  248. package/dist/templates/webapp-lambda-postgres-dotnet/apps/api/obj/Debug/net8.0/Api.GlobalUsings.g.cs +17 -0
  249. package/dist/templates/webapp-lambda-postgres-dotnet/apps/api/obj/Debug/net8.0/Api.assets.cache +0 -0
  250. package/dist/templates/webapp-lambda-postgres-dotnet/apps/api/obj/project.assets.json +106 -0
  251. package/dist/templates/webapp-lambda-postgres-dotnet/apps/api/obj/project.nuget.cache +15 -0
  252. package/dist/templates/webapp-lambda-postgres-dotnet/cdk/app.ts.tmpl +61 -0
  253. package/dist/templates/webapp-lambda-postgres-dotnet/cdk/cdk.json +68 -0
  254. package/dist/templates/webapp-lambda-postgres-dotnet/cdk/tsconfig.json +9 -0
  255. package/dist/templates/webapp-lambda-postgres-dotnet/package.json.tmpl +23 -0
  256. package/dist/templates/webapp-lambda-postgres-dotnet/tsconfig.json +27 -0
  257. package/dist/templates/webapp-lambda-postgres-node/README.md.tmpl +190 -0
  258. package/dist/templates/webapp-lambda-postgres-node/apps/api/index.ts +76 -0
  259. package/dist/templates/webapp-lambda-postgres-node/apps/api/package.json +18 -0
  260. package/dist/templates/webapp-lambda-postgres-node/apps/api/tsconfig.json +8 -0
  261. package/dist/templates/webapp-lambda-postgres-node/cdk/app.ts.tmpl +61 -0
  262. package/dist/templates/webapp-lambda-postgres-node/cdk/cdk.json +68 -0
  263. package/dist/templates/webapp-lambda-postgres-node/cdk/tsconfig.json +9 -0
  264. package/dist/templates/webapp-lambda-postgres-node/package.json.tmpl +24 -0
  265. package/dist/templates/webapp-lambda-postgres-node/tsconfig.json +27 -0
  266. package/dist/utils/aws.d.ts +4 -0
  267. package/dist/utils/aws.d.ts.map +1 -0
  268. package/dist/utils/aws.js +90 -0
  269. package/dist/utils/aws.js.map +1 -0
  270. package/dist/utils/dependencies.d.ts +27 -0
  271. package/dist/utils/dependencies.d.ts.map +1 -0
  272. package/dist/utils/dependencies.js +267 -0
  273. package/dist/utils/dependencies.js.map +1 -0
  274. package/dist/utils/template.d.ts +23 -0
  275. package/dist/utils/template.d.ts.map +1 -0
  276. package/dist/utils/template.js +115 -0
  277. package/dist/utils/template.js.map +1 -0
  278. package/package.json +48 -0
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+ // ABOUTME: Implements the city map command for codebase navigation
3
+ // ABOUTME: Provides where, update, and check subcommands for the codebase.json index
4
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
5
+ if (k2 === undefined) k2 = k;
6
+ var desc = Object.getOwnPropertyDescriptor(m, k);
7
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
8
+ desc = { enumerable: true, get: function() { return m[k]; } };
9
+ }
10
+ Object.defineProperty(o, k2, desc);
11
+ }) : (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ o[k2] = m[k];
14
+ }));
15
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
16
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
17
+ }) : function(o, v) {
18
+ o["default"] = v;
19
+ });
20
+ var __importStar = (this && this.__importStar) || (function () {
21
+ var ownKeys = function(o) {
22
+ ownKeys = Object.getOwnPropertyNames || function (o) {
23
+ var ar = [];
24
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
25
+ return ar;
26
+ };
27
+ return ownKeys(o);
28
+ };
29
+ return function (mod) {
30
+ if (mod && mod.__esModule) return mod;
31
+ var result = {};
32
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
33
+ __setModuleDefault(result, mod);
34
+ return result;
35
+ };
36
+ })();
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ exports.mapShowCommand = mapShowCommand;
39
+ exports.mapWhereCommand = mapWhereCommand;
40
+ exports.mapUpdateCommand = mapUpdateCommand;
41
+ exports.mapCheckCommand = mapCheckCommand;
42
+ const fs = __importStar(require("fs-extra"));
43
+ const path = __importStar(require("path"));
44
+ const child_process_1 = require("child_process");
45
+ function findProjectRoot() {
46
+ let dir = process.cwd();
47
+ while (dir !== path.dirname(dir)) {
48
+ if (fs.existsSync(path.join(dir, 'codebase.json'))) {
49
+ return dir;
50
+ }
51
+ if (fs.existsSync(path.join(dir, 'package.json'))) {
52
+ const pkg = fs.readJsonSync(path.join(dir, 'package.json'));
53
+ if (pkg.name === '@phila/infrastructure') {
54
+ return dir;
55
+ }
56
+ }
57
+ dir = path.dirname(dir);
58
+ }
59
+ return process.cwd();
60
+ }
61
+ function loadMap() {
62
+ const root = findProjectRoot();
63
+ const mapPath = path.join(root, 'codebase.json');
64
+ if (!fs.existsSync(mapPath)) {
65
+ return null;
66
+ }
67
+ return fs.readJsonSync(mapPath);
68
+ }
69
+ async function mapShowCommand() {
70
+ const map = loadMap();
71
+ if (!map) {
72
+ console.log('No codebase.json found. Run `city map update` to generate.');
73
+ return;
74
+ }
75
+ const fileCount = Object.keys(map.files).length;
76
+ const updated = new Date(map.updated).toLocaleDateString();
77
+ console.log(`Codebase map: ${fileCount} files indexed`);
78
+ console.log(`Last updated: ${updated}`);
79
+ console.log(`\nLayers:`);
80
+ const layers = {};
81
+ for (const entry of Object.values(map.files)) {
82
+ layers[entry.layer] = (layers[entry.layer] || 0) + 1;
83
+ }
84
+ for (const [layer, count] of Object.entries(layers).sort()) {
85
+ console.log(` ${layer}: ${count} files`);
86
+ }
87
+ }
88
+ async function mapWhereCommand(query, options) {
89
+ const map = loadMap();
90
+ if (!map) {
91
+ console.log('No codebase.json found. Run `city map update` to generate.');
92
+ return;
93
+ }
94
+ const results = [];
95
+ for (const [filePath, entry] of Object.entries(map.files)) {
96
+ // Filter by layer if specified
97
+ if (options.layer && entry.layer !== options.layer) {
98
+ continue;
99
+ }
100
+ // Search by export name
101
+ if (options.export) {
102
+ const exportQuery = options.export.toLowerCase();
103
+ if (entry.exports?.some((e) => e.toLowerCase().includes(exportQuery))) {
104
+ results.push({ path: filePath, entry });
105
+ }
106
+ continue;
107
+ }
108
+ // Search by keyword in path or purpose
109
+ if (query) {
110
+ const searchText = `${filePath} ${entry.purpose}`.toLowerCase();
111
+ if (searchText.includes(query.toLowerCase())) {
112
+ results.push({ path: filePath, entry });
113
+ }
114
+ }
115
+ else if (options.layer && !options.export) {
116
+ // If only layer filter, include all matches
117
+ results.push({ path: filePath, entry });
118
+ }
119
+ }
120
+ if (results.length === 0) {
121
+ console.log('No matches found.');
122
+ return;
123
+ }
124
+ for (const { path: filePath, entry } of results) {
125
+ console.log(`\n${filePath}`);
126
+ console.log(` Purpose: ${entry.purpose}`);
127
+ if (entry.exports && entry.exports.length > 0) {
128
+ console.log(` Exports: ${entry.exports.join(', ')}`);
129
+ }
130
+ if (entry.tests) {
131
+ console.log(` Tests: ${entry.tests}`);
132
+ }
133
+ }
134
+ }
135
+ async function mapUpdateCommand() {
136
+ const root = findProjectRoot();
137
+ const scriptPath = path.join(root, 'scripts', 'generate-codebase-map.js');
138
+ if (!fs.existsSync(scriptPath)) {
139
+ console.log('Error: generate-codebase-map.js script not found.');
140
+ console.log('Expected at: scripts/generate-codebase-map.js');
141
+ return;
142
+ }
143
+ // Run the generator script
144
+ try {
145
+ (0, child_process_1.execSync)(`node "${scriptPath}"`, { cwd: root, stdio: 'inherit' });
146
+ }
147
+ catch {
148
+ console.log('Error running map generator script.');
149
+ }
150
+ }
151
+ async function mapCheckCommand() {
152
+ const map = loadMap();
153
+ const root = findProjectRoot();
154
+ if (!map) {
155
+ console.log('No codebase.json found. Run `city map update` to generate.');
156
+ return;
157
+ }
158
+ const issues = [];
159
+ // Check for files in map that no longer exist
160
+ for (const filePath of Object.keys(map.files)) {
161
+ if (!fs.existsSync(path.join(root, filePath))) {
162
+ issues.push(`Missing file: ${filePath}`);
163
+ }
164
+ }
165
+ // Check for source files not in map
166
+ const sourceFiles = (0, child_process_1.execSync)('find packages -path "*/src/*.ts" -type f | grep -v node_modules | grep -v ".test.ts"', { cwd: root, encoding: 'utf-8' })
167
+ .trim()
168
+ .split('\n')
169
+ .filter(Boolean);
170
+ for (const filePath of sourceFiles) {
171
+ if (!map.files[filePath]) {
172
+ issues.push(`Not indexed: ${filePath}`);
173
+ }
174
+ }
175
+ if (issues.length === 0) {
176
+ console.log('Codebase map is up to date.');
177
+ }
178
+ else {
179
+ console.log(`Found ${issues.length} issue(s):\n`);
180
+ for (const issue of issues) {
181
+ console.log(` - ${issue}`);
182
+ }
183
+ console.log('\nRun `city map update` to fix.');
184
+ }
185
+ }
186
+ //# sourceMappingURL=map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map.js","sourceRoot":"","sources":["../../src/commands/map.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export type ShipCapability = 'web' | 'lambda' | 'ecs';
2
+ export declare function getCapabilities(applicationType: string): ShipCapability[];
3
+ interface ShipOptions {
4
+ lambda?: string;
5
+ web?: boolean;
6
+ ecs?: boolean;
7
+ all?: boolean;
8
+ }
9
+ export declare function validateFlags(capabilities: ShipCapability[], options: ShipOptions): {
10
+ valid: boolean;
11
+ invalidFlags: string[];
12
+ validFlags: string[];
13
+ };
14
+ /**
15
+ * Discover lambda function directories in apps/
16
+ */
17
+ export declare function discoverLambdas(projectDir: string): Promise<string[]>;
18
+ export declare function shipCommand(environment?: string, options?: ShipOptions): Promise<void>;
19
+ export {};
20
+ //# sourceMappingURL=ship.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ship.d.ts","sourceRoot":"","sources":["../../src/commands/ship.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,QAAQ,GAAG,KAAK,CAAC;AA+BtD,wBAAgB,eAAe,CAAC,eAAe,EAAE,MAAM,GAAG,cAAc,EAAE,CAEzE;AAED,UAAU,WAAW;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAgB,aAAa,CAC3B,YAAY,EAAE,cAAc,EAAE,EAC9B,OAAO,EAAE,WAAW,GACnB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAelE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAW3E;AAED,wBAAsB,WAAW,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA6H5F"}
@@ -0,0 +1,445 @@
1
+ "use strict";
2
+ // ABOUTME: Implements the city ship command for rapid code-only deployments
3
+ // ABOUTME: Ships lambda code, frontend assets, or ECS containers based on project capabilities
4
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
5
+ if (k2 === undefined) k2 = k;
6
+ var desc = Object.getOwnPropertyDescriptor(m, k);
7
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
8
+ desc = { enumerable: true, get: function() { return m[k]; } };
9
+ }
10
+ Object.defineProperty(o, k2, desc);
11
+ }) : (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ o[k2] = m[k];
14
+ }));
15
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
16
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
17
+ }) : function(o, v) {
18
+ o["default"] = v;
19
+ });
20
+ var __importStar = (this && this.__importStar) || (function () {
21
+ var ownKeys = function(o) {
22
+ ownKeys = Object.getOwnPropertyNames || function (o) {
23
+ var ar = [];
24
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
25
+ return ar;
26
+ };
27
+ return ownKeys(o);
28
+ };
29
+ return function (mod) {
30
+ if (mod && mod.__esModule) return mod;
31
+ var result = {};
32
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
33
+ __setModuleDefault(result, mod);
34
+ return result;
35
+ };
36
+ })();
37
+ var __importDefault = (this && this.__importDefault) || function (mod) {
38
+ return (mod && mod.__esModule) ? mod : { "default": mod };
39
+ };
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.getCapabilities = getCapabilities;
42
+ exports.validateFlags = validateFlags;
43
+ exports.discoverLambdas = discoverLambdas;
44
+ exports.shipCommand = shipCommand;
45
+ const path = __importStar(require("path"));
46
+ const fs = __importStar(require("fs-extra"));
47
+ const inquirer_1 = __importDefault(require("inquirer"));
48
+ const chalk_1 = __importDefault(require("chalk"));
49
+ const child_process_1 = require("child_process");
50
+ const constructs_1 = require("@phila/constructs");
51
+ const config_1 = require("./config");
52
+ const dependencies_1 = require("../utils/dependencies");
53
+ const CAPABILITY_MAP = {
54
+ 'static-site': ['web'],
55
+ 'lambda-api-nodejs': ['lambda'],
56
+ 'lambda-dynamo-api': ['lambda'],
57
+ 'lambda-postgres-api': ['lambda'],
58
+ 'webapp-lambda-node': ['web', 'lambda'],
59
+ 'webapp-lambda-dotnet': ['web', 'lambda'],
60
+ 'webapp-lambda-dynamo-node': ['web', 'lambda'],
61
+ 'webapp-lambda-dynamo-dotnet': ['web', 'lambda'],
62
+ 'webapp-lambda-postgres-node': ['web', 'lambda'],
63
+ 'webapp-lambda-postgres-dotnet': ['web', 'lambda'],
64
+ 'webapp-ecs-node': ['web', 'ecs'],
65
+ 'webapp-ecs-dotnet': ['web', 'ecs'],
66
+ 'webapp-ecs-postgres-node': ['web', 'ecs'],
67
+ 'webapp-ecs-postgres-dotnet': ['web', 'ecs'],
68
+ };
69
+ const CAPABILITY_FLAGS = {
70
+ web: '--web',
71
+ lambda: '--lambda',
72
+ ecs: '--ecs',
73
+ };
74
+ const CAPABILITY_DESCRIPTIONS = {
75
+ web: 'frontend (S3/CloudFront)',
76
+ lambda: 'Lambda function',
77
+ ecs: 'ECS container',
78
+ };
79
+ function getCapabilities(applicationType) {
80
+ return CAPABILITY_MAP[applicationType] ?? [];
81
+ }
82
+ function validateFlags(capabilities, options) {
83
+ const validFlags = capabilities.map((cap) => CAPABILITY_FLAGS[cap]);
84
+ const invalidFlags = [];
85
+ if (options.web) {
86
+ if (!capabilities.includes('web'))
87
+ invalidFlags.push('--web');
88
+ }
89
+ if (options.lambda) {
90
+ if (!capabilities.includes('lambda'))
91
+ invalidFlags.push('--lambda');
92
+ }
93
+ if (options.ecs) {
94
+ if (!capabilities.includes('ecs'))
95
+ invalidFlags.push('--ecs');
96
+ }
97
+ return { valid: invalidFlags.length === 0, invalidFlags, validFlags };
98
+ }
99
+ /**
100
+ * Discover lambda function directories in apps/
101
+ */
102
+ async function discoverLambdas(projectDir) {
103
+ const appsDir = path.join(projectDir, 'apps');
104
+ if (!(await fs.pathExists(appsDir))) {
105
+ return [];
106
+ }
107
+ const entries = await fs.readdir(appsDir, { withFileTypes: true });
108
+ return entries
109
+ .filter((entry) => entry.isDirectory() && !entry.name.startsWith('.'))
110
+ .map((entry) => entry.name);
111
+ }
112
+ async function shipCommand(environment, options) {
113
+ await (0, dependencies_1.ensureDependencies)();
114
+ // Load config
115
+ const config = await (0, config_1.loadConfig)(process.cwd());
116
+ if (!config) {
117
+ console.log(chalk_1.default.red('\nError: city.config.json not found.'));
118
+ console.log('Make sure you are in a City project directory.\n');
119
+ process.exit(1);
120
+ }
121
+ // Validate environment
122
+ let env;
123
+ if (environment && isValidEnvironment(environment)) {
124
+ env = environment;
125
+ }
126
+ else if (environment) {
127
+ console.log(chalk_1.default.red(`\nError: Invalid environment '${environment}'.`));
128
+ console.log('Valid environments are: dev, test, prod\n');
129
+ process.exit(1);
130
+ }
131
+ else {
132
+ const answer = await inquirer_1.default.prompt([
133
+ {
134
+ type: 'list',
135
+ name: 'environment',
136
+ message: 'Which environment do you want to ship to?',
137
+ choices: [
138
+ { name: 'dev - Development environment', value: 'dev' },
139
+ { name: 'test - Testing environment', value: 'test' },
140
+ { name: 'prod - Production environment', value: 'prod' },
141
+ ],
142
+ },
143
+ ]);
144
+ env = answer.environment;
145
+ }
146
+ // Get environment-specific config
147
+ const envConfig = config.environments?.[env];
148
+ if (!envConfig) {
149
+ console.log(chalk_1.default.red(`\n✗ Missing environment configuration for '${env}'`));
150
+ console.log(chalk_1.default.gray('\nExpected structure in city.config.json:'));
151
+ console.log(chalk_1.default.gray(` "environments": {`));
152
+ console.log(chalk_1.default.gray(` "${env}": { "profile": "...", "vpc": "..." }`));
153
+ console.log(chalk_1.default.gray(` }`));
154
+ console.log(chalk_1.default.cyan(`\nRun: city config set environments.${env}.profile <profile-name>`));
155
+ console.log(chalk_1.default.cyan(` city config set environments.${env}.vpc <vpc-name>\n`));
156
+ process.exit(1);
157
+ }
158
+ const { profile, vpc } = envConfig;
159
+ // Validate profile and vpc names to prevent shell injection
160
+ const safePattern = /^[a-zA-Z0-9_-]+$/;
161
+ if (!safePattern.test(profile)) {
162
+ console.log(chalk_1.default.red(`\nError: Invalid profile name '${profile}'.`));
163
+ console.log(chalk_1.default.gray('Profile names must contain only letters, numbers, hyphens, and underscores.\n'));
164
+ process.exit(1);
165
+ }
166
+ if (!safePattern.test(vpc)) {
167
+ console.log(chalk_1.default.red(`\nError: Invalid VPC name '${vpc}'.`));
168
+ console.log(chalk_1.default.gray('VPC names must contain only letters, numbers, hyphens, and underscores.\n'));
169
+ process.exit(1);
170
+ }
171
+ // Require confirmation for prod
172
+ if (env === 'prod') {
173
+ const confirm = await inquirer_1.default.prompt([
174
+ {
175
+ type: 'confirm',
176
+ name: 'proceed',
177
+ message: chalk_1.default.yellow('You are about to ship to PRODUCTION. Are you sure?'),
178
+ default: false,
179
+ },
180
+ ]);
181
+ if (!confirm.proceed) {
182
+ console.log(chalk_1.default.gray('\nShip cancelled.\n'));
183
+ process.exit(0);
184
+ }
185
+ }
186
+ // Get project capabilities
187
+ const capabilities = getCapabilities(config.applicationType || '');
188
+ if (capabilities.length === 0) {
189
+ console.log(chalk_1.default.red(`\nError: Unknown application type '${config.applicationType}'.`));
190
+ console.log(chalk_1.default.gray('Cannot determine what to ship for this project type.\n'));
191
+ process.exit(1);
192
+ }
193
+ // Validate provided flags against capabilities
194
+ const validation = validateFlags(capabilities, options || {});
195
+ if (!validation.valid) {
196
+ const capabilityList = capabilities.map((c) => CAPABILITY_DESCRIPTIONS[c]).join(' and ');
197
+ console.log(chalk_1.default.red(`\nError: ${validation.invalidFlags.join(', ')} not valid for ${config.applicationType} projects.`));
198
+ console.log(chalk_1.default.gray(`This project can ship: ${capabilityList}`));
199
+ console.log(chalk_1.default.gray(`Valid flags: ${validation.validFlags.join(', ')}\n`));
200
+ process.exit(1);
201
+ }
202
+ // Determine what to ship
203
+ const hasFlags = options?.web || options?.lambda || options?.ecs;
204
+ const shipAll = options?.all || !hasFlags;
205
+ // Ship web if requested or shipping all with web capability
206
+ if ((options?.web || shipAll) && capabilities.includes('web')) {
207
+ await shipWeb(config, env, profile);
208
+ }
209
+ // Ship lambda if requested or shipping all with lambda capability
210
+ if ((options?.lambda || shipAll) && capabilities.includes('lambda')) {
211
+ const lambdaName = typeof options?.lambda === 'string' ? options.lambda : 'api';
212
+ await shipLambda(config, env, profile, lambdaName);
213
+ }
214
+ // Ship ECS if requested or shipping all with ecs capability
215
+ if ((options?.ecs || shipAll) && capabilities.includes('ecs')) {
216
+ await shipEcs(config, env, profile);
217
+ }
218
+ }
219
+ async function shipLambda(config, env, profile, lambdaName) {
220
+ const projectDir = process.cwd();
221
+ const lambdas = await discoverLambdas(projectDir);
222
+ // If lambdaName not provided or not found, prompt
223
+ let targetLambda = lambdaName;
224
+ if (!lambdas.includes(targetLambda)) {
225
+ if (lambdas.length === 0) {
226
+ console.log(chalk_1.default.red('\nError: No lambda functions found in apps/ directory.\n'));
227
+ process.exit(1);
228
+ }
229
+ if (lambdas.length === 1) {
230
+ targetLambda = lambdas[0];
231
+ console.log(chalk_1.default.gray(`Using lambda: ${targetLambda}\n`));
232
+ }
233
+ else {
234
+ const answer = await inquirer_1.default.prompt([
235
+ {
236
+ type: 'list',
237
+ name: 'lambda',
238
+ message: 'Which lambda do you want to ship?',
239
+ choices: lambdas,
240
+ },
241
+ ]);
242
+ targetLambda = answer.lambda;
243
+ }
244
+ }
245
+ const lambdaDir = path.join(projectDir, 'apps', targetLambda);
246
+ const functionName = constructs_1.PhilaNames.resource({
247
+ environment: env,
248
+ appName: config.appName,
249
+ resourceType: 'lambda',
250
+ resourceId: targetLambda,
251
+ });
252
+ console.log(chalk_1.default.blue(`\nShipping ${targetLambda} to ${env}...`));
253
+ console.log(chalk_1.default.gray(`Function name: ${functionName}`));
254
+ console.log(chalk_1.default.gray(`Using AWS profile: ${profile}\n`));
255
+ // Build the lambda
256
+ console.log(chalk_1.default.gray('Building lambda...\n'));
257
+ try {
258
+ (0, child_process_1.execSync)('npm run build', { cwd: lambdaDir, stdio: 'inherit' });
259
+ }
260
+ catch {
261
+ console.log(chalk_1.default.red('\nError: Lambda build failed.\n'));
262
+ process.exit(1);
263
+ }
264
+ // Zip the dist folder
265
+ const distDir = path.join(lambdaDir, 'dist');
266
+ const zipPath = path.join(lambdaDir, 'lambda.zip');
267
+ if (!(await fs.pathExists(distDir))) {
268
+ console.log(chalk_1.default.red('\nError: dist/ directory not found after build.\n'));
269
+ process.exit(1);
270
+ }
271
+ console.log(chalk_1.default.gray('Creating deployment package...\n'));
272
+ try {
273
+ // Remove old zip if exists
274
+ if (await fs.pathExists(zipPath)) {
275
+ await fs.remove(zipPath);
276
+ }
277
+ (0, child_process_1.execSync)(`cd "${distDir}" && zip -r "${zipPath}" .`, { stdio: 'inherit' });
278
+ }
279
+ catch {
280
+ console.log(chalk_1.default.red('\nError: Failed to create deployment package.\n'));
281
+ process.exit(1);
282
+ }
283
+ // Update Lambda function code
284
+ console.log(chalk_1.default.gray('Updating Lambda function code...\n'));
285
+ try {
286
+ (0, child_process_1.execSync)(`aws lambda update-function-code --function-name ${functionName} --zip-file fileb://${zipPath} --profile ${profile}`, { stdio: 'inherit' });
287
+ console.log(chalk_1.default.green(`\n✓ Lambda ${targetLambda} shipped to ${env}!\n`));
288
+ }
289
+ catch {
290
+ console.log(chalk_1.default.red('\nError: Failed to update Lambda function code.\n'));
291
+ console.log(chalk_1.default.gray('Make sure the function exists and you have the correct permissions.\n'));
292
+ process.exit(1);
293
+ }
294
+ // Clean up zip file
295
+ await fs.remove(zipPath);
296
+ }
297
+ async function shipWeb(config, env, profile) {
298
+ const projectDir = process.cwd();
299
+ const frontendDir = path.join(projectDir, 'frontend');
300
+ if (!(await fs.pathExists(frontendDir))) {
301
+ console.log(chalk_1.default.red('\nError: frontend/ directory not found.\n'));
302
+ process.exit(1);
303
+ }
304
+ // Determine bucket ID based on application type
305
+ const isStaticSite = config.applicationType === 'static-site';
306
+ const bucketId = isStaticSite ? 'static-site' : 'web';
307
+ const bucketName = constructs_1.PhilaNames.resource({
308
+ environment: env,
309
+ appName: config.appName,
310
+ resourceType: 's3',
311
+ resourceId: bucketId,
312
+ });
313
+ console.log(chalk_1.default.blue(`\nShipping frontend to ${env}...`));
314
+ console.log(chalk_1.default.gray(`S3 bucket: ${bucketName}`));
315
+ console.log(chalk_1.default.gray(`Using AWS profile: ${profile}\n`));
316
+ // Build the frontend
317
+ console.log(chalk_1.default.gray('Building frontend...\n'));
318
+ try {
319
+ (0, child_process_1.execSync)('npm run build', { cwd: frontendDir, stdio: 'inherit' });
320
+ }
321
+ catch {
322
+ console.log(chalk_1.default.red('\nError: Frontend build failed.\n'));
323
+ process.exit(1);
324
+ }
325
+ // Sync to S3
326
+ const distDir = path.join(frontendDir, 'dist');
327
+ if (!(await fs.pathExists(distDir))) {
328
+ console.log(chalk_1.default.red('\nError: dist/ directory not found after build.\n'));
329
+ process.exit(1);
330
+ }
331
+ console.log(chalk_1.default.gray('Syncing to S3...\n'));
332
+ try {
333
+ (0, child_process_1.execSync)(`aws s3 sync "${distDir}" "s3://${bucketName}" --delete --profile ${profile}`, {
334
+ stdio: 'inherit',
335
+ });
336
+ }
337
+ catch {
338
+ console.log(chalk_1.default.red('\nError: Failed to sync to S3.\n'));
339
+ console.log(chalk_1.default.gray('Make sure the bucket exists and you have the correct permissions.\n'));
340
+ process.exit(1);
341
+ }
342
+ // Invalidate CloudFront cache for static sites
343
+ if (isStaticSite) {
344
+ console.log(chalk_1.default.gray('\nInvalidating CloudFront cache...\n'));
345
+ try {
346
+ // Get distribution ID from SSM parameter
347
+ const ssmParamName = `/${env}/${config.appName}/static-site/distribution-id`;
348
+ const distributionId = (0, child_process_1.execSync)(`aws ssm get-parameter --name "${ssmParamName}" --query Parameter.Value --output text --profile ${profile}`, { encoding: 'utf-8' }).trim();
349
+ (0, child_process_1.execSync)(`aws cloudfront create-invalidation --distribution-id ${distributionId} --paths "/*" --profile ${profile}`, { stdio: 'inherit' });
350
+ }
351
+ catch {
352
+ console.log(chalk_1.default.yellow('\nWarning: Could not invalidate CloudFront cache. Changes may take time to propagate.\n'));
353
+ }
354
+ }
355
+ console.log(chalk_1.default.green(`\n✓ Frontend shipped to ${env}!\n`));
356
+ }
357
+ async function shipEcs(config, env, profile) {
358
+ const projectDir = process.cwd();
359
+ const apiDir = path.join(projectDir, 'api');
360
+ if (!(await fs.pathExists(apiDir))) {
361
+ console.log(chalk_1.default.red('\nError: api/ directory not found.\n'));
362
+ process.exit(1);
363
+ }
364
+ // Get ECR repository name from naming convention
365
+ const repoName = constructs_1.PhilaNames.resource({
366
+ environment: env,
367
+ appName: config.appName,
368
+ resourceType: 'ecr',
369
+ resourceId: 'api',
370
+ });
371
+ // Get AWS account and region
372
+ let account;
373
+ let region;
374
+ try {
375
+ account = (0, child_process_1.execSync)(`aws sts get-caller-identity --query Account --output text --profile ${profile}`, { encoding: 'utf-8' }).trim();
376
+ region =
377
+ (0, child_process_1.execSync)(`aws configure get region --profile ${profile}`, { encoding: 'utf-8' }).trim() ||
378
+ 'us-east-1';
379
+ }
380
+ catch {
381
+ console.log(chalk_1.default.red('\nError: Failed to get AWS account information.\n'));
382
+ console.log(chalk_1.default.gray('Make sure you are authenticated and the profile exists.\n'));
383
+ process.exit(1);
384
+ }
385
+ const ecrUri = `${account}.dkr.ecr.${region}.amazonaws.com/${repoName}`;
386
+ console.log(chalk_1.default.blue(`\nShipping ECS container to ${env}...`));
387
+ console.log(chalk_1.default.gray(`ECR repository: ${ecrUri}`));
388
+ console.log(chalk_1.default.gray(`Using AWS profile: ${profile}\n`));
389
+ // Authenticate with ECR
390
+ console.log(chalk_1.default.gray('Authenticating with ECR...\n'));
391
+ try {
392
+ (0, child_process_1.execSync)(`aws ecr get-login-password --profile ${profile} | docker login --username AWS --password-stdin ${account}.dkr.ecr.${region}.amazonaws.com`, { stdio: 'inherit' });
393
+ }
394
+ catch {
395
+ console.log(chalk_1.default.red('\nError: Failed to authenticate with ECR.\n'));
396
+ process.exit(1);
397
+ }
398
+ // Build the Docker image
399
+ console.log(chalk_1.default.gray('Building Docker image...\n'));
400
+ try {
401
+ (0, child_process_1.execSync)(`docker build -t ${repoName}:latest .`, { cwd: apiDir, stdio: 'inherit' });
402
+ }
403
+ catch {
404
+ console.log(chalk_1.default.red('\nError: Docker build failed.\n'));
405
+ process.exit(1);
406
+ }
407
+ // Tag and push to ECR
408
+ console.log(chalk_1.default.gray('Pushing to ECR...\n'));
409
+ try {
410
+ (0, child_process_1.execSync)(`docker tag ${repoName}:latest ${ecrUri}:latest`, { stdio: 'inherit' });
411
+ (0, child_process_1.execSync)(`docker push ${ecrUri}:latest`, { stdio: 'inherit' });
412
+ }
413
+ catch {
414
+ console.log(chalk_1.default.red('\nError: Failed to push image to ECR.\n'));
415
+ console.log(chalk_1.default.gray('Make sure the ECR repository exists and you have push permissions.\n'));
416
+ process.exit(1);
417
+ }
418
+ // Force new deployment on ECS
419
+ console.log(chalk_1.default.gray('Triggering ECS deployment...\n'));
420
+ const serviceName = constructs_1.PhilaNames.resource({
421
+ environment: env,
422
+ appName: config.appName,
423
+ resourceType: 'ecs-service',
424
+ resourceId: 'api',
425
+ });
426
+ const clusterName = constructs_1.PhilaNames.resource({
427
+ environment: env,
428
+ appName: config.appName,
429
+ resourceType: 'ecs-cluster',
430
+ resourceId: 'main',
431
+ });
432
+ try {
433
+ (0, child_process_1.execSync)(`aws ecs update-service --cluster ${clusterName} --service ${serviceName} --force-new-deployment --profile ${profile}`, { stdio: 'inherit' });
434
+ console.log(chalk_1.default.green(`\n✓ ECS container shipped to ${env}!\n`));
435
+ }
436
+ catch {
437
+ console.log(chalk_1.default.red('\nError: Failed to trigger ECS deployment.\n'));
438
+ console.log(chalk_1.default.gray('Make sure the ECS cluster and service exist and you have the correct permissions.\n'));
439
+ process.exit(1);
440
+ }
441
+ }
442
+ function isValidEnvironment(env) {
443
+ return ['dev', 'test', 'prod'].includes(env);
444
+ }
445
+ //# sourceMappingURL=ship.js.map