@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.
- package/dist/commands/config.d.ts +30 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +135 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/deploy.d.ts +2 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +224 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/destroy.d.ts +3 -0
- package/dist/commands/destroy.d.ts.map +1 -0
- package/dist/commands/destroy.js +110 -0
- package/dist/commands/destroy.js.map +1 -0
- package/dist/commands/init.d.ts +25 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +513 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/map.d.ts +8 -0
- package/dist/commands/map.d.ts.map +1 -0
- package/dist/commands/map.js +186 -0
- package/dist/commands/map.js.map +1 -0
- package/dist/commands/ship.d.ts +20 -0
- package/dist/commands/ship.d.ts.map +1 -0
- package/dist/commands/ship.js +445 -0
- package/dist/commands/ship.js.map +1 -0
- package/dist/commands/templates.d.ts +3 -0
- package/dist/commands/templates.d.ts.map +1 -0
- package/dist/commands/templates.js +120 -0
- package/dist/commands/templates.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +82 -0
- package/dist/index.js.map +1 -0
- package/dist/templates/_shared/city.config.json.tmpl +24 -0
- package/dist/templates/_shared/dotnet-api/Api.csproj +17 -0
- package/dist/templates/_shared/dotnet-api/Program.cs +58 -0
- package/dist/templates/_shared/dotnet-api/aws-lambda-tools-defaults.json +10 -0
- package/dist/templates/_shared/dotnet-api/obj/Api.csproj.nuget.dgspec.json +80 -0
- package/dist/templates/_shared/dotnet-api/obj/Api.csproj.nuget.g.props +15 -0
- package/dist/templates/_shared/dotnet-api/obj/Api.csproj.nuget.g.targets +2 -0
- package/dist/templates/_shared/dotnet-api/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs +4 -0
- package/dist/templates/_shared/dotnet-api/obj/Debug/net8.0/Api.AssemblyInfo.cs +22 -0
- package/dist/templates/_shared/dotnet-api/obj/Debug/net8.0/Api.AssemblyInfoInputs.cache +1 -0
- package/dist/templates/_shared/dotnet-api/obj/Debug/net8.0/Api.GeneratedMSBuildEditorConfig.editorconfig +19 -0
- package/dist/templates/_shared/dotnet-api/obj/Debug/net8.0/Api.GlobalUsings.g.cs +17 -0
- package/dist/templates/_shared/dotnet-api/obj/Debug/net8.0/Api.assets.cache +0 -0
- package/dist/templates/_shared/dotnet-api/obj/Debug/net8.0/Api.csproj.AssemblyReference.cache +0 -0
- package/dist/templates/_shared/dotnet-api/obj/project.assets.json +708 -0
- package/dist/templates/_shared/dotnet-api/obj/project.nuget.cache +35 -0
- package/dist/templates/_shared/dotnet-api-postgres/Api.csproj +19 -0
- package/dist/templates/_shared/dotnet-api-postgres/Program.cs +167 -0
- package/dist/templates/_shared/dotnet-api-postgres/aws-lambda-tools-defaults.json +10 -0
- package/dist/templates/_shared/dotnet-api-postgres/obj/Api.csproj.nuget.dgspec.json +88 -0
- package/dist/templates/_shared/dotnet-api-postgres/obj/Api.csproj.nuget.g.props +15 -0
- package/dist/templates/_shared/dotnet-api-postgres/obj/Api.csproj.nuget.g.targets +2 -0
- package/dist/templates/_shared/dotnet-api-postgres/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs +4 -0
- package/dist/templates/_shared/dotnet-api-postgres/obj/Debug/net8.0/Api.AssemblyInfo.cs +22 -0
- package/dist/templates/_shared/dotnet-api-postgres/obj/Debug/net8.0/Api.AssemblyInfoInputs.cache +1 -0
- package/dist/templates/_shared/dotnet-api-postgres/obj/Debug/net8.0/Api.GeneratedMSBuildEditorConfig.editorconfig +19 -0
- package/dist/templates/_shared/dotnet-api-postgres/obj/Debug/net8.0/Api.GlobalUsings.g.cs +17 -0
- package/dist/templates/_shared/dotnet-api-postgres/obj/Debug/net8.0/Api.assets.cache +0 -0
- package/dist/templates/_shared/dotnet-api-postgres/obj/project.assets.json +106 -0
- package/dist/templates/_shared/dotnet-api-postgres/obj/project.nuget.cache +15 -0
- package/dist/templates/_shared/nuxt-frontend/app.vue +3 -0
- package/dist/templates/_shared/nuxt-frontend/nuxt.config.ts +25 -0
- package/dist/templates/_shared/nuxt-frontend/package.json.tmpl +19 -0
- package/dist/templates/_shared/nuxt-frontend/pages/index.vue +6 -0
- package/dist/templates/_shared/nuxt-frontend/public/.gitkeep +0 -0
- package/dist/templates/_shared/nuxt-frontend/tsconfig.json +3 -0
- package/dist/templates/_shared/webapp-cdk-package.json.tmpl +23 -0
- package/dist/templates/_shared/webapp-frontend/app.vue +3 -0
- package/dist/templates/_shared/webapp-frontend/nuxt.config.ts +25 -0
- package/dist/templates/_shared/webapp-frontend/package.json.tmpl +19 -0
- package/dist/templates/_shared/webapp-frontend/pages/index.vue +7 -0
- package/dist/templates/_shared/webapp-frontend/public/.gitkeep +0 -0
- package/dist/templates/_shared/webapp-frontend/tsconfig.json +3 -0
- package/dist/templates/lambda-api-nodejs/README.md.tmpl +203 -0
- package/dist/templates/lambda-api-nodejs/apps/__lambdaName__/index.ts +89 -0
- package/dist/templates/lambda-api-nodejs/apps/__lambdaName__/package.json +17 -0
- package/dist/templates/lambda-api-nodejs/apps/__lambdaName__/tsconfig.json +8 -0
- package/dist/templates/lambda-api-nodejs/cdk/app.ts.tmpl +53 -0
- package/dist/templates/lambda-api-nodejs/cdk/cdk.json +68 -0
- package/dist/templates/lambda-api-nodejs/cdk/package.json +23 -0
- package/dist/templates/lambda-api-nodejs/cdk/tsconfig.json +9 -0
- package/dist/templates/lambda-api-nodejs/package.json.tmpl +20 -0
- package/dist/templates/lambda-api-nodejs/tsconfig.json +27 -0
- package/dist/templates/lambda-dynamo-api/README.md.tmpl +184 -0
- package/dist/templates/lambda-dynamo-api/apps/__lambdaName__/index.ts +109 -0
- package/dist/templates/lambda-dynamo-api/apps/__lambdaName__/package.json +19 -0
- package/dist/templates/lambda-dynamo-api/apps/__lambdaName__/tsconfig.json +24 -0
- package/dist/templates/lambda-dynamo-api/cdk/app.ts.tmpl +59 -0
- package/dist/templates/lambda-dynamo-api/cdk/cdk.json +73 -0
- package/dist/templates/lambda-dynamo-api/cdk/package.json +23 -0
- package/dist/templates/lambda-dynamo-api/cdk/tsconfig.json +14 -0
- package/dist/templates/lambda-dynamo-api/package.json.tmpl +20 -0
- package/dist/templates/lambda-dynamo-api/tsconfig.json +27 -0
- package/dist/templates/lambda-postgres-api/README.md.tmpl +234 -0
- package/dist/templates/lambda-postgres-api/apps/__lambdaName__/index.ts +76 -0
- package/dist/templates/lambda-postgres-api/apps/__lambdaName__/package.json +18 -0
- package/dist/templates/lambda-postgres-api/apps/__lambdaName__/tsconfig.json +26 -0
- package/dist/templates/lambda-postgres-api/cdk/app.ts.tmpl +55 -0
- package/dist/templates/lambda-postgres-api/cdk/cdk.json +4 -0
- package/dist/templates/lambda-postgres-api/cdk/package.json +23 -0
- package/dist/templates/lambda-postgres-api/cdk/tsconfig.json +25 -0
- package/dist/templates/lambda-postgres-api/package.json.tmpl +20 -0
- package/dist/templates/lambda-postgres-api/tsconfig.json +11 -0
- package/dist/templates/static-site/README.md.tmpl +72 -0
- package/dist/templates/static-site/cdk/app.ts.tmpl +50 -0
- package/dist/templates/static-site/cdk/cdk.json +68 -0
- package/dist/templates/static-site/cdk/package.json +23 -0
- package/dist/templates/static-site/cdk/tsconfig.json +9 -0
- package/dist/templates/static-site/frontend/.gitkeep +0 -0
- package/dist/templates/static-site/frontend/README.md +41 -0
- package/dist/templates/static-site/frontend/package.json +9 -0
- package/dist/templates/static-site/package.json.tmpl +19 -0
- package/dist/templates/static-site/tsconfig.json +27 -0
- package/dist/templates/webapp-ecs-dotnet/README.md.tmpl +213 -0
- package/dist/templates/webapp-ecs-dotnet/apps/api/Api.csproj +12 -0
- package/dist/templates/webapp-ecs-dotnet/apps/api/Dockerfile +30 -0
- package/dist/templates/webapp-ecs-dotnet/apps/api/Program.cs +85 -0
- package/dist/templates/webapp-ecs-dotnet/apps/api/obj/Api.csproj.nuget.dgspec.json +70 -0
- package/dist/templates/webapp-ecs-dotnet/apps/api/obj/Api.csproj.nuget.g.props +15 -0
- package/dist/templates/webapp-ecs-dotnet/apps/api/obj/Api.csproj.nuget.g.targets +2 -0
- package/dist/templates/webapp-ecs-dotnet/apps/api/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs +4 -0
- package/dist/templates/webapp-ecs-dotnet/apps/api/obj/Debug/net8.0/Api.AssemblyInfo.cs +22 -0
- package/dist/templates/webapp-ecs-dotnet/apps/api/obj/Debug/net8.0/Api.AssemblyInfoInputs.cache +1 -0
- package/dist/templates/webapp-ecs-dotnet/apps/api/obj/Debug/net8.0/Api.GeneratedMSBuildEditorConfig.editorconfig +19 -0
- package/dist/templates/webapp-ecs-dotnet/apps/api/obj/Debug/net8.0/Api.GlobalUsings.g.cs +17 -0
- package/dist/templates/webapp-ecs-dotnet/apps/api/obj/Debug/net8.0/Api.assets.cache +0 -0
- package/dist/templates/webapp-ecs-dotnet/apps/api/obj/project.assets.json +75 -0
- package/dist/templates/webapp-ecs-dotnet/apps/api/obj/project.nuget.cache +8 -0
- package/dist/templates/webapp-ecs-dotnet/cdk/app.ts.tmpl +60 -0
- package/dist/templates/webapp-ecs-dotnet/cdk/cdk.json +38 -0
- package/dist/templates/webapp-ecs-dotnet/cdk/tsconfig.json +25 -0
- package/dist/templates/webapp-ecs-dotnet/package.json.tmpl +23 -0
- package/dist/templates/webapp-ecs-dotnet/tsconfig.json +26 -0
- package/dist/templates/webapp-ecs-node/README.md.tmpl +207 -0
- package/dist/templates/webapp-ecs-node/apps/api/Dockerfile +33 -0
- package/dist/templates/webapp-ecs-node/apps/api/index.ts +74 -0
- package/dist/templates/webapp-ecs-node/apps/api/package.json +22 -0
- package/dist/templates/webapp-ecs-node/apps/api/tsconfig.json +18 -0
- package/dist/templates/webapp-ecs-node/cdk/app.ts.tmpl +60 -0
- package/dist/templates/webapp-ecs-node/cdk/cdk.json +38 -0
- package/dist/templates/webapp-ecs-node/cdk/tsconfig.json +25 -0
- package/dist/templates/webapp-ecs-node/package.json.tmpl +25 -0
- package/dist/templates/webapp-ecs-node/tsconfig.json +26 -0
- package/dist/templates/webapp-ecs-postgres-dotnet/README.md.tmpl +271 -0
- package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/Api.csproj +17 -0
- package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/Dockerfile +30 -0
- package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/Program.cs +194 -0
- package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/obj/Api.csproj.nuget.dgspec.json +80 -0
- package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/obj/Api.csproj.nuget.g.props +19 -0
- package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/obj/Api.csproj.nuget.g.targets +6 -0
- package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs +4 -0
- package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/obj/Debug/net8.0/Api.AssemblyInfo.cs +22 -0
- package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/obj/Debug/net8.0/Api.AssemblyInfoInputs.cache +1 -0
- package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/obj/Debug/net8.0/Api.GeneratedMSBuildEditorConfig.editorconfig +19 -0
- package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/obj/Debug/net8.0/Api.GlobalUsings.g.cs +17 -0
- package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/obj/Debug/net8.0/Api.assets.cache +0 -0
- package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/obj/Debug/net8.0/Api.csproj.AssemblyReference.cache +0 -0
- package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/obj/project.assets.json +395 -0
- package/dist/templates/webapp-ecs-postgres-dotnet/apps/api/obj/project.nuget.cache +49 -0
- package/dist/templates/webapp-ecs-postgres-dotnet/cdk/app.ts.tmpl +62 -0
- package/dist/templates/webapp-ecs-postgres-dotnet/cdk/cdk.json +38 -0
- package/dist/templates/webapp-ecs-postgres-dotnet/cdk/tsconfig.json +25 -0
- package/dist/templates/webapp-ecs-postgres-dotnet/package.json.tmpl +23 -0
- package/dist/templates/webapp-ecs-postgres-dotnet/tsconfig.json +26 -0
- package/dist/templates/webapp-ecs-postgres-node/README.md.tmpl +261 -0
- package/dist/templates/webapp-ecs-postgres-node/apps/api/Dockerfile +33 -0
- package/dist/templates/webapp-ecs-postgres-node/apps/api/index.ts +160 -0
- package/dist/templates/webapp-ecs-postgres-node/apps/api/package.json +25 -0
- package/dist/templates/webapp-ecs-postgres-node/apps/api/tsconfig.json +18 -0
- package/dist/templates/webapp-ecs-postgres-node/cdk/app.ts.tmpl +62 -0
- package/dist/templates/webapp-ecs-postgres-node/cdk/cdk.json +38 -0
- package/dist/templates/webapp-ecs-postgres-node/cdk/tsconfig.json +25 -0
- package/dist/templates/webapp-ecs-postgres-node/package.json.tmpl +25 -0
- package/dist/templates/webapp-ecs-postgres-node/tsconfig.json +26 -0
- package/dist/templates/webapp-lambda-dotnet/README.md.tmpl +188 -0
- package/dist/templates/webapp-lambda-dotnet/apps/api/Api.csproj +17 -0
- package/dist/templates/webapp-lambda-dotnet/apps/api/Program.cs +58 -0
- package/dist/templates/webapp-lambda-dotnet/apps/api/aws-lambda-tools-defaults.json +10 -0
- package/dist/templates/webapp-lambda-dotnet/apps/api/obj/Api.csproj.nuget.dgspec.json +80 -0
- package/dist/templates/webapp-lambda-dotnet/apps/api/obj/Api.csproj.nuget.g.props +15 -0
- package/dist/templates/webapp-lambda-dotnet/apps/api/obj/Api.csproj.nuget.g.targets +2 -0
- package/dist/templates/webapp-lambda-dotnet/apps/api/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs +4 -0
- package/dist/templates/webapp-lambda-dotnet/apps/api/obj/Debug/net8.0/Api.AssemblyInfo.cs +22 -0
- package/dist/templates/webapp-lambda-dotnet/apps/api/obj/Debug/net8.0/Api.AssemblyInfoInputs.cache +1 -0
- package/dist/templates/webapp-lambda-dotnet/apps/api/obj/Debug/net8.0/Api.GeneratedMSBuildEditorConfig.editorconfig +19 -0
- package/dist/templates/webapp-lambda-dotnet/apps/api/obj/Debug/net8.0/Api.GlobalUsings.g.cs +17 -0
- package/dist/templates/webapp-lambda-dotnet/apps/api/obj/Debug/net8.0/Api.assets.cache +0 -0
- package/dist/templates/webapp-lambda-dotnet/apps/api/obj/Debug/net8.0/Api.csproj.AssemblyReference.cache +0 -0
- package/dist/templates/webapp-lambda-dotnet/apps/api/obj/project.assets.json +708 -0
- package/dist/templates/webapp-lambda-dotnet/apps/api/obj/project.nuget.cache +35 -0
- package/dist/templates/webapp-lambda-dotnet/cdk/app.ts.tmpl +59 -0
- package/dist/templates/webapp-lambda-dotnet/cdk/cdk.json +68 -0
- package/dist/templates/webapp-lambda-dotnet/cdk/tsconfig.json +9 -0
- package/dist/templates/webapp-lambda-dotnet/package.json.tmpl +23 -0
- package/dist/templates/webapp-lambda-dotnet/tsconfig.json +27 -0
- package/dist/templates/webapp-lambda-dynamo-dotnet/README.md.tmpl +223 -0
- package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/Api.csproj +18 -0
- package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/Program.cs +155 -0
- package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/aws-lambda-tools-defaults.json +10 -0
- package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/obj/Api.csproj.nuget.dgspec.json +84 -0
- package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/obj/Api.csproj.nuget.g.props +19 -0
- package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/obj/Api.csproj.nuget.g.targets +2 -0
- package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs +4 -0
- package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/obj/Debug/net8.0/Api.AssemblyInfo.cs +22 -0
- package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/obj/Debug/net8.0/Api.AssemblyInfoInputs.cache +1 -0
- package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/obj/Debug/net8.0/Api.GeneratedMSBuildEditorConfig.editorconfig +19 -0
- package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/obj/Debug/net8.0/Api.GlobalUsings.g.cs +17 -0
- package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/obj/Debug/net8.0/Api.assets.cache +0 -0
- package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/obj/Debug/net8.0/Api.csproj.AssemblyReference.cache +0 -0
- package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/obj/project.assets.json +989 -0
- package/dist/templates/webapp-lambda-dynamo-dotnet/apps/api/obj/project.nuget.cache +223 -0
- package/dist/templates/webapp-lambda-dynamo-dotnet/cdk/app.ts.tmpl +65 -0
- package/dist/templates/webapp-lambda-dynamo-dotnet/cdk/cdk.json +68 -0
- package/dist/templates/webapp-lambda-dynamo-dotnet/cdk/tsconfig.json +9 -0
- package/dist/templates/webapp-lambda-dynamo-dotnet/package.json.tmpl +23 -0
- package/dist/templates/webapp-lambda-dynamo-dotnet/tsconfig.json +27 -0
- package/dist/templates/webapp-lambda-dynamo-node/README.md.tmpl +189 -0
- package/dist/templates/webapp-lambda-dynamo-node/apps/api/index.ts +109 -0
- package/dist/templates/webapp-lambda-dynamo-node/apps/api/package.json +19 -0
- package/dist/templates/webapp-lambda-dynamo-node/apps/api/tsconfig.json +8 -0
- package/dist/templates/webapp-lambda-dynamo-node/cdk/app.ts.tmpl +65 -0
- package/dist/templates/webapp-lambda-dynamo-node/cdk/cdk.json +68 -0
- package/dist/templates/webapp-lambda-dynamo-node/cdk/tsconfig.json +9 -0
- package/dist/templates/webapp-lambda-dynamo-node/package.json.tmpl +24 -0
- package/dist/templates/webapp-lambda-dynamo-node/tsconfig.json +27 -0
- package/dist/templates/webapp-lambda-node/README.md.tmpl +179 -0
- package/dist/templates/webapp-lambda-node/apps/api/index.ts +100 -0
- package/dist/templates/webapp-lambda-node/apps/api/package.json +17 -0
- package/dist/templates/webapp-lambda-node/apps/api/tsconfig.json +8 -0
- package/dist/templates/webapp-lambda-node/cdk/app.ts.tmpl +59 -0
- package/dist/templates/webapp-lambda-node/cdk/cdk.json +68 -0
- package/dist/templates/webapp-lambda-node/cdk/tsconfig.json +9 -0
- package/dist/templates/webapp-lambda-node/package.json.tmpl +24 -0
- package/dist/templates/webapp-lambda-node/tsconfig.json +27 -0
- package/dist/templates/webapp-lambda-postgres-dotnet/README.md.tmpl +240 -0
- package/dist/templates/webapp-lambda-postgres-dotnet/apps/api/Api.csproj +19 -0
- package/dist/templates/webapp-lambda-postgres-dotnet/apps/api/Program.cs +167 -0
- package/dist/templates/webapp-lambda-postgres-dotnet/apps/api/aws-lambda-tools-defaults.json +10 -0
- package/dist/templates/webapp-lambda-postgres-dotnet/apps/api/obj/Api.csproj.nuget.dgspec.json +88 -0
- package/dist/templates/webapp-lambda-postgres-dotnet/apps/api/obj/Api.csproj.nuget.g.props +15 -0
- package/dist/templates/webapp-lambda-postgres-dotnet/apps/api/obj/Api.csproj.nuget.g.targets +2 -0
- package/dist/templates/webapp-lambda-postgres-dotnet/apps/api/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs +4 -0
- package/dist/templates/webapp-lambda-postgres-dotnet/apps/api/obj/Debug/net8.0/Api.AssemblyInfo.cs +22 -0
- package/dist/templates/webapp-lambda-postgres-dotnet/apps/api/obj/Debug/net8.0/Api.AssemblyInfoInputs.cache +1 -0
- package/dist/templates/webapp-lambda-postgres-dotnet/apps/api/obj/Debug/net8.0/Api.GeneratedMSBuildEditorConfig.editorconfig +19 -0
- package/dist/templates/webapp-lambda-postgres-dotnet/apps/api/obj/Debug/net8.0/Api.GlobalUsings.g.cs +17 -0
- package/dist/templates/webapp-lambda-postgres-dotnet/apps/api/obj/Debug/net8.0/Api.assets.cache +0 -0
- package/dist/templates/webapp-lambda-postgres-dotnet/apps/api/obj/project.assets.json +106 -0
- package/dist/templates/webapp-lambda-postgres-dotnet/apps/api/obj/project.nuget.cache +15 -0
- package/dist/templates/webapp-lambda-postgres-dotnet/cdk/app.ts.tmpl +61 -0
- package/dist/templates/webapp-lambda-postgres-dotnet/cdk/cdk.json +68 -0
- package/dist/templates/webapp-lambda-postgres-dotnet/cdk/tsconfig.json +9 -0
- package/dist/templates/webapp-lambda-postgres-dotnet/package.json.tmpl +23 -0
- package/dist/templates/webapp-lambda-postgres-dotnet/tsconfig.json +27 -0
- package/dist/templates/webapp-lambda-postgres-node/README.md.tmpl +190 -0
- package/dist/templates/webapp-lambda-postgres-node/apps/api/index.ts +76 -0
- package/dist/templates/webapp-lambda-postgres-node/apps/api/package.json +18 -0
- package/dist/templates/webapp-lambda-postgres-node/apps/api/tsconfig.json +8 -0
- package/dist/templates/webapp-lambda-postgres-node/cdk/app.ts.tmpl +61 -0
- package/dist/templates/webapp-lambda-postgres-node/cdk/cdk.json +68 -0
- package/dist/templates/webapp-lambda-postgres-node/cdk/tsconfig.json +9 -0
- package/dist/templates/webapp-lambda-postgres-node/package.json.tmpl +24 -0
- package/dist/templates/webapp-lambda-postgres-node/tsconfig.json +27 -0
- package/dist/utils/aws.d.ts +4 -0
- package/dist/utils/aws.d.ts.map +1 -0
- package/dist/utils/aws.js +90 -0
- package/dist/utils/aws.js.map +1 -0
- package/dist/utils/dependencies.d.ts +27 -0
- package/dist/utils/dependencies.d.ts.map +1 -0
- package/dist/utils/dependencies.js +267 -0
- package/dist/utils/dependencies.js.map +1 -0
- package/dist/utils/template.d.ts +23 -0
- package/dist/utils/template.d.ts.map +1 -0
- package/dist/utils/template.js +115 -0
- package/dist/utils/template.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
is_global = true
|
|
2
|
+
build_property.TargetFramework = net8.0
|
|
3
|
+
build_property.TargetPlatformMinVersion =
|
|
4
|
+
build_property.UsingMicrosoftNETSdkWeb = true
|
|
5
|
+
build_property.ProjectTypeGuids =
|
|
6
|
+
build_property.InvariantGlobalization =
|
|
7
|
+
build_property.PlatformNeutralAssembly =
|
|
8
|
+
build_property.EnforceExtendedAnalyzerRules =
|
|
9
|
+
build_property._SupportedPlatformList = Linux,macOS,Windows
|
|
10
|
+
build_property.RootNamespace = Api
|
|
11
|
+
build_property.RootNamespace = Api
|
|
12
|
+
build_property.ProjectDir = /Users/alejandro.lopez/code/phila-ctl/packages/cli/dist/templates/webapp-ecs-dotnet/apps/api/
|
|
13
|
+
build_property.EnableComHosting =
|
|
14
|
+
build_property.EnableGeneratedComInterfaceComImportInterop =
|
|
15
|
+
build_property.RazorLangVersion = 8.0
|
|
16
|
+
build_property.SupportLocalizedComponentNames =
|
|
17
|
+
build_property.GenerateRazorMetadataSourceChecksumAttributes =
|
|
18
|
+
build_property.MSBuildProjectDirectory = /Users/alejandro.lopez/code/phila-ctl/packages/cli/dist/templates/webapp-ecs-dotnet/apps/api
|
|
19
|
+
build_property._RazorSourceGeneratorDebug =
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// <auto-generated/>
|
|
2
|
+
global using global::Microsoft.AspNetCore.Builder;
|
|
3
|
+
global using global::Microsoft.AspNetCore.Hosting;
|
|
4
|
+
global using global::Microsoft.AspNetCore.Http;
|
|
5
|
+
global using global::Microsoft.AspNetCore.Routing;
|
|
6
|
+
global using global::Microsoft.Extensions.Configuration;
|
|
7
|
+
global using global::Microsoft.Extensions.DependencyInjection;
|
|
8
|
+
global using global::Microsoft.Extensions.Hosting;
|
|
9
|
+
global using global::Microsoft.Extensions.Logging;
|
|
10
|
+
global using global::System;
|
|
11
|
+
global using global::System.Collections.Generic;
|
|
12
|
+
global using global::System.IO;
|
|
13
|
+
global using global::System.Linq;
|
|
14
|
+
global using global::System.Net.Http;
|
|
15
|
+
global using global::System.Net.Http.Json;
|
|
16
|
+
global using global::System.Threading;
|
|
17
|
+
global using global::System.Threading.Tasks;
|
|
Binary file
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"targets": {
|
|
4
|
+
"net8.0": {}
|
|
5
|
+
},
|
|
6
|
+
"libraries": {},
|
|
7
|
+
"projectFileDependencyGroups": {
|
|
8
|
+
"net8.0": []
|
|
9
|
+
},
|
|
10
|
+
"packageFolders": {
|
|
11
|
+
"/Users/alejandro.lopez/.nuget/packages/": {}
|
|
12
|
+
},
|
|
13
|
+
"project": {
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"restore": {
|
|
16
|
+
"projectUniqueName": "/Users/alejandro.lopez/code/phila-ctl/templates/webapp-ecs-dotnet/apps/api/Api.csproj",
|
|
17
|
+
"projectName": "Api",
|
|
18
|
+
"projectPath": "/Users/alejandro.lopez/code/phila-ctl/templates/webapp-ecs-dotnet/apps/api/Api.csproj",
|
|
19
|
+
"packagesPath": "/Users/alejandro.lopez/.nuget/packages/",
|
|
20
|
+
"outputPath": "/Users/alejandro.lopez/code/phila-ctl/templates/webapp-ecs-dotnet/apps/api/obj/",
|
|
21
|
+
"projectStyle": "PackageReference",
|
|
22
|
+
"configFilePaths": [
|
|
23
|
+
"/Users/alejandro.lopez/.nuget/NuGet/NuGet.Config"
|
|
24
|
+
],
|
|
25
|
+
"originalTargetFrameworks": [
|
|
26
|
+
"net8.0"
|
|
27
|
+
],
|
|
28
|
+
"sources": {
|
|
29
|
+
"https://api.nuget.org/v3/index.json": {},
|
|
30
|
+
"https://philagov-102658671810.d.codeartifact.us-east-1.amazonaws.com/nuget/se-team/v3/index.json": {}
|
|
31
|
+
},
|
|
32
|
+
"frameworks": {
|
|
33
|
+
"net8.0": {
|
|
34
|
+
"targetAlias": "net8.0",
|
|
35
|
+
"projectReferences": {}
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"warningProperties": {
|
|
39
|
+
"warnAsError": [
|
|
40
|
+
"NU1605"
|
|
41
|
+
]
|
|
42
|
+
},
|
|
43
|
+
"restoreAuditProperties": {
|
|
44
|
+
"enableAudit": "true",
|
|
45
|
+
"auditLevel": "low",
|
|
46
|
+
"auditMode": "direct"
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"frameworks": {
|
|
50
|
+
"net8.0": {
|
|
51
|
+
"targetAlias": "net8.0",
|
|
52
|
+
"imports": [
|
|
53
|
+
"net461",
|
|
54
|
+
"net462",
|
|
55
|
+
"net47",
|
|
56
|
+
"net471",
|
|
57
|
+
"net472",
|
|
58
|
+
"net48",
|
|
59
|
+
"net481"
|
|
60
|
+
],
|
|
61
|
+
"assetTargetFallback": true,
|
|
62
|
+
"warn": true,
|
|
63
|
+
"frameworkReferences": {
|
|
64
|
+
"Microsoft.AspNetCore.App": {
|
|
65
|
+
"privateAssets": "none"
|
|
66
|
+
},
|
|
67
|
+
"Microsoft.NETCore.App": {
|
|
68
|
+
"privateAssets": "all"
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
"runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/8.0.403/PortableRuntimeIdentifierGraph.json"
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import 'source-map-support/register';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import { App, Aspects, Stack } from 'aws-cdk-lib';
|
|
5
|
+
import * as ecs from 'aws-cdk-lib/aws-ecs';
|
|
6
|
+
import { AwsSolutionsChecks, NIST80053R5Checks } from 'cdk-nag';
|
|
7
|
+
import { StaticSite, EcsApi, Confidentiality, Environment } from '@phila/constructs';
|
|
8
|
+
|
|
9
|
+
const app = new App();
|
|
10
|
+
|
|
11
|
+
// Environment is determined by CDK context
|
|
12
|
+
const environment = app.node.tryGetContext('environment') as Environment;
|
|
13
|
+
|
|
14
|
+
if (!environment) {
|
|
15
|
+
throw new Error('Environment must be specified via context. Use: cdk deploy -c environment=dev');
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// Read compliance frameworks from context
|
|
19
|
+
const compliance = app.node.tryGetContext('compliance');
|
|
20
|
+
const complianceFrameworks = compliance ? compliance.split(',') : [];
|
|
21
|
+
|
|
22
|
+
// Application context with governance metadata
|
|
23
|
+
const context = {
|
|
24
|
+
appName: '{{appName}}',
|
|
25
|
+
environment,
|
|
26
|
+
department: '{{department}}',
|
|
27
|
+
team: '{{team}}',
|
|
28
|
+
contact: '{{contact}}',
|
|
29
|
+
compliance: complianceFrameworks,
|
|
30
|
+
confidentiality: Confidentiality.{{CONFIDENTIALITY}},
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
// Stack name follows pattern: {appName}-{environment}
|
|
34
|
+
const stack = new Stack(app, '{{appName}}-' + environment, {
|
|
35
|
+
env: {
|
|
36
|
+
account: process.env.CDK_DEFAULT_ACCOUNT,
|
|
37
|
+
region: process.env.CDK_DEFAULT_REGION || 'us-east-1',
|
|
38
|
+
},
|
|
39
|
+
stackName: '{{appName}}-' + environment,
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// Create the StaticSite construct for the Nuxt frontend
|
|
43
|
+
new StaticSite(stack, '{{appName}}Site', {
|
|
44
|
+
...context,
|
|
45
|
+
assetDir: '../frontend/dist',
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// Create the EcsApi construct for the containerized .NET API backend
|
|
49
|
+
new EcsApi(stack, '{{appName}}Api', {
|
|
50
|
+
...context,
|
|
51
|
+
apiId: 'api',
|
|
52
|
+
image: ecs.ContainerImage.fromAsset(path.join(__dirname, '../apps/api')),
|
|
53
|
+
containerPort: 80,
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// Apply compliance checks
|
|
57
|
+
Aspects.of(app).add(new NIST80053R5Checks({ verbose: true }));
|
|
58
|
+
Aspects.of(app).add(new AwsSolutionsChecks({ verbose: true }));
|
|
59
|
+
|
|
60
|
+
app.synth();
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"app": "npx ts-node --prefer-ts-exts app.ts",
|
|
3
|
+
"watch": {
|
|
4
|
+
"include": ["**"],
|
|
5
|
+
"exclude": [
|
|
6
|
+
"README.md",
|
|
7
|
+
"cdk*.json",
|
|
8
|
+
"**/*.d.ts",
|
|
9
|
+
"**/*.js",
|
|
10
|
+
"tsconfig.json",
|
|
11
|
+
"package*.json",
|
|
12
|
+
"node_modules",
|
|
13
|
+
"test"
|
|
14
|
+
]
|
|
15
|
+
},
|
|
16
|
+
"context": {
|
|
17
|
+
"@aws-cdk/aws-lambda:recognizeLayerVersion": true,
|
|
18
|
+
"@aws-cdk/core:checkSecretUsage": true,
|
|
19
|
+
"@aws-cdk/core:target-partitions": ["aws", "aws-cn"],
|
|
20
|
+
"@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true,
|
|
21
|
+
"@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true,
|
|
22
|
+
"@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true,
|
|
23
|
+
"@aws-cdk/aws-iam:minimizePolicies": true,
|
|
24
|
+
"@aws-cdk/core:validateSnapshotRemovalPolicy": true,
|
|
25
|
+
"@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true,
|
|
26
|
+
"@aws-cdk/aws-s3:createDefaultLoggingPolicy": true,
|
|
27
|
+
"@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true,
|
|
28
|
+
"@aws-cdk/aws-apigateway:disableCloudWatchRole": true,
|
|
29
|
+
"@aws-cdk/core:enablePartitionLiterals": true,
|
|
30
|
+
"@aws-cdk/aws-events:eventsTargetQueueSameAccount": true,
|
|
31
|
+
"@aws-cdk/aws-iam:standardizedServicePrincipals": true,
|
|
32
|
+
"@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true,
|
|
33
|
+
"@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": true,
|
|
34
|
+
"@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": true,
|
|
35
|
+
"@aws-cdk/aws-route53-patters:useCertificate": true,
|
|
36
|
+
"@aws-cdk/customresources:installLatestAwsSdkDefault": false
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "commonjs",
|
|
5
|
+
"lib": ["ES2022"],
|
|
6
|
+
"declaration": true,
|
|
7
|
+
"strict": true,
|
|
8
|
+
"noImplicitAny": true,
|
|
9
|
+
"strictNullChecks": true,
|
|
10
|
+
"noImplicitThis": true,
|
|
11
|
+
"alwaysStrict": true,
|
|
12
|
+
"noUnusedLocals": false,
|
|
13
|
+
"noUnusedParameters": false,
|
|
14
|
+
"noImplicitReturns": true,
|
|
15
|
+
"noFallthroughCasesInSwitch": false,
|
|
16
|
+
"inlineSourceMap": true,
|
|
17
|
+
"inlineSources": true,
|
|
18
|
+
"experimentalDecorators": true,
|
|
19
|
+
"strictPropertyInitialization": false,
|
|
20
|
+
"outDir": "./dist",
|
|
21
|
+
"rootDir": "./"
|
|
22
|
+
},
|
|
23
|
+
"include": ["./*.ts"],
|
|
24
|
+
"exclude": ["node_modules", "cdk.out"]
|
|
25
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{appName}}",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Web application with Nuxt frontend and .NET ECS containerized API backend",
|
|
5
|
+
"private": true,
|
|
6
|
+
"scripts": {
|
|
7
|
+
"build": "npm run build:frontend && npm run build:api",
|
|
8
|
+
"build:frontend": "cd frontend && npm run build",
|
|
9
|
+
"build:api": "cd apps/api && docker build -t {{appName}}-api .",
|
|
10
|
+
"dev": "cd frontend && npm run dev",
|
|
11
|
+
"test": "npm test --workspaces --if-present",
|
|
12
|
+
"synth": "cd cdk && cdk synth",
|
|
13
|
+
"deploy": "cd cdk && cdk deploy",
|
|
14
|
+
"diff": "cd cdk && cdk diff"
|
|
15
|
+
},
|
|
16
|
+
"workspaces": [
|
|
17
|
+
"cdk",
|
|
18
|
+
"frontend"
|
|
19
|
+
],
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"typescript": "^5.3.0"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "commonjs",
|
|
5
|
+
"lib": ["ES2022"],
|
|
6
|
+
"declaration": true,
|
|
7
|
+
"strict": true,
|
|
8
|
+
"noImplicitAny": true,
|
|
9
|
+
"strictNullChecks": true,
|
|
10
|
+
"noImplicitThis": true,
|
|
11
|
+
"alwaysStrict": true,
|
|
12
|
+
"noUnusedLocals": false,
|
|
13
|
+
"noUnusedParameters": false,
|
|
14
|
+
"noImplicitReturns": true,
|
|
15
|
+
"noFallthroughCasesInSwitch": false,
|
|
16
|
+
"inlineSourceMap": true,
|
|
17
|
+
"inlineSources": true,
|
|
18
|
+
"experimentalDecorators": true,
|
|
19
|
+
"strictPropertyInitialization": false,
|
|
20
|
+
"skipLibCheck": true,
|
|
21
|
+
"esModuleInterop": true,
|
|
22
|
+
"resolveJsonModule": true,
|
|
23
|
+
"forceConsistentCasingInFileNames": true
|
|
24
|
+
},
|
|
25
|
+
"exclude": ["node_modules", "cdk", "apps", "frontend"]
|
|
26
|
+
}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
# {{appName}}
|
|
2
|
+
|
|
3
|
+
Web application with Nuxt SSG frontend and ECS containerized API backend using Philadelphia constructs.
|
|
4
|
+
|
|
5
|
+
Generated on {{timestamp}}
|
|
6
|
+
|
|
7
|
+
## Architecture
|
|
8
|
+
|
|
9
|
+

|
|
10
|
+
|
|
11
|
+
View the [architecture diagram](https://github.com/CityOfPhiladelphia/phila-ctl/blob/main/packages/constructs/docs/diagrams/webapp-ecs.drawio) in draw.io or VS Code with the Draw.io extension.
|
|
12
|
+
|
|
13
|
+
## Quick Start
|
|
14
|
+
|
|
15
|
+
### Prerequisites
|
|
16
|
+
|
|
17
|
+
- Node.js 20+
|
|
18
|
+
- Docker (for building container images)
|
|
19
|
+
- AWS CLI configured with SSO
|
|
20
|
+
- AWS profile named `phila-{{appName}}`
|
|
21
|
+
|
|
22
|
+
### Setup
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# Install dependencies
|
|
26
|
+
npm install
|
|
27
|
+
|
|
28
|
+
# Build all packages
|
|
29
|
+
npm run build
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Development
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# Run frontend dev server
|
|
36
|
+
npm run dev
|
|
37
|
+
|
|
38
|
+
# Run API locally (requires Docker)
|
|
39
|
+
cd apps/api && npm run dev
|
|
40
|
+
|
|
41
|
+
# Build frontend for production
|
|
42
|
+
npm run build:frontend
|
|
43
|
+
|
|
44
|
+
# Build API Docker image
|
|
45
|
+
npm run build:api
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Deployment
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# Configure AWS profile
|
|
52
|
+
export AWS_PROFILE=phila-{{appName}}
|
|
53
|
+
|
|
54
|
+
# Deploy to dev environment
|
|
55
|
+
city deploy dev
|
|
56
|
+
|
|
57
|
+
# Deploy to test environment
|
|
58
|
+
city deploy test
|
|
59
|
+
|
|
60
|
+
# Deploy to production (requires confirmation)
|
|
61
|
+
city deploy prod
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Shipping Updates
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
# Ship frontend changes to S3/CloudFront
|
|
68
|
+
city ship dev --web
|
|
69
|
+
|
|
70
|
+
# Ship API changes (rebuilds and deploys ECS container)
|
|
71
|
+
city ship dev --ecs api
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Project Structure
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
.
|
|
78
|
+
├── cdk/ # CDK infrastructure code
|
|
79
|
+
│ └── app.ts # Main CDK application
|
|
80
|
+
├── frontend/ # Nuxt 3 SSG frontend
|
|
81
|
+
│ ├── pages/ # File-based routing
|
|
82
|
+
│ ├── app.vue # Root component
|
|
83
|
+
│ └── nuxt.config.ts # Nuxt configuration
|
|
84
|
+
├── apps/ # Backend code
|
|
85
|
+
│ └── api/ # Express API container
|
|
86
|
+
│ ├── index.ts # API routes
|
|
87
|
+
│ └── Dockerfile # Container build file
|
|
88
|
+
└── city.config.json # City CLI configuration
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Frontend
|
|
92
|
+
|
|
93
|
+
The frontend uses [Nuxt 3](https://nuxt.com) with Static Site Generation (SSG):
|
|
94
|
+
|
|
95
|
+
- Pre-renders to static HTML for S3/CloudFront
|
|
96
|
+
- File-based routing in `pages/` directory
|
|
97
|
+
- TypeScript support enabled
|
|
98
|
+
|
|
99
|
+
### Adding Pages
|
|
100
|
+
|
|
101
|
+
Create Vue files in `frontend/pages/`:
|
|
102
|
+
|
|
103
|
+
```vue
|
|
104
|
+
<!-- frontend/pages/about.vue -->
|
|
105
|
+
<template>
|
|
106
|
+
<div>
|
|
107
|
+
<h1>About</h1>
|
|
108
|
+
</div>
|
|
109
|
+
</template>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
This automatically creates a route at `/about`.
|
|
113
|
+
|
|
114
|
+
## API
|
|
115
|
+
|
|
116
|
+
The API uses [Express](https://expressjs.com/) running in an ECS Fargate container behind an Application Load Balancer.
|
|
117
|
+
|
|
118
|
+
### Adding Endpoints
|
|
119
|
+
|
|
120
|
+
Edit `apps/api/index.ts`:
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
app.get('/users', (req, res) => {
|
|
124
|
+
res.json({ users: [] });
|
|
125
|
+
});
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Environment Variables
|
|
129
|
+
|
|
130
|
+
ECS containers automatically receive:
|
|
131
|
+
- `APP_NAME` - Application name ({{appName}})
|
|
132
|
+
- `ENVIRONMENT` - Current environment (dev/test/prod)
|
|
133
|
+
|
|
134
|
+
### Local Development
|
|
135
|
+
|
|
136
|
+
Run the API locally:
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
cd apps/api
|
|
140
|
+
npm run dev
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Or build and run the Docker container:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
cd apps/api
|
|
147
|
+
docker build -t {{appName}}-api .
|
|
148
|
+
docker run -p 80:80 -e APP_NAME={{appName}} -e ENVIRONMENT=dev {{appName}}-api
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Resources Created
|
|
152
|
+
|
|
153
|
+
This application creates:
|
|
154
|
+
|
|
155
|
+
**Frontend:**
|
|
156
|
+
- **S3 Bucket** - Static asset storage
|
|
157
|
+
- **CloudFront Distribution** - CDN with HTTPS
|
|
158
|
+
- **Origin Access Control** - Secure S3 access
|
|
159
|
+
|
|
160
|
+
**API:**
|
|
161
|
+
- **ECS Fargate Service** - Containerized compute
|
|
162
|
+
- **Application Load Balancer** - HTTP/HTTPS ingress
|
|
163
|
+
- **ECS Cluster** - Container orchestration
|
|
164
|
+
- **ECR Repository** - Docker image storage
|
|
165
|
+
- **VPC Security Groups** - Network security
|
|
166
|
+
- **IAM Roles** - Task execution permissions
|
|
167
|
+
|
|
168
|
+
**Shared:**
|
|
169
|
+
- **SSM Parameters** - Resource discovery
|
|
170
|
+
- **CloudWatch Logs** - Application logs
|
|
171
|
+
- **KMS Keys** - Encryption
|
|
172
|
+
|
|
173
|
+
## URLs
|
|
174
|
+
|
|
175
|
+
After deployment, URLs are available via:
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
# Frontend URL
|
|
179
|
+
city config list --env dev | grep cloudfront
|
|
180
|
+
|
|
181
|
+
# API URL (ALB endpoint)
|
|
182
|
+
city config list --env dev | grep ecs-api
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## Adding a Database
|
|
186
|
+
|
|
187
|
+
To add a database, use one of these templates instead:
|
|
188
|
+
- `webapp-ecs-postgres-node` - For PostgreSQL
|
|
189
|
+
|
|
190
|
+
## Scaling
|
|
191
|
+
|
|
192
|
+
ECS automatically adjusts:
|
|
193
|
+
- **Dev**: 1 container instance
|
|
194
|
+
- **Test/Prod**: 2+ container instances with auto-scaling
|
|
195
|
+
|
|
196
|
+
Container resources default to:
|
|
197
|
+
- CPU: 256 units (0.25 vCPU)
|
|
198
|
+
- Memory: 512 MB
|
|
199
|
+
|
|
200
|
+
Adjust in `cdk/app.ts` by passing `cpu` and `memoryLimitMiB` props to `EcsApi`.
|
|
201
|
+
|
|
202
|
+
## Support
|
|
203
|
+
|
|
204
|
+
For issues or questions:
|
|
205
|
+
- [Philadelphia Infrastructure Library Documentation](https://github.com/CityOfPhiladelphia/phila-ctl)
|
|
206
|
+
- [Express Documentation](https://expressjs.com/)
|
|
207
|
+
- [Nuxt Documentation](https://nuxt.com/docs)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# ABOUTME: Multi-stage Docker build for Express API
|
|
2
|
+
# ABOUTME: Creates minimal production image with compiled TypeScript
|
|
3
|
+
|
|
4
|
+
# Build stage
|
|
5
|
+
FROM node:20-alpine AS builder
|
|
6
|
+
|
|
7
|
+
WORKDIR /app
|
|
8
|
+
|
|
9
|
+
COPY package*.json ./
|
|
10
|
+
RUN npm ci
|
|
11
|
+
|
|
12
|
+
COPY tsconfig.json ./
|
|
13
|
+
COPY *.ts ./
|
|
14
|
+
RUN npm run build
|
|
15
|
+
|
|
16
|
+
# Production stage
|
|
17
|
+
FROM node:20-alpine
|
|
18
|
+
|
|
19
|
+
WORKDIR /app
|
|
20
|
+
|
|
21
|
+
# Copy package files and install production dependencies only
|
|
22
|
+
COPY package*.json ./
|
|
23
|
+
RUN npm ci --omit=dev
|
|
24
|
+
|
|
25
|
+
# Copy compiled JavaScript from builder
|
|
26
|
+
COPY --from=builder /app/dist ./dist
|
|
27
|
+
|
|
28
|
+
# Run as non-root user for security
|
|
29
|
+
USER node
|
|
30
|
+
|
|
31
|
+
EXPOSE 80
|
|
32
|
+
|
|
33
|
+
CMD ["node", "dist/index.js"]
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// ABOUTME: Express API server for ECS container deployment
|
|
2
|
+
// ABOUTME: Provides REST endpoints for the web application backend
|
|
3
|
+
|
|
4
|
+
import express, { Request, Response, NextFunction } from 'express';
|
|
5
|
+
import cors from 'cors';
|
|
6
|
+
|
|
7
|
+
const app = express();
|
|
8
|
+
const PORT = process.env.PORT || 80;
|
|
9
|
+
|
|
10
|
+
// Middleware
|
|
11
|
+
app.use(cors());
|
|
12
|
+
app.use(express.json());
|
|
13
|
+
|
|
14
|
+
// Request logging
|
|
15
|
+
app.use((req: Request, _res: Response, next: NextFunction) => {
|
|
16
|
+
console.log(`${new Date().toISOString()} ${req.method} ${req.path}`);
|
|
17
|
+
next();
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
// Health check endpoint (required for ALB health checks)
|
|
21
|
+
app.get('/health', (_req: Request, res: Response) => {
|
|
22
|
+
res.json({
|
|
23
|
+
status: 'healthy',
|
|
24
|
+
timestamp: new Date().toISOString(),
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
// Hello world endpoint
|
|
29
|
+
app.get('/hello', (req: Request, res: Response) => {
|
|
30
|
+
const name = req.query.name || 'World';
|
|
31
|
+
res.json({
|
|
32
|
+
message: `Hello, ${name}!`,
|
|
33
|
+
appName: process.env.APP_NAME,
|
|
34
|
+
environment: process.env.ENVIRONMENT,
|
|
35
|
+
timestamp: new Date().toISOString(),
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
// Example POST endpoint
|
|
40
|
+
app.post('/items', (req: Request, res: Response) => {
|
|
41
|
+
const body = req.body;
|
|
42
|
+
console.log('Creating item:', body);
|
|
43
|
+
|
|
44
|
+
res.status(201).json({
|
|
45
|
+
message: 'Item created',
|
|
46
|
+
item: body,
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// Example GET with path parameter
|
|
51
|
+
app.get('/items/:id', (req: Request, res: Response) => {
|
|
52
|
+
const { id } = req.params;
|
|
53
|
+
|
|
54
|
+
res.json({
|
|
55
|
+
id,
|
|
56
|
+
message: `Retrieved item ${id}`,
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
// Error handler
|
|
61
|
+
app.use((err: Error, _req: Request, res: Response, _next: NextFunction) => {
|
|
62
|
+
console.error('Error:', err);
|
|
63
|
+
res.status(500).json({
|
|
64
|
+
error: 'Internal Server Error',
|
|
65
|
+
message: err.message,
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
// Start server
|
|
70
|
+
app.listen(PORT, () => {
|
|
71
|
+
console.log(`Server running on port ${PORT}`);
|
|
72
|
+
console.log(`APP_NAME: ${process.env.APP_NAME}`);
|
|
73
|
+
console.log(`ENVIRONMENT: ${process.env.ENVIRONMENT}`);
|
|
74
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "api",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"build": "tsc",
|
|
8
|
+
"start": "node dist/index.js",
|
|
9
|
+
"dev": "ts-node index.ts"
|
|
10
|
+
},
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"cors": "^2.8.5",
|
|
13
|
+
"express": "^4.18.2"
|
|
14
|
+
},
|
|
15
|
+
"devDependencies": {
|
|
16
|
+
"@types/cors": "^2.8.17",
|
|
17
|
+
"@types/express": "^4.17.21",
|
|
18
|
+
"@types/node": "^20.10.0",
|
|
19
|
+
"ts-node": "^10.9.0",
|
|
20
|
+
"typescript": "^5.3.0"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "commonjs",
|
|
5
|
+
"lib": ["ES2022"],
|
|
6
|
+
"outDir": "./dist",
|
|
7
|
+
"rootDir": "./",
|
|
8
|
+
"strict": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"skipLibCheck": true,
|
|
11
|
+
"forceConsistentCasingInFileNames": true,
|
|
12
|
+
"declaration": true,
|
|
13
|
+
"declarationMap": true,
|
|
14
|
+
"sourceMap": true
|
|
15
|
+
},
|
|
16
|
+
"include": ["*.ts"],
|
|
17
|
+
"exclude": ["node_modules", "dist"]
|
|
18
|
+
}
|