@qpqjs/cli 0.4.0 → 0.5.0

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 (185) hide show
  1. package/lib/commonjs/cli/runCli.js +2 -2
  2. package/lib/commonjs/cli/runCli.js.map +1 -1
  3. package/lib/commonjs/commands/checkCircular.js +2 -2
  4. package/lib/commonjs/commands/checkCircular.js.map +1 -1
  5. package/lib/commonjs/commands/goDev.js +2 -2
  6. package/lib/commonjs/commands/goDev.js.map +1 -1
  7. package/lib/commonjs/commands/goDevApi.js +6 -5
  8. package/lib/commonjs/commands/goDevApi.js.map +1 -1
  9. package/lib/commonjs/commands/goDevWeb.js +3 -3
  10. package/lib/commonjs/commands/goDevWeb.js.map +1 -1
  11. package/lib/commonjs/commands/goDocker.js +2 -2
  12. package/lib/commonjs/commands/goDocker.js.map +1 -1
  13. package/lib/commonjs/commands/hooks.js +2 -2
  14. package/lib/commonjs/commands/hooks.js.map +1 -1
  15. package/lib/commonjs/commands/migrate.js +2 -2
  16. package/lib/commonjs/commands/migrate.js.map +1 -1
  17. package/lib/commonjs/commands/prep.js +2 -2
  18. package/lib/commonjs/commands/prep.js.map +1 -1
  19. package/lib/commonjs/commands/scriptBuild.js +2 -2
  20. package/lib/commonjs/commands/scriptBuild.js.map +1 -1
  21. package/lib/commonjs/commands/scriptBuilderLayer.js +2 -2
  22. package/lib/commonjs/commands/scriptBuilderLayer.js.map +1 -1
  23. package/lib/commonjs/commands/scriptNew.js +2 -2
  24. package/lib/commonjs/commands/scriptNew.js.map +1 -1
  25. package/lib/commonjs/commands/setup.js +2 -2
  26. package/lib/commonjs/commands/setup.js.map +1 -1
  27. package/lib/commonjs/commands/synth.js +2 -2
  28. package/lib/commonjs/commands/synth.js.map +1 -1
  29. package/lib/commonjs/lib/{out.d.ts → Output.d.ts} +2 -1
  30. package/lib/commonjs/lib/Output.js +3 -0
  31. package/lib/commonjs/lib/Output.js.map +1 -0
  32. package/lib/commonjs/lib/clearResourcesPlan.js +2 -2
  33. package/lib/commonjs/lib/clearResourcesPlan.js.map +1 -1
  34. package/lib/commonjs/lib/createOutput.d.ts +2 -0
  35. package/lib/commonjs/lib/{out.js → createOutput.js} +13 -4
  36. package/lib/commonjs/lib/createOutput.js.map +1 -0
  37. package/lib/commonjs/lib/deployPrompts.js +3 -3
  38. package/lib/commonjs/lib/deployPrompts.js.map +1 -1
  39. package/lib/commonjs/lib/hooks.js +2 -2
  40. package/lib/commonjs/lib/hooks.js.map +1 -1
  41. package/lib/commonjs/lib/killChildWithEscalation.js +2 -2
  42. package/lib/commonjs/lib/killChildWithEscalation.js.map +1 -1
  43. package/lib/commonjs/lib/killStaleListeners.js +3 -3
  44. package/lib/commonjs/lib/killStaleListeners.js.map +1 -1
  45. package/lib/commonjs/lib/prompts.js +2 -2
  46. package/lib/commonjs/lib/prompts.js.map +1 -1
  47. package/lib/commonjs/lib/qpqConfigs.d.ts +1 -0
  48. package/lib/commonjs/lib/qpqConfigs.js +9 -4
  49. package/lib/commonjs/lib/qpqConfigs.js.map +1 -1
  50. package/lib/commonjs/lib/requireDriverCapability.js +2 -2
  51. package/lib/commonjs/lib/requireDriverCapability.js.map +1 -1
  52. package/lib/commonjs/lib/resolveAppSelection.js +3 -3
  53. package/lib/commonjs/lib/resolveAppSelection.js.map +1 -1
  54. package/lib/commonjs/lib/resolveDeployment.js +3 -3
  55. package/lib/commonjs/lib/resolveDeployment.js.map +1 -1
  56. package/lib/commonjs/lib/runCommand.js +2 -2
  57. package/lib/commonjs/lib/runCommand.js.map +1 -1
  58. package/lib/commonjs/lib/runTasks.js +2 -2
  59. package/lib/commonjs/lib/runTasks.js.map +1 -1
  60. package/lib/commonjs/lib/timing.js +2 -2
  61. package/lib/commonjs/lib/timing.js.map +1 -1
  62. package/lib/commonjs/lib/typeWatcher.js +3 -3
  63. package/lib/commonjs/lib/typeWatcher.js.map +1 -1
  64. package/lib/commonjs/lib/userScriptBuilderLayer.js +1 -1
  65. package/lib/commonjs/lib/userScriptBuilderLayer.js.map +1 -1
  66. package/lib/commonjs/platforms/aws/awsCredentials.js +2 -2
  67. package/lib/commonjs/platforms/aws/awsCredentials.js.map +1 -1
  68. package/lib/commonjs/platforms/aws/clearResources.js +4 -3
  69. package/lib/commonjs/platforms/aws/clearResources.js.map +1 -1
  70. package/lib/commonjs/platforms/aws/go.js +2 -2
  71. package/lib/commonjs/platforms/aws/go.js.map +1 -1
  72. package/lib/commonjs/platforms/aws/goDocker.js +2 -2
  73. package/lib/commonjs/platforms/aws/goDocker.js.map +1 -1
  74. package/lib/commonjs/platforms/aws/publish.js +2 -2
  75. package/lib/commonjs/platforms/aws/publish.js.map +1 -1
  76. package/lib/commonjs/platforms/aws/remote.js +2 -2
  77. package/lib/commonjs/platforms/aws/remote.js.map +1 -1
  78. package/lib/commonjs/platforms/aws/setup/buildGithubDeployRoleStep.js +2 -2
  79. package/lib/commonjs/platforms/aws/setup/buildGithubDeployRoleStep.js.map +1 -1
  80. package/lib/commonjs/platforms/aws/stacks.js +4 -8
  81. package/lib/commonjs/platforms/aws/stacks.js.map +1 -1
  82. package/lib/commonjs/platforms/aws/teardown.js +2 -2
  83. package/lib/commonjs/platforms/aws/teardown.js.map +1 -1
  84. package/lib/commonjs/platforms/aws/viewsSync.js +2 -2
  85. package/lib/commonjs/platforms/aws/viewsSync.js.map +1 -1
  86. package/lib/commonjs/platforms/docker/go.js +2 -2
  87. package/lib/commonjs/platforms/docker/go.js.map +1 -1
  88. package/lib/commonjs/platforms/docker/index.js +2 -2
  89. package/lib/commonjs/platforms/docker/index.js.map +1 -1
  90. package/lib/commonjs/platforms/index.js +2 -2
  91. package/lib/commonjs/platforms/index.js.map +1 -1
  92. package/lib/esm/cli/runCli.js +1 -1
  93. package/lib/esm/cli/runCli.js.map +1 -1
  94. package/lib/esm/commands/checkCircular.js +1 -1
  95. package/lib/esm/commands/checkCircular.js.map +1 -1
  96. package/lib/esm/commands/goDev.js +1 -1
  97. package/lib/esm/commands/goDev.js.map +1 -1
  98. package/lib/esm/commands/goDevApi.js +4 -4
  99. package/lib/esm/commands/goDevApi.js.map +1 -1
  100. package/lib/esm/commands/goDevWeb.js +2 -2
  101. package/lib/esm/commands/goDevWeb.js.map +1 -1
  102. package/lib/esm/commands/goDocker.js +1 -1
  103. package/lib/esm/commands/goDocker.js.map +1 -1
  104. package/lib/esm/commands/hooks.js +1 -1
  105. package/lib/esm/commands/hooks.js.map +1 -1
  106. package/lib/esm/commands/migrate.js +1 -1
  107. package/lib/esm/commands/migrate.js.map +1 -1
  108. package/lib/esm/commands/prep.js +1 -1
  109. package/lib/esm/commands/prep.js.map +1 -1
  110. package/lib/esm/commands/scriptBuild.js +1 -1
  111. package/lib/esm/commands/scriptBuild.js.map +1 -1
  112. package/lib/esm/commands/scriptBuilderLayer.js +1 -1
  113. package/lib/esm/commands/scriptBuilderLayer.js.map +1 -1
  114. package/lib/esm/commands/scriptNew.js +1 -1
  115. package/lib/esm/commands/scriptNew.js.map +1 -1
  116. package/lib/esm/commands/setup.js +1 -1
  117. package/lib/esm/commands/setup.js.map +1 -1
  118. package/lib/esm/commands/synth.js +1 -1
  119. package/lib/esm/commands/synth.js.map +1 -1
  120. package/lib/esm/lib/{out.d.ts → Output.d.ts} +2 -1
  121. package/lib/esm/lib/Output.js +2 -0
  122. package/lib/esm/lib/Output.js.map +1 -0
  123. package/lib/esm/lib/clearResourcesPlan.js +1 -1
  124. package/lib/esm/lib/clearResourcesPlan.js.map +1 -1
  125. package/lib/esm/lib/createOutput.d.ts +2 -0
  126. package/lib/esm/lib/{out.js → createOutput.js} +13 -4
  127. package/lib/esm/lib/createOutput.js.map +1 -0
  128. package/lib/esm/lib/deployPrompts.js +2 -2
  129. package/lib/esm/lib/deployPrompts.js.map +1 -1
  130. package/lib/esm/lib/hooks.js +1 -1
  131. package/lib/esm/lib/hooks.js.map +1 -1
  132. package/lib/esm/lib/killChildWithEscalation.js +1 -1
  133. package/lib/esm/lib/killChildWithEscalation.js.map +1 -1
  134. package/lib/esm/lib/killStaleListeners.js +2 -2
  135. package/lib/esm/lib/killStaleListeners.js.map +1 -1
  136. package/lib/esm/lib/prompts.js +1 -1
  137. package/lib/esm/lib/prompts.js.map +1 -1
  138. package/lib/esm/lib/qpqConfigs.d.ts +1 -0
  139. package/lib/esm/lib/qpqConfigs.js +7 -3
  140. package/lib/esm/lib/qpqConfigs.js.map +1 -1
  141. package/lib/esm/lib/requireDriverCapability.js +1 -1
  142. package/lib/esm/lib/requireDriverCapability.js.map +1 -1
  143. package/lib/esm/lib/resolveAppSelection.js +2 -2
  144. package/lib/esm/lib/resolveAppSelection.js.map +1 -1
  145. package/lib/esm/lib/resolveDeployment.js +2 -2
  146. package/lib/esm/lib/resolveDeployment.js.map +1 -1
  147. package/lib/esm/lib/runCommand.js +1 -1
  148. package/lib/esm/lib/runCommand.js.map +1 -1
  149. package/lib/esm/lib/runTasks.js +1 -1
  150. package/lib/esm/lib/runTasks.js.map +1 -1
  151. package/lib/esm/lib/timing.js +1 -1
  152. package/lib/esm/lib/timing.js.map +1 -1
  153. package/lib/esm/lib/typeWatcher.js +2 -2
  154. package/lib/esm/lib/typeWatcher.js.map +1 -1
  155. package/lib/esm/lib/userScriptBuilderLayer.js +1 -1
  156. package/lib/esm/lib/userScriptBuilderLayer.js.map +1 -1
  157. package/lib/esm/platforms/aws/awsCredentials.js +1 -1
  158. package/lib/esm/platforms/aws/awsCredentials.js.map +1 -1
  159. package/lib/esm/platforms/aws/clearResources.js +3 -2
  160. package/lib/esm/platforms/aws/clearResources.js.map +1 -1
  161. package/lib/esm/platforms/aws/go.js +1 -1
  162. package/lib/esm/platforms/aws/go.js.map +1 -1
  163. package/lib/esm/platforms/aws/goDocker.js +1 -1
  164. package/lib/esm/platforms/aws/goDocker.js.map +1 -1
  165. package/lib/esm/platforms/aws/publish.js +1 -1
  166. package/lib/esm/platforms/aws/publish.js.map +1 -1
  167. package/lib/esm/platforms/aws/remote.js +1 -1
  168. package/lib/esm/platforms/aws/remote.js.map +1 -1
  169. package/lib/esm/platforms/aws/setup/buildGithubDeployRoleStep.js +1 -1
  170. package/lib/esm/platforms/aws/setup/buildGithubDeployRoleStep.js.map +1 -1
  171. package/lib/esm/platforms/aws/stacks.js +5 -9
  172. package/lib/esm/platforms/aws/stacks.js.map +1 -1
  173. package/lib/esm/platforms/aws/teardown.js +1 -1
  174. package/lib/esm/platforms/aws/teardown.js.map +1 -1
  175. package/lib/esm/platforms/aws/viewsSync.js +1 -1
  176. package/lib/esm/platforms/aws/viewsSync.js.map +1 -1
  177. package/lib/esm/platforms/docker/go.js +1 -1
  178. package/lib/esm/platforms/docker/go.js.map +1 -1
  179. package/lib/esm/platforms/docker/index.js +1 -1
  180. package/lib/esm/platforms/docker/index.js.map +1 -1
  181. package/lib/esm/platforms/index.js +1 -1
  182. package/lib/esm/platforms/index.js.map +1 -1
  183. package/package.json +11 -11
  184. package/lib/commonjs/lib/out.js.map +0 -1
  185. package/lib/esm/lib/out.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"goDocker.js","sourceRoot":"","sources":["../../../../src/platforms/aws/goDocker.ts"],"names":[],"mappings":"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","sourcesContent":["// `qpq go:docker`, asks the same questions as `qpq go`, then builds locally\n// and deploys in parallel via docker. The two halves can run on different\n// machines, which is what lets a CI deploy run one job per service and phase:\n//\n// qpq go:docker <svc> <stack> build, then deploy\n// qpq go:docker <svc> <stack> --build-only build and save; no docker needed\n// qpq go:docker <svc> <stack> --from-build deploy the saved build; the\n// workspace need not be built\n//\n// The build half: QPQ config synth, rspack api bundles, rspack view bundles,\n// rspack federated-remote bundles, and one self-contained CDK cloud assembly\n// per service (`cdk synth --output`, which stages the api bundle as assets).\n// It ends by writing a manifest per service with everything the deploy half\n// needs that only the live config can answer (stack names, views destinations,\n// the federated store), so the deploy half never loads a service config. The\n// saved build for a service is:\n// dist/qpq/go-docker/<app>/<svc>/assembly the cloud assembly\n// dist/qpq/go-docker/<app>/<svc>/deploy.json the manifest\n// dist/apps/<app>/services/<svc>/views the views bundle\n// dist/apps/<app>/services/<svc>/service-remote-published the federated remote\n//\n// The deploy half, from the manifests:\n// wave 1 (inf): one docker container per service deploys its inf stack, all\n// concurrently. Containers run only the CDK CLI against the mounted\n// assembly, the workspace (and its npm-linked quidproquo packages) never\n// needs to exist inside the image.\n// wave 2 (api + web): once every inf stack is done, api and web stacks for\n// all services deploy concurrently (they depend only on inf, not on each\n// other).\n// views: the built bundles are synced to S3, one aws-cli container per\n// service, all concurrently.\n// publish: the built federated remotes (backends that opt in with\n// defineFederatedModuleStore(...)) are synced to S3 and their manifests\n// flipped, one aws-cli container per service, all concurrently. Follows\n// every api deploy, so a lambda never runs a previous release's stories.\n//\n// domain/bootstrap menu options deploy host-side exactly like `qpq go`:\n// a single stack gains nothing from docker.\n//\n// Requires the same env as `go` (the build half included: `cdk synth` still\n// looks up hosted zones and VPCs) plus a running docker daemon for the deploy\n// half. Knobs: GO_DOCKER_BUILD_CONCURRENCY (default: the machine's core count,\n// local builds are CPU-bound) and GO_DOCKER_DEPLOY_CONCURRENCY (default\n// unlimited, deploys just wait on CloudFormation).\nimport { QpqDeployEnvVar } from '@qpqjs/core';\nimport { qpqDeployAwsUtils } from '@qpqjs/deploy-aws';\nimport { getServiceRspackConfig, runRspack } from '@qpqjs/deploy-rspack';\n\nimport fs from 'fs';\nimport os from 'os';\nimport path from 'path';\n\nimport { synthCommand } from '../../commands/synth';\nimport { DeployPlan, StackType } from '../../lib/deployPrompts';\nimport { getRoot, getServiceDirectory, getServiceNamesWithViews } from '../../lib/discovery';\nimport { getDefaultHookJobs } from '../../lib/getDefaultHookJobs';\nimport { GoDockerMode } from '../../lib/goDockerMode';\nimport { runAppHook, runHookForAppPackages } from '../../lib/hooks';\nimport { createOutput } from '../../lib/out';\nimport { getServiceNamesWithFederation, loadServiceQpqConfig } from '../../lib/qpqConfigs';\nimport { nextPrefixColor, runCommand, runCommandBestEffort, runCommandPrefixed } from '../../lib/runCommand';\nimport { assertNoFailures, runTasks } from '../../lib/runTasks';\nimport { logTimeEnd, logTimeStart } from '../../lib/timing';\nimport { bundleViews, getViewsDistDir } from '../../lib/views';\nimport { isAwsCredentialsValid } from './awsCredentials';\nimport { getCdkAppCommand, getCdkCliVersion, getDockerDir } from './cdkApp';\nimport { getDeployEnv } from './getDeployEnv';\nimport {\n fromManifestPath,\n getGoDockerAssemblyDir,\n getGoDockerBuildDir,\n GoDockerBuildManifest,\n GoDockerRemoteEntry,\n GoDockerViewsEntry,\n readGoDockerBuildManifest,\n toManifestPath,\n writeGoDockerBuildManifest,\n} from './goDockerManifest';\nimport { buildRemote, resolvePublishTarget } from './remote';\nimport { deployAccountStack, deployBootstrapStack, deployDomainStack } from './stacks';\nimport { getViewsS3Destinations, NO_CACHE_FILES } from './viewsSync';\n\nconst out = createOutput('aws:go-docker');\n\nconst IMAGE_TAG = 'qpq-cdk-deployer';\nconst AWS_CLI_IMAGE = 'amazon/aws-cli';\n\nconst BUILD_CONCURRENCY = Number(process.env.GO_DOCKER_BUILD_CONCURRENCY) || os.availableParallelism();\nconst DEPLOY_CONCURRENCY = Number(process.env.GO_DOCKER_DEPLOY_CONCURRENCY) || Infinity;\n\n// Credentials/region reach the containers via `docker run -e NAME` (value\n// inherited from this process's env, never on the docker command line).\nconst AWS_ENV_PASSTHROUGH = [\n 'AWS_ACCESS_KEY_ID',\n 'AWS_SECRET_ACCESS_KEY',\n 'AWS_SESSION_TOKEN',\n 'AWS_REGION',\n 'AWS_DEFAULT_REGION',\n 'AWS_DEFAULT_ACCOUNT',\n];\n\ntype ServicesPlan = Extract<DeployPlan, { kind: 'services' }>;\n\ntype StackNeeds = { inf: boolean; api: boolean; web: boolean; views: boolean };\n\nconst getStackNeeds = (stacks: StackType): StackNeeds => ({\n inf: stacks === 'all' || stacks === 'inf',\n api: stacks === 'all' || stacks === 'api',\n web: stacks === 'all' || stacks === 'web',\n views: stacks === 'all' || stacks === 'views',\n});\n\n// A container left behind by an interrupted run would block reusing its name.\n// Clear it first, best-effort: a missing container (exit 1) must not fail the\n// deploy. Was a `docker rm -f … >/dev/null 2>&1 ;` prefix on the run command,\n// but that only worked under `shell: true`; as a separate call it's shell-free.\nconst removeContainer = (containerName: string): Promise<void> => runCommandBestEffort('docker', ['rm', '-f', containerName]);\n\nconst assertDockerRunning = async (): Promise<void> => {\n try {\n await runCommand('docker', ['info', '--format', 'docker daemon ok — server {{.ServerVersion}}']);\n } catch {\n throw new Error('Docker daemon is not running (start Docker Desktop and retry).');\n }\n};\n\n// Pin the image's CDK CLI to the CLI's own aws-cdk version so it can always\n// read the assembly schema the host synthesized.\nconst buildDeployerImage = async (cdkVersion: string): Promise<void> => {\n out.log(`Building deployer image [${IMAGE_TAG}] (aws-cdk ${cdkVersion})`);\n await runCommand('docker', ['build', '-t', IMAGE_TAG, '--build-arg', `CDK_VERSION=${cdkVersion}`, getDockerDir()]);\n};\n\n// Deploy one stack from a pre-synthesized assembly in a throwaway container\n// named <service>-<stackType> (e.g. mini-web) so `docker ps` reads cleanly.\n// The assembly mounts read-only and is copied container-local first, the CDK\n// CLI writes lock files next to the assembly it reads, and the copy keeps\n// parallel api/web deploys of the same service fully isolated.\nconst dockerDeployStack = async (\n color: number,\n serviceName: string,\n stackType: 'inf' | 'api' | 'web',\n stackName: string,\n assemblyDir: string,\n): Promise<void> => {\n const containerName = `${serviceName}-${stackType}`;\n await removeContainer(containerName);\n await runCommandPrefixed(\n `${stackType}:${serviceName}`,\n 'docker',\n [\n 'run',\n '--rm',\n '--name',\n containerName,\n '-v',\n `${assemblyDir}:/assembly:ro`,\n ...AWS_ENV_PASSTHROUGH.flatMap((name) => ['-e', name]),\n IMAGE_TAG,\n 'bash',\n '-c',\n `cp -r /assembly /work/assembly && cdk deploy ${stackName} --app /work/assembly --require-approval never --progress events`,\n ],\n { color },\n );\n};\n\n// Sync one service's pre-built views to S3 in a throwaway aws-cli container\n// named <service>-views. The official image's entrypoint is `aws`. Multiple\n// destinations (shell → website root + views prefix) run sequentially within\n// the service, reusing the container name. Mirrors the host-side syncViewsToS3\n// cache policy: hashed assets immutable, the fixed-name entry points re-uploaded\n// with no-cache every deploy (see NO_CACHE_FILES).\nconst dockerSyncViews = async (color: number, serviceName: string, views: GoDockerViewsEntry): Promise<void> => {\n const containerName = `${serviceName}-views`;\n const distDir = fromManifestPath(views.dir);\n\n const runAwsCli = async (awsArgs: string[]): Promise<void> => {\n await removeContainer(containerName);\n await runCommandPrefixed(\n `views:${serviceName}`,\n 'docker',\n [\n 'run',\n '--rm',\n '--name',\n containerName,\n '-v',\n `${distDir}:/views:ro`,\n ...AWS_ENV_PASSTHROUGH.flatMap((name) => ['-e', name]),\n AWS_CLI_IMAGE,\n ...awsArgs,\n ],\n { color },\n );\n };\n\n for (const destination of views.destinations) {\n await runAwsCli([\n 's3',\n 'sync',\n '/views',\n destination,\n '--cache-control',\n 'public,max-age=31536000,immutable',\n ...NO_CACHE_FILES.flatMap((file) => ['--exclude', file]),\n ]);\n\n for (const file of NO_CACHE_FILES) {\n if (!fs.existsSync(path.join(distDir, file))) {\n continue;\n }\n\n await runAwsCli(['s3', 'cp', `/views/${file}`, `${destination}/${file}`, '--cache-control', 'no-cache']);\n }\n }\n};\n\n// Publish one service's already-built federated remote to S3 in a throwaway\n// aws-cli container named <service>-publish. The version dir (everything the\n// manifest references) syncs first, then the manifest.json is copied last:\n// same ordering guarantee as the host-side publish, so a reading lambda never\n// sees a manifest whose files aren't all present yet.\nconst dockerPublishRemote = async (color: number, serviceName: string, remote: GoDockerRemoteEntry): Promise<void> => {\n const { manifestHash, bucketName, servicePrefix } = remote;\n const publishPath = fromManifestPath(remote.dir);\n const containerName = `${serviceName}-publish`;\n\n // /publish is the service-remote-published dir; the hashed version subdir and\n // manifest.json both live directly under it.\n const s3Operations: string[][] = [\n ['s3', 'sync', `/publish/${manifestHash}`, `s3://${bucketName}/${servicePrefix}/${manifestHash}`],\n ['s3', 'cp', '/publish/manifest.json', `s3://${bucketName}/${servicePrefix}/manifest.json`],\n ];\n\n for (const s3Operation of s3Operations) {\n await removeContainer(containerName);\n await runCommandPrefixed(\n `publish:${serviceName}`,\n 'docker',\n [\n 'run',\n '--rm',\n '--name',\n containerName,\n '-v',\n `${publishPath}:/publish:ro`,\n ...AWS_ENV_PASSTHROUGH.flatMap((name) => ['-e', name]),\n AWS_CLI_IMAGE,\n ...s3Operation,\n ],\n { color },\n );\n }\n};\n\nconst resolveRemoteEntry = (appName: string, service: string): GoDockerRemoteEntry => {\n const { publishPath, manifestHash, bucketName, servicePrefix } = resolvePublishTarget(appName, service);\n return { dir: toManifestPath(publishPath), manifestHash, bucketName, servicePrefix };\n};\n\n// Everything the deploy half needs that only the live config can answer,\n// resolved here while the workspace is built and the config loads.\nconst resolveBuildManifest = (\n appName: string,\n deploymentName: string,\n service: string,\n stacks: StackType,\n hasViews: boolean,\n hasRemote: boolean,\n cdkVersion: string,\n): GoDockerBuildManifest => {\n const qpqConfig = loadServiceQpqConfig(appName, service);\n\n return {\n cdkVersion,\n deploymentName,\n builtFor: stacks,\n stacks:\n stacks === 'views'\n ? null\n : {\n inf: qpqDeployAwsUtils.getInfStackName(qpqConfig),\n api: qpqDeployAwsUtils.getApiStackName(qpqConfig),\n web: qpqDeployAwsUtils.getWebStackName(qpqConfig),\n },\n views: hasViews ? { dir: toManifestPath(getViewsDistDir(appName, service)), destinations: getViewsS3Destinations(appName, service) } : null,\n remote: hasRemote ? resolveRemoteEntry(appName, service) : null,\n };\n};\n\n// The directories a CI job uploads to carry one service's saved build to the\n// deploy job, root-relative.\nconst getSavedBuildDirs = (appName: string, service: string, manifest: GoDockerBuildManifest): string[] => [\n toManifestPath(getGoDockerBuildDir(appName, service)),\n ...(manifest.views ? [manifest.views.dir] : []),\n ...(manifest.remote ? [manifest.remote.dir] : []),\n];\n\nconst buildGoDockerOutput = async (appName: string, deploymentName: string, plan: ServicesPlan): Promise<void> => {\n const { services, stacks } = plan;\n const need = getStackNeeds(stacks);\n const needCdkSynth = stacks !== 'views';\n\n const viewServices = need.views ? services.filter((service) => getServiceNamesWithViews(appName).includes(service)) : [];\n\n out.log('\\n=== Build ===\\n');\n\n // A stale assembly or manifest from an earlier build must not outlive a\n // change of stack selection, so every selected service starts empty.\n for (const service of services) {\n fs.rmSync(getGoDockerBuildDir(appName, service), { recursive: true, force: true });\n }\n\n await runAppHook(appName, 'predeploy');\n\n // Workspace packages resolve through their built dist/ (package.json main),\n // so bundles would ship stale code unless every lib is tsc'd first. Other\n // apps' packages are skipped: nothing this app deploys can import them\n // unless it declares them, and declared ones are built.\n out.log('Building workspace packages');\n assertNoFailures('Workspace build', await runHookForAppPackages('build', appName, getDefaultHookJobs()));\n\n // Synth the selected services' QPQ configs (and shell's, which the views\n // destinations resolve from) so a config that fails to load fails here,\n // before any bundling. In-process: it's just config loads + JSON writes.\n const qpqSynthServices = [...new Set([...services, ...(need.views ? ['shell'] : [])])];\n for (const service of qpqSynthServices) {\n await synthCommand([service, '--app', appName]);\n }\n\n // Federated remotes are the backend story code, so they are rebuilt (and\n // later republished) whenever the api stack is. Skips services without\n // defineFederatedModuleStore(...). Detected here (after the workspace build)\n // because it loads each service's config.\n const federatedServices = need.api ? getServiceNamesWithFederation(appName, services) : [];\n\n if (needCdkSynth) {\n assertNoFailures(\n 'API bundling',\n await runTasks(\n services.map((service) => ({\n label: `bundle-api:${service}`,\n run: async () => {\n out.log(`Bundling api: [${service}]`);\n const qpqConfig = loadServiceQpqConfig(appName, service);\n await runRspack(getServiceRspackConfig(qpqConfig, path.join(getServiceDirectory(appName, service), 'service')));\n },\n })),\n BUILD_CONCURRENCY,\n ),\n );\n }\n\n assertNoFailures(\n 'Views bundling',\n await runTasks(\n viewServices.map((service) => ({\n label: `bundle-views:${service}`,\n run: async () => {\n out.log(`Bundling views: [${service}]`);\n await bundleViews(appName, service);\n },\n })),\n BUILD_CONCURRENCY,\n ),\n );\n\n // Build the federated remotes now (rspack needs the workspace), so the\n // publish wave only has to sync the already-built output, mirroring how\n // views are bundled here and synced later.\n assertNoFailures(\n 'Remote bundling',\n await runTasks(\n federatedServices.map((service) => ({\n label: `bundle-remote:${service}`,\n run: async () => {\n out.log(`Bundling federated remote: [${service}]`);\n await buildRemote(appName, service);\n },\n })),\n BUILD_CONCURRENCY,\n ),\n );\n\n if (needCdkSynth) {\n // One self-contained cloud assembly per service (all its stacks + staged\n // assets), separate --output dirs so synths can run in parallel and\n // containers never share mutable state.\n assertNoFailures(\n 'CDK synth',\n await runTasks(\n services.map((service) => ({\n label: `cdk-synth:${service}`,\n run: () =>\n runCommandPrefixed(\n `cdk-synth:${service}`,\n 'npx',\n ['cdk', 'synth', '--quiet', '--app', getCdkAppCommand(), '--output', getGoDockerAssemblyDir(appName, service)],\n {\n cwd: getRoot(),\n env: getDeployEnv(appName, service),\n color: nextPrefixColor(),\n },\n ),\n })),\n BUILD_CONCURRENCY,\n ),\n );\n }\n\n // Manifests are written last, so one only ever exists beside a complete build.\n const cdkVersion = getCdkCliVersion();\n for (const service of services) {\n const manifest = resolveBuildManifest(\n appName,\n deploymentName,\n service,\n stacks,\n viewServices.includes(service),\n federatedServices.includes(service),\n cdkVersion,\n );\n writeGoDockerBuildManifest(appName, service, manifest);\n\n out.log(`Saved build for [${service}]:`);\n for (const dir of getSavedBuildDirs(appName, service, manifest)) {\n out.log(` ${dir}`);\n }\n }\n};\n\n// A deploy phase runs from a saved build only when that build was made for it:\n// `all` covers every phase, any other selection only its own. A build made for\n// `inf` has an assembly the api stack could deploy from, but no remote to\n// publish after it, which is exactly the stale-stories deploy the publish\n// ordering exists to prevent.\nconst readCheckedManifest = (\n appName: string,\n deploymentName: string,\n service: string,\n stacks: StackType,\n cdkVersion: string,\n): GoDockerBuildManifest => {\n const manifest = readGoDockerBuildManifest(appName, service);\n const rebuild = `rebuild it with \\`qpq go:docker ${service} ${stacks} --build-only --app ${appName} --deployment ${deploymentName}\\``;\n\n if (manifest.cdkVersion !== cdkVersion) {\n throw new Error(`saved build for [${service}] was synthesized with aws-cdk ${manifest.cdkVersion}, this qpq has ${cdkVersion}; ${rebuild}`);\n }\n if (manifest.deploymentName !== deploymentName) {\n throw new Error(`saved build for [${service}] is for deployment '${manifest.deploymentName}', not '${deploymentName}'; ${rebuild}`);\n }\n if (manifest.builtFor !== 'all' && manifest.builtFor !== stacks) {\n throw new Error(`saved build for [${service}] was built for '${manifest.builtFor}' stacks and cannot deploy '${stacks}'; ${rebuild}`);\n }\n\n return manifest;\n};\n\nconst getStackName = (manifest: GoDockerBuildManifest, service: string, stackType: 'inf' | 'api' | 'web'): string => {\n if (!manifest.stacks) {\n throw new Error(`saved build for [${service}] has no cloud assembly (it was built for views only)`);\n }\n return manifest.stacks[stackType];\n};\n\nconst deployGoDockerOutput = async (appName: string, deploymentName: string, plan: ServicesPlan): Promise<void> => {\n const { services, stacks } = plan;\n const need = getStackNeeds(stacks);\n const needCdkDeploys = stacks !== 'views';\n\n // Every manifest is read and checked up front, so one missing or mismatched\n // build fails the run before any container starts.\n const cdkVersion = getCdkCliVersion();\n const manifests = new Map(services.map((service) => [service, readCheckedManifest(appName, deploymentName, service, stacks, cdkVersion)]));\n const manifestFor = (service: string): GoDockerBuildManifest => manifests.get(service)!;\n\n const viewServices = need.views ? services.filter((service) => manifestFor(service).views !== null) : [];\n const federatedServices = need.api ? services.filter((service) => manifestFor(service).remote !== null) : [];\n\n // Federated publish needs the api stack (need.api ⇒ needCdkDeploys), so any\n // docker preflight it requires is already covered by these two checks.\n if (needCdkDeploys || viewServices.length > 0) {\n await assertDockerRunning();\n }\n if (needCdkDeploys) {\n await buildDeployerImage(cdkVersion);\n }\n\n // The aws-cli image backs both the views sync and the federated publish\n // waves. Pull once now so those waves don't race N containers into pulling\n // the same image.\n if (viewServices.length > 0 || federatedServices.length > 0) {\n await runCommand('docker', ['pull', AWS_CLI_IMAGE]);\n }\n\n // ---- Wave 1: inf stacks, one container per service, all concurrent ----\n if (need.inf) {\n out.log('\\n=== Deploy inf stacks (docker) ===\\n');\n logTimeStart('infWave');\n assertNoFailures(\n 'Inf deploy',\n await runTasks(\n services.map((service) => ({\n label: `inf:${service}`,\n run: () =>\n dockerDeployStack(\n nextPrefixColor(),\n service,\n 'inf',\n getStackName(manifestFor(service), service, 'inf'),\n getGoDockerAssemblyDir(appName, service),\n ),\n })),\n DEPLOY_CONCURRENCY,\n ),\n );\n logTimeEnd('infWave');\n }\n\n // ---- Wave 2: api + web stacks, all concurrent ----\n if (need.api || need.web) {\n out.log('\\n=== Deploy api + web stacks (docker) ===\\n');\n logTimeStart('apiWebWave');\n assertNoFailures(\n 'Api/Web deploy',\n await runTasks(\n (['api', 'web'] as const)\n .filter((stackType) => (stackType === 'api' ? need.api : need.web))\n .flatMap((stackType) =>\n services.map((service) => ({\n label: `${stackType}:${service}`,\n run: () =>\n dockerDeployStack(\n nextPrefixColor(),\n service,\n stackType,\n getStackName(manifestFor(service), service, stackType),\n getGoDockerAssemblyDir(appName, service),\n ),\n })),\n ),\n DEPLOY_CONCURRENCY,\n ),\n );\n logTimeEnd('apiWebWave');\n }\n\n // ---- Views: sync the pre-built bundles to S3, all concurrent ----\n if (viewServices.length > 0) {\n out.log('\\n=== Sync views to S3 (docker) ===\\n');\n logTimeStart('viewsWave');\n assertNoFailures(\n 'Views sync',\n await runTasks(\n viewServices.map((service) => ({\n label: `views:${service}`,\n run: () => dockerSyncViews(nextPrefixColor(), service, manifestFor(service).views!),\n })),\n DEPLOY_CONCURRENCY,\n ),\n );\n logTimeEnd('viewsWave');\n }\n\n // ---- Publish: the pre-built federated remotes to S3, all concurrent ----\n if (federatedServices.length > 0) {\n out.log('\\n=== Publish federated remotes to S3 (docker) ===\\n');\n logTimeStart('publishWave');\n assertNoFailures(\n 'Federated publish',\n await runTasks(\n federatedServices.map((service) => ({\n label: `publish:${service}`,\n run: () => dockerPublishRemote(nextPrefixColor(), service, manifestFor(service).remote!),\n })),\n DEPLOY_CONCURRENCY,\n ),\n );\n logTimeEnd('publishWave');\n }\n};\n\nexport const awsGoDocker = async (appName: string, plan: DeployPlan, mode: GoDockerMode): Promise<void> => {\n if (plan.kind === 'cancelled') {\n return;\n }\n\n if ((await isAwsCredentialsValid()) === false) {\n out.log('Credentials are expired or invalid.');\n return;\n }\n\n logTimeStart('totalTime');\n\n if (plan.kind === 'account') {\n await deployAccountStack(plan.appName);\n logTimeEnd('totalTime');\n return;\n }\n\n if (plan.kind === 'bootstrap') {\n if (plan.includeDomain) {\n await deployDomainStack(plan.appName);\n }\n await deployBootstrapStack(plan.appName);\n logTimeEnd('totalTime');\n return;\n }\n\n // resolveDeployment primed the selection before this driver ran. The manifest\n // records it so a build for one deployment can never deploy to another.\n const deploymentName = process.env[QpqDeployEnvVar.deployName];\n if (!deploymentName) {\n throw new Error(`no deployment selected (${QpqDeployEnvVar.deployName} is unset)`);\n }\n\n out.log(`\\n\\nRunning dockerized deploy (${mode})\\n\\n`);\n out.log('Executing for services');\n out.log(plan.services.join(', '));\n\n if (mode !== 'from-build') {\n await buildGoDockerOutput(appName, deploymentName, plan);\n }\n if (mode !== 'build-only') {\n await deployGoDockerOutput(appName, deploymentName, plan);\n }\n\n logTimeEnd('totalTime');\n};\n"]}
1
+ {"version":3,"file":"goDocker.js","sourceRoot":"","sources":["../../../../src/platforms/aws/goDocker.ts"],"names":[],"mappings":"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","sourcesContent":["// `qpq go:docker`, asks the same questions as `qpq go`, then builds locally\n// and deploys in parallel via docker. The two halves can run on different\n// machines, which is what lets a CI deploy run one job per service and phase:\n//\n// qpq go:docker <svc> <stack> build, then deploy\n// qpq go:docker <svc> <stack> --build-only build and save; no docker needed\n// qpq go:docker <svc> <stack> --from-build deploy the saved build; the\n// workspace need not be built\n//\n// The build half: QPQ config synth, rspack api bundles, rspack view bundles,\n// rspack federated-remote bundles, and one self-contained CDK cloud assembly\n// per service (`cdk synth --output`, which stages the api bundle as assets).\n// It ends by writing a manifest per service with everything the deploy half\n// needs that only the live config can answer (stack names, views destinations,\n// the federated store), so the deploy half never loads a service config. The\n// saved build for a service is:\n// dist/qpq/go-docker/<app>/<svc>/assembly the cloud assembly\n// dist/qpq/go-docker/<app>/<svc>/deploy.json the manifest\n// dist/apps/<app>/services/<svc>/views the views bundle\n// dist/apps/<app>/services/<svc>/service-remote-published the federated remote\n//\n// The deploy half, from the manifests:\n// wave 1 (inf): one docker container per service deploys its inf stack, all\n// concurrently. Containers run only the CDK CLI against the mounted\n// assembly, the workspace (and its npm-linked quidproquo packages) never\n// needs to exist inside the image.\n// wave 2 (api + web): once every inf stack is done, api and web stacks for\n// all services deploy concurrently (they depend only on inf, not on each\n// other).\n// views: the built bundles are synced to S3, one aws-cli container per\n// service, all concurrently.\n// publish: the built federated remotes (backends that opt in with\n// defineFederatedModuleStore(...)) are synced to S3 and their manifests\n// flipped, one aws-cli container per service, all concurrently. Follows\n// every api deploy, so a lambda never runs a previous release's stories.\n//\n// domain/bootstrap menu options deploy host-side exactly like `qpq go`:\n// a single stack gains nothing from docker.\n//\n// Requires the same env as `go` (the build half included: `cdk synth` still\n// looks up hosted zones and VPCs) plus a running docker daemon for the deploy\n// half. Knobs: GO_DOCKER_BUILD_CONCURRENCY (default: the machine's core count,\n// local builds are CPU-bound) and GO_DOCKER_DEPLOY_CONCURRENCY (default\n// unlimited, deploys just wait on CloudFormation).\nimport { QpqDeployEnvVar } from '@qpqjs/core';\nimport { qpqDeployAwsUtils } from '@qpqjs/deploy-aws';\nimport { getServiceRspackConfig, runRspack } from '@qpqjs/deploy-rspack';\n\nimport fs from 'fs';\nimport os from 'os';\nimport path from 'path';\n\nimport { synthCommand } from '../../commands/synth';\nimport { createOutput } from '../../lib/createOutput';\nimport { DeployPlan, StackType } from '../../lib/deployPrompts';\nimport { getRoot, getServiceDirectory, getServiceNamesWithViews } from '../../lib/discovery';\nimport { getDefaultHookJobs } from '../../lib/getDefaultHookJobs';\nimport { GoDockerMode } from '../../lib/goDockerMode';\nimport { runAppHook, runHookForAppPackages } from '../../lib/hooks';\nimport { getServiceNamesWithFederation, loadServiceQpqConfig } from '../../lib/qpqConfigs';\nimport { nextPrefixColor, runCommand, runCommandBestEffort, runCommandPrefixed } from '../../lib/runCommand';\nimport { assertNoFailures, runTasks } from '../../lib/runTasks';\nimport { logTimeEnd, logTimeStart } from '../../lib/timing';\nimport { bundleViews, getViewsDistDir } from '../../lib/views';\nimport { isAwsCredentialsValid } from './awsCredentials';\nimport { getCdkAppCommand, getCdkCliVersion, getDockerDir } from './cdkApp';\nimport { getDeployEnv } from './getDeployEnv';\nimport {\n fromManifestPath,\n getGoDockerAssemblyDir,\n getGoDockerBuildDir,\n GoDockerBuildManifest,\n GoDockerRemoteEntry,\n GoDockerViewsEntry,\n readGoDockerBuildManifest,\n toManifestPath,\n writeGoDockerBuildManifest,\n} from './goDockerManifest';\nimport { buildRemote, resolvePublishTarget } from './remote';\nimport { deployAccountStack, deployBootstrapStack, deployDomainStack } from './stacks';\nimport { getViewsS3Destinations, NO_CACHE_FILES } from './viewsSync';\n\nconst out = createOutput('aws:go-docker');\n\nconst IMAGE_TAG = 'qpq-cdk-deployer';\nconst AWS_CLI_IMAGE = 'amazon/aws-cli';\n\nconst BUILD_CONCURRENCY = Number(process.env.GO_DOCKER_BUILD_CONCURRENCY) || os.availableParallelism();\nconst DEPLOY_CONCURRENCY = Number(process.env.GO_DOCKER_DEPLOY_CONCURRENCY) || Infinity;\n\n// Credentials/region reach the containers via `docker run -e NAME` (value\n// inherited from this process's env, never on the docker command line).\nconst AWS_ENV_PASSTHROUGH = [\n 'AWS_ACCESS_KEY_ID',\n 'AWS_SECRET_ACCESS_KEY',\n 'AWS_SESSION_TOKEN',\n 'AWS_REGION',\n 'AWS_DEFAULT_REGION',\n 'AWS_DEFAULT_ACCOUNT',\n];\n\ntype ServicesPlan = Extract<DeployPlan, { kind: 'services' }>;\n\ntype StackNeeds = { inf: boolean; api: boolean; web: boolean; views: boolean };\n\nconst getStackNeeds = (stacks: StackType): StackNeeds => ({\n inf: stacks === 'all' || stacks === 'inf',\n api: stacks === 'all' || stacks === 'api',\n web: stacks === 'all' || stacks === 'web',\n views: stacks === 'all' || stacks === 'views',\n});\n\n// A container left behind by an interrupted run would block reusing its name.\n// Clear it first, best-effort: a missing container (exit 1) must not fail the\n// deploy. Was a `docker rm -f … >/dev/null 2>&1 ;` prefix on the run command,\n// but that only worked under `shell: true`; as a separate call it's shell-free.\nconst removeContainer = (containerName: string): Promise<void> => runCommandBestEffort('docker', ['rm', '-f', containerName]);\n\nconst assertDockerRunning = async (): Promise<void> => {\n try {\n await runCommand('docker', ['info', '--format', 'docker daemon ok — server {{.ServerVersion}}']);\n } catch {\n throw new Error('Docker daemon is not running (start Docker Desktop and retry).');\n }\n};\n\n// Pin the image's CDK CLI to the CLI's own aws-cdk version so it can always\n// read the assembly schema the host synthesized.\nconst buildDeployerImage = async (cdkVersion: string): Promise<void> => {\n out.log(`Building deployer image [${IMAGE_TAG}] (aws-cdk ${cdkVersion})`);\n await runCommand('docker', ['build', '-t', IMAGE_TAG, '--build-arg', `CDK_VERSION=${cdkVersion}`, getDockerDir()]);\n};\n\n// Deploy one stack from a pre-synthesized assembly in a throwaway container\n// named <service>-<stackType> (e.g. mini-web) so `docker ps` reads cleanly.\n// The assembly mounts read-only and is copied container-local first, the CDK\n// CLI writes lock files next to the assembly it reads, and the copy keeps\n// parallel api/web deploys of the same service fully isolated.\nconst dockerDeployStack = async (\n color: number,\n serviceName: string,\n stackType: 'inf' | 'api' | 'web',\n stackName: string,\n assemblyDir: string,\n): Promise<void> => {\n const containerName = `${serviceName}-${stackType}`;\n await removeContainer(containerName);\n await runCommandPrefixed(\n `${stackType}:${serviceName}`,\n 'docker',\n [\n 'run',\n '--rm',\n '--name',\n containerName,\n '-v',\n `${assemblyDir}:/assembly:ro`,\n ...AWS_ENV_PASSTHROUGH.flatMap((name) => ['-e', name]),\n IMAGE_TAG,\n 'bash',\n '-c',\n `cp -r /assembly /work/assembly && cdk deploy ${stackName} --app /work/assembly --require-approval never --progress events`,\n ],\n { color },\n );\n};\n\n// Sync one service's pre-built views to S3 in a throwaway aws-cli container\n// named <service>-views. The official image's entrypoint is `aws`. Multiple\n// destinations (shell → website root + views prefix) run sequentially within\n// the service, reusing the container name. Mirrors the host-side syncViewsToS3\n// cache policy: hashed assets immutable, the fixed-name entry points re-uploaded\n// with no-cache every deploy (see NO_CACHE_FILES).\nconst dockerSyncViews = async (color: number, serviceName: string, views: GoDockerViewsEntry): Promise<void> => {\n const containerName = `${serviceName}-views`;\n const distDir = fromManifestPath(views.dir);\n\n const runAwsCli = async (awsArgs: string[]): Promise<void> => {\n await removeContainer(containerName);\n await runCommandPrefixed(\n `views:${serviceName}`,\n 'docker',\n [\n 'run',\n '--rm',\n '--name',\n containerName,\n '-v',\n `${distDir}:/views:ro`,\n ...AWS_ENV_PASSTHROUGH.flatMap((name) => ['-e', name]),\n AWS_CLI_IMAGE,\n ...awsArgs,\n ],\n { color },\n );\n };\n\n for (const destination of views.destinations) {\n await runAwsCli([\n 's3',\n 'sync',\n '/views',\n destination,\n '--cache-control',\n 'public,max-age=31536000,immutable',\n ...NO_CACHE_FILES.flatMap((file) => ['--exclude', file]),\n ]);\n\n for (const file of NO_CACHE_FILES) {\n if (!fs.existsSync(path.join(distDir, file))) {\n continue;\n }\n\n await runAwsCli(['s3', 'cp', `/views/${file}`, `${destination}/${file}`, '--cache-control', 'no-cache']);\n }\n }\n};\n\n// Publish one service's already-built federated remote to S3 in a throwaway\n// aws-cli container named <service>-publish. The version dir (everything the\n// manifest references) syncs first, then the manifest.json is copied last:\n// same ordering guarantee as the host-side publish, so a reading lambda never\n// sees a manifest whose files aren't all present yet.\nconst dockerPublishRemote = async (color: number, serviceName: string, remote: GoDockerRemoteEntry): Promise<void> => {\n const { manifestHash, bucketName, servicePrefix } = remote;\n const publishPath = fromManifestPath(remote.dir);\n const containerName = `${serviceName}-publish`;\n\n // /publish is the service-remote-published dir; the hashed version subdir and\n // manifest.json both live directly under it.\n const s3Operations: string[][] = [\n ['s3', 'sync', `/publish/${manifestHash}`, `s3://${bucketName}/${servicePrefix}/${manifestHash}`],\n ['s3', 'cp', '/publish/manifest.json', `s3://${bucketName}/${servicePrefix}/manifest.json`],\n ];\n\n for (const s3Operation of s3Operations) {\n await removeContainer(containerName);\n await runCommandPrefixed(\n `publish:${serviceName}`,\n 'docker',\n [\n 'run',\n '--rm',\n '--name',\n containerName,\n '-v',\n `${publishPath}:/publish:ro`,\n ...AWS_ENV_PASSTHROUGH.flatMap((name) => ['-e', name]),\n AWS_CLI_IMAGE,\n ...s3Operation,\n ],\n { color },\n );\n }\n};\n\nconst resolveRemoteEntry = (appName: string, service: string): GoDockerRemoteEntry => {\n const { publishPath, manifestHash, bucketName, servicePrefix } = resolvePublishTarget(appName, service);\n return { dir: toManifestPath(publishPath), manifestHash, bucketName, servicePrefix };\n};\n\n// Everything the deploy half needs that only the live config can answer,\n// resolved here while the workspace is built and the config loads.\nconst resolveBuildManifest = (\n appName: string,\n deploymentName: string,\n service: string,\n stacks: StackType,\n hasViews: boolean,\n hasRemote: boolean,\n cdkVersion: string,\n): GoDockerBuildManifest => {\n const qpqConfig = loadServiceQpqConfig(appName, service);\n\n return {\n cdkVersion,\n deploymentName,\n builtFor: stacks,\n stacks:\n stacks === 'views'\n ? null\n : {\n inf: qpqDeployAwsUtils.getInfStackName(qpqConfig),\n api: qpqDeployAwsUtils.getApiStackName(qpqConfig),\n web: qpqDeployAwsUtils.getWebStackName(qpqConfig),\n },\n views: hasViews ? { dir: toManifestPath(getViewsDistDir(appName, service)), destinations: getViewsS3Destinations(appName, service) } : null,\n remote: hasRemote ? resolveRemoteEntry(appName, service) : null,\n };\n};\n\n// The directories a CI job uploads to carry one service's saved build to the\n// deploy job, root-relative.\nconst getSavedBuildDirs = (appName: string, service: string, manifest: GoDockerBuildManifest): string[] => [\n toManifestPath(getGoDockerBuildDir(appName, service)),\n ...(manifest.views ? [manifest.views.dir] : []),\n ...(manifest.remote ? [manifest.remote.dir] : []),\n];\n\nconst buildGoDockerOutput = async (appName: string, deploymentName: string, plan: ServicesPlan): Promise<void> => {\n const { services, stacks } = plan;\n const need = getStackNeeds(stacks);\n const needCdkSynth = stacks !== 'views';\n\n const viewServices = need.views ? services.filter((service) => getServiceNamesWithViews(appName).includes(service)) : [];\n\n out.log('\\n=== Build ===\\n');\n\n // A stale assembly or manifest from an earlier build must not outlive a\n // change of stack selection, so every selected service starts empty.\n for (const service of services) {\n fs.rmSync(getGoDockerBuildDir(appName, service), { recursive: true, force: true });\n }\n\n await runAppHook(appName, 'predeploy');\n\n // Workspace packages resolve through their built dist/ (package.json main),\n // so bundles would ship stale code unless every lib is tsc'd first. Other\n // apps' packages are skipped: nothing this app deploys can import them\n // unless it declares them, and declared ones are built.\n out.log('Building workspace packages');\n assertNoFailures('Workspace build', await runHookForAppPackages('build', appName, getDefaultHookJobs()));\n\n // Synth the selected services' QPQ configs (and shell's, which the views\n // destinations resolve from) so a config that fails to load fails here,\n // before any bundling. In-process: it's just config loads + JSON writes.\n const qpqSynthServices = [...new Set([...services, ...(need.views ? ['shell'] : [])])];\n for (const service of qpqSynthServices) {\n await synthCommand([service, '--app', appName]);\n }\n\n // Federated remotes are the backend story code, so they are rebuilt (and\n // later republished) whenever the api stack is. Skips services without\n // defineFederatedModuleStore(...). Detected here (after the workspace build)\n // because it loads each service's config.\n const federatedServices = need.api ? getServiceNamesWithFederation(appName, services) : [];\n\n if (needCdkSynth) {\n assertNoFailures(\n 'API bundling',\n await runTasks(\n services.map((service) => ({\n label: `bundle-api:${service}`,\n run: async () => {\n out.log(`Bundling api: [${service}]`);\n const qpqConfig = loadServiceQpqConfig(appName, service);\n await runRspack(getServiceRspackConfig(qpqConfig, path.join(getServiceDirectory(appName, service), 'service')));\n },\n })),\n BUILD_CONCURRENCY,\n ),\n );\n }\n\n assertNoFailures(\n 'Views bundling',\n await runTasks(\n viewServices.map((service) => ({\n label: `bundle-views:${service}`,\n run: async () => {\n out.log(`Bundling views: [${service}]`);\n await bundleViews(appName, service);\n },\n })),\n BUILD_CONCURRENCY,\n ),\n );\n\n // Build the federated remotes now (rspack needs the workspace), so the\n // publish wave only has to sync the already-built output, mirroring how\n // views are bundled here and synced later.\n assertNoFailures(\n 'Remote bundling',\n await runTasks(\n federatedServices.map((service) => ({\n label: `bundle-remote:${service}`,\n run: async () => {\n out.log(`Bundling federated remote: [${service}]`);\n await buildRemote(appName, service);\n },\n })),\n BUILD_CONCURRENCY,\n ),\n );\n\n if (needCdkSynth) {\n // One self-contained cloud assembly per service (all its stacks + staged\n // assets), separate --output dirs so synths can run in parallel and\n // containers never share mutable state.\n assertNoFailures(\n 'CDK synth',\n await runTasks(\n services.map((service) => ({\n label: `cdk-synth:${service}`,\n run: () =>\n runCommandPrefixed(\n `cdk-synth:${service}`,\n 'npx',\n ['cdk', 'synth', '--quiet', '--app', getCdkAppCommand(), '--output', getGoDockerAssemblyDir(appName, service)],\n {\n cwd: getRoot(),\n env: getDeployEnv(appName, service),\n color: nextPrefixColor(),\n },\n ),\n })),\n BUILD_CONCURRENCY,\n ),\n );\n }\n\n // Manifests are written last, so one only ever exists beside a complete build.\n const cdkVersion = getCdkCliVersion();\n for (const service of services) {\n const manifest = resolveBuildManifest(\n appName,\n deploymentName,\n service,\n stacks,\n viewServices.includes(service),\n federatedServices.includes(service),\n cdkVersion,\n );\n writeGoDockerBuildManifest(appName, service, manifest);\n\n out.log(`Saved build for [${service}]:`);\n for (const dir of getSavedBuildDirs(appName, service, manifest)) {\n out.log(` ${dir}`);\n }\n }\n};\n\n// A deploy phase runs from a saved build only when that build was made for it:\n// `all` covers every phase, any other selection only its own. A build made for\n// `inf` has an assembly the api stack could deploy from, but no remote to\n// publish after it, which is exactly the stale-stories deploy the publish\n// ordering exists to prevent.\nconst readCheckedManifest = (\n appName: string,\n deploymentName: string,\n service: string,\n stacks: StackType,\n cdkVersion: string,\n): GoDockerBuildManifest => {\n const manifest = readGoDockerBuildManifest(appName, service);\n const rebuild = `rebuild it with \\`qpq go:docker ${service} ${stacks} --build-only --app ${appName} --deployment ${deploymentName}\\``;\n\n if (manifest.cdkVersion !== cdkVersion) {\n throw new Error(`saved build for [${service}] was synthesized with aws-cdk ${manifest.cdkVersion}, this qpq has ${cdkVersion}; ${rebuild}`);\n }\n if (manifest.deploymentName !== deploymentName) {\n throw new Error(`saved build for [${service}] is for deployment '${manifest.deploymentName}', not '${deploymentName}'; ${rebuild}`);\n }\n if (manifest.builtFor !== 'all' && manifest.builtFor !== stacks) {\n throw new Error(`saved build for [${service}] was built for '${manifest.builtFor}' stacks and cannot deploy '${stacks}'; ${rebuild}`);\n }\n\n return manifest;\n};\n\nconst getStackName = (manifest: GoDockerBuildManifest, service: string, stackType: 'inf' | 'api' | 'web'): string => {\n if (!manifest.stacks) {\n throw new Error(`saved build for [${service}] has no cloud assembly (it was built for views only)`);\n }\n return manifest.stacks[stackType];\n};\n\nconst deployGoDockerOutput = async (appName: string, deploymentName: string, plan: ServicesPlan): Promise<void> => {\n const { services, stacks } = plan;\n const need = getStackNeeds(stacks);\n const needCdkDeploys = stacks !== 'views';\n\n // Every manifest is read and checked up front, so one missing or mismatched\n // build fails the run before any container starts.\n const cdkVersion = getCdkCliVersion();\n const manifests = new Map(services.map((service) => [service, readCheckedManifest(appName, deploymentName, service, stacks, cdkVersion)]));\n const manifestFor = (service: string): GoDockerBuildManifest => manifests.get(service)!;\n\n const viewServices = need.views ? services.filter((service) => manifestFor(service).views !== null) : [];\n const federatedServices = need.api ? services.filter((service) => manifestFor(service).remote !== null) : [];\n\n // Federated publish needs the api stack (need.api ⇒ needCdkDeploys), so any\n // docker preflight it requires is already covered by these two checks.\n if (needCdkDeploys || viewServices.length > 0) {\n await assertDockerRunning();\n }\n if (needCdkDeploys) {\n await buildDeployerImage(cdkVersion);\n }\n\n // The aws-cli image backs both the views sync and the federated publish\n // waves. Pull once now so those waves don't race N containers into pulling\n // the same image.\n if (viewServices.length > 0 || federatedServices.length > 0) {\n await runCommand('docker', ['pull', AWS_CLI_IMAGE]);\n }\n\n // ---- Wave 1: inf stacks, one container per service, all concurrent ----\n if (need.inf) {\n out.log('\\n=== Deploy inf stacks (docker) ===\\n');\n logTimeStart('infWave');\n assertNoFailures(\n 'Inf deploy',\n await runTasks(\n services.map((service) => ({\n label: `inf:${service}`,\n run: () =>\n dockerDeployStack(\n nextPrefixColor(),\n service,\n 'inf',\n getStackName(manifestFor(service), service, 'inf'),\n getGoDockerAssemblyDir(appName, service),\n ),\n })),\n DEPLOY_CONCURRENCY,\n ),\n );\n logTimeEnd('infWave');\n }\n\n // ---- Wave 2: api + web stacks, all concurrent ----\n if (need.api || need.web) {\n out.log('\\n=== Deploy api + web stacks (docker) ===\\n');\n logTimeStart('apiWebWave');\n assertNoFailures(\n 'Api/Web deploy',\n await runTasks(\n (['api', 'web'] as const)\n .filter((stackType) => (stackType === 'api' ? need.api : need.web))\n .flatMap((stackType) =>\n services.map((service) => ({\n label: `${stackType}:${service}`,\n run: () =>\n dockerDeployStack(\n nextPrefixColor(),\n service,\n stackType,\n getStackName(manifestFor(service), service, stackType),\n getGoDockerAssemblyDir(appName, service),\n ),\n })),\n ),\n DEPLOY_CONCURRENCY,\n ),\n );\n logTimeEnd('apiWebWave');\n }\n\n // ---- Views: sync the pre-built bundles to S3, all concurrent ----\n if (viewServices.length > 0) {\n out.log('\\n=== Sync views to S3 (docker) ===\\n');\n logTimeStart('viewsWave');\n assertNoFailures(\n 'Views sync',\n await runTasks(\n viewServices.map((service) => ({\n label: `views:${service}`,\n run: () => dockerSyncViews(nextPrefixColor(), service, manifestFor(service).views!),\n })),\n DEPLOY_CONCURRENCY,\n ),\n );\n logTimeEnd('viewsWave');\n }\n\n // ---- Publish: the pre-built federated remotes to S3, all concurrent ----\n if (federatedServices.length > 0) {\n out.log('\\n=== Publish federated remotes to S3 (docker) ===\\n');\n logTimeStart('publishWave');\n assertNoFailures(\n 'Federated publish',\n await runTasks(\n federatedServices.map((service) => ({\n label: `publish:${service}`,\n run: () => dockerPublishRemote(nextPrefixColor(), service, manifestFor(service).remote!),\n })),\n DEPLOY_CONCURRENCY,\n ),\n );\n logTimeEnd('publishWave');\n }\n};\n\nexport const awsGoDocker = async (appName: string, plan: DeployPlan, mode: GoDockerMode): Promise<void> => {\n if (plan.kind === 'cancelled') {\n return;\n }\n\n if ((await isAwsCredentialsValid()) === false) {\n out.log('Credentials are expired or invalid.');\n return;\n }\n\n logTimeStart('totalTime');\n\n if (plan.kind === 'account') {\n await deployAccountStack(plan.appName);\n logTimeEnd('totalTime');\n return;\n }\n\n if (plan.kind === 'bootstrap') {\n if (plan.includeDomain) {\n await deployDomainStack(plan.appName);\n }\n await deployBootstrapStack(plan.appName);\n logTimeEnd('totalTime');\n return;\n }\n\n // resolveDeployment primed the selection before this driver ran. The manifest\n // records it so a build for one deployment can never deploy to another.\n const deploymentName = process.env[QpqDeployEnvVar.deployName];\n if (!deploymentName) {\n throw new Error(`no deployment selected (${QpqDeployEnvVar.deployName} is unset)`);\n }\n\n out.log(`\\n\\nRunning dockerized deploy (${mode})\\n\\n`);\n out.log('Executing for services');\n out.log(plan.services.join(', '));\n\n if (mode !== 'from-build') {\n await buildGoDockerOutput(appName, deploymentName, plan);\n }\n if (mode !== 'build-only') {\n await deployGoDockerOutput(appName, deploymentName, plan);\n }\n\n logTimeEnd('totalTime');\n};\n"]}
@@ -14,10 +14,10 @@ exports.awsPublish = exports.awsPublishDeploy = exports.awsPublishUpload = expor
14
14
  // module-federation remote and publish it into that service's federated code
15
15
  // bucket (see ./remote for the three-phase mechanics).
16
16
  const CliError_1 = require("../../lib/CliError");
17
- const out_1 = require("../../lib/out");
17
+ const createOutput_1 = require("../../lib/createOutput");
18
18
  const awsCredentials_1 = require("./awsCredentials");
19
19
  const remote_1 = require("./remote");
20
- const out = (0, out_1.createOutput)('aws:publish');
20
+ const out = (0, createOutput_1.createOutput)('aws:publish');
21
21
  const requireAwsCredentials = () => __awaiter(void 0, void 0, void 0, function* () {
22
22
  if (!(yield (0, awsCredentials_1.isAwsCredentialsValid)())) {
23
23
  throw new CliError_1.CliError('AWS credentials are not valid. Configure them and retry.');
@@ -1 +1 @@
1
- {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../../src/platforms/aws/publish.ts"],"names":[],"mappings":"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","sourcesContent":["// AWS federated remote publishing, build each backend service as a\n// module-federation remote and publish it into that service's federated code\n// bucket (see ./remote for the three-phase mechanics).\nimport { CliError } from '../../lib/CliError';\nimport { createOutput } from '../../lib/out';\nimport { isAwsCredentialsValid } from './awsCredentials';\nimport { buildRemote, deployRemoteManifest, resolvePublishTarget, uploadRemoteVersion } from './remote';\n\nconst out = createOutput('aws:publish');\n\nconst requireAwsCredentials = async (): Promise<void> => {\n if (!(await isAwsCredentialsValid())) {\n throw new CliError('AWS credentials are not valid. Configure them and retry.');\n }\n};\n\nexport const awsPublishBuild = async (appName: string, serviceNames: string[]): Promise<void> => {\n out.log(`Building federated remotes for [${appName}]: ${serviceNames.join(', ')}`);\n\n for (const serviceName of serviceNames) {\n await buildRemote(appName, serviceName);\n }\n\n out.log('Done. Next: qpq publish:upload, then qpq publish:deploy.');\n};\n\nexport const awsPublishUpload = async (appName: string, serviceNames: string[]): Promise<void> => {\n await requireAwsCredentials();\n\n // Resolve every target up front - a missing build fails the whole step\n // before a single byte is uploaded.\n const targets = serviceNames.map((serviceName) => resolvePublishTarget(appName, serviceName));\n\n out.log(`Uploading federated remotes for [${appName}]: ${serviceNames.join(', ')}`);\n await Promise.all(targets.map((target) => uploadRemoteVersion(target)));\n\n out.log('Done. Run qpq publish:deploy to flip lambdas to the new versions.');\n};\n\nexport const awsPublishDeploy = async (appName: string, serviceNames: string[]): Promise<void> => {\n await requireAwsCredentials();\n\n const targets = serviceNames.map((serviceName) => resolvePublishTarget(appName, serviceName));\n\n out.log(`Deploying federated remote manifests for [${appName}]: ${serviceNames.join(', ')}`);\n await Promise.all(targets.map((target) => deployRemoteManifest(target)));\n\n out.log('Done. New lambda cold starts will federate these services from S3.');\n};\n\nexport const awsPublish = async (appName: string, serviceNames: string[]): Promise<void> => {\n await requireAwsCredentials();\n\n out.log(`Publishing federated remotes for [${appName}]: ${serviceNames.join(', ')}`);\n\n // 1. Build everything first - any build failure bails before any upload,\n // so the buckets never end up with a half-published set of services.\n for (const serviceName of serviceNames) {\n await buildRemote(appName, serviceName);\n }\n const targets = serviceNames.map((serviceName) => resolvePublishTarget(appName, serviceName));\n\n // 2. Upload all version dirs in parallel - manifests untouched, nothing live yet.\n await Promise.all(targets.map((target) => uploadRemoteVersion(target)));\n\n // 3. Every version dir is fully uploaded - flip the manifests, in parallel.\n await Promise.all(targets.map((target) => deployRemoteManifest(target)));\n\n out.log('Done. New lambda cold starts will federate these services from S3.');\n};\n"]}
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../../src/platforms/aws/publish.ts"],"names":[],"mappings":"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","sourcesContent":["// AWS federated remote publishing, build each backend service as a\n// module-federation remote and publish it into that service's federated code\n// bucket (see ./remote for the three-phase mechanics).\nimport { CliError } from '../../lib/CliError';\nimport { createOutput } from '../../lib/createOutput';\nimport { isAwsCredentialsValid } from './awsCredentials';\nimport { buildRemote, deployRemoteManifest, resolvePublishTarget, uploadRemoteVersion } from './remote';\n\nconst out = createOutput('aws:publish');\n\nconst requireAwsCredentials = async (): Promise<void> => {\n if (!(await isAwsCredentialsValid())) {\n throw new CliError('AWS credentials are not valid. Configure them and retry.');\n }\n};\n\nexport const awsPublishBuild = async (appName: string, serviceNames: string[]): Promise<void> => {\n out.log(`Building federated remotes for [${appName}]: ${serviceNames.join(', ')}`);\n\n for (const serviceName of serviceNames) {\n await buildRemote(appName, serviceName);\n }\n\n out.log('Done. Next: qpq publish:upload, then qpq publish:deploy.');\n};\n\nexport const awsPublishUpload = async (appName: string, serviceNames: string[]): Promise<void> => {\n await requireAwsCredentials();\n\n // Resolve every target up front - a missing build fails the whole step\n // before a single byte is uploaded.\n const targets = serviceNames.map((serviceName) => resolvePublishTarget(appName, serviceName));\n\n out.log(`Uploading federated remotes for [${appName}]: ${serviceNames.join(', ')}`);\n await Promise.all(targets.map((target) => uploadRemoteVersion(target)));\n\n out.log('Done. Run qpq publish:deploy to flip lambdas to the new versions.');\n};\n\nexport const awsPublishDeploy = async (appName: string, serviceNames: string[]): Promise<void> => {\n await requireAwsCredentials();\n\n const targets = serviceNames.map((serviceName) => resolvePublishTarget(appName, serviceName));\n\n out.log(`Deploying federated remote manifests for [${appName}]: ${serviceNames.join(', ')}`);\n await Promise.all(targets.map((target) => deployRemoteManifest(target)));\n\n out.log('Done. New lambda cold starts will federate these services from S3.');\n};\n\nexport const awsPublish = async (appName: string, serviceNames: string[]): Promise<void> => {\n await requireAwsCredentials();\n\n out.log(`Publishing federated remotes for [${appName}]: ${serviceNames.join(', ')}`);\n\n // 1. Build everything first - any build failure bails before any upload,\n // so the buckets never end up with a half-published set of services.\n for (const serviceName of serviceNames) {\n await buildRemote(appName, serviceName);\n }\n const targets = serviceNames.map((serviceName) => resolvePublishTarget(appName, serviceName));\n\n // 2. Upload all version dirs in parallel - manifests untouched, nothing live yet.\n await Promise.all(targets.map((target) => uploadRemoteVersion(target)));\n\n // 3. Every version dir is fully uploaded - flip the manifests, in parallel.\n await Promise.all(targets.map((target) => deployRemoteManifest(target)));\n\n out.log('Done. New lambda cold starts will federate these services from S3.');\n};\n"]}
@@ -37,11 +37,11 @@ const core_1 = require("@qpqjs/core");
37
37
  const deploy_rspack_1 = require("@qpqjs/deploy-rspack");
38
38
  const fs_1 = __importDefault(require("fs"));
39
39
  const path_1 = __importDefault(require("path"));
40
+ const createOutput_1 = require("../../lib/createOutput");
40
41
  const discovery_1 = require("../../lib/discovery");
41
- const out_1 = require("../../lib/out");
42
42
  const qpqConfigs_1 = require("../../lib/qpqConfigs");
43
43
  const runCommand_1 = require("../../lib/runCommand");
44
- const out = (0, out_1.createOutput)('aws:remote');
44
+ const out = (0, createOutput_1.createOutput)('aws:remote');
45
45
  const getPublishPath = (appName, serviceName) => (0, core_1.getServiceRemotePublishedDistPath)((0, discovery_1.getRoot)(), appName, serviceName);
46
46
  // Resolve the shared store bucket from the service's defineFederatedModuleStore
47
47
  // setting (same derivation the lambda env var uses) and the per-service prefix
@@ -1 +1 @@
1
- {"version":3,"file":"remote.js","sourceRoot":"","sources":["../../../../src/platforms/aws/remote.ts"],"names":[],"mappings":"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","sourcesContent":["import { awsNamingUtils } from '@qpqjs/config-aws';\n// Build a backend service as a module-federation remote and publish it into the\n// shared federated-code storage drive, under the service's own prefix. After this\n// runs, the already-deployed lambdas load their stories from the bucket (quidproquo's\n// dynamicModuleLoader tries the federated store first, falls back to the bundled\n// code when nothing's published).\n//\n// The store is one storage drive shared across services (via `owner`). Each service\n// opts in with defineFederatedModuleStore(<driveName>) and its lambdas read from\n// s3://<bucket>/<service>. Read access comes from the storage drive's own grants, so\n// the drive + a deploy of each service must exist before publishing. The bucket name\n// resolves from the same service config the deploy used, so it always matches.\n//\n// Publishing is split into three phases so they can run as separate commands\n// (publish:build / publish:upload / publish:deploy) or chained by `qpq publish`:\n// buildRemote - rspack the remote + lay out service-remote-published/\n// uploadRemoteVersion - sync the hashed version dir (everything BUT manifest.json)\n// deployRemoteManifest - upload manifest.json, atomically flipping lambdas over\n// Version files always land before the manifest that references them, so a reading\n// lambda never sees a manifest whose files aren't all present yet.\nimport { getServiceRemotePublishedDistPath, qpqCoreUtils } from '@qpqjs/core';\nimport { getServiceRemoteRspackConfig, publishFederatedRemote, runRspack } from '@qpqjs/deploy-rspack';\n\nimport fs from 'fs';\nimport path from 'path';\n\nimport { getRoot, getServiceDirectory } from '../../lib/discovery';\nimport { createOutput } from '../../lib/out';\nimport { loadServiceQpqConfig } from '../../lib/qpqConfigs';\nimport { runCommand } from '../../lib/runCommand';\n\nconst out = createOutput('aws:remote');\n\n// Everything the upload/deploy phases need to publish a built remote. Resolved\n// from the on-disk build output + service config, so each phase can run in its\n// own process without handing state between commands.\nexport type RemotePublishTarget = {\n serviceName: string;\n publishPath: string;\n manifestHash: string;\n bucketName: string;\n servicePrefix: string;\n};\n\nconst getPublishPath = (appName: string, serviceName: string): string => getServiceRemotePublishedDistPath(getRoot(), appName, serviceName);\n\n// Resolve the shared store bucket from the service's defineFederatedModuleStore\n// setting (same derivation the lambda env var uses) and the per-service prefix\n// so many services share one bucket.\nconst resolveRemoteStore = (appName: string, serviceName: string): { bucketName: string; servicePrefix: string } => {\n const qpqConfig = loadServiceQpqConfig(appName, serviceName);\n\n const federatedStore = qpqCoreUtils.getFederatedModuleStore(qpqConfig);\n if (!federatedStore) {\n throw new Error(\n `service [${serviceName}] has no defineFederatedModuleStore(...) - add it (and the matching storage drive) to opt into federation`,\n );\n }\n const storageDrive = qpqCoreUtils.getStorageDriveByName(federatedStore.storageDrive, qpqConfig);\n if (!storageDrive) {\n throw new Error(\n `defineFederatedModuleStore references storage drive [${federatedStore.storageDrive}] which service [${serviceName}] does not declare`,\n );\n }\n const bucketName = awsNamingUtils.resolveOwnedResourceName(storageDrive.storageDrive, qpqConfig, storageDrive.owner);\n const servicePrefix = qpqCoreUtils.getApplicationModuleName(qpqConfig);\n\n return { bucketName, servicePrefix };\n};\n\n// Phase 1: rspack the federated remote container and lay out the publishable\n// version dir + manifest.json under service-remote-published/. Validates the\n// federation config up front so a misconfigured service fails before the build.\nexport const buildRemote = async (appName: string, serviceName: string): Promise<void> => {\n resolveRemoteStore(appName, serviceName);\n\n const serviceDir = path.join(getServiceDirectory(appName, serviceName), 'service');\n const qpqConfig = loadServiceQpqConfig(appName, serviceName);\n\n out.log(`Building federated remote: [${serviceName}]`);\n const config = getServiceRemoteRspackConfig(qpqConfig, serviceDir);\n await runRspack(config);\n\n const remoteBuildPath = config.output!.path as string;\n publishFederatedRemote(qpqConfig, remoteBuildPath, getPublishPath(appName, serviceName));\n};\n\n// Resolve a publish target from a prior buildRemote's on-disk output.\nexport const resolvePublishTarget = (appName: string, serviceName: string): RemotePublishTarget => {\n const publishPath = getPublishPath(appName, serviceName);\n const manifestPath = path.join(publishPath, 'manifest.json');\n\n if (!fs.existsSync(manifestPath)) {\n throw new Error(`no built remote found for [${serviceName}] (missing ${manifestPath}) - run \\`qpq publish:build --app ${appName}\\` first`);\n }\n const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8')) as {\n hash: string;\n };\n\n return {\n serviceName,\n publishPath,\n manifestHash: manifest.hash,\n ...resolveRemoteStore(appName, serviceName),\n };\n};\n\n// Phase 2: upload the hashed version dir - everything EXCEPT manifest.json, so\n// nothing referenced by a live manifest changes. Safe to run concurrently across\n// services - each writes only under its own prefix.\nexport const uploadRemoteVersion = async (target: RemotePublishTarget): Promise<void> => {\n const { serviceName, publishPath, manifestHash, bucketName, servicePrefix } = target;\n\n out.log(`Uploading [${serviceName}] version [${manifestHash}] to [s3://${bucketName}/${servicePrefix}/${manifestHash}]`);\n await runCommand('aws', ['s3', 'sync', path.join(publishPath, manifestHash), `s3://${bucketName}/${servicePrefix}/${manifestHash}`]);\n};\n\n// Phase 3: upload manifest.json, the pointer lambdas read - this is the moment\n// the new version goes live. Only run once the version dir is fully uploaded.\nexport const deployRemoteManifest = async (target: RemotePublishTarget): Promise<void> => {\n const { serviceName, publishPath, manifestHash, bucketName, servicePrefix } = target;\n\n out.log(`Deploying [${serviceName}] manifest for version [${manifestHash}] to [s3://${bucketName}/${servicePrefix}/manifest.json]`);\n await runCommand('aws', ['s3', 'cp', path.join(publishPath, 'manifest.json'), `s3://${bucketName}/${servicePrefix}/manifest.json`]);\n};\n"]}
1
+ {"version":3,"file":"remote.js","sourceRoot":"","sources":["../../../../src/platforms/aws/remote.ts"],"names":[],"mappings":"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","sourcesContent":["import { awsNamingUtils } from '@qpqjs/config-aws';\n// Build a backend service as a module-federation remote and publish it into the\n// shared federated-code storage drive, under the service's own prefix. After this\n// runs, the already-deployed lambdas load their stories from the bucket (quidproquo's\n// dynamicModuleLoader tries the federated store first, falls back to the bundled\n// code when nothing's published).\n//\n// The store is one storage drive shared across services (via `owner`). Each service\n// opts in with defineFederatedModuleStore(<driveName>) and its lambdas read from\n// s3://<bucket>/<service>. Read access comes from the storage drive's own grants, so\n// the drive + a deploy of each service must exist before publishing. The bucket name\n// resolves from the same service config the deploy used, so it always matches.\n//\n// Publishing is split into three phases so they can run as separate commands\n// (publish:build / publish:upload / publish:deploy) or chained by `qpq publish`:\n// buildRemote - rspack the remote + lay out service-remote-published/\n// uploadRemoteVersion - sync the hashed version dir (everything BUT manifest.json)\n// deployRemoteManifest - upload manifest.json, atomically flipping lambdas over\n// Version files always land before the manifest that references them, so a reading\n// lambda never sees a manifest whose files aren't all present yet.\nimport { getServiceRemotePublishedDistPath, qpqCoreUtils } from '@qpqjs/core';\nimport { getServiceRemoteRspackConfig, publishFederatedRemote, runRspack } from '@qpqjs/deploy-rspack';\n\nimport fs from 'fs';\nimport path from 'path';\n\nimport { createOutput } from '../../lib/createOutput';\nimport { getRoot, getServiceDirectory } from '../../lib/discovery';\nimport { loadServiceQpqConfig } from '../../lib/qpqConfigs';\nimport { runCommand } from '../../lib/runCommand';\n\nconst out = createOutput('aws:remote');\n\n// Everything the upload/deploy phases need to publish a built remote. Resolved\n// from the on-disk build output + service config, so each phase can run in its\n// own process without handing state between commands.\nexport type RemotePublishTarget = {\n serviceName: string;\n publishPath: string;\n manifestHash: string;\n bucketName: string;\n servicePrefix: string;\n};\n\nconst getPublishPath = (appName: string, serviceName: string): string => getServiceRemotePublishedDistPath(getRoot(), appName, serviceName);\n\n// Resolve the shared store bucket from the service's defineFederatedModuleStore\n// setting (same derivation the lambda env var uses) and the per-service prefix\n// so many services share one bucket.\nconst resolveRemoteStore = (appName: string, serviceName: string): { bucketName: string; servicePrefix: string } => {\n const qpqConfig = loadServiceQpqConfig(appName, serviceName);\n\n const federatedStore = qpqCoreUtils.getFederatedModuleStore(qpqConfig);\n if (!federatedStore) {\n throw new Error(\n `service [${serviceName}] has no defineFederatedModuleStore(...) - add it (and the matching storage drive) to opt into federation`,\n );\n }\n const storageDrive = qpqCoreUtils.getStorageDriveByName(federatedStore.storageDrive, qpqConfig);\n if (!storageDrive) {\n throw new Error(\n `defineFederatedModuleStore references storage drive [${federatedStore.storageDrive}] which service [${serviceName}] does not declare`,\n );\n }\n const bucketName = awsNamingUtils.resolveOwnedResourceName(storageDrive.storageDrive, qpqConfig, storageDrive.owner);\n const servicePrefix = qpqCoreUtils.getApplicationModuleName(qpqConfig);\n\n return { bucketName, servicePrefix };\n};\n\n// Phase 1: rspack the federated remote container and lay out the publishable\n// version dir + manifest.json under service-remote-published/. Validates the\n// federation config up front so a misconfigured service fails before the build.\nexport const buildRemote = async (appName: string, serviceName: string): Promise<void> => {\n resolveRemoteStore(appName, serviceName);\n\n const serviceDir = path.join(getServiceDirectory(appName, serviceName), 'service');\n const qpqConfig = loadServiceQpqConfig(appName, serviceName);\n\n out.log(`Building federated remote: [${serviceName}]`);\n const config = getServiceRemoteRspackConfig(qpqConfig, serviceDir);\n await runRspack(config);\n\n const remoteBuildPath = config.output!.path as string;\n publishFederatedRemote(qpqConfig, remoteBuildPath, getPublishPath(appName, serviceName));\n};\n\n// Resolve a publish target from a prior buildRemote's on-disk output.\nexport const resolvePublishTarget = (appName: string, serviceName: string): RemotePublishTarget => {\n const publishPath = getPublishPath(appName, serviceName);\n const manifestPath = path.join(publishPath, 'manifest.json');\n\n if (!fs.existsSync(manifestPath)) {\n throw new Error(`no built remote found for [${serviceName}] (missing ${manifestPath}) - run \\`qpq publish:build --app ${appName}\\` first`);\n }\n const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8')) as {\n hash: string;\n };\n\n return {\n serviceName,\n publishPath,\n manifestHash: manifest.hash,\n ...resolveRemoteStore(appName, serviceName),\n };\n};\n\n// Phase 2: upload the hashed version dir - everything EXCEPT manifest.json, so\n// nothing referenced by a live manifest changes. Safe to run concurrently across\n// services - each writes only under its own prefix.\nexport const uploadRemoteVersion = async (target: RemotePublishTarget): Promise<void> => {\n const { serviceName, publishPath, manifestHash, bucketName, servicePrefix } = target;\n\n out.log(`Uploading [${serviceName}] version [${manifestHash}] to [s3://${bucketName}/${servicePrefix}/${manifestHash}]`);\n await runCommand('aws', ['s3', 'sync', path.join(publishPath, manifestHash), `s3://${bucketName}/${servicePrefix}/${manifestHash}`]);\n};\n\n// Phase 3: upload manifest.json, the pointer lambdas read - this is the moment\n// the new version goes live. Only run once the version dir is fully uploaded.\nexport const deployRemoteManifest = async (target: RemotePublishTarget): Promise<void> => {\n const { serviceName, publishPath, manifestHash, bucketName, servicePrefix } = target;\n\n out.log(`Deploying [${serviceName}] manifest for version [${manifestHash}] to [s3://${bucketName}/${servicePrefix}/manifest.json]`);\n await runCommand('aws', ['s3', 'cp', path.join(publishPath, 'manifest.json'), `s3://${bucketName}/${servicePrefix}/manifest.json`]);\n};\n"]}
@@ -12,8 +12,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.buildGithubDeployRoleStep = void 0;
13
13
  const config_aws_1 = require("@qpqjs/config-aws");
14
14
  const client_iam_1 = require("@aws-sdk/client-iam");
15
- const out_1 = require("../../../lib/out");
16
- const out = (0, out_1.createOutput)('aws:build-github-deploy-role-step');
15
+ const createOutput_1 = require("../../../lib/createOutput");
16
+ const out = (0, createOutput_1.createOutput)('aws:build-github-deploy-role-step');
17
17
  // The role itself is deployed by the bootstrap stack; this step tells you whether the config
18
18
  // declares it, whether it exists yet, and what to put in the GitHub Environment once it does.
19
19
  const checkDeployRole = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
@@ -1 +1 @@
1
- {"version":3,"file":"buildGithubDeployRoleStep.js","sourceRoot":"","sources":["../../../../../src/platforms/aws/setup/buildGithubDeployRoleStep.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,kDAAsE;AAEtE,oDAAgE;AAEhE,0CAAgD;AAIhD,MAAM,GAAG,GAAG,IAAA,kBAAY,EAAC,mCAAmC,CAAC,CAAC;AAE9D,6FAA6F;AAC7F,8FAA8F;AAC9F,MAAM,eAAe,GAAG,CAAO,GAAoB,EAA6B,EAAE;;IAChF,MAAM,MAAM,GAAG,8BAAiB,CAAC,4BAA4B,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACtF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,0GAA0G,EAAE,CAAC;IAC7I,CAAC;IAED,MAAM,QAAQ,GAAG,2BAAc,CAAC,iCAAiC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAC1F,MAAM,iBAAiB,GAAG,MAAA,MAAM,CAAC,iBAAiB,mCAAI,GAAG,CAAC,WAAW,CAAC;IACtE,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,sBAAS,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,2BAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC9G,OAAO;YACL,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,GAAG,yBAAyB,iBAAiB,qDAAqD,GAAG,CAAC,MAAM,EAAE;SAChI,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;YACrE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,QAAQ,oDAAoD,EAAE,CAAC;QAClG,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAA,CAAC;AAEF,yHAAyH;AAClH,MAAM,yBAAyB,GAAG,CAAC,GAAoB,EAAa,EAAE,CAAC,CAAC;IAC7E,EAAE,EAAE,oBAAoB;IACxB,IAAI,EAAE,4BAA4B;IAClC,KAAK,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC;IACjC,GAAG,EAAE,GAAS,EAAE;;QACd,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,MAAA,MAAM,CAAC,MAAM,mCAAI,qBAAqB,CAAC,CAAC;QAC1D,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC,CAAA;CACF,CAAC,CAAC;AAXU,QAAA,yBAAyB,6BAWnC","sourcesContent":["import { awsNamingUtils, qpqConfigAwsUtils } from '@qpqjs/config-aws';\n\nimport { GetRoleCommand, IAMClient } from '@aws-sdk/client-iam';\n\nimport { createOutput } from '../../../lib/out';\nimport { SetupCheckResult, SetupStep } from '../../../lib/setupStep';\nimport { AwsSetupContext } from './awsSetupContext';\n\nconst out = createOutput('aws:build-github-deploy-role-step');\n\n// The role itself is deployed by the bootstrap stack; this step tells you whether the config\n// declares it, whether it exists yet, and what to put in the GitHub Environment once it does.\nconst checkDeployRole = async (ctx: AwsSetupContext): Promise<SetupCheckResult> => {\n const config = qpqConfigAwsUtils.getAwsGithubDeployRoleConfig(ctx.bootstrapQpqConfig);\n if (!config) {\n return { done: false, detail: 'not declared: add defineAwsGithubDeployRole(\"owner/repo\", { ownerId, repositoryId }) to bootstrap.qpq.ts' };\n }\n\n const roleName = awsNamingUtils.getGithubDeployRoleNameFromConfig(ctx.bootstrapQpqConfig);\n const githubEnvironment = config.githubEnvironment ?? ctx.environment;\n try {\n const { Role } = await new IAMClient({ region: ctx.region }).send(new GetRoleCommand({ RoleName: roleName }));\n return {\n done: true,\n detail: `${Role?.Arn}; GitHub Environment '${githubEnvironment}' needs DEPLOY_ROLE_ARN=<that arn> and AWS_REGION=${ctx.region}`,\n };\n } catch (error) {\n if (error instanceof Error && error.name === 'NoSuchEntityException') {\n return { done: false, detail: `${roleName} not deployed yet (the bootstrap stack creates it)` };\n }\n throw error;\n }\n};\n\n/** Check-only: the GitHub Actions deploy role is declared and deployed, with the values the GitHub Environment needs. */\nexport const buildGithubDeployRoleStep = (ctx: AwsSetupContext): SetupStep => ({\n id: 'github-deploy-role',\n name: 'GitHub Actions deploy role',\n check: () => checkDeployRole(ctx),\n run: async () => {\n const result = await checkDeployRole(ctx);\n if (!result.done) {\n throw new Error(result.detail ?? 'deploy role missing');\n }\n out.log(result.detail);\n },\n});\n"]}
1
+ {"version":3,"file":"buildGithubDeployRoleStep.js","sourceRoot":"","sources":["../../../../../src/platforms/aws/setup/buildGithubDeployRoleStep.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,kDAAsE;AAEtE,oDAAgE;AAEhE,4DAAyD;AAIzD,MAAM,GAAG,GAAG,IAAA,2BAAY,EAAC,mCAAmC,CAAC,CAAC;AAE9D,6FAA6F;AAC7F,8FAA8F;AAC9F,MAAM,eAAe,GAAG,CAAO,GAAoB,EAA6B,EAAE;;IAChF,MAAM,MAAM,GAAG,8BAAiB,CAAC,4BAA4B,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACtF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,0GAA0G,EAAE,CAAC;IAC7I,CAAC;IAED,MAAM,QAAQ,GAAG,2BAAc,CAAC,iCAAiC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAC1F,MAAM,iBAAiB,GAAG,MAAA,MAAM,CAAC,iBAAiB,mCAAI,GAAG,CAAC,WAAW,CAAC;IACtE,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,sBAAS,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,2BAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC9G,OAAO;YACL,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,GAAG,yBAAyB,iBAAiB,qDAAqD,GAAG,CAAC,MAAM,EAAE;SAChI,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;YACrE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,QAAQ,oDAAoD,EAAE,CAAC;QAClG,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAA,CAAC;AAEF,yHAAyH;AAClH,MAAM,yBAAyB,GAAG,CAAC,GAAoB,EAAa,EAAE,CAAC,CAAC;IAC7E,EAAE,EAAE,oBAAoB;IACxB,IAAI,EAAE,4BAA4B;IAClC,KAAK,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC;IACjC,GAAG,EAAE,GAAS,EAAE;;QACd,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,MAAA,MAAM,CAAC,MAAM,mCAAI,qBAAqB,CAAC,CAAC;QAC1D,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC,CAAA;CACF,CAAC,CAAC;AAXU,QAAA,yBAAyB,6BAWnC","sourcesContent":["import { awsNamingUtils, qpqConfigAwsUtils } from '@qpqjs/config-aws';\n\nimport { GetRoleCommand, IAMClient } from '@aws-sdk/client-iam';\n\nimport { createOutput } from '../../../lib/createOutput';\nimport { SetupCheckResult, SetupStep } from '../../../lib/setupStep';\nimport { AwsSetupContext } from './awsSetupContext';\n\nconst out = createOutput('aws:build-github-deploy-role-step');\n\n// The role itself is deployed by the bootstrap stack; this step tells you whether the config\n// declares it, whether it exists yet, and what to put in the GitHub Environment once it does.\nconst checkDeployRole = async (ctx: AwsSetupContext): Promise<SetupCheckResult> => {\n const config = qpqConfigAwsUtils.getAwsGithubDeployRoleConfig(ctx.bootstrapQpqConfig);\n if (!config) {\n return { done: false, detail: 'not declared: add defineAwsGithubDeployRole(\"owner/repo\", { ownerId, repositoryId }) to bootstrap.qpq.ts' };\n }\n\n const roleName = awsNamingUtils.getGithubDeployRoleNameFromConfig(ctx.bootstrapQpqConfig);\n const githubEnvironment = config.githubEnvironment ?? ctx.environment;\n try {\n const { Role } = await new IAMClient({ region: ctx.region }).send(new GetRoleCommand({ RoleName: roleName }));\n return {\n done: true,\n detail: `${Role?.Arn}; GitHub Environment '${githubEnvironment}' needs DEPLOY_ROLE_ARN=<that arn> and AWS_REGION=${ctx.region}`,\n };\n } catch (error) {\n if (error instanceof Error && error.name === 'NoSuchEntityException') {\n return { done: false, detail: `${roleName} not deployed yet (the bootstrap stack creates it)` };\n }\n throw error;\n }\n};\n\n/** Check-only: the GitHub Actions deploy role is declared and deployed, with the values the GitHub Environment needs. */\nexport const buildGithubDeployRoleStep = (ctx: AwsSetupContext): SetupStep => ({\n id: 'github-deploy-role',\n name: 'GitHub Actions deploy role',\n check: () => checkDeployRole(ctx),\n run: async () => {\n const result = await checkDeployRole(ctx);\n if (!result.done) {\n throw new Error(result.detail ?? 'deploy role missing');\n }\n out.log(result.detail);\n },\n});\n"]}
@@ -18,14 +18,14 @@ const config_aws_1 = require("@qpqjs/config-aws");
18
18
  // set); only the per-invocation service is added here.
19
19
  const core_1 = require("@qpqjs/core");
20
20
  const deploy_aws_1 = require("@qpqjs/deploy-aws");
21
+ const createOutput_1 = require("../../lib/createOutput");
21
22
  const discovery_1 = require("../../lib/discovery");
22
- const out_1 = require("../../lib/out");
23
23
  const qpqConfigs_1 = require("../../lib/qpqConfigs");
24
24
  const runCommand_1 = require("../../lib/runCommand");
25
25
  const timing_1 = require("../../lib/timing");
26
26
  const cdkApp_1 = require("./cdkApp");
27
27
  const getDeployEnv_1 = require("./getDeployEnv");
28
- const out = (0, out_1.createOutput)('aws:stacks');
28
+ const out = (0, createOutput_1.createOutput)('aws:stacks');
29
29
  const deployStack = (stackName_1, ...args_1) => __awaiter(void 0, [stackName_1, ...args_1], void 0, function* (stackName, env = {}) {
30
30
  (0, timing_1.logTimeStart)(stackName);
31
31
  yield (0, runCommand_1.runCommand)('npx', ['cdk', 'deploy', stackName, '--require-approval', 'never', '--app', `'${(0, cdkApp_1.getCdkAppCommand)()}'`, '--output', (0, core_1.getCdkOutPath)((0, discovery_1.getRoot)())], {
@@ -51,11 +51,7 @@ const destroyStack = (stackName_1, ...args_1) => __awaiter(void 0, [stackName_1,
51
51
  const destroyServiceStack = (serviceName, stackName, appName) => destroyStack(stackName, (0, getDeployEnv_1.getDeployEnv)(appName, serviceName));
52
52
  exports.destroyServiceStack = destroyServiceStack;
53
53
  const deployDomainStack = (appName) => __awaiter(void 0, void 0, void 0, function* () {
54
- const [firstService] = (0, discovery_1.getServiceNames)(appName);
55
- if (firstService === undefined) {
56
- throw new Error(`No services found for app ${appName}`);
57
- }
58
- const qpqConfig = (0, qpqConfigs_1.loadServiceQpqConfig)(appName, firstService);
54
+ const qpqConfig = (0, qpqConfigs_1.loadFirstServiceQpqConfig)(appName);
59
55
  const stackName = deploy_aws_1.qpqDeployAwsUtils.getDomainStackName(qpqConfig);
60
56
  out.log('Deploy Domain: ', stackName);
61
57
  yield (0, exports.deployStack)(stackName, (0, getDeployEnv_1.getDeployEnv)(appName));
@@ -75,7 +71,7 @@ const deployBootstrapStack = (appName) => __awaiter(void 0, void 0, void 0, func
75
71
  const appPrefix = (0, qpqConfigs_1.getAppPrefix)(appName);
76
72
  const environment = process.env[core_1.QpqDeployEnvVar.environment];
77
73
  const feature = process.env[core_1.QpqDeployEnvVar.featureName];
78
- const stackName = config_aws_1.awsNamingUtils.getAppStackName(appPrefix, environment !== null && environment !== void 0 ? environment : '', feature, 'bs');
74
+ const stackName = config_aws_1.awsNamingUtils.getAppStackName(appPrefix, environment !== null && environment !== void 0 ? environment : '', 'bs', feature);
79
75
  yield (0, exports.deployStack)(stackName, (0, getDeployEnv_1.getDeployEnv)(appName));
80
76
  });
81
77
  exports.deployBootstrapStack = deployBootstrapStack;
@@ -1 +1 @@
1
- {"version":3,"file":"stacks.js","sourceRoot":"","sources":["../../../../src/platforms/aws/stacks.ts"],"names":[],"mappings":"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","sourcesContent":["import { awsNamingUtils } from '@qpqjs/config-aws';\n// Host-side `cdk deploy` helpers. No cdk.json anywhere: the CDK app command is\n// passed via --app and runs @qpqjs/deploy-aws's generic workspace app\n// (bin/qpq-cdk-app.js) under ts-node hooks. The child inherits the primed\n// deployment env (DEPLOY_APP_NAME / DEPLOY_NAME and everything resolveDeployment\n// set); only the per-invocation service is added here.\nimport { getCdkOutPath, QpqDeployEnvVar } from '@qpqjs/core';\nimport { qpqDeployAwsUtils } from '@qpqjs/deploy-aws';\n\nimport path from 'path';\n\nimport { getRoot, getServiceNames } from '../../lib/discovery';\nimport { createOutput } from '../../lib/out';\nimport { getAppPrefix, loadServiceQpqConfig } from '../../lib/qpqConfigs';\nimport { runCommand } from '../../lib/runCommand';\nimport { logTimeEnd, logTimeStart } from '../../lib/timing';\nimport { getCdkAppCommand } from './cdkApp';\nimport { getDeployEnv } from './getDeployEnv';\n\nconst out = createOutput('aws:stacks');\n\nexport const deployStack = async (stackName: string, env: Record<string, string> = {}): Promise<void> => {\n logTimeStart(stackName);\n await runCommand(\n 'npx',\n ['cdk', 'deploy', stackName, '--require-approval', 'never', '--app', `'${getCdkAppCommand()}'`, '--output', getCdkOutPath(getRoot())],\n {\n cwd: getRoot(),\n env,\n },\n );\n logTimeEnd(stackName);\n};\n\nexport const deployServiceStack = (serviceName: string, stackName: string, appName: string): Promise<void> =>\n deployStack(stackName, getDeployEnv(appName, serviceName));\n\n// `cdk destroy` still synths the app to find the stack, so it runs the same\n// generic workspace app with the same DEPLOY_* env as deploys, meaning the\n// service bundles under dist/ must exist for asset resolution to succeed.\nconst destroyStack = async (stackName: string, env: Record<string, string> = {}): Promise<void> => {\n logTimeStart(stackName);\n await runCommand('npx', ['cdk', 'destroy', stackName, '--force', '--app', `'${getCdkAppCommand()}'`, '--output', getCdkOutPath(getRoot())], {\n cwd: getRoot(),\n env,\n });\n logTimeEnd(stackName);\n};\n\nexport const destroyServiceStack = (serviceName: string, stackName: string, appName: string): Promise<void> =>\n destroyStack(stackName, getDeployEnv(appName, serviceName));\n\nexport const deployDomainStack = async (appName: string): Promise<void> => {\n const [firstService] = getServiceNames(appName);\n if (firstService === undefined) {\n throw new Error(`No services found for app ${appName}`);\n }\n const qpqConfig = loadServiceQpqConfig(appName, firstService);\n const stackName = qpqDeployAwsUtils.getDomainStackName(qpqConfig);\n out.log('Deploy Domain: ', stackName);\n await deployStack(stackName, getDeployEnv(appName));\n};\n\n// Account-level guardrails stack - statically named (one per AWS account,\n// app-agnostic), so no config load is needed to know the name. Callers decide\n// whether an actor deploy should include it (bootstrap skips it; the explicit\n// 'account' menu option always deploys).\nexport const deployAccountStack = async (appName: string): Promise<void> => {\n const stackName = qpqDeployAwsUtils.getAccountStackName();\n out.log('Deploy Account: ', stackName);\n await deployStack(stackName, getDeployEnv(appName));\n};\n\nexport const deployBootstrapStack = async (appName: string): Promise<void> => {\n const appPrefix = getAppPrefix(appName);\n const environment = process.env[QpqDeployEnvVar.environment];\n const feature = process.env[QpqDeployEnvVar.featureName];\n const stackName = awsNamingUtils.getAppStackName(appPrefix, environment ?? '', feature, 'bs');\n await deployStack(stackName, getDeployEnv(appName));\n};\n"]}
1
+ {"version":3,"file":"stacks.js","sourceRoot":"","sources":["../../../../src/platforms/aws/stacks.ts"],"names":[],"mappings":"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","sourcesContent":["import { awsNamingUtils } from '@qpqjs/config-aws';\n// Host-side `cdk deploy` helpers. No cdk.json anywhere: the CDK app command is\n// passed via --app and runs @qpqjs/deploy-aws's generic workspace app\n// (bin/qpq-cdk-app.js) under ts-node hooks. The child inherits the primed\n// deployment env (DEPLOY_APP_NAME / DEPLOY_NAME and everything resolveDeployment\n// set); only the per-invocation service is added here.\nimport { getCdkOutPath, QpqDeployEnvVar } from '@qpqjs/core';\nimport { qpqDeployAwsUtils } from '@qpqjs/deploy-aws';\n\nimport path from 'path';\n\nimport { createOutput } from '../../lib/createOutput';\nimport { getRoot } from '../../lib/discovery';\nimport { getAppPrefix, loadFirstServiceQpqConfig } from '../../lib/qpqConfigs';\nimport { runCommand } from '../../lib/runCommand';\nimport { logTimeEnd, logTimeStart } from '../../lib/timing';\nimport { getCdkAppCommand } from './cdkApp';\nimport { getDeployEnv } from './getDeployEnv';\n\nconst out = createOutput('aws:stacks');\n\nexport const deployStack = async (stackName: string, env: Record<string, string> = {}): Promise<void> => {\n logTimeStart(stackName);\n await runCommand(\n 'npx',\n ['cdk', 'deploy', stackName, '--require-approval', 'never', '--app', `'${getCdkAppCommand()}'`, '--output', getCdkOutPath(getRoot())],\n {\n cwd: getRoot(),\n env,\n },\n );\n logTimeEnd(stackName);\n};\n\nexport const deployServiceStack = (serviceName: string, stackName: string, appName: string): Promise<void> =>\n deployStack(stackName, getDeployEnv(appName, serviceName));\n\n// `cdk destroy` still synths the app to find the stack, so it runs the same\n// generic workspace app with the same DEPLOY_* env as deploys, meaning the\n// service bundles under dist/ must exist for asset resolution to succeed.\nconst destroyStack = async (stackName: string, env: Record<string, string> = {}): Promise<void> => {\n logTimeStart(stackName);\n await runCommand('npx', ['cdk', 'destroy', stackName, '--force', '--app', `'${getCdkAppCommand()}'`, '--output', getCdkOutPath(getRoot())], {\n cwd: getRoot(),\n env,\n });\n logTimeEnd(stackName);\n};\n\nexport const destroyServiceStack = (serviceName: string, stackName: string, appName: string): Promise<void> =>\n destroyStack(stackName, getDeployEnv(appName, serviceName));\n\nexport const deployDomainStack = async (appName: string): Promise<void> => {\n const qpqConfig = loadFirstServiceQpqConfig(appName);\n const stackName = qpqDeployAwsUtils.getDomainStackName(qpqConfig);\n out.log('Deploy Domain: ', stackName);\n await deployStack(stackName, getDeployEnv(appName));\n};\n\n// Account-level guardrails stack - statically named (one per AWS account,\n// app-agnostic), so no config load is needed to know the name. Callers decide\n// whether an actor deploy should include it (bootstrap skips it; the explicit\n// 'account' menu option always deploys).\nexport const deployAccountStack = async (appName: string): Promise<void> => {\n const stackName = qpqDeployAwsUtils.getAccountStackName();\n out.log('Deploy Account: ', stackName);\n await deployStack(stackName, getDeployEnv(appName));\n};\n\nexport const deployBootstrapStack = async (appName: string): Promise<void> => {\n const appPrefix = getAppPrefix(appName);\n const environment = process.env[QpqDeployEnvVar.environment];\n const feature = process.env[QpqDeployEnvVar.featureName];\n const stackName = awsNamingUtils.getAppStackName(appPrefix, environment ?? '', 'bs', feature);\n await deployStack(stackName, getDeployEnv(appName));\n};\n"]}
@@ -18,12 +18,12 @@ exports.awsTeardown = void 0;
18
18
  // outlive any one service and are torn down by hand if ever.
19
19
  const deploy_aws_1 = require("@qpqjs/deploy-aws");
20
20
  const synth_1 = require("../../commands/synth");
21
- const out_1 = require("../../lib/out");
21
+ const createOutput_1 = require("../../lib/createOutput");
22
22
  const qpqConfigs_1 = require("../../lib/qpqConfigs");
23
23
  const timing_1 = require("../../lib/timing");
24
24
  const awsCredentials_1 = require("./awsCredentials");
25
25
  const stacks_1 = require("./stacks");
26
- const out = (0, out_1.createOutput)('aws:teardown');
26
+ const out = (0, createOutput_1.createOutput)('aws:teardown');
27
27
  const teardownPhases = [
28
28
  { label: 'Web', getStackName: deploy_aws_1.qpqDeployAwsUtils.getWebStackName },
29
29
  { label: 'Api', getStackName: deploy_aws_1.qpqDeployAwsUtils.getApiStackName },
@@ -1 +1 @@
1
- {"version":3,"file":"teardown.js","sourceRoot":"","sources":["../../../../src/platforms/aws/teardown.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,4EAA4E;AAC5E,8EAA8E;AAC9E,wEAAwE;AACxE,+EAA+E;AAC/E,2EAA2E;AAC3E,6DAA6D;AAC7D,kDAAsD;AAEtD,gDAAoD;AAEpD,uCAA6C;AAC7C,qDAA4D;AAC5D,6CAA4D;AAC5D,qDAAyD;AACzD,qCAA+C;AAE/C,MAAM,GAAG,GAAG,IAAA,kBAAY,EAAC,cAAc,CAAC,CAAC;AAEzC,MAAM,cAAc,GAAG;IACrB,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,8BAAiB,CAAC,eAAe,EAAE;IACjE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,8BAAiB,CAAC,eAAe,EAAE;IACjE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,8BAAiB,CAAC,eAAe,EAAE;CAClE,CAAC;AAEK,MAAM,WAAW,GAAG,CAAO,OAAe,EAAE,IAAkB,EAAiB,EAAE;IACtF,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAE1B,GAAG,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAC9C,GAAG,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAClC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAE7B,IAAI,CAAC,MAAM,IAAA,sCAAqB,GAAE,CAAC,KAAK,KAAK,EAAE,CAAC;QAC9C,GAAG,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QAC/C,OAAO;IACT,CAAC;IAED,IAAA,qBAAY,EAAC,WAAW,CAAC,CAAC;IAE1B,0EAA0E;IAC1E,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAO,GAAG,EAAE,OAAO,EAAE,EAAE;QAC3C,MAAM,GAAG,CAAC;QACV,MAAM,IAAA,oBAAY,EAAC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAClD,CAAC,CAAA,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAEtB,KAAK,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,cAAc,EAAE,CAAC;QACrD,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAO,GAAG,EAAE,OAAO,EAAE,EAAE;YAC3C,MAAM,GAAG,CAAC;YACV,MAAM,mBAAmB,GAAG,IAAA,iCAAoB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACnE,GAAG,CAAC,GAAG,CAAC,WAAW,KAAK,IAAI,EAAE,OAAO,CAAC,CAAC;YACvC,MAAM,IAAA,4BAAmB,EAAC,OAAO,EAAE,YAAY,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC,CAAC;QACjF,CAAC,CAAA,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACxB,CAAC;IAED,IAAA,mBAAU,EAAC,WAAW,CAAC,CAAC;AAC1B,CAAC,CAAA,CAAC;AAlCW,QAAA,WAAW,eAkCtB","sourcesContent":["// AWS sequential teardown (`qpq teardown`), the stack phases of `qpq go` in\n// reverse. Per phase it destroys every selected service's web, then api, then\n// inf CDK stacks. Phases don't cross-reference each other's CFN outputs\n// (values flow through SSM), so this order is prudence, not a hard dependency.\n// Bootstrap, domain and account stacks are deliberately out of scope, they\n// outlive any one service and are torn down by hand if ever.\nimport { qpqDeployAwsUtils } from '@qpqjs/deploy-aws';\n\nimport { synthCommand } from '../../commands/synth';\nimport { TeardownPlan } from '../../lib/deployPrompts';\nimport { createOutput } from '../../lib/out';\nimport { loadServiceQpqConfig } from '../../lib/qpqConfigs';\nimport { logTimeEnd, logTimeStart } from '../../lib/timing';\nimport { isAwsCredentialsValid } from './awsCredentials';\nimport { destroyServiceStack } from './stacks';\n\nconst out = createOutput('aws:teardown');\n\nconst teardownPhases = [\n { label: 'Web', getStackName: qpqDeployAwsUtils.getWebStackName },\n { label: 'Api', getStackName: qpqDeployAwsUtils.getApiStackName },\n { label: 'Inf', getStackName: qpqDeployAwsUtils.getInfStackName },\n];\n\nexport const awsTeardown = async (appName: string, plan: TeardownPlan): Promise<void> => {\n if (plan.kind === 'cancelled') {\n return;\n }\n\n const { services } = plan;\n\n out.log('\\n\\nRunning automated teardown\\n\\n');\n out.log('Executing for services');\n out.log(services.join(', '));\n\n if ((await isAwsCredentialsValid()) === false) {\n out.log('Credentials are expired or invalid.');\n return;\n }\n\n logTimeStart('totalTime');\n\n // The stack-name utils and the cdk app both read the synthed QPQ configs.\n await services.reduce(async (cur, service) => {\n await cur;\n await synthCommand([service, '--app', appName]);\n }, Promise.resolve());\n\n for (const { label, getStackName } of teardownPhases) {\n await services.reduce(async (cur, service) => {\n await cur;\n const qpqConfigForService = loadServiceQpqConfig(appName, service);\n out.log(`Destroy ${label}: `, service);\n await destroyServiceStack(service, getStackName(qpqConfigForService), appName);\n }, Promise.resolve());\n }\n\n logTimeEnd('totalTime');\n};\n"]}
1
+ {"version":3,"file":"teardown.js","sourceRoot":"","sources":["../../../../src/platforms/aws/teardown.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,4EAA4E;AAC5E,8EAA8E;AAC9E,wEAAwE;AACxE,+EAA+E;AAC/E,2EAA2E;AAC3E,6DAA6D;AAC7D,kDAAsD;AAEtD,gDAAoD;AACpD,yDAAsD;AAEtD,qDAA4D;AAC5D,6CAA4D;AAC5D,qDAAyD;AACzD,qCAA+C;AAE/C,MAAM,GAAG,GAAG,IAAA,2BAAY,EAAC,cAAc,CAAC,CAAC;AAEzC,MAAM,cAAc,GAAG;IACrB,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,8BAAiB,CAAC,eAAe,EAAE;IACjE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,8BAAiB,CAAC,eAAe,EAAE;IACjE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,8BAAiB,CAAC,eAAe,EAAE;CAClE,CAAC;AAEK,MAAM,WAAW,GAAG,CAAO,OAAe,EAAE,IAAkB,EAAiB,EAAE;IACtF,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAE1B,GAAG,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAC9C,GAAG,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAClC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAE7B,IAAI,CAAC,MAAM,IAAA,sCAAqB,GAAE,CAAC,KAAK,KAAK,EAAE,CAAC;QAC9C,GAAG,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QAC/C,OAAO;IACT,CAAC;IAED,IAAA,qBAAY,EAAC,WAAW,CAAC,CAAC;IAE1B,0EAA0E;IAC1E,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAO,GAAG,EAAE,OAAO,EAAE,EAAE;QAC3C,MAAM,GAAG,CAAC;QACV,MAAM,IAAA,oBAAY,EAAC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAClD,CAAC,CAAA,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAEtB,KAAK,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,cAAc,EAAE,CAAC;QACrD,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAO,GAAG,EAAE,OAAO,EAAE,EAAE;YAC3C,MAAM,GAAG,CAAC;YACV,MAAM,mBAAmB,GAAG,IAAA,iCAAoB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACnE,GAAG,CAAC,GAAG,CAAC,WAAW,KAAK,IAAI,EAAE,OAAO,CAAC,CAAC;YACvC,MAAM,IAAA,4BAAmB,EAAC,OAAO,EAAE,YAAY,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC,CAAC;QACjF,CAAC,CAAA,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACxB,CAAC;IAED,IAAA,mBAAU,EAAC,WAAW,CAAC,CAAC;AAC1B,CAAC,CAAA,CAAC;AAlCW,QAAA,WAAW,eAkCtB","sourcesContent":["// AWS sequential teardown (`qpq teardown`), the stack phases of `qpq go` in\n// reverse. Per phase it destroys every selected service's web, then api, then\n// inf CDK stacks. Phases don't cross-reference each other's CFN outputs\n// (values flow through SSM), so this order is prudence, not a hard dependency.\n// Bootstrap, domain and account stacks are deliberately out of scope, they\n// outlive any one service and are torn down by hand if ever.\nimport { qpqDeployAwsUtils } from '@qpqjs/deploy-aws';\n\nimport { synthCommand } from '../../commands/synth';\nimport { createOutput } from '../../lib/createOutput';\nimport { TeardownPlan } from '../../lib/deployPrompts';\nimport { loadServiceQpqConfig } from '../../lib/qpqConfigs';\nimport { logTimeEnd, logTimeStart } from '../../lib/timing';\nimport { isAwsCredentialsValid } from './awsCredentials';\nimport { destroyServiceStack } from './stacks';\n\nconst out = createOutput('aws:teardown');\n\nconst teardownPhases = [\n { label: 'Web', getStackName: qpqDeployAwsUtils.getWebStackName },\n { label: 'Api', getStackName: qpqDeployAwsUtils.getApiStackName },\n { label: 'Inf', getStackName: qpqDeployAwsUtils.getInfStackName },\n];\n\nexport const awsTeardown = async (appName: string, plan: TeardownPlan): Promise<void> => {\n if (plan.kind === 'cancelled') {\n return;\n }\n\n const { services } = plan;\n\n out.log('\\n\\nRunning automated teardown\\n\\n');\n out.log('Executing for services');\n out.log(services.join(', '));\n\n if ((await isAwsCredentialsValid()) === false) {\n out.log('Credentials are expired or invalid.');\n return;\n }\n\n logTimeStart('totalTime');\n\n // The stack-name utils and the cdk app both read the synthed QPQ configs.\n await services.reduce(async (cur, service) => {\n await cur;\n await synthCommand([service, '--app', appName]);\n }, Promise.resolve());\n\n for (const { label, getStackName } of teardownPhases) {\n await services.reduce(async (cur, service) => {\n await cur;\n const qpqConfigForService = loadServiceQpqConfig(appName, service);\n out.log(`Destroy ${label}: `, service);\n await destroyServiceStack(service, getStackName(qpqConfigForService), appName);\n }, Promise.resolve());\n }\n\n logTimeEnd('totalTime');\n};\n"]}
@@ -22,11 +22,11 @@ const config_aws_1 = require("@qpqjs/config-aws");
22
22
  const webserver_1 = require("@qpqjs/webserver");
23
23
  const fs_1 = __importDefault(require("fs"));
24
24
  const path_1 = __importDefault(require("path"));
25
- const out_1 = require("../../lib/out");
25
+ const createOutput_1 = require("../../lib/createOutput");
26
26
  const qpqConfigs_1 = require("../../lib/qpqConfigs");
27
27
  const runCommand_1 = require("../../lib/runCommand");
28
28
  const views_1 = require("../../lib/views");
29
- const out = (0, out_1.createOutput)('aws:views-sync');
29
+ const out = (0, createOutput_1.createOutput)('aws:views-sync');
30
30
  // The mutable entry points: fixed names whose CONTENT changes every deploy. They
31
31
  // must never be cached without revalidation, a browser holding a stale
32
32
  // mf-manifest.json or remoteEntry.js keeps running the previous deploy's bundle
@@ -1 +1 @@
1
- {"version":3,"file":"viewsSync.js","sourceRoot":"","sources":["../../../../src/platforms/aws/viewsSync.ts"],"names":[],"mappings":"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","sourcesContent":["import { awsNamingUtils } from '@qpqjs/config-aws';\n// Views upload to S3. Every service's views go to its prefix in the shared\n// 'views' bucket (owned by shell). A service can also be a standalone host on\n// its own domain: each of its web entries marked `storageDrive.syncServiceViews`\n// gets the bundle at its drive's root. shell is the root website, which predates\n// that flag, so it keeps its 'website' bucket root when it declares none.\nimport { qpqWebServerUtils } from '@qpqjs/webserver';\n\nimport fs from 'fs';\nimport path from 'path';\n\nimport { createOutput } from '../../lib/out';\nimport { loadServiceQpqConfig } from '../../lib/qpqConfigs';\nimport { runCommand } from '../../lib/runCommand';\nimport { getViewsDistDir } from '../../lib/views';\n\nconst out = createOutput('aws:views-sync');\n\n// The mutable entry points: fixed names whose CONTENT changes every deploy. They\n// must never be cached without revalidation, a browser holding a stale\n// mf-manifest.json or remoteEntry.js keeps running the previous deploy's bundle\n// (the module-reload hot-swap and plain page refreshes both depend on these being\n// fresh). Everything else in a views dist is content-hashed and safely immutable.\nexport const NO_CACHE_FILES = ['mf-manifest.json', 'remoteEntry.js', 'index.html', 'favicon.ico'];\n\n// The service that owns the shared views bucket and the root website.\nconst SHELL_SERVICE_NAME = 'shell';\n// The drive every service's views are uploaded into, under the service's prefix.\nconst SHARED_VIEWS_DRIVE_NAME = 'views';\n// Shell's bucket root from before `syncServiceViews`, kept when it declares no host drive.\nconst LEGACY_WEBSITE_DRIVE_NAME = 'website';\n\n// Content-hashed assets never change under their name, so they cache for a year; the\n// entry points above must be revalidated on every load.\nconst IMMUTABLE_CACHE_CONTROL = 'public,max-age=31536000,immutable';\nconst NO_CACHE_CONTROL = 'no-cache';\n\nexport const getViewsS3Destinations = (appName: string, serviceName: string): string[] => {\n const shellConfig = loadServiceQpqConfig(appName, SHELL_SERVICE_NAME);\n const viewsBucketName = awsNamingUtils.getConfigRuntimeResourceNameFromConfig(SHARED_VIEWS_DRIVE_NAME, shellConfig);\n\n const destinations = [`s3://${viewsBucketName}/${serviceName}`];\n\n const serviceConfig = serviceName === SHELL_SERVICE_NAME ? shellConfig : loadServiceQpqConfig(appName, serviceName);\n const hostDrives = qpqWebServerUtils\n .getWebEntryConfigs(serviceConfig)\n .filter((webEntry) => webEntry.storageDrive.syncServiceViews && webEntry.storageDrive.sourceStorageDrive)\n .map((webEntry) => webEntry.storageDrive.sourceStorageDrive!);\n\n if (serviceName === SHELL_SERVICE_NAME && hostDrives.length === 0) {\n hostDrives.push(LEGACY_WEBSITE_DRIVE_NAME);\n }\n\n for (const drive of hostDrives) {\n destinations.push(`s3://${awsNamingUtils.getConfigRuntimeResourceNameFromConfig(drive, serviceConfig)}`);\n }\n\n return destinations;\n};\n\nexport const syncViewsToS3 = async (appName: string, serviceName: string): Promise<void> => {\n const distDir = getViewsDistDir(appName, serviceName);\n\n for (const destination of getViewsS3Destinations(appName, serviceName)) {\n out.log(`Copying [${serviceName}] views to [${destination}]`);\n\n // Content-hashed assets: cache forever.\n await runCommand('aws', [\n 's3',\n 'sync',\n distDir,\n destination,\n '--cache-control',\n IMMUTABLE_CACHE_CONTROL,\n ...NO_CACHE_FILES.flatMap((file) => ['--exclude', file]),\n ]);\n\n // Entry points: cp (not sync) so the no-cache header is (re)applied on every\n // deploy even when a body happens to be byte-identical.\n for (const file of NO_CACHE_FILES) {\n if (!fs.existsSync(path.join(distDir, file))) {\n continue;\n }\n\n await runCommand('aws', ['s3', 'cp', path.join(distDir, file), `${destination}/${file}`, '--cache-control', NO_CACHE_CONTROL]);\n }\n }\n};\n"]}
1
+ {"version":3,"file":"viewsSync.js","sourceRoot":"","sources":["../../../../src/platforms/aws/viewsSync.ts"],"names":[],"mappings":"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","sourcesContent":["import { awsNamingUtils } from '@qpqjs/config-aws';\n// Views upload to S3. Every service's views go to its prefix in the shared\n// 'views' bucket (owned by shell). A service can also be a standalone host on\n// its own domain: each of its web entries marked `storageDrive.syncServiceViews`\n// gets the bundle at its drive's root. shell is the root website, which predates\n// that flag, so it keeps its 'website' bucket root when it declares none.\nimport { qpqWebServerUtils } from '@qpqjs/webserver';\n\nimport fs from 'fs';\nimport path from 'path';\n\nimport { createOutput } from '../../lib/createOutput';\nimport { loadServiceQpqConfig } from '../../lib/qpqConfigs';\nimport { runCommand } from '../../lib/runCommand';\nimport { getViewsDistDir } from '../../lib/views';\n\nconst out = createOutput('aws:views-sync');\n\n// The mutable entry points: fixed names whose CONTENT changes every deploy. They\n// must never be cached without revalidation, a browser holding a stale\n// mf-manifest.json or remoteEntry.js keeps running the previous deploy's bundle\n// (the module-reload hot-swap and plain page refreshes both depend on these being\n// fresh). Everything else in a views dist is content-hashed and safely immutable.\nexport const NO_CACHE_FILES = ['mf-manifest.json', 'remoteEntry.js', 'index.html', 'favicon.ico'];\n\n// The service that owns the shared views bucket and the root website.\nconst SHELL_SERVICE_NAME = 'shell';\n// The drive every service's views are uploaded into, under the service's prefix.\nconst SHARED_VIEWS_DRIVE_NAME = 'views';\n// Shell's bucket root from before `syncServiceViews`, kept when it declares no host drive.\nconst LEGACY_WEBSITE_DRIVE_NAME = 'website';\n\n// Content-hashed assets never change under their name, so they cache for a year; the\n// entry points above must be revalidated on every load.\nconst IMMUTABLE_CACHE_CONTROL = 'public,max-age=31536000,immutable';\nconst NO_CACHE_CONTROL = 'no-cache';\n\nexport const getViewsS3Destinations = (appName: string, serviceName: string): string[] => {\n const shellConfig = loadServiceQpqConfig(appName, SHELL_SERVICE_NAME);\n const viewsBucketName = awsNamingUtils.getConfigRuntimeResourceNameFromConfig(SHARED_VIEWS_DRIVE_NAME, shellConfig);\n\n const destinations = [`s3://${viewsBucketName}/${serviceName}`];\n\n const serviceConfig = serviceName === SHELL_SERVICE_NAME ? shellConfig : loadServiceQpqConfig(appName, serviceName);\n const hostDrives = qpqWebServerUtils\n .getWebEntryConfigs(serviceConfig)\n .filter((webEntry) => webEntry.storageDrive.syncServiceViews && webEntry.storageDrive.sourceStorageDrive)\n .map((webEntry) => webEntry.storageDrive.sourceStorageDrive!);\n\n if (serviceName === SHELL_SERVICE_NAME && hostDrives.length === 0) {\n hostDrives.push(LEGACY_WEBSITE_DRIVE_NAME);\n }\n\n for (const drive of hostDrives) {\n destinations.push(`s3://${awsNamingUtils.getConfigRuntimeResourceNameFromConfig(drive, serviceConfig)}`);\n }\n\n return destinations;\n};\n\nexport const syncViewsToS3 = async (appName: string, serviceName: string): Promise<void> => {\n const distDir = getViewsDistDir(appName, serviceName);\n\n for (const destination of getViewsS3Destinations(appName, serviceName)) {\n out.log(`Copying [${serviceName}] views to [${destination}]`);\n\n // Content-hashed assets: cache forever.\n await runCommand('aws', [\n 's3',\n 'sync',\n distDir,\n destination,\n '--cache-control',\n IMMUTABLE_CACHE_CONTROL,\n ...NO_CACHE_FILES.flatMap((file) => ['--exclude', file]),\n ]);\n\n // Entry points: cp (not sync) so the no-cache header is (re)applied on every\n // deploy even when a body happens to be byte-identical.\n for (const file of NO_CACHE_FILES) {\n if (!fs.existsSync(path.join(distDir, file))) {\n continue;\n }\n\n await runCommand('aws', ['s3', 'cp', path.join(distDir, file), `${destination}/${file}`, '--cache-control', NO_CACHE_CONTROL]);\n }\n }\n};\n"]}
@@ -36,12 +36,12 @@ const dev_server_1 = require("@qpqjs/dev-server");
36
36
  const webserver_1 = require("@qpqjs/webserver");
37
37
  const fs_1 = __importDefault(require("fs"));
38
38
  const path_1 = __importDefault(require("path"));
39
+ const createOutput_1 = require("../../lib/createOutput");
39
40
  const devServerEntry_1 = require("../../lib/devServerEntry");
40
41
  const devServerPorts_1 = require("../../lib/devServerPorts");
41
42
  const discovery_1 = require("../../lib/discovery");
42
43
  const getDefaultHookJobs_1 = require("../../lib/getDefaultHookJobs");
43
44
  const hooks_1 = require("../../lib/hooks");
44
- const out_1 = require("../../lib/out");
45
45
  const packageRoot_1 = require("../../lib/packageRoot");
46
46
  const runCommand_1 = require("../../lib/runCommand");
47
47
  const runTasks_1 = require("../../lib/runTasks");
@@ -53,7 +53,7 @@ const getDockerPlatformSettings_1 = require("./getDockerPlatformSettings");
53
53
  const getImageName_1 = require("./getImageName");
54
54
  const resolvePortMappings_1 = require("./resolvePortMappings");
55
55
  const writeComposeFile_1 = require("./writeComposeFile");
56
- const out = (0, out_1.createOutput)('docker');
56
+ const out = (0, createOutput_1.createOutput)('docker');
57
57
  const getImageContextDir = (root, appName) => (0, core_1.getDockerImageContextPath)(root, appName);
58
58
  // Every web entry's files go where the runtime looks for them. The federated views entry
59
59
  // is assembled from every service's views build (one folder per service, as on AWS);